[
  {
    "path": ".gitignore",
    "content": "/target\n/.idea\n/.vscode\n.DS_Store\n# /lib\n/macos_build\n/windows_build"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"graphpu\"\nversion = \"0.5.0\"\nauthors = [\"Troy Ni <1272777550@qq.com>\", \"CPunisher <1343316114@qq.com>\"]\nedition = \"2021\"\ndescription = \"Next-Gen 3D GPU Graph-Vis App\"\ndocumentation = \"https://docs.graphpu.com/\"\nreadme = \"README.md\"\nhomepage = \"https://graphpu.com/\"\nrepository = \"https://github.com/TO_BE_PUBLISHED\"\nlicense-file = \"LICENSE_TO_BE_WRITE.txt\"\nbuild = \"build.rs\"\n\n[features]\ntest-file = []\nexe = []\n\n[lib]\n\n[[example]]\nname = \"test_file\"\ntest = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\negui = \"0.20.1\"\negui_extras = { version = \"0.20.0\" }\neframe = { version = \"0.20.1\", features = [\"wgpu\"] }\negui-wgpu = \"0.20.0\"\n\nbytemuck = { version = \"1.9.1\" }\nwgpu = { version = \"0.14\", features = [\"webgl\"] }\npollster = { version = \"0.2.5\" }\nglam = { version = \"0.20.2\" }\n\nimage = \"0.23\"\nanyhow = \"1.0\"\ndirectories = \"4.0.1\"\n\nrayon = \"1.5.3\"\npng = \"0.17\"\nfutures-intrusive = \"0.4.0\"\n\nnanorand = { version = \"0.7\", default-features = false, features = [\"wyrand\"] }\nrfd = \"0.9.1\"\ncsv = \"1.1.6\"\nserde = { version = \"1.0.140\", features = [\"derive\"] }\nstrum = { version = \"0.24.1\", features = [\"derive\"] }\ntokio = { version = \"1\", features = [\"rt\", \"rt-multi-thread\", \"macros\"] }\nchrono = \"0.4.22\"\nlazy_static = \"1.4.0\"\n\n[target.'cfg(windows)'.build-dependencies]\nwinres = \"0.1\"\n\n[patch.crates-io]\nnaga = { path = \"./lib/naga\" }\n\n"
  },
  {
    "path": "README.md",
    "content": "# GraphPU\n\n\"GraphPU\" is a 3D GPU graph visualization application. We have developed a rendering framework and\nHPC algorithms based on Rust and WebGPU, allowing the application to simulate and render millions of nodes and\nedges in real-time on Vulkan and Metal platforms. The demo contains multiple large-scale graph datasets\nincluding movie semantics, emails, large website structures, personal WeChat relationships, and social media\nconnections. The audience can interact with these data through a controller knob, experiencing social physics\nand complex networks in a particle universe.\n\nSee more: [troyni.com/graphpu](https://troyni.com/graphpu)\n\n![](github/screenshot_1.png)\n"
  },
  {
    "path": "build.rs",
    "content": "use std::io;\n#[cfg(target_os = \"windows\")] use winres::WindowsResource;\n\nfn main() -> io::Result<()> {\n    #[cfg(target_os = \"windows\")] {\n        WindowsResource::new()\n            // This path can be absolute, or relative to your crate root.\n            .set_icon(\"resources/app_icon.ico\")\n            .compile()?;\n    }\n    Ok(())\n}"
  },
  {
    "path": "examples/dataset/email_data_edge.csv",
    "content": "start_id,end_id\n0,1\n0,4\n0,5\n0,8\n0,11\n0,20\n0,48\n0,130\n0,160\n0,430\n0,668\n0,736\n0,3612\n0,4252\n0,16687\n1,1\n1,44\n1,50\n1,56\n1,98\n1,99\n1,106\n1,146\n1,147\n1,149\n1,158\n1,171\n1,175\n1,184\n1,206\n1,259\n1,333\n1,336\n1,392\n1,397\n1,406\n1,422\n1,446\n1,457\n1,585\n1,602\n1,620\n1,640\n1,732\n1,733\n1,779\n1,841\n1,1033\n1,1118\n1,1261\n1,1262\n1,1290\n1,1370\n1,1425\n1,1458\n1,1515\n1,1518\n1,1521\n1,1546\n1,1619\n1,1623\n1,1776\n1,1803\n1,1966\n1,1969\n1,2014\n1,2037\n1,2058\n1,2244\n1,2356\n1,2558\n1,2874\n1,2924\n1,3449\n1,4200\n1,4681\n1,5357\n1,5592\n1,5726\n1,6044\n1,6119\n1,6962\n1,7719\n1,7723\n1,7817\n1,7998\n1,8027\n1,8109\n1,8244\n1,9394\n1,14402\n1,14507\n1,15162\n1,15439\n1,16393\n1,17166\n1,19459\n1,19578\n1,20587\n1,20833\n1,21290\n1,21442\n1,22604\n1,23384\n1,23659\n1,23783\n1,23927\n1,24137\n1,24339\n1,24466\n1,26034\n1,26354\n1,27008\n1,29534\n1,30331\n1,33287\n1,33976\n1,34212\n1,34609\n1,34630\n1,34638\n1,34710\n1,34792\n1,38060\n1,38300\n1,39437\n1,39527\n1,39532\n1,39811\n1,40430\n1,40996\n1,41040\n1,42064\n1,44877\n1,45382\n1,45461\n1,48364\n1,55144\n1,55254\n1,55820\n1,59020\n1,60576\n1,63349\n1,68370\n1,69668\n1,71303\n1,74996\n1,75557\n1,75912\n1,76060\n1,78909\n1,80266\n1,85096\n1,87870\n1,89035\n1,90487\n1,92476\n1,100276\n1,102786\n1,106504\n1,112537\n1,116750\n1,118111\n1,118141\n1,118143\n1,118336\n1,119805\n1,120469\n1,121775\n1,123130\n1,123137\n1,124889\n1,126059\n1,131939\n1,132953\n1,133046\n1,133980\n1,138471\n1,147103\n1,149018\n1,149492\n1,152509\n1,152515\n1,153875\n1,154107\n1,154878\n1,155056\n1,156456\n1,156589\n1,159346\n1,161731\n1,162025\n1,164711\n1,165851\n1,166080\n1,166461\n1,166670\n1,169210\n1,170928\n1,171259\n1,171684\n1,171937\n1,171958\n1,174815\n1,176190\n1,176396\n1,176450\n1,177363\n1,177653\n1,177659\n1,177841\n1,178424\n1,178546\n1,178562\n1,178706\n1,180487\n1,181275\n1,182927\n1,188390\n1,189573\n1,189576\n1,189577\n1,189587\n1,190518\n1,190767\n1,191825\n1,198971\n1,204314\n1,214708\n1,216812\n1,218391\n1,218757\n1,220502\n1,220570\n1,220933\n1,221270\n1,221402\n1,221403\n1,222427\n1,225795\n1,226362\n1,226381\n1,229913\n1,234502\n1,234973\n1,240052\n1,240426\n1,242495\n1,242826\n1,245501\n1,246804\n1,250192\n1,250222\n1,250353\n1,253031\n1,256213\n1,256674\n1,257105\n1,258284\n1,258560\n1,259744\n1,260325\n1,261079\n1,264679\n2,3\n3,3\n3,10\n3,175\n3,313\n3,314\n3,347\n3,388\n3,389\n3,457\n3,509\n3,510\n3,653\n3,808\n3,1011\n3,1043\n3,1085\n3,1184\n3,1345\n3,1417\n3,1696\n3,1869\n3,1973\n3,2045\n3,2301\n3,3932\n3,4535\n3,5646\n3,6424\n3,7926\n3,8179\n3,8508\n3,13506\n3,14747\n3,15088\n3,16176\n3,16580\n3,17071\n3,18088\n3,18457\n3,18783\n3,19673\n3,20672\n3,20836\n3,21393\n3,21396\n3,21491\n3,21847\n3,21932\n3,22181\n3,25476\n3,26092\n3,26254\n3,26259\n3,26260\n3,26263\n3,26269\n3,26278\n3,26283\n3,26955\n3,28112\n3,29739\n3,30373\n3,31080\n3,31965\n3,34577\n3,34776\n3,34846\n3,36171\n3,36831\n3,36957\n3,37203\n3,37319\n3,37522\n3,37557\n3,37571\n3,38079\n3,39085\n3,40030\n3,41136\n3,41247\n3,41533\n3,41555\n3,42684\n3,42694\n3,42877\n3,43795\n3,44574\n3,45771\n3,46064\n3,46441\n3,47049\n3,48361\n3,49478\n3,49869\n3,51980\n3,54959\n3,57206\n3,57216\n3,58529\n3,59950\n3,61506\n3,63137\n3,63603\n3,67740\n3,68212\n3,68431\n3,68492\n3,68928\n3,70737\n3,72558\n3,75407\n3,75912\n3,76810\n3,76922\n3,77837\n3,79079\n3,79714\n3,79935\n3,81350\n3,81436\n3,82702\n3,82783\n3,83230\n3,83426\n3,83427\n3,83621\n3,83896\n3,84541\n3,84780\n3,85639\n3,87426\n3,88075\n3,88102\n3,90352\n3,90921\n3,91045\n3,91528\n3,91589\n3,91732\n3,93046\n3,93124\n3,93132\n3,93764\n3,94328\n3,94468\n3,95943\n3,96600\n3,97912\n3,99112\n3,99209\n3,101587\n3,102194\n3,103388\n3,103414\n3,104845\n3,105853\n3,106493\n3,106950\n3,108105\n3,109314\n3,112497\n3,112637\n3,112790\n3,112868\n3,113012\n3,115479\n3,115570\n3,116113\n3,116547\n3,116913\n3,119500\n3,120726\n3,121611\n3,121662\n3,123003\n3,128071\n3,128243\n3,130362\n3,130895\n3,131557\n3,134313\n3,135301\n3,136097\n3,137160\n3,137238\n3,140294\n3,142169\n3,142705\n3,142742\n3,144437\n3,145766\n3,145986\n3,146749\n3,148061\n3,148091\n3,148217\n3,148890\n3,150199\n3,151073\n3,151323\n3,151493\n3,152041\n3,152691\n3,152842\n3,152931\n3,154652\n3,156915\n3,157008\n3,157488\n3,158379\n3,158565\n3,159179\n3,159885\n3,160937\n3,161434\n3,161712\n3,161874\n3,162144\n3,162548\n3,162772\n3,163382\n3,163894\n3,166993\n3,167807\n3,168388\n3,168500\n3,169001\n3,169540\n3,170783\n3,170982\n3,171927\n3,172308\n3,174392\n3,174557\n3,174843\n3,175417\n3,175464\n3,175992\n3,179142\n3,179323\n3,179391\n3,180091\n3,180657\n3,181675\n3,183072\n3,183093\n3,183376\n3,183853\n3,185045\n3,185249\n3,185681\n3,186936\n3,187073\n3,188151\n3,189805\n3,190231\n3,192150\n3,192304\n3,193279\n3,194570\n3,197863\n3,198475\n3,198482\n3,199752\n3,199766\n3,201298\n3,203481\n3,203751\n3,205083\n3,206092\n3,206648\n3,207031\n3,207609\n3,212781\n3,213294\n3,213978\n3,218747\n3,219500\n3,220356\n3,222334\n3,222717\n3,236678\n3,249762\n3,255414\n3,263806\n5,4\n5,5\n5,10\n5,26\n5,47\n5,59\n5,143\n5,171\n5,292\n5,355\n5,430\n5,527\n5,740\n5,741\n5,743\n5,865\n5,885\n5,887\n5,994\n5,1119\n5,1235\n5,1252\n5,1253\n5,1335\n5,1432\n5,1722\n5,1983\n5,2089\n5,2469\n5,2674\n5,2926\n5,2940\n5,3949\n5,4114\n5,4748\n5,4810\n5,5881\n5,6621\n5,8714\n5,15959\n5,16614\n5,16686\n5,21059\n5,21944\n5,45140\n5,95583\n5,111142\n5,234141\n6,7\n7,7\n8,385\n8,2159\n8,2368\n8,3393\n8,3644\n8,5034\n8,5326\n8,8220\n8,18090\n8,85685\n8,86389\n8,87005\n8,89532\n8,110485\n8,118780\n8,124319\n8,171018\n9,10\n9,17521\n10,5\n10,10\n10,30\n10,34\n10,35\n10,37\n10,38\n10,56\n10,65\n10,73\n10,77\n10,87\n10,94\n10,97\n10,106\n10,107\n10,124\n10,140\n10,141\n10,146\n10,147\n10,152\n10,161\n10,175\n10,182\n10,192\n10,195\n10,198\n10,202\n10,206\n10,211\n10,213\n10,222\n10,233\n10,247\n10,251\n10,255\n10,264\n10,275\n10,292\n10,294\n10,309\n10,310\n10,313\n10,328\n10,333\n10,336\n10,366\n10,389\n10,393\n10,417\n10,422\n10,444\n10,446\n10,457\n10,467\n10,485\n10,493\n10,500\n10,505\n10,510\n10,512\n10,535\n10,595\n10,605\n10,615\n10,626\n10,628\n10,634\n10,638\n10,640\n10,671\n10,677\n10,693\n10,704\n10,726\n10,733\n10,746\n10,760\n10,784\n10,788\n10,795\n10,818\n10,838\n10,841\n10,859\n10,877\n10,907\n10,911\n10,920\n10,929\n10,937\n10,949\n10,957\n10,972\n10,991\n10,999\n10,1001\n10,1010\n10,1070\n10,1085\n10,1113\n10,1117\n10,1127\n10,1175\n10,1188\n10,1191\n10,1238\n10,1240\n10,1241\n10,1247\n10,1289\n10,1293\n10,1297\n10,1298\n10,1300\n10,1306\n10,1309\n10,1319\n10,1370\n10,1417\n10,1425\n10,1430\n10,1436\n10,1509\n10,1518\n10,1566\n10,1572\n10,1623\n10,1634\n10,1715\n10,1773\n10,1801\n10,1815\n10,1844\n10,1893\n10,1955\n10,1985\n10,2083\n10,2145\n10,2244\n10,2296\n10,2304\n10,2384\n10,2427\n10,2552\n10,2580\n10,2631\n10,2750\n10,2782\n10,3009\n10,3067\n10,3094\n10,3111\n10,3135\n10,3218\n10,3285\n10,3297\n10,3422\n10,3474\n10,3507\n10,3996\n10,4006\n10,4068\n10,4220\n10,4253\n10,4260\n10,4272\n10,4672\n10,4911\n10,5050\n10,5073\n10,5100\n10,5213\n10,5265\n10,5290\n10,5382\n10,5385\n10,5401\n10,5439\n10,5440\n10,5718\n10,5725\n10,5809\n10,5835\n10,5961\n10,6173\n10,6422\n10,6490\n10,6590\n10,7117\n10,7441\n10,8285\n10,8414\n10,8520\n10,8664\n10,8805\n10,8854\n10,9015\n10,9373\n10,9394\n10,9585\n10,12747\n10,13201\n10,13345\n10,13524\n10,13991\n10,14188\n10,14193\n10,14590\n10,15344\n10,15454\n10,15476\n10,15547\n10,15610\n10,15624\n10,15795\n10,16196\n10,16859\n10,17176\n10,17304\n10,17803\n10,17837\n10,18581\n10,18718\n10,18831\n10,18868\n10,19005\n10,19183\n10,19202\n10,19216\n10,19336\n10,19469\n10,19555\n10,19993\n10,20107\n10,20351\n10,20516\n10,20854\n10,20960\n10,21061\n10,21084\n10,21567\n10,21619\n10,22513\n10,22559\n10,22712\n10,23104\n10,23217\n10,23572\n10,23595\n10,24662\n10,24805\n10,25131\n10,25348\n10,25634\n10,25671\n10,25989\n10,26358\n10,26501\n10,27834\n10,27947\n10,28002\n10,28148\n10,28149\n10,28299\n10,28396\n10,28405\n10,28514\n10,28553\n10,28702\n10,29315\n10,29403\n10,29680\n10,29921\n10,29959\n10,30089\n10,30144\n10,30734\n10,30800\n10,30946\n10,31080\n10,31300\n10,31348\n10,31419\n10,31428\n10,31934\n10,32395\n10,32402\n10,32481\n10,32699\n10,32751\n10,33117\n10,33424\n10,33630\n10,33732\n10,33854\n10,34212\n10,34539\n10,34897\n10,35353\n10,35687\n10,36237\n10,36523\n10,36995\n10,37259\n10,37484\n10,37829\n10,37953\n10,38010\n10,38121\n10,38704\n10,38799\n10,38905\n10,39039\n10,39264\n10,39368\n10,39492\n10,39700\n10,39703\n10,40432\n10,40664\n10,41041\n10,41230\n10,41348\n10,41367\n10,41561\n10,42071\n10,42109\n10,42131\n10,42134\n10,42150\n10,42328\n10,42357\n10,42819\n10,42828\n10,42900\n10,43065\n10,43141\n10,43926\n10,44370\n10,44436\n10,44728\n10,45058\n10,45817\n10,45853\n10,45929\n10,46955\n10,47471\n10,47519\n10,48274\n10,48598\n10,48839\n10,49596\n10,49857\n10,49868\n10,50548\n10,50956\n10,51618\n10,51731\n10,52189\n10,52254\n10,52489\n10,52536\n10,52604\n10,53571\n10,53887\n10,54399\n10,54616\n10,55300\n10,55437\n10,55927\n10,55994\n10,56619\n10,56811\n10,57324\n10,57737\n10,58725\n10,58836\n10,59239\n10,59248\n10,59277\n10,59355\n10,59392\n10,59424\n10,59430\n10,59965\n10,59972\n10,60199\n10,60207\n10,60547\n10,60576\n10,60585\n10,60610\n10,60613\n10,60782\n10,60902\n10,61577\n10,62023\n10,62356\n10,63664\n10,65484\n10,66002\n10,66073\n10,66176\n10,66239\n10,66542\n10,66724\n10,66954\n10,66956\n10,67343\n10,67399\n10,67400\n10,67492\n10,67568\n10,67705\n10,67769\n10,68020\n10,68069\n10,68746\n10,69507\n10,69509\n10,69778\n10,69822\n10,70459\n10,72093\n10,72748\n10,72949\n10,73055\n10,73185\n10,73700\n10,73833\n10,73955\n10,74158\n10,74315\n10,75912\n10,76082\n10,77113\n10,77132\n10,77163\n10,77273\n10,77289\n10,77957\n10,78007\n10,78259\n10,78486\n10,78933\n10,79013\n10,79559\n10,79980\n10,80478\n10,80509\n10,80746\n10,80761\n10,80832\n10,80950\n10,81233\n10,81284\n10,82103\n10,82397\n10,82592\n10,82593\n10,82711\n10,83693\n10,83938\n10,84156\n10,84527\n10,84682\n10,85165\n10,85218\n10,85979\n10,86114\n10,86303\n10,86402\n10,86612\n10,86780\n10,86782\n10,86790\n10,87393\n10,87961\n10,88127\n10,88168\n10,88172\n10,88456\n10,88578\n10,88619\n10,88641\n10,89910\n10,89945\n10,90198\n10,90375\n10,90400\n10,90538\n10,90635\n10,90732\n10,90983\n10,91339\n10,92147\n10,92343\n10,92411\n10,92476\n10,92785\n10,93310\n10,93604\n10,93737\n10,93853\n10,93890\n10,94230\n10,95438\n10,95757\n10,96146\n10,96855\n10,97462\n10,97481\n10,98291\n10,99121\n10,99138\n10,99151\n10,99156\n10,99306\n10,99809\n10,100079\n10,100467\n10,100776\n10,101572\n10,102021\n10,102415\n10,102811\n10,102821\n10,102827\n10,103335\n10,103523\n10,103534\n10,103723\n10,103963\n10,104123\n10,104647\n10,106436\n10,106635\n10,106637\n10,106648\n10,106651\n10,106653\n10,106665\n10,106971\n10,107015\n10,107060\n10,107133\n10,108231\n10,109523\n10,109945\n10,110110\n10,110256\n10,110420\n10,111550\n10,112026\n10,113140\n10,113156\n10,114766\n10,115312\n10,115357\n10,116264\n10,116662\n10,116954\n10,116997\n10,117432\n10,118518\n10,118888\n10,119058\n10,119637\n10,121109\n10,121720\n10,121723\n10,122353\n10,122749\n10,123138\n10,123189\n10,123203\n10,124315\n10,125118\n10,126031\n10,126094\n10,126161\n10,126916\n10,127071\n10,127484\n10,128906\n10,130314\n10,130491\n10,130497\n10,130500\n10,130505\n10,130908\n10,131375\n10,131891\n10,132698\n10,133171\n10,133173\n10,133191\n10,133281\n10,133602\n10,133834\n10,135141\n10,135283\n10,135585\n10,135987\n10,136139\n10,136235\n10,136640\n10,136644\n10,136793\n10,136902\n10,137239\n10,139000\n10,139001\n10,139006\n10,139028\n10,139245\n10,139451\n10,140904\n10,140958\n10,140976\n10,141288\n10,142242\n10,142935\n10,143287\n10,143446\n10,144719\n10,144761\n10,144997\n10,145069\n10,145171\n10,146134\n10,146150\n10,146602\n10,147453\n10,147638\n10,150530\n10,150608\n10,152117\n10,152716\n10,152875\n10,154713\n10,154864\n10,155915\n10,156356\n10,156369\n10,156571\n10,156825\n10,157325\n10,157607\n10,157823\n10,157900\n10,157920\n10,157955\n10,158065\n10,158465\n10,158784\n10,158824\n10,161445\n10,161675\n10,162432\n10,163401\n10,165589\n10,166378\n10,166693\n10,166817\n10,167403\n10,168936\n10,169164\n10,170833\n10,171641\n10,172008\n10,172382\n10,172718\n10,174671\n10,175082\n10,175608\n10,176565\n10,176913\n10,177112\n10,177516\n10,177541\n10,177943\n10,178811\n10,178854\n10,179170\n10,181026\n10,181992\n10,182667\n10,183339\n10,183779\n10,184373\n10,185431\n10,185579\n10,185598\n10,186029\n10,186844\n10,189270\n10,189842\n10,190245\n10,191737\n10,192592\n10,192607\n10,193708\n10,193878\n10,194664\n10,195905\n10,196557\n10,197819\n10,198723\n10,199390\n10,203861\n10,206758\n10,212086\n10,213407\n10,217533\n10,218220\n10,219559\n10,219624\n10,220445\n10,221340\n10,221365\n10,223250\n10,224068\n10,224822\n10,227061\n10,229289\n10,230509\n10,230637\n10,232166\n10,233073\n10,233515\n10,233650\n10,233856\n10,236719\n10,236795\n10,239167\n10,240174\n10,240339\n10,240413\n10,240501\n10,241885\n10,242195\n10,242535\n10,242680\n10,244472\n10,244619\n10,247527\n10,248350\n10,251600\n10,251608\n10,251902\n10,252277\n10,253026\n10,253473\n10,255030\n10,256809\n10,259716\n10,261964\n10,262561\n11,11\n11,20\n11,68\n11,86\n11,111\n11,167\n11,192\n11,207\n11,209\n11,240\n11,259\n11,264\n11,292\n11,301\n11,314\n11,333\n11,336\n11,366\n11,479\n11,510\n11,516\n11,599\n11,604\n11,613\n11,622\n11,668\n11,673\n11,710\n11,779\n11,801\n11,872\n11,911\n11,918\n11,972\n11,1014\n11,1085\n11,1087\n11,1130\n11,1135\n11,1147\n11,1172\n11,1204\n11,1210\n11,1284\n11,1298\n11,1309\n11,1326\n11,1370\n11,1402\n11,1434\n11,1518\n11,1531\n11,1590\n11,1655\n11,1659\n11,1724\n11,1796\n11,1803\n11,1844\n11,1891\n11,1893\n11,1992\n11,2286\n11,2373\n11,2512\n11,3392\n11,3507\n11,3555\n11,3804\n11,3967\n11,4276\n11,5213\n11,5961\n11,7750\n11,13585\n11,18880\n11,62318\n11,75912\n11,118336\n11,119273\n11,125371\n11,125844\n11,129896\n11,164399\n11,182465\n11,192040\n11,215874\n11,230304\n11,234748\n11,234886\n11,241493\n12,13\n14,15\n14,20\n14,63\n14,160\n14,254\n14,538\n15,10\n15,15\n15,292\n15,397\n15,668\n15,693\n15,745\n16,17\n16,175\n16,3155\n16,20204\n16,37138\n16,38017\n16,44450\n16,53921\n16,58072\n16,67477\n16,85023\n16,85356\n16,88234\n16,92890\n16,97834\n16,103666\n16,107114\n16,107683\n16,108332\n16,108514\n16,115604\n16,117603\n16,123877\n16,124108\n16,124311\n16,125706\n16,127926\n16,131170\n16,166102\n16,185298\n16,213368\n16,215735\n16,216570\n16,216940\n16,217417\n16,217667\n16,217748\n16,218678\n16,218770\n16,218978\n16,219361\n16,219506\n16,219525\n16,219574\n16,219731\n16,220535\n16,221400\n16,221524\n16,221604\n16,221898\n16,221948\n16,222050\n16,223400\n16,225492\n16,226249\n16,227325\n16,227893\n16,227916\n16,227920\n16,227944\n16,228035\n16,228080\n16,229304\n16,230243\n16,231481\n16,231697\n16,232731\n16,233255\n16,233532\n16,234445\n16,237058\n16,237114\n16,239282\n16,239332\n16,239377\n16,239524\n16,240109\n16,240500\n16,242098\n16,242768\n16,242944\n16,242947\n16,242950\n16,242971\n16,243495\n16,245779\n16,246597\n16,246678\n16,246732\n16,258117\n18,19\n19,8\n19,19\n19,54\n19,135\n19,222\n19,313\n19,385\n19,389\n19,536\n19,634\n19,660\n19,781\n19,808\n19,1192\n19,1313\n19,1571\n19,1724\n19,1756\n19,1843\n19,2159\n19,2253\n19,2266\n19,2424\n19,2646\n19,2692\n19,2944\n19,3302\n19,3475\n19,5034\n19,5326\n19,5632\n19,6419\n19,6506\n19,6979\n19,7698\n19,7768\n19,9111\n19,9379\n19,13715\n19,14593\n19,14668\n19,15494\n19,15647\n19,17346\n19,17825\n19,18592\n19,18831\n19,18880\n19,19443\n19,22429\n19,23541\n19,28511\n19,30502\n19,31074\n19,32238\n19,37088\n19,42478\n19,44714\n19,44717\n19,48201\n19,60081\n19,61625\n19,61629\n19,62539\n19,62807\n19,70263\n19,74500\n19,79404\n19,79876\n19,79966\n19,92289\n19,111267\n19,113513\n19,123639\n19,134111\n19,137089\n19,156424\n19,174541\n19,178182\n19,182382\n19,191219\n19,211889\n19,212914\n19,213089\n19,221547\n19,236122\n19,251862\n19,252788\n19,253093\n19,253094\n19,253095\n19,253096\n19,253097\n19,261754\n20,10\n20,11\n20,20\n20,126\n20,178\n20,182\n20,259\n20,314\n20,315\n20,346\n20,406\n20,435\n20,439\n20,440\n20,447\n20,452\n20,457\n20,497\n20,512\n20,538\n20,671\n20,673\n20,675\n20,676\n20,693\n20,766\n20,794\n20,808\n20,844\n20,849\n20,929\n20,934\n20,939\n20,996\n20,1014\n20,1033\n20,1068\n20,1118\n20,1130\n20,1191\n20,1294\n20,1370\n20,1445\n20,1474\n20,1518\n20,1531\n20,1559\n20,1566\n20,1590\n20,1612\n20,1644\n20,1651\n20,1776\n20,1789\n20,1796\n20,1877\n20,1973\n20,2085\n20,2102\n20,2216\n20,2253\n20,2353\n20,3507\n20,3524\n20,4352\n20,4376\n20,6422\n20,6607\n20,6661\n20,6824\n20,6883\n20,6904\n20,6966\n20,6971\n20,6975\n20,7117\n20,9203\n20,9654\n20,13804\n20,14145\n20,15168\n20,15179\n20,15324\n20,23803\n20,24360\n20,25282\n20,35143\n20,40551\n20,42524\n20,46154\n20,46871\n20,48331\n20,61342\n20,66545\n20,69787\n20,70337\n20,70367\n20,73282\n20,75912\n20,76060\n20,81056\n20,81061\n20,86571\n20,92945\n20,93827\n20,94123\n20,94778\n20,95005\n20,98012\n20,98608\n20,98611\n20,99503\n20,106259\n20,107926\n20,110205\n20,128144\n20,131823\n20,150809\n20,158718\n20,158989\n20,166373\n20,171034\n20,179156\n20,179644\n20,184769\n20,186675\n20,189128\n20,189560\n20,190492\n20,191917\n20,215874\n20,244053\n20,249055\n20,262341\n21,22\n22,22\n22,127\n22,182\n22,207\n22,227\n22,255\n22,287\n22,314\n22,358\n22,433\n22,446\n22,599\n22,673\n22,752\n22,791\n22,818\n22,861\n22,862\n22,874\n22,920\n22,1011\n22,1023\n22,1118\n22,1133\n22,1210\n22,1284\n22,1336\n22,1367\n22,1392\n22,1459\n22,1556\n22,1634\n22,1679\n22,2016\n22,2125\n22,2182\n22,2222\n22,2224\n22,2235\n22,2276\n22,2297\n22,2314\n22,2563\n22,2652\n22,2732\n22,3174\n22,3177\n22,3228\n22,3509\n22,3696\n22,3728\n22,3829\n22,3979\n22,4015\n22,4237\n22,4272\n22,4367\n22,4565\n22,5006\n22,5050\n22,5261\n22,5282\n22,5470\n22,5507\n22,6045\n22,6361\n22,6467\n22,6719\n22,7049\n22,7456\n22,7681\n22,7781\n22,8163\n22,8226\n22,8480\n22,8805\n22,9225\n22,9367\n22,9503\n22,9679\n22,13142\n22,13552\n22,13573\n22,13905\n22,14052\n22,14546\n22,15218\n22,15540\n22,15654\n22,15813\n22,17151\n22,17241\n22,18018\n22,18028\n22,18627\n22,18657\n22,19468\n22,19494\n22,19660\n22,19740\n22,19783\n22,19830\n22,20573\n22,20779\n22,21782\n22,22928\n22,24309\n22,25168\n22,25448\n22,25640\n22,27474\n22,27880\n22,28142\n22,30271\n22,30502\n22,30542\n22,30584\n22,30922\n22,30942\n22,31431\n22,32666\n22,32694\n22,33159\n22,33483\n22,34674\n22,35204\n22,37442\n22,37581\n22,38936\n22,39101\n22,40221\n22,40839\n22,41144\n22,41300\n22,41349\n22,42112\n22,43337\n22,45026\n22,45195\n22,45980\n22,45984\n22,45985\n22,45990\n22,45992\n22,45996\n22,45999\n22,46515\n22,46857\n22,47158\n22,47502\n22,48197\n22,48202\n22,48246\n22,48294\n22,48431\n22,49037\n22,49591\n22,50166\n22,51405\n22,54599\n22,57139\n22,57788\n22,57873\n22,59174\n22,59556\n22,60500\n22,60876\n22,61133\n22,61566\n22,61645\n22,61683\n22,62095\n22,62353\n22,62501\n22,62526\n22,62563\n22,62912\n22,63624\n22,63825\n22,64742\n22,64895\n22,65748\n22,68141\n22,72834\n22,73421\n22,73445\n22,73561\n22,75754\n22,77424\n22,77672\n22,77893\n22,78257\n22,78341\n22,79055\n22,79417\n22,80013\n22,81236\n22,81278\n22,81495\n22,81759\n22,82237\n22,82712\n22,83434\n22,83448\n22,83545\n22,83806\n22,83979\n22,84333\n22,85424\n22,85461\n22,85463\n22,86090\n22,86561\n22,86852\n22,88011\n22,88043\n22,88611\n22,88967\n22,90164\n22,90336\n22,91032\n22,92139\n22,92804\n22,92909\n22,93113\n22,93157\n22,93387\n22,93860\n22,94318\n22,94866\n22,94896\n22,94897\n22,96123\n22,97304\n22,97392\n22,97569\n22,98908\n22,99401\n22,99411\n22,102014\n22,102517\n22,102695\n22,102698\n22,103466\n22,103892\n22,104152\n22,106825\n22,106826\n22,106828\n22,107291\n22,107293\n22,107552\n22,107694\n22,108568\n22,109212\n22,109451\n22,109476\n22,110517\n22,112078\n22,112442\n22,115299\n22,116654\n22,116829\n22,117571\n22,117572\n22,117573\n22,118229\n22,118674\n22,119005\n22,119437\n22,119472\n22,119839\n22,122054\n22,122092\n22,122721\n22,123205\n22,123709\n22,124458\n22,124873\n22,126571\n22,126618\n22,126802\n22,127643\n22,127648\n22,127905\n22,127978\n22,130938\n22,130971\n22,134681\n22,135146\n22,135346\n22,135955\n22,137073\n22,139152\n22,139754\n22,139755\n22,142540\n22,143609\n22,146626\n22,147131\n22,147132\n22,148182\n22,148902\n22,149017\n22,149316\n22,149382\n22,151158\n22,152195\n22,152623\n22,154491\n22,154746\n22,159347\n22,161371\n22,161409\n22,162608\n22,164947\n22,164969\n22,165350\n22,165563\n22,167049\n22,168799\n22,168809\n22,168854\n22,169574\n22,169806\n22,170543\n22,170722\n22,170814\n22,171775\n22,172528\n22,172534\n22,173145\n22,173148\n22,173164\n22,173167\n22,173625\n22,174468\n22,174811\n22,175144\n22,175145\n22,176038\n22,176360\n22,178944\n22,179173\n22,179901\n22,180127\n22,180468\n22,182028\n22,182162\n22,182262\n22,183274\n22,183321\n22,184951\n22,185871\n22,185983\n22,186788\n22,188087\n22,188770\n22,188781\n22,189247\n22,191509\n22,193625\n22,197805\n22,197853\n22,205488\n22,213977\n22,215878\n22,218074\n22,218653\n22,226564\n22,226703\n22,226894\n22,226930\n22,227699\n22,229177\n22,229208\n22,231630\n22,231972\n22,235459\n22,235706\n22,236215\n22,236664\n22,238217\n22,238347\n22,238512\n22,238776\n22,239061\n22,240173\n22,241253\n22,242363\n22,243538\n22,244680\n22,250693\n22,251805\n22,253412\n22,255573\n22,255713\n22,256784\n22,257200\n22,257204\n22,261352\n22,264030\n23,24\n23,25\n23,26\n23,28\n23,33\n23,40\n23,47\n23,59\n23,60\n23,117\n23,143\n23,885\n23,887\n23,1252\n23,1253\n23,1255\n23,1432\n23,1775\n23,2088\n23,2089\n23,2469\n23,2674\n23,2701\n23,2712\n23,2867\n23,3561\n23,4079\n23,4571\n23,5708\n23,5826\n23,9343\n23,9536\n23,9537\n23,9538\n23,9539\n23,9540\n23,9541\n23,9542\n23,21944\n23,22880\n23,44244\n23,50943\n23,154690\n23,171294\n24,24\n24,26\n24,59\n24,104\n24,372\n24,442\n24,588\n24,590\n24,714\n24,805\n24,1252\n24,1253\n24,1962\n24,2244\n24,2775\n24,4079\n24,21944\n25,25\n25,2088\n25,6208\n25,6209\n26,26\n26,59\n26,885\n26,994\n26,16153\n26,21944\n27,25\n27,26\n27,28\n27,47\n27,59\n27,60\n27,143\n27,885\n27,887\n27,1432\n27,1775\n27,2088\n27,2469\n27,2674\n27,3561\n27,4571\n27,5826\n27,5871\n27,9343\n27,9537\n27,9539\n27,9542\n27,21944\n27,154690\n28,28\n28,143\n28,4571\n28,9343\n28,21944\n28,88820\n29,30\n30,10\n30,30\n30,47\n30,104\n30,134\n30,135\n30,137\n30,175\n30,200\n30,211\n30,225\n30,248\n30,327\n30,328\n30,333\n30,364\n30,440\n30,446\n30,622\n30,685\n30,693\n30,704\n30,772\n30,837\n30,898\n30,903\n30,911\n30,950\n30,954\n30,981\n30,1045\n30,1179\n30,1281\n30,1305\n30,1332\n30,1415\n30,1498\n30,1708\n30,1939\n30,1980\n30,2105\n30,2418\n30,2596\n30,2710\n30,3009\n30,3067\n30,3358\n30,3538\n30,3565\n30,3727\n30,4276\n30,4354\n30,4557\n30,4939\n30,4940\n30,4941\n30,5405\n30,5472\n30,5604\n30,6062\n30,6646\n30,7182\n30,8279\n30,8414\n30,13207\n30,14975\n30,15547\n30,15553\n30,15604\n30,18194\n30,18926\n30,19457\n30,20598\n30,21081\n30,21607\n30,21746\n30,21865\n30,23502\n30,23790\n30,24826\n30,26103\n30,26388\n30,27705\n30,28203\n30,29374\n30,30557\n30,31067\n30,31300\n30,31368\n30,31453\n30,31662\n30,32174\n30,32848\n30,35047\n30,37709\n30,37730\n30,37904\n30,43239\n30,44412\n30,47400\n30,47669\n30,47672\n30,55215\n30,55316\n30,55330\n30,56071\n30,57143\n30,57838\n30,58110\n30,65864\n30,66047\n30,67812\n30,70346\n30,74315\n30,77645\n30,84588\n30,85814\n30,85829\n30,88666\n30,90361\n30,90417\n30,91460\n30,93173\n30,95042\n30,96267\n30,99125\n30,99807\n30,101145\n30,103208\n30,106366\n30,106367\n30,108208\n30,108214\n30,108644\n30,109035\n30,109077\n30,109568\n30,109655\n30,110170\n30,113536\n30,114669\n30,115501\n30,115502\n30,117183\n30,117712\n30,120029\n30,121517\n30,121899\n30,123833\n30,124658\n30,124791\n30,126642\n30,127938\n30,129175\n30,129670\n30,131650\n30,135613\n30,136093\n30,141175\n30,141355\n30,149257\n30,154786\n30,161326\n30,170503\n30,171023\n30,171042\n30,171778\n30,172542\n30,172792\n30,173774\n30,173828\n30,177712\n30,186639\n30,192121\n30,199221\n30,203015\n30,203153\n30,203978\n30,204063\n30,204065\n30,207101\n30,207116\n30,207623\n30,215501\n30,217637\n30,217658\n30,218469\n30,219793\n30,224183\n30,226564\n30,231099\n30,231192\n30,235864\n30,237617\n30,257693\n30,260264\n31,32\n32,87\n32,356\n32,392\n32,509\n32,510\n32,623\n32,644\n32,676\n32,685\n32,697\n32,809\n32,872\n32,875\n32,1011\n32,1240\n32,1262\n32,1465\n32,1949\n32,20757\n33,206\n33,2244\n33,21826\n34,10\n34,34\n34,35\n34,83\n34,313\n34,455\n34,536\n34,589\n34,599\n34,634\n34,818\n34,1085\n34,1284\n34,1417\n34,1860\n34,2224\n34,2646\n34,4223\n34,5326\n34,75912\n34,115474\n34,127158\n34,188791\n35,10\n35,34\n35,35\n35,83\n35,120\n35,175\n35,222\n35,240\n35,278\n35,283\n35,304\n35,313\n35,314\n35,389\n35,392\n35,439\n35,440\n35,455\n35,536\n35,589\n35,599\n35,623\n35,634\n35,656\n35,814\n35,818\n35,852\n35,949\n35,951\n35,1005\n35,1011\n35,1014\n35,1085\n35,1118\n35,1218\n35,1284\n35,1313\n35,1502\n35,1724\n35,1796\n35,1844\n35,1916\n35,1973\n35,1996\n35,2046\n35,2159\n35,2224\n35,2318\n35,2420\n35,2584\n35,2615\n35,2619\n35,2646\n35,2711\n35,2997\n35,3507\n35,3672\n35,4076\n35,4081\n35,4223\n35,4532\n35,5208\n35,5326\n35,5343\n35,5619\n35,5702\n35,6012\n35,6032\n35,6064\n35,6649\n35,6754\n35,6799\n35,6828\n35,6880\n35,7020\n35,7346\n35,8478\n35,8535\n35,8653\n35,9684\n35,13622\n35,14246\n35,15931\n35,16078\n35,16381\n35,17116\n35,17151\n35,18471\n35,18541\n35,18831\n35,18881\n35,19789\n35,20199\n35,20576\n35,20672\n35,21517\n35,22119\n35,23739\n35,24274\n35,25014\n35,25534\n35,25710\n35,26935\n35,27808\n35,29595\n35,30517\n35,30601\n35,30679\n35,30709\n35,30736\n35,31248\n35,32225\n35,32820\n35,33164\n35,33593\n35,35331\n35,35688\n35,36813\n35,38348\n35,38986\n35,39618\n35,39671\n35,39677\n35,40099\n35,40136\n35,40669\n35,40790\n35,41447\n35,43136\n35,45197\n35,45666\n35,46398\n35,46478\n35,48034\n35,48082\n35,48330\n35,48578\n35,48642\n35,48656\n35,48704\n35,49551\n35,49632\n35,52100\n35,54515\n35,54611\n35,56584\n35,58395\n35,59260\n35,59344\n35,59763\n35,59809\n35,60665\n35,62088\n35,62539\n35,63362\n35,63519\n35,64752\n35,64761\n35,64770\n35,68036\n35,68219\n35,70879\n35,72080\n35,72749\n35,75347\n35,75912\n35,76895\n35,77721\n35,78402\n35,80101\n35,80548\n35,81511\n35,82029\n35,82350\n35,82916\n35,88448\n35,90388\n35,90472\n35,91522\n35,91899\n35,92046\n35,93428\n35,94299\n35,95456\n35,96831\n35,97618\n35,97636\n35,99832\n35,101828\n35,105949\n35,107100\n35,107651\n35,109318\n35,112050\n35,112729\n35,115128\n35,115474\n35,115814\n35,117993\n35,117996\n35,118461\n35,118519\n35,119618\n35,120061\n35,121116\n35,121180\n35,121892\n35,123085\n35,127158\n35,127731\n35,128185\n35,131003\n35,131196\n35,131224\n35,131822\n35,132868\n35,133488\n35,133537\n35,133629\n35,133714\n35,134205\n35,137797\n35,139444\n35,139690\n35,142552\n35,143030\n35,146484\n35,149115\n35,152166\n35,152240\n35,152703\n35,153372\n35,153658\n35,154371\n35,154400\n35,155152\n35,157691\n35,158360\n35,160428\n35,160809\n35,162637\n35,163404\n35,163419\n35,165341\n35,165358\n35,168404\n35,169212\n35,173293\n35,175385\n35,176486\n35,176779\n35,177833\n35,182308\n35,183880\n35,186608\n35,186766\n35,191376\n35,192107\n35,194063\n35,204259\n35,205889\n35,206167\n35,214977\n35,217691\n35,218193\n35,221168\n35,223933\n35,224783\n35,224977\n35,227361\n35,229773\n35,234800\n35,234907\n35,241848\n35,242350\n35,243449\n35,243599\n35,244069\n35,244193\n35,246916\n35,249055\n35,264610\n36,37\n37,10\n37,36\n37,37\n37,106\n37,301\n37,425\n37,518\n37,599\n37,604\n37,615\n37,663\n37,685\n37,698\n37,717\n37,937\n37,968\n37,1014\n37,1124\n37,1145\n37,1231\n37,1293\n37,1359\n37,1370\n37,1566\n37,1740\n37,1782\n37,1849\n37,1973\n37,2689\n37,3422\n37,3469\n37,4253\n37,4270\n37,4514\n37,4683\n37,6398\n37,6612\n37,6702\n37,7222\n37,8445\n37,9365\n37,13309\n37,13454\n37,13565\n37,13991\n37,14598\n37,14916\n37,19343\n37,19501\n37,19729\n37,19953\n37,20550\n37,21701\n37,21765\n37,25169\n37,26034\n37,26161\n37,26287\n37,34162\n37,35527\n37,36957\n37,37061\n37,37628\n37,39650\n37,41778\n37,45195\n37,46868\n37,46881\n37,48089\n37,48238\n37,48304\n37,48305\n37,48339\n37,48510\n37,48516\n37,49121\n37,49700\n37,52112\n37,55618\n37,56324\n37,60375\n37,60733\n37,62739\n37,62916\n37,64674\n37,69988\n37,76900\n37,76980\n37,76997\n37,77473\n37,77789\n37,85968\n37,111032\n37,111083\n37,111258\n37,111348\n37,113886\n37,114085\n37,115479\n37,119014\n37,119479\n37,128986\n37,130738\n37,133297\n37,136226\n37,137752\n37,140353\n37,141961\n37,142594\n37,147411\n37,163742\n37,163898\n37,163979\n37,169480\n37,174781\n37,177964\n37,180986\n37,188553\n37,188664\n37,188819\n37,189303\n37,214997\n37,216052\n37,221828\n37,221920\n37,227376\n37,237557\n37,243369\n37,244041\n37,255021\n39,10\n40,134\n40,289\n40,442\n40,631\n40,714\n40,784\n40,887\n40,1282\n40,2286\n40,2775\n40,88820\n40,94134\n41,41\n41,42\n41,68\n41,139\n41,233\n41,255\n41,261\n41,289\n41,290\n41,298\n41,314\n41,373\n41,417\n41,431\n41,534\n41,573\n41,589\n41,590\n41,599\n41,612\n41,631\n41,632\n41,677\n41,694\n41,714\n41,715\n41,760\n41,784\n41,797\n41,805\n41,823\n41,852\n41,862\n41,911\n41,1004\n41,1012\n41,1080\n41,1085\n41,1119\n41,1132\n41,1149\n41,1177\n41,1195\n41,1209\n41,1285\n41,1459\n41,1462\n41,1580\n41,1608\n41,1631\n41,1641\n41,1663\n41,1745\n41,1867\n41,1888\n41,1962\n41,2089\n41,2296\n41,2338\n41,2417\n41,2572\n41,2747\n41,2775\n41,2940\n41,2991\n41,2995\n41,3135\n41,3623\n41,4114\n41,4115\n41,4222\n41,4258\n41,4532\n41,4547\n41,5261\n41,5331\n41,5472\n41,5935\n41,6068\n41,7194\n41,8208\n41,8246\n41,8537\n41,13563\n41,13931\n41,14723\n41,15109\n41,15233\n41,15614\n41,18533\n41,18933\n41,19502\n41,19617\n41,20986\n41,21591\n41,23784\n41,24613\n41,24842\n41,25385\n41,25664\n41,25800\n41,26061\n41,28442\n41,28636\n41,30505\n41,31300\n41,31302\n41,33995\n41,35500\n41,36245\n41,37422\n41,43394\n41,44725\n41,46874\n41,49309\n41,51972\n41,54421\n41,54666\n41,54693\n41,56629\n41,58145\n41,58911\n41,59067\n41,60603\n41,62964\n41,64631\n41,64840\n41,65681\n41,67479\n41,70784\n41,71757\n41,71873\n41,72625\n41,72821\n41,73745\n41,75184\n41,75912\n41,78891\n41,79619\n41,79901\n41,80402\n41,83498\n41,87507\n41,88146\n41,89584\n41,94134\n41,95327\n41,95537\n41,96606\n41,98080\n41,98263\n41,100232\n41,101473\n41,105327\n41,106234\n41,110092\n41,113982\n41,114092\n41,117118\n41,119919\n41,121919\n41,122587\n41,122914\n41,123778\n41,124856\n41,127158\n41,127207\n41,127754\n41,127759\n41,127829\n41,128342\n41,129660\n41,131294\n41,133582\n41,133812\n41,134685\n41,135107\n41,135180\n41,135991\n41,137096\n41,138057\n41,139522\n41,140180\n41,147443\n41,148333\n41,150762\n41,152589\n41,154567\n41,155183\n41,155999\n41,156898\n41,156957\n41,159712\n41,159757\n41,160478\n41,160860\n41,162402\n41,162485\n41,163316\n41,163370\n41,164846\n41,165233\n41,165765\n41,166983\n41,167758\n41,168377\n41,169337\n41,170595\n41,171587\n41,172521\n41,173229\n41,173427\n41,176883\n41,176944\n41,180954\n41,181841\n41,182836\n41,182924\n41,183401\n41,183764\n41,185877\n41,186065\n41,187322\n41,195468\n41,197703\n41,198775\n41,199918\n41,200563\n41,203094\n41,206230\n41,207051\n41,207126\n41,211936\n41,212360\n41,213154\n41,214900\n41,214906\n41,214918\n41,214923\n41,214925\n41,216016\n41,216137\n41,217446\n41,217623\n41,217625\n41,217628\n41,217640\n41,217642\n41,217659\n41,218110\n41,218111\n41,218508\n41,218518\n41,218576\n41,220811\n41,220954\n41,220961\n41,220965\n41,220967\n41,220970\n41,220977\n41,220979\n41,221089\n41,221090\n41,221701\n41,221709\n41,221712\n41,222390\n41,222391\n41,222394\n41,222397\n41,222402\n41,222404\n41,222417\n41,222721\n41,222724\n41,223824\n41,223827\n41,223828\n41,223859\n41,223875\n41,223892\n41,223950\n41,223958\n41,223965\n41,223972\n41,223987\n41,224090\n41,224500\n41,224514\n41,224515\n41,224522\n41,224561\n41,224566\n41,224619\n41,224655\n41,224716\n41,224723\n41,224741\n41,225565\n41,225566\n41,225572\n41,225597\n41,225678\n41,225845\n41,225846\n41,225847\n41,225853\n41,228884\n41,228892\n41,228894\n41,228897\n41,228919\n41,229229\n41,229676\n41,229725\n41,229783\n41,229862\n41,230360\n41,230484\n41,230679\n41,230681\n41,230683\n41,230684\n41,230686\n41,230696\n41,231219\n41,231258\n41,236126\n41,247980\n41,255068\n41,258887\n41,262906\n41,263838\n42,41\n42,42\n42,233\n42,1177\n42,1195\n42,1608\n42,23784\n42,23789\n43,44\n44,44\n45,46\n45,58\n46,45\n46,46\n46,58\n46,301\n46,444\n46,459\n46,567\n46,615\n46,663\n46,664\n46,665\n46,744\n46,783\n46,801\n46,877\n46,937\n46,968\n46,973\n46,994\n46,1117\n46,1122\n46,1125\n46,1128\n46,1160\n46,1231\n46,1241\n46,1284\n46,1293\n46,1300\n46,1436\n46,1732\n46,2217\n46,2373\n46,2595\n46,2747\n46,3422\n46,3488\n46,3575\n46,3630\n46,4046\n46,4128\n46,5662\n46,6411\n46,6434\n46,17894\n46,21060\n46,23574\n46,26042\n46,26198\n46,37355\n46,37610\n46,38769\n46,42595\n46,49469\n46,52528\n46,55868\n46,67818\n46,68893\n46,70314\n46,74691\n46,75912\n46,76679\n46,80996\n46,83034\n46,90254\n46,97867\n46,102565\n46,103860\n46,121863\n46,122665\n46,123105\n46,126090\n46,138324\n46,138679\n46,138738\n46,139613\n46,143372\n46,145984\n46,149246\n46,152469\n46,172017\n46,173791\n46,176327\n46,186657\n46,189303\n46,214863\n46,216626\n46,216740\n46,218050\n46,218884\n46,221828\n46,223970\n46,228883\n46,236836\n46,253410\n46,254449\n46,254577\n46,255500\n46,255794\n46,263082\n47,5\n47,30\n47,47\n47,94\n47,111\n47,1235\n47,2089\n47,2469\n47,2867\n47,2868\n47,4748\n47,5700\n47,5871\n47,5889\n47,6569\n47,7271\n47,7469\n47,19994\n47,20007\n48,48\n48,911\n48,1204\n48,3538\n48,4039\n49,50\n49,240\n49,127158\n50,1\n50,49\n50,50\n50,56\n50,79\n50,99\n50,146\n50,147\n50,149\n50,158\n50,175\n50,192\n50,240\n50,325\n50,333\n50,336\n50,406\n50,620\n50,622\n50,640\n50,778\n50,779\n50,809\n50,818\n50,841\n50,861\n50,1163\n50,1210\n50,1218\n50,1370\n50,1425\n50,1515\n50,1521\n50,1562\n50,1623\n50,1873\n50,2014\n50,2234\n50,2235\n50,2365\n50,2374\n50,2431\n50,2539\n50,2540\n50,2710\n50,2741\n50,2792\n50,3449\n50,3868\n50,3895\n50,4190\n50,4260\n50,4465\n50,4684\n50,5049\n50,5472\n50,5644\n50,7494\n50,8055\n50,8538\n50,9171\n50,9479\n50,13197\n50,13390\n50,13589\n50,14040\n50,14345\n50,14566\n50,14570\n50,14584\n50,15054\n50,15770\n50,16322\n50,16890\n50,17151\n50,18194\n50,18646\n50,18697\n50,19385\n50,20494\n50,20662\n50,21092\n50,21751\n50,23999\n50,24778\n50,24837\n50,26139\n50,26415\n50,28799\n50,29252\n50,29941\n50,30331\n50,31186\n50,31228\n50,31524\n50,33435\n50,35000\n50,35447\n50,35518\n50,35844\n50,36082\n50,36534\n50,38104\n50,40646\n50,40757\n50,40910\n50,41166\n50,42508\n50,42585\n50,42606\n50,44344\n50,44369\n50,46185\n50,47095\n50,48738\n50,51424\n50,56406\n50,56505\n50,57646\n50,58265\n50,58378\n50,58653\n50,59072\n50,59168\n50,59401\n50,59425\n50,59740\n50,60152\n50,60649\n50,61259\n50,61684\n50,64515\n50,64684\n50,65078\n50,66352\n50,66533\n50,66602\n50,66655\n50,66923\n50,67209\n50,67280\n50,68069\n50,68333\n50,69471\n50,72614\n50,72744\n50,75309\n50,79954\n50,80058\n50,80973\n50,81052\n50,82787\n50,82886\n50,86360\n50,92476\n50,92927\n50,93943\n50,118336\n50,119643\n50,120060\n50,121306\n50,121361\n50,122134\n50,134286\n50,134581\n50,137302\n50,141168\n50,141912\n50,144895\n50,145024\n50,145083\n50,146029\n50,146458\n50,147458\n50,148839\n50,158924\n50,160210\n50,161080\n50,164004\n50,164426\n50,165135\n50,167033\n50,170818\n50,170828\n50,172200\n50,174273\n50,174952\n50,181458\n50,183890\n50,189569\n50,193175\n50,194936\n50,195454\n50,212898\n50,212909\n50,215219\n50,215881\n50,216743\n50,217069\n50,217318\n50,217873\n50,217987\n50,219616\n50,220968\n50,220973\n50,221264\n50,221696\n50,221859\n50,222019\n50,222099\n50,222387\n50,223373\n50,223473\n50,223479\n50,223760\n50,223878\n50,225089\n50,227175\n50,227698\n50,228079\n50,228718\n50,230441\n50,230528\n50,230575\n50,237623\n50,242613\n50,243182\n50,243288\n50,244664\n50,245445\n50,245983\n50,247346\n51,52\n53,54\n53,87\n53,207\n53,255\n54,54\n54,135\n54,222\n54,278\n54,283\n54,313\n54,385\n54,401\n54,455\n54,657\n54,660\n54,718\n54,784\n54,814\n54,830\n54,1011\n54,1019\n54,1539\n54,1724\n54,1756\n54,1784\n54,1843\n54,1861\n54,2159\n54,2253\n54,2388\n54,2421\n54,2424\n54,2553\n54,2619\n54,2646\n54,2775\n54,2866\n54,2944\n54,4377\n54,5428\n54,5435\n54,5591\n54,5933\n54,6079\n54,6506\n54,6789\n54,7698\n54,7768\n54,8427\n54,9134\n54,9874\n54,13276\n54,14447\n54,14511\n54,15028\n54,15261\n54,15694\n54,15711\n54,16772\n54,18835\n54,18903\n54,19349\n54,19352\n54,20200\n54,21037\n54,21382\n54,22552\n54,24934\n54,25069\n54,25615\n54,25670\n54,26801\n54,28528\n54,28933\n54,34603\n54,37055\n54,37088\n54,37708\n54,39537\n54,39561\n54,41330\n54,41494\n54,42831\n54,54550\n54,59690\n54,61645\n54,62305\n54,62518\n54,62705\n54,63629\n54,64713\n54,66671\n54,66703\n54,69696\n54,79966\n54,82311\n54,82882\n54,90178\n54,90872\n54,94340\n54,98218\n54,102682\n54,107641\n54,107642\n54,108206\n54,115474\n54,118044\n54,118942\n54,125482\n54,131004\n54,131497\n54,137217\n54,147183\n54,151133\n54,151136\n54,151142\n54,156412\n54,159372\n54,159406\n54,164007\n54,164888\n54,165814\n54,171796\n54,175332\n54,178969\n54,179002\n54,179270\n54,179764\n54,179834\n54,179881\n54,180134\n54,180192\n54,183172\n54,183176\n54,183179\n54,183203\n54,188052\n54,212118\n54,222196\n54,224200\n54,224203\n54,234354\n54,240074\n54,260637\n55,55\n55,56\n55,147\n55,158\n55,192\n55,422\n55,1181\n55,4536\n55,5821\n55,14091\n55,18519\n55,18525\n55,19751\n55,21263\n55,21329\n55,23783\n55,30331\n55,32973\n55,34362\n55,34863\n55,35327\n55,37983\n55,39652\n55,41191\n55,46087\n55,58147\n55,60395\n55,60576\n55,62784\n55,66671\n55,75114\n55,75841\n55,79598\n55,81076\n55,86566\n55,94776\n55,104347\n55,120932\n55,121013\n55,122086\n55,135983\n55,137002\n55,141964\n55,143306\n55,159392\n55,187148\n55,204124\n55,217888\n55,232652\n55,238055\n55,240949\n55,260143\n55,261987\n56,1\n56,10\n56,55\n56,56\n56,99\n56,146\n56,147\n56,158\n56,175\n56,192\n56,256\n56,314\n56,333\n56,336\n56,406\n56,421\n56,422\n56,425\n56,446\n56,602\n56,663\n56,780\n56,841\n56,843\n56,920\n56,1011\n56,1089\n56,1181\n56,1218\n56,1425\n56,1464\n56,1491\n56,1566\n56,1619\n56,1623\n56,1825\n56,1993\n56,2032\n56,2224\n56,3370\n56,3571\n56,3877\n56,3895\n56,5357\n56,5373\n56,6119\n56,7296\n56,7968\n56,8078\n56,8662\n56,9394\n56,13636\n56,18519\n56,18557\n56,18638\n56,18997\n56,19571\n56,19751\n56,20375\n56,20757\n56,20982\n56,21329\n56,22616\n56,23783\n56,25550\n56,26234\n56,26414\n56,26453\n56,27175\n56,28354\n56,30331\n56,34320\n56,34362\n56,34863\n56,34963\n56,36411\n56,36417\n56,38834\n56,38857\n56,43608\n56,44242\n56,45808\n56,46087\n56,48320\n56,50602\n56,50603\n56,53993\n56,54582\n56,55036\n56,55075\n56,56259\n56,56972\n56,57014\n56,57037\n56,57648\n56,58446\n56,59852\n56,59861\n56,60395\n56,60576\n56,66097\n56,66378\n56,71746\n56,73348\n56,77906\n56,78814\n56,79768\n56,81153\n56,81403\n56,82644\n56,87210\n56,89968\n56,91296\n56,92476\n56,101863\n56,102621\n56,102726\n56,104317\n56,104347\n56,111312\n56,115812\n56,116103\n56,118890\n56,119170\n56,122941\n56,124847\n56,127422\n56,132904\n56,135736\n56,137015\n56,137016\n56,137812\n56,140470\n56,141823\n56,144849\n56,147327\n56,147624\n56,148601\n56,151137\n56,153226\n56,153775\n56,168629\n56,173561\n56,174534\n56,175376\n56,175379\n56,177227\n56,177713\n56,180986\n56,182762\n56,183501\n56,183872\n56,191465\n56,194768\n56,195576\n56,202215\n56,203971\n56,204124\n56,206552\n56,207659\n56,220074\n56,230455\n56,230458\n56,230471\n56,230480\n56,230513\n56,230521\n56,230641\n56,231978\n56,242910\n56,245033\n56,246479\n56,249202\n56,254023\n56,258375\n56,261965\n57,58\n58,45\n58,46\n58,58\n58,111\n58,292\n58,402\n58,441\n58,442\n58,534\n58,572\n58,589\n58,676\n58,749\n58,801\n58,821\n58,852\n58,1011\n58,1124\n58,1125\n58,1128\n58,1130\n58,1140\n58,1146\n58,1177\n58,1238\n58,1449\n58,1482\n58,2163\n58,2334\n58,3407\n58,3474\n58,3488\n58,4128\n58,4485\n58,4771\n58,5456\n58,5471\n58,5473\n58,5547\n58,5914\n58,6070\n58,6087\n58,6411\n58,6434\n58,7167\n58,7207\n58,8059\n58,8177\n58,13173\n58,13361\n58,13538\n58,14118\n58,14132\n58,14565\n58,14633\n58,14948\n58,16141\n58,18482\n58,18838\n58,19061\n58,19142\n58,20663\n58,21060\n58,23365\n58,23835\n58,24089\n58,24326\n58,26042\n58,26162\n58,26904\n58,28229\n58,29012\n58,30491\n58,32867\n58,33406\n58,33422\n58,33977\n58,34099\n58,37355\n58,38769\n58,44202\n58,45785\n58,51967\n58,52976\n58,53400\n58,54972\n58,61912\n58,62778\n58,67101\n58,70756\n58,72892\n58,73409\n58,75418\n58,75912\n58,76815\n58,80464\n58,83034\n58,85929\n58,87306\n58,90735\n58,97867\n58,98339\n58,99760\n58,101634\n58,101646\n58,101669\n58,101731\n58,102061\n58,102064\n58,102578\n58,102694\n58,102713\n58,103067\n58,103072\n58,105650\n58,105765\n58,117887\n58,118954\n58,119306\n58,125053\n58,127538\n58,128801\n58,130778\n58,135095\n58,135981\n58,136072\n58,136445\n58,136666\n58,136763\n58,142505\n58,142729\n58,142785\n58,145984\n58,147413\n58,147646\n58,157033\n58,159359\n58,160450\n58,170774\n58,171631\n58,174877\n58,183474\n58,185463\n58,185487\n58,192474\n58,207000\n58,228763\n58,231015\n58,237080\n58,245982\n58,258145\n58,259062\n59,10\n59,59\n59,446\n59,3794\n59,67397\n60,26\n60,59\n60,117\n60,994\n60,1212\n60,2674\n60,2712\n61,58\n62,10\n62,206\n62,306\n62,307\n63,63\n63,146\n63,192\n63,202\n63,203\n63,251\n63,252\n63,275\n63,389\n63,446\n63,471\n63,493\n63,516\n63,685\n63,794\n63,1011\n63,1220\n63,1222\n63,1243\n63,1512\n63,2232\n63,5060\n63,5992\n63,6325\n63,7186\n63,7295\n63,7388\n63,7755\n63,8764\n63,9107\n63,13242\n63,13944\n63,16519\n63,17312\n63,20295\n63,24623\n63,26179\n63,27175\n63,28782\n63,28957\n63,30691\n63,31087\n63,31218\n63,33195\n63,33261\n63,33491\n63,35475\n63,35679\n63,38999\n63,39032\n63,40658\n63,48781\n63,59509\n63,63626\n63,67110\n63,70404\n63,83442\n63,86329\n63,91219\n63,92476\n63,94906\n63,104537\n63,113341\n63,118360\n63,120001\n63,123247\n63,124353\n63,126920\n63,128132\n63,128222\n63,131718\n63,139526\n63,141855\n63,142802\n63,148980\n63,149244\n63,153196\n63,153824\n63,155082\n63,156992\n63,160848\n63,163415\n63,167700\n63,170551\n63,172549\n63,179103\n63,189842\n63,215276\n63,222573\n63,229210\n63,229675\n63,242201\n63,245294\n63,250716\n64,65\n64,66\n64,868\n65,65\n65,66\n65,79\n65,147\n65,171\n65,184\n65,186\n65,203\n65,207\n65,240\n65,252\n65,256\n65,314\n65,438\n65,466\n65,467\n65,495\n65,571\n65,726\n65,868\n65,1247\n65,1427\n65,1433\n65,1586\n65,1747\n65,1797\n65,2363\n65,2414\n65,2467\n65,2561\n65,3439\n65,3506\n65,3569\n65,3744\n65,3884\n65,4159\n65,4446\n65,5179\n65,5244\n65,6921\n65,6990\n65,7129\n65,7178\n65,7880\n65,9448\n65,13181\n65,13233\n65,13243\n65,13693\n65,14245\n65,14501\n65,15199\n65,15394\n65,15780\n65,18242\n65,18252\n65,18264\n65,18271\n65,18372\n65,18397\n65,20323\n65,20873\n65,23699\n65,24575\n65,24607\n65,26133\n65,28360\n65,29641\n65,30502\n65,31250\n65,32626\n65,32667\n65,32725\n65,33523\n65,34209\n65,36682\n65,37479\n65,37963\n65,38412\n65,41996\n65,42473\n65,42521\n65,42529\n65,43366\n65,44155\n65,44157\n65,44825\n65,44826\n65,44837\n65,44843\n65,46172\n65,47022\n65,48128\n65,48315\n65,49000\n65,49011\n65,49221\n65,50229\n65,54791\n65,55735\n65,68613\n65,70236\n65,70908\n65,71649\n65,72488\n66,65\n66,66\n66,79\n66,126\n66,186\n66,203\n66,314\n66,466\n66,467\n66,495\n66,570\n66,788\n66,868\n66,1011\n66,1151\n66,1235\n66,1351\n66,1433\n66,1855\n66,2177\n66,2343\n66,2403\n66,2445\n66,2561\n66,2585\n66,3436\n66,3569\n66,3691\n66,3744\n66,4089\n66,4239\n66,4446\n66,6602\n66,6706\n66,6761\n66,7037\n66,7205\n66,7949\n66,8409\n66,13160\n66,13233\n66,13519\n66,14645\n66,14654\n66,15212\n66,15866\n66,17022\n66,18169\n66,18244\n66,18250\n66,18532\n66,18834\n66,20786\n66,21409\n66,21563\n66,22015\n66,22127\n66,22327\n66,23514\n66,23616\n66,26919\n66,28266\n66,28951\n66,29641\n66,34117\n66,35264\n66,35539\n66,36729\n66,36823\n66,37479\n66,41930\n66,42451\n66,43166\n66,43366\n66,44195\n66,51884\n66,54035\n66,54520\n66,54608\n66,57182\n66,58420\n66,61137\n66,63992\n66,64075\n66,64168\n66,65665\n66,65916\n66,66617\n66,75883\n66,78616\n66,78906\n66,85733\n66,85979\n66,88083\n66,91513\n66,96593\n66,96733\n66,105687\n66,106301\n66,111165\n66,116088\n67,68\n68,41\n68,67\n68,68\n68,126\n68,175\n68,178\n68,186\n68,192\n68,240\n68,255\n68,261\n68,301\n68,314\n68,326\n68,356\n68,387\n68,393\n68,397\n68,431\n68,433\n68,440\n68,467\n68,516\n68,588\n68,590\n68,599\n68,631\n68,673\n68,677\n68,693\n68,694\n68,765\n68,775\n68,794\n68,805\n68,823\n68,843\n68,849\n68,852\n68,872\n68,911\n68,1004\n68,1011\n68,1085\n68,1119\n68,1133\n68,1210\n68,1240\n68,1284\n68,1285\n68,1326\n68,1332\n68,1400\n68,1466\n68,1566\n68,1608\n68,1634\n68,1663\n68,1738\n68,1782\n68,1796\n68,1844\n68,1853\n68,1912\n68,1973\n68,2036\n68,2164\n68,2285\n68,2307\n68,2358\n68,2512\n68,2556\n68,2590\n68,2635\n68,3407\n68,3467\n68,3804\n68,4190\n68,4220\n68,4605\n68,4751\n68,5361\n68,5382\n68,5390\n68,5563\n68,5958\n68,5991\n68,6579\n68,6856\n68,7170\n68,7348\n68,8107\n68,8246\n68,8488\n68,9176\n68,9228\n68,12878\n68,13176\n68,13265\n68,13318\n68,13327\n68,13563\n68,13947\n68,15206\n68,15991\n68,17073\n68,18543\n68,18667\n68,19682\n68,19798\n68,19815\n68,19960\n68,19968\n68,20301\n68,20787\n68,20803\n68,21645\n68,22071\n68,22450\n68,22711\n68,23491\n68,23850\n68,24989\n68,25282\n68,25430\n68,25800\n68,26041\n68,26093\n68,30042\n68,30901\n68,31003\n68,31302\n68,31493\n68,33703\n68,34828\n68,35500\n68,38990\n68,40942\n68,44832\n68,45914\n68,46165\n68,46387\n68,47793\n68,47805\n68,48182\n68,48601\n68,49752\n68,50259\n68,50440\n68,50442\n68,50540\n68,50551\n68,50552\n68,50559\n68,50865\n68,52585\n68,56710\n68,58563\n68,58975\n68,60908\n68,62329\n68,63035\n68,64294\n68,65449\n68,65877\n68,66297\n68,66641\n68,72733\n68,73313\n68,76237\n68,80194\n68,80782\n68,83314\n68,86101\n68,87929\n68,88415\n68,93691\n68,94251\n68,94357\n68,96789\n68,102152\n68,103543\n68,103566\n68,106613\n68,107962\n68,113353\n68,113940\n68,117841\n68,118367\n68,118671\n68,119645\n68,119863\n68,124265\n68,124375\n68,128171\n68,128421\n68,129929\n68,129964\n68,134023\n68,137124\n68,137767\n68,138347\n68,138353\n68,138743\n68,138755\n68,140523\n68,144231\n68,148112\n68,148697\n68,150593\n68,150739\n68,155482\n68,159742\n68,160548\n68,160895\n68,165015\n68,170765\n68,174604\n68,176485\n68,179865\n68,182628\n68,182810\n68,183986\n68,185728\n68,193763\n68,193871\n68,194303\n68,194449\n68,200276\n68,201999\n68,205222\n68,212567\n68,213170\n68,222688\n68,227145\n68,228629\n68,229194\n68,230329\n68,230334\n68,230902\n68,232296\n68,232490\n68,238565\n68,243075\n68,245706\n68,249905\n69,10\n70,71\n70,72\n70,280\n70,364\n70,485\n70,611\n70,859\n70,920\n70,1612\n70,2590\n70,4220\n70,17245\n70,66297\n70,193129\n70,255750\n71,372\n71,431\n71,631\n71,676\n71,685\n71,693\n71,911\n71,985\n71,1113\n71,1504\n71,1715\n71,2989\n71,2991\n71,3724\n71,5356\n71,5836\n71,7921\n71,14633\n71,15772\n71,15988\n71,16497\n71,20308\n71,20664\n71,24600\n71,24808\n71,26041\n71,26450\n71,31290\n71,37771\n71,38176\n71,38183\n71,59931\n71,62483\n71,65876\n71,76905\n71,78746\n71,87769\n71,90845\n71,101818\n71,112902\n71,116093\n71,122905\n71,128269\n71,131755\n71,152181\n71,164448\n71,185742\n71,187523\n71,189236\n71,191969\n71,218524\n71,258859\n71,258877\n71,258880\n71,263024\n72,72\n72,285\n72,390\n72,510\n72,1309\n72,1796\n72,3507\n72,4771\n73,113156\n74,75\n76,20\n76,77\n76,85\n76,86\n76,119\n76,120\n76,142430\n77,10\n77,2422\n77,5259\n77,6834\n77,7150\n77,7763\n77,7877\n77,9684\n77,12743\n77,15183\n77,16481\n77,21522\n77,28132\n77,29595\n77,30556\n77,33151\n77,34185\n77,34726\n77,39521\n77,39599\n77,41621\n77,42803\n77,43261\n77,43349\n77,43354\n77,45398\n77,45664\n77,57856\n77,61211\n77,64066\n77,67328\n77,70850\n77,75180\n77,82911\n77,87691\n77,94256\n77,99633\n77,126851\n77,133674\n77,136600\n77,138283\n77,140390\n77,142634\n77,145546\n77,163919\n77,169029\n77,169862\n77,170043\n77,171045\n77,181000\n77,194424\n77,194477\n77,212588\n77,214103\n77,223708\n78,79\n79,50\n79,79\n79,99\n79,146\n79,147\n79,175\n79,192\n79,333\n79,336\n79,421\n79,422\n79,425\n79,602\n79,620\n79,622\n79,779\n79,915\n79,1089\n79,1181\n79,1198\n79,1464\n79,1562\n79,1619\n79,1623\n79,4534\n79,5152\n79,6119\n79,6492\n79,6519\n79,7791\n79,7948\n79,14432\n79,15102\n79,15770\n79,16322\n79,16421\n79,16563\n79,17363\n79,18619\n79,19555\n79,21442\n79,22494\n79,23157\n79,23465\n79,23633\n79,23783\n79,24150\n79,24770\n79,28107\n79,32529\n79,34237\n79,35581\n79,37124\n79,37441\n79,37480\n79,38688\n79,39645\n79,40612\n79,40937\n79,42870\n79,44118\n79,47500\n79,51169\n79,51260\n79,54876\n79,74447\n79,77105\n79,78843\n79,79814\n79,83314\n79,90886\n79,92476\n79,110128\n79,117818\n79,117917\n79,119341\n79,121159\n79,121594\n79,122526\n79,124710\n79,129097\n79,129839\n79,133553\n79,137302\n79,139004\n79,142626\n79,152310\n79,161733\n79,162672\n79,165823\n79,171024\n79,172381\n79,172412\n79,175962\n79,192424\n79,193076\n79,194459\n79,197507\n79,201179\n79,201977\n79,202318\n79,205015\n79,205270\n79,206842\n79,207693\n79,222543\n79,223487\n79,228462\n79,228981\n79,230569\n79,230940\n79,232881\n79,234682\n79,234784\n79,235936\n79,236022\n79,238785\n79,239963\n79,241069\n79,241164\n79,241911\n79,242226\n79,242839\n79,243246\n79,244153\n79,245448\n79,247337\n79,247477\n79,247898\n79,248318\n79,249683\n79,250184\n79,252472\n79,253163\n79,253436\n79,254755\n79,255063\n79,255082\n79,256229\n79,256413\n79,256484\n79,258786\n79,259171\n79,259884\n79,261014\n79,261487\n79,262335\n79,262380\n79,263917\n79,264452\n80,81\n81,10\n81,80\n81,81\n81,215\n81,676\n81,693\n81,704\n81,911\n81,1003\n81,1011\n81,1149\n81,1212\n81,1282\n81,1392\n81,1402\n81,2105\n81,2118\n81,2210\n81,2580\n81,4237\n81,4367\n81,5181\n81,5645\n81,6247\n81,6467\n81,6715\n81,6976\n81,8079\n81,8654\n81,16511\n81,17410\n81,17777\n81,18590\n81,21373\n81,21596\n81,22470\n81,24729\n81,26244\n81,26486\n81,27069\n81,29595\n81,30232\n81,32496\n81,36743\n81,37224\n81,38379\n81,41223\n81,41232\n81,41480\n81,42554\n81,43315\n81,45316\n81,46453\n81,49247\n81,50348\n81,52960\n81,53929\n81,54630\n81,55327\n81,55328\n81,57173\n81,65746\n81,65880\n81,71160\n81,75277\n81,77695\n81,82037\n81,83292\n81,84022\n81,84519\n81,84663\n81,85777\n81,88062\n81,91495\n81,92141\n81,93558\n81,95117\n81,96614\n81,99674\n81,105311\n81,107981\n81,108083\n81,110941\n81,113178\n81,116094\n81,119134\n81,121424\n81,121472\n81,122043\n81,122093\n81,129071\n81,133067\n81,137941\n81,140687\n81,141048\n81,141914\n81,143585\n81,144502\n81,145649\n81,146110\n81,146253\n81,146924\n81,147511\n81,148131\n81,159005\n81,160845\n81,161914\n81,162884\n81,163873\n81,165819\n81,172115\n81,172624\n81,173284\n81,176905\n81,180330\n81,180359\n81,182162\n81,182698\n81,182856\n81,183687\n81,184014\n81,187447\n81,188081\n81,190368\n81,190520\n81,190595\n81,191266\n81,191269\n81,191271\n81,193311\n81,197902\n81,198433\n81,205630\n81,217534\n81,217536\n81,217904\n81,218127\n81,220417\n81,220419\n81,220420\n81,220422\n81,220424\n81,220430\n81,220994\n81,221245\n81,228321\n81,229271\n81,230442\n81,232791\n81,238460\n81,240455\n81,257753\n81,262451\n81,263419\n82,83\n83,34\n83,35\n83,83\n83,147\n83,192\n83,217\n83,222\n83,228\n83,283\n83,313\n83,314\n83,356\n83,385\n83,389\n83,397\n83,446\n83,455\n83,457\n83,477\n83,497\n83,536\n83,599\n83,634\n83,676\n83,682\n83,685\n83,693\n83,843\n83,849\n83,852\n83,911\n83,949\n83,1011\n83,1118\n83,1276\n83,1313\n83,1417\n83,1724\n83,1756\n83,1770\n83,1881\n83,1891\n83,2000\n83,2290\n83,2373\n83,2421\n83,2507\n83,2553\n83,2646\n83,2709\n83,2779\n83,2784\n83,2997\n83,3018\n83,3603\n83,3933\n83,3993\n83,4109\n83,4207\n83,4234\n83,4295\n83,4501\n83,5046\n83,5270\n83,5591\n83,5873\n83,5906\n83,6064\n83,6085\n83,6112\n83,6476\n83,6552\n83,7430\n83,7698\n83,7831\n83,8097\n83,8926\n83,9084\n83,9212\n83,9484\n83,9756\n83,13397\n83,13804\n83,13980\n83,14262\n83,14358\n83,16287\n83,16537\n83,16652\n83,16760\n83,17121\n83,17151\n83,17346\n83,17488\n83,17489\n83,17496\n83,17498\n83,17608\n83,17630\n83,17638\n83,18248\n83,18827\n83,18831\n83,19117\n83,19823\n83,19903\n83,21547\n83,21563\n83,21677\n83,22254\n83,22379\n83,22382\n83,22407\n83,22438\n83,22455\n83,22499\n83,22500\n83,22501\n83,22506\n83,22508\n83,22511\n83,23089\n83,23287\n83,23547\n83,23550\n83,23777\n83,23866\n83,25513\n83,26034\n83,26879\n83,27827\n83,27965\n83,28130\n83,28152\n83,28516\n83,28659\n83,29072\n83,29167\n83,29461\n83,29767\n83,30507\n83,30678\n83,30736\n83,31365\n83,31379\n83,31708\n83,31791\n83,31881\n83,31905\n83,31908\n83,31910\n83,31911\n83,31913\n83,31916\n83,31918\n83,32007\n83,32011\n83,32193\n83,32203\n83,32442\n83,32444\n83,32447\n83,32449\n83,32450\n83,32457\n83,32463\n83,32662\n83,32742\n83,32749\n83,32970\n83,33105\n83,33246\n83,33374\n83,33885\n83,33972\n83,34246\n83,34285\n83,34290\n83,34292\n83,34294\n83,34297\n83,34305\n83,34309\n83,34315\n83,34319\n83,34324\n83,34349\n83,34371\n83,35032\n83,36796\n83,36834\n83,36857\n83,36859\n83,37060\n83,37080\n83,37738\n83,37851\n83,38453\n83,39067\n83,39138\n83,39141\n83,39144\n83,39148\n83,39149\n83,39151\n83,39157\n83,39467\n83,39496\n83,39518\n83,40667\n83,40785\n83,41025\n83,41103\n83,41124\n83,41233\n83,41241\n83,41377\n83,41383\n83,41386\n83,41399\n83,41405\n83,41408\n83,41409\n83,41842\n83,41857\n83,43299\n83,43300\n83,43316\n83,44048\n83,44250\n83,44270\n83,44287\n83,44296\n83,44300\n83,44302\n83,44304\n83,44404\n83,44408\n83,44409\n83,44680\n83,45321\n83,45982\n83,46165\n83,46392\n83,48193\n83,48209\n83,48258\n83,48262\n83,48269\n83,48273\n83,48284\n83,48297\n83,48300\n83,48309\n83,48338\n83,48342\n83,48350\n83,48404\n83,48426\n83,48430\n83,48431\n83,48434\n83,48438\n83,48780\n83,48783\n83,48875\n83,49169\n83,49262\n83,49263\n83,50077\n83,50098\n83,50124\n83,50419\n83,50590\n83,51918\n83,51974\n83,51993\n83,52000\n83,52835\n83,53141\n83,53187\n83,53477\n83,53720\n83,54208\n83,54646\n83,54669\n83,54676\n83,54700\n83,54707\n83,54709\n83,54784\n83,55012\n83,55225\n83,55657\n83,55716\n83,55729\n83,56419\n83,57007\n83,57182\n83,59108\n83,59788\n83,60539\n83,62286\n83,62347\n83,62874\n83,63629\n83,69329\n83,72395\n83,72837\n83,75295\n83,75466\n83,77002\n83,77005\n83,77034\n83,77050\n83,77495\n83,77502\n83,77509\n83,77513\n83,77519\n83,77523\n83,77527\n83,77531\n83,77533\n83,77735\n83,78635\n83,78985\n83,79665\n83,80015\n83,80018\n83,80020\n83,80045\n83,80480\n83,81067\n83,86570\n83,87240\n83,87878\n83,87977\n83,87988\n83,88325\n83,88918\n83,89056\n83,90938\n83,93704\n83,96788\n83,106309\n83,108559\n83,108730\n83,108972\n83,111167\n83,111184\n83,111423\n83,111426\n83,111545\n83,111901\n83,111903\n83,111912\n83,111921\n83,111925\n83,112735\n83,112837\n83,112839\n83,112842\n83,113087\n83,113356\n83,113357\n83,113505\n83,114621\n83,114624\n83,114628\n83,114635\n83,114655\n83,114787\n83,114802\n83,114809\n83,114810\n83,114817\n83,114822\n83,114827\n83,114828\n83,114831\n83,114832\n83,114834\n83,114835\n83,114837\n83,114922\n83,114997\n83,114998\n83,115013\n83,115474\n83,115503\n83,115928\n83,115930\n83,115931\n83,115937\n83,115947\n83,116369\n83,116376\n83,117480\n83,118378\n83,118785\n83,118786\n83,118787\n83,118788\n83,118812\n83,119256\n83,119353\n83,119894\n83,119955\n83,120462\n83,120556\n83,120677\n83,121296\n83,121297\n83,121303\n83,121307\n83,121325\n83,121327\n83,121960\n83,122338\n83,122375\n83,122394\n83,122397\n83,122457\n83,122493\n83,122616\n83,123027\n83,125136\n83,126563\n83,126564\n83,126565\n83,126568\n83,126570\n83,126580\n83,126590\n83,126592\n83,126593\n83,126594\n83,126673\n83,126674\n83,126675\n83,126676\n83,126677\n83,126679\n83,126681\n83,126682\n83,126683\n83,126685\n83,127607\n83,127609\n83,127776\n83,128630\n83,129345\n83,129714\n83,129720\n83,129723\n83,129897\n83,130170\n83,130246\n83,130684\n83,130781\n83,130858\n83,130877\n83,130902\n83,131238\n83,131297\n83,131313\n83,131315\n83,131638\n83,132176\n83,132177\n83,132186\n83,132477\n83,132768\n83,132962\n83,132965\n83,132967\n83,133021\n83,133085\n83,133100\n83,133103\n83,133365\n83,133366\n83,133485\n83,134101\n83,134544\n83,134553\n83,134636\n83,134639\n83,134644\n83,134646\n83,134649\n83,134693\n83,134749\n83,134754\n83,134758\n83,134760\n83,134770\n83,134788\n83,135085\n83,135124\n83,135132\n83,135686\n83,135797\n83,135892\n83,135935\n83,135938\n83,136201\n83,136876\n83,139370\n83,139401\n83,139918\n83,139946\n83,140700\n83,140701\n83,140702\n83,140703\n83,140706\n83,140707\n83,140708\n83,140709\n83,140711\n83,140715\n83,141002\n83,141017\n83,141020\n83,141058\n83,141071\n83,141320\n83,141322\n83,141325\n83,141329\n83,141332\n83,141335\n83,141336\n83,141340\n83,141341\n83,141342\n83,141345\n83,141346\n83,141348\n83,141530\n83,141533\n83,141548\n83,141549\n83,141550\n83,141556\n83,141557\n83,141558\n83,141561\n83,141565\n83,141567\n83,141570\n83,141579\n83,141729\n83,141764\n83,141789\n83,141792\n83,141962\n83,142227\n83,142228\n83,142229\n83,142723\n83,142902\n83,143080\n83,143246\n83,143330\n83,143439\n83,143723\n83,144143\n83,144159\n83,144160\n83,144166\n83,144633\n83,144634\n83,144636\n83,144637\n83,144641\n83,144642\n83,144645\n83,144646\n83,144647\n83,144652\n83,144653\n83,144657\n83,144670\n83,144671\n83,144681\n83,144685\n83,144686\n83,144692\n83,144695\n83,144832\n83,144875\n83,145153\n83,145154\n83,145814\n83,145820\n83,145821\n83,145828\n83,145833\n83,145849\n83,145850\n83,145879\n83,146072\n83,146080\n83,146081\n83,146084\n83,146087\n83,146091\n83,146094\n83,146098\n83,146099\n83,146103\n83,146104\n83,146639\n83,147022\n83,147438\n83,147441\n83,147444\n83,147456\n83,147459\n83,147460\n83,147464\n83,147469\n83,147473\n83,147474\n83,147486\n83,147487\n83,147488\n83,148663\n83,148741\n83,148747\n83,148755\n83,148810\n83,148815\n83,149141\n83,149802\n83,149803\n83,149804\n83,149806\n83,149808\n83,149809\n83,149810\n83,149811\n83,149812\n83,149813\n83,149820\n83,149821\n83,149822\n83,149823\n83,149825\n83,149827\n83,149828\n83,149831\n83,149832\n83,149833\n83,149834\n83,149835\n83,149836\n83,149837\n83,149838\n83,149996\n83,150489\n83,150718\n83,150731\n83,151849\n83,151860\n83,151991\n83,152434\n83,152565\n83,161519\n83,165229\n83,165421\n83,165732\n83,165733\n83,165737\n83,165742\n83,165893\n83,165904\n83,165908\n83,165910\n83,165911\n83,165915\n83,165926\n83,165928\n83,165934\n83,165936\n83,165938\n83,165941\n83,165946\n83,166455\n83,166486\n83,166492\n83,166532\n83,168709\n83,168917\n83,170377\n83,170382\n83,170388\n83,170389\n83,170395\n83,170396\n83,170526\n83,171008\n83,171075\n83,171508\n83,171531\n83,171566\n83,171570\n83,171572\n83,171573\n83,171574\n83,174383\n83,174464\n83,174733\n83,174773\n83,175726\n83,175847\n83,176131\n83,176134\n83,176140\n83,176364\n83,176475\n83,176482\n83,176774\n83,177345\n83,177423\n83,177640\n83,177987\n83,178136\n83,178137\n83,178141\n83,178146\n83,178147\n83,178148\n83,178150\n83,178152\n83,178325\n83,179273\n83,179842\n83,181041\n83,181063\n83,181606\n83,182798\n83,183653\n83,186901\n83,186904\n83,186989\n83,186990\n83,188245\n83,188260\n83,188397\n83,189261\n83,190359\n83,195218\n83,199143\n83,203502\n83,203793\n83,204122\n83,207537\n83,213453\n83,213472\n83,213680\n83,213681\n83,213682\n83,213684\n83,213704\n83,213707\n83,213711\n83,213719\n83,213720\n83,213722\n83,213724\n83,213728\n83,213730\n83,213735\n83,213736\n83,213737\n83,213741\n83,213742\n83,213747\n83,213748\n83,213941\n83,213942\n83,214018\n83,214022\n83,214031\n83,214122\n83,214126\n83,214175\n83,214548\n83,215874\n83,217443\n83,217577\n83,217579\n83,217621\n83,217624\n83,217629\n83,217631\n83,217648\n83,217649\n83,217893\n83,217898\n83,217996\n83,218000\n83,218047\n83,218049\n83,218054\n83,218056\n83,218064\n83,218071\n83,218072\n83,218081\n83,218090\n83,218092\n83,218097\n83,218099\n83,218100\n83,218390\n83,218771\n83,218785\n83,218854\n83,218860\n83,218874\n83,219160\n83,219164\n83,221810\n83,221947\n83,221984\n83,222374\n83,222381\n83,222384\n83,222545\n83,222560\n83,222583\n83,223707\n83,223955\n83,224040\n83,224547\n83,226231\n83,226243\n83,227937\n83,227938\n83,228542\n83,228586\n83,228589\n83,229042\n83,229099\n83,229105\n83,229620\n83,229625\n83,229630\n83,229639\n83,233384\n83,233503\n83,235887\n83,241723\n83,241739\n83,242342\n83,242410\n83,243487\n83,244662\n83,244667\n83,244668\n83,244671\n83,244676\n83,244686\n83,244687\n83,244688\n83,244695\n83,244698\n83,245301\n83,245394\n83,245480\n83,246700\n83,246723\n83,246725\n83,246730\n83,246733\n83,246736\n83,246737\n83,246739\n83,246742\n83,246754\n83,246766\n83,246767\n83,246769\n83,246771\n83,246772\n83,246774\n83,247758\n83,249036\n83,249667\n83,250290\n83,250508\n83,250509\n83,250511\n83,250512\n83,250525\n83,250631\n83,250785\n83,250788\n83,250819\n83,250827\n83,250850\n83,250853\n83,251197\n83,251201\n83,251828\n83,251847\n83,251863\n83,251867\n83,251872\n83,257690\n83,257711\n83,258383\n83,258559\n83,258823\n83,261385\n83,261386\n83,261394\n83,261517\n83,261522\n83,264736\n83,264742\n83,264743\n83,264751\n83,264754\n83,264820\n84,44\n86,11\n86,86\n86,167\n86,255\n86,256\n86,299\n86,314\n86,563\n86,589\n86,663\n86,673\n86,783\n86,794\n86,838\n86,907\n86,932\n86,941\n86,972\n86,1014\n86,1117\n86,1130\n86,1133\n86,1167\n86,1192\n86,1241\n86,1262\n86,1284\n86,1298\n86,1319\n86,1337\n86,1436\n86,1522\n86,1544\n86,1629\n86,1796\n86,1837\n86,1849\n86,2083\n86,2372\n86,2557\n86,2767\n86,2840\n86,2979\n86,3207\n86,3392\n86,5146\n86,5301\n86,5662\n86,6123\n86,7164\n86,7792\n86,7881\n86,8023\n86,8534\n86,10363\n86,12077\n86,15182\n86,16127\n86,16626\n86,16660\n86,16663\n86,18249\n86,19339\n86,19413\n86,19637\n86,19742\n86,19745\n86,22441\n86,23857\n86,29060\n86,32532\n86,32591\n86,32651\n86,32799\n86,34017\n86,35036\n86,38383\n86,38994\n86,40963\n86,41388\n86,42157\n86,42882\n86,45881\n86,56023\n86,57048\n86,62206\n86,62797\n86,64223\n86,65843\n86,68175\n86,68313\n86,68645\n86,70940\n86,73355\n86,77716\n86,79580\n86,81160\n86,82207\n86,89659\n86,90379\n86,90380\n86,90810\n86,91860\n86,97364\n86,98409\n86,101796\n86,102671\n86,103058\n86,116265\n86,120830\n86,128516\n86,148824\n86,155682\n86,158326\n86,175433\n86,176402\n86,176484\n86,193533\n86,234106\n86,247906\n86,255646\n86,259653\n87,10\n87,111\n87,510\n87,623\n87,685\n87,808\n87,852\n87,872\n87,919\n87,1118\n87,1240\n87,1653\n87,1860\n87,1973\n87,2253\n87,2697\n87,3507\n87,4039\n87,4760\n88,89\n90,91\n92,93\n92,94\n94,25\n94,26\n94,47\n94,59\n94,93\n94,94\n94,116\n94,147\n94,250\n94,430\n94,609\n94,885\n94,886\n94,887\n94,994\n94,1085\n94,1235\n94,1255\n94,1335\n94,1432\n94,1684\n94,1882\n94,1888\n94,2087\n94,2088\n94,2244\n94,2469\n94,2787\n94,4748\n94,6556\n94,9542\n94,16153\n94,21944\n94,39455\n94,50943\n94,89035\n95,58\n96,7\n96,97\n97,10\n97,96\n97,97\n97,147\n97,175\n97,186\n97,192\n97,217\n97,240\n97,327\n97,328\n97,397\n97,440\n97,452\n97,467\n97,485\n97,510\n97,516\n97,563\n97,640\n97,693\n97,808\n97,838\n97,841\n97,872\n97,920\n97,1014\n97,1096\n97,1118\n97,1217\n97,1417\n97,1485\n97,1796\n97,2496\n97,3009\n97,3134\n97,3144\n97,3378\n97,4337\n97,5401\n97,5420\n97,6590\n97,6790\n97,6811\n97,6904\n97,6956\n97,7087\n97,7117\n97,7796\n97,7929\n97,8144\n97,8216\n97,8520\n97,14017\n97,14287\n97,14939\n97,15351\n97,15692\n97,16374\n97,16525\n97,17348\n97,17535\n97,17942\n97,18602\n97,19487\n97,19555\n97,21394\n97,22163\n97,23104\n97,25425\n97,30460\n97,31300\n97,32402\n97,36132\n97,38342\n97,38361\n97,40116\n97,40988\n97,41252\n97,42031\n97,42776\n97,45541\n97,45618\n97,46637\n97,50571\n97,51361\n97,55023\n97,56409\n97,58297\n97,59556\n97,60885\n97,62421\n97,68075\n97,68317\n97,70518\n97,71736\n97,72555\n97,73793\n97,77836\n97,79283\n97,79555\n97,81118\n97,82974\n97,87846\n97,87852\n97,87910\n97,90704\n97,90713\n97,91008\n97,91587\n97,96633\n97,96663\n97,98178\n97,98832\n97,99661\n97,101851\n97,103125\n97,105566\n97,109945\n97,109951\n97,110719\n97,111793\n97,116055\n97,117770\n97,119977\n97,122063\n97,123849\n97,124114\n97,124339\n97,129614\n97,131277\n97,131644\n97,135258\n97,138093\n97,138152\n97,141479\n97,142388\n97,142786\n97,145137\n97,149675\n97,150471\n97,153128\n97,155079\n97,159424\n97,161193\n97,168329\n97,171137\n97,178687\n97,183832\n97,184268\n97,185944\n97,189171\n97,192978\n97,197819\n97,213521\n97,214666\n97,218122\n97,219905\n97,220851\n97,223780\n97,227904\n97,229675\n97,232734\n97,236047\n97,241713\n97,243737\n97,245558\n97,247213\n97,247738\n97,248504\n97,251595\n97,253929\n97,257201\n97,258901\n97,259788\n97,263067\n97,263150\n97,263960\n98,1\n98,99\n98,1181\n98,240174\n99,1\n99,50\n99,56\n99,79\n99,98\n99,146\n99,147\n99,149\n99,158\n99,192\n99,285\n99,333\n99,336\n99,406\n99,446\n99,505\n99,602\n99,620\n99,640\n99,779\n99,841\n99,852\n99,1011\n99,1198\n99,1218\n99,1276\n99,1425\n99,1973\n99,2374\n99,3507\n99,3895\n99,3970\n99,3997\n99,4601\n99,4685\n99,5822\n99,8070\n99,9394\n99,13221\n99,14570\n99,15192\n99,17151\n99,17280\n99,19385\n99,35577\n99,36370\n99,38834\n99,39646\n99,39652\n99,39654\n99,39659\n99,41385\n99,44344\n99,46291\n99,49553\n99,55075\n99,57820\n99,60576\n99,65809\n99,67213\n99,68069\n99,74700\n99,79768\n99,80307\n99,84689\n99,90871\n99,92476\n99,93073\n99,93331\n99,95413\n99,97286\n99,106502\n99,106987\n99,107342\n99,109367\n99,118022\n99,118224\n99,122702\n99,136603\n99,140569\n99,141823\n99,141945\n99,144849\n99,146743\n99,147458\n99,152139\n99,157417\n99,170656\n99,170693\n99,180327\n99,180487\n99,180944\n99,181806\n99,184259\n99,206263\n99,212528\n99,229958\n99,240174\n99,247337\n99,250870\n99,251497\n99,252657\n99,254963\n100,72\n101,102\n101,2416\n101,2417\n102,102\n102,518\n102,852\n102,911\n102,1113\n102,1323\n102,1326\n102,3193\n102,8054\n102,15849\n102,21970\n102,21989\n102,23079\n102,28400\n102,30386\n102,31103\n102,31989\n102,32066\n102,32067\n102,34823\n102,37717\n102,41966\n102,43085\n102,47739\n102,50723\n102,62871\n102,63049\n102,65681\n102,66502\n102,68913\n102,71872\n102,74523\n102,77643\n102,77648\n102,80951\n102,84063\n102,86651\n102,95539\n102,102531\n102,105153\n102,164292\n102,174006\n102,174401\n102,188749\n102,191379\n102,215213\n102,241180\n102,260246\n103,104\n104,24\n104,30\n104,87\n104,103\n104,104\n104,107\n104,108\n104,111\n104,116\n104,134\n104,135\n104,136\n104,137\n104,138\n104,200\n104,215\n104,217\n104,225\n104,227\n104,240\n104,248\n104,254\n104,264\n104,289\n104,290\n104,298\n104,304\n104,312\n104,323\n104,327\n104,328\n104,332\n104,364\n104,372\n104,373\n104,420\n104,502\n104,503\n104,557\n104,572\n104,588\n104,590\n104,596\n104,599\n104,609\n104,612\n104,621\n104,631\n104,632\n104,636\n104,677\n104,714\n104,715\n104,760\n104,761\n104,772\n104,797\n104,805\n104,849\n104,850\n104,851\n104,852\n104,862\n104,903\n104,943\n104,953\n104,954\n104,999\n104,1011\n104,1016\n104,1045\n104,1046\n104,1085\n104,1119\n104,1149\n104,1179\n104,1212\n104,1235\n104,1257\n104,1267\n104,1282\n104,1309\n104,1332\n104,1335\n104,1346\n104,1365\n104,1368\n104,1381\n104,1415\n104,1416\n104,1417\n104,1432\n104,1459\n104,1462\n104,1505\n104,1511\n104,1572\n104,1608\n104,1631\n104,1641\n104,1659\n104,1663\n104,1690\n104,1704\n104,1715\n104,1745\n104,1749\n104,1758\n104,1771\n104,1808\n104,1818\n104,1844\n104,1882\n104,1939\n104,1955\n104,1980\n104,2008\n104,2052\n104,2069\n104,2105\n104,2205\n104,2206\n104,2208\n104,2210\n104,2376\n104,2384\n104,2417\n104,2443\n104,2572\n104,2587\n104,2596\n104,2620\n104,2927\n104,2934\n104,2991\n104,3085\n104,3247\n104,3474\n104,3508\n104,3585\n104,3586\n104,3590\n104,3613\n104,3840\n104,3944\n104,4024\n104,4141\n104,4218\n104,4220\n104,4222\n104,4237\n104,4276\n104,4308\n104,4355\n104,4367\n104,4520\n104,4565\n104,4574\n104,4692\n104,4712\n104,4919\n104,5011\n104,5053\n104,5155\n104,5258\n104,5372\n104,5405\n104,5439\n104,5622\n104,5702\n104,5809\n104,5876\n104,5902\n104,6023\n104,6078\n104,6136\n104,6312\n104,6569\n104,6674\n104,6818\n104,6853\n104,6856\n104,7194\n104,7432\n104,7507\n104,7879\n104,8049\n104,8180\n104,8243\n104,8279\n104,8537\n104,8622\n104,8632\n104,9391\n104,9397\n104,9700\n104,9739\n104,12747\n104,13205\n104,13207\n104,13273\n104,13539\n104,13717\n104,13912\n104,13928\n104,13969\n104,14080\n104,14193\n104,14536\n104,14820\n104,14998\n104,15010\n104,15091\n104,15163\n104,15221\n104,15229\n104,15277\n104,15337\n104,15413\n104,15470\n104,15654\n104,15658\n104,15673\n104,15782\n104,16263\n104,16294\n104,16551\n104,16552\n104,16617\n104,16640\n104,16709\n104,17137\n104,17214\n104,17217\n104,17461\n104,18013\n104,18142\n104,18175\n104,18656\n104,18673\n104,18844\n104,18877\n104,18933\n104,18965\n104,19090\n104,19278\n104,19566\n104,19617\n104,19690\n104,19798\n104,20025\n104,20164\n104,20741\n104,20749\n104,20757\n104,20781\n104,20787\n104,20813\n104,20899\n104,21608\n104,21669\n104,22081\n104,22090\n104,22098\n104,22149\n104,22173\n104,22268\n104,22288\n104,22866\n104,23269\n104,23270\n104,23808\n104,24243\n104,24739\n104,24839\n104,25138\n104,25385\n104,25432\n104,25479\n104,25571\n104,26116\n104,26241\n104,26244\n104,26257\n104,26546\n104,26682\n104,26729\n104,26881\n104,27050\n104,27084\n104,27797\n104,28042\n104,28191\n104,28706\n104,28746\n104,28891\n104,28956\n104,28967\n104,29562\n104,29662\n104,30197\n104,30209\n104,30210\n104,30268\n104,30373\n104,30733\n104,30997\n104,31159\n104,31236\n104,31302\n104,31358\n104,31474\n104,31963\n104,31964\n104,32057\n104,32576\n104,32643\n104,32810\n104,32981\n104,33424\n104,33567\n104,33602\n104,34097\n104,34100\n104,34531\n104,34820\n104,34951\n104,35318\n104,35337\n104,35348\n104,35388\n104,35530\n104,35614\n104,37063\n104,37424\n104,37492\n104,37515\n104,37816\n104,38463\n104,38612\n104,38822\n104,40813\n104,41078\n104,41314\n104,41501\n104,41871\n104,43257\n104,43678\n104,43903\n104,44084\n104,44122\n104,44266\n104,44268\n104,44271\n104,44396\n104,44407\n104,44725\n104,45010\n104,45296\n104,45527\n104,45763\n104,46750\n104,46783\n104,46874\n104,48532\n104,48602\n104,48620\n104,49053\n104,49064\n104,49617\n104,50353\n104,50745\n104,51663\n104,51667\n104,51670\n104,51671\n104,52056\n104,52103\n104,52210\n104,52282\n104,54615\n104,54904\n104,55107\n104,55160\n104,55168\n104,57583\n104,57606\n104,57711\n104,57714\n104,58093\n104,59123\n104,59646\n104,59675\n104,59680\n104,59832\n104,59960\n104,59998\n104,60886\n104,62192\n104,62204\n104,62210\n104,62556\n104,63279\n104,65088\n104,65152\n104,65510\n104,65525\n104,65593\n104,65681\n104,65864\n104,65995\n104,65997\n104,66041\n104,66071\n104,66157\n104,66343\n104,66894\n104,67812\n104,68464\n104,70637\n104,70970\n104,71385\n104,71650\n104,71825\n104,71862\n104,74387\n104,74423\n104,74696\n104,76180\n104,78772\n104,78891\n104,78923\n104,79975\n104,81508\n104,81703\n104,82758\n104,83325\n104,83496\n104,83737\n104,84116\n104,84501\n104,84551\n104,85501\n104,85726\n104,85804\n104,87929\n104,88062\n104,88133\n104,88469\n104,89637\n104,89662\n104,89847\n104,90048\n104,90161\n104,91952\n104,92047\n104,92048\n104,93110\n104,94134\n104,94779\n104,96657\n104,98275\n104,99504\n104,99611\n104,101981\n104,102250\n104,102570\n104,102712\n104,103189\n104,103778\n104,104630\n104,106130\n104,107959\n104,111142\n104,111252\n104,112361\n104,112909\n104,113559\n104,113636\n104,114540\n104,115397\n104,118503\n104,118634\n104,119584\n104,121033\n104,121156\n104,121653\n104,121750\n104,121752\n104,123185\n104,123547\n104,123914\n104,124140\n104,124460\n104,125967\n104,126377\n104,126407\n104,126971\n104,126983\n104,127164\n104,127318\n104,127639\n104,128118\n104,128156\n104,128439\n104,130731\n104,130771\n104,131218\n104,131219\n104,131220\n104,131226\n104,131308\n104,132008\n104,132244\n104,132884\n104,133368\n104,133457\n104,133546\n104,136072\n104,136194\n104,138586\n104,139100\n104,139111\n104,140085\n104,140289\n104,140773\n104,141203\n104,142258\n104,142516\n104,143402\n104,143738\n104,143961\n104,145056\n104,145081\n104,145625\n104,146137\n104,146249\n104,147433\n104,148063\n104,149790\n104,149863\n104,155441\n104,156571\n104,156951\n104,158354\n104,159100\n104,159391\n104,159451\n104,159722\n104,160450\n104,160727\n104,161315\n104,161658\n104,163279\n104,164267\n104,165302\n104,166638\n104,167029\n104,167414\n104,167537\n104,167581\n104,167846\n104,168456\n104,168797\n104,168961\n104,168971\n104,169350\n104,169802\n104,169818\n104,170026\n104,170245\n104,171231\n104,171599\n104,172218\n104,172616\n104,172624\n104,173268\n104,173967\n104,174508\n104,174910\n104,175354\n104,175967\n104,176782\n104,178253\n104,178828\n104,179132\n104,180226\n104,180390\n104,181056\n104,181187\n104,181883\n104,181977\n104,182162\n104,182217\n104,182345\n104,182606\n104,183839\n104,185545\n104,185666\n104,185910\n104,185943\n104,186065\n104,187682\n104,189754\n104,190217\n104,190276\n104,191899\n104,193093\n104,194832\n104,194984\n104,195140\n104,196458\n104,198387\n104,203275\n104,203276\n104,203282\n104,203362\n104,204014\n104,207051\n104,213156\n104,214427\n104,214979\n104,215821\n104,216645\n104,217537\n104,218348\n104,218481\n104,222145\n104,222366\n104,223682\n104,223737\n104,224063\n104,225656\n104,234874\n104,237226\n104,238005\n104,238726\n104,239571\n104,241228\n104,243079\n104,243325\n104,245910\n104,247787\n104,248191\n104,249447\n104,249576\n104,251609\n104,254010\n104,254932\n104,257366\n104,259431\n104,259720\n104,260906\n104,261214\n104,263048\n104,264438\n104,265127\n105,106\n106,1\n106,37\n106,106\n106,146\n106,147\n106,149\n106,158\n106,192\n106,207\n106,287\n106,301\n106,333\n106,336\n106,337\n106,388\n106,406\n106,446\n106,505\n106,506\n106,586\n106,599\n106,640\n106,663\n106,664\n106,693\n106,698\n106,720\n106,818\n106,841\n106,874\n106,877\n106,879\n106,911\n106,1010\n106,1027\n106,1118\n106,1220\n106,1222\n106,1284\n106,1293\n106,1370\n106,1425\n106,1515\n106,1568\n106,1572\n106,1619\n106,1623\n106,1848\n106,1849\n106,1888\n106,1973\n106,1985\n106,2077\n106,2169\n106,2759\n106,2782\n106,3448\n106,3718\n106,4272\n106,4342\n106,5204\n106,6119\n106,6634\n106,6813\n106,6998\n106,7532\n106,8170\n106,8867\n106,13227\n106,13621\n106,14396\n106,20557\n106,21202\n106,21268\n106,23147\n106,24242\n106,24566\n106,24659\n106,25309\n106,26034\n106,28794\n106,28795\n106,29578\n106,29760\n106,30518\n106,30713\n106,30887\n106,34247\n106,34773\n106,36602\n106,37530\n106,39549\n106,40440\n106,41288\n106,41723\n106,42787\n106,43005\n106,50280\n106,50281\n106,50398\n106,53032\n106,53726\n106,54434\n106,55440\n106,56298\n106,56896\n106,59021\n106,60352\n106,60576\n106,60701\n106,62589\n106,64200\n106,64865\n106,65844\n106,67164\n106,71802\n106,72575\n106,75783\n106,79752\n106,84519\n106,87282\n106,87285\n106,87976\n106,92476\n106,93515\n106,94037\n106,100060\n106,102560\n106,103447\n106,110506\n106,115961\n106,119502\n106,122159\n106,122606\n106,123860\n106,123890\n106,125539\n106,130180\n106,131031\n106,131267\n106,139522\n106,145003\n106,146800\n106,150038\n106,157007\n106,157382\n106,158590\n106,168463\n106,168465\n106,173297\n106,176964\n106,182491\n106,182745\n106,182903\n106,183481\n106,186657\n106,187065\n106,189303\n106,190492\n106,214152\n106,216518\n106,227954\n106,237274\n106,237280\n106,238773\n106,247056\n106,249816\n106,252320\n106,259125\n106,264510\n107,10\n107,104\n107,107\n107,108\n107,111\n107,112\n107,175\n107,182\n107,292\n107,338\n107,364\n107,441\n107,442\n107,462\n107,502\n107,503\n107,557\n107,586\n107,609\n107,626\n107,660\n107,682\n107,685\n107,693\n107,715\n107,745\n107,749\n107,795\n107,801\n107,849\n107,1015\n107,1146\n107,1238\n107,1368\n107,1388\n107,1572\n107,1584\n107,1652\n107,1677\n107,1722\n107,1738\n107,1844\n107,1939\n107,2237\n107,2315\n107,2395\n107,2451\n107,2646\n107,2678\n107,2802\n107,2874\n107,3538\n107,3830\n107,3856\n107,3951\n107,4039\n107,4520\n107,4771\n107,4781\n107,4783\n107,4839\n107,5423\n107,5574\n107,6139\n107,6398\n107,6569\n107,6792\n107,7074\n107,7087\n107,7348\n107,7486\n107,7731\n107,8180\n107,8557\n107,9303\n107,13506\n107,14193\n107,15331\n107,15447\n107,15513\n107,16306\n107,17315\n107,18632\n107,18933\n107,20612\n107,21330\n107,23126\n107,23468\n107,23609\n107,23817\n107,24760\n107,24834\n107,25529\n107,25728\n107,26097\n107,28244\n107,29312\n107,29907\n107,30493\n107,32740\n107,35335\n107,35614\n107,36279\n107,37414\n107,38856\n107,41824\n107,43647\n107,45744\n107,50553\n107,50846\n107,53333\n107,55989\n107,56288\n107,56358\n107,56463\n107,57211\n107,57872\n107,58918\n107,62349\n107,62351\n107,63132\n107,63494\n107,63802\n107,64514\n107,64603\n107,69423\n107,72439\n107,73337\n107,75319\n107,77588\n107,78663\n107,79541\n107,80474\n107,80797\n107,81453\n107,81546\n107,82244\n107,88273\n107,89915\n107,97506\n107,104590\n107,111279\n107,111367\n107,113500\n107,114415\n107,114575\n107,118678\n107,120855\n107,121002\n107,121125\n107,121187\n107,124448\n107,125331\n107,126201\n107,126393\n107,128728\n107,130357\n107,130513\n107,132232\n107,135257\n107,137182\n107,138491\n107,139385\n107,140928\n107,141125\n107,142519\n107,142770\n107,144902\n107,144917\n107,147355\n107,147492\n107,148425\n107,150358\n107,151040\n107,152184\n107,158642\n107,162741\n107,164052\n107,168830\n107,169882\n107,170204\n107,170604\n107,171090\n107,172701\n107,175221\n107,176994\n107,180990\n107,181248\n107,181250\n107,181251\n107,181252\n107,181732\n107,182430\n107,184832\n107,185002\n107,185523\n107,189827\n107,190341\n107,192643\n107,211977\n107,212462\n107,217246\n107,217374\n107,218124\n107,219220\n107,220452\n107,221062\n107,228709\n107,230610\n107,239475\n107,243702\n107,244938\n107,247882\n107,248721\n107,249055\n107,250832\n107,251998\n107,256475\n107,258942\n107,259514\n107,261484\n107,263183\n107,263256\n108,104\n108,107\n108,111\n108,248\n108,760\n108,1149\n108,1631\n108,2867\n108,22880\n109,109\n109,110\n109,257\n109,366\n109,500\n109,718\n109,1063\n109,1518\n109,1623\n109,1847\n109,2004\n109,2592\n109,2593\n109,2597\n109,2598\n109,2601\n109,2602\n109,2606\n109,4003\n109,4275\n109,4375\n109,4446\n109,4871\n109,5174\n109,5351\n109,5401\n109,5462\n109,5467\n109,5851\n109,6547\n109,6614\n109,6858\n109,7417\n109,7739\n109,7766\n109,8069\n109,9093\n109,13854\n109,14457\n109,14647\n109,14817\n109,15560\n109,16227\n109,16228\n109,16301\n109,16324\n109,16361\n109,16425\n109,17922\n109,18984\n109,19012\n109,19029\n109,19030\n109,19537\n109,19847\n109,20403\n109,20431\n109,21158\n109,21920\n109,22296\n109,23461\n109,25388\n109,25996\n109,27065\n109,28158\n109,28220\n109,28851\n109,28983\n109,31432\n109,32279\n109,32293\n109,33375\n109,35501\n109,35537\n109,35567\n109,36565\n109,36807\n109,36860\n109,37369\n109,38194\n109,38853\n109,40035\n109,43429\n109,43666\n109,43714\n109,43752\n109,43753\n109,51257\n109,54645\n109,55046\n109,55047\n109,55049\n109,55182\n109,55183\n109,55470\n109,61913\n109,61982\n109,61983\n109,61984\n109,63628\n109,66479\n109,66501\n109,67267\n109,70014\n109,70016\n109,70017\n109,70018\n109,70435\n109,75088\n109,75883\n109,76313\n109,78682\n109,78683\n109,78684\n109,78739\n109,78740\n109,80383\n109,80387\n109,81117\n109,81997\n109,81998\n109,81999\n109,82253\n109,82652\n109,82894\n109,82895\n109,82896\n109,83205\n109,84487\n109,84488\n109,85821\n109,85822\n109,85875\n109,85888\n109,89146\n109,92386\n109,96590\n109,97672\n109,101085\n109,101958\n109,101964\n109,104338\n109,104637\n109,105002\n109,105651\n109,111820\n109,128662\n109,129212\n109,129213\n109,129214\n109,129215\n109,129216\n109,130535\n109,135947\n109,135948\n109,135949\n109,136027\n109,137031\n109,141850\n109,141851\n109,141892\n109,141974\n109,142530\n109,142761\n109,142762\n109,147566\n109,151995\n109,153446\n109,154850\n109,159439\n109,159783\n109,159784\n109,159940\n109,159941\n109,159942\n109,159943\n109,159944\n109,160340\n109,162565\n109,162567\n109,163103\n109,164977\n109,164978\n109,166690\n109,169327\n109,171335\n109,172138\n109,172471\n109,172472\n109,173189\n109,173463\n109,175020\n109,175021\n109,175029\n109,175191\n109,176318\n109,176408\n109,176751\n109,182308\n109,182656\n109,182657\n109,182658\n109,183848\n109,183924\n109,184939\n109,185278\n109,185366\n109,185367\n109,185368\n109,185369\n109,185691\n109,187029\n109,187193\n109,190297\n109,191268\n109,191331\n109,191476\n109,191829\n109,192936\n109,192937\n109,193940\n109,212177\n109,212178\n109,214052\n109,215794\n109,217900\n109,219172\n109,219281\n109,219282\n109,219291\n109,219294\n109,220046\n109,220047\n109,220383\n109,220441\n109,220446\n111,111\n113,26\n113,114\n113,115\n113,116\n113,117\n113,118\n113,430\n113,885\n113,994\n113,2087\n113,13704\n113,21944\n113,54870\n113,67397\n114,26\n114,59\n114,994\n115,115\n115,118\n116,26\n116,59\n116,114\n116,116\n116,117\n116,135\n116,138\n116,430\n116,588\n116,590\n116,885\n116,994\n116,1204\n116,1235\n116,1335\n116,2087\n116,2674\n116,2712\n116,13704\n116,16153\n116,21944\n118,4\n118,5\n118,94\n118,115\n118,116\n118,118\n118,330\n118,430\n118,886\n118,994\n118,1235\n118,1335\n118,2087\n118,2787\n118,3795\n118,3796\n118,3816\n118,3817\n118,4597\n118,39455\n118,260833\n119,872\n119,1063\n119,4139\n119,13199\n119,17273\n119,21678\n119,23424\n119,24360\n119,30745\n119,31591\n119,35079\n119,38117\n119,38430\n119,39475\n119,39554\n119,40252\n119,45299\n119,76642\n119,101953\n119,119158\n119,127144\n119,132935\n119,148485\n120,34\n120,35\n120,85\n120,119\n120,120\n120,217\n120,240\n120,261\n120,332\n120,372\n120,503\n120,588\n120,590\n120,694\n120,728\n120,814\n120,818\n120,838\n120,918\n120,949\n120,978\n120,1011\n120,1118\n120,1203\n120,1353\n120,1417\n120,1419\n120,1466\n120,1505\n120,1608\n120,1808\n120,1879\n120,2511\n120,2512\n120,2619\n120,2797\n120,2812\n120,2824\n120,2989\n120,2991\n120,3115\n120,3319\n120,3504\n120,3955\n120,4109\n120,4132\n120,4137\n120,4194\n120,4377\n120,4486\n120,4549\n120,4752\n120,5223\n120,5294\n120,5331\n120,5346\n120,5451\n120,5702\n120,6773\n120,6853\n120,6856\n120,7041\n120,7087\n120,7196\n120,7221\n120,7266\n120,7944\n120,8156\n120,9005\n120,9021\n120,9463\n120,11147\n120,13251\n120,13328\n120,13334\n120,13549\n120,13664\n120,14126\n120,14358\n120,14820\n120,15283\n120,15339\n120,15397\n120,15562\n120,15574\n120,15580\n120,15604\n120,15653\n120,15673\n120,15693\n120,15732\n120,15741\n120,15767\n120,15799\n120,15931\n120,16505\n120,16661\n120,17297\n120,18142\n120,18387\n120,18586\n120,18606\n120,18641\n120,19415\n120,19528\n120,19561\n120,19622\n120,19660\n120,19857\n120,20284\n120,20525\n120,20535\n120,20540\n120,20603\n120,20686\n120,20747\n120,22029\n120,22233\n120,22279\n120,22939\n120,23625\n120,23634\n120,23683\n120,24360\n120,26242\n120,26441\n120,27041\n120,28338\n120,28844\n120,28857\n120,29038\n120,29741\n120,31517\n120,31729\n120,31737\n120,32288\n120,32688\n120,32824\n120,32854\n120,33519\n120,34112\n120,34380\n120,35021\n120,35464\n120,35546\n120,36483\n120,36813\n120,37857\n120,37895\n120,38111\n120,38318\n120,38974\n120,40025\n120,40699\n120,40828\n120,41124\n120,41169\n120,41951\n120,42070\n120,42454\n120,42762\n120,43223\n120,43341\n120,44256\n120,45079\n120,46321\n120,46391\n120,46799\n120,46918\n120,47247\n120,48177\n120,48299\n120,48372\n120,48437\n120,48478\n120,48620\n120,48639\n120,48892\n120,49104\n120,49570\n120,49647\n120,49653\n120,49655\n120,49685\n120,49691\n120,49695\n120,50209\n120,50440\n120,51206\n120,51211\n120,51465\n120,51503\n120,51505\n120,53495\n120,53623\n120,54571\n120,55672\n120,55681\n120,55924\n120,56346\n120,59211\n120,59245\n120,61211\n120,61411\n120,61943\n120,62262\n120,63179\n120,63244\n120,66468\n120,67266\n120,72100\n120,72701\n120,74533\n120,78951\n120,79533\n120,80488\n120,82162\n120,82169\n120,83927\n120,84677\n120,85859\n120,96782\n120,98788\n120,99387\n120,99878\n120,102273\n120,104536\n120,109819\n120,116590\n120,118425\n120,118459\n120,119102\n120,119625\n120,120508\n120,120526\n120,123007\n120,123960\n120,124822\n120,125133\n120,125445\n120,126049\n120,130275\n120,130866\n120,131034\n120,131043\n120,131216\n120,131224\n120,132973\n120,133113\n120,133440\n120,135270\n120,135285\n120,136482\n120,136483\n120,136484\n120,136485\n120,136486\n120,136487\n120,136488\n120,136489\n120,136490\n120,136491\n120,136492\n120,136493\n120,136494\n120,136495\n120,136496\n120,136497\n120,136498\n120,136499\n120,136500\n120,136501\n120,136502\n120,136503\n120,136504\n120,136505\n120,136506\n120,136507\n120,136508\n120,136509\n120,136510\n120,136617\n120,137791\n120,138035\n120,139587\n120,142088\n120,142883\n120,143282\n120,143413\n120,144072\n120,144375\n120,146410\n120,154154\n120,155520\n120,157303\n120,159495\n120,159690\n120,161191\n120,167130\n120,170647\n120,172784\n120,174548\n120,174584\n120,174585\n120,174588\n120,174608\n120,174609\n120,174610\n120,174611\n120,174612\n120,175380\n120,175390\n120,176926\n120,177312\n120,178805\n120,179129\n120,179155\n120,179158\n120,179161\n120,179162\n120,179195\n120,179204\n120,179206\n120,179210\n120,179211\n120,179213\n120,179351\n120,179362\n120,179367\n120,179371\n120,179372\n120,179722\n120,180095\n120,180346\n120,180616\n120,182308\n120,183860\n120,184020\n120,184908\n120,185653\n120,187527\n120,194481\n120,194586\n120,198253\n120,202348\n120,202462\n120,204022\n120,204041\n120,205903\n120,206457\n120,207126\n120,208036\n120,211967\n120,212426\n120,213051\n120,216204\n120,217087\n120,218013\n120,218406\n120,218468\n120,219794\n120,219903\n120,220551\n120,221165\n120,222127\n120,223690\n120,224281\n120,224567\n120,228497\n120,230436\n120,230496\n120,231090\n120,231309\n120,232056\n120,232274\n120,233700\n120,234933\n120,240396\n120,241317\n120,242376\n120,242384\n120,243627\n120,244021\n120,244070\n120,247355\n120,250584\n120,252078\n120,252648\n120,252895\n120,253260\n120,257256\n120,257662\n120,258108\n120,258862\n120,261825\n120,263110\n121,122\n123,102\n123,2416\n123,2417\n124,10\n124,113156\n125,126\n126,20\n126,66\n126,68\n126,125\n126,126\n126,158\n126,207\n126,259\n126,301\n126,336\n126,366\n126,397\n126,441\n126,452\n126,457\n126,505\n126,509\n126,510\n126,535\n126,604\n126,676\n126,849\n126,852\n126,868\n126,872\n126,911\n126,918\n126,972\n126,1011\n126,1014\n126,1118\n126,1135\n126,1147\n126,1151\n126,1204\n126,1267\n126,1293\n126,1298\n126,1370\n126,1402\n126,1417\n126,1453\n126,1566\n126,1619\n126,1655\n126,1663\n126,1796\n126,1844\n126,1893\n126,1949\n126,2373\n126,2511\n126,2520\n126,3182\n126,3392\n126,3524\n126,3999\n126,4165\n126,4276\n126,4514\n126,4769\n126,5851\n126,6801\n126,6824\n126,7530\n126,8055\n126,14196\n126,14652\n126,16201\n126,17551\n126,18583\n126,20071\n126,20757\n126,22214\n126,25532\n126,28340\n126,29154\n126,29757\n126,31280\n126,33326\n126,33672\n126,34320\n126,35006\n126,35543\n126,38259\n126,38261\n126,38273\n126,42928\n126,48799\n126,55298\n126,62428\n126,63095\n126,64715\n126,68887\n126,70044\n126,70395\n126,74122\n126,75295\n126,76802\n126,76815\n126,80425\n126,81233\n126,84719\n126,88389\n126,89035\n126,94175\n126,94249\n126,94741\n126,98181\n126,99916\n126,103934\n126,109434\n126,122620\n126,122623\n126,137819\n126,141846\n126,142362\n126,144932\n126,146311\n126,146757\n126,158950\n126,160834\n126,163802\n126,163884\n126,168823\n126,168886\n126,170610\n126,170947\n126,172628\n126,173295\n126,174408\n126,175245\n126,175326\n126,177015\n126,178701\n126,181932\n126,190566\n126,207659\n126,214734\n126,241534\n126,263881\n127,22\n128,1\n129,130\n130,48\n130,87\n130,130\n130,135\n130,431\n130,676\n130,808\n130,843\n130,919\n130,1192\n130,1860\n130,3538\n130,6824\n130,7768\n130,60576\n131,30\n131,328\n131,1179\n131,1305\n132,4\n132,5\n133,104\n133,134\n133,135\n133,136\n133,137\n133,138\n133,1368\n133,2105\n134,30\n134,40\n134,104\n134,134\n134,135\n134,136\n134,137\n134,138\n134,175\n134,200\n134,225\n134,233\n134,248\n134,254\n134,298\n134,327\n134,328\n134,332\n134,364\n134,372\n134,373\n134,431\n134,446\n134,502\n134,557\n134,590\n134,636\n134,677\n134,685\n134,693\n134,714\n134,715\n134,772\n134,800\n134,805\n134,850\n134,953\n134,1001\n134,1011\n134,1119\n134,1179\n134,1212\n134,1282\n134,1332\n134,1359\n134,1368\n134,1415\n134,1432\n134,1459\n134,1844\n134,1882\n134,1939\n134,2105\n134,2208\n134,2209\n134,2210\n134,2237\n134,2376\n134,3032\n134,3135\n134,3246\n134,3247\n134,3508\n134,3535\n134,3672\n134,3840\n134,3944\n134,4237\n134,4276\n134,4355\n134,4367\n134,4524\n134,4919\n134,5011\n134,5405\n134,5439\n134,5573\n134,6668\n134,6828\n134,6881\n134,6908\n134,7124\n134,7270\n134,7879\n134,8049\n134,8133\n134,8275\n134,8285\n134,8414\n134,8994\n134,9739\n134,9790\n134,11346\n134,13207\n134,13356\n134,13408\n134,14597\n134,15292\n134,15337\n134,15470\n134,15721\n134,16361\n134,16382\n134,17076\n134,17461\n134,18515\n134,18965\n134,19798\n134,20164\n134,20781\n134,21533\n134,21591\n134,22169\n134,22288\n134,23452\n134,24243\n134,24781\n134,24791\n134,26682\n134,26729\n134,28112\n134,28191\n134,28442\n134,28787\n134,29595\n134,30201\n134,30210\n134,30268\n134,30373\n134,30733\n134,31159\n134,31963\n134,32057\n134,32478\n134,34920\n134,34951\n134,36939\n134,36954\n134,37612\n134,37651\n134,40169\n134,41314\n134,43394\n134,45763\n134,47805\n134,48188\n134,49035\n134,50745\n134,52150\n134,52202\n134,52282\n134,54587\n134,54904\n134,55808\n134,56454\n134,56537\n134,56968\n134,57604\n134,59006\n134,59154\n134,59208\n134,59832\n134,60506\n134,60886\n134,62087\n134,62192\n134,62419\n134,63728\n134,63741\n134,65864\n134,66637\n134,67812\n134,70637\n134,71093\n134,71123\n134,72021\n134,72639\n134,72796\n134,73745\n134,73938\n134,74423\n134,74942\n134,75187\n134,78772\n134,79020\n134,79320\n134,79524\n134,79723\n134,80272\n134,80725\n134,80899\n134,81102\n134,82125\n134,82375\n134,83135\n134,83496\n134,83899\n134,84518\n134,87451\n134,89662\n134,90468\n134,93597\n134,95520\n134,96589\n134,96794\n134,98113\n134,99611\n134,101851\n134,106130\n134,106171\n134,107959\n134,107987\n134,108002\n134,110043\n134,114508\n134,116613\n134,117589\n134,118359\n134,118968\n134,119987\n134,123899\n134,124460\n134,125476\n134,128234\n134,129534\n134,129608\n134,129957\n134,130731\n134,131216\n134,131381\n134,131993\n134,132040\n134,132884\n134,132921\n134,133316\n134,133833\n134,135096\n134,135984\n134,136278\n134,137069\n134,139250\n134,139522\n134,139710\n134,140072\n134,142808\n134,143646\n134,144726\n134,145092\n134,146218\n134,146563\n134,147891\n134,148265\n134,150312\n134,152138\n134,154179\n134,154375\n134,154795\n134,156118\n134,156127\n134,156132\n134,157332\n134,163891\n134,164502\n134,165097\n134,166290\n134,167344\n134,167688\n134,169011\n134,169314\n134,170233\n134,171104\n134,171175\n134,171258\n134,171722\n134,171736\n134,172703\n134,172713\n134,173827\n134,176599\n134,179777\n134,180954\n134,182345\n134,183299\n134,187851\n134,190239\n134,191241\n134,193936\n134,194711\n134,200655\n134,200660\n134,201016\n134,201718\n134,201946\n134,202182\n134,203076\n134,205627\n134,207051\n134,207454\n134,207659\n134,217537\n134,217836\n134,219141\n134,223686\n134,226416\n134,227565\n134,236060\n134,238220\n134,243418\n134,243491\n134,247642\n134,250984\n134,254706\n134,257287\n134,262203\n135,19\n135,30\n135,54\n135,104\n135,116\n135,130\n135,134\n135,135\n135,136\n135,137\n135,138\n135,144\n135,200\n135,225\n135,248\n135,298\n135,304\n135,327\n135,328\n135,364\n135,372\n135,373\n135,431\n135,455\n135,557\n135,631\n135,636\n135,660\n135,693\n135,715\n135,784\n135,932\n135,943\n135,953\n135,954\n135,1011\n135,1052\n135,1118\n135,1282\n135,1305\n135,1332\n135,1368\n135,1415\n135,1684\n135,1843\n135,1882\n135,1973\n135,2105\n135,2159\n135,2210\n135,2224\n135,2253\n135,2286\n135,2315\n135,2424\n135,2646\n135,2775\n135,2944\n135,3504\n135,3565\n135,3613\n135,4024\n135,4086\n135,4237\n135,4276\n135,4799\n135,5405\n135,5439\n135,5467\n135,5541\n135,5573\n135,6011\n135,6324\n135,7457\n135,7460\n135,7757\n135,7768\n135,7879\n135,7979\n135,8049\n135,8279\n135,8424\n135,8483\n135,8835\n135,9471\n135,13207\n135,13538\n135,13700\n135,13928\n135,13949\n135,15010\n135,15163\n135,15470\n135,16103\n135,16309\n135,17346\n135,18837\n135,18860\n135,18885\n135,18934\n135,19559\n135,20110\n135,20164\n135,20173\n135,21111\n135,21254\n135,21436\n135,22417\n135,23420\n135,24243\n135,24251\n135,24635\n135,24839\n135,26682\n135,26748\n135,26923\n135,28747\n135,28758\n135,29098\n135,29572\n135,30209\n135,30210\n135,31236\n135,31963\n135,33567\n135,34032\n135,34130\n135,40922\n135,44185\n135,45751\n135,48188\n135,49035\n135,50440\n135,50675\n135,50745\n135,58940\n135,59043\n135,60886\n135,63279\n135,63639\n135,65152\n135,65864\n135,66157\n135,67812\n135,70292\n135,71770\n135,74717\n135,76180\n135,78772\n135,79314\n135,79966\n135,87892\n135,102377\n135,107959\n135,110527\n135,111269\n135,111420\n135,112533\n135,115036\n135,116041\n135,117415\n135,118359\n135,131308\n135,132884\n135,136072\n135,137170\n135,138586\n135,140176\n135,145605\n135,149863\n135,151500\n135,157332\n135,157957\n135,158872\n135,159777\n135,160928\n135,162633\n135,162944\n135,163279\n135,163504\n135,169506\n135,171726\n135,172218\n135,172704\n135,172792\n135,172894\n135,180026\n135,185910\n135,185919\n135,194141\n135,197076\n135,197371\n135,198254\n135,199231\n135,200912\n135,200921\n135,203189\n135,208029\n135,219113\n135,219114\n135,220537\n135,222061\n135,222064\n135,227599\n135,228519\n135,232999\n135,237226\n135,237654\n135,246172\n135,246518\n135,246919\n135,251047\n135,251958\n135,253201\n135,260436\n135,261443\n135,262365\n135,262636\n135,263019\n136,104\n136,134\n136,135\n136,136\n136,137\n136,138\n136,442\n136,446\n136,557\n136,966\n136,1282\n136,1332\n136,1368\n136,1939\n136,2105\n136,4024\n136,4086\n136,4276\n136,4355\n136,5405\n136,7921\n136,15314\n136,15782\n136,16552\n136,22836\n136,25787\n136,31980\n136,32778\n136,35131\n136,41357\n136,52401\n136,52958\n136,55826\n136,58964\n136,60704\n136,65864\n136,66541\n136,68113\n136,69461\n136,69762\n136,71777\n136,77663\n136,77708\n136,78772\n136,78934\n136,82873\n136,83392\n136,86551\n136,90807\n136,90936\n136,91044\n136,91274\n136,91900\n136,92371\n136,92422\n136,103093\n136,106515\n136,109339\n136,112083\n136,112617\n136,118976\n136,123547\n136,128283\n136,131308\n136,131800\n136,132909\n136,133078\n136,134270\n136,142344\n136,144105\n136,151402\n136,160433\n136,162994\n136,164931\n136,165042\n136,165261\n136,165698\n136,165731\n136,165766\n136,165771\n136,165949\n136,165962\n136,167693\n136,173545\n136,173818\n136,176773\n136,177258\n136,181778\n136,190276\n136,191380\n136,251858\n137,30\n137,104\n137,133\n137,134\n137,135\n137,136\n137,137\n137,138\n137,200\n137,225\n137,294\n137,431\n137,446\n137,557\n137,573\n137,636\n137,772\n137,817\n137,850\n137,865\n137,866\n137,1011\n137,1282\n137,1368\n137,1415\n137,1432\n137,1564\n137,1648\n137,1882\n137,1939\n137,2095\n137,2105\n137,2156\n137,2596\n137,2874\n137,3246\n137,3247\n137,3486\n137,3504\n137,3590\n137,3613\n137,4024\n137,4086\n137,4276\n137,4919\n137,5405\n137,5573\n137,6023\n137,6448\n137,7182\n137,7879\n137,8243\n137,8576\n137,9343\n137,13207\n137,13359\n137,13434\n137,13928\n137,13969\n137,15369\n137,15470\n137,15559\n137,16263\n137,16516\n137,16966\n137,18625\n137,18731\n137,22301\n137,22836\n137,23270\n137,24521\n137,24618\n137,25496\n137,26136\n137,26682\n137,26729\n137,27796\n137,28042\n137,28191\n137,28747\n137,29020\n137,29131\n137,29560\n137,29561\n137,29562\n137,29563\n137,29564\n137,29565\n137,29566\n137,29661\n137,30373\n137,30691\n137,35413\n137,38107\n137,40551\n137,40841\n137,41357\n137,43727\n137,45751\n137,45763\n137,48188\n137,50745\n137,52357\n137,52358\n137,52499\n137,54398\n137,58093\n137,60704\n137,60886\n137,62210\n137,65558\n137,65562\n137,65864\n137,67254\n137,68113\n137,68819\n137,71385\n137,71777\n137,73745\n137,76704\n137,78772\n137,79314\n137,85814\n137,89724\n137,89730\n137,89909\n137,90118\n137,90936\n137,91274\n137,91389\n137,96720\n137,97112\n137,97903\n137,99611\n137,102505\n137,102712\n137,103730\n137,105650\n137,107416\n137,108101\n137,111424\n137,112346\n137,114000\n137,114361\n137,115025\n137,116041\n137,116881\n137,117896\n137,117956\n137,118690\n137,119255\n137,119444\n137,119627\n137,121695\n137,124460\n137,127070\n137,131188\n137,131892\n137,132509\n137,132564\n137,133016\n137,135603\n137,135722\n137,136576\n137,139519\n137,139648\n137,140317\n137,140773\n137,140879\n137,141546\n137,141775\n137,141853\n137,142335\n137,142343\n137,142497\n137,143526\n137,145840\n137,147310\n137,147881\n137,150811\n137,154785\n137,155432\n137,156748\n137,156753\n137,162994\n137,164336\n137,164392\n137,164931\n137,165688\n137,167439\n137,167477\n137,170594\n137,170768\n137,171557\n137,172894\n137,174706\n137,175465\n137,175975\n137,176055\n137,176261\n137,176290\n137,176317\n137,176826\n137,177283\n137,178373\n137,179167\n137,182162\n137,183703\n137,186994\n137,190276\n137,191072\n137,192977\n137,193384\n137,195013\n137,196684\n137,197571\n137,197576\n137,197726\n137,198680\n137,198759\n137,198816\n137,198872\n137,204978\n137,205627\n137,206820\n137,207412\n137,207454\n137,214250\n137,214564\n137,216551\n137,222307\n137,222592\n137,225203\n137,228052\n137,230322\n137,235583\n137,249820\n137,250519\n137,251186\n137,251245\n137,254256\n137,255449\n137,260128\n137,263810\n138,26\n138,30\n138,59\n138,81\n138,104\n138,116\n138,134\n138,135\n138,136\n138,137\n138,138\n138,200\n138,220\n138,225\n138,248\n138,304\n138,338\n138,364\n138,557\n138,609\n138,636\n138,715\n138,734\n138,784\n138,792\n138,943\n138,1011\n138,1212\n138,1235\n138,1242\n138,1332\n138,1368\n138,1432\n138,1663\n138,1844\n138,1882\n138,1939\n138,2087\n138,2105\n138,2205\n138,2206\n138,2253\n138,2384\n138,2679\n138,2720\n138,2775\n138,2939\n138,3794\n138,3820\n138,3840\n138,4114\n138,4276\n138,4919\n138,6661\n138,7303\n138,7879\n138,8049\n138,13207\n138,13912\n138,13928\n138,13969\n138,14209\n138,14224\n138,15091\n138,15470\n138,15782\n138,16103\n138,16153\n138,16263\n138,16551\n138,16966\n138,17461\n138,18837\n138,18933\n138,20741\n138,22643\n138,24635\n138,24747\n138,26181\n138,26347\n138,26729\n138,27396\n138,28042\n138,28322\n138,29566\n138,29572\n138,29733\n138,30471\n138,30997\n138,31159\n138,31684\n138,33424\n138,33840\n138,33895\n138,37157\n138,38245\n138,39486\n138,40169\n138,40922\n138,41023\n138,42390\n138,43983\n138,45763\n138,46874\n138,47095\n138,48188\n138,48450\n138,58587\n138,63939\n138,65864\n138,66276\n138,70637\n138,71385\n138,71770\n138,72765\n138,74423\n138,76704\n138,78772\n138,78923\n138,79314\n138,79524\n138,79616\n138,84476\n138,89662\n138,93920\n138,106721\n138,109505\n138,109688\n138,112489\n138,119242\n138,119653\n138,120155\n138,124333\n138,124460\n138,125353\n138,131374\n138,133553\n138,135909\n138,136265\n138,136397\n138,138577\n138,140030\n138,140317\n138,140773\n138,143401\n138,143526\n138,144713\n138,149266\n138,155460\n138,159072\n138,165128\n138,165434\n138,165755\n138,169802\n138,170609\n138,172894\n138,173264\n138,174841\n138,178980\n138,179054\n138,182606\n138,183299\n138,183703\n138,185239\n138,185306\n138,185910\n138,186052\n138,192943\n138,192977\n138,194337\n138,195070\n138,195086\n138,198617\n138,201710\n138,202036\n138,205627\n138,214802\n138,233484\n138,244332\n138,245162\n138,252526\n138,254319\n138,259280\n138,261902\n138,263589\n139,41\n139,140\n139,609\n139,1132\n139,1608\n139,240174\n140,10\n140,140\n140,292\n140,314\n140,509\n140,510\n140,599\n140,794\n140,809\n140,838\n140,1014\n140,1293\n140,1844\n140,2253\n140,3507\n140,43613\n141,10\n142,143\n143,5\n143,143\n143,165\n143,430\n143,3118\n143,3530\n143,5207\n143,5389\n143,5763\n143,7285\n143,8669\n143,8671\n143,8690\n143,8716\n143,9119\n143,9411\n143,9480\n143,9484\n143,9490\n143,13249\n143,14981\n143,15896\n143,16004\n143,17982\n143,25740\n143,26381\n143,27980\n143,28168\n143,28515\n143,28566\n144,135\n145,146\n146,1\n146,10\n146,44\n146,50\n146,56\n146,63\n146,99\n146,106\n146,146\n146,147\n146,149\n146,158\n146,175\n146,192\n146,195\n146,206\n146,285\n146,333\n146,336\n146,406\n146,422\n146,446\n146,505\n146,602\n146,620\n146,622\n146,640\n146,647\n146,663\n146,664\n146,685\n146,693\n146,733\n146,779\n146,841\n146,1011\n146,1163\n146,1181\n146,1331\n146,1370\n146,1425\n146,1458\n146,1502\n146,1515\n146,1619\n146,1623\n146,1825\n146,1848\n146,2244\n146,2539\n146,2782\n146,2874\n146,2903\n146,3370\n146,3513\n146,3895\n146,4066\n146,4353\n146,4617\n146,5307\n146,5356\n146,5401\n146,5424\n146,6119\n146,6883\n146,7006\n146,7087\n146,8031\n146,8971\n146,13197\n146,13286\n146,13636\n146,14453\n146,15229\n146,15304\n146,15332\n146,16019\n146,18997\n146,20494\n146,21442\n146,23000\n146,26172\n146,26321\n146,26450\n146,27145\n146,28927\n146,29703\n146,30331\n146,30557\n146,33287\n146,35549\n146,40021\n146,43175\n146,44806\n146,45759\n146,46337\n146,50422\n146,56567\n146,60526\n146,60576\n146,62530\n146,65809\n146,66534\n146,68932\n146,70939\n146,71662\n146,74700\n146,76058\n146,82739\n146,83306\n146,86083\n146,88867\n146,92476\n146,92535\n146,99101\n146,105739\n146,106306\n146,106502\n146,109367\n146,110229\n146,112335\n146,112380\n146,112958\n146,112980\n146,113412\n146,113485\n146,113843\n146,116202\n146,117771\n146,118224\n146,118336\n146,118353\n146,119629\n146,121954\n146,122441\n146,122608\n146,122974\n146,126752\n146,131430\n146,137143\n146,138815\n146,141912\n146,148791\n146,149317\n146,150539\n146,150555\n146,153650\n146,156404\n146,168245\n146,169549\n146,176558\n146,178673\n146,179147\n146,180376\n146,186194\n146,195228\n146,198194\n146,202140\n146,204124\n146,220045\n146,222432\n146,223890\n146,228296\n146,228327\n146,238166\n146,239897\n146,240090\n146,241161\n146,241218\n146,247337\n146,247391\n146,247393\n146,249772\n146,252757\n146,263264\n147,1\n147,10\n147,50\n147,55\n147,56\n147,65\n147,83\n147,94\n147,97\n147,99\n147,106\n147,146\n147,147\n147,148\n147,149\n147,158\n147,171\n147,175\n147,184\n147,192\n147,195\n147,206\n147,211\n147,238\n147,285\n147,314\n147,333\n147,336\n147,406\n147,422\n147,425\n147,505\n147,602\n147,606\n147,620\n147,622\n147,628\n147,638\n147,640\n147,664\n147,682\n147,779\n147,841\n147,852\n147,859\n147,868\n147,920\n147,947\n147,957\n147,1011\n147,1089\n147,1118\n147,1181\n147,1189\n147,1262\n147,1276\n147,1293\n147,1328\n147,1366\n147,1417\n147,1425\n147,1458\n147,1464\n147,1497\n147,1515\n147,1517\n147,1518\n147,1521\n147,1546\n147,1566\n147,1619\n147,1623\n147,1696\n147,1729\n147,1776\n147,1786\n147,1803\n147,1815\n147,1825\n147,1833\n147,1844\n147,1877\n147,1921\n147,2032\n147,2132\n147,2231\n147,2244\n147,2374\n147,2400\n147,2451\n147,2528\n147,2552\n147,2571\n147,2609\n147,2741\n147,2772\n147,2792\n147,2867\n147,2875\n147,2903\n147,3070\n147,3199\n147,3449\n147,3539\n147,3571\n147,3895\n147,4060\n147,4103\n147,4114\n147,4164\n147,4391\n147,4468\n147,4627\n147,5048\n147,5357\n147,5360\n147,5401\n147,5521\n147,5592\n147,5666\n147,5726\n147,5864\n147,5874\n147,5916\n147,5972\n147,5981\n147,6268\n147,6557\n147,6635\n147,6863\n147,7862\n147,7909\n147,7970\n147,7998\n147,8027\n147,8055\n147,8098\n147,8223\n147,8285\n147,8333\n147,8514\n147,8755\n147,8867\n147,8904\n147,9166\n147,9282\n147,9371\n147,9394\n147,9579\n147,9582\n147,9590\n147,9599\n147,13520\n147,13556\n147,13687\n147,13994\n147,14445\n147,14446\n147,14666\n147,15203\n147,15275\n147,15319\n147,15330\n147,15439\n147,15629\n147,15795\n147,16003\n147,16083\n147,16408\n147,16409\n147,16482\n147,16753\n147,16803\n147,16891\n147,16935\n147,16946\n147,16980\n147,17151\n147,17285\n147,17551\n147,17621\n147,17761\n147,18114\n147,18705\n147,18760\n147,18997\n147,19238\n147,19413\n147,19457\n147,19555\n147,19577\n147,19578\n147,19590\n147,19792\n147,19936\n147,20094\n147,20152\n147,20168\n147,20570\n147,21092\n147,21442\n147,21826\n147,21908\n147,22102\n147,22126\n147,22231\n147,22237\n147,22335\n147,22341\n147,22397\n147,22616\n147,22699\n147,22880\n147,22954\n147,23783\n147,23908\n147,23941\n147,23954\n147,24073\n147,24174\n147,24176\n147,24206\n147,24209\n147,24230\n147,24432\n147,25073\n147,25348\n147,25817\n147,25838\n147,26234\n147,26354\n147,26414\n147,26434\n147,26435\n147,26688\n147,26689\n147,26841\n147,27495\n147,28002\n147,28037\n147,28040\n147,28041\n147,28969\n147,29334\n147,29634\n147,29803\n147,29845\n147,29856\n147,30331\n147,30943\n147,31946\n147,32764\n147,32958\n147,33447\n147,35265\n147,35493\n147,35614\n147,36436\n147,36760\n147,37150\n147,39010\n147,39235\n147,39437\n147,39519\n147,39994\n147,40451\n147,40874\n147,41385\n147,41515\n147,41774\n147,42064\n147,42493\n147,42564\n147,43955\n147,44225\n147,44654\n147,44877\n147,46135\n147,46703\n147,47124\n147,47309\n147,48119\n147,48320\n147,48452\n147,48611\n147,49075\n147,49182\n147,49791\n147,49811\n147,50824\n147,51260\n147,52555\n147,53247\n147,53919\n147,53923\n147,54562\n147,54775\n147,54833\n147,54911\n147,55585\n147,56006\n147,56259\n147,57133\n147,57844\n147,58552\n147,58612\n147,60496\n147,60576\n147,62530\n147,63585\n147,65723\n147,65809\n147,66378\n147,66548\n147,66549\n147,66721\n147,67445\n147,67866\n147,68695\n147,69519\n147,69527\n147,70092\n147,70220\n147,70475\n147,70494\n147,70725\n147,71028\n147,71225\n147,71303\n147,71366\n147,71835\n147,72116\n147,72439\n147,72586\n147,72736\n147,72874\n147,73906\n147,73955\n147,73958\n147,73960\n147,74604\n147,75539\n147,75550\n147,75557\n147,75876\n147,75935\n147,76164\n147,76893\n147,77310\n147,77378\n147,77743\n147,77889\n147,78023\n147,78872\n147,79792\n147,80058\n147,80099\n147,80225\n147,80266\n147,80455\n147,80802\n147,80913\n147,81153\n147,81185\n147,81200\n147,81201\n147,81403\n147,83401\n147,83483\n147,83865\n147,84519\n147,84590\n147,85001\n147,85979\n147,87164\n147,87799\n147,87870\n147,88099\n147,88600\n147,88604\n147,88641\n147,89035\n147,89133\n147,89763\n147,90365\n147,90455\n147,90717\n147,91014\n147,91385\n147,91833\n147,92476\n147,93174\n147,93649\n147,93781\n147,93884\n147,94190\n147,94578\n147,94597\n147,96018\n147,96300\n147,97289\n147,98183\n147,98192\n147,98663\n147,99219\n147,99819\n147,100239\n147,102560\n147,102595\n147,102621\n147,102684\n147,102743\n147,103546\n147,103687\n147,104317\n147,104926\n147,105392\n147,105704\n147,107818\n147,109686\n147,110570\n147,112173\n147,112469\n147,112537\n147,112591\n147,113709\n147,114969\n147,115067\n147,115341\n147,115487\n147,115743\n147,115749\n147,116270\n147,116651\n147,116835\n147,117057\n147,117168\n147,117429\n147,117720\n147,117881\n147,118063\n147,118336\n147,118904\n147,123481\n147,124473\n147,124497\n147,124889\n147,125561\n147,125678\n147,126095\n147,126292\n147,126368\n147,126374\n147,126604\n147,127210\n147,127703\n147,128344\n147,128486\n147,128589\n147,128591\n147,128904\n147,129086\n147,129104\n147,130431\n147,131905\n147,132007\n147,132404\n147,133536\n147,133980\n147,134420\n147,136185\n147,136377\n147,136732\n147,138243\n147,138471\n147,138831\n147,139423\n147,139504\n147,139521\n147,141075\n147,141618\n147,142689\n147,142749\n147,143607\n147,144035\n147,145244\n147,145916\n147,146705\n147,147103\n147,147568\n147,147690\n147,147718\n147,148193\n147,148510\n147,149079\n147,149473\n147,149534\n147,154479\n147,154480\n147,155266\n147,157289\n147,158121\n147,161423\n147,162168\n147,162837\n147,163555\n147,163992\n147,164100\n147,164523\n147,164548\n147,164572\n147,164803\n147,165961\n147,166335\n147,166395\n147,166499\n147,166893\n147,169385\n147,169478\n147,169507\n147,170782\n147,171116\n147,171261\n147,173156\n147,173272\n147,173328\n147,174420\n147,174534\n147,175156\n147,175159\n147,175771\n147,176421\n147,177470\n147,177975\n147,178085\n147,179005\n147,180187\n147,181210\n147,181260\n147,181440\n147,181752\n147,182092\n147,182699\n147,182855\n147,182883\n147,183209\n147,183528\n147,183885\n147,185677\n147,186042\n147,186168\n147,186539\n147,186679\n147,187605\n147,188668\n147,190898\n147,191531\n147,191892\n147,192449\n147,193170\n147,193347\n147,194962\n147,196382\n147,199280\n147,204215\n147,204227\n147,206699\n147,207055\n147,212439\n147,212494\n147,212573\n147,212694\n147,212911\n147,213273\n147,213317\n147,214374\n147,215157\n147,215336\n147,215762\n147,216457\n147,216463\n147,217383\n147,219752\n147,220502\n147,220617\n147,221660\n147,224102\n147,224753\n147,224918\n147,226483\n147,227757\n147,228908\n147,228982\n147,229047\n147,230229\n147,230279\n147,231663\n147,232474\n147,232739\n147,232743\n147,232755\n147,233876\n147,235705\n147,238433\n147,240052\n147,240174\n147,240877\n147,241805\n147,242662\n147,242937\n147,243354\n147,243357\n147,244134\n147,244444\n147,244485\n147,245565\n147,247263\n147,250758\n147,251240\n147,251505\n147,251530\n147,251531\n147,251746\n147,252294\n147,253987\n147,254224\n147,254921\n147,257852\n147,258284\n147,258317\n147,258809\n147,259829\n147,261854\n147,261966\n147,262194\n147,262511\n147,262529\n147,262882\n148,147\n148,158\n148,195\n148,406\n148,422\n148,640\n148,1803\n149,1\n149,50\n149,106\n149,146\n149,147\n149,149\n149,158\n149,171\n149,175\n149,182\n149,184\n149,195\n149,206\n149,252\n149,285\n149,314\n149,336\n149,406\n149,467\n149,493\n149,505\n149,599\n149,606\n149,620\n149,622\n149,640\n149,685\n149,779\n149,808\n149,818\n149,859\n149,1181\n149,1189\n149,1370\n149,1425\n149,1458\n149,1464\n149,1515\n149,1518\n149,1521\n149,1546\n149,1619\n149,1623\n149,1776\n149,1803\n149,2244\n149,2333\n149,2365\n149,2394\n149,2400\n149,2438\n149,2609\n149,3145\n149,3895\n149,4684\n149,4706\n149,5421\n149,5625\n149,7087\n149,7862\n149,7998\n149,9371\n149,9394\n149,9518\n149,9554\n149,9689\n149,13226\n149,13274\n149,13993\n149,14040\n149,14166\n149,14402\n149,15261\n149,15439\n149,16409\n149,16775\n149,18256\n149,18646\n149,18692\n149,19238\n149,19250\n149,19555\n149,19783\n149,19847\n149,20433\n149,20503\n149,20515\n149,20588\n149,20680\n149,21442\n149,21675\n149,22210\n149,22231\n149,24106\n149,24607\n149,24743\n149,25046\n149,25387\n149,26318\n149,26362\n149,26450\n149,26841\n149,27184\n149,28361\n149,29249\n149,30035\n149,30468\n149,35336\n149,35616\n149,35672\n149,39437\n149,39643\n149,41429\n149,42130\n149,42606\n149,43534\n149,46135\n149,46360\n149,48364\n149,48908\n149,52601\n149,54958\n149,58267\n149,59020\n149,59156\n149,65723\n149,68695\n149,70748\n149,71303\n149,73232\n149,75557\n149,76835\n149,77571\n149,79532\n149,84606\n149,85817\n149,85979\n149,87870\n149,88348\n149,89035\n149,89900\n149,90993\n149,91055\n149,92476\n149,93181\n149,94190\n149,98889\n149,100409\n149,101770\n149,103240\n149,103551\n149,105612\n149,107700\n149,109369\n149,112061\n149,112537\n149,114019\n149,115333\n149,116068\n149,116158\n149,116479\n149,117059\n149,117060\n149,118336\n149,119438\n149,119547\n149,120892\n149,121417\n149,121587\n149,121977\n149,122032\n149,124097\n149,124816\n149,125754\n149,127158\n149,129650\n149,129853\n149,138831\n149,141912\n149,142151\n149,143399\n149,144071\n149,146838\n149,147380\n149,149755\n149,153457\n149,153630\n149,154480\n149,154547\n149,154721\n149,154726\n149,159028\n149,159133\n149,159874\n149,163519\n149,164308\n149,164316\n149,166395\n149,168397\n149,169385\n149,170928\n149,171761\n149,171795\n149,174449\n149,181163\n149,181752\n149,182240\n149,186878\n149,187293\n149,195835\n149,197609\n149,198677\n149,198709\n149,204103\n149,212439\n149,213853\n149,214780\n149,215685\n149,218391\n149,218830\n149,219087\n149,219885\n149,220502\n149,228516\n149,228703\n149,229093\n149,229362\n149,234266\n149,238139\n149,238937\n149,239922\n149,240174\n149,240619\n149,241227\n149,241248\n149,241557\n149,243555\n149,244128\n149,244600\n149,244738\n149,244942\n149,244986\n149,245004\n149,245463\n149,247210\n149,250672\n149,255299\n149,256405\n149,256939\n149,257183\n149,259944\n149,261388\n149,262050\n149,262110\n150,151\n151,151\n151,1457\n151,3780\n151,7107\n151,8237\n151,18822\n151,25666\n151,44961\n151,83981\n151,89406\n151,94990\n151,118264\n151,118308\n151,128878\n151,163429\n151,163430\n151,179911\n151,212762\n151,228376\n152,10\n152,175\n152,176\n152,55927\n153,154\n155,104\n155,134\n155,135\n155,136\n155,137\n155,138\n155,557\n155,1368\n155,1939\n155,2105\n156,157\n158,1\n158,50\n158,56\n158,99\n158,106\n158,146\n158,147\n158,148\n158,149\n158,158\n158,175\n158,184\n158,192\n158,195\n158,206\n158,252\n158,285\n158,301\n158,314\n158,333\n158,336\n158,406\n158,422\n158,425\n158,467\n158,505\n158,599\n158,618\n158,640\n158,673\n158,676\n158,778\n158,779\n158,794\n158,818\n158,838\n158,841\n158,859\n158,929\n158,1003\n158,1011\n158,1014\n158,1089\n158,1130\n158,1163\n158,1181\n158,1189\n158,1328\n158,1419\n158,1425\n158,1458\n158,1515\n158,1518\n158,1521\n158,1546\n158,1548\n158,1554\n158,1619\n158,1623\n158,1729\n158,1776\n158,1796\n158,1803\n158,1825\n158,1833\n158,1834\n158,1844\n158,1901\n158,1921\n158,1973\n158,2101\n158,2132\n158,2244\n158,2333\n158,2365\n158,2394\n158,2400\n158,2438\n158,2528\n158,2571\n158,2609\n158,2741\n158,2745\n158,2752\n158,2792\n158,2875\n158,3449\n158,3571\n158,3895\n158,3993\n158,4159\n158,4164\n158,4310\n158,4405\n158,4468\n158,4627\n158,4684\n158,4706\n158,4802\n158,5048\n158,5184\n158,5334\n158,5360\n158,5401\n158,5592\n158,5725\n158,5726\n158,5729\n158,5874\n158,6474\n158,6508\n158,6635\n158,7087\n158,7216\n158,7970\n158,7998\n158,8027\n158,8055\n158,8098\n158,8764\n158,8867\n158,9005\n158,9371\n158,9394\n158,9582\n158,13493\n158,13520\n158,13657\n158,14445\n158,14637\n158,14913\n158,15330\n158,15795\n158,16183\n158,16409\n158,16482\n158,16980\n158,17079\n158,17285\n158,18377\n158,18705\n158,18984\n158,19238\n158,19413\n158,19544\n158,19854\n158,19936\n158,20864\n158,20942\n158,21112\n158,22210\n158,22231\n158,22392\n158,22616\n158,22954\n158,23783\n158,23941\n158,23978\n158,24045\n158,24056\n158,24065\n158,24129\n158,24161\n158,24164\n158,24186\n158,24188\n158,24219\n158,24221\n158,25817\n158,25838\n158,26282\n158,26435\n158,26496\n158,26689\n158,26727\n158,27435\n158,27462\n158,27572\n158,27811\n158,27878\n158,28037\n158,28250\n158,28259\n158,28364\n158,28539\n158,28667\n158,28969\n158,29180\n158,29803\n158,30331\n158,30374\n158,30498\n158,30515\n158,30943\n158,31433\n158,31585\n158,32661\n158,32958\n158,33332\n158,33699\n158,33991\n158,35265\n158,35614\n158,35672\n158,36494\n158,36512\n158,37218\n158,37669\n158,39010\n158,39078\n158,39129\n158,39290\n158,39684\n158,41774\n158,41890\n158,43670\n158,43891\n158,45634\n158,46334\n158,47309\n158,48320\n158,50061\n158,50161\n158,50991\n158,54775\n158,54800\n158,54833\n158,55849\n158,56006\n158,56622\n158,57030\n158,57133\n158,57753\n158,58261\n158,58401\n158,58422\n158,58612\n158,59748\n158,59896\n158,59967\n158,59997\n158,60576\n158,60683\n158,61508\n158,62686\n158,63585\n158,64568\n158,65629\n158,65809\n158,65907\n158,65938\n158,66549\n158,67445\n158,68695\n158,69599\n158,70258\n158,71028\n158,71303\n158,71830\n158,71834\n158,71845\n158,72736\n158,72874\n158,73232\n158,73348\n158,73960\n158,74656\n158,75876\n158,77259\n158,77511\n158,78023\n158,80266\n158,80565\n158,80802\n158,81200\n158,83401\n158,83483\n158,84606\n158,87164\n158,87825\n158,87870\n158,88012\n158,88099\n158,89035\n158,89748\n158,89763\n158,90717\n158,91518\n158,92476\n158,92634\n158,93649\n158,93650\n158,93781\n158,93999\n158,95391\n158,97649\n158,98337\n158,102560\n158,103687\n158,104417\n158,104926\n158,105120\n158,106208\n158,109931\n158,110812\n158,110839\n158,111280\n158,111411\n158,112173\n158,115487\n158,115743\n158,116651\n158,116972\n158,117072\n158,117742\n158,118154\n158,118336\n158,119661\n158,120273\n158,124136\n158,126764\n158,127158\n158,127703\n158,128046\n158,128344\n158,129030\n158,132299\n158,133561\n158,133706\n158,133778\n158,135184\n158,136052\n158,136073\n158,137109\n158,137130\n158,137131\n158,137132\n158,137133\n158,138471\n158,138472\n158,139504\n158,140441\n158,142646\n158,144035\n158,145955\n158,147103\n158,148808\n158,149227\n158,149288\n158,149473\n158,151755\n158,152787\n158,153777\n158,154712\n158,155266\n158,155656\n158,157035\n158,157289\n158,157338\n158,157353\n158,158637\n158,160390\n158,162435\n158,162599\n158,163045\n158,163079\n158,163732\n158,164300\n158,165340\n158,167438\n158,168384\n158,168624\n158,168967\n158,169107\n158,170010\n158,171116\n158,171677\n158,173495\n158,175156\n158,175159\n158,175341\n158,175711\n158,175901\n158,177054\n158,177975\n158,181059\n158,182092\n158,182883\n158,183347\n158,186878\n158,187610\n158,188230\n158,189146\n158,189330\n158,189651\n158,190306\n158,190312\n158,190315\n158,191236\n158,191396\n158,193170\n158,193292\n158,194169\n158,195052\n158,196382\n158,197742\n158,198939\n158,199280\n158,203012\n158,204908\n158,206835\n158,208041\n158,212494\n158,212590\n158,212600\n158,212606\n158,212722\n158,213177\n158,213198\n158,213296\n158,213317\n158,213815\n158,216366\n158,220502\n158,220617\n158,222507\n158,223124\n158,223197\n158,224102\n158,224753\n158,225880\n158,227757\n158,227810\n158,228136\n158,229415\n158,234304\n158,236183\n158,239883\n158,240174\n158,241012\n158,245944\n158,245979\n158,247337\n158,247366\n158,248019\n158,251530\n158,252689\n158,252810\n158,253211\n158,254224\n158,254921\n158,257153\n158,257852\n158,258187\n158,258317\n158,260337\n158,260838\n158,261074\n158,261414\n158,261975\n158,262416\n158,264407\n158,265139\n159,160\n160,160\n160,314\n160,515\n160,599\n160,673\n160,992\n160,1058\n160,1130\n160,1623\n160,1891\n160,1973\n160,4066\n160,20757\n162,163\n162,187\n162,676\n163,104\n163,287\n163,673\n163,849\n163,911\n163,1130\n163,1204\n163,1293\n163,1417\n163,1844\n163,2173\n163,2373\n163,4823\n163,6027\n163,6303\n164,143\n165,143\n166,167\n167,86\n167,166\n167,167\n167,186\n167,217\n167,240\n167,263\n167,299\n167,301\n167,314\n167,350\n167,372\n167,392\n167,397\n167,435\n167,452\n167,457\n167,459\n167,467\n167,468\n167,509\n167,510\n167,522\n167,536\n167,563\n167,589\n167,599\n167,663\n167,744\n167,794\n167,803\n167,808\n167,818\n167,852\n167,941\n167,968\n167,972\n167,973\n167,1010\n167,1011\n167,1012\n167,1013\n167,1045\n167,1085\n167,1118\n167,1167\n167,1210\n167,1241\n167,1284\n167,1298\n167,1319\n167,1326\n167,1417\n167,1479\n167,1522\n167,1544\n167,1545\n167,1566\n167,1627\n167,1678\n167,1729\n167,1732\n167,1796\n167,1837\n167,1849\n167,1853\n167,1973\n167,2083\n167,2127\n167,2173\n167,2193\n167,2205\n167,2206\n167,2252\n167,2372\n167,2479\n167,2480\n167,2556\n167,2557\n167,2588\n167,2840\n167,2979\n167,3049\n167,3138\n167,3207\n167,3218\n167,3497\n167,3507\n167,3582\n167,3630\n167,3809\n167,3820\n167,3871\n167,4213\n167,4286\n167,4291\n167,5301\n167,5544\n167,6710\n167,6712\n167,6869\n167,7011\n167,7057\n167,7176\n167,7204\n167,7759\n167,8504\n167,8534\n167,9250\n167,9433\n167,9603\n167,9640\n167,9702\n167,13252\n167,13470\n167,13771\n167,14246\n167,14498\n167,15073\n167,15303\n167,15380\n167,16182\n167,16192\n167,16463\n167,17161\n167,19525\n167,20327\n167,20597\n167,22062\n167,23848\n167,24627\n167,24815\n167,25606\n167,25662\n167,26958\n167,27095\n167,27650\n167,28305\n167,28774\n167,30253\n167,30373\n167,31746\n167,32704\n167,32784\n167,32967\n167,32975\n167,33527\n167,35891\n167,37808\n167,39011\n167,39013\n167,40513\n167,41528\n167,43235\n167,43346\n167,44105\n167,44403\n167,44480\n167,44972\n167,45510\n167,46805\n167,47051\n167,48282\n167,48545\n167,50023\n167,50423\n167,50565\n167,50987\n167,51143\n167,51889\n167,54966\n167,55028\n167,59157\n167,59269\n167,59581\n167,62402\n167,64070\n167,67132\n167,69704\n167,73378\n167,73570\n167,75295\n167,75794\n167,76096\n167,77678\n167,83761\n167,87886\n167,90466\n167,93031\n167,93590\n167,93835\n167,94276\n167,94745\n167,94938\n167,97330\n167,99136\n167,99759\n167,102646\n167,103198\n167,103524\n167,106724\n167,110575\n167,116543\n167,116590\n167,118510\n167,119610\n167,127158\n167,127227\n167,128516\n167,130965\n167,133122\n167,134179\n167,136363\n167,136569\n167,138864\n167,139919\n167,140458\n167,141050\n167,143481\n167,143746\n167,146067\n167,147883\n167,148098\n167,150840\n167,153180\n167,153348\n167,158528\n167,167521\n167,168411\n167,170643\n167,170803\n167,170984\n167,171148\n167,173330\n167,176027\n167,176115\n167,178573\n167,179575\n167,181431\n167,181852\n167,182015\n167,182086\n167,182589\n167,182990\n167,187176\n167,188282\n167,188587\n167,190527\n167,192191\n167,192767\n167,194481\n167,194925\n167,195944\n167,195984\n167,207045\n167,207837\n167,213750\n167,213752\n167,213755\n167,213756\n167,213761\n167,213796\n167,216586\n167,217992\n167,218050\n167,218884\n167,221176\n167,221724\n167,223028\n167,223818\n167,228928\n167,229082\n167,229101\n167,229203\n167,229230\n167,229593\n167,236264\n167,237503\n167,238142\n167,239101\n167,239915\n167,244184\n167,244197\n167,247668\n167,249055\n167,250468\n167,250803\n167,251511\n167,251923\n167,253150\n167,256907\n167,258341\n167,258750\n167,262019\n167,263812\n168,169\n170,171\n171,1\n171,5\n171,10\n171,65\n171,66\n171,147\n171,149\n171,171\n171,175\n171,184\n171,330\n171,467\n171,693\n171,726\n171,788\n171,859\n171,868\n171,882\n171,902\n171,957\n171,980\n171,1247\n171,1388\n171,1433\n171,1815\n171,2126\n171,2344\n171,2574\n171,4161\n171,4215\n171,4289\n171,4446\n171,4724\n171,5133\n171,5812\n171,6138\n171,6209\n171,6759\n171,12395\n171,13335\n171,14588\n171,14679\n171,16359\n171,19785\n171,20886\n171,21442\n171,25561\n171,28360\n171,33503\n171,33517\n171,34189\n171,38308\n171,38688\n171,40501\n171,41907\n171,43214\n171,43219\n171,43884\n171,45626\n171,46706\n171,55144\n171,55351\n171,58420\n171,58432\n171,58876\n171,62485\n171,64032\n171,65723\n171,65738\n171,71303\n171,72084\n171,73232\n171,74646\n171,74711\n171,76835\n171,83458\n171,84021\n171,84082\n171,85979\n171,89035\n171,91075\n171,99849\n171,102786\n171,104013\n171,108067\n171,125238\n171,128975\n171,130520\n171,136313\n171,138831\n171,147380\n171,164572\n171,215157\n171,238800\n171,244134\n171,251240\n172,173\n174,173\n175,1\n175,3\n175,10\n175,30\n175,34\n175,35\n175,41\n175,52\n175,56\n175,68\n175,79\n175,97\n175,106\n175,107\n175,134\n175,146\n175,147\n175,149\n175,158\n175,171\n175,175\n175,178\n175,192\n175,195\n175,198\n175,200\n175,206\n175,211\n175,212\n175,233\n175,275\n175,277\n175,285\n175,287\n175,309\n175,310\n175,313\n175,328\n175,336\n175,346\n175,387\n175,406\n175,422\n175,446\n175,447\n175,485\n175,500\n175,505\n175,510\n175,512\n175,566\n175,602\n175,620\n175,640\n175,663\n175,664\n175,671\n175,685\n175,693\n175,704\n175,760\n175,772\n175,775\n175,779\n175,784\n175,808\n175,818\n175,841\n175,859\n175,907\n175,911\n175,919\n175,920\n175,957\n175,1010\n175,1085\n175,1113\n175,1149\n175,1188\n175,1240\n175,1243\n175,1247\n175,1281\n175,1285\n175,1309\n175,1425\n175,1458\n175,1465\n175,1515\n175,1529\n175,1566\n175,1592\n175,1623\n175,1708\n175,1728\n175,1773\n175,1803\n175,1807\n175,1815\n175,1849\n175,1860\n175,1888\n175,1912\n175,1949\n175,2244\n175,2254\n175,2528\n175,2775\n175,2782\n175,3009\n175,3067\n175,3115\n175,3538\n175,3565\n175,4114\n175,4260\n175,4337\n175,4507\n175,5100\n175,5356\n175,5401\n175,5405\n175,6556\n175,6837\n175,7117\n175,7194\n175,7318\n175,7645\n175,8285\n175,8488\n175,9585\n175,13094\n175,13352\n175,13687\n175,14483\n175,15112\n175,15330\n175,15547\n175,15552\n175,15624\n175,17352\n175,17797\n175,17803\n175,17886\n175,19336\n175,19555\n175,19578\n175,19894\n175,21944\n175,23104\n175,24150\n175,25852\n175,25857\n175,26414\n175,26972\n175,30331\n175,30999\n175,31300\n175,31414\n175,33437\n175,36402\n175,36761\n175,38524\n175,39386\n175,39589\n175,40797\n175,41230\n175,41603\n175,43141\n175,46227\n175,51170\n175,58836\n175,62135\n175,64854\n175,67055\n175,67536\n175,69668\n175,76082\n175,76749\n175,77056\n175,77176\n175,77181\n175,80266\n175,80311\n175,81624\n175,81625\n175,81676\n175,82036\n175,82103\n175,82918\n175,82974\n175,85751\n175,85814\n175,87813\n175,87870\n175,89194\n175,89313\n175,89434\n175,89442\n175,89465\n175,89469\n175,90822\n175,90827\n175,92141\n175,92476\n175,93113\n175,95784\n175,102560\n175,109426\n175,112699\n175,113156\n175,118248\n175,118336\n175,126161\n175,126942\n175,128586\n175,130136\n175,132412\n175,135585\n175,139245\n175,139465\n175,141912\n175,142048\n175,142317\n175,142405\n175,143446\n175,144245\n175,148488\n175,148601\n175,149534\n175,153912\n175,167540\n175,167542\n175,167543\n175,177483\n175,178514\n175,180187\n175,180487\n175,195398\n175,204124\n175,212573\n175,217701\n175,227204\n175,227644\n175,233964\n175,237575\n175,249580\n175,259829\n177,178\n177,289\n177,290\n178,20\n178,68\n178,175\n178,178\n178,366\n178,387\n178,434\n178,435\n178,439\n178,447\n178,500\n178,510\n178,538\n178,668\n178,671\n178,724\n178,766\n178,818\n178,934\n178,935\n178,939\n178,996\n178,1033\n178,1185\n178,1238\n178,1276\n178,1294\n178,1434\n178,1474\n178,1590\n178,1611\n178,1619\n178,1644\n178,1789\n178,1877\n178,1891\n178,1953\n178,2102\n178,2334\n178,2400\n178,2540\n178,2556\n178,2653\n178,2677\n178,3212\n178,3987\n178,4310\n178,4317\n178,4646\n178,4689\n178,5012\n178,6059\n178,6109\n178,6422\n178,6950\n178,8510\n178,8513\n178,8807\n178,9786\n178,13690\n178,13987\n178,14111\n178,15141\n178,15440\n178,16283\n178,16561\n178,16873\n178,17220\n178,17932\n178,18256\n178,19117\n178,19392\n178,19413\n178,19813\n178,19904\n178,21346\n178,21442\n178,22071\n178,23740\n178,24878\n178,25345\n178,25765\n178,26034\n178,26272\n178,26452\n178,26477\n178,27848\n178,28371\n178,29638\n178,29680\n178,30080\n178,30442\n178,30704\n178,31222\n178,31966\n178,32468\n178,32511\n178,33413\n178,35015\n178,35460\n178,36853\n178,37086\n178,37275\n178,37771\n178,38426\n178,40212\n178,41175\n178,41337\n178,41374\n178,41385\n178,41548\n178,42454\n178,42506\n178,42785\n178,42960\n178,46838\n178,47113\n178,47272\n178,47446\n178,48364\n178,49896\n178,50246\n178,50606\n178,52437\n178,52550\n178,54980\n178,58964\n178,63130\n178,63501\n178,64028\n178,64220\n178,64623\n178,66689\n178,66702\n178,67231\n178,68481\n178,68816\n178,72627\n178,74526\n178,74578\n178,76632\n178,83473\n178,84498\n178,86533\n178,92951\n178,92985\n178,93830\n178,95166\n178,102232\n178,104433\n178,109228\n178,110645\n178,116286\n178,118219\n178,119927\n178,121577\n178,122318\n178,124583\n178,125563\n178,126190\n178,126760\n178,128831\n178,128884\n178,132029\n178,133112\n178,134035\n178,135992\n178,137735\n178,137748\n178,140512\n178,141973\n178,152916\n178,157077\n178,159085\n178,169048\n178,174461\n178,174860\n178,175308\n178,176145\n178,177879\n178,184958\n178,187206\n178,187335\n178,188215\n178,189251\n178,189350\n178,189812\n178,195711\n178,198860\n178,206309\n178,212437\n178,212537\n178,215402\n178,215961\n178,216068\n178,219206\n178,219288\n178,221346\n178,221860\n178,225545\n178,228931\n178,229927\n178,234759\n178,234959\n178,236061\n178,241536\n178,241773\n178,242469\n178,244822\n178,245366\n178,245376\n178,252767\n178,256645\n178,257991\n178,258792\n178,264493\n179,180\n181,160\n181,182\n181,188\n181,7652\n182,10\n182,20\n182,22\n182,192\n182,240\n182,256\n182,259\n182,264\n182,301\n182,302\n182,314\n182,327\n182,336\n182,366\n182,397\n182,406\n182,417\n182,438\n182,440\n182,441\n182,452\n182,467\n182,500\n182,510\n182,512\n182,536\n182,599\n182,604\n182,626\n182,673\n182,722\n182,773\n182,801\n182,818\n182,838\n182,881\n182,972\n182,1011\n182,1019\n182,1085\n182,1118\n182,1147\n182,1172\n182,1181\n182,1191\n182,1192\n182,1204\n182,1417\n182,1445\n182,1472\n182,1553\n182,1566\n182,1659\n182,1663\n182,1682\n182,1796\n182,1825\n182,1844\n182,1874\n182,1876\n182,1893\n182,2173\n182,2211\n182,2253\n182,2373\n182,2400\n182,2607\n182,3199\n182,3507\n182,3533\n182,3557\n182,4066\n182,4165\n182,4231\n182,4274\n182,4466\n182,5370\n182,5584\n182,5956\n182,6452\n182,6734\n182,7070\n182,7087\n182,7178\n182,8419\n182,9104\n182,13207\n182,13373\n182,19413\n182,20635\n182,20738\n182,21547\n182,22063\n182,22296\n182,22434\n182,23482\n182,28348\n182,29026\n182,29902\n182,30307\n182,30455\n182,30502\n182,33607\n182,41893\n182,42761\n182,45481\n182,48307\n182,48331\n182,49377\n182,50190\n183,184\n184,1\n184,147\n184,149\n184,158\n184,184\n184,206\n184,336\n184,859\n184,920\n184,957\n184,1235\n184,1247\n184,1335\n184,1458\n184,1619\n184,1623\n184,1815\n184,2244\n184,2868\n184,7817\n184,26841\n184,40514\n184,68249\n184,179365\n184,213476\n184,215157\n184,252734\n184,254248\n184,258989\n185,186\n185,1118\n185,6695\n185,6837\n186,10\n186,65\n186,68\n186,97\n186,167\n186,182\n186,185\n186,186\n186,192\n186,207\n186,217\n186,240\n186,248\n186,264\n186,290\n186,292\n186,301\n186,332\n186,360\n186,366\n186,392\n186,406\n186,431\n186,433\n186,442\n186,467\n186,479\n186,500\n186,512\n186,518\n186,536\n186,538\n186,631\n186,668\n186,693\n186,765\n186,775\n186,808\n186,818\n186,862\n186,868\n186,872\n186,874\n186,918\n186,929\n186,1010\n186,1014\n186,1019\n186,1085\n186,1089\n186,1096\n186,1118\n186,1133\n186,1191\n186,1203\n186,1210\n186,1235\n186,1240\n186,1293\n186,1298\n186,1326\n186,1388\n186,1402\n186,1411\n186,1417\n186,1531\n186,1545\n186,1566\n186,1635\n186,1659\n186,1782\n186,1796\n186,1893\n186,1955\n186,1985\n186,2036\n186,2205\n186,2512\n186,2812\n186,3193\n186,3455\n186,3504\n186,3582\n186,3718\n186,3745\n186,3804\n186,3866\n186,4066\n186,4109\n186,4213\n186,4286\n186,5008\n186,5129\n186,5130\n186,5186\n186,5250\n186,5382\n186,5385\n186,5388\n186,5718\n186,6526\n186,6545\n186,6695\n186,6754\n186,6904\n186,7170\n186,7959\n186,8261\n186,8435\n186,8686\n186,9015\n186,13217\n186,13624\n186,15109\n186,15313\n186,15407\n186,15454\n186,15474\n186,15633\n186,17116\n186,18451\n186,22296\n186,23850\n186,29871\n186,30373\n186,31802\n186,33424\n186,34053\n186,35598\n186,42254\n186,43183\n186,44269\n186,45865\n186,46046\n186,47114\n186,47805\n186,48006\n186,48505\n186,48909\n186,51719\n186,51977\n186,55104\n186,57205\n186,58450\n186,59226\n186,59597\n186,65681\n186,70136\n186,92849\n186,92935\n186,94134\n186,94882\n186,98275\n186,106089\n186,114616\n186,116903\n186,118327\n186,119853\n186,119854\n186,120155\n186,121903\n186,126620\n186,127158\n186,133358\n186,136761\n186,146463\n186,147446\n186,163399\n186,168499\n186,176908\n186,177720\n186,177807\n186,182779\n186,183300\n186,185378\n186,185894\n186,185912\n186,188232\n186,192062\n186,192911\n186,193606\n186,195211\n186,205273\n186,212913\n186,213979\n186,215874\n186,216703\n186,218367\n186,218370\n186,219185\n186,242183\n186,242246\n187,8\n187,162\n187,313\n187,532\n187,634\n187,657\n187,777\n187,1083\n187,1313\n187,1871\n187,2266\n187,2421\n187,2424\n187,6032\n187,6353\n187,7894\n187,7903\n187,8060\n187,8431\n187,13416\n187,14009\n187,20633\n187,21206\n187,23417\n187,23442\n187,28803\n187,31039\n187,33338\n187,33459\n187,33981\n187,35356\n187,59881\n187,65799\n187,68327\n187,74327\n187,119275\n187,123949\n187,128133\n187,150084\n187,161862\n187,165558\n187,175222\n187,181012\n187,182307\n187,192563\n187,211707\n187,223694\n187,224576\n187,230422\n187,245243\n187,262325\n187,264382\n189,190\n191,192\n192,10\n192,22\n192,50\n192,55\n192,56\n192,63\n192,65\n192,68\n192,79\n192,83\n192,97\n192,99\n192,109\n192,146\n192,147\n192,158\n192,175\n192,182\n192,186\n192,192\n192,195\n192,202\n192,203\n192,206\n192,211\n192,240\n192,256\n192,283\n192,287\n192,289\n192,290\n192,301\n192,302\n192,314\n192,325\n192,333\n192,336\n192,337\n192,338\n192,366\n192,389\n192,406\n192,421\n192,422\n192,425\n192,435\n192,440\n192,452\n192,467\n192,500\n192,505\n192,510\n192,515\n192,516\n192,536\n192,538\n192,557\n192,580\n192,599\n192,601\n192,602\n192,620\n192,622\n192,638\n192,640\n192,663\n192,664\n192,668\n192,681\n192,682\n192,693\n192,702\n192,779\n192,780\n192,794\n192,808\n192,818\n192,838\n192,841\n192,843\n192,872\n192,920\n192,937\n192,939\n192,947\n192,949\n192,991\n192,998\n192,1003\n192,1010\n192,1014\n192,1087\n192,1089\n192,1118\n192,1181\n192,1192\n192,1198\n192,1204\n192,1205\n192,1210\n192,1218\n192,1293\n192,1366\n192,1370\n192,1392\n192,1414\n192,1417\n192,1456\n192,1464\n192,1518\n192,1531\n192,1559\n192,1568\n192,1572\n192,1619\n192,1623\n192,1663\n192,1697\n192,1715\n192,1796\n192,1825\n192,1837\n192,1844\n192,1878\n192,1955\n192,1973\n192,1992\n192,1993\n192,2032\n192,2069\n192,2173\n192,2234\n192,2307\n192,2374\n192,2471\n192,2540\n192,2556\n192,2574\n192,2665\n192,2797\n192,2880\n192,2903\n192,2931\n192,3185\n192,3370\n192,3407\n192,3507\n192,3571\n192,3582\n192,3609\n192,3681\n192,3843\n192,3872\n192,3895\n192,3933\n192,3962\n192,4066\n192,4084\n192,4272\n192,4306\n192,4308\n192,4324\n192,4367\n192,4462\n192,4611\n192,4623\n192,4637\n192,4661\n192,4701\n192,4802\n192,5052\n192,5104\n192,5155\n192,5173\n192,5353\n192,5357\n192,5376\n192,5401\n192,5494\n192,5495\n192,5498\n192,5563\n192,5718\n192,5726\n192,5729\n192,5809\n192,5834\n192,5849\n192,5864\n192,5866\n192,5971\n192,5991\n192,6119\n192,6452\n192,6519\n192,6670\n192,6671\n192,6684\n192,6772\n192,6904\n192,6918\n192,6959\n192,7007\n192,7087\n192,7152\n192,7178\n192,7186\n192,7226\n192,7296\n192,7794\n192,7862\n192,7880\n192,7891\n192,8013\n192,8070\n192,8100\n192,8128\n192,8180\n192,8214\n192,8270\n192,8309\n192,8583\n192,8764\n192,9213\n192,9367\n192,9379\n192,9394\n192,9505\n192,9679\n192,9747\n192,11890\n192,12112\n192,12263\n192,13185\n192,13260\n192,13270\n192,13385\n192,13428\n192,13435\n192,13464\n192,13478\n192,13633\n192,13687\n192,13771\n192,13941\n192,14432\n192,14433\n192,14453\n192,14534\n192,14799\n192,14829\n192,14830\n192,14833\n192,14854\n192,14913\n192,15319\n192,15365\n192,15388\n192,15558\n192,15560\n192,15582\n192,15636\n192,15770\n192,15980\n192,16010\n192,16191\n192,16226\n192,16411\n192,16496\n192,16563\n192,16572\n192,16774\n192,16949\n192,17116\n192,17151\n192,17432\n192,18249\n192,18261\n192,18281\n192,18638\n192,18640\n192,18924\n192,18997\n192,19025\n192,19182\n192,19205\n192,19250\n192,19435\n192,19592\n192,19651\n192,19859\n192,20035\n192,20559\n192,20615\n192,20738\n192,20982\n192,21350\n192,21528\n192,21605\n192,21706\n192,21799\n192,22015\n192,22372\n192,22395\n192,22616\n192,23517\n192,23662\n192,23698\n192,23771\n192,23783\n192,23987\n192,24066\n192,24137\n192,24150\n192,24222\n192,24372\n192,24691\n192,24695\n192,24741\n192,24770\n192,24783\n192,24900\n192,25370\n192,25487\n192,25555\n192,25627\n192,25813\n192,25881\n192,26133\n192,26139\n192,26395\n192,26414\n192,26425\n192,26943\n192,27148\n192,27495\n192,27772\n192,28142\n192,28259\n192,28354\n192,28539\n192,28579\n192,28851\n192,28997\n192,29056\n192,29083\n192,29721\n192,29830\n192,29837\n192,29890\n192,30331\n192,31170\n192,31186\n192,32172\n192,32529\n192,33764\n192,33816\n192,33821\n192,33991\n192,34014\n192,34103\n192,34237\n192,34253\n192,34341\n192,34626\n192,35045\n192,35336\n192,35614\n192,36008\n192,36056\n192,36256\n192,36297\n192,36411\n192,36417\n192,36420\n192,36421\n192,36425\n192,36434\n192,36435\n192,36457\n192,36512\n192,37224\n192,37441\n192,37629\n192,37844\n192,38001\n192,38688\n192,38903\n192,38950\n192,39684\n192,40971\n192,41146\n192,41273\n192,41385\n192,41987\n192,42033\n192,43290\n192,43364\n192,43439\n192,43559\n192,43608\n192,43885\n192,44798\n192,45543\n192,45656\n192,45791\n192,45846\n192,46486\n192,47106\n192,48119\n192,48320\n192,48619\n192,48909\n192,49317\n192,49373\n192,49791\n192,50107\n192,50279\n192,50666\n192,50683\n192,51126\n192,51260\n192,52339\n192,52342\n192,52560\n192,53472\n192,54955\n192,55034\n192,55036\n192,55075\n192,55124\n192,55294\n192,55456\n192,55602\n192,55933\n192,56387\n192,57912\n192,58203\n192,58484\n192,58550\n192,58763\n192,58860\n192,59183\n192,59544\n192,59749\n192,59780\n192,59844\n192,60304\n192,60379\n192,60421\n192,60576\n192,62469\n192,62632\n192,62672\n192,63126\n192,63580\n192,63933\n192,64025\n192,64153\n192,64353\n192,65396\n192,65770\n192,65809\n192,66710\n192,67078\n192,67229\n192,67367\n192,68082\n192,68183\n192,68816\n192,69419\n192,69958\n192,70051\n192,70367\n192,71119\n192,72428\n192,72439\n192,72950\n192,72995\n192,73201\n192,73348\n192,73693\n192,73966\n192,74542\n192,75226\n192,75972\n192,76228\n192,76820\n192,76896\n192,77198\n192,77813\n192,77835\n192,78991\n192,79768\n192,79967\n192,79973\n192,80043\n192,80529\n192,80656\n192,80973\n192,80974\n192,81052\n192,81280\n192,82108\n192,82242\n192,83029\n192,83035\n192,83314\n192,84590\n192,84659\n192,84663\n192,84685\n192,88062\n192,88467\n192,88936\n192,91792\n192,92036\n192,92140\n192,92476\n192,92732\n192,93199\n192,93778\n192,93780\n192,94134\n192,96335\n192,96637\n192,96773\n192,99777\n192,101667\n192,102560\n192,102727\n192,103254\n192,103831\n192,104039\n192,104317\n192,104339\n192,104659\n192,104720\n192,105704\n192,107093\n192,107181\n192,107754\n192,108250\n192,109154\n192,109318\n192,109384\n192,109401\n192,109403\n192,109409\n192,109572\n192,109690\n192,109955\n192,110033\n192,110295\n192,110370\n192,110496\n192,110672\n192,111250\n192,111280\n192,112024\n192,116030\n192,116197\n192,116210\n192,116522\n192,117148\n192,117480\n192,118079\n192,118336\n192,119496\n192,119650\n192,119651\n192,119663\n192,119664\n192,119665\n192,119666\n192,119667\n192,119692\n192,119693\n192,119694\n192,119697\n192,119698\n192,119701\n192,119707\n192,119708\n192,119709\n192,120050\n192,120994\n192,120998\n192,121110\n192,121306\n192,121594\n192,121986\n192,122429\n192,123025\n192,123668\n192,124386\n192,124473\n192,125357\n192,125370\n192,125854\n192,125920\n192,125921\n192,126061\n192,126841\n192,127158\n192,127175\n192,127192\n192,127372\n192,127514\n192,127555\n192,127920\n192,128004\n192,128666\n192,128917\n192,128918\n192,130815\n192,130905\n192,131080\n192,131277\n192,131408\n192,131429\n192,131846\n192,131907\n192,132541\n192,132899\n192,132903\n192,133238\n192,133306\n192,133558\n192,133961\n192,134581\n192,134772\n192,134779\n192,134864\n192,134865\n192,134869\n192,134873\n192,134906\n192,135062\n192,135098\n192,135166\n192,135167\n192,135168\n192,135169\n192,135170\n192,135171\n192,135172\n192,135173\n192,135237\n192,135253\n192,136034\n192,136463\n192,136667\n192,136670\n192,137900\n192,138064\n192,138564\n192,139768\n192,140083\n192,140208\n192,140475\n192,140482\n192,142115\n192,143575\n192,143644\n192,144142\n192,144473\n192,144849\n192,146029\n192,146869\n192,147309\n192,147467\n192,148970\n192,149013\n192,149022\n192,149324\n192,149326\n192,149379\n192,149397\n192,150740\n192,150746\n192,154486\n192,154972\n192,155518\n192,155711\n192,156021\n192,156266\n192,156392\n192,156635\n192,158700\n192,158847\n192,160530\n192,160739\n192,161002\n192,161571\n192,162008\n192,162010\n192,162537\n192,163003\n192,163019\n192,163426\n192,163978\n192,164004\n192,165030\n192,165462\n192,166275\n192,167348\n192,168594\n192,169532\n192,169554\n192,169555\n192,169558\n192,169560\n192,169561\n192,169562\n192,169565\n192,169627\n192,169846\n192,169887\n192,169900\n192,169939\n192,169981\n192,170723\n192,170779\n192,171015\n192,172174\n192,174244\n192,174369\n192,174534\n192,174835\n192,174855\n192,175432\n192,176115\n192,176444\n192,176460\n192,176835\n192,177363\n192,178871\n192,179286\n192,179627\n192,179775\n192,180661\n192,180976\n192,181759\n192,181775\n192,181790\n192,182308\n192,182890\n192,184736\n192,185057\n192,185476\n192,186174\n192,186328\n192,187400\n192,189790\n192,193100\n192,193520\n192,194131\n192,194467\n192,195285\n192,195287\n192,198153\n192,199805\n192,204124\n192,205075\n192,206552\n192,207253\n192,212092\n192,212353\n192,212606\n192,214030\n192,214269\n192,215384\n192,215874\n192,215878\n192,216383\n192,217591\n192,218016\n192,219009\n192,220010\n192,222055\n192,222672\n192,223095\n192,223635\n192,224217\n192,224460\n192,224774\n192,224779\n192,224939\n192,225050\n192,225467\n192,226515\n192,228688\n192,228858\n192,230307\n192,230730\n192,232684\n192,232857\n192,233154\n192,233504\n192,233701\n192,233753\n192,234845\n192,236301\n192,237396\n192,237901\n192,238336\n192,238431\n192,240174\n192,241005\n192,242264\n192,243125\n192,244152\n192,244699\n192,244834\n192,245199\n192,245935\n192,246480\n192,247366\n192,247911\n192,248363\n192,248510\n192,248667\n192,249287\n192,250184\n192,250304\n192,250639\n192,250733\n192,252464\n192,252465\n192,252572\n192,252643\n192,252690\n192,252830\n192,254083\n192,254091\n192,254520\n192,254535\n192,255249\n192,255676\n192,256626\n192,257250\n192,257275\n192,257799\n192,259815\n192,260375\n192,260939\n192,261380\n192,261762\n192,262438\n192,263577\n192,263841\n192,264020\n192,264070\n193,52\n193,140269\n194,195\n195,1\n195,10\n195,44\n195,50\n195,56\n195,146\n195,147\n195,148\n195,149\n195,158\n195,175\n195,192\n195,195\n195,206\n195,285\n195,314\n195,336\n195,356\n195,406\n195,425\n195,440\n195,505\n195,599\n195,602\n195,620\n195,622\n195,640\n195,681\n195,701\n195,779\n195,794\n195,818\n195,838\n195,841\n195,1011\n195,1014\n195,1033\n195,1181\n195,1293\n195,1366\n195,1464\n195,1515\n195,1518\n195,1619\n195,1623\n195,1825\n195,1842\n195,1952\n195,1973\n195,2071\n195,2139\n195,2161\n195,2287\n195,2288\n195,2511\n195,2690\n195,2768\n195,2903\n195,3759\n195,3895\n195,4110\n195,4159\n195,4310\n195,4324\n195,4332\n195,4514\n195,4529\n195,4626\n195,5100\n195,5495\n195,5523\n195,5527\n195,5550\n195,5750\n195,6647\n195,6824\n195,6902\n195,7296\n195,7909\n195,8002\n195,8055\n195,8067\n195,8330\n195,8426\n195,8969\n195,9394\n195,10406\n195,11054\n195,12724\n195,13204\n195,13464\n195,13654\n195,13687\n195,13722\n195,14241\n195,14433\n195,14637\n195,15319\n195,15365\n195,15450\n195,15795\n195,16322\n195,16853\n195,17323\n195,18736\n195,18895\n195,18953\n195,19842\n195,20032\n195,20088\n195,20540\n195,20552\n195,20555\n195,20570\n195,20795\n195,21382\n195,21385\n195,22287\n195,22358\n195,22369\n195,22677\n195,23783\n195,24182\n195,24198\n195,24648\n195,24649\n195,25067\n195,25348\n195,27310\n195,27834\n195,28888\n195,28962\n195,28985\n195,29615\n195,30331\n195,30418\n195,31140\n195,31164\n195,31346\n195,31349\n195,31582\n195,31585\n195,32617\n195,32680\n195,32958\n195,33559\n195,33648\n195,33665\n195,33666\n195,33717\n195,33988\n195,34441\n195,34867\n195,36416\n195,36443\n195,36483\n195,36492\n195,36494\n195,36528\n195,36544\n195,36555\n195,36558\n195,36565\n195,37059\n195,37499\n195,38276\n195,38300\n195,38883\n195,38976\n195,39014\n195,42138\n195,43260\n195,43263\n195,43422\n195,44353\n195,46890\n195,49581\n195,50191\n195,51019\n195,53236\n195,54431\n195,54487\n195,54512\n195,54540\n195,54937\n195,55031\n195,55305\n195,55849\n195,57051\n195,57826\n195,59698\n195,59828\n195,60045\n195,60667\n195,62862\n195,64246\n195,65809\n195,66008\n195,68346\n195,72504\n195,73440\n195,74530\n195,74584\n195,74718\n195,76893\n195,77650\n195,79465\n195,79466\n195,80503\n195,82026\n195,83583\n195,84751\n195,85872\n195,86435\n195,86505\n195,87244\n195,89882\n195,91862\n195,92476\n195,93177\n195,93829\n195,94053\n195,94243\n195,94886\n195,94913\n195,95012\n195,96664\n195,96774\n195,98340\n195,99054\n195,102560\n195,103122\n195,105854\n195,106254\n195,106505\n195,107376\n195,109500\n195,111225\n195,114551\n195,115788\n195,116033\n195,117136\n195,118336\n195,120075\n195,120088\n195,122104\n195,125274\n195,126096\n195,126159\n195,127158\n195,131203\n195,131593\n195,132535\n195,133511\n195,133728\n195,134880\n195,135322\n195,138149\n195,138249\n195,138827\n195,138828\n195,139521\n195,139554\n195,141376\n195,141833\n195,141912\n195,142424\n195,142836\n195,143042\n195,146181\n195,146814\n195,148606\n195,150046\n195,150163\n195,150210\n195,152697\n195,153770\n195,154327\n195,155157\n195,155195\n195,155380\n195,155636\n195,159128\n195,159807\n195,159812\n195,162581\n195,163783\n195,164323\n195,167723\n195,168594\n195,169067\n195,169079\n195,169468\n195,170789\n195,171757\n195,172529\n195,173776\n195,175196\n195,176095\n195,177038\n195,181498\n195,181709\n195,182052\n195,182053\n195,182145\n195,182907\n195,183350\n195,183364\n195,185989\n195,187467\n195,189295\n195,189408\n195,191274\n195,191300\n195,194689\n195,197649\n195,198703\n195,200630\n195,202408\n195,204079\n195,204124\n195,204160\n195,204642\n195,204764\n195,207483\n195,207484\n195,207929\n195,207930\n195,213250\n195,213477\n195,215874\n195,216045\n195,216334\n195,217624\n195,217914\n195,219461\n195,219960\n195,219973\n195,219976\n195,220583\n195,223053\n195,223339\n195,224007\n195,229954\n195,230328\n195,231548\n195,234816\n195,235354\n195,238369\n195,240174\n195,240394\n195,240759\n195,243082\n195,243085\n195,244029\n195,244589\n195,248780\n195,249124\n195,251948\n195,255754\n195,258788\n195,259604\n195,259714\n195,260372\n195,260801\n195,261849\n195,262652\n196,52\n196,9598\n196,140269\n196,206059\n197,52\n197,198\n199,81\n199,135\n199,137\n199,200\n199,215\n199,227\n199,230\n199,233\n199,289\n199,290\n199,304\n199,328\n199,372\n199,417\n199,431\n199,592\n199,704\n199,714\n199,760\n199,932\n199,1016\n199,1082\n199,1085\n199,1212\n199,1257\n199,1392\n199,1608\n199,1818\n199,1882\n199,1962\n199,2105\n199,2205\n199,2210\n199,2286\n199,2296\n199,2315\n199,3069\n199,3085\n199,3507\n199,4218\n199,4237\n199,33424\n199,94134\n199,144988\n199,182162\n199,198174\n199,245910\n200,30\n200,104\n200,134\n200,135\n200,138\n200,175\n200,200\n200,215\n200,248\n200,364\n200,442\n200,502\n200,557\n200,632\n200,677\n200,693\n200,715\n200,772\n200,911\n200,953\n200,1011\n200,1016\n200,1188\n200,1282\n200,1415\n200,1462\n200,1844\n200,2105\n200,2376\n200,4276\n200,4308\n200,4398\n200,4448\n200,4478\n200,4613\n200,4939\n200,4940\n200,4941\n200,5393\n200,5399\n200,5405\n200,8126\n200,8133\n200,8537\n200,9529\n200,13207\n200,14674\n200,15646\n200,15807\n200,18515\n200,18673\n200,19617\n200,23755\n200,24341\n200,24789\n200,25041\n200,26980\n200,28203\n200,29740\n200,31243\n200,32244\n200,32630\n200,32722\n200,34358\n200,34828\n200,34883\n200,34920\n200,34951\n200,37741\n200,39770\n200,41391\n200,42541\n200,43327\n200,43352\n200,44947\n200,45546\n200,49745\n200,57910\n200,58894\n200,59208\n200,62480\n200,71048\n200,72922\n200,81508\n200,85814\n200,88354\n200,90147\n200,90210\n200,90274\n200,90417\n200,90683\n200,90943\n200,91923\n200,93173\n200,95554\n200,95570\n200,95571\n200,97367\n200,98833\n200,99125\n200,99146\n200,99807\n200,101890\n200,109568\n200,113968\n200,114064\n200,114090\n200,115317\n200,116712\n200,120092\n200,126009\n200,126032\n200,126377\n200,128866\n200,129813\n200,129919\n200,130243\n200,130820\n200,133538\n200,141745\n200,145039\n200,145341\n200,148929\n200,155021\n200,157043\n200,157690\n200,161973\n200,162573\n200,163744\n200,164945\n200,168362\n200,169148\n200,169155\n200,171293\n200,171298\n200,173863\n200,174323\n200,178253\n200,179065\n200,179208\n200,179338\n200,180899\n200,182852\n200,183802\n200,183839\n200,188747\n200,190369\n200,197671\n200,197779\n200,198024\n200,198205\n200,199668\n200,199836\n200,201893\n200,214652\n200,224299\n200,228149\n200,228318\n200,228425\n200,229893\n200,230537\n200,230541\n200,231099\n200,231929\n200,231991\n200,234839\n200,237260\n200,237687\n200,245926\n200,247093\n200,248568\n200,251601\n200,255105\n200,259037\n200,261804\n201,160\n201,202\n201,203\n201,206\n202,10\n202,50\n202,63\n202,79\n202,192\n202,202\n202,203\n202,217\n202,251\n202,252\n202,275\n202,314\n202,333\n202,336\n202,356\n202,389\n202,406\n202,425\n202,440\n202,493\n202,505\n202,516\n202,535\n202,599\n202,620\n202,622\n202,638\n202,663\n202,664\n202,668\n202,671\n202,673\n202,685\n202,693\n202,701\n202,713\n202,733\n202,794\n202,818\n202,826\n202,843\n202,849\n202,911\n202,1007\n202,1011\n202,1014\n202,1085\n202,1175\n202,1191\n202,1192\n202,1204\n202,1220\n202,1222\n202,1243\n202,1265\n202,1266\n202,1370\n202,1417\n202,1512\n202,1517\n202,1518\n202,1619\n202,1623\n202,1655\n202,1659\n202,1663\n202,1702\n202,1844\n202,1877\n202,1927\n202,1973\n202,2152\n202,2400\n202,2427\n202,2689\n202,2989\n202,2991\n202,3148\n202,3452\n202,3507\n202,4286\n202,4702\n202,5070\n202,5145\n202,5189\n202,5357\n202,5495\n202,5719\n202,5729\n202,5971\n202,5992\n202,6464\n202,6684\n202,7025\n202,7052\n202,7265\n202,7862\n202,7884\n202,8285\n202,8515\n202,8764\n202,8867\n202,9579\n202,13242\n202,13270\n202,14064\n202,14577\n202,14829\n202,14830\n202,16368\n202,16563\n202,16610\n202,16619\n202,16652\n202,16894\n202,17801\n202,18172\n202,18192\n202,18237\n202,18457\n202,20313\n202,20738\n202,20931\n202,21081\n202,21416\n202,21442\n202,21706\n202,24150\n202,24590\n202,24875\n202,24934\n202,25627\n202,26179\n202,26340\n202,26450\n202,27495\n202,29814\n202,29889\n202,30458\n202,30540\n202,33332\n202,33441\n202,34010\n202,34445\n202,34963\n202,38883\n202,39173\n202,39792\n202,40571\n202,41136\n202,41200\n202,41594\n202,42479\n202,42580\n202,42974\n202,43670\n202,45649\n202,45791\n202,46183\n202,48030\n202,48033\n202,48035\n202,48042\n202,48047\n202,48049\n202,48057\n202,48073\n202,48444\n202,48465\n202,48572\n202,48781\n202,48911\n202,49050\n202,49121\n202,49342\n202,50157\n202,54292\n202,55034\n202,55939\n202,56586\n202,56801\n202,58892\n202,58914\n202,59883\n202,60638\n202,62854\n202,63581\n202,63916\n202,64317\n202,69916\n202,70725\n202,72439\n202,73938\n202,75198\n202,78717\n202,80396\n202,89742\n202,90335\n202,90337\n202,92970\n202,93774\n202,93792\n202,95480\n202,95781\n202,96498\n202,99703\n202,100218\n202,102560\n202,102618\n202,103532\n202,103715\n202,103771\n202,105566\n202,106789\n202,107574\n202,109201\n202,109318\n202,109685\n202,110719\n202,114119\n202,114666\n202,114840\n202,115471\n202,116118\n202,116413\n202,116495\n202,116503\n202,116539\n202,117615\n202,119249\n202,120002\n202,120155\n202,120182\n202,122916\n202,124077\n202,124421\n202,124435\n202,124478\n202,125554\n202,126040\n202,127158\n202,128114\n202,128116\n202,130897\n202,131014\n202,131206\n202,133101\n202,133294\n202,134252\n202,134507\n202,137271\n202,137330\n202,138663\n202,144164\n202,144849\n202,147406\n202,149235\n202,150519\n202,150832\n202,161856\n202,164760\n202,165646\n202,170070\n202,171601\n202,171659\n202,174738\n202,175961\n202,176115\n202,176396\n202,179635\n202,179804\n202,181090\n202,181095\n202,181559\n202,182465\n202,182478\n202,182482\n202,183545\n202,185403\n202,185406\n202,185409\n202,185411\n202,185851\n202,186118\n202,186127\n202,186435\n202,187528\n202,188888\n202,189297\n202,190301\n202,191355\n202,199365\n202,201377\n202,201698\n202,203254\n202,203743\n202,203948\n202,203985\n202,206989\n202,212620\n202,213814\n202,214035\n202,214107\n202,214287\n202,215276\n202,215800\n202,215801\n202,215803\n202,216159\n202,218923\n202,219773\n202,222576\n202,224300\n202,228943\n202,229223\n202,229408\n202,230328\n202,230567\n202,231813\n202,232155\n202,237605\n202,242400\n202,243086\n202,243295\n202,243301\n202,244097\n202,245197\n202,245599\n202,245995\n202,247132\n202,249519\n202,251492\n202,252974\n202,253524\n202,253908\n202,255576\n202,255899\n202,257289\n202,257295\n202,257303\n202,257497\n202,258147\n202,258284\n202,259270\n202,259805\n202,260413\n202,262328\n203,63\n203,192\n203,202\n203,203\n203,251\n203,252\n203,275\n203,333\n203,425\n203,460\n203,465\n203,493\n203,516\n203,638\n203,663\n203,701\n203,826\n203,843\n203,911\n203,1014\n203,1192\n203,1266\n203,1400\n203,1456\n203,1568\n203,1619\n203,1655\n203,1794\n203,1877\n203,2085\n203,2100\n203,2125\n203,2152\n203,2400\n203,2427\n203,2666\n203,2689\n203,3905\n203,5181\n203,5189\n203,5495\n203,5877\n203,6464\n203,6467\n203,6684\n203,6818\n203,7036\n203,7052\n203,7064\n203,7265\n203,7862\n203,8062\n203,8392\n203,8515\n203,9725\n203,13177\n203,13687\n203,14057\n203,14829\n203,15980\n203,16368\n203,16619\n203,16652\n203,16894\n203,17856\n203,18172\n203,18192\n203,18355\n203,18391\n203,18573\n203,20484\n203,20577\n203,20714\n203,20738\n203,21210\n203,21981\n203,22642\n203,25839\n203,28797\n203,29889\n203,29928\n203,33288\n203,33441\n203,34096\n203,35063\n203,36795\n203,36997\n203,38131\n203,38154\n203,38883\n203,38886\n203,40238\n203,40333\n203,40471\n203,40571\n203,41594\n203,42479\n203,42580\n203,42974\n203,43120\n203,43670\n203,45531\n203,45649\n203,46183\n203,47420\n203,48073\n203,48290\n203,48444\n203,48506\n203,48911\n203,49050\n203,49071\n203,49247\n203,50157\n203,50394\n203,50533\n203,50534\n203,52400\n203,54292\n203,54327\n203,55939\n203,56320\n203,56558\n203,56651\n203,56938\n203,58425\n203,58892\n203,59206\n203,59224\n203,62854\n203,63581\n203,63916\n203,64317\n203,65698\n203,67861\n203,68200\n203,68224\n203,68603\n203,69916\n203,78940\n203,80552\n203,80956\n203,83190\n203,86191\n203,86441\n203,87273\n203,87321\n203,88575\n203,93061\n203,93770\n203,95539\n203,95588\n203,95781\n203,96498\n203,96540\n203,96543\n203,99128\n203,103170\n203,103171\n203,103172\n203,103175\n203,103176\n203,103178\n203,104312\n203,104366\n203,104629\n203,105504\n203,106164\n203,107009\n203,107014\n203,107574\n203,107593\n203,109318\n203,109419\n203,109945\n203,110719\n203,111259\n203,111298\n203,112226\n203,112227\n203,112238\n203,113437\n203,116201\n203,116652\n203,119249\n203,120096\n203,120155\n203,120192\n203,121095\n203,121108\n203,122031\n203,122163\n203,124478\n203,124958\n203,128005\n203,128114\n203,128116\n203,130897\n203,131209\n203,134507\n203,135130\n203,135137\n203,136163\n203,136518\n203,144152\n203,144980\n203,145390\n203,145584\n203,145608\n203,147329\n203,148822\n203,149235\n203,150080\n203,153617\n203,153814\n203,155028\n203,158136\n203,164211\n203,164760\n203,165046\n203,165218\n203,167623\n203,168256\n203,168990\n203,168991\n203,169058\n203,169358\n203,169820\n203,169998\n203,170001\n203,170037\n203,170540\n203,170699\n203,170700\n203,170701\n203,170702\n203,170703\n203,172646\n203,176894\n203,180224\n203,181731\n203,182325\n203,182412\n203,182482\n203,183458\n203,185023\n203,187778\n203,189297\n203,190434\n203,190501\n203,190529\n203,192559\n203,192890\n203,194257\n203,194502\n203,195019\n203,195067\n203,195115\n203,195727\n203,196152\n203,200581\n203,201377\n203,201698\n203,203193\n203,203196\n203,203199\n203,203200\n203,203894\n203,203983\n203,204170\n203,204763\n203,204765\n203,206342\n203,207048\n203,208624\n203,212030\n203,215276\n203,215527\n203,215528\n203,215923\n203,216651\n203,217891\n203,218413\n203,220029\n203,221247\n203,221946\n203,223740\n203,224042\n203,224684\n203,230328\n203,232238\n203,232565\n203,241964\n203,243469\n203,243471\n203,244793\n203,259433\n203,260989\n203,262338\n203,264026\n203,264539\n204,205\n205,205\n206,1\n206,10\n206,146\n206,147\n206,149\n206,158\n206,175\n206,184\n206,206\n206,336\n206,406\n206,505\n206,622\n206,841\n206,957\n206,1011\n206,1181\n206,1262\n206,1290\n206,1425\n206,1458\n206,1464\n206,1515\n206,1554\n206,1815\n206,1825\n206,2244\n206,2444\n206,2451\n206,2487\n206,2558\n206,2609\n206,2637\n206,2875\n206,2903\n206,3150\n206,3444\n206,3895\n206,4507\n206,4611\n206,5073\n206,5357\n206,5401\n206,5592\n206,5896\n206,6119\n206,6222\n206,6736\n206,6766\n206,6995\n206,7128\n206,7142\n206,7336\n206,7923\n206,8070\n206,8904\n206,9394\n206,13687\n206,13906\n206,15613\n206,15795\n206,16554\n206,16891\n206,16980\n206,17551\n206,17573\n206,18489\n206,19578\n206,19854\n206,19936\n206,21123\n206,21169\n206,21905\n206,22148\n206,22199\n206,22616\n206,22843\n206,23798\n206,24060\n206,25073\n206,25697\n206,26435\n206,30331\n206,30564\n206,31183\n206,31352\n206,35284\n206,35477\n206,36667\n206,38960\n206,41050\n206,41210\n206,41385\n206,42064\n206,43255\n206,43272\n206,44313\n206,44877\n206,45422\n206,46550\n206,47434\n206,47748\n206,47772\n206,48094\n206,49472\n206,49553\n206,50320\n206,51170\n206,51260\n206,51274\n206,56527\n206,57228\n206,58960\n206,59997\n206,60496\n206,60576\n206,60795\n206,70931\n206,71835\n206,71845\n206,77014\n206,77041\n206,77646\n206,80266\n206,81456\n206,82411\n206,85752\n206,88523\n206,89035\n206,89600\n206,89952\n206,92476\n206,106494\n206,107635\n206,107780\n206,109411\n206,109835\n206,115357\n206,115749\n206,117558\n206,118336\n206,121289\n206,121699\n206,124497\n206,124687\n206,124772\n206,125775\n206,128063\n206,128078\n206,129030\n206,129512\n206,137704\n206,138867\n206,142378\n206,147078\n206,147594\n206,148256\n206,148488\n206,148744\n206,159178\n206,159258\n206,159271\n206,164560\n206,167353\n206,170367\n206,170368\n206,172817\n206,172997\n206,175649\n206,177975\n206,181676\n206,182145\n206,183726\n206,188541\n206,190898\n206,193746\n206,206868\n206,212333\n206,221682\n206,226218\n206,230914\n206,231168\n206,241391\n206,246807\n206,246852\n206,248340\n206,255719\n206,257972\n206,261999\n207,11\n207,20\n207,22\n207,65\n207,182\n207,186\n207,207\n207,259\n207,287\n207,299\n207,314\n207,326\n207,338\n207,347\n207,356\n207,392\n207,397\n207,424\n207,425\n207,433\n207,452\n207,457\n207,535\n207,599\n207,663\n207,668\n207,673\n207,676\n207,702\n207,752\n207,818\n207,849\n207,873\n207,874\n207,911\n207,918\n207,1011\n207,1014\n207,1085\n207,1118\n207,1130\n207,1133\n207,1210\n207,1276\n207,1326\n207,1417\n207,1434\n207,1559\n207,1566\n207,1607\n207,1634\n207,1655\n207,1663\n207,1796\n207,1973\n207,2373\n207,2512\n207,2580\n207,3018\n207,3582\n207,4272\n207,4514\n207,5192\n207,5667\n207,6824\n207,6891\n207,6904\n207,7759\n207,13198\n207,17897\n207,19010\n207,19413\n207,23056\n207,26058\n207,31731\n207,45574\n207,46992\n207,47158\n207,49373\n207,56410\n207,60986\n207,61270\n207,65724\n207,70871\n207,79920\n207,82237\n207,86641\n207,91933\n207,96711\n207,99027\n207,102698\n207,106135\n207,116878\n207,118336\n207,118363\n207,121007\n207,127978\n207,128825\n207,139793\n207,145707\n207,147515\n207,152893\n207,167684\n207,175756\n207,182465\n207,182498\n207,185472\n207,187139\n207,189742\n207,192320\n207,207659\n207,211883\n207,215874\n207,220937\n208,209\n209,192\n209,256\n209,314\n209,397\n209,440\n209,452\n209,457\n209,599\n209,673\n209,676\n209,685\n209,843\n209,849\n209,852\n209,929\n209,1011\n209,1014\n209,1118\n209,1130\n209,1172\n209,1191\n209,1566\n209,1796\n209,1844\n209,1973\n209,2373\n209,3524\n209,6904\n209,9457\n209,14674\n209,19413\n209,215874\n209,234257\n210,211\n211,175\n211,192\n211,211\n211,240\n211,327\n211,356\n211,440\n211,441\n211,500\n211,510\n211,685\n211,718\n211,794\n211,849\n211,911\n211,949\n211,1001\n211,1010\n211,1014\n211,1118\n211,1163\n211,1235\n211,1305\n211,1332\n211,1335\n211,1412\n211,1623\n211,1796\n211,1844\n211,1849\n211,1855\n211,2105\n211,2665\n211,2867\n211,2868\n211,3407\n211,3933\n211,5174\n211,5700\n211,6292\n211,6556\n211,6637\n211,7487\n211,8287\n211,8700\n211,8805\n211,13357\n211,14024\n211,14403\n211,14726\n211,15087\n211,15230\n211,15414\n211,15560\n211,15621\n211,15834\n211,15958\n211,17151\n211,17679\n211,18025\n211,18108\n211,18256\n211,18667\n211,19505\n211,19783\n211,20890\n211,22261\n211,22296\n211,22476\n211,22880\n211,24358\n211,24924\n211,26345\n211,27149\n211,28407\n211,28424\n211,28428\n211,29114\n211,30613\n211,30746\n211,31229\n211,31382\n211,31802\n211,33487\n211,38429\n211,38860\n211,38934\n211,39621\n211,41136\n211,43744\n211,44949\n211,45149\n211,45195\n211,45577\n211,49507\n211,49531\n211,49552\n211,49594\n211,49610\n211,49626\n211,49650\n211,49725\n211,50573\n211,54621\n211,57978\n211,59083\n211,61677\n211,64687\n211,66831\n211,71770\n211,72888\n211,74065\n211,74716\n211,76234\n211,82122\n211,84903\n211,85994\n211,86004\n211,86017\n211,86361\n211,87789\n211,88467\n211,88630\n211,89306\n211,92985\n211,103236\n211,106247\n211,112548\n211,114193\n211,114211\n211,117716\n211,122318\n211,127103\n211,130143\n211,130431\n211,134779\n211,142481\n211,143107\n211,160336\n211,163150\n211,164396\n211,170750\n211,171346\n211,177981\n211,178478\n211,182037\n211,185596\n211,185615\n211,185833\n211,186229\n211,186247\n211,187271\n211,196133\n211,212650\n211,216834\n211,216853\n211,218584\n211,220478\n211,221179\n211,226195\n211,228518\n211,229809\n211,229987\n211,236154\n211,236192\n211,236196\n211,237443\n211,242288\n211,255930\n211,256527\n211,259479\n211,261835\n212,52\n212,1773\n212,9598\n212,140269\n214,215\n215,81\n215,215\n215,373\n215,502\n215,503\n215,590\n215,704\n215,715\n215,1257\n215,1282\n215,1402\n215,1850\n215,2052\n215,2210\n215,3085\n215,3866\n215,4032\n215,4367\n215,5278\n215,13860\n215,14204\n215,14850\n215,15221\n215,16511\n215,16755\n215,17163\n215,17172\n215,18673\n215,34330\n215,35429\n215,37488\n215,39307\n215,45061\n215,45064\n215,45068\n215,45069\n215,45070\n215,45071\n215,45074\n215,45076\n215,45078\n215,45081\n215,45083\n215,45084\n215,45089\n215,45091\n215,45122\n215,45123\n215,48146\n215,48599\n215,49603\n215,54398\n215,59273\n215,64984\n215,66334\n215,66348\n215,70062\n215,70065\n215,70068\n215,70069\n215,70072\n215,72819\n215,74505\n215,78941\n215,92055\n215,97526\n215,103964\n215,104465\n215,110620\n215,112510\n215,113622\n215,120989\n215,129071\n215,130973\n215,136125\n215,136224\n215,136227\n215,142939\n215,150439\n215,157598\n215,161968\n215,162695\n215,176473\n215,176782\n215,181187\n215,182124\n215,182162\n215,191338\n215,194505\n215,195564\n215,220541\n215,239150\n215,245556\n215,247863\n215,247876\n215,247888\n215,254556\n215,255028\n215,255099\n215,255906\n216,217\n217,187\n217,217\n218,219\n219,218\n219,219\n219,2624\n219,2920\n219,3823\n219,7942\n219,8035\n219,8440\n219,14235\n219,14466\n219,16106\n219,18584\n219,18762\n219,21688\n219,22422\n219,25807\n219,27039\n219,28080\n219,32339\n219,33102\n219,37678\n219,39682\n219,40777\n219,40870\n219,41541\n219,42194\n219,42952\n219,47552\n219,48189\n219,49814\n219,50634\n219,50635\n219,50855\n219,51738\n219,53497\n219,61714\n219,62609\n219,62971\n219,64096\n219,64634\n219,65421\n219,69769\n219,69776\n219,73972\n219,75400\n219,76857\n219,77968\n219,80930\n219,86560\n219,92342\n219,106117\n219,106129\n219,107181\n219,107455\n219,112375\n219,117278\n219,123568\n219,124071\n219,126643\n219,129558\n219,133143\n219,134774\n219,135302\n219,135303\n219,135304\n219,135305\n219,135306\n219,136149\n219,141591\n219,142019\n219,149678\n219,150097\n219,150813\n219,154103\n220,138\n220,2674\n220,16153\n221,222\n222,10\n222,19\n222,34\n222,35\n222,83\n222,187\n222,217\n222,222\n222,278\n222,283\n222,313\n222,379\n222,389\n222,404\n222,452\n222,455\n222,477\n222,536\n222,562\n222,599\n222,634\n222,657\n222,781\n222,814\n222,852\n222,891\n222,923\n222,929\n222,949\n222,1005\n222,1019\n222,1052\n222,1069\n222,1072\n222,1274\n222,1367\n222,1417\n222,1467\n222,1525\n222,1566\n222,1571\n222,1607\n222,1618\n222,1663\n222,1698\n222,1722\n222,1756\n222,1871\n222,1905\n222,1995\n222,2092\n222,2103\n222,2159\n222,2168\n222,2224\n222,2266\n222,2290\n222,2318\n222,2319\n222,2322\n222,2418\n222,2421\n222,2619\n222,2646\n222,2652\n222,2784\n222,2815\n222,2944\n222,3234\n222,3507\n222,3527\n222,3542\n222,3646\n222,3672\n222,3686\n222,4007\n222,4076\n222,4207\n222,4321\n222,4377\n222,4388\n222,4440\n222,4457\n222,4637\n222,4672\n222,5178\n222,5208\n222,5265\n222,5307\n222,5326\n222,5343\n222,5458\n222,5591\n222,5702\n222,5711\n222,5887\n222,6032\n222,6240\n222,6437\n222,6506\n222,6789\n222,6828\n222,6890\n222,6913\n222,6960\n222,7075\n222,7092\n222,7301\n222,7347\n222,7698\n222,7768\n222,8140\n222,8156\n222,8431\n222,8435\n222,9756\n222,13137\n222,13240\n222,13328\n222,13549\n222,13597\n222,13607\n222,13622\n222,13980\n222,14068\n222,14303\n222,14311\n222,14384\n222,14410\n222,14507\n222,14511\n222,14517\n222,14604\n222,15325\n222,15698\n222,15708\n222,16357\n222,16412\n222,16420\n222,16676\n222,17223\n222,17811\n222,17837\n222,18165\n222,18344\n222,18433\n222,18572\n222,18650\n222,18832\n222,19352\n222,19358\n222,19420\n222,19542\n222,19552\n222,19660\n222,19681\n222,19797\n222,19818\n222,19823\n222,19829\n222,19831\n222,19845\n222,20309\n222,20393\n222,20426\n222,20583\n222,20603\n222,20723\n222,20747\n222,21233\n222,21414\n222,21449\n222,21519\n222,21548\n222,21561\n222,21612\n222,21639\n222,22172\n222,23520\n222,23839\n222,24628\n222,24672\n222,24696\n222,24917\n222,25069\n222,25521\n222,25670\n222,26804\n222,28116\n222,28373\n222,28511\n222,28533\n222,28671\n222,28724\n222,28800\n222,29177\n222,29260\n222,30328\n222,31738\n222,31801\n222,31903\n222,32238\n222,32462\n222,32742\n222,32962\n222,33508\n222,34390\n222,34401\n222,34504\n222,34742\n222,34756\n222,35695\n222,36308\n222,36594\n222,36626\n222,36692\n222,36813\n222,36980\n222,37088\n222,37095\n222,37254\n222,38030\n222,38153\n222,38972\n222,40099\n222,40500\n222,40671\n222,41333\n222,41443\n222,41490\n222,41951\n222,41981\n222,42691\n222,42854\n222,43273\n222,43303\n222,43573\n222,43660\n222,44077\n222,44135\n222,44301\n222,44329\n222,44624\n222,44750\n222,44886\n222,44915\n222,44973\n222,45197\n222,48208\n222,48515\n222,49113\n222,49177\n222,49363\n222,49379\n222,49385\n222,49388\n222,49753\n222,49948\n222,50851\n222,51126\n222,51652\n222,54328\n222,54484\n222,54948\n222,55035\n222,55123\n222,55195\n222,55201\n222,55248\n222,55329\n222,55371\n222,55412\n222,55608\n222,55984\n222,56584\n222,56600\n222,57105\n222,57419\n222,57907\n222,59109\n222,59805\n222,61355\n222,62286\n222,62459\n222,63016\n222,63032\n222,63065\n222,63410\n222,63510\n222,63519\n222,64479\n222,64611\n222,65965\n222,66703\n222,66885\n222,67931\n222,68068\n222,68164\n222,68173\n222,68207\n222,68646\n222,68704\n222,70106\n222,70228\n222,70295\n222,70888\n222,74600\n222,74658\n222,75094\n222,76971\n222,77098\n222,77659\n222,79327\n222,79589\n222,79840\n222,80949\n222,80993\n222,81135\n222,81194\n222,82150\n222,82313\n222,82570\n222,82628\n222,82718\n222,82779\n222,82922\n222,83314\n222,83451\n222,83550\n222,83745\n222,84404\n222,84452\n222,86180\n222,86730\n222,90076\n222,91396\n222,91398\n222,91790\n222,91814\n222,91816\n222,93041\n222,93158\n222,93636\n222,94342\n222,95226\n222,96240\n222,96266\n222,96788\n222,96913\n222,97393\n222,97910\n222,98329\n222,101649\n222,101851\n222,102372\n222,102569\n222,104228\n222,104691\n222,105198\n222,106104\n222,106112\n222,107167\n222,107199\n222,107356\n222,107458\n222,107598\n222,107954\n222,107999\n222,109036\n222,109537\n222,109894\n222,109967\n222,110484\n222,110725\n222,110757\n222,111089\n222,112466\n222,113277\n222,113481\n222,113496\n222,113506\n222,113738\n222,113863\n222,114314\n222,114748\n222,115139\n222,115188\n222,115294\n222,115297\n222,115352\n222,115474\n222,115672\n222,115775\n222,115804\n222,115806\n222,116074\n222,116271\n222,116497\n222,116541\n222,116649\n222,116790\n222,116809\n222,117030\n222,117083\n222,117135\n222,117142\n222,117144\n222,117151\n222,117308\n222,117680\n222,117994\n222,118872\n222,119557\n222,120840\n222,121095\n222,121179\n222,121569\n222,121599\n222,121724\n222,123104\n222,124066\n222,124390\n222,124644\n222,124650\n222,124970\n222,125046\n222,125340\n222,125588\n222,125589\n222,125848\n222,125877\n222,125963\n222,125980\n222,126060\n222,126953\n222,126989\n222,127011\n222,127504\n222,127656\n222,127876\n222,128718\n222,129236\n222,130275\n222,130415\n222,130529\n222,130732\n222,130861\n222,131216\n222,131521\n222,131652\n222,131748\n222,132868\n222,133075\n222,133086\n222,133105\n222,134058\n222,134174\n222,134597\n222,134631\n222,135129\n222,136063\n222,136077\n222,138731\n222,139685\n222,140179\n222,140342\n222,142259\n222,144323\n222,144729\n222,144771\n222,145333\n222,145720\n222,146304\n222,148837\n222,148942\n222,149115\n222,149153\n222,149223\n222,149695\n222,150058\n222,150445\n222,150858\n222,151603\n222,152583\n222,152592\n222,152915\n222,153273\n222,154192\n222,154198\n222,156296\n222,157003\n222,157899\n222,158614\n222,159824\n222,159983\n222,160398\n222,160975\n222,161203\n222,161990\n222,162448\n222,162755\n222,163160\n222,164358\n222,166019\n222,167588\n222,169212\n222,169377\n222,169947\n222,171300\n222,173482\n222,174955\n222,175919\n222,177718\n222,178208\n222,179678\n222,181063\n222,182424\n222,182467\n222,183462\n222,183555\n222,183855\n222,183873\n222,184611\n222,184641\n222,185439\n222,186319\n222,186643\n222,186645\n222,186647\n222,186648\n222,186900\n222,189443\n222,190932\n222,191378\n222,192652\n222,193446\n222,194923\n222,195047\n222,195735\n222,198688\n222,203906\n222,205816\n222,212154\n222,216666\n222,216852\n222,217532\n222,219838\n222,220296\n222,220369\n222,221547\n222,221664\n222,221679\n222,223336\n222,223656\n222,224100\n222,224807\n222,224858\n222,227164\n222,227167\n222,227656\n222,228277\n222,228604\n222,229596\n222,229714\n222,229754\n222,229812\n222,229995\n222,230590\n222,231037\n222,231936\n222,232159\n222,234026\n222,236791\n222,237497\n222,241507\n222,244642\n222,244732\n222,245262\n222,245496\n222,248493\n222,248715\n222,252306\n222,252552\n222,252750\n222,254306\n222,254892\n222,258112\n222,258309\n222,258342\n222,258357\n222,261990\n223,224\n223,13955\n223,16895\n223,17960\n223,22651\n223,24921\n223,35973\n223,37286\n225,30\n225,104\n225,134\n225,135\n225,137\n225,211\n225,225\n225,226\n225,248\n225,288\n225,364\n225,431\n225,462\n225,557\n225,599\n225,636\n225,772\n225,850\n225,943\n225,954\n225,989\n225,1058\n225,1332\n225,1412\n225,1415\n225,1831\n225,1849\n225,1867\n225,1980\n225,2596\n225,2689\n225,3585\n225,3633\n225,4039\n225,5215\n225,5405\n225,6231\n225,6828\n225,7414\n225,8285\n225,13207\n225,13380\n225,13506\n225,13522\n225,14134\n225,14417\n225,14516\n225,14820\n225,14945\n225,15078\n225,18803\n225,19888\n225,20357\n225,20391\n225,20645\n225,23799\n225,26431\n225,26432\n225,26436\n225,26459\n225,26481\n225,26840\n225,28112\n225,35685\n225,37651\n225,38347\n225,39579\n225,40842\n225,42762\n225,42807\n225,45149\n225,45550\n225,45602\n225,46152\n225,46776\n225,48920\n225,59006\n225,60464\n225,67067\n225,71584\n225,73441\n225,79928\n225,81703\n225,84695\n225,85814\n225,87889\n225,88561\n225,92928\n225,93104\n225,96589\n225,97195\n225,104555\n225,105641\n225,114508\n225,131216\n225,132900\n225,142367\n225,146431\n225,148297\n225,151495\n225,152127\n225,154795\n225,159110\n225,164844\n225,167698\n225,185379\n225,196128\n225,197801\n225,200539\n225,201718\n225,229092\n225,229139\n225,231489\n225,235262\n225,235660\n225,238506\n225,243521\n226,225\n228,83\n229,81\n231,4\n231,5\n231,94\n231,6621\n231,19466\n231,79521\n232,3\n232,233\n232,347\n232,932\n232,230509\n232,230517\n233,10\n233,41\n233,42\n233,134\n233,175\n233,233\n233,289\n233,290\n233,328\n233,372\n233,457\n233,510\n233,589\n233,677\n233,685\n233,704\n233,714\n233,911\n233,966\n233,1001\n233,1045\n233,1085\n233,1165\n233,1195\n233,1276\n233,1285\n233,1343\n233,1402\n233,1608\n233,2193\n233,2205\n233,2286\n233,2747\n233,3135\n233,3565\n233,4308\n233,5265\n233,5706\n233,6748\n233,7975\n233,8229\n233,16545\n233,19721\n233,22168\n233,28224\n233,33424\n233,33660\n233,34921\n233,35095\n233,35704\n233,41154\n233,41247\n233,41463\n233,42952\n233,44380\n233,47706\n233,47709\n233,47710\n233,48975\n233,49879\n233,55006\n233,55007\n233,55813\n233,57634\n233,61110\n233,62393\n233,63409\n233,64840\n233,75383\n233,75754\n233,75795\n233,75912\n233,77006\n233,81018\n233,88120\n233,94134\n233,110011\n233,110136\n233,120157\n233,120925\n233,135944\n233,136146\n233,140679\n233,150593\n233,165086\n233,173388\n233,178600\n233,212626\n233,216704\n233,216763\n233,217836\n233,236126\n233,238333\n233,240864\n233,245910\n234,235\n236,10\n236,236\n236,2681\n236,3316\n236,9598\n236,140269\n237,52\n237,175\n237,140269\n237,178458\n237,206059\n237,227644\n238,147\n238,333\n238,622\n239,240\n240,34\n240,35\n240,49\n240,50\n240,68\n240,104\n240,120\n240,167\n240,182\n240,186\n240,192\n240,211\n240,217\n240,240\n240,248\n240,255\n240,261\n240,264\n240,289\n240,290\n240,301\n240,314\n240,332\n240,372\n240,387\n240,390\n240,392\n240,397\n240,406\n240,413\n240,435\n240,444\n240,452\n240,457\n240,467\n240,495\n240,500\n240,510\n240,512\n240,515\n240,535\n240,536\n240,586\n240,590\n240,592\n240,599\n240,611\n240,631\n240,673\n240,676\n240,677\n240,685\n240,693\n240,715\n240,784\n240,805\n240,808\n240,818\n240,819\n240,823\n240,849\n240,872\n240,973\n240,1001\n240,1010\n240,1011\n240,1014\n240,1019\n240,1082\n240,1085\n240,1118\n240,1151\n240,1181\n240,1203\n240,1210\n240,1262\n240,1284\n240,1285\n240,1309\n240,1326\n240,1353\n240,1359\n240,1361\n240,1370\n240,1402\n240,1417\n240,1434\n240,1462\n240,1466\n240,1518\n240,1531\n240,1564\n240,1566\n240,1608\n240,1663\n240,1705\n240,1715\n240,1779\n240,1785\n240,1796\n240,1807\n240,1808\n240,1818\n240,1853\n240,1888\n240,1945\n240,1955\n240,2069\n240,2083\n240,2142\n240,2173\n240,2235\n240,2252\n240,2411\n240,2511\n240,2512\n240,2590\n240,2620\n240,2729\n240,2775\n240,2812\n240,2838\n240,2841\n240,2989\n240,2991\n240,3028\n240,3094\n240,3115\n240,3135\n240,3250\n240,3328\n240,3397\n240,3504\n240,3508\n240,3524\n240,3580\n240,3738\n240,3810\n240,3814\n240,3832\n240,3838\n240,3879\n240,3937\n240,3942\n240,4179\n240,4220\n240,4267\n240,4514\n240,4532\n240,4540\n240,4759\n240,4771\n240,5192\n240,5228\n240,5278\n240,5361\n240,5412\n240,5654\n240,5718\n240,5765\n240,5876\n240,6004\n240,6525\n240,6556\n240,6562\n240,6824\n240,6837\n240,6853\n240,6856\n240,6895\n240,6904\n240,6995\n240,7041\n240,7076\n240,7338\n240,7344\n240,7481\n240,7880\n240,8064\n240,8243\n240,8322\n240,8323\n240,8535\n240,8537\n240,9015\n240,9025\n240,9178\n240,9457\n240,11952\n240,12871\n240,13198\n240,13207\n240,13274\n240,13524\n240,13637\n240,13641\n240,14243\n240,14286\n240,14398\n240,14405\n240,14484\n240,14554\n240,14613\n240,14874\n240,15169\n240,15206\n240,15277\n240,15424\n240,15556\n240,15648\n240,15658\n240,15763\n240,15840\n240,15931\n240,16401\n240,16414\n240,16518\n240,16653\n240,17173\n240,17207\n240,17535\n240,17848\n240,18245\n240,18299\n240,18440\n240,18528\n240,18601\n240,18620\n240,18629\n240,18647\n240,18795\n240,19468\n240,19474\n240,19592\n240,19617\n240,19859\n240,20190\n240,20350\n240,20560\n240,20609\n240,20747\n240,20757\n240,20810\n240,20947\n240,21420\n240,21580\n240,21589\n240,22029\n240,22062\n240,22281\n240,22318\n240,22337\n240,22339\n240,22440\n240,22808\n240,23069\n240,23102\n240,23683\n240,24307\n240,24815\n240,24851\n240,24896\n240,25417\n240,25685\n240,26133\n240,26228\n240,26318\n240,26362\n240,26789\n240,27041\n240,27116\n240,27242\n240,27827\n240,27903\n240,28545\n240,28553\n240,28573\n240,29079\n240,29120\n240,29132\n240,29133\n240,29595\n240,29684\n240,29787\n240,30051\n240,30502\n240,30577\n240,31729\n240,32650\n240,32906\n240,33424\n240,33608\n240,33968\n240,34515\n240,34921\n240,35304\n240,35612\n240,35855\n240,36992\n240,37407\n240,37483\n240,37509\n240,37764\n240,38353\n240,38743\n240,39046\n240,39300\n240,39673\n240,39682\n240,39684\n240,39687\n240,39690\n240,39691\n240,39697\n240,39698\n240,40531\n240,40824\n240,42545\n240,42895\n240,42977\n240,43194\n240,43264\n240,43305\n240,43407\n240,43846\n240,44191\n240,44809\n240,44869\n240,44904\n240,44932\n240,45231\n240,45760\n240,46293\n240,46316\n240,46499\n240,46614\n240,46979\n240,47371\n240,47760\n240,48418\n240,48612\n240,48718\n240,48845\n240,49297\n240,49337\n240,49570\n240,49627\n240,49741\n240,50203\n240,51359\n240,51431\n240,51434\n240,52539\n240,52585\n240,54060\n240,54551\n240,55149\n240,55168\n240,55977\n240,56455\n240,56465\n240,56469\n240,58290\n240,58331\n240,58382\n240,58489\n240,58564\n240,58990\n240,59012\n240,59058\n240,59222\n240,59226\n240,59368\n240,59657\n240,59706\n240,60463\n240,61064\n240,61261\n240,61324\n240,62431\n240,62970\n240,63054\n240,63081\n240,63102\n240,63107\n240,64341\n240,64720\n240,65767\n240,65856\n240,65860\n240,65914\n240,66404\n240,66618\n240,66774\n240,67185\n240,67220\n240,68057\n240,68219\n240,69133\n240,69854\n240,70886\n240,71294\n240,71708\n240,71851\n240,72639\n240,72684\n240,72889\n240,72907\n240,73264\n240,73287\n240,73387\n240,73400\n240,75382\n240,75912\n240,76732\n240,79642\n240,80131\n240,80378\n240,80488\n240,81006\n240,81123\n240,82887\n240,83301\n240,83343\n240,83406\n240,83434\n240,83651\n240,83766\n240,87929\n240,91505\n240,93399\n240,93566\n240,93959\n240,94134\n240,94315\n240,95616\n240,96320\n240,96686\n240,96782\n240,97766\n240,98275\n240,102687\n240,102797\n240,103356\n240,104590\n240,104825\n240,105006\n240,106613\n240,107181\n240,108020\n240,109999\n240,110126\n240,110155\n240,110217\n240,112508\n240,112906\n240,113147\n240,113557\n240,114675\n240,114738\n240,114908\n240,115608\n240,115670\n240,116567\n240,116572\n240,116637\n240,117799\n240,118377\n240,118425\n240,118490\n240,118523\n240,118678\n240,120136\n240,120239\n240,121664\n240,122051\n240,122120\n240,122572\n240,122667\n240,123007\n240,123049\n240,124472\n240,124872\n240,125604\n240,126053\n240,127025\n240,127026\n240,127158\n240,127771\n240,130889\n240,133118\n240,134904\n240,135821\n240,136232\n240,137820\n240,139659\n240,139943\n240,140337\n240,140594\n240,140928\n240,141377\n240,141625\n240,142005\n240,143740\n240,145107\n240,145639\n240,145977\n240,146001\n240,146180\n240,148115\n240,148128\n240,148275\n240,149632\n240,150015\n240,150211\n240,150358\n240,150770\n240,152152\n240,152436\n240,152447\n240,152551\n240,153008\n240,155021\n240,156679\n240,158349\n240,158684\n240,158955\n240,159483\n240,160394\n240,160505\n240,160820\n240,160861\n240,160922\n240,161534\n240,161940\n240,162654\n240,162844\n240,163610\n240,164235\n240,164246\n240,164301\n240,164371\n240,165012\n240,166329\n240,166667\n240,166704\n240,168271\n240,168587\n240,169076\n240,169444\n240,169685\n240,170032\n240,170647\n240,171090\n240,171648\n240,172101\n240,173686\n240,173698\n240,173907\n240,173956\n240,174910\n240,175488\n240,177026\n240,177455\n240,178060\n240,179804\n240,181581\n240,181913\n240,181922\n240,181945\n240,182308\n240,182631\n240,183577\n240,185974\n240,186020\n240,186398\n240,186576\n240,188732\n240,188791\n240,188887\n240,189724\n240,189980\n240,191389\n240,192119\n240,192191\n240,192903\n240,193046\n240,193485\n240,193634\n240,194481\n240,195629\n240,195664\n240,202661\n240,204423\n240,212906\n240,215874\n240,216237\n240,216525\n240,216688\n240,217316\n240,218790\n240,218884\n240,219229\n240,219266\n240,226253\n240,226398\n240,226520\n240,227199\n240,228081\n240,228844\n240,229795\n240,231911\n240,232503\n240,232887\n240,232893\n240,233480\n240,233483\n240,233632\n240,233670\n240,234072\n240,234214\n240,236551\n240,237501\n240,238532\n240,239004\n240,241022\n240,242290\n240,243193\n240,243376\n240,243467\n240,243937\n240,244050\n240,246163\n240,247042\n240,247075\n240,248733\n240,249055\n240,250713\n240,251481\n240,253226\n240,255113\n240,256470\n240,258045\n240,263869\n241,83\n242,1\n242,20\n242,48\n242,63\n242,72\n242,81\n242,86\n242,107\n242,130\n242,135\n242,137\n242,146\n242,149\n242,151\n242,163\n242,182\n242,184\n242,192\n242,207\n242,209\n242,247\n242,250\n242,251\n242,252\n242,254\n242,256\n242,258\n242,259\n242,262\n242,264\n242,272\n242,273\n242,274\n242,275\n242,278\n242,280\n242,283\n242,289\n242,290\n242,299\n242,302\n242,305\n242,306\n242,307\n242,309\n242,310\n242,313\n242,314\n242,315\n242,326\n242,337\n242,338\n242,347\n242,352\n242,356\n242,406\n242,581\n242,626\n242,647\n242,668\n242,736\n242,805\n242,843\n242,852\n242,861\n242,893\n242,920\n242,934\n242,972\n242,1147\n242,1220\n242,1222\n242,1247\n242,1309\n242,1381\n242,1449\n242,1465\n242,1684\n242,1707\n242,1796\n242,1818\n242,1844\n242,2048\n242,2244\n242,2837\n242,3989\n242,8993\n242,9457\n243,26\n243,59\n244,245\n246,30\n247,10\n247,247\n248,30\n248,104\n248,134\n248,248\n248,249\n248,314\n248,364\n248,450\n248,457\n248,557\n248,599\n248,714\n248,772\n248,850\n248,1179\n248,1329\n248,1332\n248,1462\n248,1796\n248,2069\n248,2206\n248,3020\n248,3031\n248,3719\n248,4276\n248,7059\n248,8200\n248,13207\n248,13220\n248,20604\n248,22776\n248,29831\n248,33302\n248,62323\n249,248\n250,1557\n251,10\n251,63\n251,202\n251,203\n251,251\n251,252\n251,275\n251,316\n251,318\n251,425\n251,446\n251,457\n251,460\n251,464\n251,465\n251,493\n251,516\n251,599\n251,682\n251,685\n251,733\n251,911\n251,920\n251,1014\n251,1220\n251,1222\n251,1243\n251,1385\n251,1512\n251,1568\n251,1702\n251,1794\n251,1899\n251,2125\n251,2427\n251,2782\n251,4273\n251,4492\n251,5307\n251,5992\n251,6075\n251,7103\n251,7532\n251,7863\n251,8106\n251,13720\n251,14507\n251,15055\n251,16010\n251,16014\n251,16497\n251,18733\n251,19651\n251,20295\n251,21081\n251,21210\n251,24237\n251,24600\n251,24934\n251,28354\n251,30393\n251,34908\n251,38899\n251,39012\n251,39063\n251,39178\n251,41170\n251,44196\n251,45663\n251,46870\n251,48040\n251,49172\n251,50116\n251,50396\n251,50855\n251,51961\n251,54438\n251,55663\n251,56801\n251,57487\n251,61007\n251,62854\n251,62902\n251,66033\n251,69713\n251,70432\n251,70930\n251,72439\n251,72644\n251,79359\n251,80206\n251,81121\n251,83338\n251,91359\n251,91865\n251,92881\n251,93206\n251,93311\n251,94906\n251,112246\n251,113341\n251,113408\n251,114177\n251,117851\n251,117926\n251,123103\n251,128170\n251,129716\n251,130897\n251,135904\n251,136163\n251,138169\n251,142478\n251,142971\n251,144827\n251,144940\n251,147559\n251,153212\n251,159387\n251,159390\n251,159392\n251,161959\n251,166572\n251,166576\n251,166584\n251,168250\n251,168374\n251,171375\n251,171497\n251,176019\n251,176976\n251,177321\n251,182433\n251,189788\n251,191780\n251,191984\n251,193079\n251,193092\n251,197603\n251,199656\n251,201025\n251,201028\n251,201723\n251,201825\n251,201866\n251,202086\n251,204466\n251,205307\n251,206236\n251,206241\n251,207522\n251,207549\n251,207565\n251,212288\n251,212289\n251,212290\n251,212291\n251,212370\n251,212411\n251,214552\n251,215596\n251,216633\n251,217905\n251,226288\n251,228201\n251,234097\n251,234688\n251,235721\n251,245805\n251,249210\n251,251255\n251,255768\n251,255896\n251,259550\n252,63\n252,65\n252,106\n252,147\n252,149\n252,158\n252,202\n252,203\n252,251\n252,252\n252,275\n252,314\n252,316\n252,318\n252,336\n252,406\n252,457\n252,465\n252,493\n252,516\n252,599\n252,622\n252,682\n252,685\n252,733\n252,911\n252,920\n252,1014\n252,1118\n252,1220\n252,1222\n252,1243\n252,1263\n252,1266\n252,1385\n252,1472\n252,1512\n252,1517\n252,1568\n252,1655\n252,1702\n252,1927\n252,2400\n252,2874\n252,3158\n252,3199\n252,3582\n252,3866\n252,4150\n252,4539\n252,4612\n252,5762\n252,5816\n252,5991\n252,5992\n252,6075\n252,7103\n252,7532\n252,8606\n252,9107\n252,13226\n252,13269\n252,13374\n252,13436\n252,13525\n252,13607\n252,13720\n252,14203\n252,15467\n252,15624\n252,15733\n252,16010\n252,16014\n252,16298\n252,17884\n252,19651\n252,20295\n252,21409\n252,22013\n252,22204\n252,22528\n252,22553\n252,23341\n252,23650\n252,23734\n252,24933\n252,26034\n252,27003\n252,27006\n252,29246\n252,29960\n252,30551\n252,30682\n252,30990\n252,31148\n252,31152\n252,31433\n252,32166\n252,33354\n252,34899\n252,35830\n252,36967\n252,37033\n252,37034\n252,37366\n252,37697\n252,37698\n252,37771\n252,38458\n252,38899\n252,38922\n252,39012\n252,39034\n252,41170\n252,41230\n252,41236\n252,41986\n252,44390\n252,44859\n252,45002\n252,46169\n252,47318\n252,47555\n252,48162\n252,48524\n252,49172\n252,49195\n252,50356\n252,50434\n252,50454\n252,50476\n252,50484\n252,50608\n252,50626\n252,54361\n252,54365\n252,55663\n252,56616\n252,56992\n252,57093\n252,59729\n252,63387\n252,64563\n252,64598\n252,68109\n252,70404\n252,70901\n252,71985\n252,72043\n252,72439\n252,72582\n252,73510\n252,74457\n252,74514\n252,74759\n252,75799\n252,76137\n252,77909\n252,78872\n252,78883\n252,78892\n252,78975\n252,79018\n252,79522\n252,82349\n252,84005\n252,84626\n252,85979\n252,87830\n252,88636\n252,94931\n252,94982\n252,96615\n252,97075\n252,97530\n252,98227\n252,102789\n252,104605\n252,106917\n252,106960\n252,106961\n252,107426\n252,108042\n252,110768\n252,112905\n252,113855\n252,116534\n252,116692\n252,116908\n252,117075\n252,117123\n252,117720\n252,117959\n252,118394\n252,125564\n252,127491\n252,127705\n252,131893\n252,138344\n252,143560\n252,145026\n252,145106\n252,146794\n252,150052\n252,151519\n252,153212\n252,154376\n252,155009\n252,155011\n252,156729\n252,157974\n252,160511\n252,160512\n252,163543\n252,164225\n252,164860\n252,165021\n252,165762\n252,166363\n252,166370\n252,166733\n252,167061\n252,169865\n252,171059\n252,171333\n252,171375\n252,172171\n252,172766\n252,175294\n252,175611\n252,175779\n252,176794\n252,176993\n252,177397\n252,179164\n252,184953\n252,189788\n252,189794\n252,189839\n252,189842\n252,190413\n252,193255\n252,201285\n252,201922\n252,202996\n252,203242\n252,204475\n252,204476\n252,204477\n252,204542\n252,207064\n252,207184\n252,207185\n252,211826\n252,212381\n252,215276\n252,216035\n252,216895\n252,218862\n252,219788\n252,221240\n252,224825\n252,225397\n252,228185\n252,234275\n252,234286\n252,236036\n252,236997\n252,238167\n252,238788\n252,239038\n252,240695\n252,241083\n252,242508\n252,244156\n252,244659\n252,246181\n252,247867\n252,248592\n252,249198\n252,250694\n252,254923\n252,255355\n252,255866\n252,259550\n252,260725\n252,260726\n253,254\n253,349\n253,596\n253,605\n253,1149\n253,1179\n253,1414\n253,2367\n253,2379\n254,104\n254,134\n254,254\n254,503\n254,557\n254,636\n254,704\n254,715\n254,772\n254,953\n254,954\n254,1016\n254,1149\n254,1213\n254,1282\n254,1332\n254,1368\n254,1572\n254,1690\n254,1882\n254,1939\n254,1973\n254,1980\n254,2727\n254,2934\n254,3590\n254,4276\n254,4341\n254,5189\n254,5405\n254,5830\n254,6023\n254,6674\n254,6732\n254,7917\n254,8351\n254,14638\n254,14670\n254,15320\n254,15515\n254,15579\n254,17116\n254,17214\n254,17217\n254,18549\n254,19500\n254,20899\n254,22090\n254,24739\n254,25520\n254,28194\n254,28367\n254,28536\n254,31358\n254,38428\n254,42784\n254,42962\n254,43142\n254,46567\n254,50313\n254,58053\n254,64575\n254,67105\n254,86929\n254,90799\n254,93252\n254,107562\n254,107969\n254,108787\n254,112505\n254,117741\n254,119018\n254,121969\n254,131785\n254,135286\n254,136580\n254,136581\n254,142446\n254,152601\n254,159825\n254,160941\n254,162981\n254,164706\n254,168909\n254,172624\n254,173566\n254,175384\n254,176833\n254,180988\n254,189729\n254,198162\n254,201055\n254,216195\n255,10\n255,22\n255,86\n255,186\n255,240\n255,255\n255,450\n255,534\n255,563\n255,693\n255,818\n255,911\n255,1085\n255,1118\n255,1210\n255,1284\n255,1285\n255,1459\n255,1462\n255,1740\n255,8686\n255,13712\n255,15570\n255,15648\n255,20724\n255,22543\n255,23693\n255,31312\n255,34524\n255,39951\n255,40236\n255,41160\n255,58115\n255,64003\n255,75912\n255,87193\n255,105657\n255,113723\n255,115101\n255,115479\n255,116135\n255,116165\n255,118018\n255,119008\n255,126954\n255,129371\n255,137726\n255,138879\n255,144131\n255,147957\n255,168955\n255,169043\n255,201406\n255,235276\n255,240338\n255,242202\n255,246612\n255,260703\n256,11\n256,65\n256,86\n256,192\n256,209\n256,256\n256,259\n256,283\n256,299\n256,314\n256,333\n256,336\n256,349\n256,352\n256,360\n256,392\n256,439\n256,442\n256,444\n256,457\n256,497\n256,505\n256,512\n256,557\n256,567\n256,575\n256,622\n256,623\n256,668\n256,673\n256,676\n256,685\n256,702\n256,715\n256,764\n256,775\n256,801\n256,838\n256,841\n256,843\n256,849\n256,852\n256,900\n256,918\n256,968\n256,972\n256,991\n256,992\n256,999\n256,1014\n256,1072\n256,1118\n256,1135\n256,1143\n256,1147\n256,1172\n256,1191\n256,1192\n256,1204\n256,1298\n256,1345\n256,1363\n256,1402\n256,1417\n256,1449\n256,1499\n256,1566\n256,1619\n256,1623\n256,1655\n256,1663\n256,1724\n256,1805\n256,1837\n256,1844\n256,1858\n256,1860\n256,1877\n256,1891\n256,1973\n256,2173\n256,2253\n256,2605\n256,2779\n256,3258\n256,3524\n256,3555\n256,3582\n256,3962\n256,3999\n256,4066\n256,4165\n256,4190\n256,4276\n256,4637\n256,4760\n256,5052\n256,5155\n256,5405\n256,5466\n256,5591\n256,5718\n256,7152\n256,8055\n256,8214\n256,14674\n256,16332\n256,18298\n256,22395\n256,27014\n256,29909\n256,29943\n256,39730\n256,42006\n256,46486\n256,54616\n256,59197\n256,61066\n256,80279\n256,95588\n256,115222\n256,123846\n256,158318\n256,161106\n256,169979\n256,176815\n256,176940\n256,182908\n256,225404\n256,250645\n259,1\n259,11\n259,20\n259,126\n259,182\n259,207\n259,256\n259,259\n259,272\n259,314\n259,336\n259,356\n259,393\n259,397\n259,439\n259,440\n259,452\n259,457\n259,483\n259,538\n259,577\n259,599\n259,668\n259,673\n259,676\n259,685\n259,690\n259,726\n259,788\n259,794\n259,838\n259,843\n259,849\n259,852\n259,859\n259,902\n259,911\n259,929\n259,972\n259,980\n259,1011\n259,1014\n259,1070\n259,1105\n259,1118\n259,1130\n259,1172\n259,1191\n259,1204\n259,1262\n259,1345\n259,1388\n259,1433\n259,1531\n259,1566\n259,1603\n259,1634\n259,1655\n259,1663\n259,1973\n259,2178\n259,2224\n259,2253\n259,2320\n259,2460\n259,2580\n259,2599\n259,2713\n259,2923\n259,3398\n259,3417\n259,3507\n259,3524\n259,3724\n259,3951\n259,3971\n259,4152\n259,4190\n259,4203\n259,4455\n259,4545\n259,4611\n259,5192\n259,5401\n259,5492\n259,5583\n259,5726\n259,6824\n259,6904\n259,8676\n259,9457\n259,14232\n259,14674\n259,15783\n259,16609\n259,17819\n259,18108\n259,19413\n259,20686\n259,20757\n259,21286\n259,21448\n259,24375\n259,25282\n259,25332\n259,26450\n259,28312\n259,31419\n259,32585\n259,34829\n259,35486\n259,37275\n259,38132\n259,38951\n259,39453\n259,40477\n259,40591\n259,42483\n259,42488\n259,44401\n259,45983\n259,46944\n259,47650\n259,48643\n259,48963\n259,54493\n259,56150\n259,57043\n259,57143\n259,57243\n259,61176\n259,64201\n259,64746\n259,65393\n259,66323\n259,67161\n259,68150\n259,68157\n259,68206\n259,68323\n259,68741\n259,68840\n259,70998\n259,71186\n259,71981\n259,72697\n259,73517\n259,73547\n259,73569\n259,75883\n259,77850\n259,80670\n259,81995\n259,84474\n259,84738\n259,85851\n259,86491\n259,87832\n259,89558\n259,93034\n259,93057\n259,93765\n259,94301\n259,95387\n259,106218\n259,106887\n259,107496\n259,108159\n259,118792\n259,125509\n259,128634\n259,133045\n259,135182\n259,138686\n259,139010\n259,145193\n259,145862\n259,149192\n259,150719\n259,150828\n259,156796\n259,159720\n259,160312\n259,162599\n259,164298\n259,171356\n259,173769\n259,176786\n259,183584\n259,183910\n259,185149\n259,185934\n259,187099\n259,189897\n259,189899\n259,189900\n259,189901\n259,189902\n259,189909\n259,189911\n259,189914\n259,190271\n259,190273\n259,190423\n259,190756\n259,191408\n259,192515\n259,192618\n259,193578\n259,206160\n259,207659\n259,212324\n259,212407\n259,212430\n259,212448\n259,215276\n259,215874\n259,220889\n259,220891\n259,225905\n259,233108\n259,236472\n259,240038\n259,241631\n259,244720\n259,247950\n259,254154\n259,263236\n260,261\n261,41\n261,68\n261,120\n261,240\n261,261\n261,301\n261,332\n261,333\n261,372\n261,373\n261,390\n261,446\n261,590\n261,599\n261,615\n261,631\n261,677\n261,685\n261,694\n261,784\n261,805\n261,818\n261,849\n261,852\n261,875\n261,903\n261,968\n261,1001\n261,1011\n261,1014\n261,1209\n261,1231\n261,1285\n261,1309\n261,1353\n261,1395\n261,1419\n261,1466\n261,1782\n261,1801\n261,1844\n261,1955\n261,2321\n261,2512\n261,2775\n261,2824\n261,3115\n261,3328\n261,3867\n261,4532\n261,4752\n261,5208\n261,5382\n261,6437\n261,6856\n261,7196\n261,13274\n261,14080\n261,14113\n261,14371\n261,14730\n261,15397\n261,15562\n261,15693\n261,15767\n261,15931\n261,17601\n261,17838\n261,18142\n261,18802\n261,19592\n261,20540\n261,20592\n261,23625\n261,31197\n261,32751\n261,32820\n261,34335\n261,35546\n261,35961\n261,36483\n261,37407\n261,39618\n261,40682\n261,41310\n261,41938\n261,41951\n261,42070\n261,42762\n261,43223\n261,48052\n261,48291\n261,49373\n261,49784\n261,50541\n261,50546\n261,51462\n261,51463\n261,51465\n261,51471\n261,51474\n261,51505\n261,52054\n261,52192\n261,62377\n261,65209\n261,65681\n261,70127\n261,71110\n261,75233\n261,77142\n261,98915\n261,105933\n261,107761\n261,109402\n261,113643\n261,115298\n261,120931\n261,123830\n261,124070\n261,124621\n261,127158\n261,129695\n261,131926\n261,134537\n261,134891\n261,136617\n261,146476\n261,150580\n261,150741\n261,153756\n261,154450\n261,154819\n261,155336\n261,156352\n261,156637\n261,157409\n261,157706\n261,159024\n261,164386\n261,171648\n261,173956\n261,174093\n261,176333\n261,179129\n261,179155\n261,179210\n261,181945\n261,185491\n261,186482\n261,206453\n261,212914\n261,217760\n261,229823\n261,236718\n261,238996\n261,241114\n261,247366\n261,247772\n261,253774\n261,256957\n261,258680\n261,259994\n263,167\n264,104\n264,111\n264,182\n264,186\n264,192\n264,217\n264,240\n264,248\n264,264\n264,290\n264,292\n264,301\n264,314\n264,397\n264,440\n264,457\n264,467\n264,509\n264,510\n264,685\n264,714\n264,808\n264,838\n264,843\n264,872\n264,992\n264,1010\n264,1011\n264,1085\n264,1118\n264,1181\n264,1192\n264,1210\n264,1298\n264,1381\n264,1417\n264,1433\n264,1462\n264,1531\n264,1533\n264,1551\n264,1566\n264,1796\n264,1818\n264,1844\n264,1943\n264,2173\n264,2205\n264,2206\n264,2266\n264,2671\n264,2979\n264,3744\n264,4039\n264,4066\n264,16687\n264,33424\n265,187\n266,267\n268,269\n269,269\n269,467\n269,693\n269,2400\n269,3927\n269,5631\n269,6895\n269,33339\n269,34298\n269,36252\n269,41538\n269,45427\n269,58422\n269,67251\n269,91678\n269,96649\n269,113068\n269,113858\n269,116479\n269,120135\n269,121481\n269,121692\n269,121852\n269,122016\n269,127315\n269,128667\n269,146256\n269,146259\n269,146747\n269,150741\n269,156719\n269,158349\n269,159160\n269,160458\n269,160887\n269,162608\n269,162858\n269,162997\n269,163330\n269,163416\n269,163455\n269,163851\n269,165512\n269,168420\n269,168506\n269,169946\n269,170727\n269,173407\n269,174629\n269,174632\n269,176189\n269,177430\n269,178563\n269,178605\n269,178653\n269,179043\n269,179387\n269,179628\n269,179717\n269,180710\n269,184538\n269,186456\n269,187793\n269,187829\n269,187830\n269,190976\n269,191303\n269,191304\n269,192117\n269,192400\n269,193840\n269,194073\n269,201366\n269,204704\n269,215532\n269,216429\n269,220733\n269,221258\n269,221259\n269,223192\n269,226559\n269,227601\n269,232609\n269,232665\n269,233523\n269,233980\n269,235889\n269,235895\n269,235917\n269,236077\n269,243872\n269,243875\n269,247827\n269,253137\n269,263224\n270,271\n271,271\n272,259\n272,272\n272,290\n272,346\n272,447\n272,467\n272,538\n272,673\n272,685\n272,690\n272,693\n272,726\n272,794\n272,849\n272,859\n272,911\n272,921\n272,980\n272,1067\n272,1068\n272,1070\n272,1130\n272,1218\n272,1474\n272,1531\n272,1559\n272,1848\n272,2178\n272,2387\n272,2427\n272,2580\n272,2782\n272,3519\n272,3735\n272,4455\n272,4545\n272,8196\n272,8425\n272,8701\n272,13374\n272,14232\n272,16231\n272,16667\n272,18124\n272,21332\n272,22088\n272,22137\n272,23039\n272,24855\n272,25686\n272,26041\n272,28773\n272,30775\n272,33604\n272,35486\n272,36733\n272,38393\n272,38822\n272,38872\n272,40077\n272,45651\n272,45761\n272,45983\n272,48169\n272,48621\n272,49247\n272,50469\n272,56150\n272,57243\n272,67395\n272,70247\n272,70842\n272,75231\n272,81172\n272,82224\n272,82232\n272,83947\n272,91541\n272,94134\n272,96703\n272,97385\n272,97394\n272,97406\n272,97408\n272,97418\n272,97432\n272,97440\n272,97934\n272,105931\n272,107215\n272,108087\n272,109592\n272,109995\n272,109999\n272,112016\n272,130951\n272,135388\n272,138686\n272,139010\n272,139502\n272,154481\n272,156379\n272,166383\n272,172601\n272,175399\n272,179778\n272,179786\n272,179996\n272,180005\n272,180016\n272,183847\n272,189176\n272,190040\n272,190343\n272,213781\n272,216154\n272,216169\n272,218512\n272,220629\n272,221216\n272,229006\n272,229366\n272,233547\n272,235891\n272,240038\n272,243731\n272,244066\n272,244815\n272,246186\n272,248445\n272,248495\n272,252199\n272,253299\n272,258807\n273,273\n273,274\n273,446\n273,1636\n273,1839\n273,5766\n273,5994\n273,10397\n273,16126\n273,19403\n273,20547\n273,22886\n273,25070\n273,33391\n273,34160\n273,35434\n273,36975\n273,39052\n273,39568\n273,44485\n273,59899\n273,66401\n273,66552\n273,66754\n273,68022\n273,68654\n273,68711\n273,87735\n273,103239\n273,107029\n273,107908\n273,110693\n273,110718\n273,112317\n273,115324\n273,116603\n273,120673\n273,122600\n273,123931\n273,129820\n273,141813\n273,159245\n273,159488\n273,167148\n273,167729\n273,168896\n273,169003\n273,170663\n273,171766\n273,173389\n273,176705\n273,179201\n273,179236\n273,182044\n273,183353\n273,184709\n273,186254\n273,206359\n274,273\n274,274\n275,10\n275,175\n275,202\n275,203\n275,252\n275,275\n275,277\n275,279\n275,314\n275,360\n275,446\n275,493\n275,516\n275,599\n275,622\n275,733\n275,794\n275,1220\n275,1222\n275,1243\n275,1262\n275,1265\n275,1266\n275,1512\n275,1568\n275,1927\n275,2528\n275,3485\n275,5992\n275,6402\n275,7087\n275,7161\n275,8699\n275,13529\n275,14367\n275,14507\n275,15624\n275,16454\n275,17550\n275,24066\n275,26590\n275,27986\n275,32852\n275,32884\n275,41170\n275,50420\n275,59020\n275,62481\n275,72439\n275,76813\n275,80025\n275,124587\n275,127255\n275,149241\n275,157703\n275,172596\n275,175756\n275,175998\n275,176001\n275,188211\n275,188244\n275,189788\n275,189794\n275,190442\n275,193599\n275,195438\n275,195563\n275,196711\n275,202519\n275,205336\n275,212620\n275,213717\n275,215276\n275,215900\n275,223738\n275,228457\n275,236034\n275,236035\n275,236040\n275,236050\n275,247832\n275,251388\n276,277\n276,279\n278,19\n278,34\n278,35\n278,54\n278,217\n278,222\n278,278\n278,313\n278,338\n278,379\n278,389\n278,425\n278,431\n278,455\n278,536\n278,571\n278,599\n278,634\n278,657\n278,660\n278,685\n278,818\n278,838\n278,852\n278,903\n278,949\n278,951\n278,1011\n278,1019\n278,1138\n278,1198\n278,1218\n278,1274\n278,1467\n278,1525\n278,1539\n278,1700\n278,1724\n278,1735\n278,1756\n278,1881\n278,1916\n278,1995\n278,2159\n278,2207\n278,2290\n278,2418\n278,2421\n278,2424\n278,2633\n278,2646\n278,2779\n278,2802\n278,3069\n278,3252\n278,3507\n278,3743\n278,3970\n278,4190\n278,4268\n278,5208\n278,5591\n278,5604\n278,6754\n278,6789\n278,6828\n278,7075\n278,7182\n278,7768\n278,7809\n278,7839\n278,7869\n278,8156\n278,9701\n278,9729\n278,13137\n278,13240\n278,13276\n278,15171\n278,15497\n278,15502\n278,16357\n278,16410\n278,16950\n278,17811\n278,18737\n278,19349\n278,19672\n278,20498\n278,21321\n278,21411\n278,21445\n278,21563\n278,21733\n278,22172\n278,24208\n278,24340\n278,25398\n278,25508\n278,25878\n278,26056\n278,29055\n278,30373\n278,30453\n278,32929\n278,34312\n278,34415\n278,35468\n278,36594\n278,37088\n278,39461\n278,40199\n278,41136\n278,41546\n278,42682\n278,49961\n278,50018\n278,51665\n278,54196\n278,54242\n278,54484\n278,54957\n278,55871\n278,56525\n278,57025\n278,57851\n278,58370\n278,59666\n278,61089\n278,62705\n278,63410\n278,63988\n278,64108\n278,64859\n278,65913\n278,72570\n278,74555\n278,74658\n278,76915\n278,79397\n278,79966\n278,83255\n278,85449\n278,85745\n278,87025\n278,88002\n278,90959\n278,92883\n278,98226\n278,106832\n278,107369\n278,107423\n278,107762\n278,109899\n278,110016\n278,115474\n278,121197\n278,125482\n278,127158\n278,130275\n278,131216\n278,131497\n278,131822\n278,135270\n278,135319\n278,136679\n278,138036\n278,140225\n278,140832\n278,141321\n278,141840\n278,145510\n278,145534\n278,145536\n278,145537\n278,145540\n278,145541\n278,145543\n278,145544\n278,145547\n278,145552\n278,145560\n278,145561\n278,145562\n278,145563\n278,145572\n278,145695\n278,145941\n278,146453\n278,147939\n278,150775\n278,151531\n278,152540\n278,152547\n278,162507\n278,163400\n278,163718\n278,164237\n278,174955\n278,177188\n278,177486\n278,182375\n278,183059\n278,185846\n278,186508\n278,186513\n278,190491\n278,192013\n278,192901\n278,195007\n278,199472\n278,203891\n278,207836\n278,219512\n278,220896\n278,224461\n278,224738\n278,225319\n278,225570\n278,230227\n278,230295\n278,238768\n278,247959\n278,248556\n278,254201\n278,256486\n278,259001\n278,260367\n278,261498\n278,263077\n278,263848\n279,275\n279,277\n279,195438\n280,280\n280,2782\n280,7222\n280,8438\n280,17245\n280,23057\n280,72489\n281,282\n283,34\n283,35\n283,54\n283,192\n283,222\n283,256\n283,283\n283,313\n283,389\n283,397\n283,455\n283,536\n283,814\n283,951\n283,1014\n283,1019\n283,1201\n283,1417\n283,1467\n283,1525\n283,1539\n283,1724\n283,1756\n283,1860\n283,1881\n283,1916\n283,2092\n283,2269\n283,2424\n283,2619\n283,2689\n283,2775\n283,2874\n283,3628\n283,3646\n283,3672\n283,4039\n283,4637\n283,5343\n283,5591\n283,5758\n283,5862\n283,6032\n283,6788\n283,6789\n283,6828\n283,7768\n283,8152\n283,8410\n283,8463\n283,13137\n283,13276\n283,13549\n283,13605\n283,16186\n283,18398\n283,19352\n283,21253\n283,21561\n283,22552\n283,25382\n283,26055\n283,28353\n283,29595\n283,30549\n283,30617\n283,31397\n283,31801\n283,37088\n283,38857\n283,39570\n283,43273\n283,45647\n283,48161\n283,48497\n283,50517\n283,55677\n283,57907\n283,58403\n283,58820\n283,63988\n283,67172\n283,68173\n283,81068\n283,82101\n283,92922\n283,97392\n283,103913\n283,115474\n283,118835\n283,126282\n283,127158\n283,131216\n283,131224\n283,131390\n283,133105\n283,145368\n283,148809\n283,149361\n283,151123\n283,151157\n283,151346\n283,153219\n283,153255\n283,153257\n283,153766\n283,156575\n283,157052\n283,158199\n283,158788\n283,159016\n283,159029\n283,159037\n283,159116\n283,160975\n283,162606\n283,168165\n283,169377\n283,169564\n283,190108\n283,197856\n283,211837\n283,212976\n283,214831\n283,217509\n283,223656\n283,224098\n283,226474\n283,235959\n283,241319\n283,243506\n283,248712\n283,252750\n283,256173\n283,258236\n284,285\n285,72\n285,99\n285,146\n285,158\n285,175\n285,195\n285,285\n285,336\n285,391\n285,392\n285,406\n285,422\n285,438\n285,602\n285,620\n285,622\n285,640\n285,644\n285,654\n285,779\n285,841\n285,875\n285,918\n285,944\n285,1181\n285,1425\n285,1458\n285,1502\n285,1515\n285,1776\n285,1803\n285,1825\n285,2070\n285,2374\n285,3508\n285,3895\n285,4010\n285,4087\n285,7818\n285,9394\n285,13197\n285,13493\n285,14040\n285,14136\n285,14244\n285,15112\n285,19782\n285,20031\n285,23507\n285,23991\n285,24021\n285,24835\n285,25385\n285,26249\n285,26414\n285,26972\n285,28497\n285,29289\n285,30043\n285,30330\n285,31524\n285,32741\n285,32764\n285,32789\n285,32800\n285,35497\n285,35623\n285,37695\n285,43673\n285,44379\n285,44439\n285,45102\n285,46848\n285,50165\n285,50167\n285,53010\n285,57193\n285,59556\n285,59693\n285,60576\n285,62522\n285,63650\n285,64079\n285,68069\n285,68967\n285,92476\n285,94126\n285,96816\n285,102560\n285,105692\n285,106444\n285,109367\n285,118336\n285,124682\n285,131424\n285,138859\n285,139498\n285,141912\n285,144040\n285,145405\n285,148601\n285,156449\n285,162717\n285,162958\n285,166375\n285,170149\n285,177683\n285,179278\n285,191939\n285,223938\n285,240174\n285,243738\n285,247337\n285,251628\n285,252094\n285,257056\n286,287\n287,106\n287,140\n287,175\n287,207\n287,287\n287,301\n287,314\n287,326\n287,347\n287,349\n287,392\n287,433\n287,440\n287,446\n287,457\n287,510\n287,663\n287,664\n287,673\n287,685\n287,702\n287,733\n287,794\n287,809\n287,818\n287,824\n287,874\n287,911\n287,937\n287,1011\n287,1058\n287,1130\n287,1133\n287,1191\n287,1210\n287,1342\n287,1368\n287,1422\n287,1607\n287,1623\n287,1634\n287,1973\n287,2053\n287,2361\n287,4272\n287,4450\n287,5165\n287,6456\n287,6632\n287,9712\n287,14304\n287,14520\n287,15527\n287,18429\n287,18757\n287,19010\n287,19359\n287,19384\n287,20428\n287,20657\n287,20757\n287,21351\n287,22293\n287,22347\n287,23338\n287,24790\n287,25519\n287,29765\n287,30233\n287,31091\n287,32729\n287,33618\n287,34775\n287,34900\n287,35460\n287,35668\n287,40558\n287,40713\n287,42779\n287,43135\n287,43889\n287,44334\n287,44734\n287,45705\n287,56397\n287,56609\n287,57788\n287,64667\n287,67141\n287,67537\n287,67891\n287,67948\n287,70741\n287,72622\n287,72816\n287,77816\n287,78912\n287,79833\n287,80667\n287,83663\n287,87273\n287,87746\n287,88661\n287,89661\n287,89802\n287,91820\n287,91980\n287,93113\n287,95509\n287,95592\n287,95957\n287,98261\n287,99096\n287,107503\n287,109274\n287,109312\n287,110150\n287,110565\n287,111406\n287,114597\n287,115066\n287,118801\n287,119295\n287,122008\n287,122085\n287,122866\n287,123542\n287,124668\n287,126781\n287,127158\n287,127720\n287,127808\n287,127864\n287,128162\n287,129091\n287,130376\n287,133478\n287,134048\n287,134067\n287,134635\n287,134643\n287,134773\n287,134777\n287,135133\n287,135228\n287,135534\n287,135535\n287,135536\n287,135537\n287,135538\n287,135539\n287,135540\n287,135541\n287,135542\n287,135543\n287,135544\n287,135545\n287,135546\n287,135547\n287,135548\n287,135549\n287,135550\n287,135551\n287,135552\n287,135553\n287,135554\n287,135555\n287,135556\n287,135557\n287,135558\n287,135559\n287,135560\n287,135561\n287,135562\n287,135920\n287,135921\n287,136107\n287,136189\n287,136651\n287,136652\n287,136993\n287,137066\n287,137145\n287,138718\n287,138719\n287,139319\n287,144887\n287,146337\n287,146690\n287,148735\n287,148895\n287,152855\n287,173423\n287,175580\n287,179220\n287,186570\n287,187321\n287,188548\n287,194025\n287,196178\n287,201947\n287,212225\n287,218626\n287,224462\n287,225654\n287,233844\n287,234160\n287,254212\n287,258180\n287,259133\n288,225\n288,248\n288,450\n288,1332\n288,5405\n289,40\n289,41\n289,104\n289,192\n289,272\n289,289\n289,290\n289,304\n289,328\n289,372\n289,510\n289,609\n289,631\n289,632\n289,677\n289,685\n289,704\n289,714\n289,715\n289,760\n289,784\n289,1082\n289,1085\n289,1118\n289,1195\n289,1282\n289,1329\n289,1359\n289,1402\n289,1416\n289,1481\n289,1505\n289,1572\n289,1641\n289,1662\n289,1962\n289,1973\n289,2008\n289,2205\n289,2206\n289,2286\n289,2296\n289,2315\n289,2572\n289,2655\n289,2918\n289,3003\n289,3028\n289,3069\n289,3565\n289,3672\n289,3843\n289,4066\n289,4417\n289,4464\n289,4879\n289,5011\n289,5278\n289,7017\n289,8454\n289,8821\n289,12747\n289,13205\n289,13657\n289,13691\n289,14156\n289,17357\n289,17452\n289,18933\n289,18965\n289,21290\n289,22268\n289,23352\n289,25571\n289,26429\n289,26460\n289,26644\n289,26781\n289,28191\n289,28785\n289,29922\n289,30443\n289,31531\n289,33424\n289,33697\n289,34820\n289,35614\n289,39307\n289,40152\n289,40867\n289,42029\n289,42582\n289,43303\n289,46874\n289,50641\n289,52964\n289,54737\n289,55261\n289,55760\n289,57047\n289,59194\n289,59212\n289,60004\n289,61974\n289,62264\n289,68006\n289,74547\n289,78891\n289,80268\n289,81065\n289,82819\n289,82869\n289,83588\n289,83899\n289,85852\n289,91257\n289,91487\n289,94134\n289,98113\n289,98403\n289,102250\n289,102705\n289,105173\n289,105174\n289,105489\n289,107123\n289,108114\n289,108117\n289,110492\n289,113097\n289,114072\n289,114414\n289,118248\n289,122396\n289,123796\n289,127158\n289,130553\n289,131487\n289,132670\n289,140120\n289,141622\n289,143393\n289,143725\n289,144988\n289,150797\n289,153739\n289,154795\n289,167123\n289,171377\n289,174910\n289,180988\n289,184149\n289,191894\n289,193698\n289,217847\n289,227798\n289,230456\n289,232286\n289,233813\n289,235034\n289,237659\n289,237706\n289,239757\n289,241091\n289,245910\n289,246850\n289,247467\n289,248555\n289,251950\n289,252001\n289,253953\n289,255577\n289,258894\n289,259432\n291,292\n292,5\n292,11\n292,15\n292,58\n292,107\n292,111\n292,186\n292,227\n292,256\n292,292\n292,314\n292,338\n292,349\n292,373\n292,397\n292,420\n292,441\n292,442\n292,446\n292,457\n292,461\n292,462\n292,487\n292,495\n292,502\n292,509\n292,510\n292,518\n292,535\n292,595\n292,599\n292,626\n292,673\n292,677\n292,685\n292,693\n292,703\n292,745\n292,746\n292,749\n292,794\n292,801\n292,805\n292,846\n292,849\n292,852\n292,872\n292,911\n292,973\n292,978\n292,1014\n292,1025\n292,1043\n292,1046\n292,1052\n292,1058\n292,1130\n292,1151\n292,1172\n292,1177\n292,1235\n292,1238\n292,1335\n292,1424\n292,1449\n292,1453\n292,1559\n292,1572\n292,1653\n292,1668\n292,1677\n292,1688\n292,1722\n292,1758\n292,1848\n292,1849\n292,1860\n292,1948\n292,1961\n292,2089\n292,2163\n292,2209\n292,2373\n292,2580\n292,2595\n292,3367\n292,3483\n292,3496\n292,3538\n292,3545\n292,3830\n292,4039\n292,4066\n292,4114\n292,4520\n292,4565\n292,4580\n292,4771\n292,5185\n292,5423\n292,5584\n292,6476\n292,6880\n292,7530\n292,7766\n292,7993\n292,8149\n292,9655\n292,9658\n292,13324\n292,13502\n292,14135\n292,14185\n292,14188\n292,14353\n292,15339\n292,16138\n292,16614\n292,19415\n292,20673\n292,21324\n292,21944\n292,22467\n292,22535\n292,24733\n292,25646\n292,26481\n292,26906\n292,28814\n292,29061\n292,29975\n292,30373\n292,30476\n292,30770\n292,31802\n292,32630\n292,32819\n292,34705\n292,34740\n292,35175\n292,37414\n292,37418\n292,38300\n292,39109\n292,39530\n292,40442\n292,42903\n292,44095\n292,44522\n292,45047\n292,45530\n292,46484\n292,47100\n292,47278\n292,49373\n292,49692\n292,52210\n292,56422\n292,59206\n292,61083\n292,61255\n292,62383\n292,62417\n292,62824\n292,62985\n292,68811\n292,79330\n292,79369\n292,79969\n292,80188\n292,80914\n292,82114\n292,87943\n292,90325\n292,97392\n292,101907\n292,110032\n292,114446\n292,114456\n292,116017\n292,116502\n292,117034\n292,117541\n292,117775\n292,122392\n292,131876\n292,132062\n292,133594\n292,134490\n292,135919\n292,137258\n292,138704\n292,139488\n292,140786\n292,143410\n292,145104\n292,147485\n292,152767\n292,153284\n292,155786\n292,156629\n292,158309\n292,161315\n292,166339\n292,167078\n292,170189\n292,171141\n292,171810\n292,173788\n292,174312\n292,175027\n292,176347\n292,181935\n292,183480\n292,185031\n292,185543\n292,185864\n292,187985\n292,187986\n292,188837\n292,190003\n292,191143\n292,192643\n292,197680\n292,206387\n292,207659\n292,208030\n292,212367\n292,213086\n292,214500\n292,216814\n292,225741\n292,226252\n292,231006\n292,231011\n292,231019\n292,231105\n292,231143\n292,232042\n292,233458\n292,235544\n292,235814\n292,237289\n292,237646\n292,238304\n292,243501\n292,243717\n292,244838\n292,258089\n292,258097\n292,258132\n292,260782\n292,264434\n293,294\n294,240\n294,328\n294,431\n294,617\n294,631\n294,634\n294,772\n294,784\n294,797\n294,805\n294,838\n294,1052\n294,1085\n294,1118\n294,1415\n294,1572\n294,2015\n294,2346\n294,2775\n294,2834\n294,3504\n294,3507\n294,5405\n294,7087\n294,7458\n294,13359\n294,13366\n294,13626\n294,14482\n294,14605\n294,16641\n294,27126\n294,28553\n294,31785\n294,75912\n294,86102\n294,89899\n294,91540\n294,102814\n294,110717\n294,127158\n294,131038\n294,131058\n294,133764\n294,245521\n295,296\n296,296\n296,314\n297,298\n298,41\n298,104\n298,135\n298,175\n298,240\n298,289\n298,290\n298,298\n298,417\n298,425\n298,446\n298,534\n298,589\n298,612\n298,626\n298,631\n298,636\n298,693\n298,715\n298,784\n298,818\n298,862\n298,932\n298,1016\n298,1085\n298,1119\n298,1133\n298,1195\n298,1238\n298,1459\n298,1462\n298,1580\n298,1775\n298,2205\n298,2206\n298,2296\n298,2387\n298,2572\n298,2850\n298,2995\n298,3028\n298,3944\n298,4222\n298,4540\n298,5002\n298,5011\n298,5139\n298,6068\n298,6136\n298,6139\n298,6482\n298,7180\n298,7194\n298,7268\n298,7496\n298,7887\n298,7996\n298,9202\n298,9391\n298,9529\n298,11952\n298,14080\n298,14603\n298,14827\n298,16551\n298,18515\n298,18673\n298,19617\n298,19798\n298,21742\n298,22268\n298,22467\n298,24619\n298,25452\n298,27881\n298,28191\n298,29041\n298,33424\n298,33820\n298,34874\n298,35614\n298,36666\n298,38822\n298,39595\n298,40065\n298,41475\n298,41479\n298,41849\n298,42810\n298,42918\n298,45993\n298,46327\n298,47173\n298,48278\n298,49035\n298,51972\n298,54395\n298,56273\n298,57910\n298,59043\n298,60173\n298,62160\n298,62239\n298,64487\n298,65711\n298,74148\n298,74460\n298,74547\n298,75885\n298,75912\n298,78891\n298,80055\n298,81508\n298,88108\n298,91941\n298,94134\n298,96748\n298,99723\n298,102250\n298,111366\n298,112686\n298,113932\n298,116104\n298,118678\n298,121440\n298,121441\n298,121444\n298,121446\n298,122077\n298,128144\n298,129874\n298,134329\n298,141179\n298,142369\n298,155117\n298,155406\n298,156022\n298,156916\n298,163471\n298,164267\n298,172141\n298,175331\n298,175345\n298,175463\n298,178576\n298,180602\n298,182345\n298,182393\n298,185877\n298,189709\n298,190526\n298,200878\n298,205888\n298,212917\n298,216758\n298,235112\n298,236555\n298,240296\n298,242975\n298,245910\n298,250143\n299,86\n299,167\n299,299\n299,314\n299,349\n299,356\n299,372\n299,397\n299,425\n299,452\n299,459\n299,528\n299,563\n299,599\n299,663\n299,676\n299,744\n299,783\n299,803\n299,838\n299,849\n299,907\n299,929\n299,940\n299,941\n299,972\n299,973\n299,1011\n299,1012\n299,1013\n299,1014\n299,1117\n299,1118\n299,1122\n299,1167\n299,1241\n299,1284\n299,1293\n299,1298\n299,1300\n299,1319\n299,1360\n299,1421\n299,1436\n299,1479\n299,1522\n299,1544\n299,1566\n299,1572\n299,1678\n299,1715\n299,1849\n299,1973\n299,2083\n299,2224\n299,2372\n299,2511\n299,2557\n299,2588\n299,2979\n299,3207\n299,3218\n299,3392\n299,3422\n299,3524\n299,3630\n299,4066\n299,4286\n299,4514\n299,5301\n299,6653\n299,6844\n299,6904\n299,6929\n299,7087\n299,7818\n299,8187\n299,8534\n299,9457\n299,9603\n299,12378\n299,13252\n299,14597\n299,18832\n299,20396\n299,20757\n299,21269\n299,22454\n299,23307\n299,24668\n299,28947\n299,30373\n299,34993\n299,37419\n299,37586\n299,39110\n299,40453\n299,40513\n299,48545\n299,51143\n299,58409\n299,64494\n299,66565\n299,70028\n299,70249\n299,73355\n299,73570\n299,74635\n299,75272\n299,75912\n299,78728\n299,79393\n299,79398\n299,79528\n299,81956\n299,90247\n299,90905\n299,102646\n299,109838\n299,113981\n299,116543\n299,122451\n299,124491\n299,128516\n299,129747\n299,134068\n299,135246\n299,142574\n299,146813\n299,147883\n299,152905\n299,156333\n299,156590\n299,157593\n299,176469\n299,176876\n299,185472\n299,186621\n299,190408\n299,191477\n299,194102\n299,200408\n299,203939\n299,204791\n299,204793\n299,207045\n299,215874\n299,228443\n299,232753\n299,239007\n299,254444\n300,301\n301,11\n301,34\n301,35\n301,37\n301,46\n301,68\n301,106\n301,126\n301,158\n301,167\n301,182\n301,186\n301,192\n301,217\n301,240\n301,261\n301,264\n301,287\n301,301\n301,302\n301,314\n301,372\n301,392\n301,397\n301,435\n301,444\n301,452\n301,457\n301,467\n301,468\n301,510\n301,516\n301,525\n301,536\n301,563\n301,567\n301,599\n301,604\n301,605\n301,615\n301,631\n301,632\n301,663\n301,677\n301,698\n301,717\n301,765\n301,808\n301,812\n301,818\n301,838\n301,849\n301,868\n301,872\n301,937\n301,968\n301,972\n301,973\n301,1001\n301,1010\n301,1011\n301,1013\n301,1014\n301,1045\n301,1046\n301,1085\n301,1118\n301,1160\n301,1172\n301,1181\n301,1192\n301,1210\n301,1231\n301,1284\n301,1285\n301,1293\n301,1298\n301,1300\n301,1319\n301,1326\n301,1355\n301,1370\n301,1411\n301,1417\n301,1518\n301,1531\n301,1545\n301,1564\n301,1623\n301,1627\n301,1635\n301,1654\n301,1715\n301,1740\n301,1782\n301,1783\n301,1796\n301,1837\n301,1844\n301,1849\n301,1853\n301,1992\n301,2173\n301,2183\n301,2235\n301,2253\n301,2263\n301,2272\n301,2307\n301,2372\n301,2373\n301,2556\n301,2557\n301,2625\n301,2642\n301,2979\n301,3149\n301,3182\n301,3379\n301,3397\n301,3422\n301,3507\n301,3560\n301,3756\n301,3804\n301,3809\n301,3866\n301,3871\n301,4159\n301,4177\n301,4213\n301,4253\n301,4286\n301,4291\n301,4308\n301,4315\n301,4446\n301,4455\n301,4598\n301,4683\n301,5181\n301,5255\n301,5376\n301,5382\n301,5388\n301,5455\n301,5472\n301,5563\n301,5625\n301,5662\n301,5850\n301,5991\n301,6250\n301,6431\n301,6470\n301,6579\n301,6712\n301,6938\n301,7222\n301,7759\n301,7766\n301,7880\n301,8107\n301,8140\n301,8253\n301,9527\n301,9561\n301,9579\n301,9708\n301,13176\n301,13296\n301,13418\n301,13523\n301,13524\n301,13771\n301,14095\n301,14119\n301,14246\n301,14484\n301,14572\n301,14614\n301,14828\n301,14916\n301,15020\n301,15109\n301,15386\n301,15588\n301,15840\n301,15845\n301,16191\n301,16192\n301,16630\n301,16675\n301,17894\n301,18129\n301,18387\n301,18524\n301,18688\n301,18920\n301,19387\n301,19517\n301,19592\n301,20072\n301,20327\n301,20550\n301,20626\n301,20756\n301,20910\n301,21411\n301,21701\n301,22062\n301,22291\n301,23799\n301,23848\n301,25062\n301,25342\n301,26133\n301,26287\n301,26789\n301,27482\n301,28011\n301,28317\n301,28354\n301,28498\n301,28924\n301,28989\n301,29890\n301,29947\n301,30396\n301,30445\n301,30452\n301,30499\n301,30717\n301,31746\n301,32784\n301,32846\n301,32898\n301,33707\n301,33730\n301,33735\n301,35046\n301,36241\n301,36421\n301,36563\n301,36736\n301,37381\n301,37826\n301,38300\n301,38517\n301,38816\n301,38937\n301,38949\n301,39011\n301,39013\n301,39123\n301,39650\n301,40513\n301,40933\n301,41230\n301,41528\n301,41963\n301,42065\n301,42424\n301,43364\n301,45080\n301,45601\n301,46584\n301,46792\n301,46820\n301,47041\n301,47074\n301,47424\n301,48002\n301,48251\n301,48260\n301,48305\n301,48314\n301,48640\n301,48832\n301,48921\n301,49101\n301,49410\n301,49866\n301,49924\n301,49977\n301,50101\n301,50503\n301,50514\n301,50714\n301,51917\n301,53717\n301,54606\n301,54751\n301,55219\n301,55683\n301,55948\n301,58820\n301,59066\n301,59162\n301,59335\n301,59516\n301,60415\n301,60541\n301,60542\n301,63081\n301,63121\n301,63976\n301,66590\n301,67132\n301,67185\n301,68248\n301,68683\n301,69907\n301,71097\n301,73237\n301,73320\n301,74415\n301,75295\n301,75394\n301,75912\n301,76235\n301,77104\n301,77127\n301,77678\n301,78717\n301,79429\n301,80062\n301,80134\n301,80378\n301,80379\n301,80666\n301,81508\n301,82092\n301,82871\n301,83493\n301,83512\n301,84818\n301,86836\n301,87287\n301,92836\n301,92935\n301,93080\n301,94906\n301,94938\n301,96266\n301,96631\n301,96752\n301,96827\n301,96914\n301,97981\n301,99781\n301,101485\n301,103860\n301,104507\n301,106267\n301,106365\n301,111348\n301,113002\n301,114445\n301,114625\n301,116590\n301,117117\n301,118510\n301,118773\n301,119949\n301,121117\n301,121163\n301,122451\n301,123168\n301,123381\n301,124614\n301,126506\n301,127158\n301,127418\n301,127441\n301,127858\n301,130889\n301,131889\n301,133606\n301,136177\n301,136545\n301,136551\n301,137752\n301,137753\n301,137765\n301,140139\n301,140193\n301,142021\n301,143313\n301,144227\n301,147311\n301,147480\n301,147484\n301,148900\n301,152468\n301,158528\n301,158801\n301,160668\n301,160923\n301,161555\n301,161622\n301,162121\n301,163943\n301,164836\n301,164905\n301,164929\n301,166021\n301,167057\n301,167819\n301,168363\n301,170729\n301,171697\n301,171969\n301,172522\n301,172598\n301,173811\n301,174498\n301,174962\n301,175325\n301,175542\n301,176469\n301,176583\n301,177514\n301,178012\n301,180551\n301,181465\n301,182334\n301,182912\n301,185418\n301,185937\n301,190314\n301,191136\n301,192191\n301,200532\n301,202496\n301,204019\n301,207757\n301,212474\n301,212728\n301,213237\n301,213915\n301,214832\n301,214997\n301,215241\n301,215243\n301,215814\n301,216085\n301,216095\n301,216811\n301,218015\n301,218884\n301,220030\n301,220326\n301,220571\n301,220653\n301,221303\n301,221828\n301,221920\n301,222392\n301,223489\n301,223600\n301,224923\n301,224966\n301,225389\n301,227330\n301,227376\n301,228311\n301,229002\n301,229005\n301,231939\n301,232143\n301,233602\n301,233670\n301,238988\n301,239022\n301,239023\n301,239024\n301,239027\n301,239029\n301,239030\n301,239034\n301,239036\n301,239037\n301,239076\n301,240326\n301,241532\n301,241582\n301,241603\n301,241841\n301,242273\n301,242886\n301,243369\n301,243389\n301,244257\n301,250797\n301,252650\n301,254391\n301,255081\n301,256476\n301,257444\n301,258368\n301,261078\n302,182\n302,192\n302,301\n302,302\n302,314\n302,433\n302,452\n302,457\n302,467\n302,599\n302,673\n302,808\n302,818\n302,849\n302,868\n302,872\n302,1010\n302,1011\n302,1085\n302,1130\n302,1172\n302,1204\n302,1210\n302,1293\n302,1370\n302,1417\n302,1445\n302,1531\n302,1559\n302,1663\n302,1796\n302,1844\n302,1893\n302,3744\n302,14674\n302,127158\n302,182489\n303,207\n303,255\n303,843\n304,40\n304,104\n304,135\n304,138\n304,289\n304,290\n304,304\n304,328\n304,372\n304,444\n304,446\n304,518\n304,631\n304,685\n304,714\n304,715\n304,784\n304,801\n304,968\n304,1001\n304,1119\n304,1326\n304,1715\n304,1716\n304,1962\n304,2008\n304,2205\n304,2206\n304,2209\n304,2286\n304,2315\n304,2384\n304,2572\n304,2675\n304,2965\n304,3565\n304,4145\n304,4146\n304,4308\n304,4411\n304,4532\n304,5472\n304,6552\n304,7921\n304,7996\n304,9739\n304,15107\n304,15135\n304,15633\n304,16479\n304,18501\n304,18608\n304,20813\n304,21739\n304,22467\n304,23382\n304,24600\n304,24704\n304,27899\n304,28672\n304,28691\n304,28832\n304,29588\n304,32576\n304,32815\n304,33338\n304,34077\n304,35043\n304,36272\n304,36627\n304,39770\n304,41218\n304,43893\n304,45082\n304,56644\n304,57144\n304,59702\n304,59714\n304,59812\n304,63038\n304,63604\n304,74478\n304,75153\n304,75861\n304,75982\n304,78801\n304,78917\n304,82023\n304,83496\n304,83894\n304,83965\n304,84531\n304,91346\n304,91757\n304,92057\n304,94134\n304,104030\n304,111142\n304,113009\n304,120108\n304,120145\n304,120156\n304,120159\n304,120896\n304,121422\n304,122562\n304,123111\n304,123840\n304,126721\n304,128408\n304,128420\n304,128846\n304,128872\n304,131752\n304,132216\n304,134588\n304,134845\n304,136520\n304,136759\n304,140391\n304,155783\n304,156162\n304,169724\n304,169942\n304,171927\n304,173412\n304,175431\n304,177752\n304,188566\n304,198174\n304,201857\n304,243341\n304,244048\n304,245984\n304,263143\n305,1248\n305,1382\n305,1398\n305,2025\n305,2897\n305,7023\n305,11463\n305,13531\n305,14015\n305,15434\n305,15737\n305,18714\n305,19052\n305,19053\n305,19054\n305,19055\n305,19065\n305,19066\n305,19067\n305,19101\n305,19102\n305,22686\n305,23401\n305,25108\n305,26856\n305,26859\n305,29186\n305,30883\n305,32788\n305,53420\n305,54066\n305,54074\n305,54082\n305,54366\n305,54496\n305,54567\n305,54620\n305,54645\n305,55289\n305,58188\n305,61774\n305,66075\n305,66078\n305,74639\n305,74815\n305,76255\n305,76259\n305,81574\n305,87566\n305,90253\n305,90656\n305,98379\n305,131272\n305,149839\n305,150819\n305,152403\n305,173033\n306,194518\n306,194545\n307,147\n307,306\n307,682\n307,72439\n308,151\n308,309\n308,310\n309,10\n309,175\n309,309\n309,310\n309,483\n309,693\n309,880\n309,1796\n309,2312\n309,4548\n309,6556\n309,6627\n309,13524\n309,14080\n309,30497\n309,38524\n309,65681\n309,176761\n309,193486\n309,206368\n309,232766\n309,255168\n309,259622\n309,265159\n310,310\n311,312\n312,87\n312,104\n312,111\n312,182\n312,314\n312,358\n312,420\n312,457\n312,509\n312,510\n312,590\n312,604\n312,615\n312,875\n312,929\n312,1010\n312,1011\n312,1085\n312,1707\n312,2253\n312,2557\n312,176942\n313,3\n313,10\n313,19\n313,34\n313,35\n313,83\n313,175\n313,217\n313,222\n313,278\n313,283\n313,313\n313,314\n313,379\n313,389\n313,392\n313,431\n313,446\n313,455\n313,536\n313,589\n313,599\n313,634\n313,660\n313,685\n313,693\n313,781\n313,784\n313,849\n313,852\n313,911\n313,949\n313,1019\n313,1021\n313,1130\n313,1201\n313,1274\n313,1281\n313,1313\n313,1417\n313,1467\n313,1472\n313,1504\n313,1571\n313,1618\n313,1708\n313,1718\n313,1770\n313,1848\n313,1849\n313,1871\n313,1881\n313,2159\n313,2168\n313,2220\n313,2224\n313,2235\n313,2253\n313,2266\n313,2290\n313,2310\n313,2419\n313,2421\n313,2424\n313,2615\n313,2619\n313,2646\n313,2649\n313,2779\n313,2784\n313,2855\n313,2874\n313,2944\n313,3507\n313,3513\n313,3643\n313,4081\n313,4127\n313,4166\n313,4224\n313,4303\n313,5173\n313,5210\n313,5326\n313,5470\n313,5591\n313,5812\n313,5859\n313,5887\n313,6012\n313,6506\n313,6605\n313,6828\n313,7318\n313,7698\n313,8097\n313,8208\n313,13240\n313,13389\n313,13420\n313,13980\n313,14556\n313,14612\n313,14856\n313,15547\n313,15694\n313,17041\n313,17273\n313,18650\n313,18881\n313,19130\n313,19886\n313,19894\n313,20723\n313,21382\n313,21414\n313,22860\n313,24889\n313,25278\n313,25384\n313,25670\n313,26034\n313,27808\n313,28605\n313,30502\n313,30559\n313,31126\n313,32630\n313,33287\n313,33437\n313,33475\n313,33534\n313,33551\n313,34013\n313,35688\n313,36850\n313,37474\n313,37570\n313,39404\n313,39444\n313,39692\n313,41520\n313,44329\n313,44442\n313,48082\n313,49774\n313,55604\n313,56978\n313,57187\n313,57266\n313,58488\n313,59260\n313,60387\n313,60590\n313,61411\n313,63362\n313,64770\n313,75121\n313,77857\n313,79609\n313,79927\n313,90377\n313,90388\n313,90653\n313,94299\n313,95793\n313,98218\n313,98940\n313,106907\n313,107100\n313,115474\n313,117112\n313,117771\n313,119275\n313,122609\n313,125756\n313,126291\n313,129782\n313,131216\n313,131418\n313,133484\n313,133629\n313,135655\n313,136513\n313,136685\n313,138205\n313,138884\n313,140055\n313,146916\n313,148908\n313,148916\n313,149357\n313,150530\n313,152975\n313,154782\n313,161597\n313,169392\n313,169396\n313,169879\n313,172062\n313,172178\n313,174944\n313,175738\n313,175996\n313,176018\n313,176351\n313,176542\n313,176588\n313,181063\n313,182538\n313,186830\n313,188817\n313,189282\n313,189286\n313,189291\n313,194221\n313,194676\n313,207135\n313,211889\n313,213089\n313,213746\n313,221815\n313,222290\n313,224607\n313,224624\n313,226276\n313,226738\n313,234809\n313,236362\n313,236740\n313,241690\n313,242337\n313,243450\n313,243468\n313,243729\n313,244806\n313,250394\n313,250816\n313,251321\n313,251922\n313,252585\n313,253696\n313,253750\n314,3\n314,11\n314,20\n314,22\n314,34\n314,35\n314,56\n314,65\n314,68\n314,83\n314,86\n314,97\n314,106\n314,120\n314,140\n314,146\n314,149\n314,158\n314,160\n314,167\n314,182\n314,192\n314,195\n314,202\n314,207\n314,209\n314,240\n314,248\n314,252\n314,259\n314,264\n314,272\n314,275\n314,287\n314,292\n314,296\n314,299\n314,301\n314,302\n314,312\n314,314\n314,333\n314,336\n314,346\n314,349\n314,356\n314,372\n314,379\n314,392\n314,393\n314,397\n314,406\n314,417\n314,433\n314,435\n314,440\n314,441\n314,442\n314,447\n314,452\n314,455\n314,467\n314,479\n314,493\n314,495\n314,502\n314,505\n314,510\n314,516\n314,534\n314,536\n314,538\n314,592\n314,599\n314,615\n314,622\n314,623\n314,631\n314,663\n314,673\n314,677\n314,685\n314,687\n314,690\n314,693\n314,697\n314,710\n314,712\n314,760\n314,764\n314,775\n314,779\n314,788\n314,801\n314,809\n314,818\n314,843\n314,849\n314,852\n314,868\n314,872\n314,874\n314,900\n314,911\n314,918\n314,920\n314,934\n314,949\n314,968\n314,972\n314,980\n314,1001\n314,1007\n314,1010\n314,1019\n314,1033\n314,1085\n314,1089\n314,1118\n314,1127\n314,1130\n314,1140\n314,1147\n314,1151\n314,1163\n314,1172\n314,1179\n314,1204\n314,1210\n314,1235\n314,1240\n314,1262\n314,1265\n314,1266\n314,1267\n314,1284\n314,1289\n314,1293\n314,1294\n314,1298\n314,1326\n314,1332\n314,1335\n314,1345\n314,1351\n314,1370\n314,1381\n314,1402\n314,1411\n314,1417\n314,1445\n314,1465\n314,1509\n314,1518\n314,1531\n314,1590\n314,1634\n314,1655\n314,1659\n314,1724\n314,1796\n314,1801\n314,1803\n314,1805\n314,1836\n314,1837\n314,1844\n314,1849\n314,1893\n314,1955\n314,1968\n314,1989\n314,1992\n314,2032\n314,2037\n314,2083\n314,2296\n314,2348\n314,2373\n314,2400\n314,2414\n314,2512\n314,2557\n314,2571\n314,2605\n314,2979\n314,3149\n314,3182\n314,3260\n314,3367\n314,3392\n314,3422\n314,3436\n314,3507\n314,3744\n314,3804\n314,4018\n314,4039\n314,4159\n314,4276\n314,4545\n314,4771\n314,5324\n314,5388\n314,5662\n314,5880\n314,6632\n314,6837\n314,6955\n314,7890\n314,8027\n314,8342\n314,13207\n314,13670\n314,14565\n314,15206\n314,15582\n314,15609\n314,19335\n314,19340\n314,19572\n314,19682\n314,19686\n314,20359\n314,21563\n314,23487\n314,23518\n314,23754\n314,26434\n314,26737\n314,31244\n314,31363\n314,32601\n314,32626\n314,34116\n314,35435\n314,37777\n314,38300\n314,40694\n314,41170\n314,41230\n314,41359\n314,41378\n314,43422\n314,49554\n314,60576\n314,65644\n314,68946\n314,71590\n314,75912\n314,81233\n314,82232\n314,88049\n314,90885\n314,93199\n314,94134\n314,97171\n314,97286\n314,99490\n314,100984\n314,109538\n314,114620\n314,116982\n314,117480\n314,118335\n314,118336\n314,124116\n314,127420\n314,134625\n314,134729\n314,139010\n314,143424\n314,148735\n314,150027\n314,150532\n314,156949\n314,158248\n314,161320\n314,162599\n314,167089\n314,172586\n314,176871\n314,177437\n314,177971\n314,187300\n314,187438\n314,191136\n314,197805\n314,202616\n314,204093\n314,205075\n314,205281\n314,205767\n314,214897\n314,215276\n314,215874\n314,220337\n314,220617\n314,223731\n314,227675\n314,228620\n314,232307\n314,243520\n314,250545\n314,252106\n314,255659\n314,257197\n315,20\n315,178\n315,315\n315,346\n315,434\n315,447\n315,538\n315,671\n315,833\n315,996\n315,1068\n315,1118\n315,1294\n315,1474\n315,1651\n315,1789\n315,1877\n315,2085\n315,2253\n315,2353\n315,2730\n315,3166\n315,3726\n315,4646\n315,5482\n315,6573\n315,6622\n315,7040\n315,7470\n315,7495\n315,7778\n315,8036\n315,10186\n315,13796\n315,14221\n315,14397\n315,14428\n315,14447\n315,15563\n315,16494\n315,20526\n315,22149\n315,23138\n315,23782\n315,23809\n315,26420\n315,28139\n315,29167\n315,32791\n315,33298\n315,38158\n315,41226\n315,41378\n315,46235\n315,48103\n315,50034\n315,61719\n315,63949\n315,79518\n315,80836\n315,85859\n315,88367\n315,90933\n315,103575\n315,106939\n315,118491\n315,118917\n315,126696\n315,136105\n315,137011\n315,139652\n315,140122\n315,148843\n315,157704\n315,158729\n315,161617\n315,162620\n315,163378\n315,170181\n315,170542\n315,171870\n315,173885\n315,176155\n315,176157\n315,179202\n315,179217\n315,180474\n315,182819\n315,185430\n315,187299\n315,188866\n315,190492\n315,199287\n315,199466\n315,214195\n315,216191\n315,222010\n315,247359\n315,249731\n315,253099\n315,260155\n316,251\n316,252\n316,318\n316,516\n316,1220\n316,1222\n316,41170\n317,318\n317,41170\n318,252\n318,314\n318,516\n318,1220\n318,1222\n319,320\n321,320\n322,323\n324,323\n325,192\n325,202\n325,203\n325,333\n325,336\n325,422\n325,516\n325,602\n326,22\n326,68\n326,207\n326,287\n326,326\n326,347\n326,381\n326,390\n326,424\n326,433\n326,579\n326,623\n326,693\n326,702\n326,703\n326,752\n326,808\n326,818\n326,845\n326,868\n326,873\n326,874\n326,908\n326,955\n326,1064\n326,1133\n326,1158\n326,1192\n326,1210\n326,1276\n326,1454\n326,1607\n326,1634\n326,1805\n326,1973\n326,2182\n326,2747\n326,3101\n326,3497\n326,3507\n326,3866\n326,4127\n326,4272\n326,5250\n326,5302\n326,5937\n326,6891\n326,7300\n326,7760\n326,8288\n326,14511\n326,17116\n326,17897\n326,18398\n326,18587\n326,20661\n326,21563\n326,24666\n326,25386\n326,25397\n326,28406\n326,30198\n326,30566\n326,32625\n326,34732\n326,34963\n326,44886\n326,45109\n326,46339\n326,46965\n326,48960\n326,53650\n326,54132\n326,58161\n326,58469\n326,58474\n326,60605\n326,61694\n326,62994\n326,75937\n326,80701\n326,89556\n326,89944\n326,93113\n326,94968\n326,95637\n326,96541\n326,96789\n326,97435\n326,101551\n326,105571\n326,106298\n326,106403\n326,109820\n326,111106\n326,117552\n326,117882\n326,117983\n326,120839\n326,123834\n326,125405\n326,127158\n326,132267\n326,142895\n326,148093\n326,152451\n326,159473\n326,168167\n326,168504\n326,168524\n326,182911\n326,184921\n326,186518\n326,191246\n326,198025\n326,200657\n326,204464\n326,212406\n326,214680\n326,214836\n326,214864\n326,218050\n326,222528\n326,228199\n326,231614\n326,232655\n326,245914\n327,30\n327,97\n327,104\n327,134\n327,135\n327,182\n327,215\n327,217\n327,240\n327,248\n327,328\n327,372\n327,406\n327,435\n327,440\n327,457\n327,467\n327,509\n327,510\n327,557\n327,622\n327,693\n327,794\n327,809\n327,953\n327,1011\n327,1019\n327,1033\n327,1085\n327,1119\n327,1140\n327,1179\n327,1282\n327,1332\n327,1417\n327,1429\n327,1531\n327,1749\n327,1782\n327,1844\n327,2173\n327,2443\n327,3246\n327,3247\n327,4276\n327,4355\n327,75912\n328,10\n328,30\n328,97\n328,104\n328,134\n328,135\n328,136\n328,175\n328,200\n328,211\n328,233\n328,248\n328,289\n328,290\n328,294\n328,304\n328,327\n328,328\n328,364\n328,557\n328,588\n328,590\n328,621\n328,622\n328,636\n328,693\n328,704\n328,714\n328,760\n328,772\n328,864\n328,876\n328,898\n328,903\n328,950\n328,953\n328,990\n328,1008\n328,1085\n328,1149\n328,1179\n328,1212\n328,1281\n328,1282\n328,1305\n328,1332\n328,1402\n328,1415\n328,1708\n328,1818\n328,2105\n328,2205\n328,2206\n328,2210\n328,2286\n328,2315\n328,2710\n328,3009\n328,3069\n328,3358\n328,3504\n328,3565\n328,3654\n328,3743\n328,4218\n328,4237\n328,4354\n328,4355\n328,4557\n328,4578\n328,4941\n328,5354\n328,5472\n328,5828\n328,5934\n328,6062\n328,6646\n328,6711\n328,7124\n328,7757\n328,8180\n328,8279\n328,12746\n328,13427\n328,14233\n328,15547\n328,15571\n328,15768\n328,17125\n328,18194\n328,21081\n328,21626\n328,21822\n328,21865\n328,24826\n328,26924\n328,27705\n328,28203\n328,29055\n328,29374\n328,31067\n328,31368\n328,31453\n328,31662\n328,31860\n328,32848\n328,33424\n328,35231\n328,36275\n328,36586\n328,36590\n328,36632\n328,36822\n328,37730\n328,43433\n328,43893\n328,43911\n328,55929\n328,57143\n328,62335\n328,70900\n328,77758\n328,85814\n328,85829\n328,86815\n328,94134\n328,95674\n328,102866\n328,108214\n328,122157\n328,122553\n328,126162\n328,127873\n328,128215\n328,129835\n328,130507\n328,131650\n328,139700\n328,140358\n328,159154\n328,159278\n328,160517\n328,161581\n328,163733\n328,163881\n328,163906\n328,164626\n328,164633\n328,164634\n328,165083\n328,165491\n328,165506\n328,165876\n328,166407\n328,167769\n328,167770\n328,167862\n328,168391\n328,168574\n328,168586\n328,168877\n328,170086\n328,170904\n328,171712\n328,173716\n328,174511\n328,176141\n328,176974\n328,177438\n328,177517\n328,178026\n328,179425\n328,180104\n328,181293\n328,181499\n328,181856\n328,182552\n328,182616\n328,185087\n328,185314\n328,186321\n328,186609\n328,186831\n328,187182\n328,190187\n328,192057\n328,194516\n328,194542\n328,202709\n328,205114\n328,206762\n328,207116\n328,207572\n328,217657\n328,217738\n328,223797\n328,224499\n328,224534\n328,231192\n328,232810\n328,233839\n328,234085\n328,239040\n328,239046\n328,241714\n328,242503\n328,244936\n328,251892\n328,261917\n328,262188\n328,262189\n329,330\n330,5\n330,171\n330,330\n330,957\n330,1815\n330,4161\n331,332\n332,68\n332,104\n332,120\n332,134\n332,240\n332,248\n332,261\n332,323\n332,331\n332,332\n332,372\n332,373\n332,390\n332,413\n332,431\n332,446\n332,536\n332,557\n332,631\n332,680\n332,685\n332,715\n332,781\n332,784\n332,794\n332,805\n332,823\n332,838\n332,862\n332,1014\n332,1029\n332,1085\n332,1119\n332,1203\n332,1242\n332,1285\n332,1346\n332,1353\n332,1357\n332,1459\n332,1466\n332,1608\n332,1635\n332,1807\n332,1808\n332,1888\n332,1955\n332,2408\n332,2512\n332,2619\n332,2646\n332,2775\n332,2991\n332,3328\n332,4787\n332,5053\n332,5346\n332,8276\n332,8285\n332,8712\n332,9118\n332,13207\n332,13217\n332,13478\n332,14080\n332,14364\n332,14474\n332,14547\n332,14597\n332,14934\n332,15183\n332,16481\n332,17116\n332,17882\n332,18142\n332,20823\n332,21290\n332,21449\n332,22288\n332,23474\n332,27041\n332,30268\n332,32576\n332,32751\n332,33602\n332,34515\n332,34797\n332,34881\n332,36954\n332,37100\n332,37515\n332,37816\n332,37895\n332,40723\n332,41230\n332,41871\n332,42762\n332,43394\n332,45712\n332,45714\n332,46862\n332,50152\n332,51880\n332,53004\n332,56583\n332,58027\n332,62419\n332,62964\n332,63626\n332,64145\n332,66637\n332,73979\n332,78967\n332,82114\n332,83455\n332,88074\n332,93860\n332,97607\n332,97766\n332,98236\n332,102250\n332,105581\n332,109945\n332,117816\n332,120905\n332,123007\n332,124521\n332,125061\n332,125140\n332,125659\n332,126147\n332,127158\n332,127719\n332,129085\n332,132928\n332,134115\n332,139553\n332,139649\n332,140747\n332,140917\n332,142997\n332,143961\n332,147337\n332,152311\n332,162503\n332,167342\n332,180159\n332,182308\n332,182345\n332,184908\n332,186058\n332,191967\n332,200272\n332,215188\n332,215877\n332,219068\n332,224517\n332,227227\n332,228295\n332,231693\n332,231954\n332,238996\n332,247366\n332,250800\n332,251481\n332,256947\n332,260393\n332,264582\n333,1\n333,10\n333,11\n333,44\n333,50\n333,56\n333,99\n333,106\n333,146\n333,147\n333,158\n333,192\n333,195\n333,202\n333,238\n333,240\n333,256\n333,261\n333,314\n333,325\n333,333\n333,336\n333,337\n333,406\n333,422\n333,439\n333,457\n333,469\n333,505\n333,585\n333,586\n333,599\n333,602\n333,621\n333,622\n333,640\n333,663\n333,664\n333,779\n333,818\n333,841\n333,843\n333,849\n333,920\n333,939\n333,1011\n333,1027\n333,1033\n333,1089\n333,1163\n333,1181\n333,1192\n333,1218\n333,1370\n333,1464\n333,1515\n333,1521\n333,1531\n333,1562\n333,1598\n333,1619\n333,1623\n333,1825\n333,1969\n333,1973\n333,1985\n333,2014\n333,2132\n333,2183\n333,2253\n333,2374\n333,2710\n333,2811\n333,2955\n333,3507\n333,3895\n333,3897\n333,3970\n333,4190\n333,4368\n333,4752\n333,5401\n333,5480\n333,6119\n333,7182\n333,7241\n333,7296\n333,7425\n333,7766\n333,7900\n333,8606\n333,9394\n333,13430\n333,13500\n333,13576\n333,14233\n333,15087\n333,15143\n333,15216\n333,15230\n333,15313\n333,16563\n333,17151\n333,17310\n333,18487\n333,18637\n333,18761\n333,18941\n333,18997\n333,19939\n333,20598\n333,21092\n333,21442\n333,21736\n333,22241\n333,22616\n333,22788\n333,22903\n333,23478\n333,23725\n333,23783\n333,23999\n333,24162\n333,24505\n333,25302\n333,25560\n333,25673\n333,26414\n333,27310\n333,28954\n333,29334\n333,29790\n333,29895\n333,29900\n333,30331\n333,30798\n333,30806\n333,31530\n333,32174\n333,32562\n333,33305\n333,33590\n333,33672\n333,33755\n333,35577\n333,36280\n333,36411\n333,36434\n333,36444\n333,36485\n333,36502\n333,36512\n333,36519\n333,36562\n333,36676\n333,36711\n333,36783\n333,38128\n333,38419\n333,39140\n333,39618\n333,39722\n333,41381\n333,41843\n333,41892\n333,46336\n333,48301\n333,48364\n333,48403\n333,50180\n333,50250\n333,50278\n333,50283\n333,50287\n333,50376\n333,50444\n333,50712\n333,54728\n333,55326\n333,56386\n333,56667\n333,57002\n333,57624\n333,59020\n333,59021\n333,60576\n333,62151\n333,62165\n333,62208\n333,62633\n333,62890\n333,63414\n333,63508\n333,63743\n333,64157\n333,64582\n333,65809\n333,66687\n333,67148\n333,69135\n333,70166\n333,70460\n333,70711\n333,71318\n333,73327\n333,73364\n333,73553\n333,73621\n333,74165\n333,74806\n333,75783\n333,75819\n333,76325\n333,76715\n333,76867\n333,80397\n333,81787\n333,84059\n333,85566\n333,87136\n333,91833\n333,92361\n333,93728\n333,94784\n333,95392\n333,95516\n333,96660\n333,97460\n333,97537\n333,97538\n333,97567\n333,97614\n333,97880\n333,101045\n333,102862\n333,103868\n333,109411\n333,110921\n333,111311\n333,112711\n333,113680\n333,116499\n333,116711\n333,117042\n333,117058\n333,117113\n333,118849\n333,120155\n333,120406\n333,121380\n333,121754\n333,122233\n333,122451\n333,124052\n333,124621\n333,124847\n333,125290\n333,127143\n333,127158\n333,127514\n333,128295\n333,128412\n333,128966\n333,133161\n333,133983\n333,135059\n333,135761\n333,136638\n333,136979\n333,138158\n333,138159\n333,138160\n333,138161\n333,138162\n333,138163\n333,138164\n333,138165\n333,138214\n333,138215\n333,138216\n333,138217\n333,138218\n333,138219\n333,138220\n333,138221\n333,138222\n333,138223\n333,138224\n333,141155\n333,142453\n333,142896\n333,143247\n333,143338\n333,147329\n333,148090\n333,151035\n333,154392\n333,156352\n333,160341\n333,166321\n333,166369\n333,167714\n333,172151\n333,174360\n333,174389\n333,174500\n333,174596\n333,174805\n333,175312\n333,175405\n333,176820\n333,177139\n333,177354\n333,178270\n333,179594\n333,180487\n333,181560\n333,184899\n333,185878\n333,188509\n333,188596\n333,190252\n333,191806\n333,192073\n333,192468\n333,192947\n333,197205\n333,198478\n333,202943\n333,204124\n333,204415\n333,213171\n333,216580\n333,220940\n333,223446\n333,224442\n333,226813\n333,228887\n333,228943\n333,230349\n333,231077\n333,231983\n333,238753\n333,240174\n333,240940\n333,242474\n333,243368\n333,243995\n333,245464\n333,245533\n333,245719\n333,246276\n333,248747\n333,253720\n333,258310\n333,260372\n333,260774\n333,261310\n333,261866\n333,262609\n333,264150\n334,335\n334,8708\n334,24244\n334,31655\n334,38511\n334,66935\n334,120731\n336,1\n336,10\n336,11\n336,50\n336,56\n336,79\n336,99\n336,106\n336,126\n336,146\n336,147\n336,149\n336,158\n336,175\n336,182\n336,192\n336,195\n336,202\n336,203\n336,206\n336,252\n336,256\n336,259\n336,285\n336,314\n336,325\n336,333\n336,336\n336,337\n336,397\n336,406\n336,422\n336,425\n336,438\n336,452\n336,457\n336,497\n336,500\n336,505\n336,512\n336,516\n336,586\n336,599\n336,602\n336,620\n336,622\n336,638\n336,640\n336,663\n336,664\n336,668\n336,673\n336,676\n336,685\n336,733\n336,778\n336,779\n336,794\n336,818\n336,838\n336,841\n336,843\n336,849\n336,852\n336,857\n336,900\n336,920\n336,929\n336,972\n336,998\n336,1011\n336,1014\n336,1089\n336,1118\n336,1130\n336,1152\n336,1162\n336,1181\n336,1191\n336,1198\n336,1204\n336,1218\n336,1220\n336,1222\n336,1262\n336,1293\n336,1328\n336,1331\n336,1370\n336,1417\n336,1425\n336,1430\n336,1458\n336,1512\n336,1515\n336,1521\n336,1566\n336,1572\n336,1619\n336,1623\n336,1655\n336,1663\n336,1678\n336,1776\n336,1803\n336,1825\n336,1833\n336,1844\n336,1927\n336,1940\n336,1992\n336,1993\n336,2014\n336,2022\n336,2120\n336,2125\n336,2244\n336,2253\n336,2254\n336,2288\n336,2310\n336,2373\n336,2471\n336,2528\n336,2552\n336,2574\n336,2903\n336,2923\n336,3370\n336,3398\n336,3524\n336,3813\n336,3895\n336,3933\n336,4105\n336,4164\n336,4165\n336,4190\n336,4344\n336,4529\n336,4663\n336,4751\n336,5192\n336,5386\n336,5401\n336,5495\n336,5631\n336,5666\n336,5725\n336,5900\n336,5913\n336,6119\n336,6373\n336,6393\n336,6736\n336,6824\n336,7443\n336,8127\n336,8244\n336,8520\n336,8538\n336,8641\n336,8676\n336,8971\n336,9738\n336,13197\n336,13270\n336,13289\n336,13493\n336,13556\n336,14289\n336,14433\n336,14637\n336,14674\n336,14830\n336,14833\n336,15098\n336,15560\n336,15582\n336,15795\n336,15829\n336,16010\n336,16688\n336,17151\n336,18327\n336,18761\n336,18997\n336,19413\n336,19555\n336,19578\n336,19589\n336,19899\n336,20035\n336,20071\n336,20214\n336,20535\n336,20540\n336,20757\n336,21394\n336,21442\n336,21584\n336,21623\n336,22015\n336,22367\n336,22494\n336,22616\n336,23783\n336,24832\n336,26172\n336,26414\n336,26453\n336,28364\n336,28969\n336,29195\n336,29771\n336,29890\n336,30331\n336,31151\n336,31300\n336,33672\n336,34001\n336,34259\n336,34267\n336,34512\n336,34731\n336,35561\n336,40709\n336,40782\n336,41827\n336,41844\n336,42064\n336,42290\n336,43230\n336,43885\n336,44391\n336,44484\n336,44922\n336,45509\n336,45702\n336,45993\n336,46070\n336,48999\n336,49317\n336,49762\n336,49791\n336,50422\n336,51413\n336,55254\n336,55623\n336,56958\n336,59020\n336,60576\n336,61162\n336,62801\n336,62806\n336,63569\n336,63580\n336,64049\n336,64506\n336,64620\n336,65809\n336,66348\n336,70725\n336,71998\n336,72825\n336,72855\n336,76946\n336,79749\n336,79874\n336,80266\n336,83383\n336,84078\n336,85433\n336,89035\n336,89750\n336,90760\n336,90809\n336,92476\n336,93648\n336,102560\n336,102922\n336,103833\n336,103852\n336,104926\n336,106502\n336,108062\n336,110934\n336,112555\n336,116186\n336,117269\n336,118336\n336,121110\n336,124525\n336,141883\n336,141912\n336,144429\n336,145396\n336,146917\n336,148601\n336,149251\n336,150788\n336,151061\n336,152982\n336,154479\n336,157904\n336,158847\n336,160912\n336,162001\n336,162011\n336,164572\n336,167494\n336,168804\n336,168976\n336,169488\n336,170414\n336,171114\n336,171216\n336,172555\n336,174797\n336,176057\n336,177257\n336,177828\n336,179223\n336,186151\n336,189757\n336,191313\n336,192610\n336,193462\n336,205678\n336,207659\n336,216170\n336,216546\n336,227744\n336,230021\n336,238470\n336,239555\n336,239633\n336,241720\n336,261482\n337,106\n337,192\n337,333\n337,336\n337,337\n337,397\n337,440\n337,446\n337,505\n337,586\n337,602\n337,638\n337,663\n337,664\n337,685\n337,794\n337,838\n337,852\n337,911\n337,937\n337,1107\n337,1370\n337,1619\n337,1796\n337,1821\n337,1985\n337,2077\n337,2400\n337,2580\n337,2782\n337,3507\n337,3669\n337,4245\n337,6553\n337,6585\n337,7830\n337,7897\n337,8867\n337,14198\n337,16190\n337,20168\n337,20425\n337,20438\n337,21528\n337,23103\n337,24934\n337,26034\n337,26345\n337,26849\n337,31216\n337,32658\n337,32721\n337,34094\n337,36534\n337,36611\n337,43182\n337,45716\n337,49321\n337,50090\n337,50441\n337,50507\n337,50616\n337,51884\n337,55014\n337,58853\n337,59020\n337,59115\n337,60576\n337,63662\n337,64067\n337,65640\n337,71582\n337,74315\n337,75303\n337,80966\n337,82870\n337,87762\n337,87799\n337,89752\n337,90181\n337,101056\n337,104327\n337,105526\n337,115382\n337,118221\n337,118897\n337,118901\n337,118904\n337,119870\n337,120826\n337,125027\n337,135278\n337,135954\n337,136015\n337,138665\n337,138708\n337,141949\n337,145421\n337,148822\n337,150794\n337,151087\n337,161505\n337,163840\n337,167012\n337,167018\n337,167648\n337,169426\n337,169956\n337,172052\n337,172087\n337,173706\n337,174895\n337,175277\n337,175286\n337,178551\n337,178553\n337,180261\n337,182736\n337,188665\n337,188666\n337,188667\n337,188669\n337,189138\n337,199378\n337,216569\n337,221825\n337,231052\n338,34\n338,35\n338,107\n338,111\n338,138\n338,192\n338,207\n338,256\n338,278\n338,292\n338,309\n338,310\n338,535\n338,668\n338,673\n338,745\n338,783\n338,872\n338,911\n338,1130\n338,1204\n338,1210\n338,1241\n338,1313\n338,1332\n338,1572\n338,1688\n338,1722\n338,2201\n338,2915\n338,3538\n338,4039\n338,5662\n338,115474\n338,181063\n338,188791\n339,340\n341,342\n343,344\n344,58\n344,256\n344,344\n344,685\n344,733\n344,911\n344,1559\n344,4260\n345,346\n346,20\n346,240\n346,272\n346,346\n346,435\n346,439\n346,447\n346,538\n346,670\n346,671\n346,673\n346,698\n346,714\n346,795\n346,911\n346,934\n346,939\n346,996\n346,1033\n346,1068\n346,1155\n346,1294\n346,1474\n346,1590\n346,1612\n346,1644\n346,1789\n346,1848\n346,2094\n346,2102\n346,2152\n346,2340\n346,2352\n346,2353\n346,2427\n346,2514\n346,2770\n346,3562\n346,3626\n346,3924\n346,4205\n346,4394\n346,4399\n346,4419\n346,4426\n346,4514\n346,4646\n346,5189\n346,5962\n346,6669\n346,6672\n346,6966\n346,8374\n346,9454\n346,13255\n346,13425\n346,14076\n346,14370\n346,14380\n346,14428\n346,15141\n346,15355\n346,16677\n346,18116\n346,18394\n346,18416\n346,18689\n346,19191\n346,19445\n346,19698\n346,19699\n346,20611\n346,20722\n346,20923\n346,23569\n346,23779\n346,24507\n346,24540\n346,24544\n346,25279\n346,25482\n346,26271\n346,26652\n346,26787\n346,26814\n346,26864\n346,27992\n346,29583\n346,29870\n346,30775\n346,31170\n346,32578\n346,32795\n346,33627\n346,35497\n346,38168\n346,38201\n346,38754\n346,40346\n346,40497\n346,43317\n346,44620\n346,44990\n346,47827\n346,48649\n346,49494\n346,50034\n346,52128\n346,54295\n346,54346\n346,55298\n346,55612\n346,56408\n346,56801\n346,57124\n346,58412\n346,58594\n346,58947\n346,59630\n346,63481\n346,67564\n346,70661\n346,71901\n346,71992\n346,72137\n346,73424\n346,80668\n346,81039\n346,82624\n346,86086\n346,99694\n346,101621\n346,103772\n346,104454\n346,104747\n346,109885\n346,114276\n346,124459\n346,125231\n346,126696\n346,128831\n346,129922\n346,129928\n346,130681\n346,134698\n346,136618\n346,143610\n346,144732\n346,146610\n346,148853\n346,152485\n346,152724\n346,152983\n346,153197\n346,153237\n346,155434\n346,155724\n346,157386\n346,157401\n346,157444\n346,157584\n346,157705\n346,158173\n346,158262\n346,159497\n346,159703\n346,161047\n346,162106\n346,165728\n346,166506\n346,171152\n346,172578\n346,173779\n346,176383\n346,176468\n346,177664\n346,180938\n346,181395\n346,181701\n346,182781\n346,182844\n346,184992\n346,188806\n346,190492\n346,191456\n346,193473\n346,193856\n346,195488\n346,195641\n346,195729\n346,197782\n346,203142\n346,207560\n346,212190\n346,212853\n346,212967\n346,212987\n346,213769\n346,214565\n346,214573\n346,215345\n346,215755\n346,218784\n346,218807\n346,219914\n346,219959\n346,220289\n346,230984\n346,234084\n346,236081\n346,237522\n346,238250\n346,239600\n346,239850\n346,239914\n346,241553\n346,242357\n346,244183\n346,246021\n346,247921\n346,248717\n346,249888\n346,251896\n346,251991\n346,252097\n346,252261\n346,252268\n346,252280\n346,252557\n346,257785\n346,259052\n346,259158\n346,259553\n346,259674\n346,260254\n346,260373\n346,261692\n347,207\n347,287\n347,326\n347,347\n347,751\n347,752\n347,873\n347,874\n347,1076\n347,1133\n347,1210\n347,3570\n347,4039\n347,4081\n347,6406\n347,6880\n347,9756\n347,14684\n347,14908\n347,15232\n347,20222\n347,20870\n347,21593\n347,23390\n347,27835\n347,45050\n347,60444\n347,90681\n347,94875\n347,126815\n347,126929\n347,127477\n348,349\n349,34\n349,35\n349,192\n349,256\n349,287\n349,292\n349,314\n349,349\n349,356\n349,433\n349,509\n349,510\n349,623\n349,673\n349,685\n349,809\n349,818\n349,849\n349,852\n349,872\n349,875\n349,911\n349,919\n349,1130\n349,1133\n349,1210\n349,1240\n349,1465\n349,1805\n349,1860\n349,2372\n349,2607\n349,4760\n349,6904\n349,6955\n349,26450\n349,127158\n350,167\n350,676\n350,3138\n351,336\n352,510\n352,1021\n352,1172\n352,1518\n352,6452\n352,7880\n352,13814\n353,353\n354,355\n355,4\n355,5\n355,355\n355,527\n355,1219\n355,4810\n355,7506\n355,14125\n355,14316\n355,16369\n355,21944\n355,37079\n355,66672\n355,69810\n355,86111\n355,97186\n355,117850\n355,118543\n355,122196\n355,122440\n355,124443\n355,143152\n355,161997\n355,172780\n355,172980\n355,182084\n355,186672\n355,192675\n355,203447\n355,217979\n356,32\n356,68\n356,83\n356,147\n356,195\n356,202\n356,203\n356,207\n356,211\n356,248\n356,278\n356,287\n356,299\n356,314\n356,326\n356,336\n356,347\n356,349\n356,356\n356,390\n356,392\n356,452\n356,462\n356,505\n356,516\n356,563\n356,595\n356,599\n356,615\n356,631\n356,634\n356,690\n356,704\n356,712\n356,762\n356,788\n356,801\n356,843\n356,852\n356,872\n356,873\n356,900\n356,911\n356,940\n356,968\n356,972\n356,1011\n356,1012\n356,1014\n356,1085\n356,1148\n356,1151\n356,1172\n356,1179\n356,1243\n356,1284\n356,1285\n356,1298\n356,1309\n356,1319\n356,1326\n356,1345\n356,1436\n356,1454\n356,1479\n356,1518\n356,1531\n356,1544\n356,1572\n356,1616\n356,1715\n356,1722\n356,1805\n356,1844\n356,1849\n356,1888\n356,1955\n356,2000\n356,2006\n356,2334\n356,2372\n356,2373\n356,2436\n356,2529\n356,2590\n356,2615\n356,2784\n356,2812\n356,2913\n356,2989\n356,2991\n356,3422\n356,3474\n356,4112\n356,4222\n356,4428\n356,4660\n356,5326\n356,5591\n356,6068\n356,6473\n356,6673\n356,6676\n356,6837\n356,7774\n356,8097\n356,8276\n356,8479\n356,8563\n356,13240\n356,14534\n356,14580\n356,14667\n356,15159\n356,15227\n356,15382\n356,15651\n356,17211\n356,18345\n356,18501\n356,19490\n356,19535\n356,19572\n356,19805\n356,21589\n356,21593\n356,23481\n356,23845\n356,24583\n356,24963\n356,25480\n356,25870\n356,26202\n356,26450\n356,28487\n356,29793\n356,29985\n356,30328\n356,30450\n356,30872\n356,31365\n356,33431\n356,34013\n356,34419\n356,35040\n356,35428\n356,36685\n356,36773\n356,37503\n356,38434\n356,41147\n356,41365\n356,41567\n356,41936\n356,42590\n356,42990\n356,43342\n356,44491\n356,46165\n356,46359\n356,48101\n356,48397\n356,54402\n356,55716\n356,55947\n356,56412\n356,56587\n356,56650\n356,59702\n356,59723\n356,59755\n356,61193\n356,61194\n356,61195\n356,61196\n356,61197\n356,61200\n356,61201\n356,61285\n356,61358\n356,63582\n356,63880\n356,65832\n356,66584\n356,67154\n356,67913\n356,69119\n356,70221\n356,70792\n356,71914\n356,73265\n356,74515\n356,74583\n356,75153\n356,76134\n356,76181\n356,79613\n356,80009\n356,81993\n356,83970\n356,84505\n356,87066\n356,87112\n356,87749\n356,87759\n356,87775\n356,87962\n356,88805\n356,89638\n356,91599\n356,92883\n356,93199\n356,95380\n356,96342\n356,97607\n356,98871\n356,98874\n356,102672\n356,103194\n356,103219\n356,103395\n356,103877\n356,105686\n356,105721\n356,106255\n356,107077\n356,107452\n356,109322\n356,109479\n356,110673\n356,110678\n356,112931\n356,113061\n356,115636\n356,116087\n356,116117\n356,116606\n356,118956\n356,119156\n356,119393\n356,120987\n356,121453\n356,122984\n356,123894\n356,125755\n356,126736\n356,126908\n356,127788\n356,128951\n356,129717\n356,132891\n356,134097\n356,138782\n356,139377\n356,140127\n356,140427\n356,143371\n356,145852\n356,145963\n356,147415\n356,149275\n356,149277\n356,149293\n356,150294\n356,151552\n356,152503\n356,153877\n356,154004\n356,154772\n356,154896\n356,156304\n356,156424\n356,156691\n356,157383\n356,158604\n356,159045\n356,159048\n356,159054\n356,159800\n356,162609\n356,163874\n356,165373\n356,168385\n356,168386\n356,168390\n356,168393\n356,168402\n356,169014\n356,169480\n356,169829\n356,169942\n356,171153\n356,171277\n356,172560\n356,172572\n356,172584\n356,173352\n356,173711\n356,173836\n356,174469\n356,175304\n356,175426\n356,175515\n356,175529\n356,175957\n356,176838\n356,177952\n356,179258\n356,180159\n356,180848\n356,181851\n356,182518\n356,185033\n356,185275\n356,185884\n356,185920\n356,185991\n356,187330\n356,192617\n356,193492\n356,193521\n356,193558\n356,194602\n356,195660\n356,196848\n356,197653\n356,203174\n356,204176\n356,204780\n356,205691\n356,206022\n356,214246\n356,214572\n356,215263\n356,216032\n356,216399\n356,218659\n356,221035\n356,221672\n356,222459\n356,222495\n356,223962\n356,225811\n356,228182\n356,228263\n356,228316\n356,229077\n356,229632\n356,230287\n356,239837\n356,241788\n356,242266\n356,244870\n356,251077\n356,254312\n356,255585\n356,255705\n356,256868\n356,256901\n356,258196\n356,258761\n356,263097\n357,358\n358,22\n358,312\n358,358\n358,389\n358,509\n358,510\n358,525\n358,779\n358,875\n358,1192\n358,1345\n358,1515\n358,1973\n358,2083\n358,29008\n359,360\n360,256\n360,275\n360,314\n360,397\n360,452\n360,599\n360,673\n360,676\n360,762\n360,849\n360,911\n360,929\n360,1014\n360,1130\n360,1262\n360,1465\n360,1805\n360,2373\n360,2460\n360,4039\n360,4190\n360,4571\n360,6824\n360,6904\n360,9457\n360,20757\n360,182465\n360,215874\n361,362\n363,364\n363,431\n363,634\n364,30\n364,135\n364,138\n364,200\n364,225\n364,248\n364,328\n364,364\n364,431\n364,450\n364,557\n364,609\n364,694\n364,715\n364,772\n364,784\n364,850\n364,943\n364,944\n364,999\n364,1011\n364,1332\n364,1340\n364,1388\n364,1415\n364,1547\n364,1737\n364,1808\n364,1844\n364,2039\n364,2315\n364,2450\n364,2629\n364,2775\n364,3010\n364,3085\n364,3099\n364,3842\n364,4276\n364,4673\n364,4713\n364,5439\n364,5716\n364,6139\n364,6572\n364,7214\n364,7809\n364,8151\n364,8197\n364,8385\n364,8458\n364,8781\n364,13207\n364,13563\n364,13567\n364,14227\n364,14535\n364,14952\n364,16351\n364,18600\n364,19110\n364,19314\n364,20356\n364,20367\n364,20510\n364,21382\n364,21545\n364,22308\n364,22327\n364,22428\n364,22444\n364,23475\n364,24886\n364,24906\n364,26425\n364,26993\n364,27002\n364,27097\n364,27433\n364,30533\n364,30548\n364,32339\n364,33586\n364,34909\n364,41895\n364,44166\n364,52543\n364,55598\n364,57372\n364,62361\n364,62612\n364,63428\n364,63435\n364,63656\n364,64284\n364,64603\n364,64640\n364,64700\n364,64857\n364,65081\n364,65626\n364,67501\n364,67890\n364,70075\n364,70111\n364,70332\n364,73312\n364,78350\n364,78877\n364,79992\n364,80229\n364,80295\n364,82647\n364,85814\n364,95521\n364,98904\n364,99043\n364,112285\n364,112897\n364,113533\n364,113560\n364,125194\n364,125195\n364,126388\n364,126390\n364,127668\n364,130513\n364,130864\n364,132584\n364,133135\n364,133388\n364,133389\n364,133394\n364,138167\n364,139764\n364,141177\n364,145165\n364,147980\n364,147981\n364,156490\n364,158803\n364,159086\n364,162591\n364,180562\n364,187480\n364,190276\n364,195087\n364,195697\n365,366\n366,10\n366,109\n366,178\n366,182\n366,186\n366,192\n366,211\n366,366\n366,452\n366,500\n366,510\n366,718\n366,872\n366,929\n366,1014\n366,1048\n366,1107\n366,1390\n366,1417\n366,1796\n366,2175\n366,2520\n366,2531\n366,2602\n366,2606\n366,2707\n366,3087\n366,3173\n366,3727\n366,4094\n366,4101\n366,4375\n366,4871\n366,5386\n366,5401\n366,5652\n366,5681\n366,5726\n366,6583\n366,6614\n366,6987\n366,7078\n366,7413\n366,7429\n366,7758\n366,7908\n366,7941\n366,7994\n366,8069\n366,9436\n366,9721\n366,13382\n366,13763\n366,14064\n366,14122\n366,14967\n366,15560\n366,16458\n366,17021\n366,17151\n366,17356\n366,18984\n366,19396\n366,19426\n366,20035\n366,20645\n366,20760\n366,21702\n366,21920\n366,22296\n366,23623\n366,23771\n366,23819\n366,24678\n366,25165\n366,25179\n366,26006\n366,26060\n366,26249\n366,28851\n366,29031\n366,29179\n366,29924\n366,30716\n366,30903\n366,31272\n366,31874\n366,32348\n366,33042\n366,35730\n366,38194\n366,38531\n366,41594\n366,42778\n366,43304\n366,43429\n366,43740\n366,43744\n366,47484\n366,48046\n366,48383\n366,48771\n366,49257\n366,52101\n366,52102\n366,52107\n366,52108\n366,52109\n366,52110\n366,52114\n366,52115\n366,52120\n366,52121\n366,52122\n366,52126\n366,52129\n366,52131\n366,53420\n366,53860\n366,56080\n366,56098\n366,56396\n366,58121\n366,64595\n366,69672\n366,69906\n366,70723\n366,70843\n366,75316\n366,76312\n366,80065\n366,81140\n366,82151\n366,85909\n366,86369\n366,86938\n366,88467\n366,89332\n366,90935\n366,91435\n366,93702\n366,95952\n366,98513\n366,99920\n366,102796\n366,104129\n366,105319\n366,106300\n366,110905\n366,111892\n366,113574\n366,117810\n366,119165\n366,119456\n366,121093\n366,126817\n366,130976\n366,131228\n366,131246\n366,132931\n366,141024\n366,142185\n366,142915\n366,148721\n366,149752\n366,150472\n366,156526\n366,156991\n366,159103\n366,159117\n366,160241\n366,160244\n366,170010\n366,170421\n366,172165\n366,176702\n366,177487\n366,177512\n366,178882\n366,181949\n366,183955\n366,185374\n366,193270\n366,199569\n366,204846\n366,216615\n366,218170\n366,218855\n366,224650\n366,226481\n367,366\n368,366\n369,366\n370,366\n371,366\n372,24\n372,71\n372,104\n372,120\n372,134\n372,135\n372,167\n372,227\n372,233\n372,240\n372,261\n372,289\n372,290\n372,299\n372,301\n372,304\n372,314\n372,327\n372,332\n372,372\n372,373\n372,390\n372,397\n372,400\n372,431\n372,444\n372,446\n372,452\n372,502\n372,572\n372,588\n372,589\n372,590\n372,599\n372,612\n372,631\n372,636\n372,661\n372,693\n372,694\n372,714\n372,715\n372,794\n372,805\n372,818\n372,849\n372,852\n372,932\n372,1001\n372,1010\n372,1061\n372,1081\n372,1082\n372,1085\n372,1118\n372,1119\n372,1122\n372,1130\n372,1133\n372,1203\n372,1285\n372,1293\n372,1309\n372,1332\n372,1353\n372,1361\n372,1459\n372,1505\n372,1635\n372,1715\n372,1775\n372,1796\n372,1807\n372,1955\n372,2008\n372,2206\n372,2208\n372,2209\n372,2296\n372,2316\n372,2443\n372,2512\n372,2657\n372,2729\n372,2747\n372,2775\n372,2812\n372,2991\n372,3328\n372,3582\n372,3607\n372,3619\n372,3866\n372,3879\n372,4308\n372,4363\n372,4540\n372,4723\n372,4886\n372,5011\n372,5186\n372,5278\n372,5472\n372,5520\n372,5646\n372,5654\n372,6004\n372,6068\n372,7182\n372,7395\n372,7759\n372,7805\n372,7852\n372,7920\n372,7966\n372,8107\n372,8180\n372,8187\n372,8446\n372,9342\n372,9391\n372,9739\n372,13274\n372,13506\n372,13524\n372,13698\n372,14080\n372,14124\n372,14597\n372,14603\n372,15226\n372,15962\n372,16192\n372,16479\n372,16955\n372,17073\n372,18515\n372,18626\n372,19798\n372,19868\n372,20560\n372,22150\n372,22509\n372,24757\n372,24839\n372,24967\n372,26905\n372,27132\n372,28940\n372,29760\n372,29854\n372,30068\n372,30373\n372,30680\n372,30733\n372,31335\n372,31796\n372,32478\n372,32634\n372,32650\n372,35802\n372,36589\n372,37368\n372,37407\n372,37599\n372,38300\n372,41169\n372,41247\n372,42839\n372,43347\n372,45407\n372,46830\n372,46874\n372,47173\n372,49035\n372,52539\n372,55568\n372,59043\n372,61896\n372,62482\n372,62591\n372,63656\n372,65326\n372,65681\n372,65909\n372,69304\n372,69322\n372,69624\n372,70048\n372,70322\n372,71078\n372,71950\n372,72639\n372,72657\n372,74148\n372,74355\n372,74696\n372,75912\n372,82801\n372,83441\n372,84750\n372,85730\n372,86390\n372,94134\n372,97597\n372,98271\n372,98284\n372,98932\n372,102250\n372,103860\n372,104590\n372,106945\n372,107096\n372,107408\n372,110217\n372,111431\n372,112504\n372,112527\n372,114064\n372,114553\n372,116102\n372,118261\n372,118374\n372,118521\n372,118678\n372,121749\n372,122448\n372,123007\n372,125592\n372,127029\n372,130278\n372,131972\n372,132005\n372,132232\n372,132604\n372,132660\n372,132823\n372,133111\n372,133309\n372,135862\n372,137069\n372,137167\n372,137261\n372,138309\n372,138310\n372,138311\n372,139652\n372,139702\n372,142066\n372,142808\n372,144988\n372,145598\n372,148763\n372,150741\n372,152226\n372,153306\n372,153931\n372,154816\n372,155547\n372,159383\n372,159425\n372,159428\n372,161383\n372,162456\n372,163351\n372,163917\n372,164706\n372,167834\n372,169103\n372,169229\n372,169420\n372,169422\n372,173359\n372,174341\n372,174479\n372,174910\n372,175315\n372,175903\n372,176944\n372,181612\n372,181945\n372,182809\n372,183366\n372,186482\n372,193018\n372,196771\n372,197762\n372,198093\n372,200655\n372,204586\n372,206387\n372,219266\n372,231469\n372,236650\n372,236703\n372,243543\n372,245421\n372,245928\n372,250304\n372,262010\n372,263829\n372,263954\n372,263957\n372,263970\n372,263978\n373,26\n373,59\n373,104\n373,134\n373,135\n373,211\n373,215\n373,261\n373,292\n373,294\n373,298\n373,310\n373,332\n373,372\n373,417\n373,431\n373,440\n373,557\n373,588\n373,590\n373,631\n373,636\n373,714\n373,760\n373,805\n373,862\n373,932\n373,943\n373,1001\n373,1085\n373,1119\n373,1149\n373,1402\n373,1417\n373,1462\n373,1631\n373,1635\n373,2089\n373,2205\n373,2206\n373,2443\n373,2940\n373,3069\n373,4237\n373,4771\n373,8537\n373,9005\n373,33424\n373,182162\n374,366\n375,376\n376,1801\n376,14605\n376,117586\n376,118608\n376,121370\n377,366\n378,233\n379,19\n379,222\n379,278\n379,283\n379,313\n379,379\n379,380\n379,385\n379,389\n379,401\n379,404\n379,536\n379,634\n379,657\n379,685\n379,852\n379,911\n379,1011\n379,1274\n379,1617\n379,1618\n379,1678\n379,1724\n379,1871\n379,1973\n379,2159\n379,2464\n379,2507\n379,2619\n379,2646\n379,2784\n379,2874\n379,2944\n379,3686\n379,5356\n379,5591\n379,6290\n379,6789\n379,7109\n379,7145\n379,7698\n379,7767\n379,9729\n379,13622\n379,13868\n379,13980\n379,15233\n379,15234\n379,15249\n379,16357\n379,22455\n379,24738\n379,25670\n379,26341\n379,26965\n379,27221\n379,27659\n379,28170\n379,28401\n379,28588\n379,29400\n379,34367\n379,36338\n379,37088\n379,38251\n379,38971\n379,38998\n379,42739\n379,43390\n379,46343\n379,47550\n379,49828\n379,52751\n379,52752\n379,52753\n379,55159\n379,56040\n379,56207\n379,58224\n379,58982\n379,59830\n379,60836\n379,61121\n379,63519\n379,63755\n379,66703\n379,73297\n379,73523\n379,74720\n379,75163\n379,75787\n379,81024\n379,87918\n379,90143\n379,90246\n379,90653\n379,97934\n379,106767\n379,106787\n379,110604\n379,113606\n379,115474\n379,116998\n379,119894\n379,121971\n379,123287\n379,124106\n379,125265\n379,128770\n379,131359\n379,132085\n379,136686\n379,136695\n379,142312\n379,143037\n379,146798\n379,153671\n379,154184\n379,155136\n379,159116\n379,159505\n379,163275\n379,164306\n379,169514\n379,169595\n379,173335\n379,173544\n379,174110\n379,174115\n379,174664\n379,198176\n379,207659\n379,217870\n379,238957\n379,240995\n379,241060\n379,241181\n379,242392\n379,243477\n379,243490\n379,245312\n379,259703\n380,379\n380,536\n380,1608\n380,13137\n380,148742\n381,326\n382,383\n384,366\n385,8\n385,19\n385,54\n385,83\n385,283\n385,379\n385,385\n385,455\n385,536\n385,657\n385,660\n385,976\n385,1274\n385,1571\n385,1617\n385,2159\n385,2224\n385,2290\n385,2421\n385,2424\n385,2507\n385,2646\n385,2779\n385,2944\n385,3252\n385,4166\n385,4637\n385,5325\n385,5326\n385,5781\n385,6680\n385,8152\n385,8431\n385,13154\n385,13622\n385,13868\n385,15249\n385,17273\n385,18650\n385,19443\n385,20355\n385,21382\n385,23287\n385,23839\n385,25670\n385,28130\n385,29006\n385,31039\n385,37348\n385,41450\n385,54565\n385,59013\n385,63353\n385,63519\n385,72916\n385,79836\n385,95008\n385,108420\n385,114016\n385,132085\n385,138238\n385,164434\n385,173075\n385,213089\n385,221547\n385,243506\n385,258092\n385,263587\n386,68\n386,387\n386,390\n387,68\n387,175\n387,178\n387,240\n387,356\n387,387\n387,390\n387,431\n387,838\n387,852\n387,985\n387,1004\n387,1715\n387,1912\n387,2285\n387,2460\n387,2512\n387,2590\n387,4190\n387,4220\n387,4605\n387,5198\n387,8488\n387,8519\n387,9727\n387,9734\n387,13947\n387,17189\n387,18465\n387,19392\n387,19815\n387,20561\n387,20865\n387,22071\n387,25734\n387,26041\n387,26286\n387,26514\n387,27066\n387,28162\n387,40888\n387,58483\n387,63375\n387,65449\n387,66297\n387,72428\n387,72837\n387,81094\n387,82217\n387,83839\n387,105041\n387,106261\n387,112806\n387,113061\n387,113355\n387,115448\n387,122797\n387,167364\n387,172383\n387,183846\n387,188706\n387,189415\n387,189806\n387,189855\n387,192343\n387,192993\n387,193129\n387,193138\n387,211934\n387,221673\n387,241527\n387,244775\n387,245317\n387,245706\n387,246778\n388,3\n388,389\n388,425\n388,457\n388,466\n388,467\n388,509\n388,510\n388,623\n388,663\n388,673\n388,685\n388,693\n388,838\n388,852\n388,1014\n388,1072\n388,1113\n388,1118\n388,1133\n388,1208\n388,1210\n388,1326\n388,1345\n388,1424\n388,1479\n388,1566\n388,1732\n388,1796\n388,1801\n388,1853\n388,2045\n388,2153\n388,2257\n388,2373\n388,2557\n388,3182\n388,4165\n388,4315\n388,4506\n388,4760\n388,5033\n388,5186\n388,5230\n388,6032\n388,6045\n388,6596\n388,6638\n388,6641\n388,7766\n388,8097\n388,8107\n388,8860\n388,9668\n388,14009\n388,14031\n388,14572\n388,15303\n388,16192\n388,17380\n388,18387\n388,18508\n388,20228\n388,20636\n388,21182\n388,22144\n388,24328\n388,27072\n388,29760\n388,30373\n388,30502\n388,31080\n388,31335\n388,34072\n388,37733\n388,38755\n388,38861\n388,38862\n388,41180\n388,41207\n388,41208\n388,41301\n388,41532\n388,44262\n388,46761\n388,46990\n388,48505\n388,49252\n388,50149\n388,50234\n388,51963\n388,55029\n388,56542\n388,56685\n388,58424\n388,59204\n388,62346\n388,62350\n388,62439\n388,62615\n388,64577\n388,64632\n388,70048\n388,81177\n388,81480\n388,81933\n388,83567\n388,87712\n388,88667\n388,88983\n388,89604\n388,92270\n388,94744\n388,97326\n388,97904\n388,101939\n388,102803\n388,107027\n388,108075\n388,109944\n388,112840\n388,114292\n388,115955\n388,117013\n388,117505\n388,118036\n388,118338\n388,121035\n388,121451\n388,122106\n388,122376\n388,123950\n388,126662\n388,128822\n388,130795\n388,131753\n388,133077\n388,133566\n388,135233\n388,136135\n388,140750\n388,144179\n388,145447\n388,148337\n388,152914\n388,154736\n388,155108\n388,155708\n388,160330\n388,160490\n388,161236\n388,161519\n388,162861\n388,163089\n388,163450\n388,163898\n388,164401\n388,165586\n388,169934\n388,182449\n388,190239\n388,190389\n388,191913\n388,193413\n388,193641\n388,213182\n388,215180\n388,215809\n388,215848\n388,216533\n388,221231\n388,221420\n388,227315\n388,229589\n388,232630\n388,232756\n388,233774\n388,237249\n388,241090\n388,241680\n388,243369\n388,248714\n388,249420\n388,250520\n388,256461\n389,3\n389,19\n389,34\n389,35\n389,63\n389,83\n389,192\n389,202\n389,203\n389,222\n389,240\n389,278\n389,283\n389,313\n389,358\n389,379\n389,388\n389,389\n389,404\n389,477\n389,509\n389,510\n389,536\n389,634\n389,660\n389,680\n389,692\n389,693\n389,814\n389,818\n389,868\n389,873\n389,874\n389,875\n389,911\n389,949\n389,1001\n389,1005\n389,1019\n389,1072\n389,1085\n389,1118\n389,1201\n389,1204\n389,1206\n389,1208\n389,1220\n389,1222\n389,1274\n389,1313\n389,1467\n389,1566\n389,1571\n389,1618\n389,1655\n389,1724\n389,1756\n389,1785\n389,1871\n389,1881\n389,1916\n389,2133\n389,2159\n389,2176\n389,2224\n389,2266\n389,2269\n389,2322\n389,2409\n389,2421\n389,2424\n389,2458\n389,2507\n389,2580\n389,2646\n389,2784\n389,3157\n389,3367\n389,3416\n389,3507\n389,3937\n389,4109\n389,4166\n389,4223\n389,4377\n389,4637\n389,4742\n389,5326\n389,5718\n389,5933\n389,6506\n389,6828\n389,6904\n389,7092\n389,7698\n389,9743\n389,13137\n389,13240\n389,13365\n389,13549\n389,13622\n389,13624\n389,14384\n389,14494\n389,15171\n389,15183\n389,15197\n389,15397\n389,15562\n389,16186\n389,16230\n389,17273\n389,18034\n389,18387\n389,18388\n389,18481\n389,18883\n389,19443\n389,19452\n389,19660\n389,19672\n389,20852\n389,21009\n389,21733\n389,22180\n389,22874\n389,23287\n389,23431\n389,23522\n389,23553\n389,23573\n389,23702\n389,24565\n389,24642\n389,24786\n389,24836\n389,25471\n389,25513\n389,25670\n389,26182\n389,26345\n389,26801\n389,27043\n389,28145\n389,28562\n389,28685\n389,28821\n389,28844\n389,28946\n389,29008\n389,29260\n389,31729\n389,31977\n389,32780\n389,33392\n389,33451\n389,33453\n389,33519\n389,34396\n389,34725\n389,34904\n389,35464\n389,35546\n389,35619\n389,35831\n389,36813\n389,37900\n389,38139\n389,38542\n389,39480\n389,39723\n389,40566\n389,41157\n389,41305\n389,42037\n389,42592\n389,43293\n389,44397\n389,45188\n389,45511\n389,45569\n389,46790\n389,47756\n389,48253\n389,48283\n389,49379\n389,49421\n389,53781\n389,54435\n389,54464\n389,54602\n389,55202\n389,55447\n389,56584\n389,56679\n389,59787\n389,61746\n389,62459\n389,63509\n389,64314\n389,66000\n389,66468\n389,67485\n389,67886\n389,68245\n389,71266\n389,79340\n389,79432\n389,79515\n389,79614\n389,81004\n389,83340\n389,85909\n389,87841\n389,89148\n389,92237\n389,94064\n389,95504\n389,96344\n389,99530\n389,99571\n389,102631\n389,103568\n389,103913\n389,104616\n389,106930\n389,108618\n389,109028\n389,109029\n389,111461\n389,112357\n389,113585\n389,115245\n389,117915\n389,118324\n389,118530\n389,120736\n389,120956\n389,122195\n389,125008\n389,125440\n389,127082\n389,127137\n389,127158\n389,127756\n389,128337\n389,129770\n389,130275\n389,131196\n389,131216\n389,131652\n389,132062\n389,132868\n389,134042\n389,134597\n389,136707\n389,136808\n389,136860\n389,138915\n389,139375\n389,140415\n389,140460\n389,142506\n389,146472\n389,146569\n389,147923\n389,147961\n389,149252\n389,149450\n389,150448\n389,154596\n389,156820\n389,158253\n389,160076\n389,160500\n389,164511\n389,164512\n389,165470\n389,165477\n389,168336\n389,169687\n389,175968\n389,177945\n389,182488\n389,183012\n389,183272\n389,183610\n389,183742\n389,183814\n389,183822\n389,183873\n389,183891\n389,186830\n389,188067\n389,189286\n389,189972\n389,190928\n389,191148\n389,195009\n389,195528\n389,203900\n389,207000\n389,212914\n389,213152\n389,213502\n389,215382\n389,215914\n389,218039\n389,218421\n389,220180\n389,221465\n389,221470\n389,221487\n389,222223\n389,222521\n389,222568\n389,222570\n389,222599\n389,223089\n389,223855\n389,225543\n389,225591\n389,225641\n389,225752\n389,225794\n389,227230\n389,227317\n389,227337\n389,227362\n389,227367\n389,227955\n389,227969\n389,228487\n389,229165\n389,229690\n389,230102\n389,231008\n389,231306\n389,231745\n389,232245\n389,235625\n389,236141\n389,236790\n389,239683\n389,240996\n389,241612\n389,243070\n389,247059\n389,249497\n389,252037\n389,253938\n389,258527\n389,261818\n389,263935\n390,72\n390,240\n390,261\n390,298\n390,326\n390,356\n390,372\n390,387\n390,390\n390,400\n390,417\n390,431\n390,440\n390,494\n390,511\n390,522\n390,534\n390,573\n390,589\n390,599\n390,631\n390,679\n390,685\n390,693\n390,781\n390,782\n390,783\n390,794\n390,808\n390,818\n390,852\n390,1001\n390,1014\n390,1026\n390,1081\n390,1082\n390,1085\n390,1133\n390,1284\n390,1285\n390,1309\n390,1329\n390,1411\n390,1423\n390,1424\n390,1487\n390,1544\n390,1559\n390,1580\n390,1703\n390,1715\n390,1801\n390,1849\n390,1853\n390,1888\n390,1955\n390,1973\n390,2007\n390,2512\n390,2747\n390,2812\n390,2989\n390,2991\n390,3135\n390,3406\n390,3455\n390,3793\n390,4107\n390,4190\n390,5051\n390,5052\n390,5186\n390,5299\n390,5388\n390,6068\n390,6474\n390,6552\n390,7194\n390,8107\n390,8276\n390,9015\n390,13143\n390,13274\n390,13524\n390,14236\n390,14246\n390,14311\n390,14495\n390,14597\n390,14904\n390,15254\n390,15633\n390,15651\n390,16955\n390,18526\n390,19072\n390,19252\n390,20017\n390,20222\n390,20509\n390,20519\n390,23316\n390,23372\n390,24839\n390,27041\n390,28144\n390,28269\n390,30328\n390,31741\n390,32650\n390,32814\n390,32932\n390,33338\n390,34963\n390,37368\n390,37407\n390,38474\n390,40936\n390,42335\n390,42839\n390,43394\n390,44830\n390,45126\n390,49030\n390,49104\n390,49646\n390,50559\n390,51666\n390,54504\n390,61096\n390,63375\n390,64681\n390,65771\n390,70136\n390,73570\n390,74686\n390,75184\n390,82733\n390,88306\n390,90306\n390,91182\n390,91342\n390,91946\n390,94965\n390,96685\n390,101716\n390,104565\n390,106872\n390,107408\n390,107424\n390,107730\n390,109290\n390,112328\n390,117788\n390,118971\n390,119079\n390,128244\n390,133309\n390,134473\n390,135882\n390,137980\n390,137981\n390,142456\n390,143752\n390,147515\n390,147873\n390,148742\n390,150016\n390,151108\n390,152405\n390,152631\n390,158245\n390,160910\n390,161009\n390,161299\n390,161565\n390,162521\n390,167083\n390,170531\n390,174727\n390,174769\n390,174943\n390,175903\n390,176124\n390,176314\n390,189930\n390,190504\n390,191105\n390,193632\n390,195114\n390,206189\n390,218050\n390,218363\n390,218884\n390,220389\n390,225616\n390,232900\n390,233491\n390,233497\n390,237981\n390,238759\n390,253129\n390,254389\n390,258889\n391,32\n391,285\n391,392\n391,599\n391,644\n391,779\n391,809\n391,918\n391,1151\n391,1363\n391,1836\n391,2699\n391,3003\n392,1\n392,34\n392,35\n392,87\n392,126\n392,167\n392,186\n392,192\n392,217\n392,240\n392,256\n392,285\n392,287\n392,301\n392,314\n392,356\n392,392\n392,397\n392,406\n392,433\n392,440\n392,452\n392,457\n392,467\n392,509\n392,510\n392,535\n392,599\n392,623\n392,657\n392,752\n392,779\n392,808\n392,809\n392,818\n392,838\n392,849\n392,852\n392,872\n392,919\n392,1011\n392,1014\n392,1019\n392,1085\n392,1118\n392,1130\n392,1192\n392,1204\n392,1210\n392,1240\n392,1262\n392,1417\n392,1465\n392,1566\n392,1572\n392,1634\n392,1659\n392,1796\n392,1805\n392,1844\n392,1860\n392,1949\n392,1973\n392,2173\n392,2253\n392,2697\n392,3507\n392,4066\n392,6955\n392,13136\n392,15609\n392,19010\n392,20757\n392,127158\n392,138686\n392,207837\n392,215874\n393,259\n393,272\n393,314\n393,346\n393,393\n393,394\n393,395\n393,446\n393,498\n393,523\n393,577\n393,599\n393,726\n393,766\n393,788\n393,794\n393,838\n393,902\n393,980\n393,1044\n393,1388\n393,1531\n393,1651\n393,2023\n393,2178\n393,2459\n393,3799\n393,4009\n393,4137\n393,4611\n393,5181\n393,5565\n393,6609\n393,6645\n393,7087\n393,7780\n393,8038\n393,8438\n393,8905\n393,13394\n393,14111\n393,15312\n393,16679\n393,17245\n393,17913\n393,18108\n393,18164\n393,18449\n393,18457\n393,18818\n393,20844\n393,21627\n393,21727\n393,21736\n393,22221\n393,22686\n393,23249\n393,24937\n393,25033\n393,25302\n393,25477\n393,27913\n393,28997\n393,29301\n393,29503\n393,31251\n393,32458\n393,32905\n393,33939\n393,35360\n393,35661\n393,37445\n393,39192\n393,39257\n393,40733\n393,41168\n393,41843\n393,44116\n393,44136\n393,44847\n393,45753\n393,45983\n393,48078\n393,48864\n393,48865\n393,48869\n393,48870\n393,48871\n393,48874\n393,48877\n393,48883\n393,48888\n393,48974\n393,50271\n393,50272\n393,50276\n393,52936\n393,54996\n393,55383\n393,56150\n393,56321\n393,57167\n393,58793\n393,59416\n393,60906\n393,61548\n393,61992\n393,62562\n393,63063\n393,68816\n393,68822\n393,69282\n393,69733\n393,71437\n393,71871\n393,76993\n393,78091\n393,80680\n393,81491\n393,82523\n393,84630\n393,86288\n393,91011\n393,94451\n393,95951\n393,97595\n393,99744\n393,101995\n393,102209\n393,102792\n393,108127\n393,108399\n393,109865\n393,115196\n393,117354\n393,118086\n393,118201\n393,118350\n393,118497\n393,118669\n393,122062\n393,122699\n393,123401\n393,123937\n393,124028\n393,125437\n393,130599\n393,131133\n393,132612\n393,133734\n393,134240\n393,134519\n393,135157\n393,135645\n393,138585\n393,138912\n393,139589\n393,140730\n393,140878\n393,141397\n393,141759\n393,144338\n393,144878\n393,147008\n393,147552\n393,149054\n393,154899\n393,155333\n393,155349\n393,155709\n393,156471\n393,159849\n393,160399\n393,161937\n393,163872\n393,164001\n393,167167\n393,170509\n393,171524\n393,172033\n393,172559\n393,174215\n393,175412\n393,176185\n393,177373\n393,177561\n393,178901\n393,180033\n393,180607\n393,184231\n393,187519\n393,187973\n393,189099\n393,191360\n393,192491\n393,197534\n393,229813\n393,232500\n393,233388\n393,233608\n393,234158\n393,236852\n393,237504\n393,238465\n393,239345\n393,244313\n393,246167\n393,246609\n393,247780\n393,248785\n393,249337\n393,250237\n393,251300\n393,252505\n393,254095\n393,255452\n393,256769\n393,259095\n393,259413\n393,262330\n394,393\n396,397\n397,1\n397,15\n397,20\n397,22\n397,68\n397,83\n397,126\n397,167\n397,182\n397,192\n397,207\n397,209\n397,240\n397,259\n397,261\n397,292\n397,299\n397,314\n397,336\n397,337\n397,396\n397,397\n397,420\n397,425\n397,441\n397,452\n397,457\n397,479\n397,481\n397,493\n397,500\n397,505\n397,509\n397,510\n397,512\n397,516\n397,534\n397,535\n397,538\n397,577\n397,581\n397,604\n397,631\n397,668\n397,673\n397,676\n397,677\n397,733\n397,764\n397,779\n397,808\n397,818\n397,838\n397,843\n397,849\n397,868\n397,872\n397,911\n397,918\n397,920\n397,950\n397,969\n397,972\n397,1011\n397,1019\n397,1021\n397,1085\n397,1089\n397,1118\n397,1151\n397,1160\n397,1172\n397,1181\n397,1191\n397,1192\n397,1204\n397,1210\n397,1267\n397,1293\n397,1294\n397,1345\n397,1402\n397,1417\n397,1445\n397,1454\n397,1464\n397,1518\n397,1559\n397,1566\n397,1572\n397,1655\n397,1663\n397,1688\n397,1724\n397,1753\n397,1796\n397,1803\n397,1805\n397,1825\n397,1843\n397,1845\n397,1849\n397,1992\n397,2045\n397,2141\n397,2173\n397,2205\n397,2253\n397,2308\n397,2480\n397,2512\n397,2590\n397,2605\n397,2694\n397,2810\n397,2923\n397,2989\n397,2991\n397,3182\n397,3392\n397,3487\n397,3524\n397,3529\n397,3533\n397,3559\n397,3582\n397,3790\n397,3865\n397,3881\n397,3920\n397,3958\n397,4165\n397,4190\n397,4231\n397,4259\n397,4276\n397,4438\n397,4766\n397,5061\n397,5644\n397,5833\n397,6119\n397,6452\n397,6628\n397,6695\n397,6824\n397,7978\n397,9457\n397,9603\n397,14196\n397,14353\n397,14358\n397,16123\n397,16516\n397,18346\n397,19617\n397,21442\n397,22029\n397,22262\n397,26093\n397,28142\n397,28901\n397,28907\n397,28951\n397,29786\n397,33424\n397,34359\n397,44103\n397,48307\n397,49993\n397,50358\n397,55254\n397,56294\n397,56473\n397,62417\n397,70174\n397,75292\n397,75912\n397,76860\n397,79532\n397,79818\n397,81233\n397,101652\n397,103557\n397,103714\n397,109360\n397,109802\n397,114450\n397,115474\n397,116309\n397,118336\n397,119865\n397,127158\n397,136447\n397,136623\n397,136699\n397,136700\n397,140095\n397,150787\n397,165813\n397,168301\n397,169977\n397,177371\n397,177434\n397,178632\n397,179024\n397,179804\n397,181530\n397,188700\n397,189825\n397,204093\n397,215276\n397,221068\n397,221693\n397,226977\n397,228238\n397,228994\n397,230929\n397,233432\n397,237271\n397,245910\n398,399\n398,7698\n399,398\n399,399\n399,536\n399,635\n399,650\n399,1843\n399,2059\n399,2159\n399,2243\n399,2247\n399,2646\n399,2672\n399,2845\n399,3686\n399,4290\n399,4295\n399,4303\n399,4477\n399,5223\n399,6395\n399,7698\n399,8463\n399,14447\n399,15645\n399,15657\n400,372\n400,390\n400,1082\n400,1807\n400,2315\n401,379\n401,1274\n401,28107\n402,58\n402,403\n402,586\n402,693\n402,1118\n402,5250\n402,113878\n403,402\n403,403\n403,693\n403,5847\n403,6763\n403,7795\n403,20030\n403,32268\n403,32631\n403,38896\n403,55832\n403,74151\n403,91334\n403,102096\n403,107688\n403,110798\n403,113878\n403,218524\n403,225657\n403,242913\n403,254592\n403,257673\n404,222\n404,379\n404,389\n404,1274\n405,406\n406,1\n406,20\n406,30\n406,50\n406,56\n406,79\n406,99\n406,106\n406,146\n406,147\n406,149\n406,158\n406,175\n406,182\n406,186\n406,192\n406,195\n406,202\n406,203\n406,206\n406,217\n406,240\n406,285\n406,301\n406,314\n406,333\n406,336\n406,406\n406,410\n406,435\n406,440\n406,452\n406,502\n406,505\n406,516\n406,536\n406,585\n406,599\n406,602\n406,620\n406,622\n406,640\n406,733\n406,766\n406,778\n406,779\n406,808\n406,818\n406,838\n406,841\n406,920\n406,1003\n406,1010\n406,1011\n406,1014\n406,1072\n406,1085\n406,1089\n406,1118\n406,1163\n406,1181\n406,1204\n406,1218\n406,1262\n406,1370\n406,1417\n406,1425\n406,1456\n406,1458\n406,1464\n406,1515\n406,1518\n406,1521\n406,1531\n406,1554\n406,1619\n406,1623\n406,1655\n406,1776\n406,1796\n406,1825\n406,1844\n406,1973\n406,2173\n406,2244\n406,2253\n406,2365\n406,2373\n406,2400\n406,2556\n406,2710\n406,2741\n406,2792\n406,2875\n406,2880\n406,2938\n406,2969\n406,3027\n406,3030\n406,3060\n406,3070\n406,3199\n406,3255\n406,3361\n406,3449\n406,3507\n406,3592\n406,3895\n406,4103\n406,4426\n406,4477\n406,4684\n406,4727\n406,5048\n406,5174\n406,5401\n406,5592\n406,5601\n406,5621\n406,5726\n406,5729\n406,6066\n406,6863\n406,7766\n406,7948\n406,8055\n406,8244\n406,8764\n406,8971\n406,9394\n406,9582\n406,13283\n406,13493\n406,13592\n406,13623\n406,13771\n406,13994\n406,14040\n406,14166\n406,14913\n406,15769\n406,15795\n406,15980\n406,16019\n406,16135\n406,16563\n406,16775\n406,17151\n406,17236\n406,17248\n406,17262\n406,17551\n406,18638\n406,18692\n406,18705\n406,18931\n406,19385\n406,19457\n406,19577\n406,19586\n406,19589\n406,19690\n406,19825\n406,19936\n406,20076\n406,20160\n406,20713\n406,20896\n406,20942\n406,21528\n406,21572\n406,22296\n406,22392\n406,22699\n406,23084\n406,23098\n406,23816\n406,23926\n406,23941\n406,23953\n406,23991\n406,24056\n406,24150\n406,24161\n406,24164\n406,24166\n406,24170\n406,24181\n406,24187\n406,24233\n406,25511\n406,26197\n406,26383\n406,26434\n406,28115\n406,28364\n406,28928\n406,29638\n406,30331\n406,30673\n406,30706\n406,31573\n406,31585\n406,31946\n406,32468\n406,32661\n406,32744\n406,32958\n406,32992\n406,33339\n406,35336\n406,35672\n406,36054\n406,36082\n406,36523\n406,37669\n406,37882\n406,37978\n406,38681\n406,38688\n406,39643\n406,40283\n406,41429\n406,43281\n406,43348\n406,43670\n406,43879\n406,44500\n406,46334\n406,46336\n406,47505\n406,47648\n406,47772\n406,48452\n406,48805\n406,49563\n406,49575\n406,49711\n406,49791\n406,50210\n406,51260\n406,52550\n406,52855\n406,54653\n406,54744\n406,55254\n406,55849\n406,55974\n406,56007\n406,57133\n406,58131\n406,58169\n406,58689\n406,58820\n406,59059\n406,59077\n406,59083\n406,59360\n406,59711\n406,59746\n406,60576\n406,61993\n406,62372\n406,62530\n406,62686\n406,63126\n406,63585\n406,64598\n406,65809\n406,66011\n406,66603\n406,66710\n406,67445\n406,67605\n406,68525\n406,68902\n406,69668\n406,70723\n406,70843\n406,71873\n406,72071\n406,72505\n406,72678\n406,72825\n406,73348\n406,73815\n406,75249\n406,75876\n406,76763\n406,80058\n406,80266\n406,80650\n406,82182\n406,82792\n406,83406\n406,84126\n406,84545\n406,86174\n406,86198\n406,86532\n406,88099\n406,88572\n406,88600\n406,89035\n406,92476\n406,94986\n406,96637\n406,97423\n406,98099\n406,99606\n406,99819\n406,100875\n406,102560\n406,103852\n406,104926\n406,105747\n406,106502\n406,107102\n406,109441\n406,109934\n406,110229\n406,111151\n406,114019\n406,114641\n406,114954\n406,115648\n406,118119\n406,118336\n406,118425\n406,119438\n406,120636\n406,120637\n406,121892\n406,122217\n406,123025\n406,123648\n406,123890\n406,123926\n406,124497\n406,124889\n406,125518\n406,126107\n406,126292\n406,127158\n406,128112\n406,128572\n406,128711\n406,128976\n406,129795\n406,129982\n406,130340\n406,132929\n406,133031\n406,133174\n406,133356\n406,134036\n406,136234\n406,136986\n406,138314\n406,138860\n406,138881\n406,140474\n406,141377\n406,141618\n406,141912\n406,147467\n406,147516\n406,147614\n406,148094\n406,148143\n406,148601\n406,148606\n406,148917\n406,148970\n406,150405\n406,150788\n406,150995\n406,151986\n406,153765\n406,153930\n406,154493\n406,155513\n406,156392\n406,157720\n406,158349\n406,158706\n406,158800\n406,158816\n406,158947\n406,159530\n406,159874\n406,161596\n406,163349\n406,163732\n406,164187\n406,164572\n406,164862\n406,165944\n406,165945\n406,166569\n406,166646\n406,166748\n406,167907\n406,168976\n406,169385\n406,169456\n406,170149\n406,170484\n406,170647\n406,170782\n406,171268\n406,171938\n406,173230\n406,173443\n406,174124\n406,175324\n406,176074\n406,176287\n406,176577\n406,176653\n406,176931\n406,176933\n406,176942\n406,177368\n406,177444\n406,177975\n406,178005\n406,179515\n406,179708\n406,179935\n406,180487\n406,182526\n406,183852\n406,183885\n406,186042\n406,186073\n406,187293\n406,187792\n406,188069\n406,191963\n406,193009\n406,193180\n406,193198\n406,195222\n406,198153\n406,202496\n406,205794\n406,212502\n406,214338\n406,214342\n406,215421\n406,215490\n406,215821\n406,216215\n406,217541\n406,220502\n406,220628\n406,222527\n406,227027\n406,227200\n406,227365\n406,227954\n406,228516\n406,228583\n406,228703\n406,229956\n406,231893\n406,231978\n406,232257\n406,234222\n406,234369\n406,234397\n406,241146\n406,241274\n406,241795\n406,242414\n406,248101\n406,249249\n406,250003\n406,253986\n406,254279\n406,254703\n406,259067\n406,260977\n407,408\n408,102\n408,407\n408,518\n408,655\n408,852\n408,1113\n408,1323\n408,1326\n408,1483\n408,1566\n408,1603\n408,2373\n408,2737\n408,2755\n408,2923\n408,3005\n408,3193\n408,3758\n408,3792\n408,3940\n408,5749\n408,6824\n408,7866\n408,7988\n408,13308\n408,13346\n408,14020\n408,15200\n408,20663\n408,22684\n408,23340\n408,26974\n408,28432\n408,28850\n408,28885\n408,28892\n408,30567\n408,31105\n408,31203\n408,31205\n408,31217\n408,31249\n408,38301\n408,40718\n408,41966\n408,41968\n408,43085\n408,44156\n408,44260\n408,44267\n408,44699\n408,44706\n408,45401\n408,45409\n408,53250\n408,68913\n408,71872\n408,72721\n408,75931\n408,78904\n408,81023\n408,83197\n408,83796\n408,93338\n408,101723\n408,103282\n408,106157\n408,110618\n408,110644\n408,111102\n408,113867\n408,113904\n408,114446\n408,117797\n408,118960\n408,120990\n408,123891\n408,125498\n408,125547\n408,127327\n408,127342\n408,127636\n408,127722\n408,127760\n408,128144\n408,133643\n408,136054\n408,138097\n408,139531\n408,155148\n408,156338\n408,156904\n408,156935\n408,168850\n408,173701\n408,177749\n408,179156\n408,181205\n408,183414\n408,183791\n408,190457\n408,191216\n408,191379\n408,194398\n408,194971\n408,195679\n408,222625\n408,223843\n408,224693\n408,225419\n408,225449\n408,226580\n408,228157\n408,228168\n408,232023\n408,234972\n408,237281\n408,237394\n408,241487\n408,243194\n408,244007\n408,247252\n408,248518\n408,248554\n408,249056\n408,250581\n408,253224\n408,258133\n408,259541\n408,264370\n409,328\n409,704\n409,705\n410,406\n410,779\n410,68069\n411,376\n412,163\n413,240\n413,332\n413,818\n414,415\n414,673\n414,893\n415,87\n415,770\n415,911\n415,996\n416,417\n417,10\n417,41\n417,182\n417,255\n417,298\n417,373\n417,390\n417,417\n417,534\n417,557\n417,589\n417,599\n417,626\n417,631\n417,632\n417,677\n417,685\n417,693\n417,714\n417,715\n417,765\n417,784\n417,818\n417,838\n417,849\n417,852\n417,862\n417,911\n417,970\n417,1001\n417,1010\n417,1011\n417,1014\n417,1085\n417,1119\n417,1133\n417,1179\n417,1417\n417,1459\n417,1462\n417,1470\n417,1563\n417,1564\n417,1572\n417,1573\n417,1818\n417,1844\n417,1899\n417,1962\n417,2008\n417,2097\n417,2117\n417,2184\n417,2253\n417,2296\n417,2316\n417,2357\n417,2451\n417,2572\n417,2846\n417,2850\n417,2874\n417,2995\n417,3028\n417,3094\n417,3507\n417,3623\n417,3879\n417,3953\n417,3954\n417,4214\n417,4222\n417,4406\n417,4540\n417,4879\n417,5278\n417,5321\n417,5329\n417,5330\n417,5344\n417,5439\n417,5472\n417,5778\n417,5943\n417,6038\n417,6068\n417,6203\n417,6304\n417,6570\n417,6825\n417,7238\n417,8502\n417,9292\n417,9377\n417,13271\n417,13359\n417,13433\n417,13733\n417,13756\n417,13803\n417,13828\n417,13832\n417,14438\n417,14441\n417,14603\n417,15438\n417,15452\n417,15460\n417,15468\n417,15472\n417,15477\n417,15492\n417,15496\n417,15529\n417,15541\n417,15568\n417,15739\n417,16077\n417,16167\n417,16174\n417,16215\n417,16668\n417,16963\n417,17212\n417,17218\n417,17274\n417,18379\n417,18425\n417,19798\n417,19944\n417,23710\n417,24600\n417,32604\n417,32645\n417,34093\n417,38822\n417,39300\n417,39307\n417,42029\n417,42298\n417,42323\n417,43517\n417,44489\n417,44725\n417,44951\n417,45560\n417,51972\n417,52061\n417,52083\n417,52099\n417,52116\n417,54560\n417,56485\n417,56973\n417,57042\n417,57054\n417,59754\n417,60734\n417,63066\n417,63972\n417,64033\n417,65795\n417,66023\n417,68195\n417,69119\n417,70067\n417,70195\n417,71774\n417,71869\n417,72751\n417,72755\n417,75912\n417,79507\n417,79514\n417,79961\n417,80016\n417,80047\n417,80048\n417,80055\n417,81508\n417,82284\n417,84605\n417,84727\n417,85531\n417,85544\n417,86062\n417,86130\n417,89794\n417,90945\n417,91001\n417,91109\n417,91839\n417,92911\n417,92964\n417,95757\n417,96089\n417,98152\n417,105664\n417,106177\n417,107004\n417,107155\n417,107462\n417,109602\n417,113573\n417,115466\n417,116661\n417,117480\n417,118946\n417,119463\n417,127158\n417,128521\n417,130135\n417,130423\n417,130843\n417,132660\n417,133088\n417,133461\n417,135081\n417,137195\n417,137865\n417,139620\n417,141716\n417,148536\n417,152639\n417,154335\n417,158581\n417,159672\n417,160800\n417,161532\n417,162041\n417,162676\n417,163477\n417,166485\n417,167590\n417,169113\n417,172102\n417,178576\n417,179729\n417,182027\n417,182146\n417,182345\n417,182693\n417,183366\n417,219458\n417,224932\n417,227709\n417,236379\n417,242133\n417,244359\n417,244920\n417,248729\n417,249055\n417,249401\n417,251039\n417,252106\n417,258490\n417,263369\n417,263740\n418,344\n418,37414\n419,420\n420,420\n421,56\n421,79\n421,192\n421,422\n421,994\n422,1\n422,56\n422,79\n422,146\n422,147\n422,148\n422,149\n422,175\n422,192\n422,285\n422,314\n422,333\n422,336\n422,421\n422,422\n422,602\n422,620\n422,645\n422,841\n422,849\n422,852\n422,1011\n422,1089\n422,1181\n422,1425\n422,1458\n422,1469\n422,1497\n422,1515\n422,1518\n422,1582\n422,1619\n422,1623\n422,1803\n422,1825\n422,1940\n422,2032\n422,2037\n422,2132\n422,2253\n422,2574\n422,3376\n422,4388\n422,4432\n422,4441\n422,5280\n422,5360\n422,5401\n422,5916\n422,5952\n422,5957\n422,6119\n422,6575\n422,7026\n422,8244\n422,8536\n422,9064\n422,9136\n422,9379\n422,9525\n422,9819\n422,12263\n422,14053\n422,14306\n422,14446\n422,14511\n422,15098\n422,15154\n422,15297\n422,16083\n422,18638\n422,18997\n422,21219\n422,21451\n422,21503\n422,21653\n422,21904\n422,22616\n422,23633\n422,23744\n422,23753\n422,23783\n422,24150\n422,26414\n422,27834\n422,28799\n422,29334\n422,30331\n422,30943\n422,32911\n422,33036\n422,36715\n422,38489\n422,48278\n422,60576\n422,62722\n422,65809\n422,68014\n422,70913\n422,81148\n422,84458\n422,92476\n422,92994\n422,98854\n422,99780\n422,101738\n422,109686\n422,112061\n422,118021\n422,118025\n422,118915\n422,119117\n422,119482\n422,120133\n422,123084\n422,123857\n422,124426\n422,124847\n422,126987\n422,127053\n422,127298\n422,127906\n422,128904\n422,133017\n422,135126\n422,135296\n422,139936\n422,139937\n422,140335\n422,140483\n422,145825\n422,146660\n422,147392\n422,150106\n422,151347\n422,152140\n422,153385\n422,155058\n422,155403\n422,155407\n422,156272\n422,158352\n422,158656\n422,160357\n422,160951\n422,162818\n422,162890\n422,163167\n422,163483\n422,163534\n422,165007\n422,166562\n422,167509\n422,174398\n422,174534\n422,183343\n422,183382\n422,186056\n422,187477\n422,189757\n422,195132\n422,204124\n422,207440\n422,207659\n422,212656\n422,216260\n422,216273\n422,221372\n422,235567\n422,241043\n422,242264\n422,243887\n422,244928\n422,249815\n422,249908\n422,251631\n422,251648\n422,252250\n422,252830\n422,253117\n422,255207\n422,256804\n422,257231\n422,258361\n422,262368\n422,262400\n422,262566\n423,424\n424,287\n424,326\n424,424\n424,702\n424,873\n424,874\n424,3206\n424,4272\n424,6477\n424,6832\n424,9714\n424,27456\n424,29930\n424,32620\n424,36656\n424,54334\n424,85842\n424,94874\n424,125412\n424,125510\n424,126840\n424,128157\n424,131369\n424,140098\n424,140510\n424,140531\n424,144139\n424,144175\n424,145139\n424,145897\n424,145901\n424,146756\n424,146759\n424,148339\n424,149314\n424,152513\n424,153185\n424,153577\n424,162598\n424,163931\n424,170494\n424,171698\n424,171703\n424,178814\n424,190244\n424,192371\n424,198235\n424,216683\n424,245858\n424,251878\n424,263079\n425,3\n425,37\n425,46\n425,50\n425,56\n425,68\n425,79\n425,81\n425,83\n425,97\n425,126\n425,147\n425,158\n425,178\n425,192\n425,195\n425,202\n425,203\n425,225\n425,240\n425,251\n425,283\n425,285\n425,287\n425,289\n425,290\n425,294\n425,298\n425,299\n425,301\n425,304\n425,315\n425,326\n425,332\n425,333\n425,337\n425,372\n425,388\n425,390\n425,406\n425,425\n425,433\n425,439\n425,444\n425,455\n425,459\n425,489\n425,493\n425,500\n425,510\n425,516\n425,588\n425,589\n425,590\n425,592\n425,609\n425,615\n425,620\n425,623\n425,631\n425,682\n425,694\n425,704\n425,714\n425,717\n425,744\n425,752\n425,765\n425,775\n425,779\n425,783\n425,795\n425,818\n425,841\n425,843\n425,862\n425,873\n425,907\n425,911\n425,919\n425,947\n425,968\n425,980\n425,992\n425,1012\n425,1033\n425,1085\n425,1117\n425,1146\n425,1147\n425,1210\n425,1212\n425,1235\n425,1240\n425,1241\n425,1276\n425,1282\n425,1284\n425,1285\n425,1293\n425,1298\n425,1300\n425,1309\n425,1326\n425,1335\n425,1370\n425,1381\n425,1411\n425,1454\n425,1465\n425,1479\n425,1509\n425,1515\n425,1522\n425,1531\n425,1544\n425,1604\n425,1619\n425,1634\n425,1635\n425,1644\n425,1732\n425,1782\n425,1801\n425,1805\n425,1818\n425,1877\n425,1888\n425,1893\n425,1955\n425,1962\n425,1973\n425,1985\n425,1992\n425,2019\n425,2045\n425,2083\n425,2092\n425,2191\n425,2224\n425,2296\n425,2353\n425,2372\n425,2496\n425,2557\n425,2572\n425,2590\n425,2744\n425,3093\n425,3182\n425,3207\n425,3507\n425,3630\n425,3697\n425,3752\n425,3753\n425,3830\n425,4138\n425,4177\n425,4218\n425,5130\n425,5301\n425,5385\n425,5662\n425,5961\n425,6068\n425,6119\n425,6136\n425,6519\n425,6638\n425,6661\n425,6718\n425,6955\n425,6977\n425,7760\n425,8276\n425,9036\n425,13195\n425,13302\n425,14212\n425,14432\n425,15108\n425,15184\n425,16201\n425,17927\n425,19590\n425,21442\n425,22293\n425,23370\n425,23494\n425,23783\n425,25537\n425,29704\n425,31019\n425,32566\n425,32642\n425,32751\n425,32839\n425,33424\n425,35600\n425,39570\n425,41770\n425,46631\n425,48574\n425,50194\n425,54632\n425,55174\n425,56353\n425,56931\n425,58207\n425,58221\n425,59014\n425,60560\n425,60574\n425,60576\n425,62354\n425,64475\n425,64602\n425,64626\n425,65707\n425,66343\n425,70819\n425,71993\n425,75912\n425,95563\n425,95576\n425,114397\n425,117897\n425,124932\n425,127704\n425,134047\n425,136631\n425,148700\n425,149268\n425,150358\n425,151012\n425,151430\n425,153741\n425,160945\n425,168441\n425,169326\n425,171641\n425,174451\n425,177308\n425,179214\n425,181832\n425,199738\n425,200691\n425,204124\n425,212974\n425,215210\n425,227061\n425,228840\n425,233336\n425,245966\n425,254855\n426,427\n426,3285\n426,3286\n426,171365\n426,245617\n426,245777\n428,312\n429,430\n430,26\n430,59\n430,852\n430,1235\n430,1335\n430,2089\n430,2940\n431,41\n431,58\n431,68\n431,130\n431,134\n431,135\n431,137\n431,186\n431,225\n431,240\n431,261\n431,278\n431,294\n431,313\n431,332\n431,363\n431,364\n431,372\n431,373\n431,390\n431,431\n431,442\n431,444\n431,446\n431,518\n431,557\n431,589\n431,590\n431,612\n431,631\n431,676\n431,677\n431,693\n431,715\n431,761\n431,775\n431,784\n431,797\n431,800\n431,805\n431,823\n431,852\n431,949\n431,989\n431,1001\n431,1004\n431,1052\n431,1085\n431,1118\n431,1119\n431,1252\n431,1253\n431,1285\n431,1368\n431,1459\n431,1462\n431,1564\n431,1566\n431,1580\n431,1631\n431,1732\n431,1796\n431,1844\n431,1879\n431,1955\n431,2015\n431,2188\n431,2315\n431,2346\n431,2512\n431,2596\n431,2646\n431,2701\n431,2834\n431,3111\n431,3115\n431,3328\n431,3474\n431,3496\n431,3504\n431,3621\n431,3715\n431,3822\n431,4222\n431,4384\n431,4411\n431,4751\n431,4771\n431,5137\n431,5405\n431,5693\n431,6828\n431,6856\n431,7225\n431,7458\n431,7809\n431,8285\n431,8632\n431,13366\n431,13563\n431,13741\n431,14134\n431,14482\n431,14564\n431,14597\n431,15106\n431,15109\n431,15271\n431,15497\n431,15502\n431,16137\n431,16641\n431,18103\n431,19510\n431,19617\n431,20027\n431,20038\n431,20288\n431,20645\n431,20787\n431,21081\n431,22058\n431,22308\n431,23077\n431,24288\n431,24618\n431,25307\n431,26041\n431,27433\n431,28112\n431,32583\n431,32949\n431,33382\n431,34205\n431,35500\n431,36250\n431,36278\n431,37651\n431,37730\n431,38275\n431,38394\n431,38491\n431,38847\n431,39244\n431,41332\n431,41527\n431,43202\n431,44725\n431,46276\n431,46776\n431,47768\n431,48889\n431,49035\n431,49254\n431,49271\n431,49483\n431,50418\n431,52543\n431,56963\n431,58224\n431,59006\n431,59043\n431,60058\n431,61089\n431,62019\n431,62439\n431,63319\n431,64625\n431,64850\n431,65101\n431,68781\n431,70111\n431,70288\n431,70332\n431,70742\n431,73334\n431,78418\n431,79397\n431,79544\n431,79619\n431,80245\n431,80295\n431,80489\n431,81207\n431,82259\n431,84133\n431,86450\n431,86725\n431,87243\n431,88928\n431,90809\n431,96483\n431,97195\n431,97772\n431,103031\n431,103526\n431,103775\n431,105728\n431,105913\n431,106143\n431,108195\n431,109301\n431,109877\n431,114508\n431,116779\n431,120149\n431,122795\n431,128042\n431,130789\n431,131216\n431,131250\n431,135318\n431,135319\n431,135320\n431,135321\n431,136425\n431,136462\n431,137752\n431,146302\n431,147400\n431,147676\n431,148297\n431,154795\n431,156699\n431,158396\n431,159116\n431,161487\n431,162577\n431,163105\n431,163933\n431,165729\n431,166953\n431,166988\n431,167150\n431,168423\n431,169339\n431,169443\n431,172036\n431,173360\n431,175643\n431,176944\n431,177909\n431,178971\n431,179057\n431,182465\n431,183823\n431,186065\n431,187182\n431,188791\n431,194926\n431,195286\n431,206230\n431,215898\n431,217559\n431,218437\n431,229659\n431,238678\n431,240472\n431,242209\n431,244582\n431,255247\n431,259545\n431,261868\n431,263305\n432,433\n432,571\n432,1181\n433,22\n433,34\n433,35\n433,207\n433,287\n433,314\n433,326\n433,349\n433,392\n433,432\n433,433\n433,440\n433,467\n433,599\n433,623\n433,673\n433,794\n433,818\n433,872\n433,874\n433,918\n433,1011\n433,1014\n433,1130\n433,1210\n433,1422\n433,1502\n433,1634\n433,1805\n433,1824\n433,1860\n433,1973\n433,2095\n433,2373\n433,2542\n433,3443\n433,4109\n433,4450\n433,5196\n433,5208\n433,5231\n433,5320\n433,5604\n433,5646\n433,5955\n433,6578\n433,6632\n433,8041\n433,8495\n433,8562\n433,9414\n433,13142\n433,13188\n433,13223\n433,13259\n433,14128\n433,14304\n433,14452\n433,15489\n433,15635\n433,16337\n433,16522\n433,16596\n433,18136\n433,18138\n433,18245\n433,18307\n433,18333\n433,18400\n433,19413\n433,19592\n433,19627\n433,23594\n433,25395\n433,25398\n433,26301\n433,28406\n433,29871\n433,31280\n433,31765\n433,33238\n433,34775\n433,35464\n433,36003\n433,36920\n433,37692\n433,39618\n433,40240\n433,40474\n433,41242\n433,41389\n433,41867\n433,41928\n433,44895\n433,46271\n433,46321\n433,47034\n433,48192\n433,48453\n433,48461\n433,48468\n433,48474\n433,48486\n433,48489\n433,48496\n433,48498\n433,48502\n433,48511\n433,49139\n433,51543\n433,52048\n433,55224\n433,55615\n433,56365\n433,56911\n433,58372\n433,59880\n433,62859\n433,64477\n433,66368\n433,66418\n433,66425\n433,66427\n433,66428\n433,66429\n433,66641\n433,66660\n433,68113\n433,71830\n433,76989\n433,77538\n433,79673\n433,80473\n433,80490\n433,80537\n433,81233\n433,82422\n433,83384\n433,84127\n433,86087\n433,89378\n433,93113\n433,95519\n433,96608\n433,99900\n433,103192\n433,110150\n433,110200\n433,112619\n433,113832\n433,115394\n433,119943\n433,121505\n433,121598\n433,125473\n433,126706\n433,127158\n433,127818\n433,129316\n433,131348\n433,131822\n433,134700\n433,135118\n433,136458\n433,136647\n433,137020\n433,139748\n433,139947\n433,140420\n433,142250\n433,142260\n433,142970\n433,145043\n433,158572\n433,160441\n433,161289\n433,161661\n433,162599\n433,167673\n433,172641\n433,172662\n433,173319\n433,176867\n433,177989\n433,185412\n433,207084\n433,211461\n433,216997\n433,222468\n433,231159\n433,237195\n433,242217\n433,242224\n433,243342\n433,253222\n433,253725\n433,253735\n433,257819\n433,262686\n433,264869\n434,65\n434,315\n434,346\n434,435\n434,447\n434,571\n434,622\n434,671\n434,868\n434,934\n434,1033\n434,1294\n434,1913\n434,9476\n435,20\n435,178\n435,182\n435,240\n435,301\n435,302\n435,315\n435,327\n435,346\n435,406\n435,434\n435,435\n435,439\n435,440\n435,447\n435,467\n435,510\n435,516\n435,538\n435,622\n435,663\n435,671\n435,766\n435,794\n435,868\n435,872\n435,920\n435,934\n435,939\n435,950\n435,996\n435,1014\n435,1033\n435,1118\n435,1192\n435,1294\n435,1474\n435,1518\n435,1531\n435,1590\n435,1612\n435,1644\n435,1651\n435,1796\n435,1844\n435,1877\n435,1913\n435,2023\n435,2030\n435,2085\n435,2094\n435,2102\n435,2106\n435,2307\n435,2352\n435,2353\n435,2710\n435,3241\n435,3512\n435,3518\n435,3903\n435,4286\n435,4315\n435,4394\n435,4646\n435,5376\n435,5996\n435,6268\n435,6452\n435,6672\n435,6853\n435,6966\n435,7186\n435,8157\n435,8374\n435,8764\n435,13506\n435,14060\n435,14111\n435,14186\n435,14358\n435,14428\n435,15141\n435,16010\n435,17337\n435,17426\n435,17429\n435,17432\n435,18116\n435,18416\n435,19191\n435,19411\n435,19592\n435,20295\n435,22221\n435,22385\n435,23122\n435,26271\n435,26302\n435,26915\n435,26972\n435,27827\n435,28545\n435,29890\n435,32468\n435,32929\n435,33326\n435,34268\n435,34304\n435,38304\n435,38439\n435,38754\n435,39684\n435,41342\n435,44345\n435,45184\n435,45848\n435,48361\n435,49069\n435,49337\n435,52127\n435,55094\n435,57040\n435,63081\n435,75139\n435,104592\n435,105614\n435,112168\n435,112985\n435,116017\n435,117157\n435,117480\n435,117974\n435,120052\n435,120155\n435,120826\n435,121505\n435,121610\n435,122675\n435,123147\n435,128831\n435,131650\n435,133112\n435,147772\n435,156939\n435,162693\n435,164696\n435,166713\n435,168380\n435,168496\n435,177555\n435,178077\n435,182308\n435,188523\n435,192089\n435,192461\n435,192504\n435,193649\n435,217522\n435,218878\n435,223791\n435,223922\n435,226228\n435,228493\n435,230495\n435,230991\n435,237119\n435,244794\n435,253085\n435,256956\n436,302\n437,438\n438,65\n438,149\n438,182\n438,336\n438,439\n438,497\n438,505\n438,622\n438,766\n438,779\n438,1163\n438,1290\n438,1354\n438,1566\n438,1665\n438,1699\n438,1714\n438,1803\n438,2102\n438,2427\n438,5305\n438,9375\n438,14040\n438,18591\n438,22221\n438,23453\n438,40072\n438,48364\n439,20\n439,34\n439,35\n439,178\n439,256\n439,259\n439,315\n439,333\n439,346\n439,435\n439,439\n439,440\n439,447\n439,538\n439,577\n439,599\n439,622\n439,671\n439,676\n439,724\n439,766\n439,818\n439,838\n439,903\n439,934\n439,939\n439,950\n439,1011\n439,1033\n439,1068\n439,1085\n439,1262\n439,1294\n439,1369\n439,1370\n439,1474\n439,1498\n439,1565\n439,1590\n439,1612\n439,1644\n439,1651\n439,1776\n439,1789\n439,2102\n439,2152\n439,2340\n439,2352\n439,2400\n439,2418\n439,2427\n439,2511\n439,2710\n439,3241\n439,3507\n439,3555\n439,3576\n439,3831\n439,3866\n439,3903\n439,3990\n439,4102\n439,4461\n439,4514\n439,5189\n439,5212\n439,5228\n439,5376\n439,5654\n439,5731\n439,5851\n439,6422\n439,6648\n439,6966\n439,8243\n439,8273\n439,8425\n439,13547\n439,13562\n439,13713\n439,14111\n439,14233\n439,15141\n439,15238\n439,15344\n439,15355\n439,16563\n439,17426\n439,18220\n439,18309\n439,18731\n439,19191\n439,19457\n439,21255\n439,21563\n439,22902\n439,24664\n439,26038\n439,26905\n439,27167\n439,29057\n439,31222\n439,31765\n439,32468\n439,32792\n439,34342\n439,35636\n439,35672\n439,36653\n439,36786\n439,37772\n439,37870\n439,38253\n439,38270\n439,38776\n439,39578\n439,40914\n439,41353\n439,43402\n439,45101\n439,46326\n439,46989\n439,48243\n439,48364\n439,48982\n439,49088\n439,53241\n439,54798\n439,55603\n439,55958\n439,58552\n439,59020\n439,59663\n439,59741\n439,62265\n439,63166\n439,63347\n439,63425\n439,63499\n439,64235\n439,64239\n439,64572\n439,64684\n439,66258\n439,68220\n439,69883\n439,70071\n439,74234\n439,75349\n439,75912\n439,82872\n439,87729\n439,89392\n439,89752\n439,92761\n439,93146\n439,100125\n439,100573\n439,100829\n439,101516\n439,103772\n439,106377\n439,107614\n439,114840\n439,122087\n439,127158\n439,130320\n439,133112\n439,133922\n439,134844\n439,135220\n439,135221\n439,135361\n439,135905\n439,135967\n439,136841\n439,140395\n439,142109\n439,142393\n439,144849\n439,146836\n439,148970\n439,150449\n439,150741\n439,152182\n439,152888\n439,153632\n439,155404\n439,156016\n439,161611\n439,162008\n439,163945\n439,164367\n439,164387\n439,167054\n439,168310\n439,169844\n439,173556\n439,174652\n439,175056\n439,178065\n439,179823\n439,183931\n439,185895\n439,190492\n439,191503\n439,212024\n439,213512\n439,216287\n439,216507\n439,217345\n439,217986\n439,228943\n439,232288\n439,232657\n439,233392\n439,238384\n439,238932\n439,239965\n439,240395\n439,243369\n439,247224\n439,247717\n439,249251\n439,250775\n439,252900\n439,253099\n439,253917\n439,258327\n439,258421\n439,263411\n439,264118\n439,264187\n440,20\n440,34\n440,35\n440,68\n440,97\n440,195\n440,202\n440,211\n440,264\n440,302\n440,314\n440,327\n440,328\n440,337\n440,373\n440,392\n440,406\n440,457\n440,467\n440,479\n440,516\n440,536\n440,621\n440,622\n440,631\n440,673\n440,693\n440,697\n440,710\n440,794\n440,809\n440,818\n440,837\n440,872\n440,903\n440,907\n440,911\n440,920\n440,939\n440,950\n440,972\n440,1014\n440,1033\n440,1085\n440,1118\n440,1204\n440,1294\n440,1298\n440,1494\n440,1653\n440,1722\n440,1729\n440,1758\n440,1837\n440,1844\n440,1855\n440,1893\n440,2085\n440,2418\n440,2438\n440,2496\n440,2683\n440,2710\n440,2979\n440,3565\n440,4175\n440,4188\n440,4354\n440,4466\n440,4771\n440,5392\n440,5472\n440,5584\n440,5604\n440,5631\n440,6422\n440,8013\n440,8041\n440,8274\n440,13235\n440,13323\n440,14040\n440,15344\n440,15686\n440,17310\n440,17337\n440,18024\n440,18194\n440,20293\n440,20539\n440,20598\n440,22048\n440,36809\n440,38105\n440,38186\n440,38355\n440,43383\n440,45453\n440,46350\n440,49420\n440,52084\n440,55287\n440,57143\n440,57633\n440,60712\n440,64610\n440,67210\n440,70133\n440,71056\n440,75139\n440,75817\n440,77035\n440,81233\n440,81787\n440,84241\n440,85829\n440,88939\n440,94242\n440,104536\n440,104569\n440,106244\n440,106305\n440,107574\n440,109468\n440,120155\n440,121131\n440,122206\n440,122266\n440,122657\n440,122675\n440,122806\n440,122890\n440,123110\n440,123163\n440,123169\n440,123187\n440,123249\n440,123833\n440,123846\n440,123912\n440,124072\n440,124492\n440,125111\n440,127419\n440,127427\n440,127909\n440,131295\n440,131650\n440,133112\n440,133462\n440,134517\n440,135099\n440,135100\n440,137255\n440,140100\n440,145520\n440,149028\n440,149233\n440,158382\n440,164727\n440,166432\n440,167676\n440,170444\n440,176362\n440,176418\n440,179726\n440,181585\n440,181771\n440,181817\n440,181838\n440,182241\n440,182431\n440,183156\n440,183532\n440,184707\n440,185837\n440,186533\n440,187430\n440,190286\n440,190342\n440,190977\n440,192483\n440,193677\n440,194079\n440,194172\n440,194200\n440,194204\n440,194332\n440,194408\n440,194443\n440,194488\n440,196031\n440,196183\n440,197165\n440,197472\n440,197633\n440,198774\n440,198829\n440,199032\n440,199568\n440,199685\n440,200143\n440,201484\n440,205599\n440,222617\n440,225403\n440,231943\n440,249273\n440,253402\n440,254643\n440,257037\n441,58\n441,87\n441,107\n441,111\n441,182\n441,211\n441,256\n441,264\n441,292\n441,314\n441,356\n441,360\n441,397\n441,441\n441,442\n441,452\n441,457\n441,467\n441,500\n441,502\n441,510\n441,535\n441,572\n441,599\n441,609\n441,626\n441,673\n441,676\n441,685\n441,745\n441,749\n441,794\n441,801\n441,808\n441,838\n441,843\n441,849\n441,852\n441,872\n441,911\n441,929\n441,953\n441,999\n441,1011\n441,1014\n441,1025\n441,1045\n441,1046\n441,1096\n441,1118\n441,1127\n441,1130\n441,1140\n441,1146\n441,1147\n441,1177\n441,1191\n441,1192\n441,1204\n441,1235\n441,1238\n441,1262\n441,1326\n441,1332\n441,1335\n441,1417\n441,1449\n441,1566\n441,1572\n441,1653\n441,1663\n441,1677\n441,1688\n441,1722\n441,1758\n441,1836\n441,1844\n441,1893\n441,1992\n441,2065\n441,2173\n441,2201\n441,2209\n441,2253\n441,2292\n441,2310\n441,2334\n441,2373\n441,2379\n441,2436\n441,2443\n441,2889\n441,3035\n441,3474\n441,3524\n441,3538\n441,3555\n441,3830\n441,4039\n441,4114\n441,4190\n441,4276\n441,4308\n441,4520\n441,4771\n441,5068\n441,5547\n441,5679\n441,6566\n441,6569\n441,6581\n441,6824\n441,6904\n441,7921\n441,8994\n441,9457\n441,9739\n441,12752\n441,13323\n441,14674\n441,15609\n441,15658\n441,18013\n441,19413\n441,20757\n441,21589\n441,22490\n441,24500\n441,25282\n441,30770\n441,32978\n441,35402\n441,37414\n441,76815\n441,77711\n441,79369\n441,97889\n441,98967\n441,114185\n441,126278\n441,136072\n441,206387\n441,207659\n441,215874\n441,231838\n442,58\n442,107\n442,136\n442,186\n442,200\n442,217\n442,256\n442,292\n442,314\n442,441\n442,442\n442,557\n442,599\n442,609\n442,626\n442,631\n442,784\n442,794\n442,849\n442,852\n442,972\n442,999\n442,1001\n442,1011\n442,1014\n442,1119\n442,1252\n442,1253\n442,1332\n442,1415\n442,1572\n442,1688\n442,1722\n442,1973\n442,2089\n442,2209\n442,2253\n442,2334\n442,2373\n442,2436\n442,2940\n442,3507\n442,4771\n442,21944\n443,444\n444,46\n444,240\n444,256\n444,301\n444,304\n444,314\n444,372\n444,431\n444,443\n444,444\n444,459\n444,518\n444,534\n444,567\n444,568\n444,569\n444,604\n444,615\n444,663\n444,698\n444,744\n444,775\n444,783\n444,852\n444,877\n444,937\n444,968\n444,973\n444,1011\n444,1045\n444,1046\n444,1117\n444,1122\n444,1160\n444,1285\n444,1293\n444,1732\n444,1782\n444,1810\n444,2595\n444,3122\n444,3392\n444,3397\n444,3422\n444,3463\n444,3560\n444,4517\n444,5662\n444,13296\n444,14246\n444,14636\n444,15109\n444,15588\n444,17894\n444,18098\n444,18604\n444,18672\n444,22062\n444,23848\n444,23871\n444,25273\n444,26789\n444,27458\n444,30191\n444,31784\n444,37340\n444,42598\n444,48402\n444,67185\n444,75802\n444,76632\n444,79424\n444,79427\n444,82206\n444,83369\n444,83512\n444,90254\n444,90257\n444,103860\n444,112527\n444,122451\n444,136594\n444,151103\n444,152468\n444,155401\n444,180551\n444,183305\n444,189303\n444,190242\n444,238666\n444,254468\n444,262345\n444,262346\n444,262769\n445,130\n446,1\n446,5\n446,10\n446,22\n446,30\n446,32\n446,50\n446,56\n446,59\n446,68\n446,71\n446,83\n446,106\n446,134\n446,136\n446,137\n446,146\n446,147\n446,175\n446,200\n446,251\n446,261\n446,272\n446,273\n446,275\n446,287\n446,292\n446,298\n446,304\n446,313\n446,328\n446,332\n446,336\n446,360\n446,372\n446,390\n446,393\n446,397\n446,417\n446,431\n446,447\n446,489\n446,500\n446,577\n446,595\n446,604\n446,605\n446,609\n446,615\n446,626\n446,631\n446,644\n446,663\n446,664\n446,671\n446,682\n446,685\n446,693\n446,694\n446,697\n446,698\n446,702\n446,704\n446,726\n446,746\n446,749\n446,752\n446,772\n446,775\n446,788\n446,809\n446,818\n446,841\n446,850\n446,862\n446,874\n446,875\n446,911\n446,919\n446,932\n446,937\n446,968\n446,972\n446,973\n446,991\n446,996\n446,999\n446,1070\n446,1085\n446,1113\n446,1119\n446,1127\n446,1132\n446,1175\n446,1188\n446,1210\n446,1220\n446,1222\n446,1235\n446,1238\n446,1240\n446,1243\n446,1284\n446,1285\n446,1293\n446,1298\n446,1309\n446,1319\n446,1345\n446,1353\n446,1415\n446,1436\n446,1511\n446,1551\n446,1566\n446,1571\n446,1608\n446,1619\n446,1623\n446,1634\n446,1715\n446,1789\n446,1801\n446,1803\n446,1805\n446,1807\n446,1836\n446,1844\n446,1888\n446,1927\n446,1955\n446,1985\n446,2006\n446,2045\n446,2105\n446,2201\n446,2367\n446,2411\n446,2421\n446,2572\n446,2620\n446,2775\n446,2782\n446,2995\n446,3069\n446,3422\n446,3507\n446,3538\n446,3695\n446,3794\n446,4039\n446,4146\n446,4220\n446,4222\n446,4327\n446,4455\n446,4637\n446,5265\n446,5718\n446,6424\n446,6621\n446,7092\n446,7194\n446,7530\n446,8072\n446,13207\n446,13991\n446,15553\n446,15582\n446,16014\n446,17894\n446,19010\n446,21159\n446,23783\n446,27834\n446,28553\n446,30331\n446,31893\n446,32751\n446,33354\n446,41230\n446,42581\n446,45144\n446,47805\n446,48505\n446,66348\n446,66754\n446,68069\n446,72439\n446,75912\n446,79734\n446,81233\n446,87871\n446,93113\n446,95438\n446,95823\n446,96855\n446,98813\n446,102560\n446,106810\n446,114682\n446,121109\n446,139465\n446,141452\n446,144231\n446,171641\n446,176782\n446,185877\n446,189788\n446,190492\n446,215264\n446,220083\n446,221828\n446,227376\n446,241660\n446,247075\n447,20\n447,175\n447,272\n447,314\n447,315\n447,346\n447,434\n447,435\n447,439\n447,447\n447,538\n447,671\n447,766\n447,788\n447,849\n447,911\n447,934\n447,939\n447,996\n447,1033\n447,1294\n447,1328\n447,1333\n447,1474\n447,1590\n447,1612\n447,1644\n447,1651\n447,1773\n447,1789\n447,1877\n447,1973\n447,2023\n447,2085\n447,2094\n447,2102\n447,2427\n447,3241\n447,4046\n447,4339\n447,4375\n447,4399\n447,4557\n447,4646\n447,5083\n447,5755\n447,6440\n447,6586\n447,6622\n447,6661\n447,6966\n447,8142\n447,8374\n447,13711\n447,13766\n447,13770\n447,14831\n447,15141\n447,15196\n447,15345\n447,15802\n447,17421\n447,17423\n447,17424\n447,17432\n447,17794\n447,18124\n447,22168\n447,26787\n447,30775\n447,33085\n447,35359\n447,35661\n447,36915\n447,37315\n447,39098\n447,41378\n447,43196\n447,43372\n447,43376\n447,43787\n447,46154\n447,50212\n447,50500\n447,50967\n447,51390\n447,52196\n447,54295\n447,54688\n447,56008\n447,67290\n447,71664\n447,82098\n447,87380\n447,88371\n447,90933\n447,97023\n447,101849\n447,103107\n447,105579\n447,105617\n447,106377\n447,110761\n447,117734\n447,120052\n447,120155\n447,128831\n447,133418\n447,144011\n447,144882\n447,152128\n447,158605\n447,165373\n447,185517\n447,188787\n447,190492\n447,193204\n447,214641\n447,215318\n447,220470\n447,237482\n447,238171\n447,241266\n447,241681\n447,245895\n447,250543\n447,260234\n448,240\n449,450\n450,136\n450,225\n450,248\n450,255\n450,288\n450,328\n450,364\n450,449\n450,450\n450,563\n450,630\n450,850\n450,953\n450,1179\n450,1332\n450,1340\n450,1368\n450,1740\n450,1882\n450,1974\n450,2036\n450,2545\n450,3565\n450,3719\n450,4072\n450,4074\n450,4276\n450,4355\n450,4509\n450,4679\n450,5405\n450,5804\n450,7059\n450,7757\n450,7912\n450,7921\n450,8093\n450,8103\n450,13207\n450,13220\n450,13544\n450,13624\n450,14565\n450,15078\n450,16143\n450,16758\n450,16785\n450,19817\n450,20357\n450,20510\n450,25600\n450,25948\n450,26195\n450,27097\n450,32778\n450,32893\n450,34724\n450,34815\n450,34938\n450,37042\n450,38650\n450,41467\n450,44416\n450,47118\n450,48276\n450,48322\n450,48324\n450,48761\n450,49009\n450,49079\n450,53398\n450,59956\n450,61320\n450,62343\n450,63507\n450,65820\n450,71793\n450,75096\n450,78764\n450,79302\n450,87762\n450,87929\n450,88611\n450,93556\n450,94330\n450,102494\n450,102777\n450,102941\n450,109281\n450,110647\n450,121900\n450,122154\n450,125373\n450,125949\n450,126698\n450,126762\n450,126838\n450,136676\n450,140433\n450,140814\n450,143153\n450,152028\n450,157501\n450,158863\n450,159730\n450,161153\n450,163752\n450,166328\n450,168792\n450,174908\n450,175899\n450,176590\n450,183878\n450,195018\n450,199534\n450,207659\n450,215361\n450,215917\n450,216106\n450,222773\n450,228647\n450,237790\n450,241368\n450,247227\n450,248446\n451,452\n451,918\n452,20\n452,97\n452,126\n452,167\n452,182\n452,192\n452,222\n452,240\n452,256\n452,259\n452,292\n452,301\n452,302\n452,336\n452,352\n452,360\n452,366\n452,392\n452,397\n452,406\n452,441\n452,452\n452,457\n452,462\n452,467\n452,479\n452,497\n452,505\n452,510\n452,512\n452,516\n452,534\n452,536\n452,567\n452,604\n452,623\n452,640\n452,658\n452,673\n452,676\n452,685\n452,693\n452,697\n452,704\n452,712\n452,764\n452,801\n452,818\n452,838\n452,843\n452,872\n452,874\n452,911\n452,918\n452,972\n452,1010\n452,1011\n452,1014\n452,1021\n452,1089\n452,1127\n452,1135\n452,1147\n452,1172\n452,1204\n452,1210\n452,1262\n452,1267\n452,1284\n452,1293\n452,1298\n452,1326\n452,1345\n452,1370\n452,1402\n452,1417\n452,1445\n452,1500\n452,1551\n452,1566\n452,1623\n452,1655\n452,1663\n452,1688\n452,1796\n452,1805\n452,1844\n452,1860\n452,1893\n452,1955\n452,1968\n452,1992\n452,2512\n452,2605\n452,2979\n452,3392\n452,3507\n452,3804\n452,4276\n452,4520\n452,4760\n452,5213\n452,6452\n452,6837\n452,6955\n452,7087\n452,7731\n452,9138\n452,13207\n452,18062\n452,19404\n452,19413\n452,22148\n452,23743\n452,24759\n452,26161\n452,30449\n452,31180\n452,39482\n452,41230\n452,48978\n452,48984\n452,73399\n452,75912\n452,93679\n452,94159\n452,97536\n452,115474\n452,145312\n452,212353\n452,215874\n452,242191\n452,263110\n452,263830\n453,454\n455,34\n455,35\n455,54\n455,83\n455,182\n455,217\n455,222\n455,278\n455,283\n455,313\n455,314\n455,389\n455,401\n455,455\n455,462\n455,470\n455,535\n455,536\n455,537\n455,581\n455,599\n455,612\n455,657\n455,676\n455,808\n455,814\n455,818\n455,843\n455,923\n455,949\n455,951\n455,1005\n455,1011\n455,1014\n455,1019\n455,1069\n455,1118\n455,1130\n455,1240\n455,1274\n455,1417\n455,1467\n455,1513\n455,1539\n455,1559\n455,1618\n455,1724\n455,1860\n455,1881\n455,1916\n455,2159\n455,2176\n455,2224\n455,2253\n455,2266\n455,2269\n455,2290\n455,2322\n455,2373\n455,2421\n455,2424\n455,2507\n455,2511\n455,2619\n455,2779\n455,2944\n455,3507\n455,3672\n455,3933\n455,4039\n455,4295\n455,4377\n455,4388\n455,4514\n455,4565\n455,5343\n455,5591\n455,5758\n455,6032\n455,6788\n455,6789\n455,6828\n455,6880\n455,6955\n455,6960\n455,7075\n455,7768\n455,8097\n455,8152\n455,8535\n455,9701\n455,13276\n455,13328\n455,13389\n455,13400\n455,13549\n455,13622\n455,13657\n455,14420\n455,14922\n455,15548\n455,16186\n455,16500\n455,17116\n455,17223\n455,18165\n455,18383\n455,18650\n455,19288\n455,19349\n455,19351\n455,19352\n455,21381\n455,21414\n455,21561\n455,22130\n455,22552\n455,23520\n455,24641\n455,26034\n455,26341\n455,28169\n455,28238\n455,28282\n455,29177\n455,30459\n455,30505\n455,31436\n455,31738\n455,31801\n455,32462\n455,34509\n455,35309\n455,35401\n455,36607\n455,36813\n455,37088\n455,37095\n455,37708\n455,37895\n455,40500\n455,40540\n455,41333\n455,41341\n455,42691\n455,44329\n455,46165\n455,46886\n455,48372\n455,48515\n455,48889\n455,48891\n455,48892\n455,48895\n455,51652\n455,54208\n455,54784\n455,54948\n455,55716\n455,57839\n455,60072\n455,60742\n455,61771\n455,65958\n455,65965\n455,66062\n455,66630\n455,67589\n455,68696\n455,69250\n455,70228\n455,73451\n455,74398\n455,74600\n455,75816\n455,77600\n455,79936\n455,79966\n455,79982\n455,81842\n455,82077\n455,82562\n455,82570\n455,83630\n455,83927\n455,87709\n455,90076\n455,90755\n455,91836\n455,92237\n455,97220\n455,97910\n455,98899\n455,98931\n455,98947\n455,98961\n455,99607\n455,102698\n455,106112\n455,107889\n455,109350\n455,109537\n455,112466\n455,113506\n455,115139\n455,115474\n455,115672\n455,116845\n455,117142\n455,117680\n455,117698\n455,117994\n455,121197\n455,121371\n455,121623\n455,124576\n455,124644\n455,125340\n455,125502\n455,125848\n455,126953\n455,127895\n455,130275\n455,131216\n455,131224\n455,132868\n455,135270\n455,135391\n455,136433\n455,136496\n455,140055\n455,140767\n455,142042\n455,142988\n455,143244\n455,143294\n455,144323\n455,145420\n455,145934\n455,146100\n455,147975\n455,148809\n455,148817\n455,149153\n455,149361\n455,158324\n455,158682\n455,161961\n455,163377\n455,166078\n455,166276\n455,168165\n455,169564\n455,169687\n455,176218\n455,177486\n455,179716\n455,179839\n455,180362\n455,187035\n455,189443\n455,190108\n455,191329\n455,191385\n455,191442\n455,193427\n455,194481\n455,203034\n455,213089\n455,214655\n455,215789\n455,222460\n455,229149\n455,230227\n455,230898\n455,234714\n455,237497\n455,239321\n455,243691\n455,249055\n455,258745\n455,260090\n456,457\n456,2923\n456,4190\n457,1\n457,10\n457,20\n457,34\n457,35\n457,126\n457,167\n457,186\n457,195\n457,207\n457,209\n457,233\n457,251\n457,252\n457,256\n457,259\n457,264\n457,287\n457,301\n457,302\n457,333\n457,336\n457,388\n457,392\n457,397\n457,440\n457,441\n457,452\n457,456\n457,457\n457,467\n457,500\n457,505\n457,510\n457,534\n457,535\n457,536\n457,567\n457,604\n457,657\n457,658\n457,673\n457,676\n457,693\n457,715\n457,733\n457,794\n457,801\n457,808\n457,809\n457,818\n457,838\n457,843\n457,852\n457,862\n457,872\n457,875\n457,911\n457,918\n457,919\n457,972\n457,1010\n457,1014\n457,1085\n457,1118\n457,1130\n457,1147\n457,1191\n457,1204\n457,1210\n457,1240\n457,1267\n457,1293\n457,1298\n457,1370\n457,1381\n457,1402\n457,1417\n457,1445\n457,1462\n457,1518\n457,1531\n457,1566\n457,1572\n457,1634\n457,1655\n457,1724\n457,1796\n457,1805\n457,1844\n457,1893\n457,1955\n457,1968\n457,1992\n457,2173\n457,2266\n457,2310\n457,2373\n457,2512\n457,2580\n457,2605\n457,2923\n457,2989\n457,2991\n457,3367\n457,3392\n457,3507\n457,3524\n457,3578\n457,3582\n457,3744\n457,3866\n457,4070\n457,4165\n457,4190\n457,4237\n457,4276\n457,4286\n457,5213\n457,5285\n457,6452\n457,6607\n457,6641\n457,6695\n457,6837\n457,6955\n457,7124\n457,7157\n457,7698\n457,8195\n457,8535\n457,13207\n457,13275\n457,13624\n457,14674\n457,16600\n457,17535\n457,19413\n457,19442\n457,19549\n457,19784\n457,20426\n457,20724\n457,22296\n457,24847\n457,26730\n457,29595\n457,31942\n457,32929\n457,37726\n457,38273\n457,38798\n457,38815\n457,38823\n457,39446\n457,39536\n457,40256\n457,46063\n457,50083\n457,51884\n457,55665\n457,57132\n457,61209\n457,68797\n457,70395\n457,75087\n457,75144\n457,75912\n457,79528\n457,80442\n457,90300\n457,90453\n457,91289\n457,91851\n457,94077\n457,94167\n457,98181\n457,104592\n457,107525\n457,118336\n457,120958\n457,121609\n457,124378\n457,132863\n457,133099\n457,139624\n457,140133\n457,156919\n457,157657\n457,161617\n457,162952\n457,170616\n457,176950\n457,182162\n457,184790\n457,185934\n457,188689\n457,188733\n457,191956\n457,192480\n457,192510\n457,212304\n457,215871\n457,216170\n457,241658\n457,242401\n457,243365\n457,245379\n457,245510\n457,258102\n457,260890\n458,459\n459,167\n459,299\n459,444\n459,458\n459,459\n459,569\n459,744\n459,783\n459,815\n459,1012\n459,1092\n459,1117\n459,1122\n459,1124\n459,1241\n459,1298\n459,1319\n459,1479\n459,1496\n459,1544\n459,1575\n459,1849\n459,2083\n459,2756\n459,3207\n459,3218\n459,3630\n459,3756\n459,4240\n459,7959\n459,8187\n459,14674\n459,15277\n459,16250\n459,16253\n459,19805\n459,20326\n459,21410\n459,22128\n459,24744\n459,28833\n459,29686\n459,30267\n459,32367\n459,32603\n459,32605\n459,33995\n459,34798\n459,35545\n459,38722\n459,40714\n459,40763\n459,44922\n459,49176\n459,49444\n459,49530\n459,54931\n459,56672\n459,57125\n459,57897\n459,59644\n459,60735\n459,61346\n459,65794\n459,67350\n459,69119\n459,70314\n459,72918\n459,80173\n459,88306\n459,90120\n459,90972\n459,96685\n459,113092\n459,113451\n459,113573\n459,117763\n459,139910\n459,148473\n459,150372\n459,163011\n459,177389\n459,177682\n459,194372\n459,203021\n459,204791\n459,207045\n459,224458\n459,234137\n459,243905\n459,244692\n459,255657\n459,258135\n459,258176\n460,202\n460,203\n460,251\n461,79\n461,292\n461,462\n462,111\n462,186\n462,292\n462,356\n462,420\n462,452\n462,455\n462,467\n462,626\n462,872\n462,1011\n462,1052\n462,1238\n462,1326\n462,1332\n462,1566\n462,1572\n462,1653\n462,1688\n462,1722\n462,1860\n462,1973\n462,2224\n462,3538\n462,4039\n462,4771\n462,25573\n462,37414\n463,464\n463,465\n464,251\n464,465\n465,251\n465,252\n465,318\n465,465\n465,1220\n465,1222\n465,6075\n465,113408\n466,34\n466,66\n466,211\n466,272\n466,392\n466,433\n466,440\n466,467\n466,479\n466,515\n466,516\n466,536\n466,868\n466,872\n466,1085\n466,1140\n466,1151\n466,1659\n466,1796\n466,2991\n466,6904\n466,81233\n466,156379\n467,10\n467,34\n467,65\n467,66\n467,68\n467,79\n467,97\n467,126\n467,158\n467,167\n467,171\n467,186\n467,211\n467,217\n467,240\n467,252\n467,264\n467,269\n467,272\n467,301\n467,314\n467,326\n467,327\n467,337\n467,349\n467,388\n467,397\n467,433\n467,435\n467,439\n467,440\n467,466\n467,467\n467,479\n467,495\n467,497\n467,510\n467,516\n467,535\n467,536\n467,599\n467,673\n467,685\n467,693\n467,818\n467,843\n467,868\n467,872\n467,881\n467,911\n467,920\n467,939\n467,950\n467,973\n467,1001\n467,1007\n467,1010\n467,1011\n467,1019\n467,1085\n467,1096\n467,1133\n467,1140\n467,1151\n467,1204\n467,1210\n467,1235\n467,1262\n467,1326\n467,1345\n467,1370\n467,1381\n467,1417\n467,1422\n467,1463\n467,1494\n467,1507\n467,1517\n467,1518\n467,1531\n467,1566\n467,1659\n467,1729\n467,1749\n467,1782\n467,1796\n467,1797\n467,1844\n467,1845\n467,1849\n467,1855\n467,1916\n467,2244\n467,2348\n467,2414\n467,2438\n467,2464\n467,2561\n467,2580\n467,2583\n467,2646\n467,2907\n467,2991\n467,3035\n467,3199\n467,3569\n467,3804\n467,3866\n467,3884\n467,4159\n467,4498\n467,5388\n467,5563\n467,5578\n467,5625\n467,5654\n467,5717\n467,5827\n467,6602\n467,6761\n467,6782\n467,6921\n467,6990\n467,7186\n467,7880\n467,8535\n467,8606\n467,9527\n467,9579\n467,13233\n467,13524\n467,13538\n467,14304\n467,14414\n467,14592\n467,16010\n467,16286\n467,16357\n467,16522\n467,17022\n467,18203\n467,18224\n467,18228\n467,18244\n467,18249\n467,18250\n467,18290\n467,18397\n467,18601\n467,18731\n467,18787\n467,18834\n467,19716\n467,20261\n467,20295\n467,20323\n467,20613\n467,20873\n467,22000\n467,23514\n467,23520\n467,23754\n467,24682\n467,24761\n467,24934\n467,25249\n467,25662\n467,26034\n467,26450\n467,26516\n467,27827\n467,28317\n467,28816\n467,28955\n467,29037\n467,29064\n467,29531\n467,29713\n467,30507\n467,31280\n467,31704\n467,32626\n467,32784\n467,32978\n467,33991\n467,34039\n467,35278\n467,35435\n467,35543\n467,35672\n467,36563\n467,36920\n467,37569\n467,38605\n467,40524\n467,45427\n467,46135\n467,46839\n467,46922\n467,48051\n467,48119\n467,48404\n467,48538\n467,49631\n467,49651\n467,49692\n467,49991\n467,51884\n467,54958\n467,56334\n467,56365\n467,56668\n467,56672\n467,57182\n467,57207\n467,57800\n467,57821\n467,58420\n467,59269\n467,59658\n467,59791\n467,60467\n467,62172\n467,64722\n467,64742\n467,66290\n467,67936\n467,68034\n467,68722\n467,68888\n467,68891\n467,68906\n467,68910\n467,70616\n467,72646\n467,73702\n467,73718\n467,74770\n467,75297\n467,75354\n467,75495\n467,76091\n467,76142\n467,76219\n467,76863\n467,76921\n467,76965\n467,79528\n467,79830\n467,80440\n467,80617\n467,80760\n467,81233\n467,84739\n467,86341\n467,87800\n467,88053\n467,89617\n467,89764\n467,90628\n467,91947\n467,94881\n467,94906\n467,96325\n467,97078\n467,98275\n467,98404\n467,103195\n467,106556\n467,108084\n467,108088\n467,108426\n467,109343\n467,109555\n467,110750\n467,112460\n467,112811\n467,112819\n467,113124\n467,113354\n467,114106\n467,114219\n467,114353\n467,114535\n467,114606\n467,116044\n467,116088\n467,116262\n467,116982\n467,117060\n467,119493\n467,119970\n467,120727\n467,123074\n467,123505\n467,123608\n467,124116\n467,124942\n467,124953\n467,127021\n467,127433\n467,127935\n467,128426\n467,131224\n467,131792\n467,131808\n467,133364\n467,133466\n467,134753\n467,134798\n467,134802\n467,136349\n467,136950\n467,136990\n467,136991\n467,137420\n467,140064\n467,140068\n467,141817\n467,142411\n467,143466\n467,145636\n467,145646\n467,147616\n467,148504\n467,148518\n467,150125\n467,150469\n467,150604\n467,152212\n467,152504\n467,152604\n467,152855\n467,153601\n467,155459\n467,155463\n467,155469\n467,155706\n467,155767\n467,156264\n467,156379\n467,156602\n467,156939\n467,157246\n467,160897\n467,161289\n467,161339\n467,161482\n467,162599\n467,162682\n467,163303\n467,163729\n467,163869\n467,164698\n467,165770\n467,165796\n467,165879\n467,166069\n467,167098\n467,172654\n467,174438\n467,175439\n467,177976\n467,180347\n467,181183\n467,182902\n467,185902\n467,186620\n467,187438\n467,191339\n467,191351\n467,191635\n467,195165\n467,212070\n467,212567\n467,216100\n467,216275\n467,223854\n467,223860\n467,224069\n467,225580\n467,226266\n467,226463\n467,226985\n467,236967\n467,243609\n467,250959\n467,255856\n467,257093\n467,258313\n467,258459\n467,258839\n467,259458\n467,260251\n467,260420\n467,260428\n467,262135\n467,262610\n468,167\n468,2083\n469,192\n469,333\n469,337\n469,663\n469,664\n469,59021\n470,455\n471,63\n472,473\n472,8149\n473,685\n473,1011\n473,1267\n474,467\n475,259\n476,477\n476,2168\n477,83\n477,389\n477,476\n477,477\n477,536\n477,1617\n477,1618\n477,1843\n477,2159\n477,2168\n477,2553\n477,2944\n477,4030\n477,4234\n477,4295\n477,5458\n477,7698\n477,13461\n477,13980\n477,18345\n477,18685\n477,18831\n477,21015\n477,23287\n477,23481\n477,29309\n477,32749\n477,34013\n477,35956\n477,37376\n477,39537\n477,41936\n477,44080\n477,48043\n477,52378\n477,52454\n477,52459\n477,58334\n477,61171\n477,61309\n477,66703\n477,67955\n477,83988\n477,107043\n477,115440\n477,118835\n477,127307\n477,128273\n477,129258\n477,130753\n477,149462\n477,151013\n477,160474\n477,162765\n477,174370\n477,177863\n477,198176\n477,198360\n477,204050\n477,215824\n477,216248\n477,218858\n478,264\n478,479\n478,1381\n479,186\n479,440\n479,452\n479,479\n479,510\n479,535\n479,872\n479,1014\n480,481\n480,2083\n480,4637\n481,256\n481,397\n481,481\n481,567\n481,581\n481,668\n481,685\n481,713\n481,911\n481,1021\n481,1172\n481,2217\n481,2309\n481,2310\n481,3061\n481,3435\n481,3967\n481,5356\n481,6187\n481,8419\n481,13754\n481,14674\n481,16010\n481,18473\n481,21390\n481,23311\n481,24286\n481,25282\n481,30063\n481,30299\n481,33987\n481,34709\n481,34898\n481,35453\n481,56089\n481,61084\n481,66762\n481,69680\n481,79956\n481,80032\n481,88420\n481,98032\n481,102668\n481,107328\n481,119929\n481,122391\n481,122408\n481,127653\n481,131883\n481,142771\n481,145312\n481,157561\n481,205444\n481,205737\n481,212905\n481,219812\n481,228834\n481,229771\n481,230268\n481,237362\n482,298\n483,259\n483,309\n483,310\n483,483\n483,714\n483,718\n483,1796\n483,2784\n483,6556\n483,6627\n483,177920\n483,232766\n484,485\n485,10\n485,97\n485,175\n485,485\n485,685\n485,693\n485,704\n485,841\n485,1096\n485,1619\n485,2460\n485,3017\n485,3447\n485,4869\n485,5192\n485,5356\n485,5673\n485,7117\n485,7323\n485,7757\n485,8278\n485,8805\n485,9147\n485,9164\n485,9348\n485,13424\n485,14045\n485,15528\n485,17663\n485,17839\n485,17840\n485,18187\n485,18408\n485,18633\n485,19057\n485,26197\n485,26929\n485,28294\n485,30999\n485,34188\n485,34885\n485,36708\n485,38973\n485,40613\n485,42333\n485,46348\n485,48078\n485,49972\n485,50537\n485,52392\n485,57825\n485,62205\n485,63551\n485,64569\n485,65522\n485,66537\n485,68190\n485,79919\n485,81266\n485,86520\n485,87099\n485,88390\n485,89537\n485,91192\n485,91907\n485,97360\n485,97546\n485,97893\n485,103496\n485,108998\n485,109640\n485,109932\n485,116542\n485,120495\n485,122275\n485,122789\n485,124857\n485,125096\n485,125221\n485,126011\n485,127286\n485,129881\n485,131963\n485,133956\n485,138209\n485,143270\n485,143351\n485,145095\n485,147455\n485,148284\n485,148826\n485,153564\n485,158957\n485,159993\n485,161461\n485,165207\n485,173396\n485,176000\n485,178899\n485,179704\n485,181486\n485,181909\n485,184784\n485,184893\n485,188201\n485,189848\n485,192599\n485,194174\n485,197708\n485,208040\n485,214200\n485,218566\n485,219730\n485,229220\n485,230629\n485,231709\n485,243360\n485,253370\n485,255658\n486,202\n486,203\n486,206\n487,292\n488,163\n488,209\n488,340\n488,489\n489,356\n489,425\n489,489\n489,673\n489,685\n489,811\n489,849\n489,861\n489,911\n489,1130\n489,1603\n489,1844\n489,2580\n489,3804\n489,19413\n490,491\n491,491\n491,872\n492,493\n493,10\n493,20\n493,63\n493,149\n493,192\n493,202\n493,203\n493,252\n493,314\n493,406\n493,492\n493,493\n493,516\n493,599\n493,663\n493,682\n493,685\n493,733\n493,911\n493,920\n493,998\n493,1014\n493,1175\n493,1181\n493,1192\n493,1220\n493,1222\n493,1243\n493,1265\n493,1266\n493,1433\n493,1494\n493,1512\n493,1531\n493,1568\n493,1594\n493,1601\n493,1655\n493,1686\n493,1825\n493,1927\n493,2033\n493,2104\n493,2154\n493,2173\n493,2348\n493,2400\n493,2455\n493,2489\n493,2528\n493,2552\n493,2666\n493,3082\n493,3651\n493,3835\n493,3905\n493,3943\n493,3955\n493,4159\n493,4342\n493,4446\n493,4752\n493,4814\n493,5682\n493,5759\n493,5798\n493,5851\n493,5992\n493,6325\n493,6454\n493,6586\n493,7731\n493,7794\n493,8764\n493,13478\n493,13494\n493,13626\n493,13659\n493,14966\n493,15344\n493,16497\n493,17583\n493,18816\n493,19486\n493,20566\n493,20916\n493,21427\n493,21528\n493,22148\n493,23053\n493,23517\n493,23655\n493,23769\n493,23791\n493,24723\n493,25952\n493,26069\n493,26331\n493,26373\n493,26570\n493,26736\n493,26774\n493,26837\n493,26839\n493,27098\n493,27104\n493,27184\n493,27495\n493,27940\n493,28211\n493,28377\n493,28390\n493,28690\n493,28836\n493,30399\n493,30615\n493,30622\n493,30669\n493,31177\n493,31374\n493,31403\n493,34090\n493,34118\n493,34885\n493,35607\n493,36196\n493,36968\n493,39618\n493,40542\n493,40547\n493,41799\n493,42787\n493,42974\n493,43256\n493,43885\n493,43990\n493,48175\n493,49960\n493,50123\n493,50432\n493,52809\n493,54988\n493,55034\n493,55097\n493,55124\n493,56225\n493,57706\n493,60710\n493,61356\n493,62086\n493,64650\n493,64843\n493,65925\n493,66387\n493,67217\n493,68268\n493,68295\n493,69075\n493,71843\n493,72068\n493,72439\n493,74422\n493,75883\n493,75951\n493,75960\n493,78879\n493,79879\n493,79922\n493,81354\n493,82245\n493,82827\n493,86765\n493,87705\n493,88430\n493,95419\n493,95823\n493,99826\n493,99990\n493,101704\n493,102153\n493,102760\n493,102766\n493,103278\n493,103925\n493,106636\n493,106887\n493,109937\n493,110621\n493,112066\n493,113621\n493,114091\n493,114239\n493,115967\n493,116644\n493,116655\n493,123141\n493,124895\n493,125401\n493,125856\n493,125982\n493,126731\n493,128254\n493,129886\n493,133981\n493,134272\n493,139801\n493,143424\n493,151030\n493,153274\n493,161210\n493,161331\n493,164225\n493,169407\n493,171056\n493,173881\n493,174940\n493,177388\n493,177558\n493,177858\n493,180378\n493,182308\n493,182330\n493,184581\n493,184761\n493,185838\n493,188050\n493,189839\n493,194635\n493,196558\n493,196712\n493,196780\n493,196782\n493,196795\n493,199885\n493,200561\n493,200782\n493,201057\n493,204071\n493,214822\n493,215276\n493,222369\n493,222526\n493,225402\n493,225690\n493,225800\n493,233977\n493,236981\n493,238349\n493,241099\n493,242274\n493,243369\n493,243781\n493,244051\n493,246087\n493,247155\n493,248064\n493,249055\n493,249098\n493,250823\n493,251239\n493,251241\n493,257986\n493,258044\n493,263358\n494,390\n495,65\n495,66\n495,217\n495,240\n495,292\n495,314\n495,467\n495,536\n495,868\n495,1001\n495,1345\n495,1433\n495,31206\n495,156379\n496,497\n497,136\n497,256\n497,336\n497,452\n497,455\n497,457\n497,496\n497,497\n497,505\n497,668\n497,673\n497,712\n497,713\n497,825\n497,843\n497,862\n497,911\n497,1058\n497,1118\n497,1172\n497,1262\n497,1293\n497,1332\n497,1494\n497,1566\n497,1603\n497,1613\n497,1655\n497,1707\n497,1808\n497,1844\n497,1860\n497,2229\n497,2294\n497,2310\n497,2355\n497,3605\n497,3967\n497,4044\n497,4250\n497,5551\n497,5829\n497,6642\n497,6861\n497,7934\n497,8055\n497,8122\n497,9457\n497,13207\n497,13538\n497,14674\n497,15150\n497,19144\n497,19276\n497,23099\n497,23560\n497,23562\n497,24634\n497,25751\n497,28970\n497,28974\n497,29100\n497,35353\n497,37510\n497,42973\n497,45658\n497,47152\n497,50157\n497,50180\n497,51904\n497,58359\n497,63476\n497,75098\n497,109996\n497,118317\n497,121930\n497,136022\n497,148226\n497,164996\n497,169567\n497,169886\n497,169955\n497,173873\n497,179406\n497,181884\n497,181951\n499,500\n499,808\n499,1043\n499,1117\n499,1118\n499,1240\n499,1284\n499,1732\n500,10\n500,109\n500,175\n500,178\n500,182\n500,186\n500,192\n500,211\n500,240\n500,366\n500,397\n500,500\n500,512\n500,676\n500,693\n500,718\n500,784\n500,808\n500,818\n500,875\n500,911\n500,918\n500,1014\n500,1048\n500,1107\n500,1118\n500,1147\n500,1204\n500,1345\n500,1445\n500,1531\n500,1566\n500,1694\n500,1796\n500,1882\n500,2083\n500,2175\n500,2191\n500,2295\n500,2512\n500,2602\n500,2606\n500,2668\n500,2775\n500,3087\n500,3164\n500,3173\n500,3543\n500,3983\n500,4066\n500,4101\n500,4238\n500,4845\n500,4871\n500,5652\n500,6614\n500,6824\n500,6962\n500,7067\n500,7078\n500,7413\n500,7430\n500,8069\n500,8808\n500,9721\n500,13257\n500,14122\n500,14315\n500,14540\n500,17356\n500,18199\n500,18637\n500,19406\n500,19413\n500,19484\n500,20645\n500,21260\n500,22267\n500,22296\n500,23425\n500,23501\n500,25179\n500,27500\n500,27939\n500,28113\n500,28220\n500,28424\n500,29944\n500,30485\n500,31171\n500,31797\n500,31874\n500,32950\n500,35730\n500,36308\n500,37275\n500,38453\n500,38531\n500,39706\n500,41096\n500,41998\n500,42466\n500,42737\n500,44056\n500,44269\n500,49904\n500,50241\n500,50712\n500,53420\n500,53510\n500,56396\n500,57065\n500,59790\n500,61696\n500,62211\n500,65706\n500,68096\n500,71622\n500,72775\n500,75040\n500,76183\n500,80007\n500,80023\n500,80065\n500,80265\n500,81796\n500,82870\n500,84625\n500,86094\n500,86425\n500,88467\n500,88702\n500,88726\n500,89682\n500,89831\n500,90935\n500,91435\n500,93628\n500,94300\n500,96537\n500,97081\n500,97273\n500,97368\n500,97372\n500,97374\n500,97375\n500,97384\n500,97388\n500,97390\n500,97391\n500,97395\n500,97397\n500,97400\n500,97404\n500,97407\n500,97413\n500,97417\n500,97419\n500,97421\n500,97426\n500,97427\n500,97428\n500,97429\n500,97430\n500,97436\n500,97437\n500,97439\n500,97894\n500,98138\n500,98141\n500,98142\n500,98144\n500,98147\n500,103722\n500,103760\n500,106205\n500,107370\n500,107377\n500,109315\n500,109319\n500,113956\n500,115168\n500,117794\n500,117928\n500,118898\n500,120412\n500,120663\n500,120902\n500,120908\n500,124869\n500,125023\n500,126899\n500,129756\n500,130903\n500,131228\n500,136722\n500,136723\n500,136757\n500,138076\n500,139516\n500,139733\n500,145880\n500,145933\n500,151081\n500,152413\n500,153199\n500,156546\n500,157077\n500,166990\n500,171709\n500,171838\n500,174329\n500,174332\n500,174355\n500,174359\n500,179196\n500,188475\n500,188479\n500,188896\n501,364\n501,595\n501,1252\n501,1253\n502,28\n502,30\n502,104\n502,107\n502,111\n502,119\n502,134\n502,143\n502,200\n502,215\n502,227\n502,264\n502,290\n502,292\n502,314\n502,372\n502,406\n502,441\n502,442\n502,503\n502,631\n502,636\n502,704\n502,714\n502,784\n502,805\n502,1011\n502,1014\n502,1016\n502,1149\n502,1177\n502,1235\n502,1238\n502,1402\n502,1462\n502,1745\n502,1973\n502,2205\n502,2379\n502,3538\n502,4571\n502,4771\n502,5265\n502,6824\n502,8180\n502,8537\n502,33424\n502,88820\n503,81\n503,104\n503,120\n503,215\n503,227\n503,254\n503,502\n503,503\n503,631\n503,704\n503,1118\n503,1149\n503,1257\n503,1270\n503,1279\n503,1282\n503,1346\n503,1392\n503,1402\n503,2379\n503,2436\n503,2708\n503,4216\n503,4221\n503,4261\n503,4580\n503,5283\n503,5284\n503,5552\n503,5642\n503,5809\n503,6023\n503,6674\n503,8546\n503,12747\n503,13636\n503,13730\n503,14080\n503,14150\n503,14456\n503,14638\n503,15189\n503,15579\n503,15658\n503,16306\n503,16342\n503,16401\n503,16507\n503,17607\n503,18400\n503,18942\n503,19500\n503,19634\n503,20843\n503,21253\n503,22222\n503,23851\n503,25015\n503,25814\n503,28291\n503,31162\n503,32254\n503,33938\n503,34065\n503,35475\n503,36821\n503,37562\n503,37563\n503,37573\n503,37574\n503,37575\n503,37580\n503,37582\n503,37583\n503,37584\n503,37585\n503,37588\n503,37591\n503,37592\n503,37593\n503,37594\n503,37600\n503,37604\n503,37606\n503,37607\n503,37609\n503,37619\n503,37620\n503,37621\n503,37622\n503,37623\n503,37624\n503,37625\n503,37626\n503,37627\n503,37632\n503,37633\n503,37634\n503,37635\n503,37636\n503,37638\n503,37641\n503,37642\n503,37644\n503,37645\n503,37646\n503,37715\n503,37746\n503,37748\n503,37749\n503,37752\n503,37754\n503,37757\n503,37763\n503,38195\n503,38232\n503,38810\n503,38813\n503,38814\n503,38837\n503,39118\n503,39280\n503,40053\n503,40794\n503,40795\n503,40798\n503,43090\n503,43731\n503,44256\n503,46079\n503,47770\n503,49339\n503,49921\n503,50204\n503,50518\n503,51503\n503,54408\n503,60459\n503,65681\n503,69647\n503,78907\n503,82165\n503,87800\n503,90148\n503,95107\n503,97338\n503,98940\n503,99057\n503,99059\n503,99061\n503,99062\n503,99685\n503,103281\n503,103838\n503,103916\n503,103918\n503,103920\n503,103921\n503,103922\n503,103936\n503,104102\n503,106915\n503,111633\n503,113103\n503,113105\n503,114953\n503,116749\n503,120082\n503,120083\n503,120905\n503,122438\n503,122678\n503,122679\n503,124883\n503,124899\n503,126144\n503,134164\n503,168485\n503,171109\n503,173252\n503,173679\n503,176844\n503,180272\n503,182023\n503,186188\n503,187045\n503,188234\n503,189618\n503,198381\n503,200725\n503,212503\n503,212505\n503,212506\n503,212507\n503,216645\n503,216783\n503,220403\n503,220414\n503,220415\n503,221043\n503,222629\n503,224583\n503,234916\n503,242196\n503,246740\n503,254568\n503,254571\n503,254575\n503,254850\n503,255273\n503,256852\n503,256854\n503,257946\n503,260153\n504,505\n504,581\n505,1\n505,50\n505,99\n505,106\n505,146\n505,147\n505,149\n505,158\n505,175\n505,186\n505,192\n505,195\n505,202\n505,206\n505,256\n505,285\n505,314\n505,333\n505,336\n505,337\n505,397\n505,406\n505,452\n505,457\n505,493\n505,497\n505,505\n505,585\n505,586\n505,602\n505,622\n505,640\n505,663\n505,664\n505,668\n505,673\n505,676\n505,685\n505,733\n505,779\n505,818\n505,820\n505,838\n505,841\n505,849\n505,920\n505,991\n505,1011\n505,1014\n505,1027\n505,1089\n505,1107\n505,1191\n505,1222\n505,1262\n505,1293\n505,1328\n505,1370\n505,1425\n505,1458\n505,1512\n505,1515\n505,1518\n505,1521\n505,1566\n505,1619\n505,1623\n505,1655\n505,1663\n505,1844\n505,1985\n505,1992\n505,2244\n505,2253\n505,2782\n505,3392\n505,3895\n505,4190\n505,4932\n505,5533\n505,7055\n505,8443\n505,9457\n505,15330\n505,15417\n505,16019\n505,18164\n505,20757\n505,21277\n505,21442\n505,21736\n505,25388\n505,26730\n505,30331\n505,40782\n505,41103\n505,48364\n505,59020\n505,60576\n505,72439\n505,76704\n505,80058\n505,80266\n505,89035\n505,92476\n505,118336\n505,124847\n505,136022\n505,141912\n505,146917\n505,154168\n505,160515\n505,160867\n505,163335\n505,163398\n505,170478\n505,173387\n505,174124\n505,181962\n505,192979\n505,211927\n505,213782\n505,215874\n505,220455\n505,227365\n505,236489\n505,244006\n505,248475\n505,250184\n505,256831\n505,259513\n506,106\n506,1707\n506,1888\n507,298\n508,485\n509,3\n509,32\n509,140\n509,167\n509,264\n509,292\n509,312\n509,327\n509,349\n509,358\n509,389\n509,392\n509,509\n509,510\n509,535\n509,599\n509,663\n509,673\n509,676\n509,685\n509,697\n509,770\n509,779\n509,794\n509,809\n509,822\n509,838\n509,843\n509,849\n509,852\n509,872\n509,875\n509,903\n509,1011\n509,1024\n509,1025\n509,1043\n509,1130\n509,1151\n509,1173\n509,1210\n509,1276\n509,1345\n509,1424\n509,1453\n509,1507\n509,1515\n509,1566\n509,1572\n509,1619\n509,1722\n509,1973\n509,2028\n509,2150\n509,2181\n509,2230\n509,2373\n509,2418\n509,2511\n509,3003\n509,3182\n509,3367\n509,3483\n509,3743\n509,4039\n509,4382\n509,4514\n509,4565\n509,4580\n509,4722\n509,5043\n509,5057\n509,5846\n509,5926\n509,6567\n509,7050\n509,7154\n509,7993\n509,8428\n509,8658\n509,9330\n509,9742\n509,13193\n509,14010\n509,14357\n509,14891\n509,15508\n509,15525\n509,15566\n509,16455\n509,16502\n509,18029\n509,20591\n509,21607\n509,22304\n509,22806\n509,23626\n509,24686\n509,26164\n509,29008\n509,29688\n509,30373\n509,31055\n509,31080\n509,31085\n509,31933\n509,32819\n509,34381\n509,34390\n509,36171\n509,36591\n509,36720\n509,38300\n509,38906\n509,38923\n509,40691\n509,41378\n509,41478\n509,41886\n509,42114\n509,45538\n509,45695\n509,46209\n509,46947\n509,47038\n509,47973\n509,47983\n509,47990\n509,47993\n509,47998\n509,49063\n509,49376\n509,49684\n509,49708\n509,50076\n509,50388\n509,50393\n509,50397\n509,50400\n509,50404\n509,50406\n509,50455\n509,50460\n509,50568\n509,50569\n509,52443\n509,53233\n509,55603\n509,59619\n509,61255\n509,66629\n509,68811\n509,71184\n509,78932\n509,79577\n509,82567\n509,83384\n509,86012\n509,87452\n509,91655\n509,97915\n509,98135\n509,99654\n509,100219\n509,107299\n509,116985\n509,117231\n509,122265\n509,125548\n509,127898\n509,127900\n509,129975\n509,131910\n509,132870\n509,133167\n509,134105\n509,136981\n509,138035\n509,140771\n509,142541\n509,143271\n509,150022\n509,150037\n509,150856\n509,154691\n509,155357\n509,160247\n509,162323\n509,163131\n509,163449\n509,163501\n509,163898\n509,164003\n509,164121\n509,165687\n509,165787\n509,168388\n509,168537\n509,170896\n509,177681\n509,180528\n509,181603\n509,181604\n509,189988\n509,190374\n509,199799\n509,212458\n509,213974\n509,215874\n509,218545\n509,221391\n509,227227\n509,236817\n509,240416\n509,250684\n509,253347\n509,261619\n509,261922\n509,262593\n509,263529\n510,3\n510,10\n510,11\n510,32\n510,72\n510,87\n510,97\n510,111\n510,126\n510,140\n510,167\n510,175\n510,178\n510,182\n510,192\n510,211\n510,240\n510,248\n510,264\n510,287\n510,289\n510,290\n510,292\n510,301\n510,302\n510,312\n510,314\n510,327\n510,349\n510,352\n510,358\n510,360\n510,366\n510,388\n510,389\n510,392\n510,397\n510,425\n510,435\n510,441\n510,452\n510,457\n510,467\n510,479\n510,509\n510,510\n510,512\n510,515\n510,516\n510,525\n510,534\n510,535\n510,536\n510,595\n510,599\n510,622\n510,631\n510,663\n510,664\n510,673\n510,676\n510,693\n510,697\n510,723\n510,725\n510,769\n510,770\n510,779\n510,794\n510,795\n510,809\n510,818\n510,822\n510,838\n510,843\n510,849\n510,852\n510,872\n510,875\n510,903\n510,929\n510,972\n510,992\n510,1010\n510,1011\n510,1014\n510,1025\n510,1043\n510,1045\n510,1052\n510,1073\n510,1085\n510,1118\n510,1140\n510,1146\n510,1151\n510,1172\n510,1173\n510,1184\n510,1204\n510,1210\n510,1235\n510,1240\n510,1241\n510,1276\n510,1293\n510,1335\n510,1345\n510,1370\n510,1417\n510,1424\n510,1453\n510,1487\n510,1507\n510,1515\n510,1518\n510,1531\n510,1545\n510,1559\n510,1566\n510,1584\n510,1612\n510,1634\n510,1722\n510,1749\n510,1758\n510,1801\n510,1818\n510,1836\n510,1844\n510,1973\n510,2028\n510,2045\n510,2124\n510,2150\n510,2173\n510,2181\n510,2253\n510,2301\n510,2418\n510,2557\n510,2701\n510,2744\n510,2979\n510,3182\n510,3258\n510,3367\n510,3473\n510,3497\n510,3507\n510,3599\n510,3973\n510,4039\n510,4109\n510,4140\n510,4315\n510,4417\n510,4565\n510,4580\n510,5043\n510,5255\n510,5285\n510,5387\n510,5604\n510,5827\n510,5846\n510,5851\n510,6568\n510,6824\n510,6955\n510,6990\n510,7050\n510,7154\n510,7572\n510,7993\n510,8017\n510,8177\n510,8209\n510,9579\n510,9742\n510,13193\n510,13207\n510,13235\n510,13524\n510,14010\n510,14095\n510,14109\n510,14134\n510,14414\n510,15431\n510,15525\n510,15566\n510,15655\n510,15704\n510,16455\n510,16576\n510,16667\n510,19599\n510,19777\n510,19907\n510,20159\n510,20261\n510,20306\n510,20310\n510,20591\n510,22304\n510,23038\n510,23314\n510,23580\n510,23626\n510,23800\n510,24686\n510,24836\n510,25476\n510,25685\n510,26051\n510,26164\n510,28112\n510,28213\n510,28464\n510,28814\n510,29008\n510,29037\n510,29375\n510,29688\n510,30373\n510,31080\n510,31085\n510,31771\n510,31802\n510,32445\n510,32929\n510,32978\n510,33087\n510,33245\n510,33333\n510,33529\n510,33539\n510,33545\n510,33636\n510,34390\n510,34416\n510,34694\n510,34906\n510,35480\n510,35636\n510,36171\n510,36591\n510,36712\n510,37328\n510,38079\n510,38300\n510,38906\n510,38909\n510,38935\n510,39618\n510,40644\n510,40691\n510,41378\n510,41435\n510,41521\n510,41523\n510,41886\n510,42549\n510,44073\n510,45538\n510,47006\n510,47007\n510,47008\n510,47009\n510,47014\n510,47021\n510,47023\n510,47025\n510,47028\n510,47031\n510,47038\n510,47049\n510,47050\n510,47956\n510,47959\n510,47961\n510,47969\n510,47972\n510,47973\n510,47976\n510,47977\n510,47978\n510,47983\n510,47985\n510,47988\n510,47990\n510,47993\n510,47994\n510,47996\n510,47998\n510,47999\n510,48000\n510,48002\n510,48505\n510,49153\n510,49193\n510,49684\n510,50346\n510,50406\n510,52410\n510,52411\n510,52413\n510,52414\n510,53233\n510,53307\n510,54363\n510,55751\n510,59990\n510,65152\n510,66381\n510,66440\n510,67936\n510,69907\n510,70969\n510,71184\n510,75785\n510,75912\n510,78932\n510,86012\n510,86474\n510,87729\n510,94129\n510,94174\n510,94309\n510,94706\n510,94817\n510,96108\n510,98135\n510,100219\n510,102729\n510,102730\n510,102756\n510,103718\n510,103738\n510,106136\n510,107020\n510,108274\n510,108754\n510,109285\n510,110610\n510,110916\n510,111305\n510,111728\n510,112392\n510,112433\n510,113077\n510,113454\n510,115479\n510,115908\n510,115912\n510,115913\n510,116083\n510,118344\n510,119743\n510,121386\n510,121994\n510,123003\n510,124549\n510,124551\n510,125548\n510,125884\n510,125885\n510,125981\n510,126028\n510,127158\n510,127932\n510,130182\n510,131867\n510,131910\n510,133167\n510,134492\n510,135233\n510,136486\n510,138178\n510,141969\n510,142541\n510,145823\n510,147064\n510,147270\n510,147814\n510,150856\n510,153178\n510,154183\n510,154682\n510,154795\n510,154927\n510,157552\n510,159769\n510,162569\n510,162599\n510,163898\n510,165250\n510,165319\n510,165324\n510,165328\n510,165331\n510,165687\n510,167619\n510,168375\n510,168388\n510,169124\n510,169899\n510,169935\n510,170055\n510,170471\n510,172251\n510,177024\n510,181389\n510,181675\n510,182880\n510,183743\n510,183853\n510,185537\n510,186368\n510,188151\n510,203010\n510,203114\n510,204256\n510,207142\n510,213182\n510,216556\n510,216568\n510,219003\n510,219004\n510,219015\n510,223991\n510,226114\n510,230509\n510,230517\n510,230790\n510,235716\n510,237505\n510,238251\n511,390\n512,10\n512,20\n512,106\n512,175\n512,182\n512,186\n512,222\n512,256\n512,259\n512,299\n512,336\n512,389\n512,397\n512,452\n512,457\n512,499\n512,500\n512,509\n512,510\n512,512\n512,513\n512,533\n512,586\n512,589\n512,599\n512,676\n512,685\n512,693\n512,718\n512,755\n512,808\n512,838\n512,843\n512,894\n512,911\n512,929\n512,972\n512,1087\n512,1096\n512,1118\n512,1141\n512,1149\n512,1191\n512,1417\n512,1434\n512,1531\n512,1566\n512,1696\n512,1795\n512,1848\n512,1926\n512,1992\n512,2112\n512,2167\n512,2253\n512,2382\n512,2460\n512,2874\n512,3202\n512,3972\n512,4006\n512,4028\n512,4276\n512,4466\n512,5022\n512,5193\n512,5222\n512,5226\n512,5352\n512,5422\n512,5506\n512,5641\n512,6405\n512,6432\n512,6652\n512,6695\n512,6760\n512,6837\n512,6998\n512,7731\n512,7754\n512,7769\n512,7770\n512,7771\n512,7954\n512,8116\n512,9457\n512,9736\n512,10639\n512,13205\n512,14054\n512,14098\n512,14258\n512,15454\n512,15691\n512,16128\n512,16217\n512,16285\n512,16533\n512,17573\n512,18112\n512,18133\n512,18298\n512,18330\n512,18485\n512,18498\n512,19493\n512,19561\n512,19668\n512,19776\n512,20269\n512,20272\n512,21226\n512,21283\n512,21494\n512,21997\n512,22006\n512,22046\n512,22047\n512,22072\n512,22092\n512,22108\n512,22148\n512,22245\n512,22274\n512,22319\n512,23740\n512,24262\n512,25666\n512,26031\n512,26033\n512,26126\n512,26127\n512,26312\n512,26976\n512,27175\n512,27639\n512,28152\n512,28291\n512,29165\n512,29557\n512,30318\n512,31013\n512,31021\n512,31376\n512,32498\n512,32499\n512,32501\n512,32502\n512,32838\n512,33268\n512,33552\n512,34714\n512,34832\n512,35315\n512,35473\n512,35476\n512,35477\n512,35492\n512,35495\n512,35506\n512,37002\n512,37423\n512,37435\n512,37526\n512,38302\n512,38312\n512,38322\n512,38352\n512,39285\n512,39454\n512,40455\n512,40458\n512,40580\n512,41299\n512,41337\n512,42903\n512,44064\n512,44272\n512,44828\n512,44853\n512,44859\n512,45038\n512,49373\n512,51954\n512,54306\n512,54352\n512,54371\n512,54420\n512,54481\n512,54928\n512,54963\n512,56412\n512,57065\n512,59597\n512,62748\n512,62938\n512,63591\n512,63699\n512,64469\n512,64845\n512,64847\n512,65617\n512,66243\n512,71935\n512,71991\n512,76048\n512,78902\n512,80610\n512,80611\n512,80612\n512,82608\n512,82824\n512,83224\n512,83816\n512,84494\n512,85742\n512,85752\n512,86254\n512,86445\n512,86631\n512,87327\n512,88321\n512,89574\n512,90662\n512,91170\n512,91231\n512,91394\n512,92000\n512,93032\n512,93606\n512,94046\n512,94069\n512,94722\n512,97373\n512,97392\n512,98884\n512,99532\n512,99557\n512,99763\n512,101116\n512,103689\n512,103897\n512,104378\n512,104390\n512,104913\n512,105494\n512,108452\n512,110051\n512,110063\n512,111126\n512,112222\n512,114570\n512,114613\n512,116588\n512,116614\n512,116877\n512,120961\n512,121037\n512,121529\n512,124704\n512,125006\n512,126034\n512,127638\n512,127647\n512,128708\n512,128825\n512,129802\n512,131835\n512,132854\n512,133368\n512,135270\n512,145078\n512,145390\n512,146253\n512,149318\n512,151040\n512,151989\n512,152532\n512,152766\n512,153130\n512,153230\n512,154765\n512,155003\n512,156379\n512,157721\n512,158979\n512,159341\n512,159682\n512,159689\n512,159756\n512,160319\n512,161518\n512,161550\n512,165807\n512,168258\n512,169815\n512,170648\n512,170685\n512,170691\n512,174277\n512,177772\n512,178551\n512,178702\n512,179048\n512,179194\n512,179221\n512,183268\n512,185266\n512,186681\n512,188591\n512,188606\n512,188756\n512,189251\n512,189650\n512,189696\n512,189725\n512,191784\n512,193571\n512,194312\n512,194930\n512,212897\n512,215416\n512,215831\n512,217557\n512,219803\n512,219837\n512,219858\n512,219950\n512,220341\n512,221078\n512,221744\n512,223794\n512,226183\n512,228305\n512,232629\n512,233999\n512,234182\n512,234183\n512,234186\n512,234187\n512,234188\n512,234191\n512,234193\n512,234194\n512,234195\n512,234200\n512,234201\n512,235869\n512,235870\n512,236789\n512,237313\n512,238740\n512,242246\n512,243291\n512,243493\n512,245221\n512,245380\n512,245410\n512,247084\n512,247086\n512,247148\n512,247663\n512,249050\n512,250535\n512,251280\n512,255135\n512,255728\n512,255731\n512,256160\n512,257969\n512,259415\n512,259475\n512,261925\n512,262312\n513,292\n514,515\n515,58\n515,87\n515,160\n515,192\n515,217\n515,240\n515,420\n515,467\n515,509\n515,510\n515,515\n515,818\n515,872\n515,1033\n515,1043\n515,1147\n515,1417\n515,1449\n515,1722\n515,2292\n515,2443\n515,2889\n515,3538\n515,4039\n515,6695\n515,8180\n516,20\n516,63\n516,68\n516,97\n516,192\n516,202\n516,203\n516,240\n516,251\n516,252\n516,314\n516,316\n516,318\n516,397\n516,406\n516,435\n516,440\n516,452\n516,457\n516,465\n516,467\n516,493\n516,516\n516,517\n516,538\n516,586\n516,599\n516,622\n516,673\n516,733\n516,766\n516,779\n516,794\n516,818\n516,838\n516,841\n516,920\n516,1011\n516,1014\n516,1085\n516,1118\n516,1130\n516,1175\n516,1181\n516,1220\n516,1222\n516,1243\n516,1292\n516,1329\n516,1370\n516,1417\n516,1456\n516,1512\n516,1518\n516,1531\n516,1559\n516,1566\n516,1619\n516,1655\n516,1702\n516,1796\n516,1825\n516,1844\n516,1927\n516,2173\n516,2307\n516,2400\n516,2556\n516,2726\n516,3507\n516,3529\n516,3582\n516,4159\n516,4165\n516,4273\n516,4286\n516,4491\n516,5353\n516,5472\n516,5696\n516,5901\n516,5921\n516,5992\n516,6075\n516,6904\n516,7103\n516,7186\n516,7532\n516,7952\n516,8106\n516,8125\n516,8313\n516,9107\n516,13326\n516,13464\n516,13561\n516,13657\n516,13720\n516,13771\n516,13791\n516,14150\n516,15990\n516,16010\n516,16014\n516,16507\n516,16542\n516,17884\n516,18256\n516,19545\n516,20337\n516,20419\n516,20598\n516,20757\n516,20923\n516,21779\n516,22204\n516,22205\n516,24770\n516,24934\n516,25484\n516,26179\n516,26768\n516,26889\n516,27003\n516,28789\n516,29890\n516,31971\n516,32700\n516,32787\n516,33354\n516,33432\n516,37171\n516,37472\n516,38300\n516,39994\n516,41170\n516,44416\n516,46185\n516,46270\n516,47128\n516,47152\n516,47995\n516,48119\n516,48672\n516,49161\n516,49172\n516,50609\n516,51347\n516,52207\n516,52551\n516,53157\n516,54373\n516,54741\n516,54982\n516,55663\n516,56509\n516,59098\n516,62942\n516,63081\n516,64598\n516,64851\n516,65870\n516,66450\n516,67088\n516,68040\n516,68373\n516,68816\n516,70404\n516,71200\n516,71737\n516,72644\n516,74390\n516,74447\n516,76660\n516,78825\n516,79359\n516,79484\n516,79910\n516,80651\n516,81315\n516,81711\n516,82349\n516,83434\n516,83921\n516,87803\n516,87830\n516,92881\n516,93311\n516,94366\n516,94906\n516,96700\n516,96896\n516,109302\n516,110181\n516,110728\n516,112246\n516,112433\n516,113408\n516,116535\n516,118360\n516,121198\n516,123782\n516,126036\n516,127158\n516,127338\n516,128970\n516,129836\n516,134487\n516,135904\n516,144849\n516,146115\n516,148758\n516,148840\n516,152018\n516,158616\n516,163898\n516,164225\n516,167032\n516,170804\n516,170812\n516,177500\n516,177708\n516,177904\n516,183937\n516,185084\n516,187118\n516,187283\n516,189788\n516,189794\n516,189842\n516,193314\n516,196071\n516,196137\n516,201102\n516,201922\n516,202497\n516,204280\n516,204524\n516,205081\n516,214174\n516,215276\n516,216181\n516,217693\n516,217897\n516,219894\n516,222047\n516,222429\n516,226246\n516,229364\n516,230367\n516,231754\n516,231777\n516,232131\n516,234674\n516,236864\n516,248916\n516,251255\n516,254180\n516,254630\n516,256161\n516,256495\n516,258024\n516,258103\n516,258710\n516,260372\n516,264355\n517,516\n517,1655\n518,37\n518,102\n518,106\n518,186\n518,292\n518,304\n518,372\n518,408\n518,431\n518,444\n518,518\n518,519\n518,534\n518,567\n518,615\n518,626\n518,693\n518,775\n518,911\n518,1113\n518,1133\n518,1194\n518,1262\n518,1268\n518,1323\n518,1326\n518,1411\n518,1545\n518,1599\n518,1635\n518,1732\n518,1849\n518,1879\n518,1955\n518,1973\n518,2443\n518,2509\n518,2747\n518,3048\n518,3166\n518,3193\n518,3407\n518,3504\n518,3694\n518,3718\n518,3804\n518,3940\n518,4222\n518,4600\n518,5129\n518,5130\n518,5268\n518,5385\n518,5388\n518,5400\n518,5623\n518,6396\n518,6400\n518,6470\n518,6638\n518,6853\n518,6880\n518,6904\n518,7840\n518,7959\n518,7985\n518,8088\n518,8104\n518,8276\n518,9674\n518,9681\n518,13274\n518,13399\n518,13521\n518,13580\n518,14000\n518,14572\n518,14644\n518,14754\n518,15109\n518,16151\n518,17607\n518,19367\n518,20350\n518,20663\n518,22293\n518,22440\n518,23526\n518,24924\n518,25337\n518,28786\n518,31117\n518,31301\n518,31731\n518,32516\n518,34014\n518,34739\n518,34767\n518,35095\n518,35948\n518,36601\n518,36602\n518,36981\n518,37332\n518,37476\n518,38957\n518,39232\n518,43751\n518,45823\n518,46165\n518,46796\n518,47114\n518,48006\n518,48505\n518,54504\n518,56456\n518,59231\n518,63583\n518,64130\n518,68026\n518,68027\n518,68913\n518,70165\n518,70578\n518,75264\n518,76008\n518,77109\n518,79869\n518,80009\n518,80980\n518,82685\n518,82782\n518,83218\n518,84860\n518,87871\n518,88120\n518,88355\n518,90149\n518,90347\n518,101776\n518,102186\n518,103309\n518,106976\n518,110011\n518,110763\n518,113451\n518,118318\n518,121366\n518,127645\n518,128703\n518,130700\n518,133566\n518,133984\n518,136054\n518,140631\n518,140634\n518,142916\n518,150747\n518,156540\n518,158707\n518,163805\n518,165077\n518,168327\n518,169811\n518,171367\n518,176024\n518,180339\n518,182819\n518,185414\n518,185987\n518,196693\n518,221065\n518,222613\n518,225762\n518,232222\n518,242324\n518,263406\n520,518\n521,415\n522,167\n522,390\n522,745\n522,783\n522,1436\n522,1544\n522,3218\n522,4411\n522,5662\n524,312\n524,525\n525,301\n525,358\n525,510\n525,1973\n525,3804\n526,527\n527,740\n527,741\n527,743\n527,4810\n527,8714\n527,21059\n527,95152\n527,151861\n528,151\n528,299\n528,832\n528,1241\n528,1319\n529,83\n529,233\n529,3209\n530,531\n530,115511\n532,187\n533,292\n534,10\n534,41\n534,46\n534,58\n534,298\n534,314\n534,390\n534,397\n534,406\n534,417\n534,431\n534,444\n534,452\n534,457\n534,535\n534,573\n534,589\n534,599\n534,604\n534,631\n534,632\n534,676\n534,677\n534,720\n534,784\n534,821\n534,849\n534,862\n534,968\n534,1001\n534,1010\n534,1014\n534,1085\n534,1118\n534,1119\n534,1128\n534,1195\n534,1284\n534,1445\n534,1459\n534,1462\n534,1566\n534,1572\n534,1580\n534,1796\n534,1962\n534,2008\n534,2296\n534,2512\n534,2562\n534,2572\n534,2995\n534,3833\n534,3841\n534,3925\n534,3944\n534,4022\n534,4066\n534,4222\n534,4434\n534,6068\n534,6087\n534,8261\n534,8537\n534,9346\n534,13173\n534,13358\n534,13412\n534,13524\n534,14007\n534,14011\n534,14236\n534,14319\n534,15290\n534,16141\n534,17116\n534,18463\n534,18482\n534,19061\n534,19423\n534,19560\n534,20504\n534,21742\n534,26450\n534,28832\n534,29866\n534,31756\n534,32584\n534,34876\n534,34879\n534,36633\n534,36646\n534,40936\n534,42928\n534,44725\n534,45427\n534,51972\n534,54474\n534,75912\n534,121863\n534,235807\n535,10\n535,126\n535,202\n535,207\n535,240\n535,248\n535,292\n535,299\n535,336\n535,338\n535,392\n535,397\n535,441\n535,452\n535,455\n535,457\n535,467\n535,479\n535,534\n535,535\n535,536\n535,592\n535,604\n535,631\n535,676\n535,693\n535,733\n535,801\n535,808\n535,818\n535,843\n535,849\n535,868\n535,872\n535,900\n535,911\n535,918\n535,919\n535,972\n535,1011\n535,1058\n535,1085\n535,1118\n535,1133\n535,1151\n535,1210\n535,1240\n535,1355\n535,1417\n535,1445\n535,1453\n535,1454\n535,1533\n535,1566\n535,1572\n535,1845\n535,2418\n535,2511\n535,2512\n535,3524\n535,3582\n535,3750\n535,4125\n535,4140\n535,5213\n535,5851\n535,6452\n535,6695\n535,6904\n535,7891\n535,8241\n535,8442\n535,14147\n535,14163\n535,14727\n535,15290\n535,15609\n535,15612\n535,16362\n535,16565\n535,17116\n535,18442\n535,19413\n535,19512\n535,20757\n535,20985\n535,21184\n535,22045\n535,22168\n535,23669\n535,26385\n535,26816\n535,28348\n535,31267\n535,33650\n535,33991\n535,34876\n535,37413\n535,75912\n535,76086\n535,76971\n535,82568\n535,93711\n535,109030\n535,112439\n535,127158\n535,161637\n535,173297\n535,175313\n535,223738\n535,226454\n535,227441\n535,231613\n535,232830\n535,235544\n535,236687\n535,242354\n535,248643\n535,250754\n535,258264\n536,34\n536,35\n536,83\n536,186\n536,192\n536,217\n536,222\n536,240\n536,256\n536,278\n536,283\n536,313\n536,314\n536,332\n536,379\n536,385\n536,389\n536,399\n536,440\n536,452\n536,455\n536,457\n536,466\n536,467\n536,477\n536,495\n536,536\n536,589\n536,599\n536,657\n536,781\n536,794\n536,818\n536,838\n536,849\n536,852\n536,872\n536,891\n536,927\n536,949\n536,951\n536,1001\n536,1011\n536,1014\n536,1019\n536,1072\n536,1085\n536,1118\n536,1192\n536,1201\n536,1208\n536,1274\n536,1299\n536,1417\n536,1522\n536,1566\n536,1617\n536,1724\n536,1843\n536,1844\n536,1853\n536,1860\n536,1881\n536,1916\n536,2159\n536,2235\n536,2266\n536,2290\n536,2318\n536,2319\n536,2341\n536,2373\n536,2380\n536,2441\n536,2507\n536,2553\n536,2784\n536,2821\n536,2853\n536,2944\n536,2963\n536,3016\n536,3297\n536,3836\n536,3853\n536,4030\n536,4039\n536,4048\n536,4109\n536,4570\n536,4787\n536,5208\n536,5326\n536,5458\n536,6012\n536,6064\n536,6085\n536,6526\n536,6532\n536,6754\n536,6799\n536,6904\n536,6940\n536,6955\n536,6997\n536,7346\n536,7698\n536,7766\n536,7944\n536,8535\n536,8703\n536,13198\n536,13328\n536,13389\n536,13622\n536,14094\n536,14246\n536,14346\n536,14369\n536,14612\n536,14742\n536,14993\n536,15017\n536,15197\n536,15884\n536,15892\n536,15931\n536,16051\n536,16357\n536,16639\n536,16760\n536,18142\n536,18248\n536,18337\n536,18388\n536,18831\n536,18832\n536,18865\n536,19008\n536,19509\n536,19823\n536,19834\n536,20201\n536,20399\n536,20875\n536,21015\n536,21249\n536,21488\n536,21563\n536,21583\n536,22290\n536,23052\n536,23287\n536,23407\n536,23550\n536,23839\n536,24885\n536,26056\n536,26341\n536,26905\n536,28130\n536,28140\n536,28600\n536,29357\n536,29595\n536,29938\n536,29940\n536,30502\n536,30601\n536,30617\n536,30702\n536,30709\n536,30711\n536,30721\n536,30735\n536,30736\n536,31360\n536,31675\n536,31729\n536,32347\n536,32447\n536,32820\n536,33374\n536,33376\n536,34281\n536,34283\n536,34287\n536,34363\n536,34849\n536,34864\n536,35899\n536,36815\n536,36834\n536,36849\n536,36855\n536,37065\n536,37110\n536,38030\n536,38203\n536,38251\n536,38966\n536,39480\n536,39537\n536,39561\n536,39737\n536,39841\n536,40099\n536,40669\n536,40790\n536,41025\n536,41653\n536,42742\n536,43339\n536,44787\n536,44972\n536,45267\n536,46343\n536,46748\n536,48034\n536,48082\n536,48193\n536,48208\n536,48427\n536,48527\n536,49113\n536,49262\n536,49642\n536,49655\n536,50018\n536,53525\n536,53927\n536,56040\n536,56267\n536,56584\n536,57187\n536,58048\n536,59344\n536,59705\n536,59788\n536,59793\n536,59799\n536,59805\n536,59809\n536,59810\n536,59814\n536,59819\n536,59958\n536,60557\n536,60665\n536,60752\n536,61094\n536,61121\n536,62350\n536,62383\n536,62539\n536,62600\n536,63519\n536,63615\n536,64269\n536,64714\n536,65892\n536,66123\n536,66703\n536,66765\n536,66805\n536,68227\n536,68975\n536,69882\n536,71161\n536,71181\n536,73867\n536,80201\n536,80335\n536,80425\n536,82176\n536,82351\n536,82570\n536,85998\n536,86767\n536,87372\n536,90800\n536,91146\n536,91340\n536,91417\n536,91522\n536,91828\n536,91890\n536,93249\n536,96266\n536,97326\n536,97825\n536,97987\n536,99736\n536,100984\n536,102167\n536,105669\n536,105719\n536,106104\n536,106246\n536,107194\n536,107720\n536,109059\n536,109352\n536,109681\n536,109706\n536,112580\n536,112964\n536,113124\n536,113152\n536,114166\n536,114456\n536,115389\n536,115474\n536,115503\n536,116549\n536,117213\n536,117480\n536,117780\n536,117817\n536,118168\n536,118835\n536,119581\n536,119589\n536,120061\n536,120449\n536,120759\n536,121132\n536,121149\n536,121160\n536,121751\n536,122035\n536,122127\n536,122173\n536,124368\n536,124593\n536,124604\n536,124639\n536,125162\n536,125980\n536,127158\n536,128273\n536,131359\n536,132868\n536,133452\n536,134168\n536,134249\n536,134267\n536,135040\n536,136496\n536,137274\n536,138016\n536,138372\n536,138720\n536,138877\n536,139850\n536,142036\n536,142552\n536,142573\n536,143511\n536,143513\n536,144121\n536,146093\n536,147608\n536,149115\n536,149228\n536,149463\n536,150470\n536,152685\n536,155381\n536,156700\n536,156920\n536,156936\n536,156949\n536,157487\n536,157839\n536,157907\n536,158212\n536,158246\n536,160436\n536,161994\n536,163038\n536,163444\n536,163823\n536,163880\n536,163898\n536,166094\n536,169743\n536,171933\n536,172657\n536,172723\n536,173547\n536,174464\n536,175235\n536,175738\n536,177805\n536,177839\n536,177863\n536,179716\n536,180036\n536,180150\n536,180557\n536,181063\n536,181989\n536,182379\n536,182524\n536,182558\n536,182860\n536,183765\n536,185745\n536,186193\n536,186578\n536,187909\n536,187912\n536,187915\n536,188323\n536,188410\n536,188685\n536,188711\n536,188715\n536,188717\n536,188719\n536,188726\n536,189124\n536,189185\n536,189312\n536,189329\n536,189335\n536,189336\n536,189340\n536,189346\n536,189351\n536,189363\n536,189426\n536,189574\n536,190139\n536,191943\n536,192007\n536,192214\n536,192678\n536,194605\n536,194903\n536,195154\n536,198176\n536,211922\n536,215269\n536,216390\n536,216581\n536,216739\n536,216749\n536,216754\n536,217618\n536,217626\n536,217638\n536,217643\n536,217646\n536,217656\n536,217941\n536,217945\n536,217948\n536,217951\n536,217953\n536,217957\n536,217962\n536,218006\n536,218086\n536,218088\n536,218106\n536,220936\n536,221547\n536,227377\n536,228300\n536,229004\n536,229861\n536,232679\n536,232697\n536,233631\n536,233682\n536,236051\n536,237592\n536,243077\n536,243369\n536,243547\n536,245047\n536,245993\n536,247366\n536,248055\n536,248691\n536,249055\n536,250675\n536,250783\n536,251191\n536,253979\n536,256168\n536,258720\n536,259580\n536,260786\n536,263384\n537,134\n537,313\n537,431\n537,455\n538,20\n538,178\n538,186\n538,259\n538,272\n538,314\n538,315\n538,346\n538,435\n538,439\n538,440\n538,447\n538,467\n538,538\n538,599\n538,671\n538,673\n538,766\n538,794\n538,868\n538,934\n538,939\n538,996\n538,1033\n538,1068\n538,1130\n538,1262\n538,1294\n538,1590\n538,1611\n538,1612\n538,1619\n538,1651\n538,1877\n538,1973\n538,1987\n538,2085\n538,2094\n538,2106\n538,2353\n538,2540\n538,3626\n538,3744\n538,3900\n538,4137\n538,4455\n538,4646\n538,5461\n538,5961\n538,6422\n538,6586\n538,6622\n538,6637\n538,6648\n538,6717\n538,6765\n538,8157\n538,14232\n538,14422\n538,15563\n538,17421\n538,17422\n538,17423\n538,17425\n538,17426\n538,17432\n538,18124\n538,18249\n538,19651\n538,22221\n538,25575\n538,29116\n538,29870\n538,31206\n538,32468\n538,32569\n538,35572\n538,38393\n538,38948\n538,41378\n538,41504\n538,42166\n538,42785\n538,44243\n538,48864\n538,49381\n538,52325\n538,52437\n538,54552\n538,55105\n538,55668\n538,56008\n538,58295\n538,59020\n538,61089\n538,61670\n538,63735\n538,63943\n538,63949\n538,66250\n538,67047\n538,68373\n538,81061\n538,87141\n538,89578\n538,89752\n538,93005\n538,94287\n538,96694\n538,99055\n538,99689\n538,103272\n538,103291\n538,103772\n538,114282\n538,120052\n538,120155\n538,120826\n538,121505\n538,127872\n538,128831\n538,132436\n538,133112\n538,140902\n538,141780\n538,145088\n538,145968\n538,145979\n538,146647\n538,147496\n538,154413\n538,156379\n538,163378\n538,175970\n538,176520\n538,176628\n538,179872\n538,188523\n538,190492\n538,191330\n538,222354\n538,241266\n538,252022\n538,253099\n538,261314\n538,263304\n539,104\n539,134\n539,135\n539,137\n540,541\n542,543\n544,34\n544,35\n544,222\n544,545\n544,4377\n544,5342\n544,5343\n544,5899\n544,16410\n544,21900\n544,28533\n544,28959\n544,40148\n544,43789\n544,44907\n546,547\n548,549\n550,551\n552,553\n554,555\n556,557\n557,104\n557,107\n557,135\n557,136\n557,137\n557,138\n557,225\n557,248\n557,254\n557,332\n557,557\n557,612\n557,636\n557,685\n557,715\n557,784\n557,850\n557,852\n557,953\n557,954\n557,1262\n557,1282\n557,1332\n557,1368\n557,1415\n557,1572\n557,1585\n557,1690\n557,1844\n557,1939\n557,1962\n557,2105\n557,2237\n557,2600\n557,2701\n557,2794\n557,2934\n557,3473\n557,3930\n557,4276\n557,4674\n557,5307\n557,5405\n557,5622\n557,5830\n557,6023\n557,6136\n557,6455\n557,6530\n557,6674\n557,7757\n557,10318\n557,13207\n557,13530\n557,14196\n557,15782\n557,15984\n557,16321\n557,16552\n557,17214\n557,17217\n557,17935\n557,18673\n557,18965\n557,20717\n557,20741\n557,22405\n557,23611\n557,23654\n557,24739\n557,24774\n557,25015\n557,25338\n557,25520\n557,26293\n557,26842\n557,28191\n557,28194\n557,29946\n557,31334\n557,32313\n557,32459\n557,32778\n557,35614\n557,38822\n557,40220\n557,40259\n557,46874\n557,48349\n557,48599\n557,49526\n557,49663\n557,50269\n557,54307\n557,54477\n557,56310\n557,56529\n557,56659\n557,57235\n557,58715\n557,59792\n557,60095\n557,60672\n557,63744\n557,66301\n557,72017\n557,74387\n557,74417\n557,75045\n557,76764\n557,76939\n557,80156\n557,90903\n557,98218\n557,117741\n557,118260\n557,119105\n557,127804\n557,130466\n557,131339\n557,134270\n557,134281\n557,138067\n557,138675\n557,138676\n557,138680\n557,138681\n557,138684\n557,138685\n557,140005\n557,142335\n557,146467\n557,148500\n557,157206\n557,158257\n557,158579\n557,159616\n557,160720\n557,162750\n557,163014\n557,163017\n557,163756\n557,164287\n557,165399\n557,165432\n557,166402\n557,167581\n557,167746\n557,167799\n557,168935\n557,169440\n557,169598\n557,172272\n557,173786\n557,173967\n557,174457\n557,176432\n557,176442\n557,176448\n557,176518\n557,176531\n557,176532\n557,176765\n557,176768\n557,176982\n557,177025\n557,178808\n557,179250\n557,179353\n557,180309\n557,185299\n557,190276\n558,559\n560,561\n562,10\n562,44\n562,50\n562,56\n562,79\n562,146\n562,147\n562,158\n562,178\n562,182\n562,192\n562,195\n562,206\n562,222\n562,256\n562,285\n562,333\n562,406\n562,422\n562,434\n562,435\n562,439\n562,447\n562,535\n562,538\n562,563\n562,585\n562,602\n562,620\n562,622\n562,638\n562,640\n562,671\n562,704\n562,766\n562,779\n562,841\n562,920\n562,939\n562,972\n562,1089\n562,1181\n562,1230\n562,1247\n562,1285\n562,1294\n562,1366\n562,1414\n562,1425\n562,1464\n562,1502\n562,1515\n562,1568\n562,1619\n562,1623\n562,1651\n562,1773\n562,1825\n562,1844\n562,1905\n562,1906\n562,1909\n562,1910\n562,1995\n562,2085\n562,2094\n562,2102\n562,2132\n562,2161\n562,2244\n562,2352\n562,2374\n562,2880\n562,2903\n562,2931\n562,3241\n562,3370\n562,3449\n562,3994\n562,4310\n562,4324\n562,4646\n562,5100\n562,5357\n562,5495\n562,5874\n562,6119\n562,6531\n562,6586\n562,6622\n562,6680\n562,7532\n562,7794\n562,8067\n562,8244\n562,8270\n562,8426\n562,8477\n562,8771\n562,8868\n562,9171\n562,9371\n562,9394\n562,12724\n562,13270\n562,13464\n562,13687\n562,14226\n562,14433\n562,14453\n562,14637\n562,15330\n562,15980\n562,17151\n562,17166\n562,17421\n562,17422\n562,17423\n562,17424\n562,17425\n562,17426\n562,17427\n562,17428\n562,17429\n562,17430\n562,17431\n562,17432\n562,18640\n562,18997\n562,19025\n562,20540\n562,21487\n562,21528\n562,21687\n562,24648\n562,24783\n562,25348\n562,26972\n562,27495\n562,29649\n562,31094\n562,31582\n562,31585\n562,31994\n562,32168\n562,32724\n562,33991\n562,34554\n562,35614\n562,36350\n562,36408\n562,36409\n562,36410\n562,36411\n562,36412\n562,36413\n562,36414\n562,36415\n562,36416\n562,36417\n562,36418\n562,36419\n562,36420\n562,36421\n562,36422\n562,36423\n562,36424\n562,36425\n562,36426\n562,36427\n562,36428\n562,36429\n562,36430\n562,36431\n562,36432\n562,36433\n562,36434\n562,36435\n562,36436\n562,36437\n562,36438\n562,36439\n562,36440\n562,36441\n562,36442\n562,36443\n562,36444\n562,36445\n562,36446\n562,36447\n562,36448\n562,36449\n562,36450\n562,36451\n562,36452\n562,36453\n562,36454\n562,36455\n562,36456\n562,36457\n562,36458\n562,36459\n562,36460\n562,36461\n562,36462\n562,36463\n562,36464\n562,36465\n562,36466\n562,36467\n562,36468\n562,36469\n562,36470\n562,36471\n562,36472\n562,36473\n562,36474\n562,36475\n562,36476\n562,36477\n562,36478\n562,36479\n562,36480\n562,36481\n562,36482\n562,36483\n562,36484\n562,36485\n562,36486\n562,36487\n562,36488\n562,36489\n562,36490\n562,36491\n562,36492\n562,36493\n562,36494\n562,36495\n562,36496\n562,36497\n562,36498\n562,36499\n562,36500\n562,36501\n562,36502\n562,36503\n562,36504\n562,36505\n562,36506\n562,36507\n562,36508\n562,36509\n562,36510\n562,36511\n562,36512\n562,36513\n562,36514\n562,36515\n562,36516\n562,36517\n562,36518\n562,36519\n562,36520\n562,36521\n562,36522\n562,36523\n562,36524\n562,36525\n562,36526\n562,36527\n562,36528\n562,36529\n562,36530\n562,36531\n562,36532\n562,36533\n562,36534\n562,36535\n562,36536\n562,36537\n562,36538\n562,36539\n562,36540\n562,36542\n562,36543\n562,36544\n562,36545\n562,36546\n562,36547\n562,36548\n562,36549\n562,36550\n562,36551\n562,36552\n562,36553\n562,36554\n562,36555\n562,36556\n562,36557\n562,36558\n562,36559\n562,36560\n562,36561\n562,36562\n562,36563\n562,36564\n562,36565\n562,36566\n562,43613\n562,92476\n563,86\n563,97\n563,167\n563,255\n563,256\n563,301\n563,356\n563,446\n563,450\n563,563\n563,567\n563,609\n563,668\n563,693\n563,750\n563,818\n563,904\n563,941\n563,972\n563,1118\n563,1133\n563,1284\n563,1298\n563,1522\n563,1559\n563,1837\n563,2372\n563,2373\n563,2513\n563,3003\n563,3666\n563,3667\n563,14633\n563,19441\n563,22174\n563,26876\n563,28201\n563,30328\n563,30390\n563,31595\n563,34724\n563,35517\n563,41160\n563,44716\n563,67995\n563,72726\n563,82119\n563,91234\n563,96680\n563,98873\n563,101757\n563,103081\n563,103891\n563,104427\n563,104549\n563,109933\n563,134085\n563,171223\n563,179752\n563,192430\n563,193496\n563,220057\n563,226496\n563,261803\n564,10\n564,565\n564,1190\n566,10\n566,52\n566,175\n566,693\n566,177483\n567,37\n567,46\n567,192\n567,256\n567,301\n567,444\n567,452\n567,457\n567,481\n567,505\n567,518\n567,563\n567,567\n567,604\n567,605\n567,615\n567,663\n567,664\n567,665\n567,668\n567,676\n567,698\n567,717\n567,762\n567,783\n567,812\n567,849\n567,877\n567,900\n567,937\n567,941\n567,968\n567,972\n567,1026\n567,1160\n567,1167\n567,1231\n567,1284\n567,1293\n567,1300\n567,1436\n567,1544\n567,1564\n567,1740\n567,1782\n567,1837\n567,2217\n567,2372\n567,2557\n567,2595\n567,2979\n567,3392\n567,3422\n567,3564\n567,3582\n567,3756\n567,3900\n567,4190\n567,5213\n567,5540\n567,5662\n567,6552\n567,7031\n567,7986\n567,9340\n567,9457\n567,13418\n567,13991\n567,14311\n567,14674\n567,15633\n567,18093\n567,18162\n567,18526\n567,22168\n567,23597\n567,24612\n567,24615\n567,24802\n567,25243\n567,25273\n567,25282\n567,29579\n567,33479\n567,34129\n567,35505\n567,36745\n567,37679\n567,38082\n567,38349\n567,39730\n567,39930\n567,41198\n567,41821\n567,42789\n567,45195\n567,46996\n567,48017\n567,62439\n567,63491\n567,79942\n567,82206\n567,90254\n567,94845\n567,102695\n567,103860\n567,104246\n567,107521\n567,112033\n567,112950\n567,118843\n567,119808\n567,121954\n567,130442\n567,133593\n567,134098\n567,142479\n567,145952\n567,165363\n567,166328\n567,168756\n567,186622\n567,211904\n567,216540\n567,221730\n567,245950\n567,249717\n567,255572\n567,263043\n568,444\n569,301\n569,444\n569,459\n569,968\n570,571\n571,79\n571,252\n571,272\n571,278\n571,302\n571,349\n571,388\n571,392\n571,422\n571,432\n571,433\n571,434\n571,435\n571,516\n571,536\n571,571\n571,689\n571,765\n571,868\n571,1010\n571,1210\n571,1264\n571,1326\n571,1373\n571,1401\n571,1494\n571,1568\n571,1693\n571,1837\n571,1968\n571,2094\n571,2400\n571,2470\n571,2567\n571,2585\n571,2840\n571,3241\n571,3866\n571,4205\n571,4455\n571,6470\n571,6742\n571,6760\n571,6761\n571,6925\n571,7897\n571,8576\n571,8606\n571,9527\n571,13130\n571,13188\n571,13233\n571,13260\n571,13320\n571,13430\n571,13519\n571,14064\n571,14158\n571,14304\n571,15525\n571,16500\n571,16638\n571,18110\n571,18200\n571,18201\n571,18202\n571,18203\n571,18204\n571,18205\n571,18206\n571,18207\n571,18208\n571,18209\n571,18210\n571,18211\n571,18212\n571,18213\n571,18214\n571,18215\n571,18216\n571,18217\n571,18218\n571,18219\n571,18220\n571,18221\n571,18222\n571,18223\n571,18224\n571,18225\n571,18226\n571,18227\n571,18228\n571,18229\n571,18230\n571,18231\n571,18232\n571,18233\n571,18234\n571,18235\n571,18236\n571,18237\n571,18238\n571,18239\n571,18240\n571,18241\n571,18242\n571,18243\n571,18244\n571,18245\n571,18246\n571,18247\n571,18248\n571,18249\n571,18250\n571,18251\n571,18252\n571,18253\n571,18254\n571,18255\n571,18256\n571,18257\n571,18258\n571,18259\n571,18260\n571,18261\n571,18262\n571,18263\n571,18264\n571,18265\n571,18266\n571,18267\n571,18268\n571,18269\n571,18270\n571,18271\n571,18272\n571,18273\n571,18274\n571,18275\n571,18276\n571,18277\n571,18278\n571,18279\n571,18280\n571,18281\n571,18282\n571,18283\n571,18284\n571,18285\n571,18286\n571,18287\n571,18288\n571,18289\n571,18290\n571,18291\n571,18292\n571,18293\n571,18294\n571,18295\n571,18296\n571,18301\n571,18302\n571,18303\n571,18304\n571,18305\n571,18306\n571,18307\n571,18308\n571,18309\n571,18310\n571,18311\n571,18312\n571,18314\n571,18315\n571,18316\n571,18317\n571,18318\n571,18319\n571,18321\n571,18322\n571,18323\n571,18324\n571,18325\n571,18326\n571,18329\n571,18331\n571,18332\n571,18333\n571,18334\n571,18335\n571,18336\n571,18350\n571,18354\n571,18356\n571,18357\n571,18358\n571,18359\n571,18360\n571,18361\n571,18362\n571,18363\n571,18364\n571,18365\n571,18366\n571,18367\n571,18368\n571,18369\n571,18370\n571,18371\n571,18372\n571,18373\n571,18374\n571,18375\n571,18376\n571,18377\n571,18378\n571,18380\n571,18381\n571,18382\n571,18383\n571,18384\n571,18385\n571,18387\n571,18388\n571,18389\n571,18390\n571,18391\n571,18392\n571,18393\n571,18395\n571,18396\n571,18397\n571,18398\n571,18399\n571,18400\n571,18401\n571,18403\n571,18404\n571,18405\n571,18406\n571,18411\n571,18412\n571,18413\n571,18414\n571,18418\n571,18419\n571,18420\n571,18421\n571,18423\n571,18430\n571,18431\n571,18432\n571,18433\n571,18436\n571,18437\n571,18438\n571,18731\n571,21409\n571,23296\n571,23643\n571,29102\n571,33991\n571,35004\n571,36643\n571,36671\n571,36679\n571,36682\n571,36683\n571,36729\n571,36789\n571,36939\n571,37572\n571,37900\n571,38432\n571,41170\n571,43366\n571,44933\n571,48413\n571,57800\n571,58420\n571,62172\n571,63184\n571,63568\n571,64069\n571,64637\n571,66507\n571,68627\n571,69947\n571,70169\n571,70205\n571,70847\n571,71647\n571,71649\n571,75315\n571,85771\n571,85772\n571,85773\n571,85774\n571,85979\n571,109343\n571,109353\n571,109355\n571,110075\n571,116399\n571,117889\n571,118454\n571,124386\n571,130248\n571,137412\n571,137552\n571,137681\n571,143466\n571,143468\n571,154791\n571,156601\n571,156602\n571,156603\n571,156604\n571,156605\n571,156606\n571,156607\n571,156608\n571,156609\n571,156610\n571,156611\n571,156612\n571,156613\n571,156619\n571,156624\n571,160897\n571,161942\n571,162599\n571,163320\n571,163321\n571,164220\n571,164224\n571,165879\n571,167043\n571,172727\n571,173878\n571,176086\n571,177246\n571,180347\n571,186555\n571,189196\n571,207035\n571,214077\n571,223822\n571,223854\n571,223860\n571,227013\n571,232714\n571,251470\n571,258355\n571,260281\n571,260282\n571,260283\n571,260291\n572,104\n572,111\n572,312\n572,372\n572,441\n572,442\n572,518\n572,631\n572,676\n572,714\n572,720\n572,801\n572,805\n572,1014\n572,1140\n572,1287\n572,1659\n572,2443\n572,3474\n572,3507\n572,4771\n572,5547\n573,41\n573,137\n573,390\n573,534\n573,535\n573,573\n573,588\n573,589\n573,590\n573,626\n573,784\n573,862\n573,966\n573,1119\n573,1192\n573,1195\n573,1505\n573,1580\n573,2296\n573,2490\n573,2572\n573,2747\n573,4222\n573,5340\n573,5614\n573,5828\n573,5981\n573,6000\n573,6001\n573,6692\n573,7194\n573,13198\n573,15622\n573,16175\n573,16245\n573,16510\n573,20592\n573,26130\n573,26475\n573,27132\n573,29595\n573,29872\n573,30376\n573,31106\n573,32526\n573,34055\n573,36429\n573,36761\n573,37171\n573,42841\n573,50494\n573,50857\n573,55713\n573,63906\n573,72563\n573,75912\n573,82768\n573,84658\n573,87324\n573,87715\n573,87891\n573,90906\n573,90937\n573,94127\n573,94202\n573,94338\n573,98263\n573,98925\n573,105327\n573,107024\n573,115699\n573,119265\n573,131045\n573,131252\n573,131386\n573,134576\n573,137209\n573,138127\n573,139760\n573,139963\n573,140175\n573,141858\n573,142741\n573,147394\n573,168973\n573,168992\n573,169040\n573,192924\n573,192925\n573,192926\n573,221293\n573,243391\n573,243556\n574,575\n575,87\n575,256\n575,599\n575,685\n575,852\n575,875\n575,1043\n575,1732\n575,1973\n575,2253\n575,2775\n576,577\n577,259\n577,272\n577,393\n577,397\n577,439\n577,446\n577,577\n577,676\n577,685\n577,715\n577,726\n577,788\n577,818\n577,852\n577,859\n577,863\n577,902\n577,980\n577,1011\n577,1014\n577,1070\n577,1105\n577,1130\n577,1208\n577,1417\n577,1429\n577,1474\n577,1531\n577,1566\n577,2049\n577,2110\n577,2178\n577,2307\n577,2362\n577,3490\n577,3514\n577,3669\n577,3937\n577,3938\n577,4091\n577,4137\n577,4159\n577,4297\n577,4299\n577,4380\n577,4545\n577,4667\n577,4692\n577,5128\n577,5241\n577,5279\n577,5690\n577,5809\n577,6381\n577,6475\n577,6477\n577,6795\n577,6796\n577,6932\n577,7076\n577,7091\n577,7125\n577,7468\n577,7944\n577,8250\n577,8397\n577,9579\n577,9614\n577,13332\n577,13466\n577,13566\n577,14089\n577,14202\n577,14232\n577,14358\n577,16669\n577,17116\n577,17563\n577,18436\n577,18445\n577,18502\n577,18658\n577,18769\n577,18807\n577,19278\n577,19279\n577,19693\n577,20686\n577,20862\n577,21286\n577,21769\n577,22835\n577,23045\n577,23236\n577,24533\n577,24934\n577,26034\n577,26233\n577,26489\n577,26778\n577,26786\n577,28010\n577,28312\n577,29963\n577,30556\n577,32366\n577,33728\n577,33985\n577,37737\n577,40720\n577,41316\n577,41402\n577,41671\n577,43443\n577,44406\n577,45213\n577,47131\n577,48078\n577,48280\n577,50690\n577,51948\n577,54186\n577,54493\n577,55174\n577,56150\n577,56316\n577,56423\n577,56544\n577,57143\n577,57861\n577,59062\n577,59636\n577,60777\n577,63200\n577,63518\n577,64767\n577,65725\n577,66543\n577,67395\n577,70443\n577,71108\n577,72100\n577,74454\n577,75279\n577,75295\n577,76174\n577,78029\n577,79003\n577,79186\n577,79367\n577,79474\n577,79591\n577,80111\n577,81142\n577,81786\n577,83695\n577,84180\n577,84465\n577,84474\n577,85460\n577,87887\n577,89341\n577,89449\n577,89558\n577,90081\n577,93498\n577,93758\n577,102585\n577,102766\n577,106868\n577,107603\n577,109352\n577,110624\n577,112433\n577,113943\n577,114282\n577,117480\n577,122101\n577,124972\n577,125899\n577,126735\n577,127158\n577,127299\n577,129823\n577,129951\n577,130943\n577,133194\n577,133387\n577,133402\n577,134290\n577,134360\n577,135086\n577,135087\n577,138280\n577,138686\n577,138833\n577,139010\n577,143358\n577,143376\n577,143479\n577,144806\n577,145399\n577,145884\n577,145887\n577,146464\n577,146545\n577,146763\n577,148307\n577,148311\n577,148865\n577,150079\n577,150403\n577,151463\n577,152419\n577,152448\n577,152818\n577,155309\n577,156165\n577,156911\n577,157585\n577,158334\n577,158453\n577,161054\n577,162605\n577,166264\n577,169024\n577,169524\n577,169527\n577,169541\n577,171561\n577,174142\n577,174645\n577,175295\n577,176020\n577,180030\n577,182004\n577,182479\n577,182839\n577,183021\n577,183056\n577,183411\n577,183658\n577,185550\n577,186243\n577,186746\n577,186776\n577,186881\n577,186902\n577,187190\n577,188123\n577,190496\n577,190756\n577,192522\n577,192769\n577,193107\n577,193154\n577,193578\n577,194578\n577,200665\n577,200832\n577,203810\n577,205917\n577,206405\n577,212174\n577,212533\n577,212955\n577,213841\n577,213960\n577,215879\n577,216427\n577,216641\n577,218905\n577,219151\n577,221230\n577,221973\n577,222367\n577,225490\n577,226421\n577,226445\n577,227041\n577,228435\n577,228661\n577,229107\n577,231024\n577,231063\n577,231958\n577,232144\n577,234705\n577,234752\n577,236129\n577,236323\n577,237668\n577,238485\n577,238790\n577,239896\n577,240909\n577,240942\n577,241951\n577,243649\n577,243977\n577,244309\n577,249318\n577,251537\n577,251582\n577,253409\n577,259028\n577,261181\n577,262665\n578,147\n578,579\n579,326\n579,589\n579,599\n579,2373\n580,107\n580,130\n580,149\n580,250\n580,305\n580,338\n580,581\n580,852\n580,934\n580,972\n580,1381\n580,1449\n580,2244\n580,9457\n581,397\n581,481\n581,581\n581,591\n581,668\n581,713\n581,843\n581,911\n581,1524\n581,1614\n581,2513\n581,2604\n581,3967\n581,4178\n581,4186\n581,6991\n581,8044\n581,10548\n581,14273\n581,16459\n581,17497\n581,19413\n581,25282\n581,34092\n581,37787\n581,45025\n581,64736\n581,66246\n581,75786\n581,87699\n581,93720\n581,103901\n581,112954\n581,163919\n581,164571\n581,175335\n581,176360\n581,176406\n581,205769\n581,207006\n581,207456\n581,246790\n582,583\n583,3538\n584,50\n584,79\n584,393\n584,406\n584,493\n584,585\n584,586\n584,592\n584,704\n584,1265\n584,1266\n584,1433\n585,1521\n585,2752\n586,106\n586,107\n586,240\n586,333\n586,337\n586,402\n586,505\n586,512\n586,516\n586,586\n586,587\n586,637\n586,638\n586,663\n586,664\n586,779\n586,818\n586,847\n586,1027\n586,1149\n586,1370\n586,1566\n586,1821\n586,1985\n586,2560\n586,2782\n586,3202\n586,4200\n586,4315\n586,4466\n586,5311\n586,5691\n586,5713\n586,6813\n586,8157\n586,8867\n586,9686\n586,15479\n586,18327\n586,18695\n586,19287\n586,19504\n586,19585\n586,19665\n586,20418\n586,20731\n586,20956\n586,21528\n586,23517\n586,24775\n586,26181\n586,26795\n586,29747\n586,31094\n586,34065\n586,34696\n586,34728\n586,34905\n586,36788\n586,38271\n586,38433\n586,45052\n586,46874\n586,48053\n586,50123\n586,52433\n586,52453\n586,54871\n586,55014\n586,55692\n586,56209\n586,56463\n586,56885\n586,59021\n586,60576\n586,60701\n586,61053\n586,61354\n586,61985\n586,62610\n586,63012\n586,64102\n586,65640\n586,67319\n586,67750\n586,71027\n586,71582\n586,79473\n586,86255\n586,86400\n586,86421\n586,86477\n586,92846\n586,99949\n586,101653\n586,104249\n586,104456\n586,104876\n586,104913\n586,105494\n586,105640\n586,106276\n586,108018\n586,109427\n586,112099\n586,112398\n586,112633\n586,113211\n586,113461\n586,113477\n586,114240\n586,114484\n586,114840\n586,115479\n586,116456\n586,117761\n586,120155\n586,122124\n586,127158\n586,130180\n586,133460\n586,140842\n586,147079\n586,147536\n586,148006\n586,148848\n586,148849\n586,162405\n586,163798\n586,170706\n586,170726\n586,172381\n586,172525\n586,173344\n586,174389\n586,175207\n586,175483\n586,176322\n586,180233\n586,182394\n586,188594\n586,188670\n586,190720\n586,206918\n586,207015\n586,221900\n586,221932\n586,227326\n586,228140\n586,234949\n586,238410\n586,244689\n586,249346\n586,249816\n586,256165\n586,257503\n586,263069\n587,586\n588,588\n588,590\n589,34\n589,35\n589,58\n589,167\n589,272\n589,287\n589,298\n589,301\n589,313\n589,390\n589,417\n589,512\n589,534\n589,536\n589,573\n589,579\n589,589\n589,612\n589,631\n589,693\n589,765\n589,775\n589,782\n589,784\n589,788\n589,795\n589,838\n589,862\n589,894\n589,968\n589,992\n589,1001\n589,1011\n589,1026\n589,1085\n589,1093\n589,1133\n589,1241\n589,1276\n589,1284\n589,1409\n589,1459\n589,1522\n589,1531\n589,1544\n589,1566\n589,1580\n589,1853\n589,2083\n589,2228\n589,2646\n589,2995\n589,3093\n589,3094\n589,3101\n589,3497\n589,3623\n589,4222\n589,5091\n589,5154\n589,5186\n589,5677\n589,5961\n589,6068\n589,6394\n589,6474\n589,7388\n589,8107\n589,8152\n589,8196\n589,8435\n589,9457\n589,11952\n589,13432\n589,13524\n589,14106\n589,14311\n589,14357\n589,14413\n589,15109\n589,15873\n589,16192\n589,16524\n589,16667\n589,16955\n589,17903\n589,18558\n589,19525\n589,19592\n589,19769\n589,20519\n589,21742\n589,22032\n589,22103\n589,22274\n589,22844\n589,27041\n589,28375\n589,31741\n589,31794\n589,35458\n589,36957\n589,41211\n589,41736\n589,42841\n589,44830\n589,46717\n589,48298\n589,49733\n589,53733\n589,54510\n589,64197\n589,64525\n589,73248\n589,73307\n589,74672\n589,75912\n589,80268\n589,80459\n589,80932\n589,80981\n589,84181\n589,87288\n589,88427\n589,88515\n589,90310\n589,91815\n589,95006\n589,97300\n589,103409\n589,107428\n589,108063\n589,110634\n589,111088\n589,111764\n589,121863\n589,126773\n589,136182\n589,139061\n589,141073\n589,156349\n589,159013\n589,163856\n589,164811\n589,165157\n589,168282\n589,168283\n589,168357\n589,168360\n589,169366\n589,171053\n589,177057\n589,178602\n589,185133\n589,185874\n589,204973\n589,221178\n589,224031\n589,233324\n589,241500\n589,243115\n589,247938\n589,255435\n589,255436\n589,255539\n589,258656\n590,41\n590,68\n590,104\n590,120\n590,134\n590,215\n590,289\n590,290\n590,298\n590,301\n590,372\n590,425\n590,588\n590,590\n590,631\n590,640\n590,694\n590,704\n590,714\n590,760\n590,784\n590,805\n590,838\n590,1011\n590,1016\n590,1085\n590,1118\n590,1119\n590,1177\n590,1192\n590,1204\n590,1282\n590,1402\n590,1419\n590,1462\n590,1466\n590,1506\n590,1608\n590,1631\n590,1796\n590,1818\n590,1973\n590,2205\n590,2253\n590,2620\n590,2989\n590,2991\n590,3507\n590,4237\n590,4355\n590,5718\n590,8537\n590,22482\n590,33424\n590,44725\n590,75912\n590,88820\n590,127158\n590,182162\n590,185877\n590,232709\n590,237709\n590,261099\n590,261163\n591,581\n592,289\n592,592\n592,704\n592,818\n592,1011\n592,1085\n592,1402\n592,1403\n592,1818\n592,2252\n592,2286\n592,2296\n592,2909\n592,2982\n592,3028\n592,3069\n592,3937\n592,4062\n592,4596\n592,5278\n592,5626\n592,6643\n592,8763\n592,13281\n592,13294\n592,13506\n592,13569\n592,14261\n592,14376\n592,14554\n592,15362\n592,15882\n592,17867\n592,17875\n592,18464\n592,18603\n592,18621\n592,23421\n592,25029\n592,26789\n592,27888\n592,29175\n592,32734\n592,32770\n592,32858\n592,33557\n592,33707\n592,34344\n592,35070\n592,35378\n592,36759\n592,36801\n592,37497\n592,38142\n592,39009\n592,41865\n592,43208\n592,43364\n592,43992\n592,44215\n592,46602\n592,47810\n592,48186\n592,49389\n592,50226\n592,50910\n592,51000\n592,51560\n592,52052\n592,52266\n592,52819\n592,54570\n592,55154\n592,55678\n592,56442\n592,56782\n592,62386\n592,63066\n592,64254\n592,75912\n592,78428\n592,81184\n592,86671\n592,87115\n592,87234\n592,87262\n592,87332\n592,87774\n592,91399\n592,93067\n592,93258\n592,94134\n592,103085\n592,104011\n592,107998\n592,108993\n592,111490\n592,113433\n592,114229\n592,114848\n592,116526\n592,116611\n592,116622\n592,116669\n592,117025\n592,117711\n592,120132\n592,122451\n592,124867\n592,127158\n592,128270\n592,128325\n592,130904\n592,132927\n592,134822\n592,135138\n592,138795\n592,140095\n592,140838\n592,146300\n592,146773\n592,146778\n592,146793\n592,146807\n592,146809\n592,147874\n592,149632\n592,156640\n592,157631\n592,159352\n592,159692\n592,160854\n592,160924\n592,163522\n592,163739\n592,164064\n592,165066\n592,165803\n592,166294\n592,167312\n592,167357\n592,168175\n592,168875\n592,169015\n592,169018\n592,169135\n592,169538\n592,170912\n592,174400\n592,175289\n592,176670\n592,188226\n592,188867\n592,194067\n592,196741\n592,201767\n592,214262\n592,214336\n592,214673\n592,215433\n592,215647\n592,219897\n592,226485\n592,231085\n592,231125\n592,231128\n592,231129\n592,231131\n592,231135\n592,231136\n592,231140\n592,231141\n592,231145\n592,231148\n592,231181\n592,232896\n592,235643\n592,236106\n592,238320\n592,238343\n592,238680\n592,238924\n592,238998\n592,239947\n592,239960\n592,239971\n592,240023\n592,241585\n592,241646\n592,242250\n592,243564\n592,244774\n592,254221\n592,255514\n592,256189\n592,260656\n592,261418\n592,261658\n592,262042\n592,262494\n592,262726\n592,263197\n592,264771\n593,483\n594,595\n595,10\n595,87\n595,292\n595,314\n595,509\n595,510\n595,595\n595,673\n595,852\n595,872\n595,996\n595,1011\n595,1572\n595,1722\n595,1973\n595,2373\n595,3367\n595,3538\n595,13599\n596,104\n596,111\n596,328\n596,557\n596,596\n596,597\n596,600\n596,617\n596,715\n596,772\n596,784\n596,1052\n596,1085\n596,1131\n596,1132\n596,1140\n596,1146\n596,1209\n596,1367\n596,1368\n596,1429\n596,1973\n596,2416\n596,2417\n596,2543\n596,2547\n596,2565\n596,2596\n596,2658\n596,2814\n596,3473\n596,3504\n596,3565\n596,3759\n596,4419\n596,4520\n596,4725\n596,4771\n596,5137\n596,5279\n596,5391\n596,6023\n596,6068\n596,6433\n596,7003\n596,7458\n596,7731\n596,13132\n596,13307\n596,13541\n596,13626\n596,14473\n596,15344\n596,15500\n596,15506\n596,15515\n596,15577\n596,15658\n596,15663\n596,15747\n596,16417\n596,16520\n596,18353\n596,18511\n596,19708\n596,20858\n596,21349\n596,21382\n596,22677\n596,22835\n596,23573\n596,23863\n596,25394\n596,25452\n596,26262\n596,26857\n596,28203\n596,29841\n596,30031\n596,30527\n596,32329\n596,32504\n596,33418\n596,33567\n596,34015\n596,34917\n596,34918\n596,34919\n596,35530\n596,36413\n596,38144\n596,38394\n596,38787\n596,40053\n596,41358\n596,43151\n596,46255\n596,46841\n596,48898\n596,49802\n596,49879\n596,50890\n596,52347\n596,54121\n596,54271\n596,57143\n596,60095\n596,61902\n596,63639\n596,64543\n596,65896\n596,66348\n596,74455\n596,75912\n596,79742\n596,80004\n596,80567\n596,82687\n596,83432\n596,84019\n596,84565\n596,84566\n596,84567\n596,84568\n596,85814\n596,86039\n596,86750\n596,86866\n596,87707\n596,87883\n596,87947\n596,89400\n596,89585\n596,91424\n596,91942\n596,93109\n596,98925\n596,103216\n596,103895\n596,105561\n596,105565\n596,106152\n596,106445\n596,107234\n596,109712\n596,112686\n596,116143\n596,117318\n596,117369\n596,119153\n596,119864\n596,119877\n596,119921\n596,121863\n596,122571\n596,124186\n596,124188\n596,124268\n596,124378\n596,128242\n596,128777\n596,128786\n596,128795\n596,128972\n596,129024\n596,137126\n596,137135\n596,137799\n596,139583\n596,139782\n596,140313\n596,140788\n596,140794\n596,140941\n596,141141\n596,143136\n596,143634\n596,144070\n596,144080\n596,146814\n596,149707\n596,150675\n596,154394\n596,158300\n596,159125\n596,160105\n596,161977\n596,162435\n596,165216\n596,168874\n596,169161\n596,169646\n596,169648\n596,169649\n596,169907\n596,171753\n596,172514\n596,173783\n596,174322\n596,174999\n596,175639\n596,176803\n596,177115\n596,177134\n596,179099\n596,184726\n596,185687\n596,186524\n596,186875\n596,187410\n596,187878\n596,188564\n596,188999\n596,190799\n596,191227\n596,191302\n596,191433\n596,192769\n596,193052\n596,193068\n596,193083\n596,193452\n596,193471\n596,193537\n596,194986\n596,195023\n596,195117\n596,195119\n596,197584\n596,197807\n596,197812\n596,199218\n596,200492\n596,201532\n596,202031\n596,203804\n596,204201\n596,205249\n596,205675\n596,206453\n596,207083\n596,207142\n596,207536\n596,212107\n596,212334\n596,213049\n596,213057\n596,213399\n596,215202\n596,219225\n596,219815\n596,219819\n596,223798\n596,224081\n596,224159\n596,224168\n596,224214\n596,224368\n596,224371\n596,224448\n596,224569\n596,224597\n596,224606\n596,224734\n596,225498\n596,225921\n596,225967\n596,227496\n596,227506\n596,227507\n596,229086\n596,231555\n596,231819\n596,231845\n596,233822\n596,236033\n596,236075\n596,238252\n596,238260\n596,238276\n596,238772\n596,241247\n596,241708\n596,243084\n596,245091\n596,246484\n596,247188\n596,247190\n596,247767\n596,247788\n596,248007\n596,248009\n596,248013\n596,248029\n596,248052\n596,248400\n596,248538\n596,249229\n596,249884\n596,250251\n596,255939\n596,256335\n596,256423\n596,256427\n596,257781\n596,257782\n596,258530\n596,259722\n596,260882\n596,261264\n596,261333\n596,264745\n598,264\n598,304\n598,599\n598,1551\n598,5308\n599,11\n599,20\n599,22\n599,34\n599,35\n599,41\n599,65\n599,68\n599,83\n599,104\n599,106\n599,140\n599,149\n599,158\n599,167\n599,182\n599,186\n599,192\n599,202\n599,203\n599,207\n599,209\n599,215\n599,222\n599,225\n599,240\n599,248\n599,252\n599,259\n599,261\n599,264\n599,275\n599,278\n599,287\n599,299\n599,301\n599,302\n599,313\n599,314\n599,318\n599,333\n599,336\n599,349\n599,356\n599,360\n599,372\n599,379\n599,391\n599,392\n599,393\n599,397\n599,406\n599,408\n599,417\n599,433\n599,439\n599,441\n599,442\n599,455\n599,467\n599,493\n599,510\n599,512\n599,516\n599,534\n599,536\n599,538\n599,599\n599,604\n599,622\n599,631\n599,676\n599,682\n599,690\n599,693\n599,697\n599,710\n599,712\n599,714\n599,752\n599,764\n599,765\n599,775\n599,779\n599,801\n599,809\n599,811\n599,818\n599,838\n599,843\n599,852\n599,861\n599,868\n599,872\n599,873\n599,900\n599,911\n599,918\n599,920\n599,949\n599,968\n599,972\n599,980\n599,1001\n599,1010\n599,1023\n599,1033\n599,1085\n599,1118\n599,1122\n599,1130\n599,1133\n599,1140\n599,1147\n599,1151\n599,1167\n599,1172\n599,1204\n599,1210\n599,1220\n599,1222\n599,1231\n599,1235\n599,1240\n599,1241\n599,1267\n599,1282\n599,1285\n599,1289\n599,1293\n599,1294\n599,1298\n599,1309\n599,1326\n599,1332\n599,1335\n599,1345\n599,1353\n599,1363\n599,1370\n599,1381\n599,1402\n599,1411\n599,1417\n599,1445\n599,1454\n599,1462\n599,1505\n599,1509\n599,1518\n599,1522\n599,1531\n599,1556\n599,1590\n599,1634\n599,1655\n599,1663\n599,1724\n599,1782\n599,1796\n599,1805\n599,1836\n599,1837\n599,1844\n599,1893\n599,1955\n599,1989\n599,1992\n599,2008\n599,2037\n599,2083\n599,2334\n599,2373\n599,2400\n599,2512\n599,2605\n599,2646\n599,2699\n599,2979\n599,3166\n599,3193\n599,3260\n599,3392\n599,3414\n599,3422\n599,3474\n599,3804\n599,3999\n599,4039\n599,4114\n599,4140\n599,4153\n599,4276\n599,4286\n599,4514\n599,4545\n599,4637\n599,4672\n599,5388\n599,5961\n599,6837\n599,6867\n599,6904\n599,7432\n599,8055\n599,8342\n599,8463\n599,8537\n599,9028\n599,9561\n599,9698\n599,13207\n599,13229\n599,13385\n599,14104\n599,14411\n599,15838\n599,15931\n599,18129\n599,18168\n599,20382\n599,20803\n599,21173\n599,22380\n599,23437\n599,23626\n599,24676\n599,24732\n599,25553\n599,26034\n599,28911\n599,30502\n599,30551\n599,37204\n599,38135\n599,41170\n599,41230\n599,41791\n599,42727\n599,44095\n599,50316\n599,52361\n599,56520\n599,59815\n599,63069\n599,64055\n599,64570\n599,67250\n599,70987\n599,72439\n599,74696\n599,75912\n599,80483\n599,88017\n599,93729\n599,98327\n599,98785\n599,99180\n599,104407\n599,108112\n599,111422\n599,112475\n599,113931\n599,113972\n599,114620\n599,115127\n599,115155\n599,115474\n599,117994\n599,118336\n599,122439\n599,124965\n599,136724\n599,138098\n599,142866\n599,151433\n599,167089\n599,180405\n599,181800\n599,183835\n599,185422\n600,596\n601,79\n601,192\n601,30331\n602,1\n602,56\n602,79\n602,99\n602,146\n602,147\n602,175\n602,192\n602,195\n602,285\n602,314\n602,325\n602,333\n602,336\n602,337\n602,406\n602,422\n602,505\n602,602\n602,603\n602,607\n602,620\n602,622\n602,633\n602,638\n602,645\n602,695\n602,700\n602,701\n602,779\n602,841\n602,848\n602,849\n602,920\n602,1089\n602,1181\n602,1218\n602,1417\n602,1425\n602,1430\n602,1469\n602,1515\n602,1560\n602,1569\n602,1582\n602,1601\n602,1619\n602,1623\n602,1786\n602,1803\n602,1825\n602,1849\n602,1993\n602,2132\n602,2244\n602,2251\n602,2325\n602,2485\n602,3218\n602,3468\n602,3895\n602,3991\n602,4447\n602,4866\n602,5073\n602,5133\n602,5495\n602,5682\n602,6119\n602,6557\n602,6619\n602,6684\n602,6719\n602,6806\n602,7241\n602,7296\n602,7736\n602,7744\n602,7968\n602,8244\n602,8854\n602,9136\n602,9394\n602,12112\n602,14046\n602,14153\n602,14433\n602,15099\n602,15795\n602,16215\n602,16995\n602,17041\n602,17084\n602,18770\n602,18919\n602,18997\n602,20315\n602,21194\n602,21442\n602,22616\n602,23778\n602,23783\n602,24572\n602,26193\n602,26414\n602,26845\n602,28109\n602,28259\n602,28817\n602,28954\n602,29334\n602,29498\n602,30331\n602,30557\n602,30775\n602,32489\n602,33083\n602,34719\n602,34751\n602,35385\n602,35439\n602,36512\n602,36623\n602,37743\n602,38489\n602,38688\n602,38883\n602,40281\n602,40675\n602,41158\n602,42064\n602,42487\n602,44292\n602,45399\n602,45419\n602,46364\n602,46644\n602,46879\n602,47661\n602,48455\n602,50201\n602,50934\n602,51260\n602,52140\n602,54295\n602,55128\n602,55456\n602,55940\n602,59971\n602,60576\n602,62588\n602,65419\n602,65809\n602,66661\n602,67848\n602,70725\n602,72603\n602,72738\n602,74321\n602,75249\n602,79394\n602,80266\n602,82089\n602,83379\n602,85895\n602,87974\n602,90645\n602,92476\n602,97423\n602,98227\n602,98820\n602,99819\n602,102401\n602,105704\n602,105829\n602,109877\n602,113954\n602,116017\n602,117480\n602,118435\n602,118822\n602,119536\n602,120026\n602,121441\n602,123112\n602,124847\n602,125099\n602,125108\n602,125443\n602,127215\n602,127236\n602,127654\n602,128222\n602,129780\n602,129785\n602,131296\n602,132881\n602,134621\n602,136167\n602,138060\n602,140091\n602,140654\n602,140697\n602,140815\n602,142343\n602,142623\n602,142759\n602,143260\n602,146253\n602,148369\n602,152411\n602,155583\n602,158693\n602,158948\n602,162640\n602,162878\n602,169320\n602,176329\n602,176331\n602,178640\n602,178894\n602,179796\n602,180343\n602,190309\n602,193604\n602,194527\n602,195132\n602,196698\n602,197583\n602,197778\n602,200506\n602,204059\n602,204124\n602,216657\n602,217715\n602,223668\n602,225974\n602,226429\n602,232411\n602,232792\n602,234757\n602,237426\n602,237506\n602,237647\n602,241203\n602,242305\n602,243083\n602,243557\n602,243966\n602,245355\n602,247438\n602,249676\n602,250295\n602,250986\n602,251464\n602,251615\n602,252041\n602,253184\n602,257799\n602,258411\n602,260939\n602,261728\n603,602\n603,3218\n604,37\n604,126\n604,182\n604,299\n604,301\n604,312\n604,397\n604,444\n604,446\n604,452\n604,457\n604,535\n604,563\n604,567\n604,599\n604,604\n604,605\n604,615\n604,673\n604,676\n604,698\n604,717\n604,750\n604,762\n604,812\n604,843\n604,929\n604,937\n604,968\n604,972\n604,1011\n604,1027\n604,1118\n604,1130\n604,1160\n604,1231\n604,1262\n604,1284\n604,1293\n604,1300\n604,1359\n604,1411\n604,1566\n604,1627\n604,1740\n604,1782\n604,1844\n604,1849\n604,1985\n604,2253\n604,2358\n604,3379\n604,3422\n604,3756\n604,3804\n604,3809\n604,3869\n604,3883\n604,4165\n604,4514\n604,5094\n604,5376\n604,5455\n604,5662\n604,6167\n604,6398\n604,6429\n604,6981\n604,7986\n604,9340\n604,13296\n604,13563\n604,16121\n604,17894\n604,18098\n604,18129\n604,18553\n604,18565\n604,19413\n604,20517\n604,20757\n604,21193\n604,21331\n604,21589\n604,22062\n604,22352\n604,22423\n604,24675\n604,25342\n604,26201\n604,28128\n604,28455\n604,28831\n604,28847\n604,30452\n604,34227\n604,34241\n604,35505\n604,38349\n604,38938\n604,39607\n604,40806\n604,40967\n604,42595\n604,44112\n604,45478\n604,45825\n604,46091\n604,46849\n604,50213\n604,50218\n604,50220\n604,50225\n604,50227\n604,50228\n604,50231\n604,54584\n604,55372\n604,56412\n604,60542\n604,65695\n604,65749\n604,65770\n604,65804\n604,66597\n604,67158\n604,68061\n604,70028\n604,70042\n604,70698\n604,72720\n604,75394\n604,75948\n604,77127\n604,80060\n604,80062\n604,82116\n604,83003\n604,83992\n605,10\n605,301\n605,446\n605,567\n605,604\n605,605\n605,615\n605,663\n605,664\n605,717\n605,968\n605,1160\n605,1293\n605,1752\n605,2595\n605,2937\n605,3162\n605,6926\n605,7088\n605,7400\n605,9340\n605,13483\n605,15253\n605,16247\n605,17850\n605,18993\n605,18994\n605,19947\n605,20926\n605,24338\n605,26770\n605,28455\n605,29134\n605,33128\n605,35736\n605,35737\n605,36957\n605,41632\n605,43289\n605,44915\n605,45818\n605,46800\n605,55357\n605,58335\n605,60059\n605,61914\n605,61915\n605,61965\n605,64126\n605,66530\n605,66760\n605,67574\n605,68996\n605,80281\n605,81131\n605,83955\n605,84163\n605,91861\n605,97100\n605,104074\n605,104979\n605,110935\n605,126478\n605,136106\n605,155393\n605,159568\n605,161391\n605,162145\n605,162337\n605,165725\n605,184556\n605,184723\n605,193767\n605,212565\n605,213222\n605,214983\n605,215586\n605,228983\n605,244270\n605,249421\n605,255929\n605,256619\n605,260550\n605,263061\n606,147\n606,149\n606,171\n606,184\n606,859\n606,1623\n607,602\n607,3218\n608,360\n609,10\n609,94\n609,104\n609,107\n609,138\n609,290\n609,292\n609,364\n609,441\n609,442\n609,563\n609,609\n609,610\n609,626\n609,636\n609,677\n609,693\n609,749\n609,765\n609,784\n609,805\n609,849\n609,852\n609,966\n609,968\n609,969\n609,1045\n609,1046\n609,1146\n609,1238\n609,1257\n609,1276\n609,1347\n609,1359\n609,1566\n609,1572\n609,1663\n609,1688\n609,1882\n609,1888\n609,2253\n609,2315\n609,2384\n609,2572\n609,2775\n609,3830\n609,3964\n609,4039\n609,4049\n609,4135\n609,4308\n609,4771\n609,5388\n609,5439\n609,5679\n609,6647\n609,6666\n609,6714\n609,6880\n609,7182\n609,8149\n609,8261\n609,8658\n609,9202\n609,12263\n609,13563\n609,14193\n609,16248\n609,17632\n609,19754\n609,19755\n609,20704\n609,21468\n609,22490\n609,23710\n609,23835\n609,26061\n609,28442\n609,31533\n609,31796\n609,34407\n609,34440\n609,36219\n609,36939\n609,40568\n609,48456\n609,50342\n609,60651\n609,74355\n609,79410\n609,81452\n609,91355\n609,102891\n609,107712\n609,109831\n609,117887\n609,129910\n609,130794\n609,139016\n609,144129\n609,189159\n609,195505\n609,216439\n609,216440\n609,219874\n609,220293\n610,609\n611,240\n611,611\n611,612\n611,852\n611,1459\n611,3944\n611,5674\n611,5718\n611,5836\n611,7087\n611,7921\n611,7972\n611,8420\n611,8510\n611,9021\n611,9630\n611,12281\n611,13133\n611,14055\n611,14070\n611,15141\n611,15988\n611,16198\n611,16449\n611,18759\n611,19303\n611,19793\n611,20664\n611,21617\n611,22354\n611,22813\n611,23353\n611,23408\n611,24538\n611,28415\n611,33335\n611,33989\n611,39402\n611,40358\n611,41621\n611,46052\n611,46243\n611,49265\n611,49270\n611,49446\n611,49985\n611,54326\n611,54347\n611,55666\n611,58183\n611,58268\n611,58428\n611,58431\n611,62832\n611,63038\n611,63582\n611,63793\n611,65901\n611,78746\n611,82255\n611,87009\n611,87868\n611,90412\n611,90722\n611,95339\n611,96485\n611,97206\n611,101818\n611,101918\n611,103219\n611,103232\n611,103845\n611,104339\n611,105500\n611,108047\n611,109272\n611,109898\n611,112798\n611,113209\n611,113914\n611,119845\n611,122506\n611,122667\n611,122905\n611,124868\n611,126056\n611,126820\n611,128245\n611,135063\n611,135068\n611,136521\n611,136585\n611,148546\n611,155165\n611,168389\n611,175939\n611,180344\n611,185313\n611,190270\n611,214596\n611,217422\n611,222495\n611,226973\n611,227224\n611,227243\n611,227294\n611,233503\n611,238746\n611,247837\n611,258267\n611,260163\n612,41\n612,68\n612,104\n612,298\n612,309\n612,310\n612,332\n612,338\n612,372\n612,417\n612,431\n612,455\n612,534\n612,557\n612,589\n612,626\n612,631\n612,636\n612,714\n612,801\n612,805\n612,862\n612,953\n612,1016\n612,1119\n612,1235\n612,1335\n612,1368\n612,1392\n612,1411\n612,1462\n612,1608\n612,2205\n612,2617\n612,2775\n612,2995\n612,8537\n612,33424\n612,75912\n613,11\n614,202\n614,203\n614,206\n614,4453\n615,10\n615,37\n615,261\n615,301\n615,312\n615,314\n615,356\n615,444\n615,518\n615,567\n615,604\n615,605\n615,615\n615,616\n615,677\n615,685\n615,693\n615,698\n615,783\n615,794\n615,818\n615,838\n615,852\n615,937\n615,968\n615,972\n615,1010\n615,1011\n615,1014\n615,1231\n615,1276\n615,1293\n615,1298\n615,1300\n615,1330\n615,1442\n615,1564\n615,1566\n615,1654\n615,1782\n615,1832\n615,1837\n615,1844\n615,2217\n615,2615\n615,3106\n615,3422\n615,3507\n615,3714\n615,3809\n615,4034\n615,4253\n615,4329\n615,4598\n615,4722\n615,5472\n615,6552\n615,6824\n615,6910\n615,7170\n615,7400\n615,9340\n615,9457\n615,14440\n615,19592\n615,20327\n615,20416\n615,23799\n615,23845\n615,23863\n615,24963\n615,25302\n615,27205\n615,30328\n615,30390\n615,31175\n615,31595\n615,33505\n615,33532\n615,35046\n615,35445\n615,36241\n615,36678\n615,37381\n615,39123\n615,39429\n615,39506\n615,41147\n615,41155\n615,41567\n615,46053\n615,48278\n615,49121\n615,51497\n615,55948\n615,57111\n615,61089\n615,62983\n615,63880\n615,72726\n615,74415\n615,76235\n615,77678\n615,77789\n615,80009\n615,80062\n615,84160\n615,85750\n615,96685\n615,97147\n615,98279\n615,103960\n615,106267\n615,106365\n615,112995\n615,119164\n615,119308\n615,119339\n615,124945\n615,151457\n615,152042\n615,154395\n615,155425\n615,162882\n615,164998\n615,167565\n615,169157\n615,170729\n615,171585\n615,181765\n615,182912\n615,182949\n615,183310\n615,183909\n615,183927\n615,194189\n615,216095\n615,221637\n615,224764\n615,226270\n615,228326\n615,228883\n615,231070\n615,238085\n615,247025\n615,247902\n615,253400\n615,254424\n615,255100\n615,255631\n615,256374\n615,256916\n616,615\n617,135\n617,294\n617,304\n617,596\n617,660\n617,784\n617,1052\n617,1368\n617,2416\n617,2417\n617,2701\n618,158\n618,240\n618,1118\n618,2224\n619,620\n619,8244\n620,1\n620,50\n620,79\n620,99\n620,106\n620,146\n620,147\n620,149\n620,158\n620,175\n620,192\n620,202\n620,285\n620,336\n620,406\n620,422\n620,602\n620,620\n620,647\n620,663\n620,664\n620,701\n620,779\n620,841\n620,1218\n620,1370\n620,1425\n620,1492\n620,1510\n620,1515\n620,1523\n620,1582\n620,1600\n620,2093\n620,2244\n620,2260\n620,2374\n620,2782\n620,2792\n620,3449\n620,3515\n620,3895\n620,4103\n620,4447\n620,4529\n620,5133\n620,5601\n620,6546\n620,6557\n620,6571\n620,6573\n620,6577\n620,6843\n620,7971\n620,8046\n620,8244\n620,13421\n620,14153\n620,14169\n620,14455\n620,15113\n620,15229\n620,15304\n620,15769\n620,17151\n620,18997\n620,19593\n620,20713\n620,23783\n620,24166\n620,24528\n620,24999\n620,26414\n620,26424\n620,27832\n620,27834\n620,30331\n620,31585\n620,33030\n620,34153\n620,34727\n620,38688\n620,38883\n620,40570\n620,42752\n620,43281\n620,46181\n620,49439\n620,55254\n620,57944\n620,60576\n620,62530\n620,62686\n620,64669\n620,65700\n620,65809\n620,67866\n620,69916\n620,72505\n620,75249\n620,75327\n620,76476\n620,79976\n620,80863\n620,83278\n620,84753\n620,87917\n620,90238\n620,92476\n620,92792\n620,98422\n620,99606\n620,103852\n620,106502\n620,109367\n620,110995\n620,116041\n620,116849\n620,117530\n620,118336\n620,120923\n620,121956\n620,124889\n620,125875\n620,126856\n620,131296\n620,131645\n620,136030\n620,141912\n620,146712\n620,150165\n620,150405\n620,151986\n620,162972\n620,166748\n620,170149\n620,176396\n620,179278\n620,180487\n620,186305\n620,187324\n620,194950\n620,214170\n620,215058\n620,255046\n621,104\n621,264\n621,333\n621,440\n621,622\n621,682\n621,794\n621,805\n621,1033\n621,1381\n621,1551\n621,1659\n622,30\n622,50\n622,79\n622,104\n622,147\n622,149\n622,158\n622,192\n622,195\n622,202\n622,203\n622,206\n622,252\n622,256\n622,285\n622,314\n622,328\n622,333\n622,336\n622,406\n622,435\n622,438\n622,439\n622,440\n622,452\n622,467\n622,505\n622,510\n622,516\n622,602\n622,622\n622,640\n622,671\n622,760\n622,779\n622,794\n622,808\n622,809\n622,841\n622,862\n622,929\n622,1014\n622,1033\n622,1179\n622,1181\n622,1370\n622,1515\n622,1531\n622,1623\n622,1776\n622,1803\n622,1844\n622,1939\n622,2371\n622,3507\n622,6904\n622,21442\n622,31207\n622,68069\n622,118336\n622,127158\n622,141912\n623,32\n623,34\n623,35\n623,87\n623,256\n623,313\n623,314\n623,326\n623,349\n623,388\n623,392\n623,397\n623,424\n623,425\n623,433\n623,452\n623,457\n623,577\n623,623\n623,624\n623,658\n623,661\n623,673\n623,676\n623,685\n623,693\n623,697\n623,794\n623,808\n623,809\n623,818\n623,852\n623,903\n623,911\n623,918\n623,919\n623,1011\n623,1043\n623,1118\n623,1137\n623,1210\n623,1240\n623,1276\n623,1345\n623,1424\n623,1454\n623,1465\n623,1502\n623,1513\n623,1590\n623,1653\n623,1678\n623,1801\n623,1805\n623,1836\n623,1860\n623,1949\n623,2045\n623,2810\n623,2902\n623,3258\n623,3260\n623,3367\n623,3507\n623,3937\n623,4118\n623,4159\n623,4759\n623,4760\n623,5285\n623,5540\n623,5624\n623,6059\n623,6247\n623,6430\n623,6474\n623,6550\n623,6552\n623,6691\n623,6818\n623,6919\n623,6955\n623,7087\n623,7890\n623,8208\n623,8236\n623,8658\n623,8860\n623,9785\n623,14503\n623,15609\n623,15674\n623,15735\n623,16500\n623,17132\n623,18137\n623,18333\n623,18526\n623,18631\n623,18693\n623,18711\n623,19299\n623,19345\n623,19427\n623,19434\n623,19609\n623,19799\n623,20427\n623,22128\n623,22293\n623,24666\n623,24801\n623,25398\n623,25404\n623,26074\n623,26161\n623,28269\n623,28982\n623,29626\n623,29677\n623,29867\n623,30373\n623,31001\n623,31765\n623,32694\n623,32929\n623,33338\n623,34129\n623,34288\n623,34694\n623,34712\n623,34799\n623,34811\n623,34851\n623,34870\n623,34996\n623,35464\n623,35569\n623,35576\n623,36124\n623,36696\n623,37219\n623,37657\n623,37670\n623,38725\n623,39633\n623,40506\n623,40610\n623,40783\n623,41136\n623,44949\n623,46237\n623,48505\n623,49218\n623,49798\n623,50288\n623,51171\n623,52356\n623,54823\n623,56242\n623,56256\n623,58697\n623,58817\n623,63451\n623,64069\n623,64589\n623,67686\n623,68103\n623,68272\n623,70309\n623,71184\n623,73649\n623,74122\n623,74462\n623,75120\n623,77769\n623,77781\n623,77814\n623,77868\n623,79528\n623,83446\n623,89674\n623,89731\n623,90144\n623,90251\n623,93798\n623,95007\n623,95009\n623,95079\n623,95308\n623,95623\n623,96654\n623,97086\n623,97088\n623,99026\n623,99720\n623,99766\n623,101551\n623,101612\n623,101901\n623,102695\n623,102698\n623,102702\n623,103896\n623,104453\n623,104507\n623,104565\n623,105718\n623,109352\n623,109908\n623,110505\n623,110527\n623,110774\n623,111042\n623,112214\n623,112234\n623,112259\n623,112896\n623,112965\n623,114080\n623,114158\n623,114608\n623,115394\n623,116510\n623,117480\n623,119644\n623,119978\n623,120853\n623,122566\n623,123141\n623,124550\n623,126813\n623,127158\n623,127834\n623,128206\n623,128221\n623,129316\n623,129335\n623,130321\n623,130966\n623,132786\n623,132800\n623,134212\n623,134538\n623,134559\n623,134808\n623,135272\n623,138819\n623,139633\n623,139748\n623,140027\n623,140704\n623,142958\n623,145700\n623,146367\n623,148044\n623,152714\n623,160789\n623,161636\n623,161853\n623,162414\n623,162696\n623,162984\n623,162985\n623,163009\n623,163071\n623,165197\n623,165586\n623,165979\n623,166082\n623,168409\n623,171105\n623,171624\n623,172168\n623,172240\n623,172698\n623,176559\n623,176907\n623,178568\n623,179320\n623,181626\n623,181643\n623,182958\n623,183825\n623,186456\n623,186786\n623,189212\n623,191365\n623,194453\n623,195298\n623,195513\n623,207837\n623,212846\n623,214131\n623,214852\n623,215001\n623,219911\n624,623\n625,626\n626,10\n626,58\n626,111\n626,182\n626,292\n626,298\n626,441\n626,442\n626,446\n626,462\n626,497\n626,518\n626,609\n626,626\n626,632\n626,676\n626,685\n626,749\n626,801\n626,818\n626,838\n626,849\n626,852\n626,862\n626,911\n626,1001\n626,1045\n626,1046\n626,1140\n626,1177\n626,1235\n626,1326\n626,1445\n626,1462\n626,1559\n626,1572\n626,1653\n626,1688\n626,1860\n626,2065\n626,2209\n626,2373\n626,2511\n626,2557\n626,2840\n626,2874\n626,2995\n626,3474\n626,4039\n626,4303\n626,4514\n626,4771\n626,5129\n626,5186\n626,7765\n626,7766\n626,7887\n626,8107\n626,8869\n626,14117\n626,14565\n626,14575\n626,14633\n626,16330\n626,16559\n626,16581\n626,17068\n626,18472\n626,19005\n626,20430\n626,20994\n626,22023\n626,22024\n626,23664\n626,23678\n626,24500\n626,26409\n626,26905\n626,28165\n626,28850\n626,28929\n626,29044\n626,29624\n626,31335\n626,31422\n626,33339\n626,33524\n626,36780\n626,39355\n626,40580\n626,44448\n626,44882\n626,45512\n626,45730\n626,45993\n626,46708\n626,47658\n626,47934\n626,47935\n626,47937\n626,48711\n626,49686\n626,50128\n626,50157\n626,51450\n626,52996\n626,55092\n626,55156\n626,55180\n626,56357\n626,60413\n626,65861\n626,71165\n626,79369\n626,82006\n626,86555\n626,87077\n626,87981\n626,87993\n626,87996\n626,87997\n626,90216\n626,91523\n626,91852\n626,93569\n626,94854\n626,97199\n626,97264\n626,98057\n626,98923\n626,99518\n626,107405\n626,108000\n626,108066\n626,108728\n626,112232\n626,113949\n626,122881\n626,124944\n626,126013\n626,126855\n626,128254\n626,128640\n626,129774\n626,133990\n626,142757\n626,146388\n626,147249\n626,148906\n626,150016\n626,150455\n626,150492\n626,150815\n626,154331\n626,159409\n626,159677\n626,159684\n626,161521\n626,164885\n626,168573\n626,169873\n626,175309\n626,175511\n626,176400\n626,176429\n626,177844\n626,181728\n626,184541\n626,212566\n626,216558\n626,216559\n626,216560\n626,237716\n626,239918\n626,242186\n626,242327\n626,247742\n626,247906\n626,247994\n626,250626\n626,252594\n626,252633\n626,255690\n626,264389\n627,20\n627,182\n627,628\n627,1204\n627,5725\n628,10\n628,147\n628,638\n628,2244\n628,2451\n628,5101\n628,5725\n628,6684\n628,15119\n628,25455\n628,27110\n628,38753\n628,131827\n628,179071\n628,179072\n628,215871\n628,218372\n628,254534\n629,160\n629,182\n629,188\n630,450\n630,818\n630,21944\n631,40\n631,41\n631,68\n631,71\n631,104\n631,186\n631,240\n631,248\n631,261\n631,289\n631,290\n631,294\n631,298\n631,301\n631,304\n631,314\n631,356\n631,372\n631,373\n631,397\n631,417\n631,425\n631,431\n631,442\n631,502\n631,510\n631,534\n631,535\n631,588\n631,589\n631,590\n631,599\n631,612\n631,631\n631,632\n631,677\n631,714\n631,715\n631,760\n631,761\n631,784\n631,794\n631,797\n631,805\n631,808\n631,823\n631,838\n631,843\n631,852\n631,862\n631,968\n631,972\n631,973\n631,1001\n631,1004\n631,1010\n631,1011\n631,1014\n631,1085\n631,1118\n631,1119\n631,1195\n631,1213\n631,1276\n631,1282\n631,1284\n631,1285\n631,1293\n631,1298\n631,1326\n631,1416\n631,1417\n631,1459\n631,1462\n631,1505\n631,1545\n631,1608\n631,1635\n631,1715\n631,1782\n631,1785\n631,1796\n631,1808\n631,1818\n631,1844\n631,1879\n631,1955\n631,2015\n631,2173\n631,2188\n631,2205\n631,2209\n631,2346\n631,2443\n631,2512\n631,2620\n631,2775\n631,2979\n631,3028\n631,3135\n631,3504\n631,3507\n631,3508\n631,3672\n631,3694\n631,3715\n631,4265\n631,4308\n631,4355\n631,4532\n631,4549\n631,4771\n631,5011\n631,5229\n631,5472\n631,6032\n631,6908\n631,7458\n631,7759\n631,7814\n631,8064\n631,8243\n631,8261\n631,8537\n631,8632\n631,9739\n631,14482\n631,15183\n631,15277\n631,15562\n631,16192\n631,18930\n631,19566\n631,19617\n631,19622\n631,20038\n631,20596\n631,20986\n631,22335\n631,22415\n631,24839\n631,24996\n631,25664\n631,29851\n631,30405\n631,30733\n631,31160\n631,31726\n631,31729\n631,31731\n631,31785\n631,33424\n631,33496\n631,34073\n631,35500\n631,38275\n631,38300\n631,39105\n631,41334\n631,42599\n631,49247\n631,49398\n631,54391\n631,54685\n631,56470\n631,56650\n631,58289\n631,59043\n631,61089\n631,61307\n631,62019\n631,65681\n631,65769\n631,66500\n631,66639\n631,67886\n631,68248\n631,70352\n631,70877\n631,70882\n631,72639\n631,73334\n631,74482\n631,75912\n631,79619\n631,80049\n631,80432\n631,82703\n631,83314\n631,83496\n631,87246\n631,87470\n631,88306\n631,88650\n631,89584\n631,90809\n631,94134\n631,97772\n631,103526\n631,107574\n631,109624\n631,111868\n631,113451\n631,118992\n631,121033\n631,122795\n631,127158\n631,132950\n631,133111\n631,136259\n631,139321\n631,141635\n631,142476\n631,142522\n631,142580\n631,142914\n631,150186\n631,156325\n631,158197\n631,158705\n631,158859\n631,160345\n631,160724\n631,160786\n631,161093\n631,161159\n631,161402\n631,162121\n631,163014\n631,163052\n631,163082\n631,163194\n631,163786\n631,163898\n631,164267\n631,164423\n631,164586\n631,164846\n631,164891\n631,165020\n631,165074\n631,165293\n631,165993\n631,166771\n631,167429\n631,169339\n631,171409\n631,171746\n631,172706\n631,175289\n631,176511\n631,176566\n631,176944\n631,178241\n631,181841\n631,186756\n631,188791\n631,188836\n631,188883\n631,189777\n631,191596\n631,191901\n631,194426\n631,214752\n631,217559\n631,219626\n631,220939\n631,222382\n631,224887\n631,228197\n631,229659\n631,236041\n631,239047\n631,239889\n631,242879\n631,243369\n631,243584\n631,252093\n631,260342\n632,22\n632,104\n632,200\n632,289\n632,290\n632,301\n632,417\n632,442\n632,534\n632,599\n632,626\n632,631\n632,714\n632,760\n632,794\n632,805\n632,862\n632,1001\n632,1085\n632,1119\n632,1368\n632,1818\n632,2205\n632,2206\n632,2253\n632,2995\n632,9028\n632,33424\n632,75912\n633,422\n633,602\n633,3218\n634,10\n634,19\n634,34\n634,35\n634,83\n634,175\n634,294\n634,313\n634,363\n634,379\n634,385\n634,389\n634,477\n634,634\n634,635\n634,685\n634,693\n634,805\n634,852\n634,1011\n634,1072\n634,1313\n634,1471\n634,1539\n634,1571\n634,1617\n634,1718\n634,1724\n634,2159\n634,2224\n634,2319\n634,2424\n634,2553\n634,2646\n634,2784\n634,2834\n634,3234\n634,3504\n634,3686\n634,3729\n634,4166\n634,4190\n634,4223\n634,4392\n634,4412\n634,4637\n634,5034\n634,5326\n634,5591\n634,6506\n634,6855\n634,7092\n634,7458\n634,7698\n634,12031\n634,13240\n634,13626\n634,13661\n634,14464\n634,14486\n634,16202\n634,16223\n634,18345\n634,18831\n634,19278\n634,19286\n634,20325\n634,20618\n634,24160\n634,24274\n634,25626\n634,25880\n634,26801\n634,28671\n634,28821\n634,29556\n634,30502\n634,39537\n634,42861\n634,43893\n634,45803\n634,46880\n634,47071\n634,47464\n634,48240\n634,48398\n634,49043\n634,54631\n634,55789\n634,60343\n634,62286\n634,62459\n634,62705\n634,66703\n634,66876\n634,70312\n634,74417\n634,79966\n634,81159\n634,86064\n634,90388\n634,90969\n634,92922\n634,97111\n634,101828\n634,103403\n634,107100\n634,115474\n634,119154\n634,132085\n634,134983\n634,135622\n634,136568\n634,141128\n634,143139\n634,145915\n634,147583\n634,155726\n634,156760\n634,161155\n634,161197\n634,161392\n634,161664\n634,161667\n634,162017\n634,163013\n634,168924\n634,170660\n634,172228\n634,173293\n634,173957\n634,177623\n634,177625\n634,179918\n634,180156\n634,183456\n634,191994\n634,212575\n634,214940\n634,219218\n634,219397\n634,222525\n634,223001\n634,223876\n634,225507\n634,225528\n634,225599\n634,228560\n634,228794\n634,235887\n634,236523\n634,241819\n634,241824\n634,245482\n634,247611\n634,255045\n634,255694\n634,256350\n634,258716\n634,259059\n634,259545\n634,260873\n634,260908\n635,399\n635,634\n635,891\n635,949\n635,1274\n635,1724\n635,1871\n635,2224\n635,2646\n635,7698\n635,13661\n635,115474\n635,183456\n635,188791\n636,104\n636,134\n636,135\n636,136\n636,138\n636,200\n636,225\n636,248\n636,254\n636,290\n636,298\n636,364\n636,372\n636,373\n636,457\n636,502\n636,557\n636,609\n636,612\n636,631\n636,636\n636,677\n636,685\n636,714\n636,715\n636,784\n636,805\n636,953\n636,1001\n636,1119\n636,1258\n636,1282\n636,1332\n636,1346\n636,1432\n636,1572\n636,1704\n636,1807\n636,1844\n636,1882\n636,2008\n636,2105\n636,2209\n636,2587\n636,3508\n636,3944\n636,4318\n636,4355\n636,4524\n636,5405\n636,5439\n636,6308\n636,6667\n636,7072\n636,7935\n636,8421\n636,9529\n636,9739\n636,13207\n636,13282\n636,13333\n636,14080\n636,15721\n636,15771\n636,16382\n636,19631\n636,21449\n636,24773\n636,24774\n636,24781\n636,24791\n636,25338\n636,26873\n636,26881\n636,28112\n636,29923\n636,30268\n636,32576\n636,34828\n636,34951\n636,40220\n636,44058\n636,44797\n636,44805\n636,48532\n636,49035\n636,55416\n636,57002\n636,62280\n636,62419\n636,62503\n636,63145\n636,66511\n636,74288\n636,77534\n636,78787\n636,80049\n636,80346\n636,82016\n636,85211\n636,94134\n636,103778\n636,109831\n636,109900\n636,118514\n636,123004\n636,129185\n636,130184\n636,132241\n636,134092\n636,134817\n636,135792\n636,139696\n636,140851\n636,142296\n636,143739\n636,144921\n636,148304\n636,148378\n636,149844\n636,154301\n636,156294\n636,159219\n636,159673\n636,160410\n636,160858\n636,162614\n636,162976\n636,168576\n636,168883\n636,169335\n636,171338\n636,173954\n636,175384\n636,176511\n636,180506\n636,180954\n636,180988\n636,182345\n636,185645\n636,186058\n636,190276\n636,192684\n636,193663\n636,198695\n636,200497\n636,205627\n636,207115\n636,207201\n636,226272\n636,228170\n636,228889\n636,229799\n636,233464\n636,234868\n636,238125\n636,238415\n636,240034\n636,241365\n636,248067\n636,251507\n636,256866\n637,586\n639,640\n640,1\n640,10\n640,50\n640,97\n640,99\n640,106\n640,146\n640,147\n640,148\n640,149\n640,158\n640,175\n640,184\n640,192\n640,195\n640,285\n640,333\n640,336\n640,406\n640,452\n640,505\n640,588\n640,590\n640,640\n640,663\n640,676\n640,779\n640,808\n640,841\n640,929\n640,957\n640,1181\n640,1425\n640,1458\n640,1505\n640,1515\n640,1572\n640,1619\n640,1623\n640,1815\n640,2161\n640,2253\n640,2400\n640,2706\n640,2791\n640,3507\n640,3895\n640,4306\n640,4310\n640,4543\n640,4590\n640,4706\n640,5174\n640,5401\n640,5548\n640,5726\n640,6428\n640,6904\n640,7417\n640,9394\n640,9582\n640,15560\n640,20087\n640,20642\n640,20763\n640,22568\n640,22699\n640,26414\n640,26948\n640,27047\n640,27151\n640,27217\n640,27237\n640,27310\n640,27674\n640,28489\n640,28630\n640,29083\n640,29794\n640,29973\n640,35933\n640,36578\n640,36910\n640,41378\n640,41385\n640,43852\n640,45232\n640,50221\n640,54470\n640,61324\n640,62867\n640,65809\n640,69636\n640,77157\n640,80145\n640,80266\n640,82302\n640,83892\n640,85480\n640,85778\n640,86109\n640,86205\n640,86207\n640,87333\n640,88727\n640,88744\n640,88760\n640,88817\n640,88822\n640,88826\n640,89035\n640,92386\n640,92476\n640,93689\n640,96212\n640,99889\n640,101694\n640,108146\n640,108149\n640,111382\n640,116825\n640,117746\n640,118007\n640,121482\n640,127514\n640,132940\n640,135322\n640,137292\n640,140247\n640,146499\n640,148601\n640,149534\n640,151231\n640,154712\n640,156187\n640,156370\n640,159177\n640,161986\n640,162372\n640,163617\n640,163822\n640,165496\n640,168703\n640,170149\n640,172985\n640,172986\n640,172987\n640,172988\n640,173508\n640,173799\n640,175036\n640,175138\n640,177975\n640,180151\n640,181363\n640,182193\n640,189055\n640,190079\n640,190669\n640,191666\n640,207253\n640,219207\n640,220384\n640,223940\n640,224490\n640,224842\n640,240174\n640,240671\n640,251154\n640,256111\n640,262511\n641,581\n642,473\n643,644\n644,32\n644,285\n644,344\n644,535\n644,779\n644,808\n644,872\n644,891\n644,1240\n644,1860\n644,1949\n644,1973\n644,3003\n644,3258\n644,4903\n645,184\n645,422\n645,602\n645,620\n645,4865\n645,4866\n645,8244\n646,647\n647,106\n647,146\n647,620\n647,647\n647,663\n647,664\n647,1130\n647,1175\n647,1370\n647,1893\n647,2782\n647,4039\n647,7155\n647,8244\n647,92476\n647,106502\n648,649\n649,649\n649,1011\n649,1192\n649,1262\n649,2373\n650,399\n650,682\n650,2646\n650,72439\n651,652\n652,652\n652,1893\n653,3\n653,654\n653,16499\n654,653\n654,2045\n654,201298\n655,408\n656,34\n656,35\n656,657\n657,8\n657,34\n657,35\n657,187\n657,217\n657,222\n657,278\n657,313\n657,379\n657,385\n657,389\n657,399\n657,455\n657,457\n657,536\n657,632\n657,656\n657,657\n657,814\n657,949\n657,951\n657,1005\n657,1019\n657,1069\n657,1417\n657,1525\n657,1571\n657,1724\n657,1871\n657,1914\n657,1916\n657,2092\n657,2176\n657,2266\n657,2269\n657,2290\n657,2322\n657,2361\n657,2421\n657,2451\n657,2671\n657,2779\n657,2784\n657,3636\n657,3646\n657,3672\n657,3686\n657,3880\n657,4007\n657,4076\n657,4109\n657,4166\n657,4223\n657,4377\n657,4637\n657,4723\n657,4740\n657,5135\n657,5178\n657,5208\n657,5325\n657,5702\n657,5758\n657,6032\n657,6539\n657,6789\n657,6828\n657,6890\n657,6913\n657,6960\n657,7072\n657,7109\n657,7698\n657,7759\n657,7768\n657,8140\n657,8168\n657,8290\n657,9161\n657,12112\n657,13198\n657,13240\n657,13361\n657,13479\n657,13597\n657,13607\n657,14068\n657,14348\n657,14384\n657,15303\n657,15325\n657,16230\n657,16406\n657,17655\n657,18387\n657,18577\n657,18650\n657,19286\n657,20416\n657,20747\n657,20847\n657,21212\n657,21233\n657,21382\n657,21855\n657,22119\n657,23456\n657,25670\n657,25826\n657,26140\n657,26366\n657,26374\n657,26887\n657,26888\n657,28671\n657,28844\n657,30093\n657,30502\n657,30617\n657,32269\n657,32804\n657,33508\n657,34089\n657,34183\n657,34270\n657,34509\n657,36813\n657,37726\n657,38972\n657,39523\n657,40469\n657,40732\n657,40795\n657,41854\n657,42804\n657,44068\n657,44329\n657,44442\n657,46256\n657,48372\n657,48404\n657,48729\n657,49030\n657,49127\n657,49224\n657,50018\n657,51880\n657,54425\n657,55013\n657,55195\n657,55248\n657,57354\n657,58270\n657,58490\n657,59398\n657,60472\n657,61085\n657,61243\n657,62264\n657,62459\n657,62977\n657,63392\n657,63519\n657,64288\n657,64479\n657,65100\n657,66253\n657,66273\n657,67487\n657,67668\n657,67852\n657,67952\n657,68459\n657,68646\n657,68812\n657,69105\n657,69990\n657,70334\n657,71661\n657,73279\n657,75306\n657,79040\n657,79313\n657,79396\n657,79650\n657,79680\n657,80721\n657,80966\n657,81230\n657,83571\n657,83745\n657,84149\n657,84186\n657,85727\n657,85985\n657,86060\n657,87245\n657,87978\n657,88711\n657,90016\n657,90076\n657,90984\n657,91522\n657,93636\n657,96648\n657,96794\n657,96871\n657,97220\n657,98262\n657,101649\n657,101735\n657,103726\n657,104719\n657,106813\n657,106918\n657,107066\n657,109036\n657,110527\n657,112560\n657,112786\n657,113003\n657,113898\n657,115644\n657,117965\n657,119349\n657,121160\n657,121416\n657,121979\n657,123805\n657,125242\n657,126282\n657,126841\n657,127148\n657,127504\n657,128690\n657,129942\n657,131216\n657,131224\n657,133498\n657,134530\n657,137842\n657,138136\n657,139928\n657,140055\n657,140342\n657,143586\n657,143725\n657,144323\n657,144762\n657,145042\n657,145720\n657,150016\n657,150157\n657,156488\n657,157218\n657,158682\n657,158920\n657,159386\n657,160235\n657,162767\n657,165979\n657,166288\n657,167174\n657,168445\n657,169221\n657,169966\n657,169993\n657,170239\n657,171300\n657,172051\n657,174397\n657,174591\n657,174955\n657,174959\n657,178736\n657,182332\n657,183873\n657,185439\n657,185940\n657,190137\n657,191486\n657,193664\n657,194920\n657,198246\n657,198387\n657,204259\n657,213089\n657,214664\n657,216365\n657,217583\n657,218549\n657,219511\n657,220990\n657,222100\n657,223656\n657,224777\n657,224815\n657,228276\n657,228277\n657,228354\n657,228699\n657,229179\n657,229466\n657,229784\n657,229807\n657,230075\n657,230690\n657,233524\n657,234175\n657,234493\n657,235144\n657,236696\n657,238124\n657,238309\n657,239587\n657,240895\n657,240902\n657,241149\n657,241654\n657,242478\n657,243012\n657,243287\n657,243947\n657,244079\n657,244089\n657,244102\n657,244642\n657,245386\n657,247979\n657,248555\n657,249157\n657,249281\n657,250813\n657,251283\n657,251451\n657,251885\n657,252946\n657,254908\n657,255024\n657,255627\n657,258372\n657,260170\n657,260366\n657,262504\n657,264527\n658,87\n658,457\n658,623\n658,919\n658,1805\n658,1836\n658,2373\n658,4760\n658,15609\n658,162599\n659,54\n659,660\n659,692\n659,706\n659,754\n659,912\n659,1193\n659,1610\n659,1770\n659,1843\n659,2253\n659,2290\n659,2424\n659,5019\n659,5085\n659,5721\n659,6506\n659,9788\n659,13240\n659,13276\n659,13781\n659,15222\n659,15289\n659,15352\n659,16146\n659,17927\n659,17930\n659,18829\n659,28282\n659,34078\n660,19\n660,54\n660,135\n660,222\n660,278\n660,313\n660,385\n660,389\n660,401\n660,634\n660,660\n660,692\n660,706\n660,754\n660,781\n660,784\n660,912\n660,1069\n660,1610\n660,1618\n660,1724\n660,1843\n660,1916\n660,2159\n660,2253\n660,2290\n660,2424\n660,2516\n660,2553\n660,2646\n660,2775\n660,3252\n660,4799\n660,5019\n660,5085\n660,5721\n660,5933\n660,6506\n660,7698\n660,8431\n660,9788\n660,13240\n660,13781\n660,15352\n660,16412\n660,17573\n660,17927\n660,18831\n660,19352\n660,19443\n660,21636\n660,26161\n660,30319\n660,33792\n660,34078\n660,37048\n660,37685\n660,37952\n660,37961\n660,40450\n660,40566\n660,44351\n660,45096\n660,48085\n660,50325\n660,52749\n660,62298\n660,74555\n660,76854\n660,79940\n660,79966\n660,86118\n660,86420\n660,86433\n660,86559\n660,91260\n660,101546\n660,107528\n660,107639\n660,109298\n660,113639\n660,120877\n660,121060\n660,121379\n660,122503\n660,130927\n660,136649\n660,146358\n660,147226\n660,150584\n660,150598\n660,155806\n660,174467\n660,176464\n660,177886\n660,182507\n660,190108\n660,207659\n660,218904\n660,220888\n660,225626\n660,251986\n660,252006\n661,372\n661,623\n661,818\n661,919\n661,1805\n661,1949\n662,663\n662,664\n663,37\n663,56\n663,86\n663,106\n663,146\n663,158\n663,167\n663,175\n663,192\n663,202\n663,203\n663,207\n663,251\n663,287\n663,299\n663,301\n663,314\n663,333\n663,336\n663,337\n663,435\n663,446\n663,469\n663,505\n663,509\n663,510\n663,567\n663,586\n663,615\n663,620\n663,640\n663,647\n663,662\n663,663\n663,664\n663,685\n663,693\n663,698\n663,702\n663,717\n663,720\n663,788\n663,809\n663,852\n663,874\n663,875\n663,907\n663,911\n663,918\n663,932\n663,937\n663,947\n663,968\n663,972\n663,973\n663,1010\n663,1011\n663,1014\n663,1089\n663,1117\n663,1122\n663,1124\n663,1210\n663,1231\n663,1243\n663,1284\n663,1293\n663,1298\n663,1319\n663,1326\n663,1370\n663,1388\n663,1436\n663,1493\n663,1616\n663,1623\n663,1647\n663,1732\n663,1774\n663,1821\n663,1837\n663,1848\n663,1849\n663,1985\n663,1993\n663,2045\n663,2260\n663,2400\n663,2782\n663,2903\n663,3367\n663,3370\n663,3392\n663,3422\n663,3999\n663,4272\n663,4359\n663,5356\n663,5414\n663,5662\n663,6519\n663,6625\n663,6671\n663,6684\n663,7087\n663,7349\n663,7435\n663,8244\n663,8309\n663,9213\n663,11890\n663,12112\n663,13428\n663,13435\n663,13464\n663,14060\n663,14432\n663,14448\n663,14453\n663,14483\n663,14598\n663,14752\n663,15113\n663,15229\n663,15304\n663,15313\n663,15624\n663,15770\n663,16010\n663,16572\n663,16774\n663,16866\n663,16949\n663,17249\n663,18526\n663,19863\n663,21350\n663,21528\n663,22259\n663,23517\n663,24163\n663,24173\n663,24741\n663,24825\n663,26034\n663,26080\n663,27052\n663,27495\n663,28716\n663,29008\n663,29747\n663,30999\n663,31080\n663,31094\n663,31163\n663,32784\n663,33402\n663,33410\n663,33474\n663,33537\n663,33602\n663,33988\n663,34084\n663,34178\n663,34253\n663,34267\n663,36008\n663,36100\n663,36357\n663,36444\n663,36616\n663,37359\n663,37481\n663,37486\n663,37707\n663,38140\n663,38688\n663,40782\n663,41987\n663,42491\n663,43559\n663,43885\n663,46286\n663,46995\n663,48245\n663,50683\n663,51236\n663,53977\n663,54871\n663,55917\n663,58763\n663,59454\n663,59464\n663,59544\n663,59700\n663,59844\n663,60549\n663,60558\n663,60586\n663,60601\n663,61354\n663,62851\n663,62852\n663,62904\n663,63012\n663,63634\n663,64153\n663,64396\n663,66599\n663,68082\n663,69613\n663,69871\n663,71027\n663,71968\n663,72434\n663,72764\n663,73336\n663,75236\n663,75819\n663,76106\n663,76820\n663,76844\n663,77633\n663,77728\n663,78059\n663,79359\n663,79880\n663,79881\n663,82147\n663,82794\n663,85792\n663,85871\n663,88012\n663,88936\n663,89754\n663,91985\n663,92476\n663,96724\n663,101838\n663,103860\n663,104472\n663,105746\n663,106502\n663,107992\n663,108166\n663,110115\n663,110157\n663,110690\n663,112061\n663,112812\n663,112961\n663,114448\n663,114563\n663,115479\n663,115493\n663,116210\n663,116278\n663,117974\n663,120205\n663,122661\n663,124404\n663,124468\n663,127169\n663,128783\n663,128787\n663,130340\n663,131248\n663,131289\n663,132882\n663,133892\n663,134888\n663,137054\n663,138064\n663,138472\n663,139537\n663,139562\n663,139635\n663,139638\n663,139658\n663,140409\n663,140448\n663,140518\n663,140521\n663,140757\n663,140831\n663,140835\n663,140844\n663,141151\n663,141861\n663,141866\n663,141949\n663,141953\n663,142163\n663,142268\n663,142274\n663,142546\n663,142551\n663,142787\n663,142798\n663,142805\n663,143274\n663,143340\n663,143697\n663,144900\n663,145366\n663,145369\n663,145374\n663,145387\n663,145389\n663,145403\n663,145451\n663,145452\n663,145458\n663,145464\n663,145465\n663,145472\n663,145475\n663,145486\n663,145487\n663,145517\n663,145526\n663,145528\n663,145542\n663,145545\n663,145571\n663,145573\n663,145576\n663,145580\n663,145589\n663,145590\n663,145603\n663,145604\n663,145607\n663,145611\n663,145621\n663,145623\n663,145624\n663,145635\n663,145638\n663,145642\n663,145644\n663,145648\n663,145650\n663,145995\n663,145996\n663,146027\n663,146031\n663,146299\n663,146572\n663,147347\n663,147859\n663,149173\n663,152615\n663,153234\n663,153243\n663,153253\n663,153256\n663,153262\n663,153264\n663,156224\n663,156258\n663,157393\n663,158580\n663,158582\n663,161172\n663,165442\n663,167426\n663,168463\n663,169627\n663,179780\n663,179927\n663,180661\n663,180965\n663,181832\n663,185707\n663,188782\n663,188818\n663,189915\n663,189926\n663,189945\n663,191990\n663,192493\n663,205091\n663,205673\n663,211971\n663,212313\n663,215527\n663,216584\n663,218325\n663,223807\n663,229653\n663,230416\n663,230421\n663,231721\n663,233154\n663,234100\n663,236163\n663,236724\n663,238767\n663,241064\n663,244120\n663,245901\n663,247366\n663,248800\n663,253029\n663,253162\n663,253377\n663,254314\n665,666\n665,744\n665,750\n665,762\n665,1124\n665,1167\n666,665\n666,750\n666,762\n666,854\n666,1040\n666,1167\n666,1298\n666,1616\n666,2942\n666,4359\n666,8720\n666,41877\n666,72764\n666,80505\n666,88335\n666,98279\n666,124668\n666,130442\n666,149246\n666,154325\n666,171641\n666,174776\n666,177293\n666,180227\n666,192998\n666,194929\n666,217478\n666,220315\n666,220575\n666,223112\n666,224322\n666,224765\n666,225280\n666,226310\n666,227501\n666,238128\n666,248666\n666,260783\n667,668\n668,11\n668,15\n668,20\n668,102\n668,146\n668,178\n668,186\n668,207\n668,256\n668,259\n668,336\n668,338\n668,397\n668,481\n668,497\n668,505\n668,516\n668,567\n668,581\n668,611\n668,622\n668,667\n668,668\n668,673\n668,676\n668,685\n668,690\n668,712\n668,713\n668,717\n668,750\n668,762\n668,799\n668,838\n668,841\n668,843\n668,849\n668,859\n668,911\n668,918\n668,972\n668,992\n668,1014\n668,1021\n668,1087\n668,1130\n668,1135\n668,1172\n668,1175\n668,1262\n668,1402\n668,1419\n668,1556\n668,1559\n668,1603\n668,1607\n668,1623\n668,1655\n668,1724\n668,1785\n668,1880\n668,1925\n668,2310\n668,2411\n668,2460\n668,2512\n668,2607\n668,2626\n668,2923\n668,3597\n668,3967\n668,4190\n668,4276\n668,4806\n668,5100\n668,5129\n668,5136\n668,5213\n668,5591\n668,6588\n668,6824\n668,6861\n668,6891\n668,8150\n668,9379\n668,13661\n668,14556\n668,15135\n668,15624\n668,16538\n668,18298\n668,19413\n668,19453\n668,21260\n668,23437\n668,25646\n668,26450\n668,29823\n668,32468\n668,33595\n668,33596\n668,39473\n668,40360\n668,47826\n668,48169\n668,48943\n668,48963\n668,51905\n668,52488\n668,55566\n668,56214\n668,56215\n668,56946\n668,56948\n668,58808\n668,62417\n668,63998\n668,67898\n668,68636\n668,77743\n668,82217\n668,84039\n668,84657\n668,87310\n668,92289\n668,92476\n668,92622\n668,98798\n668,105495\n668,112706\n668,112936\n668,113513\n668,120068\n668,126876\n668,131641\n668,132938\n668,140791\n668,141903\n668,144043\n668,144837\n668,146917\n668,148346\n668,148353\n668,150756\n668,156237\n668,157045\n668,173256\n668,180662\n668,187262\n668,189710\n668,191395\n668,192911\n668,211825\n668,212315\n668,214082\n668,230435\n668,232021\n668,234653\n668,234675\n668,254473\n668,256799\n668,256822\n668,256823\n668,261684\n668,263569\n669,360\n669,4252\n670,346\n670,671\n671,10\n671,20\n671,175\n671,178\n671,315\n671,346\n671,434\n671,435\n671,439\n671,446\n671,447\n671,538\n671,622\n671,670\n671,671\n671,673\n671,676\n671,685\n671,693\n671,911\n671,934\n671,939\n671,996\n671,1033\n671,1068\n671,1294\n671,1328\n671,1435\n671,1474\n671,1565\n671,1590\n671,1612\n671,1644\n671,1651\n671,1789\n671,1790\n671,1848\n671,1973\n671,2094\n671,2340\n671,2352\n671,2353\n671,2427\n671,2511\n671,3241\n671,3462\n671,3626\n671,4514\n671,4646\n671,5189\n671,5900\n671,6422\n671,6533\n671,6622\n671,6966\n671,7087\n671,7117\n671,7318\n671,8128\n671,13242\n671,15141\n671,15179\n671,15345\n671,17421\n671,17423\n671,17424\n671,17425\n671,17426\n671,17432\n671,17646\n671,18011\n671,18124\n671,19930\n671,23138\n671,24511\n671,24620\n671,24934\n671,26966\n671,29057\n671,30775\n671,31170\n671,32596\n671,32630\n671,32801\n671,35498\n671,37771\n671,38158\n671,38407\n671,38779\n671,39412\n671,39460\n671,40497\n671,49479\n671,54688\n671,59177\n671,62507\n671,65311\n671,66102\n671,68887\n671,68917\n671,75045\n671,77575\n671,79861\n671,81071\n671,90657\n671,92274\n671,92926\n671,96472\n671,96789\n671,98227\n671,104347\n671,106377\n671,111275\n671,111712\n671,116017\n671,119443\n671,119561\n671,120052\n671,120155\n671,125484\n671,128397\n671,129891\n671,130206\n671,133112\n671,134185\n671,138288\n671,139474\n671,139612\n671,145088\n671,146836\n671,149267\n671,156705\n671,159089\n671,159676\n671,161038\n671,163378\n671,164266\n671,167065\n671,170873\n671,179516\n671,185287\n671,189128\n671,189246\n671,191352\n671,200344\n671,213897\n671,214641\n671,217890\n671,223876\n671,230968\n671,235867\n671,236556\n671,237301\n671,238016\n671,238660\n671,253099\n672,673\n672,1130\n673,11\n673,20\n673,22\n673,68\n673,86\n673,120\n673,158\n673,160\n673,167\n673,182\n673,202\n673,203\n673,207\n673,209\n673,240\n673,256\n673,259\n673,287\n673,292\n673,302\n673,314\n673,336\n673,338\n673,346\n673,356\n673,360\n673,388\n673,397\n673,414\n673,433\n673,440\n673,441\n673,446\n673,452\n673,462\n673,467\n673,489\n673,497\n673,500\n673,505\n673,509\n673,516\n673,534\n673,538\n673,599\n673,604\n673,615\n673,622\n673,626\n673,631\n673,668\n673,672\n673,676\n673,685\n673,690\n673,693\n673,694\n673,697\n673,704\n673,710\n673,764\n673,775\n673,794\n673,801\n673,809\n673,818\n673,849\n673,872\n673,893\n673,911\n673,918\n673,920\n673,929\n673,972\n673,1011\n673,1012\n673,1014\n673,1021\n673,1089\n673,1090\n673,1130\n673,1204\n673,1240\n673,1243\n673,1267\n673,1293\n673,1298\n673,1326\n673,1345\n673,1417\n673,1445\n673,1453\n673,1454\n673,1531\n673,1551\n673,1566\n673,1623\n673,1634\n673,1653\n673,1655\n673,1663\n673,1677\n673,1688\n673,1715\n673,1722\n673,1724\n673,1796\n673,1803\n673,1805\n673,1844\n673,1893\n673,1968\n673,1992\n673,2083\n673,2253\n673,2373\n673,2400\n673,2436\n673,2460\n673,2512\n673,2995\n673,3392\n673,3507\n673,3690\n673,3804\n673,3937\n673,4147\n673,4190\n673,4220\n673,4276\n673,5261\n673,5300\n673,5686\n673,5726\n673,6929\n673,7973\n673,8149\n673,8370\n673,9740\n673,13323\n673,15109\n673,15344\n673,15551\n673,16208\n673,18477\n673,19413\n673,19662\n673,21382\n673,21442\n673,21462\n673,21994\n673,23471\n673,23487\n673,23646\n673,24707\n673,26156\n673,26161\n673,26767\n673,26901\n673,29165\n673,32528\n673,32532\n673,35581\n673,36741\n673,37321\n673,40337\n673,42614\n673,48441\n673,48462\n673,48898\n673,50159\n673,52193\n673,56422\n673,56567\n673,57086\n673,58898\n673,72466\n673,75912\n673,78881\n673,80956\n673,82531\n673,94910\n673,94958\n673,105695\n673,115474\n673,118331\n673,119943\n673,120927\n673,121493\n673,122975\n673,123812\n673,124374\n673,134591\n673,134599\n673,138794\n673,141912\n673,152827\n673,155445\n673,155450\n673,159855\n673,165205\n673,165361\n673,165365\n673,165367\n673,165375\n673,165376\n673,165380\n673,172513\n673,177745\n673,180260\n673,180358\n673,187221\n673,189242\n673,190373\n673,191130\n673,197935\n673,202602\n673,205104\n673,215874\n673,216616\n673,216660\n673,253104\n673,253151\n673,253195\n674,83\n674,675\n674,143287\n676,20\n676,32\n676,68\n676,87\n676,130\n676,158\n676,207\n676,240\n676,259\n676,261\n676,299\n676,336\n676,390\n676,397\n676,431\n676,439\n676,441\n676,505\n676,509\n676,534\n676,535\n676,567\n676,577\n676,604\n676,623\n676,626\n676,640\n676,673\n676,676\n676,677\n676,685\n676,697\n676,764\n676,779\n676,801\n676,809\n676,838\n676,849\n676,911\n676,920\n676,929\n676,972\n676,1014\n676,1033\n676,1118\n676,1119\n676,1140\n676,1147\n676,1191\n676,1204\n676,1240\n676,1285\n676,1293\n676,1294\n676,1326\n676,1345\n676,1402\n676,1417\n676,1419\n676,1445\n676,1566\n676,1623\n676,1653\n676,1655\n676,1724\n676,1789\n676,1992\n676,2211\n676,2373\n676,2460\n676,2480\n676,2511\n676,2512\n676,2590\n676,2620\n676,3392\n676,3474\n676,3524\n676,3653\n676,3804\n676,4276\n676,4314\n676,4336\n676,5547\n676,5833\n676,6452\n676,9457\n676,18298\n676,18964\n676,19413\n676,20757\n676,21442\n676,26190\n676,38314\n676,42064\n676,50450\n676,69997\n676,75912\n676,81233\n676,99732\n676,102518\n676,106114\n676,108058\n676,112441\n676,114751\n676,115474\n676,118336\n676,124668\n676,126097\n676,128516\n676,157727\n676,162599\n676,170665\n676,179804\n676,188530\n676,200343\n676,206098\n676,207659\n676,220910\n677,10\n677,30\n677,35\n677,41\n677,47\n677,68\n677,72\n677,81\n677,85\n677,104\n677,107\n677,111\n677,116\n677,120\n677,134\n677,135\n677,136\n677,137\n677,138\n677,151\n677,167\n677,188\n677,200\n677,211\n677,215\n677,217\n677,225\n677,227\n677,233\n677,240\n677,248\n677,254\n677,258\n677,261\n677,264\n677,289\n677,290\n677,292\n677,294\n677,298\n677,301\n677,304\n677,312\n677,314\n677,323\n677,328\n677,332\n677,364\n677,372\n677,383\n677,390\n677,392\n677,397\n677,406\n677,417\n677,420\n677,431\n677,442\n677,450\n677,455\n677,479\n677,503\n677,518\n677,525\n677,534\n677,557\n677,588\n677,589\n677,590\n677,592\n677,596\n677,609\n677,615\n677,626\n677,631\n677,636\n677,676\n677,694\n677,704\n677,714\n677,749\n677,760\n677,772\n677,784\n677,801\n677,805\n677,818\n677,838\n677,850\n677,862\n677,872\n677,943\n677,953\n677,954\n677,968\n677,1001\n677,1007\n677,1014\n677,1016\n677,1019\n677,1046\n677,1082\n677,1085\n677,1102\n677,1119\n677,1140\n677,1149\n677,1177\n677,1179\n677,1203\n677,1204\n677,1210\n677,1212\n677,1235\n677,1238\n677,1257\n677,1267\n677,1282\n677,1285\n677,1287\n677,1305\n677,1309\n677,1326\n677,1332\n677,1335\n677,1359\n677,1368\n677,1370\n677,1381\n677,1388\n677,1402\n677,1415\n677,1432\n677,1434\n677,1445\n677,1462\n677,1466\n677,1509\n677,1511\n677,1533\n677,1564\n677,1572\n677,1579\n677,1608\n677,1631\n677,1635\n677,1653\n677,1659\n677,1688\n677,1715\n677,1722\n677,1745\n677,1749\n677,1782\n677,1785\n677,1796\n677,1807\n677,1818\n677,1844\n677,1882\n677,1888\n677,1893\n677,1939\n677,1955\n677,1962\n677,1980\n677,2008\n677,2087\n677,2105\n677,2205\n677,2206\n677,2209\n677,2210\n677,2286\n677,2296\n677,2315\n677,2334\n677,2351\n677,2379\n677,2416\n677,2417\n677,2436\n677,2443\n677,2469\n677,2512\n677,2572\n677,2590\n677,2596\n677,2620\n677,2701\n677,2775\n677,2797\n677,2807\n677,2812\n677,2889\n677,2989\n677,2991\n677,2995\n677,3069\n677,3085\n677,3115\n677,3129\n677,3135\n677,3238\n677,3246\n677,3247\n677,3319\n677,3328\n677,3467\n677,3474\n677,3538\n677,3585\n677,3623\n677,3695\n677,3804\n677,4039\n677,4146\n677,4218\n677,4220\n677,4222\n677,4237\n677,4276\n677,4355\n677,4475\n677,4549\n677,4571\n677,4771\n677,5265\n677,5405\n677,5718\n677,6068\n677,6452\n677,6837\n677,7124\n677,7155\n677,7194\n677,7270\n677,8180\n677,8537\n677,8884\n677,8989\n677,8990\n677,8991\n677,8992\n677,8993\n677,8994\n677,8995\n677,8996\n677,8997\n677,8998\n677,8999\n677,9000\n677,9001\n677,9002\n677,9003\n677,9004\n677,9005\n677,9006\n677,9007\n677,9008\n677,9009\n677,9010\n677,9011\n677,9012\n677,9013\n677,9014\n677,9015\n677,9016\n677,9017\n677,9018\n677,9019\n677,9020\n677,9021\n677,9022\n677,9023\n677,9024\n677,9025\n677,9026\n677,9027\n677,9028\n677,9029\n677,9030\n677,9031\n677,9032\n677,10318\n677,11147\n677,14819\n677,20535\n677,20813\n677,27041\n677,27550\n677,31497\n677,32914\n677,33424\n677,44725\n677,66297\n677,74696\n677,76086\n677,94134\n677,95674\n677,111142\n677,127158\n677,136072\n677,172012\n677,176782\n677,178576\n677,182162\n677,185877\n677,205488\n677,245910\n677,258887\n678,4\n678,5\n679,390\n680,389\n681,79\n681,149\n681,195\n682,1\n682,83\n682,106\n682,107\n682,147\n682,192\n682,251\n682,252\n682,306\n682,307\n682,493\n682,516\n682,599\n682,621\n682,650\n682,682\n682,683\n682,685\n682,693\n682,733\n682,852\n682,911\n682,998\n682,1220\n682,1222\n682,1243\n682,1353\n682,1359\n682,1504\n682,1512\n682,1568\n682,1601\n682,1618\n682,1886\n682,1927\n682,1985\n682,2033\n682,2244\n682,2374\n682,2552\n682,2646\n682,2775\n682,2944\n682,3377\n682,4234\n682,4525\n682,5356\n682,5409\n682,5682\n682,5822\n682,5992\n682,9465\n682,13137\n682,13339\n682,13538\n682,13626\n682,16201\n682,16521\n682,17573\n682,18479\n682,19854\n682,20285\n682,20780\n682,21401\n682,21528\n682,22162\n682,22939\n682,23517\n682,24242\n682,24287\n682,26061\n682,26156\n682,26450\n682,27495\n682,30939\n682,35577\n682,37440\n682,39618\n682,40542\n682,40569\n682,41096\n682,41170\n682,43776\n682,44897\n682,45684\n682,50123\n682,58820\n682,60381\n682,63434\n682,63945\n682,64555\n682,65493\n682,66559\n682,66743\n682,67885\n682,70125\n682,70356\n682,70733\n682,70896\n682,72068\n682,72439\n682,75103\n682,75992\n682,77554\n682,79879\n682,82929\n682,86765\n682,88199\n682,89843\n682,91385\n682,96288\n682,99990\n682,101741\n682,106759\n682,114523\n682,124882\n682,125401\n682,131754\n682,138816\n682,142774\n682,143341\n682,143344\n682,143424\n682,145922\n682,152437\n682,156682\n682,157209\n682,162944\n682,165676\n682,168913\n682,173713\n682,174385\n682,174386\n682,175892\n682,175999\n682,189817\n682,189819\n682,189839\n682,198338\n682,201299\n682,205637\n682,215276\n682,222369\n682,224195\n682,224205\n682,229782\n682,234079\n682,234941\n682,236520\n682,244807\n682,245912\n682,261784\n683,307\n683,682\n683,72439\n684,685\n684,827\n684,1011\n684,1243\n684,4637\n685,30\n685,32\n685,37\n685,41\n685,63\n685,71\n685,83\n685,87\n685,102\n685,107\n685,134\n685,146\n685,147\n685,149\n685,158\n685,175\n685,200\n685,202\n685,207\n685,211\n685,240\n685,248\n685,251\n685,252\n685,256\n685,259\n685,261\n685,264\n685,272\n685,278\n685,287\n685,289\n685,290\n685,292\n685,301\n685,304\n685,313\n685,314\n685,332\n685,344\n685,349\n685,356\n685,379\n685,388\n685,417\n685,440\n685,441\n685,446\n685,452\n685,462\n685,467\n685,481\n685,485\n685,489\n685,493\n685,509\n685,512\n685,516\n685,536\n685,557\n685,575\n685,577\n685,599\n685,609\n685,615\n685,623\n685,626\n685,636\n685,663\n685,664\n685,668\n685,671\n685,676\n685,682\n685,684\n685,685\n685,690\n685,693\n685,694\n685,702\n685,704\n685,712\n685,726\n685,733\n685,772\n685,775\n685,787\n685,794\n685,805\n685,809\n685,818\n685,827\n685,838\n685,841\n685,843\n685,849\n685,852\n685,862\n685,872\n685,900\n685,911\n685,918\n685,929\n685,949\n685,972\n685,973\n685,980\n685,991\n685,1001\n685,1007\n685,1010\n685,1011\n685,1014\n685,1021\n685,1058\n685,1070\n685,1087\n685,1096\n685,1113\n685,1132\n685,1133\n685,1146\n685,1151\n685,1167\n685,1172\n685,1188\n685,1192\n685,1220\n685,1222\n685,1238\n685,1240\n685,1243\n685,1267\n685,1281\n685,1285\n685,1293\n685,1298\n685,1309\n685,1319\n685,1332\n685,1345\n685,1353\n685,1368\n685,1388\n685,1402\n685,1417\n685,1434\n685,1436\n685,1465\n685,1504\n685,1515\n685,1566\n685,1580\n685,1608\n685,1619\n685,1623\n685,1634\n685,1655\n685,1663\n685,1708\n685,1715\n685,1724\n685,1732\n685,1782\n685,1801\n685,1805\n685,1807\n685,1818\n685,1836\n685,1844\n685,1848\n685,1860\n685,1881\n685,1888\n685,1893\n685,1955\n685,1985\n685,1992\n685,2006\n685,2045\n685,2296\n685,2334\n685,2367\n685,2424\n685,2460\n685,2512\n685,2572\n685,2590\n685,2607\n685,2620\n685,2779\n685,2782\n685,2784\n685,2812\n685,2874\n685,2923\n685,2944\n685,2995\n685,3069\n685,3135\n685,3182\n685,3328\n685,3422\n685,3507\n685,3509\n685,3513\n685,3538\n685,3555\n685,3564\n685,3582\n685,3595\n685,3623\n685,3967\n685,4039\n685,4123\n685,4190\n685,4220\n685,4222\n685,4257\n685,4271\n685,4276\n685,4277\n685,5213\n685,5356\n685,5405\n685,5591\n685,5647\n685,5815\n685,5961\n685,6068\n685,6430\n685,6552\n685,6638\n685,6689\n685,6883\n685,7194\n685,7318\n685,7968\n685,8149\n685,8276\n685,9015\n685,9028\n685,9457\n685,13538\n685,13576\n685,14145\n685,14519\n685,14527\n685,15128\n685,15523\n685,16201\n685,16614\n685,19010\n685,19543\n685,20539\n685,21152\n685,21442\n685,22389\n685,22711\n685,23322\n685,23437\n685,23674\n685,25526\n685,25573\n685,26450\n685,26928\n685,28141\n685,30328\n685,30331\n685,30508\n685,30557\n685,32630\n685,32976\n685,33287\n685,35497\n685,38996\n685,41230\n685,41378\n685,44725\n685,44896\n685,45028\n685,48278\n685,48505\n685,54387\n685,56567\n685,57006\n685,58527\n685,62822\n685,66297\n685,70845\n685,71610\n685,72439\n685,73216\n685,73280\n685,75045\n685,75196\n685,75912\n685,76813\n685,78130\n685,80619\n685,81233\n685,81775\n685,82739\n685,90754\n685,90756\n685,90761\n685,92476\n685,93083\n685,94134\n685,97322\n685,98239\n685,99732\n685,106261\n685,107502\n685,113021\n685,114065\n685,114539\n685,117771\n685,118254\n685,118336\n685,122905\n685,130144\n685,134298\n685,135235\n685,135236\n685,145340\n685,148362\n685,148413\n685,150430\n685,151454\n685,152460\n685,152566\n685,153710\n685,155719\n685,156931\n685,162574\n685,166981\n685,169864\n685,171778\n685,173674\n685,173684\n685,174453\n685,179252\n685,185877\n685,212455\n685,214131\n685,221828\n685,263818\n686,687\n687,1374\n688,626\n689,163\n689,467\n689,571\n689,690\n689,788\n689,868\n690,259\n690,314\n690,356\n690,446\n690,599\n690,668\n690,673\n690,685\n690,689\n690,690\n690,788\n690,796\n690,849\n690,852\n690,859\n690,1531\n690,2373\n690,3724\n690,4446\n690,6476\n690,7921\n690,14470\n690,15510\n690,15635\n690,28813\n690,37022\n690,37809\n690,41526\n690,44209\n690,48419\n690,50332\n690,54807\n690,61213\n690,62844\n690,70994\n690,71704\n690,73350\n690,75883\n690,78678\n690,79939\n690,91897\n690,103227\n690,107466\n690,107600\n690,107984\n690,109304\n690,111792\n690,112948\n690,121385\n690,126476\n690,126619\n690,127827\n690,140354\n690,140377\n690,141773\n690,173347\n690,229580\n691,32\n691,87\n691,392\n691,697\n691,872\n691,1836\n692,389\n692,660\n693,1\n693,5\n693,10\n693,30\n693,68\n693,71\n693,81\n693,83\n693,97\n693,106\n693,135\n693,175\n693,192\n693,200\n693,272\n693,287\n693,292\n693,298\n693,313\n693,328\n693,372\n693,389\n693,390\n693,393\n693,397\n693,402\n693,403\n693,417\n693,431\n693,467\n693,485\n693,510\n693,512\n693,535\n693,557\n693,563\n693,589\n693,631\n693,663\n693,664\n693,671\n693,673\n693,682\n693,685\n693,693\n693,694\n693,697\n693,704\n693,746\n693,809\n693,818\n693,841\n693,862\n693,868\n693,873\n693,874\n693,911\n693,937\n693,968\n693,972\n693,973\n693,1001\n693,1010\n693,1085\n693,1105\n693,1113\n693,1118\n693,1149\n693,1179\n693,1188\n693,1210\n693,1238\n693,1240\n693,1243\n693,1281\n693,1284\n693,1285\n693,1298\n693,1309\n693,1319\n693,1345\n693,1417\n693,1566\n693,1590\n693,1619\n693,1623\n693,1634\n693,1688\n693,1708\n693,1722\n693,1773\n693,1776\n693,1801\n693,1803\n693,1849\n693,1888\n693,1927\n693,1985\n693,2045\n693,2379\n693,2427\n693,2496\n693,2572\n693,2620\n693,2775\n693,2979\n693,2995\n693,3009\n693,3067\n693,3422\n693,3507\n693,4220\n693,4260\n693,4455\n693,4691\n693,5213\n693,5265\n693,5718\n693,6062\n693,6068\n693,6424\n693,6621\n693,7117\n693,7318\n693,7795\n693,8414\n693,13352\n693,14415\n693,14483\n693,15528\n693,15547\n693,15552\n693,15676\n693,16014\n693,17125\n693,17942\n693,19216\n693,19877\n693,19894\n693,20004\n693,20030\n693,25857\n693,26412\n693,26450\n693,30999\n693,32268\n693,32751\n693,33354\n693,34212\n693,34295\n693,34808\n693,35400\n693,35503\n693,36924\n693,41230\n693,43141\n693,45004\n693,45140\n693,48955\n693,51933\n693,58836\n693,67536\n693,70021\n693,70212\n693,70848\n693,70997\n693,75912\n693,79032\n693,81233\n693,81262\n693,82004\n693,83416\n693,83438\n693,84748\n693,85751\n693,85814\n693,89434\n693,91008\n693,93113\n693,93311\n693,98251\n693,98384\n693,99750\n693,99807\n693,100351\n693,102096\n693,102516\n693,104354\n693,113878\n693,114600\n693,121476\n693,124608\n693,133443\n693,134706\n693,144091\n693,144231\n693,144904\n693,147518\n693,164218\n693,165748\n693,167579\n693,168388\n693,185877\n693,187176\n693,189788\n693,189793\n693,193032\n693,193578\n693,207659\n693,212015\n693,217934\n693,219984\n693,233691\n693,242913\n693,245849\n693,246818\n693,254592\n693,255502\n693,259910\n694,41\n694,68\n694,120\n694,261\n694,314\n694,364\n694,372\n694,446\n694,575\n694,588\n694,589\n694,590\n694,631\n694,673\n694,677\n694,685\n694,693\n694,694\n694,715\n694,749\n694,795\n694,805\n694,862\n694,875\n694,911\n694,949\n694,1010\n694,1069\n694,1118\n694,1242\n694,1353\n694,1388\n694,1466\n694,1504\n694,1512\n694,1564\n694,1566\n694,1608\n694,1634\n694,1678\n694,1808\n694,1955\n694,2045\n694,2210\n694,2253\n694,2290\n694,2373\n694,2512\n694,2646\n694,2775\n694,2812\n694,2824\n694,2991\n694,3115\n694,3517\n694,3582\n694,3623\n694,3943\n694,3964\n694,3993\n694,4231\n694,4266\n694,4377\n694,4752\n694,5186\n694,5331\n694,5935\n694,6477\n694,6773\n694,6828\n694,6856\n694,7041\n694,7196\n694,7266\n694,7896\n694,7944\n694,8535\n694,9467\n694,9756\n694,13274\n694,13304\n694,13411\n694,13657\n694,14068\n694,14109\n694,14302\n694,14358\n694,14730\n694,14820\n694,15619\n694,15711\n694,15931\n694,18746\n694,19561\n694,19857\n694,20540\n694,20723\n694,21488\n694,22168\n694,22839\n694,23334\n694,24971\n694,25272\n694,26034\n694,26341\n694,27661\n694,28338\n694,28562\n694,28812\n694,29038\n694,29741\n694,30268\n694,30328\n694,31035\n694,31397\n694,32591\n694,32751\n694,32929\n694,34013\n694,34515\n694,37730\n694,38153\n694,38316\n694,38317\n694,38318\n694,40682\n694,41124\n694,41951\n694,42070\n694,42443\n694,42762\n694,42779\n694,44293\n694,44725\n694,44838\n694,45886\n694,49239\n694,49647\n694,50318\n694,50861\n694,51505\n694,52187\n694,54979\n694,57099\n694,57351\n694,59818\n694,60079\n694,60385\n694,61205\n694,61692\n694,62286\n694,63966\n694,64108\n694,66468\n694,67266\n694,67425\n694,71031\n694,74084\n694,74419\n694,75239\n694,75971\n694,80111\n694,80944\n694,82162\n694,82169\n694,82570\n694,83379\n694,86619\n694,86659\n694,91846\n694,92237\n694,97461\n694,97545\n694,103045\n694,103052\n694,106827\n694,107062\n694,107911\n694,115972\n694,117662\n694,120186\n694,123420\n694,125056\n694,127299\n694,128888\n694,129563\n694,130891\n694,131330\n694,131876\n694,131927\n694,135270\n694,136228\n694,136507\n694,136617\n694,140100\n694,141867\n694,142422\n694,142475\n694,142558\n694,146039\n694,146401\n694,146646\n694,153336\n694,154527\n694,154686\n694,155740\n694,156226\n694,156352\n694,156693\n694,157303\n694,158212\n694,163811\n694,165262\n694,165303\n694,170010\n694,172556\n694,173477\n694,175458\n694,177237\n694,181562\n694,181788\n694,181881\n694,182162\n694,184785\n694,186482\n694,189428\n694,190239\n694,190394\n694,190412\n694,191376\n694,199645\n694,206338\n694,212327\n694,212429\n694,212438\n694,212456\n694,212465\n694,212975\n694,213080\n694,214010\n694,214810\n694,215846\n694,217836\n694,217898\n694,219908\n694,224571\n694,224631\n694,224713\n694,224728\n694,224788\n694,224827\n694,225365\n694,225408\n694,225412\n694,225415\n694,225418\n694,225422\n694,225425\n694,225431\n694,225437\n694,225438\n694,225447\n694,225458\n694,225681\n694,227209\n694,228134\n694,228210\n694,228410\n694,228943\n694,229169\n694,230488\n694,230736\n694,232104\n694,232579\n694,232580\n694,232605\n694,232811\n694,232883\n694,233339\n694,233378\n694,234132\n694,235852\n694,235876\n694,236134\n694,236142\n694,236191\n694,236915\n694,237526\n694,238921\n694,240174\n694,240995\n694,241143\n694,241640\n694,242262\n694,244593\n694,245386\n694,247187\n694,247214\n694,248593\n694,250685\n694,253182\n694,253183\n694,253482\n694,254398\n694,254410\n694,254503\n696,697\n697,207\n697,314\n697,356\n697,440\n697,452\n697,509\n697,510\n697,599\n697,623\n697,673\n697,676\n697,697\n697,809\n697,818\n697,838\n697,852\n697,868\n697,872\n697,911\n697,919\n697,1011\n697,1014\n697,1046\n697,1130\n697,1210\n697,1240\n697,1345\n697,1465\n697,1634\n697,1801\n697,1805\n697,1860\n697,1973\n697,2373\n697,3507\n697,4190\n697,4760\n697,19010\n697,127158\n697,138686\n698,37\n698,346\n698,444\n698,446\n698,567\n698,604\n698,663\n698,685\n698,698\n698,699\n698,717\n698,762\n698,936\n698,937\n698,938\n698,1136\n698,1215\n698,1231\n698,1293\n698,1740\n698,1782\n698,3422\n698,4190\n698,5262\n698,7339\n698,13353\n698,13454\n698,13991\n698,24629\n698,25255\n698,34162\n698,37362\n698,42602\n698,44808\n698,46638\n698,68131\n698,77637\n698,78868\n698,85842\n698,89522\n698,137001\n698,137150\n698,151334\n698,161560\n698,164362\n698,165989\n698,170529\n698,175322\n698,194304\n698,216642\n698,222552\n698,224111\n698,237364\n698,247098\n699,698\n700,602\n700,42064\n701,195\n701,202\n701,203\n701,602\n701,620\n701,2244\n701,8244\n702,192\n702,256\n702,326\n702,663\n702,685\n702,693\n702,702\n702,703\n702,873\n702,874\n702,991\n702,1146\n702,1210\n702,1607\n702,4272\n702,5667\n702,17897\n702,19422\n702,24464\n702,29937\n702,37374\n702,60444\n702,64152\n702,80555\n702,91793\n702,93113\n702,103676\n702,127637\n702,127689\n702,139584\n702,143434\n702,147515\n702,168850\n702,168882\n702,179721\n702,233090\n702,234099\n702,234260\n703,87\n703,292\n703,702\n703,852\n703,1011\n703,2253\n704,10\n704,30\n704,81\n704,175\n704,215\n704,233\n704,254\n704,289\n704,290\n704,328\n704,452\n704,485\n704,502\n704,503\n704,588\n704,590\n704,592\n704,673\n704,677\n704,685\n704,693\n704,704\n704,705\n704,714\n704,760\n704,797\n704,805\n704,843\n704,849\n704,852\n704,911\n704,1011\n704,1016\n704,1118\n704,1130\n704,1149\n704,1212\n704,1257\n704,1281\n704,1282\n704,1402\n704,1511\n704,1631\n704,1796\n704,1818\n704,1844\n704,2205\n704,2206\n704,2210\n704,2286\n704,2580\n704,3067\n704,3069\n704,3507\n704,4218\n704,4237\n704,4286\n704,4358\n704,4980\n704,5265\n704,6723\n704,8110\n704,9001\n704,13495\n704,13506\n704,13563\n704,13704\n704,14500\n704,16755\n704,17573\n704,18603\n704,18816\n704,19575\n704,22125\n704,22482\n704,25536\n704,26450\n704,26552\n704,26836\n704,26837\n704,26838\n704,27080\n704,30124\n704,30733\n704,31193\n704,33138\n704,33424\n704,35440\n704,57896\n704,61692\n704,63909\n704,63956\n704,65683\n704,72425\n704,72742\n704,74547\n704,85752\n704,92519\n704,94134\n704,111142\n704,117692\n704,127750\n704,132410\n704,134822\n704,136194\n704,139599\n704,147095\n704,158379\n704,159147\n704,159908\n704,170061\n704,170229\n704,171420\n704,172243\n704,174552\n704,174558\n704,174942\n704,176782\n704,178715\n704,182162\n704,183615\n704,185125\n704,185499\n704,194659\n704,197555\n704,201872\n704,204159\n704,204175\n704,204613\n704,218791\n704,232709\n704,234075\n704,234300\n704,236983\n704,245910\n704,249787\n704,251719\n704,256452\n706,660\n707,707\n707,708\n707,867\n707,875\n707,1030\n707,1120\n707,1345\n707,1446\n707,1696\n707,1801\n707,2440\n707,3043\n707,3182\n707,3383\n707,3468\n707,3878\n707,4099\n707,5739\n707,6424\n707,6589\n707,6979\n707,7226\n707,8177\n707,9379\n707,9743\n707,13245\n707,13477\n707,13591\n707,14061\n707,14098\n707,15187\n707,15467\n707,16559\n707,16581\n707,17569\n707,19299\n707,19550\n707,23009\n707,23311\n707,24348\n707,25580\n707,28107\n707,28199\n707,29677\n707,34889\n707,37429\n707,37471\n707,41104\n707,41174\n707,44971\n707,47095\n707,48505\n707,74953\n707,79342\n707,80946\n707,98012\n707,106259\n707,124390\n707,140229\n707,151760\n707,152125\n707,159318\n707,165369\n707,165370\n707,165440\n707,165570\n707,165829\n707,166059\n707,166504\n707,166508\n707,166807\n707,167304\n707,168982\n707,170678\n707,170679\n707,170840\n707,171029\n707,171035\n707,171111\n707,171386\n707,171693\n707,171694\n707,171695\n707,172160\n707,172355\n707,172356\n707,176315\n707,178910\n707,178912\n707,179060\n707,180477\n707,181980\n707,182100\n707,182151\n707,183498\n707,183734\n707,183879\n707,184258\n707,188302\n707,189886\n707,190452\n707,190733\n707,191001\n707,192023\n707,192666\n707,193615\n707,193617\n707,193618\n707,194178\n707,194538\n707,195075\n707,195413\n707,207438\n707,212076\n707,217572\n707,217682\n707,217910\n707,232284\n707,235620\n707,245542\n707,255538\n707,255545\n707,258143\n707,264592\n708,707\n709,710\n710,11\n710,20\n710,87\n710,314\n710,397\n710,440\n710,452\n710,457\n710,500\n710,599\n710,673\n710,676\n710,1011\n710,1014\n710,1118\n710,1191\n710,1368\n710,1417\n710,1655\n710,19413\n710,21589\n711,48\n712,356\n712,452\n712,497\n712,599\n712,668\n712,713\n712,843\n712,1172\n712,1402\n712,1434\n712,2310\n712,2580\n712,3535\n712,3645\n712,3967\n712,6756\n712,15359\n712,25427\n712,25531\n712,25598\n712,28331\n712,86438\n712,97445\n712,108156\n712,116879\n712,124571\n712,130733\n712,145311\n712,150112\n712,183319\n712,243502\n713,481\n713,581\n713,668\n713,712\n713,713\n713,911\n713,1172\n713,1262\n713,1603\n713,2310\n713,3967\n713,5785\n713,6861\n713,19413\n713,20936\n713,97337\n713,98012\n713,106259\n713,136675\n713,147849\n714,24\n714,104\n714,240\n714,264\n714,289\n714,290\n714,304\n714,314\n714,328\n714,346\n714,372\n714,373\n714,441\n714,483\n714,502\n714,534\n714,588\n714,590\n714,599\n714,612\n714,631\n714,677\n714,704\n714,714\n714,715\n714,760\n714,797\n714,805\n714,862\n714,1119\n714,1147\n714,1212\n714,1252\n714,1253\n714,1282\n714,1326\n714,1402\n714,1462\n714,1511\n714,1608\n714,1641\n714,1704\n714,1738\n714,1745\n714,1962\n714,2008\n714,2193\n714,2205\n714,2206\n714,2208\n714,2286\n714,2376\n714,2443\n714,2512\n714,2572\n714,2918\n714,2965\n714,3069\n714,3508\n714,4218\n714,4222\n714,4276\n714,4308\n714,4367\n714,4402\n714,5011\n714,5225\n714,5265\n714,5574\n714,6462\n714,6856\n714,6869\n714,8012\n714,8275\n714,8279\n714,9391\n714,13207\n714,14080\n714,14603\n714,15229\n714,15397\n714,15827\n714,16210\n714,16479\n714,16709\n714,18673\n714,20869\n714,22268\n714,24839\n714,26396\n714,31893\n714,32915\n714,33424\n714,33567\n714,37741\n714,39390\n714,40589\n714,43394\n714,43878\n714,44084\n714,44725\n714,46874\n714,48451\n714,48709\n714,49035\n714,55690\n714,57910\n714,59273\n714,61004\n714,61974\n714,62361\n714,65681\n714,66868\n714,67507\n714,70305\n714,71993\n714,74547\n714,74696\n714,78696\n714,87799\n714,92656\n714,94134\n714,96712\n714,104590\n714,111142\n714,112364\n714,114064\n714,116543\n714,117695\n714,119999\n714,121616\n714,127846\n714,132240\n714,132536\n714,134329\n714,134560\n714,137957\n714,138185\n714,139848\n714,140690\n714,144988\n714,145930\n714,148090\n714,159744\n714,160101\n714,160408\n714,160484\n714,161116\n714,167063\n714,173368\n714,180972\n714,182162\n714,182606\n714,185351\n714,187955\n714,190242\n714,195069\n714,198174\n714,212302\n714,220939\n714,238366\n714,244816\n714,245910\n714,250339\n714,251212\n714,256190\n714,256953\n714,257067\n714,257129\n714,264039\n715,41\n715,48\n715,68\n715,87\n715,104\n715,107\n715,130\n715,134\n715,135\n715,138\n715,167\n715,200\n715,215\n715,225\n715,227\n715,240\n715,248\n715,254\n715,256\n715,264\n715,289\n715,290\n715,298\n715,304\n715,312\n715,323\n715,332\n715,364\n715,372\n715,417\n715,431\n715,442\n715,457\n715,557\n715,577\n715,609\n715,631\n715,636\n715,649\n715,694\n715,714\n715,749\n715,760\n715,784\n715,801\n715,805\n715,818\n715,862\n715,872\n715,932\n715,943\n715,999\n715,1001\n715,1007\n715,1012\n715,1016\n715,1052\n715,1078\n715,1082\n715,1085\n715,1119\n715,1140\n715,1147\n715,1212\n715,1282\n715,1285\n715,1326\n715,1359\n715,1368\n715,1388\n715,1392\n715,1415\n715,1432\n715,1462\n715,1466\n715,1509\n715,1631\n715,1635\n715,1659\n715,1745\n715,1749\n715,1807\n715,1818\n715,1882\n715,1888\n715,1893\n715,1939\n715,1955\n715,1962\n715,2105\n715,2205\n715,2206\n715,2209\n715,2253\n715,2286\n715,2296\n715,2315\n715,2334\n715,2572\n715,2775\n715,2995\n715,3069\n715,3115\n715,3474\n715,3623\n715,3695\n715,3769\n715,4218\n715,4220\n715,4222\n715,4355\n715,4771\n715,5405\n715,6695\n715,7194\n715,8537\n715,9025\n715,33424\n715,36819\n715,54004\n715,94134\n715,136072\n715,245910\n716,717\n716,1782\n717,37\n717,301\n717,444\n717,567\n717,604\n717,615\n717,663\n717,664\n717,668\n717,698\n717,716\n717,717\n717,937\n717,968\n717,1145\n717,1231\n717,1293\n717,1715\n717,1740\n717,1782\n717,1849\n717,1973\n717,2236\n717,2272\n717,2278\n717,3422\n717,3437\n717,4004\n717,4270\n717,5382\n717,6398\n717,7087\n717,7222\n717,13454\n717,14677\n717,15846\n717,17569\n717,18580\n717,19409\n717,19494\n717,22148\n717,23727\n717,23774\n717,24776\n717,24990\n717,25169\n717,25759\n717,26034\n717,26433\n717,30425\n717,30445\n717,32784\n717,33726\n717,33757\n717,34193\n717,34393\n717,34966\n717,35055\n717,35591\n717,37750\n717,37753\n717,38884\n717,39080\n717,43192\n717,43197\n717,43201\n717,44235\n717,44238\n717,44411\n717,46638\n717,46868\n717,48224\n717,48294\n717,49582\n717,49700\n717,51932\n717,56427\n717,62969\n717,79528\n717,85732\n717,86429\n717,97279\n717,104401\n717,104592\n717,106213\n717,106765\n717,109840\n717,110760\n717,111348\n717,114710\n717,115997\n717,119406\n717,119479\n717,119566\n717,119852\n717,130273\n717,130279\n717,130404\n717,130958\n717,131674\n717,133557\n717,136184\n717,139951\n717,140134\n717,142070\n717,144906\n717,145327\n717,145388\n717,145391\n717,145419\n717,145728\n717,150083\n717,157333\n717,157374\n717,159034\n717,159036\n717,159059\n717,163829\n717,163847\n717,163898\n717,165674\n717,165913\n717,168433\n717,168435\n717,169480\n717,169823\n717,171052\n717,179465\n717,180218\n717,181221\n717,182857\n717,186655\n717,186656\n717,187487\n717,192906\n717,194417\n717,213990\n717,217617\n717,218906\n717,222388\n717,228186\n717,232712\n718,54\n718,109\n718,211\n718,310\n718,366\n718,500\n718,512\n718,719\n718,738\n718,786\n718,830\n718,847\n718,893\n718,929\n718,1110\n718,1129\n718,1358\n718,1566\n718,1657\n718,1704\n718,2151\n718,2297\n718,2540\n718,2728\n718,2968\n718,3039\n718,3087\n718,3090\n718,3614\n718,3692\n718,4036\n718,4427\n718,4595\n718,5922\n718,6112\n718,6448\n718,6500\n718,6936\n718,6988\n718,7132\n718,7748\n718,7789\n718,7981\n718,8052\n718,8808\n718,8818\n718,9072\n718,9117\n718,9375\n718,9446\n718,9545\n718,11742\n718,12278\n718,13320\n718,13749\n718,13808\n718,13898\n718,14431\n718,14540\n718,14740\n718,17642\n718,19122\n718,19493\n718,19847\n718,19954\n718,20046\n718,20069\n718,20483\n718,20638\n718,20652\n718,21551\n718,21981\n718,22523\n718,22843\n718,23476\n718,23603\n718,23755\n718,23781\n718,23874\n718,24034\n718,24574\n718,24590\n718,24965\n718,25603\n718,25731\n718,26371\n718,27828\n718,27849\n718,27915\n718,28129\n718,28218\n718,28220\n718,28313\n718,28358\n718,28393\n718,28484\n718,28624\n718,28983\n718,29071\n718,30341\n718,30903\n718,31531\n718,33311\n718,33351\n718,34087\n718,34139\n718,34326\n718,34333\n718,34404\n718,34538\n718,34778\n718,34969\n718,34992\n718,35350\n718,35358\n718,35730\n718,36296\n718,36303\n718,36558\n718,36630\n718,36680\n718,37103\n718,37233\n718,37402\n718,37422\n718,38737\n718,39560\n718,39984\n718,40000\n718,42060\n718,42334\n718,42578\n718,43404\n718,43688\n718,43691\n718,43693\n718,43696\n718,43699\n718,43735\n718,43897\n718,43972\n718,44164\n718,44452\n718,44465\n718,44715\n718,44839\n718,44873\n718,44941\n718,45669\n718,45824\n718,45831\n718,45838\n718,46473\n718,46837\n718,46850\n718,46852\n718,47715\n718,47791\n718,47792\n718,47803\n718,47821\n718,47861\n718,47954\n718,48155\n718,48285\n718,48352\n718,48386\n718,48550\n718,48553\n718,48705\n718,48728\n718,48739\n718,49010\n718,49028\n718,49119\n718,49124\n718,49128\n718,49130\n718,49140\n718,49141\n718,53420\n718,54027\n718,54262\n718,54305\n718,54527\n718,54781\n718,54949\n718,55957\n718,56480\n718,57024\n718,57035\n718,57065\n718,57226\n718,57637\n718,58101\n718,58374\n718,58666\n718,58804\n718,59232\n718,59233\n718,59236\n718,61023\n718,61034\n718,61108\n718,61112\n718,61243\n718,61351\n718,61682\n718,61923\n718,65863\n718,68096\n718,71643\n718,75235\n718,76946\n718,77805\n718,78165\n718,80969\n718,82095\n718,82208\n718,82732\n718,84694\n718,85156\n718,85882\n718,88370\n718,89032\n718,89366\n718,90711\n718,90739\n718,90912\n718,92273\n718,92971\n718,93030\n718,93986\n718,95334\n718,97639\n718,102210\n718,103218\n718,103767\n718,103793\n718,104051\n718,104918\n718,105643\n718,105658\n718,105662\n718,107208\n718,107343\n718,107975\n718,108010\n718,108096\n718,108173\n718,108270\n718,108433\n718,108516\n718,108847\n718,109008\n718,109105\n718,109289\n718,109512\n718,109588\n718,109643\n718,109947\n718,111973\n718,112468\n718,112479\n718,113358\n718,114509\n718,114547\n718,115318\n718,115721\n718,117557\n718,117787\n718,117811\n718,117928\n718,118351\n718,118820\n718,118831\n718,118842\n718,118847\n718,120960\n718,122055\n718,122403\n718,122510\n718,124007\n718,124818\n718,124887\n718,125113\n718,125188\n718,126008\n718,126969\n718,127670\n718,128129\n718,128369\n718,128635\n718,129587\n718,129856\n718,130270\n718,131318\n718,131319\n718,131323\n718,131325\n718,131964\n718,132670\n718,132918\n718,133034\n718,133221\n718,134528\n718,134548\n718,134948\n718,135625\n718,135908\n718,136211\n718,136327\n718,136436\n718,136453\n718,136566\n718,136610\n718,136653\n718,136964\n718,139273\n718,139399\n718,139520\n718,139569\n718,139938\n718,140058\n718,140328\n718,140329\n718,140519\n718,140911\n718,142460\n718,142814\n718,143567\n718,144009\n718,144774\n718,145093\n718,145400\n718,145880\n718,145994\n718,146191\n718,146272\n718,147096\n718,147250\n718,150086\n718,151470\n718,151916\n718,156128\n718,156488\n718,157327\n718,158291\n718,158654\n718,159970\n718,160745\n718,160773\n718,161100\n718,161492\n718,161955\n718,161999\n718,162275\n718,162545\n718,162559\n718,162603\n718,164057\n718,165778\n718,166620\n718,166682\n718,167060\n718,169528\n718,169990\n718,170547\n718,170683\n718,170784\n718,171031\n718,171120\n718,171652\n718,172309\n718,173762\n718,174412\n718,176428\n718,178887\n718,179174\n718,179373\n718,180239\n718,180262\n718,180375\n718,181455\n718,181730\n718,181763\n718,181766\n718,181776\n718,181827\n718,182808\n718,183407\n718,183603\n718,184319\n718,185120\n718,185711\n718,186239\n718,186681\n718,187214\n718,187699\n719,718\n720,106\n720,534\n720,720\n720,721\n720,877\n720,907\n720,937\n720,972\n720,973\n720,1010\n720,1117\n720,1122\n720,1284\n720,1298\n720,1360\n720,1439\n720,1544\n720,1715\n720,2063\n720,3386\n720,3477\n720,3526\n720,3677\n720,4362\n720,4779\n720,5026\n720,5138\n720,5154\n720,5662\n720,6675\n720,7234\n720,8291\n720,8435\n720,13429\n720,15202\n720,15695\n720,18570\n720,18662\n720,18666\n720,18679\n720,21095\n720,22435\n720,23693\n720,25824\n720,26829\n720,28637\n720,29673\n720,29761\n720,30549\n720,35342\n720,39445\n720,39464\n720,45853\n720,121882\n721,720\n721,907\n721,1117\n722,182\n723,509\n723,510\n723,872\n723,1043\n723,1267\n723,1349\n723,1653\n723,1819\n723,2245\n723,2748\n723,5846\n723,8283\n723,8321\n723,14424\n723,21183\n723,22255\n723,24306\n723,24510\n723,24511\n723,24850\n723,25305\n723,25650\n723,26667\n723,26929\n723,41211\n723,42588\n723,46217\n724,178\n724,439\n724,1776\n725,510\n725,818\n726,10\n726,65\n726,171\n726,259\n726,272\n726,393\n726,446\n726,577\n726,685\n726,726\n726,727\n726,788\n726,859\n726,868\n726,897\n726,902\n726,980\n726,1068\n726,1105\n726,1118\n726,1388\n726,1429\n726,1456\n726,1460\n726,1531\n726,1640\n726,1993\n726,2023\n726,2030\n726,2107\n726,2253\n726,2255\n726,2641\n726,3011\n726,3990\n726,4174\n726,4545\n726,4611\n726,5080\n726,5395\n726,5757\n726,5766\n726,7168\n726,7388\n726,7472\n726,7802\n726,13895\n726,14280\n726,14371\n726,15074\n726,15469\n726,15980\n726,17904\n726,19419\n726,19465\n726,21286\n726,21437\n726,21578\n726,24837\n726,28312\n726,32691\n726,34746\n726,35486\n726,36617\n726,37986\n726,41352\n726,41773\n726,44350\n726,44377\n726,45993\n726,48471\n726,50327\n726,50429\n726,56246\n726,56247\n726,56934\n726,61237\n726,63636\n726,68816\n726,71821\n726,76718\n726,76883\n726,78894\n726,80741\n726,81515\n726,82819\n726,85859\n726,85979\n726,86592\n726,91988\n726,93152\n726,93822\n726,98094\n726,103086\n726,107104\n726,108156\n726,108159\n726,109870\n726,110769\n726,122174\n726,122956\n726,123088\n726,126941\n726,128145\n726,139010\n726,139512\n726,139515\n726,141248\n726,152598\n726,153690\n726,154354\n726,155135\n726,155398\n726,156655\n726,157632\n726,158980\n726,159802\n726,161746\n726,162563\n726,171608\n726,171701\n726,176404\n726,176915\n726,177002\n726,177023\n726,177337\n726,180978\n726,185904\n726,188560\n726,191135\n726,203662\n726,205639\n726,213966\n726,213976\n726,214849\n726,221661\n726,221662\n726,221840\n726,234299\n726,247257\n726,247260\n726,248077\n726,256795\n726,260156\n726,263784\n726,263786\n727,726\n728,120\n729,364\n729,431\n730,20\n730,86\n730,481\n730,644\n730,731\n730,18726\n730,66500\n731,731\n731,1191\n731,2356\n731,4706\n731,7605\n731,7606\n731,8419\n731,13375\n731,14958\n731,14959\n731,14960\n731,24287\n731,42963\n731,46552\n731,50694\n731,52925\n732,1\n732,493\n732,733\n732,1052\n733,1\n733,146\n733,202\n733,251\n733,252\n733,275\n733,287\n733,336\n733,344\n733,397\n733,406\n733,493\n733,505\n733,516\n733,535\n733,682\n733,685\n733,693\n733,732\n733,733\n733,809\n733,841\n733,849\n733,911\n733,920\n733,1118\n733,1175\n733,1220\n733,1222\n733,1243\n733,1265\n733,1266\n733,1512\n733,1619\n733,1623\n733,1655\n733,1707\n733,2014\n733,2460\n733,2622\n733,4156\n733,4190\n733,6824\n733,7104\n733,8491\n733,16579\n733,19340\n733,21516\n733,23861\n733,26973\n733,26975\n733,36798\n733,38517\n733,41915\n733,49373\n733,56807\n733,59206\n733,64078\n733,72439\n733,72479\n733,72664\n733,73302\n733,75912\n733,78910\n733,82252\n733,83306\n733,83379\n733,83393\n733,87245\n733,87998\n733,93206\n733,97423\n733,99101\n733,103814\n733,107600\n733,114581\n733,118336\n733,118360\n733,134695\n733,144999\n733,158148\n733,159069\n733,162893\n733,167122\n733,179797\n733,181903\n733,181905\n733,181908\n733,181910\n733,189839\n733,205404\n733,207659\n733,212381\n733,215276\n733,224010\n734,138\n735,736\n736,160\n736,626\n736,673\n736,736\n736,1973\n736,2373\n737,140\n737,264\n737,338\n737,1127\n737,1147\n737,1224\n737,1893\n737,2051\n737,49057\n739,4\n739,5\n739,527\n739,740\n739,741\n739,743\n739,1983\n742,527\n742,743\n743,4\n743,5\n743,355\n743,527\n743,741\n743,743\n743,3108\n743,4810\n743,5208\n743,5650\n743,6209\n743,8714\n743,14316\n743,95583\n743,111321\n743,113445\n743,234141\n744,46\n744,167\n744,299\n744,444\n744,459\n744,522\n744,567\n744,665\n744,744\n744,783\n744,852\n744,968\n744,973\n744,1092\n744,1124\n744,1160\n744,1231\n744,1276\n744,1284\n744,1298\n744,1300\n744,1479\n744,1522\n744,1544\n744,1732\n744,1849\n744,2083\n744,3422\n744,3556\n744,3575\n744,3630\n744,4240\n744,6357\n744,6661\n744,8658\n744,18188\n744,21230\n744,26057\n744,30324\n744,32784\n744,41835\n744,46761\n744,54637\n744,63094\n744,70314\n744,96685\n744,102698\n744,103860\n744,128516\n744,149246\n744,177053\n744,214576\n745,15\n745,107\n745,292\n745,338\n745,441\n745,446\n745,462\n745,632\n745,668\n745,745\n745,849\n745,872\n745,910\n745,1043\n745,1058\n745,1238\n745,1449\n745,1572\n745,1677\n745,2163\n745,2595\n745,2646\n745,3483\n745,3538\n745,3830\n745,5738\n745,6502\n745,6880\n745,7530\n745,7698\n745,7768\n745,9070\n745,15339\n745,16527\n745,16614\n745,19687\n745,25495\n745,25646\n745,34933\n745,36358\n745,37414\n745,49692\n745,61049\n745,62417\n745,74634\n745,75211\n745,75507\n745,82217\n745,84017\n745,84632\n745,119098\n745,120680\n745,122942\n745,128150\n745,135076\n745,135078\n745,135094\n745,163863\n745,169836\n745,207659\n745,236682\n745,240875\n746,292\n746,446\n746,745\n747,4\n747,5\n747,527\n747,740\n747,741\n747,743\n747,827\n747,8714\n748,749\n748,818\n749,58\n749,107\n749,111\n749,292\n749,441\n749,442\n749,609\n749,694\n749,749\n749,784\n749,795\n749,801\n749,818\n749,911\n749,1140\n749,1146\n749,1188\n749,1332\n749,1368\n749,1388\n749,1572\n749,1722\n749,2334\n749,2775\n749,3474\n749,4165\n749,4771\n750,1293\n751,347\n751,752\n752,22\n752,207\n752,287\n752,326\n752,347\n752,425\n752,433\n752,457\n752,599\n752,673\n752,751\n752,752\n752,818\n752,873\n752,874\n752,968\n752,1011\n752,1014\n752,1049\n752,1118\n752,1133\n752,1210\n752,1359\n752,1561\n752,1634\n752,1801\n752,1853\n752,2045\n752,2182\n752,2659\n752,2989\n752,2991\n752,3407\n752,4272\n752,4388\n752,5250\n752,5851\n752,7013\n752,10216\n752,14827\n752,18587\n752,19309\n752,19823\n752,26034\n752,26081\n752,26905\n752,29009\n752,38300\n752,43095\n752,44962\n752,46165\n752,47095\n752,48109\n752,55012\n752,55019\n752,55101\n752,56430\n752,62457\n752,63990\n752,76129\n752,78679\n752,87817\n752,91322\n752,93113\n752,101551\n752,103402\n752,103409\n752,109339\n752,109948\n752,114099\n752,133784\n752,143959\n752,147446\n752,147515\n752,150105\n752,158817\n752,167592\n752,168889\n752,169070\n752,173316\n752,176059\n752,182382\n752,184759\n752,187280\n752,187285\n752,191175\n752,191244\n752,191291\n752,191831\n752,191846\n752,193425\n752,212528\n752,213985\n752,215372\n752,215540\n752,220364\n752,220475\n752,221056\n752,221951\n752,224041\n752,224727\n752,226401\n752,227348\n752,231005\n752,244360\n752,249106\n752,249663\n752,250848\n752,251238\n752,252067\n752,254389\n752,255163\n752,260370\n753,255\n754,660\n756,298\n757,758\n757,1105\n758,2520\n758,9054\n758,16338\n758,16349\n758,19127\n758,30595\n758,35836\n758,37113\n758,38296\n759,485\n760,10\n760,41\n760,104\n760,108\n760,111\n760,175\n760,289\n760,290\n760,314\n760,328\n760,373\n760,431\n760,479\n760,588\n760,590\n760,622\n760,631\n760,632\n760,638\n760,677\n760,685\n760,704\n760,714\n760,715\n760,760\n760,761\n760,784\n760,791\n760,805\n760,1001\n760,1004\n760,1011\n760,1048\n760,1119\n760,1149\n760,1192\n760,1213\n760,1266\n760,1285\n760,1346\n760,1402\n760,1462\n760,1489\n760,1505\n760,1631\n760,1808\n760,1818\n760,1873\n760,1893\n760,1973\n760,2008\n760,2069\n760,2175\n760,2206\n760,2348\n760,2383\n760,2408\n760,2620\n760,2982\n760,3069\n760,3407\n760,3464\n760,3508\n760,3565\n760,3566\n760,3694\n760,3760\n760,3776\n760,3867\n760,3947\n760,4063\n760,4097\n760,4265\n760,4294\n760,4308\n760,4809\n760,5265\n760,5346\n760,5351\n760,5535\n760,5545\n760,5679\n760,6574\n760,6753\n760,6821\n760,6853\n760,6858\n760,6923\n760,6928\n760,7166\n760,7739\n760,7758\n760,7790\n760,7962\n760,8180\n760,8451\n760,8537\n760,8763\n760,9028\n760,9451\n760,13166\n760,13207\n760,13303\n760,13452\n760,14080\n760,14105\n760,14414\n760,14437\n760,14487\n760,14524\n760,14538\n760,14582\n760,15397\n760,15664\n760,15952\n760,16137\n760,16173\n760,16439\n760,16448\n760,18160\n760,18450\n760,18766\n760,18793\n760,19310\n760,19454\n760,19475\n760,19617\n760,19859\n760,19868\n760,20301\n760,20484\n760,20652\n760,21187\n760,21321\n760,21541\n760,21552\n760,21732\n760,22299\n760,23294\n760,24590\n760,24613\n760,24644\n760,24672\n760,24753\n760,25597\n760,25814\n760,26110\n760,26396\n760,26813\n760,26867\n760,26937\n760,27088\n760,27432\n760,27680\n760,28136\n760,28198\n760,28310\n760,28867\n760,29018\n760,29144\n760,29310\n760,30268\n760,30405\n760,30549\n760,31474\n760,32591\n760,33085\n760,33441\n760,33506\n760,33609\n760,33750\n760,34707\n760,34962\n760,34978\n760,35371\n760,35402\n760,35416\n760,35528\n760,36256\n760,36795\n760,38300\n760,38497\n760,39526\n760,40028\n760,40071\n760,40850\n760,41382\n760,41395\n760,41682\n760,43331\n760,43647\n760,44298\n760,44341\n760,44839\n760,44863\n760,46580\n760,46698\n760,48064\n760,49346\n760,49387\n760,49657\n760,50856\n760,51883\n760,51896\n760,54572\n760,55038\n760,56412\n760,57802\n760,58074\n760,58145\n760,58964\n760,59045\n760,59088\n760,59123\n760,59208\n760,60304\n760,60356\n760,60500\n760,60548\n760,61324\n760,62273\n760,62371\n760,62526\n760,62809\n760,62921\n760,63090\n760,63909\n760,65681\n760,65747\n760,65984\n760,67381\n760,68596\n760,68771\n760,68865\n760,69916\n760,71880\n760,73414\n760,73741\n760,75207\n760,75216\n760,79619\n760,82151\n760,82371\n760,87009\n760,90418\n760,91177\n760,91976\n760,92874\n760,93029\n760,94134\n760,94703\n760,94705\n760,94814\n760,95375\n760,96719\n760,98335\n760,98492\n760,98933\n760,98967\n760,99724\n760,102116\n760,102664\n760,103366\n760,103927\n760,105221\n760,106239\n760,106299\n760,106363\n760,106924\n760,106981\n760,107386\n760,109419\n760,112570\n760,112805\n760,112919\n760,113541\n760,113969\n760,114041\n760,114445\n760,114843\n760,115849\n760,117946\n760,118020\n760,118848\n760,119316\n760,119334\n760,119415\n760,119789\n760,120875\n760,121000\n760,121531\n760,121556\n760,122440\n760,124062\n760,124519\n760,125245\n760,125713\n760,125869\n760,126026\n760,127732\n760,128666\n760,129535\n760,129805\n760,129888\n760,129916\n760,130047\n760,130269\n760,130336\n760,130878\n760,131030\n760,132005\n760,133288\n760,133828\n760,134543\n760,134691\n760,134720\n760,136297\n760,136571\n760,136722\n760,137275\n760,138246\n760,138271\n760,138308\n760,139201\n760,139527\n760,139695\n760,140342\n760,141120\n760,142568\n760,142637\n760,143064\n760,143974\n760,144098\n760,146772\n760,148090\n760,149661\n760,150456\n760,154319\n760,154324\n760,154431\n760,154711\n760,157321\n760,157324\n760,159127\n760,159908\n760,159989\n760,160397\n760,160894\n760,160939\n760,161107\n760,161108\n760,161150\n760,161627\n760,161872\n760,162409\n760,162546\n760,162645\n760,163068\n760,163270\n760,163274\n760,163288\n760,164432\n760,164926\n760,164974\n760,165318\n760,165631\n760,165730\n760,166628\n760,166680\n760,166820\n760,167798\n760,169828\n760,171322\n760,171629\n760,172094\n760,173068\n760,173288\n760,173459\n760,173574\n760,173578\n760,174304\n760,175085\n760,178446\n760,178559\n760,181633\n760,181801\n760,181845\n760,182432\n760,182718\n760,182903\n760,183764\n760,189383\n760,189947\n760,191140\n760,192946\n760,197619\n760,199008\n760,202764\n760,206880\n760,212521\n760,212567\n760,212620\n760,212908\n760,213267\n760,215412\n760,215905\n760,216016\n760,217532\n760,220766\n760,221734\n760,221901\n760,221906\n760,222603\n760,224074\n760,224096\n760,224643\n760,224877\n760,225702\n760,228257\n760,228592\n760,229592\n760,229803\n760,231171\n760,238959\n760,241036\n760,243394\n760,243921\n760,245302\n760,245322\n760,246520\n760,247781\n760,248005\n760,248617\n760,255730\n760,256408\n760,256426\n760,257918\n760,260227\n761,104\n761,111\n761,136\n761,137\n761,431\n761,525\n761,588\n761,590\n761,631\n761,760\n761,805\n761,818\n761,1011\n761,1119\n761,1285\n761,1402\n761,1462\n761,1631\n761,1955\n761,8276\n761,8537\n761,232709\n762,356\n762,360\n762,567\n762,604\n762,663\n762,665\n762,666\n762,698\n762,762\n762,763\n762,783\n762,877\n762,900\n762,1117\n762,1436\n762,1616\n762,1635\n762,1692\n762,1704\n762,1732\n762,2217\n762,2557\n762,2979\n762,3392\n762,3417\n762,3869\n762,4091\n762,4998\n762,6650\n762,8011\n762,13991\n762,17662\n762,19675\n762,23031\n762,30328\n762,34721\n762,35394\n762,37534\n762,38349\n762,38959\n762,43675\n762,58173\n762,62439\n762,63491\n762,65725\n762,71969\n762,82217\n762,90253\n762,94845\n762,98965\n762,105730\n762,112883\n762,116047\n762,133545\n762,135267\n762,137059\n762,139928\n762,149246\n762,161519\n762,163010\n762,170040\n762,183843\n762,216540\n762,226176\n762,238107\n762,258281\n763,762\n764,314\n764,452\n764,457\n764,599\n764,676\n764,765\n764,775\n764,795\n764,849\n764,1014\n764,1411\n764,1599\n764,2006\n764,3166\n764,3804\n764,5130\n764,5169\n764,5385\n764,5388\n764,5961\n764,6904\n764,9457\n764,15109\n764,23437\n764,39618\n764,193637\n764,195467\n764,201910\n764,207659\n764,212300\n764,215874\n764,249055\n765,68\n765,186\n765,417\n765,425\n765,589\n765,599\n765,609\n765,685\n765,775\n765,784\n765,794\n765,795\n765,801\n765,852\n765,911\n765,1001\n765,1011\n765,1085\n765,1204\n765,1326\n765,1580\n765,1796\n765,1973\n765,2334\n765,3094\n765,3804\n765,5130\n765,5961\n765,26450\n765,185874\n766,151\n766,178\n766,217\n766,346\n766,393\n766,406\n766,435\n766,438\n766,439\n766,447\n766,457\n766,516\n766,538\n766,671\n766,980\n766,1010\n766,1033\n766,1294\n766,1417\n766,1531\n766,1590\n766,1776\n766,1877\n766,1913\n766,4611\n766,6654\n766,6661\n766,13486\n766,38439\n767,302\n768,160\n769,87\n769,264\n769,479\n769,510\n769,515\n769,647\n769,697\n769,770\n769,872\n769,991\n769,1052\n769,1146\n769,1151\n769,1267\n769,1287\n769,1381\n769,1579\n769,1659\n769,1893\n769,2260\n769,2605\n769,2626\n769,3260\n769,32673\n769,49057\n770,509\n770,510\n770,157095\n771,772\n771,1309\n772,30\n772,134\n772,137\n772,175\n772,200\n772,225\n772,248\n772,294\n772,328\n772,364\n772,557\n772,596\n772,685\n772,693\n772,772\n772,911\n772,953\n772,954\n772,1016\n772,1018\n772,1213\n772,1281\n772,1282\n772,1309\n772,1332\n772,1368\n772,1663\n772,1882\n772,2105\n772,3504\n772,3565\n772,3807\n772,4078\n772,4276\n772,4315\n772,4398\n772,4613\n772,4936\n772,4941\n772,5405\n772,5439\n772,8133\n772,8757\n772,9529\n772,13207\n772,15234\n772,15807\n772,17116\n772,17125\n772,17893\n772,20604\n772,20900\n772,23665\n772,23698\n772,25041\n772,26162\n772,26250\n772,26251\n772,26261\n772,26264\n772,26265\n772,26938\n772,28203\n772,32722\n772,32968\n772,36913\n772,37545\n772,40447\n772,42541\n772,53335\n772,64247\n772,64856\n772,66155\n772,70346\n772,70970\n772,72068\n772,73958\n772,74766\n772,75126\n772,75299\n772,85814\n772,86116\n772,89783\n772,90290\n772,91622\n772,94317\n772,95554\n772,99125\n772,99408\n772,99794\n772,99807\n772,99810\n772,101950\n772,107609\n772,109568\n772,109655\n772,114669\n772,117177\n772,117183\n772,117281\n772,117376\n772,117712\n772,121517\n772,123102\n772,124967\n772,125879\n772,126032\n772,126852\n772,128313\n772,128489\n772,129534\n772,130466\n772,137101\n772,141175\n772,159746\n772,161268\n773,182\n774,710\n775,186\n775,256\n775,314\n775,425\n775,431\n775,444\n775,446\n775,518\n775,589\n775,599\n775,673\n775,685\n775,764\n775,765\n775,775\n775,795\n775,801\n775,849\n775,911\n775,973\n775,999\n775,1001\n775,1011\n775,1056\n775,1172\n775,1262\n775,1284\n775,1326\n775,1411\n775,1504\n775,1545\n775,1732\n775,2006\n775,2209\n775,2747\n775,3094\n775,3166\n775,3407\n775,3422\n775,3507\n775,3718\n775,3804\n775,4308\n775,4407\n775,4409\n775,4499\n775,5129\n775,5130\n775,5385\n775,5388\n775,5961\n775,7959\n775,8261\n775,9739\n775,13282\n775,14193\n775,14572\n775,15109\n775,15135\n775,15226\n775,15633\n775,16122\n775,19005\n775,21362\n775,21471\n775,21712\n775,22440\n775,23437\n775,26109\n775,26450\n775,27116\n775,30557\n775,31343\n775,31454\n775,31802\n775,33016\n775,34059\n775,34863\n775,34963\n775,38337\n775,38338\n775,41139\n775,43334\n775,44792\n775,45032\n775,45968\n775,46323\n775,46690\n775,46722\n775,48006\n775,55582\n775,61105\n775,63348\n775,64681\n775,67152\n775,68086\n775,68607\n775,71688\n775,73453\n775,76186\n775,78873\n775,78898\n775,79631\n775,79942\n775,82642\n775,96704\n775,99811\n775,103035\n775,107083\n775,109838\n775,122439\n775,122905\n775,122991\n775,128872\n775,129775\n775,130335\n775,135235\n775,136515\n775,140482\n775,159720\n775,174209\n775,180240\n775,191936\n775,204692\n775,224512\n775,225527\n775,227187\n775,230919\n775,241721\n775,243883\n775,248489\n776,527\n776,740\n776,741\n776,743\n776,95152\n777,187\n778,50\n778,158\n778,406\n778,779\n778,1515\n779,50\n779,99\n779,146\n779,147\n779,158\n779,175\n779,192\n779,195\n779,285\n779,314\n779,333\n779,336\n779,346\n779,358\n779,392\n779,406\n779,410\n779,438\n779,505\n779,509\n779,510\n779,602\n779,620\n779,640\n779,644\n779,676\n779,778\n779,779\n779,841\n779,875\n779,1014\n779,1173\n779,1181\n779,1210\n779,1218\n779,1369\n779,1370\n779,1425\n779,1456\n779,1464\n779,1502\n779,1515\n779,1518\n779,1776\n779,1825\n779,1969\n779,1973\n779,2132\n779,2307\n779,2418\n779,2452\n779,2764\n779,2792\n779,2875\n779,2880\n779,2903\n779,2969\n779,3060\n779,3070\n779,3195\n779,3255\n779,3449\n779,3507\n779,3592\n779,3895\n779,4465\n779,4558\n779,4617\n779,5360\n779,5592\n779,7006\n779,7794\n779,7818\n779,7880\n779,8055\n779,8174\n779,8244\n779,9533\n779,13589\n779,13592\n779,13623\n779,13994\n779,14040\n779,14136\n779,14700\n779,16341\n779,16563\n779,17151\n779,17236\n779,17551\n779,18457\n779,18797\n779,18931\n779,19299\n779,19825\n779,19936\n779,20160\n779,20502\n779,22135\n779,22338\n779,23669\n779,23816\n779,23926\n779,23941\n779,23954\n779,23991\n779,24021\n779,24045\n779,24056\n779,24095\n779,24153\n779,24163\n779,24166\n779,24182\n779,24183\n779,24185\n779,24187\n779,24198\n779,24203\n779,24211\n779,24229\n779,24235\n779,24835\n779,24895\n779,25125\n779,25259\n779,25694\n779,26427\n779,26434\n779,26892\n779,26972\n779,27012\n779,27326\n779,28838\n779,29037\n779,30673\n779,32768\n779,33459\n779,35549\n779,36054\n779,37387\n779,38300\n779,38359\n779,40803\n779,41055\n779,41148\n779,44247\n779,46609\n779,46844\n779,47255\n779,48715\n779,49536\n779,49547\n779,49560\n779,49561\n779,49563\n779,49564\n779,49566\n779,49567\n779,49572\n779,49573\n779,49574\n779,49575\n779,49579\n779,49580\n779,49585\n779,49586\n779,49587\n779,49589\n779,51520\n779,58131\n779,58787\n779,59655\n779,62095\n779,62890\n779,63126\n779,63522\n779,63650\n779,63942\n779,64258\n779,64966\n779,65764\n779,66011\n779,66731\n779,67422\n779,68069\n779,68525\n779,69084\n779,69209\n779,71079\n779,71080\n779,71830\n779,71917\n779,75783\n779,75798\n779,77993\n779,78463\n779,79387\n779,79639\n779,80722\n779,81127\n779,82455\n779,84144\n779,86435\n779,86686\n779,87277\n779,87824\n779,87952\n779,87975\n779,88444\n779,88692\n779,88867\n779,89761\n779,90794\n779,92476\n779,92732\n779,92984\n779,93125\n779,93693\n779,93694\n779,93715\n779,93781\n779,95154\n779,95513\n779,95517\n779,95599\n779,95768\n779,96057\n779,96097\n779,96555\n779,96816\n779,97286\n779,98928\n779,99097\n779,103223\n779,103892\n779,104759\n779,106087\n779,106502\n779,106991\n779,107044\n779,107049\n779,107977\n779,108032\n779,108477\n779,109836\n779,110229\n779,111217\n779,112380\n779,113341\n779,115183\n779,115782\n779,115868\n779,116056\n779,116103\n779,117723\n779,117892\n779,118336\n779,119454\n779,119711\n779,122437\n779,122976\n779,124488\n779,126067\n779,127206\n779,129800\n779,130107\n779,130340\n779,132238\n779,134539\n779,136159\n779,136688\n779,137870\n779,138201\n779,140010\n779,140441\n779,140817\n779,141912\n779,145007\n779,145035\n779,145405\n779,147103\n779,147172\n779,148601\n779,148606\n779,151475\n779,151485\n779,151520\n779,152864\n779,153730\n779,155513\n779,156404\n779,158297\n779,158349\n779,160350\n779,163741\n779,163903\n779,166663\n779,166674\n779,166948\n779,168245\n779,170149\n779,170184\n779,170764\n779,175324\n779,176115\n779,176567\n779,176772\n779,176878\n779,177683\n779,178573\n779,181115\n779,181820\n779,182145\n779,184847\n779,184913\n779,188610\n779,189372\n779,189927\n779,190372\n779,191939\n779,191963\n779,194917\n779,194936\n779,194964\n779,194968\n779,195098\n779,196732\n779,198771\n779,214735\n779,219974\n779,221113\n779,227027\n779,227488\n779,228282\n779,230229\n779,231893\n779,232948\n779,239362\n779,241729\n779,248115\n779,249249\n779,249270\n779,249833\n779,250577\n779,250714\n779,251860\n779,253165\n779,256689\n780,178\n780,192\n780,314\n780,781\n780,1326\n780,1359\n780,1635\n780,2334\n781,222\n781,313\n781,332\n781,356\n781,477\n781,536\n781,780\n781,911\n781,951\n781,1618\n781,1808\n781,1871\n781,2159\n781,2507\n781,2784\n781,4787\n781,4958\n781,5458\n781,7698\n781,15017\n781,16297\n781,21015\n781,23839\n781,25670\n781,28343\n781,31360\n781,35536\n781,39537\n781,48404\n781,62539\n781,66703\n781,74555\n781,80360\n781,82671\n781,83745\n781,92922\n781,95588\n781,134321\n781,156968\n781,156986\n781,158767\n781,169499\n781,169925\n781,186039\n782,390\n782,589\n782,783\n782,862\n782,2572\n782,4222\n782,6068\n782,7194\n782,44725\n783,46\n783,86\n783,167\n783,299\n783,338\n783,390\n783,444\n783,459\n783,522\n783,567\n783,615\n783,666\n783,744\n783,750\n783,762\n783,782\n783,783\n783,941\n783,968\n783,1045\n783,1083\n783,1092\n783,1117\n783,1122\n783,1124\n783,1160\n783,1167\n783,1231\n783,1241\n783,1276\n783,1294\n783,1298\n783,1300\n783,1319\n783,1320\n783,1436\n783,1479\n783,1522\n783,1544\n783,1679\n783,1849\n783,2083\n783,2148\n783,2217\n783,2253\n783,2372\n783,2480\n783,2747\n783,3049\n783,3218\n783,3404\n783,3422\n783,3525\n783,3567\n783,3630\n783,5043\n783,5301\n783,5662\n783,5740\n783,6032\n783,13667\n783,18612\n783,19534\n783,29069\n783,31310\n783,34026\n783,35545\n783,35561\n783,40228\n783,40964\n783,42598\n783,42767\n783,48886\n783,57575\n783,58173\n783,60437\n783,60458\n783,60784\n783,61376\n783,68873\n783,72764\n783,91279\n783,92976\n783,96685\n783,98279\n783,102698\n783,103860\n783,122454\n783,122935\n783,122939\n783,122953\n783,123594\n783,130238\n783,130442\n783,133545\n783,133785\n783,134079\n783,134684\n783,135152\n783,138031\n783,139289\n783,152298\n783,155027\n783,155424\n783,161548\n783,161628\n783,171641\n783,180977\n783,185874\n783,186657\n783,204840\n783,207045\n783,216668\n783,220315\n783,223942\n783,236647\n783,251442\n784,10\n784,40\n784,41\n784,54\n784,111\n784,135\n784,138\n784,175\n784,261\n784,289\n784,294\n784,304\n784,313\n784,332\n784,364\n784,417\n784,431\n784,442\n784,500\n784,502\n784,534\n784,557\n784,573\n784,589\n784,590\n784,596\n784,609\n784,617\n784,631\n784,636\n784,660\n784,677\n784,693\n784,694\n784,715\n784,749\n784,760\n784,765\n784,772\n784,784\n784,785\n784,790\n784,797\n784,801\n784,805\n784,808\n784,954\n784,966\n784,968\n784,972\n784,999\n784,1001\n784,1014\n784,1052\n784,1119\n784,1195\n784,1209\n784,1212\n784,1213\n784,1359\n784,1368\n784,1416\n784,1511\n784,1512\n784,1526\n784,1564\n784,1608\n784,1618\n784,1631\n784,1745\n784,1782\n784,1888\n784,1923\n784,1999\n784,2015\n784,2105\n784,2209\n784,2285\n784,2315\n784,2338\n784,2419\n784,2424\n784,2519\n784,2620\n784,2646\n784,2775\n784,2797\n784,2900\n784,2974\n784,2991\n784,3094\n784,3115\n784,3135\n784,3457\n784,3473\n784,3474\n784,3504\n784,3590\n784,3759\n784,4234\n784,4411\n784,4532\n784,4557\n784,4692\n784,4799\n784,5062\n784,5472\n784,5718\n784,5992\n784,6136\n784,6146\n784,6908\n784,6986\n784,7194\n784,7242\n784,7458\n784,7698\n784,7768\n784,7878\n784,8275\n784,8276\n784,8348\n784,8549\n784,8557\n784,8632\n784,9739\n784,13336\n784,13626\n784,14482\n784,14677\n784,14820\n784,15344\n784,15747\n784,16165\n784,16192\n784,17293\n784,18479\n784,18933\n784,18965\n784,19116\n784,19617\n784,20596\n784,20858\n784,22384\n784,23329\n784,24288\n784,24887\n784,24972\n784,25293\n784,26396\n784,27120\n784,27126\n784,28317\n784,28553\n784,29310\n784,30733\n784,32629\n784,32791\n784,32894\n784,33424\n784,33637\n784,36250\n784,36647\n784,41805\n784,42462\n784,44058\n784,44117\n784,44398\n784,46276\n784,51794\n784,54615\n784,55801\n784,55905\n784,56346\n784,57354\n784,59122\n784,59747\n784,61069\n784,62334\n784,63350\n784,63639\n784,63909\n784,64739\n784,64751\n784,64869\n784,65769\n784,68480\n784,69946\n784,70151\n784,70839\n784,73925\n784,74078\n784,75130\n784,75912\n784,78623\n784,79517\n784,80402\n784,80489\n784,82980\n784,84001\n784,87715\n784,88389\n784,89585\n784,91197\n784,94134\n784,98925\n784,104000\n784,120967\n784,122439\n784,123821\n784,131286\n784,131330\n784,131371\n784,133440\n784,134145\n784,135286\n784,136072\n784,136462\n784,140006\n784,140079\n784,141834\n784,143272\n784,143381\n784,145626\n784,146842\n784,147244\n784,147366\n784,147408\n784,147922\n784,148439\n784,148461\n784,150149\n784,150577\n784,151156\n784,152586\n784,152829\n784,153181\n784,159129\n784,159421\n784,159908\n784,160377\n784,160380\n784,161841\n784,162535\n784,164238\n784,167313\n784,167770\n784,170228\n784,170653\n784,171107\n784,172012\n784,173309\n784,173427\n784,175384\n784,176328\n784,176944\n784,180954\n784,180988\n784,182162\n784,186065\n784,189815\n784,206230\n784,206351\n784,206453\n784,207051\n784,207622\n784,211936\n784,211980\n784,215862\n784,224508\n784,228009\n784,239898\n784,240876\n784,244020\n784,245910\n784,247035\n784,254989\n784,258054\n784,258237\n784,259545\n784,264451\n785,784\n787,685\n788,10\n788,66\n788,171\n788,215\n788,259\n788,272\n788,314\n788,356\n788,393\n788,446\n788,447\n788,577\n788,589\n788,599\n788,663\n788,664\n788,689\n788,726\n788,788\n788,789\n788,794\n788,859\n788,875\n788,902\n788,911\n788,980\n788,991\n788,1070\n788,1105\n788,1118\n788,1130\n788,1333\n788,1388\n788,1528\n788,1531\n788,1566\n788,1597\n788,1973\n788,2057\n788,2084\n788,2106\n788,2178\n788,2320\n788,2459\n788,2959\n788,3151\n788,3603\n788,3903\n788,4339\n788,4375\n788,4446\n788,4545\n788,4611\n788,6454\n788,7165\n788,7921\n788,8078\n788,8081\n788,8128\n788,13332\n788,14202\n788,14232\n788,14679\n788,14831\n788,17354\n788,18108\n788,18823\n788,19628\n788,20686\n788,21286\n788,21552\n788,22159\n788,23487\n788,26779\n788,26786\n788,28312\n788,29116\n788,30402\n788,30840\n788,30905\n788,31278\n788,32585\n788,33085\n788,33384\n788,33985\n788,34258\n788,35398\n788,38543\n788,38544\n788,39525\n788,40723\n788,41907\n788,45398\n788,45983\n788,46444\n788,48772\n788,48865\n788,49423\n788,51274\n788,54493\n788,56150\n788,56910\n788,57143\n788,59464\n788,61213\n788,66253\n788,67108\n788,67290\n788,67395\n788,73197\n788,75102\n788,75390\n788,75883\n788,75912\n788,76958\n788,86491\n788,99003\n788,101226\n788,101819\n788,109384\n788,110050\n788,112438\n788,113018\n788,118116\n788,119325\n788,124061\n788,125855\n788,126908\n788,128216\n788,138686\n788,139010\n788,140354\n788,149192\n788,152590\n788,153373\n788,153563\n788,153634\n788,153860\n788,154396\n788,155096\n788,155353\n788,160870\n788,161334\n788,161484\n788,163355\n788,164385\n788,165040\n788,169909\n788,172543\n788,174469\n788,176375\n788,176956\n788,179831\n788,181564\n788,182649\n788,185033\n788,185701\n788,186081\n788,192522\n788,193118\n788,193578\n788,195683\n788,196627\n788,220094\n788,228127\n788,231063\n788,234287\n788,234927\n788,236057\n788,237136\n788,238189\n788,238222\n788,239308\n788,259076\n788,259509\n788,263811\n788,264560\n789,788\n790,784\n791,22\n791,163\n791,209\n791,302\n791,433\n791,579\n791,687\n791,760\n791,818\n791,861\n791,893\n791,1556\n791,1631\n791,1659\n791,4453\n792,138\n792,1227\n792,21442\n792,86416\n793,794\n794,20\n794,22\n794,63\n794,68\n794,86\n794,120\n794,158\n794,167\n794,192\n794,202\n794,207\n794,211\n794,259\n794,264\n794,272\n794,275\n794,287\n794,292\n794,302\n794,304\n794,327\n794,336\n794,337\n794,346\n794,366\n794,390\n794,392\n794,393\n794,397\n794,433\n794,435\n794,439\n794,440\n794,452\n794,457\n794,467\n794,516\n794,536\n794,538\n794,599\n794,605\n794,621\n794,622\n794,623\n794,631\n794,632\n794,673\n794,685\n794,697\n794,788\n794,793\n794,794\n794,809\n794,818\n794,837\n794,838\n794,872\n794,903\n794,907\n794,911\n794,918\n794,920\n794,939\n794,950\n794,972\n794,977\n794,1011\n794,1014\n794,1021\n794,1033\n794,1070\n794,1085\n794,1118\n794,1130\n794,1147\n794,1167\n794,1179\n794,1210\n794,1294\n794,1298\n794,1326\n794,1332\n794,1370\n794,1381\n794,1411\n794,1417\n794,1452\n794,1453\n794,1522\n794,1551\n794,1566\n794,1612\n794,1634\n794,1653\n794,1655\n794,1715\n794,1722\n794,1782\n794,1796\n794,1805\n794,1844\n794,1968\n794,1992\n794,2069\n794,2085\n794,2512\n794,2710\n794,2979\n794,2989\n794,2991\n794,2995\n794,3524\n794,3538\n794,4175\n794,4276\n794,5130\n794,5382\n794,5472\n794,5604\n794,5631\n794,5833\n794,5961\n794,6119\n794,7364\n794,8041\n794,8676\n794,13323\n794,13446\n794,13538\n794,15141\n794,15686\n794,16522\n794,19413\n794,20349\n794,20598\n794,22049\n794,30331\n794,31246\n794,31282\n794,32630\n794,32978\n794,34205\n794,38140\n794,38357\n794,48290\n794,48727\n794,49295\n794,50094\n794,57143\n794,59269\n794,61822\n794,70395\n794,70919\n794,73702\n794,74436\n794,75912\n794,77035\n794,83368\n794,91348\n794,107394\n794,108160\n794,109455\n794,109468\n794,120155\n794,122657\n794,124492\n794,131650\n794,139559\n794,140084\n794,140100\n794,141912\n794,162514\n794,162925\n794,163287\n794,164917\n794,165389\n794,170444\n794,174790\n794,175282\n794,176362\n794,177440\n794,207659\n794,216170\n794,226977\n794,238719\n794,238761\n794,248486\n794,249273\n795,107\n795,346\n795,510\n795,534\n795,589\n795,749\n795,764\n795,765\n795,775\n795,795\n795,808\n795,1001\n795,1041\n795,1073\n795,1388\n795,1545\n795,1599\n795,1955\n795,1973\n795,2253\n795,2678\n795,2913\n795,3093\n795,3094\n795,3507\n795,3623\n795,3703\n795,3804\n795,5356\n795,5385\n795,5388\n795,5587\n795,5961\n795,7194\n795,7921\n795,12728\n795,12763\n795,12875\n795,13273\n795,13629\n795,14391\n795,14633\n795,15109\n795,15727\n795,15776\n795,16192\n795,16425\n795,19228\n795,22149\n795,26011\n795,26063\n795,26070\n795,27245\n795,28221\n795,28653\n795,30357\n795,30616\n795,31777\n795,34311\n795,34963\n795,37547\n795,37706\n795,38294\n795,41107\n795,43105\n795,43237\n795,44385\n795,45429\n795,47997\n795,48006\n795,49933\n795,50248\n795,51972\n795,54309\n795,60406\n795,60418\n795,60520\n795,62509\n795,65635\n795,71770\n795,74535\n795,78746\n795,79858\n795,90721\n795,91767\n795,96471\n795,97562\n795,103770\n795,107504\n795,110691\n795,112320\n795,112503\n795,114454\n795,115990\n795,117769\n795,121916\n795,122692\n795,131744\n795,136072\n795,136515\n795,142506\n795,145539\n795,147365\n795,147375\n795,147534\n795,148624\n795,148893\n795,150322\n795,151996\n795,151997\n795,153619\n795,155740\n795,161156\n795,162869\n795,165425\n795,166695\n795,167622\n795,168261\n795,168785\n795,168793\n795,169543\n795,170053\n795,170751\n795,172494\n795,179111\n795,180340\n795,191671\n795,195015\n795,223839\n795,225385\n795,228454\n795,228867\n795,229071\n795,234683\n795,234891\n795,239866\n795,245014\n795,261853\n795,261861\n796,690\n797,41\n797,104\n797,135\n797,294\n797,399\n797,596\n797,631\n797,704\n797,714\n797,784\n797,805\n797,1052\n797,1119\n797,1177\n797,1368\n797,1462\n797,1635\n797,1962\n797,2008\n797,2210\n797,2995\n797,3115\n797,4237\n797,6556\n797,8537\n797,20813\n797,182162\n798,481\n798,799\n798,1021\n798,204093\n800,134\n800,431\n800,801\n801,46\n801,58\n801,182\n801,217\n801,292\n801,301\n801,304\n801,314\n801,420\n801,441\n801,452\n801,457\n801,535\n801,599\n801,626\n801,673\n801,676\n801,784\n801,838\n801,849\n801,852\n801,872\n801,929\n801,1014\n801,1085\n801,1118\n801,1130\n801,1204\n801,1284\n801,1326\n801,1449\n801,1531\n801,1566\n801,1796\n801,1807\n801,1844\n801,1973\n801,2253\n801,2373\n801,2443\n801,2775\n801,4039\n801,4771\n801,6904\n801,156379\n802,160\n802,264\n802,360\n802,515\n802,525\n802,872\n802,1127\n802,1147\n802,1151\n802,1289\n802,1551\n802,1893\n802,6695\n803,167\n803,1837\n804,805\n805,24\n805,41\n805,68\n805,104\n805,134\n805,240\n805,261\n805,289\n805,292\n805,294\n805,309\n805,310\n805,332\n805,372\n805,373\n805,417\n805,431\n805,502\n805,572\n805,590\n805,592\n805,609\n805,612\n805,621\n805,631\n805,632\n805,634\n805,636\n805,677\n805,694\n805,704\n805,714\n805,715\n805,760\n805,761\n805,784\n805,797\n805,805\n805,823\n805,850\n805,885\n805,1004\n805,1016\n805,1052\n805,1054\n805,1118\n805,1119\n805,1209\n805,1252\n805,1253\n805,1282\n805,1285\n805,1346\n805,1353\n805,1359\n805,1402\n805,1417\n805,1459\n805,1462\n805,1505\n805,1506\n805,1509\n805,1511\n805,1631\n805,1635\n805,1701\n805,1713\n805,1745\n805,1879\n805,2092\n805,2210\n805,2316\n805,2358\n805,2383\n805,2620\n805,2644\n805,2744\n805,2771\n805,2775\n805,2823\n805,2903\n805,2982\n805,2995\n805,3085\n805,3504\n805,3539\n805,3794\n805,3867\n805,3944\n805,4115\n805,4520\n805,4524\n805,4692\n805,4821\n805,5258\n805,5331\n805,5346\n805,5809\n805,5812\n805,6136\n805,6139\n805,6607\n805,6757\n805,6908\n805,7458\n805,7790\n805,8061\n805,8184\n805,8275\n805,8537\n805,8557\n805,8632\n805,9425\n805,13704\n805,14080\n805,14156\n805,14418\n805,14447\n805,15334\n805,15397\n805,15586\n805,15604\n805,17082\n805,19278\n805,19539\n805,19617\n805,20596\n805,20907\n805,20982\n805,21398\n805,21867\n805,22058\n805,22939\n805,23539\n805,23737\n805,24736\n805,24906\n805,25328\n805,27132\n805,28824\n805,29364\n805,32526\n805,32643\n805,32810\n805,32817\n805,33424\n805,34380\n805,34778\n805,34828\n805,35648\n805,36245\n805,36300\n805,36331\n805,37171\n805,38347\n805,38394\n805,39037\n805,39042\n805,40235\n805,40267\n805,42518\n805,43676\n805,44671\n805,45485\n805,46874\n805,48310\n805,48334\n805,48451\n805,48549\n805,48609\n805,49035\n805,49092\n805,50529\n805,52033\n805,52082\n805,54625\n805,55380\n805,55598\n805,55968\n805,56346\n805,57583\n805,57872\n805,59006\n805,59194\n805,59910\n805,62482\n805,62964\n805,63909\n805,64593\n805,65326\n805,65681\n805,67179\n805,69013\n805,72639\n805,72684\n805,72907\n805,75264\n805,75341\n805,75969\n805,79485\n805,79619\n805,80049\n805,82058\n805,82852\n805,83940\n805,84658\n805,86626\n805,88062\n805,90982\n805,94134\n805,95554\n805,96748\n805,97451\n805,97850\n805,98275\n805,98925\n805,100360\n805,102250\n805,103140\n805,103356\n805,104590\n805,104621\n805,107672\n805,111147\n805,112919\n805,113500\n805,113968\n805,114508\n805,115298\n805,115699\n805,118678\n805,119080\n805,120034\n805,120044\n805,120076\n805,122808\n805,125864\n805,126292\n805,126964\n805,130357\n805,131058\n805,131371\n805,132823\n805,133408\n805,133426\n805,133440\n805,133586\n805,133648\n805,135821\n805,135955\n805,136525\n805,136529\n805,137204\n805,141179\n805,142930\n805,144515\n805,146024\n805,146520\n805,147362\n805,147887\n805,148297\n805,150358\n805,152133\n805,155021\n805,155058\n805,156939\n805,158845\n805,159383\n805,159908\n805,161111\n805,161524\n805,161589\n805,166700\n805,167770\n805,168965\n805,168969\n805,169917\n805,174282\n805,176056\n805,176944\n805,177623\n805,178485\n805,182162\n805,182345\n805,182903\n805,183366\n805,185186\n805,187447\n805,189905\n805,190134\n805,192512\n805,194298\n805,196395\n805,199845\n805,201167\n805,201754\n805,201757\n805,201758\n805,202138\n805,203088\n805,203137\n805,203139\n805,203145\n805,203214\n805,203911\n805,203953\n805,204032\n805,205072\n805,205823\n805,205831\n805,205834\n805,206328\n805,206377\n805,206453\n805,207051\n805,207130\n805,207569\n805,211829\n805,211856\n805,213954\n805,214703\n805,215713\n805,216081\n805,216860\n805,218767\n805,219162\n805,226564\n805,230547\n805,230552\n805,237709\n805,238265\n805,241114\n805,241520\n805,249783\n805,249993\n805,250900\n805,251610\n805,253252\n805,261722\n805,264554\n806,731\n807,808\n808,1\n808,3\n808,20\n808,34\n808,87\n808,97\n808,149\n808,167\n808,175\n808,186\n808,192\n808,254\n808,301\n808,302\n808,313\n808,326\n808,390\n808,392\n808,397\n808,406\n808,417\n808,441\n808,455\n808,479\n808,499\n808,500\n808,512\n808,536\n808,622\n808,623\n808,644\n808,652\n808,784\n808,795\n808,807\n808,808\n808,809\n808,818\n808,849\n808,867\n808,872\n808,903\n808,911\n808,918\n808,919\n808,968\n808,972\n808,973\n808,996\n808,997\n808,1014\n808,1052\n808,1084\n808,1094\n808,1118\n808,1147\n808,1210\n808,1240\n808,1241\n808,1267\n808,1293\n808,1326\n808,1380\n808,1417\n808,1465\n808,1479\n808,1513\n808,1522\n808,1531\n808,1566\n808,1575\n808,1623\n808,1724\n808,1796\n808,1805\n808,1848\n808,1860\n808,1949\n808,1973\n808,1992\n808,2083\n808,2480\n808,2494\n808,2512\n808,2699\n808,2810\n808,3003\n808,3182\n808,3207\n808,3392\n808,3504\n808,3804\n808,4039\n808,4066\n808,4177\n808,4276\n808,4286\n808,5052\n808,5209\n808,5632\n808,6904\n808,7008\n808,7098\n808,13222\n808,14477\n808,14594\n808,15171\n808,15313\n808,15407\n808,16110\n808,18880\n808,20012\n808,22324\n808,25422\n808,31414\n808,35063\n808,39402\n808,46648\n808,49958\n808,54279\n808,62932\n808,64541\n808,65742\n808,68677\n808,68681\n808,69986\n808,69987\n808,79590\n808,102755\n808,116177\n808,120949\n808,121416\n808,137253\n808,138700\n808,139765\n808,140293\n808,140308\n808,140320\n808,142342\n808,143332\n808,146303\n808,162985\n808,165775\n808,166313\n808,166394\n808,169843\n808,170928\n808,171017\n808,171020\n808,171388\n808,175948\n808,192872\n808,192911\n808,202664\n808,215276\n808,223674\n808,224837\n808,224849\n808,224857\n808,228163\n808,228178\n808,242189\n808,261925\n809,32\n809,50\n809,87\n809,140\n809,240\n809,287\n809,314\n809,327\n809,349\n809,391\n809,392\n809,433\n809,440\n809,509\n809,510\n809,599\n809,622\n809,663\n809,673\n809,685\n809,697\n809,733\n809,779\n809,808\n809,809\n809,818\n809,837\n809,838\n809,875\n809,903\n809,911\n809,918\n809,950\n809,1014\n809,1023\n809,1130\n809,1151\n809,1179\n809,1210\n809,1607\n809,1634\n809,1659\n809,1796\n809,1949\n809,2016\n809,2129\n809,2310\n809,2361\n809,2418\n809,2475\n809,2749\n809,2819\n809,3453\n809,4039\n809,4132\n809,5065\n809,5256\n809,5259\n809,5285\n809,5827\n809,6013\n809,6456\n809,6646\n809,8041\n809,9330\n809,13279\n809,13847\n809,14040\n809,14360\n809,14621\n809,15654\n809,15806\n809,17852\n809,18295\n809,18815\n809,19010\n809,19517\n809,19618\n809,19730\n809,20798\n809,20799\n809,21139\n809,21422\n809,21914\n809,22293\n809,23338\n809,23447\n809,24790\n809,25121\n809,25803\n809,25863\n809,26145\n809,26253\n809,26516\n809,27063\n809,27827\n809,28532\n809,29458\n809,31091\n809,32645\n809,32677\n809,32897\n809,33049\n809,33802\n809,34381\n809,34694\n809,35668\n809,35959\n809,37438\n809,38896\n809,39095\n809,39690\n809,40558\n809,41866\n809,42737\n809,43239\n809,43279\n809,43305\n809,45667\n809,48031\n809,48168\n809,48390\n809,48792\n809,50367\n809,54952\n809,55041\n809,55686\n809,56539\n809,56609\n809,57873\n809,58222\n809,59108\n809,59167\n809,62943\n809,63455\n809,64667\n809,64684\n809,67172\n809,68069\n809,72048\n809,72070\n809,72467\n809,74557\n809,77816\n809,80667\n809,81555\n809,82582\n809,82900\n809,84493\n809,85802\n809,85829\n809,86733\n809,88661\n809,89378\n809,89661\n809,90327\n809,91980\n809,94161\n809,94252\n809,95066\n809,97491\n809,101588\n809,102409\n809,103032\n809,103413\n809,104403\n809,109434\n809,110486\n809,112459\n809,112722\n809,114203\n809,114597\n809,115066\n809,115698\n809,116372\n809,117019\n809,118898\n809,118939\n809,119467\n809,119527\n809,122059\n809,122545\n809,122574\n809,123542\n809,123725\n809,124896\n809,126720\n809,126781\n809,127158\n809,127720\n809,127808\n809,127841\n809,128162\n809,128783\n809,129091\n809,129851\n809,130330\n809,130337\n809,130363\n809,130376\n809,134048\n809,134067\n809,134194\n809,134672\n809,134773\n809,134777\n809,135133\n809,135228\n809,135534\n809,135535\n809,135536\n809,135537\n809,135538\n809,135539\n809,135540\n809,135541\n809,135542\n809,135543\n809,135544\n809,135545\n809,135546\n809,135547\n809,135548\n809,135549\n809,135550\n809,135551\n809,135552\n809,135553\n809,135554\n809,135555\n809,135556\n809,135557\n809,135558\n809,135559\n809,135560\n809,135561\n809,135562\n809,140117\n809,140540\n809,140736\n809,141912\n809,142688\n809,143532\n809,145395\n809,146448\n809,146708\n809,148046\n809,150160\n809,150533\n809,151398\n809,152129\n809,155405\n809,156310\n809,156652\n809,158165\n809,158990\n809,159017\n809,160487\n809,160844\n809,160870\n809,161184\n809,161217\n809,162515\n809,165296\n809,167672\n809,170077\n809,172630\n809,173895\n809,175599\n809,177379\n809,178266\n809,179135\n809,182780\n809,183812\n809,183940\n809,189275\n809,189931\n809,191939\n809,200353\n809,201733\n809,207659\n809,211927\n809,214086\n809,216512\n809,220473\n809,220486\n809,226432\n809,235623\n809,241138\n809,241660\n809,244790\n809,245699\n809,253336\n809,254949\n809,256467\n809,256828\n809,256847\n809,256869\n809,256870\n809,256900\n809,258323\n809,258778\n809,260263\n809,261693\n809,263953\n810,20\n810,48\n810,63\n810,65\n810,79\n810,81\n810,86\n810,146\n810,160\n810,163\n810,187\n810,192\n810,200\n810,207\n810,251\n810,264\n810,305\n810,312\n810,315\n810,326\n810,344\n810,346\n810,366\n810,388\n810,393\n810,408\n810,424\n810,430\n810,440\n810,467\n810,527\n810,599\n810,609\n810,615\n810,628\n810,634\n810,660\n810,694\n810,707\n810,710\n810,726\n810,740\n810,741\n810,743\n810,784\n810,795\n810,811\n810,827\n810,835\n810,838\n810,849\n810,852\n810,868\n810,872\n810,920\n810,972\n810,1052\n810,1082\n810,1118\n810,1122\n810,1127\n810,1133\n810,1146\n810,1191\n810,1282\n810,1284\n810,1298\n810,1368\n810,1381\n810,1424\n810,1509\n810,1707\n810,1796\n810,1801\n810,1837\n810,2244\n810,2373\n810,3524\n810,3653\n810,3695\n810,4355\n810,4805\n810,5326\n810,6556\n810,16196\n810,19443\n810,21442\n810,23132\n810,68140\n810,75912\n810,118336\n810,142430\n810,215276\n810,257126\n810,262457\n811,811\n811,911\n811,1293\n812,444\n812,567\n812,604\n812,812\n812,813\n812,1027\n812,1037\n812,1258\n812,1293\n812,1407\n812,1985\n812,3869\n812,4170\n812,4173\n812,4428\n812,6833\n812,6842\n812,7087\n812,7303\n812,7986\n812,8807\n812,15329\n812,19588\n812,21316\n812,26096\n812,28128\n812,28854\n812,28884\n812,29780\n812,38349\n812,40496\n812,41947\n812,42595\n812,46755\n812,57075\n812,58925\n812,62950\n812,65685\n812,65785\n812,71711\n812,72548\n812,74577\n812,79380\n812,82099\n812,83233\n812,83240\n812,83841\n812,83959\n812,85780\n812,93767\n812,94279\n812,94845\n812,95005\n812,96635\n812,96653\n812,97103\n812,98201\n812,99691\n812,107329\n812,107917\n812,108048\n812,108141\n812,109410\n812,121895\n812,122390\n812,122870\n812,123965\n812,123969\n812,126854\n812,127341\n812,128765\n812,129843\n812,135185\n812,135186\n812,135276\n812,138009\n812,146636\n812,147497\n812,150732\n812,154282\n812,157654\n812,158263\n812,158270\n812,161085\n812,183331\n812,195533\n812,199277\n812,212380\n812,221099\n812,223653\n812,225367\n812,228475\n812,249138\n812,254178\n812,254186\n812,256169\n813,1293\n814,34\n814,35\n814,54\n814,120\n814,222\n814,261\n814,283\n814,389\n814,455\n814,644\n814,657\n814,1019\n814,1467\n814,2266\n814,2646\n814,3115\n814,8180\n815,459\n815,4223\n816,668\n816,798\n817,137\n818,10\n818,22\n818,34\n818,35\n818,50\n818,68\n818,120\n818,149\n818,158\n818,167\n818,178\n818,182\n818,186\n818,192\n818,195\n818,202\n818,203\n818,217\n818,240\n818,255\n818,261\n818,278\n818,294\n818,298\n818,301\n818,302\n818,314\n818,326\n818,333\n818,336\n818,349\n818,372\n818,389\n818,390\n818,392\n818,397\n818,406\n818,413\n818,417\n818,433\n818,440\n818,446\n818,452\n818,455\n818,467\n818,493\n818,500\n818,505\n818,510\n818,515\n818,536\n818,577\n818,586\n818,592\n818,599\n818,615\n818,623\n818,626\n818,631\n818,661\n818,673\n818,677\n818,685\n818,693\n818,697\n818,725\n818,748\n818,749\n818,752\n818,761\n818,779\n818,794\n818,808\n818,809\n818,818\n818,819\n818,823\n818,838\n818,861\n818,872\n818,873\n818,874\n818,918\n818,949\n818,968\n818,973\n818,1001\n818,1010\n818,1011\n818,1014\n818,1023\n818,1058\n818,1082\n818,1085\n818,1118\n818,1130\n818,1151\n818,1172\n818,1191\n818,1192\n818,1204\n818,1210\n818,1220\n818,1222\n818,1231\n818,1238\n818,1240\n818,1241\n818,1284\n818,1285\n818,1298\n818,1309\n818,1331\n818,1361\n818,1370\n818,1417\n818,1465\n818,1515\n818,1518\n818,1531\n818,1559\n818,1564\n818,1566\n818,1572\n818,1619\n818,1623\n818,1634\n818,1635\n818,1678\n818,1688\n818,1705\n818,1726\n818,1743\n818,1785\n818,1796\n818,1805\n818,1818\n818,1853\n818,1955\n818,1973\n818,1998\n818,2221\n818,2228\n818,2235\n818,2296\n818,2348\n818,2373\n818,2470\n818,2480\n818,2512\n818,2557\n818,2620\n818,2689\n818,2732\n818,2784\n818,2797\n818,2812\n818,2819\n818,2820\n818,2895\n818,2974\n818,2989\n818,2991\n818,3115\n818,3182\n818,3577\n818,3578\n818,3590\n818,3610\n818,3629\n818,3810\n818,3867\n818,3993\n818,4066\n818,4109\n818,4223\n818,4286\n818,4562\n818,4565\n818,4585\n818,4692\n818,4701\n818,4751\n818,4787\n818,5228\n818,5231\n818,5293\n818,5322\n818,5346\n818,5361\n818,5410\n818,5433\n818,5451\n818,5510\n818,5654\n818,5818\n818,6525\n818,6526\n818,6837\n818,6895\n818,6935\n818,7338\n818,7456\n818,7473\n818,7502\n818,7891\n818,8243\n818,8323\n818,8344\n818,8537\n818,8686\n818,8861\n818,8944\n818,9361\n818,13142\n818,13274\n818,13445\n818,13524\n818,13695\n818,13712\n818,13832\n818,13840\n818,14064\n818,14121\n818,14133\n818,14158\n818,14246\n818,14358\n818,14456\n818,14546\n818,15277\n818,15454\n818,15556\n818,15648\n818,15763\n818,16190\n818,16436\n818,16518\n818,16596\n818,16653\n818,18146\n818,18240\n818,18245\n818,18409\n818,18499\n818,18925\n818,18996\n818,19388\n818,19454\n818,19617\n818,19663\n818,19817\n818,20520\n818,20560\n818,20747\n818,20757\n818,20788\n818,21173\n818,21321\n818,21366\n818,21420\n818,21422\n818,21510\n818,21547\n818,21580\n818,22277\n818,22318\n818,22337\n818,22808\n818,23354\n818,23576\n818,23683\n818,24605\n818,24757\n818,24815\n818,25662\n818,25748\n818,26034\n818,26149\n818,26362\n818,26905\n818,27041\n818,27827\n818,27903\n818,28166\n818,28310\n818,28501\n818,28545\n818,28973\n818,29089\n818,30373\n818,30577\n818,30683\n818,31207\n818,31230\n818,32819\n818,33424\n818,33506\n818,34314\n818,34418\n818,34524\n818,34817\n818,34975\n818,35672\n818,37147\n818,37171\n818,37407\n818,38446\n818,38743\n818,38936\n818,39163\n818,39690\n818,39691\n818,39692\n818,39693\n818,39695\n818,40824\n818,41106\n818,41206\n818,41860\n818,42837\n818,43231\n818,43294\n818,43750\n818,44115\n818,44416\n818,45760\n818,45985\n818,46271\n818,46894\n818,46936\n818,47371\n818,47848\n818,48253\n818,49627\n818,49699\n818,49741\n818,50386\n818,50588\n818,50828\n818,50879\n818,50987\n818,51359\n818,51727\n818,51919\n818,51921\n818,52153\n818,52539\n818,54348\n818,54684\n818,54958\n818,55138\n818,55149\n818,55764\n818,55780\n818,55918\n818,56736\n818,57583\n818,58489\n818,58564\n818,58990\n818,59097\n818,59100\n818,59148\n818,59180\n818,59226\n818,59706\n818,59953\n818,59990\n818,60410\n818,60627\n818,61089\n818,61261\n818,61324\n818,63083\n818,63107\n818,63411\n818,63962\n818,64208\n818,65747\n818,65856\n818,65860\n818,65881\n818,66013\n818,66048\n818,66297\n818,66301\n818,66367\n818,66664\n818,67185\n818,67363\n818,67442\n818,67951\n818,69947\n818,69981\n818,70127\n818,70147\n818,70226\n818,70323\n818,70398\n818,70873\n818,70961\n818,71166\n818,71204\n818,71316\n818,71678\n818,71697\n818,72840\n818,72889\n818,73260\n818,74763\n818,75208\n818,75912\n818,75936\n818,76732\n818,77817\n818,77819\n818,78623\n818,78813\n818,79306\n818,79619\n818,79625\n818,79695\n818,80425\n818,80454\n818,80751\n818,81132\n818,81133\n818,82078\n818,82667\n818,82851\n818,83217\n818,84175\n818,86760\n818,87892\n818,87924\n818,89607\n818,91051\n818,91468\n818,91505\n818,91880\n818,91993\n818,93134\n818,94077\n818,94336\n818,94877\n818,95823\n818,97248\n818,98275\n818,98451\n818,99165\n818,100139\n818,101178\n818,102508\n818,102773\n818,102778\n818,105006\n818,106250\n818,107053\n818,109539\n818,109945\n818,109999\n818,111978\n818,112032\n818,112938\n818,113249\n818,113446\n818,115251\n818,115431\n818,115479\n818,118336\n818,118490\n818,119305\n818,119394\n818,119416\n818,119692\n818,120193\n818,120683\n818,120907\n818,121209\n818,121381\n818,122136\n818,122425\n818,123007\n818,123355\n818,123396\n818,123507\n818,126298\n818,127100\n818,127158\n818,127267\n818,127718\n818,127959\n818,128320\n818,128472\n818,128870\n818,128965\n818,129101\n818,129480\n818,129880\n818,130197\n818,130761\n818,130840\n818,130898\n818,130969\n818,131360\n818,131532\n818,131784\n818,131860\n818,131861\n818,131944\n818,132068\n818,133020\n818,133118\n818,134958\n818,134967\n818,134968\n818,138139\n818,138175\n818,138244\n818,139495\n818,139550\n818,139691\n818,139994\n818,140102\n818,140547\n818,144231\n818,145049\n818,145207\n818,146413\n818,146626\n818,146748\n818,146885\n818,147034\n818,147847\n818,148352\n818,150477\n818,150741\n818,150760\n818,150764\n818,151063\n818,152152\n818,154905\n818,157024\n818,158474\n818,158475\n818,158700\n818,158847\n818,159067\n818,159400\n818,160861\n818,163326\n818,163366\n818,163856\n818,164213\n818,164490\n818,165320\n818,165952\n818,165988\n818,167737\n818,168271\n818,168309\n818,168442\n818,168454\n818,168644\n818,168979\n818,169948\n818,170239\n818,170451\n818,170734\n818,171292\n818,171483\n818,171581\n818,171641\n818,174327\n818,174842\n818,174857\n818,175184\n818,175214\n818,175993\n818,176053\n818,176115\n818,176434\n818,176830\n818,177353\n818,177511\n818,177842\n818,179804\n818,179948\n818,180465\n818,181063\n818,181439\n818,182227\n818,182506\n818,183856\n818,184795\n818,185627\n818,186263\n818,187280\n818,189327\n818,189462\n818,191066\n818,194330\n818,195835\n818,198364\n818,198442\n818,201514\n818,201854\n818,205188\n818,215286\n818,216860\n818,221029\n818,221735\n818,221843\n818,221941\n818,224740\n818,224848\n818,225336\n818,225775\n818,226520\n818,227881\n818,228492\n818,229229\n818,229898\n818,232106\n818,232939\n818,233759\n818,235568\n818,236648\n818,236973\n818,237394\n818,237679\n818,239878\n818,244131\n818,245584\n818,246565\n818,247230\n818,247338\n818,249659\n818,249940\n818,249959\n818,250718\n818,251387\n818,251918\n818,251920\n818,252562\n818,252653\n818,255555\n818,255774\n818,258961\n818,261724\n818,261800\n818,262089\n818,263088\n818,264437\n818,264646\n819,240\n819,622\n819,818\n820,505\n821,58\n821,534\n822,358\n822,509\n822,510\n823,10\n823,41\n823,68\n823,240\n823,332\n823,431\n823,626\n823,631\n823,805\n823,818\n823,1011\n823,1119\n823,1635\n823,1955\n823,2512\n823,2620\n823,2989\n823,2991\n823,2995\n823,3135\n823,6837\n823,179804\n824,287\n825,497\n826,202\n827,491\n827,685\n827,827\n827,849\n827,3653\n827,9457\n828,687\n828,1556\n829,217\n830,54\n830,718\n831,832\n832,528\n832,831\n832,832\n832,1319\n832,1522\n832,2470\n832,2475\n832,4288\n832,6327\n832,9327\n832,13489\n832,15281\n832,22228\n832,22642\n832,22646\n832,22653\n832,22654\n832,23008\n832,23157\n832,26402\n832,26406\n832,31314\n832,31720\n832,46271\n832,47039\n832,48928\n832,50493\n832,52205\n832,53294\n832,54111\n832,55090\n832,62006\n832,72067\n832,72763\n832,102347\n832,116857\n832,130119\n834,647\n834,835\n834,991\n834,1102\n834,1659\n834,3177\n835,4039\n836,306\n836,307\n837,30\n837,328\n837,440\n837,622\n837,794\n837,3247\n838,3\n838,10\n838,20\n838,32\n838,34\n838,35\n838,68\n838,72\n838,86\n838,87\n838,97\n838,104\n838,111\n838,120\n838,126\n838,136\n838,140\n838,158\n838,167\n838,186\n838,192\n838,200\n838,202\n838,203\n838,207\n838,240\n838,248\n838,256\n838,259\n838,261\n838,264\n838,272\n838,278\n838,289\n838,290\n838,292\n838,294\n838,299\n838,301\n838,302\n838,312\n838,314\n838,323\n838,332\n838,336\n838,337\n838,356\n838,387\n838,388\n838,390\n838,392\n838,397\n838,406\n838,417\n838,420\n838,433\n838,435\n838,441\n838,452\n838,457\n838,479\n838,481\n838,493\n838,505\n838,509\n838,510\n838,516\n838,536\n838,577\n838,589\n838,590\n838,599\n838,615\n838,631\n838,663\n838,668\n838,673\n838,676\n838,677\n838,697\n838,718\n838,764\n838,794\n838,801\n838,809\n838,818\n838,838\n838,839\n838,843\n838,849\n838,850\n838,852\n838,855\n838,861\n838,862\n838,872\n838,907\n838,911\n838,918\n838,920\n838,932\n838,933\n838,972\n838,973\n838,1001\n838,1014\n838,1017\n838,1019\n838,1085\n838,1089\n838,1130\n838,1133\n838,1140\n838,1143\n838,1147\n838,1151\n838,1167\n838,1172\n838,1179\n838,1191\n838,1210\n838,1231\n838,1240\n838,1243\n838,1267\n838,1282\n838,1284\n838,1285\n838,1289\n838,1293\n838,1298\n838,1309\n838,1326\n838,1332\n838,1345\n838,1368\n838,1370\n838,1381\n838,1402\n838,1411\n838,1417\n838,1434\n838,1436\n838,1445\n838,1452\n838,1454\n838,1462\n838,1466\n838,1509\n838,1511\n838,1518\n838,1522\n838,1531\n838,1544\n838,1556\n838,1564\n838,1566\n838,1631\n838,1634\n838,1655\n838,1659\n838,1663\n838,1715\n838,1722\n838,1724\n838,1749\n838,1782\n838,1796\n838,1805\n838,1837\n838,1844\n838,1860\n838,1992\n838,2045\n838,2209\n838,2286\n838,2334\n838,2373\n838,2436\n838,2443\n838,2512\n838,2556\n838,2557\n838,2605\n838,2671\n838,2713\n838,2782\n838,2979\n838,2991\n838,3182\n838,3260\n838,3392\n838,3478\n838,3507\n838,3524\n838,3804\n838,3876\n838,4177\n838,4276\n838,4315\n838,4532\n838,4545\n838,4771\n838,5388\n838,5961\n838,6119\n838,6391\n838,6452\n838,6469\n838,6837\n838,6955\n838,7024\n838,7092\n838,7862\n838,8276\n838,8537\n838,9030\n838,12747\n838,13207\n838,18013\n838,18194\n838,19413\n838,19592\n838,21589\n838,24934\n838,26161\n838,26450\n838,29595\n838,30344\n838,31207\n838,32464\n838,32819\n838,39055\n838,41230\n838,41893\n838,46803\n838,48961\n838,50174\n838,50318\n838,55763\n838,56150\n838,59914\n838,66515\n838,68772\n838,75912\n838,80966\n838,82217\n838,108048\n838,109953\n838,111370\n838,115474\n838,116898\n838,117013\n838,118372\n838,122519\n838,135130\n838,136622\n838,160490\n838,164889\n838,167601\n838,176819\n838,185268\n838,193533\n838,216170\n838,217645\n838,232051\n838,232699\n838,234116\n838,249117\n838,259530\n838,263316\n839,838\n840,788\n840,841\n841,1\n841,10\n841,44\n841,50\n841,56\n841,97\n841,99\n841,146\n841,147\n841,158\n841,175\n841,192\n841,195\n841,206\n841,285\n841,304\n841,333\n841,336\n841,356\n841,406\n841,422\n841,440\n841,446\n841,505\n841,516\n841,602\n841,620\n841,640\n841,668\n841,685\n841,693\n841,733\n841,779\n841,841\n841,911\n841,920\n841,957\n841,1089\n841,1181\n841,1198\n841,1218\n841,1425\n841,1464\n841,1498\n841,1504\n841,1515\n841,1619\n841,1623\n841,1773\n841,1815\n841,1825\n841,1848\n841,1969\n841,1993\n841,2014\n841,2244\n841,2324\n841,2386\n841,2782\n841,2874\n841,3370\n841,3507\n841,3895\n841,5313\n841,5356\n841,5401\n841,5424\n841,6119\n841,7296\n841,7318\n841,9394\n841,14136\n841,14453\n841,20375\n841,22616\n841,22699\n841,23494\n841,23783\n841,26928\n841,26939\n841,27834\n841,28002\n841,29129\n841,30331\n841,30557\n841,33287\n841,41907\n841,60576\n841,64067\n841,74338\n841,75249\n841,92476\n841,101863\n841,102560\n841,103208\n841,103852\n841,106352\n841,116131\n841,117818\n841,118068\n841,119325\n841,123797\n841,124889\n841,125018\n841,135236\n841,141912\n841,176396\n841,204124\n841,240174\n842,827\n842,911\n843,20\n843,56\n843,68\n843,130\n843,182\n843,192\n843,202\n843,203\n843,207\n843,209\n843,217\n843,248\n843,256\n843,264\n843,289\n843,290\n843,299\n843,301\n843,313\n843,314\n843,333\n843,356\n843,360\n843,392\n843,425\n843,435\n843,452\n843,457\n843,479\n843,497\n843,509\n843,512\n843,536\n843,599\n843,604\n843,615\n843,631\n843,663\n843,664\n843,668\n843,671\n843,673\n843,676\n843,713\n843,794\n843,838\n843,843\n843,849\n843,852\n843,856\n843,862\n843,872\n843,900\n843,911\n843,918\n843,968\n843,972\n843,992\n843,1001\n843,1011\n843,1014\n843,1043\n843,1085\n843,1130\n843,1133\n843,1147\n843,1148\n843,1172\n843,1174\n843,1191\n843,1204\n843,1210\n843,1262\n843,1267\n843,1285\n843,1293\n843,1313\n843,1318\n843,1326\n843,1345\n843,1368\n843,1388\n843,1402\n843,1417\n843,1445\n843,1462\n843,1518\n843,1566\n843,1655\n843,1796\n843,1818\n843,1844\n843,1877\n843,1893\n843,1955\n843,1992\n843,2253\n843,2310\n843,2373\n843,2460\n843,2580\n843,2590\n843,2605\n843,2891\n843,3094\n843,3260\n843,3507\n843,3967\n843,4152\n843,4190\n843,4271\n843,4276\n843,4365\n843,4370\n843,4389\n843,4428\n843,4771\n843,5213\n843,6568\n843,6661\n843,6824\n843,7041\n843,8165\n843,9457\n843,14383\n843,14387\n843,14674\n843,14767\n843,15348\n843,15456\n843,17626\n843,19413\n843,19572\n843,21382\n843,21442\n843,21561\n843,26034\n843,26450\n843,28994\n843,29638\n843,29890\n843,31435\n843,37073\n843,38874\n843,38994\n843,40778\n843,41632\n843,43171\n843,43762\n843,46420\n843,48023\n843,48032\n843,48144\n843,48633\n843,50197\n843,52547\n843,54369\n843,55048\n843,59054\n843,59084\n843,59101\n843,61350\n843,63566\n843,75252\n843,75467\n843,75912\n843,79638\n843,82762\n843,83262\n843,83970\n843,88005\n843,89657\n843,89946\n843,90922\n843,93136\n843,96793\n843,98358\n843,104573\n843,106318\n843,106341\n843,106530\n843,107019\n843,107061\n843,107074\n843,107983\n843,109386\n843,113576\n843,113634\n843,115474\n843,117013\n843,117480\n843,118914\n843,122015\n843,122409\n843,123970\n843,126811\n843,137248\n843,137260\n843,139377\n843,139687\n843,141873\n843,142245\n843,148924\n843,149250\n843,150434\n843,151484\n843,152299\n843,158337\n843,158929\n843,159353\n843,159861\n843,161938\n843,170725\n843,172106\n843,172284\n843,173903\n843,174367\n843,174660\n843,175971\n843,176030\n843,177817\n843,179405\n843,180389\n843,181019\n843,181900\n843,182465\n843,183381\n843,186080\n843,189140\n843,189399\n843,192024\n843,192032\n843,192033\n843,193536\n843,193675\n843,195090\n843,212051\n843,212475\n843,214331\n843,215276\n843,215874\n843,216002\n843,216170\n843,221755\n843,222655\n843,225470\n843,229026\n843,233091\n843,235877\n843,236182\n843,242994\n843,247758\n843,247873\n843,253200\n843,254490\n843,256395\n843,259732\n843,260911\n843,263352\n844,20\n844,175\n845,326\n845,37414\n846,130\n846,261\n846,292\n846,298\n846,305\n846,473\n846,557\n846,647\n846,694\n846,703\n846,893\n846,1058\n846,1368\n846,1388\n846,1619\n846,1767\n846,2135\n846,2353\n846,3089\n846,4172\n846,5540\n846,5658\n846,6638\n846,7614\n847,586\n847,718\n849,20\n849,68\n849,83\n849,104\n849,107\n849,134\n849,135\n849,147\n849,149\n849,158\n849,167\n849,200\n849,202\n849,203\n849,240\n849,248\n849,251\n849,252\n849,254\n849,256\n849,259\n849,261\n849,278\n849,289\n849,290\n849,292\n849,299\n849,301\n849,302\n849,312\n849,313\n849,314\n849,336\n849,346\n849,364\n849,390\n849,392\n849,397\n849,415\n849,422\n849,447\n849,452\n849,455\n849,467\n849,489\n849,505\n849,509\n849,516\n849,535\n849,536\n849,575\n849,577\n849,602\n849,622\n849,623\n849,626\n849,668\n849,671\n849,673\n849,676\n849,685\n849,693\n849,733\n849,779\n849,794\n849,827\n849,838\n849,843\n849,849\n849,852\n849,868\n849,893\n849,911\n849,918\n849,920\n849,972\n849,1001\n849,1011\n849,1058\n849,1085\n849,1118\n849,1130\n849,1132\n849,1133\n849,1147\n849,1151\n849,1182\n849,1212\n849,1220\n849,1222\n849,1240\n849,1243\n849,1267\n849,1274\n849,1284\n849,1285\n849,1326\n849,1345\n849,1370\n849,1417\n849,1445\n849,1467\n849,1551\n849,1566\n849,1644\n849,1688\n849,1722\n849,1786\n849,1844\n849,1899\n849,1939\n849,1992\n849,2105\n849,2205\n849,2210\n849,2228\n849,2244\n849,2310\n849,2315\n849,2373\n849,2460\n849,2512\n849,3003\n849,3247\n849,3392\n849,3524\n849,3582\n849,3820\n849,4039\n849,4123\n849,4190\n849,4237\n849,4271\n849,4276\n849,4277\n849,4771\n849,5326\n849,5718\n849,8149\n849,8276\n849,8676\n849,9457\n849,13207\n849,14232\n849,14633\n849,16537\n849,20535\n849,22389\n849,25526\n849,26450\n849,27041\n849,33424\n849,41051\n849,41378\n849,42779\n849,48292\n849,48956\n849,54004\n849,67205\n849,75196\n849,75912\n849,77679\n849,82206\n849,87709\n849,93766\n849,97104\n849,99732\n849,102518\n849,110037\n849,115474\n849,116949\n849,118950\n849,138008\n849,139929\n849,141912\n849,142472\n849,144113\n849,150027\n849,162574\n849,162692\n849,165286\n849,170652\n849,172224\n849,194909\n849,201142\n849,206098\n849,207659\n849,212455\n849,212540\n849,236087\n849,238790\n849,244684\n849,250546\n849,251959\n849,256278\n849,258887\n850,104\n850,200\n850,225\n850,248\n850,364\n850,450\n850,557\n850,805\n850,850\n850,851\n850,953\n850,1011\n850,1179\n850,1332\n850,2212\n850,2847\n850,3247\n850,3483\n850,3496\n850,4046\n850,4105\n850,4276\n850,4713\n850,4900\n850,4961\n850,5053\n850,5852\n850,6373\n850,7214\n850,7531\n850,7982\n850,7993\n850,8085\n850,9369\n850,13207\n850,13321\n850,15344\n850,16758\n850,17250\n850,18877\n850,19123\n850,19502\n850,20510\n850,23077\n850,24360\n850,26673\n850,27097\n850,27103\n850,28800\n850,34930\n850,39091\n850,41078\n850,49249\n850,49279\n850,49282\n850,49298\n850,49307\n850,49326\n850,49347\n850,49356\n850,49369\n850,49384\n850,49400\n850,49406\n850,49409\n850,49412\n850,49418\n850,49425\n850,49427\n850,49438\n850,49440\n850,49441\n850,49448\n850,49815\n850,49963\n850,51408\n850,52157\n850,52672\n850,53347\n850,54315\n850,54462\n850,57498\n850,63175\n850,69532\n850,74755\n850,76733\n850,78729\n850,78923\n850,85234\n850,90893\n850,94124\n850,101587\n850,103208\n850,110765\n850,111139\n850,113371\n850,130762\n850,142617\n850,145625\n850,146513\n850,148762\n850,155544\n850,158430\n850,160537\n850,161374\n850,165390\n850,167794\n850,170018\n850,170902\n850,176389\n850,179543\n850,183392\n850,186076\n850,187378\n850,190561\n850,191910\n850,200279\n850,203119\n850,204673\n850,215485\n850,231999\n850,244018\n850,248497\n851,248\n851,338\n851,850\n852,34\n852,35\n852,41\n852,54\n852,58\n852,68\n852,83\n852,87\n852,99\n852,102\n852,104\n852,167\n852,222\n852,240\n852,256\n852,259\n852,261\n852,278\n852,292\n852,301\n852,313\n852,314\n852,332\n852,336\n852,337\n852,347\n852,349\n852,356\n852,372\n852,379\n852,387\n852,388\n852,392\n852,408\n852,417\n852,422\n852,430\n852,431\n852,442\n852,444\n852,452\n852,455\n852,457\n852,493\n852,509\n852,510\n852,516\n852,525\n852,534\n852,535\n852,536\n852,557\n852,577\n852,595\n852,599\n852,609\n852,611\n852,615\n852,623\n852,626\n852,631\n852,634\n852,663\n852,664\n852,666\n852,668\n852,676\n852,677\n852,682\n852,690\n852,694\n852,697\n852,703\n852,704\n852,744\n852,775\n852,794\n852,801\n852,811\n852,838\n852,843\n852,849\n852,852\n852,853\n852,872\n852,873\n852,875\n852,900\n852,911\n852,918\n852,920\n852,941\n852,967\n852,968\n852,980\n852,991\n852,1014\n852,1043\n852,1058\n852,1070\n852,1085\n852,1089\n852,1130\n852,1133\n852,1143\n852,1167\n852,1172\n852,1179\n852,1191\n852,1204\n852,1235\n852,1240\n852,1246\n852,1274\n852,1309\n852,1323\n852,1326\n852,1332\n852,1335\n852,1353\n852,1368\n852,1400\n852,1402\n852,1419\n852,1435\n852,1436\n852,1454\n852,1462\n852,1467\n852,1503\n852,1511\n852,1513\n852,1522\n852,1572\n852,1580\n852,1612\n852,1616\n852,1618\n852,1663\n852,1684\n852,1688\n852,1722\n852,1740\n852,1782\n852,1796\n852,1801\n852,1844\n852,1849\n852,1954\n852,1955\n852,1986\n852,1992\n852,2224\n852,2253\n852,2334\n852,2373\n852,2436\n852,2557\n852,2572\n852,2590\n852,2605\n852,2646\n852,2699\n852,2784\n852,2812\n852,2891\n852,2995\n852,3003\n852,3069\n852,3182\n852,3260\n852,3367\n852,3392\n852,3422\n852,3617\n852,3630\n852,3653\n852,3713\n852,3804\n852,3830\n852,4039\n852,4112\n852,4190\n852,4220\n852,4222\n852,4238\n852,4276\n852,4545\n852,4707\n852,5301\n852,5323\n852,5426\n852,5591\n852,5726\n852,5788\n852,5961\n852,6068\n852,6676\n852,7159\n852,7757\n852,7768\n852,7774\n852,8214\n852,8435\n852,8479\n852,13240\n852,14682\n852,14816\n852,15109\n852,15293\n852,15458\n852,15463\n852,15690\n852,15764\n852,18543\n852,18626\n852,18827\n852,18844\n852,18881\n852,19335\n852,19439\n852,19443\n852,19458\n852,19535\n852,19572\n852,20749\n852,20772\n852,20803\n852,21568\n852,21593\n852,21982\n852,22071\n852,22078\n852,22433\n852,23446\n852,23517\n852,24583\n852,25399\n852,25506\n852,25593\n852,26041\n852,26450\n852,26789\n852,27067\n852,28229\n852,28263\n852,28343\n852,28487\n852,29685\n852,29692\n852,30296\n852,30450\n852,30872\n852,31003\n852,31055\n852,31216\n852,32694\n852,32751\n852,32784\n852,33522\n852,34116\n852,35625\n852,36678\n852,37503\n852,37547\n852,38335\n852,38859\n852,39111\n852,41207\n852,41272\n852,41437\n852,41936\n852,42575\n852,42590\n852,42990\n852,44518\n852,44777\n852,44926\n852,45498\n852,46082\n852,46359\n852,46807\n852,47173\n852,47990\n852,48101\n852,48475\n852,50308\n852,51972\n852,55093\n852,55715\n852,56775\n852,56903\n852,57009\n852,57125\n852,57144\n852,57192\n852,57411\n852,58431\n852,59113\n852,61089\n852,62239\n852,62316\n852,62319\n852,63075\n852,63088\n852,63159\n852,63678\n852,63880\n852,66297\n852,66350\n852,67168\n852,68046\n852,68053\n852,68064\n852,68332\n852,68383\n852,68691\n852,68742\n852,69119\n852,70029\n852,71029\n852,71914\n852,72001\n852,72395\n852,72439\n852,74410\n852,74685\n852,74790\n852,75347\n852,75355\n852,75912\n852,79609\n852,80682\n852,81508\n852,87372\n852,87898\n852,89766\n852,90187\n852,90296\n852,90348\n852,91258\n852,91309\n852,92876\n852,92883\n852,94195\n852,94308\n852,95380\n852,95418\n852,95778\n852,98321\n852,99076\n852,99707\n852,99790\n852,101738\n852,101954\n852,105567\n852,105686\n852,105824\n852,106184\n852,106255\n852,106892\n852,107561\n852,110186\n852,110214\n852,110575\n852,112874\n852,113353\n852,114158\n852,114559\n852,115740\n852,115805\n852,116902\n852,116929\n852,118261\n852,118419\n852,118956\n852,119428\n852,120061\n852,121107\n852,122795\n852,125082\n852,125102\n852,125461\n852,125500\n852,125885\n852,126808\n852,127072\n852,129924\n852,129927\n852,130228\n852,130501\n852,131279\n852,131285\n852,131389\n852,131761\n852,131782\n852,133203\n852,133576\n852,133584\n852,133599\n852,134177\n852,136674\n852,139010\n852,139787\n852,140127\n852,140427\n852,140653\n852,141248\n852,142757\n852,142859\n852,142863\n852,143495\n852,144136\n852,145149\n852,145533\n852,145852\n852,145959\n852,146450\n852,146652\n852,146844\n852,147415\n852,147510\n852,147533\n852,147537\n852,147540\n852,147542\n852,147546\n852,147962\n852,148052\n852,149277\n852,151480\n852,151482\n852,151531\n852,152503\n852,152597\n852,152858\n852,153263\n852,153746\n852,153860\n852,153877\n852,154004\n852,154464\n852,154756\n852,154772\n852,154890\n852,154896\n852,155181\n852,155334\n852,155479\n852,156691\n852,157599\n852,158976\n852,159727\n852,161685\n852,162609\n852,163400\n852,163450\n852,163451\n852,163780\n852,164994\n852,164999\n852,165105\n852,165373\n852,165767\n852,167801\n852,169024\n852,169087\n852,169602\n852,169609\n852,169773\n852,169942\n852,171183\n852,171805\n852,171814\n852,172242\n852,173314\n852,173477\n852,173496\n852,173547\n852,173814\n852,173836\n852,173841\n852,173937\n852,174142\n852,174799\n852,174987\n852,175332\n852,175426\n852,176072\n852,177329\n852,177952\n852,178856\n852,179049\n852,182407\n852,183056\n852,183933\n852,184022\n852,184781\n852,184866\n852,184977\n852,184978\n852,185312\n852,185341\n852,185564\n852,186785\n852,186860\n852,187425\n852,188799\n852,188801\n852,188835\n852,188847\n852,188903\n852,189208\n852,190706\n852,191267\n852,191348\n852,191893\n852,192046\n852,192617\n852,192635\n852,193154\n852,193598\n852,194577\n852,194583\n852,194590\n852,194923\n852,195162\n852,195755\n852,197848\n852,198170\n852,198303\n852,201318\n852,201551\n852,205691\n852,207049\n852,207248\n852,207685\n852,211896\n852,211946\n852,212052\n852,212368\n852,213221\n852,214281\n852,214307\n852,214910\n852,215518\n852,215874\n852,216297\n852,217632\n852,218436\n852,219139\n852,219985\n852,224531\n852,224778\n852,226297\n852,228260\n852,228263\n852,228266\n852,229934\n852,230592\n852,232817\n852,233053\n852,236712\n852,236817\n852,236838\n852,237462\n852,238253\n852,238715\n852,240031\n852,240041\n852,240048\n852,240401\n852,240476\n852,241181\n852,241601\n852,241877\n852,244096\n852,245865\n852,245955\n852,245967\n852,247321\n852,248362\n852,251532\n852,252140\n852,255798\n852,259792\n852,261844\n853,87\n853,1579\n854,666\n855,838\n855,2784\n856,26\n856,59\n856,843\n856,1844\n857,336\n858,859\n859,10\n859,65\n859,147\n859,149\n859,158\n859,171\n859,175\n859,184\n859,259\n859,272\n859,393\n859,577\n859,606\n859,685\n859,726\n859,788\n859,859\n859,882\n859,897\n859,902\n859,911\n859,980\n859,996\n859,1011\n859,1028\n859,1070\n859,1105\n859,1180\n859,1262\n859,1388\n859,1429\n859,1456\n859,1531\n859,1619\n859,2085\n859,2106\n859,2459\n859,2874\n859,4137\n859,4611\n859,5080\n859,5307\n859,5361\n859,6652\n859,6903\n859,7262\n859,7826\n859,8400\n859,8567\n859,13858\n859,14217\n859,14392\n859,14674\n859,15074\n859,16458\n859,16469\n859,18452\n859,18484\n859,18559\n859,18702\n859,19463\n859,21286\n859,21437\n859,21438\n859,21630\n859,23485\n859,23810\n859,24837\n859,26104\n859,26121\n859,26309\n859,26751\n859,26762\n859,27086\n859,27152\n859,28312\n859,29894\n859,29912\n859,30322\n859,34252\n859,34974\n859,35486\n859,36987\n859,38525\n859,38724\n859,42115\n859,42333\n859,43272\n859,43318\n859,44919\n859,45520\n859,45544\n859,46093\n859,49577\n859,56150\n859,56944\n859,59894\n859,59955\n859,60223\n859,60517\n859,63391\n859,66424\n859,66471\n859,66472\n859,67360\n859,68934\n859,70948\n859,73391\n859,76944\n859,76958\n859,77786\n859,79329\n859,80994\n859,82233\n859,85817\n859,85979\n859,86063\n859,86592\n859,87271\n859,87388\n859,87870\n859,88590\n859,89676\n859,90127\n859,91768\n859,93689\n859,93968\n859,96521\n859,96639\n859,99053\n859,100179\n859,100180\n859,100181\n859,100182\n859,100183\n859,100307\n859,100374\n859,101678\n859,112537\n859,112592\n859,113966\n859,120468\n859,120651\n859,122913\n859,127914\n859,128870\n859,130185\n859,135977\n859,145382\n859,145978\n859,147380\n859,148033\n859,152027\n859,152598\n859,159262\n859,174420\n859,174896\n859,175219\n859,175982\n859,176447\n859,176550\n859,176786\n859,179150\n859,182443\n859,182806\n859,188814\n859,191188\n859,192425\n859,192492\n859,192883\n859,196381\n859,202788\n859,204677\n859,213956\n859,216209\n859,217895\n859,220284\n859,220286\n859,227968\n859,228383\n859,230477\n859,231024\n859,233328\n859,237381\n859,237413\n859,238800\n859,239272\n859,239273\n859,242798\n859,247183\n859,250737\n859,255556\n859,257292\n859,263057\n860,302\n860,861\n860,893\n861,22\n861,50\n861,433\n861,599\n861,818\n861,838\n861,1210\n861,1659\n861,127158\n862,22\n862,41\n862,104\n862,111\n862,248\n862,256\n862,290\n862,294\n862,298\n862,332\n862,373\n862,417\n862,446\n862,457\n862,497\n862,534\n862,589\n862,612\n862,622\n862,626\n862,631\n862,632\n862,685\n862,693\n862,694\n862,714\n862,862\n862,863\n862,903\n862,911\n862,966\n862,1014\n862,1045\n862,1085\n862,1118\n862,1119\n862,1195\n862,1346\n862,1459\n862,1462\n862,1669\n862,1808\n862,1818\n862,1837\n862,2296\n862,2452\n862,2587\n862,2995\n862,3504\n862,3578\n862,3586\n862,3623\n862,3820\n862,3944\n862,4222\n862,4286\n862,4475\n862,4609\n862,5378\n862,5472\n862,5488\n862,5828\n862,5902\n862,5903\n862,6077\n862,7777\n862,7790\n862,8537\n862,12886\n862,13328\n862,14507\n862,14969\n862,15290\n862,17256\n862,19278\n862,19488\n862,19617\n862,19737\n862,19798\n862,20301\n862,20587\n862,21211\n862,21552\n862,25407\n862,27041\n862,29859\n862,31109\n862,33567\n862,34205\n862,34726\n862,36599\n862,38496\n862,42581\n862,44725\n862,45714\n862,45856\n862,46486\n862,49634\n862,50737\n862,51972\n862,52488\n862,52552\n862,54291\n862,54635\n862,61324\n862,65886\n862,67867\n862,72887\n862,74608\n862,75180\n862,75912\n862,76101\n862,77122\n862,82020\n862,85460\n862,87077\n862,88308\n862,90130\n862,91782\n862,94134\n862,94289\n862,95643\n862,97400\n862,97644\n862,98108\n862,98825\n862,100034\n862,101829\n862,103177\n862,103281\n862,103853\n862,104175\n862,104583\n862,104627\n862,105216\n862,105924\n862,106431\n862,107205\n862,107770\n862,108250\n862,111226\n862,111299\n862,112081\n862,112301\n862,113671\n862,113724\n862,117579\n862,118156\n862,118815\n862,119643\n862,119957\n862,120010\n862,120068\n862,121433\n862,122980\n862,122991\n862,123116\n862,124087\n862,124881\n862,133940\n862,135286\n862,142282\n862,144079\n862,147581\n862,148255\n862,162531\n862,162532\n862,162780\n862,164373\n862,165654\n862,168262\n862,171555\n862,172715\n862,173265\n862,178576\n862,181757\n862,182391\n862,215289\n862,216407\n862,217694\n862,219553\n862,220607\n862,228943\n862,231029\n862,243202\n862,244850\n862,245046\n862,247064\n862,254364\n862,262498\n863,577\n863,862\n864,328\n865,5\n865,134\n865,137\n865,967\n865,1235\n865,1432\n865,2205\n865,4114\n865,6054\n865,6621\n865,19466\n865,26296\n865,27489\n865,33424\n865,42601\n865,71229\n865,83268\n865,92711\n865,223023\n866,137\n867,707\n868,20\n868,65\n868,66\n868,79\n868,126\n868,147\n868,171\n868,186\n868,203\n868,272\n868,302\n868,314\n868,318\n868,326\n868,388\n868,389\n868,392\n868,397\n868,432\n868,434\n868,435\n868,466\n868,467\n868,495\n868,535\n868,538\n868,599\n868,673\n868,689\n868,693\n868,697\n868,717\n868,726\n868,788\n868,801\n868,859\n868,868\n868,869\n868,872\n868,911\n868,942\n868,992\n868,1010\n868,1011\n868,1085\n868,1118\n868,1151\n868,1210\n868,1235\n868,1264\n868,1335\n868,1345\n868,1370\n868,1373\n868,1388\n868,1422\n868,1433\n868,1517\n868,1566\n868,1568\n868,1577\n868,1586\n868,1782\n868,1797\n868,1844\n868,2125\n868,2400\n868,2470\n868,2561\n868,2585\n868,2903\n868,2979\n868,2991\n868,3199\n868,3241\n868,3436\n868,3474\n868,3519\n868,3548\n868,3559\n868,3569\n868,3603\n868,3681\n868,3744\n868,3804\n868,3836\n868,3884\n868,3955\n868,4066\n868,4109\n868,4159\n868,4202\n868,4205\n868,4231\n868,4446\n868,4476\n868,4560\n868,4563\n868,4646\n868,5537\n868,5563\n868,5623\n868,5851\n868,5853\n868,6235\n868,6452\n868,6459\n868,6470\n868,6511\n868,6602\n868,6706\n868,6760\n868,6761\n868,6807\n868,6904\n868,6921\n868,6925\n868,6964\n868,6990\n868,7037\n868,7056\n868,7082\n868,7132\n868,7572\n868,7761\n868,7801\n868,7830\n868,7842\n868,7949\n868,8099\n868,8139\n868,8274\n868,8435\n868,9290\n868,9424\n868,9737\n868,12278\n868,13130\n868,13182\n868,13200\n868,13216\n868,13222\n868,13233\n868,13260\n868,13398\n868,13519\n868,13526\n868,14108\n868,14292\n868,14304\n868,14311\n868,14465\n868,14645\n868,14651\n868,15199\n868,15467\n868,16010\n868,16239\n868,16315\n868,16336\n868,16357\n868,16358\n868,16638\n868,17022\n868,17116\n868,17241\n868,18110\n868,18203\n868,18206\n868,18208\n868,18209\n868,18212\n868,18214\n868,18218\n868,18219\n868,18221\n868,18222\n868,18224\n868,18233\n868,18240\n868,18242\n868,18244\n868,18248\n868,18249\n868,18250\n868,18256\n868,18260\n868,18261\n868,18262\n868,18266\n868,18267\n868,18268\n868,18270\n868,18271\n868,18281\n868,18284\n868,18289\n868,18303\n868,18304\n868,18308\n868,18309\n868,18321\n868,18323\n868,18326\n868,18329\n868,18333\n868,18334\n868,18350\n868,18354\n868,18357\n868,18358\n868,18361\n868,18362\n868,18367\n868,18369\n868,18371\n868,18380\n868,18387\n868,18397\n868,18398\n868,18399\n868,18413\n868,18419\n868,18532\n868,18630\n868,18649\n868,18787\n868,18834\n868,19281\n868,19347\n868,19553\n868,19639\n868,19968\n868,20323\n868,20344\n868,20419\n868,20613\n868,20757\n868,20786\n868,21409\n868,21540\n868,21563\n868,22000\n868,22066\n868,22152\n868,22391\n868,22414\n868,23296\n868,23337\n868,23514\n868,24841\n868,25395\n868,25585\n868,26034\n868,27048\n868,27919\n868,28112\n868,28172\n868,28223\n868,28241\n868,28317\n868,28562\n868,28962\n868,28984\n868,29064\n868,29076\n868,29102\n868,29103\n868,29127\n868,29611\n868,29622\n868,29624\n868,29638\n868,29659\n868,29671\n868,29713\n868,29743\n868,29777\n868,29799\n868,31051\n868,31280\n868,32205\n868,32280\n868,32514\n868,32582\n868,32667\n868,32929\n868,32978\n868,33297\n868,33515\n868,34135\n868,34353\n868,34367\n868,34417\n868,34726\n868,35004\n868,35345\n868,35435\n868,35456\n868,36425\n868,36679\n868,36682\n868,36683\n868,36729\n868,36734\n868,36823\n868,36971\n868,37479\n868,37602\n868,37672\n868,37963\n868,38300\n868,38432\n868,38437\n868,38707\n868,39403\n868,39410\n868,39683\n868,40025\n868,40457\n868,41345\n868,41898\n868,41904\n868,42524\n868,43366\n868,43826\n868,44157\n868,44195\n868,44208\n868,44391\n868,44933\n868,45427\n868,46324\n868,46727\n868,47022\n868,47057\n868,48042\n868,48364\n868,48404\n868,48413\n868,48538\n868,48855\n868,49194\n868,49221\n868,49690\n868,49790\n868,50014\n868,50229\n868,51289\n868,51873\n868,52077\n868,54520\n868,54958\n868,55595\n868,56264\n868,56334\n868,56633\n868,57159\n868,57182\n868,57624\n868,58420\n868,58876\n868,59139\n868,60598\n868,61356\n868,62172\n868,62373\n868,62479\n868,63424\n868,63568\n868,63589\n868,63635\n868,63926\n868,64069\n868,64075\n868,64630\n868,65888\n868,66235\n868,66327\n868,66335\n868,66337\n868,66349\n868,66364\n868,66372\n868,66617\n868,67309\n868,67899\n868,67964\n868,68001\n868,68034\n868,68187\n868,68217\n868,68613\n868,68627\n868,68722\n868,68730\n868,68736\n868,68774\n868,68833\n868,69947\n868,70169\n868,70236\n868,70824\n868,70828\n868,70847\n868,70870\n868,70908\n868,71647\n868,71649\n868,71671\n868,71978\n868,72402\n868,72488\n868,72594\n868,72648\n868,72724\n868,72776\n868,72788\n868,74520\n868,74574\n868,74586\n868,74639\n868,75295\n868,75386\n868,75898\n868,76095\n868,76142\n868,76219\n868,76624\n868,76785\n868,76803\n868,76847\n868,76870\n868,76921\n868,76975\n868,76979\n868,76988\n868,77562\n868,78812\n868,79335\n868,79336\n868,79374\n868,79383\n868,79392\n868,79417\n868,79630\n868,80084\n868,80440\n868,81233\n868,81986\n868,83177\n868,83225\n868,83373\n868,83542\n868,83845\n868,84799\n868,85733\n868,85774\n868,85848\n868,85979\n868,86002\n868,86402\n868,86437\n868,87761\n868,87770\n868,87823\n868,87894\n868,88053\n868,88328\n868,88611\n868,89733\n868,89753\n868,90470\n868,90666\n868,90675\n868,90884\n868,91207\n868,91300\n868,91312\n868,91429\n868,91433\n868,91513\n868,91837\n868,93602\n868,93609\n868,93653\n868,93721\n868,93728\n868,93758\n868,94214\n868,94249\n868,94872\n868,94942\n868,94950\n868,96540\n868,96670\n868,96733\n868,98096\n868,98819\n868,98895\n868,99355\n868,103371\n868,103820\n868,104266\n868,104391\n868,104592\n868,105515\n868,105518\n868,105519\n868,105520\n868,105730\n868,105733\n868,106353\n868,106448\n868,106899\n868,107330\n868,107406\n868,107901\n868,107906\n868,108062\n868,109378\n868,109452\n868,109533\n868,109923\n868,109936\n868,110151\n868,110263\n868,110512\n868,110600\n868,110713\n868,111241\n868,111459\n868,111981\n868,112217\n868,112239\n868,112243\n868,112300\n868,112378\n868,113535\n868,113596\n868,113957\n868,114606\n868,116185\n868,116189\n868,116191\n868,116193\n868,116196\n868,116202\n868,116203\n868,116403\n868,116535\n868,116538\n868,116540\n868,116570\n868,116589\n868,116895\n868,116982\n868,117073\n868,117115\n868,117835\n868,117940\n868,117980\n868,118085\n868,118092\n868,119480\n868,119871\n868,120158\n868,120449\n868,121060\n868,121384\n868,121632\n868,122606\n868,124450\n868,124462\n868,124574\n868,124905\n868,124940\n868,125014\n868,125638\n868,126079\n868,126125\n868,126925\n868,126976\n868,127021\n868,127147\n868,127433\n868,130264\n868,130268\n868,130356\n868,130446\n868,130922\n868,131791\n868,131792\n868,131808\n868,132835\n868,133327\n868,133376\n868,133379\n868,133466\n868,134009\n868,134109\n868,134487\n868,134584\n868,135208\n868,136467\n868,137265\n868,137410\n868,137412\n868,137420\n868,137502\n868,137656\n868,138030\n868,138763\n868,138874\n868,141817\n868,142410\n868,143957\n868,143964\n868,143968\n868,144010\n868,144030\n868,144051\n868,144920\n868,145969\n868,145985\n868,146427\n868,146445\n868,146446\n868,146816\n868,147360\n868,147489\n868,147815\n868,147816\n868,147819\n868,147824\n868,148400\n868,148696\n868,149151\n868,150011\n868,151438\n868,152212\n868,152855\n868,154744\n868,155439\n868,155691\n868,156300\n868,156379\n868,156624\n868,157367\n868,157601\n868,158182\n868,158273\n868,158276\n868,158640\n868,158750\n868,158751\n868,159049\n868,159459\n868,159694\n868,159696\n868,159702\n868,159704\n868,159706\n868,159762\n868,160370\n868,161160\n868,161166\n868,161585\n868,161843\n868,161942\n868,161945\n868,162549\n868,162553\n868,162562\n868,162566\n868,162599\n868,162894\n868,162903\n868,162918\n868,163000\n868,163004\n868,163005\n868,163007\n868,163609\n868,164222\n868,164825\n868,166069\n868,167641\n868,167671\n868,168510\n868,168832\n868,169162\n868,169325\n868,169401\n868,170628\n868,170795\n868,171213\n868,171259\n868,171551\n868,171552\n868,171558\n868,171625\n868,171627\n868,171640\n868,171643\n868,171644\n868,172256\n868,173675\n868,173866\n868,173878\n868,174488\n868,174491\n868,175281\n868,175993\n868,176090\n868,176757\n868,176770\n868,177246\n868,178617\n868,178626\n868,178656\n868,178734\n868,178773\n868,179467\n868,179627\n868,179652\n868,179654\n868,180221\n868,180391\n868,180961\n868,180970\n868,181040\n868,181231\n868,182326\n868,182906\n868,183325\n868,183333\n868,183390\n868,183444\n868,183806\n868,184716\n868,185539\n868,185883\n868,186085\n868,186105\n868,186555\n868,186603\n868,188278\n868,188406\n868,190254\n868,191136\n868,191141\n868,191145\n868,191895\n868,191934\n868,192085\n868,193004\n868,193431\n868,193434\n868,193635\n868,193642\n868,194325\n868,194328\n868,194331\n868,194358\n868,194368\n868,194398\n868,194455\n868,194484\n868,194539\n868,194925\n868,194928\n868,195572\n868,195582\n868,198699\n868,212565\n868,212962\n868,212997\n868,213006\n868,213010\n868,213084\n868,214002\n868,214077\n868,214135\n868,214619\n868,214625\n868,214650\n868,214660\n868,214818\n868,214865\n868,214876\n868,214877\n868,215358\n868,215403\n868,216526\n868,217641\n868,217877\n868,220302\n868,220400\n868,220918\n868,223727\n868,223735\n868,223822\n868,223923\n868,223956\n868,224457\n868,224459\n868,224472\n868,226184\n868,226974\n868,227013\n868,228648\n868,228948\n868,228950\n868,228979\n868,229081\n868,230948\n868,232608\n868,232714\n868,232718\n868,232864\n868,233335\n868,233400\n868,233457\n868,241734\n868,242254\n868,243434\n868,244592\n868,244809\n868,245459\n868,245477\n868,245878\n868,245920\n868,247147\n868,247250\n868,247734\n868,247815\n868,248034\n868,248516\n868,249059\n868,249181\n868,249290\n868,249348\n868,250544\n868,251272\n868,251330\n868,251470\n868,254353\n868,255512\n868,258001\n868,258011\n868,258137\n868,258142\n868,258274\n868,258282\n868,258801\n868,260319\n868,260368\n868,260855\n868,260957\n868,261896\n868,261906\n868,262356\n868,262367\n868,262369\n868,262371\n868,262375\n868,263791\n868,264509\n868,264518\n868,264525\n869,868\n870,749\n870,811\n870,1619\n871,872\n872,10\n872,32\n872,65\n872,87\n872,119\n872,126\n872,167\n872,182\n872,186\n872,192\n872,217\n872,240\n872,264\n872,292\n872,314\n872,338\n872,366\n872,392\n872,397\n872,433\n872,435\n872,440\n872,441\n872,452\n872,462\n872,466\n872,467\n872,479\n872,509\n872,510\n872,535\n872,536\n872,595\n872,599\n872,644\n872,673\n872,685\n872,715\n872,745\n872,794\n872,802\n872,808\n872,809\n872,818\n872,843\n872,868\n872,872\n872,881\n872,900\n872,911\n872,918\n872,920\n872,929\n872,1010\n872,1011\n872,1058\n872,1111\n872,1118\n872,1130\n872,1140\n872,1151\n872,1192\n872,1197\n872,1204\n872,1210\n872,1326\n872,1332\n872,1341\n872,1355\n872,1363\n872,1370\n872,1417\n872,1453\n872,1454\n872,1472\n872,1531\n872,1551\n872,1556\n872,1566\n872,1627\n872,1634\n872,1653\n872,1659\n872,1663\n872,1688\n872,1722\n872,1749\n872,1758\n872,1796\n872,1836\n872,1844\n872,1845\n872,1860\n872,1893\n872,2181\n872,2418\n872,2464\n872,2496\n872,2580\n872,3035\n872,3199\n872,3258\n872,3494\n872,3507\n872,3648\n872,3809\n872,3866\n872,4039\n872,4125\n872,4381\n872,4444\n872,4580\n872,4771\n872,5809\n872,5827\n872,5851\n872,6452\n872,6734\n872,6782\n872,6904\n872,6955\n872,7880\n872,7987\n872,8149\n872,13193\n872,14297\n872,14727\n872,15493\n872,15608\n872,15609\n872,16231\n872,16268\n872,16293\n872,16362\n872,16455\n872,16502\n872,17813\n872,18245\n872,18309\n872,18560\n872,19777\n872,20261\n872,20544\n872,20591\n872,20613\n872,22278\n872,23478\n872,24682\n872,24934\n872,25378\n872,26164\n872,26186\n872,26905\n872,27053\n872,27516\n872,28233\n872,28814\n872,28999\n872,29040\n872,29593\n872,29635\n872,29757\n872,29853\n872,31942\n872,32819\n872,32822\n872,32978\n872,34039\n872,35543\n872,35624\n872,37304\n872,38380\n872,38386\n872,39059\n872,39439\n872,39810\n872,41267\n872,41760\n872,42834\n872,43231\n872,43233\n872,43391\n872,44095\n872,44115\n872,46839\n872,46968\n872,48022\n872,49266\n872,49355\n872,50987\n872,52289\n872,54439\n872,54447\n872,54505\n872,54530\n872,54921\n872,57850\n872,59001\n872,62894\n872,62951\n872,64072\n872,64086\n872,68669\n872,68770\n872,71856\n872,72596\n872,72618\n872,73388\n872,73481\n872,75801\n872,75912\n872,76815\n872,80425\n872,80704\n872,81233\n872,83449\n872,90213\n872,94077\n872,98072\n872,99355\n872,108754\n872,109378\n872,111715\n872,113411\n872,116015\n872,116744\n872,119313\n872,120957\n872,121080\n872,122936\n872,125517\n872,125548\n872,125673\n872,126757\n872,127158\n872,127471\n872,128325\n872,133543\n872,133556\n872,137806\n872,137819\n872,138863\n872,141878\n872,150022\n872,151489\n872,154183\n872,154432\n872,156914\n872,159452\n872,159984\n872,160247\n872,161513\n872,165879\n872,170759\n872,170813\n872,171775\n872,172687\n872,173733\n872,175284\n872,177887\n872,178701\n872,178747\n872,179636\n872,179744\n872,179930\n872,180054\n872,181911\n872,182506\n872,182841\n872,186509\n872,189190\n872,190566\n872,191954\n872,192278\n872,192406\n872,192428\n872,192603\n872,194330\n872,195025\n872,195116\n872,195648\n872,196650\n872,205047\n872,206824\n872,212665\n872,214551\n872,215092\n872,216216\n872,218711\n872,219066\n872,221695\n872,222608\n872,226286\n872,231030\n872,236707\n872,238236\n872,240926\n872,241740\n872,249192\n872,249451\n872,259705\n873,207\n873,314\n873,326\n873,347\n873,389\n873,424\n873,425\n873,446\n873,599\n873,702\n873,752\n873,818\n873,852\n873,872\n873,873\n873,874\n873,1045\n873,1046\n873,1133\n873,1210\n873,1276\n873,1419\n873,1561\n873,2509\n873,4039\n873,4272\n873,5302\n873,6477\n873,6552\n873,14597\n873,15620\n873,16151\n873,18526\n873,20575\n873,24365\n873,25022\n873,26081\n873,30328\n873,34732\n873,35327\n873,39583\n873,40657\n873,40839\n873,41083\n873,41084\n873,41086\n873,41087\n873,41088\n873,42433\n873,42447\n873,44102\n873,45574\n873,47836\n873,49627\n873,51880\n873,53650\n873,54404\n873,55552\n873,56537\n873,60444\n873,62990\n873,64761\n873,67097\n873,68787\n873,70689\n873,73421\n873,79582\n873,79588\n873,80003\n873,80151\n873,82539\n873,84635\n873,85701\n873,85842\n873,93113\n873,94875\n873,96455\n873,96557\n873,100339\n873,101551\n873,101684\n873,101686\n873,113327\n873,113328\n873,113329\n873,113331\n873,114358\n873,118263\n873,122770\n873,128738\n873,130149\n873,130228\n873,132876\n873,134199\n873,135378\n873,138118\n873,139473\n873,139573\n873,140195\n873,140357\n873,140531\n873,142833\n873,142837\n873,143959\n873,147515\n873,150064\n873,150259\n873,150651\n873,156380\n873,165675\n873,165704\n873,167591\n873,167684\n873,167730\n873,173260\n873,175903\n873,178555\n873,178557\n873,178652\n873,188564\n873,217216\n873,250122\n874,22\n874,106\n874,186\n874,207\n874,287\n874,314\n874,326\n874,347\n874,389\n874,424\n874,452\n874,663\n874,693\n874,702\n874,752\n874,818\n874,873\n874,874\n874,911\n874,1011\n874,1133\n874,1210\n874,1566\n874,1634\n874,1642\n874,1801\n874,2509\n874,3578\n874,4272\n874,5302\n874,5667\n874,6552\n874,7087\n874,8658\n874,9295\n874,13420\n874,13448\n874,13457\n874,13538\n874,17305\n874,19422\n874,26031\n874,29937\n874,30328\n874,30485\n874,36837\n874,45710\n874,46997\n874,48109\n874,60444\n874,62990\n874,64152\n874,64508\n874,70285\n874,81012\n874,81078\n874,85842\n874,93113\n874,98646\n874,116878\n874,128461\n874,136615\n874,140195\n874,142055\n874,143463\n874,147515\n874,152451\n874,156380\n874,160834\n874,161844\n874,166985\n874,176415\n874,216478\n874,219940\n874,223844\n874,223845\n874,223848\n874,228147\n874,236180\n874,236728\n874,242194\n875,32\n875,261\n875,285\n875,312\n875,358\n875,389\n875,446\n875,457\n875,500\n875,509\n875,510\n875,575\n875,663\n875,664\n875,682\n875,694\n875,697\n875,707\n875,723\n875,779\n875,788\n875,809\n875,822\n875,852\n875,875\n875,1011\n875,1043\n875,1172\n875,1173\n875,1345\n875,1424\n875,1515\n875,1559\n875,1566\n875,2019\n875,2191\n875,2460\n875,2508\n875,2646\n875,2754\n875,3182\n875,3367\n875,4722\n875,5200\n875,5267\n875,5540\n875,5800\n875,6247\n875,6408\n875,7076\n875,7154\n875,7766\n875,7818\n875,7987\n875,9742\n875,13657\n875,14102\n875,15112\n875,15439\n875,15704\n875,18485\n875,18491\n875,19441\n875,20390\n875,20757\n875,20857\n875,24687\n875,25446\n875,26926\n875,26988\n875,28107\n875,28152\n875,29034\n875,29854\n875,29857\n875,30373\n875,31055\n875,31080\n875,32647\n875,34231\n875,35338\n875,36720\n875,39290\n875,39661\n875,41378\n875,44352\n875,44982\n875,47021\n875,47993\n875,48056\n875,51922\n875,51928\n875,58225\n875,58276\n875,58904\n875,62951\n875,63081\n875,63921\n875,68069\n875,70764\n875,72439\n875,82624\n875,85826\n875,88544\n875,89611\n875,92289\n875,92863\n875,94128\n875,96512\n875,97915\n875,99656\n875,102430\n875,105675\n875,105689\n875,106121\n875,106183\n875,106812\n875,117348\n875,128122\n875,128127\n875,134750\n875,142541\n875,147079\n875,148012\n875,148601\n875,150037\n875,162619\n875,164121\n875,165787\n875,168388\n875,168537\n875,168701\n875,174372\n875,174752\n875,180962\n875,184563\n875,189869\n875,190533\n875,194442\n875,213030\n875,229953\n875,229994\n876,328\n877,10\n877,106\n877,459\n877,518\n877,720\n877,744\n877,762\n877,877\n877,878\n877,907\n877,937\n877,972\n877,973\n877,1010\n877,1111\n877,1117\n877,1258\n877,1284\n877,1297\n877,1375\n877,1544\n877,1732\n877,1837\n877,2063\n877,2228\n877,2239\n877,3455\n877,3804\n877,3941\n877,5032\n877,5438\n877,5662\n877,6539\n877,13217\n877,15344\n877,15633\n877,17154\n877,24926\n877,26161\n877,26341\n877,28294\n877,33466\n877,36784\n877,38284\n877,39543\n877,39730\n877,41445\n877,43407\n877,45853\n877,46200\n877,54478\n877,58476\n877,59866\n877,64492\n877,70992\n877,71761\n877,99123\n877,103736\n877,112666\n877,118425\n877,119399\n877,124668\n877,135131\n877,137059\n877,145502\n877,145568\n877,153621\n877,154095\n877,155689\n877,158786\n877,158990\n877,161523\n877,161534\n877,162739\n877,163425\n877,164951\n877,169061\n877,171131\n877,171149\n877,171641\n877,173894\n877,174424\n877,179336\n877,194407\n877,194481\n877,195649\n877,205673\n877,213953\n877,214151\n877,214161\n877,225541\n877,232771\n877,233329\n877,243279\n877,244054\n877,256180\n877,262503\n878,877\n878,1284\n879,106\n879,330\n879,1888\n880,309\n880,310\n880,626\n881,302\n881,467\n881,872\n881,893\n881,1010\n881,1556\n881,1659\n881,1782\n882,726\n882,859\n882,996\n882,1147\n883,26\n883,59\n883,884\n883,885\n883,886\n883,887\n883,994\n883,1432\n883,21944\n885,26\n885,59\n885,805\n885,885\n885,1212\n885,2674\n885,4113\n885,9542\n885,21944\n886,26\n886,59\n886,885\n886,886\n886,994\n886,1212\n886,2674\n886,16153\n886,21944\n886,39455\n886,111142\n888,63\n888,192\n888,333\n888,493\n889,48\n889,704\n889,1381\n889,1452\n889,3999\n890,891\n890,2646\n891,222\n891,313\n891,536\n891,635\n891,660\n891,890\n891,891\n891,911\n891,949\n891,1670\n891,1676\n891,1756\n891,2176\n891,2224\n891,2646\n891,2944\n891,3824\n891,4579\n891,5721\n891,6506\n891,9036\n891,13661\n891,18831\n891,21414\n891,27093\n891,28130\n891,28282\n891,31738\n891,34270\n891,37983\n891,39065\n891,39572\n891,45590\n891,46842\n891,54484\n891,56584\n891,59649\n891,62327\n891,62805\n891,74625\n891,84860\n891,88347\n891,115474\n891,124007\n891,149315\n891,151760\n891,155229\n891,175259\n891,187479\n891,189137\n891,194501\n891,198176\n891,228673\n892,893\n893,673\n893,687\n893,718\n893,849\n893,893\n893,1011\n893,1130\n893,1204\n893,1844\n894,589\n895,304\n895,366\n895,479\n895,1257\n896,32\n897,726\n897,859\n897,1539\n897,1849\n898,30\n898,328\n898,440\n898,1179\n899,900\n900,256\n900,314\n900,336\n900,356\n900,397\n900,535\n900,599\n900,673\n900,676\n900,685\n900,693\n900,843\n900,852\n900,899\n900,900\n900,911\n900,972\n900,1014\n900,1113\n900,1504\n900,1559\n900,1844\n900,2373\n900,2447\n900,2460\n900,3207\n900,3509\n900,3513\n900,3582\n900,3967\n900,7783\n900,8395\n900,13396\n900,14385\n900,19572\n900,22505\n900,43382\n900,45028\n900,64887\n900,79117\n900,85795\n900,88518\n900,142355\n900,143417\n900,151335\n900,171206\n900,173839\n900,176939\n900,205638\n900,205940\n900,214134\n900,222379\n900,224402\n900,228231\n900,232061\n900,251853\n900,259856\n900,260144\n901,209\n901,302\n901,579\n901,3769\n902,171\n902,259\n902,393\n902,538\n902,577\n902,726\n902,788\n902,859\n902,980\n902,1070\n902,1105\n902,138686\n903,30\n903,87\n903,104\n903,261\n903,278\n903,328\n903,332\n903,349\n903,392\n903,406\n903,439\n903,440\n903,509\n903,510\n903,595\n903,622\n903,623\n903,697\n903,703\n903,779\n903,794\n903,808\n903,809\n903,862\n903,872\n903,968\n903,1014\n903,1033\n903,1058\n903,1118\n903,1179\n903,1240\n903,1417\n903,1453\n903,1466\n903,1805\n903,1836\n903,1844\n903,1860\n903,1949\n903,2116\n903,3367\n903,3538\n903,19010\n903,20813\n903,22293\n903,32751\n903,141912\n904,563\n905,10\n906,907\n906,932\n907,10\n907,175\n907,299\n907,440\n907,663\n907,664\n907,720\n907,794\n907,838\n907,877\n907,907\n907,932\n907,972\n907,973\n907,1010\n907,1011\n907,1117\n907,1231\n907,1284\n907,1298\n907,1360\n907,1405\n907,1522\n907,1544\n907,1749\n907,1837\n907,1849\n907,1853\n907,1973\n907,2007\n907,2057\n907,2191\n907,2193\n907,2477\n907,2595\n907,2979\n907,3285\n907,3407\n907,3507\n907,4362\n907,5265\n907,7440\n907,13474\n907,13576\n907,14077\n907,14088\n907,14600\n907,15272\n907,15303\n907,15666\n907,16634\n907,18265\n907,18511\n907,18679\n907,21095\n907,21182\n907,23171\n907,24107\n907,25663\n907,29595\n907,30373\n907,31176\n907,31383\n907,32794\n907,33710\n907,33802\n907,35081\n907,35181\n907,36687\n907,36720\n907,38156\n907,39570\n907,43407\n907,45853\n907,50607\n907,52773\n907,53134\n907,54083\n907,57402\n907,58820\n907,59341\n907,62338\n907,67667\n907,68839\n907,69679\n907,71133\n907,80958\n907,84542\n907,84553\n907,96685\n907,103207\n907,109838\n907,117231\n907,118955\n907,124354\n907,124362\n907,124928\n907,125505\n907,127155\n907,131669\n907,135910\n907,138253\n907,142487\n907,145367\n907,146505\n907,147859\n907,148742\n907,149169\n907,154382\n907,155530\n907,158586\n907,159803\n907,160441\n907,160961\n907,161677\n907,177708\n907,177812\n907,177836\n907,177913\n907,180499\n907,181193\n907,182759\n907,185579\n907,195645\n907,202244\n907,221176\n907,228916\n907,238469\n907,243359\n907,244713\n907,249778\n907,255958\n907,255963\n907,258156\n907,259955\n908,326\n908,4260\n909,415\n910,745\n910,3422\n911,10\n911,30\n911,41\n911,68\n911,71\n911,81\n911,83\n911,102\n911,106\n911,119\n911,126\n911,163\n911,175\n911,200\n911,202\n911,203\n911,207\n911,211\n911,233\n911,251\n911,252\n911,259\n911,272\n911,287\n911,292\n911,313\n911,314\n911,338\n911,344\n911,346\n911,349\n911,356\n911,379\n911,388\n911,389\n911,397\n911,415\n911,417\n911,440\n911,441\n911,446\n911,447\n911,452\n911,467\n911,481\n911,489\n911,493\n911,497\n911,512\n911,518\n911,534\n911,535\n911,536\n911,577\n911,623\n911,626\n911,631\n911,663\n911,664\n911,668\n911,671\n911,673\n911,676\n911,684\n911,685\n911,693\n911,694\n911,704\n911,733\n911,765\n911,772\n911,775\n911,781\n911,788\n911,794\n911,808\n911,809\n911,811\n911,838\n911,841\n911,842\n911,849\n911,859\n911,862\n911,868\n911,872\n911,891\n911,900\n911,911\n911,918\n911,919\n911,929\n911,972\n911,980\n911,991\n911,996\n911,1021\n911,1022\n911,1058\n911,1070\n911,1085\n911,1096\n911,1113\n911,1118\n911,1127\n911,1130\n911,1132\n911,1133\n911,1135\n911,1143\n911,1151\n911,1172\n911,1177\n911,1204\n911,1220\n911,1222\n911,1240\n911,1243\n911,1285\n911,1309\n911,1319\n911,1332\n911,1345\n911,1359\n911,1402\n911,1417\n911,1434\n911,1445\n911,1449\n911,1453\n911,1504\n911,1511\n911,1566\n911,1619\n911,1623\n911,1634\n911,1644\n911,1677\n911,1688\n911,1782\n911,1796\n911,1801\n911,1807\n911,1808\n911,1818\n911,1836\n911,1844\n911,1848\n911,1860\n911,1928\n911,1955\n911,1985\n911,1992\n911,2045\n911,2205\n911,2209\n911,2253\n911,2296\n911,2367\n911,2424\n911,2436\n911,2460\n911,2590\n911,2646\n911,2704\n911,2775\n911,2874\n911,3069\n911,3258\n911,3422\n911,3474\n911,3507\n911,3524\n911,3538\n911,3582\n911,3623\n911,3724\n911,3967\n911,4013\n911,4123\n911,4190\n911,4220\n911,4222\n911,4271\n911,4411\n911,4448\n911,4565\n911,4611\n911,4701\n911,4760\n911,4998\n911,5213\n911,5265\n911,5356\n911,5540\n911,5961\n911,6068\n911,6119\n911,6424\n911,6824\n911,6837\n911,6883\n911,6904\n911,7092\n911,7194\n911,7318\n911,8149\n911,9457\n911,10559\n911,13207\n911,13361\n911,13383\n911,13538\n911,14016\n911,14489\n911,18097\n911,18106\n911,18512\n911,21152\n911,21167\n911,21222\n911,23357\n911,24822\n911,25271\n911,25356\n911,25431\n911,26100\n911,26450\n911,27550\n911,28294\n911,32227\n911,32751\n911,33287\n911,33328\n911,33424\n911,33572\n911,34076\n911,35094\n911,35382\n911,35486\n911,36731\n911,38954\n911,40122\n911,42918\n911,45065\n911,48011\n911,48505\n911,53983\n911,54390\n911,56089\n911,58238\n911,58247\n911,58424\n911,59753\n911,66059\n911,66512\n911,66578\n911,67950\n911,69884\n911,75190\n911,75912\n911,79395\n911,81233\n911,84429\n911,88423\n911,93083\n911,93517\n911,96675\n911,101493\n911,101652\n911,103747\n911,103814\n911,107421\n911,117818\n911,118224\n911,118861\n911,119455\n911,119459\n911,119476\n911,140316\n911,154332\n911,154976\n911,155158\n911,155386\n911,158576\n911,159398\n911,162599\n911,178576\n911,185877\n911,186023\n911,188593\n911,193129\n911,205627\n911,215276\n911,227376\n911,229746\n911,244591\n911,244646\n911,252674\n911,256250\n913,264\n913,1551\n913,1579\n913,1659\n913,1893\n913,6695\n914,338\n915,79\n915,509\n916,917\n918,87\n918,120\n918,126\n918,186\n918,207\n918,256\n918,314\n918,397\n918,433\n918,452\n918,457\n918,500\n918,535\n918,599\n918,623\n918,668\n918,673\n918,676\n918,685\n918,808\n918,809\n918,818\n918,849\n918,852\n918,872\n918,911\n918,919\n918,972\n918,1011\n918,1014\n918,1118\n918,1130\n918,1172\n918,1240\n918,1345\n918,1417\n918,1465\n918,1566\n918,1663\n918,1805\n918,1860\n918,1949\n918,1973\n918,2310\n918,2373\n918,4190\n918,4760\n918,5833\n918,6059\n918,6904\n918,6955\n918,9457\n918,15609\n918,19010\n918,19413\n918,20757\n918,22293\n918,118336\n918,127158\n918,215874\n919,175\n919,349\n919,392\n919,446\n919,457\n919,623\n919,661\n919,911\n919,918\n919,941\n919,1032\n919,1085\n919,1240\n919,1805\n919,1860\n919,2252\n919,3718\n919,4118\n919,4692\n919,5659\n919,6430\n919,6955\n919,7967\n919,14042\n919,14648\n919,20573\n919,22278\n919,22471\n919,23162\n919,27005\n919,29054\n919,35093\n919,43119\n919,44347\n919,47684\n919,47832\n919,48606\n919,49222\n919,52432\n919,55741\n919,55746\n919,65663\n919,65928\n919,74716\n919,80536\n919,83380\n919,93117\n919,103564\n919,107414\n919,109809\n919,121635\n919,126735\n919,127991\n919,134229\n919,136190\n919,136191\n919,136637\n919,145129\n919,145837\n919,147503\n919,151718\n919,158338\n919,160864\n919,167612\n919,172227\n919,177575\n919,185866\n919,191337\n919,192433\n919,214298\n919,220931\n919,256177\n919,259618\n920,7\n920,10\n920,22\n920,56\n920,175\n920,184\n920,192\n920,251\n920,252\n920,256\n920,314\n920,333\n920,336\n920,397\n920,406\n920,435\n920,440\n920,467\n920,493\n920,505\n920,516\n920,599\n920,602\n920,673\n920,676\n920,733\n920,794\n920,838\n920,841\n920,849\n920,852\n920,872\n920,920\n920,921\n920,954\n920,1011\n920,1014\n920,1053\n920,1089\n920,1118\n920,1130\n920,1163\n920,1172\n920,1181\n920,1204\n920,1243\n920,1281\n920,1385\n920,1417\n920,1464\n920,1494\n920,1498\n920,1518\n920,1531\n920,1603\n920,1619\n920,1620\n920,1623\n920,1645\n920,1689\n920,1796\n920,1825\n920,1844\n920,1973\n920,2098\n920,2106\n920,2174\n920,2244\n920,2317\n920,2373\n920,2400\n920,2471\n920,2574\n920,3828\n920,3880\n920,3946\n920,4315\n920,4344\n920,4451\n920,5018\n920,5353\n920,5514\n920,5528\n920,5696\n920,5851\n920,5945\n920,6119\n920,6311\n920,6549\n920,6576\n920,6976\n920,7087\n920,7318\n920,7921\n920,8100\n920,8515\n920,8854\n920,8956\n920,9751\n920,12112\n920,13515\n920,13560\n920,13605\n920,14168\n920,14219\n920,14247\n920,14389\n920,15736\n920,15744\n920,15753\n920,16107\n920,16129\n920,16140\n920,16703\n920,16984\n920,17046\n920,18224\n920,18272\n920,18322\n920,18465\n920,18497\n920,18878\n920,19012\n920,19447\n920,19529\n920,19554\n920,19793\n920,19859\n920,19884\n920,21239\n920,21242\n920,21281\n920,21423\n920,21517\n920,21589\n920,22128\n920,22147\n920,22206\n920,22332\n920,22349\n920,22616\n920,23283\n920,23861\n920,24595\n920,24719\n920,24748\n920,24794\n920,25007\n920,25528\n920,25668\n920,26286\n920,26831\n920,26956\n920,27771\n920,28192\n920,28383\n920,28388\n920,28529\n920,28803\n920,29076\n920,29648\n920,29917\n920,30331\n920,30424\n920,30839\n920,31172\n920,31284\n920,31340\n920,31421\n920,31460\n920,31955\n920,32276\n920,32822\n920,33246\n920,33512\n920,33648\n920,34230\n920,34893\n920,35524\n920,36218\n920,36912\n920,36973\n920,37068\n920,37123\n920,37430\n920,38926\n920,39122\n920,39629\n920,39697\n920,39727\n920,39732\n920,39736\n920,39744\n920,39765\n920,39767\n920,39983\n920,40017\n920,40692\n920,40811\n920,40909\n920,41004\n920,41039\n920,41262\n920,41452\n920,41907\n920,41915\n920,42692\n920,42865\n920,43131\n920,43510\n920,43643\n920,43644\n920,43647\n920,43649\n920,43908\n920,44228\n920,44504\n920,44506\n920,44511\n920,44824\n920,44882\n920,44963\n920,45390\n920,45723\n920,45791\n920,45878\n920,46409\n920,46416\n920,46423\n920,46840\n920,47239\n920,47697\n920,48119\n920,48207\n920,48247\n920,48272\n920,48490\n920,49150\n920,50333\n920,51483\n920,52481\n920,54320\n920,54438\n920,55933\n920,56791\n920,57000\n920,57107\n920,57724\n920,58269\n920,58361\n920,58889\n920,59183\n920,59276\n920,60576\n920,61324\n920,62162\n920,62342\n920,62408\n920,62567\n920,62576\n920,62958\n920,62963\n920,63890\n920,63985\n920,65647\n920,65744\n920,65833\n920,65957\n920,65972\n920,66290\n920,66333\n920,66416\n920,67078\n920,67371\n920,67532\n920,67538\n920,68510\n920,69798\n920,70143\n920,70896\n920,71884\n920,72381\n920,72529\n920,73332\n920,73645\n920,77511\n920,79572\n920,80059\n920,80104\n920,80190\n920,80202\n920,83294\n920,83920\n920,84480\n920,84631\n920,86402\n920,87067\n920,87102\n920,90295\n920,91307\n920,91945\n920,92257\n920,93199\n920,93268\n920,93777\n920,93821\n920,93852\n920,94095\n920,94194\n920,94228\n920,94378\n920,95020\n920,95113\n920,95476\n920,95559\n920,96280\n920,96374\n920,97240\n920,97509\n920,97514\n920,98137\n920,98424\n920,98427\n920,99480\n920,101008\n920,101997\n920,102102\n920,102106\n920,102134\n920,102550\n920,103110\n920,106246\n920,106929\n920,107492\n920,109586\n920,109590\n920,109631\n920,110034\n920,110098\n920,110189\n920,110399\n920,110523\n920,111137\n920,111171\n920,112399\n920,112436\n920,112903\n920,112974\n920,112996\n920,113095\n920,113945\n920,114271\n920,114580\n920,115284\n920,115992\n920,116410\n920,116471\n920,116536\n920,117480\n920,118336\n920,118392\n920,118402\n920,118409\n920,118431\n920,118925\n920,118930\n920,119034\n920,119049\n920,119387\n920,119388\n920,119445\n920,119496\n920,120924\n920,122198\n920,123026\n920,123148\n920,123188\n920,123192\n920,123193\n920,123200\n920,123259\n920,123376\n920,123669\n920,123823\n920,123985\n920,124329\n920,125005\n920,125372\n920,126309\n920,126533\n920,127181\n920,127854\n920,128377\n920,128869\n920,129247\n920,129796\n920,130948\n920,132593\n920,133745\n920,133747\n920,133982\n920,134006\n920,136536\n920,139503\n920,139525\n920,139552\n920,140177\n920,140224\n920,140440\n920,140526\n920,140527\n920,140541\n920,140568\n920,140818\n920,142788\n920,142882\n920,142929\n920,142962\n920,143101\n920,143105\n920,143157\n920,143269\n920,143609\n920,143999\n920,146138\n920,148297\n920,155030\n920,156582\n920,159410\n920,159417\n920,159651\n920,159792\n920,159829\n920,159969\n920,160226\n920,160437\n920,161828\n920,162953\n920,162954\n920,162957\n920,165735\n920,165950\n920,167691\n920,167696\n920,167711\n920,167775\n920,169017\n920,169023\n920,169030\n920,171199\n920,172037\n920,172100\n920,172907\n920,172962\n920,173202\n920,173625\n920,174881\n920,175928\n920,176643\n920,176842\n920,176856\n920,176868\n920,177391\n920,178229\n920,179081\n920,179182\n920,179191\n920,179237\n920,179268\n920,180032\n920,180992\n920,183550\n920,184305\n920,184606\n920,187297\n920,187981\n920,188381\n920,188891\n920,191136\n920,191165\n920,191211\n920,192724\n920,194400\n920,194622\n920,196056\n920,196355\n920,196361\n920,196362\n920,196367\n920,196368\n920,196810\n920,198770\n920,198776\n920,198803\n920,199847\n920,202380\n920,204015\n920,204188\n920,204714\n920,204781\n920,205079\n920,205122\n920,205138\n920,205152\n920,205162\n920,205734\n920,206201\n920,207141\n920,207434\n920,212001\n920,212954\n920,213955\n920,216370\n920,218827\n920,220292\n920,221037\n920,226411\n920,231048\n920,231058\n920,231073\n920,231986\n920,234358\n920,234374\n920,248692\n920,251623\n920,252699\n920,253181\n920,254246\n920,254535\n920,254993\n920,258047\n920,258962\n920,259258\n920,261887\n920,262508\n920,262697\n920,262779\n920,263107\n920,264500\n920,264519\n920,264767\n920,264770\n921,272\n921,920\n922,72\n922,312\n922,3695\n923,222\n923,338\n924,202\n924,203\n924,925\n926,781\n927,536\n928,929\n929,10\n929,20\n929,65\n929,158\n929,167\n929,186\n929,209\n929,222\n929,259\n929,312\n929,336\n929,360\n929,397\n929,406\n929,441\n929,457\n929,510\n929,512\n929,535\n929,604\n929,622\n929,640\n929,673\n929,676\n929,685\n929,718\n929,772\n929,801\n929,818\n929,843\n929,852\n929,872\n929,911\n929,928\n929,929\n929,988\n929,1087\n929,1118\n929,1267\n929,1284\n929,1370\n929,1402\n929,1559\n929,1566\n929,1655\n929,1663\n929,1671\n929,1677\n929,1762\n929,1848\n929,1992\n929,2512\n929,2923\n929,3507\n929,4039\n929,4190\n929,4200\n929,5726\n929,6418\n929,6558\n929,6604\n929,6685\n929,7087\n929,7117\n929,14478\n929,14545\n929,16222\n929,16555\n929,18696\n929,20757\n929,21264\n929,25108\n929,26083\n929,26310\n929,29002\n929,37596\n929,40588\n929,41548\n929,43308\n929,43910\n929,44778\n929,44862\n929,51954\n929,52798\n929,52824\n929,56357\n929,57052\n929,62422\n929,64031\n929,64064\n929,67311\n929,79618\n929,84629\n929,84711\n929,85061\n929,87036\n929,87141\n929,87812\n929,89561\n929,91416\n929,99788\n929,105663\n929,107259\n929,119731\n929,122982\n929,123027\n929,125947\n929,133920\n929,138155\n929,146190\n929,151465\n929,161509\n929,168464\n929,170651\n929,170719\n929,171126\n929,195687\n929,216291\n929,261534\n930,931\n930,1363\n930,3507\n932,86\n932,135\n932,298\n932,372\n932,373\n932,446\n932,534\n932,663\n932,664\n932,715\n932,907\n932,932\n932,937\n932,972\n932,973\n932,1010\n932,1016\n932,1122\n932,1284\n932,1298\n932,1402\n932,1493\n932,1511\n932,1623\n932,1651\n932,1681\n932,1732\n932,1807\n932,1831\n932,1837\n932,1849\n932,1955\n932,1985\n932,3001\n932,3069\n932,3289\n932,3507\n932,3766\n932,3957\n932,4308\n932,4540\n932,6656\n932,6947\n932,7530\n932,8045\n932,8165\n932,8494\n932,9154\n932,11173\n932,13506\n932,14497\n932,14532\n932,14603\n932,14626\n932,16693\n932,17023\n932,18672\n932,20575\n932,20843\n932,22177\n932,24238\n932,24839\n932,24967\n932,26465\n932,26781\n932,29588\n932,31528\n932,32784\n932,34515\n932,37475\n932,42335\n932,43332\n932,43778\n932,44176\n932,46883\n932,47644\n932,49035\n932,49095\n932,54649\n932,55163\n932,55923\n932,58472\n932,59043\n932,59354\n932,61213\n932,61546\n932,64808\n932,64828\n932,65053\n932,70082\n932,70458\n932,70477\n932,72425\n932,78561\n932,79626\n932,89095\n932,95722\n932,97085\n932,100785\n932,104748\n932,109656\n932,112524\n932,112540\n932,115479\n932,119666\n932,121837\n932,133434\n932,138917\n932,139020\n932,139532\n932,139646\n932,140021\n932,143725\n932,148905\n932,152211\n932,156771\n932,158752\n932,171641\n932,171801\n932,174996\n932,180617\n932,186900\n932,189741\n932,201704\n932,204791\n932,220763\n932,222883\n932,227371\n932,237320\n932,238692\n932,240495\n932,243275\n932,252818\n932,260787\n933,338\n933,579\n933,838\n934,20\n934,178\n934,315\n934,346\n934,434\n934,435\n934,447\n934,538\n934,671\n934,934\n934,935\n934,939\n934,1033\n934,1068\n934,1393\n934,1474\n934,1612\n934,1877\n934,1891\n934,1973\n934,2353\n934,2470\n934,2625\n934,3831\n934,4646\n934,5083\n934,5186\n934,5611\n934,6440\n934,6661\n934,7128\n934,8477\n934,13506\n934,14111\n934,14393\n934,15146\n934,17050\n934,17423\n934,17425\n934,18416\n934,18613\n934,23302\n934,25384\n934,25575\n934,26785\n934,28922\n934,29868\n934,33298\n934,35176\n934,36915\n934,38407\n934,39725\n934,41378\n934,41435\n934,44249\n934,46271\n934,47137\n934,56008\n934,72409\n934,79010\n934,79945\n934,93005\n934,93671\n934,96622\n934,99721\n934,113469\n934,116095\n934,119552\n934,121505\n934,122050\n934,123133\n934,126696\n934,128835\n934,128936\n934,145017\n934,148405\n934,152182\n934,154329\n934,164822\n934,166673\n934,168339\n934,168370\n934,177897\n934,190473\n934,198805\n934,205749\n934,212894\n934,214093\n934,221902\n934,227815\n934,243522\n934,253099\n935,178\n935,326\n935,934\n936,698\n937,10\n937,37\n937,106\n937,287\n937,336\n937,444\n937,446\n937,506\n937,567\n937,615\n937,663\n937,664\n937,693\n937,698\n937,717\n937,750\n937,932\n937,937\n937,968\n937,972\n937,973\n937,1010\n937,1089\n937,1122\n937,1160\n937,1231\n937,1241\n937,1293\n937,1298\n937,1300\n937,1436\n937,1715\n937,1732\n937,1740\n937,1774\n937,1782\n937,1837\n937,1848\n937,1849\n937,1985\n937,2372\n937,3422\n937,5662\n937,7400\n937,7530\n937,13991\n937,16614\n937,21249\n937,34253\n937,44937\n937,103860\n937,124668\n937,127293\n937,145366\n937,170729\n937,189303\n937,221828\n938,698\n938,1782\n939,20\n939,163\n939,178\n939,192\n939,264\n939,302\n939,346\n939,435\n939,439\n939,440\n939,447\n939,467\n939,516\n939,538\n939,671\n939,934\n939,1033\n939,1294\n939,1612\n939,1877\n939,1913\n939,5996\n939,6654\n939,6966\n939,15802\n939,16881\n939,38439\n939,41767\n939,81233\n940,356\n940,941\n940,1849\n941,86\n941,167\n941,299\n941,522\n941,563\n941,567\n941,663\n941,664\n941,744\n941,852\n941,919\n941,932\n941,940\n941,941\n941,1167\n941,1319\n941,1436\n941,1479\n941,1522\n941,1607\n941,1837\n941,2083\n941,2192\n941,2372\n941,2557\n941,2888\n941,3207\n941,3218\n941,4722\n941,6467\n941,7461\n941,8097\n941,8435\n941,8534\n941,8686\n941,9457\n941,15633\n941,19966\n941,21459\n941,22177\n941,26037\n941,27432\n941,30179\n941,31175\n941,31595\n941,44518\n941,46053\n941,47103\n941,48977\n941,62943\n941,62955\n941,63038\n941,63375\n941,67147\n941,67995\n941,74631\n941,79393\n941,101995\n941,103355\n941,104418\n941,106211\n941,107592\n941,113100\n941,113530\n941,114601\n941,119894\n941,122395\n941,124911\n941,128324\n941,128889\n941,129868\n941,130854\n941,130965\n941,147410\n941,155632\n941,156243\n941,171016\n941,195102\n941,225318\n941,232816\n941,234192\n941,250629\n942,571\n942,868\n943,135\n943,138\n943,225\n943,364\n943,373\n943,943\n943,944\n943,1332\n943,1368\n943,1415\n943,1737\n943,2041\n943,2105\n943,4562\n943,5405\n943,8552\n943,13374\n943,15413\n943,20432\n943,26244\n943,32816\n943,44725\n943,46276\n943,82935\n943,93707\n943,96609\n943,103123\n943,119286\n943,125867\n943,177659\n943,179565\n943,190276\n943,247154\n943,248753\n944,285\n944,364\n944,943\n945,946\n945,1050\n945,1572\n945,4581\n945,15235\n945,15612\n945,16363\n945,20324\n945,21372\n946,945\n947,147\n947,149\n947,192\n947,273\n947,274\n947,333\n947,425\n947,586\n947,663\n947,664\n947,937\n947,1149\n947,1235\n947,1335\n947,2244\n947,4060\n947,8332\n947,80266\n947,94409\n948,949\n949,10\n949,34\n949,35\n949,83\n949,192\n949,211\n949,217\n949,222\n949,240\n949,256\n949,278\n949,313\n949,379\n949,389\n949,431\n949,455\n949,536\n949,599\n949,635\n949,685\n949,693\n949,694\n949,818\n949,843\n949,849\n949,852\n949,891\n949,948\n949,949\n949,951\n949,1011\n949,1069\n949,1085\n949,1417\n949,1587\n949,1588\n949,1623\n949,1724\n949,1996\n949,2224\n949,2253\n949,2266\n949,2348\n949,2646\n949,2665\n949,2784\n949,2906\n949,2989\n949,2991\n949,3252\n949,3507\n949,3933\n949,3937\n949,4514\n949,4579\n949,4794\n949,5312\n949,6131\n949,6828\n949,6942\n949,6960\n949,7218\n949,8070\n949,8171\n949,8628\n949,8658\n949,9328\n949,13462\n949,13571\n949,13622\n949,13980\n949,14346\n949,14414\n949,14653\n949,14833\n949,16244\n949,16620\n949,17058\n949,17151\n949,18827\n949,19005\n949,20035\n949,20862\n949,24585\n949,24758\n949,25762\n949,26140\n949,28130\n949,28605\n949,28851\n949,29595\n949,29662\n949,29760\n949,30459\n949,30617\n949,31738\n949,32804\n949,38947\n949,39366\n949,39708\n949,40809\n949,40820\n949,41053\n949,41268\n949,42070\n949,42689\n949,42737\n949,43383\n949,45258\n949,45584\n949,45590\n949,46165\n949,46783\n949,47517\n949,48783\n949,49421\n949,54784\n949,55039\n949,55983\n949,56722\n949,57354\n949,59331\n949,59788\n949,62623\n949,63201\n949,64027\n949,66703\n949,69941\n949,73310\n949,74465\n949,74553\n949,75240\n949,75343\n949,80153\n949,82350\n949,86735\n949,87763\n949,93025\n949,94298\n949,96762\n949,97988\n949,101896\n949,101967\n949,102585\n949,103532\n949,106131\n949,106292\n949,109412\n949,109706\n949,111222\n949,115474\n949,117107\n949,119978\n949,121060\n949,122230\n949,122495\n949,123390\n949,123493\n949,123627\n949,127158\n949,130275\n949,130942\n949,131216\n949,131359\n949,132508\n949,134797\n949,135575\n949,136065\n949,136530\n949,136626\n949,136733\n949,137030\n949,137042\n949,138420\n949,139173\n949,140805\n949,143368\n949,143383\n949,146537\n949,146544\n949,146746\n949,147169\n949,147429\n949,147967\n949,150746\n949,151060\n949,152685\n949,153195\n949,153774\n949,153892\n949,154019\n949,154031\n949,154042\n949,155229\n949,155397\n949,156010\n949,156436\n949,156475\n949,156790\n949,157194\n949,157196\n949,158212\n949,160975\n949,163898\n949,173685\n949,174411\n949,174850\n949,178566\n949,181899\n949,182166\n949,182540\n949,183026\n949,184837\n949,186092\n949,191138\n949,191875\n949,194645\n949,195218\n949,198862\n949,199379\n949,211850\n949,212914\n949,214005\n949,217882\n949,218195\n949,219891\n949,219967\n949,222340\n949,224871\n949,225460\n949,228458\n949,231833\n949,234800\n949,238094\n949,243017\n949,246719\n949,247410\n949,249260\n949,262393\n949,262507\n949,262545\n949,263804\n949,263969\n949,263982\n949,264477\n949,264488\n950,30\n950,217\n950,267\n950,328\n950,397\n950,439\n950,440\n950,467\n950,622\n950,794\n950,809\n950,1033\n950,1179\n950,1429\n950,1844\n950,4276\n950,4355\n950,75912\n951,34\n951,35\n951,217\n951,222\n951,278\n951,283\n951,455\n951,536\n951,657\n951,781\n951,949\n951,1019\n951,1467\n951,1860\n951,19443\n951,127158\n952,104\n952,557\n952,953\n952,954\n953,104\n953,248\n953,254\n953,327\n953,328\n953,557\n953,881\n953,953\n953,1085\n953,1844\n953,2053\n953,4276\n953,15782\n953,20741\n953,24689\n953,28891\n953,29905\n953,31156\n953,39528\n953,62986\n953,86482\n953,94157\n953,95317\n953,99852\n953,120879\n953,152913\n953,157940\n953,220007\n953,229748\n954,104\n954,557\n954,920\n954,954\n954,1939\n954,4276\n954,10318\n954,93095\n955,326\n956,620\n956,957\n956,1298\n956,1359\n956,1388\n956,1623\n956,6556\n956,6695\n956,66500\n957,184\n957,640\n957,957\n957,1247\n957,1623\n957,43853\n957,43854\n957,43855\n957,43856\n958,959\n960,959\n961,959\n962,959\n963,959\n964,959\n965,668\n965,972\n966,136\n966,442\n966,609\n966,784\n966,818\n966,862\n966,1046\n967,5\n967,25\n967,26\n967,47\n967,59\n967,114\n967,117\n967,430\n967,852\n967,865\n967,885\n967,887\n967,994\n967,1235\n967,1335\n967,1432\n967,1775\n967,2088\n967,2089\n967,2469\n967,2712\n967,2893\n967,2940\n967,3795\n967,3796\n967,4114\n967,4571\n967,5701\n967,9542\n967,14721\n967,15959\n967,16614\n967,19697\n967,19893\n967,21944\n967,34060\n967,42601\n967,88820\n967,108056\n967,154690\n967,205627\n968,37\n968,46\n968,167\n968,182\n968,186\n968,256\n968,261\n968,299\n968,301\n968,314\n968,356\n968,444\n968,459\n968,534\n968,567\n968,569\n968,589\n968,599\n968,604\n968,605\n968,609\n968,615\n968,631\n968,663\n968,664\n968,668\n968,717\n968,752\n968,783\n968,808\n968,818\n968,852\n968,903\n968,929\n968,937\n968,968\n968,972\n968,973\n968,1001\n968,1010\n968,1011\n968,1045\n968,1046\n968,1160\n968,1167\n968,1210\n968,1231\n968,1285\n968,1293\n968,1300\n968,1564\n968,1566\n968,1627\n968,1732\n968,1740\n968,1782\n968,1832\n968,1837\n968,1849\n968,1852\n968,1853\n968,1939\n968,1973\n968,2217\n968,2509\n968,2557\n968,2595\n968,2642\n968,2989\n968,2991\n968,3207\n968,3275\n968,3379\n968,3422\n968,3560\n968,3582\n968,3756\n968,3871\n968,3883\n968,4213\n968,4253\n968,4291\n968,4411\n968,4517\n968,4598\n968,5094\n968,5255\n968,5382\n968,5434\n968,5455\n968,5662\n968,6167\n968,7222\n968,7530\n968,9340\n968,13296\n968,13354\n968,13418\n968,14828\n968,15588\n968,16247\n968,16630\n968,17894\n968,18098\n968,18665\n968,18688\n968,20282\n968,20287\n968,20327\n968,20328\n968,20358\n968,20407\n968,20811\n968,21701\n968,22062\n968,23728\n968,23799\n968,24627\n968,24875\n968,25022\n968,25342\n968,26034\n968,26102\n968,26201\n968,28317\n968,28455\n968,28498\n968,28859\n968,28924\n968,29759\n968,29760\n968,30328\n968,31784\n968,31785\n968,32777\n968,34064\n968,35046\n968,36988\n968,37381\n968,37453\n968,37495\n968,38178\n968,38792\n968,38893\n968,39232\n968,41332\n968,42424\n968,42598\n968,45195\n968,45480\n968,46075\n968,46667\n968,46792\n968,47424\n968,48263\n968,48545\n968,48640\n968,48886\n968,50423\n968,54606\n968,55099\n968,58820\n968,59066\n968,59143\n968,59908\n968,60088\n968,60375\n968,60541\n968,60568\n968,62983\n968,63038\n968,66644\n968,72824\n968,72915\n968,73355\n968,74415\n968,74486\n968,80494\n968,82871\n968,83174\n968,83331\n968,83493\n968,84160\n968,85983\n968,86518\n968,87287\n968,87399\n968,88173\n968,90254\n968,91079\n968,94845\n968,95400\n968,96482\n968,96685\n968,96763\n968,99802\n968,101485\n968,103860\n968,109070\n968,110186\n968,110575\n968,113093\n968,116480\n968,118326\n968,120465\n968,122132\n968,122451\n968,122880\n968,123044\n968,124017\n968,124874\n968,127158\n968,127858\n968,134363\n968,135369\n968,135370\n968,137113\n968,137149\n968,148876\n968,157413\n968,158801\n968,159454\n968,163183\n968,163454\n968,163918\n968,164836\n968,167083\n968,167565\n968,173207\n968,173663\n968,175033\n968,179007\n968,179318\n968,180551\n968,181835\n968,186657\n968,187176\n968,188664\n968,189303\n968,192191\n968,195523\n968,199424\n968,207659\n968,212312\n968,212351\n968,212474\n968,215241\n968,215802\n968,217262\n968,220492\n968,221828\n968,221920\n968,222632\n968,224451\n968,226490\n968,227376\n968,228883\n968,230690\n968,231939\n968,232175\n968,247902\n968,251473\n968,252863\n968,255081\n968,258174\n968,258354\n968,260934\n968,263126\n969,397\n969,415\n969,694\n969,2646\n969,2775\n969,3623\n970,417\n971,323\n972,10\n972,46\n972,86\n972,126\n972,167\n972,182\n972,256\n972,299\n972,301\n972,302\n972,314\n972,336\n972,356\n972,372\n972,397\n972,406\n972,440\n972,446\n972,452\n972,457\n972,505\n972,512\n972,534\n972,535\n972,563\n972,599\n972,604\n972,631\n972,663\n972,664\n972,668\n972,676\n972,693\n972,720\n972,784\n972,794\n972,838\n972,843\n972,849\n972,877\n972,907\n972,932\n972,937\n972,968\n972,972\n972,973\n972,1010\n972,1011\n972,1013\n972,1014\n972,1085\n972,1117\n972,1118\n972,1122\n972,1123\n972,1130\n972,1172\n972,1181\n972,1192\n972,1231\n972,1240\n972,1267\n972,1271\n972,1284\n972,1293\n972,1297\n972,1298\n972,1417\n972,1436\n972,1493\n972,1522\n972,1559\n972,1566\n972,1611\n972,1623\n972,1655\n972,1663\n972,1732\n972,1749\n972,1782\n972,1837\n972,1844\n972,1849\n972,1973\n972,1992\n972,2063\n972,2173\n972,2191\n972,2224\n972,2253\n972,2263\n972,2347\n972,2373\n972,2460\n972,2511\n972,2580\n972,2728\n972,3297\n972,3392\n972,3422\n972,3507\n972,3524\n972,3687\n972,3756\n972,3804\n972,3893\n972,3992\n972,4066\n972,4190\n972,4209\n972,5213\n972,5382\n972,5794\n972,5998\n972,6518\n972,6824\n972,6857\n972,6904\n972,6987\n972,7293\n972,7303\n972,7349\n972,7530\n972,7818\n972,7908\n972,7936\n972,7941\n972,8113\n972,8132\n972,8165\n972,9375\n972,9457\n972,13447\n972,14497\n972,14572\n972,14598\n972,14652\n972,15073\n972,15203\n972,16323\n972,17021\n972,17073\n972,18604\n972,18672\n972,19334\n972,19413\n972,19525\n972,19592\n972,20396\n972,20668\n972,20709\n972,20728\n972,20803\n972,21095\n972,21249\n972,21442\n972,21459\n972,23364\n972,23565\n972,24562\n972,24924\n972,24926\n972,26302\n972,26341\n972,26948\n972,27901\n972,28254\n972,28914\n972,32497\n972,32781\n972,32784\n972,33569\n972,34928\n972,35415\n972,35623\n972,35654\n972,35658\n972,37098\n972,37343\n972,38299\n972,39053\n972,39206\n972,39536\n972,39562\n972,39704\n972,42544\n972,43193\n972,43875\n972,45423\n972,45853\n972,52528\n972,52672\n972,54297\n972,54403\n972,56365\n972,58240\n972,59920\n972,61139\n972,61555\n972,62024\n972,63408\n972,64715\n972,65913\n972,66594\n972,67090\n972,67142\n972,67789\n972,68152\n972,68178\n972,68184\n972,68186\n972,68221\n972,68769\n972,68832\n972,68893\n972,70230\n972,70350\n972,70947\n972,71078\n972,71098\n972,72764\n972,73290\n972,73333\n972,74702\n972,75057\n972,75912\n972,79528\n972,80430\n972,83321\n972,86562\n972,88498\n972,90333\n972,90334\n972,90337\n972,90692\n972,92017\n972,93717\n972,95118\n972,95361\n972,97325\n972,102507\n972,104346\n972,105319\n972,105532\n972,105780\n972,107026\n972,107162\n972,107616\n972,109838\n972,111217\n972,114682\n972,117480\n972,118484\n972,124668\n972,125841\n972,131652\n972,134628\n972,136153\n972,137058\n972,137059\n972,138823\n972,148387\n972,148742\n972,153177\n972,154887\n972,155188\n972,156340\n972,157029\n972,159117\n972,160490\n972,173435\n972,176449\n972,176469\n972,178379\n972,183102\n972,186675\n972,186900\n972,187176\n972,189560\n972,191280\n972,191381\n972,192405\n972,192419\n972,204791\n972,205673\n972,214056\n972,215874\n972,216085\n972,216170\n972,223099\n972,223693\n972,226905\n972,227669\n972,234102\n972,237320\n972,240084\n972,248536\n972,248918\n972,249055\n972,249218\n972,250835\n972,258422\n972,258463\n972,261851\n972,262384\n973,46\n973,167\n973,240\n973,292\n973,299\n973,301\n973,444\n973,446\n973,631\n973,663\n973,664\n973,666\n973,685\n973,720\n973,744\n973,775\n973,818\n973,877\n973,907\n973,932\n973,937\n973,968\n973,972\n973,973\n973,982\n973,983\n973,984\n973,992\n973,1001\n973,1010\n973,1011\n973,1085\n973,1117\n973,1118\n973,1122\n973,1124\n973,1167\n973,1231\n973,1241\n973,1271\n973,1284\n973,1297\n973,1298\n973,1300\n973,1436\n973,1522\n973,1544\n973,1559\n973,1616\n973,1623\n973,1635\n973,1715\n973,1731\n973,1732\n973,1749\n973,1782\n973,1837\n973,1849\n973,2083\n973,2191\n973,2372\n973,2625\n973,2979\n973,3207\n973,3422\n973,3507\n973,3804\n973,4066\n973,4213\n973,4329\n973,5662\n973,6474\n973,6919\n973,7222\n973,7818\n973,8261\n973,8548\n973,8658\n973,13523\n973,14414\n973,14469\n973,15109\n973,15253\n973,15277\n973,16506\n973,18526\n973,20327\n973,20704\n973,23565\n973,25802\n973,31731\n973,31802\n973,32264\n973,32784\n973,34073\n973,35415\n973,35623\n973,37771\n973,39053\n973,39562\n973,39665\n973,40606\n973,40792\n973,44385\n973,44444\n973,45853\n973,49853\n973,50402\n973,50595\n973,52403\n973,52528\n973,54403\n973,54504\n973,54983\n973,57072\n973,57082\n973,57083\n973,57084\n973,57085\n973,57088\n973,57089\n973,57091\n973,57097\n973,57098\n973,57099\n973,57100\n973,57101\n973,57102\n973,57103\n973,57104\n973,57106\n973,57108\n973,57110\n973,57111\n973,57112\n973,57113\n973,57115\n973,57121\n973,57164\n973,57276\n973,57811\n973,58444\n973,58450\n973,58515\n973,59920\n973,61139\n973,62404\n973,64226\n973,66594\n973,67090\n973,67630\n973,67789\n973,68178\n973,68184\n973,68186\n973,68221\n973,68817\n973,68893\n973,68965\n973,70230\n973,70350\n973,72764\n973,73187\n973,74082\n973,74687\n973,77473\n973,80379\n973,82739\n973,83291\n973,83321\n973,86608\n973,88306\n973,90254\n973,91998\n973,95361\n973,99907\n973,103202\n973,105157\n973,108485\n973,110322\n973,111098\n973,111553\n973,111722\n973,112338\n973,112501\n973,112722\n973,113499\n973,114682\n973,115479\n973,116443\n973,116642\n973,117609\n973,117805\n973,120451\n973,127158\n973,128733\n973,128822\n973,131928\n973,131929\n973,131934\n973,134672\n973,134724\n973,135236\n973,138953\n973,142077\n973,144110\n973,148742\n973,152298\n973,158219\n973,162702\n973,162703\n973,162704\n973,164496\n973,165919\n973,174187\n973,181145\n973,182928\n973,185612\n973,186900\n973,187176\n973,188815\n973,194470\n973,195559\n973,204791\n973,212687\n973,222652\n973,228787\n973,237320\n973,258091\n974,975\n974,37363\n974,52488\n974,54401\n976,385\n977,4\n977,5\n977,134\n977,527\n977,743\n977,794\n977,1984\n977,2674\n977,8714\n977,95583\n978,87\n978,111\n978,292\n978,314\n978,323\n978,338\n978,392\n978,462\n978,595\n978,1151\n978,1238\n978,1289\n978,1453\n978,1572\n978,1653\n978,1688\n978,1722\n978,1893\n978,4039\n978,4771\n978,7270\n978,8149\n979,980\n980,259\n980,272\n980,314\n980,393\n980,577\n980,599\n980,685\n980,693\n980,726\n980,766\n980,788\n980,852\n980,859\n980,902\n980,911\n980,979\n980,980\n980,1044\n980,1065\n980,1070\n980,1192\n980,1531\n980,1848\n980,2023\n980,2094\n980,2106\n980,2178\n980,2404\n980,3477\n980,3799\n980,3835\n980,4137\n980,4149\n980,4545\n980,6717\n980,6870\n980,6872\n980,7115\n980,7780\n980,8438\n980,8600\n980,13678\n980,13703\n980,13725\n980,14111\n980,14422\n980,14816\n980,15282\n980,15312\n980,16679\n980,17574\n980,18164\n980,18493\n980,19191\n980,20377\n980,20712\n980,20844\n980,21323\n980,21453\n980,21627\n980,21727\n980,21736\n980,22425\n980,22431\n980,22838\n980,23033\n980,23397\n980,24162\n980,29116\n980,29532\n980,30484\n980,32492\n980,32641\n980,35593\n980,36665\n980,38122\n980,38132\n980,40332\n980,40723\n980,40763\n980,41338\n980,41829\n980,41885\n980,42533\n980,42616\n980,42683\n980,45059\n980,45753\n980,45983\n980,48165\n980,48168\n980,48173\n980,48175\n980,48178\n980,48182\n980,48183\n980,49981\n980,50154\n980,50272\n980,50276\n980,50621\n980,51955\n980,51973\n980,55743\n980,56150\n980,66292\n980,68816\n980,73492\n980,76685\n980,76993\n980,78959\n980,79004\n980,83937\n980,87216\n980,89907\n980,94456\n980,94995\n980,95598\n980,103772\n980,107348\n980,109851\n980,111324\n980,113573\n980,120612\n980,122215\n980,122968\n980,124876\n980,127314\n980,128318\n980,129735\n980,129833\n980,130231\n980,130785\n980,130814\n980,131133\n980,134523\n980,135745\n980,139489\n980,139620\n980,140073\n980,140365\n980,140487\n980,140491\n980,140695\n980,140728\n980,143983\n980,143984\n980,144878\n980,146064\n980,148358\n980,148372\n980,148390\n980,148405\n980,153114\n980,158587\n980,158699\n980,158703\n980,158982\n980,164088\n980,164259\n980,164374\n980,166627\n980,169903\n980,172494\n980,175934\n980,176386\n980,177153\n980,181752\n980,182413\n980,183540\n980,186625\n980,186735\n980,186764\n980,186771\n980,192570\n980,194341\n980,197534\n980,201182\n980,207580\n980,215874\n980,216200\n980,216602\n980,217480\n980,221004\n980,221087\n980,221130\n980,225420\n980,229281\n980,235937\n980,236494\n980,238722\n980,238733\n980,243470\n980,243968\n980,245393\n980,247328\n980,247428\n980,247766\n980,247899\n980,248440\n980,249204\n980,258918\n980,258923\n980,259094\n980,262635\n980,262639\n980,262645\n982,46\n982,292\n982,631\n982,775\n982,972\n982,973\n982,1010\n982,1122\n982,1284\n982,1298\n982,5662\n982,72764\n983,973\n985,71\n985,387\n985,986\n985,1021\n985,2081\n985,2227\n985,2512\n985,5092\n985,8066\n985,19464\n985,21291\n985,37743\n985,41309\n985,42470\n985,46863\n985,55167\n985,73313\n985,87347\n985,87355\n985,108148\n985,115973\n985,123941\n985,127785\n985,140315\n985,144969\n985,149572\n985,153689\n985,163921\n985,164448\n985,185482\n985,189813\n985,194910\n985,206350\n985,217880\n985,218883\n985,219870\n985,227029\n985,227264\n985,233539\n985,241675\n985,243979\n985,254862\n985,260750\n986,985\n987,130\n988,929\n989,225\n991,87\n991,192\n991,256\n991,599\n991,685\n991,788\n991,872\n991,911\n991,991\n991,992\n991,1011\n991,1014\n991,1276\n991,1298\n991,1688\n991,2574\n991,4066\n992,160\n992,202\n992,203\n992,256\n992,264\n992,425\n992,450\n992,509\n992,510\n992,589\n992,668\n992,818\n992,843\n992,868\n992,919\n992,920\n992,973\n992,991\n992,992\n992,1014\n992,1058\n992,1085\n992,1276\n992,1289\n992,1381\n992,1860\n992,1891\n992,1973\n992,2019\n992,3182\n992,3507\n992,4165\n992,4354\n992,5158\n992,5265\n992,7388\n992,8243\n992,14680\n992,23669\n992,23731\n992,26247\n992,29078\n992,31258\n992,31582\n992,32566\n992,32588\n992,37529\n992,38153\n992,46846\n992,48574\n992,48982\n992,50166\n992,50170\n992,54632\n992,63363\n992,63407\n992,63444\n992,73364\n992,85829\n992,90258\n992,91812\n992,101887\n992,106815\n992,109036\n992,112841\n992,118817\n992,121443\n992,124704\n992,125101\n992,125910\n992,128765\n992,141073\n992,151462\n992,157297\n992,162941\n992,164934\n992,165371\n992,179750\n992,182896\n992,186565\n992,188521\n992,210767\n992,218308\n992,220442\n992,226440\n992,233576\n992,241051\n992,254621\n992,254851\n992,254856\n992,255540\n992,255542\n992,258050\n992,259463\n993,994\n994,4\n994,5\n994,26\n994,46\n994,59\n994,60\n994,94\n994,114\n994,118\n994,250\n994,430\n994,885\n994,887\n994,967\n994,994\n994,1124\n994,1235\n994,1334\n994,1335\n994,1684\n994,2674\n994,2787\n994,2892\n994,2893\n994,3794\n994,3795\n994,3796\n994,3816\n994,3817\n994,4114\n994,4198\n994,4571\n994,4662\n994,4748\n994,5701\n994,5803\n994,5997\n994,6208\n994,6209\n994,6462\n994,6621\n994,8092\n994,8498\n994,9358\n994,13662\n994,14187\n994,14513\n994,14720\n994,14721\n994,15378\n994,15730\n994,17140\n994,18125\n994,19889\n994,20774\n994,21042\n994,21944\n994,24626\n994,24843\n994,25540\n994,28462\n994,33444\n994,34769\n994,40392\n994,41967\n994,42743\n994,42832\n994,43215\n994,47540\n994,67988\n994,88820\n994,108056\n995,697\n996,20\n996,178\n996,315\n996,346\n996,415\n996,435\n996,447\n996,538\n996,595\n996,599\n996,670\n996,671\n996,808\n996,859\n996,911\n996,934\n996,996\n996,997\n996,1068\n996,1242\n996,1275\n996,1294\n996,1396\n996,1474\n996,1644\n996,1877\n996,1895\n996,2040\n996,2130\n996,2255\n996,2352\n996,2646\n996,2775\n996,3154\n996,3438\n996,4298\n996,4386\n996,6564\n996,6661\n996,6663\n996,7058\n996,7848\n996,7940\n996,8359\n996,8448\n996,9337\n996,13491\n996,13548\n996,14428\n996,14655\n996,15141\n996,15531\n996,17904\n996,19191\n996,19817\n996,21280\n996,23443\n996,23444\n996,24749\n996,26896\n996,30775\n996,32249\n996,33298\n996,34150\n996,34203\n996,34247\n996,34541\n996,37070\n996,37375\n996,37395\n996,37397\n996,37408\n996,37412\n996,37434\n996,37530\n996,37613\n996,38140\n996,38141\n996,38293\n996,38426\n996,41163\n996,41224\n996,43716\n996,44835\n996,44878\n996,49878\n996,50056\n996,50064\n996,50069\n996,50073\n996,50078\n996,50081\n996,50089\n996,50093\n996,50447\n996,50470\n996,50475\n996,50478\n996,50479\n996,50480\n996,50482\n996,50485\n996,50486\n996,50487\n996,50488\n996,50489\n996,50708\n996,53224\n996,55273\n996,62984\n996,63735\n996,65757\n996,66344\n996,80166\n996,82027\n996,90933\n996,95639\n996,99725\n996,101806\n996,105401\n996,106377\n996,107533\n996,109694\n996,109885\n996,110522\n996,112683\n996,112928\n996,118124\n996,120155\n996,127946\n996,133434\n996,138727\n996,139600\n996,140512\n996,144011\n996,144433\n996,145200\n996,145463\n996,150639\n996,150723\n996,150929\n996,151040\n996,151091\n996,155509\n996,156226\n996,156318\n996,157091\n996,162117\n996,162501\n996,168508\n996,168932\n996,169059\n996,173817\n996,176759\n996,176960\n996,177750\n996,182210\n996,182474\n996,182550\n996,184882\n996,186684\n996,187802\n996,190492\n996,199953\n996,199972\n996,207690\n996,211506\n996,216274\n996,216708\n996,217083\n996,217084\n996,217085\n996,217086\n996,217171\n996,217289\n996,217330\n996,217644\n996,218506\n996,218772\n996,222400\n996,229237\n996,230903\n996,234825\n996,234827\n996,237424\n996,242248\n996,245509\n996,250717\n996,251384\n996,253319\n996,253394\n996,254416\n996,257021\n996,258744\n996,262574\n997,26\n997,59\n997,808\n997,887\n997,996\n997,1019\n997,1616\n997,1949\n997,2105\n997,3258\n997,44725\n998,192\n998,336\n998,493\n998,682\n999,10\n999,104\n999,107\n999,256\n999,441\n999,442\n999,626\n999,715\n999,749\n999,775\n999,784\n999,999\n999,1001\n999,1293\n999,1388\n999,1808\n999,2572\n999,5809\n999,5876\n999,9342\n999,9739\n999,13538\n999,15226\n999,15633\n999,17575\n999,18600\n999,19119\n999,19870\n999,19875\n999,19896\n999,20769\n999,21356\n999,27513\n999,28960\n999,29653\n999,32694\n999,35521\n999,36925\n999,39559\n999,39618\n999,45891\n999,58289\n999,58921\n999,63028\n999,69624\n999,69653\n999,70320\n999,73836\n999,73872\n999,74395\n999,76329\n999,76776\n999,76872\n999,79560\n999,81452\n999,89711\n999,106986\n999,118447\n999,119179\n999,128398\n999,129516\n999,130302\n999,136520\n999,150762\n999,158571\n999,160883\n999,171249\n999,177921\n999,178620\n999,178621\n999,178622\n999,179239\n999,182345\n999,192446\n999,195076\n999,204734\n999,221342\n999,226389\n999,227975\n999,228043\n999,228387\n999,232595\n999,241061\n999,243261\n1000,1001\n1000,3094\n1001,10\n1001,34\n1001,35\n1001,41\n1001,104\n1001,120\n1001,134\n1001,186\n1001,211\n1001,233\n1001,240\n1001,301\n1001,314\n1001,373\n1001,388\n1001,389\n1001,390\n1001,417\n1001,431\n1001,442\n1001,467\n1001,495\n1001,534\n1001,536\n1001,573\n1001,589\n1001,596\n1001,599\n1001,617\n1001,631\n1001,632\n1001,636\n1001,677\n1001,685\n1001,693\n1001,694\n1001,715\n1001,760\n1001,765\n1001,775\n1001,784\n1001,795\n1001,818\n1001,849\n1001,872\n1001,907\n1001,966\n1001,968\n1001,973\n1001,1001\n1001,1011\n1001,1029\n1001,1085\n1001,1104\n1001,1119\n1001,1133\n1001,1160\n1001,1177\n1001,1181\n1001,1192\n1001,1262\n1001,1282\n1001,1284\n1001,1285\n1001,1293\n1001,1298\n1001,1326\n1001,1392\n1001,1410\n1001,1489\n1001,1522\n1001,1545\n1001,1715\n1001,1796\n1001,1844\n1001,1853\n1001,1942\n1001,1988\n1001,2193\n1001,2235\n1001,2400\n1001,2512\n1001,2614\n1001,2747\n1001,2833\n1001,3093\n1001,3094\n1001,3135\n1001,3328\n1001,3367\n1001,3455\n1001,3507\n1001,3774\n1001,3791\n1001,3804\n1001,3866\n1001,4109\n1001,4163\n1001,4265\n1001,4387\n1001,4565\n1001,5129\n1001,5186\n1001,5231\n1001,5725\n1001,5828\n1001,5961\n1001,6017\n1001,6474\n1001,6569\n1001,6837\n1001,6856\n1001,7534\n1001,7766\n1001,7844\n1001,8107\n1001,9025\n1001,13274\n1001,13328\n1001,13433\n1001,13718\n1001,14193\n1001,14554\n1001,14572\n1001,14820\n1001,15109\n1001,15503\n1001,15608\n1001,15931\n1001,16192\n1001,17040\n1001,18661\n1001,18694\n1001,19471\n1001,19525\n1001,19941\n1001,20607\n1001,21051\n1001,21245\n1001,21395\n1001,21488\n1001,21742\n1001,22233\n1001,22296\n1001,22440\n1001,22562\n1001,23710\n1001,24851\n1001,25233\n1001,25272\n1001,26341\n1001,27041\n1001,27903\n1001,28191\n1001,28442\n1001,29038\n1001,29288\n1001,29760\n1001,29870\n1001,29898\n1001,31294\n1001,31785\n1001,32497\n1001,32516\n1001,32613\n1001,32890\n1001,33591\n1001,34346\n1001,34515\n1001,34881\n1001,34963\n1001,35233\n1001,36969\n1001,38822\n1001,39618\n1001,40524\n1001,41824\n1001,41862\n1001,42810\n1001,42951\n1001,43394\n1001,45710\n1001,45827\n1001,46128\n1001,46284\n1001,47786\n1001,48531\n1001,48716\n1001,49247\n1001,50561\n1001,52206\n1001,54615\n1001,55080\n1001,56715\n1001,56724\n1001,56984\n1001,58449\n1001,58921\n1001,59928\n1001,62334\n1001,62511\n1001,64526\n1001,64570\n1001,65635\n1001,65797\n1001,65953\n1001,67591\n1001,68345\n1001,68946\n1001,68963\n1001,71770\n1001,71864\n1001,72639\n1001,74576\n1001,75295\n1001,75883\n1001,75912\n1001,77697\n1001,78668\n1001,78805\n1001,78973\n1001,79431\n1001,79528\n1001,80172\n1001,83940\n1001,95382\n1001,99937\n1001,101671\n1001,104592\n1001,107758\n1001,111082\n1001,112315\n1001,112475\n1001,113616\n1001,116543\n1001,116590\n1001,116599\n1001,116600\n1001,116741\n1001,120132\n1001,120152\n1001,122575\n1001,123176\n1001,124424\n1001,125079\n1001,125406\n1001,126764\n1001,127158\n1001,128978\n1001,130168\n1001,131374\n1001,133399\n1001,135285\n1001,135286\n1001,135287\n1001,135288\n1001,135289\n1001,135290\n1001,135309\n1001,136784\n1001,141919\n1001,141985\n1001,143348\n1001,153306\n1001,155576\n1001,156443\n1001,159430\n1001,159432\n1001,161618\n1001,161782\n1001,161930\n1001,163890\n1001,164365\n1001,164396\n1001,175000\n1001,177927\n1001,179071\n1001,180954\n1001,183316\n1001,183392\n1001,184500\n1001,185102\n1001,185151\n1001,189881\n1001,193101\n1001,214197\n1001,220460\n1001,229225\n1001,237548\n1001,249064\n1001,249301\n1001,249306\n1001,251511\n1001,252099\n1001,254511\n1001,257924\n1001,262757\n1001,263782\n1002,81\n1002,1003\n1002,6174\n1002,16790\n1003,79\n1003,81\n1003,158\n1003,192\n1003,406\n1003,1107\n1003,1515\n1003,3051\n1003,5357\n1003,6771\n1003,6850\n1003,13381\n1003,14913\n1003,15206\n1003,17116\n1003,17117\n1003,18590\n1003,26950\n1003,27065\n1004,41\n1004,68\n1004,431\n1004,631\n1004,760\n1004,805\n1004,1119\n1004,1285\n1004,1955\n1004,2995\n1004,7194\n1005,34\n1005,35\n1005,222\n1005,455\n1005,657\n1005,1465\n1005,33508\n1006,1007\n1006,3999\n1006,36819\n1007,134\n1007,202\n1007,254\n1007,314\n1007,346\n1007,671\n1007,1007\n1007,1011\n1007,1192\n1007,1262\n1007,1572\n1007,2782\n1007,3507\n1007,5265\n1007,20813\n1008,328\n1009,1010\n1009,1011\n1010,10\n1010,68\n1010,106\n1010,167\n1010,175\n1010,186\n1010,192\n1010,211\n1010,240\n1010,256\n1010,264\n1010,287\n1010,301\n1010,302\n1010,314\n1010,352\n1010,356\n1010,372\n1010,406\n1010,417\n1010,425\n1010,440\n1010,452\n1010,457\n1010,467\n1010,505\n1010,510\n1010,516\n1010,534\n1010,563\n1010,571\n1010,599\n1010,615\n1010,631\n1010,663\n1010,664\n1010,685\n1010,693\n1010,766\n1010,809\n1010,818\n1010,838\n1010,868\n1010,872\n1010,877\n1010,881\n1010,907\n1010,911\n1010,932\n1010,937\n1010,968\n1010,972\n1010,973\n1010,982\n1010,1001\n1010,1009\n1010,1010\n1010,1011\n1010,1012\n1010,1013\n1010,1014\n1010,1085\n1010,1117\n1010,1118\n1010,1122\n1010,1210\n1010,1241\n1010,1262\n1010,1271\n1010,1284\n1010,1293\n1010,1297\n1010,1298\n1010,1307\n1010,1355\n1010,1360\n1010,1370\n1010,1417\n1010,1436\n1010,1518\n1010,1522\n1010,1531\n1010,1545\n1010,1715\n1010,1732\n1010,1749\n1010,1757\n1010,1782\n1010,1796\n1010,1798\n1010,1837\n1010,1849\n1010,1853\n1010,1955\n1010,1965\n1010,1973\n1010,2007\n1010,2063\n1010,2083\n1010,2173\n1010,2191\n1010,2193\n1010,2252\n1010,2307\n1010,2373\n1010,2557\n1010,2595\n1010,2728\n1010,3172\n1010,3392\n1010,3495\n1010,3687\n1010,3734\n1010,3761\n1010,3804\n1010,3866\n1010,3893\n1010,3937\n1010,3992\n1010,3993\n1010,4066\n1010,4213\n1010,4240\n1010,4286\n1010,4308\n1010,4381\n1010,4446\n1010,4482\n1010,4514\n1010,4696\n1010,5376\n1010,5382\n1010,5536\n1010,5625\n1010,5654\n1010,5923\n1010,7087\n1010,7534\n1010,7969\n1010,8180\n1010,8187\n1010,9374\n1010,13513\n1010,13699\n1010,13732\n1010,13734\n1010,13764\n1010,13771\n1010,14449\n1010,14497\n1010,15061\n1010,15409\n1010,16151\n1010,16638\n1010,16869\n1010,17078\n1010,18377\n1010,18570\n1010,19426\n1010,19798\n1010,20396\n1010,20668\n1010,20722\n1010,20728\n1010,20803\n1010,21127\n1010,21349\n1010,22423\n1010,24771\n1010,24924\n1010,24962\n1010,26034\n1010,26409\n1010,26786\n1010,29378\n1010,29842\n1010,30389\n1010,31003\n1010,31746\n1010,32655\n1010,32697\n1010,32704\n1010,32723\n1010,32784\n1010,32975\n1010,33799\n1010,34073\n1010,34543\n1010,34721\n1010,35065\n1010,35142\n1010,36662\n1010,38300\n1010,39558\n1010,39618\n1010,39708\n1010,40480\n1010,42789\n1010,43408\n1010,43875\n1010,44182\n1010,44713\n1010,44937\n1010,45853\n1010,46699\n1010,46830\n1010,46995\n1010,48225\n1010,50542\n1010,50633\n1010,51884\n1010,52067\n1010,55231\n1010,56365\n1010,57071\n1010,58284\n1010,58505\n1010,59726\n1010,61411\n1010,61511\n1010,63081\n1010,64182\n1010,64685\n1010,68152\n1010,68914\n1010,69978\n1010,69994\n1010,71267\n1010,71697\n1010,73216\n1010,73220\n1010,74505\n1010,75195\n1010,75883\n1010,75912\n1010,76150\n1010,79379\n1010,79563\n1010,79942\n1010,80659\n1010,80985\n1010,81233\n1010,81803\n1010,81937\n1010,82582\n1010,83321\n1010,83336\n1010,83544\n1010,84667\n1010,86234\n1010,86439\n1010,86440\n1010,87452\n1010,88593\n1010,89703\n1010,93065\n1010,96685\n1010,96690\n1010,97515\n1010,99885\n1010,100275\n1010,101578\n1010,102040\n1010,104112\n1010,104648\n1010,105157\n1010,106767\n1010,107109\n1010,107113\n1010,107616\n1010,109430\n1010,112266\n1010,114638\n1010,114682\n1010,116275\n1010,117749\n1010,117963\n1010,118028\n1010,118033\n1010,119993\n1010,121162\n1010,121205\n1010,121471\n1010,122194\n1010,122203\n1010,123041\n1010,123851\n1010,124545\n1010,124610\n1010,124668\n1010,125035\n1010,127158\n1010,128174\n1010,128287\n1010,128733\n1010,128807\n1010,128870\n1010,131531\n1010,131652\n1010,132620\n1010,133434\n1010,133888\n1010,134672\n1010,136077\n1010,137058\n1010,137108\n1010,139958\n1010,140021\n1010,140163\n1010,141960\n1010,142750\n1010,142892\n1010,143927\n1010,143928\n1010,143929\n1010,143930\n1010,143931\n1010,143932\n1010,143933\n1010,143934\n1010,143935\n1010,143936\n1010,143937\n1010,143938\n1010,143939\n1010,143940\n1010,143941\n1010,143942\n1010,143952\n1010,143953\n1010,143954\n1010,143955\n1010,143956\n1010,144033\n1010,144034\n1010,146073\n1010,146641\n1010,146675\n1010,146917\n1010,147118\n1010,147351\n1010,147872\n1010,148387\n1010,148967\n1010,154004\n1010,154385\n1010,155818\n1010,157061\n1010,157415\n1010,158335\n1010,158976\n1010,159171\n1010,159436\n1010,159510\n1010,159692\n1010,160409\n1010,161637\n1010,163898\n1010,164470\n1010,170620\n1010,170676\n1010,170874\n1010,171641\n1010,172522\n1010,177463\n1010,177946\n1010,177971\n1010,179154\n1010,186652\n1010,186790\n1010,188709\n1010,204791\n1010,207076\n1010,225395\n1010,228293\n1010,232159\n1010,234766\n1010,234910\n1010,235971\n1010,236038\n1010,236039\n1010,237320\n1010,238981\n1010,244104\n1010,244180\n1010,245211\n1010,246550\n1010,247138\n1010,247820\n1010,248536\n1010,248577\n1010,249055\n1010,249906\n1010,250660\n1010,255483\n1010,258573\n1010,259457\n1010,259743\n1010,260412\n1010,262455\n1010,262841\n1011,3\n1011,20\n1011,30\n1011,34\n1011,35\n1011,37\n1011,41\n1011,50\n1011,56\n1011,58\n1011,63\n1011,66\n1011,81\n1011,87\n1011,99\n1011,104\n1011,106\n1011,120\n1011,126\n1011,134\n1011,135\n1011,136\n1011,137\n1011,138\n1011,146\n1011,147\n1011,149\n1011,158\n1011,167\n1011,195\n1011,200\n1011,202\n1011,203\n1011,206\n1011,207\n1011,209\n1011,211\n1011,215\n1011,227\n1011,233\n1011,240\n1011,248\n1011,251\n1011,252\n1011,254\n1011,256\n1011,259\n1011,261\n1011,264\n1011,275\n1011,278\n1011,287\n1011,289\n1011,290\n1011,299\n1011,301\n1011,313\n1011,314\n1011,326\n1011,327\n1011,332\n1011,333\n1011,336\n1011,346\n1011,349\n1011,364\n1011,379\n1011,388\n1011,392\n1011,397\n1011,406\n1011,417\n1011,422\n1011,433\n1011,439\n1011,441\n1011,442\n1011,444\n1011,452\n1011,455\n1011,462\n1011,467\n1011,473\n1011,477\n1011,493\n1011,502\n1011,503\n1011,505\n1011,509\n1011,510\n1011,516\n1011,534\n1011,535\n1011,536\n1011,538\n1011,557\n1011,572\n1011,573\n1011,575\n1011,577\n1011,588\n1011,589\n1011,590\n1011,592\n1011,595\n1011,602\n1011,604\n1011,615\n1011,620\n1011,623\n1011,626\n1011,631\n1011,634\n1011,644\n1011,647\n1011,663\n1011,671\n1011,673\n1011,685\n1011,694\n1011,697\n1011,702\n1011,703\n1011,704\n1011,710\n1011,714\n1011,720\n1011,752\n1011,760\n1011,772\n1011,775\n1011,779\n1011,783\n1011,784\n1011,794\n1011,801\n1011,809\n1011,811\n1011,818\n1011,823\n1011,838\n1011,843\n1011,849\n1011,850\n1011,859\n1011,861\n1011,868\n1011,872\n1011,873\n1011,874\n1011,875\n1011,907\n1011,911\n1011,918\n1011,919\n1011,920\n1011,932\n1011,934\n1011,949\n1011,968\n1011,972\n1011,973\n1011,1001\n1011,1007\n1011,1010\n1011,1011\n1011,1019\n1011,1033\n1011,1082\n1011,1085\n1011,1089\n1011,1117\n1011,1122\n1011,1130\n1011,1132\n1011,1133\n1011,1140\n1011,1147\n1011,1149\n1011,1151\n1011,1172\n1011,1182\n1011,1210\n1011,1212\n1011,1220\n1011,1222\n1011,1231\n1011,1240\n1011,1241\n1011,1262\n1011,1265\n1011,1266\n1011,1267\n1011,1274\n1011,1282\n1011,1284\n1011,1293\n1011,1294\n1011,1298\n1011,1300\n1011,1309\n1011,1326\n1011,1345\n1011,1363\n1011,1368\n1011,1370\n1011,1381\n1011,1402\n1011,1411\n1011,1417\n1011,1425\n1011,1436\n1011,1453\n1011,1454\n1011,1458\n1011,1465\n1011,1467\n1011,1474\n1011,1479\n1011,1509\n1011,1511\n1011,1515\n1011,1518\n1011,1522\n1011,1531\n1011,1544\n1011,1551\n1011,1556\n1011,1564\n1011,1580\n1011,1590\n1011,1608\n1011,1644\n1011,1655\n1011,1688\n1011,1715\n1011,1722\n1011,1724\n1011,1732\n1011,1749\n1011,1782\n1011,1785\n1011,1801\n1011,1805\n1011,1807\n1011,1818\n1011,1836\n1011,1837\n1011,1844\n1011,1848\n1011,1860\n1011,1882\n1011,1893\n1011,1939\n1011,1962\n1011,1968\n1011,1985\n1011,1992\n1011,2006\n1011,2037\n1011,2083\n1011,2105\n1011,2191\n1011,2205\n1011,2210\n1011,2228\n1011,2244\n1011,2253\n1011,2286\n1011,2296\n1011,2310\n1011,2312\n1011,2334\n1011,2379\n1011,2421\n1011,2452\n1011,2512\n1011,2557\n1011,2590\n1011,2605\n1011,2620\n1011,2775\n1011,2784\n1011,2979\n1011,3069\n1011,3094\n1011,3115\n1011,3182\n1011,3258\n1011,3367\n1011,3392\n1011,3422\n1011,3474\n1011,3538\n1011,3623\n1011,3820\n1011,3999\n1011,4234\n1011,4237\n1011,4276\n1011,4355\n1011,4771\n1011,5213\n1011,5326\n1011,5385\n1011,5388\n1011,5405\n1011,5662\n1011,5718\n1011,6068\n1011,6119\n1011,6689\n1011,6955\n1011,7968\n1011,8132\n1011,8276\n1011,13207\n1011,13361\n1011,13980\n1011,15397\n1011,16503\n1011,16659\n1011,18732\n1011,19010\n1011,20736\n1011,21442\n1011,24838\n1011,26414\n1011,29714\n1011,32630\n1011,32731\n1011,32819\n1011,33298\n1011,33424\n1011,33622\n1011,35397\n1011,41051\n1011,41230\n1011,44725\n1011,47010\n1011,47013\n1011,47045\n1011,49341\n1011,57354\n1011,60576\n1011,75196\n1011,75912\n1011,76704\n1011,81233\n1011,92476\n1011,115474\n1011,118950\n1011,156379\n1011,162599\n1011,173625\n1011,245910\n1011,254264\n1012,41\n1012,42\n1012,167\n1012,299\n1012,356\n1012,673\n1012,715\n1012,1010\n1012,1012\n1012,1013\n1012,1177\n1012,1241\n1012,1435\n1012,1849\n1012,1867\n1012,1899\n1012,2208\n1012,2222\n1012,2480\n1012,2557\n1012,3582\n1012,4240\n1012,4258\n1012,6524\n1012,6711\n1012,7757\n1012,8193\n1012,8864\n1012,9025\n1012,13931\n1012,15277\n1012,15424\n1012,28996\n1012,29656\n1012,30505\n1012,31299\n1012,32757\n1012,32784\n1012,32836\n1012,35204\n1012,35545\n1012,40456\n1012,42453\n1012,56629\n1012,58145\n1012,59974\n1012,62886\n1012,64594\n1012,68625\n1012,70395\n1012,78671\n1012,78835\n1012,86791\n1012,91791\n1012,96685\n1012,105525\n1012,105721\n1012,105741\n1012,105744\n1012,106382\n1012,107172\n1012,116596\n1012,133888\n1012,135039\n1012,140785\n1012,143044\n1012,143046\n1012,163359\n1012,164919\n1012,169108\n1012,171036\n1012,183930\n1012,183958\n1012,184796\n1012,185393\n1012,186693\n1012,194491\n1012,203029\n1012,216399\n1012,217836\n1012,233579\n1012,234993\n1012,241007\n1012,241058\n1012,254893\n1012,259506\n1012,260993\n1012,263993\n1013,86\n1013,167\n1013,299\n1013,301\n1013,818\n1013,972\n1013,1010\n1013,1012\n1013,1241\n1013,1479\n1013,1522\n1013,1782\n1013,1849\n1013,2557\n1013,32784\n1013,75912\n1014,20\n1014,34\n1014,35\n1014,37\n1014,68\n1014,87\n1014,97\n1014,111\n1014,126\n1014,140\n1014,158\n1014,167\n1014,192\n1014,195\n1014,202\n1014,203\n1014,207\n1014,209\n1014,211\n1014,217\n1014,227\n1014,240\n1014,248\n1014,252\n1014,256\n1014,259\n1014,261\n1014,264\n1014,278\n1014,292\n1014,299\n1014,301\n1014,312\n1014,314\n1014,333\n1014,336\n1014,349\n1014,356\n1014,366\n1014,388\n1014,390\n1014,392\n1014,393\n1014,406\n1014,433\n1014,435\n1014,439\n1014,441\n1014,442\n1014,452\n1014,455\n1014,457\n1014,479\n1014,497\n1014,500\n1014,505\n1014,510\n1014,516\n1014,534\n1014,536\n1014,572\n1014,577\n1014,586\n1014,588\n1014,589\n1014,590\n1014,604\n1014,615\n1014,622\n1014,631\n1014,663\n1014,668\n1014,673\n1014,676\n1014,677\n1014,697\n1014,713\n1014,764\n1014,779\n1014,784\n1014,794\n1014,801\n1014,808\n1014,809\n1014,818\n1014,838\n1014,843\n1014,849\n1014,900\n1014,903\n1014,911\n1014,918\n1014,920\n1014,972\n1014,973\n1014,991\n1014,992\n1014,1010\n1014,1011\n1014,1014\n1014,1017\n1014,1021\n1014,1048\n1014,1072\n1014,1085\n1014,1089\n1014,1109\n1014,1118\n1014,1127\n1014,1130\n1014,1133\n1014,1147\n1014,1151\n1014,1167\n1014,1172\n1014,1179\n1014,1181\n1014,1191\n1014,1204\n1014,1210\n1014,1240\n1014,1243\n1014,1267\n1014,1284\n1014,1285\n1014,1293\n1014,1309\n1014,1326\n1014,1345\n1014,1368\n1014,1370\n1014,1381\n1014,1402\n1014,1411\n1014,1417\n1014,1419\n1014,1434\n1014,1436\n1014,1445\n1014,1454\n1014,1459\n1014,1462\n1014,1464\n1014,1466\n1014,1515\n1014,1518\n1014,1522\n1014,1531\n1014,1544\n1014,1566\n1014,1572\n1014,1603\n1014,1623\n1014,1634\n1014,1655\n1014,1659\n1014,1663\n1014,1688\n1014,1722\n1014,1724\n1014,1782\n1014,1796\n1014,1837\n1014,1844\n1014,1849\n1014,1891\n1014,1893\n1014,1916\n1014,1992\n1014,2209\n1014,2253\n1014,2286\n1014,2373\n1014,2512\n1014,2556\n1014,2557\n1014,2605\n1014,2903\n1014,2979\n1014,2991\n1014,3182\n1014,3260\n1014,3318\n1014,3392\n1014,3507\n1014,3538\n1014,3609\n1014,3804\n1014,3857\n1014,4165\n1014,4276\n1014,4315\n1014,4532\n1014,4769\n1014,4771\n1014,5129\n1014,5161\n1014,5351\n1014,5467\n1014,6119\n1014,6427\n1014,6452\n1014,6726\n1014,6814\n1014,6837\n1014,6861\n1014,6891\n1014,6955\n1014,6970\n1014,7024\n1014,7076\n1014,7718\n1014,7862\n1014,8261\n1014,8537\n1014,9579\n1014,13207\n1014,13661\n1014,13771\n1014,14354\n1014,14674\n1014,17151\n1014,18013\n1014,18298\n1014,18434\n1014,19413\n1014,19592\n1014,19798\n1014,20788\n1014,22296\n1014,24656\n1014,24934\n1014,25662\n1014,26326\n1014,26450\n1014,26632\n1014,26849\n1014,28203\n1014,29595\n1014,30344\n1014,30899\n1014,31781\n1014,32819\n1014,38888\n1014,39618\n1014,39621\n1014,41230\n1014,43330\n1014,46775\n1014,49026\n1014,50430\n1014,51218\n1014,51994\n1014,52016\n1014,52021\n1014,52524\n1014,53158\n1014,53478\n1014,54131\n1014,55479\n1014,56612\n1014,59083\n1014,61089\n1014,75912\n1014,76086\n1014,91678\n1014,106815\n1014,112410\n1014,112807\n1014,114518\n1014,115222\n1014,115474\n1014,118336\n1014,127726\n1014,129908\n1014,130341\n1014,131821\n1014,144002\n1014,145513\n1014,146364\n1014,146468\n1014,148678\n1014,155977\n1014,161488\n1014,163332\n1014,164375\n1014,170632\n1014,171232\n1014,172493\n1014,172531\n1014,175917\n1014,175933\n1014,176011\n1014,177835\n1014,181942\n1014,181956\n1014,189544\n1014,211918\n1014,215276\n1014,216170\n1014,221118\n1014,224796\n1014,240867\n1014,240869\n1014,241658\n1014,243269\n1014,247739\n1014,253189\n1014,255703\n1014,263190\n1015,107\n1015,483\n1016,200\n1016,227\n1016,254\n1016,267\n1016,298\n1016,502\n1016,557\n1016,588\n1016,590\n1016,612\n1016,636\n1016,704\n1016,715\n1016,772\n1016,805\n1016,932\n1016,1016\n1016,1119\n1016,1212\n1016,1282\n1016,1285\n1016,1402\n1016,1505\n1016,1623\n1016,1739\n1016,1888\n1016,2205\n1016,2206\n1016,2210\n1016,3001\n1016,3085\n1016,4054\n1016,4237\n1016,5011\n1016,6656\n1016,6908\n1016,7619\n1016,8275\n1016,11173\n1016,12747\n1016,15746\n1016,15768\n1016,18000\n1016,18965\n1016,21495\n1016,25652\n1016,28191\n1016,29110\n1016,33424\n1016,34778\n1016,34951\n1016,37741\n1016,42792\n1016,43332\n1016,43778\n1016,45516\n1016,46874\n1016,46883\n1016,46957\n1016,48135\n1016,48146\n1016,48760\n1016,48764\n1016,48794\n1016,49286\n1016,52124\n1016,52623\n1016,53060\n1016,55163\n1016,58472\n1016,59043\n1016,61546\n1016,62982\n1016,73209\n1016,83899\n1016,87983\n1016,97406\n1016,98491\n1016,100943\n1016,100944\n1016,100973\n1016,100985\n1016,102170\n1016,102717\n1016,106438\n1016,106449\n1016,134284\n1016,134984\n1016,140919\n1016,152958\n1016,158082\n1016,158084\n1016,160065\n1016,160450\n1016,176373\n1016,176883\n1016,178762\n1016,180954\n1016,182162\n1016,183392\n1016,207051\n1016,215414\n1016,220939\n1016,234870\n1016,244763\n1016,244766\n1016,245910\n1016,256802\n1016,261957\n1016,264491\n1017,344\n1017,838\n1018,772\n1018,15807\n1019,54\n1019,182\n1019,222\n1019,240\n1019,278\n1019,283\n1019,313\n1019,327\n1019,397\n1019,455\n1019,466\n1019,467\n1019,536\n1019,657\n1019,677\n1019,814\n1019,951\n1019,997\n1019,1011\n1019,1014\n1019,1019\n1019,1020\n1019,1140\n1019,1313\n1019,1433\n1019,1467\n1019,1525\n1019,1539\n1019,1678\n1019,1916\n1019,2173\n1019,2302\n1019,2322\n1019,2348\n1019,2421\n1019,2424\n1019,2517\n1019,2784\n1019,4007\n1019,4377\n1019,5228\n1019,5569\n1019,5646\n1019,5657\n1019,5670\n1019,5702\n1019,5758\n1019,6032\n1019,6754\n1019,7087\n1019,7145\n1019,7344\n1019,7698\n1019,7768\n1019,7880\n1019,8558\n1019,8770\n1019,13136\n1019,13328\n1019,13624\n1019,14358\n1019,14499\n1019,14922\n1019,15548\n1019,16190\n1019,16191\n1019,16915\n1019,17837\n1019,18165\n1019,18357\n1019,18422\n1019,18627\n1019,18650\n1019,18962\n1019,19211\n1019,19546\n1019,20603\n1019,20747\n1019,20822\n1019,21202\n1019,21207\n1019,21233\n1019,21405\n1019,21561\n1019,21677\n1019,22099\n1019,22218\n1019,22254\n1019,23147\n1019,23695\n1019,24558\n1019,24684\n1019,25068\n1019,25670\n1019,28147\n1019,28169\n1019,28305\n1019,29177\n1019,29595\n1019,30502\n1019,30506\n1019,30700\n1019,31397\n1019,31474\n1019,31729\n1019,31801\n1019,31903\n1019,32533\n1019,32589\n1019,32689\n1019,33508\n1019,37852\n1019,39537\n1019,39618\n1019,40500\n1019,40553\n1019,40829\n1019,41333\n1019,42035\n1019,43383\n1019,44135\n1019,44949\n1019,46431\n1019,48283\n1019,48515\n1019,48951\n1019,49154\n1019,49337\n1019,49642\n1019,50046\n1019,50816\n1019,51652\n1019,53927\n1019,54484\n1019,54571\n1019,54581\n1019,56584\n1019,58771\n1019,59058\n1019,60442\n1019,61116\n1019,61991\n1019,63068\n1019,63081\n1019,63458\n1019,63901\n1019,65767\n1019,65965\n1019,66703\n1019,66885\n1019,67391\n1019,67962\n1019,68068\n1019,68227\n1019,68245\n1019,70106\n1019,70295\n1019,70395\n1019,74220\n1019,75019\n1019,75094\n1019,75376\n1019,77098\n1019,77812\n1019,79535\n1019,79936\n1019,79982\n1019,82313\n1019,82715\n1019,82718\n1019,82779\n1019,82922\n1019,83630\n1019,83745\n1019,83927\n1019,90132\n1019,90403\n1019,91340\n1019,91906\n1019,94221\n1019,96718\n1019,96913\n1019,97934\n1019,99107\n1019,99111\n1019,104228\n1019,112853\n1019,112908\n1019,112916\n1019,112964\n1019,113094\n1019,113277\n1019,113496\n1019,113836\n1019,115253\n1019,116128\n1019,117076\n1019,119854\n1019,121623\n1019,123999\n1019,125907\n1019,127158\n1019,131216\n1019,131224\n1019,131497\n1019,136483\n1019,139439\n1019,140055\n1019,140693\n1019,143500\n1019,143724\n1019,145694\n1019,146114\n1019,148101\n1019,153906\n1019,157721\n1019,158788\n1019,159386\n1019,163598\n1019,164389\n1019,169947\n1019,170005\n1019,171255\n1019,171799\n1019,173361\n1019,176042\n1019,182538\n1019,183760\n1019,184007\n1019,186648\n1019,187312\n1019,190451\n1019,198802\n1019,206355\n1019,211817\n1019,215722\n1019,216573\n1019,216852\n1019,232044\n1019,232245\n1019,236790\n1019,239290\n1019,255884\n1019,262521\n1021,313\n1021,352\n1021,397\n1021,452\n1021,481\n1021,668\n1021,684\n1021,685\n1021,838\n1021,842\n1021,849\n1021,911\n1021,985\n1021,1021\n1021,1022\n1021,1085\n1021,1096\n1021,1118\n1021,1130\n1021,1135\n1021,1345\n1021,1394\n1021,1434\n1021,1504\n1021,1559\n1021,1696\n1021,1844\n1021,1848\n1021,1928\n1021,2209\n1021,2373\n1021,3465\n1021,3507\n1021,3537\n1021,3555\n1021,4013\n1021,4701\n1021,4998\n1021,5213\n1021,5356\n1021,6405\n1021,9739\n1021,10559\n1021,13282\n1021,13383\n1021,14016\n1021,14489\n1021,14510\n1021,14596\n1021,14620\n1021,14628\n1021,18091\n1021,18097\n1021,18106\n1021,18198\n1021,18512\n1021,21167\n1021,21222\n1021,23357\n1021,25360\n1021,25431\n1021,25538\n1021,26090\n1021,26928\n1021,28825\n1021,29433\n1021,30998\n1021,32227\n1021,33287\n1021,33328\n1021,34119\n1021,35382\n1021,37474\n1021,37608\n1021,40511\n1021,41843\n1021,42543\n1021,45489\n1021,48505\n1021,48876\n1021,48912\n1021,53983\n1021,54390\n1021,58238\n1021,58247\n1021,58424\n1021,59753\n1021,59886\n1021,60160\n1021,62858\n1021,66059\n1021,66508\n1021,66520\n1021,66563\n1021,67082\n1021,67950\n1021,69884\n1021,75190\n1021,79269\n1021,86677\n1021,90082\n1021,90619\n1021,92898\n1021,94121\n1021,94238\n1021,100209\n1021,101493\n1021,101652\n1021,102413\n1021,102453\n1021,102537\n1021,103279\n1021,103813\n1021,106514\n1021,107421\n1021,109403\n1021,113110\n1021,115212\n1021,118861\n1021,119455\n1021,122254\n1021,122557\n1021,129233\n1021,135962\n1021,140316\n1021,140646\n1021,142472\n1021,146012\n1021,147048\n1021,148844\n1021,153118\n1021,153537\n1021,154976\n1021,157291\n1021,158576\n1021,164378\n1021,165246\n1021,167194\n1021,168766\n1021,171544\n1021,173369\n1021,173659\n1021,174330\n1021,174357\n1021,175305\n1021,176877\n1021,177382\n1021,180300\n1021,182530\n1021,183720\n1021,183740\n1021,184780\n1021,191903\n1021,195158\n1021,204093\n1021,213050\n1021,214814\n1021,216236\n1021,217603\n1021,221655\n1021,228934\n1021,229070\n1021,230241\n1021,230912\n1021,234675\n1021,241635\n1021,243170\n1021,245837\n1021,248399\n1021,251278\n1021,254810\n1021,256250\n1021,259564\n1021,259638\n1021,259640\n1021,259642\n1021,264328\n1022,911\n1023,22\n1023,50\n1023,163\n1023,209\n1023,302\n1023,489\n1023,579\n1023,687\n1023,809\n1023,811\n1023,818\n1023,838\n1023,861\n1023,893\n1023,1188\n1023,1191\n1023,1210\n1023,1556\n1023,1659\n1023,1893\n1023,2017\n1023,2116\n1023,2312\n1023,3177\n1023,3653\n1023,3769\n1023,4294\n1023,4453\n1023,127158\n1023,258973\n1024,509\n1025,292\n1025,338\n1025,462\n1025,509\n1025,1238\n1025,1453\n1025,1572\n1025,1722\n1025,150022\n1026,390\n1026,567\n1026,589\n1026,685\n1026,973\n1026,1436\n1026,1559\n1026,1801\n1026,3392\n1026,5591\n1026,20535\n1027,106\n1027,333\n1027,505\n1027,586\n1027,812\n1027,1027\n1027,1293\n1027,1441\n1027,1848\n1027,1849\n1027,1985\n1027,2782\n1027,5630\n1027,6667\n1027,7087\n1027,7731\n1027,13931\n1027,14066\n1027,14100\n1027,18456\n1027,30544\n1027,31046\n1027,61784\n1027,63423\n1027,72548\n1027,77770\n1027,87540\n1027,99538\n1027,99542\n1027,100237\n1027,102423\n1027,104268\n1027,109922\n1027,119418\n1027,126794\n1027,133672\n1027,152118\n1027,155471\n1027,174800\n1027,184740\n1027,191822\n1027,191834\n1027,191961\n1027,207240\n1027,223960\n1027,232959\n1027,234887\n1027,236573\n1028,859\n1029,332\n1029,1001\n1029,1955\n1030,707\n1031,1\n1031,94\n1031,184\n1031,206\n1031,2787\n1032,919\n1033,1\n1033,20\n1033,147\n1033,178\n1033,195\n1033,267\n1033,314\n1033,315\n1033,327\n1033,346\n1033,434\n1033,435\n1033,439\n1033,440\n1033,447\n1033,515\n1033,538\n1033,599\n1033,621\n1033,622\n1033,663\n1033,671\n1033,676\n1033,693\n1033,766\n1033,779\n1033,794\n1033,903\n1033,934\n1033,996\n1033,1011\n1033,1033\n1033,1034\n1033,1045\n1033,1067\n1033,1068\n1033,1103\n1033,1179\n1033,1294\n1033,1298\n1033,1381\n1033,1474\n1033,1515\n1033,1590\n1033,1644\n1033,1651\n1033,1789\n1033,1791\n1033,1877\n1033,2023\n1033,2085\n1033,2102\n1033,2348\n1033,2352\n1033,2400\n1033,2710\n1033,3247\n1033,3403\n1033,3552\n1033,3924\n1033,4137\n1033,4188\n1033,4298\n1033,4354\n1033,4368\n1033,4426\n1033,4588\n1033,4646\n1033,4666\n1033,5108\n1033,5678\n1033,6638\n1033,6654\n1033,6661\n1033,6801\n1033,6966\n1033,6982\n1033,7032\n1033,7040\n1033,7321\n1033,8132\n1033,8374\n1033,14111\n1033,14186\n1033,14225\n1033,14233\n1033,14378\n1033,14428\n1033,15141\n1033,15355\n1033,15553\n1033,15737\n1033,16605\n1033,17045\n1033,17302\n1033,17421\n1033,17723\n1033,17904\n1033,18416\n1033,18733\n1033,19182\n1033,19191\n1033,19506\n1033,19835\n1033,20341\n1033,20598\n1033,20757\n1033,21081\n1033,21635\n1033,22385\n1033,23071\n1033,23337\n1033,23349\n1033,23467\n1033,25038\n1033,28354\n1033,28794\n1033,29116\n1033,29649\n1033,31300\n1033,32468\n1033,32721\n1033,32801\n1033,35661\n1033,36037\n1033,36634\n1033,36713\n1033,36737\n1033,36915\n1033,38158\n1033,38871\n1033,40713\n1033,40924\n1033,41284\n1033,42815\n1033,43196\n1033,44791\n1033,44917\n1033,45719\n1033,45890\n1033,46838\n1033,46844\n1033,47113\n1033,47137\n1033,47412\n1033,48290\n1033,48343\n1033,48346\n1033,48347\n1033,48351\n1033,48356\n1033,48359\n1033,48363\n1033,49470\n1033,49548\n1033,50034\n1033,54808\n1033,55564\n1033,56637\n1033,58139\n1033,59663\n1033,62195\n1033,62416\n1033,63255\n1033,68887\n1033,69710\n1033,70667\n1033,70900\n1033,73361\n1033,74760\n1033,78887\n1033,78922\n1033,78940\n1033,79368\n1033,79516\n1033,80394\n1033,80662\n1033,81787\n1033,83947\n1033,84563\n1033,84634\n1033,85744\n1033,86574\n1033,87813\n1033,88082\n1033,88615\n1033,90191\n1033,92871\n1033,92959\n1033,93573\n1033,97511\n1033,98194\n1033,99694\n1033,100060\n1033,102572\n1033,102612\n1033,103251\n1033,103772\n1033,104161\n1033,106396\n1033,106404\n1033,107210\n1033,109885\n1033,110133\n1033,111059\n1033,114220\n1033,116095\n1033,116791\n1033,117678\n1033,117764\n1033,117781\n1033,117974\n1033,118089\n1033,118101\n1033,120155\n1033,122165\n1033,122225\n1033,122657\n1033,123833\n1033,125020\n1033,126519\n1033,126696\n1033,127419\n1033,127855\n1033,128123\n1033,128239\n1033,129737\n1033,130320\n1033,130638\n1033,131295\n1033,135310\n1033,141137\n1033,145066\n1033,146674\n1033,149137\n1033,152596\n1033,158970\n1033,164262\n1033,164981\n1033,166432\n1033,168784\n1033,168886\n1033,169386\n1033,169931\n1033,170669\n1033,174461\n1033,175321\n1033,175343\n1033,176336\n1033,176456\n1033,176457\n1033,176458\n1033,178909\n1033,179781\n1033,179793\n1033,182431\n1033,182485\n1033,186107\n1033,187106\n1033,189128\n1033,189754\n1033,189898\n1033,189921\n1033,191164\n1033,191190\n1033,191201\n1033,191797\n1033,191937\n1033,191950\n1033,192077\n1033,197472\n1033,205749\n1033,213045\n1033,214094\n1033,216770\n1033,219969\n1033,224499\n1033,228888\n1033,236593\n1033,236700\n1033,236814\n1033,238202\n1033,239613\n1033,240108\n1033,243165\n1033,243940\n1033,248483\n1033,250550\n1033,250575\n1033,250689\n1033,253099\n1033,254200\n1033,255505\n1033,258069\n1033,261043\n1033,262699\n1034,1033\n1035,640\n1036,640\n1037,1293\n1038,1039\n1038,29187\n1038,100147\n1038,111964\n1040,666\n1041,795\n1042,1043\n1043,3\n1043,106\n1043,292\n1043,312\n1043,499\n1043,509\n1043,510\n1043,575\n1043,623\n1043,723\n1043,745\n1043,843\n1043,852\n1043,872\n1043,875\n1043,1042\n1043,1043\n1043,1345\n1043,1424\n1043,1765\n1043,1805\n1043,1896\n1043,3003\n1043,3367\n1043,3546\n1043,4722\n1043,4760\n1043,5043\n1043,5846\n1043,6407\n1043,8391\n1043,8428\n1043,14025\n1043,20591\n1043,22806\n1043,23567\n1043,31010\n1043,31080\n1043,34747\n1043,46947\n1043,48505\n1043,68856\n1043,71184\n1043,78932\n1043,82706\n1043,94963\n1043,96228\n1043,107203\n1043,110777\n1043,136043\n1043,154862\n1043,155357\n1043,214013\n1043,253347\n1044,393\n1044,980\n1045,30\n1045,104\n1045,215\n1045,292\n1045,309\n1045,310\n1045,328\n1045,338\n1045,372\n1045,441\n1045,442\n1045,444\n1045,510\n1045,534\n1045,599\n1045,609\n1045,622\n1045,626\n1045,697\n1045,779\n1045,783\n1045,862\n1045,873\n1045,943\n1045,968\n1045,1001\n1045,1033\n1045,1046\n1045,1085\n1045,1179\n1045,1238\n1045,1284\n1045,1285\n1045,1293\n1045,1305\n1045,1411\n1045,1522\n1045,1688\n1045,2083\n1045,2209\n1045,2443\n1045,3474\n1045,4771\n1045,5662\n1045,8180\n1045,32751\n1045,127158\n1045,213953\n1046,299\n1046,441\n1046,444\n1046,609\n1046,966\n1046,1045\n1046,1046\n1046,1085\n1046,1572\n1046,1688\n1046,1944\n1046,4308\n1046,5388\n1046,25022\n1046,85829\n1047,160\n1048,366\n1048,500\n1048,760\n1048,1149\n1049,163\n1049,344\n1049,626\n1049,733\n1049,752\n1049,1579\n1049,3695\n1050,945\n1050,5714\n1051,1052\n1052,58\n1052,87\n1052,111\n1052,135\n1052,222\n1052,292\n1052,294\n1052,328\n1052,420\n1052,431\n1052,557\n1052,596\n1052,733\n1052,784\n1052,805\n1052,808\n1052,1052\n1052,1298\n1052,1368\n1052,1623\n1052,1707\n1052,2373\n1052,2416\n1052,2417\n1052,4039\n1052,4066\n1053,920\n1054,805\n1055,671\n1057,1058\n1058,160\n1058,225\n1058,287\n1058,292\n1058,420\n1058,462\n1058,491\n1058,535\n1058,745\n1058,818\n1058,849\n1058,852\n1058,872\n1058,911\n1058,992\n1058,1058\n1058,1087\n1058,1130\n1058,1572\n1058,1653\n1058,1688\n1058,1707\n1058,2253\n1058,2310\n1058,2436\n1058,4039\n1058,127158\n1059,775\n1060,626\n1060,775\n1061,372\n1061,1285\n1061,7395\n1061,14597\n1061,175903\n1061,187195\n1061,189149\n1062,48\n1062,140\n1062,264\n1062,338\n1062,710\n1062,1052\n1062,1127\n1062,1147\n1062,1289\n1062,1893\n1063,119\n1063,366\n1064,326\n1064,579\n1064,589\n1065,980\n1065,1332\n1065,1955\n1066,536\n1066,697\n1067,1068\n1068,20\n1068,272\n1068,315\n1068,346\n1068,439\n1068,447\n1068,726\n1068,996\n1068,1033\n1068,1067\n1068,1068\n1068,1294\n1068,1474\n1068,1612\n1068,1789\n1068,1990\n1068,2030\n1068,2085\n1068,2094\n1068,2253\n1068,2255\n1068,2358\n1068,3831\n1068,3903\n1068,3990\n1068,5212\n1068,6607\n1068,6966\n1068,7040\n1068,7532\n1068,13374\n1068,13563\n1068,13636\n1068,15148\n1068,15563\n1068,18507\n1068,22333\n1068,23544\n1068,23563\n1068,24906\n1068,27511\n1068,29116\n1068,29760\n1068,31195\n1068,32538\n1068,45073\n1068,45723\n1068,46929\n1068,50034\n1068,63425\n1068,73404\n1068,85913\n1068,90933\n1068,96789\n1068,97647\n1068,120052\n1068,120155\n1068,121657\n1068,122562\n1068,128831\n1068,129891\n1068,134081\n1068,143333\n1068,145051\n1068,145085\n1068,145088\n1068,157331\n1068,157858\n1068,176949\n1068,189128\n1068,190492\n1068,213950\n1068,217420\n1068,245025\n1068,247224\n1068,247358\n1068,247511\n1068,250586\n1069,217\n1069,222\n1069,344\n1069,455\n1069,536\n1069,657\n1069,660\n1069,694\n1069,949\n1069,1072\n1069,1201\n1069,1881\n1069,2319\n1069,2779\n1069,2784\n1069,5343\n1069,6506\n1069,212914\n1070,10\n1070,259\n1070,393\n1070,439\n1070,446\n1070,577\n1070,599\n1070,685\n1070,726\n1070,788\n1070,794\n1070,849\n1070,859\n1070,902\n1070,911\n1070,980\n1070,1070\n1070,1105\n1070,1130\n1070,1388\n1070,1531\n1070,1844\n1070,3724\n1070,4190\n1070,4455\n1070,4545\n1070,7921\n1070,8162\n1070,8250\n1070,9503\n1070,13466\n1070,13610\n1070,15651\n1070,15654\n1070,18493\n1070,18658\n1070,19278\n1070,22168\n1070,25384\n1070,36969\n1070,42611\n1070,45026\n1070,45416\n1070,45983\n1070,46137\n1070,50543\n1070,54493\n1070,56150\n1070,57143\n1070,60575\n1070,63088\n1070,70277\n1070,70859\n1070,74435\n1070,74647\n1070,75755\n1070,80555\n1070,81966\n1070,87191\n1070,89558\n1070,89698\n1070,89708\n1070,94287\n1070,97290\n1070,102659\n1070,104408\n1070,104565\n1070,118272\n1070,120920\n1070,122393\n1070,123811\n1070,123854\n1070,128144\n1070,128222\n1070,128935\n1070,139010\n1070,139560\n1070,140031\n1070,140687\n1070,142385\n1070,144878\n1070,146464\n1070,149221\n1070,152865\n1070,156260\n1070,157681\n1070,159801\n1070,173323\n1070,173591\n1070,174388\n1070,175333\n1070,176324\n1070,177394\n1070,177727\n1070,177799\n1070,179176\n1070,188558\n1070,193578\n1070,193942\n1070,194989\n1070,212488\n1070,216300\n1070,216724\n1070,217442\n1070,218759\n1070,222483\n1070,222582\n1070,226152\n1070,227748\n1070,231024\n1070,232780\n1070,238790\n1070,247770\n1070,249776\n1070,254191\n1071,1072\n1071,3538\n1072,8\n1072,388\n1072,389\n1072,399\n1072,406\n1072,455\n1072,536\n1072,634\n1072,1208\n1072,1467\n1072,1853\n1072,1916\n1072,2133\n1072,2963\n1072,4374\n1072,5451\n1072,7092\n1072,13549\n1072,15562\n1072,17534\n1072,18395\n1072,19443\n1072,20724\n1072,20771\n1072,22158\n1072,23431\n1072,28285\n1072,28946\n1072,30502\n1072,34860\n1072,34904\n1072,35831\n1072,37521\n1072,37572\n1072,37589\n1072,37900\n1072,42592\n1072,49336\n1072,55202\n1072,56679\n1072,59325\n1072,62459\n1072,66000\n1072,67123\n1072,67485\n1072,68796\n1072,68970\n1072,78275\n1072,85927\n1072,87692\n1072,89827\n1072,97908\n1072,101580\n1072,104897\n1072,106930\n1072,117937\n1072,117939\n1072,117977\n1072,118042\n1072,120756\n1072,128503\n1072,128943\n1072,128950\n1072,129770\n1072,131335\n1072,139542\n1072,149909\n1072,149910\n1072,151373\n1072,169872\n1072,169957\n1072,172376\n1072,173390\n1072,203900\n1072,246156\n1073,510\n1073,795\n1073,3804\n1074,83\n1074,477\n1074,2168\n1074,2553\n1074,13137\n1074,23287\n1075,439\n1076,347\n1077,1078\n1077,4223\n1078,111\n1078,2105\n1078,2253\n1078,4039\n1078,4223\n1079,671\n1080,41\n1080,261\n1080,596\n1080,784\n1080,805\n1080,1119\n1080,1285\n1080,1368\n1080,1429\n1080,1462\n1080,1635\n1080,1888\n1080,8537\n1080,9015\n1081,372\n1081,390\n1081,1082\n1081,1522\n1082,240\n1082,289\n1082,290\n1082,372\n1082,390\n1082,715\n1082,784\n1082,1061\n1082,1081\n1082,1082\n1082,1133\n1082,1203\n1082,1309\n1082,1359\n1082,1807\n1082,1888\n1082,1955\n1082,2315\n1082,2512\n1082,2657\n1082,2775\n1082,3623\n1082,3931\n1082,4115\n1082,4182\n1082,5186\n1082,5804\n1082,5825\n1082,6004\n1082,7087\n1082,8592\n1082,9112\n1082,12871\n1082,13506\n1082,13698\n1082,14597\n1082,16308\n1082,16466\n1082,16497\n1082,16509\n1082,17152\n1082,17878\n1082,17930\n1082,20624\n1082,20791\n1082,24478\n1082,25622\n1082,26781\n1082,26869\n1082,28191\n1082,30288\n1082,31036\n1082,31677\n1082,32474\n1082,33901\n1082,34340\n1082,34345\n1082,34347\n1082,34351\n1082,34403\n1082,34423\n1082,34426\n1082,34774\n1082,35945\n1082,40122\n1082,40330\n1082,44123\n1082,45407\n1082,55169\n1082,56261\n1082,56262\n1082,56263\n1082,56265\n1082,56270\n1082,56276\n1082,56279\n1082,56281\n1082,56282\n1082,56283\n1082,56284\n1082,56318\n1082,56537\n1082,56670\n1082,56746\n1082,56947\n1082,56986\n1082,56990\n1082,58503\n1082,59951\n1082,60094\n1082,64315\n1082,76939\n1082,79404\n1082,79561\n1082,79566\n1082,80151\n1082,82051\n1082,82130\n1082,82588\n1082,83987\n1082,84143\n1082,93091\n1082,93206\n1082,94134\n1082,99195\n1082,104318\n1082,105765\n1082,110661\n1082,110664\n1082,110669\n1082,110671\n1082,110674\n1082,110675\n1082,110676\n1082,110677\n1082,111037\n1082,111044\n1082,111045\n1082,111046\n1082,111047\n1082,111048\n1082,111049\n1082,111050\n1082,111051\n1082,123007\n1082,125380\n1082,126862\n1082,126868\n1082,126869\n1082,126870\n1082,126871\n1082,126875\n1082,126877\n1082,126882\n1082,126898\n1082,126900\n1082,137134\n1082,140657\n1082,155467\n1082,158978\n1082,159759\n1082,160450\n1082,166394\n1082,170691\n1082,174341\n1082,175903\n1082,183366\n1082,190957\n1082,195149\n1082,195482\n1082,205730\n1082,214222\n1082,224588\n1082,224755\n1082,224764\n1082,225298\n1082,225302\n1082,226242\n1082,226456\n1082,229310\n1082,230008\n1082,232062\n1082,232063\n1082,232065\n1082,232066\n1082,232067\n1082,232068\n1082,232070\n1082,232071\n1082,232072\n1082,232073\n1082,232075\n1082,232076\n1082,233565\n1082,236000\n1082,243898\n1082,243948\n1082,244778\n1082,249750\n1082,254914\n1082,255608\n1082,263829\n1083,459\n1083,750\n1083,783\n1083,1117\n1083,1313\n1083,1319\n1084,808\n1084,48505\n1085,10\n1085,34\n1085,35\n1085,41\n1085,68\n1085,94\n1085,104\n1085,111\n1085,167\n1085,175\n1085,186\n1085,202\n1085,207\n1085,217\n1085,233\n1085,240\n1085,289\n1085,290\n1085,294\n1085,298\n1085,299\n1085,301\n1085,314\n1085,327\n1085,328\n1085,332\n1085,356\n1085,372\n1085,389\n1085,390\n1085,392\n1085,397\n1085,406\n1085,417\n1085,425\n1085,431\n1085,439\n1085,440\n1085,446\n1085,457\n1085,467\n1085,510\n1085,516\n1085,534\n1085,535\n1085,536\n1085,589\n1085,590\n1085,592\n1085,596\n1085,599\n1085,626\n1085,631\n1085,677\n1085,693\n1085,715\n1085,765\n1085,775\n1085,818\n1085,838\n1085,849\n1085,852\n1085,862\n1085,872\n1085,911\n1085,949\n1085,953\n1085,973\n1085,992\n1085,1001\n1085,1010\n1085,1011\n1085,1046\n1085,1085\n1085,1118\n1085,1119\n1085,1133\n1085,1172\n1085,1192\n1085,1195\n1085,1213\n1085,1235\n1085,1284\n1085,1326\n1085,1332\n1085,1346\n1085,1417\n1085,1462\n1085,1505\n1085,1518\n1085,1522\n1085,1531\n1085,1545\n1085,1561\n1085,1572\n1085,1580\n1085,1659\n1085,1796\n1085,1844\n1085,1853\n1085,2173\n1085,2184\n1085,2193\n1085,2204\n1085,2296\n1085,2572\n1085,2747\n1085,2874\n1085,2995\n1085,3028\n1085,3093\n1085,3094\n1085,3507\n1085,3565\n1085,3623\n1085,3832\n1085,3833\n1085,3841\n1085,3866\n1085,3937\n1085,3944\n1085,4022\n1085,4213\n1085,4222\n1085,4286\n1085,4308\n1085,4315\n1085,4355\n1085,4520\n1085,4540\n1085,5186\n1085,5278\n1085,5472\n1085,5494\n1085,5543\n1085,5578\n1085,5654\n1085,5717\n1085,5902\n1085,5961\n1085,6004\n1085,6038\n1085,6068\n1085,6139\n1085,6556\n1085,6695\n1085,7017\n1085,7161\n1085,7194\n1085,7268\n1085,7386\n1085,7534\n1085,7819\n1085,7880\n1085,8180\n1085,8276\n1085,8451\n1085,8537\n1085,8867\n1085,9342\n1085,9343\n1085,13207\n1085,13433\n1085,13524\n1085,13637\n1085,13657\n1085,14011\n1085,14411\n1085,14565\n1085,14597\n1085,14603\n1085,15100\n1085,15221\n1085,15259\n1085,15277\n1085,15386\n1085,15413\n1085,15446\n1085,15477\n1085,15658\n1085,15667\n1085,15967\n1085,16191\n1085,16192\n1085,16355\n1085,16428\n1085,16551\n1085,16955\n1085,17116\n1085,17212\n1085,17241\n1085,18433\n1085,18627\n1085,18726\n1085,19525\n1085,19560\n1085,19592\n1085,19594\n1085,19798\n1085,19859\n1085,20190\n1085,20375\n1085,20487\n1085,20560\n1085,20803\n1085,20816\n1085,20880\n1085,21414\n1085,21620\n1085,21706\n1085,21721\n1085,21742\n1085,22291\n1085,23206\n1085,23556\n1085,24803\n1085,25766\n1085,27827\n1085,28182\n1085,28317\n1085,28832\n1085,28886\n1085,29595\n1085,29619\n1085,29633\n1085,29817\n1085,30816\n1085,31110\n1085,31302\n1085,31746\n1085,31756\n1085,31802\n1085,32604\n1085,32692\n1085,33611\n1085,33633\n1085,33695\n1085,33702\n1085,33938\n1085,34062\n1085,34271\n1085,34360\n1085,34830\n1085,34921\n1085,35497\n1085,36015\n1085,36635\n1085,37991\n1085,38356\n1085,38822\n1085,38932\n1085,39142\n1085,39307\n1085,39534\n1085,39746\n1085,40267\n1085,40313\n1085,40690\n1085,40936\n1085,41772\n1085,42029\n1085,42582\n1085,42725\n1085,42810\n1085,43297\n1085,44444\n1085,44951\n1085,45066\n1085,45427\n1085,47947\n1085,48933\n1085,49554\n1085,51666\n1085,51972\n1085,52539\n1085,52676\n1085,52984\n1085,55350\n1085,55792\n1085,56966\n1085,57579\n1085,57939\n1085,61744\n1085,63066\n1085,64026\n1085,64197\n1085,64525\n1085,64592\n1085,65142\n1085,65824\n1085,66554\n1085,66587\n1085,67146\n1085,67210\n1085,67462\n1085,67519\n1085,68955\n1085,70195\n1085,71708\n1085,72677\n1085,73248\n1085,73557\n1085,73570\n1085,74144\n1085,74153\n1085,74822\n1085,75912\n1085,80268\n1085,81508\n1085,82525\n1085,83301\n1085,83940\n1085,84176\n1085,86337\n1085,86836\n1085,87121\n1085,90034\n1085,91488\n1085,92153\n1085,93488\n1085,93691\n1085,93752\n1085,93850\n1085,95301\n1085,95757\n1085,97928\n1085,98445\n1085,99681\n1085,100313\n1085,103432\n1085,103433\n1085,103458\n1085,104536\n1085,104726\n1085,105496\n1085,107004\n1085,107341\n1085,110154\n1085,111430\n1085,112253\n1085,112727\n1085,113066\n1085,113759\n1085,114422\n1085,115479\n1085,117060\n1085,117293\n1085,117480\n1085,118559\n1085,119654\n1085,120157\n1085,121090\n1085,121395\n1085,122172\n1085,123191\n1085,125290\n1085,127158\n1085,127901\n1085,127925\n1085,128222\n1085,128666\n1085,129832\n1085,130054\n1085,133044\n1085,133309\n1085,133364\n1085,134672\n1085,134907\n1085,135060\n1085,135061\n1085,135062\n1085,135738\n1085,135821\n1085,138017\n1085,140497\n1085,145128\n1085,145301\n1085,148052\n1085,148247\n1085,148387\n1085,148426\n1085,152859\n1085,157345\n1085,157502\n1085,158604\n1085,160344\n1085,160387\n1085,161242\n1085,161532\n1085,162049\n1085,162183\n1085,162574\n1085,163780\n1085,165071\n1085,166832\n1085,168436\n1085,168470\n1085,171641\n1085,171893\n1085,172253\n1085,175803\n1085,176551\n1085,176871\n1085,176920\n1085,177111\n1085,177437\n1085,177937\n1085,182603\n1085,185874\n1085,186601\n1085,186866\n1085,188310\n1085,192640\n1085,194013\n1085,194027\n1085,194202\n1085,194481\n1085,194573\n1085,194640\n1085,194883\n1085,199161\n1085,203249\n1085,203582\n1085,212692\n1085,213215\n1085,215450\n1085,215874\n1085,216639\n1085,216967\n1085,218296\n1085,219868\n1085,220265\n1085,220268\n1085,220939\n1085,221024\n1085,221068\n1085,221164\n1085,221176\n1085,224895\n1085,227709\n1085,228841\n1085,229559\n1085,232315\n1085,232483\n1085,233011\n1085,233338\n1085,233493\n1085,234082\n1085,236130\n1085,236611\n1085,237448\n1085,237997\n1085,238002\n1085,238151\n1085,238328\n1085,239953\n1085,240195\n1085,240884\n1085,241174\n1085,242325\n1085,243483\n1085,244789\n1085,245400\n1085,251894\n1085,258647\n1085,259496\n1085,260421\n1085,261490\n1085,261788\n1085,262823\n1085,263308\n1085,265013\n1086,360\n1087,111\n1087,292\n1087,500\n1087,673\n1087,849\n1087,900\n1087,918\n1087,1088\n1087,1118\n1087,1434\n1087,1486\n1087,1559\n1087,1566\n1087,1572\n1087,1722\n1087,3653\n1087,5192\n1087,6573\n1087,6685\n1087,7035\n1087,7303\n1087,15344\n1087,15550\n1087,16561\n1087,21442\n1087,26730\n1087,27100\n1087,31280\n1087,44073\n1087,44962\n1087,48278\n1087,84500\n1087,89720\n1087,89728\n1087,97247\n1087,98092\n1087,113035\n1087,124547\n1087,171202\n1087,178609\n1087,191453\n1087,218850\n1087,219825\n1087,223969\n1087,223999\n1087,228614\n1087,245826\n1087,246999\n1087,258319\n1088,1087\n1089,44\n1089,56\n1089,79\n1089,146\n1089,147\n1089,186\n1089,192\n1089,333\n1089,336\n1089,397\n1089,406\n1089,422\n1089,452\n1089,505\n1089,602\n1089,663\n1089,664\n1089,673\n1089,676\n1089,693\n1089,838\n1089,841\n1089,843\n1089,920\n1089,1011\n1089,1014\n1089,1089\n1089,1163\n1089,1181\n1089,1267\n1089,1417\n1089,1464\n1089,1498\n1089,1619\n1089,1620\n1089,1623\n1089,1689\n1089,1825\n1089,1844\n1089,1993\n1089,2174\n1089,2367\n1089,2373\n1089,2460\n1089,2471\n1089,3370\n1089,3524\n1089,4451\n1089,5495\n1089,5689\n1089,5726\n1089,6119\n1089,6625\n1089,6904\n1089,6976\n1089,7494\n1089,8426\n1089,9510\n1089,12112\n1089,13687\n1089,14389\n1089,14453\n1089,18483\n1089,18997\n1089,19413\n1089,19806\n1089,20402\n1089,21281\n1089,22616\n1089,23517\n1089,23783\n1089,24150\n1089,26080\n1089,26286\n1089,26716\n1089,41796\n1089,44151\n1089,50331\n1089,55594\n1089,55807\n1089,60576\n1089,62852\n1089,62890\n1089,63634\n1089,65809\n1089,67341\n1089,75294\n1089,77020\n1089,78059\n1089,82974\n1089,87448\n1089,88356\n1089,89035\n1089,90158\n1089,90810\n1089,90854\n1089,92476\n1089,93063\n1089,96616\n1089,99017\n1089,101906\n1089,110029\n1089,112526\n1089,112904\n1089,116023\n1089,116278\n1089,118336\n1089,120962\n1089,127393\n1089,127740\n1089,142882\n1089,149327\n1089,151428\n1089,158285\n1089,158356\n1089,162277\n1089,174783\n1089,177926\n1089,179775\n1089,180992\n1089,182464\n1089,188301\n1089,193054\n1089,195285\n1089,195287\n1089,201302\n1089,204124\n1089,207659\n1089,215276\n1089,215874\n1089,216114\n1089,216170\n1089,218456\n1089,225050\n1089,237625\n1089,239408\n1089,247010\n1089,252958\n1089,255085\n1089,263063\n1089,263066\n1089,263071\n1089,263072\n1090,673\n1091,323\n1092,46\n1092,459\n1092,744\n1092,783\n1092,1479\n1093,589\n1093,991\n1093,992\n1094,808\n1095,1096\n1096,97\n1096,186\n1096,685\n1096,693\n1096,911\n1096,1096\n1096,1113\n1096,1118\n1096,1290\n1096,1566\n1096,1612\n1096,1722\n1096,2704\n1096,2874\n1096,3554\n1096,3555\n1096,4190\n1096,5307\n1096,6206\n1096,6624\n1096,6766\n1096,7115\n1096,13424\n1096,13463\n1096,14041\n1096,15383\n1096,16503\n1096,16516\n1096,16531\n1096,18139\n1096,18546\n1096,18643\n1096,20228\n1096,20989\n1096,28294\n1096,30002\n1096,32335\n1096,34020\n1096,34141\n1096,35397\n1096,38907\n1096,40278\n1096,40982\n1096,44482\n1096,45753\n1096,50245\n1096,54712\n1096,54941\n1096,55712\n1096,56936\n1096,57001\n1096,57199\n1096,60357\n1096,62832\n1096,63749\n1096,63755\n1096,64310\n1096,68413\n1096,68732\n1096,75196\n1096,76993\n1096,78251\n1096,83482\n1096,84756\n1096,105516\n1096,106764\n1096,110713\n1096,111202\n1096,111442\n1096,114461\n1096,120603\n1096,121201\n1096,125820\n1096,131133\n1096,135742\n1096,139914\n1096,140389\n1096,146058\n1096,146281\n1096,146285\n1096,150768\n1096,162930\n1096,166025\n1096,166981\n1096,167510\n1096,167512\n1096,167513\n1096,167514\n1096,167515\n1096,175447\n1096,177588\n1096,179524\n1096,184849\n1096,192411\n1096,206858\n1096,207659\n1096,213059\n1096,225339\n1096,228377\n1096,229185\n1096,232654\n1096,233149\n1096,233347\n1096,243113\n1096,247443\n1096,250200\n1096,250205\n1096,250206\n1096,250207\n1096,255469\n1096,256221\n1096,261541\n1097,120\n1097,338\n1097,392\n1097,1118\n1097,1240\n1097,1465\n1098,305\n1099,79\n1100,772\n1101,296\n1101,323\n1101,479\n1101,991\n1101,1052\n1101,1102\n1101,1579\n1101,1659\n1102,1102\n1103,1033\n1104,1001\n1105,577\n1105,693\n1105,726\n1105,788\n1105,859\n1105,1105\n1105,1106\n1105,1388\n1105,1429\n1105,2024\n1105,2362\n1105,3815\n1105,4297\n1105,5782\n1105,5795\n1105,6477\n1105,6796\n1105,7109\n1105,7811\n1105,13405\n1105,14090\n1105,18516\n1105,18534\n1105,18559\n1105,22835\n1105,23236\n1105,24533\n1105,26233\n1105,29021\n1105,29811\n1105,39549\n1105,40698\n1105,44295\n1105,44894\n1105,45412\n1105,46475\n1105,48412\n1105,52523\n1105,54493\n1105,55904\n1105,57143\n1105,63077\n1105,67395\n1105,80226\n1105,83199\n1105,87856\n1105,89558\n1105,94771\n1105,95477\n1105,109583\n1105,110608\n1105,110624\n1105,110687\n1105,111073\n1105,113879\n1105,115965\n1105,117702\n1105,117997\n1105,118892\n1105,118894\n1105,118990\n1105,119013\n1105,119043\n1105,119124\n1105,121086\n1105,121620\n1105,121624\n1105,124444\n1105,127740\n1105,130438\n1105,130452\n1105,130454\n1105,130802\n1105,136593\n1105,136801\n1105,138686\n1105,141814\n1105,143479\n1105,146846\n1105,148437\n1105,152448\n1105,152552\n1105,154442\n1105,155075\n1105,155492\n1105,156844\n1105,157680\n1105,158630\n1105,176118\n1105,186682\n1105,186687\n1105,216714\n1105,228221\n1107,337\n1107,500\n1107,505\n1108,184\n1109,140\n1109,710\n1109,1014\n1109,1968\n1110,718\n1111,126\n1111,462\n1111,872\n1111,931\n1111,1127\n1111,1659\n1111,4039\n1112,772\n1113,10\n1113,71\n1113,102\n1113,175\n1113,292\n1113,388\n1113,408\n1113,446\n1113,518\n1113,685\n1113,693\n1113,900\n1113,911\n1113,1096\n1113,1113\n1113,1323\n1113,1326\n1113,1345\n1113,1793\n1113,1848\n1113,2460\n1113,2634\n1113,3193\n1113,3407\n1113,5307\n1113,6638\n1113,7959\n1113,9379\n1113,14512\n1113,14572\n1113,18097\n1113,19367\n1113,19421\n1113,19688\n1113,21257\n1113,29817\n1113,29875\n1113,31122\n1113,31221\n1113,37534\n1113,39696\n1113,42082\n1113,48505\n1113,49151\n1113,62816\n1113,63179\n1113,68913\n1113,78746\n1113,87871\n1113,94063\n1113,95386\n1113,108066\n1113,112681\n1113,113513\n1113,118978\n1113,119016\n1113,128787\n1113,132846\n1113,143993\n1113,163304\n1113,163450\n1113,166435\n1113,168837\n1113,169811\n1113,173812\n1113,174401\n1113,174755\n1113,179238\n1113,182788\n1113,183098\n1113,191216\n1113,194246\n1113,194247\n1113,194966\n1113,212991\n1113,213365\n1113,235880\n1113,243424\n1113,252380\n1113,255251\n1114,273\n1114,274\n1114,313\n1115,1116\n1116,1115\n1116,2460\n1116,3513\n1116,4468\n1116,6101\n1116,7474\n1116,13769\n1116,26617\n1116,34601\n1116,39010\n1116,43869\n1116,49905\n1116,51185\n1116,60862\n1116,83222\n1116,86144\n1116,87389\n1116,90904\n1116,95136\n1116,106312\n1116,114928\n1116,120102\n1116,121578\n1116,121776\n1116,131517\n1116,132307\n1116,132545\n1116,133270\n1116,174122\n1116,180951\n1116,183395\n1116,193766\n1116,193768\n1116,193769\n1116,232902\n1116,241229\n1116,247949\n1116,258056\n1117,10\n1117,46\n1117,299\n1117,499\n1117,599\n1117,663\n1117,664\n1117,720\n1117,721\n1117,762\n1117,783\n1117,877\n1117,907\n1117,937\n1117,972\n1117,973\n1117,1083\n1117,1117\n1117,1122\n1117,1258\n1117,1276\n1117,1284\n1117,1360\n1117,1439\n1117,1493\n1117,1732\n1117,1837\n1117,2035\n1117,2111\n1117,2191\n1117,2595\n1117,2747\n1117,3477\n1117,4397\n1117,4755\n1117,5127\n1117,5587\n1117,5662\n1117,6552\n1117,6591\n1117,8303\n1117,8464\n1117,8530\n1117,13217\n1117,13429\n1117,13806\n1117,14600\n1117,15633\n1117,15876\n1117,18410\n1117,18491\n1117,18570\n1117,18674\n1117,18679\n1117,19418\n1117,25350\n1117,25824\n1117,26148\n1117,31033\n1117,36720\n1117,38791\n1117,39661\n1117,42302\n1117,44937\n1117,45853\n1117,52528\n1117,53985\n1117,58820\n1117,61753\n1117,62204\n1117,62675\n1117,69679\n1117,73680\n1117,79930\n1117,85868\n1117,85869\n1117,93400\n1117,104682\n1117,116205\n1117,117099\n1117,124668\n1117,127872\n1117,130957\n1117,135812\n1117,141724\n1117,157308\n1117,157438\n1117,158323\n1117,158365\n1117,158412\n1117,159747\n1117,160402\n1117,161931\n1117,162739\n1117,163735\n1117,164397\n1117,167847\n1117,181193\n1117,187176\n1117,192899\n1117,204791\n1117,204801\n1117,205673\n1117,213766\n1117,251059\n1118,1\n1118,20\n1118,22\n1118,34\n1118,83\n1118,87\n1118,106\n1118,120\n1118,126\n1118,135\n1118,147\n1118,182\n1118,185\n1118,186\n1118,192\n1118,207\n1118,211\n1118,217\n1118,240\n1118,248\n1118,252\n1118,255\n1118,256\n1118,259\n1118,264\n1118,289\n1118,290\n1118,294\n1118,299\n1118,301\n1118,336\n1118,372\n1118,389\n1118,392\n1118,397\n1118,402\n1118,406\n1118,433\n1118,435\n1118,440\n1118,452\n1118,455\n1118,457\n1118,467\n1118,497\n1118,499\n1118,500\n1118,503\n1118,510\n1118,512\n1118,534\n1118,535\n1118,536\n1118,563\n1118,577\n1118,590\n1118,599\n1118,604\n1118,631\n1118,673\n1118,693\n1118,694\n1118,704\n1118,726\n1118,733\n1118,752\n1118,779\n1118,788\n1118,794\n1118,801\n1118,805\n1118,808\n1118,818\n1118,849\n1118,862\n1118,872\n1118,875\n1118,903\n1118,911\n1118,918\n1118,920\n1118,929\n1118,972\n1118,973\n1118,1014\n1118,1085\n1118,1087\n1118,1096\n1118,1118\n1118,1135\n1118,1140\n1118,1147\n1118,1151\n1118,1172\n1118,1181\n1118,1191\n1118,1197\n1118,1204\n1118,1210\n1118,1220\n1118,1222\n1118,1285\n1118,1293\n1118,1298\n1118,1326\n1118,1332\n1118,1370\n1118,1417\n1118,1445\n1118,1462\n1118,1464\n1118,1518\n1118,1522\n1118,1531\n1118,1566\n1118,1572\n1118,1623\n1118,1655\n1118,1659\n1118,1696\n1118,1724\n1118,1796\n1118,1805\n1118,1825\n1118,1836\n1118,1837\n1118,1844\n1118,1888\n1118,1955\n1118,2021\n1118,2083\n1118,2085\n1118,2105\n1118,2173\n1118,2224\n1118,2253\n1118,2310\n1118,2312\n1118,2348\n1118,2512\n1118,2775\n1118,3169\n1118,3199\n1118,3202\n1118,3504\n1118,3507\n1118,3582\n1118,3623\n1118,3804\n1118,3828\n1118,3836\n1118,4039\n1118,4066\n1118,4231\n1118,4286\n1118,5052\n1118,5185\n1118,5186\n1118,5214\n1118,5379\n1118,5498\n1118,5524\n1118,5625\n1118,5646\n1118,5777\n1118,5827\n1118,5839\n1118,6394\n1118,6452\n1118,6472\n1118,6685\n1118,6695\n1118,6837\n1118,6904\n1118,6935\n1118,6955\n1118,7118\n1118,7766\n1118,7885\n1118,8000\n1118,13657\n1118,15290\n1118,15608\n1118,15629\n1118,16231\n1118,17116\n1118,18627\n1118,18671\n1118,19413\n1118,19488\n1118,19764\n1118,20439\n1118,20499\n1118,20686\n1118,20738\n1118,20757\n1118,20792\n1118,21563\n1118,22232\n1118,22296\n1118,24757\n1118,24760\n1118,25511\n1118,26133\n1118,26239\n1118,26815\n1118,26831\n1118,28409\n1118,29595\n1118,29757\n1118,30455\n1118,31280\n1118,34181\n1118,34820\n1118,35480\n1118,36820\n1118,37497\n1118,37517\n1118,39687\n1118,40604\n1118,42327\n1118,42749\n1118,43107\n1118,44073\n1118,44609\n1118,44785\n1118,44846\n1118,45129\n1118,45381\n1118,45427\n1118,46841\n1118,48909\n1118,49280\n1118,50285\n1118,50347\n1118,52772\n1118,54445\n1118,54616\n1118,58292\n1118,59206\n1118,59727\n1118,60060\n1118,60436\n1118,60896\n1118,63006\n1118,63628\n1118,64513\n1118,69647\n1118,69910\n1118,72100\n1118,72512\n1118,73392\n1118,75118\n1118,75912\n1118,75936\n1118,75959\n1118,75962\n1118,75964\n1118,75966\n1118,75967\n1118,75969\n1118,75972\n1118,75975\n1118,75977\n1118,75979\n1118,79968\n1118,81233\n1118,83812\n1118,84934\n1118,86398\n1118,86399\n1118,86454\n1118,86462\n1118,86478\n1118,86493\n1118,87158\n1118,87171\n1118,89599\n1118,91577\n1118,92141\n1118,93037\n1118,93042\n1118,93171\n1118,93707\n1118,93711\n1118,93714\n1118,93716\n1118,93771\n1118,94151\n1118,94281\n1118,94336\n1118,94842\n1118,94945\n1118,94946\n1118,94953\n1118,95014\n1118,95411\n1118,95609\n1118,97451\n1118,97714\n1118,101698\n1118,103105\n1118,103156\n1118,105552\n1118,106820\n1118,110527\n1118,110557\n1118,113971\n1118,115283\n1118,115474\n1118,116116\n1118,118336\n1118,119117\n1118,120155\n1118,124475\n1118,126029\n1118,126555\n1118,127191\n1118,127794\n1118,127861\n1118,128753\n1118,132813\n1118,137223\n1118,139967\n1118,139977\n1118,140516\n1118,144121\n1118,144444\n1118,154987\n1118,160479\n1118,162481\n1118,163852\n1118,165016\n1118,165342\n1118,165453\n1118,166652\n1118,166658\n1118,167052\n1118,168304\n1118,168499\n1118,169387\n1118,172184\n1118,172185\n1118,172618\n1118,173822\n1118,174403\n1118,174911\n1118,177343\n1118,177898\n1118,177900\n1118,177903\n1118,178787\n1118,183274\n1118,185420\n1118,186078\n1118,186644\n1118,187325\n1118,192911\n1118,195116\n1118,201846\n1118,203169\n1118,204133\n1118,212944\n1118,213965\n1118,218632\n1118,220915\n1118,221930\n1118,224492\n1118,232252\n1118,238376\n1118,246887\n1118,246892\n1118,249798\n1118,255883\n1118,256371\n1118,258400\n1119,5\n1119,41\n1119,68\n1119,104\n1119,134\n1119,227\n1119,261\n1119,290\n1119,298\n1119,304\n1119,327\n1119,332\n1119,372\n1119,373\n1119,417\n1119,431\n1119,442\n1119,446\n1119,534\n1119,573\n1119,588\n1119,589\n1119,590\n1119,626\n1119,631\n1119,632\n1119,636\n1119,676\n1119,677\n1119,714\n1119,715\n1119,760\n1119,761\n1119,784\n1119,797\n1119,805\n1119,823\n1119,862\n1119,1001\n1119,1004\n1119,1016\n1119,1085\n1119,1119\n1119,1149\n1119,1209\n1119,1284\n1119,1285\n1119,1326\n1119,1346\n1119,1415\n1119,1459\n1119,1462\n1119,1631\n1119,1635\n1119,1678\n1119,1701\n1119,1704\n1119,1732\n1119,1745\n1119,1888\n1119,1955\n1119,2097\n1119,2188\n1119,2205\n1119,2206\n1119,2237\n1119,2316\n1119,2346\n1119,2408\n1119,2417\n1119,2620\n1119,2991\n1119,2995\n1119,3507\n1119,3566\n1119,3585\n1119,3715\n1119,4066\n1119,4114\n1119,4220\n1119,4619\n1119,4739\n1119,5011\n1119,5346\n1119,5439\n1119,5574\n1119,5578\n1119,5828\n1119,6068\n1119,6069\n1119,6185\n1119,6792\n1119,6856\n1119,6908\n1119,7077\n1119,7194\n1119,7227\n1119,7728\n1119,7790\n1119,7962\n1119,8246\n1119,8275\n1119,8401\n1119,8529\n1119,8537\n1119,9342\n1119,12747\n1119,13198\n1119,14080\n1119,14487\n1119,14507\n1119,14597\n1119,15206\n1119,15277\n1119,15952\n1119,16137\n1119,16164\n1119,16306\n1119,16309\n1119,16370\n1119,16510\n1119,16551\n1119,16709\n1119,17116\n1119,18543\n1119,18965\n1119,19617\n1119,20592\n1119,20787\n1119,21384\n1119,21867\n1119,21944\n1119,22081\n1119,22440\n1119,24996\n1119,25048\n1119,25385\n1119,25664\n1119,25800\n1119,25814\n1119,26475\n1119,26513\n1119,27126\n1119,28191\n1119,29898\n1119,30268\n1119,30733\n1119,31001\n1119,31746\n1119,31785\n1119,32218\n1119,32692\n1119,33424\n1119,33567\n1119,34828\n1119,37100\n1119,37771\n1119,39618\n1119,40220\n1119,40267\n1119,40993\n1119,42841\n1119,43394\n1119,44989\n1119,46874\n1119,47770\n1119,49457\n1119,50440\n1119,50494\n1119,50857\n1119,53530\n1119,54391\n1119,54421\n1119,55146\n1119,55658\n1119,56650\n1119,57910\n1119,62855\n1119,62886\n1119,62964\n1119,64150\n1119,64197\n1119,64631\n1119,64840\n1119,65681\n1119,66868\n1119,67507\n1119,71110\n1119,72564\n1119,75183\n1119,75912\n1119,78891\n1119,80049\n1119,81135\n1119,81508\n1119,83314\n1119,83496\n1119,86791\n1119,87507\n1119,89711\n1119,90140\n1119,90925\n1119,99147\n1119,103524\n1119,104630\n1119,105327\n1119,110509\n1119,114843\n1119,115705\n1119,118020\n1119,118248\n1119,127323\n1119,128361\n1119,131371\n1119,131880\n1119,135105\n1119,135950\n1119,136462\n1119,139522\n1119,142040\n1119,148018\n1119,149304\n1119,152605\n1119,155073\n1119,158269\n1119,159712\n1119,161874\n1119,167770\n1119,169337\n1119,170914\n1119,173427\n1119,175384\n1119,176866\n1119,176944\n1119,182344\n1119,182345\n1119,185877\n1119,188256\n1119,188555\n1119,193994\n1119,195069\n1119,201654\n1119,201743\n1119,203174\n1119,204567\n1119,204640\n1119,206740\n1119,207051\n1119,211855\n1119,213669\n1119,214733\n1119,215413\n1119,216205\n1119,219068\n1119,220939\n1119,221176\n1119,226397\n1119,229229\n1119,230379\n1119,230934\n1119,231195\n1119,235275\n1119,237302\n1119,246120\n1119,251019\n1119,258779\n1119,262570\n1121,163\n1122,299\n1122,372\n1122,444\n1122,459\n1122,599\n1122,663\n1122,664\n1122,720\n1122,783\n1122,932\n1122,937\n1122,972\n1122,973\n1122,982\n1122,1010\n1122,1011\n1122,1117\n1122,1122\n1122,1123\n1122,1124\n1122,1167\n1122,1271\n1122,1298\n1122,1326\n1122,1522\n1122,1544\n1122,1732\n1122,1837\n1122,1849\n1122,2191\n1122,2595\n1122,3207\n1122,3422\n1122,3734\n1122,5186\n1122,5587\n1122,5662\n1122,6844\n1122,7873\n1122,8022\n1122,8187\n1122,14449\n1122,14597\n1122,16471\n1122,16488\n1122,17877\n1122,18504\n1122,21230\n1122,28375\n1122,32784\n1122,32944\n1122,35483\n1122,36257\n1122,40453\n1122,42951\n1122,45853\n1122,46454\n1122,46699\n1122,49991\n1122,50440\n1122,52065\n1122,52067\n1122,54040\n1122,54504\n1122,57182\n1122,59061\n1122,59185\n1122,59955\n1122,69935\n1122,78653\n1122,87764\n1122,87908\n1122,105532\n1122,109668\n1122,115332\n1122,124668\n1122,127741\n1122,127847\n1122,131809\n1122,140044\n1122,145913\n1122,148387\n1122,152027\n1122,164312\n1122,167787\n1122,168461\n1122,170590\n1122,171641\n1122,172582\n1122,172615\n1122,175903\n1122,177820\n1122,186900\n1122,187176\n1122,204791\n1123,972\n1123,1122\n1123,1849\n1123,32784\n1124,37\n1124,45\n1124,58\n1124,444\n1124,459\n1124,567\n1124,604\n1124,744\n1124,783\n1124,801\n1124,937\n1124,968\n1124,973\n1124,994\n1124,1125\n1124,1128\n1124,1160\n1124,1167\n1124,1293\n1124,1479\n1124,1544\n1124,1832\n1124,2217\n1124,3422\n1124,3488\n1124,3575\n1124,3869\n1124,4128\n1124,5662\n1124,6434\n1124,16697\n1124,17894\n1124,18098\n1124,18482\n1124,22267\n1124,23574\n1124,26042\n1124,26198\n1124,34099\n1124,34263\n1124,35542\n1124,37355\n1124,48886\n1124,58820\n1124,67818\n1124,67988\n1124,72709\n1124,74687\n1124,76679\n1124,80060\n1125,46\n1125,58\n1125,994\n1125,1124\n1126,1127\n1127,10\n1127,58\n1127,111\n1127,314\n1127,441\n1127,452\n1127,673\n1127,714\n1127,872\n1127,911\n1127,1011\n1127,1127\n1127,1172\n1127,1844\n1127,1978\n1128,46\n1128,58\n1128,534\n1128,1124\n1130,11\n1130,20\n1130,58\n1130,86\n1130,111\n1130,126\n1130,158\n1130,160\n1130,163\n1130,167\n1130,192\n1130,207\n1130,240\n1130,248\n1130,259\n1130,272\n1130,287\n1130,292\n1130,299\n1130,304\n1130,333\n1130,336\n1130,356\n1130,372\n1130,388\n1130,392\n1130,433\n1130,435\n1130,455\n1130,457\n1130,489\n1130,500\n1130,509\n1130,516\n1130,534\n1130,536\n1130,538\n1130,577\n1130,586\n1130,599\n1130,604\n1130,631\n1130,668\n1130,672\n1130,673\n1130,685\n1130,693\n1130,697\n1130,788\n1130,794\n1130,801\n1130,809\n1130,818\n1130,838\n1130,843\n1130,849\n1130,852\n1130,868\n1130,872\n1130,911\n1130,918\n1130,919\n1130,972\n1130,1001\n1130,1011\n1130,1014\n1130,1058\n1130,1070\n1130,1085\n1130,1089\n1130,1118\n1130,1130\n1130,1151\n1130,1167\n1130,1172\n1130,1240\n1130,1267\n1130,1284\n1130,1293\n1130,1309\n1130,1320\n1130,1326\n1130,1370\n1130,1402\n1130,1452\n1130,1465\n1130,1566\n1130,1590\n1130,1619\n1130,1634\n1130,1655\n1130,1722\n1130,1724\n1130,1782\n1130,1796\n1130,1836\n1130,1837\n1130,1844\n1130,1848\n1130,1955\n1130,1992\n1130,2373\n1130,2512\n1130,2580\n1130,2979\n1130,3135\n1130,3260\n1130,3392\n1130,3804\n1130,4147\n1130,4222\n1130,4276\n1130,4384\n1130,4760\n1130,5185\n1130,5686\n1130,7318\n1130,7973\n1130,8055\n1130,8276\n1130,15329\n1130,16208\n1130,16667\n1130,16696\n1130,19543\n1130,20651\n1130,21442\n1130,24728\n1130,25526\n1130,26161\n1130,28814\n1130,29890\n1130,30373\n1130,37668\n1130,39446\n1130,41230\n1130,47835\n1130,56371\n1130,70966\n1130,70971\n1130,75912\n1130,82633\n1130,92976\n1130,93509\n1130,94958\n1130,104539\n1130,105598\n1130,105672\n1130,106069\n1130,106946\n1130,109997\n1130,110682\n1130,110683\n1130,113021\n1130,113532\n1130,113908\n1130,114105\n1130,115474\n1130,115996\n1130,116401\n1130,117013\n1130,118336\n1130,134602\n1130,140057\n1130,140426\n1130,140688\n1130,140829\n1130,144092\n1130,146346\n1130,158270\n1130,160451\n1130,160885\n1130,161512\n1130,162599\n1130,163769\n1130,163843\n1130,165205\n1130,175272\n1130,189242\n1130,189357\n1130,195679\n1130,215276\n1130,215874\n1130,219988\n1130,247103\n1130,247895\n1130,254854\n1130,258104\n1130,259512\n1130,262348\n1130,262466\n1131,1132\n1132,41\n1132,48\n1132,87\n1132,130\n1132,685\n1132,693\n1132,911\n1132,1132\n1133,68\n1133,207\n1133,287\n1133,349\n1133,390\n1133,518\n1133,534\n1133,589\n1133,599\n1133,849\n1133,852\n1133,873\n1133,874\n1133,911\n1133,1001\n1133,1082\n1133,1133\n1133,1210\n1133,1326\n1133,1634\n1133,1749\n1133,2182\n1133,2252\n1133,2479\n1133,2590\n1133,5578\n1133,5851\n1133,7087\n1133,7222\n1133,14092\n1133,15421\n1133,23421\n1133,28093\n1133,31066\n1133,31308\n1133,31311\n1133,31731\n1133,34303\n1133,34720\n1133,34767\n1133,56083\n1133,61467\n1133,65663\n1133,75287\n1133,91394\n1133,109560\n1133,118725\n1133,119003\n1133,119667\n1133,122451\n1133,138330\n1133,142807\n1133,142919\n1133,145082\n1133,147515\n1133,155658\n1133,169180\n1133,173242\n1133,194989\n1133,212971\n1133,216333\n1133,221273\n1134,48\n1134,178\n1134,340\n1134,647\n1135,11\n1135,126\n1135,256\n1135,849\n1135,911\n1135,1118\n1135,1135\n1135,1434\n1135,1566\n1135,1663\n1135,1844\n1135,3967\n1135,4190\n1135,4352\n1135,5213\n1135,8419\n1135,13776\n1135,14109\n1135,15344\n1135,22168\n1135,34908\n1135,38135\n1135,79943\n1135,90414\n1135,94730\n1135,106404\n1135,114387\n1135,128797\n1135,142956\n1135,164271\n1135,168447\n1135,171784\n1135,171786\n1135,171787\n1135,171789\n1135,171791\n1135,194600\n1135,223459\n1135,224465\n1135,252510\n1135,252675\n1136,698\n1137,623\n1138,278\n1138,2646\n1138,115659\n1139,1140\n1140,58\n1140,87\n1140,217\n1140,264\n1140,292\n1140,314\n1140,344\n1140,441\n1140,442\n1140,457\n1140,467\n1140,510\n1140,596\n1140,599\n1140,626\n1140,676\n1140,801\n1140,849\n1140,872\n1140,929\n1140,1011\n1140,1019\n1140,1118\n1140,1127\n1140,1140\n1140,1235\n1140,1240\n1140,1284\n1140,1326\n1140,1332\n1140,1335\n1140,1449\n1140,1465\n1140,1566\n1140,1572\n1140,1722\n1140,1796\n1140,1844\n1140,1893\n1140,1973\n1140,2173\n1140,2209\n1140,2334\n1140,2436\n1140,2443\n1140,3474\n1140,3507\n1140,4771\n1140,5547\n1140,18832\n1140,20813\n1140,22765\n1140,68302\n1140,86165\n1140,136072\n1142,1143\n1143,87\n1143,256\n1143,838\n1143,911\n1143,1240\n1143,1805\n1143,1860\n1143,5833\n1143,207837\n1144,20\n1144,1072\n1144,1564\n1144,1818\n1144,4276\n1145,37\n1145,717\n1145,1782\n1146,58\n1146,87\n1146,107\n1146,111\n1146,392\n1146,441\n1146,442\n1146,510\n1146,596\n1146,609\n1146,685\n1146,702\n1146,703\n1146,749\n1146,801\n1146,818\n1146,849\n1146,918\n1146,999\n1146,1011\n1146,1146\n1146,1147\n1146,1151\n1146,1368\n1146,1949\n1146,2253\n1146,3538\n1146,6824\n1146,15523\n1146,26450\n1146,127158\n1147,11\n1147,20\n1147,87\n1147,111\n1147,126\n1147,182\n1147,256\n1147,314\n1147,397\n1147,425\n1147,441\n1147,452\n1147,457\n1147,500\n1147,535\n1147,599\n1147,676\n1147,685\n1147,794\n1147,808\n1147,838\n1147,843\n1147,849\n1147,872\n1147,972\n1147,1011\n1147,1014\n1147,1118\n1147,1130\n1147,1172\n1147,1191\n1147,1192\n1147,1345\n1147,1417\n1147,1445\n1147,1559\n1147,1566\n1147,1655\n1147,1663\n1147,1973\n1147,2253\n1147,2373\n1147,3524\n1147,4066\n1147,4165\n1147,5833\n1147,6824\n1147,6904\n1147,7117\n1147,9457\n1147,19413\n1147,20757\n1147,118336\n1147,215874\n1148,843\n1149,41\n1149,81\n1149,108\n1149,175\n1149,254\n1149,328\n1149,373\n1149,502\n1149,503\n1149,512\n1149,586\n1149,693\n1149,704\n1149,760\n1149,947\n1149,1011\n1149,1119\n1149,1149\n1149,1257\n1149,1266\n1149,1270\n1149,1282\n1149,1402\n1149,1488\n1149,1489\n1149,1631\n1149,1635\n1149,1659\n1149,1745\n1149,1882\n1149,2065\n1149,2210\n1149,2775\n1149,3183\n1149,3202\n1149,3507\n1149,3508\n1149,3565\n1149,3566\n1149,3760\n1149,3939\n1149,4115\n1149,4237\n1149,4261\n1149,4265\n1149,4320\n1149,4466\n1149,4842\n1149,5317\n1149,5357\n1149,5535\n1149,5552\n1149,5679\n1149,6554\n1149,6753\n1149,6923\n1149,6928\n1149,6963\n1149,7739\n1149,7758\n1149,7928\n1149,9441\n1149,12876\n1149,13166\n1149,13207\n1149,13395\n1149,13452\n1149,14444\n1149,14487\n1149,14524\n1149,14577\n1149,15189\n1149,15229\n1149,15334\n1149,15344\n1149,15397\n1149,15654\n1149,15856\n1149,16306\n1149,16538\n1149,18450\n1149,18457\n1149,18487\n1149,19075\n1149,20301\n1149,20540\n1149,22299\n1149,22335\n1149,23609\n1149,24644\n1149,25348\n1149,25814\n1149,27639\n1149,28291\n1149,30873\n1149,33750\n1149,34065\n1149,34414\n1149,34581\n1149,35202\n1149,35371\n1149,37573\n1149,37580\n1149,37584\n1149,37588\n1149,38437\n1149,39597\n1149,41206\n1149,43090\n1149,44298\n1149,44340\n1149,44757\n1149,46874\n1149,47525\n1149,49339\n1149,49810\n1149,50171\n1149,50175\n1149,50177\n1149,50188\n1149,50192\n1149,50199\n1149,50204\n1149,50206\n1149,50207\n1149,50211\n1149,50217\n1149,51791\n1149,54575\n1149,56320\n1149,56615\n1149,58935\n1149,59088\n1149,59112\n1149,60115\n1149,60356\n1149,60459\n1149,60500\n1149,60548\n1149,63909\n1149,65681\n1149,70416\n1149,76263\n1149,76860\n1149,78981\n1149,82051\n1149,82371\n1149,85958\n1149,86254\n1149,86255\n1149,86256\n1149,86323\n1149,86471\n1149,86747\n1149,86756\n1149,87002\n1149,87589\n1149,88013\n1149,91019\n1149,91026\n1149,91976\n1149,92874\n1149,97338\n1149,99383\n1149,99685\n1149,101888\n1149,102116\n1149,103366\n1149,109693\n1149,119253\n1149,121033\n1149,122123\n1149,131371\n1149,132005\n1149,133288\n1149,134647\n1149,137275\n1149,137801\n1149,138142\n1149,138689\n1149,139695\n1149,140143\n1149,141357\n1149,141879\n1149,142403\n1149,143262\n1149,145158\n1149,145471\n1149,145622\n1149,148090\n1149,149694\n1149,158817\n1149,158854\n1149,158871\n1149,159403\n1149,159908\n1149,160450\n1149,160496\n1149,160840\n1149,162478\n1149,162958\n1149,163120\n1149,163338\n1149,163642\n1149,165231\n1149,165990\n1149,168993\n1149,169065\n1149,169317\n1149,170622\n1149,170857\n1149,171240\n1149,171651\n1149,173063\n1149,176957\n1149,177789\n1149,178963\n1149,183031\n1149,187040\n1149,187077\n1149,192064\n1149,192257\n1149,194480\n1149,195650\n1149,196150\n1149,197783\n1149,199078\n1149,202051\n1149,205457\n1149,205747\n1149,212908\n1149,215062\n1149,216340\n1149,216435\n1149,221031\n1149,225336\n1149,228928\n1149,232439\n1149,234939\n1149,239423\n1149,241609\n1149,243386\n1149,252561\n1149,257813\n1149,260225\n1149,260537\n1149,262398\n1150,1151\n1151,66\n1151,87\n1151,111\n1151,217\n1151,240\n1151,292\n1151,314\n1151,397\n1151,440\n1151,457\n1151,467\n1151,509\n1151,510\n1151,599\n1151,685\n1151,818\n1151,849\n1151,868\n1151,872\n1151,911\n1151,919\n1151,1011\n1151,1014\n1151,1118\n1151,1130\n1151,1192\n1151,1210\n1151,1240\n1151,1572\n1151,1663\n1151,1722\n1151,1844\n1151,2173\n1151,2253\n1151,3538\n1151,4039\n1151,15609\n1151,127158\n1151,215874\n1152,336\n1153,422\n1154,422\n1155,346\n1156,422\n1157,422\n1158,326\n1159,422\n1160,46\n1160,301\n1160,397\n1160,444\n1160,567\n1160,604\n1160,605\n1160,783\n1160,937\n1160,968\n1160,1001\n1160,1124\n1160,1160\n1160,1161\n1160,1293\n1160,1300\n1160,1326\n1160,1732\n1160,1782\n1160,1853\n1160,3422\n1160,5197\n1160,5662\n1160,7257\n1160,14246\n1160,25273\n1160,35545\n1160,41528\n1160,42598\n1160,48317\n1160,50522\n1160,57125\n1160,60568\n1160,79971\n1160,82909\n1160,84069\n1160,85459\n1160,91427\n1160,96685\n1160,102575\n1160,103860\n1160,119842\n1160,126956\n1160,147481\n1160,152468\n1160,174279\n1160,178012\n1160,202294\n1160,205018\n1160,218884\n1160,221671\n1160,221687\n1160,221716\n1160,222348\n1160,222415\n1160,241013\n1160,242399\n1160,243286\n1160,243792\n1160,244725\n1160,245264\n1160,245365\n1161,937\n1161,968\n1161,1160\n1161,1282\n1161,1732\n1162,336\n1162,1163\n1163,1163\n1164,422\n1165,233\n1166,422\n1167,58\n1167,167\n1167,299\n1167,356\n1167,665\n1167,666\n1167,685\n1167,720\n1167,794\n1167,852\n1167,941\n1167,1014\n1167,1122\n1167,1130\n1167,1167\n1167,1241\n1167,1284\n1167,1319\n1167,1381\n1167,1436\n1167,1522\n1167,1635\n1167,1849\n1167,2083\n1167,2192\n1167,2372\n1167,2979\n1167,3207\n1167,3218\n1167,3392\n1167,3422\n1167,3784\n1167,5195\n1167,5238\n1167,5662\n1167,5787\n1167,6910\n1167,7203\n1167,7219\n1167,7239\n1167,7774\n1167,8435\n1167,9655\n1167,13519\n1167,13523\n1167,14615\n1167,15183\n1167,15633\n1167,18526\n1167,20303\n1167,21412\n1167,23365\n1167,23446\n1167,23845\n1167,24579\n1167,25662\n1167,29543\n1167,29727\n1167,29760\n1167,30323\n1167,30491\n1167,32577\n1167,32784\n1167,35139\n1167,35445\n1167,36678\n1167,37482\n1167,38959\n1167,45853\n1167,49121\n1167,49373\n1167,56540\n1167,56541\n1167,56554\n1167,56555\n1167,56570\n1167,56909\n1167,57066\n1167,59977\n1167,60564\n1167,61307\n1167,62932\n1167,64156\n1167,68873\n1167,71008\n1167,72764\n1167,73570\n1167,79293\n1167,79324\n1167,82234\n1167,85750\n1167,91555\n1167,96623\n1167,96685\n1167,101629\n1167,103784\n1167,109863\n1167,114353\n1167,120155\n1167,120922\n1167,122944\n1167,126787\n1167,135946\n1167,141926\n1167,142990\n1167,146412\n1167,148765\n1167,148771\n1167,149246\n1167,152298\n1167,153648\n1167,158281\n1167,162021\n1167,165848\n1167,177824\n1167,179905\n1167,179939\n1167,179940\n1167,179943\n1167,184392\n1167,187415\n1167,194316\n1167,213170\n1167,218754\n1167,234686\n1167,235853\n1167,241779\n1167,248474\n1167,254237\n1167,258248\n1167,258266\n1167,260728\n1167,261891\n1167,261900\n1168,422\n1169,422\n1170,422\n1171,422\n1172,20\n1172,182\n1172,209\n1172,217\n1172,259\n1172,292\n1172,301\n1172,302\n1172,314\n1172,352\n1172,356\n1172,397\n1172,452\n1172,497\n1172,510\n1172,534\n1172,581\n1172,599\n1172,668\n1172,712\n1172,775\n1172,818\n1172,838\n1172,849\n1172,875\n1172,911\n1172,920\n1172,972\n1172,973\n1172,1011\n1172,1014\n1172,1147\n1172,1151\n1172,1179\n1172,1191\n1172,1204\n1172,1293\n1172,1309\n1172,1326\n1172,1445\n1172,1518\n1172,1619\n1172,1796\n1172,1836\n1172,1844\n1172,1989\n1172,1992\n1172,2310\n1172,2373\n1172,2775\n1172,3967\n1172,5213\n1172,6452\n1172,8419\n1172,13207\n1172,14658\n1172,15109\n1172,15310\n1172,19413\n1172,19592\n1172,21590\n1172,24491\n1172,24707\n1172,34971\n1172,37370\n1172,38159\n1172,38326\n1172,41893\n1172,50375\n1172,61220\n1172,61285\n1172,71166\n1172,82598\n1172,102738\n1172,105584\n1172,113959\n1172,116879\n1172,119511\n1172,121893\n1172,148226\n1172,149144\n1172,151086\n1172,161239\n1172,164363\n1172,167026\n1172,169481\n1172,179751\n1172,181951\n1172,189903\n1172,195032\n1172,201143\n1172,214092\n1172,218762\n1172,221847\n1172,226510\n1172,238987\n1173,358\n1173,510\n1173,875\n1173,1515\n1173,1775\n1173,2701\n1173,171294\n1174,843\n1174,1175\n1175,202\n1175,203\n1175,256\n1175,446\n1175,493\n1175,516\n1175,663\n1175,664\n1175,682\n1175,733\n1175,1222\n1175,1243\n1175,1265\n1175,1266\n1175,1292\n1175,1370\n1175,1655\n1175,1927\n1175,2033\n1175,2266\n1175,2307\n1175,3507\n1175,5696\n1175,8400\n1175,13636\n1175,16610\n1175,18185\n1175,20295\n1175,21706\n1175,30317\n1175,32792\n1175,34874\n1175,36439\n1175,36636\n1175,38844\n1175,41057\n1175,41602\n1175,43365\n1175,44043\n1175,68373\n1175,76704\n1175,77049\n1175,78631\n1175,79359\n1175,87708\n1175,95823\n1175,100218\n1175,118895\n1175,136042\n1175,136087\n1175,158299\n1175,162613\n1175,169627\n1175,172552\n1175,173519\n1175,173669\n1175,173672\n1175,173678\n1175,174474\n1175,174490\n1175,177885\n1175,181759\n1175,185084\n1175,189839\n1175,206096\n1175,215276\n1175,216167\n1175,216604\n1175,218925\n1175,227700\n1175,228830\n1175,251234\n1176,1177\n1177,41\n1177,42\n1177,58\n1177,200\n1177,292\n1177,301\n1177,441\n1177,442\n1177,626\n1177,797\n1177,801\n1177,911\n1177,1012\n1177,1052\n1177,1140\n1177,1177\n1177,1188\n1177,1804\n1177,1973\n1177,2210\n1177,2334\n1177,2395\n1177,3407\n1177,4237\n1177,4258\n1177,4265\n1177,6556\n1177,6569\n1177,13506\n1177,13931\n1177,14132\n1177,32666\n1177,36778\n1177,46749\n1177,56629\n1177,62597\n1177,62886\n1177,64594\n1177,81832\n1177,102506\n1177,102509\n1177,102513\n1177,103270\n1177,103524\n1177,106187\n1177,106340\n1177,106348\n1177,106356\n1177,107465\n1177,107648\n1177,109414\n1177,109920\n1177,109926\n1177,110195\n1177,110735\n1177,111100\n1177,113402\n1177,116641\n1177,117231\n1177,124479\n1177,138058\n1177,144087\n1177,147502\n1177,149188\n1177,150762\n1177,151040\n1177,151409\n1177,152563\n1177,154768\n1177,156298\n1177,156958\n1177,156967\n1177,160083\n1177,161479\n1177,165883\n1177,165903\n1177,167035\n1177,169318\n1177,169665\n1177,174920\n1177,175054\n1177,175513\n1177,182162\n1177,185980\n1177,190262\n1177,214550\n1178,225\n1178,248\n1178,1179\n1178,5405\n1179,30\n1179,134\n1179,136\n1179,200\n1179,225\n1179,248\n1179,327\n1179,328\n1179,356\n1179,417\n1179,440\n1179,622\n1179,685\n1179,693\n1179,809\n1179,838\n1179,850\n1179,852\n1179,911\n1179,950\n1179,1014\n1179,1033\n1179,1179\n1179,1279\n1179,1305\n1179,1329\n1179,1332\n1179,1368\n1179,1939\n1179,2119\n1179,2596\n1179,2710\n1179,3565\n1179,3654\n1179,3944\n1179,4276\n1179,5405\n1179,5453\n1179,5472\n1179,6062\n1179,6136\n1179,6646\n1179,6901\n1179,7790\n1179,8075\n1179,8279\n1179,8378\n1179,8511\n1179,9342\n1179,13207\n1179,14975\n1179,15553\n1179,15571\n1179,15604\n1179,16468\n1179,16638\n1179,17175\n1179,18194\n1179,19784\n1179,19798\n1179,20488\n1179,20598\n1179,20729\n1179,22776\n1179,23868\n1179,26969\n1179,28203\n1179,28263\n1179,37912\n1179,44970\n1179,48040\n1179,51571\n1179,57143\n1179,57910\n1179,58871\n1179,59080\n1179,59774\n1179,59889\n1179,63187\n1179,73745\n1179,78891\n1179,83496\n1179,92972\n1179,95605\n1179,98240\n1179,109077\n1179,110076\n1179,123833\n1179,126715\n1179,149284\n1179,156624\n1179,159820\n1179,170162\n1179,173841\n1179,173872\n1179,176323\n1179,176345\n1179,176357\n1179,178576\n1179,183362\n1179,183844\n1179,185282\n1179,186525\n1179,186552\n1179,186612\n1179,187303\n1179,192506\n1179,193739\n1179,196017\n1179,199342\n1179,199381\n1179,199391\n1179,201877\n1179,203015\n1179,207182\n1179,207194\n1179,219793\n1179,220449\n1179,223682\n1179,223797\n1179,229432\n1179,230462\n1179,231192\n1179,237259\n1179,244256\n1180,1181\n1180,1531\n1181,192\n1181,1181\n1181,1192\n1181,1218\n1181,1456\n1181,1464\n1181,1476\n1181,1502\n1181,1825\n1181,2307\n1181,2374\n1181,9394\n1181,21419\n1181,23662\n1181,24045\n1181,25416\n1181,31210\n1181,36436\n1181,39643\n1181,74632\n1181,77906\n1181,91833\n1181,136271\n1181,160859\n1181,171804\n1182,1011\n1182,1151\n1183,209\n1184,3\n1184,510\n1185,178\n1186,349\n1186,392\n1186,644\n1186,697\n1186,1151\n1187,489\n1187,1188\n1188,10\n1188,87\n1188,175\n1188,200\n1188,446\n1188,609\n1188,685\n1188,693\n1188,1449\n1188,2915\n1189,147\n1189,149\n1189,158\n1191,1\n1191,20\n1191,72\n1191,182\n1191,202\n1191,207\n1191,256\n1191,264\n1191,301\n1191,314\n1191,397\n1191,441\n1191,457\n1191,493\n1191,505\n1191,599\n1191,673\n1191,676\n1191,710\n1191,731\n1191,818\n1191,872\n1191,911\n1191,1021\n1191,1023\n1191,1118\n1191,1191\n1191,1192\n1191,1196\n1191,1204\n1191,1345\n1191,1559\n1191,1566\n1191,1663\n1191,1992\n1191,2143\n1191,2173\n1191,2253\n1191,2356\n1191,2512\n1191,2923\n1191,3524\n1191,4165\n1191,4276\n1191,5213\n1191,8419\n1191,8676\n1191,9457\n1191,13375\n1191,14481\n1191,14674\n1191,22020\n1191,30596\n1191,32616\n1191,54616\n1191,75912\n1191,79620\n1191,79844\n1191,80954\n1191,82217\n1191,82598\n1191,84506\n1191,90298\n1191,113959\n1191,124907\n1191,131650\n1191,137013\n1191,172497\n1191,174786\n1191,174787\n1191,185281\n1191,200454\n1191,204093\n1191,215276\n1191,215874\n1191,220187\n1191,227952\n1191,242216\n1191,251849\n1192,19\n1192,86\n1192,87\n1192,104\n1192,111\n1192,126\n1192,134\n1192,136\n1192,192\n1192,202\n1192,203\n1192,209\n1192,254\n1192,256\n1192,264\n1192,298\n1192,301\n1192,326\n1192,328\n1192,333\n1192,358\n1192,392\n1192,397\n1192,435\n1192,442\n1192,447\n1192,455\n1192,493\n1192,536\n1192,573\n1192,588\n1192,590\n1192,649\n1192,760\n1192,818\n1192,872\n1192,907\n1192,980\n1192,1007\n1192,1085\n1192,1147\n1192,1151\n1192,1181\n1192,1191\n1192,1204\n1192,1235\n1192,1335\n1192,1345\n1192,1430\n1192,1453\n1192,1464\n1192,1505\n1192,1515\n1192,1564\n1192,1572\n1192,1616\n1192,1635\n1192,1663\n1192,1688\n1192,1825\n1192,1916\n1192,1968\n1192,1973\n1192,2014\n1192,2173\n1192,2206\n1192,2274\n1192,2671\n1192,2726\n1192,3182\n1192,3507\n1192,3835\n1192,4222\n1192,4231\n1192,4276\n1192,4771\n1192,13478\n1192,16019\n1192,19996\n1192,20396\n1192,21982\n1192,32819\n1192,33424\n1192,38394\n1192,40344\n1192,60528\n1192,64567\n1192,76096\n1192,104567\n1192,123978\n1192,140826\n1192,185281\n1192,186777\n1192,200454\n1192,232683\n1192,233462\n1192,245910\n1192,250521\n1192,258219\n1192,258739\n1193,660\n1194,518\n1195,41\n1195,42\n1195,233\n1195,289\n1195,290\n1195,298\n1195,534\n1195,631\n1195,760\n1195,784\n1195,862\n1195,1085\n1195,1132\n1195,1195\n1195,1462\n1195,1608\n1195,2775\n1195,2995\n1195,3623\n1195,4258\n1195,8537\n1195,13931\n1195,25385\n1195,30505\n1195,54666\n1195,56629\n1195,58145\n1195,58911\n1195,60603\n1195,64136\n1195,65828\n1195,65835\n1195,67418\n1195,68211\n1195,75912\n1195,94134\n1195,98080\n1195,109553\n1195,110656\n1196,1191\n1197,48\n1197,130\n1197,140\n1197,264\n1197,292\n1197,338\n1197,392\n1197,462\n1197,479\n1197,515\n1197,710\n1197,801\n1197,872\n1197,991\n1197,1052\n1197,1118\n1197,1127\n1197,1381\n1197,1559\n1197,1579\n1197,1639\n1197,1659\n1197,1707\n1197,1893\n1197,1968\n1197,2312\n1197,3258\n1197,3695\n1197,4066\n1197,5440\n1197,6955\n1197,13538\n1197,25573\n1197,36985\n1197,54202\n1197,54264\n1197,54362\n1198,79\n1198,99\n1198,192\n1198,278\n1198,336\n1198,841\n1198,1181\n1198,23783\n1199,336\n1200,248\n1201,83\n1201,283\n1201,379\n1201,401\n1201,536\n1201,1069\n1201,1201\n1201,1973\n1201,2319\n1201,2944\n1201,5326\n1201,5458\n1201,5737\n1201,18831\n1201,48360\n1201,82197\n1201,116687\n1201,118835\n1201,148636\n1201,171193\n1202,1203\n1203,120\n1203,240\n1203,332\n1203,372\n1203,677\n1203,818\n1203,1082\n1203,1285\n1203,1807\n1203,1808\n1203,1955\n1203,2510\n1203,2991\n1203,3135\n1203,3607\n1203,3770\n1203,3771\n1203,3814\n1203,5825\n1203,6840\n1203,13698\n1203,16335\n1203,16571\n1203,18528\n1203,18647\n1203,19431\n1203,19622\n1203,20609\n1203,20624\n1203,21964\n1203,22328\n1203,22331\n1203,22337\n1203,22339\n1203,22353\n1203,22359\n1203,22360\n1203,22365\n1203,23102\n1203,24766\n1203,26513\n1203,33412\n1203,38111\n1203,38910\n1203,41012\n1203,42545\n1203,42677\n1203,44227\n1203,44232\n1203,44236\n1203,44237\n1203,44273\n1203,46309\n1203,46668\n1203,48975\n1203,66736\n1203,85936\n1203,85941\n1203,85951\n1203,85955\n1203,85961\n1203,85965\n1203,85966\n1203,85967\n1203,85970\n1203,85972\n1203,96546\n1203,99012\n1203,99013\n1203,99056\n1203,99149\n1203,103256\n1203,103269\n1203,103277\n1203,103634\n1203,105593\n1203,164417\n1203,177286\n1203,177475\n1203,195053\n1203,195056\n1204,34\n1204,35\n1204,192\n1204,256\n1204,314\n1204,336\n1204,397\n1204,440\n1204,457\n1204,500\n1204,510\n1204,673\n1204,676\n1204,685\n1204,794\n1204,801\n1204,849\n1204,852\n1204,872\n1204,893\n1204,911\n1204,920\n1204,1014\n1204,1118\n1204,1151\n1204,1191\n1204,1192\n1204,1204\n1204,1345\n1204,1417\n1204,1445\n1204,1472\n1204,1559\n1204,1619\n1204,1663\n1204,1758\n1204,1796\n1204,1844\n1204,2206\n1204,2253\n1204,2496\n1204,3524\n1204,3533\n1204,5709\n1204,6452\n1204,6523\n1204,6824\n1204,8021\n1204,14232\n1204,15397\n1204,18688\n1204,33424\n1204,54616\n1204,73399\n1204,106176\n1204,125548\n1204,154769\n1204,188951\n1204,204093\n1205,192\n1205,622\n1205,1619\n1206,389\n1207,160\n1207,515\n1208,388\n1208,389\n1208,577\n1208,1072\n1210,22\n1210,50\n1210,68\n1210,167\n1210,186\n1210,192\n1210,207\n1210,217\n1210,240\n1210,255\n1210,287\n1210,301\n1210,302\n1210,314\n1210,326\n1210,347\n1210,349\n1210,392\n1210,397\n1210,425\n1210,433\n1210,435\n1210,446\n1210,457\n1210,509\n1210,510\n1210,516\n1210,535\n1210,599\n1210,623\n1210,663\n1210,697\n1210,702\n1210,752\n1210,779\n1210,809\n1210,818\n1210,843\n1210,861\n1210,868\n1210,872\n1210,873\n1210,874\n1210,968\n1210,1010\n1210,1011\n1210,1023\n1210,1118\n1210,1133\n1210,1151\n1210,1181\n1210,1210\n1210,1211\n1210,1240\n1210,1370\n1210,1417\n1210,1454\n1210,1466\n1210,1494\n1210,1518\n1210,1561\n1210,1564\n1210,1634\n1210,1705\n1210,1738\n1210,1844\n1210,1853\n1210,2173\n1210,2193\n1210,2205\n1210,2206\n1210,2235\n1210,2297\n1210,2307\n1210,2470\n1210,2659\n1210,2979\n1210,3497\n1210,3866\n1210,4130\n1210,4272\n1210,4417\n1210,5178\n1210,5250\n1210,5376\n1210,5646\n1210,5937\n1210,7759\n1210,7760\n1210,8261\n1210,8276\n1210,10216\n1210,13198\n1210,13298\n1210,13901\n1210,14155\n1210,15303\n1210,15344\n1210,15609\n1210,16357\n1210,18587\n1210,18756\n1210,21663\n1210,22790\n1210,24365\n1210,24787\n1210,25625\n1210,26081\n1210,29595\n1210,29890\n1210,29937\n1210,30373\n1210,30674\n1210,31318\n1210,31474\n1210,31790\n1210,33703\n1210,34073\n1210,36941\n1210,37726\n1210,39583\n1210,40657\n1210,40678\n1210,41106\n1210,43762\n1210,44172\n1210,44416\n1210,45195\n1210,45574\n1210,46271\n1210,46515\n1210,47106\n1210,47236\n1210,49337\n1210,50169\n1210,50305\n1210,50359\n1210,50903\n1210,50987\n1210,51109\n1210,51359\n1210,51880\n1210,52408\n1210,55552\n1210,57873\n1210,60794\n1210,62990\n1210,64152\n1210,68006\n1210,70689\n1210,79193\n1210,82217\n1210,85800\n1210,87245\n1210,88569\n1210,93113\n1210,96557\n1210,97543\n1210,97638\n1210,97667\n1210,98646\n1210,98872\n1210,103750\n1210,111297\n1210,114459\n1210,114462\n1210,114643\n1210,117969\n1210,118281\n1210,126050\n1210,127158\n1210,128733\n1210,130241\n1210,132917\n1210,136630\n1210,139793\n1210,142055\n1210,142855\n1210,142895\n1210,143117\n1210,143463\n1210,143959\n1210,145640\n1210,147767\n1210,152751\n1210,155069\n1210,158268\n1210,160117\n1210,161245\n1210,161626\n1210,161630\n1210,161633\n1210,173807\n1210,173859\n1210,176059\n1210,188727\n1210,192076\n1210,192368\n1210,192388\n1210,192807\n1210,205031\n1210,208017\n1210,213173\n1210,214073\n1210,214636\n1210,215633\n1210,216478\n1210,223842\n1210,224846\n1210,227074\n1210,233477\n1210,236180\n1210,237460\n1210,238422\n1210,247074\n1210,248125\n1210,249055\n1210,260220\n1210,260980\n1211,579\n1211,1210\n1211,1639\n1212,26\n1212,59\n1212,81\n1212,104\n1212,138\n1212,328\n1212,704\n1212,714\n1212,784\n1212,885\n1212,886\n1212,1016\n1212,1282\n1212,1402\n1212,1882\n1212,2008\n1212,2286\n1212,2384\n1212,2893\n1212,3794\n1212,4308\n1212,5137\n1212,8180\n1212,14133\n1212,14500\n1212,15768\n1212,16491\n1212,23423\n1212,25306\n1212,31173\n1212,31893\n1212,36819\n1212,46806\n1212,59273\n1212,66383\n1212,80265\n1212,84476\n1212,86674\n1212,92141\n1212,121378\n1212,139002\n1212,160343\n1212,171620\n1212,173296\n1212,175722\n1212,176782\n1212,182606\n1212,189802\n1212,212515\n1212,232709\n1212,234870\n1212,247699\n1212,254305\n1213,104\n1213,111\n1213,225\n1213,254\n1213,264\n1213,557\n1213,588\n1213,590\n1213,631\n1213,736\n1213,760\n1213,772\n1213,784\n1213,1085\n1213,1282\n1213,1332\n1213,1381\n1213,1962\n1213,3069\n1214,111\n1215,698\n1216,163\n1216,305\n1216,447\n1216,1132\n1216,1201\n1216,8501\n1216,15573\n1216,75912\n1217,97\n1217,269\n1217,861\n1218,34\n1218,35\n1218,50\n1218,56\n1218,79\n1218,99\n1218,192\n1218,278\n1218,333\n1218,336\n1218,406\n1218,602\n1218,620\n1218,622\n1218,779\n1218,841\n1218,1181\n1218,1247\n1218,1515\n1218,2244\n1218,2931\n1218,23783\n1218,240174\n1219,134\n1219,355\n1219,527\n1219,743\n1219,1983\n1219,4810\n1219,8714\n1219,95583\n1220,63\n1220,106\n1220,202\n1220,203\n1220,251\n1220,252\n1220,275\n1220,277\n1220,318\n1220,389\n1220,457\n1220,465\n1220,493\n1220,516\n1220,599\n1220,682\n1220,685\n1220,733\n1220,849\n1220,911\n1220,1011\n1220,1118\n1220,1220\n1220,1222\n1220,1243\n1220,1263\n1220,1370\n1220,1512\n1220,1568\n1220,1572\n1220,1655\n1220,1792\n1220,1973\n1220,2775\n1220,2874\n1220,4066\n1220,4159\n1220,5816\n1220,5992\n1220,6816\n1220,7103\n1220,7952\n1220,9053\n1220,9107\n1220,13374\n1220,13720\n1220,15243\n1220,15733\n1220,16010\n1220,16487\n1220,17884\n1220,19304\n1220,19866\n1220,19897\n1220,20268\n1220,20269\n1220,20295\n1220,21981\n1220,21994\n1220,22204\n1220,23650\n1220,23734\n1220,25839\n1220,26179\n1220,26469\n1220,26856\n1220,26857\n1220,26859\n1220,26869\n1220,26965\n1220,27495\n1220,29638\n1220,34374\n1220,37530\n1220,38458\n1220,38899\n1220,39012\n1220,39034\n1220,40542\n1220,40763\n1220,41170\n1220,46134\n1220,47402\n1220,47728\n1220,49195\n1220,49197\n1220,49198\n1220,54373\n1220,54508\n1220,56412\n1220,61021\n1220,64563\n1220,71837\n1220,72439\n1220,73510\n1220,75709\n1220,75912\n1220,78825\n1220,81835\n1220,82349\n1220,82838\n1220,84005\n1220,85752\n1220,87274\n1220,90771\n1220,91341\n1220,101686\n1220,102789\n1220,103966\n1220,104605\n1220,107759\n1220,108159\n1220,111422\n1220,113745\n1220,116534\n1220,118331\n1220,118401\n1220,133707\n1220,135765\n1220,136306\n1220,138822\n1220,138825\n1220,149264\n1220,157974\n1220,161264\n1220,164328\n1220,165762\n1220,167633\n1220,168280\n1220,168595\n1220,174681\n1220,174739\n1220,175283\n1220,176895\n1220,176993\n1220,178002\n1220,178729\n1220,182834\n1220,185354\n1220,189788\n1220,189842\n1220,197678\n1220,199494\n1220,201028\n1220,201188\n1220,203055\n1220,205828\n1220,206989\n1220,207064\n1220,215276\n1220,215451\n1220,219970\n1220,223738\n1220,229821\n1220,229905\n1220,230333\n1220,230411\n1220,231803\n1220,239038\n1220,249160\n1220,249198\n1220,249629\n1220,252565\n1220,254347\n1220,255407\n1220,259550\n1221,178\n1221,622\n1221,1033\n1221,2178\n1221,4545\n1222,1220\n1222,1222\n1223,1224\n1225,710\n1226,1227\n1226,1229\n1227,1227\n1227,1229\n1227,5156\n1227,16050\n1227,17114\n1227,23713\n1228,160\n1230,1231\n1230,1908\n1231,37\n1231,46\n1231,301\n1231,567\n1231,599\n1231,604\n1231,615\n1231,663\n1231,664\n1231,698\n1231,717\n1231,783\n1231,818\n1231,838\n1231,907\n1231,937\n1231,968\n1231,972\n1231,973\n1231,1011\n1231,1210\n1231,1230\n1231,1231\n1231,1284\n1231,1293\n1231,1300\n1231,1564\n1231,1782\n1231,1837\n1231,1973\n1231,2217\n1231,2509\n1231,2595\n1231,2689\n1231,2979\n1231,3182\n1231,3351\n1231,3379\n1231,3422\n1231,3756\n1231,3809\n1231,4683\n1231,5662\n1231,6398\n1231,6712\n1231,6778\n1231,7222\n1231,13523\n1231,14916\n1231,17894\n1231,20628\n1231,26433\n1231,27003\n1231,27031\n1231,28317\n1231,30253\n1231,36033\n1231,38921\n1231,41878\n1231,46804\n1231,46868\n1231,48121\n1231,48218\n1231,48305\n1231,48380\n1231,48672\n1231,52547\n1231,53203\n1231,62449\n1231,65930\n1231,83262\n1231,84719\n1231,99626\n1231,107973\n1231,111348\n1231,117480\n1231,122159\n1231,124607\n1231,126475\n1231,131033\n1231,140705\n1231,146979\n1231,147311\n1231,149320\n1231,151552\n1231,167732\n1231,167790\n1231,168843\n1231,174621\n1231,177514\n1231,194560\n1231,212010\n1231,225463\n1231,227376\n1231,227459\n1231,233481\n1231,240422\n1231,241077\n1231,244037\n1231,255100\n1231,262517\n1232,527\n1233,158\n1233,1235\n1233,25573\n1234,1179\n1235,5\n1235,25\n1235,26\n1235,47\n1235,59\n1235,60\n1235,94\n1235,104\n1235,111\n1235,116\n1235,117\n1235,118\n1235,138\n1235,184\n1235,186\n1235,211\n1235,248\n1235,292\n1235,314\n1235,323\n1235,327\n1235,330\n1235,425\n1235,430\n1235,441\n1235,446\n1235,510\n1235,599\n1235,612\n1235,868\n1235,885\n1235,886\n1235,887\n1235,947\n1235,967\n1235,994\n1235,1011\n1235,1085\n1235,1140\n1235,1233\n1235,1235\n1235,1329\n1235,1334\n1235,1335\n1235,1346\n1235,1432\n1235,1494\n1235,1684\n1235,1775\n1235,1921\n1235,2089\n1235,2231\n1235,2436\n1235,2451\n1235,2469\n1235,2587\n1235,2674\n1235,2701\n1235,2867\n1235,2868\n1235,2893\n1235,2940\n1235,3247\n1235,3473\n1235,3794\n1235,3795\n1235,3796\n1235,3839\n1235,4114\n1235,4286\n1235,4571\n1235,4662\n1235,4748\n1235,4771\n1235,5112\n1235,5375\n1235,5388\n1235,5574\n1235,5627\n1235,5700\n1235,5701\n1235,5803\n1235,5871\n1235,5889\n1235,6012\n1235,6208\n1235,6209\n1235,6621\n1235,6824\n1235,7084\n1235,7124\n1235,7144\n1235,7206\n1235,7222\n1235,7263\n1235,7271\n1235,7766\n1235,7779\n1235,7880\n1235,8092\n1235,8281\n1235,8355\n1235,8356\n1235,8357\n1235,8557\n1235,8801\n1235,9156\n1235,9355\n1235,9356\n1235,9357\n1235,9358\n1235,9359\n1235,9542\n1235,9787\n1235,13131\n1235,13644\n1235,13662\n1235,13704\n1235,14080\n1235,14220\n1235,14372\n1235,14373\n1235,14755\n1235,14863\n1235,14864\n1235,14866\n1235,15370\n1235,15378\n1235,15675\n1235,15682\n1235,15730\n1235,15737\n1235,15742\n1235,15795\n1235,15957\n1235,15959\n1235,16099\n1235,16386\n1235,16775\n1235,18125\n1235,18158\n1235,18484\n1235,18518\n1235,19203\n1235,19558\n1235,19798\n1235,19893\n1235,20111\n1235,20227\n1235,20294\n1235,20485\n1235,20486\n1235,20611\n1235,20676\n1235,20828\n1235,21559\n1235,21944\n1235,22643\n1235,22781\n1235,22851\n1235,22880\n1235,23111\n1235,23704\n1235,24843\n1235,25120\n1235,25636\n1235,25707\n1235,25764\n1235,25821\n1235,26061\n1235,26908\n1235,26946\n1235,27013\n1235,27656\n1235,27695\n1235,27886\n1235,27985\n1235,28403\n1235,28408\n1235,28462\n1235,28650\n1235,28651\n1235,28679\n1235,29047\n1235,29386\n1235,29387\n1235,29421\n1235,29423\n1235,29713\n1235,29982\n1235,30111\n1235,30350\n1235,32278\n1235,32280\n1235,32365\n1235,32754\n1235,32755\n1235,32938\n1235,33155\n1235,33158\n1235,33383\n1235,33444\n1235,34060\n1235,34986\n1235,36637\n1235,37595\n1235,38258\n1235,38437\n1235,40282\n1235,40367\n1235,40370\n1235,40461\n1235,41493\n1235,41954\n1235,42601\n1235,42679\n1235,42813\n1235,42814\n1235,42935\n1235,42989\n1235,43172\n1235,43173\n1235,43983\n1235,44136\n1235,44244\n1235,44380\n1235,45090\n1235,45701\n1235,46873\n1235,47808\n1235,48344\n1235,48770\n1235,48974\n1235,49320\n1235,49498\n1235,49811\n1235,50323\n1235,51146\n1235,53829\n1235,53885\n1235,53886\n1235,56274\n1235,57249\n1235,57330\n1235,59523\n1235,60435\n1235,60625\n1235,60724\n1235,62624\n1235,63565\n1235,64526\n1235,64583\n1235,64584\n1235,64587\n1235,65681\n1235,66716\n1235,66794\n1235,66795\n1235,66909\n1235,67717\n1235,67927\n1235,67999\n1235,68000\n1235,68393\n1235,68947\n1235,69723\n1235,69790\n1235,70324\n1235,70485\n1235,70486\n1235,70488\n1235,70491\n1235,70506\n1235,70927\n1235,71229\n1235,71809\n1235,72011\n1235,73582\n1235,74210\n1235,74211\n1235,74231\n1235,74745\n1235,75281\n1235,75295\n1235,77101\n1235,78745\n1235,79775\n1235,80265\n1235,80631\n1235,81293\n1235,81294\n1235,82164\n1235,85629\n1235,85719\n1235,85779\n1235,85830\n1235,86222\n1235,86380\n1235,87835\n1235,88820\n1235,92787\n1235,92788\n1235,92789\n1235,92790\n1235,92791\n1235,92792\n1235,92793\n1235,93839\n1235,93974\n1235,94209\n1235,94438\n1235,94906\n1235,95171\n1235,95172\n1235,95499\n1235,96315\n1235,96687\n1235,96914\n1235,96915\n1235,97495\n1235,98884\n1235,99328\n1235,99332\n1235,99728\n1235,99729\n1235,101130\n1235,102248\n1235,102561\n1235,102842\n1235,105748\n1235,105811\n1235,106520\n1235,106617\n1235,107040\n1235,107212\n1235,108642\n1235,109498\n1235,110008\n1235,110377\n1235,110378\n1235,110381\n1235,110386\n1235,110387\n1235,113783\n1235,115688\n1235,117293\n1235,117581\n1235,117583\n1235,121825\n1235,122149\n1235,122746\n1235,123689\n1235,124939\n1235,125650\n1235,125651\n1235,126005\n1235,126831\n1235,127725\n1235,128054\n1235,128055\n1235,128057\n1235,128262\n1235,128525\n1235,129728\n1235,129740\n1235,130260\n1235,132593\n1235,133831\n1235,134297\n1235,135202\n1235,135203\n1235,135204\n1235,135205\n1235,135206\n1235,135207\n1235,135208\n1235,135209\n1235,135210\n1235,135211\n1235,135212\n1235,135213\n1235,135214\n1235,135307\n1235,135308\n1235,135450\n1235,135769\n1235,135778\n1235,135779\n1235,135863\n1235,137782\n1235,137783\n1235,138553\n1235,138554\n1235,138568\n1235,140579\n1235,141140\n1235,141160\n1235,142094\n1235,142095\n1235,142439\n1235,142591\n1235,142850\n1235,142853\n1235,145186\n1235,145221\n1235,145529\n1235,146174\n1235,146524\n1235,147641\n1235,148076\n1235,148077\n1235,148697\n1235,148907\n1235,148987\n1235,149565\n1235,150009\n1235,151515\n1235,151516\n1235,154571\n1235,154572\n1235,154690\n1235,154903\n1235,155054\n1235,157376\n1235,157456\n1235,157531\n1235,158473\n1235,158870\n1235,158961\n1235,159939\n1235,160275\n1235,163645\n1235,164100\n1235,165141\n1235,165345\n1235,165346\n1235,166622\n1235,168101\n1235,168102\n1235,169275\n1235,169276\n1235,169277\n1235,169762\n1235,170177\n1235,173188\n1235,174282\n1235,176692\n1235,176836\n1235,176855\n1235,180856\n1235,184272\n1235,189844\n1235,189905\n1235,191046\n1235,191047\n1235,192533\n1235,192667\n1235,192779\n1235,192989\n1235,193108\n1235,193535\n1235,194996\n1235,195061\n1235,195834\n1235,197474\n1235,197483\n1235,198284\n1235,198476\n1235,198477\n1235,199304\n1235,200793\n1235,203198\n1235,203764\n1235,203765\n1235,204734\n1235,205222\n1235,212541\n1235,212542\n1235,213541\n1235,214461\n1235,214462\n1235,216234\n1235,216235\n1235,218687\n1235,219054\n1235,219373\n1235,219466\n1235,219467\n1235,219468\n1235,219469\n1235,219524\n1235,220176\n1235,225949\n1235,227746\n1235,227791\n1235,227886\n1235,227887\n1235,231835\n1235,231836\n1235,231837\n1235,231838\n1235,232229\n1235,232230\n1235,233810\n1235,235702\n1235,235703\n1235,235704\n1235,237111\n1235,237899\n1235,237929\n1235,240700\n1235,241353\n1235,243692\n1235,243730\n1235,243732\n1235,246280\n1235,250340\n1235,251101\n1235,251708\n1235,251730\n1235,252276\n1235,252769\n1235,253331\n1235,256255\n1235,257139\n1235,257521\n1235,257522\n1235,257599\n1235,260145\n1235,260595\n1235,260596\n1235,260856\n1235,260857\n1235,260983\n1236,328\n1237,1238\n1238,10\n1238,107\n1238,178\n1238,292\n1238,441\n1238,446\n1238,462\n1238,502\n1238,685\n1238,745\n1238,818\n1238,978\n1238,1025\n1238,1235\n1238,1238\n1238,1335\n1238,1572\n1238,1583\n1238,1653\n1238,1668\n1238,1722\n1238,2209\n1238,2379\n1238,3009\n1238,3367\n1238,3538\n1238,3830\n1238,4114\n1238,4771\n1238,5265\n1238,6621\n1238,6824\n1238,7519\n1238,16426\n1238,21944\n1238,26051\n1238,29143\n1238,29848\n1238,32816\n1238,32978\n1238,39517\n1238,40560\n1238,41887\n1238,42080\n1238,42766\n1238,43143\n1238,44130\n1238,44522\n1238,47735\n1238,47749\n1238,47761\n1238,48170\n1238,48190\n1238,49012\n1238,49017\n1238,49019\n1238,49022\n1238,51146\n1238,52815\n1238,54636\n1238,55064\n1238,56907\n1238,61280\n1238,66389\n1238,67557\n1238,68670\n1238,69144\n1238,69867\n1238,74599\n1238,74603\n1238,74626\n1238,76057\n1238,79369\n1238,80108\n1238,95330\n1238,98923\n1238,101859\n1238,101889\n1238,105479\n1238,107757\n1238,121349\n1238,124210\n1238,126831\n1238,136029\n1238,136150\n1238,168847\n1238,183326\n1238,186567\n1238,205015\n1238,212179\n1238,212910\n1238,218461\n1238,218475\n1238,219027\n1238,219834\n1238,219910\n1238,219977\n1238,219995\n1238,221229\n1238,221490\n1238,231735\n1238,236007\n1238,236078\n1238,236133\n1238,238089\n1238,238092\n1238,238193\n1238,238297\n1238,239415\n1238,246786\n1238,251290\n1238,257032\n1239,1240\n1240,10\n1240,32\n1240,87\n1240,175\n1240,217\n1240,312\n1240,314\n1240,392\n1240,425\n1240,455\n1240,457\n1240,467\n1240,499\n1240,535\n1240,599\n1240,623\n1240,644\n1240,676\n1240,685\n1240,693\n1240,697\n1240,808\n1240,809\n1240,818\n1240,838\n1240,849\n1240,852\n1240,903\n1240,911\n1240,918\n1240,919\n1240,972\n1240,1011\n1240,1014\n1240,1140\n1240,1143\n1240,1151\n1240,1210\n1240,1239\n1240,1240\n1240,1262\n1240,1276\n1240,1345\n1240,1363\n1240,1417\n1240,1444\n1240,1454\n1240,1465\n1240,1487\n1240,1513\n1240,1564\n1240,1634\n1240,1653\n1240,1656\n1240,1663\n1240,1769\n1240,1796\n1240,1805\n1240,1860\n1240,1949\n1240,1973\n1240,1986\n1240,2246\n1240,2406\n1240,2418\n1240,2494\n1240,2511\n1240,2522\n1240,2541\n1240,2548\n1240,2699\n1240,2810\n1240,3003\n1240,3260\n1240,3507\n1240,3524\n1240,3582\n1240,3699\n1240,3781\n1240,3786\n1240,3880\n1240,3916\n1240,4105\n1240,4184\n1240,4416\n1240,4514\n1240,4760\n1240,5380\n1240,5469\n1240,5540\n1240,5869\n1240,5880\n1240,6042\n1240,6045\n1240,6059\n1240,6552\n1240,6781\n1240,6890\n1240,6893\n1240,7098\n1240,7326\n1240,7731\n1240,7968\n1240,8190\n1240,8658\n1240,8660\n1240,9729\n1240,13139\n1240,13222\n1240,13389\n1240,13429\n1240,13444\n1240,14249\n1240,15207\n1240,15303\n1240,15417\n1240,15575\n1240,16357\n1240,16541\n1240,16566\n1240,16914\n1240,17115\n1240,17291\n1240,18156\n1240,18295\n1240,18333\n1240,18711\n1240,18740\n1240,18765\n1240,18772\n1240,18960\n1240,19366\n1240,19410\n1240,19777\n1240,19814\n1240,20228\n1240,20426\n1240,20427\n1240,20757\n1240,21380\n1240,21589\n1240,22148\n1240,22189\n1240,22197\n1240,22314\n1240,22408\n1240,23634\n1240,23730\n1240,24801\n1240,26161\n1240,26196\n1240,27042\n1240,28207\n1240,28450\n1240,29136\n1240,29847\n1240,31414\n1240,32688\n1240,32978\n1240,37060\n1240,37219\n1240,37426\n1240,37823\n1240,38486\n1240,40575\n1240,44510\n1240,44732\n1240,44780\n1240,44972\n1240,46032\n1240,46368\n1240,47090\n1240,48299\n1240,50160\n1240,50875\n1240,53310\n1240,54341\n1240,54557\n1240,55156\n1240,56982\n1240,58278\n1240,59918\n1240,61144\n1240,62414\n1240,63503\n1240,64823\n1240,65753\n1240,67896\n1240,68681\n1240,70110\n1240,70114\n1240,70121\n1240,70132\n1240,70136\n1240,70147\n1240,70200\n1240,70206\n1240,70235\n1240,70277\n1240,70280\n1240,70665\n1240,70941\n1240,70961\n1240,71032\n1240,71033\n1240,71046\n1240,71060\n1240,71747\n1240,71986\n1240,71987\n1240,72673\n1240,72902\n1240,73114\n1240,73115\n1240,73117\n1240,73447\n1240,73578\n1240,76096\n1240,76704\n1240,76989\n1240,77547\n1240,79528\n1240,79988\n1240,80577\n1240,82739\n1240,83362\n1240,83765\n1240,86005\n1240,86430\n1240,86679\n1240,86724\n1240,87304\n1240,87307\n1240,87308\n1240,87313\n1240,87320\n1240,87686\n1240,88400\n1240,89576\n1240,89629\n1240,89630\n1240,90360\n1240,90847\n1240,91620\n1240,93519\n1240,94284\n1240,94292\n1240,94294\n1240,94304\n1240,94772\n1240,94993\n1240,95724\n1240,96630\n1240,99602\n1240,99720\n1240,101896\n1240,103319\n1240,103801\n1240,103896\n1240,104491\n1240,104522\n1240,106723\n1240,107140\n1240,108128\n1240,110479\n1240,111330\n1240,112500\n1240,112789\n1240,112896\n1240,112923\n1240,113067\n1240,113240\n1240,113580\n1240,113986\n1240,114017\n1240,114158\n1240,115583\n1240,116060\n1240,116091\n1240,116177\n1240,116569\n1240,116590\n1240,117685\n1240,119266\n1240,119301\n1240,119381\n1240,119431\n1240,119718\n1240,119890\n1240,121473\n1240,122419\n1240,122616\n1240,125644\n1240,125900\n1240,127158\n1240,128299\n1240,129715\n1240,129716\n1240,129865\n1240,130498\n1240,131178\n1240,131420\n1240,136161\n1240,136186\n1240,136187\n1240,142340\n1240,142564\n1240,142887\n1240,148273\n1240,150273\n1240,152391\n1240,152712\n1240,153232\n1240,153648\n1240,154405\n1240,154406\n1240,154411\n1240,155623\n1240,156043\n1240,156303\n1240,156345\n1240,157128\n1240,157344\n1240,158594\n1240,158619\n1240,158915\n1240,158999\n1240,159092\n1240,160378\n1240,160444\n1240,161105\n1240,161260\n1240,161270\n1240,162175\n1240,162252\n1240,162322\n1240,162948\n1240,163009\n1240,163929\n1240,164191\n1240,165017\n1240,165023\n1240,167177\n1240,169049\n1240,169910\n1240,169972\n1240,171262\n1240,172684\n1240,177940\n1240,178677\n1240,179693\n1240,179774\n1240,179860\n1240,179866\n1240,183008\n1240,185465\n1240,188758\n1240,189714\n1240,195147\n1240,195581\n1240,201805\n1240,203979\n1240,204858\n1240,205273\n1240,214210\n1240,215462\n1240,216573\n1240,217555\n1240,219851\n1240,222440\n1240,224611\n1240,227071\n1240,228613\n1240,232692\n1240,237707\n1240,238996\n1240,240860\n1240,245307\n1240,246001\n1240,246127\n1240,247171\n1240,249692\n1240,254196\n1240,255755\n1240,256249\n1240,257486\n1240,257994\n1240,258211\n1240,259624\n1240,260369\n1240,262322\n1240,264546\n1240,264746\n1241,10\n1241,46\n1241,86\n1241,167\n1241,299\n1241,338\n1241,459\n1241,528\n1241,563\n1241,589\n1241,599\n1241,744\n1241,783\n1241,808\n1241,818\n1241,973\n1241,1001\n1241,1010\n1241,1012\n1241,1013\n1241,1167\n1241,1241\n1241,1276\n1241,1319\n1241,1479\n1241,1522\n1241,1544\n1241,1564\n1241,1584\n1241,1849\n1241,1973\n1241,2083\n1241,2193\n1241,2253\n1241,2372\n1241,2557\n1241,2595\n1241,2617\n1241,2689\n1241,2810\n1241,2832\n1241,2840\n1241,3218\n1241,3422\n1241,3507\n1241,3774\n1241,3885\n1241,4039\n1241,4240\n1241,4283\n1241,4565\n1241,5301\n1241,5662\n1241,6559\n1241,6650\n1241,6880\n1241,7057\n1241,7222\n1241,8149\n1241,8172\n1241,8193\n1241,8316\n1241,13354\n1241,13506\n1241,13593\n1241,14358\n1241,14414\n1241,16667\n1241,17327\n1241,17877\n1241,18249\n1241,18266\n1241,18678\n1241,19568\n1241,20229\n1241,23480\n1241,24531\n1241,26125\n1241,26876\n1241,27578\n1241,29007\n1241,29781\n1241,30328\n1241,31299\n1241,31746\n1241,32784\n1241,32836\n1241,33338\n1241,33442\n1241,33809\n1241,34112\n1241,34377\n1241,35394\n1241,36589\n1241,37519\n1241,37694\n1241,38244\n1241,38794\n1241,48225\n1241,49236\n1241,51223\n1241,54121\n1241,54426\n1241,56322\n1241,57182\n1241,59143\n1241,60564\n1241,62160\n1241,62453\n1241,63097\n1241,63353\n1241,68625\n1241,72673\n1241,72726\n1241,73293\n1241,73368\n1241,73991\n1241,75136\n1241,76087\n1241,76218\n1241,80738\n1241,81091\n1241,82175\n1241,87923\n1241,93027\n1241,96356\n1241,99525\n1241,99626\n1241,100305\n1241,101551\n1241,106851\n1241,107284\n1241,109267\n1241,116146\n1241,121554\n1241,123594\n1241,127158\n1241,131722\n1241,131783\n1241,132895\n1241,133545\n1241,134206\n1241,135700\n1241,140785\n1241,141607\n1241,143952\n1241,145577\n1241,149167\n1241,149168\n1241,150422\n1241,151514\n1241,152007\n1241,155390\n1241,157002\n1241,157671\n1241,158302\n1241,159460\n1241,163359\n1241,166481\n1241,169466\n1241,171467\n1241,177014\n1241,178573\n1241,182783\n1241,185404\n1241,185453\n1241,192875\n1241,195122\n1241,197916\n1241,199199\n1241,200853\n1241,214807\n1241,215939\n1241,215940\n1241,215955\n1241,219774\n1241,231633\n1241,233307\n1241,236252\n1241,236670\n1241,236778\n1241,247791\n1241,249197\n1241,258930\n1242,138\n1242,313\n1242,332\n1242,682\n1242,694\n1242,996\n1242,1985\n1242,2315\n1242,2646\n1242,2775\n1242,3623\n1242,8180\n1242,72439\n1243,10\n1243,20\n1243,63\n1243,175\n1243,202\n1243,203\n1243,251\n1243,252\n1243,275\n1243,356\n1243,446\n1243,493\n1243,516\n1243,663\n1243,673\n1243,682\n1243,685\n1243,733\n1243,838\n1243,849\n1243,852\n1243,911\n1243,1014\n1243,1175\n1243,1220\n1243,1222\n1243,1243\n1243,1244\n1243,1266\n1243,1512\n1243,1568\n1243,1655\n1243,1844\n1243,1927\n1243,2033\n1243,2400\n1243,2552\n1243,2561\n1243,3452\n1243,4273\n1243,4385\n1243,5992\n1243,6450\n1243,6924\n1243,7087\n1243,7532\n1243,7794\n1243,7862\n1243,9579\n1243,13171\n1243,13636\n1243,14674\n1243,16458\n1243,16652\n1243,18908\n1243,19592\n1243,20295\n1243,20419\n1243,20563\n1243,21706\n1243,22467\n1243,23662\n1243,26703\n1243,26768\n1243,27495\n1243,28377\n1243,30431\n1243,31136\n1243,31177\n1243,31306\n1243,32636\n1243,34221\n1243,39467\n1243,40655\n1243,42787\n1243,44437\n1243,44441\n1243,47152\n1243,56992\n1243,67217\n1243,70930\n1243,71297\n1243,72439\n1243,74446\n1243,78990\n1243,79359\n1243,89755\n1243,90780\n1243,91442\n1243,91791\n1243,91895\n1243,92881\n1243,93024\n1243,94829\n1243,94906\n1243,101618\n1243,101902\n1243,106332\n1243,107420\n1243,107518\n1243,111775\n1243,111781\n1243,113901\n1243,113938\n1243,116960\n1243,123024\n1243,124514\n1243,124584\n1243,129797\n1243,141823\n1243,141997\n1243,145627\n1243,147559\n1243,147624\n1243,148658\n1243,148758\n1243,153684\n1243,159401\n1243,164006\n1243,165595\n1243,168994\n1243,169828\n1243,179829\n1243,189788\n1243,189839\n1243,189842\n1243,193042\n1243,198101\n1243,200636\n1243,206297\n1243,212381\n1243,214892\n1243,215276\n1243,248650\n1245,626\n1246,852\n1246,957\n1246,1247\n1246,1815\n1246,14650\n1246,109503\n1247,10\n1247,171\n1247,175\n1247,184\n1247,841\n1247,957\n1247,1218\n1247,1246\n1247,1247\n1247,1815\n1247,2244\n1247,2559\n1247,2866\n1247,3037\n1247,4384\n1247,4388\n1247,4391\n1247,5244\n1247,5288\n1247,5377\n1247,7159\n1247,7241\n1247,8176\n1247,8198\n1247,8982\n1247,13556\n1247,14507\n1247,14650\n1247,15003\n1247,15236\n1247,17356\n1247,18919\n1247,19458\n1247,19624\n1247,19662\n1247,20772\n1247,21853\n1247,22389\n1247,25599\n1247,26744\n1247,27890\n1247,27912\n1247,28222\n1247,28235\n1247,28932\n1247,28953\n1247,29027\n1247,29058\n1247,38836\n1247,39532\n1247,39994\n1247,53167\n1247,58476\n1247,59133\n1247,60699\n1247,61071\n1247,61645\n1247,62153\n1247,62903\n1247,63104\n1247,63167\n1247,63629\n1247,65198\n1247,65725\n1247,69585\n1247,70981\n1247,72864\n1247,73386\n1247,77020\n1247,77107\n1247,78661\n1247,79654\n1247,80427\n1247,86343\n1247,92378\n1247,92380\n1247,93562\n1247,93577\n1247,96322\n1247,97549\n1247,99834\n1247,102431\n1247,103409\n1247,108102\n1247,109503\n1247,118357\n1247,118784\n1247,119603\n1247,121536\n1247,121928\n1247,125525\n1247,130240\n1247,135585\n1247,137830\n1247,140811\n1247,141578\n1247,144691\n1247,145491\n1247,145569\n1247,160746\n1247,162276\n1247,163588\n1247,163793\n1247,164572\n1248,305\n1249,422\n1250,217\n1250,1417\n1251,24\n1251,25\n1251,26\n1251,28\n1251,33\n1251,40\n1251,47\n1251,59\n1251,60\n1251,114\n1251,115\n1251,118\n1251,330\n1251,885\n1251,886\n1251,887\n1251,994\n1251,1235\n1251,1252\n1251,1253\n1251,1254\n1251,1255\n1251,1432\n1251,1775\n1251,2088\n1251,2469\n1251,2674\n1251,3561\n1251,5708\n1251,9343\n1251,9537\n1251,9539\n1251,9540\n1251,9541\n1251,9542\n1251,21944\n1251,41967\n1251,44244\n1251,135232\n1251,154690\n1251,171294\n1252,4\n1252,5\n1252,442\n1252,714\n1252,805\n1252,1227\n1252,1252\n1252,1253\n1252,21944\n1252,86416\n1253,330\n1253,805\n1253,1235\n1253,1335\n1254,2674\n1254,21944\n1255,1888\n1256,1257\n1257,81\n1257,104\n1257,215\n1257,503\n1257,609\n1257,704\n1257,805\n1257,1149\n1257,1212\n1257,1256\n1257,1257\n1257,1270\n1257,1359\n1257,1402\n1257,2315\n1257,2429\n1257,2708\n1257,3084\n1257,3623\n1257,6171\n1257,7366\n1257,7423\n1257,8546\n1257,14148\n1257,17681\n1257,19804\n1257,21867\n1257,23710\n1257,28287\n1257,30598\n1257,33383\n1257,37575\n1257,37607\n1257,39083\n1257,41319\n1257,41889\n1257,41969\n1257,43859\n1257,62596\n1257,66348\n1257,66806\n1257,86042\n1257,90326\n1257,99197\n1257,106381\n1257,107640\n1257,109842\n1257,114581\n1257,124864\n1257,128728\n1257,131713\n1257,134164\n1257,151352\n1257,158049\n1257,160450\n1257,161718\n1257,167343\n1257,175416\n1257,179267\n1257,182162\n1257,189618\n1257,192587\n1257,206272\n1257,206276\n1257,216645\n1257,216783\n1257,222629\n1258,636\n1258,877\n1258,1117\n1259,932\n1259,1260\n1261,1\n1261,1167\n1262,1\n1262,86\n1262,134\n1262,138\n1262,147\n1262,206\n1262,227\n1262,259\n1262,336\n1262,360\n1262,406\n1262,439\n1262,452\n1262,481\n1262,493\n1262,497\n1262,604\n1262,668\n1262,713\n1262,859\n1262,873\n1262,911\n1262,1001\n1262,1007\n1262,1010\n1262,1163\n1262,1240\n1262,1267\n1262,1293\n1262,1332\n1262,1417\n1262,1434\n1262,1454\n1262,1518\n1262,1650\n1262,1808\n1262,1844\n1262,1860\n1262,2580\n1262,3260\n1262,3721\n1262,3967\n1262,4276\n1262,5192\n1262,5213\n1262,5276\n1262,5405\n1262,5551\n1262,6423\n1262,6852\n1262,6861\n1262,7022\n1262,7905\n1262,10792\n1262,13207\n1262,14674\n1262,24734\n1262,25282\n1262,57851\n1262,58455\n1262,75912\n1262,76704\n1262,81508\n1262,83875\n1262,85979\n1262,131274\n1262,140019\n1262,152533\n1262,167007\n1262,203230\n1263,251\n1263,252\n1263,1220\n1263,1222\n1264,163\n1264,209\n1264,302\n1264,579\n1264,868\n1264,893\n1264,1556\n1264,1849\n1265,1265\n1265,1266\n1266,202\n1266,203\n1266,275\n1266,277\n1266,493\n1266,733\n1266,760\n1266,1011\n1266,1149\n1266,1175\n1266,1243\n1266,1265\n1266,1266\n1266,1631\n1267,10\n1267,104\n1267,182\n1267,314\n1267,397\n1267,452\n1267,457\n1267,509\n1267,535\n1267,599\n1267,673\n1267,685\n1267,723\n1267,838\n1267,843\n1267,849\n1267,872\n1267,972\n1267,1011\n1267,1014\n1267,1087\n1267,1118\n1267,1130\n1267,1191\n1267,1204\n1267,1262\n1267,1298\n1267,1566\n1267,1623\n1267,1663\n1267,2373\n1267,3507\n1267,4039\n1267,4190\n1267,6904\n1267,9457\n1267,19413\n1267,25573\n1267,26450\n1267,28348\n1267,215874\n1267,223738\n1267,229130\n1268,518\n1269,527\n1270,503\n1270,704\n1270,1149\n1271,972\n1271,973\n1271,1010\n1271,1122\n1271,1298\n1271,69994\n1271,90330\n1271,90777\n1271,90793\n1272,130\n1273,1274\n1274,222\n1274,278\n1274,313\n1274,379\n1274,385\n1274,389\n1274,401\n1274,404\n1274,455\n1274,536\n1274,635\n1274,849\n1274,852\n1274,1274\n1274,1618\n1274,1724\n1274,1871\n1274,2646\n1274,4321\n1274,5285\n1274,5873\n1274,6960\n1274,7388\n1274,7698\n1274,8146\n1274,8152\n1274,8154\n1274,8156\n1274,8159\n1274,8169\n1274,8182\n1274,9527\n1274,13622\n1274,20222\n1274,25670\n1274,32749\n1274,32820\n1274,33392\n1274,40003\n1274,41450\n1274,43883\n1274,46343\n1274,55806\n1274,57851\n1274,66703\n1274,66765\n1274,73268\n1274,74555\n1274,75776\n1274,78861\n1274,84477\n1274,94195\n1274,98218\n1274,103805\n1274,110606\n1274,114058\n1274,141982\n1274,142780\n1274,147984\n1274,148007\n1274,148009\n1274,148010\n1274,148019\n1274,148060\n1274,149226\n1274,149234\n1274,158246\n1274,159755\n1274,159814\n1274,159838\n1274,159938\n1274,160434\n1274,160869\n1274,161519\n1274,164940\n1274,168467\n1274,169514\n1274,171109\n1274,171330\n1274,171743\n1274,172231\n1274,173544\n1274,180915\n1274,181041\n1274,186164\n1274,192983\n1274,193024\n1274,200026\n1274,207769\n1274,211874\n1274,219891\n1274,219994\n1274,220019\n1274,220359\n1274,220362\n1274,220374\n1274,221547\n1274,221834\n1274,231138\n1274,232090\n1274,235933\n1274,236564\n1274,236584\n1274,236629\n1274,238245\n1274,249688\n1274,259476\n1275,439\n1275,996\n1276,46\n1276,83\n1276,99\n1276,147\n1276,167\n1276,178\n1276,207\n1276,225\n1276,233\n1276,256\n1276,299\n1276,326\n1276,388\n1276,390\n1276,392\n1276,425\n1276,444\n1276,510\n1276,589\n1276,590\n1276,609\n1276,615\n1276,623\n1276,631\n1276,671\n1276,694\n1276,744\n1276,783\n1276,795\n1276,841\n1276,873\n1276,919\n1276,934\n1276,991\n1276,992\n1276,996\n1276,1010\n1276,1085\n1276,1117\n1276,1167\n1276,1240\n1276,1241\n1276,1276\n1276,1277\n1276,1284\n1276,1294\n1276,1300\n1276,1353\n1276,1454\n1276,1465\n1276,1479\n1276,1522\n1276,1531\n1276,1544\n1276,1634\n1276,1715\n1276,1801\n1276,1818\n1276,1837\n1276,1858\n1276,1888\n1276,1927\n1276,1955\n1276,2019\n1276,2045\n1276,2083\n1276,2092\n1276,2191\n1276,2224\n1276,2296\n1276,2372\n1276,2436\n1276,2557\n1276,2620\n1276,2744\n1276,2784\n1276,3182\n1276,3422\n1276,3507\n1276,3538\n1276,3630\n1276,4029\n1276,4138\n1276,4354\n1276,4400\n1276,5130\n1276,5301\n1276,5385\n1276,6059\n1276,6068\n1276,6718\n1276,7092\n1276,8243\n1276,9036\n1276,13302\n1276,14049\n1276,14212\n1276,14599\n1276,15433\n1276,18722\n1276,19363\n1276,23343\n1276,24558\n1276,25537\n1276,25548\n1276,26099\n1276,26327\n1276,30289\n1276,32566\n1276,32633\n1276,33408\n1276,33673\n1276,35381\n1276,35557\n1276,35600\n1276,37529\n1276,42079\n1276,44725\n1276,46631\n1276,46846\n1276,46953\n1276,48371\n1276,49027\n1276,50166\n1276,54632\n1276,55677\n1276,59209\n1276,60560\n1276,64475\n1276,65705\n1276,74338\n1276,74619\n1276,76755\n1276,85829\n1276,89616\n1276,95563\n1276,96718\n1276,98911\n1276,106906\n1276,112841\n1276,133353\n1276,137329\n1276,157297\n1276,186565\n1276,201298\n1276,238200\n1276,248585\n1276,259440\n1277,209\n1277,1276\n1278,417\n1279,503\n1279,1052\n1279,1179\n1280,1147\n1280,2989\n1280,2991\n1281,30\n1281,34\n1281,35\n1281,175\n1281,313\n1281,328\n1281,685\n1281,693\n1281,704\n1281,772\n1281,920\n1281,1985\n1281,3623\n1281,4678\n1281,7117\n1281,81233\n1282,40\n1282,81\n1282,104\n1282,134\n1282,135\n1282,136\n1282,137\n1282,200\n1282,215\n1282,217\n1282,289\n1282,290\n1282,327\n1282,328\n1282,557\n1282,590\n1282,631\n1282,636\n1282,677\n1282,704\n1282,714\n1282,715\n1282,760\n1282,772\n1282,953\n1282,954\n1282,1011\n1282,1016\n1282,1085\n1282,1149\n1282,1161\n1282,1212\n1282,1282\n1282,1283\n1282,1332\n1282,1346\n1282,1402\n1282,1416\n1282,1432\n1282,1462\n1282,1732\n1282,1739\n1282,1818\n1282,1882\n1282,2008\n1282,2052\n1282,2069\n1282,2105\n1282,2195\n1282,2205\n1282,2206\n1282,2210\n1282,2237\n1282,2286\n1282,2708\n1282,2721\n1282,3565\n1282,3672\n1282,4237\n1282,4253\n1282,4355\n1282,4520\n1282,4571\n1282,5181\n1282,5185\n1282,6023\n1282,6069\n1282,7000\n1282,7081\n1282,8279\n1282,8512\n1282,9202\n1282,9299\n1282,9341\n1282,13207\n1282,14407\n1282,14450\n1282,14500\n1282,14760\n1282,15277\n1282,15768\n1282,16225\n1282,16292\n1282,16294\n1282,18673\n1282,18675\n1282,20353\n1282,20787\n1282,21737\n1282,22271\n1282,22273\n1282,22428\n1282,23677\n1282,26244\n1282,27948\n1282,28324\n1282,32693\n1282,32703\n1282,32706\n1282,33039\n1282,33424\n1282,34321\n1282,37100\n1282,37398\n1282,37492\n1282,39390\n1282,40220\n1282,42780\n1282,43090\n1282,43178\n1282,48518\n1282,49247\n1282,49624\n1282,50630\n1282,54398\n1282,57174\n1282,58820\n1282,59273\n1282,59695\n1282,72742\n1282,73322\n1282,74547\n1282,74696\n1282,75912\n1282,83496\n1282,84476\n1282,88820\n1282,91898\n1282,93588\n1282,94134\n1282,98512\n1282,101995\n1282,102488\n1282,102954\n1282,103778\n1282,105810\n1282,105811\n1282,107907\n1282,118515\n1282,119391\n1282,121616\n1282,123952\n1282,124014\n1282,124042\n1282,125971\n1282,128289\n1282,128456\n1282,129534\n1282,133652\n1282,137205\n1282,140132\n1282,141148\n1282,143656\n1282,147421\n1282,147633\n1282,152027\n1282,152091\n1282,152512\n1282,152571\n1282,160237\n1282,160450\n1282,161145\n1282,161858\n1282,164904\n1282,164907\n1282,165430\n1282,169919\n1282,170914\n1282,171685\n1282,172763\n1282,176089\n1282,182124\n1282,182162\n1282,196379\n1282,204529\n1282,206213\n1282,212329\n1282,213083\n1282,217319\n1282,219884\n1282,220939\n1282,231480\n1282,237442\n1282,237678\n1282,240569\n1282,245910\n1282,247383\n1282,249722\n1282,250883\n1282,251892\n1282,253303\n1283,1282\n1284,34\n1284,35\n1284,46\n1284,68\n1284,86\n1284,106\n1284,167\n1284,240\n1284,299\n1284,301\n1284,314\n1284,352\n1284,356\n1284,390\n1284,425\n1284,446\n1284,452\n1284,457\n1284,518\n1284,563\n1284,567\n1284,589\n1284,631\n1284,663\n1284,693\n1284,720\n1284,750\n1284,775\n1284,801\n1284,818\n1284,838\n1284,849\n1284,852\n1284,877\n1284,878\n1284,907\n1284,929\n1284,932\n1284,972\n1284,973\n1284,982\n1284,1001\n1284,1010\n1284,1011\n1284,1014\n1284,1045\n1284,1085\n1284,1117\n1284,1119\n1284,1122\n1284,1130\n1284,1210\n1284,1276\n1284,1284\n1284,1298\n1284,1300\n1284,1317\n1284,1326\n1284,1360\n1284,1434\n1284,1436\n1284,1479\n1284,1487\n1284,1522\n1284,1544\n1284,1566\n1284,1659\n1284,1715\n1284,1732\n1284,1796\n1284,1837\n1284,1849\n1284,1853\n1284,1889\n1284,1957\n1284,2063\n1284,2083\n1284,2191\n1284,2193\n1284,2252\n1284,2253\n1284,2372\n1284,2479\n1284,2480\n1284,2557\n1284,2840\n1284,2979\n1284,3207\n1284,3218\n1284,3422\n1284,3455\n1284,3507\n1284,3804\n1284,4043\n1284,4213\n1284,4286\n1284,4362\n1284,5181\n1284,5213\n1284,5662\n1284,5949\n1284,6539\n1284,6822\n1284,6904\n1284,6955\n1284,7234\n1284,7303\n1284,7440\n1284,7530\n1284,8032\n1284,8272\n1284,8617\n1284,9640\n1284,13217\n1284,13252\n1284,14290\n1284,14565\n1284,14572\n1284,14681\n1284,15073\n1284,15159\n1284,15202\n1284,15272\n1284,15630\n1284,15633\n1284,16869\n1284,17154\n1284,18570\n1284,18679\n1284,18717\n1284,18742\n1284,18832\n1284,19525\n1284,19701\n1284,19943\n1284,20055\n1284,21095\n1284,21249\n1284,22544\n1284,23565\n1284,23850\n1284,24107\n1284,25350\n1284,25413\n1284,26341\n1284,28114\n1284,29757\n1284,30373\n1284,31294\n1284,31785\n1284,31796\n1284,32688\n1284,32784\n1284,32863\n1284,32939\n1284,33466\n1284,34296\n1284,36805\n1284,37328\n1284,37503\n1284,37735\n1284,37857\n1284,38299\n1284,38319\n1284,38959\n1284,38974\n1284,39562\n1284,40547\n1284,41588\n1284,41900\n1284,42528\n1284,43394\n1284,45195\n1284,45853\n1284,46165\n1284,46250\n1284,46323\n1284,46742\n1284,46825\n1284,48545\n1284,48895\n1284,49125\n1284,49247\n1284,49512\n1284,49647\n1284,50522\n1284,50585\n1284,52528\n1284,54504\n1284,56445\n1284,57085\n1284,58224\n1284,58289\n1284,59264\n1284,59361\n1284,61089\n1284,61121\n1284,61411\n1284,62439\n1284,65897\n1284,67151\n1284,67936\n1284,68839\n1284,69679\n1284,70154\n1284,70376\n1284,70435\n1284,72764\n1284,73570\n1284,75912\n1284,77844\n1284,79533\n1284,82113\n1284,82745\n1284,82763\n1284,83345\n1284,85873\n1284,86488\n1284,91842\n1284,92017\n1284,93607\n1284,93624\n1284,95118\n1284,98219\n1284,100233\n1284,103207\n1284,103735\n1284,104253\n1284,105780\n1284,107162\n1284,107616\n1284,109838\n1284,113124\n1284,115681\n1284,117099\n1284,117480\n1284,117735\n1284,119510\n1284,120449\n1284,121425\n1284,123105\n1284,124668\n1284,125400\n1284,127158\n1284,127872\n1284,128382\n1284,128742\n1284,128934\n1284,129477\n1284,129776\n1284,130442\n1284,131399\n1284,131778\n1284,136182\n1284,136192\n1284,137058\n1284,137059\n1284,138084\n1284,138136\n1284,140052\n1284,140115\n1284,140116\n1284,140379\n1284,142985\n1284,144332\n1284,146047\n1284,146505\n1284,148742\n1284,150114\n1284,150116\n1284,151676\n1284,151933\n1284,155145\n1284,155708\n1284,155827\n1284,157108\n1284,158261\n1284,159116\n1284,159723\n1284,160490\n1284,163057\n1284,164915\n1284,164918\n1284,165669\n1284,165894\n1284,167395\n1284,170349\n1284,170742\n1284,178252\n1284,179336\n1284,179392\n1284,181948\n1284,183747\n1284,184496\n1284,185467\n1284,186690\n1284,192627\n1284,192629\n1284,192668\n1284,193765\n1284,193978\n1284,193980\n1284,193981\n1284,193982\n1284,193983\n1284,193985\n1284,193988\n1284,193991\n1284,193992\n1284,193993\n1284,193995\n1284,194147\n1284,194149\n1284,194150\n1284,194151\n1284,194152\n1284,194153\n1284,194154\n1284,194155\n1284,194157\n1284,194158\n1284,194159\n1284,194160\n1284,194369\n1284,194371\n1284,194373\n1284,194374\n1284,194386\n1284,194388\n1284,194407\n1284,194532\n1284,194533\n1284,194537\n1284,194540\n1284,194543\n1284,194546\n1284,194547\n1284,194645\n1284,195028\n1284,195168\n1284,195169\n1284,195172\n1284,195173\n1284,195180\n1284,195188\n1284,195197\n1284,197614\n1284,198244\n1284,198700\n1284,199273\n1284,199511\n1284,201880\n1284,203986\n1284,205673\n1284,207175\n1284,212321\n1284,213069\n1284,214246\n1284,214718\n1284,214862\n1284,214949\n1284,215429\n1284,215432\n1284,216050\n1284,216148\n1284,216155\n1284,216172\n1284,216175\n1284,216185\n1284,216778\n1284,216782\n1284,218867\n1284,218869\n1284,218870\n1284,218873\n1284,219808\n1284,221176\n1284,221896\n1284,225694\n1284,225738\n1284,225747\n1284,226221\n1284,226885\n1284,227207\n1284,227333\n1284,228269\n1284,228439\n1284,229230\n1284,232032\n1284,232219\n1284,232220\n1284,232234\n1284,232235\n1284,232236\n1284,232237\n1284,233472\n1284,233869\n1284,234140\n1284,234171\n1284,234803\n1284,234804\n1284,234807\n1284,234976\n1284,235263\n1284,235955\n1284,236014\n1284,236150\n1284,236341\n1284,236448\n1284,236982\n1284,237464\n1284,237465\n1284,237466\n1284,237467\n1284,237468\n1284,237469\n1284,237470\n1284,237471\n1284,237529\n1284,237530\n1284,237531\n1284,237532\n1284,237533\n1284,237534\n1284,237535\n1284,237559\n1284,237565\n1284,237717\n1284,237718\n1284,237719\n1284,237720\n1284,237917\n1284,238074\n1284,238079\n1284,238122\n1284,238174\n1284,238176\n1284,238177\n1284,238179\n1284,238180\n1284,238183\n1284,238223\n1284,238227\n1284,238241\n1284,238246\n1284,238247\n1284,238277\n1284,238285\n1284,238286\n1284,238287\n1284,238288\n1284,238290\n1284,238291\n1284,238292\n1284,238293\n1284,238295\n1284,238296\n1284,238355\n1284,238685\n1284,238782\n1284,239915\n1284,239934\n1284,241944\n1284,243328\n1284,243333\n1284,243340\n1284,243344\n1284,243346\n1284,243348\n1284,243349\n1284,243351\n1284,243352\n1284,243540\n1284,245377\n1284,245413\n1284,247838\n1284,247843\n1284,247844\n1284,247845\n1284,247846\n1284,247847\n1284,247849\n1284,247851\n1284,247853\n1284,247854\n1284,247856\n1284,247859\n1284,247860\n1284,247864\n1284,247866\n1284,247869\n1284,247870\n1284,247872\n1284,247874\n1284,247903\n1284,247904\n1284,247907\n1284,247909\n1284,247910\n1284,247914\n1284,247915\n1284,247917\n1284,247918\n1284,247919\n1284,247920\n1284,247922\n1284,247925\n1284,247926\n1284,247927\n1284,247928\n1284,247929\n1284,247930\n1284,250760\n1284,251511\n1284,251538\n1284,252543\n1284,258952\n1284,260158\n1284,263792\n1284,264489\n1285,41\n1285,68\n1285,71\n1285,175\n1285,233\n1285,240\n1285,255\n1285,261\n1285,332\n1285,356\n1285,372\n1285,390\n1285,431\n1285,444\n1285,631\n1285,677\n1285,685\n1285,715\n1285,760\n1285,794\n1285,805\n1285,818\n1285,843\n1285,849\n1285,911\n1285,968\n1285,1001\n1285,1004\n1285,1011\n1285,1045\n1285,1061\n1285,1080\n1285,1082\n1285,1085\n1285,1118\n1285,1119\n1285,1203\n1285,1209\n1285,1285\n1285,1309\n1285,1361\n1285,1462\n1285,1564\n1285,1807\n1285,1818\n1285,1888\n1285,1935\n1285,1955\n1285,2208\n1285,2417\n1285,2512\n1285,2518\n1285,2590\n1285,2620\n1285,2775\n1285,2991\n1285,3028\n1285,3135\n1285,3585\n1285,4179\n1285,4308\n1285,4619\n1285,5242\n1285,5278\n1285,5398\n1285,5407\n1285,5412\n1285,5693\n1285,5718\n1285,5765\n1285,6824\n1285,6837\n1285,7728\n1285,7812\n1285,8537\n1285,9015\n1285,9178\n1285,11147\n1285,11952\n1285,13296\n1285,13478\n1285,13637\n1285,14195\n1285,14243\n1285,14487\n1285,14723\n1285,15169\n1285,15325\n1285,15952\n1285,16684\n1285,19617\n1285,19868\n1285,20038\n1285,20287\n1285,20813\n1285,21964\n1285,23102\n1285,23382\n1285,25800\n1285,26781\n1285,28289\n1285,28314\n1285,28553\n1285,32751\n1285,33147\n1285,34139\n1285,38232\n1285,40850\n1285,42599\n1285,43247\n1285,43846\n1285,44330\n1285,46302\n1285,47173\n1285,47750\n1285,47751\n1285,47753\n1285,47757\n1285,47758\n1285,47760\n1285,47766\n1285,47767\n1285,47768\n1285,47770\n1285,49671\n1285,54551\n1285,60385\n1285,60467\n1285,62823\n1285,62903\n1285,65769\n1285,66572\n1285,68058\n1285,73231\n1285,75184\n1285,75912\n1285,79619\n1285,85931\n1285,89690\n1285,93959\n1285,96342\n1285,98922\n1285,102001\n1285,102797\n1285,103052\n1285,106214\n1285,106222\n1285,106224\n1285,106229\n1285,106234\n1285,106245\n1285,109587\n1285,110070\n1285,110088\n1285,110092\n1285,110100\n1285,110105\n1285,110555\n1285,112530\n1285,113760\n1285,113939\n1285,113982\n1285,113987\n1285,113989\n1285,113991\n1285,114092\n1285,114127\n1285,114135\n1285,114679\n1285,116598\n1285,118144\n1285,118224\n1285,118362\n1285,118523\n1285,118542\n1285,118544\n1285,118548\n1285,118552\n1285,118560\n1285,119064\n1285,120199\n1285,121573\n1285,121921\n1285,123439\n1285,124651\n1285,125115\n1285,125953\n1285,127158\n1285,127414\n1285,127424\n1285,127429\n1285,128159\n1285,128163\n1285,128752\n1285,128769\n1285,130463\n1285,130546\n1285,132604\n1285,133955\n1285,133988\n1285,134140\n1285,134276\n1285,134576\n1285,135072\n1285,135083\n1285,135107\n1285,135216\n1285,135957\n1285,136529\n1285,136737\n1285,138318\n1285,138335\n1285,138349\n1285,139543\n1285,139652\n1285,139981\n1285,139993\n1285,144998\n1285,147812\n1285,148116\n1285,152960\n1285,152978\n1285,159425\n1285,161624\n1285,163961\n1285,165387\n1285,165451\n1285,168497\n1285,170032\n1285,174543\n1285,174987\n1285,185067\n1285,188887\n1285,192129\n1285,206230\n1285,206453\n1285,212899\n1285,219904\n1285,221666\n1285,225852\n1285,234745\n1285,235798\n1285,238121\n1285,247366\n1285,256802\n1285,256986\n1286,1287\n1287,9005\n1288,1289\n1289,314\n1289,599\n1289,838\n1289,992\n1289,1011\n1289,1289\n1289,1293\n1290,1\n1290,206\n1290,438\n1290,996\n1290,1096\n1291,83\n1292,516\n1292,1175\n1293,10\n1293,20\n1293,37\n1293,46\n1293,106\n1293,126\n1293,140\n1293,163\n1293,167\n1293,186\n1293,192\n1293,195\n1293,207\n1293,259\n1293,299\n1293,301\n1293,302\n1293,314\n1293,336\n1293,372\n1293,397\n1293,441\n1293,444\n1293,446\n1293,452\n1293,457\n1293,497\n1293,505\n1293,567\n1293,599\n1293,604\n1293,605\n1293,615\n1293,631\n1293,663\n1293,668\n1293,673\n1293,676\n1293,685\n1293,698\n1293,717\n1293,764\n1293,808\n1293,811\n1293,812\n1293,813\n1293,838\n1293,843\n1293,849\n1293,918\n1293,929\n1293,937\n1293,957\n1293,968\n1293,972\n1293,1001\n1293,1011\n1293,1014\n1293,1027\n1293,1037\n1293,1045\n1293,1118\n1293,1130\n1293,1160\n1293,1172\n1293,1191\n1293,1192\n1293,1204\n1293,1210\n1293,1231\n1293,1262\n1293,1267\n1293,1284\n1293,1289\n1293,1293\n1293,1300\n1293,1345\n1293,1359\n1293,1402\n1293,1417\n1293,1436\n1293,1551\n1293,1564\n1293,1566\n1293,1627\n1293,1655\n1293,1663\n1293,1664\n1293,1724\n1293,1740\n1293,1782\n1293,1796\n1293,1815\n1293,1844\n1293,1848\n1293,1849\n1293,1985\n1293,1992\n1293,2105\n1293,2217\n1293,2224\n1293,2253\n1293,2312\n1293,2373\n1293,2470\n1293,2511\n1293,2512\n1293,2699\n1293,3370\n1293,3392\n1293,3422\n1293,3524\n1293,3756\n1293,3804\n1293,3809\n1293,3871\n1293,4066\n1293,4159\n1293,4165\n1293,4170\n1293,4173\n1293,4190\n1293,4253\n1293,4276\n1293,4286\n1293,4303\n1293,4514\n1293,4598\n1293,5213\n1293,5376\n1293,5662\n1293,5809\n1293,5851\n1293,6431\n1293,6470\n1293,6833\n1293,6904\n1293,6938\n1293,7140\n1293,7222\n1293,7986\n1293,8107\n1293,9340\n1293,9457\n1293,13523\n1293,14196\n1293,14414\n1293,14598\n1293,14674\n1293,15588\n1293,16192\n1293,16667\n1293,17073\n1293,17894\n1293,18098\n1293,18688\n1293,20327\n1293,20328\n1293,20550\n1293,20757\n1293,21528\n1293,21589\n1293,22423\n1293,23848\n1293,25062\n1293,25273\n1293,26201\n1293,26450\n1293,28128\n1293,28266\n1293,28348\n1293,28498\n1293,28854\n1293,30396\n1293,33735\n1293,34162\n1293,34193\n1293,37453\n1293,38349\n1293,38994\n1293,41871\n1293,42206\n1293,42595\n1293,42598\n1293,46792\n1293,48130\n1293,50559\n1293,59066\n1293,60375\n1293,62983\n1293,63081\n1293,63491\n1293,70028\n1293,70395\n1293,72548\n1293,72720\n1293,73355\n1293,74577\n1293,75144\n1293,75394\n1293,75912\n1293,76208\n1293,76704\n1293,76971\n1293,79528\n1293,80060\n1293,80062\n1293,80379\n1293,82099\n1293,83174\n1293,83233\n1293,84160\n1293,88469\n1293,90762\n1293,92836\n1293,94845\n1293,96631\n1293,96827\n1293,99802\n1293,102698\n1293,103860\n1293,108048\n1293,109815\n1293,110616\n1293,111170\n1293,111239\n1293,117480\n1293,119246\n1293,119327\n1293,120115\n1293,120174\n1293,121920\n1293,121978\n1293,122870\n1293,122934\n1293,124017\n1293,124070\n1293,124495\n1293,124512\n1293,124874\n1293,126854\n1293,127418\n1293,128253\n1293,130762\n1293,130765\n1293,133992\n1293,134656\n1293,135274\n1293,136545\n1293,136551\n1293,145407\n1293,146306\n1293,147924\n1293,148796\n1293,149258\n1293,150434\n1293,150732\n1293,154993\n1293,155453\n1293,158153\n1293,158219\n1293,158247\n1293,158950\n1293,159728\n1293,160373\n1293,160739\n1293,160834\n1293,160923\n1293,170729\n1293,171626\n1293,171969\n1293,175033\n1293,175325\n1293,176407\n1293,178012\n1293,180244\n1293,181853\n1293,182334\n1293,182861\n1293,185320\n1293,189303\n1293,191785\n1293,193976\n1293,194616\n1293,195174\n1293,199277\n1293,207659\n1293,207757\n1293,211882\n1293,212380\n1293,215874\n1293,216095\n1293,216540\n1293,217511\n1293,219847\n1293,221063\n1293,221688\n1293,221700\n1293,221828\n1293,221920\n1293,222652\n1293,224497\n1293,226275\n1293,226292\n1293,227376\n1293,231939\n1293,234257\n1293,236866\n1293,237391\n1293,241511\n1293,241697\n1293,243178\n1293,247100\n1293,247366\n1293,247902\n1293,248638\n1293,252650\n1293,254822\n1293,257364\n1293,258165\n1293,260874\n1293,261678\n1293,263043\n1294,20\n1294,178\n1294,314\n1294,315\n1294,346\n1294,356\n1294,397\n1294,434\n1294,435\n1294,439\n1294,440\n1294,447\n1294,538\n1294,599\n1294,671\n1294,676\n1294,766\n1294,783\n1294,934\n1294,939\n1294,996\n1294,1033\n1294,1068\n1294,1294\n1294,1295\n1294,1328\n1294,1409\n1294,1474\n1294,1590\n1294,1612\n1294,1619\n1294,1644\n1294,1651\n1294,1789\n1294,1877\n1294,2030\n1294,2085\n1294,2094\n1294,2102\n1294,2224\n1294,2352\n1294,2353\n1294,2427\n1294,2590\n1294,2777\n1294,2782\n1294,3990\n1294,4190\n1294,4461\n1294,4646\n1294,5078\n1294,5189\n1294,5460\n1294,5563\n1294,6268\n1294,6422\n1294,6586\n1294,6607\n1294,6648\n1294,6661\n1294,6883\n1294,8196\n1294,8477\n1294,14111\n1294,14428\n1294,14739\n1294,15141\n1294,15179\n1294,15355\n1294,15563\n1294,17423\n1294,17427\n1294,18124\n1294,18613\n1294,19191\n1294,20539\n1294,21152\n1294,21442\n1294,24934\n1294,25384\n1294,26972\n1294,28425\n1294,30775\n1294,32468\n1294,32745\n1294,34935\n1294,35082\n1294,37000\n1294,38158\n1294,38420\n1294,41449\n1294,41804\n1294,41926\n1294,44348\n1294,44990\n1294,46171\n1294,46717\n1294,48290\n1294,52792\n1294,54295\n1294,56474\n1294,58239\n1294,58820\n1294,62984\n1294,64061\n1294,65709\n1294,103720\n1294,103772\n1294,103860\n1294,105721\n1294,106377\n1294,113469\n1294,114282\n1294,120155\n1294,120826\n1294,122562\n1294,123594\n1294,124440\n1294,126696\n1294,128831\n1294,128874\n1294,129955\n1294,133112\n1294,135980\n1294,135992\n1294,135993\n1294,135994\n1294,135995\n1294,135996\n1294,135997\n1294,135998\n1294,136000\n1294,136005\n1294,136006\n1294,136007\n1294,136008\n1294,136010\n1294,138019\n1294,138020\n1294,138021\n1294,138022\n1294,138023\n1294,138024\n1294,138025\n1294,138026\n1294,138027\n1294,146396\n1294,160834\n1294,163378\n1294,169627\n1294,170478\n1294,171015\n1294,176816\n1294,177776\n1294,189147\n1294,189169\n1294,189814\n1294,190182\n1294,190242\n1294,190456\n1294,190492\n1294,192036\n1294,192451\n1294,194457\n1294,205359\n1294,211944\n1294,213607\n1294,213890\n1294,214042\n1294,214160\n1294,214872\n1294,214878\n1294,215226\n1294,215262\n1294,216376\n1294,218112\n1294,221094\n1294,223355\n1294,226393\n1294,227172\n1294,228310\n1294,231001\n1294,233562\n1294,243353\n1294,244189\n1294,247107\n1294,249749\n1295,1294\n1296,611\n1296,255750\n1297,907\n1297,972\n1297,973\n1297,1010\n1297,1298\n1297,1749\n1297,1849\n1297,72764\n1298,10\n1298,11\n1298,86\n1298,126\n1298,167\n1298,186\n1298,256\n1298,264\n1298,299\n1298,301\n1298,314\n1298,356\n1298,440\n1298,446\n1298,452\n1298,457\n1298,459\n1298,563\n1298,599\n1298,631\n1298,663\n1298,664\n1298,666\n1298,673\n1298,693\n1298,720\n1298,744\n1298,783\n1298,818\n1298,907\n1298,937\n1298,972\n1298,973\n1298,982\n1298,991\n1298,1001\n1298,1010\n1298,1011\n1298,1033\n1298,1052\n1298,1118\n1298,1122\n1298,1167\n1298,1267\n1298,1284\n1298,1297\n1298,1298\n1298,1360\n1298,1370\n1298,1436\n1298,1453\n1298,1531\n1298,1559\n1298,1566\n1298,1591\n1298,1616\n1298,1659\n1298,1732\n1298,1740\n1298,1749\n1298,1796\n1298,1837\n1298,1849\n1298,1853\n1298,1973\n1298,1991\n1298,2191\n1298,2253\n1298,2263\n1298,2266\n1298,2307\n1298,2312\n1298,2334\n1298,2595\n1298,2610\n1298,2625\n1298,2728\n1298,2747\n1298,2979\n1298,2989\n1298,2991\n1298,3023\n1298,3392\n1298,3585\n1298,3756\n1298,3838\n1298,3965\n1298,4066\n1298,4183\n1298,4243\n1298,4286\n1298,4315\n1298,4359\n1298,4381\n1298,4413\n1298,4696\n1298,5130\n1298,5185\n1298,5654\n1298,5747\n1298,5851\n1298,6194\n1298,6685\n1298,6695\n1298,7130\n1298,7349\n1298,7388\n1298,7530\n1298,7936\n1298,8051\n1298,8240\n1298,9766\n1298,13657\n1298,13761\n1298,13771\n1298,14484\n1298,14497\n1298,15183\n1298,15253\n1298,15330\n1298,15409\n1298,15674\n1298,15754\n1298,16320\n1298,17840\n1298,19874\n1298,21753\n1298,22148\n1298,23844\n1298,24579\n1298,26219\n1298,26409\n1298,28716\n1298,28785\n1298,30376\n1298,30484\n1298,31283\n1298,31900\n1298,32784\n1298,33083\n1298,34073\n1298,34140\n1298,34282\n1298,35065\n1298,35470\n1298,36652\n1298,36662\n1298,36670\n1298,37556\n1298,37771\n1298,38996\n1298,39047\n1298,39979\n1298,41315\n1298,41549\n1298,41880\n1298,42158\n1298,42803\n1298,43137\n1298,43193\n1298,43207\n1298,43288\n1298,43875\n1298,44738\n1298,45448\n1298,46236\n1298,48662\n1298,49005\n1298,49023\n1298,49024\n1298,49031\n1298,49057\n1298,49105\n1298,49116\n1298,51684\n1298,52539\n1298,55222\n1298,55231\n1298,56365\n1298,56370\n1298,56520\n1298,57158\n1298,57209\n1298,58282\n1298,58486\n1298,58547\n1298,59162\n1298,59226\n1298,59675\n1298,59934\n1298,62814\n1298,64154\n1298,64457\n1298,65379\n1298,68700\n1298,70237\n1298,72764\n1298,73827\n1298,80137\n1298,80659\n1298,80771\n1298,82055\n1298,82257\n1298,86478\n1298,89937\n1298,90183\n1298,91190\n1298,91488\n1298,95576\n1298,97423\n1298,98227\n1298,99642\n1298,99825\n1298,100376\n1298,101681\n1298,105731\n1298,106153\n1298,106253\n1298,107162\n1298,110813\n1298,114583\n1298,114682\n1298,114852\n1298,114862\n1298,117090\n1298,118710\n1298,118806\n1298,124503\n1298,127919\n1298,128822\n1298,130455\n1298,131652\n1298,132012\n1298,136233\n1298,136560\n1298,136654\n1298,138914\n1298,139389\n1298,140331\n1298,142287\n1298,142532\n1298,143094\n1298,146671\n1298,146893\n1298,148438\n1298,154490\n1298,156994\n1298,157760\n1298,158335\n1298,159873\n1298,160409\n1298,161385\n1298,163898\n1298,167096\n1298,167161\n1298,173373\n1298,174022\n1298,174470\n1298,175268\n1298,175902\n1298,175907\n1298,175979\n1298,177030\n1298,177044\n1298,177463\n1298,179141\n1298,179169\n1298,179409\n1298,181145\n1298,182091\n1298,182520\n1298,187176\n1298,193022\n1298,193096\n1298,197475\n1298,201086\n1298,201938\n1298,202770\n1298,203168\n1298,212969\n1298,214648\n1298,214698\n1298,216659\n1298,216692\n1298,216699\n1298,216702\n1298,217340\n1298,222723\n1298,222834\n1298,223438\n1298,224496\n1298,224767\n1298,231339\n1298,233614\n1298,237320\n1298,237621\n1298,243971\n1298,244191\n1298,247201\n1298,253723\n1298,254445\n1298,257027\n1298,258952\n1298,261572\n1299,536\n1299,1571\n1299,2979\n1300,10\n1300,299\n1300,301\n1300,372\n1300,459\n1300,534\n1300,604\n1300,615\n1300,693\n1300,744\n1300,783\n1300,937\n1300,968\n1300,973\n1300,1011\n1300,1160\n1300,1231\n1300,1284\n1300,1293\n1300,1300\n1300,1436\n1300,1853\n1300,1949\n1300,1973\n1300,3422\n1300,3630\n1300,5186\n1300,5662\n1300,6711\n1300,13523\n1300,15277\n1300,15511\n1300,15588\n1300,15665\n1300,17894\n1300,20327\n1300,23669\n1300,23848\n1300,25685\n1300,31208\n1300,31414\n1300,40541\n1300,42598\n1300,47767\n1300,50503\n1300,59188\n1300,66594\n1300,73342\n1300,80009\n1300,83512\n1300,84160\n1300,85174\n1300,96685\n1300,101551\n1300,103860\n1300,122451\n1300,127858\n1300,131355\n1300,140756\n1300,142645\n1300,143411\n1300,145126\n1300,145127\n1300,145130\n1300,146801\n1300,148427\n1300,169482\n1300,171626\n1300,172943\n1300,174279\n1300,174834\n1300,174838\n1300,174839\n1300,183990\n1300,185398\n1300,189711\n1300,218884\n1300,222652\n1300,224021\n1300,225329\n1300,226604\n1300,228288\n1300,231070\n1300,239076\n1300,243076\n1300,244594\n1300,245287\n1300,249217\n1301,563\n1302,392\n1302,644\n1302,779\n1302,918\n1303,313\n1303,788\n1304,1305\n1305,30\n1305,6084\n1305,23555\n1305,27892\n1305,28049\n1306,10\n1306,113156\n1308,1309\n1309,10\n1309,11\n1309,72\n1309,104\n1309,175\n1309,240\n1309,261\n1309,356\n1309,372\n1309,446\n1309,599\n1309,611\n1309,631\n1309,677\n1309,685\n1309,693\n1309,771\n1309,772\n1309,818\n1309,838\n1309,852\n1309,911\n1309,1011\n1309,1082\n1309,1130\n1309,1172\n1309,1203\n1309,1285\n1309,1308\n1309,1309\n1309,1435\n1309,1807\n1309,1822\n1309,1888\n1309,1955\n1309,2208\n1309,2228\n1309,2512\n1309,2729\n1309,2775\n1309,2812\n1309,2841\n1309,2989\n1309,2991\n1309,3135\n1309,3370\n1309,3507\n1309,3570\n1309,3619\n1309,4190\n1309,4267\n1309,6822\n1309,6856\n1309,7718\n1309,7915\n1309,8619\n1309,9015\n1309,9025\n1309,11346\n1309,13395\n1309,14207\n1309,14511\n1309,14613\n1309,15227\n1309,16310\n1309,17073\n1309,18013\n1309,18890\n1309,19168\n1309,19622\n1309,20803\n1309,22272\n1309,23382\n1309,23496\n1309,23634\n1309,23735\n1309,24814\n1309,24839\n1309,25631\n1309,26018\n1309,26267\n1309,26905\n1309,26967\n1309,28553\n1309,29854\n1309,31777\n1309,32721\n1309,34149\n1309,34515\n1309,45507\n1309,46199\n1309,47173\n1309,48965\n1309,49283\n1309,49350\n1309,52539\n1309,55873\n1309,56979\n1309,66918\n1309,69019\n1309,78199\n1309,88328\n1309,97934\n1309,100139\n1309,101862\n1309,102747\n1309,104585\n1309,105721\n1309,113137\n1309,116613\n1309,116995\n1309,119939\n1309,121445\n1309,121809\n1309,128121\n1309,161642\n1309,164964\n1309,171027\n1309,173397\n1309,173398\n1309,174543\n1309,174987\n1309,179049\n1309,179395\n1309,182465\n1309,182913\n1309,183871\n1309,186113\n1309,190162\n1309,206022\n1309,212603\n1309,212899\n1309,214154\n1309,215186\n1309,223889\n1309,224533\n1309,233743\n1309,245155\n1309,247075\n1309,247214\n1309,249062\n1309,249502\n1309,261795\n1309,263991\n1310,54\n1310,385\n1310,1539\n1310,2421\n1311,252\n1311,41170\n1312,50\n1312,273\n1312,274\n1312,333\n1312,457\n1312,459\n1312,483\n1312,668\n1312,673\n1312,707\n1312,712\n1312,713\n1312,784\n1312,808\n1312,838\n1312,852\n1312,980\n1312,1122\n1312,1130\n1312,1285\n1312,1313\n1312,1718\n1312,1837\n1312,1927\n1312,2744\n1312,3967\n1312,30331\n1312,66552\n1313,34\n1313,35\n1313,83\n1313,187\n1313,313\n1313,338\n1313,389\n1313,462\n1313,634\n1313,693\n1313,1083\n1313,1313\n1313,1718\n1313,2159\n1313,2224\n1313,2488\n1313,2646\n1313,4039\n1313,4223\n1313,5326\n1313,6900\n1313,14107\n1313,14857\n1313,15427\n1313,15545\n1313,16598\n1313,21382\n1313,21589\n1313,23442\n1313,25563\n1313,25569\n1313,25572\n1313,25574\n1313,25577\n1313,26072\n1313,32050\n1313,32479\n1313,32535\n1313,34863\n1313,34910\n1313,35462\n1313,39462\n1313,41281\n1313,55225\n1313,56533\n1313,66360\n1313,76960\n1313,81511\n1313,81947\n1313,82029\n1313,82556\n1313,115128\n1313,122941\n1313,161588\n1313,161948\n1313,172062\n1313,172192\n1313,186608\n1313,197791\n1313,236740\n1313,241969\n1313,242337\n1313,243997\n1313,248582\n1313,257251\n1313,259005\n1313,259027\n1313,260330\n1314,1315\n1316,1\n1316,107\n1316,151\n1316,187\n1316,313\n1316,347\n1316,424\n1316,467\n1316,736\n1316,795\n1316,920\n1316,957\n1316,980\n1316,1012\n1316,1133\n1316,1140\n1316,1370\n1316,1815\n1316,1955\n1318,843\n1319,86\n1319,167\n1319,299\n1319,301\n1319,356\n1319,446\n1319,528\n1319,632\n1319,663\n1319,664\n1319,685\n1319,693\n1319,715\n1319,783\n1319,832\n1319,911\n1319,941\n1319,1167\n1319,1241\n1319,1319\n1319,1436\n1319,1459\n1319,1479\n1319,1522\n1319,1544\n1319,1623\n1319,1848\n1319,2083\n1319,2372\n1319,2775\n1319,2874\n1319,3207\n1319,3218\n1319,5301\n1319,5356\n1319,6883\n1319,7087\n1319,8386\n1319,13252\n1319,14080\n1319,14674\n1319,15264\n1319,15380\n1319,18668\n1319,21249\n1319,23755\n1319,27166\n1319,28289\n1319,29758\n1319,32810\n1319,34234\n1319,34515\n1319,35531\n1319,36685\n1319,38167\n1319,38212\n1319,39111\n1319,41621\n1319,42779\n1319,43686\n1319,45585\n1319,45623\n1319,48345\n1319,58173\n1319,58208\n1319,61167\n1319,61213\n1319,63193\n1319,63421\n1319,65681\n1319,65951\n1319,67588\n1319,68369\n1319,70249\n1319,73570\n1319,78746\n1319,82031\n1319,82039\n1319,91791\n1319,109945\n1319,110118\n1319,117290\n1319,117818\n1319,125962\n1319,130798\n1319,143993\n1319,147726\n1319,150458\n1319,152511\n1319,158242\n1319,169002\n1319,169071\n1319,170040\n1319,176836\n1319,176916\n1319,181729\n1319,199199\n1319,207045\n1319,217503\n1319,237322\n1319,244566\n1320,783\n1320,1130\n1320,1849\n1321,32\n1321,140\n1321,515\n1321,1381\n1321,2017\n1321,2626\n1322,1323\n1323,102\n1323,408\n1323,518\n1323,852\n1323,1113\n1323,1323\n1323,1326\n1323,19274\n1323,63049\n1323,81693\n1323,131908\n1323,160846\n1323,164530\n1323,169085\n1323,176474\n1323,234673\n1323,262612\n1323,264549\n1324,102\n1325,1326\n1326,68\n1326,102\n1326,167\n1326,186\n1326,240\n1326,287\n1326,292\n1326,301\n1326,314\n1326,356\n1326,388\n1326,408\n1326,435\n1326,440\n1326,452\n1326,457\n1326,467\n1326,518\n1326,599\n1326,626\n1326,631\n1326,673\n1326,676\n1326,765\n1326,775\n1326,780\n1326,808\n1326,838\n1326,843\n1326,849\n1326,852\n1326,1001\n1326,1011\n1326,1014\n1326,1085\n1326,1096\n1326,1113\n1326,1118\n1326,1119\n1326,1122\n1326,1130\n1326,1133\n1326,1140\n1326,1160\n1326,1282\n1326,1284\n1326,1293\n1326,1323\n1326,1326\n1326,1345\n1326,1411\n1326,1417\n1326,1531\n1326,1545\n1326,1566\n1326,1599\n1326,1603\n1326,1612\n1326,1663\n1326,1715\n1326,1732\n1326,1746\n1326,1796\n1326,1849\n1326,1853\n1326,1955\n1326,1986\n1326,2045\n1326,2334\n1326,2511\n1326,2733\n1326,3166\n1326,3193\n1326,3351\n1326,3407\n1326,3455\n1326,3555\n1326,3718\n1326,3804\n1326,4165\n1326,4213\n1326,4222\n1326,4514\n1326,4602\n1326,4614\n1326,5008\n1326,5129\n1326,5130\n1326,5382\n1326,5385\n1326,5388\n1326,5623\n1326,5851\n1326,6400\n1326,6579\n1326,6587\n1326,6638\n1326,6904\n1326,7170\n1326,7431\n1326,7548\n1326,7766\n1326,7776\n1326,7840\n1326,7842\n1326,7959\n1326,8011\n1326,8435\n1326,8923\n1326,13217\n1326,13624\n1326,13787\n1326,14158\n1326,14196\n1326,14311\n1326,14563\n1326,14572\n1326,14674\n1326,14754\n1326,15109\n1326,16551\n1326,16681\n1326,17607\n1326,18137\n1326,18167\n1326,18186\n1326,18221\n1326,18249\n1326,19290\n1326,19421\n1326,19598\n1326,20020\n1326,20339\n1326,20350\n1326,20426\n1326,20663\n1326,21607\n1326,21783\n1326,22440\n1326,22450\n1326,23050\n1326,23337\n1326,23437\n1326,23526\n1326,23850\n1326,24924\n1326,25573\n1326,25657\n1326,25687\n1326,26129\n1326,26754\n1326,30567\n1326,31402\n1326,32516\n1326,32870\n1326,34417\n1326,34767\n1326,35361\n1326,35948\n1326,36969\n1326,37602\n1326,37674\n1326,38280\n1326,38300\n1326,38475\n1326,38956\n1326,39112\n1326,39232\n1326,40457\n1326,41345\n1326,41394\n1326,42432\n1326,43150\n1326,46796\n1326,46807\n1326,47114\n1326,47708\n1326,48006\n1326,48505\n1326,49102\n1326,49576\n1326,52163\n1326,52945\n1326,52955\n1326,55060\n1326,55185\n1326,55639\n1326,55816\n1326,57058\n1326,57073\n1326,58289\n1326,60598\n1326,62331\n1326,62616\n1326,62753\n1326,62758\n1326,63049\n1326,63372\n1326,63483\n1326,63979\n1326,64130\n1326,64682\n1326,64685\n1326,65420\n1326,65842\n1326,66486\n1326,67172\n1326,68337\n1326,68913\n1326,71725\n1326,75323\n1326,76008\n1326,76999\n1326,78749\n1326,78750\n1326,79942\n1326,81017\n1326,81042\n1326,81135\n1326,82757\n1326,83218\n1326,84860\n1326,86540\n1326,86759\n1326,87871\n1326,88120\n1326,88306\n1326,88355\n1326,89638\n1326,90347\n1326,90873\n1326,91488\n1326,91778\n1326,92039\n1326,93499\n1326,98507\n1326,101547\n1326,101573\n1326,102648\n1326,102659\n1326,103282\n1326,103692\n1326,103822\n1326,105731\n1326,106175\n1326,106190\n1326,106982\n1326,107067\n1326,110044\n1326,111207\n1326,113848\n1326,114232\n1326,114749\n1326,116260\n1326,118465\n1326,118904\n1326,121615\n1326,124957\n1326,127342\n1326,128147\n1326,128174\n1326,128787\n1326,128822\n1326,128865\n1326,128870\n1326,128872\n1326,129787\n1326,130352\n1326,130467\n1326,130914\n1326,131354\n1326,131371\n1326,131854\n1326,132992\n1326,133623\n1326,133984\n1326,135045\n1326,137768\n1326,138030\n1326,138331\n1326,140694\n1326,145008\n1326,145320\n1326,146661\n1326,147387\n1326,147390\n1326,147391\n1326,147430\n1326,147434\n1326,147436\n1326,147440\n1326,147446\n1326,147449\n1326,147450\n1326,147463\n1326,147466\n1326,147494\n1326,149247\n1326,152048\n1326,152272\n1326,152568\n1326,152933\n1326,153718\n1326,153768\n1326,155708\n1326,156727\n1326,157027\n1326,157030\n1326,157082\n1326,159334\n1326,160834\n1326,161190\n1326,161949\n1326,162708\n1326,164946\n1326,167083\n1326,168327\n1326,169685\n1326,170785\n1326,171341\n1326,171367\n1326,171368\n1326,172058\n1326,172194\n1326,172507\n1326,172602\n1326,172746\n1326,174992\n1326,175356\n1326,176024\n1326,176451\n1326,176838\n1326,179205\n1326,179375\n1326,179378\n1326,179783\n1326,180957\n1326,185048\n1326,185414\n1326,185933\n1326,187008\n1326,188232\n1326,188791\n1326,188925\n1326,190345\n1326,192558\n1326,193277\n1326,194074\n1326,196693\n1326,207516\n1326,212083\n1326,212711\n1326,214934\n1326,215874\n1326,216674\n1326,220093\n1326,223355\n1326,224407\n1326,225762\n1326,228045\n1326,229621\n1326,229634\n1326,230347\n1326,230396\n1326,232222\n1326,233518\n1326,233998\n1326,235995\n1326,236064\n1326,236690\n1326,237981\n1326,238995\n1326,241647\n1326,245246\n1326,245842\n1326,247323\n1326,248507\n1326,248517\n1326,250888\n1326,251898\n1326,252499\n1326,252566\n1326,253224\n1326,256554\n1326,258440\n1326,258889\n1326,259022\n1326,261503\n1326,261777\n1326,261839\n1326,263127\n1326,263254\n1327,408\n1328,106\n1328,336\n1328,447\n1328,505\n1328,752\n1328,1294\n1328,1370\n1328,1644\n1328,2775\n1328,2782\n1329,248\n1329,251\n1329,289\n1329,290\n1329,372\n1329,516\n1329,1179\n1329,1332\n1329,1531\n1329,1572\n1329,94134\n1329,144988\n1330,615\n1331,336\n1331,818\n1332,30\n1332,68\n1332,104\n1332,134\n1332,135\n1332,136\n1332,138\n1332,200\n1332,211\n1332,225\n1332,248\n1332,288\n1332,314\n1332,327\n1332,328\n1332,338\n1332,364\n1332,372\n1332,408\n1332,442\n1332,446\n1332,450\n1332,462\n1332,497\n1332,557\n1332,599\n1332,636\n1332,685\n1332,749\n1332,772\n1332,794\n1332,838\n1332,850\n1332,852\n1332,872\n1332,911\n1332,943\n1332,953\n1332,1065\n1332,1118\n1332,1140\n1332,1179\n1332,1262\n1332,1329\n1332,1332\n1332,1368\n1332,1415\n1332,1572\n1332,1653\n1332,1808\n1332,1844\n1332,1882\n1332,1893\n1332,1955\n1332,1980\n1332,2105\n1332,2123\n1332,2367\n1332,2580\n1332,2596\n1332,3247\n1332,3496\n1332,3606\n1332,3633\n1332,3719\n1332,3930\n1332,3975\n1332,4039\n1332,4072\n1332,4276\n1332,4294\n1332,4388\n1332,4509\n1332,4565\n1332,4679\n1332,5053\n1332,5215\n1332,5405\n1332,5423\n1332,5470\n1332,5472\n1332,5551\n1332,5579\n1332,5773\n1332,6308\n1332,6826\n1332,6880\n1332,7059\n1332,7214\n1332,7757\n1332,7806\n1332,7912\n1332,8133\n1332,8200\n1332,8276\n1332,8284\n1332,11147\n1332,13207\n1332,13220\n1332,13327\n1332,15078\n1332,16143\n1332,16309\n1332,18194\n1332,18465\n1332,20100\n1332,20357\n1332,20604\n1332,20717\n1332,24840\n1332,25229\n1332,26286\n1332,28244\n1332,28311\n1332,28346\n1332,29595\n1332,29736\n1332,29956\n1332,31889\n1332,32659\n1332,32778\n1332,32824\n1332,33279\n1332,33621\n1332,33753\n1332,34920\n1332,34938\n1332,34951\n1332,37414\n1332,37424\n1332,38650\n1332,38796\n1332,39500\n1332,40355\n1332,41912\n1332,41991\n1332,42006\n1332,45535\n1332,46261\n1332,46683\n1332,48425\n1332,48532\n1332,49372\n1332,54723\n1332,55416\n1332,56319\n1332,57222\n1332,58580\n1332,59877\n1332,59956\n1332,63532\n1332,64666\n1332,68779\n1332,70743\n1332,71770\n1332,71803\n1332,78650\n1332,78787\n1332,80168\n1332,80500\n1332,83523\n1332,83858\n1332,84640\n1332,85157\n1332,85767\n1332,85814\n1332,86050\n1332,87433\n1332,90903\n1332,92057\n1332,98818\n1332,99573\n1332,103533\n1332,103858\n1332,106361\n1332,108035\n1332,108087\n1332,110214\n1332,112975\n1332,114497\n1332,114928\n1332,118485\n1332,118581\n1332,119120\n1332,120155\n1332,121897\n1332,124074\n1332,128691\n1332,128897\n1332,130424\n1332,130890\n1332,130912\n1332,132879\n1332,133167\n1332,135426\n1332,136085\n1332,136086\n1332,136288\n1332,136661\n1332,136816\n1332,140008\n1332,141061\n1332,143982\n1332,144133\n1332,145383\n1332,145658\n1332,145917\n1332,145920\n1332,150931\n1332,152179\n1332,153660\n1332,156591\n1332,160450\n1332,160996\n1332,163390\n1332,165750\n1332,168331\n1332,168359\n1332,169624\n1332,169994\n1332,170858\n1332,171023\n1332,171772\n1332,172223\n1332,174128\n1332,175938\n1332,182158\n1332,190276\n1332,192894\n1332,192951\n1332,194354\n1332,194912\n1332,205825\n1332,215059\n1332,217982\n1332,223363\n1332,226502\n1332,229059\n1332,232744\n1332,232950\n1332,235857\n1332,241193\n1332,241868\n1332,243519\n1332,247232\n1332,257009\n1332,263021\n1333,447\n1333,788\n1334,26\n1334,59\n1334,885\n1334,994\n1334,1235\n1334,1335\n1334,2674\n1334,21944\n1335,441\n1335,446\n1335,673\n1335,25908\n1335,70403\n1335,70506\n1335,91406\n1335,165141\n1336,22\n1336,515\n1337,86\n1338,1339\n1340,364\n1340,450\n1341,140\n1341,338\n1341,515\n1341,647\n1341,872\n1341,918\n1341,991\n1341,1052\n1341,1127\n1341,1224\n1341,1267\n1341,1509\n1341,1551\n1341,1579\n1341,1707\n1341,2605\n1341,3367\n1341,49057\n1341,81070\n1342,287\n1342,809\n1343,233\n1344,702\n1344,703\n1345,3\n1345,79\n1345,182\n1345,256\n1345,259\n1345,292\n1345,314\n1345,356\n1345,358\n1345,388\n1345,397\n1345,452\n1345,457\n1345,467\n1345,500\n1345,509\n1345,510\n1345,534\n1345,599\n1345,623\n1345,673\n1345,676\n1345,685\n1345,697\n1345,822\n1345,843\n1345,849\n1345,852\n1345,868\n1345,875\n1345,911\n1345,918\n1345,1011\n1345,1014\n1345,1021\n1345,1043\n1345,1113\n1345,1191\n1345,1192\n1345,1204\n1345,1222\n1345,1235\n1345,1326\n1345,1345\n1345,1417\n1345,1424\n1345,1559\n1345,1566\n1345,1584\n1345,1655\n1345,1663\n1345,1801\n1345,1860\n1345,1891\n1345,1973\n1345,1992\n1345,2045\n1345,2373\n1345,3182\n1345,3367\n1345,3732\n1345,3804\n1345,4231\n1345,5467\n1345,6638\n1345,6990\n1345,8063\n1345,8190\n1345,8483\n1345,9457\n1345,19413\n1345,19777\n1345,20695\n1345,20757\n1345,21267\n1345,26161\n1345,27060\n1345,28107\n1345,29102\n1345,29688\n1345,31080\n1345,36591\n1345,48505\n1345,49004\n1345,52453\n1345,58420\n1345,58735\n1345,79502\n1345,84559\n1345,102704\n1345,112033\n1345,118336\n1345,125054\n1345,127158\n1345,131808\n1345,137284\n1345,156379\n1345,162599\n1345,172614\n1345,176911\n1345,185281\n1345,187386\n1345,189762\n1345,191332\n1345,207659\n1345,215236\n1345,215874\n1345,216100\n1345,216170\n1345,217465\n1345,221055\n1345,221058\n1345,221067\n1345,221252\n1345,255494\n1345,263118\n1346,41\n1346,104\n1346,248\n1346,309\n1346,310\n1346,332\n1346,483\n1346,503\n1346,588\n1346,590\n1346,636\n1346,714\n1346,760\n1346,805\n1346,1119\n1346,1235\n1346,1282\n1346,1335\n1346,1462\n1346,1635\n1346,2205\n1346,2206\n1346,2209\n1346,8537\n1348,217\n1348,2266\n1349,723\n1350,149\n1350,859\n1350,932\n1350,155481\n1351,66\n1351,1433\n1352,1353\n1353,71\n1353,120\n1353,332\n1353,446\n1353,599\n1353,682\n1353,685\n1353,694\n1353,805\n1353,852\n1353,875\n1353,1352\n1353,1353\n1353,1466\n1353,1608\n1353,2224\n1353,2512\n1353,2775\n1353,3115\n1353,3867\n1353,4234\n1353,6068\n1353,8152\n1353,8156\n1353,9463\n1353,13251\n1353,14482\n1353,14820\n1353,15562\n1353,15587\n1353,15653\n1353,15673\n1353,15931\n1353,16102\n1353,16661\n1353,17159\n1353,18327\n1353,19857\n1353,20540\n1353,20757\n1353,22168\n1353,22939\n1353,27041\n1353,28338\n1353,28844\n1353,29038\n1353,30623\n1353,30939\n1353,32751\n1353,37440\n1353,41124\n1353,48254\n1353,48277\n1353,49647\n1353,49685\n1353,51794\n1353,53495\n1353,55681\n1353,56589\n1353,57583\n1353,68582\n1353,68708\n1353,72439\n1353,77554\n1353,77679\n1353,79286\n1353,79307\n1353,79966\n1353,80003\n1353,85859\n1353,91430\n1353,92867\n1353,98788\n1353,106759\n1353,119102\n1353,119625\n1353,124882\n1353,134118\n1353,134493\n1353,136501\n1353,138915\n1353,146825\n1353,146889\n1353,148835\n1353,155763\n1353,156432\n1353,157050\n1353,164424\n1353,164877\n1353,168263\n1353,169160\n1353,169582\n1353,172384\n1353,174612\n1353,176119\n1353,179722\n1353,180633\n1353,207126\n1353,216204\n1353,216645\n1353,226986\n1353,241113\n1353,241114\n1353,241179\n1353,241520\n1353,248420\n1353,251999\n1353,253109\n1354,438\n1355,97\n1355,301\n1355,535\n1355,1010\n1356,292\n1358,718\n1358,142409\n1359,37\n1359,240\n1359,289\n1359,290\n1359,604\n1359,609\n1359,615\n1359,677\n1359,682\n1359,715\n1359,752\n1359,780\n1359,784\n1359,805\n1359,911\n1359,1082\n1359,1257\n1359,1293\n1359,1359\n1359,1564\n1359,1566\n1359,1882\n1359,1888\n1359,2315\n1359,2316\n1359,2620\n1359,2775\n1359,3422\n1359,3672\n1359,3964\n1359,4222\n1359,4234\n1359,4532\n1359,4618\n1359,5439\n1359,5718\n1359,6178\n1359,6800\n1359,7220\n1359,8276\n1359,9550\n1359,13296\n1359,14139\n1359,15604\n1359,17210\n1359,18965\n1359,19755\n1359,20840\n1359,23710\n1359,24906\n1359,25467\n1359,26061\n1359,27949\n1359,36727\n1359,36939\n1359,46640\n1359,48589\n1359,55598\n1359,57354\n1359,58883\n1359,63102\n1359,64001\n1359,64855\n1359,66649\n1359,70395\n1359,72439\n1359,73355\n1359,74122\n1359,79412\n1359,89551\n1359,91974\n1359,93142\n1359,93148\n1359,104604\n1359,104608\n1359,113065\n1359,116935\n1359,119020\n1359,119923\n1359,125034\n1359,125042\n1359,133440\n1359,136012\n1359,139987\n1359,140326\n1359,148065\n1359,148066\n1359,148325\n1359,149279\n1359,150510\n1359,151051\n1359,156308\n1359,166704\n1359,168361\n1359,168365\n1359,168366\n1359,197730\n1359,204209\n1359,212354\n1359,215348\n1359,217507\n1359,219795\n1359,219807\n1359,222433\n1359,231533\n1359,236619\n1359,260216\n1360,299\n1360,720\n1360,907\n1360,1010\n1360,1117\n1360,1284\n1360,1298\n1360,2191\n1361,240\n1361,372\n1361,1285\n1361,1361\n1361,1955\n1361,3328\n1361,3770\n1362,1363\n1363,87\n1363,256\n1363,599\n1363,668\n1363,808\n1363,872\n1363,919\n1363,1011\n1363,1363\n1363,1465\n1363,2253\n1364,3\n1364,304\n1364,230509\n1364,230517\n1365,104\n1365,557\n1365,953\n1365,954\n1365,1939\n1366,147\n1366,192\n1366,195\n1366,336\n1367,22\n1367,222\n1367,596\n1367,1368\n1367,1429\n1368,30\n1368,104\n1368,111\n1368,134\n1368,136\n1368,137\n1368,138\n1368,200\n1368,254\n1368,287\n1368,431\n1368,450\n1368,557\n1368,596\n1368,612\n1368,617\n1368,632\n1368,685\n1368,715\n1368,749\n1368,772\n1368,784\n1368,843\n1368,852\n1368,911\n1368,1011\n1368,1052\n1368,1146\n1368,1332\n1368,1367\n1368,1368\n1368,1416\n1368,1432\n1368,1459\n1368,1607\n1368,1807\n1368,1973\n1368,2105\n1368,2373\n1368,2543\n1368,2565\n1368,2775\n1368,3247\n1368,3473\n1368,3504\n1368,3613\n1368,4024\n1368,4086\n1368,4276\n1368,4725\n1368,4761\n1368,7458\n1368,7757\n1368,7921\n1368,8599\n1368,13207\n1368,13506\n1368,15344\n1368,15470\n1368,15744\n1368,15764\n1368,16166\n1368,16263\n1368,16552\n1368,19786\n1368,19798\n1368,20515\n1368,20858\n1368,22105\n1368,22551\n1368,26051\n1368,26546\n1368,28191\n1368,28746\n1368,33406\n1368,33422\n1368,34963\n1368,37144\n1368,37771\n1368,37816\n1368,38144\n1368,38612\n1368,39618\n1368,42092\n1368,42918\n1368,45763\n1368,46687\n1368,48599\n1368,50745\n1368,58569\n1368,60095\n1368,60886\n1368,62239\n1368,63038\n1368,65995\n1368,70970\n1368,71385\n1368,71893\n1368,72639\n1368,72657\n1368,73380\n1368,73745\n1368,74387\n1368,76181\n1368,76704\n1368,78772\n1368,80935\n1368,81508\n1368,83737\n1368,84551\n1368,85814\n1368,87377\n1368,90903\n1368,94726\n1368,95554\n1368,95597\n1368,97196\n1368,99611\n1368,103216\n1368,104541\n1368,105591\n1368,105941\n1368,106152\n1368,108836\n1368,109528\n1368,110742\n1368,111340\n1368,113541\n1368,114064\n1368,118359\n1368,120155\n1368,122488\n1368,123121\n1368,125948\n1368,126995\n1368,128037\n1368,128144\n1368,128813\n1368,129762\n1368,129950\n1368,131952\n1368,133292\n1368,133619\n1368,134270\n1368,139782\n1368,140093\n1368,147433\n1368,150212\n1368,150625\n1368,150675\n1368,151595\n1368,152531\n1368,153068\n1368,153072\n1368,155226\n1368,156815\n1368,159071\n1368,159383\n1368,160501\n1368,162435\n1368,162599\n1368,163867\n1368,163887\n1368,163967\n1368,165701\n1368,165905\n1368,167644\n1368,167799\n1368,168841\n1368,169002\n1368,169350\n1368,170906\n1368,171886\n1368,172071\n1368,174964\n1368,174999\n1368,175964\n1368,180939\n1368,182345\n1368,184348\n1368,187334\n1368,188564\n1368,190276\n1368,192694\n1368,192769\n1368,192953\n1368,193195\n1368,194871\n1368,201799\n1368,206389\n1368,206453\n1368,208170\n1368,211745\n1368,211847\n1368,211871\n1368,213057\n1368,214733\n1368,216585\n1368,216656\n1368,216789\n1368,223781\n1368,223799\n1368,224168\n1368,230456\n1368,231033\n1368,233473\n1368,233603\n1368,233703\n1368,233984\n1368,234002\n1368,234067\n1368,234184\n1368,236308\n1368,238262\n1368,247521\n1368,248451\n1368,249092\n1368,250008\n1368,251331\n1368,253571\n1368,255567\n1368,255666\n1368,255669\n1368,255671\n1368,255672\n1368,255811\n1368,260925\n1368,261708\n1368,264017\n1368,264027\n1369,79\n1369,439\n1369,779\n1370,1\n1370,10\n1370,34\n1370,37\n1370,50\n1370,106\n1370,149\n1370,192\n1370,202\n1370,203\n1370,240\n1370,251\n1370,280\n1370,301\n1370,302\n1370,333\n1370,336\n1370,337\n1370,392\n1370,397\n1370,406\n1370,421\n1370,425\n1370,435\n1370,439\n1370,452\n1370,457\n1370,467\n1370,493\n1370,505\n1370,510\n1370,516\n1370,586\n1370,599\n1370,622\n1370,663\n1370,664\n1370,779\n1370,794\n1370,809\n1370,818\n1370,838\n1370,849\n1370,868\n1370,929\n1370,1014\n1370,1118\n1370,1175\n1370,1210\n1370,1220\n1370,1222\n1370,1298\n1370,1326\n1370,1328\n1370,1371\n1370,1417\n1370,1456\n1370,1531\n1370,1566\n1370,1619\n1370,1623\n1370,1796\n1370,1817\n1370,1821\n1370,1844\n1370,1973\n1370,1985\n1370,2173\n1370,2260\n1370,2400\n1370,2782\n1370,3258\n1370,4315\n1370,4514\n1370,5361\n1370,5563\n1370,6711\n1370,6904\n1370,7222\n1370,7243\n1370,8100\n1370,8244\n1370,8274\n1370,8854\n1370,9547\n1370,9579\n1370,14181\n1370,14396\n1370,14414\n1370,15113\n1370,15229\n1370,17245\n1370,18240\n1370,18698\n1370,19205\n1370,19863\n1370,20824\n1370,21264\n1370,21382\n1370,21387\n1370,21634\n1370,21736\n1370,23618\n1370,27573\n1370,28354\n1370,28545\n1370,28788\n1370,29854\n1370,32707\n1370,33584\n1370,36512\n1370,37769\n1370,39618\n1370,40782\n1370,40807\n1370,41535\n1370,42735\n1370,43238\n1370,43350\n1370,46325\n1370,46927\n1370,49121\n1370,50556\n1370,53726\n1370,55775\n1370,55917\n1370,58386\n1370,58820\n1370,66296\n1370,66527\n1370,67906\n1370,72575\n1370,72663\n1370,73442\n1370,74650\n1370,78905\n1370,80528\n1370,82255\n1370,82673\n1370,82747\n1370,87705\n1370,92476\n1370,94881\n1370,95677\n1370,99665\n1370,102560\n1370,102955\n1370,106502\n1370,107042\n1370,108135\n1370,110506\n1370,113517\n1370,114840\n1370,115127\n1370,119091\n1370,120155\n1370,120814\n1370,122404\n1370,122940\n1370,123970\n1370,127158\n1370,128803\n1370,129761\n1370,130059\n1370,131050\n1370,131248\n1370,133539\n1370,133549\n1370,135334\n1370,136303\n1370,138033\n1370,138034\n1370,141828\n1370,141949\n1370,144849\n1370,146001\n1370,154340\n1370,161255\n1370,161505\n1370,161631\n1370,162008\n1370,162599\n1370,169927\n1370,176524\n1370,178825\n1370,179804\n1370,183758\n1370,184043\n1370,184845\n1370,191355\n1370,192999\n1370,196377\n1370,199301\n1370,200644\n1370,204148\n1370,204645\n1370,207659\n1370,215408\n1370,217868\n1370,220905\n1370,225344\n1370,227385\n1370,232162\n1370,234832\n1370,238340\n1370,244572\n1370,245442\n1370,246029\n1370,249055\n1370,249680\n1370,250536\n1370,251857\n1370,254263\n1371,1370\n1372,1127\n1373,22\n1373,65\n1373,163\n1373,240\n1373,269\n1373,346\n1373,438\n1373,571\n1373,687\n1373,809\n1373,818\n1373,861\n1373,893\n1373,1363\n1373,1374\n1373,1433\n1373,1659\n1373,1782\n1373,1803\n1373,2017\n1373,2073\n1373,2312\n1373,4823\n1373,17309\n1373,21442\n1373,141912\n1373,162599\n1375,877\n1376,346\n1377,143\n1377,1052\n1377,142433\n1378,203\n1378,1379\n1379,1379\n1380,808\n1381,66\n1381,104\n1381,240\n1381,314\n1381,435\n1381,440\n1381,457\n1381,467\n1381,599\n1381,794\n1381,868\n1381,1011\n1381,1014\n1381,1033\n1381,1167\n1381,1345\n1381,1381\n1381,1415\n1381,1639\n1381,1722\n1381,1844\n1381,2178\n1381,2371\n1381,2979\n1381,4066\n1381,4545\n1381,56150\n1381,176041\n1382,305\n1382,35092\n1383,200\n1383,772\n1384,693\n1385,56\n1385,203\n1385,252\n1385,664\n1385,920\n1385,1181\n1385,1266\n1385,1386\n1385,1568\n1385,1678\n1385,2178\n1385,3569\n1385,3866\n1385,4476\n1385,5353\n1385,5631\n1385,6470\n1385,6501\n1385,8100\n1385,8606\n1385,9351\n1385,13226\n1385,13242\n1385,18234\n1385,18239\n1385,19457\n1385,20295\n1385,21944\n1385,22259\n1385,30514\n1385,34943\n1385,38300\n1385,39552\n1385,41170\n1385,46202\n1385,53472\n1385,57624\n1385,70146\n1385,73281\n1385,74481\n1385,111194\n1385,113709\n1385,116077\n1385,117889\n1385,117974\n1385,121910\n1385,137399\n1385,137724\n1385,146671\n1385,148143\n1385,148240\n1385,165354\n1385,172278\n1385,189842\n1385,193255\n1385,194749\n1385,194757\n1385,194759\n1385,199419\n1385,203883\n1385,204734\n1385,207087\n1385,224070\n1385,225080\n1385,233430\n1385,238788\n1385,238942\n1385,240667\n1385,241163\n1386,1385\n1386,44370\n1387,1388\n1388,186\n1388,192\n1388,259\n1388,272\n1388,364\n1388,577\n1388,663\n1388,685\n1388,694\n1388,715\n1388,726\n1388,749\n1388,788\n1388,795\n1388,843\n1388,859\n1388,980\n1388,999\n1388,1070\n1388,1089\n1388,1192\n1388,1387\n1388,1388\n1388,1531\n1388,1697\n1388,1808\n1388,1947\n1388,1995\n1388,2085\n1388,2802\n1388,3682\n1388,3740\n1388,4137\n1388,5106\n1388,5491\n1388,6154\n1388,8014\n1388,13481\n1388,14193\n1388,14571\n1388,15447\n1388,15462\n1388,15980\n1388,20283\n1388,20608\n1388,29885\n1388,30490\n1388,30684\n1388,31199\n1388,35486\n1388,35621\n1388,39245\n1388,45425\n1388,48883\n1388,48974\n1388,54578\n1388,54652\n1388,56971\n1388,69996\n1388,71022\n1388,71976\n1388,78667\n1388,79876\n1388,93659\n1388,109507\n1388,117031\n1388,117132\n1388,119368\n1388,120720\n1388,124972\n1388,126901\n1388,128378\n1388,128728\n1388,129954\n1388,135635\n1388,155659\n1388,161196\n1388,163037\n1388,163053\n1388,163384\n1388,177714\n1388,180386\n1388,181952\n1388,183979\n1388,186829\n1388,190043\n1388,198248\n1388,201265\n1388,204734\n1388,224763\n1389,861\n1389,1390\n1390,5652\n1390,8069\n1391,1293\n1391,1392\n1392,1392\n1393,934\n1395,261\n1395,590\n1395,1466\n1396,996\n1397,209\n1398,305\n1399,171\n1400,68\n1400,1400\n1400,1401\n1400,1408\n1400,2404\n1400,2430\n1400,2640\n1400,3887\n1400,4074\n1400,4200\n1400,4201\n1400,7780\n1400,8062\n1400,8186\n1400,13327\n1400,21343\n1400,21730\n1400,25531\n1400,28830\n1400,28939\n1400,36665\n1400,40039\n1400,41840\n1400,43157\n1400,47011\n1400,48629\n1400,59899\n1400,64040\n1400,72473\n1400,73384\n1400,76813\n1400,93605\n1400,93667\n1400,94357\n1400,98333\n1400,107446\n1400,124417\n1400,125887\n1400,128679\n1400,128920\n1400,136344\n1400,142052\n1400,148414\n1400,153573\n1400,153576\n1400,166439\n1400,169044\n1400,191788\n1400,216589\n1400,217434\n1400,217853\n1400,219523\n1400,219826\n1400,223921\n1400,224430\n1400,225734\n1400,225782\n1400,228123\n1400,229706\n1400,230389\n1400,230403\n1400,230449\n1400,231053\n1400,240482\n1400,261731\n1400,261755\n1401,868\n1401,1400\n1402,81\n1402,126\n1402,186\n1402,215\n1402,227\n1402,233\n1402,240\n1402,256\n1402,289\n1402,290\n1402,314\n1402,328\n1402,372\n1402,397\n1402,452\n1402,457\n1402,502\n1402,503\n1402,588\n1402,590\n1402,592\n1402,599\n1402,676\n1402,685\n1402,704\n1402,714\n1402,760\n1402,761\n1402,805\n1402,838\n1402,849\n1402,911\n1402,929\n1402,1014\n1402,1016\n1402,1085\n1402,1118\n1402,1149\n1402,1212\n1402,1257\n1402,1262\n1402,1282\n1402,1402\n1402,1417\n1402,1505\n1402,1511\n1402,1566\n1402,1631\n1402,1796\n1402,1818\n1402,1879\n1402,1882\n1402,1962\n1402,1973\n1402,2008\n1402,2205\n1402,2206\n1402,2210\n1402,2224\n1402,2286\n1402,2315\n1402,2373\n1402,2512\n1402,3069\n1402,3507\n1402,3513\n1402,3967\n1402,4165\n1402,4190\n1402,4218\n1402,4237\n1402,4276\n1402,4514\n1402,4532\n1402,4766\n1402,5116\n1402,5121\n1402,5192\n1402,5346\n1402,6824\n1402,6904\n1402,7117\n1402,8763\n1402,9001\n1402,9457\n1402,14459\n1402,14476\n1402,15397\n1402,18151\n1402,21290\n1402,22389\n1402,24561\n1402,30292\n1402,32939\n1402,33424\n1402,33672\n1402,37741\n1402,38394\n1402,39618\n1402,41395\n1402,43364\n1402,62482\n1402,68205\n1402,69440\n1402,74547\n1402,76704\n1402,77743\n1402,83899\n1402,92141\n1402,94134\n1402,96254\n1402,106274\n1402,109960\n1402,112503\n1402,127158\n1402,133652\n1402,136127\n1402,136437\n1402,139939\n1402,140556\n1402,143193\n1402,144988\n1402,165000\n1402,170732\n1402,172983\n1402,174315\n1402,177324\n1402,182162\n1402,184371\n1402,200770\n1402,201109\n1402,201118\n1402,201222\n1402,207659\n1402,215874\n1402,218497\n1402,245910\n1402,249055\n1402,255543\n1402,255549\n1404,422\n1405,907\n1406,217\n1408,1400\n1409,589\n1409,1294\n1410,1001\n1410,1177\n1410,1300\n1410,1411\n1412,211\n1412,225\n1412,349\n1413,1414\n1414,1414\n1415,19\n1415,30\n1415,104\n1415,135\n1415,137\n1415,138\n1415,200\n1415,225\n1415,294\n1415,328\n1415,364\n1415,442\n1415,446\n1415,557\n1415,943\n1415,1119\n1415,1332\n1415,1415\n1415,1432\n1415,1545\n1415,2105\n1415,2205\n1415,2418\n1415,3565\n1415,4114\n1415,4223\n1415,4276\n1415,4322\n1415,4941\n1415,5405\n1415,5423\n1415,6569\n1415,9529\n1415,15277\n1415,16309\n1415,21944\n1415,22148\n1415,22201\n1415,22243\n1415,28203\n1415,31215\n1415,33424\n1415,37771\n1415,61806\n1415,67127\n1415,73186\n1415,74071\n1415,74077\n1415,80711\n1415,82663\n1415,93168\n1415,94830\n1415,103749\n1415,103769\n1415,106392\n1415,129534\n1415,130857\n1415,132512\n1415,134704\n1415,134769\n1415,136072\n1415,170561\n1415,176032\n1415,176451\n1415,192367\n1415,215436\n1415,219799\n1415,220379\n1415,220615\n1415,220946\n1415,225316\n1415,238102\n1415,238997\n1415,243081\n1415,258347\n1415,262642\n1416,104\n1416,264\n1416,557\n1416,631\n1416,1282\n1416,16687\n1417,3\n1417,10\n1417,34\n1417,35\n1417,83\n1417,97\n1417,104\n1417,120\n1417,126\n1417,147\n1417,163\n1417,167\n1417,182\n1417,186\n1417,192\n1417,207\n1417,209\n1417,216\n1417,217\n1417,222\n1417,240\n1417,256\n1417,264\n1417,278\n1417,283\n1417,301\n1417,302\n1417,313\n1417,314\n1417,327\n1417,336\n1417,366\n1417,372\n1417,373\n1417,392\n1417,397\n1417,406\n1417,417\n1417,440\n1417,441\n1417,452\n1417,455\n1417,457\n1417,467\n1417,493\n1417,495\n1417,500\n1417,505\n1417,510\n1417,512\n1417,515\n1417,516\n1417,535\n1417,536\n1417,577\n1417,599\n1417,602\n1417,631\n1417,657\n1417,668\n1417,673\n1417,676\n1417,685\n1417,693\n1417,710\n1417,733\n1417,766\n1417,779\n1417,781\n1417,794\n1417,808\n1417,818\n1417,838\n1417,843\n1417,849\n1417,872\n1417,903\n1417,911\n1417,918\n1417,920\n1417,949\n1417,972\n1417,1007\n1417,1010\n1417,1011\n1417,1014\n1417,1019\n1417,1085\n1417,1089\n1417,1118\n1417,1130\n1417,1147\n1417,1151\n1417,1172\n1417,1181\n1417,1191\n1417,1192\n1417,1204\n1417,1210\n1417,1220\n1417,1222\n1417,1240\n1417,1250\n1417,1262\n1417,1282\n1417,1293\n1417,1298\n1417,1326\n1417,1348\n1417,1370\n1417,1402\n1417,1417\n1417,1445\n1417,1462\n1417,1472\n1417,1518\n1417,1531\n1417,1559\n1417,1566\n1417,1572\n1417,1586\n1417,1634\n1417,1705\n1417,1715\n1417,1722\n1417,1724\n1417,1749\n1417,1758\n1417,1796\n1417,1818\n1417,1825\n1417,1843\n1417,1844\n1417,1849\n1417,1853\n1417,1893\n1417,1916\n1417,1968\n1417,1973\n1417,1997\n1417,2069\n1417,2173\n1417,2181\n1417,2224\n1417,2228\n1417,2235\n1417,2253\n1417,2302\n1417,2307\n1417,2310\n1417,2334\n1417,2348\n1417,2373\n1417,2418\n1417,2512\n1417,2517\n1417,2775\n1417,2821\n1417,2989\n1417,2991\n1417,2992\n1417,2997\n1417,3035\n1417,3072\n1417,3199\n1417,3260\n1417,3330\n1417,3392\n1417,3436\n1417,3507\n1417,3582\n1417,3629\n1417,3672\n1417,3744\n1417,3804\n1417,3828\n1417,3866\n1417,3937\n1417,4066\n1417,4076\n1417,4166\n1417,4213\n1417,4223\n1417,4234\n1417,4244\n1417,4286\n1417,4355\n1417,4565\n1417,4672\n1417,4771\n1417,5061\n1417,5163\n1417,5178\n1417,5192\n1417,5208\n1417,5494\n1417,5631\n1417,5646\n1417,5656\n1417,5670\n1417,5827\n1417,6032\n1417,6452\n1417,6695\n1417,6790\n1417,6869\n1417,6955\n1417,7041\n1417,7118\n1417,7287\n1417,7301\n1417,7440\n1417,7775\n1417,7880\n1417,7891\n1417,8463\n1417,8606\n1417,9093\n1417,9138\n1417,9457\n1417,9484\n1417,9743\n1417,13306\n1417,13524\n1417,13606\n1417,13712\n1417,13980\n1417,14246\n1417,14410\n1417,14612\n1417,14623\n1417,15135\n1417,15245\n1417,15454\n1417,16357\n1417,17116\n1417,17318\n1417,17608\n1417,17837\n1417,18313\n1417,18433\n1417,18627\n1417,18956\n1417,18962\n1417,19005\n1417,19139\n1417,19307\n1417,19509\n1417,19716\n1417,19844\n1417,19859\n1417,20686\n1417,20738\n1417,20757\n1417,21382\n1417,21414\n1417,21825\n1417,22063\n1417,22378\n1417,22401\n1417,22430\n1417,22808\n1417,23087\n1417,23231\n1417,23407\n1417,23461\n1417,24632\n1417,24646\n1417,24653\n1417,24824\n1417,25469\n1417,25654\n1417,26133\n1417,26268\n1417,26479\n1417,26696\n1417,27808\n1417,28130\n1417,28353\n1417,28553\n1417,28977\n1417,29743\n1417,29828\n1417,30373\n1417,30478\n1417,30507\n1417,30601\n1417,30617\n1417,30735\n1417,30736\n1417,30843\n1417,31246\n1417,31280\n1417,31358\n1417,31963\n1417,32347\n1417,32625\n1417,32929\n1417,33135\n1417,33332\n1417,33558\n1417,34183\n1417,34390\n1417,34820\n1417,35963\n1417,36042\n1417,36978\n1417,36989\n1417,37852\n1417,38203\n1417,38565\n1417,38966\n1417,39537\n1417,39591\n1417,39684\n1417,39759\n1417,40531\n1417,40669\n1417,41019\n1417,41136\n1417,41258\n1417,41893\n1417,42186\n1417,42685\n1417,42761\n1417,42800\n1417,43225\n1417,43236\n1417,44304\n1417,44380\n1417,45229\n1417,45427\n1417,45492\n1417,45502\n1417,45639\n1417,46748\n1417,46839\n1417,47106\n1417,47121\n1417,47193\n1417,48034\n1417,48099\n1417,48124\n1417,48208\n1417,48564\n1417,48612\n1417,48718\n1417,48902\n1417,48951\n1417,49183\n1417,49753\n1417,50241\n1417,51126\n1417,51799\n1417,52539\n1417,52572\n1417,53927\n1417,54489\n1417,54543\n1417,54616\n1417,54910\n1417,55665\n1417,56791\n1417,58175\n1417,59012\n1417,59328\n1417,59344\n1417,59632\n1417,59805\n1417,59807\n1417,59809\n1417,59872\n1417,59998\n1417,61411\n1417,61425\n1417,62078\n1417,62241\n1417,62256\n1417,62261\n1417,62286\n1417,62289\n1417,62322\n1417,62405\n1417,62420\n1417,62477\n1417,62563\n1417,63458\n1417,63628\n1417,63683\n1417,66025\n1417,66703\n1417,67339\n1417,67391\n1417,68036\n1417,68126\n1417,68131\n1417,68164\n1417,68208\n1417,68229\n1417,68230\n1417,68241\n1417,69941\n1417,71668\n1417,73256\n1417,73287\n1417,74818\n1417,75295\n1417,75383\n1417,75912\n1417,76079\n1417,76305\n1417,76968\n1417,77563\n1417,78798\n1417,78911\n1417,80425\n1417,80488\n1417,80697\n1417,80948\n1417,80970\n1417,80975\n1417,81060\n1417,81062\n1417,81146\n1417,82217\n1417,83301\n1417,85710\n1417,86530\n1417,86673\n1417,86767\n1417,87839\n1417,88606\n1417,89055\n1417,89613\n1417,89722\n1417,89803\n1417,90389\n1417,90556\n1417,90959\n1417,91043\n1417,91398\n1417,92989\n1417,93662\n1417,94077\n1417,95030\n1417,95606\n1417,96520\n1417,97185\n1417,97309\n1417,97536\n1417,97540\n1417,97619\n1417,97825\n1417,98116\n1417,98275\n1417,98341\n1417,98603\n1417,98940\n1417,99873\n1417,101667\n1417,101735\n1417,102167\n1417,102495\n1417,102600\n1417,102604\n1417,102656\n1417,103529\n1417,105770\n1417,106874\n1417,107080\n1417,107081\n1417,107187\n1417,107194\n1417,107369\n1417,107610\n1417,107645\n1417,108565\n1417,109059\n1417,109953\n1417,110114\n1417,111164\n1417,111429\n1417,113305\n1417,115157\n1417,115296\n1417,115474\n1417,117015\n1417,117720\n1417,118057\n1417,118312\n1417,118835\n1417,118950\n1417,119053\n1417,119345\n1417,119666\n1417,120094\n1417,120155\n1417,120255\n1417,120449\n1417,121161\n1417,121213\n1417,121226\n1417,121619\n1417,122494\n1417,124469\n1417,124639\n1417,124709\n1417,124904\n1417,124977\n1417,124981\n1417,124983\n1417,124986\n1417,124991\n1417,124995\n1417,124999\n1417,125086\n1417,125150\n1417,125990\n1417,127102\n1417,127158\n1417,127237\n1417,128252\n1417,128770\n1417,130288\n1417,130819\n1417,130990\n1417,131452\n1417,131902\n1417,131936\n1417,132868\n1417,132878\n1417,132889\n1417,133580\n1417,134428\n1417,134633\n1417,134745\n1417,134929\n1417,136478\n1417,136781\n1417,138053\n1417,138631\n1417,138877\n1417,140021\n1417,140393\n1417,140650\n1417,141315\n1417,141868\n1417,142395\n1417,143424\n1417,144121\n1417,144925\n1417,144931\n1417,144958\n1417,145210\n1417,146294\n1417,147353\n1417,147513\n1417,147773\n1417,147901\n1417,147915\n1417,147998\n1417,149051\n1417,150867\n1417,151049\n1417,151067\n1417,151168\n1417,151666\n1417,151962\n1417,152717\n1417,153067\n1417,153619\n1417,154198\n1417,154404\n1417,155229\n1417,157487\n1417,158248\n1417,158286\n1417,158324\n1417,158349\n1417,158597\n1417,158788\n1417,158956\n1417,159033\n1417,159754\n1417,160353\n1417,160436\n1417,161017\n1417,161354\n1417,161753\n1417,161906\n1417,161924\n1417,161958\n1417,162026\n1417,162174\n1417,163128\n1417,163239\n1417,164282\n1417,165320\n1417,165599\n1417,166349\n1417,167629\n1417,167668\n1417,168979\n1417,169367\n1417,169743\n1417,170890\n1417,171291\n1417,171799\n1417,172111\n1417,172296\n1417,172512\n1417,172720\n1417,172723\n1417,173898\n1417,174188\n1417,174371\n1417,174655\n1417,175035\n1417,176370\n1417,176492\n1417,176835\n1417,176950\n1417,178718\n1417,178807\n1417,179033\n1417,180093\n1417,180908\n1417,182798\n1417,182816\n1417,182859\n1417,183813\n1417,183873\n1417,183920\n1417,184000\n1417,185436\n1417,185472\n1417,185717\n1417,186092\n1417,188733\n1417,189239\n1417,189291\n1417,190519\n1417,191420\n1417,191700\n1417,191876\n1417,193606\n1417,193672\n1417,194481\n1417,195271\n1417,198628\n1417,203890\n1417,204362\n1417,205273\n1417,205854\n1417,207610\n1417,207659\n1417,212432\n1417,212461\n1417,215110\n1417,215287\n1417,215933\n1417,216139\n1417,216622\n1417,216630\n1417,216723\n1417,216735\n1417,216744\n1417,216872\n1417,217210\n1417,217980\n1417,218877\n1417,219887\n1417,220376\n1417,220936\n1417,220939\n1417,222480\n1417,224327\n1417,228413\n1417,228741\n1417,229278\n1417,232148\n1417,232209\n1417,232215\n1417,233101\n1417,234244\n1417,234291\n1417,234862\n1417,239905\n1417,241028\n1417,243485\n1417,245364\n1417,249151\n1417,249928\n1417,252088\n1417,252514\n1417,254593\n1417,255398\n1417,258179\n1417,258499\n1417,263748\n1417,264410\n1417,264413\n1417,264542\n1418,34\n1418,35\n1418,217\n1418,222\n1418,283\n1418,455\n1418,536\n1418,862\n1418,996\n1418,1274\n1418,1419\n1418,1465\n1418,1466\n1418,1467\n1418,2274\n1418,3135\n1419,85\n1419,120\n1419,158\n1419,240\n1419,261\n1419,332\n1419,588\n1419,590\n1419,676\n1419,694\n1419,814\n1419,852\n1419,873\n1419,949\n1419,978\n1419,1353\n1419,1419\n1419,1466\n1419,1559\n1419,1608\n1419,1796\n1419,1808\n1419,1879\n1419,2619\n1419,2797\n1419,2812\n1419,2989\n1419,2991\n1419,3115\n1419,3319\n1419,3328\n1419,3467\n1419,3504\n1419,4109\n1419,4137\n1419,4377\n1419,4486\n1419,4549\n1419,5223\n1419,5331\n1419,5346\n1419,5451\n1419,5702\n1419,6552\n1419,6773\n1419,7266\n1419,7944\n1419,8097\n1419,9021\n1419,13328\n1419,13334\n1419,14126\n1419,14578\n1419,15339\n1419,15397\n1419,15562\n1419,15580\n1419,15604\n1419,15693\n1419,15931\n1419,16218\n1419,16505\n1419,18142\n1419,18746\n1419,19415\n1419,19622\n1419,19660\n1419,20525\n1419,20535\n1419,20540\n1419,20747\n1419,20757\n1419,22029\n1419,22340\n1419,22363\n1419,23625\n1419,26242\n1419,28509\n1419,29038\n1419,29741\n1419,31517\n1419,31737\n1419,32824\n1419,33519\n1419,34994\n1419,35546\n1419,38111\n1419,38318\n1419,38974\n1419,40025\n1419,41951\n1419,42762\n1419,45524\n1419,46391\n1419,46969\n1419,48372\n1419,48437\n1419,48620\n1419,49135\n1419,49647\n1419,49655\n1419,50440\n1419,55681\n1419,56346\n1419,61009\n1419,61211\n1419,62787\n1419,66468\n1419,72100\n1419,72701\n1419,79533\n1419,80003\n1419,84048\n1419,88400\n1419,102695\n1419,104536\n1419,108022\n1419,109819\n1419,123057\n1419,124822\n1419,125445\n1419,130866\n1419,133440\n1419,136482\n1419,136483\n1419,136484\n1419,136485\n1419,136486\n1419,136487\n1419,136488\n1419,136489\n1419,136490\n1419,136491\n1419,136492\n1419,136493\n1419,136494\n1419,136495\n1419,136496\n1419,136497\n1419,136498\n1419,136499\n1419,136500\n1419,136501\n1419,136502\n1419,136503\n1419,136504\n1419,136505\n1419,136506\n1419,136507\n1419,136508\n1419,136509\n1419,136510\n1419,147541\n1419,153221\n1419,243627\n1419,252542\n1419,254160\n1420,147\n1420,158\n1420,195\n1420,206\n1420,422\n1420,640\n1420,1458\n1420,1803\n1420,2244\n1420,80266\n1420,89035\n1421,167\n1421,299\n1421,1433\n1422,287\n1422,392\n1422,433\n1422,1634\n1423,390\n1423,1424\n1423,4760\n1424,106\n1424,292\n1424,390\n1424,623\n1424,1043\n1424,1423\n1424,1424\n1424,1653\n1424,1677\n1424,1805\n1424,2045\n1424,2191\n1424,3367\n1424,3406\n1424,3830\n1424,4151\n1424,4760\n1424,5003\n1424,5043\n1424,5447\n1424,6880\n1424,7882\n1424,14251\n1424,31080\n1424,31202\n1424,41378\n1424,41939\n1424,60699\n1424,71184\n1424,94033\n1424,131662\n1424,157263\n1424,206085\n1424,207659\n1424,221643\n1424,235898\n1425,1\n1425,10\n1425,50\n1425,55\n1425,56\n1425,99\n1425,106\n1425,146\n1425,147\n1425,149\n1425,158\n1425,175\n1425,184\n1425,206\n1425,285\n1425,333\n1425,336\n1425,406\n1425,422\n1425,505\n1425,602\n1425,620\n1425,640\n1425,663\n1425,664\n1425,779\n1425,841\n1425,920\n1425,1011\n1425,1425\n1425,1426\n1425,1455\n1425,1515\n1425,2132\n1425,2149\n1425,2244\n1425,2365\n1425,2374\n1425,3681\n1425,3895\n1425,4405\n1425,4468\n1425,4543\n1425,4684\n1425,5424\n1425,5601\n1425,6957\n1425,7657\n1425,8244\n1425,9394\n1425,9532\n1425,9757\n1425,13827\n1425,14461\n1425,14627\n1425,15229\n1425,15385\n1425,15800\n1425,18173\n1425,18815\n1425,19684\n1425,21361\n1425,21442\n1425,21493\n1425,22012\n1425,23783\n1425,24131\n1425,24835\n1425,25531\n1425,26414\n1425,26903\n1425,27008\n1425,27572\n1425,28212\n1425,28327\n1425,28497\n1425,30331\n1425,38238\n1425,38639\n1425,43287\n1425,43351\n1425,44264\n1425,44833\n1425,49210\n1425,49419\n1425,55254\n1425,55585\n1425,58991\n1425,59147\n1425,60576\n1425,65809\n1425,67445\n1425,67978\n1425,73323\n1425,76206\n1425,77486\n1425,77555\n1425,77763\n1425,82974\n1425,84693\n1425,87384\n1425,91426\n1425,92476\n1425,92792\n1425,94237\n1425,94331\n1425,97392\n1425,97650\n1425,99787\n1425,99789\n1425,99819\n1425,102560\n1425,103852\n1425,104926\n1425,106502\n1425,109367\n1425,109369\n1425,109538\n1425,118038\n1425,118336\n1425,120634\n1425,123890\n1425,124889\n1425,125462\n1425,125754\n1425,126059\n1425,126085\n1425,132860\n1425,135111\n1425,140017\n1425,141790\n1425,144895\n1425,148601\n1425,158589\n1425,165311\n1425,165327\n1425,165456\n1425,165457\n1425,165865\n1425,167051\n1425,167620\n1425,170562\n1425,170644\n1425,170928\n1425,173272\n1425,173443\n1425,175925\n1425,180367\n1425,181836\n1425,183768\n1425,187293\n1425,187391\n1425,193044\n1425,220502\n1425,230310\n1425,230572\n1425,240174\n1425,247337\n1425,254450\n1425,260752\n1426,1425\n1427,65\n1427,500\n1428,736\n1429,259\n1429,327\n1429,577\n1429,596\n1429,726\n1429,859\n1429,950\n1429,1105\n1429,1209\n1429,1367\n1429,1678\n1429,1858\n1429,2178\n1429,2253\n1429,2362\n1429,3490\n1429,3587\n1429,5279\n1429,5690\n1429,13413\n1429,14678\n1429,15386\n1429,16790\n1429,18502\n1429,18559\n1429,20493\n1429,22835\n1429,23045\n1429,23863\n1429,24551\n1429,30229\n1429,34656\n1429,36257\n1429,38160\n1429,38869\n1429,39048\n1429,39545\n1429,41282\n1429,43244\n1429,43258\n1429,43278\n1429,43326\n1429,43329\n1429,43355\n1429,43449\n1429,45724\n1429,45731\n1429,45749\n1429,45758\n1429,46285\n1429,57143\n1429,58505\n1429,58507\n1429,66696\n1429,76944\n1429,77108\n1430,10\n1430,146\n1430,336\n1430,602\n1430,16019\n1430,106502\n1431,1432\n1431,2372\n1432,5\n1432,26\n1432,59\n1432,94\n1432,104\n1432,134\n1432,137\n1432,138\n1432,636\n1432,715\n1432,967\n1432,1001\n1432,1212\n1432,1235\n1432,1282\n1432,1368\n1432,1415\n1432,1431\n1432,1432\n1432,1684\n1432,2205\n1432,2674\n1432,2893\n1432,3794\n1432,4114\n1432,4276\n1432,5700\n1432,5871\n1432,6054\n1432,6621\n1432,7084\n1432,7263\n1432,7958\n1432,12556\n1432,15742\n1432,21205\n1432,21944\n1432,25636\n1432,25847\n1432,26296\n1432,27886\n1432,28126\n1432,28133\n1432,31893\n1432,33424\n1432,34060\n1432,58533\n1432,59273\n1432,71229\n1432,71809\n1432,84390\n1432,84411\n1432,92711\n1432,99756\n1432,109269\n1432,133458\n1432,148076\n1432,161590\n1432,161648\n1432,182606\n1432,183262\n1432,188873\n1432,189406\n1432,190400\n1432,191955\n1432,194896\n1432,195049\n1432,205627\n1432,219770\n1432,223023\n1432,244401\n1433,65\n1433,66\n1433,171\n1433,217\n1433,259\n1433,264\n1433,314\n1433,577\n1433,788\n1433,868\n1433,1019\n1433,1421\n1433,1433\n1433,1494\n1433,1531\n1433,1586\n1433,1844\n1433,2666\n1433,2895\n1433,2908\n1433,3436\n1433,3569\n1433,3744\n1433,3853\n1433,3927\n1433,4446\n1433,5494\n1433,5596\n1433,5625\n1433,7165\n1433,7178\n1433,7880\n1433,8183\n1433,8535\n1433,15199\n1433,18601\n1433,19538\n1433,19716\n1433,20496\n1433,20619\n1433,21231\n1433,21411\n1433,21413\n1433,21520\n1433,23616\n1433,23699\n1433,28362\n1433,29585\n1433,29870\n1433,30402\n1433,31144\n1433,31268\n1433,32585\n1433,34232\n1433,35435\n1433,35539\n1434,11\n1434,240\n1434,512\n1434,572\n1434,599\n1434,685\n1434,712\n1434,838\n1434,911\n1434,1014\n1434,1087\n1434,1172\n1434,1284\n1434,1434\n1434,1566\n1434,1659\n1434,1844\n1434,1955\n1434,2173\n1434,2286\n1434,3507\n1434,3804\n1434,3967\n1434,4158\n1434,14674\n1434,20757\n1434,23740\n1434,37124\n1434,38908\n1434,39380\n1434,43243\n1434,62318\n1434,62337\n1434,96478\n1434,104627\n1434,127726\n1434,142126\n1434,143528\n1434,151093\n1434,174274\n1434,181637\n1434,183312\n1434,183805\n1434,215874\n1434,216044\n1435,356\n1435,393\n1435,671\n1435,852\n1435,893\n1435,1012\n1435,1243\n1435,1309\n1436,167\n1436,356\n1436,522\n1436,567\n1436,589\n1436,663\n1436,664\n1436,666\n1436,685\n1436,750\n1436,762\n1436,838\n1436,937\n1436,972\n1436,973\n1436,1011\n1436,1014\n1436,1167\n1436,1241\n1436,1284\n1436,1298\n1436,1300\n1436,1436\n1436,1437\n1436,1522\n1436,1544\n1436,1566\n1436,1635\n1436,1849\n1436,2083\n1436,2979\n1436,3207\n1436,3392\n1436,3774\n1436,5153\n1436,5382\n1436,5563\n1436,6904\n1436,7980\n1436,15318\n1436,20747\n1436,21981\n1436,25662\n1436,26859\n1436,28295\n1436,28802\n1436,30328\n1436,32577\n1436,32967\n1436,33295\n1436,35063\n1436,36745\n1436,38994\n1436,44082\n1436,46268\n1436,46425\n1436,49020\n1436,59143\n1436,60500\n1436,61213\n1436,62759\n1436,63081\n1436,64154\n1436,68088\n1436,72726\n1436,77675\n1436,85916\n1436,87100\n1436,87350\n1436,88173\n1436,92922\n1436,96510\n1436,96574\n1436,96685\n1436,97423\n1436,98111\n1436,101833\n1436,102755\n1436,104522\n1436,106142\n1436,111319\n1436,112264\n1436,118315\n1436,120155\n1436,121516\n1436,123936\n1436,126863\n1436,126866\n1436,130817\n1436,135333\n1436,143752\n1436,145057\n1436,146645\n1436,150861\n1436,152298\n1436,152606\n1436,157029\n1436,158915\n1436,159724\n1436,160371\n1436,160376\n1436,176967\n1436,180397\n1436,180609\n1436,182523\n1436,183887\n1436,185020\n1436,185292\n1436,185884\n1436,193022\n1436,193559\n1436,199852\n1436,221734\n1436,221910\n1436,222482\n1436,227061\n1436,232079\n1436,234073\n1436,236698\n1436,237319\n1436,237381\n1436,243369\n1436,244717\n1436,244775\n1436,247366\n1436,249055\n1437,1436\n1437,1801\n1438,72\n1439,720\n1439,1117\n1440,252\n1440,318\n1440,41170\n1442,615\n1443,151\n1444,1240\n1446,1447\n1448,306\n1448,307\n1449,58\n1449,111\n1449,256\n1449,292\n1449,441\n1449,801\n1449,911\n1449,1235\n1449,1238\n1449,1450\n1449,1688\n1449,2163\n1449,2334\n1449,2373\n1449,3241\n1449,3474\n1449,4190\n1449,4771\n1449,5741\n1449,7087\n1449,7921\n1449,14344\n1449,14633\n1449,18386\n1449,18838\n1449,19777\n1449,25646\n1449,37042\n1449,56089\n1449,58916\n1449,68006\n1449,82114\n1449,99133\n1449,107974\n1451,1452\n1452,440\n1452,838\n1452,1191\n1452,3507\n1452,5440\n1452,14674\n1453,87\n1453,126\n1453,264\n1453,292\n1453,509\n1453,510\n1453,535\n1453,673\n1453,818\n1453,872\n1453,911\n1453,919\n1453,1192\n1453,1204\n1453,1298\n1453,1572\n1453,1653\n1453,1722\n1453,2173\n1453,2253\n1453,2373\n1453,3507\n1453,4039\n1453,127158\n1454,87\n1454,182\n1454,248\n1454,326\n1454,397\n1454,425\n1454,440\n1454,457\n1454,535\n1454,599\n1454,623\n1454,673\n1454,808\n1454,852\n1454,872\n1454,1011\n1454,1014\n1454,1240\n1454,1262\n1454,1465\n1454,1653\n1454,1805\n1454,1949\n1454,2253\n1454,2373\n1454,3507\n1454,4039\n1456,79\n1456,192\n1456,202\n1456,203\n1456,406\n1456,516\n1456,726\n1456,980\n1456,1181\n1456,1370\n1456,1531\n1456,1659\n1457,151\n1458,1\n1458,147\n1458,158\n1458,175\n1458,206\n1458,336\n1458,422\n1458,640\n1458,1458\n1458,1623\n1458,2244\n1458,3071\n1458,3895\n1458,5592\n1458,7128\n1458,9394\n1458,15795\n1458,16891\n1458,17139\n1458,21826\n1458,71835\n1458,79715\n1458,80266\n1458,89035\n1458,89448\n1458,92476\n1458,118336\n1458,138472\n1458,149534\n1458,166338\n1458,172229\n1458,173692\n1458,182606\n1458,193680\n1458,199280\n1458,212056\n1458,232147\n1458,240174\n1458,253353\n1458,258978\n1458,259774\n1458,261402\n1460,726\n1461,483\n1463,264\n1463,467\n1463,525\n1463,1381\n1463,1531\n1463,1551\n1464,56\n1464,79\n1464,146\n1464,147\n1464,149\n1464,158\n1464,192\n1464,206\n1464,278\n1464,333\n1464,336\n1464,397\n1464,406\n1464,422\n1464,525\n1464,602\n1464,779\n1464,841\n1464,920\n1464,1001\n1464,1089\n1464,1118\n1464,1181\n1464,1192\n1464,1210\n1464,1515\n1464,1531\n1464,1663\n1464,2173\n1464,2244\n1464,2867\n1464,2868\n1464,3585\n1464,3895\n1464,18638\n1464,30331\n1464,65809\n1464,68069\n1464,75912\n1464,92476\n1465,32\n1465,175\n1465,392\n1465,599\n1465,623\n1465,685\n1465,697\n1465,808\n1465,818\n1465,918\n1465,1005\n1465,1130\n1465,1140\n1465,1240\n1465,1363\n1465,1454\n1465,1513\n1465,1805\n1465,1836\n1465,1860\n1465,1949\n1465,2246\n1465,2494\n1465,3260\n1465,3432\n1465,4601\n1465,4692\n1465,4759\n1465,5433\n1465,5880\n1465,6059\n1465,6883\n1465,7098\n1465,7731\n1465,8156\n1465,8661\n1465,15673\n1465,16969\n1465,20426\n1465,22148\n1465,22506\n1465,26058\n1465,26484\n1465,27030\n1465,27042\n1465,28450\n1465,30591\n1465,31414\n1465,34863\n1465,35562\n1465,37016\n1465,46032\n1465,46368\n1465,48827\n1465,60500\n1465,61144\n1465,65650\n1465,68677\n1465,68681\n1465,71573\n1465,89962\n1465,92938\n1465,93000\n1465,94772\n1465,94993\n1465,95039\n1465,97351\n1465,99438\n1465,99602\n1465,102557\n1465,102606\n1465,102607\n1465,102610\n1465,102611\n1465,102613\n1465,102615\n1465,102617\n1465,103319\n1465,104522\n1465,112321\n1465,112789\n1465,115361\n1465,115479\n1465,118893\n1465,121950\n1465,122398\n1465,127158\n1465,132857\n1465,134619\n1465,134750\n1465,138737\n1465,140656\n1465,142340\n1465,156672\n1465,158592\n1465,160309\n1465,160514\n1465,162950\n1465,175997\n1465,176795\n1465,193689\n1465,194922\n1465,194933\n1465,202767\n1465,205710\n1465,212889\n1465,216777\n1465,217836\n1465,218429\n1465,221702\n1465,230283\n1465,231299\n1465,231917\n1465,234781\n1465,238650\n1465,241678\n1465,244672\n1465,254409\n1465,262322\n1465,263216\n1465,263708\n1465,263788\n1466,68\n1466,111\n1466,120\n1466,182\n1466,240\n1466,261\n1466,332\n1466,392\n1466,588\n1466,590\n1466,694\n1466,715\n1466,903\n1466,1014\n1466,1210\n1466,1285\n1466,1309\n1466,1353\n1466,1395\n1466,1419\n1466,1466\n1466,1505\n1466,1634\n1466,1796\n1466,1955\n1466,2418\n1466,2512\n1466,3115\n1466,3650\n1466,4520\n1466,5346\n1466,7041\n1466,7221\n1466,7266\n1466,11147\n1466,15183\n1466,15424\n1466,15693\n1466,15931\n1466,19525\n1466,19528\n1466,20525\n1466,20592\n1466,22233\n1466,23507\n1466,28282\n1466,30545\n1466,33703\n1466,35454\n1466,35546\n1466,43223\n1466,43341\n1466,44158\n1466,46234\n1466,48660\n1466,59787\n1466,63070\n1466,85724\n1466,93556\n1466,95653\n1466,97545\n1466,109819\n1466,111330\n1466,114165\n1466,116590\n1466,116629\n1466,131810\n1466,131926\n1466,132930\n1466,154819\n1466,160450\n1466,162919\n1466,183873\n1466,189754\n1466,189837\n1466,191376\n1466,191883\n1466,194920\n1466,213725\n1466,223714\n1466,238996\n1466,249055\n1466,249209\n1467,34\n1467,35\n1467,222\n1467,278\n1467,283\n1467,313\n1467,389\n1467,455\n1467,599\n1467,814\n1467,852\n1467,951\n1467,1019\n1467,1467\n1467,1539\n1467,1696\n1467,1724\n1467,1871\n1467,1894\n1467,2421\n1467,2507\n1467,2979\n1467,3499\n1467,5178\n1467,5905\n1467,7902\n1467,13540\n1467,18572\n1467,18650\n1467,22184\n1467,23636\n1467,25670\n1467,29691\n1467,32462\n1467,35695\n1467,36600\n1467,37088\n1467,37354\n1467,39561\n1467,42032\n1467,42674\n1467,43204\n1467,43216\n1467,43660\n1467,48487\n1467,50816\n1467,60457\n1467,61761\n1467,62829\n1467,66804\n1467,68245\n1467,71064\n1467,72820\n1467,76209\n1467,76971\n1467,77702\n1467,78644\n1467,79289\n1467,79982\n1467,83301\n1467,83340\n1467,83882\n1467,87906\n1467,89673\n1467,91765\n1467,93636\n1467,94901\n1467,103326\n1467,105317\n1467,107169\n1467,112930\n1467,115474\n1467,117231\n1467,124572\n1467,125229\n1467,130531\n1467,131216\n1467,132587\n1467,141567\n1467,147504\n1467,148867\n1467,149255\n1467,150850\n1467,150853\n1467,161203\n1467,163392\n1467,163394\n1467,163541\n1467,164283\n1467,174823\n1467,175306\n1467,175955\n1467,175989\n1467,178473\n1467,178657\n1467,180502\n1467,182481\n1467,182647\n1467,191530\n1467,207679\n1467,211889\n1467,219670\n1467,219671\n1467,221753\n1467,221855\n1467,223656\n1467,224792\n1467,228472\n1467,232245\n1467,236740\n1467,236790\n1467,238077\n1467,238274\n1467,247454\n1467,255033\n1467,255079\n1467,257784\n1467,259912\n1467,262584\n1467,263207\n1468,811\n1469,79\n1469,211\n1469,422\n1469,602\n1469,1151\n1469,152855\n1470,215\n1470,240\n1470,298\n1470,372\n1470,417\n1470,631\n1470,760\n1470,932\n1470,1082\n1470,1085\n1470,1285\n1470,1608\n1470,1715\n1470,1785\n1470,1818\n1470,1955\n1470,1962\n1470,2205\n1470,2296\n1470,33424\n1471,634\n1472,167\n1472,182\n1472,217\n1472,252\n1472,467\n1472,516\n1472,571\n1472,599\n1472,631\n1472,872\n1472,1085\n1472,1204\n1472,1417\n1472,1663\n1472,1796\n1472,3507\n1473,65\n1473,66\n1473,143\n1473,1052\n1474,20\n1474,346\n1474,435\n1474,439\n1474,447\n1474,671\n1474,788\n1474,996\n1474,1011\n1474,1033\n1474,1068\n1474,1294\n1474,1474\n1474,1475\n1474,1612\n1474,1644\n1474,1721\n1474,1789\n1474,1897\n1474,1923\n1474,2094\n1474,2138\n1474,2354\n1474,3588\n1474,3831\n1474,3844\n1474,3903\n1474,4074\n1474,4160\n1474,4246\n1474,4426\n1474,6546\n1474,6661\n1474,7087\n1474,8094\n1474,13402\n1474,14633\n1474,15355\n1474,16218\n1474,17957\n1474,24659\n1474,26785\n1474,31195\n1474,31593\n1474,35412\n1474,36626\n1474,38822\n1474,45721\n1474,46838\n1474,48237\n1474,53306\n1474,54613\n1474,57059\n1474,58203\n1474,62195\n1474,62937\n1474,65853\n1474,68142\n1474,80984\n1474,82872\n1474,90933\n1474,99778\n1474,106984\n1474,114008\n1474,114881\n1474,119352\n1474,119468\n1474,120155\n1474,122003\n1474,130432\n1474,131353\n1474,131673\n1474,159075\n1474,159460\n1474,164017\n1474,165064\n1474,173226\n1474,173700\n1474,177571\n1474,190492\n1474,191210\n1474,191468\n1474,192370\n1474,215464\n1474,226655\n1474,233983\n1474,242199\n1474,248933\n1474,251344\n1475,1474\n1476,1181\n1477,104\n1477,136\n1477,850\n1478,843\n1478,1479\n1479,299\n1479,388\n1479,459\n1479,744\n1479,808\n1479,1001\n1479,1012\n1479,1013\n1479,1092\n1479,1319\n1479,1522\n1479,1575\n1479,1849\n1479,1973\n1479,2252\n1479,2480\n1479,2557\n1479,2840\n1479,3218\n1479,3766\n1479,3871\n1479,4039\n1479,4206\n1479,4329\n1479,4433\n1479,5662\n1479,6637\n1479,6780\n1479,8187\n1479,13506\n1479,13593\n1479,14674\n1479,16260\n1479,20396\n1479,20575\n1479,20757\n1479,24579\n1479,26166\n1479,27118\n1479,29849\n1479,31785\n1479,32226\n1479,32784\n1479,36589\n1479,37523\n1479,41798\n1479,42773\n1479,46091\n1479,56672\n1479,58985\n1479,60477\n1479,62983\n1479,68674\n1479,80982\n1479,83830\n1479,98076\n1479,102698\n1479,129942\n1479,130211\n1479,130935\n1479,130941\n1479,138108\n1479,138111\n1479,138112\n1479,144907\n1479,146074\n1479,158585\n1479,164380\n1479,178541\n1479,180038\n1479,182786\n1479,184757\n1479,184915\n1479,189798\n1479,195485\n1479,221904\n1479,256396\n1479,256401\n1479,258378\n1479,260118\n1480,406\n1481,289\n1481,290\n1481,94134\n1481,144988\n1482,58\n1483,408\n1484,835\n1485,97\n1486,137\n1486,298\n1486,302\n1486,340\n1486,479\n1486,563\n1486,736\n1486,827\n1486,919\n1486,1058\n1486,1087\n1486,5192\n1486,7757\n1486,13538\n1486,90845\n1487,390\n1487,510\n1487,1284\n1487,5366\n1488,72\n1488,704\n1488,1149\n1489,760\n1489,1149\n1490,328\n1491,56\n1492,620\n1492,8244\n1493,663\n1493,664\n1493,932\n1493,1849\n1493,3207\n1493,5662\n1494,217\n1494,440\n1494,452\n1494,467\n1494,493\n1494,497\n1494,1010\n1494,1085\n1494,1433\n1494,1844\n1494,3804\n1495,24\n1495,25\n1495,26\n1495,28\n1495,33\n1495,40\n1495,47\n1495,59\n1495,60\n1495,117\n1495,143\n1495,885\n1495,887\n1495,1235\n1495,1255\n1495,1335\n1495,1432\n1495,1684\n1495,1775\n1495,2088\n1495,2469\n1495,2674\n1495,2712\n1495,3561\n1495,4079\n1495,4571\n1495,5826\n1495,9539\n1495,9541\n1495,9542\n1495,21944\n1495,44244\n1495,50943\n1495,154690\n1495,171294\n1496,459\n1497,422\n1498,30\n1498,184\n1498,328\n1498,439\n1498,920\n1498,1089\n1498,1370\n1498,1619\n1498,8854\n1499,1500\n1500,203\n1500,256\n1500,277\n1500,438\n1500,664\n1500,1222\n1500,1501\n1500,1511\n1500,1512\n1500,3194\n1500,8244\n1500,21736\n1500,72439\n1500,92476\n1500,106502\n1502,34\n1502,35\n1502,146\n1502,285\n1502,349\n1502,392\n1502,433\n1502,623\n1502,718\n1502,779\n1502,1181\n1502,1515\n1502,1590\n1502,1644\n1502,1805\n1502,1844\n1502,21442\n1502,68069\n1502,141912\n1503,852\n1504,146\n1504,313\n1504,682\n1504,685\n1504,775\n1504,841\n1504,862\n1504,900\n1504,911\n1504,918\n1504,1608\n1504,1888\n1504,1985\n1504,2310\n1504,2590\n1504,56150\n1504,72439\n1504,92476\n1504,189839\n1505,104\n1505,120\n1505,248\n1505,289\n1505,290\n1505,372\n1505,599\n1505,631\n1505,640\n1505,714\n1505,760\n1505,805\n1505,1016\n1505,1085\n1505,1192\n1505,1282\n1505,1402\n1505,1419\n1505,1462\n1505,1505\n1505,1506\n1505,1608\n1505,1818\n1505,1973\n1505,2205\n1505,2206\n1505,2286\n1505,2620\n1505,2989\n1505,2991\n1505,4752\n1505,8537\n1505,15397\n1505,17607\n1505,52523\n1505,57801\n1505,57802\n1505,96238\n1505,115979\n1505,127781\n1505,143413\n1505,143414\n1505,143415\n1506,588\n1506,590\n1506,805\n1506,1505\n1506,1519\n1506,6025\n1506,6133\n1506,7294\n1506,9380\n1506,15638\n1506,16483\n1506,16485\n1506,16486\n1506,16504\n1506,16515\n1506,17678\n1506,19026\n1506,24697\n1506,35463\n1506,37050\n1506,37736\n1506,37761\n1506,40903\n1506,42587\n1506,43877\n1506,47881\n1506,59786\n1506,62304\n1506,64544\n1506,66197\n1506,78834\n1506,78965\n1506,81458\n1506,82669\n1507,358\n1507,467\n1508,264\n1508,1127\n1508,1381\n1508,1509\n1508,1893\n1509,10\n1509,192\n1509,227\n1509,314\n1509,425\n1509,599\n1509,805\n1509,838\n1509,1011\n1509,1509\n1509,1973\n1509,4066\n1510,620\n1510,8244\n1511,805\n1511,932\n1511,1511\n1511,2210\n1511,2376\n1511,3069\n1511,4237\n1511,14603\n1511,22524\n1511,33727\n1511,35876\n1511,46736\n1511,57722\n1511,58475\n1511,58557\n1511,73485\n1511,77878\n1511,103366\n1511,116266\n1511,137941\n1511,160544\n1511,163540\n1511,179928\n1511,186589\n1511,197972\n1511,213860\n1511,229234\n1511,230529\n1511,234853\n1511,242293\n1511,243036\n1511,243037\n1511,243038\n1511,243039\n1511,243040\n1511,243041\n1511,243042\n1511,243043\n1511,243044\n1511,244669\n1511,249364\n1511,256625\n1511,259623\n1511,261042\n1512,251\n1512,252\n1512,493\n1512,516\n1512,682\n1512,733\n1512,1220\n1512,1222\n1512,1243\n1512,1474\n1512,1512\n1512,1568\n1512,2528\n1512,2775\n1512,2944\n1512,5353\n1512,5992\n1512,6075\n1512,7385\n1512,7952\n1512,9717\n1512,14037\n1512,16906\n1512,19467\n1512,21435\n1512,22204\n1512,32636\n1512,34619\n1512,41170\n1512,45462\n1512,50980\n1512,72439\n1512,131756\n1512,134525\n1512,135524\n1512,174982\n1512,186147\n1512,189794\n1512,212381\n1512,217581\n1512,223738\n1512,243272\n1512,261872\n1513,83\n1513,392\n1513,455\n1513,623\n1513,697\n1513,808\n1513,852\n1513,1240\n1513,1454\n1513,1465\n1513,1805\n1513,2572\n1513,6059\n1514,1515\n1515,1\n1515,10\n1515,50\n1515,99\n1515,146\n1515,147\n1515,149\n1515,158\n1515,175\n1515,195\n1515,285\n1515,333\n1515,336\n1515,358\n1515,406\n1515,422\n1515,425\n1515,505\n1515,509\n1515,510\n1515,602\n1515,620\n1515,622\n1515,640\n1515,685\n1515,778\n1515,779\n1515,818\n1515,841\n1515,849\n1515,875\n1515,1003\n1515,1011\n1515,1033\n1515,1181\n1515,1192\n1515,1218\n1515,1370\n1515,1425\n1515,1464\n1515,1502\n1515,1514\n1515,1515\n1515,1825\n1515,1848\n1515,2132\n1515,2374\n1515,2792\n1515,3009\n1515,3442\n1515,3539\n1515,3544\n1515,3895\n1515,3922\n1515,4663\n1515,4977\n1515,5049\n1515,5246\n1515,5333\n1515,5356\n1515,5601\n1515,5660\n1515,6343\n1515,6346\n1515,7494\n1515,8055\n1515,8067\n1515,8244\n1515,8680\n1515,8971\n1515,9394\n1515,13197\n1515,13283\n1515,13493\n1515,13687\n1515,13975\n1515,13994\n1515,14023\n1515,14065\n1515,14345\n1515,14700\n1515,15039\n1515,15112\n1515,15800\n1515,16307\n1515,16341\n1515,16870\n1515,17116\n1515,17984\n1515,19584\n1515,19690\n1515,19782\n1515,19919\n1515,20160\n1515,20642\n1515,20942\n1515,21121\n1515,21442\n1515,23953\n1515,23991\n1515,24113\n1515,24148\n1515,24164\n1515,24172\n1515,24185\n1515,24187\n1515,24198\n1515,24835\n1515,25649\n1515,26414\n1515,26415\n1515,26972\n1515,26992\n1515,27012\n1515,28489\n1515,28954\n1515,28969\n1515,30331\n1515,30570\n1515,31434\n1515,34088\n1515,34670\n1515,35000\n1515,36535\n1515,37720\n1515,40045\n1515,40889\n1515,41385\n1515,42508\n1515,43239\n1515,44110\n1515,45495\n1515,47255\n1515,56242\n1515,56461\n1515,56519\n1515,56557\n1515,58131\n1515,62378\n1515,62530\n1515,63126\n1515,63585\n1515,66548\n1515,66767\n1515,67150\n1515,68012\n1515,68069\n1515,70201\n1515,77172\n1515,79690\n1515,82886\n1515,82901\n1515,83890\n1515,87063\n1515,88798\n1515,89035\n1515,89256\n1515,89960\n1515,92476\n1515,94092\n1515,94353\n1515,98615\n1515,99005\n1515,102560\n1515,104657\n1515,105204\n1515,107017\n1515,107021\n1515,107379\n1515,112559\n1515,113623\n1515,115854\n1515,115868\n1515,116718\n1515,118049\n1515,118336\n1515,119454\n1515,120006\n1515,121337\n1515,125583\n1515,126214\n1515,129926\n1515,131083\n1515,132609\n1515,134846\n1515,134856\n1515,134965\n1515,136159\n1515,137786\n1515,137790\n1515,137795\n1515,139835\n1515,141913\n1515,141924\n1515,142881\n1515,143568\n1515,147614\n1515,147698\n1515,148601\n1515,153410\n1515,158571\n1515,161362\n1515,170562\n1515,170782\n1515,173720\n1515,175324\n1515,178876\n1515,180187\n1515,180376\n1515,182535\n1515,187910\n1515,191249\n1515,191666\n1515,191963\n1515,194968\n1515,216403\n1515,219724\n1515,220502\n1515,222136\n1515,224739\n1515,229292\n1515,237013\n1515,237502\n1515,237571\n1515,239553\n1515,242826\n1515,243361\n1515,249279\n1515,251496\n1515,254002\n1515,259317\n1515,260886\n1515,260902\n1515,262017\n1515,263754\n1516,1181\n1517,1\n1517,50\n1517,147\n1517,202\n1517,252\n1517,868\n1517,1181\n1517,21944\n1518,10\n1518,63\n1518,79\n1518,140\n1518,147\n1518,149\n1518,158\n1518,167\n1518,192\n1518,217\n1518,240\n1518,248\n1518,264\n1518,301\n1518,302\n1518,314\n1518,333\n1518,349\n1518,352\n1518,356\n1518,392\n1518,397\n1518,406\n1518,435\n1518,439\n1518,457\n1518,467\n1518,479\n1518,493\n1518,497\n1518,505\n1518,510\n1518,516\n1518,586\n1518,599\n1518,622\n1518,673\n1518,676\n1518,697\n1518,779\n1518,818\n1518,838\n1518,849\n1518,872\n1518,920\n1518,1010\n1518,1011\n1518,1014\n1518,1019\n1518,1085\n1518,1118\n1518,1172\n1518,1204\n1518,1210\n1518,1240\n1518,1262\n1518,1298\n1518,1370\n1518,1417\n1518,1425\n1518,1433\n1518,1462\n1518,1531\n1518,1612\n1518,1619\n1518,1634\n1518,1796\n1518,1805\n1518,1844\n1518,1860\n1518,1893\n1518,1943\n1518,2173\n1518,2205\n1518,2206\n1518,2253\n1518,3321\n1518,3744\n1518,3804\n1518,4165\n1518,6452\n1518,7124\n1518,8537\n1518,19413\n1518,30331\n1518,42064\n1518,102560\n1518,118336\n1518,127158\n1518,215874\n1519,1506\n1520,450\n1520,1332\n1521,1\n1521,50\n1521,79\n1521,147\n1521,149\n1521,158\n1521,252\n1521,333\n1521,336\n1521,406\n1521,622\n1521,141912\n1522,86\n1522,167\n1522,240\n1522,299\n1522,372\n1522,528\n1522,534\n1522,536\n1522,589\n1522,599\n1522,794\n1522,832\n1522,838\n1522,852\n1522,907\n1522,972\n1522,1001\n1522,1010\n1522,1011\n1522,1013\n1522,1014\n1522,1045\n1522,1081\n1522,1085\n1522,1122\n1522,1167\n1522,1241\n1522,1284\n1522,1319\n1522,1436\n1522,1479\n1522,1522\n1522,1544\n1522,1663\n1522,1732\n1522,1782\n1522,1849\n1522,1869\n1522,2083\n1522,2095\n1522,2372\n1522,2373\n1522,2479\n1522,2557\n1522,2588\n1522,2840\n1522,2979\n1522,3207\n1522,4159\n1522,4308\n1522,4514\n1522,5185\n1522,5186\n1522,5382\n1522,5562\n1522,6650\n1522,7017\n1522,8107\n1522,8317\n1522,8436\n1522,8534\n1522,13489\n1522,13505\n1522,14572\n1522,16192\n1522,16428\n1522,18433\n1522,18859\n1522,20813\n1522,22062\n1522,22654\n1522,24924\n1522,25523\n1522,26950\n1522,31231\n1522,31785\n1522,32784\n1522,34355\n1522,35545\n1522,35684\n1522,36589\n1522,36694\n1522,37617\n1522,37745\n1522,38300\n1522,43288\n1522,45427\n1522,47153\n1522,49125\n1522,49176\n1522,49178\n1522,52912\n1522,58450\n1522,63203\n1522,64708\n1522,67060\n1522,67995\n1522,73570\n1522,75912\n1522,76978\n1522,77716\n1522,79734\n1522,82234\n1522,84611\n1522,85956\n1522,86488\n1522,109279\n1522,109352\n1522,111316\n1522,114607\n1522,116780\n1522,122558\n1522,122690\n1522,123381\n1522,127158\n1522,127858\n1522,128471\n1522,128929\n1522,129942\n1522,133386\n1522,135145\n1522,140785\n1522,140898\n1522,141809\n1522,145407\n1522,146023\n1522,146688\n1522,151498\n1522,151522\n1522,152039\n1522,152185\n1522,153648\n1522,153859\n1522,160490\n1522,163898\n1522,164368\n1522,165282\n1522,165428\n1522,165435\n1522,165888\n1522,168394\n1522,170091\n1522,170098\n1522,170596\n1522,172908\n1522,177923\n1522,179037\n1522,179061\n1522,180837\n1522,192093\n1522,216392\n1522,217265\n1522,222950\n1522,225518\n1522,227890\n1522,229082\n1522,236194\n1522,255235\n1522,255747\n1522,257036\n1522,260072\n1522,261346\n1523,620\n1524,581\n1525,222\n1525,278\n1525,283\n1525,657\n1525,1019\n1525,1860\n1525,33508\n1526,634\n1526,784\n1526,1052\n1526,2701\n1526,29008\n1527,10\n1527,72\n1527,333\n1527,652\n1529,175\n1529,704\n1529,1572\n1530,1531\n1531,182\n1531,186\n1531,192\n1531,217\n1531,240\n1531,259\n1531,264\n1531,272\n1531,301\n1531,302\n1531,327\n1531,333\n1531,393\n1531,397\n1531,406\n1531,425\n1531,435\n1531,452\n1531,457\n1531,467\n1531,493\n1531,497\n1531,500\n1531,510\n1531,516\n1531,577\n1531,589\n1531,599\n1531,622\n1531,673\n1531,726\n1531,766\n1531,779\n1531,788\n1531,794\n1531,808\n1531,818\n1531,859\n1531,872\n1531,920\n1531,939\n1531,980\n1531,1010\n1531,1011\n1531,1014\n1531,1085\n1531,1118\n1531,1180\n1531,1181\n1531,1192\n1531,1204\n1531,1298\n1531,1326\n1531,1370\n1531,1388\n1531,1417\n1531,1433\n1531,1456\n1531,1463\n1531,1464\n1531,1518\n1531,1530\n1531,1531\n1531,1545\n1531,1659\n1531,1796\n1531,1825\n1531,1853\n1531,1947\n1531,1992\n1531,2099\n1531,2106\n1531,2119\n1531,2173\n1531,2178\n1531,2266\n1531,2307\n1531,2400\n1531,2459\n1531,2556\n1531,2710\n1531,2959\n1531,3407\n1531,3694\n1531,4137\n1531,4165\n1531,4315\n1531,4446\n1531,4455\n1531,4545\n1531,4611\n1531,5563\n1531,5654\n1531,6088\n1531,6473\n1531,6853\n1531,6904\n1531,7018\n1531,7076\n1531,7165\n1531,7344\n1531,7880\n1531,8157\n1531,9111\n1531,9527\n1531,9579\n1531,9719\n1531,13207\n1531,13328\n1531,13382\n1531,13771\n1531,13862\n1531,14140\n1531,14232\n1531,14246\n1531,14506\n1531,14574\n1531,15386\n1531,15423\n1531,15980\n1531,17310\n1531,17837\n1531,17913\n1531,18102\n1531,19318\n1531,19691\n1531,19694\n1531,19695\n1531,19696\n1531,19859\n1531,20559\n1531,20598\n1531,20618\n1531,21648\n1531,22138\n1531,24565\n1531,24875\n1531,24934\n1531,25685\n1531,26133\n1531,26786\n1531,28312\n1531,28545\n1531,28895\n1531,29185\n1531,29407\n1531,29722\n1531,29926\n1531,29927\n1531,30164\n1531,30373\n1531,33424\n1531,37095\n1531,37149\n1531,37470\n1531,37727\n1531,37852\n1531,38391\n1531,38393\n1531,42492\n1531,43364\n1531,44377\n1531,47502\n1531,47953\n1531,48026\n1531,48362\n1531,48506\n1531,49337\n1531,50113\n1531,50127\n1531,50129\n1531,50131\n1531,50144\n1531,50154\n1531,50155\n1531,50233\n1531,50335\n1531,51087\n1531,51417\n1531,51971\n1531,52539\n1531,52646\n1531,53091\n1531,53482\n1531,54765\n1531,55879\n1531,56150\n1531,56338\n1531,56413\n1531,56576\n1531,56584\n1531,56801\n1531,57012\n1531,57169\n1531,58338\n1531,58943\n1531,59093\n1531,59127\n1531,59297\n1531,59391\n1531,59423\n1531,59691\n1531,59795\n1531,59834\n1531,59863\n1531,59897\n1531,59944\n1531,59969\n1531,60014\n1531,60016\n1531,60044\n1531,60046\n1531,60161\n1531,60172\n1531,60223\n1531,60396\n1531,60439\n1531,60517\n1531,60551\n1531,60609\n1531,60685\n1531,60746\n1531,60847\n1531,60861\n1531,60884\n1531,60912\n1531,60927\n1531,61013\n1531,61086\n1531,61159\n1531,61326\n1531,61331\n1531,62758\n1531,62959\n1531,63081\n1531,64765\n1531,64768\n1531,65651\n1531,66783\n1531,67093\n1531,67166\n1531,67207\n1531,67208\n1531,67227\n1531,67243\n1531,67246\n1531,67256\n1531,67263\n1531,67264\n1531,67282\n1531,67289\n1531,67291\n1531,67302\n1531,67303\n1531,67304\n1531,67316\n1531,67373\n1531,67382\n1531,67844\n1531,68137\n1531,68676\n1531,68727\n1531,70853\n1531,71163\n1531,71696\n1531,72876\n1531,75883\n1531,76085\n1531,78458\n1531,79391\n1531,81218\n1531,83501\n1531,85028\n1531,85473\n1531,85752\n1531,86840\n1531,87767\n1531,87869\n1531,88001\n1531,88571\n1531,88584\n1531,89273\n1531,89449\n1531,89497\n1531,89565\n1531,90546\n1531,90649\n1531,90668\n1531,90705\n1531,90706\n1531,91016\n1531,91048\n1531,93845\n1531,94824\n1531,94825\n1531,94843\n1531,94844\n1531,94852\n1531,95013\n1531,96714\n1531,96716\n1531,96717\n1531,96723\n1531,98152\n1531,98817\n1531,102759\n1531,103287\n1531,110982\n1531,112016\n1531,115679\n1531,120045\n1531,121274\n1531,121769\n1531,124508\n1531,126841\n1531,127158\n1531,128043\n1531,134650\n1531,136590\n1531,138053\n1531,144916\n1531,148327\n1531,152598\n1531,157686\n1531,157749\n1531,163016\n1531,171648\n1531,176498\n1531,177561\n1531,177917\n1531,178231\n1531,179222\n1531,180969\n1531,182308\n1531,194951\n1531,212567\n1531,213185\n1531,222463\n1531,224764\n1531,224923\n1531,225309\n1531,229252\n1531,232126\n1531,232678\n1531,238441\n1531,243369\n1531,247184\n1531,257370\n1531,257502\n1531,261047\n1531,261738\n1532,1227\n1532,1229\n1532,1252\n1532,1253\n1532,21944\n1532,86416\n1533,305\n1533,352\n1533,599\n1533,872\n1533,1181\n1533,1433\n1533,1534\n1533,1825\n1533,1844\n1533,3744\n1533,232709\n1535,68\n1535,302\n1535,344\n1535,577\n1535,794\n1535,919\n1536,305\n1537,10\n1537,137\n1537,195\n1537,217\n1537,222\n1537,301\n1537,302\n1537,455\n1537,972\n1537,1033\n1537,1265\n1537,1266\n1537,2371\n1537,5343\n1538,1539\n1539,54\n1539,135\n1539,278\n1539,455\n1539,660\n1539,1310\n1539,1538\n1539,1539\n1539,1843\n1539,2423\n1539,2424\n1539,2646\n1539,6506\n1539,13276\n1539,13328\n1539,13384\n1539,13400\n1539,19349\n1539,33118\n1539,37828\n1540,1541\n1542,1\n1543,215\n1544,86\n1544,167\n1544,299\n1544,356\n1544,390\n1544,459\n1544,522\n1544,589\n1544,599\n1544,720\n1544,744\n1544,783\n1544,877\n1544,941\n1544,973\n1544,1014\n1544,1117\n1544,1124\n1544,1284\n1544,1319\n1544,1436\n1544,1479\n1544,1522\n1544,1544\n1544,1849\n1544,1973\n1544,2083\n1544,2372\n1544,2747\n1544,3207\n1544,3218\n1544,5186\n1544,5301\n1544,5662\n1544,6068\n1544,6712\n1544,7087\n1544,13523\n1544,14615\n1544,15073\n1544,17877\n1544,20017\n1544,20303\n1544,20773\n1544,28381\n1544,28916\n1544,33706\n1544,33726\n1544,34933\n1544,34966\n1544,35049\n1544,36684\n1544,36686\n1544,36698\n1544,36701\n1544,36705\n1544,38942\n1544,44940\n1544,45128\n1544,45532\n1544,45853\n1544,46805\n1544,53037\n1544,56415\n1544,58515\n1544,60900\n1544,61996\n1544,63704\n1544,71934\n1544,75480\n1544,77488\n1544,79357\n1544,81011\n1544,98215\n1544,106176\n1544,116543\n1544,117480\n1544,120155\n1544,122563\n1544,124539\n1544,126991\n1544,128922\n1544,129517\n1544,130965\n1544,140665\n1544,148713\n1544,148742\n1544,148898\n1544,155710\n1544,163925\n1544,163928\n1544,167762\n1544,170984\n1544,175782\n1544,176822\n1544,182477\n1544,191911\n1544,193745\n1544,200539\n1544,213953\n1544,217268\n1544,217269\n1544,217270\n1544,217271\n1544,217273\n1544,217521\n1544,217523\n1544,217524\n1544,217526\n1544,217527\n1544,217530\n1544,218093\n1544,218094\n1544,218095\n1544,218353\n1544,218354\n1544,218355\n1544,218356\n1544,218357\n1544,218358\n1544,218359\n1544,218361\n1544,218362\n1544,218364\n1544,218365\n1544,218366\n1544,218438\n1544,219641\n1544,221176\n1544,229230\n1544,235820\n1544,235821\n1544,235824\n1544,235827\n1544,235829\n1544,235831\n1544,235832\n1544,235833\n1544,235834\n1544,235837\n1544,235839\n1544,235840\n1544,235897\n1544,243257\n1544,247346\n1544,252466\n1544,252467\n1544,252469\n1544,252473\n1544,252474\n1544,252475\n1544,252476\n1544,252580\n1544,252581\n1544,252582\n1544,252584\n1544,252586\n1544,252588\n1544,252589\n1544,252590\n1544,252591\n1544,252592\n1544,252597\n1544,252598\n1544,252599\n1544,252600\n1544,252601\n1544,252602\n1544,252603\n1544,252604\n1544,252605\n1544,252606\n1544,252607\n1544,252608\n1544,252610\n1544,252611\n1544,252612\n1544,252613\n1544,252614\n1544,252616\n1544,252617\n1544,252618\n1544,252619\n1544,252620\n1544,252621\n1544,252622\n1544,252623\n1544,252624\n1544,252625\n1544,252626\n1544,252627\n1544,252628\n1544,252629\n1544,252630\n1544,252631\n1544,252632\n1544,252634\n1544,252635\n1544,252636\n1544,252637\n1544,252638\n1544,252639\n1545,167\n1545,186\n1545,301\n1545,510\n1545,518\n1545,631\n1545,775\n1545,795\n1545,968\n1545,1001\n1545,1085\n1545,1326\n1545,1411\n1545,1415\n1545,1531\n1545,1688\n1545,3804\n1545,5130\n1545,5961\n1545,9017\n1546,147\n1546,158\n1546,1803\n1546,80266\n1546,89035\n1547,364\n1548,158\n1548,1001\n1549,32\n1550,264\n1550,1509\n1550,1551\n1551,111\n1551,446\n1551,673\n1551,838\n1551,849\n1551,872\n1551,1007\n1551,1011\n1551,1267\n1551,1293\n1551,1381\n1551,1531\n1551,1551\n1551,1973\n1551,3041\n1551,3507\n1551,5440\n1552,1319\n1553,182\n1554,158\n1554,206\n1554,1801\n1555,1556\n1556,87\n1556,314\n1556,599\n1556,838\n1556,872\n1556,1011\n1556,1634\n1557,250\n1557,887\n1557,1684\n1558,1559\n1559,209\n1559,217\n1559,256\n1559,292\n1559,366\n1559,397\n1559,455\n1559,462\n1559,479\n1559,510\n1559,516\n1559,626\n1559,685\n1559,702\n1559,849\n1559,875\n1559,911\n1559,929\n1559,972\n1559,973\n1559,1021\n1559,1026\n1559,1087\n1559,1147\n1559,1191\n1559,1197\n1559,1204\n1559,1326\n1559,1345\n1559,1370\n1559,1558\n1559,1566\n1559,1611\n1559,1619\n1559,1635\n1559,1659\n1559,1722\n1559,1805\n1559,3260\n1559,3263\n1559,4039\n1559,4361\n1559,6452\n1559,7883\n1559,8477\n1559,14009\n1559,14312\n1559,14569\n1559,15101\n1559,16568\n1559,16759\n1559,20709\n1559,21589\n1559,21668\n1559,23615\n1559,25388\n1559,25658\n1559,26347\n1559,26421\n1559,26865\n1559,28348\n1559,30121\n1559,36819\n1559,37191\n1559,37934\n1559,39700\n1559,46326\n1559,46950\n1559,50094\n1559,50096\n1559,55565\n1559,56890\n1559,63350\n1559,68271\n1559,75095\n1559,76636\n1559,79872\n1559,85979\n1559,88577\n1559,91917\n1559,96621\n1559,99646\n1559,104298\n1559,104385\n1559,104406\n1559,122449\n1559,122494\n1559,128120\n1559,136115\n1559,136116\n1559,137181\n1559,138890\n1559,142250\n1559,158249\n1559,158571\n1559,158631\n1559,160722\n1559,160849\n1559,162639\n1559,175274\n1559,177905\n1559,179789\n1559,180009\n1559,181394\n1559,181631\n1559,217680\n1559,219222\n1559,229128\n1559,229130\n1559,232842\n1559,243276\n1559,247515\n1559,247923\n1559,249673\n1559,250537\n1559,255534\n1559,258270\n1559,258284\n1561,752\n1561,873\n1561,1085\n1561,1210\n1562,50\n1562,79\n1562,333\n1563,47\n1563,417\n1563,1564\n1563,2469\n1563,2867\n1563,2868\n1564,3\n1564,10\n1564,34\n1564,35\n1564,137\n1564,167\n1564,240\n1564,261\n1564,301\n1564,392\n1564,417\n1564,536\n1564,589\n1564,615\n1564,631\n1564,784\n1564,818\n1564,911\n1564,968\n1564,972\n1564,1210\n1564,1240\n1564,1241\n1564,1285\n1564,1293\n1564,1309\n1564,1359\n1564,1370\n1564,1470\n1564,1563\n1564,1564\n1564,1660\n1564,1782\n1564,1787\n1564,1818\n1564,1832\n1564,2620\n1564,2812\n1564,3457\n1564,3504\n1564,3879\n1564,4107\n1564,4532\n1564,5278\n1564,5718\n1564,5814\n1564,6800\n1564,7999\n1564,8821\n1564,13296\n1564,13359\n1564,13637\n1564,14139\n1564,14587\n1564,14603\n1564,15164\n1564,16167\n1564,16174\n1564,17173\n1564,18569\n1564,18571\n1564,20535\n1564,27832\n1564,35343\n1564,35538\n1564,35541\n1564,39045\n1564,45693\n1564,52862\n1564,57054\n1564,57136\n1564,59205\n1564,59215\n1564,60814\n1564,62886\n1564,64594\n1564,65864\n1564,75912\n1564,80988\n1564,93099\n1564,94182\n1564,104745\n1564,105740\n1564,110219\n1564,110358\n1564,110699\n1564,110704\n1564,111147\n1564,127158\n1564,127798\n1564,135081\n1564,135082\n1564,135183\n1564,135970\n1564,138698\n1564,139956\n1564,140011\n1564,144978\n1564,145630\n1564,145631\n1564,145986\n1564,150081\n1564,154892\n1564,157922\n1564,160521\n1564,160820\n1564,163454\n1564,173907\n1564,181565\n1564,191168\n1564,193012\n1564,193501\n1564,194375\n1564,220343\n1564,226684\n1564,228652\n1564,229795\n1564,229815\n1564,235292\n1564,235305\n1564,235309\n1564,236859\n1564,237146\n1564,237496\n1564,238532\n1564,247366\n1564,252103\n1564,254435\n1564,255180\n1564,261820\n1565,439\n1565,671\n1566,1\n1566,10\n1566,20\n1566,37\n1566,68\n1566,126\n1566,147\n1566,167\n1566,175\n1566,182\n1566,186\n1566,207\n1566,209\n1566,222\n1566,240\n1566,256\n1566,259\n1566,299\n1566,314\n1566,336\n1566,388\n1566,389\n1566,392\n1566,397\n1566,408\n1566,438\n1566,441\n1566,452\n1566,457\n1566,467\n1566,500\n1566,502\n1566,510\n1566,512\n1566,516\n1566,518\n1566,534\n1566,535\n1566,536\n1566,577\n1566,586\n1566,589\n1566,599\n1566,615\n1566,676\n1566,685\n1566,693\n1566,694\n1566,718\n1566,755\n1566,764\n1566,788\n1566,808\n1566,809\n1566,818\n1566,843\n1566,849\n1566,862\n1566,868\n1566,872\n1566,874\n1566,875\n1566,911\n1566,915\n1566,918\n1566,929\n1566,968\n1566,972\n1566,1014\n1566,1085\n1566,1087\n1566,1096\n1566,1113\n1566,1118\n1566,1140\n1566,1141\n1566,1147\n1566,1191\n1566,1204\n1566,1284\n1566,1293\n1566,1298\n1566,1326\n1566,1417\n1566,1434\n1566,1445\n1566,1559\n1566,1566\n1566,1572\n1566,1655\n1566,1663\n1566,1696\n1566,1724\n1566,1749\n1566,1796\n1566,1848\n1566,1992\n1566,2037\n1566,2112\n1566,2167\n1566,2253\n1566,2460\n1566,2512\n1566,2605\n1566,2874\n1566,3392\n1566,3422\n1566,3507\n1566,3582\n1566,3744\n1566,3804\n1566,3972\n1566,4028\n1566,4094\n1566,4165\n1566,4190\n1566,4200\n1566,4276\n1566,4381\n1566,5022\n1566,5193\n1566,5226\n1566,5356\n1566,5422\n1566,5641\n1566,6405\n1566,6685\n1566,6695\n1566,6824\n1566,6837\n1566,7117\n1566,8055\n1566,9457\n1566,13207\n1566,13622\n1566,14304\n1566,15608\n1566,15691\n1566,18133\n1566,19668\n1566,20792\n1566,21283\n1566,21442\n1566,21494\n1566,23740\n1566,26126\n1566,26127\n1566,26312\n1566,26450\n1566,26928\n1566,26976\n1566,28799\n1566,29076\n1566,30318\n1566,30617\n1566,31021\n1566,31280\n1566,32747\n1566,32838\n1566,33287\n1566,35315\n1566,37479\n1566,40588\n1566,44272\n1566,44828\n1566,46947\n1566,50285\n1566,51954\n1566,54352\n1566,54371\n1566,54928\n1566,55828\n1566,63591\n1566,64845\n1566,64847\n1566,66243\n1566,75363\n1566,75912\n1566,79835\n1566,83224\n1566,91231\n1566,94069\n1566,99532\n1566,115283\n1566,115474\n1566,120961\n1566,127646\n1566,127648\n1566,133368\n1566,133464\n1566,154765\n1566,154855\n1566,156379\n1566,158979\n1566,168300\n1566,172629\n1566,175986\n1566,176757\n1566,177720\n1566,177772\n1566,178610\n1566,186681\n1566,189650\n1566,203169\n1566,215874\n1566,230384\n1566,237573\n1566,242246\n1566,243493\n1566,249620\n1567,1452\n1568,106\n1568,192\n1568,202\n1568,203\n1568,252\n1568,275\n1568,307\n1568,467\n1568,493\n1568,516\n1568,571\n1568,602\n1568,682\n1568,733\n1568,868\n1568,1220\n1568,1222\n1568,1243\n1568,1385\n1568,1512\n1568,1655\n1568,1927\n1568,5992\n1568,21944\n1568,41170\n1568,72439\n1568,189839\n1569,602\n1570,19\n1570,83\n1570,313\n1570,1010\n1570,1571\n1570,2266\n1570,211889\n1571,8\n1571,19\n1571,222\n1571,313\n1571,385\n1571,389\n1571,536\n1571,634\n1571,657\n1571,911\n1571,1299\n1571,1313\n1571,1571\n1571,1576\n1571,1618\n1571,1843\n1571,2046\n1571,2092\n1571,2159\n1571,2168\n1571,2224\n1571,2253\n1571,2266\n1571,2290\n1571,2421\n1571,2424\n1571,2646\n1571,2784\n1571,2944\n1571,4085\n1571,4321\n1571,5326\n1571,9111\n1571,9379\n1571,13328\n1571,14675\n1571,17811\n1571,17825\n1571,18831\n1571,18887\n1571,19913\n1571,19916\n1571,20926\n1571,22816\n1571,23287\n1571,23813\n1571,24922\n1571,25647\n1571,26058\n1571,28511\n1571,31771\n1571,32774\n1571,33274\n1571,37908\n1571,38218\n1571,39618\n1571,45993\n1571,48278\n1571,60081\n1571,71690\n1571,81993\n1571,94195\n1571,96835\n1571,97393\n1571,98218\n1571,123517\n1571,160975\n1571,163291\n1571,168580\n1571,171780\n1571,174955\n1571,180853\n1571,184755\n1571,190576\n1571,202044\n1571,211889\n1571,222130\n1571,223132\n1571,223656\n1571,224113\n1571,228360\n1572,10\n1572,107\n1572,111\n1572,248\n1572,254\n1572,289\n1572,292\n1572,301\n1572,336\n1572,338\n1572,397\n1572,417\n1572,441\n1572,462\n1572,535\n1572,595\n1572,609\n1572,626\n1572,636\n1572,693\n1572,702\n1572,745\n1572,749\n1572,818\n1572,838\n1572,911\n1572,945\n1572,978\n1572,1007\n1572,1014\n1572,1025\n1572,1045\n1572,1046\n1572,1058\n1572,1085\n1572,1087\n1572,1118\n1572,1140\n1572,1151\n1572,1192\n1572,1220\n1572,1222\n1572,1238\n1572,1326\n1572,1329\n1572,1332\n1572,1417\n1572,1453\n1572,1529\n1572,1566\n1572,1572\n1572,1623\n1572,1653\n1572,1677\n1572,1688\n1572,1722\n1572,1801\n1572,1844\n1572,1860\n1572,1968\n1572,1973\n1572,2123\n1572,2124\n1572,2367\n1572,2373\n1572,2582\n1572,3035\n1572,3367\n1572,3483\n1572,3494\n1572,3538\n1572,4039\n1572,4066\n1572,4114\n1572,4580\n1572,4581\n1572,4771\n1572,5053\n1572,5258\n1572,5265\n1572,5551\n1572,5935\n1572,6068\n1572,6569\n1572,6880\n1572,6896\n1572,7022\n1572,7806\n1572,13193\n1572,14353\n1572,15386\n1572,15612\n1572,17352\n1572,21442\n1572,25497\n1572,26288\n1572,26404\n1572,30763\n1572,32819\n1572,33279\n1572,35913\n1572,36788\n1572,37414\n1572,40442\n1572,42113\n1572,44522\n1572,49062\n1572,50474\n1572,50711\n1572,55416\n1572,55538\n1572,61083\n1572,71988\n1572,75912\n1572,78696\n1572,88705\n1572,94134\n1572,94801\n1572,97392\n1572,112922\n1572,122042\n1572,126377\n1572,130424\n1572,138239\n1572,159753\n1572,160339\n1572,161947\n1572,163015\n1572,167626\n1572,182162\n1572,185283\n1572,187284\n1572,192643\n1572,202597\n1572,205259\n1572,205825\n1572,218763\n1572,239389\n1572,245924\n1573,417\n1574,309\n1574,310\n1575,808\n1575,1479\n1575,2480\n1575,124668\n1577,66\n1577,467\n1577,868\n1578,1579\n1579,87\n1579,292\n1579,673\n1579,1579\n1580,304\n1580,372\n1580,390\n1580,431\n1580,685\n1580,765\n1580,775\n1580,852\n1580,1085\n1580,1581\n1580,2572\n1580,3093\n1580,4222\n1580,6004\n1580,14011\n1580,28832\n1580,49373\n1580,49469\n1580,58503\n1580,61272\n1580,64026\n1580,75912\n1580,81091\n1580,82733\n1580,87292\n1580,87754\n1580,93563\n1580,93652\n1580,93760\n1580,93763\n1580,93769\n1580,94367\n1580,95469\n1580,96280\n1580,101746\n1580,103860\n1580,107495\n1580,115674\n1580,115675\n1580,116102\n1580,116504\n1580,116506\n1580,116507\n1580,116508\n1580,117798\n1580,123800\n1580,123825\n1580,123838\n1580,124512\n1580,125993\n1580,127158\n1580,134090\n1580,134097\n1580,134579\n1580,141848\n1580,156574\n1580,161299\n1580,168921\n1580,178576\n1580,181028\n1580,185874\n1580,212692\n1580,250601\n1580,252676\n1582,422\n1582,602\n1582,620\n1582,3148\n1582,8244\n1583,1238\n1584,32\n1584,107\n1584,338\n1584,344\n1584,349\n1584,510\n1584,575\n1584,673\n1584,801\n1584,835\n1584,991\n1584,1345\n1584,1722\n1584,2605\n1584,3003\n1584,3367\n1584,4039\n1584,6638\n1585,557\n1586,65\n1586,868\n1587,949\n1588,949\n1589,302\n1590,11\n1590,20\n1590,314\n1590,346\n1590,435\n1590,439\n1590,447\n1590,538\n1590,599\n1590,671\n1590,693\n1590,766\n1590,844\n1590,1033\n1590,1130\n1590,1294\n1590,1474\n1590,1502\n1590,1590\n1590,1644\n1590,1973\n1590,2085\n1590,2138\n1590,2352\n1590,2418\n1590,3626\n1590,3936\n1590,6216\n1590,6427\n1590,6586\n1590,6661\n1590,6801\n1590,7087\n1590,8444\n1590,13224\n1590,13946\n1590,14233\n1590,15141\n1590,16357\n1590,16581\n1590,17016\n1590,17424\n1590,19191\n1590,19728\n1590,24801\n1590,26163\n1590,26787\n1590,29105\n1590,30775\n1590,31788\n1590,36982\n1590,38209\n1590,38300\n1590,39624\n1590,40575\n1590,44492\n1590,44624\n1590,45460\n1590,48290\n1590,48394\n1590,49470\n1590,50354\n1590,54960\n1590,55040\n1590,55427\n1590,67823\n1590,70737\n1590,75867\n1590,76989\n1590,88437\n1590,90226\n1590,102496\n1590,106083\n1590,106377\n1590,110504\n1590,112965\n1590,117480\n1590,118651\n1590,120155\n1590,122007\n1590,122110\n1590,122117\n1590,124361\n1590,128345\n1590,128823\n1590,128880\n1590,138125\n1590,155116\n1590,163898\n1590,165022\n1590,192004\n1590,212498\n1590,214542\n1590,224775\n1590,225323\n1590,225592\n1590,229745\n1590,247302\n1590,247686\n1590,248859\n1590,251188\n1590,253099\n1590,255162\n1590,256346\n1590,263622\n1590,263942\n1591,1298\n1592,175\n1592,215\n1592,309\n1592,310\n1592,483\n1592,1177\n1592,1882\n1592,2210\n1592,6556\n1593,481\n1594,493\n1595,209\n1596,48\n1596,130\n1596,160\n1597,788\n1598,333\n1599,68\n1599,217\n1599,518\n1599,764\n1599,775\n1599,1326\n1599,3804\n1599,5130\n1599,23437\n1600,620\n1600,8244\n1601,306\n1601,307\n1601,493\n1601,602\n1601,682\n1601,30331\n1601,72439\n1602,323\n1603,259\n1603,481\n1603,497\n1603,668\n1603,712\n1603,713\n1603,911\n1603,1014\n1603,1262\n1603,2373\n1603,3967\n1603,6861\n1603,6948\n1603,13291\n1603,19413\n1603,32013\n1603,62676\n1603,82217\n1603,127826\n1603,241573\n1603,245369\n1603,258471\n1605,65\n1605,66\n1605,467\n1605,868\n1605,1345\n1605,156379\n1605,162599\n1606,1607\n1607,287\n1607,326\n1607,433\n1607,1368\n1607,1606\n1607,1607\n1607,1634\n1607,3423\n1607,3582\n1607,4272\n1607,5192\n1607,6456\n1607,15152\n1607,19302\n1607,19453\n1607,20529\n1607,26833\n1607,32358\n1607,34208\n1607,34721\n1607,34770\n1607,39473\n1607,42731\n1607,62606\n1607,83619\n1607,88661\n1607,107957\n1607,109671\n1607,112844\n1607,120129\n1607,121505\n1607,127132\n1607,130828\n1607,133384\n1607,142717\n1607,161289\n1607,169585\n1607,172551\n1607,177825\n1607,183386\n1607,183391\n1607,214082\n1607,221708\n1607,226165\n1607,238760\n1608,41\n1608,42\n1608,68\n1608,104\n1608,139\n1608,233\n1608,240\n1608,290\n1608,332\n1608,446\n1608,590\n1608,612\n1608,631\n1608,677\n1608,685\n1608,714\n1608,784\n1608,911\n1608,1195\n1608,1353\n1608,1459\n1608,1462\n1608,1505\n1608,1608\n1608,1609\n1608,1973\n1608,2512\n1608,2989\n1608,2991\n1608,3135\n1608,4220\n1608,4532\n1608,5331\n1608,5736\n1608,8245\n1608,9087\n1608,9397\n1608,9509\n1608,14211\n1608,15169\n1608,15586\n1608,17674\n1608,18755\n1608,19126\n1608,19502\n1608,19664\n1608,19723\n1608,19798\n1608,20676\n1608,20708\n1608,23697\n1608,24698\n1608,24842\n1608,25046\n1608,25348\n1608,25597\n1608,25808\n1608,26304\n1608,26310\n1608,26660\n1608,26773\n1608,27108\n1608,27109\n1608,28008\n1608,29081\n1608,29115\n1608,29764\n1608,33385\n1608,33550\n1608,35514\n1608,36829\n1608,37688\n1608,37771\n1608,38222\n1608,39481\n1608,39639\n1608,39756\n1608,41472\n1608,41497\n1608,41499\n1608,42564\n1608,43749\n1608,44232\n1608,48185\n1608,48236\n1608,48719\n1608,49568\n1608,50536\n1608,50564\n1608,50576\n1608,50589\n1608,55061\n1608,55332\n1608,55656\n1608,55659\n1608,56351\n1608,56648\n1608,57109\n1608,57188\n1608,57206\n1608,57634\n1608,58301\n1608,60603\n1608,62327\n1608,62542\n1608,63201\n1608,64174\n1608,64704\n1608,68237\n1608,71916\n1608,72086\n1608,72905\n1608,72969\n1608,73638\n1608,73908\n1608,76276\n1608,77263\n1608,77315\n1608,80730\n1608,81483\n1608,81602\n1608,82065\n1608,82404\n1608,82427\n1608,82466\n1608,82912\n1608,84052\n1608,86827\n1608,88216\n1608,88980\n1608,89826\n1608,92083\n1608,92992\n1608,94134\n1608,94891\n1608,105791\n1608,106197\n1608,109562\n1608,109564\n1608,112117\n1608,113563\n1608,114269\n1608,115387\n1608,115967\n1608,118918\n1608,120925\n1608,121476\n1608,121730\n1608,122602\n1608,124855\n1608,124856\n1608,125150\n1608,125701\n1608,125711\n1608,127689\n1608,128741\n1608,129085\n1608,129923\n1608,130451\n1608,130776\n1608,130779\n1608,134597\n1608,134692\n1608,134696\n1608,135357\n1608,136462\n1608,137096\n1608,140341\n1608,142524\n1608,142889\n1608,144155\n1608,146106\n1608,149872\n1608,150371\n1608,151918\n1608,153356\n1608,155183\n1608,155887\n1608,156351\n1608,156999\n1608,160407\n1608,162428\n1608,162990\n1608,164013\n1608,169338\n1608,171785\n1608,171816\n1608,172112\n1608,172364\n1608,173834\n1608,176543\n1608,179852\n1608,179936\n1608,180954\n1608,181591\n1608,181691\n1608,192919\n1608,195763\n1608,199401\n1608,200030\n1608,200381\n1608,204171\n1608,207126\n1608,215985\n1608,216813\n1608,216854\n1608,217702\n1608,217703\n1608,221721\n1608,222621\n1608,224501\n1608,228152\n1608,229798\n1608,232151\n1608,244494\n1608,244613\n1608,255629\n1608,257033\n1609,1608\n1609,77315\n1610,46\n1610,660\n1611,178\n1611,538\n1611,972\n1611,1313\n1611,1559\n1611,1612\n1612,20\n1612,346\n1612,435\n1612,439\n1612,510\n1612,538\n1612,671\n1612,939\n1612,1096\n1612,1474\n1612,1611\n1612,3831\n1612,4646\n1612,5078\n1612,5189\n1612,5659\n1612,7060\n1612,7921\n1612,7993\n1612,13657\n1612,14578\n1612,18220\n1612,22221\n1612,26850\n1612,32773\n1612,34935\n1612,50246\n1612,50285\n1612,54458\n1612,54808\n1612,55580\n1612,56140\n1612,62001\n1612,75242\n1612,81554\n1612,82872\n1612,86375\n1612,98880\n1612,104339\n1612,107358\n1612,128250\n1612,136009\n1612,140150\n1612,140776\n1612,145030\n1612,151150\n1612,155224\n1612,164226\n1612,164232\n1612,166443\n1612,170684\n1612,172083\n1612,175311\n1612,178066\n1612,178067\n1612,178931\n1612,193659\n1612,197782\n1612,214186\n1612,215464\n1612,238505\n1613,497\n1614,581\n1615,1616\n1616,182\n1616,356\n1616,522\n1616,663\n1616,666\n1616,750\n1616,852\n1616,937\n1616,973\n1616,1167\n1616,1192\n1616,1298\n1616,1436\n1616,1591\n1616,1615\n1616,1616\n1616,1635\n1616,1849\n1616,1853\n1616,1937\n1616,2038\n1616,2979\n1616,3392\n1616,3630\n1616,4169\n1616,14165\n1616,14246\n1616,15663\n1616,20335\n1616,23480\n1616,25286\n1616,33442\n1616,38959\n1616,42767\n1616,45448\n1616,46995\n1616,51684\n1616,58135\n1616,73570\n1616,76704\n1616,76953\n1616,82257\n1616,96685\n1616,97193\n1616,97318\n1616,108559\n1616,111043\n1616,119349\n1616,127650\n1616,127866\n1616,128654\n1616,129746\n1616,130455\n1616,133587\n1616,144092\n1616,147476\n1616,148319\n1616,153619\n1616,162608\n1616,163363\n1616,163370\n1616,168315\n1616,178810\n1616,178943\n1616,179794\n1616,180319\n1616,180321\n1616,184339\n1616,187176\n1616,187611\n1616,188325\n1616,190277\n1616,212734\n1616,216799\n1616,217459\n1616,219372\n1616,236487\n1616,237319\n1616,247767\n1616,248796\n1616,257977\n1616,263731\n1617,34\n1617,35\n1617,135\n1617,222\n1617,379\n1617,385\n1617,455\n1617,477\n1617,536\n1617,634\n1617,1274\n1617,1571\n1617,1618\n1617,2168\n1617,2266\n1617,2646\n1617,2944\n1617,4223\n1617,5591\n1617,6556\n1617,7698\n1617,23287\n1617,28130\n1618,313\n1618,379\n1618,385\n1618,389\n1618,477\n1618,536\n1618,660\n1618,682\n1618,781\n1618,852\n1618,1571\n1618,1618\n1618,2159\n1618,2168\n1618,2224\n1618,2424\n1618,2553\n1618,2784\n1618,2944\n1618,5458\n1618,5591\n1618,7698\n1618,8152\n1618,8463\n1618,13622\n1618,14556\n1618,18831\n1618,19998\n1618,20265\n1618,20279\n1618,23287\n1618,30617\n1618,38859\n1618,54564\n1618,56040\n1618,59794\n1618,72439\n1618,94195\n1618,111222\n1618,169212\n1618,202044\n1618,211889\n1618,217889\n1618,252188\n1619,1\n1619,56\n1619,126\n1619,146\n1619,147\n1619,149\n1619,158\n1619,178\n1619,184\n1619,192\n1619,195\n1619,202\n1619,203\n1619,256\n1619,333\n1619,336\n1619,406\n1619,422\n1619,425\n1619,435\n1619,485\n1619,505\n1619,516\n1619,602\n1619,640\n1619,673\n1619,693\n1619,733\n1619,779\n1619,809\n1619,818\n1619,841\n1619,859\n1619,911\n1619,920\n1619,1089\n1619,1130\n1619,1172\n1619,1204\n1619,1205\n1619,1294\n1619,1370\n1619,1469\n1619,1498\n1619,1518\n1619,1559\n1619,1619\n1619,1620\n1619,1623\n1619,1844\n1619,1848\n1619,1870\n1619,1973\n1619,2014\n1619,2080\n1619,2174\n1619,2367\n1619,2373\n1619,2374\n1619,2471\n1619,2540\n1619,3367\n1619,4099\n1619,4227\n1619,4262\n1619,4317\n1619,5018\n1619,5495\n1619,5514\n1619,5908\n1619,6119\n1619,6311\n1619,7921\n1619,13140\n1619,14389\n1619,14511\n1619,14830\n1619,16703\n1619,18851\n1619,19806\n1619,19884\n1619,20664\n1619,22616\n1619,23783\n1619,23861\n1619,24808\n1619,27057\n1619,28192\n1619,28803\n1619,29917\n1619,30331\n1619,30841\n1619,34195\n1619,36420\n1619,37430\n1619,38954\n1619,41230\n1619,47095\n1619,48278\n1619,49373\n1619,50037\n1619,50363\n1619,54326\n1619,60576\n1619,61320\n1619,62471\n1619,63038\n1619,63504\n1619,65862\n1619,65901\n1619,65911\n1619,65972\n1619,66412\n1619,67368\n1619,67898\n1619,70850\n1619,70852\n1619,71083\n1619,71303\n1619,73288\n1619,74535\n1619,75783\n1619,77511\n1619,77650\n1619,80059\n1619,87870\n1619,88594\n1619,89691\n1619,92476\n1619,94095\n1619,94955\n1619,95346\n1619,98811\n1619,103878\n1619,105259\n1619,107083\n1619,109560\n1619,109898\n1619,110032\n1619,118336\n1619,121110\n1619,121606\n1619,122192\n1619,122905\n1619,125093\n1619,125912\n1619,127158\n1619,129775\n1619,129981\n1619,136463\n1619,138830\n1619,138831\n1619,142882\n1619,149312\n1619,155030\n1619,159676\n1619,165029\n1619,165509\n1619,165823\n1619,166541\n1619,168867\n1619,169373\n1619,172131\n1619,173949\n1619,193679\n1619,195107\n1619,198268\n1619,204124\n1619,207671\n1619,208015\n1619,216180\n1619,221899\n1619,225050\n1619,227294\n1619,238421\n1619,241660\n1619,244129\n1619,248667\n1619,256586\n1619,258209\n1619,258938\n1619,259810\n1619,260336\n1621,1289\n1622,1619\n1622,1623\n1623,1\n1623,10\n1623,44\n1623,50\n1623,56\n1623,79\n1623,106\n1623,146\n1623,147\n1623,149\n1623,158\n1623,175\n1623,184\n1623,192\n1623,195\n1623,202\n1623,211\n1623,256\n1623,287\n1623,301\n1623,333\n1623,336\n1623,337\n1623,406\n1623,422\n1623,446\n1623,467\n1623,505\n1623,586\n1623,602\n1623,606\n1623,615\n1623,638\n1623,640\n1623,663\n1623,673\n1623,676\n1623,693\n1623,733\n1623,818\n1623,841\n1623,849\n1623,920\n1623,932\n1623,937\n1623,949\n1623,957\n1623,973\n1623,1089\n1623,1118\n1623,1181\n1623,1267\n1623,1293\n1623,1298\n1623,1319\n1623,1370\n1623,1414\n1623,1458\n1623,1566\n1623,1572\n1623,1619\n1623,1620\n1623,1623\n1623,1815\n1623,1844\n1623,1848\n1623,2174\n1623,2244\n1623,2367\n1623,2451\n1623,2471\n1623,2580\n1623,2903\n1623,3370\n1623,3895\n1623,4272\n1623,4344\n1623,5265\n1623,5486\n1623,5804\n1623,6119\n1623,6549\n1623,6684\n1623,6685\n1623,7731\n1623,8285\n1623,9510\n1623,14145\n1623,14389\n1623,14453\n1623,15556\n1623,15560\n1623,15587\n1623,15829\n1623,16561\n1623,16703\n1623,17151\n1623,17166\n1623,19884\n1623,20035\n1623,20439\n1623,21589\n1623,22206\n1623,22616\n1623,23783\n1623,24066\n1623,25555\n1623,25668\n1623,26716\n1623,26841\n1623,27057\n1623,30331\n1623,31080\n1623,31172\n1623,31421\n1623,33383\n1623,35561\n1623,36420\n1623,36973\n1623,37123\n1623,37430\n1623,37771\n1623,38634\n1623,39285\n1623,39437\n1623,40514\n1623,44567\n1623,50083\n1623,52021\n1623,54340\n1623,56119\n1623,60576\n1623,61320\n1623,64353\n1623,65809\n1623,68177\n1623,68629\n1623,68632\n1623,71303\n1623,72764\n1623,76081\n1623,76835\n1623,79882\n1623,83014\n1623,83314\n1623,83320\n1623,85817\n1623,87744\n1623,87843\n1623,87870\n1623,88348\n1623,91055\n1623,92476\n1623,101906\n1623,104288\n1623,104631\n1623,105535\n1623,105750\n1623,112537\n1623,116536\n1623,117881\n1623,121110\n1623,122406\n1623,123587\n1623,127158\n1623,128783\n1623,128787\n1623,130938\n1623,140760\n1623,146001\n1623,150746\n1623,151428\n1623,157378\n1623,159069\n1623,168271\n1623,168804\n1623,170834\n1623,170846\n1623,170848\n1623,170849\n1623,170854\n1623,171641\n1623,177257\n1623,177708\n1623,177828\n1623,179157\n1623,184742\n1623,185927\n1623,194467\n1623,194645\n1623,194938\n1623,194939\n1623,195737\n1623,201302\n1623,204124\n1623,219169\n1623,221828\n1623,222867\n1623,225050\n1623,225482\n1623,227376\n1623,230555\n1623,237291\n1623,237319\n1623,237320\n1623,237322\n1623,238076\n1623,241660\n1623,241698\n1623,242859\n1623,242976\n1623,244960\n1623,246801\n1623,261466\n1623,264369\n1624,255\n1624,450\n1625,640\n1626,861\n1627,167\n1627,299\n1627,301\n1627,604\n1627,615\n1627,872\n1627,968\n1627,1293\n1627,2083\n1627,2557\n1627,103860\n1628,415\n1629,86\n1630,248\n1631,41\n1631,108\n1631,248\n1631,289\n1631,290\n1631,373\n1631,431\n1631,588\n1631,590\n1631,631\n1631,760\n1631,761\n1631,784\n1631,791\n1631,805\n1631,1119\n1631,1346\n1631,1402\n1631,1462\n1631,1631\n1631,1808\n1631,1879\n1631,1888\n1631,2383\n1631,3566\n1631,3694\n1631,3914\n1631,3974\n1631,4265\n1631,4619\n1631,5021\n1631,5529\n1631,5535\n1631,5545\n1631,5679\n1631,6853\n1631,7739\n1631,7790\n1631,8150\n1631,8537\n1631,8763\n1631,9078\n1631,13207\n1631,14112\n1631,14487\n1631,15339\n1631,15397\n1631,15856\n1631,16137\n1631,16306\n1631,19454\n1631,22299\n1631,22490\n1631,24839\n1631,25591\n1631,25814\n1631,33750\n1631,34707\n1631,35202\n1631,35371\n1631,35528\n1631,41395\n1631,41871\n1631,43217\n1631,44298\n1631,44839\n1631,45398\n1631,45422\n1631,47454\n1631,49398\n1631,49657\n1631,54575\n1631,55022\n1631,56406\n1631,61318\n1631,61961\n1631,62802\n1631,63909\n1631,65681\n1631,66519\n1631,68310\n1631,76263\n1631,78154\n1631,79619\n1631,82095\n1631,82352\n1631,82869\n1631,88605\n1631,89924\n1631,90237\n1631,99544\n1631,103366\n1631,105221\n1631,106402\n1631,118020\n1631,121119\n1631,123359\n1631,123852\n1631,127715\n1631,136095\n1631,137009\n1631,137022\n1631,137045\n1631,137046\n1631,152695\n1631,159709\n1631,159717\n1631,160155\n1631,160999\n1631,161872\n1631,165334\n1631,166442\n1631,167440\n1631,169330\n1631,179877\n1631,183733\n1631,196801\n1631,197787\n1631,197930\n1631,200794\n1631,207583\n1631,212333\n1631,213954\n1631,229229\n1631,233452\n1631,244205\n1631,244551\n1631,244714\n1631,244984\n1631,245285\n1631,251913\n1631,255014\n1631,256176\n1631,258042\n1631,259407\n1631,261674\n1631,261843\n1632,32\n1632,392\n1632,697\n1632,1769\n1632,2699\n1632,3003\n1633,1433\n1633,1634\n1634,10\n1634,22\n1634,68\n1634,207\n1634,287\n1634,314\n1634,326\n1634,349\n1634,392\n1634,432\n1634,433\n1634,440\n1634,446\n1634,452\n1634,457\n1634,510\n1634,599\n1634,673\n1634,685\n1634,693\n1634,697\n1634,752\n1634,794\n1634,809\n1634,818\n1634,838\n1634,872\n1634,874\n1634,911\n1634,935\n1634,1014\n1634,1130\n1634,1133\n1634,1210\n1634,1240\n1634,1422\n1634,1466\n1634,1607\n1634,1634\n1634,1796\n1634,1799\n1634,1824\n1634,1874\n1634,1876\n1634,1968\n1634,1973\n1634,1992\n1634,3443\n1634,3874\n1634,4390\n1634,4450\n1634,5073\n1634,5181\n1634,5196\n1634,5231\n1634,5324\n1634,5381\n1634,5633\n1634,5939\n1634,5942\n1634,5955\n1634,6824\n1634,7818\n1634,8339\n1634,8425\n1634,8562\n1634,9414\n1634,12818\n1634,13188\n1634,13228\n1634,13259\n1634,14128\n1634,14304\n1634,15180\n1634,15609\n1634,16337\n1634,18138\n1634,18387\n1634,19384\n1634,20389\n1634,20409\n1634,21174\n1634,21244\n1634,23363\n1634,23456\n1634,23773\n1634,24922\n1634,26301\n1634,29580\n1634,30328\n1634,33425\n1634,33433\n1634,33703\n1634,34128\n1634,34775\n1634,36003\n1634,36421\n1634,37371\n1634,37692\n1634,40442\n1634,40474\n1634,41242\n1634,41867\n1634,41928\n1634,42011\n1634,42725\n1634,48502\n1634,48895\n1634,49041\n1634,49247\n1634,49301\n1634,55212\n1634,55674\n1634,59744\n1634,60400\n1634,61251\n1634,62329\n1634,63422\n1634,64477\n1634,65814\n1634,66660\n1634,67141\n1634,67354\n1634,67392\n1634,67574\n1634,78382\n1634,79673\n1634,82056\n1634,83990\n1634,84172\n1634,84528\n1634,84686\n1634,85786\n1634,86679\n1634,86724\n1634,91511\n1634,92311\n1634,93113\n1634,93565\n1634,95386\n1634,97392\n1634,103537\n1634,103747\n1634,104447\n1634,104565\n1634,105553\n1634,105557\n1634,108066\n1634,108705\n1634,108991\n1634,110200\n1634,110320\n1634,110649\n1634,110708\n1634,111266\n1634,112052\n1634,112053\n1634,112054\n1634,112055\n1634,112056\n1634,112057\n1634,112058\n1634,112619\n1634,112937\n1634,115949\n1634,117552\n1634,119477\n1634,119586\n1634,120114\n1634,120602\n1634,121040\n1634,122515\n1634,123067\n1634,124375\n1634,125108\n1634,127158\n1634,130342\n1634,130924\n1634,130937\n1634,131345\n1634,134193\n1634,138485\n1634,139529\n1634,139955\n1634,142812\n1634,144004\n1634,145429\n1634,145864\n1634,148699\n1634,152175\n1634,158572\n1634,160545\n1634,162626\n1634,163328\n1634,164832\n1634,164834\n1634,164861\n1634,165727\n1634,167883\n1634,169960\n1634,171304\n1634,173319\n1634,175858\n1634,176644\n1634,180900\n1634,182199\n1634,183494\n1634,188329\n1634,189946\n1634,191398\n1634,195416\n1634,208017\n1634,213800\n1634,217358\n1634,221143\n1634,221799\n1634,225393\n1634,229658\n1634,229712\n1634,236888\n1634,241356\n1634,245396\n1634,247366\n1634,248696\n1634,256429\n1634,256960\n1634,260909\n1635,167\n1635,186\n1635,301\n1635,372\n1635,373\n1635,631\n1635,677\n1635,715\n1635,780\n1635,797\n1635,805\n1635,818\n1635,823\n1635,941\n1635,1119\n1635,1149\n1635,1167\n1635,1209\n1635,1300\n1635,1309\n1635,1436\n1635,1616\n1635,1635\n1635,1688\n1635,1849\n1635,1973\n1635,2083\n1635,2974\n1635,2979\n1635,2982\n1635,3392\n1635,4723\n1635,7349\n1635,8686\n1635,13166\n1635,13443\n1635,13549\n1635,14456\n1635,15857\n1635,18856\n1635,21299\n1635,22299\n1635,23478\n1635,24839\n1635,25439\n1635,26308\n1635,27056\n1635,34307\n1635,35371\n1635,39047\n1635,40776\n1635,50104\n1635,64205\n1635,66766\n1635,68310\n1635,74717\n1635,86591\n1635,93313\n1635,95048\n1635,98922\n1635,109863\n1635,113444\n1635,116739\n1635,118451\n1635,124527\n1635,124911\n1635,126123\n1635,126189\n1635,129269\n1635,130275\n1635,131371\n1635,136259\n1635,136462\n1635,136631\n1635,138318\n1635,141894\n1635,142361\n1635,142513\n1635,142522\n1635,148111\n1635,152298\n1635,162663\n1635,163120\n1635,175912\n1635,186129\n1635,194731\n1635,195020\n1635,214886\n1635,217349\n1635,219496\n1635,220144\n1635,225934\n1635,229228\n1635,229599\n1635,262448\n1636,273\n1636,274\n1637,305\n1638,1639\n1639,41\n1639,1707\n1639,3538\n1640,726\n1641,41\n1641,104\n1641,289\n1641,290\n1641,534\n1641,714\n1641,1085\n1641,2253\n1641,4218\n1641,4220\n1641,44725\n1641,94134\n1642,874\n1643,1644\n1644,20\n1644,178\n1644,346\n1644,439\n1644,447\n1644,538\n1644,671\n1644,911\n1644,996\n1644,1294\n1644,1474\n1644,1590\n1644,1644\n1644,1973\n1644,2030\n1644,2138\n1644,2427\n1644,3936\n1644,6661\n1644,13224\n1644,13805\n1644,14511\n1644,15141\n1644,17016\n1644,17116\n1644,19728\n1644,19817\n1644,23787\n1644,26972\n1644,30043\n1644,30775\n1644,40575\n1644,43328\n1644,48394\n1644,49470\n1644,54701\n1644,59685\n1644,67823\n1644,68347\n1644,69600\n1644,73508\n1644,105578\n1644,106377\n1644,107601\n1644,107705\n1644,110254\n1644,110504\n1644,112965\n1644,114587\n1644,117157\n1644,120155\n1644,122110\n1644,128880\n1644,139748\n1644,140081\n1644,142968\n1644,150153\n1644,150318\n1644,155116\n1644,182180\n1644,184989\n1644,195156\n1645,920\n1646,160\n1647,663\n1647,664\n1648,280\n1648,827\n1649,209\n1650,1262\n1651,439\n1651,447\n1651,671\n1651,932\n1651,1033\n1651,1294\n1651,1612\n1651,1849\n1651,6654\n1651,13486\n1651,15802\n1651,32784\n1652,107\n1653,292\n1653,356\n1653,440\n1653,441\n1653,462\n1653,626\n1653,745\n1653,794\n1653,872\n1653,978\n1653,1058\n1653,1096\n1653,1238\n1653,1240\n1653,1424\n1653,1453\n1653,1454\n1653,1572\n1653,1677\n1653,1722\n1653,1848\n1653,1973\n1653,2436\n1653,3507\n1653,3830\n1653,4039\n1653,4565\n1653,5258\n1653,6581\n1653,7530\n1653,8096\n1653,8149\n1653,13193\n1653,14010\n1653,15575\n1653,18631\n1653,19635\n1653,19908\n1653,23527\n1653,23664\n1653,27030\n1653,33734\n1653,33977\n1653,34761\n1653,44522\n1653,45523\n1653,45698\n1653,67354\n1653,70604\n1653,102192\n1653,116874\n1653,128641\n1653,128762\n1653,134634\n1653,135981\n1653,137563\n1653,172220\n1653,174747\n1653,207000\n1653,224735\n1653,238175\n1654,301\n1654,615\n1655,63\n1655,126\n1655,182\n1655,202\n1655,203\n1655,252\n1655,256\n1655,259\n1655,275\n1655,277\n1655,318\n1655,336\n1655,406\n1655,452\n1655,457\n1655,465\n1655,493\n1655,497\n1655,500\n1655,516\n1655,517\n1655,586\n1655,676\n1655,682\n1655,733\n1655,838\n1655,843\n1655,1011\n1655,1014\n1655,1118\n1655,1163\n1655,1220\n1655,1222\n1655,1328\n1655,1388\n1655,1445\n1655,1512\n1655,1566\n1655,1568\n1655,1655\n1655,2090\n1655,2108\n1655,2373\n1655,4066\n1655,5992\n1655,16201\n1655,18298\n1655,18347\n1655,19413\n1655,19468\n1655,20757\n1655,21500\n1655,21501\n1655,21516\n1655,23099\n1655,23773\n1655,28852\n1655,30398\n1655,30467\n1655,30469\n1655,30521\n1655,32625\n1655,39485\n1655,39626\n1655,41170\n1655,47007\n1655,47152\n1655,47728\n1655,49174\n1655,54364\n1655,62170\n1655,65393\n1655,66351\n1655,71946\n1655,72439\n1655,77660\n1655,77664\n1655,79356\n1655,80008\n1655,80396\n1655,80604\n1655,81233\n1655,84660\n1655,91367\n1655,93576\n1655,95422\n1655,96666\n1655,97352\n1655,98180\n1655,98302\n1655,101810\n1655,105759\n1655,107736\n1655,113450\n1655,118404\n1655,118405\n1655,118406\n1655,118407\n1655,118408\n1655,118845\n1655,118923\n1656,1240\n1657,718\n1658,509\n1658,1659\n1658,4771\n1659,104\n1659,182\n1659,186\n1659,202\n1659,203\n1659,240\n1659,433\n1659,467\n1659,809\n1659,838\n1659,872\n1659,1014\n1659,1085\n1659,1118\n1659,1149\n1659,1204\n1659,1332\n1659,1531\n1659,1659\n1659,1796\n1659,3507\n1659,3582\n1659,4039\n1659,4066\n1659,6695\n1660,1564\n1660,1660\n1660,39045\n1660,84466\n1660,84639\n1660,99200\n1660,112398\n1660,113392\n1660,113417\n1660,113421\n1660,118638\n1660,124704\n1660,151076\n1661,344\n1662,289\n1662,290\n1662,94134\n1663,20\n1663,34\n1663,35\n1663,68\n1663,104\n1663,126\n1663,138\n1663,160\n1663,178\n1663,182\n1663,192\n1663,202\n1663,207\n1663,240\n1663,252\n1663,259\n1663,299\n1663,302\n1663,336\n1663,366\n1663,397\n1663,452\n1663,505\n1663,516\n1663,536\n1663,676\n1663,764\n1663,801\n1663,809\n1663,827\n1663,838\n1663,872\n1663,911\n1663,918\n1663,929\n1663,972\n1663,1014\n1663,1135\n1663,1147\n1663,1151\n1663,1181\n1663,1191\n1663,1192\n1663,1204\n1663,1231\n1663,1240\n1663,1267\n1663,1293\n1663,1326\n1663,1417\n1663,1445\n1663,1472\n1663,1522\n1663,1559\n1663,1566\n1663,1655\n1663,1659\n1663,1663\n1663,1664\n1663,1796\n1663,1805\n1663,1825\n1663,1893\n1663,1992\n1663,2085\n1663,2253\n1663,2512\n1663,2726\n1663,3370\n1663,3392\n1663,3524\n1663,3555\n1663,3952\n1663,4165\n1663,4276\n1663,4322\n1663,4475\n1663,4760\n1663,4771\n1663,5212\n1663,5296\n1663,5495\n1663,6824\n1663,9690\n1663,12263\n1663,13478\n1663,14453\n1663,18298\n1663,21442\n1663,23772\n1663,26122\n1663,26179\n1663,26546\n1663,28107\n1663,29593\n1663,36819\n1663,38362\n1663,40566\n1663,44147\n1663,54103\n1663,54383\n1663,54616\n1663,55205\n1663,58910\n1663,62431\n1663,64622\n1663,70395\n1663,75292\n1663,75912\n1663,81233\n1663,82659\n1663,88389\n1663,94151\n1663,97442\n1663,113959\n1663,115474\n1663,120155\n1663,121469\n1663,136037\n1663,144059\n1663,155461\n1663,166969\n1663,166975\n1663,173053\n1663,175915\n1663,183361\n1663,193129\n1663,204093\n1663,215276\n1663,226478\n1663,233470\n1664,1293\n1664,1663\n1665,438\n1666,32\n1667,104\n1667,134\n1667,135\n1667,136\n1667,137\n1667,138\n1667,850\n1667,1939\n1667,2105\n1668,292\n1668,1238\n1669,862\n1670,891\n1671,929\n1672,1673\n1674,252\n1674,1220\n1674,1222\n1675,178\n1676,891\n1677,107\n1677,292\n1677,441\n1677,745\n1677,900\n1677,911\n1677,1130\n1677,1238\n1677,2163\n1677,2373\n1677,2923\n1677,3089\n1677,3830\n1677,4039\n1677,4190\n1677,4771\n1677,5192\n1677,6581\n1677,16614\n1677,19413\n1677,24500\n1677,36358\n1677,64447\n1677,75191\n1677,79117\n1677,87888\n1677,88390\n1677,177225\n1678,272\n1678,309\n1678,310\n1678,336\n1678,379\n1678,392\n1678,483\n1678,694\n1678,697\n1678,779\n1678,818\n1678,1019\n1678,1119\n1678,1429\n1678,1782\n1678,1796\n1678,1801\n1678,3585\n1678,76096\n1679,22\n1679,783\n1680,1267\n1680,3999\n1682,182\n1683,1414\n1684,5\n1684,26\n1684,47\n1684,59\n1684,94\n1684,116\n1684,117\n1684,135\n1684,250\n1684,852\n1684,885\n1684,887\n1684,994\n1684,997\n1684,1235\n1684,1252\n1684,1253\n1684,1432\n1684,1557\n1684,1684\n1684,1775\n1684,2469\n1684,2674\n1684,2712\n1684,2893\n1684,2926\n1684,3794\n1684,4114\n1684,5700\n1684,5701\n1684,5803\n1684,6209\n1684,7271\n1684,7538\n1684,8233\n1684,8289\n1684,8355\n1684,9071\n1684,9103\n1684,9358\n1684,9542\n1684,9787\n1684,13662\n1684,15300\n1684,15378\n1684,15675\n1684,15730\n1684,15742\n1684,15959\n1684,20486\n1684,21192\n1684,21944\n1684,25540\n1684,30871\n1684,32278\n1684,33804\n1684,34060\n1684,35596\n1684,35709\n1684,41942\n1684,42813\n1684,45701\n1684,45737\n1684,48344\n1684,48345\n1684,70486\n1684,85431\n1684,94438\n1684,95995\n1684,95996\n1684,96002\n1684,100889\n1684,107212\n1684,108970\n1684,117581\n1684,127266\n1684,135213\n1684,141140\n1684,146524\n1684,148076\n1684,152517\n1684,152935\n1684,164100\n1684,167977\n1684,171294\n1684,184602\n1684,187092\n1684,192945\n1684,194198\n1684,217447\n1684,217450\n1684,217455\n1685,299\n1685,379\n1685,1618\n1685,2646\n1685,30331\n1686,493\n1687,1688\n1688,107\n1688,217\n1688,227\n1688,292\n1688,338\n1688,397\n1688,441\n1688,442\n1688,452\n1688,457\n1688,462\n1688,502\n1688,509\n1688,572\n1688,609\n1688,626\n1688,673\n1688,685\n1688,693\n1688,843\n1688,849\n1688,852\n1688,872\n1688,911\n1688,978\n1688,991\n1688,1011\n1688,1014\n1688,1045\n1688,1130\n1688,1140\n1688,1172\n1688,1204\n1688,1279\n1688,1449\n1688,1545\n1688,1572\n1688,1653\n1688,1687\n1688,1688\n1688,1722\n1688,1796\n1688,1845\n1688,2181\n1688,2373\n1688,2436\n1688,2443\n1688,2744\n1688,4039\n1688,4565\n1688,4580\n1688,4771\n1688,5053\n1688,5258\n1688,5420\n1688,6880\n1688,7033\n1688,7085\n1688,7766\n1688,7880\n1688,9093\n1688,9423\n1688,13502\n1688,13538\n1688,14135\n1688,14374\n1688,15293\n1688,15339\n1688,15341\n1688,15386\n1688,15604\n1688,15691\n1688,15699\n1688,16431\n1688,16614\n1688,17565\n1688,17857\n1688,19413\n1688,19415\n1688,19859\n1688,20261\n1688,23863\n1688,26161\n1688,26288\n1688,28315\n1688,28404\n1688,28451\n1688,28814\n1688,28977\n1688,29099\n1688,29848\n1688,32978\n1688,34407\n1688,37414\n1688,37511\n1688,37637\n1688,39005\n1688,40532\n1688,40776\n1688,41134\n1688,41837\n1688,45092\n1688,46282\n1688,46825\n1688,48256\n1688,48259\n1688,50020\n1688,52389\n1688,52397\n1688,56449\n1688,56923\n1688,64161\n1688,64504\n1688,64571\n1688,65824\n1688,68329\n1688,68878\n1688,78717\n1688,79334\n1688,80188\n1688,80709\n1688,81834\n1688,87480\n1688,88132\n1688,89666\n1688,91444\n1688,92020\n1688,92892\n1688,95025\n1688,95409\n1688,103844\n1688,105656\n1688,107539\n1688,108134\n1688,109440\n1688,112832\n1688,113538\n1688,117775\n1688,118246\n1688,119975\n1688,127372\n1688,127633\n1688,135317\n1688,136133\n1688,138210\n1688,138213\n1688,138225\n1688,138226\n1688,138227\n1688,138228\n1688,138231\n1688,138232\n1688,138234\n1688,143370\n1688,147339\n1688,147523\n1688,164344\n1688,167000\n1688,169403\n1688,169405\n1688,169421\n1688,169454\n1688,169861\n1688,170689\n1688,179829\n1688,183660\n1688,185856\n1688,195162\n1688,197848\n1688,208030\n1688,213175\n1688,213206\n1688,213322\n1688,226504\n1688,229986\n1688,237375\n1688,237646\n1688,238684\n1688,245488\n1688,245493\n1688,245498\n1688,245503\n1688,245967\n1688,248570\n1688,253411\n1688,253414\n1688,256937\n1688,261976\n1688,263333\n1689,920\n1689,1089\n1690,104\n1690,254\n1690,557\n1690,953\n1690,954\n1690,1939\n1690,10318\n1691,151\n1691,292\n1691,390\n1691,1363\n1691,3003\n1691,221293\n1692,762\n1693,140\n1693,1659\n1694,500\n1695,346\n1696,1\n1696,3\n1696,147\n1696,406\n1696,707\n1696,1118\n1696,1345\n1696,1467\n1696,1572\n1696,1696\n1696,1697\n1696,1698\n1696,1792\n1696,1801\n1696,2092\n1696,2421\n1696,3182\n1696,3258\n1696,3611\n1696,3672\n1696,3683\n1696,3836\n1696,4007\n1696,4419\n1696,5178\n1696,5182\n1696,5384\n1696,5685\n1696,6032\n1696,6178\n1696,6424\n1696,6890\n1696,6913\n1696,6926\n1696,9361\n1696,13136\n1696,13245\n1696,13299\n1696,13301\n1696,13414\n1696,13441\n1696,13450\n1696,13488\n1696,14061\n1696,14098\n1696,14285\n1696,14379\n1696,14425\n1696,15303\n1696,15367\n1696,15684\n1696,16378\n1696,16528\n1696,16558\n1696,17569\n1696,18582\n1696,19285\n1696,19881\n1696,21292\n1696,21665\n1696,22351\n1696,23311\n1696,23398\n1696,23520\n1696,23755\n1696,25381\n1696,25395\n1696,26216\n1696,26220\n1696,26227\n1696,26229\n1696,28107\n1696,28193\n1696,28196\n1696,28384\n1696,28387\n1696,28486\n1696,29647\n1696,29664\n1696,31018\n1696,32462\n1696,32533\n1696,32563\n1696,32845\n1696,32872\n1696,35316\n1696,37710\n1696,38181\n1696,38202\n1696,38360\n1696,38446\n1696,38711\n1696,38972\n1696,41877\n1696,43216\n1696,45125\n1696,50000\n1696,50016\n1696,50153\n1696,58212\n1696,58280\n1696,58281\n1696,58283\n1696,58287\n1696,58291\n1696,59047\n1696,59608\n1696,63917\n1696,66240\n1696,67865\n1696,67867\n1696,76992\n1696,80519\n1696,82739\n1696,95386\n1696,98329\n1696,103275\n1696,104321\n1696,108066\n1696,112786\n1696,117738\n1696,122160\n1696,123704\n1696,123811\n1696,125011\n1696,152572\n1696,156296\n1696,162975\n1696,165993\n1696,166933\n1696,189266\n1696,193602\n1696,233343\n1697,192\n1697,1388\n1697,1803\n1699,438\n1700,278\n1700,1019\n1701,41\n1701,289\n1701,290\n1701,417\n1701,631\n1701,805\n1701,999\n1701,1119\n1701,1359\n1701,1635\n1701,7194\n1702,202\n1702,251\n1702,252\n1702,516\n1702,1512\n1702,1983\n1702,5992\n1702,189788\n1703,390\n1704,104\n1704,200\n1704,215\n1704,636\n1704,714\n1704,718\n1704,750\n1704,762\n1704,1119\n1704,1462\n1704,1745\n1704,8537\n1705,217\n1705,240\n1705,818\n1705,1210\n1705,1417\n1705,127158\n1706,1707\n1707,491\n1707,497\n1707,733\n1707,991\n1707,1707\n1707,3260\n1707,135500\n1708,30\n1708,146\n1708,175\n1708,313\n1708,328\n1708,485\n1708,493\n1708,685\n1708,693\n1708,704\n1708,772\n1708,920\n1708,1619\n1708,92476\n1709,130\n1710,1711\n1711,87\n1712,1374\n1713,631\n1713,805\n1714,438\n1715,71\n1715,104\n1715,192\n1715,240\n1715,304\n1715,356\n1715,390\n1715,446\n1715,534\n1715,631\n1715,677\n1715,685\n1715,717\n1715,794\n1715,818\n1715,838\n1715,907\n1715,937\n1715,973\n1715,1010\n1715,1011\n1715,1085\n1715,1276\n1715,1284\n1715,1326\n1715,1715\n1715,1716\n1715,1837\n1715,1955\n1715,1957\n1715,2083\n1715,2512\n1715,3483\n1715,4039\n1715,4145\n1715,4146\n1715,4411\n1715,4577\n1715,4655\n1715,5155\n1715,5718\n1715,6880\n1715,7170\n1715,9391\n1715,9726\n1715,13217\n1715,15272\n1715,15277\n1715,16038\n1715,17154\n1715,18145\n1715,18457\n1715,18608\n1715,21469\n1715,23423\n1715,26054\n1715,27119\n1715,29546\n1715,29595\n1715,30577\n1715,31474\n1715,32222\n1715,32576\n1715,34965\n1715,35095\n1715,37816\n1715,38284\n1715,39520\n1715,39706\n1715,40051\n1715,42320\n1715,43248\n1715,43394\n1715,43830\n1715,45032\n1715,47549\n1715,48353\n1715,48867\n1715,49893\n1715,49917\n1715,50005\n1715,52532\n1715,52558\n1715,52779\n1715,52942\n1715,52945\n1715,55868\n1715,58515\n1715,66515\n1715,71177\n1715,73570\n1715,75912\n1715,78790\n1715,78891\n1715,80449\n1715,81944\n1715,83496\n1715,86402\n1715,88120\n1715,89557\n1715,93074\n1715,101716\n1715,104541\n1715,106786\n1715,107988\n1715,109352\n1715,112935\n1715,115681\n1715,116543\n1715,124745\n1715,127158\n1715,128143\n1715,128287\n1715,133946\n1715,133975\n1715,135098\n1715,136635\n1715,140370\n1715,151104\n1715,151698\n1715,157385\n1715,157617\n1715,157689\n1715,158145\n1715,158236\n1715,158274\n1715,158928\n1715,159422\n1715,159857\n1715,163898\n1715,165607\n1715,169908\n1715,172029\n1715,173876\n1715,176407\n1715,178504\n1715,189942\n1715,190242\n1715,191124\n1715,193373\n1715,193422\n1715,194333\n1715,194420\n1715,214958\n1715,215313\n1715,219889\n1715,224531\n1715,242008\n1715,242753\n1715,245154\n1715,260771\n1715,261840\n1715,263285\n1715,263496\n1716,304\n1716,1715\n1717,611\n1717,1718\n1718,34\n1718,35\n1718,313\n1718,1026\n1718,1313\n1718,1869\n1718,2223\n1718,2944\n1718,4352\n1718,5034\n1718,5326\n1718,8435\n1718,15633\n1718,18577\n1718,19286\n1718,23669\n1718,70738\n1718,74555\n1718,82659\n1718,128748\n1718,161519\n1718,189121\n1718,195578\n1718,195583\n1718,205745\n1718,223410\n1718,225290\n1718,226207\n1718,233508\n1718,260102\n1718,260121\n1719,1058\n1720,920\n1721,1474\n1722,5\n1722,107\n1722,111\n1722,217\n1722,292\n1722,314\n1722,338\n1722,441\n1722,442\n1722,462\n1722,509\n1722,510\n1722,595\n1722,652\n1722,673\n1722,852\n1722,872\n1722,978\n1722,1025\n1722,1130\n1722,1151\n1722,1235\n1722,1238\n1722,1453\n1722,1559\n1722,1572\n1722,1584\n1722,1653\n1722,1688\n1722,1722\n1722,1758\n1722,1845\n1722,1893\n1722,1973\n1722,2124\n1722,2181\n1722,2697\n1722,2889\n1722,2991\n1722,3367\n1722,3538\n1722,3713\n1722,4039\n1722,4520\n1722,4565\n1722,4580\n1722,4660\n1722,4771\n1722,5053\n1722,5258\n1722,5608\n1722,6621\n1722,6695\n1722,7379\n1722,7993\n1722,9354\n1722,13323\n1722,13389\n1722,13444\n1722,15612\n1722,16624\n1722,18131\n1722,18838\n1722,19466\n1722,19579\n1722,20556\n1722,23439\n1722,25502\n1722,26051\n1722,26084\n1722,26369\n1722,26986\n1722,28233\n1722,28442\n1722,28814\n1722,28977\n1722,29760\n1722,29887\n1722,32819\n1722,32978\n1722,33968\n1722,34906\n1722,35435\n1722,40734\n1722,41197\n1722,41470\n1722,44522\n1722,45140\n1722,46340\n1722,49352\n1722,50474\n1722,50678\n1722,52811\n1722,55151\n1722,55964\n1722,58560\n1722,61083\n1722,62944\n1722,65824\n1722,71936\n1722,78717\n1722,80559\n1722,80599\n1722,82043\n1722,84071\n1722,86685\n1722,88475\n1722,91967\n1722,93126\n1722,97359\n1722,109518\n1722,114634\n1722,115326\n1722,119911\n1722,122371\n1722,122671\n1722,125218\n1722,130271\n1722,130707\n1722,133004\n1722,133188\n1722,133476\n1722,141965\n1722,141981\n1722,142339\n1722,147951\n1722,157713\n1722,167710\n1722,176814\n1722,178596\n1722,181039\n1722,185537\n1722,203514\n1722,213805\n1722,220927\n1722,221242\n1722,222364\n1722,235909\n1722,243650\n1722,243664\n1722,247096\n1722,258745\n1722,261761\n1723,1724\n1724,34\n1724,35\n1724,54\n1724,83\n1724,278\n1724,314\n1724,379\n1724,397\n1724,455\n1724,457\n1724,512\n1724,536\n1724,635\n1724,657\n1724,673\n1724,676\n1724,685\n1724,849\n1724,852\n1724,1014\n1724,1019\n1724,1072\n1724,1118\n1724,1566\n1724,1655\n1724,1663\n1724,1843\n1724,1871\n1724,1916\n1724,2159\n1724,2266\n1724,2319\n1724,2373\n1724,2516\n1724,2646\n1724,4234\n1724,5326\n1724,8152\n1724,13240\n1724,17273\n1724,17837\n1724,20757\n1724,21589\n1724,25670\n1724,26161\n1724,29944\n1724,30583\n1724,50501\n1724,66703\n1724,82217\n1724,107100\n1724,257589\n1725,24\n1725,26\n1725,59\n1725,885\n1725,887\n1725,2674\n1725,5162\n1726,79\n1726,192\n1726,525\n1726,818\n1726,868\n1727,250\n1727,1684\n1728,175\n1728,527\n1729,147\n1729,158\n1729,167\n1729,440\n1729,493\n1729,516\n1729,571\n1729,764\n1729,3804\n1729,21944\n1730,292\n1731,973\n1731,1732\n1732,46\n1732,388\n1732,431\n1732,499\n1732,575\n1732,663\n1732,664\n1732,685\n1732,744\n1732,775\n1732,877\n1732,907\n1732,937\n1732,968\n1732,972\n1732,973\n1732,1010\n1732,1117\n1732,1119\n1732,1122\n1732,1124\n1732,1160\n1732,1161\n1732,1167\n1732,1231\n1732,1282\n1732,1284\n1732,1298\n1732,1326\n1732,1436\n1732,1544\n1732,1715\n1732,1732\n1732,1837\n1732,1849\n1732,2372\n1732,3504\n1732,3609\n1732,3818\n1732,4043\n1732,5662\n1732,5792\n1732,8632\n1732,15159\n1732,20350\n1732,28114\n1732,28815\n1732,29795\n1732,31255\n1732,31278\n1732,31766\n1732,34296\n1732,37631\n1732,41304\n1732,41308\n1732,41317\n1732,41897\n1732,41901\n1732,46167\n1732,50522\n1732,64457\n1732,67886\n1732,74355\n1732,75296\n1732,78882\n1732,83321\n1732,87192\n1732,90183\n1732,90294\n1732,93007\n1732,96501\n1732,110322\n1732,114862\n1732,127756\n1732,130807\n1732,148742\n1732,229212\n1732,237320\n1732,243317\n1732,249206\n1732,254424\n1733,26\n1733,59\n1733,1235\n1733,1335\n1733,21944\n1734,15\n1735,278\n1736,264\n1736,1127\n1736,1147\n1736,1289\n1736,2051\n1737,364\n1737,943\n1738,68\n1738,107\n1738,264\n1738,714\n1738,1210\n1738,1400\n1738,2436\n1738,2590\n1738,4220\n1738,66297\n1738,193129\n1739,1016\n1739,1282\n1739,1882\n1740,37\n1740,255\n1740,292\n1740,301\n1740,450\n1740,567\n1740,604\n1740,676\n1740,698\n1740,717\n1740,849\n1740,852\n1740,937\n1740,968\n1740,1293\n1740,1298\n1740,1740\n1740,1741\n1740,1782\n1740,2323\n1740,3422\n1740,3756\n1740,4175\n1740,18218\n1740,23728\n1740,26433\n1740,28319\n1740,33479\n1740,37857\n1740,46638\n1740,49420\n1740,50248\n1740,52932\n1740,62509\n1740,65806\n1740,77473\n1740,80062\n1740,105686\n1740,107073\n1740,110525\n1740,114840\n1740,156313\n1740,156621\n1740,157034\n1740,157315\n1740,159431\n1740,159491\n1740,173711\n1740,183453\n1740,185290\n1740,187456\n1740,195547\n1740,214896\n1740,215971\n1740,228880\n1740,237662\n1740,253219\n1740,253225\n1740,253400\n1741,1740\n1742,710\n1744,111\n1744,1745\n1746,1326\n1748,1749\n1749,104\n1749,111\n1749,217\n1749,240\n1749,435\n1749,467\n1749,510\n1749,666\n1749,872\n1749,973\n1749,1010\n1749,1118\n1749,1133\n1749,1172\n1749,1298\n1749,1326\n1749,1411\n1749,1462\n1749,1531\n1749,1566\n1749,1796\n1749,1818\n1749,1844\n1749,1882\n1749,3804\n1749,4039\n1749,5130\n1749,6695\n1749,8537\n1749,21944\n1750,1751\n1750,5448\n1750,43064\n1752,605\n1753,397\n1754,1284\n1755,48\n1755,130\n1755,160\n1755,462\n1755,515\n1755,835\n1755,991\n1755,1381\n1755,1579\n1755,1639\n1755,1707\n1755,54264\n1756,83\n1756,222\n1756,283\n1756,389\n1756,455\n1756,891\n1756,1539\n1756,2646\n1756,3860\n1756,7768\n1756,13137\n1756,13328\n1756,19351\n1756,37095\n1756,39572\n1757,1010\n1758,104\n1758,107\n1758,111\n1758,160\n1758,292\n1758,338\n1758,440\n1758,441\n1758,462\n1758,510\n1758,515\n1758,872\n1758,1058\n1758,1140\n1758,1151\n1758,1204\n1758,1722\n1758,1893\n1758,2436\n1758,3538\n1758,4039\n1758,4771\n1759,907\n1759,932\n1760,710\n1761,425\n1762,622\n1762,929\n1762,2353\n1763,479\n1763,647\n1763,991\n1763,1052\n1763,1102\n1763,1579\n1763,1659\n1763,2312\n1763,49057\n1764,516\n1764,3872\n1765,1043\n1766,1767\n1768,1769\n1769,1240\n1769,1805\n1770,83\n1770,660\n1770,1539\n1771,104\n1771,1284\n1771,1801\n1772,1773\n1773,10\n1773,175\n1773,485\n1773,1651\n1773,1773\n1773,3067\n1773,9039\n1773,15547\n1773,20874\n1773,31934\n1773,48508\n1773,51581\n1773,51803\n1773,52203\n1773,53934\n1773,56110\n1773,66203\n1773,80297\n1773,80298\n1773,80731\n1773,80737\n1773,87571\n1773,100093\n1773,101985\n1773,104227\n1773,108291\n1773,110882\n1773,112699\n1773,120247\n1773,122484\n1773,126562\n1773,128389\n1773,129589\n1773,129615\n1773,130050\n1773,132423\n1773,143637\n1773,145310\n1773,146134\n1773,151773\n1773,151776\n1773,151808\n1773,152309\n1773,154513\n1773,155537\n1773,157217\n1773,158283\n1773,159584\n1773,159815\n1773,159833\n1773,160039\n1773,160040\n1773,160482\n1773,160662\n1773,160963\n1773,161254\n1773,162016\n1773,162361\n1773,163255\n1773,164141\n1773,165689\n1773,167031\n1773,167499\n1773,167767\n1773,167816\n1773,169182\n1773,170167\n1773,171297\n1773,171445\n1773,171798\n1773,172787\n1773,175942\n1773,177919\n1773,182294\n1773,183193\n1773,187889\n1773,187891\n1773,190154\n1773,191767\n1773,192290\n1773,192910\n1773,193263\n1773,194179\n1773,199081\n1773,213363\n1773,222239\n1773,224242\n1773,224356\n1773,228720\n1773,229480\n1773,231744\n1773,231817\n1773,235400\n1773,237252\n1773,239538\n1773,239701\n1773,240624\n1773,244899\n1773,245452\n1773,245462\n1773,246694\n1773,247229\n1773,248032\n1773,248993\n1773,250262\n1773,252392\n1773,253017\n1773,254123\n1773,255413\n1773,255472\n1773,257721\n1773,257803\n1773,257809\n1773,257888\n1773,259057\n1773,259374\n1773,262198\n1773,263606\n1774,663\n1774,664\n1774,937\n1775,298\n1776,1\n1776,20\n1776,147\n1776,149\n1776,158\n1776,285\n1776,336\n1776,397\n1776,406\n1776,435\n1776,439\n1776,452\n1776,599\n1776,622\n1776,693\n1776,724\n1776,766\n1776,779\n1776,849\n1776,1033\n1776,1651\n1776,1776\n1776,1777\n1776,1803\n1776,1832\n1776,2102\n1776,2217\n1776,2352\n1776,2373\n1776,2400\n1776,3576\n1776,4102\n1776,4684\n1776,8273\n1776,9394\n1776,9457\n1776,14111\n1776,14436\n1776,17423\n1776,18124\n1776,19191\n1776,20694\n1776,21442\n1776,22357\n1776,23854\n1776,26038\n1776,28377\n1776,28425\n1776,31222\n1776,38407\n1776,59020\n1776,62265\n1776,62313\n1776,63347\n1776,64580\n1776,66258\n1776,68069\n1776,68149\n1776,69883\n1776,70071\n1776,70138\n1776,73231\n1776,74526\n1776,74697\n1776,79528\n1776,91285\n1776,93860\n1776,95822\n1776,96658\n1776,106377\n1776,113468\n1776,113469\n1776,118336\n1776,121001\n1776,124347\n1776,125750\n1776,126717\n1776,126804\n1776,127907\n1776,128338\n1776,134142\n1776,147485\n1776,147811\n1776,154670\n1776,160787\n1776,170671\n1776,176961\n1776,222842\n1776,227249\n1776,242157\n1776,249784\n1777,1776\n1778,344\n1778,1711\n1778,1836\n1779,240\n1780,1509\n1781,97\n1781,175\n1781,1287\n1781,2719\n1782,37\n1782,68\n1782,186\n1782,261\n1782,301\n1782,327\n1782,440\n1782,467\n1782,567\n1782,599\n1782,604\n1782,615\n1782,631\n1782,663\n1782,664\n1782,677\n1782,685\n1782,698\n1782,716\n1782,717\n1782,784\n1782,838\n1782,881\n1782,911\n1782,937\n1782,968\n1782,972\n1782,1010\n1782,1011\n1782,1014\n1782,1145\n1782,1167\n1782,1231\n1782,1293\n1782,1300\n1782,1564\n1782,1612\n1782,1623\n1782,1782\n1782,1783\n1782,1837\n1782,1844\n1782,1849\n1782,1973\n1782,2217\n1782,2263\n1782,2272\n1782,2369\n1782,2452\n1782,3187\n1782,3379\n1782,3422\n1782,3437\n1782,3756\n1782,3804\n1782,4159\n1782,4253\n1782,4270\n1782,4286\n1782,4315\n1782,4422\n1782,4598\n1782,4683\n1782,5194\n1782,5262\n1782,5382\n1782,5563\n1782,5662\n1782,6167\n1782,6398\n1782,6431\n1782,6460\n1782,6470\n1782,6612\n1782,6938\n1782,7087\n1782,7140\n1782,7222\n1782,7444\n1782,9239\n1782,9555\n1782,9579\n1782,9655\n1782,13319\n1782,13454\n1782,14916\n1782,15635\n1782,16150\n1782,18129\n1782,18861\n1782,19343\n1782,19494\n1782,19592\n1782,20327\n1782,20550\n1782,20756\n1782,20803\n1782,22391\n1782,22450\n1782,23799\n1782,25062\n1782,25169\n1782,25527\n1782,26034\n1782,26287\n1782,26393\n1782,26433\n1782,28317\n1782,28450\n1782,28512\n1782,28989\n1782,30265\n1782,30717\n1782,30839\n1782,34162\n1782,34193\n1782,36563\n1782,37362\n1782,38300\n1782,38816\n1782,38860\n1782,38878\n1782,38937\n1782,39650\n1782,40932\n1782,40933\n1782,41778\n1782,41781\n1782,42602\n1782,42786\n1782,42868\n1782,46638\n1782,46792\n1782,46868\n1782,46881\n1782,48072\n1782,48111\n1782,48112\n1782,48114\n1782,48123\n1782,48130\n1782,48131\n1782,48138\n1782,48139\n1782,48206\n1782,48210\n1782,48211\n1782,48212\n1782,48213\n1782,48214\n1782,48215\n1782,48216\n1782,48217\n1782,48218\n1782,48219\n1782,48220\n1782,48221\n1782,48222\n1782,48223\n1782,48224\n1782,48225\n1782,48226\n1782,48227\n1782,48229\n1782,48230\n1782,48231\n1782,48238\n1782,48303\n1782,48304\n1782,48305\n1782,48419\n1782,48420\n1782,48421\n1782,48422\n1782,48424\n1782,48529\n1782,48577\n1782,48640\n1782,48900\n1782,50132\n1782,50490\n1782,52123\n1782,52908\n1782,54285\n1782,54456\n1782,55695\n1782,55776\n1782,57182\n1782,58377\n1782,60375\n1782,62739\n1782,67493\n1782,68131\n1782,76051\n1782,77104\n1782,77525\n1782,77789\n1782,78173\n1782,78823\n1782,79086\n1782,83493\n1782,85968\n1782,85983\n1782,87287\n1782,87399\n1782,92836\n1782,92844\n1782,96513\n1782,97082\n1782,97190\n1782,101485\n1782,103860\n1782,104592\n1782,107492\n1782,107973\n1782,110528\n1782,111170\n1782,111258\n1782,111348\n1782,112539\n1782,113886\n1782,116198\n1782,119479\n1782,120449\n1782,121028\n1782,123631\n1782,127418\n1782,133557\n1782,135773\n1782,135774\n1782,135775\n1782,135776\n1782,135777\n1782,135958\n1782,135990\n1782,137001\n1782,137752\n1782,140456\n1782,142312\n1782,145029\n1782,147311\n1782,147374\n1782,147947\n1782,156961\n1782,160704\n1782,163272\n1782,164186\n1782,165625\n1782,165656\n1782,170729\n1782,175993\n1782,178846\n1782,180218\n1782,186184\n1782,189303\n1782,192793\n1782,194417\n1782,195174\n1782,212010\n1782,212495\n1782,216545\n1782,216554\n1782,216562\n1782,216582\n1782,216590\n1782,216597\n1782,218414\n1782,221192\n1782,221828\n1782,221920\n1782,223784\n1782,224683\n1782,225340\n1782,227376\n1782,227672\n1782,233468\n1782,245433\n1782,247366\n1782,247902\n1782,247969\n1782,248760\n1782,248936\n1782,262749\n1783,1782\n1785,167\n1785,240\n1785,631\n1785,818\n1785,1564\n1785,1818\n1785,3532\n1785,4179\n1785,4540\n1785,5278\n1785,5718\n1785,6821\n1785,14139\n1785,14155\n1785,15164\n1785,17848\n1785,46574\n1785,60814\n1785,64594\n1785,65841\n1785,75300\n1785,85961\n1785,103274\n1785,103524\n1785,103856\n1785,113430\n1785,127158\n1785,138698\n1785,162121\n1785,165283\n1786,147\n1786,602\n1786,849\n1786,1973\n1787,1564\n1788,130\n1789,20\n1789,315\n1789,346\n1789,435\n1789,439\n1789,446\n1789,671\n1789,676\n1789,1033\n1789,1068\n1789,1294\n1789,1474\n1789,1612\n1789,1789\n1789,1790\n1789,2211\n1789,3224\n1789,3903\n1789,4324\n1789,4692\n1789,4785\n1789,5307\n1789,6661\n1789,7087\n1789,13506\n1789,13551\n1789,18220\n1789,20742\n1789,22052\n1789,24603\n1789,25067\n1789,32791\n1789,34963\n1789,37329\n1789,45721\n1789,46966\n1789,48103\n1789,49283\n1789,49504\n1789,54566\n1789,54582\n1789,54798\n1789,54934\n1789,82872\n1789,90933\n1789,92944\n1789,93741\n1789,97647\n1789,112202\n1789,128247\n1789,138052\n1789,144045\n1789,147400\n1789,147525\n1789,148725\n1789,149064\n1789,160423\n1789,160728\n1789,165881\n1789,174461\n1789,189128\n1789,190492\n1789,199156\n1789,232172\n1789,237016\n1789,241213\n1789,246009\n1789,255513\n1789,259726\n1790,439\n1790,671\n1790,1068\n1790,1789\n1791,439\n1791,1033\n1792,6424\n1793,1113\n1794,202\n1794,203\n1794,251\n1794,465\n1795,15\n1795,106\n1795,147\n1795,151\n1795,163\n1795,206\n1795,217\n1795,298\n1795,305\n1795,309\n1795,310\n1795,344\n1795,346\n1795,366\n1795,420\n1795,489\n1795,493\n1795,563\n1795,671\n1795,775\n1795,911\n1795,929\n1795,991\n1795,1085\n1795,1096\n1795,1132\n1795,1201\n1795,1285\n1795,1623\n1795,2889\n1795,5911\n1795,7117\n1795,75912\n1796,97\n1796,158\n1796,182\n1796,192\n1796,207\n1796,217\n1796,248\n1796,264\n1796,301\n1796,302\n1796,314\n1796,337\n1796,392\n1796,397\n1796,452\n1796,457\n1796,467\n1796,599\n1796,631\n1796,704\n1796,818\n1796,838\n1796,872\n1796,920\n1796,1001\n1796,1010\n1796,1014\n1796,1085\n1796,1172\n1796,1191\n1796,1204\n1796,1298\n1796,1417\n1796,1419\n1796,1434\n1796,1518\n1796,1533\n1796,1634\n1796,1678\n1796,1796\n1796,1844\n1796,2037\n1796,2512\n1796,2797\n1796,3094\n1796,3397\n1796,3804\n1796,5538\n1796,5596\n1796,6525\n1796,6890\n1796,7076\n1796,7880\n1796,12752\n1796,13478\n1796,13771\n1796,19874\n1796,20757\n1796,23461\n1796,24934\n1796,25551\n1796,26133\n1796,52769\n1796,56612\n1796,60160\n1796,75271\n1796,97536\n1796,97934\n1796,108491\n1796,172497\n1796,182308\n1796,260895\n1797,65\n1797,467\n1797,868\n1797,1433\n1797,156379\n1798,1010\n1798,3182\n1799,433\n1799,1634\n1800,1801\n1801,34\n1801,314\n1801,446\n1801,510\n1801,589\n1801,599\n1801,623\n1801,685\n1801,693\n1801,697\n1801,707\n1801,752\n1801,852\n1801,874\n1801,911\n1801,968\n1801,1011\n1801,1345\n1801,1437\n1801,1572\n1801,1678\n1801,1696\n1801,1796\n1801,1801\n1801,1805\n1801,2045\n1801,2054\n1801,2165\n1801,2348\n1801,2373\n1801,3182\n1801,3387\n1801,3396\n1801,3497\n1801,4159\n1801,5185\n1801,5265\n1801,5568\n1801,6156\n1801,6424\n1801,6430\n1801,6474\n1801,6652\n1801,7087\n1801,7718\n1801,9748\n1801,13154\n1801,13158\n1801,13245\n1801,14061\n1801,14098\n1801,14536\n1801,15691\n1801,18191\n1801,26480\n1801,28107\n1801,29293\n1801,29677\n1801,31080\n1801,31106\n1801,33442\n1801,35094\n1801,38300\n1801,39618\n1801,40022\n1801,40729\n1801,41393\n1801,44127\n1801,45710\n1801,45886\n1801,47095\n1801,48002\n1801,48109\n1801,50143\n1801,51348\n1801,54714\n1801,54948\n1801,59121\n1801,59144\n1801,59908\n1801,62983\n1801,64570\n1801,64882\n1801,67867\n1801,68656\n1801,70126\n1801,71845\n1801,73204\n1801,74445\n1801,75844\n1801,78804\n1801,78919\n1801,78949\n1801,80519\n1801,85842\n1801,88418\n1801,90383\n1801,91158\n1801,91453\n1801,97147\n1801,98852\n1801,102008\n1801,102695\n1801,102754\n1801,102893\n1801,103355\n1801,104275\n1801,104572\n1801,105722\n1801,105775\n1801,106255\n1801,113618\n1801,114428\n1801,121381\n1801,125163\n1801,128733\n1801,131643\n1801,132917\n1801,133644\n1801,134184\n1801,145515\n1801,150337\n1801,150379\n1801,157071\n1801,158939\n1801,158944\n1801,159366\n1801,160494\n1801,163632\n1801,164906\n1801,165929\n1801,167757\n1801,167820\n1801,168885\n1801,169062\n1801,171699\n1801,173363\n1801,175486\n1801,177309\n1801,178857\n1801,183356\n1801,185860\n1801,185962\n1801,186634\n1801,188527\n1801,192884\n1801,192895\n1801,193078\n1801,194985\n1801,195076\n1801,196739\n1801,198886\n1801,217519\n1801,220281\n1801,220288\n1801,220317\n1801,222523\n1801,225463\n1801,226179\n1801,232118\n1801,237561\n1801,237566\n1801,237570\n1801,237574\n1801,238983\n1801,241594\n1801,243433\n1801,243437\n1801,243444\n1801,243566\n1801,244096\n1801,244650\n1801,248585\n1801,253998\n1801,258685\n1801,258891\n1801,258991\n1801,262340\n1801,262564\n1802,1803\n1803,1\n1803,11\n1803,147\n1803,148\n1803,149\n1803,158\n1803,175\n1803,178\n1803,285\n1803,336\n1803,406\n1803,422\n1803,438\n1803,452\n1803,621\n1803,622\n1803,779\n1803,1014\n1803,1130\n1803,1370\n1803,1546\n1803,1623\n1803,1802\n1803,1803\n1803,1940\n1803,1969\n1803,2102\n1803,3578\n1803,3813\n1803,5118\n1803,5148\n1803,6817\n1803,8477\n1803,9305\n1803,14111\n1803,15408\n1803,20071\n1803,20495\n1803,20585\n1803,20598\n1803,20694\n1803,21217\n1803,21442\n1803,21837\n1803,22027\n1803,22357\n1803,25426\n1803,25489\n1803,26453\n1803,33672\n1803,34880\n1803,35368\n1803,35561\n1803,37502\n1803,37512\n1803,40521\n1803,40840\n1803,41221\n1803,41541\n1803,43007\n1803,43276\n1803,45013\n1803,45427\n1803,46182\n1803,48364\n1803,50586\n1803,55689\n1803,56006\n1803,59020\n1803,59855\n1803,59864\n1803,59887\n1803,60698\n1803,61224\n1803,61626\n1803,64572\n1803,66106\n1803,68695\n1803,68841\n1803,69923\n1803,70081\n1803,70138\n1803,72874\n1803,73422\n1803,73960\n1803,74416\n1803,79528\n1803,83467\n1803,83483\n1803,91397\n1803,93649\n1803,93884\n1803,94898\n1803,95391\n1803,98902\n1803,99655\n1803,99848\n1803,107482\n1803,108041\n1803,108093\n1803,118336\n1803,124409\n1803,125840\n1804,143\n1804,1052\n1804,1177\n1805,32\n1805,87\n1805,314\n1805,349\n1805,360\n1805,388\n1805,392\n1805,425\n1805,446\n1805,452\n1805,599\n1805,658\n1805,661\n1805,697\n1805,818\n1805,838\n1805,903\n1805,918\n1805,919\n1805,1011\n1805,1043\n1805,1204\n1805,1240\n1805,1424\n1805,1454\n1805,1465\n1805,1502\n1805,1513\n1805,1559\n1805,1663\n1805,1769\n1805,1801\n1805,1805\n1805,1860\n1805,1986\n1805,2045\n1805,3367\n1805,3507\n1805,4159\n1805,4760\n1805,5470\n1805,5540\n1805,5568\n1805,5624\n1805,6059\n1805,6430\n1805,6691\n1805,6818\n1805,7766\n1805,7890\n1805,8208\n1805,8236\n1805,8860\n1805,9785\n1805,15609\n1805,18575\n1805,19299\n1805,19609\n1805,21245\n1805,21380\n1805,22363\n1805,24801\n1805,26074\n1805,26161\n1805,28982\n1805,30705\n1805,31001\n1805,32613\n1805,33674\n1805,34811\n1805,34851\n1805,34870\n1805,35464\n1805,35576\n1805,36124\n1805,37219\n1805,37657\n1805,40610\n1805,41880\n1805,54823\n1805,56242\n1805,56256\n1805,67686\n1805,73194\n1805,74122\n1805,75120\n1805,77769\n1805,77868\n1805,89731\n1805,90144\n1805,101612\n1805,101901\n1805,103896\n1805,110807\n1805,112234\n1805,112259\n1805,114080\n1805,121505\n1805,126813\n1805,127158\n1805,135272\n1805,138686\n1805,139633\n1805,139748\n1805,142958\n1805,146367\n1805,147071\n1805,147082\n1805,147562\n1805,147871\n1805,148044\n1805,148830\n1805,148845\n1805,150585\n1805,150710\n1805,151529\n1805,152694\n1805,152714\n1805,153319\n1805,155369\n1805,155396\n1805,155905\n1805,160789\n1805,161636\n1805,176559\n1805,179320\n1805,182958\n1805,185454\n1805,186786\n1805,189212\n1805,207837\n1805,212498\n1805,212846\n1805,214131\n1805,220947\n1805,228303\n1805,229063\n1805,236546\n1805,236550\n1805,238787\n1805,241496\n1805,243369\n1805,255064\n1806,160\n1806,1058\n1807,94\n1807,240\n1807,332\n1807,372\n1807,400\n1807,446\n1807,612\n1807,636\n1807,685\n1807,715\n1807,784\n1807,801\n1807,852\n1807,911\n1807,1011\n1807,1082\n1807,1203\n1807,1285\n1807,1309\n1807,1368\n1807,1459\n1807,1807\n1807,1808\n1807,1888\n1807,1955\n1807,2225\n1807,2315\n1807,2512\n1807,2648\n1807,2775\n1807,3115\n1807,3619\n1807,4115\n1807,5265\n1807,5439\n1807,5654\n1807,14133\n1807,14597\n1807,16271\n1807,21290\n1807,21635\n1807,26498\n1807,33833\n1807,39258\n1807,42951\n1807,44114\n1807,44393\n1807,49795\n1807,50682\n1807,58503\n1807,65827\n1807,66500\n1807,70318\n1807,71819\n1807,72809\n1807,77105\n1807,79875\n1807,84519\n1807,84535\n1807,86451\n1807,91450\n1807,98195\n1807,98201\n1807,98206\n1807,104630\n1807,106890\n1807,106990\n1807,115251\n1807,115455\n1807,118819\n1807,123007\n1807,124756\n1807,126048\n1807,129993\n1807,133532\n1807,133977\n1807,136035\n1807,138845\n1807,143071\n1807,144748\n1807,156202\n1807,157602\n1807,157708\n1807,158342\n1807,160410\n1807,160810\n1807,163825\n1807,174910\n1807,174990\n1807,175903\n1807,202621\n1807,214733\n1807,238622\n1807,247325\n1807,247612\n1807,248443\n1807,248783\n1808,68\n1808,104\n1808,136\n1808,240\n1808,248\n1808,310\n1808,332\n1808,364\n1808,497\n1808,588\n1808,590\n1808,631\n1808,694\n1808,714\n1808,749\n1808,760\n1808,781\n1808,805\n1808,911\n1808,999\n1808,1203\n1808,1262\n1808,1285\n1808,1332\n1808,1388\n1808,1631\n1808,1844\n1808,1860\n1808,1888\n1808,2205\n1808,2266\n1808,2512\n1808,3135\n1808,3328\n1808,4475\n1808,7124\n1808,11147\n1808,27041\n1808,33424\n1809,195\n1810,444\n1811,349\n1811,697\n1812,1623\n1813,1287\n1814,1801\n1815,10\n1815,147\n1815,171\n1815,175\n1815,184\n1815,206\n1815,330\n1815,640\n1815,841\n1815,957\n1815,1246\n1815,1247\n1815,1293\n1815,1623\n1815,1815\n1815,2344\n1815,3037\n1815,4289\n1815,5073\n1815,5244\n1815,6138\n1815,7159\n1815,7518\n1815,8982\n1815,14588\n1815,15236\n1815,16359\n1815,16497\n1815,16706\n1815,17356\n1815,19301\n1815,19624\n1815,22711\n1815,23104\n1815,25869\n1815,26982\n1815,27467\n1815,28360\n1815,29979\n1815,41205\n1815,41244\n1815,43312\n1815,43847\n1815,43853\n1815,46172\n1815,52201\n1815,52888\n1815,54157\n1815,57412\n1815,57415\n1815,57417\n1815,57451\n1815,57929\n1815,62011\n1815,63734\n1815,64743\n1815,64745\n1815,65742\n1815,72116\n1815,76060\n1815,78875\n1815,85979\n1815,95054\n1815,98039\n1815,102786\n1815,104229\n1815,106938\n1815,109503\n1815,110049\n1815,110934\n1815,113242\n1815,129852\n1815,129988\n1815,138489\n1815,140449\n1815,144001\n1815,148499\n1815,149239\n1815,150988\n1815,152981\n1815,156778\n1815,163588\n1815,163793\n1815,163924\n1815,164572\n1815,164781\n1815,168962\n1815,175492\n1815,176012\n1815,177336\n1815,177581\n1815,180276\n1815,181895\n1815,183118\n1815,186191\n1815,204687\n1815,214415\n1815,221358\n1815,222281\n1815,225655\n1815,244977\n1816,424\n1817,1370\n1817,1821\n1818,167\n1818,217\n1818,240\n1818,264\n1818,289\n1818,290\n1818,328\n1818,588\n1818,590\n1818,592\n1818,704\n1818,760\n1818,818\n1818,872\n1818,911\n1818,1011\n1818,1014\n1818,1085\n1818,1282\n1818,1285\n1818,1402\n1818,1505\n1818,1511\n1818,1564\n1818,1796\n1818,1818\n1818,1973\n1818,2173\n1818,2205\n1818,2206\n1818,2286\n1818,2512\n1818,2620\n1818,2874\n1818,3028\n1818,3069\n1818,3507\n1818,3565\n1818,3738\n1818,3832\n1818,3879\n1818,3937\n1818,4237\n1818,4352\n1818,4540\n1818,5278\n1818,5346\n1818,5626\n1818,5718\n1818,5789\n1818,6651\n1818,6856\n1818,7481\n1818,8763\n1818,9015\n1818,13965\n1818,14603\n1818,15397\n1818,16289\n1818,16684\n1818,17848\n1818,18603\n1818,20072\n1818,22281\n1818,23102\n1818,24896\n1818,26410\n1818,26460\n1818,26781\n1818,33424\n1818,34752\n1818,35304\n1818,37202\n1818,37224\n1818,38984\n1818,39618\n1818,43364\n1818,45532\n1818,47810\n1818,49074\n1818,50540\n1818,52862\n1818,58206\n1818,62482\n1818,63102\n1818,64594\n1818,69440\n1818,77679\n1818,80149\n1818,82579\n1818,82731\n1818,83766\n1818,92242\n1818,94134\n1818,95060\n1818,103524\n1818,104536\n1818,105263\n1818,112364\n1818,114908\n1818,115293\n1818,116694\n1818,117141\n1818,119203\n1818,119860\n1818,120093\n1818,127158\n1818,130889\n1818,131371\n1818,135138\n1818,139943\n1818,140095\n1818,140454\n1818,141563\n1818,143052\n1818,144988\n1818,147955\n1818,148287\n1818,149323\n1818,150051\n1818,150522\n1818,150593\n1818,157729\n1818,158581\n1818,167312\n1818,170061\n1818,171308\n1818,178576\n1818,178651\n1818,182162\n1818,195758\n1818,197837\n1818,215433\n1818,229795\n1818,236111\n1818,238532\n1818,245559\n1818,245910\n1818,246095\n1818,246474\n1818,247924\n1818,249309\n1818,249437\n1818,251385\n1819,723\n1819,1267\n1820,151\n1821,106\n1821,280\n1821,337\n1821,586\n1821,663\n1821,664\n1821,1370\n1821,2782\n1821,17245\n1822,1309\n1823,868\n1824,433\n1824,1634\n1825,56\n1825,79\n1825,147\n1825,192\n1825,206\n1825,333\n1825,779\n1825,1089\n1825,1118\n1825,1181\n1825,1192\n1825,1619\n1825,2173\n1825,2244\n1825,3895\n1825,8055\n1825,68069\n1825,75912\n1826,843\n1827,1143\n1827,1363\n1828,30\n1829,592\n1830,1010\n1831,225\n1831,248\n1831,379\n1831,390\n1831,431\n1831,932\n1831,941\n1831,968\n1831,1274\n1831,1832\n1831,22799\n1832,968\n1832,1124\n1832,1231\n1832,2217\n1832,23031\n1833,1\n1833,147\n1833,158\n1833,336\n1833,1833\n1833,1834\n1833,2101\n1833,2244\n1833,3785\n1833,5401\n1833,7169\n1833,7909\n1833,8053\n1833,9394\n1833,15569\n1833,16183\n1833,22531\n1833,24636\n1833,24954\n1833,25274\n1833,25458\n1833,28503\n1833,28872\n1833,29645\n1833,32809\n1833,34043\n1833,35571\n1833,35731\n1834,158\n1835,843\n1836,58\n1836,87\n1836,314\n1836,509\n1836,510\n1836,599\n1836,685\n1836,849\n1836,852\n1836,872\n1836,911\n1836,1011\n1836,1118\n1836,1130\n1836,1172\n1836,1465\n1836,1722\n1836,1805\n1836,4039\n1836,4066\n1836,21944\n1837,86\n1837,167\n1837,192\n1837,256\n1837,301\n1837,314\n1837,440\n1837,505\n1837,563\n1837,567\n1837,599\n1837,615\n1837,663\n1837,803\n1837,818\n1837,907\n1837,932\n1837,937\n1837,941\n1837,968\n1837,972\n1837,973\n1837,1010\n1837,1011\n1837,1014\n1837,1117\n1837,1118\n1837,1231\n1837,1284\n1837,1298\n1837,1732\n1837,1740\n1837,1782\n1837,1796\n1837,1838\n1837,1849\n1837,1853\n1837,2083\n1837,2191\n1837,2246\n1837,2263\n1837,2473\n1837,2689\n1837,2979\n1837,3207\n1837,3455\n1837,3507\n1837,3718\n1837,3754\n1837,4253\n1837,4291\n1837,4932\n1837,5292\n1837,5382\n1837,5502\n1837,5625\n1837,6909\n1837,7222\n1837,7995\n1837,14414\n1837,16192\n1837,16489\n1837,16601\n1837,18356\n1837,18667\n1837,18880\n1837,19592\n1837,19791\n1837,20075\n1837,20327\n1837,20590\n1837,20593\n1837,21563\n1837,21565\n1837,21866\n1837,24579\n1837,25802\n1837,29714\n1837,29760\n1837,29947\n1837,30373\n1837,30410\n1837,32899\n1837,33552\n1837,37795\n1837,38860\n1837,39285\n1837,43928\n1837,44403\n1837,47450\n1837,48238\n1837,49445\n1837,50423\n1837,50522\n1837,53512\n1837,66590\n1837,67116\n1837,70028\n1837,71868\n1837,73355\n1837,76704\n1837,77858\n1837,80659\n1837,82907\n1837,84458\n1837,85758\n1837,85783\n1837,88299\n1837,88611\n1837,91999\n1837,92003\n1837,93065\n1837,93300\n1837,93327\n1837,99626\n1837,102397\n1837,113093\n1837,114464\n1837,115239\n1837,115479\n1837,115667\n1837,116513\n1837,116560\n1837,118200\n1837,124689\n1837,126939\n1837,127158\n1837,136226\n1837,138007\n1837,144029\n1837,145979\n1837,154367\n1837,157363\n1837,157566\n1837,162977\n1837,164427\n1837,164448\n1837,165872\n1837,172278\n1837,173260\n1837,180462\n1837,180509\n1837,181875\n1837,182446\n1837,183352\n1837,190250\n1837,191011\n1837,196029\n1837,216706\n1837,224304\n1837,237320\n1837,239311\n1837,239660\n1837,259524\n1837,262708\n1838,457\n1838,1837\n1838,2310\n1839,273\n1839,274\n1839,66754\n1840,1058\n1841,349\n1842,195\n1843,19\n1843,54\n1843,135\n1843,217\n1843,397\n1843,477\n1843,536\n1843,660\n1843,1417\n1843,1539\n1843,1571\n1843,1724\n1843,2168\n1843,2421\n1843,2424\n1843,2553\n1843,2646\n1843,2944\n1843,5326\n1843,5591\n1843,6506\n1843,17346\n1844,10\n1844,30\n1844,68\n1844,104\n1844,107\n1844,134\n1844,138\n1844,147\n1844,158\n1844,163\n1844,182\n1844,192\n1844,200\n1844,209\n1844,211\n1844,217\n1844,256\n1844,261\n1844,264\n1844,301\n1844,302\n1844,314\n1844,327\n1844,336\n1844,356\n1844,360\n1844,392\n1844,406\n1844,417\n1844,435\n1844,440\n1844,446\n1844,457\n1844,467\n1844,497\n1844,505\n1844,510\n1844,516\n1844,536\n1844,557\n1844,599\n1844,604\n1844,622\n1844,631\n1844,636\n1844,673\n1844,677\n1844,685\n1844,794\n1844,838\n1844,843\n1844,849\n1844,852\n1844,856\n1844,872\n1844,900\n1844,911\n1844,920\n1844,1001\n1844,1011\n1844,1014\n1844,1070\n1844,1085\n1844,1089\n1844,1118\n1844,1127\n1844,1130\n1844,1140\n1844,1151\n1844,1172\n1844,1204\n1844,1210\n1844,1243\n1844,1262\n1844,1293\n1844,1332\n1844,1370\n1844,1417\n1844,1445\n1844,1518\n1844,1531\n1844,1533\n1844,1572\n1844,1623\n1844,1749\n1844,1796\n1844,1808\n1844,1844\n1844,1893\n1844,1968\n1844,1992\n1844,2037\n1844,2105\n1844,2373\n1844,2460\n1844,2512\n1844,2580\n1844,2605\n1844,2867\n1844,2868\n1844,3507\n1844,3744\n1844,3930\n1844,3944\n1844,4190\n1844,4276\n1844,4355\n1844,4771\n1844,5213\n1844,5551\n1844,5578\n1844,5596\n1844,5833\n1844,6452\n1844,6752\n1844,7022\n1844,7178\n1844,7879\n1844,13207\n1844,13538\n1844,14024\n1844,14220\n1844,14379\n1844,15275\n1844,15454\n1844,19335\n1844,19543\n1844,19592\n1844,19783\n1844,19784\n1844,22880\n1844,25108\n1844,25526\n1844,26450\n1844,26860\n1844,26873\n1844,30507\n1844,30557\n1844,31706\n1844,32824\n1844,34124\n1844,34949\n1844,35706\n1844,38300\n1844,42735\n1844,43358\n1844,45404\n1844,47106\n1844,54285\n1844,54616\n1844,55105\n1844,55416\n1844,56906\n1844,57182\n1844,57222\n1844,58405\n1844,59833\n1844,62322\n1844,63018\n1844,64722\n1844,65733\n1844,68006\n1844,71039\n1844,71770\n1844,73313\n1844,73475\n1844,74745\n1844,75912\n1844,76969\n1844,78772\n1844,79669\n1844,80482\n1844,83379\n1844,85867\n1844,86055\n1844,86494\n1844,89929\n1844,90389\n1844,93199\n1844,93766\n1844,94906\n1844,97536\n1844,99160\n1844,104539\n1844,106361\n1844,109266\n1844,109385\n1844,112767\n1844,113060\n1844,114497\n1844,114928\n1844,117013\n1844,117309\n1844,117480\n1844,120258\n1844,120927\n1844,121455\n1844,122637\n1844,122758\n1844,123792\n1844,124939\n1844,128733\n1844,131419\n1844,131890\n1844,131965\n1844,135279\n1844,136701\n1844,140745\n1844,149373\n1844,155201\n1844,157683\n1844,158327\n1844,158336\n1844,158350\n1844,159872\n1844,169624\n1844,177802\n1844,179739\n1844,183938\n1844,187340\n1844,192452\n1844,196116\n1844,212173\n1844,215059\n1844,218340\n1844,224097\n1844,224863\n1844,227995\n1844,228949\n1844,232307\n1844,234886\n1844,238321\n1844,244646\n1844,247221\n1844,255194\n1844,258385\n1844,259479\n1845,126\n1845,130\n1845,140\n1845,264\n1845,292\n1845,338\n1845,349\n1845,397\n1845,462\n1845,467\n1845,535\n1845,649\n1845,697\n1845,710\n1845,801\n1845,872\n1845,918\n1845,1052\n1845,1151\n1845,1289\n1845,1454\n1845,1579\n1845,1659\n1845,1688\n1845,1722\n1845,1893\n1845,2443\n1845,2626\n1845,3260\n1845,3367\n1845,4039\n1845,5540\n1846,160\n1846,794\n1846,1345\n1846,1847\n1847,1847\n1847,17886\n1848,1\n1848,106\n1848,272\n1848,292\n1848,313\n1848,346\n1848,489\n1848,626\n1848,663\n1848,664\n1848,671\n1848,685\n1848,808\n1848,841\n1848,849\n1848,911\n1848,929\n1848,937\n1848,980\n1848,1011\n1848,1113\n1848,1293\n1848,1319\n1848,1515\n1848,1566\n1848,1623\n1848,1888\n1848,1985\n1848,2436\n1848,3258\n1848,3507\n1848,26450\n1849,10\n1849,37\n1849,86\n1849,106\n1849,167\n1849,175\n1849,211\n1849,217\n1849,225\n1849,292\n1849,299\n1849,301\n1849,313\n1849,314\n1849,356\n1849,390\n1849,397\n1849,459\n1849,467\n1849,518\n1849,602\n1849,604\n1849,663\n1849,664\n1849,693\n1849,717\n1849,744\n1849,783\n1849,852\n1849,897\n1849,907\n1849,932\n1849,937\n1849,940\n1849,968\n1849,972\n1849,973\n1849,1010\n1849,1012\n1849,1013\n1849,1027\n1849,1122\n1849,1123\n1849,1167\n1849,1241\n1849,1264\n1849,1284\n1849,1293\n1849,1297\n1849,1298\n1849,1320\n1849,1326\n1849,1436\n1849,1479\n1849,1493\n1849,1522\n1849,1544\n1849,1575\n1849,1591\n1849,1616\n1849,1623\n1849,1635\n1849,1651\n1849,1732\n1849,1782\n1849,1837\n1849,1849\n1849,1955\n1849,1985\n1849,2007\n1849,2083\n1849,2102\n1849,2191\n1849,2285\n1849,2336\n1849,2345\n1849,2347\n1849,2375\n1849,2480\n1849,2557\n1849,2625\n1849,2652\n1849,2775\n1849,2840\n1849,2979\n1849,3115\n1849,3207\n1849,3218\n1849,3422\n1849,3630\n1849,3687\n1849,3761\n1849,3801\n1849,3804\n1849,3820\n1849,3937\n1849,4182\n1849,4213\n1849,4324\n1849,5133\n1849,5137\n1849,5159\n1849,5301\n1849,5361\n1849,5388\n1849,5563\n1849,5601\n1849,5607\n1849,5662\n1849,6533\n1849,6698\n1849,6712\n1849,7333\n1849,7530\n1849,7959\n1849,7969\n1849,8022\n1849,8132\n1849,8165\n1849,8534\n1849,8864\n1849,12112\n1849,13148\n1849,13262\n1849,13506\n1849,13518\n1849,14111\n1849,14158\n1849,14358\n1849,14428\n1849,14497\n1849,14572\n1849,14597\n1849,15141\n1849,15678\n1849,16614\n1849,17877\n1849,18116\n1849,18320\n1849,18340\n1849,18625\n1849,18782\n1849,19191\n1849,19952\n1849,20297\n1849,20396\n1849,20575\n1849,20668\n1849,21635\n1849,21726\n1849,21998\n1849,22493\n1849,23402\n1849,24580\n1849,24620\n1849,24719\n1849,24924\n1849,24926\n1849,25067\n1849,25447\n1849,26366\n1849,27043\n1849,28115\n1849,28254\n1849,28323\n1849,28377\n1849,30591\n1849,32784\n1849,32975\n1849,33988\n1849,34242\n1849,35329\n1849,35545\n1849,35948\n1849,36589\n1849,36840\n1849,37602\n1849,38247\n1849,38294\n1849,38733\n1849,40122\n1849,40476\n1849,40590\n1849,40614\n1849,42728\n1849,43213\n1849,45853\n1849,46165\n1849,46699\n1849,46851\n1849,47114\n1849,48051\n1849,48237\n1849,48659\n1849,48959\n1849,48964\n1849,48972\n1849,49373\n1849,49549\n1849,50542\n1849,52067\n1849,54504\n1849,58203\n1849,59658\n1849,62195\n1849,62487\n1849,63138\n1849,64182\n1849,64212\n1849,70166\n1849,70314\n1849,73237\n1849,73473\n1849,75862\n1849,76106\n1849,76938\n1849,76943\n1849,77694\n1849,78460\n1849,79849\n1849,84288\n1849,86515\n1849,87746\n1849,87841\n1849,90208\n1849,92934\n1849,93096\n1849,93599\n1849,93703\n1849,93706\n1849,94946\n1849,99003\n1849,99837\n1849,102361\n1849,102507\n1849,102798\n1849,103725\n1849,106382\n1849,107693\n1849,109508\n1849,110575\n1849,111292\n1849,111306\n1849,112567\n1849,113020\n1849,114531\n1849,116759\n1849,120982\n1849,121574\n1849,122580\n1849,124668\n1849,125625\n1849,126110\n1849,127403\n1849,127404\n1849,127421\n1849,127741\n1849,127807\n1849,127883\n1849,128822\n1849,129579\n1849,130193\n1849,130238\n1849,130239\n1849,133575\n1849,137033\n1849,138062\n1849,139171\n1849,140056\n1849,140729\n1849,140733\n1849,141763\n1849,142029\n1849,142275\n1849,142501\n1849,142854\n1849,143082\n1849,143337\n1849,143927\n1849,144179\n1849,147367\n1849,150073\n1849,151126\n1849,151464\n1849,151554\n1849,151867\n1849,152298\n1849,155094\n1849,155818\n1849,156379\n1849,159492\n1849,160814\n1849,161915\n1849,164950\n1849,165298\n1849,166949\n1849,169415\n1849,170811\n1849,171641\n1849,173351\n1849,177014\n1849,182414\n1849,182915\n1849,185148\n1849,186900\n1849,187064\n1849,187127\n1849,189548\n1849,190466\n1849,194609\n1849,196836\n1849,198780\n1849,204791\n1849,205157\n1849,207495\n1849,214971\n1849,219861\n1849,220239\n1849,223073\n1849,226390\n1849,228541\n1849,230978\n1849,231989\n1849,236819\n1849,237320\n1849,239576\n1849,239810\n1849,240663\n1849,241396\n1849,241661\n1849,246550\n1849,247820\n1849,248511\n1849,249102\n1849,250784\n1849,251427\n1849,254315\n1849,256521\n1849,259688\n1849,260142\n1849,260402\n1849,260478\n1849,262172\n1849,262406\n1850,215\n1851,209\n1851,302\n1851,687\n1851,1556\n1852,968\n1853,34\n1853,35\n1853,68\n1853,167\n1853,217\n1853,240\n1853,301\n1853,388\n1853,390\n1853,392\n1853,536\n1853,589\n1853,657\n1853,752\n1853,818\n1853,907\n1853,968\n1853,1010\n1853,1085\n1853,1160\n1853,1210\n1853,1284\n1853,1298\n1853,1300\n1853,1326\n1853,1417\n1853,1531\n1853,1796\n1853,2557\n1853,2979\n1853,3193\n1853,3630\n1853,4411\n1853,187176\n1854,1400\n1855,66\n1855,211\n1855,440\n1855,467\n1855,1433\n1856,309\n1856,310\n1857,1858\n1858,32\n1858,1429\n1858,2253\n1858,6824\n1859,1860\n1860,34\n1860,111\n1860,175\n1860,256\n1860,283\n1860,292\n1860,349\n1860,392\n1860,433\n1860,452\n1860,455\n1860,536\n1860,623\n1860,626\n1860,644\n1860,685\n1860,693\n1860,697\n1860,808\n1860,809\n1860,838\n1860,872\n1860,903\n1860,911\n1860,918\n1860,919\n1860,951\n1860,992\n1860,1240\n1860,1262\n1860,1345\n1860,1363\n1860,1465\n1860,1572\n1860,1612\n1860,1805\n1860,1808\n1860,1860\n1860,2045\n1860,2124\n1860,2274\n1860,2418\n1860,2699\n1860,2714\n1860,3182\n1860,3880\n1860,4066\n1860,4118\n1860,4399\n1860,4759\n1860,4760\n1860,4771\n1860,5540\n1860,5604\n1860,6893\n1860,6955\n1860,7155\n1860,15344\n1860,15795\n1860,18436\n1860,20426\n1860,21343\n1860,21982\n1860,24592\n1860,25398\n1860,25573\n1860,26366\n1860,29054\n1860,30617\n1860,32819\n1860,33519\n1860,34716\n1860,35439\n1860,37219\n1860,37474\n1860,44754\n1860,45026\n1860,46165\n1860,46938\n1860,47131\n1860,47649\n1860,47959\n1860,48264\n1860,48842\n1860,49027\n1860,49252\n1860,50079\n1860,50142\n1860,50325\n1860,51171\n1860,51924\n1860,52351\n1860,54924\n1860,59245\n1860,60167\n1860,64146\n1860,64656\n1860,65940\n1860,68096\n1860,75787\n1860,84734\n1860,95540\n1860,96578\n1860,98792\n1860,104565\n1860,110166\n1860,114613\n1860,115394\n1860,115479\n1860,117480\n1860,117707\n1860,117714\n1860,117738\n1860,121355\n1860,123118\n1860,124576\n1860,125844\n1860,127158\n1860,130739\n1860,131890\n1860,132930\n1860,134495\n1860,134497\n1860,137734\n1860,138037\n1860,138038\n1860,138039\n1860,138040\n1860,138041\n1860,138042\n1860,138043\n1860,138044\n1860,138045\n1860,138046\n1860,138047\n1860,138048\n1860,138049\n1860,145871\n1860,145873\n1860,145875\n1860,145926\n1860,146303\n1860,146305\n1860,146312\n1860,147324\n1860,154655\n1860,154927\n1860,155020\n1860,155705\n1860,155751\n1860,157221\n1860,159103\n1860,160527\n1860,161947\n1860,163405\n1860,165075\n1860,171577\n1860,176471\n1860,176559\n1860,177400\n1860,177940\n1860,179046\n1860,180346\n1860,180963\n1860,181106\n1860,181840\n1860,182926\n1860,185899\n1860,192600\n1860,217491\n1860,220336\n1860,226528\n1860,233377\n1860,236016\n1860,237474\n1860,237484\n1860,238996\n1860,243262\n1860,246125\n1860,249296\n1860,259503\n1860,264379\n1861,54\n1862,102\n1862,393\n1862,980\n1863,1509\n1864,298\n1865,485\n1866,1\n1866,130\n1866,138\n1866,160\n1866,163\n1866,256\n1866,287\n1866,294\n1866,299\n1866,305\n1866,459\n1866,596\n1866,634\n1866,663\n1866,664\n1866,668\n1866,690\n1866,718\n1866,832\n1866,968\n1866,1298\n1866,1345\n1866,1381\n1866,1454\n1866,1837\n1866,1860\n1866,1871\n1866,1891\n1867,225\n1867,435\n1867,1012\n1867,1177\n1867,3585\n1867,7757\n1868,647\n1869,3\n1869,1058\n1869,1522\n1869,1718\n1870,79\n1870,1619\n1871,187\n1871,222\n1871,313\n1871,379\n1871,389\n1871,399\n1871,635\n1871,657\n1871,1120\n1871,1467\n1871,1756\n1871,2159\n1871,2421\n1871,3234\n1871,3758\n1871,3820\n1871,4419\n1871,5406\n1871,6032\n1871,6739\n1871,6754\n1871,6793\n1871,8030\n1871,13422\n1871,14839\n1871,14840\n1871,14849\n1871,15303\n1871,15306\n1871,15325\n1871,15605\n1871,16340\n1871,16470\n1871,16569\n1871,20934\n1871,26056\n1871,26801\n1871,26804\n1871,29666\n1871,30366\n1871,38153\n1871,39537\n1871,41024\n1871,45224\n1871,48393\n1871,50357\n1871,50431\n1871,54618\n1871,55143\n1871,56323\n1871,56362\n1871,60619\n1871,60714\n1872,1711\n1873,50\n1873,79\n1873,760\n1874,182\n1874,1634\n1875,32\n1877,20\n1877,147\n1877,158\n1877,202\n1877,203\n1877,256\n1877,315\n1877,346\n1877,435\n1877,447\n1877,538\n1877,671\n1877,766\n1877,934\n1877,939\n1877,996\n1877,1294\n1877,1612\n1877,1619\n1877,1877\n1877,1878\n1877,1973\n1877,1987\n1877,2102\n1877,2217\n1877,2352\n1877,2353\n1877,2427\n1877,3576\n1877,3626\n1877,4646\n1877,5460\n1877,6586\n1877,6622\n1877,6653\n1877,6661\n1877,9744\n1877,14111\n1877,14240\n1877,14428\n1877,15141\n1877,15146\n1877,15563\n1877,17423\n1877,17424\n1877,18507\n1877,18784\n1877,21322\n1877,21442\n1877,22202\n1877,25596\n1877,26038\n1877,28425\n1877,28981\n1877,29660\n1877,29868\n1877,30775\n1877,32728\n1877,37315\n1877,41747\n1877,44806\n1877,46859\n1877,49592\n1877,53733\n1877,63425\n1877,68838\n1877,83947\n1877,86851\n1877,93043\n1877,96640\n1877,101874\n1877,117966\n1877,117974\n1877,120052\n1877,128831\n1877,134567\n1877,135992\n1877,138125\n1877,150001\n1877,164611\n1877,168530\n1877,171607\n1877,175605\n1877,193534\n1877,194432\n1877,237359\n1877,247278\n1877,256231\n1877,256367\n1877,260148\n1877,261687\n1878,192\n1878,1623\n1878,1877\n1881,83\n1881,217\n1881,283\n1881,313\n1881,379\n1881,389\n1881,455\n1881,536\n1881,685\n1881,1618\n1881,1881\n1881,2266\n1881,2319\n1881,2784\n1881,4166\n1881,4637\n1881,5325\n1881,8431\n1881,9743\n1881,14094\n1881,18614\n1881,19563\n1881,20677\n1881,28130\n1881,30502\n1881,30541\n1881,34293\n1881,41450\n1881,41854\n1881,41905\n1881,46564\n1881,61355\n1881,61370\n1881,70361\n1881,76991\n1881,79579\n1881,108029\n1881,110599\n1881,115474\n1881,119000\n1881,127386\n1881,127439\n1881,127931\n1881,153498\n1881,169027\n1881,176802\n1881,178875\n1881,180036\n1881,180464\n1882,94\n1882,104\n1882,134\n1882,135\n1882,137\n1882,138\n1882,254\n1882,525\n1882,609\n1882,636\n1882,715\n1882,772\n1882,1011\n1882,1149\n1882,1212\n1882,1257\n1882,1282\n1882,1359\n1882,1402\n1882,1592\n1882,1739\n1882,1749\n1882,1882\n1882,1883\n1882,1888\n1882,2105\n1882,2384\n1882,3590\n1882,4276\n1882,4330\n1882,4341\n1882,4366\n1882,5439\n1882,5801\n1882,5947\n1882,7000\n1882,7081\n1882,18094\n1882,19755\n1882,24265\n1882,26306\n1882,28324\n1882,30437\n1882,33567\n1882,36939\n1882,43178\n1882,65681\n1882,68373\n1882,74423\n1882,76190\n1882,76990\n1882,84476\n1882,102891\n1882,109831\n1882,122993\n1882,123914\n1882,127667\n1882,128449\n1882,128450\n1882,128453\n1882,128454\n1882,128455\n1882,128456\n1882,128457\n1882,137886\n1882,145992\n1882,157186\n1882,157783\n1882,161145\n1882,170012\n1882,171613\n1882,179730\n1882,179900\n1882,182870\n1882,188374\n1882,189859\n1882,190536\n1882,190739\n1882,191294\n1882,192147\n1882,192162\n1882,192241\n1882,192620\n1882,192729\n1882,192780\n1882,193715\n1882,193783\n1882,194092\n1882,194166\n1882,194243\n1882,194300\n1882,194606\n1882,196109\n1882,196733\n1882,197277\n1882,198238\n1882,198263\n1882,198764\n1882,200920\n1882,201099\n1882,201897\n1882,202060\n1882,202761\n1882,206987\n1882,217507\n1882,217885\n1882,218164\n1882,223998\n1882,224016\n1882,225799\n1882,227234\n1882,227808\n1882,232763\n1882,234387\n1882,239044\n1882,239841\n1882,239899\n1882,241219\n1882,241596\n1882,242287\n1882,244003\n1882,245911\n1882,246084\n1882,246164\n1882,247022\n1882,247424\n1882,247684\n1882,247913\n1882,248053\n1882,250723\n1882,251855\n1882,252952\n1882,257913\n1882,259000\n1882,260094\n1882,261260\n1884,1885\n1886,682\n1887,1888\n1888,41\n1888,68\n1888,175\n1888,240\n1888,356\n1888,372\n1888,390\n1888,446\n1888,506\n1888,609\n1888,677\n1888,685\n1888,693\n1888,715\n1888,784\n1888,879\n1888,911\n1888,1004\n1888,1016\n1888,1080\n1888,1082\n1888,1119\n1888,1285\n1888,1309\n1888,1359\n1888,1631\n1888,1785\n1888,1807\n1888,1808\n1888,1887\n1888,1888\n1888,1955\n1888,2085\n1888,2384\n1888,2512\n1888,2518\n1888,2590\n1888,2620\n1888,2775\n1888,2802\n1888,3457\n1888,5299\n1888,5412\n1888,5439\n1888,5727\n1888,5765\n1888,8147\n1888,13621\n1888,13637\n1888,14511\n1888,15792\n1888,15793\n1888,17139\n1888,18965\n1888,22152\n1888,22168\n1888,22461\n1888,23474\n1888,23710\n1888,25009\n1888,26027\n1888,27500\n1888,29002\n1888,30333\n1888,33338\n1888,34139\n1888,37558\n1888,43247\n1888,44330\n1888,44962\n1888,45721\n1888,46132\n1888,47186\n1888,48741\n1888,49114\n1888,58275\n1888,60463\n1888,63036\n1888,70332\n1888,73337\n1888,78987\n1888,80167\n1888,82744\n1888,83441\n1888,84264\n1888,88794\n1888,89820\n1888,92057\n1888,96353\n1888,108066\n1888,109546\n1888,118383\n1888,118419\n1888,118889\n1888,118890\n1888,118891\n1888,119057\n1888,119759\n1888,121075\n1888,123813\n1888,123989\n1888,124877\n1888,125829\n1888,127326\n1888,127665\n1888,128728\n1888,130567\n1888,132015\n1888,134140\n1888,138782\n1888,138967\n1888,139652\n1888,142806\n1888,148277\n1888,151131\n1888,151132\n1888,151171\n1888,157599\n1888,164925\n1888,165087\n1888,175253\n1888,180304\n1888,182036\n1888,188739\n1888,189160\n1888,191463\n1888,194299\n1888,214267\n1888,214431\n1888,215187\n1888,216207\n1888,216965\n1888,221079\n1888,244629\n1888,245068\n1888,246512\n1888,253777\n1888,259011\n1888,259578\n1888,262450\n1888,263908\n1890,104\n1890,442\n1890,1659\n1891,11\n1891,147\n1891,178\n1891,992\n1891,1118\n1891,1345\n1891,1663\n1891,1891\n1891,1926\n1891,1973\n1891,2744\n1891,3507\n1891,5265\n1891,6517\n1891,25500\n1891,26437\n1891,31083\n1891,31084\n1891,31095\n1891,32173\n1891,39570\n1891,42012\n1891,42464\n1891,43221\n1891,44183\n1891,50041\n1891,50146\n1891,52987\n1891,53223\n1891,54250\n1891,64071\n1891,72485\n1891,76050\n1891,79637\n1891,80183\n1891,87736\n1891,89835\n1891,96247\n1891,105493\n1891,105498\n1891,105981\n1891,158774\n1891,173232\n1891,183263\n1891,194032\n1891,199286\n1891,202415\n1891,207659\n1891,228861\n1891,233398\n1891,234077\n1891,238727\n1891,239551\n1891,246849\n1892,340\n1892,360\n1892,1127\n1892,1224\n1892,1893\n1892,3177\n1893,10\n1893,111\n1893,182\n1893,186\n1893,192\n1893,301\n1893,314\n1893,440\n1893,452\n1893,457\n1893,467\n1893,535\n1893,599\n1893,673\n1893,760\n1893,794\n1893,843\n1893,872\n1893,1011\n1893,1118\n1893,1172\n1893,1210\n1893,1417\n1893,1572\n1893,1722\n1893,1796\n1893,1893\n1893,1978\n1893,2173\n1893,2224\n1893,2373\n1893,2480\n1893,4294\n1893,6695\n1893,6904\n1893,9005\n1893,20757\n1894,1467\n1895,996\n1896,868\n1896,1043\n1896,1424\n1897,1474\n1898,634\n1899,251\n1899,364\n1899,417\n1899,442\n1899,749\n1899,1612\n1900,473\n1900,8149\n1901,158\n1901,118336\n1902,1903\n1904,1905\n1904,2903\n1904,8067\n1904,27366\n1904,27367\n1904,28962\n1904,29615\n1904,30760\n1904,31498\n1904,32344\n1904,32345\n1905,222\n1905,1572\n1905,1796\n1905,5101\n1906,1907\n1908,1909\n1908,1910\n1908,3994\n1908,4933\n1908,6531\n1908,6680\n1908,31993\n1908,36427\n1908,36446\n1909,775\n1909,1907\n1911,1912\n1912,68\n1912,175\n1912,387\n1912,1911\n1912,1912\n1912,4605\n1912,8488\n1912,8519\n1912,17278\n1912,22071\n1912,27307\n1912,39953\n1912,40279\n1912,46704\n1912,49762\n1912,90401\n1912,96291\n1912,105041\n1912,185410\n1912,215522\n1912,219764\n1912,220715\n1912,221446\n1912,221475\n1912,245706\n1912,250625\n1914,657\n1914,811\n1915,435\n1915,766\n1915,939\n1915,4646\n1915,188523\n1916,34\n1916,35\n1916,217\n1916,240\n1916,278\n1916,283\n1916,389\n1916,442\n1916,455\n1916,467\n1916,536\n1916,657\n1916,660\n1916,781\n1916,1014\n1916,1019\n1916,1072\n1916,1192\n1916,1392\n1916,1417\n1916,1724\n1916,3252\n1916,4637\n1916,6506\n1916,7092\n1916,19443\n1916,115474\n1916,156379\n1917,143\n1918,256\n1918,515\n1919,1858\n1920,1860\n1921,158\n1921,994\n1921,1227\n1921,1229\n1921,1252\n1921,1253\n1921,1532\n1921,1922\n1921,3132\n1921,4114\n1921,4537\n1921,5156\n1921,5843\n1921,6580\n1921,6582\n1921,16050\n1921,17114\n1921,21944\n1921,27955\n1921,49744\n1921,50929\n1921,65106\n1921,65197\n1921,86416\n1922,1227\n1922,1229\n1922,21944\n1922,86416\n1923,784\n1923,859\n1923,1474\n1923,1631\n1923,3148\n1924,1392\n1926,1927\n1927,202\n1927,252\n1927,275\n1927,446\n1927,493\n1927,500\n1927,505\n1927,516\n1927,682\n1927,733\n1927,1175\n1927,1243\n1927,1266\n1927,1276\n1927,1568\n1927,1655\n1927,1926\n1927,1927\n1927,1973\n1927,3082\n1927,3507\n1927,3524\n1927,3539\n1927,4066\n1927,4814\n1927,6458\n1927,6824\n1927,8037\n1927,13659\n1927,18185\n1927,20400\n1927,21007\n1927,23008\n1927,23861\n1927,26181\n1927,26286\n1927,26303\n1927,31378\n1927,32778\n1927,33553\n1927,42525\n1927,43320\n1927,44859\n1927,47033\n1927,48944\n1927,54376\n1927,54945\n1927,56225\n1927,58020\n1927,58846\n1927,58849\n1927,64478\n1927,67324\n1927,72068\n1927,72439\n1927,74179\n1927,78879\n1927,93330\n1927,95496\n1927,96693\n1927,109444\n1927,112921\n1927,113371\n1927,113625\n1927,118311\n1927,118806\n1927,119252\n1927,127740\n1927,127887\n1927,154434\n1927,159460\n1927,165837\n1927,166348\n1927,168595\n1927,169334\n1927,170637\n1927,172651\n1927,173881\n1927,176792\n1927,179287\n1927,181569\n1927,181625\n1927,181632\n1927,181634\n1927,194459\n1927,196051\n1927,196242\n1927,198493\n1927,199326\n1927,200679\n1927,200680\n1927,202482\n1927,204003\n1927,212620\n1927,215276\n1927,227067\n1927,230925\n1927,232016\n1927,245319\n1927,247040\n1927,247146\n1927,247295\n1927,256610\n1927,258123\n1927,260307\n1927,260796\n1927,260802\n1928,911\n1929,344\n1930,1858\n1931,1860\n1932,1858\n1933,1860\n1934,536\n1935,1285\n1936,182\n1938,20\n1939,104\n1939,107\n1939,111\n1939,134\n1939,137\n1939,138\n1939,254\n1939,328\n1939,557\n1939,622\n1939,715\n1939,954\n1939,968\n1939,1011\n1939,1179\n1939,1690\n1939,1939\n1939,2105\n1939,2206\n1939,2587\n1939,2727\n1939,2934\n1939,3247\n1939,3565\n1939,4024\n1939,4276\n1939,5472\n1939,5830\n1939,6023\n1939,6674\n1939,6894\n1939,7879\n1939,10318\n1939,14056\n1939,15470\n1939,17214\n1939,17217\n1939,18194\n1939,18549\n1939,18665\n1939,20781\n1939,20899\n1939,21608\n1939,23630\n1939,24739\n1939,26194\n1939,28705\n1939,28746\n1939,30373\n1939,31358\n1939,32643\n1939,36241\n1939,41508\n1939,45261\n1939,50399\n1939,56435\n1939,60095\n1939,65391\n1939,65864\n1939,70900\n1939,71025\n1939,74387\n1939,78772\n1939,88690\n1939,90799\n1939,94355\n1939,97324\n1939,97365\n1939,97441\n1939,98356\n1939,117741\n1939,123547\n1939,124850\n1939,129539\n1939,163183\n1939,164945\n1939,167537\n1939,168909\n1939,177069\n1939,183902\n1939,189590\n1939,190276\n1939,191858\n1939,255255\n1940,336\n1940,422\n1940,1163\n1940,1803\n1940,21442\n1941,104\n1941,136\n1941,254\n1941,557\n1941,596\n1941,685\n1941,715\n1941,749\n1941,784\n1941,943\n1941,953\n1941,1209\n1941,1367\n1941,1368\n1941,1980\n1941,2543\n1941,2565\n1941,2617\n1941,3504\n1941,4276\n1941,4725\n1941,4761\n1941,5279\n1941,5478\n1941,6732\n1941,13207\n1941,13626\n1941,14827\n1941,16552\n1941,19489\n1941,20515\n1941,26262\n1941,26703\n1941,33345\n1941,33525\n1941,40220\n1941,42092\n1941,42918\n1941,54271\n1941,56303\n1941,56328\n1942,1001\n1944,87\n1944,1046\n1944,1143\n1944,1363\n1944,1836\n1945,818\n1945,1946\n1947,1388\n1947,1531\n1948,292\n1949,32\n1949,175\n1949,392\n1949,808\n1949,809\n1949,903\n1949,918\n1949,997\n1949,1146\n1949,1240\n1949,1300\n1949,1454\n1949,1465\n1949,1663\n1949,1805\n1949,1949\n1949,2494\n1949,2548\n1949,3258\n1949,3630\n1949,3788\n1949,3880\n1949,4759\n1949,6045\n1949,6059\n1949,6711\n1949,7098\n1949,13137\n1949,14290\n1949,17894\n1949,19366\n1949,21982\n1949,28256\n1949,29095\n1949,31414\n1949,40697\n1949,61148\n1949,84133\n1949,86512\n1949,104537\n1949,104542\n1949,111131\n1949,130297\n1949,160892\n1949,212958\n1949,216781\n1949,219851\n1949,226835\n1949,227227\n1949,228597\n1949,228613\n1949,232250\n1949,242266\n1949,254443\n1949,261806\n1950,483\n1951,264\n1951,1147\n1951,1968\n1951,16687\n1952,195\n1953,178\n1954,852\n1954,1955\n1955,10\n1955,104\n1955,111\n1955,186\n1955,192\n1955,240\n1955,261\n1955,289\n1955,290\n1955,298\n1955,332\n1955,372\n1955,390\n1955,425\n1955,431\n1955,446\n1955,452\n1955,457\n1955,518\n1955,599\n1955,611\n1955,631\n1955,677\n1955,693\n1955,694\n1955,714\n1955,715\n1955,761\n1955,784\n1955,795\n1955,818\n1955,823\n1955,838\n1955,852\n1955,911\n1955,932\n1955,1004\n1955,1010\n1955,1011\n1955,1029\n1955,1065\n1955,1082\n1955,1085\n1955,1118\n1955,1119\n1955,1130\n1955,1203\n1955,1210\n1955,1285\n1955,1309\n1955,1326\n1955,1332\n1955,1359\n1955,1361\n1955,1434\n1955,1466\n1955,1715\n1955,1796\n1955,1807\n1955,1849\n1955,1888\n1955,1954\n1955,1955\n1955,2208\n1955,2443\n1955,2512\n1955,2560\n1955,2620\n1955,2729\n1955,2775\n1955,2838\n1955,2989\n1955,2991\n1955,3028\n1955,3135\n1955,3168\n1955,3507\n1955,3607\n1955,3771\n1955,3814\n1955,3837\n1955,3879\n1955,4190\n1955,4195\n1955,4415\n1955,4540\n1955,4621\n1955,4692\n1955,5011\n1955,5185\n1955,5192\n1955,5268\n1955,5278\n1955,5346\n1955,5407\n1955,5503\n1955,5656\n1955,5718\n1955,5825\n1955,6537\n1955,6837\n1955,6856\n1955,7266\n1955,7522\n1955,7915\n1955,8422\n1955,8683\n1955,8778\n1955,12747\n1955,12871\n1955,13198\n1955,13207\n1955,13217\n1955,13274\n1955,13411\n1955,13521\n1955,13555\n1955,13580\n1955,13698\n1955,14133\n1955,14553\n1955,14597\n1955,14603\n1955,16335\n1955,16401\n1955,16430\n1955,16551\n1955,16571\n1955,17920\n1955,18647\n1955,18673\n1955,18782\n1955,19387\n1955,19431\n1955,19440\n1955,19622\n1955,20426\n1955,20609\n1955,21593\n1955,21964\n1955,22331\n1955,22337\n1955,23102\n1955,23474\n1955,23735\n1955,23820\n1955,24766\n1955,26513\n1955,26848\n1955,26855\n1955,26880\n1955,27041\n1955,28191\n1955,28221\n1955,29089\n1955,29684\n1955,29965\n1955,30376\n1955,31413\n1955,31995\n1955,32900\n1955,32921\n1955,33003\n1955,33147\n1955,33330\n1955,33412\n1955,33660\n1955,34752\n1955,35428\n1955,36666\n1955,36719\n1955,38300\n1955,38910\n1955,39595\n1955,40876\n1955,41012\n1955,41871\n1955,42545\n1955,42794\n1955,42795\n1955,43343\n1955,43394\n1955,43630\n1955,44182\n1955,44237\n1955,44314\n1955,44393\n1955,44395\n1955,44870\n1955,44951\n1955,45278\n1955,46271\n1955,46316\n1955,46375\n1955,46821\n1955,46874\n1955,47173\n1955,47643\n1955,48369\n1955,48503\n1955,48965\n1955,49035\n1955,49297\n1955,49456\n1955,50104\n1955,52585\n1955,53421\n1955,56537\n1955,56636\n1955,57205\n1955,58414\n1955,59043\n1955,60432\n1955,60897\n1955,61356\n1955,62983\n1955,63054\n1955,63965\n1955,64130\n1955,66500\n1955,66736\n1955,66918\n1955,71048\n1955,74564\n1955,74576\n1955,75264\n1955,76022\n1955,79869\n1955,82564\n1955,83306\n1955,83379\n1955,83498\n1955,85813\n1955,86050\n1955,86626\n1955,87383\n1955,87986\n1955,88505\n1955,91311\n1955,91450\n1955,94134\n1955,97766\n1955,98917\n1955,99012\n1955,101551\n1955,102698\n1955,103755\n1955,104389\n1955,105586\n1955,106374\n1955,106408\n1955,106492\n1955,107157\n1955,107464\n1955,110763\n1955,113550\n1955,114675\n1955,115251\n1955,116014\n1955,116037\n1955,117003\n1955,117860\n1955,121664\n1955,124102\n1955,125604\n1955,126952\n1955,127158\n1955,130465\n1955,133463\n1955,133606\n1955,136414\n1955,137104\n1955,141133\n1955,141597\n1955,141613\n1955,142123\n1955,142606\n1955,144209\n1955,145086\n1955,145639\n1955,148607\n1955,150770\n1955,158707\n1955,160450\n1955,161586\n1955,161928\n1955,163805\n1955,163808\n1955,163830\n1955,163898\n1955,164417\n1955,165077\n1955,166331\n1955,166667\n1955,169431\n1955,170728\n1955,170841\n1955,170907\n1955,171571\n1955,173905\n1955,174910\n1955,175903\n1955,176758\n1955,177475\n1955,177827\n1955,180223\n1955,182387\n1955,182628\n1955,183436\n1955,183963\n1955,188890\n1955,188911\n1955,189820\n1955,191975\n1955,192616\n1955,197671\n1955,214643\n1955,215874\n1955,216860\n1955,218778\n1955,219981\n1955,222539\n1955,222544\n1955,222549\n1955,222551\n1955,225600\n1955,229159\n1955,229345\n1955,234146\n1955,235925\n1955,241335\n1955,241603\n1955,252110\n1955,254441\n1955,256331\n1955,258749\n1956,1454\n1957,1284\n1957,1715\n1958,3\n1958,54\n1958,140\n1958,206\n1958,718\n1958,1033\n1958,1871\n1958,1959\n1958,1963\n1958,2434\n1958,3209\n1958,55849\n1958,142433\n1960,1172\n1962,24\n1962,41\n1962,233\n1962,289\n1962,290\n1962,304\n1962,534\n1962,636\n1962,714\n1962,715\n1962,797\n1962,1402\n1962,1511\n1962,1663\n1962,1962\n1962,2008\n1962,2205\n1962,2206\n1962,2210\n1962,2286\n1962,2315\n1962,2376\n1962,2419\n1962,2965\n1962,3069\n1962,3085\n1962,3993\n1962,4084\n1962,4141\n1962,4218\n1962,4237\n1962,9015\n1962,14693\n1962,15107\n1962,18515\n1962,18673\n1962,21321\n1962,26513\n1962,27321\n1962,28553\n1962,33160\n1962,33424\n1962,34828\n1962,34874\n1962,37816\n1962,39088\n1962,39660\n1962,39669\n1962,45648\n1962,53192\n1962,55146\n1962,55814\n1962,55951\n1962,56709\n1962,57148\n1962,58460\n1962,60804\n1962,61949\n1962,62248\n1962,63604\n1962,65711\n1962,69787\n1962,70305\n1962,71999\n1962,72907\n1962,74148\n1962,78405\n1962,78867\n1962,78891\n1962,82464\n1962,84264\n1962,88820\n1962,91585\n1962,94134\n1962,98284\n1962,102250\n1962,105163\n1962,110093\n1962,110509\n1962,110541\n1962,111142\n1962,116043\n1962,119649\n1962,127029\n1962,129722\n1962,131729\n1962,136607\n1962,137099\n1962,137201\n1962,142333\n1962,142620\n1962,143395\n1962,144988\n1962,145398\n1962,158292\n1962,158638\n1962,160450\n1962,162573\n1962,162902\n1962,178391\n1962,180270\n1962,184490\n1962,197473\n1962,201884\n1962,201960\n1962,207443\n1962,219920\n1962,219936\n1962,223998\n1962,226470\n1962,233982\n1962,246828\n1962,248927\n1963,57875\n1964,1821\n1965,1010\n1966,1\n1967,1707\n1968,452\n1968,457\n1968,673\n1968,794\n1968,1011\n1968,1130\n1968,1417\n1968,1572\n1968,1619\n1968,1634\n1968,1844\n1968,1968\n1968,3367\n1968,3582\n1968,4039\n1968,6695\n1969,1\n1969,56\n1969,94\n1969,146\n1969,192\n1969,333\n1969,336\n1969,779\n1969,841\n1969,1803\n1969,1969\n1969,1970\n1969,1994\n1969,2166\n1969,2217\n1969,12263\n1969,13187\n1969,13221\n1969,14091\n1969,15437\n1969,16493\n1969,17139\n1969,18637\n1969,18761\n1969,19430\n1969,21382\n1969,23031\n1969,23783\n1969,25467\n1969,26730\n1969,28171\n1969,28195\n1969,28350\n1969,29895\n1969,36674\n1969,38177\n1969,41153\n1969,41366\n1969,46144\n1969,60576\n1969,62226\n1969,69932\n1969,82627\n1969,91355\n1969,117726\n1969,244750\n1971,781\n1972,1973\n1973,3\n1973,20\n1973,34\n1973,35\n1973,37\n1973,68\n1973,87\n1973,99\n1973,135\n1973,138\n1973,158\n1973,160\n1973,167\n1973,192\n1973,195\n1973,202\n1973,203\n1973,207\n1973,215\n1973,289\n1973,290\n1973,326\n1973,328\n1973,333\n1973,358\n1973,379\n1973,390\n1973,392\n1973,406\n1973,425\n1973,462\n1973,502\n1973,510\n1973,518\n1973,575\n1973,590\n1973,596\n1973,736\n1973,760\n1973,765\n1973,779\n1973,788\n1973,795\n1973,808\n1973,818\n1973,849\n1973,862\n1973,907\n1973,920\n1973,934\n1973,968\n1973,992\n1973,1010\n1973,1140\n1973,1147\n1973,1192\n1973,1201\n1973,1220\n1973,1222\n1973,1240\n1973,1241\n1973,1285\n1973,1298\n1973,1326\n1973,1345\n1973,1368\n1973,1402\n1973,1445\n1973,1479\n1973,1505\n1973,1551\n1973,1566\n1973,1590\n1973,1608\n1973,1635\n1973,1677\n1973,1786\n1973,1891\n1973,1927\n1973,1972\n1973,1973\n1973,1992\n1973,2037\n1973,2083\n1973,2178\n1973,2436\n1973,2443\n1973,2557\n1973,2726\n1973,2744\n1973,3260\n1973,3474\n1973,3507\n1973,3565\n1973,3944\n1973,4276\n1973,4354\n1973,5265\n1973,5961\n1973,9030\n1973,9457\n1973,11147\n1973,13151\n1973,13440\n1973,13451\n1973,14109\n1973,15344\n1973,18327\n1973,18344\n1973,21693\n1973,22045\n1973,28142\n1973,28291\n1973,30770\n1973,31419\n1973,34320\n1973,35402\n1973,39570\n1973,40441\n1973,40498\n1973,41230\n1973,44221\n1973,45853\n1973,54004\n1973,56150\n1973,60576\n1973,62457\n1973,66343\n1973,75091\n1973,77671\n1973,77717\n1973,114188\n1973,115474\n1973,122692\n1973,136165\n1973,158762\n1973,170626\n1973,171178\n1973,172555\n1973,189839\n1973,189842\n1973,205673\n1973,215276\n1973,234357\n1973,256409\n1973,256827\n1974,450\n1975,740\n1975,741\n1976,1977\n1976,1978\n1978,3538\n1979,1359\n1980,134\n1980,225\n1980,1368\n1981,149\n1981,622\n1981,1803\n1982,666\n1982,1983\n1982,1984\n1983,4\n1983,5\n1983,1219\n1983,1702\n1983,1983\n1983,4388\n1983,5695\n1983,5820\n1983,5842\n1983,5861\n1983,5895\n1983,5979\n1983,6120\n1983,6142\n1983,7385\n1983,7388\n1983,9197\n1983,20320\n1983,20419\n1983,23860\n1983,24746\n1983,24854\n1983,29015\n1983,32340\n1983,33292\n1983,36507\n1983,38857\n1983,39538\n1983,40292\n1983,44207\n1983,53859\n1983,56112\n1983,56326\n1983,58922\n1983,58963\n1983,59898\n1983,74850\n1983,76235\n1983,76320\n1983,76869\n1983,84828\n1983,87830\n1983,107801\n1983,109097\n1983,116535\n1983,124952\n1983,127154\n1983,134425\n1983,138245\n1983,138757\n1983,141722\n1983,147086\n1983,151524\n1983,151533\n1983,155899\n1983,159955\n1983,159958\n1983,159967\n1983,159972\n1983,159979\n1983,159981\n1983,160069\n1983,160070\n1983,162018\n1983,167454\n1983,169377\n1983,170289\n1983,170615\n1983,175043\n1983,175619\n1983,175905\n1983,182213\n1983,196146\n1983,199055\n1983,202732\n1983,206955\n1983,211813\n1983,217267\n1983,220500\n1983,223372\n1983,225866\n1983,225889\n1983,235348\n1983,236211\n1983,242502\n1983,244450\n1983,246042\n1983,246225\n1983,247782\n1983,248048\n1983,248062\n1983,248981\n1983,255186\n1985,10\n1985,106\n1985,186\n1985,333\n1985,337\n1985,446\n1985,505\n1985,586\n1985,604\n1985,663\n1985,664\n1985,682\n1985,685\n1985,812\n1985,818\n1985,911\n1985,932\n1985,937\n1985,1011\n1985,1027\n1985,1242\n1985,1281\n1985,1293\n1985,1370\n1985,1504\n1985,1848\n1985,1849\n1985,1985\n1985,2782\n1985,5630\n1985,7794\n1985,13506\n1985,14066\n1985,14100\n1985,19486\n1985,21528\n1985,31046\n1985,31198\n1985,31254\n1985,35084\n1985,44459\n1985,48053\n1985,59616\n1985,60576\n1985,60701\n1985,67918\n1985,72068\n1985,72439\n1985,74777\n1985,83905\n1985,100237\n1985,104268\n1985,109922\n1985,110546\n1985,116938\n1985,119418\n1985,127158\n1985,127740\n1985,134764\n1985,152984\n1985,172381\n1985,174800\n1985,180916\n1985,191414\n1985,213749\n1985,249720\n1986,415\n1986,801\n1986,849\n1986,852\n1986,1240\n1986,1326\n1986,1353\n1986,1411\n1986,1454\n1986,1805\n1986,5961\n1987,538\n1987,1381\n1987,1877\n1987,40497\n1988,1001\n1989,314\n1989,599\n1989,668\n1989,1172\n1989,1844\n1989,2373\n1989,3744\n1989,221334\n1990,1068\n1991,1298\n1992,11\n1992,147\n1992,182\n1992,186\n1992,192\n1992,207\n1992,256\n1992,301\n1992,314\n1992,336\n1992,392\n1992,397\n1992,440\n1992,452\n1992,457\n1992,505\n1992,510\n1992,599\n1992,673\n1992,676\n1992,685\n1992,794\n1992,838\n1992,843\n1992,849\n1992,852\n1992,911\n1992,929\n1992,972\n1992,1011\n1992,1014\n1992,1085\n1992,1130\n1992,1172\n1992,1191\n1992,1262\n1992,1345\n1992,1370\n1992,1417\n1992,1531\n1992,1566\n1992,1619\n1992,1634\n1992,1796\n1992,1844\n1992,1973\n1992,2253\n1992,2580\n1992,3582\n1992,4190\n1992,6824\n1992,6904\n1992,9457\n1992,19413\n1992,20757\n1992,30331\n1992,75912\n1992,207659\n1992,215874\n1993,149\n1993,192\n1993,333\n1993,336\n1993,602\n1993,663\n1993,664\n1993,726\n1993,788\n1993,841\n1993,1052\n1993,1089\n1993,1411\n1993,1619\n1993,1623\n1993,2006\n1993,2244\n1993,3895\n1993,5130\n1993,7757\n1993,22317\n1994,60576\n1995,222\n1995,278\n1995,1181\n1995,1388\n1995,2244\n1996,34\n1996,35\n1996,217\n1996,949\n1996,2646\n1996,127158\n1997,217\n1997,1417\n1997,2671\n1997,3252\n1998,389\n1998,772\n1998,818\n1998,841\n1998,843\n1998,1458\n1998,1849\n1999,784\n1999,1707\n2000,83\n2000,356\n2001,182\n2002,261\n2002,818\n2002,843\n2002,991\n2002,1458\n2002,1818\n2002,2646\n2002,3115\n2002,19010\n2002,67873\n2002,68259\n2002,82976\n2002,84341\n2002,91133\n2002,91338\n2002,111031\n2002,111855\n2002,119753\n2002,121235\n2002,126444\n2003,1608\n2005,2006\n2006,446\n2006,685\n2006,1011\n2006,1411\n2006,2315\n2006,5388\n2006,5851\n2006,5884\n2006,7109\n2006,8525\n2006,13605\n2006,23329\n2006,23809\n2006,24886\n2006,24906\n2006,29404\n2006,58984\n2006,59151\n2006,64257\n2006,108282\n2007,390\n2007,459\n2007,615\n2007,744\n2007,783\n2007,907\n2007,968\n2007,1010\n2007,1012\n2007,1160\n2007,1167\n2007,1300\n2007,1436\n2007,1479\n2007,1849\n2007,2191\n2007,2480\n2007,3422\n2007,3630\n2007,32784\n2007,48505\n2007,72764\n2008,104\n2008,289\n2008,290\n2008,328\n2008,372\n2008,373\n2008,417\n2008,534\n2008,572\n2008,588\n2008,590\n2008,599\n2008,631\n2008,677\n2008,704\n2008,714\n2008,715\n2008,760\n2008,1212\n2008,1282\n2008,1346\n2008,1402\n2008,1462\n2008,1572\n2008,1631\n2008,1641\n2008,1962\n2008,2008\n2008,2069\n2008,2205\n2008,2206\n2008,2286\n2008,2965\n2008,3507\n2008,4520\n2008,6447\n2008,8279\n2008,8867\n2008,13506\n2008,14080\n2008,14582\n2008,15103\n2008,15520\n2008,16192\n2008,16210\n2008,19566\n2008,20869\n2008,21187\n2008,24546\n2008,26396\n2008,27088\n2008,28191\n2008,28877\n2008,30707\n2008,33424\n2008,34707\n2008,35614\n2008,37444\n2008,37485\n2008,40644\n2008,48709\n2008,49035\n2008,59194\n2008,61004\n2008,62248\n2008,63361\n2008,67210\n2008,72639\n2008,75754\n2008,80049\n2008,80387\n2008,94134\n2008,96712\n2008,102664\n2008,106331\n2008,111142\n2008,134620\n2008,140827\n2008,141836\n2008,141971\n2008,144988\n2008,160450\n2008,166287\n2008,167749\n2008,168587\n2008,207051\n2008,220939\n2008,238354\n2008,256953\n2008,257051\n2008,258382\n2009,143\n2010,1749\n2011,298\n2012,72\n2012,312\n2012,1052\n2012,1267\n2012,2605\n2012,3695\n2013,485\n2014,1\n2014,50\n2014,333\n2014,336\n2014,733\n2014,788\n2014,841\n2014,1192\n2014,1619\n2015,294\n2015,431\n2015,631\n2016,22\n2016,302\n2016,622\n2016,809\n2016,861\n2016,2017\n2016,2312\n2016,17309\n2016,22293\n2017,255\n2017,819\n2017,2017\n2017,2563\n2017,15556\n2017,20779\n2017,40824\n2017,66301\n2018,107\n2018,111\n2018,760\n2018,1149\n2019,875\n2019,1276\n2019,2744\n2019,4411\n2020,1\n2021,1118\n2022,336\n2023,393\n2023,435\n2023,447\n2023,726\n2023,980\n2023,1033\n2024,1105\n2025,305\n2026,130\n2027,233\n2028,509\n2028,510\n2029,202\n2029,269\n2029,294\n2029,309\n2029,310\n2029,389\n2029,424\n2029,640\n2029,772\n2029,818\n2029,843\n2029,1085\n2029,1415\n2029,1544\n2029,1801\n2029,1849\n2029,2411\n2029,2744\n2029,7155\n2030,346\n2030,726\n2030,1068\n2030,1294\n2030,1644\n2030,1849\n2030,1888\n2030,2353\n2030,13486\n2030,189128\n2031,143\n2032,56\n2032,147\n2032,192\n2032,422\n2032,60576\n2034,1175\n2034,1243\n2034,72439\n2034,189839\n2036,68\n2036,186\n2036,450\n2036,7155\n2037,1\n2037,192\n2037,314\n2037,422\n2037,457\n2037,516\n2037,599\n2037,808\n2037,1014\n2037,1118\n2037,1509\n2037,1531\n2037,1566\n2037,1796\n2037,1844\n2037,1973\n2037,6904\n2037,42064\n2038,1078\n2038,1616\n2039,364\n2042,312\n2042,2944\n2043,818\n2044,68\n2045,3\n2045,388\n2045,510\n2045,623\n2045,654\n2045,663\n2045,664\n2045,685\n2045,694\n2045,838\n2045,911\n2045,1133\n2045,1345\n2045,1424\n2045,1566\n2045,1805\n2045,2045\n2045,2046\n2045,4752\n2045,6641\n2045,6960\n2045,7753\n2045,8177\n2045,13506\n2045,14494\n2045,15116\n2045,16192\n2045,20228\n2045,21328\n2045,22095\n2045,30115\n2045,32309\n2045,34416\n2045,35704\n2045,42871\n2045,43325\n2045,47006\n2045,47759\n2045,49452\n2045,49491\n2045,49978\n2045,50105\n2045,55945\n2045,58381\n2045,61212\n2045,63601\n2045,70702\n2045,81193\n2045,109561\n2045,112814\n2045,119320\n2045,128704\n2045,128956\n2045,160490\n2045,169817\n2045,183853\n2045,189834\n2045,190402\n2045,190435\n2045,201298\n2045,213886\n2045,234149\n2045,241142\n2045,241689\n2045,248442\n2045,258145\n2046,34\n2046,35\n2046,510\n2046,1571\n2046,2045\n2046,4223\n2047,182\n2047,2048\n2048,139116\n2048,139117\n2049,577\n2050,2051\n2050,49057\n2051,87\n2051,2292\n2052,104\n2052,215\n2052,1282\n2053,287\n2053,953\n2055,143\n2056,980\n2058,1\n2059,399\n2060,50\n2060,79\n2061,54\n2061,83\n2061,140\n2061,752\n2061,919\n2061,1287\n2061,1309\n2061,1479\n2061,1871\n2061,2424\n2062,1\n2062,32\n2062,50\n2062,79\n2062,147\n2062,160\n2062,392\n2062,424\n2062,577\n2062,602\n2062,644\n2062,697\n2062,809\n2062,985\n2062,1363\n2062,1619\n2062,1858\n2062,2274\n2062,2699\n2062,76096\n2063,720\n2063,877\n2063,972\n2063,1010\n2063,1284\n2064,66\n2064,3744\n2065,760\n2065,805\n2065,1631\n2066,781\n2067,158\n2067,406\n2068,749\n2069,104\n2069,134\n2069,240\n2069,248\n2069,264\n2069,289\n2069,290\n2069,298\n2069,457\n2069,489\n2069,631\n2069,636\n2069,714\n2069,760\n2069,794\n2069,1014\n2069,1016\n2069,1119\n2069,1282\n2069,1417\n2069,1631\n2069,1745\n2069,1955\n2069,2209\n2069,2373\n2069,75912\n2069,94134\n2070,392\n2070,1151\n2071,147\n2071,195\n2072,2073\n2074,392\n2074,1454\n2074,1572\n2075,63\n2075,602\n2076,305\n2077,106\n2077,337\n2078,209\n2079,850\n2081,985\n2082,4\n2082,5\n2083,10\n2083,86\n2083,167\n2083,240\n2083,299\n2083,301\n2083,314\n2083,431\n2083,459\n2083,468\n2083,500\n2083,528\n2083,589\n2083,599\n2083,808\n2083,929\n2083,1014\n2083,1045\n2083,1085\n2083,1118\n2083,1167\n2083,1241\n2083,1284\n2083,1285\n2083,1298\n2083,1319\n2083,1436\n2083,1522\n2083,1544\n2083,1564\n2083,1627\n2083,1635\n2083,1715\n2083,1837\n2083,1849\n2083,1973\n2083,2083\n2083,2085\n2083,2095\n2083,2193\n2083,2372\n2083,2557\n2083,2588\n2083,2979\n2083,3207\n2083,3218\n2083,3774\n2083,3944\n2083,4271\n2083,4283\n2083,4291\n2083,5185\n2083,5301\n2083,6712\n2083,6930\n2083,6989\n2083,7011\n2083,7057\n2083,8386\n2083,13470\n2083,13480\n2083,13489\n2083,13657\n2083,14264\n2083,16484\n2083,16594\n2083,16667\n2083,16965\n2083,17327\n2083,17636\n2083,18249\n2083,18668\n2083,18724\n2083,20289\n2083,20628\n2083,22062\n2083,22116\n2083,22157\n2083,23069\n2083,24627\n2083,26078\n2083,27053\n2083,27095\n2083,28785\n2083,29760\n2083,30253\n2083,31419\n2083,32784\n2083,33282\n2083,33527\n2083,34174\n2083,34820\n2083,38994\n2083,39618\n2083,41854\n2083,43235\n2083,43346\n2083,44105\n2083,44480\n2083,47051\n2083,50423\n2083,50525\n2083,50567\n2083,51889\n2083,55028\n2083,55878\n2083,62160\n2083,64070\n2083,66515\n2083,67074\n2083,73342\n2083,73355\n2083,73570\n2083,75794\n2083,77678\n2083,80615\n2083,86558\n2083,89837\n2083,92859\n2083,93835\n2083,94745\n2083,94978\n2083,100305\n2083,108543\n2083,109258\n2083,110118\n2083,115249\n2083,116178\n2083,116543\n2083,122159\n2083,122735\n2083,127158\n2083,127187\n2083,127224\n2083,127227\n2083,127588\n2083,128293\n2083,128922\n2083,130099\n2083,134179\n2083,134871\n2083,140687\n2083,142569\n2083,146438\n2083,146751\n2083,147179\n2083,147548\n2083,148320\n2083,150859\n2083,153233\n2083,157410\n2083,157443\n2083,157563\n2083,158669\n2083,158862\n2083,159888\n2083,160668\n2083,161915\n2083,163719\n2083,164276\n2083,166385\n2083,167497\n2083,169231\n2083,171578\n2083,171580\n2083,171583\n2083,172678\n2083,173927\n2083,174669\n2083,175940\n2083,177014\n2083,178012\n2083,178543\n2083,178659\n2083,178670\n2083,178695\n2083,178897\n2083,179030\n2083,179629\n2083,180265\n2083,180982\n2083,181530\n2083,183722\n2083,184373\n2083,184814\n2083,189281\n2083,190527\n2083,191073\n2083,191572\n2083,194967\n2083,195555\n2083,213319\n2083,214197\n2083,214981\n2083,217998\n2083,219854\n2083,221176\n2083,227286\n2083,232753\n2083,240769\n2083,245848\n2083,249357\n2084,392\n2085,203\n2085,292\n2085,315\n2085,333\n2085,358\n2085,435\n2085,439\n2085,440\n2085,447\n2085,538\n2085,579\n2085,589\n2085,710\n2085,794\n2085,1118\n2085,1294\n2085,1888\n2085,2083\n2085,2373\n2085,2572\n2085,3422\n2085,3582\n2085,3876\n2085,4823\n2085,5662\n2085,6298\n2085,35486\n2086,4\n2086,5\n2086,25\n2086,26\n2086,47\n2086,59\n2086,116\n2086,117\n2086,171\n2086,250\n2086,330\n2086,430\n2086,743\n2086,885\n2086,1432\n2086,1684\n2086,2087\n2086,2088\n2086,2089\n2086,2469\n2086,3794\n2086,5871\n2086,9536\n2086,9538\n2086,13704\n2086,21059\n2086,21944\n2086,54870\n2086,67397\n2086,71961\n2086,136284\n2086,136285\n2089,25\n2089,26\n2089,59\n2089,292\n2089,885\n2089,887\n2089,1227\n2089,1229\n2089,1238\n2089,1432\n2089,1775\n2089,2088\n2089,2089\n2089,2674\n2089,2940\n2089,4113\n2089,4748\n2089,6621\n2089,17140\n2089,21944\n2089,47540\n2089,48673\n2090,209\n2090,736\n2090,1655\n2090,1659\n2091,206\n2092,222\n2092,657\n2092,805\n2092,1019\n2092,1276\n2092,1571\n2092,2266\n2092,2480\n2092,6424\n2093,620\n2094,346\n2094,435\n2094,447\n2094,538\n2094,980\n2094,1068\n2094,1294\n2094,1474\n2094,4611\n2095,136\n2095,137\n2095,1522\n2095,2083\n2095,2557\n2096,202\n2096,203\n2096,269\n2096,389\n2096,640\n2096,657\n2096,841\n2096,843\n2096,1458\n2096,1544\n2096,1849\n2096,2411\n2096,6955\n2097,417\n2097,442\n2097,1001\n2097,1119\n2098,920\n2099,1531\n2100,1392\n2101,158\n2102,178\n2102,346\n2102,435\n2102,439\n2102,447\n2102,1033\n2102,1803\n2102,1849\n2102,1877\n2102,13486\n2102,21442\n2102,32784\n2103,222\n2104,493\n2105,19\n2105,30\n2105,81\n2105,104\n2105,134\n2105,135\n2105,136\n2105,137\n2105,138\n2105,248\n2105,328\n2105,446\n2105,557\n2105,636\n2105,772\n2105,784\n2105,943\n2105,997\n2105,1011\n2105,1078\n2105,1118\n2105,1212\n2105,1282\n2105,1293\n2105,1332\n2105,1368\n2105,1415\n2105,1844\n2105,1882\n2105,1939\n2105,2105\n2105,2205\n2105,2206\n2105,2384\n2105,2572\n2105,2638\n2105,2675\n2105,2804\n2105,3246\n2105,3247\n2105,3678\n2105,3794\n2105,4086\n2105,4208\n2105,4218\n2105,4222\n2105,4276\n2105,4919\n2105,5405\n2105,5694\n2105,5703\n2105,6152\n2105,6455\n2105,7178\n2105,7879\n2105,7938\n2105,8049\n2105,8180\n2105,13246\n2105,13928\n2105,13969\n2105,14150\n2105,14164\n2105,14177\n2105,14402\n2105,15459\n2105,15470\n2105,16235\n2105,16717\n2105,16966\n2105,19523\n2105,19643\n2105,20164\n2105,21101\n2105,21867\n2105,22268\n2105,26266\n2105,26729\n2105,27861\n2105,27862\n2105,28042\n2105,29572\n2105,29729\n2105,31093\n2105,31963\n2105,32522\n2105,33424\n2105,33491\n2105,36250\n2105,36618\n2105,37329\n2105,38410\n2105,38795\n2105,39302\n2105,40641\n2105,40742\n2105,40774\n2105,41507\n2105,42848\n2105,43134\n2105,43262\n2105,43918\n2105,45426\n2105,46766\n2105,46874\n2105,48188\n2105,49353\n2105,53404\n2105,53604\n2105,54288\n2105,57825\n2105,59596\n2105,60387\n2105,61101\n2105,62192\n2105,63521\n2105,64996\n2105,65864\n2105,67812\n2105,71770\n2105,72021\n2105,74547\n2105,76044\n2105,77793\n2105,78772\n2105,80080\n2105,80603\n2105,80760\n2105,81452\n2105,82875\n2105,89710\n2105,89715\n2105,90337\n2105,90829\n2105,91206\n2105,93110\n2105,94074\n2105,101440\n2105,101639\n2105,109339\n2105,113735\n2105,116041\n2105,121076\n2105,123899\n2105,123959\n2105,126030\n2105,126537\n2105,127602\n2105,128166\n2105,128906\n2105,137881\n2105,139464\n2105,140687\n2105,140798\n2105,145092\n2105,146487\n2105,147433\n2105,149683\n2105,150312\n2105,152040\n2105,152138\n2105,153336\n2105,155460\n2105,155667\n2105,156265\n2105,157213\n2105,157332\n2105,157803\n2105,160784\n2105,160971\n2105,163737\n2105,170237\n2105,172669\n2105,172676\n2105,172894\n2105,173214\n2105,174032\n2105,174313\n2105,174393\n2105,188225\n2105,188454\n2105,191219\n2105,191229\n2105,194245\n2105,196008\n2105,196067\n2105,198217\n2105,200595\n2105,200603\n2105,202092\n2105,202147\n2105,203406\n2105,203654\n2105,214180\n2105,214320\n2105,222464\n2105,223722\n2105,225292\n2105,225293\n2105,225549\n2105,228831\n2105,229709\n2105,231060\n2105,237818\n2105,246117\n2105,251033\n2105,256878\n2105,258878\n2105,259507\n2105,259510\n2105,259511\n2105,260164\n2105,260679\n2105,263323\n2105,264494\n2106,393\n2106,406\n2106,435\n2106,455\n2106,538\n2106,788\n2106,859\n2106,920\n2106,980\n2106,1531\n2106,4611\n2107,726\n2108,1655\n2109,583\n2110,577\n2111,392\n2111,644\n2111,697\n2111,1117\n2112,1566\n2113,63\n2114,79\n2114,130\n2115,2116\n2117,417\n2118,81\n2119,622\n2119,1179\n2119,1531\n2120,336\n2120,1163\n2121,160\n2122,1821\n2122,21736\n2123,1572\n2124,87\n2124,338\n2124,392\n2124,510\n2124,1151\n2124,1453\n2124,1572\n2124,1722\n2124,1836\n2124,1860\n2125,22\n2125,202\n2125,203\n2125,251\n2125,310\n2125,336\n2125,467\n2125,868\n2125,2371\n2127,167\n2127,3218\n2128,1983\n2129,340\n2129,809\n2130,415\n2130,996\n2131,1058\n2132,1\n2132,79\n2132,147\n2132,158\n2132,192\n2132,206\n2132,333\n2132,406\n2132,422\n2132,602\n2132,779\n2132,1181\n2132,1425\n2132,1515\n2132,2244\n2132,18638\n2132,68069\n2132,142879\n2132,240174\n2133,389\n2133,1072\n2134,2135\n2135,16503\n2135,19948\n2135,19949\n2135,19950\n2135,19951\n2135,20648\n2135,24465\n2135,25050\n2135,28294\n2135,47762\n2135,47763\n2135,47764\n2135,47765\n2135,60058\n2135,68086\n2135,79030\n2135,80346\n2135,109630\n2135,117363\n2135,120658\n2135,120672\n2135,125202\n2135,160907\n2135,162167\n2135,162169\n2135,162171\n2135,170304\n2135,188322\n2135,198641\n2135,228638\n2135,229329\n2135,230022\n2135,235644\n2135,236127\n2135,251627\n2135,256978\n2136,1858\n2137,1860\n2138,346\n2138,1474\n2138,1590\n2138,1644\n2138,2353\n2138,6661\n2139,195\n2140,433\n2140,758\n2140,920\n2140,1177\n2140,1634\n2140,8270\n2140,182162\n2141,397\n2143,143\n2143,1052\n2143,1191\n2143,3182\n2143,189266\n2144,850\n2145,10\n2145,2146\n2146,2146\n2147,48\n2147,647\n2147,1509\n2147,1551\n2147,1893\n2147,3041\n2147,49057\n2148,783\n2149,1425\n2150,509\n2150,510\n2151,718\n2152,202\n2152,203\n2152,254\n2152,346\n2152,439\n2152,1007\n2152,1612\n2153,388\n2153,6638\n2154,493\n2154,1411\n2155,557\n2155,1363\n2156,28\n2156,40\n2156,137\n2156,2157\n2156,5627\n2156,5819\n2156,9342\n2156,9516\n2156,16709\n2156,19466\n2156,28474\n2156,33029\n2156,33160\n2156,34060\n2156,57910\n2156,73745\n2156,78972\n2156,83496\n2156,109499\n2156,118034\n2156,123175\n2156,160836\n2156,168165\n2156,170109\n2156,170483\n2156,248039\n2157,994\n2157,2156\n2157,2674\n2157,16153\n2158,968\n2160,34\n2160,399\n2160,477\n2160,1571\n2160,5034\n2160,5906\n2160,5933\n2160,17837\n2160,19809\n2160,29475\n2161,195\n2161,640\n2162,649\n2162,1132\n2163,58\n2163,292\n2163,745\n2163,1127\n2163,1140\n2163,1177\n2163,1677\n2163,3474\n2163,3830\n2164,68\n2167,1566\n2168,19\n2168,71\n2168,476\n2168,477\n2168,536\n2168,1618\n2168,1843\n2168,2159\n2168,2224\n2168,2553\n2168,2784\n2168,4030\n2168,4234\n2168,5034\n2168,5326\n2168,6064\n2168,6506\n2168,7698\n2168,7768\n2168,13461\n2168,18831\n2168,19443\n2168,23287\n2168,34757\n2168,39537\n2168,52378\n2168,63961\n2168,66703\n2168,81840\n2168,85919\n2168,90092\n2168,90297\n2168,90845\n2168,91398\n2168,102584\n2168,117817\n2168,121449\n2168,138016\n2168,143033\n2168,155029\n2168,161519\n2168,171354\n2168,176094\n2168,179394\n2168,179850\n2168,184041\n2168,198176\n2168,201364\n2168,215339\n2168,215391\n2168,216248\n2168,230233\n2169,106\n2170,192\n2171,167\n2171,720\n2171,1167\n2171,1436\n2171,1544\n2172,2173\n2173,163\n2173,167\n2173,192\n2173,283\n2173,327\n2173,352\n2173,397\n2173,406\n2173,440\n2173,493\n2173,631\n2173,1019\n2173,1085\n2173,1118\n2173,1140\n2173,1181\n2173,1191\n2173,1192\n2173,1204\n2173,1284\n2173,1370\n2173,1518\n2173,1531\n2173,1572\n2173,1796\n2173,1818\n2173,1825\n2173,1844\n2173,2172\n2173,2205\n2173,2206\n2173,3524\n2173,3528\n2173,3804\n2173,4165\n2173,4190\n2173,4377\n2173,4760\n2173,5061\n2173,5451\n2173,5702\n2173,6452\n2173,7124\n2173,15344\n2173,18298\n2173,20535\n2173,24779\n2173,25374\n2173,25491\n2173,28374\n2173,32752\n2173,33424\n2173,40644\n2173,41916\n2173,41995\n2173,58413\n2173,61231\n2173,76086\n2173,87844\n2173,88410\n2173,107919\n2173,112864\n2175,500\n2175,760\n2177,65\n2177,66\n2177,206\n2178,259\n2178,272\n2178,393\n2178,577\n2178,788\n2178,980\n2178,1381\n2178,1531\n2178,2178\n2178,4545\n2179,422\n2180,56\n2181,48\n2181,140\n2181,160\n2181,217\n2181,264\n2181,338\n2181,340\n2181,344\n2181,360\n2181,392\n2181,420\n2181,440\n2181,467\n2181,479\n2181,510\n2181,515\n2181,647\n2181,652\n2181,710\n2181,872\n2181,1052\n2181,1127\n2181,1140\n2181,1151\n2181,1224\n2181,1289\n2181,1551\n2181,1579\n2181,1659\n2181,1673\n2181,1722\n2181,1893\n2181,1968\n2181,2367\n2181,4039\n2182,22\n2182,326\n2182,752\n2182,1133\n2182,1151\n2182,5250\n2183,333\n2184,289\n2184,290\n2184,417\n2184,1085\n2184,2296\n2184,94134\n2185,660\n2186,83\n2186,1983\n2187,417\n2188,631\n2188,1119\n2189,1287\n2189,1289\n2190,861\n2190,2116\n2191,500\n2191,534\n2191,631\n2191,668\n2191,875\n2191,907\n2191,972\n2191,973\n2191,1010\n2191,1117\n2191,1122\n2191,1284\n2191,1298\n2191,1360\n2191,1424\n2191,1544\n2191,1740\n2191,1837\n2191,1849\n2191,1853\n2191,2007\n2191,2191\n2191,3367\n2191,3629\n2191,4696\n2191,7440\n2191,9702\n2191,13483\n2191,13706\n2191,14381\n2191,16634\n2191,21095\n2191,24107\n2191,26338\n2191,26397\n2191,29595\n2191,30549\n2191,31255\n2191,31766\n2191,31796\n2191,36720\n2191,36918\n2191,45590\n2191,45853\n2191,46995\n2191,51684\n2191,54642\n2191,57182\n2191,59335\n2191,59341\n2191,74355\n2191,75302\n2191,80777\n2191,87046\n2191,96685\n2191,119857\n2191,142487\n2191,142810\n2191,143285\n2191,147097\n2191,147925\n2191,148127\n2191,148742\n2191,154382\n2191,176410\n2191,178012\n2191,186772\n2191,191333\n2191,192982\n2191,195645\n2191,213009\n2191,235803\n2192,615\n2192,941\n2192,1167\n2193,167\n2193,233\n2193,372\n2193,589\n2193,714\n2193,783\n2193,907\n2193,1001\n2193,1010\n2193,1085\n2193,1210\n2193,1241\n2193,1284\n2193,2083\n2193,2266\n2193,2372\n2193,3218\n2193,3422\n2194,1453\n2194,3538\n2196,1858\n2197,1860\n2198,83\n2198,86\n2198,87\n2198,178\n2198,340\n2198,595\n2198,985\n2198,1313\n2198,53536\n2198,88084\n2198,90845\n2199,586\n2200,211\n2201,292\n2201,1238\n2201,1572\n2201,1653\n2201,1677\n2201,1722\n2201,3538\n2201,3830\n2201,196147\n2202,158\n2202,209\n2202,252\n2202,622\n2202,1433\n2202,1844\n2203,1707\n2204,1085\n2204,1432\n2204,2205\n2204,2206\n2204,4222\n2204,75912\n2204,136072\n2204,185877\n2204,221068\n2205,10\n2205,104\n2205,138\n2205,167\n2205,186\n2205,289\n2205,290\n2205,298\n2205,328\n2205,397\n2205,502\n2205,590\n2205,631\n2205,632\n2205,677\n2205,704\n2205,714\n2205,715\n2205,760\n2205,865\n2205,911\n2205,1016\n2205,1119\n2205,1192\n2205,1210\n2205,1282\n2205,1346\n2205,1402\n2205,1432\n2205,1462\n2205,1505\n2205,1745\n2205,1818\n2205,1962\n2205,2008\n2205,2105\n2205,2173\n2205,2205\n2205,2206\n2205,2237\n2205,2286\n2205,2315\n2205,2376\n2205,2918\n2205,3028\n2205,3507\n2205,3619\n2205,3675\n2205,4159\n2205,4218\n2205,4532\n2205,4540\n2205,5278\n2205,5935\n2205,6792\n2205,7072\n2205,7268\n2205,7880\n2205,8243\n2205,8821\n2205,9529\n2205,13433\n2205,13506\n2205,14156\n2205,14603\n2205,14630\n2205,15277\n2205,15413\n2205,15827\n2205,16526\n2205,16680\n2205,16709\n2205,17219\n2205,19278\n2205,19617\n2205,19888\n2205,21495\n2205,22098\n2205,22428\n2205,25339\n2205,25385\n2205,26228\n2205,26244\n2205,27887\n2205,29091\n2205,32810\n2205,33424\n2205,37100\n2205,39232\n2205,40220\n2205,40993\n2205,43394\n2205,43878\n2205,44382\n2205,53737\n2205,55163\n2205,59194\n2205,60612\n2205,60780\n2205,62303\n2205,62843\n2205,63076\n2205,63078\n2205,63361\n2205,63676\n2205,64653\n2205,64815\n2205,65681\n2205,65711\n2205,70195\n2205,79486\n2205,79839\n2205,81508\n2205,84577\n2205,84612\n2205,84727\n2205,88398\n2205,90301\n2205,94134\n2205,94152\n2205,106252\n2205,112247\n2205,112679\n2205,118839\n2205,119340\n2205,119391\n2205,121940\n2205,122177\n2205,123935\n2205,123952\n2205,124010\n2205,125658\n2205,126982\n2205,127378\n2205,127505\n2205,128161\n2205,128229\n2205,131371\n2205,136357\n2205,138262\n2205,139522\n2205,139593\n2205,140977\n2205,141179\n2205,142451\n2205,142772\n2205,143944\n2205,144003\n2205,148631\n2205,155467\n2205,156339\n2205,156435\n2205,157216\n2205,163888\n2205,165864\n2205,170914\n2205,172450\n2205,176725\n2205,176870\n2205,177906\n2205,178779\n2205,180251\n2205,182308\n2205,182967\n2205,202021\n2205,207079\n2205,207439\n2205,221234\n2205,221817\n2205,221849\n2205,232781\n2205,236242\n2205,240050\n2205,240526\n2207,278\n2208,104\n2208,134\n2208,240\n2208,372\n2208,442\n2208,714\n2208,862\n2208,1285\n2208,1309\n2208,2209\n2208,2286\n2208,2512\n2208,2989\n2208,2991\n2208,9025\n2208,66500\n2209,636\n2209,715\n2209,775\n2209,5286\n2209,8388\n2209,9739\n2209,18030\n2209,18819\n2209,26785\n2209,27513\n2209,75318\n2209,98959\n2210,4\n2210,5\n2210,81\n2210,104\n2210,135\n2210,215\n2210,328\n2210,704\n2210,805\n2210,1011\n2210,1016\n2210,1177\n2210,1282\n2210,1402\n2210,1882\n2210,1962\n2210,2210\n2210,4237\n2211,182\n2211,676\n2211,1789\n2211,2775\n2212,104\n2212,136\n2212,850\n2212,2105\n2213,697\n2214,135\n2215,392\n2216,20\n2216,68\n2217,46\n2217,615\n2217,762\n2217,783\n2217,968\n2217,1231\n2217,1293\n2217,1776\n2217,1782\n2217,1832\n2217,1877\n2217,3756\n2217,60576\n2217,103860\n2217,204124\n2218,1858\n2219,1860\n2220,313\n2221,818\n2222,22\n2222,861\n2222,1012\n2222,1143\n2222,1374\n2222,4252\n2223,2224\n2223,45437\n2224,19\n2224,34\n2224,35\n2224,56\n2224,217\n2224,222\n2224,462\n2224,634\n2224,635\n2224,852\n2224,1118\n2224,1313\n2224,1618\n2224,1916\n2224,2085\n2224,2223\n2224,2224\n2224,3729\n2224,4611\n2224,5034\n2224,5090\n2224,5326\n2224,6831\n2224,6939\n2224,6949\n2224,7109\n2224,7480\n2224,13389\n2224,18345\n2224,18831\n2224,19508\n2224,21382\n2224,24274\n2224,27115\n2224,28130\n2224,32510\n2224,33336\n2224,36699\n2224,36951\n2224,36952\n2224,39561\n2224,46800\n2224,46834\n2224,49632\n2224,55065\n2224,60636\n2224,62286\n2224,65796\n2224,66550\n2224,68117\n2224,79722\n2224,85696\n2224,88448\n2224,95456\n2224,97292\n2224,97630\n2224,98373\n2224,99832\n2224,105813\n2224,115474\n2224,124926\n2224,126607\n2224,129246\n2224,133700\n2224,133807\n2224,136260\n2224,136279\n2224,136290\n2224,139750\n2224,140118\n2224,140140\n2224,141117\n2224,143449\n2224,147583\n2224,147603\n2224,148163\n2224,148445\n2224,149453\n2224,149457\n2224,149471\n2224,151039\n2224,156309\n2224,157319\n2224,162331\n2224,169212\n2224,176648\n2224,191401\n2224,191405\n2224,193400\n2224,205382\n2224,215352\n2224,220995\n2224,230908\n2224,253708\n2224,254302\n2224,254304\n2224,259098\n2224,260741\n2224,262324\n2225,1807\n2226,87\n2226,344\n2226,392\n2226,1143\n2226,1151\n2226,1722\n2226,1836\n2227,985\n2228,248\n2228,289\n2228,290\n2228,406\n2228,685\n2228,818\n2228,849\n2228,877\n2228,1011\n2228,1127\n2228,1151\n2228,1267\n2228,1309\n2228,1417\n2228,1522\n2228,1715\n2228,1893\n2228,2205\n2228,3367\n2228,3695\n2228,33424\n2228,94134\n2229,497\n2230,338\n2230,360\n2230,467\n2230,509\n2230,515\n2230,1052\n2230,2051\n2230,3695\n2230,13538\n2230,49057\n2231,147\n2231,184\n2231,2244\n2231,21826\n2232,63\n2233,527\n2233,743\n2233,994\n2233,1070\n2234,192\n2235,22\n2235,50\n2235,167\n2235,240\n2235,301\n2235,313\n2235,392\n2235,536\n2235,818\n2235,1001\n2235,1210\n2235,1240\n2235,1417\n2235,127158\n2236,717\n2237,4\n2237,5\n2237,107\n2237,134\n2237,136\n2237,442\n2237,557\n2237,588\n2237,590\n2237,592\n2237,1119\n2237,1282\n2237,1411\n2237,1745\n2237,2205\n2237,2206\n2237,33424\n2237,88820\n2237,178576\n2238,1068\n2239,877\n2240,1639\n2241,298\n2242,485\n2243,399\n2243,1509\n2244,1\n2244,10\n2244,24\n2244,94\n2244,147\n2244,158\n2244,175\n2244,206\n2244,285\n2244,406\n2244,422\n2244,602\n2244,620\n2244,628\n2244,779\n2244,841\n2244,920\n2244,1181\n2244,1218\n2244,1247\n2244,1458\n2244,1464\n2244,1623\n2244,1825\n2244,1833\n2244,2132\n2244,2231\n2244,2244\n2244,2451\n2244,2552\n2244,2609\n2244,3895\n2244,4187\n2244,4627\n2244,5401\n2244,5592\n2244,5666\n2244,5725\n2244,8285\n2244,8867\n2244,9146\n2244,9320\n2244,9394\n2244,9487\n2244,14226\n2244,14622\n2244,15795\n2244,16891\n2244,17036\n2244,19578\n2244,21826\n2244,21828\n2244,22399\n2244,23783\n2244,25073\n2244,25348\n2244,26414\n2244,27495\n2244,27497\n2244,27499\n2244,27771\n2244,31356\n2244,35614\n2244,36436\n2244,44216\n2244,44225\n2244,44877\n2244,45225\n2244,58640\n2244,58856\n2244,65809\n2244,67380\n2244,68069\n2244,72439\n2244,79559\n2244,80266\n2244,85001\n2244,92444\n2244,94190\n2244,98928\n2244,99215\n2244,103786\n2244,105253\n2244,105256\n2244,105257\n2244,105727\n2244,105813\n2244,109160\n2244,118090\n2244,118336\n2244,120385\n2244,124889\n2244,143241\n2244,144524\n2244,145022\n2244,146029\n2244,149362\n2244,149534\n2244,155092\n2244,163965\n2244,164572\n2244,185918\n2244,220719\n2244,240174\n2244,247132\n2244,252689\n2244,254921\n2244,261074\n2245,160\n2245,723\n2246,392\n2246,1240\n2246,1453\n2246,1454\n2246,1465\n2246,1837\n2247,54\n2247,399\n2247,660\n2247,781\n2247,1539\n2247,2168\n2247,2247\n2247,2424\n2247,2646\n2247,2944\n2247,7698\n2247,76060\n2247,87372\n2247,122160\n2247,214233\n2247,220902\n2247,224495\n2247,227002\n2247,248626\n2247,263022\n2248,206\n2248,145240\n2249,1858\n2250,1860\n2251,602\n2251,3218\n2251,4865\n2251,4866\n2252,167\n2252,240\n2252,592\n2252,919\n2252,1010\n2252,1133\n2252,1284\n2252,1479\n2252,1522\n2252,2083\n2252,2480\n2252,2557\n2252,2979\n2253,19\n2253,20\n2253,34\n2253,35\n2253,68\n2253,120\n2253,126\n2253,158\n2253,182\n2253,215\n2253,240\n2253,251\n2253,299\n2253,313\n2253,315\n2253,333\n2253,336\n2253,372\n2253,392\n2253,397\n2253,406\n2253,417\n2253,435\n2253,439\n2253,441\n2253,442\n2253,455\n2253,493\n2253,500\n2253,505\n2253,509\n2253,516\n2253,536\n2253,575\n2253,586\n2253,631\n2253,632\n2253,640\n2253,660\n2253,703\n2253,714\n2253,726\n2253,795\n2253,808\n2253,838\n2253,859\n2253,911\n2253,918\n2253,919\n2253,949\n2253,972\n2253,973\n2253,1007\n2253,1010\n2253,1014\n2253,1033\n2253,1078\n2253,1118\n2253,1147\n2253,1151\n2253,1191\n2253,1204\n2253,1243\n2253,1284\n2253,1285\n2253,1309\n2253,1345\n2253,1353\n2253,1363\n2253,1370\n2253,1402\n2253,1417\n2253,1434\n2253,1445\n2253,1453\n2253,1454\n2253,1479\n2253,1515\n2253,1518\n2253,1531\n2253,1566\n2253,1724\n2253,1801\n2253,1888\n2253,1992\n2253,2083\n2253,2254\n2253,2266\n2253,2334\n2253,2424\n2253,2512\n2253,2572\n2253,2646\n2253,2775\n2253,2784\n2253,3115\n2253,3182\n2253,4220\n2253,4234\n2253,4276\n2253,4706\n2253,4760\n2253,5326\n2253,5662\n2253,6452\n2253,6695\n2253,6734\n2253,7296\n2253,8276\n2253,9743\n2253,12263\n2253,18604\n2253,24585\n2253,25870\n2253,26414\n2253,28289\n2253,28353\n2253,30596\n2253,45666\n2253,48307\n2253,66297\n2253,70395\n2253,75912\n2253,76086\n2253,76096\n2253,78932\n2253,85979\n2253,95823\n2253,115474\n2253,135158\n2253,138205\n2253,189277\n2253,200454\n2253,207659\n2254,175\n2254,446\n2254,602\n2254,2253\n2254,23783\n2255,726\n2255,996\n2255,1068\n2256,240\n2257,388\n2258,171\n2259,264\n2259,649\n2259,2260\n2260,10\n2260,106\n2260,146\n2260,620\n2260,663\n2260,664\n2260,1370\n2260,1707\n2260,2782\n2261,1858\n2262,1860\n2263,301\n2263,968\n2263,972\n2263,1782\n2263,1837\n2263,75912\n2264,1014\n2265,1509\n2265,1551\n2266,19\n2266,222\n2266,313\n2266,389\n2266,455\n2266,457\n2266,656\n2266,657\n2266,814\n2266,1175\n2266,1298\n2266,1531\n2266,1571\n2266,1617\n2266,1881\n2266,2092\n2266,2193\n2266,2253\n2266,2266\n2266,2424\n2266,2511\n2266,2556\n2266,2646\n2266,3672\n2266,3880\n2266,4321\n2266,4377\n2266,5208\n2266,6642\n2266,6789\n2266,6890\n2266,6913\n2266,9111\n2266,13771\n2266,17825\n2266,17837\n2266,21249\n2266,21381\n2266,23520\n2266,24917\n2266,26161\n2266,28511\n2266,33508\n2266,34287\n2266,37852\n2266,45666\n2266,50018\n2266,50147\n2266,56451\n2266,56518\n2266,56600\n2266,57907\n2266,67339\n2266,68173\n2266,72592\n2266,79857\n2266,86840\n2266,93636\n2266,94229\n2266,96240\n2266,107356\n2266,107598\n2266,107999\n2266,109537\n2266,110484\n2266,110932\n2266,113003\n2266,117817\n2266,119349\n2266,126282\n2266,127148\n2266,142450\n2266,144323\n2266,158788\n2266,163718\n2266,168165\n2266,171300\n2266,177294\n2266,177486\n2266,179137\n2266,191520\n2266,198387\n2266,214655\n2266,243069\n2266,243506\n2266,246800\n2266,247786\n2267,195\n2267,693\n2268,918\n2268,2605\n2269,283\n2269,389\n2269,455\n2269,657\n2269,1454\n2270,1227\n2270,1229\n2270,86416\n2271,358\n2272,301\n2272,717\n2272,1782\n2273,2274\n2274,87\n2274,919\n2274,1192\n2275,312\n2277,439\n2278,717\n2279,48\n2279,130\n2279,160\n2279,515\n2279,736\n2279,827\n2279,3653\n2280,41\n2281,2282\n2283,811\n2284,273\n2284,274\n2285,68\n2285,292\n2285,1402\n2285,1462\n2285,1849\n2285,2286\n2285,2620\n2285,3467\n2285,4220\n2285,8537\n2285,22071\n2285,44725\n2286,135\n2286,215\n2286,233\n2286,289\n2286,290\n2286,304\n2286,328\n2286,588\n2286,590\n2286,592\n2286,704\n2286,714\n2286,715\n2286,1172\n2286,1282\n2286,1402\n2286,1796\n2286,1962\n2286,2205\n2286,2206\n2286,2285\n2286,2286\n2286,2315\n2286,3565\n2286,4218\n2286,4571\n2286,5563\n2286,9202\n2286,9529\n2286,13867\n2286,14476\n2286,19449\n2286,20787\n2286,21382\n2286,22168\n2286,23482\n2286,26244\n2286,32359\n2286,33424\n2286,43394\n2286,45863\n2286,58402\n2286,62198\n2286,65905\n2286,66714\n2286,67080\n2286,68006\n2286,74547\n2286,75417\n2286,81002\n2286,83498\n2286,87131\n2286,88820\n2286,92919\n2286,94134\n2286,108159\n2286,110228\n2286,143393\n2286,144988\n2286,147433\n2286,148067\n2286,160325\n2286,223779\n2286,245910\n2287,195\n2288,195\n2288,336\n2289,209\n2289,302\n2289,893\n2289,2116\n2290,34\n2290,83\n2290,222\n2290,278\n2290,283\n2290,313\n2290,385\n2290,455\n2290,536\n2290,660\n2290,781\n2290,1201\n2290,1419\n2290,1718\n2290,1881\n2290,2319\n2290,2421\n2290,2784\n2290,3252\n2290,5326\n2290,5591\n2290,6068\n2290,6506\n2290,7092\n2290,13980\n2290,19443\n2290,37088\n2291,579\n2291,2292\n2293,932\n2294,497\n2295,500\n2296,10\n2296,298\n2296,314\n2296,372\n2296,417\n2296,534\n2296,573\n2296,592\n2296,818\n2296,862\n2296,911\n2296,1011\n2296,1085\n2296,2184\n2296,2296\n2296,2345\n2296,2357\n2296,2850\n2296,4022\n2296,4463\n2296,4540\n2296,5278\n2296,6068\n2296,13641\n2296,13756\n2296,13965\n2296,21742\n2296,26061\n2296,26488\n2296,26781\n2296,28886\n2296,31137\n2296,34522\n2296,42029\n2296,42555\n2296,42582\n2296,49554\n2296,49615\n2296,49962\n2296,49998\n2296,70195\n2296,75912\n2296,80268\n2296,83020\n2296,87077\n2296,96046\n2296,101934\n2296,102705\n2296,108020\n2296,111138\n2296,118804\n2296,121502\n2296,127158\n2296,131818\n2296,135771\n2296,136692\n2296,139965\n2296,142417\n2296,142431\n2296,146665\n2296,148714\n2296,148719\n2296,156143\n2296,164011\n2296,166722\n2296,168470\n2296,177728\n2296,177729\n2296,178397\n2296,194601\n2296,224667\n2296,227086\n2296,232698\n2296,240195\n2296,243458\n2296,243460\n2296,244621\n2296,251579\n2296,264429\n2297,22\n2297,718\n2297,1210\n2298,147\n2299,3\n2299,30\n2299,50\n2299,79\n2299,104\n2299,134\n2299,137\n2299,147\n2299,202\n2299,203\n2299,215\n2299,233\n2299,248\n2299,252\n2299,318\n2299,330\n2299,336\n2299,337\n2299,346\n2299,406\n2299,439\n2299,442\n2299,447\n2299,493\n2299,503\n2299,516\n2299,525\n2299,538\n2299,585\n2299,586\n2299,588\n2299,590\n2299,592\n2299,609\n2299,694\n2299,760\n2299,779\n2299,788\n2299,805\n2299,925\n2299,980\n2299,994\n2299,1085\n2299,1133\n2299,1175\n2299,1220\n2299,1222\n2299,1247\n2299,1265\n2299,1266\n2299,1309\n2299,1326\n2299,1411\n2299,1425\n2299,1722\n2299,1782\n2299,1939\n2299,2205\n2299,2206\n2299,2210\n2299,2620\n2299,2701\n2299,2793\n2299,3085\n2299,3115\n2299,3148\n2299,4237\n2299,4355\n2299,6119\n2299,7270\n2299,15573\n2300,209\n2300,302\n2300,2116\n2301,3\n2301,510\n2301,2045\n2302,1019\n2302,1417\n2303,86\n2304,10\n2305,1433\n2306,8\n2306,273\n2306,274\n2306,372\n2306,581\n2306,647\n2306,668\n2306,675\n2306,827\n2306,1058\n2306,1313\n2306,3612\n2307,20\n2307,68\n2307,192\n2307,264\n2307,301\n2307,435\n2307,516\n2307,953\n2307,1010\n2307,1085\n2307,1181\n2307,1210\n2307,1298\n2307,1326\n2307,1531\n2307,7124\n2307,8868\n2308,397\n2309,481\n2310,158\n2310,481\n2310,668\n2310,713\n2310,809\n2310,849\n2310,900\n2310,911\n2310,1011\n2310,1172\n2310,1603\n2310,2310\n2310,4199\n2310,6948\n2310,26161\n2310,46915\n2310,58467\n2310,62676\n2310,123128\n2310,168383\n2310,216113\n2310,222533\n2310,228822\n2310,247057\n2310,247060\n2311,2312\n2312,182\n2312,309\n2312,310\n2312,808\n2312,1011\n2312,1118\n2312,1293\n2312,1298\n2312,1796\n2312,1893\n2312,2224\n2312,4294\n2312,6695\n2312,15609\n2313,973\n2313,1117\n2314,22\n2314,217\n2314,599\n2315,107\n2315,289\n2315,290\n2315,304\n2315,328\n2315,364\n2315,609\n2315,704\n2315,714\n2315,715\n2315,784\n2315,805\n2315,1082\n2315,1242\n2315,1257\n2315,1359\n2315,1402\n2315,1701\n2315,1745\n2315,1807\n2315,2205\n2315,2206\n2315,2286\n2315,2315\n2315,2316\n2315,2646\n2315,2775\n2315,3069\n2315,3565\n2315,3623\n2315,3709\n2315,3964\n2315,4218\n2315,4227\n2315,4262\n2315,4367\n2315,4408\n2315,4532\n2315,4618\n2315,5439\n2315,13563\n2315,14511\n2315,14523\n2315,15827\n2315,16562\n2315,19755\n2315,22893\n2315,23710\n2315,24886\n2315,25393\n2315,25416\n2315,26781\n2315,29922\n2315,33424\n2315,34963\n2315,36841\n2315,37527\n2315,39588\n2315,49373\n2315,60081\n2315,63592\n2315,63945\n2315,66394\n2315,67126\n2315,68123\n2315,77808\n2315,79243\n2315,86447\n2315,90680\n2315,90788\n2315,90791\n2315,94134\n2315,95379\n2315,107087\n2315,114414\n2315,115584\n2315,115901\n2315,117818\n2315,122427\n2315,122452\n2315,136012\n2315,143456\n2315,144988\n2315,158762\n2315,158803\n2315,163127\n2315,167312\n2315,167890\n2315,167896\n2315,168425\n2315,186627\n2315,187482\n2315,204537\n2315,217880\n2315,218444\n2315,218775\n2315,218796\n2315,219721\n2315,234172\n2315,234173\n2315,240388\n2317,920\n2318,34\n2318,35\n2318,217\n2318,222\n2318,536\n2318,2319\n2318,18831\n2319,10\n2319,222\n2319,536\n2319,849\n2319,1069\n2319,1201\n2319,1724\n2319,2318\n2319,2319\n2319,2523\n2319,3484\n2319,4349\n2319,5326\n2319,5458\n2319,5797\n2319,6785\n2319,13169\n2319,16604\n2319,16612\n2319,16615\n2319,16623\n2319,16627\n2319,16632\n2319,16658\n2319,18880\n2319,19569\n2319,19587\n2319,19850\n2319,21321\n2319,23683\n2319,24274\n2319,24794\n2319,26085\n2319,32271\n2319,32276\n2319,32347\n2319,33427\n2319,33965\n2319,34251\n2319,34265\n2319,34313\n2319,34348\n2319,34363\n2319,35627\n2319,37110\n2319,37611\n2319,39663\n2319,46582\n2319,50401\n2319,52113\n2319,60994\n2319,62297\n2319,62300\n2319,68121\n2319,68129\n2319,68144\n2319,89868\n2319,91850\n2319,91854\n2319,93306\n2319,98367\n2319,106104\n2319,110483\n2320,788\n2320,1388\n2321,261\n2322,222\n2322,389\n2322,455\n2322,657\n2322,891\n2322,1019\n2322,2266\n2323,1740\n2324,841\n2325,602\n2326,298\n2327,485\n2328,195\n2329,54\n2330,710\n2330,67594\n2331,149\n2331,406\n2332,136\n2333,147\n2333,149\n2333,158\n2334,58\n2334,111\n2334,178\n2334,217\n2334,314\n2334,356\n2334,441\n2334,442\n2334,457\n2334,599\n2334,685\n2334,795\n2334,838\n2334,1011\n2334,1298\n2334,1326\n2334,1411\n2334,1417\n2334,1449\n2334,2373\n2334,4771\n2334,5961\n2334,37414\n2334,215874\n2335,298\n2336,160\n2336,827\n2336,1849\n2337,485\n2338,41\n2338,784\n2338,805\n2339,1\n2339,26\n2339,59\n2339,147\n2339,149\n2339,158\n2339,21944\n2340,346\n2340,439\n2340,671\n2341,536\n2342,991\n2344,957\n2344,1815\n2345,1849\n2345,32784\n2346,41\n2346,294\n2346,431\n2346,631\n2346,1119\n2346,1462\n2346,8537\n2347,301\n2347,972\n2347,1010\n2347,1849\n2347,2979\n2348,217\n2348,301\n2348,309\n2348,310\n2348,314\n2348,328\n2348,483\n2348,493\n2348,760\n2348,818\n2348,868\n2348,949\n2348,1019\n2348,1033\n2348,1085\n2348,1118\n2348,1220\n2348,1417\n2348,1801\n2348,3999\n2348,6556\n2349,304\n2349,682\n2349,772\n2349,72439\n2350,2351\n2351,2351\n2352,346\n2352,435\n2352,439\n2352,671\n2352,996\n2352,1033\n2352,1068\n2352,1181\n2352,1294\n2352,1590\n2352,1612\n2352,1776\n2352,1849\n2352,1877\n2352,2353\n2352,6661\n2352,13486\n2353,20\n2353,178\n2353,315\n2353,346\n2353,425\n2353,435\n2353,538\n2353,671\n2353,766\n2353,934\n2353,992\n2353,996\n2353,1068\n2353,1474\n2353,1644\n2353,1697\n2353,1762\n2353,1877\n2353,2030\n2353,2138\n2353,2253\n2353,2352\n2353,2353\n2353,2427\n2353,2744\n2353,3540\n2353,3658\n2353,3659\n2353,3661\n2353,3662\n2353,3663\n2353,3664\n2353,3665\n2353,3666\n2353,3667\n2353,5356\n2353,5481\n2353,5483\n2353,5513\n2353,5617\n2353,6672\n2353,6703\n2353,6804\n2353,6966\n2353,7731\n2353,7981\n2353,14422\n2353,14428\n2353,20292\n2353,21164\n2353,21181\n2353,21224\n2353,21227\n2353,21240\n2353,21248\n2353,21442\n2353,22148\n2353,23138\n2353,23450\n2353,23509\n2353,23518\n2353,23718\n2353,23724\n2353,23840\n2353,25373\n2353,26023\n2353,26252\n2353,26730\n2353,26785\n2353,26787\n2353,27054\n2353,28205\n2353,28339\n2353,28802\n2353,32468\n2353,33397\n2353,33552\n2353,38158\n2353,38468\n2353,40497\n2353,40763\n2353,41318\n2353,43268\n2353,44221\n2353,45492\n2353,46147\n2353,46148\n2353,46149\n2353,46151\n2353,46158\n2353,46210\n2353,46265\n2353,46266\n2353,46379\n2353,54295\n2353,54355\n2353,56430\n2353,56472\n2353,60058\n2353,60505\n2353,65759\n2353,67389\n2353,67972\n2353,68611\n2353,70703\n2353,75230\n2353,78717\n2353,78823\n2353,80956\n2353,83222\n2353,83461\n2353,93044\n2353,93082\n2353,93094\n2353,93135\n2353,93495\n2353,96465\n2353,96477\n2353,96479\n2353,96537\n2353,97920\n2353,98182\n2353,98208\n2353,99678\n2353,99689\n2353,99743\n2353,102673\n2353,106083\n2353,106092\n2353,106106\n2353,106349\n2353,107564\n2353,109249\n2353,109282\n2353,109283\n2353,109286\n2353,109287\n2353,109288\n2353,109303\n2353,110341\n2353,111251\n2353,112233\n2353,112330\n2353,112393\n2353,113466\n2353,114431\n2353,116875\n2353,116920\n2353,118307\n2353,120089\n2353,120155\n2353,121067\n2353,122411\n2353,122412\n2353,122413\n2353,122414\n2353,122415\n2353,122416\n2353,122417\n2353,122424\n2353,124678\n2353,127136\n2353,127330\n2353,129715\n2353,129716\n2353,132820\n2353,132821\n2353,132822\n2353,132863\n2353,132864\n2353,136437\n2353,139453\n2353,140080\n2353,148789\n2353,148794\n2353,148795\n2353,148859\n2353,150043\n2353,151352\n2353,153176\n2353,153227\n2353,153250\n2353,156266\n2353,156302\n2353,165647\n2353,165653\n2353,166568\n2353,166570\n2353,166572\n2353,166576\n2353,166577\n2353,166578\n2353,166579\n2353,166580\n2353,166581\n2353,166582\n2353,166583\n2353,166584\n2353,166585\n2353,166586\n2353,166587\n2353,166588\n2353,166589\n2353,166590\n2353,166591\n2353,166592\n2353,166593\n2353,166595\n2353,166596\n2353,166597\n2353,166697\n2353,166930\n2353,167712\n2353,170559\n2353,170732\n2353,170736\n2353,171176\n2353,173741\n2353,173742\n2353,173743\n2353,173789\n2353,173913\n2353,174717\n2353,175954\n2353,176748\n2353,177256\n2353,181990\n2353,182390\n2353,182405\n2353,183748\n2353,188694\n2353,188730\n2353,189755\n2353,191458\n2353,192508\n2353,192524\n2353,194293\n2353,212912\n2353,214120\n2353,214817\n2353,214829\n2353,215251\n2353,220519\n2353,221857\n2353,230306\n2353,230387\n2353,232572\n2353,232585\n2353,232586\n2353,232587\n2353,232588\n2353,232589\n2353,232590\n2353,232591\n2353,232717\n2353,238160\n2354,1474\n2355,497\n2356,1\n2356,1191\n2356,6682\n2357,240\n2357,417\n2357,2296\n2358,41\n2358,68\n2358,135\n2358,364\n2358,431\n2358,583\n2358,604\n2358,609\n2358,805\n2358,1068\n2358,1635\n2358,2006\n2358,2315\n2358,2572\n2358,2775\n2358,3135\n2358,4220\n2358,66297\n2359,200\n2360,1143\n2361,287\n2361,657\n2361,809\n2362,577\n2362,1105\n2362,1429\n2363,206\n2363,217\n2363,571\n2363,827\n2364,827\n2365,1\n2365,50\n2365,106\n2365,147\n2365,149\n2365,158\n2365,192\n2365,406\n2365,422\n2365,585\n2365,622\n2365,1181\n2365,1425\n2366,2367\n2367,685\n2367,872\n2367,911\n2367,1572\n2367,2367\n2367,4039\n2367,27057\n2368,8\n2369,1782\n2370,2371\n2371,22\n2371,65\n2371,79\n2371,147\n2371,158\n2371,195\n2371,202\n2371,203\n2371,217\n2371,252\n2371,278\n2371,301\n2371,305\n2371,337\n2371,349\n2371,388\n2371,392\n2371,406\n2371,433\n2371,434\n2371,525\n2371,571\n2371,622\n2371,765\n2371,814\n2371,818\n2371,915\n2371,939\n2371,950\n2371,1033\n2371,1181\n2371,1246\n2371,1326\n2371,1370\n2371,1381\n2371,1401\n2371,1454\n2371,1463\n2371,1464\n2371,1517\n2371,1521\n2371,1726\n2371,1782\n2371,1794\n2371,1837\n2371,1968\n2371,2094\n2371,2106\n2371,2125\n2371,2152\n2371,2348\n2371,2371\n2371,2400\n2371,2470\n2371,2840\n2371,2880\n2371,3449\n2371,3609\n2371,3718\n2371,3745\n2371,3866\n2371,3973\n2371,4159\n2371,4164\n2371,4455\n2371,4565\n2371,4702\n2371,5061\n2371,5178\n2371,5353\n2371,5361\n2371,5495\n2371,5563\n2371,5583\n2371,5625\n2371,5631\n2371,5670\n2371,5696\n2371,6761\n2371,7076\n2371,7132\n2371,7242\n2371,7265\n2371,7344\n2371,7897\n2371,7983\n2371,8100\n2371,8128\n2371,8157\n2371,8190\n2371,8243\n2371,8411\n2371,8606\n2371,9527\n2371,9738\n2371,9768\n2371,13130\n2371,13260\n2371,13270\n2371,13274\n2371,13336\n2371,13430\n2371,13464\n2371,13519\n2371,13524\n2371,13771\n2371,14064\n2371,14158\n2371,14429\n2371,14623\n2371,14632\n2371,14680\n2371,14830\n2371,15109\n2371,15240\n2371,15566\n2371,15636\n2371,15693\n2371,15770\n2371,17115\n2371,18102\n2371,18110\n2371,18172\n2371,18200\n2371,18201\n2371,18202\n2371,18203\n2371,18209\n2371,18213\n2371,18214\n2371,18229\n2371,18235\n2371,18236\n2371,18237\n2371,18238\n2371,18239\n2371,18240\n2371,18246\n2371,18248\n2371,18249\n2371,18252\n2371,18258\n2371,18259\n2371,18260\n2371,18261\n2371,18263\n2371,18265\n2371,18266\n2371,18268\n2371,18270\n2371,18272\n2371,18274\n2371,18275\n2371,18277\n2371,18278\n2371,18289\n2371,18292\n2371,18295\n2371,18310\n2371,18311\n2371,18312\n2371,18317\n2371,18321\n2371,18322\n2371,18329\n2371,18331\n2371,18333\n2371,18334\n2371,18335\n2371,18350\n2371,18354\n2371,18357\n2371,18360\n2371,18364\n2371,18366\n2371,18368\n2371,18372\n2371,18374\n2371,18377\n2371,18382\n2371,18384\n2371,18387\n2371,18388\n2371,18389\n2371,18390\n2371,18392\n2371,18396\n2371,18397\n2371,18399\n2371,18400\n2371,18404\n2371,18405\n2371,18406\n2371,18411\n2371,18418\n2371,18419\n2371,18423\n2371,18430\n2371,18436\n2371,18438\n2371,19457\n2371,20419\n2371,20737\n2371,21322\n2371,21411\n2371,21547\n2371,21563\n2371,22015\n2371,22221\n2371,22277\n2371,22341\n2371,22543\n2371,23212\n2371,23337\n2371,23465\n2371,23616\n2371,23633\n2371,24150\n2371,25395\n2371,25575\n2371,25662\n2371,26905\n2371,28266\n2371,28317\n2371,28962\n2371,28968\n2371,29092\n2371,29102\n2371,29334\n2371,29849\n2371,29889\n2371,30459\n2371,30514\n2371,31343\n2371,32820\n2371,33519\n2371,33991\n2371,34055\n2371,34137\n2371,35661\n2371,35672\n2371,35720\n2371,36439\n2371,36458\n2371,36468\n2371,36563\n2371,36643\n2371,36655\n2371,36671\n2371,36729\n2371,37441\n2371,38861\n2371,38870\n2371,38950\n2371,39173\n2371,39552\n2371,42803\n2371,44158\n2371,48047\n2371,48049\n2371,48057\n2371,48444\n2371,48506\n2371,49001\n2371,49342\n2371,52292\n2371,52560\n2371,53472\n2371,54234\n2371,54958\n2371,55148\n2371,58893\n2371,60356\n2371,61211\n2371,63184\n2371,65652\n2371,66548\n2371,66617\n2371,66664\n2371,67267\n2371,67931\n2371,68150\n2371,68627\n2371,70236\n2371,73281\n2371,73958\n2371,74152\n2371,76095\n2371,76803\n2371,76870\n2371,76958\n2371,77550\n2371,77562\n2371,78470\n2371,79359\n2371,79630\n2371,82921\n2371,90030\n2371,91976\n2371,93721\n2371,93792\n2371,98923\n2371,103337\n2371,103348\n2371,103357\n2371,103361\n2371,103762\n2371,110151\n2371,110713\n2371,110741\n2371,110921\n2371,111192\n2371,111194\n2371,111195\n2371,111199\n2371,111201\n2371,111203\n2371,111207\n2371,111981\n2371,114641\n2371,116088\n2371,116189\n2371,116196\n2371,116895\n2371,117974\n2371,118010\n2371,118092\n2371,119666\n2371,119698\n2371,119906\n2371,122911\n2371,129099\n2371,129933\n2371,130890\n2371,130993\n2371,131875\n2371,132186\n2371,133589\n2371,133729\n2371,134236\n2371,134252\n2371,134394\n2371,134487\n2371,134906\n2371,136272\n2371,137017\n2371,137018\n2371,137019\n2371,137266\n2371,137267\n2371,137268\n2371,137269\n2371,137270\n2371,137271\n2371,137280\n2371,137281\n2371,137282\n2371,137283\n2371,137284\n2371,137285\n2371,137286\n2371,137287\n2371,137288\n2371,137289\n2371,137290\n2371,137291\n2371,137292\n2371,137293\n2371,137294\n2371,137295\n2371,137296\n2371,137297\n2371,137298\n2371,137299\n2371,137300\n2371,137301\n2371,137302\n2371,137303\n2371,137304\n2371,137305\n2371,137306\n2371,137307\n2371,137308\n2371,137309\n2371,137310\n2371,137311\n2371,137312\n2371,137313\n2371,137314\n2371,137315\n2371,137316\n2371,137317\n2371,137318\n2371,137319\n2371,137320\n2371,137321\n2371,137322\n2371,137323\n2371,137324\n2371,137325\n2371,137326\n2371,137327\n2371,137328\n2371,137330\n2371,137331\n2371,137332\n2371,137333\n2371,137334\n2371,137335\n2371,137336\n2371,137337\n2371,137338\n2371,137339\n2371,137340\n2371,137341\n2371,137342\n2371,137343\n2371,137344\n2371,137345\n2371,137346\n2371,137347\n2371,137348\n2371,137349\n2371,137350\n2371,137351\n2371,137352\n2371,137353\n2371,137354\n2371,137355\n2371,137356\n2371,137357\n2371,137358\n2371,137359\n2371,137360\n2371,137361\n2371,137362\n2371,137363\n2371,137364\n2371,137365\n2371,137366\n2371,137367\n2371,137368\n2371,137369\n2371,137370\n2371,137371\n2371,137372\n2371,137373\n2371,137374\n2371,137375\n2371,137376\n2371,137377\n2371,137378\n2371,137379\n2371,137380\n2371,137381\n2371,137382\n2371,137383\n2371,137384\n2371,137385\n2371,137386\n2371,137387\n2371,137388\n2371,137389\n2371,137390\n2371,137391\n2371,137392\n2371,137393\n2371,137394\n2371,137395\n2371,137396\n2371,137397\n2371,137398\n2371,137399\n2371,137400\n2371,137401\n2371,137402\n2371,137403\n2371,137404\n2371,137405\n2371,137406\n2371,137407\n2371,137408\n2371,137409\n2371,137410\n2371,137411\n2371,137412\n2371,137413\n2371,137414\n2371,137415\n2371,137416\n2371,137417\n2371,137418\n2371,137419\n2371,137420\n2371,137421\n2371,137422\n2371,137423\n2371,137424\n2371,137425\n2371,137426\n2371,137427\n2371,137428\n2371,137429\n2371,137430\n2371,137431\n2371,137432\n2371,137433\n2371,137434\n2371,137435\n2371,137436\n2371,137437\n2371,137438\n2371,137439\n2371,137440\n2371,137441\n2371,137442\n2371,137443\n2371,137444\n2371,137445\n2371,137446\n2371,137447\n2371,137448\n2371,137449\n2371,137450\n2371,137451\n2371,137452\n2371,137453\n2371,137454\n2371,137455\n2371,137456\n2371,137457\n2371,137458\n2371,137459\n2371,137460\n2371,137461\n2371,137462\n2371,137463\n2371,137464\n2371,137465\n2371,137466\n2371,137467\n2371,137468\n2371,137469\n2371,137470\n2371,137471\n2371,137472\n2371,137473\n2371,137474\n2371,137475\n2371,137476\n2371,137477\n2371,137478\n2371,137479\n2371,137480\n2371,137481\n2371,137482\n2371,137483\n2371,137484\n2371,137485\n2371,137486\n2371,137487\n2371,137488\n2371,137489\n2371,137490\n2371,137491\n2371,137492\n2371,137493\n2371,137494\n2371,137495\n2371,137496\n2371,137497\n2371,137498\n2371,137500\n2371,137501\n2371,137502\n2371,137503\n2371,137504\n2371,137505\n2371,137506\n2371,137507\n2371,137508\n2371,137509\n2371,137510\n2371,137511\n2371,137512\n2371,137513\n2371,137514\n2371,137515\n2371,137516\n2371,137517\n2371,137518\n2371,137519\n2371,137520\n2371,137521\n2371,137522\n2371,137523\n2371,137524\n2371,137525\n2371,137526\n2371,137527\n2371,137528\n2371,137529\n2371,137530\n2371,137531\n2371,137532\n2371,137533\n2371,137534\n2371,137535\n2371,137536\n2371,137537\n2371,137538\n2371,137539\n2371,137541\n2371,137542\n2371,137543\n2371,137544\n2371,137545\n2371,137546\n2371,137547\n2371,137548\n2371,137549\n2371,137550\n2371,137551\n2371,137552\n2371,137553\n2371,137554\n2371,137555\n2371,137556\n2371,137557\n2371,137558\n2371,137559\n2371,137560\n2371,137561\n2371,137562\n2371,137563\n2371,137564\n2371,137565\n2371,137566\n2371,137567\n2371,137568\n2371,137569\n2371,137570\n2371,137571\n2371,137572\n2371,137573\n2371,137574\n2371,137575\n2371,137576\n2371,137577\n2371,137578\n2371,137579\n2371,137580\n2371,137581\n2371,137582\n2371,137583\n2371,137584\n2371,137585\n2371,137586\n2371,137587\n2371,137588\n2371,137590\n2371,137591\n2371,137592\n2371,137593\n2371,137594\n2371,137595\n2371,137596\n2371,137597\n2371,137598\n2371,137599\n2371,137600\n2371,137601\n2371,137602\n2371,137603\n2371,137604\n2371,137605\n2371,137606\n2371,137607\n2371,137608\n2371,137609\n2371,137610\n2371,137611\n2371,137612\n2371,137613\n2371,137614\n2371,137615\n2371,137616\n2371,137617\n2371,137618\n2371,137619\n2371,137620\n2371,137621\n2371,137622\n2371,137623\n2371,137624\n2371,137625\n2371,137626\n2371,137627\n2371,137628\n2371,137629\n2371,137630\n2371,137631\n2371,137632\n2371,137633\n2371,137634\n2371,137635\n2371,137636\n2371,137637\n2371,137638\n2371,137639\n2371,137640\n2371,137641\n2371,137642\n2371,137643\n2371,137644\n2371,137645\n2371,137646\n2371,137647\n2371,137648\n2371,137649\n2371,137650\n2371,137651\n2371,137652\n2371,137653\n2371,137654\n2371,137655\n2371,137656\n2371,137657\n2371,137658\n2371,137659\n2371,137660\n2371,137661\n2371,137662\n2371,137663\n2371,137664\n2371,137665\n2371,137666\n2371,137667\n2371,137668\n2371,137669\n2371,137670\n2371,137671\n2371,137672\n2371,137673\n2371,137674\n2371,137675\n2371,137676\n2371,137677\n2371,137678\n2371,137679\n2371,137680\n2371,137681\n2371,137682\n2371,137683\n2371,137684\n2371,137685\n2371,137686\n2371,137687\n2371,137688\n2371,137689\n2371,137690\n2371,137691\n2371,137692\n2371,137693\n2371,137694\n2371,137695\n2371,137696\n2371,137697\n2371,137698\n2371,137699\n2371,137700\n2371,137701\n2371,137702\n2371,137703\n2371,137704\n2371,137705\n2371,137706\n2371,137707\n2371,137708\n2371,137709\n2371,137710\n2371,137711\n2371,137712\n2371,137713\n2371,137714\n2371,137715\n2371,137716\n2371,137717\n2371,137718\n2371,137719\n2371,137720\n2371,137721\n2371,137722\n2371,137723\n2371,137724\n2371,137725\n2371,137726\n2371,137727\n2371,137728\n2371,137729\n2371,137730\n2371,137731\n2371,137732\n2371,138303\n2371,148802\n2371,148970\n2371,152690\n2371,167760\n2371,168942\n2371,173829\n2371,207225\n2372,167\n2372,256\n2372,299\n2372,301\n2372,349\n2372,356\n2372,783\n2372,852\n2372,877\n2372,937\n2372,1241\n2372,1284\n2372,1431\n2372,1544\n2372,2083\n2372,2193\n2372,2372\n2372,2663\n2372,3218\n2372,3848\n2372,8032\n2372,9340\n2372,13804\n2372,14095\n2372,16505\n2372,17116\n2372,17389\n2372,17877\n2372,17986\n2372,23351\n2372,25662\n2372,31231\n2372,31741\n2372,31785\n2372,43341\n2372,46805\n2372,47125\n2372,51252\n2372,57208\n2372,68063\n2372,82843\n2372,98315\n2372,128516\n2372,130238\n2372,136084\n2372,148742\n2372,163898\n2372,168657\n2372,180609\n2372,221176\n2372,236049\n2372,236108\n2372,257630\n2373,46\n2373,68\n2373,140\n2373,207\n2373,292\n2373,314\n2373,333\n2373,336\n2373,356\n2373,360\n2373,388\n2373,406\n2373,408\n2373,433\n2373,442\n2373,455\n2373,457\n2373,509\n2373,563\n2373,579\n2373,599\n2373,626\n2373,649\n2373,658\n2373,673\n2373,676\n2373,690\n2373,694\n2373,697\n2373,736\n2373,794\n2373,801\n2373,818\n2373,838\n2373,841\n2373,849\n2373,900\n2373,911\n2373,918\n2373,972\n2373,1010\n2373,1011\n2373,1014\n2373,1087\n2373,1089\n2373,1113\n2373,1130\n2373,1147\n2373,1151\n2373,1172\n2373,1204\n2373,1240\n2373,1243\n2373,1284\n2373,1293\n2373,1368\n2373,1402\n2373,1445\n2373,1449\n2373,1453\n2373,1454\n2373,1522\n2373,1572\n2373,1653\n2373,1655\n2373,1724\n2373,1796\n2373,1844\n2373,1893\n2373,1989\n2373,2069\n2373,2085\n2373,2334\n2373,2373\n2373,2775\n2373,2979\n2373,3474\n2373,3804\n2373,4190\n2373,4428\n2373,4514\n2373,5686\n2373,6999\n2373,7272\n2373,8127\n2373,8128\n2373,8131\n2373,8425\n2373,8426\n2373,9457\n2373,13538\n2373,14652\n2373,15587\n2373,16985\n2373,18140\n2373,19589\n2373,20369\n2373,21442\n2373,22015\n2373,24703\n2373,24707\n2373,26905\n2373,28284\n2373,34074\n2373,38140\n2373,43220\n2373,44586\n2373,44859\n2373,50467\n2373,53420\n2373,55479\n2373,61089\n2373,75992\n2373,77000\n2373,77743\n2373,94958\n2373,101898\n2373,109278\n2373,115474\n2373,116517\n2373,118336\n2373,121794\n2373,121878\n2373,122604\n2373,122607\n2373,137992\n2373,139647\n2373,140688\n2373,158959\n2373,161512\n2373,170623\n2373,170629\n2373,170649\n2373,170655\n2373,170665\n2373,170668\n2373,207659\n2373,223947\n2373,228852\n2373,243432\n2373,243479\n2373,243877\n2373,247671\n2373,249139\n2373,261871\n2374,50\n2374,79\n2374,99\n2374,147\n2374,192\n2374,206\n2374,285\n2374,306\n2374,307\n2374,333\n2374,682\n2374,779\n2374,1181\n2374,1425\n2374,1512\n2374,23783\n2374,30331\n2374,68069\n2374,72439\n2375,1849\n2377,2051\n2378,2379\n2379,111\n2379,227\n2379,502\n2379,693\n2379,1011\n2379,1238\n2379,2379\n2379,7519\n2379,8327\n2379,8390\n2379,8412\n2379,8758\n2379,29524\n2379,65971\n2379,175162\n2379,175623\n2379,176932\n2379,198490\n2379,238779\n2379,248912\n2380,536\n2381,135\n2383,309\n2383,310\n2383,760\n2383,805\n2383,1631\n2384,104\n2384,609\n2384,1807\n2384,1882\n2384,1888\n2384,2105\n2384,2146\n2384,4220\n2385,1639\n2387,272\n2388,54\n2389,2390\n2389,3193\n2389,9267\n2389,21718\n2389,45168\n2389,69724\n2389,99985\n2389,103129\n2389,109005\n2391,247\n2392,151\n2393,850\n2394,149\n2394,158\n2394,406\n2394,779\n2395,107\n2395,1052\n2395,1177\n2396,1782\n2397,801\n2397,991\n2398,298\n2399,485\n2400,147\n2400,149\n2400,158\n2400,182\n2400,202\n2400,203\n2400,217\n2400,252\n2400,269\n2400,314\n2400,318\n2400,337\n2400,406\n2400,439\n2400,493\n2400,516\n2400,599\n2400,663\n2400,664\n2400,673\n2400,832\n2400,868\n2400,872\n2400,920\n2400,1001\n2400,1033\n2400,1181\n2400,1243\n2400,1370\n2400,1531\n2400,1782\n2400,1796\n2400,1801\n2400,2178\n2400,4545\n2400,41170\n2400,118336\n2401,2402\n2401,3861\n2401,7382\n2401,50373\n2401,117061\n2403,66\n2403,467\n2404,980\n2404,1070\n2404,1400\n2405,1240\n2406,1240\n2407,1370\n2408,104\n2408,332\n2408,483\n2408,760\n2408,1119\n2408,1635\n2408,3328\n2408,6556\n2408,27041\n2410,2411\n2410,6837\n2411,240\n2411,446\n2411,638\n2411,668\n2411,1285\n2411,2410\n2411,2411\n2411,2512\n2411,3574\n2411,4190\n2411,6552\n2411,9379\n2411,15964\n2411,21458\n2411,21841\n2411,25055\n2411,26041\n2411,26480\n2411,28305\n2411,44962\n2411,58413\n2411,76704\n2411,76971\n2411,82217\n2411,121373\n2411,153632\n2411,186632\n2411,200741\n2411,214687\n2412,247\n2413,417\n2414,65\n2414,217\n2414,314\n2414,467\n2414,868\n2415,358\n2415,2116\n2415,2416\n2415,2417\n2418,30\n2418,72\n2418,217\n2418,222\n2418,267\n2418,278\n2418,285\n2418,328\n2418,349\n2418,420\n2418,439\n2418,440\n2418,509\n2418,510\n2418,622\n2418,703\n2418,779\n2418,794\n2418,808\n2418,809\n2418,1179\n2418,1415\n2418,1417\n2418,1466\n2418,1590\n2418,1836\n2418,2116\n2418,2697\n2418,5469\n2418,19010\n2418,21442\n2418,22293\n2418,31207\n2418,32751\n2418,141912\n2419,134\n2419,200\n2419,636\n2419,704\n2419,714\n2419,1402\n2419,1511\n2419,1962\n2419,2205\n2419,2206\n2419,3069\n2419,4571\n2419,33424\n2419,88820\n2420,34\n2420,35\n2421,19\n2421,54\n2421,83\n2421,187\n2421,222\n2421,283\n2421,313\n2421,379\n2421,385\n2421,389\n2421,399\n2421,446\n2421,455\n2421,657\n2421,1019\n2421,1274\n2421,1310\n2421,1467\n2421,1571\n2421,1843\n2421,1871\n2421,2159\n2421,2224\n2421,2266\n2421,2290\n2421,2421\n2421,2424\n2421,2461\n2421,2646\n2421,2944\n2421,3507\n2421,3643\n2421,3646\n2421,3758\n2421,4127\n2421,4166\n2421,4234\n2421,4740\n2421,5034\n2421,5173\n2421,5178\n2421,5307\n2421,5326\n2421,6506\n2421,6789\n2421,7087\n2421,8140\n2421,13137\n2421,13556\n2421,13661\n2421,13868\n2421,14447\n2421,15694\n2421,15700\n2421,17273\n2421,18808\n2421,18914\n2421,18969\n2421,19130\n2421,19321\n2421,19349\n2421,25670\n2421,26094\n2421,26812\n2421,28671\n2421,30502\n2421,33287\n2421,37088\n2421,37762\n2421,37774\n2421,38893\n2421,39444\n2421,42032\n2421,42121\n2421,43216\n2421,46165\n2421,48960\n2421,50384\n2421,53789\n2421,54631\n2421,55265\n2421,57354\n2421,58488\n2421,62270\n2421,62496\n2421,62516\n2421,64155\n2421,65929\n2421,65975\n2421,66703\n2421,67153\n2421,67533\n2421,68198\n2421,68245\n2421,68716\n2421,68872\n2421,68920\n2421,68926\n2421,71620\n2421,74679\n2421,75045\n2421,75426\n2421,76077\n2421,76125\n2421,77111\n2421,79313\n2421,80460\n2421,80621\n2421,81077\n2421,81273\n2421,81993\n2421,82818\n2421,82834\n2421,82841\n2421,83340\n2421,83553\n2421,83579\n2421,83607\n2421,83745\n2421,84042\n2421,84046\n2421,84047\n2421,84049\n2421,84115\n2421,88667\n2421,90432\n2421,93271\n2421,93279\n2421,93636\n2421,94979\n2421,97599\n2421,98381\n2421,115474\n2421,119068\n2421,119624\n2421,123077\n2421,123916\n2421,126618\n2421,129608\n2421,131216\n2421,133464\n2421,140055\n2421,140832\n2421,141321\n2421,143725\n2421,145991\n2421,151358\n2421,153310\n2421,154792\n2421,156424\n2421,156488\n2421,164413\n2421,167058\n2421,170536\n2421,171794\n2421,173777\n2421,177294\n2421,178545\n2421,189465\n2421,194666\n2421,195208\n2421,212423\n2421,212698\n2421,213266\n2421,214235\n2421,217887\n2421,217968\n2421,218008\n2421,218845\n2421,219843\n2421,220641\n2421,220648\n2421,220655\n2421,222100\n2421,223684\n2421,223689\n2421,224777\n2421,227384\n2421,228358\n2421,228371\n2421,228429\n2421,228434\n2421,228557\n2421,231169\n2421,232178\n2421,232186\n2421,232245\n2421,232263\n2421,232659\n2421,232852\n2421,233336\n2421,236686\n2421,236709\n2421,236714\n2421,236740\n2421,236790\n2421,243327\n2421,243506\n2421,247239\n2421,247249\n2421,247458\n2421,247464\n2421,247484\n2421,247816\n2421,249875\n2421,251394\n2421,253360\n2421,255508\n2421,256961\n2421,259697\n2421,260861\n2421,261897\n2422,77\n2423,1539\n2424,19\n2424,54\n2424,135\n2424,187\n2424,222\n2424,278\n2424,283\n2424,313\n2424,379\n2424,385\n2424,389\n2424,455\n2424,660\n2424,685\n2424,781\n2424,784\n2424,911\n2424,1019\n2424,1539\n2424,1571\n2424,1618\n2424,1843\n2424,2159\n2424,2247\n2424,2253\n2424,2266\n2424,2421\n2424,2424\n2424,2553\n2424,2633\n2424,2646\n2424,2779\n2424,4799\n2424,5232\n2424,5306\n2424,5326\n2424,6506\n2424,6789\n2424,6828\n2424,7075\n2424,7092\n2424,7767\n2424,7768\n2424,9788\n2424,13276\n2424,15694\n2424,16412\n2424,17346\n2424,17810\n2424,17811\n2424,19349\n2424,26058\n2424,37088\n2424,56378\n2424,56395\n2424,70920\n2424,79655\n2424,79966\n2424,90076\n2424,95490\n2424,96383\n2424,98164\n2424,98890\n2424,104980\n2424,109391\n2424,109967\n2424,115474\n2424,118295\n2424,122636\n2424,125482\n2424,128319\n2424,130275\n2424,131224\n2424,131497\n2424,140055\n2424,147408\n2424,154330\n2424,164883\n2424,167340\n2424,190108\n2424,213089\n2424,225319\n2424,232546\n2424,234354\n2424,243506\n2424,249239\n2424,261858\n2425,957\n2425,1815\n2426,417\n2427,10\n2427,202\n2427,251\n2427,272\n2427,346\n2427,439\n2427,447\n2427,671\n2427,693\n2427,934\n2427,996\n2427,1033\n2427,1294\n2427,1877\n2427,2353\n2427,21442\n2427,33298\n2427,40497\n2428,192\n2429,1257\n2430,68\n2430,1400\n2431,50\n2432,304\n2433,2434\n2435,2436\n2436,87\n2436,111\n2436,292\n2436,356\n2436,441\n2436,442\n2436,673\n2436,801\n2436,852\n2436,911\n2436,1235\n2436,1276\n2436,1572\n2436,1653\n2436,1738\n2436,1844\n2436,1848\n2436,1973\n2436,2436\n2436,3474\n2436,4037\n2436,4039\n2436,4066\n2436,4771\n2436,5185\n2436,6415\n2436,6581\n2436,6880\n2436,13444\n2436,18444\n2436,18574\n2436,19635\n2436,20426\n2436,23634\n2436,23793\n2436,26051\n2436,26232\n2436,27030\n2436,31784\n2436,32819\n2436,33977\n2436,34111\n2436,34982\n2436,36821\n2436,37222\n2436,38329\n2436,44349\n2436,45523\n2436,45892\n2436,46028\n2436,48328\n2436,48417\n2436,54485\n2436,58953\n2436,68002\n2436,80477\n2436,93621\n2436,97336\n2436,97383\n2436,97738\n2436,99085\n2436,99775\n2436,101954\n2436,106831\n2436,106892\n2436,107077\n2436,112528\n2436,118485\n2436,118975\n2436,119011\n2436,119156\n2436,119514\n2436,122017\n2436,130778\n2436,134095\n2436,135981\n2436,145645\n2436,146353\n2436,155064\n2436,168890\n2436,170969\n2436,171821\n2436,175023\n2436,200424\n2436,204007\n2436,213187\n2436,214317\n2436,215225\n2436,244555\n2437,557\n2438,26\n2438,59\n2438,147\n2438,149\n2438,158\n2438,440\n2438,467\n2438,868\n2438,1796\n2438,3804\n2438,6695\n2438,21944\n2439,1711\n2440,707\n2441,536\n2442,2443\n2443,104\n2443,166388\n2443,166465\n2445,66\n2446,206\n2446,221305\n2447,900\n2448,875\n2449,175\n2450,364\n2450,1673\n2451,107\n2451,147\n2451,206\n2451,417\n2451,628\n2451,657\n2451,994\n2451,1458\n2451,2244\n2451,2775\n2451,21826\n2451,89035\n2451,98192\n2451,240174\n2452,302\n2452,849\n2452,862\n2452,1011\n2453,215\n2454,227\n2455,493\n2456,184\n2457,356\n2458,389\n2459,393\n2459,788\n2459,859\n2459,1531\n2460,56\n2460,63\n2460,336\n2460,360\n2460,390\n2460,485\n2460,631\n2460,673\n2460,676\n2460,685\n2460,733\n2460,838\n2460,843\n2460,849\n2460,875\n2460,900\n2460,911\n2460,918\n2460,972\n2460,1001\n2460,1014\n2460,1089\n2460,1096\n2460,1113\n2460,1116\n2460,1240\n2460,1402\n2460,1566\n2460,1607\n2460,1623\n2460,1653\n2460,1801\n2460,1844\n2460,1888\n2460,2244\n2460,2460\n2460,2580\n2460,2812\n2460,3507\n2460,3509\n2460,3513\n2460,3595\n2460,4190\n2460,4760\n2460,6068\n2460,6119\n2460,8055\n2460,9437\n2460,16201\n2460,18119\n2460,21442\n2460,22363\n2460,26041\n2460,28141\n2460,28306\n2460,52405\n2460,56567\n2460,80057\n2460,87224\n2460,95073\n2460,103747\n2460,117795\n2460,117808\n2460,118164\n2460,118809\n2460,128003\n2460,130144\n2460,131102\n2460,158288\n2460,169381\n2460,172224\n2460,172612\n2460,191403\n2460,193039\n2460,199199\n2460,230425\n2460,230426\n2460,231937\n2460,245889\n2460,245890\n2460,248615\n2460,254171\n2461,2421\n2462,25\n2462,26\n2462,59\n2462,60\n2462,114\n2462,115\n2462,118\n2462,885\n2462,887\n2462,9539\n2462,21944\n2463,557\n2463,954\n2463,1939\n2464,379\n2464,535\n2464,1345\n2464,1659\n2464,2496\n2465,32\n2466,143\n2467,65\n2468,47\n2468,2469\n2470,571\n2470,832\n2470,934\n2470,5250\n2472,192\n2472,1619\n2472,1623\n2472,17166\n2472,21938\n2473,1453\n2473,1572\n2473,1837\n2474,178\n2475,809\n2475,832\n2475,19010\n2475,22293\n2476,143\n2477,907\n2478,415\n2479,167\n2479,301\n2479,1133\n2479,1284\n2479,1479\n2479,1522\n2479,2480\n2479,2557\n2479,2979\n2479,3507\n2480,167\n2480,299\n2480,366\n2480,459\n2480,808\n2480,818\n2480,1241\n2480,1479\n2480,1575\n2480,1849\n2480,2252\n2480,2479\n2480,2557\n2480,2840\n2480,4286\n2480,4462\n2480,5255\n2480,13506\n2480,13593\n2480,14358\n2480,15277\n2480,20575\n2480,26876\n2480,30502\n2480,34253\n2480,36589\n2480,46631\n2480,52975\n2480,55898\n2480,67111\n2480,67555\n2480,72039\n2480,74498\n2480,76973\n2480,80060\n2480,80562\n2480,89754\n2480,93651\n2480,93736\n2480,93754\n2480,96685\n2480,96855\n2480,112362\n2480,112432\n2480,127158\n2480,128392\n2480,128761\n2480,130267\n2480,131969\n2480,133471\n2480,139984\n2480,144231\n2480,145728\n2480,153861\n2480,171271\n2480,175403\n2480,176816\n2480,185959\n2480,220597\n2480,225421\n2480,227349\n2480,231014\n2480,235904\n2480,236914\n2480,236918\n2480,236968\n2480,237326\n2480,246929\n2480,256924\n2480,261790\n2480,264430\n2481,264\n2481,1289\n2482,422\n2483,56\n2484,160\n2486,887\n2487,206\n2488,1313\n2489,493\n2490,136\n2490,137\n2490,1381\n2491,143\n2491,1052\n2492,2493\n2494,392\n2494,697\n2494,808\n2494,1240\n2494,1465\n2494,1949\n2495,649\n2497,2493\n2498,79\n2499,2334\n2500,2501\n2500,56240\n2500,58220\n2500,68069\n2500,79026\n2500,94562\n2500,98185\n2500,98407\n2500,98620\n2502,1370\n2503,72\n2503,83\n2503,119\n2503,134\n2503,278\n2503,285\n2503,347\n2503,364\n2503,372\n2503,389\n2503,417\n2503,442\n2503,455\n2503,525\n2503,626\n2503,795\n2503,805\n2503,907\n2503,972\n2503,1019\n2503,1085\n2503,1274\n2503,1298\n2503,1309\n2503,1363\n2503,1465\n2503,1467\n2503,1718\n2503,1756\n2503,1801\n2503,1881\n2503,2266\n2503,2286\n2503,2434\n2503,2553\n2503,2590\n2503,2646\n2503,2779\n2503,2784\n2503,3507\n2503,4172\n2503,4903\n2503,13575\n2503,141912\n2504,527\n2505,2506\n2507,83\n2507,222\n2507,385\n2507,389\n2507,455\n2507,536\n2507,781\n2507,1467\n2507,5906\n2507,7698\n2507,19443\n2508,312\n2508,875\n2509,518\n2509,873\n2509,874\n2509,968\n2509,1210\n2509,1231\n2509,1300\n2509,1326\n2509,1411\n2509,2006\n2509,2784\n2510,1203\n2511,37\n2511,87\n2511,120\n2511,126\n2511,195\n2511,207\n2511,240\n2511,299\n2511,346\n2511,439\n2511,442\n2511,455\n2511,509\n2511,535\n2511,604\n2511,626\n2511,671\n2511,676\n2511,801\n2511,918\n2511,972\n2511,1143\n2511,1240\n2511,1267\n2511,1293\n2511,1326\n2511,1370\n2511,1402\n2511,1522\n2511,2266\n2511,2334\n2511,2512\n2511,2605\n2511,2620\n2511,3474\n2511,75912\n2511,118336\n2511,127158\n2512,11\n2512,68\n2512,71\n2512,120\n2512,186\n2512,240\n2512,261\n2512,314\n2512,332\n2512,372\n2512,387\n2512,390\n2512,397\n2512,431\n2512,452\n2512,457\n2512,500\n2512,534\n2512,599\n2512,631\n2512,668\n2512,673\n2512,676\n2512,677\n2512,694\n2512,794\n2512,808\n2512,818\n2512,823\n2512,838\n2512,849\n2512,929\n2512,985\n2512,1001\n2512,1014\n2512,1082\n2512,1118\n2512,1285\n2512,1309\n2512,1353\n2512,1402\n2512,1417\n2512,1419\n2512,1466\n2512,1566\n2512,1608\n2512,1715\n2512,1796\n2512,1807\n2512,1808\n2512,1844\n2512,1888\n2512,1955\n2512,2411\n2512,2511\n2512,2775\n2512,2989\n2512,2991\n2512,3135\n2512,3504\n2512,3524\n2512,4066\n2512,4220\n2512,4514\n2512,5718\n2512,6824\n2512,7915\n2512,13478\n2512,15169\n2512,15183\n2512,15931\n2512,18681\n2512,19662\n2512,20757\n2512,25347\n2512,27041\n2512,27550\n2512,28553\n2512,30577\n2512,38281\n2512,56953\n2512,60908\n2512,75912\n2512,77773\n2512,82217\n2512,97536\n2512,124433\n2512,146001\n2512,152580\n2512,154508\n2512,179804\n2512,182546\n2512,185911\n2512,218509\n2512,245487\n2512,247136\n2513,563\n2513,581\n2514,346\n2515,72\n2515,83\n2515,119\n2515,134\n2515,248\n2515,278\n2515,285\n2515,364\n2515,372\n2515,389\n2515,442\n2515,455\n2515,525\n2515,626\n2515,972\n2515,1298\n2515,1309\n2515,1718\n2515,1756\n2515,2286\n2515,2553\n2515,2590\n2516,660\n2516,1724\n2517,217\n2517,455\n2517,1019\n2517,1417\n2518,1285\n2518,1888\n2519,1462\n2519,8537\n2520,366\n2520,758\n2521,609\n2521,859\n2522,1240\n2523,536\n2523,2319\n2524,202\n2524,586\n2525,2526\n2526,1796\n2526,2525\n2526,2775\n2526,6623\n2526,6837\n2526,63367\n2527,4\n2527,5\n2527,26\n2527,59\n2527,175\n2527,184\n2527,200\n2527,273\n2527,274\n2527,285\n2527,294\n2527,304\n2527,313\n2527,347\n2527,704\n2527,784\n2527,887\n2527,994\n2527,1149\n2527,1188\n2527,1305\n2527,1515\n2527,1571\n2527,1821\n2527,2367\n2527,2528\n2527,3069\n2527,19031\n2527,21944\n2528,147\n2528,149\n2528,158\n2528,336\n2528,493\n2528,2244\n2528,2552\n2528,24242\n2528,24725\n2528,27010\n2528,30431\n2528,89035\n2529,356\n2530,1235\n2530,1335\n2531,366\n2532,209\n2533,422\n2534,56\n2535,115\n2535,118\n2535,143\n2535,202\n2535,206\n2535,211\n2535,273\n2535,280\n2535,285\n2535,315\n2535,333\n2535,602\n2535,620\n2535,788\n2535,859\n2535,994\n2535,1068\n2535,1181\n2535,1983\n2535,1985\n2535,2528\n2535,2567\n2535,2867\n2535,2868\n2535,16331\n2535,23783\n2535,63502\n2536,718\n2536,893\n2537,344\n2537,415\n2537,1454\n2537,1711\n2537,1836\n2538,527\n2538,743\n2539,146\n2539,779\n2539,68069\n2539,86832\n2539,92476\n2540,50\n2540,79\n2540,178\n2540,192\n2540,538\n2540,718\n2540,1619\n2541,1240\n2542,433\n2542,918\n2543,596\n2543,1368\n2544,83\n2544,278\n2544,2784\n2544,28130\n2545,450\n2546,861\n2548,392\n2548,1146\n2548,1240\n2548,1465\n2548,1949\n2548,3260\n2549,1711\n2549,1836\n2550,217\n2551,83\n2552,147\n2552,158\n2552,493\n2552,682\n2552,1181\n2552,1243\n2552,2244\n2552,72439\n2553,54\n2553,83\n2553,313\n2553,536\n2553,634\n2553,657\n2553,1843\n2553,4109\n2553,5232\n2553,5306\n2553,57354\n2553,119840\n2553,131816\n2553,135043\n2553,140685\n2553,216248\n2553,218136\n2553,221547\n2554,581\n2555,422\n2556,68\n2556,79\n2556,111\n2556,158\n2556,167\n2556,178\n2556,192\n2556,264\n2556,301\n2556,393\n2556,406\n2556,435\n2556,479\n2556,493\n2556,516\n2556,604\n2556,838\n2556,1010\n2556,1014\n2556,1151\n2556,1181\n2556,1298\n2556,1370\n2556,1522\n2556,1531\n2556,1551\n2556,1659\n2556,2266\n2556,2557\n2556,2931\n2556,2979\n2556,3804\n2557,86\n2557,167\n2557,240\n2557,299\n2557,388\n2557,510\n2557,567\n2557,818\n2557,968\n2557,1010\n2557,1012\n2557,1013\n2557,1014\n2557,1241\n2557,1284\n2557,1479\n2557,1522\n2557,1627\n2557,1849\n2557,1853\n2557,2095\n2557,2252\n2557,2479\n2557,2480\n2557,2557\n2557,2840\n2557,2979\n2557,4159\n2557,4286\n2557,5061\n2557,6777\n2557,6853\n2557,7222\n2557,9527\n2557,13354\n2557,13480\n2557,13593\n2557,14597\n2557,16428\n2557,16874\n2557,20575\n2557,21289\n2557,24924\n2557,25171\n2557,29842\n2557,31231\n2557,31746\n2557,31784\n2557,34234\n2557,36662\n2557,39618\n2557,42433\n2557,42980\n2557,45080\n2557,47153\n2557,57036\n2557,59066\n2557,60564\n2557,68070\n2557,72726\n2557,73161\n2557,75296\n2557,83546\n2557,96206\n2557,98040\n2557,99626\n2557,113092\n2557,116618\n2557,119627\n2557,122451\n2557,125041\n2557,125369\n2557,131765\n2557,132788\n2557,133606\n2557,134148\n2557,145964\n2557,147548\n2557,158660\n2557,158668\n2557,159461\n2557,166707\n2557,183905\n2557,204019\n2557,204602\n2557,264726\n2558,1\n2558,206\n2559,147\n2559,1247\n2560,104\n2560,111\n2560,158\n2560,192\n2560,248\n2560,289\n2560,290\n2560,372\n2560,586\n2560,588\n2560,590\n2560,631\n2560,636\n2560,714\n2560,1181\n2560,1282\n2560,1462\n2560,1745\n2560,1955\n2560,2205\n2560,2443\n2560,3804\n2560,8180\n2560,8537\n2560,33424\n2560,94134\n2561,65\n2561,66\n2561,171\n2561,314\n2561,435\n2561,467\n2561,868\n2561,1243\n2561,6303\n2562,278\n2562,360\n2562,534\n2562,697\n2562,75912\n2563,22\n2563,861\n2563,2017\n2564,2436\n2565,596\n2565,1368\n2566,2567\n2567,2567\n2568,1821\n2569,302\n2570,247\n2570,1379\n2571,147\n2571,158\n2572,41\n2572,104\n2572,289\n2572,290\n2572,298\n2572,304\n2572,356\n2572,417\n2572,534\n2572,573\n2572,609\n2572,626\n2572,677\n2572,685\n2572,714\n2572,715\n2572,782\n2572,852\n2572,862\n2572,999\n2572,1085\n2572,1513\n2572,1564\n2572,1580\n2572,1608\n2572,2085\n2572,2105\n2572,2205\n2572,2253\n2572,2296\n2572,2572\n2572,2747\n2572,2775\n2572,2874\n2572,3563\n2572,3623\n2572,4222\n2572,4532\n2572,5935\n2572,7194\n2572,9180\n2572,14820\n2572,16668\n2572,19755\n2572,21742\n2572,22057\n2572,22093\n2572,23619\n2572,26322\n2572,32991\n2572,33424\n2572,33567\n2572,33702\n2572,38822\n2572,42581\n2572,44725\n2572,49535\n2572,50739\n2572,51972\n2572,55252\n2572,56377\n2572,69119\n2572,72955\n2572,74547\n2572,75912\n2572,78792\n2572,80405\n2572,80470\n2572,82114\n2572,82618\n2572,91791\n2572,94134\n2572,98259\n2572,103765\n2572,113380\n2572,119958\n2572,120926\n2572,121562\n2572,122622\n2572,122796\n2572,122955\n2572,125472\n2572,128130\n2572,128420\n2572,133974\n2572,145456\n2572,146394\n2572,150527\n2572,158785\n2572,165048\n2572,172974\n2572,175792\n2572,175898\n2572,178576\n2572,185874\n2572,185877\n2572,189435\n2572,198303\n2572,212692\n2572,213968\n2572,218050\n2572,221068\n2572,252816\n2572,252823\n2572,259621\n2573,2574\n2574,175\n2574,63274\n2574,133602\n2574,136368\n2574,142014\n2574,142074\n2575,919\n2576,392\n2577,195\n2578,868\n2579,1392\n2579,1745\n2581,1298\n2581,1849\n2582,87\n2582,595\n2582,1151\n2582,1453\n2582,1572\n2582,2697\n2582,3538\n2583,467\n2583,1659\n2584,34\n2584,35\n2585,66\n2585,467\n2585,571\n2585,868\n2586,647\n2587,72\n2587,87\n2587,104\n2587,111\n2587,248\n2587,264\n2587,323\n2587,467\n2587,479\n2587,636\n2587,647\n2587,862\n2587,991\n2587,1052\n2587,1188\n2587,1267\n2587,1287\n2587,1332\n2587,1579\n2587,1659\n2587,1707\n2587,1939\n2587,2205\n2587,2206\n2587,2605\n2587,2744\n2587,9005\n2588,167\n2588,299\n2588,1522\n2588,2083\n2588,5301\n2588,128922\n2589,1962\n2590,68\n2590,240\n2590,356\n2590,387\n2590,397\n2590,676\n2590,677\n2590,685\n2590,693\n2590,843\n2590,852\n2590,911\n2590,1133\n2590,1285\n2590,1294\n2590,1888\n2590,2580\n2590,2590\n2590,2591\n2590,2620\n2590,4220\n2590,4494\n2590,6260\n2590,6552\n2590,7155\n2590,7348\n2590,12878\n2590,14507\n2590,17906\n2590,24906\n2590,28963\n2590,28966\n2590,29692\n2590,29773\n2590,30751\n2590,31005\n2590,32779\n2590,34129\n2590,35694\n2590,43247\n2590,45067\n2590,45114\n2590,46165\n2590,47173\n2590,48475\n2590,49049\n2590,55198\n2590,56949\n2590,57638\n2590,58975\n2590,59275\n2590,59743\n2590,62221\n2590,63404\n2590,63974\n2590,64221\n2590,66297\n2590,75209\n2590,76914\n2590,82114\n2590,82703\n2590,82744\n2590,87708\n2590,95098\n2590,97517\n2590,100218\n2590,104981\n2590,107690\n2590,112546\n2590,113353\n2590,114676\n2590,118419\n2590,123035\n2590,123050\n2590,124265\n2590,134600\n2590,136575\n2590,163460\n2590,163474\n2590,163784\n2590,163874\n2590,164353\n2590,165121\n2590,167731\n2590,169071\n2590,171030\n2590,179343\n2590,179344\n2590,179746\n2590,186694\n2590,187442\n2590,189153\n2590,190362\n2590,191973\n2590,192114\n2590,193001\n2590,193156\n2590,195524\n2590,202514\n2590,205671\n2590,224845\n2590,224851\n2590,226253\n2590,241008\n2590,242499\n2590,247195\n2590,249060\n2590,252337\n2590,261550\n2591,2590\n2592,1146\n2593,1623\n2593,4691\n2594,136\n2595,46\n2595,292\n2595,444\n2595,567\n2595,605\n2595,615\n2595,744\n2595,745\n2595,907\n2595,968\n2595,1010\n2595,1117\n2595,1122\n2595,1124\n2595,1160\n2595,1231\n2595,1241\n2595,1298\n2595,1300\n2595,1479\n2595,1837\n2595,2083\n2595,2191\n2595,2372\n2595,3630\n2595,3756\n2595,5662\n2596,104\n2596,225\n2599,83\n2599,178\n2599,259\n2600,557\n2600,1127\n2601,5101\n2602,366\n2602,500\n2603,83\n2604,581\n2605,87\n2605,182\n2605,256\n2605,397\n2605,452\n2605,457\n2605,599\n2605,604\n2605,685\n2605,843\n2605,849\n2605,852\n2605,918\n2605,1011\n2605,1014\n2605,1119\n2605,1130\n2605,1298\n2605,1566\n2605,1579\n2605,1663\n2605,1844\n2605,1893\n2605,1973\n2605,2605\n2605,3507\n2605,4039\n2605,4190\n2605,4294\n2605,6695\n2605,6824\n2605,6904\n2605,14674\n2605,215874\n2607,182\n2607,349\n2607,668\n2607,2607\n2607,2608\n2607,2621\n2607,3185\n2607,3507\n2607,4003\n2607,6053\n2607,6583\n2607,6824\n2607,8266\n2607,15388\n2607,16582\n2607,17922\n2607,20102\n2607,28272\n2607,36677\n2607,42276\n2607,45387\n2607,45866\n2607,46741\n2607,47720\n2607,48540\n2607,48541\n2607,48542\n2607,48543\n2607,48544\n2607,48545\n2607,51885\n2607,59453\n2607,72210\n2607,168622\n2607,216553\n2607,217356\n2607,243419\n2607,256368\n2608,2607\n2609,147\n2609,149\n2609,158\n2609,206\n2609,2244\n2609,73906\n2609,118336\n2610,302\n2610,861\n2610,893\n2610,1298\n2610,2116\n2610,4453\n2610,4823\n2611,247\n2612,1381\n2613,143\n2615,34\n2615,35\n2615,46\n2615,313\n2615,356\n2615,615\n2615,634\n2615,968\n2615,1313\n2615,1718\n2615,2224\n2615,2646\n2615,5326\n2616,158\n2616,206\n2616,406\n2616,760\n2616,1955\n2616,2617\n2616,2626\n2618,207\n2619,34\n2619,35\n2619,120\n2619,222\n2619,283\n2619,313\n2619,332\n2619,379\n2619,455\n2620,71\n2620,104\n2620,240\n2620,261\n2620,446\n2620,590\n2620,599\n2620,631\n2620,677\n2620,685\n2620,760\n2620,784\n2620,805\n2620,823\n2620,843\n2620,1001\n2620,1285\n2620,1359\n2620,1505\n2620,1564\n2620,1888\n2620,1955\n2620,2285\n2620,2511\n2620,2512\n2620,2590\n2620,2620\n2620,2747\n2620,2838\n2620,2982\n2620,2989\n2620,2991\n2620,3457\n2620,3610\n2620,4190\n2620,5412\n2620,5545\n2620,5563\n2620,5718\n2620,6800\n2620,8763\n2620,15952\n2620,17848\n2620,23171\n2620,26781\n2620,29310\n2620,32576\n2620,32597\n2620,37547\n2620,37816\n2620,39045\n2620,41247\n2620,41395\n2620,50062\n2620,50068\n2620,62482\n2620,66297\n2620,68310\n2620,79660\n2620,105207\n2620,106214\n2620,109808\n2620,116543\n2620,117231\n2620,120694\n2620,122795\n2620,124517\n2620,127158\n2620,127771\n2620,127802\n2620,139854\n2620,147416\n2620,147419\n2620,147420\n2620,147425\n2620,147428\n2620,147431\n2620,147435\n2620,147439\n2620,147443\n2620,147445\n2620,147448\n2620,147452\n2620,147457\n2620,150054\n2620,153190\n2620,154573\n2620,207659\n2620,230460\n2620,239795\n2620,241044\n2620,246020\n2620,258887\n2622,733\n2623,83\n2624,219\n2625,934\n2625,973\n2625,1085\n2625,1298\n2625,1849\n2625,2979\n2625,32784\n2626,4039\n2627,1433\n2628,151\n2628,272\n2628,304\n2628,306\n2628,307\n2628,422\n2628,726\n2628,736\n2628,827\n2628,1127\n2628,2367\n2628,3582\n2628,3999\n2628,9457\n2629,364\n2630,731\n2631,10\n2632,358\n2633,278\n2634,192\n2634,1113\n2635,68\n2635,186\n2635,7155\n2636,346\n2636,932\n2636,1085\n2637,206\n2638,2105\n2639,1984\n2640,1400\n2641,726\n2642,301\n2642,444\n2642,968\n2643,710\n2644,805\n2645,34\n2645,35\n2645,2646\n2646,19\n2646,34\n2646,35\n2646,54\n2646,83\n2646,107\n2646,222\n2646,278\n2646,292\n2646,313\n2646,332\n2646,336\n2646,379\n2646,385\n2646,389\n2646,399\n2646,431\n2646,467\n2646,477\n2646,536\n2646,589\n2646,634\n2646,635\n2646,650\n2646,657\n2646,660\n2646,682\n2646,693\n2646,694\n2646,707\n2646,745\n2646,784\n2646,808\n2646,814\n2646,852\n2646,875\n2646,890\n2646,891\n2646,911\n2646,949\n2646,969\n2646,996\n2646,1011\n2646,1138\n2646,1242\n2646,1274\n2646,1313\n2646,1512\n2646,1571\n2646,1580\n2646,1623\n2646,1644\n2646,1718\n2646,1724\n2646,1756\n2646,1843\n2646,1881\n2646,1996\n2646,2159\n2646,2168\n2646,2224\n2646,2266\n2646,2315\n2646,2421\n2646,2424\n2646,2553\n2646,2711\n2646,2775\n2646,2944\n2646,3115\n2646,3455\n2646,3623\n2646,3672\n2646,3686\n2646,3729\n2646,3866\n2646,3933\n2646,3951\n2646,4039\n2646,4213\n2646,4222\n2646,4223\n2646,4234\n2646,4238\n2646,4579\n2646,5034\n2646,5326\n2646,5704\n2646,5933\n2646,5992\n2646,6059\n2646,6064\n2646,6068\n2646,6506\n2646,7008\n2646,7385\n2646,7698\n2646,7959\n2646,8554\n2646,9752\n2646,13657\n2646,14572\n2646,14612\n2646,14636\n2646,15451\n2646,16906\n2646,18265\n2646,18654\n2646,18831\n2646,18894\n2646,19286\n2646,19443\n2646,19590\n2646,19854\n2646,20417\n2646,22420\n2646,22423\n2646,22424\n2646,23407\n2646,23518\n2646,26034\n2646,26282\n2646,28130\n2646,30331\n2646,32820\n2646,34619\n2646,37771\n2646,39537\n2646,39561\n2646,40099\n2646,40637\n2646,40829\n2646,41281\n2646,41890\n2646,44329\n2646,45511\n2646,46238\n2646,47439\n2646,48082\n2646,48639\n2646,49170\n2646,49173\n2646,49551\n2646,49632\n2646,49715\n2646,50059\n2646,50161\n2646,50886\n2646,57354\n2646,58453\n2646,62539\n2646,63132\n2646,64514\n2646,66703\n2646,67877\n2646,68097\n2646,69954\n2646,70989\n2646,72439\n2646,76186\n2646,77569\n2646,77759\n2646,77821\n2646,77832\n2646,79503\n2646,79517\n2646,79966\n2646,82029\n2646,82868\n2646,84860\n2646,90299\n2646,92099\n2646,93092\n2646,98453\n2646,102503\n2646,102504\n2646,102573\n2646,103193\n2646,103630\n2646,103716\n2646,105021\n2646,107100\n2646,110533\n2646,110584\n2646,110606\n2646,110625\n2646,115474\n2646,122130\n2646,126764\n2646,127148\n2646,129708\n2646,129790\n2646,131224\n2646,133830\n2646,134530\n2646,136674\n2646,137797\n2646,140755\n2646,143504\n2646,144268\n2646,145659\n2646,146482\n2646,146484\n2646,147447\n2646,147583\n2646,148041\n2646,149462\n2646,152939\n2646,154004\n2646,154527\n2646,154782\n2646,163433\n2646,169341\n2646,169595\n2646,170608\n2646,172660\n2646,173544\n2646,173808\n2646,175476\n2646,176325\n2646,176980\n2646,177074\n2646,177491\n2646,179671\n2646,181764\n2646,188791\n2646,190108\n2646,195716\n2646,198176\n2646,215987\n2646,219351\n2646,221337\n2646,228960\n2646,229782\n2646,230496\n2646,230911\n2646,236740\n2646,236900\n2646,242569\n2646,244595\n2646,244765\n2646,247214\n2646,247225\n2646,247721\n2646,247811\n2646,247871\n2646,248046\n2646,249286\n2646,249374\n2646,249650\n2646,251107\n2646,251294\n2646,251739\n2646,258398\n2646,258752\n2646,258964\n2646,262449\n2647,801\n2648,1807\n2649,313\n2650,2617\n2650,2651\n2650,3261\n2650,15923\n2650,16028\n2650,16145\n2650,16536\n2650,17718\n2650,18075\n2650,29908\n2650,30280\n2650,42183\n2650,42531\n2650,45938\n2650,46591\n2650,47599\n2650,55987\n2650,57399\n2650,59512\n2650,63197\n2650,65567\n2650,68085\n2650,68479\n2650,69514\n2650,75265\n2650,75504\n2650,76649\n2650,79787\n2650,81370\n2650,82489\n2650,83090\n2650,83781\n2650,84317\n2650,84326\n2650,84911\n2650,85386\n2650,86920\n2650,88020\n2650,88163\n2650,88227\n2650,88800\n2650,88917\n2650,89112\n2650,89201\n2650,89245\n2650,89294\n2650,89883\n2650,89928\n2650,91189\n2650,91632\n2650,92374\n2650,92445\n2650,92470\n2650,93021\n2650,93458\n2650,94453\n2650,94992\n2650,95041\n2650,95099\n2650,96111\n2650,96572\n2650,98506\n2650,98577\n2650,98713\n2650,98973\n2650,102320\n2650,103004\n2650,104805\n2650,104822\n2650,104999\n2650,105137\n2650,106696\n2650,106718\n2650,106900\n2650,107166\n2650,107264\n2650,108100\n2650,108300\n2650,109785\n2650,110109\n2650,111659\n2650,112022\n2650,112142\n2650,112749\n2650,114171\n2650,114328\n2650,114672\n2650,117262\n2650,117542\n2650,117551\n2650,119216\n2650,120270\n2650,122346\n2650,123080\n2650,123438\n2650,123530\n2650,124282\n2650,125235\n2650,126212\n2650,127585\n2650,127622\n2650,129043\n2650,129133\n2650,129159\n2650,129201\n2650,129223\n2650,129357\n2650,130722\n2650,131139\n2650,131470\n2650,131533\n2650,132381\n2650,132713\n2650,134527\n2650,141505\n2650,144622\n2650,144715\n2650,145271\n2650,146948\n2650,147304\n2650,150143\n2650,150313\n2650,150967\n2650,151896\n2650,151903\n2650,151909\n2650,151951\n2650,152883\n2650,153781\n2650,154122\n2650,172757\n2650,184573\n2650,187498\n2650,193914\n2650,194005\n2650,197904\n2650,206048\n2650,206724\n2650,207915\n2650,212252\n2650,212392\n2650,213609\n2650,215023\n2650,216962\n2650,219028\n2650,219947\n2650,220798\n2650,223618\n2650,223619\n2650,227208\n2650,227737\n2650,228777\n2650,231719\n2650,233193\n2650,233243\n2650,233800\n2650,233862\n2650,237157\n2650,237970\n2650,239056\n2650,240590\n2650,241941\n2650,242483\n2650,242671\n2650,243274\n2650,243578\n2650,246345\n2650,247166\n2650,248531\n2650,248935\n2650,249019\n2650,249449\n2650,250263\n2650,250430\n2650,252981\n2650,259216\n2650,260694\n2650,261415\n2650,261486\n2650,261532\n2650,264565\n2650,264785\n2650,264826\n2652,22\n2652,65\n2652,120\n2652,285\n2652,438\n2652,599\n2652,602\n2652,660\n2652,795\n2652,868\n2652,1122\n2652,1454\n2652,1803\n2652,1849\n2652,2274\n2652,2646\n2652,2699\n2652,5961\n2653,178\n2654,1175\n2655,289\n2655,290\n2655,94134\n2656,240\n2656,818\n2656,17309\n2657,372\n2657,932\n2657,1082\n2657,1479\n2658,596\n2659,752\n2659,1210\n2660,1127\n2661,355\n2662,483\n2663,2372\n2664,1287\n2665,192\n2665,211\n2665,949\n2665,1509\n2666,493\n2666,1433\n2667,2017\n2667,2668\n2668,6998\n2668,19676\n2668,32782\n2669,358\n2670,2671\n2673,2674\n2673,16153\n2674,4\n2674,5\n2674,24\n2674,26\n2674,59\n2674,60\n2674,116\n2674,220\n2674,885\n2674,887\n2674,967\n2674,994\n2674,1235\n2674,1335\n2674,2157\n2674,2673\n2674,2674\n2674,2893\n2674,3794\n2674,4054\n2674,4114\n2674,4185\n2674,5700\n2674,5713\n2674,5803\n2674,5809\n2674,5889\n2674,6621\n2674,7530\n2674,8155\n2674,8167\n2674,13662\n2674,15229\n2674,15378\n2674,15742\n2674,16153\n2674,16418\n2674,18696\n2674,20111\n2674,20375\n2674,21944\n2674,22643\n2674,25636\n2674,26144\n2674,26153\n2674,28995\n2674,29002\n2674,29386\n2674,30352\n2674,30356\n2674,30360\n2674,30377\n2674,30379\n2674,30382\n2674,30384\n2674,30471\n2674,30529\n2674,30558\n2674,30574\n2674,31270\n2674,31333\n2674,33331\n2674,34060\n2674,34805\n2674,35510\n2674,40793\n2674,41974\n2674,43667\n2674,44244\n2674,51260\n2674,66784\n2674,68440\n2674,72626\n2675,2105\n2676,175\n2676,1773\n2677,178\n2677,2677\n2677,2844\n2677,2854\n2677,2869\n2677,2876\n2677,2887\n2677,2894\n2677,3000\n2677,3019\n2677,4689\n2677,4699\n2677,5728\n2677,6109\n2677,6110\n2677,6533\n2677,7303\n2677,8510\n2677,9294\n2677,14511\n2677,14827\n2677,15313\n2677,17220\n2677,18035\n2677,18747\n2677,18748\n2677,19904\n2677,22053\n2677,22077\n2677,22083\n2677,22148\n2677,22998\n2677,23855\n2677,25345\n2677,25346\n2677,27481\n2677,29866\n2677,30008\n2677,32591\n2677,32773\n2677,33325\n2677,35497\n2677,35575\n2677,37211\n2677,38985\n2677,43839\n2677,48278\n2677,51979\n2677,62609\n2677,66394\n2677,66678\n2677,71801\n2677,75050\n2677,76060\n2677,76943\n2677,77529\n2677,83515\n2677,83638\n2677,93338\n2677,95539\n2677,97665\n2677,102578\n2677,109627\n2677,110336\n2677,110338\n2677,110346\n2677,110884\n2677,118622\n2677,119694\n2677,122160\n2677,122713\n2677,122715\n2677,123516\n2677,123517\n2677,123645\n2677,124944\n2677,127982\n2677,130763\n2677,135502\n2677,136787\n2677,136802\n2677,145312\n2677,147046\n2677,147047\n2677,150865\n2677,151075\n2677,155667\n2677,156246\n2677,158289\n2677,164769\n2677,164770\n2677,167071\n2677,170897\n2677,177066\n2677,177067\n2677,183526\n2677,187422\n2677,188261\n2677,192747\n2677,194548\n2677,212752\n2677,214142\n2677,214849\n2677,216029\n2677,225902\n2677,225924\n2677,226370\n2677,229280\n2677,229711\n2677,232921\n2677,239769\n2677,239773\n2677,241655\n2677,242620\n2677,242621\n2677,247664\n2677,248020\n2677,251629\n2677,251636\n2677,255129\n2677,257728\n2677,258301\n2677,258304\n2677,258315\n2677,258319\n2677,258408\n2677,258738\n2677,258746\n2677,259897\n2677,259903\n2677,259904\n2677,259906\n2677,259909\n2677,260553\n2677,260884\n2677,263977\n2677,263979\n2677,264405\n2677,264483\n2677,264490\n2678,107\n2678,795\n2678,1188\n2679,138\n2680,2681\n2680,31977\n2680,34825\n2680,35163\n2680,51117\n2680,63082\n2680,64439\n2680,68981\n2680,70815\n2680,76630\n2680,77195\n2680,77829\n2680,80762\n2680,82482\n2680,83440\n2680,83767\n2680,84391\n2680,87140\n2682,251\n2683,440\n2684,809\n2685,264\n2685,1509\n2685,1551\n2686,72\n2687,313\n2687,685\n2687,1151\n2688,718\n2689,3\n2689,37\n2689,50\n2689,68\n2689,104\n2689,106\n2689,111\n2689,120\n2689,140\n2689,202\n2689,203\n2689,225\n2689,240\n2689,283\n2689,301\n2689,302\n2689,312\n2689,326\n2689,349\n2689,372\n2689,388\n2689,389\n2689,435\n2689,455\n2689,503\n2689,509\n2689,518\n2689,536\n2689,557\n2689,592\n2689,697\n2689,704\n2689,779\n2689,801\n2689,818\n2689,873\n2689,874\n2689,875\n2689,907\n2689,919\n2689,932\n2689,934\n2689,949\n2689,968\n2689,1001\n2689,1010\n2689,1068\n2689,1082\n2689,1140\n2689,1143\n2689,1167\n2689,1175\n2689,1177\n2689,1210\n2689,1231\n2689,1240\n2689,1241\n2689,1282\n2689,1289\n2689,1298\n2689,1300\n2689,1309\n2689,1326\n2689,1332\n2689,1359\n2689,1368\n2689,1370\n2689,1411\n2689,1452\n2689,1454\n2689,1465\n2689,1467\n2689,1479\n2689,1511\n2689,1515\n2689,1522\n2689,1579\n2689,1590\n2689,1722\n2689,1789\n2689,1805\n2689,1837\n2689,1849\n2689,1877\n2689,1955\n2689,1985\n2689,2006\n2689,2045\n2689,2083\n2689,2178\n2689,2205\n2689,2206\n2689,2480\n2689,2557\n2689,2590\n2689,2620\n2689,2784\n2689,2979\n2689,3069\n2689,3193\n2689,3218\n2689,3260\n2689,3474\n2689,3538\n2689,3612\n2689,3999\n2689,4545\n2689,4637\n2689,4771\n2689,5405\n2689,5440\n2689,5662\n2689,5718\n2689,6424\n2689,6955\n2689,7270\n2690,195\n2691,217\n2691,536\n2692,19\n2692,808\n2693,252\n2694,397\n2695,682\n2696,595\n2696,1151\n2696,1453\n2696,1572\n2696,2697\n2696,3538\n2698,4\n2698,5\n2699,87\n2699,119\n2699,599\n2699,808\n2699,852\n2699,919\n2699,1240\n2699,1293\n2699,1559\n2699,1860\n2699,2699\n2699,3507\n2699,7768\n2700,1414\n2701,2701\n2701,3474\n2702,275\n2703,887\n2704,1021\n2704,1096\n2704,3555\n2704,55712\n2704,95159\n2704,173258\n2704,185121\n2705,151\n2706,640\n2707,366\n2707,3328\n2708,503\n2708,1257\n2708,1282\n2708,1732\n2709,83\n2710,30\n2710,50\n2710,269\n2710,328\n2710,333\n2710,406\n2710,435\n2710,439\n2710,440\n2710,622\n2710,794\n2710,1033\n2710,1179\n2710,1305\n2710,1415\n2710,1515\n2710,1531\n2710,141912\n2711,34\n2711,35\n2711,250\n2711,1684\n2711,2224\n2711,2646\n2711,5326\n2712,117\n2713,86\n2713,151\n2713,273\n2713,274\n2713,292\n2713,483\n2713,581\n2713,783\n2713,1127\n2713,1130\n2713,1284\n2713,1345\n2713,2168\n2713,2373\n2713,2744\n2715,1858\n2716,1860\n2717,34\n2717,35\n2718,2719\n2719,2719\n2720,26\n2720,59\n2720,138\n2720,2674\n2720,16153\n2721,1282\n2722,2723\n2722,105527\n2722,105865\n2722,225245\n2724,200\n2725,178\n2726,87\n2726,140\n2726,323\n2726,479\n2726,515\n2726,516\n2726,647\n2726,872\n2726,991\n2726,1052\n2726,1102\n2726,1192\n2726,1267\n2726,1287\n2726,1289\n2726,1381\n2726,1509\n2726,1579\n2726,1659\n2726,1663\n2726,1973\n2726,2605\n2726,2744\n2726,3507\n2726,3695\n2726,4771\n2727,104\n2727,254\n2727,557\n2727,953\n2727,954\n2727,1939\n2727,10318\n2728,22\n2728,500\n2728,718\n2728,972\n2729,240\n2729,390\n2729,1085\n2729,1203\n2729,1285\n2729,1309\n2730,315\n2731,1143\n2732,22\n2732,65\n2732,211\n2732,269\n2732,809\n2732,818\n2732,861\n2732,893\n2732,1052\n2732,1374\n2732,1556\n2732,1803\n2732,2017\n2732,141912\n2734,2735\n2736,261\n2736,1619\n2736,2737\n2736,3089\n2736,4771\n2738,32\n2738,392\n2739,647\n2740,344\n2741,50\n2741,147\n2741,158\n2741,406\n2742,647\n2743,344\n2744,425\n2746,1140\n2746,6955\n2747,46\n2747,167\n2747,326\n2747,372\n2747,390\n2747,518\n2747,522\n2747,534\n2747,573\n2747,589\n2747,715\n2747,765\n2747,775\n2747,783\n2747,862\n2747,1045\n2747,1085\n2747,1117\n2747,1119\n2747,1133\n2747,1298\n2747,1544\n2747,1580\n2747,1853\n2747,2092\n2747,2148\n2747,2193\n2747,2572\n2747,2595\n2747,2620\n2747,2747\n2747,3623\n2747,4222\n2747,4308\n2747,5186\n2747,5299\n2747,5587\n2747,5605\n2747,6004\n2747,6068\n2747,6474\n2747,7194\n2747,8107\n2747,13524\n2747,14011\n2747,14038\n2747,14236\n2747,14636\n2747,14747\n2747,15259\n2747,15667\n2747,16463\n2747,16955\n2747,18299\n2747,19525\n2747,20535\n2747,20813\n2747,22268\n2747,28818\n2747,31802\n2747,34721\n2747,34933\n2747,37771\n2747,38972\n2747,38977\n2747,39618\n2747,58820\n2747,62759\n2747,64479\n2747,66455\n2747,68812\n2747,75144\n2747,75912\n2747,83301\n2747,88341\n2747,91279\n2747,96685\n2747,98279\n2747,99137\n2747,101730\n2747,103982\n2747,106196\n2747,113362\n2747,113595\n2747,115960\n2747,116102\n2747,116956\n2747,119577\n2747,119962\n2747,134504\n2747,135928\n2747,136182\n2747,138114\n2747,141784\n2747,145316\n2747,150843\n2747,156907\n2747,157298\n2747,172502\n2748,723\n2748,1267\n2749,809\n2749,2750\n2750,10\n2750,2749\n2750,2750\n2750,3088\n2750,3091\n2750,4163\n2750,9553\n2750,14571\n2750,19618\n2750,25121\n2750,26161\n2750,27282\n2750,27807\n2750,30049\n2750,36961\n2750,39408\n2750,42785\n2750,46742\n2750,47387\n2750,55686\n2750,72681\n2750,87275\n2750,91220\n2750,109863\n2750,120119\n2750,136815\n2750,151013\n2750,151225\n2750,152064\n2750,152119\n2750,160959\n2750,178456\n2750,178739\n2750,179623\n2750,180085\n2750,184435\n2750,186452\n2750,221386\n2750,224088\n2750,225865\n2750,228955\n2750,230457\n2750,237691\n2750,248881\n2750,251362\n2750,256608\n2750,257480\n2751,861\n2751,2116\n2752,50\n2752,149\n2752,158\n2752,622\n2752,3507\n2752,141912\n2753,66\n2754,875\n2755,408\n2756,459\n2756,4223\n2757,1058\n2758,87\n2758,390\n2758,615\n2758,1143\n2758,1801\n2758,2296\n2758,2572\n2758,13661\n2758,75912\n2759,106\n2760,2367\n2761,87\n2761,344\n2761,1143\n2761,1146\n2761,1454\n2761,1711\n2761,1836\n2762,302\n2762,579\n2762,2116\n2763,1509\n2764,779\n2765,1235\n2765,1335\n2765,21944\n2766,41\n2766,294\n2766,631\n2767,86\n2768,195\n2769,66\n2769,1433\n2770,346\n2771,943\n2771,1454\n2772,147\n2772,483\n2773,130\n2773,1007\n2774,2775\n2775,10\n2775,24\n2775,40\n2775,41\n2775,54\n2775,135\n2775,175\n2775,217\n2775,240\n2775,261\n2775,294\n2775,332\n2775,364\n2775,446\n2775,500\n2775,575\n2775,609\n2775,612\n2775,631\n2775,660\n2775,682\n2775,693\n2775,694\n2775,715\n2775,749\n2775,784\n2775,801\n2775,805\n2775,911\n2775,969\n2775,996\n2775,1082\n2775,1118\n2775,1149\n2775,1172\n2775,1203\n2775,1220\n2775,1222\n2775,1242\n2775,1285\n2775,1309\n2775,1328\n2775,1353\n2775,1359\n2775,1368\n2775,1417\n2775,1512\n2775,1696\n2775,1807\n2775,1849\n2775,1888\n2775,1955\n2775,2097\n2775,2105\n2775,2211\n2775,2253\n2775,2315\n2775,2373\n2775,2512\n2775,2572\n2775,2646\n2775,2775\n2775,2944\n2775,3087\n2775,3115\n2775,3385\n2775,3582\n2775,3619\n2775,3623\n2775,3695\n2775,3709\n2775,3964\n2775,4066\n2775,4115\n2775,4266\n2775,4303\n2775,5130\n2775,5268\n2775,5935\n2775,5992\n2775,6506\n2775,6652\n2775,6724\n2775,6770\n2775,6853\n2775,7087\n2775,8592\n2775,9467\n2775,12727\n2775,12752\n2775,13304\n2775,13563\n2775,14133\n2775,14597\n2775,14833\n2775,14907\n2775,14925\n2775,15587\n2775,16103\n2775,16410\n2775,16562\n2775,17116\n2775,17692\n2775,17890\n2775,18327\n2775,18965\n2775,19484\n2775,19881\n2775,19901\n2775,20419\n2775,20876\n2775,21071\n2775,21589\n2775,22177\n2775,22428\n2775,22839\n2775,24690\n2775,24887\n2775,24934\n2775,25416\n2775,26302\n2775,26848\n2775,26880\n2775,27500\n2775,28114\n2775,28553\n2775,28562\n2775,29042\n2775,29065\n2775,29872\n2775,30304\n2775,30568\n2775,30733\n2775,31763\n2775,32751\n2775,32903\n2775,34384\n2775,34893\n2775,34960\n2775,36820\n2775,36841\n2775,38317\n2775,38325\n2775,38466\n2775,38845\n2775,38939\n2775,39290\n2775,39684\n2775,40686\n2775,41178\n2775,41243\n2775,41980\n2775,42140\n2775,42691\n2775,42918\n2775,44162\n2775,45278\n2775,45610\n2775,45647\n2775,45886\n2775,48409\n2775,50285\n2775,55055\n2775,57351\n2775,57875\n2775,59123\n2775,61093\n2775,63005\n2775,63410\n2775,63414\n2775,63538\n2775,64085\n2775,65854\n2775,67534\n2775,68867\n2775,69967\n2775,70252\n2775,71048\n2775,72439\n2775,72598\n2775,74540\n2775,75806\n2775,75829\n2775,75972\n2775,77569\n2775,77808\n2775,77831\n2775,79860\n2775,79870\n2775,80111\n2775,80186\n2775,80755\n2775,81043\n2775,81681\n2775,81832\n2775,82268\n2775,83287\n2775,83450\n2775,83905\n2775,84193\n2775,84204\n2775,84373\n2775,84499\n2775,84552\n2775,84855\n2775,84860\n2775,85202\n2775,85807\n2775,86096\n2775,87370\n2775,87371\n2775,90301\n2775,90381\n2775,90412\n2775,93528\n2775,93618\n2775,94147\n2775,94822\n2775,95462\n2775,95496\n2775,95629\n2775,95760\n2775,95778\n2775,96623\n2775,96848\n2775,97617\n2775,98227\n2775,98854\n2775,99933\n2775,103755\n2775,107759\n2775,109955\n2775,112964\n2775,114061\n2775,114150\n2775,114468\n2775,118252\n2775,118374\n2775,118378\n2775,119560\n2775,119663\n2775,121138\n2775,121141\n2775,123420\n2775,124167\n2775,124169\n2775,127469\n2775,128728\n2775,131277\n2775,132114\n2775,133959\n2775,135222\n2775,136674\n2775,138214\n2775,144515\n2775,145653\n2775,145865\n2775,145866\n2775,145867\n2775,145868\n2775,146349\n2775,146865\n2775,150411\n2775,150862\n2775,156270\n2775,158457\n2775,158762\n2775,158803\n2775,158808\n2775,162659\n2775,162661\n2775,162675\n2775,162677\n2775,162679\n2775,164632\n2775,168532\n2775,168533\n2775,168534\n2775,168540\n2775,168542\n2775,168543\n2775,168545\n2775,168546\n2775,168547\n2775,168597\n2775,168835\n2775,169098\n2775,169218\n2775,171181\n2775,171194\n2775,175780\n2775,182162\n2775,186614\n2775,187976\n2775,189331\n2775,189950\n2775,190108\n2775,214733\n2775,220285\n2775,221301\n2775,234869\n2775,245331\n2775,247325\n2775,248128\n2775,254370\n2775,254434\n2775,258184\n2775,260256\n2775,262449\n2775,263336\n2775,263608\n2775,264668\n2776,447\n2777,1294\n2778,83\n2778,278\n2778,285\n2778,949\n2778,2779\n2778,2784\n2779,8\n2779,83\n2779,222\n2779,256\n2779,278\n2779,283\n2779,313\n2779,385\n2779,455\n2779,657\n2779,685\n2779,949\n2779,1069\n2779,1539\n2779,2159\n2779,2424\n2779,2779\n2779,2784\n2779,3252\n2779,3758\n2779,4234\n2779,4593\n2779,5325\n2779,5591\n2779,7768\n2779,8220\n2779,13240\n2779,15249\n2779,18577\n2779,18650\n2779,19286\n2779,19337\n2779,19455\n2779,19511\n2779,22437\n2779,23700\n2779,24348\n2779,28896\n2779,28898\n2779,28935\n2779,28998\n2779,37088\n2779,41854\n2779,44329\n2779,46165\n2779,49097\n2779,50623\n2779,54495\n2779,60484\n2779,63699\n2779,66273\n2779,66421\n2779,67077\n2779,85515\n2779,85731\n2779,88498\n2779,92667\n2779,107168\n2779,108598\n2779,115040\n2779,128785\n2779,135108\n2779,135735\n2779,163747\n2779,164251\n2779,164573\n2779,166288\n2779,175609\n2779,190557\n2779,204597\n2779,206757\n2779,215981\n2779,254510\n2779,258239\n2780,344\n2780,710\n2780,1836\n2781,2782\n2782,10\n2782,106\n2782,175\n2782,251\n2782,280\n2782,337\n2782,446\n2782,505\n2782,620\n2782,647\n2782,663\n2782,664\n2782,685\n2782,841\n2782,1007\n2782,1027\n2782,1328\n2782,1370\n2782,1848\n2782,1985\n2782,2782\n2782,6455\n2782,7222\n2782,14507\n2782,15113\n2782,15229\n2782,16186\n2782,17245\n2782,18164\n2782,20893\n2782,21736\n2782,25302\n2782,27175\n2782,28354\n2782,30325\n2782,30599\n2782,33298\n2782,37689\n2782,40782\n2782,41615\n2782,50861\n2782,62195\n2782,67360\n2782,82114\n2782,82673\n2782,83893\n2782,84593\n2782,88453\n2782,89331\n2782,90179\n2782,91853\n2782,99643\n2782,102521\n2782,106502\n2782,131504\n2782,156471\n2782,172181\n2782,184777\n2782,185099\n2782,191355\n2782,198752\n2782,202574\n2782,222045\n2782,223037\n2782,224936\n2783,1238\n2784,222\n2784,313\n2784,379\n2784,389\n2784,477\n2784,536\n2784,634\n2784,657\n2784,685\n2784,852\n2784,949\n2784,1011\n2784,1069\n2784,1571\n2784,1618\n2784,1724\n2784,1881\n2784,1973\n2784,2159\n2784,2224\n2784,2253\n2784,2290\n2784,2689\n2784,2784\n2784,2944\n2784,4457\n2784,5326\n2784,5458\n2784,5591\n2784,5644\n2784,6064\n2784,6131\n2784,6788\n2784,6997\n2784,7698\n2784,7999\n2784,8152\n2784,8554\n2784,14612\n2784,15138\n2784,16151\n2784,18831\n2784,19005\n2784,19211\n2784,19433\n2784,21200\n2784,21414\n2784,25509\n2784,28130\n2784,29828\n2784,29881\n2784,29884\n2784,30502\n2784,35032\n2784,36754\n2784,38297\n2784,46056\n2784,46241\n2784,49262\n2784,50339\n2784,50593\n2784,54559\n2784,65905\n2784,66703\n2784,75170\n2784,94900\n2784,94912\n2784,98926\n2784,102700\n2784,104264\n2784,104971\n2784,107001\n2784,115474\n2784,117231\n2784,122116\n2784,122166\n2784,122171\n2784,122173\n2784,123131\n2784,124442\n2784,124524\n2784,129719\n2784,133024\n2784,140501\n2784,140503\n2784,147483\n2784,148803\n2784,149463\n2784,150858\n2784,159384\n2784,161616\n2784,161662\n2784,173547\n2784,176499\n2784,176504\n2784,177367\n2784,177908\n2784,178703\n2784,179838\n2784,184844\n2784,186516\n2784,186551\n2784,186683\n2784,188676\n2784,188685\n2784,189850\n2784,191628\n2784,192459\n2784,213681\n2784,214240\n2784,225675\n2784,241637\n2784,242289\n2784,249732\n2784,249771\n2784,258794\n2785,1414\n2786,94\n2786,2787\n2787,94\n2787,2787\n2788,1858\n2789,2790\n2791,640\n2792,158\n2792,192\n2792,406\n2792,585\n2792,620\n2792,779\n2792,1515\n2794,104\n2794,557\n2794,953\n2794,954\n2794,1939\n2795,3\n2795,34\n2795,35\n2795,63\n2795,79\n2795,99\n2795,146\n2795,158\n2795,178\n2795,192\n2795,195\n2795,215\n2795,217\n2795,233\n2795,254\n2795,285\n2795,298\n2795,323\n2795,332\n2795,333\n2795,336\n2795,406\n2795,422\n2795,516\n2795,615\n2795,620\n2795,622\n2795,640\n2795,663\n2795,664\n2795,694\n2795,968\n2795,1007\n2795,1033\n2795,1220\n2795,1222\n2795,1235\n2795,1265\n2795,1266\n2795,1294\n2795,1335\n2795,1370\n2795,1425\n2795,1515\n2795,1551\n2795,1732\n2795,1955\n2795,2244\n2795,2296\n2795,2334\n2795,2567\n2795,2782\n2795,3115\n2795,3317\n2795,3321\n2795,3804\n2795,5726\n2795,5874\n2795,16019\n2796,120\n2796,2797\n2796,2807\n2796,2812\n2797,1955\n2797,2797\n2798,32\n2799,1722\n2800,1284\n2801,302\n2801,2116\n2802,107\n2802,278\n2802,1388\n2802,1888\n2802,3538\n2803,305\n2803,1313\n2804,2105\n2805,647\n2806,344\n2808,704\n2809,304\n2809,417\n2809,1085\n2809,2205\n2809,2206\n2809,2296\n2809,33424\n2810,397\n2810,623\n2810,808\n2810,1240\n2810,1241\n2810,1465\n2810,1805\n2810,1949\n2810,2810\n2810,3881\n2810,5301\n2810,6630\n2810,9769\n2810,21452\n2810,29762\n2810,80542\n2810,166991\n2810,167605\n2811,333\n2812,120\n2812,240\n2812,599\n2812,685\n2812,852\n2812,1082\n2812,1419\n2812,1955\n2812,2812\n2812,2838\n2812,3397\n2812,6004\n2812,7921\n2812,15097\n2812,16430\n2812,16571\n2812,17173\n2812,23336\n2812,31729\n2812,32650\n2812,47173\n2812,49691\n2812,52539\n2812,53598\n2812,60487\n2812,63038\n2812,67185\n2812,82014\n2812,86601\n2812,116037\n2812,122063\n2812,127158\n2812,134154\n2812,161902\n2812,179247\n2812,194416\n2812,203878\n2812,204754\n2812,213999\n2812,215266\n2813,252\n2814,596\n2815,222\n2816,44\n2817,301\n2817,919\n2818,240\n2818,1359\n2818,1564\n2819,22\n2819,809\n2820,818\n2820,1417\n2821,217\n2821,536\n2821,1417\n2821,4672\n2821,115474\n2822,304\n2823,631\n2823,805\n2824,120\n2824,261\n2824,694\n2824,2989\n2824,2991\n2824,3367\n2824,32751\n2825,87\n2825,344\n2825,392\n2825,1151\n2825,1836\n2825,2697\n2826,467\n2827,2828\n2828,9379\n2828,29364\n2828,77572\n2828,121199\n2828,124673\n2829,973\n2830,2048\n2831,1058\n2832,1241\n2833,631\n2833,1001\n2834,294\n2834,431\n2834,634\n2834,1052\n2834,2701\n2834,9015\n2835,557\n2835,954\n2835,1939\n2836,206\n2836,2837\n2837,2837\n2837,9470\n2837,13515\n2837,15988\n2837,15991\n2837,21651\n2837,27997\n2837,33681\n2837,37032\n2837,37140\n2837,43931\n2838,240\n2838,1955\n2838,2620\n2838,2812\n2839,885\n2840,86\n2840,167\n2840,301\n2840,626\n2840,1241\n2840,1284\n2840,1479\n2840,1522\n2840,1849\n2840,2480\n2840,2557\n2840,2979\n2841,240\n2841,1309\n2842,2843\n2842,44053\n2845,332\n2845,399\n2845,912\n2845,40566\n2846,417\n2847,850\n2848,1078\n2849,344\n2850,298\n2850,417\n2850,2296\n2851,298\n2852,485\n2853,536\n2855,313\n2856,32\n2857,301\n2857,968\n2857,1544\n2857,1955\n2857,2083\n2858,302\n2858,2116\n2859,44\n2859,202\n2859,203\n2859,217\n2859,538\n2859,663\n2859,664\n2859,779\n2859,788\n2859,809\n2859,920\n2859,1033\n2859,1181\n2859,1381\n2859,1414\n2859,1639\n2859,1805\n2859,2073\n2859,2889\n2859,5440\n2859,15609\n2860,2334\n2861,302\n2862,2863\n2864,1858\n2865,1860\n2866,54\n2866,743\n2866,1247\n2866,2867\n2866,2868\n2866,149534\n2867,211\n2867,1844\n2867,2867\n2867,2868\n2868,47\n2868,184\n2868,2469\n2868,2867\n2868,2868\n2870,1858\n2871,1860\n2872,1\n2873,2379\n2874,1\n2874,37\n2874,71\n2874,107\n2874,137\n2874,146\n2874,171\n2874,248\n2874,252\n2874,272\n2874,283\n2874,287\n2874,289\n2874,290\n2874,313\n2874,344\n2874,379\n2874,417\n2874,626\n2874,685\n2874,693\n2874,704\n2874,749\n2874,827\n2874,841\n2874,849\n2874,859\n2874,900\n2874,911\n2874,918\n2874,991\n2874,1070\n2874,1085\n2874,1096\n2874,1146\n2874,1220\n2874,1222\n2874,1243\n2874,1285\n2874,1319\n2874,1381\n2874,1402\n2874,1465\n2874,1566\n2874,1608\n2874,1818\n2874,1821\n2874,2205\n2874,2334\n2874,2424\n2874,2572\n2874,21442\n2874,21736\n2874,33424\n2874,81233\n2874,92476\n2875,147\n2875,158\n2875,285\n2875,406\n2875,779\n2875,1515\n2875,4193\n2875,80266\n2877,772\n2878,247\n2879,1707\n2880,149\n2880,333\n2880,406\n2880,779\n2880,893\n2880,1181\n2880,6119\n2880,18638\n2880,68069\n2881,269\n2882,2883\n2884,346\n2885,338\n2886,805\n2890,106\n2891,843\n2891,852\n2891,1844\n2895,818\n2895,1433\n2896,346\n2896,932\n2896,1085\n2897,305\n2897,35092\n2898,2899\n2900,784\n2900,1462\n2900,8537\n2901,2883\n2902,623\n2903,147\n2903,158\n2903,192\n2903,195\n2903,206\n2903,336\n2903,571\n2903,663\n2903,779\n2903,805\n2903,868\n2903,1014\n2903,1385\n2903,1623\n2903,6119\n2903,31346\n2903,55849\n2903,60576\n2903,127158\n2904,875\n2905,163\n2905,209\n2905,302\n2905,687\n2905,893\n2906,949\n2906,18831\n2906,55233\n2907,467\n2907,1151\n2908,178\n2909,592\n2910,79\n2910,333\n2910,2911\n2910,72727\n2910,77293\n2910,78300\n2910,79428\n2910,81621\n2910,81887\n2910,87606\n2912,310\n2913,356\n2913,442\n2913,462\n2913,795\n2913,1740\n2913,2334\n2913,2590\n2914,2915\n2916,136\n2917,248\n2918,289\n2918,290\n2918,2205\n2918,2206\n2918,33424\n2918,94134\n2919,392\n2921,225\n2921,772\n2921,850\n2921,1332\n2922,1179\n2922,2923\n2922,3695\n2923,2923\n2923,212518\n2924,1\n2925,2926\n2926,5\n2926,1684\n2926,3118\n2926,28168\n2926,134580\n2926,137926\n2926,137927\n2926,137929\n2927,104\n2927,557\n2927,953\n2927,954\n2928,2929\n2929,2929\n2930,151\n2930,2931\n2931,1218\n2931,76192\n2932,79\n2933,682\n2933,72439\n2934,104\n2934,136\n2934,254\n2934,557\n2934,953\n2934,954\n2934,1368\n2934,1939\n2934,10318\n2935,1639\n2936,344\n2936,415\n2936,1143\n2936,1711\n2936,1836\n2936,15523\n2937,605\n2938,406\n2938,779\n2939,138\n2939,1227\n2939,1229\n2939,2089\n2939,2940\n2939,21944\n2939,86416\n2940,430\n2940,2089\n2940,2940\n2940,43983\n2941,563\n2942,666\n2943,32\n2943,37\n2943,63\n2943,158\n2943,192\n2943,202\n2943,203\n2943,251\n2943,285\n2943,333\n2943,346\n2943,393\n2943,406\n2943,439\n2943,447\n2943,465\n2943,493\n2943,516\n2943,663\n2943,664\n2943,779\n2943,925\n2943,934\n2943,980\n2943,1068\n2943,1175\n2943,1181\n2943,1220\n2943,1222\n2943,1265\n2943,1266\n2943,1294\n2943,1370\n2943,1388\n2943,1512\n2943,1531\n2943,1740\n2943,1821\n2943,1877\n2943,1985\n2943,2292\n2943,3148\n2943,4455\n2943,4545\n2943,5212\n2943,5992\n2943,21736\n2943,56150\n2943,60576\n2944,19\n2944,54\n2944,135\n2944,222\n2944,313\n2944,379\n2944,385\n2944,455\n2944,477\n2944,536\n2944,682\n2944,685\n2944,781\n2944,784\n2944,852\n2944,891\n2944,1201\n2944,1512\n2944,1617\n2944,1618\n2944,1843\n2944,1871\n2944,2159\n2944,2211\n2944,2319\n2944,2646\n2944,2775\n2944,2784\n2944,2944\n2944,2945\n2944,3729\n2944,4223\n2944,4234\n2944,4790\n2944,5163\n2944,5326\n2944,5458\n2944,5591\n2944,5992\n2944,6005\n2944,6506\n2944,7698\n2944,7974\n2944,8442\n2944,8554\n2944,9788\n2944,13137\n2944,13389\n2944,13661\n2944,15451\n2944,15710\n2944,15756\n2944,18345\n2944,22860\n2944,23287\n2944,23859\n2944,24274\n2944,25670\n2944,28232\n2944,28600\n2944,29177\n2944,36843\n2944,38859\n2944,39537\n2944,44149\n2944,44301\n2944,45098\n2944,45462\n2944,48983\n2944,49735\n2944,52520\n2944,57354\n2944,57839\n2944,61031\n2944,62539\n2944,63519\n2944,63961\n2944,66703\n2944,72439\n2944,72818\n2944,74103\n2944,77149\n2944,79721\n2944,85998\n2944,94195\n2944,102752\n2944,103512\n2944,107576\n2944,114166\n2944,118835\n2944,126043\n2944,126859\n2944,130331\n2944,131019\n2944,132085\n2944,135077\n2944,135268\n2944,136137\n2944,136353\n2944,138901\n2944,138904\n2944,138908\n2944,140159\n2944,143436\n2944,143976\n2944,144148\n2944,144156\n2944,144996\n2944,146170\n2944,149223\n2944,151105\n2944,151726\n2944,151952\n2944,152407\n2944,154688\n2944,158254\n2944,162685\n2944,164439\n2944,165039\n2944,169211\n2944,169212\n2944,169738\n2944,171014\n2944,172592\n2944,173496\n2944,176084\n2944,176929\n2944,177032\n2944,177040\n2944,180036\n2944,181063\n2944,190968\n2944,193860\n2944,198176\n2944,216248\n2944,218395\n2944,219243\n2944,220201\n2944,220508\n2944,222105\n2944,232218\n2944,255083\n2944,255333\n2944,256865\n2945,2944\n2946,920\n2947,743\n2948,1014\n2949,1227\n2949,1229\n2950,275\n2950,277\n2951,920\n2952,929\n2953,493\n2953,1265\n2953,1266\n2953,1370\n2954,195\n2955,333\n2956,424\n2957,273\n2957,274\n2958,302\n2959,788\n2959,1531\n2960,77\n2961,298\n2962,485\n2963,536\n2963,1072\n2964,143\n2965,289\n2965,304\n2965,599\n2965,714\n2965,1962\n2965,2205\n2965,33424\n2965,94134\n2966,811\n2967,184\n2968,718\n2970,1556\n2971,1414\n2972,147\n2972,406\n2973,2353\n2974,104\n2974,136\n2974,137\n2974,431\n2974,784\n2974,818\n2974,1235\n2974,1305\n2974,1432\n2974,1462\n2974,1511\n2974,1635\n2974,2417\n2974,2991\n2974,9015\n2974,33424\n2974,94134\n2974,182162\n2974,232709\n2975,2506\n2976,2506\n2977,1414\n2978,47\n2978,862\n2978,2469\n2978,2979\n2979,167\n2979,186\n2979,264\n2979,287\n2979,299\n2979,301\n2979,314\n2979,440\n2979,452\n2979,457\n2979,510\n2979,536\n2979,599\n2979,631\n2979,693\n2979,762\n2979,794\n2979,838\n2979,872\n2979,973\n2979,1001\n2979,1010\n2979,1011\n2979,1014\n2979,1118\n2979,1167\n2979,1192\n2979,1210\n2979,1231\n2979,1284\n2979,1293\n2979,1298\n2979,1299\n2979,1381\n2979,1436\n2979,1533\n2979,1616\n2979,1635\n2979,1796\n2979,1837\n2979,1849\n2979,1853\n2979,2083\n2979,2252\n2979,2373\n2979,2479\n2979,2557\n2979,2979\n2979,3207\n2979,3392\n2979,3422\n2979,3497\n2979,3507\n2979,3578\n2979,3804\n2979,3858\n2979,3866\n2979,3942\n2979,5269\n2979,5376\n2979,5654\n2979,5662\n2979,5787\n2979,6027\n2979,6853\n2979,7203\n2979,7349\n2979,8011\n2979,8146\n2979,9640\n2979,13418\n2979,13442\n2979,13519\n2979,13605\n2979,13657\n2979,15183\n2979,15428\n2979,15430\n2979,15857\n2979,16182\n2979,16837\n2979,18264\n2979,19387\n2979,19934\n2979,19980\n2979,21411\n2979,21563\n2979,22664\n2979,23078\n2979,23369\n2979,25662\n2979,26034\n2979,28328\n2979,29595\n2979,29681\n2979,29760\n2979,31785\n2979,32577\n2979,32967\n2979,34820\n2979,36694\n2979,37511\n2979,38140\n2979,38395\n2979,39047\n2979,39058\n2979,41234\n2979,44385\n2979,45448\n2979,46956\n2979,47073\n2979,48897\n2979,49121\n2979,49557\n2979,50152\n2979,51880\n2979,52975\n2979,55586\n2979,55597\n2979,55726\n2979,55747\n2979,59581\n2979,62644\n2979,63121\n2979,64457\n2979,68873\n2979,71068\n2979,71879\n2979,72928\n2979,73408\n2979,73487\n2979,73570\n2979,74726\n2979,77873\n2979,88345\n2979,90183\n2979,90881\n2979,91779\n2979,92748\n2979,93590\n2979,93613\n2979,94986\n2979,95612\n2979,99770\n2979,101551\n2979,103784\n2979,103881\n2979,105416\n2979,106246\n2979,107702\n2979,113598\n2979,114353\n2979,114501\n2979,116040\n2979,117480\n2979,120500\n2979,126620\n2979,126787\n2979,129842\n2979,135255\n2979,135800\n2979,135946\n2979,137107\n2979,140585\n2979,142990\n2979,148976\n2979,149846\n2979,150624\n2979,152298\n2979,152606\n2979,154671\n2979,163303\n2979,165025\n2979,165170\n2979,167669\n2979,168394\n2979,171767\n2979,171884\n2979,172082\n2979,172494\n2979,173860\n2979,175627\n2979,177923\n2979,178572\n2979,178611\n2979,178810\n2979,178880\n2979,180609\n2979,185358\n2979,186506\n2979,191139\n2979,191207\n2979,205442\n2979,211950\n2979,213785\n2979,217311\n2979,218838\n2979,218875\n2979,218884\n2979,226324\n2979,228156\n2979,228399\n2979,228902\n2979,229096\n2979,231084\n2979,231814\n2979,232159\n2979,232718\n2979,234640\n2979,234902\n2979,237432\n2979,241603\n2979,242344\n2979,244840\n2979,245443\n2979,246109\n2979,252075\n2979,252656\n2979,254539\n2979,255741\n2979,257137\n2979,258207\n2979,259660\n2979,260120\n2979,263372\n2980,557\n2981,146\n2982,592\n2982,631\n2982,760\n2982,805\n2982,1285\n2982,1462\n2982,1631\n2982,1635\n2982,2620\n2982,2995\n2982,8537\n2983,872\n2983,1659\n2984,302\n2984,1983\n2985,344\n2985,1711\n2986,366\n2987,841\n2988,2989\n2988,2991\n2989,120\n2989,202\n2989,240\n2989,356\n2989,390\n2989,397\n2989,440\n2989,457\n2989,467\n2989,631\n2989,794\n2989,818\n2989,949\n2989,968\n2989,1014\n2989,1203\n2989,1285\n2989,1298\n2989,1417\n2989,1419\n2989,1608\n2989,1955\n2989,2017\n2989,2512\n2989,2620\n2989,2989\n2989,2991\n2989,3135\n2989,8276\n2989,13980\n2989,23590\n2989,27041\n2989,27550\n2989,127158\n2990,1313\n2992,457\n2992,1417\n2993,107\n2993,452\n2993,473\n2993,2995\n2994,26\n2994,59\n2995,41\n2995,298\n2995,417\n2995,440\n2995,534\n2995,589\n2995,626\n2995,631\n2995,632\n2995,677\n2995,685\n2995,693\n2995,715\n2995,797\n2995,805\n2995,823\n2995,852\n2995,862\n2995,1004\n2995,1085\n2995,1119\n2995,1133\n2995,1195\n2995,1459\n2995,1462\n2995,2572\n2995,2995\n2995,3083\n2995,3623\n2995,5129\n2995,5472\n2995,6068\n2995,6482\n2995,7194\n2995,8537\n2995,9768\n2995,15689\n2995,16652\n2995,16668\n2995,18472\n2995,25499\n2995,25570\n2995,42599\n2995,45525\n2995,46708\n2995,51450\n2995,54421\n2995,54685\n2995,57080\n2995,59932\n2995,68310\n2995,75912\n2995,103748\n2995,106198\n2995,178576\n2995,216846\n2995,216847\n2995,235957\n2995,247768\n2995,249055\n2996,861\n2997,34\n2997,35\n2997,83\n2997,1417\n2998,557\n2998,862\n2999,264\n2999,1147\n3001,1016\n3002,3003\n3003,87\n3003,289\n3003,290\n3003,509\n3003,563\n3003,808\n3003,843\n3003,849\n3003,852\n3003,918\n3003,929\n3003,1240\n3003,1663\n3003,20757\n3003,26450\n3003,94134\n3004,527\n3005,408\n3006,104\n3006,135\n3006,137\n3006,138\n3006,1368\n3006,2105\n3007,3008\n3009,30\n3009,97\n3009,175\n3009,184\n3009,205\n3009,248\n3009,328\n3009,489\n3009,685\n3009,693\n3009,704\n3009,841\n3009,1188\n3009,1238\n3009,1515\n3009,1677\n3009,1860\n3010,364\n3011,726\n3012,240\n3012,372\n3012,1001\n3012,1085\n3013,358\n3014,3015\n3016,536\n3016,18831\n3017,485\n3018,83\n3018,178\n3018,207\n3018,211\n3018,366\n3018,387\n3018,406\n3018,622\n3018,21944\n3020,248\n3020,450\n3020,1332\n3021,647\n3022,344\n3023,1298\n3024,1\n3024,71\n3024,149\n3024,151\n3024,163\n3024,184\n3024,292\n3024,332\n3024,442\n3024,485\n3024,489\n3024,491\n3024,493\n3024,557\n3024,595\n3024,611\n3024,720\n3024,760\n3024,841\n3024,893\n3024,980\n3024,1188\n3024,1243\n3024,1623\n3024,1782\n3024,1821\n3024,2116\n3024,2296\n3024,2367\n3024,2590\n3024,3623\n3024,5265\n3024,5405\n3024,5540\n3024,5662\n3024,13136\n3024,21944\n3024,27041\n3025,3026\n3027,406\n3028,215\n3028,240\n3028,289\n3028,290\n3028,298\n3028,372\n3028,417\n3028,592\n3028,631\n3028,704\n3028,714\n3028,805\n3028,932\n3028,1082\n3028,1085\n3028,1285\n3028,1309\n3028,1392\n3028,1462\n3028,1511\n3028,1564\n3028,1608\n3028,1631\n3028,1785\n3028,1818\n3028,1955\n3028,1962\n3028,2205\n3028,2206\n3028,2286\n3028,2296\n3028,2620\n3028,2995\n3028,3069\n3028,5718\n3028,8537\n3028,33424\n3028,94134\n3028,245910\n3029,841\n3031,30\n3031,248\n3032,134\n3033,247\n3034,77\n3034,83\n3034,254\n3034,278\n3034,283\n3034,388\n3034,1363\n3034,1756\n3034,2224\n3034,2421\n3034,3252\n3034,4039\n3034,6068\n3034,7092\n3035,264\n3035,292\n3035,338\n3035,392\n3035,467\n3035,479\n3035,509\n3035,647\n3035,736\n3035,835\n3035,872\n3035,1151\n3035,1289\n3035,1453\n3035,1551\n3035,1572\n3035,1893\n3035,2051\n3035,4039\n3035,49057\n3036,72\n3037,206\n3037,957\n3037,1247\n3037,1815\n3038,310\n3038,3039\n3040,3041\n3042,292\n3043,707\n3044,798\n3045,175\n3046,175\n3047,72\n3048,518\n3049,167\n3049,744\n3049,783\n3049,1479\n3049,3218\n3050,1414\n3052,104\n3052,134\n3052,135\n3052,136\n3052,137\n3052,138\n3052,557\n3052,1368\n3052,1939\n3052,2105\n3053,2334\n3054,72\n3055,175\n3056,1858\n3057,1860\n3058,744\n3059,72\n3060,50\n3060,158\n3060,192\n3060,406\n3060,585\n3060,779\n3061,481\n3062,743\n3063,557\n3064,65\n3064,586\n3065,557\n3066,1\n3067,10\n3067,30\n3067,175\n3067,205\n3067,328\n3067,693\n3067,704\n3067,1498\n3067,1773\n3067,33437\n3067,48955\n3067,66678\n3067,66832\n3067,67429\n3067,67554\n3067,67940\n3067,68372\n3068,83\n3069,10\n3069,278\n3069,289\n3069,290\n3069,328\n3069,373\n3069,592\n3069,704\n3069,714\n3069,760\n3069,911\n3069,932\n3069,1001\n3069,1011\n3069,1213\n3069,1402\n3069,1511\n3069,1962\n3069,2286\n3069,3069\n3069,4218\n3069,6652\n3069,8529\n3069,14511\n3069,19543\n3069,22482\n3069,22524\n3069,25037\n3069,33727\n3069,35854\n3069,35876\n3069,43956\n3069,46736\n3069,56786\n3069,57722\n3069,58475\n3069,58557\n3069,58590\n3069,59090\n3069,62418\n3069,71823\n3069,73485\n3069,77647\n3069,80240\n3069,82731\n3069,86162\n3069,87840\n3069,99207\n3069,99718\n3069,99754\n3069,103366\n3069,116266\n3069,117231\n3069,127478\n3069,132951\n3069,134324\n3069,144988\n3069,152255\n3069,160544\n3069,163540\n3069,176368\n3069,177021\n3069,179928\n3069,182162\n3069,182378\n3069,182422\n3069,197972\n3069,243042\n3069,243485\n3069,244669\n3069,259623\n3070,147\n3070,406\n3070,779\n3071,1458\n3072,217\n3073,3\n3073,261\n3073,390\n3073,536\n3073,702\n3073,873\n3073,874\n3073,1210\n3073,1544\n3073,2045\n3073,3182\n3074,1707\n3075,2116\n3076,72\n3077,483\n3078,3079\n3079,3078\n3079,6387\n3079,7117\n3079,9410\n3079,57710\n3079,65134\n3079,79025\n3079,81457\n3079,86544\n3079,86561\n3079,86769\n3079,103675\n3079,108822\n3079,116773\n3079,122660\n3079,129490\n3079,133976\n3079,165047\n3079,192778\n3079,261830\n3079,264975\n3080,3081\n3082,493\n3082,1927\n3083,2995\n3084,1257\n3084,3085\n3086,65\n3086,752\n3086,1285\n3087,366\n3087,500\n3087,1118\n3087,1566\n3087,1796\n3087,2775\n3089,3090\n3089,6437\n3089,13849\n3089,15309\n3089,21229\n3089,36358\n3089,44513\n3089,45823\n3089,50840\n3089,50842\n3089,51509\n3089,69722\n3090,718\n3090,1677\n3090,3089\n3091,2750\n3092,1707\n3093,425\n3093,534\n3093,589\n3093,765\n3093,795\n3093,1001\n3093,1011\n3093,1085\n3093,1580\n3093,3094\n3093,3938\n3093,5961\n3093,119006\n3093,122692\n3093,135094\n3093,168813\n3093,212280\n3093,214630\n3093,215156\n3093,216084\n3093,218352\n3093,229583\n3093,229818\n3093,230228\n3093,230289\n3093,243849\n3093,249753\n3093,256963\n3093,256964\n3093,264541\n3094,240\n3094,417\n3094,589\n3094,784\n3094,795\n3094,843\n3094,1001\n3094,1011\n3094,1085\n3094,1179\n3094,1204\n3094,1580\n3094,1796\n3094,185874\n3095,261\n3096,227\n3097,175\n3098,344\n3099,248\n3099,364\n3099,850\n3100,261\n3101,326\n3101,589\n3101,4823\n3102,417\n3103,2506\n3104,252\n3105,1204\n3106,615\n3107,2315\n3108,527\n3108,743\n3108,8714\n3108,95583\n3109,304\n3110,2574\n3110,3111\n3111,10\n3111,175\n3111,431\n3111,671\n3111,1773\n3111,3111\n3111,56742\n3111,58343\n3112,2646\n3113,1631\n3114,143\n3115,120\n3115,175\n3115,240\n3115,261\n3115,431\n3115,694\n3115,715\n3115,784\n3115,797\n3115,814\n3115,818\n3115,1082\n3115,1353\n3115,1466\n3115,1807\n3115,1849\n3115,1888\n3115,2253\n3115,2512\n3115,2646\n3115,2775\n3115,3115\n3115,3623\n3115,5130\n3115,5935\n3115,6022\n3115,7181\n3115,7196\n3115,8488\n3115,14386\n3115,14674\n3115,14730\n3115,15283\n3115,15931\n3115,19561\n3115,19590\n3115,19854\n3115,19857\n3115,19901\n3115,20419\n3115,20876\n3115,22797\n3115,24934\n3115,28191\n3115,28338\n3115,32751\n3115,44301\n3115,49104\n3115,55681\n3115,66468\n3115,66513\n3115,74533\n3115,82140\n3115,82219\n3115,94911\n3115,101473\n3115,118459\n3115,123057\n3115,126049\n3115,131224\n3115,135270\n3115,141579\n3115,174548\n3115,176926\n3115,190063\n3115,211945\n3115,212602\n3115,243447\n3115,248537\n3115,255044\n3115,264076\n3116,740\n3116,741\n3117,577\n3118,143\n3119,1858\n3120,1860\n3121,94\n3121,602\n3121,2787\n3122,444\n3122,450\n3122,589\n3122,631\n3122,720\n3122,932\n3122,1001\n3122,1085\n3122,1732\n3122,3194\n3122,3422\n3122,8811\n3123,3124\n3125,1238\n3126,934\n3127,872\n3128,206\n3128,222\n3128,510\n3128,760\n3128,1019\n3128,3129\n3128,3135\n3130,1858\n3131,1860\n3132,1227\n3132,1229\n3132,86416\n3133,1007\n3135,41\n3135,134\n3135,233\n3135,240\n3135,390\n3135,631\n3135,677\n3135,685\n3135,784\n3135,823\n3135,1130\n3135,1203\n3135,1285\n3135,1309\n3135,1462\n3135,1608\n3135,1796\n3135,1808\n3135,1955\n3135,2512\n3135,2989\n3135,2991\n3135,3135\n3135,3507\n3135,5346\n3135,14723\n3135,16015\n3135,16196\n3135,17207\n3135,18890\n3135,19617\n3135,26513\n3135,31413\n3135,33660\n3135,43378\n3135,44232\n3135,48975\n3135,55813\n3135,61089\n3135,61110\n3135,62393\n3135,75372\n3135,84714\n3135,86152\n3135,90468\n3135,98372\n3135,104364\n3135,116021\n3135,126157\n3135,127158\n3135,130564\n3135,135984\n3135,155080\n3135,160450\n3135,162888\n3135,169225\n3135,177028\n3135,188503\n3135,207051\n3135,211872\n3135,215840\n3135,235938\n3135,244627\n3135,260391\n3136,1001\n3137,1001\n3137,3138\n3138,350\n3138,4291\n3138,7612\n3138,13480\n3138,21698\n3138,31426\n3138,39110\n3138,55020\n3138,55206\n3138,57150\n3138,59241\n3138,97330\n3138,99153\n3138,99199\n3138,99672\n3138,99696\n3138,99823\n3138,99857\n3138,99866\n3138,103456\n3138,106336\n3138,128516\n3138,130444\n3138,144797\n3138,146429\n3138,147352\n3138,147602\n3138,148963\n3138,150170\n3138,156333\n3138,158000\n3138,158001\n3138,158050\n3138,158055\n3138,163159\n3139,298\n3140,485\n3141,10\n3142,346\n3143,760\n3143,1955\n3143,2073\n3144,97\n3145,106\n3145,149\n3145,406\n3146,151\n3147,192\n3147,306\n3147,307\n3147,406\n3147,422\n3147,493\n3147,586\n3147,620\n3147,779\n3147,1515\n3147,1531\n3147,3148\n3147,4192\n3147,4193\n3147,8244\n3148,3148\n3149,314\n3149,599\n3150,206\n3150,4611\n3151,77\n3151,682\n3151,788\n3151,72439\n3152,3153\n3154,996\n3156,217\n3157,389\n3158,252\n3158,318\n3159,1252\n3159,1253\n3160,3161\n3162,605\n3163,77\n3164,192\n3164,500\n3165,146\n3166,315\n3166,599\n3166,685\n3166,764\n3166,775\n3166,1011\n3166,1326\n3166,1411\n3166,2006\n3167,72\n3168,1955\n3169,1118\n3170,26\n3170,47\n3170,59\n3170,2469\n3170,21944\n3171,2590\n3172,86\n3172,167\n3172,240\n3172,301\n3172,372\n3172,567\n3172,605\n3172,615\n3172,631\n3172,720\n3172,801\n3172,907\n3172,968\n3172,972\n3172,973\n3172,1010\n3172,1122\n3172,1124\n3172,1140\n3172,1167\n3172,1177\n3172,1231\n3172,1241\n3172,1284\n3172,1298\n3172,1309\n3172,1436\n3172,1522\n3172,1544\n3172,1564\n3172,1782\n3172,1785\n3172,1818\n3172,1837\n3172,1893\n3172,1955\n3172,2191\n3172,2372\n3172,2557\n3172,2620\n3172,2979\n3172,3193\n3172,3207\n3172,3218\n3173,366\n3173,500\n3174,22\n3175,1659\n3176,3177\n3178,207\n3178,424\n3178,1058\n3178,1201\n3178,1368\n3178,6556\n3178,142405\n3179,392\n3180,247\n3180,252\n3180,925\n3180,1119\n3180,1179\n3180,1220\n3180,1222\n3181,3182\n3182,314\n3182,388\n3182,397\n3182,425\n3182,509\n3182,510\n3182,663\n3182,685\n3182,693\n3182,852\n3182,992\n3182,1014\n3182,1133\n3182,1192\n3182,1231\n3182,1345\n3182,1696\n3182,1801\n3182,2143\n3182,2989\n3182,2991\n3182,3182\n3182,3507\n3182,3509\n3182,4759\n3182,5317\n3182,6424\n3182,6552\n3182,6904\n3182,8658\n3182,9079\n3182,13198\n3182,13245\n3182,14061\n3182,20363\n3182,20416\n3182,20426\n3182,21188\n3182,30328\n3182,31106\n3182,32474\n3182,33515\n3182,33587\n3182,33799\n3182,37771\n3182,40518\n3182,45365\n3182,55567\n3182,64405\n3182,67147\n3182,118884\n3182,130521\n3182,134481\n3182,147390\n3182,176382\n3182,183356\n3182,188295\n3182,188536\n3182,189266\n3182,191459\n3182,220281\n3182,221654\n3182,224431\n3182,226114\n3182,230623\n3182,230630\n3182,231061\n3182,237694\n3184,10\n3185,192\n3185,2607\n3186,72\n3187,301\n3187,1782\n3188,143\n3189,195\n3189,222\n3189,3297\n3190,206\n3190,1359\n3191,3192\n3191,34442\n3191,36094\n3191,36305\n3191,37292\n3191,41026\n3191,51680\n3191,52105\n3191,53998\n3191,57687\n3191,78120\n3191,84633\n3191,88955\n3191,91889\n3191,99909\n3191,100319\n3191,101322\n3191,102836\n3191,104903\n3191,219404\n3191,257887\n3193,186\n3193,408\n3193,518\n3193,1113\n3193,1241\n3193,1326\n3193,1853\n3193,3193\n3193,3640\n3193,5186\n3193,6638\n3193,8107\n3193,14701\n3193,15331\n3193,15353\n3193,16192\n3193,16243\n3193,16254\n3193,18137\n3193,20350\n3193,25549\n3193,28092\n3193,31402\n3193,31730\n3193,31766\n3193,31796\n3193,34816\n3193,44072\n3193,44723\n3193,46688\n3193,46691\n3193,46692\n3193,46693\n3193,46697\n3193,46701\n3193,46718\n3193,48505\n3193,87871\n3193,98189\n3193,115228\n3195,79\n3195,195\n3195,779\n3196,207\n3197,406\n3197,599\n3198,1659\n3199,147\n3199,167\n3199,217\n3199,467\n3199,571\n3199,868\n3199,872\n3199,1118\n3199,1417\n3199,1796\n3199,156379\n3200,1370\n3201,417\n3202,503\n3202,586\n3202,1118\n3202,1149\n3203,143\n3204,925\n3205,1429\n3206,424\n3207,86\n3207,167\n3207,299\n3207,459\n3207,522\n3207,783\n3207,968\n3207,1122\n3207,1167\n3207,1284\n3207,1319\n3207,1436\n3207,1493\n3207,1522\n3207,1544\n3207,1581\n3207,1849\n3207,1986\n3207,2083\n3207,2253\n3207,3207\n3207,3422\n3207,3630\n3207,3774\n3207,5301\n3207,5662\n3207,5949\n3207,8097\n3207,13252\n3207,14580\n3207,14674\n3207,15633\n3207,23565\n3207,29760\n3207,29898\n3207,32863\n3207,33466\n3207,33983\n3207,34003\n3207,35545\n3207,37630\n3207,38140\n3207,44238\n3207,46165\n3207,52067\n3207,55703\n3207,57098\n3207,57104\n3207,62439\n3207,70028\n3207,75066\n3207,77568\n3207,79991\n3207,96685\n3207,101551\n3207,112017\n3207,117081\n3207,119790\n3207,119894\n3207,126814\n3207,126818\n3207,127807\n3207,130501\n3207,134023\n3207,134079\n3207,134600\n3207,142456\n3207,147860\n3207,148742\n3207,161963\n3207,162704\n3207,163057\n3207,163480\n3207,167395\n3207,175773\n3207,182761\n3207,182843\n3207,193978\n3207,193981\n3207,193988\n3207,193993\n3207,194147\n3207,194149\n3207,194155\n3207,194158\n3207,199763\n3207,200482\n3207,204791\n3207,215432\n3207,215603\n3207,218873\n3207,224659\n3207,224660\n3207,224663\n3207,224665\n3207,224694\n3207,224695\n3207,224697\n3207,224700\n3207,224701\n3207,224702\n3207,224703\n3207,224704\n3207,224708\n3207,224710\n3207,224711\n3207,224721\n3207,224722\n3207,224725\n3207,224729\n3207,224732\n3207,224733\n3207,224752\n3207,224754\n3207,224757\n3207,224758\n3207,225422\n3207,227070\n3207,228171\n3207,228173\n3207,228174\n3207,228175\n3207,228176\n3207,228179\n3207,228180\n3207,228181\n3207,228187\n3207,228188\n3207,228189\n3207,228190\n3207,228192\n3207,228194\n3207,228195\n3207,228196\n3207,228200\n3207,228202\n3207,228203\n3207,228204\n3207,228205\n3207,228206\n3207,228207\n3207,228208\n3207,228211\n3207,228212\n3207,228214\n3207,228217\n3207,228220\n3207,228222\n3207,228223\n3207,228224\n3207,228225\n3207,228229\n3207,228258\n3207,228259\n3207,228261\n3207,228262\n3207,228264\n3207,228265\n3207,228273\n3207,228274\n3207,228275\n3207,228278\n3207,228332\n3207,228334\n3207,228336\n3207,228338\n3207,228343\n3207,228345\n3207,228346\n3207,228353\n3207,228355\n3207,228397\n3207,228398\n3207,228400\n3207,228401\n3207,228412\n3207,228415\n3207,228421\n3207,228422\n3207,228423\n3207,228424\n3207,228427\n3207,228428\n3207,228448\n3207,228450\n3207,228452\n3207,228453\n3207,228461\n3207,228463\n3207,228464\n3207,228465\n3207,228478\n3207,228479\n3207,228481\n3207,228868\n3207,228869\n3207,228871\n3207,228872\n3207,228874\n3207,228875\n3207,228876\n3207,228877\n3207,228878\n3207,231070\n3207,239909\n3207,239910\n3207,239911\n3207,243994\n3207,251448\n3208,240\n3209,3209\n3210,72\n3211,668\n3212,178\n3213,72\n3214,3215\n3216,250\n3217,151\n3218,10\n3218,167\n3218,299\n3218,522\n3218,528\n3218,602\n3218,607\n3218,633\n3218,941\n3218,1118\n3218,1167\n3218,1241\n3218,1319\n3218,1479\n3218,1544\n3218,1849\n3218,2083\n3218,2127\n3218,2193\n3218,2251\n3218,2372\n3218,2689\n3218,3049\n3218,3218\n3218,3630\n3218,3991\n3218,4303\n3218,5662\n3218,5788\n3218,6798\n3218,7612\n3218,7744\n3218,7759\n3218,8504\n3218,8684\n3218,9702\n3218,14264\n3218,14913\n3218,28289\n3218,28869\n3218,31426\n3218,31595\n3218,32527\n3218,33083\n3218,36955\n3218,40675\n3218,40964\n3218,42980\n3218,45399\n3218,45853\n3218,48455\n3218,50934\n3218,60088\n3218,65419\n3218,109877\n3218,124847\n3218,124990\n3218,127236\n3218,143481\n3218,146368\n3218,147883\n3218,159509\n3218,168296\n3218,170551\n3218,171064\n3218,178624\n3218,184730\n3218,186166\n3218,189207\n3219,760\n3220,30\n3221,147\n3221,149\n3221,264\n3221,289\n3221,290\n3221,1011\n3221,2296\n3221,94134\n3221,118336\n3222,264\n3222,1381\n3222,152358\n3223,2931\n3224,671\n3224,1789\n3225,2506\n3226,3227\n3228,22\n3229,332\n3229,3230\n3231,2867\n3231,2868\n3232,267\n3233,1\n3233,83\n3233,160\n3234,222\n3234,634\n3234,1871\n3234,2701\n3235,3236\n3237,86\n3237,104\n3237,140\n3237,192\n3237,227\n3237,252\n3237,287\n3237,318\n3237,349\n3237,358\n3237,383\n3237,393\n3237,417\n3237,435\n3237,444\n3237,515\n3237,586\n3237,605\n3237,622\n3237,626\n3237,697\n3237,718\n3237,726\n3237,752\n3237,934\n3237,973\n3237,1052\n3237,1102\n3237,1122\n3237,1175\n3237,1241\n3237,1265\n3237,1266\n3237,1309\n3237,1381\n3237,1436\n3237,1467\n3237,1551\n3237,1590\n3237,1634\n3237,1639\n3237,1715\n3237,1767\n3237,1837\n3237,1849\n3237,1877\n3237,1893\n3237,2434\n3237,3238\n3237,3252\n3237,3538\n3237,4453\n3237,4549\n3237,5662\n3237,5987\n3237,7572\n3237,8798\n3237,9015\n3237,9098\n3237,32784\n3237,41170\n3237,141912\n3239,79\n3240,434\n3240,435\n3240,766\n3240,939\n3240,2094\n3240,3241\n3240,4646\n3240,8477\n3240,17421\n3240,17424\n3240,17425\n3240,17426\n3240,17429\n3240,17430\n3240,17431\n3240,17432\n3240,120052\n3240,121505\n3240,188523\n3241,439\n3241,571\n3241,671\n3241,868\n3241,1449\n3241,3474\n3242,72\n3243,147\n3243,149\n3243,264\n3243,1011\n3244,250\n3245,3246\n3245,3247\n3246,3246\n3246,3247\n3247,30\n3247,104\n3247,134\n3247,136\n3247,137\n3247,849\n3247,850\n3247,1011\n3247,1235\n3247,1332\n3247,1335\n3247,1368\n3247,2105\n3247,3246\n3247,5405\n3248,1179\n3249,843\n3249,1844\n3250,200\n3250,240\n3250,2089\n3250,2940\n3251,424\n3252,385\n3252,660\n3252,949\n3252,1072\n3252,2159\n3252,6506\n3252,6611\n3252,13230\n3252,13240\n3252,20605\n3252,37088\n3252,40821\n3252,52381\n3252,52511\n3252,78762\n3252,79430\n3252,97183\n3253,3254\n3255,406\n3255,779\n3256,34\n3256,35\n3256,79\n3256,158\n3256,192\n3256,217\n3256,222\n3256,283\n3256,326\n3256,388\n3256,455\n3256,536\n3256,657\n3256,779\n3256,868\n3256,873\n3256,949\n3256,1001\n3256,1010\n3256,1019\n3256,1072\n3256,1274\n3256,1370\n3256,1429\n3256,1454\n3256,1466\n3256,1467\n3256,1531\n3256,1644\n3256,1722\n3256,2244\n3256,2266\n3256,2671\n3256,2797\n3256,2989\n3256,2991\n3256,4672\n3256,5265\n3256,5343\n3256,5976\n3256,7092\n3256,13546\n3256,14819\n3256,29380\n3256,55585\n3257,3258\n3258,87\n3258,256\n3258,510\n3258,623\n3258,808\n3258,852\n3258,872\n3258,911\n3258,1240\n3258,1370\n3258,1805\n3258,1949\n3258,2253\n3258,6424\n3258,19010\n3258,28107\n3259,202\n3259,203\n3259,392\n3259,3260\n3260,87\n3260,314\n3260,599\n3260,623\n3260,673\n3260,794\n3260,838\n3260,843\n3260,852\n3260,919\n3260,1014\n3260,1240\n3260,1262\n3260,1465\n3260,1559\n3260,1805\n3260,1860\n3260,1973\n3260,4760\n3260,6059\n3262,1143\n3263,644\n3263,1559\n3263,2699\n3264,323\n3265,135\n3265,137\n3265,138\n3266,269\n3267,134\n3268,2775\n3269,447\n3270,2775\n3271,1509\n3272,447\n3273,2775\n3274,447\n3275,217\n3275,301\n3275,304\n3275,589\n3275,631\n3275,752\n3275,932\n3275,968\n3275,1001\n3275,1010\n3275,1085\n3275,1122\n3275,1433\n3275,1715\n3276,30\n3276,137\n3276,772\n3276,1282\n3276,1332\n3277,920\n3278,143\n3279,86\n3279,595\n3279,818\n3279,985\n3279,1313\n3279,81648\n3280,171\n3281,72\n3282,344\n3283,285\n3284,1390\n3284,142870\n3285,10\n3285,693\n3285,907\n3285,3507\n3285,6424\n3287,338\n3287,525\n3287,1893\n3287,4039\n3288,1801\n3289,932\n3290,7\n3290,41\n3290,50\n3290,58\n3290,63\n3290,97\n3290,178\n3290,222\n3290,227\n3290,269\n3290,285\n3290,289\n3290,290\n3290,355\n3290,356\n3290,358\n3290,422\n3290,442\n3290,467\n3290,516\n3290,577\n3290,596\n3290,640\n3290,805\n3290,808\n3290,841\n3290,843\n3290,918\n3290,932\n3290,972\n3290,1012\n3290,1085\n3290,1425\n3290,1531\n3290,1571\n3290,1634\n3290,1639\n3290,1818\n3290,2572\n3290,2620\n3290,3209\n3290,3246\n3290,3247\n3290,3370\n3290,3507\n3290,6556\n3290,9015\n3290,14453\n3290,19010\n3290,115659\n3290,144988\n3290,147123\n3291,1265\n3291,1266\n3292,3293\n3294,424\n3294,1639\n3294,1801\n3294,3295\n3294,3296\n3295,3295\n3297,3111\n3298,292\n3298,1010\n3299,143\n3300,332\n3300,2797\n3300,3319\n3300,3328\n3300,3331\n3301,104\n3302,19\n3303,592\n3303,2797\n3304,312\n3305,675\n3306,406\n3306,622\n3306,1001\n3306,1289\n3306,3999\n3307,1368\n3307,22836\n3308,3309\n3310,104\n3311,247\n3312,3313\n3312,38053\n3314,417\n3314,589\n3314,1001\n3314,1085\n3314,2296\n3314,2590\n3315,1\n3318,1014\n3319,1807\n3320,3321\n3322,93\n3322,94\n3323,788\n3324,392\n3325,424\n3326,973\n3327,328\n3328,240\n3328,332\n3328,685\n3328,808\n3328,1285\n3328,1361\n3328,2512\n3328,3135\n3328,3328\n3328,4771\n3328,5419\n3328,24307\n3328,37515\n3328,44070\n3328,45127\n3328,45714\n3328,54448\n3328,57161\n3328,62419\n3328,88074\n3328,184908\n3328,195972\n3328,251481\n3328,258939\n3329,563\n3330,536\n3332,599\n3333,52\n3334,175\n3335,175\n3335,140270\n3335,212234\n3336,3337\n3338,1509\n3339,175\n3340,3182\n3341,323\n3342,3343\n3344,3345\n3346,79\n3346,704\n3346,1433\n3347,269\n3348,323\n3349,872\n3350,83\n3351,1231\n3351,1326\n3351,1411\n3352,920\n3353,83\n3354,54\n3354,221301\n3355,1368\n3356,3357\n3356,33291\n3356,91840\n3356,105871\n3356,110643\n3356,113283\n3356,117414\n3358,328\n3359,3360\n3361,406\n3362,457\n3362,497\n3363,323\n3364,126\n3365,872\n3366,3367\n3367,3\n3367,292\n3367,314\n3367,338\n3367,389\n3367,392\n3367,457\n3367,509\n3367,510\n3367,623\n3367,661\n3367,663\n3367,664\n3367,693\n3367,697\n3367,852\n3367,875\n3367,903\n3367,1011\n3367,1043\n3367,1238\n3367,1345\n3367,1424\n3367,1572\n3367,1584\n3367,1623\n3367,1722\n3367,1805\n3367,1992\n3367,2045\n3367,2191\n3367,2228\n3367,2824\n3367,3366\n3367,3367\n3367,3407\n3367,3713\n3367,3743\n3367,3757\n3367,3955\n3367,4740\n3367,5043\n3367,5258\n3367,5540\n3367,7401\n3367,8041\n3367,9756\n3367,12716\n3367,13905\n3367,15582\n3367,16667\n3367,17719\n3367,21607\n3367,21931\n3367,22939\n3367,24616\n3367,25673\n3367,26051\n3367,27814\n3367,29595\n3367,31080\n3367,31576\n3367,32645\n3367,33338\n3367,33830\n3367,34116\n3367,35978\n3367,36720\n3367,41774\n3367,42476\n3367,42575\n3367,43233\n3367,45715\n3367,46165\n3367,46321\n3367,46339\n3367,49362\n3367,50173\n3367,51977\n3367,52488\n3367,54341\n3367,54979\n3367,63079\n3367,63138\n3367,63375\n3367,70833\n3367,71184\n3367,80542\n3367,82294\n3367,82961\n3367,91641\n3367,96538\n3367,102695\n3367,104565\n3367,111189\n3367,111288\n3367,111405\n3367,112910\n3367,113083\n3367,113094\n3367,113131\n3367,115337\n3367,116747\n3367,116753\n3367,122807\n3367,128144\n3367,128637\n3367,133188\n3367,138174\n3367,138183\n3367,138824\n3367,139660\n3367,139942\n3367,140082\n3367,142508\n3367,146837\n3367,163848\n3367,174514\n3367,174519\n3367,175093\n3367,176233\n3367,176379\n3367,185305\n3367,186020\n3367,186250\n3367,194468\n3367,195128\n3367,216419\n3367,221105\n3367,222679\n3367,225334\n3367,249545\n3367,250105\n3367,254499\n3367,254930\n3367,255217\n3367,258275\n3368,10\n3368,11\n3368,79\n3368,83\n3368,203\n3368,251\n3368,252\n3368,323\n3368,435\n3368,485\n3368,516\n3368,718\n3368,920\n3368,1181\n3368,1222\n3368,3370\n3368,4831\n3368,5213\n3368,9179\n3368,9191\n3368,9208\n3369,389\n3369,1363\n3369,1467\n3369,1881\n3369,2266\n3369,2421\n3370,56\n3370,146\n3370,192\n3370,336\n3370,406\n3370,663\n3370,664\n3370,841\n3370,1309\n3370,1623\n3370,1663\n3370,106502\n3371,192\n3372,298\n3373,485\n3374,323\n3375,94\n3375,2787\n3376,422\n3376,602\n3377,682\n3377,1512\n3377,72439\n3377,181063\n3378,97\n3378,5101\n3378,15119\n3379,301\n3379,604\n3379,968\n3379,1231\n3379,1782\n3380,3381\n3380,217162\n3382,233\n3383,707\n3384,63\n3385,54\n3385,2775\n3386,160\n3386,720\n3386,22293\n3387,1801\n3388,3389\n3390,663\n3390,664\n3391,376\n3392,46\n3392,86\n3392,126\n3392,299\n3392,314\n3392,397\n3392,444\n3392,452\n3392,457\n3392,505\n3392,567\n3392,599\n3392,663\n3392,673\n3392,676\n3392,750\n3392,783\n3392,838\n3392,849\n3392,852\n3392,972\n3392,1010\n3392,1011\n3392,1014\n3392,1026\n3392,1118\n3392,1130\n3392,1167\n3392,1262\n3392,1284\n3392,1293\n3392,1298\n3392,1417\n3392,1436\n3392,1566\n3392,1616\n3392,1635\n3392,1732\n3392,1849\n3392,1891\n3392,2310\n3392,2562\n3392,2979\n3392,3392\n3392,3625\n3392,4066\n3392,4190\n3392,6824\n3392,6904\n3392,9457\n3392,18604\n3392,19413\n3392,67099\n3392,83327\n3392,90082\n3392,90619\n3392,131211\n3392,142816\n3392,152298\n3392,161152\n3392,163782\n3392,163804\n3392,207659\n3392,215874\n3392,216170\n3392,227061\n3392,238636\n3392,246092\n3392,249055\n3392,254235\n3393,8\n3394,707\n3395,219\n3396,1801\n3397,240\n3397,301\n3397,1796\n3397,2812\n3398,259\n3398,336\n3398,1163\n3399,323\n3400,392\n3400,697\n3400,3003\n3401,875\n3402,72\n3402,147\n3402,192\n3402,586\n3402,640\n3402,1181\n3402,1231\n3402,4192\n3402,4193\n3403,622\n3403,1033\n3404,783\n3405,32\n3405,54\n3405,56\n3405,79\n3405,102\n3405,160\n3405,182\n3405,299\n3405,301\n3405,312\n3405,372\n3405,388\n3405,415\n3405,452\n3405,483\n3405,596\n3405,609\n3405,644\n3405,687\n3405,736\n3405,770\n3405,875\n3405,891\n3405,968\n3405,972\n3405,1192\n3405,1298\n3405,1556\n3405,1616\n3405,1653\n3405,1749\n3405,1881\n3405,2421\n3405,2646\n3405,3003\n3405,3209\n3405,3623\n3405,3830\n3405,4760\n3405,4903\n3407,58\n3407,192\n3407,211\n3407,248\n3407,296\n3407,366\n3407,518\n3407,752\n3407,760\n3407,775\n3407,801\n3407,907\n3407,1113\n3407,1177\n3407,1326\n3407,1411\n3407,1531\n3407,1893\n3407,2006\n3407,2334\n3407,3367\n3407,5130\n3407,7155\n3407,73570\n3407,220502\n3408,358\n3408,3409\n3410,222\n3410,278\n3410,349\n3410,389\n3410,577\n3410,1871\n3411,140\n3411,163\n3411,264\n3411,515\n3411,647\n3411,1381\n3411,1509\n3411,2260\n3412,3413\n3413,3413\n3415,26\n3415,59\n3416,389\n3416,1858\n3417,4\n3417,5\n3417,259\n3417,750\n3417,762\n3418,72\n3419,2116\n3420,68\n3420,467\n3420,493\n3421,698\n3422,10\n3422,22\n3422,37\n3422,46\n3422,299\n3422,301\n3422,314\n3422,356\n3422,444\n3422,567\n3422,599\n3422,604\n3422,615\n3422,663\n3422,664\n3422,685\n3422,698\n3422,717\n3422,720\n3422,775\n3422,783\n3422,818\n3422,852\n3422,877\n3422,910\n3422,911\n3422,937\n3422,968\n3422,973\n3422,1011\n3422,1122\n3422,1160\n3422,1167\n3422,1231\n3422,1241\n3422,1262\n3422,1276\n3422,1284\n3422,1293\n3422,1300\n3422,1359\n3422,1522\n3422,1544\n3422,1566\n3422,1732\n3422,1740\n3422,1782\n3422,1831\n3422,1849\n3422,2085\n3422,2193\n3422,2979\n3422,3207\n3422,3422\n3422,3756\n3422,4018\n3422,4291\n3422,4523\n3422,5662\n3422,6910\n3422,7774\n3422,7787\n3422,8342\n3422,8679\n3422,9340\n3422,9561\n3422,14095\n3422,14598\n3422,15109\n3422,15588\n3422,16192\n3422,25273\n3422,25342\n3422,26161\n3422,27482\n3422,28487\n3422,30353\n3422,30367\n3422,33016\n3422,33296\n3422,33735\n3422,38217\n3422,39506\n3422,42598\n3422,50338\n3422,55888\n3422,57125\n3422,57127\n3422,57197\n3422,62983\n3422,72726\n3422,73355\n3422,75394\n3422,80060\n3422,82175\n3422,85946\n3422,87367\n3422,94255\n3422,95400\n3422,96685\n3422,96827\n3422,97152\n3422,102565\n3422,120021\n3422,120155\n3422,131889\n3422,136109\n3422,142936\n3422,144130\n3422,160373\n3422,164370\n3422,164836\n3422,170448\n3422,174868\n3422,175325\n3422,178819\n3422,179039\n3422,179851\n3422,181028\n3422,189303\n3422,207757\n3422,221828\n3422,226450\n3422,232802\n3422,233386\n3422,261792\n3423,1607\n3424,1983\n3425,392\n3425,1143\n3425,1363\n3426,269\n3427,32\n3428,605\n3428,968\n3428,2944\n3429,1267\n3430,206\n3431,1\n3431,195\n3431,202\n3431,203\n3431,563\n3431,994\n3431,1247\n3431,3161\n3433,3434\n3436,217\n3436,309\n3436,310\n3436,314\n3436,440\n3436,467\n3436,868\n3436,1433\n3436,3744\n3437,717\n3437,1284\n3437,1782\n3438,996\n3439,65\n3440,430\n3441,160\n3442,158\n3442,779\n3442,1515\n3443,392\n3443,433\n3443,1634\n3444,206\n3445,920\n3445,1414\n3446,3447\n3448,106\n3448,192\n3448,1388\n3449,1\n3449,50\n3449,147\n3449,158\n3449,192\n3449,406\n3449,620\n3449,779\n3449,835\n3449,1181\n3449,42064\n3449,68069\n3449,102560\n3449,149534\n3450,3451\n3450,3452\n3452,202\n3452,1243\n3453,130\n3453,140\n3453,264\n3453,479\n3453,515\n3453,809\n3453,835\n3453,1052\n3453,1381\n3453,1551\n3453,1579\n3453,1659\n3453,1893\n3453,1968\n3454,647\n3454,1175\n3455,167\n3455,186\n3455,390\n3455,694\n3455,801\n3455,877\n3455,907\n3455,972\n3455,973\n3455,1001\n3455,1140\n3455,1284\n3455,1326\n3455,1715\n3455,1732\n3455,1837\n3455,2646\n3455,4222\n3456,811\n3457,41\n3457,784\n3457,1564\n3457,1888\n3457,2620\n3457,258887\n3458,1639\n3459,2367\n3460,3461\n3462,671\n3462,1544\n3463,444\n3464,760\n3464,1631\n3466,3467\n3467,2285\n3467,3467\n3467,62151\n3467,101474\n3468,602\n3468,707\n3469,37\n3470,1247\n3471,298\n3472,485\n3473,58\n3473,328\n3473,510\n3473,557\n3473,596\n3473,634\n3473,784\n3473,1052\n3473,1177\n3473,1368\n3473,2701\n3473,3474\n3473,29008\n3474,58\n3474,87\n3474,104\n3474,292\n3474,356\n3474,441\n3474,599\n3474,609\n3474,676\n3474,784\n3474,911\n3474,1653\n3474,1796\n3474,1893\n3474,1973\n3474,2373\n3474,2436\n3474,2443\n3474,3507\n3474,4771\n3474,95554\n3475,19\n3475,808\n3475,1639\n3476,358\n3477,397\n3477,720\n3477,980\n3477,1117\n3478,838\n3479,1227\n3479,1229\n3479,86416\n3480,119\n3481,46\n3481,58\n3481,3482\n3481,3488\n3481,4104\n3481,4128\n3481,8956\n3481,15720\n3481,20275\n3481,20865\n3481,22260\n3481,22263\n3481,22267\n3481,24985\n3481,25531\n3481,26828\n3481,29568\n3481,34711\n3481,39397\n3481,54300\n3481,54329\n3481,59631\n3481,62246\n3481,63905\n3481,65857\n3481,73241\n3481,78707\n3481,80384\n3481,83452\n3481,83823\n3481,83826\n3481,86382\n3481,88339\n3481,89898\n3481,91434\n3481,97136\n3481,98209\n3481,103060\n3481,109816\n3481,112783\n3481,112784\n3481,112785\n3481,113047\n3481,115043\n3481,118238\n3481,125028\n3481,125031\n3481,125876\n3481,127162\n3481,128754\n3481,134102\n3481,135913\n3481,136985\n3481,140331\n3481,142849\n3481,152865\n3481,163743\n3481,163745\n3481,167178\n3481,167179\n3481,167180\n3481,167181\n3481,170615\n3481,173661\n3481,173662\n3481,177250\n3481,183264\n3481,183269\n3481,183270\n3481,183271\n3481,185845\n3481,186540\n3481,187018\n3481,189105\n3481,189731\n3481,191171\n3481,191172\n3481,191173\n3481,192319\n3481,213977\n3481,218343\n3481,218792\n3483,292\n3483,338\n3483,509\n3483,710\n3483,745\n3483,850\n3483,1715\n3483,1722\n3483,2512\n3483,4039\n3483,9024\n3484,2319\n3485,275\n3485,277\n3486,137\n3487,397\n3489,58\n3490,577\n3490,1429\n3491,306\n3491,307\n3492,3493\n3494,360\n3494,467\n3494,872\n3494,1572\n3494,1893\n3494,3538\n3495,1010\n3496,264\n3496,292\n3496,338\n3496,462\n3496,850\n3496,1130\n3496,1332\n3496,1572\n3496,2367\n3496,4039\n3496,4771\n3496,49057\n3497,111\n3497,167\n3497,326\n3497,392\n3497,467\n3497,510\n3497,589\n3497,872\n3497,968\n3497,1210\n3497,1284\n3497,1801\n3497,2557\n3497,2979\n3498,644\n3499,1467\n3500,2668\n3500,8270\n3501,143\n3502,2073\n3503,3\n3503,304\n3503,347\n3503,1773\n3504,135\n3504,137\n3504,186\n3504,240\n3504,294\n3504,328\n3504,431\n3504,518\n3504,557\n3504,596\n3504,631\n3504,634\n3504,772\n3504,784\n3504,805\n3504,808\n3504,862\n3504,943\n3504,1052\n3504,1284\n3504,1309\n3504,1368\n3504,1564\n3504,1732\n3504,2512\n3504,2701\n3504,3474\n3504,75912\n3505,83\n3505,126\n3506,65\n3507,10\n3507,20\n3507,34\n3507,35\n3507,87\n3507,140\n3507,167\n3507,192\n3507,202\n3507,207\n3507,248\n3507,278\n3507,283\n3507,294\n3507,301\n3507,313\n3507,332\n3507,333\n3507,337\n3507,346\n3507,356\n3507,372\n3507,389\n3507,392\n3507,393\n3507,406\n3507,425\n3507,442\n3507,446\n3507,452\n3507,455\n3507,457\n3507,509\n3507,510\n3507,516\n3507,572\n3507,590\n3507,622\n3507,623\n3507,626\n3507,631\n3507,636\n3507,640\n3507,673\n3507,685\n3507,693\n3507,697\n3507,704\n3507,775\n3507,779\n3507,795\n3507,838\n3507,841\n3507,843\n3507,849\n3507,872\n3507,907\n3507,911\n3507,929\n3507,932\n3507,949\n3507,973\n3507,992\n3507,1001\n3507,1007\n3507,1014\n3507,1021\n3507,1085\n3507,1118\n3507,1133\n3507,1140\n3507,1172\n3507,1175\n3507,1240\n3507,1241\n3507,1267\n3507,1276\n3507,1284\n3507,1309\n3507,1326\n3507,1392\n3507,1411\n3507,1434\n3507,1453\n3507,1454\n3507,1467\n3507,1515\n3507,1522\n3507,1551\n3507,1566\n3507,1696\n3507,1715\n3507,1722\n3507,1796\n3507,1818\n3507,1844\n3507,1848\n3507,1881\n3507,1891\n3507,1927\n3507,1955\n3507,1973\n3507,2008\n3507,2045\n3507,2173\n3507,2421\n3507,2607\n3507,2726\n3507,2744\n3507,2752\n3507,2979\n3507,3182\n3507,3285\n3507,3407\n3507,3804\n3507,3944\n3507,4327\n3507,4367\n3507,5115\n3507,5265\n3507,5440\n3507,6748\n3507,7087\n3507,7928\n3507,8243\n3507,8563\n3507,12883\n3507,13207\n3507,13473\n3507,14256\n3507,14379\n3507,14674\n3507,15217\n3507,15658\n3507,17364\n3507,20767\n3507,21528\n3507,23087\n3507,27517\n3507,29078\n3507,30770\n3507,31207\n3507,31212\n3507,31322\n3507,32644\n3507,32819\n3507,35895\n3507,38394\n3507,39509\n3507,39570\n3507,40498\n3507,43670\n3507,44205\n3507,44981\n3507,49498\n3507,52902\n3507,55054\n3507,63081\n3507,64295\n3507,66411\n3507,66593\n3507,71018\n3507,71305\n3507,75912\n3507,76996\n3507,77671\n3507,81311\n3507,84459\n3507,88542\n3507,93521\n3507,93533\n3507,93536\n3507,93541\n3507,93542\n3507,93588\n3507,94939\n3507,110883\n3507,114159\n3507,115971\n3507,119270\n3507,124368\n3507,129777\n3507,130752\n3507,136631\n3507,137119\n3507,146278\n3507,146395\n3507,150136\n3507,152420\n3507,155019\n3507,155654\n3507,163515\n3507,175246\n3507,175984\n3507,180286\n3507,217550\n3507,236754\n3507,242367\n3507,247758\n3508,104\n3508,134\n3508,240\n3508,289\n3508,290\n3508,631\n3508,636\n3508,714\n3508,760\n3508,1149\n3508,1462\n3508,2205\n3508,2206\n3508,4237\n3508,8180\n3508,8537\n3508,33424\n3508,94134\n3509,811\n3509,900\n3509,1805\n3509,2460\n3509,4760\n3510,3511\n3513,146\n3513,313\n3513,467\n3513,685\n3513,733\n3513,862\n3513,900\n3513,1070\n3513,1220\n3513,1222\n3513,2460\n3513,6119\n3513,26450\n3513,92476\n3514,577\n3515,620\n3516,207\n3517,694\n3517,3623\n3519,272\n3519,991\n3519,1070\n3520,72\n3521,344\n3522,285\n3523,222\n3524,20\n3524,126\n3524,178\n3524,207\n3524,222\n3524,240\n3524,259\n3524,299\n3524,336\n3524,397\n3524,441\n3524,452\n3524,455\n3524,456\n3524,510\n3524,676\n3524,685\n3524,794\n3524,808\n3524,838\n3524,911\n3524,972\n3524,1021\n3524,1089\n3524,1191\n3524,1204\n3524,1240\n3524,1267\n3524,1293\n3524,1402\n3524,1445\n3524,1559\n3524,1663\n3524,1677\n3524,1927\n3524,1992\n3524,2253\n3524,2512\n3524,2704\n3524,2923\n3524,3392\n3524,3945\n3524,3948\n3524,4114\n3524,4190\n3524,4276\n3524,5570\n3524,6824\n3524,7845\n3524,7849\n3524,7906\n3524,8231\n3524,8282\n3524,8293\n3524,8676\n3524,20553\n3524,22434\n3524,26450\n3524,29753\n3524,30547\n3524,31111\n3524,32885\n3524,34030\n3524,34229\n3524,34286\n3524,34553\n3524,40497\n3524,41344\n3524,42615\n3524,42753\n3524,50150\n3524,55623\n3524,63412\n3524,64542\n3524,75912\n3524,91247\n3524,99060\n3524,99644\n3524,101842\n3524,161203\n3524,174780\n3524,176746\n3524,178911\n3524,182786\n3524,184392\n3524,188661\n3524,207659\n3524,214663\n3524,216085\n3525,783\n3528,2173\n3529,397\n3529,516\n3530,143\n3531,1634\n3532,1785\n3534,397\n3535,134\n3535,192\n3535,712\n3536,48\n3536,107\n3536,192\n3536,206\n3536,328\n3536,366\n3536,452\n3536,481\n3536,596\n3536,743\n3536,827\n3536,949\n3536,1113\n3536,1127\n3536,1240\n3536,1415\n3536,1419\n3536,1453\n3536,1465\n3536,1509\n3536,1860\n3536,1882\n3536,2353\n3536,3623\n3536,3695\n3536,5718\n3536,27550\n3536,103860\n3538,30\n3538,107\n3538,111\n3538,130\n3538,175\n3538,227\n3538,338\n3538,441\n3538,446\n3538,462\n3538,502\n3538,685\n3538,805\n3538,903\n3538,911\n3538,1011\n3538,1014\n3538,1146\n3538,1151\n3538,1238\n3538,1572\n3538,1688\n3538,1722\n3538,1758\n3538,1978\n3538,2194\n3538,2582\n3538,2802\n3538,3494\n3538,3507\n3538,3538\n3538,3539\n3538,3830\n3538,4039\n3538,4114\n3538,4520\n3538,4771\n3538,5498\n3538,5608\n3538,6896\n3538,7085\n3538,13538\n3538,13625\n3538,14353\n3538,15493\n3538,16562\n3538,17173\n3538,18299\n3538,19579\n3538,19595\n3538,20738\n3538,21004\n3538,21133\n3538,21334\n3538,22535\n3538,22576\n3538,26051\n3538,26084\n3538,28478\n3538,28977\n3538,29760\n3538,31067\n3538,32819\n3538,32848\n3538,32978\n3538,33585\n3538,34906\n3538,35710\n3538,35721\n3538,36300\n3538,36841\n3538,37498\n3538,38279\n3538,40486\n3538,41173\n3538,42094\n3538,42114\n3538,43170\n3538,50254\n3538,50695\n3538,52811\n3538,55964\n3538,59396\n3538,61780\n3538,62499\n3538,62506\n3538,63490\n3538,67986\n3538,71081\n3538,74698\n3538,75199\n3538,82299\n3538,87133\n3538,88705\n3538,92354\n3538,98377\n3538,99750\n3538,100309\n3538,105615\n3538,105868\n3538,106237\n3538,106796\n3538,107366\n3538,108767\n3538,113577\n3538,118518\n3538,123201\n3538,124164\n3538,124210\n3538,135424\n3538,138028\n3538,144178\n3538,144730\n3538,145134\n3538,147526\n3538,147697\n3538,153883\n3538,155997\n3538,165221\n3538,165431\n3538,171171\n3538,172107\n3538,176555\n3538,176814\n3538,178827\n3538,179743\n3538,180972\n3538,182895\n3538,185537\n3538,189361\n3538,189982\n3538,192342\n3538,215449\n3538,215929\n3538,227227\n3538,236291\n3538,252027\n3538,256410\n3538,259346\n3539,147\n3539,644\n3539,805\n3539,1927\n3539,3538\n3541,491\n3542,222\n3543,366\n3543,500\n3544,1007\n3544,1515\n3545,292\n3546,1043\n3547,267\n3548,65\n3549,3550\n3551,634\n3552,1033\n3553,626\n3554,1096\n3554,3555\n3555,11\n3555,111\n3555,211\n3555,217\n3555,911\n3555,1096\n3555,1796\n3555,2704\n3555,3554\n3555,3555\n3555,5089\n3555,5144\n3555,5254\n3555,7117\n3555,8072\n3555,13217\n3555,14388\n3555,39487\n3555,46695\n3555,58245\n3555,62245\n3555,75196\n3555,86588\n3555,101528\n3555,146005\n3555,159690\n3555,189695\n3555,215912\n3555,244009\n3556,744\n3557,182\n3557,309\n3557,310\n3557,3039\n3558,344\n3559,397\n3559,868\n3560,444\n3560,968\n3562,346\n3563,1068\n3564,567\n3565,30\n3565,134\n3565,175\n3565,233\n3565,248\n3565,289\n3565,290\n3565,304\n3565,328\n3565,440\n3565,450\n3565,622\n3565,693\n3565,704\n3565,714\n3565,760\n3565,772\n3565,953\n3565,1085\n3565,1179\n3565,1282\n3565,1305\n3565,1402\n3565,1415\n3565,1818\n3565,1939\n3565,1973\n3565,2206\n3565,2210\n3565,2286\n3565,2315\n3565,4218\n3565,4237\n3565,4941\n3565,5405\n3565,7757\n3565,8180\n3565,28203\n3565,33424\n3565,95674\n3565,111142\n3565,141912\n3566,192\n3566,760\n3566,1119\n3566,1631\n3567,783\n3567,1294\n3568,1127\n3569,65\n3569,66\n3569,467\n3569,868\n3569,1433\n3569,3744\n3570,347\n3570,953\n3570,1309\n3570,1462\n3570,1893\n3570,7757\n3571,56\n3571,147\n3571,158\n3571,192\n3571,1181\n3571,118336\n3571,240174\n3572,298\n3573,485\n3574,2411\n3575,46\n3575,744\n3575,1124\n3576,439\n3576,1612\n3576,1776\n3576,1877\n3577,818\n3578,151\n3578,801\n3578,818\n3578,862\n3578,1803\n3578,2979\n3579,195\n3580,240\n3580,301\n3580,968\n3581,3582\n3582,252\n3582,397\n3582,849\n3582,1014\n3582,1445\n3582,1566\n3582,1968\n3582,2085\n3582,3581\n3582,3582\n3582,4190\n3582,5192\n3582,9457\n3582,34208\n3582,46303\n3582,59689\n3582,63866\n3582,65760\n3582,66563\n3582,75912\n3582,90079\n3582,120155\n3582,181590\n3582,195998\n3582,216403\n3582,223726\n3582,223931\n3582,224625\n3582,225590\n3582,230382\n3582,240144\n3582,243669\n3582,246015\n3582,249653\n3582,250780\n3582,261745\n3583,920\n3583,1877\n3584,54\n3584,278\n3584,304\n3584,577\n3584,589\n3584,626\n3584,752\n3584,1151\n3584,1309\n3584,1479\n3584,1634\n3584,1871\n3584,2421\n3584,3507\n3584,3585\n3584,9015\n3584,14483\n3585,104\n3585,225\n3585,312\n3585,515\n3585,953\n3585,991\n3585,1267\n3585,1285\n3585,1298\n3585,1326\n3585,1659\n3585,1749\n3585,2605\n3585,2744\n3585,3585\n3585,5130\n3586,104\n3586,862\n3587,1429\n3588,1474\n3589,340\n3589,811\n3590,254\n3590,312\n3590,338\n3590,525\n3590,784\n3590,1749\n3590,1882\n3590,49057\n3591,577\n3592,406\n3592,779\n3593,158\n3593,406\n3593,1181\n3594,1388\n3595,2460\n3596,1007\n3598,344\n3599,312\n3599,510\n3599,525\n3600,875\n3601,3602\n3602,3602\n3603,83\n3603,788\n3604,273\n3604,274\n3605,497\n3606,1332\n3607,372\n3607,1955\n3608,306\n3608,307\n3609,79\n3609,192\n3609,1014\n3609,1732\n3610,818\n3610,2620\n3611,34\n3611,222\n3611,283\n3611,631\n3611,1698\n3611,6424\n3611,25275\n3611,117696\n3613,104\n3613,134\n3613,135\n3613,136\n3613,137\n3613,138\n3613,557\n3613,1368\n3614,718\n3615,302\n3616,140\n3618,37\n3619,1309\n3619,1745\n3619,2205\n3619,33424\n3620,264\n3620,1509\n3620,1551\n3620,3041\n3621,431\n3621,442\n3622,515\n3623,417\n3623,589\n3623,685\n3623,694\n3623,715\n3623,795\n3623,862\n3623,911\n3623,969\n3623,1082\n3623,1085\n3623,1242\n3623,1257\n3623,2296\n3623,2572\n3623,2646\n3623,2747\n3623,2775\n3623,3115\n3623,3623\n3623,3841\n3623,3964\n3623,4222\n3623,7194\n3623,7731\n3623,13304\n3623,13835\n3623,14294\n3623,14925\n3623,18880\n3623,23671\n3623,26034\n3623,31763\n3623,42029\n3623,44192\n3623,44725\n3623,44951\n3623,48505\n3623,49535\n3623,51961\n3623,51972\n3623,59998\n3623,71836\n3623,71890\n3623,73400\n3623,75912\n3623,82703\n3623,83903\n3623,87969\n3623,88645\n3623,89816\n3623,93248\n3623,94365\n3623,96830\n3623,97238\n3623,97256\n3623,98378\n3623,99824\n3623,102750\n3623,108122\n3623,109493\n3623,116074\n3623,119470\n3623,122212\n3623,122591\n3623,128734\n3623,135104\n3623,138030\n3623,154290\n3623,155740\n3623,157570\n3623,166631\n3623,168602\n3623,169660\n3623,169898\n3623,172494\n3623,177437\n3623,178576\n3623,179740\n3623,180277\n3623,183405\n3623,183410\n3623,185874\n3623,185877\n3623,237644\n3623,244924\n3623,246605\n3623,261958\n3624,86\n3625,3392\n3626,346\n3626,467\n3626,538\n3626,671\n3626,1590\n3626,2353\n3627,640\n3629,217\n3629,390\n3629,615\n3629,818\n3629,907\n3629,968\n3629,1010\n3629,1167\n3629,1436\n3629,1522\n3629,1796\n3629,1849\n3629,2191\n3629,2480\n3629,3422\n3629,3630\n3629,3804\n3629,5130\n3629,72764\n3630,46\n3630,167\n3630,299\n3630,425\n3630,459\n3630,783\n3630,852\n3630,1300\n3630,1522\n3630,1544\n3630,1849\n3630,1853\n3630,1949\n3630,2083\n3630,2192\n3630,2193\n3630,3630\n3630,5301\n3630,6032\n3630,14290\n3630,15291\n3630,15380\n3630,15463\n3630,15474\n3630,15588\n3630,17894\n3630,18863\n3630,31414\n3630,32784\n3630,39535\n3630,42767\n3630,44859\n3630,52862\n3630,55898\n3630,57180\n3630,57183\n3630,57411\n3630,71159\n3630,74635\n3630,80655\n3630,93188\n3630,96685\n3630,96855\n3630,136526\n3630,152474\n3630,157419\n3630,165919\n3630,174779\n3630,182909\n3630,185880\n3630,186497\n3630,218884\n3630,229082\n3630,230344\n3630,237368\n3630,247242\n3630,247269\n3630,248011\n3630,248018\n3630,249687\n3630,249695\n3630,258192\n3630,260183\n3631,104\n3631,557\n3631,953\n3631,954\n3631,5405\n3632,360\n3632,473\n3633,225\n3633,248\n3633,943\n3633,1332\n3633,5405\n3634,718\n3634,893\n3635,579\n3636,657\n3636,6955\n3637,202\n3637,203\n3637,28755\n3638,647\n3638,1175\n3639,875\n3640,3193\n3641,309\n3641,310\n3641,483\n3641,6556\n3642,63\n3643,313\n3643,2421\n3644,8\n3644,5034\n3645,712\n3646,222\n3646,657\n3646,2421\n3646,2424\n3647,675\n3648,338\n3648,360\n3648,835\n3648,872\n3648,1224\n3648,1659\n3648,2051\n3648,13538\n3648,81070\n3649,48\n3649,160\n3649,827\n3649,1509\n3649,1639\n3650,1466\n3651,493\n3652,1058\n3652,3653\n3653,256\n3653,491\n3653,668\n3653,676\n3653,827\n3653,849\n3653,852\n3653,1087\n3653,2460\n3653,3653\n3653,4190\n3653,5192\n3654,328\n3654,1179\n3655,3656\n3655,26062\n3655,36135\n3655,36592\n3655,42155\n3655,47683\n3655,57843\n3655,58611\n3655,60903\n3655,63971\n3655,65891\n3657,72\n3658,2353\n3659,2353\n3660,1235\n3660,1335\n3664,2353\n3665,2353\n3668,1058\n3668,13538\n3669,337\n3669,577\n3670,422\n3671,346\n3671,439\n3671,1033\n3671,1789\n3672,34\n3672,35\n3672,134\n3672,187\n3672,217\n3672,222\n3672,283\n3672,289\n3672,290\n3672,455\n3672,536\n3672,631\n3672,657\n3672,1010\n3672,1019\n3672,1210\n3672,1282\n3672,1417\n3672,1467\n3672,1635\n3672,1801\n3672,2266\n3672,2646\n3672,3182\n3672,6424\n3672,20771\n3672,94134\n3672,115474\n3673,422\n3674,422\n3675,2205\n3675,2206\n3675,33424\n3676,422\n3677,720\n3677,980\n3678,2105\n3679,422\n3680,2353\n3681,79\n3681,192\n3681,579\n3681,589\n3681,868\n3681,1425\n3681,6119\n3682,772\n3682,1388\n3684,269\n3685,431\n3685,1252\n3685,1253\n3686,222\n3686,379\n3686,399\n3686,634\n3686,657\n3686,2646\n3686,5591\n3687,972\n3687,1010\n3687,1849\n3687,32784\n3688,32\n3688,206\n3689,1368\n3690,673\n3691,66\n3692,718\n3693,1359\n3694,631\n3694,760\n3694,1402\n3694,1531\n3694,1631\n3695,48\n3695,72\n3695,758\n3695,1011\n3695,1267\n3695,1639\n3695,2253\n3695,2775\n3695,3538\n3695,3695\n3695,155473\n3696,22\n3696,652\n3696,3769\n3696,3804\n3697,3698\n3698,3700\n3698,3712\n3698,4561\n3698,22005\n3698,55237\n3698,62996\n3698,90667\n3698,91232\n3698,91827\n3698,98048\n3698,101821\n3698,102854\n3698,136631\n3698,254266\n3698,263073\n3699,697\n3699,809\n3699,1240\n3701,1243\n3702,671\n3704,422\n3705,422\n3706,422\n3707,422\n3708,422\n3709,2315\n3709,2775\n3710,422\n3711,302\n3711,2116\n3713,852\n3713,1722\n3713,3367\n3713,21982\n3714,615\n3715,431\n3715,631\n3715,1119\n3715,185877\n3716,818\n3717,358\n3717,611\n3718,106\n3718,186\n3718,518\n3718,775\n3718,1326\n3718,1411\n3718,1837\n3718,3804\n3718,5961\n3718,190492\n3719,248\n3719,450\n3719,1332\n3720,30\n3721,875\n3721,1117\n3721,1262\n3722,81\n3722,273\n3722,274\n3722,338\n3722,626\n3722,862\n3722,1085\n3722,1433\n3722,1465\n3722,1556\n3722,1634\n3722,1881\n3722,2367\n3722,2528\n3722,3041\n3722,5718\n3722,9015\n3723,3724\n3724,259\n3724,911\n3724,980\n3724,3724\n3724,7921\n3724,8007\n3724,15179\n3724,15988\n3724,18618\n3724,20232\n3724,39378\n3724,41179\n3724,44900\n3724,63495\n3724,74457\n3724,74532\n3724,76038\n3724,104325\n3724,125488\n3724,126697\n3724,140307\n3724,145462\n3725,415\n3726,20\n3726,315\n3727,30\n3727,366\n3727,805\n3727,1177\n3727,2210\n3727,4237\n3727,6556\n3727,182162\n3728,22\n3728,861\n3729,34\n3729,35\n3729,1078\n3729,1313\n3729,1618\n3729,2944\n3729,3729\n3729,4223\n3729,7768\n3729,13137\n3729,19443\n3730,718\n3731,675\n3732,1345\n3733,143\n3734,1010\n3734,1122\n3735,272\n3736,3003\n3737,72\n3738,240\n3738,1818\n3739,1673\n3741,392\n3742,399\n3742,40566\n3743,30\n3743,278\n3743,328\n3743,415\n3743,440\n3743,509\n3743,3367\n3744,34\n3744,65\n3744,171\n3744,186\n3744,264\n3744,302\n3744,314\n3744,352\n3744,457\n3744,467\n3744,631\n3744,868\n3744,872\n3744,1019\n3744,1262\n3744,1433\n3744,1518\n3744,1785\n3744,1796\n3744,1844\n3744,2895\n3744,3569\n3744,3744\n3744,4446\n3744,5498\n3744,5524\n3744,5596\n3744,5702\n3744,6467\n3744,7178\n3744,7880\n3744,8161\n3744,8337\n3744,12395\n3744,12752\n3744,16586\n3744,21382\n3744,21411\n3744,22277\n3744,26133\n3744,28360\n3744,34232\n3745,186\n3746,1323\n3747,102\n3748,1326\n3749,408\n3750,535\n3751,392\n3754,1837\n3755,1452\n3756,567\n3756,663\n3756,752\n3756,937\n3756,968\n3756,1293\n3756,2083\n3756,2217\n3756,2480\n3756,2557\n3756,2595\n3756,3756\n3756,6645\n3756,36681\n3756,44385\n3756,48545\n3756,54504\n3756,88306\n3756,102695\n3756,107942\n3756,141934\n3756,151445\n3756,165651\n3756,167083\n3756,240943\n3756,263834\n3757,3367\n3758,408\n3759,195\n3759,596\n3759,784\n3759,1052\n3760,760\n3760,1149\n3760,1631\n3761,1849\n3761,32784\n3762,344\n3762,710\n3762,1711\n3762,1836\n3763,32\n3763,392\n3763,918\n3763,1453\n3763,1711\n3763,3003\n3763,76096\n3764,875\n3765,160\n3767,1345\n3768,3769\n3770,1203\n3771,372\n3771,1203\n3771,1955\n3772,298\n3773,485\n3774,301\n3774,615\n3774,968\n3774,973\n3774,1001\n3774,1231\n3774,1241\n3774,1298\n3774,1436\n3774,1522\n3774,1564\n3774,1832\n3774,2083\n3774,2557\n3774,2979\n3775,392\n3775,1454\n3776,760\n3777,505\n3778,1707\n3779,417\n3780,151\n3781,1240\n3782,1453\n3782,1722\n3783,861\n3784,949\n3784,1167\n3784,2979\n3786,1240\n3787,143\n3787,1052\n3788,1949\n3788,4760\n3789,360\n3790,397\n3791,1001\n3792,408\n3792,2260\n3792,37088\n3793,390\n3794,26\n3794,28\n3794,47\n3794,59\n3794,117\n3794,138\n3794,430\n3794,446\n3794,805\n3794,885\n3794,887\n3794,994\n3794,1235\n3794,1255\n3794,1335\n3794,1432\n3794,1684\n3794,1775\n3794,2156\n3794,2469\n3794,2712\n3794,3561\n3794,3794\n3794,3795\n3794,3796\n3794,4114\n3794,4571\n3794,9537\n3794,21944\n3794,50943\n3794,67397\n3794,88820\n3794,171294\n3797,3798\n3799,393\n3799,980\n3800,602\n3801,1849\n3801,32784\n3802,71\n3802,1243\n3803,503\n3803,631\n3803,1085\n3803,2206\n3804,186\n3804,217\n3804,301\n3804,452\n3804,518\n3804,525\n3804,599\n3804,764\n3804,765\n3804,775\n3804,818\n3804,838\n3804,872\n3804,877\n3804,972\n3804,973\n3804,1010\n3804,1118\n3804,1130\n3804,1284\n3804,1326\n3804,1411\n3804,1545\n3804,1566\n3804,1599\n3804,1796\n3804,1849\n3804,2006\n3804,2173\n3804,2373\n3804,2979\n3804,3507\n3804,3696\n3804,3718\n3804,3804\n3804,4213\n3804,4308\n3804,4411\n3804,5130\n3804,5382\n3804,5388\n3804,5589\n3804,5825\n3804,5961\n3804,6579\n3804,6776\n3804,6904\n3804,7222\n3804,7840\n3804,8177\n3804,16716\n3804,18494\n3804,18585\n3804,19387\n3804,20506\n3804,25565\n3804,31802\n3804,35095\n3804,39566\n3804,44913\n3804,45032\n3804,48006\n3804,48149\n3804,48418\n3804,48980\n3804,49839\n3804,49939\n3804,50164\n3804,51719\n3804,52927\n3804,55340\n3804,55707\n3804,56008\n3804,61090\n3804,61147\n3804,63566\n3804,63900\n3804,67017\n3804,68648\n3804,82462\n3804,82746\n3804,101955\n3804,111162\n3804,111954\n3804,112433\n3804,114682\n3804,115479\n3804,119896\n3804,125366\n3804,131945\n3804,145096\n3804,148034\n3804,148309\n3804,156945\n3804,163942\n3804,167569\n3804,172494\n3804,184791\n3804,187176\n3804,214915\n3804,215005\n3804,216055\n3804,216123\n3804,219185\n3804,223489\n3804,229695\n3805,344\n3806,68\n3807,772\n3807,15807\n3808,140\n3809,167\n3809,301\n3809,604\n3809,615\n3809,872\n3809,968\n3809,1231\n3809,1293\n3809,5662\n3811,58\n3812,356\n3812,1247\n3813,336\n3813,1803\n3813,21442\n3814,240\n3814,1203\n3814,8541\n3815,338\n3815,489\n3818,1732\n3819,87\n3819,392\n3819,509\n3819,595\n3819,872\n3819,1151\n3819,1572\n3819,2274\n3820,138\n3820,167\n3820,536\n3820,849\n3820,862\n3820,1011\n3820,1085\n3820,1181\n3820,1837\n3820,1849\n3820,1871\n3820,2083\n3820,2210\n3820,2867\n3820,4237\n3820,22880\n3821,489\n3822,431\n3823,273\n3823,274\n3823,66754\n3824,891\n3825,1127\n3826,1127\n3827,289\n3827,290\n3828,217\n3828,920\n3828,1118\n3829,240\n3829,861\n3829,2017\n3829,3830\n3830,292\n3830,441\n3830,581\n3830,609\n3830,745\n3830,852\n3830,1238\n3830,1424\n3830,1653\n3830,1677\n3830,2163\n3830,2201\n3830,6581\n3830,14353\n3830,23311\n3830,24500\n3830,27033\n3830,34709\n3830,35487\n3830,40947\n3830,42428\n3830,45883\n3830,48024\n3830,59664\n3830,138099\n3830,138102\n3830,174849\n3830,176040\n3830,196147\n3830,212367\n3830,214558\n3830,220899\n3830,236043\n3830,256442\n3830,260851\n3831,439\n3831,671\n3831,934\n3831,1068\n3831,1474\n3831,1612\n3832,240\n3832,1085\n3833,534\n3833,1085\n3834,360\n3834,1224\n3834,1673\n3834,3177\n3835,493\n3835,682\n3835,980\n3835,72439\n3835,215276\n3836,467\n3836,536\n3836,703\n3836,868\n3836,1118\n3836,3612\n3837,1203\n3837,1955\n3838,240\n3838,433\n3838,1298\n3839,26\n3839,59\n3839,21944\n3840,104\n3840,134\n3840,137\n3840,138\n3841,534\n3841,1085\n3841,3623\n3841,75912\n3842,364\n3843,192\n3843,289\n3843,290\n3843,298\n3843,1146\n3843,1745\n3843,94134\n3844,1474\n3845,3846\n3847,527\n3847,74541\n3847,95152\n3847,183859\n3847,183861\n3847,196039\n3848,2372\n3848,2557\n3849,240\n3850,2379\n3851,3852\n3853,536\n3853,1433\n3854,175\n3855,302\n3855,811\n3856,893\n3857,489\n3857,1014\n3857,1181\n3858,2979\n3859,344\n3862,50\n3862,79\n3862,111\n3862,147\n3862,158\n3862,192\n3862,333\n3862,346\n3862,406\n3862,435\n3862,538\n3862,622\n3862,779\n3862,1033\n3862,1181\n3862,1265\n3862,1266\n3862,1388\n3862,2931\n3862,3872\n3863,1\n3864,202\n3864,203\n3864,206\n3864,4453\n3865,397\n3866,34\n3866,35\n3866,65\n3866,167\n3866,178\n3866,186\n3866,215\n3866,217\n3866,248\n3866,252\n3866,264\n3866,301\n3866,304\n3866,309\n3866,310\n3866,372\n3866,390\n3866,392\n3866,433\n3866,435\n3866,439\n3866,444\n3866,457\n3866,467\n3866,518\n3866,536\n3866,538\n3866,714\n3866,720\n3866,784\n3866,795\n3866,868\n3866,872\n3866,932\n3866,1010\n3866,1085\n3866,1119\n3866,1133\n3866,1210\n3866,1300\n3866,1326\n3866,1522\n3866,1531\n3866,1715\n3866,1782\n3866,1796\n3866,2191\n3866,2646\n3866,2979\n3866,5961\n3866,7194\n3866,31206\n3866,31896\n3866,221292\n3867,261\n3867,760\n3867,805\n3867,818\n3867,1353\n3869,604\n3869,750\n3870,302\n3871,167\n3871,301\n3871,783\n3871,968\n3871,1293\n3871,1479\n3873,41\n3875,1370\n3875,2782\n3875,3876\n3876,589\n3877,56\n3877,1181\n3878,707\n3879,240\n3879,372\n3879,417\n3879,1564\n3879,1635\n3879,1818\n3879,1955\n3879,2205\n3879,2206\n3879,2296\n3879,9025\n3879,33424\n3880,217\n3880,222\n3880,392\n3880,595\n3880,657\n3880,1454\n3880,1860\n3880,1949\n3880,2266\n3880,3258\n3881,397\n3882,1400\n3883,301\n3883,968\n3884,65\n3884,467\n3884,868\n3885,1241\n3886,160\n3887,1400\n3888,483\n3889,1707\n3890,77\n3890,269\n3891,202\n3891,203\n3892,473\n3893,1010\n3894,1058\n3896,195\n3896,841\n3896,1181\n3896,1803\n3896,3370\n3896,8244\n3896,8329\n3896,8330\n3896,9394\n3896,23783\n3896,25555\n3896,26414\n3896,30331\n3896,42569\n3896,92476\n3896,106502\n3897,333\n3898,1821\n3898,21736\n3899,273\n3899,274\n3901,4\n3901,5\n3901,10\n3901,86\n3901,158\n3901,160\n3901,209\n3901,222\n3901,298\n3901,397\n3901,422\n3901,497\n3901,589\n3901,657\n3901,760\n3901,1010\n3901,1019\n3901,1274\n3901,1572\n3901,1803\n3901,8270\n3901,21944\n3901,69829\n3902,592\n3903,435\n3903,439\n3903,1474\n3903,1789\n3904,200\n3904,3209\n3905,493\n3906,264\n3906,515\n3906,1381\n3907,1844\n3908,54\n3909,1749\n3910,1837\n3911,77\n3911,269\n3912,37\n3912,65\n3912,71\n3912,272\n3912,611\n3912,717\n3912,1070\n3912,1449\n3912,1782\n3913,1\n3914,1631\n3915,1235\n3915,1335\n3916,392\n3916,1240\n3916,3260\n3917,1433\n3918,143\n3919,137\n3921,209\n3921,302\n3921,861\n3922,50\n3922,663\n3922,1515\n3923,505\n3924,346\n3924,1033\n3925,534\n3926,1608\n3927,269\n3927,1433\n3928,273\n3928,274\n3929,1639\n3930,557\n3930,1844\n3931,1082\n3933,192\n3933,336\n3933,455\n3933,949\n3933,2646\n3934,1639\n3935,1579\n3936,1590\n3936,1644\n3936,221315\n3937,217\n3937,240\n3937,309\n3937,310\n3937,457\n3937,483\n3937,577\n3937,590\n3937,592\n3937,623\n3937,673\n3937,949\n3937,1010\n3937,1085\n3937,1118\n3937,1143\n3937,1417\n3937,1805\n3937,1818\n3937,1849\n3937,2253\n3937,2671\n3937,3039\n3937,32784\n3937,88653\n3937,88654\n3938,349\n3938,392\n3938,577\n3939,805\n3939,1149\n3942,240\n3942,2979\n3943,158\n3944,104\n3944,134\n3944,298\n3944,417\n3944,589\n3944,611\n3944,636\n3944,805\n3944,862\n3944,1085\n3944,1167\n3944,1179\n3944,1844\n3944,1973\n3944,2083\n3944,2209\n3944,3507\n3944,4222\n3944,5961\n3944,26181\n3944,75912\n3945,3524\n3945,4190\n3946,920\n3947,760\n3947,1631\n3948,3524\n3949,2639\n3949,3950\n3949,9197\n3949,13809\n3949,20541\n3949,21614\n3949,29015\n3949,29426\n3949,31894\n3949,33528\n3949,37915\n3949,40758\n3949,44927\n3949,55161\n3949,56348\n3949,63908\n3949,75232\n3949,97646\n3949,113013\n3949,133106\n3949,136628\n3949,148164\n3949,148230\n3949,148927\n3949,158060\n3949,159163\n3949,161022\n3949,162612\n3949,165407\n3949,166629\n3949,168830\n3949,172524\n3949,177285\n3949,183290\n3949,189313\n3949,189699\n3949,192454\n3949,200481\n3949,215861\n3949,229680\n3949,249194\n3949,251953\n3951,107\n3951,259\n3951,2646\n3952,1663\n3953,417\n3954,417\n3955,120\n3955,349\n3955,433\n3955,509\n3955,1392\n3955,3367\n3955,7124\n3956,1181\n3957,932\n3958,397\n3959,3960\n3960,3960\n3961,861\n3962,192\n3962,256\n3963,392\n3963,1151\n3963,1836\n3964,135\n3964,289\n3964,290\n3964,364\n3964,583\n3964,609\n3964,694\n3964,1257\n3964,1359\n3964,2315\n3964,2775\n3964,3115\n3964,3623\n3964,3695\n3964,94134\n3966,2989\n3966,2991\n3967,352\n3967,467\n3967,481\n3967,497\n3967,581\n3967,668\n3967,685\n3967,712\n3967,900\n3967,911\n3967,1118\n3967,1135\n3967,1172\n3967,1262\n3967,1402\n3967,1434\n3967,1603\n3967,2310\n3967,3967\n3967,6861\n3967,13814\n3967,14308\n3967,16413\n3967,23649\n3967,25598\n3967,54954\n3967,96334\n3967,113534\n3967,119990\n3967,127540\n3967,181951\n3968,710\n3969,682\n3970,99\n3970,278\n3970,1181\n3971,259\n3973,312\n3973,338\n3973,479\n3973,510\n3973,525\n3973,991\n3973,1893\n3973,2744\n3974,1631\n3975,225\n3975,1332\n3976,4\n3976,65\n3976,83\n3976,86\n3976,160\n3976,167\n3976,195\n3976,207\n3976,259\n3976,269\n3976,287\n3976,292\n3976,302\n3976,306\n3976,307\n3976,326\n3976,340\n3976,355\n3976,379\n3976,452\n3976,497\n3976,581\n3976,595\n3976,605\n3976,623\n3976,626\n3976,644\n3976,660\n3976,668\n3976,675\n3976,703\n3976,731\n3976,783\n3976,877\n3976,918\n3976,929\n3976,943\n3976,985\n3976,994\n3976,1058\n3976,1147\n3976,1172\n3976,1284\n3976,1363\n3976,1368\n3976,1509\n3976,1571\n3976,1837\n3976,1983\n3976,2411\n3976,2750\n3976,2923\n3976,5034\n3976,5212\n3976,6298\n3976,6506\n3976,7092\n3976,17590\n3976,17593\n3976,17897\n3976,18298\n3976,30331\n3976,142433\n3976,142879\n3976,144556\n3976,214131\n3977,146\n3978,489\n3979,22\n3980,146\n3981,209\n3982,1556\n3983,500\n3984,1639\n3985,1579\n3986,1\n3986,32\n3986,83\n3986,392\n3986,644\n3986,697\n3986,712\n3986,809\n3986,1363\n3986,1381\n3986,1858\n3986,2274\n3986,2699\n3986,76096\n3987,178\n3988,68\n3988,71\n3988,72\n3988,280\n3988,298\n3988,364\n3988,485\n3988,611\n3988,859\n3988,920\n3988,1370\n3988,1612\n3988,1821\n3988,1927\n3988,2590\n3988,3989\n3988,4220\n3988,16953\n3988,17245\n3988,64147\n3988,66297\n3990,439\n3990,726\n3990,1294\n3991,602\n3991,3218\n3992,972\n3992,1010\n3993,158\n3993,328\n3993,392\n3993,694\n3993,760\n3993,818\n3993,1010\n3993,1962\n3993,6789\n3994,885\n3994,1359\n3994,13704\n3995,611\n3995,1612\n3996,10\n3997,99\n3998,3999\n3999,126\n3999,256\n3999,599\n3999,663\n3999,664\n3999,843\n3999,1011\n3999,1130\n3999,3999\n4000,685\n4001,143\n4002,34\n4002,35\n4002,120\n4002,217\n4002,283\n4002,455\n4002,536\n4002,694\n4002,1072\n4002,1466\n4002,1608\n4002,2266\n4003,2607\n4004,717\n4005,489\n4006,10\n4006,4260\n4007,222\n4007,657\n4007,1019\n4007,2266\n4007,2421\n4008,366\n4009,393\n4010,285\n4010,392\n4010,406\n4010,644\n4010,779\n4011,417\n4012,1449\n4013,518\n4013,911\n4013,1707\n4014,652\n4016,302\n4017,1511\n4017,3069\n4018,301\n4018,314\n4018,3422\n4019,143\n4020,26\n4020,47\n4020,59\n4020,60\n4020,117\n4020,330\n4020,885\n4020,887\n4020,1235\n4020,1335\n4020,1432\n4020,2469\n4020,5871\n4020,21944\n4021,1673\n4022,534\n4022,1085\n4022,2296\n4023,3474\n4024,104\n4024,134\n4024,135\n4024,136\n4024,138\n4024,557\n4024,1368\n4024,1939\n4025,2989\n4025,2991\n4026,489\n4026,1844\n4027,1858\n4029,992\n4029,1276\n4030,477\n4030,536\n4030,2168\n4030,7698\n4030,23287\n4030,57354\n4031,1085\n4031,1436\n4032,215\n4033,483\n4033,827\n4033,1639\n4034,615\n4035,206\n4035,1326\n4036,718\n4037,392\n4037,467\n4037,2436\n4038,1068\n4039,34\n4039,35\n4039,107\n4039,283\n4039,292\n4039,338\n4039,441\n4039,446\n4039,455\n4039,462\n4039,510\n4039,536\n4039,609\n4039,626\n4039,801\n4039,809\n4039,872\n4039,929\n4039,978\n4039,1058\n4039,1078\n4039,1118\n4039,1151\n4039,1210\n4039,1326\n4039,1332\n4039,1417\n4039,1454\n4039,1479\n4039,1559\n4039,1572\n4039,1584\n4039,1659\n4039,1688\n4039,1715\n4039,1722\n4039,1758\n4039,1836\n4039,1845\n4039,1968\n4039,2181\n4039,2224\n4039,2367\n4039,2436\n4039,2646\n4039,3035\n4039,3252\n4039,3483\n4039,4565\n4039,4580\n4039,4771\n4039,5258\n4039,5604\n4039,6631\n4039,6880\n4039,7698\n4039,7993\n4039,8149\n4039,15339\n4039,15608\n4039,32819\n4039,44740\n4039,62156\n4039,125409\n4039,142367\n4039,143036\n4039,156292\n4039,162600\n4039,166487\n4039,185459\n4039,192643\n4039,244115\n4039,255640\n4039,263282\n4040,4041\n4042,3555\n4043,217\n4043,1732\n4045,1010\n4046,46\n4046,58\n4046,302\n4046,447\n4046,850\n4047,527\n4048,536\n4048,18831\n4049,104\n4049,609\n4049,1140\n4050,63\n4050,240\n4050,366\n4050,489\n4050,527\n4050,567\n4050,697\n4050,1085\n4050,1127\n4050,1240\n4050,1381\n4050,2209\n4051,209\n4052,298\n4053,485\n4054,1016\n4054,2674\n4054,16153\n4055,577\n4055,1429\n4056,26\n4056,59\n4056,885\n4056,887\n4056,1235\n4056,1335\n4056,1432\n4056,21944\n4057,163\n4058,72\n4059,4060\n4060,13705\n4060,39201\n4061,149\n4062,592\n4063,760\n4064,26\n4064,59\n4064,885\n4064,887\n4064,1235\n4064,1335\n4064,1432\n4064,21944\n4065,1247\n4066,66\n4066,87\n4066,146\n4066,182\n4066,186\n4066,192\n4066,240\n4066,289\n4066,290\n4066,347\n4066,366\n4066,392\n4066,500\n4066,808\n4066,809\n4066,818\n4066,1052\n4066,1118\n4066,1119\n4066,1147\n4066,1197\n4066,1204\n4066,1220\n4066,1222\n4066,1298\n4066,1417\n4066,1445\n4066,1509\n4066,1566\n4066,1655\n4066,1659\n4066,1796\n4066,1836\n4066,1927\n4066,2224\n4066,2253\n4066,2775\n4066,3504\n4066,4066\n4066,4237\n4066,5186\n4066,5935\n4066,6695\n4066,6824\n4066,15582\n4066,19010\n4066,22293\n4066,51503\n4066,182162\n4067,1188\n4068,10\n4068,485\n4068,693\n4068,4260\n4069,462\n4070,457\n4071,326\n4072,248\n4072,450\n4072,1332\n4073,209\n4073,138686\n4074,450\n4074,609\n4074,1400\n4074,1474\n4075,261\n4075,447\n4075,4078\n4076,34\n4076,35\n4076,222\n4076,657\n4076,1417\n4077,1509\n4080,2051\n4080,9030\n4082,1058\n4083,811\n4084,22\n4084,192\n4084,217\n4084,1962\n4084,6051\n4085,1571\n4086,104\n4086,134\n4086,135\n4086,136\n4086,137\n4086,138\n4086,557\n4086,1368\n4086,1939\n4086,2105\n4087,285\n4087,518\n4088,136\n4088,346\n4089,66\n4090,772\n4091,280\n4091,577\n4091,762\n4091,1415\n4091,17245\n4092,304\n4093,4094\n4095,298\n4096,485\n4097,760\n4098,515\n4099,444\n4099,589\n4099,707\n4099,1619\n4099,2274\n4100,1309\n4101,366\n4101,4101\n4101,4675\n4101,5681\n4101,6583\n4101,22182\n4101,29617\n4101,41266\n4101,47461\n4101,48791\n4101,52107\n4101,54258\n4101,54262\n4101,71568\n4101,76598\n4101,107097\n4101,107794\n4101,111033\n4101,135698\n4101,147043\n4101,165880\n4101,170138\n4102,439\n4102,1776\n4102,1803\n4102,21442\n4103,147\n4103,406\n4103,620\n4103,779\n4104,596\n4105,1363\n4106,1068\n4107,349\n4107,390\n4107,1564\n4108,309\n4108,310\n4108,483\n4108,2312\n4108,18513\n4108,30497\n4109,83\n4109,120\n4109,158\n4109,186\n4109,217\n4109,222\n4109,264\n4109,283\n4109,389\n4109,392\n4109,433\n4109,467\n4109,510\n4109,536\n4109,657\n4109,781\n4109,809\n4109,818\n4109,868\n4109,1001\n4109,1274\n4109,1433\n4109,1796\n4109,2553\n4109,3804\n4109,4637\n4109,5343\n4109,6726\n4109,118336\n4111,195\n4112,356\n4112,852\n4112,2699\n4112,5591\n4113,885\n4113,1962\n4113,4114\n4113,13704\n4113,21944\n4113,171294\n4114,5\n4114,24\n4114,25\n4114,26\n4114,28\n4114,33\n4114,41\n4114,47\n4114,59\n4114,60\n4114,138\n4114,175\n4114,292\n4114,441\n4114,442\n4114,588\n4114,590\n4114,599\n4114,865\n4114,885\n4114,887\n4114,994\n4114,1119\n4114,1227\n4114,1229\n4114,1235\n4114,1238\n4114,1252\n4114,1253\n4114,1255\n4114,1335\n4114,1415\n4114,1432\n4114,1572\n4114,1722\n4114,1775\n4114,1836\n4114,2088\n4114,2089\n4114,2469\n4114,2674\n4114,2940\n4114,3524\n4114,3538\n4114,4079\n4114,4113\n4114,4571\n4114,4748\n4114,5881\n4114,6621\n4114,8714\n4114,9537\n4114,9539\n4114,9542\n4114,16153\n4114,16614\n4114,17140\n4114,19893\n4114,21944\n4114,47540\n4114,48673\n4114,50943\n4114,86416\n4114,88820\n4114,105811\n4114,111142\n4114,154690\n4114,167349\n4114,167350\n4114,205627\n4114,237552\n4115,41\n4115,805\n4115,1082\n4115,1149\n4115,1807\n4115,1888\n4115,2775\n4116,1\n4117,710\n4118,623\n4118,919\n4118,1860\n4119,1143\n4120,1801\n4120,3182\n4121,79\n4122,500\n4123,849\n4124,430\n4125,535\n4125,536\n4125,872\n4125,1072\n4126,134\n4126,135\n4126,137\n4127,313\n4127,326\n4127,2421\n4128,46\n4128,58\n4128,731\n4128,1124\n4129,991\n4129,2480\n4130,1210\n4131,209\n4131,302\n4132,120\n4132,392\n4132,809\n4132,1467\n4132,1718\n4132,2989\n4132,2991\n4133,1113\n4133,1381\n4134,1392\n4135,609\n4135,1140\n4135,5547\n4136,1284\n4137,206\n4137,240\n4137,538\n4137,577\n4137,859\n4137,980\n4137,1033\n4137,1181\n4137,1388\n4137,1531\n4138,1276\n4138,3698\n4139,119\n4140,160\n4140,360\n4140,510\n4140,535\n4140,599\n4140,1287\n4141,104\n4141,1078\n4141,1962\n4142,1143\n4142,1454\n4142,1711\n4142,1836\n4142,5469\n4143,1\n4143,1801\n4144,2116\n4145,304\n4145,1715\n4145,4146\n4146,304\n4146,446\n4146,843\n4146,1715\n4146,4145\n4146,15641\n4146,27119\n4146,32222\n4146,49341\n4146,90220\n4146,101665\n4146,163730\n4146,167589\n4146,201304\n4146,261753\n4147,673\n4147,1130\n4148,304\n4149,980\n4149,2210\n4149,4237\n4149,182162\n4150,252\n4150,318\n4150,41170\n4151,1424\n4152,259\n4152,843\n4153,66\n4153,83\n4153,182\n4153,240\n4153,302\n4153,438\n4153,452\n4153,457\n4153,497\n4153,535\n4153,599\n4153,710\n4153,794\n4153,893\n4153,918\n4153,1118\n4153,1147\n4153,1188\n4153,1191\n4153,1192\n4153,1204\n4153,1417\n4153,1433\n4153,1663\n4153,1673\n4153,1722\n4153,1796\n4153,1844\n4153,3744\n4153,4165\n4153,4823\n4154,344\n4154,360\n4154,515\n4154,736\n4154,827\n4154,835\n4154,1058\n4154,1127\n4154,1132\n4154,1551\n4154,3999\n4154,49057\n4155,163\n4155,209\n4155,302\n4155,579\n4155,811\n4155,861\n4155,893\n4155,1556\n4155,2116\n4155,3769\n4156,733\n4156,2424\n4157,3260\n4158,1434\n4159,65\n4159,147\n4159,158\n4159,195\n4159,217\n4159,261\n4159,264\n4159,301\n4159,314\n4159,467\n4159,516\n4159,577\n4159,592\n4159,623\n4159,647\n4159,868\n4159,968\n4159,1220\n4159,1293\n4159,1522\n4159,1749\n4159,1805\n4159,2205\n4159,2557\n4159,2979\n4159,21944\n4159,33424\n4160,1474\n4161,171\n4161,330\n4161,6208\n4161,6209\n4162,1977\n4162,1978\n4163,596\n4163,1001\n4163,2750\n4164,147\n4164,158\n4164,336\n4164,505\n4165,126\n4165,256\n4165,388\n4165,397\n4165,535\n4165,1011\n4165,1014\n4165,1147\n4165,1204\n4165,1293\n4165,1462\n4165,1518\n4165,1566\n4165,1663\n4165,2206\n4165,2253\n4165,6824\n4165,16208\n4165,18298\n4165,183267\n4166,217\n4166,313\n4166,385\n4166,389\n4166,634\n4166,657\n4166,1072\n4166,1881\n4166,2266\n4166,2421\n4166,13661\n4166,14556\n4166,37088\n4167,330\n4168,349\n4169,1466\n4169,1616\n4171,389\n4171,1368\n4171,1801\n4171,2744\n4171,4172\n4171,6556\n4171,115659\n4174,3447\n4175,440\n4175,794\n4175,1740\n4176,4177\n4178,563\n4178,581\n4179,240\n4179,1285\n4179,1785\n4179,2620\n4179,2812\n4179,13637\n4179,94940\n4179,95359\n4179,96514\n4179,96777\n4179,96779\n4179,101566\n4179,255497\n4180,302\n4181,1177\n4182,1082\n4182,1849\n4183,1298\n4184,415\n4184,770\n4184,838\n4184,918\n4184,1240\n4184,1454\n4184,1465\n4184,21982\n4185,326\n4185,1119\n4185,1653\n4185,2674\n4185,3258\n4185,16153\n4185,72764\n4186,581\n4187,887\n4187,2244\n4188,328\n4188,333\n4188,440\n4188,467\n4188,622\n4188,1033\n4189,22\n4190,50\n4190,68\n4190,207\n4190,256\n4190,259\n4190,278\n4190,304\n4190,326\n4190,333\n4190,336\n4190,356\n4190,360\n4190,385\n4190,390\n4190,397\n4190,441\n4190,452\n4190,456\n4190,457\n4190,497\n4190,505\n4190,567\n4190,634\n4190,668\n4190,673\n4190,685\n4190,697\n4190,698\n4190,733\n4190,779\n4190,838\n4190,843\n4190,849\n4190,900\n4190,911\n4190,918\n4190,929\n4190,972\n4190,1014\n4190,1070\n4190,1096\n4190,1127\n4190,1130\n4190,1135\n4190,1191\n4190,1267\n4190,1282\n4190,1293\n4190,1294\n4190,1309\n4190,1353\n4190,1402\n4190,1419\n4190,1449\n4190,1499\n4190,1566\n4190,1677\n4190,1844\n4190,1992\n4190,2373\n4190,2411\n4190,2460\n4190,2580\n4190,2605\n4190,2620\n4190,3392\n4190,3524\n4190,3582\n4190,3653\n4190,3945\n4190,4190\n4190,4220\n4190,5570\n4190,7849\n4190,7906\n4190,8231\n4190,8276\n4190,8676\n4190,9015\n4190,9138\n4190,12825\n4190,14072\n4190,14074\n4190,14521\n4190,20553\n4190,22071\n4190,23622\n4190,26041\n4190,26450\n4190,27062\n4190,27064\n4190,28397\n4190,28920\n4190,29608\n4190,29753\n4190,29888\n4190,30294\n4190,30534\n4190,30554\n4190,31068\n4190,32523\n4190,32567\n4190,32571\n4190,32580\n4190,32751\n4190,32793\n4190,32876\n4190,33172\n4190,34030\n4190,34229\n4190,34286\n4190,34306\n4190,34553\n4190,40751\n4190,40754\n4190,42615\n4190,42688\n4190,42705\n4190,42753\n4190,44786\n4190,46301\n4190,50083\n4190,50150\n4190,50318\n4190,55623\n4190,60525\n4190,60576\n4190,62341\n4190,81957\n4190,97423\n4190,114460\n4190,115474\n4190,118164\n4190,124359\n4190,134640\n4190,136415\n4190,136437\n4190,143971\n4190,161203\n4190,167194\n4190,173668\n4190,174391\n4190,178576\n4190,185934\n4190,190429\n4190,192618\n4190,198827\n4190,212518\n4190,212896\n4190,213170\n4190,213172\n4190,214113\n4190,222562\n4190,222602\n4190,229567\n4190,252745\n4191,83\n4191,657\n4192,4192\n4192,4193\n4193,50\n4193,79\n4193,147\n4193,158\n4193,333\n4193,406\n4193,778\n4193,779\n4193,1181\n4193,1218\n4193,1464\n4193,1515\n4193,2741\n4193,2792\n4193,2880\n4193,2969\n4193,3571\n4193,5360\n4193,5660\n4193,6343\n4193,7970\n4193,8098\n4193,8204\n4193,8514\n4193,13592\n4193,16307\n4193,16482\n4193,16870\n4193,17084\n4193,17151\n4193,18760\n4193,20094\n4193,23877\n4193,23878\n4193,23879\n4193,23880\n4193,23881\n4193,23882\n4193,23883\n4193,23884\n4193,23885\n4193,23886\n4193,23887\n4193,23888\n4193,23889\n4193,23890\n4193,23891\n4193,23892\n4193,23893\n4193,23894\n4193,23895\n4193,23896\n4193,23897\n4193,23898\n4193,23900\n4193,23901\n4193,23902\n4193,23903\n4193,23904\n4193,23905\n4193,23906\n4193,23907\n4193,23908\n4193,23909\n4193,23912\n4193,23913\n4193,23914\n4193,23916\n4193,23917\n4193,23918\n4193,23919\n4193,23920\n4193,23921\n4193,23922\n4193,23923\n4193,23924\n4193,23925\n4193,23926\n4193,23927\n4193,23928\n4193,23929\n4193,23930\n4193,23931\n4193,23932\n4193,23933\n4193,23934\n4193,23935\n4193,23936\n4193,23937\n4193,23938\n4193,23939\n4193,23940\n4193,23941\n4193,23942\n4193,23943\n4193,23945\n4193,23946\n4193,23947\n4193,23948\n4193,23949\n4193,23950\n4193,23951\n4193,23952\n4193,23953\n4193,23954\n4193,23955\n4193,23956\n4193,23957\n4193,23958\n4193,23959\n4193,23960\n4193,23961\n4193,23962\n4193,23964\n4193,23965\n4193,23966\n4193,23967\n4193,23968\n4193,23969\n4193,23970\n4193,23971\n4193,23973\n4193,23974\n4193,23975\n4193,23976\n4193,23977\n4193,23978\n4193,23979\n4193,23980\n4193,23981\n4193,23982\n4193,23983\n4193,23984\n4193,23985\n4193,23986\n4193,23987\n4193,23988\n4193,23989\n4193,23990\n4193,23991\n4193,23992\n4193,23993\n4193,23994\n4193,23995\n4193,23996\n4193,23997\n4193,23998\n4193,24000\n4193,24001\n4193,24002\n4193,24003\n4193,24004\n4193,24005\n4193,24006\n4193,24007\n4193,24008\n4193,24009\n4193,24010\n4193,24011\n4193,24012\n4193,24013\n4193,24014\n4193,24015\n4193,24016\n4193,24017\n4193,24018\n4193,24019\n4193,24020\n4193,24021\n4193,24022\n4193,24023\n4193,24024\n4193,24025\n4193,24026\n4193,24027\n4193,24028\n4193,24029\n4193,24030\n4193,24031\n4193,24032\n4193,24033\n4193,24035\n4193,24037\n4193,24038\n4193,24039\n4193,24040\n4193,24041\n4193,24042\n4193,24043\n4193,24044\n4193,24045\n4193,24046\n4193,24047\n4193,24048\n4193,24049\n4193,24050\n4193,24051\n4193,24052\n4193,24053\n4193,24054\n4193,24055\n4193,24056\n4193,24057\n4193,24058\n4193,24059\n4193,24061\n4193,24062\n4193,24063\n4193,24064\n4193,24065\n4193,24066\n4193,24067\n4193,24068\n4193,24069\n4193,24070\n4193,24071\n4193,24072\n4193,24073\n4193,24074\n4193,24075\n4193,24076\n4193,24077\n4193,24078\n4193,24079\n4193,24080\n4193,24081\n4193,24082\n4193,24083\n4193,24084\n4193,24085\n4193,24086\n4193,24087\n4193,24088\n4193,24090\n4193,24091\n4193,24092\n4193,24093\n4193,24094\n4193,24095\n4193,24096\n4193,24097\n4193,24098\n4193,24099\n4193,24100\n4193,24101\n4193,24102\n4193,24103\n4193,24104\n4193,24105\n4193,24108\n4193,24109\n4193,24112\n4193,24113\n4193,24114\n4193,24115\n4193,24116\n4193,24117\n4193,24118\n4193,24119\n4193,24120\n4193,24121\n4193,24122\n4193,24123\n4193,24124\n4193,24125\n4193,24126\n4193,24127\n4193,24129\n4193,24130\n4193,24131\n4193,24132\n4193,24133\n4193,24134\n4193,24135\n4193,24137\n4193,24138\n4193,24139\n4193,24140\n4193,24141\n4193,24142\n4193,24143\n4193,24144\n4193,24145\n4193,24146\n4193,24147\n4193,24148\n4193,24149\n4193,24150\n4193,24151\n4193,24152\n4193,24153\n4193,24154\n4193,24155\n4193,24157\n4193,24158\n4193,24159\n4193,24161\n4193,24163\n4193,24164\n4193,24165\n4193,24166\n4193,24167\n4193,24168\n4193,24169\n4193,24170\n4193,24171\n4193,24172\n4193,24173\n4193,24174\n4193,24175\n4193,24176\n4193,24177\n4193,24178\n4193,24179\n4193,24181\n4193,24182\n4193,24183\n4193,24184\n4193,24185\n4193,24186\n4193,24187\n4193,24188\n4193,24189\n4193,24190\n4193,24191\n4193,24192\n4193,24193\n4193,24194\n4193,24195\n4193,24196\n4193,24197\n4193,24198\n4193,24199\n4193,24200\n4193,24201\n4193,24202\n4193,24203\n4193,24204\n4193,24205\n4193,24206\n4193,24207\n4193,24208\n4193,24209\n4193,24210\n4193,24211\n4193,24212\n4193,24213\n4193,24214\n4193,24215\n4193,24216\n4193,24218\n4193,24219\n4193,24220\n4193,24221\n4193,24222\n4193,24223\n4193,24224\n4193,24225\n4193,24226\n4193,24227\n4193,24228\n4193,24229\n4193,24230\n4193,24231\n4193,24232\n4193,24233\n4193,130984\n4194,120\n4195,240\n4195,1203\n4195,1807\n4195,1955\n4196,4197\n4196,38021\n4196,39333\n4196,172636\n4196,195975\n4196,200304\n4196,258655\n4198,994\n4199,2310\n4201,1400\n4203,259\n4204,312\n4205,571\n4205,868\n4205,1400\n4206,1479\n4207,83\n4208,2105\n4210,312\n4211,489\n4212,163\n4213,167\n4213,186\n4213,192\n4213,217\n4213,301\n4213,406\n4213,467\n4213,589\n4213,968\n4213,973\n4213,1010\n4213,1085\n4213,1284\n4213,1326\n4213,1417\n4213,1749\n4213,1796\n4213,1849\n4213,2191\n4213,2334\n4213,2646\n4213,3804\n4215,171\n4216,503\n4217,54\n4217,399\n4217,500\n4217,644\n4217,649\n4217,749\n4217,943\n4217,996\n4217,1052\n4217,1078\n4217,1204\n4217,1212\n4217,1274\n4217,1300\n4217,1429\n4217,1474\n4217,1512\n4217,1539\n4217,1616\n4217,2168\n4217,2224\n4217,2775\n4217,3194\n4217,3258\n4217,3630\n4217,4218\n4217,4219\n4217,4220\n4217,4222\n4217,4223\n4217,4234\n4217,5130\n4217,5667\n4217,7768\n4217,13361\n4217,19010\n4217,22293\n4217,23783\n4217,28107\n4217,28130\n4217,72439\n4218,104\n4218,328\n4218,592\n4218,677\n4218,704\n4218,714\n4218,715\n4218,1402\n4218,1511\n4218,1641\n4218,1962\n4218,2105\n4218,2205\n4218,2286\n4218,3069\n4218,3565\n4218,4218\n4218,4220\n4218,4222\n4218,4532\n4218,8821\n4218,9441\n4218,12878\n4218,13273\n4218,16896\n4218,32914\n4218,33424\n4218,55146\n4218,63527\n4218,66005\n4218,76060\n4218,94779\n4218,102696\n4218,103409\n4218,111142\n4218,120659\n4218,122715\n4218,125435\n4218,125436\n4218,174364\n4218,174971\n4218,176443\n4218,176780\n4218,179048\n4218,182666\n4218,228626\n4218,228957\n4218,239309\n4218,244307\n4218,245910\n4218,253936\n4218,255488\n4220,68\n4220,104\n4220,240\n4220,677\n4220,685\n4220,715\n4220,838\n4220,911\n4220,1118\n4220,1119\n4220,1608\n4220,1888\n4220,2285\n4220,2358\n4220,2590\n4220,4218\n4220,4220\n4220,4222\n4220,4494\n4220,4512\n4220,4751\n4220,7348\n4220,12878\n4220,13563\n4220,13947\n4220,16896\n4220,17707\n4220,18786\n4220,18792\n4220,21525\n4220,22268\n4220,24906\n4220,26170\n4220,26928\n4220,29109\n4220,29609\n4220,34828\n4220,43134\n4220,46874\n4220,47805\n4220,54287\n4220,55146\n4220,55598\n4220,56374\n4220,56710\n4220,66005\n4220,66297\n4220,80672\n4220,83598\n4220,103061\n4220,103379\n4220,103750\n4220,107914\n4220,115730\n4220,118671\n4220,121109\n4220,137881\n4220,144231\n4220,154772\n4220,172012\n4220,172590\n4220,175880\n4220,179218\n4220,181079\n4220,181096\n4220,183388\n4220,186065\n4220,188725\n4220,189841\n4220,193129\n4220,215010\n4220,228838\n4220,258480\n4222,104\n4222,289\n4222,290\n4222,298\n4222,417\n4222,518\n4222,573\n4222,589\n4222,677\n4222,685\n4222,714\n4222,715\n4222,862\n4222,911\n4222,1085\n4222,1326\n4222,1580\n4222,2085\n4222,2105\n4222,2204\n4222,2572\n4222,2646\n4222,2747\n4222,3623\n4222,3944\n4222,4218\n4222,4220\n4222,6004\n4222,6068\n4222,6069\n4222,7921\n4222,9457\n4222,13217\n4222,15090\n4222,15633\n4222,21589\n4222,23710\n4222,28191\n4222,29250\n4222,29404\n4222,33567\n4222,33728\n4222,34129\n4222,34419\n4222,35428\n4222,36250\n4222,37730\n4222,38822\n4222,39618\n4222,39649\n4222,39667\n4222,40763\n4222,44725\n4222,48087\n4222,59273\n4222,62504\n4222,66297\n4222,68697\n4222,72800\n4222,73745\n4222,74482\n4222,75912\n4222,82114\n4222,83940\n4222,85484\n4222,85486\n4222,93740\n4222,99756\n4222,110509\n4222,113550\n4222,118913\n4222,121238\n4222,125952\n4222,132216\n4222,139544\n4222,148807\n4222,154004\n4222,156711\n4222,159234\n4222,160400\n4222,176782\n4222,184926\n4222,185877\n4222,193078\n4222,212692\n4222,218050\n4222,221068\n4222,245556\n4222,261889\n4223,34\n4223,35\n4223,217\n4223,389\n4223,657\n4223,682\n4223,815\n4223,818\n4223,1077\n4223,1078\n4223,1313\n4223,1415\n4223,1724\n4223,2159\n4223,3729\n4223,4223\n4223,4234\n4223,5433\n4223,7768\n4223,8177\n4223,13137\n4223,20234\n4223,20348\n4223,23287\n4223,31771\n4223,34416\n4223,59213\n4223,62903\n4223,72439\n4223,93719\n4223,98780\n4223,101735\n4223,140743\n4223,152703\n4223,154688\n4223,155104\n4223,155105\n4223,157467\n4223,157468\n4223,159250\n4223,163263\n4223,170326\n4223,170714\n4223,178597\n4223,189271\n4223,191517\n4223,214074\n4223,232255\n4223,232737\n4223,253205\n4224,273\n4224,274\n4224,313\n4225,1801\n4226,344\n4226,1673\n4227,1619\n4227,2315\n4228,146\n4229,500\n4230,1962\n4232,1052\n4233,1882\n4234,83\n4234,217\n4234,222\n4234,477\n4234,536\n4234,657\n4234,682\n4234,784\n4234,1353\n4234,1359\n4234,1417\n4234,1724\n4234,1756\n4234,2168\n4234,2553\n4234,2646\n4234,2779\n4234,2944\n4234,4223\n4234,18831\n4234,42121\n4234,57354\n4234,72439\n4234,115474\n4234,127158\n4235,2775\n4236,2210\n4236,4237\n4237,81\n4237,134\n4237,135\n4237,215\n4237,328\n4237,704\n4237,797\n4237,1011\n4237,1016\n4237,1177\n4237,1282\n4237,1402\n4237,1511\n4237,2210\n4237,3069\n4237,3565\n4237,3727\n4237,3820\n4237,4149\n4237,4237\n4237,5331\n4237,6556\n4237,6667\n4237,8132\n4237,15768\n4237,24918\n4237,25302\n4237,43178\n4237,56346\n4237,65681\n4237,66353\n4237,66539\n4237,67327\n4237,104000\n4237,104698\n4237,107801\n4237,118122\n4237,119223\n4237,135274\n4237,143193\n4237,146502\n4237,147633\n4237,148462\n4237,149237\n4237,151590\n4237,151591\n4237,151592\n4237,151593\n4237,151594\n4237,151891\n4237,152091\n4237,162762\n4237,165302\n4237,165388\n4237,165476\n4237,165643\n4237,165760\n4237,165846\n4237,169066\n4237,171332\n4237,171726\n4237,173271\n4237,173278\n4237,173634\n4237,174016\n4237,174832\n4237,174923\n4237,174981\n4237,175459\n4237,176422\n4237,176526\n4237,179727\n4237,181054\n4237,182109\n4237,182162\n4238,483\n4238,852\n4238,2646\n4239,66\n4240,167\n4240,459\n4240,744\n4240,1010\n4240,1012\n4240,1241\n4241,1\n4241,596\n4242,285\n4242,347\n4242,702\n4242,861\n4243,1298\n4245,337\n4246,1474\n4247,1381\n4247,1452\n4247,1639\n4248,563\n4249,2605\n4249,14550\n4250,497\n4251,4252\n4251,15609\n4252,392\n4252,1805\n4252,137245\n4252,173918\n4253,37\n4253,301\n4253,615\n4253,968\n4253,1282\n4253,1293\n4253,1837\n4253,5662\n4253,31977\n4254,344\n4255,298\n4256,485\n4259,397\n4260,50\n4260,175\n4260,344\n4260,693\n4260,4260\n4260,115659\n4260,142405\n4260,142433\n4260,142473\n4260,142870\n4260,143287\n4260,145502\n4260,145524\n4260,173366\n4260,178222\n4260,202837\n4261,503\n4261,1149\n4262,1619\n4262,2315\n4263,2782\n4264,424\n4264,1634\n4265,111\n4265,289\n4265,290\n4265,631\n4265,760\n4265,1149\n4265,1177\n4265,1392\n4265,1631\n4265,2443\n4265,4237\n4265,94134\n4265,182162\n4266,2775\n4267,240\n4267,611\n4268,278\n4269,2828\n4270,37\n4270,1782\n4271,685\n4271,843\n4271,849\n4271,911\n4271,1844\n4271,2083\n4272,22\n4272,207\n4272,287\n4272,424\n4272,446\n4272,663\n4272,702\n4272,752\n4272,873\n4272,1133\n4272,1623\n4272,2782\n4272,4272\n4272,121110\n4273,63\n4273,79\n4273,192\n4273,251\n4273,252\n4273,516\n4273,1243\n4273,1844\n4273,21944\n4274,182\n4276,30\n4276,104\n4276,134\n4276,135\n4276,136\n4276,137\n4276,138\n4276,200\n4276,211\n4276,225\n4276,248\n4276,314\n4276,327\n4276,364\n4276,397\n4276,441\n4276,452\n4276,457\n4276,500\n4276,557\n4276,668\n4276,673\n4276,676\n4276,677\n4276,685\n4276,772\n4276,794\n4276,838\n4276,843\n4276,849\n4276,850\n4276,852\n4276,929\n4276,950\n4276,953\n4276,954\n4276,1011\n4276,1014\n4276,1118\n4276,1130\n4276,1172\n4276,1179\n4276,1191\n4276,1262\n4276,1332\n4276,1368\n4276,1415\n4276,1566\n4276,1663\n4276,1973\n4276,1980\n4276,2105\n4276,2224\n4276,2253\n4276,3524\n4276,4276\n4276,4941\n4276,5053\n4276,5405\n4276,6023\n4276,6695\n4276,6904\n4276,9457\n4276,13207\n4276,19413\n4276,19457\n4276,28203\n4276,29575\n4276,40169\n4276,48374\n4276,65864\n4276,82217\n4276,85814\n4276,97250\n4276,190276\n4276,207659\n4276,215874\n4276,238007\n4276,249055\n4277,685\n4277,849\n4278,626\n4278,775\n4279,130\n4280,269\n4281,298\n4282,485\n4283,1241\n4284,338\n4284,1893\n4285,259\n4285,920\n4286,167\n4286,186\n4286,202\n4286,203\n4286,217\n4286,240\n4286,248\n4286,299\n4286,301\n4286,392\n4286,435\n4286,457\n4286,467\n4286,516\n4286,801\n4286,818\n4286,872\n4286,1010\n4286,1085\n4286,1118\n4286,1151\n4286,1284\n4286,1298\n4286,1659\n4286,1749\n4286,1782\n4286,2480\n4286,2671\n4286,4355\n4286,6955\n4286,73570\n4287,87\n4287,344\n4287,392\n4287,710\n4287,918\n4287,1151\n4287,1363\n4287,1711\n4287,1836\n4288,832\n4290,399\n4291,167\n4291,301\n4291,968\n4291,1293\n4291,1837\n4291,2083\n4291,3138\n4291,3422\n4291,5301\n4292,485\n4292,920\n4292,1821\n4292,255750\n4293,527\n4295,83\n4295,399\n4295,455\n4295,477\n4296,827\n4297,577\n4297,1105\n4298,996\n4298,1033\n4300,918\n4301,301\n4301,968\n4302,477\n4303,48\n4303,313\n4303,399\n4303,626\n4303,1293\n4303,2775\n4303,3218\n4304,1052\n4305,160\n4305,163\n4305,299\n4305,483\n4305,516\n4305,690\n4305,1001\n4305,1805\n4306,192\n4306,640\n4307,79\n4307,516\n4307,1014\n4308,104\n4308,111\n4308,130\n4308,192\n4308,200\n4308,233\n4308,264\n4308,301\n4308,309\n4308,310\n4308,328\n4308,372\n4308,441\n4308,442\n4308,589\n4308,609\n4308,631\n4308,649\n4308,714\n4308,749\n4308,760\n4308,775\n4308,932\n4308,1007\n4308,1010\n4308,1046\n4308,1085\n4308,1140\n4308,1212\n4308,1285\n4308,1462\n4308,1522\n4308,1551\n4308,2105\n4308,2205\n4308,2209\n4308,2443\n4308,3804\n4308,6556\n4308,6880\n4308,8537\n4308,33424\n4308,75912\n4309,143\n4310,10\n4310,158\n4310,178\n4310,195\n4310,336\n4310,996\n4311,2775\n4312,447\n4313,22\n4314,87\n4314,264\n4314,392\n4314,457\n4314,687\n4314,872\n4314,918\n4314,1151\n4314,1454\n4314,1556\n4315,202\n4315,264\n4315,301\n4315,388\n4315,392\n4315,479\n4315,510\n4315,586\n4315,622\n4315,772\n4315,838\n4315,920\n4315,1014\n4315,1085\n4315,1181\n4315,1210\n4315,1298\n4315,1370\n4315,1462\n4315,1522\n4315,1531\n4315,1782\n4315,4355\n4315,8537\n4316,2334\n4317,178\n4317,868\n4317,1619\n4318,636\n4319,250\n4319,1684\n4320,1149\n4321,222\n4321,1274\n4321,1571\n4321,2266\n4321,18831\n4322,1415\n4322,1663\n4323,72\n4323,106\n4323,136\n4323,280\n4323,493\n4323,557\n4323,1821\n4323,2782\n4323,17245\n4324,192\n4324,195\n4324,1849\n4325,302\n4326,287\n4326,538\n4326,934\n4326,1590\n4326,1644\n4327,3507\n4327,15179\n4328,338\n4328,467\n4328,1151\n4329,615\n4329,973\n4329,1479\n4329,2083\n4330,1882\n4331,195\n4332,195\n4333,72\n4333,106\n4333,2782\n4334,1707\n4335,147\n4335,841\n4335,1247\n4336,676\n4337,97\n4337,175\n4337,1509\n4338,151\n4339,447\n4339,788\n4340,818\n4341,254\n4341,1282\n4341,1882\n4342,56\n4342,106\n4342,493\n4343,4344\n4344,336\n4344,505\n4344,920\n4344,1620\n4344,1623\n4344,31977\n4345,1381\n4346,4344\n4347,4344\n4348,358\n4348,3409\n4349,2319\n4350,4344\n4351,4344\n4352,20\n4352,83\n4352,273\n4352,538\n4352,647\n4352,1058\n4352,1623\n4352,66754\n4352,142426\n4353,146\n4353,92476\n4353,106502\n4354,30\n4354,328\n4354,440\n4354,622\n4354,809\n4354,1033\n4354,1276\n4354,1973\n4354,2744\n4354,3247\n4354,4355\n4354,141912\n4355,30\n4355,136\n4355,200\n4355,248\n4355,254\n4355,327\n4355,328\n4355,450\n4355,588\n4355,590\n4355,631\n4355,636\n4355,950\n4355,953\n4355,1033\n4355,1085\n4355,1282\n4355,1417\n4355,1844\n4355,2208\n4355,3694\n4355,4286\n4355,4315\n4355,4354\n4355,4355\n4355,4368\n4355,5181\n4355,6023\n4355,6853\n4355,7087\n4355,7124\n4355,7344\n4355,13207\n4355,13636\n4355,13657\n4355,15358\n4355,15519\n4355,16640\n4355,21276\n4355,24826\n4355,29595\n4355,32940\n4355,34881\n4355,41268\n4355,43383\n4355,45993\n4355,47077\n4355,47106\n4355,48278\n4355,48599\n4355,49247\n4355,49337\n4355,59058\n4355,59677\n4355,60087\n4355,63497\n4355,68219\n4355,75295\n4355,77645\n4355,77758\n4355,78876\n4355,78980\n4355,79556\n4355,85829\n4355,91519\n4355,93178\n4355,106859\n4355,116567\n4355,117864\n4355,118891\n4355,126975\n4355,131650\n4355,135266\n4355,148687\n4355,149195\n4355,155361\n4355,155686\n4355,156970\n4355,170641\n4355,171249\n4355,190776\n4355,190777\n4355,198154\n4355,200594\n4355,200605\n4355,200606\n4355,200609\n4355,200611\n4355,213024\n4355,228385\n4355,245540\n4355,250950\n4355,260966\n4356,392\n4357,280\n4358,704\n4359,663\n4359,666\n4359,750\n4359,1298\n4359,72764\n4360,4344\n4361,1559\n4362,720\n4362,907\n4362,1284\n4362,2191\n4363,372\n4364,862\n4367,22\n4367,81\n4367,104\n4367,134\n4367,192\n4367,200\n4367,215\n4367,217\n4367,227\n4367,240\n4367,248\n4367,264\n4367,289\n4367,290\n4367,298\n4367,392\n4367,442\n4367,503\n4367,557\n4367,631\n4367,636\n4367,714\n4367,805\n4367,1016\n4367,1119\n4367,1149\n4367,1282\n4367,1392\n4367,1462\n4367,1631\n4367,1745\n4367,1796\n4367,1955\n4367,1962\n4367,2205\n4367,2209\n4367,2286\n4367,2315\n4367,3507\n4367,3804\n4367,4771\n4367,8537\n4367,9001\n4367,9005\n4367,33424\n4367,94134\n4367,111142\n4368,333\n4368,622\n4368,1033\n4368,4355\n4369,996\n4369,1033\n4371,563\n4372,158\n4373,1639\n4374,1072\n4375,366\n4375,788\n4376,20\n4377,54\n4377,222\n4377,389\n4377,455\n4377,588\n4377,590\n4377,657\n4377,694\n4377,1019\n4377,1274\n4377,2173\n4377,2266\n4377,5343\n4377,32751\n4377,33508\n4378,1127\n4379,1449\n4380,577\n4381,264\n4381,312\n4381,872\n4381,1010\n4381,1127\n4381,1298\n4381,1411\n4381,1659\n4381,1749\n4381,1893\n4381,2334\n4381,2605\n4381,6695\n4381,191860\n4382,32\n4382,349\n4382,392\n4382,509\n4382,697\n4382,809\n4382,76096\n4382,127158\n4383,143\n4384,431\n4384,1247\n4384,2782\n4385,1243\n4386,996\n4387,134\n4387,323\n4387,714\n4387,784\n4387,805\n4387,1016\n4387,1119\n4387,1146\n4388,20\n4388,63\n4388,134\n4388,163\n4388,206\n4388,222\n4388,248\n4388,280\n4388,283\n4388,289\n4388,314\n4388,332\n4388,337\n4388,346\n4388,356\n4388,422\n4388,455\n4388,491\n4388,599\n4388,620\n4388,657\n4388,663\n4388,664\n4388,694\n4388,852\n4388,1140\n4388,1172\n4388,1247\n4388,1285\n4388,1332\n4388,1432\n4388,1608\n4388,1888\n4388,1973\n4388,1983\n4388,2224\n4388,2266\n4388,2416\n4388,2417\n4388,2979\n4388,2989\n4388,2991\n4388,3804\n4388,4903\n4388,6119\n4388,7117\n4388,9457\n4388,14674\n4388,15179\n4388,17245\n4388,94134\n4388,189842\n4390,163\n4390,302\n4390,579\n4390,687\n4390,861\n4390,1556\n4390,1634\n4390,2017\n4390,6303\n4391,147\n4391,184\n4391,1247\n4391,164572\n4392,634\n4393,217\n4394,346\n4394,435\n4395,143\n4395,1052\n4396,302\n4397,1117\n4398,200\n4398,772\n4399,346\n4399,447\n4399,1860\n4399,6955\n4399,30428\n4400,1276\n4401,200\n4401,299\n4401,2674\n4401,2779\n4402,714\n4402,1085\n4403,79\n4404,489\n4405,147\n4405,158\n4405,273\n4405,274\n4405,1116\n4405,1425\n4406,417\n4407,775\n4408,609\n4409,775\n4410,304\n4410,4411\n4411,304\n4411,631\n4411,784\n4411,911\n4411,968\n4411,1715\n4411,1853\n4411,3804\n4411,4410\n4411,4411\n4411,4419\n4411,5178\n4411,5430\n4411,5531\n4411,5639\n4411,5647\n4411,5651\n4411,7530\n4411,14349\n4411,15329\n4411,15488\n4411,15711\n4411,16614\n4411,20386\n4411,21296\n4411,22711\n4411,24714\n4411,42767\n4411,42854\n4411,43195\n4411,43198\n4411,44248\n4411,44311\n4411,58413\n4411,59937\n4411,63046\n4411,63047\n4411,87980\n4411,96752\n4411,109558\n4411,112287\n4411,112538\n4411,112541\n4411,112542\n4411,112546\n4411,112566\n4411,140511\n4411,142295\n4411,143319\n4411,143345\n4411,143346\n4411,159751\n4411,165530\n4411,166609\n4411,167569\n4411,167959\n4411,223489\n4411,243303\n4411,245154\n4411,250415\n4412,634\n4413,663\n4413,664\n4413,1298\n4414,302\n4415,50\n4415,130\n4415,209\n4415,313\n4415,393\n4415,473\n4415,483\n4415,602\n4415,841\n4415,1566\n4415,1571\n4415,1955\n4415,3451\n4415,3452\n4415,3507\n4415,3804\n4415,4223\n4415,6955\n4415,75912\n4415,88820\n4416,1240\n4416,1465\n4417,3\n4417,32\n4417,217\n4417,222\n4417,289\n4417,290\n4417,326\n4417,349\n4417,388\n4417,392\n4417,433\n4417,509\n4417,510\n4417,657\n4417,697\n4417,720\n4417,752\n4417,809\n4417,872\n4417,873\n4417,874\n4417,907\n4417,919\n4417,932\n4417,973\n4417,1010\n4417,1019\n4417,1133\n4417,1143\n4417,1210\n4417,1240\n4417,1284\n4417,1363\n4417,1453\n4417,1454\n4417,1465\n4417,1634\n4417,1801\n4417,1805\n4417,1836\n4417,1837\n4417,1860\n4417,1871\n4417,1881\n4417,2045\n4417,2191\n4417,2266\n4417,2421\n4417,2557\n4417,2699\n4417,3182\n4417,4252\n4417,6789\n4417,6955\n4417,7092\n4417,94134\n4418,697\n4419,346\n4419,1368\n4419,1381\n4419,1871\n4419,4411\n4420,143\n4421,500\n4422,1782\n4423,140\n4424,1133\n4425,1634\n4426,184\n4426,346\n4426,406\n4426,1033\n4426,1474\n4427,718\n4428,2373\n4429,48\n4430,1858\n4431,1860\n4433,1479\n4434,534\n4435,843\n4435,2373\n4436,1370\n4437,72\n4438,397\n4438,142426\n4439,575\n4439,697\n4439,3260\n4440,222\n4442,1580\n4443,358\n4445,710\n4445,835\n4445,1052\n4445,1893\n4445,49057\n4445,81070\n4446,66\n4446,171\n4446,264\n4446,301\n4446,493\n4446,577\n4446,690\n4446,788\n4446,868\n4446,1010\n4446,1433\n4446,1531\n4447,602\n4447,620\n4448,200\n4448,911\n4448,189788\n4449,143\n4449,1052\n4449,190492\n4450,433\n4450,1634\n4451,344\n4451,920\n4451,1089\n4452,4453\n4454,991\n4454,1707\n4455,259\n4455,272\n4455,301\n4455,446\n4455,685\n4455,726\n4455,788\n4455,980\n4455,1429\n4455,1531\n4455,4455\n4455,4456\n4455,4646\n4455,6519\n4455,9747\n4455,23505\n4455,24875\n4455,44348\n4455,48119\n4455,52437\n4455,62927\n4455,64114\n4455,67087\n4455,67271\n4455,70247\n4455,70945\n4455,104565\n4455,114560\n4455,122538\n4455,124342\n4455,126103\n4455,139992\n4455,140759\n4455,142025\n4455,145469\n4455,148773\n4455,151404\n4455,155522\n4455,163844\n4455,163993\n4455,166639\n4455,168566\n4455,177428\n4455,193659\n4455,231132\n4455,237079\n4455,238030\n4455,244759\n4455,244875\n4457,222\n4457,2784\n4457,5591\n4458,264\n4458,338\n4458,340\n4458,1127\n4458,1224\n4458,1893\n4458,1968\n4459,298\n4460,485\n4461,439\n4461,1294\n4462,192\n4462,366\n4462,2480\n4462,2557\n4463,72\n4463,312\n4463,1052\n4463,2296\n4463,3695\n4464,289\n4464,290\n4464,94134\n4465,50\n4465,314\n4465,779\n4465,141912\n4466,163\n4466,182\n4466,440\n4466,489\n4466,586\n4466,720\n4466,893\n4466,1149\n4467,1085\n4468,147\n4468,158\n4468,273\n4468,274\n4468,1116\n4468,1425\n4468,30427\n4469,304\n4470,247\n4471,417\n4472,1212\n4473,1309\n4474,4475\n4476,571\n4476,801\n4477,399\n4477,406\n4478,200\n4479,298\n4480,485\n4481,195\n4482,1010\n4482,1019\n4482,6506\n4483,392\n4484,589\n4485,58\n4485,1140\n4486,120\n4486,694\n4486,1419\n4486,4487\n4486,7155\n4488,83\n4488,399\n4489,4490\n4491,252\n4491,516\n4491,1220\n4491,1222\n4492,251\n4492,464\n4492,4493\n4492,32625\n4492,36269\n4492,38157\n4492,41144\n4492,66299\n4492,66321\n4492,66568\n4492,77656\n4492,108440\n4492,115834\n4492,120450\n4492,147645\n4492,174936\n4494,726\n4494,2590\n4494,4218\n4494,4220\n4494,4222\n4495,392\n4496,37\n4496,611\n4496,1449\n4496,1782\n4497,304\n4497,1167\n4497,1782\n4498,338\n4498,462\n4498,467\n4498,1151\n4499,775\n4500,818\n4501,392\n4501,697\n4502,406\n4503,1284\n4503,4504\n4505,32\n4505,87\n4505,392\n4505,644\n4505,697\n4505,918\n4505,1151\n4505,2274\n4505,3003\n4506,388\n4507,10\n4507,175\n4507,184\n4507,206\n4507,2244\n4508,1\n4508,63\n4508,79\n4508,118\n4508,163\n4508,192\n4508,272\n4508,275\n4508,340\n4508,571\n4508,620\n4508,703\n4508,788\n4508,1309\n4508,1313\n4508,4597\n4509,248\n4509,450\n4509,1332\n4510,1309\n4510,1571\n4511,1639\n4513,392\n4514,126\n4514,240\n4514,599\n4514,918\n4514,1293\n4514,1326\n4514,2373\n4514,2512\n4514,2605\n4514,118336\n4515,272\n4515,934\n4515,1449\n4515,1612\n4516,1414\n4517,444\n4517,968\n4518,178\n4519,2411\n4520,58\n4520,104\n4520,107\n4520,111\n4520,227\n4520,248\n4520,264\n4520,292\n4520,441\n4520,442\n4520,452\n4520,462\n4520,503\n4520,596\n4520,626\n4520,631\n4520,714\n4520,749\n4520,805\n4520,1078\n4520,1085\n4520,1140\n4520,1146\n4520,1147\n4520,1192\n4520,1282\n4520,1462\n4520,1466\n4520,1659\n4520,1955\n4520,2205\n4520,2206\n4520,2334\n4520,2443\n4520,3538\n4520,3555\n4520,4771\n4520,8537\n4521,489\n4521,2209\n4522,1556\n4523,3422\n4524,134\n4524,636\n4524,805\n4524,2209\n4525,682\n4525,2312\n4525,72439\n4526,338\n4526,2779\n4527,10\n4527,35\n4527,81\n4527,104\n4527,136\n4527,137\n4527,192\n4527,225\n4527,227\n4527,248\n4527,254\n4527,278\n4527,313\n4527,372\n4527,634\n4527,636\n4527,752\n4527,907\n4527,932\n4527,973\n4527,1001\n4527,1033\n4527,1082\n4527,1133\n4527,1179\n4527,1241\n4527,1282\n4527,1313\n4527,1392\n4527,1479\n4527,1515\n4527,1745\n4527,1849\n4527,1939\n4527,2205\n4527,2206\n4527,2224\n4527,2646\n4527,3085\n4527,3246\n4527,3247\n4527,3507\n4527,3585\n4527,4276\n4527,4355\n4527,5326\n4527,8180\n4527,8855\n4527,8990\n4527,15748\n4527,19946\n4527,20063\n4528,10\n4529,195\n4529,336\n4529,620\n4529,8244\n4530,424\n4531,575\n4531,697\n4533,2797\n4534,79\n4535,3\n4537,1227\n4537,1229\n4537,21944\n4538,292\n4538,304\n4538,332\n4538,390\n4538,752\n4538,1285\n4538,1479\n4538,1801\n4538,1858\n4538,6789\n4539,252\n4540,240\n4540,289\n4540,290\n4540,298\n4540,372\n4540,417\n4540,714\n4540,932\n4540,1012\n4540,1082\n4540,1085\n4540,1285\n4540,1564\n4540,1715\n4540,1785\n4540,1818\n4540,1955\n4540,1962\n4540,2205\n4540,2206\n4540,2296\n4540,2620\n4540,4218\n4540,5718\n4540,33424\n4540,94134\n4540,144988\n4540,221304\n4541,809\n4542,1571\n4543,640\n4543,1425\n4544,2178\n4544,4545\n4544,56150\n4544,88820\n4544,139010\n4545,259\n4545,272\n4545,314\n4545,393\n4545,577\n4545,599\n4545,788\n4545,980\n4545,1070\n4545,1504\n4545,1531\n4545,2400\n4545,4545\n4545,5356\n4545,6568\n4545,8610\n4545,14232\n4545,22451\n4545,22558\n4545,22940\n4545,32680\n4545,34863\n4545,35486\n4545,36597\n4545,39666\n4545,47776\n4545,56150\n4545,63341\n4545,69700\n4545,90546\n4545,116813\n4545,117231\n4545,117523\n4545,118050\n4545,118340\n4545,118927\n4545,119359\n4545,119367\n4545,119483\n4545,119490\n4545,119539\n4545,120528\n4545,121253\n4545,121302\n4545,121436\n4545,122010\n4545,122014\n4545,122037\n4545,122107\n4545,122119\n4545,122122\n4545,122210\n4545,122891\n4545,122941\n4545,123047\n4545,124486\n4545,125968\n4545,126143\n4545,126648\n4545,126849\n4545,127172\n4545,128335\n4545,133493\n4545,134346\n4545,136183\n4545,138954\n4545,139010\n4545,139377\n4545,139497\n4545,140809\n4545,142775\n4545,143958\n4545,144126\n4545,144862\n4545,153300\n4545,153749\n4545,154249\n4545,154284\n4545,154818\n4545,155314\n4545,157114\n4545,158098\n4545,158578\n4545,158592\n4545,163792\n4545,165473\n4545,165741\n4545,167324\n4545,167541\n4545,167558\n4545,167580\n4545,168268\n4545,169222\n4545,169242\n4545,169441\n4545,169563\n4545,169584\n4545,169944\n4545,170051\n4545,170787\n4545,170798\n4546,32\n4546,392\n4547,41\n4547,589\n4547,4548\n4548,310\n4550,390\n4551,200\n4551,225\n4551,772\n4551,850\n4551,1332\n4551,221294\n4552,44\n4552,94\n4552,2787\n4553,1033\n4554,392\n4555,577\n4556,862\n4557,30\n4557,328\n4557,447\n4557,693\n4557,1188\n4557,5192\n4558,779\n4558,68069\n4559,151\n4560,868\n4562,818\n4563,579\n4563,868\n4564,2073\n4565,22\n4565,65\n4565,104\n4565,111\n4565,140\n4565,160\n4565,217\n4565,227\n4565,264\n4565,292\n4565,296\n4565,312\n4565,323\n4565,338\n4565,340\n4565,364\n4565,392\n4565,420\n4565,441\n4565,442\n4565,455\n4565,462\n4565,467\n4565,479\n4565,500\n4565,509\n4565,510\n4565,515\n4565,525\n4565,571\n4565,609\n4565,626\n4565,647\n4565,736\n4565,801\n4565,835\n4565,872\n4565,911\n4565,1001\n4565,1007\n4565,1052\n4565,1058\n4565,1118\n4565,1140\n4565,1238\n4565,1241\n4565,1298\n4565,1332\n4565,1381\n4565,1417\n4565,1453\n4565,1509\n4565,1572\n4565,1579\n4565,1653\n4565,1659\n4565,1688\n4565,1722\n4565,1749\n4565,1893\n4565,2051\n4565,2292\n4565,2334\n4565,2443\n4565,2626\n4565,2889\n4565,3538\n4565,4039\n4565,4453\n4565,4771\n4565,7124\n4565,8994\n4565,13538\n4566,147\n4566,2244\n4567,302\n4568,1132\n4569,929\n4570,536\n4571,360\n4571,1282\n4571,2286\n4571,4571\n4571,88820\n4572,1590\n4573,1285\n4575,433\n4576,83\n4576,5591\n4577,1715\n4578,328\n4578,344\n4578,2210\n4578,4237\n4579,891\n4579,949\n4579,1756\n4579,2646\n4579,9743\n4579,28130\n4579,115474\n4579,212914\n4580,87\n4580,111\n4580,292\n4580,338\n4580,392\n4580,462\n4580,467\n4580,509\n4580,510\n4580,515\n4580,595\n4580,703\n4580,872\n4580,918\n4580,1052\n4580,1151\n4580,1453\n4580,1572\n4580,1659\n4580,1688\n4580,1722\n4580,1836\n4580,1893\n4580,4039\n4581,945\n4581,1572\n4582,392\n4583,861\n4584,1634\n4585,483\n4585,818\n4586,146\n4587,312\n4589,158\n4589,192\n4589,247\n4589,252\n4589,516\n4589,622\n4589,1433\n4590,640\n4591,24\n4591,26\n4591,28\n4591,59\n4591,885\n4591,887\n4591,1432\n4591,1775\n4591,4079\n4591,4571\n4591,21944\n4591,44244\n4591,171294\n4592,149\n4593,2779\n4593,4594\n4595,718\n4595,893\n4596,592\n4598,301\n4598,615\n4598,968\n4598,1293\n4598,1782\n4599,215\n4600,518\n4601,99\n4601,1363\n4601,1465\n4602,1326\n4603,4604\n4605,68\n4605,387\n4605,22071\n4606,298\n4607,485\n4608,900\n4609,862\n4610,4611\n4611,192\n4611,726\n4611,766\n4611,788\n4611,859\n4611,911\n4611,980\n4611,1388\n4611,1531\n4611,1612\n4611,2224\n4611,4137\n4611,4545\n4611,4611\n4611,5618\n4611,8300\n4611,14679\n4611,17913\n4611,20712\n4611,22221\n4611,26915\n4611,28377\n4611,28997\n4611,35211\n4611,35486\n4611,36613\n4611,46483\n4611,48865\n4611,56150\n4611,68727\n4611,120106\n4611,129546\n4611,176498\n4611,179720\n4611,181734\n4611,183470\n4611,185289\n4611,185355\n4611,185401\n4611,187416\n4611,188729\n4611,189354\n4611,190804\n4611,192410\n4611,193034\n4611,194454\n4611,194513\n4611,194588\n4611,194690\n4611,196627\n4611,203108\n4611,207639\n4611,212307\n4611,215804\n4611,216572\n4611,217461\n4611,220272\n4611,220646\n4611,226193\n4611,226254\n4611,236107\n4611,238728\n4611,240868\n4611,244682\n4611,247303\n4611,247392\n4611,247774\n4611,247848\n4611,247852\n4611,250886\n4611,250887\n4611,250904\n4611,251472\n4611,252030\n4611,254252\n4611,262485\n4612,252\n4613,200\n4613,772\n4615,63\n4615,252\n4615,516\n4615,41170\n4616,32\n4616,392\n4616,809\n4616,3260\n4617,50\n4617,146\n4617,779\n4617,68069\n4617,92476\n4618,609\n4618,1359\n4618,2315\n4619,41\n4619,68\n4619,1119\n4619,1285\n4619,1631\n4619,3135\n4620,72\n4621,1955\n4622,83\n4623,192\n4623,779\n4623,1590\n4623,68069\n4624,140\n4625,309\n4625,310\n4626,195\n4626,393\n4627,147\n4627,149\n4627,184\n4627,2244\n4628,217\n4629,72\n4630,388\n4631,283\n4632,1072\n4633,332\n4634,455\n4635,3135\n4636,4637\n4637,192\n4637,256\n4637,283\n4637,313\n4637,389\n4637,536\n4637,599\n4637,634\n4637,660\n4637,684\n4637,1072\n4637,1881\n4637,1916\n4637,2266\n4637,2779\n4637,4109\n4637,4446\n4637,5325\n4637,5751\n4637,7092\n4637,8168\n4637,13240\n4637,15239\n4637,18650\n4637,19443\n4637,29965\n4637,39723\n4637,43407\n4637,44582\n4637,44973\n4637,54313\n4637,72916\n4637,93836\n4637,93837\n4637,161673\n4637,172821\n4637,207659\n4637,213828\n4637,223131\n4637,224611\n4638,2266\n4639,1274\n4640,1429\n4641,1201\n4642,2421\n4643,120\n4644,859\n4645,278\n4646,178\n4646,315\n4646,346\n4646,435\n4646,439\n4646,447\n4646,538\n4646,868\n4646,934\n4646,1033\n4646,1294\n4646,1474\n4646,1612\n4646,1773\n4646,1877\n4646,1913\n4646,4455\n4646,5996\n4646,15802\n4646,21442\n4647,4648\n4647,6344\n4647,56577\n4647,83919\n4649,4650\n4651,4652\n4651,40174\n4651,50950\n4651,53336\n4651,56712\n4651,76655\n4651,78807\n4651,79802\n4651,84443\n4651,90382\n4651,92628\n4651,94573\n4651,96339\n4651,99135\n4651,101329\n4651,105145\n4651,107331\n4651,109764\n4651,111972\n4651,112156\n4651,112717\n4653,1893\n4654,2353\n4655,1715\n4656,44\n4657,4658\n4657,68966\n4657,72443\n4659,247\n4660,356\n4660,392\n4660,1146\n4660,1151\n4660,1722\n4660,1949\n4661,192\n4662,26\n4662,59\n4662,94\n4662,116\n4662,430\n4662,994\n4662,1235\n4662,1335\n4662,2087\n4662,2787\n4662,3816\n4662,3817\n4662,21944\n4663,285\n4663,336\n4663,392\n4663,644\n4663,779\n4663,1515\n4663,60576\n4663,118336\n4663,141912\n4664,3193\n4665,1\n4665,94\n4665,795\n4665,2787\n4665,30331\n4666,1033\n4667,577\n4668,247\n4668,925\n4669,668\n4670,2681\n4671,4672\n4672,10\n4672,217\n4672,222\n4672,536\n4672,599\n4672,1417\n4672,2318\n4672,2821\n4672,4672\n4672,6064\n4672,7241\n4672,7301\n4672,14369\n4672,14612\n4672,15017\n4672,16927\n4672,18865\n4672,18948\n4672,19834\n4672,20199\n4672,20201\n4672,20875\n4672,23550\n4672,24885\n4672,30735\n4672,37110\n4672,38030\n4672,40790\n4672,41025\n4672,42123\n4672,45029\n4672,48208\n4672,49551\n4672,52378\n4672,57187\n4672,58048\n4672,59344\n4672,59788\n4672,59793\n4672,59805\n4672,59814\n4672,80335\n4672,91522\n4672,94359\n4672,94966\n4672,101851\n4672,115474\n4672,120759\n4672,124158\n4672,124639\n4672,125046\n4672,127072\n4672,134056\n4672,138877\n4672,147454\n4672,147901\n4672,149115\n4672,155707\n4672,160006\n4672,162749\n4672,177793\n4672,216388\n4672,216739\n4672,216749\n4672,216754\n4672,216757\n4672,217390\n4672,218106\n4672,221759\n4672,231179\n4672,231211\n4672,234552\n4672,247395\n4672,251499\n4672,256977\n4672,256981\n4672,256982\n4672,258030\n4672,258622\n4672,258798\n4672,260756\n4673,364\n4674,104\n4674,254\n4674,557\n4674,953\n4674,954\n4676,247\n4677,4678\n4679,248\n4679,450\n4679,1332\n4680,417\n4680,1085\n4681,1\n4682,22\n4682,151\n4683,37\n4683,301\n4683,604\n4683,717\n4683,1231\n4683,1782\n4684,50\n4684,147\n4684,149\n4684,158\n4684,406\n4684,622\n4684,1425\n4684,1776\n4685,99\n4685,779\n4686,151\n4687,346\n4688,675\n4688,1085\n4690,4691\n4691,109\n4691,2593\n4691,4691\n4691,9379\n4691,13138\n4691,28111\n4691,28851\n4691,33721\n4691,43714\n4691,48752\n4691,88125\n4692,68\n4692,104\n4692,302\n4692,328\n4692,344\n4692,577\n4692,784\n4692,794\n4692,805\n4692,818\n4692,919\n4692,1119\n4692,1465\n4692,1789\n4692,1955\n4693,1072\n4694,2416\n4694,2417\n4694,3538\n4694,5908\n4695,247\n4696,1298\n4696,2191\n4697,298\n4698,485\n4700,392\n4700,1240\n4701,22\n4701,192\n4701,911\n4701,1021\n4701,1655\n4701,2209\n4701,5726\n4702,202\n4702,203\n4702,2371\n4703,2605\n4704,850\n4705,563\n4705,668\n4706,149\n4706,158\n4706,640\n4706,731\n4706,127158\n4707,852\n4707,1143\n4708,749\n4708,1332\n4708,1893\n4709,20\n4710,72\n4711,192\n4712,104\n4712,557\n4712,953\n4712,954\n4713,364\n4713,850\n4714,887\n4715,417\n4716,3003\n4717,346\n4718,1634\n4719,4720\n4721,72\n4722,72\n4722,87\n4722,312\n4722,509\n4722,615\n4722,875\n4722,941\n4722,1043\n4722,1052\n4722,1707\n4722,3695\n4723,372\n4723,657\n4723,1635\n4724,171\n4725,596\n4725,1368\n4726,1381\n4727,63\n4727,195\n4727,252\n4727,264\n4727,392\n4727,406\n4727,516\n4727,631\n4727,1370\n4727,1381\n4727,1453\n4727,1745\n4727,1955\n4728,3623\n4729,1265\n4729,1266\n4730,417\n4731,557\n4732,557\n4733,2506\n4734,2506\n4735,2506\n4736,2506\n4737,2506\n4738,2506\n4739,338\n4739,515\n4739,1119\n4739,1381\n4739,1893\n4739,49057\n4740,510\n4740,657\n4740,694\n4740,2421\n4740,3367\n4740,9029\n4741,285\n4741,620\n4741,8244\n4741,21442\n4742,389\n4742,3260\n4743,579\n4743,4823\n4744,872\n4745,323\n4745,417\n4745,634\n4745,1149\n4746,406\n4747,2867\n4747,2868\n4747,4748\n4747,5881\n4747,22880\n4748,47\n4748,967\n4748,994\n4748,1235\n4748,1335\n4748,2469\n4748,4748\n4748,5700\n4748,5871\n4748,5881\n4748,13515\n4748,20486\n4748,25120\n4748,25821\n4749,301\n4749,907\n4749,2191\n4749,2557\n4750,65\n4751,68\n4751,336\n4751,431\n4751,818\n4751,4220\n4752,120\n4752,158\n4752,261\n4752,301\n4752,333\n4752,406\n4752,493\n4752,682\n4752,694\n4752,2045\n4752,2797\n4753,140\n4754,272\n4755,1117\n4756,267\n4757,1016\n4758,304\n4759,240\n4759,392\n4759,919\n4759,1465\n4759,1805\n4759,1860\n4759,1949\n4759,3258\n4759,4760\n4759,21982\n4760,87\n4760,349\n4760,452\n4760,599\n4760,658\n4760,697\n4760,809\n4760,911\n4760,918\n4760,919\n4760,1240\n4760,1424\n4760,1663\n4760,1805\n4760,1949\n4760,1986\n4760,2045\n4760,3509\n4760,4759\n4760,6552\n4760,19010\n4760,22293\n4760,31030\n4760,33338\n4760,33674\n4760,34129\n4760,36720\n4760,37219\n4760,56256\n4760,65931\n4760,69250\n4760,90144\n4760,91259\n4760,104565\n4760,112321\n4760,142291\n4760,182465\n4760,206189\n4760,220317\n4760,229167\n4762,2506\n4763,805\n4764,1204\n4765,841\n4766,1402\n4767,1707\n4768,65\n4769,126\n4769,1014\n4769,37414\n4770,4771\n4771,58\n4771,107\n4771,111\n4771,227\n4771,292\n4771,314\n4771,338\n4771,373\n4771,431\n4771,440\n4771,441\n4771,442\n4771,462\n4771,502\n4771,580\n4771,596\n4771,609\n4771,631\n4771,673\n4771,677\n4771,715\n4771,749\n4771,801\n4771,872\n4771,978\n4771,1014\n4771,1140\n4771,1235\n4771,1417\n4771,1449\n4771,1572\n4771,1663\n4771,1688\n4771,1722\n4771,1758\n4771,1796\n4771,1844\n4771,1860\n4771,2334\n4771,2379\n4771,2726\n4771,3035\n4771,3328\n4771,3496\n4771,3538\n4771,4367\n4771,4520\n4771,5501\n4771,6569\n4771,6904\n4771,7523\n4771,15658\n4771,16638\n4771,20787\n4771,23664\n4771,26031\n4771,27495\n4771,30733\n4771,30770\n4771,32978\n4771,33283\n4771,37224\n4771,41972\n4771,42143\n4771,44188\n4771,45775\n4771,46166\n4771,46830\n4771,49379\n4771,49578\n4771,50289\n4771,54257\n4771,55177\n4771,57161\n4771,60325\n4771,64676\n4771,67016\n4771,73568\n4771,77818\n4771,78891\n4771,87534\n4771,88114\n4771,104592\n4771,106442\n4771,120835\n4771,120903\n4771,120915\n4771,120995\n4771,121002\n4771,121211\n4771,121541\n4771,124314\n4771,130250\n4771,135620\n4771,137941\n4771,138239\n4771,147413\n4771,148824\n4771,149031\n4771,151487\n4771,152775\n4771,153887\n4771,161947\n4771,169717\n4771,169982\n4771,171220\n4771,178097\n4771,183437\n4771,185349\n4771,191987\n4771,192333\n4771,192548\n4771,192663\n4771,195618\n4771,230966\n4771,233424\n4771,244115\n4771,245430\n4771,250800\n4771,255743\n4772,187\n4772,264\n4772,634\n4772,2620\n4773,2373\n4774,2681\n4775,718\n4776,4777\n4778,358\n4779,720\n4780,861\n4781,107\n4782,147\n4782,158\n4782,314\n4782,20030\n4782,32631\n4782,122182\n4783,107\n4784,3695\n4785,1789\n4786,862\n4787,240\n4787,332\n4787,536\n4787,781\n4787,818\n4788,941\n4789,151\n4790,143\n4790,1052\n4790,2944\n4791,994\n4792,79\n4793,1429\n4794,949\n4795,94\n4795,2787\n4796,2506\n4797,450\n4797,611\n4797,1927\n4798,1001\n4799,135\n4799,1843\n4799,2424\n4799,2553\n4799,4799\n4799,6506\n4799,7075\n4799,13276\n4799,79601\n4799,79655\n4799,79966\n4799,98890\n4799,104961\n4799,106326\n4799,109967\n4799,123395\n4799,127757\n4799,164883\n4799,167340\n4799,234354\n4799,251514\n4799,261819\n4799,261822\n4799,261833\n4800,4801\n4802,158\n4802,192\n4802,620\n4802,4192\n4802,4193\n4802,194822\n4803,577\n4804,358\n4804,4805\n4806,8\n4806,20\n4806,32\n4806,269\n4806,302\n4806,424\n4806,433\n4806,575\n4806,581\n4806,595\n4806,644\n4806,668\n4806,673\n4806,713\n4806,717\n4806,760\n4806,784\n4806,918\n4806,985\n4806,1058\n4806,1089\n4806,1130\n4806,1147\n4806,1368\n4806,1392\n4806,1579\n4806,1844\n4806,2373\n4806,2605\n4806,2750\n4806,2779\n4806,3089\n4806,3135\n4806,4276\n4806,7117\n4806,26450\n4807,247\n4808,37\n4808,304\n4808,3999\n4809,4810\n4810,5\n4810,355\n4810,4810\n4810,6532\n4810,14316\n4810,36000\n4810,45259\n4810,57610\n4810,74110\n4810,88153\n4810,107238\n4810,108607\n4810,125138\n4810,137869\n4810,138105\n4810,146062\n4810,173578\n4810,178354\n4811,605\n4811,919\n4812,215\n4813,1509\n4814,493\n4814,1659\n4814,1927\n4815,147\n4816,2506\n4817,192\n4818,843\n4819,515\n4819,1381\n4820,207\n4821,805\n4822,4823\n4824,417\n4825,1639\n4826,240\n4827,4828\n4829,920\n4830,4831\n4832,298\n4833,485\n4834,195\n4835,135\n4836,2105\n4837,94\n4837,116\n4837,994\n4837,1235\n4837,2087\n4838,30\n4839,107\n4840,1238\n4841,160\n4841,640\n4841,1287\n4842,760\n4843,83\n4844,1572\n4845,500\n4845,893\n4846,135\n4847,671\n4848,417\n4848,1274\n4848,1414\n4849,893\n4850,195\n4851,356\n4852,175\n4852,255\n4852,294\n4852,615\n4852,1058\n4852,1436\n4852,3209\n4852,4691\n4853,72\n4854,2048\n4855,2590\n4856,1072\n4857,417\n4858,4859\n4860,72\n4861,4862\n4863,83\n4864,147\n4864,306\n4864,307\n4864,489\n4864,563\n4864,663\n4864,664\n4864,920\n4864,3148\n4864,4865\n4864,4866\n4864,6041\n4864,6179\n4864,6180\n4864,6184\n4864,6837\n4866,602\n4867,4868\n4869,485\n4870,660\n4871,366\n4871,500\n4871,1623\n4871,2606\n4872,72\n4873,206\n4874,872\n4875,784\n4876,240\n4877,1849\n4878,1837\n4879,289\n4879,290\n4879,417\n4879,94134\n4880,1551\n4881,77\n4882,252\n4882,516\n4883,4884\n4885,140\n4885,346\n4885,349\n4885,859\n4885,1151\n4885,1564\n4885,1590\n4886,240\n4886,372\n4886,1082\n4886,1285\n4886,1309\n4886,1796\n4886,1807\n4886,1888\n4886,1955\n4886,2775\n4886,3135\n4887,1133\n4887,1167\n4887,1522\n4887,1785\n4888,171\n4889,147\n4889,885\n4889,6303\n4890,885\n4890,13704\n4891,34\n4891,35\n4892,4893\n4894,4895\n4896,264\n4897,1556\n4898,932\n4898,1122\n4898,1298\n4899,3467\n4900,850\n4901,65\n4901,255\n4901,292\n4901,315\n4901,675\n4901,1363\n4901,1414\n4901,4252\n4902,4903\n4903,392\n4903,644\n4903,3003\n4903,3258\n4903,4415\n4903,6424\n4903,7768\n4903,13136\n4903,29260\n4903,49037\n4903,91284\n4903,150783\n4903,150784\n4903,151390\n4903,151408\n4903,151414\n4903,151420\n4903,152553\n4904,1608\n4904,77315\n4905,4906\n4907,589\n4908,1515\n4909,2205\n4909,2206\n4909,33424\n4910,1414\n4912,4913\n4914,4915\n4914,21912\n4914,39420\n4914,51837\n4914,55106\n4914,91104\n4914,95214\n4914,105356\n4914,105901\n4914,112720\n4916,346\n4917,4918\n4917,16062\n4919,104\n4919,134\n4919,137\n4919,2105\n4920,1\n4921,346\n4922,3345\n4923,602\n4924,1085\n4925,188\n4926,663\n4926,664\n4927,34\n4927,35\n4928,195\n4929,349\n4930,4931\n4932,505\n4932,1837\n4933,217\n4933,435\n4933,541\n4933,561\n4933,1907\n4933,3246\n4933,3247\n4933,3297\n4933,4672\n4933,4831\n4933,4934\n4933,4935\n4933,4936\n4933,8330\n4933,19809\n4933,21826\n4933,21938\n4933,43604\n4933,43605\n4933,43606\n4933,43607\n4933,43608\n4933,43609\n4933,43610\n4933,43611\n4937,772\n4938,772\n4938,4939\n4938,4940\n4938,4941\n4938,15807\n4938,53230\n4939,30\n4939,772\n4939,4936\n4941,30\n4941,200\n4941,248\n4941,328\n4941,772\n4941,1014\n4941,1415\n4941,4941\n4941,15807\n4941,28203\n4941,95554\n4942,663\n4943,147\n4944,4945\n4946,4947\n4948,1127\n4949,417\n4950,1977\n4950,1978\n4951,4952\n4951,70325\n4951,115642\n4953,861\n4954,4955\n4954,97868\n4956,72\n4957,1192\n4958,781\n4959,346\n4960,1370\n4961,104\n4961,850\n4962,346\n4963,44\n4964,622\n4965,272\n4966,4967\n4968,4967\n4969,4967\n4970,269\n4971,885\n4972,366\n4973,4974\n4975,346\n4976,366\n4977,1515\n4978,83\n4979,4980\n4980,4980\n4981,346\n4982,1007\n4983,104\n4984,83\n4984,86\n4984,254\n4984,267\n4984,269\n4984,271\n4984,356\n4984,483\n4984,1179\n4984,1313\n4984,2372\n4984,34511\n4984,115652\n4984,131622\n4985,605\n4985,1235\n4985,1335\n4986,81\n4987,1773\n4988,697\n4989,4990\n4991,136\n4991,138\n4992,376\n4993,192\n4993,1392\n4993,1745\n4994,1381\n4995,50\n4995,841\n4995,2048\n4996,233\n4997,1132\n4998,762\n4998,911\n4999,1893\n5000,251\n5000,1531\n5000,2567\n5001,83\n5002,298\n5002,1639\n5003,1424\n5004,515\n5005,83\n5006,22\n5007,323\n5008,186\n5008,1326\n5008,1411\n5008,5961\n5009,1068\n5010,94\n5010,500\n5010,2787\n5010,3769\n5011,104\n5011,111\n5011,134\n5011,248\n5011,289\n5011,290\n5011,298\n5011,372\n5011,557\n5011,631\n5011,714\n5011,1016\n5011,1119\n5011,1462\n5011,1659\n5011,1745\n5011,1955\n5011,8180\n5011,8537\n5011,94134\n5012,178\n5013,366\n5014,430\n5015,48\n5016,302\n5016,861\n5017,827\n5018,920\n5018,1619\n5019,660\n5020,1298\n5021,338\n5021,1631\n5023,885\n5023,13704\n5024,430\n5025,2737\n5026,720\n5027,1227\n5027,1229\n5027,21944\n5028,602\n5029,5030\n5031,5031\n5032,877\n5033,388\n5033,392\n5034,8\n5034,19\n5034,187\n5034,385\n5034,1313\n5034,1718\n5034,2168\n5034,2224\n5034,2421\n5034,3644\n5034,5034\n5034,5036\n5034,5038\n5034,5039\n5034,5040\n5034,5041\n5034,5042\n5034,5326\n5034,8220\n5034,15094\n5034,19286\n5034,31039\n5034,45666\n5034,60321\n5034,74555\n5034,81151\n5034,82163\n5034,82217\n5034,82659\n5034,83790\n5034,83791\n5034,83793\n5034,83795\n5034,90111\n5034,95305\n5034,107043\n5034,133012\n5034,140758\n5034,147768\n5034,148305\n5034,155621\n5034,158398\n5034,160321\n5034,160322\n5034,175850\n5034,178722\n5034,185859\n5034,185867\n5034,188791\n5034,189121\n5034,192614\n5034,205733\n5034,213388\n5034,218806\n5034,222588\n5034,229679\n5034,258707\n5035,344\n5037,647\n5037,919\n5037,1179\n5040,5034\n5043,509\n5043,783\n5043,1043\n5043,1345\n5043,1424\n5043,3367\n5044,5030\n5045,306\n5045,307\n5046,83\n5046,13980\n5047,338\n5048,147\n5048,158\n5048,406\n5048,779\n5049,50\n5049,79\n5049,158\n5049,406\n5049,779\n5049,1181\n5049,1414\n5049,1515\n5049,2931\n5050,10\n5050,22\n5050,240\n5050,269\n5050,302\n5050,758\n5050,818\n5050,861\n5050,893\n5050,1572\n5050,2017\n5050,17309\n5051,390\n5052,192\n5052,256\n5052,390\n5052,615\n5052,703\n5052,808\n5052,1118\n5052,1133\n5052,1844\n5052,6638\n5052,50176\n5053,104\n5053,264\n5053,323\n5053,332\n5053,557\n5053,872\n5053,1130\n5053,1332\n5053,1381\n5053,1572\n5053,1688\n5053,1722\n5053,1893\n5053,4039\n5053,4276\n5053,7270\n5054,647\n5054,991\n5054,2260\n5054,3177\n5055,119\n5056,302\n5057,264\n5057,338\n5057,360\n5057,509\n5057,1052\n5057,1147\n5057,1289\n5057,1659\n5058,1659\n5058,1893\n5059,79\n5060,63\n5061,217\n5061,397\n5061,1181\n5061,1417\n5062,784\n5063,3297\n5064,202\n5064,203\n5065,809\n5066,178\n5066,622\n5066,1033\n5067,1572\n5068,441\n5069,83\n5070,202\n5070,203\n5070,516\n5071,338\n5072,217\n5073,206\n5073,602\n5073,788\n5073,957\n5073,1634\n5073,1815\n5073,36761\n5074,5030\n5075,209\n5076,167\n5076,968\n5077,1313\n5079,338\n5080,171\n5080,726\n5080,859\n5080,980\n5080,4611\n5081,3585\n5082,2051\n5083,447\n5083,934\n5084,861\n5085,660\n5086,1579\n5087,1639\n5088,306\n5088,307\n5090,2224\n5091,589\n5092,985\n5093,422\n5094,604\n5094,968\n5095,422\n5096,422\n5097,422\n5098,422\n5099,422\n5100,10\n5100,175\n5100,195\n5100,668\n5100,1893\n5100,5101\n5100,5103\n5100,183501\n5102,3378\n5102,5100\n5102,5103\n5102,5149\n5102,5150\n5102,5463\n5102,5464\n5102,5465\n5102,5603\n5102,7384\n5102,7479\n5102,7699\n5102,8039\n5102,14087\n5102,14836\n5102,15366\n5102,17203\n5102,17644\n5102,17645\n5102,18716\n5102,18788\n5102,20961\n5102,20970\n5102,20974\n5102,21024\n5102,21821\n5102,21824\n5102,23208\n5102,28164\n5102,28267\n5102,29182\n5102,29434\n5102,29615\n5102,30342\n5102,30759\n5102,30761\n5102,31806\n5102,31807\n5102,31808\n5102,31809\n5102,31810\n5102,31811\n5102,31812\n5102,31813\n5102,31814\n5102,31815\n5102,31816\n5102,31817\n5102,31818\n5102,31819\n5102,31820\n5102,31821\n5102,31822\n5102,31823\n5102,31824\n5102,31825\n5102,31826\n5102,31827\n5102,31828\n5102,31829\n5102,31830\n5102,31831\n5102,31833\n5102,31834\n5102,31835\n5102,31836\n5102,31837\n5102,31838\n5102,31839\n5102,31840\n5102,31841\n5102,31842\n5102,31843\n5102,31844\n5102,31845\n5102,31846\n5102,31847\n5102,31848\n5102,31849\n5102,31850\n5102,31851\n5102,31852\n5102,33648\n5102,33986\n5102,35588\n5102,35589\n5102,36248\n5102,36332\n5102,36648\n5102,36931\n5102,37379\n5102,37380\n5102,37382\n5102,37383\n5102,37384\n5102,37385\n5102,38168\n5102,38365\n5102,38373\n5102,39982\n5102,39987\n5102,39988\n5102,39989\n5102,40666\n5102,44174\n5102,45256\n5102,45832\n5102,45877\n5104,192\n5104,336\n5105,403\n5105,628\n5106,1388\n5107,422\n5108,859\n5108,1033\n5109,63\n5110,452\n5110,457\n5110,497\n5111,140\n5112,250\n5112,887\n5112,1235\n5112,1335\n5113,140\n5114,292\n5115,3507\n5116,1402\n5117,358\n5118,1803\n5118,21442\n5119,247\n5120,887\n5121,1402\n5122,5123\n5124,30\n5124,97\n5124,147\n5124,175\n5124,184\n5124,337\n5124,563\n5124,920\n5124,1089\n5124,1425\n5124,1619\n5124,1623\n5124,2782\n5125,306\n5126,307\n5127,1117\n5128,577\n5129,186\n5129,518\n5129,626\n5129,668\n5129,775\n5129,1001\n5129,1014\n5129,1326\n5129,1411\n5129,1453\n5129,1454\n5129,1836\n5129,2995\n5129,3804\n5129,5130\n5130,186\n5130,518\n5130,765\n5130,775\n5130,794\n5130,795\n5130,1298\n5130,1326\n5130,1411\n5130,1545\n5130,1599\n5130,1749\n5130,2775\n5130,3115\n5130,3407\n5130,3718\n5130,5129\n5130,5385\n5130,5388\n5130,6470\n5130,15474\n5130,21473\n5130,33695\n5130,40491\n5130,44727\n5130,48006\n5130,49121\n5130,59098\n5130,88120\n5130,96685\n5130,98940\n5130,173744\n5131,15\n5131,140\n5131,264\n5131,338\n5131,736\n5131,1509\n5131,1893\n5131,3474\n5132,415\n5133,171\n5133,602\n5133,620\n5133,1849\n5134,323\n5135,86\n5135,358\n5135,657\n5135,673\n5135,891\n5135,980\n5135,1130\n5135,1227\n5135,1749\n5135,3218\n5135,86416\n5136,668\n5137,634\n5137,1052\n5137,1212\n5137,1767\n5137,1849\n5137,2701\n5138,720\n5139,298\n5139,390\n5140,462\n5140,1127\n5141,146\n5142,5143\n5144,3555\n5145,202\n5145,203\n5145,620\n5146,86\n5147,302\n5148,302\n5148,1803\n5148,21442\n5151,202\n5151,203\n5152,79\n5153,1436\n5154,589\n5154,720\n5155,104\n5155,192\n5155,200\n5155,256\n5155,1715\n5155,1796\n5155,2979\n5155,3804\n5157,1285\n5157,1634\n5158,192\n5158,992\n5159,1849\n5160,595\n5160,703\n5160,1151\n5160,1453\n5160,3258\n5161,1014\n5162,24\n5162,2893\n5162,34060\n5163,217\n5163,477\n5163,644\n5163,1417\n5163,1882\n5163,2944\n5163,6506\n5164,5165\n5166,500\n5167,302\n5168,22\n5168,579\n5169,764\n5169,3804\n5170,1326\n5171,390\n5172,491\n5173,192\n5173,313\n5173,2421\n5174,81\n5174,211\n5174,406\n5174,640\n5175,147\n5176,577\n5177,687\n5177,1556\n5178,217\n5178,657\n5178,1210\n5179,65\n5180,10\n5181,79\n5181,81\n5181,301\n5181,393\n5181,1282\n5181,1284\n5181,1634\n5181,4355\n5183,1052\n5183,162599\n5184,158\n5185,217\n5185,292\n5185,455\n5185,509\n5185,1010\n5185,1118\n5185,1282\n5185,1298\n5185,1465\n5185,1801\n5185,1955\n5185,2083\n5185,2373\n5185,2979\n5186,186\n5186,372\n5186,388\n5186,390\n5186,589\n5186,626\n5186,694\n5186,934\n5186,1001\n5186,1082\n5186,1085\n5186,1118\n5186,1300\n5186,1522\n5186,1544\n5186,1572\n5186,3193\n5186,4066\n5186,75912\n5186,103860\n5187,298\n5188,485\n5189,140\n5189,202\n5189,203\n5189,254\n5189,346\n5189,439\n5189,671\n5189,1007\n5189,1294\n5189,1612\n5190,859\n5190,1639\n5191,5192\n5192,207\n5192,336\n5192,1087\n5192,1434\n5192,1607\n5192,1955\n5192,3582\n5192,3666\n5192,5191\n5192,20757\n5192,21569\n5192,27060\n5192,29679\n5192,60116\n5192,111065\n5192,116042\n5192,131662\n5192,132767\n5192,146792\n5192,148813\n5192,161501\n5192,216663\n5192,217421\n5192,217587\n5192,233507\n5192,242318\n5192,250776\n5193,366\n5193,622\n5193,718\n5193,929\n5193,1566\n5193,4678\n5194,1782\n5195,1167\n5196,433\n5196,1634\n5197,1160\n5198,387\n5199,852\n5200,875\n5201,79\n5202,710\n5202,1127\n5202,1673\n5203,1454\n5204,106\n5205,302\n5206,360\n5206,1639\n5207,143\n5208,34\n5208,35\n5208,222\n5208,240\n5208,261\n5208,278\n5208,349\n5208,392\n5208,433\n5208,455\n5208,657\n5208,1417\n5208,2266\n5208,13137\n5208,33508\n5208,115474\n5208,127158\n5209,808\n5210,313\n5211,872\n5211,5212\n5212,439\n5212,1068\n5212,1663\n5212,19338\n5212,24707\n5212,29742\n5212,49407\n5212,49673\n5212,60759\n5212,69431\n5212,73496\n5212,75349\n5212,85662\n5212,109098\n5212,116697\n5212,143487\n5212,165867\n5212,175910\n5213,10\n5213,11\n5213,314\n5213,452\n5213,457\n5213,567\n5213,693\n5213,843\n5213,849\n5213,911\n5213,972\n5213,1011\n5213,1135\n5213,1172\n5213,1204\n5213,1284\n5213,1293\n5213,1434\n5213,1844\n5213,5540\n5213,5591\n5213,7087\n5213,8419\n5213,19413\n5213,23027\n5213,25598\n5213,29886\n5213,38881\n5213,41927\n5213,45859\n5213,47664\n5213,57149\n5213,62780\n5213,62837\n5213,62870\n5213,101652\n5213,113959\n5213,148027\n5213,156593\n5213,189795\n5213,207659\n5213,214190\n5213,214653\n5213,215874\n5213,227031\n5213,236785\n5213,237286\n5213,237457\n5213,243011\n5213,244646\n5213,245416\n5213,245713\n5213,247705\n5213,256912\n5214,186\n5214,1118\n5215,225\n5215,1332\n5216,5217\n5218,328\n5219,425\n5220,5221\n5223,399\n5223,1419\n5223,7698\n5224,1639\n5225,417\n5225,714\n5225,2008\n5226,314\n5226,1566\n5227,634\n5228,240\n5228,439\n5228,1019\n5228,1181\n5229,631\n5229,992\n5230,388\n5230,455\n5231,392\n5231,818\n5231,1634\n5231,127158\n5232,2553\n5233,5234\n5235,5234\n5236,5234\n5237,5234\n5238,1167\n5239,5240\n5243,784\n5244,65\n5244,957\n5244,1247\n5244,1815\n5244,109503\n5244,164572\n5245,1659\n5246,1515\n5247,302\n5248,298\n5249,485\n5250,186\n5250,326\n5250,402\n5250,752\n5250,1210\n5250,1267\n5250,1293\n5250,1559\n5250,2182\n5250,2470\n5250,2672\n5250,15344\n5250,20601\n5250,23029\n5250,29328\n5250,34085\n5250,35292\n5250,39438\n5250,39958\n5250,46271\n5250,48002\n5250,55832\n5250,62850\n5250,65621\n5250,88976\n5250,90132\n5250,92356\n5250,116652\n5250,117738\n5250,118243\n5250,120638\n5250,174074\n5250,227671\n5250,234303\n5250,245841\n5250,255611\n5251,160\n5251,420\n5251,861\n5252,1836\n5253,195\n5254,3555\n5255,301\n5255,510\n5255,968\n5255,1231\n5255,2480\n5256,809\n5257,323\n5258,104\n5258,292\n5258,338\n5258,462\n5258,805\n5258,809\n5258,835\n5258,1572\n5258,1688\n5258,1722\n5258,1893\n5258,4039\n5259,77\n5259,595\n5259,809\n5259,1453\n5259,2116\n5260,512\n5260,4028\n5260,5260\n5260,5261\n5260,7769\n5260,13161\n5260,21494\n5260,30318\n5260,80368\n5260,80956\n5260,82054\n5260,98012\n5260,99763\n5260,110141\n5260,114070\n5260,123516\n5260,136044\n5260,152923\n5260,175213\n5260,178652\n5260,179711\n5260,181897\n5260,219909\n5260,222365\n5260,225613\n5260,226166\n5260,233994\n5262,694\n5262,698\n5262,1782\n5263,217\n5263,302\n5263,861\n5263,1556\n5263,4823\n5264,392\n5265,10\n5265,215\n5265,446\n5265,693\n5265,714\n5265,907\n5265,911\n5265,3507\n5265,5265\n5265,5266\n5265,5555\n5265,22482\n5265,38836\n5265,38863\n5265,73292\n5265,155380\n5265,206084\n5266,264\n5267,875\n5268,518\n5268,1955\n5268,2775\n5269,264\n5271,1323\n5272,102\n5273,1326\n5274,408\n5275,178\n5276,1262\n5277,626\n5278,240\n5278,289\n5278,290\n5278,372\n5278,592\n5278,631\n5278,805\n5278,932\n5278,1085\n5278,1392\n5278,1462\n5278,1631\n5278,1818\n5278,1955\n5278,2205\n5278,2206\n5278,2620\n5278,2995\n5278,3069\n5278,5718\n5278,8537\n5278,33424\n5279,577\n5279,596\n5279,1368\n5279,1429\n5280,422\n5280,602\n5281,1847\n5282,22\n5282,264\n5282,515\n5282,801\n5282,1052\n5282,1381\n5282,4039\n5283,503\n5285,457\n5285,510\n5285,623\n5285,809\n5285,980\n5285,1274\n5285,49193\n5286,2209\n5287,1147\n5288,65\n5288,1247\n5289,489\n5290,10\n5291,247\n5292,160\n5292,1837\n5295,3260\n5297,304\n5298,1133\n5299,390\n5300,673\n5301,46\n5301,167\n5301,299\n5301,673\n5301,783\n5301,968\n5301,1544\n5301,1849\n5301,2083\n5301,2372\n5301,2588\n5301,2810\n5301,3207\n5301,3218\n5301,3630\n5301,5301\n5301,6824\n5301,7087\n5301,13299\n5301,13480\n5301,24579\n5301,26742\n5301,29760\n5301,31731\n5301,39708\n5301,41854\n5301,46165\n5301,62932\n5301,73355\n5301,88306\n5301,97699\n5301,110186\n5301,110575\n5301,120978\n5301,127404\n5301,127807\n5301,128922\n5301,135333\n5301,148335\n5301,167083\n5301,167808\n5301,182909\n5301,186497\n5301,192508\n5301,194007\n5301,194566\n5301,204721\n5301,214981\n5301,215322\n5301,226499\n5301,240769\n5301,242379\n5301,253721\n5302,326\n5302,873\n5302,874\n5302,1801\n5303,330\n5304,861\n5305,438\n5306,54\n5306,477\n5306,634\n5306,660\n5306,2168\n5306,2424\n5306,2646\n5306,2944\n5306,23287\n5309,5310\n5312,949\n5314,30\n5315,211\n5316,3846\n5317,1149\n5317,3182\n5318,5319\n5318,8907\n5318,32480\n5318,36069\n5318,36675\n5318,40155\n5318,44550\n5318,52683\n5318,53980\n5318,57770\n5318,67941\n5318,68069\n5318,85035\n5318,88876\n5318,89292\n5318,97728\n5318,99029\n5318,101881\n5318,103600\n5318,105139\n5318,105314\n5318,106339\n5318,106628\n5318,107252\n5318,107325\n5318,109504\n5318,112389\n5320,433\n5321,417\n5322,818\n5323,852\n5324,314\n5324,433\n5325,385\n5325,657\n5325,1881\n5325,2779\n5325,4637\n5326,19\n5326,34\n5326,35\n5326,83\n5326,222\n5326,313\n5326,385\n5326,389\n5326,536\n5326,634\n5326,849\n5326,1313\n5326,1571\n5326,1576\n5326,1618\n5326,1718\n5326,1724\n5326,1843\n5326,2159\n5326,2168\n5326,2224\n5326,2424\n5326,2646\n5326,2784\n5326,2944\n5326,4223\n5326,5326\n5326,5327\n5326,7847\n5326,8431\n5326,16242\n5326,17811\n5326,17825\n5326,18345\n5326,18831\n5326,19443\n5326,19562\n5326,23287\n5326,27115\n5326,33055\n5326,45666\n5326,62539\n5326,67284\n5326,75340\n5326,152166\n5326,174955\n5326,181063\n5326,186608\n5326,188791\n5326,198176\n5328,1240\n5330,417\n5331,41\n5331,694\n5331,805\n5331,1177\n5331,1608\n5331,2210\n5331,6556\n5331,182162\n5332,272\n5333,1515\n5335,221\n5335,5336\n5335,28163\n5335,30696\n5335,35842\n5335,51376\n5335,51558\n5335,53633\n5335,54680\n5335,56967\n5335,57145\n5335,57400\n5335,57918\n5335,78260\n5335,78274\n5335,78281\n5335,79472\n5335,79557\n5335,81819\n5335,81916\n5335,82506\n5335,85320\n5335,87882\n5335,88197\n5335,91091\n5335,92374\n5335,95468\n5335,98719\n5335,98883\n5335,99402\n5335,100133\n5335,100156\n5335,102005\n5335,104873\n5335,105442\n5335,108389\n5335,109420\n5335,111645\n5335,112920\n5335,188931\n5335,193530\n5335,233740\n5337,717\n5338,298\n5339,485\n5341,252\n5341,318\n5341,41170\n5342,158\n5342,192\n5342,195\n5342,406\n5342,640\n5342,973\n5342,1181\n5342,2244\n5342,2371\n5342,2626\n5342,2931\n5342,3297\n5342,4192\n5342,4193\n5342,5343\n5342,8822\n5342,68069\n5343,5343\n5345,1052\n5346,120\n5346,261\n5346,332\n5346,588\n5346,590\n5346,760\n5346,805\n5346,818\n5346,1119\n5346,1402\n5346,1466\n5346,1818\n5346,1955\n5346,2989\n5346,2991\n5346,6837\n5346,127158\n5347,2443\n5348,1769\n5349,312\n5349,525\n5349,1749\n5350,158\n5351,657\n5351,718\n5351,760\n5351,1014\n5351,5102\n5353,192\n5353,264\n5353,301\n5353,516\n5353,920\n5353,1010\n5353,1147\n5353,1210\n5353,1531\n5355,1556\n5356,71\n5356,146\n5356,163\n5356,252\n5356,287\n5356,344\n5356,379\n5356,390\n5356,485\n5356,663\n5356,682\n5356,685\n5356,702\n5356,733\n5356,775\n5356,795\n5356,841\n5356,849\n5356,859\n5356,911\n5356,1127\n5356,1133\n5356,1188\n5356,1240\n5356,1285\n5356,1319\n5356,1332\n5356,1515\n5356,1566\n5356,1985\n5356,2353\n5356,4545\n5356,7194\n5356,19010\n5356,26450\n5356,44725\n5356,72439\n5356,139010\n5356,221828\n5356,227376\n5357,4\n5357,5\n5357,10\n5357,50\n5357,56\n5357,79\n5357,147\n5357,158\n5357,171\n5357,192\n5357,195\n5357,206\n5357,272\n5357,323\n5357,406\n5357,602\n5357,622\n5357,628\n5357,640\n5357,693\n5357,779\n5357,841\n5357,920\n5357,957\n5357,1149\n5357,1235\n5357,1247\n5357,1335\n5357,1425\n5357,1515\n5357,1623\n5357,2244\n5357,2719\n5357,2867\n5357,2868\n5357,3370\n5357,3876\n5357,4865\n5357,4866\n5357,5358\n5357,5359\n5357,6051\n5357,7270\n5357,8270\n5357,14352\n5357,14453\n5357,24505\n5357,54064\n5357,88018\n5357,125569\n5357,136574\n5357,164572\n5360,147\n5360,158\n5361,68\n5361,240\n5361,818\n5361,859\n5361,1012\n5362,1579\n5363,5\n5363,1181\n5363,1235\n5363,3370\n5363,8180\n5363,125569\n5363,164572\n5364,163\n5364,302\n5365,5366\n5366,5366\n5367,491\n5368,81\n5369,326\n5370,182\n5371,338\n5371,707\n5371,1893\n5372,104\n5373,56\n5374,5375\n5375,1235\n5375,1335\n5375,5375\n5375,9156\n5375,17151\n5375,18158\n5375,30079\n5375,44371\n5375,83691\n5375,93839\n5375,98083\n5375,113123\n5375,119402\n5375,125499\n5375,135769\n5375,135770\n5375,147202\n5375,170280\n5375,184272\n5376,192\n5376,264\n5376,301\n5376,312\n5376,435\n5376,439\n5376,1010\n5376,1381\n5376,1955\n5376,2979\n5377,1247\n5377,164572\n5378,862\n5379,1118\n5380,392\n5380,1240\n5380,1465\n5380,3260\n5382,68\n5382,186\n5382,240\n5382,261\n5382,301\n5382,440\n5382,444\n5382,525\n5382,538\n5382,615\n5382,968\n5382,972\n5382,1010\n5382,1293\n5382,1326\n5382,1385\n5382,1411\n5382,1782\n5382,1837\n5382,3804\n5382,5662\n5382,5961\n5382,31977\n5383,500\n5384,163\n5385,186\n5385,425\n5385,518\n5385,764\n5385,775\n5385,795\n5385,1011\n5385,1326\n5385,1411\n5385,3804\n5385,5130\n5385,5961\n5385,19005\n5386,10\n5386,97\n5386,99\n5386,147\n5386,158\n5386,333\n5386,336\n5386,366\n5386,422\n5386,640\n5386,841\n5386,1572\n5386,1659\n5386,1888\n5386,2244\n5386,60576\n5387,510\n5387,525\n5388,186\n5388,240\n5388,314\n5388,390\n5388,467\n5388,518\n5388,599\n5388,685\n5388,764\n5388,775\n5388,794\n5388,795\n5388,838\n5388,1011\n5388,1014\n5388,1046\n5388,1326\n5388,1411\n5388,1749\n5388,1796\n5388,1849\n5388,2006\n5388,2334\n5388,3507\n5388,3804\n5388,5130\n5388,26450\n5388,127158\n5388,215874\n5389,143\n5390,68\n5391,596\n5391,1368\n5392,440\n5392,622\n5393,200\n5394,1983\n5395,726\n5396,710\n5397,489\n5398,1285\n5399,200\n5400,518\n5401,1\n5401,10\n5401,97\n5401,146\n5401,147\n5401,175\n5401,206\n5401,333\n5401,336\n5401,366\n5401,505\n5401,640\n5401,5726\n5401,92476\n5401,152224\n5402,644\n5403,644\n5404,227\n5404,433\n5404,1635\n5404,2421\n5404,2750\n5404,8855\n5405,30\n5405,104\n5405,136\n5405,137\n5405,200\n5405,225\n5405,248\n5405,256\n5405,328\n5405,408\n5405,450\n5405,557\n5405,636\n5405,685\n5405,693\n5405,715\n5405,772\n5405,850\n5405,943\n5405,1179\n5405,1332\n5405,1415\n5405,2596\n5405,3182\n5405,3246\n5405,3247\n5405,3565\n5405,3633\n5405,4276\n5405,5405\n5405,5718\n5405,6023\n5405,7348\n5405,9379\n5405,13207\n5405,13220\n5405,13522\n5405,18625\n5405,19452\n5405,20395\n5405,20750\n5405,20842\n5405,21809\n5405,22105\n5405,22145\n5405,22537\n5405,22907\n5405,23065\n5405,23539\n5405,23542\n5405,23561\n5405,23571\n5405,24618\n5405,24622\n5405,24772\n5405,25036\n5405,25479\n5405,26136\n5405,26221\n5405,26432\n5405,26602\n5405,26608\n5405,26830\n5405,28112\n5405,29131\n5405,29321\n5405,31354\n5405,31388\n5405,34018\n5405,39139\n5405,39579\n5405,40879\n5405,44776\n5405,45175\n5405,45550\n5405,46176\n5405,46261\n5405,46824\n5405,56447\n5405,57166\n5405,58569\n5405,59207\n5405,59935\n5405,62896\n5405,63465\n5405,65913\n5405,70026\n5405,73162\n5405,77627\n5405,80116\n5405,80403\n5405,81703\n5405,81767\n5405,84635\n5405,84655\n5405,85784\n5405,85814\n5405,86470\n5405,86834\n5405,87101\n5405,90956\n5405,94232\n5405,98188\n5405,98252\n5405,103201\n5405,110731\n5405,113911\n5405,119120\n5405,121105\n5405,122140\n5405,123779\n5405,123786\n5405,123808\n5405,126364\n5405,126914\n5405,127157\n5405,127272\n5405,127536\n5405,134309\n5405,136217\n5405,136570\n5405,140008\n5405,142367\n5405,146350\n5405,146733\n5405,148269\n5405,148959\n5405,150776\n5405,155750\n5405,156774\n5405,159426\n5405,162539\n5405,162582\n5405,162587\n5405,165062\n5405,169016\n5405,171190\n5405,172209\n5405,177880\n5405,181802\n5405,181858\n5405,182743\n5405,182767\n5405,190276\n5405,198107\n5405,204775\n5405,205589\n5405,212022\n5405,212360\n5405,214179\n5405,219387\n5405,222356\n5405,236358\n5405,236716\n5405,244743\n5405,245478\n5405,246026\n5405,249948\n5405,254172\n5405,254283\n5406,1579\n5406,1871\n5407,1285\n5407,1955\n5408,143\n5410,818\n5410,861\n5410,1556\n5410,2017\n5411,2334\n5412,240\n5412,1285\n5412,1888\n5412,2620\n5413,41\n5413,119\n5413,298\n5413,640\n5413,843\n5413,1012\n5413,7155\n5414,13\n5414,663\n5415,163\n5416,298\n5417,485\n5418,48\n5419,3328\n5420,97\n5420,1381\n5420,1688\n5421,149\n5421,406\n5421,118336\n5423,107\n5423,111\n5423,292\n5423,1332\n5423,1415\n5424,56\n5424,841\n5424,30331\n5425,26\n5425,59\n5425,884\n5425,885\n5425,886\n5425,887\n5425,1432\n5425,21944\n5426,697\n5426,852\n5427,2775\n5427,3623\n5428,54\n5429,2989\n5429,2991\n5431,298\n5432,485\n5433,328\n5433,1078\n5433,4223\n5434,968\n5435,54\n5436,1515\n5436,1544\n5437,344\n5437,827\n5439,10\n5439,104\n5439,134\n5439,135\n5439,328\n5439,417\n5439,442\n5439,609\n5439,636\n5439,772\n5439,1001\n5439,1119\n5439,1257\n5439,1359\n5439,1882\n5439,1888\n5439,2105\n5439,2315\n5439,3474\n5439,3623\n5439,5440\n5439,32914\n5440,3507\n5440,5440\n5440,6824\n5440,189839\n5441,15\n5442,5443\n5444,5443\n5445,217\n5445,278\n5445,509\n5445,536\n5445,7572\n5445,20359\n5446,3585\n5447,1424\n5449,392\n5450,1\n5451,120\n5451,697\n5451,818\n5451,1072\n5451,1453\n5451,2173\n5451,2989\n5451,2991\n5452,50\n5452,158\n5452,192\n5452,195\n5452,278\n5452,285\n5452,356\n5452,406\n5452,640\n5452,779\n5452,841\n5452,1085\n5452,1175\n5452,1181\n5452,1467\n5452,1515\n5452,2296\n5452,3138\n5452,3585\n5452,5874\n5452,6119\n5454,2205\n5454,2206\n5455,301\n5455,604\n5455,968\n5456,58\n5457,1001\n5458,19\n5458,71\n5458,477\n5458,536\n5458,1618\n5458,2168\n5458,23287\n5459,749\n5460,1877\n5460,21442\n5461,136\n5461,302\n5461,538\n5461,893\n5461,15179\n5462,3695\n5465,5101\n5467,135\n5467,309\n5467,310\n5467,389\n5467,577\n5467,1010\n5467,1014\n5467,1177\n5467,1235\n5467,1345\n5467,1392\n5467,1707\n5467,1860\n5467,2073\n5467,2210\n5467,2416\n5467,2417\n5467,3804\n5467,5718\n5467,9005\n5467,31206\n5468,305\n5469,5469\n5469,8177\n5469,23202\n5469,25150\n5469,50679\n5469,55877\n5470,313\n5470,697\n5470,1332\n5470,1805\n5470,3769\n5471,58\n5472,30\n5472,50\n5472,104\n5472,111\n5472,267\n5472,304\n5472,328\n5472,356\n5472,372\n5472,417\n5472,435\n5472,440\n5472,615\n5472,622\n5472,631\n5472,784\n5472,794\n5472,801\n5472,862\n5472,943\n5472,1085\n5472,1179\n5472,1332\n5472,1844\n5472,1939\n5472,2083\n5472,2206\n5472,2995\n5472,3247\n5472,33424\n5472,75912\n5473,58\n5474,134\n5474,158\n5474,318\n5474,818\n5474,41170\n5475,907\n5475,932\n5476,2506\n5477,2506\n5479,3003\n5480,333\n5482,315\n5483,2353\n5484,887\n5485,147\n5485,158\n5485,192\n5485,620\n5485,779\n5486,693\n5486,1147\n5486,1623\n5487,10\n5488,862\n5488,3585\n5488,27041\n5489,4549\n5490,2353\n5491,1388\n5492,259\n5492,456\n5492,483\n5492,1118\n5492,2599\n5492,3951\n5492,3971\n5492,5492\n5492,5493\n5492,5583\n5492,6595\n5492,6652\n5492,6849\n5492,6973\n5492,15104\n5492,15783\n5492,16609\n5492,18627\n5492,20648\n5492,21278\n5492,23115\n5492,23125\n5492,24513\n5492,24665\n5492,27855\n5492,30448\n5492,30451\n5492,31396\n5492,34048\n5492,34122\n5492,37380\n5492,38842\n5492,38951\n5492,39453\n5492,47650\n5492,48643\n5492,49568\n5492,53760\n5492,56930\n5492,57043\n5492,59079\n5492,63371\n5492,63386\n5492,64015\n5492,64746\n5492,68150\n5492,68157\n5492,68206\n5492,68323\n5492,68741\n5492,70998\n5492,72638\n5492,72691\n5492,73547\n5492,74397\n5492,74449\n5492,75905\n5492,76053\n5492,77652\n5492,77922\n5492,80042\n5492,80677\n5492,83461\n5492,83857\n5492,87305\n5492,88516\n5492,93026\n5492,93730\n5492,94131\n5492,94890\n5492,95387\n5492,98896\n5492,104299\n5492,104409\n5492,104574\n5492,104598\n5492,105620\n5492,105628\n5492,107496\n5492,111307\n5492,112242\n5492,112619\n5492,116595\n5492,117922\n5492,120730\n5492,120833\n5492,125379\n5492,125390\n5492,125506\n5492,128856\n5492,131882\n5492,133624\n5492,135182\n5492,135335\n5492,135971\n5492,136083\n5492,136119\n5492,150082\n5492,150828\n5492,154987\n5492,155693\n5492,159078\n5492,159339\n5492,159720\n5492,160819\n5492,163577\n5492,163916\n5492,164286\n5492,164304\n5492,165805\n5492,170537\n5492,173238\n5492,175987\n5492,178618\n5492,178627\n5492,179151\n5492,181077\n5492,182802\n5492,182817\n5492,182858\n5492,183910\n5492,184788\n5492,185149\n5492,185934\n5492,186494\n5492,188508\n5492,189862\n5492,190939\n5492,191322\n5492,191429\n5492,194445\n5492,195640\n5492,219810\n5492,220350\n5492,228996\n5492,239936\n5492,239938\n5492,261756\n5493,579\n5493,5726\n5495,147\n5495,158\n5495,192\n5495,195\n5495,202\n5495,203\n5495,336\n5495,505\n5495,602\n5495,1089\n5495,1414\n5495,1619\n5495,1623\n5495,6119\n5495,8055\n5495,22616\n5496,151\n5496,167\n5496,1293\n5496,1522\n5496,2083\n5496,2557\n5497,861\n5499,3585\n5500,54\n5500,120\n5500,417\n5500,536\n5500,1363\n5500,1467\n5500,1749\n5501,4771\n5502,1580\n5502,1837\n5502,4411\n5504,5505\n5507,22\n5508,589\n5508,1001\n5509,41\n5509,1119\n5511,5512\n5513,2353\n5514,920\n5515,5516\n5517,985\n5518,26\n5518,59\n5519,644\n5519,1151\n5519,1363\n5520,372\n5521,147\n5521,158\n5521,118336\n5522,267\n5523,195\n5525,2506\n5526,2506\n5528,920\n5529,1631\n5530,54\n5530,58\n5530,102\n5530,146\n5530,273\n5530,274\n5530,408\n5530,422\n5530,510\n5530,1417\n5530,1436\n5530,1467\n5530,2421\n5530,2701\n5530,2704\n5530,3999\n5530,29008\n5530,92476\n5531,4411\n5532,2244\n5533,505\n5534,1007\n5534,3999\n5535,1149\n5536,140\n5536,147\n5536,158\n5536,278\n5536,302\n5536,309\n5536,310\n5536,328\n5536,372\n5536,392\n5536,406\n5536,592\n5536,623\n5536,631\n5536,694\n5536,760\n5536,779\n5536,818\n5536,861\n5536,1001\n5536,1010\n5536,1119\n5536,1241\n5536,1326\n5536,1782\n5536,1836\n5536,1962\n5536,5961\n5536,6789\n5536,121678\n5537,868\n5538,596\n5538,1796\n5539,1590\n5540,349\n5540,567\n5540,697\n5540,875\n5540,911\n5540,918\n5540,1612\n5540,1653\n5540,1805\n5540,1860\n5540,2699\n5540,3260\n5540,5540\n5540,172976\n5540,185524\n5541,135\n5541,483\n5542,1612\n5543,217\n5543,918\n5543,1010\n5543,1085\n5544,167\n5545,760\n5545,784\n5546,330\n5546,2146\n5546,5547\n5547,58\n5547,87\n5547,111\n5547,217\n5547,240\n5547,292\n5547,301\n5547,360\n5547,420\n5547,441\n5547,676\n5547,749\n5547,872\n5547,1118\n5547,1140\n5547,1188\n5547,1235\n5547,1240\n5547,1326\n5547,1335\n5547,1392\n5547,1411\n5547,1572\n5547,1653\n5547,1860\n5547,1973\n5547,2436\n5547,2443\n5547,3474\n5547,3804\n5547,4252\n5547,5547\n5547,7124\n5547,9005\n5547,9025\n5547,22924\n5547,54004\n5548,640\n5549,240\n5549,1564\n5550,195\n5551,497\n5551,1262\n5551,1332\n5551,1572\n5551,1844\n5551,11147\n5552,227\n5552,503\n5552,1149\n5553,309\n5553,310\n5554,640\n5555,941\n5555,5265\n5556,2051\n5557,2244\n5558,707\n5559,873\n5560,5561\n5562,1522\n5563,68\n5563,192\n5563,240\n5563,264\n5563,301\n5563,467\n5563,1294\n5563,1402\n5563,1531\n5563,1849\n5563,2286\n5563,2620\n5563,32784\n5564,1634\n5565,333\n5565,393\n5565,1531\n5566,5567\n5568,187\n5568,326\n5568,623\n5568,1616\n5568,1801\n5568,3003\n5568,5591\n5569,1019\n5570,2923\n5570,3524\n5570,4190\n5571,298\n5572,485\n5573,104\n5573,134\n5573,135\n5573,137\n5574,107\n5574,338\n5574,588\n5574,590\n5574,714\n5574,1119\n5574,1235\n5574,1335\n5575,704\n5576,467\n5576,595\n5576,1151\n5576,1893\n5577,296\n5577,1381\n5577,1579\n5577,14550\n5578,298\n5578,467\n5578,631\n5578,784\n5578,872\n5578,1010\n5578,1085\n5578,1119\n5578,1133\n5578,1179\n5578,1462\n5578,1844\n5578,3623\n5578,8537\n5578,185877\n5580,344\n5580,710\n5580,1711\n5580,1836\n5581,2681\n5581,31977\n5582,1977\n5582,1978\n5583,184\n5583,259\n5583,784\n5584,440\n5584,622\n5584,794\n5585,298\n5586,485\n5587,795\n5587,875\n5587,1117\n5587,1122\n5588,264\n5588,292\n5588,647\n5588,872\n5588,1579\n5588,1659\n5589,3804\n5590,1381\n5591,241\n5591,278\n5591,283\n5591,313\n5591,356\n5591,379\n5591,385\n5591,455\n5591,668\n5591,685\n5591,852\n5591,1026\n5591,1816\n5591,1843\n5591,2159\n5591,2784\n5591,2944\n5591,3686\n5591,4637\n5591,5591\n5591,6552\n5591,8097\n5591,13389\n5591,13638\n5591,15368\n5591,15404\n5591,15410\n5591,15532\n5591,15611\n5591,15615\n5591,15623\n5591,21429\n5591,21507\n5591,22246\n5591,22402\n5591,23481\n5591,24583\n5591,28522\n5591,29793\n5591,30450\n5591,30481\n5591,31708\n5591,33338\n5591,34013\n5591,38933\n5591,41437\n5591,42990\n5591,44896\n5591,44935\n5591,47048\n5591,48397\n5591,55716\n5591,60539\n5591,62394\n5591,64636\n5591,65931\n5591,70738\n5591,76795\n5591,76799\n5591,77559\n5591,80126\n5591,86696\n5591,87328\n5591,92883\n5591,97147\n5591,98947\n5591,106309\n5591,107966\n5591,109479\n5591,109893\n5591,109896\n5591,122715\n5591,125622\n5591,126942\n5591,128815\n5591,134629\n5591,134637\n5591,145512\n5591,145566\n5591,147954\n5591,148047\n5591,148055\n5591,148252\n5591,150735\n5591,152073\n5591,161519\n5591,169371\n5591,169417\n5591,169989\n5591,172234\n5591,172254\n5591,173750\n5591,173836\n5591,174747\n5591,176007\n5591,176061\n5591,177366\n5591,178675\n5591,189787\n5591,192954\n5591,193053\n5591,194476\n5591,194572\n5591,195131\n5591,195225\n5591,212388\n5591,220317\n5591,223994\n5591,224778\n5591,231104\n5591,232641\n5591,243439\n5591,244747\n5591,245314\n5591,245952\n5591,253178\n5591,255065\n5592,1\n5592,147\n5592,158\n5592,206\n5592,406\n5592,779\n5592,1458\n5592,2244\n5592,118336\n5593,390\n5594,1805\n5595,736\n5596,1433\n5596,1844\n5596,3744\n5597,4101\n5598,1381\n5599,433\n5600,527\n5601,406\n5601,620\n5601,1425\n5601,1515\n5601,1849\n5601,92476\n5601,141912\n5602,332\n5603,5101\n5604,30\n5604,278\n5604,392\n5604,433\n5604,440\n5604,510\n5604,622\n5604,697\n5604,794\n5604,809\n5604,1033\n5604,1453\n5604,1805\n5604,1860\n5604,3247\n5604,4039\n5604,141912\n5605,48\n5606,577\n5607,1849\n5607,32784\n5608,1722\n5609,298\n5610,485\n5611,934\n5612,272\n5613,1893\n5614,525\n5614,1749\n5615,4455\n5616,309\n5616,310\n5616,483\n5616,1836\n5616,232766\n5618,273\n5618,274\n5618,4611\n5619,34\n5619,35\n5620,644\n5620,3003\n5621,779\n5621,1181\n5623,206\n5623,467\n5623,518\n5623,868\n5623,1326\n5623,1849\n5623,156379\n5624,623\n5624,919\n5624,1805\n5625,301\n5625,467\n5625,1118\n5625,1433\n5625,1837\n5625,33611\n5626,592\n5626,1818\n5627,28\n5627,994\n5627,2674\n5627,16153\n5627,21944\n5628,298\n5629,485\n5630,491\n5630,1985\n5631,269\n5631,440\n5631,1417\n5631,1796\n5632,19\n5632,808\n5633,1634\n5634,364\n5634,1227\n5634,1229\n5634,2089\n5634,2940\n5634,21944\n5634,86416\n5635,1227\n5635,1229\n5635,21944\n5635,86416\n5636,861\n5637,209\n5637,302\n5637,579\n5637,861\n5637,2116\n5637,3769\n5638,740\n5638,741\n5639,4411\n5640,2083\n5641,1566\n5642,503\n5643,835\n5643,1381\n5644,397\n5644,2784\n5645,72\n5645,81\n5645,111\n5645,158\n5645,215\n5645,227\n5645,233\n5645,312\n5645,349\n5645,372\n5645,388\n5645,557\n5645,605\n5645,626\n5645,718\n5645,1001\n5645,1085\n5645,1140\n5645,1149\n5645,1179\n5645,1238\n5645,1467\n5645,1479\n5645,1544\n5645,1572\n5645,2209\n5645,2266\n5645,2779\n5645,3538\n5645,3695\n5645,4455\n5645,8798\n5645,9018\n5645,14797\n5645,28130\n5645,33611\n5646,104\n5646,217\n5646,240\n5646,372\n5646,433\n5646,589\n5646,918\n5646,1118\n5646,1210\n5646,1274\n5646,1411\n5646,1417\n5646,1796\n5646,3804\n5646,5547\n5646,13538\n5648,77\n5648,269\n5649,1181\n5650,743\n5651,30331\n5652,292\n5652,366\n5652,500\n5652,972\n5652,4101\n5653,726\n5654,167\n5654,217\n5654,240\n5654,435\n5654,818\n5654,1085\n5654,1298\n5654,1381\n5654,2557\n5654,2812\n5654,127158\n5654,156379\n5655,835\n5656,240\n5656,8276\n5657,736\n5657,1019\n5657,3507\n5659,919\n5659,1612\n5660,779\n5660,1515\n5660,4193\n5661,424\n5662,46\n5662,301\n5662,314\n5662,522\n5662,599\n5662,604\n5662,615\n5662,663\n5662,720\n5662,937\n5662,968\n5662,973\n5662,982\n5662,1045\n5662,1117\n5662,1160\n5662,1167\n5662,1231\n5662,1241\n5662,1284\n5662,1293\n5662,1300\n5662,1436\n5662,1479\n5662,1544\n5662,1732\n5662,1782\n5662,1849\n5662,2085\n5662,2595\n5662,2689\n5662,2979\n5662,3207\n5662,3218\n5662,3422\n5662,3809\n5662,5662\n5662,7222\n5662,8684\n5662,13523\n5662,14028\n5662,15511\n5662,15588\n5662,17894\n5662,23088\n5662,25342\n5662,28902\n5662,29760\n5662,32784\n5662,34933\n5662,35046\n5662,36681\n5662,37381\n5662,39478\n5662,40513\n5662,42598\n5662,45853\n5662,46858\n5662,48187\n5662,49514\n5662,50874\n5662,54055\n5662,55152\n5662,63121\n5662,72726\n5662,101551\n5662,132692\n5662,136630\n5662,143406\n5662,152826\n5662,161859\n5662,227376\n5662,264092\n5663,1143\n5664,158\n5664,622\n5665,1688\n5666,10\n5666,147\n5666,175\n5666,336\n5666,2244\n5666,3148\n5666,4980\n5666,13919\n5667,326\n5667,874\n5667,5667\n5667,31474\n5667,87762\n5667,101551\n5667,105571\n5667,139950\n5668,143\n5669,278\n5670,22\n5670,1019\n5670,1454\n5670,21982\n5671,240\n5671,247\n5671,269\n5672,433\n5674,611\n5675,298\n5676,485\n5677,589\n5678,30\n5678,328\n5678,622\n5678,1033\n5678,141912\n5679,264\n5679,609\n5679,760\n5679,1147\n5679,1149\n5679,1631\n5679,14797\n5680,1143\n5681,366\n5681,4101\n5682,306\n5682,307\n5682,493\n5682,602\n5682,682\n5682,1220\n5682,1222\n5682,1512\n5682,30331\n5682,72439\n5683,1858\n5684,312\n5686,673\n5686,1130\n5686,2373\n5687,861\n5688,1370\n5689,1089\n5690,577\n5690,788\n5690,1429\n5691,586\n5692,718\n5692,893\n5693,431\n5693,805\n5693,1285\n5694,2105\n5695,1983\n5695,75912\n5696,516\n5696,920\n5697,801\n5697,3474\n5697,5547\n5698,5699\n5700,26\n5700,47\n5700,59\n5700,60\n5700,211\n5700,887\n5700,994\n5700,1235\n5700,1335\n5700,1432\n5700,1707\n5700,2089\n5700,2469\n5700,2674\n5700,2940\n5700,4748\n5700,9539\n5700,21944\n5702,28130\n5703,99\n5703,298\n5703,346\n5703,483\n5703,563\n5703,726\n5703,749\n5703,1146\n5703,1515\n5703,2105\n5703,2995\n5703,146280\n5704,2646\n5704,48505\n5705,1289\n5706,233\n5707,171\n5707,5708\n5709,1204\n5710,349\n5711,222\n5712,163\n5712,489\n5712,811\n5713,586\n5713,2674\n5715,137\n5716,364\n5717,248\n5717,467\n5717,1085\n5717,5718\n5717,156379\n5718,175\n5718,186\n5718,192\n5718,240\n5718,256\n5718,389\n5718,446\n5718,590\n5718,693\n5718,784\n5718,818\n5718,1011\n5718,1285\n5718,1359\n5718,1505\n5718,1564\n5718,1785\n5718,1818\n5718,2620\n5718,3028\n5718,4540\n5718,5278\n5718,5405\n5718,5717\n5718,7087\n5718,7915\n5718,8178\n5718,8205\n5718,8479\n5718,14139\n5718,14603\n5718,16514\n5718,28409\n5718,45857\n5718,46574\n5718,54551\n5718,63102\n5718,83158\n5718,143377\n5718,179119\n5718,195048\n5718,224095\n5718,233508\n5718,241742\n5719,202\n5719,203\n5720,818\n5721,660\n5721,891\n5721,19443\n5722,83\n5723,620\n5724,707\n5725,10\n5725,147\n5725,158\n5725,336\n5725,628\n5725,1001\n5725,3582\n5725,5726\n5725,28149\n5728,126\n5728,7757\n5729,63\n5729,158\n5729,192\n5729,202\n5729,406\n5729,493\n5730,3769\n5731,439\n5732,209\n5733,160\n5733,366\n5734,571\n5735,3003\n5736,1608\n5738,344\n5738,745\n5739,707\n5740,783\n5741,1449\n5742,149\n5743,344\n5744,298\n5745,485\n5746,264\n5746,1381\n5747,1298\n5747,1616\n5748,2089\n5748,2940\n5748,21944\n5749,408\n5750,195\n5751,4637\n5752,5753\n5754,302\n5754,861\n5755,447\n5756,626\n5757,726\n5758,283\n5758,455\n5758,1019\n5759,493\n5760,83\n5761,58\n5763,143\n5764,893\n5765,240\n5765,1285\n5765,1888\n5766,273\n5766,274\n5766,726\n5767,79\n5768,278\n5769,83\n5770,217\n5771,292\n5772,483\n5773,248\n5773,850\n5773,2596\n5774,298\n5775,485\n5776,647\n5776,1175\n5777,1118\n5778,417\n5779,3321\n5780,146\n5781,385\n5783,302\n5783,579\n5783,1556\n5784,79\n5785,713\n5786,1452\n5786,1639\n5787,1167\n5787,2979\n5788,615\n5788,852\n5789,1818\n5790,68\n5790,392\n5790,811\n5791,389\n5792,1732\n5793,1012\n5794,972\n5795,1105\n5796,338\n5798,493\n5799,209\n5799,968\n5800,875\n5800,23783\n5801,609\n5801,1807\n5801,1882\n5801,1888\n5801,6556\n5802,140\n5802,338\n5802,340\n5804,302\n5804,525\n5804,752\n5804,1082\n5804,1623\n5804,1849\n5804,2105\n5804,4355\n5805,338\n5806,79\n5806,1639\n5807,579\n5807,861\n5808,985\n5809,10\n5809,104\n5809,192\n5809,264\n5809,289\n5809,290\n5809,301\n5809,312\n5809,372\n5809,503\n5809,577\n5809,805\n5809,999\n5809,1010\n5809,1052\n5809,1181\n5809,1210\n5809,1293\n5809,1381\n5809,2674\n5809,8276\n5809,31977\n5809,94134\n5810,63\n5810,693\n5811,83\n5812,171\n5812,313\n5812,1181\n5813,1467\n5814,417\n5815,685\n5815,4411\n5815,30331\n5816,252\n5816,1220\n5816,1222\n5817,575\n5817,697\n5817,1769\n5817,3260\n5818,818\n5819,2156\n5822,99\n5822,682\n5822,72439\n5823,1639\n5824,1579\n5825,372\n5825,1082\n5825,1203\n5825,1955\n5825,3804\n5827,182\n5827,217\n5827,264\n5827,392\n5827,467\n5827,510\n5827,515\n5827,809\n5827,872\n5827,1052\n5827,1118\n5827,1147\n5827,1417\n5827,1551\n5827,1659\n5827,2496\n5828,328\n5828,390\n5828,1119\n5829,497\n5830,254\n5830,557\n5830,954\n5830,1939\n5830,10318\n5831,302\n5832,2156\n5833,182\n5833,397\n5833,599\n5833,604\n5833,626\n5833,1204\n5833,1844\n5833,2373\n5833,14182\n5834,192\n5834,5101\n5835,10\n5836,71\n5836,611\n5836,193129\n5837,462\n5837,577\n5837,634\n5837,1052\n5837,1707\n5838,200\n5839,1118\n5840,1133\n5841,697\n5844,1711\n5845,1287\n5846,509\n5846,510\n5846,723\n5846,1043\n5847,403\n5848,872\n5849,192\n5850,301\n5851,72\n5851,87\n5851,126\n5851,439\n5851,510\n5851,535\n5851,872\n5851,920\n5851,1118\n5851,1143\n5851,1298\n5851,1326\n5851,2006\n5851,75912\n5852,850\n5853,868\n5854,723\n5854,2748\n5855,843\n5856,1836\n5857,158\n5858,1260\n5859,313\n5860,3260\n5863,1127\n5864,147\n5864,192\n5864,671\n5864,1181\n5865,668\n5866,158\n5866,192\n5867,1227\n5867,1229\n5867,21944\n5867,86416\n5868,217\n5868,283\n5868,455\n5868,536\n5868,949\n5869,1014\n5869,1240\n5870,83\n5870,278\n5871,26\n5871,47\n5871,59\n5871,111\n5871,292\n5871,887\n5871,1432\n5871,2469\n5871,2674\n5871,2775\n5871,2867\n5871,2868\n5871,21944\n5871,22880\n5872,485\n5873,83\n5873,447\n5873,1274\n5873,5874\n5875,289\n5875,290\n5875,372\n5875,714\n5875,1012\n5875,1818\n5875,1955\n5875,2008\n5875,2296\n5875,2620\n5875,4218\n5875,94134\n5877,1659\n5878,907\n5878,932\n5879,2051\n5880,32\n5880,314\n5880,392\n5880,1240\n5880,1465\n5880,3260\n5880,76096\n5881,26\n5881,47\n5881,59\n5881,94\n5881,967\n5881,2469\n5881,5700\n5881,7222\n5881,20485\n5881,20486\n5881,25120\n5881,25796\n5881,27222\n5882,65\n5883,10\n5884,2006\n5885,5886\n5885,8928\n5885,54104\n5885,79491\n5887,222\n5887,313\n5888,1374\n5889,24\n5889,28\n5889,887\n5889,2674\n5889,3561\n5889,4079\n5889,4571\n5889,21944\n5890,184\n5891,5892\n5891,61846\n5891,89069\n5891,101854\n5891,108816\n5891,113478\n5891,123246\n5891,127480\n5891,155920\n5891,199626\n5893,433\n5894,406\n5894,1265\n5894,1266\n5894,2931\n5896,206\n5896,1096\n5897,647\n5898,344\n5899,5343\n5900,336\n5900,671\n5901,516\n5902,104\n5902,298\n5902,862\n5902,863\n5902,1085\n5902,1459\n5902,1462\n5902,1608\n5902,1655\n5902,4609\n5902,5903\n5902,6068\n5902,7790\n5902,8537\n5902,12886\n5902,14149\n5902,14969\n5902,19798\n5902,34726\n5902,41129\n5902,42581\n5902,44725\n5902,52488\n5902,65886\n5902,71161\n5902,75912\n5902,77122\n5902,96836\n5902,107205\n5902,118815\n5902,124881\n5902,135194\n5902,144079\n5902,159337\n5902,167576\n5902,171555\n5902,177029\n5902,178254\n5902,225584\n5903,862\n5904,406\n5905,1019\n5905,1467\n5905,2421\n5905,5906\n5907,5908\n5908,1619\n5908,5907\n5908,5908\n5908,20655\n5908,23085\n5908,23139\n5908,33006\n5908,34126\n5908,34301\n5908,34561\n5908,49746\n5908,52946\n5908,60849\n5908,65057\n5908,67368\n5908,69444\n5908,71292\n5908,81783\n5908,81785\n5908,124187\n5908,124416\n5908,124704\n5908,125101\n5908,126598\n5908,127470\n5908,128372\n5908,131026\n5908,168525\n5908,192419\n5908,194194\n5908,194201\n5908,205063\n5908,216644\n5908,218828\n5908,218831\n5908,218832\n5908,218833\n5908,218835\n5908,218836\n5908,218837\n5908,235058\n5908,240507\n5908,241155\n5908,242855\n5908,242856\n5908,243318\n5908,247094\n5908,249477\n5908,256777\n5908,257310\n5908,257562\n5908,257651\n5908,258041\n5908,261196\n5908,261786\n5909,852\n5910,5911\n5912,97\n5912,289\n5912,290\n5912,991\n5912,1085\n5912,1188\n5912,1287\n5912,1539\n5912,1659\n5912,2312\n5913,336\n5915,37\n5915,71\n5915,563\n5915,611\n5915,920\n5915,1235\n5915,1335\n5915,1449\n5916,147\n5916,422\n5916,1181\n5916,1458\n5916,8907\n5916,80266\n5917,392\n5917,697\n5918,143\n5918,2006\n5919,1033\n5920,852\n5920,3218\n5921,516\n5922,718\n5923,1010\n5924,2051\n5925,438\n5925,622\n5925,1776\n5926,509\n5927,579\n5927,893\n5928,406\n5929,143\n5930,298\n5931,485\n5932,389\n5932,455\n5932,657\n5932,660\n5932,891\n5932,1313\n5932,1363\n5932,1571\n5932,1756\n5932,1801\n5932,1881\n5932,2421\n5932,2646\n5932,2944\n5932,13980\n5932,28130\n5934,328\n5935,364\n5935,609\n5935,649\n5935,694\n5935,1082\n5935,1745\n5935,1807\n5935,2205\n5935,2572\n5935,2775\n5935,3115\n5935,3623\n5935,33424\n5936,3585\n5936,55849\n5937,326\n5937,1210\n5938,171\n5938,4691\n5938,5708\n5939,1634\n5940,1509\n5940,3041\n5941,151\n5943,417\n5944,65\n5944,156379\n5945,3744\n5946,1007\n5947,1882\n5948,72\n5948,83\n5948,119\n5948,134\n5948,278\n5948,285\n5948,347\n5948,364\n5948,372\n5948,389\n5948,417\n5948,442\n5948,455\n5948,525\n5948,626\n5948,805\n5948,907\n5948,972\n5948,1019\n5948,1085\n5948,1274\n5948,1298\n5948,1309\n5948,1363\n5948,1465\n5948,1467\n5948,1718\n5948,1756\n5948,1801\n5948,1881\n5948,2266\n5948,2286\n5948,2434\n5948,2553\n5948,2590\n5948,2646\n5948,2779\n5948,2784\n5948,4172\n5948,13575\n5949,1284\n5950,1227\n5950,1229\n5951,743\n5953,37\n5953,717\n5954,143\n5955,433\n5955,1634\n5956,4831\n5958,68\n5959,392\n5960,143\n5961,10\n5961,182\n5961,425\n5961,685\n5961,693\n5961,764\n5961,765\n5961,775\n5961,794\n5961,795\n5961,838\n5961,852\n5961,911\n5961,1001\n5961,1085\n5961,1326\n5961,1796\n5961,1973\n5961,3093\n5961,3094\n5961,3804\n5961,75912\n5961,118327\n5961,185874\n5962,346\n5963,167\n5964,1782\n5965,1241\n5966,1124\n5967,3193\n5968,5969\n5970,79\n5971,192\n5971,622\n5971,1392\n5972,147\n5972,158\n5973,515\n5974,302\n5974,2116\n5975,5976\n5976,5976\n5977,1181\n5978,1238\n5979,1983\n5980,160\n5981,147\n5981,158\n5981,1623\n5981,118336\n5982,788\n5983,973\n5984,143\n5985,86\n5986,5987\n5988,3207\n5989,615\n5990,1955\n5991,192\n5991,252\n5991,1512\n5991,1531\n5991,5992\n5992,63\n5992,202\n5992,203\n5992,251\n5992,252\n5992,275\n5992,493\n5992,516\n5992,682\n5992,784\n5992,1220\n5992,1222\n5992,1243\n5992,1512\n5992,1568\n5992,1702\n5992,1927\n5992,2646\n5992,2775\n5992,2944\n5992,5563\n5992,5991\n5992,5992\n5992,7241\n5992,7385\n5992,9717\n5992,13467\n5992,13636\n5992,14037\n5992,19590\n5992,19651\n5992,19854\n5992,20534\n5992,21435\n5992,22860\n5992,24875\n5992,26861\n5992,28354\n5992,34619\n5992,40708\n5992,41170\n5992,42572\n5992,48119\n5992,64582\n5992,66559\n5992,72439\n5992,87105\n5992,94169\n5992,127520\n5992,131756\n5992,163415\n5993,202\n5993,203\n5994,151\n5994,273\n5994,274\n5995,1151\n5995,1572\n5997,994\n5998,972\n5999,2750\n6002,516\n6003,1001\n6004,240\n6004,372\n6004,1082\n6004,1085\n6004,1580\n6004,1807\n6004,2812\n6004,4222\n6004,6068\n6004,75912\n6005,2944\n6006,247\n6007,392\n6008,2979\n6009,4355\n6010,389\n6011,135\n6011,143\n6011,1052\n6012,34\n6012,35\n6012,83\n6012,313\n6012,536\n6012,949\n6012,212914\n6013,392\n6013,809\n6013,1363\n6014,626\n6015,6016\n6015,17388\n6015,19438\n6015,53170\n6015,56109\n6015,84423\n6017,1001\n6017,1210\n6017,1522\n6017,5662\n6017,6068\n6018,515\n6019,50\n6020,1639\n6021,509\n6022,3115\n6023,104\n6023,137\n6023,254\n6023,503\n6023,557\n6023,596\n6023,1143\n6023,1282\n6023,1363\n6023,1939\n6023,4276\n6023,4355\n6023,5405\n6024,1564\n6025,1506\n6026,217\n6026,6027\n6026,227061\n6027,6026\n6027,6027\n6027,65538\n6027,102192\n6027,127090\n6027,137064\n6027,140464\n6027,159212\n6027,231388\n6028,267\n6029,589\n6030,907\n6031,1167\n6032,34\n6032,35\n6032,167\n6032,187\n6032,217\n6032,222\n6032,283\n6032,290\n6032,388\n6032,455\n6032,536\n6032,631\n6032,657\n6032,702\n6032,783\n6032,808\n6032,827\n6032,1019\n6032,1151\n6032,1210\n6032,1313\n6032,1417\n6032,1467\n6032,1559\n6032,1871\n6032,2224\n6032,2266\n6032,6424\n6032,6789\n6032,15523\n6032,48505\n6032,94134\n6033,298\n6034,485\n6035,605\n6036,147\n6036,6037\n6036,31977\n6036,52349\n6036,57787\n6036,103394\n6036,104815\n6036,106156\n6036,170773\n6036,188840\n6036,193488\n6036,196487\n6036,207943\n6038,417\n6038,1085\n6039,160\n6040,143\n6042,1240\n6042,76096\n6043,697\n6045,22\n6045,388\n6045,392\n6045,595\n6045,703\n6045,1392\n6045,1453\n6045,1949\n6045,3258\n6045,127158\n6046,6047\n6046,38088\n6046,53159\n6048,6049\n6050,6051\n6052,887\n6053,2607\n6054,26\n6054,59\n6054,865\n6054,1432\n6055,710\n6056,1785\n6057,3\n6057,261\n6057,390\n6057,536\n6057,702\n6057,873\n6057,874\n6057,1210\n6057,1544\n6057,2045\n6057,3182\n6058,158\n6058,1122\n6058,6059\n6058,18738\n6059,87\n6059,178\n6059,918\n6059,1240\n6059,1465\n6059,1805\n6059,1949\n6059,2646\n6059,3260\n6059,4760\n6059,6058\n6059,6059\n6059,7098\n6059,9756\n6059,21380\n6059,21404\n6059,31414\n6059,39445\n6059,48782\n6059,65771\n6059,69250\n6059,91880\n6059,112321\n6059,115713\n6059,135926\n6059,162599\n6059,173261\n6059,173279\n6059,173285\n6059,173921\n6059,174325\n6059,174471\n6059,174494\n6059,177355\n6059,177381\n6059,177429\n6059,177431\n6059,177433\n6059,177435\n6059,177436\n6059,177773\n6059,182734\n6059,186480\n6059,190272\n6059,207837\n6059,216773\n6059,220919\n6059,220923\n6059,221905\n6059,222192\n6059,234066\n6059,236492\n6059,238244\n6059,244633\n6059,258683\n6060,346\n6061,1\n6062,30\n6062,328\n6062,485\n6062,693\n6062,1238\n6063,87\n6063,872\n6063,1454\n6063,1556\n6064,34\n6064,35\n6064,536\n6064,2646\n6064,2784\n6064,4672\n6064,7698\n6064,18831\n6065,3138\n6066,406\n6066,779\n6066,1181\n6067,3447\n6068,298\n6068,372\n6068,417\n6068,425\n6068,534\n6068,589\n6068,596\n6068,685\n6068,693\n6068,694\n6068,782\n6068,852\n6068,862\n6068,911\n6068,1085\n6068,1133\n6068,1353\n6068,1544\n6068,1572\n6068,1580\n6068,2290\n6068,2296\n6068,2747\n6068,2995\n6068,6068\n6068,6552\n6068,6856\n6068,7819\n6068,9342\n6068,13161\n6068,13524\n6068,14597\n6068,16955\n6068,20747\n6068,22268\n6068,25272\n6068,26450\n6068,29093\n6068,29166\n6068,29985\n6068,30328\n6068,33338\n6068,34129\n6068,34830\n6068,38205\n6068,46843\n6068,49104\n6068,54948\n6068,57006\n6068,58503\n6068,61085\n6068,62453\n6068,62467\n6068,63582\n6068,63990\n6068,64021\n6068,64027\n6068,64173\n6068,64204\n6068,64213\n6068,73223\n6068,73248\n6068,74460\n6068,75912\n6068,81508\n6068,82688\n6068,83940\n6068,101683\n6068,118419\n6068,118953\n6068,132216\n6068,139329\n6068,142472\n6068,144906\n6068,171262\n6068,174341\n6068,175903\n6068,176971\n6068,177930\n6068,178576\n6068,180936\n6068,192029\n6068,192322\n6068,193078\n6068,195076\n6068,212692\n6068,214892\n6068,215450\n6068,220317\n6068,229897\n6068,238181\n6068,254944\n6068,259636\n6068,262945\n6069,1119\n6069,1282\n6069,4222\n6070,58\n6071,2373\n6072,2574\n6073,217\n6073,19443\n6074,346\n6075,252\n6075,318\n6075,516\n6075,1220\n6075,1222\n6075,41170\n6076,251\n6076,465\n6077,862\n6078,104\n6079,54\n6080,433\n6081,6082\n6083,83\n6084,1305\n6085,536\n6086,1877\n6087,46\n6087,58\n6087,534\n6088,1531\n6089,309\n6089,310\n6089,483\n6089,4548\n6090,1016\n6091,647\n6092,344\n6093,217\n6093,536\n6094,1058\n6095,1309\n6096,72\n6096,83\n6096,119\n6096,134\n6096,175\n6096,248\n6096,278\n6096,285\n6096,364\n6096,372\n6096,389\n6096,417\n6096,442\n6096,450\n6096,455\n6096,525\n6096,626\n6096,795\n6096,805\n6096,972\n6096,1085\n6096,1201\n6096,1274\n6096,1309\n6096,1363\n6096,1465\n6096,1718\n6096,1756\n6096,1801\n6096,2286\n6096,2553\n6096,2590\n6096,2646\n6096,2779\n6096,2784\n6096,28130\n6096,35486\n6096,141912\n6097,6098\n6099,6098\n6100,887\n6101,1116\n6102,772\n6103,160\n6104,6105\n6106,6105\n6107,318\n6107,516\n6107,1220\n6107,1222\n6107,41170\n6108,83\n6109,178\n6109,2677\n6109,2854\n6109,6109\n6109,6110\n6109,6111\n6109,6112\n6109,9379\n6109,17573\n6109,17628\n6109,17629\n6109,18012\n6109,18035\n6109,18855\n6109,18907\n6109,19132\n6109,19770\n6109,19810\n6109,19811\n6109,19812\n6109,20079\n6109,20138\n6109,21888\n6109,21889\n6109,32322\n6109,37879\n6109,37880\n6109,42144\n6109,43395\n6109,61023\n6109,65370\n6109,77246\n6109,86081\n6109,91551\n6109,113186\n6109,113190\n6109,113191\n6109,130547\n6109,144962\n6109,173140\n6109,189611\n6109,189612\n6109,257728\n6112,83\n6112,718\n6113,149\n6114,2854\n6114,6115\n6114,9379\n6114,17585\n6114,17586\n6114,17628\n6114,19770\n6114,23172\n6114,35706\n6114,37881\n6114,42145\n6114,43397\n6114,53819\n6116,577\n6117,333\n6118,6119\n6119,79\n6119,146\n6119,182\n6119,192\n6119,195\n6119,333\n6119,336\n6119,422\n6119,602\n6119,841\n6119,911\n6119,920\n6119,1014\n6119,1089\n6119,1181\n6119,1204\n6119,1464\n6119,1619\n6119,1796\n6119,1825\n6119,1888\n6119,2400\n6119,2903\n6119,3681\n6119,5495\n6119,6119\n6119,12263\n6119,13464\n6119,13687\n6119,14433\n6119,15296\n6119,15345\n6119,22616\n6119,24150\n6119,27772\n6119,29433\n6119,30331\n6119,37897\n6119,38446\n6119,39843\n6119,41796\n6119,42028\n6119,42324\n6119,45492\n6119,46917\n6119,59785\n6119,60576\n6119,88467\n6119,92476\n6119,96670\n6119,109945\n6119,113337\n6119,114589\n6119,115271\n6119,118492\n6119,130823\n6119,131248\n6119,134023\n6119,155034\n6119,155035\n6119,173910\n6119,173922\n6119,177757\n6119,188541\n6119,221202\n6119,221824\n6119,247197\n6119,247730\n6119,248742\n6119,250722\n6119,255719\n6119,258271\n6119,258280\n6121,83\n6122,649\n6123,86\n6124,1556\n6125,5662\n6126,143\n6126,1052\n6127,50\n6128,6129\n6130,294\n6130,332\n6130,417\n6130,525\n6130,631\n6130,805\n6130,1085\n6130,1140\n6130,1309\n6130,1749\n6130,1818\n6130,2286\n6130,2620\n6131,949\n6131,2784\n6132,527\n6133,1506\n6134,2506\n6135,346\n6136,4\n6136,5\n6136,48\n6136,104\n6136,140\n6136,298\n6136,557\n6136,588\n6136,590\n6136,784\n6136,805\n6136,991\n6136,1052\n6136,1078\n6136,1119\n6136,1179\n6136,1267\n6136,1381\n6136,1659\n6136,1962\n6136,2089\n6136,2205\n6136,2940\n6136,4237\n6136,21944\n6136,33424\n6136,49057\n6136,205488\n6137,586\n6137,1782\n6138,171\n6138,536\n6138,957\n6139,107\n6139,298\n6139,364\n6139,442\n6139,588\n6139,590\n6139,805\n6139,1085\n6140,1707\n6141,215\n6141,417\n6141,1119\n6141,1564\n6141,1955\n6141,9015\n6142,527\n6142,740\n6142,741\n6142,743\n6142,1983\n6143,158\n6144,2353\n6145,4810\n6146,784\n6147,298\n6148,485\n6149,1707\n6150,158\n6151,346\n6152,1707\n6152,2105\n6153,861\n6154,1388\n6155,2334\n6156,424\n6156,1801\n6156,19010\n6157,726\n6158,850\n6159,6160\n6161,143\n6162,663\n6162,664\n6163,346\n6164,298\n6165,647\n6165,1175\n6166,485\n6167,604\n6167,968\n6167,1231\n6167,1782\n6168,893\n6169,581\n6170,44\n6171,1257\n6172,1260\n6173,10\n6175,6176\n6175,197195\n6177,675\n6178,347\n6178,1359\n6181,557\n6182,557\n6183,143\n6185,1\n6185,408\n6185,1119\n6185,1127\n6185,1619\n6185,1707\n6186,563\n6187,481\n6188,2775\n6189,447\n6190,1572\n6191,305\n6192,184\n6193,2506\n6194,1298\n6195,2506\n6196,647\n6197,344\n6198,2506\n6199,83\n6199,2784\n6200,6201\n6202,2379\n6203,417\n6204,805\n6205,2379\n6206,1096\n6207,264\n6210,417\n6210,1274\n6211,160\n6211,710\n6211,835\n6211,1052\n6211,1893\n6212,1177\n6213,6214\n6215,146\n6216,1590\n6217,1001\n6218,147\n6219,1010\n6220,1522\n6221,143\n6222,206\n6222,89035\n6223,358\n6224,151\n6225,1181\n6226,4\n6226,5\n6226,527\n6226,740\n6226,741\n6226,743\n6226,95152\n6227,346\n6228,143\n6229,736\n6229,795\n6229,1140\n6230,1175\n6232,3585\n6233,72\n6234,595\n6234,752\n6234,874\n6234,1309\n6234,1749\n6234,6068\n6235,571\n6235,868\n6235,6236\n6235,6237\n6235,24389\n6235,51795\n6235,51796\n6235,59434\n6235,84903\n6235,84904\n6235,84915\n6235,95135\n6235,96888\n6235,114259\n6235,114260\n6235,114261\n6238,250\n6239,337\n6239,115659\n6240,222\n6240,1571\n6241,72\n6242,97\n6243,1298\n6244,1118\n6245,811\n6246,3451\n6246,3452\n6247,1\n6247,11\n6247,20\n6247,30\n6247,34\n6247,35\n6247,37\n6247,44\n6247,58\n6247,63\n6247,79\n6247,81\n6247,87\n6247,99\n6247,102\n6247,111\n6247,138\n6247,209\n6247,211\n6247,247\n6247,261\n6247,264\n6247,272\n6247,273\n6247,283\n6247,287\n6247,298\n6247,301\n6247,302\n6247,304\n6247,305\n6247,314\n6247,326\n6247,328\n6247,332\n6247,333\n6247,336\n6247,338\n6247,358\n6247,360\n6247,364\n6247,366\n6247,393\n6247,417\n6247,425\n6247,431\n6247,442\n6247,444\n6247,447\n6247,457\n6247,462\n6247,473\n6247,481\n6247,491\n6247,497\n6247,505\n6247,579\n6247,595\n6247,602\n6247,615\n6247,649\n6247,663\n6247,671\n6247,673\n6247,682\n6247,685\n6247,697\n6247,703\n6247,704\n6247,713\n6247,717\n6247,718\n6247,736\n6247,745\n6247,760\n6247,770\n6247,775\n6247,779\n6247,784\n6247,868\n6247,873\n6247,875\n6247,893\n6247,900\n6247,918\n6247,919\n6247,920\n6247,941\n6247,968\n6247,973\n6247,994\n6247,1001\n6247,1007\n6247,1011\n6247,1033\n6247,1058\n6247,1068\n6247,1070\n6247,1085\n6247,1118\n6247,1122\n6247,1130\n6247,1132\n6247,1135\n6247,1143\n6247,1146\n6247,1151\n6247,1160\n6247,1177\n6247,1231\n6247,1267\n6247,1282\n6247,1289\n6247,1293\n6247,1300\n6247,1345\n6247,1353\n6247,1368\n6247,1381\n6247,1402\n6247,1417\n6247,1419\n6247,1425\n6247,1434\n6247,1452\n6247,1453\n6247,1458\n6247,1467\n6247,1509\n6247,1551\n6247,1559\n6247,1663\n6247,1732\n6247,1749\n6247,1782\n6247,1805\n6247,1818\n6247,1836\n6247,1837\n6247,1881\n6247,1888\n6247,1968\n6247,1983\n6247,2006\n6247,2045\n6247,2135\n6247,2205\n6247,2224\n6247,2253\n6247,2296\n6247,2784\n6247,2979\n6247,3193\n6247,3422\n6247,3724\n6247,3756\n6247,3999\n6247,4146\n6247,4165\n6247,4222\n6247,4355\n6247,4411\n6247,4571\n6247,4760\n6247,4771\n6247,5192\n6247,5213\n6247,5375\n6247,5540\n6247,7760\n6247,8055\n6247,8541\n6247,16683\n6247,19519\n6247,21944\n6247,21982\n6247,26041\n6247,26450\n6247,33424\n6247,44725\n6247,72439\n6247,129534\n6247,142433\n6247,221828\n6248,79\n6248,136\n6248,192\n6248,202\n6248,203\n6248,217\n6248,254\n6248,333\n6248,1181\n6248,6249\n6250,525\n6251,6252\n6253,852\n6254,143\n6255,6256\n6257,6258\n6259,309\n6259,310\n6260,2590\n6261,577\n6261,1010\n6262,1177\n6262,6263\n6264,6265\n6264,115917\n6266,493\n6266,586\n6266,1265\n6266,1266\n6266,1370\n6267,1433\n6268,147\n6268,336\n6268,406\n6268,435\n6268,1294\n6268,1370\n6269,717\n6270,72\n6271,6272\n6273,6274\n6275,332\n6276,6274\n6277,360\n6277,115659\n6277,142409\n6277,146280\n6278,6279\n6280,743\n6281,6282\n6283,579\n6284,328\n6285,6285\n6286,577\n6287,1871\n6287,2421\n6288,6289\n6290,379\n6291,3161\n6292,211\n6292,1305\n6293,1300\n6293,1506\n6294,485\n6295,240\n6296,1579\n6297,178\n6297,222\n6297,1289\n6297,2178\n6297,2671\n6297,4545\n6297,6298\n6299,843\n6300,644\n6301,77\n6302,6303\n6304,417\n6305,72\n6306,515\n6307,2867\n6307,2868\n6307,22880\n6308,248\n6308,296\n6308,647\n6308,1332\n6308,1893\n6308,1939\n6308,3507\n6308,4294\n6308,7155\n6309,267\n6310,195\n6311,920\n6311,1619\n6311,1623\n6313,13\n6314,269\n6315,323\n6316,6317\n6318,649\n6319,160\n6320,1381\n6321,1888\n6322,175\n6322,2574\n6322,6323\n6324,135\n6325,63\n6325,493\n6326,932\n6327,832\n6328,346\n6329,4490\n6330,1370\n6331,1749\n6331,3585\n6332,294\n6333,1411\n6334,292\n6334,1580\n6335,859\n6335,6336\n6335,9284\n6335,9466\n6335,9601\n6335,9620\n6335,9789\n6335,14005\n6335,14008\n6335,15824\n6335,22607\n6335,35347\n6335,109736\n6335,110939\n6335,123494\n6335,123551\n6335,151662\n6335,153668\n6335,206931\n6335,221533\n6335,226148\n6337,503\n6337,631\n6337,1085\n6337,1818\n6337,2205\n6337,2206\n6338,46\n6339,171\n6340,6341\n6340,38671\n6342,417\n6343,1515\n6345,77\n6346,1515\n6347,406\n6348,3769\n6349,6350\n6351,586\n6352,602\n6353,187\n6354,424\n6355,417\n6356,6357\n6358,20\n6359,299\n6360,1345\n6361,22\n6362,146\n6363,852\n6364,1644\n6365,360\n6365,1289\n6366,6367\n6368,6369\n6370,1289\n6371,233\n6372,130\n6373,336\n6373,850\n6373,1240\n6373,1363\n6373,1836\n6373,138686\n6374,366\n6375,366\n6376,366\n6377,366\n6378,366\n6379,366\n6380,1247\n6381,577\n6381,193578\n6382,330\n6383,130\n6384,340\n6385,2681\n6386,6387\n6387,3079\n6387,7117\n6387,15527\n6387,37724\n6387,57710\n6387,74404\n6387,81502\n6387,130068\n6387,136275\n6387,164521\n6387,164536\n6387,189960\n6388,313\n6389,6390\n6391,838\n6392,1414\n6393,259\n6393,336\n6394,273\n6394,274\n6394,360\n6394,589\n6394,710\n6394,1118\n6394,1363\n6394,1673\n6394,66754\n6395,399\n6396,518\n6397,887\n6398,37\n6398,107\n6398,301\n6398,444\n6398,525\n6398,604\n6398,615\n6398,717\n6398,973\n6398,1124\n6398,1160\n6398,1231\n6398,1293\n6398,1300\n6398,1782\n6398,1837\n6398,3422\n6398,5358\n6398,14352\n6399,313\n6400,518\n6400,1113\n6400,1326\n6401,1146\n6402,275\n6402,1265\n6402,1266\n6403,473\n6404,4748\n6405,1566\n6406,347\n6406,358\n6407,1043\n6407,1556\n6408,875\n6409,1509\n6410,58\n6411,46\n6411,58\n6412,1639\n6413,1579\n6414,467\n6415,2436\n6415,5547\n6416,160\n6416,360\n6416,515\n6416,1052\n6417,1515\n6418,929\n6419,19\n6420,3769\n6421,392\n6421,3003\n6422,10\n6422,178\n6422,346\n6422,435\n6422,440\n6422,538\n6422,671\n6422,693\n6422,794\n6423,1262\n6424,3\n6424,446\n6424,707\n6424,911\n6424,1696\n6424,1792\n6424,1801\n6424,2092\n6424,2689\n6424,3182\n6424,3258\n6424,3285\n6424,4903\n6424,5178\n6424,6032\n6424,6424\n6424,6652\n6424,8254\n6424,13136\n6424,13245\n6424,13301\n6424,14061\n6424,14098\n6424,14425\n6424,15303\n6424,15711\n6424,21665\n6424,23311\n6424,23328\n6424,25395\n6424,25826\n6424,26219\n6424,26229\n6424,28107\n6424,28193\n6424,28384\n6424,28387\n6424,29569\n6424,31080\n6424,31106\n6424,32462\n6424,34509\n6424,37710\n6424,38711\n6424,38794\n6424,39570\n6424,44127\n6424,48505\n6424,49003\n6424,67867\n6424,72530\n6424,80519\n6424,93636\n6424,95455\n6424,99000\n6424,99791\n6424,99851\n6424,103275\n6424,109955\n6424,121381\n6424,127148\n6424,127741\n6424,130719\n6424,140308\n6424,141656\n6424,152006\n6424,152100\n6424,156295\n6424,163360\n6424,169053\n6424,173825\n6424,174421\n6424,176040\n6424,183356\n6424,185399\n6424,185940\n6424,188767\n6424,189266\n6424,192957\n6424,211711\n6424,211796\n6424,220281\n6424,221117\n6424,226114\n6424,234011\n6424,246800\n6424,247066\n6424,247089\n6424,258215\n6424,260187\n6424,264516\n6425,450\n6426,336\n6427,972\n6427,1014\n6427,1590\n6428,640\n6429,604\n6430,388\n6430,452\n6430,623\n6430,697\n6430,919\n6430,1801\n6430,1805\n6430,4252\n6430,4760\n6431,301\n6431,1782\n6433,596\n6434,46\n6434,58\n6434,994\n6435,338\n6436,720\n6437,79\n6437,217\n6437,222\n6437,261\n6437,872\n6437,1118\n6437,1796\n6437,3089\n6438,79\n6439,575\n6439,697\n6440,447\n6441,798\n6442,195\n6443,160\n6444,289\n6444,290\n6445,104\n6445,134\n6445,2105\n6446,424\n6448,137\n6448,500\n6448,718\n6449,710\n6450,1243\n6451,130\n6453,346\n6454,788\n6455,557\n6455,2105\n6455,2782\n6456,287\n6456,595\n6456,809\n6456,1607\n6456,2116\n6457,106\n6457,1220\n6457,1222\n6457,1512\n6457,72439\n6458,1927\n6460,1782\n6461,3653\n6462,994\n6463,644\n6464,202\n6464,203\n6465,1181\n6466,79\n6468,575\n6469,838\n6470,301\n6470,467\n6470,525\n6470,571\n6470,868\n6470,968\n6470,1293\n6470,1385\n6470,1782\n6470,3804\n6470,5130\n6471,450\n6472,1118\n6473,356\n6473,1531\n6474,158\n6474,390\n6474,534\n6474,589\n6474,623\n6474,973\n6474,1001\n6474,1465\n6474,1801\n6474,2083\n6474,18738\n6475,577\n6476,83\n6476,292\n6476,685\n6477,577\n6477,694\n6477,852\n6477,1105\n6477,1844\n6477,6837\n6478,306\n6478,307\n6479,344\n6479,1836\n6480,422\n6481,602\n6482,298\n6482,2995\n6483,893\n6484,422\n6485,422\n6486,4\n6486,5\n6486,206\n6486,483\n6486,731\n6486,994\n6486,1313\n6486,1432\n6486,1775\n6486,2089\n6486,2867\n6486,2868\n6486,2940\n6486,4611\n6486,6487\n6486,88820\n6488,195\n6489,422\n6490,10\n6491,422\n6492,79\n6492,192\n6492,1392\n6493,602\n6494,422\n6495,422\n6496,422\n6497,422\n6498,422\n6499,1235\n6499,1335\n6500,718\n6501,79\n6502,344\n6502,745\n6503,575\n6504,146\n6505,1414\n6506,19\n6506,135\n6506,222\n6506,313\n6506,389\n6506,477\n6506,634\n6506,660\n6506,1069\n6506,1539\n6506,1724\n6506,1871\n6506,1916\n6506,2159\n6506,2168\n6506,2290\n6506,2421\n6506,2424\n6506,2775\n6506,2944\n6506,4482\n6506,4799\n6506,5163\n6506,5326\n6506,6506\n6506,6507\n6506,6828\n6506,13240\n6506,16412\n6506,18345\n6506,19443\n6506,25670\n6506,26056\n6506,31881\n6506,32749\n6506,33392\n6506,33752\n6506,33995\n6506,34270\n6506,35732\n6506,38859\n6506,56584\n6506,57839\n6506,58820\n6506,62298\n6506,94975\n6506,102389\n6506,114004\n6506,119090\n6506,119290\n6506,125253\n6506,126600\n6506,131652\n6506,137983\n6506,139950\n6506,140432\n6506,156649\n6506,157113\n6506,167150\n6506,173709\n6506,190968\n6506,222362\n6506,258953\n6507,6506\n6507,13361\n6508,158\n6509,6510\n6511,163\n6511,302\n6511,489\n6511,579\n6511,811\n6512,1220\n6512,1222\n6513,252\n6514,251\n6515,160\n6516,1227\n6516,1229\n6517,1891\n6518,366\n6518,972\n6519,79\n6519,192\n6519,663\n6519,664\n6519,861\n6519,4455\n6520,298\n6521,485\n6522,1506\n6523,1204\n6524,1012\n6525,1796\n6526,182\n6527,907\n6527,932\n6528,143\n6529,206\n6530,557\n6531,1907\n6532,536\n6532,2828\n6532,4810\n6533,515\n6533,671\n6533,736\n6533,1509\n6533,1551\n6533,1849\n6533,3999\n6533,32784\n6534,298\n6535,485\n6536,392\n6536,1140\n6537,1955\n6538,1332\n6539,657\n6539,907\n6539,1363\n6539,13361\n6540,6541\n6542,1300\n6543,6544\n6545,186\n6546,620\n6546,1474\n6546,8244\n6548,875\n6549,920\n6549,1623\n6550,623\n6551,5440\n6552,187\n6552,304\n6552,390\n6552,415\n6552,567\n6552,589\n6552,615\n6552,623\n6552,685\n6552,762\n6552,849\n6552,873\n6552,874\n6552,918\n6552,1117\n6552,1146\n6552,1240\n6552,1284\n6552,1419\n6552,1858\n6552,2411\n6552,2590\n6552,3182\n6552,5130\n6552,5591\n6552,6059\n6552,6068\n6553,337\n6554,1149\n6555,6556\n6556,111\n6556,175\n6556,211\n6556,240\n6556,309\n6556,310\n6556,483\n6556,1085\n6556,1177\n6556,1882\n6556,2210\n6556,2782\n6556,3039\n6556,4237\n6556,6556\n6556,182162\n6556,193486\n6556,232766\n6557,147\n6557,158\n6557,602\n6557,620\n6557,8244\n6558,929\n6559,1241\n6560,1227\n6560,1229\n6561,79\n6561,202\n6561,203\n6561,252\n6562,240\n6563,309\n6563,310\n6563,6556\n6563,6627\n6564,996\n6565,273\n6565,274\n6566,441\n6567,509\n6567,1453\n6567,1836\n6568,356\n6568,510\n6568,843\n6568,2178\n6568,4545\n6568,6695\n6569,4\n6569,5\n6569,47\n6569,58\n6569,104\n6569,107\n6569,441\n6569,442\n6569,801\n6569,1140\n6569,1177\n6569,1449\n6569,2089\n6569,2205\n6569,2206\n6569,2334\n6569,2469\n6569,2940\n6569,3474\n6569,4771\n6569,21944\n6569,136072\n6570,417\n6571,620\n6571,8244\n6572,364\n6573,315\n6573,620\n6573,8244\n6574,760\n6575,422\n6577,620\n6578,292\n6578,433\n6578,3830\n6579,775\n6580,1227\n6580,1229\n6580,1252\n6580,1253\n6580,4823\n6580,21944\n6580,86416\n6581,392\n6581,441\n6581,1146\n6581,1151\n6581,1653\n6581,1677\n6581,1949\n6581,2201\n6581,2436\n6581,3830\n6583,366\n6583,500\n6583,2607\n6583,4101\n6584,340\n6585,217\n6585,337\n6585,392\n6586,435\n6586,493\n6586,538\n6586,1590\n6586,1877\n6587,1326\n6588,163\n6588,489\n6588,516\n6588,668\n6588,1243\n6589,707\n6590,10\n6590,97\n6590,5933\n6591,1117\n6592,2312\n6593,907\n6593,932\n6594,1058\n6597,393\n6598,392\n6599,1019\n6600,489\n6601,720\n6602,66\n6602,240\n6602,467\n6602,868\n6602,1433\n6603,48\n6604,929\n6605,313\n6605,920\n6605,1285\n6606,58\n6607,346\n6607,435\n6607,457\n6607,1068\n6607,1913\n6607,6654\n6608,611\n6609,393\n6610,119\n6611,3252\n6612,37\n6613,583\n6614,366\n6614,500\n6615,1323\n6616,102\n6617,1326\n6618,408\n6619,602\n6620,25\n6620,26\n6620,59\n6620,117\n6620,887\n6620,1432\n6620,2088\n6620,6621\n6620,17140\n6620,21944\n6620,54870\n6620,154690\n6621,5\n6621,26\n6621,59\n6621,114\n6621,117\n6621,231\n6621,885\n6621,994\n6621,1238\n6621,1432\n6621,1722\n6621,2674\n6621,4571\n6621,6621\n6621,16153\n6621,21944\n6621,45140\n6621,54870\n6621,88820\n6622,163\n6622,538\n6622,1877\n6622,21442\n6623,1955\n6623,2526\n6624,1096\n6625,192\n6625,663\n6625,664\n6626,32\n6626,392\n6626,644\n6626,918\n6626,2274\n6626,3003\n6627,310\n6628,397\n6629,390\n6630,657\n6630,5405\n6631,835\n6631,4039\n6632,287\n6632,314\n6632,433\n6633,868\n6635,147\n6635,158\n6636,50\n6636,79\n6636,393\n6636,406\n6636,493\n6636,585\n6636,586\n6636,592\n6636,704\n6636,1265\n6636,1266\n6636,1433\n6637,211\n6637,538\n6637,1252\n6637,1253\n6637,1479\n6638,388\n6638,518\n6638,685\n6638,1113\n6638,1345\n6638,1584\n6638,3193\n6638,5052\n6638,6045\n6638,6641\n6638,15303\n6638,18097\n6638,22245\n6638,23349\n6638,29102\n6638,30996\n6638,31035\n6638,31080\n6638,37771\n6638,38861\n6638,48505\n6638,78829\n6638,81019\n6638,87871\n6638,104556\n6638,112513\n6638,124718\n6638,127154\n6638,136969\n6639,6640\n6639,13968\n6639,30206\n6639,37188\n6639,37939\n6639,47361\n6639,54116\n6639,55378\n6639,63775\n6639,64163\n6639,66950\n6639,70180\n6639,76020\n6639,76294\n6639,77385\n6639,77592\n6639,78995\n6639,81858\n6639,83089\n6639,83931\n6639,91878\n6639,92531\n6639,93425\n6639,100357\n6639,104180\n6639,104812\n6639,105209\n6639,105272\n6639,105287\n6639,105817\n6639,106500\n6639,108490\n6639,110413\n6639,111721\n6639,111732\n6639,111825\n6639,112942\n6639,113706\n6639,114200\n6639,114329\n6639,168738\n6641,388\n6641,457\n6641,2045\n6641,6638\n6641,48505\n6642,497\n6642,2266\n6643,592\n6644,622\n6645,393\n6646,30\n6646,328\n6646,809\n6646,1014\n6646,1179\n6646,1429\n6646,1462\n6646,3769\n6646,8537\n6646,68069\n6646,138686\n6646,141912\n6647,195\n6647,609\n6647,204124\n6648,439\n6648,447\n6648,538\n6648,1033\n6648,1294\n6649,34\n6649,35\n6650,762\n6650,1241\n6650,1479\n6650,1522\n6651,1818\n6652,1801\n6653,209\n6653,299\n6653,6654\n6655,6303\n6656,932\n6656,1016\n6657,52\n6657,196\n6657,9598\n6657,140269\n6657,206059\n6658,939\n6658,2138\n6658,4646\n6658,5078\n6658,5460\n6658,5461\n6658,6422\n6658,6586\n6658,6607\n6658,6659\n6658,6883\n6658,17423\n6658,18124\n6658,20539\n6658,21152\n6658,25384\n6658,28425\n6658,32745\n6658,34935\n6658,37000\n6658,38420\n6658,44348\n6658,52792\n6658,62984\n6658,83947\n6658,113469\n6658,133112\n6658,135992\n6658,135993\n6658,135994\n6658,135995\n6658,135996\n6658,135997\n6658,135998\n6658,135999\n6658,136000\n6658,136001\n6658,136002\n6658,136003\n6658,136004\n6658,136005\n6658,136006\n6658,136007\n6658,136008\n6658,136009\n6658,136010\n6660,20\n6660,178\n6660,315\n6660,346\n6660,435\n6660,439\n6660,447\n6660,538\n6660,671\n6660,934\n6660,996\n6660,1033\n6660,1068\n6660,1294\n6660,1474\n6660,1590\n6660,1612\n6660,1644\n6660,1789\n6660,1877\n6660,2353\n6660,6661\n6660,15179\n6660,31977\n6660,38158\n6660,189128\n6660,190492\n6661,20\n6661,178\n6661,435\n6661,439\n6661,447\n6661,766\n6661,996\n6661,1033\n6661,1294\n6661,1474\n6661,1590\n6661,1644\n6661,1877\n6661,2138\n6661,2352\n6661,6661\n6661,6966\n6661,13636\n6661,14355\n6661,15141\n6661,15355\n6661,16637\n6661,19191\n6661,26027\n6661,37315\n6661,41378\n6661,48379\n6661,48387\n6661,49931\n6661,56385\n6661,62195\n6661,70832\n6661,73508\n6661,88367\n6661,93673\n6661,114068\n6661,120155\n6661,138647\n6661,161476\n6661,168462\n6661,185905\n6661,219675\n6661,219811\n6661,232757\n6661,241492\n6661,241495\n6661,241513\n6661,241516\n6661,243242\n6661,243247\n6661,243248\n6661,243249\n6661,243906\n6661,245953\n6661,260727\n6661,261475\n6661,262339\n6662,766\n6662,1651\n6662,2030\n6662,2102\n6662,2352\n6662,14111\n6662,14428\n6662,15141\n6662,15355\n6662,19191\n6662,32468\n6662,41804\n6662,54295\n6662,135980\n6662,180938\n6663,146\n6663,996\n6664,79\n6664,192\n6664,622\n6664,1392\n6664,1462\n6664,8537\n6665,283\n6665,1871\n6665,2421\n6665,6068\n6668,134\n6668,6726\n6671,192\n6671,663\n6671,664\n6672,346\n6672,435\n6672,1782\n6672,6303\n6673,356\n6675,720\n6676,356\n6676,852\n6677,694\n6677,749\n6677,999\n6678,140\n6678,264\n6678,515\n6678,835\n6678,1551\n6679,579\n6679,1227\n6679,1229\n6679,1252\n6679,1253\n6679,21944\n6679,86416\n6680,385\n6681,6682\n6682,36038\n6682,39291\n6682,76260\n6682,76261\n6682,76262\n6682,76265\n6682,76266\n6682,76267\n6682,76268\n6682,76269\n6682,76270\n6682,76271\n6682,76272\n6682,76273\n6682,76274\n6682,76275\n6682,76278\n6682,76279\n6682,76280\n6682,76281\n6682,77218\n6682,77917\n6682,98044\n6683,130\n6684,79\n6684,147\n6684,192\n6684,202\n6684,203\n6684,602\n6684,663\n6684,1149\n6684,1392\n6684,118336\n6685,1087\n6685,1118\n6685,1345\n6685,1566\n6685,1623\n6685,6695\n6685,162599\n6686,41\n6687,3003\n6688,302\n6688,340\n6688,579\n6688,811\n6689,685\n6689,733\n6690,79\n6690,467\n6690,571\n6690,868\n6691,392\n6691,623\n6691,918\n6691,1805\n6691,1858\n6691,4903\n6693,250\n6693,887\n6693,1684\n6694,515\n6695,185\n6695,186\n6695,248\n6695,397\n6695,457\n6695,535\n6695,733\n6695,802\n6695,872\n6695,913\n6695,992\n6695,1085\n6695,1298\n6695,1417\n6695,1566\n6695,1659\n6695,1749\n6695,1796\n6695,1893\n6695,2224\n6695,2253\n6695,2312\n6695,2438\n6695,3507\n6695,3582\n6695,4066\n6695,4381\n6695,6568\n6695,6685\n6695,6837\n6695,8013\n6695,8157\n6695,13207\n6695,14080\n6695,30728\n6695,34820\n6695,46354\n6695,50285\n6695,62798\n6695,70811\n6695,79306\n6695,86454\n6695,86462\n6695,86599\n6695,93711\n6695,93714\n6695,93752\n6695,94334\n6695,94842\n6695,161665\n6695,164403\n6695,179141\n6695,187318\n6695,214657\n6695,214937\n6695,215982\n6695,219984\n6695,230379\n6695,234738\n6695,247258\n6695,249689\n6695,251361\n6695,259719\n6695,260385\n6695,260943\n6695,261890\n6695,263111\n6696,3507\n6697,58\n6698,1849\n6698,32784\n6699,163\n6699,579\n6699,1556\n6700,1556\n6701,273\n6701,274\n6703,2353\n6704,392\n6705,83\n6706,66\n6707,302\n6707,579\n6708,158\n6708,23783\n6709,644\n6710,167\n6711,217\n6711,301\n6711,328\n6711,457\n6711,795\n6711,1012\n6711,1118\n6711,1181\n6711,1300\n6711,1370\n6711,1417\n6711,1949\n6711,2006\n6711,2334\n6711,3804\n6712,167\n6712,968\n6712,1231\n6712,1544\n6712,1849\n6712,2083\n6713,634\n6714,609\n6715,81\n6715,1745\n6716,302\n6716,1556\n6716,2116\n6717,538\n6717,980\n6718,425\n6718,1276\n6719,22\n6719,65\n6719,120\n6719,285\n6719,438\n6719,599\n6719,602\n6719,660\n6719,795\n6719,818\n6719,1122\n6719,1454\n6719,1803\n6719,1849\n6719,2274\n6719,2646\n6719,2699\n6719,32784\n6720,250\n6720,1684\n6721,647\n6722,344\n6723,704\n6724,97\n6725,32\n6725,54\n6725,72\n6725,83\n6725,99\n6725,202\n6725,203\n6725,349\n6725,406\n6725,422\n6725,435\n6725,623\n6725,649\n6725,749\n6725,781\n6725,801\n6725,1285\n6725,1309\n6725,1353\n6725,1415\n6725,1452\n6725,1474\n6725,1634\n6725,1805\n6725,1949\n6725,2421\n6725,3585\n6725,6424\n6725,6506\n6725,162599\n6726,6726\n6727,58\n6728,827\n6729,26\n6729,59\n6729,887\n6729,1235\n6729,1335\n6729,21944\n6730,2557\n6731,143\n6731,1052\n6733,34\n6733,35\n6733,313\n6733,347\n6734,182\n6734,1639\n6734,2253\n6734,3258\n6734,8149\n6735,1238\n6736,10\n6736,206\n6736,336\n6736,164665\n6737,298\n6738,485\n6739,1871\n6740,137\n6741,119\n6741,2073\n6742,346\n6742,5405\n6743,195\n6744,1\n6745,312\n6746,861\n6747,535\n6747,1454\n6748,233\n6748,3507\n6749,6750\n6751,79\n6751,192\n6752,1844\n6753,760\n6753,1149\n6753,1631\n6754,34\n6754,35\n6754,186\n6754,278\n6754,1019\n6754,1871\n6754,23287\n6755,58\n6756,712\n6757,805\n6758,195\n6759,171\n6760,571\n6760,868\n6761,66\n6762,233\n6763,403\n6763,693\n6763,113878\n6764,313\n6765,538\n6766,206\n6766,438\n6766,1096\n6767,626\n6768,932\n6769,1639\n6770,48\n6770,130\n6770,328\n6770,1007\n6770,1132\n6770,1381\n6770,2051\n6770,2775\n6772,79\n6772,192\n6773,120\n6773,261\n6773,372\n6773,694\n6773,1419\n6774,868\n6775,344\n6775,827\n6775,2674\n6776,3804\n6777,2557\n6778,1231\n6778,47031\n6779,704\n6780,1479\n6781,392\n6781,644\n6781,1240\n6781,1836\n6781,127158\n6782,872\n6783,2528\n6784,640\n6785,2319\n6786,83\n6786,1001\n6786,3585\n6787,4895\n6788,222\n6788,283\n6788,455\n6788,2784\n6788,6789\n6788,7768\n6789,54\n6789,222\n6789,278\n6789,283\n6789,379\n6789,455\n6789,657\n6789,1019\n6789,1539\n6789,1756\n6789,2421\n6789,2424\n6789,3646\n6789,3993\n6789,6032\n6789,6788\n6789,6789\n6789,7768\n6789,13137\n6789,13276\n6789,16117\n6789,16847\n6789,19349\n6789,28169\n6789,34183\n6789,37088\n6789,38972\n6789,39561\n6789,46789\n6789,58403\n6789,59398\n6789,64108\n6789,64764\n6789,79966\n6789,89429\n6789,93226\n6789,93320\n6789,105808\n6789,117965\n6789,118692\n6789,127743\n6789,137142\n6789,137877\n6789,140055\n6790,97\n6790,217\n6790,1181\n6790,1417\n6790,6891\n6791,269\n6792,107\n6792,677\n6792,1119\n6792,1745\n6792,2205\n6792,2206\n6792,20813\n6792,33424\n6792,207079\n6792,255598\n6792,255766\n6794,392\n6797,79\n6798,3218\n6799,34\n6799,35\n6799,536\n6800,1564\n6800,2620\n6800,258887\n6801,126\n6801,1033\n6801,1590\n6802,143\n6802,440\n6802,1204\n6802,1433\n6802,1844\n6802,6803\n6802,17346\n6805,743\n6806,602\n6806,675\n6807,868\n6807,156379\n6808,1220\n6808,1222\n6809,252\n6810,251\n6811,97\n6811,403\n6811,3695\n6812,850\n6813,106\n6813,663\n6813,664\n6813,1425\n6813,59021\n6814,1014\n6815,344\n6816,252\n6816,516\n6816,1220\n6816,1222\n6818,104\n6818,577\n6818,623\n6818,893\n6818,1805\n6819,644\n6820,3\n6820,510\n6821,760\n6821,1785\n6822,1284\n6822,1309\n6822,115474\n6823,182\n6823,843\n6823,1663\n6823,6824\n6824,1\n6824,20\n6824,65\n6824,182\n6824,207\n6824,209\n6824,259\n6824,336\n6824,360\n6824,397\n6824,408\n6824,441\n6824,489\n6824,500\n6824,505\n6824,510\n6824,615\n6824,693\n6824,733\n6824,872\n6824,911\n6824,918\n6824,972\n6824,1135\n6824,1146\n6824,1147\n6824,1172\n6824,1192\n6824,1204\n6824,1235\n6824,1238\n6824,1285\n6824,1293\n6824,1402\n6824,1417\n6824,1445\n6824,1472\n6824,1559\n6824,1566\n6824,1634\n6824,1663\n6824,1858\n6824,1927\n6824,1992\n6824,2512\n6824,2607\n6824,2704\n6824,2812\n6824,3392\n6824,3524\n6824,3582\n6824,4039\n6824,4066\n6824,4165\n6824,4190\n6824,4276\n6824,5440\n6824,6824\n6824,6880\n6824,8419\n6824,14052\n6824,14945\n6824,22020\n6824,28348\n6824,28553\n6824,38972\n6824,75292\n6824,75912\n6824,77642\n6824,81233\n6824,88389\n6824,115474\n6824,120155\n6824,195539\n6824,204093\n6824,215276\n6825,417\n6826,248\n6826,1332\n6827,298\n6828,34\n6828,35\n6828,134\n6828,222\n6828,225\n6828,278\n6828,283\n6828,313\n6828,364\n6828,389\n6828,431\n6828,455\n6828,657\n6828,694\n6828,949\n6828,1019\n6828,1177\n6828,2210\n6828,2424\n6828,5343\n6828,6506\n6828,6888\n6829,485\n6830,10\n6830,113156\n6831,2224\n6833,1293\n6834,77\n6835,1579\n6836,1639\n6837,175\n6837,240\n6837,314\n6837,452\n6837,457\n6837,599\n6837,818\n6837,823\n6837,838\n6837,911\n6837,1118\n6837,1203\n6837,1466\n6837,1566\n6837,2410\n6837,3574\n6837,6695\n6837,6837\n6837,6935\n6837,16712\n6837,21458\n6837,27550\n6837,44846\n6837,45129\n6837,46258\n6837,47369\n6837,48006\n6837,66500\n6837,73517\n6837,75912\n6837,76048\n6837,77567\n6837,78902\n6837,94281\n6837,106140\n6837,127158\n6837,152828\n6837,152843\n6837,162593\n6837,168466\n6837,174306\n6837,254906\n6838,302\n6839,1284\n6841,6726\n6843,620\n6843,8244\n6844,3756\n6845,58\n6846,3079\n6847,356\n6848,6263\n6851,5874\n6852,372\n6852,1262\n6853,30\n6853,104\n6853,120\n6853,240\n6853,264\n6853,406\n6853,518\n6853,622\n6853,631\n6853,760\n6853,1181\n6853,1402\n6853,1531\n6853,1631\n6853,1785\n6853,2775\n6853,3247\n6854,209\n6854,579\n6855,634\n6856,47\n6856,68\n6856,104\n6856,120\n6856,240\n6856,261\n6856,264\n6856,289\n6856,290\n6856,332\n6856,372\n6856,431\n6856,631\n6856,694\n6856,760\n6856,1001\n6856,1119\n6856,1122\n6856,1309\n6856,1319\n6856,1462\n6856,1796\n6856,1818\n6856,1955\n6856,2205\n6856,2443\n6856,2469\n6856,3328\n6856,6068\n6856,6695\n6856,8537\n6856,33424\n6857,972\n6858,760\n6858,1149\n6858,1631\n6859,6860\n6859,14100\n6859,72548\n6859,99734\n6859,184744\n6859,214394\n6859,214396\n6859,251459\n6861,911\n6861,1603\n6861,6948\n6861,101635\n6862,104\n6862,254\n6862,503\n6862,557\n6862,953\n6862,954\n6862,1939\n6863,50\n6863,147\n6863,406\n6864,192\n6864,278\n6864,285\n6864,406\n6864,752\n6864,779\n6864,1515\n6864,3138\n6864,3585\n6864,8270\n6865,1858\n6866,1860\n6867,599\n6868,462\n6869,167\n6869,217\n6869,457\n6869,714\n6869,2253\n6869,4355\n6870,980\n6871,247\n6871,2867\n6871,2868\n6872,980\n6873,1711\n6873,1836\n6874,980\n6875,1140\n6876,72\n6876,106\n6877,259\n6878,312\n6878,1749\n6879,206\n6880,34\n6880,35\n6880,292\n6880,347\n6880,455\n6880,518\n6880,536\n6880,745\n6880,849\n6880,1241\n6880,1326\n6880,1332\n6880,1424\n6880,1688\n6880,1715\n6880,1722\n6880,2436\n6880,4039\n6880,7698\n6880,7768\n6880,20813\n6881,134\n6882,3\n6882,346\n6882,435\n6882,586\n6882,1294\n6882,6119\n6883,20\n6883,79\n6883,146\n6883,685\n6883,911\n6883,1085\n6883,1319\n6883,1465\n6883,2006\n6883,5961\n6883,92476\n6883,221828\n6884,2867\n6884,2868\n6884,22880\n6885,1707\n6886,1858\n6887,1860\n6889,5165\n6890,35\n6890,111\n6890,1019\n6890,1140\n6890,1240\n6890,1453\n6890,1454\n6890,1796\n6890,2266\n6891,207\n6891,256\n6891,326\n6891,1014\n6891,6790\n6891,6891\n6891,6927\n6891,7353\n6891,36306\n6891,243283\n6892,392\n6893,392\n6893,1860\n6895,233\n6895,269\n6896,1572\n6896,1634\n6896,1722\n6896,3538\n6897,2353\n6898,2334\n6899,192\n6899,406\n6899,1776\n6903,726\n6903,859\n6904,10\n6904,20\n6904,186\n6904,192\n6904,209\n6904,240\n6904,259\n6904,299\n6904,360\n6904,389\n6904,438\n6904,441\n6904,467\n6904,500\n6904,510\n6904,512\n6904,518\n6904,535\n6904,536\n6904,622\n6904,640\n6904,685\n6904,801\n6904,808\n6904,849\n6904,872\n6904,874\n6904,911\n6904,918\n6904,929\n6904,972\n6904,1014\n6904,1085\n6904,1118\n6904,1147\n6904,1267\n6904,1284\n6904,1326\n6904,1370\n6904,1436\n6904,1531\n6904,1566\n6904,1655\n6904,2605\n6904,3392\n6904,3507\n6904,3804\n6904,4276\n6904,4771\n6904,6904\n6904,75912\n6904,115474\n6904,237573\n6904,242246\n6905,861\n6906,893\n6907,644\n6907,2274\n6908,749\n6908,784\n6908,805\n6908,1119\n6908,1146\n6909,1837\n6911,1\n6911,22\n6911,32\n6911,41\n6911,58\n6911,77\n6911,106\n6911,207\n6911,233\n6911,248\n6911,259\n6911,272\n6911,273\n6911,283\n6911,292\n6911,298\n6911,302\n6911,328\n6911,340\n6911,358\n6911,408\n6911,431\n6911,444\n6911,473\n6911,489\n6911,575\n6911,586\n6911,595\n6911,599\n6911,602\n6911,634\n6911,660\n6911,675\n6911,690\n6911,714\n6911,850\n6911,859\n6911,973\n6911,980\n6911,1007\n6911,1132\n6911,1179\n6911,1224\n6911,1309\n6911,1419\n6911,1424\n6911,1571\n6911,1572\n6911,1579\n6911,1607\n6911,1608\n6911,1836\n6911,1860\n6911,2089\n6911,2411\n6911,2605\n6911,2940\n6911,3085\n6911,3830\n6911,4276\n6911,4903\n6911,5326\n6911,5540\n6911,6059\n6911,6119\n6911,6556\n6911,9457\n6911,138686\n6911,174849\n6911,190492\n6912,1590\n6913,34\n6913,35\n6913,217\n6913,222\n6913,1019\n6913,2266\n6914,1977\n6914,1978\n6915,298\n6916,485\n6917,72\n6918,192\n6918,19413\n6919,623\n6919,973\n6919,5034\n6920,302\n6921,467\n6921,868\n6922,227\n6922,55585\n6923,760\n6923,1149\n6923,1631\n6924,516\n6924,1243\n6925,571\n6925,868\n6926,58\n6926,605\n6926,726\n6926,1298\n6926,6556\n6926,21442\n6927,6891\n6929,299\n6929,673\n6931,781\n6932,577\n6933,1707\n6934,392\n6934,2989\n6934,2991\n6935,1118\n6935,6837\n6936,718\n6937,1068\n6938,301\n6938,717\n6938,1293\n6938,1782\n6940,536\n6941,473\n6943,1052\n6944,1769\n6944,5547\n6945,20\n6946,775\n6947,932\n6948,1603\n6948,2310\n6949,2224\n6950,178\n6950,2073\n6951,72\n6952,344\n6953,285\n6954,298\n6955,314\n6955,349\n6955,392\n6955,452\n6955,455\n6955,457\n6955,497\n6955,510\n6955,536\n6955,808\n6955,872\n6955,918\n6955,919\n6955,1151\n6955,1197\n6955,1860\n6955,2746\n6955,3636\n6955,4286\n6955,13316\n6955,18191\n6955,19823\n6955,20200\n6955,20346\n6955,21639\n6955,24592\n6955,31790\n6955,38300\n6955,45050\n6955,45740\n6955,61055\n6955,62932\n6955,65940\n6955,82148\n6955,93184\n6955,102695\n6955,118951\n6955,121148\n6955,121989\n6955,125644\n6955,127712\n6955,127787\n6955,130275\n6955,131216\n6955,134506\n6955,135270\n6955,135409\n6955,175367\n6955,220814\n6955,232112\n6955,232114\n6955,242189\n6956,97\n6957,1425\n6958,1204\n6959,192\n6959,202\n6959,622\n6959,1392\n6959,1745\n6960,34\n6960,35\n6960,222\n6960,455\n6960,657\n6960,949\n6960,1274\n6960,1417\n6960,2045\n6960,5343\n6960,33508\n6961,143\n6962,1\n6962,500\n6963,1149\n6964,868\n6965,1564\n6967,6968\n6969,149\n6969,417\n6969,1381\n6969,3999\n6970,1014\n6972,6803\n6974,861\n6975,20\n6976,81\n6976,274\n6976,920\n6976,2367\n6977,425\n6978,48\n6979,19\n6979,808\n6980,1659\n6981,54\n6981,119\n6981,126\n6981,137\n6981,248\n6981,273\n6981,390\n6981,431\n6981,441\n6981,515\n6981,581\n6981,604\n6981,713\n6981,733\n6981,772\n6981,784\n6981,862\n6981,1058\n6981,1087\n6981,1127\n6981,1172\n6981,1262\n6981,1293\n6981,1402\n6981,1479\n6981,1509\n6981,1571\n6981,1718\n6981,2083\n6981,2266\n6981,2923\n6981,2944\n6981,3653\n6981,4223\n6981,4411\n6981,5326\n6981,6682\n6981,6824\n6981,7698\n6981,213089\n6981,214131\n6981,215276\n6982,1033\n6983,3724\n6984,731\n6985,130\n6985,500\n6986,784\n6987,366\n6987,972\n6987,37414\n6988,718\n6989,2083\n6990,66\n6990,79\n6990,203\n6990,240\n6990,314\n6990,467\n6990,868\n6990,1235\n6990,1345\n6990,3804\n6990,81233\n6990,152855\n6990,156379\n6991,581\n6992,146\n6993,1639\n6994,1579\n6995,200\n6995,206\n6995,240\n6996,301\n6997,536\n6997,2784\n6997,7698\n6998,106\n6998,893\n6998,2668\n6998,3585\n6999,2373\n7001,781\n7002,7003\n7003,596\n7004,1608\n7005,79\n7006,146\n7006,779\n7006,92476\n7007,192\n7007,217\n7008,808\n7008,2646\n7008,32475\n7009,143\n7010,489\n7011,167\n7011,2083\n7012,620\n7013,752\n7014,6303\n7015,1579\n7016,1639\n7017,240\n7017,289\n7017,290\n7017,1085\n7017,1522\n7017,1715\n7017,94134\n7018,259\n7018,1433\n7018,1531\n7019,247\n7021,302\n7022,248\n7022,636\n7022,1262\n7022,1332\n7022,1572\n7022,1844\n7022,11147\n7023,305\n7023,3474\n7025,202\n7025,203\n7027,202\n7027,203\n7028,298\n7029,485\n7030,957\n7030,1815\n7031,604\n7032,1033\n7033,1688\n7034,676\n7035,1087\n7036,202\n7036,203\n7038,298\n7039,104\n7039,134\n7039,135\n7039,137\n7039,138\n7039,1368\n7039,2105\n7040,315\n7040,1033\n7040,1068\n7041,120\n7041,217\n7041,240\n7041,261\n7041,694\n7041,843\n7041,1353\n7041,1417\n7041,1466\n7042,485\n7043,1639\n7044,1579\n7045,1579\n7046,1639\n7047,1203\n7048,79\n7049,22\n7049,151\n7049,2017\n7050,509\n7050,510\n7050,872\n7050,150022\n7051,2116\n7052,202\n7052,203\n7052,130897\n7053,666\n7053,744\n7053,750\n7053,762\n7053,1124\n7053,1167\n7054,557\n7055,505\n7056,868\n7057,167\n7057,1241\n7057,2083\n7058,996\n7060,184\n7060,1612\n7061,1181\n7062,781\n7063,615\n7063,660\n7063,1634\n7063,2367\n7063,3623\n7064,202\n7064,203\n7064,251\n7065,392\n7066,340\n7066,6556\n7067,500\n7068,1140\n7068,5547\n7069,592\n7069,2205\n7069,2206\n7070,182\n7070,1204\n7071,1143\n7072,1181\n7072,2205\n7072,2206\n7072,33424\n7072,245910\n7073,1132\n7073,1452\n7073,1639\n7074,107\n7075,222\n7075,278\n7075,455\n7075,2266\n7075,2424\n7075,248493\n7075,256384\n7075,258055\n7076,240\n7076,309\n7076,310\n7076,718\n7076,875\n7076,1001\n7076,1014\n7076,1419\n7076,1531\n7076,1796\n7076,3039\n7076,3260\n7076,3370\n7078,366\n7078,500\n7079,30\n7079,1179\n7079,1305\n7079,7124\n7080,32\n7081,1282\n7081,1882\n7082,163\n7082,302\n7082,579\n7082,868\n7083,1531\n7084,865\n7084,994\n7084,1235\n7084,1335\n7084,1432\n7084,21944\n7085,1688\n7085,3538\n7086,240\n7086,301\n7087,1\n7087,4\n7087,5\n7087,32\n7087,34\n7087,35\n7087,48\n7087,72\n7087,79\n7087,86\n7087,97\n7087,104\n7087,106\n7087,107\n7087,116\n7087,119\n7087,120\n7087,134\n7087,135\n7087,136\n7087,146\n7087,149\n7087,158\n7087,163\n7087,182\n7087,187\n7087,192\n7087,195\n7087,200\n7087,206\n7087,211\n7087,222\n7087,225\n7087,247\n7087,248\n7087,252\n7087,261\n7087,264\n7087,269\n7087,273\n7087,275\n7087,278\n7087,287\n7087,292\n7087,294\n7087,299\n7087,305\n7087,309\n7087,310\n7087,312\n7087,313\n7087,328\n7087,330\n7087,332\n7087,333\n7087,344\n7087,360\n7087,366\n7087,376\n7087,392\n7087,393\n7087,399\n7087,403\n7087,408\n7087,420\n7087,422\n7087,430\n7087,438\n7087,439\n7087,447\n7087,452\n7087,489\n7087,491\n7087,493\n7087,497\n7087,516\n7087,527\n7087,557\n7087,567\n7087,596\n7087,602\n7087,626\n7087,649\n7087,663\n7087,664\n7087,671\n7087,673\n7087,694\n7087,704\n7087,707\n7087,714\n7087,717\n7087,736\n7087,749\n7087,752\n7087,758\n7087,760\n7087,770\n7087,772\n7087,779\n7087,801\n7087,809\n7087,811\n7087,827\n7087,838\n7087,843\n7087,850\n7087,859\n7087,862\n7087,873\n7087,874\n7087,875\n7087,885\n7087,887\n7087,893\n7087,918\n7087,919\n7087,920\n7087,929\n7087,932\n7087,934\n7087,949\n7087,973\n7087,991\n7087,1010\n7087,1019\n7087,1033\n7087,1052\n7087,1082\n7087,1085\n7087,1096\n7087,1113\n7087,1127\n7087,1130\n7087,1133\n7087,1140\n7087,1146\n7087,1151\n7087,1181\n7087,1220\n7087,1227\n7087,1229\n7087,1235\n7087,1240\n7087,1243\n7087,1289\n7087,1298\n7087,1309\n7087,1313\n7087,1319\n7087,1335\n7087,1368\n7087,1381\n7087,1415\n7087,1419\n7087,1432\n7087,1434\n7087,1436\n7087,1449\n7087,1453\n7087,1458\n7087,1465\n7087,1474\n7087,1509\n7087,1515\n7087,1531\n7087,1539\n7087,1544\n7087,1571\n7087,1572\n7087,1590\n7087,1623\n7087,1639\n7087,1644\n7087,1653\n7087,1707\n7087,1749\n7087,1773\n7087,1782\n7087,1789\n7087,1801\n7087,1805\n7087,1818\n7087,1844\n7087,1849\n7087,1860\n7087,1877\n7087,1881\n7087,1891\n7087,1912\n7087,1927\n7087,1962\n7087,1984\n7087,2045\n7087,2083\n7087,2087\n7087,2089\n7087,2178\n7087,2205\n7087,2210\n7087,2224\n7087,2266\n7087,2286\n7087,2353\n7087,2373\n7087,2411\n7087,2421\n7087,2424\n7087,2528\n7087,2590\n7087,2607\n7087,2646\n7087,2701\n7087,2775\n7087,2779\n7087,2782\n7087,2797\n7087,2940\n7087,2944\n7087,2995\n7087,3069\n7087,3148\n7087,3218\n7087,3507\n7087,3695\n7087,4039\n7087,4237\n7087,4276\n7087,4355\n7087,4411\n7087,4545\n7087,4760\n7087,4865\n7087,4866\n7087,4903\n7087,5192\n7087,5213\n7087,5250\n7087,5301\n7087,5405\n7087,5540\n7087,5662\n7087,5718\n7087,5726\n7087,6837\n7087,7117\n7087,7143\n7087,7155\n7087,7614\n7087,8541\n7087,9024\n7087,13704\n7087,15807\n7087,19010\n7087,27550\n7087,33424\n7087,37414\n7087,61004\n7087,90845\n7087,124668\n7087,207837\n7088,605\n7089,3507\n7090,907\n7090,932\n7091,577\n7091,1105\n7092,313\n7092,536\n7092,911\n7092,4637\n7092,5625\n7092,13622\n7092,22376\n7092,24885\n7092,39718\n7092,41493\n7092,43383\n7092,59732\n7092,64810\n7092,70027\n7092,70144\n7092,90992\n7092,103449\n7092,104511\n7092,120959\n7092,122952\n7092,123022\n7092,127014\n7092,130179\n7092,134736\n7092,134747\n7092,171349\n7092,177945\n7092,236065\n7093,298\n7094,485\n7095,72\n7096,1282\n7096,1882\n7097,2051\n7098,808\n7098,1240\n7098,1465\n7098,1949\n7098,6059\n7099,298\n7100,485\n7101,3193\n7102,1531\n7103,251\n7103,252\n7103,318\n7103,465\n7103,516\n7103,1220\n7103,1222\n7103,1512\n7104,733\n7105,424\n7106,94\n7106,2787\n7108,3507\n7109,77\n7109,379\n7109,657\n7109,2224\n7109,75912\n7109,181063\n7110,1085\n7111,171\n7112,779\n7113,1531\n7114,1298\n7115,393\n7115,980\n7115,1096\n7116,330\n7117,10\n7117,20\n7117,81\n7117,96\n7117,97\n7117,175\n7117,248\n7117,485\n7117,685\n7117,693\n7117,849\n7117,972\n7117,1402\n7117,1445\n7117,1566\n7117,3079\n7117,6387\n7117,7117\n7117,9457\n7117,14483\n7117,17840\n7117,18880\n7117,20757\n7117,27035\n7117,28571\n7117,48632\n7117,68233\n7117,74404\n7117,114125\n7117,127706\n7117,142553\n7117,165490\n7117,207659\n7117,232607\n7118,217\n7118,349\n7118,1118\n7118,1417\n7118,4355\n7119,779\n7119,1515\n7120,439\n7120,671\n7120,1181\n7121,1776\n7122,422\n7123,433\n7125,577\n7126,118\n7126,274\n7126,795\n7126,5265\n7127,217\n7127,240\n7127,588\n7127,590\n7127,592\n7127,1818\n7128,206\n7128,934\n7128,1458\n7128,89035\n7129,65\n7129,467\n7129,868\n7130,1298\n7131,781\n7132,718\n7133,298\n7134,485\n7135,83\n7135,130\n7135,160\n7135,581\n7135,668\n7135,710\n7135,743\n7135,1803\n7135,2701\n7135,6387\n7135,7143\n7135,7614\n7136,415\n7137,4823\n7138,273\n7138,274\n7139,347\n7140,301\n7140,1782\n7141,79\n7141,1265\n7141,1266\n7141,1963\n7142,206\n7144,26\n7144,59\n7144,143\n7144,1433\n7144,1844\n7144,6803\n7144,17346\n7145,217\n7145,222\n7145,314\n7145,379\n7145,1019\n7146,379\n7146,1019\n7147,571\n7148,4895\n7149,4895\n7150,77\n7151,79\n7151,491\n7152,192\n7152,256\n7153,58\n7154,509\n7154,510\n7154,875\n7155,240\n7155,1893\n7155,2036\n7155,2512\n7155,3407\n7155,7087\n7155,26041\n7155,41634\n7155,60908\n7155,125299\n7155,125399\n7155,125767\n7155,192873\n7156,620\n7156,1181\n7158,83\n7159,852\n7159,957\n7159,1247\n7159,1844\n7159,109503\n7160,527\n7161,275\n7161,749\n7161,1085\n7161,3695\n7162,247\n7163,83\n7163,117\n7163,278\n7163,330\n7163,390\n7163,536\n7163,920\n7163,1085\n7163,1240\n7163,1381\n7163,1465\n7163,1805\n7163,2712\n7163,2782\n7163,4549\n7163,4594\n7163,7124\n7163,8854\n7164,86\n7165,788\n7165,1433\n7166,760\n7168,726\n7170,68\n7170,186\n7170,615\n7170,1326\n7170,1715\n7170,1782\n7171,58\n7172,5718\n7173,251\n7173,465\n7174,251\n7174,465\n7175,292\n7177,344\n7178,182\n7178,192\n7178,195\n7178,217\n7178,344\n7178,1433\n7178,1844\n7178,2105\n7178,3744\n7179,918\n7180,298\n7182,30\n7182,137\n7182,328\n7182,333\n7182,372\n7182,609\n7182,622\n7182,809\n7182,1305\n7182,1939\n7183,579\n7183,1844\n7184,647\n7185,344\n7187,1844\n7187,5213\n7188,178\n7189,309\n7189,310\n7190,1\n7191,415\n7192,192\n7193,163\n7194,104\n7194,313\n7194,372\n7194,390\n7194,446\n7194,534\n7194,589\n7194,626\n7194,784\n7194,795\n7194,911\n7194,1004\n7194,1119\n7194,1462\n7194,1580\n7194,1701\n7194,1844\n7194,2572\n7194,2995\n7194,3623\n7194,4222\n7194,7194\n7194,8537\n7194,13273\n7194,27703\n7194,31302\n7194,44725\n7194,71745\n7194,75912\n7194,147952\n7194,163304\n7194,173427\n7194,211936\n7195,83\n7196,120\n7196,261\n7196,694\n7196,3115\n7196,32751\n7197,557\n7198,1179\n7199,111\n7200,312\n7201,72\n7202,1149\n7203,1167\n7203,2979\n7204,167\n7204,1231\n7204,1522\n7206,1235\n7206,1335\n7206,21944\n7207,58\n7208,602\n7209,1644\n7209,6661\n7210,305\n7211,420\n7212,2116\n7213,309\n7213,310\n7214,248\n7214,364\n7214,850\n7214,1332\n7215,147\n7215,991\n7216,147\n7216,158\n7217,467\n7217,868\n7218,949\n7219,1167\n7220,1359\n7221,120\n7221,261\n7221,1313\n7221,1466\n7222,37\n7222,46\n7222,301\n7222,525\n7222,717\n7222,852\n7222,968\n7222,1133\n7222,1231\n7222,1235\n7222,1241\n7222,1293\n7222,1335\n7222,1370\n7222,1411\n7222,1782\n7222,1837\n7222,2557\n7222,2782\n7222,3804\n7222,5662\n7222,5881\n7223,217\n7223,536\n7224,340\n7224,408\n7224,489\n7225,431\n7226,192\n7226,256\n7226,707\n7228,1359\n7229,726\n7230,219\n7231,106\n7231,1370\n7231,1821\n7231,2782\n7231,6119\n7231,21736\n7232,7233\n7234,720\n7234,1284\n7235,248\n7236,151\n7237,1381\n7238,417\n7238,1564\n7239,1167\n7240,58\n7241,3\n7241,34\n7241,35\n7241,106\n7241,158\n7241,178\n7241,192\n7241,202\n7241,203\n7241,217\n7241,251\n7241,252\n7241,333\n7241,337\n7241,346\n7241,435\n7241,439\n7241,447\n7241,516\n7241,586\n7241,602\n7241,622\n7241,640\n7241,663\n7241,664\n7241,1181\n7241,1220\n7241,1222\n7241,1243\n7241,1247\n7241,1294\n7241,1370\n7241,1512\n7241,1590\n7241,1635\n7241,1963\n7241,2567\n7241,2931\n7241,3161\n7241,4192\n7241,4193\n7241,4672\n7241,5874\n7241,5976\n7241,5992\n7241,6119\n7241,8598\n7241,8771\n7241,8811\n7241,8822\n7241,8907\n7242,79\n7242,784\n7242,3623\n7243,140\n7243,1370\n7244,1707\n7245,217\n7245,868\n7246,346\n7247,72\n7247,2605\n7247,3695\n7248,7249\n7250,117\n7250,2712\n7251,298\n7252,2668\n7253,7254\n7255,485\n7256,192\n7256,333\n7257,301\n7257,1160\n7258,663\n7258,1531\n7258,7259\n7258,51080\n7258,78065\n7258,89302\n7258,93891\n7258,95362\n7258,115886\n7258,120313\n7258,127490\n7258,144415\n7258,151915\n7260,850\n7261,408\n7261,668\n7261,1436\n7261,1515\n7262,859\n7264,920\n7265,202\n7265,203\n7265,312\n7266,120\n7266,261\n7266,694\n7266,1203\n7266,1419\n7266,1466\n7266,1955\n7266,2989\n7266,2991\n7267,83\n7268,240\n7268,289\n7268,290\n7268,298\n7268,372\n7268,417\n7268,932\n7268,1085\n7268,1564\n7268,1818\n7268,1955\n7268,2205\n7268,2206\n7268,2296\n7268,2620\n7268,33424\n7268,94134\n7269,104\n7269,136\n7269,254\n7269,557\n7269,953\n7269,1368\n7269,1939\n7269,7270\n7270,978\n7270,5053\n7270,7270\n7270,105824\n7272,2373\n7273,1179\n7274,1001\n7275,1544\n7276,7277\n7278,1127\n7279,7280\n7281,66\n7282,72\n7283,7284\n7285,143\n7286,143\n7287,217\n7287,1417\n7288,255\n7288,1796\n7289,1474\n7290,278\n7291,7292\n7293,972\n7294,1506\n7295,63\n7295,2156\n7296,10\n7296,56\n7296,79\n7296,135\n7296,192\n7296,333\n7296,602\n7296,841\n7296,1089\n7296,1181\n7296,1458\n7296,22616\n7296,23783\n7296,30331\n7296,60576\n7296,92476\n7297,1210\n7298,1400\n7299,285\n7299,525\n7299,795\n7299,1085\n7299,2590\n7299,35486\n7300,326\n7301,217\n7301,222\n7301,1417\n7301,4672\n7301,5343\n7302,79\n7303,4\n7303,5\n7303,117\n7303,250\n7303,256\n7303,483\n7303,668\n7303,827\n7303,994\n7303,1116\n7303,1684\n7303,2712\n7303,2735\n7303,3089\n7303,3524\n7303,3695\n7303,4691\n7303,4810\n7303,14434\n7303,21603\n7303,142430\n7304,7304\n7305,602\n7306,184\n7307,1235\n7307,1335\n7308,30\n7309,1556\n7310,26\n7310,59\n7311,2574\n7312,420\n7312,652\n7313,7314\n7315,7316\n7317,376\n7318,10\n7318,175\n7318,205\n7318,313\n7318,328\n7318,485\n7318,671\n7318,685\n7318,693\n7318,704\n7318,1130\n7318,1188\n7318,1402\n7318,115659\n7319,885\n7320,136\n7321,1033\n7322,136\n7324,81\n7324,215\n7324,1392\n7325,206\n7325,31977\n7326,392\n7326,1240\n7327,7328\n7329,7328\n7330,7328\n7331,247\n7332,392\n7333,1849\n7333,32784\n7334,7335\n7337,10\n7337,1711\n7337,1796\n7337,3111\n7337,16196\n7338,79\n7338,240\n7338,818\n7339,698\n7340,422\n7341,1151\n7341,1363\n7341,1836\n7342,7343\n7344,1019\n7344,1181\n7344,1531\n7344,4355\n7345,289\n7345,290\n7346,34\n7346,35\n7346,536\n7347,209\n7347,222\n7349,663\n7349,972\n7349,1167\n7349,1298\n7349,2979\n7350,775\n7351,6803\n7352,2411\n7353,6891\n7354,99\n7355,41\n7355,119\n7355,298\n7355,843\n7355,1127\n7356,1381\n7357,7358\n7357,7363\n7358,7358\n7358,7363\n7359,7360\n7361,1571\n7361,5326\n7362,44\n7364,794\n7365,305\n7365,515\n7365,1381\n7367,195\n7368,160\n7369,687\n7370,1289\n7371,1381\n7372,3999\n7373,1767\n7374,697\n7375,3260\n7376,5440\n7377,433\n7378,227\n7379,1722\n7380,1132\n7380,142430\n7381,1465\n7383,72\n7383,134\n7383,248\n7383,285\n7383,372\n7383,525\n7383,626\n7383,795\n7383,972\n7383,1309\n7383,2590\n7383,35486\n7384,5101\n7385,344\n7385,859\n7385,1512\n7385,1983\n7385,2646\n7385,5992\n7386,1085\n7386,75912\n7387,433\n7388,63\n7388,589\n7388,1127\n7388,1274\n7388,1298\n7388,1474\n7388,4411\n7388,22293\n7389,7390\n7389,55017\n7389,129433\n7391,298\n7392,485\n7393,2506\n7394,2506\n7395,372\n7396,6119\n7397,130\n7397,1289\n7398,292\n7398,417\n7399,602\n7400,446\n7400,605\n7400,615\n7400,937\n7400,968\n7401,3367\n7402,147\n7402,306\n7402,307\n7402,406\n7402,585\n7402,779\n7402,1181\n7403,1769\n7403,5547\n7404,602\n7405,10\n7405,175\n7405,328\n7406,875\n7407,225\n7408,346\n7409,7410\n7411,192\n7412,1663\n7413,366\n7413,500\n7414,134\n7414,225\n7414,349\n7414,431\n7415,7416\n7417,366\n7417,640\n7417,4691\n7418,1220\n7418,1222\n7418,1566\n7418,1571\n7419,7420\n7421,6051\n7422,147\n7422,158\n7422,206\n7423,1257\n7423,3085\n7424,146\n7425,333\n7426,65\n7426,586\n7427,2048\n7428,781\n7430,22\n7430,83\n7430,315\n7430,366\n7430,500\n7430,1655\n7431,1326\n7432,160\n7432,296\n7432,314\n7432,599\n7432,647\n7432,991\n7432,1052\n7432,1127\n7432,1267\n7432,1579\n7432,1659\n7432,1749\n7432,1893\n7432,2051\n7432,2260\n7432,2605\n7432,14550\n7432,32673\n7432,49057\n7433,140\n7433,264\n7433,1127\n7433,1551\n7433,1893\n7434,72\n7434,81\n7434,264\n7434,312\n7434,360\n7434,467\n7434,515\n7434,647\n7434,652\n7434,991\n7434,1052\n7434,1188\n7434,1267\n7434,1287\n7434,1289\n7434,1659\n7434,1707\n7434,1749\n7434,1893\n7434,2312\n7434,2605\n7434,13538\n7435,663\n7435,664\n7436,1181\n7437,72\n7438,346\n7439,182\n7439,949\n7439,1085\n7440,907\n7440,1284\n7440,2191\n7442,3585\n7443,336\n7443,406\n7444,1293\n7444,1782\n7445,805\n7446,7447\n7448,557\n7449,557\n7450,147\n7451,58\n7452,557\n7453,7454\n7455,3585\n7456,22\n7456,1181\n7457,135\n7458,294\n7458,372\n7458,431\n7458,596\n7458,631\n7458,634\n7458,772\n7458,784\n7458,805\n7458,1052\n7458,1368\n7458,127158\n7459,392\n7461,941\n7462,63\n7463,1078\n7464,7465\n7466,247\n7467,63\n7468,577\n7470,315\n7471,22\n7472,408\n7472,726\n7473,784\n7473,818\n7473,32751\n7474,1116\n7475,1639\n7476,83\n7477,1479\n7478,3148\n7479,5101\n7480,2224\n7481,240\n7481,1818\n7482,7483\n7484,7485\n7486,107\n7487,211\n7488,406\n7489,7490\n7491,50\n7492,766\n7493,72\n7494,50\n7494,663\n7494,1515\n7496,298\n7497,7498\n7497,115535\n7497,125983\n7497,130010\n7497,131352\n7499,255\n7500,4980\n7501,72\n7502,818\n7503,442\n7503,2334\n7504,7505\n7506,355\n7507,104\n7507,136\n7507,557\n7508,71\n7509,72\n7510,707\n7511,417\n7511,1085\n7512,147\n7512,184\n7512,1247\n7513,7514\n7515,2506\n7516,424\n7517,861\n7518,273\n7518,274\n7518,957\n7518,1815\n7518,66552\n7519,2379\n7520,392\n7520,1151\n7521,32\n7522,1955\n7523,107\n7523,111\n7523,4771\n7524,344\n7525,72\n7525,83\n7525,217\n7525,278\n7525,536\n7525,631\n7525,660\n7525,949\n7525,1133\n7525,1274\n7525,1466\n7525,1881\n7525,2244\n7525,2779\n7525,4637\n7525,4903\n7525,7092\n7525,9015\n7526,1359\n7527,7528\n7529,932\n7530,126\n7530,292\n7530,446\n7530,745\n7530,932\n7530,937\n7530,972\n7530,1117\n7530,1298\n7530,1618\n7530,1653\n7530,1677\n7530,1688\n7530,1849\n7530,2443\n7530,2674\n7530,3830\n7530,4411\n7530,16614\n7530,124668\n7530,171641\n7530,187176\n7531,850\n7532,106\n7532,516\n7532,1068\n7532,1289\n7533,861\n7534,1001\n7534,1010\n7534,1085\n7535,7536\n7535,17485\n7535,17874\n7535,20011\n7535,22752\n7535,26643\n7535,39115\n7535,42282\n7535,44675\n7535,46424\n7535,49394\n7535,56809\n7535,57506\n7535,57541\n7535,58319\n7535,69856\n7535,92092\n7535,120760\n7535,131697\n7537,1551\n7538,250\n7538,887\n7539,192\n7539,13485\n7540,72\n7541,1298\n7542,1287\n7543,107\n7544,2674\n7545,72\n7546,435\n7547,130\n7548,1326\n7549,209\n7550,143\n7551,3238\n7552,483\n7553,346\n7554,818\n7555,4\n7555,5\n7556,417\n7557,160\n7558,605\n7559,86\n7560,5662\n7561,1849\n7562,1955\n7563,301\n7564,1231\n7565,5718\n7566,752\n7567,1564\n7568,2083\n7569,2620\n7570,390\n7571,7572\n7573,4549\n7574,388\n7575,1837\n7576,3422\n7577,3193\n7578,1241\n7579,1782\n7580,1522\n7581,2191\n7582,3194\n7583,907\n7584,1167\n7585,968\n7586,1544\n7587,3218\n7588,3207\n7589,3138\n7590,2557\n7591,720\n7592,1298\n7593,893\n7594,247\n7594,309\n7594,310\n7594,1566\n7594,2266\n7594,6068\n7594,6298\n7595,72\n7596,143\n7597,143\n7598,336\n7598,682\n7599,72\n7600,1837\n7601,306\n7601,307\n7602,862\n7603,784\n7604,273\n7604,274\n7604,66754\n7607,1452\n7608,1181\n7609,143\n7609,2006\n7610,2779\n7611,143\n7612,167\n7612,1522\n7612,2083\n7612,2191\n7612,2557\n7612,3138\n7613,209\n7615,3041\n7616,72\n7617,184\n7617,292\n7617,304\n7617,328\n7617,356\n7617,704\n7617,862\n7617,991\n7617,1085\n7617,1285\n7617,1309\n7617,2244\n7617,5440\n7617,7429\n7618,20\n7619,1016\n7620,1052\n7620,1639\n7621,516\n7622,7623\n7624,366\n7625,143\n7626,602\n7627,388\n7628,77\n7628,83\n7628,278\n7628,285\n7628,372\n7628,399\n7628,536\n7628,631\n7628,805\n7628,1085\n7628,1238\n7628,1274\n7628,1756\n7628,1801\n7628,2421\n7628,3695\n7628,7698\n7628,22293\n7629,136\n7629,252\n7629,272\n7629,318\n7629,333\n7629,435\n7629,516\n7629,596\n7629,1033\n7629,1370\n7629,1893\n7629,2006\n7629,4545\n7629,139010\n7630,671\n7631,143\n7632,7633\n7634,7633\n7635,7633\n7636,7637\n7638,1858\n7639,1860\n7640,72\n7641,4594\n7642,7633\n7643,7633\n7644,1381\n7645,175\n7645,245706\n7646,192\n7647,602\n7648,7649\n7650,1634\n7651,1390\n7653,392\n7654,392\n7654,1151\n7654,76096\n7655,920\n7656,4\n7656,5\n7657,1425\n7658,349\n7659,561\n7659,911\n7660,2286\n7661,644\n7662,99\n7663,99\n7664,30\n7665,328\n7666,346\n7667,287\n7668,1274\n7669,143\n7670,115\n7671,118\n7672,911\n7673,207\n7673,843\n7674,957\n7674,1247\n7674,1815\n7674,164572\n7675,72\n7676,149\n7677,1127\n7678,949\n7679,346\n7680,1133\n7681,22\n7681,207\n7682,1\n7682,94\n7682,184\n7682,2787\n7683,7684\n7685,7686\n7687,72\n7688,215\n7689,269\n7689,710\n7689,784\n7689,1241\n7689,1345\n7689,1572\n7689,2083\n7689,3069\n7689,5874\n7690,346\n7691,346\n7692,30\n7693,346\n7694,195\n7695,7696\n7697,158\n7697,406\n7697,779\n7698,54\n7698,83\n7698,278\n7698,313\n7698,379\n7698,385\n7698,389\n7698,457\n7698,477\n7698,536\n7698,660\n7698,745\n7698,784\n7698,1019\n7698,1274\n7698,1756\n7698,1871\n7698,2159\n7698,2168\n7698,2247\n7698,2421\n7698,2507\n7698,2646\n7698,2784\n7698,2944\n7698,4039\n7698,6064\n7698,6880\n7698,6997\n7698,7768\n7698,9743\n7698,18345\n7698,21015\n7698,21249\n7698,21592\n7698,23231\n7698,23287\n7698,29720\n7698,29885\n7698,30918\n7698,33414\n7698,34166\n7698,35091\n7698,35352\n7698,38030\n7698,38859\n7698,39537\n7698,41025\n7698,42111\n7698,46343\n7698,48278\n7698,55203\n7698,57123\n7698,59822\n7698,61043\n7698,62539\n7698,66703\n7698,66796\n7698,70979\n7698,75848\n7698,79533\n7698,79966\n7698,80335\n7698,82101\n7698,87372\n7698,91944\n7698,91960\n7698,93149\n7698,93165\n7698,94299\n7698,94900\n7698,107568\n7698,107582\n7698,107594\n7698,110681\n7698,110688\n7698,110696\n7698,111715\n7698,114093\n7698,114096\n7698,115474\n7698,123077\n7698,127431\n7698,134021\n7698,134033\n7698,134042\n7698,134054\n7698,134089\n7698,135040\n7698,140663\n7698,140777\n7698,141807\n7698,141890\n7698,168934\n7698,181063\n7698,219891\n7698,231120\n7698,232150\n7698,232216\n7698,236004\n7698,236031\n7698,236042\n7698,236615\n7698,248449\n7698,263955\n7699,5101\n7700,7701\n7702,932\n7702,1085\n7703,7704\n7705,663\n7705,664\n7706,2351\n7707,178\n7708,1238\n7709,1433\n7710,2797\n7711,5375\n7712,872\n7713,87\n7714,202\n7714,203\n7714,4453\n7715,195\n7715,450\n7715,32475\n7716,676\n7717,2923\n7718,233\n7718,1014\n7718,1309\n7718,1801\n7718,3370\n7719,1\n7720,392\n7721,7722\n7724,94\n7724,2787\n7725,1511\n7725,3069\n7726,1634\n7727,489\n7728,1119\n7728,1285\n7728,26041\n7729,7730\n7731,4\n7731,5\n7731,32\n7731,34\n7731,35\n7731,48\n7731,50\n7731,104\n7731,146\n7731,158\n7731,182\n7731,200\n7731,248\n7731,252\n7731,261\n7731,278\n7731,306\n7731,307\n7731,328\n7731,330\n7731,333\n7731,422\n7731,491\n7731,493\n7731,596\n7731,602\n7731,663\n7731,673\n7731,704\n7731,752\n7731,772\n7731,827\n7731,893\n7731,919\n7731,929\n7731,949\n7731,994\n7731,1052\n7731,1127\n7731,1140\n7731,1149\n7731,1227\n7731,1235\n7731,1289\n7731,1298\n7731,1309\n7731,1335\n7731,1368\n7731,1381\n7731,1419\n7731,1458\n7731,1509\n7731,1515\n7731,1544\n7731,1623\n7731,1844\n7731,1912\n7731,2083\n7731,2178\n7731,2353\n7731,3209\n7731,4545\n7731,4637\n7731,4865\n7731,4866\n7731,5192\n7731,17346\n7731,56150\n7731,86416\n7731,106502\n7732,366\n7733,306\n7733,307\n7734,233\n7735,83\n7736,602\n7736,707\n7737,827\n7738,83\n7739,760\n7739,1149\n7739,1631\n7740,602\n7741,841\n7742,7743\n7744,602\n7744,3218\n7745,515\n7746,298\n7747,485\n7748,718\n7749,3769\n7750,11\n7751,7752\n7755,63\n7756,7757\n7757,136\n7757,248\n7757,450\n7757,852\n7757,1012\n7757,1368\n7757,1844\n7757,1867\n7757,4276\n7757,5728\n7757,7756\n7757,7757\n7757,7921\n7757,13207\n7757,18141\n7757,19278\n7757,20228\n7757,22467\n7757,28338\n7757,30775\n7757,32778\n7757,33411\n7757,34370\n7757,34865\n7757,35514\n7757,38777\n7757,41124\n7757,43111\n7757,48370\n7757,48396\n7757,51932\n7757,58871\n7757,60559\n7757,63038\n7757,70926\n7757,70968\n7757,72495\n7757,72579\n7757,78746\n7757,82127\n7757,83254\n7757,83456\n7757,91190\n7757,102494\n7757,106310\n7757,106337\n7757,111062\n7757,120916\n7757,122511\n7757,122937\n7757,134597\n7757,148443\n7757,149271\n7757,150805\n7757,157260\n7757,159064\n7757,185393\n7757,189219\n7757,190270\n7757,202998\n7757,203982\n7757,216532\n7757,220367\n7757,221743\n7757,221790\n7757,221864\n7757,225659\n7757,243430\n7757,250534\n7757,255711\n7757,256158\n7757,264365\n7757,264553\n7758,163\n7758,366\n7758,489\n7758,760\n7758,1149\n7758,1631\n7759,167\n7759,631\n7759,657\n7759,1210\n7759,7760\n7760,207\n7760,1607\n7760,23300\n7760,29965\n7760,66356\n7760,74376\n7760,194338\n7760,201750\n7760,247654\n7760,251244\n7760,259426\n7761,868\n7762,3451\n7762,3452\n7763,77\n7764,631\n7765,626\n7766,292\n7766,301\n7766,333\n7766,388\n7766,392\n7766,406\n7766,516\n7766,536\n7766,571\n7766,626\n7766,875\n7766,920\n7766,1001\n7766,1085\n7766,1118\n7766,1143\n7766,1796\n7766,1805\n7766,2979\n7767,379\n7767,1724\n7767,2424\n7767,7768\n7767,115474\n7768,19\n7768,130\n7768,135\n7768,222\n7768,283\n7768,455\n7768,745\n7768,784\n7768,1539\n7768,1618\n7768,1724\n7768,1756\n7768,2159\n7768,2424\n7768,2699\n7768,6788\n7768,6880\n7768,7767\n7768,13137\n7768,13276\n7768,13328\n7768,13400\n7768,19349\n7768,19351\n7768,22119\n7768,22252\n7768,22253\n7768,28130\n7768,31903\n7768,37088\n7768,42434\n7768,56584\n7768,73451\n7768,79966\n7768,92656\n7768,94975\n7768,101735\n7768,113481\n7768,115474\n7768,117308\n7768,126037\n7768,131216\n7768,135270\n7768,136072\n7768,136665\n7768,140055\n7768,140292\n7768,140452\n7768,148355\n7768,177486\n7768,206246\n7768,207659\n7768,213089\n7768,215060\n7768,225319\n7768,234249\n7768,246189\n7768,247153\n7768,252341\n7768,256342\n7768,261962\n7769,586\n7769,652\n7769,1149\n7772,7768\n7773,1639\n7774,356\n7774,852\n7774,1167\n7774,3422\n7775,1417\n7777,333\n7777,622\n7777,862\n7777,893\n7777,1515\n7779,26\n7779,59\n7779,1235\n7779,1335\n7780,280\n7780,393\n7780,980\n7780,1400\n7781,302\n7781,809\n7781,2312\n7781,22293\n7782,3209\n7783,2460\n7784,298\n7785,485\n7786,349\n7787,3422\n7788,1579\n7789,718\n7790,248\n7790,534\n7790,760\n7790,805\n7790,862\n7790,1119\n7790,1179\n7790,1631\n7790,75912\n7791,79\n7791,273\n7791,516\n7791,1425\n7792,86\n7793,302\n7794,192\n7794,336\n7794,493\n7794,663\n7794,664\n7794,779\n7794,1181\n7794,1985\n7794,60576\n7795,403\n7795,693\n7796,97\n7796,1639\n7797,7798\n7799,298\n7800,485\n7802,79\n7802,726\n7803,309\n7803,310\n7803,859\n7804,143\n7805,372\n7806,1332\n7806,1572\n7807,7808\n7807,14097\n7807,23251\n7807,31862\n7807,41274\n7807,45332\n7807,46603\n7807,51983\n7807,54561\n7807,57636\n7807,68065\n7807,79144\n7807,79675\n7807,87104\n7807,88419\n7807,88812\n7807,99461\n7807,100177\n7807,101766\n7807,106375\n7809,278\n7809,364\n7809,431\n7809,1252\n7809,1253\n7810,1235\n7810,1335\n7811,298\n7811,309\n7811,310\n7811,611\n7811,1105\n7811,1368\n7812,1285\n7812,1888\n7812,6119\n7813,338\n7813,462\n7813,4039\n7813,8149\n7814,631\n7815,298\n7816,485\n7817,1\n7817,184\n7818,779\n7818,972\n7818,973\n7818,1634\n7819,1085\n7819,6068\n7820,298\n7821,485\n7822,48\n7823,1836\n7824,306\n7824,307\n7825,473\n7825,8149\n7826,859\n7826,6263\n7827,1\n7827,20\n7827,22\n7827,48\n7827,63\n7827,72\n7827,81\n7827,86\n7827,104\n7827,107\n7827,130\n7827,135\n7827,137\n7827,146\n7827,149\n7827,151\n7827,163\n7827,178\n7827,184\n7827,192\n7827,206\n7827,207\n7827,209\n7827,247\n7827,250\n7827,251\n7827,252\n7827,254\n7827,256\n7827,258\n7827,259\n7827,262\n7827,264\n7827,269\n7827,272\n7827,273\n7827,275\n7827,278\n7827,280\n7827,283\n7827,289\n7827,290\n7827,299\n7827,302\n7827,305\n7827,306\n7827,307\n7827,309\n7827,310\n7827,313\n7827,314\n7827,315\n7827,326\n7827,330\n7827,337\n7827,338\n7827,347\n7827,352\n7827,356\n7827,406\n7827,435\n7827,452\n7827,581\n7827,599\n7827,626\n7827,647\n7827,649\n7827,668\n7827,726\n7827,736\n7827,752\n7827,801\n7827,805\n7827,808\n7827,841\n7827,843\n7827,852\n7827,861\n7827,893\n7827,920\n7827,934\n7827,972\n7827,994\n7827,1133\n7827,1151\n7827,1172\n7827,1179\n7827,1210\n7827,1220\n7827,1222\n7827,1247\n7827,1309\n7827,1313\n7827,1381\n7827,1434\n7827,1449\n7827,1452\n7827,1465\n7827,1509\n7827,1644\n7827,1684\n7827,1707\n7827,1796\n7827,1818\n7827,1844\n7827,1881\n7827,1973\n7827,2048\n7827,2073\n7827,2244\n7827,2266\n7827,2837\n7827,2867\n7827,2868\n7827,2915\n7827,3989\n7827,3999\n7827,4771\n7827,4903\n7827,5326\n7827,5718\n7827,8993\n7827,9457\n7827,16687\n7827,17245\n7827,41170\n7827,92476\n7827,94134\n7827,106502\n7827,144988\n7827,164572\n7827,215276\n7828,515\n7829,376\n7830,868\n7831,83\n7832,337\n7833,7834\n7835,1871\n7836,483\n7837,192\n7837,2260\n7837,3367\n7838,58\n7840,518\n7840,1326\n7840,3804\n7841,483\n7841,1707\n7842,77\n7842,868\n7843,134\n7844,1001\n7845,2923\n7846,626\n7847,5326\n7848,996\n7849,3524\n7850,515\n7851,1551\n7852,372\n7853,934\n7854,346\n7855,1707\n7856,717\n7857,622\n7858,178\n7859,1590\n7860,346\n7861,439\n7862,147\n7862,149\n7862,202\n7862,203\n7862,217\n7862,838\n7862,1014\n7862,1179\n7862,1243\n7862,21944\n7863,251\n7864,26\n7864,59\n7864,178\n7864,305\n7865,158\n7866,408\n7867,1858\n7868,1860\n7869,278\n7870,195\n7870,640\n7871,687\n7871,1556\n7872,346\n7873,1122\n7874,2334\n7875,1143\n7876,163\n7878,784\n7879,104\n7879,134\n7879,135\n7879,136\n7879,137\n7879,138\n7879,557\n7879,1368\n7879,1844\n7879,1939\n7879,2105\n7880,65\n7880,192\n7880,217\n7880,240\n7880,264\n7880,301\n7880,309\n7880,310\n7880,392\n7880,467\n7880,779\n7880,1019\n7880,1085\n7880,1417\n7880,1531\n7880,1688\n7880,1796\n7880,2205\n7880,2206\n7881,86\n7881,344\n7881,14674\n7882,1424\n7884,104\n7884,202\n7884,203\n7885,417\n7885,1118\n7886,302\n7886,861\n7886,893\n7886,2116\n7887,298\n7887,626\n7887,2995\n7887,7888\n7887,73561\n7887,89747\n7887,93465\n7887,99796\n7887,103672\n7887,159409\n7887,161521\n7887,176219\n7887,237402\n7887,243296\n7887,245877\n7889,248\n7890,314\n7890,392\n7890,623\n7890,872\n7890,918\n7890,1805\n7890,3260\n7891,192\n7891,217\n7891,535\n7891,818\n7892,640\n7893,827\n7894,187\n7895,640\n7896,694\n7897,337\n7898,7899\n7901,1749\n7901,3585\n7902,1467\n7903,187\n7904,163\n7904,1201\n7904,1571\n7904,2073\n7904,6452\n7904,75912\n7906,2923\n7906,3524\n7907,697\n7908,366\n7908,972\n7909,158\n7909,195\n7910,868\n7911,163\n7912,248\n7913,298\n7914,485\n7915,240\n7915,1285\n7915,1309\n7915,1955\n7915,2512\n7915,5718\n7916,366\n7918,366\n7919,366\n7920,372\n7922,615\n7923,206\n7924,72\n7925,304\n7926,3\n7927,3695\n7928,1149\n7928,3507\n7930,22\n7931,7932\n7933,338\n7933,1893\n7934,497\n7935,104\n7935,636\n7936,972\n7936,1298\n7937,827\n7939,302\n7939,861\n7939,2116\n7940,996\n7941,972\n7942,219\n7943,781\n7944,120\n7944,577\n7944,694\n7944,1019\n7945,206\n7946,1858\n7947,1860\n7948,79\n7948,158\n7948,269\n7948,337\n7948,406\n7948,467\n7948,1181\n7948,1433\n7949,66\n7949,868\n7950,422\n7951,422\n7952,516\n7952,1220\n7952,1222\n7952,1512\n7952,5992\n7953,195\n7954,893\n7955,1\n7955,171\n7955,184\n7955,273\n7955,422\n7955,994\n7955,1172\n7955,6556\n7955,7956\n7957,2116\n7958,26\n7958,59\n7958,430\n7958,1432\n7958,21944\n7959,186\n7959,459\n7959,518\n7959,775\n7959,1326\n7959,1849\n7959,2646\n7959,188791\n7960,1323\n7961,102\n7962,233\n7962,760\n7962,1119\n7962,1462\n7962,8537\n7963,781\n7964,1326\n7965,408\n7966,372\n7967,919\n7968,56\n7968,602\n7968,685\n7968,749\n7968,1146\n7968,1240\n7968,2367\n7969,1010\n7969,1849\n7969,32784\n7970,147\n7970,158\n7971,620\n7972,611\n7972,1718\n7973,673\n7974,209\n7974,302\n7974,579\n7974,1556\n7974,2944\n7975,233\n7976,1381\n7977,72\n7978,397\n7979,135\n7980,1436\n7981,718\n7982,850\n7984,66\n7985,518\n7986,567\n7986,604\n7986,1068\n7986,1293\n7987,32\n7987,87\n7987,392\n7987,697\n7987,872\n7987,875\n7987,1836\n7988,408\n7989,781\n7990,219\n7991,868\n7992,346\n7993,292\n7993,312\n7993,338\n7993,360\n7993,509\n7993,510\n7993,710\n7993,1058\n7993,1140\n7993,1381\n7993,1612\n7993,1722\n7993,2626\n7993,4039\n7995,1837\n7996,227\n7996,298\n7996,304\n7997,781\n7998,1\n7998,147\n7998,149\n7998,158\n7998,184\n7999,147\n7999,516\n7999,1052\n7999,1580\n7999,2784\n8000,1118\n8001,302\n8001,579\n8002,195\n8002,392\n8003,72\n8004,143\n8005,592\n8006,86\n8006,118\n8006,306\n8006,307\n8006,315\n8006,340\n8006,663\n8006,664\n8006,668\n8006,1179\n8006,1623\n8006,1837\n8006,4597\n8006,6506\n8007,71\n8007,136\n8007,184\n8007,304\n8007,450\n8007,485\n8007,611\n8007,690\n8007,788\n8007,795\n8007,811\n8007,920\n8007,1070\n8007,1133\n8007,1368\n8007,1449\n8007,1612\n8007,1619\n8007,2460\n8007,2590\n8007,2812\n8007,3724\n8007,4222\n8007,4411\n8007,7757\n8007,15179\n8007,24500\n8007,37414\n8007,193129\n8008,143\n8009,749\n8010,907\n8010,932\n8011,750\n8011,1133\n8011,1326\n8011,2979\n8012,714\n8012,811\n8012,3769\n8013,79\n8013,192\n8013,440\n8013,6695\n8014,1388\n8015,158\n8016,222\n8016,949\n8017,510\n8018,8019\n8020,2574\n8020,4980\n8021,1204\n8022,1122\n8022,1849\n8023,86\n8024,1858\n8025,1860\n8026,577\n8026,1010\n8026,1298\n8026,1429\n8026,2995\n8027,147\n8027,158\n8027,1803\n8027,89035\n8028,8019\n8029,10\n8029,1127\n8029,2617\n8029,2626\n8030,1871\n8031,146\n8032,2372\n8032,148742\n8033,8034\n8035,219\n8036,315\n8037,1\n8037,107\n8037,605\n8037,811\n8037,827\n8037,1227\n8037,1229\n8037,1313\n8037,1381\n8038,393\n8039,5101\n8040,338\n8040,467\n8040,872\n8040,1146\n8040,1289\n8040,1722\n8040,1949\n8041,32\n8041,433\n8041,440\n8041,467\n8041,809\n8041,3367\n8041,5440\n8042,248\n8042,1332\n8043,346\n8043,932\n8044,581\n8044,918\n8045,932\n8046,620\n8046,8244\n8047,1801\n8048,72\n8049,104\n8049,134\n8049,138\n8049,2105\n8050,143\n8051,1298\n8052,718\n8052,3769\n8054,102\n8056,781\n8057,634\n8058,72\n8059,58\n8059,932\n8060,187\n8061,805\n8061,1659\n8063,1345\n8064,240\n8064,631\n8065,1871\n8066,985\n8067,195\n8068,163\n8068,25222\n8071,8072\n8072,446\n8072,849\n8072,1096\n8072,3555\n8072,15241\n8072,28294\n8072,34136\n8072,48721\n8072,88473\n8072,90831\n8072,99593\n8072,108559\n8072,112366\n8072,118958\n8072,133971\n8072,134027\n8072,160700\n8073,72\n8074,710\n8076,252\n8076,1220\n8076,1222\n8077,140\n8079,81\n8079,8080\n8079,8135\n8079,8136\n8079,18959\n8079,19700\n8079,22661\n8079,25074\n8079,25076\n8079,26404\n8079,26405\n8081,788\n8082,788\n8083,788\n8084,32\n8084,48\n8084,65\n8084,79\n8084,130\n8084,146\n8084,163\n8084,240\n8084,252\n8084,275\n8084,305\n8084,326\n8084,340\n8084,364\n8084,444\n8084,467\n8084,497\n8084,500\n8084,515\n8084,527\n8084,579\n8084,693\n8084,809\n8084,811\n8084,843\n8084,850\n8084,868\n8084,891\n8084,1127\n8084,1673\n8084,1893\n8084,1927\n8084,2373\n8084,3297\n8084,4101\n8084,4453\n8084,5102\n8085,850\n8086,158\n8086,2797\n8087,973\n8088,518\n8089,887\n8090,344\n8090,360\n8090,1127\n8090,1893\n8091,1522\n8093,248\n8093,450\n8093,1332\n8094,1474\n8095,15\n8096,1653\n8097,83\n8097,313\n8097,356\n8097,388\n8097,455\n8097,536\n8097,941\n8097,1419\n8097,2224\n8097,3207\n8097,3258\n8097,5591\n8097,6068\n8098,147\n8098,158\n8098,406\n8098,622\n8098,779\n8099,312\n8099,525\n8100,192\n8100,406\n8100,1181\n8100,1370\n8100,2471\n8101,104\n8101,557\n8101,953\n8101,954\n8101,5405\n8102,433\n8103,450\n8104,518\n8105,264\n8106,251\n8106,516\n8107,68\n8107,167\n8107,301\n8107,372\n8107,388\n8107,390\n8107,589\n8107,626\n8107,1010\n8107,1085\n8107,1293\n8107,1522\n8107,2557\n8107,3193\n8107,48505\n8107,75912\n8108,302\n8109,1\n8109,184\n8110,535\n8110,704\n8110,710\n8111,644\n8112,3769\n8113,589\n8113,720\n8113,972\n8113,3846\n8113,6249\n8113,16153\n8114,861\n8115,26\n8115,59\n8117,298\n8118,485\n8119,68\n8119,312\n8119,358\n8119,525\n8120,5326\n8120,5908\n8121,781\n8123,788\n8124,20\n8124,273\n8124,274\n8124,349\n8124,408\n8124,668\n8124,712\n8124,1313\n8124,1891\n8125,252\n8125,1220\n8125,1222\n8126,200\n8127,336\n8127,1623\n8127,2373\n8128,192\n8128,671\n8128,788\n8129,932\n8130,862\n8131,2373\n8132,299\n8132,849\n8132,972\n8132,1011\n8132,1033\n8132,1127\n8132,1849\n8132,2210\n8132,4237\n8133,30\n8133,200\n8133,772\n8133,2376\n8133,4398\n8133,8126\n8133,8134\n8133,13207\n8133,18510\n8133,24789\n8133,25041\n8133,26264\n8133,26265\n8133,26802\n8133,26980\n8133,29740\n8133,32244\n8133,32656\n8133,32722\n8133,34352\n8133,34358\n8133,35703\n8133,40546\n8133,42541\n8133,43352\n8133,55911\n8133,58443\n8133,59203\n8133,63618\n8133,73222\n8133,74511\n8133,75256\n8133,76014\n8133,79333\n8133,79415\n8133,85814\n8133,89765\n8133,91293\n8133,99794\n8133,163744\n8133,179208\n8133,179338\n8133,224299\n8133,229893\n8133,230541\n8133,237687\n8134,200\n8137,8138\n8139,868\n8140,217\n8140,222\n8140,392\n8140,657\n8140,1019\n8140,2266\n8140,2421\n8140,6424\n8141,217\n8142,447\n8143,140\n8144,97\n8145,497\n8146,1274\n8146,2979\n8148,8149\n8149,87\n8149,292\n8149,420\n8149,609\n8149,673\n8149,685\n8149,849\n8149,872\n8149,1241\n8149,1653\n8149,2580\n8149,4039\n8149,20757\n8150,248\n8150,338\n8150,668\n8150,1631\n8152,283\n8152,385\n8152,455\n8152,536\n8152,589\n8152,1274\n8152,1353\n8152,1618\n8152,1724\n8152,2784\n8152,14674\n8153,640\n8154,1274\n8154,6556\n8155,2674\n8155,16153\n8156,120\n8156,222\n8156,278\n8156,1274\n8156,1353\n8156,1465\n8157,217\n8157,435\n8157,538\n8157,586\n8157,1531\n8157,1749\n8157,2371\n8157,6695\n8158,1707\n8160,79\n8161,3744\n8162,1070\n8163,4\n8163,5\n8163,22\n8163,151\n8163,309\n8163,310\n8163,483\n8163,818\n8163,861\n8163,1052\n8163,1556\n8163,2017\n8163,2626\n8163,3039\n8163,3695\n8164,2274\n8165,843\n8165,932\n8165,972\n8165,1844\n8165,1849\n8165,32784\n8166,516\n8166,1220\n8166,1222\n8168,657\n8168,4637\n8169,1274\n8170,106\n8171,949\n8172,1241\n8173,8019\n8173,107923\n8174,779\n8174,1515\n8175,8019\n8176,1247\n8176,164572\n8177,510\n8177,707\n8177,1019\n8177,1881\n8177,2045\n8177,3804\n8177,4223\n8177,5469\n8177,9743\n8177,132559\n8177,136072\n8180,107\n8180,609\n8180,966\n8180,4308\n8180,30443\n8180,38266\n8180,38877\n8181,2312\n8181,3585\n8182,1274\n8183,217\n8183,467\n8183,868\n8183,1433\n8184,805\n8185,527\n8188,269\n8189,422\n8190,65\n8190,66\n8190,120\n8190,388\n8190,392\n8190,536\n8190,868\n8190,1240\n8190,1345\n8190,1433\n8190,1454\n8190,2371\n8190,2671\n8190,8192\n8191,788\n8193,1012\n8193,1241\n8193,2557\n8194,8019\n8195,50\n8195,457\n8195,473\n8195,1313\n8195,8149\n8196,272\n8196,589\n8196,1294\n8197,364\n8198,1247\n8199,1453\n8200,248\n8201,1506\n8202,63\n8203,850\n8204,147\n8205,5718\n8206,875\n8207,1977\n8207,1978\n8208,313\n8208,623\n8208,1805\n8208,6068\n8209,140\n8209,510\n8209,1453\n8209,2436\n8209,3507\n8209,3538\n8210,143\n8210,1052\n8211,163\n8212,8213\n8214,256\n8214,852\n8214,1837\n8215,527\n8215,743\n8216,7\n8216,97\n8216,175\n8217,2334\n8218,305\n8219,431\n8220,8\n8220,2779\n8220,5034\n8221,158\n8221,206\n8221,1001\n8221,1801\n8222,163\n8222,209\n8222,438\n8222,694\n8223,147\n8223,158\n8223,779\n8224,2379\n8225,3999\n8225,7652\n8226,22\n8227,32\n8227,187\n8227,687\n8228,312\n8228,510\n8228,525\n8228,1749\n8230,1181\n8231,4190\n8232,184\n8232,332\n8232,424\n8232,438\n8232,2315\n8232,2620\n8232,2701\n8232,3451\n8232,3452\n8232,3769\n8233,250\n8233,1684\n8233,96002\n8234,8235\n8236,392\n8236,623\n8236,1805\n8236,3260\n8237,151\n8238,493\n8238,525\n8238,1983\n8239,736\n8240,1298\n8242,1511\n8242,3069\n8243,104\n8243,136\n8243,137\n8243,240\n8243,439\n8243,457\n8243,493\n8243,525\n8243,631\n8243,818\n8243,992\n8243,1749\n8243,2205\n8243,2206\n8243,3507\n8243,7124\n8243,26306\n8243,33424\n8244,1425\n8245,1608\n8246,41\n8246,68\n8246,1119\n8247,2073\n8248,417\n8249,1147\n8250,577\n8251,106\n8251,1127\n8252,907\n8252,932\n8253,167\n8253,301\n8253,919\n8253,2557\n8254,143\n8254,1052\n8254,2266\n8254,6424\n8255,1319\n8255,1515\n8255,8256\n8257,3585\n8258,500\n8259,143\n8260,392\n8261,68\n8261,186\n8261,388\n8261,534\n8261,609\n8261,631\n8261,973\n8261,1046\n8261,1133\n8261,1210\n8261,1326\n8261,2989\n8261,2991\n8262,1803\n8262,5213\n8263,652\n8263,710\n8263,1893\n8264,298\n8265,485\n8266,2607\n8267,8268\n8269,8270\n8270,8270\n8271,392\n8272,1284\n8273,178\n8273,439\n8273,1612\n8273,1776\n8273,1877\n8274,163\n8274,467\n8274,868\n8274,162599\n8277,505\n8278,485\n8279,30\n8279,104\n8279,135\n8279,327\n8279,328\n8279,714\n8279,1045\n8279,1179\n8279,1281\n8279,1282\n8279,1304\n8279,1305\n8279,1415\n8279,3565\n8279,6084\n8279,6292\n8279,6646\n8279,7124\n8279,7182\n8279,9678\n8279,22082\n8279,27892\n8279,28049\n8279,57293\n8279,92948\n8279,98469\n8279,160937\n8279,176399\n8279,202709\n8279,203015\n8279,206762\n8279,207116\n8279,213939\n8279,223797\n8279,231192\n8279,254352\n8280,1849\n8283,723\n8285,10\n8285,134\n8285,147\n8285,175\n8285,202\n8285,332\n8285,1623\n8285,2244\n8286,433\n8287,211\n8287,366\n8288,326\n8289,887\n8291,720\n8291,1117\n8292,781\n8294,801\n8295,781\n8296,41\n8296,50\n8296,58\n8296,68\n8296,79\n8296,83\n8296,86\n8296,104\n8296,107\n8296,111\n8296,120\n8296,130\n8296,136\n8296,138\n8296,160\n8296,178\n8296,202\n8296,209\n8296,211\n8296,217\n8296,240\n8296,251\n8296,252\n8296,254\n8296,259\n8296,287\n8296,294\n8296,309\n8296,310\n8296,312\n8296,315\n8296,388\n8296,406\n8296,433\n8296,477\n8296,509\n8296,510\n8296,516\n8296,518\n8296,525\n8296,577\n8296,579\n8296,586\n8296,592\n8296,596\n8296,623\n8296,626\n8296,631\n8296,634\n8296,636\n8296,640\n8296,647\n8296,649\n8296,704\n8296,714\n8296,717\n8296,760\n8296,795\n8296,809\n8296,811\n8296,818\n8296,861\n8296,893\n8296,907\n8296,919\n8296,920\n8296,943\n8296,992\n8296,994\n8296,1001\n8296,1010\n8296,1012\n8296,1033\n8296,1058\n8296,1132\n8296,1133\n8296,1149\n8296,1179\n8296,1238\n8296,1241\n8296,1243\n8296,1368\n8296,1381\n8296,1392\n8296,1436\n8296,1466\n8296,1474\n8296,1509\n8296,1531\n8296,1551\n8296,1571\n8296,1572\n8296,1619\n8296,1631\n8296,1634\n8296,1653\n8296,1715\n8296,1722\n8296,1801\n8296,1860\n8296,1877\n8296,1881\n8296,1893\n8296,1927\n8296,1968\n8296,2045\n8296,2209\n8296,2244\n8296,2260\n8296,2379\n8296,2590\n8296,2605\n8296,2620\n8296,2775\n8296,2779\n8296,2784\n8296,2995\n8296,3182\n8296,3367\n8296,3538\n8296,3695\n8296,3999\n8296,4355\n8296,5265\n8296,5667\n8296,6059\n8296,7194\n8296,7698\n8296,9001\n8296,9457\n8296,16687\n8296,28107\n8296,28130\n8296,201298\n8296,204124\n8297,187\n8297,302\n8297,783\n8297,1117\n8297,1313\n8298,710\n8299,781\n8300,273\n8300,274\n8300,4611\n8301,83\n8301,119\n8301,347\n8301,364\n8301,372\n8301,389\n8301,417\n8301,455\n8301,525\n8301,626\n8301,795\n8301,805\n8301,907\n8301,972\n8301,1019\n8301,1085\n8301,1274\n8301,1298\n8301,1363\n8301,1465\n8301,1467\n8301,1718\n8301,1801\n8301,1881\n8301,2266\n8301,2286\n8301,2434\n8301,2553\n8301,2590\n8301,2646\n8301,4172\n8301,13575\n8301,141912\n8302,781\n8303,1117\n8304,2372\n8305,2995\n8306,1688\n8307,158\n8307,269\n8307,406\n8307,622\n8307,5874\n8307,8308\n8309,192\n8309,663\n8309,664\n8310,6068\n8311,462\n8312,143\n8313,516\n8314,389\n8315,54\n8316,1241\n8317,647\n8317,835\n8317,1522\n8318,3769\n8319,233\n8319,805\n8320,248\n8322,240\n8323,240\n8323,392\n8323,818\n8323,918\n8323,1143\n8323,1363\n8323,1454\n8324,32\n8324,3003\n8325,818\n8326,259\n8326,312\n8328,163\n8329,3895\n8331,163\n8331,195\n8331,302\n8332,664\n8332,1181\n8332,1235\n8332,1833\n8332,3895\n8332,4307\n8332,4391\n8332,5173\n8332,8329\n8332,8333\n8332,9165\n8332,9548\n8332,13183\n8332,15203\n8332,23783\n8332,26841\n8332,29180\n8332,30331\n8332,30755\n8332,31853\n8332,31854\n8332,31855\n8332,31856\n8332,31857\n8332,31858\n8332,32982\n8332,32983\n8332,36940\n8332,42569\n8332,43685\n8332,43686\n8332,44165\n8332,45225\n8332,72439\n8332,240174\n8334,79\n8334,163\n8334,346\n8334,408\n8334,422\n8334,459\n8334,473\n8334,481\n8334,671\n8334,707\n8334,743\n8334,868\n8334,996\n8334,1276\n8334,1294\n8334,1323\n8334,1425\n8334,1572\n8334,1607\n8334,2807\n8334,52232\n8335,50\n8335,163\n8335,217\n8335,302\n8335,1265\n8335,1266\n8335,4748\n8336,163\n8338,163\n8339,163\n8339,1634\n8340,163\n8341,163\n8342,599\n8342,1293\n8342,3422\n8343,163\n8344,10\n8344,11\n8344,20\n8344,44\n8344,97\n8344,147\n8344,158\n8344,163\n8344,192\n8344,195\n8344,202\n8344,203\n8344,206\n8344,209\n8344,247\n8344,248\n8344,251\n8344,252\n8344,255\n8344,272\n8344,302\n8344,305\n8344,323\n8344,332\n8344,333\n8344,338\n8344,344\n8344,346\n8344,352\n8344,435\n8344,438\n8344,485\n8344,489\n8344,516\n8344,563\n8344,585\n8344,622\n8344,663\n8344,690\n8344,693\n8344,718\n8344,779\n8344,818\n8344,849\n8344,920\n8344,925\n8344,929\n8344,973\n8344,991\n8344,1011\n8344,1046\n8344,1135\n8344,1181\n8344,1188\n8344,1204\n8344,1220\n8344,1222\n8344,1238\n8344,1243\n8344,1309\n8344,1319\n8344,1326\n8344,1400\n8344,1414\n8344,1623\n8344,1634\n8344,1844\n8344,1891\n8344,1927\n8344,2373\n8344,2668\n8344,3370\n8344,3804\n8344,3876\n8344,4177\n8344,5213\n8344,5726\n8344,6027\n8344,6119\n8344,6837\n8344,7117\n8344,7124\n8344,7614\n8344,9029\n8344,9179\n8344,9208\n8344,14453\n8344,17772\n8344,25222\n8344,38158\n8344,47268\n8344,54064\n8344,109940\n8345,1188\n8346,163\n8346,893\n8347,163\n8347,302\n8347,2116\n8347,6303\n8348,784\n8349,163\n8350,130\n8350,163\n8350,264\n8350,1007\n8350,1381\n8351,254\n8352,163\n8353,298\n8354,485\n8358,26\n8358,59\n8358,887\n8358,21944\n8359,163\n8359,996\n8360,422\n8361,182\n8361,188\n8362,422\n8363,422\n8364,163\n8365,163\n8366,781\n8367,163\n8368,163\n8369,163\n8370,163\n8370,673\n8371,1564\n8372,8373\n8374,346\n8374,435\n8374,447\n8374,934\n8374,1033\n8375,163\n8376,163\n8377,392\n8379,163\n8380,163\n8381,163\n8382,137\n8382,200\n8383,163\n8384,163\n8384,2116\n8385,364\n8386,1319\n8386,2083\n8387,26\n8387,47\n8387,59\n8387,2469\n8387,21944\n8388,2209\n8389,140\n8389,163\n8391,1043\n8393,163\n8394,163\n8395,900\n8396,163\n8397,577\n8398,211\n8398,1181\n8398,2379\n8399,1634\n8400,859\n8400,1175\n8400,1289\n8401,1119\n8402,163\n8403,184\n8404,163\n8404,302\n8405,68\n8405,302\n8405,579\n8406,163\n8407,1140\n8407,2436\n8408,163\n8408,1579\n8409,66\n8410,283\n8411,163\n8412,2379\n8413,163\n8415,104\n8416,163\n8417,46\n8418,163\n8419,182\n8419,1135\n8419,1172\n8419,1191\n8420,163\n8421,636\n8421,8541\n8421,118336\n8422,1309\n8422,1955\n8423,1052\n8423,3695\n8424,135\n8425,22\n8425,272\n8425,439\n8425,1634\n8425,31207\n8426,195\n8426,1089\n8426,2373\n8426,31346\n8427,54\n8428,509\n8429,10\n8430,72\n8430,1363\n8431,83\n8431,187\n8431,222\n8431,278\n8431,283\n8431,313\n8431,385\n8431,536\n8431,660\n8431,781\n8431,1201\n8431,1274\n8431,1618\n8431,1718\n8431,1881\n8431,2224\n8431,2319\n8431,2421\n8431,2646\n8431,2784\n8431,2944\n8431,3238\n8431,5326\n8431,5591\n8431,6298\n8431,7698\n8431,7768\n8431,13137\n8431,19443\n8431,23287\n8431,32751\n8431,37088\n8432,422\n8433,163\n8433,21442\n8434,527\n8435,34\n8435,58\n8435,167\n8435,261\n8435,304\n8435,424\n8435,509\n8435,518\n8435,720\n8435,868\n8435,877\n8435,973\n8435,999\n8435,1167\n8435,1284\n8435,1326\n8435,1715\n8435,1718\n8435,2209\n8435,3804\n8435,5591\n8435,5718\n8435,7155\n8435,9015\n8435,21944\n8435,26041\n8435,94134\n8437,63\n8437,251\n8437,252\n8437,318\n8437,465\n8437,516\n8437,1220\n8437,1222\n8437,1243\n8437,1512\n8437,5992\n8437,41170\n8438,393\n8438,980\n8438,1400\n8439,63\n8441,143\n8441,442\n8441,1052\n8441,2156\n8442,535\n8442,2944\n8444,1644\n8445,37\n8445,356\n8445,1782\n8447,7614\n8448,996\n8449,143\n8450,163\n8450,302\n8450,2116\n8451,135\n8451,215\n8451,372\n8451,417\n8451,704\n8451,714\n8451,760\n8451,932\n8451,1016\n8451,1085\n8451,1149\n8451,1212\n8451,1257\n8451,1287\n8451,1289\n8451,1818\n8451,2105\n8451,2205\n8451,2286\n8451,2315\n8451,3085\n8451,3507\n8451,4218\n8451,4237\n8451,33424\n8451,182162\n8452,34\n8452,35\n8452,222\n8452,283\n8452,389\n8452,536\n8452,657\n8452,694\n8452,720\n8452,781\n8452,877\n8452,907\n8452,1019\n8452,1072\n8452,1284\n8452,1467\n8452,1522\n8452,1718\n8452,1732\n8452,1881\n8452,1955\n8452,2191\n8452,2266\n8452,2671\n8452,2699\n8452,2784\n8452,3115\n8452,3194\n8452,3422\n8452,4594\n8452,5976\n8452,6888\n8452,29475\n8452,42232\n8453,2735\n8455,163\n8455,305\n8455,447\n8455,849\n8455,1132\n8455,8501\n8456,1635\n8457,586\n8458,364\n8459,107\n8460,1363\n8461,264\n8462,743\n8465,163\n8466,500\n8467,1962\n8468,1151\n8468,1363\n8468,1836\n8468,2697\n8469,1052\n8470,1882\n8471,2775\n8472,54\n8473,2210\n8473,4237\n8474,269\n8474,843\n8475,4895\n8476,2867\n8476,2868\n8477,163\n8477,934\n8478,34\n8478,35\n8479,356\n8479,852\n8479,5718\n8480,22\n8481,72\n8482,79\n8483,4\n8483,5\n8483,135\n8483,192\n8483,209\n8483,779\n8483,1010\n8483,1014\n8483,1235\n8483,1345\n8483,1531\n8483,2073\n8483,2416\n8483,2417\n8483,5718\n8483,9005\n8483,138775\n8484,376\n8485,885\n8486,252\n8486,442\n8486,1220\n8486,1222\n8487,192\n8488,68\n8488,175\n8488,387\n8488,1912\n8488,3115\n8488,22071\n8489,372\n8490,516\n8491,733\n8492,1740\n8493,81\n8494,932\n8496,1127\n8497,1722\n8498,430\n8498,994\n8498,3816\n8498,3817\n8499,107\n8500,1844\n8502,417\n8503,143\n8504,167\n8504,2083\n8504,3218\n8505,417\n8505,420\n8506,3507\n8507,302\n8507,579\n8507,861\n8508,3\n8509,83\n8510,178\n8510,611\n8510,1332\n8510,193129\n8511,1179\n8512,1282\n8513,178\n8514,147\n8514,406\n8514,779\n8514,1181\n8514,4193\n8515,202\n8515,483\n8515,920\n8516,652\n8517,269\n8518,3507\n8519,387\n8520,336\n8521,1531\n8522,887\n8523,364\n8524,20\n8525,1411\n8525,2006\n8526,852\n8527,151\n8528,86\n8528,167\n8528,589\n8528,605\n8528,615\n8528,907\n8528,973\n8528,1001\n8528,1124\n8528,1167\n8528,1782\n8528,1785\n8528,1955\n8528,3193\n8528,3207\n8528,221279\n8528,221280\n8528,221281\n8528,221284\n8528,221291\n8528,221323\n8528,221328\n8528,221332\n8529,215\n8529,240\n8529,289\n8529,290\n8529,372\n8529,417\n8529,592\n8529,631\n8529,704\n8529,714\n8529,932\n8529,1012\n8529,1016\n8529,1082\n8529,1085\n8529,1119\n8529,1212\n8529,1257\n8529,1285\n8529,1392\n8529,1511\n8529,1564\n8529,1631\n8529,1635\n8529,1785\n8529,1818\n8529,1882\n8529,1955\n8529,2205\n8529,2206\n8529,2210\n8529,2286\n8529,2296\n8529,2315\n8529,2620\n8529,2775\n8529,2995\n8529,3069\n8529,3695\n8529,4218\n8529,4237\n8529,33424\n8529,94134\n8529,198174\n8530,1117\n8531,163\n8532,392\n8533,818\n8534,86\n8534,167\n8534,299\n8534,941\n8534,1522\n8534,1849\n8534,2443\n8534,16614\n8534,32784\n8535,240\n8535,435\n8535,455\n8535,457\n8535,467\n8535,536\n8535,868\n8535,1433\n8538,50\n8538,336\n8539,781\n8540,8541\n8541,6837\n8542,2775\n8543,447\n8544,306\n8544,307\n8545,3846\n8546,503\n8546,1257\n8546,3085\n8547,54\n8548,973\n8549,784\n8550,269\n8551,1571\n8551,13136\n8552,943\n8553,843\n8554,2646\n8554,2784\n8555,292\n8556,1474\n8557,4\n8557,5\n8557,107\n8557,200\n8557,442\n8557,784\n8557,805\n8557,885\n8557,994\n8557,1235\n8557,1335\n8557,21944\n8558,1019\n8559,6369\n8560,30\n8561,1359\n8562,433\n8563,356\n8563,3507\n8564,2775\n8565,447\n8566,1147\n8567,859\n8568,298\n8569,485\n8570,536\n8571,217\n8572,1722\n8573,1151\n8574,83\n8575,278\n8576,136\n8576,137\n8577,2506\n8578,2506\n8579,2506\n8580,2506\n8581,473\n8581,525\n8581,640\n8581,1010\n8581,1058\n8581,1265\n8581,1266\n8581,1607\n8581,1749\n8581,8072\n8581,90845\n8581,131675\n8582,875\n8583,79\n8583,192\n8583,72750\n8584,1\n8585,2209\n8586,158\n8587,160\n8588,83\n8589,4895\n8590,6357\n8591,328\n8592,1082\n8592,2775\n8593,143\n8594,1052\n8595,72\n8596,151\n8597,779\n8597,2931\n8597,8598\n8599,557\n8599,1368\n8600,980\n8601,8602\n8603,151\n8604,163\n8605,455\n8606,217\n8606,252\n8606,406\n8606,440\n8606,467\n8606,493\n8606,868\n8606,1417\n8606,1433\n8607,3\n8608,163\n8609,102\n8609,126\n8609,146\n8609,163\n8609,280\n8609,340\n8609,372\n8609,408\n8609,491\n8609,557\n8609,644\n8609,668\n8609,783\n8609,994\n8609,1467\n8609,1564\n8609,3451\n8609,3452\n8609,6487\n8609,17245\n8609,92476\n8610,2178\n8610,4545\n8610,56150\n8610,139010\n8611,104\n8612,298\n8613,485\n8614,1\n8615,298\n8616,485\n8617,1284\n8618,147\n8619,1309\n8620,8621\n8620,24795\n8620,82458\n8622,104\n8623,1119\n8624,1\n8624,94\n8624,184\n8624,206\n8624,2787\n8625,2116\n8626,83\n8626,285\n8626,455\n8626,1467\n8626,2590\n8626,2779\n8626,2784\n8626,4172\n8627,158\n8627,252\n8627,515\n8627,622\n8627,861\n8627,1433\n8627,1639\n8627,1715\n8628,949\n8629,163\n8630,602\n8631,86\n8632,104\n8632,294\n8632,431\n8632,631\n8632,784\n8632,805\n8632,1732\n8632,2675\n8632,8632\n8632,8633\n8632,55779\n8632,66297\n8632,72778\n8632,72784\n8632,74736\n8632,75192\n8632,75197\n8632,75206\n8632,75239\n8632,75257\n8632,75314\n8632,77038\n8632,77048\n8632,78453\n8632,82285\n8632,82306\n8632,110751\n8632,116689\n8634,422\n8635,163\n8636,8637\n8638,8639\n8640,140\n8641,336\n8642,58\n8642,272\n8642,563\n8642,795\n8642,1449\n8642,1821\n8642,2889\n8642,5708\n8643,8644\n8645,516\n8645,1220\n8645,1222\n8646,274\n8646,1116\n8647,2574\n8648,8649\n8650,376\n8651,372\n8651,1082\n8652,163\n8653,34\n8653,35\n8654,81\n8655,809\n8656,8657\n8656,17669\n8656,17673\n8656,17698\n8656,17701\n8656,18986\n8656,24255\n8656,24280\n8658,509\n8658,595\n8658,609\n8658,697\n8658,703\n8658,744\n8658,874\n8658,949\n8658,973\n8658,1140\n8658,1240\n8658,1805\n8658,1836\n8658,2334\n8658,3182\n8658,5469\n8658,19443\n8659,163\n8659,209\n8659,262\n8659,302\n8659,579\n8659,687\n8659,811\n8659,861\n8659,893\n8659,3769\n8659,258973\n8660,1240\n8661,32\n8661,392\n8661,697\n8661,1465\n8661,3003\n8662,56\n8662,250\n8662,349\n8662,435\n8662,1082\n8662,1243\n8662,1282\n8662,1623\n8662,1807\n8662,3612\n8662,6789\n8662,8463\n8662,162599\n8663,274\n8663,1116\n8664,10\n8665,8666\n8667,8668\n8670,346\n8672,1707\n8673,163\n8674,718\n8674,8675\n8676,259\n8676,397\n8676,685\n8676,2923\n8676,3524\n8676,4190\n8676,26450\n8677,298\n8678,485\n8679,3422\n8680,1515\n8681,8682\n8683,1955\n8684,2083\n8684,3218\n8685,801\n8686,186\n8686,818\n8686,941\n8686,1635\n8687,1370\n8688,83\n8689,2051\n8691,143\n8692,83\n8692,271\n8693,592\n8693,631\n8693,1119\n8693,1631\n8693,1635\n8693,2620\n8693,2995\n8694,304\n8694,1285\n8694,1715\n8694,1962\n8695,140\n8696,72\n8697,8698\n8699,275\n8699,277\n8700,211\n8700,1707\n8700,6051\n8701,272\n8702,1313\n8703,536\n8704,422\n8705,143\n8706,640\n8707,1749\n8707,3585\n8709,775\n8710,44\n8711,81\n8711,83\n8711,106\n8711,134\n8711,251\n8711,273\n8711,274\n8711,275\n8711,298\n8711,313\n8711,340\n8711,497\n8711,567\n8711,620\n8711,626\n8711,652\n8711,663\n8711,694\n8711,736\n8711,827\n8711,862\n8711,931\n8711,1058\n8711,1082\n8711,1113\n8711,1122\n8711,1127\n8711,1402\n8711,1732\n8711,1807\n8711,2315\n8711,2867\n8711,2868\n8711,3003\n8711,4039\n8711,4597\n8711,13136\n8711,145502\n8712,332\n8713,1298\n8714,5\n8714,977\n8714,1219\n8714,3108\n8714,4114\n8714,13288\n8714,14316\n8714,21389\n8714,22065\n8714,34988\n8714,35551\n8714,38221\n8714,48717\n8714,58963\n8714,79320\n8714,82109\n8714,82128\n8714,86667\n8714,117919\n8714,126380\n8714,136464\n8714,138120\n8714,174907\n8715,200\n8715,772\n8716,143\n8717,72\n8718,8719\n8719,37791\n8719,37792\n8720,666\n8720,743\n8720,95583\n8721,138\n8722,865\n8723,557\n8724,137\n8725,8719\n8726,138\n8727,865\n8728,557\n8729,118\n8729,4597\n8730,137\n8731,8719\n8732,143\n8733,138\n8734,865\n8735,557\n8736,137\n8737,143\n8738,118\n8738,4597\n8739,118\n8739,4597\n8740,8719\n8741,138\n8742,865\n8743,557\n8744,137\n8745,149\n8746,118\n8746,4597\n8747,557\n8748,557\n8749,557\n8750,302\n8751,1718\n8752,435\n8753,206\n8754,1425\n8756,861\n8757,772\n8758,2379\n8758,14674\n8759,1893\n8760,250\n8761,298\n8762,485\n8763,592\n8763,760\n8763,1402\n8763,1631\n8763,1818\n8763,2620\n8764,37\n8764,63\n8764,158\n8764,192\n8764,202\n8764,203\n8764,251\n8764,393\n8764,406\n8764,435\n8764,447\n8764,493\n8764,925\n8764,980\n8764,1181\n8764,1220\n8764,1222\n8764,1370\n8764,1388\n8764,1531\n8764,1740\n8764,1821\n8764,4455\n8764,5212\n8765,843\n8766,873\n8767,1801\n8768,1805\n8769,390\n8770,217\n8770,1019\n8772,527\n8773,1313\n8774,273\n8774,274\n8775,2116\n8776,301\n8777,2681\n8778,1309\n8778,1807\n8778,1955\n8778,2775\n8779,298\n8780,485\n8781,364\n8782,143\n8783,1368\n8784,8785\n8786,2351\n8787,8788\n8788,8788\n8789,151\n8790,269\n8791,818\n8792,2867\n8792,2868\n8792,22880\n8793,72\n8793,106\n8794,1634\n8794,4810\n8795,294\n8796,875\n8797,1309\n8799,143\n8800,631\n8801,1235\n8801,1335\n8801,5375\n8802,8803\n8804,932\n8805,10\n8805,211\n8805,309\n8805,310\n8805,483\n8805,485\n8805,4548\n8806,332\n8807,178\n8807,75912\n8808,500\n8808,718\n8808,893\n8808,1188\n8809,99\n8810,22\n8810,302\n8812,28\n8812,2775\n8812,4571\n8812,88820\n8813,1556\n8814,158\n8814,252\n8814,622\n8814,1433\n8815,525\n8816,8817\n8818,718\n8819,8820\n8820,2367\n8820,8820\n8821,289\n8821,290\n8821,1564\n8821,2205\n8821,4218\n8821,33424\n8822,779\n8823,1767\n8824,5440\n8825,1289\n8826,442\n8827,333\n8828,264\n8829,3999\n8830,264\n8831,264\n8831,333\n8831,1033\n8831,1381\n8831,1551\n8831,1639\n8832,264\n8833,1381\n8834,147\n8835,135\n8836,390\n8837,3041\n8838,1551\n8839,1007\n8840,1551\n8841,1\n8842,163\n8843,8844\n8845,5440\n8846,211\n8847,358\n8848,261\n8849,1381\n8850,1639\n8851,1858\n8852,1860\n8853,8854\n8855,8855\n8856,240\n8857,872\n8858,8859\n8860,388\n8860,623\n8860,1805\n8861,79\n8861,140\n8861,158\n8861,515\n8861,585\n8861,622\n8861,818\n8861,861\n8861,1639\n8861,1715\n8861,5440\n8862,8863\n8864,1010\n8864,1012\n8864,1122\n8864,1241\n8864,1849\n8865,8866\n8867,50\n8867,56\n8867,68\n8867,106\n8867,147\n8867,149\n8867,158\n8867,192\n8867,202\n8867,264\n8867,301\n8867,333\n8867,337\n8867,392\n8867,422\n8867,586\n8867,602\n8867,663\n8867,714\n8867,1085\n8867,1181\n8867,1210\n8867,1531\n8867,8868\n8867,30331\n8867,60576\n8867,118336\n8869,626\n8869,1140\n8869,1235\n8869,1284\n8869,9010\n8870,135\n8870,137\n8870,138\n8870,850\n8870,2105\n8871,143\n8871,2926\n8872,8873\n8872,111953\n8874,143\n8875,8876\n8877,8878\n8879,146\n8880,225\n8881,8882\n8883,8884\n8885,8886\n8887,435\n8888,1085\n8889,1858\n8890,1860\n8891,589\n8891,1001\n8892,483\n8893,483\n8894,932\n8895,3695\n8896,861\n8896,4823\n8897,8898\n8899,8900\n8901,586\n8902,1858\n8903,1860\n8904,147\n8904,158\n8904,206\n8904,261\n8904,1429\n8905,393\n8906,8907\n8907,33012\n8908,160\n8909,1204\n8910,202\n8910,203\n8911,8912\n8911,65375\n8911,85315\n8913,264\n8914,72\n8915,8916\n8917,8916\n8918,8916\n8919,8916\n8920,163\n8921,8922\n8923,163\n8924,8925\n8924,18086\n8927,163\n8929,50\n8929,79\n8929,393\n8929,406\n8929,493\n8929,585\n8929,586\n8929,592\n8929,704\n8929,1265\n8929,1266\n8929,1433\n8930,192\n8931,10\n8932,8933\n8934,8935\n8934,53166\n8934,58407\n8934,82107\n8934,83176\n8934,83634\n8934,89867\n8934,96991\n8936,306\n8936,307\n8937,8938\n8939,8940\n8941,163\n8941,264\n8941,1007\n8941,1551\n8941,36819\n8942,8943\n8944,779\n8944,818\n8944,68069\n8944,141912\n8945,8946\n8947,163\n8948,267\n8949,163\n8950,8951\n8952,1274\n8953,301\n8954,8955\n8954,56096\n8956,399\n8956,920\n8957,366\n8958,366\n8959,1323\n8960,102\n8961,1326\n8962,408\n8963,1707\n8964,8965\n8966,273\n8966,274\n8967,364\n8968,163\n8968,2116\n8969,195\n8969,493\n8970,87\n8970,687\n8971,146\n8971,336\n8971,406\n8971,1515\n8972,422\n8973,422\n8974,422\n8975,422\n8976,422\n8977,422\n8978,422\n8979,422\n8980,2944\n8981,1888\n8982,957\n8982,1247\n8982,1815\n8983,1181\n8984,1359\n8985,8986\n8985,40611\n8985,54119\n8985,68069\n8985,83803\n8985,95187\n8985,96394\n8985,106538\n8985,108679\n8985,108729\n8987,2506\n8988,273\n8988,274\n8992,8992\n9001,704\n9001,1402\n9004,704\n9008,145967\n9011,9011\n9011,9032\n9015,10\n9015,1309\n9015,3319\n9015,4190\n9015,15633\n9015,117263\n9015,219266\n9015,263342\n9015,263794\n9015,264535\n9021,823\n9021,2512\n9021,19413\n9024,1001\n9025,120\n9025,240\n9025,446\n9025,1012\n9025,2208\n9025,2411\n9025,9025\n9025,15424\n9025,166619\n9033,9034\n9033,16269\n9035,932\n9036,1276\n9037,349\n9037,392\n9037,687\n9037,697\n9037,861\n9037,868\n9037,1010\n9037,1390\n9037,2574\n9037,9038\n9037,70935\n9037,78833\n9037,84562\n9037,88990\n9037,89286\n9037,89287\n9037,94225\n9037,95467\n9037,97283\n9037,100758\n9037,104915\n9037,107456\n9037,108038\n9039,1773\n9039,14472\n9040,9041\n9042,9041\n9043,538\n9043,1531\n9044,9045\n9046,731\n9047,34\n9047,35\n9047,2646\n9048,143\n9049,9050\n9051,1140\n9052,163\n9053,1220\n9053,1222\n9055,130\n9055,140\n9055,264\n9055,323\n9055,479\n9055,595\n9055,652\n9055,736\n9055,1007\n9055,1289\n9055,1509\n9055,1551\n9055,1579\n9055,1659\n9055,1767\n9055,3999\n9055,9030\n9056,861\n9056,1623\n9056,4146\n9057,9058\n9059,143\n9060,9061\n9062,9063\n9064,273\n9064,422\n9064,1803\n9065,3830\n9066,483\n9067,2506\n9068,298\n9069,485\n9070,745\n9070,4411\n9070,16614\n9070,21944\n9071,4\n9071,5\n9071,649\n9071,1551\n9071,9542\n9072,718\n9073,9074\n9075,479\n9076,1132\n9077,130\n9078,1631\n9079,1696\n9079,3182\n9079,9080\n9079,20426\n9079,27448\n9079,28255\n9079,79607\n9079,79701\n9079,91922\n9079,161547\n9079,169179\n9079,191547\n9079,214548\n9079,225942\n9081,788\n9082,932\n9083,2048\n9084,83\n9085,328\n9086,615\n9087,1608\n9087,77315\n9088,1608\n9089,2045\n9090,48\n9090,515\n9091,596\n9091,1368\n9092,106\n9093,718\n9093,1417\n9093,1688\n9094,920\n9095,1102\n9096,298\n9097,485\n9099,9100\n9101,3246\n9101,3247\n9102,158\n9104,182\n9105,149\n9105,406\n9105,585\n9106,887\n9107,63\n9107,252\n9107,516\n9107,1220\n9107,1222\n9107,189842\n9108,9109\n9110,1571\n9110,13136\n9111,19\n9111,1531\n9111,1571\n9111,2266\n9111,2421\n9112,1082\n9113,872\n9114,1368\n9115,1368\n9116,736\n9117,718\n9117,3555\n9118,332\n9120,143\n9121,9121\n9122,450\n9123,87\n9123,1465\n9123,5366\n9124,163\n9125,1078\n9126,483\n9127,772\n9128,346\n9128,435\n9129,30\n9129,200\n9130,111\n9130,296\n9130,1659\n9130,3538\n9130,8788\n9130,29253\n9130,29294\n9131,579\n9132,143\n9133,240\n9134,54\n9135,211\n9136,422\n9136,602\n9137,1033\n9138,1417\n9138,4190\n9139,72\n9139,312\n9140,1127\n9140,1267\n9140,1893\n9140,2051\n9140,3999\n9140,49057\n9140,81070\n9141,255\n9142,143\n9143,163\n9144,9145\n9146,2244\n9147,485\n9148,207\n9149,1479\n9150,376\n9151,143\n9152,298\n9153,485\n9155,781\n9156,1235\n9156,1335\n9156,5375\n9157,9158\n9159,298\n9160,485\n9161,657\n9161,213089\n9162,298\n9163,485\n9164,485\n9165,9166\n9167,9168\n9169,2590\n9170,72\n9171,50\n9172,9173\n9174,9175\n9177,450\n9177,515\n9177,1381\n9177,2867\n9177,2868\n9177,22880\n9178,240\n9178,1285\n9178,1818\n9180,2572\n9181,298\n9182,485\n9183,298\n9184,485\n9185,312\n9186,9187\n9188,178\n9188,622\n9189,9190\n9192,68\n9193,1227\n9193,1229\n9194,9195\n9195,9195\n9196,273\n9196,274\n9197,1983\n9198,143\n9199,143\n9200,9201\n9202,298\n9202,1282\n9202,2286\n9203,20\n9204,20\n9205,143\n9206,206\n9207,1619\n9209,143\n9210,143\n9211,58\n9212,83\n9213,192\n9213,663\n9213,664\n9214,9215\n9216,9217\n9218,640\n9219,4935\n9220,9221\n9222,640\n9223,34\n9223,35\n9224,994\n9224,1235\n9224,1335\n9225,22\n9225,652\n9225,861\n9225,893\n9226,9227\n9226,93374\n9228,68\n9229,143\n9230,781\n9231,5\n9231,117\n9231,206\n9231,1118\n9231,2089\n9231,2617\n9231,2940\n9231,9239\n9231,9386\n9232,622\n9233,557\n9234,1963\n9235,298\n9236,485\n9237,298\n9238,485\n9240,424\n9241,9242\n9243,704\n9244,9245\n9246,1\n9247,2737\n9248,207\n9249,107\n9250,167\n9251,258\n9252,366\n9253,366\n9254,273\n9254,274\n9255,269\n9256,233\n9257,202\n9257,203\n9258,872\n9259,872\n9260,219\n9261,9262\n9261,26503\n9261,51069\n9261,52219\n9261,56531\n9261,57565\n9261,77362\n9261,81865\n9261,91436\n9261,91710\n9261,97438\n9261,99237\n9261,100356\n9261,105428\n9261,113457\n9261,118750\n9263,2105\n9264,9265\n9266,872\n9268,9269\n9270,328\n9270,7124\n9271,107\n9272,2416\n9272,2417\n9273,292\n9274,338\n9275,298\n9276,349\n9276,973\n9276,2572\n9277,1133\n9278,3538\n9279,1118\n9280,298\n9281,485\n9283,640\n9285,1151\n9286,10\n9287,1010\n9288,83\n9289,83\n9290,163\n9291,872\n9292,417\n9293,58\n9293,273\n9293,274\n9293,489\n9293,749\n9293,827\n9293,859\n9293,973\n9293,1127\n9293,1252\n9293,1253\n9293,1619\n9293,1623\n9293,1707\n9293,1844\n9293,6424\n9293,6556\n9293,21442\n9293,28107\n9294,273\n9294,274\n9294,515\n9294,620\n9294,1298\n9294,1388\n9294,1623\n9294,6556\n9294,28107\n9294,66500\n9295,874\n9296,9297\n9298,79\n9300,9301\n9300,14853\n9300,24469\n9300,44607\n9300,47421\n9300,57740\n9300,68018\n9300,77383\n9300,78305\n9300,113313\n9302,1707\n9303,107\n9303,3474\n9304,252\n9305,1803\n9306,344\n9307,687\n9307,1556\n9308,2506\n9309,687\n9310,872\n9311,872\n9312,872\n9313,872\n9314,872\n9315,872\n9316,2048\n9317,9318\n9319,143\n9320,26\n9320,47\n9320,59\n9320,200\n9320,206\n9320,885\n9320,887\n9320,994\n9320,1119\n9320,2244\n9320,2469\n9320,2674\n9320,8180\n9320,21826\n9320,21944\n9321,160\n9322,9323\n9324,119\n9325,58\n9326,333\n9328,949\n9329,682\n9330,32\n9330,349\n9330,392\n9330,644\n9330,697\n9330,809\n9330,3003\n9330,76096\n9330,127158\n9331,2506\n9332,2506\n9333,1\n9333,117\n9333,149\n9333,272\n9333,302\n9333,609\n9333,620\n9333,972\n9333,1353\n9333,1458\n9333,2156\n9333,2315\n9333,2512\n9333,2712\n9333,2775\n9333,3041\n9333,40360\n9333,181063\n9334,2506\n9335,2506\n9336,2506\n9337,996\n9338,81\n9338,390\n9338,422\n9338,447\n9338,518\n9338,640\n9338,682\n9338,704\n9338,801\n9338,873\n9338,874\n9338,907\n9338,934\n9338,1052\n9338,1068\n9338,1175\n9338,1177\n9338,1231\n9338,1298\n9338,1300\n9338,1309\n9338,1370\n9338,1411\n9338,1454\n9338,1715\n9338,1782\n9338,1785\n9338,1849\n9338,2006\n9338,2353\n9338,2480\n9338,2590\n9338,2699\n9338,2784\n9338,3193\n9338,3474\n9338,3804\n9339,932\n9340,301\n9340,567\n9340,604\n9340,605\n9340,615\n9340,937\n9340,968\n9340,1293\n9340,1782\n9340,2372\n9340,3422\n9341,1282\n9342,372\n9342,1085\n9342,1119\n9342,1462\n9342,1659\n9342,1962\n9342,2156\n9342,6068\n9342,8537\n9342,9343\n9344,647\n9345,344\n9346,63\n9346,483\n9346,557\n9346,1058\n9346,1319\n9346,1732\n9346,42009\n9347,65\n9347,85\n9347,1058\n9347,1247\n9348,615\n9349,143\n9350,222\n9351,79\n9352,422\n9353,56\n9355,1235\n9355,1335\n9360,24\n9360,25\n9360,26\n9360,59\n9360,60\n9360,114\n9360,884\n9360,885\n9360,886\n9360,887\n9360,2088\n9360,4079\n9360,9537\n9360,9539\n9360,21944\n9360,44244\n9360,154690\n9361,4\n9361,5\n9361,483\n9361,818\n9361,861\n9361,1212\n9361,2089\n9361,2105\n9361,2940\n9362,577\n9363,872\n9364,217\n9365,37\n9365,1782\n9366,859\n9367,22\n9367,192\n9367,2135\n9367,6051\n9368,749\n9368,1146\n9369,850\n9370,2334\n9371,149\n9371,158\n9371,55849\n9372,355\n9372,4810\n9373,10\n9374,37\n9374,68\n9374,106\n9374,202\n9374,203\n9374,225\n9374,328\n9374,349\n9374,358\n9374,388\n9374,389\n9374,390\n9374,422\n9374,455\n9374,518\n9374,557\n9374,595\n9374,640\n9374,704\n9374,726\n9374,775\n9374,801\n9374,873\n9374,874\n9374,907\n9374,932\n9374,934\n9374,1010\n9374,1052\n9374,1068\n9374,1140\n9374,1167\n9374,1175\n9374,1177\n9374,1231\n9374,1241\n9374,1274\n9374,1298\n9374,1300\n9374,1309\n9374,1370\n9374,1411\n9374,1452\n9374,1454\n9374,1467\n9374,1479\n9374,1579\n9374,1715\n9374,1782\n9374,1785\n9374,1801\n9374,1837\n9374,1849\n9374,2006\n9374,2116\n9374,2353\n9374,2480\n9374,2590\n9374,2620\n9374,2699\n9374,2784\n9374,3193\n9374,3474\n9374,3804\n9374,4637\n9374,5662\n9375,438\n9375,718\n9375,972\n9376,2334\n9377,417\n9378,143\n9381,182\n9381,188\n9381,206\n9381,1265\n9381,1266\n9381,4453\n9381,7652\n9382,1007\n9383,143\n9384,852\n9384,877\n9384,1010\n9384,1402\n9384,2373\n9384,2590\n9385,433\n9386,9386\n9387,1265\n9387,1266\n9387,7652\n9388,143\n9389,252\n9390,46\n9390,58\n9391,104\n9391,298\n9391,372\n9391,442\n9391,714\n9391,1715\n9391,2286\n9392,433\n9393,649\n9394,1\n9394,10\n9394,50\n9394,56\n9394,98\n9394,99\n9394,139\n9394,147\n9394,149\n9394,158\n9394,195\n9394,206\n9394,285\n9394,333\n9394,406\n9394,505\n9394,602\n9394,640\n9394,779\n9394,841\n9394,1181\n9394,1198\n9394,1218\n9394,1425\n9394,1458\n9394,1464\n9394,1515\n9394,1825\n9394,2132\n9394,2244\n9394,2451\n9394,3571\n9394,3895\n9394,3970\n9394,4627\n9394,9394\n9394,9424\n9394,9700\n9394,15330\n9394,15795\n9394,17151\n9394,18997\n9394,19782\n9394,21442\n9394,31238\n9394,41385\n9394,42064\n9394,68370\n9394,75249\n9394,80266\n9394,85525\n9394,87743\n9394,95314\n9394,104926\n9394,118336\n9394,130983\n9394,141912\n9394,170758\n9394,180187\n9394,184913\n9394,202201\n9394,229833\n9394,234693\n9394,236469\n9394,240174\n9394,241735\n9394,243184\n9394,243191\n9394,243561\n9394,243576\n9394,243862\n9394,243891\n9394,244255\n9394,244495\n9394,244513\n9394,244630\n9394,244742\n9394,244773\n9394,244874\n9394,244955\n9394,245517\n9394,245654\n9394,245674\n9394,246106\n9394,246773\n9394,246881\n9394,247220\n9394,247237\n9394,247400\n9394,249213\n9394,250100\n9394,250766\n9394,250972\n9394,251607\n9394,253646\n9394,254870\n9394,255187\n9394,255265\n9394,255786\n9394,256188\n9394,256376\n9394,256436\n9394,257967\n9394,258284\n9394,258555\n9394,259455\n9394,259607\n9394,261035\n9394,261040\n9394,261398\n9394,261734\n9394,262111\n9394,262547\n9394,263439\n9394,263445\n9394,263598\n9394,263773\n9394,263989\n9394,264218\n9394,264735\n9395,9396\n9395,34680\n9395,44779\n9397,30\n9397,104\n9397,704\n9398,934\n9399,1579\n9400,1639\n9401,1370\n9402,7\n9402,182\n9402,188\n9402,202\n9402,203\n9402,206\n9402,1265\n9402,1266\n9402,4453\n9402,7652\n9403,483\n9404,422\n9405,56\n9406,7\n9406,182\n9406,188\n9406,206\n9406,4453\n9407,781\n9408,143\n9409,760\n9410,3079\n9411,143\n9412,309\n9412,310\n9413,781\n9414,68\n9414,433\n9414,1634\n9415,48\n9416,1858\n9417,1860\n9418,312\n9419,452\n9419,918\n9420,932\n9421,586\n9421,1707\n9422,250\n9423,1688\n9424,344\n9424,240174\n9425,805\n9426,861\n9426,893\n9426,1374\n9427,143\n9428,143\n9429,775\n9430,143\n9431,7\n9431,1265\n9431,1266\n9431,7652\n9432,163\n9433,167\n9434,22\n9435,500\n9437,1116\n9437,2460\n9438,435\n9439,2775\n9440,143\n9441,1149\n9441,4218\n9442,9443\n9444,9445\n9446,718\n9446,893\n9447,143\n9447,1052\n9448,65\n9448,360\n9449,9450\n9451,760\n9452,376\n9453,9453\n9454,346\n9455,143\n9456,3148\n9456,9457\n9457,20\n9457,259\n9457,299\n9457,441\n9457,505\n9457,567\n9457,676\n9457,693\n9457,733\n9457,752\n9457,843\n9457,849\n9457,911\n9457,972\n9457,1147\n9457,1172\n9457,1191\n9457,1204\n9457,1240\n9457,1293\n9457,1326\n9457,1345\n9457,1402\n9457,1417\n9457,1462\n9457,1566\n9457,1776\n9457,1973\n9457,1992\n9457,2373\n9457,2512\n9457,2704\n9457,3367\n9457,3392\n9457,3653\n9457,4039\n9457,4276\n9457,5213\n9457,8537\n9457,9457\n9457,17241\n9457,18298\n9457,21442\n9457,35315\n9457,37202\n9457,41441\n9457,59709\n9457,70229\n9457,74969\n9457,75912\n9457,76199\n9457,80658\n9457,95971\n9457,99732\n9457,102755\n9457,103322\n9457,104522\n9457,115474\n9457,117807\n9457,117961\n9457,131862\n9457,139598\n9457,139929\n9457,159621\n9457,175973\n9457,194327\n9457,205156\n9457,212902\n9457,218369\n9457,229100\n9457,230266\n9457,230419\n9457,238926\n9457,244703\n9457,244756\n9457,244772\n9457,244776\n9457,244814\n9457,248258\n9457,248868\n9457,250540\n9457,250908\n9457,256273\n9457,260742\n9457,264351\n9458,206\n9458,1888\n9458,8675\n9459,9460\n9461,273\n9461,274\n9462,22\n9463,120\n9464,184\n9465,682\n9465,731\n9465,1509\n9467,694\n9467,2775\n9467,3623\n9468,163\n9468,302\n9468,579\n9469,1893\n9470,2837\n9472,1019\n9472,4177\n9473,135\n9474,135\n9474,772\n9475,143\n9477,434\n9477,939\n9478,557\n9479,50\n9481,557\n9482,557\n9483,2416\n9483,2417\n9484,83\n9484,120\n9484,217\n9484,273\n9484,1052\n9485,10\n9485,9486\n9485,22870\n9485,43477\n9485,46477\n9485,47532\n9485,54109\n9485,55229\n9485,56034\n9485,57679\n9485,58648\n9485,59847\n9485,75696\n9485,79113\n9485,80185\n9485,81919\n9485,83283\n9485,84308\n9485,89947\n9485,92570\n9485,92837\n9485,93898\n9485,94664\n9485,99410\n9485,102711\n9485,102953\n9485,104975\n9487,2244\n9488,557\n9489,862\n9491,143\n9491,1052\n9492,9493\n9494,160\n9494,652\n9494,1127\n9494,1551\n9494,1893\n9494,3041\n9495,261\n9496,392\n9497,602\n9498,9499\n9500,1955\n9500,8541\n9501,9502\n9503,22\n9503,652\n9503,861\n9503,1070\n9504,160\n9504,264\n9504,515\n9504,1007\n9504,1147\n9504,1452\n9504,1551\n9504,3041\n9504,3999\n9504,5440\n9504,49057\n9505,192\n9506,1849\n9507,151\n9508,392\n9509,1608\n9510,1089\n9510,1623\n9511,1858\n9512,1860\n9513,2411\n9514,415\n9515,143\n9516,2156\n9516,4571\n9516,88820\n9516,95554\n9516,129534\n9517,640\n9518,149\n9519,217\n9520,9521\n9522,2506\n9523,2506\n9524,2506\n9525,422\n9526,143\n9526,527\n9526,740\n9526,741\n9526,743\n9526,1052\n9527,136\n9527,137\n9527,525\n9527,1531\n9528,1433\n9529,200\n9529,298\n9529,636\n9529,772\n9529,2205\n9529,2286\n9529,33424\n9530,9531\n9532,620\n9532,1425\n9533,779\n9534,195\n9535,143\n9542,9542\n9543,261\n9543,604\n9543,7572\n9544,372\n9544,1010\n9544,1241\n9544,1479\n9544,1849\n9545,718\n9546,505\n9547,1370\n9549,2506\n9550,1359\n9551,9552\n9554,149\n9554,406\n9554,1181\n9554,1590\n9554,68069\n9555,1782\n9556,310\n9557,9558\n9557,57743\n9559,9560\n9560,9560\n9561,301\n9561,314\n9561,968\n9561,1293\n9561,3422\n9562,9563\n9564,72\n9565,72\n9566,344\n9567,285\n9568,422\n9569,422\n9570,422\n9571,422\n9572,422\n9573,422\n9574,422\n9575,422\n9576,422\n9577,9578\n9577,14542\n9577,15894\n9577,57609\n9577,81304\n9577,84536\n9577,98318\n9579,147\n9579,202\n9579,301\n9579,392\n9579,510\n9579,577\n9579,1014\n9579,1370\n9579,1531\n9580,4101\n9581,72\n9582,147\n9582,158\n9582,640\n9583,9584\n9585,10\n9585,72\n9585,175\n9585,4980\n9585,13919\n9586,9587\n9586,43509\n9586,43677\n9586,51134\n9586,53893\n9586,57507\n9586,65963\n9586,69677\n9586,94936\n9586,101313\n9586,106631\n9586,108073\n9586,109798\n9586,112721\n9586,113792\n9586,115976\n9586,126595\n9586,127322\n9586,127814\n9588,9589\n9591,72\n9592,2351\n9593,8788\n9594,9595\n9596,1240\n9597,10\n9597,52\n9597,1773\n9597,9597\n9597,9598\n9597,31977\n9597,126435\n9597,139245\n9597,177639\n9597,218834\n9597,221340\n9600,158\n9602,26\n9602,59\n9602,94\n9602,2089\n9602,2940\n9603,167\n9603,299\n9603,397\n9604,2296\n9605,1452\n9606,9607\n9608,9609\n9610,9611\n9612,9613\n9612,45599\n9614,577\n9615,217\n9615,1429\n9615,3467\n9616,9617\n9618,366\n9619,366\n9621,292\n9622,294\n9623,296\n9624,298\n9625,304\n9625,843\n9626,5440\n9627,211\n9628,424\n9628,640\n9628,843\n9628,1012\n9628,1749\n9628,7155\n9629,20\n9630,611\n9631,9632\n9633,9634\n9635,26\n9635,59\n9635,94\n9635,1235\n9635,1335\n9635,2787\n9635,3794\n9635,21944\n9636,9637\n9638,9639\n9640,167\n9640,1284\n9640,2979\n9641,9642\n9643,9644\n9645,9645\n9646,3507\n9647,233\n9648,9649\n9650,163\n9651,9652\n9653,182\n9653,188\n9653,206\n9653,1844\n9653,4453\n9654,20\n9655,163\n9656,163\n9657,640\n9657,841\n9658,292\n9659,652\n9660,163\n9661,163\n9662,163\n9663,160\n9664,634\n9665,163\n9666,163\n9667,163\n9668,388\n9669,163\n9670,163\n9671,163\n9671,302\n9672,163\n9673,515\n9674,518\n9675,163\n9676,163\n9676,392\n9677,255\n9678,4\n9678,5\n9678,163\n9678,255\n9678,309\n9678,310\n9679,22\n9679,442\n9679,1392\n9680,693\n9681,518\n9682,163\n9683,163\n9684,34\n9684,35\n9684,77\n9684,148742\n9685,163\n9686,586\n9687,72\n9688,338\n9689,149\n9689,1127\n9690,140\n9690,163\n9690,209\n9690,302\n9690,489\n9690,811\n9690,861\n9690,893\n9690,1007\n9690,2116\n9690,6880\n9691,163\n9692,163\n9693,1363\n9694,163\n9695,579\n9696,2116\n9697,163\n9698,599\n9699,163\n9700,104\n9700,163\n9701,278\n9701,455\n9701,852\n9701,2424\n9702,167\n9702,2191\n9702,3218\n9702,199199\n9702,207045\n9703,163\n9704,163\n9705,397\n9706,143\n9707,868\n9708,301\n9708,694\n9709,163\n9710,163\n9711,271\n9712,287\n9713,3451\n9713,3452\n9714,424\n9715,32\n9716,1181\n9717,1512\n9717,5992\n9718,163\n9719,79\n9719,1531\n9720,207\n9721,366\n9721,500\n9722,163\n9723,163\n9723,302\n9723,489\n9723,811\n9724,163\n9726,304\n9726,1715\n9727,387\n9728,20\n9729,278\n9729,379\n9729,457\n9729,838\n9729,891\n9729,1240\n9729,21982\n9730,644\n9731,255\n9732,811\n9732,1452\n9733,163\n9735,687\n9735,1556\n9737,163\n9737,868\n9738,336\n9738,2371\n9739,104\n9739,111\n9739,134\n9739,372\n9739,441\n9739,442\n9739,631\n9739,636\n9739,749\n9739,775\n9739,784\n9739,999\n9739,1140\n9739,2209\n9739,3474\n9739,4771\n9741,143\n9742,875\n9743,217\n9743,389\n9743,707\n9743,875\n9743,1019\n9743,1881\n9743,2253\n9744,1877\n9745,163\n9746,9323\n9747,79\n9747,4455\n9747,68069\n9748,1801\n9749,163\n9749,1436\n9750,163\n9751,130\n9751,841\n9751,920\n9752,2646\n9752,6506\n9753,163\n9754,46\n9754,99\n9754,233\n9754,292\n9754,332\n9754,525\n9754,586\n9754,592\n9754,631\n9754,954\n9754,972\n9754,2286\n9754,3695\n9754,10318\n9754,42628\n9755,163\n9756,54\n9756,83\n9756,283\n9756,347\n9756,392\n9756,455\n9756,536\n9756,623\n9756,673\n9756,694\n9756,697\n9756,781\n9756,808\n9756,1019\n9756,1201\n9756,1240\n9756,1274\n9756,1465\n9756,1860\n9756,2168\n9756,3367\n9756,6059\n9756,6789\n9756,6955\n9757,1425\n9758,781\n9759,1370\n9760,206\n9761,2051\n9761,49057\n9762,818\n9763,302\n9763,515\n9763,579\n9763,687\n9763,861\n9763,893\n9763,3769\n9764,163\n9765,255\n9766,301\n9766,1298\n9766,1381\n9766,1452\n9766,1639\n9767,392\n9767,1140\n9769,151\n9770,306\n9770,307\n9771,9772\n9773,9774\n9775,9776\n9777,9778\n9779,1858\n9780,1860\n9781,9782\n9783,9784\n9785,623\n9785,1805\n9786,178\n9786,1531\n9787,887\n9787,1235\n9787,1335\n9788,660\n9788,2424\n9788,2944\n9788,6506\n9790,134\n9791,9792\n9793,9794\n9795,9796\n9797,9798\n9799,9800\n9801,9802\n9803,9804\n9805,9806\n9807,9808\n9809,9810\n9811,9812\n9813,9814\n9815,9816\n9817,9818\n9820,9821\n9822,9823\n9824,9825\n9826,9827\n9828,9829\n9830,9831\n9832,9833\n9834,9835\n9836,9837\n9838,9839\n9840,9841\n9842,9843\n9844,9845\n9846,9847\n9848,9849\n9850,9851\n9852,9853\n9854,9855\n9856,9857\n9858,9859\n9860,9861\n9862,9863\n9864,9865\n9866,9867\n9868,9869\n9870,9871\n9872,9873\n9874,54\n9875,9876\n9877,9878\n9879,9880\n9881,9882\n9883,9884\n9885,9886\n9887,9888\n9889,818\n9890,9891\n9892,9893\n9894,9895\n9896,163\n9896,2116\n9897,9898\n9899,9900\n9901,9902\n9903,9904\n9905,9906\n9907,9908\n9909,9910\n9911,9912\n9913,9914\n9915,9916\n9917,9918\n9919,9920\n9921,9922\n9923,9924\n9925,9926\n9927,9928\n9929,9930\n9931,9932\n9933,9934\n9935,9936\n9937,9938\n9939,9940\n9941,9942\n9943,9944\n9945,9946\n9947,9948\n9949,9950\n9951,9952\n9953,9954\n9955,9956\n9957,9958\n9959,9960\n9961,9962\n9963,9964\n9965,9966\n9967,9968\n9969,9970\n9971,9972\n9973,9974\n9975,9976\n9977,1127\n9978,9979\n9980,9981\n9982,9983\n9984,9985\n9986,9987\n9988,9989\n9990,9991\n9992,9993\n9994,9995\n9996,9997\n9998,9999\n10000,10001\n10002,10003\n10004,10005\n10006,10007\n10008,10009\n10010,10011\n10012,10013\n10014,10015\n10016,10017\n10018,10019\n10020,10021\n10022,10023\n10024,10025\n10026,1858\n10027,1860\n10028,10029\n10030,10031\n10032,10033\n10034,10035\n10036,10037\n10038,10039\n10040,10041\n10042,10043\n10044,10045\n10046,10047\n10048,10049\n10050,10051\n10052,10053\n10054,10055\n10056,10057\n10058,10059\n10060,10061\n10062,10063\n10064,10065\n10066,10067\n10068,10069\n10070,10071\n10072,10073\n10074,10075\n10076,10077\n10078,10079\n10080,10081\n10082,10083\n10084,10085\n10086,10087\n10088,10089\n10090,10091\n10092,10093\n10094,10095\n10096,10097\n10098,10099\n10100,10101\n10102,10103\n10104,10105\n10106,72\n10107,10108\n10109,10110\n10111,10112\n10113,10114\n10115,10116\n10117,10118\n10119,10120\n10121,10122\n10123,10124\n10125,10126\n10127,10128\n10129,10130\n10131,10132\n10133,10134\n10135,10136\n10137,10138\n10139,10140\n10141,10142\n10143,10144\n10145,298\n10145,752\n10145,1368\n10145,1458\n10145,1579\n10145,4355\n10146,10147\n10148,10149\n10150,10151\n10152,10153\n10154,10155\n10156,10157\n10158,10159\n10160,10161\n10162,10163\n10164,10165\n10166,10167\n10168,10169\n10170,10171\n10172,10173\n10174,10175\n10176,10177\n10178,10179\n10180,10181\n10182,10183\n10184,10185\n10186,315\n10187,10188\n10189,10190\n10191,10192\n10193,10194\n10195,10196\n10197,10198\n10199,10200\n10201,1353\n10202,10203\n10204,10205\n10206,10207\n10208,10209\n10210,10211\n10212,10213\n10214,10215\n10216,752\n10216,1210\n10217,10218\n10219,10220\n10221,10222\n10223,10224\n10225,10226\n10227,2775\n10228,10229\n10230,10231\n10232,10233\n10234,10235\n10236,10237\n10238,10239\n10240,10241\n10242,10243\n10244,10245\n10246,10247\n10248,10249\n10250,10251\n10252,10253\n10254,10255\n10256,10257\n10258,10259\n10260,10261\n10262,10263\n10264,10265\n10266,10267\n10268,10269\n10270,10271\n10272,10273\n10274,10275\n10276,10277\n10278,10279\n10280,10281\n10282,10283\n10284,10285\n10286,10287\n10288,10289\n10290,10291\n10292,10293\n10294,10295\n10296,10297\n10298,10299\n10300,10301\n10302,10303\n10304,10305\n10306,10307\n10308,10309\n10310,10311\n10312,10313\n10314,10315\n10316,10317\n10318,954\n10318,1282\n10318,1690\n10318,1939\n10318,10318\n10318,50399\n10318,71900\n10318,71909\n10318,71921\n10318,72077\n10319,10320\n10321,10322\n10323,10324\n10325,10326\n10327,10328\n10329,10330\n10331,10332\n10333,10334\n10335,10336\n10337,10338\n10339,10340\n10341,10342\n10343,10344\n10345,10346\n10347,10348\n10349,10350\n10351,10352\n10353,10354\n10355,10356\n10357,10358\n10359,10360\n10361,10362\n10363,86\n10364,10365\n10366,10367\n10368,10369\n10370,10371\n10372,10373\n10374,10375\n10376,10377\n10378,10379\n10380,10381\n10382,10383\n10384,10385\n10386,10387\n10388,10389\n10390,10391\n10392,87\n10392,255\n10392,258\n10393,10394\n10395,10396\n10397,273\n10397,274\n10397,310\n10397,483\n10397,3039\n10398,10399\n10400,10401\n10402,10403\n10404,10405\n10406,195\n10407,10408\n10409,10410\n10411,10412\n10413,10414\n10415,10416\n10417,10418\n10419,10420\n10421,10422\n10423,10424\n10425,10426\n10427,10428\n10429,10430\n10431,10432\n10433,10434\n10435,10436\n10437,10438\n10439,10440\n10441,10442\n10443,10444\n10445,10446\n10447,10448\n10449,10450\n10451,10452\n10453,10454\n10455,640\n10456,10457\n10458,10459\n10460,10461\n10462,640\n10463,10464\n10465,10466\n10467,10468\n10469,10470\n10471,10472\n10473,10474\n10475,10476\n10477,10478\n10479,10480\n10481,10482\n10483,10484\n10485,10486\n10487,10488\n10489,10490\n10491,10492\n10493,10494\n10495,10496\n10497,10498\n10499,135\n10500,10501\n10502,10503\n10504,10505\n10506,10507\n10508,10509\n10510,10511\n10512,10513\n10514,10515\n10516,640\n10517,10518\n10519,10520\n10521,10522\n10523,10524\n10525,9029\n10526,10527\n10528,10529\n10530,10531\n10532,10533\n10534,10535\n10536,10537\n10538,10539\n10540,10541\n10542,10543\n10544,10545\n10546,10547\n10548,581\n10549,10550\n10551,10552\n10553,10554\n10555,10556\n10557,10558\n10559,911\n10560,10561\n10562,10563\n10564,10565\n10566,10567\n10568,10569\n10570,10571\n10572,10573\n10574,10575\n10576,10577\n10578,10579\n10580,10581\n10582,10583\n10584,10585\n10586,10587\n10588,10589\n10590,10591\n10592,10593\n10594,10595\n10596,10597\n10598,10599\n10600,10601\n10602,10603\n10604,10605\n10606,10607\n10608,10609\n10610,10611\n10612,10613\n10614,10615\n10616,2681\n10617,10618\n10619,10620\n10621,10622\n10623,10624\n10625,10626\n10627,10628\n10629,10630\n10631,10632\n10633,10634\n10635,10636\n10637,10638\n10640,10641\n10642,10643\n10644,163\n10644,579\n10645,10646\n10647,10648\n10649,10650\n10651,10652\n10653,10654\n10655,10656\n10657,1858\n10658,1860\n10659,10660\n10661,163\n10662,10663\n10664,10665\n10666,10667\n10668,10669\n10670,10671\n10672,10673\n10674,10675\n10676,10677\n10678,10679\n10680,10681\n10682,10683\n10684,10685\n10686,1127\n10687,10688\n10689,10690\n10691,10692\n10693,10694\n10695,10696\n10697,10698\n10699,10700\n10701,10702\n10703,10704\n10705,10706\n10707,10708\n10709,10710\n10711,10712\n10713,10714\n10715,10716\n10717,10718\n10719,10720\n10721,10722\n10723,10724\n10725,10726\n10727,10728\n10729,10730\n10731,10732\n10733,10734\n10735,10736\n10737,10738\n10739,10740\n10741,10742\n10743,10744\n10745,10746\n10747,37\n10747,1551\n10747,3999\n10748,10749\n10750,10751\n10752,10753\n10754,10755\n10756,10757\n10758,10759\n10760,10761\n10762,10763\n10764,10765\n10766,10767\n10768,10769\n10770,10771\n10772,10773\n10774,1836\n10775,10776\n10777,10778\n10779,10780\n10781,10782\n10783,10784\n10785,10786\n10787,1893\n10788,10789\n10790,10791\n10792,1262\n10793,10794\n10795,10796\n10797,10798\n10799,10800\n10801,10802\n10803,10804\n10805,10806\n10807,10808\n10809,10810\n10811,10812\n10813,10814\n10815,10816\n10817,10818\n10819,10820\n10821,10822\n10823,10824\n10825,10826\n10827,10828\n10829,10830\n10831,10832\n10833,10834\n10835,10836\n10837,10838\n10839,10840\n10841,10842\n10843,10844\n10845,10846\n10847,10848\n10849,10850\n10851,10852\n10853,10854\n10855,10856\n10857,10858\n10859,10860\n10861,10862\n10863,10864\n10865,10866\n10867,10868\n10869,10870\n10871,10872\n10873,10874\n10875,10876\n10877,10878\n10879,10880\n10881,10882\n10883,10884\n10885,10886\n10887,10888\n10889,10890\n10891,10892\n10893,10894\n10895,10896\n10897,10898\n10899,10900\n10901,10902\n10903,10904\n10905,10906\n10907,10908\n10909,10910\n10911,10912\n10913,10914\n10915,10916\n10917,10918\n10919,10920\n10921,10922\n10923,10924\n10925,10926\n10927,10928\n10929,10930\n10931,10932\n10933,10934\n10935,10936\n10937,10938\n10939,10940\n10941,10942\n10943,10944\n10945,10946\n10947,10948\n10949,10950\n10951,10952\n10953,10954\n10955,10956\n10957,10958\n10959,10960\n10961,10962\n10963,10964\n10965,10966\n10967,10968\n10969,10970\n10971,10972\n10973,10974\n10975,10976\n10977,10978\n10979,10980\n10981,10982\n10983,10984\n10985,10986\n10987,10988\n10989,10990\n10991,10992\n10993,10994\n10995,10996\n10997,10998\n10999,11000\n11001,11002\n11003,11004\n11005,11006\n11007,11008\n11009,11010\n11011,11012\n11013,11014\n11015,2681\n11015,33535\n11015,61597\n11015,61602\n11015,61810\n11015,168211\n11015,173005\n11016,11017\n11018,11019\n11020,11021\n11022,11023\n11024,11025\n11026,11027\n11028,11029\n11030,11031\n11032,11033\n11034,11035\n11036,11037\n11038,11039\n11040,11041\n11042,11043\n11044,11045\n11046,11047\n11048,11049\n11050,11051\n11052,11053\n11054,195\n11055,11056\n11057,11058\n11059,11060\n11061,11062\n11063,11064\n11065,11066\n11067,11068\n11069,11070\n11071,11072\n11073,11074\n11075,11076\n11077,11078\n11079,11080\n11081,11082\n11083,11084\n11085,11086\n11087,11088\n11089,11090\n11091,11092\n11093,11094\n11095,11096\n11097,11098\n11099,11100\n11101,11102\n11103,11104\n11105,11106\n11107,11108\n11109,11110\n11111,11112\n11113,11114\n11115,11116\n11117,11118\n11119,11120\n11121,11122\n11123,11124\n11125,11126\n11127,11128\n11129,11130\n11131,11132\n11133,11134\n11135,11136\n11137,11138\n11139,11140\n11141,11142\n11143,11144\n11145,11146\n11147,261\n11147,1808\n11147,11147\n11147,41871\n11148,11149\n11150,11151\n11152,11153\n11154,11155\n11156,11157\n11158,11159\n11160,2681\n11161,11162\n11163,11164\n11165,11166\n11167,11168\n11169,11170\n11171,11172\n11173,932\n11173,1016\n11174,11175\n11176,11177\n11178,11179\n11180,11181\n11182,11183\n11184,11185\n11186,11187\n11188,11189\n11190,11191\n11192,11193\n11194,11195\n11196,11197\n11198,11199\n11200,11201\n11202,11203\n11204,11205\n11206,11207\n11208,11209\n11210,11211\n11212,11213\n11214,11215\n11216,11217\n11218,11219\n11220,11221\n11222,11223\n11224,11225\n11226,11227\n11228,11229\n11230,11231\n11232,11233\n11234,11235\n11236,11237\n11238,11239\n11240,11241\n11242,11243\n11244,11245\n11246,11247\n11248,11249\n11250,11251\n11252,11253\n11254,11255\n11256,11257\n11258,11259\n11260,11261\n11262,11263\n11264,11265\n11266,11267\n11268,11269\n11270,11271\n11272,11273\n11274,11275\n11276,11277\n11278,11279\n11280,11281\n11282,11283\n11284,11285\n11286,11287\n11288,11289\n11290,11291\n11292,11293\n11294,11295\n11296,11297\n11298,11299\n11300,11301\n11302,11303\n11304,11305\n11306,11307\n11308,11309\n11310,11311\n11312,11313\n11314,11315\n11316,11317\n11318,11319\n11320,11321\n11322,11323\n11324,11325\n11326,11327\n11328,11329\n11330,11331\n11332,11333\n11334,11335\n11336,11337\n11338,11339\n11340,11341\n11342,11343\n11344,11345\n11346,134\n11346,1309\n11347,11348\n11349,11350\n11351,11352\n11353,11354\n11355,11356\n11357,11358\n11359,11360\n11361,11362\n11363,11364\n11365,11366\n11367,11368\n11369,11370\n11371,11372\n11373,11374\n11375,11376\n11377,11378\n11379,11380\n11381,11382\n11383,11384\n11385,11386\n11387,11388\n11389,11390\n11391,11392\n11393,11394\n11395,11396\n11397,11398\n11399,11400\n11401,11402\n11403,11404\n11405,11406\n11407,11408\n11409,11410\n11411,11412\n11413,11414\n11415,11416\n11417,11418\n11419,11420\n11421,11422\n11423,11424\n11425,11426\n11427,11428\n11429,11430\n11431,11432\n11433,11434\n11435,11436\n11437,11438\n11439,11440\n11441,11442\n11443,11444\n11445,11446\n11447,11448\n11449,11450\n11451,11452\n11453,11454\n11455,11456\n11457,11458\n11459,11460\n11461,11462\n11463,305\n11463,35092\n11464,11465\n11466,11467\n11468,11469\n11470,11471\n11472,11473\n11474,11475\n11476,11477\n11478,11479\n11480,11481\n11482,11483\n11484,11485\n11486,11487\n11488,11489\n11490,11491\n11492,11493\n11494,11495\n11496,11497\n11498,2051\n11499,11500\n11501,11502\n11503,11504\n11505,11506\n11507,11508\n11509,11510\n11511,11512\n11513,11514\n11515,11516\n11517,11518\n11519,11520\n11521,11522\n11523,11524\n11525,11526\n11527,11528\n11529,11530\n11531,11532\n11533,11534\n11535,11536\n11537,11538\n11539,11540\n11541,11542\n11543,11544\n11545,11546\n11547,11548\n11549,11550\n11551,11552\n11553,11554\n11555,11556\n11557,11558\n11559,11560\n11561,11562\n11563,11564\n11565,11566\n11567,11568\n11569,11570\n11571,11572\n11573,11574\n11575,11576\n11577,11578\n11579,11580\n11581,11582\n11583,11584\n11585,11586\n11587,11588\n11589,11590\n11591,11592\n11593,11594\n11595,11596\n11597,11598\n11599,11600\n11601,11602\n11603,11604\n11605,11606\n11607,11608\n11609,11610\n11611,11612\n11613,11614\n11615,11616\n11617,11618\n11619,11620\n11621,11622\n11623,11624\n11625,11626\n11627,11628\n11629,11630\n11631,11632\n11633,11634\n11635,11636\n11637,11638\n11639,11640\n11641,11642\n11643,11644\n11645,11646\n11647,11648\n11649,11650\n11651,11652\n11653,11654\n11655,11656\n11657,11658\n11659,11660\n11661,11662\n11663,11664\n11665,11666\n11667,11668\n11669,11670\n11671,11672\n11673,11674\n11675,11676\n11677,11678\n11679,11680\n11681,11682\n11683,11684\n11685,11686\n11687,11688\n11689,163\n11690,11691\n11692,11693\n11694,11695\n11696,11697\n11698,11699\n11700,11701\n11702,11703\n11704,11705\n11706,11707\n11708,11709\n11710,11711\n11712,11713\n11714,11715\n11716,11717\n11718,11719\n11720,11721\n11722,11723\n11724,11725\n11726,11727\n11728,11729\n11730,11731\n11732,11733\n11734,11735\n11736,11737\n11738,11739\n11740,11741\n11742,718\n11743,11744\n11745,11746\n11747,11748\n11749,626\n11750,11751\n11752,11753\n11754,11755\n11756,11757\n11758,11759\n11760,11761\n11762,11763\n11764,11765\n11766,163\n11767,11768\n11769,11770\n11771,11772\n11773,11774\n11775,11776\n11777,11778\n11779,11780\n11781,11782\n11783,11784\n11785,11786\n11787,11788\n11789,301\n11790,11791\n11792,11793\n11794,11795\n11796,11797\n11798,11799\n11800,11801\n11802,11803\n11804,11805\n11806,11807\n11808,11809\n11810,11811\n11812,11813\n11814,11815\n11816,11817\n11818,163\n11818,302\n11818,579\n11818,811\n11819,11820\n11821,11822\n11823,11824\n11825,11826\n11827,11828\n11829,11830\n11831,11832\n11833,11834\n11835,163\n11836,11837\n11838,11839\n11840,11841\n11842,11843\n11844,11845\n11846,11847\n11848,11849\n11850,11851\n11852,11853\n11854,11855\n11856,11857\n11858,11859\n11860,11861\n11862,11863\n11864,11865\n11866,11867\n11868,11869\n11870,11871\n11872,11873\n11874,11875\n11876,11877\n11878,11879\n11880,11881\n11882,11883\n11884,11885\n11886,11887\n11888,11889\n11890,192\n11890,663\n11890,664\n11891,11892\n11893,11894\n11895,11896\n11897,11898\n11899,11900\n11901,11902\n11903,11904\n11905,11906\n11907,11908\n11909,392\n11909,1454\n11910,11911\n11912,11913\n11914,11915\n11916,11917\n11918,11919\n11920,11921\n11922,11923\n11924,11925\n11926,11927\n11928,11929\n11930,163\n11931,11932\n11933,11934\n11935,11936\n11937,11938\n11939,11940\n11941,11942\n11943,11944\n11945,11946\n11947,11948\n11949,11950\n11951,26\n11951,59\n11953,11954\n11955,163\n11956,11957\n11958,11959\n11960,11961\n11962,11963\n11964,11965\n11966,11967\n11968,11969\n11970,11971\n11972,11973\n11974,11975\n11976,11977\n11978,11979\n11980,11981\n11982,11983\n11984,11985\n11986,11987\n11988,11989\n11990,11991\n11992,11993\n11994,11995\n11996,11997\n11998,11999\n12000,12001\n12002,12003\n12004,12005\n12006,12007\n12008,163\n12009,12010\n12011,12012\n12013,12014\n12015,12016\n12017,12018\n12019,12020\n12021,12022\n12023,12024\n12025,12026\n12027,12028\n12029,12030\n12031,634\n12031,6888\n12032,12033\n12034,12035\n12036,12037\n12038,12039\n12040,12041\n12042,12043\n12044,12045\n12046,12047\n12048,12049\n12050,12051\n12052,12053\n12054,19\n12054,660\n12055,12056\n12057,12058\n12059,12060\n12061,12062\n12063,12064\n12065,12066\n12067,12068\n12069,12070\n12071,12072\n12073,12074\n12075,12076\n12078,12079\n12080,12081\n12082,12083\n12084,12085\n12086,12087\n12088,12089\n12090,12091\n12092,12093\n12094,12095\n12096,12097\n12098,12099\n12100,72\n12100,312\n12101,12102\n12103,163\n12104,12105\n12106,12107\n12108,12109\n12110,12111\n12112,192\n12112,602\n12112,657\n12112,663\n12112,920\n12112,1089\n12112,1849\n12112,8854\n12113,12114\n12115,12116\n12117,12118\n12119,12120\n12121,12122\n12123,12124\n12125,12126\n12127,12128\n12129,12130\n12131,12132\n12133,12134\n12135,12136\n12137,12138\n12139,12140\n12141,12142\n12143,12144\n12145,163\n12146,12147\n12148,12149\n12150,12151\n12152,12153\n12154,12155\n12156,12157\n12158,12159\n12160,12161\n12162,12163\n12164,12165\n12166,12167\n12168,12169\n12170,12171\n12172,12173\n12174,12175\n12176,12177\n12178,12179\n12180,12181\n12182,12183\n12184,12185\n12186,12187\n12188,12189\n12190,12191\n12192,12193\n12194,12195\n12196,12197\n12198,12199\n12200,12201\n12202,12203\n12204,12205\n12206,12207\n12208,12209\n12210,12211\n12212,12213\n12214,12215\n12216,12217\n12218,12219\n12220,12221\n12222,12223\n12224,12225\n12226,12227\n12228,12229\n12230,12231\n12232,12233\n12234,12235\n12236,12237\n12238,12239\n12240,12241\n12242,12243\n12244,12245\n12246,12247\n12248,12249\n12250,12251\n12252,12253\n12254,518\n12254,1411\n12255,12256\n12257,12258\n12259,12260\n12261,12262\n12263,192\n12263,336\n12263,609\n12263,1181\n12263,1663\n12263,2244\n12263,2253\n12263,6119\n12263,60576\n12263,204124\n12264,12265\n12266,12267\n12268,12269\n12270,12271\n12272,12273\n12274,12275\n12276,12277\n12278,571\n12278,718\n12278,868\n12278,1623\n12279,12280\n12281,611\n12282,12283\n12284,12285\n12286,12287\n12288,12289\n12290,12291\n12292,12293\n12294,12295\n12296,12297\n12298,12299\n12300,12301\n12302,12303\n12304,12305\n12306,12307\n12308,12309\n12310,12311\n12312,12313\n12314,12315\n12316,12317\n12318,12319\n12320,12321\n12322,12323\n12324,12325\n12326,12327\n12328,12329\n12330,12331\n12332,12333\n12334,12335\n12336,12337\n12338,12339\n12340,12341\n12342,12343\n12344,12345\n12346,12347\n12348,12349\n12350,12351\n12352,12353\n12354,12355\n12356,12357\n12358,12359\n12360,12361\n12362,12363\n12364,12365\n12366,12367\n12368,12369\n12370,12371\n12372,12373\n12374,12375\n12376,12377\n12378,299\n12379,12380\n12381,12382\n12383,12384\n12385,12386\n12387,12388\n12389,12390\n12391,12392\n12393,12394\n12395,3744\n12395,9005\n12396,12397\n12398,12399\n12400,12401\n12402,12403\n12404,12405\n12406,12407\n12408,12409\n12410,12411\n12412,12413\n12414,12415\n12416,12417\n12418,12419\n12420,12421\n12422,12423\n12424,12425\n12426,12427\n12428,12429\n12430,12431\n12432,12433\n12434,12435\n12436,12437\n12438,12439\n12440,12441\n12442,12443\n12444,12445\n12446,12447\n12448,12449\n12450,12451\n12452,12453\n12454,12455\n12456,12457\n12458,12459\n12460,12461\n12462,12463\n12464,12465\n12466,12467\n12468,12469\n12470,12471\n12472,12473\n12474,12475\n12476,12477\n12478,12479\n12480,12481\n12482,12483\n12484,12485\n12486,12487\n12488,12489\n12490,12491\n12492,12493\n12494,12495\n12496,12497\n12498,12499\n12500,12501\n12502,12503\n12504,12505\n12506,12507\n12508,12509\n12510,12511\n12512,12513\n12514,12515\n12516,12517\n12518,12519\n12520,12521\n12522,12523\n12524,12525\n12526,12527\n12528,12529\n12530,12531\n12532,12533\n12534,12535\n12536,12537\n12538,12539\n12540,12541\n12542,12543\n12544,12545\n12546,12547\n12548,12549\n12550,12551\n12552,12553\n12554,12555\n12556,1432\n12556,1639\n12557,493\n12557,1370\n12558,12559\n12560,12561\n12562,12563\n12564,12565\n12566,12567\n12568,12569\n12570,12571\n12572,12573\n12574,12575\n12576,12577\n12578,577\n12579,12580\n12581,12582\n12583,12584\n12585,12586\n12587,12588\n12589,12590\n12591,12592\n12593,12594\n12595,12596\n12597,12598\n12599,12600\n12601,12602\n12603,12604\n12605,12606\n12607,12608\n12609,12610\n12611,12612\n12613,12614\n12615,12616\n12617,12618\n12619,12620\n12621,12622\n12623,50\n12623,779\n12623,68069\n12623,86832\n12624,12625\n12626,12627\n12628,12629\n12630,12631\n12632,12633\n12634,12635\n12636,12637\n12638,12639\n12640,12641\n12642,12643\n12644,12645\n12646,12647\n12648,12649\n12650,12651\n12652,12653\n12654,12655\n12656,12657\n12658,12659\n12660,12661\n12662,12663\n12664,12665\n12666,12667\n12668,12669\n12670,12671\n12672,12673\n12674,12675\n12676,12677\n12678,12679\n12680,12681\n12682,12683\n12684,12685\n12686,12687\n12688,12689\n12690,12691\n12692,12693\n12694,12695\n12696,12697\n12698,12699\n12700,12701\n12702,12703\n12704,12705\n12706,12707\n12708,12709\n12710,12711\n12712,1973\n12713,392\n12714,12715\n12716,3367\n12717,12718\n12719,32\n12720,12721\n12722,12723\n12724,195\n12724,336\n12724,86479\n12725,12726\n12727,2775\n12728,795\n12729,671\n12730,264\n12730,1381\n12731,12732\n12733,1551\n12734,12735\n12736,1411\n12736,2006\n12737,12738\n12739,12740\n12741,12742\n12743,77\n12744,12745\n12746,328\n12746,2443\n12747,10\n12747,104\n12747,134\n12747,248\n12747,264\n12747,289\n12747,290\n12747,298\n12747,310\n12747,557\n12747,631\n12747,636\n12747,805\n12747,838\n12747,932\n12747,1016\n12747,1119\n12747,1282\n12747,1368\n12747,1392\n12747,1608\n12747,1631\n12747,1635\n12747,1745\n12747,1955\n12747,2209\n12747,94134\n12747,144988\n12748,12749\n12750,12751\n12753,12754\n12755,12756\n12757,12758\n12759,12760\n12761,12762\n12763,795\n12764,12765\n12766,12767\n12768,12769\n12770,12771\n12772,12773\n12774,12775\n12776,12777\n12778,12779\n12780,12781\n12782,12783\n12784,12785\n12786,12787\n12788,12789\n12790,12791\n12792,12793\n12794,12795\n12796,12797\n12798,12799\n12800,12801\n12802,12803\n12804,12805\n12806,12807\n12808,12809\n12810,12811\n12812,12813\n12814,12815\n12816,12817\n12819,12820\n12821,12822\n12823,12824\n12826,12827\n12828,12829\n12830,12831\n12832,12833\n12834,12835\n12836,12837\n12838,12839\n12840,12841\n12842,12843\n12844,12845\n12846,12847\n12848,12849\n12850,12851\n12852,12853\n12854,12855\n12856,12857\n12858,12859\n12860,12861\n12862,12863\n12864,12865\n12866,12867\n12868,12869\n12870,264\n12870,1127\n12870,1381\n12870,1893\n12871,240\n12871,372\n12871,1082\n12871,1285\n12871,1955\n12872,356\n12872,852\n12873,887\n12874,163\n12875,795\n12876,1631\n12877,1551\n12878,1411\n12878,4218\n12878,4220\n12878,66297\n12879,1323\n12880,102\n12881,1326\n12882,408\n12884,12885\n12886,622\n12886,862\n12886,893\n12886,2116\n12886,3769\n12887,12888\n12889,280\n12889,17245\n12890,12891\n12892,280\n12892,17245\n12893,12894\n12895,12896\n12897,12898\n12899,12900\n12901,12902\n12903,12904\n12905,12906\n12907,12908\n12909,12910\n12911,12912\n12913,12914\n12915,12916\n12917,12918\n12919,12920\n12921,12922\n12923,12924\n12925,12926\n12927,12928\n12929,12930\n12931,12932\n12933,163\n12934,12935\n12936,12937\n12938,12939\n12940,12941\n12942,12943\n12944,12945\n12946,12947\n12948,12949\n12950,12951\n12952,843\n12953,12954\n12955,12956\n12957,12958\n12959,12960\n12961,12962\n12963,1411\n12964,12965\n12966,12967\n12968,12969\n12970,12971\n12972,12973\n12974,12975\n12976,12977\n12978,12979\n12980,12981\n12982,163\n12983,12984\n12985,12986\n12987,12988\n12989,12990\n12991,12992\n12993,12994\n12995,12996\n12997,12998\n12999,13000\n13001,13002\n13003,13004\n13005,13006\n13007,13008\n13009,13010\n13011,13012\n13013,13014\n13015,13016\n13017,13018\n13019,13020\n13021,280\n13022,13023\n13024,13025\n13026,13027\n13028,13029\n13030,13031\n13032,13033\n13034,13035\n13036,79\n13036,302\n13036,3769\n13037,13038\n13039,13040\n13041,13042\n13043,13044\n13045,13046\n13047,13048\n13049,13050\n13051,13052\n13053,13054\n13055,13056\n13057,13058\n13059,13060\n13061,13062\n13063,13064\n13065,13066\n13067,13068\n13069,13070\n13071,13072\n13073,1639\n13074,1579\n13075,13076\n13077,13078\n13079,3\n13079,178\n13079,563\n13079,919\n13079,1284\n13079,1285\n13079,32475\n13080,13081\n13082,13083\n13084,13085\n13086,13087\n13088,13089\n13090,13091\n13092,13093\n13094,175\n13095,13096\n13097,13098\n13099,13100\n13101,13102\n13103,13104\n13105,13106\n13107,13108\n13109,13110\n13111,13112\n13113,13114\n13115,13116\n13117,13118\n13119,13120\n13121,13122\n13123,13124\n13125,13126\n13127,26\n13127,59\n13127,877\n13128,13129\n13130,571\n13130,868\n13131,1659\n13131,1775\n13131,2205\n13131,21944\n13131,33424\n13132,596\n13132,1368\n13133,611\n13134,586\n13135,13136\n13135,13137\n13135,28130\n13135,213089\n13136,392\n13136,644\n13136,1019\n13136,4903\n13136,6424\n13137,283\n13137,455\n13137,682\n13137,1539\n13137,1571\n13137,1724\n13137,1756\n13137,1949\n13137,4223\n13137,5208\n13137,7698\n13137,7768\n13137,13328\n13137,19443\n13137,20600\n13137,21414\n13137,23287\n13137,36594\n13137,37088\n13137,72439\n13137,91906\n13137,103913\n13137,117817\n13137,119854\n13137,131216\n13137,135270\n13137,182467\n13137,193490\n13137,204259\n13137,212914\n13137,213089\n13137,216027\n13137,232737\n13137,251467\n13137,255758\n13138,743\n13138,4691\n13140,79\n13140,337\n13140,563\n13140,1089\n13140,1619\n13140,1623\n13141,163\n13142,22\n13142,163\n13142,433\n13142,818\n13143,390\n13144,287\n13145,2334\n13146,309\n13146,310\n13147,184\n13147,485\n13147,8854\n13147,15179\n13148,1849\n13149,143\n13150,247\n13151,1973\n13151,26181\n13152,30\n13152,312\n13152,510\n13152,575\n13152,875\n13152,3260\n13153,392\n13153,1151\n13153,2699\n13154,1801\n13155,163\n13156,72\n13157,2506\n13158,211\n13158,344\n13158,1801\n13159,163\n13161,192\n13161,6068\n13162,130\n13162,1634\n13163,143\n13164,48\n13165,932\n13166,366\n13166,760\n13166,1149\n13166,1631\n13166,1635\n13167,140\n13168,130\n13168,835\n13168,1007\n13168,1381\n13168,1452\n13168,1509\n13168,1551\n13168,1639\n13168,3041\n13168,5440\n13169,2319\n13170,163\n13170,302\n13172,163\n13173,534\n13174,6955\n13175,1509\n13176,301\n13176,1181\n13176,1210\n13177,202\n13177,203\n13178,422\n13179,56\n13180,1556\n13181,65\n13184,163\n13185,192\n13185,1392\n13185,1745\n13186,217\n13188,433\n13188,571\n13189,1276\n13189,3507\n13190,2006\n13191,72\n13192,907\n13193,462\n13193,510\n13193,872\n13193,1118\n13193,1147\n13193,1151\n13193,1572\n13193,1653\n13193,4039\n13193,8149\n13194,781\n13195,77\n13195,425\n13195,868\n13195,1276\n13196,344\n13197,50\n13197,285\n13197,1515\n13197,1707\n13198,35\n13198,207\n13198,240\n13198,457\n13198,536\n13198,657\n13198,697\n13198,818\n13198,1119\n13198,1133\n13198,1210\n13198,1284\n13198,1417\n13198,1801\n13198,1955\n13198,2989\n13198,2991\n13198,3182\n13199,119\n13201,10\n13202,163\n13203,184\n13203,2244\n13204,195\n13205,104\n13205,264\n13205,289\n13205,290\n13205,631\n13205,1147\n13205,1381\n13205,2205\n13205,33424\n13205,144988\n13206,143\n13207,30\n13207,104\n13207,111\n13207,134\n13207,135\n13207,138\n13207,182\n13207,186\n13207,200\n13207,225\n13207,240\n13207,248\n13207,264\n13207,288\n13207,289\n13207,290\n13207,314\n13207,327\n13207,328\n13207,332\n13207,356\n13207,364\n13207,397\n13207,446\n13207,450\n13207,452\n13207,457\n13207,467\n13207,557\n13207,599\n13207,631\n13207,636\n13207,673\n13207,685\n13207,714\n13207,760\n13207,772\n13207,808\n13207,838\n13207,849\n13207,850\n13207,911\n13207,943\n13207,953\n13207,1011\n13207,1014\n13207,1085\n13207,1118\n13207,1149\n13207,1172\n13207,1179\n13207,1191\n13207,1262\n13207,1282\n13207,1332\n13207,1415\n13207,1454\n13207,1462\n13207,1518\n13207,1531\n13207,1566\n13207,1572\n13207,1631\n13207,1796\n13207,1808\n13207,1844\n13207,1879\n13207,1893\n13207,1955\n13207,2105\n13207,2173\n13207,2205\n13207,3020\n13207,3099\n13207,3247\n13207,3507\n13207,3633\n13207,3719\n13207,4276\n13207,4355\n13207,5405\n13207,6695\n13207,7117\n13207,7155\n13207,7214\n13207,7757\n13207,7912\n13207,8133\n13207,13207\n13207,13208\n13207,13220\n13207,13522\n13207,14417\n13207,16664\n13207,16674\n13207,20510\n13207,20604\n13207,21633\n13207,23392\n13207,23508\n13207,23654\n13207,24789\n13207,26045\n13207,28203\n13207,28311\n13207,28860\n13207,29831\n13207,30315\n13207,30392\n13207,31243\n13207,32722\n13207,33302\n13207,33424\n13207,33621\n13207,34352\n13207,38650\n13207,40580\n13207,41306\n13207,42807\n13207,43115\n13207,44407\n13207,46152\n13207,47031\n13207,56319\n13207,59956\n13207,60464\n13207,62323\n13207,62333\n13207,63011\n13207,63034\n13207,64648\n13207,64666\n13207,64689\n13207,65152\n13207,67922\n13207,68664\n13207,68755\n13207,73441\n13207,75912\n13207,75957\n13207,77809\n13207,79786\n13207,82892\n13207,83858\n13207,85819\n13207,93729\n13207,93864\n13207,94134\n13207,94232\n13207,96698\n13207,103948\n13207,103951\n13207,104514\n13207,105803\n13207,112895\n13207,112972\n13207,113384\n13207,115292\n13207,116531\n13207,121027\n13207,122140\n13207,127223\n13207,127714\n13207,130836\n13207,130862\n13207,131919\n13207,132892\n13207,135628\n13207,136166\n13207,136217\n13207,136423\n13207,136424\n13207,136587\n13207,136713\n13207,136714\n13207,136715\n13207,136716\n13207,136717\n13207,137821\n13207,138736\n13207,149257\n13207,162992\n13207,179404\n13207,180956\n13207,181870\n13207,190276\n13207,196107\n13207,196128\n13207,196752\n13207,197860\n13207,201839\n13207,204076\n13207,205040\n13207,205881\n13207,207089\n13207,232036\n13207,232226\n13207,232923\n13207,233380\n13207,245910\n13207,254243\n13207,254994\n13208,200\n13209,26\n13209,59\n13210,163\n13211,163\n13212,515\n13212,1052\n13213,697\n13214,3507\n13215,26\n13215,59\n13217,186\n13217,304\n13217,313\n13217,332\n13217,390\n13217,589\n13217,668\n13217,685\n13217,801\n13217,877\n13217,941\n13217,968\n13217,1001\n13217,1284\n13217,1326\n13217,1715\n13217,1955\n13217,2209\n13217,2334\n13217,3555\n13217,4222\n13217,5130\n13217,5718\n13217,5961\n13217,9015\n13217,24500\n13217,171641\n13218,1298\n13219,422\n13220,248\n13220,943\n13220,1332\n13220,5405\n13221,99\n13221,47031\n13221,60576\n13222,301\n13222,392\n13222,657\n13222,1240\n13222,1326\n13222,2557\n13223,433\n13223,595\n13223,1634\n13224,1590\n13224,1644\n13225,1860\n13226,149\n13226,195\n13226,252\n13226,318\n13226,516\n13226,622\n13227,63\n13228,1634\n13229,599\n13230,146\n13230,314\n13230,779\n13230,3252\n13230,106502\n13231,2681\n13232,489\n13233,65\n13233,66\n13233,79\n13233,467\n13233,868\n13233,3744\n13234,15\n13235,30\n13235,32\n13235,440\n13235,622\n13235,809\n13235,1179\n13235,2116\n13235,21442\n13235,141912\n13236,26\n13236,59\n13237,30\n13238,26\n13238,59\n13239,1381\n13240,222\n13240,278\n13240,313\n13240,356\n13240,389\n13240,634\n13240,657\n13240,660\n13240,852\n13240,1072\n13240,1724\n13240,2779\n13240,2784\n13240,3252\n13240,4637\n13240,5933\n13240,6506\n13240,7092\n13240,14556\n13240,19443\n13240,40566\n13240,115659\n13241,1858\n13242,63\n13242,202\n13242,516\n13242,671\n13242,1385\n13244,349\n13244,5540\n13245,707\n13245,1801\n13245,3182\n13245,6424\n13245,28107\n13246,2105\n13247,1544\n13248,163\n13250,32\n13250,83\n13250,273\n13250,283\n13250,408\n13250,622\n13250,634\n13250,673\n13250,1149\n13250,1247\n13250,1313\n13250,1381\n13250,1509\n13250,1847\n13250,2701\n13250,3999\n13250,4223\n13250,138686\n13252,299\n13252,1284\n13252,1319\n13252,2083\n13252,73570\n13253,158\n13254,4611\n13255,346\n13256,143\n13257,500\n13257,718\n13258,1836\n13259,1634\n13260,868\n13261,72\n13262,1849\n13262,32784\n13263,79\n13264,781\n13265,68\n13266,248\n13267,143\n13268,37\n13268,366\n13268,1231\n13268,1782\n13268,5662\n13269,195\n13269,252\n13269,275\n13269,1385\n13270,79\n13270,202\n13270,1181\n13271,417\n13272,2681\n13272,17369\n13272,20026\n13272,62678\n13272,66006\n13272,68871\n13272,69645\n13272,96373\n13272,106995\n13272,116381\n13272,120291\n13272,121511\n13272,124808\n13272,125325\n13272,125970\n13272,126306\n13272,127608\n13272,128010\n13272,129298\n13272,129649\n13272,130031\n13272,130078\n13272,130124\n13272,130786\n13272,168511\n13272,172015\n13272,172904\n13272,184189\n13273,104\n13273,718\n13273,795\n13273,893\n13273,4218\n13273,7194\n13274,10\n13274,149\n13274,240\n13274,261\n13274,302\n13274,372\n13274,390\n13274,518\n13274,694\n13274,811\n13274,818\n13274,1001\n13274,1454\n13274,1955\n13275,457\n13276,54\n13276,278\n13276,283\n13276,455\n13276,1538\n13276,1539\n13276,1843\n13276,2423\n13276,2424\n13276,6506\n13276,6789\n13276,7768\n13276,13400\n13276,23858\n13276,33118\n13276,49188\n13276,64858\n13276,68135\n13277,143\n13278,30\n13279,489\n13279,809\n13280,192\n13280,435\n13280,1745\n13282,911\n13282,2209\n13282,4475\n13283,158\n13283,406\n13283,779\n13283,1181\n13283,1515\n13284,1557\n13284,1684\n13284,13285\n13284,30886\n13284,51664\n13284,52106\n13284,56674\n13284,56676\n13284,56678\n13284,57870\n13284,62437\n13284,99218\n13284,132321\n13284,143507\n13284,157407\n13284,162310\n13284,188672\n13284,188686\n13284,201461\n13284,203295\n13284,219194\n13284,220270\n13284,227676\n13286,146\n13286,92476\n13287,3999\n13289,336\n13290,781\n13291,1603\n13291,6861\n13292,136\n13293,932\n13294,592\n13295,248\n13296,240\n13296,301\n13296,444\n13296,604\n13296,615\n13296,968\n13296,1285\n13296,1564\n13297,37\n13298,264\n13298,9005\n13299,349\n13299,762\n13299,941\n13299,5301\n13300,609\n13302,425\n13302,1276\n13302,19488\n13302,138686\n13303,760\n13303,1631\n13304,694\n13304,2775\n13304,3623\n13305,801\n13305,1140\n13306,217\n13306,1417\n13307,302\n13307,310\n13307,596\n13307,811\n13307,874\n13307,1881\n13307,255911\n13308,408\n13309,37\n13310,13311\n13310,44576\n13310,57834\n13310,114740\n13312,252\n13312,516\n13312,1220\n13312,1222\n13313,143\n13314,652\n13315,7760\n13316,6955\n13317,252\n13317,302\n13317,538\n13317,1220\n13317,1222\n13317,5405\n13319,1782\n13320,163\n13320,209\n13320,262\n13320,302\n13320,515\n13320,571\n13320,579\n13320,687\n13320,718\n13320,861\n13320,893\n13320,1556\n13320,2116\n13320,4823\n13322,1454\n13323,440\n13323,441\n13323,673\n13323,794\n13324,292\n13324,515\n13325,2312\n13326,251\n13326,252\n13326,516\n13326,1220\n13326,1222\n13327,68\n13327,1400\n13328,34\n13328,35\n13328,217\n13328,222\n13328,455\n13328,536\n13328,862\n13328,1001\n13328,1019\n13328,1531\n13328,1539\n13328,1571\n13328,7768\n13328,13137\n13328,13361\n13329,1509\n13330,1127\n13330,1639\n13330,2051\n13330,49057\n13330,81070\n13331,5547\n13332,259\n13332,577\n13333,636\n13334,77\n13334,1287\n13334,3695\n13335,171\n13337,10\n13337,13338\n13337,20077\n13337,21085\n13337,21086\n13337,21087\n13337,21091\n13337,26451\n13338,10\n13338,13345\n13339,682\n13339,72439\n13340,1579\n13341,1639\n13342,143\n13343,991\n13344,1749\n13347,209\n13347,346\n13347,893\n13347,4453\n13348,273\n13348,595\n13348,704\n13348,992\n13348,1402\n13348,1818\n13348,1844\n13348,1858\n13348,5540\n13348,9457\n13349,298\n13350,485\n13351,973\n13352,175\n13352,693\n13353,698\n13354,968\n13354,1241\n13354,1479\n13354,2557\n13355,781\n13356,134\n13357,22\n13357,147\n13357,211\n13357,2017\n13357,141912\n13358,534\n13359,160\n13359,294\n13359,417\n13359,736\n13359,827\n13359,1007\n13359,1132\n13359,1147\n13359,1509\n13359,1564\n13359,3999\n13360,1836\n13360,13361\n13361,58\n13361,657\n13361,911\n13362,1127\n13362,1659\n13362,2051\n13363,671\n13364,1452\n13365,389\n13365,1454\n13367,1858\n13368,1860\n13369,163\n13370,163\n13371,1370\n13372,1181\n13372,1210\n13373,182\n13374,252\n13374,272\n13374,943\n13374,1068\n13374,1220\n13374,1222\n13374,1512\n13374,2867\n13374,2868\n13374,36761\n13374,72439\n13375,731\n13375,1191\n13375,6682\n13376,163\n13376,2116\n13377,710\n13378,50\n13378,63\n13378,158\n13378,195\n13378,285\n13378,406\n13378,620\n13378,779\n13378,1181\n13378,1515\n13378,5874\n13378,6119\n13379,4453\n13380,225\n13383,911\n13385,158\n13385,192\n13386,4222\n13387,2775\n13388,447\n13389,83\n13389,87\n13389,313\n13389,356\n13389,385\n13389,455\n13389,536\n13389,852\n13389,1140\n13389,1453\n13389,1722\n13389,1836\n13389,1881\n13389,2944\n13389,5591\n13390,50\n13390,149\n13390,505\n13390,620\n13390,127158\n13390,141912\n13391,1\n13392,66\n13392,868\n13392,920\n13392,1433\n13393,571\n13393,1140\n13393,1175\n13394,393\n13395,10\n13395,72\n13395,134\n13395,9457\n13396,900\n13400,455\n13400,1019\n13400,1539\n13400,7768\n13401,81\n13402,1474\n13403,8907\n13404,32\n13404,392\n13405,1105\n13406,577\n13406,1105\n13406,1429\n13407,595\n13407,703\n13408,134\n13409,143\n13410,1313\n13411,107\n13411,289\n13411,290\n13411,694\n13411,749\n13411,1388\n13411,1888\n13411,1955\n13411,2775\n13411,3085\n13411,3623\n13411,8276\n13412,534\n13413,1429\n13414,56\n13415,143\n13416,187\n13417,302\n13417,2116\n13418,301\n13418,968\n13418,2979\n13419,779\n13419,8055\n13420,313\n13420,544\n13420,874\n13423,687\n13423,861\n13423,1556\n13423,4823\n13424,485\n13424,1096\n13425,346\n13426,143\n13427,328\n13428,79\n13428,192\n13428,206\n13428,663\n13428,664\n13428,994\n13428,1181\n13429,720\n13429,1117\n13429,1240\n13429,1465\n13430,149\n13430,333\n13431,703\n13431,1453\n13432,589\n13433,217\n13433,372\n13433,417\n13433,588\n13433,590\n13433,1001\n13433,1082\n13433,1085\n13433,1881\n13433,2205\n13433,6068\n13433,33424\n13435,192\n13435,663\n13435,664\n13435,3872\n13436,147\n13436,252\n13437,5908\n13438,795\n13439,163\n13440,1973\n13442,120\n13442,388\n13442,2006\n13442,2979\n13442,6638\n13444,87\n13444,392\n13444,1151\n13444,1240\n13444,1454\n13444,1572\n13444,1722\n13444,2436\n13445,818\n13446,794\n13446,1368\n13447,972\n13448,874\n13448,6891\n13449,163\n13449,2116\n13451,1973\n13452,760\n13452,1149\n13452,1631\n13453,163\n13454,37\n13454,1782\n13454,227376\n13455,312\n13456,163\n13457,874\n13458,65\n13459,483\n13460,151\n13461,477\n13461,2168\n13462,949\n13463,1096\n13464,192\n13464,195\n13464,516\n13464,663\n13464,664\n13464,1844\n13464,6119\n13465,1718\n13466,577\n13467,273\n13467,274\n13467,1512\n13467,5992\n13467,189128\n13468,1608\n13469,483\n13470,167\n13470,2083\n13471,313\n13472,163\n13473,3507\n13474,462\n13474,907\n13474,2191\n13474,2436\n13474,4039\n13475,611\n13475,717\n13476,163\n13477,707\n13478,192\n13478,240\n13478,332\n13478,372\n13478,493\n13478,1192\n13478,1285\n13478,1419\n13478,1663\n13478,1796\n13478,2512\n13478,4549\n13479,657\n13480,167\n13480,1167\n13480,1522\n13480,1955\n13480,2083\n13480,2191\n13480,2557\n13480,2979\n13480,3138\n13480,5301\n13481,1388\n13482,136\n13483,2083\n13483,2191\n13483,3138\n13484,13485\n13487,163\n13487,302\n13489,167\n13489,832\n13489,1522\n13489,2083\n13489,75912\n13490,1309\n13491,996\n13491,3258\n13491,44725\n13492,392\n13493,158\n13493,285\n13493,336\n13493,406\n13493,1515\n13495,30\n13495,704\n13496,385\n13497,2681\n13497,31977\n13497,82487\n13497,89547\n13497,93365\n13497,105282\n13498,298\n13499,485\n13500,333\n13501,1963\n13502,292\n13502,1688\n13503,143\n13504,536\n13505,1522\n13506,3\n13506,225\n13506,372\n13506,435\n13506,592\n13506,704\n13506,932\n13506,934\n13506,1082\n13506,1140\n13506,1177\n13506,1241\n13506,1332\n13506,1368\n13506,1479\n13506,1579\n13506,1789\n13506,1849\n13506,1955\n13506,1985\n13506,2045\n13506,2205\n13506,2480\n13506,3474\n13506,4771\n13506,33424\n13507,333\n13507,622\n13508,1179\n13509,151\n13510,195\n13511,160\n13512,1983\n13513,1010\n13514,163\n13515,920\n13515,2837\n13515,4748\n13516,83\n13517,72\n13518,1849\n13518,32784\n13519,66\n13519,163\n13519,467\n13519,571\n13519,868\n13519,1167\n13519,1433\n13519,2979\n13520,158\n13520,206\n13520,314\n13520,55849\n13520,118336\n13520,220502\n13521,1326\n13521,1955\n13522,225\n13522,248\n13522,5405\n13523,301\n13523,968\n13523,973\n13523,1167\n13523,1231\n13523,1293\n13523,1300\n13523,1544\n13523,3422\n13523,227376\n13524,217\n13524,240\n13524,301\n13524,309\n13524,310\n13524,372\n13524,390\n13524,433\n13524,440\n13524,467\n13524,510\n13524,534\n13524,589\n13524,818\n13524,1085\n13524,1417\n13524,1796\n13524,3804\n13524,6068\n13524,18739\n13525,252\n13525,318\n13525,2116\n13525,41170\n13527,772\n13528,972\n13528,1718\n13528,2750\n13529,275\n13529,277\n13529,70858\n13531,305\n13532,87\n13533,83\n13534,104\n13534,1177\n13534,2210\n13535,247\n13536,1179\n13537,13538\n13538,135\n13538,685\n13538,911\n13538,1188\n13538,13538\n13539,104\n13540,1467\n13542,873\n13543,206\n13544,248\n13544,450\n13544,1332\n13545,13546\n13548,996\n13549,120\n13549,222\n13549,283\n13549,389\n13549,455\n13549,1072\n13550,195\n13551,1789\n13553,151\n13554,163\n13555,1955\n13555,66500\n13556,147\n13556,336\n13556,991\n13556,1247\n13556,2421\n13556,8055\n13556,164572\n13557,2574\n13558,1133\n13559,1287\n13560,920\n13561,516\n13564,893\n13566,577\n13566,980\n13567,364\n13568,248\n13568,1332\n13569,592\n13570,5165\n13571,949\n13572,143\n13572,273\n13572,274\n13572,1052\n13573,22\n13573,861\n13574,406\n13576,333\n13576,775\n13576,841\n13577,392\n13577,809\n13578,417\n13578,525\n13578,805\n13578,1085\n13578,1140\n13578,1749\n13578,1818\n13578,2286\n13578,2620\n13579,1718\n13580,518\n13580,1955\n13580,2775\n13581,158\n13582,298\n13583,485\n13584,261\n13585,11\n13585,613\n13585,13586\n13585,13590\n13585,15749\n13585,22676\n13585,31470\n13585,32839\n13585,49738\n13585,66849\n13585,74748\n13585,82327\n13585,88738\n13585,90979\n13585,91046\n13585,91613\n13585,93876\n13585,95141\n13585,113130\n13585,127012\n13585,139698\n13587,72\n13588,247\n13589,50\n13589,779\n13591,707\n13592,158\n13592,406\n13592,779\n13592,1181\n13592,4192\n13592,4193\n13593,136\n13593,137\n13593,919\n13593,1479\n13593,1522\n13593,2480\n13593,2557\n13594,252\n13594,668\n13594,859\n13594,1465\n13594,1619\n13595,5265\n13596,72\n13597,222\n13597,657\n13597,770\n13598,392\n13598,2699\n13598,13599\n13599,2699\n13600,72\n13601,140\n13601,264\n13601,1381\n13601,1509\n13601,1893\n13602,704\n13603,2681\n13603,13604\n13603,31977\n13603,35392\n13605,283\n13605,920\n13605,1381\n13605,2979\n13607,252\n13607,318\n13607,657\n13607,41170\n13608,2744\n13609,167\n13609,2083\n13610,1070\n13611,72\n13612,3507\n13613,1749\n13614,301\n13615,7233\n13616,81\n13617,143\n13618,13619\n13620,72\n13621,106\n13621,1888\n13621,6119\n13622,34\n13622,35\n13622,217\n13622,222\n13622,379\n13622,389\n13622,455\n13622,536\n13622,657\n13622,949\n13622,1274\n13622,1566\n13622,1618\n13622,7092\n13622,18831\n13622,20771\n13622,115474\n13623,158\n13623,406\n13623,779\n13624,186\n13624,338\n13624,389\n13624,450\n13624,1392\n13625,107\n13625,1146\n13625,1579\n13625,3538\n13626,493\n13626,588\n13626,590\n13626,634\n13626,784\n13626,1016\n13627,143\n13628,932\n13630,13631\n13632,406\n13632,53255\n13632,55253\n13632,96843\n13633,192\n13634,1453\n13635,222\n13636,146\n13636,252\n13636,516\n13636,1243\n13636,4355\n13636,6661\n13636,20771\n13636,92476\n13637,240\n13637,1078\n13637,1085\n13637,1285\n13637,1659\n13637,1888\n13637,127158\n13637,179804\n13637,185877\n13638,356\n13638,852\n13639,13640\n13639,55423\n13639,61642\n13639,63105\n13641,240\n13641,2296\n13642,349\n13643,392\n13643,809\n13644,140\n13645,1033\n13646,1068\n13647,1749\n13648,184\n13649,714\n13650,344\n13651,151\n13652,302\n13652,687\n13653,333\n13654,195\n13655,10\n13656,3507\n13657,158\n13657,248\n13657,289\n13657,290\n13657,309\n13657,310\n13657,455\n13657,694\n13657,875\n13657,1085\n13657,1118\n13657,1298\n13657,1309\n13657,1612\n13657,2083\n13657,2253\n13657,2646\n13657,2671\n13657,2979\n13657,4355\n13658,147\n13658,175\n13658,784\n13659,493\n13659,1927\n13660,13661\n13661,634\n13661,635\n13661,891\n13661,1014\n13661,2421\n13661,4166\n13661,4234\n13661,13661\n13661,14033\n13661,14051\n13661,14556\n13661,14901\n13661,15887\n13661,22119\n13661,25165\n13661,25179\n13661,26161\n13661,27519\n13661,40737\n13661,40829\n13661,42509\n13661,45700\n13661,50418\n13661,56206\n13661,73215\n13661,77693\n13661,79722\n13661,83811\n13661,99992\n13661,100815\n13661,113375\n13661,113506\n13661,118948\n13661,149149\n13661,149152\n13661,149882\n13661,150708\n13661,151358\n13661,152204\n13661,152782\n13661,156257\n13661,169872\n13661,171122\n13661,173797\n13661,174777\n13661,174830\n13661,175300\n13661,176845\n13661,176850\n13661,198120\n13661,203906\n13661,204259\n13661,214076\n13661,221738\n13661,228350\n13661,228360\n13661,234078\n13661,234655\n13661,248444\n13661,250578\n13661,250663\n13661,253011\n13662,26\n13662,59\n13662,994\n13662,21944\n13663,1243\n13665,71\n13665,304\n13665,2334\n13665,2620\n13665,6068\n13666,760\n13668,72\n13669,2274\n13670,314\n13670,349\n13671,5375\n13672,1105\n13673,934\n13674,1149\n13675,7155\n13676,525\n13677,3\n13677,107\n13677,225\n13677,372\n13677,435\n13677,509\n13677,592\n13677,694\n13677,704\n13677,801\n13677,907\n13677,932\n13677,934\n13677,1082\n13677,1122\n13677,1140\n13677,1177\n13677,1241\n13677,1285\n13677,1368\n13677,1467\n13677,1479\n13677,1511\n13677,1522\n13677,1579\n13677,1789\n13677,1849\n13677,1985\n13677,2045\n13677,2205\n13677,2480\n13677,2620\n13677,2701\n13677,2784\n13677,3069\n13677,3474\n13677,4545\n13677,33424\n13679,1411\n13680,72\n13681,392\n13681,2312\n13682,13683\n13684,273\n13684,274\n13685,250\n13685,1684\n13686,34\n13686,35\n13687,147\n13687,175\n13687,192\n13687,195\n13687,206\n13687,622\n13687,1515\n13687,5101\n13687,31346\n13687,34876\n13688,63\n13688,252\n13688,516\n13688,1220\n13688,1222\n13688,16201\n13688,41170\n13689,1433\n13690,178\n13691,289\n13691,290\n13692,1381\n13692,1551\n13693,65\n13693,217\n13694,50\n13694,147\n13694,192\n13694,333\n13694,493\n13694,586\n13694,682\n13694,1175\n13694,1414\n13694,1515\n13694,1985\n13694,2931\n13694,3872\n13694,5874\n13694,6119\n13694,72439\n13695,366\n13695,818\n13695,1388\n13696,13697\n13698,372\n13698,1082\n13699,843\n13699,1010\n13700,135\n13701,1127\n13702,1127\n13704,805\n13704,885\n13704,1235\n13704,1335\n13704,1775\n13704,1962\n13704,3795\n13704,3796\n13704,8557\n13704,13704\n13704,21944\n13704,171294\n13705,4060\n13706,907\n13706,2191\n13707,269\n13708,3193\n13709,302\n13709,687\n13709,1556\n13710,372\n13712,240\n13712,818\n13712,819\n13712,2235\n13712,2348\n13712,3993\n13712,7338\n13712,7891\n13712,13274\n13712,13712\n13712,15556\n13712,20788\n13712,23354\n13712,23777\n13712,33620\n13712,38743\n13712,40824\n13712,41206\n13712,43750\n13712,46891\n13712,46894\n13712,49699\n13712,50189\n13712,50588\n13712,51919\n13712,58223\n13712,59148\n13712,63714\n13712,66301\n13712,71678\n13712,71697\n13712,79640\n13712,79666\n13712,94077\n13712,94246\n13712,105784\n13712,134226\n13712,140384\n13712,140536\n13712,145050\n13712,151063\n13712,159400\n13712,164213\n13712,164490\n13712,167737\n13712,167842\n13712,169620\n13712,169896\n13712,169970\n13712,171483\n13712,171581\n13712,173440\n13712,174817\n13712,174842\n13712,174844\n13712,175067\n13712,175068\n13712,175949\n13712,219956\n13712,263076\n13712,263088\n13713,439\n13714,44\n13715,19\n13715,1639\n13716,515\n13717,104\n13717,136\n13717,225\n13717,248\n13717,557\n13717,1368\n13718,1001\n13719,10\n13719,2646\n13719,228471\n13720,252\n13720,314\n13720,516\n13720,1220\n13720,1222\n13721,1001\n13722,195\n13723,4548\n13724,323\n13725,980\n13726,1639\n13726,1893\n13726,3695\n13727,65\n13727,296\n13727,302\n13727,534\n13727,536\n13727,652\n13727,720\n13727,1102\n13727,3585\n13727,4504\n13727,14550\n13728,2797\n13729,1556\n13730,503\n13731,387\n13735,143\n13736,264\n13736,1381\n13736,1452\n13736,1639\n13737,1370\n13737,1821\n13738,13739\n13740,143\n13741,58\n13741,130\n13741,135\n13741,137\n13741,294\n13741,332\n13741,364\n13741,431\n13741,442\n13741,557\n13741,1052\n13741,1564\n13741,2315\n13741,2701\n13741,3328\n13741,3474\n13741,4771\n13741,5405\n13742,1590\n13743,349\n13744,13745\n13746,247\n13747,376\n13748,1253\n13748,2089\n13748,2940\n13749,718\n13750,505\n13751,586\n13751,1749\n13752,72\n13753,893\n13754,481\n13755,269\n13756,862\n13756,2296\n13757,1673\n13758,1046\n13759,143\n13760,278\n13760,1871\n13762,595\n13762,1453\n13762,1572\n13764,306\n13764,307\n13765,1127\n13767,13768\n13769,1116\n13771,192\n13771,264\n13771,301\n13771,406\n13771,467\n13771,516\n13771,972\n13771,1010\n13771,1181\n13771,1284\n13771,1298\n13771,1531\n13771,1551\n13771,1659\n13771,1749\n13771,2266\n13772,417\n13773,13774\n13775,920\n13775,8854\n13776,11\n13776,1135\n13777,3138\n13778,294\n13779,483\n13779,1227\n13779,1229\n13780,996\n13781,660\n13782,1888\n13783,72\n13784,344\n13785,285\n13786,1\n13787,1326\n13788,2681\n13789,83\n13790,2671\n13791,516\n13792,10\n13793,1204\n13794,557\n13795,557\n13796,211\n13796,269\n13796,622\n13796,1014\n13797,13798\n13797,33870\n13797,47646\n13797,92375\n13797,92607\n13797,110737\n13799,143\n13800,83\n13801,1179\n13802,811\n13803,417\n13804,20\n13804,83\n13804,2372\n13804,21442\n13804,142426\n13805,1644\n13807,143\n13808,718\n13808,885\n13808,13704\n13809,1984\n13809,3949\n13810,392\n13810,697\n13810,1151\n13810,2699\n13811,312\n13812,13813\n13814,352\n13814,3744\n13814,3967\n13815,298\n13816,485\n13817,250\n13818,13819\n13820,640\n13821,13822\n13823,2424\n13824,8854\n13825,119\n13826,71\n13827,79\n13827,1425\n13828,417\n13829,390\n13830,1\n13830,202\n13830,203\n13831,3252\n13832,417\n13832,818\n13833,406\n13834,301\n13835,3623\n13836,1509\n13837,577\n13838,13839\n13840,264\n13840,818\n13840,1181\n13840,1210\n13841,143\n13842,1707\n13843,1858\n13844,1860\n13845,171\n13846,323\n13847,809\n13848,527\n13849,3089\n13850,273\n13850,274\n13851,283\n13852,13853\n13855,77\n13856,182\n13857,9021\n13858,192\n13858,859\n13859,192\n13859,525\n13859,1392\n13859,1454\n13859,1745\n13859,1796\n13859,3804\n13860,215\n13861,7\n13862,130\n13862,697\n13862,1531\n13863,72\n13864,72\n13865,602\n13866,143\n13866,1052\n13867,2286\n13868,379\n13868,385\n13868,115474\n13869,344\n13869,652\n13870,483\n13871,72\n13872,72\n13873,2244\n13873,23783\n13873,30331\n13874,143\n13875,305\n13876,1204\n13877,143\n13878,615\n13879,143\n13880,72\n13881,634\n13882,119\n13882,151\n13882,192\n13882,309\n13882,310\n13882,577\n13882,1400\n13882,2073\n13882,13910\n13883,72\n13884,143\n13885,3724\n13886,13887\n13888,143\n13889,72\n13890,1282\n13891,1467\n13892,240\n13893,2506\n13894,3507\n13895,726\n13895,2867\n13895,2868\n13896,2506\n13897,2506\n13898,718\n13898,893\n13899,298\n13900,485\n13901,874\n13901,1210\n13902,1871\n13903,72\n13904,72\n13905,3367\n13906,206\n13907,1433\n13908,3585\n13909,227\n13911,143\n13912,104\n13912,134\n13912,138\n13913,743\n13913,4691\n13914,1414\n13915,72\n13916,72\n13917,72\n13918,13919\n13920,143\n13921,72\n13922,2411\n13923,8798\n13924,920\n13925,83\n13926,247\n13927,261\n13928,104\n13928,135\n13928,136\n13928,137\n13928,138\n13928,557\n13928,1368\n13929,920\n13930,72\n13931,41\n13931,1177\n13932,2146\n13933,1381\n13934,349\n13935,217\n13935,536\n13936,1983\n13937,149\n13938,13939\n13938,99406\n13940,1818\n13941,192\n13942,13943\n13944,63\n13945,301\n13945,717\n13945,1231\n13945,1740\n13945,1782\n13946,1590\n13947,68\n13947,22071\n13948,32\n13948,34\n13948,35\n13948,83\n13948,217\n13948,283\n13948,323\n13948,358\n13948,392\n13948,455\n13948,577\n13948,623\n13948,949\n13948,1001\n13948,1201\n13948,1240\n13948,1467\n13948,1572\n13948,1644\n13948,1722\n13948,2045\n13948,2266\n13948,2931\n13948,3252\n13948,4549\n13948,7092\n13948,13546\n13949,104\n13950,202\n13950,203\n13951,255\n13952,1\n13953,13954\n13956,104\n13957,13958\n13959,13960\n13961,1179\n13961,2681\n13961,31977\n13962,388\n13963,652\n13964,2590\n13965,289\n13965,290\n13965,372\n13965,417\n13965,714\n13965,932\n13965,1012\n13965,1082\n13965,1285\n13965,1564\n13965,1818\n13965,1955\n13965,2205\n13965,2296\n13965,2620\n13965,4218\n13965,33424\n13965,94134\n13965,144988\n13966,589\n13966,1001\n13967,1151\n13969,104\n13969,134\n13969,135\n13969,137\n13969,138\n13969,1368\n13969,2105\n13970,527\n13970,13971\n13972,10\n13972,65\n13972,97\n13972,192\n13972,406\n13972,779\n13972,1127\n13973,207\n13974,301\n13974,968\n13974,1167\n13974,1241\n13974,1298\n13974,1359\n13974,1436\n13974,1479\n13974,1837\n13974,2083\n13974,2979\n13974,3138\n13974,3218\n13974,5718\n13976,366\n13977,366\n13978,795\n13979,13980\n13980,83\n13980,217\n13980,949\n13980,2290\n13980,5046\n13980,13980\n13980,24628\n13980,24653\n13980,80153\n13980,81024\n13980,85823\n13980,234800\n13980,236740\n13980,248640\n13981,255\n13982,358\n13983,1509\n13984,206\n13985,462\n13986,1977\n13986,1978\n13987,163\n13988,493\n13988,13989\n13988,94460\n13990,8235\n13991,37\n13991,446\n13991,567\n13991,698\n13991,699\n13991,762\n13991,936\n13991,937\n13991,938\n13991,1136\n13991,1215\n13991,1231\n13991,1740\n13991,1782\n13991,3421\n13991,7339\n13991,13353\n13991,13991\n13991,30524\n13991,34780\n13991,37362\n13991,46638\n13991,77637\n13991,78868\n13991,85842\n13991,89522\n13991,135196\n13991,135215\n13991,137001\n13991,142067\n13991,151334\n13991,161560\n13991,165989\n13991,189211\n13991,194304\n13991,222552\n13991,224111\n13991,261883\n13992,163\n13992,579\n13993,149\n13994,147\n13994,779\n13994,1515\n13995,383\n13996,13997\n13998,13999\n14000,518\n14001,1639\n14002,163\n14002,302\n14003,163\n14004,163\n14006,77\n14006,79\n14006,83\n14006,206\n14006,259\n14006,301\n14006,305\n14006,337\n14006,516\n14006,581\n14006,760\n14006,900\n14006,1113\n14006,1177\n14006,1238\n14006,1287\n14006,1509\n14006,1860\n14006,2210\n14006,2620\n14006,3193\n14006,95338\n14009,187\n14009,388\n14009,1559\n14010,292\n14010,462\n14010,509\n14010,595\n14010,673\n14010,1453\n14010,1653\n14011,534\n14011,1085\n14011,1580\n14012,233\n14013,949\n14014,1673\n14015,305\n14016,911\n14017,7\n14017,97\n14018,907\n14018,932\n14019,346\n14021,14022\n14021,135486\n14023,1151\n14023,1515\n14024,211\n14024,1844\n14024,2867\n14024,2868\n14025,1043\n14026,1070\n14027,163\n14027,340\n14028,5662\n14029,3451\n14029,3452\n14030,143\n14031,388\n14032,7233\n14034,251\n14035,1858\n14036,1860\n14038,344\n14039,251\n14040,50\n14040,149\n14040,285\n14040,406\n14040,440\n14040,622\n14040,779\n14040,809\n14040,68069\n14040,141912\n14041,1096\n14042,919\n14043,6027\n14044,26\n14044,59\n14045,485\n14046,602\n14047,707\n14048,83\n14048,292\n14048,1411\n14048,3612\n14048,4355\n14049,1276\n14050,207\n14051,13661\n14052,151\n14052,985\n14052,2626\n14052,6824\n14053,422\n14055,611\n14056,1939\n14056,8180\n14058,14059\n14060,435\n14060,663\n14061,1801\n14061,3182\n14061,6424\n14062,298\n14063,485\n14064,178\n14064,202\n14064,203\n14064,240\n14064,269\n14064,366\n14064,467\n14064,500\n14064,571\n14064,622\n14064,818\n14064,868\n14064,1133\n14064,2371\n14064,17309\n14064,156379\n14064,162599\n14065,406\n14065,779\n14065,1515\n14066,1985\n14067,273\n14067,274\n14067,743\n14067,4691\n14068,657\n14069,163\n14070,611\n14071,310\n14073,255\n14075,104\n14076,346\n14077,907\n14077,949\n14077,1133\n14077,1240\n14078,306\n14078,307\n14079,137\n14080,104\n14080,134\n14080,186\n14080,200\n14080,227\n14080,248\n14080,261\n14080,264\n14080,289\n14080,290\n14080,298\n14080,309\n14080,310\n14080,332\n14080,372\n14080,483\n14080,503\n14080,557\n14080,588\n14080,590\n14080,631\n14080,636\n14080,714\n14080,760\n14080,805\n14080,862\n14080,1016\n14080,1119\n14080,1282\n14080,1319\n14080,1462\n14080,1631\n14080,1635\n14080,1745\n14080,1955\n14080,1962\n14080,2205\n14080,2206\n14080,2209\n14080,4237\n14080,6556\n14080,8537\n14080,33424\n14080,94134\n14080,182162\n14080,232766\n14081,818\n14081,14082\n14081,38087\n14081,40194\n14081,43567\n14081,46527\n14081,47344\n14081,49296\n14081,50848\n14081,51700\n14081,52918\n14081,53311\n14081,54939\n14081,57230\n14081,59750\n14081,64452\n14081,69125\n14081,69319\n14081,69384\n14081,70527\n14081,78314\n14081,81462\n14081,83800\n14081,83952\n14081,84758\n14081,86883\n14081,89126\n14081,89846\n14081,90031\n14081,91932\n14081,91997\n14081,92344\n14081,92610\n14081,92723\n14081,93743\n14081,94505\n14081,95986\n14081,96152\n14081,96613\n14081,96856\n14081,96890\n14081,97561\n14081,101356\n14081,104513\n14081,105145\n14081,105814\n14081,106070\n14081,107214\n14081,108771\n14081,110972\n14081,111828\n14081,112129\n14081,112494\n14081,112740\n14081,113104\n14081,114221\n14081,114281\n14081,114642\n14081,114941\n14081,115083\n14081,115914\n14081,117185\n14081,117199\n14081,118751\n14081,118933\n14081,119733\n14081,120374\n14081,120399\n14081,120774\n14081,121495\n14081,122561\n14081,123739\n14081,123956\n14081,124289\n14081,124638\n14081,125026\n14081,125538\n14081,125694\n14081,127617\n14081,128595\n14081,129119\n14081,129281\n14081,129485\n14081,129656\n14081,129987\n14081,130653\n14081,130896\n14081,132727\n14081,134703\n14081,134843\n14081,135014\n14081,139089\n14081,144423\n14081,150971\n14081,151588\n14081,151622\n14081,152038\n14081,153213\n14081,154058\n14081,154236\n14081,161769\n14081,165463\n14081,167431\n14081,167520\n14081,173185\n14081,175201\n14081,182101\n14081,185169\n14081,188680\n14081,193945\n14081,213531\n14081,216480\n14081,217260\n14081,220890\n14081,221574\n14081,221981\n14081,223215\n14081,226413\n14081,227549\n14081,229302\n14081,230120\n14081,230428\n14081,232622\n14081,235360\n14081,235375\n14081,239407\n14081,239466\n14081,239491\n14081,239948\n14081,241449\n14081,242111\n14081,242398\n14081,243054\n14081,243098\n14081,246493\n14081,246635\n14081,246819\n14081,247584\n14081,248930\n14081,248982\n14081,249018\n14081,251209\n14081,260472\n14081,263668\n14081,264708\n14081,264887\n14081,264967\n14083,406\n14084,644\n14085,14086\n14087,358\n14087,15119\n14088,379\n14088,907\n14089,577\n14090,1105\n14092,32\n14092,34\n14092,35\n14092,63\n14092,72\n14092,77\n14092,81\n14092,104\n14092,111\n14092,120\n14092,140\n14092,158\n14092,178\n14092,192\n14092,202\n14092,203\n14092,215\n14092,217\n14092,225\n14092,233\n14092,248\n14092,252\n14092,283\n14092,285\n14092,296\n14092,301\n14092,328\n14092,332\n14092,333\n14092,337\n14092,346\n14092,358\n14092,372\n14092,383\n14092,388\n14092,390\n14092,392\n14092,393\n14092,406\n14092,422\n14092,435\n14092,439\n14092,455\n14092,493\n14092,509\n14092,518\n14092,525\n14092,577\n14092,586\n14092,592\n14092,622\n14092,631\n14092,687\n14092,704\n14092,714\n14092,717\n14092,720\n14092,752\n14092,779\n14092,795\n14092,809\n14092,862\n14092,873\n14092,907\n14092,919\n14092,934\n14092,968\n14092,980\n14092,1001\n14092,1007\n14092,1010\n14092,1016\n14092,1052\n14092,1085\n14092,1105\n14092,1133\n14092,1140\n14092,1149\n14092,1167\n14092,1177\n14092,1179\n14092,1181\n14092,1210\n14092,1231\n14092,1240\n14092,1274\n14092,1282\n14092,1298\n14092,1309\n14092,1326\n14092,1332\n14092,1381\n14092,1392\n14092,1411\n14092,1429\n14092,1436\n14092,1466\n14092,1467\n14092,1509\n14092,1515\n14092,1522\n14092,1544\n14092,1564\n14092,1590\n14092,1634\n14092,1644\n14092,1715\n14092,1722\n14092,1749\n14092,1821\n14092,1837\n14092,1849\n14092,1877\n14092,1893\n14092,1939\n14092,1977\n14092,1978\n14092,2045\n14092,2205\n14092,2206\n14092,2443\n14092,2557\n14092,2596\n14092,2620\n14092,2699\n14092,2701\n14092,2784\n14092,2979\n14092,2989\n14092,2991\n14092,3041\n14092,3135\n14092,3138\n14092,3182\n14092,3194\n14092,3207\n14092,3218\n14092,3422\n14092,3507\n14092,3538\n14092,3585\n14092,3695\n14092,3804\n14092,3999\n14092,5405\n14092,5440\n14092,5662\n14092,5718\n14092,5874\n14092,6068\n14092,6955\n14092,8180\n14092,9001\n14092,14126\n14092,14797\n14092,14819\n14093,1673\n14095,301\n14095,510\n14095,2372\n14095,3422\n14096,893\n14098,707\n14098,1696\n14098,1801\n14098,3182\n14098,3582\n14098,4903\n14098,5178\n14098,6032\n14098,6424\n14098,7087\n14098,13136\n14098,14098\n14098,14099\n14098,14425\n14098,18756\n14098,19285\n14098,20777\n14098,21207\n14098,23311\n14098,23328\n14098,24740\n14098,25395\n14098,26811\n14098,28107\n14098,28193\n14098,29662\n14098,31018\n14098,32462\n14098,32486\n14098,38711\n14098,44457\n14098,44458\n14098,46129\n14098,49003\n14098,58822\n14098,60081\n14098,67867\n14098,94753\n14098,94961\n14098,101741\n14098,106086\n14098,123811\n14098,172668\n14098,213931\n14098,217485\n14098,217899\n14098,234785\n14100,1985\n14100,14101\n14100,31254\n14100,58476\n14100,59653\n14100,66529\n14100,67108\n14100,100237\n14100,174800\n14100,182878\n14100,183466\n14100,195081\n14103,640\n14104,599\n14105,760\n14107,1313\n14108,868\n14110,634\n14111,346\n14111,393\n14111,435\n14111,439\n14111,457\n14111,622\n14111,934\n14111,980\n14111,1033\n14111,1068\n14111,1181\n14111,1294\n14111,1776\n14111,1803\n14111,1849\n14111,1877\n14111,6654\n14111,6966\n14111,13486\n14113,261\n14113,118336\n14114,298\n14115,485\n14116,1634\n14119,163\n14119,252\n14119,301\n14120,20\n14121,818\n14121,1085\n14122,366\n14122,500\n14123,772\n14123,850\n14123,1332\n14125,355\n14127,143\n14128,392\n14128,433\n14128,467\n14128,1634\n14129,14130\n14131,140\n14132,58\n14132,801\n14132,1140\n14132,1177\n14133,818\n14133,1212\n14133,1807\n14133,1955\n14133,2775\n14134,134\n14134,225\n14134,364\n14134,431\n14134,510\n14135,1688\n14136,779\n14136,841\n14136,1515\n14136,23991\n14137,14138\n14139,1359\n14139,1564\n14139,1785\n14140,1531\n14141,248\n14142,163\n14143,163\n14144,1767\n14145,20\n14145,56\n14145,184\n14145,685\n14145,1623\n14145,1634\n14145,1888\n14145,2460\n14146,671\n14148,1257\n14149,862\n14150,147\n14150,211\n14150,503\n14150,516\n14150,1266\n14150,2105\n14151,140\n14152,346\n14152,439\n14153,602\n14153,620\n14153,8244\n14154,136\n14154,225\n14154,248\n14154,252\n14154,557\n14154,1368\n14154,41170\n14155,104\n14155,1210\n14155,1745\n14155,1785\n14155,2205\n14155,2206\n14155,2286\n14155,2995\n14155,33424\n14156,289\n14156,290\n14156,372\n14156,805\n14156,2205\n14156,2206\n14156,94134\n14157,2424\n14158,167\n14158,818\n14158,1287\n14158,1326\n14158,1849\n14158,2979\n14159,1454\n14160,3422\n14161,1058\n14162,1631\n14163,535\n14164,2105\n14165,1616\n14166,149\n14166,406\n14167,140\n14168,920\n14169,602\n14169,620\n14170,422\n14171,422\n14172,422\n14173,422\n14174,422\n14175,422\n14176,422\n14177,2105\n14178,422\n14179,579\n14179,1227\n14179,1229\n14179,1252\n14179,1253\n14179,86416\n14180,422\n14181,1370\n14183,34\n14183,289\n14183,290\n14183,352\n14183,590\n14183,1181\n14183,1204\n14183,1433\n14183,1462\n14183,1825\n14183,1844\n14183,14184\n14183,94134\n14183,144988\n14185,292\n14185,462\n14186,435\n14186,1033\n14187,994\n14187,3816\n14187,3817\n14188,10\n14188,292\n14188,1707\n14189,143\n14190,211\n14191,1052\n14191,1127\n14191,1639\n14191,1893\n14191,2312\n14192,1359\n14193,10\n14193,104\n14193,107\n14193,441\n14193,609\n14193,749\n14193,999\n14193,1001\n14193,1146\n14193,1388\n14193,2209\n14194,140\n14195,1285\n14196,126\n14196,397\n14196,557\n14196,1293\n14196,1326\n14196,2617\n14196,75912\n14197,202\n14197,203\n14198,337\n14199,1579\n14200,1639\n14201,346\n14202,577\n14202,788\n14203,252\n14205,1436\n14206,1522\n14207,1309\n14208,261\n14209,138\n14209,1462\n14209,1745\n14209,8537\n14210,143\n14212,1276\n14213,690\n14213,2617\n14213,4355\n14214,422\n14215,422\n14216,1007\n14217,859\n14218,392\n14220,1844\n14220,2867\n14220,22880\n14221,315\n14222,58\n14222,1453\n14223,143\n14225,1033\n14226,2244\n14228,1127\n14229,1776\n14230,14231\n14231,26\n14231,59\n14231,3794\n14231,14230\n14231,33107\n14231,45744\n14231,172367\n14232,259\n14232,272\n14232,393\n14232,788\n14232,849\n14232,4545\n14232,139010\n14233,328\n14233,439\n14233,440\n14233,622\n14233,1033\n14233,1531\n14233,1590\n14233,1659\n14234,140\n14235,219\n14236,390\n14236,534\n14236,589\n14237,217\n14237,536\n14237,1072\n14237,1801\n14237,2421\n14238,143\n14239,433\n14240,1877\n14242,104\n14242,557\n14242,953\n14242,954\n14242,5405\n14243,240\n14243,301\n14243,1285\n14244,72\n14245,65\n14246,167\n14246,240\n14246,536\n14246,187176\n14248,143\n14249,1454\n14250,907\n14250,932\n14251,1424\n14252,14253\n14252,100223\n14252,106304\n14254,5265\n14255,433\n14256,3507\n14257,163\n14259,163\n14260,1858\n14261,592\n14262,83\n14263,4\n14263,5\n14263,298\n14264,2083\n14264,3218\n14265,72\n14266,22\n14267,417\n14268,2224\n14269,2424\n14270,301\n14271,13980\n14272,2779\n14273,581\n14274,14275\n14276,1323\n14277,102\n14278,1326\n14279,408\n14280,1082\n14280,1474\n14281,500\n14282,298\n14283,485\n14284,143\n14287,97\n14288,1058\n14289,336\n14290,861\n14290,1284\n14290,1300\n14290,1949\n14290,3630\n14291,143\n14292,868\n14293,209\n14294,3623\n14295,1132\n14295,191860\n14296,3\n14297,264\n14297,338\n14297,360\n14297,515\n14297,652\n14297,835\n14297,872\n14297,1052\n14297,1224\n14297,1289\n14297,1659\n14297,1893\n14297,1968\n14297,21408\n14298,163\n14299,1070\n14300,422\n14301,56\n14302,30\n14302,694\n14302,1201\n14302,1388\n14302,142430\n14302,142473\n14302,142879\n14302,150529\n14304,287\n14304,433\n14304,467\n14304,1634\n14305,1133\n14306,422\n14307,143\n14308,3967\n14309,58\n14310,46\n14311,222\n14311,390\n14311,567\n14311,589\n14311,1326\n14312,491\n14312,788\n14312,801\n14312,1559\n14313,1805\n14314,312\n14315,403\n14316,4\n14316,5\n14316,355\n14316,527\n14316,743\n14316,4810\n14316,8714\n14316,13704\n14316,64036\n14316,95583\n14317,302\n14318,143\n14320,2775\n14321,447\n14322,227\n14323,1265\n14323,1266\n14324,515\n14325,1715\n14326,8798\n14327,417\n14328,1231\n14329,622\n14330,7572\n14331,4549\n14332,2266\n14333,1467\n14334,9098\n14335,2557\n14336,6955\n14337,1359\n14338,1882\n14339,919\n14340,5987\n14341,973\n14342,1429\n14343,3474\n14344,1449\n14345,50\n14345,1515\n14346,536\n14347,366\n14348,657\n14349,4411\n14350,1007\n14350,3999\n14351,5358\n14351,14352\n14352,5358\n14352,14352\n14352,224666\n14353,292\n14353,397\n14353,745\n14353,1572\n14353,3538\n14353,3830\n14353,16153\n14355,6661\n14356,143\n14357,509\n14358,309\n14358,310\n14358,536\n14358,694\n14358,818\n14358,1019\n14358,1085\n14358,1181\n14358,1417\n14358,1580\n14358,1659\n14358,2480\n14358,14368\n14358,31206\n14358,75912\n14358,138686\n14359,592\n14359,1818\n14361,1400\n14361,4805\n14362,14363\n14364,332\n14365,14366\n14366,14366\n14369,536\n14369,4672\n14371,261\n14371,710\n14371,726\n14373,26\n14373,59\n14373,1235\n14373,1335\n14374,1688\n14375,1\n14375,147\n14375,158\n14375,160\n14375,285\n14375,292\n14375,424\n14375,485\n14375,920\n14375,934\n14375,996\n14375,1010\n14375,2373\n14375,2784\n14375,3623\n14375,3695\n14375,5375\n14375,16687\n14375,204121\n14376,592\n14377,2681\n14378,1033\n14378,189128\n14379,1844\n14379,3507\n14380,346\n14380,435\n14380,447\n14381,907\n14381,2191\n14382,1127\n14384,222\n14384,389\n14384,657\n14384,5343\n14385,685\n14385,900\n14386,3115\n14387,843\n14388,111\n14388,1096\n14388,2704\n14388,3555\n14390,1619\n14390,1623\n14390,18535\n14393,934\n14394,859\n14395,1590\n14396,106\n14396,346\n14396,1068\n14396,1370\n14396,3718\n14396,24659\n14396,43005\n14396,189128\n14396,189130\n14396,189854\n14396,189879\n14396,190492\n14396,193101\n14396,194483\n14396,212914\n14396,217894\n14396,222036\n14396,227229\n14396,235816\n14397,315\n14398,240\n14399,346\n14399,671\n14400,652\n14400,1659\n14401,932\n14402,1\n14402,149\n14402,2105\n14404,420\n14405,240\n14406,134\n14408,72\n14409,54\n14410,217\n14410,222\n14410,1417\n14411,599\n14411,1085\n14412,581\n14414,510\n14414,760\n14414,949\n14414,1143\n14414,1149\n14414,1241\n14414,1293\n14414,1370\n14414,1411\n14414,2496\n14415,693\n14415,4980\n14416,1509\n14417,225\n14417,248\n14417,1332\n14417,5405\n14418,805\n14419,415\n14421,781\n14422,980\n14423,1453\n14423,1572\n14423,2697\n14423,14458\n14424,723\n14425,79\n14425,6424\n14425,28107\n14426,37\n14426,106\n14426,283\n14426,328\n14426,390\n14426,455\n14426,518\n14426,934\n14426,1010\n14426,1068\n14426,1177\n14426,1309\n14426,1370\n14426,1454\n14426,1479\n14426,1801\n14426,1837\n14426,2480\n14426,2590\n14426,2620\n14427,206\n14428,315\n14428,346\n14428,435\n14428,996\n14428,1033\n14428,1849\n14428,1877\n14428,2353\n14428,6654\n14428,13486\n14428,21442\n14428,32784\n14429,1531\n14430,19\n14430,135\n14430,340\n14430,611\n14430,887\n14430,994\n14430,2750\n14430,6387\n14430,14434\n14430,75912\n14431,718\n14431,1188\n14432,79\n14432,192\n14432,425\n14432,663\n14432,664\n14432,861\n14432,1149\n14433,147\n14433,192\n14433,195\n14433,336\n14433,1381\n14433,6119\n14434,192\n14434,9379\n14434,36972\n14434,37261\n14434,47389\n14434,55279\n14434,55294\n14434,55304\n14434,96305\n14434,99256\n14434,102093\n14435,344\n14436,1776\n14437,760\n14439,1146\n14440,615\n14441,417\n14442,1983\n14443,920\n14444,289\n14444,290\n14444,1149\n14444,94134\n14445,147\n14445,158\n14446,147\n14446,422\n14449,1010\n14449,1122\n14450,1282\n14451,485\n14452,163\n14452,209\n14452,302\n14452,579\n14452,4453\n14454,143\n14455,620\n14456,503\n14456,818\n14456,1635\n14457,192\n14457,309\n14457,310\n14457,435\n14457,4678\n14457,14458\n14460,222\n14460,827\n14460,934\n14460,1564\n14460,75912\n14461,1425\n14462,163\n14462,489\n14463,1977\n14463,1978\n14464,634\n14466,219\n14467,195\n14467,356\n14468,195\n14468,356\n14469,973\n14469,3474\n14470,690\n14470,1433\n14471,71\n14471,14472\n14473,596\n14474,332\n14475,349\n14476,1402\n14476,2286\n14477,808\n14479,349\n14480,2105\n14481,1191\n14482,294\n14482,431\n14482,631\n14482,784\n14482,1353\n14483,175\n14483,663\n14483,664\n14483,693\n14483,21171\n14483,30999\n14483,57002\n14483,62988\n14483,127104\n14483,129784\n14484,240\n14484,301\n14484,406\n14484,1298\n14485,1509\n14486,634\n14486,2867\n14486,22880\n14487,760\n14487,1119\n14487,1149\n14487,1285\n14487,1631\n14488,3138\n14489,911\n14490,147\n14490,1515\n14490,8308\n14490,240174\n14491,703\n14491,1453\n14492,538\n14492,1877\n14493,1033\n14494,389\n14494,392\n14494,697\n14494,2045\n14494,2699\n14494,3260\n14495,390\n14496,83\n14497,972\n14497,1010\n14497,1298\n14497,1849\n14498,167\n14498,207\n14498,631\n14498,1210\n14500,704\n14500,1212\n14500,1282\n14501,65\n14501,171\n14501,957\n14502,149\n14502,158\n14503,22\n14503,457\n14503,1363\n14503,1805\n14504,4611\n14505,1544\n14506,1531\n14508,4611\n14509,1544\n14510,3148\n14511,63\n14511,72\n14511,163\n14511,222\n14511,233\n14511,252\n14511,304\n14511,326\n14511,340\n14511,408\n14511,422\n14511,491\n14511,605\n14511,620\n14511,626\n14511,652\n14511,671\n14511,682\n14511,703\n14511,726\n14511,733\n14511,749\n14511,808\n14511,1052\n14511,1309\n14511,1313\n14511,1319\n14511,1368\n14511,1381\n14511,1425\n14511,1434\n14511,1465\n14511,1608\n14511,1634\n14511,1644\n14511,1707\n14511,2315\n14511,3218\n14511,3451\n14511,3474\n14511,4771\n14511,28294\n14511,72439\n14514,2178\n14514,4545\n14515,273\n14515,274\n14516,225\n14516,248\n14516,450\n14516,850\n14516,1332\n14516,2596\n14516,5405\n14517,222\n14517,1639\n14518,515\n14518,652\n14518,1893\n14520,287\n14520,1707\n14521,4190\n14522,182\n14522,188\n14522,206\n14522,4453\n14523,2315\n14524,372\n14524,760\n14524,1149\n14524,1631\n14525,3258\n14525,4903\n14526,697\n14528,1458\n14529,111\n14529,1462\n14529,8537\n14530,269\n14531,710\n14531,1893\n14532,932\n14533,1146\n14533,1363\n14534,192\n14535,364\n14536,104\n14536,1801\n14537,1467\n14538,760\n14539,557\n14540,500\n14540,718\n14541,83\n14541,285\n14541,349\n14541,442\n14541,626\n14541,634\n14541,949\n14541,1012\n14541,1274\n14541,1465\n14541,1467\n14541,1881\n14541,2646\n14541,2779\n14541,2784\n14541,9015\n14541,28130\n14543,323\n14543,647\n14543,14550\n14543,75339\n14544,304\n14546,22\n14546,818\n14546,861\n14547,332\n14548,22\n14548,861\n14548,893\n14549,673\n14551,972\n14552,272\n14554,240\n14554,592\n14554,1001\n14554,1085\n14555,14556\n14556,4166\n14556,45373\n14556,45679\n14556,113506\n14556,164826\n14556,221547\n14557,389\n14558,13575\n14559,1871\n14560,366\n14561,252\n14562,406\n14564,364\n14564,431\n14565,58\n14565,309\n14565,310\n14565,314\n14565,450\n14565,626\n14565,1046\n14565,1085\n14565,1140\n14565,1284\n14565,6556\n14565,7155\n14566,50\n14567,79\n14567,1767\n14568,83\n14569,163\n14569,360\n14569,489\n14569,1559\n14570,50\n14570,99\n14570,779\n14572,301\n14572,388\n14572,518\n14572,775\n14572,972\n14572,1001\n14572,1326\n14572,1522\n14572,1849\n14572,2646\n14572,48505\n14572,148742\n14573,163\n14573,171\n14573,305\n14573,447\n14573,489\n14573,1132\n14574,1531\n14575,626\n14576,392\n14577,202\n14577,203\n14577,1149\n14577,1631\n14578,202\n14578,1419\n14578,2436\n14579,872\n14580,356\n14580,3207\n14581,264\n14582,760\n14582,81070\n14583,406\n14584,50\n14585,14586\n14587,1564\n14588,171\n14588,957\n14588,1815\n14589,87\n14589,192\n14589,518\n14589,634\n14589,660\n14589,740\n14589,741\n14589,811\n14589,996\n14589,1052\n14589,1267\n14589,1509\n14589,3474\n14589,21944\n14589,187176\n14589,204093\n14590,14591\n14592,140\n14592,360\n14592,462\n14592,467\n14592,872\n14592,1127\n14592,1893\n14594,163\n14595,86\n14595,167\n14595,240\n14595,301\n14595,372\n14595,567\n14595,589\n14595,605\n14595,615\n14595,631\n14595,720\n14595,801\n14595,907\n14595,968\n14595,972\n14595,973\n14595,1010\n14595,1122\n14595,1124\n14595,1140\n14595,1167\n14595,1231\n14595,1241\n14595,1284\n14595,1298\n14595,1309\n14595,1436\n14595,1522\n14595,1544\n14595,1564\n14595,1782\n14595,1785\n14595,1818\n14595,1837\n14595,1849\n14595,1893\n14595,1955\n14595,2083\n14595,2191\n14595,2372\n14595,2557\n14595,2620\n14595,2979\n14595,3193\n14595,3207\n14595,3218\n14597,134\n14597,240\n14597,299\n14597,332\n14597,372\n14597,390\n14597,431\n14597,631\n14597,873\n14597,1082\n14597,1085\n14597,1119\n14597,1122\n14597,1849\n14597,1955\n14597,2557\n14597,2775\n14597,6068\n14598,37\n14598,663\n14598,664\n14598,968\n14598,972\n14598,1293\n14598,3422\n14600,720\n14600,907\n14600,1117\n14601,1289\n14602,171\n14603,372\n14603,417\n14603,932\n14603,1082\n14603,1085\n14603,1285\n14603,1564\n14603,1785\n14603,1818\n14603,1955\n14603,2205\n14603,2296\n14603,2620\n14603,5718\n14603,33424\n14604,222\n14605,11\n14605,63\n14605,107\n14605,160\n14605,207\n14605,264\n14605,272\n14605,273\n14605,294\n14605,302\n14605,376\n14605,515\n14605,713\n14605,733\n14605,736\n14605,877\n14605,968\n14605,1010\n14605,1058\n14605,1122\n14605,1298\n14605,1381\n14605,1572\n14605,1579\n14605,1634\n14605,1767\n14605,1881\n14605,2191\n14605,2372\n14605,2668\n14605,2750\n14605,3194\n14605,4549\n14605,6298\n14605,143287\n14606,4455\n14607,422\n14608,56\n14609,422\n14610,56\n14611,2051\n14612,217\n14612,313\n14612,536\n14612,2646\n14612,2784\n14612,4672\n14612,18831\n14613,240\n14613,1309\n14614,301\n14615,1167\n14615,1544\n14616,579\n14617,58\n14617,801\n14617,1140\n14617,5547\n14618,8854\n14619,1467\n14620,911\n14621,809\n14622,1181\n14623,1417\n14624,843\n14625,292\n14625,1058\n14625,14650\n14626,932\n14627,1425\n14629,140\n14630,2205\n14630,2206\n14630,33424\n14630,245910\n14631,687\n14631,1556\n14632,1385\n14634,1058\n14635,323\n14635,1052\n14635,1659\n14635,2051\n14636,444\n14636,563\n14636,1133\n14636,188791\n14637,147\n14637,158\n14637,195\n14637,336\n14638,254\n14638,557\n14638,954\n14638,1939\n14639,1603\n14640,861\n14641,1212\n14642,2557\n14643,809\n14644,518\n14644,801\n14644,1140\n14645,65\n14645,66\n14645,571\n14646,227\n14646,323\n14646,736\n14646,3138\n14648,919\n14649,117\n14649,1227\n14649,1229\n14649,2712\n14649,21944\n14650,1247\n14650,109503\n14651,868\n14651,1433\n14651,156379\n14653,949\n14654,66\n14655,996\n14656,107\n14656,338\n14656,1052\n14656,2312\n14656,2367\n14657,1143\n14658,712\n14658,798\n14658,1172\n14658,1434\n14658,14674\n14659,2146\n14660,623\n14661,1893\n14662,72\n14663,516\n14663,3182\n14663,4355\n14664,206\n14665,314\n14665,392\n14665,644\n14665,1363\n14666,147\n14667,356\n14667,1955\n14669,20\n14670,254\n14671,219\n14672,195\n14672,779\n14673,247\n14674,256\n14674,457\n14674,481\n14674,911\n14674,1014\n14674,1452\n14674,1479\n14674,8419\n14674,9015\n14674,30299\n14676,264\n14677,717\n14677,784\n14678,1429\n14679,788\n14680,992\n14682,34\n14682,35\n14682,313\n14682,634\n14682,852\n14682,1313\n14682,1718\n14682,2224\n14682,2646\n14682,5326\n14682,5547\n14683,697\n14684,347\n14685,4\n14685,5\n14685,355\n14686,195\n14687,171\n14688,433\n14689,433\n14690,1454\n14691,151\n14692,255\n14693,1962\n14694,390\n14695,302\n14696,184\n14697,273\n14697,274\n14698,1551\n14699,143\n14700,406\n14700,779\n14700,1515\n14700,68069\n14701,3193\n14702,509\n14703,932\n14704,1007\n14705,41\n14705,1012\n14706,1639\n14707,192\n14708,1231\n14709,586\n14710,622\n14711,178\n14712,1590\n14713,671\n14714,515\n14715,346\n14716,439\n14717,333\n14718,1749\n14718,3585\n14718,14719\n14722,346\n14723,41\n14723,1285\n14723,1462\n14723,3135\n14723,8537\n14724,1454\n14725,392\n14725,1151\n14725,1363\n14726,97\n14726,211\n14726,406\n14726,17886\n14727,872\n14728,34\n14728,35\n14728,366\n14728,390\n14728,749\n14728,918\n14728,1146\n14729,333\n14729,4193\n14730,261\n14730,3115\n14730,32751\n14731,7416\n14732,34\n14732,35\n14732,217\n14732,389\n14732,536\n14732,1618\n14733,861\n14734,280\n14734,17245\n14735,206\n14735,2073\n14735,2626\n14736,143\n14737,599\n14738,483\n14739,538\n14739,1294\n14740,718\n14741,515\n14741,652\n14741,1052\n14741,2312\n14742,536\n14743,781\n14744,349\n14745,1858\n14746,1860\n14747,3\n14747,240\n14747,390\n14747,592\n14747,968\n14748,872\n14749,86\n14749,184\n14749,273\n14749,274\n14749,292\n14749,1010\n14750,309\n14750,310\n14751,6068\n14751,6803\n14752,663\n14752,664\n14753,1133\n14754,1326\n14756,147\n14757,1801\n14758,873\n14759,50\n14760,135\n14760,1282\n14761,22\n14761,302\n14761,861\n14762,577\n14763,14764\n14763,44658\n14763,77146\n14763,88855\n14763,94577\n14763,95296\n14763,95773\n14763,96458\n14763,97039\n14763,99462\n14763,99800\n14763,100393\n14763,104914\n14765,302\n14765,687\n14765,861\n14765,893\n14765,1556\n14766,2411\n14767,7\n14767,202\n14767,269\n14767,285\n14767,356\n14767,358\n14767,467\n14767,640\n14767,843\n14767,2620\n14767,9015\n14767,147123\n14768,248\n14768,450\n14768,717\n14768,1332\n14769,143\n14770,143\n14771,1411\n14772,217\n14772,536\n14773,8798\n14774,5662\n14775,1849\n14776,1715\n14777,417\n14778,1955\n14779,1231\n14780,752\n14781,1564\n14782,5718\n14783,2083\n14784,2620\n14785,390\n14786,1837\n14787,3422\n14788,589\n14789,1241\n14790,6068\n14791,233\n14792,3\n14793,1001\n14794,240\n14795,63\n14796,14797\n14798,577\n14799,192\n14799,289\n14799,631\n14799,94134\n14799,143287\n14800,163\n14801,592\n14802,3555\n14803,586\n14804,247\n14805,736\n14806,65\n14806,252\n14807,72\n14808,151\n14809,147\n14810,14811\n14810,40108\n14812,14811\n14813,14811\n14814,14811\n14815,302\n14816,852\n14816,980\n14818,143\n14820,104\n14820,120\n14820,225\n14820,694\n14820,784\n14820,1001\n14820,1353\n14820,2572\n14820,2775\n14820,3585\n14820,3623\n14821,424\n14822,1983\n14823,14811\n14824,3724\n14825,920\n14826,1571\n14827,1\n14828,301\n14828,968\n14829,79\n14829,192\n14829,1392\n14830,79\n14830,192\n14830,202\n14830,203\n14830,336\n14830,1619\n14830,1623\n14831,447\n14831,788\n14832,376\n14834,697\n14835,3260\n14836,5101\n14837,364\n14838,827\n14841,14842\n14843,247\n14844,136\n14845,184\n14846,1608\n14847,872\n14848,72\n14850,215\n14851,14852\n14854,192\n14855,770\n14856,313\n14856,1052\n14856,2421\n14857,1313\n14858,4\n14858,5\n14859,233\n14860,83\n14861,2671\n14862,1181\n14865,808\n14867,500\n14868,1962\n14869,1052\n14870,1882\n14871,2775\n14872,54\n14873,2210\n14873,4237\n14874,240\n14874,818\n14875,272\n14876,430\n14877,14878\n14879,1235\n14879,1335\n14880,920\n14881,2506\n14882,140\n14883,267\n14884,146\n14885,1858\n14886,6424\n14886,14887\n14886,40958\n14888,14887\n14888,40958\n14889,1860\n14890,346\n14891,32\n14891,392\n14891,644\n14891,697\n14891,875\n14891,1151\n14892,48\n14893,1078\n14894,346\n14895,479\n14896,14897\n14896,73218\n14898,557\n14899,557\n14900,1509\n14901,13661\n14902,2782\n14903,481\n14904,390\n14905,50\n14905,14906\n14905,95898\n14908,347\n14909,376\n14910,885\n14911,79\n14911,704\n14911,1433\n14912,424\n14913,158\n14913,301\n14913,392\n14913,406\n14913,779\n14913,1454\n14914,79\n14915,160\n14915,1130\n14916,37\n14916,301\n14916,1231\n14916,1782\n14917,217\n14917,663\n14917,664\n14917,779\n14917,809\n14917,920\n14917,1033\n14917,1181\n14917,1414\n14917,2889\n14917,5440\n14918,264\n14918,1007\n14918,1010\n14918,3041\n14918,5440\n14919,1151\n14919,3585\n14920,3585\n14921,22\n14922,455\n14922,1019\n14922,18831\n14923,273\n14923,274\n14924,968\n14924,1544\n14924,1955\n14924,2083\n14925,694\n14925,3623\n14926,417\n14926,525\n14926,805\n14926,1085\n14926,1140\n14926,1749\n14926,1818\n14926,2286\n14927,298\n14928,485\n14929,143\n14929,1052\n14930,146\n14931,1247\n14932,3297\n14933,247\n14934,332\n14934,1454\n14935,827\n14936,143\n14937,1370\n14938,158\n14939,97\n14940,302\n14941,346\n14942,3507\n14943,1844\n14944,219\n14945,225\n14945,1893\n14945,4294\n14946,1433\n14947,309\n14947,310\n14948,58\n14949,861\n14950,50\n14951,163\n14952,364\n14952,431\n14953,298\n14954,485\n14955,143\n14956,211\n14957,652\n14958,731\n14959,731\n14960,731\n14961,749\n14961,1146\n14962,1858\n14963,1860\n14964,143\n14965,392\n14966,493\n14967,366\n14967,571\n14968,15\n14969,862\n14970,299\n14971,14972\n14971,117338\n14973,72\n14974,66\n14975,30\n14975,328\n14975,1179\n14976,72\n14977,346\n14978,2506\n14979,3653\n14980,72\n14981,143\n14982,417\n14983,14984\n14985,1151\n14986,97\n14987,389\n14987,455\n14987,805\n14987,1718\n14987,1756\n14987,28130\n14988,3846\n14988,14989\n14989,14989\n14990,294\n14991,1204\n14992,94\n14992,2787\n14993,536\n14994,309\n14994,310\n14995,14996\n14997,2784\n14997,4903\n14998,104\n14998,248\n14999,65\n15000,163\n15001,452\n15002,50\n15002,1414\n15003,1247\n15004,1556\n15005,2620\n15006,2506\n15007,163\n15008,2436\n15009,424\n15011,72\n15012,920\n15013,2506\n15014,430\n15015,920\n15016,682\n15017,536\n15017,781\n15017,4672\n15017,18831\n15018,626\n15019,72\n15020,301\n15020,968\n15021,163\n15022,200\n15022,278\n15022,1072\n15022,1836\n15022,1871\n15022,2421\n15022,3585\n15023,1007\n15024,784\n15025,2146\n15025,15026\n15025,39168\n15025,51721\n15025,57087\n15025,63654\n15025,72120\n15025,100470\n15025,115315\n15027,116\n15027,994\n15027,2087\n15027,2590\n15028,54\n15028,5906\n15029,15030\n15031,366\n15032,264\n15033,143\n15034,602\n15035,424\n15036,1363\n15037,72\n15038,72\n15039,1515\n15040,301\n15040,717\n15040,1231\n15040,1740\n15040,1782\n15041,652\n15042,72\n15043,15044\n15045,48\n15045,175\n15045,275\n15045,277\n15045,704\n15045,1085\n15045,1247\n15045,1452\n15045,2782\n15045,48955\n15045,135585\n15045,164572\n15046,424\n15047,422\n15047,589\n15048,424\n15049,81\n15050,292\n15050,795\n15050,3804\n15051,1515\n15052,298\n15053,485\n15054,50\n15054,399\n15054,758\n15054,1844\n15054,3999\n15055,251\n15056,392\n15057,15058\n15059,15060\n15059,38719\n15061,149\n15061,622\n15061,973\n15061,1010\n15061,1298\n15061,1436\n15061,5662\n15062,349\n15063,1001\n15064,178\n15064,346\n15065,15066\n15067,58\n15067,118\n15067,272\n15067,273\n15067,328\n15067,422\n15067,647\n15067,1179\n15067,1353\n15067,1425\n15067,3115\n15067,4597\n15067,15068\n15069,233\n15070,346\n15071,15072\n15073,66\n15073,1284\n15073,1544\n15074,726\n15074,859\n15075,15076\n15077,9343\n15077,176782\n15078,248\n15078,450\n15078,1332\n15079,104\n15080,15081\n15080,93608\n15080,113926\n15082,1968\n15083,146\n15084,1858\n15085,1860\n15086,222\n15086,278\n15087,211\n15087,333\n15088,3\n15089,337\n15089,505\n15090,4222\n15091,104\n15091,138\n15091,850\n15092,1858\n15093,1860\n15095,7757\n15096,379\n15096,1454\n15096,21982\n15097,2812\n15098,336\n15098,422\n15098,21442\n15100,1085\n15101,1559\n15102,79\n15103,760\n15105,302\n15105,861\n15107,289\n15107,290\n15107,304\n15107,328\n15107,1715\n15107,1962\n15108,425\n15109,41\n15109,186\n15109,431\n15109,444\n15109,518\n15109,589\n15109,673\n15109,685\n15109,764\n15109,775\n15109,795\n15109,852\n15109,973\n15109,1001\n15109,1011\n15109,1085\n15109,1172\n15109,1326\n15109,1580\n15109,1732\n15109,2209\n15109,3422\n15109,3804\n15109,5961\n15109,23437\n15109,75912\n15109,188791\n15110,1052\n15111,1265\n15111,1266\n15111,7652\n15112,175\n15112,285\n15112,779\n15112,875\n15112,1425\n15112,1515\n15112,8055\n15113,663\n15113,664\n15113,1370\n15113,2260\n15113,2782\n15113,8244\n15113,92476\n15113,106502\n15114,149\n15114,406\n15115,77\n15115,489\n15115,595\n15115,1070\n15115,1634\n15115,1707\n15115,1984\n15116,2045\n15117,818\n15117,1285\n15118,1509\n15120,8854\n15121,500\n15122,1962\n15123,1052\n15124,1882\n15125,2775\n15126,54\n15127,2210\n15127,4237\n15128,685\n15128,827\n15129,644\n15130,493\n15131,130\n15132,163\n15133,758\n15134,255\n15135,775\n15135,1411\n15135,5130\n15136,15137\n15136,21851\n15138,2784\n15139,58\n15140,46\n15141,178\n15141,346\n15141,439\n15141,447\n15141,611\n15141,622\n15141,671\n15141,1033\n15141,1294\n15141,1590\n15141,1644\n15141,1849\n15141,1877\n15141,6661\n15141,6662\n15141,13486\n15141,32784\n15141,172181\n15142,775\n15143,65\n15143,333\n15143,346\n15144,698\n15145,1511\n15145,3069\n15146,934\n15146,1877\n15147,1511\n15147,3069\n15148,1068\n15149,1511\n15149,3069\n15151,2210\n15151,4237\n15152,1607\n15153,781\n15154,422\n15155,1\n15155,1425\n15155,1623\n15155,3769\n15155,6837\n15155,30331\n15156,346\n15157,433\n15158,640\n15159,852\n15159,1284\n15159,1732\n15159,148742\n15160,595\n15160,1146\n15161,306\n15161,307\n15162,1\n15163,104\n15163,134\n15163,135\n15164,1564\n15164,1785\n15165,1858\n15166,1860\n15167,433\n15170,2991\n15171,278\n15171,389\n15171,455\n15171,808\n15172,298\n15173,485\n15174,1345\n15175,1858\n15176,1860\n15177,106\n15178,1707\n15179,3724\n15179,7921\n15179,15988\n15179,46726\n15179,47522\n15179,52383\n15179,58871\n15179,116709\n15179,152687\n15179,153449\n15179,155032\n15179,191423\n15179,203911\n15179,230590\n15179,235953\n15179,253767\n15180,1634\n15181,163\n15183,77\n15183,332\n15183,389\n15183,631\n15183,1167\n15183,1298\n15183,1466\n15183,2512\n15183,2979\n15184,425\n15185,1888\n15186,366\n15186,389\n15186,536\n15186,577\n15186,671\n15186,673\n15186,784\n15186,872\n15186,1007\n15186,1033\n15186,1052\n15186,1105\n15186,1436\n15186,1474\n15186,1539\n15186,1608\n15186,1644\n15186,1707\n15186,1849\n15186,3769\n15186,5213\n15186,6789\n15186,21944\n15186,30331\n15186,143287\n15186,207837\n15187,707\n15188,147\n15189,397\n15189,503\n15189,1149\n15190,1607\n15191,634\n15192,99\n15193,315\n15194,1179\n15195,467\n15196,447\n15197,389\n15197,536\n15198,781\n15199,65\n15199,868\n15199,1433\n15200,408\n15201,452\n15202,720\n15202,1284\n15203,147\n15203,972\n15204,2051\n15204,49057\n15205,72\n15206,68\n15206,314\n15206,1119\n15206,127158\n15207,392\n15207,1240\n15208,861\n15209,34\n15209,35\n15209,536\n15209,14126\n15210,622\n15210,4691\n15211,273\n15211,274\n15211,66754\n15213,259\n15214,389\n15215,140\n15215,264\n15215,360\n15215,515\n15215,736\n15215,835\n15215,1267\n15215,1381\n15215,1509\n15215,1968\n15215,49057\n15216,333\n15217,81\n15217,3507\n15218,22\n15218,314\n15219,15220\n15221,104\n15221,215\n15221,1085\n15221,2205\n15221,2206\n15223,1849\n15223,32784\n15224,2995\n15225,687\n15225,1556\n15226,999\n15227,356\n15227,1309\n15228,309\n15228,310\n15229,106\n15229,146\n15229,289\n15229,290\n15229,620\n15229,647\n15229,663\n15229,664\n15229,714\n15229,1149\n15229,1370\n15229,1425\n15229,2260\n15229,2674\n15229,2782\n15229,8244\n15229,106502\n15231,206\n15234,41\n15234,379\n15234,772\n15234,3474\n15234,5908\n15236,957\n15236,1247\n15236,1815\n15237,346\n15238,439\n15239,4637\n15241,527\n15241,8072\n15242,1452\n15243,1220\n15243,1222\n15244,72\n15245,217\n15245,1417\n15245,1881\n15246,72\n15247,15248\n15249,379\n15249,385\n15249,2779\n15249,5933\n15250,143\n15251,1433\n15252,26\n15252,59\n15253,160\n15253,481\n15253,973\n15253,1058\n15253,1243\n15253,1807\n15255,1858\n15256,1860\n15257,920\n15258,192\n15258,346\n15258,1181\n15258,5726\n15259,1001\n15259,1085\n15259,73570\n15259,75912\n15260,1983\n15261,149\n15261,217\n15262,65\n15263,1188\n15265,500\n15266,1858\n15267,1860\n15268,626\n15269,717\n15270,726\n15270,859\n15271,431\n15272,907\n15272,1082\n15272,1284\n15272,1715\n15272,148742\n15273,287\n15274,515\n15275,147\n15275,1172\n15275,1433\n15275,1844\n15276,158\n15277,47\n15277,104\n15277,167\n15277,240\n15277,294\n15277,459\n15277,518\n15277,631\n15277,775\n15277,818\n15277,973\n15277,1012\n15277,1085\n15277,1119\n15277,1282\n15277,1300\n15277,1411\n15277,1415\n15277,1715\n15277,1745\n15277,2089\n15277,2205\n15277,2206\n15277,2469\n15277,2940\n15277,4237\n15277,5130\n15277,21603\n15277,21944\n15277,23287\n15277,127158\n15277,136072\n15277,171641\n15277,178576\n15278,1181\n15279,515\n15279,1052\n15279,1893\n15279,2312\n15279,6695\n15280,158\n15280,206\n15280,4193\n15280,21442\n15281,832\n15282,980\n15282,1014\n15283,120\n15283,3115\n15284,1323\n15285,102\n15286,1326\n15287,408\n15288,1644\n15289,660\n15290,479\n15290,534\n15290,535\n15290,862\n15290,75912\n15291,3630\n15292,11\n15292,134\n15293,292\n15293,852\n15294,515\n15295,1298\n15297,422\n15298,1977\n15298,1978\n15299,298\n15300,250\n15300,887\n15300,1684\n15301,485\n15302,2051\n15302,49057\n15303,1240\n15303,2253\n15303,6424\n15304,106\n15304,146\n15304,620\n15304,647\n15304,663\n15304,664\n15304,1370\n15304,2260\n15304,2782\n15304,8244\n15304,106502\n15305,104\n15305,135\n15307,143\n15308,182\n15308,188\n15308,206\n15308,4453\n15309,3089\n15310,1172\n15311,72\n15312,393\n15312,980\n15312,1821\n15313,130\n15313,186\n15313,264\n15313,333\n15313,663\n15313,664\n15313,808\n15313,1551\n15313,9457\n15314,136\n15315,1707\n15316,1117\n15317,312\n15317,420\n15318,1436\n15319,147\n15319,192\n15319,195\n15320,254\n15321,795\n15322,72\n15323,5440\n15324,20\n15325,34\n15325,167\n15325,222\n15325,338\n15325,657\n15325,1019\n15325,1285\n15325,2266\n15326,647\n15326,736\n15326,835\n15326,1289\n15326,1509\n15326,1659\n15326,2292\n15327,72\n15328,3161\n15328,8270\n15330,147\n15330,158\n15330,175\n15330,406\n15330,505\n15330,1181\n15330,1298\n15330,118336\n15331,3193\n15332,146\n15332,17593\n15332,92476\n15333,1531\n15334,111\n15334,503\n15334,805\n15334,1149\n15334,1462\n15334,8537\n15335,289\n15335,290\n15336,217\n15336,479\n15336,893\n15336,1118\n15336,1659\n15336,2367\n15336,19356\n15337,104\n15337,134\n15338,302\n15338,579\n15339,111\n15339,264\n15339,292\n15339,462\n15339,745\n15339,1147\n15339,1151\n15339,1631\n15339,1688\n15339,2209\n15339,3695\n15339,4039\n15340,79\n15340,406\n15340,6279\n15342,1858\n15343,1860\n15345,447\n15345,671\n15345,6119\n15346,135\n15347,15\n15349,163\n15350,86\n15350,1204\n15350,1243\n15350,1559\n15351,7\n15352,660\n15352,891\n15353,626\n15353,3193\n15354,79\n15354,693\n15354,1718\n15355,346\n15355,439\n15355,1033\n15355,1294\n15355,1474\n15355,1849\n15355,6661\n15356,1381\n15357,248\n15359,712\n15360,710\n15360,1893\n15361,143\n15362,442\n15362,592\n15362,1745\n15363,1243\n15363,4355\n15364,707\n15365,192\n15365,195\n15369,137\n15370,1235\n15370,1335\n15371,26\n15371,41\n15371,58\n15371,59\n15371,151\n15371,264\n15371,309\n15371,310\n15371,328\n15371,344\n15371,390\n15371,439\n15371,455\n15371,538\n15371,779\n15371,872\n15371,877\n15371,1289\n15371,1381\n15371,1436\n15371,1452\n15371,1474\n15371,1544\n15371,2312\n15371,3695\n15371,16687\n15371,227669\n15372,15373\n15374,515\n15375,50\n15376,557\n15377,135\n15378,994\n15379,346\n15380,167\n15380,852\n15380,1300\n15380,1319\n15380,2083\n15380,3630\n15381,99\n15382,83\n15382,356\n15384,252\n15384,1220\n15384,1222\n15385,1425\n15386,1429\n15386,1531\n15386,1572\n15386,1688\n15387,20\n15388,192\n15388,2607\n15389,1070\n15390,1858\n15391,1860\n15392,907\n15392,932\n15393,563\n15394,65\n15394,687\n15394,1556\n15395,2312\n15396,143\n15397,104\n15397,120\n15397,389\n15397,590\n15397,760\n15397,805\n15397,1011\n15397,1149\n15397,1204\n15397,1402\n15397,1631\n15397,1818\n15397,1973\n15397,2417\n15398,1127\n15399,302\n15400,2073\n15401,500\n15402,346\n15403,1400\n15405,15406\n15407,160\n15407,186\n15407,264\n15407,338\n15407,515\n15407,801\n15407,808\n15407,991\n15407,1052\n15407,1118\n15407,1127\n15407,1147\n15407,1224\n15407,1381\n15407,1893\n15407,2260\n15407,2312\n15407,49057\n15407,81070\n15408,336\n15408,1803\n15408,21442\n15409,1298\n15411,932\n15412,264\n15412,1224\n15412,1659\n15412,1893\n15413,104\n15413,491\n15413,943\n15413,1085\n15413,1579\n15413,1659\n15413,1745\n15413,2089\n15413,2205\n15413,2940\n15413,21944\n15413,33424\n15413,35486\n15414,211\n15415,15416\n15415,16255\n15417,505\n15417,874\n15417,918\n15417,1240\n15417,1603\n15417,2253\n15418,7\n15418,202\n15418,203\n15419,1276\n15420,827\n15421,1133\n15422,360\n15423,1392\n15423,1531\n15423,1796\n15424,104\n15424,134\n15424,240\n15424,289\n15424,372\n15424,1012\n15424,2209\n15424,8276\n15424,9025\n15424,94134\n15424,127158\n15425,503\n15426,3474\n15427,1313\n15428,2979\n15429,1983\n15430,2979\n15431,510\n15431,697\n15432,1983\n15433,1276\n15434,305\n15435,2209\n15436,3246\n15436,3247\n15438,289\n15438,290\n15438,298\n15438,417\n15438,2296\n15439,1\n15439,147\n15439,149\n15439,158\n15439,184\n15439,875\n15439,2244\n15439,21442\n15439,21826\n15439,220502\n15440,178\n15441,2312\n15442,492\n15442,2489\n15442,3082\n15442,14966\n15442,15130\n15442,15344\n15442,20916\n15442,28836\n15442,41799\n15443,298\n15444,485\n15445,945\n15447,107\n15447,1388\n15448,130\n15448,1147\n15448,1381\n15449,37\n15449,1411\n15450,195\n15451,2646\n15451,2944\n15453,907\n15453,932\n15454,10\n15454,186\n15454,217\n15454,818\n15454,1844\n15455,1858\n15456,843\n15457,1860\n15458,852\n15458,1151\n15459,2105\n15460,417\n15461,146\n15461,158\n15461,192\n15461,285\n15461,336\n15461,406\n15461,620\n15461,779\n15461,1515\n15461,1531\n15462,1388\n15463,852\n15463,3630\n15464,15465\n15466,493\n15467,79\n15467,707\n15468,417\n15469,726\n15470,104\n15470,134\n15470,135\n15470,136\n15470,137\n15470,138\n15470,557\n15470,1368\n15470,1939\n15470,2105\n15471,781\n15473,707\n15474,186\n15474,775\n15474,3630\n15474,5130\n15475,364\n15476,10\n15478,217\n15478,920\n15478,1033\n15478,1181\n15479,586\n15480,422\n15481,422\n15482,422\n15483,422\n15484,8270\n15485,422\n15486,1673\n15487,163\n15488,4411\n15488,141912\n15489,433\n15490,1983\n15491,422\n15493,872\n15493,1453\n15493,1722\n15493,3538\n15493,127158\n15494,19\n15495,7\n15498,1147\n15499,1\n15500,596\n15501,596\n15501,784\n15501,2701\n15502,278\n15502,431\n15503,1001\n15504,298\n15505,485\n15506,596\n15506,1052\n15506,1368\n15506,2416\n15506,2417\n15507,1151\n15507,1363\n15508,140\n15508,264\n15508,509\n15509,151\n15510,690\n15511,1300\n15511,5662\n15512,2083\n15513,107\n15513,1149\n15514,302\n15515,254\n15515,596\n15516,111\n15516,2931\n15517,187\n15517,330\n15517,15518\n15517,46585\n15517,65330\n15517,85341\n15517,101134\n15517,129318\n15517,218868\n15517,245308\n15517,260456\n15517,261295\n15521,4411\n15522,781\n15523,685\n15523,911\n15523,75912\n15524,907\n15524,932\n15525,510\n15526,406\n15528,485\n15528,693\n15529,417\n15530,143\n15531,996\n15533,500\n15534,1962\n15535,1052\n15536,1882\n15537,2775\n15538,54\n15539,2210\n15539,4237\n15540,22\n15540,302\n15540,579\n15540,861\n15540,893\n15540,1659\n15540,4453\n15541,417\n15542,1858\n15543,1860\n15544,151\n15545,1313\n15545,15545\n15546,26\n15546,47\n15546,59\n15546,114\n15546,884\n15546,885\n15546,886\n15546,887\n15546,1235\n15546,1335\n15546,1432\n15546,1775\n15546,2469\n15546,2674\n15546,21944\n15547,10\n15547,30\n15547,175\n15547,205\n15547,313\n15547,328\n15547,693\n15547,1773\n15547,33437\n15547,48955\n15547,65492\n15547,66058\n15547,66061\n15547,66678\n15547,66683\n15547,66832\n15547,67128\n15547,67429\n15548,455\n15548,1019\n15549,931\n15549,14458\n15550,1087\n15551,673\n15552,175\n15552,693\n15553,30\n15553,97\n15553,446\n15553,1033\n15553,1179\n15554,15555\n15556,240\n15556,332\n15556,413\n15556,661\n15556,818\n15556,819\n15556,1347\n15556,1623\n15556,7891\n15556,15556\n15556,15557\n15556,15585\n15556,15624\n15556,20505\n15556,22312\n15556,24614\n15556,24669\n15556,24811\n15556,25005\n15556,25585\n15556,29037\n15556,30523\n15556,32611\n15556,32682\n15556,33486\n15556,34159\n15556,35689\n15556,36104\n15556,38248\n15556,41564\n15556,42011\n15556,43548\n15556,44163\n15556,48184\n15556,49202\n15556,54445\n15556,58214\n15556,58945\n15556,59831\n15556,60565\n15556,63411\n15556,68035\n15556,68060\n15556,74573\n15556,76143\n15556,78812\n15556,86659\n15556,90261\n15556,90271\n15556,90308\n15556,102227\n15556,103216\n15556,104512\n15556,106982\n15556,114042\n15556,127158\n15556,148313\n15556,148818\n15556,165339\n15556,168349\n15556,168462\n15556,168892\n15556,170740\n15556,176465\n15556,180392\n15556,185927\n15556,190428\n15556,190444\n15556,190449\n15556,191952\n15556,193636\n15556,194213\n15556,194479\n15556,194522\n15556,194535\n15556,194645\n15556,195545\n15556,202635\n15556,212451\n15556,214043\n15556,214138\n15556,215386\n15556,218003\n15556,221831\n15556,224653\n15556,226514\n15556,228159\n15556,233709\n15556,236269\n15556,236271\n15556,237118\n15556,237120\n15556,237121\n15556,237861\n15556,238762\n15556,239045\n15556,240063\n15556,241336\n15556,244633\n15556,245576\n15556,245579\n15556,245580\n15556,245581\n15556,245582\n15556,245588\n15556,245595\n15556,245601\n15556,245615\n15556,247058\n15556,248835\n15556,255036\n15556,255067\n15556,260900\n15558,192\n15559,137\n15560,192\n15560,211\n15560,336\n15560,366\n15560,640\n15560,949\n15560,1177\n15560,1623\n15560,2775\n15560,4571\n15560,182162\n15561,781\n15562,120\n15562,261\n15562,389\n15562,631\n15562,1072\n15562,1274\n15562,1353\n15562,1419\n15562,19443\n15563,315\n15563,447\n15563,538\n15563,1294\n15563,1877\n15564,15565\n15566,509\n15566,510\n15567,671\n15571,328\n15571,1179\n15572,15573\n15573,15573\n15575,1240\n15575,1653\n15575,6638\n15576,72\n15577,596\n15578,151\n15579,254\n15579,442\n15579,503\n15579,704\n15579,1149\n15579,1257\n15581,34\n15581,35\n15581,347\n15582,79\n15582,314\n15582,336\n15582,446\n15582,1370\n15582,1566\n15582,1707\n15582,2253\n15582,3367\n15582,4066\n15583,118\n15583,4597\n15584,269\n15584,1634\n15586,805\n15587,779\n15587,1353\n15587,1623\n15587,2373\n15587,2775\n15587,118336\n15588,167\n15588,301\n15588,444\n15588,968\n15588,1293\n15588,1300\n15588,3630\n15588,5662\n15589,130\n15589,1007\n15590,83\n15591,1860\n15592,3612\n15593,595\n15594,2274\n15595,392\n15596,4760\n15597,6059\n15598,5658\n15599,4252\n15600,623\n15601,697\n15602,6955\n15603,1782\n15604,30\n15604,120\n15604,328\n15604,1179\n15604,1359\n15604,1688\n15605,1871\n15606,15607\n15608,160\n15608,338\n15608,360\n15608,440\n15608,515\n15608,801\n15608,809\n15608,835\n15608,872\n15608,918\n15608,931\n15608,1001\n15608,1052\n15608,1118\n15608,1127\n15608,1151\n15608,1267\n15608,1566\n15608,1579\n15608,1659\n15608,1893\n15608,2051\n15608,4039\n15608,8149\n15608,15609\n15608,21589\n15608,49057\n15608,68069\n15608,81070\n15609,287\n15609,392\n15609,433\n15609,623\n15609,658\n15609,809\n15609,872\n15609,1151\n15609,1210\n15609,1363\n15609,1623\n15609,4251\n15609,18180\n15609,18387\n15609,84466\n15609,90312\n15609,95447\n15609,110596\n15609,131336\n15609,177654\n15609,212562\n15610,10\n15612,535\n15612,595\n15612,703\n15612,1572\n15612,1722\n15612,3258\n15613,206\n15614,217\n15615,5591\n15616,893\n15616,1556\n15616,3769\n15617,13919\n15618,37\n15618,71\n15618,563\n15618,611\n15618,920\n15618,1235\n15618,1335\n15618,1449\n15620,873\n15624,10\n15624,175\n15624,252\n15624,275\n15624,277\n15624,663\n15624,668\n15625,13919\n15626,473\n15626,8149\n15627,30\n15627,248\n15628,143\n15630,1284\n15631,1452\n15632,1085\n15634,143\n15635,163\n15635,433\n15635,690\n15635,1782\n15636,192\n15636,211\n15636,309\n15636,310\n15636,516\n15636,1181\n15637,462\n15638,1506\n15639,349\n15639,392\n15639,4252\n15640,1\n15642,622\n15642,868\n15642,1559\n15643,79\n15644,20\n15645,399\n15646,30\n15646,200\n15647,19\n15648,217\n15648,240\n15648,255\n15648,515\n15648,818\n15648,819\n15648,1370\n15648,2235\n15648,5073\n15648,6895\n15648,7731\n15648,7891\n15648,8662\n15648,9689\n15648,14064\n15648,15648\n15648,15649\n15648,15656\n15648,16438\n15648,18804\n15648,24916\n15648,25043\n15648,25047\n15648,28268\n15648,28501\n15648,28545\n15648,29866\n15648,31207\n15648,34777\n15648,36258\n15648,37147\n15648,41970\n15648,44145\n15648,52164\n15648,59100\n15648,59851\n15648,68418\n15648,83371\n15648,83488\n15648,84182\n15648,87340\n15648,93134\n15648,118490\n15648,119416\n15648,119634\n15648,120907\n15648,121951\n15648,122137\n15648,122207\n15648,122324\n15648,122422\n15648,122425\n15648,123355\n15648,126053\n15648,127428\n15648,132068\n15648,146885\n15648,148391\n15648,151059\n15648,154820\n15648,154891\n15648,160451\n15648,216538\n15648,228363\n15648,250403\n15648,252224\n15650,143\n15651,356\n15651,390\n15652,1556\n15653,120\n15653,261\n15653,1353\n15653,1466\n15653,2807\n15653,2812\n15654,22\n15654,104\n15654,134\n15654,200\n15654,227\n15654,248\n15654,264\n15654,289\n15654,290\n15654,298\n15654,392\n15654,420\n15654,557\n15654,631\n15654,636\n15654,714\n15654,805\n15654,809\n15654,1016\n15654,1070\n15654,1119\n15654,1149\n15654,1151\n15654,1282\n15654,1462\n15654,1631\n15654,1745\n15654,1836\n15654,1955\n15654,1962\n15654,2205\n15654,2206\n15654,2209\n15654,8537\n15654,22293\n15654,33424\n15654,94134\n15655,312\n15655,509\n15655,510\n15658,104\n15658,107\n15658,240\n15658,248\n15658,264\n15658,441\n15658,3507\n15658,3538\n15658,4771\n15659,63\n15660,349\n15661,8788\n15662,4611\n15663,596\n15663,668\n15663,1119\n15663,1616\n15664,760\n15665,1300\n15666,907\n15667,1085\n15668,140\n15668,264\n15668,577\n15668,1105\n15668,1289\n15669,298\n15670,485\n15671,83\n15672,1\n15673,104\n15673,120\n15673,338\n15673,710\n15673,1274\n15673,1353\n15673,1465\n15674,301\n15674,623\n15674,968\n15674,1167\n15674,1298\n15674,1805\n15677,137\n15678,1849\n15678,32784\n15679,15680\n15681,233\n15681,261\n15681,697\n15681,3260\n15683,83\n15683,175\n15683,285\n15683,450\n15683,455\n15683,949\n15683,1756\n15683,2553\n15683,2784\n15683,28130\n15685,2944\n15686,440\n15687,483\n15687,599\n15687,1118\n15687,4453\n15688,581\n15689,2995\n15690,87\n15690,392\n15690,415\n15690,852\n15690,3003\n15691,151\n15691,309\n15691,310\n15691,313\n15691,344\n15691,1319\n15691,1566\n15691,1688\n15691,3630\n15691,5961\n15692,97\n15692,485\n15693,1353\n15694,54\n15694,313\n15694,385\n15694,2421\n15694,2424\n15694,37088\n15695,720\n15696,143\n15697,356\n15697,611\n15698,222\n15699,1688\n15701,1711\n15701,1836\n15702,818\n15703,2416\n15703,2417\n15704,510\n15704,875\n15705,5987\n15706,171\n15707,2048\n15708,222\n15709,46\n15709,1509\n15711,1\n15711,4\n15711,5\n15711,54\n15711,65\n15711,694\n15711,784\n15711,1082\n15711,2926\n15711,4411\n15711,6424\n15712,1\n15713,1132\n15713,1381\n15713,1452\n15714,72\n15715,1143\n15716,195\n15717,247\n15718,563\n15719,397\n15720,58\n15721,134\n15721,636\n15721,2209\n15722,2506\n15723,861\n15724,15725\n15726,15725\n15728,1001\n15729,15725\n15730,26\n15730,59\n15730,994\n15730,1235\n15730,1335\n15731,1052\n15731,1659\n15732,120\n15733,252\n15733,318\n15733,1220\n15733,1222\n15733,41170\n15734,143\n15735,392\n15735,623\n15736,920\n15737,147\n15737,151\n15737,305\n15737,1033\n15737,1623\n15738,994\n15739,417\n15740,5718\n15741,120\n15742,26\n15742,59\n15742,94\n15742,117\n15742,885\n15742,887\n15742,967\n15742,994\n15742,1432\n15742,1775\n15742,2674\n15742,2712\n15742,9542\n15742,16614\n15742,18815\n15742,21944\n15742,54870\n15742,171294\n15742,205627\n15743,1579\n15743,2051\n15744,920\n15744,1368\n15745,86\n15745,87\n15745,178\n15745,219\n15745,595\n15745,2310\n15745,95836\n15746,1016\n15747,596\n15747,784\n15747,2701\n15750,887\n15751,151\n15752,1151\n15753,920\n15754,1298\n15755,992\n15756,2944\n15757,1179\n15758,86\n15758,167\n15758,589\n15758,605\n15758,615\n15758,907\n15758,973\n15758,1001\n15758,1124\n15758,1167\n15758,1782\n15758,1785\n15758,1955\n15758,3193\n15758,3207\n15759,1119\n15759,15760\n15759,45906\n15759,82501\n15759,86983\n15759,103780\n15761,1052\n15762,1078\n15762,6298\n15763,240\n15763,818\n15764,852\n15764,1368\n15765,736\n15766,302\n15766,579\n15766,893\n15766,2116\n15767,120\n15767,261\n15768,328\n15768,1016\n15768,1212\n15768,1282\n15768,2210\n15768,4237\n15769,1181\n15770,50\n15770,79\n15770,192\n15770,663\n15770,664\n15772,71\n15773,15774\n15775,406\n15775,420\n15776,795\n15777,298\n15778,485\n15779,136\n15779,557\n15780,65\n15781,86\n15782,104\n15782,136\n15782,138\n15782,953\n15783,259\n15784,1\n15785,1\n15786,1146\n15787,3744\n15788,71\n15789,595\n15789,1151\n15789,1363\n15789,2697\n15790,1179\n15791,158\n15792,106\n15792,1808\n15792,1818\n15792,1887\n15792,1888\n15792,3994\n15792,5727\n15792,7087\n15792,15793\n15792,17139\n15792,26061\n15792,27500\n15792,29165\n15792,45891\n15792,52795\n15792,60308\n15792,83872\n15792,106439\n15792,113166\n15792,118911\n15792,125000\n15793,1888\n15794,111\n15795,94\n15795,147\n15795,158\n15795,195\n15795,206\n15795,336\n15795,602\n15795,695\n15795,1235\n15795,1560\n15795,1860\n15795,2244\n15795,2714\n15795,2787\n15795,2867\n15795,2868\n15795,14382\n15795,15795\n15795,20111\n15795,21944\n15795,22880\n15795,30331\n15795,34716\n15795,35439\n15795,37702\n15795,42064\n15795,46364\n15795,49027\n15795,55859\n15795,80266\n15795,87866\n15795,89035\n15795,94130\n15795,98192\n15795,102006\n15795,143314\n15795,152928\n15795,186040\n15795,186074\n15795,195050\n15795,200554\n15795,204787\n15795,223365\n15795,243934\n15795,259501\n15796,500\n15797,264\n15797,577\n15798,611\n15799,120\n15800,1\n15801,1368\n15803,1651\n15804,1\n15804,156885\n15805,184\n15806,392\n15806,809\n15806,1151\n15807,772\n15807,1018\n15807,3807\n15807,4941\n15807,15807\n15807,28203\n15807,31278\n15807,36333\n15807,75126\n15807,76058\n15807,85814\n15807,142029\n15807,175958\n15807,178441\n15807,182795\n15807,186577\n15807,187862\n15807,188059\n15807,190276\n15807,192028\n15807,217055\n15807,217057\n15807,217058\n15807,217062\n15807,221409\n15807,225793\n15807,232026\n15807,236220\n15808,15809\n15810,15809\n15811,143\n15812,439\n15812,15573\n15813,22\n15814,525\n15814,843\n15814,1849\n15815,1634\n15816,107\n15817,2775\n15818,447\n15819,278\n15820,72\n15821,2915\n15822,312\n15823,1313\n15823,1718\n15823,2646\n15823,5326\n15825,72\n15826,376\n15827,714\n15827,2205\n15827,2206\n15827,2315\n15827,33424\n15827,245910\n15828,72\n15829,79\n15829,1147\n15829,1623\n15830,1127\n15831,15832\n15833,392\n15834,211\n15835,1181\n15836,255\n15837,1740\n15838,599\n15839,931\n15840,240\n15840,301\n15841,247\n15842,452\n15842,457\n15842,497\n15842,535\n15842,676\n15842,843\n15842,918\n15842,1655\n15843,111\n15844,247\n15846,717\n15847,1474\n15848,206\n15850,143\n15851,1381\n15852,536\n15853,134\n15854,1\n15854,184\n15855,1590\n15856,209\n15856,248\n15856,652\n15856,1149\n15856,1631\n15857,1462\n15857,1635\n15857,8537\n15857,9021\n15858,143\n15859,1381\n15860,15861\n15862,1082\n15863,588\n15863,590\n15863,1419\n15864,5326\n15865,143\n15866,66\n15867,72\n15868,2620\n15869,483\n15870,15871\n15872,146\n15874,273\n15874,274\n15875,1590\n15876,1117\n15877,298\n15878,485\n15879,15880\n15879,45975\n15879,50662\n15881,399\n15882,592\n15883,83\n15884,536\n15885,652\n15886,34\n15886,35\n15887,13661\n15888,1556\n15889,120\n15889,1466\n15890,392\n15891,143\n15892,536\n15893,143\n15895,489\n15896,143\n15897,346\n15898,72\n15899,280\n15899,17245\n15900,298\n15901,485\n15902,15903\n15904,15905\n15906,72\n15907,346\n15908,264\n15908,1381\n15908,1551\n15909,4490\n15910,2574\n15911,392\n15912,483\n15913,44\n15913,217\n15913,538\n15913,663\n15913,664\n15913,779\n15913,788\n15913,809\n15913,920\n15913,1033\n15913,1181\n15913,1381\n15913,1414\n15913,1639\n15913,1805\n15913,2073\n15913,2889\n15913,3193\n15913,5440\n15913,15609\n15913,19010\n15913,141912\n15914,1368\n15915,83\n15915,285\n15915,455\n15915,1756\n15915,2553\n15915,2779\n15915,2784\n15915,28130\n15916,273\n15916,274\n15917,8719\n15918,138\n15919,865\n15920,557\n15921,137\n15922,118\n15922,4597\n15924,202\n15924,203\n15925,8719\n15926,138\n15927,865\n15928,557\n15929,137\n15930,118\n15930,4597\n15931,34\n15931,35\n15931,120\n15931,240\n15931,261\n15931,536\n15931,599\n15931,694\n15931,1353\n15931,1419\n15931,1466\n15931,2512\n15931,2989\n15931,2991\n15931,3252\n15932,8719\n15933,138\n15934,865\n15935,557\n15936,137\n15937,1608\n15938,118\n15938,4597\n15939,1052\n15939,1289\n15939,2626\n15940,8719\n15941,138\n15942,865\n15943,557\n15944,137\n15945,338\n15945,1722\n15945,1893\n15946,118\n15946,4597\n15947,207\n15948,557\n15949,557\n15950,149\n15951,893\n15952,592\n15952,760\n15952,805\n15952,1119\n15952,1285\n15952,1635\n15952,2620\n15953,72\n15954,97\n15955,15956\n15958,211\n15960,15961\n15962,372\n15962,714\n15963,255\n15964,2411\n15965,557\n15966,143\n15967,1085\n15967,5961\n15968,704\n15969,151\n15970,1858\n15971,1860\n15972,163\n15973,72\n15974,305\n15975,640\n15976,143\n15977,143\n15978,143\n15979,843\n15980,79\n15980,192\n15980,202\n15980,203\n15980,406\n15980,779\n15980,859\n15980,1181\n15980,1388\n15980,1531\n15980,1659\n15981,143\n15982,44\n15983,72\n15984,557\n15985,647\n15986,2073\n15987,818\n15988,611\n15988,15179\n15989,1608\n15990,252\n15990,318\n15990,516\n15990,1220\n15990,1222\n15991,68\n15991,2837\n15992,143\n15993,143\n15994,346\n15995,298\n15996,485\n15997,143\n15998,15999\n16000,143\n16001,71\n16001,298\n16001,304\n16001,417\n16001,525\n16002,143\n16003,147\n16003,158\n16005,143\n16006,364\n16007,1085\n16008,289\n16008,290\n16009,30\n16010,79\n16010,192\n16010,240\n16010,435\n16010,467\n16010,516\n16010,663\n16010,868\n16010,1210\n16010,1220\n16010,1222\n16010,1243\n16010,1385\n16010,1844\n16010,14674\n16010,21944\n16010,30428\n16010,44370\n16010,156379\n16011,640\n16012,422\n16013,1871\n16014,251\n16014,252\n16014,446\n16014,465\n16014,516\n16014,16014\n16014,189788\n16014,189794\n16014,223738\n16014,234694\n16014,236761\n16015,3135\n16016,41\n16017,217\n16018,16019\n16019,16019\n16020,143\n16021,3623\n16022,32\n16023,1454\n16024,217\n16025,143\n16026,779\n16027,1119\n16029,1939\n16030,104\n16031,30\n16031,233\n16031,1368\n16032,2421\n16033,422\n16034,56\n16035,149\n16036,1707\n16037,1287\n16038,1715\n16039,83\n16039,278\n16040,16041\n16042,2351\n16043,8788\n16044,301\n16044,717\n16044,1231\n16044,1740\n16044,1782\n16045,16045\n16046,16047\n16048,16049\n16050,1227\n16050,1229\n16051,536\n16052,160\n16053,1479\n16053,2979\n16054,16055\n16056,2416\n16056,2417\n16057,163\n16058,272\n16058,1127\n16059,1058\n16060,16061\n16063,2205\n16063,2206\n16064,16065\n16066,16067\n16068,9560\n16069,636\n16070,1227\n16070,1229\n16070,21944\n16071,16072\n16071,46579\n16071,47465\n16071,53905\n16071,54142\n16071,57693\n16073,146\n16074,16075\n16076,202\n16076,203\n16076,676\n16077,417\n16077,85531\n16077,161317\n16077,161318\n16077,161319\n16077,161321\n16077,161327\n16077,161329\n16077,161332\n16077,161335\n16077,161337\n16077,161342\n16077,161344\n16077,161345\n16077,161346\n16077,161348\n16077,161514\n16077,161584\n16078,34\n16078,35\n16079,16080\n16081,16082\n16084,7124\n16085,557\n16086,1522\n16087,1363\n16088,2681\n16089,1096\n16090,16091\n16092,16091\n16093,7416\n16094,65\n16094,467\n16095,4831\n16096,366\n16097,366\n16098,366\n16099,4\n16099,5\n16099,26\n16099,59\n16099,430\n16099,1235\n16099,1335\n16100,312\n16101,392\n16101,1151\n16101,1711\n16101,1836\n16103,26\n16103,59\n16103,135\n16103,138\n16104,298\n16105,485\n16106,219\n16107,920\n16108,433\n16109,703\n16110,32\n16110,349\n16110,392\n16110,697\n16110,808\n16111,143\n16112,1085\n16113,298\n16114,485\n16115,298\n16116,485\n16117,6789\n16118,433\n16118,1454\n16119,2146\n16120,577\n16120,595\n16120,736\n16120,1007\n16120,1105\n16120,1289\n16120,1474\n16120,7698\n16122,775\n16124,16125\n16126,273\n16126,274\n16127,86\n16130,163\n16131,6323\n16132,392\n16133,233\n16134,644\n16135,406\n16136,6750\n16137,431\n16137,760\n16137,1119\n16137,1285\n16137,1631\n16138,292\n16138,462\n16139,872\n16140,920\n16141,58\n16141,534\n16142,79\n16143,248\n16143,450\n16143,1332\n16144,137\n16147,4276\n16148,1\n16148,4805\n16149,306\n16149,307\n16151,518\n16151,873\n16151,874\n16151,1010\n16151,1210\n16151,1231\n16151,1298\n16151,1300\n16151,1326\n16151,1411\n16151,2006\n16151,2784\n16152,6726\n16153,116\n16153,138\n16153,220\n16153,886\n16153,1235\n16153,1335\n16153,2157\n16153,2673\n16153,2720\n16153,2893\n16153,4054\n16153,4114\n16153,4185\n16153,6621\n16153,7544\n16153,8113\n16153,8155\n16153,14353\n16153,21944\n16153,25501\n16153,25636\n16153,26923\n16153,30471\n16153,30574\n16153,30692\n16153,34060\n16153,35510\n16153,41974\n16153,42813\n16153,43667\n16153,43835\n16153,68440\n16153,72626\n16153,72632\n16153,79346\n16153,79373\n16153,81220\n16153,92562\n16153,99296\n16153,103411\n16153,107765\n16153,109269\n16153,111707\n16153,114453\n16153,117103\n16153,127920\n16153,132380\n16153,132478\n16153,136397\n16153,137875\n16153,139033\n16153,139120\n16153,143316\n16153,143631\n16153,143733\n16153,144342\n16153,144344\n16153,144824\n16153,148076\n16153,165128\n16153,173224\n16153,188564\n16153,195071\n16153,201690\n16153,203585\n16153,203816\n16153,203829\n16153,222441\n16153,223983\n16153,224094\n16153,225103\n16153,229333\n16153,232461\n16153,245296\n16153,245494\n16153,254129\n16153,256193\n16154,1769\n16155,171\n16156,417\n16157,483\n16158,1381\n16159,151\n16159,9457\n16160,151\n16161,32\n16161,779\n16161,2292\n16162,298\n16163,485\n16164,893\n16164,1119\n16164,4177\n16165,784\n16165,1052\n16166,4\n16166,5\n16166,79\n16166,1368\n16167,417\n16168,151\n16169,215\n16169,388\n16169,455\n16170,1127\n16170,1172\n16170,1955\n16171,1400\n16172,1454\n16173,41\n16173,760\n16174,417\n16174,1564\n16176,3\n16177,1479\n16178,143\n16179,86\n16180,86\n16180,273\n16180,344\n16180,2671\n16180,5212\n16180,6682\n16181,34\n16181,35\n16181,202\n16181,203\n16181,323\n16181,358\n16181,392\n16181,493\n16181,536\n16181,623\n16181,949\n16181,1001\n16181,1072\n16181,1274\n16181,1467\n16181,1572\n16181,1590\n16181,1608\n16181,1644\n16181,1722\n16181,2266\n16181,2274\n16181,2671\n16181,2699\n16181,2784\n16181,2931\n16181,2979\n16181,3182\n16181,3252\n16181,3538\n16181,4549\n16181,4637\n16181,7092\n16181,13546\n16182,167\n16182,301\n16182,2979\n16183,158\n16184,685\n16185,1\n16185,340\n16185,841\n16185,994\n16185,1453\n16186,283\n16186,389\n16186,455\n16186,2782\n16187,980\n16188,16189\n16190,818\n16190,872\n16190,1019\n16190,1454\n16191,1019\n16191,1181\n16191,1210\n16192,167\n16192,388\n16192,589\n16192,626\n16192,631\n16192,784\n16192,795\n16192,1001\n16192,1085\n16192,1284\n16192,1293\n16192,1522\n16192,1837\n16192,1844\n16192,2045\n16192,3193\n16192,3422\n16192,75912\n16193,206\n16194,392\n16195,71\n16195,372\n16195,388\n16195,704\n16195,13538\n16196,3297\n16196,16196\n16197,178\n16198,611\n16199,349\n16200,579\n16202,634\n16203,483\n16204,929\n16205,304\n16206,16207\n16209,980\n16210,290\n16210,298\n16210,304\n16210,714\n16210,2315\n16210,3069\n16210,33424\n16210,94134\n16211,1238\n16212,58\n16213,46\n16214,3451\n16214,3452\n16215,417\n16215,422\n16215,602\n16215,1564\n16216,163\n16218,1419\n16218,1474\n16219,907\n16219,932\n16220,1007\n16220,1132\n16221,2334\n16224,163\n16226,192\n16229,392\n16230,389\n16230,657\n16231,272\n16231,1118\n16232,163\n16233,3138\n16234,473\n16236,690\n16236,818\n16237,58\n16238,46\n16239,868\n16240,387\n16241,10\n16241,163\n16244,949\n16245,209\n16246,302\n16246,579\n16246,4823\n16247,567\n16247,605\n16247,968\n16249,626\n16250,459\n16251,143\n16252,660\n16253,459\n16254,3193\n16256,660\n16257,163\n16258,16259\n16260,1479\n16261,1858\n16262,1860\n16263,104\n16263,136\n16263,137\n16263,138\n16263,557\n16263,1368\n16264,660\n16265,312\n16266,907\n16266,932\n16267,920\n16268,79\n16268,200\n16268,289\n16268,290\n16268,536\n16268,872\n16268,1177\n16268,1749\n16268,2605\n16270,163\n16271,1807\n16271,191355\n16272,50\n16272,147\n16272,158\n16272,406\n16272,622\n16273,781\n16274,163\n16275,227\n16276,163\n16277,163\n16278,332\n16278,2995\n16279,30\n16280,79\n16280,136\n16280,137\n16281,163\n16282,86\n16283,178\n16284,346\n16286,209\n16286,302\n16286,579\n16286,861\n16286,4453\n16287,83\n16287,151\n16287,1227\n16287,1229\n16287,9007\n16287,86416\n16288,392\n16288,438\n16288,1151\n16288,1240\n16289,516\n16289,1818\n16290,163\n16291,143\n16292,104\n16292,1282\n16293,872\n16293,1579\n16294,1282\n16295,406\n16296,843\n16297,781\n16299,158\n16300,312\n16302,151\n16302,211\n16302,972\n16302,2173\n16302,2979\n16303,271\n16304,2051\n16304,49057\n16305,163\n16306,104\n16306,107\n16306,111\n16306,134\n16306,200\n16306,227\n16306,248\n16306,289\n16306,298\n16306,503\n16306,631\n16306,636\n16306,714\n16306,805\n16306,1016\n16306,1119\n16306,1149\n16306,1282\n16306,1631\n16306,1955\n16306,2205\n16306,2209\n16306,33424\n16306,94134\n16306,245910\n16309,5\n16309,47\n16309,135\n16309,248\n16309,1119\n16309,1332\n16309,1415\n16309,2089\n16309,2469\n16309,2940\n16309,4091\n16309,6569\n16309,6642\n16309,9529\n16309,15277\n16309,17139\n16309,19602\n16309,20397\n16309,22188\n16309,38822\n16309,49301\n16309,67127\n16309,72586\n16309,72743\n16309,73186\n16309,73360\n16309,74071\n16309,74361\n16309,74368\n16309,78708\n16309,79987\n16309,80711\n16309,80717\n16309,83249\n16309,83256\n16309,93961\n16309,94312\n16309,94830\n16309,98892\n16309,99108\n16309,99548\n16309,99881\n16309,110906\n16309,114055\n16309,132512\n16309,136072\n16309,140828\n16309,154646\n16309,154671\n16309,171318\n16309,182606\n16309,220913\n16309,254842\n16310,1309\n16311,302\n16312,16313\n16314,907\n16314,932\n16316,163\n16317,2775\n16318,447\n16319,163\n16320,1298\n16322,50\n16322,79\n16322,192\n16322,195\n16323,972\n16324,366\n16325,143\n16326,143\n16327,536\n16328,634\n16329,163\n16330,47\n16330,58\n16330,251\n16330,255\n16330,287\n16330,493\n16330,563\n16330,577\n16330,626\n16330,663\n16330,664\n16330,671\n16330,698\n16330,788\n16330,795\n16330,801\n16330,1012\n16330,1068\n16330,1070\n16330,1133\n16330,1309\n16330,1368\n16330,1429\n16330,1449\n16330,1474\n16330,2367\n16330,2436\n16330,2469\n16330,2596\n16330,5405\n16330,6837\n16330,16331\n16330,21944\n16332,256\n16333,163\n16334,163\n16335,1203\n16335,1955\n16336,868\n16337,433\n16337,1634\n16338,491\n16338,758\n16339,163\n16340,1871\n16341,779\n16342,503\n16343,1127\n16343,1619\n16343,13136\n16344,163\n16345,309\n16345,310\n16346,16347\n16348,163\n16349,758\n16349,3695\n16350,163\n16352,949\n16353,143\n16354,86\n16355,1085\n16356,65\n16357,222\n16357,278\n16357,379\n16357,392\n16357,467\n16357,536\n16357,571\n16357,818\n16357,868\n16357,891\n16357,1210\n16357,1240\n16357,1417\n16357,1454\n16357,1805\n16357,2837\n16357,5326\n16357,21982\n16357,162599\n16358,868\n16359,171\n16359,957\n16359,1815\n16360,83\n16360,1858\n16361,134\n16361,344\n16361,636\n16362,392\n16362,697\n16362,818\n16362,872\n16362,15609\n16364,861\n16365,298\n16366,485\n16367,163\n16368,202\n16368,203\n16369,355\n16370,41\n16370,1119\n16370,4619\n16370,16370\n16370,86778\n16370,87209\n16370,87223\n16370,87238\n16370,87504\n16370,87507\n16370,88706\n16370,89039\n16370,89252\n16370,141590\n16370,141601\n16370,141844\n16370,142040\n16370,142044\n16370,142050\n16370,142277\n16370,142281\n16370,142515\n16370,143427\n16371,781\n16372,151\n16373,907\n16373,932\n16374,97\n16374,269\n16375,163\n16376,158\n16376,2244\n16377,163\n16379,143\n16380,215\n16382,134\n16382,636\n16383,1983\n16384,163\n16385,273\n16385,274\n16386,1235\n16386,1335\n16387,887\n16388,41\n16388,16389\n16388,30689\n16388,30914\n16388,48884\n16388,53911\n16388,63181\n16388,66877\n16388,69128\n16390,1425\n16391,163\n16392,596\n16392,600\n16392,617\n16392,784\n16392,1146\n16392,1209\n16392,1367\n16392,1368\n16392,1429\n16392,2543\n16392,2547\n16392,2565\n16392,2658\n16392,2701\n16392,2814\n16392,3473\n16392,4520\n16392,4725\n16392,5279\n16392,5391\n16392,5538\n16392,7458\n16392,7731\n16392,13541\n16392,14109\n16392,14473\n16392,15344\n16392,15506\n16392,15577\n16392,15658\n16392,15747\n16392,16417\n16392,16570\n16392,19708\n16392,20858\n16392,22148\n16392,22746\n16392,22835\n16392,29575\n16392,29798\n16392,29841\n16392,30031\n16392,31178\n16392,32324\n16392,32327\n16392,32329\n16392,32504\n16392,33317\n16392,33525\n16392,34015\n16392,34016\n16392,34436\n16392,34917\n16392,34918\n16392,34919\n16392,38144\n16392,38787\n16392,49802\n16392,50890\n16392,54121\n16392,57143\n16392,61900\n16392,61901\n16392,61902\n16392,63702\n16392,63711\n16392,64543\n16394,647\n16395,344\n16396,72\n16397,344\n16398,285\n16399,302\n16400,671\n16401,240\n16401,503\n16401,1785\n16401,1955\n16401,2989\n16401,2991\n16402,273\n16402,274\n16403,14989\n16404,163\n16405,349\n16405,697\n16406,657\n16406,213089\n16407,304\n16407,999\n16408,147\n16409,147\n16409,149\n16409,158\n16409,7998\n16409,22231\n16409,26152\n16410,278\n16410,2775\n16412,222\n16412,657\n16412,660\n16412,2424\n16412,6506\n16413,473\n16413,3967\n16414,240\n16415,887\n16416,163\n16417,596\n16418,2674\n16419,697\n16420,222\n16421,79\n16422,1118\n16423,163\n16424,163\n16425,366\n16425,795\n16426,462\n16426,1238\n16426,3209\n16427,424\n16428,1085\n16428,1522\n16429,163\n16430,81\n16430,240\n16430,372\n16430,557\n16430,1085\n16430,1522\n16430,1635\n16430,1955\n16430,2006\n16430,2812\n16430,3538\n16431,1688\n16432,415\n16433,1634\n16434,50\n16434,79\n16435,620\n16436,163\n16436,818\n16437,163\n16439,760\n16440,104\n16440,140\n16440,143\n16440,273\n16440,801\n16440,1052\n16440,1659\n16440,1745\n16440,1893\n16440,2367\n16440,81070\n16441,16442\n16443,26\n16443,59\n16443,994\n16443,1235\n16443,1335\n16443,21944\n16444,16445\n16444,110137\n16446,16447\n16448,760\n16449,611\n16450,163\n16451,1070\n16452,302\n16453,932\n16454,275\n16454,277\n16455,509\n16455,510\n16455,872\n16455,150022\n16456,2205\n16456,2206\n16457,907\n16457,932\n16458,4\n16458,5\n16458,859\n16458,1243\n16459,581\n16460,301\n16460,861\n16460,893\n16460,2979\n16461,775\n16462,163\n16463,167\n16463,1544\n16463,3207\n16464,16465\n16467,697\n16468,1179\n16469,859\n16470,1871\n16471,1122\n16472,2367\n16473,143\n16474,163\n16475,467\n16475,605\n16475,868\n16475,4831\n16475,156379\n16475,162599\n16476,2073\n16477,143\n16478,1419\n16480,267\n16480,2372\n16481,77\n16481,332\n16481,1466\n16482,147\n16482,149\n16482,158\n16482,406\n16482,663\n16482,664\n16482,779\n16482,818\n16482,1181\n16482,1515\n16482,4193\n16484,1436\n16484,2083\n16487,202\n16487,251\n16487,252\n16487,516\n16487,1220\n16487,1222\n16488,1122\n16488,1559\n16490,207\n16490,424\n16492,136\n16492,252\n16492,272\n16492,333\n16492,435\n16492,516\n16492,1033\n16492,1370\n16492,1877\n16492,1893\n16492,2006\n16493,60576\n16495,10\n16496,192\n16497,71\n16497,251\n16497,493\n16497,957\n16497,1247\n16497,1815\n16497,164572\n16498,1977\n16498,1978\n16500,455\n16500,623\n16500,1454\n16501,1639\n16502,509\n16502,872\n16502,1151\n16503,1011\n16503,1096\n16503,2135\n16503,2704\n16503,28294\n16504,1506\n16504,22125\n16505,120\n16505,1419\n16505,2372\n16506,973\n16507,442\n16507,503\n16507,994\n16507,1257\n16508,163\n16510,1119\n16512,273\n16512,274\n16513,850\n16515,1506\n16515,22125\n16516,137\n16516,163\n16516,349\n16516,664\n16516,1147\n16516,1572\n16516,2750\n16516,3612\n16517,143\n16518,240\n16518,818\n16519,63\n16520,596\n16521,682\n16521,72439\n16522,392\n16522,433\n16522,467\n16522,872\n16522,162599\n16523,518\n16523,1326\n16523,2737\n16523,3193\n16525,7\n16525,97\n16525,217\n16526,2205\n16526,2206\n16527,745\n16529,255\n16530,106\n16530,1370\n16530,1821\n16530,2782\n16530,21736\n16531,1096\n16531,1821\n16532,346\n16534,309\n16534,310\n16535,1639\n16537,83\n16537,160\n16537,849\n16538,79\n16538,202\n16538,203\n16538,1149\n16538,1433\n16539,392\n16540,309\n16540,310\n16541,1240\n16542,516\n16543,4611\n16544,1544\n16545,233\n16546,4611\n16547,1544\n16548,2506\n16549,4611\n16550,1544\n16551,104\n16551,134\n16551,227\n16551,240\n16551,248\n16551,264\n16551,289\n16551,290\n16551,298\n16551,442\n16551,503\n16551,631\n16551,636\n16551,714\n16551,784\n16551,1085\n16551,1119\n16551,1282\n16551,1326\n16551,1392\n16551,1462\n16551,1955\n16551,2205\n16551,2206\n16551,2209\n16551,2443\n16551,8180\n16551,8537\n16551,33424\n16553,215\n16554,206\n16555,929\n16556,247\n16557,571\n16560,163\n16561,11\n16561,178\n16561,663\n16561,664\n16561,707\n16561,712\n16561,713\n16561,809\n16561,1087\n16561,1089\n16561,1191\n16561,1623\n16561,2605\n16561,3258\n16561,3967\n16561,3999\n16562,364\n16562,2775\n16562,3538\n16563,79\n16563,111\n16563,192\n16563,202\n16563,333\n16563,406\n16563,779\n16563,1181\n16564,312\n16564,509\n16564,510\n16564,595\n16564,1453\n16565,535\n16566,314\n16566,1240\n16567,163\n16571,1203\n16571,1955\n16571,2812\n16572,192\n16572,663\n16572,664\n16573,175\n16574,34\n16574,35\n16574,588\n16574,590\n16575,15\n16575,2260\n16576,349\n16576,510\n16576,697\n16576,3260\n16576,5540\n16577,4611\n16578,1544\n16579,733\n16580,3\n16581,626\n16581,707\n16581,1590\n16582,151\n16582,240\n16582,366\n16582,2173\n16582,2607\n16583,65\n16583,1433\n16584,252\n16585,5440\n16586,515\n16587,264\n16587,1433\n16588,399\n16589,192\n16590,9015\n16591,1458\n16592,16593\n16594,2083\n16595,2567\n16596,392\n16596,433\n16596,687\n16596,818\n16596,861\n16596,893\n16596,1556\n16597,264\n16597,1509\n16598,50\n16598,1313\n16599,1235\n16599,1335\n16600,457\n16601,1837\n16602,861\n16603,2367\n16605,1033\n16606,749\n16606,5101\n16606,15119\n16606,55077\n16607,163\n16607,579\n16607,861\n16607,1556\n16608,2373\n16609,83\n16609,178\n16609,259\n16610,202\n16610,203\n16610,1175\n16611,3582\n16613,893\n16614,292\n16614,446\n16614,685\n16614,693\n16614,745\n16614,1688\n16614,1849\n16614,4114\n16614,7530\n16614,9070\n16614,16614\n16614,18490\n16614,18970\n16614,67946\n16614,110160\n16614,143068\n16614,189328\n16614,191481\n16614,191483\n16614,193155\n16616,1556\n16617,104\n16617,636\n16618,1070\n16619,202\n16619,203\n16621,779\n16622,1983\n16623,2319\n16624,1722\n16625,720\n16627,2319\n16628,1983\n16629,344\n16630,301\n16630,968\n16631,1769\n16633,202\n16633,203\n16634,907\n16634,2191\n16635,247\n16636,302\n16636,581\n16636,918\n16636,1556\n16638,420\n16638,868\n16638,1010\n16638,1179\n16638,4771\n16640,104\n16640,636\n16640,8993\n16641,294\n16641,634\n16641,1052\n16642,422\n16643,422\n16644,422\n16645,422\n16646,422\n16647,72\n16648,344\n16649,285\n16650,525\n16651,3260\n16652,83\n16652,202\n16652,467\n16652,868\n16652,1243\n16652,1531\n16652,2995\n16652,191355\n16653,240\n16653,818\n16653,17309\n16654,247\n16655,264\n16655,332\n16655,577\n16655,1289\n16656,163\n16656,690\n16657,1983\n16661,120\n16662,77\n16663,86\n16664,248\n16665,4344\n16666,195\n16667,48\n16667,87\n16667,130\n16667,272\n16667,312\n16667,338\n16667,344\n16667,349\n16667,358\n16667,431\n16667,473\n16667,510\n16667,515\n16667,589\n16667,647\n16667,801\n16667,991\n16667,1052\n16667,1127\n16667,1130\n16667,1224\n16667,1241\n16667,1267\n16667,1293\n16667,1345\n16667,1381\n16667,1436\n16667,1579\n16667,1639\n16667,1659\n16667,1893\n16667,2083\n16667,2367\n16667,2605\n16667,3003\n16667,3260\n16667,3653\n16667,3695\n16667,8149\n16667,13538\n16667,19356\n16667,49057\n16667,131675\n16667,191860\n16668,417\n16668,2572\n16668,44725\n16668,75912\n16669,577\n16670,267\n16671,72\n16672,1740\n16673,302\n16675,301\n16676,222\n16676,1052\n16677,346\n16678,467\n16678,868\n16679,393\n16679,980\n16680,2205\n16680,2206\n16680,33424\n16682,16683\n16683,16682\n16683,16683\n16683,24254\n16683,37131\n16683,226652\n16683,246797\n16684,289\n16684,290\n16684,932\n16684,1082\n16684,1285\n16684,1564\n16684,1818\n16684,1955\n16684,2205\n16684,2296\n16684,2620\n16684,4218\n16684,33424\n16684,94134\n16685,873\n16687,264\n16687,16687\n16688,336\n16689,143\n16690,151\n16691,467\n16691,663\n16691,664\n16691,868\n16691,893\n16691,1803\n16691,162599\n16692,649\n16693,932\n16694,2590\n16695,83\n16696,1130\n16698,77\n16699,622\n16699,1033\n16700,184\n16701,1\n16702,305\n16703,527\n16704,1608\n16705,309\n16705,310\n16706,957\n16706,1815\n16707,16708\n16709,104\n16709,111\n16709,714\n16709,1119\n16709,1745\n16709,2156\n16709,2205\n16709,2286\n16709,4571\n16709,33424\n16709,88820\n16710,1556\n16711,949\n16712,3\n16712,1127\n16712,1177\n16712,2210\n16712,2867\n16712,2868\n16712,6837\n16712,22880\n16713,247\n16713,2867\n16713,2868\n16714,563\n16715,273\n16715,390\n16715,885\n16715,3623\n16715,66754\n16716,907\n16716,3804\n16717,2105\n16717,4220\n16718,3003\n16718,5469\n16719,143\n16720,83\n16721,16722\n16723,247\n16724,538\n16725,264\n16726,8992\n16727,30\n16728,302\n16729,16730\n16731,16732\n16733,4\n16733,5\n16734,346\n16735,302\n16736,143\n16737,54\n16738,1282\n16738,1882\n16739,406\n16740,631\n16741,1821\n16742,1511\n16742,3069\n16743,392\n16744,16745\n16746,83\n16747,136\n16748,390\n16749,298\n16750,485\n16751,376\n16752,406\n16752,620\n16754,1363\n16755,215\n16755,704\n16755,1402\n16755,176782\n16756,16757\n16758,248\n16758,850\n16759,1559\n16760,34\n16760,35\n16760,83\n16760,536\n16761,784\n16762,195\n16762,5874\n16762,6119\n16762,16767\n16763,1462\n16763,8537\n16764,7760\n16765,1370\n16765,1821\n16766,99\n16768,16769\n16768,26655\n16768,32891\n16768,51857\n16768,52736\n16768,53589\n16768,54062\n16768,54224\n16768,81048\n16768,83752\n16768,84323\n16768,88746\n16768,88862\n16768,96287\n16768,97107\n16768,97759\n16768,101012\n16768,105225\n16768,105825\n16768,108447\n16768,108682\n16768,109730\n16768,110879\n16770,143\n16771,292\n16772,54\n16773,1140\n16774,192\n16774,663\n16775,149\n16776,44\n16776,202\n16776,203\n16776,217\n16776,333\n16776,406\n16776,538\n16776,663\n16776,664\n16776,779\n16776,788\n16776,809\n16776,920\n16776,1033\n16776,1181\n16776,1381\n16776,1414\n16776,1433\n16776,1551\n16776,1639\n16776,1805\n16776,2073\n16776,2889\n16776,5440\n16776,15609\n16776,141912\n16777,406\n16778,392\n16779,34\n16779,35\n16779,83\n16779,1718\n16780,143\n16781,240\n16782,289\n16782,290\n16783,1433\n16784,255\n16785,450\n16786,1544\n16787,704\n16788,1243\n16788,4355\n16789,247\n16789,5213\n16790,1429\n16791,358\n16792,2557\n16793,143\n16793,1052\n16794,1590\n16795,389\n16796,163\n16797,16798\n16797,161176\n16799,167\n16800,1522\n16801,225\n16802,2574\n16803,147\n16804,217\n16805,1149\n16806,417\n16807,4222\n16808,16809\n16810,16809\n16811,16812\n16813,202\n16813,217\n16813,333\n16813,406\n16813,663\n16813,664\n16813,779\n16813,788\n16813,809\n16813,920\n16813,1033\n16813,1181\n16813,1381\n16813,1414\n16813,1433\n16813,1639\n16813,1805\n16813,2073\n16813,2889\n16813,3193\n16813,5440\n16813,15609\n16813,141912\n16814,1313\n16815,272\n16816,717\n16817,1837\n16818,227\n16819,1265\n16819,1266\n16820,586\n16821,349\n16822,516\n16823,372\n16824,1740\n16825,417\n16826,8270\n16827,81\n16828,1556\n16829,3260\n16830,16831\n16832,392\n16833,3246\n16833,3247\n16834,2372\n16835,1\n16835,83\n16835,117\n16835,278\n16835,330\n16835,406\n16835,450\n16835,536\n16835,1212\n16835,1240\n16835,2712\n16835,4594\n16836,827\n16837,2979\n16838,2995\n16839,65\n16840,392\n16841,13136\n16842,298\n16843,485\n16844,1893\n16844,2051\n16844,49057\n16845,536\n16846,392\n16847,6789\n16848,3538\n16849,356\n16849,5591\n16850,704\n16851,143\n16851,1052\n16851,15119\n16852,72\n16853,195\n16854,2775\n16855,72\n16856,925\n16857,72\n16858,225\n16858,248\n16858,1332\n16859,10\n16860,79\n16861,515\n16862,704\n16863,640\n16864,1858\n16865,1860\n16866,192\n16867,160\n16868,160\n16869,48\n16869,104\n16869,264\n16869,515\n16869,516\n16869,687\n16869,861\n16869,953\n16869,1007\n16869,1010\n16869,1181\n16869,1374\n16869,1392\n16869,1551\n16869,1782\n16869,1968\n16869,2626\n16869,3041\n16869,3999\n16869,5440\n16870,1515\n16871,252\n16871,1370\n16872,160\n16873,79\n16873,178\n16873,62561\n16874,167\n16874,968\n16874,1241\n16874,1522\n16874,2979\n16875,16687\n16876,304\n16877,72\n16878,344\n16879,285\n16880,1511\n16880,3069\n16882,766\n16882,939\n16883,939\n16883,2352\n16884,422\n16885,939\n16885,3241\n16886,671\n16886,939\n16887,56\n16888,766\n16888,939\n16889,939\n16889,3241\n16890,50\n16891,147\n16891,206\n16891,1458\n16891,2157\n16891,2244\n16891,16891\n16891,29109\n16891,44654\n16891,44877\n16891,79883\n16891,79887\n16891,80120\n16891,80266\n16891,80515\n16891,81315\n16891,82103\n16891,82244\n16891,83916\n16891,87803\n16891,88582\n16891,100737\n16891,105751\n16891,120691\n16891,123892\n16891,124596\n16891,124955\n16891,127333\n16891,128317\n16891,142016\n16891,143446\n16891,143617\n16891,174526\n16891,174963\n16891,175348\n16891,177986\n16891,183850\n16891,185352\n16891,186787\n16891,190854\n16891,192763\n16891,215396\n16891,220792\n16891,222095\n16891,226675\n16892,1220\n16892,1222\n16893,949\n16894,202\n16894,203\n16896,4218\n16896,4220\n16896,66297\n16897,273\n16897,274\n16898,72\n16899,344\n16900,285\n16901,1298\n16902,83\n16902,175\n16902,278\n16902,285\n16902,450\n16902,455\n16902,1756\n16902,2553\n16902,28130\n16903,269\n16904,143\n16905,143\n16906,344\n16906,1512\n16906,2646\n16906,3794\n16906,5992\n16907,298\n16908,485\n16909,652\n16909,1052\n16909,1639\n16909,1893\n16910,301\n16911,143\n16912,143\n16913,143\n16914,1240\n16915,1019\n16916,1010\n16917,505\n16918,44\n16919,640\n16920,16921\n16922,2334\n16923,258\n16924,424\n16925,2312\n16926,163\n16927,4672\n16928,16929\n16930,16931\n16932,640\n16933,417\n16934,72\n16936,16937\n16938,16937\n16939,304\n16939,356\n16940,158\n16940,406\n16941,269\n16942,1220\n16942,1222\n16943,252\n16944,251\n16945,146\n16946,158\n16947,332\n16948,2506\n16949,192\n16949,663\n16950,278\n16951,2681\n16952,1844\n16954,72\n16955,372\n16955,390\n16955,589\n16955,1085\n16955,1411\n16955,6068\n16955,75912\n16955,185874\n16956,862\n16957,97\n16957,16958\n16957,53449\n16957,60478\n16957,90474\n16957,97688\n16957,101038\n16957,111005\n16957,114771\n16957,118964\n16957,119139\n16957,124439\n16957,175062\n16959,81\n16960,640\n16961,16962\n16963,417\n16964,217\n16964,392\n16964,1417\n16965,2083\n16966,104\n16966,134\n16966,135\n16966,136\n16966,137\n16966,138\n16966,557\n16966,850\n16966,1368\n16966,2105\n16967,227\n16968,1644\n16969,1240\n16969,1465\n16970,30\n16971,424\n16972,240\n16973,233\n16974,16975\n16974,55373\n16976,44\n16976,184\n16976,808\n16976,2646\n16976,255876\n16977,516\n16978,146\n16979,146\n16980,158\n16980,206\n16981,392\n16982,146\n16983,390\n16984,920\n16985,2373\n16986,72\n16987,344\n16988,285\n16989,644\n16990,143\n16991,143\n16991,1052\n16992,16993\n16994,3451\n16994,3452\n16995,206\n16995,2244\n16996,16997\n16996,67014\n16996,76415\n16998,2146\n16998,2931\n16998,16999\n16998,181476\n16998,227357\n16998,227639\n16998,228757\n16998,257540\n17000,781\n17001,298\n17002,485\n17003,644\n17004,171\n17005,298\n17006,485\n17007,30\n17008,17009\n17010,17011\n17010,120831\n17012,17013\n17014,17013\n17015,146\n17016,1590\n17016,1644\n17016,6661\n17017,17018\n17019,102\n17019,366\n17019,3724\n17020,433\n17021,366\n17021,972\n17022,66\n17022,868\n17024,219\n17024,535\n17024,731\n17024,758\n17024,818\n17024,957\n17024,1815\n17024,1888\n17024,3451\n17024,3452\n17024,3695\n17024,21944\n17025,206\n17026,306\n17026,307\n17027,298\n17028,485\n17029,240\n17030,146\n17031,726\n17032,640\n17033,640\n17034,640\n17035,760\n17037,72\n17038,344\n17039,285\n17040,1001\n17040,3094\n17041,313\n17042,644\n17042,1454\n17043,6661\n17044,602\n17045,1033\n17046,920\n17047,17048\n17049,143\n17050,934\n17051,1323\n17052,788\n17052,1368\n17052,1452\n17053,1033\n17054,3507\n17055,1285\n17056,104\n17056,557\n17056,1939\n17057,571\n17058,949\n17059,801\n17060,634\n17061,1323\n17062,102\n17063,1326\n17064,408\n17065,2367\n17066,118\n17066,206\n17066,1381\n17066,4597\n17066,5405\n17066,7572\n17067,202\n17067,203\n17067,406\n17067,1515\n17067,2371\n17068,626\n17069,1551\n17070,4060\n17071,3\n17072,6051\n17073,68\n17073,301\n17073,372\n17073,852\n17073,972\n17073,1010\n17073,1293\n17073,1309\n17073,1782\n17073,2083\n17074,1238\n17075,143\n17076,134\n17077,1608\n17078,1010\n17079,158\n17080,1452\n17081,1287\n17082,805\n17083,3999\n17084,406\n17084,602\n17084,779\n17085,34\n17085,35\n17085,536\n17086,255\n17087,17088\n17089,1860\n17090,3612\n17091,595\n17092,2274\n17093,392\n17094,4760\n17095,6059\n17096,5658\n17097,4252\n17098,72\n17099,344\n17100,623\n17101,285\n17102,697\n17103,6955\n17104,811\n17105,160\n17106,422\n17107,422\n17108,422\n17109,422\n17110,422\n17111,422\n17112,422\n17113,422\n17114,1227\n17114,1229\n17114,21944\n17115,697\n17115,1240\n17115,1769\n17116,34\n17116,35\n17116,186\n17116,192\n17116,254\n17116,326\n17116,392\n17116,455\n17116,534\n17116,772\n17116,801\n17116,861\n17116,943\n17116,1118\n17116,1119\n17116,1140\n17116,1417\n17116,1515\n17116,1749\n17116,1955\n17116,2372\n17116,4039\n17116,6556\n17116,75912\n17116,127158\n17118,273\n17118,274\n17119,143\n17120,135\n17121,83\n17122,433\n17123,861\n17124,393\n17124,1821\n17125,693\n17125,6051\n17126,1983\n17127,392\n17128,3161\n17129,1363\n17130,4039\n17131,599\n17132,392\n17132,623\n17133,736\n17134,473\n17135,298\n17136,485\n17137,104\n17137,248\n17138,130\n17138,1007\n17139,26\n17139,59\n17139,1359\n17139,1458\n17139,1888\n17139,6621\n17139,17140\n17139,21944\n17139,60576\n17141,628\n17141,2681\n17141,58979\n17141,88266\n17141,166757\n17141,187899\n17142,217\n17142,272\n17142,393\n17142,726\n17142,980\n17142,1388\n17142,1531\n17142,2178\n17142,4455\n17142,4545\n17143,1\n17143,206\n17143,328\n17143,920\n17143,30331\n17144,136\n17145,273\n17145,274\n17146,525\n17146,1749\n17147,10\n17147,72\n17147,273\n17147,274\n17147,2367\n17148,312\n17149,111\n17150,557\n17151,34\n17151,35\n17151,50\n17151,56\n17151,79\n17151,99\n17151,147\n17151,158\n17151,192\n17151,211\n17151,269\n17151,315\n17151,333\n17151,336\n17151,366\n17151,406\n17151,516\n17151,620\n17151,622\n17151,779\n17151,949\n17151,1014\n17151,1181\n17151,1298\n17151,1425\n17151,1623\n17151,1655\n17151,3370\n17151,3895\n17151,5375\n17151,14453\n17151,23783\n17151,43613\n17151,60576\n17151,127158\n17151,240174\n17152,1082\n17153,577\n17153,1429\n17154,877\n17154,1284\n17154,1715\n17154,49512\n17154,148742\n17154,245420\n17155,452\n17155,457\n17155,497\n17155,535\n17155,843\n17155,918\n17155,1011\n17155,1014\n17155,1655\n17155,4165\n17155,5726\n17156,326\n17156,784\n17156,1732\n17157,269\n17158,6303\n17159,1353\n17160,215\n17161,167\n17162,26\n17162,59\n17163,215\n17163,1016\n17163,1282\n17163,1882\n17164,143\n17165,4060\n17166,147\n17166,1620\n17166,1623\n17166,2471\n17166,14389\n17166,17166\n17167,158\n17168,2443\n17169,143\n17170,184\n17171,1893\n17172,215\n17173,240\n17173,1564\n17173,1955\n17173,2812\n17173,3538\n17174,10\n17175,1179\n17176,10\n17177,30\n17178,994\n17179,704\n17180,2979\n17181,143\n17182,516\n17183,818\n17184,1265\n17184,1266\n17184,7652\n17185,6682\n17186,20\n17187,1001\n17188,83\n17188,175\n17188,285\n17188,455\n17188,1274\n17188,1718\n17188,1756\n17188,2553\n17188,2779\n17188,2784\n17188,28130\n17189,217\n17189,387\n17189,1204\n17189,22071\n17190,392\n17190,697\n17191,217\n17192,4637\n17193,34\n17193,35\n17194,2045\n17195,455\n17196,2266\n17197,4594\n17198,2421\n17199,1201\n17200,269\n17201,1411\n17202,16687\n17203,5101\n17204,17205\n17204,28537\n17204,43915\n17204,43919\n17204,46268\n17204,180397\n17206,390\n17207,233\n17207,3135\n17208,1983\n17209,392\n17210,206\n17210,1359\n17211,356\n17211,509\n17211,595\n17211,1453\n17211,1572\n17211,1722\n17211,3538\n17212,298\n17212,417\n17212,1085\n17213,83\n17214,104\n17214,254\n17214,557\n17214,953\n17214,954\n17214,1939\n17215,2506\n17216,1151\n17217,104\n17217,254\n17217,557\n17217,953\n17217,954\n17217,1939\n17217,134641\n17218,417\n17220,178\n17220,3933\n17221,17222\n17223,222\n17223,455\n17224,222\n17225,2073\n17226,111\n17226,217\n17226,1181\n17226,2620\n17227,17228\n17229,2574\n17230,285\n17230,631\n17230,2590\n17230,2779\n17231,17232\n17233,640\n17234,143\n17235,151\n17236,406\n17236,779\n17237,184\n17238,2411\n17239,1033\n17240,273\n17240,274\n17241,22\n17241,163\n17241,182\n17241,579\n17241,9457\n17242,1400\n17243,1849\n17244,72\n17245,280\n17245,393\n17245,980\n17245,1370\n17245,2782\n17245,17245\n17246,392\n17247,285\n17247,620\n17247,8244\n17248,195\n17248,406\n17249,663\n17249,664\n17250,850\n17251,417\n17252,349\n17252,3260\n17253,516\n17253,255750\n17254,1181\n17255,850\n17256,862\n17257,602\n17258,247\n17259,779\n17260,68\n17261,9011\n17261,9032\n17261,17263\n17262,269\n17262,406\n17264,206\n17264,273\n17264,274\n17265,46\n17265,86\n17265,795\n17265,949\n17265,1801\n17265,2699\n17265,4903\n17265,13136\n17265,48505\n17266,17267\n17268,143\n17269,151\n17270,811\n17271,2334\n17272,515\n17272,1436\n17273,119\n17273,313\n17273,385\n17273,389\n17273,1724\n17273,2421\n17273,37088\n17273,115474\n17274,417\n17275,143\n17276,17277\n17278,1912\n17279,72\n17280,50\n17280,622\n17280,640\n17280,841\n17281,809\n17282,17283\n17284,312\n17285,147\n17285,158\n17285,206\n17285,406\n17285,2244\n17285,118336\n17286,1707\n17287,1370\n17287,1821\n17288,17289\n17290,1556\n17291,1240\n17292,6955\n17293,784\n17294,704\n17295,784\n17296,192\n17296,1007\n17296,1181\n17297,120\n17298,376\n17299,515\n17300,2292\n17301,3370\n17301,14453\n17302,1033\n17303,1\n17303,269\n17303,337\n17303,788\n17303,1425\n17304,10\n17305,874\n17306,1143\n17307,392\n17308,17309\n17309,240\n17309,819\n17309,6853\n17309,16653\n17309,18245\n17309,39511\n17309,63984\n17309,66452\n17309,68924\n17309,158392\n17309,173703\n17309,175425\n17310,333\n17310,440\n17310,1531\n17311,1370\n17311,1821\n17312,63\n17312,1893\n17313,17314\n17313,68069\n17313,175346\n17315,107\n17316,1257\n17316,3085\n17317,631\n17318,217\n17319,1085\n17320,207\n17321,1844\n17322,893\n17324,611\n17324,1612\n17325,17326\n17327,1241\n17327,2083\n17328,1204\n17329,994\n17330,206\n17330,406\n17330,422\n17330,779\n17330,1181\n17331,920\n17331,957\n17331,1815\n17332,306\n17332,307\n17333,17334\n17335,920\n17336,872\n17337,302\n17337,435\n17337,440\n17337,1433\n17337,5265\n17338,301\n17339,146\n17339,151\n17339,893\n17339,1179\n17339,3585\n17340,147\n17340,171\n17340,184\n17340,306\n17340,307\n17341,192\n17342,298\n17343,485\n17344,143\n17345,17346\n17346,19\n17346,83\n17346,135\n17346,536\n17346,4799\n17346,29938\n17346,250605\n17346,250806\n17346,251247\n17347,500\n17348,97\n17349,420\n17350,219\n17351,143\n17352,175\n17353,310\n17354,788\n17355,900\n17356,65\n17356,171\n17356,366\n17356,500\n17356,957\n17356,1247\n17356,1815\n17356,33082\n17356,164572\n17357,289\n17357,290\n17357,349\n17357,697\n17357,94134\n17358,192\n17359,634\n17360,1370\n17360,1821\n17361,10\n17362,83\n17362,175\n17362,278\n17362,285\n17362,389\n17362,455\n17362,626\n17362,1274\n17362,1756\n17362,2590\n17362,2779\n17362,2784\n17363,79\n17364,3507\n17365,3148\n17366,424\n17367,143\n17368,663\n17368,664\n17370,347\n17371,2416\n17371,2417\n17372,151\n17372,163\n17372,340\n17372,491\n17372,841\n17372,1058\n17372,1243\n17373,1955\n17374,83\n17374,119\n17374,175\n17374,285\n17374,455\n17374,1274\n17374,1756\n17374,2553\n17374,2779\n17374,2784\n17374,28130\n17375,256\n17375,2373\n17376,8822\n17377,652\n17378,338\n17379,1363\n17380,1414\n17381,2379\n17382,668\n17382,972\n17383,17384\n17385,72\n17386,9598\n17387,278\n17389,2372\n17390,192\n17390,920\n17390,1118\n17391,920\n17392,1235\n17392,1335\n17393,2506\n17394,430\n17395,68\n17396,83\n17396,3538\n17397,972\n17397,1010\n17397,1531\n17398,372\n17399,8598\n17400,72\n17401,118\n17401,4597\n17402,2506\n17403,10\n17403,48\n17403,50\n17403,136\n17403,589\n17403,795\n17403,862\n17403,1177\n17403,1309\n17403,1368\n17403,1411\n17403,1432\n17403,3804\n17403,8270\n17403,88820\n17403,182162\n17404,1368\n17405,17406\n17405,95316\n17405,107326\n17405,108517\n17405,110396\n17405,113339\n17407,3209\n17408,58\n17408,272\n17408,417\n17408,563\n17408,626\n17408,749\n17408,795\n17408,811\n17408,1133\n17408,1309\n17408,1368\n17408,1449\n17408,1821\n17408,2889\n17408,5708\n17408,6837\n17408,21736\n17409,258\n17410,81\n17411,452\n17411,457\n17411,497\n17411,535\n17411,1655\n17412,225\n17413,130\n17414,17415\n17416,563\n17417,8884\n17418,1392\n17419,1\n17419,22\n17419,972\n17420,94\n17420,306\n17420,307\n17420,2787\n17421,346\n17421,447\n17421,538\n17421,671\n17422,538\n17422,671\n17423,435\n17423,440\n17423,538\n17423,671\n17423,934\n17423,1294\n17423,1612\n17423,1877\n17424,435\n17424,447\n17424,671\n17424,1590\n17426,346\n17426,435\n17426,439\n17426,538\n17426,671\n17426,818\n17430,1068\n17430,1877\n17431,435\n17431,5996\n17432,192\n17432,435\n17432,538\n17432,671\n17432,30331\n17433,1\n17434,1402\n17435,192\n17436,273\n17436,274\n17437,1085\n17438,841\n17438,1458\n17438,2712\n17439,117\n17440,1\n17440,147\n17440,158\n17440,195\n17440,206\n17440,422\n17440,640\n17440,1458\n17440,1803\n17440,2244\n17440,80266\n17440,89035\n17441,130\n17441,500\n17441,718\n17441,893\n17441,14458\n17442,206\n17442,718\n17442,1888\n17442,8675\n17442,14458\n17443,885\n17444,592\n17445,364\n17445,431\n17445,1227\n17445,1229\n17445,1252\n17445,1253\n17445,2089\n17445,2940\n17445,4823\n17445,9536\n17445,21944\n17445,86416\n17446,1\n17446,184\n17446,2312\n17447,779\n17448,14550\n17449,227\n17449,2379\n17450,17451\n17452,289\n17452,290\n17452,94134\n17453,233\n17454,10\n17455,1392\n17456,4\n17456,5\n17457,2244\n17457,30331\n17458,372\n17459,251\n17459,516\n17460,634\n17461,104\n17461,134\n17461,136\n17461,138\n17462,366\n17463,366\n17464,366\n17465,366\n17466,366\n17467,1531\n17468,366\n17469,366\n17470,1977\n17470,1978\n17471,305\n17472,827\n17473,32\n17473,1274\n17473,1858\n17474,146\n17474,3148\n17474,5366\n17475,17476\n17476,17863\n17476,52441\n17477,146\n17478,17479\n17480,83\n17480,356\n17480,379\n17480,2784\n17480,5591\n17481,17482\n17483,1016\n17484,306\n17484,307\n17486,333\n17486,2931\n17487,17487\n17488,83\n17490,483\n17491,158\n17492,17493\n17494,17495\n17496,20\n17496,83\n17496,21442\n17496,142426\n17497,581\n17499,872\n17500,3507\n17501,671\n17502,1655\n17503,160\n17504,17505\n17506,17507\n17508,422\n17509,422\n17510,422\n17511,422\n17512,72\n17513,344\n17514,285\n17515,7\n17515,202\n17515,203\n17515,1265\n17515,1266\n17516,577\n17517,1001\n17518,620\n17519,202\n17519,203\n17520,10\n17520,2282\n17520,17521\n17522,5726\n17523,26\n17523,59\n17523,994\n17523,1235\n17523,1335\n17523,21944\n17524,17525\n17526,146\n17527,273\n17527,1052\n17528,306\n17528,307\n17529,298\n17530,485\n17531,147\n17532,298\n17533,485\n17534,1072\n17535,97\n17535,240\n17535,247\n17535,264\n17535,457\n17536,17537\n17538,1284\n17539,255\n17540,422\n17541,304\n17541,682\n17541,772\n17541,72439\n17542,17543\n17544,1\n17545,298\n17546,485\n17547,17548\n17547,43478\n17547,88854\n17549,202\n17549,203\n17550,275\n17550,277\n17551,147\n17551,206\n17551,406\n17551,779\n17551,89035\n17551,118336\n17552,17553\n17554,433\n17555,2178\n17555,4545\n17555,56150\n17555,139010\n17556,17557\n17558,422\n17559,56\n17560,17561\n17562,17561\n17563,577\n17564,10\n17565,1688\n17566,644\n17567,158\n17567,406\n17567,779\n17567,1181\n17567,1515\n17568,240\n17568,592\n17569,707\n17569,717\n17570,406\n17570,422\n17570,620\n17571,83\n17572,178\n17573,206\n17573,292\n17573,660\n17573,682\n17573,704\n17573,775\n17573,1432\n17573,1434\n17573,72439\n17573,88820\n17574,980\n17574,1370\n17574,1821\n17575,999\n17576,505\n17577,1224\n17578,304\n17579,1983\n17580,26\n17580,59\n17580,885\n17580,21944\n17581,779\n17582,497\n17583,493\n17584,647\n17587,17588\n17588,17588\n17589,17590\n17591,3451\n17591,3452\n17592,17593\n17594,160\n17595,1773\n17596,4\n17596,5\n17597,3209\n17598,390\n17599,743\n17600,65\n17601,261\n17602,143\n17603,227\n17604,264\n17605,1043\n17606,592\n17606,631\n17607,58\n17607,186\n17607,503\n17607,518\n17607,1140\n17607,1326\n17607,1659\n17607,2334\n17607,5547\n17608,83\n17608,544\n17608,1019\n17608,2779\n17609,577\n17610,143\n17611,298\n17612,485\n17613,118\n17613,682\n17613,4597\n17614,4\n17614,5\n17615,118\n17615,4597\n17616,994\n17617,3331\n17618,222\n17618,446\n17618,872\n17618,1118\n17618,1796\n17618,3111\n17618,3295\n17618,3297\n17618,16196\n17618,19005\n17619,32\n17619,392\n17619,697\n17619,2699\n17620,143\n17621,147\n17622,4903\n17622,13136\n17623,1033\n17624,50\n17625,310\n17626,843\n17627,1313\n17627,81648\n17628,1227\n17628,86416\n17631,302\n17632,87\n17632,609\n17633,195\n17634,779\n17635,483\n17635,1927\n17636,2083\n17637,143\n17638,83\n17639,17640\n17641,1818\n17642,718\n17643,872\n17646,671\n17647,17648\n17647,51614\n17649,65\n17650,4\n17650,5\n17651,17652\n17653,515\n17654,980\n17655,595\n17655,657\n17655,1453\n17656,516\n17657,17658\n17659,17660\n17661,1511\n17661,3069\n17662,762\n17663,485\n17664,50\n17664,158\n17664,192\n17664,406\n17664,779\n17664,1033\n17664,1265\n17664,1266\n17664,1531\n17664,3872\n17665,143\n17666,2416\n17666,2417\n17667,376\n17668,818\n17670,289\n17670,290\n17670,417\n17671,34\n17671,35\n17672,143\n17674,206\n17674,430\n17674,500\n17674,1608\n17675,1479\n17676,17677\n17678,1506\n17679,211\n17680,433\n17681,3085\n17682,309\n17682,310\n17683,1289\n17684,207\n17685,17686\n17687,273\n17687,274\n17688,298\n17689,485\n17690,17691\n17692,2775\n17693,17694\n17695,298\n17696,485\n17697,255\n17699,17700\n17702,2334\n17703,17704\n17703,81970\n17703,91994\n17703,122973\n17705,301\n17706,1\n17707,68\n17708,452\n17709,433\n17710,17711\n17712,17713\n17714,1359\n17715,272\n17716,17717\n17719,3367\n17720,4691\n17721,17722\n17723,1033\n17724,17725\n17726,872\n17727,424\n17728,392\n17728,1363\n17729,72\n17730,344\n17731,285\n17732,1\n17732,83\n17732,149\n17732,158\n17732,184\n17732,206\n17732,269\n17732,283\n17732,330\n17732,336\n17732,356\n17732,447\n17732,575\n17732,577\n17732,595\n17732,602\n17732,841\n17732,972\n17732,1085\n17732,1089\n17732,1179\n17732,1313\n17732,1332\n17732,1415\n17732,1452\n17732,1607\n17732,1858\n17732,2590\n17732,2828\n17732,2931\n17732,3003\n17732,3135\n17732,3769\n17732,4810\n17732,6424\n17732,6789\n17732,6837\n17732,15068\n17732,21442\n17732,89035\n17732,154408\n17733,784\n17734,310\n17734,1462\n17734,3039\n17734,8537\n17735,2351\n17736,525\n17736,862\n17736,3507\n17737,17738\n17739,261\n17740,187\n17741,267\n17742,269\n17743,271\n17744,17745\n17746,163\n17747,17748\n17749,862\n17750,652\n17751,640\n17752,149\n17752,4101\n17753,195\n17754,485\n17755,1001\n17756,17757\n17758,17759\n17758,67786\n17760,273\n17760,358\n17760,30331\n17761,147\n17762,143\n17763,17764\n17765,366\n17766,206\n17767,366\n17768,920\n17769,17770\n17769,19570\n17771,366\n17772,17772\n17773,872\n17774,872\n17775,184\n17776,1572\n17777,81\n17778,233\n17779,17780\n17781,1284\n17782,1102\n17783,17784\n17785,107\n17786,2416\n17786,2417\n17787,292\n17788,338\n17789,17790\n17789,62962\n17789,78602\n17791,298\n17792,1133\n17793,3538\n17794,447\n17795,255\n17796,452\n17796,457\n17796,497\n17796,535\n17796,1655\n17798,2744\n17799,7\n17800,652\n17801,79\n17801,192\n17801,202\n17801,203\n17801,333\n17801,1181\n17802,160\n17803,10\n17803,175\n17804,1381\n17805,146\n17806,17807\n17808,160\n17809,698\n17810,2424\n17811,222\n17811,278\n17811,1571\n17811,2224\n17811,5326\n17812,1572\n17813,87\n17813,595\n17813,809\n17813,872\n17813,1151\n17813,127158\n17814,17815\n17816,1\n17816,340\n17816,841\n17816,994\n17816,1294\n17816,1453\n17817,346\n17818,634\n17820,1323\n17821,102\n17822,1326\n17823,408\n17824,2367\n17825,19\n17825,385\n17825,1571\n17825,2266\n17825,5326\n17826,1454\n17827,273\n17827,274\n17828,146\n17829,1127\n17830,151\n17831,175\n17831,269\n17831,366\n17831,479\n17831,1462\n17831,8537\n17832,143\n17833,2334\n17834,298\n17835,485\n17836,10\n17837,10\n17837,34\n17837,35\n17837,217\n17837,222\n17837,389\n17837,457\n17837,536\n17837,1019\n17837,1072\n17837,1531\n17837,1724\n17837,2159\n17837,2266\n17837,19443\n17839,485\n17840,485\n17840,7117\n17841,932\n17842,83\n17843,251\n17844,872\n17845,298\n17846,485\n17847,215\n17847,240\n17847,372\n17847,417\n17847,503\n17847,592\n17847,631\n17847,760\n17847,805\n17847,932\n17847,1016\n17847,1282\n17847,1285\n17847,1462\n17847,1564\n17847,1715\n17847,1818\n17847,2620\n17847,8537\n17848,240\n17848,301\n17848,1785\n17848,1818\n17848,2620\n17849,1085\n17849,1181\n17849,1522\n17850,605\n17851,4810\n17853,3724\n17854,693\n17855,58\n17856,1653\n17856,1659\n17858,72\n17859,344\n17860,285\n17861,17862\n17863,17476\n17864,1949\n17865,9098\n17866,1247\n17867,592\n17868,171\n17869,147\n17869,973\n17870,652\n17871,17872\n17873,17476\n17875,592\n17876,1140\n17876,5547\n17877,1122\n17877,1241\n17877,1544\n17877,1849\n17877,2372\n17878,358\n17878,1082\n17879,184\n17880,1893\n17881,2590\n17882,332\n17883,615\n17884,251\n17884,252\n17884,318\n17884,516\n17884,1220\n17884,1222\n17884,41170\n17885,17886\n17887,17888\n17889,1511\n17889,3069\n17890,2775\n17891,160\n17892,2782\n17894,46\n17894,301\n17894,444\n17894,604\n17894,615\n17894,744\n17894,968\n17894,1124\n17894,1231\n17894,1293\n17894,1300\n17894,1949\n17894,3630\n17894,5662\n17895,500\n17896,366\n17897,326\n17897,79339\n17897,79354\n17897,113414\n17897,127264\n17898,17899\n17898,37269\n17900,298\n17901,485\n17902,44\n17903,589\n17904,726\n17904,996\n17904,1033\n17904,1877\n17905,2590\n17907,640\n17908,784\n17908,2315\n17908,3999\n17909,1963\n17910,376\n17911,355\n17912,1449\n17913,192\n17913,393\n17913,1531\n17913,4611\n17914,809\n17915,167\n17916,2574\n17917,615\n17918,163\n17919,86\n17920,1955\n17921,309\n17921,310\n17922,2607\n17923,3193\n17924,4604\n17925,417\n17925,1707\n17926,743\n17927,660\n17927,2424\n17927,19443\n17928,647\n17929,344\n17931,1289\n17931,1551\n17932,178\n17933,143\n17933,1052\n17934,4\n17934,5\n17936,298\n17937,485\n17938,17939\n17940,298\n17941,485\n17942,97\n17942,693\n17943,640\n17944,433\n17945,1313\n17946,17947\n17948,994\n17949,446\n17950,72\n17951,298\n17952,485\n17953,640\n17954,1707\n17955,579\n17956,63\n17957,1474\n17958,991\n17959,1227\n17959,1229\n17959,86416\n17961,22\n17962,557\n17963,557\n17964,862\n17965,557\n17966,557\n17967,557\n17968,5906\n17969,557\n17970,626\n17971,278\n17972,137\n17973,862\n17974,5906\n17975,557\n17976,626\n17977,278\n17978,137\n17979,862\n17980,17981\n17980,160027\n17982,143\n17982,2926\n17983,2574\n17984,1515\n17985,240\n17986,2372\n17987,298\n17988,485\n17989,15179\n17990,298\n17991,485\n17992,647\n17993,344\n17994,17995\n17996,647\n17997,1474\n17998,298\n17999,485\n18000,1016\n18001,19\n18001,206\n18001,668\n18001,875\n18001,129534\n18001,189842\n18002,46\n18003,2334\n18004,304\n18005,26\n18005,59\n18006,346\n18007,346\n18008,18009\n18010,991\n18011,671\n18013,104\n18013,441\n18013,838\n18013,1014\n18013,1309\n18014,18015\n18016,1381\n18017,305\n18018,22\n18018,94\n18018,158\n18018,211\n18018,240\n18018,294\n18018,315\n18018,366\n18018,1655\n18018,2787\n18018,22293\n18019,143\n18020,805\n18021,275\n18021,277\n18021,333\n18021,2073\n18022,18023\n18024,440\n18024,622\n18025,211\n18025,1639\n18026,217\n18026,920\n18026,1033\n18026,1181\n18027,184\n18028,22\n18028,1227\n18028,1229\n18028,21944\n18028,86416\n18029,509\n18031,1235\n18031,1335\n18032,315\n18033,366\n18034,389\n18036,18037\n18038,918\n18039,264\n18039,515\n18039,652\n18039,1007\n18039,1639\n18039,2626\n18040,143\n18041,298\n18042,485\n18043,163\n18044,20\n18044,366\n18044,424\n18044,500\n18044,622\n18044,1033\n18044,1388\n18044,1531\n18044,1590\n18044,4455\n18045,151\n18045,749\n18045,985\n18046,784\n18047,18048\n18049,18048\n18050,18048\n18051,18048\n18052,18048\n18053,2681\n18054,158\n18054,406\n18054,438\n18054,585\n18054,2931\n18055,18056\n18057,10\n18058,18059\n18058,51586\n18060,18061\n18060,21105\n18060,115785\n18062,452\n18063,596\n18064,18065\n18064,18682\n18066,99\n18067,72\n18068,292\n18069,294\n18070,296\n18071,298\n18072,58\n18072,87\n18072,292\n18072,442\n18072,801\n18072,872\n18072,1140\n18072,1146\n18072,1177\n18072,1326\n18072,1392\n18072,1653\n18072,1836\n18072,1893\n18072,2334\n18072,2436\n18072,3474\n18072,3804\n18072,5547\n18072,54004\n18073,3507\n18074,2681\n18076,611\n18077,72\n18078,515\n18079,2089\n18079,2940\n18080,18081\n18082,3111\n18083,563\n18084,872\n18085,1370\n18087,233\n18088,3\n18089,1118\n18089,2073\n18090,8\n18092,710\n18092,1127\n18092,1224\n18093,567\n18094,1882\n18095,515\n18096,1\n18096,2089\n18096,2940\n18097,911\n18097,6638\n18097,48505\n18098,444\n18098,604\n18098,968\n18098,1124\n18098,1293\n18099,163\n18100,3555\n18101,5469\n18102,1381\n18102,1531\n18103,364\n18103,431\n18103,1252\n18103,1253\n18104,292\n18104,1177\n18104,2443\n18105,1968\n18107,704\n18108,211\n18108,259\n18108,393\n18108,788\n18109,893\n18110,163\n18110,467\n18111,1143\n18113,163\n18114,147\n18115,818\n18115,1019\n18116,346\n18116,435\n18116,1849\n18117,1639\n18118,1579\n18120,163\n18121,58\n18122,46\n18123,163\n18124,178\n18124,272\n18124,447\n18124,538\n18124,671\n18124,934\n18125,26\n18125,59\n18125,994\n18126,87\n18126,392\n18126,1151\n18126,1363\n18126,1454\n18127,298\n18128,485\n18129,217\n18129,301\n18129,599\n18129,604\n18129,1782\n18129,3193\n18130,424\n18131,1722\n18132,1117\n18133,1566\n18133,1789\n18134,143\n18135,397\n18137,1805\n18137,3193\n18138,433\n18138,1634\n18139,1096\n18140,2373\n18141,1012\n18141,7757\n18142,104\n18142,120\n18142,261\n18142,338\n18142,536\n18142,710\n18142,1274\n18143,1893\n18143,2051\n18144,309\n18144,310\n18145,1715\n18146,240\n18146,818\n18147,163\n18147,302\n18147,579\n18147,861\n18147,1556\n18148,455\n18149,72\n18150,710\n18152,290\n18152,590\n18152,1282\n18152,1511\n18152,2206\n18152,2210\n18152,31725\n18152,33424\n18153,298\n18154,485\n18155,255\n18156,1240\n18157,415\n18158,1235\n18158,1335\n18158,5375\n18159,72\n18160,760\n18160,1631\n18161,704\n18162,567\n18163,14458\n18164,106\n18164,280\n18164,393\n18164,505\n18164,980\n18164,1821\n18164,2782\n18165,222\n18165,455\n18165,1019\n18166,3585\n18167,1326\n18168,599\n18170,1858\n18171,1860\n18172,202\n18172,203\n18172,2371\n18173,1425\n18174,158\n18175,104\n18175,134\n18176,309\n18176,310\n18177,818\n18178,306\n18178,307\n18179,687\n18179,1556\n18180,97\n18180,15609\n18181,72\n18182,1224\n18183,1858\n18184,1860\n18185,647\n18185,1175\n18185,1927\n18186,1326\n18187,485\n18187,1893\n18188,744\n18189,399\n18190,135\n18190,1052\n18191,1801\n18191,6955\n18193,58\n18193,534\n18193,589\n18194,30\n18194,50\n18194,328\n18194,440\n18194,622\n18194,631\n18194,794\n18194,809\n18194,838\n18194,1033\n18194,1085\n18194,1179\n18194,1332\n18194,1659\n18194,1939\n18194,3246\n18194,3247\n18194,141912\n18195,202\n18195,203\n18196,163\n18196,579\n18197,1313\n18199,500\n18201,516\n18204,65\n18204,467\n18207,868\n18209,163\n18210,571\n18210,868\n18210,81233\n18214,571\n18214,5212\n18218,178\n18218,571\n18218,868\n18218,1740\n18218,1877\n18218,156379\n18219,571\n18220,439\n18220,1068\n18220,1474\n18220,1612\n18220,1789\n18221,571\n18221,868\n18221,1085\n18221,1133\n18221,1326\n18221,221068\n18224,467\n18224,920\n18224,1392\n18224,152855\n18224,156379\n18225,868\n18233,571\n18233,868\n18238,309\n18238,310\n18239,79\n18239,192\n18239,406\n18239,622\n18240,525\n18240,663\n18240,818\n18240,868\n18240,1370\n18240,1623\n18241,163\n18241,302\n18241,868\n18241,1556\n18241,2116\n18242,571\n18242,868\n18244,467\n18244,868\n18244,81233\n18244,156379\n18244,162599\n18245,240\n18245,392\n18245,433\n18245,818\n18246,1631\n18248,66\n18248,68\n18248,83\n18248,120\n18248,151\n18248,388\n18248,392\n18248,467\n18248,536\n18248,599\n18248,868\n18248,1019\n18248,2083\n18248,141912\n18248,162599\n18249,66\n18249,467\n18249,571\n18249,868\n18249,1241\n18249,1326\n18249,2083\n18249,2353\n18249,31206\n18250,66\n18250,467\n18250,868\n18254,571\n18256,149\n18256,178\n18256,211\n18256,467\n18256,516\n18256,571\n18256,615\n18256,1345\n18261,192\n18261,868\n18261,6682\n18262,571\n18262,718\n18264,65\n18265,687\n18265,868\n18265,907\n18265,1556\n18265,4453\n18268,868\n18270,571\n18270,868\n18271,571\n18271,694\n18272,920\n18275,163\n18281,192\n18281,571\n18281,868\n18281,2373\n18284,149\n18284,571\n18284,868\n18288,79\n18289,571\n18291,273\n18291,571\n18291,868\n18294,358\n18295,392\n18295,697\n18295,1240\n18297,126\n18297,452\n18297,497\n18297,676\n18297,843\n18297,918\n18297,1011\n18297,18298\n18298,192\n18298,256\n18298,676\n18298,852\n18298,1014\n18298,1663\n18298,4165\n18298,9457\n18298,67223\n18298,72713\n18298,82102\n18298,85419\n18298,89362\n18298,89778\n18298,156994\n18298,186264\n18299,240\n18299,442\n18299,503\n18299,1564\n18299,1608\n18299,3538\n18299,3585\n18300,151\n18300,1893\n18301,79\n18303,571\n18303,868\n18304,571\n18304,868\n18307,433\n18308,868\n18309,439\n18309,571\n18309,868\n18309,872\n18309,1052\n18309,1893\n18309,49057\n18310,2353\n18312,868\n18313,240\n18313,309\n18313,310\n18315,1893\n18315,7155\n18320,1849\n18326,571\n18328,3\n18328,65\n18328,158\n18328,202\n18328,203\n18328,393\n18328,571\n18328,862\n18328,1243\n18328,1871\n18328,2867\n18328,2868\n18328,14483\n18333,349\n18333,392\n18333,433\n18333,868\n18333,1240\n18337,536\n18338,640\n18339,640\n18340,1010\n18340,1849\n18341,640\n18342,640\n18343,640\n18344,222\n18344,336\n18344,1836\n18344,1973\n18344,2744\n18344,2775\n18344,118336\n18345,222\n18345,313\n18345,356\n18345,477\n18345,634\n18345,1571\n18345,1881\n18345,2224\n18345,2266\n18345,5326\n18345,7698\n18345,8463\n18348,1509\n18349,596\n18351,596\n18352,596\n18353,596\n18357,571\n18357,868\n18357,1019\n18357,1462\n18357,2286\n18357,8537\n18358,571\n18361,163\n18361,467\n18361,571\n18361,868\n18361,1345\n18364,312\n18366,467\n18367,79\n18367,571\n18371,868\n18372,579\n18372,868\n18373,264\n18377,158\n18377,440\n18377,467\n18377,3804\n18379,417\n18381,571\n18382,136\n18382,2557\n18383,455\n18383,1210\n18384,349\n18384,697\n18384,3260\n18386,1449\n18387,120\n18387,301\n18387,388\n18387,389\n18387,571\n18387,657\n18387,868\n18387,1293\n18387,1634\n18387,15609\n18388,389\n18388,1454\n18389,431\n18397,34\n18397,35\n18397,217\n18397,435\n18397,455\n18397,467\n18397,536\n18397,571\n18397,868\n18397,2837\n18397,81233\n18397,156379\n18397,162599\n18398,283\n18398,326\n18398,571\n18398,868\n18398,1454\n18398,19443\n18400,349\n18400,392\n18400,433\n18400,503\n18400,832\n18400,1836\n18400,2671\n18400,141912\n18402,163\n18402,209\n18402,302\n18402,579\n18402,861\n18402,2116\n18404,571\n18404,2371\n18407,26\n18407,59\n18408,485\n18410,1117\n18412,32751\n18413,571\n18413,868\n18415,516\n18416,346\n18416,435\n18416,934\n18416,1033\n18417,1143\n18419,87\n18419,868\n18419,1454\n18420,571\n18422,313\n18422,1019\n18423,571\n18423,1688\n18424,163\n18425,417\n18425,1085\n18426,1096\n18427,50\n18428,26\n18428,59\n18430,32\n18430,392\n18433,292\n18433,760\n18433,968\n18433,1417\n18433,1522\n18433,141912\n18435,4\n18435,5\n18435,13704\n18436,577\n18438,467\n18438,868\n18439,832\n18440,240\n18441,306\n18441,307\n18441,4810\n18442,535\n18442,1151\n18443,2073\n18444,2436\n18445,577\n18446,649\n18447,1370\n18447,1821\n18448,406\n18449,393\n18450,760\n18450,1149\n18450,1266\n18450,1631\n18451,186\n18452,859\n18453,146\n18454,1447\n18455,5192\n18457,3\n18457,200\n18457,252\n18457,289\n18457,290\n18457,328\n18457,393\n18457,493\n18457,592\n18457,772\n18457,779\n18457,1085\n18457,1149\n18457,1231\n18457,1515\n18457,1715\n18457,2296\n18457,3193\n18457,5662\n18457,94134\n18458,18459\n18460,671\n18461,79\n18462,79\n18463,534\n18464,592\n18465,920\n18465,1089\n18465,1332\n18465,22071\n18466,1227\n18466,1229\n18466,1252\n18466,1253\n18467,1323\n18468,102\n18469,1326\n18470,408\n18471,34\n18471,35\n18472,626\n18472,2995\n18473,481\n18474,349\n18474,392\n18475,163\n18476,1374\n18476,2116\n18477,673\n18478,516\n18479,682\n18479,784\n18479,1222\n18479,1568\n18479,2944\n18479,7385\n18479,14037\n18479,17681\n18479,18479\n18479,18480\n18479,26861\n18479,30428\n18479,34386\n18479,57114\n18479,58932\n18479,59771\n18479,66401\n18479,70426\n18479,72439\n18479,82295\n18479,139564\n18479,162604\n18479,162611\n18479,234087\n18479,264503\n18481,389\n18481,1858\n18482,46\n18482,58\n18482,1124\n18482,75912\n18484,859\n18485,1566\n18486,2319\n18487,333\n18487,1149\n18488,703\n18489,1096\n18491,349\n18491,425\n18491,875\n18491,1117\n18491,3260\n18492,126\n18493,980\n18494,3804\n18495,158\n18496,652\n18496,1634\n18499,22\n18499,818\n18499,18245\n18499,39511\n18500,1140\n18500,1149\n18500,1326\n18500,1411\n18500,3804\n18501,304\n18501,356\n18502,577\n18502,1105\n18502,1429\n18503,66\n18504,1122\n18505,2205\n18506,2206\n18507,1877\n18508,388\n18509,920\n18511,596\n18511,907\n18514,264\n18515,134\n18515,200\n18515,298\n18515,372\n18515,1511\n18515,1962\n18515,3069\n18515,8180\n18517,392\n18520,83\n18521,298\n18522,485\n18523,3960\n18524,167\n18524,301\n18524,1837\n18526,623\n18526,663\n18526,685\n18526,973\n18527,1070\n18528,240\n18528,1203\n18529,18530\n18531,217\n18531,302\n18531,2116\n18532,66\n18532,868\n18533,41\n18536,422\n18537,422\n18538,14550\n18539,422\n18540,422\n18541,34\n18541,35\n18542,422\n18543,68\n18543,852\n18543,1119\n18544,932\n18545,422\n18546,1096\n18547,3238\n18548,500\n18550,309\n18550,310\n18551,631\n18552,336\n18553,604\n18554,1454\n18555,1556\n18556,1070\n18559,859\n18559,1105\n18559,1429\n18560,392\n18560,872\n18560,1151\n18561,13\n18562,298\n18563,485\n18564,309\n18564,310\n18564,3039\n18565,604\n18566,283\n18566,455\n18566,536\n18566,1467\n18566,1881\n18566,2266\n18567,15\n18567,58\n18567,994\n18567,3538\n18567,7360\n18568,1434\n18571,1564\n18572,222\n18575,1454\n18575,1805\n18576,2073\n18578,298\n18579,485\n18580,717\n18581,10\n18582,85\n18583,126\n18584,219\n18585,3804\n18586,120\n18587,326\n18587,752\n18587,874\n18587,1210\n18588,577\n18589,1425\n18592,19\n18593,344\n18593,1140\n18593,5547\n18594,298\n18595,485\n18596,143\n18597,422\n18598,422\n18599,422\n18600,749\n18600,999\n18601,240\n18603,290\n18603,592\n18603,704\n18603,1818\n18604,444\n18604,972\n18604,2253\n18604,3392\n18605,269\n18605,1001\n18605,2979\n18607,392\n18608,304\n18608,1715\n18609,1143\n18610,1639\n18611,1579\n18612,783\n18612,2737\n18614,1881\n18615,535\n18616,8180\n18617,160\n18617,1381\n18619,79\n18620,240\n18620,1085\n18621,592\n18622,298\n18623,485\n18624,1133\n18625,222\n18625,2596\n18625,5405\n18626,372\n18626,775\n18626,852\n18626,2209\n18627,22\n18627,79\n18627,186\n18627,217\n18627,309\n18627,310\n18627,392\n18627,435\n18627,609\n18627,1019\n18627,1085\n18627,2979\n18627,3182\n18628,14231\n18629,240\n18630,868\n18631,392\n18631,623\n18631,1722\n18631,1805\n18632,107\n18632,2416\n18632,2417\n18633,485\n18634,312\n18635,337\n18635,920\n18636,79\n18636,136\n18636,137\n18637,500\n18637,1181\n18637,60576\n18639,1181\n18639,5874\n18639,8244\n18639,18640\n18639,92476\n18639,106502\n18640,192\n18640,18638\n18642,22\n18643,1096\n18644,3258\n18645,209\n18646,50\n18646,149\n18646,406\n18646,620\n18646,622\n18646,141912\n18647,240\n18647,1203\n18647,8276\n18648,957\n18648,1815\n18649,868\n18650,222\n18650,313\n18650,385\n18650,455\n18650,657\n18650,1019\n18650,1274\n18650,1467\n18650,1618\n18650,1718\n18650,2779\n18650,4637\n18650,45437\n18650,58376\n18650,183456\n18651,20\n18651,83\n18651,309\n18651,310\n18651,577\n18651,929\n18651,1400\n18651,2372\n18651,21442\n18651,21944\n18652,1977\n18652,1978\n18653,843\n18654,313\n18654,2646\n18654,2944\n18654,18831\n18655,252\n18655,318\n18655,41170\n18656,104\n18657,22\n18658,577\n18658,1070\n18659,18660\n18661,1001\n18661,1085\n18661,75912\n18662,720\n18663,18664\n18667,68\n18667,211\n18667,1837\n18668,1319\n18669,272\n18669,333\n18669,516\n18669,1877\n18669,2006\n18669,4545\n18669,139010\n18669,194663\n18669,240174\n18670,1891\n18670,1973\n18671,1118\n18672,444\n18672,932\n18672,972\n18673,104\n18673,111\n18673,215\n18673,298\n18673,557\n18673,588\n18673,590\n18673,714\n18673,805\n18673,1282\n18673,1368\n18673,1745\n18673,1955\n18673,2205\n18673,33424\n18675,1282\n18676,1414\n18677,994\n18678,431\n18678,749\n18678,801\n18678,1146\n18678,1241\n18678,2083\n18679,720\n18679,907\n18679,1117\n18679,1284\n18680,1707\n18681,2512\n18683,1433\n18684,3\n18685,477\n18686,3252\n18687,10\n18687,97\n18688,301\n18688,968\n18688,1204\n18690,346\n18691,48\n18691,338\n18691,736\n18691,2051\n18692,149\n18692,406\n18693,623\n18694,1001\n18695,586\n18696,497\n18696,713\n18697,50\n18698,264\n18698,1370\n18699,18700\n18699,53605\n18699,104855\n18701,143\n18703,146\n18704,893\n18704,1146\n18705,158\n18705,406\n18706,809\n18707,644\n18708,298\n18709,485\n18710,3\n18710,147\n18710,195\n18710,225\n18710,240\n18710,1769\n18710,68069\n18710,86832\n18711,623\n18711,1240\n18712,527\n18713,435\n18714,305\n18715,5101\n18716,5101\n18717,1284\n18719,338\n18720,304\n18721,225\n18722,425\n18722,1276\n18722,3507\n18722,19488\n18723,1402\n18725,9029\n18726,1085\n18726,17698\n18726,18726\n18726,18727\n18726,22555\n18726,29619\n18726,32058\n18726,45066\n18726,53863\n18726,53878\n18726,54077\n18726,54081\n18726,54084\n18726,54085\n18726,54086\n18726,54822\n18726,102881\n18726,131968\n18726,235000\n18727,68955\n18728,808\n18728,1453\n18729,360\n18729,647\n18729,710\n18729,3177\n18730,483\n18731,136\n18731,137\n18731,439\n18733,251\n18733,516\n18733,1033\n18734,1285\n18735,338\n18736,195\n18737,278\n18737,18738\n18739,995\n18739,1069\n18739,1771\n18739,3407\n18739,5052\n18739,5186\n18739,5451\n18739,6058\n18739,6474\n18739,8107\n18739,13198\n18739,13524\n18739,15580\n18739,16192\n18739,18388\n18739,18737\n18739,20704\n18739,21200\n18739,25685\n18739,28910\n18739,29662\n18739,31278\n18739,31726\n18739,31727\n18739,31728\n18739,31729\n18739,31730\n18739,31731\n18739,31732\n18739,31733\n18739,31734\n18739,31735\n18739,31736\n18739,31737\n18739,31738\n18739,31739\n18739,31740\n18739,31741\n18739,31742\n18739,31743\n18739,31744\n18739,31745\n18739,31746\n18739,31747\n18739,31748\n18739,31749\n18739,31750\n18739,31751\n18739,31752\n18739,31753\n18739,31754\n18739,31755\n18739,31756\n18739,31757\n18739,31758\n18739,31759\n18739,31760\n18739,31761\n18739,31762\n18739,31763\n18739,31764\n18739,31765\n18739,31766\n18739,31767\n18739,31768\n18739,31769\n18739,31770\n18739,31771\n18739,31772\n18739,31773\n18739,31774\n18739,31775\n18739,31776\n18739,31777\n18739,31778\n18739,31779\n18739,31780\n18739,31781\n18739,31782\n18739,31783\n18739,31784\n18739,31785\n18739,31786\n18739,31787\n18739,31788\n18739,31789\n18739,31790\n18739,31791\n18739,31792\n18739,31793\n18739,31794\n18739,31795\n18739,31796\n18739,31797\n18739,31798\n18739,31799\n18739,31800\n18739,31801\n18739,31802\n18739,34416\n18739,36981\n18740,392\n18740,1240\n18741,2334\n18742,1284\n18743,18744\n18745,500\n18746,694\n18749,1858\n18750,1860\n18751,516\n18752,163\n18753,48\n18753,163\n18753,489\n18753,5102\n18753,193129\n18754,302\n18754,861\n18755,1608\n18756,628\n18756,1118\n18756,1210\n18756,1639\n18756,2266\n18756,8235\n18757,287\n18758,247\n18760,147\n18761,333\n18761,59021\n18763,2373\n18764,8\n18764,309\n18764,310\n18766,760\n18767,1858\n18768,1860\n18769,577\n18770,602\n18771,920\n18772,1240\n18772,2671\n18773,309\n18773,310\n18773,2312\n18774,2334\n18775,163\n18776,631\n18777,489\n18777,1276\n18778,527\n18779,577\n18780,733\n18781,626\n18782,1849\n18782,1955\n18783,3\n18783,233\n18783,301\n18784,302\n18784,811\n18784,1877\n18785,192\n18785,1181\n18787,868\n18788,5101\n18789,18790\n18791,87\n18791,392\n18791,1151\n18791,1363\n18791,1836\n18793,163\n18793,489\n18794,640\n18795,240\n18796,973\n18796,2367\n18797,779\n18798,760\n18799,264\n18799,1289\n18800,872\n18801,151\n18802,120\n18803,225\n18805,209\n18806,147\n18806,158\n18806,195\n18806,333\n18806,406\n18806,585\n18806,622\n18806,779\n18806,920\n18806,1181\n18806,1247\n18806,1414\n18806,3370\n18806,8270\n18806,8868\n18806,18810\n18806,164572\n18807,577\n18808,2421\n18809,2574\n18811,1\n18811,1663\n18812,83\n18813,117\n18813,885\n18813,1462\n18813,2712\n18813,8537\n18813,13704\n18814,83\n18815,192\n18815,663\n18815,664\n18815,809\n18815,1425\n18817,493\n18817,704\n18818,393\n18819,2209\n18820,312\n18821,72\n18822,151\n18822,2173\n18823,788\n18824,772\n18825,3258\n18826,841\n18827,83\n18827,949\n18828,1243\n18829,660\n18829,7092\n18830,2051\n18831,10\n18831,217\n18831,536\n18831,634\n18831,1571\n18831,2159\n18831,2168\n18831,2224\n18831,2646\n18831,2906\n18831,3016\n18831,4048\n18831,6064\n18831,8554\n18831,13622\n18831,14612\n18831,15017\n18831,18654\n18831,18832\n18831,19834\n18831,20201\n18831,20875\n18831,23550\n18831,24885\n18831,28479\n18831,28600\n18831,29259\n18831,29606\n18831,30308\n18831,30601\n18831,30617\n18831,30721\n18831,30735\n18831,30736\n18831,31360\n18831,37110\n18831,48208\n18831,48262\n18831,49113\n18831,49262\n18831,49551\n18831,55210\n18831,55244\n18831,55561\n18831,57187\n18831,59344\n18831,59763\n18831,59769\n18831,59788\n18831,59793\n18831,59794\n18831,59796\n18831,59799\n18831,59805\n18831,59806\n18831,59807\n18831,59809\n18831,59810\n18831,59814\n18831,59819\n18831,59820\n18831,59822\n18831,61355\n18831,62600\n18831,63961\n18831,69363\n18831,71035\n18831,82176\n18831,86767\n18831,94195\n18831,102569\n18831,106104\n18831,115474\n18831,119411\n18831,119412\n18831,119512\n18831,120859\n18831,121396\n18831,124639\n18831,125972\n18831,125986\n18831,127102\n18831,127776\n18831,128160\n18831,130732\n18831,130783\n18831,131384\n18831,131918\n18831,133488\n18831,133774\n18831,134056\n18831,134249\n18831,138278\n18831,140124\n18831,142573\n18831,142609\n18831,142809\n18831,143054\n18831,143504\n18831,144148\n18831,144268\n18831,145659\n18831,146170\n18831,146304\n18831,146706\n18831,147848\n18831,147923\n18831,147982\n18831,148130\n18831,148199\n18831,148489\n18831,148578\n18831,148605\n18831,148669\n18831,148720\n18831,148942\n18831,148944\n18831,149153\n18831,149394\n18831,149460\n18831,149462\n18831,149463\n18831,149467\n18831,149695\n18831,150173\n18831,150177\n18831,150181\n18831,150357\n18831,150736\n18831,150748\n18831,150754\n18831,150786\n18831,150858\n18831,152332\n18831,152717\n18831,152915\n18831,153374\n18831,153517\n18831,154495\n18831,154657\n18831,155162\n18831,155211\n18831,155365\n18831,155423\n18831,155429\n18831,155454\n18831,155488\n18831,155625\n18831,157400\n18831,157487\n18831,157839\n18831,158558\n18831,158633\n18831,160809\n18831,160944\n18831,162128\n18831,162685\n18831,163001\n18831,164358\n18832,392\n18832,536\n18832,1284\n18832,1893\n18832,3474\n18832,5130\n18832,18831\n18833,611\n18834,1392\n18834,156379\n18836,13980\n18837,135\n18837,138\n18838,111\n18838,442\n18838,801\n18838,1140\n18838,1177\n18838,1449\n18839,809\n18840,1544\n18841,32\n18841,392\n18842,1359\n18843,1711\n18844,104\n18844,852\n18845,2083\n18846,1238\n18847,1572\n18848,312\n18849,72\n18850,3538\n18852,309\n18852,310\n18853,1179\n18854,34\n18854,35\n18854,217\n18854,240\n18854,907\n18854,973\n18854,1001\n18854,1133\n18854,1284\n18854,1467\n18854,1715\n18854,2205\n18854,2206\n18854,5976\n18854,9018\n18854,19946\n18856,1635\n18857,1803\n18858,251\n18858,516\n18860,135\n18861,1782\n18862,875\n18863,3630\n18864,44\n18865,536\n18865,4672\n18866,1619\n18867,3585\n18869,151\n18870,535\n18871,652\n18872,48\n18873,1659\n18873,2367\n18874,1955\n18875,346\n18876,991\n18877,104\n18877,195\n18877,850\n18878,920\n18879,151\n18881,34\n18881,35\n18881,313\n18881,852\n18882,360\n18883,389\n18884,1467\n18885,135\n18886,344\n18886,647\n18888,376\n18889,885\n18890,240\n18890,1082\n18890,1309\n18890,1807\n18890,1888\n18890,1955\n18890,2775\n18890,3135\n18891,2372\n18892,850\n18893,217\n18894,2646\n18896,1417\n18897,195\n18898,79\n18899,1082\n18900,372\n18901,1241\n18902,1849\n18904,932\n18905,1479\n18906,809\n18907,1188\n18908,252\n18908,682\n18908,1243\n18909,1983\n18910,1267\n18911,72\n18912,6621\n18912,17140\n18912,21944\n18913,379\n18914,2421\n18915,1858\n18916,1860\n18917,135\n18918,592\n18919,602\n18920,301\n18921,14819\n18922,2424\n18923,406\n18924,192\n18925,818\n18926,30\n18927,704\n18928,72\n18929,225\n18930,631\n18930,1462\n18931,406\n18931,779\n18932,247\n18933,41\n18933,104\n18933,107\n18933,138\n18933,248\n18933,289\n18933,290\n18933,784\n18933,5405\n18933,94134\n18934,135\n18935,72\n18936,399\n18937,1238\n18938,1579\n18939,1639\n18940,13980\n18941,302\n18941,861\n18941,1381\n18941,1556\n18941,152855\n18942,503\n18943,422\n18944,2421\n18945,818\n18946,83\n18947,994\n18948,536\n18948,4672\n18949,119\n18949,192\n18949,309\n18949,310\n18949,577\n18949,1400\n18949,21944\n18950,1619\n18951,1452\n18952,1467\n18953,195\n18954,1370\n18955,1983\n18956,217\n18956,222\n18956,1417\n18957,72\n18958,376\n18959,4823\n18959,21944\n18960,392\n18960,415\n18960,1240\n18960,1454\n18960,1465\n18960,3260\n18961,455\n18962,1417\n18963,72\n18964,676\n18965,104\n18965,134\n18965,289\n18965,290\n18965,364\n18965,557\n18965,784\n18965,1016\n18965,1359\n18965,2775\n18965,3115\n18965,94134\n18966,18967\n18968,718\n18968,893\n18969,2421\n18970,1359\n18970,16614\n18971,7416\n18972,1860\n18973,3612\n18974,595\n18975,2274\n18976,392\n18977,4760\n18978,6059\n18979,5658\n18980,4252\n18981,623\n18982,697\n18983,6955\n18984,366\n18984,2607\n18985,422\n18987,298\n18988,485\n18989,215\n18989,1016\n18989,1212\n18989,1257\n18989,1282\n18989,1882\n18989,4237\n18989,182162\n18990,1243\n18991,1871\n18992,389\n18995,312\n18996,818\n18997,56\n18997,146\n18997,147\n18997,192\n18997,333\n18997,336\n18997,602\n18997,620\n18997,682\n18997,994\n18997,1089\n18997,1181\n18997,8244\n18997,72439\n18997,204124\n18997,240174\n18998,397\n18999,298\n19000,485\n19001,72\n19002,304\n19003,364\n19004,143\n19005,1001\n19005,1149\n19005,2146\n19005,5102\n19006,907\n19007,247\n19008,536\n19009,19010\n19010,287\n19010,392\n19010,685\n19010,697\n19010,809\n19010,903\n19010,911\n19010,918\n19010,2016\n19010,2418\n19010,2475\n19010,3258\n19010,4066\n19010,15913\n19010,17852\n19010,19009\n19010,19010\n19010,21139\n19010,22293\n19010,22377\n19010,23158\n19010,23169\n19010,24680\n19010,24790\n19010,26071\n19010,26256\n19010,30378\n19010,32677\n19010,34175\n19010,35959\n19010,43279\n19010,43896\n19010,46812\n19010,48648\n19010,50449\n19010,67537\n19010,70741\n19010,70818\n19010,71142\n19010,77816\n19010,80431\n19010,80630\n19010,80667\n19010,82721\n19010,82900\n19010,83810\n19010,86483\n19010,90837\n19010,91892\n19010,98227\n19010,109434\n19010,115066\n19010,121959\n19010,124896\n19010,125481\n19010,125906\n19010,127720\n19010,127808\n19010,134030\n19010,134067\n19010,134773\n19010,135559\n19010,136162\n19010,136659\n19010,136993\n19010,137197\n19010,137198\n19010,151540\n19010,154198\n19010,158997\n19010,159457\n19010,161184\n19010,163445\n19010,169012\n19010,169312\n19010,174839\n19010,178733\n19010,187826\n19010,191939\n19010,193613\n19010,198515\n19010,206537\n19010,211923\n19010,221144\n19010,224874\n19010,231094\n19010,240067\n19010,243480\n19010,243986\n19010,245293\n19010,245298\n19010,248015\n19010,254401\n19010,255574\n19010,257077\n19011,1618\n19012,920\n19013,298\n19014,485\n19015,143\n19016,116\n19016,151\n19016,717\n19016,991\n19016,2048\n19016,2087\n19017,72\n19018,344\n19019,285\n19020,83\n19021,536\n19022,83\n19023,83\n19024,2671\n19025,79\n19025,99\n19025,1181\n19026,1506\n19026,22125\n19027,118\n19027,233\n19027,302\n19027,422\n19027,1844\n19027,4597\n19027,5405\n19028,516\n19032,312\n19033,850\n19034,72\n19035,704\n19036,346\n19037,1001\n19037,4193\n19038,15523\n19039,422\n19040,56\n19041,875\n19042,346\n19043,422\n19044,56\n19045,298\n19046,485\n19047,79\n19047,140\n19047,178\n19047,202\n19047,203\n19047,424\n19047,718\n19047,760\n19047,818\n19047,1368\n19047,1715\n19047,2045\n19047,2205\n19047,2206\n19047,2416\n19047,2417\n19047,3085\n19047,3331\n19048,79\n19048,111\n19048,178\n19048,192\n19048,296\n19048,585\n19048,592\n19048,718\n19048,760\n19048,818\n19048,1715\n19048,2045\n19048,2205\n19048,2206\n19048,3085\n19048,3331\n19049,5375\n19050,298\n19051,485\n19056,907\n19056,2979\n19057,485\n19058,143\n19059,2775\n19060,447\n19061,58\n19061,534\n19061,75912\n19062,240\n19063,19064\n19063,149981\n19068,980\n19069,818\n19070,781\n19071,37\n19071,717\n19071,1782\n19072,390\n19073,450\n19074,1467\n19075,1149\n19076,557\n19077,557\n19078,143\n19079,18790\n19080,875\n19081,143\n19082,158\n19083,19084\n19085,2434\n19086,5213\n19087,248\n19087,450\n19087,717\n19087,1332\n19088,2073\n19088,2782\n19088,5908\n19089,187\n19090,104\n19091,2506\n19092,2506\n19093,2506\n19094,781\n19095,631\n19096,143\n19097,269\n19098,1085\n19099,417\n19099,3069\n19100,417\n19100,3069\n19103,497\n19104,450\n19105,515\n19106,2506\n19107,2506\n19108,298\n19109,485\n19110,79\n19110,309\n19110,310\n19110,364\n19111,22\n19111,972\n19112,143\n19113,450\n19114,406\n19115,1634\n19116,784\n19117,83\n19117,178\n19117,442\n19117,500\n19118,1127\n19120,272\n19120,934\n19120,1449\n19121,887\n19122,718\n19122,893\n19123,850\n19124,450\n19125,10\n19125,79\n19125,81\n19125,147\n19125,158\n19125,192\n19125,202\n19125,203\n19125,289\n19125,290\n19125,305\n19125,333\n19125,336\n19125,337\n19125,406\n19125,586\n19125,602\n19125,620\n19125,663\n19125,760\n19125,1392\n19125,1623\n19125,2244\n19125,94134\n19125,118336\n19126,1608\n19126,77315\n19127,758\n19128,4611\n19129,1544\n19130,313\n19130,2421\n19131,30\n19132,44725\n19133,19134\n19135,652\n19136,143\n19137,50\n19138,247\n19139,1417\n19140,206\n19141,184\n19142,58\n19142,872\n19143,147\n19143,158\n19143,195\n19143,779\n19144,497\n19145,19146\n19147,1313\n19148,602\n19149,602\n19150,602\n19151,143\n19152,4222\n19153,26\n19153,47\n19153,59\n19153,885\n19153,887\n19153,1432\n19153,2469\n19153,21944\n19154,994\n19154,1179\n19155,298\n19156,485\n19157,1858\n19158,1860\n19159,1556\n19160,1309\n19161,19162\n19163,5212\n19163,6682\n19164,72\n19165,920\n19166,1860\n19167,3612\n19168,1309\n19169,595\n19170,2274\n19171,392\n19172,4760\n19173,6059\n19174,5658\n19175,4252\n19176,623\n19177,697\n19178,6955\n19179,8788\n19180,247\n19181,493\n19182,192\n19183,10\n19184,115\n19184,118\n19184,330\n19184,1235\n19185,422\n19186,422\n19187,422\n19188,422\n19189,422\n19190,422\n19191,346\n19191,435\n19191,439\n19191,980\n19191,996\n19191,1033\n19191,1849\n19191,6661\n19191,13486\n19192,19193\n19194,843\n19195,163\n19196,72\n19197,344\n19198,285\n19199,1871\n19199,2421\n19200,19201\n19203,887\n19204,19193\n19204,95788\n19205,192\n19205,663\n19205,1370\n19205,3872\n19206,272\n19207,30\n19208,406\n19209,389\n19209,4903\n19210,26\n19210,59\n19210,885\n19211,217\n19211,1019\n19211,2784\n19211,5906\n19212,596\n19213,379\n19214,1531\n19215,143\n19216,10\n19217,417\n19217,1085\n19217,2296\n19218,77\n19218,5440\n19219,19220\n19221,1467\n19222,2421\n19223,83\n19224,63\n19224,6119\n19225,138\n19226,784\n19227,19227\n19228,795\n19228,5961\n19229,104\n19230,1001\n19231,26\n19231,59\n19231,430\n19231,1235\n19231,1335\n19231,1432\n19231,21944\n19232,26\n19232,59\n19232,21944\n19233,1871\n19234,1309\n19235,146\n19236,422\n19237,56\n19238,147\n19238,149\n19238,158\n19238,2244\n19239,704\n19240,1368\n19241,19242\n19243,182\n19243,188\n19243,7652\n19244,366\n19245,366\n19246,366\n19247,247\n19248,81\n19249,158\n19250,149\n19250,192\n19251,872\n19252,390\n19253,323\n19254,387\n19255,1531\n19256,233\n19257,19258\n19259,19258\n19260,19258\n19261,19258\n19262,19258\n19263,1564\n19264,602\n19265,19266\n19265,35762\n19267,515\n19268,602\n19269,602\n19270,219\n19271,422\n19272,56\n19273,72\n19274,102\n19274,1323\n19275,312\n19275,525\n19275,1749\n19276,497\n19277,1381\n19278,104\n19278,233\n19278,302\n19278,577\n19278,636\n19278,760\n19278,862\n19278,1070\n19278,1462\n19278,1745\n19278,1893\n19278,2205\n19278,3769\n19278,7757\n19278,8537\n19278,33424\n19278,68069\n19279,577\n19279,920\n19280,182\n19280,188\n19280,202\n19280,203\n19280,1844\n19281,571\n19281,868\n19282,19283\n19282,43899\n19282,54591\n19284,1181\n19285,28107\n19286,634\n19286,657\n19286,1718\n19286,1881\n19286,2646\n19286,2779\n19286,4637\n19286,5034\n19286,45437\n19286,183456\n19287,586\n19289,163\n19289,489\n19290,1326\n19291,298\n19292,485\n19293,160\n19293,360\n19293,1893\n19294,298\n19295,485\n19296,287\n19296,433\n19296,1607\n19296,1634\n19297,255\n19298,644\n19299,422\n19299,602\n19299,623\n19299,707\n19299,779\n19299,1805\n19299,22293\n19299,207837\n19300,1634\n19301,957\n19301,1815\n19303,611\n19304,1220\n19304,1222\n19305,19306\n19307,217\n19308,3451\n19308,3452\n19310,760\n19311,1506\n19312,583\n19313,579\n19313,861\n19314,364\n19315,704\n19316,298\n19317,485\n19319,422\n19320,56\n19321,2421\n19322,19323\n19322,48813\n19322,76594\n19322,81404\n19324,19325\n19326,3769\n19327,19328\n19329,209\n19330,79\n19331,130\n19331,264\n19331,312\n19331,360\n19331,467\n19331,649\n19331,652\n19331,736\n19331,1007\n19331,1147\n19331,1381\n19331,1551\n19331,1556\n19331,1893\n19332,163\n19333,483\n19333,2421\n19334,972\n19335,314\n19335,852\n19335,1177\n19335,1844\n19335,2210\n19335,4237\n19335,182162\n19336,10\n19336,175\n19336,693\n19336,13919\n19337,2779\n19338,5212\n19339,86\n19339,775\n19340,314\n19340,733\n19341,422\n19342,56\n19343,37\n19343,1782\n19344,306\n19344,307\n19346,647\n19347,459\n19347,497\n19347,589\n19347,868\n19348,1707\n19350,19351\n19350,19352\n19351,2424\n19351,7768\n19351,211889\n19352,54\n19352,222\n19352,283\n19352,1784\n19352,1861\n19352,2424\n19352,5435\n19352,18835\n19352,79966\n19352,84609\n19352,88523\n19352,91271\n19352,93052\n19352,111397\n19352,118044\n19352,118942\n19352,137217\n19352,161322\n19352,165814\n19352,172564\n19352,173765\n19353,146\n19354,147\n19355,19356\n19357,1453\n19358,130\n19358,827\n19359,287\n19360,640\n19361,893\n19361,55077\n19362,640\n19363,1276\n19364,710\n19365,175\n19366,392\n19366,1240\n19366,1465\n19366,1769\n19366,1949\n19366,3003\n19366,6556\n19367,518\n19367,1113\n19367,1323\n19368,1860\n19369,3612\n19370,595\n19371,2274\n19372,392\n19373,4760\n19374,6059\n19375,5658\n19376,4252\n19377,623\n19378,697\n19379,6955\n19380,3\n19381,160\n19382,1579\n19383,1639\n19384,287\n19384,811\n19384,1634\n19384,3260\n19384,3769\n19385,50\n19385,99\n19385,336\n19385,779\n19386,1419\n19387,301\n19387,1955\n19387,2979\n19387,3804\n19388,309\n19388,310\n19389,859\n19389,5102\n19390,1309\n19391,298\n19392,178\n19392,387\n19393,485\n19394,861\n19395,2274\n19396,366\n19397,6303\n19398,72\n19399,344\n19400,285\n19401,248\n19402,740\n19402,741\n19402,743\n19403,206\n19403,273\n19403,274\n19405,1052\n19406,500\n19407,422\n19408,56\n19409,717\n19410,349\n19410,1240\n19411,435\n19411,1181\n19412,1001\n19413,147\n19413,158\n19413,178\n19413,207\n19413,256\n19413,259\n19413,433\n19413,452\n19413,481\n19413,500\n19413,581\n19413,604\n19413,668\n19413,911\n19413,1014\n19413,1172\n19413,1262\n19413,1326\n19413,1445\n19413,1518\n19413,1603\n19413,1614\n19413,1653\n19413,1655\n19413,1801\n19413,3392\n19413,3555\n19413,4237\n19413,4276\n19413,5213\n19413,6918\n19413,9021\n19413,10548\n19413,19413\n19413,20342\n19413,20724\n19413,26806\n19413,27000\n19413,48607\n19413,52441\n19413,57292\n19413,76297\n19413,76704\n19413,81233\n19413,89035\n19413,92140\n19413,134732\n19413,136477\n19413,136550\n19413,137008\n19413,176028\n19413,182162\n19413,223725\n19414,1262\n19415,292\n19415,338\n19415,462\n19415,1653\n19415,1688\n19415,1893\n19415,37414\n19416,209\n19416,467\n19417,63\n19419,726\n19421,1113\n19422,702\n19422,703\n19422,873\n19422,874\n19423,534\n19424,298\n19425,485\n19426,211\n19426,366\n19427,623\n19428,3585\n19429,602\n19429,623\n19429,707\n19432,364\n19432,1087\n19433,77\n19433,2784\n19434,623\n19435,192\n19435,1433\n19435,3744\n19436,206\n19437,634\n19439,852\n19440,1955\n19441,875\n19442,184\n19442,457\n19442,859\n19442,1368\n19442,15179\n19443,19\n19443,385\n19443,389\n19443,477\n19443,660\n19443,852\n19443,951\n19443,1069\n19443,1618\n19443,1724\n19443,1916\n19443,2159\n19443,2168\n19443,2507\n19443,2646\n19443,4637\n19443,5326\n19443,5721\n19443,6506\n19443,7768\n19443,8431\n19443,8658\n19443,13137\n19443,13240\n19443,15562\n19443,17837\n19443,18345\n19443,18398\n19443,19443\n19443,19444\n19443,19450\n19443,21733\n19443,22172\n19443,22253\n19443,23287\n19443,26763\n19443,28130\n19443,28844\n19443,30502\n19443,34127\n19443,38139\n19443,40025\n19443,41108\n19443,41167\n19443,42132\n19443,44973\n19443,55035\n19443,56375\n19443,56383\n19443,56457\n19443,56478\n19443,56484\n19443,56488\n19443,56496\n19443,56502\n19443,56903\n19443,58829\n19443,59873\n19443,61019\n19443,61177\n19443,61335\n19443,63473\n19443,68459\n19443,71026\n19443,79300\n19443,83443\n19443,90162\n19443,91886\n19443,95625\n19443,103913\n19443,108085\n19443,115474\n19443,118449\n19443,154391\n19443,161861\n19443,175919\n19443,192892\n19443,212959\n19443,239970\n19443,248235\n19444,19443\n19445,346\n19445,996\n19446,4\n19446,5\n19446,5405\n19448,1977\n19448,1978\n19449,2286\n19450,19443\n19451,294\n19451,304\n19451,717\n19451,772\n19451,784\n19452,389\n19452,5405\n19453,668\n19453,1607\n19454,760\n19454,1631\n19455,2779\n19455,4594\n19456,99\n19457,30\n19457,147\n19457,200\n19457,248\n19457,406\n19457,439\n19457,772\n19457,1243\n19457,1515\n19457,28203\n19458,1247\n19459,1\n19459,4805\n19459,113878\n19460,3507\n19461,579\n19462,392\n19463,859\n19464,985\n19466,26\n19466,47\n19466,59\n19466,118\n19466,885\n19466,887\n19466,1722\n19466,1775\n19466,2469\n19466,3794\n19466,4597\n19466,21944\n19466,86298\n19467,1512\n19467,5992\n19468,22\n19468,240\n19468,1655\n19469,10\n19470,1118\n19472,1085\n19473,163\n19475,760\n19475,1631\n19476,349\n19477,79\n19478,171\n19479,54\n19480,489\n19480,811\n19480,827\n19480,893\n19481,1179\n19482,872\n19483,130\n19483,163\n19483,349\n19483,668\n19484,2775\n19485,1381\n19486,493\n19486,682\n19486,1985\n19486,72439\n19487,97\n19489,749\n19489,1368\n19490,356\n19491,206\n19491,7652\n19492,292\n19494,22\n19494,717\n19495,79\n19496,356\n19497,392\n19498,417\n19499,3260\n19500,104\n19500,254\n19500,557\n19500,953\n19500,954\n19502,41\n19502,850\n19502,1132\n19502,1608\n19503,323\n19505,211\n19506,1033\n19507,302\n19507,1556\n19508,2224\n19509,217\n19509,536\n19512,535\n19512,2209\n19513,163\n19513,579\n19514,298\n19515,143\n19516,485\n19517,301\n19517,809\n19518,19519\n19519,19597\n19519,19629\n19519,19824\n19519,24360\n19519,31591\n19519,38117\n19519,127144\n19519,192248\n19520,171\n19521,1227\n19521,1229\n19522,195\n19524,872\n19525,167\n19525,301\n19525,388\n19525,392\n19525,589\n19525,694\n19525,972\n19525,1001\n19525,1010\n19525,1085\n19525,1143\n19525,1284\n19525,1326\n19525,1466\n19526,2574\n19527,602\n19528,120\n19528,1419\n19528,1466\n19529,920\n19529,1433\n19530,19531\n19532,994\n19533,202\n19533,203\n19534,783\n19535,349\n19535,356\n19535,392\n19535,467\n19535,652\n19535,697\n19535,801\n19535,1151\n19535,1722\n19535,1893\n19536,302\n19537,500\n19537,718\n19539,805\n19539,4260\n19540,143\n19541,79\n19543,289\n19543,290\n19543,489\n19543,685\n19543,849\n19543,1130\n19543,1402\n19543,1844\n19543,5213\n19544,147\n19544,158\n19544,195\n19546,1019\n19547,1515\n19548,516\n19548,843\n19548,893\n19548,1033\n19548,1293\n19548,2006\n19548,2867\n19548,2868\n19548,206079\n19549,457\n19550,707\n19550,1707\n19551,500\n19553,868\n19554,920\n19555,10\n19555,79\n19555,97\n19555,147\n19555,149\n19555,175\n19555,184\n19555,336\n19555,588\n19555,590\n19556,298\n19557,485\n19559,135\n19560,534\n19560,1085\n19560,75912\n19561,120\n19561,694\n19561,28130\n19564,1433\n19565,1070\n19566,104\n19566,714\n19566,1462\n19566,2205\n19566,2206\n19566,2334\n19566,6556\n19566,8537\n19567,392\n19568,1241\n19569,2319\n19571,56\n19573,843\n19573,19574\n19573,26417\n19575,704\n19576,439\n19577,147\n19577,406\n19577,1181\n19577,4193\n19578,1\n19578,147\n19578,158\n19578,175\n19578,206\n19578,336\n19578,1458\n19578,2244\n19578,16891\n19578,16980\n19578,19578\n19578,23798\n19578,31573\n19578,59997\n19578,80266\n19578,147078\n19578,159257\n19578,159258\n19578,159625\n19578,162839\n19578,164155\n19578,164181\n19578,164560\n19578,165644\n19578,167116\n19578,167353\n19578,167524\n19578,167525\n19578,167526\n19578,216342\n19579,1688\n19579,1722\n19580,287\n19580,3695\n19580,6068\n19580,141912\n19581,2671\n19582,874\n19583,19519\n19584,1515\n19585,586\n19586,406\n19586,55849\n19587,2319\n19588,1293\n19589,336\n19589,406\n19589,2373\n19589,55849\n19590,147\n19590,425\n19590,1512\n19590,2646\n19590,2775\n19590,3115\n19590,5992\n19590,221313\n19591,19519\n19592,83\n19592,192\n19592,240\n19592,261\n19592,301\n19592,309\n19592,310\n19592,314\n19592,392\n19592,417\n19592,433\n19592,435\n19592,515\n19592,536\n19592,577\n19592,589\n19592,602\n19592,615\n19592,623\n19592,838\n19592,843\n19592,920\n19592,972\n19592,1014\n19592,1085\n19592,1172\n19592,1231\n19592,1243\n19592,1284\n19592,1293\n19592,1392\n19592,1544\n19592,1556\n19592,1590\n19592,1782\n19592,1796\n19592,1837\n19592,1844\n19592,1860\n19592,2979\n19592,30331\n19592,75912\n19593,620\n19594,1085\n19595,312\n19595,338\n19595,358\n19595,509\n19595,510\n19595,652\n19595,1572\n19595,1722\n19595,3538\n19595,8994\n19596,602\n19597,19519\n19598,68\n19598,1326\n19599,510\n19600,1511\n19600,3069\n19601,417\n19601,2296\n19602,5\n19602,47\n19602,2089\n19602,2469\n19602,2940\n19603,273\n19603,274\n19604,65\n19605,171\n19606,626\n19607,19608\n19607,52917\n19609,392\n19609,623\n19609,697\n19609,1769\n19610,1143\n19611,72\n19612,344\n19613,285\n19614,1639\n19615,1579\n19616,439\n19616,538\n19617,41\n19617,68\n19617,104\n19617,200\n19617,248\n19617,397\n19617,431\n19617,626\n19617,631\n19617,714\n19617,760\n19617,805\n19617,818\n19617,862\n19617,1014\n19617,1119\n19617,1282\n19617,1285\n19617,1462\n19617,2173\n19617,2205\n19617,2206\n19617,2519\n19617,2995\n19617,3135\n19617,4220\n19617,5509\n19617,6800\n19617,8537\n19617,9028\n19617,13947\n19617,15857\n19617,24613\n19617,30901\n19617,33424\n19617,36168\n19617,37263\n19617,40850\n19617,49346\n19617,69013\n19617,71745\n19617,75912\n19617,76139\n19617,88094\n19617,98263\n19617,117134\n19617,120511\n19617,125115\n19617,127729\n19617,127732\n19617,127733\n19617,127736\n19617,127737\n19617,127738\n19617,127742\n19617,127748\n19617,127749\n19617,127753\n19617,127754\n19617,127758\n19617,127759\n19617,127768\n19617,127771\n19617,127774\n19617,127779\n19617,127781\n19617,127783\n19617,127788\n19617,127789\n19617,127792\n19617,127796\n19617,127797\n19617,127799\n19617,127800\n19617,127801\n19617,127802\n19617,127828\n19617,127837\n19617,128342\n19617,151132\n19617,159712\n19617,167753\n19617,167756\n19617,167758\n19617,167759\n19617,169337\n19617,169372\n19617,169378\n19617,169380\n19617,169382\n19617,169391\n19617,169395\n19617,182799\n19617,182803\n19617,182836\n19617,182847\n19617,182924\n19617,182940\n19617,182948\n19618,809\n19618,2750\n19618,22293\n19619,19620\n19621,158\n19622,611\n19622,631\n19622,1203\n19622,1309\n19622,1955\n19623,146\n19624,957\n19624,1247\n19624,1815\n19625,356\n19625,435\n19625,843\n19626,19519\n19627,433\n19628,788\n19629,19519\n19630,346\n19631,636\n19632,1381\n19633,247\n19634,503\n19634,2443\n19635,1653\n19635,2436\n19635,32751\n19636,30\n19636,772\n19638,192\n19639,868\n19640,215\n19641,301\n19641,2045\n19642,1127\n19642,1381\n19642,40389\n19642,68069\n19642,86832\n19643,1882\n19644,19519\n19645,19519\n19646,171\n19647,302\n19648,298\n19649,485\n19650,1359\n19651,516\n19651,1531\n19652,1381\n19653,717\n19653,1782\n19654,19519\n19655,1359\n19656,48\n19656,106\n19656,130\n19656,515\n19656,991\n19656,1052\n19656,1559\n19656,1579\n19656,1639\n19656,1707\n19656,2051\n19656,3695\n19656,36985\n19656,54264\n19657,171\n19658,19519\n19659,309\n19659,310\n19660,22\n19660,222\n19660,389\n19661,83\n19662,1247\n19663,818\n19664,1608\n19665,586\n19666,130\n19667,1359\n19667,13538\n19668,1566\n19669,171\n19670,83\n19670,337\n19670,347\n19670,417\n19670,626\n19670,795\n19670,1133\n19670,1167\n19670,1837\n19670,15179\n19670,16687\n19671,918\n19672,146\n19672,278\n19672,389\n19672,1539\n19673,3\n19673,230509\n19673,230517\n19674,302\n19675,762\n19676,37414\n19677,171\n19678,206\n19679,298\n19680,485\n19682,68\n19682,314\n19682,7155\n19683,302\n19684,1425\n19685,907\n19685,932\n19686,302\n19686,314\n19686,579\n19686,2116\n19687,292\n19687,745\n19688,1113\n19689,509\n19689,536\n19690,104\n19690,147\n19690,406\n19690,636\n19690,644\n19690,1515\n19690,3507\n19690,3538\n19691,264\n19691,818\n19691,1531\n19692,392\n19692,3003\n19693,577\n19693,801\n19695,1531\n19698,346\n19699,346\n19701,32\n19701,438\n19701,1284\n19702,337\n19702,346\n19702,393\n19702,447\n19702,934\n19702,980\n19702,1175\n19702,1294\n19703,19704\n19705,298\n19706,485\n19707,3218\n19708,596\n19709,215\n19710,167\n19710,240\n19710,310\n19710,355\n19710,949\n19710,9001\n19710,88653\n19710,88654\n19711,19519\n19712,298\n19713,485\n19714,19715\n19716,314\n19716,467\n19717,422\n19718,56\n19719,163\n19720,227\n19721,518\n19721,775\n19721,3804\n19722,1267\n19724,310\n19725,163\n19726,163\n19726,302\n19727,163\n19728,1590\n19728,1644\n19729,37\n19730,809\n19731,442\n19732,907\n19732,932\n19733,163\n19734,843\n19735,163\n19736,146\n19737,862\n19737,1977\n19737,1978\n19738,163\n19739,143\n19740,22\n19740,861\n19741,305\n19742,86\n19743,163\n19744,182\n19744,4453\n19746,298\n19747,485\n19748,187\n19749,130\n19750,163\n19751,56\n19752,758\n19752,3695\n19753,6803\n19754,441\n19754,563\n19754,609\n19754,1045\n19754,4308\n19754,19755\n19754,24265\n19754,60651\n19755,609\n19755,1046\n19755,1257\n19755,1359\n19755,1882\n19755,2315\n19755,2572\n19756,609\n19757,19758\n19757,91163\n19757,115489\n19757,120246\n19759,447\n19760,298\n19761,485\n19762,794\n19763,893\n19764,22\n19764,32\n19764,102\n19764,106\n19764,163\n19764,269\n19764,340\n19764,649\n19764,663\n19764,893\n19764,934\n19764,994\n19764,1052\n19764,1082\n19764,1293\n19764,2353\n19764,2923\n19765,2224\n19766,433\n19767,171\n19768,1673\n19771,163\n19772,1\n19772,65\n19772,86\n19772,117\n19772,273\n19772,274\n19772,485\n19772,704\n19772,2712\n19772,5212\n19773,920\n19773,1118\n19774,1381\n19775,631\n19777,510\n19777,872\n19777,1118\n19777,1240\n19778,333\n19779,26\n19779,59\n19780,704\n19781,163\n19781,302\n19782,285\n19782,622\n19782,1181\n19782,1515\n19782,68069\n19782,240174\n19783,22\n19784,338\n19784,457\n19784,1262\n19784,1454\n19784,1531\n19784,1844\n19785,171\n19786,104\n19786,136\n19786,557\n19786,1368\n19786,1939\n19786,5405\n19787,336\n19788,636\n19788,5405\n19789,34\n19789,35\n19790,338\n19790,1673\n19791,1837\n19792,158\n19793,47\n19793,611\n19793,920\n19793,1235\n19793,1335\n19793,2469\n19793,2867\n19793,2868\n19793,4748\n19793,15179\n19793,22880\n19794,302\n19794,579\n19794,687\n19794,861\n19794,893\n19794,4453\n19795,4611\n19796,1544\n19797,222\n19797,2266\n19797,32475\n19798,41\n19798,104\n19798,134\n19798,298\n19798,372\n19798,417\n19798,431\n19798,611\n19798,805\n19798,862\n19798,1010\n19798,1014\n19798,1085\n19798,1179\n19798,1289\n19798,1368\n19798,1608\n19798,1807\n19798,2775\n19798,2995\n19798,75912\n19799,623\n19799,4760\n19800,298\n19801,485\n19802,217\n19803,32\n19803,392\n19803,644\n19803,697\n19803,3003\n19805,301\n19805,356\n19805,372\n19805,459\n19805,852\n19805,862\n19805,907\n19805,968\n19805,1010\n19805,1544\n19805,1837\n19805,1955\n19805,2572\n19805,4222\n19805,20359\n19805,188791\n19806,1089\n19807,349\n19808,195\n19811,500\n19813,178\n19814,1240\n19815,68\n19815,387\n19816,596\n19816,617\n19816,784\n19816,1146\n19816,1367\n19816,1368\n19816,1429\n19816,2565\n19816,2658\n19816,2814\n19816,3504\n19816,5391\n19816,7458\n19816,13132\n19816,20858\n19816,32504\n19816,38144\n19816,54271\n19816,57143\n19816,61901\n19816,64543\n19816,65395\n19816,65896\n19816,66090\n19816,66348\n19816,66357\n19817,248\n19817,450\n19817,818\n19817,996\n19817,1332\n19817,1644\n19817,127158\n19819,1323\n19820,102\n19821,1326\n19822,408\n19823,83\n19823,217\n19823,455\n19823,536\n19823,1240\n19823,1419\n19823,1453\n19823,1454\n19823,1467\n19823,1860\n19823,6955\n19823,8798\n19824,19519\n19826,4611\n19827,1544\n19828,163\n19828,305\n19828,447\n19828,1132\n19828,1201\n19828,15573\n19829,1888\n19829,21982\n19830,22\n19832,657\n19833,2434\n19834,536\n19834,18831\n19835,1033\n19836,1414\n19837,873\n19838,1801\n19839,2775\n19840,447\n19841,1181\n19842,195\n19843,1072\n19843,1240\n19844,217\n19844,389\n19844,592\n19844,623\n19844,818\n19844,1010\n19844,1085\n19844,1143\n19844,1374\n19844,1417\n19846,79\n19846,163\n19847,718\n19847,21944\n19848,2620\n19849,1085\n19850,2319\n19851,784\n19852,417\n19853,809\n19854,801\n19854,1082\n19854,1222\n19854,1512\n19854,2775\n19854,3623\n19854,9467\n19854,19854\n19854,19855\n19854,21071\n19854,45647\n19854,72439\n19854,77808\n19854,156270\n19856,48\n19856,158\n19856,278\n19856,313\n19856,422\n19856,447\n19856,575\n19856,660\n19856,682\n19856,784\n19856,795\n19856,996\n19856,1082\n19856,1353\n19856,1512\n19856,1807\n19856,2944\n19856,4223\n19856,5992\n19856,6506\n19856,7270\n19856,7768\n19856,13137\n19856,32751\n19856,41170\n19856,72439\n19857,120\n19857,261\n19857,682\n19857,694\n19857,1353\n19857,3115\n19857,72439\n19858,392\n19859,192\n19859,1688\n19860,278\n19861,83\n19862,217\n19863,1370\n19864,4611\n19865,1544\n19866,1220\n19866,1222\n19867,392\n19867,467\n19867,872\n19868,372\n19868,760\n19869,704\n19871,143\n19872,3507\n19873,34\n19873,35\n19873,518\n19873,775\n19873,2209\n19874,1298\n19874,1796\n19875,999\n19876,151\n19878,143\n19879,19519\n19880,579\n19882,424\n19883,2411\n19884,920\n19885,7416\n19886,313\n19887,309\n19887,310\n19887,652\n19888,225\n19888,1181\n19888,1285\n19888,1749\n19888,1973\n19888,2205\n19888,2605\n19888,3585\n19888,33424\n19888,49057\n19889,94\n19889,430\n19889,994\n19889,1235\n19889,1335\n19889,2787\n19889,3816\n19889,3817\n19890,19519\n19891,1010\n19891,1849\n19892,1983\n19893,967\n19893,1235\n19893,1684\n19893,3794\n19893,4114\n19893,15742\n19893,21944\n19893,34060\n19893,42559\n19893,47819\n19893,48344\n19893,148326\n19894,175\n19894,313\n19894,328\n19894,485\n19894,685\n19894,693\n19894,1188\n19894,13538\n19895,72\n19897,1220\n19897,1222\n19898,1429\n19900,2334\n19901,48\n19901,158\n19901,206\n19901,575\n19901,682\n19901,694\n19901,1512\n19901,2646\n19901,2775\n19901,3115\n19901,3623\n19901,5992\n19901,72439\n19902,704\n19904,178\n19904,1559\n19905,19519\n19906,3409\n19907,167\n19907,510\n19907,1010\n19907,1616\n19907,3138\n19907,20359\n19908,991\n19908,1653\n19909,200\n19909,225\n19909,772\n19909,850\n19909,1332\n19910,264\n19910,649\n19911,8180\n19912,605\n19913,1571\n19914,1078\n19915,247\n19916,1571\n19917,171\n19918,4\n19918,5\n19919,50\n19919,79\n19919,147\n19919,158\n19919,192\n19919,333\n19919,336\n19919,406\n19919,620\n19919,779\n19919,1163\n19919,1181\n19919,1425\n19919,1515\n19919,4193\n19919,5726\n19919,8055\n19920,298\n19921,485\n19922,872\n19923,872\n19924,298\n19925,485\n19926,736\n19927,577\n19928,298\n19929,485\n19930,79\n19930,671\n19931,264\n19931,515\n19931,652\n19932,167\n19932,73570\n19933,1188\n19935,301\n19935,2083\n19936,147\n19936,158\n19936,285\n19936,406\n19936,779\n19936,1515\n19937,425\n19937,1973\n19938,862\n19939,333\n19939,19010\n19940,758\n19941,1001\n19942,622\n19943,697\n19944,417\n19945,30\n19947,611\n19948,2135\n19951,2135\n19953,37\n19953,1231\n19953,1531\n19954,718\n19955,306\n19955,307\n19955,333\n19955,779\n19955,1515\n19956,972\n19957,163\n19958,184\n19959,143\n19961,143\n19962,9010\n19963,8788\n19964,1332\n19965,941\n19966,338\n19966,941\n19967,945\n19967,1572\n19968,65\n19968,68\n19968,868\n19968,75912\n19969,143\n19969,1052\n19970,298\n19971,485\n19972,1531\n19973,2244\n19973,9146\n19974,298\n19975,485\n19976,431\n19977,872\n19978,298\n19979,485\n19980,1436\n19980,2979\n19981,2989\n19981,2991\n19982,485\n19983,298\n19984,349\n19984,3260\n19985,19986\n19987,2646\n19988,19989\n19990,19991\n19992,949\n19993,10\n19993,81\n19993,1745\n19993,31977\n19995,1983\n19996,1192\n19996,1453\n19997,104\n19997,720\n19997,779\n19999,477\n19999,536\n19999,2168\n20000,1968\n20001,2244\n20001,3246\n20001,3247\n20002,872\n20003,20004\n20005,44\n20006,872\n20008,287\n20009,1274\n20010,83\n20012,808\n20012,1949\n20013,2073\n20014,143\n20015,50\n20016,72\n20017,390\n20017,1544\n20018,2051\n20019,2506\n20020,1326\n20021,424\n20022,1511\n20022,3069\n20023,20024\n20023,36356\n20023,37940\n20023,43929\n20023,56344\n20023,58777\n20023,58792\n20023,59736\n20023,83084\n20023,87184\n20023,104085\n20025,104\n20027,364\n20027,431\n20028,1608\n20029,143\n20030,403\n20030,113878\n20031,195\n20031,285\n20031,1366\n20031,1776\n20031,7818\n20031,20032\n20031,21487\n20031,30418\n20031,35623\n20031,68069\n20032,195\n20033,20034\n20033,53155\n20033,55497\n20033,64987\n20035,192\n20035,211\n20035,1623\n20036,779\n20037,595\n20037,1453\n20037,1572\n20038,431\n20038,631\n20038,1285\n20039,518\n20039,1227\n20039,1229\n20039,1252\n20039,1253\n20039,21944\n20039,86416\n20040,784\n20041,1511\n20041,3069\n20042,301\n20042,372\n20042,862\n20042,907\n20042,968\n20042,1010\n20042,1544\n20042,1837\n20042,2590\n20042,4222\n20042,20359\n20043,79\n20044,20045\n20044,87086\n20046,718\n20047,20048\n20049,485\n20050,818\n20051,349\n20052,417\n20053,356\n20053,477\n20053,634\n20053,2224\n20053,5326\n20053,6506\n20053,7698\n20054,332\n20055,1284\n20055,148742\n20056,2048\n20057,557\n20058,557\n20059,20060\n20059,81445\n20061,106\n20061,1370\n20061,6119\n20062,163\n20064,647\n20065,344\n20066,5440\n20067,2116\n20068,3409\n20069,718\n20070,143\n20070,1052\n20070,1983\n20071,126\n20071,336\n20071,676\n20071,1803\n20071,215276\n20072,301\n20072,1818\n20073,20074\n20075,1837\n20076,41\n20076,406\n20077,13345\n20078,19519\n20080,1425\n20081,406\n20082,932\n20083,99\n20084,450\n20085,19519\n20086,581\n20087,640\n20088,195\n20089,50\n20089,146\n20089,147\n20089,158\n20089,358\n20089,406\n20089,510\n20089,779\n20089,1181\n20089,1515\n20090,1309\n20091,918\n20092,505\n20093,1010\n20094,147\n20094,779\n20095,1515\n20096,4611\n20097,1544\n20098,66\n20098,364\n20099,1238\n20100,1332\n20101,450\n20101,611\n20102,2607\n20103,19519\n20104,195\n20105,305\n20106,652\n20107,10\n20107,113156\n20108,20109\n20110,135\n20112,302\n20112,861\n20113,298\n20114,485\n20115,3111\n20115,4980\n20115,13538\n20116,346\n20116,435\n20116,439\n20116,447\n20116,1033\n20116,1590\n20117,1801\n20117,2416\n20117,2417\n20118,1381\n20119,247\n20120,309\n20120,310\n20121,143\n20122,302\n20123,1740\n20124,240\n20125,292\n20126,6682\n20127,417\n20128,693\n20128,20129\n20128,51864\n20128,52711\n20128,53197\n20128,61668\n20130,20131\n20132,32\n20132,392\n20132,1363\n20132,2274\n20132,2699\n20133,1058\n20134,588\n20134,590\n20134,2296\n20134,2626\n20135,1634\n20136,1414\n20137,250\n20139,417\n20140,20141\n20142,83\n20143,2779\n20144,671\n20145,71\n20145,337\n20145,1070\n20146,171\n20147,143\n20148,589\n20149,1370\n20150,640\n20151,1881\n20152,147\n20153,202\n20153,203\n20154,20155\n20156,577\n20156,1105\n20157,20158\n20159,510\n20160,406\n20160,779\n20160,1181\n20160,1515\n20160,68069\n20161,392\n20162,392\n20163,392\n20164,104\n20164,134\n20164,135\n20164,2105\n20165,217\n20165,278\n20165,349\n20165,536\n20165,644\n20165,2424\n20165,2784\n20165,141912\n20166,264\n20167,392\n20168,147\n20168,337\n20169,4611\n20170,1544\n20171,20172\n20171,45045\n20171,56851\n20173,135\n20174,20158\n20175,602\n20176,392\n20176,27392\n20176,35942\n20176,47362\n20176,54865\n20176,57554\n20177,323\n20178,2574\n20179,366\n20180,366\n20181,366\n20182,392\n20183,366\n20184,366\n20185,202\n20185,203\n20186,366\n20187,366\n20188,366\n20189,366\n20190,240\n20190,1085\n20191,602\n20192,20193\n20194,1140\n20194,5547\n20195,1140\n20195,5547\n20196,392\n20197,20198\n20199,34\n20199,35\n20199,536\n20199,1274\n20199,4672\n20200,54\n20200,6955\n20201,217\n20201,536\n20201,1417\n20201,4672\n20201,18831\n20202,872\n20203,7\n20203,202\n20203,203\n20205,392\n20206,247\n20207,392\n20207,710\n20207,1836\n20208,2146\n20209,704\n20210,163\n20211,2146\n20212,298\n20213,485\n20214,163\n20215,163\n20216,333\n20217,1556\n20218,2116\n20219,392\n20220,20221\n20220,109142\n20222,347\n20222,13136\n20223,622\n20224,233\n20225,493\n20226,801\n20226,991\n20227,885\n20227,1235\n20227,1335\n20227,2893\n20227,13704\n20227,21944\n20227,52851\n20228,388\n20228,779\n20228,1096\n20228,1240\n20228,2045\n20228,7757\n20229,1241\n20230,163\n20231,163\n20231,2116\n20232,3724\n20233,583\n20234,4223\n20235,192\n20236,163\n20237,20238\n20239,20240\n20241,20240\n20242,20240\n20243,20240\n20244,19519\n20245,20246\n20247,3111\n20248,640\n20248,682\n20248,1313\n20249,10\n20249,113156\n20250,163\n20251,72\n20252,344\n20253,285\n20254,163\n20255,34\n20255,35\n20255,907\n20255,1001\n20255,1133\n20255,1284\n20255,1715\n20255,9018\n20255,19946\n20256,32\n20256,65\n20256,87\n20256,192\n20256,509\n20256,510\n20256,1363\n20256,1722\n20256,1836\n20256,2146\n20256,3260\n20256,3474\n20256,20257\n20258,3451\n20258,3452\n20259,433\n20260,146\n20261,72\n20261,130\n20261,264\n20261,338\n20261,467\n20261,479\n20261,510\n20261,515\n20261,872\n20261,1052\n20261,1151\n20261,1287\n20261,1381\n20261,1893\n20261,1968\n20261,2617\n20262,20263\n20264,644\n20265,222\n20265,1618\n20265,7092\n20266,20267\n20266,25645\n20269,1220\n20269,1222\n20270,298\n20271,485\n20273,298\n20274,485\n20276,58\n20277,46\n20278,2681\n20280,209\n20281,885\n20281,1983\n20281,2105\n20281,13704\n20282,968\n20283,1388\n20284,120\n20285,406\n20285,682\n20285,1181\n20285,72439\n20286,364\n20287,968\n20287,1285\n20288,431\n20289,2083\n20290,687\n20290,1556\n20291,134\n20292,2353\n20293,360\n20293,440\n20294,885\n20294,1235\n20294,1335\n20294,142427\n20295,63\n20295,79\n20295,252\n20295,467\n20295,516\n20295,1014\n20295,1175\n20295,1220\n20295,1222\n20295,1243\n20295,1844\n20295,156379\n20295,162599\n20296,433\n20297,302\n20297,579\n20297,749\n20297,1146\n20297,1452\n20297,1849\n20298,202\n20298,203\n20298,7884\n20298,20185\n20298,20203\n20298,21293\n20298,21934\n20298,22054\n20298,22795\n20298,24261\n20298,34991\n20299,298\n20300,485\n20301,68\n20301,760\n20301,1149\n20301,1631\n20302,358\n20303,1167\n20303,1544\n20304,1392\n20305,47\n20305,2469\n20307,240\n20307,3135\n20308,71\n20308,663\n20308,664\n20310,510\n20311,3138\n20312,781\n20314,3\n20315,158\n20315,602\n20315,1392\n20315,1745\n20316,1590\n20317,4611\n20318,1544\n20319,306\n20319,307\n20320,4\n20320,5\n20321,209\n20322,500\n20323,65\n20323,467\n20323,868\n20323,1433\n20325,634\n20327,167\n20327,301\n20327,615\n20327,968\n20327,973\n20327,1160\n20327,1293\n20327,1300\n20327,1782\n20327,1837\n20327,103860\n20328,968\n20328,1293\n20329,19519\n20330,781\n20331,500\n20332,1235\n20332,1335\n20333,20334\n20336,2784\n20337,516\n20338,1058\n20339,1326\n20340,360\n20341,622\n20341,1033\n20343,1140\n20343,3474\n20343,5547\n20344,209\n20345,278\n20345,1019\n20345,8788\n20345,8855\n20346,6955\n20347,171\n20348,4223\n20349,794\n20350,240\n20350,518\n20350,872\n20350,1326\n20350,1732\n20351,10\n20351,113156\n20352,143\n20352,1559\n20353,134\n20353,1282\n20353,1392\n20353,1745\n20353,2089\n20353,2205\n20353,2286\n20353,2940\n20353,33424\n20354,32\n20354,3003\n20357,450\n20357,1332\n20358,968\n20359,20359\n20360,147\n20361,10\n20362,999\n20363,3182\n20364,417\n20364,1564\n20365,1655\n20366,652\n20366,710\n20368,640\n20369,2373\n20370,1531\n20371,1146\n20371,118336\n20372,602\n20373,302\n20374,2671\n20375,56\n20375,147\n20375,149\n20375,841\n20375,1085\n20375,2674\n20376,163\n20376,302\n20377,980\n20378,1052\n20379,163\n20380,392\n20380,644\n20381,207\n20382,599\n20383,611\n20383,1718\n20384,19519\n20385,171\n20386,4411\n20387,48\n20387,130\n20387,160\n20387,264\n20387,515\n20387,649\n20387,1007\n20387,1132\n20387,1147\n20387,1381\n20387,1452\n20387,1509\n20387,1639\n20388,682\n20388,6424\n20388,28107\n20389,344\n20389,1634\n20390,15\n20390,875\n20392,2116\n20393,222\n20393,515\n20394,163\n20395,104\n20395,557\n20395,953\n20395,954\n20395,5405\n20396,299\n20396,972\n20396,1010\n20396,1479\n20396,1849\n20398,1014\n20399,536\n20401,1707\n20402,733\n20404,515\n20405,50\n20406,1849\n20407,301\n20407,968\n20408,663\n20408,664\n20409,1634\n20410,1323\n20411,102\n20412,1326\n20413,408\n20414,1370\n20414,1821\n20415,163\n20416,615\n20416,657\n20416,3182\n20417,2646\n20418,586\n20419,516\n20419,579\n20419,1243\n20419,1462\n20419,1512\n20419,1983\n20419,2775\n20419,3115\n20419,5992\n20419,8537\n20419,189788\n20419,189794\n20419,189842\n20419,206297\n20419,223738\n20420,4611\n20421,1544\n20422,298\n20423,485\n20424,302\n20425,337\n20426,22\n20426,222\n20426,392\n20426,457\n20426,1151\n20426,1240\n20426,1326\n20426,1465\n20426,1860\n20426,1955\n20426,2436\n20426,3182\n20427,32\n20427,392\n20427,623\n20427,1188\n20427,1240\n20427,1454\n20427,4903\n20427,76096\n20428,287\n20428,809\n20429,1769\n20430,264\n20430,338\n20430,467\n20430,626\n20432,943\n20433,149\n20434,3804\n20435,1411\n20436,795\n20437,1016\n20438,337\n20440,687\n20440,861\n20441,3695\n20442,1140\n20443,227\n20444,2701\n20445,215\n20446,328\n20447,1016\n20448,1849\n20449,1010\n20450,1722\n20451,801\n20452,358\n20453,383\n20454,111\n20455,1052\n20456,2443\n20457,3538\n20458,1332\n20459,72\n20460,1939\n20461,248\n20462,3193\n20463,525\n20464,1564\n20465,1001\n20466,1882\n20467,850\n20468,1955\n20469,1177\n20470,9001\n20471,1282\n20472,714\n20473,136\n20474,312\n20475,9029\n20476,4771\n20477,1572\n20478,1745\n20479,3474\n20480,1977\n20480,1978\n20481,406\n20482,932\n20483,483\n20483,718\n20484,760\n20487,372\n20487,1085\n20489,19519\n20490,2334\n20491,500\n20492,477\n20493,1429\n20494,50\n20494,146\n20494,779\n20494,2539\n20494,4617\n20494,20494\n20494,66534\n20494,92476\n20494,95513\n20494,141912\n20494,241560\n20494,242434\n20495,1803\n20496,1433\n20497,687\n20497,861\n20498,278\n20498,1511\n20498,3069\n20499,1118\n20500,209\n20501,4\n20501,5\n20501,146\n20501,328\n20501,907\n20501,1117\n20501,1167\n20501,1644\n20501,2089\n20501,2940\n20503,149\n20504,534\n20505,163\n20506,3804\n20507,509\n20507,536\n20507,8855\n20508,1673\n20509,390\n20509,918\n20509,1293\n20510,364\n20510,450\n20511,72\n20512,344\n20513,285\n20514,163\n20515,149\n20515,1368\n20516,10\n20517,604\n20518,2116\n20518,2353\n20519,222\n20519,390\n20519,589\n20519,1453\n20519,1949\n20519,5591\n20520,32\n20521,779\n20522,26\n20522,59\n20522,67397\n20523,19519\n20524,1033\n20524,1381\n20524,1551\n20524,1639\n20524,5440\n20525,1466\n20525,2989\n20525,2991\n20526,315\n20527,4222\n20527,8180\n20528,500\n20529,1607\n20530,743\n20530,23588\n20530,182001\n20531,72\n20532,344\n20533,285\n20535,390\n20535,782\n20535,1888\n20535,7155\n20535,20535\n20535,20763\n20535,31729\n20535,38783\n20535,92934\n20535,163388\n20536,392\n20537,136\n20538,163\n20539,163\n20539,209\n20539,440\n20539,447\n20539,163785\n20540,120\n20540,195\n20540,261\n20540,336\n20540,628\n20540,694\n20540,1353\n20540,1419\n20540,2574\n20540,5101\n20540,32751\n20541,3949\n20542,20543\n20544,264\n20544,338\n20544,467\n20544,652\n20544,872\n20544,1151\n20544,1659\n20544,1722\n20544,1893\n20544,2367\n20544,4039\n20544,229667\n20545,79\n20546,209\n20547,273\n20547,274\n20548,4355\n20549,440\n20549,1844\n20550,37\n20550,301\n20550,1782\n20551,178\n20553,2923\n20554,195\n20554,20032\n20554,20555\n20554,42185\n20556,392\n20556,1454\n20556,1722\n20557,106\n20557,1888\n20558,41\n20558,1419\n20559,192\n20559,579\n20559,1531\n20560,217\n20560,240\n20560,372\n20560,818\n20560,1085\n20561,387\n20562,163\n20563,1821\n20564,392\n20565,163\n20566,493\n20566,682\n20566,72439\n20567,20568\n20569,1151\n20570,147\n20570,158\n20570,195\n20570,206\n20571,328\n20572,433\n20573,22\n20573,207\n20573,919\n20574,143\n20575,615\n20575,873\n20575,932\n20575,972\n20575,1479\n20575,1740\n20575,1849\n20575,2480\n20575,2557\n20575,7956\n20576,34\n20576,35\n20577,202\n20577,203\n20578,1058\n20579,2051\n20580,206\n20581,20\n20582,1267\n20582,1579\n20582,2051\n20583,222\n20584,118\n20584,4597\n20585,571\n20586,126\n20586,372\n20586,422\n20586,483\n20586,589\n20586,788\n20586,992\n20586,1274\n20586,1298\n20586,1718\n20586,1871\n20586,13661\n20586,22293\n20587,1\n20587,50\n20587,622\n20587,862\n20588,149\n20588,406\n20589,72\n20589,312\n20590,1837\n20591,509\n20591,510\n20591,872\n20591,1043\n20591,150022\n20592,261\n20592,1119\n20592,1466\n20592,32751\n20593,1837\n20594,516\n20595,1392\n20596,104\n20596,631\n20596,784\n20596,805\n20597,167\n20597,73570\n20599,163\n20601,5250\n20602,58\n20602,222\n20602,278\n20602,644\n20602,702\n20602,873\n20602,1359\n20602,1571\n20602,1801\n20602,1881\n20602,6068\n20603,120\n20603,222\n20603,1019\n20604,248\n20604,772\n20606,660\n20608,1388\n20608,142430\n20608,142473\n20608,142879\n20609,240\n20609,1203\n20609,1955\n20610,83\n20611,346\n20611,435\n20612,107\n20613,264\n20613,467\n20613,868\n20613,1289\n20613,1551\n20613,2373\n20614,1\n20615,192\n20616,10\n20616,79\n20616,134\n20616,459\n20616,483\n20616,668\n20616,783\n20616,843\n20616,1400\n20616,1607\n20616,1837\n20616,1893\n20616,2373\n20616,21442\n20617,344\n20618,634\n20618,1531\n20620,72\n20621,1087\n20622,422\n20623,422\n20624,1082\n20624,1203\n20625,422\n20626,301\n20626,717\n20626,843\n20626,1231\n20626,1740\n20627,143\n20628,167\n20628,301\n20628,1231\n20628,2083\n20628,5662\n20628,73570\n20629,15\n20630,1977\n20630,1978\n20631,47\n20631,117\n20631,430\n20631,527\n20631,743\n20631,994\n20631,1254\n20631,1432\n20631,1983\n20631,2469\n20631,2712\n20631,4079\n20631,21944\n20631,31977\n20631,44244\n20631,54870\n20631,95152\n20631,194100\n20632,30\n20632,200\n20632,3623\n20633,187\n20634,422\n20636,388\n20636,2334\n20637,71\n20637,195\n20637,673\n20637,712\n20637,827\n20637,931\n20637,1172\n20637,1434\n20637,1556\n20637,1707\n20637,3623\n20637,14674\n20637,20757\n20637,21944\n20637,162599\n20638,718\n20639,422\n20640,422\n20641,422\n20642,640\n20642,1515\n20643,2292\n20643,2889\n20644,422\n20645,366\n20645,431\n20645,500\n20646,483\n20646,707\n20646,1127\n20646,1298\n20647,479\n20647,563\n20647,668\n20647,1010\n20647,1238\n20647,1267\n20647,1432\n20647,5469\n20647,13538\n20647,16687\n20648,2135\n20649,143\n20650,5308\n20651,1130\n20652,718\n20652,760\n20652,1149\n20652,1631\n20653,422\n20654,1927\n20655,5908\n20656,134\n20657,136\n20657,287\n20657,538\n20657,809\n20657,1634\n20657,5310\n20658,536\n20659,143\n20660,931\n20660,1509\n20661,326\n20662,50\n20663,408\n20663,801\n20663,1326\n20663,23437\n20665,392\n20666,1235\n20666,1247\n20667,626\n20668,973\n20668,1122\n20668,1849\n20668,32784\n20669,248\n20670,602\n20671,602\n20672,3\n20672,22\n20672,34\n20672,35\n20672,192\n20672,240\n20672,442\n20673,292\n20674,34\n20674,35\n20674,217\n20675,887\n20676,1287\n20676,5212\n20678,115\n20678,118\n20678,280\n20678,328\n20678,994\n20678,4597\n20678,17245\n20679,1085\n20680,149\n20681,1801\n20682,873\n20683,4611\n20684,1544\n20685,130\n20685,1893\n20686,120\n20686,259\n20686,577\n20686,788\n20686,1118\n20687,660\n20687,2646\n20688,3\n20688,1001\n20688,1326\n20688,1411\n20689,298\n20690,485\n20691,392\n20692,83\n20692,278\n20692,285\n20692,389\n20692,455\n20692,1274\n20692,1467\n20692,1718\n20692,1756\n20692,2553\n20692,2646\n20692,4172\n20692,28130\n20693,397\n20694,1776\n20694,1803\n20695,1345\n20696,1179\n20697,312\n20698,557\n20699,72\n20700,111\n20701,1149\n20702,872\n20702,1659\n20702,1893\n20703,86\n20703,207\n20703,675\n20703,698\n20704,973\n20705,875\n20706,309\n20706,310\n20707,119\n20708,1608\n20709,972\n20709,1559\n20710,143\n20711,309\n20711,310\n20712,346\n20712,393\n20712,538\n20712,4611\n20713,406\n20713,620\n20715,1179\n20716,392\n20716,3260\n20717,225\n20717,557\n20717,592\n20717,1332\n20717,1368\n20718,1001\n20719,1544\n20720,79\n20721,1276\n20723,8\n20723,34\n20723,35\n20723,136\n20723,137\n20723,222\n20723,313\n20723,349\n20723,1462\n20723,2224\n20723,2991\n20723,34006\n20724,255\n20724,1072\n20725,10\n20725,2574\n20726,79\n20727,143\n20728,1010\n20729,1179\n20730,907\n20730,932\n20731,586\n20732,2443\n20733,1127\n20734,10\n20734,240\n20734,349\n20734,415\n20734,444\n20734,687\n20734,827\n20734,868\n20734,1117\n20734,1313\n20734,1326\n20734,1607\n20734,1659\n20734,3135\n20734,4101\n20734,5726\n20734,81025\n20735,1368\n20737,63\n20737,163\n20737,489\n20738,182\n20738,192\n20738,202\n20738,1118\n20738,3538\n20739,392\n20740,3602\n20741,104\n20741,136\n20741,138\n20741,557\n20741,953\n20743,415\n20743,1454\n20744,406\n20745,50\n20745,79\n20745,147\n20745,158\n20746,171\n20747,120\n20747,222\n20747,240\n20747,261\n20747,392\n20747,657\n20747,694\n20747,818\n20747,1019\n20747,1436\n20747,2989\n20747,2991\n20747,6068\n20747,33508\n20748,1235\n20748,1335\n20749,104\n20749,557\n20749,852\n20749,953\n20750,5405\n20751,143\n20752,1181\n20753,485\n20754,143\n20755,171\n20756,301\n20756,615\n20756,1782\n20757,32\n20757,56\n20757,160\n20757,292\n20757,299\n20757,336\n20757,360\n20757,467\n20757,505\n20757,604\n20757,818\n20757,875\n20757,929\n20757,1033\n20757,1087\n20757,1147\n20757,1293\n20757,1345\n20757,1434\n20757,1796\n20757,2496\n20757,5192\n20757,28571\n20757,41548\n20757,52922\n20757,60116\n20757,162599\n20757,183335\n20757,224519\n20757,245201\n20757,245343\n20757,264449\n20758,2353\n20759,58\n20760,366\n20761,2867\n20761,2868\n20761,22880\n20762,143\n20763,640\n20763,9005\n20763,20535\n20764,217\n20764,779\n20764,920\n20764,1033\n20764,1181\n20765,694\n20765,20790\n20766,158\n20767,3507\n20768,309\n20768,310\n20769,999\n20770,20771\n20771,2159\n20772,852\n20772,1247\n20772,164572\n20773,1544\n20774,994\n20775,1511\n20775,3069\n20776,1227\n20776,1229\n20776,86416\n20777,28107\n20778,344\n20779,22\n20779,809\n20779,861\n20779,2017\n20780,306\n20780,307\n20780,682\n20780,1181\n20780,72439\n20781,104\n20781,134\n20781,1939\n20782,1133\n20783,83\n20783,285\n20783,455\n20783,1756\n20783,2784\n20783,28130\n20784,83\n20784,278\n20784,285\n20784,455\n20784,1718\n20784,1756\n20784,2553\n20784,2784\n20784,28130\n20785,1458\n20786,66\n20786,868\n20787,68\n20787,104\n20787,431\n20787,1119\n20787,1282\n20787,1285\n20787,1462\n20787,1659\n20787,2089\n20787,2205\n20787,2286\n20787,2940\n20787,4771\n20787,8537\n20787,33424\n20788,302\n20788,392\n20788,1014\n20789,693\n20791,1082\n20792,192\n20792,685\n20792,1118\n20792,1566\n20792,6837\n20793,143\n20793,1052\n20794,687\n20796,388\n20796,440\n20797,195\n20797,306\n20797,307\n20797,406\n20797,779\n20797,1181\n20797,1515\n20798,302\n20798,809\n20800,602\n20800,620\n20801,968\n20801,1001\n20802,557\n20802,954\n20802,1939\n20802,5405\n20802,10318\n20803,68\n20803,301\n20803,372\n20803,599\n20803,852\n20803,872\n20803,972\n20803,1010\n20803,1085\n20803,1309\n20803,1782\n20804,687\n20805,515\n20806,861\n20807,1551\n20808,5440\n20809,850\n20809,3209\n20810,240\n20811,968\n20812,20813\n20814,58\n20815,46\n20816,1085\n20817,247\n20818,2775\n20819,447\n20820,392\n20820,697\n20821,2646\n20822,1019\n20823,332\n20824,302\n20824,1370\n20824,2116\n20825,222\n20826,588\n20826,590\n20826,929\n20827,158\n20827,1181\n20828,887\n20828,994\n20828,1235\n20828,1335\n20829,4678\n20830,3260\n20831,273\n20831,274\n20832,579\n20833,1\n20834,862\n20835,420\n20836,3\n20837,323\n20838,393\n20838,3148\n20839,158\n20840,1359\n20841,1052\n20842,5405\n20843,503\n20843,932\n20844,393\n20844,980\n20845,158\n20846,151\n20847,657\n20848,1433\n20849,1072\n20850,104\n20850,557\n20850,953\n20850,954\n20850,1939\n20851,264\n20852,389\n20853,994\n20855,626\n20856,392\n20857,875\n20858,596\n20858,660\n20858,784\n20858,811\n20858,1052\n20858,1368\n20859,872\n20860,392\n20861,2626\n20862,1127\n20863,255\n20864,158\n20865,387\n20866,247\n20867,20868\n20867,21068\n20867,25875\n20867,31448\n20867,39904\n20867,53304\n20867,58039\n20867,63515\n20867,68069\n20867,72251\n20867,80322\n20867,100143\n20867,105531\n20867,110251\n20869,714\n20870,347\n20871,862\n20872,248\n20872,450\n20872,1332\n20873,467\n20873,868\n20873,156379\n20873,162599\n20873,221278\n20874,1773\n20875,536\n20875,18831\n20876,2775\n20876,3115\n20877,171\n20878,252\n20878,516\n20878,1220\n20878,1222\n20878,41170\n20879,272\n20879,563\n20879,980\n20879,2353\n20879,2367\n20880,240\n20880,289\n20880,290\n20880,417\n20880,631\n20880,704\n20880,714\n20880,1085\n20880,1285\n20880,1392\n20880,1511\n20880,1631\n20880,1785\n20880,2205\n20880,2286\n20880,3069\n20880,33424\n20880,94134\n20881,72\n20882,44\n20883,2051\n20883,49057\n20884,72\n20885,19519\n20887,171\n20888,422\n20889,56\n20891,934\n20892,302\n20892,1433\n20893,310\n20893,2782\n20893,3039\n20894,58\n20895,83\n20897,146\n20898,575\n20898,697\n20899,104\n20899,254\n20899,557\n20899,1939\n20901,83\n20902,30\n20903,1623\n20904,163\n20905,312\n20906,718\n20907,111\n20907,240\n20907,805\n20908,1673\n20909,1133\n20910,301\n20911,20912\n20911,38044\n20911,40492\n20911,45906\n20911,46598\n20911,46607\n20911,79181\n20911,85679\n20913,1\n20914,20912\n20915,392\n20916,493\n20917,106\n20917,190492\n20918,20919\n20920,20919\n20921,20919\n20921,109236\n20921,184173\n20922,184\n20923,346\n20923,516\n20923,1243\n20924,20925\n20927,20928\n20927,99353\n20929,160\n20930,72\n20931,202\n20931,203\n20932,1566\n20933,184\n20933,2867\n20933,2868\n20934,1871\n20935,389\n20936,713\n20937,346\n20938,417\n20939,248\n20940,135\n20941,20941\n20942,158\n20942,406\n20942,4192\n20942,4193\n20943,255\n20944,20945\n20944,103590\n20944,107315\n20944,108492\n20946,631\n20947,68\n20947,240\n20948,6179\n20948,6180\n20948,8675\n20949,1287\n20949,9030\n20950,435\n20951,4193\n20951,20912\n20951,29474\n20951,30204\n20951,32421\n20951,53098\n20951,79804\n20951,85301\n20952,406\n20953,20954\n20955,346\n20956,586\n20957,309\n20957,310\n20958,850\n20959,473\n20959,8149\n20960,10\n20961,5101\n20962,83\n20963,586\n20964,20965\n20964,32417\n20966,160\n20966,264\n20966,649\n20966,1007\n20966,1289\n20966,1579\n20966,1893\n20967,273\n20967,274\n20968,623\n20968,1805\n20969,346\n20971,346\n20972,247\n20973,697\n20974,15119\n20975,4611\n20976,1544\n20977,5405\n20978,346\n20979,4810\n20980,143\n20981,503\n20982,56\n20982,192\n20982,273\n20982,274\n20982,805\n20982,4220\n20982,60576\n20983,20984\n20985,535\n20986,631\n20987,217\n20987,536\n20988,2421\n20989,1096\n20990,1332\n20991,1556\n20992,217\n20992,366\n20992,1433\n20993,4678\n20994,626\n20995,557\n20996,557\n20997,931\n20998,1118\n20999,240\n21000,4823\n21001,500\n21001,718\n21001,893\n21001,14458\n21002,21003\n21004,3538\n21005,149\n21006,885\n21007,1927\n21008,184\n21009,389\n21010,302\n21011,422\n21012,56\n21013,272\n21013,795\n21013,934\n21013,1070\n21013,1612\n21014,302\n21015,217\n21015,477\n21015,536\n21015,781\n21015,2168\n21015,7698\n21016,1571\n21017,21018\n21019,1127\n21020,83\n21020,660\n21021,818\n21022,278\n21022,843\n21023,862\n21025,1227\n21025,1229\n21025,86416\n21026,1844\n21027,21028\n21027,47483\n21027,102065\n21027,202264\n21029,10\n21030,21031\n21032,1319\n21033,19519\n21034,968\n21035,171\n21036,450\n21037,54\n21038,21039\n21040,6051\n21041,602\n21042,994\n21043,21044\n21045,32\n21046,21047\n21048,707\n21048,827\n21049,30\n21049,1266\n21050,292\n21051,589\n21051,1001\n21052,2590\n21053,602\n21054,19519\n21055,636\n21056,602\n21057,83\n21058,4\n21058,5\n21058,21059\n21060,46\n21060,58\n21061,10\n21062,269\n21063,184\n21064,1181\n21065,21066\n21067,1287\n21069,9029\n21070,72\n21071,2775\n21072,202\n21072,203\n21073,21074\n21075,21074\n21076,21074\n21077,149\n21078,158\n21079,640\n21080,147\n21081,30\n21081,202\n21081,251\n21081,328\n21081,431\n21081,440\n21081,516\n21081,622\n21081,1033\n21081,1235\n21081,1335\n21081,9005\n21082,147\n21083,175\n21083,3111\n21083,4980\n21088,1001\n21089,151\n21090,163\n21091,10\n21091,13345\n21092,147\n21092,333\n21093,346\n21094,346\n21095,720\n21095,907\n21095,972\n21095,1284\n21095,2191\n21096,1634\n21097,1821\n21098,1175\n21099,758\n21100,104\n21101,104\n21101,134\n21101,254\n21101,557\n21101,953\n21101,954\n21101,2105\n21102,195\n21103,21104\n21106,1531\n21107,2590\n21108,493\n21109,772\n21110,182\n21110,188\n21110,7652\n21112,158\n21113,3161\n21114,862\n21114,5911\n21115,392\n21116,422\n21117,56\n21118,366\n21119,366\n21120,366\n21121,1515\n21122,366\n21123,206\n21124,366\n21125,366\n21126,366\n21127,1010\n21128,1544\n21129,21130\n21129,54069\n21129,75553\n21129,86816\n21129,92503\n21131,269\n21132,671\n21133,366\n21133,3538\n21134,1\n21134,149\n21134,356\n21134,859\n21134,2089\n21134,2940\n21134,3069\n21134,21944\n21135,72\n21136,99\n21137,376\n21138,1235\n21138,1335\n21139,809\n21139,19010\n21140,673\n21141,298\n21142,485\n21143,515\n21144,1191\n21145,21146\n21147,1284\n21148,422\n21149,56\n21150,215\n21150,233\n21150,240\n21150,289\n21150,290\n21150,372\n21150,503\n21150,592\n21150,631\n21150,714\n21150,760\n21150,805\n21150,932\n21150,1016\n21150,1085\n21150,1282\n21150,1285\n21150,1309\n21150,1462\n21150,1564\n21150,1631\n21150,1785\n21150,1818\n21150,1955\n21150,2205\n21150,2286\n21150,2296\n21150,2443\n21150,2620\n21150,3328\n21150,5718\n21150,8537\n21150,33424\n21150,144988\n21151,390\n21152,344\n21152,671\n21152,685\n21152,827\n21152,849\n21152,1381\n21153,163\n21154,104\n21154,134\n21154,135\n21154,136\n21154,137\n21154,138\n21154,557\n21154,850\n21154,1368\n21154,1939\n21154,2105\n21155,233\n21156,200\n21156,2712\n21157,117\n21159,1388\n21159,35486\n21160,171\n21161,515\n21162,184\n21162,685\n21162,849\n21162,1623\n21163,261\n21165,21166\n21167,911\n21168,1370\n21169,206\n21170,694\n21171,14483\n21172,781\n21173,599\n21173,818\n21175,3297\n21176,211\n21176,1551\n21177,1133\n21178,3451\n21178,3452\n21179,209\n21180,644\n21182,388\n21182,588\n21182,590\n21182,907\n21185,422\n21186,56\n21187,714\n21187,760\n21188,3182\n21189,647\n21190,344\n21191,171\n21192,887\n21193,604\n21195,422\n21196,56\n21197,298\n21198,485\n21199,151\n21200,2784\n21200,13538\n21200,18738\n21201,392\n21202,106\n21202,1019\n21203,151\n21204,6803\n21206,187\n21208,48\n21209,1559\n21210,251\n21211,862\n21212,657\n21213,309\n21213,310\n21213,1400\n21213,2915\n21214,1122\n21215,298\n21216,485\n21217,1803\n21218,292\n21218,579\n21218,1070\n21219,422\n21220,366\n21221,323\n21222,911\n21223,306\n21223,307\n21225,255\n21228,467\n21229,2744\n21229,3089\n21230,299\n21230,783\n21230,2083\n21231,868\n21232,54\n21232,278\n21232,304\n21232,577\n21232,589\n21232,626\n21232,932\n21232,1151\n21232,1175\n21232,1212\n21232,1289\n21232,1298\n21232,1309\n21232,1479\n21232,1634\n21232,1871\n21232,2421\n21232,3507\n21232,3585\n21232,9015\n21232,14483\n21233,657\n21233,1019\n21234,298\n21235,485\n21236,248\n21237,146\n21238,503\n21241,312\n21241,1140\n21243,415\n21243,1454\n21243,3474\n21244,1634\n21245,392\n21245,644\n21245,1001\n21245,1363\n21245,1805\n21245,199253\n21246,140\n21246,1893\n21246,2051\n21246,81070\n21247,859\n21249,536\n21249,720\n21249,877\n21249,937\n21249,1117\n21249,2266\n21249,7698\n21249,124668\n21250,292\n21251,640\n21252,163\n21253,283\n21253,503\n21253,118336\n21254,135\n21256,305\n21257,1113\n21258,21259\n21261,21262\n21261,35406\n21261,54078\n21261,56046\n21261,101837\n21264,929\n21264,1370\n21265,283\n21266,2416\n21266,2417\n21267,1\n21267,20\n21267,32\n21267,68\n21267,120\n21267,178\n21267,269\n21267,292\n21267,360\n21267,387\n21267,388\n21267,483\n21267,710\n21267,784\n21267,893\n21267,1204\n21267,1241\n21267,1294\n21267,1345\n21267,1425\n21267,2083\n21267,2735\n21267,2923\n21267,8308\n21267,81070\n21269,167\n21269,299\n21269,2083\n21270,360\n21270,81070\n21271,146\n21272,634\n21273,143\n21274,21275\n21276,4355\n21277,505\n21279,1085\n21280,996\n21281,920\n21281,1623\n21282,151\n21282,182\n21282,440\n21282,489\n21282,1844\n21283,1566\n21284,209\n21285,143\n21287,1011\n21288,1424\n21289,2557\n21290,1\n21290,289\n21290,290\n21290,332\n21290,1807\n21290,94134\n21291,985\n21293,182\n21293,188\n21293,202\n21293,203\n21293,1844\n21294,934\n21294,16614\n21295,1204\n21295,4831\n21295,75912\n21297,312\n21297,1267\n21297,1659\n21298,137\n21299,1635\n21300,424\n21300,3148\n21301,1323\n21302,102\n21303,1326\n21304,408\n21305,21306\n21307,500\n21308,1962\n21309,1052\n21310,1882\n21311,2775\n21312,54\n21313,2210\n21313,4237\n21314,6750\n21315,278\n21316,1127\n21317,392\n21318,217\n21319,1803\n21320,83\n21322,1877\n21323,980\n21324,397\n21324,1623\n21324,8149\n21325,298\n21326,485\n21327,143\n21329,56\n21330,107\n21331,604\n21332,272\n21333,586\n21334,1072\n21334,3538\n21335,195\n21335,1181\n21336,19519\n21337,287\n21338,1220\n21338,1222\n21339,252\n21340,251\n21341,5405\n21342,178\n21343,1400\n21343,40360\n21344,647\n21345,344\n21346,178\n21347,302\n21348,1749\n21349,346\n21349,596\n21349,1010\n21349,1368\n21350,192\n21350,663\n21350,664\n21351,287\n21352,309\n21352,310\n21352,794\n21353,30\n21354,86\n21354,264\n21354,467\n21354,599\n21354,1433\n21355,1659\n21356,999\n21357,309\n21357,310\n21357,859\n21358,21359\n21360,2051\n21361,1425\n21362,775\n21363,21364\n21365,302\n21366,415\n21366,818\n21366,1454\n21366,13137\n21366,27041\n21367,2867\n21367,2868\n21367,22880\n21368,1220\n21368,1222\n21369,252\n21370,251\n21371,338\n21371,8149\n21373,81\n21374,94\n21374,2787\n21375,3260\n21376,647\n21377,344\n21378,111\n21379,809\n21380,595\n21380,1454\n21380,2699\n21380,3258\n21380,21982\n21381,455\n21381,2266\n21382,1267\n21382,1370\n21382,21982\n21383,340\n21384,1119\n21385,195\n21386,146\n21386,151\n21386,272\n21386,850\n21386,2367\n21387,1370\n21388,875\n21389,4\n21389,5\n21389,527\n21389,743\n21389,8714\n21390,481\n21391,146\n21392,932\n21393,3\n21393,605\n21393,19010\n21394,336\n21394,5726\n21394,60576\n21395,442\n21395,1001\n21396,3\n21396,907\n21397,2867\n21397,2868\n21398,1179\n21399,1454\n21400,312\n21400,358\n21400,525\n21401,682\n21401,72439\n21402,920\n21402,8854\n21403,340\n21404,424\n21404,6059\n21406,3804\n21407,21408\n21409,66\n21409,252\n21409,516\n21409,571\n21409,868\n21410,459\n21411,264\n21411,278\n21411,301\n21411,697\n21411,760\n21411,818\n21411,1962\n21411,2319\n21411,2979\n21411,3744\n21412,1167\n21413,65\n21413,868\n21413,1433\n21414,34\n21414,35\n21414,186\n21414,217\n21414,222\n21414,455\n21414,536\n21414,589\n21414,891\n21414,1019\n21414,1085\n21414,1274\n21414,2784\n21414,13137\n21415,1007\n21416,202\n21416,203\n21416,760\n21417,83\n21418,209\n21419,1181\n21420,240\n21421,859\n21422,818\n21422,2116\n21422,3769\n21424,1070\n21424,2837\n21425,119\n21425,178\n21425,209\n21425,577\n21425,622\n21425,929\n21425,1400\n21425,2073\n21425,21944\n21425,63502\n21426,424\n21428,781\n21430,5366\n21431,160\n21432,1556\n21433,1511\n21433,3069\n21434,1070\n21435,1512\n21435,2867\n21435,2868\n21435,5992\n21435,213089\n21435,221828\n21435,227376\n21437,726\n21437,859\n21438,859\n21439,163\n21440,1551\n21440,3041\n21441,21442\n21442,1\n21442,79\n21442,146\n21442,147\n21442,149\n21442,158\n21442,171\n21442,178\n21442,202\n21442,285\n21442,314\n21442,333\n21442,336\n21442,397\n21442,406\n21442,435\n21442,505\n21442,602\n21442,673\n21442,676\n21442,685\n21442,779\n21442,843\n21442,903\n21442,972\n21442,1011\n21442,1087\n21442,1118\n21442,1130\n21442,1181\n21442,1294\n21442,1425\n21442,1458\n21442,1464\n21442,1502\n21442,1515\n21442,1518\n21442,1566\n21442,1572\n21442,1603\n21442,1776\n21442,1803\n21442,1877\n21442,1940\n21442,2102\n21442,2353\n21442,2373\n21442,2418\n21442,2427\n21442,2460\n21442,2652\n21442,2792\n21442,3813\n21442,4102\n21442,4684\n21442,5118\n21442,6622\n21442,8433\n21442,9394\n21442,14428\n21442,15439\n21442,19191\n21442,19854\n21442,21442\n21442,23890\n21442,23903\n21442,23920\n21442,23941\n21442,23957\n21442,23983\n21442,24002\n21442,24007\n21442,24023\n21442,24051\n21442,24061\n21442,24095\n21442,24113\n21442,24129\n21442,24147\n21442,24153\n21442,24161\n21442,25426\n21442,26053\n21442,26450\n21442,26736\n21442,28282\n21442,30035\n21442,31222\n21442,32791\n21442,39643\n21442,48235\n21442,48364\n21442,54234\n21442,54958\n21442,59020\n21442,60855\n21442,62265\n21442,64572\n21442,68183\n21442,81971\n21442,85909\n21442,85979\n21442,89021\n21442,92476\n21442,93860\n21442,109131\n21442,109369\n21442,114954\n21442,117966\n21442,117974\n21442,118336\n21442,119438\n21442,120155\n21442,128143\n21442,130027\n21442,131211\n21442,141912\n21442,142749\n21442,143374\n21442,143387\n21442,144892\n21442,145047\n21442,146282\n21442,149998\n21442,150090\n21442,150666\n21442,151028\n21442,152141\n21442,154480\n21442,154733\n21442,154986\n21442,154990\n21442,155431\n21442,155441\n21442,155662\n21442,157336\n21442,157454\n21442,157666\n21442,160250\n21442,160698\n21442,161987\n21442,163422\n21442,163425\n21442,164980\n21442,168430\n21442,168446\n21442,168823\n21442,169311\n21442,169400\n21442,170000\n21442,170149\n21442,170562\n21442,170612\n21442,170650\n21442,171592\n21442,171647\n21442,171734\n21442,173316\n21442,176407\n21442,176545\n21442,176823\n21442,176961\n21442,177356\n21442,180336\n21442,181860\n21442,181896\n21442,183833\n21442,190254\n21442,191136\n21442,194508\n21442,195024\n21442,195171\n21442,195506\n21442,195512\n21442,195543\n21442,195554\n21442,197609\n21442,204103\n21442,205422\n21442,207659\n21442,207666\n21442,213913\n21442,215874\n21442,220502\n21442,221747\n21442,221812\n21442,221816\n21442,222251\n21442,224502\n21442,224577\n21442,229836\n21442,232138\n21442,232760\n21442,232795\n21442,234148\n21442,236469\n21442,236787\n21442,238340\n21442,240173\n21442,240174\n21442,241557\n21442,241694\n21442,244738\n21442,244986\n21442,245004\n21442,245318\n21442,247210\n21442,249757\n21442,249758\n21442,249770\n21442,250648\n21442,250676\n21442,257991\n21442,258115\n21442,258206\n21442,258796\n21442,258905\n21442,259302\n21442,260807\n21442,262349\n21442,263178\n21443,21444\n21443,51279\n21443,86120\n21445,278\n21446,206\n21446,7652\n21447,143\n21448,22\n21448,163\n21448,259\n21448,809\n21448,2017\n21449,222\n21449,289\n21449,290\n21449,332\n21449,636\n21449,1807\n21449,6424\n21449,94134\n21450,83\n21450,217\n21450,278\n21450,455\n21450,1019\n21450,1467\n21450,3409\n21450,7572\n21450,8788\n21450,8855\n21451,422\n21453,980\n21454,269\n21455,1033\n21456,163\n21457,292\n21458,1707\n21458,2411\n21458,6837\n21459,941\n21459,972\n21460,202\n21460,203\n21461,111\n21462,673\n21463,525\n21464,306\n21464,307\n21465,1707\n21466,710\n21467,313\n21468,609\n21469,1715\n21470,163\n21471,775\n21472,1454\n21474,163\n21475,500\n21476,1962\n21477,1052\n21478,1882\n21479,2775\n21480,54\n21481,2210\n21481,4237\n21482,217\n21483,1977\n21483,1978\n21484,527\n21485,406\n21486,21487\n21488,240\n21488,435\n21488,536\n21488,1001\n21488,1284\n21489,222\n21490,143\n21491,3\n21492,163\n21493,1425\n21495,1016\n21495,2205\n21495,2206\n21495,33424\n21495,245910\n21496,163\n21497,849\n21497,1844\n21498,298\n21499,485\n21501,1655\n21502,3467\n21503,56\n21503,192\n21503,422\n21503,30331\n21503,60576\n21504,1326\n21504,2995\n21505,422\n21506,50\n21506,149\n21506,333\n21506,406\n21506,622\n21507,5591\n21508,5405\n21509,422\n21510,818\n21510,2989\n21510,2991\n21511,422\n21512,422\n21513,422\n21514,264\n21514,736\n21515,536\n21516,1655\n21517,34\n21517,35\n21517,920\n21518,586\n21519,222\n21519,515\n21520,163\n21521,626\n21521,1140\n21521,1151\n21522,77\n21522,1392\n21522,1659\n21522,2367\n21522,5405\n21523,21524\n21526,247\n21527,1983\n21528,192\n21528,337\n21528,493\n21528,663\n21528,682\n21528,1181\n21528,1293\n21528,1985\n21528,3507\n21528,59021\n21528,72439\n21528,189839\n21529,21530\n21529,54887\n21531,1\n21532,292\n21533,134\n21533,137\n21534,422\n21535,56\n21536,364\n21537,72\n21538,151\n21539,292\n21540,467\n21540,868\n21540,1433\n21540,156379\n21540,162599\n21541,760\n21542,631\n21542,805\n21542,1085\n21542,1466\n21543,1509\n21544,1127\n21544,2051\n21544,49057\n21545,364\n21546,581\n21547,240\n21547,392\n21547,467\n21547,818\n21548,222\n21549,1010\n21550,9743\n21551,718\n21552,760\n21552,788\n21552,862\n21552,991\n21553,21408\n21554,579\n21554,861\n21554,1556\n21554,63471\n21555,422\n21556,56\n21557,30\n21557,137\n21557,225\n21557,772\n21557,1332\n21558,34\n21558,35\n21559,885\n21559,887\n21559,994\n21559,1235\n21559,1335\n21560,1506\n21561,222\n21561,283\n21561,455\n21561,1019\n21562,663\n21562,664\n21563,34\n21563,35\n21563,65\n21563,66\n21563,83\n21563,120\n21563,202\n21563,203\n21563,217\n21563,278\n21563,314\n21563,326\n21563,383\n21563,388\n21563,392\n21563,431\n21563,455\n21563,467\n21563,536\n21563,571\n21563,577\n21563,599\n21563,694\n21563,697\n21563,752\n21563,868\n21563,918\n21563,949\n21563,1019\n21563,1118\n21563,1140\n21563,1181\n21563,1210\n21563,1417\n21563,1433\n21563,1454\n21563,1623\n21563,1715\n21563,1782\n21563,1837\n21563,1844\n21563,2671\n21563,2979\n21563,3623\n21563,8192\n21563,136014\n21563,141912\n21564,1707\n21566,417\n21567,10\n21568,852\n21570,422\n21571,56\n21572,158\n21572,406\n21573,163\n21574,312\n21575,710\n21576,392\n21577,34\n21577,35\n21579,292\n21580,240\n21581,298\n21582,485\n21583,536\n21584,314\n21584,336\n21584,852\n21584,1011\n21584,5726\n21585,298\n21586,485\n21587,557\n21587,954\n21587,1939\n21588,372\n21588,788\n21590,1172\n21591,41\n21591,134\n21591,850\n21591,1001\n21592,7698\n21592,204093\n21593,347\n21593,356\n21593,1955\n21594,34\n21594,1235\n21594,1411\n21594,1715\n21594,3804\n21594,15807\n21595,525\n21596,81\n21597,1767\n21598,184\n21599,1801\n21600,143\n21601,1\n21601,160\n21601,358\n21601,1118\n21602,805\n21602,21603\n21604,118\n21604,4597\n21605,192\n21606,147\n21606,184\n21606,358\n21606,2244\n21606,14434\n21607,328\n21607,509\n21607,622\n21607,991\n21607,1033\n21607,1133\n21607,1326\n21607,1749\n21607,2334\n21607,3367\n21607,205488\n21608,104\n21608,557\n21608,953\n21608,954\n21608,1939\n21609,143\n21610,344\n21610,827\n21611,292\n21612,192\n21612,202\n21612,203\n21612,222\n21612,333\n21612,1181\n21612,2266\n21613,34\n21613,35\n21613,83\n21613,158\n21613,217\n21613,536\n21613,660\n21613,852\n21613,1133\n21613,1274\n21613,1466\n21613,4637\n21613,7092\n21614,4\n21614,5\n21614,1984\n21615,1127\n21616,717\n21617,611\n21618,149\n21619,10\n21619,113156\n21620,1085\n21621,518\n21622,34\n21622,35\n21622,2209\n21623,336\n21623,5726\n21624,344\n21625,272\n21625,1370\n21627,393\n21627,980\n21628,143\n21629,516\n21630,83\n21630,273\n21630,274\n21630,313\n21630,859\n21630,920\n21630,1146\n21630,1400\n21630,2424\n21631,247\n21632,302\n21633,248\n21633,5405\n21634,1370\n21635,1181\n21636,660\n21637,298\n21638,485\n21639,120\n21639,222\n21639,1860\n21639,6955\n21640,72\n21641,160\n21642,344\n21643,163\n21643,579\n21644,149\n21645,4220\n21646,9239\n21647,557\n21647,2607\n21647,3209\n21648,1531\n21649,34\n21649,35\n21649,134\n21649,146\n21649,167\n21649,272\n21649,346\n21649,372\n21649,525\n21649,640\n21649,673\n21649,714\n21649,1149\n21649,1210\n21649,1220\n21649,1222\n21649,1285\n21649,1374\n21649,1467\n21649,1572\n21649,1776\n21649,1782\n21649,2073\n21649,2209\n21649,2266\n21649,2671\n21649,2697\n21649,2782\n21649,3129\n21649,3345\n21649,3744\n21649,5718\n21649,6888\n21649,7124\n21649,7270\n21649,7360\n21649,8180\n21649,21650\n21649,21687\n21649,21716\n21651,2837\n21652,1590\n21653,422\n21653,3474\n21654,1590\n21654,1644\n21655,376\n21656,1801\n21656,3182\n21657,259\n21658,302\n21659,1007\n21660,1181\n21661,107\n21662,158\n21663,83\n21663,292\n21663,399\n21663,1210\n21663,2353\n21664,1222\n21664,1512\n21665,309\n21665,310\n21665,344\n21665,489\n21665,631\n21665,749\n21665,841\n21665,849\n21665,1436\n21665,1844\n21665,2334\n21665,6424\n21665,227376\n21666,500\n21667,328\n21668,491\n21668,788\n21668,801\n21668,1559\n21668,1639\n21668,3695\n21669,104\n21670,143\n21671,151\n21672,160\n21673,289\n21673,290\n21674,247\n21675,149\n21676,140\n21677,349\n21677,1019\n21679,3148\n21680,4831\n21681,2205\n21681,2206\n21682,158\n21683,68\n21683,4220\n21684,20359\n21685,406\n21686,1707\n21688,219\n21689,298\n21690,485\n21691,338\n21691,852\n21692,251\n21692,493\n21692,516\n21692,920\n21692,1363\n21692,1454\n21692,1836\n21692,1983\n21692,3804\n21694,3507\n21695,527\n21695,743\n21695,4810\n21695,8714\n21696,302\n21697,83\n21698,3138\n21699,338\n21700,392\n21701,37\n21701,86\n21701,167\n21701,301\n21701,615\n21701,968\n21701,1293\n21701,1837\n21702,366\n21703,48\n21703,305\n21703,611\n21703,712\n21703,1572\n21703,1612\n21703,1707\n21703,1821\n21703,1849\n21703,1881\n21703,2512\n21704,147\n21705,338\n21706,202\n21706,493\n21706,1085\n21706,1243\n21707,1363\n21708,86\n21709,2209\n21709,4411\n21709,21711\n21710,972\n21710,1014\n21712,775\n21713,364\n21714,1381\n21715,861\n21717,4252\n21719,205\n21720,120\n21721,1085\n21722,143\n21723,1707\n21724,536\n21724,2797\n21725,805\n21726,1849\n21727,280\n21727,393\n21727,980\n21728,302\n21729,827\n21729,1058\n21731,1893\n21732,163\n21732,209\n21732,262\n21732,302\n21732,312\n21732,467\n21732,579\n21732,622\n21732,647\n21732,687\n21732,760\n21732,811\n21732,893\n21732,991\n21732,1556\n21732,2116\n21732,2605\n21732,19005\n21732,220502\n21733,278\n21733,389\n21733,19443\n21734,72\n21735,2286\n21736,280\n21736,393\n21736,980\n21736,1370\n21736,1821\n21736,2782\n21736,17245\n21736,21736\n21737,1282\n21738,247\n21740,21741\n21740,100303\n21740,109723\n21740,128633\n21742,10\n21742,298\n21742,417\n21742,534\n21742,1001\n21742,1085\n21742,2296\n21742,2572\n21742,6068\n21743,1579\n21744,44\n21745,340\n21746,30\n21746,328\n21746,1179\n21747,192\n21747,932\n21747,1479\n21747,7956\n21748,247\n21749,644\n21750,5405\n21751,50\n21752,2779\n21753,1298\n21754,1724\n21755,626\n21756,21757\n21758,859\n21759,222\n21760,1414\n21761,250\n21762,72\n21763,240\n21764,72\n21765,37\n21766,205\n21767,21768\n21769,577\n21769,1105\n21769,1298\n21770,1893\n21770,4294\n21771,225\n21772,957\n21772,1815\n21773,3193\n21774,72\n21775,72\n21776,72\n21777,1608\n21778,4903\n21780,21781\n21782,22\n21782,599\n21783,1326\n21784,563\n21785,1235\n21785,1335\n21786,258\n21787,626\n21788,781\n21789,34\n21789,35\n21790,4222\n21791,26\n21791,59\n21792,1551\n21793,536\n21794,30\n21795,3\n21795,34\n21795,35\n21795,50\n21795,58\n21795,86\n21795,87\n21795,104\n21795,106\n21795,134\n21795,135\n21795,136\n21795,137\n21795,167\n21795,209\n21795,217\n21795,227\n21795,247\n21795,251\n21795,252\n21795,254\n21795,269\n21795,285\n21795,289\n21795,290\n21795,328\n21795,332\n21795,333\n21795,364\n21795,392\n21795,393\n21795,420\n21795,433\n21795,515\n21795,516\n21795,536\n21795,538\n21795,557\n21795,589\n21795,596\n21795,631\n21795,636\n21795,644\n21795,720\n21795,749\n21795,779\n21795,795\n21795,850\n21795,877\n21795,907\n21795,968\n21795,1001\n21795,1007\n21795,1010\n21795,1085\n21795,1179\n21795,1241\n21795,1265\n21795,1266\n21795,1363\n21795,1368\n21795,1381\n21795,1453\n21795,1522\n21795,1544\n21795,1715\n21795,1818\n21795,1837\n21795,1939\n21795,1955\n21795,2083\n21795,2105\n21795,2191\n21795,2379\n21795,2620\n21795,2931\n21795,2979\n21795,3003\n21795,3328\n21795,3474\n21795,4355\n21795,4545\n21795,5405\n21795,5718\n21795,6119\n21795,6803\n21795,41170\n21795,94134\n21795,139010\n21796,1289\n21797,920\n21798,217\n21799,192\n21800,811\n21801,278\n21802,21803\n21802,31888\n21804,184\n21805,1\n21806,158\n21806,620\n21806,1181\n21806,2244\n21807,72\n21808,872\n21809,5405\n21810,808\n21811,313\n21812,83\n21813,781\n21814,1837\n21815,344\n21816,2105\n21817,1522\n21817,1955\n21817,2083\n21817,5301\n21818,557\n21819,557\n21820,1707\n21821,5101\n21822,328\n21823,111\n21823,178\n21823,346\n21823,516\n21823,631\n21823,1033\n21823,1181\n21823,1265\n21823,1266\n21823,1531\n21823,3872\n21824,15119\n21825,217\n21825,222\n21825,1417\n21827,1458\n21827,2231\n21827,4933\n21827,15439\n21827,21828\n21827,28108\n21827,37854\n21829,3507\n21830,388\n21831,9098\n21832,211\n21832,269\n21832,1014\n21833,171\n21834,233\n21835,1289\n21836,602\n21837,1803\n21838,346\n21839,21840\n21839,33198\n21839,37923\n21839,48837\n21839,52521\n21841,2411\n21842,2205\n21842,2206\n21842,33424\n21843,298\n21844,485\n21845,298\n21846,485\n21847,3\n21848,289\n21848,290\n21849,1871\n21849,5906\n21850,1019\n21852,163\n21852,209\n21852,302\n21853,1247\n21853,164572\n21854,2506\n21855,657\n21856,8373\n21857,4344\n21858,21859\n21860,843\n21861,2681\n21861,31977\n21861,44570\n21862,175\n21862,2681\n21862,31977\n21862,99010\n21862,100085\n21862,121933\n21862,125770\n21862,171770\n21862,175788\n21862,178367\n21863,493\n21863,586\n21863,1265\n21863,1266\n21864,65\n21865,30\n21865,328\n21865,1179\n21866,1837\n21867,805\n21867,1119\n21867,2105\n21867,4220\n21867,66297\n21867,172012\n21868,30\n21869,72\n21870,79\n21871,723\n21872,1888\n21873,240\n21874,1623\n21875,5906\n21876,298\n21877,485\n21878,431\n21879,1608\n21880,130\n21881,264\n21881,1289\n21882,493\n21882,586\n21882,1243\n21882,1265\n21882,1266\n21883,417\n21884,392\n21885,602\n21886,68\n21887,602\n21889,1188\n21890,21891\n21892,21893\n21894,4611\n21895,1133\n21896,21897\n21896,35259\n21898,779\n21898,1181\n21898,1515\n21899,1453\n21900,217\n21900,222\n21900,455\n21900,5343\n21900,5547\n21901,602\n21902,557\n21903,602\n21904,422\n21905,130\n21905,206\n21906,111\n21907,602\n21908,147\n21908,302\n21908,467\n21908,2116\n21909,171\n21910,422\n21911,422\n21913,422\n21914,809\n21914,872\n21914,6726\n21915,422\n21916,422\n21917,422\n21918,422\n21919,422\n21920,366\n21921,872\n21922,577\n21923,21924\n21925,7124\n21926,215\n21927,10\n21928,10\n21929,473\n21929,2590\n21930,4594\n21931,3367\n21932,3\n21933,8884\n21934,7\n21934,202\n21934,203\n21935,21936\n21937,21937\n21939,72\n21940,99\n21941,1001\n21942,21943\n21942,29088\n21944,967\n21944,2939\n21944,9070\n21944,13704\n21945,21946\n21947,841\n21948,323\n21949,21950\n21951,77\n21952,323\n21953,366\n21954,366\n21955,366\n21956,366\n21957,366\n21958,99\n21959,175\n21960,16196\n21961,21962\n21963,323\n21964,1203\n21964,1955\n21965,1556\n21966,579\n21967,233\n21968,579\n21969,710\n21970,102\n21971,58\n21972,46\n21973,515\n21974,163\n21975,7614\n21976,392\n21977,579\n21978,2048\n21979,304\n21980,781\n21981,264\n21981,392\n21981,1220\n21981,1222\n21982,808\n21982,1192\n21982,1949\n21983,163\n21984,298\n21985,485\n21986,298\n21987,485\n21988,387\n21989,102\n21990,483\n21991,3451\n21991,3452\n21992,781\n21993,3653\n21995,781\n21996,579\n21998,1452\n21998,1849\n21999,22\n21999,717\n21999,7698\n22000,167\n22000,217\n22000,406\n22000,467\n22000,599\n22000,631\n22000,868\n22000,872\n22000,1085\n22000,1796\n22001,240\n22002,644\n22003,48\n22003,333\n22003,567\n22003,707\n22003,783\n22003,1425\n22003,4453\n22003,67888\n22004,171\n22007,32\n22007,137\n22007,187\n22007,192\n22007,202\n22007,222\n22007,273\n22007,326\n22007,358\n22007,387\n22007,415\n22007,579\n22007,657\n22007,666\n22007,676\n22007,811\n22007,838\n22007,891\n22007,1117\n22007,1147\n22007,1192\n22007,1313\n22007,1417\n22007,1590\n22007,1871\n22007,1973\n22007,2266\n22007,2421\n22007,3258\n22007,5908\n22008,527\n22009,298\n22010,485\n22011,9024\n22012,1425\n22013,252\n22013,318\n22013,41170\n22014,6891\n22015,66\n22015,192\n22015,240\n22015,336\n22015,1623\n22016,283\n22016,323\n22016,388\n22016,623\n22016,779\n22016,949\n22016,996\n22016,1072\n22016,1465\n22016,1927\n22016,3135\n22016,4549\n22016,14126\n22017,289\n22017,290\n22017,3041\n22018,255\n22019,1072\n22020,1191\n22020,1663\n22020,2253\n22020,6824\n22021,146\n22022,217\n22022,446\n22022,872\n22022,1118\n22022,1796\n22022,3111\n22022,3297\n22022,16196\n22022,19005\n22025,255\n22026,21589\n22027,1803\n22028,489\n22029,240\n22029,397\n22029,2989\n22029,2991\n22029,4355\n22030,536\n22031,30\n22031,48\n22031,94\n22031,273\n22031,274\n22031,328\n22031,358\n22031,481\n22031,583\n22031,994\n22031,1172\n22031,1179\n22031,1247\n22031,1432\n22031,2421\n22031,2787\n22031,3538\n22031,4218\n22031,14434\n22032,104\n22032,589\n22032,1462\n22032,4220\n22032,8537\n22033,217\n22034,781\n22035,81\n22036,306\n22036,307\n22037,647\n22038,344\n22039,442\n22039,588\n22039,590\n22039,1411\n22039,2205\n22039,33424\n22039,178576\n22040,5405\n22041,647\n22042,344\n22043,163\n22044,586\n22045,140\n22045,338\n22045,360\n22045,392\n22045,479\n22045,535\n22045,1052\n22045,1147\n22045,1381\n22045,1893\n22045,1973\n22045,13538\n22045,26181\n22045,49057\n22045,131675\n22048,15119\n22050,171\n22051,330\n22054,182\n22054,188\n22054,202\n22054,203\n22054,1844\n22055,158\n22055,406\n22055,779\n22055,1181\n22055,1515\n22055,4193\n22055,68069\n22056,344\n22056,647\n22057,2572\n22058,134\n22058,431\n22058,801\n22058,805\n22059,58\n22060,46\n22061,811\n22062,167\n22062,240\n22062,301\n22062,604\n22062,968\n22062,1522\n22062,2083\n22063,182\n22063,217\n22063,1417\n22063,1844\n22064,1096\n22065,4\n22065,5\n22065,134\n22065,743\n22065,8714\n22066,868\n22067,647\n22068,344\n22069,647\n22070,344\n22073,22\n22073,41\n22073,48\n22073,77\n22073,137\n22073,171\n22073,255\n22073,269\n22073,289\n22073,290\n22073,302\n22073,304\n22073,360\n22073,379\n22073,424\n22073,430\n22073,485\n22073,491\n22073,510\n22073,589\n22073,605\n22073,640\n22073,647\n22073,668\n22073,707\n22073,720\n22073,749\n22073,818\n22073,852\n22073,861\n22073,919\n22073,920\n22073,934\n22073,957\n22073,1132\n22073,1133\n22073,1179\n22073,1289\n22073,1556\n22073,1608\n22073,1749\n22073,1881\n22073,1983\n22073,2205\n22073,2266\n22073,2506\n22073,2646\n22073,2784\n22073,3161\n22073,3209\n22073,3623\n22073,3695\n22073,4455\n22073,4571\n22073,5130\n22073,13661\n22073,16687\n22073,22293\n22073,33424\n22073,35486\n22073,53499\n22073,94134\n22073,142433\n22073,155473\n22074,852\n22075,2210\n22075,4237\n22075,182162\n22076,302\n22076,344\n22076,557\n22078,849\n22078,852\n22078,26450\n22079,390\n22080,376\n22081,104\n22081,264\n22081,483\n22081,1119\n22084,217\n22085,392\n22086,875\n22087,79\n22087,710\n22087,760\n22089,264\n22089,749\n22089,1381\n22089,2605\n22090,104\n22090,254\n22090,557\n22090,953\n22090,954\n22090,1939\n22091,1453\n22093,577\n22094,171\n22095,2045\n22096,647\n22097,344\n22098,577\n22098,1070\n22098,1309\n22098,1462\n22098,2205\n22098,8537\n22098,33424\n22100,1551\n22101,1\n22102,147\n22102,184\n22103,589\n22104,171\n22105,1368\n22105,5405\n22106,298\n22107,485\n22109,171\n22110,171\n22111,302\n22111,579\n22112,2045\n22113,1556\n22114,171\n22115,891\n22116,2083\n22117,298\n22118,485\n22119,34\n22119,35\n22119,143\n22119,657\n22119,1052\n22119,1639\n22119,5250\n22119,7768\n22119,13661\n22119,42121\n22120,298\n22121,485\n22122,563\n22123,1\n22124,1506\n22124,22125\n22125,704\n22126,147\n22126,149\n22126,1118\n22127,66\n22128,459\n22128,920\n22129,171\n22130,455\n22131,1323\n22132,102\n22133,1326\n22134,408\n22135,779\n22136,209\n22137,272\n22138,1531\n22139,306\n22139,307\n22140,1058\n22141,2051\n22142,3\n22142,605\n22142,2224\n22142,2274\n22143,1379\n22144,388\n22145,5405\n22145,189303\n22146,1836\n22148,219\n22148,493\n22148,1877\n22149,104\n22149,315\n22149,588\n22149,590\n22149,714\n22149,795\n22149,1882\n22150,372\n22151,781\n22152,571\n22152,868\n22152,1888\n22153,1127\n22154,2051\n22154,3474\n22155,2051\n22155,5547\n22156,72\n22157,2083\n22159,788\n22160,2443\n22161,1556\n22163,97\n22164,640\n22165,640\n22166,640\n22167,640\n22168,1070\n22168,1381\n22169,134\n22170,647\n22171,344\n22172,222\n22172,278\n22172,19443\n22173,104\n22173,349\n22173,392\n22173,1836\n22174,563\n22175,171\n22176,1433\n22177,225\n22177,379\n22177,431\n22177,932\n22177,941\n22177,968\n22177,1832\n22177,2775\n22177,22799\n22178,861\n22178,2116\n22179,163\n22180,389\n22181,3\n22182,366\n22182,827\n22182,4101\n22183,1267\n22184,1467\n22185,4066\n22186,1927\n22187,515\n22190,1433\n22191,2224\n22192,893\n22192,1453\n22193,801\n22193,1453\n22193,9030\n22194,647\n22195,344\n22196,577\n22196,859\n22196,1105\n22196,1429\n22197,1240\n22198,424\n22199,206\n22200,372\n22202,1877\n22203,302\n22204,252\n22204,516\n22204,1220\n22204,1222\n22204,41170\n22205,516\n22207,1619\n22208,647\n22209,344\n22210,147\n22210,149\n22210,158\n22210,184\n22211,781\n22212,932\n22213,1118\n22215,647\n22216,344\n22217,392\n22218,1019\n22219,602\n22220,832\n22221,68\n22221,178\n22221,186\n22221,315\n22221,346\n22221,393\n22221,435\n22221,538\n22221,934\n22221,1033\n22221,1068\n22221,1294\n22221,1531\n22221,1590\n22221,1877\n22221,2353\n22221,6661\n22222,215\n22222,503\n22223,602\n22224,1220\n22224,1222\n22225,252\n22226,251\n22227,841\n22229,50\n22229,79\n22229,195\n22229,305\n22229,435\n22229,516\n22229,602\n22229,920\n22229,3209\n22229,4455\n22229,5213\n22229,6119\n22229,22280\n22230,435\n22231,147\n22231,149\n22231,158\n22233,120\n22233,1001\n22234,217\n22235,20\n22236,5212\n22237,147\n22238,1983\n22239,1143\n22240,697\n22241,333\n22241,337\n22241,59021\n22242,130\n22243,1415\n22244,83\n22247,34\n22247,35\n22248,647\n22249,344\n22250,422\n22251,56\n22252,7768\n22254,83\n22254,217\n22254,278\n22254,536\n22256,68\n22256,72\n22256,873\n22256,874\n22256,1143\n22256,1210\n22256,1274\n22256,2620\n22256,5405\n22257,163\n22258,312\n22259,192\n22259,516\n22259,663\n22259,664\n22259,127158\n22261,211\n22262,397\n22264,1220\n22264,1222\n22265,252\n22266,251\n22267,500\n22267,1124\n22268,104\n22268,289\n22268,290\n22268,298\n22268,714\n22268,1212\n22268,1462\n22268,2105\n22268,4220\n22268,6068\n22268,8537\n22268,9022\n22268,9028\n22268,75912\n22268,94134\n22269,647\n22270,344\n22271,1282\n22271,1453\n22275,538\n22275,893\n22275,1010\n22276,163\n22276,467\n22276,861\n22277,301\n22277,406\n22277,818\n22277,1433\n22278,872\n22278,919\n22279,120\n22282,77\n22282,83\n22282,222\n22282,285\n22282,536\n22282,631\n22282,1085\n22282,22293\n22283,99\n22284,195\n22285,536\n22286,163\n22287,195\n22288,104\n22288,134\n22288,332\n22289,718\n22290,536\n22291,301\n22291,1085\n22291,189303\n22292,22\n22292,79\n22292,163\n22292,187\n22292,459\n22292,509\n22292,538\n22292,579\n22292,745\n22292,1007\n22292,1033\n22292,1326\n22292,1425\n22292,1677\n22292,2116\n22292,2443\n22293,287\n22293,392\n22293,425\n22293,518\n22293,779\n22293,809\n22293,903\n22293,918\n22293,1678\n22293,2016\n22293,2418\n22293,2475\n22293,2819\n22293,4760\n22293,5604\n22293,7388\n22293,7781\n22293,8420\n22293,15654\n22293,17852\n22293,18662\n22293,19010\n22293,19618\n22293,22293\n22293,23447\n22293,24680\n22293,26161\n22293,30691\n22293,37219\n22293,40552\n22293,42684\n22293,49108\n22293,56397\n22293,67984\n22293,72070\n22293,80063\n22293,80431\n22293,80957\n22293,90715\n22293,91892\n22293,94351\n22293,101588\n22293,102676\n22293,109421\n22293,109901\n22293,110486\n22293,127317\n22293,127852\n22293,129844\n22293,129851\n22293,140416\n22293,140465\n22293,142868\n22293,144951\n22293,150172\n22293,154654\n22293,156320\n22293,167739\n22293,174582\n22293,174754\n22293,191939\n22293,194427\n22293,222627\n22294,3209\n22295,346\n22296,182\n22296,186\n22296,211\n22296,366\n22296,406\n22296,457\n22296,500\n22296,872\n22296,1014\n22296,1118\n22296,1796\n22296,173420\n22296,220502\n22297,163\n22298,358\n22299,248\n22299,760\n22299,1149\n22299,1631\n22299,1635\n22300,1977\n22300,1978\n22301,137\n22302,3451\n22302,3452\n22303,7360\n22304,509\n22304,510\n22304,1572\n22305,163\n22306,163\n22306,2116\n22307,143\n22308,33\n22308,364\n22308,431\n22308,1227\n22308,1229\n22308,1252\n22308,1253\n22308,9541\n22308,21944\n22308,86416\n22308,155473\n22308,259296\n22309,647\n22310,344\n22311,302\n22313,30\n22313,250\n22313,602\n22313,994\n22313,1684\n22313,30331\n22314,392\n22314,1240\n22314,1353\n22314,1454\n22315,731\n22316,1858\n22317,56\n22317,841\n22317,1181\n22317,1993\n22317,2386\n22317,23783\n22317,30362\n22317,30494\n22318,240\n22318,818\n22320,217\n22320,22321\n22322,163\n22323,163\n22323,302\n22324,808\n22325,2775\n22326,447\n22327,66\n22327,364\n22328,1203\n22329,163\n22330,515\n22331,1203\n22331,1955\n22333,273\n22333,274\n22333,313\n22333,1068\n22334,3138\n22335,147\n22335,631\n22335,818\n22335,1149\n22335,1177\n22336,4831\n22337,240\n22337,818\n22337,1203\n22337,1285\n22337,1955\n22338,146\n22338,779\n22338,1515\n22339,240\n22339,1203\n22340,1419\n22341,147\n22341,422\n22342,50\n22343,1007\n22344,9011\n22344,9032\n22345,2828\n22346,893\n22347,136\n22347,287\n22347,538\n22347,809\n22347,1634\n22347,5310\n22347,19010\n22348,4611\n22349,920\n22350,389\n22352,301\n22352,604\n22352,1293\n22353,1203\n22354,611\n22355,647\n22356,344\n22357,1803\n22361,11\n22361,911\n22361,1619\n22362,2051\n22362,2626\n22362,49057\n22363,137\n22363,187\n22363,222\n22363,326\n22363,387\n22363,415\n22363,623\n22363,626\n22363,1419\n22363,1454\n22363,1805\n22363,1888\n22363,2460\n22363,3003\n22363,5591\n22363,44743\n22364,206\n22366,50\n22366,406\n22367,336\n22368,34\n22368,1718\n22369,195\n22370,160\n22370,264\n22370,1425\n22371,1370\n22372,192\n22373,861\n22374,417\n22375,171\n22376,7092\n22377,809\n22377,19010\n22378,217\n22378,1417\n22379,83\n22380,209\n22380,861\n22381,149\n22382,83\n22383,10\n22384,784\n22385,178\n22385,435\n22385,622\n22385,1033\n22386,1858\n22387,1860\n22388,21944\n22389,83\n22389,685\n22389,849\n22389,941\n22389,1247\n22389,1402\n22389,1782\n22389,178576\n22390,21944\n22391,717\n22391,868\n22391,1782\n22391,162599\n22393,135\n22394,72\n22395,192\n22395,256\n22396,996\n22397,147\n22397,192\n22398,269\n22399,184\n22400,861\n22401,1417\n22403,622\n22404,151\n22406,163\n22408,1240\n22409,2089\n22409,2940\n22409,21944\n22410,1509\n22411,344\n22412,333\n22413,163\n22413,1381\n22414,264\n22414,736\n22414,835\n22414,1052\n22414,1127\n22414,1381\n22414,1551\n22414,1893\n22415,631\n22416,104\n22416,240\n22416,973\n22416,1458\n22418,328\n22418,1179\n22419,479\n22421,143\n22422,219\n22425,980\n22425,2979\n22426,406\n22426,516\n22426,1370\n22427,579\n22427,2116\n22428,364\n22428,1282\n22428,2205\n22428,33424\n22429,19\n22430,217\n22431,980\n22432,160\n22432,273\n22432,274\n22432,515\n22432,527\n22432,652\n22432,710\n22432,1127\n22432,1188\n22432,1381\n22432,1579\n22432,1722\n22432,1893\n22433,852\n22434,182\n22434,3524\n22435,720\n22435,801\n22435,991\n22436,827\n22437,2779\n22439,65\n22440,211\n22440,240\n22440,503\n22440,518\n22440,775\n22440,801\n22440,1001\n22440,1119\n22440,1140\n22440,1326\n22440,1659\n22440,2334\n22440,5547\n22440,6556\n22440,221286\n22442,515\n22443,310\n22443,16207\n22443,22727\n22444,364\n22445,772\n22446,15573\n22447,22448\n22449,83\n22450,68\n22450,1326\n22450,1782\n22451,2178\n22451,4545\n22451,56150\n22451,139010\n22452,312\n22453,1033\n22453,1181\n22454,86\n22455,379\n22455,1434\n22456,760\n22457,852\n22458,704\n22459,72\n22460,120\n22461,1888\n22462,640\n22463,22464\n22465,22464\n22466,206\n22468,2312\n22469,417\n22470,81\n22471,919\n22472,143\n22473,344\n22473,1711\n22474,10\n22474,3316\n22475,72\n22476,211\n22477,392\n22478,298\n22479,485\n22480,640\n22480,2744\n22480,142405\n22481,2867\n22481,2868\n22483,151\n22484,333\n22485,63\n22485,272\n22485,332\n22485,422\n22485,433\n22485,435\n22485,615\n22485,752\n22485,1085\n22485,1381\n22485,3218\n22485,3467\n22485,5213\n22485,55849\n22486,640\n22487,640\n22488,217\n22488,536\n22489,151\n22490,441\n22490,609\n22490,760\n22490,1631\n22491,22492\n22491,144888\n22493,163\n22493,861\n22493,893\n22493,1849\n22494,79\n22494,336\n22494,525\n22495,22496\n22497,22496\n22498,22496\n22502,22503\n22504,158\n22505,314\n22505,900\n22506,1465\n22507,146\n22509,240\n22509,278\n22509,301\n22509,356\n22509,372\n22509,843\n22509,875\n22509,1001\n22509,1010\n22509,1012\n22509,1175\n22509,1231\n22509,1240\n22509,1326\n22509,1436\n22509,1544\n22509,1572\n22509,1722\n22509,1849\n22509,1955\n22509,2286\n22509,2416\n22509,2699\n22509,3138\n22509,3585\n22509,3612\n22509,4252\n22510,184\n22512,305\n22513,10\n22514,4594\n22515,1740\n22516,390\n22517,250\n22517,1684\n22518,22519\n22520,22521\n22520,111909\n22522,1227\n22522,1229\n22523,718\n22524,1511\n22524,3069\n22525,79\n22526,1454\n22526,4172\n22527,283\n22527,455\n22527,536\n22527,1467\n22527,1881\n22527,2266\n22528,147\n22528,202\n22528,252\n22528,439\n22528,516\n22528,663\n22528,920\n22528,1181\n22529,146\n22530,151\n22530,1070\n22530,3804\n22532,22533\n22532,32032\n22532,37167\n22532,51122\n22532,51600\n22532,52467\n22532,53700\n22534,1453\n22535,292\n22535,441\n22535,1688\n22535,3538\n22536,1227\n22536,1229\n22536,86416\n22537,5405\n22538,151\n22539,592\n22539,2416\n22539,2417\n22540,211\n22541,376\n22542,885\n22543,255\n22544,1284\n22544,148742\n22545,1400\n22546,2506\n22547,72\n22548,86\n22548,167\n22548,240\n22548,301\n22548,372\n22548,567\n22548,605\n22548,615\n22548,631\n22548,720\n22548,801\n22548,907\n22548,972\n22548,973\n22548,1010\n22548,1122\n22548,1124\n22548,1140\n22548,1167\n22548,1231\n22548,1241\n22548,1284\n22548,1298\n22548,1309\n22548,1436\n22548,1522\n22548,1544\n22548,1564\n22548,1782\n22548,1785\n22548,1818\n22548,1837\n22548,1893\n22548,2191\n22548,2372\n22548,2557\n22548,2620\n22548,2979\n22548,3193\n22548,3207\n22548,3218\n22549,376\n22550,5310\n22551,717\n22551,991\n22551,1096\n22551,1368\n22551,1465\n22551,1509\n22552,54\n22552,283\n22552,455\n22553,252\n22554,2209\n22555,18726\n22555,68955\n22556,22557\n22556,173049\n22558,2178\n22558,4545\n22558,139010\n22559,10\n22560,252\n22560,516\n22560,1220\n22560,1222\n22561,1551\n22562,592\n22562,1001\n22563,195\n22564,22565\n22566,20771\n22567,184\n22567,2646\n22568,640\n22569,22570\n22571,22572\n22573,3538\n22574,22575\n22576,3538\n22577,809\n22578,205\n22579,65\n22579,406\n22579,1531\n22579,22580\n22581,433\n22582,1133\n22583,346\n22584,925\n22585,693\n22586,875\n22587,158\n22588,247\n22589,202\n22589,203\n22590,862\n22591,736\n22592,30\n22593,1411\n22593,2417\n22593,3804\n22594,22595\n22596,557\n22597,557\n22598,557\n22599,8719\n22600,138\n22601,865\n22602,557\n22603,137\n22604,1\n22605,118\n22605,4597\n22606,21944\n22608,8719\n22609,138\n22610,557\n22611,865\n22612,137\n22613,118\n22613,4597\n22614,21944\n22615,10\n22617,8719\n22618,138\n22619,22620\n22621,865\n22622,557\n22623,137\n22624,118\n22624,4597\n22625,21944\n22626,8719\n22627,138\n22628,865\n22629,557\n22630,137\n22631,118\n22631,4597\n22632,21944\n22633,2506\n22634,2506\n22635,21944\n22636,346\n22637,21944\n22638,255\n22639,843\n22640,452\n22640,457\n22640,497\n22640,535\n22640,676\n22640,1655\n22641,21944\n22643,26\n22643,59\n22643,994\n22643,2674\n22643,21944\n22644,346\n22645,1313\n22647,346\n22648,22649\n22650,1531\n22652,1381\n22653,832\n22654,832\n22654,1522\n22655,489\n22656,1181\n22657,861\n22658,8992\n22659,34\n22659,35\n22659,158\n22659,217\n22659,248\n22659,389\n22659,392\n22659,536\n22659,577\n22659,779\n22659,862\n22659,1001\n22659,1010\n22659,1019\n22659,1436\n22659,1608\n22659,1644\n22659,1849\n22659,2083\n22659,2699\n22659,2782\n22659,5405\n22660,5591\n22661,1227\n22661,1229\n22661,1252\n22661,1253\n22661,86416\n22662,22663\n22664,2979\n22665,22666\n22665,140020\n22667,22668\n22669,22668\n22670,1381\n22671,2178\n22671,4545\n22672,222\n22673,1192\n22674,1118\n22675,25\n22675,1425\n22675,1432\n22675,2088\n22677,81\n22677,147\n22677,192\n22677,195\n22677,211\n22677,217\n22677,358\n22677,366\n22677,406\n22677,500\n22677,596\n22677,622\n22677,640\n22677,718\n22677,779\n22677,818\n22677,861\n22677,1181\n22677,1515\n22677,1631\n22677,1847\n22677,4094\n22677,5102\n22677,141912\n22678,3161\n22679,1556\n22680,557\n22681,171\n22682,493\n22683,167\n22683,301\n22683,312\n22683,392\n22683,968\n22683,1001\n22683,1287\n22683,2017\n22683,2443\n22684,408\n22685,1058\n22687,22688\n22689,22690\n22691,30\n22691,1118\n22691,1149\n22691,22692\n22691,74832\n22691,86527\n22691,86652\n22691,100948\n22691,113816\n22691,193933\n22693,22694\n22695,158\n22696,22697\n22698,516\n22698,41170\n22700,5591\n22701,2697\n22702,158\n22702,192\n22703,22704\n22705,72\n22706,22707\n22708,22707\n22709,10\n22710,4455\n22711,115\n22711,118\n22711,137\n22711,151\n22711,206\n22711,302\n22711,306\n22711,307\n22711,372\n22711,491\n22711,595\n22711,720\n22711,957\n22711,1381\n22711,1436\n22711,1684\n22711,1815\n22711,3148\n22711,3467\n22711,3967\n22711,3999\n22711,4411\n22712,10\n22713,1070\n22714,1181\n22715,589\n22715,1001\n22716,22717\n22718,663\n22718,664\n22719,22720\n22721,22722\n22723,192\n22724,151\n22725,557\n22726,22727\n22728,22729\n22730,225\n22731,2699\n22731,3003\n22732,22733\n22734,22735\n22736,8884\n22737,2681\n22737,31977\n22738,1085\n22739,2292\n22740,22741\n22742,22743\n22744,233\n22745,1247\n22746,596\n22747,644\n22748,22749\n22750,22751\n22753,2048\n22754,8270\n22755,366\n22756,366\n22757,366\n22758,366\n22759,366\n22760,366\n22761,366\n22762,22763\n22762,63505\n22762,81691\n22762,84924\n22762,95555\n22762,96381\n22762,101049\n22762,109856\n22762,115104\n22762,118190\n22762,129039\n22762,143061\n22764,389\n22766,10\n22766,113156\n22767,292\n22768,22769\n22770,306\n22770,307\n22771,22772\n22773,22774\n22775,107\n22775,202\n22775,203\n22775,227\n22775,269\n22775,294\n22775,299\n22775,309\n22775,310\n22775,346\n22775,366\n22775,389\n22775,424\n22775,640\n22775,657\n22775,668\n22775,760\n22775,772\n22775,841\n22775,843\n22775,932\n22775,1085\n22775,1368\n22775,1381\n22775,1458\n22775,1544\n22775,1801\n22775,1849\n22775,2209\n22775,2266\n22775,2411\n22775,3507\n22775,6955\n22775,7155\n22776,248\n22776,1179\n22777,267\n22778,389\n22779,4453\n22780,483\n22781,1235\n22781,1335\n22782,48\n22783,143\n22783,1052\n22784,4078\n22785,784\n22786,647\n22787,182\n22787,188\n22787,206\n22787,7652\n22788,663\n22788,664\n22789,130\n22790,1210\n22791,3846\n22792,1776\n22793,22794\n22795,202\n22795,203\n22795,4453\n22796,920\n22797,3115\n22798,2045\n22798,8149\n22800,280\n22800,17245\n22801,2681\n22802,273\n22802,274\n22803,424\n22804,130\n22805,2837\n22806,349\n22806,509\n22806,1043\n22807,130\n22808,217\n22808,240\n22808,392\n22808,818\n22808,1417\n22808,23287\n22808,102560\n22808,127158\n22808,191355\n22808,207045\n22808,212914\n22809,1231\n22810,2528\n22811,581\n22812,306\n22812,307\n22813,611\n22814,2506\n22815,68\n22816,1571\n22817,2506\n22818,2506\n22819,1388\n22820,48\n22821,22821\n22822,731\n22823,2828\n22824,1133\n22824,3094\n22825,22826\n22827,22828\n22829,1181\n22830,647\n22831,344\n22832,1782\n22833,1265\n22833,1266\n22834,247\n22835,577\n22835,596\n22835,1105\n22835,1429\n22836,136\n22836,137\n22836,2557\n22837,2574\n22838,980\n22839,694\n22839,2775\n22840,298\n22841,485\n22842,72\n22843,206\n22843,718\n22844,589\n22845,10\n22846,10\n22847,885\n22847,13704\n22848,72\n22849,298\n22850,485\n22851,1235\n22851,1335\n22852,72\n22853,72\n22854,1359\n22855,72\n22856,1858\n22857,1860\n22858,72\n22859,19\n22859,749\n22860,313\n22860,536\n22860,1201\n22860,1512\n22860,2944\n22860,5992\n22860,7698\n22860,7974\n22860,28232\n22860,193860\n22860,199285\n22860,254329\n22861,72\n22862,1181\n22862,2244\n22863,4548\n22864,525\n22865,3830\n22866,104\n22866,134\n22866,135\n22867,72\n22868,22869\n22871,781\n22872,273\n22872,274\n22873,72\n22874,240\n22874,389\n22874,1454\n22875,72\n22876,720\n22877,252\n22877,516\n22877,1220\n22877,1222\n22878,5405\n22879,48\n22880,147\n22880,158\n22880,211\n22880,634\n22880,794\n22880,1181\n22880,1235\n22880,1335\n22880,2867\n22880,2868\n22880,22880\n22881,302\n22882,211\n22883,130\n22883,1551\n22884,250\n22885,1769\n22886,273\n22886,274\n22887,217\n22888,417\n22889,22890\n22891,22892\n22893,491\n22893,2315\n22894,298\n22895,485\n22896,452\n22896,457\n22896,497\n22896,535\n22896,1655\n22897,1479\n22898,1085\n22898,1522\n22899,72\n22900,22901\n22902,3\n22902,346\n22902,435\n22902,439\n22902,447\n22902,586\n22902,1294\n22902,2931\n22902,6119\n22903,206\n22903,333\n22904,647\n22905,344\n22906,21944\n22907,5405\n22908,784\n22909,72\n22910,72\n22911,1140\n22912,640\n22913,602\n22914,918\n22914,1118\n22915,4\n22915,5\n22916,119\n22916,577\n22916,1400\n22916,2073\n22917,130\n22917,163\n22917,264\n22917,515\n22917,1007\n22917,1147\n22917,1151\n22917,1192\n22917,1381\n22917,1556\n22917,1893\n22917,1968\n22917,3999\n22918,66\n22919,10\n22920,1265\n22920,1266\n22921,647\n22922,344\n22923,3069\n22924,22924\n22925,1844\n22926,22927\n22928,22\n22929,7\n22930,22931\n22930,47343\n22930,47366\n22930,49880\n22930,53226\n22930,54769\n22930,55266\n22930,56077\n22930,60106\n22930,62212\n22930,65418\n22930,68093\n22930,69945\n22930,78358\n22930,88129\n22930,250408\n22932,3297\n22933,2528\n22934,22935\n22936,163\n22937,424\n22938,3872\n22939,120\n22939,647\n22939,682\n22939,805\n22939,1353\n22939,3367\n22939,3769\n22940,811\n22940,2178\n22940,4545\n22940,56150\n22940,139010\n22941,663\n22941,664\n22942,663\n22942,664\n22943,22944\n22945,147\n22946,22947\n22948,30\n22948,34\n22948,35\n22948,134\n22948,158\n22948,200\n22948,211\n22948,275\n22948,333\n22948,450\n22948,536\n22948,557\n22948,585\n22948,589\n22948,862\n22948,907\n22948,991\n22948,1102\n22948,1149\n22948,1285\n22948,1379\n22948,1414\n22948,1776\n22948,1980\n22948,2048\n22948,2351\n22948,2931\n22948,2995\n22948,3872\n22948,3960\n22948,4475\n22948,5366\n22948,5440\n22948,6068\n22948,7358\n22948,7360\n22948,7363\n22948,7652\n22948,8270\n22948,8991\n22948,8992\n22948,9121\n22948,17228\n22948,19227\n22948,23010\n22948,23011\n22949,81\n22949,104\n22949,200\n22949,215\n22949,227\n22949,233\n22949,248\n22949,503\n22949,592\n22949,704\n22949,1016\n22949,1149\n22949,1282\n22949,1392\n22949,1882\n22949,2210\n22949,3507\n22949,4237\n22949,8993\n22949,182162\n22950,72\n22951,22952\n22951,92752\n22951,105363\n22951,110487\n22951,112724\n22951,114971\n22951,115334\n22951,115395\n22951,116211\n22951,118228\n22951,119110\n22951,119302\n22951,120294\n22951,121247\n22951,121767\n22951,121814\n22951,122834\n22951,124153\n22951,124174\n22951,124713\n22951,125508\n22951,126449\n22951,127950\n22951,128528\n22951,129885\n22951,130063\n22951,130614\n22951,136970\n22951,144794\n22951,151702\n22951,151900\n22951,157867\n22951,160179\n22951,160218\n22951,162271\n22951,178088\n22951,178361\n22951,221586\n22951,254381\n22953,269\n22954,147\n22954,158\n22955,16207\n22956,1132\n22957,376\n22958,22959\n22960,250\n22960,712\n22960,752\n22960,1522\n22960,1803\n22961,233\n22962,893\n22963,22964\n22965,366\n22966,366\n22967,366\n22968,366\n22969,366\n22970,22971\n22970,37120\n22972,515\n22973,147\n22973,452\n22973,707\n22973,743\n22973,1262\n22974,22975\n22976,22975\n22977,107\n22978,292\n22979,2416\n22979,2417\n22980,338\n22981,298\n22982,1133\n22983,3538\n22984,130\n22985,22986\n22985,57689\n22985,62737\n22987,298\n22988,485\n22989,22990\n22989,37487\n22989,39853\n22989,47338\n22989,53515\n22989,53622\n22989,56038\n22989,76333\n22989,80302\n22989,84857\n22989,86946\n22989,87811\n22989,100856\n22991,433\n22992,579\n22993,918\n22994,22995\n22996,22997\n22999,579\n23000,302\n23001,1265\n23001,1266\n23002,1265\n23002,1266\n23003,206\n23003,7652\n23004,298\n23005,485\n23006,298\n23007,485\n23008,832\n23008,1522\n23008,1927\n23009,707\n23010,23010\n23012,2506\n23013,872\n23014,872\n23015,872\n23016,872\n23017,872\n23018,872\n23019,217\n23019,592\n23019,1818\n23020,1688\n23021,932\n23022,298\n23023,485\n23024,887\n23025,330\n23025,783\n23025,3538\n23026,1289\n23026,1579\n23026,2051\n23027,5213\n23028,306\n23028,307\n23029,5250\n23030,406\n23031,750\n23031,762\n23031,60576\n23032,312\n23034,2116\n23035,358\n23036,422\n23036,1179\n23037,192\n23037,932\n23037,1140\n23037,1284\n23037,4504\n23038,510\n23039,272\n23040,72\n23041,422\n23042,422\n23043,422\n23044,1888\n23046,200\n23047,44\n23048,23049\n23050,1326\n23051,349\n23052,536\n23053,493\n23054,1007\n23055,22\n23055,1058\n23055,21442\n23056,207\n23057,280\n23058,2312\n23059,23060\n23059,84372\n23059,120470\n23059,120478\n23059,135331\n23059,140290\n23061,615\n23062,973\n23063,48\n23064,328\n23064,720\n23064,885\n23064,13704\n23065,5405\n23066,10\n23067,273\n23067,274\n23068,1639\n23069,240\n23069,301\n23069,2083\n23070,3413\n23071,1033\n23072,255\n23073,126\n23074,2775\n23075,447\n23076,2334\n23077,431\n23077,850\n23077,4771\n23078,2979\n23080,83\n23081,184\n23082,240\n23083,347\n23084,406\n23086,918\n23087,217\n23087,1417\n23087,1796\n23087,3507\n23088,5662\n23089,83\n23089,1118\n23090,2807\n23091,23092\n23093,298\n23094,485\n23095,23096\n23095,81360\n23097,344\n23097,1127\n23097,1711\n23097,1836\n23098,406\n23098,55849\n23099,285\n23099,1655\n23100,703\n23101,452\n23101,457\n23101,497\n23101,535\n23101,1655\n23102,240\n23102,1285\n23102,1818\n23102,2989\n23102,2991\n23103,337\n23103,115659\n23103,142409\n23103,146280\n23103,148600\n23104,10\n23104,79\n23104,97\n23104,149\n23104,220502\n23105,376\n23106,1983\n23107,301\n23107,1844\n23108,209\n23109,23110\n23111,26\n23111,59\n23112,23110\n23113,358\n23114,5405\n23115,1381\n23116,298\n23117,485\n23118,23119\n23120,872\n23121,1983\n23122,435\n23122,440\n23123,41\n23123,104\n23123,106\n23123,140\n23123,248\n23123,349\n23123,439\n23123,444\n23123,493\n23123,577\n23123,586\n23123,726\n23123,784\n23123,859\n23123,1007\n23123,1105\n23123,1151\n23123,1252\n23123,1253\n23123,1309\n23123,1363\n23123,1381\n23123,1388\n23123,1564\n23123,1836\n23123,2590\n23123,2620\n23123,4039\n23123,28130\n23123,31073\n23124,422\n23126,107\n23127,422\n23128,784\n23129,872\n23130,515\n23131,83\n23132,10\n23132,23132\n23132,23217\n23132,221331\n23133,422\n23134,26\n23134,47\n23134,59\n23134,2469\n23134,21944\n23135,1085\n23135,1962\n23136,160\n23137,433\n23138,315\n23138,671\n23139,5908\n23140,557\n23141,862\n23142,640\n23143,557\n23144,557\n23145,557\n23146,433\n23147,1019\n23148,23149\n23150,23151\n23152,406\n23152,23153\n23154,23155\n23154,48812\n23156,273\n23156,274\n23157,79\n23157,252\n23157,832\n23158,19010\n23159,973\n23159,2017\n23159,17309\n23160,332\n23160,424\n23160,438\n23160,2315\n23161,149\n23161,2353\n23162,344\n23162,647\n23162,919\n23163,647\n23164,344\n23165,23166\n23167,79\n23168,1078\n23169,19010\n23170,2607\n23171,907\n23171,2620\n23172,1252\n23172,1253\n23172,1474\n23173,652\n23174,364\n23174,609\n23174,3623\n23175,2506\n23176,23177\n23178,3623\n23179,1860\n23179,7155\n23180,23181\n23182,4691\n23183,1298\n23184,872\n23185,1298\n23186,920\n23187,872\n23188,872\n23189,151\n23190,143\n23191,3003\n23192,1265\n23192,1266\n23193,23194\n23195,72\n23195,87\n23195,312\n23196,23197\n23198,1238\n23199,48\n23200,1452\n23201,8992\n23202,5469\n23203,23204\n23203,96592\n23205,770\n23206,1085\n23207,5440\n23208,5101\n23208,15119\n23209,4355\n23210,589\n23211,602\n23212,330\n23212,868\n23212,1385\n23213,602\n23214,6068\n23215,2528\n23216,991\n23217,10\n23217,23217\n23217,139245\n23218,23219\n23220,1\n23221,2351\n23222,17334\n23223,2178\n23223,4545\n23223,56150\n23224,420\n23225,1\n23225,8\n23225,32\n23225,86\n23225,117\n23225,273\n23225,274\n23225,485\n23225,1345\n23225,1368\n23225,2712\n23225,5212\n23225,7757\n23225,30331\n23226,23227\n23228,23229\n23228,129887\n23230,1201\n23231,217\n23232,4504\n23233,934\n23234,23235\n23234,28488\n23236,577\n23236,1105\n23237,23238\n23239,23238\n23240,72\n23241,8992\n23242,585\n23243,72\n23244,273\n23244,274\n23245,4453\n23246,818\n23247,23248\n23249,393\n23250,9195\n23252,1149\n23253,23254\n23255,23254\n23256,602\n23257,292\n23258,4453\n23259,294\n23260,296\n23261,298\n23262,5366\n23263,1381\n23264,275\n23265,2178\n23265,4545\n23265,139010\n23266,636\n23267,1313\n23268,272\n23269,104\n23270,136\n23271,703\n23272,21944\n23273,3161\n23274,23011\n23275,23276\n23277,233\n23278,298\n23279,485\n23280,23281\n23280,105942\n23282,163\n23283,920\n23284,163\n23285,1313\n23286,515\n23286,1127\n23286,1224\n23286,1381\n23286,1893\n23286,3999\n23287,313\n23287,477\n23287,536\n23287,1074\n23287,1617\n23287,1724\n23287,2168\n23287,2507\n23287,2553\n23287,4030\n23287,4234\n23287,5326\n23287,5458\n23287,6754\n23287,8410\n23287,13137\n23287,23287\n23287,23288\n23287,23295\n23287,23301\n23287,26028\n23287,45986\n23287,69882\n23287,73451\n23287,75193\n23287,76953\n23287,99103\n23287,102706\n23287,111289\n23287,111296\n23287,115401\n23287,122530\n23287,127158\n23287,144231\n23287,165586\n23287,181063\n23287,191355\n23287,207766\n23287,214105\n23287,216248\n23287,220076\n23287,248796\n23289,163\n23290,4611\n23291,1544\n23292,19986\n23293,581\n23294,760\n23296,861\n23296,868\n23296,1556\n23297,3161\n23298,298\n23299,485\n23300,7760\n23301,477\n23301,23287\n23302,934\n23303,781\n23304,163\n23305,1707\n23306,163\n23306,201298\n23307,299\n23308,23309\n23310,72\n23311,34\n23311,35\n23311,287\n23311,481\n23311,1696\n23311,1893\n23311,3830\n23311,6424\n23311,25395\n23312,163\n23313,366\n23314,312\n23314,358\n23314,510\n23315,366\n23317,366\n23318,46\n23319,1363\n23320,366\n23321,366\n23322,685\n23323,366\n23324,366\n23325,1858\n23326,1860\n23327,338\n23328,3258\n23328,6424\n23329,784\n23329,2006\n23330,3451\n23330,3452\n23331,835\n23331,1381\n23332,23333\n23332,101377\n23334,694\n23335,644\n23337,467\n23337,622\n23337,868\n23337,1033\n23337,1326\n23338,209\n23338,287\n23338,809\n23339,1559\n23340,408\n23341,252\n23341,318\n23342,364\n23343,1276\n23344,2681\n23344,31977\n23345,4903\n23346,1608\n23347,3413\n23348,163\n23349,595\n23349,1033\n23349,3193\n23349,6638\n23349,48505\n23350,19986\n23351,349\n23351,2372\n23351,148742\n23352,289\n23352,290\n23352,94134\n23354,818\n23355,292\n23356,184\n23357,911\n23358,1265\n23358,1266\n23359,647\n23360,344\n23361,163\n23361,302\n23362,330\n23362,536\n23362,994\n23362,1877\n23364,972\n23364,5469\n23365,58\n23365,1167\n23366,160\n23366,187\n23366,390\n23366,604\n23366,1257\n23366,1359\n23367,389\n23367,1072\n23368,841\n23369,2979\n23371,536\n23372,305\n23372,390\n23373,72\n23374,23375\n23376,272\n23376,485\n23376,1634\n23377,306\n23377,307\n23378,422\n23379,255\n23380,23381\n23382,304\n23382,525\n23382,1151\n23382,1212\n23382,1285\n23382,1309\n23382,1715\n23383,309\n23383,310\n23384,1\n23385,163\n23386,292\n23387,23388\n23387,140635\n23387,151965\n23389,309\n23389,310\n23391,206\n23392,248\n23393,671\n23394,10\n23395,1579\n23396,415\n23396,653\n23397,980\n23399,202\n23399,203\n23399,1392\n23400,835\n23401,305\n23402,1849\n23403,422\n23404,56\n23405,1749\n23405,14550\n23406,640\n23407,19\n23407,34\n23407,35\n23407,536\n23407,781\n23407,1618\n23407,2646\n23407,2944\n23407,17346\n23409,640\n23410,809\n23411,392\n23412,622\n23413,781\n23414,1007\n23414,68494\n23414,105821\n23415,647\n23416,344\n23417,187\n23418,360\n23418,1224\n23418,3177\n23418,3999\n23419,48\n23420,135\n23421,592\n23421,1133\n23422,433\n23425,500\n23426,2048\n23427,338\n23427,595\n23427,1151\n23427,1893\n23428,184\n23429,30\n23429,50\n23429,79\n23429,111\n23429,137\n23429,248\n23429,420\n23429,557\n23429,647\n23429,652\n23429,1019\n23429,1332\n23429,2312\n23429,5440\n23430,20\n23431,389\n23431,1072\n23432,953\n23433,1707\n23434,11\n23434,20\n23434,60\n23434,86\n23434,187\n23434,483\n23434,497\n23434,663\n23434,664\n23434,668\n23434,713\n23434,1087\n23434,1096\n23434,1130\n23434,1881\n23434,3999\n23434,5192\n23434,5540\n23434,9539\n23434,13136\n23434,41967\n23434,142879\n23435,21944\n23436,209\n23436,579\n23436,3769\n23437,167\n23437,685\n23437,1326\n23437,1599\n23437,3804\n23437,5130\n23437,20663\n23437,48006\n23437,122905\n23438,718\n23439,1722\n23440,1983\n23441,1983\n23442,187\n23442,1313\n23442,23442\n23443,996\n23444,996\n23445,1241\n23446,356\n23446,852\n23446,3422\n23448,671\n23449,184\n23451,330\n23452,134\n23452,636\n23452,760\n23453,788\n23454,2089\n23454,2940\n23454,21944\n23455,8235\n23456,657\n23456,1634\n23457,72\n23458,34\n23458,35\n23458,622\n23459,907\n23459,932\n23460,779\n23462,1891\n23462,3507\n23463,1068\n23463,1789\n23464,34\n23464,35\n23464,211\n23465,79\n23466,704\n23467,622\n23468,75912\n23469,309\n23469,310\n23469,431\n23469,1844\n23469,2443\n23469,3623\n23469,7124\n23469,7270\n23469,8990\n23469,16019\n23470,415\n23472,50\n23472,192\n23472,336\n23472,5726\n23472,16019\n23473,330\n23474,332\n23474,1888\n23474,1955\n23475,364\n23476,718\n23477,422\n23478,525\n23478,872\n23478,1181\n23478,1635\n23478,1749\n23478,1818\n23479,422\n23482,182\n23483,422\n23484,422\n23485,615\n23485,859\n23486,1058\n23488,250\n23489,422\n23490,649\n23491,68\n23492,2979\n23493,1188\n23495,5718\n23497,422\n23498,225\n23499,1298\n23500,79\n23502,30\n23502,104\n23502,23502\n23503,1983\n23504,622\n23504,6119\n23505,4455\n23506,72\n23506,312\n23507,32\n23507,285\n23507,392\n23507,918\n23507,1466\n23508,248\n23508,1332\n23509,2353\n23510,151\n23511,422\n23512,56\n23513,310\n23513,809\n23513,6556\n23514,66\n23514,467\n23514,868\n23514,1433\n23515,209\n23515,861\n23516,292\n23517,192\n23517,336\n23517,493\n23517,586\n23517,663\n23517,682\n23517,852\n23517,72439\n23517,221324\n23518,314\n23519,1556\n23520,222\n23520,455\n23520,467\n23520,657\n23520,2266\n23521,292\n23523,2506\n23524,2506\n23525,1070\n23526,518\n23526,1326\n23527,781\n23527,1653\n23528,26\n23528,59\n23529,280\n23529,306\n23529,307\n23529,557\n23529,920\n23529,973\n23529,17245\n23529,30331\n23530,2506\n23531,23532\n23533,2506\n23534,991\n23535,647\n23536,344\n23537,71\n23537,298\n23537,417\n23537,626\n23537,749\n23537,795\n23537,811\n23537,1070\n23537,1133\n23537,1285\n23537,1474\n23537,2590\n23537,2889\n23537,5405\n23538,918\n23539,805\n23539,5405\n23540,392\n23541,19\n23541,749\n23543,589\n23544,1068\n23545,3\n23545,932\n23545,8788\n23545,230509\n23545,230517\n23546,292\n23547,83\n23548,1977\n23548,1978\n23549,151\n23550,83\n23550,536\n23550,4672\n23550,18831\n23551,298\n23552,485\n23553,389\n23554,743\n23556,1085\n23557,23558\n23559,6068\n23563,671\n23564,5405\n23565,972\n23565,973\n23565,5547\n23565,148742\n23566,406\n23567,1043\n23568,1001\n23569,346\n23570,37\n23570,611\n23570,1449\n23570,1782\n23571,5405\n23572,10\n23573,389\n23573,596\n23575,3069\n23576,818\n23577,340\n23577,668\n23578,338\n23578,1224\n23579,4504\n23581,1858\n23582,1860\n23583,392\n23584,1224\n23585,305\n23586,17334\n23587,527\n23587,743\n23587,23588\n23589,5405\n23591,2351\n23592,392\n23593,5405\n23594,433\n23595,10\n23596,1033\n23596,1789\n23597,567\n23597,1293\n23598,72\n23599,298\n23600,485\n23601,72\n23602,264\n23603,718\n23604,5405\n23604,189303\n23605,72\n23606,3474\n23607,4453\n23608,392\n23608,697\n23608,15609\n23609,107\n23609,111\n23609,1149\n23609,1462\n23609,8537\n23610,1085\n23611,104\n23611,557\n23611,953\n23611,954\n23612,137\n23612,1143\n23612,1240\n23612,1293\n23612,1616\n23612,2411\n23612,2605\n23612,3538\n23612,75912\n23613,5405\n23614,2312\n23615,1559\n23616,65\n23616,66\n23616,302\n23616,314\n23616,467\n23616,1284\n23616,1433\n23617,248\n23619,2572\n23620,302\n23621,579\n23622,4190\n23623,215\n23623,366\n23623,8180\n23624,250\n23624,1684\n23627,2334\n23628,298\n23629,485\n23630,104\n23630,557\n23630,1939\n23631,44\n23632,163\n23633,50\n23633,79\n23633,149\n23633,337\n23633,406\n23633,422\n23633,1181\n23633,1385\n23633,30365\n23634,120\n23634,261\n23634,1240\n23634,1309\n23634,2436\n23635,500\n23636,1467\n23637,1962\n23638,1052\n23639,1882\n23640,2775\n23641,54\n23642,2210\n23642,4237\n23643,571\n23643,827\n23644,1313\n23645,1433\n23646,673\n23647,1436\n23648,931\n23649,3967\n23651,1220\n23651,1222\n23652,252\n23653,251\n23654,248\n23654,557\n23656,1836\n23657,862\n23658,406\n23659,1\n23660,3161\n23661,907\n23662,516\n23662,994\n23662,1181\n23662,1243\n23662,2867\n23662,2868\n23663,4220\n23664,32\n23664,626\n23664,1653\n23664,4771\n23665,772\n23666,818\n23667,503\n23667,1370\n23667,1522\n23667,2296\n23667,9025\n23668,140\n23668,160\n23668,515\n23668,1052\n23668,1224\n23669,41\n23669,50\n23669,83\n23669,87\n23669,158\n23669,195\n23669,264\n23669,269\n23669,301\n23669,309\n23669,310\n23669,333\n23669,364\n23669,433\n23669,516\n23669,595\n23669,615\n23669,622\n23669,644\n23669,702\n23669,703\n23669,720\n23669,736\n23669,760\n23669,779\n23669,862\n23669,872\n23669,877\n23669,949\n23669,1082\n23669,1143\n23669,1151\n23669,1179\n23669,1210\n23669,1220\n23669,1222\n23669,1235\n23669,1240\n23669,1298\n23669,1300\n23669,1335\n23669,1400\n23669,1452\n23669,1465\n23669,1515\n23669,1579\n23669,1718\n23669,1849\n23669,1888\n23669,1939\n23669,1955\n23669,2210\n23669,4237\n23669,6298\n23669,13661\n23669,32784\n23669,55849\n23669,145502\n23669,182162\n23670,5405\n23672,827\n23673,1298\n23674,685\n23675,1326\n23676,5405\n23677,1282\n23678,626\n23679,19986\n23680,23011\n23681,4411\n23682,586\n23683,120\n23683,240\n23684,626\n23685,500\n23686,1962\n23687,1052\n23688,1882\n23689,2775\n23690,54\n23691,2210\n23691,4237\n23692,1\n23692,160\n23692,794\n23692,1345\n23692,1847\n23693,211\n23693,255\n23693,720\n23694,887\n23695,1019\n23696,872\n23700,2779\n23701,23701\n23702,389\n23703,21944\n23704,1235\n23704,1335\n23705,313\n23705,852\n23706,1579\n23707,126\n23707,299\n23708,146\n23709,126\n23709,299\n23711,222\n23711,949\n23711,1881\n23711,1955\n23711,2266\n23712,309\n23712,310\n23713,1227\n23713,1229\n23714,87\n23715,104\n23715,225\n23715,364\n23715,953\n23715,1179\n23715,1332\n23715,1368\n23715,5405\n23716,206\n23716,209\n23716,302\n23716,579\n23717,247\n23719,134\n23720,1133\n23721,1749\n23722,779\n23722,1425\n23722,1515\n23723,1285\n23724,2353\n23725,333\n23726,907\n23726,932\n23728,968\n23728,1740\n23729,146\n23729,2923\n23730,1240\n23732,272\n23733,315\n23734,252\n23734,318\n23734,1220\n23734,1222\n23734,41170\n23735,1309\n23736,1227\n23736,1229\n23736,2089\n23736,2940\n23736,21944\n23736,86416\n23737,483\n23737,805\n23737,1659\n23737,1962\n23737,6556\n23737,136072\n23738,41\n23738,42\n23739,34\n23739,35\n23740,178\n23740,1434\n23740,1566\n23740,5356\n23740,22455\n23740,23741\n23740,26730\n23740,31224\n23740,38392\n23740,62319\n23740,120043\n23740,133554\n23740,151093\n23740,181637\n23740,182403\n23740,183312\n23740,216044\n23740,230394\n23740,254933\n23742,4\n23742,5\n23742,137\n23742,151\n23742,491\n23742,1381\n23743,452\n23744,422\n23745,104\n23745,137\n23745,215\n23745,248\n23745,636\n23745,1016\n23745,1282\n23745,8993\n23746,171\n23746,424\n23746,1639\n23746,3295\n23746,3296\n23746,17886\n23747,887\n23747,994\n23748,808\n23749,147\n23750,438\n23751,420\n23752,1572\n23753,422\n23754,314\n23754,868\n23755,200\n23755,1319\n23756,2274\n23757,1836\n23758,509\n23759,111\n23760,13745\n23761,1590\n23762,349\n23763,32\n23764,392\n23765,779\n23766,1240\n23767,809\n23768,1151\n23770,26\n23770,59\n23770,430\n23770,1235\n23770,1335\n23771,192\n23771,366\n23772,1663\n23773,1634\n23773,1655\n23774,717\n23775,146\n23775,92476\n23775,106502\n23776,557\n23777,83\n23777,1962\n23779,346\n23780,1579\n23780,1749\n23781,718\n23782,315\n23783,1\n23783,55\n23783,56\n23783,79\n23783,99\n23783,146\n23783,147\n23783,192\n23783,333\n23783,336\n23783,422\n23783,425\n23783,446\n23783,602\n23783,841\n23783,1089\n23783,1181\n23783,1218\n23783,1623\n23783,1825\n23783,1969\n23783,2244\n23783,2374\n23783,3970\n23783,5800\n23783,6119\n23783,7456\n23783,14091\n23783,17151\n23783,20360\n23783,22616\n23783,23783\n23783,24150\n23783,24701\n23783,30331\n23783,30498\n23783,44872\n23783,44876\n23783,60576\n23783,62290\n23783,62291\n23783,62294\n23783,62326\n23783,62423\n23783,63450\n23783,71266\n23783,75155\n23783,82104\n23783,82354\n23783,93070\n23783,93593\n23783,96761\n23783,96765\n23783,96862\n23783,96934\n23783,102465\n23783,103154\n23783,103157\n23783,103160\n23783,103221\n23783,106385\n23783,106387\n23783,114969\n23783,115341\n23783,124045\n23783,145072\n23783,148058\n23783,148104\n23783,153001\n23783,155085\n23783,157110\n23783,175985\n23783,177568\n23783,191378\n23783,198548\n23783,204124\n23783,208029\n23783,213779\n23783,223821\n23783,224108\n23783,237278\n23783,257795\n23785,23786\n23785,47350\n23785,52005\n23785,54814\n23785,61041\n23785,78212\n23785,81175\n23785,85148\n23785,98505\n23785,98682\n23785,104231\n23785,105092\n23785,111807\n23787,1590\n23787,1644\n23788,1381\n23789,42\n23790,30\n23790,328\n23791,493\n23792,1151\n23792,1711\n23792,1836\n23793,2436\n23794,861\n23795,2671\n23796,217\n23797,83\n23798,206\n23799,225\n23799,301\n23799,615\n23799,968\n23799,1782\n23799,5961\n23800,509\n23800,510\n23801,462\n23802,907\n23802,932\n23803,4\n23803,5\n23803,11\n23803,20\n23803,115\n23803,118\n23803,160\n23803,611\n23804,5405\n23805,1140\n23806,703\n23806,1740\n23807,1127\n23807,1893\n23808,104\n23809,315\n23809,980\n23809,2006\n23811,42\n23811,23811\n23812,5547\n23813,1571\n23814,23815\n23816,406\n23816,779\n23817,107\n23818,44\n23819,366\n23820,104\n23820,202\n23820,203\n23820,1181\n23820,1955\n23821,3507\n23822,72\n23822,111\n23822,312\n23822,1052\n23822,3695\n23823,5405\n23824,657\n23825,1836\n23826,772\n23827,5405\n23828,1119\n23828,1462\n23828,8537\n23829,23830\n23831,267\n23832,107\n23832,111\n23832,4771\n23833,298\n23834,485\n23835,58\n23835,104\n23835,442\n23835,609\n23835,749\n23835,801\n23835,1140\n23835,1147\n23835,1449\n23835,1882\n23835,2163\n23835,2181\n23835,2334\n23835,2443\n23835,3473\n23835,3474\n23835,4049\n23835,5547\n23835,6569\n23835,7182\n23835,13538\n23835,20787\n23835,26244\n23835,26936\n23835,34163\n23835,36721\n23835,36999\n23835,46245\n23835,59742\n23835,65689\n23835,74489\n23835,77709\n23835,80147\n23835,81991\n23835,83874\n23835,88417\n23835,88449\n23835,113930\n23836,2334\n23837,5405\n23838,151\n23839,222\n23839,385\n23839,536\n23840,2353\n23841,515\n23841,652\n23842,23843\n23842,108670\n23842,132760\n23845,356\n23845,615\n23845,852\n23845,1167\n23846,23847\n23848,301\n23848,444\n23848,968\n23849,602\n23850,68\n23850,186\n23850,193129\n23851,503\n23851,704\n23852,298\n23853,485\n23854,779\n23854,1776\n23854,68069\n23856,406\n23859,2944\n23860,1983\n23861,733\n23861,920\n23861,1619\n23861,1623\n23861,1927\n23862,8990\n23863,596\n23863,615\n23863,1429\n23864,298\n23865,485\n23866,83\n23867,1181\n23868,1179\n23869,146\n23870,1133\n23872,2867\n23872,2868\n23873,107\n23873,749\n23873,1146\n23874,718\n23875,452\n23875,457\n23875,497\n23875,535\n23875,1655\n23876,422\n23891,23783\n23899,392\n23908,147\n23908,406\n23908,779\n23910,4193\n23910,8907\n23911,779\n23911,4193\n23912,4193\n23912,21442\n23915,953\n23926,406\n23926,779\n23926,1181\n23927,1\n23927,147\n23927,406\n23931,1515\n23937,158\n23941,147\n23941,158\n23941,285\n23941,406\n23941,779\n23941,1515\n23941,4193\n23941,21442\n23943,779\n23944,21944\n23948,779\n23948,1515\n23954,147\n23954,779\n23954,68069\n23963,247\n23967,4193\n23970,1515\n23972,65\n23987,192\n23991,158\n23991,192\n23991,285\n23991,406\n23991,779\n23991,1515\n23991,4193\n23999,158\n23999,333\n24021,285\n24021,779\n24021,1515\n24021,16341\n24021,24021\n24021,24055\n24021,24172\n24021,130532\n24021,243656\n24021,243935\n24021,243972\n24021,244083\n24021,245290\n24021,245875\n24021,245902\n24021,246160\n24021,249833\n24021,250372\n24021,250927\n24021,251282\n24021,251781\n24034,718\n24036,1551\n24045,147\n24045,158\n24045,779\n24045,1181\n24045,1515\n24045,68069\n24056,147\n24056,779\n24056,1515\n24060,206\n24065,158\n24066,79\n24066,149\n24066,275\n24066,622\n24066,1623\n24073,147\n24073,158\n24074,1181\n24084,4193\n24089,58\n24090,21442\n24095,779\n24106,149\n24107,907\n24107,1284\n24107,2191\n24107,148742\n24110,83\n24110,24111\n24110,68078\n24113,1515\n24113,68069\n24128,26\n24128,59\n24128,430\n24128,887\n24128,1235\n24128,1335\n24128,21944\n24129,158\n24131,779\n24131,1425\n24136,4192\n24136,4193\n24137,1\n24148,1515\n24156,920\n24161,158\n24161,406\n24161,779\n24161,1181\n24161,1515\n24162,333\n24164,149\n24164,158\n24164,406\n24164,779\n24164,1370\n24164,1515\n24166,620\n24166,779\n24168,1181\n24170,158\n24170,285\n24170,406\n24170,779\n24170,1181\n24170,1515\n24172,158\n24172,1515\n24172,4193\n24173,158\n24173,406\n24173,663\n24173,664\n24173,779\n24173,1181\n24173,1515\n24174,147\n24174,158\n24174,80266\n24176,147\n24176,158\n24176,1181\n24180,5405\n24182,195\n24182,406\n24182,779\n24183,779\n24184,779\n24184,4193\n24184,145222\n24185,779\n24185,1515\n24186,158\n24186,4193\n24187,406\n24187,779\n24187,1515\n24191,147\n24191,158\n24191,406\n24191,779\n24191,1181\n24191,1515\n24198,1\n24198,195\n24198,406\n24198,779\n24198,1515\n24202,779\n24203,779\n24206,147\n24208,278\n24208,406\n24211,285\n24211,779\n24217,32\n24217,44\n24217,106\n24217,215\n24217,240\n24217,251\n24217,252\n24217,254\n24217,272\n24217,289\n24217,290\n24217,301\n24217,323\n24217,332\n24217,336\n24217,337\n24217,392\n24217,393\n24217,430\n24217,493\n24217,525\n24217,592\n24217,615\n24217,671\n24217,788\n24217,907\n24217,925\n24217,968\n24217,1001\n24217,1010\n24217,1016\n24217,1033\n24217,1231\n24217,1235\n24217,1282\n24217,1335\n24217,1388\n24217,1425\n24217,1531\n24217,1722\n24217,1732\n24217,1782\n24217,1955\n24217,1963\n24217,2210\n24217,2379\n24217,2567\n24217,2620\n24217,3085\n24217,3115\n24217,3148\n24217,3317\n24217,3321\n24217,3804\n24217,4237\n24217,4455\n24217,6803\n24217,9007\n24220,158\n24220,406\n24220,779\n24220,1181\n24220,1515\n24221,158\n24222,192\n24228,4193\n24229,779\n24230,147\n24230,158\n24233,406\n24234,278\n24235,779\n24236,217\n24236,536\n24236,2797\n24237,251\n24237,465\n24237,516\n24237,1512\n24237,5992\n24239,626\n24240,3193\n24241,376\n24242,682\n24242,72439\n24243,104\n24243,134\n24243,135\n24245,2351\n24246,920\n24247,7614\n24248,752\n24248,17263\n24249,8270\n24250,3872\n24251,135\n24252,4193\n24253,1453\n24256,24257\n24258,158\n24259,8788\n24260,14989\n24261,202\n24261,203\n24262,779\n24263,72\n24264,248\n24265,1882\n24266,13980\n24267,24268\n24269,647\n24270,450\n24271,344\n24272,182\n24273,217\n24274,34\n24274,35\n24274,634\n24274,2224\n24274,2319\n24274,115474\n24275,182\n24276,1181\n24277,83\n24278,188\n24279,188\n24281,247\n24282,687\n24283,596\n24283,843\n24283,918\n24283,1531\n24284,72\n24285,6263\n24286,481\n24288,431\n24288,784\n24289,261\n24290,240\n24291,24292\n24293,275\n24294,7\n24295,24296\n24297,1181\n24298,217\n24299,83\n24300,250\n24301,515\n24302,247\n24303,1962\n24304,278\n24305,65\n24306,723\n24307,240\n24307,3328\n24307,24307\n24307,43436\n24307,43438\n24307,43442\n24308,240\n24309,22\n24310,17228\n24311,875\n24312,557\n24313,557\n24314,24315\n24316,9121\n24317,2266\n24318,2590\n24319,146\n24319,3538\n24320,2178\n24320,4545\n24321,77\n24322,3079\n24323,1\n24324,86\n24325,130\n24325,36819\n24326,58\n24327,255\n24328,388\n24329,875\n24330,640\n24331,24332\n24332,24332\n24333,3193\n24334,2557\n24335,3999\n24336,30\n24337,146\n24338,605\n24339,1\n24340,278\n24341,200\n24341,1177\n24341,2210\n24341,4237\n24341,182162\n24342,3507\n24343,143\n24344,72\n24345,344\n24346,285\n24347,3\n24347,81\n24347,240\n24347,289\n24347,290\n24347,592\n24347,704\n24347,714\n24347,1007\n24347,1010\n24347,1210\n24347,1231\n24347,1326\n24347,1411\n24347,1436\n24347,1564\n24347,1715\n24347,1818\n24347,1849\n24347,1955\n24347,2045\n24347,2083\n24347,3193\n24347,3507\n24347,3804\n24348,707\n24348,931\n24348,2668\n24348,2779\n24349,72\n24350,87\n24350,1454\n24351,647\n24352,44\n24353,146\n24354,356\n24354,852\n24355,1227\n24355,1229\n24355,21944\n24356,58\n24356,1140\n24357,2923\n24358,178\n24358,211\n24358,1891\n24359,595\n24359,818\n24359,985\n24359,1313\n24359,3252\n24359,81648\n24360,119\n24360,120\n24360,217\n24360,850\n24360,19519\n24361,406\n24362,323\n24363,1265\n24363,1266\n24364,1167\n24365,873\n24365,1210\n24366,5405\n24367,10\n24368,24369\n24370,3260\n24371,1893\n24372,192\n24373,24374\n24375,259\n24376,24377\n24376,56768\n24376,57474\n24378,2506\n24379,2506\n24380,2506\n24381,2506\n24382,2506\n24383,63\n24384,149\n24385,1085\n24386,83\n24387,24388\n24387,43049\n24387,71144\n24390,72\n24391,72\n24392,143\n24393,24394\n24393,26556\n24393,51073\n24393,58546\n24393,130830\n24393,131414\n24393,151771\n24393,199470\n24393,215043\n24393,215767\n24395,671\n24396,250\n24397,634\n24398,202\n24398,203\n24398,2931\n24398,3872\n24399,515\n24400,376\n24401,885\n24402,920\n24403,954\n24403,10318\n24404,83\n24405,192\n24405,393\n24405,779\n24405,6119\n24406,2995\n24407,15573\n24408,1\n24409,7416\n24410,1133\n24411,247\n24412,9195\n24413,4101\n24414,7\n24415,7652\n24416,202\n24416,203\n24416,925\n24417,24418\n24419,24420\n24421,333\n24422,5547\n24422,24423\n24422,37288\n24422,47932\n24422,68069\n24424,72\n24425,707\n24426,2590\n24427,3960\n24428,920\n24429,422\n24430,56\n24431,71\n24431,811\n24431,1070\n24431,1113\n24431,1368\n24431,1634\n24431,1881\n24431,3724\n24431,28107\n24431,142879\n24432,147\n24433,8788\n24434,2351\n24435,579\n24436,640\n24437,682\n24438,24439\n24440,273\n24440,274\n24441,24442\n24443,801\n24444,140\n24445,175\n24446,801\n24447,1238\n24447,1663\n24448,3148\n24449,7360\n24450,1001\n24451,222\n24452,298\n24452,615\n24452,652\n24452,859\n24452,1127\n24452,1287\n24452,2719\n24452,3148\n24452,5405\n24452,6323\n24452,28755\n24453,261\n24454,640\n24455,94\n24455,219\n24455,712\n24455,1515\n24455,2787\n24455,2923\n24455,9457\n24456,2681\n24457,211\n24458,24459\n24458,27839\n24458,37536\n24458,45898\n24458,58723\n24458,96750\n24458,100115\n24458,104239\n24458,107837\n24460,116\n24460,994\n24460,2087\n24460,2590\n24461,497\n24461,1655\n24461,4165\n24462,24463\n24462,35228\n24462,53049\n24462,53454\n24462,54093\n24462,78276\n24462,80678\n24462,83586\n24462,95063\n24464,702\n24464,703\n24465,2135\n24466,1\n24466,149\n24466,2924\n24467,24468\n24470,1433\n24471,6263\n24472,233\n24473,1844\n24474,1151\n24474,1711\n24474,1836\n24475,24476\n24477,652\n24478,1381\n24479,21944\n24480,7124\n24481,171\n24482,24483\n24484,9011\n24484,9032\n24485,79\n24486,366\n24487,255\n24488,733\n24488,920\n24488,1619\n24489,781\n24490,2506\n24492,4611\n24493,1544\n24494,6179\n24494,6180\n24495,7572\n24496,1556\n24497,9029\n24498,24499\n24498,82393\n24500,292\n24500,441\n24500,1722\n24500,3830\n24501,872\n24502,298\n24503,485\n24504,24505\n24506,932\n24507,346\n24507,2116\n24508,1241\n24509,272\n24512,3451\n24512,3452\n24513,163\n24514,4193\n24515,1359\n24516,4611\n24517,1544\n24518,644\n24519,24520\n24521,137\n24522,1414\n24523,160\n24523,264\n24523,360\n24523,515\n24523,718\n24523,783\n24523,1052\n24523,1127\n24523,1147\n24523,1298\n24523,1509\n24523,1572\n24523,1688\n24523,1749\n24523,1882\n24523,2626\n24523,2697\n24523,81070\n24523,191860\n24524,10\n24525,302\n24526,209\n24527,283\n24527,544\n24527,589\n24528,620\n24529,58\n24530,46\n24532,349\n24533,577\n24534,79\n24535,26\n24535,59\n24535,106\n24535,134\n24535,137\n24535,264\n24535,285\n24535,703\n24535,972\n24535,1511\n24535,3069\n24535,4355\n24535,5405\n24535,141912\n24536,595\n24537,595\n24538,611\n24539,1414\n24539,6119\n24541,4903\n24542,1392\n24543,1417\n24545,146\n24547,163\n24547,209\n24547,302\n24547,579\n24547,861\n24547,893\n24547,1556\n24547,3653\n24548,366\n24549,366\n24550,366\n24552,366\n24553,366\n24554,366\n24555,366\n24556,306\n24556,307\n24557,1147\n24558,1019\n24558,1276\n24559,207\n24560,743\n24560,23588\n24561,1402\n24562,972\n24562,75912\n24563,50\n24563,79\n24563,147\n24563,158\n24564,349\n24564,3260\n24565,192\n24565,217\n24565,259\n24565,272\n24565,333\n24565,389\n24565,406\n24565,435\n24565,516\n24565,788\n24565,818\n24565,920\n24565,1010\n24565,1181\n24565,1370\n24565,1388\n24565,1531\n24565,1659\n24565,2266\n24566,106\n24567,1010\n24568,182\n24569,422\n24570,56\n24571,875\n24572,602\n24572,3218\n24573,1644\n24574,718\n24574,893\n24575,65\n24576,54\n24576,676\n24576,1556\n24576,2105\n24577,640\n24578,640\n24579,347\n24579,762\n24579,1479\n24579,1837\n24580,1011\n24580,1849\n24581,2787\n24582,94\n24583,356\n24583,852\n24583,5591\n24584,72\n24585,949\n24585,1012\n24585,2253\n24586,24587\n24586,35260\n24586,38369\n24586,39331\n24586,43732\n24586,43848\n24586,45143\n24586,57977\n24588,1298\n24589,30\n24589,72\n24589,184\n24589,202\n24589,233\n24589,1381\n24589,8373\n24590,718\n24590,760\n24591,7\n24592,1860\n24592,6955\n24593,1849\n24594,652\n24595,920\n24596,366\n24597,5591\n24598,1102\n24599,79\n24600,71\n24600,251\n24600,304\n24600,417\n24600,489\n24600,557\n24600,749\n24600,852\n24600,1309\n24601,682\n24602,349\n24602,392\n24602,1769\n24604,302\n24604,2116\n24605,818\n24606,875\n24607,65\n24607,149\n24607,467\n24608,805\n24609,9195\n24610,68\n24610,387\n24611,772\n24612,567\n24613,631\n24613,760\n24613,1462\n24613,8537\n24615,567\n24616,3367\n24617,1151\n24618,137\n24618,431\n24618,557\n24618,5405\n24619,200\n24619,298\n24619,1177\n24619,48505\n24620,671\n24621,652\n24622,5405\n24623,63\n24624,850\n24625,87\n24625,1836\n24627,167\n24627,301\n24627,968\n24627,1522\n24627,2083\n24627,73570\n24628,83\n24628,222\n24628,5343\n24628,13980\n24630,2089\n24630,2940\n24630,21944\n24631,827\n24633,698\n24634,497\n24635,138\n24637,422\n24638,422\n24639,422\n24640,422\n24641,455\n24641,1454\n24642,389\n24643,422\n24644,760\n24645,422\n24647,3413\n24648,195\n24648,779\n24649,195\n24649,1188\n24650,344\n24650,577\n24651,58\n24652,46\n24653,34\n24653,1417\n24653,1571\n24653,1718\n24653,4594\n24653,6888\n24653,13980\n24654,97\n24654,273\n24654,274\n24654,346\n24654,1012\n24654,3538\n24655,163\n24656,1014\n24657,302\n24658,309\n24658,310\n24659,106\n24659,346\n24659,447\n24659,1294\n24659,3718\n24659,4449\n24659,5204\n24659,5728\n24659,8170\n24659,15355\n24659,24659\n24659,29578\n24659,96718\n24659,139522\n24659,158289\n24659,175344\n24659,178163\n24659,189128\n24659,189130\n24659,189854\n24659,189879\n24659,190492\n24659,193101\n24659,193596\n24659,194904\n24659,194988\n24659,212914\n24659,213989\n24659,215224\n24659,215511\n24659,215937\n24659,216164\n24659,216737\n24659,217592\n24659,222036\n24659,222446\n24659,226447\n24659,226558\n24659,227030\n24659,229040\n24659,229869\n24659,230417\n24659,230916\n24659,235806\n24659,235809\n24659,235816\n24659,245834\n24659,248671\n24659,248674\n24659,251288\n24659,251886\n24659,253174\n24659,254836\n24659,254849\n24659,255006\n24659,255565\n24659,260363\n24660,24661\n24662,10\n24663,1298\n24664,439\n24666,163\n24666,326\n24666,1805\n24667,893\n24670,302\n24671,117\n24671,330\n24671,1240\n24671,1465\n24671,2712\n24671,2782\n24671,4549\n24671,4594\n24671,8854\n24672,222\n24672,760\n24673,1140\n24674,861\n24677,2867\n24677,2868\n24679,697\n24680,19010\n24681,875\n24682,467\n24682,872\n24683,843\n24685,843\n24686,510\n24688,34\n24688,35\n24688,77\n24688,83\n24688,111\n24688,217\n24688,222\n24688,261\n24688,283\n24688,313\n24688,323\n24688,349\n24688,379\n24688,388\n24688,392\n24688,455\n24688,493\n24688,536\n24688,577\n24688,623\n24688,694\n24688,859\n24688,862\n24688,949\n24688,1072\n24688,1201\n24688,1240\n24688,1274\n24688,1454\n24688,1465\n24688,1467\n24688,1564\n24688,1590\n24688,1608\n24688,1644\n24688,1722\n24688,1927\n24688,2266\n24688,2274\n24688,2671\n24688,2699\n24688,2784\n24688,2931\n24688,2979\n24688,2989\n24688,2991\n24688,3135\n24688,3182\n24688,3252\n24688,3538\n24688,4549\n24688,4594\n24688,4637\n24688,6638\n24688,7092\n24688,13546\n24688,14126\n24688,29475\n24690,1370\n24690,2775\n24691,192\n24692,392\n24693,850\n24694,2506\n24695,192\n24695,477\n24695,4548\n24696,222\n24697,1506\n24699,24700\n24702,850\n24703,2373\n24704,3\n24704,34\n24704,35\n24704,37\n24704,54\n24704,63\n24704,68\n24704,72\n24704,81\n24704,86\n24704,104\n24704,111\n24704,120\n24704,136\n24704,140\n24704,158\n24704,178\n24704,192\n24704,215\n24704,217\n24704,222\n24704,227\n24704,233\n24704,240\n24704,248\n24704,283\n24704,294\n24704,296\n24704,301\n24704,304\n24704,312\n24704,315\n24704,328\n24704,333\n24704,346\n24704,349\n24704,358\n24704,383\n24704,388\n24704,389\n24704,390\n24704,392\n24704,417\n24704,439\n24704,444\n24704,455\n24704,509\n24704,510\n24704,515\n24704,518\n24704,525\n24704,586\n24704,589\n24704,592\n24704,595\n24704,605\n24704,622\n24704,626\n24704,671\n24704,687\n24704,697\n24704,704\n24704,714\n24704,717\n24704,718\n24704,720\n24704,752\n24704,801\n24704,850\n24704,862\n24704,873\n24704,875\n24704,907\n24704,919\n24704,932\n24704,934\n24704,968\n24704,973\n24704,1001\n24704,1010\n24704,1016\n24704,1052\n24704,1072\n24704,1085\n24704,1102\n24704,1122\n24704,1133\n24704,1140\n24704,1151\n24704,1167\n24704,1175\n24704,1177\n24704,1179\n24704,1201\n24704,1210\n24704,1231\n24704,1240\n24704,1265\n24704,1266\n24704,1274\n24704,1282\n24704,1289\n24704,1298\n24704,1332\n24704,1353\n24704,1368\n24704,1381\n24704,1429\n24704,1436\n24704,1465\n24704,1467\n24704,1522\n24704,1544\n24704,1551\n24704,1564\n24704,1572\n24704,1579\n24704,1590\n24704,1634\n24704,1644\n24704,1715\n24704,1722\n24704,1745\n24704,1767\n24704,1782\n24704,1801\n24704,1837\n24704,1849\n24704,1871\n24704,1881\n24704,1882\n24704,1893\n24704,1939\n24704,1955\n24704,1977\n24704,1978\n24704,2045\n24704,2083\n24704,2191\n24704,2224\n24704,2266\n24704,2421\n24704,2424\n24704,2434\n24704,2443\n24704,2557\n24704,2620\n24704,2646\n24704,2701\n24704,2784\n24704,2989\n24704,2991\n24704,3138\n24704,3193\n24704,3194\n24704,3207\n24704,3218\n24704,3422\n24704,3474\n24704,3507\n24704,3538\n24704,3695\n24704,3999\n24704,4453\n24704,4549\n24704,4594\n24704,4637\n24704,4771\n24704,5405\n24704,5440\n24704,5662\n24704,5718\n24704,5906\n24704,5987\n24704,6068\n24704,6298\n24704,6955\n24704,7270\n24704,7572\n24704,8798\n24704,9001\n24704,9029\n24704,9098\n24704,14483\n24704,14797\n24704,24763\n24704,35486\n24705,4980\n24706,79\n24707,673\n24707,1172\n24707,2373\n24707,5212\n24708,298\n24709,485\n24710,298\n24711,485\n24712,1298\n24713,1673\n24715,1551\n24715,3041\n24716,58\n24717,4549\n24718,1983\n24719,920\n24719,1849\n24719,32784\n24720,500\n24721,163\n24722,1179\n24722,1305\n24723,493\n24724,710\n24725,1181\n24725,2528\n24726,4611\n24727,1544\n24728,1130\n24729,81\n24730,1070\n24731,1240\n24733,292\n24733,1449\n24733,37414\n24735,1805\n24736,2995\n24737,9560\n24738,379\n24739,104\n24739,254\n24739,557\n24739,953\n24739,954\n24739,1939\n24740,515\n24740,4831\n24740,142426\n24741,192\n24741,663\n24741,664\n24742,2782\n24743,868\n24744,459\n24745,65\n24746,1983\n24750,907\n24750,932\n24751,577\n24751,1429\n24751,1608\n24752,182\n24753,760\n24754,21944\n24755,379\n24755,2784\n24756,192\n24757,273\n24757,274\n24757,360\n24757,372\n24757,710\n24757,818\n24757,1118\n24758,949\n24760,107\n24760,483\n24761,467\n24761,710\n24761,2496\n24762,46\n24762,58\n24762,130\n24762,160\n24762,259\n24762,302\n24762,459\n24762,483\n24762,535\n24762,1052\n24762,1113\n24762,1127\n24762,1313\n24762,1805\n24762,2923\n24762,3474\n24762,6059\n24762,17897\n24762,19413\n24762,217854\n24763,499\n24763,45436\n24764,15\n24764,2292\n24764,2889\n24765,1977\n24765,1978\n24766,1203\n24766,1955\n24767,298\n24768,485\n24769,743\n24770,79\n24770,240\n24770,516\n24771,1010\n24772,5405\n24773,636\n24773,772\n24775,586\n24776,717\n24777,302\n24777,2116\n24778,50\n24779,2173\n24780,44\n24781,134\n24781,344\n24781,557\n24781,636\n24781,1844\n24782,1436\n24783,192\n24784,195\n24785,302\n24786,389\n24787,1210\n24788,450\n24789,200\n24789,772\n24790,287\n24790,595\n24790,809\n24791,134\n24791,636\n24791,1844\n24792,403\n24792,1127\n24792,2460\n24793,7\n24794,920\n24794,2319\n24796,392\n24797,5540\n24798,298\n24799,485\n24800,2668\n24801,623\n24801,1240\n24801,1590\n24801,1644\n24801,1805\n24802,567\n24804,1400\n24805,10\n24806,79\n24807,588\n24807,590\n24807,8180\n24808,1619\n24809,8072\n24809,8332\n24810,302\n24810,973\n24810,1188\n24810,6303\n24812,615\n24812,1265\n24812,1266\n24812,31934\n24813,21944\n24814,1309\n24815,167\n24815,240\n24815,818\n24816,1858\n24817,1326\n24817,4411\n24818,21944\n24819,1188\n24819,2292\n24820,356\n24820,1381\n24821,338\n24821,1127\n24821,1722\n24821,1893\n24822,911\n24823,5405\n24824,217\n24826,30\n24826,328\n24826,4355\n24827,163\n24827,192\n24828,1309\n24829,163\n24830,298\n24831,485\n24832,336\n24832,1163\n24832,8055\n24833,292\n24834,107\n24835,50\n24835,285\n24835,779\n24835,1425\n24835,1515\n24835,68069\n24835,118336\n24835,141912\n24835,180487\n24837,50\n24837,726\n24837,859\n24837,4177\n24838,1011\n24839,372\n24839,390\n24839,588\n24839,590\n24839,631\n24839,714\n24839,1309\n24839,1631\n24839,1635\n24839,2812\n24840,248\n24840,450\n24840,1332\n24840,5405\n24841,673\n24841,868\n24842,41\n24842,1608\n24844,1179\n24845,119\n24845,358\n24845,30331\n24845,255911\n24846,58\n24847,457\n24848,79\n24849,83\n24851,240\n24851,372\n24851,1001\n24851,1479\n24852,723\n24853,595\n24855,272\n24856,143\n24857,1836\n24858,509\n24859,1590\n24860,349\n24861,2274\n24862,5987\n24863,111\n24864,13745\n24865,32\n24866,392\n24867,779\n24868,697\n24869,8798\n24870,809\n24871,1240\n24872,3260\n24873,1836\n24874,287\n24876,261\n24876,493\n24876,1927\n24877,222\n24877,278\n24877,467\n24878,178\n24878,302\n24878,579\n24878,1220\n24878,1222\n24879,302\n24879,579\n24879,861\n24879,2116\n24880,302\n24881,192\n24882,1359\n24883,171\n24884,158\n24885,83\n24885,536\n24885,4672\n24885,7092\n24885,18831\n24886,364\n24886,442\n24886,749\n24886,2315\n24887,588\n24887,590\n24887,784\n24887,2775\n24888,302\n24889,313\n24889,707\n24889,2421\n24890,7614\n24891,298\n24892,485\n24893,827\n24894,79\n24895,349\n24895,779\n24896,240\n24896,1818\n24897,1235\n24897,1335\n24898,1188\n24899,1551\n24899,3041\n24900,192\n24901,264\n24902,1001\n24903,151\n24903,663\n24903,664\n24904,298\n24905,485\n24906,364\n24906,805\n24906,1068\n24906,2590\n24906,4220\n24906,7194\n24907,217\n24907,536\n24908,483\n24909,1659\n24910,364\n24910,583\n24910,609\n24910,1707\n24910,2775\n24911,644\n24912,1893\n24912,2051\n24913,247\n24914,795\n24914,6789\n24915,1151\n24917,222\n24917,2266\n24918,2210\n24918,4237\n24919,206\n24920,178\n24920,252\n24920,387\n24920,2931\n24920,24921\n24920,25244\n24920,39286\n24920,39903\n24920,42287\n24920,43121\n24920,44625\n24920,45130\n24920,45254\n24920,46641\n24920,47334\n24920,47516\n24920,47545\n24920,51549\n24920,51650\n24920,53016\n24920,53422\n24920,53644\n24920,57454\n24920,60403\n24920,67083\n24920,68935\n24920,77045\n24920,77636\n24920,79689\n24920,80076\n24920,80586\n24920,80854\n24920,82246\n24920,82249\n24920,83080\n24920,83914\n24920,83948\n24920,83964\n24920,84191\n24920,84319\n24920,85271\n24920,85321\n24920,85587\n24920,86119\n24920,86356\n24920,86837\n24920,86843\n24920,95775\n24920,97047\n24920,97711\n24920,100440\n24920,100702\n24920,101207\n24920,103629\n24920,103644\n24920,104235\n24920,104673\n24920,105355\n24920,105973\n24920,106063\n24920,106128\n24920,107190\n24920,108136\n24920,108967\n24920,109777\n24920,110230\n24920,111109\n24920,112750\n24920,112813\n24920,112843\n24920,122862\n24920,151820\n24920,184605\n24920,193282\n24920,217050\n24920,220926\n24920,225892\n24920,242083\n24920,242837\n24920,258358\n24922,207\n24922,358\n24922,366\n24922,1052\n24922,1253\n24922,1319\n24922,1571\n24922,2424\n24922,2868\n24923,1140\n24924,518\n24924,1010\n24924,1326\n24924,1849\n24924,2557\n24924,32784\n24924,171641\n24925,3039\n24927,1849\n24928,1893\n24929,301\n24930,1837\n24931,973\n24932,1085\n24933,252\n24934,54\n24934,140\n24934,202\n24934,203\n24934,272\n24934,287\n24934,337\n24934,467\n24934,516\n24934,577\n24934,671\n24934,838\n24934,872\n24934,1052\n24934,1167\n24934,1179\n24934,1294\n24934,1381\n24934,1454\n24934,1531\n24934,1796\n24934,2775\n24934,3115\n24935,147\n24935,149\n24935,158\n24935,406\n24935,2244\n24936,2048\n24937,393\n24938,1143\n24939,8798\n24940,1849\n24941,1955\n24942,417\n24943,1564\n24944,622\n24945,1590\n24946,1837\n24947,346\n24948,439\n24949,1010\n24950,714\n24951,4475\n24952,784\n24953,163\n24955,422\n24956,1\n24957,56\n24958,24959\n24960,305\n24961,1285\n24962,1010\n24963,356\n24963,968\n24964,147\n24964,158\n24964,406\n24965,500\n24965,718\n24966,1175\n24967,134\n24967,135\n24967,372\n24967,588\n24967,590\n24967,631\n24967,932\n24967,1082\n24967,1635\n24967,2812\n24968,1531\n24969,302\n24970,6837\n24971,83\n24971,167\n24971,206\n24971,406\n24971,694\n24971,1274\n24971,2553\n24971,6789\n24971,127158\n24972,784\n24972,2775\n24973,1847\n24974,4678\n24975,452\n24975,457\n24975,497\n24975,535\n24975,676\n24975,1655\n24976,3\n24977,151\n24978,2979\n24979,184\n24980,1983\n24981,1146\n24982,3724\n24983,63\n24984,302\n24984,687\n24984,1556\n24985,143\n24986,273\n24986,274\n24987,248\n24987,1332\n24988,809\n24989,68\n24989,4220\n24990,717\n24991,1983\n24992,1623\n24993,83\n24993,315\n24993,337\n24993,795\n24993,1117\n24993,4903\n24994,1127\n24994,5440\n24995,1572\n24996,631\n24996,1119\n24996,2995\n24997,86\n24997,167\n24997,240\n24997,372\n24997,567\n24997,589\n24997,605\n24997,615\n24997,631\n24997,720\n24997,801\n24997,907\n24997,968\n24997,972\n24997,973\n24997,1010\n24997,1122\n24997,1124\n24997,1140\n24997,1167\n24997,1231\n24997,1241\n24997,1284\n24997,1298\n24997,1309\n24997,1436\n24997,1522\n24997,1564\n24997,1782\n24997,1785\n24997,1818\n24997,1893\n24997,1955\n24997,2083\n24997,2191\n24997,2372\n24997,2557\n24997,2620\n24997,2979\n24997,3193\n24997,3207\n24997,3218\n24998,862\n24999,620\n25000,25001\n25002,1151\n25003,175\n25004,4771\n25006,697\n25007,920\n25007,1619\n25007,2867\n25007,2868\n25007,193129\n25008,209\n25009,1888\n25010,376\n25011,1381\n25012,704\n25013,885\n25014,34\n25014,35\n25015,503\n25015,557\n25016,450\n25017,83\n25018,376\n25019,206\n25019,718\n25020,25021\n25022,609\n25022,622\n25022,873\n25022,1046\n25023,278\n25024,72\n25025,344\n25026,285\n25027,399\n25027,422\n25027,5405\n25028,34\n25028,35\n25029,592\n25030,450\n25031,602\n25032,535\n25033,393\n25034,83\n25035,278\n25037,3069\n25038,1033\n25039,217\n25040,163\n25041,200\n25042,589\n25044,247\n25045,704\n25046,1608\n25046,13137\n25047,690\n25048,1119\n25048,1462\n25048,7194\n25048,8537\n25049,704\n25050,2135\n25051,6068\n25052,358\n25053,310\n25053,3039\n25054,72\n25054,104\n25055,2411\n25056,1608\n25057,4903\n25058,17334\n25059,2351\n25060,784\n25061,302\n25062,301\n25062,1293\n25062,1782\n25063,302\n25064,2979\n25065,704\n25066,704\n25067,195\n25067,1789\n25067,1849\n25068,1019\n25069,54\n25069,222\n25069,657\n25069,694\n25069,1019\n25069,2266\n25070,273\n25070,274\n25071,4453\n25072,202\n25072,203\n25073,184\n25073,206\n25073,2244\n25073,8180\n25073,21826\n25075,171\n25077,247\n25078,3804\n25079,557\n25080,25081\n25082,557\n25083,1033\n25084,3252\n25085,1179\n25086,94\n25086,885\n25086,2787\n25087,30\n25087,328\n25087,1179\n25087,1305\n25087,2146\n25087,2701\n25087,7124\n25088,192\n25088,422\n25089,1313\n25090,13\n25091,10\n25092,298\n25093,485\n25094,3555\n25094,6180\n25094,6369\n25094,21944\n25094,92295\n25095,9323\n25096,1240\n25097,1837\n25098,1634\n25099,13745\n25100,1590\n25101,349\n25102,278\n25102,1241\n25102,1479\n25102,2205\n25102,2206\n25102,2296\n25102,33424\n25103,3161\n25104,305\n25105,907\n25106,818\n25107,289\n25107,290\n25108,305\n25108,929\n25109,23011\n25110,269\n25111,1370\n25112,1821\n25113,4895\n25114,433\n25115,72\n25116,25117\n25118,19986\n25119,3474\n25120,47\n25120,2469\n25120,4748\n25120,5881\n25120,21944\n25121,809\n25122,3161\n25123,310\n25124,309\n25124,310\n25125,779\n25126,77\n25127,5375\n25128,65\n25129,66\n25129,158\n25129,178\n25129,252\n25129,314\n25129,388\n25129,406\n25129,626\n25129,843\n25129,868\n25129,1033\n25129,1220\n25129,1222\n25129,1411\n25129,1433\n25129,1782\n25129,1801\n25130,1085\n25130,1140\n25130,1749\n25130,2620\n25131,10\n25132,302\n25133,6682\n25134,261\n25135,187\n25136,868\n25137,267\n25138,104\n25138,134\n25138,137\n25138,2105\n25139,269\n25140,861\n25141,801\n25141,1140\n25141,5547\n25142,2506\n25143,1858\n25144,1860\n25145,450\n25146,450\n25147,160\n25147,306\n25147,307\n25148,25149\n25150,5469\n25151,3999\n25152,309\n25152,310\n25153,1381\n25154,1381\n25155,433\n25156,827\n25157,872\n25158,347\n25159,1983\n25160,302\n25160,579\n25160,809\n25160,1240\n25160,1381\n25160,1556\n25160,2617\n25160,2626\n25161,3413\n25162,25163\n25164,255\n25166,313\n25167,7416\n25168,22\n25168,72\n25169,37\n25169,301\n25169,717\n25169,1231\n25169,1782\n25170,138\n25170,1227\n25170,1229\n25171,2557\n25172,313\n25173,1837\n25174,2775\n25175,447\n25176,589\n25177,25178\n25179,366\n25179,500\n25180,2681\n25180,31977\n25181,536\n25182,6068\n25183,184\n25184,269\n25185,202\n25185,203\n25186,175\n25187,818\n25188,1188\n25188,32475\n25189,17334\n25190,346\n25191,2351\n25192,538\n25193,25194\n25195,25196\n25197,718\n25198,671\n25199,1836\n25200,8992\n25201,585\n25202,1\n25203,1836\n25204,1313\n25205,333\n25206,1149\n25207,1133\n25207,1411\n25208,801\n25209,5366\n25210,275\n25211,911\n25212,1274\n25212,2797\n25213,2506\n25214,907\n25215,818\n25216,23011\n25217,717\n25218,19986\n25219,17772\n25220,309\n25220,310\n25221,25222\n25223,254\n25224,126\n25224,452\n25224,457\n25224,497\n25224,535\n25224,676\n25224,843\n25224,1011\n25224,1655\n25224,4165\n25225,272\n25226,346\n25227,25228\n25227,51288\n25229,248\n25229,1332\n25230,640\n25231,25232\n25233,694\n25233,1001\n25234,366\n25235,366\n25236,366\n25237,366\n25238,366\n25239,25240\n25241,932\n25242,20\n25243,481\n25243,567\n25243,5540\n25245,81\n25246,25247\n25246,93949\n25248,8373\n25249,467\n25249,1659\n25250,65\n25251,4344\n25252,207\n25253,233\n25254,415\n25256,1058\n25257,86\n25258,106\n25258,586\n25258,17772\n25259,779\n25259,1515\n25259,4192\n25259,4193\n25260,292\n25261,195\n25262,1001\n25263,255\n25264,25265\n25266,1381\n25267,25268\n25269,2051\n25270,4504\n25271,911\n25272,694\n25272,1001\n25272,1011\n25272,14556\n25272,115474\n25272,148742\n25273,444\n25273,567\n25273,1160\n25273,1293\n25273,1300\n25276,298\n25277,485\n25278,313\n25279,346\n25280,206\n25281,3451\n25281,3452\n25282,481\n25282,567\n25282,581\n25282,911\n25282,243297\n25283,500\n25284,48\n25285,485\n25286,1616\n25287,25288\n25289,644\n25290,136\n25291,25292\n25293,784\n25294,136\n25294,137\n25295,749\n25295,1146\n25296,4903\n25297,589\n25297,1001\n25298,2191\n25299,25300\n25301,8270\n25302,333\n25302,393\n25302,615\n25302,660\n25302,2782\n25303,298\n25304,485\n25305,202\n25305,723\n25306,885\n25306,1212\n25307,431\n25308,1313\n25309,106\n25310,2590\n25311,634\n25312,298\n25313,485\n25314,298\n25315,485\n25316,298\n25317,485\n25318,255\n25319,8788\n25320,626\n25321,1179\n25321,2701\n25322,298\n25323,485\n25324,306\n25324,307\n25325,298\n25326,485\n25327,392\n25328,805\n25329,136\n25329,167\n25329,202\n25329,203\n25329,252\n25329,422\n25329,602\n25329,1001\n25329,1381\n25330,298\n25331,485\n25333,163\n25333,489\n25334,149\n25335,1\n25336,652\n25337,518\n25338,79\n25338,557\n25338,636\n25339,2205\n25339,2206\n25339,33424\n25340,298\n25341,485\n25342,301\n25342,604\n25342,968\n25342,3422\n25342,5662\n25343,25344\n25345,178\n25345,1333\n25345,2854\n25345,25346\n25345,33325\n25347,2512\n25348,10\n25348,147\n25348,149\n25348,195\n25348,206\n25348,991\n25348,1149\n25348,1608\n25348,2244\n25348,4060\n25348,25348\n25348,80266\n25348,101688\n25349,182\n25350,907\n25350,1117\n25350,1284\n25351,1433\n25352,298\n25353,485\n25354,875\n25355,188\n25356,332\n25357,298\n25358,485\n25359,206\n25361,298\n25362,485\n25363,217\n25363,2266\n25364,298\n25365,485\n25366,631\n25367,366\n25368,355\n25368,991\n25369,7\n25370,79\n25370,192\n25371,178\n25371,1891\n25372,143\n25372,2006\n25373,2353\n25374,2173\n25375,143\n25376,2116\n25377,247\n25378,87\n25378,872\n25378,1267\n25378,1453\n25379,1858\n25380,1860\n25382,283\n25383,2073\n25384,611\n25384,934\n25384,1070\n25384,1612\n25385,41\n25385,104\n25385,285\n25385,1119\n25385,1659\n25385,2205\n25385,33424\n25385,75912\n25385,111142\n25385,185877\n25386,326\n25387,149\n25388,505\n25388,1559\n25389,1323\n25390,102\n25391,1326\n25392,408\n25394,7\n25394,596\n25395,392\n25395,433\n25395,440\n25395,467\n25395,868\n25395,1085\n25395,1284\n25395,1345\n25395,6424\n25395,28107\n25395,48505\n25395,162599\n25396,24332\n25397,326\n25398,34\n25398,35\n25398,278\n25398,392\n25398,433\n25398,623\n25399,852\n25400,850\n25401,611\n25401,801\n25401,934\n25401,1070\n25401,1449\n25401,1782\n25402,425\n25402,4222\n25402,36761\n25402,111142\n25403,6263\n25404,1805\n25404,6726\n25405,9121\n25406,147\n25408,298\n25409,485\n25410,10\n25411,17228\n25412,1177\n25413,1284\n25414,2416\n25414,2417\n25415,252\n25415,175947\n25415,194116\n25416,364\n25416,588\n25416,590\n25416,1181\n25416,2315\n25416,8180\n25417,240\n25418,3069\n25419,314\n25420,298\n25421,485\n25422,808\n25422,6955\n25423,392\n25424,671\n25425,7\n25425,97\n25426,1181\n25426,1803\n25426,21442\n25427,712\n25428,435\n25429,1220\n25429,1222\n25429,1893\n25430,68\n25430,240\n25430,7155\n25431,911\n25432,104\n25433,1639\n25434,999\n25435,422\n25436,2775\n25437,447\n25438,422\n25439,1635\n25440,422\n25441,422\n25442,422\n25443,2051\n25444,422\n25445,302\n25446,349\n25446,875\n25446,1653\n25447,1849\n25448,22\n25448,302\n25448,861\n25448,893\n25448,1659\n25448,2116\n25448,3769\n25449,163\n25450,438\n25450,579\n25450,1417\n25450,1722\n25451,1977\n25451,1978\n25452,298\n25452,596\n25453,2867\n25453,2868\n25453,258298\n25454,2334\n25456,310\n25456,3039\n25457,850\n25459,640\n25460,25461\n25462,640\n25463,640\n25464,2775\n25465,447\n25466,640\n25467,1359\n25467,60576\n25468,104\n25469,217\n25469,1417\n25470,72\n25470,611\n25472,346\n25473,255\n25474,932\n25475,1220\n25475,1222\n25476,3\n25476,510\n25477,393\n25478,264\n25478,1381\n25479,104\n25479,136\n25479,254\n25479,557\n25479,954\n25479,1368\n25479,1939\n25479,5405\n25479,7757\n25479,10318\n25480,356\n25481,4\n25481,5\n25481,3555\n25482,346\n25483,255\n25484,516\n25485,422\n25486,107\n25487,192\n25487,309\n25487,310\n25488,3069\n25489,1803\n25490,71\n25490,611\n25490,859\n25491,2173\n25492,1801\n25493,873\n25494,136\n25494,252\n25494,272\n25494,333\n25494,435\n25494,516\n25494,1033\n25494,1243\n25494,1370\n25494,1877\n25494,1893\n25494,2006\n25495,745\n25497,1572\n25497,3999\n25498,1220\n25498,1222\n25499,2995\n25500,209\n25500,811\n25500,1891\n25501,344\n25501,827\n25501,2674\n25501,16153\n25502,1722\n25502,4039\n25503,1276\n25503,3698\n25504,302\n25505,20\n25506,852\n25507,195\n25507,1454\n25507,1572\n25509,1019\n25509,2784\n25510,1411\n25511,406\n25511,1118\n25512,1659\n25513,389\n25514,515\n25515,50\n25516,4\n25516,5\n25516,211\n25516,740\n25516,741\n25517,298\n25518,485\n25519,287\n25521,222\n25521,1871\n25522,1276\n25522,2334\n25523,1522\n25524,1871\n25525,1858\n25526,356\n25526,599\n25526,685\n25526,849\n25526,1130\n25526,1844\n25526,2373\n25527,1782\n25528,920\n25529,107\n25530,920\n25531,712\n25531,1243\n25531,1400\n25531,1425\n25533,859\n25534,34\n25534,35\n25535,1085\n25536,48\n25536,704\n25536,1179\n25536,3507\n25537,425\n25537,682\n25537,1276\n25537,1891\n25537,6068\n25537,72439\n25539,595\n25539,2116\n25539,3769\n25541,26\n25541,59\n25541,117\n25541,887\n25541,1432\n25541,2712\n25541,21944\n25542,346\n25543,1359\n25544,1983\n25545,1010\n25546,302\n25546,340\n25547,87\n25549,3193\n25551,217\n25551,392\n25551,872\n25551,1118\n25551,1796\n25552,4355\n25553,599\n25554,309\n25554,310\n25555,56\n25555,192\n25555,333\n25555,3895\n25556,25557\n25556,35215\n25558,1983\n25559,406\n25560,333\n25560,3177\n25561,171\n25562,6726\n25563,1313\n25564,794\n25565,3804\n25566,1836\n25567,442\n25567,749\n25567,2334\n25568,106\n25568,1220\n25568,1222\n25570,626\n25570,2995\n25571,104\n25571,289\n25571,290\n25571,80266\n25571,94134\n25575,538\n25575,934\n25576,130\n25578,37\n25578,1782\n25579,1556\n25580,707\n25581,406\n25582,272\n25583,309\n25583,310\n25584,1175\n25585,467\n25585,868\n25585,1323\n25586,87\n25586,312\n25587,811\n25587,1130\n25588,7360\n25589,302\n25590,9195\n25591,1210\n25591,1631\n25591,1639\n25592,83\n25593,852\n25594,1836\n25595,1893\n25597,760\n25597,1454\n25597,1608\n25597,2989\n25597,2991\n25598,712\n25598,1434\n25599,1247\n25601,15573\n25602,302\n25603,718\n25604,26\n25604,59\n25605,581\n25606,167\n25607,338\n25608,1659\n25609,323\n25610,1590\n25611,25612\n25613,252\n25613,1220\n25613,1222\n25614,4980\n25615,54\n25616,25617\n25618,1220\n25618,1222\n25619,515\n25620,7652\n25621,280\n25621,17245\n25622,1082\n25622,1807\n25622,2775\n25623,433\n25624,1844\n25626,634\n25626,2867\n25626,2868\n25626,22880\n25627,79\n25627,192\n25627,202\n25627,203\n25627,620\n25627,1181\n25627,80266\n25628,872\n25629,26\n25629,59\n25629,21944\n25630,26\n25630,59\n25630,21944\n25632,2506\n25633,2506\n25634,10\n25635,2506\n25636,26\n25636,47\n25636,59\n25636,117\n25636,885\n25636,2469\n25636,2712\n25636,4079\n25636,9542\n25636,21944\n25636,25636\n25636,44244\n25636,68120\n25637,25638\n25639,875\n25640,579\n25641,58\n25642,24505\n25643,247\n25644,859\n25646,15\n25646,292\n25646,1449\n25648,143\n25649,406\n25649,620\n25649,779\n25649,1181\n25649,1425\n25649,1515\n25650,723\n25651,15573\n25652,932\n25652,1016\n25652,2205\n25652,33424\n25653,1707\n25654,217\n25654,301\n25654,1417\n25655,2266\n25656,4831\n25657,1326\n25658,1559\n25658,1639\n25658,25573\n25659,217\n25659,389\n25659,949\n25659,1019\n25659,2266\n25660,626\n25661,682\n25662,167\n25662,467\n25662,818\n25662,1167\n25662,2372\n25662,2979\n25662,73570\n25663,907\n25664,41\n25664,68\n25664,294\n25664,431\n25664,631\n25664,760\n25664,784\n25664,805\n25664,818\n25664,1119\n25664,1285\n25664,2995\n25664,3135\n25664,9021\n25665,6955\n25666,151\n25667,151\n25668,920\n25668,1623\n25669,1127\n25670,54\n25670,187\n25670,222\n25670,283\n25670,313\n25670,379\n25670,385\n25670,389\n25670,657\n25670,781\n25670,1019\n25670,1274\n25670,1467\n25670,1539\n25670,1724\n25670,2421\n25670,2944\n25670,6506\n25670,7768\n25670,37088\n25671,10\n25672,452\n25672,457\n25672,497\n25672,535\n25672,676\n25672,1655\n25673,333\n25674,805\n25675,1265\n25675,1266\n25676,647\n25677,344\n25678,2681\n25679,247\n25680,992\n25681,72\n25682,1858\n25683,1860\n25684,525\n25685,510\n25685,1019\n25685,1181\n25685,1300\n25686,11\n25686,63\n25686,107\n25686,160\n25686,207\n25686,264\n25686,272\n25686,273\n25686,294\n25686,302\n25686,376\n25686,515\n25686,713\n25686,733\n25686,736\n25686,811\n25686,877\n25686,968\n25686,1010\n25686,1058\n25686,1122\n25686,1298\n25686,1381\n25686,1572\n25686,1579\n25686,1634\n25686,1767\n25686,1881\n25686,2105\n25686,2191\n25686,2372\n25686,2668\n25686,2750\n25686,3194\n25686,4549\n25686,6298\n25686,115659\n25686,143287\n25687,1326\n25688,4\n25688,5\n25689,1644\n25690,1058\n25690,8149\n25691,1043\n25692,259\n25692,1433\n25693,3960\n25694,50\n25695,1983\n25696,1544\n25697,206\n25698,312\n25699,1983\n25700,25701\n25702,581\n25703,302\n25703,2116\n25704,72\n25705,2506\n25706,420\n25708,217\n25709,10\n25710,34\n25710,35\n25711,4637\n25712,2506\n25713,151\n25714,34\n25714,35\n25714,83\n25715,195\n25716,356\n25716,1572\n25717,54\n25718,160\n25718,206\n25718,452\n25718,583\n25718,1118\n25719,801\n25720,372\n25721,424\n25722,516\n25723,875\n25724,1740\n25725,81\n25726,1740\n25727,184\n25728,107\n25729,859\n25730,250\n25731,718\n25732,25733\n25732,82740\n25734,387\n25735,252\n25735,318\n25735,516\n25735,1220\n25735,1222\n25736,1177\n25736,1773\n25736,6556\n25737,72\n25738,72\n25739,34\n25739,35\n25740,143\n25741,72\n25742,302\n25743,25744\n25743,56128\n25745,302\n25745,420\n25745,1414\n25746,247\n25747,346\n25748,240\n25748,392\n25748,818\n25749,195\n25750,41\n25751,497\n25752,72\n25753,6369\n25754,875\n25755,298\n25756,485\n25757,261\n25757,347\n25757,589\n25758,615\n25759,717\n25759,1177\n25759,2210\n25760,58\n25761,46\n25763,247\n25763,406\n25765,178\n25766,818\n25766,1085\n25767,1836\n25768,1381\n25769,2224\n25770,2274\n25771,575\n25772,376\n25773,9029\n25774,26\n25774,59\n25775,2574\n25776,298\n25777,485\n25778,536\n25778,949\n25779,376\n25780,885\n25781,1836\n25782,1466\n25783,649\n25784,72\n25785,298\n25786,485\n25787,104\n25787,136\n25787,557\n25787,953\n25787,954\n25787,1939\n25788,4475\n25789,1462\n25789,8537\n25790,298\n25791,485\n25792,72\n25793,1285\n25794,389\n25795,920\n25797,4611\n25798,3148\n25798,8270\n25799,72\n25800,41\n25800,68\n25800,1119\n25800,1285\n25801,16617\n25802,973\n25802,1837\n25802,2436\n25803,809\n25804,1001\n25805,4611\n25806,893\n25807,219\n25808,1608\n25809,250\n25810,298\n25811,485\n25812,44\n25814,503\n25814,760\n25814,1119\n25814,1140\n25814,1149\n25814,1631\n25815,202\n25815,203\n25816,372\n25816,1082\n25817,147\n25817,158\n25817,206\n25817,80266\n25818,217\n25819,887\n25820,72\n25821,4748\n25821,21944\n25822,586\n25822,1175\n25823,392\n25824,720\n25824,907\n25824,1117\n25825,206\n25825,302\n25825,422\n25826,657\n25826,6424\n25827,32\n25828,79\n25828,931\n25829,1590\n25829,1644\n25829,1769\n25830,557\n25831,557\n25832,301\n25832,717\n25832,1231\n25832,1740\n25832,1782\n25833,887\n25834,25835\n25836,72\n25837,1556\n25838,147\n25838,158\n25839,79\n25839,422\n25839,1220\n25839,1222\n25840,1070\n25841,272\n25841,795\n25841,934\n25841,1070\n25841,1612\n25842,25843\n25842,125838\n25844,143\n25845,1579\n25846,6955\n25847,1432\n25848,9018\n25849,1181\n25850,292\n25851,21944\n25853,25854\n25855,81\n25855,304\n25855,332\n25855,420\n25855,843\n25855,875\n25855,994\n25855,1133\n25855,1818\n25855,2083\n25855,2995\n25855,4039\n25855,9015\n25856,271\n25858,433\n25859,250\n25860,25861\n25862,887\n25864,184\n25865,1252\n25865,1253\n25866,333\n25867,298\n25868,485\n25870,158\n25870,259\n25870,356\n25870,392\n25870,406\n25870,483\n25870,535\n25870,592\n25870,713\n25870,718\n25870,852\n25870,877\n25870,1419\n25870,1453\n25870,2253\n25870,3331\n25870,4252\n25870,4678\n25870,5301\n25870,7572\n25870,20535\n25870,37088\n25871,4453\n25872,25873\n25874,516\n25876,298\n25877,485\n25878,278\n25878,733\n25879,9011\n25879,9032\n25880,48\n25880,233\n25880,634\n25881,192\n25882,433\n25883,2807\n25884,171\n25885,636\n25886,1707\n25887,450\n25888,2506\n25889,704\n25889,920\n25890,298\n25891,485\n25892,1313\n25893,2607\n25894,1639\n25895,247\n25896,255\n25897,2506\n25898,225\n25899,3161\n25900,450\n25901,1414\n25902,2574\n25903,1284\n25904,1836\n25905,25906\n25907,23011\n25909,25910\n25909,127076\n25911,2506\n25912,19986\n25913,107\n25914,192\n25915,450\n25916,333\n25917,151\n25918,479\n25919,79\n25920,2506\n25921,309\n25921,310\n25922,640\n25923,356\n25924,313\n25925,1544\n25926,25927\n25928,54\n25928,83\n25928,577\n25928,1871\n25928,25929\n25928,53217\n25928,133628\n25930,115\n25930,118\n25931,450\n25932,346\n25933,25933\n25934,258\n25935,63\n25935,489\n25935,1623\n25936,255\n25937,143\n25938,3999\n25939,772\n25940,304\n25940,337\n25940,338\n25940,393\n25940,439\n25940,626\n25940,649\n25940,772\n25940,811\n25940,1506\n25940,2367\n25940,5212\n25941,240\n25942,2443\n25943,25944\n25943,91652\n25945,652\n25946,301\n25947,1102\n25948,248\n25948,450\n25949,264\n25950,1381\n25951,1274\n25952,50\n25952,79\n25952,393\n25952,406\n25952,493\n25952,585\n25952,586\n25952,592\n25952,704\n25952,1433\n25953,333\n25954,1007\n25955,818\n25956,592\n25956,1082\n25956,1285\n25956,1818\n25956,3069\n25957,163\n25958,250\n25958,991\n25958,1684\n25959,192\n25959,195\n25959,215\n25959,302\n25959,1149\n25959,1980\n25959,8992\n25960,422\n25961,56\n25962,267\n25963,134\n25963,483\n25964,8788\n25965,2506\n25966,2506\n25967,1836\n25968,25969\n25968,97488\n25968,129488\n25970,862\n25970,2590\n25971,217\n25972,3507\n25973,1417\n25974,32\n25974,392\n25974,918\n25974,214734\n25975,8992\n25976,585\n25977,850\n25978,346\n25979,143\n25980,392\n25981,72\n25982,25983\n25984,1149\n25985,140\n25985,264\n25985,1381\n25985,1509\n25985,1639\n25986,83\n25987,5366\n25988,275\n25989,10\n25990,34\n25990,35\n25991,25992\n25993,3474\n25994,304\n25995,143\n25997,298\n25997,636\n25997,1579\n25997,1962\n25998,784\n25999,515\n26000,26001\n26002,83\n26003,26004\n26005,1227\n26005,1229\n26005,86416\n26006,366\n26007,704\n26008,26009\n26010,254\n26010,2979\n26011,795\n26011,3804\n26012,233\n26013,1556\n26014,366\n26015,366\n26016,366\n26017,366\n26018,1309\n26019,366\n26020,366\n26021,366\n26022,366\n26024,515\n26025,298\n26026,485\n26027,1888\n26027,6661\n26028,23287\n26029,273\n26029,274\n26030,2506\n26031,275\n26031,874\n26031,4771\n26032,22\n26032,31206\n26034,1\n26034,83\n26034,158\n26034,178\n26034,209\n26034,309\n26034,310\n26034,313\n26034,337\n26034,390\n26034,455\n26034,467\n26034,599\n26034,664\n26034,694\n26034,752\n26034,818\n26034,843\n26034,868\n26034,968\n26034,1010\n26034,1181\n26034,1556\n26034,1623\n26034,1782\n26034,2646\n26034,2699\n26034,3623\n26034,136014\n26035,163\n26036,579\n26038,178\n26038,439\n26038,1776\n26038,1877\n26039,34\n26039,35\n26040,1749\n26040,3585\n26041,68\n26041,71\n26041,631\n26041,4190\n26041,90845\n26041,128297\n26041,128872\n26041,132639\n26041,148995\n26041,162140\n26041,178820\n26041,182790\n26041,254929\n26042,46\n26042,58\n26042,1124\n26043,323\n26044,3451\n26044,3452\n26045,248\n26045,364\n26045,850\n26046,644\n26047,875\n26048,2048\n26049,1983\n26050,1707\n26051,87\n26051,510\n26051,703\n26051,852\n26051,1140\n26051,1238\n26051,1722\n26051,1893\n26051,2436\n26051,3367\n26051,3538\n26052,4903\n26053,163\n26053,209\n26053,302\n26053,579\n26053,811\n26054,79\n26054,1715\n26055,283\n26056,278\n26056,536\n26056,660\n26056,1871\n26056,6506\n26057,744\n26058,366\n26058,1052\n26058,1319\n26058,1571\n26058,1634\n26058,2424\n26058,2620\n26058,2868\n26059,1983\n26060,366\n26060,1749\n26060,3585\n26060,4691\n26061,41\n26061,609\n26061,682\n26061,1085\n26061,1359\n26061,1882\n26061,2296\n26061,6556\n26061,8180\n26063,795\n26064,1227\n26064,1229\n26064,1252\n26064,1253\n26065,850\n26066,850\n26067,81\n26068,907\n26068,932\n26070,795\n26070,2334\n26070,3474\n26071,19010\n26073,143\n26074,623\n26074,1805\n26075,390\n26075,1085\n26076,1858\n26077,1860\n26078,1241\n26078,2083\n26079,346\n26080,663\n26080,664\n26081,752\n26081,873\n26081,1210\n26082,626\n26082,775\n26083,929\n26084,1140\n26084,1235\n26084,1238\n26084,1688\n26084,1722\n26084,3474\n26084,3538\n26084,5547\n26085,34\n26085,35\n26085,2319\n26086,1151\n26087,211\n26088,184\n26089,1127\n26089,1673\n26090,15\n26090,1332\n26091,309\n26091,310\n26091,483\n26092,3\n26094,2421\n26095,3135\n26097,107\n26098,1227\n26098,1229\n26099,1276\n26100,911\n26101,32\n26101,392\n26101,697\n26101,809\n26102,301\n26102,968\n26103,30\n26105,372\n26106,1289\n26107,687\n26107,1556\n26108,885\n26110,760\n26111,344\n26112,4276\n26113,444\n26114,65\n26115,1782\n26116,104\n26117,147\n26117,932\n26118,811\n26118,893\n26119,710\n26120,1001\n26122,1663\n26123,7155\n26124,1566\n26125,433\n26125,1241\n26125,76096\n26125,127158\n26128,3069\n26129,1326\n26129,1411\n26129,2006\n26129,14797\n26131,26131\n26132,1635\n26132,9457\n26133,192\n26133,264\n26133,301\n26133,1085\n26133,1118\n26133,1531\n26133,3744\n26134,336\n26135,278\n26136,137\n26136,5405\n26137,640\n26138,640\n26139,192\n26141,640\n26142,640\n26143,4\n26143,5\n26143,104\n26143,136\n26143,557\n26143,1368\n26143,1939\n26143,5405\n26145,32\n26145,392\n26145,697\n26145,809\n26145,2312\n26146,536\n26147,217\n26148,1117\n26148,1284\n26149,818\n26150,305\n26151,301\n26151,305\n26151,509\n26151,516\n26151,1298\n26151,1381\n26151,1837\n26151,2083\n26151,3193\n26153,2674\n26154,2506\n26155,2506\n26157,151\n26158,1927\n26159,493\n26160,843\n26161,37\n26161,50\n26161,360\n26161,452\n26161,623\n26161,644\n26161,660\n26161,673\n26161,710\n26161,838\n26161,877\n26161,1130\n26161,1147\n26161,1240\n26161,1267\n26161,1345\n26161,1688\n26161,1724\n26161,1805\n26161,2266\n26161,2310\n26161,2750\n26161,3422\n26161,9743\n26161,13661\n26161,22293\n26161,40566\n26162,58\n26162,772\n26163,1590\n26164,510\n26164,872\n26164,150022\n26165,340\n26165,8235\n26166,1479\n26167,83\n26168,360\n26168,1522\n26169,1983\n26171,1\n26171,48\n26171,79\n26171,118\n26171,163\n26171,192\n26171,233\n26171,272\n26171,275\n26171,304\n26171,340\n26171,422\n26171,491\n26171,571\n26171,605\n26171,620\n26171,703\n26171,726\n26171,788\n26171,911\n26171,1052\n26171,1133\n26171,1309\n26171,1313\n26171,1319\n26171,1392\n26171,1634\n26171,1803\n26171,4597\n26171,8244\n26172,146\n26172,336\n26173,690\n26173,3409\n26174,1983\n26175,3193\n26176,2073\n26177,195\n26178,252\n26179,63\n26179,202\n26179,203\n26179,516\n26179,1220\n26179,1222\n26179,1663\n26180,26181\n26181,20\n26181,160\n26181,248\n26181,338\n26181,397\n26181,516\n26181,586\n26181,1402\n26181,1515\n26181,1722\n26181,1786\n26181,1927\n26181,1973\n26181,1992\n26181,2312\n26181,2726\n26181,3507\n26181,3944\n26181,4276\n26181,5265\n26181,13151\n26181,22045\n26181,58860\n26181,168844\n26181,177427\n26181,190327\n26182,389\n26183,5726\n26184,3138\n26185,1238\n26186,338\n26186,462\n26186,872\n26186,1722\n26187,1467\n26188,385\n26188,477\n26188,781\n26188,1201\n26188,1881\n26188,2319\n26188,2553\n26189,631\n26190,685\n26191,1983\n26192,1058\n26193,602\n26194,557\n26194,954\n26194,1939\n26194,134641\n26195,450\n26197,406\n26197,485\n26199,1181\n26200,861\n26201,604\n26201,968\n26201,1293\n26202,356\n26203,422\n26204,422\n26205,422\n26206,195\n26207,1983\n26208,2506\n26209,2506\n26210,58\n26211,46\n26212,1452\n26213,1323\n26214,58\n26215,46\n26217,58\n26218,611\n26218,949\n26218,1782\n26219,1298\n26221,5405\n26222,422\n26223,422\n26224,422\n26225,1983\n26226,2506\n26228,240\n26228,1962\n26228,2205\n26228,2209\n26228,33424\n26229,6424\n26230,379\n26230,850\n26231,344\n26231,647\n26232,1140\n26232,2436\n26233,577\n26233,1105\n26234,56\n26234,147\n26234,158\n26234,422\n26234,1181\n26235,850\n26236,433\n26237,422\n26238,56\n26240,19\n26240,379\n26240,850\n26241,104\n26243,422\n26244,81\n26244,104\n26244,1282\n26244,2205\n26244,2206\n26244,2286\n26244,33424\n26245,1052\n26246,296\n26246,2605\n26247,991\n26247,992\n26248,292\n26249,285\n26249,366\n26251,91622\n26251,203739\n26252,2353\n26253,392\n26253,697\n26253,809\n26255,2995\n26255,3135\n26256,19010\n26257,72\n26257,104\n26257,312\n26257,3695\n26258,2353\n26260,3\n26262,344\n26262,596\n26262,1127\n26264,26264\n26264,26265\n26266,2105\n26267,1309\n26268,217\n26269,3\n26270,8\n26270,3555\n26270,7117\n26271,346\n26271,435\n26272,178\n26273,1140\n26274,1977\n26274,1978\n26275,118\n26275,4597\n26276,344\n26277,1509\n26278,3\n26279,264\n26280,1821\n26281,72\n26281,312\n26281,3695\n26282,158\n26282,1001\n26282,1433\n26284,79\n26284,217\n26284,718\n26284,1309\n26285,850\n26286,387\n26286,920\n26286,1089\n26286,1332\n26286,1368\n26286,1619\n26286,1927\n26287,301\n26287,1782\n26288,1572\n26288,1688\n26289,302\n26289,2116\n26290,808\n26291,2915\n26292,292\n26293,557\n26293,918\n26293,1673\n26293,3474\n26294,292\n26295,312\n26297,690\n26297,1474\n26297,1807\n26298,1556\n26299,163\n26300,406\n26301,433\n26301,1284\n26301,1634\n26302,406\n26302,435\n26302,972\n26302,2775\n26305,26306\n26307,292\n26311,929\n26311,1608\n26312,1566\n26313,887\n26314,493\n26315,835\n26316,1509\n26317,217\n26319,149\n26320,2073\n26321,146\n26322,2572\n26323,781\n26324,1433\n26325,163\n26326,1014\n26327,1276\n26327,19488\n26328,298\n26329,485\n26330,1149\n26332,1983\n26333,2828\n26334,302\n26335,289\n26335,290\n26335,1011\n26336,140\n26337,1285\n26338,2191\n26339,2173\n26340,1\n26340,149\n26340,202\n26341,379\n26341,455\n26341,536\n26341,694\n26341,877\n26341,1284\n26341,1539\n26341,1715\n26341,7645\n26342,1556\n26343,1370\n26343,1821\n26343,2782\n26344,931\n26345,337\n26345,389\n26345,818\n26345,1014\n26345,1454\n26346,247\n26347,138\n26347,1559\n26348,273\n26348,274\n26349,163\n26350,184\n26351,1556\n26352,775\n26353,2051\n26354,1\n26354,26\n26354,59\n26354,147\n26354,1087\n26354,1579\n26354,8180\n26354,144962\n26355,58\n26356,1070\n26357,872\n26358,10\n26358,195\n26358,931\n26359,3328\n26360,3467\n26361,269\n26362,149\n26362,240\n26362,818\n26362,127158\n26363,779\n26364,298\n26365,485\n26366,657\n26366,1010\n26366,1849\n26366,1860\n26367,302\n26368,292\n26369,1722\n26369,1836\n26369,3612\n26370,500\n26371,718\n26372,5192\n26373,493\n26373,1265\n26373,1266\n26374,657\n26375,452\n26375,457\n26375,497\n26375,535\n26375,676\n26375,918\n26375,1655\n26376,805\n26376,2443\n26377,1454\n26378,147\n26379,527\n26380,163\n26380,861\n26380,1556\n26380,6303\n26382,20\n26383,406\n26384,1227\n26384,1229\n26385,535\n26386,10\n26387,1127\n26388,30\n26388,1177\n26388,2210\n26388,4237\n26389,34\n26389,35\n26389,120\n26389,217\n26389,283\n26389,372\n26389,392\n26389,455\n26389,1240\n26389,1564\n26389,1639\n26389,2699\n26389,2989\n26389,2991\n26390,2506\n26391,2506\n26392,209\n26393,1775\n26393,1782\n26393,21944\n26394,473\n26395,192\n26396,714\n26396,760\n26398,217\n26399,647\n26400,344\n26401,1227\n26401,1229\n26403,2334\n26404,1227\n26404,1572\n26404,21944\n26404,86416\n26406,832\n26407,87\n26407,1140\n26407,1453\n26408,195\n26409,301\n26409,626\n26409,968\n26409,1010\n26409,1298\n26410,1818\n26411,264\n26411,1509\n26411,1893\n26412,175\n26412,693\n26413,2506\n26414,56\n26414,147\n26414,158\n26414,175\n26414,192\n26414,285\n26414,333\n26414,336\n26414,422\n26414,602\n26414,620\n26414,640\n26414,1011\n26414,1181\n26414,1425\n26414,1803\n26414,2244\n26414,2253\n26414,3895\n26414,22616\n26414,27834\n26414,30331\n26416,887\n26418,104\n26419,20\n26419,32\n26419,202\n26419,203\n26419,302\n26419,433\n26419,581\n26419,599\n26419,644\n26419,668\n26419,673\n26419,713\n26419,717\n26419,760\n26419,784\n26419,918\n26419,985\n26419,1058\n26419,1089\n26419,1147\n26419,1392\n26419,1844\n26419,2373\n26419,2605\n26419,3089\n26419,3135\n26419,3451\n26419,3452\n26419,7117\n26419,26450\n26420,315\n26420,35486\n26420,227061\n26421,1559\n26422,781\n26423,292\n26424,406\n26424,620\n26425,192\n26425,364\n26426,1085\n26428,779\n26430,247\n26432,225\n26432,248\n26432,5405\n26433,717\n26433,1782\n26434,147\n26434,158\n26434,406\n26434,779\n26434,1181\n26434,1515\n26435,147\n26435,158\n26435,206\n26435,2244\n26437,1891\n26438,83\n26439,843\n26440,887\n26441,120\n26442,15\n26443,217\n26443,1118\n26444,1235\n26444,1335\n26445,622\n26446,1033\n26447,852\n26448,225\n26449,247\n26449,2867\n26449,2868\n26450,71\n26450,146\n26450,313\n26450,314\n26450,349\n26450,467\n26450,685\n26450,838\n26450,849\n26450,911\n26450,1011\n26450,1014\n26450,1293\n26450,1504\n26450,1566\n26450,1844\n26450,1848\n26450,3003\n26450,3513\n26450,4190\n26450,5356\n26450,8097\n26450,26928\n26450,30557\n26450,32976\n26450,33287\n26450,41230\n26450,56567\n26450,81775\n26450,155719\n26450,162574\n26450,166558\n26450,167194\n26450,171169\n26450,172224\n26450,216130\n26451,13345\n26453,56\n26453,336\n26453,422\n26453,22616\n26454,83\n26455,536\n26456,151\n26457,137\n26458,302\n26460,289\n26460,290\n26460,1818\n26461,2367\n26462,1849\n26463,274\n26463,1116\n26464,557\n26465,932\n26466,3\n26466,81\n26466,225\n26466,273\n26466,274\n26466,292\n26466,302\n26466,425\n26466,1082\n26466,1807\n26467,26468\n26469,516\n26469,1220\n26469,1222\n26469,1243\n26470,26471\n26472,306\n26472,307\n26473,356\n26473,611\n26474,302\n26474,579\n26476,72\n26477,178\n26478,247\n26479,217\n26479,1417\n26480,151\n26481,81\n26481,225\n26481,292\n26481,425\n26481,1082\n26481,1807\n26482,26483\n26484,1465\n26485,2797\n26487,217\n26488,2296\n26489,577\n26490,1085\n26490,26492\n26491,631\n26493,1085\n26494,949\n26495,206\n26496,158\n26497,663\n26497,664\n26498,1807\n26499,376\n26500,72\n26501,10\n26502,44\n26504,389\n26505,887\n26506,81\n26506,1807\n26507,972\n26508,250\n26509,2506\n26510,255\n26511,26\n26511,59\n26512,200\n26513,4\n26513,5\n26513,1119\n26513,1203\n26513,1252\n26513,1253\n26513,1415\n26513,1955\n26513,1962\n26513,2089\n26513,2940\n26513,3135\n26513,21944\n26513,23590\n26513,81577\n26514,22\n26514,387\n26514,707\n26515,918\n26516,338\n26516,420\n26516,467\n26516,809\n26517,211\n26518,1858\n26519,1860\n26520,313\n26520,1140\n26520,1718\n26521,1858\n26522,1860\n26523,3507\n26524,861\n26525,217\n26525,222\n26525,536\n26525,4672\n26526,2506\n26527,26\n26527,59\n26527,1893\n26527,17346\n26528,26529\n26530,483\n26531,273\n26531,274\n26532,2209\n26533,577\n26533,1287\n26533,1462\n26534,602\n26535,563\n26536,26537\n26538,1235\n26538,1335\n26539,3724\n26540,340\n26541,225\n26542,305\n26543,289\n26543,290\n26544,289\n26544,290\n26545,994\n26546,104\n26546,1368\n26546,2867\n26546,22880\n26547,302\n26548,81\n26548,425\n26549,1140\n26550,861\n26551,211\n26552,704\n26553,447\n26554,2775\n26555,1509\n26557,289\n26557,290\n26557,3041\n26558,8820\n26559,415\n26560,26561\n26562,379\n26563,58\n26564,72\n26565,1515\n26566,1388\n26567,298\n26568,485\n26569,83\n26570,493\n26571,333\n26572,273\n26572,274\n26573,557\n26574,557\n26575,58\n26575,1140\n26576,175\n26577,2620\n26578,557\n26579,1\n26579,48\n26579,130\n26579,340\n26579,360\n26579,489\n26579,710\n26579,1096\n26579,1381\n26579,4355\n26579,9457\n26580,171\n26581,346\n26582,1043\n26583,209\n26584,26585\n26586,35\n26587,779\n26588,424\n26589,7760\n26590,275\n26591,841\n26592,267\n26593,107\n26594,151\n26595,991\n26596,137\n26597,1\n26598,143\n26599,444\n26599,4222\n26600,184\n26601,1085\n26602,5405\n26603,298\n26604,485\n26605,424\n26606,1531\n26607,34\n26607,35\n26607,217\n26607,283\n26607,455\n26607,536\n26607,1240\n26607,1274\n26607,1465\n26607,1608\n26607,2989\n26607,2991\n26607,7092\n26607,14126\n26608,5405\n26609,26610\n26609,121089\n26609,123048\n26609,262342\n26611,1381\n26612,171\n26613,285\n26614,304\n26615,2735\n26616,1188\n26618,26619\n26620,5265\n26621,26\n26621,59\n26622,294\n26623,217\n26624,3507\n26625,26626\n26627,1515\n26628,1305\n26629,107\n26630,347\n26631,949\n26632,1014\n26633,3069\n26634,1506\n26635,1571\n26636,4594\n26637,298\n26638,485\n26639,433\n26640,784\n26641,30\n26642,515\n26644,289\n26644,290\n26645,83\n26646,1453\n26647,602\n26648,26649\n26648,108829\n26650,26651\n26650,43054\n26650,51411\n26650,68069\n26650,81405\n26650,81915\n26650,81974\n26650,84195\n26650,85171\n26650,86832\n26650,86880\n26650,87173\n26650,93072\n26650,95106\n26650,98727\n26650,103671\n26650,106521\n26650,108717\n26650,217063\n26650,255501\n26650,256163\n26650,262267\n26652,346\n26653,5547\n26654,251\n26656,83\n26657,3193\n26658,1181\n26659,841\n26661,346\n26662,26663\n26664,1773\n26665,72\n26666,1773\n26667,723\n26667,1267\n26668,72\n26669,344\n26670,285\n26671,874\n26672,163\n26673,850\n26674,887\n26675,143\n26676,130\n26677,1267\n26678,77\n26679,26680\n26681,171\n26682,104\n26682,134\n26682,135\n26682,137\n26683,26684\n26683,47723\n26685,72\n26686,489\n26687,640\n26689,147\n26689,158\n26690,26691\n26692,46\n26693,83\n26693,379\n26693,1274\n26693,1881\n26694,26695\n26694,115118\n26696,217\n26696,1417\n26697,8811\n26698,323\n26699,424\n26700,115\n26700,118\n26701,330\n26702,1309\n26703,138\n26703,1243\n26703,1368\n26704,151\n26705,151\n26705,184\n26705,980\n26705,1243\n26706,872\n26707,366\n26708,366\n26709,720\n26710,366\n26711,366\n26712,366\n26713,366\n26714,366\n26715,366\n26716,1089\n26716,1623\n26717,366\n26718,366\n26719,3345\n26720,704\n26721,704\n26722,301\n26723,779\n26723,1515\n26724,389\n26724,918\n26725,233\n26726,130\n26727,158\n26728,23011\n26729,104\n26729,134\n26729,135\n26729,137\n26729,138\n26729,1078\n26729,2105\n26729,4276\n26730,163\n26730,457\n26730,505\n26730,1749\n26731,652\n26732,784\n26733,116\n26733,994\n26733,2087\n26733,2590\n26734,26735\n26736,346\n26736,493\n26737,314\n26738,26739\n26740,781\n26741,206\n26742,5301\n26743,781\n26744,130\n26744,273\n26744,274\n26744,1247\n26745,3209\n26746,26747\n26746,38519\n26746,53539\n26748,104\n26748,134\n26748,135\n26749,26750\n26751,859\n26751,2116\n26752,26753\n26755,3451\n26755,3452\n26756,644\n26757,26758\n26759,26758\n26760,26758\n26761,26758\n26762,859\n26763,19443\n26764,19986\n26765,26766\n26765,27496\n26765,30116\n26765,46012\n26765,50887\n26765,63220\n26765,70489\n26765,78484\n26765,84376\n26765,94005\n26765,95771\n26765,99974\n26765,100487\n26765,102847\n26765,104276\n26765,109227\n26765,111572\n26765,130727\n26767,673\n26768,516\n26768,1243\n26769,10\n26770,605\n26771,3252\n26771,7092\n26772,483\n26773,1608\n26774,493\n26775,6263\n26776,306\n26776,307\n26777,1151\n26777,1363\n26777,1836\n26779,788\n26780,4453\n26781,289\n26781,290\n26781,932\n26781,1082\n26781,1285\n26781,1818\n26781,1955\n26781,2296\n26781,2620\n26781,94134\n26782,120\n26783,1579\n26784,2319\n26785,134\n26785,538\n26785,579\n26785,636\n26785,934\n26785,1294\n26785,1474\n26785,2209\n26785,2353\n26786,309\n26786,310\n26786,577\n26786,788\n26786,1010\n26786,1433\n26786,1531\n26786,23487\n26787,346\n26787,1590\n26787,1644\n26788,3413\n26789,240\n26789,301\n26789,444\n26789,592\n26789,852\n26789,968\n26789,1564\n26789,1785\n26790,292\n26791,3\n26792,850\n26793,1858\n26794,1860\n26796,259\n26797,808\n26798,3447\n26799,1821\n26800,388\n26801,54\n26801,389\n26801,634\n26801,1871\n26802,200\n26803,3724\n26804,1871\n26805,1181\n26806,19413\n26807,32\n26808,805\n26809,206\n26809,710\n26809,1058\n26809,2617\n26810,473\n26812,2421\n26812,3695\n26813,760\n26814,346\n26815,1118\n26816,1381\n26817,298\n26818,485\n26819,586\n26820,422\n26821,422\n26822,422\n26823,422\n26824,422\n26825,422\n26826,305\n26827,403\n26829,720\n26830,5405\n26831,1118\n26832,202\n26832,203\n26834,479\n26835,406\n26836,493\n26839,50\n26839,79\n26839,393\n26839,406\n26839,493\n26839,585\n26839,586\n26839,592\n26839,704\n26840,225\n26840,248\n26841,147\n26841,149\n26841,184\n26841,206\n26841,1623\n26842,557\n26843,20\n26844,557\n26845,406\n26845,622\n26846,195\n26846,252\n26846,264\n26846,269\n26846,333\n26846,1220\n26846,1222\n26846,1235\n26846,1335\n26846,1452\n26847,1559\n26849,337\n26849,1014\n26849,1454\n26850,1612\n26851,1323\n26852,102\n26853,1326\n26854,408\n26855,1955\n26858,649\n26860,636\n26860,1844\n26861,1512\n26861,5992\n26862,1235\n26862,1335\n26863,760\n26863,1149\n26863,1631\n26864,346\n26864,439\n26864,868\n26865,1559\n26866,1313\n26867,390\n26867,760\n26868,1289\n26869,1082\n26869,1220\n26869,1222\n26869,2605\n26869,3999\n26870,3260\n26871,298\n26872,485\n26873,636\n26873,805\n26873,1844\n26874,48\n26874,130\n26875,83\n26876,563\n26876,1241\n26876,1522\n26876,2480\n26877,192\n26877,660\n26877,666\n26877,877\n26877,907\n26877,932\n26877,972\n26877,973\n26877,1010\n26877,1122\n26877,1284\n26877,1298\n26877,1732\n26877,1837\n26877,1849\n26877,2191\n26877,2421\n26877,2750\n26877,72764\n26877,124668\n26877,171641\n26878,3161\n26880,1955\n26880,2775\n26881,104\n26882,26883\n26884,868\n26885,209\n26885,579\n26886,349\n26889,252\n26890,861\n26891,515\n26892,779\n26893,217\n26894,240\n26895,577\n26895,1429\n26896,996\n26896,3003\n26897,640\n26898,640\n26899,292\n26900,4344\n26900,8373\n26902,634\n26904,58\n26905,120\n26905,372\n26905,392\n26905,536\n26905,626\n26905,752\n26905,818\n26905,907\n26905,1130\n26905,1284\n26905,1309\n26905,1522\n26905,1715\n26905,2191\n26905,2373\n26905,3804\n26906,163\n26906,292\n26906,392\n26906,579\n26906,809\n26906,1151\n26906,2116\n26906,3769\n26907,4220\n26909,2506\n26910,2506\n26911,1001\n26912,442\n26912,1392\n26913,292\n26914,1433\n26915,143\n26915,178\n26915,435\n26915,1052\n26915,4611\n26916,292\n26917,932\n26918,63\n26919,66\n26919,140\n26920,292\n26921,26922\n26923,135\n26923,16153\n26924,328\n26925,1102\n26926,875\n26927,932\n26928,146\n26928,602\n26928,685\n26928,749\n26928,841\n26928,1285\n26928,1566\n26928,4220\n26928,6119\n26928,26450\n26928,81233\n26929,485\n26930,292\n26931,1052\n26932,182\n26933,292\n26934,1433\n26935,34\n26935,35\n26937,760\n26938,772\n26940,126\n26940,392\n26940,918\n26941,302\n26942,861\n26943,192\n26944,26\n26944,59\n26945,663\n26945,664\n26946,887\n26946,1235\n26946,1335\n26947,1454\n26948,972\n26949,710\n26949,1224\n26950,1522\n26951,1465\n26952,1082\n26953,1556\n26954,1893\n26956,920\n26957,850\n26958,167\n26958,2557\n26959,294\n26960,1663\n26961,3830\n26962,136\n26963,850\n26964,1116\n26964,13136\n26965,1220\n26965,1222\n26966,671\n26967,1309\n26968,483\n26969,1179\n26970,264\n26971,850\n26972,146\n26972,175\n26972,285\n26972,344\n26972,435\n26972,779\n26972,1181\n26972,1294\n26972,1515\n26972,1644\n26972,68069\n26972,92476\n26974,408\n26976,1566\n26977,192\n26978,592\n26979,1052\n26980,200\n26981,65\n26982,957\n26982,1815\n26983,163\n26984,298\n26985,485\n26986,1722\n26987,292\n26988,875\n26989,7652\n26990,500\n26991,671\n26993,364\n26993,48505\n26994,1127\n26994,1673\n26994,1893\n26995,247\n26996,392\n26997,390\n26998,7\n26999,3258\n27000,19413\n27001,406\n27002,364\n27003,160\n27003,252\n27003,406\n27003,516\n27003,1181\n27003,1231\n27003,1782\n27004,2312\n27005,919\n27007,907\n27007,932\n27008,1\n27008,346\n27008,1425\n27009,248\n27011,1151\n27011,1836\n27012,779\n27012,1515\n27013,30\n27013,309\n27013,310\n27013,1385\n27015,211\n27015,794\n27015,2867\n27015,2868\n27015,22880\n27016,151\n27017,1058\n27018,298\n27019,485\n27020,1033\n27021,298\n27022,485\n27023,383\n27024,298\n27025,452\n27025,457\n27025,497\n27025,535\n27025,676\n27025,918\n27025,1655\n27026,485\n27027,1634\n27028,83\n27029,143\n27029,1052\n27030,58\n27030,392\n27030,1140\n27030,1465\n27030,1653\n27031,1231\n27032,323\n27033,3830\n27034,2048\n27035,7117\n27036,140\n27037,991\n27038,5405\n27039,219\n27040,27041\n27041,240\n27041,332\n27041,390\n27041,677\n27041,818\n27041,862\n27041,1285\n27041,1353\n27041,1808\n27041,2512\n27041,5488\n27041,21366\n27041,27040\n27041,31729\n27041,34881\n27041,40723\n27041,46329\n27041,48254\n27041,49784\n27041,50690\n27041,76101\n27041,87753\n27041,111255\n27041,112081\n27041,127924\n27041,154737\n27041,182391\n27041,189358\n27041,233042\n27042,1363\n27042,1465\n27042,1836\n27043,389\n27044,298\n27045,485\n27046,3960\n27048,868\n27049,4\n27049,5\n27050,104\n27051,15\n27052,192\n27052,663\n27053,68\n27053,301\n27053,372\n27053,577\n27053,872\n27053,1010\n27053,1309\n27053,1782\n27053,2083\n27054,2353\n27055,2205\n27055,2206\n27058,1623\n27059,784\n27060,1087\n27060,1267\n27060,1345\n27060,2460\n27060,5192\n27061,809\n27062,259\n27062,2923\n27062,4190\n27063,809\n27065,192\n27066,387\n27066,22071\n27067,852\n27068,1143\n27069,81\n27069,225\n27070,631\n27071,195\n27071,202\n27071,203\n27071,301\n27071,309\n27071,310\n27071,366\n27071,1392\n27071,2073\n27071,3804\n27071,22321\n27071,31206\n27072,388\n27073,389\n27074,392\n27075,338\n27075,349\n27075,467\n27075,1151\n27076,10\n27076,307\n27076,957\n27076,1181\n27076,2244\n27076,72439\n27077,83\n27078,149\n27079,171\n27081,184\n27082,1392\n27083,358\n27085,9195\n27087,1363\n27088,760\n27089,192\n27090,158\n27091,298\n27092,485\n27093,891\n27094,640\n27095,167\n27096,26\n27096,59\n27098,493\n27099,801\n27099,872\n27099,1151\n27101,4220\n27102,143\n27104,493\n27105,298\n27106,485\n27107,302\n27107,579\n27107,687\n27109,1608\n27111,298\n27112,485\n27113,8373\n27114,4344\n27115,634\n27115,635\n27115,2224\n27115,5034\n27115,27115\n27115,66550\n27117,195\n27118,579\n27118,1479\n27119,167\n27119,240\n27119,301\n27119,347\n27119,372\n27119,605\n27119,615\n27119,631\n27119,907\n27119,968\n27119,1001\n27119,1085\n27119,1133\n27119,1160\n27119,1167\n27119,1231\n27119,1284\n27119,1436\n27119,1522\n27119,1715\n27119,1785\n27119,2191\n27119,3193\n27119,3194\n27119,3207\n27119,3218\n27119,3422\n27119,4146\n27119,5662\n27119,5718\n27120,784\n27121,158\n27122,387\n27123,1085\n27124,298\n27125,485\n27126,294\n27126,390\n27126,784\n27126,1119\n27127,392\n27127,595\n27127,852\n27127,1453\n27127,1454\n27128,27129\n27130,634\n27131,107\n27131,111\n27131,652\n27131,1579\n27131,1893\n27131,2312\n27132,233\n27132,372\n27132,805\n27132,1635\n27133,14989\n27134,182\n27135,17228\n27136,188\n27137,723\n27138,1012\n27139,298\n27140,485\n27141,298\n27142,485\n27143,4220\n27144,2979\n27145,146\n27146,83\n27147,640\n27148,622\n27149,211\n27150,151\n27151,640\n27152,859\n27153,72\n27154,852\n27155,24505\n27156,298\n27157,485\n27158,668\n27159,72\n27160,298\n27161,485\n27162,72\n27163,563\n27164,1860\n27165,1858\n27166,1319\n27167,439\n27168,1\n27169,143\n27170,2775\n27171,447\n27172,306\n27172,307\n27173,298\n27174,485\n27175,56\n27175,515\n27175,2915\n27175,30331\n27176,1608\n27176,4903\n27177,968\n27178,151\n27179,184\n27180,27181\n27182,83\n27183,143\n27183,442\n27183,1052\n27183,2156\n27183,2926\n27184,149\n27185,1782\n27186,304\n27186,714\n27187,809\n27188,862\n27189,376\n27190,420\n27191,248\n27191,1332\n27192,302\n27193,120\n27194,27195\n27196,27195\n27197,27195\n27198,27195\n27199,27195\n27199,67447\n27200,27195\n27201,27195\n27202,27195\n27203,4980\n27204,1058\n27205,615\n27206,1634\n27207,27208\n27209,6263\n27210,3148\n27211,115\n27211,118\n27212,949\n27213,1309\n27214,27215\n27214,160219\n27216,195\n27216,27217\n27218,269\n27219,392\n27220,26\n27220,59\n27220,21944\n27221,379\n27223,35\n27223,140\n27224,1124\n27225,481\n27226,217\n27227,240\n27228,720\n27228,920\n27228,3695\n27229,27230\n27231,1287\n27232,2506\n27233,2506\n27234,79\n27234,1181\n27235,264\n27236,571\n27237,147\n27237,640\n27238,27239\n27240,1243\n27241,2372\n27242,240\n27243,2424\n27244,146\n27245,795\n27246,344\n27247,704\n27248,1119\n27249,8719\n27250,138\n27251,865\n27252,557\n27253,137\n27254,118\n27254,4597\n27255,21944\n27256,8719\n27257,138\n27258,865\n27259,557\n27260,1381\n27261,137\n27262,118\n27262,4597\n27263,21944\n27264,8719\n27265,138\n27266,865\n27267,557\n27268,137\n27269,118\n27269,4597\n27270,21944\n27271,8719\n27272,138\n27273,557\n27274,865\n27275,137\n27276,217\n27277,118\n27277,4597\n27278,21944\n27279,557\n27280,557\n27281,557\n27282,2750\n27283,24505\n27284,27285\n27286,1147\n27287,1181\n27288,94\n27288,2787\n27289,861\n27290,72\n27291,779\n27292,85\n27293,302\n27294,206\n27295,146\n27295,151\n27295,563\n27295,1085\n27295,1210\n27295,4101\n27296,302\n27297,27298\n27299,278\n27300,83\n27301,3538\n27302,3138\n27303,72\n27304,9560\n27305,302\n27306,79\n27307,1912\n27308,27309\n27310,195\n27310,333\n27310,640\n27311,58\n27312,247\n27313,27314\n27315,72\n27316,27317\n27318,3989\n27319,143\n27320,171\n27321,1962\n27321,2553\n27322,885\n27323,779\n27324,1204\n27325,2334\n27326,147\n27326,779\n27327,27328\n27329,907\n27330,292\n27331,1608\n27332,27333\n27334,27335\n27336,272\n27337,682\n27338,27339\n27340,2775\n27341,447\n27342,640\n27343,182\n27344,457\n27344,497\n27344,676\n27344,918\n27344,1011\n27344,1655\n27344,5726\n27345,27346\n27345,37187\n27345,51058\n27345,52146\n27345,75579\n27345,81740\n27345,84332\n27345,101446\n27347,422\n27348,422\n27349,422\n27350,422\n27351,422\n27352,422\n27353,27354\n27355,27356\n27357,163\n27358,422\n27359,2620\n27360,258\n27361,2051\n27362,615\n27362,1782\n27363,10\n27364,116\n27364,994\n27364,2087\n27365,2590\n27366,920\n27366,1531\n27368,1313\n27369,483\n27370,585\n27371,225\n27372,8884\n27373,8992\n27374,333\n27375,1556\n27376,9010\n27377,17334\n27378,27379\n27380,27379\n27381,27379\n27382,602\n27383,1313\n27384,23011\n27385,422\n27386,56\n27387,1085\n27388,298\n27389,485\n27390,366\n27391,3069\n27393,366\n27394,366\n27395,366\n27397,422\n27398,56\n27399,9121\n27400,366\n27401,366\n27402,366\n27403,233\n27404,515\n27405,784\n27406,907\n27407,818\n27408,3295\n27409,72\n27410,27411\n27412,27413\n27414,292\n27415,1085\n27416,19986\n27417,450\n27418,202\n27418,203\n27419,27420\n27421,27422\n27423,433\n27424,27425\n27424,27580\n27426,306\n27426,307\n27427,1122\n27428,27429\n27430,27431\n27432,760\n27433,364\n27433,431\n27434,1572\n27435,147\n27435,158\n27435,252\n27435,868\n27435,1220\n27435,1222\n27435,1433\n27436,1323\n27437,102\n27438,1326\n27439,408\n27440,310\n27441,298\n27442,485\n27443,2995\n27444,5213\n27445,682\n27446,192\n27446,663\n27446,664\n27446,1370\n27446,1531\n27446,3872\n27447,1265\n27447,1266\n27449,27450\n27451,1977\n27451,1978\n27452,182\n27453,151\n27453,1673\n27454,27455\n27454,90519\n27454,96857\n27456,424\n27457,2209\n27458,390\n27458,444\n27458,567\n27458,634\n27458,1143\n27458,1801\n27458,2266\n27458,5326\n27458,6068\n27458,6298\n27458,24763\n27458,28693\n27458,103860\n27459,1844\n27460,298\n27461,485\n27462,158\n27463,7\n27464,2506\n27465,2995\n27466,2506\n27467,957\n27467,1815\n27468,450\n27469,2506\n27470,17228\n27471,2506\n27472,27473\n27474,623\n27474,811\n27475,147\n27475,663\n27475,664\n27476,182\n27477,301\n27477,717\n27477,1231\n27477,1740\n27477,1782\n27478,188\n27479,14989\n27480,68\n27482,3422\n27483,6263\n27484,27485\n27486,167\n27486,1241\n27486,1436\n27486,1522\n27486,2083\n27486,2557\n27487,27488\n27487,40973\n27489,1432\n27490,27491\n27490,61515\n27492,1644\n27493,50\n27493,79\n27493,158\n27493,192\n27493,275\n27493,333\n27493,336\n27493,622\n27493,779\n27493,872\n27493,1265\n27493,1266\n27493,1452\n27493,1776\n27493,3876\n27493,5310\n27493,28072\n27493,31499\n27494,1844\n27495,147\n27495,192\n27495,202\n27495,493\n27495,682\n27495,1220\n27495,1222\n27495,1243\n27495,2244\n27495,4771\n27495,72439\n27498,596\n27501,500\n27502,1962\n27503,1052\n27504,1882\n27505,2775\n27506,54\n27507,2210\n27507,4237\n27508,137\n27509,1608\n27509,1801\n27510,333\n27511,312\n27511,1068\n27511,1309\n27511,1454\n27511,1722\n27511,3538\n27511,5440\n27512,1010\n27513,749\n27513,775\n27513,1001\n27514,9121\n27515,171\n27516,872\n27517,3507\n27518,1644\n27519,13661\n27520,310\n27521,1392\n27522,450\n27523,2051\n27523,27524\n27523,58394\n27525,1096\n27526,298\n27527,485\n27528,72\n27529,27530\n27531,1284\n27532,1\n27533,422\n27534,56\n27535,7360\n27536,1414\n27537,500\n27538,366\n27539,26\n27539,59\n27540,2574\n27541,450\n27542,1010\n27543,7360\n27544,1837\n27545,907\n27546,2979\n27547,535\n27548,358\n27549,3582\n27549,27550\n27549,221341\n27550,911\n27550,1888\n27550,6837\n27550,27550\n27550,48603\n27550,62989\n27550,65849\n27550,77026\n27550,162593\n27550,245940\n27551,1085\n27552,273\n27552,274\n27553,301\n27554,298\n27555,485\n27556,184\n27557,818\n27558,388\n27559,240\n27560,450\n27561,1893\n27562,9323\n27563,27564\n27565,27564\n27566,27567\n27568,1085\n27569,4\n27569,5\n27569,142433\n27570,27571\n27572,158\n27573,140\n27573,1370\n27574,1837\n27575,9011\n27575,9032\n27576,1368\n27577,4980\n27578,801\n27578,1241\n27579,1309\n27581,2995\n27582,15573\n27583,27584\n27585,3148\n27586,301\n27586,305\n27586,372\n27586,510\n27586,516\n27586,1210\n27586,1298\n27586,1837\n27586,3193\n27587,298\n27588,485\n27589,298\n27590,485\n27591,195\n27592,3193\n27593,167\n27594,1284\n27595,390\n27596,9560\n27597,233\n27597,289\n27597,290\n27597,592\n27597,631\n27597,818\n27597,1818\n27597,94134\n27598,3804\n27599,483\n27600,801\n27600,1140\n27600,5547\n27600,27601\n27600,35255\n27600,58786\n27600,68069\n27600,86832\n27602,389\n27603,27604\n27603,108940\n27605,27606\n27607,27608\n27609,16045\n27610,682\n27611,143\n27611,1052\n27612,615\n27612,859\n27613,143\n27613,1052\n27614,859\n27615,27616\n27617,8270\n27618,298\n27619,485\n27620,2051\n27620,27621\n27620,27623\n27622,376\n27624,298\n27625,485\n27626,3111\n27627,298\n27628,485\n27629,278\n27630,298\n27631,485\n27632,298\n27633,485\n27634,27635\n27636,1479\n27637,433\n27638,1227\n27638,1229\n27639,1149\n27640,298\n27641,485\n27642,1414\n27643,143\n27644,2367\n27645,2617\n27646,298\n27647,485\n27648,450\n27649,2048\n27650,167\n27650,818\n27650,2979\n27651,255\n27652,27653\n27652,27654\n27652,27655\n27656,1235\n27656,1335\n27656,21944\n27657,27658\n27660,450\n27661,694\n27662,215\n27663,35\n27664,640\n27665,481\n27666,160\n27667,269\n27668,240\n27669,217\n27670,143\n27671,298\n27672,485\n27673,424\n27674,640\n27675,875\n27676,143\n27677,4453\n27678,3209\n27679,143\n27680,338\n27680,760\n27681,3069\n27682,158\n27682,779\n27683,146\n27684,10\n27685,1313\n27686,14819\n27687,3161\n27688,333\n27689,27690\n27689,57611\n27691,479\n27692,272\n27693,907\n27694,818\n27696,115\n27696,118\n27697,8992\n27698,1644\n27699,585\n27700,292\n27701,206\n27702,1381\n27703,7194\n27704,160\n27705,30\n27705,328\n27706,349\n27707,422\n27708,56\n27709,27710\n27711,27710\n27712,27710\n27713,5366\n27714,17334\n27715,1181\n27716,23011\n27717,3069\n27718,7\n27719,163\n27720,640\n27721,640\n27722,310\n27723,27724\n27725,422\n27726,56\n27727,953\n27728,596\n27729,364\n27730,65\n27731,72\n27732,202\n27732,203\n27733,19986\n27734,27735\n27736,151\n27737,8788\n27738,2244\n27739,694\n27739,3115\n27740,233\n27741,298\n27742,1265\n27742,1266\n27743,640\n27744,9121\n27745,366\n27746,366\n27747,704\n27748,107\n27749,2416\n27749,2417\n27750,292\n27751,338\n27752,366\n27753,298\n27754,366\n27755,366\n27756,366\n27757,366\n27758,366\n27759,366\n27760,366\n27761,1133\n27762,3538\n27763,366\n27764,366\n27765,250\n27766,7117\n27767,1419\n27768,9560\n27769,7\n27770,366\n27771,2244\n27772,13\n27772,50\n27772,192\n27772,233\n27772,309\n27772,310\n27772,338\n27772,489\n27772,841\n27772,1243\n27772,1381\n27772,2353\n27772,3370\n27772,3507\n27772,6119\n27772,8541\n27772,14453\n27772,27773\n27772,66297\n27774,17228\n27775,346\n27776,27777\n27778,182\n27779,188\n27780,298\n27781,485\n27782,27783\n27784,6263\n27785,50\n27785,147\n27785,202\n27785,203\n27785,222\n27785,285\n27785,333\n27785,406\n27785,586\n27785,620\n27785,994\n27785,1181\n27785,1515\n27785,2782\n27786,14989\n27787,104\n27788,24332\n27789,27790\n27791,175\n27791,1089\n27791,1247\n27791,164572\n27792,27793\n27794,27795\n27796,137\n27797,104\n27798,27799\n27798,122711\n27800,1644\n27801,151\n27802,1\n27802,2089\n27802,2940\n27802,21944\n27803,298\n27804,485\n27805,714\n27806,3872\n27807,2750\n27808,34\n27808,35\n27808,313\n27808,536\n27808,1417\n27809,298\n27810,485\n27811,158\n27812,27813\n27814,3367\n27815,1309\n27816,298\n27817,485\n27818,2995\n27819,298\n27820,485\n27821,15573\n27822,1370\n27823,312\n27824,7652\n27825,72\n27826,392\n27827,83\n27827,240\n27827,301\n27827,435\n27827,467\n27827,818\n27828,718\n27829,7360\n27830,1227\n27830,1229\n27831,875\n27832,620\n27833,9323\n27835,347\n27835,392\n27835,2266\n27835,3585\n27836,171\n27837,586\n27838,104\n27840,104\n27841,760\n27842,298\n27843,485\n27844,563\n27845,1085\n27846,595\n27846,818\n27846,1313\n27846,81648\n27847,3960\n27848,178\n27849,718\n27850,2051\n27851,1635\n27852,1247\n27853,1590\n27854,3209\n27855,4\n27855,5\n27856,1983\n27857,994\n27858,994\n27859,3148\n27860,859\n27861,2105\n27862,2105\n27863,1474\n27864,9560\n27865,682\n27866,875\n27867,16045\n27868,887\n27869,483\n27870,1140\n27871,315\n27872,27871\n27873,1551\n27874,1363\n27875,8270\n27876,968\n27877,24505\n27878,158\n27879,269\n27880,22\n27880,2017\n27880,17309\n27881,298\n27881,2995\n27882,255\n27883,27884\n27885,255\n27888,592\n27889,1298\n27891,289\n27891,290\n27891,2296\n27892,1305\n27893,2048\n27894,4475\n27895,171\n27896,9011\n27896,9032\n27897,1285\n27898,72\n27899,304\n27900,1659\n27901,366\n27901,972\n27901,37414\n27902,143\n27903,240\n27903,818\n27903,1210\n27904,360\n27905,27906\n27907,27908\n27909,376\n27910,392\n27911,450\n27912,1247\n27913,393\n27914,252\n27914,1058\n27915,718\n27916,868\n27917,1117\n27918,1224\n27919,868\n27920,27921\n27920,43006\n27920,51616\n27920,65025\n27920,82025\n27920,83094\n27922,143\n27923,557\n27924,862\n27925,557\n27926,5906\n27927,557\n27928,626\n27929,278\n27930,137\n27931,862\n27932,5906\n27933,557\n27934,626\n27935,278\n27936,137\n27937,862\n27938,1722\n27939,500\n27940,493\n27940,682\n27940,72439\n27941,298\n27942,485\n27943,557\n27944,557\n27945,9011\n27945,9032\n27946,1414\n27947,10\n27948,1282\n27949,1359\n27950,1151\n27950,1836\n27951,2775\n27952,447\n27953,1531\n27954,743\n27954,991\n27954,1058\n27954,1227\n27954,1821\n27954,86416\n27954,189794\n27954,223738\n27955,1227\n27955,1229\n27955,86416\n27956,640\n27957,611\n27958,83\n27959,422\n27960,56\n27961,298\n27962,485\n27963,27964\n27966,652\n27967,1715\n27968,809\n27969,589\n27970,422\n27971,422\n27972,422\n27973,422\n27974,422\n27975,422\n27976,6068\n27977,143\n27978,143\n27979,1707\n27980,143\n27981,10\n27982,2351\n27983,298\n27984,485\n27985,25\n27985,93\n27985,94\n27985,2088\n27986,275\n27987,17334\n27988,27989\n27990,27991\n27990,181549\n27990,257567\n27992,346\n27993,146\n27994,2334\n27995,27996\n27997,1096\n27997,2837\n27998,333\n27999,8308\n28000,991\n28000,992\n28001,115\n28001,118\n28002,10\n28002,147\n28002,841\n28002,31977\n28002,98426\n28003,255\n28004,907\n28005,175\n28006,2367\n28007,818\n28009,3069\n28010,577\n28010,2416\n28010,2417\n28011,301\n28012,1238\n28013,298\n28014,485\n28015,525\n28015,28016\n28015,92741\n28015,120461\n28015,151636\n28017,28018\n28019,28018\n28020,481\n28021,1452\n28022,1313\n28023,292\n28024,28025\n28026,1985\n28027,3161\n28028,602\n28029,28030\n28029,69838\n28029,79671\n28029,80848\n28029,81087\n28029,86108\n28029,87301\n28029,87572\n28029,95698\n28029,98210\n28029,103870\n28029,110427\n28029,110437\n28029,111643\n28029,115307\n28029,119073\n28029,120163\n28031,20\n28031,77\n28031,85\n28031,86\n28031,119\n28031,120\n28031,142430\n28032,28033\n28034,1\n28034,32\n28034,50\n28034,79\n28034,99\n28034,163\n28034,187\n28034,233\n28034,273\n28034,274\n28034,298\n28034,358\n28034,403\n28034,408\n28034,422\n28034,442\n28034,447\n28034,491\n28034,602\n28034,626\n28034,647\n28034,671\n28034,718\n28034,745\n28034,749\n28034,784\n28034,827\n28034,872\n28034,1007\n28034,1058\n28034,1082\n28034,1113\n28034,1227\n28034,1247\n28034,1262\n28034,1298\n28034,1305\n28034,1571\n28034,1619\n28034,1634\n28034,1962\n28034,2867\n28034,2868\n28034,3474\n28034,3999\n28034,4597\n28034,6556\n28034,6682\n28034,9015\n28034,16201\n28034,16687\n28034,21442\n28034,30331\n28034,86416\n28034,115659\n28034,144556\n28035,206\n28036,557\n28038,28039\n28040,158\n28041,147\n28042,104\n28042,134\n28042,136\n28042,137\n28042,138\n28042,2105\n28043,28044\n28043,57697\n28043,75556\n28043,82231\n28043,120711\n28045,158\n28045,192\n28045,406\n28045,422\n28045,424\n28045,602\n28046,602\n28047,8992\n28048,585\n28050,953\n28051,1133\n28052,5366\n28053,28054\n28055,275\n28056,1001\n28057,602\n28058,254\n28059,292\n28060,294\n28061,296\n28062,298\n28063,323\n28064,850\n28065,8788\n28066,1010\n28067,9121\n28068,289\n28068,290\n28069,251\n28070,28071\n28073,28074\n28075,8180\n28076,255\n28077,104\n28077,338\n28077,462\n28077,473\n28077,2367\n28077,4039\n28077,8149\n28077,13538\n28077,21408\n28078,28079\n28078,59476\n28078,90561\n28078,104117\n28078,119264\n28080,219\n28081,146\n28082,309\n28082,310\n28083,247\n28084,206\n28085,640\n28086,72\n28087,344\n28088,285\n28089,1745\n28090,163\n28091,710\n28092,3193\n28093,1133\n28094,163\n28095,182\n28096,28096\n28097,182\n28098,188\n28099,163\n28100,644\n28101,28102\n28103,28102\n28104,366\n28105,535\n28106,366\n28107,401\n28107,707\n28107,875\n28107,1663\n28107,1696\n28107,1801\n28107,3258\n28107,6424\n28107,6437\n28107,14098\n28107,14425\n28107,18880\n28107,19285\n28107,25395\n28107,28107\n28107,28193\n28107,28387\n28107,29569\n28107,38711\n28107,46129\n28107,49003\n28107,65615\n28107,80519\n28107,102536\n28107,138731\n28107,141656\n28107,145407\n28107,174318\n28107,185270\n28107,189266\n28107,211816\n28107,213931\n28107,234231\n28107,253346\n28109,602\n28109,3218\n28109,4866\n28110,1181\n28112,134\n28112,225\n28112,431\n28112,636\n28112,868\n28112,3367\n28112,3474\n28112,5405\n28113,500\n28114,1284\n28114,1732\n28115,147\n28115,336\n28115,406\n28115,1849\n28117,28118\n28119,255\n28120,24332\n28121,143\n28122,9195\n28123,9323\n28124,306\n28124,307\n28125,717\n28127,255\n28128,604\n28128,750\n28128,1293\n28129,718\n28129,1707\n28130,83\n28130,217\n28130,536\n28130,852\n28130,949\n28130,1618\n28130,2784\n28130,2944\n28130,5702\n28130,7698\n28130,18345\n28130,19443\n28130,28131\n28130,28140\n28130,29954\n28130,44301\n28130,56584\n28130,88283\n28130,125513\n28130,165640\n28130,229657\n28130,232223\n28131,28130\n28132,77\n28134,3193\n28135,87\n28136,760\n28137,163\n28137,579\n28138,577\n28139,315\n28140,536\n28140,28130\n28141,2460\n28142,22\n28142,192\n28142,397\n28142,442\n28142,1973\n28143,58\n28144,390\n28145,389\n28146,247\n28147,1019\n28148,10\n28148,28149\n28150,1392\n28151,1227\n28151,1229\n28151,1252\n28151,1253\n28152,83\n28152,718\n28152,875\n28153,671\n28154,72\n28155,516\n28156,58\n28157,46\n28159,143\n28160,255\n28161,338\n28161,801\n28161,3585\n28162,387\n28162,22071\n28164,5101\n28165,626\n28166,818\n28166,1893\n28167,1007\n28167,1411\n28167,3041\n28167,8868\n28169,217\n28169,455\n28169,1019\n28169,6789\n28170,358\n28170,379\n28173,28174\n28175,1323\n28176,102\n28177,1326\n28178,408\n28179,640\n28180,640\n28181,1085\n28182,1085\n28183,493\n28184,14366\n28185,7652\n28186,515\n28186,1893\n28186,2617\n28187,1983\n28188,1177\n28188,2210\n28189,3069\n28190,2244\n28191,58\n28191,104\n28191,136\n28191,137\n28191,248\n28191,289\n28191,290\n28191,298\n28191,372\n28191,557\n28191,1001\n28191,1282\n28191,1368\n28191,1659\n28191,1715\n28191,1749\n28191,1955\n28191,2209\n28191,3623\n28191,75912\n28192,13\n28192,920\n28192,1619\n28193,1696\n28193,6424\n28193,28107\n28194,104\n28194,557\n28194,953\n28194,954\n28196,481\n28196,1696\n28197,17228\n28198,760\n28198,809\n28198,1631\n28200,605\n28200,649\n28200,783\n28200,973\n28200,1058\n28200,1298\n28200,2373\n28200,2411\n28200,2605\n28200,136072\n28200,142473\n28201,563\n28202,649\n28203,30\n28203,200\n28203,248\n28203,328\n28203,596\n28203,693\n28203,772\n28203,1014\n28203,1415\n28203,4276\n28203,4941\n28203,19457\n28203,28203\n28203,75936\n28203,85814\n28203,87883\n28203,95554\n28203,104555\n28203,125879\n28203,147761\n28204,264\n28204,1433\n28204,1556\n28205,1512\n28205,2353\n28206,1844\n28207,392\n28207,1143\n28207,1240\n28207,1363\n28207,1454\n28207,1465\n28208,1368\n28209,843\n28210,104\n28211,493\n28211,1007\n28212,206\n28212,1425\n28213,510\n28214,4\n28214,5\n28215,32\n28216,147\n28216,158\n28217,302\n28218,718\n28219,2995\n28220,500\n28220,718\n28221,795\n28221,1955\n28221,5961\n28222,1247\n28225,143\n28225,1052\n28225,1415\n28226,32\n28226,392\n28227,15573\n28228,1096\n28229,58\n28229,87\n28229,703\n28229,801\n28229,852\n28229,1722\n28230,422\n28231,56\n28232,2944\n28233,264\n28233,338\n28233,360\n28233,479\n28233,652\n28233,872\n28233,1289\n28233,1659\n28233,1893\n28234,1143\n28234,1363\n28236,28237\n28238,455\n28239,1983\n28240,1\n28240,994\n28240,1425\n28240,1623\n28240,3769\n28240,6837\n28240,30331\n28241,579\n28242,14989\n28243,32\n28243,392\n28244,107\n28244,442\n28244,1332\n28245,83\n28246,1052\n28247,1556\n28248,3960\n28249,599\n28250,158\n28250,1181\n28251,298\n28252,485\n28253,422\n28257,1267\n28258,1556\n28259,56\n28259,147\n28259,158\n28259,192\n28259,333\n28259,493\n28259,585\n28259,586\n28259,602\n28259,779\n28259,920\n28259,1181\n28259,1243\n28259,1247\n28259,1963\n28259,2931\n28259,3872\n28259,4060\n28259,8270\n28259,18810\n28259,164572\n28260,1143\n28260,3507\n28261,298\n28262,485\n28263,852\n28263,862\n28263,1179\n28264,298\n28265,485\n28266,588\n28266,590\n28266,1411\n28266,3138\n28268,206\n28268,801\n28268,849\n28268,1011\n28268,1392\n28269,390\n28270,81\n28270,83\n28270,158\n28270,215\n28270,222\n28270,227\n28270,233\n28270,240\n28270,278\n28270,289\n28270,294\n28270,372\n28270,390\n28270,392\n28270,406\n28270,431\n28270,455\n28270,536\n28270,589\n28270,592\n28270,631\n28270,714\n28270,784\n28270,805\n28270,809\n28270,949\n28270,1001\n28270,1019\n28270,1085\n28270,1119\n28270,1235\n28270,1241\n28270,1285\n28270,1335\n28270,1392\n28270,1467\n28270,1511\n28270,1531\n28270,1539\n28270,1551\n28270,1580\n28270,1962\n28270,2205\n28270,2266\n28270,2421\n28270,2424\n28270,2443\n28270,2557\n28270,2671\n28270,2979\n28270,2995\n28270,3069\n28270,3135\n28270,4222\n28270,5906\n28270,6068\n28270,6506\n28270,7194\n28270,8788\n28270,15609\n28270,33424\n28270,37088\n28270,94134\n28270,245910\n28271,56\n28271,175\n28271,595\n28273,500\n28274,1962\n28275,1052\n28276,1882\n28277,2775\n28278,54\n28279,2210\n28279,4237\n28280,1858\n28281,1860\n28282,415\n28282,455\n28282,536\n28282,644\n28282,1858\n28282,2989\n28282,2991\n28282,13361\n28282,32751\n28282,138686\n28283,1644\n28284,119\n28284,178\n28284,299\n28284,366\n28284,387\n28284,440\n28284,2373\n28284,2989\n28284,2991\n28284,14458\n28285,1072\n28286,5405\n28287,1257\n28288,312\n28288,525\n28289,167\n28289,1715\n28289,2620\n28289,3218\n28290,3069\n28291,503\n28291,1149\n28291,1973\n28292,163\n28292,209\n28292,302\n28292,579\n28293,160\n28294,485\n28294,877\n28294,911\n28294,1096\n28294,2135\n28294,8072\n28294,14511\n28294,16503\n28294,28294\n28294,28334\n28294,30440\n28294,32335\n28294,32515\n28294,44401\n28294,68732\n28294,72436\n28294,72440\n28294,80346\n28294,81949\n28294,125820\n28294,170304\n28294,225339\n28294,243113\n28295,358\n28295,1436\n28296,22\n28296,861\n28297,1151\n28297,1836\n28298,1436\n28300,275\n28301,1309\n28302,1805\n28303,275\n28304,302\n28305,167\n28305,217\n28305,1019\n28305,1085\n28305,2411\n28306,2460\n28307,1635\n28308,50\n28309,34\n28309,68\n28309,261\n28309,333\n28309,393\n28309,435\n28309,442\n28309,479\n28309,697\n28309,809\n28309,862\n28309,1204\n28309,1282\n28309,1298\n28309,1332\n28309,1363\n28309,1390\n28309,1462\n28309,1551\n28309,1612\n28309,1836\n28309,2206\n28309,2671\n28309,33424\n28309,245910\n28310,760\n28310,818\n28311,557\n28311,1332\n28312,259\n28312,577\n28312,726\n28312,788\n28312,859\n28312,1531\n28312,6803\n28313,718\n28314,1285\n28316,1509\n28317,163\n28317,209\n28317,301\n28317,302\n28317,457\n28317,525\n28317,631\n28317,784\n28317,968\n28317,1085\n28317,1210\n28317,1782\n28317,5662\n28317,8180\n28317,75912\n28318,79\n28319,1740\n28320,79\n28320,192\n28321,171\n28323,83\n28323,1326\n28323,1844\n28324,1282\n28324,1882\n28325,626\n28325,1241\n28325,1479\n28326,18831\n28327,1425\n28329,663\n28329,664\n28330,781\n28331,48\n28331,149\n28331,599\n28331,712\n28332,1983\n28333,5662\n28335,22\n28335,861\n28335,2116\n28336,1977\n28336,1978\n28337,527\n28337,740\n28337,741\n28337,743\n28337,8714\n28338,72\n28338,83\n28338,120\n28338,694\n28338,1012\n28338,1419\n28338,3115\n28338,7757\n28339,1127\n28340,126\n28341,1837\n28342,1298\n28343,163\n28344,515\n28345,2209\n28346,1332\n28347,2006\n28348,28349\n28349,5\n28349,26\n28349,34\n28349,94\n28349,116\n28349,117\n28349,118\n28349,290\n28349,307\n28349,590\n28349,664\n28349,954\n28349,957\n28349,1222\n28349,1235\n28349,1253\n28349,1266\n28349,1462\n28349,1511\n28349,1512\n28349,1684\n28349,1980\n28349,2089\n28349,2178\n28349,2206\n28349,2417\n28349,2991\n28349,3247\n28349,3370\n28349,3794\n28349,4234\n28349,5358\n28349,5359\n28349,9031\n28349,13704\n28349,15609\n28349,17245\n28349,21736\n28349,33424\n28349,47750\n28349,56150\n28349,58979\n28349,72439\n28349,92476\n28349,94134\n28349,163964\n28349,164572\n28349,182162\n28349,230510\n28349,230512\n28349,245910\n28350,60576\n28351,3585\n28352,3148\n28353,217\n28353,283\n28353,2944\n28353,23287\n28353,102560\n28353,138686\n28353,181063\n28353,188791\n28353,207045\n28353,211889\n28353,212914\n28354,56\n28354,192\n28354,227\n28354,251\n28354,272\n28354,301\n28354,435\n28354,516\n28354,818\n28354,1033\n28354,1210\n28354,1243\n28354,1368\n28354,1370\n28354,1512\n28354,1631\n28354,1877\n28354,2782\n28354,5405\n28354,5992\n28354,191355\n28355,79\n28356,1453\n28357,6303\n28358,718\n28359,1707\n28360,65\n28360,171\n28360,957\n28360,1247\n28360,1815\n28363,21944\n28364,158\n28364,336\n28364,406\n28365,406\n28366,2828\n28367,104\n28367,200\n28367,254\n28367,557\n28367,953\n28367,954\n28368,22\n28368,211\n28368,861\n28368,13361\n28369,2699\n28370,167\n28371,178\n28372,151\n28373,222\n28375,589\n28375,1122\n28376,424\n28376,1634\n28376,2931\n28376,8072\n28377,439\n28377,493\n28377,1181\n28377,1243\n28377,1776\n28377,1849\n28377,4611\n28377,32784\n28378,7360\n28379,392\n28380,4\n28380,5\n28380,527\n28380,740\n28380,741\n28380,743\n28381,1544\n28382,280\n28383,920\n28384,6424\n28385,406\n28386,302\n28386,893\n28387,28107\n28388,920\n28389,467\n28389,1433\n28390,493\n28391,634\n28391,3422\n28392,292\n28393,718\n28394,83\n28394,440\n28394,489\n28394,577\n28394,893\n28394,1796\n28394,2073\n28394,3804\n28394,4453\n28394,142879\n28395,292\n28396,10\n28397,4190\n28398,292\n28399,349\n28399,392\n28399,3367\n28400,102\n28402,292\n28405,10\n28406,433\n28410,4039\n28411,151\n28412,843\n28413,54\n28414,247\n28415,611\n28416,20\n28416,435\n28416,671\n28416,676\n28416,1033\n28416,1068\n28416,1294\n28416,1565\n28416,1612\n28416,1789\n28416,3241\n28416,3831\n28416,3903\n28416,5212\n28416,5731\n28416,8425\n28416,13713\n28416,19191\n28416,26864\n28416,29251\n28416,31195\n28416,31224\n28416,34184\n28416,34342\n28416,34508\n28417,3999\n28418,422\n28419,891\n28420,56\n28421,292\n28422,24505\n28423,392\n28423,972\n28424,211\n28424,500\n28425,1877\n28426,473\n28426,8149\n28427,718\n28427,931\n28428,211\n28429,5405\n28430,292\n28431,30\n28432,408\n28433,516\n28434,292\n28435,292\n28436,292\n28437,346\n28438,843\n28439,298\n28440,485\n28441,292\n28442,41\n28442,111\n28442,134\n28442,442\n28442,1001\n28442,1368\n28442,1659\n28442,1722\n28442,2089\n28442,2286\n28442,2940\n28442,8180\n28442,21944\n28442,136072\n28443,22\n28444,682\n28445,292\n28446,147\n28447,392\n28448,225\n28448,1332\n28449,79\n28449,980\n28449,1052\n28449,1531\n28450,392\n28450,615\n28450,1240\n28450,1465\n28450,1782\n28452,292\n28453,28454\n28455,604\n28455,605\n28455,968\n28456,1707\n28457,292\n28458,581\n28458,918\n28459,292\n28460,292\n28461,292\n28462,26\n28462,59\n28462,430\n28462,994\n28462,21944\n28463,192\n28464,30\n28464,392\n28464,510\n28464,2116\n28465,79\n28466,8798\n28467,388\n28468,7572\n28469,4549\n28470,9098\n28471,1837\n28472,1465\n28473,2989\n28473,2991\n28475,4611\n28476,292\n28477,292\n28478,1722\n28478,3538\n28479,35\n28479,217\n28479,4672\n28479,18831\n28480,28481\n28482,392\n28483,48\n28484,718\n28485,292\n28487,356\n28487,390\n28487,615\n28487,852\n28487,1293\n28487,1955\n28487,3422\n28489,640\n28489,671\n28489,1515\n28489,2867\n28489,2868\n28490,647\n28490,1175\n28491,850\n28492,1010\n28493,28494\n28493,248266\n28495,292\n28496,9560\n28497,1425\n28498,240\n28498,301\n28499,292\n28500,1274\n28501,240\n28501,726\n28501,818\n28502,83\n28504,292\n28505,302\n28505,344\n28506,28507\n28508,151\n28509,588\n28509,590\n28509,1419\n28510,450\n28511,19\n28511,222\n28511,1571\n28511,2266\n28511,211889\n28513,772\n28514,10\n28516,83\n28516,2319\n28517,247\n28518,292\n28519,1181\n28520,861\n28521,450\n28522,5591\n28523,9011\n28523,9032\n28524,83\n28525,28526\n28527,292\n28528,54\n28530,28531\n28532,809\n28533,83\n28533,222\n28534,50\n28535,143\n28535,1052\n28538,626\n28539,192\n28539,220502\n28539,221326\n28540,1433\n28541,1151\n28541,1836\n28542,626\n28543,376\n28544,30\n28545,217\n28545,240\n28545,269\n28545,435\n28545,467\n28545,818\n28545,1181\n28545,1298\n28545,1370\n28545,1417\n28545,1531\n28545,75912\n28545,127158\n28546,5405\n28547,298\n28548,485\n28549,406\n28550,10\n28551,298\n28552,485\n28553,10\n28553,240\n28553,294\n28553,784\n28553,1285\n28553,1309\n28553,1962\n28553,2512\n28553,2775\n28553,6824\n28553,9015\n28554,344\n28555,9007\n28555,31497\n28556,248\n28557,298\n28558,485\n28559,195\n28560,298\n28561,485\n28562,389\n28562,694\n28562,1353\n28562,2775\n28563,147\n28564,184\n28565,158\n28566,143\n28567,28568\n28569,28570\n28569,56935\n28569,57833\n28569,80520\n28569,86286\n28569,88889\n28569,97870\n28569,98640\n28569,108665\n28569,123527\n28569,125657\n28571,20757\n28572,1707\n28573,240\n28574,5375\n28575,255\n28576,86\n28577,485\n28578,255\n28579,192\n28580,1414\n28581,534\n28582,72\n28583,83\n28584,304\n28584,1285\n28585,269\n28586,272\n28587,6803\n28589,247\n28590,304\n28590,1188\n28591,211\n28592,83\n28593,422\n28593,760\n28593,1019\n28594,536\n28595,843\n28596,2671\n28597,306\n28597,307\n28598,184\n28599,697\n28600,536\n28600,18831\n28601,299\n28602,4220\n28603,349\n28603,392\n28603,697\n28603,720\n28603,3260\n28604,292\n28605,949\n28605,2784\n28605,19005\n28606,206\n28606,586\n28607,143\n28608,2797\n28609,298\n28610,485\n28611,292\n28612,861\n28613,4475\n28614,298\n28615,485\n28616,207\n28617,1285\n28618,304\n28619,298\n28620,485\n28621,302\n28622,151\n28623,79\n28624,718\n28625,5440\n28626,251\n28626,393\n28626,450\n28626,671\n28626,893\n28626,1012\n28626,1243\n28626,1309\n28626,1789\n28626,1983\n28626,15573\n28627,298\n28628,485\n28629,868\n28630,640\n28631,1151\n28631,1836\n28632,258\n28633,1359\n28634,358\n28634,379\n28634,1262\n28635,907\n28636,41\n28636,68\n28637,720\n28637,1284\n28638,160\n28638,250\n28638,310\n28638,346\n28638,577\n28638,1058\n28638,1381\n28638,1684\n28638,3039\n28638,19010\n28638,29380\n28639,6068\n28640,491\n28641,298\n28642,485\n28643,171\n28644,28645\n28646,202\n28646,203\n28647,248\n28648,135\n28649,22\n28649,65\n28649,240\n28649,269\n28649,438\n28649,687\n28649,809\n28649,818\n28649,861\n28649,1058\n28649,1363\n28649,1374\n28649,1659\n28649,1796\n28649,2017\n28649,2073\n28649,2292\n28649,2312\n28649,4823\n28649,21442\n28649,141912\n28650,1235\n28650,1335\n28651,47\n28651,1235\n28651,1335\n28651,2469\n28652,704\n28653,795\n28654,2351\n28655,79\n28656,10\n28657,1381\n28658,2083\n28659,83\n28660,1608\n28661,1556\n28662,298\n28663,485\n28664,187\n28665,298\n28666,485\n28667,158\n28668,302\n28669,312\n28670,250\n28671,222\n28671,379\n28671,634\n28671,657\n28671,2421\n28672,304\n28672,372\n28673,652\n28674,1417\n28675,1102\n28676,130\n28677,28678\n28677,102206\n28677,254516\n28680,24\n28680,26\n28680,59\n28680,885\n28680,4079\n28680,21944\n28681,557\n28682,557\n28683,217\n28684,4101\n28685,389\n28686,28687\n28688,28687\n28688,83592\n28688,103620\n28688,110539\n28688,125782\n28688,154105\n28688,160288\n28689,28687\n28689,110539\n28689,125782\n28690,493\n28691,304\n28692,211\n28694,323\n28695,704\n28696,255\n28697,850\n28698,1140\n28699,920\n28700,28701\n28700,40373\n28700,50145\n28700,53066\n28700,53274\n28700,62570\n28700,82426\n28702,10\n28702,113156\n28703,280\n28703,626\n28703,736\n28703,862\n28703,873\n28703,874\n28703,925\n28703,1001\n28703,1133\n28703,1363\n28703,1370\n28703,2797\n28703,3585\n28703,4549\n28703,17245\n28704,8907\n28705,557\n28705,1939\n28706,104\n28706,248\n28707,269\n28708,4453\n28709,147\n28710,184\n28711,247\n28712,920\n28713,3209\n28714,920\n28715,663\n28715,664\n28715,2178\n28715,4545\n28716,663\n28716,1298\n28717,28718\n28719,143\n28720,10\n28721,1381\n28722,143\n28723,392\n28724,192\n28724,222\n28724,310\n28724,588\n28724,590\n28724,1177\n28724,1844\n28724,2073\n28724,2626\n28724,3039\n28724,3804\n28724,4831\n28724,8270\n28724,25222\n28724,182162\n28725,1313\n28726,28727\n28728,3161\n28729,272\n28730,7\n28730,211\n28730,315\n28730,788\n28731,479\n28732,907\n28733,818\n28734,115\n28734,118\n28735,65\n28736,332\n28737,292\n28738,483\n28739,147\n28740,206\n28741,8992\n28742,585\n28743,28744\n28745,346\n28746,104\n28746,136\n28746,557\n28746,953\n28746,1368\n28746,1939\n28747,135\n28747,137\n28748,28749\n28750,312\n28751,1149\n28752,5366\n28753,14366\n28754,28755\n28756,23011\n28757,3069\n28758,135\n28759,301\n28759,968\n28760,953\n28761,2750\n28762,346\n28763,28764\n28765,28766\n28767,2574\n28768,424\n28769,81\n28770,19986\n28771,202\n28771,203\n28772,8788\n28773,272\n28774,167\n28774,2083\n28775,215\n28776,233\n28777,2812\n28778,1127\n28779,579\n28780,28781\n28780,32678\n28782,63\n28783,712\n28784,143\n28785,289\n28785,290\n28785,1298\n28785,2083\n28786,518\n28787,104\n28787,134\n28788,1370\n28789,516\n28790,28791\n28792,298\n28793,485\n28794,106\n28794,1033\n28796,634\n28797,1146\n28798,3209\n28799,50\n28799,79\n28799,1566\n28800,222\n28800,850\n28801,292\n28802,1113\n28802,1436\n28802,1564\n28803,187\n28803,920\n28803,1619\n28804,298\n28805,485\n28806,292\n28807,207\n28808,920\n28809,28810\n28809,45954\n28809,85175\n28811,1983\n28811,2205\n28811,2206\n28811,2210\n28811,2775\n28811,4237\n28811,111142\n28812,694\n28812,4060\n28813,690\n28814,292\n28814,338\n28814,467\n28814,510\n28814,835\n28814,872\n28814,1052\n28814,1130\n28814,1151\n28814,1688\n28814,4039\n28816,264\n28816,467\n28817,602\n28819,306\n28819,307\n28820,1749\n28820,3585\n28822,28823\n28825,911\n28826,10\n28827,781\n28828,861\n28828,1623\n28828,3069\n28829,30\n28830,1400\n28832,304\n28832,534\n28832,1085\n28832,1580\n28832,4222\n28832,44725\n28832,101935\n28832,103860\n28833,326\n28833,340\n28833,994\n28834,255\n28835,433\n28836,493\n28837,1580\n28838,779\n28839,298\n28840,485\n28841,907\n28842,500\n28842,3830\n28843,1313\n28844,120\n28844,389\n28844,657\n28844,1353\n28844,142430\n28845,818\n28846,652\n28847,604\n28848,298\n28849,485\n28851,192\n28851,366\n28851,949\n28851,1623\n28851,4691\n28851,30427\n28851,114600\n28853,1132\n28854,1293\n28855,1132\n28856,843\n28857,120\n28858,3161\n28861,28862\n28863,1323\n28864,102\n28865,1326\n28866,408\n28867,760\n28868,292\n28870,13361\n28871,1659\n28873,178\n28873,622\n28873,1033\n28874,1718\n28875,302\n28876,3161\n28877,714\n28878,143\n28879,11\n28879,302\n28879,385\n28879,390\n28879,1001\n28879,14556\n28880,28881\n28882,893\n28882,3830\n28883,206\n28885,408\n28886,240\n28886,1085\n28886,2296\n28886,3623\n28886,75912\n28887,697\n28888,195\n28889,1220\n28889,1222\n28890,1313\n28891,104\n28891,248\n28891,557\n28891,953\n28891,4276\n28893,143\n28894,781\n28895,1531\n28897,479\n28898,1474\n28898,2779\n28899,1707\n28900,422\n28901,397\n28902,5662\n28903,422\n28904,422\n28905,422\n28906,264\n28906,1007\n28906,1127\n28906,1381\n28906,1509\n28906,1893\n28908,422\n28909,422\n28910,442\n28910,3182\n28911,599\n28912,422\n28913,158\n28915,115\n28915,118\n28916,1544\n28917,58\n28918,868\n28919,310\n28921,248\n28922,934\n28923,1639\n28924,968\n28925,28926\n28927,146\n28927,92476\n28928,269\n28928,406\n28928,592\n28929,626\n28930,158\n28930,118336\n28931,932\n28932,1247\n28933,54\n28934,1368\n28935,2779\n28936,35\n28937,1127\n28938,920\n28939,1400\n28940,372\n28941,175\n28941,298\n28941,7194\n28941,138686\n28942,585\n28943,28944\n28943,38050\n28943,57804\n28943,59561\n28943,72728\n28945,305\n28945,1201\n28946,389\n28946,1072\n28947,299\n28948,4\n28948,5\n28949,1509\n28950,3069\n28951,66\n28951,206\n28951,397\n28951,920\n28952,1639\n28955,467\n28955,868\n28957,63\n28958,1243\n28959,5343\n28960,920\n28960,999\n28960,1089\n28961,1509\n28962,534\n28962,868\n28964,17334\n28965,312\n28967,104\n28967,248\n28968,312\n28969,147\n28969,158\n28969,336\n28969,1515\n28970,497\n28971,1149\n28972,599\n28973,818\n28975,1326\n28976,143\n28977,217\n28977,1688\n28977,1722\n28977,3538\n28978,2315\n28979,491\n28979,827\n28980,302\n28980,2116\n28982,623\n28982,1805\n28983,718\n28984,868\n28985,195\n28986,1019\n28987,5366\n28988,275\n28989,301\n28990,264\n28990,1381\n28991,143\n28992,1132\n28993,781\n28996,1012\n28996,46631\n28997,192\n28997,393\n28997,1531\n28997,28997\n28998,259\n28998,1688\n28998,2779\n28999,872\n29000,302\n29000,579\n29000,687\n29000,1433\n29000,1556\n29001,462\n29002,929\n29002,1888\n29002,2674\n29003,23011\n29004,1836\n29005,1836\n29006,385\n29008,509\n29008,510\n29008,663\n29008,822\n29008,3473\n29008,29008\n29008,168388\n29008,211989\n29009,752\n29010,390\n29011,160\n29012,58\n29012,104\n29012,636\n29013,7360\n29014,63\n29015,666\n29015,1983\n29015,8149\n29015,8714\n29015,9386\n29016,2931\n29017,305\n29018,760\n29018,1631\n29019,1977\n29019,1978\n29020,136\n29020,137\n29021,1105\n29022,58\n29023,46\n29024,379\n29025,302\n29026,182\n29027,1247\n29028,298\n29029,485\n29030,467\n29031,366\n29032,422\n29033,83\n29034,510\n29034,875\n29035,29036\n29037,467\n29037,779\n29038,120\n29038,694\n29038,805\n29038,1001\n29038,1353\n29038,1419\n29038,1466\n29038,2989\n29038,3585\n29038,162599\n29039,143\n29040,872\n29043,4611\n29044,626\n29045,143\n29046,1579\n29046,2051\n29048,353\n29048,29048\n29049,58\n29049,595\n29049,861\n29049,934\n29049,2367\n29049,2411\n29049,21603\n29049,96284\n29050,1983\n29051,2443\n29052,1\n29053,248\n29053,450\n29054,919\n29054,1860\n29055,278\n29055,248556\n29056,192\n29057,3\n29057,406\n29057,439\n29057,671\n29057,1085\n29058,588\n29058,590\n29059,392\n29061,292\n29061,1688\n29062,29063\n29064,66\n29064,467\n29064,868\n29064,920\n29064,1433\n29065,2775\n29066,30\n29066,175\n29066,227\n29066,1179\n29066,2782\n29066,3148\n29066,6051\n29066,8501\n29066,14472\n29066,27834\n29067,1983\n29068,1579\n29069,595\n29069,783\n29069,850\n29070,972\n29071,718\n29072,83\n29072,217\n29072,379\n29072,399\n29072,1467\n29072,2168\n29072,2784\n29072,6506\n29072,7698\n29073,505\n29074,171\n29075,2828\n29076,79\n29076,571\n29076,868\n29076,875\n29076,920\n29076,1566\n29077,72\n29078,992\n29078,3507\n29079,240\n29079,17309\n29080,3260\n29082,302\n29083,192\n29083,640\n29084,525\n29085,626\n29086,8788\n29087,850\n29089,818\n29089,1955\n29090,143\n29091,2205\n29091,2206\n29091,33424\n29092,312\n29094,143\n29095,415\n29095,1058\n29095,1949\n29095,6506\n29095,21982\n29096,16683\n29097,1140\n29098,135\n29099,1688\n29100,497\n29101,160\n29101,273\n29101,620\n29101,6682\n29102,868\n29102,1345\n29102,6638\n29102,75912\n29104,292\n29105,439\n29105,1033\n29105,1590\n29105,189128\n29106,79\n29107,29108\n29109,4220\n29110,1016\n29110,1436\n29111,2017\n29112,292\n29113,1983\n29114,211\n29115,1608\n29116,346\n29116,393\n29116,538\n29116,788\n29116,980\n29116,1033\n29116,1068\n29116,4611\n29116,124994\n29117,3085\n29118,1858\n29119,1860\n29120,68\n29120,240\n29121,2224\n29122,2274\n29123,657\n29124,2434\n29125,6789\n29126,2779\n29128,1177\n29128,2210\n29128,182162\n29130,1151\n29130,1836\n29131,5405\n29133,240\n29133,868\n29134,605\n29135,602\n29135,620\n29136,1240\n29136,1623\n29137,29138\n29137,32756\n29137,34433\n29137,68482\n29137,71327\n29137,80348\n29137,80971\n29137,83526\n29137,83532\n29137,85487\n29137,101111\n29137,101319\n29139,467\n29140,392\n29141,1392\n29142,1179\n29143,1238\n29145,1001\n29146,1544\n29147,1179\n29148,312\n29149,72\n29150,557\n29151,111\n29152,1149\n29153,13546\n29154,126\n29155,1836\n29156,304\n29157,1983\n29158,346\n29159,1639\n29160,7416\n29161,3209\n29162,1983\n29163,388\n29164,467\n29164,872\n29164,1151\n29164,1893\n29164,2443\n29165,673\n29165,749\n29165,2312\n29167,83\n29167,315\n29168,1140\n29169,801\n29170,1052\n29171,2443\n29172,1332\n29173,247\n29174,32\n29175,592\n29176,217\n29177,222\n29177,455\n29177,1019\n29177,1888\n29177,2944\n29178,1151\n29179,366\n29181,1381\n29181,1579\n29182,5101\n29183,29184\n29183,53237\n29186,305\n29188,298\n29189,485\n29190,557\n29191,602\n29192,136\n29193,215\n29194,875\n29195,336\n29195,1010\n29195,5726\n29196,86\n29197,687\n29198,1102\n29199,605\n29200,934\n29201,5662\n29202,140\n29203,1381\n29204,1849\n29205,29206\n29207,1893\n29208,1715\n29209,1955\n29210,301\n29211,1231\n29212,5718\n29213,752\n29214,1564\n29215,2083\n29216,626\n29217,390\n29218,2620\n29219,388\n29220,5440\n29221,1782\n29222,3422\n29223,1522\n29224,2191\n29225,907\n29226,3194\n29227,1167\n29228,968\n29229,3138\n29230,3218\n29231,3207\n29232,1298\n29233,720\n29234,671\n29235,589\n29236,6068\n29237,233\n29238,1210\n29239,1001\n29240,3\n29241,240\n29242,1289\n29243,302\n29244,292\n29245,2116\n29246,252\n29247,30\n29248,2867\n29248,2868\n29248,22880\n29249,149\n29249,333\n29250,4222\n29252,50\n29254,1453\n29255,151\n29256,10\n29257,795\n29258,1010\n29259,1274\n29259,18831\n29260,389\n29261,588\n29261,590\n29262,1419\n29263,6068\n29263,36761\n29264,1805\n29265,247\n29266,483\n29267,2681\n29268,1151\n29269,338\n29269,462\n29269,710\n29269,1127\n29269,1151\n29269,1893\n29270,3507\n29271,29272\n29273,779\n29274,298\n29275,861\n29276,29277\n29278,14989\n29279,83\n29280,158\n29280,247\n29281,602\n29282,298\n29283,485\n29284,1151\n29284,1711\n29284,1836\n29285,117\n29285,994\n29285,2712\n29286,29287\n29286,195980\n29289,285\n29290,298\n29291,485\n29292,17228\n29293,1801\n29295,264\n29295,652\n29295,1968\n29296,6263\n29297,188\n29298,358\n29299,9121\n29300,577\n29301,393\n29302,298\n29303,485\n29304,875\n29305,151\n29306,158\n29307,390\n29308,563\n29309,477\n29310,760\n29310,784\n29310,1462\n29310,2620\n29310,8537\n29311,932\n29312,107\n29313,87\n29313,323\n29313,1151\n29313,1363\n29313,1453\n29313,2697\n29314,376\n29315,10\n29316,1363\n29317,1007\n29318,389\n29319,640\n29320,1844\n29321,5405\n29322,217\n29322,1001\n29323,1433\n29324,346\n29325,29326\n29327,143\n29328,83\n29328,126\n29328,305\n29328,668\n29328,805\n29328,941\n29328,1058\n29328,1326\n29328,1479\n29328,1837\n29328,4487\n29328,5250\n29328,5718\n29329,393\n29330,344\n29331,862\n29332,29333\n29334,147\n29334,158\n29334,333\n29334,422\n29334,1385\n29335,5326\n29336,784\n29337,788\n29337,1433\n29338,264\n29339,687\n29339,1556\n29340,2367\n29341,557\n29341,954\n29341,1939\n29342,538\n29343,7757\n29344,372\n29345,392\n29346,1\n29347,29348\n29349,29348\n29350,29351\n29352,160\n29353,15\n29353,54\n29353,118\n29353,349\n29353,435\n29353,1243\n29353,1345\n29353,1363\n29353,1807\n29353,3612\n29353,4597\n29353,8463\n29354,298\n29355,485\n29356,2995\n29357,34\n29357,35\n29357,536\n29357,694\n29357,4637\n29358,7155\n29359,272\n29359,4455\n29360,29361\n29362,647\n29363,10\n29364,805\n29364,2828\n29365,640\n29365,4192\n29365,4193\n29366,872\n29367,1556\n29368,1309\n29369,211\n29370,557\n29371,557\n29372,907\n29373,1556\n29374,30\n29374,328\n29376,636\n29377,149\n29378,1010\n29379,29380\n29381,346\n29382,861\n29383,2244\n29384,147\n29385,323\n29387,30\n29388,309\n29388,310\n29389,5212\n29390,77\n29391,302\n29392,44\n29393,1078\n29394,29395\n29396,360\n29397,211\n29398,302\n29399,3451\n29399,3452\n29401,1001\n29402,143\n29402,1052\n29403,10\n29403,113156\n29404,2006\n29404,4222\n29404,8855\n29405,2292\n29405,2889\n29406,5908\n29407,1531\n29408,1983\n29409,143\n29410,4101\n29411,1983\n29412,671\n29413,29414\n29415,298\n29416,485\n29417,29418\n29419,338\n29420,481\n29422,26\n29422,59\n29422,4571\n29422,21944\n29424,9560\n29425,9560\n29426,3949\n29427,2671\n29428,16045\n29429,333\n29430,269\n29431,3148\n29432,1515\n29433,140\n29433,911\n29433,2915\n29433,6119\n29434,5101\n29435,349\n29435,1014\n29435,1363\n29436,505\n29437,1010\n29438,422\n29439,56\n29440,264\n29440,1551\n29440,1579\n29440,5440\n29440,49057\n29441,35\n29441,222\n29441,283\n29441,389\n29441,536\n29441,657\n29441,781\n29441,949\n29441,1019\n29441,1274\n29441,1718\n29441,1871\n29441,1881\n29441,1927\n29441,2266\n29441,2424\n29441,2671\n29441,2784\n29441,4594\n29441,6789\n29441,6888\n29441,8235\n29441,29475\n29442,2681\n29443,2209\n29444,450\n29445,30\n29446,433\n29447,211\n29448,111\n29449,1363\n29450,143\n29451,779\n29452,602\n29453,2351\n29454,8788\n29455,1313\n29456,8270\n29457,602\n29458,809\n29459,2411\n29460,171\n29461,83\n29462,338\n29463,358\n29464,261\n29465,450\n29466,143\n29467,2719\n29468,192\n29469,1414\n29470,1509\n29471,422\n29472,56\n29473,9011\n29473,9032\n29476,450\n29477,422\n29478,422\n29479,422\n29480,422\n29481,422\n29482,94\n29482,2787\n29483,29484\n29485,452\n29485,457\n29485,497\n29485,535\n29485,676\n29485,918\n29485,1655\n29486,602\n29487,29488\n29489,346\n29490,29491\n29492,602\n29493,10\n29493,640\n29494,207\n29495,29496\n29497,1368\n29498,602\n29498,620\n29499,1796\n29500,652\n29501,255\n29502,5440\n29503,393\n29504,29505\n29506,99\n29507,289\n29507,290\n29507,714\n29507,2417\n29508,450\n29509,8854\n29510,273\n29510,274\n29511,450\n29512,577\n29513,652\n29514,1392\n29515,3804\n29516,3209\n29517,1305\n29518,450\n29519,206\n29520,29521\n29522,563\n29523,151\n29523,158\n29524,2379\n29525,29526\n29525,103872\n29525,236824\n29527,366\n29528,366\n29529,366\n29530,366\n29531,264\n29531,515\n29532,48\n29532,35486\n29533,233\n29534,1\n29535,6068\n29536,515\n29537,29538\n29539,29540\n29541,302\n29542,420\n29544,48\n29544,1479\n29545,1707\n29546,1715\n29547,392\n29548,518\n29549,450\n29550,3413\n29551,911\n29551,29552\n29553,481\n29554,9323\n29555,442\n29555,2209\n29556,330\n29556,634\n29558,6323\n29558,29559\n29558,69581\n29558,115409\n29558,129305\n29558,149722\n29567,9542\n29568,647\n29569,6424\n29569,28107\n29570,340\n29571,17334\n29572,104\n29572,135\n29572,138\n29573,2915\n29574,72\n29576,644\n29577,333\n29578,106\n29580,1634\n29581,160\n29582,306\n29582,307\n29583,346\n29584,1724\n29584,8270\n29585,66\n29585,920\n29585,1433\n29586,1\n29587,72\n29589,304\n29589,932\n29590,527\n29591,15\n29592,1893\n29593,872\n29593,1118\n29593,1663\n29594,1707\n29595,34\n29595,35\n29595,81\n29595,134\n29595,240\n29595,283\n29595,392\n29595,457\n29595,536\n29595,697\n29595,838\n29595,907\n29595,949\n29595,1014\n29595,1019\n29595,1085\n29595,1118\n29595,1140\n29595,1151\n29595,1210\n29595,1332\n29595,1715\n29595,3367\n29595,4355\n29596,697\n29596,3260\n29597,2083\n29598,5908\n29599,1844\n29600,918\n29601,1298\n29602,298\n29603,485\n29604,647\n29605,861\n29607,298\n29608,2923\n29608,4190\n29609,4220\n29610,34\n29610,35\n29610,192\n29610,195\n29610,298\n29610,417\n29610,455\n29610,704\n29610,1149\n29610,1179\n29610,1462\n29610,1531\n29610,3623\n29610,4355\n29610,8537\n29610,27217\n29610,33611\n29612,349\n29613,1509\n29614,1188\n29615,15119\n29616,143\n29617,4101\n29618,264\n29618,1381\n29618,1509\n29619,1085\n29619,18726\n29620,2373\n29621,1858\n29623,408\n29625,240\n29625,326\n29625,873\n29625,1801\n29627,1363\n29628,163\n29628,489\n29628,811\n29629,1323\n29630,274\n29630,1116\n29631,46\n29631,86\n29631,167\n29631,301\n29631,444\n29631,567\n29631,615\n29631,783\n29631,968\n29631,1046\n29631,1231\n29631,1293\n29631,1359\n29631,1522\n29631,1544\n29631,1564\n29631,1782\n29631,1832\n29631,1837\n29631,2083\n29631,2557\n29631,2620\n29631,3138\n29631,3207\n29631,3422\n29631,5301\n29631,5662\n29631,20813\n29632,893\n29632,4823\n29634,147\n29635,872\n29636,485\n29637,557\n29638,178\n29638,406\n29638,843\n29638,868\n29638,1220\n29638,1222\n29639,1436\n29640,5405\n29641,65\n29641,66\n29642,515\n29643,485\n29644,312\n29644,2605\n29646,1227\n29646,1229\n29646,21944\n29646,86416\n29648,920\n29649,439\n29649,1033\n29649,1651\n29649,2352\n29649,18416\n29649,32468\n29649,32721\n29649,32791\n29649,54291\n29649,55564\n29649,68235\n29649,68816\n29649,85791\n29649,86712\n29649,103772\n29649,125466\n29649,128239\n29649,145339\n29649,172092\n29649,176335\n29649,177328\n29649,228943\n29649,250573\n29649,258325\n29650,143\n29651,3\n29652,14819\n29653,999\n29654,862\n29655,1707\n29656,1012\n29657,1983\n29658,579\n29660,1877\n29661,137\n29662,104\n29662,949\n29663,422\n29665,287\n29666,1871\n29667,907\n29667,932\n29668,140\n29668,338\n29668,1188\n29668,1893\n29669,1133\n29670,30\n29672,143\n29674,579\n29675,2590\n29676,264\n29676,1127\n29676,1289\n29676,1551\n29676,1893\n29677,623\n29677,707\n29677,1447\n29677,1801\n29677,1805\n29678,63\n29678,106\n29678,259\n29678,273\n29678,1220\n29678,1222\n29678,6891\n29679,5192\n29680,10\n29680,178\n29681,2979\n29682,358\n29683,35\n29684,240\n29684,1955\n29685,852\n29686,459\n29687,479\n29687,749\n29688,509\n29688,510\n29689,264\n29690,1188\n29691,1467\n29692,2590\n29693,516\n29694,1707\n29695,46\n29696,349\n29696,1188\n29696,182733\n29696,258973\n29697,1326\n29698,1332\n29699,29700\n29701,873\n29702,1977\n29702,1978\n29704,3507\n29704,3698\n29705,1392\n29706,891\n29707,349\n29708,1179\n29709,338\n29709,1893\n29710,29711\n29712,298\n29713,467\n29713,81233\n29715,893\n29716,111\n29717,3161\n29718,1509\n29719,1801\n29720,7698\n29721,192\n29721,557\n29722,1531\n29723,301\n29724,83\n29724,996\n29724,1294\n29725,29726\n29727,1167\n29728,30\n29730,1836\n29731,2590\n29732,1983\n29733,138\n29734,1860\n29735,79\n29735,1368\n29737,3695\n29738,58\n29739,3\n29739,264\n29739,16687\n29740,200\n29740,2376\n29740,8133\n29740,34883\n29740,41240\n29740,62267\n29740,99807\n29740,168311\n29741,120\n29741,694\n29741,1419\n29741,3115\n29742,5212\n29743,671\n29743,868\n29743,1417\n29744,298\n29745,1983\n29746,1238\n29747,586\n29747,663\n29747,664\n29748,953\n29749,29750\n29749,38055\n29751,1556\n29752,1673\n29753,3524\n29753,4190\n29754,389\n29755,1298\n29756,1454\n29757,126\n29757,392\n29757,972\n29757,1118\n29757,1284\n29758,1319\n29759,968\n29759,73570\n29760,106\n29760,301\n29760,312\n29760,358\n29760,372\n29760,388\n29760,949\n29760,968\n29760,1001\n29760,1068\n29760,1167\n29760,1231\n29760,1454\n29760,1722\n29760,1837\n29760,2083\n29760,3207\n29760,3538\n29760,3612\n29760,5301\n29760,5440\n29760,5662\n29762,397\n29763,349\n29764,1608\n29765,287\n29766,302\n29767,83\n29767,315\n29768,3328\n29769,485\n29770,222\n29771,336\n29772,1298\n29774,102\n29775,107\n29776,3467\n29778,1983\n29779,302\n29781,1241\n29782,485\n29783,5987\n29784,56\n29785,264\n29785,571\n29785,1673\n29785,1888\n29785,2979\n29785,3297\n29785,160055\n29786,397\n29786,1191\n29787,240\n29788,2506\n29789,852\n29789,136072\n29790,333\n29791,163\n29791,579\n29792,698\n29793,356\n29793,5591\n29794,640\n29795,1732\n29796,1119\n29797,312\n29800,8270\n29801,50\n29802,309\n29802,310\n29803,158\n29804,2674\n29805,206\n29806,1983\n29807,450\n29808,1452\n29809,626\n29810,275\n29811,1105\n29812,3507\n29813,1001\n29814,202\n29814,203\n29814,602\n29815,298\n29816,275\n29818,1983\n29819,29820\n29821,222\n29822,536\n29823,668\n29824,2266\n29825,83\n29826,200\n29827,240\n29828,389\n29828,455\n29828,536\n29828,1608\n29828,2784\n29829,644\n29830,192\n29830,344\n29831,248\n29832,1983\n29833,143\n29834,664\n29835,175\n29836,302\n29837,192\n29837,760\n29837,1631\n29838,102\n29838,557\n29839,5405\n29840,146\n29840,92476\n29841,596\n29842,1010\n29842,1849\n29843,5547\n29844,4\n29844,5\n29845,147\n29845,406\n29845,779\n29845,1181\n29845,1515\n29846,452\n29847,32\n29847,349\n29847,575\n29847,697\n29847,3260\n29848,1151\n29848,1453\n29848,1688\n29848,3258\n29849,1479\n29850,1210\n29852,1265\n29852,1266\n29853,872\n29853,1579\n29853,1893\n29853,191860\n29854,106\n29854,140\n29854,302\n29854,358\n29854,372\n29854,388\n29854,875\n29854,949\n29854,968\n29854,1001\n29854,1068\n29854,1309\n29854,1370\n29854,1722\n29854,1837\n29854,2083\n29854,2979\n29854,3207\n29854,3538\n29854,5301\n29854,5440\n29855,516\n29856,310\n29856,358\n29856,615\n29856,931\n29856,1119\n29856,2244\n29856,3039\n29858,72\n29859,287\n29859,862\n29859,27041\n29860,30\n29861,626\n29862,83\n29863,347\n29864,1033\n29865,1\n29866,127158\n29867,623\n29868,827\n29868,1877\n29868,2353\n29868,21442\n29868,40497\n29869,83\n29870,346\n29870,538\n29870,1001\n29870,220502\n29871,186\n29871,433\n29872,2775\n29873,4980\n29874,1968\n29876,1983\n29877,217\n29877,302\n29878,827\n29879,2051\n29880,30\n29881,2784\n29882,338\n29883,79\n29883,273\n29883,313\n29883,931\n29883,1127\n29884,2784\n29885,7698\n29886,264\n29886,283\n29886,809\n29886,1590\n29886,1782\n29886,2646\n29886,5213\n29887,392\n29887,1454\n29887,1722\n29890,192\n29890,264\n29890,301\n29890,336\n29890,392\n29890,516\n29890,525\n29890,843\n29890,1014\n29890,1130\n29890,1179\n29890,1210\n29890,1659\n29890,1844\n29890,4355\n29891,366\n29891,61660\n29891,67628\n29892,247\n29892,269\n29892,1070\n29892,1634\n29893,83\n29893,285\n29893,2779\n29893,2784\n29893,28130\n29894,859\n29895,60576\n29896,406\n29897,626\n29899,302\n29899,579\n29899,861\n29900,333\n29901,356\n29901,1140\n29903,264\n29904,66\n29905,953\n29906,435\n29906,16614\n29907,107\n29910,50\n29910,1572\n29911,264\n29912,859\n29913,720\n29914,2699\n29915,920\n29916,310\n29916,515\n29916,3039\n29918,344\n29919,874\n29920,302\n29921,10\n29922,289\n29922,290\n29922,2315\n29923,636\n29924,366\n29925,182\n29926,1531\n29928,1052\n29929,1631\n29930,424\n29931,302\n29932,2073\n29933,83\n29934,344\n29934,693\n29935,2989\n29935,2991\n29936,4078\n29937,702\n29937,874\n29937,1210\n29938,536\n29938,17346\n29939,147\n29939,149\n29939,158\n29939,622\n29941,50\n29942,356\n29943,256\n29944,217\n29944,500\n29944,760\n29944,1210\n29944,1724\n29944,4831\n29945,2073\n29945,4831\n29946,852\n29947,301\n29947,1837\n29948,1858\n29949,1860\n29950,2266\n29951,252\n29951,1220\n29951,1222\n29952,264\n29953,273\n29953,274\n29954,28130\n29955,1326\n29957,29958\n29957,128562\n29959,10\n29960,252\n29960,41170\n29961,704\n29962,240\n29963,577\n29964,406\n29965,4\n29965,5\n29965,251\n29965,422\n29965,663\n29965,664\n29965,893\n29965,1070\n29965,1118\n29965,1135\n29965,2812\n29965,3555\n29965,4637\n29965,4691\n29965,37414\n29966,143\n29966,1052\n29967,143\n29968,192\n29969,143\n29969,1433\n29969,6803\n29970,151\n29971,298\n29972,485\n29973,640\n29974,301\n29975,292\n29976,596\n29977,422\n29978,56\n29979,957\n29979,1815\n29980,294\n29981,264\n29983,875\n29984,151\n29985,356\n29985,6068\n29986,704\n29987,1122\n29987,8235\n29987,22799\n29988,30\n29988,393\n29988,493\n29988,1265\n29988,1266\n29989,392\n29990,30\n29990,4260\n29990,4980\n29991,247\n29992,10\n29993,483\n29994,72\n29995,247\n29996,376\n29997,885\n29998,86\n29999,30000\n29999,38011\n30001,652\n30002,151\n30002,206\n30002,1096\n30003,1893\n30004,704\n30005,1983\n30006,393\n30006,1531\n30007,1531\n30009,1181\n30010,602\n30011,30012\n30011,92345\n30013,1010\n30014,2205\n30014,2206\n30015,2367\n30016,298\n30017,376\n30018,376\n30019,626\n30020,479\n30021,1782\n30022,4611\n30023,483\n30024,11147\n30025,217\n30025,222\n30026,9025\n30027,406\n30028,4611\n30029,130\n30030,192\n30031,596\n30032,346\n30033,346\n30034,2244\n30035,147\n30035,149\n30035,406\n30036,346\n30037,30038\n30037,36345\n30039,143\n30040,346\n30041,83\n30041,315\n30041,435\n30041,929\n30041,991\n30041,1400\n30041,3804\n30041,5213\n30042,68\n30043,285\n30043,1644\n30044,298\n30045,485\n30046,1001\n30047,298\n30048,485\n30049,2750\n30050,1572\n30052,247\n30053,2574\n30054,622\n30054,1392\n30055,25\n30055,2088\n30056,255\n30057,48\n30058,72\n30059,298\n30060,485\n30061,8373\n30062,250\n30063,481\n30064,392\n30065,143\n30066,30067\n30068,372\n30069,30070\n30071,83\n30072,192\n30073,485\n30074,2701\n30075,146\n30076,298\n30077,485\n30078,8854\n30079,5375\n30080,178\n30081,563\n30082,30083\n30084,119\n30084,151\n30084,192\n30084,309\n30084,310\n30084,577\n30084,1400\n30084,2073\n30084,13910\n30084,21944\n30085,736\n30086,2989\n30086,2991\n30087,217\n30087,536\n30088,372\n30088,1718\n30088,1871\n30089,10\n30090,298\n30091,485\n30092,1644\n30093,657\n30094,557\n30095,557\n30096,4980\n30097,392\n30097,872\n30098,298\n30099,485\n30100,2590\n30101,861\n30102,2073\n30103,10\n30104,862\n30105,30106\n30105,43769\n30105,60789\n30105,62108\n30105,62703\n30105,63152\n30105,63776\n30107,861\n30108,1849\n30109,298\n30110,485\n30112,1019\n30113,1983\n30114,72\n30115,83\n30115,509\n30115,1019\n30115,1467\n30115,3409\n30115,5911\n30115,7572\n30115,8788\n30115,8855\n30117,72\n30118,44\n30119,30120\n30121,1559\n30122,477\n30123,1983\n30124,704\n30125,107\n30126,30127\n30126,237789\n30128,72\n30129,30130\n30131,175\n30132,30133\n30134,885\n30135,450\n30136,450\n30137,536\n30138,450\n30139,310\n30139,3039\n30140,2244\n30141,7360\n30142,2105\n30143,4192\n30143,4193\n30144,10\n30145,30146\n30147,30148\n30149,30148\n30150,417\n30151,333\n30151,640\n30152,631\n30153,873\n30153,1243\n30154,1058\n30155,422\n30156,422\n30157,422\n30158,422\n30159,422\n30160,422\n30161,346\n30162,422\n30163,682\n30164,1531\n30165,323\n30166,422\n30167,346\n30168,602\n30169,68\n30170,338\n30171,30172\n30171,36384\n30171,48563\n30171,52253\n30171,52371\n30171,53121\n30171,54231\n30171,58601\n30171,59274\n30173,1010\n30174,505\n30175,30176\n30177,557\n30178,4355\n30179,941\n30180,1274\n30181,30182\n30183,72\n30184,30185\n30186,9026\n30187,30188\n30189,258\n30190,714\n30191,301\n30191,444\n30191,968\n30192,192\n30192,392\n30192,1127\n30192,1773\n30192,4823\n30192,9007\n30192,30193\n30192,52653\n30192,52974\n30192,102117\n30192,170227\n30192,251687\n30194,323\n30195,30196\n30197,104\n30197,134\n30198,326\n30199,30200\n30201,104\n30201,134\n30201,135\n30202,602\n30203,703\n30205,346\n30207,126\n30208,4453\n30209,104\n30209,134\n30209,135\n30211,652\n30212,292\n30213,195\n30214,3447\n30215,1102\n30216,1309\n30217,671\n30218,4177\n30219,137\n30220,72\n30221,30222\n30223,4475\n30224,1285\n30225,2296\n30226,30227\n30228,2351\n30229,1429\n30230,652\n30231,2048\n30232,81\n30233,287\n30234,8822\n30235,30236\n30237,3413\n30238,72\n30239,30240\n30241,233\n30242,72\n30243,872\n30244,30245\n30244,80469\n30246,30245\n30247,30245\n30248,30245\n30249,30245\n30250,30245\n30251,30245\n30252,30245\n30253,167\n30253,1231\n30253,2083\n30254,1235\n30254,1335\n30255,602\n30256,366\n30257,366\n30258,366\n30259,366\n30260,736\n30261,872\n30262,1639\n30263,30264\n30266,779\n30267,459\n30268,134\n30268,332\n30268,364\n30268,636\n30268,694\n30268,749\n30268,760\n30268,999\n30268,1119\n30268,1388\n30268,1955\n30268,2205\n30268,3328\n30268,27041\n30268,33424\n30269,483\n30270,171\n30271,22\n30272,32\n30273,346\n30274,349\n30274,697\n30275,388\n30276,1289\n30277,32\n30278,644\n30279,579\n30281,306\n30281,307\n30282,211\n30283,609\n30284,143\n30285,21944\n30286,87\n30286,931\n30286,2617\n30287,273\n30287,274\n30289,425\n30289,1276\n30290,795\n30291,1\n30292,1402\n30293,818\n30295,1707\n30296,634\n30296,852\n30296,4252\n30297,10\n30297,34\n30297,35\n30297,79\n30297,167\n30297,259\n30297,305\n30297,312\n30297,358\n30297,393\n30297,435\n30297,439\n30297,518\n30297,563\n30297,589\n30297,631\n30297,640\n30297,660\n30297,779\n30297,1014\n30297,1149\n30297,1177\n30297,1210\n30297,1402\n30297,1572\n30297,1603\n30297,1837\n30297,1871\n30297,2411\n30297,2995\n30297,4748\n30297,6487\n30297,21944\n30297,68725\n30297,74245\n30297,78030\n30297,120055\n30298,875\n30300,83\n30301,481\n30301,14674\n30302,37\n30302,71\n30302,278\n30302,292\n30302,304\n30302,338\n30302,390\n30302,467\n30302,485\n30302,920\n30302,1231\n30302,1740\n30302,1782\n30302,2572\n30302,4220\n30302,6059\n30302,6068\n30303,907\n30303,932\n30304,571\n30304,818\n30304,2775\n30305,536\n30306,968\n30308,4672\n30308,18831\n30309,30310\n30311,206\n30312,302\n30312,687\n30312,2116\n30313,184\n30314,302\n30316,79\n30317,1175\n30317,1452\n30317,4637\n30319,58\n30319,292\n30319,379\n30319,557\n30319,626\n30319,644\n30319,660\n30319,668\n30319,673\n30319,712\n30319,745\n30319,843\n30319,859\n30319,1122\n30319,1147\n30319,1179\n30319,1707\n30319,2411\n30319,2701\n30319,3999\n30320,30321\n30323,1167\n30324,46\n30324,744\n30326,347\n30327,1298\n30328,694\n30328,3182\n30329,2590\n30331,1\n30331,56\n30331,146\n30331,147\n30331,158\n30331,175\n30331,192\n30331,206\n30331,336\n30331,406\n30331,422\n30331,446\n30331,601\n30331,602\n30331,841\n30331,1089\n30331,1181\n30331,1425\n30331,1464\n30331,1515\n30331,1518\n30331,1601\n30331,1619\n30331,1623\n30331,1825\n30331,1992\n30331,2254\n30331,2374\n30331,5424\n30331,5647\n30331,5651\n30331,5726\n30331,5815\n30331,6119\n30331,7296\n30331,8070\n30331,14091\n30331,14433\n30331,14507\n30331,15795\n30331,16497\n30331,17143\n30331,19592\n30331,22313\n30331,22317\n30331,22616\n30331,23783\n30331,24511\n30331,27175\n30331,30331\n30331,30332\n30331,30427\n30331,30428\n30331,30429\n30331,32663\n30331,32753\n30331,34328\n30331,34879\n30331,34963\n30331,35357\n30331,35439\n30331,35680\n30331,36417\n30331,36435\n30331,37568\n30331,38834\n30331,38882\n30331,38975\n30331,38985\n30331,39035\n30331,39532\n30331,39539\n30331,39547\n30331,43277\n30331,54582\n30331,55023\n30331,55075\n30331,58920\n30331,58954\n30331,60576\n30331,62215\n30331,63450\n30331,63472\n30331,64573\n30331,65809\n30331,66671\n30331,70131\n30331,72744\n30331,75045\n30331,77650\n30331,77874\n30331,79768\n30331,80022\n30331,84749\n30331,86697\n30331,87309\n30331,87331\n30331,87387\n30331,93778\n30331,94130\n30331,94254\n30331,95302\n30331,96665\n30331,96721\n30331,98429\n30331,101826\n30331,102465\n30331,102576\n30331,104337\n30331,104346\n30331,104347\n30331,106956\n30331,107430\n30331,108099\n30331,108103\n30331,110033\n30331,115968\n30331,115969\n30331,115970\n30331,116554\n30331,116555\n30331,116556\n30331,117103\n30331,122532\n30331,130859\n30331,131388\n30331,132456\n30331,132903\n30331,133003\n30331,134716\n30331,140475\n30331,140855\n30331,143386\n30331,143493\n30331,143575\n30331,146696\n30331,150111\n30331,150226\n30331,152165\n30331,161541\n30331,162774\n30331,163730\n30331,163978\n30331,164469\n30331,164957\n30331,164963\n30331,164964\n30331,164965\n30331,164966\n30331,164970\n30331,165776\n30331,171076\n30331,171715\n30331,178719\n30331,180281\n30331,180305\n30331,183763\n30331,193610\n30331,195549\n30331,212569\n30331,212573\n30333,30334\n30333,53750\n30333,126225\n30333,163766\n30333,166337\n30333,167479\n30333,175829\n30333,188575\n30333,212487\n30333,221079\n30335,143\n30336,1149\n30337,758\n30338,143\n30339,302\n30340,143\n30341,718\n30342,5102\n30343,1858\n30344,838\n30344,1014\n30344,1181\n30345,714\n30346,973\n30346,1544\n30347,1309\n30348,6750\n30349,835\n30350,994\n30350,1235\n30350,1335\n30351,72\n30352,2674\n30354,731\n30354,4691\n30355,2089\n30355,2940\n30355,21944\n30358,2048\n30359,217\n30361,37\n30361,349\n30361,1298\n30361,3193\n30361,3260\n30363,1659\n30364,1179\n30365,1181\n30365,30331\n30366,1871\n30367,3422\n30368,5\n30368,94\n30368,116\n30368,117\n30368,118\n30368,290\n30368,307\n30368,590\n30368,954\n30368,957\n30368,1222\n30368,1235\n30368,1253\n30368,1266\n30368,1462\n30368,1511\n30368,1512\n30368,1684\n30368,2089\n30368,2210\n30368,2417\n30368,2991\n30368,3370\n30368,3794\n30368,5359\n30368,13704\n30368,17245\n30368,30331\n30368,33424\n30368,56150\n30368,58979\n30368,72439\n30368,92476\n30368,94134\n30368,163964\n30368,164572\n30369,30331\n30369,30370\n30369,34878\n30371,1400\n30372,23011\n30373,104\n30373,134\n30373,136\n30373,137\n30373,167\n30373,186\n30373,217\n30373,278\n30373,290\n30373,292\n30373,372\n30373,392\n30373,509\n30373,510\n30373,623\n30373,862\n30373,875\n30373,907\n30373,1210\n30373,1284\n30373,1417\n30373,1805\n30373,1837\n30373,1939\n30373,2191\n30373,3999\n30373,4771\n30373,75912\n30374,158\n30375,2574\n30376,467\n30376,1133\n30376,1298\n30376,1955\n30378,19010\n30379,2674\n30380,338\n30380,525\n30381,147\n30381,158\n30381,333\n30381,406\n30381,586\n30381,663\n30381,664\n30381,779\n30381,841\n30381,980\n30381,1247\n30381,1943\n30381,2931\n30381,4192\n30381,4193\n30381,8270\n30381,8822\n30381,31237\n30383,206\n30385,579\n30385,622\n30385,1227\n30385,1229\n30387,4276\n30388,4831\n30390,292\n30391,1\n30394,58\n30395,46\n30396,301\n30396,1293\n30397,2979\n30400,671\n30400,1877\n30401,143\n30403,58\n30404,46\n30405,631\n30405,760\n30405,2620\n30406,289\n30406,290\n30407,953\n30408,503\n30408,1140\n30408,2436\n30409,278\n30409,2168\n30410,1837\n30411,500\n30412,1962\n30413,1052\n30414,1882\n30415,2775\n30416,54\n30417,2210\n30417,4237\n30419,346\n30420,536\n30420,2168\n30420,30421\n30420,80306\n30420,81847\n30422,50\n30422,147\n30422,158\n30422,192\n30422,333\n30422,406\n30422,779\n30422,1181\n30422,1515\n30422,2244\n30423,590\n30423,1419\n30424,920\n30426,932\n30430,652\n30432,349\n30433,149\n30433,251\n30433,586\n30433,920\n30434,22\n30435,2460\n30436,30393\n30437,1882\n30438,949\n30439,346\n30441,264\n30443,289\n30443,290\n30443,588\n30443,590\n30443,8180\n30444,872\n30445,301\n30445,525\n30445,717\n30446,264\n30446,1289\n30446,1509\n30446,1551\n30446,3041\n30447,1983\n30449,452\n30450,356\n30450,852\n30450,5591\n30451,7\n30452,301\n30452,604\n30454,2073\n30455,182\n30455,1118\n30455,19005\n30456,50\n30456,273\n30456,274\n30456,333\n30456,483\n30456,1130\n30456,1285\n30456,1927\n30456,30331\n30457,392\n30457,697\n30457,3003\n30458,149\n30458,202\n30458,406\n30458,920\n30459,455\n30459,862\n30459,949\n30460,97\n30461,58\n30462,46\n30463,143\n30464,346\n30465,30466\n30470,579\n30471,26\n30471,59\n30471,116\n30471,2087\n30471,2674\n30471,16153\n30472,424\n30473,2775\n30474,447\n30475,3297\n30476,292\n30477,346\n30479,6803\n30480,273\n30480,1458\n30482,1313\n30483,784\n30484,980\n30484,1298\n30485,874\n30485,972\n30485,1085\n30485,75912\n30486,4611\n30487,1544\n30488,4611\n30489,1544\n30490,1388\n30491,1167\n30492,3769\n30492,4252\n30492,15609\n30493,107\n30495,209\n30496,5591\n30500,907\n30500,932\n30501,111\n30501,1212\n30502,120\n30502,136\n30502,137\n30502,206\n30502,269\n30502,285\n30502,302\n30502,309\n30502,310\n30502,346\n30502,438\n30502,536\n30502,599\n30502,660\n30502,795\n30502,818\n30502,1374\n30502,2274\n30502,2699\n30502,14556\n30502,19443\n30503,1877\n30504,1977\n30504,1978\n30505,41\n30505,344\n30505,455\n30505,1012\n30505,1177\n30506,1019\n30507,217\n30507,1796\n30507,1844\n30507,3804\n30509,32\n30510,4611\n30511,1544\n30512,4611\n30513,1544\n30514,22\n30515,158\n30516,135\n30517,34\n30517,35\n30518,106\n30519,6051\n30519,101473\n30520,1140\n30521,1655\n30522,849\n30522,1789\n30523,1085\n30524,698\n30525,1\n30526,1146\n30527,302\n30527,596\n30528,68\n30529,2674\n30530,151\n30531,247\n30532,349\n30532,575\n30532,697\n30532,3260\n30535,2312\n30536,1608\n30537,3161\n30538,30539\n30540,202\n30540,203\n30541,1881\n30543,3297\n30545,1466\n30546,788\n30549,283\n30549,358\n30550,2244\n30551,252\n30552,1590\n30553,192\n30553,2775\n30554,4190\n30555,302\n30556,577\n30557,20\n30557,146\n30557,248\n30557,280\n30557,313\n30557,602\n30557,685\n30557,775\n30557,827\n30557,841\n30557,849\n30557,1844\n30557,2460\n30557,6119\n30557,13538\n30557,17245\n30557,92476\n30559,313\n30560,1801\n30561,873\n30562,631\n30563,579\n30563,4823\n30565,151\n30566,326\n30568,24\n30568,298\n30568,649\n30568,1745\n30568,2089\n30568,2775\n30568,2940\n30568,4079\n30569,209\n30569,5213\n30570,1515\n30571,2421\n30571,28130\n30572,424\n30573,1140\n30573,5547\n30574,2674\n30575,309\n30575,310\n30576,1509\n30577,68\n30577,240\n30577,571\n30577,818\n30577,1619\n30577,1715\n30577,2512\n30577,66297\n30577,102560\n30577,127158\n30577,191355\n30578,171\n30579,30580\n30580,609\n30581,406\n30582,712\n30582,154408\n30583,1724\n30584,22\n30585,420\n30586,119\n30586,693\n30587,420\n30588,872\n30589,333\n30590,862\n30590,2590\n30590,3507\n30591,217\n30591,1019\n30591,1118\n30591,1454\n30591,1465\n30591,1849\n30592,10\n30592,97\n30593,30594\n30595,758\n30597,206\n30599,2782\n30600,137\n30600,1432\n30601,34\n30601,35\n30601,217\n30601,536\n30601,1417\n30601,18831\n30602,1977\n30602,1978\n30603,392\n30604,24763\n30605,862\n30606,22\n30606,2116\n30606,2210\n30606,4237\n30606,182162\n30607,611\n30608,298\n30609,485\n30610,22\n30611,493\n30611,1265\n30611,1266\n30612,2674\n30613,211\n30614,483\n30615,493\n30616,795\n30616,3094\n30618,862\n30619,247\n30620,81\n30621,247\n30623,1353\n30624,1634\n30625,1102\n30626,687\n30627,5662\n30628,515\n30629,1381\n30630,8798\n30631,1893\n30632,417\n30633,1231\n30634,1564\n30635,301\n30636,2620\n30637,2083\n30638,586\n30639,390\n30640,1767\n30641,388\n30642,7572\n30643,1837\n30644,5440\n30645,3193\n30646,1241\n30647,1522\n30648,1782\n30649,2191\n30650,3194\n30651,1167\n30652,907\n30653,968\n30654,1544\n30655,3207\n30656,3138\n30657,3218\n30658,2557\n30659,4453\n30660,346\n30661,439\n30662,1644\n30663,6068\n30664,3\n30665,333\n30666,1289\n30667,240\n30668,3999\n30669,493\n30670,68\n30671,1143\n30672,65\n30673,406\n30673,779\n30673,8270\n30674,433\n30674,1210\n30675,3585\n30676,30677\n30676,50810\n30676,53491\n30676,59288\n30676,66753\n30676,96147\n30676,96877\n30676,101143\n30676,105294\n30676,108398\n30676,111084\n30676,129423\n30676,131584\n30676,134399\n30676,150744\n30676,153077\n30676,167850\n30676,172675\n30676,173577\n30676,199970\n30676,203482\n30676,218625\n30676,241785\n30676,248370\n30679,34\n30679,35\n30681,1019\n30682,252\n30682,318\n30683,818\n30683,1151\n30685,841\n30686,1359\n30687,137\n30688,250\n30688,972\n30690,1227\n30690,1229\n30691,63\n30691,137\n30691,22293\n30692,622\n30692,1309\n30692,2674\n30692,16153\n30693,30693\n30694,920\n30695,17228\n30697,6263\n30698,151\n30699,7\n30700,1019\n30701,4895\n30703,1590\n30704,178\n30704,980\n30705,34\n30705,35\n30705,217\n30705,358\n30705,1805\n30706,406\n30707,714\n30707,760\n30708,861\n30710,366\n30711,536\n30712,9457\n30713,106\n30714,1556\n30715,143\n30716,366\n30717,37\n30717,301\n30717,1411\n30717,1782\n30718,130\n30719,307\n30719,682\n30719,784\n30720,20\n30720,1179\n30721,536\n30721,18831\n30722,160\n30722,1381\n30723,151\n30724,344\n30725,6303\n30726,5405\n30727,34\n30727,35\n30728,652\n30728,1893\n30728,6695\n30729,1718\n30730,1068\n30731,13137\n30732,298\n30733,104\n30733,134\n30733,135\n30733,227\n30733,372\n30733,588\n30733,590\n30733,596\n30733,631\n30733,704\n30733,784\n30733,1052\n30733,1119\n30733,1368\n30733,2775\n30733,4771\n30735,217\n30735,1417\n30735,4672\n30735,18831\n30736,83\n30736,217\n30736,536\n30736,18831\n30737,877\n30738,298\n30739,485\n30740,1381\n30741,298\n30742,485\n30743,1132\n30744,781\n30746,211\n30746,2116\n30747,50\n30748,158\n30748,1181\n30749,50\n30750,247\n30751,2590\n30752,30753\n30754,1983\n30756,2903\n30756,30757\n30756,30758\n30756,30760\n30759,5101\n30762,273\n30762,274\n30762,333\n30762,30331\n30763,595\n30763,1572\n30764,457\n30764,535\n30765,30766\n30767,143\n30767,1052\n30768,1983\n30769,50\n30769,79\n30770,15\n30770,111\n30770,292\n30770,441\n30770,1238\n30770,1688\n30770,1973\n30770,2292\n30770,2697\n30770,2889\n30770,3507\n30771,872\n30772,30773\n30774,302\n30774,372\n30774,1370\n30775,192\n30775,203\n30775,272\n30775,346\n30775,447\n30775,579\n30775,602\n30775,671\n30775,934\n30775,996\n30775,1294\n30775,1590\n30775,1644\n30775,7757\n30775,31207\n30775,33298\n30776,493\n30776,1265\n30776,1266\n30777,1010\n30778,1983\n30779,72\n30780,697\n30781,30782\n30781,69110\n30781,86070\n30783,1143\n30783,4252\n30784,1963\n30785,435\n30786,94\n30786,2787\n30787,83\n30787,2266\n30787,3252\n30788,302\n30789,2372\n30790,744\n30791,83\n30792,30793\n30794,626\n30795,1849\n30796,832\n30797,19005\n30798,261\n30798,333\n30798,4192\n30798,4193\n30799,1749\n30801,9195\n30802,3260\n30803,783\n30804,615\n30805,2995\n30806,333\n30807,30808\n30809,647\n30810,344\n30811,72\n30812,225\n30813,1434\n30814,137\n30815,273\n30815,274\n30816,1085\n30817,1983\n30818,557\n30819,34\n30819,35\n30820,557\n30821,83\n30822,595\n30822,1332\n30822,1572\n30823,953\n30824,483\n30824,1359\n30825,1571\n30826,779\n30827,589\n30828,151\n30829,289\n30829,290\n30830,1983\n30831,206\n30831,222\n30831,760\n30831,1019\n30832,424\n30833,83\n30834,589\n30834,1411\n30835,278\n30836,8270\n30837,2244\n30838,264\n30839,107\n30839,698\n30839,1782\n30839,3297\n30840,788\n30841,1619\n30842,48\n30842,304\n30843,217\n30843,1417\n30844,3872\n30845,86\n30846,1551\n30847,605\n30848,192\n30849,934\n30850,140\n30851,1849\n30852,717\n30853,1955\n30854,5718\n30855,752\n30856,622\n30857,4549\n30858,178\n30859,1590\n30860,626\n30861,3422\n30862,1298\n30863,720\n30864,671\n30865,1010\n30866,589\n30867,1210\n30868,973\n30869,30870\n30871,483\n30872,356\n30872,415\n30872,852\n30872,21982\n30873,211\n30873,1149\n30874,949\n30875,1871\n30876,30877\n30878,72\n30879,344\n30880,285\n30881,83\n30882,515\n30884,44\n30885,83\n30887,106\n30888,86\n30888,167\n30888,240\n30888,301\n30888,372\n30888,444\n30888,567\n30888,589\n30888,605\n30888,615\n30888,631\n30888,720\n30888,801\n30888,907\n30888,968\n30888,972\n30888,973\n30888,1010\n30888,1122\n30888,1124\n30888,1140\n30888,1167\n30888,1231\n30888,1241\n30888,1284\n30888,1298\n30888,1309\n30888,1436\n30888,1522\n30888,1544\n30888,1564\n30888,1782\n30888,1785\n30888,1818\n30888,1837\n30888,1893\n30888,1955\n30888,2083\n30888,2191\n30888,2372\n30888,2557\n30888,2620\n30888,2979\n30888,3193\n30888,3207\n30888,3218\n30889,222\n30890,1204\n30891,1881\n30892,1243\n30893,455\n30894,602\n30895,192\n30895,333\n30895,1634\n30895,2574\n30896,83\n30897,7360\n30898,272\n30899,87\n30899,349\n30899,595\n30899,1014\n30899,1143\n30899,1363\n30899,2274\n30899,29380\n30900,15068\n30902,273\n30902,274\n30903,366\n30903,500\n30903,718\n30903,1149\n30903,1631\n30904,602\n30905,22\n30905,211\n30905,788\n30905,8270\n30906,72\n30907,500\n30908,1962\n30909,1052\n30910,1882\n30911,2775\n30912,54\n30913,2210\n30913,4237\n30915,438\n30916,622\n30917,202\n30917,203\n30918,7698\n30919,99\n30920,283\n30920,1274\n30921,949\n30921,6789\n30922,358\n30923,48\n30924,30\n30925,72\n30926,1235\n30926,1335\n30927,1388\n30928,346\n30929,602\n30930,26\n30930,59\n30931,99\n30932,697\n30933,3148\n30934,388\n30935,99\n30936,640\n30936,1181\n30937,99\n30938,4594\n30939,682\n30939,1353\n30939,72439\n30940,72\n30941,2867\n30941,2868\n30941,22880\n30942,22\n30943,147\n30943,158\n30943,422\n30943,1181\n30943,80266\n30944,8270\n30945,8270\n30946,10\n30946,113156\n30947,704\n30948,704\n30949,417\n30950,422\n30951,422\n30952,422\n30953,422\n30954,422\n30955,422\n30956,422\n30957,422\n30958,171\n30959,1414\n30960,34\n30960,35\n30960,202\n30960,203\n30960,623\n30960,949\n30960,1467\n30960,2784\n30960,4549\n30961,424\n30962,2590\n30963,417\n30963,1274\n30964,2697\n30965,72\n30966,18726\n30967,72\n30968,344\n30969,285\n30970,9027\n30971,87\n30971,207\n30972,805\n30973,3447\n30974,254\n30975,602\n30976,2646\n30977,1085\n30978,30979\n30980,240\n30981,30982\n30983,390\n30984,292\n30984,483\n30984,644\n30984,707\n30984,1012\n30984,1096\n30984,1127\n30984,1298\n30984,2699\n30984,3999\n30984,5469\n30985,366\n30986,2116\n30987,30\n30988,2051\n30989,22\n30990,252\n30991,151\n30992,10\n30993,1305\n30994,2674\n30995,872\n30997,138\n30999,10\n30999,175\n30999,333\n30999,485\n30999,663\n30999,664\n30999,693\n30999,14366\n30999,14483\n31000,17309\n31001,623\n31001,1119\n31001,1805\n31002,392\n31002,874\n31002,1454\n31003,68\n31003,852\n31003,1010\n31004,171\n31005,2590\n31005,66297\n31006,233\n31007,298\n31008,485\n31009,1010\n31011,1127\n31011,2699\n31012,1559\n31013,79\n31014,1010\n31015,505\n31016,9026\n31017,3585\n31018,1313\n31019,1276\n31020,163\n31022,158\n31023,79\n31023,1433\n31023,21944\n31024,920\n31024,5213\n31025,31026\n31027,3295\n31028,1247\n31029,644\n31031,72\n31032,801\n31033,1117\n31034,760\n31034,1631\n31035,694\n31035,6638\n31036,1082\n31037,306\n31037,307\n31038,72\n31039,1718\n31039,5034\n31040,292\n31041,818\n31042,44\n31043,1332\n31044,31045\n31044,32000\n31044,39809\n31044,47080\n31044,47481\n31044,56373\n31046,1985\n31047,2931\n31048,1983\n31049,4\n31049,5\n31050,4\n31050,5\n31052,671\n31053,298\n31054,485\n31055,509\n31055,852\n31055,875\n31056,302\n31057,1147\n31058,184\n31059,31060\n31061,640\n31062,640\n31063,298\n31064,485\n31065,1556\n31066,1133\n31067,30\n31067,328\n31067,3538\n31069,31070\n31071,1181\n31072,31073\n31074,19\n31074,2266\n31075,1007\n31075,1579\n31076,1147\n31077,1247\n31077,1644\n31077,1844\n31078,346\n31079,2574\n31080,3\n31080,509\n31080,510\n31080,663\n31081,647\n31082,344\n31083,1891\n31085,509\n31085,510\n31086,392\n31088,31089\n31088,92704\n31088,126459\n31088,126936\n31088,129521\n31088,149594\n31088,200363\n31088,212311\n31088,233218\n31088,241506\n31088,244210\n31090,163\n31090,280\n31090,455\n31090,1247\n31090,1332\n31090,1888\n31090,1983\n31090,17245\n31090,189842\n31091,287\n31091,809\n31091,19010\n31092,271\n31093,2105\n31094,586\n31094,663\n31094,664\n31095,1891\n31096,3041\n31097,2784\n31098,298\n31099,485\n31100,217\n31101,58\n31102,18726\n31103,47\n31103,48\n31103,102\n31103,1133\n31103,2469\n31104,2048\n31106,1119\n31106,1801\n31106,3182\n31107,58\n31108,46\n31111,3524\n31112,1323\n31113,102\n31114,1326\n31115,408\n31116,160\n31116,515\n31116,647\n31116,835\n31116,1289\n31116,1893\n31116,2312\n31117,518\n31118,304\n31118,444\n31118,589\n31118,631\n31118,720\n31118,877\n31118,907\n31118,932\n31118,968\n31118,972\n31118,973\n31118,1001\n31118,1010\n31118,1085\n31118,1117\n31118,1122\n31118,1284\n31118,1715\n31118,1732\n31118,1837\n31118,1849\n31118,1962\n31118,2191\n31118,22799\n31119,31120\n31121,31122\n31122,408\n31122,1113\n31122,1326\n31122,31122\n31122,98805\n31122,258851\n31122,260338\n31123,1132\n31124,781\n31125,58\n31125,1177\n31126,313\n31127,1893\n31127,4039\n31128,31129\n31130,225\n31131,1983\n31132,887\n31132,994\n31133,1983\n31134,298\n31135,485\n31138,918\n31139,302\n31140,140\n31140,195\n31141,392\n31142,2775\n31143,447\n31145,41\n31145,63\n31145,151\n31145,557\n31145,571\n31145,586\n31145,657\n31145,835\n31145,843\n31145,852\n31145,1082\n31145,1227\n31145,1229\n31145,6789\n31145,17886\n31145,20004\n31146,2411\n31147,392\n31148,252\n31148,41170\n31149,801\n31150,1749\n31150,2605\n31151,1673\n31152,252\n31152,41170\n31153,392\n31153,433\n31153,1634\n31154,31155\n31154,60027\n31157,2334\n31158,589\n31158,1653\n31158,92476\n31159,104\n31159,134\n31159,137\n31159,138\n31160,631\n31161,1127\n31162,503\n31163,663\n31163,664\n31165,1983\n31166,195\n31167,581\n31168,7360\n31169,72\n31170,192\n31170,346\n31170,439\n31170,588\n31170,590\n31170,671\n31171,500\n31172,920\n31172,1623\n31173,1212\n31174,640\n31176,720\n31176,877\n31176,907\n31176,1001\n31176,1117\n31176,2083\n31176,9024\n31177,252\n31177,493\n31177,1243\n31178,596\n31179,143\n31180,7\n31180,452\n31180,3538\n31180,3846\n31180,14989\n31181,1849\n31182,79\n31183,206\n31184,119\n31184,483\n31184,1400\n31184,3089\n31184,3524\n31184,3695\n31184,31206\n31185,718\n31186,50\n31186,192\n31187,1756\n31187,2989\n31187,2991\n31188,31189\n31190,163\n31190,302\n31190,861\n31191,1711\n31191,1836\n31192,4810\n31193,704\n31194,304\n31196,1167\n31197,261\n31197,1749\n31199,1181\n31199,1388\n31200,1001\n31201,1392\n31202,1424\n31204,932\n31205,408\n31205,37088\n31206,272\n31206,766\n31206,939\n31206,18249\n31206,159762\n31206,216594\n31206,251409\n31208,994\n31208,1300\n31209,13136\n31210,1181\n31211,980\n31211,2979\n31212,657\n31212,718\n31212,3507\n31212,21982\n31213,31214\n31215,1415\n31216,337\n31216,852\n31219,306\n31219,307\n31220,337\n31221,1113\n31222,178\n31222,439\n31222,1776\n31223,861\n31225,1912\n31226,663\n31226,664\n31226,1370\n31227,647\n31227,1175\n31228,50\n31229,211\n31231,1522\n31231,2557\n31232,3297\n31233,302\n31234,31235\n31236,104\n31236,134\n31236,135\n31238,273\n31238,274\n31238,240174\n31239,14472\n31240,19227\n31241,195\n31242,332\n31243,200\n31243,248\n31244,314\n31245,1688\n31246,192\n31246,1392\n31247,1033\n31248,34\n31248,35\n31250,65\n31251,393\n31252,801\n31253,267\n31255,392\n31255,1732\n31255,2191\n31256,647\n31257,3161\n31258,992\n31258,8270\n31259,72\n31260,344\n31261,285\n31262,393\n31263,147\n31263,1370\n31264,272\n31265,158\n31266,479\n31267,534\n31267,535\n31269,1007\n31269,1381\n31269,1458\n31269,5440\n31270,2674\n31271,106\n31272,366\n31273,717\n31274,31275\n31276,206\n31277,841\n31278,788\n31278,1732\n31278,2775\n31278,15807\n31279,143\n31280,34\n31280,126\n31280,314\n31280,392\n31280,433\n31280,467\n31280,872\n31280,1087\n31280,1118\n31280,1130\n31280,1465\n31281,596\n31282,794\n31283,338\n31283,1298\n31284,920\n31285,1181\n31286,1977\n31286,1978\n31287,2867\n31287,2868\n31288,571\n31289,158\n31289,422\n31289,1181\n31290,71\n31291,31292\n31293,525\n31294,1001\n31294,1284\n31295,3999\n31296,299\n31297,22\n31298,302\n31298,344\n31298,579\n31298,2116\n31298,142426\n31299,1012\n31299,1241\n31300,10\n31300,30\n31300,41\n31300,97\n31300,175\n31300,200\n31300,336\n31300,1847\n31302,41\n31302,104\n31302,200\n31302,397\n31302,862\n31302,1119\n31302,2995\n31302,44725\n31302,75912\n31302,127158\n31303,1\n31303,467\n31303,693\n31304,491\n31305,147\n31306,1243\n31306,1512\n31306,2674\n31306,2867\n31306,2868\n31306,16153\n31307,2867\n31307,2868\n31307,22880\n31309,219\n31310,783\n31310,3218\n31311,1133\n31312,255\n31312,1181\n31313,1007\n31315,187\n31316,31317\n31318,1210\n31319,485\n31320,811\n31321,143\n31322,3507\n31323,500\n31324,1962\n31325,1052\n31326,1882\n31327,2775\n31328,54\n31329,2210\n31329,4237\n31330,280\n31331,31332\n31331,31540\n31331,74874\n31331,79138\n31331,83037\n31333,2674\n31334,557\n31335,372\n31335,388\n31335,626\n31335,1284\n31336,1531\n31337,158\n31338,1359\n31339,147\n31339,2244\n31339,42064\n31340,920\n31341,980\n31341,1429\n31342,5265\n31344,5469\n31345,304\n31347,360\n31347,1893\n31348,10\n31350,195\n31351,1140\n31351,5547\n31353,184\n31355,79\n31356,2244\n31357,149\n31358,104\n31358,217\n31358,1939\n31359,518\n31360,536\n31360,781\n31360,18831\n31361,779\n31362,32\n31362,483\n31362,509\n31362,534\n31362,557\n31362,1572\n31362,75912\n31363,314\n31363,687\n31364,302\n31364,2116\n31366,1509\n31367,1179\n31368,30\n31368,328\n31369,86\n31369,167\n31369,240\n31369,301\n31369,567\n31369,605\n31369,631\n31369,968\n31369,972\n31369,973\n31369,1122\n31369,1160\n31369,1359\n31369,1436\n31369,1479\n31369,1564\n31369,1785\n31369,1832\n31369,1837\n31369,2083\n31369,2191\n31369,2557\n31369,2620\n31369,3218\n31369,5662\n31369,5718\n31370,1179\n31371,392\n31372,1522\n31373,143\n31374,493\n31375,1127\n31375,1673\n31377,195\n31378,1927\n31380,392\n31381,1001\n31383,349\n31383,697\n31383,907\n31383,3260\n31384,312\n31384,5547\n31385,1608\n31386,2719\n31387,2209\n31389,10\n31390,151\n31391,31392\n31391,55263\n31391,104833\n31393,302\n31393,489\n31394,973\n31395,4548\n31397,217\n31397,283\n31397,1019\n31398,302\n31398,634\n31398,1010\n31398,1143\n31398,1837\n31398,1881\n31398,2421\n31398,2779\n31398,7698\n31398,142430\n31399,7360\n31400,4355\n31401,3507\n31402,1326\n31402,3193\n31403,493\n31404,151\n31405,158\n31406,72\n31407,344\n31408,285\n31409,31410\n31411,10\n31412,663\n31412,664\n31413,1203\n31413,1955\n31413,3135\n31414,175\n31414,808\n31414,1240\n31414,1300\n31414,1465\n31414,1949\n31414,3630\n31414,6059\n31415,72\n31416,1033\n31417,717\n31418,1893\n31419,10\n31419,259\n31419,622\n31419,1433\n31419,1436\n31419,1973\n31419,2083\n31419,6803\n31419,16196\n31420,693\n31420,16683\n31422,626\n31423,31424\n31425,247\n31426,2083\n31426,3138\n31426,3218\n31427,1411\n31427,3804\n31428,10\n31429,182\n31429,256\n31429,390\n31429,563\n31429,918\n31429,1238\n31429,1663\n31429,2083\n31429,6837\n31429,7092\n31429,7270\n31429,15523\n31430,704\n31431,22\n31434,779\n31434,1515\n31435,41\n31435,104\n31435,119\n31435,247\n31435,269\n31435,285\n31435,422\n31435,424\n31435,467\n31435,636\n31435,640\n31435,788\n31435,843\n31435,1012\n31435,1564\n31435,1572\n31435,1749\n31435,7155\n31435,19010\n31436,455\n31437,72\n31437,1313\n31438,72\n31439,344\n31440,285\n31441,1776\n31442,772\n31443,1411\n31443,3804\n31444,93\n31444,94\n31445,577\n31446,809\n31447,390\n31449,704\n31450,99\n31451,376\n31452,885\n31453,30\n31453,328\n31454,775\n31455,972\n31456,149\n31456,250\n31456,841\n31457,1046\n31458,376\n31459,1359\n31460,920\n31461,704\n31462,6068\n31462,36761\n31463,31464\n31463,227659\n31465,392\n31466,1619\n31467,86\n31467,167\n31467,240\n31467,301\n31467,372\n31467,567\n31467,589\n31467,605\n31467,615\n31467,631\n31467,720\n31467,801\n31467,907\n31467,968\n31467,972\n31467,973\n31467,1010\n31467,1122\n31467,1124\n31467,1140\n31467,1167\n31467,1231\n31467,1241\n31467,1284\n31467,1298\n31467,1309\n31467,1436\n31467,1522\n31467,1544\n31467,1564\n31467,1782\n31467,1785\n31467,1818\n31467,1837\n31467,1849\n31467,1893\n31467,1955\n31467,2191\n31467,2372\n31467,2557\n31467,2620\n31467,2979\n31467,3193\n31467,3207\n31467,3218\n31468,1\n31469,192\n31471,644\n31472,83\n31473,843\n31474,34\n31474,35\n31474,167\n31474,217\n31474,240\n31474,283\n31474,301\n31474,536\n31474,571\n31474,605\n31474,657\n31474,760\n31474,873\n31474,907\n31474,968\n31474,973\n31474,1001\n31474,1019\n31474,1133\n31474,1181\n31474,1210\n31474,1284\n31474,1462\n31474,1522\n31474,1531\n31474,1715\n31474,2205\n31474,2206\n31474,2266\n31474,2557\n31474,2790\n31474,3138\n31474,3218\n31474,5667\n31474,6027\n31474,8537\n31474,9024\n31474,13575\n31474,33424\n31474,127158\n31475,31476\n31477,1181\n31478,44\n31479,1882\n31480,143\n31481,255\n31482,147\n31483,340\n31484,298\n31485,333\n31485,980\n31485,1181\n31485,15573\n31486,99\n31487,107\n31488,275\n31489,2048\n31490,31491\n31492,146\n31493,68\n31494,663\n31494,664\n31495,1078\n31496,557\n31500,137\n31501,138\n31502,557\n31503,8719\n31504,865\n31505,72\n31506,118\n31506,4597\n31507,118\n31507,4597\n31508,118\n31508,4597\n31509,118\n31509,4597\n31510,2424\n31511,120\n31512,2434\n31513,119\n31514,272\n31515,3507\n31516,31517\n31518,15\n31518,1179\n31518,2048\n31519,50\n31520,2224\n31521,2274\n31522,605\n31523,887\n31524,50\n31524,72\n31524,285\n31524,8270\n31525,99\n31526,2210\n31526,4237\n31527,2379\n31528,932\n31529,920\n31531,289\n31531,290\n31531,718\n31532,272\n31532,285\n31532,422\n31532,805\n31532,1449\n31533,609\n31534,489\n31535,557\n31536,21944\n31537,21944\n31538,21944\n31539,21944\n31541,557\n31542,138\n31543,8719\n31544,137\n31545,865\n31546,557\n31547,143\n31548,31549\n31548,171235\n31550,2146\n31551,99\n31552,83\n31553,143\n31554,406\n31555,31556\n31557,99\n31558,31559\n31560,137\n31561,865\n31562,8719\n31563,138\n31564,557\n31565,1167\n31566,72\n31567,344\n31568,285\n31569,31570\n31569,189368\n31571,862\n31572,111\n31573,158\n31573,206\n31573,406\n31573,779\n31574,99\n31575,240\n31576,3367\n31577,8719\n31578,138\n31579,865\n31580,137\n31581,557\n31582,195\n31582,31346\n31583,31584\n31585,158\n31585,195\n31585,406\n31585,31346\n31586,450\n31587,1001\n31588,72\n31589,344\n31590,285\n31591,119\n31591,19519\n31592,1707\n31593,1474\n31594,1133\n31595,15\n31595,563\n31595,615\n31595,941\n31595,3218\n31596,289\n31596,290\n31597,32\n31598,2528\n31599,6556\n31600,442\n31601,1453\n31602,841\n31603,30\n31604,9015\n31605,1644\n31606,137\n31607,704\n31608,72\n31609,1544\n31610,3370\n31610,14453\n31611,1844\n31612,1143\n31613,1634\n31614,422\n31615,422\n31616,422\n31617,422\n31618,422\n31619,422\n31620,422\n31621,171\n31622,3069\n31623,30245\n31624,30236\n31625,31626\n31627,292\n31628,2744\n31629,2931\n31630,808\n31631,1118\n31631,9024\n31632,1309\n31633,63\n31634,676\n31635,8270\n31636,272\n31637,31638\n31639,31640\n31639,36013\n31639,44669\n31639,52695\n31639,79699\n31639,92433\n31639,198048\n31641,175\n31642,31643\n31644,83\n31645,805\n31646,636\n31647,1247\n31648,14434\n31649,1309\n31650,31651\n31652,31651\n31653,349\n31654,207\n31656,972\n31657,31658\n31659,483\n31660,349\n31661,2750\n31662,30\n31662,328\n31663,3507\n31664,68\n31665,217\n31666,31667\n31668,163\n31669,31670\n31671,225\n31672,31673\n31674,269\n31675,536\n31676,346\n31677,1082\n31678,217\n31679,8884\n31680,255\n31681,1085\n31682,192\n31683,9006\n31684,137\n31684,138\n31685,557\n31686,592\n31687,285\n31688,918\n31689,1238\n31690,126\n31691,20813\n31692,3409\n31693,1509\n31694,392\n31694,433\n31695,1452\n31696,3\n31696,81\n31696,111\n31696,233\n31696,240\n31696,372\n31696,383\n31696,503\n31696,557\n31696,592\n31696,704\n31696,805\n31696,818\n31696,953\n31696,1085\n31696,1370\n31696,1392\n31696,1522\n31696,1564\n31696,1608\n31696,1635\n31696,1715\n31696,1745\n31696,1749\n31696,1785\n31696,1818\n31696,1837\n31696,1893\n31696,1955\n31696,2205\n31696,2206\n31696,2296\n31696,2334\n31696,3507\n31696,3538\n31696,3585\n31696,4294\n31696,5718\n31696,9025\n31696,33424\n31697,2048\n31698,2889\n31699,2572\n31700,907\n31701,1571\n31702,233\n31703,21944\n31704,264\n31704,338\n31704,467\n31704,515\n31704,1007\n31704,1052\n31704,1147\n31704,1381\n31704,1509\n31704,5440\n31704,8868\n31705,713\n31706,1844\n31706,2460\n31707,187\n31708,5591\n31709,366\n31710,366\n31711,366\n31712,366\n31713,10\n31714,2443\n31715,17588\n31716,379\n31717,31718\n31719,1001\n31721,861\n31722,31723\n31724,306\n31724,307\n31726,631\n31729,34\n31729,120\n31729,240\n31729,294\n31729,332\n31729,372\n31729,493\n31729,536\n31729,590\n31729,818\n31729,862\n31729,1019\n31729,1082\n31729,1274\n31729,1718\n31729,1858\n31729,2989\n31729,2991\n31729,3623\n31729,4594\n31729,6068\n31729,9007\n31729,14126\n31729,27041\n31729,46391\n31730,3193\n31731,207\n31731,631\n31731,973\n31731,1133\n31731,1210\n31731,5301\n31738,455\n31738,891\n31738,949\n31738,18738\n31741,390\n31741,589\n31741,2372\n31742,1785\n31746,68\n31746,167\n31746,301\n31746,467\n31746,968\n31746,1010\n31746,1119\n31746,1133\n31746,1241\n31746,2557\n31746,2979\n31746,13361\n31755,18738\n31756,1085\n31756,18738\n31758,18738\n31762,1796\n31762,3804\n31763,3623\n31765,349\n31765,392\n31765,433\n31765,439\n31765,1644\n31765,2083\n31765,17309\n31765,68069\n31766,535\n31766,1732\n31766,2191\n31766,3193\n31766,75912\n31777,167\n31777,795\n31777,1284\n31777,1309\n31779,455\n31781,1014\n31784,444\n31784,968\n31784,1837\n31784,2557\n31784,103860\n31785,294\n31785,431\n31785,626\n31785,631\n31785,784\n31785,1001\n31785,1119\n31785,1284\n31785,1411\n31785,1479\n31785,1522\n31785,2045\n31785,2372\n31785,2979\n31788,1127\n31788,1590\n31790,1210\n31794,392\n31794,589\n31794,694\n31794,697\n31794,1284\n31796,372\n31796,609\n31796,1118\n31796,1284\n31796,2191\n31796,3193\n31796,18739\n31796,118336\n31797,500\n31799,392\n31799,1454\n31799,18738\n31801,222\n31801,283\n31801,455\n31801,657\n31801,1019\n31802,186\n31802,264\n31802,292\n31802,467\n31802,510\n31802,775\n31802,973\n31802,1085\n31802,3804\n31802,75912\n31803,31804\n31803,31805\n31832,431\n31832,2989\n31832,2991\n31832,31803\n31859,1181\n31859,1531\n31860,30\n31861,1133\n31863,3960\n31864,872\n31865,500\n31866,1962\n31867,1052\n31868,1882\n31869,2775\n31870,54\n31871,2210\n31871,4237\n31872,2697\n31873,146\n31874,366\n31874,500\n31875,83\n31876,1133\n31877,72\n31878,344\n31879,285\n31880,602\n31882,3413\n31883,406\n31884,31885\n31886,72\n31887,579\n31887,861\n31889,827\n31889,1332\n31890,2506\n31891,2506\n31892,3345\n31893,4\n31893,5\n31893,714\n31893,1212\n31893,1432\n31893,1745\n31893,2089\n31893,2940\n31893,8820\n31893,21944\n31893,111142\n31894,3949\n31895,31896\n31896,467\n31896,31896\n31897,31898\n31899,283\n31900,972\n31900,1298\n31901,13\n31902,4453\n31903,222\n31903,455\n31903,1019\n31903,4672\n31903,7768\n31904,158\n31905,83\n31906,3413\n31907,83\n31909,206\n31911,83\n31912,58\n31913,83\n31914,1179\n31914,1634\n31914,1844\n31914,6682\n31915,920\n31917,302\n31917,344\n31919,577\n31920,3\n31921,3804\n31922,1181\n31923,328\n31923,31067\n31923,58941\n31924,143\n31925,217\n31925,1001\n31926,31927\n31928,452\n31928,457\n31928,497\n31928,535\n31928,676\n31928,918\n31928,1655\n31929,143\n31930,2828\n31931,202\n31931,203\n31931,1379\n31931,3321\n31931,28755\n31932,424\n31933,509\n31935,1634\n31936,10\n31936,31937\n31936,32168\n31936,38611\n31936,44293\n31938,2351\n31939,589\n31940,6068\n31941,953\n31942,872\n31942,141912\n31943,2995\n31944,450\n31945,536\n31945,1467\n31946,406\n31947,31948\n31949,779\n31950,779\n31951,31952\n31953,338\n31954,134\n31954,137\n31954,557\n31954,2105\n31955,920\n31956,15573\n31957,31958\n31959,72\n31960,344\n31961,285\n31962,72\n31963,104\n31963,134\n31963,135\n31963,217\n31963,2105\n31964,104\n31965,3\n31966,178\n31966,500\n31967,72\n31968,344\n31969,285\n31970,3\n31970,3999\n31971,516\n31972,72\n31973,344\n31974,285\n31975,31976\n31977,223738\n31978,31979\n31978,45357\n31978,51415\n31978,52692\n31978,56168\n31978,82370\n31980,136\n31981,31982\n31983,6682\n31984,1019\n31985,1309\n31986,2334\n31987,392\n31988,147\n31989,102\n31990,72\n31991,15573\n31992,44\n31994,1907\n31994,5101\n31995,1955\n31996,1309\n31997,72\n31998,72\n31999,147\n32001,376\n32002,9323\n32003,72\n32004,32005\n32006,1181\n32008,483\n32009,32010\n32011,83\n32012,784\n32014,323\n32014,6556\n32015,1479\n32016,72\n32017,72\n32018,72\n32019,32020\n32021,450\n32022,450\n32023,1\n32023,11\n32023,192\n32023,336\n32023,397\n32023,620\n32023,1117\n32023,1313\n32023,1425\n32023,3079\n32023,30331\n32024,143\n32025,515\n32026,298\n32027,485\n32028,31977\n32029,83\n32030,640\n32031,72\n32033,32034\n32035,269\n32035,1070\n32035,1634\n32036,872\n32037,32038\n32039,298\n32040,485\n32041,32042\n32043,2668\n32044,72\n32045,240\n32046,2526\n32047,32048\n32049,2744\n32050,1313\n32051,32052\n32053,32054\n32053,60928\n32053,91720\n32055,255\n32056,424\n32057,104\n32057,134\n32058,2266\n32058,18726\n32058,68955\n32059,298\n32060,485\n32061,32062\n32063,450\n32064,1556\n32065,2526\n32066,102\n32067,102\n32068,272\n32069,32070\n32071,586\n32072,918\n32073,2351\n32074,72\n32075,72\n32076,344\n32077,285\n32078,207\n32079,652\n32080,31977\n32081,652\n32082,1192\n32083,146\n32084,2351\n32085,32086\n32087,455\n32088,93\n32088,94\n32089,333\n32090,163\n32091,9195\n32092,589\n32093,32094\n32095,4192\n32095,4193\n32096,1247\n32096,1644\n32096,1844\n32097,818\n32098,346\n32099,32100\n32099,44521\n32099,74839\n32101,72\n32102,8270\n32103,2292\n32104,818\n32105,233\n32106,32107\n32108,346\n32109,818\n32110,907\n32111,15573\n32112,2995\n32113,6068\n32114,298\n32115,485\n32116,2048\n32117,107\n32118,2416\n32118,2417\n32119,292\n32120,338\n32121,298\n32122,1133\n32123,3538\n32124,32125\n32126,8270\n32127,134\n32128,346\n32129,298\n32130,485\n32131,312\n32132,34\n32132,35\n32133,442\n32134,366\n32135,8992\n32136,366\n32137,585\n32138,861\n32138,2017\n32139,1224\n32140,872\n32141,32142\n32143,953\n32144,4\n32144,5\n32144,1983\n32145,346\n32146,346\n32147,439\n32148,77\n32148,5440\n32149,2506\n32150,872\n32151,872\n32152,872\n32153,872\n32154,872\n32155,872\n32156,32157\n32158,872\n32159,272\n32160,298\n32161,485\n32162,577\n32163,93\n32163,94\n32164,158\n32165,269\n32166,252\n32167,3370\n32167,14453\n32169,3246\n32169,3247\n32170,32171\n32172,147\n32172,306\n32172,307\n32172,406\n32172,585\n32172,779\n32172,1181\n32173,1891\n32174,328\n32174,333\n32175,143\n32176,2048\n32177,920\n32178,72\n32179,344\n32180,285\n32181,32182\n32183,32182\n32184,32182\n32185,32182\n32186,32182\n32187,2867\n32187,2868\n32187,22880\n32188,298\n32189,485\n32190,760\n32191,32192\n32194,2828\n32195,7652\n32196,355\n32197,32198\n32197,226976\n32199,83\n32200,3\n32200,54\n32201,32202\n32204,136\n32205,310\n32205,620\n32205,3039\n32206,3260\n32207,346\n32208,1220\n32208,1222\n32209,298\n32210,485\n32211,1893\n32212,346\n32213,1893\n32214,1893\n32215,338\n32216,273\n32216,274\n32217,346\n32218,1119\n32219,346\n32220,16683\n32221,1\n32222,1715\n32222,4146\n32223,104\n32223,134\n32224,1707\n32225,34\n32225,35\n32226,1012\n32227,911\n32228,298\n32229,485\n32230,32231\n32232,346\n32233,298\n32234,485\n32235,671\n32236,79\n32237,4453\n32238,54\n32238,222\n32238,389\n32238,1590\n32239,160\n32240,3069\n32241,1893\n32242,4\n32242,5\n32243,338\n32244,200\n32245,147\n32246,298\n32247,485\n32248,4252\n32249,996\n32250,450\n32251,147\n32252,72\n32253,450\n32254,503\n32255,298\n32256,485\n32257,298\n32258,485\n32259,298\n32260,485\n32261,636\n32262,298\n32263,485\n32264,973\n32265,44\n32266,72\n32267,22\n32268,22\n32268,403\n32268,693\n32268,113878\n32269,657\n32270,72\n32271,2319\n32271,8463\n32272,32273\n32272,53048\n32274,32273\n32274,122823\n32275,72\n32276,920\n32276,2319\n32277,779\n32280,1235\n32280,1335\n32281,32282\n32283,32282\n32284,32282\n32285,32282\n32286,32282\n32287,32282\n32288,120\n32289,298\n32290,485\n32291,72\n32292,1707\n32294,7360\n32295,72\n32296,298\n32297,485\n32298,72\n32299,72\n32300,143\n32301,298\n32302,485\n32303,298\n32304,485\n32305,3474\n32306,298\n32307,485\n32308,72\n32309,2045\n32310,32\n32310,392\n32311,1433\n32312,143\n32313,557\n32314,346\n32315,32316\n32317,298\n32318,485\n32319,1860\n32320,1544\n32321,430\n32323,1181\n32325,32326\n32328,527\n32329,596\n32330,557\n32331,862\n32332,557\n32333,4691\n32334,557\n32335,1096\n32335,28294\n32336,557\n32337,32338\n32337,39362\n32337,55408\n32339,219\n32339,364\n32341,1983\n32342,31977\n32343,143\n32346,599\n32347,34\n32347,35\n32347,536\n32348,366\n32349,72\n32350,344\n32351,285\n32352,32353\n32354,346\n32355,22\n32356,146\n32357,1265\n32357,1266\n32358,668\n32358,1607\n32359,1078\n32359,2286\n32359,2312\n32360,346\n32361,72\n32362,309\n32362,310\n32363,2045\n32364,137\n32365,21944\n32366,577\n32367,459\n32368,2506\n32369,422\n32370,422\n32371,422\n32372,422\n32373,422\n32374,240\n32375,422\n32376,422\n32377,483\n32378,422\n32379,32380\n32381,818\n32382,1414\n32383,22\n32383,599\n32384,433\n32385,32386\n32387,32388\n32389,557\n32390,536\n32391,980\n32392,72\n32393,32394\n32395,10\n32396,4453\n32397,676\n32398,219\n32399,2574\n32400,32401\n32402,10\n32402,97\n32403,72\n32404,18726\n32405,592\n32406,10\n32407,9007\n32408,1313\n32409,479\n32410,272\n32411,907\n32412,818\n32413,115\n32413,118\n32414,3161\n32415,292\n32416,1531\n32418,3999\n32419,72\n32420,72\n32422,104\n32423,309\n32424,292\n32425,294\n32426,296\n32427,298\n32428,32429\n32430,72\n32431,8270\n32432,872\n32433,872\n32434,1118\n32434,3447\n32435,192\n32436,72\n32437,953\n32438,323\n32439,217\n32440,713\n32441,406\n32442,20\n32442,116\n32442,134\n32442,137\n32442,138\n32442,207\n32442,247\n32442,273\n32442,298\n32442,736\n32442,1085\n32442,1309\n32442,1881\n32442,2087\n32442,3193\n32442,7155\n32443,233\n32445,509\n32445,510\n32446,366\n32447,83\n32447,536\n32448,366\n32451,32452\n32453,515\n32454,8788\n32455,143\n32456,115\n32456,118\n32457,83\n32458,393\n32459,557\n32460,338\n32461,376\n32462,34\n32462,167\n32462,222\n32462,283\n32462,289\n32462,290\n32462,312\n32462,455\n32462,631\n32462,1019\n32462,1210\n32462,1467\n32462,2266\n32462,2775\n32462,6424\n32462,6789\n32462,94134\n32464,338\n32464,838\n32465,1711\n32465,1836\n32466,256\n32467,489\n32467,811\n32468,178\n32468,338\n32468,346\n32468,393\n32468,439\n32468,538\n32468,668\n32468,1294\n32468,2353\n32468,6662\n32469,200\n32470,7698\n32471,72\n32472,3413\n32473,500\n32475,393\n32475,32475\n32476,187\n32477,1238\n32481,10\n32482,1452\n32483,32484\n32483,35968\n32483,39891\n32483,54039\n32483,56384\n32485,3161\n32487,32488\n32490,602\n32491,83\n32492,980\n32493,1590\n32494,392\n32495,3999\n32496,81\n32497,1001\n32497,2191\n32500,2674\n32503,87\n32503,392\n32504,596\n32505,861\n32506,83\n32506,299\n32506,1010\n32507,255\n32508,158\n32509,306\n32509,307\n32510,2224\n32511,178\n32511,1531\n32512,32513\n32516,518\n32516,1001\n32516,1326\n32516,3193\n32517,167\n32517,32518\n32517,51554\n32517,69872\n32517,73786\n32517,82806\n32517,86244\n32517,87539\n32517,92440\n32517,104495\n32517,104772\n32517,108370\n32517,112815\n32517,113293\n32519,32520\n32519,40132\n32519,64073\n32519,77798\n32519,78954\n32519,80285\n32519,87208\n32519,87621\n32519,93131\n32519,102986\n32519,108496\n32519,108558\n32519,110503\n32519,113737\n32519,128310\n32519,128998\n32521,483\n32522,2105\n32523,4190\n32524,32525\n32526,805\n32527,58\n32527,63\n32527,72\n32527,163\n32527,222\n32527,233\n32527,252\n32527,340\n32527,491\n32527,620\n32527,626\n32527,652\n32527,671\n32527,682\n32527,726\n32527,733\n32527,749\n32527,808\n32527,1052\n32527,1309\n32527,1368\n32527,1381\n32527,1402\n32527,1434\n32527,1608\n32527,1644\n32527,3218\n32527,3451\n32527,3452\n32527,4771\n32527,28294\n32527,72439\n32529,79\n32529,192\n32529,118336\n32530,760\n32531,149\n32533,2266\n32534,652\n32535,1313\n32536,4453\n32537,32538\n32537,32564\n32537,32573\n32537,32574\n32537,32586\n32537,32587\n32537,32623\n32537,32624\n32537,32675\n32537,32953\n32537,33031\n32537,33062\n32537,33066\n32537,33069\n32537,33092\n32537,34343\n32537,35096\n32537,35110\n32539,32540\n32541,32540\n32542,32540\n32543,32540\n32544,32540\n32545,32540\n32546,32540\n32547,32540\n32548,32540\n32549,32540\n32550,32540\n32551,32540\n32552,32540\n32553,32540\n32554,32540\n32555,32540\n32556,32540\n32557,32540\n32558,32540\n32559,32540\n32560,32540\n32561,1143\n32562,333\n32565,671\n32566,992\n32566,1276\n32566,2744\n32567,4190\n32568,23096\n32569,538\n32570,1963\n32572,83\n32575,83\n32575,217\n32575,379\n32575,399\n32575,1467\n32575,2168\n32575,7698\n32576,104\n32576,304\n32576,332\n32576,636\n32576,1659\n32576,1715\n32576,2367\n32576,2620\n32576,49057\n32577,1167\n32577,1436\n32577,2979\n32577,75912\n32578,346\n32579,149\n32581,1181\n32582,868\n32584,534\n32585,259\n32585,788\n32585,1433\n32585,1531\n32588,992\n32590,3555\n32592,4504\n32593,147\n32593,184\n32593,1247\n32593,3161\n32594,1749\n32595,644\n32596,671\n32598,32599\n32600,579\n32602,344\n32603,136\n32604,417\n32604,1085\n32606,736\n32607,1323\n32608,102\n32609,1326\n32610,408\n32612,640\n32613,87\n32613,442\n32613,1001\n32613,1151\n32613,1805\n32614,640\n32615,640\n32616,1191\n32617,195\n32618,640\n32619,640\n32620,424\n32621,32622\n32621,109787\n32621,119092\n32621,120791\n32625,217\n32626,467\n32627,602\n32628,192\n32629,430\n32629,784\n32631,403\n32632,8598\n32633,1276\n32635,392\n32637,32638\n32639,250\n32640,388\n32640,6638\n32642,425\n32644,3507\n32645,417\n32645,809\n32645,3367\n32645,6726\n32646,671\n32647,875\n32648,1984\n32649,415\n32650,240\n32650,372\n32650,390\n32650,2512\n32650,2812\n32650,127158\n32650,179804\n32652,500\n32653,671\n32654,333\n32655,1010\n32657,1085\n32658,337\n32659,248\n32659,1332\n32659,1893\n32659,7155\n32660,302\n32660,579\n32660,2617\n32660,4823\n32661,158\n32661,55849\n32662,83\n32662,222\n32662,264\n32662,852\n32663,30331\n32664,422\n32665,2379\n32665,9007\n32666,30\n32666,299\n32666,557\n32666,590\n32666,760\n32666,1177\n32666,1309\n32666,1359\n32666,1368\n32666,1462\n32666,2210\n32666,2416\n32666,2417\n32666,2701\n32666,2775\n32666,3129\n32666,3209\n32666,182162\n32668,302\n32668,687\n32668,893\n32668,1556\n32669,195\n32670,302\n32671,3069\n32672,3069\n32674,192\n32676,1143\n32677,79\n32677,809\n32679,4060\n32680,195\n32680,366\n32680,3246\n32680,4545\n32680,139010\n32681,264\n32681,1381\n32681,191860\n32682,779\n32683,32684\n32685,393\n32686,273\n32686,274\n32687,457\n32688,120\n32688,392\n32688,779\n32688,1240\n32688,1363\n32688,1858\n32688,21982\n32689,217\n32689,1019\n32690,687\n32691,726\n32692,446\n32692,1085\n32692,1119\n32692,75912\n32692,185877\n32694,22\n32694,623\n32695,273\n32695,274\n32696,182\n32698,302\n32698,579\n32699,10\n32699,113156\n32700,516\n32701,579\n32702,188\n32703,1282\n32704,167\n32704,1010\n32705,818\n32707,1370\n32708,500\n32709,1962\n32710,1052\n32711,1882\n32712,2775\n32713,54\n32714,2210\n32714,4237\n32715,6263\n32716,1127\n32717,1224\n32718,647\n32719,344\n32720,3872\n32721,72\n32721,337\n32721,1033\n32721,115659\n32722,134\n32722,200\n32722,364\n32722,772\n32724,1907\n32726,3193\n32727,72\n32728,171\n32728,1877\n32729,809\n32729,19010\n32730,1639\n32731,1011\n32732,473\n32733,459\n32734,592\n32735,143\n32736,893\n32737,143\n32738,1220\n32738,1222\n32739,1010\n32740,107\n32741,285\n32741,999\n32742,222\n32743,28130\n32744,406\n32746,668\n32746,713\n32747,328\n32747,808\n32747,1531\n32747,1566\n32748,83\n32749,83\n32749,1274\n32749,5591\n32749,6506\n32750,32751\n32751,261\n32751,332\n32751,693\n32751,694\n32751,784\n32751,852\n32751,911\n32751,1045\n32751,1285\n32751,1353\n32751,2418\n32751,2775\n32751,2824\n32751,3115\n32751,4190\n32751,4377\n32751,5683\n32751,7196\n32751,7266\n32751,7473\n32751,14730\n32751,18412\n32751,19635\n32751,20540\n32751,20592\n32751,26849\n32751,28282\n32751,32750\n32751,32751\n32751,48372\n32751,49784\n32751,78623\n32751,80568\n32751,85040\n32751,95655\n32751,110102\n32751,123830\n32751,124593\n32751,128948\n32751,132338\n32751,138295\n32751,138296\n32751,138297\n32751,138298\n32751,138299\n32751,139699\n32751,156352\n32751,160943\n32751,165164\n32751,169368\n32751,175032\n32751,183873\n32751,197745\n32751,227227\n32751,230587\n32751,233498\n32751,258222\n32751,262513\n32751,263949\n32758,1844\n32758,2073\n32759,1265\n32759,1266\n32760,6051\n32761,4190\n32762,32763\n32764,285\n32765,1085\n32766,515\n32767,7652\n32768,779\n32769,158\n32769,178\n32769,439\n32769,1782\n32770,592\n32771,406\n32772,647\n32773,1612\n32774,356\n32774,2224\n32774,2266\n32774,7698\n32775,58\n32776,46\n32777,968\n32779,2590\n32780,389\n32782,2668\n32783,557\n32785,9195\n32786,779\n32786,141912\n32787,516\n32788,305\n32790,1977\n32790,1978\n32791,315\n32791,784\n32791,1789\n32791,21442\n32792,439\n32792,663\n32792,664\n32792,1175\n32792,6119\n32795,140\n32795,346\n32795,515\n32795,835\n32796,1052\n32797,5405\n32798,1011\n32799,86\n32800,285\n32800,8270\n32801,192\n32801,195\n32801,206\n32801,671\n32801,1033\n32802,143\n32803,1893\n32804,657\n32804,949\n32805,32806\n32807,20\n32808,72\n32810,104\n32810,805\n32810,1319\n32810,2205\n32810,33424\n32811,1634\n32812,2312\n32813,83\n32816,943\n32816,1238\n32817,805\n32818,1147\n32819,87\n32819,292\n32819,349\n32819,392\n32819,509\n32819,510\n32819,595\n32819,697\n32819,703\n32819,818\n32819,838\n32819,872\n32819,918\n32819,931\n32819,1011\n32819,1014\n32819,1151\n32819,1188\n32819,1192\n32819,1289\n32819,1363\n32819,1453\n32819,1454\n32819,1572\n32819,1722\n32819,1836\n32819,1893\n32819,2253\n32819,2436\n32819,2699\n32819,2744\n32819,3258\n32819,3507\n32819,3538\n32819,4039\n32819,40360\n32819,127158\n32820,34\n32820,35\n32820,536\n32820,2646\n32821,2506\n32822,1454\n32823,72\n32824,1262\n32824,1844\n32825,3555\n32826,310\n32826,3039\n32827,209\n32827,302\n32828,247\n32829,5375\n32830,1309\n32831,2506\n32832,3846\n32833,32834\n32835,2506\n32836,1012\n32836,1241\n32837,2995\n32839,489\n32839,75912\n32840,626\n32841,83\n32842,15573\n32843,1\n32844,77\n32844,349\n32844,1803\n32846,301\n32847,489\n32848,30\n32848,328\n32848,1179\n32848,3538\n32849,1465\n32850,1231\n32851,326\n32853,330\n32854,20790\n32855,1707\n32856,3069\n32857,1983\n32858,592\n32859,304\n32860,158\n32861,32862\n32863,801\n32863,1284\n32863,3474\n32863,5547\n32864,192\n32865,140\n32866,301\n32867,46\n32867,58\n32868,372\n32868,1010\n32868,1082\n32868,1241\n32868,1479\n32868,1849\n32869,302\n32869,2116\n32869,3769\n32871,358\n32873,72\n32874,32875\n32877,1085\n32878,2051\n32878,81070\n32879,5405\n32880,247\n32881,1298\n32882,32883\n32884,358\n32884,1265\n32884,1266\n32885,3524\n32886,83\n32887,389\n32888,32889\n32890,9013\n32892,346\n32893,248\n32894,784\n32895,79\n32896,1837\n32897,809\n32898,301\n32901,72\n32902,9323\n32904,140\n32904,1284\n32905,393\n32906,217\n32906,240\n32907,483\n32908,250\n32909,649\n32910,247\n32911,79\n32911,99\n32911,130\n32911,233\n32911,422\n32911,685\n32911,994\n32911,1087\n32911,1571\n32911,1619\n32911,1707\n32911,2260\n32911,4355\n32911,81233\n32912,349\n32912,697\n32913,32914\n32915,111\n32915,134\n32915,200\n32915,202\n32915,203\n32915,248\n32915,264\n32915,289\n32915,290\n32915,333\n32915,631\n32915,714\n32915,718\n32915,1119\n32915,1149\n32915,1181\n32915,1462\n32915,1631\n32915,1955\n32915,4355\n32915,4831\n32915,8180\n32915,8537\n32915,9006\n32915,9010\n32916,8798\n32917,143\n32917,1052\n32918,178\n32918,333\n32918,538\n32918,622\n32918,980\n32918,1033\n32918,1181\n32918,1531\n32918,15573\n32919,2051\n32920,467\n32920,868\n32921,1955\n32922,32923\n32922,47308\n32924,1707\n32924,189794\n32924,223738\n32925,32926\n32927,1282\n32928,200\n32929,34\n32929,35\n32929,217\n32929,240\n32929,278\n32929,358\n32929,435\n32929,455\n32929,467\n32929,536\n32929,571\n32929,623\n32929,694\n32929,868\n32929,1417\n32929,81233\n32929,156379\n32929,162599\n32930,1579\n32931,104\n32931,192\n32931,202\n32931,203\n32931,248\n32931,252\n32931,346\n32931,439\n32931,687\n32931,779\n32931,934\n32931,980\n32931,1133\n32931,1210\n32931,1231\n32931,1466\n32931,1634\n32931,1722\n32931,1893\n32931,1939\n32931,5405\n32932,390\n32933,21944\n32934,872\n32935,1179\n32935,1305\n32935,2701\n32936,493\n32937,1623\n32938,1235\n32938,1335\n32939,120\n32939,588\n32939,590\n32939,1284\n32939,1402\n32939,1419\n32941,3079\n32942,779\n32943,211\n32944,1122\n32945,4\n32945,5\n32946,687\n32947,192\n32947,779\n32948,2590\n32949,431\n32949,1252\n32949,1253\n32950,500\n32951,2699\n32952,2073\n32954,843\n32955,811\n32956,4\n32956,5\n32956,107\n32956,1252\n32956,1253\n32956,1381\n32957,392\n32958,147\n32958,158\n32959,875\n32960,1227\n32960,1229\n32960,21944\n32960,86416\n32961,171\n32962,222\n32963,1634\n32964,151\n32965,20\n32966,24505\n32967,167\n32967,720\n32967,1167\n32967,1436\n32967,2979\n32968,200\n32969,1452\n32970,83\n32971,1151\n32972,137\n32974,1235\n32974,1335\n32974,2045\n32974,2209\n32974,3474\n32974,8180\n32974,8788\n32974,21711\n32974,29253\n32974,29294\n32975,167\n32975,1849\n32976,685\n32976,911\n32976,26450\n32977,772\n32978,72\n32978,292\n32978,440\n32978,510\n32978,794\n32978,801\n32978,849\n32978,872\n32978,1151\n32978,1238\n32978,1240\n32978,1449\n32978,1688\n32978,1722\n32978,4771\n32979,1188\n32980,1151\n32980,1807\n32981,104\n32981,200\n32983,356\n32983,481\n32983,660\n32983,1623\n32984,4355\n32985,47\n32985,2469\n32986,32987\n32988,1673\n32989,1556\n32990,200\n32991,2572\n32992,147\n32992,406\n32993,1227\n32993,1229\n32993,86416\n32994,21944\n32995,994\n32996,1983\n32997,32998\n32999,217\n33000,376\n33001,682\n33002,1572\n33003,1955\n33004,344\n33005,1417\n33006,5908\n33007,247\n33008,893\n33009,344\n33010,269\n33011,72\n33012,8907\n33013,158\n33014,1782\n33015,2105\n33016,775\n33016,3422\n33017,200\n33018,63\n33019,3585\n33020,1467\n33021,1210\n33022,932\n33023,1241\n33024,372\n33025,1849\n33026,1082\n33027,1479\n33028,63\n33029,143\n33032,72\n33033,3297\n33034,33035\n33036,422\n33037,106\n33038,146\n33039,1282\n33040,149\n33041,425\n33042,366\n33043,147\n33043,602\n33043,1265\n33043,1266\n33043,1370\n33044,358\n33045,1140\n33046,1782\n33047,219\n33048,1639\n33048,21944\n33049,809\n33049,2017\n33050,72\n33051,33052\n33053,1707\n33054,9011\n33054,9032\n33056,72\n33057,346\n33058,79\n33059,3069\n33060,298\n33061,485\n33063,676\n33064,298\n33065,485\n33067,298\n33068,485\n33070,5366\n33071,310\n33071,6556\n33072,143\n33073,33074\n33075,406\n33075,2178\n33075,4545\n33076,557\n33077,557\n33078,644\n33079,298\n33080,485\n33081,33082\n33083,602\n33083,3218\n33084,2506\n33085,760\n33085,788\n33086,200\n33086,215\n33086,1227\n33086,1229\n33086,1458\n33086,86416\n33087,510\n33088,338\n33089,137\n33090,346\n33091,1707\n33091,4165\n33093,63\n33094,83\n33094,301\n33094,1313\n33095,527\n33096,72\n33097,1289\n33098,346\n33099,72\n33100,980\n33101,346\n33102,219\n33103,63\n33104,3209\n33105,83\n33105,1014\n33106,4453\n33108,1117\n33108,1715\n33109,2506\n33110,33111\n33112,2506\n33113,33114\n33115,10\n33116,2528\n33117,10\n33118,1539\n33119,1313\n33120,323\n33121,309\n33121,310\n33122,33123\n33124,5213\n33125,272\n33126,1\n33127,907\n33128,605\n33129,3161\n33130,818\n33131,44\n33132,479\n33133,305\n33134,292\n33135,217\n33136,323\n33137,115\n33137,118\n33138,704\n33139,247\n33140,206\n33141,1087\n33142,33143\n33144,83\n33144,356\n33145,261\n33146,267\n33147,1285\n33147,1955\n33148,312\n33149,309\n33150,151\n33151,77\n33152,46\n33152,1509\n33153,137\n33154,143\n33155,47\n33155,1235\n33155,1335\n33155,2469\n33156,137\n33157,1227\n33157,1229\n33157,21944\n33157,86416\n33159,22\n33160,143\n33160,1052\n33160,1962\n33161,346\n33162,305\n33162,1556\n33163,717\n33164,34\n33164,35\n33165,8992\n33166,585\n33167,292\n33168,33169\n33170,33171\n33170,230159\n33172,2923\n33173,50\n33174,192\n33175,272\n33176,126\n33177,1149\n33178,907\n33179,4101\n33180,5366\n33181,275\n33182,72\n33183,219\n33184,2351\n33185,151\n33186,19986\n33187,349\n33188,872\n33189,328\n33190,6179\n33190,6180\n33191,292\n33192,1837\n33193,33194\n33195,63\n33196,920\n33197,33197\n33199,81\n33200,33201\n33202,33203\n33204,104\n33205,72\n33206,346\n33207,349\n33208,255\n33209,137\n33210,104\n33211,9121\n33212,333\n33212,779\n33212,2931\n33213,3209\n33214,4453\n33215,366\n33216,481\n33217,33218\n33219,240\n33220,31977\n33221,99\n33222,1556\n33223,33224\n33225,323\n33226,424\n33226,784\n33227,10\n33228,640\n33229,2334\n33230,146\n33231,272\n33232,417\n33232,2296\n33233,907\n33234,818\n33235,1313\n33236,233\n33237,24505\n33238,433\n33239,292\n33240,861\n33241,302\n33242,3161\n33243,687\n33244,579\n33246,920\n33247,452\n33248,634\n33249,206\n33250,455\n33250,1240\n33251,302\n33251,1284\n33251,1749\n33251,2367\n33252,473\n33253,33254\n33255,33256\n33257,452\n33258,1010\n33259,805\n33260,2979\n33261,63\n33261,1871\n33262,333\n33262,15573\n33263,483\n33263,1011\n33263,1289\n33264,1140\n33265,452\n33266,309\n33267,126\n33269,104\n33269,557\n33269,953\n33269,954\n33270,294\n33271,605\n33272,452\n33273,1673\n33274,1571\n33275,1844\n33276,171\n33277,14231\n33278,452\n33280,675\n33281,200\n33282,299\n33282,2083\n33283,4771\n33284,33285\n33286,33285\n33287,1\n33287,313\n33287,685\n33287,827\n33287,841\n33287,1319\n33287,1566\n33287,1821\n33287,2421\n33287,21736\n33289,1425\n33290,3069\n33292,527\n33292,743\n33292,1983\n33292,8714\n33292,95152\n33293,33294\n33293,81520\n33296,178\n33296,579\n33296,3422\n33297,34\n33297,35\n33297,457\n33297,536\n33297,868\n33299,306\n33299,307\n33300,452\n33301,126\n33302,248\n33303,2775\n33304,447\n33306,349\n33307,626\n33307,784\n33307,862\n33307,1160\n33307,1177\n33307,1309\n33307,1415\n33308,784\n33309,33310\n33311,500\n33311,718\n33312,1433\n33313,72\n33314,907\n33315,2837\n33316,489\n33318,126\n33319,640\n33320,452\n33321,33322\n33321,55376\n33323,298\n33324,269\n33324,344\n33324,1070\n33326,126\n33326,206\n33326,435\n33326,47785\n33327,72\n33328,911\n33329,313\n33330,1955\n33332,158\n33332,202\n33332,203\n33332,697\n33332,1001\n33332,1417\n33334,2989\n33334,2991\n33337,72\n33338,187\n33338,285\n33338,304\n33338,390\n33338,415\n33338,567\n33338,623\n33338,685\n33338,762\n33338,1241\n33338,1419\n33338,1436\n33338,1888\n33338,2989\n33338,2991\n33338,4760\n33338,5591\n33338,6068\n33338,36761\n33340,143\n33341,2224\n33341,3769\n33342,298\n33343,485\n33344,137\n33345,994\n33345,1368\n33346,192\n33347,298\n33348,485\n33349,33350\n33349,40255\n33349,44019\n33349,51082\n33349,53540\n33349,60024\n33349,64862\n33349,77242\n33349,95902\n33349,129317\n33351,718\n33352,2671\n33353,5405\n33354,252\n33354,516\n33354,1220\n33354,1222\n33354,189842\n33355,422\n33356,422\n33357,422\n33358,33359\n33360,422\n33361,422\n33362,422\n33363,422\n33364,422\n33365,422\n33366,2296\n33367,58\n33368,46\n33369,579\n33369,4177\n33370,2296\n33371,298\n33372,485\n33373,1147\n33376,536\n33377,1323\n33378,102\n33379,1326\n33380,408\n33381,875\n33382,431\n33382,631\n33382,4220\n33382,41027\n33382,58979\n33382,66297\n33382,88266\n33383,1235\n33383,1257\n33383,1335\n33384,788\n33385,1608\n33386,72\n33387,344\n33388,285\n33389,2931\n33389,15609\n33389,33390\n33391,273\n33391,274\n33391,66754\n33392,389\n33392,455\n33392,1274\n33392,1881\n33392,5933\n33392,6506\n33392,7092\n33393,3524\n33394,72\n33395,107\n33396,143\n33397,2353\n33398,1085\n33398,2083\n33399,1983\n33400,644\n33401,338\n33403,452\n33404,1247\n33405,184\n33407,1983\n33408,1276\n33409,207\n33409,1210\n33410,663\n33412,1955\n33414,7698\n33415,577\n33416,147\n33416,158\n33417,5540\n33418,596\n33418,697\n33419,1983\n33420,58\n33421,46\n33423,893\n33424,104\n33424,248\n33424,289\n33424,290\n33424,588\n33424,590\n33424,631\n33424,704\n33424,714\n33424,1282\n33424,1402\n33424,1415\n33424,1462\n33424,1745\n33424,2105\n33424,2205\n33424,2206\n33424,2286\n33424,2315\n33424,4218\n33424,8537\n33424,33424\n33424,94134\n33425,1634\n33426,1058\n33427,2319\n33428,58\n33429,46\n33430,1860\n33432,516\n33433,1634\n33434,211\n33435,50\n33436,1143\n33437,30\n33437,175\n33437,313\n33437,693\n33437,1188\n33438,33439\n33440,3069\n33441,457\n33441,760\n33441,1745\n33443,1\n33443,63\n33443,83\n33443,184\n33443,285\n33443,442\n33443,808\n33443,918\n33443,1238\n33443,1425\n33443,1571\n33443,1639\n33443,2312\n33443,2744\n33443,3246\n33443,6556\n33443,19010\n33443,147123\n33444,994\n33444,21944\n33445,298\n33446,485\n33447,147\n33447,158\n33448,1983\n33449,1983\n33450,264\n33450,1007\n33451,389\n33451,1058\n33451,1454\n33452,4594\n33453,389\n33454,687\n33454,1556\n33455,392\n33456,33457\n33456,38925\n33456,65399\n33458,861\n33458,1556\n33459,187\n33460,1983\n33461,1639\n33462,1579\n33463,72\n33464,515\n33465,1227\n33465,1229\n33465,86416\n33466,877\n33466,1284\n33467,668\n33468,65\n33468,417\n33468,1836\n33469,536\n33470,143\n33471,2995\n33472,15573\n33473,1983\n33474,192\n33474,663\n33474,664\n33475,136\n33475,313\n33476,1639\n33477,1579\n33478,571\n33479,567\n33479,604\n33479,1740\n33480,290\n33480,714\n33480,1511\n33480,2206\n33480,33424\n33480,94134\n33481,15068\n33482,48\n33482,1007\n33482,1381\n33483,22\n33483,1374\n33484,33485\n33487,211\n33487,1462\n33488,9121\n33489,1977\n33489,1978\n33490,178\n33490,1188\n33490,68069\n33491,63\n33491,2105\n33492,33493\n33494,309\n33494,310\n33495,1579\n33495,1893\n33495,2605\n33495,49057\n33496,631\n33497,273\n33497,274\n33498,1983\n33499,1458\n33500,7360\n33501,130\n33501,140\n33501,160\n33501,515\n33501,1052\n33502,29380\n33504,65\n33506,760\n33506,818\n33507,143\n33509,20747\n33510,255\n33511,2296\n33512,920\n33513,33514\n33516,250\n33517,171\n33518,1474\n33519,34\n33519,35\n33519,389\n33519,1860\n33520,136\n33521,79\n33522,852\n33524,626\n33525,596\n33525,1368\n33526,136\n33527,167\n33527,1436\n33527,2083\n33527,2979\n33528,1984\n33530,298\n33531,485\n33533,50\n33534,313\n33536,3582\n33538,47\n33538,2469\n33539,510\n33540,640\n33541,3451\n33541,3452\n33542,17593\n33543,4\n33543,5\n33544,65\n33546,392\n33546,644\n33546,2105\n33546,3003\n33547,743\n33548,33549\n33548,78285\n33548,89712\n33548,105044\n33548,105420\n33548,111610\n33548,111886\n33548,111911\n33550,1608\n33551,313\n33554,713\n33555,160\n33556,835\n33556,1968\n33557,592\n33558,217\n33558,536\n33559,195\n33560,2296\n33561,33562\n33563,83\n33564,330\n33565,17228\n33566,1368\n33567,104\n33567,135\n33567,588\n33567,590\n33567,596\n33567,714\n33567,862\n33567,1119\n33567,1882\n33567,2572\n33567,3623\n33568,298\n33570,147\n33570,493\n33571,182\n33572,911\n33573,188\n33574,4831\n33575,143\n33576,1\n33577,2590\n33578,2224\n33579,657\n33580,2424\n33581,13980\n33582,2779\n33583,6263\n33584,1345\n33584,1370\n33585,3538\n33586,364\n33587,1240\n33587,1454\n33587,3182\n33587,4252\n33587,6955\n33588,195\n33589,1767\n33590,333\n33590,779\n33591,1001\n33592,9011\n33592,9032\n33594,3209\n33595,668\n33597,33598\n33599,151\n33600,72\n33601,907\n33601,932\n33602,104\n33602,332\n33603,389\n33604,272\n33605,1033\n33606,1722\n33607,182\n33608,240\n33609,760\n33610,33611\n33612,9018\n33613,2209\n33614,388\n33615,1140\n33616,393\n33617,452\n33617,457\n33617,497\n33617,535\n33617,676\n33617,918\n33617,1655\n33618,287\n33619,130\n33619,140\n33619,515\n33619,1052\n33619,1968\n33622,849\n33622,1011\n33623,147\n33624,649\n33625,264\n33625,536\n33625,718\n33625,1160\n33625,1732\n33625,3422\n33626,420\n33627,346\n33628,1010\n33629,140\n33631,17590\n33632,390\n33633,1085\n33634,1298\n33635,10\n33636,420\n33636,509\n33636,510\n33636,1722\n33636,1836\n33637,784\n33638,140\n33639,4453\n33640,515\n33641,1634\n33642,264\n33643,1639\n33644,968\n33645,298\n33646,406\n33647,726\n33648,195\n33648,920\n33648,5101\n33648,5103\n33649,1287\n33649,9030\n33650,535\n33650,872\n33650,2989\n33650,2991\n33650,3252\n33650,7092\n33651,33652\n33653,1983\n33654,393\n33655,41\n33655,33656\n33657,63\n33658,79\n33659,1072\n33660,233\n33660,1955\n33660,3135\n33661,850\n33662,33663\n33664,3260\n33667,2995\n33668,483\n33669,1140\n33670,251\n33671,15573\n33672,126\n33672,333\n33672,430\n33672,1402\n33672,1803\n33672,2605\n33673,1276\n33674,32\n33674,623\n33674,1805\n33674,4760\n33675,1007\n33676,2048\n33677,130\n33678,920\n33679,920\n33680,4475\n33681,2837\n33682,151\n33683,649\n33684,2779\n33685,2045\n33685,8788\n33685,17263\n33685,29253\n33685,29294\n33686,195\n33687,1285\n33688,56\n33688,99\n33688,206\n33688,333\n33688,1425\n33688,6119\n33689,704\n33690,267\n33690,1544\n33691,636\n33692,33693\n33692,40069\n33692,45324\n33692,50219\n33692,51553\n33692,51559\n33692,51923\n33692,55402\n33692,61633\n33692,84008\n33692,99415\n33692,100936\n33694,2668\n33695,1085\n33695,1411\n33696,111\n33696,294\n33696,843\n33696,1411\n33696,2209\n33696,3585\n33696,21711\n33697,289\n33697,290\n33697,1818\n33697,94134\n33697,144988\n33698,1309\n33699,158\n33699,1433\n33700,760\n33701,1243\n33702,1085\n33702,2572\n33703,68\n33703,1634\n33704,31977\n33705,2506\n33707,4\n33707,5\n33707,30\n33707,32\n33707,44\n33707,50\n33707,59\n33707,79\n33707,147\n33707,215\n33707,217\n33707,240\n33707,251\n33707,272\n33707,298\n33707,301\n33707,323\n33707,336\n33707,337\n33707,346\n33707,393\n33707,417\n33707,422\n33707,430\n33707,493\n33707,503\n33707,516\n33707,538\n33707,585\n33707,586\n33707,588\n33707,590\n33707,592\n33707,671\n33707,704\n33707,714\n33707,760\n33707,795\n33707,801\n33707,805\n33707,862\n33707,907\n33707,932\n33707,973\n33707,996\n33707,1001\n33707,1007\n33707,1068\n33707,1085\n33707,1133\n33707,1149\n33707,1212\n33707,1231\n33707,1265\n33707,1266\n33707,1294\n33707,1309\n33707,1326\n33707,1370\n33707,1425\n33707,1531\n33707,1732\n33707,1789\n33707,1963\n33707,2205\n33707,2206\n33707,2244\n33707,2296\n33707,2334\n33707,2353\n33707,2379\n33707,2620\n33707,2782\n33707,2793\n33707,3148\n33707,3321\n33707,3794\n33707,4748\n33707,5726\n33707,5874\n33707,6279\n33707,8855\n33707,16019\n33707,33424\n33708,217\n33709,83\n33710,907\n33711,818\n33711,907\n33711,2995\n33712,2506\n33713,868\n33714,873\n33715,1801\n33716,63\n33716,2116\n33717,195\n33718,33719\n33720,158\n33722,264\n33723,1058\n33724,33725\n33726,717\n33726,1544\n33726,1807\n33727,1511\n33727,3069\n33728,577\n33728,4222\n33729,83\n33730,301\n33731,71\n33733,1782\n33734,1653\n33735,301\n33735,968\n33735,1293\n33735,3422\n33735,189303\n33736,3079\n33737,83\n33738,1151\n33738,1836\n33738,13361\n33739,515\n33739,1893\n33740,3724\n33741,3218\n33742,247\n33743,25873\n33744,850\n33745,818\n33746,147\n33746,158\n33747,32\n33747,79\n33747,104\n33747,106\n33747,116\n33747,134\n33747,137\n33747,146\n33747,147\n33747,149\n33747,158\n33747,178\n33747,192\n33747,240\n33747,248\n33747,323\n33747,330\n33747,333\n33747,336\n33747,337\n33747,406\n33747,417\n33747,422\n33747,442\n33747,493\n33747,516\n33747,585\n33747,589\n33747,592\n33747,620\n33747,622\n33747,636\n33747,640\n33747,694\n33747,760\n33747,779\n33747,805\n33747,862\n33747,907\n33747,994\n33747,1016\n33747,1033\n33747,1085\n33747,1181\n33747,1235\n33747,1282\n33747,1326\n33747,1335\n33747,1368\n33747,1370\n33747,1388\n33747,1411\n33747,1425\n33747,1515\n33747,1531\n33747,1551\n33747,1939\n33747,1955\n33747,2087\n33747,2205\n33747,2206\n33747,2210\n33747,2701\n33747,2782\n33747,2931\n33747,2979\n33747,3085\n33747,3115\n33747,3148\n33747,3317\n33747,3321\n33747,4237\n33747,4355\n33747,4455\n33747,6119\n33747,7270\n33748,704\n33749,861\n33750,360\n33750,760\n33750,1149\n33750,1631\n33751,264\n33751,515\n33751,579\n33751,861\n33751,4453\n33752,477\n33752,2944\n33753,248\n33754,137\n33755,333\n33755,663\n33755,664\n33756,589\n33756,953\n33756,8788\n33757,717\n33758,422\n33759,56\n33760,2574\n33761,83\n33762,1556\n33763,376\n33764,2674\n33764,36761\n33764,75912\n33765,3148\n33766,33767\n33768,3653\n33769,289\n33769,290\n33770,72\n33771,33772\n33771,43398\n33773,859\n33774,1429\n33775,827\n33776,298\n33777,485\n33778,298\n33779,485\n33780,33781\n33782,184\n33783,1414\n33784,250\n33785,298\n33786,485\n33787,536\n33788,34\n33788,35\n33788,1715\n33789,310\n33789,6556\n33790,843\n33791,264\n33791,622\n33792,660\n33793,682\n33794,862\n33794,1388\n33795,872\n33796,557\n33797,557\n33798,9011\n33798,9032\n33799,1010\n33799,3182\n33799,221329\n33800,2775\n33801,447\n33802,809\n33802,907\n33803,1608\n33804,887\n33805,33806\n33805,120243\n33805,140986\n33807,250\n33808,44\n33809,1241\n33810,9011\n33810,9032\n33811,2506\n33812,33813\n33814,83\n33815,949\n33817,1117\n33818,33819\n33820,298\n33820,589\n33822,298\n33823,485\n33824,33825\n33826,330\n33827,10\n33828,843\n33829,72\n33830,240\n33830,1001\n33830,3367\n33831,6803\n33832,72\n33833,1807\n33834,33835\n33836,72\n33837,873\n33838,158\n33838,2931\n33838,8822\n33839,704\n33840,138\n33840,1227\n33840,1229\n33840,86416\n33841,2506\n33842,589\n33843,652\n33844,3138\n33845,1381\n33846,1102\n33847,3138\n33848,72\n33849,72\n33850,309\n33850,310\n33851,151\n33851,1179\n33851,2779\n33852,6068\n33853,130\n33854,10\n33855,2526\n33856,33857\n33858,1319\n33859,2351\n33860,33861\n33860,53595\n33860,108528\n33860,119579\n33862,920\n33863,72\n33864,1227\n33864,1229\n33864,21944\n33864,86416\n33865,557\n33866,1007\n33867,33868\n33869,366\n33871,126\n33872,2334\n33873,1414\n33874,171\n33875,1425\n33876,422\n33877,422\n33878,422\n33879,422\n33880,422\n33881,717\n33882,83\n33883,33884\n33885,83\n33886,422\n33887,4594\n33888,720\n33888,877\n33888,973\n33888,1284\n33888,1732\n33888,1837\n33888,2191\n33889,207\n33890,1659\n33891,875\n33892,628\n33893,1556\n33894,255\n33896,272\n33897,2296\n33898,275\n33898,1149\n33898,8992\n33899,258\n33900,255\n33901,1082\n33902,252\n33902,318\n33902,31977\n33902,174873\n33903,33904\n33905,72\n33906,577\n33907,1381\n33908,6051\n33909,115\n33909,118\n33909,333\n33910,346\n33911,772\n33912,30\n33913,217\n33913,1118\n33914,99\n33915,33916\n33917,171\n33918,7360\n33919,784\n33920,83\n33921,163\n33922,33923\n33924,2351\n33925,8884\n33926,33927\n33926,63402\n33928,652\n33929,3447\n33930,1775\n33931,33932\n33933,17588\n33934,6621\n33934,33935\n33934,43269\n33934,57503\n33934,57504\n33934,118252\n33934,223329\n33936,33937\n33938,503\n33938,1085\n33940,33941\n33942,33943\n33944,298\n33945,485\n33946,366\n33947,366\n33948,366\n33949,366\n33950,83\n33951,309\n33951,310\n33951,1313\n33952,33953\n33954,920\n33954,8854\n33955,2574\n33956,33957\n33958,233\n33959,1238\n33960,557\n33961,83\n33961,694\n33962,1452\n33963,349\n33964,980\n33965,2319\n33966,1871\n33967,634\n33968,240\n33968,392\n33968,818\n33968,1722\n33969,72\n33970,344\n33971,285\n33973,731\n33974,83\n33975,862\n33977,58\n33977,1653\n33977,1836\n33977,2436\n33977,13361\n33978,5366\n33979,579\n33980,452\n33982,135\n33984,3207\n33985,577\n33985,788\n33987,481\n33988,195\n33988,663\n33988,1639\n33988,1849\n33989,611\n33990,115\n33990,118\n33990,184\n33990,261\n33990,272\n33990,489\n33990,1188\n33990,1821\n33990,2315\n33990,6051\n33990,21736\n33991,158\n33991,192\n33991,535\n33991,1181\n33991,2178\n33991,4545\n33992,50\n33992,192\n33992,264\n33992,315\n33992,968\n33992,1639\n33992,1796\n33992,14989\n33992,33993\n33992,86700\n33992,155228\n33994,58\n33995,41\n33995,459\n33995,6506\n33996,1893\n33996,7155\n33997,525\n33998,452\n33999,1\n33999,195\n33999,202\n33999,203\n33999,330\n33999,563\n33999,994\n33999,1247\n33999,3161\n34000,579\n34001,336\n34001,406\n34002,72\n34003,3207\n34004,211\n34004,500\n34005,2048\n34007,452\n34008,1243\n34009,1274\n34011,79\n34011,115\n34012,306\n34012,307\n34013,83\n34013,187\n34013,283\n34013,313\n34013,356\n34013,477\n34013,694\n34013,5591\n34014,192\n34014,455\n34017,86\n34018,5405\n34019,376\n34021,298\n34022,485\n34023,424\n34024,452\n34025,126\n34026,783\n34027,875\n34028,2590\n34029,640\n34030,4190\n34031,2048\n34032,135\n34033,2944\n34034,187\n34035,126\n34036,3695\n34037,1149\n34038,1179\n34039,467\n34039,872\n34040,312\n34041,111\n34042,72\n34044,3695\n34045,1149\n34046,1179\n34047,1509\n34048,795\n34049,158\n34050,452\n34051,34052\n34053,186\n34054,861\n34056,1085\n34057,14650\n34058,3003\n34060,24\n34060,25\n34060,26\n34060,28\n34060,33\n34060,47\n34060,59\n34060,60\n34060,66\n34060,885\n34060,887\n34060,994\n34060,1432\n34060,1775\n34060,2088\n34060,2469\n34060,2674\n34060,2701\n34060,4079\n34060,4571\n34060,5162\n34060,9343\n34060,9539\n34060,9541\n34060,16153\n34060,21944\n34060,82021\n34060,88820\n34060,154690\n34060,171294\n34061,120\n34061,1353\n34061,35691\n34061,78083\n34061,78121\n34061,78187\n34061,83764\n34061,86490\n34061,90133\n34061,99762\n34061,100327\n34061,105389\n34061,106702\n34061,108898\n34061,108924\n34061,116162\n34061,118755\n34061,120197\n34063,79\n34063,4220\n34064,968\n34066,79\n34066,1639\n34067,83\n34068,1323\n34069,102\n34070,1326\n34071,408\n34072,388\n34073,631\n34073,972\n34073,973\n34073,1210\n34073,1298\n34075,8993\n34077,304\n34077,801\n34078,660\n34079,424\n34080,1551\n34080,3041\n34081,255\n34082,809\n34083,1363\n34084,663\n34084,664\n34086,784\n34087,718\n34088,779\n34090,493\n34091,868\n34092,581\n34093,417\n34095,1133\n34095,5250\n34097,104\n34098,579\n34099,46\n34099,58\n34100,104\n34100,134\n34101,4611\n34102,1544\n34103,192\n34104,2506\n34105,1836\n34106,515\n34107,50\n34108,72\n34109,344\n34110,285\n34111,1287\n34111,2436\n34112,120\n34112,217\n34112,1085\n34112,1241\n34112,1949\n34113,252\n34113,16201\n34114,79\n34114,1572\n34115,1634\n34116,314\n34116,852\n34116,3367\n34117,66\n34117,1267\n34117,75912\n34120,225\n34121,2572\n34122,259\n34122,3949\n34123,1370\n34124,1844\n34125,3161\n34126,5908\n34127,19443\n34129,567\n34129,3422\n34129,4222\n34129,4760\n34129,6068\n34130,135\n34131,312\n34132,72\n34133,1749\n34134,143\n34135,868\n34137,65\n34137,79\n34137,3744\n34138,932\n34140,1298\n34142,500\n34143,1962\n34144,1052\n34145,1882\n34146,2775\n34147,54\n34148,2210\n34148,4237\n34149,1309\n34150,106\n34150,996\n34151,10\n34151,493\n34151,596\n34151,1135\n34151,1149\n34151,1210\n34151,1368\n34151,1509\n34151,1860\n34151,1973\n34151,2173\n34151,5250\n34152,875\n34153,310\n34153,620\n34153,3039\n34154,58\n34154,801\n34154,1140\n34154,1177\n34155,875\n34156,1010\n34157,510\n34158,264\n34159,302\n34159,893\n34160,273\n34160,274\n34161,264\n34162,37\n34162,698\n34162,1293\n34162,1782\n34164,1579\n34165,1639\n34167,515\n34168,1179\n34169,1238\n34170,1572\n34171,312\n34172,72\n34173,3538\n34174,2083\n34176,93\n34176,94\n34177,850\n34179,663\n34179,664\n34180,26\n34180,59\n34180,994\n34180,1235\n34180,1335\n34180,4571\n34180,21944\n34181,1118\n34181,1556\n34182,83\n34183,217\n34183,657\n34183,1417\n34183,6789\n34185,77\n34186,34187\n34188,485\n34190,143\n34191,1539\n34192,217\n34192,1417\n34193,717\n34193,1293\n34193,1782\n34194,818\n34195,1619\n34196,83\n34197,1007\n34198,1411\n34199,3804\n34200,333\n34201,79\n34202,663\n34202,664\n34203,996\n34204,1977\n34204,1978\n34205,431\n34205,440\n34205,622\n34205,862\n34206,431\n34206,631\n34207,115\n34207,118\n34208,1607\n34208,3582\n34209,65\n34210,217\n34210,278\n34210,536\n34210,949\n34210,1467\n34211,1556\n34212,1\n34212,10\n34212,693\n34213,301\n34213,604\n34214,219\n34215,1388\n34216,1454\n34217,3724\n34218,48\n34218,264\n34218,1007\n34218,1132\n34218,1289\n34218,1381\n34218,1551\n34218,1893\n34218,3999\n34219,1016\n34220,267\n34221,1243\n34222,452\n34222,457\n34222,497\n34222,535\n34222,676\n34222,918\n34222,1655\n34223,72\n34224,344\n34225,285\n34226,1010\n34227,301\n34227,604\n34228,861\n34229,2923\n34230,920\n34231,875\n34232,1433\n34232,3744\n34233,301\n34233,304\n34233,752\n34233,968\n34234,1319\n34234,2557\n34235,58\n34236,46\n34237,79\n34237,192\n34238,996\n34239,1007\n34240,626\n34242,1849\n34242,32784\n34243,72\n34244,344\n34245,285\n34247,106\n34248,20\n34249,41\n34250,9029\n34252,859\n34253,192\n34253,663\n34253,664\n34253,1943\n34253,2480\n34254,72\n34255,344\n34256,285\n34257,143\n34258,788\n34259,79\n34259,336\n34260,13\n34260,251\n34260,337\n34260,450\n34260,516\n34260,611\n34260,925\n34261,349\n34262,333\n34262,1181\n34264,772\n34265,2319\n34266,626\n34267,192\n34267,336\n34267,663\n34268,178\n34268,435\n34268,622\n34268,1033\n34269,209\n34270,891\n34271,1085\n34272,217\n34273,1072\n34274,4637\n34275,34\n34275,35\n34276,455\n34277,2266\n34278,1274\n34279,1201\n34280,2421\n34281,34\n34281,35\n34281,536\n34281,2266\n34282,1298\n34283,536\n34284,2744\n34285,83\n34285,1466\n34286,2923\n34287,34\n34287,35\n34287,536\n34287,2266\n34288,623\n34289,143\n34291,644\n34293,1881\n34295,693\n34296,1732\n34298,1893\n34299,2646\n34300,389\n34301,5908\n34302,278\n34303,1133\n34306,4190\n34308,8270\n34310,72\n34311,795\n34316,4252\n34317,217\n34318,83\n34320,56\n34320,275\n34320,626\n34320,1973\n34321,264\n34321,649\n34321,1282\n34321,36819\n34322,1749\n34322,3585\n34323,581\n34323,918\n34325,818\n34326,718\n34327,953\n34328,30331\n34329,46\n34329,301\n34329,390\n34329,525\n34329,595\n34329,615\n34329,744\n34329,783\n34329,832\n34329,874\n34329,919\n34329,941\n34329,1010\n34329,1133\n34329,1436\n34329,1522\n34329,1544\n34329,1837\n34329,1849\n34329,2372\n34329,3422\n34330,215\n34331,1531\n34332,248\n34333,718\n34334,602\n34335,261\n34335,1466\n34336,392\n34337,280\n34338,10\n34339,2319\n34341,192\n34342,439\n34344,592\n34346,1001\n34348,2319\n34349,536\n34350,1572\n34351,1082\n34352,248\n34352,557\n34353,467\n34353,620\n34353,868\n34353,1385\n34353,152855\n34354,1313\n34355,907\n34355,932\n34356,255\n34357,392\n34357,1151\n34358,200\n34359,397\n34360,81\n34360,372\n34360,1085\n34360,1522\n34360,1635\n34360,1955\n34360,2006\n34360,2812\n34360,3538\n34361,247\n34362,56\n34363,217\n34363,536\n34363,2319\n34364,1118\n34365,72\n34366,158\n34367,379\n34367,868\n34367,1345\n34368,577\n34369,1805\n34370,7757\n34372,195\n34373,302\n34374,1177\n34374,1220\n34374,1222\n34374,2210\n34375,217\n34376,247\n34377,1241\n34378,305\n34379,1556\n34380,120\n34380,805\n34381,809\n34382,8788\n34383,579\n34383,71820\n34385,579\n34386,273\n34386,274\n34386,1707\n34387,3148\n34388,333\n34389,2590\n34390,72\n34390,217\n34390,222\n34390,509\n34390,510\n34390,1043\n34391,34392\n34394,34395\n34396,389\n34397,31977\n34397,34398\n34397,53196\n34397,155171\n34399,579\n34400,323\n34401,222\n34401,455\n34402,151\n34403,1082\n34403,1807\n34404,718\n34405,83\n34406,83\n34406,285\n34406,2784\n34406,28130\n34407,278\n34407,609\n34407,1688\n34408,72\n34409,344\n34410,285\n34411,652\n34412,515\n34413,652\n34415,278\n34415,809\n34416,2045\n34417,622\n34417,868\n34417,1133\n34417,1326\n34418,818\n34420,885\n34421,338\n34421,2312\n34422,143\n34424,269\n34425,283\n34426,292\n34426,1082\n34427,424\n34428,3296\n34429,34430\n34431,83\n34432,13661\n34434,294\n34434,304\n34434,1085\n34435,215\n34437,1082\n34438,415\n34439,209\n34439,515\n34440,609\n34441,195\n34443,5662\n34444,1849\n34445,202\n34445,203\n34446,1715\n34447,1893\n34448,1955\n34449,417\n34450,301\n34451,1231\n34452,5718\n34453,752\n34454,1564\n34455,2083\n34456,2620\n34457,390\n34458,7572\n34459,392\n34460,626\n34461,388\n34462,605\n34463,1837\n34464,8798\n34465,3422\n34466,3193\n34467,1241\n34468,1782\n34469,1522\n34470,2191\n34471,3194\n34472,907\n34473,1167\n34474,1326\n34475,968\n34476,1544\n34477,3218\n34478,3207\n34479,3138\n34480,2557\n34481,1298\n34482,720\n34483,1010\n34484,589\n34485,6068\n34486,233\n34487,1210\n34488,3\n34489,1001\n34490,240\n34491,518\n34492,973\n34493,86\n34494,143\n34495,1231\n34495,1782\n34496,192\n34497,10\n34498,1181\n34499,298\n34500,140\n34501,34502\n34503,483\n34504,222\n34505,146\n34505,106502\n34506,4222\n34507,143\n34508,439\n34509,455\n34509,657\n34509,2266\n34509,6424\n34510,302\n34512,336\n34513,72\n34514,1082\n34516,8822\n34517,202\n34517,203\n34518,298\n34519,485\n34520,1227\n34520,1229\n34521,1224\n34522,2296\n34523,1033\n34524,255\n34524,571\n34524,818\n34524,68069\n34525,652\n34526,1082\n34527,2867\n34527,2868\n34527,22880\n34528,28294\n34529,1267\n34530,302\n34530,893\n34530,1893\n34531,104\n34531,918\n34532,376\n34533,34534\n34535,34534\n34536,71\n34536,417\n34536,557\n34536,615\n34536,1612\n34536,3467\n34537,1227\n34537,1229\n34538,718\n34539,10\n34540,269\n34541,415\n34541,996\n34542,6298\n34543,58\n34543,86\n34543,167\n34543,240\n34543,301\n34543,372\n34543,444\n34543,567\n34543,589\n34543,605\n34543,615\n34543,631\n34543,720\n34543,801\n34543,843\n34543,907\n34543,968\n34543,972\n34543,973\n34543,1010\n34543,1122\n34543,1124\n34543,1140\n34543,1167\n34543,1231\n34543,1241\n34543,1284\n34543,1298\n34543,1309\n34543,1436\n34543,1522\n34543,1544\n34543,1564\n34543,1782\n34543,1785\n34543,1818\n34543,1837\n34543,1893\n34543,1955\n34543,2083\n34543,2191\n34543,2372\n34543,2557\n34543,2620\n34543,2979\n34543,3193\n34543,3194\n34543,3207\n34543,3218\n34543,20359\n34544,647\n34545,344\n34546,1082\n34547,143\n34548,2116\n34549,34550\n34551,83\n34552,602\n34553,2923\n34553,4190\n34554,1907\n34555,184\n34556,1818\n34556,1955\n34557,1608\n34558,50\n34558,97\n34558,104\n34558,106\n34558,147\n34558,178\n34558,202\n34558,203\n34558,333\n34558,493\n34558,588\n34558,590\n34558,620\n34558,622\n34558,628\n34558,640\n34558,720\n34558,779\n34558,1175\n34558,1247\n34558,1370\n34558,1509\n34558,1515\n34558,2073\n34558,2782\n34558,2931\n34558,3876\n34558,6279\n34558,8270\n34558,8788\n34559,143\n34560,631\n34561,5908\n34562,3\n34562,1807\n34562,1984\n34563,1085\n34564,647\n34565,344\n34566,557\n34567,557\n34568,346\n34569,147\n34569,158\n34570,10\n34571,77\n34572,795\n34573,392\n34574,1707\n34575,1078\n34576,1749\n34578,346\n34579,392\n34580,34580\n34581,503\n34581,704\n34581,1149\n34582,1231\n34583,586\n34584,622\n34585,178\n34586,1590\n34587,1837\n34588,671\n34589,346\n34590,439\n34591,333\n34592,192\n34593,717\n34594,515\n34595,34596\n34597,209\n34598,7698\n34599,1\n34599,94\n34599,184\n34599,2787\n34600,422\n34602,1551\n34603,54\n34604,2411\n34605,586\n34605,1227\n34605,1229\n34606,104\n34607,34608\n34609,1\n34609,149\n34609,184\n34609,1425\n34609,1966\n34609,2244\n34609,102786\n34609,118336\n34609,141230\n34609,141821\n34609,154519\n34609,154521\n34609,158397\n34609,158401\n34609,177841\n34609,226362\n34609,226381\n34609,239459\n34609,240870\n34610,130\n34610,272\n34610,273\n34610,489\n34610,1188\n34610,1634\n34610,1821\n34610,2315\n34610,2367\n34610,4571\n34611,34611\n34612,1052\n34613,577\n34614,209\n34615,2334\n34616,34617\n34618,693\n34619,344\n34619,859\n34619,1512\n34619,2646\n34619,5992\n34620,775\n34621,2506\n34622,312\n34623,34624\n34625,1983\n34626,192\n34626,1847\n34626,6119\n34627,126\n34627,452\n34627,457\n34627,497\n34627,535\n34627,676\n34627,843\n34627,918\n34627,1011\n34627,1655\n34627,4165\n34627,5726\n34628,3960\n34629,72\n34630,1\n34631,171\n34632,34633\n34634,34635\n34636,72\n34637,195\n34638,1\n34639,34640\n34641,663\n34641,664\n34642,644\n34643,24505\n34644,2775\n34645,447\n34646,34647\n34648,34647\n34649,264\n34650,34651\n34652,2590\n34653,1818\n34654,9195\n34655,1284\n34656,1274\n34656,1429\n34657,269\n34658,34659\n34660,366\n34661,34662\n34663,376\n34664,3069\n34665,81\n34666,34667\n34668,163\n34669,146\n34670,1515\n34671,304\n34672,34673\n34675,163\n34675,302\n34675,579\n34676,273\n34676,274\n34677,2351\n34678,2671\n34679,424\n34681,298\n34682,485\n34683,273\n34683,274\n34684,233\n34685,65\n34686,563\n34687,872\n34688,872\n34689,34690\n34691,106\n34691,192\n34691,202\n34691,252\n34691,318\n34691,333\n34691,439\n34691,663\n34691,920\n34691,1385\n34692,602\n34693,907\n34694,510\n34694,623\n34694,809\n34695,1590\n34696,586\n34697,818\n34698,34699\n34700,602\n34701,77\n34702,366\n34703,298\n34704,485\n34705,292\n34706,452\n34707,760\n34707,1631\n34708,663\n34708,664\n34709,79\n34709,481\n34709,3830\n34712,623\n34713,195\n34714,142473\n34715,452\n34716,1860\n34717,2178\n34717,4545\n34718,875\n34719,602\n34720,207\n34720,1133\n34721,1010\n34721,1298\n34721,1607\n34722,34723\n34722,66143\n34722,66202\n34722,66496\n34724,563\n34724,1740\n34725,389\n34726,77\n34726,862\n34727,620\n34728,158\n34728,251\n34728,318\n34728,337\n34728,465\n34728,516\n34728,586\n34728,1220\n34728,1222\n34728,1512\n34728,5992\n34728,6119\n34728,16201\n34729,647\n34730,344\n34731,336\n34732,326\n34732,873\n34733,34734\n34735,34734\n34736,34737\n34738,3\n34738,186\n34738,233\n34738,518\n34738,775\n34738,795\n34738,1326\n34738,1411\n34738,1715\n34738,3094\n34738,3804\n34738,4146\n34738,5130\n34739,518\n34739,4220\n34740,292\n34741,452\n34743,2775\n34744,447\n34745,272\n34746,726\n34748,306\n34748,307\n34749,21944\n34750,479\n34751,602\n34753,34754\n34755,452\n34756,222\n34757,2168\n34758,360\n34759,579\n34760,649\n34762,452\n34763,425\n34763,1276\n34764,920\n34764,1181\n34765,991\n34766,9457\n34767,1133\n34768,184\n34769,994\n34771,34772\n34773,106\n34773,168479\n34774,1082\n34775,287\n34775,433\n34776,3\n34778,588\n34778,590\n34778,718\n34778,805\n34778,1016\n34779,452\n34780,698\n34781,50\n34781,79\n34781,147\n34781,158\n34781,178\n34781,192\n34781,285\n34781,406\n34781,422\n34781,620\n34781,622\n34781,779\n34781,1515\n34781,1531\n34781,2931\n34781,4192\n34781,4193\n34782,1453\n34783,422\n34784,422\n34785,1323\n34786,102\n34787,1326\n34788,408\n34789,422\n34790,422\n34791,422\n34792,1\n34793,4805\n34794,422\n34795,79\n34796,3260\n34797,332\n34798,459\n34799,623\n34799,1805\n34800,171\n34801,697\n34802,452\n34803,34804\n34803,81877\n34803,84955\n34803,92347\n34803,97763\n34803,108722\n34803,110149\n34803,111969\n34806,184\n34807,171\n34808,693\n34809,772\n34810,1801\n34811,673\n34812,171\n34813,171\n34814,6750\n34816,3193\n34817,1001\n34818,137\n34819,392\n34820,104\n34820,217\n34820,264\n34820,289\n34820,290\n34820,1118\n34820,1298\n34820,1417\n34820,6695\n34821,58\n34822,46\n34824,1085\n34826,392\n34826,644\n34826,697\n34826,1363\n34827,1227\n34827,1229\n34828,4\n34828,5\n34828,68\n34828,200\n34828,442\n34828,636\n34828,805\n34828,1119\n34828,1962\n34828,2286\n34828,4220\n34830,1085\n34830,6068\n34831,158\n34832,1566\n34833,2421\n34834,2266\n34835,34836\n34837,34838\n34839,34838\n34840,34838\n34841,34838\n34842,34838\n34843,1001\n34843,1522\n34844,1082\n34845,264\n34845,1381\n34846,3\n34847,1149\n34848,640\n34849,536\n34850,79\n34850,310\n34850,3039\n34850,254384\n34851,623\n34851,1805\n34852,640\n34853,861\n34854,2253\n34854,13538\n34854,75912\n34855,2372\n34856,579\n34857,811\n34857,893\n34858,980\n34859,1688\n34860,1072\n34861,5366\n34862,275\n34863,313\n34864,83\n34864,536\n34864,843\n34864,7698\n34866,58\n34867,195\n34867,247\n34867,146952\n34868,704\n34869,310\n34870,392\n34870,623\n34870,919\n34870,1805\n34871,256\n34872,731\n34872,784\n34873,4453\n34874,298\n34874,1175\n34874,1392\n34874,1962\n34875,1012\n34875,2775\n34875,3846\n34875,6249\n34877,264\n34879,5\n34879,26\n34879,34\n34879,116\n34879,118\n34879,280\n34879,290\n34879,307\n34879,590\n34879,664\n34879,1222\n34879,1235\n34879,1253\n34879,1266\n34879,1462\n34879,1511\n34879,1512\n34879,1684\n34879,1893\n34879,1980\n34879,2178\n34879,2206\n34879,2210\n34879,2417\n34879,2868\n34879,2991\n34879,3247\n34879,3370\n34879,3794\n34879,4234\n34879,4866\n34879,5358\n34879,5359\n34879,8244\n34879,9031\n34879,17245\n34879,21736\n34879,32784\n34879,33424\n34879,36523\n34879,56150\n34879,58979\n34879,72439\n34879,92476\n34879,94134\n34879,106502\n34879,164572\n34879,182162\n34879,245910\n34880,1803\n34881,310\n34881,332\n34881,1001\n34881,1462\n34881,1893\n34881,4294\n34881,4355\n34881,7155\n34881,8537\n34881,27041\n34882,932\n34883,200\n34884,1983\n34885,485\n34885,493\n34886,34887\n34888,907\n34889,707\n34890,2775\n34891,447\n34892,118\n34892,4597\n34893,399\n34893,2775\n34894,346\n34895,9457\n34896,9121\n34897,10\n34898,481\n34900,287\n34901,918\n34902,34903\n34904,389\n34904,795\n34904,1072\n34905,586\n34906,509\n34906,510\n34906,1722\n34906,3538\n34907,302\n34908,34\n34908,35\n34908,251\n34908,1135\n34909,364\n34910,1313\n34911,1313\n34912,360\n34913,941\n34914,1326\n34915,16614\n34916,10\n34918,596\n34921,233\n34921,240\n34921,1085\n34922,50\n34922,424\n34922,1167\n34923,3161\n34924,644\n34925,151\n34926,192\n34927,775\n34929,217\n34929,240\n34929,592\n34929,1001\n34929,1818\n34931,850\n34932,192\n34933,1544\n34933,5662\n34934,1433\n34935,1096\n34935,1612\n34936,2051\n34937,2051\n34938,1332\n34939,602\n34940,579\n34941,209\n34941,302\n34941,579\n34941,811\n34941,893\n34942,2048\n34943,1385\n34944,602\n34945,994\n34946,298\n34947,827\n34948,3474\n34949,151\n34949,182\n34949,440\n34949,1844\n34950,63\n34951,104\n34951,134\n34951,200\n34951,248\n34951,372\n34951,431\n34951,631\n34951,636\n34951,795\n34951,1016\n34951,1332\n34951,81233\n34952,827\n34953,344\n34954,4453\n34955,1749\n34955,2605\n34956,158\n34957,309\n34958,577\n34958,21944\n34959,1544\n34960,83\n34960,240\n34961,9015\n34962,760\n34963,1133\n34963,2315\n34963,30331\n34964,2828\n34965,1715\n34966,717\n34967,827\n34968,188\n34969,718\n34970,2411\n34971,1172\n34972,32\n34972,392\n34972,697\n34972,3003\n34973,1082\n34975,217\n34975,818\n34976,1227\n34976,1229\n34976,21944\n34977,31977\n34979,97\n34980,140\n34981,5405\n34982,2436\n34983,1860\n34984,65\n34985,907\n34985,932\n34986,6208\n34986,6209\n34987,10\n34988,527\n34988,743\n34988,1983\n34988,8714\n34988,21059\n34988,64036\n34988,95152\n34989,336\n34990,296\n34990,991\n34992,718\n34993,299\n34994,1419\n34995,22924\n34996,302\n34996,623\n34997,3094\n34998,3209\n34999,79\n34999,147\n34999,516\n35000,50\n35000,79\n35000,1515\n35001,1072\n35002,818\n35003,718\n35005,2312\n35007,579\n35008,35009\n35010,35011\n35010,157870\n35012,1147\n35013,264\n35014,1313\n35015,178\n35016,3252\n35017,1893\n35018,2351\n35019,35020\n35021,1419\n35022,393\n35022,435\n35022,439\n35023,163\n35023,579\n35023,1556\n35024,158\n35024,252\n35024,41170\n35025,422\n35026,56\n35027,422\n35028,56\n35029,422\n35030,56\n35031,442\n35032,83\n35032,1467\n35033,35034\n35035,581\n35036,86\n35037,2116\n35038,107\n35039,312\n35039,510\n35039,575\n35039,875\n35040,356\n35041,158\n35042,83\n35042,577\n35042,622\n35042,1433\n35043,304\n35044,2411\n35045,192\n35046,301\n35046,615\n35046,968\n35046,5662\n35047,30\n35048,1572\n35049,1544\n35049,3207\n35050,298\n35051,485\n35052,389\n35053,1509\n35053,1551\n35053,3041\n35054,1893\n35054,2312\n35055,717\n35056,388\n35056,1363\n35057,1844\n35058,2995\n35059,704\n35060,309\n35061,15573\n35062,1082\n35063,442\n35064,1267\n35064,1659\n35064,1749\n35065,1010\n35065,1298\n35066,1082\n35067,3392\n35068,500\n35069,366\n35070,592\n35071,48\n35071,130\n35071,160\n35071,1132\n35071,1639\n35072,151\n35073,592\n35073,90358\n35074,195\n35075,873\n35076,35077\n35078,1082\n35079,119\n35080,83\n35080,247\n35080,1247\n35082,1294\n35083,604\n35084,1985\n35085,1433\n35086,35087\n35088,298\n35089,485\n35090,292\n35091,83\n35091,7698\n35093,919\n35094,911\n35094,1801\n35095,186\n35095,233\n35095,301\n35095,518\n35095,525\n35095,795\n35095,1235\n35095,1411\n35095,1715\n35095,3804\n35095,4146\n35095,21711\n35097,500\n35098,1962\n35099,1052\n35100,1882\n35101,2775\n35102,54\n35103,2210\n35103,4237\n35104,1082\n35105,251\n35105,920\n35106,1644\n35107,178\n35107,671\n35107,934\n35107,1033\n35107,1201\n35107,1238\n35107,1590\n35107,1612\n35107,1877\n35107,2353\n35107,6661\n35108,579\n35109,44\n35111,252\n35112,202\n35112,203\n35113,217\n35114,86\n35115,1579\n35116,1639\n35117,392\n35117,697\n35118,450\n35118,485\n35119,875\n35120,376\n35121,1639\n35122,1579\n35123,818\n35124,302\n35124,687\n35124,861\n35124,893\n35124,1556\n35125,99\n35126,1458\n35127,1673\n35128,557\n35129,250\n35130,652\n35131,136\n35132,2073\n35133,1082\n35134,3585\n35135,1010\n35136,422\n35137,56\n35138,3413\n35140,160\n35141,3135\n35142,1010\n35143,20\n35143,310\n35143,675\n35143,3039\n35144,302\n35144,1556\n35145,143\n35146,7360\n35147,1082\n35148,1177\n35148,2210\n35149,41\n35149,200\n35149,1368\n35150,225\n35151,1639\n35152,72\n35153,35154\n35155,206\n35156,344\n35157,640\n35158,21944\n35159,595\n35160,182\n35161,35162\n35164,188\n35165,258\n35166,5405\n35167,72\n35168,6263\n35169,483\n35170,9323\n35171,35172\n35173,35174\n35175,151\n35175,292\n35176,934\n35177,850\n35178,557\n35179,557\n35180,255\n35181,907\n35182,9323\n35183,1572\n35184,783\n35185,298\n35186,485\n35187,267\n35188,887\n35188,21944\n35189,35190\n35191,240\n35192,9011\n35192,9032\n35193,1140\n35193,5547\n35194,3769\n35195,188\n35196,3769\n35197,1707\n35198,25873\n35199,35200\n35201,3798\n35202,248\n35202,1149\n35202,1631\n35203,10\n35204,22\n35204,818\n35204,861\n35204,1012\n35204,15609\n35204,162599\n35205,1014\n35206,6051\n35207,8788\n35208,2351\n35209,171\n35210,6263\n35211,273\n35211,274\n35211,4611\n35212,1414\n35213,35214\n35216,35217\n35218,4\n35218,5\n35219,35220\n35221,2775\n35222,447\n35223,72\n35224,809\n35225,406\n35226,2048\n35227,1285\n35229,682\n35230,3138\n35232,14366\n35233,1001\n35234,1634\n35235,261\n35236,5440\n35237,211\n35238,72\n35239,1140\n35240,35241\n35242,143\n35243,35244\n35245,15573\n35246,35247\n35248,35249\n35250,35251\n35252,35253\n35254,72\n35256,72\n35257,640\n35258,104\n35261,682\n35262,1983\n35263,1634\n35264,66\n35265,147\n35265,158\n35266,515\n35266,647\n35266,1968\n35267,372\n35268,34\n35268,111\n35268,4193\n35269,35270\n35271,146\n35272,406\n35273,602\n35274,68\n35274,5547\n35274,35275\n35274,56794\n35274,62592\n35274,64980\n35274,68069\n35274,83023\n35274,83026\n35274,86832\n35274,92102\n35274,97311\n35274,104912\n35274,111915\n35274,114704\n35274,115142\n35274,115147\n35274,115575\n35274,123239\n35274,126271\n35274,129685\n35274,130007\n35274,132312\n35274,155540\n35274,157517\n35274,160164\n35274,182058\n35274,183078\n35274,199322\n35274,215027\n35274,217695\n35274,235537\n35274,236459\n35274,249128\n35274,250306\n35274,251125\n35276,1776\n35277,1133\n35278,467\n35278,872\n35278,1151\n35278,1893\n35279,35280\n35281,233\n35282,326\n35283,931\n35284,206\n35285,35286\n35287,35288\n35289,35289\n35290,298\n35291,485\n35292,5250\n35293,35294\n35295,346\n35296,918\n35297,48\n35297,130\n35297,340\n35297,360\n35297,489\n35297,1096\n35297,2209\n35297,4355\n35297,9457\n35298,4\n35298,5\n35299,7124\n35300,35301\n35300,53553\n35302,35303\n35304,240\n35304,1818\n35305,3451\n35305,3452\n35306,35307\n35308,2867\n35308,22880\n35309,455\n35309,1019\n35310,1659\n35310,2607\n35311,72\n35312,693\n35313,872\n35314,1\n35317,2351\n35318,104\n35318,323\n35318,479\n35318,991\n35318,9030\n35319,652\n35320,366\n35321,366\n35322,366\n35323,149\n35324,366\n35325,247\n35326,306\n35326,307\n35327,337\n35327,873\n35328,86\n35329,1551\n35329,1849\n35330,1509\n35331,34\n35331,35\n35331,347\n35331,356\n35331,873\n35332,640\n35333,640\n35334,640\n35335,107\n35335,467\n35336,192\n35336,406\n35339,1579\n35340,1639\n35341,579\n35342,720\n35343,1564\n35344,392\n35345,868\n35346,1082\n35349,2574\n35350,310\n35350,718\n35351,2173\n35352,34\n35352,35\n35352,313\n35352,399\n35352,536\n35352,657\n35352,2224\n35352,2646\n35352,2784\n35352,3252\n35352,6298\n35352,7092\n35352,7698\n35354,422\n35355,56\n35356,6880\n35357,2367\n35357,30331\n35358,718\n35359,447\n35361,1326\n35362,1323\n35363,102\n35364,1326\n35365,408\n35366,433\n35367,1769\n35369,298\n35370,485\n35371,760\n35371,1149\n35371,1631\n35371,1635\n35371,3069\n35372,298\n35373,485\n35374,1983\n35375,1143\n35375,1849\n35376,861\n35377,143\n35378,592\n35379,1849\n35380,589\n35381,1276\n35383,83\n35383,2784\n35384,358\n35386,875\n35387,1983\n35389,298\n35390,485\n35391,500\n35393,2048\n35394,762\n35394,1241\n35395,298\n35396,485\n35398,111\n35398,690\n35398,788\n35399,1227\n35399,1229\n35399,1252\n35399,1253\n35399,21944\n35400,328\n35400,693\n35401,392\n35401,509\n35402,441\n35402,760\n35402,1973\n35402,2443\n35403,292\n35404,1579\n35405,298\n35407,485\n35408,289\n35408,290\n35409,1453\n35410,33298\n35411,33298\n35412,1474\n35413,137\n35413,163\n35414,389\n35415,972\n35415,973\n35416,760\n35417,10\n35418,422\n35419,422\n35420,422\n35421,422\n35422,422\n35423,422\n35424,422\n35425,422\n35426,422\n35427,422\n35428,356\n35428,1955\n35428,4222\n35430,163\n35431,1707\n35431,20004\n35432,1227\n35432,1229\n35433,292\n35434,273\n35434,274\n35434,66754\n35435,314\n35435,467\n35435,868\n35435,1433\n35435,1722\n35436,358\n35437,298\n35438,485\n35439,602\n35439,1582\n35439,2244\n35439,2867\n35439,2868\n35439,30331\n35439,35439\n35439,42064\n35439,80266\n35440,704\n35440,991\n35440,13538\n35441,647\n35442,344\n35443,932\n35444,433\n35445,1167\n35446,272\n35448,298\n35449,485\n35450,264\n35450,1381\n35450,1509\n35451,349\n35452,1836\n35452,13361\n35453,481\n35455,850\n35457,1010\n35457,1363\n35458,589\n35459,292\n35460,178\n35460,287\n35461,644\n35462,34\n35462,35\n35462,1313\n35463,1506\n35464,34\n35464,120\n35464,140\n35464,349\n35464,389\n35464,392\n35464,433\n35464,623\n35464,818\n35464,1133\n35464,1274\n35464,1805\n35464,6726\n35465,392\n35466,298\n35467,485\n35469,358\n35470,358\n35470,408\n35470,581\n35470,1082\n35470,1113\n35470,1298\n35471,850\n35472,292\n35474,1715\n35475,63\n35475,503\n35478,292\n35479,2867\n35479,2868\n35479,22880\n35481,392\n35482,298\n35483,1010\n35483,1122\n35484,1082\n35485,424\n35486,259\n35486,272\n35486,393\n35486,685\n35486,726\n35486,788\n35486,859\n35486,911\n35486,980\n35486,1070\n35486,1388\n35486,2085\n35486,4611\n35486,21159\n35486,26420\n35486,28377\n35486,29532\n35486,38857\n35486,84600\n35486,92967\n35486,109644\n35486,120155\n35486,125579\n35486,133585\n35486,139952\n35486,142776\n35486,143983\n35486,169377\n35486,177561\n35486,192522\n35486,199887\n35486,219916\n35486,224030\n35486,229868\n35486,249063\n35488,298\n35489,485\n35490,149\n35491,907\n35491,932\n35492,21944\n35493,147\n35493,158\n35494,10\n35494,77\n35494,97\n35494,217\n35494,222\n35494,313\n35494,420\n35494,784\n35494,973\n35494,1118\n35494,1345\n35494,1572\n35494,1722\n35494,1844\n35494,2073\n35494,2146\n35494,2274\n35494,2574\n35494,3295\n35494,3297\n35494,4039\n35494,4831\n35494,5212\n35494,5375\n35494,8270\n35494,9024\n35494,13910\n35494,27550\n35494,99287\n35496,1274\n35497,285\n35497,346\n35497,403\n35497,994\n35497,1085\n35497,2416\n35497,2417\n35497,3695\n35497,20004\n35498,671\n35499,192\n35500,431\n35500,631\n35502,247\n35503,693\n35504,217\n35507,298\n35508,485\n35509,850\n35510,2674\n35510,16153\n35511,850\n35512,240\n35512,818\n35513,1151\n35513,4252\n35514,7757\n35515,302\n35515,703\n35515,893\n35515,2116\n35515,3769\n35516,579\n35517,563\n35518,50\n35518,1515\n35519,595\n35519,932\n35519,1579\n35519,3538\n35520,850\n35522,1983\n35523,907\n35523,932\n35525,292\n35526,861\n35526,81679\n35526,186779\n35528,760\n35528,1631\n35529,19986\n35530,104\n35530,136\n35530,248\n35530,557\n35530,1368\n35532,623\n35532,809\n35532,1836\n35533,298\n35534,485\n35535,233\n35535,503\n35535,631\n35535,1085\n35535,2205\n35535,2206\n35535,33424\n35535,245910\n35540,7\n35542,46\n35542,301\n35543,126\n35543,467\n35543,872\n35543,1151\n35543,49057\n35544,28130\n35545,186\n35545,459\n35545,1849\n35545,3207\n35545,32784\n35546,261\n35546,389\n35546,660\n35546,1419\n35546,1466\n35546,6506\n35547,1001\n35548,248\n35549,50\n35549,146\n35549,314\n35549,779\n35549,92476\n35550,390\n35551,8714\n35552,2443\n35552,2626\n35553,718\n35554,298\n35555,485\n35556,9195\n35558,861\n35559,3246\n35559,3247\n35560,171\n35561,336\n35561,783\n35561,1363\n35561,27041\n35561,75912\n35561,118336\n35562,1465\n35563,206\n35564,298\n35565,485\n35566,2210\n35566,4237\n35568,784\n35569,623\n35570,118\n35570,4597\n35572,435\n35572,538\n35572,1374\n35573,827\n35574,151\n35574,366\n35574,2607\n35576,623\n35576,1805\n35577,99\n35577,682\n35577,72439\n35578,1392\n35579,298\n35580,485\n35581,79\n35581,515\n35581,861\n35581,3209\n35582,644\n35583,2506\n35584,2506\n35585,271\n35586,1052\n35587,2701\n35590,285\n35590,28130\n35592,15179\n35593,980\n35594,1805\n35595,406\n35596,250\n35596,887\n35596,1684\n35597,1133\n35598,186\n35598,972\n35598,6837\n35599,209\n35599,579\n35600,425\n35600,1276\n35601,72\n35602,143\n35603,10\n35603,113156\n35604,2775\n35605,447\n35606,217\n35606,872\n35606,1118\n35606,1796\n35607,493\n35608,1454\n35609,19010\n35610,422\n35611,56\n35612,240\n35613,217\n35613,240\n35613,372\n35613,920\n35613,1287\n35614,47\n35614,104\n35614,147\n35614,192\n35614,264\n35614,289\n35614,290\n35614,298\n35614,503\n35614,557\n35614,1149\n35614,1458\n35614,1955\n35614,2244\n35614,2469\n35614,94134\n35615,1579\n35615,1955\n35616,149\n35616,406\n35617,422\n35618,56\n35619,389\n35620,818\n35621,1388\n35622,1707\n35623,285\n35623,779\n35623,972\n35623,973\n35623,68069\n35623,118336\n35623,141912\n35624,872\n35624,127158\n35625,557\n35625,852\n35626,143\n35627,2319\n35628,178\n35629,422\n35630,56\n35631,192\n35632,972\n35632,35655\n35632,36802\n35632,36803\n35633,269\n35634,649\n35635,972\n35635,3804\n35635,35659\n35635,36657\n35635,36658\n35636,439\n35636,510\n35636,622\n35637,72\n35638,1556\n35639,158\n35640,87\n35641,35642\n35643,147\n35644,557\n35645,35646\n35647,4\n35647,5\n35649,422\n35650,56\n35651,875\n35652,35653\n35652,66984\n35656,151\n35657,26\n35657,59\n35657,79\n35657,1844\n35660,628\n35661,393\n35661,447\n35661,1033\n35662,500\n35663,366\n35664,557\n35665,158\n35665,333\n35665,406\n35666,287\n35667,640\n35668,192\n35668,252\n35668,287\n35668,333\n35668,435\n35668,809\n35668,1220\n35668,1222\n35668,1243\n35668,6119\n35668,15573\n35668,19010\n35669,1220\n35669,1222\n35670,252\n35671,251\n35672,65\n35672,158\n35672,163\n35672,217\n35672,287\n35672,302\n35672,383\n35672,392\n35672,406\n35672,439\n35672,467\n35672,687\n35672,697\n35672,818\n35672,861\n35672,872\n35672,1010\n35672,1140\n35672,1370\n35672,1659\n35672,1722\n35672,1836\n35672,1837\n35672,2671\n35672,3260\n35672,3804\n35672,189839\n35673,35674\n35675,35674\n35676,1143\n35677,87\n35677,1151\n35677,1240\n35677,1454\n35678,44\n35679,63\n35680,30331\n35681,35682\n35683,264\n35685,225\n35685,248\n35686,35687\n35688,34\n35688,35\n35690,388\n35692,66\n35692,247\n35693,151\n35695,222\n35695,1467\n35696,850\n35697,1179\n35698,433\n35699,7\n35700,1247\n35701,267\n35702,406\n35703,200\n35704,233\n35704,775\n35704,2045\n35705,1188\n35706,1844\n35707,9195\n35708,784\n35709,887\n35709,1235\n35709,1335\n35710,3538\n35711,35712\n35713,255\n35714,34\n35714,35\n35714,775\n35714,2209\n35715,1082\n35716,33298\n35717,557\n35718,35719\n35720,586\n35720,1590\n35721,111\n35722,1151\n35722,1836\n35723,1370\n35723,21736\n35724,1082\n35725,604\n35726,424\n35727,83\n35727,2779\n35728,379\n35729,187\n35730,366\n35730,500\n35730,718\n35732,660\n35732,784\n35732,2424\n35732,2944\n35732,6506\n35733,1179\n35733,4252\n35733,8541\n35733,16687\n35734,58\n35735,704\n35736,605\n35737,605\n35738,2334\n35739,333\n35740,1707\n35741,8788\n35742,1860\n35743,2351\n35744,26251\n35745,1803\n35746,809\n35747,733\n35748,147\n35749,35750\n35749,35751\n35751,65\n35751,1983\n35752,1309\n35753,93\n35753,94\n35754,424\n35755,9560\n35756,1188\n35757,240\n35758,717\n35759,287\n35760,35761\n35763,1122\n35764,305\n35765,269\n35766,4101\n35767,3003\n35768,3069\n35769,4980\n35770,489\n35771,1082\n35772,160\n35772,872\n35772,1659\n35773,1309\n35774,704\n35775,94\n35775,175\n35775,251\n35775,704\n35775,2782\n35775,2787\n35775,48955\n35776,146\n35777,557\n35778,557\n35779,557\n35780,8719\n35781,138\n35782,865\n35783,557\n35784,137\n35785,35786\n35787,21944\n35788,118\n35788,4597\n35789,8719\n35790,138\n35791,865\n35792,557\n35793,137\n35794,21944\n35795,8719\n35796,138\n35797,865\n35798,557\n35799,137\n35800,21944\n35801,118\n35801,4597\n35803,8719\n35804,138\n35805,865\n35806,557\n35807,137\n35808,118\n35808,4597\n35809,21944\n35810,5440\n35811,1392\n35812,30\n35813,1479\n35814,171\n35815,3413\n35816,557\n35817,8719\n35818,138\n35819,865\n35820,557\n35821,137\n35822,35823\n35824,118\n35824,4597\n35825,21944\n35826,261\n35827,118\n35827,4597\n35828,1033\n35828,2051\n35829,13919\n35830,252\n35831,389\n35831,1072\n35832,35833\n35834,35835\n35836,758\n35837,99\n35838,211\n35839,3069\n35840,35841\n35843,25929\n35844,50\n35844,1512\n35844,5992\n35845,35846\n35847,5\n35847,117\n35847,1001\n35847,2089\n35847,2940\n35847,8719\n35847,9386\n35847,21944\n35847,37794\n35848,4611\n35849,1544\n35850,35851\n35852,1773\n35853,160\n35854,3069\n35855,240\n35855,301\n35855,818\n35856,35857\n35858,35859\n35860,35861\n35862,1414\n35863,1082\n35864,10\n35865,1313\n35866,704\n35867,35868\n35869,3161\n35870,35871\n35872,8598\n35873,83\n35874,35875\n35876,3069\n35877,22727\n35878,483\n35879,309\n35880,35881\n35882,422\n35883,422\n35884,422\n35885,422\n35886,422\n35887,422\n35888,422\n35889,422\n35890,1414\n35891,167\n35891,3138\n35892,2351\n35893,10\n35894,217\n35895,1118\n35895,1419\n35895,3507\n35896,809\n35897,35898\n35899,536\n35900,784\n35901,346\n35902,704\n35903,72\n35904,35905\n35906,233\n35907,366\n35908,366\n35909,366\n35910,366\n35911,35912\n35913,1572\n35914,1381\n35915,1849\n35915,32784\n35916,35917\n35916,37213\n35916,46671\n35916,47315\n35916,49812\n35916,56026\n35916,60217\n35916,85292\n35916,98606\n35918,35919\n35920,8884\n35921,2292\n35922,1085\n35923,158\n35924,35925\n35926,35927\n35928,192\n35929,50\n35930,273\n35930,274\n35931,79\n35932,222\n35933,640\n35934,35935\n35936,452\n35937,104\n35938,17334\n35939,35940\n35941,579\n35943,452\n35944,452\n35945,1082\n35946,158\n35946,592\n35946,779\n35946,2371\n35946,49057\n35946,117163\n35946,191860\n35947,225\n35948,186\n35948,518\n35948,1326\n35948,1849\n35949,310\n35950,452\n35951,35952\n35953,306\n35953,307\n35954,207\n35955,452\n35957,452\n35958,2750\n35959,809\n35959,19010\n35960,137\n35961,261\n35962,171\n35963,217\n35964,1323\n35965,102\n35966,1326\n35967,408\n35969,35970\n35969,45151\n35969,46407\n35969,49606\n35969,52490\n35969,58177\n35971,640\n35972,424\n35974,143\n35974,1052\n35975,1033\n35976,264\n35977,26\n35977,59\n35978,3367\n35979,9195\n35980,35981\n35980,59656\n35980,68069\n35980,120455\n35982,818\n35983,10\n35983,35984\n35983,264982\n35985,433\n35986,676\n35987,1082\n35988,1118\n35989,893\n35990,1247\n35990,1644\n35990,1844\n35991,35992\n35991,43053\n35991,68069\n35993,35994\n35995,35996\n35997,1231\n35998,850\n35999,41\n36001,36002\n36003,433\n36003,1634\n36004,18726\n36005,36006\n36007,3467\n36008,192\n36008,663\n36009,130\n36009,1551\n36010,72\n36011,344\n36012,285\n36014,158\n36015,1085\n36015,6068\n36016,1707\n36017,267\n36018,158\n36019,1860\n36020,843\n36021,1117\n36022,36023\n36024,44\n36025,312\n36026,640\n36027,36028\n36029,333\n36030,4604\n36031,875\n36032,920\n36033,1231\n36034,68\n36035,1082\n36036,86\n36037,1033\n36038,6682\n36039,97\n36040,36041\n36040,93398\n36042,83\n36042,217\n36042,222\n36043,4611\n36044,1544\n36045,481\n36046,158\n36046,406\n36047,818\n36048,269\n36049,200\n36050,41\n36051,1235\n36051,1335\n36052,1181\n36053,2574\n36054,406\n36054,779\n36054,1515\n36054,4192\n36054,4193\n36055,187\n36056,192\n36057,1082\n36058,1381\n36059,3161\n36060,743\n36061,346\n36062,861\n36063,1082\n36064,36065\n36064,61120\n36066,21944\n36067,126\n36068,258\n36070,1072\n36071,93\n36071,94\n36072,149\n36073,250\n36074,36075\n36076,1893\n36076,36077\n36076,55953\n36076,77145\n36078,841\n36079,1634\n36080,207\n36081,31896\n36082,50\n36082,406\n36083,255\n36084,1479\n36085,36086\n36087,264\n36087,1147\n36087,16687\n36088,36089\n36090,36089\n36091,1082\n36092,36093\n36095,36096\n36097,4453\n36098,36099\n36100,663\n36100,664\n36101,36102\n36103,1419\n36105,850\n36106,36107\n36108,36109\n36110,275\n36111,4190\n36112,422\n36113,56\n36114,1433\n36115,2244\n36116,3653\n36117,2617\n36118,346\n36119,36120\n36121,3370\n36121,14453\n36122,2048\n36123,704\n36124,623\n36124,1805\n36125,4611\n36126,1544\n36127,1893\n36128,1085\n36129,346\n36130,805\n36131,640\n36132,97\n36133,784\n36134,72\n36136,3069\n36137,292\n36138,346\n36139,406\n36139,4192\n36139,4193\n36140,36141\n36142,36143\n36142,80312\n36142,100097\n36144,36145\n36146,309\n36146,310\n36147,3246\n36147,3247\n36148,36149\n36150,36151\n36152,233\n36153,36154\n36155,779\n36155,2244\n36156,107\n36157,2416\n36157,2417\n36158,292\n36159,2351\n36160,338\n36161,298\n36162,1133\n36163,3538\n36164,779\n36165,652\n36166,872\n36167,41\n36167,58669\n36167,60021\n36168,631\n36169,1247\n36169,1644\n36169,1844\n36170,1893\n36171,3\n36171,509\n36171,510\n36172,44\n36173,872\n36174,872\n36175,2574\n36176,872\n36177,743\n36178,200\n36179,301\n36179,305\n36179,516\n36179,1298\n36179,1837\n36179,3193\n36180,36181\n36182,516\n36183,406\n36184,818\n36185,4220\n36185,65140\n36186,2048\n36187,250\n36187,1684\n36188,602\n36189,83\n36190,4611\n36191,1544\n36192,3\n36193,640\n36194,72\n36195,452\n36196,493\n36196,516\n36196,1243\n36197,1955\n36198,178\n36199,602\n36200,452\n36201,452\n36202,147\n36203,72\n36204,36205\n36206,72\n36207,452\n36208,366\n36209,72\n36210,366\n36211,126\n36212,4611\n36213,1544\n36214,72\n36215,1052\n36215,2989\n36215,2991\n36216,452\n36217,72\n36218,920\n36219,609\n36220,3161\n36221,1265\n36221,1266\n36222,3069\n36223,1968\n36224,3321\n36225,333\n36226,1313\n36227,130\n36227,515\n36227,736\n36227,1132\n36227,1381\n36227,1639\n36227,3695\n36228,264\n36229,5440\n36230,1052\n36231,433\n36232,1659\n36233,1773\n36234,250\n36235,1639\n36236,931\n36237,10\n36237,149\n36237,175\n36238,44\n36239,3524\n36240,1116\n36241,301\n36241,615\n36241,968\n36241,1939\n36241,5662\n36242,255\n36243,275\n36244,775\n36245,805\n36245,1078\n36245,3585\n36246,483\n36247,13\n36248,305\n36248,5101\n36248,31977\n36249,273\n36249,274\n36250,431\n36250,784\n36250,4220\n36250,4222\n36251,1893\n36253,6298\n36254,93\n36254,94\n36255,240\n36256,366\n36256,760\n36256,1149\n36256,1631\n36257,575\n36257,1122\n36257,1257\n36257,1429\n36257,3115\n36257,6059\n36259,1010\n36260,2073\n36261,36262\n36263,1860\n36264,36265\n36266,393\n36266,36267\n36268,1227\n36268,1229\n36268,86416\n36270,36271\n36272,304\n36273,425\n36273,583\n36273,690\n36273,1805\n36274,34\n36274,35\n36275,328\n36276,2244\n36277,1860\n36278,431\n36278,1252\n36278,1253\n36280,333\n36280,1181\n36281,298\n36282,485\n36283,36284\n36285,298\n36286,485\n36287,298\n36288,485\n36289,1227\n36289,1229\n36290,72\n36291,4060\n36292,36293\n36294,2775\n36295,192\n36295,202\n36295,203\n36295,422\n36295,516\n36296,718\n36297,192\n36298,44\n36299,1860\n36300,805\n36300,3538\n36301,310\n36302,704\n36303,718\n36304,1298\n36306,6891\n36307,312\n36308,222\n36309,5906\n36310,557\n36311,626\n36312,278\n36313,137\n36314,36315\n36316,862\n36317,5906\n36318,557\n36319,626\n36320,278\n36321,137\n36322,862\n36323,557\n36324,557\n36325,557\n36326,557\n36327,862\n36328,36329\n36330,652\n36331,805\n36331,5212\n36333,15807\n36334,252\n36335,415\n36335,2989\n36335,2991\n36335,13361\n36336,704\n36337,3538\n36338,379\n36339,298\n36340,485\n36341,36342\n36343,298\n36344,485\n36346,36347\n36348,36349\n36350,596\n36350,1907\n36351,5366\n36352,1204\n36353,1\n36353,58\n36353,107\n36353,289\n36353,290\n36353,647\n36353,994\n36353,1353\n36353,1425\n36353,30331\n36353,144988\n36354,36355\n36354,199220\n36357,192\n36357,663\n36357,664\n36358,745\n36358,1677\n36358,2915\n36358,3089\n36359,36360\n36361,219\n36361,358\n36362,36363\n36364,973\n36365,602\n36366,602\n36367,602\n36368,2590\n36369,296\n36370,50\n36370,99\n36371,36372\n36373,285\n36373,406\n36373,1515\n36374,602\n36375,885\n36376,1124\n36377,36378\n36379,849\n36379,2310\n36380,36380\n36381,65\n36382,447\n36383,447\n36385,4611\n36386,1544\n36387,36388\n36389,1238\n36390,1452\n36391,147\n36392,10\n36393,36394\n36395,36396\n36397,36398\n36398,586\n36398,2782\n36398,36397\n36399,1309\n36400,36401\n36402,52\n36402,175\n36402,1773\n36403,36404\n36405,36406\n36407,875\n36411,50\n36411,56\n36411,79\n36411,146\n36411,147\n36411,158\n36411,192\n36411,195\n36411,206\n36411,333\n36411,406\n36411,422\n36411,585\n36411,602\n36411,620\n36411,622\n36411,640\n36411,779\n36411,1181\n36411,1515\n36411,2244\n36411,2931\n36411,5874\n36411,6119\n36411,23783\n36411,30331\n36411,60576\n36411,92476\n36417,56\n36417,192\n36417,1181\n36417,30331\n36421,192\n36421,240\n36421,264\n36421,301\n36421,309\n36421,310\n36421,392\n36421,931\n36421,1531\n36421,1634\n36421,2312\n36425,1551\n36435,192\n36435,931\n36435,30331\n36436,1\n36436,99\n36436,147\n36437,1907\n36439,1175\n36440,1907\n36442,56724\n36443,195\n36444,663\n36444,664\n36451,195\n36457,192\n36459,195\n36459,438\n36459,5101\n36465,1907\n36469,56\n36476,195\n36476,86479\n36478,609\n36479,86479\n36480,718\n36482,1631\n36483,41\n36483,120\n36483,261\n36483,332\n36483,694\n36483,1353\n36483,1608\n36483,3115\n36483,6068\n36483,32751\n36485,406\n36490,1893\n36490,7155\n36492,195\n36492,1639\n36494,158\n36494,195\n36505,1907\n36506,994\n36507,158\n36507,893\n36507,994\n36507,1983\n36511,1907\n36512,56\n36512,158\n36512,192\n36512,406\n36512,422\n36512,779\n36512,1149\n36512,1181\n36512,1370\n36512,18638\n36512,92476\n36512,127158\n36514,1907\n36523,10\n36523,158\n36523,217\n36523,406\n36523,36523\n36523,235790\n36525,1907\n36528,195\n36528,30418\n36528,86479\n36532,269\n36532,1181\n36532,69585\n36534,50\n36534,337\n36534,103698\n36535,622\n36535,1515\n36541,1844\n36544,195\n36551,1749\n36554,1572\n36555,195\n36555,86479\n36558,195\n36558,718\n36560,994\n36563,467\n36563,1782\n36565,195\n36565,1181\n36567,292\n36568,294\n36569,296\n36570,298\n36571,704\n36572,704\n36573,36574\n36575,36574\n36576,36574\n36577,310\n36579,36580\n36581,1001\n36582,366\n36583,366\n36584,366\n36585,240\n36585,1082\n36585,1807\n36585,1955\n36585,2775\n36586,328\n36587,36588\n36589,372\n36589,509\n36589,932\n36589,1082\n36589,1122\n36589,1241\n36589,1282\n36589,1479\n36589,1522\n36589,1849\n36589,2480\n36590,328\n36590,1052\n36591,509\n36591,510\n36593,2178\n36593,4545\n36594,278\n36594,13137\n36595,1019\n36596,406\n36597,2178\n36597,4545\n36597,56150\n36597,139010\n36598,805\n36599,862\n36600,1467\n36602,106\n36602,518\n36603,32\n36603,3999\n36603,7155\n36603,18810\n36604,346\n36605,72\n36606,843\n36608,1058\n36608,8149\n36609,36610\n36611,337\n36612,31977\n36613,4611\n36614,298\n36615,485\n36616,663\n36616,664\n36617,726\n36619,298\n36620,485\n36621,298\n36622,485\n36623,602\n36624,298\n36625,485\n36626,222\n36626,1474\n36627,304\n36628,1363\n36629,1433\n36630,718\n36631,255\n36632,328\n36635,1085\n36636,647\n36636,1276\n36636,2744\n36637,47\n36637,248\n36637,1235\n36637,1332\n36637,1335\n36637,2469\n36638,298\n36639,485\n36640,298\n36641,485\n36642,827\n36644,306\n36644,307\n36645,604\n36645,1392\n36646,534\n36647,784\n36648,5101\n36649,58\n36650,46\n36651,868\n36653,439\n36654,79\n36655,1673\n36659,35635\n36660,1181\n36660,4933\n36660,8244\n36660,9394\n36660,36458\n36660,36517\n36660,43612\n36660,45683\n36660,92476\n36661,424\n36663,298\n36664,485\n36665,980\n36665,1400\n36666,298\n36666,1955\n36667,206\n36668,298\n36669,485\n36670,1298\n36672,652\n36673,1454\n36677,2607\n36678,615\n36678,852\n36680,718\n36680,931\n36681,3756\n36681,5662\n36682,571\n36682,868\n36684,1544\n36685,1319\n36687,907\n36687,1284\n36688,640\n36689,640\n36690,640\n36691,240\n36691,372\n36691,932\n36691,1001\n36691,1241\n36691,1479\n36691,1849\n36692,222\n36693,640\n36695,640\n36697,640\n36698,1544\n36699,2224\n36700,893\n36701,1544\n36702,452\n36703,1247\n36704,184\n36705,1544\n36706,704\n36707,704\n36708,79\n36708,485\n36708,827\n36708,994\n36708,1639\n36709,5213\n36710,72\n36711,333\n36711,1893\n36712,510\n36713,1033\n36714,652\n36715,422\n36716,349\n36717,1860\n36718,1707\n36719,1955\n36720,349\n36720,509\n36720,875\n36720,907\n36720,1117\n36720,2191\n36720,3260\n36720,3367\n36720,4760\n36720,5540\n36721,58\n36721,87\n36721,1140\n36721,1454\n36721,5547\n36722,72\n36723,1188\n36724,178\n36725,36726\n36728,1359\n36730,510\n36731,4998\n36731,29433\n36731,86677\n36732,697\n36732,1769\n36733,272\n36734,868\n36735,360\n36736,217\n36736,301\n36736,1796\n36736,3804\n36737,15573\n36738,849\n36739,36740\n36742,18726\n36743,81\n36744,1227\n36744,1229\n36745,567\n36745,1436\n36745,2557\n36746,422\n36747,102\n36747,442\n36747,563\n36747,595\n36747,1188\n36747,1285\n36747,2782\n36748,21944\n36748,36749\n36748,36753\n36750,21442\n36751,68\n36751,1381\n36752,6627\n36754,360\n36754,2617\n36754,2784\n36755,19\n36755,77\n36755,379\n36755,657\n36755,1274\n36755,1984\n36755,3413\n36755,7768\n36755,75912\n36756,34\n36756,35\n36757,1143\n36757,2367\n36758,1639\n36759,592\n36760,147\n36761,175\n36761,589\n36761,1085\n36761,25402\n36761,29263\n36761,30328\n36761,31462\n36761,33338\n36761,33764\n36761,41253\n36761,42810\n36761,54452\n36761,54948\n36761,58532\n36761,63699\n36761,75223\n36761,75281\n36762,872\n36763,872\n36764,872\n36765,872\n36766,872\n36767,872\n36768,872\n36769,872\n36770,872\n36771,872\n36772,872\n36773,356\n36773,3003\n36774,442\n36775,872\n36776,312\n36777,801\n36778,1177\n36779,252\n36780,626\n36781,1454\n36782,79\n36783,333\n36784,877\n36785,163\n36785,209\n36785,579\n36785,6303\n36786,439\n36787,1556\n36788,586\n36788,784\n36788,1262\n36788,1332\n36788,1572\n36788,2701\n36789,571\n36790,433\n36791,3695\n36792,1564\n36793,1082\n36794,676\n36795,760\n36797,48\n36797,704\n36798,1707\n36799,217\n36800,932\n36801,592\n36804,35632\n36804,51002\n36804,81615\n36804,96937\n36804,108365\n36805,1284\n36805,35632\n36806,1267\n36806,1579\n36806,1893\n36806,2051\n36808,1707\n36809,440\n36810,2929\n36811,5547\n36812,626\n36813,34\n36813,35\n36813,120\n36813,222\n36813,389\n36813,455\n36813,657\n36813,32751\n36813,33508\n36814,21944\n36815,536\n36816,136\n36816,137\n36817,298\n36818,485\n36819,1212\n36819,1663\n36819,2253\n36820,1118\n36822,328\n36822,1179\n36823,66\n36823,868\n36824,2048\n36825,1127\n36826,298\n36827,485\n36828,3\n36829,1608\n36830,8270\n36832,859\n36833,631\n36833,968\n36834,536\n36835,1181\n36836,349\n36837,874\n36837,1133\n36838,628\n36839,264\n36839,872\n36840,1849\n36840,32784\n36841,111\n36841,609\n36841,2315\n36841,2775\n36841,3538\n36841,4771\n36842,83\n36843,2944\n36844,1220\n36844,1222\n36845,252\n36846,251\n36847,83\n36848,83\n36850,313\n36851,772\n36851,1332\n36852,1977\n36852,1978\n36853,178\n36854,160\n36856,18726\n36858,19\n36861,3695\n36862,1140\n36863,422\n36864,215\n36865,227\n36866,2701\n36867,328\n36868,1016\n36869,1849\n36870,1010\n36871,1722\n36872,801\n36873,358\n36874,383\n36875,111\n36876,1052\n36877,3538\n36878,2443\n36879,1332\n36880,72\n36881,1939\n36882,248\n36883,3193\n36884,525\n36885,1001\n36886,1564\n36887,1882\n36888,1177\n36889,1955\n36890,850\n36891,9001\n36892,1282\n36893,1821\n36894,1837\n36895,714\n36896,136\n36897,312\n36898,9029\n36899,1572\n36900,4771\n36901,1531\n36902,1745\n36903,3474\n36904,1977\n36904,1978\n36905,7270\n36906,104\n36907,3804\n36908,795\n36909,5405\n36910,640\n36910,1132\n36910,1181\n36911,2590\n36912,920\n36913,30\n36913,200\n36913,248\n36913,772\n36914,885\n36915,346\n36915,447\n36915,934\n36915,1590\n36916,1707\n36917,1016\n36918,2191\n36919,251\n36920,433\n36920,467\n36920,162599\n36921,298\n36922,485\n36923,2353\n36924,693\n36926,298\n36927,485\n36928,462\n36928,473\n36928,491\n36928,827\n36928,1172\n36929,171\n36930,7652\n36932,2244\n36933,1860\n36934,835\n36935,10\n36936,31976\n36937,259\n36938,2367\n36939,134\n36939,609\n36939,1359\n36939,1882\n36940,30428\n36941,1210\n36942,1276\n36943,58\n36944,46\n36945,36946\n36947,182\n36947,206\n36947,1227\n36947,86416\n36948,907\n36949,32\n36949,1313\n36950,687\n36950,1556\n36950,1836\n36953,298\n36954,134\n36954,332\n36955,3218\n36956,349\n36957,3\n36957,37\n36957,589\n36957,605\n36958,1001\n36958,1368\n36959,3089\n36960,2574\n36962,2828\n36963,2310\n36964,72\n36965,579\n36966,1127\n36967,252\n36967,318\n36967,1220\n36967,1222\n36967,41170\n36968,493\n36969,289\n36969,392\n36969,577\n36969,1001\n36969,1070\n36969,1289\n36969,1326\n36969,1462\n36969,8537\n36969,94134\n36970,312\n36971,868\n36972,14434\n36973,920\n36973,1623\n36974,575\n36975,273\n36975,2089\n36975,2940\n36975,21944\n36976,36977\n36978,217\n36978,1417\n36979,2244\n36980,222\n36981,240\n36981,518\n36981,18738\n36982,392\n36982,1590\n36983,885\n36984,340\n36985,140\n36986,2017\n36986,17309\n36988,301\n36988,968\n36988,189303\n36990,264\n36990,1509\n36990,1551\n36991,861\n36993,10\n36994,1836\n36996,247\n36998,178\n37000,209\n37000,302\n37000,893\n37000,1556\n37001,433\n37002,1289\n37003,3209\n37004,1433\n37005,5213\n37006,4\n37006,5\n37007,3451\n37007,3452\n37008,390\n37009,65\n37010,5213\n37011,17590\n37012,160\n37013,17593\n37014,37015\n37016,1465\n37017,247\n37018,5213\n37019,1227\n37019,1229\n37019,21944\n37019,86416\n37020,1782\n37021,1860\n37022,690\n37023,743\n37024,1381\n37025,338\n37026,779\n37027,1381\n37027,1509\n37028,1623\n37029,302\n37030,130\n37030,264\n37030,626\n37030,1127\n37030,1381\n37030,1509\n37030,1893\n37031,1227\n37031,1229\n37031,86416\n37032,206\n37032,2837\n37033,252\n37033,516\n37033,1220\n37033,1222\n37033,41170\n37034,252\n37034,1243\n37035,442\n37035,749\n37036,79\n37037,338\n37038,111\n37039,809\n37040,264\n37040,1381\n37040,1509\n37040,1893\n37041,483\n37042,186\n37042,450\n37042,615\n37042,1400\n37042,1449\n37042,19488\n37043,338\n37044,298\n37045,485\n37046,338\n37047,605\n37048,660\n37049,932\n37050,1506\n37051,99\n37052,1381\n37053,37054\n37055,54\n37056,467\n37056,872\n37057,187\n37058,356\n37059,195\n37060,34\n37060,35\n37060,83\n37060,313\n37060,1240\n37061,37\n37062,707\n37063,104\n37063,200\n37064,264\n37064,1381\n37066,151\n37067,66\n37067,818\n37069,772\n37070,996\n37071,247\n37072,631\n37073,151\n37073,202\n37073,203\n37073,536\n37073,599\n37073,736\n37073,843\n37073,849\n37073,852\n37073,1844\n37073,2073\n37073,2310\n37073,3345\n37074,178\n37075,258\n37076,1257\n37077,1634\n37078,406\n37078,1181\n37079,355\n37080,83\n37081,1381\n37082,1082\n37083,158\n37084,225\n37085,83\n37085,285\n37085,2779\n37085,2784\n37087,37088\n37088,8\n37088,19\n37088,54\n37088,222\n37088,278\n37088,283\n37088,379\n37088,385\n37088,408\n37088,439\n37088,455\n37088,1871\n37088,2159\n37088,2290\n37088,2421\n37088,2424\n37088,3758\n37088,3792\n37088,4166\n37088,6667\n37088,6789\n37088,7698\n37088,7768\n37088,13137\n37088,13420\n37088,15694\n37088,17273\n37088,19349\n37088,25670\n37088,31205\n37088,37088\n37088,38845\n37088,41450\n37088,115474\n37088,130275\n37088,145991\n37088,166288\n37088,172486\n37088,178554\n37088,190108\n37088,192900\n37088,215815\n37088,217469\n37088,239462\n37088,251862\n37089,3079\n37090,83\n37090,285\n37090,2784\n37091,1052\n37092,23701\n37093,3872\n37094,247\n37095,34\n37095,222\n37095,455\n37095,536\n37095,1531\n37095,1571\n37095,1756\n37095,7768\n37096,37097\n37096,49499\n37096,50570\n37098,972\n37099,877\n37100,4\n37100,5\n37100,332\n37100,1119\n37100,1282\n37100,2205\n37100,27041\n37100,33424\n37100,111142\n37101,1551\n37101,3041\n37101,21944\n37102,44\n37103,500\n37103,718\n37104,10\n37104,151\n37104,37105\n37104,168457\n37106,37105\n37107,37105\n37108,1522\n37109,372\n37110,217\n37110,536\n37110,2319\n37110,4672\n37110,18831\n37111,37112\n37111,53518\n37111,85532\n37114,749\n37115,37116\n37117,298\n37118,485\n37119,406\n37121,99\n37122,264\n37122,1381\n37122,1893\n37123,1572\n37123,1623\n37124,79\n37125,206\n37126,171\n37127,372\n37127,390\n37128,338\n37129,704\n37130,10\n37131,16683\n37132,861\n37133,22\n37133,652\n37134,1556\n37135,3413\n37136,493\n37137,5375\n37139,271\n37141,72\n37142,178\n37143,3252\n37144,1227\n37144,1229\n37144,1368\n37145,135\n37146,1860\n37147,818\n37148,932\n37149,1531\n37150,147\n37150,68069\n37151,37152\n37153,83\n37153,285\n37153,2784\n37154,10\n37154,198\n37155,83\n37156,202\n37156,203\n37157,138\n37157,1227\n37157,1229\n37157,21944\n37157,55849\n37158,602\n37159,1082\n37160,338\n37161,1707\n37162,309\n37162,310\n37162,611\n37162,1118\n37162,3695\n37163,1776\n37164,225\n37165,83\n37165,285\n37165,2784\n37165,28130\n37166,2334\n37168,438\n37169,622\n37170,4453\n37171,805\n37172,435\n37173,1634\n37174,557\n37175,557\n37176,250\n37177,393\n37178,298\n37179,485\n37180,217\n37181,1454\n37182,37183\n37182,61493\n37182,83184\n37182,97843\n37182,102978\n37182,115323\n37182,122299\n37182,124173\n37182,127598\n37182,127615\n37182,127651\n37182,132561\n37182,156543\n37182,163273\n37182,170428\n37182,177826\n37182,191097\n37182,199270\n37184,255\n37185,743\n37186,250\n37189,417\n37189,525\n37189,805\n37189,1085\n37189,1749\n37189,1818\n37189,2286\n37189,2620\n37190,79\n37192,298\n37193,485\n37194,452\n37195,1247\n37196,184\n37197,147\n37198,83\n37198,285\n37198,2779\n37198,2784\n37199,206\n37200,644\n37201,623\n37201,1805\n37202,1146\n37202,1818\n37202,9457\n37203,3\n37204,579\n37204,599\n37205,37206\n37207,417\n37208,1247\n37208,164572\n37209,149\n37210,4\n37210,5\n37212,1227\n37212,1229\n37214,1143\n37215,640\n37216,8788\n37217,2351\n37218,158\n37218,2244\n37219,623\n37219,1240\n37219,1805\n37219,1860\n37219,4760\n37219,22293\n37219,23287\n37219,102560\n37219,138686\n37219,171641\n37219,207045\n37219,212914\n37220,1467\n37221,4252\n37222,2436\n37223,254\n37223,1363\n37224,81\n37224,192\n37224,264\n37224,647\n37224,1818\n37224,4771\n37225,1368\n37226,346\n37227,206\n37228,15\n37229,37230\n37231,2434\n37232,94\n37232,1608\n37232,1882\n37232,2787\n37232,3507\n37233,718\n37234,37235\n37236,314\n37237,54\n37238,333\n37238,779\n37238,2931\n37239,4101\n37240,9743\n37241,247\n37242,3069\n37243,801\n37244,1019\n37245,481\n37246,37247\n37248,272\n37249,346\n37250,2506\n37251,376\n37252,885\n37253,264\n37253,1102\n37254,222\n37255,7360\n37256,9560\n37257,50\n37257,147\n37257,206\n37257,406\n37257,620\n37257,622\n37257,779\n37257,1181\n37257,1515\n37257,2931\n37257,4192\n37257,4193\n37257,5874\n37258,602\n37260,7092\n37261,14434\n37262,452\n37262,457\n37262,497\n37262,918\n37262,1655\n37263,631\n37263,1462\n37263,8537\n37264,302\n37264,1893\n37264,2626\n37264,5547\n37265,298\n37266,485\n37267,920\n37268,4\n37268,5\n37268,151\n37268,310\n37268,622\n37268,3039\n37270,920\n37271,920\n37272,104\n37273,1085\n37274,32\n37275,83\n37275,178\n37275,259\n37275,500\n37275,620\n37275,1655\n37275,2923\n37275,3507\n37276,5440\n37277,211\n37278,240\n37279,557\n37280,160\n37281,392\n37282,72\n37283,72\n37284,151\n37285,1414\n37287,907\n37289,406\n37290,3069\n37291,149\n37293,2590\n37294,37295\n37294,52234\n37294,103854\n37294,107868\n37296,772\n37297,1634\n37298,2506\n37299,37300\n37301,704\n37302,206\n37303,298\n37304,264\n37304,872\n37304,1381\n37304,1509\n37304,1893\n37304,191860\n37305,366\n37306,366\n37307,366\n37308,366\n37309,366\n37310,323\n37311,920\n37311,1623\n37312,120\n37313,932\n37314,358\n37314,1509\n37315,447\n37315,1877\n37315,6661\n37316,264\n37316,515\n37316,652\n37317,79\n37318,233\n37319,3\n37320,515\n37321,673\n37322,58\n37323,46\n37324,349\n37325,3295\n37326,298\n37327,485\n37329,143\n37329,477\n37329,1789\n37329,2105\n37330,37331\n37333,302\n37334,151\n37335,37336\n37337,37338\n37339,442\n37340,444\n37341,37342\n37343,97\n37343,120\n37343,182\n37343,200\n37343,217\n37343,222\n37343,240\n37343,388\n37343,392\n37343,420\n37343,510\n37343,622\n37343,710\n37343,850\n37343,972\n37343,1010\n37343,1085\n37343,1210\n37343,1284\n37343,1326\n37343,1402\n37343,1419\n37343,1673\n37343,1818\n37343,1893\n37343,2512\n37343,2626\n37343,3182\n37343,4355\n37343,5310\n37343,9005\n37344,652\n37345,30\n37345,79\n37345,309\n37345,310\n37345,622\n37346,3451\n37346,3452\n37347,48\n37347,72\n37347,87\n37347,140\n37347,160\n37347,312\n37347,338\n37347,515\n37347,525\n37347,1052\n37347,1289\n37347,1381\n37347,1509\n37347,1579\n37347,1893\n37347,2312\n37347,2605\n37347,5440\n37348,385\n37349,907\n37349,932\n37350,1313\n37351,3\n37352,217\n37352,1579\n37353,83\n37354,1467\n37355,46\n37355,58\n37355,1124\n37356,298\n37357,485\n37358,2867\n37358,2868\n37358,22880\n37359,663\n37359,664\n37359,2334\n37360,298\n37361,485\n37362,698\n37362,938\n37362,1782\n37362,13991\n37362,133581\n37364,595\n37365,207\n37366,252\n37366,318\n37366,41170\n37367,299\n37370,192\n37370,1172\n37371,273\n37371,274\n37372,298\n37373,485\n37375,996\n37376,477\n37377,298\n37378,485\n37381,301\n37381,615\n37381,968\n37381,5662\n37381,231939\n37386,602\n37387,442\n37388,175\n37389,704\n37390,704\n37391,306\n37391,307\n37392,1454\n37392,1844\n37393,2351\n37394,733\n37396,4101\n37396,31517\n37399,37400\n37401,640\n37402,718\n37403,640\n37404,640\n37405,640\n37406,640\n37407,240\n37407,261\n37407,372\n37407,390\n37407,818\n37409,298\n37410,485\n37411,808\n37412,996\n37413,535\n37414,338\n37414,441\n37414,611\n37414,745\n37414,1572\n37414,7921\n37414,19676\n37414,37414\n37414,48955\n37414,54326\n37414,65901\n37414,65911\n37414,81149\n37414,94091\n37414,130296\n37414,145461\n37414,216722\n37414,224083\n37415,298\n37416,485\n37417,209\n37418,292\n37420,3003\n37421,442\n37422,41\n37422,718\n37424,104\n37424,225\n37424,248\n37424,1332\n37425,346\n37426,1240\n37426,76096\n37427,77\n37428,5405\n37429,473\n37429,707\n37431,1619\n37432,2590\n37433,693\n37434,996\n37436,37437\n37438,809\n37439,907\n37439,932\n37440,682\n37440,1353\n37440,72439\n37441,79\n37441,192\n37441,422\n37442,22\n37442,227\n37443,209\n37445,393\n37445,1821\n37446,309\n37446,310\n37447,37448\n37449,37450\n37451,58\n37451,178\n37451,685\n37451,994\n37451,17593\n37452,852\n37452,1782\n37453,301\n37453,615\n37453,968\n37453,1293\n37454,422\n37455,422\n37456,328\n37457,422\n37458,422\n37459,209\n37460,422\n37461,422\n37462,422\n37463,1323\n37464,102\n37465,1326\n37466,408\n37467,310\n37468,3161\n37469,1313\n37472,516\n37472,1385\n37473,215\n37474,1860\n37475,932\n37476,518\n37477,46\n37478,907\n37479,65\n37479,66\n37480,79\n37480,1276\n37481,192\n37481,663\n37482,1167\n37483,240\n37483,312\n37484,10\n37489,9121\n37490,957\n37491,305\n37492,104\n37492,1282\n37493,301\n37493,752\n37493,968\n37493,1522\n37493,2557\n37493,20359\n37494,171\n37495,301\n37495,968\n37496,171\n37497,182\n37497,1118\n37500,195\n37501,644\n37503,1284\n37503,1732\n37504,843\n37505,358\n37506,4\n37506,5\n37507,875\n37508,1836\n37509,240\n37511,1635\n37511,1688\n37511,2979\n37512,1803\n37513,15\n37513,994\n37513,3538\n37513,7360\n37514,1511\n37514,3069\n37515,104\n37515,332\n37515,467\n37515,3328\n37516,1001\n37516,3094\n37517,1118\n37518,704\n37520,13136\n37521,1072\n37522,3\n37523,1479\n37524,37525\n37526,115659\n37526,142870\n37527,2315\n37528,7124\n37529,992\n37531,37532\n37533,292\n37535,1014\n37537,1608\n37538,298\n37539,330\n37540,37541\n37542,1241\n37543,424\n37544,269\n37545,200\n37545,772\n37546,79\n37547,304\n37547,356\n37547,442\n37547,795\n37547,852\n37547,859\n37547,1782\n37547,2620\n37547,6068\n37548,3582\n37549,422\n37550,56\n37551,1\n37552,160\n37553,1298\n37554,720\n37555,2867\n37555,2868\n37555,22880\n37558,1888\n37559,1235\n37559,1335\n37559,2089\n37559,2940\n37559,21944\n37560,1955\n37561,602\n37564,1433\n37565,37566\n37567,907\n37567,932\n37568,56\n37568,422\n37568,30331\n37568,60576\n37569,65\n37569,467\n37569,1433\n37570,313\n37570,843\n37571,3\n37575,503\n37575,1257\n37576,385\n37576,4672\n37576,37577\n37576,68069\n37576,86832\n37578,83\n37579,652\n37581,22\n37582,503\n37582,2379\n37583,503\n37584,503\n37584,1149\n37585,503\n37586,299\n37586,312\n37587,980\n37587,1531\n37587,2178\n37587,4455\n37587,4545\n37587,16331\n37588,503\n37588,1149\n37589,1072\n37590,346\n37591,503\n37595,885\n37596,929\n37597,209\n37598,240\n37599,372\n37601,287\n37602,622\n37602,1326\n37602,1849\n37603,1012\n37604,503\n37605,1287\n37607,503\n37609,503\n37610,46\n37610,1124\n37612,134\n37613,996\n37614,298\n37615,485\n37616,34\n37616,35\n37616,222\n37616,283\n37616,389\n37616,536\n37616,657\n37616,781\n37616,949\n37616,1019\n37616,1072\n37616,1274\n37616,1467\n37616,1539\n37616,1718\n37616,1871\n37616,1881\n37616,2266\n37616,2424\n37616,2671\n37616,2784\n37616,4594\n37616,5976\n37616,6789\n37616,6888\n37616,13575\n37616,29475\n37618,1977\n37618,1978\n37629,192\n37630,720\n37630,877\n37630,973\n37630,1001\n37630,1284\n37630,1522\n37630,1715\n37630,1837\n37630,2191\n37630,9024\n37633,503\n37637,1688\n37639,37640\n37639,57702\n37639,62299\n37639,87557\n37639,99496\n37639,101552\n37643,1188\n37647,1298\n37648,6263\n37649,21944\n37650,859\n37651,134\n37651,225\n37651,431\n37651,801\n37651,8180\n37652,781\n37653,1332\n37654,47\n37654,2469\n37655,81\n37655,215\n37655,227\n37655,328\n37655,430\n37655,503\n37655,704\n37655,760\n37655,1016\n37655,1149\n37655,1257\n37655,1282\n37655,1392\n37655,2210\n37655,4237\n37655,20063\n37656,83\n37657,623\n37658,15573\n37659,338\n37659,340\n37659,360\n37659,1224\n37660,309\n37660,310\n37661,1860\n37662,2671\n37663,4094\n37664,37665\n37666,83\n37666,379\n37666,2784\n37667,2506\n37668,1130\n37669,158\n37669,406\n37670,623\n37671,5547\n37672,868\n37672,1433\n37673,259\n37674,852\n37674,1326\n37675,920\n37676,406\n37676,2931\n37677,433\n37679,567\n37680,3724\n37681,37681\n37682,37683\n37684,943\n37685,660\n37685,1539\n37686,63\n37687,151\n37688,1608\n37690,50\n37691,20\n37692,433\n37692,1634\n37693,473\n37696,147\n37697,252\n37697,516\n37699,1419\n37700,264\n37701,1243\n37701,1515\n37703,557\n37704,1247\n37705,1818\n37707,192\n37707,663\n37707,664\n37708,54\n37708,455\n37709,30\n37711,1515\n37712,809\n37713,4\n37713,5\n37713,1983\n37714,158\n37715,503\n37715,704\n37716,713\n37718,406\n37719,299\n37721,652\n37721,1659\n37722,3507\n37723,433\n37725,862\n37726,217\n37726,457\n37727,1531\n37728,1289\n37728,1893\n37728,2617\n37729,424\n37730,30\n37730,328\n37730,431\n37730,631\n37730,4222\n37731,37732\n37733,388\n37733,467\n37733,1411\n37734,26922\n37735,1284\n37736,1506\n37737,577\n37738,83\n37739,577\n37740,1353\n37741,134\n37741,200\n37741,289\n37741,1016\n37741,6556\n37741,94134\n37742,219\n37743,452\n37743,457\n37743,918\n37743,1417\n37743,1796\n37744,151\n37745,1522\n37747,602\n37751,1102\n37753,717\n37755,1623\n37756,247\n37758,37759\n37760,3\n37760,1807\n37760,1984\n37761,1506\n37761,22125\n37762,536\n37762,2266\n37762,2421\n37764,240\n37764,615\n37764,968\n37764,1119\n37764,1818\n37764,1832\n37764,1837\n37765,3\n37765,3507\n37766,315\n37766,500\n37766,622\n37767,37768\n37769,1370\n37770,7416\n37771,388\n37771,483\n37771,626\n37771,671\n37771,795\n37771,827\n37771,973\n37771,1089\n37771,1119\n37771,1146\n37771,1298\n37771,1368\n37771,1415\n37771,1608\n37771,1623\n37771,1644\n37771,2775\n37771,3182\n37771,4222\n37771,6638\n37771,48505\n37773,171\n37774,86\n37775,1805\n37776,875\n37777,158\n37777,779\n37778,1433\n37779,500\n37780,1962\n37781,1052\n37782,1882\n37783,2775\n37784,54\n37785,2210\n37785,4237\n37786,518\n37787,581\n37788,294\n37789,1465\n37790,160\n37791,8719\n37793,406\n37795,1837\n37795,3612\n37796,1663\n37797,1127\n37798,422\n37799,56\n37800,22\n37800,120\n37800,302\n37800,861\n37800,1240\n37800,6303\n37801,158\n37801,620\n37801,1181\n37802,2590\n37803,843\n37804,422\n37805,56\n37806,151\n37807,1509\n37809,690\n37810,273\n37810,274\n37811,333\n37812,344\n37813,115\n37813,118\n37814,422\n37815,56\n37816,104\n37816,332\n37816,714\n37816,1368\n37816,1659\n37816,1715\n37816,1749\n37816,1962\n37816,2620\n37817,8992\n37818,585\n37819,1149\n37820,349\n37820,697\n37821,211\n37822,1370\n37823,392\n37823,1240\n37824,275\n37825,160\n37826,301\n37827,483\n37828,1539\n37829,10\n37830,151\n37831,222\n37832,640\n37833,852\n37834,1285\n37835,171\n37836,200\n37836,31977\n37836,77183\n37836,78277\n37836,84869\n37836,106420\n37836,111885\n37836,193841\n37837,111\n37838,805\n37839,925\n37840,247\n37841,37842\n37843,602\n37844,192\n37845,1033\n37846,356\n37847,302\n37848,433\n37849,1127\n37849,3148\n37850,875\n37851,1118\n37852,217\n37852,1019\n37852,1417\n37852,1531\n37852,2266\n37853,4\n37853,5\n37854,184\n37855,640\n37856,861\n37857,120\n37857,1284\n37857,1419\n37857,1740\n37858,875\n37859,392\n37859,644\n37860,7360\n37861,6051\n37862,83\n37863,433\n37864,784\n37865,682\n37866,83\n37867,392\n37867,1151\n37868,500\n37869,192\n37870,439\n37871,37872\n37873,37872\n37874,37872\n37875,37872\n37876,1133\n37877,4060\n37878,9026\n37882,406\n37882,779\n37883,37884\n37885,272\n37886,2775\n37887,447\n37888,14989\n37889,622\n37890,406\n37891,877\n37892,631\n37893,79\n37893,1707\n37894,862\n37895,120\n37895,332\n37895,392\n37895,455\n37895,644\n37895,1019\n37895,2989\n37895,2991\n37896,2735\n37898,1274\n37899,1556\n37900,1072\n37901,1608\n37902,72\n37903,875\n37904,30\n37905,1551\n37906,202\n37906,203\n37907,588\n37907,590\n37909,37910\n37911,1983\n37913,37914\n37915,344\n37915,1984\n37915,3949\n37916,273\n37916,274\n37917,273\n37917,274\n37918,1016\n37919,37920\n37921,563\n37922,1506\n37924,24\n37924,2089\n37924,2940\n37924,4079\n37924,21944\n37925,83\n37926,811\n37927,592\n37927,1818\n37927,2995\n37928,2506\n37929,2506\n37930,2506\n37931,2506\n37932,2506\n37933,2506\n37934,1559\n37935,671\n37936,209\n37937,557\n37938,557\n37941,37942\n37943,1782\n37944,2367\n37945,83\n37945,2266\n37945,3252\n37946,252\n37947,5976\n37948,1332\n37949,1579\n37949,5440\n37950,10\n37950,175\n37950,779\n37950,13546\n37950,31977\n37950,37951\n37950,228298\n37950,230697\n37950,241421\n37950,253626\n37950,254805\n37954,301\n37954,536\n37954,2006\n37954,2620\n37955,37956\n37957,1858\n37958,1860\n37959,393\n37960,1381\n37961,660\n37962,247\n37963,467\n37963,571\n37963,868\n37964,433\n37965,37966\n37965,100084\n37967,178\n37967,261\n37968,996\n37969,872\n37970,1467\n37971,872\n37972,1566\n37973,37974\n37975,872\n37976,510\n37977,417\n37978,406\n37978,779\n37979,2506\n37980,207\n37981,10\n37982,861\n37983,891\n37984,37985\n37986,726\n37987,255\n37988,3413\n37989,1285\n37989,1955\n37990,809\n37991,1001\n37991,1085\n37992,602\n37993,269\n37994,10\n37994,34\n37994,35\n37994,192\n37994,247\n37995,704\n37996,1433\n37997,292\n37998,37999\n38000,1220\n38000,1222\n38000,1566\n38000,1571\n38001,192\n38002,328\n38003,652\n38004,175\n38005,4192\n38005,4193\n38006,267\n38007,202\n38007,203\n38008,602\n38009,1\n38010,10\n38010,19005\n38012,301\n38013,2506\n38014,704\n38015,704\n38016,1227\n38016,1229\n38018,389\n38018,1072\n38019,392\n38020,323\n38022,872\n38023,187\n38024,38025\n38026,240\n38027,195\n38028,134\n38029,455\n38030,222\n38030,536\n38030,4672\n38030,7698\n38031,1634\n38032,801\n38033,38034\n38033,57021\n38035,302\n38036,2506\n38037,1634\n38038,360\n38039,366\n38040,366\n38041,366\n38042,366\n38043,366\n38045,151\n38046,38047\n38046,51942\n38046,53365\n38046,55522\n38048,38049\n38051,323\n38052,1078\n38054,417\n38056,704\n38057,38058\n38057,60230\n38059,1556\n38061,38062\n38063,1634\n38064,151\n38065,779\n38066,38067\n38066,41850\n38066,75751\n38066,91178\n38068,1392\n38069,3413\n38070,171\n38071,3413\n38072,1163\n38073,111\n38074,805\n38075,81\n38076,28072\n38077,323\n38078,358\n38079,3\n38079,510\n38080,250\n38080,1684\n38081,954\n38081,1939\n38081,10318\n38082,567\n38083,907\n38083,1284\n38083,2191\n38084,602\n38085,30\n38085,328\n38085,7124\n38086,1179\n38086,3695\n38089,233\n38090,392\n38090,2699\n38091,457\n38091,497\n38091,918\n38092,38093\n38094,1181\n38095,973\n38096,602\n38097,38098\n38099,38100\n38099,59128\n38099,85423\n38101,1133\n38102,38103\n38104,50\n38104,75912\n38105,440\n38106,298\n38107,136\n38107,137\n38108,485\n38109,2351\n38110,7652\n38112,704\n38113,298\n38114,485\n38115,79\n38116,3451\n38116,3452\n38118,38119\n38120,772\n38121,10\n38122,980\n38123,323\n38124,340\n38125,38126\n38127,2334\n38128,893\n38129,269\n38129,1014\n38130,137\n38132,259\n38132,980\n38132,1531\n38133,1058\n38133,3367\n38133,3804\n38134,306\n38134,307\n38136,79\n38137,38138\n38139,389\n38140,440\n38140,467\n38140,663\n38140,762\n38140,794\n38140,2373\n38140,2979\n38140,3207\n38140,227061\n38141,996\n38142,592\n38143,575\n38144,596\n38144,1368\n38145,217\n38146,4637\n38147,455\n38148,2266\n38149,1201\n38150,2421\n38151,941\n38152,710\n38153,222\n38153,694\n38153,1871\n38155,1238\n38156,907\n38158,20\n38158,183412\n38159,1172\n38160,852\n38160,1429\n38161,1452\n38162,626\n38163,652\n38164,289\n38164,290\n38165,2867\n38165,22880\n38166,1140\n38169,818\n38170,652\n38170,2312\n38171,1323\n38172,102\n38173,1326\n38174,408\n38175,222\n38176,71\n38176,258\n38176,408\n38176,611\n38176,1623\n38176,1983\n38176,2867\n38176,22880\n38176,64147\n38178,301\n38178,968\n38179,885\n38180,217\n38180,240\n38180,356\n38180,379\n38180,694\n38180,3115\n38181,671\n38182,299\n38183,71\n38183,1227\n38183,86416\n38184,422\n38185,422\n38186,440\n38187,422\n38188,422\n38189,422\n38190,422\n38191,626\n38192,422\n38193,422\n38194,366\n38194,500\n38194,718\n38195,503\n38195,1149\n38196,640\n38197,640\n38198,640\n38199,640\n38200,640\n38201,346\n38204,54\n38206,602\n38207,3695\n38208,602\n38209,1590\n38209,1644\n38210,602\n38211,1983\n38212,1319\n38213,83\n38213,222\n38213,356\n38213,536\n38213,852\n38213,2266\n38214,333\n38214,459\n38214,2135\n38215,3331\n38216,1381\n38217,3422\n38219,907\n38220,240\n38221,743\n38221,8714\n38223,1608\n38224,3246\n38224,3247\n38225,211\n38226,1707\n38227,283\n38227,1019\n38228,920\n38229,2574\n38230,671\n38231,20771\n38232,1285\n38233,225\n38233,850\n38233,1332\n38234,893\n38234,1146\n38235,6252\n38235,38236\n38237,9195\n38238,1425\n38238,2867\n38238,2868\n38239,1634\n38240,309\n38240,310\n38241,515\n38242,50\n38243,146\n38243,158\n38243,192\n38243,285\n38243,336\n38243,406\n38243,620\n38243,779\n38243,1515\n38243,1531\n38244,1241\n38245,138\n38246,1983\n38247,1849\n38248,2421\n38249,5405\n38250,712\n38251,120\n38251,379\n38251,536\n38251,1274\n38251,5547\n38251,7698\n38251,115474\n38252,273\n38252,274\n38253,439\n38254,932\n38255,217\n38255,247\n38255,252\n38255,372\n38255,467\n38255,1181\n38255,41170\n38256,1858\n38257,1860\n38259,126\n38260,126\n38262,38262\n38263,83\n38264,647\n38265,344\n38266,8180\n38267,644\n38268,596\n38268,2296\n38269,20\n38272,28\n38272,4571\n38272,88820\n38273,126\n38273,430\n38273,457\n38274,907\n38274,932\n38275,431\n38275,631\n38276,195\n38277,2775\n38278,447\n38279,3538\n38280,1326\n38282,119\n38282,19519\n38283,366\n38284,877\n38284,1715\n38285,687\n38285,1556\n38286,500\n38287,1962\n38288,1052\n38289,1882\n38290,2775\n38291,54\n38292,2210\n38292,4237\n38293,996\n38294,1849\n38295,2205\n38295,2206\n38298,4\n38298,5\n38298,134\n38299,972\n38299,124668\n38300,1\n38300,217\n38300,292\n38300,309\n38300,310\n38300,372\n38300,406\n38300,439\n38300,510\n38300,599\n38300,626\n38300,631\n38300,752\n38300,760\n38300,779\n38300,973\n38300,1143\n38300,1149\n38300,1181\n38300,1231\n38300,1370\n38300,1385\n38300,1411\n38300,1417\n38300,1522\n38300,1715\n38300,1801\n38300,1837\n38300,1844\n38300,2209\n38300,2646\n38300,3474\n38300,3623\n38300,3804\n38300,136014\n38303,323\n38304,41\n38304,406\n38304,435\n38304,1181\n38305,250\n38305,306\n38305,307\n38305,994\n38305,1247\n38305,1684\n38305,2088\n38305,154690\n38305,164572\n38306,811\n38307,1436\n38308,171\n38309,1414\n38310,4\n38310,5\n38311,1973\n38313,344\n38315,79\n38315,726\n38317,2775\n38318,120\n38318,1419\n38320,1977\n38320,1978\n38321,3260\n38322,718\n38323,106\n38323,1220\n38323,1222\n38324,344\n38325,694\n38325,2775\n38326,579\n38326,1172\n38327,1805\n38328,19\n38328,77\n38328,743\n38328,1274\n38328,1984\n38328,3413\n38330,433\n38331,19443\n38332,209\n38333,330\n38334,160\n38335,852\n38336,433\n38339,309\n38339,310\n38339,652\n38340,424\n38341,2828\n38343,788\n38344,861\n38345,5366\n38346,302\n38346,579\n38346,1188\n38346,6303\n38347,111\n38347,1659\n38349,567\n38349,604\n38349,750\n38350,167\n38351,3724\n38353,217\n38353,240\n38353,294\n38354,704\n38355,440\n38356,1085\n38357,794\n38358,697\n38358,2626\n38361,97\n38362,1663\n38363,79\n38364,3999\n38365,5101\n38366,349\n38367,269\n38368,302\n38368,861\n38370,298\n38371,485\n38372,920\n38374,406\n38375,118\n38375,4597\n38376,2017\n38376,17309\n38377,273\n38377,274\n38378,72\n38379,81\n38381,54\n38382,2506\n38384,557\n38385,577\n38385,2367\n38386,158\n38386,467\n38386,872\n38386,55171\n38386,118336\n38387,107\n38387,111\n38387,296\n38387,1659\n38388,3260\n38389,38390\n38392,206\n38393,272\n38393,538\n38394,431\n38394,596\n38394,704\n38394,805\n38394,1052\n38394,1402\n38394,3507\n38395,2979\n38396,3193\n38397,83\n38398,261\n38399,1803\n38400,264\n38401,491\n38402,264\n38402,1749\n38403,217\n38403,479\n38404,660\n38404,1631\n38404,2168\n38404,5662\n38404,142473\n38405,7124\n38406,358\n38406,1634\n38406,1801\n38406,2590\n38406,6424\n38406,28107\n38407,438\n38407,671\n38407,934\n38407,1776\n38408,2244\n38409,1252\n38409,1253\n38410,483\n38410,2105\n38411,1707\n38412,65\n38413,83\n38414,536\n38415,2671\n38416,309\n38416,310\n38417,247\n38418,1564\n38419,333\n38419,1181\n38420,20\n38420,178\n38420,352\n38420,440\n38420,1033\n38420,1147\n38421,843\n38422,862\n38423,38424\n38423,106644\n38423,171704\n38423,175571\n38425,389\n38426,178\n38426,996\n38427,811\n38427,145751\n38428,254\n38429,211\n38431,1659\n38432,868\n38433,586\n38434,356\n38435,1801\n38436,873\n38437,943\n38437,152855\n38438,1140\n38438,3474\n38440,766\n38441,2574\n38442,1983\n38443,38444\n38445,5366\n38447,1127\n38448,151\n38449,20\n38449,207\n38449,48505\n38450,302\n38450,392\n38450,595\n38450,809\n38450,893\n38450,1143\n38450,1722\n38450,3258\n38451,349\n38451,3260\n38452,592\n38453,500\n38454,72\n38455,907\n38455,932\n38456,72\n38457,1836\n38458,252\n38459,676\n38460,2867\n38460,22880\n38461,285\n38461,21944\n38462,9560\n38463,104\n38463,392\n38464,38465\n38466,2775\n38466,3507\n38467,158\n38468,2353\n38469,247\n38470,79\n38471,358\n38472,3507\n38473,3447\n38474,390\n38475,1326\n38476,83\n38476,217\n38476,278\n38476,509\n38476,536\n38476,1019\n38476,1467\n38476,8855\n38476,20359\n38477,392\n38477,697\n38477,1893\n38477,2116\n38477,4672\n38477,5547\n38477,8907\n38477,59021\n38477,118336\n38478,536\n38479,2784\n38480,602\n38481,247\n38482,704\n38483,1381\n38484,255\n38485,83\n38486,1240\n38487,376\n38488,885\n38489,422\n38490,406\n38491,431\n38491,631\n38492,240\n38493,843\n38494,38495\n38496,862\n38497,760\n38498,269\n38499,5375\n38500,3138\n38500,6303\n38501,1085\n38502,158\n38503,280\n38504,93\n38504,94\n38505,33598\n38506,298\n38507,485\n38508,1962\n38509,240\n38510,2353\n38512,2296\n38513,38514\n38515,79\n38516,346\n38517,301\n38517,652\n38517,733\n38518,1227\n38518,1229\n38518,86416\n38520,779\n38521,83\n38522,704\n38523,704\n38524,309\n38524,310\n38525,859\n38526,949\n38527,1722\n38528,83\n38529,479\n38530,1085\n38530,2206\n38531,366\n38531,500\n38532,557\n38533,557\n38534,907\n38535,38536\n38537,15573\n38538,953\n38539,1858\n38540,83\n38541,818\n38542,389\n38545,953\n38546,2367\n38546,8820\n38547,38548\n38549,120\n38550,298\n38551,485\n38552,38553\n38554,1287\n38555,9029\n38556,2244\n38557,1659\n38558,2995\n38559,1370\n38560,2351\n38561,8788\n38562,1181\n38563,1\n38563,275\n38563,277\n38564,206\n38565,19\n38565,34\n38565,217\n38565,313\n38565,536\n38565,891\n38565,949\n38565,1274\n38565,1881\n38565,2266\n38565,2553\n38565,2646\n38565,2944\n38565,6298\n38565,7092\n38565,7698\n38565,217598\n38566,1181\n38567,137\n38568,178\n38569,872\n38570,1133\n38571,72\n38572,273\n38573,602\n38574,272\n38575,5405\n38576,1181\n38577,298\n38578,485\n38579,424\n38580,2775\n38581,447\n38582,192\n38582,442\n38582,1392\n38582,2671\n38583,1133\n38583,1462\n38584,3872\n38584,4193\n38585,5405\n38586,7358\n38586,7363\n38587,1844\n38588,72\n38588,588\n38588,590\n38589,406\n38590,38591\n38592,3653\n38593,17772\n38594,298\n38595,485\n38596,2775\n38597,447\n38598,2506\n38599,602\n38600,2506\n38601,349\n38602,2775\n38603,447\n38604,107\n38605,467\n38605,536\n38605,156379\n38606,38607\n38608,693\n38609,1893\n38609,4294\n38610,2506\n38612,104\n38612,136\n38612,312\n38612,557\n38612,875\n38612,1238\n38612,1572\n38612,1722\n38612,3538\n38612,3612\n38613,333\n38614,323\n38615,273\n38615,274\n38616,483\n38617,292\n38618,682\n38619,17772\n38620,5366\n38621,323\n38622,8270\n38623,323\n38624,1556\n38625,255\n38626,406\n38627,1452\n38628,50\n38628,192\n38628,195\n38628,779\n38628,5874\n38628,6119\n38629,323\n38630,346\n38631,38632\n38633,38634\n38634,38634\n38635,323\n38636,3246\n38636,3247\n38637,323\n38638,83\n38639,1425\n38639,1515\n38640,392\n38640,1836\n38641,3246\n38641,3247\n38642,2775\n38643,447\n38644,422\n38645,56\n38646,346\n38647,192\n38647,366\n38647,640\n38648,202\n38648,203\n38649,1181\n38650,248\n38650,450\n38651,38652\n38653,38652\n38654,323\n38655,2995\n38656,280\n38657,4193\n38657,17588\n38658,222\n38659,134\n38660,5405\n38661,2697\n38661,7363\n38662,38663\n38664,258\n38665,66\n38666,38667\n38668,147\n38669,4101\n38670,323\n38672,2048\n38673,671\n38674,38675\n38676,17334\n38677,652\n38678,1102\n38679,1608\n38680,1052\n38682,602\n38683,31977\n38684,505\n38685,1010\n38686,704\n38687,1634\n38688,79\n38688,111\n38688,602\n38688,620\n38688,663\n38688,1181\n38689,233\n38690,273\n38690,274\n38691,1267\n38692,4475\n38693,515\n38694,366\n38695,366\n38696,366\n38697,366\n38698,366\n38699,366\n38700,1235\n38700,1335\n38701,366\n38702,366\n38703,366\n38704,10\n38705,515\n38705,2572\n38706,872\n38707,1392\n38708,1143\n38709,298\n38710,485\n38711,1792\n38711,6424\n38711,13441\n38711,14098\n38711,15711\n38711,16378\n38711,18288\n38711,19358\n38711,23311\n38711,25395\n38711,28107\n38711,28193\n38711,28196\n38711,28387\n38711,29001\n38711,29647\n38711,32872\n38711,37710\n38711,38711\n38711,38985\n38711,44422\n38711,59206\n38711,62471\n38711,64018\n38711,65369\n38711,67865\n38711,67867\n38711,67868\n38711,71748\n38711,72681\n38711,76657\n38711,76819\n38711,82739\n38711,99167\n38711,101851\n38711,103275\n38711,103409\n38711,103575\n38711,106195\n38711,118950\n38711,130165\n38711,130936\n38711,145407\n38711,149144\n38711,149199\n38711,152022\n38711,154388\n38711,154693\n38711,164212\n38711,166277\n38711,166352\n38711,168770\n38711,171012\n38711,172061\n38711,172665\n38711,174366\n38711,174377\n38711,174428\n38711,174431\n38711,174882\n38711,176040\n38711,183372\n38711,183810\n38711,185270\n38711,185301\n38711,185399\n38711,185977\n38711,188767\n38711,190354\n38711,191778\n38711,192880\n38711,193408\n38711,194360\n38711,194361\n38711,194528\n38711,207008\n38711,212357\n38711,212921\n38711,212931\n38711,213931\n38711,217460\n38711,217517\n38711,217551\n38711,217848\n38711,217884\n38711,217918\n38711,217974\n38711,218009\n38711,218337\n38711,218338\n38711,219968\n38711,221663\n38711,222428\n38711,222437\n38711,223677\n38711,223758\n38711,225573\n38711,226444\n38711,226446\n38711,226464\n38711,228121\n38711,228351\n38711,235975\n38711,247244\n38711,251399\n38711,251402\n38711,254871\n38711,255515\n38711,255761\n38711,256302\n38711,260829\n38712,3451\n38712,3452\n38713,634\n38714,298\n38715,485\n38716,118\n38716,605\n38716,4597\n38717,298\n38718,485\n38720,875\n38721,1556\n38722,459\n38723,779\n38724,859\n38725,623\n38726,563\n38727,118\n38727,192\n38727,275\n38727,620\n38727,4597\n38728,298\n38729,485\n38730,83\n38730,919\n38730,1140\n38730,1871\n38730,5326\n38731,38732\n38731,239358\n38733,209\n38733,467\n38733,1849\n38733,32784\n38734,364\n38735,306\n38735,307\n38736,660\n38737,718\n38738,38739\n38740,652\n38741,1400\n38742,292\n38743,240\n38744,1858\n38745,1860\n38746,207\n38747,38748\n38749,602\n38749,3218\n38750,298\n38751,485\n38752,1893\n38754,301\n38754,516\n38755,388\n38755,6638\n38756,346\n38757,3585\n38758,1151\n38759,38760\n38761,1411\n38762,313\n38762,1571\n38763,171\n38764,1363\n38764,1927\n38765,2867\n38765,2868\n38765,22880\n38766,192\n38767,147\n38767,158\n38768,171\n38769,58\n38770,3507\n38770,75912\n38771,292\n38772,2334\n38772,3474\n38773,298\n38774,485\n38775,1087\n38776,20\n38777,7757\n38778,171\n38779,671\n38780,298\n38781,485\n38782,3555\n38783,1454\n38783,3507\n38783,20535\n38784,252\n38784,318\n38784,1220\n38784,1222\n38785,640\n38786,640\n38787,596\n38788,640\n38789,640\n38790,500\n38792,301\n38792,968\n38793,1007\n38794,1241\n38794,6424\n38795,2105\n38796,1332\n38797,640\n38799,10\n38800,1323\n38801,102\n38802,1326\n38803,408\n38804,422\n38805,422\n38806,422\n38807,422\n38808,422\n38809,422\n38811,182\n38812,422\n38816,301\n38816,1782\n38817,652\n38818,4101\n38819,298\n38820,485\n38821,171\n38822,104\n38822,136\n38822,272\n38822,298\n38822,417\n38822,557\n38822,588\n38822,590\n38822,1001\n38822,1085\n38822,1474\n38822,2089\n38822,2253\n38822,2296\n38822,2572\n38822,2940\n38822,4220\n38822,4222\n38822,4237\n38822,75912\n38822,111142\n38822,127158\n38822,178576\n38823,457\n38824,4\n38824,5\n38825,137\n38826,1465\n38827,192\n38828,6750\n38829,66\n38830,3252\n38831,2867\n38831,22880\n38832,171\n38833,893\n38834,56\n38834,99\n38835,596\n38837,503\n38838,298\n38839,485\n38840,652\n38841,1893\n38842,1653\n38843,644\n38844,399\n38844,1175\n38845,2775\n38846,10\n38847,431\n38848,392\n38849,298\n38850,485\n38851,1414\n38852,4101\n38854,4611\n38855,1544\n38856,107\n38858,1893\n38859,313\n38859,356\n38859,477\n38859,781\n38859,852\n38859,1201\n38859,1571\n38859,1618\n38859,1881\n38859,2224\n38859,2266\n38859,2553\n38859,2944\n38859,6506\n38859,7698\n38859,8463\n38859,19443\n38859,28130\n38860,211\n38860,1782\n38860,1837\n38862,388\n38863,5265\n38864,1052\n38865,278\n38866,298\n38867,58\n38868,46\n38870,312\n38872,272\n38873,9195\n38875,79\n38876,534\n38877,8180\n38878,1782\n38879,868\n38880,171\n38881,5213\n38882,56\n38882,99\n38882,440\n38882,30331\n38882,60576\n38883,195\n38883,202\n38883,602\n38883,620\n38883,204124\n38884,717\n38885,1556\n38886,202\n38886,203\n38887,7360\n38888,1014\n38889,1983\n38890,171\n38891,171\n38892,457\n38892,818\n38893,187\n38893,222\n38893,968\n38893,2224\n38893,2421\n38894,620\n38894,1087\n38895,1284\n38896,338\n38896,360\n38896,809\n38896,2617\n38896,113878\n38897,184\n38898,1381\n38899,251\n38899,252\n38899,1220\n38900,2775\n38901,447\n38902,79\n38903,192\n38904,264\n38904,1224\n38905,10\n38906,510\n38907,827\n38907,1096\n38910,1203\n38910,1955\n38911,298\n38912,485\n38913,7233\n38914,392\n38915,873\n38916,932\n38917,503\n38918,273\n38918,274\n38919,5405\n38920,119\n38920,794\n38922,252\n38922,516\n38922,41170\n38923,509\n38923,872\n38924,171\n38926,920\n38926,2334\n38927,2931\n38928,34\n38928,35\n38929,647\n38930,344\n38931,775\n38932,1085\n38934,211\n38936,22\n38936,818\n38937,301\n38937,1231\n38937,1782\n38938,604\n38939,516\n38939,2775\n38940,1571\n38941,1014\n38942,1544\n38943,8270\n38944,81\n38944,272\n38945,298\n38946,485\n38947,516\n38949,301\n38950,192\n38951,259\n38952,1707\n38953,1388\n38953,142430\n38953,142473\n38953,142879\n38954,79\n38954,849\n38954,911\n38954,1243\n38954,1619\n38954,1888\n38955,493\n38955,586\n38955,1181\n38957,518\n38958,3003\n38959,750\n38959,783\n38959,1167\n38959,1284\n38959,1616\n38961,298\n38962,485\n38963,873\n38964,1133\n38965,247\n38966,34\n38966,35\n38966,217\n38966,536\n38967,298\n38968,485\n38969,38970\n38972,657\n38972,2421\n38972,6789\n38972,6824\n38973,485\n38974,631\n38974,1284\n38974,3695\n38974,148742\n38975,30331\n38978,298\n38979,485\n38980,38981\n38982,809\n38983,2116\n38984,1818\n38987,58\n38988,46\n38989,779\n38989,68069\n38989,141912\n38990,68\n38991,2116\n38992,1858\n38993,1860\n38994,301\n38994,2083\n38995,79\n38996,1\n38996,240\n38996,818\n38996,1298\n38997,515\n38999,63\n39000,1381\n39001,1715\n39002,72\n39003,3555\n39004,1181\n39004,1392\n39006,1858\n39007,1860\n39008,1983\n39009,592\n39010,79\n39010,158\n39010,1116\n39010,2209\n39011,167\n39011,301\n39012,251\n39012,252\n39012,1220\n39012,1222\n39013,167\n39014,195\n39015,1222\n39015,1803\n39015,3148\n39016,1506\n39017,4637\n39018,455\n39019,2266\n39020,217\n39021,2421\n39022,1201\n39023,314\n39024,83\n39024,119\n39024,347\n39024,364\n39024,372\n39024,389\n39024,417\n39024,455\n39024,525\n39024,626\n39024,795\n39024,805\n39024,907\n39024,972\n39024,1019\n39024,1085\n39024,1274\n39024,1298\n39024,1363\n39024,1465\n39024,1467\n39024,1718\n39024,1801\n39024,1881\n39024,2266\n39024,2286\n39024,2434\n39024,2553\n39024,2590\n39024,2646\n39024,4172\n39024,13575\n39025,206\n39026,389\n39027,579\n39027,2116\n39028,39029\n39028,39036\n39030,1400\n39031,1231\n39033,503\n39034,252\n39034,516\n39034,1220\n39035,30331\n39037,805\n39038,417\n39038,714\n39039,10\n39039,113156\n39040,163\n39040,811\n39041,640\n39042,805\n39043,2867\n39043,22880\n39044,58\n39045,1564\n39046,217\n39046,240\n39046,1287\n39047,1298\n39047,1635\n39047,2979\n39048,1429\n39049,4980\n39050,1181\n39051,30\n39052,273\n39052,274\n39052,66754\n39053,972\n39053,973\n39053,1284\n39054,439\n39055,697\n39055,838\n39056,209\n39056,1860\n39057,26\n39057,59\n39059,872\n39059,127158\n39060,2073\n39061,79\n39062,178\n39064,1319\n39065,891\n39066,467\n39066,1181\n39068,298\n39069,485\n39070,111\n39070,1177\n39070,1287\n39070,1893\n39070,3695\n39070,8180\n39071,32\n39071,392\n39071,697\n39071,3003\n39072,1858\n39073,1860\n39074,376\n39075,885\n39076,65\n39076,868\n39077,557\n39078,158\n39079,1235\n39079,1335\n39080,717\n39081,83\n39082,120\n39082,919\n39082,2620\n39084,280\n39084,17245\n39085,3\n39086,83\n39087,104\n39088,1962\n39089,581\n39090,79\n39091,850\n39092,151\n39093,39094\n39095,287\n39095,809\n39095,893\n39096,32\n39097,79\n39098,447\n39099,589\n39100,6068\n39101,22\n39102,392\n39103,44\n39104,2116\n39105,289\n39105,290\n39105,631\n39105,94134\n39106,298\n39107,485\n39108,4\n39108,5\n39109,292\n39110,3138\n39111,1319\n39113,298\n39114,485\n39116,392\n39116,918\n39117,83\n39117,1949\n39118,503\n39119,247\n39120,167\n39121,4903\n39123,615\n39124,704\n39125,704\n39126,298\n39127,158\n39128,571\n39128,18831\n39128,21442\n39129,158\n39130,1745\n39131,1511\n39131,3069\n39132,652\n39133,30\n39134,433\n39135,111\n39136,557\n39137,209\n39137,302\n39138,83\n39140,333\n39141,83\n39142,240\n39142,1085\n39143,20\n39145,247\n39146,1381\n39147,140\n39150,1531\n39152,292\n39153,83\n39154,2867\n39154,2868\n39154,22880\n39155,115\n39155,118\n39156,406\n39158,39159\n39158,105304\n39158,117178\n39158,121807\n39158,127702\n39158,132166\n39160,557\n39161,296\n39162,83\n39163,818\n39164,30\n39164,63\n39164,1309\n39165,483\n39166,1749\n39167,392\n39167,918\n39169,1085\n39170,439\n39171,39172\n39173,202\n39173,203\n39173,2371\n39174,2506\n39175,2506\n39176,9560\n39177,217\n39177,577\n39177,1429\n39178,251\n39179,1285\n39180,225\n39181,106\n39182,271\n39183,2867\n39183,22880\n39184,749\n39185,2506\n39186,7155\n39187,250\n39188,72\n39189,872\n39190,298\n39191,485\n39192,393\n39193,424\n39194,39195\n39196,1\n39197,2089\n39197,9536\n39198,557\n39199,298\n39200,485\n39202,557\n39203,269\n39204,39205\n39206,972\n39207,83\n39208,784\n39209,481\n39210,39211\n39212,58\n39213,151\n39214,1983\n39215,58\n39215,107\n39215,647\n39215,1353\n39216,2116\n39217,298\n39218,485\n39219,305\n39220,1392\n39221,192\n39222,298\n39223,485\n39224,344\n39225,500\n39226,1962\n39227,1052\n39228,1882\n39229,2775\n39230,54\n39231,2210\n39231,4237\n39232,518\n39232,631\n39232,968\n39232,1326\n39232,2205\n39232,2206\n39233,298\n39234,485\n39235,147\n39236,298\n39237,485\n39238,22\n39238,211\n39238,366\n39239,39240\n39239,90283\n39241,39241\n39242,1149\n39243,585\n39244,431\n39244,697\n39244,3260\n39245,1388\n39246,39247\n39248,399\n39248,1983\n39249,211\n39250,1\n39251,261\n39252,13136\n39253,120\n39254,1402\n39255,298\n39256,485\n39257,393\n39258,1807\n39259,843\n39260,1531\n39261,298\n39262,485\n39263,1179\n39263,21603\n39264,10\n39265,195\n39266,980\n39267,240\n39268,3297\n39269,2017\n39270,137\n39271,151\n39272,4594\n39273,631\n39274,10\n39275,1085\n39276,875\n39277,39278\n39279,149\n39280,503\n39280,1287\n39281,26\n39281,59\n39281,994\n39281,1432\n39282,2351\n39283,5366\n39284,1544\n39285,340\n39285,1623\n39285,1837\n39287,79\n39288,720\n39288,43203\n39289,309\n39289,310\n39290,158\n39290,875\n39290,2775\n39291,6682\n39292,920\n39292,1623\n39293,39294\n39295,1556\n39296,515\n39297,332\n39298,10\n39299,1381\n39299,1551\n39300,240\n39300,417\n39301,171\n39302,784\n39302,2105\n39302,2750\n39303,175\n39304,39304\n39305,346\n39306,58\n39306,107\n39306,647\n39306,1353\n39307,215\n39307,289\n39307,290\n39307,417\n39307,631\n39307,1016\n39307,1085\n39307,1212\n39307,1257\n39307,1285\n39307,1511\n39307,1564\n39307,2205\n39307,3069\n39307,33424\n39308,72\n39309,323\n39310,2506\n39311,72\n39312,200\n39312,1177\n39313,273\n39313,274\n39314,340\n39315,1983\n39316,346\n39317,39318\n39319,39318\n39320,14483\n39321,712\n39322,39323\n39324,1\n39325,39326\n39327,39328\n39327,81582\n39327,99954\n39327,107479\n39327,113269\n39327,113699\n39329,505\n39330,1010\n39332,3148\n39334,609\n39334,1140\n39334,1688\n39334,2701\n39334,3474\n39334,190963\n39335,2735\n39336,39337\n39338,39339\n39338,57733\n39338,98938\n39338,102639\n39340,1140\n39340,3474\n39341,422\n39342,56\n39343,10\n39344,422\n39345,56\n39346,2923\n39347,39348\n39349,39350\n39351,346\n39352,346\n39353,346\n39354,206\n39355,626\n39356,81\n39357,217\n39357,278\n39357,536\n39357,577\n39358,39359\n39360,137\n39361,63\n39363,39364\n39365,8854\n39366,949\n39366,9743\n39367,827\n39367,893\n39368,10\n39369,39370\n39371,219\n39372,872\n39373,1\n39374,5440\n39375,1238\n39376,298\n39377,485\n39378,3724\n39379,872\n39380,1434\n39381,83\n39382,1452\n39383,516\n39384,7\n39385,7\n39387,39388\n39389,63\n39390,714\n39390,736\n39390,1282\n39390,1659\n39391,579\n39392,3451\n39392,3452\n39393,7\n39394,7\n39395,298\n39396,485\n39398,83\n39399,2178\n39399,4545\n39400,1977\n39400,1978\n39401,2116\n39402,611\n39404,313\n39405,39406\n39407,406\n39409,703\n39410,868\n39411,306\n39411,307\n39412,671\n39412,1096\n39412,1287\n39412,1623\n39412,81233\n39413,366\n39414,366\n39415,366\n39416,366\n39417,366\n39418,366\n39419,366\n39421,292\n39422,366\n39423,366\n39424,366\n39425,489\n39426,273\n39426,274\n39426,313\n39427,433\n39428,2574\n39429,615\n39430,10\n39431,107\n39432,298\n39433,485\n39434,39435\n39436,48\n39436,140\n39437,1\n39437,147\n39437,149\n39437,171\n39437,184\n39437,1623\n39438,5250\n39439,30\n39439,595\n39439,872\n39439,1151\n39439,4039\n39439,19010\n39440,298\n39441,485\n39442,893\n39443,720\n39444,313\n39444,1052\n39444,2421\n39445,720\n39445,6059\n39446,457\n39446,515\n39446,557\n39446,581\n39446,868\n39446,941\n39446,1130\n39446,2373\n39447,640\n39448,640\n39449,298\n39450,485\n39451,720\n39452,640\n39453,259\n39456,3\n39456,312\n39456,390\n39456,702\n39456,873\n39456,1140\n39456,1454\n39456,1801\n39456,2045\n39457,640\n39458,640\n39459,640\n39460,671\n39461,278\n39462,1313\n39463,50\n39463,79\n39463,147\n39463,158\n39463,178\n39463,192\n39463,285\n39463,406\n39463,620\n39463,622\n39463,779\n39463,1181\n39463,1515\n39463,1531\n39463,2931\n39463,4192\n39463,4193\n39463,102560\n39463,240174\n39465,340\n39466,1769\n39467,1243\n39468,1323\n39469,102\n39470,1326\n39471,408\n39472,32\n39473,668\n39473,1607\n39474,435\n39476,611\n39476,1370\n39477,652\n39478,5662\n39479,247\n39480,389\n39480,536\n39483,875\n39484,1515\n39485,1655\n39486,138\n39488,30\n39489,500\n39490,298\n39491,485\n39492,10\n39492,113156\n39493,2668\n39494,422\n39495,83\n39497,422\n39498,422\n39499,422\n39500,1332\n39501,422\n39502,422\n39503,422\n39504,1181\n39505,424\n39506,615\n39506,3422\n39507,2671\n39508,872\n39508,1072\n39510,893\n39510,21736\n39512,81\n39513,1204\n39514,39515\n39514,130391\n39516,344\n39517,1238\n39518,83\n39519,147\n39520,34\n39520,35\n39520,907\n39520,1001\n39520,1133\n39520,1284\n39520,1715\n39520,9018\n39520,19946\n39521,77\n39522,151\n39523,657\n39524,668\n39527,1\n39528,953\n39529,4101\n39530,292\n39530,811\n39530,893\n39530,1319\n39530,1740\n39531,17476\n39532,1\n39532,827\n39532,1247\n39532,1305\n39533,457\n39534,1085\n39536,160\n39536,457\n39536,972\n39537,217\n39537,477\n39537,536\n39537,781\n39537,1019\n39537,1871\n39537,2168\n39537,2553\n39537,2646\n39537,2944\n39537,7698\n39538,1983\n39539,30331\n39540,255\n39541,3\n39542,360\n39543,877\n39543,1623\n39543,145502\n39544,30331\n39545,1429\n39546,704\n39547,30331\n39548,1227\n39548,1229\n39549,106\n39550,349\n39551,273\n39551,274\n39552,202\n39552,203\n39552,251\n39552,467\n39552,1385\n39553,1707\n39555,195\n39556,599\n39557,893\n39558,1010\n39560,718\n39561,54\n39561,536\n39561,1019\n39561,2224\n39561,2646\n39561,5906\n39561,6789\n39562,972\n39562,973\n39562,1284\n39562,35654\n39563,39564\n39564,15693\n39564,40550\n39565,644\n39566,167\n39567,4101\n39568,273\n39568,274\n39569,2334\n39570,1631\n39571,6323\n39572,19\n39572,891\n39572,1756\n39572,13137\n39573,2244\n39574,784\n39575,126\n39575,397\n39576,406\n39577,252\n39577,318\n39577,516\n39577,1220\n39577,1222\n39577,2567\n39579,225\n39579,248\n39579,1332\n39579,5405\n39580,65\n39580,586\n39581,515\n39582,697\n39583,873\n39583,1210\n39584,39585\n39586,126\n39587,160\n39587,264\n39587,1289\n39588,2315\n39590,1977\n39590,1978\n39591,217\n39591,1417\n39592,859\n39593,46\n39593,604\n39593,744\n39593,762\n39593,1293\n39594,2286\n39595,107\n39595,298\n39595,1955\n39595,3474\n39596,403\n39597,1149\n39598,65\n39599,77\n39600,34\n39600,298\n39600,1715\n39600,1955\n39600,2620\n39601,3555\n39602,4355\n39603,1449\n39604,1143\n39605,859\n39605,138686\n39606,893\n39608,83\n39609,390\n39610,435\n39611,2828\n39612,1014\n39613,298\n39614,485\n39615,1220\n39615,1222\n39616,252\n39617,251\n39618,3\n39618,10\n39618,19\n39618,30\n39618,32\n39618,34\n39618,35\n39618,37\n39618,41\n39618,44\n39618,48\n39618,50\n39618,56\n39618,58\n39618,63\n39618,65\n39618,68\n39618,72\n39618,77\n39618,79\n39618,81\n39618,83\n39618,85\n39618,86\n39618,97\n39618,99\n39618,104\n39618,106\n39618,107\n39618,111\n39618,116\n39618,120\n39618,130\n39618,134\n39618,135\n39618,136\n39618,137\n39618,138\n39618,140\n39618,146\n39618,149\n39618,158\n39618,167\n39618,178\n39618,186\n39618,192\n39618,195\n39618,200\n39618,202\n39618,203\n39618,211\n39618,215\n39618,217\n39618,222\n39618,225\n39618,227\n39618,233\n39618,240\n39618,248\n39618,251\n39618,252\n39618,254\n39618,261\n39618,264\n39618,272\n39618,278\n39618,283\n39618,285\n39618,287\n39618,289\n39618,290\n39618,292\n39618,294\n39618,296\n39618,298\n39618,301\n39618,302\n39618,304\n39618,309\n39618,310\n39618,312\n39618,313\n39618,315\n39618,323\n39618,326\n39618,328\n39618,332\n39618,333\n39618,337\n39618,346\n39618,347\n39618,349\n39618,358\n39618,364\n39618,366\n39618,372\n39618,379\n39618,388\n39618,390\n39618,392\n39618,393\n39618,406\n39618,415\n39618,417\n39618,420\n39618,422\n39618,431\n39618,433\n39618,435\n39618,439\n39618,442\n39618,444\n39618,447\n39618,455\n39618,459\n39618,477\n39618,479\n39618,493\n39618,500\n39618,509\n39618,510\n39618,515\n39618,516\n39618,518\n39618,525\n39618,536\n39618,538\n39618,557\n39618,575\n39618,577\n39618,586\n39618,588\n39618,589\n39618,590\n39618,592\n39618,599\n39618,602\n39618,605\n39618,609\n39618,615\n39618,620\n39618,622\n39618,623\n39618,626\n39618,631\n39618,634\n39618,636\n39618,640\n39618,647\n39618,649\n39618,652\n39618,653\n39618,657\n39618,660\n39618,663\n39618,664\n39618,671\n39618,682\n39618,687\n39618,694\n39618,702\n39618,704\n39618,714\n39618,717\n39618,718\n39618,720\n39618,726\n39618,736\n39618,749\n39618,752\n39618,760\n39618,772\n39618,779\n39618,781\n39618,783\n39618,784\n39618,788\n39618,801\n39618,805\n39618,808\n39618,809\n39618,811\n39618,818\n39618,832\n39618,841\n39618,850\n39618,859\n39618,861\n39618,862\n39618,868\n39618,872\n39618,873\n39618,874\n39618,875\n39618,893\n39618,907\n39618,919\n39618,920\n39618,932\n39618,934\n39618,943\n39618,949\n39618,968\n39618,973\n39618,980\n39618,996\n39618,999\n39618,1001\n39618,1007\n39618,1010\n39618,1012\n39618,1016\n39618,1019\n39618,1033\n39618,1052\n39618,1068\n39618,1072\n39618,1078\n39618,1082\n39618,1085\n39618,1102\n39618,1117\n39618,1119\n39618,1122\n39618,1124\n39618,1132\n39618,1133\n39618,1140\n39618,1143\n39618,1149\n39618,1151\n39618,1167\n39618,1175\n39618,1179\n39618,1181\n39618,1210\n39618,1220\n39618,1222\n39618,1231\n39618,1235\n39618,1238\n39618,1240\n39618,1241\n39618,1243\n39618,1247\n39618,1274\n39618,1282\n39618,1284\n39618,1285\n39618,1289\n39618,1294\n39618,1298\n39618,1300\n39618,1309\n39618,1313\n39618,1326\n39618,1332\n39618,1335\n39618,1353\n39618,1359\n39618,1363\n39618,1368\n39618,1370\n39618,1381\n39618,1388\n39618,1392\n39618,1425\n39618,1436\n39618,1447\n39618,1449\n39618,1452\n39618,1453\n39618,1454\n39618,1462\n39618,1465\n39618,1466\n39618,1467\n39618,1474\n39618,1479\n39618,1509\n39618,1512\n39618,1515\n39618,1522\n39618,1531\n39618,1544\n39618,1551\n39618,1564\n39618,1572\n39618,1579\n39618,1590\n39618,1612\n39618,1616\n39618,1631\n39618,1634\n39618,1635\n39618,1639\n39618,1644\n39618,1653\n39618,1659\n39618,1688\n39618,1715\n39618,1722\n39618,1732\n39618,1749\n39618,1782\n39618,1785\n39618,1789\n39618,1796\n39618,1801\n39618,1807\n39618,1818\n39618,1821\n39618,1832\n39618,1836\n39618,1837\n39618,1844\n39618,1849\n39618,1858\n39618,1860\n39618,1871\n39618,1877\n39618,1881\n39618,1888\n39618,1893\n39618,1927\n39618,1939\n39618,1955\n39618,1962\n39618,1968\n39618,1985\n39618,2045\n39618,2083\n39618,2087\n39618,2105\n39618,2116\n39618,2168\n39618,2178\n39618,2191\n39618,2205\n39618,2206\n39618,2209\n39618,2210\n39618,2224\n39618,2244\n39618,2260\n39618,2266\n39618,2274\n39618,2286\n39618,2296\n39618,2334\n39618,2353\n39618,2372\n39618,2379\n39618,2421\n39618,2424\n39618,2436\n39618,2443\n39618,2572\n39618,2607\n39618,2620\n39618,2646\n39618,2671\n39618,2699\n39618,2775\n39618,2782\n39618,2784\n39618,2797\n39618,2812\n39618,2931\n39618,2944\n39618,2979\n39618,2989\n39618,2991\n39618,2995\n39618,3069\n39618,3085\n39618,3115\n39618,3135\n39618,3138\n39618,3182\n39618,3193\n39618,3218\n39618,3252\n39618,3258\n39618,3260\n39618,3319\n39618,3328\n39618,3367\n39618,3370\n39618,3413\n39618,3422\n39618,3474\n39618,3507\n39618,3538\n39618,3612\n39618,3623\n39618,3695\n39618,3804\n39618,3876\n39618,3999\n39618,4039\n39618,4146\n39618,4220\n39618,4222\n39618,4223\n39618,4237\n39618,4455\n39618,4545\n39618,4549\n39618,4637\n39618,4771\n39618,4823\n39618,5212\n39618,5301\n39618,5405\n39618,5440\n39618,5662\n39618,5667\n39618,5718\n39618,5874\n39618,5911\n39618,5933\n39618,5992\n39618,6027\n39618,6059\n39618,6068\n39618,6119\n39618,6298\n39618,6357\n39618,6424\n39618,6506\n39618,6661\n39618,6789\n39618,6888\n39618,6955\n39618,7092\n39618,7155\n39618,7194\n39618,7768\n39618,8180\n39618,8192\n39618,8463\n39618,8537\n39618,8884\n39618,9001\n39618,9015\n39618,9024\n39618,9029\n39618,9030\n39618,9743\n39618,13137\n39618,13361\n39618,13541\n39618,13546\n39618,14126\n39618,14453\n39618,14556\n39618,14819\n39618,14945\n39618,15573\n39618,16019\n39618,16331\n39618,19010\n39618,19443\n39618,21442\n39618,21982\n39618,22280\n39618,22293\n39618,23287\n39618,28107\n39618,28693\n39618,30331\n39618,31517\n39618,32751\n39618,33424\n39618,35486\n39618,37088\n39618,37414\n39618,42064\n39618,44725\n39618,45437\n39618,48505\n39618,50176\n39618,72439\n39618,88010\n39618,88016\n39618,88018\n39619,907\n39619,1522\n39619,1837\n39619,2083\n39620,79\n39622,347\n39622,702\n39622,873\n39622,874\n39622,1133\n39622,1313\n39623,527\n39623,740\n39623,741\n39623,743\n39624,1590\n39625,1052\n39626,1655\n39627,779\n39628,718\n39628,1893\n39629,920\n39630,1858\n39631,1860\n39632,222\n39632,356\n39633,623\n39634,1858\n39635,1860\n39636,788\n39637,240\n39638,859\n39639,1608\n39640,292\n39641,264\n39641,1381\n39641,1509\n39641,1893\n39642,227\n39642,2051\n39643,149\n39643,192\n39643,406\n39643,1181\n39643,220502\n39644,1837\n39645,79\n39647,557\n39648,4\n39648,5\n39648,137\n39648,275\n39648,424\n39648,668\n39648,991\n39648,1058\n39648,1718\n39648,2048\n39648,3345\n39648,9013\n39648,9029\n39648,24763\n39650,37\n39650,301\n39650,1782\n39651,19\n39652,99\n39652,14352\n39652,125569\n39653,10\n39655,775\n39656,63\n39656,149\n39656,202\n39656,203\n39656,301\n39656,1012\n39656,1326\n39656,1370\n39656,1411\n39656,1512\n39656,1849\n39656,3089\n39656,5992\n39657,1968\n39658,1893\n39660,1962\n39661,32\n39661,349\n39661,875\n39661,1117\n39661,3260\n39662,151\n39663,2319\n39664,1274\n39665,973\n39666,2178\n39666,4545\n39666,56150\n39667,4222\n39668,83\n39669,1962\n39670,247\n39671,34\n39671,35\n39672,1247\n39674,859\n39675,163\n39675,2116\n39675,3769\n39676,206\n39676,309\n39676,310\n39676,577\n39676,1400\n39676,21944\n39677,34\n39677,35\n39678,39679\n39680,273\n39680,274\n39681,6323\n39682,219\n39682,264\n39682,760\n39684,217\n39684,240\n39684,483\n39684,1181\n39685,1571\n39686,390\n39687,240\n39687,1118\n39688,1858\n39689,1860\n39691,818\n39692,313\n39693,240\n39693,818\n39694,720\n39696,1113\n39698,240\n39699,151\n39700,10\n39700,1559\n39700,2574\n39701,5192\n39702,346\n39702,1313\n39705,285\n39706,500\n39706,718\n39706,4066\n39707,247\n39708,158\n39708,202\n39708,203\n39708,248\n39708,393\n39708,577\n39708,602\n39708,1010\n39708,1179\n39708,1240\n39708,1274\n39708,2784\n39708,5301\n39708,5405\n39709,1893\n39710,424\n39711,1102\n39712,557\n39713,30\n39714,211\n39715,516\n39716,875\n39717,79\n39717,247\n39717,252\n39717,372\n39717,1181\n39718,6068\n39718,7092\n39719,5591\n39720,83\n39721,83\n39723,389\n39723,2671\n39723,3252\n39724,34\n39724,35\n39724,111\n39724,120\n39724,178\n39724,217\n39724,283\n39724,392\n39724,435\n39724,455\n39724,518\n39724,536\n39724,631\n39724,694\n39724,805\n39724,873\n39724,968\n39724,996\n39724,1033\n39724,1240\n39724,1326\n39724,1722\n39724,1801\n39724,1977\n39724,1978\n39724,2045\n39724,2699\n39724,2989\n39724,2991\n39724,3135\n39724,3182\n39724,3538\n39724,3585\n39724,6955\n39724,8180\n39724,14797\n39725,934\n39726,1608\n39728,79\n39729,994\n39730,256\n39730,444\n39730,567\n39730,604\n39730,615\n39730,668\n39730,698\n39730,762\n39730,877\n39730,1837\n39731,349\n39733,39734\n39735,2146\n39737,536\n39738,72\n39739,660\n39740,809\n39741,20771\n39742,3193\n39743,5308\n39744,920\n39745,1282\n39746,1085\n39746,75912\n39747,158\n39748,247\n39749,1556\n39750,805\n39751,147\n39751,158\n39752,269\n39753,298\n39754,485\n39755,920\n39756,1608\n39757,1235\n39757,1335\n39758,1381\n39759,217\n39759,1417\n39760,841\n39761,39762\n39761,66813\n39761,112051\n39761,118999\n39761,120611\n39761,172380\n39763,302\n39764,151\n39765,920\n39766,980\n39768,146\n39769,83\n39770,304\n39770,442\n39771,107\n39772,240\n39773,35905\n39774,273\n39774,274\n39775,644\n39775,2274\n39776,44\n39777,557\n39778,557\n39779,557\n39780,8719\n39781,138\n39782,865\n39783,557\n39784,137\n39785,118\n39785,4597\n39786,8719\n39787,138\n39788,865\n39789,557\n39790,137\n39791,118\n39791,4597\n39792,202\n39792,203\n39793,8719\n39794,138\n39795,865\n39796,557\n39797,137\n39798,118\n39798,4597\n39799,8719\n39800,138\n39801,865\n39802,557\n39803,137\n39804,118\n39804,4597\n39805,39806\n39805,68069\n39805,105230\n39807,298\n39808,485\n39810,872\n39810,1151\n39811,1\n39812,489\n39813,39814\n39815,424\n39816,39817\n39816,61607\n39816,64339\n39816,65269\n39816,66179\n39818,2646\n39819,278\n39820,72\n39821,346\n39822,102\n39822,2416\n39822,2417\n39823,39824\n39823,89122\n39825,2048\n39826,973\n39827,313\n39827,356\n39828,17557\n39829,298\n39830,485\n39831,1133\n39832,39833\n39832,51539\n39832,89090\n39832,94566\n39834,346\n39835,118\n39835,4597\n39836,3295\n39837,15573\n39838,30\n39839,1608\n39840,843\n39841,399\n39841,536\n39842,309\n39843,6119\n39844,1298\n39845,2574\n39846,500\n39847,1962\n39848,1052\n39849,1882\n39850,2775\n39851,54\n39852,2210\n39852,4237\n39854,1\n39855,289\n39855,290\n39856,39857\n39858,2929\n39859,23701\n39860,563\n39861,39862\n39863,13\n39864,39865\n39866,8788\n39867,39868\n39867,50249\n39869,298\n39870,485\n39871,2506\n39872,72\n39873,30\n39874,83\n39875,784\n39876,447\n39877,2931\n39878,39879\n39880,81\n39881,907\n39882,424\n39883,640\n39884,72\n39885,39886\n39887,39888\n39889,2572\n39890,483\n39892,1181\n39893,973\n39894,2146\n39895,874\n39896,240\n39897,337\n39897,563\n39897,663\n39897,664\n39898,589\n39899,8788\n39900,2351\n39901,39902\n39905,255\n39906,72\n39907,225\n39908,2929\n39909,171\n39910,8884\n39911,2744\n39912,1085\n39913,1033\n39914,586\n39914,1243\n39915,71\n39916,872\n39917,5310\n39918,5440\n39919,211\n39920,310\n39921,3161\n39922,3\n39923,2572\n39924,39925\n39924,103651\n39926,233\n39927,65\n39928,39929\n39931,68\n39932,366\n39933,366\n39934,366\n39935,366\n39936,366\n39937,366\n39938,366\n39939,72\n39940,366\n39941,366\n39942,366\n39943,366\n39944,366\n39945,366\n39946,366\n39947,366\n39948,2590\n39949,1238\n39950,1452\n39952,35905\n39954,39955\n39956,2929\n39957,23701\n39959,5469\n39960,294\n39961,433\n39962,211\n39963,1019\n39963,3370\n39964,306\n39964,307\n39965,1623\n39966,58\n39966,107\n39966,647\n39966,1353\n39966,3115\n39967,4\n39967,5\n39968,63\n39969,644\n39970,1323\n39971,102\n39972,1326\n39973,408\n39974,79\n39974,111\n39974,192\n39975,298\n39976,485\n39977,579\n39977,1257\n39978,258\n39980,72\n39981,3246\n39981,3247\n39984,718\n39985,640\n39986,3069\n39990,602\n39991,39992\n39993,72\n39994,50\n39994,63\n39994,147\n39994,251\n39994,516\n39994,602\n39994,1247\n39995,184\n39996,1769\n39997,467\n39998,298\n39999,485\n40000,718\n40001,1452\n40002,431\n40003,1274\n40004,422\n40005,422\n40006,422\n40007,422\n40008,422\n40009,422\n40010,422\n40011,422\n40012,392\n40013,309\n40013,310\n40013,1243\n40014,289\n40014,290\n40015,40016\n40018,1019\n40019,40020\n40021,146\n40022,1801\n40023,63\n40023,158\n40023,192\n40023,252\n40023,493\n40023,516\n40023,602\n40023,1220\n40023,1222\n40024,72\n40025,18739\n40026,818\n40027,671\n40028,760\n40029,72\n40030,3\n40031,44\n40032,72\n40033,422\n40034,56\n40036,1247\n40037,422\n40038,56\n40040,1363\n40041,72\n40042,258\n40043,72\n40044,99\n40045,1515\n40046,13\n40046,3161\n40047,2929\n40047,23701\n40048,72\n40049,310\n40049,3039\n40050,72\n40051,1715\n40051,5405\n40052,1353\n40053,503\n40053,596\n40054,40055\n40056,72\n40057,72\n40058,2209\n40059,72\n40060,151\n40061,720\n40062,2051\n40063,31977\n40064,31977\n40065,298\n40066,72\n40067,2351\n40068,818\n40070,309\n40070,310\n40071,760\n40072,438\n40073,704\n40074,40075\n40076,1631\n40077,272\n40078,1619\n40079,1479\n40080,1332\n40081,40082\n40083,40084\n40085,40086\n40087,267\n40088,1133\n40089,79\n40090,2351\n40091,79\n40092,7652\n40093,893\n40094,40095\n40094,85415\n40094,110396\n40094,264875\n40096,40097\n40098,491\n40098,2156\n40099,34\n40099,35\n40099,217\n40099,222\n40099,536\n40099,1724\n40099,1881\n40099,2646\n40099,2671\n40099,6888\n40099,7092\n40099,13980\n40100,72\n40101,3069\n40102,1749\n40103,72\n40104,640\n40105,40106\n40107,40108\n40109,40108\n40110,779\n40111,40108\n40112,1639\n40113,760\n40113,1149\n40113,1631\n40114,40115\n40114,105477\n40114,246351\n40116,97\n40117,40118\n40119,151\n40120,298\n40121,485\n40122,10\n40123,346\n40124,2506\n40125,4548\n40126,254\n40127,250\n40127,1684\n40128,450\n40129,644\n40130,1467\n40131,267\n40133,483\n40134,9010\n40135,515\n40136,34\n40136,35\n40137,704\n40138,2371\n40138,22580\n40139,885\n40139,13704\n40140,40141\n40142,8788\n40143,187\n40144,40145\n40146,392\n40147,4193\n40147,8822\n40148,1133\n40148,3247\n40148,7363\n40149,907\n40150,40151\n40152,289\n40152,290\n40153,40154\n40156,40157\n40158,40159\n40160,40161\n40162,28072\n40163,40164\n40165,264\n40166,289\n40166,290\n40167,4980\n40168,71\n40169,134\n40169,137\n40169,138\n40169,248\n40169,4276\n40170,10\n40171,233\n40172,1634\n40173,850\n40175,40176\n40177,107\n40178,2416\n40178,2417\n40179,292\n40180,338\n40181,366\n40182,366\n40183,298\n40184,366\n40185,366\n40186,366\n40187,1133\n40188,3538\n40189,366\n40190,366\n40191,366\n40192,366\n40193,489\n40195,392\n40196,147\n40197,704\n40198,158\n40198,577\n40198,1634\n40199,278\n40200,2506\n40201,872\n40202,872\n40203,872\n40204,872\n40205,872\n40206,346\n40207,171\n40208,34\n40208,35\n40209,1572\n40210,40211\n40212,178\n40213,171\n40214,72\n40215,10\n40215,34\n40215,35\n40215,50\n40215,97\n40215,104\n40215,146\n40215,158\n40215,192\n40215,206\n40215,217\n40215,222\n40215,240\n40215,264\n40215,285\n40215,304\n40215,406\n40215,444\n40215,455\n40215,571\n40215,589\n40215,620\n40215,631\n40215,652\n40215,772\n40215,932\n40215,968\n40215,1001\n40215,1085\n40215,1122\n40215,1151\n40215,1515\n40215,1531\n40215,1572\n40215,1659\n40215,1715\n40215,1782\n40215,1962\n40215,2626\n40215,2931\n40215,5343\n40215,9007\n40215,68069\n40216,707\n40217,72\n40218,1102\n40219,269\n40220,41\n40220,442\n40220,557\n40220,588\n40220,590\n40220,636\n40220,1119\n40220,1282\n40220,1368\n40220,1745\n40220,2205\n40220,2286\n40220,33424\n40221,22\n40222,346\n40223,119\n40224,346\n40225,333\n40226,1247\n40226,5265\n40227,30\n40227,1133\n40227,2073\n40227,2351\n40227,15573\n40228,783\n40229,900\n40230,40231\n40232,298\n40233,485\n40234,50\n40234,158\n40234,195\n40234,406\n40234,455\n40234,588\n40234,590\n40234,620\n40234,1033\n40235,805\n40235,1506\n40237,1285\n40238,202\n40238,203\n40239,640\n40240,433\n40241,743\n40242,422\n40243,56\n40244,422\n40245,56\n40246,640\n40247,40248\n40249,872\n40250,422\n40251,56\n40252,119\n40253,302\n40253,687\n40253,1556\n40254,2379\n40256,192\n40256,457\n40256,2253\n40257,310\n40257,483\n40257,515\n40257,1132\n40257,3039\n40258,4101\n40259,557\n40260,1033\n40261,207\n40262,240\n40263,255\n40264,704\n40265,850\n40266,640\n40267,47\n40267,442\n40267,805\n40267,1119\n40267,2469\n40267,21944\n40268,298\n40269,485\n40270,298\n40271,485\n40272,2411\n40273,298\n40274,485\n40275,40276\n40277,1227\n40277,1229\n40278,1096\n40279,1912\n40280,9195\n40284,40285\n40286,298\n40287,485\n40288,809\n40288,68069\n40288,141912\n40289,206\n40290,2590\n40291,1363\n40291,1893\n40292,1983\n40293,664\n40293,20359\n40294,34\n40294,1767\n40295,8855\n40296,290\n40296,1235\n40296,8992\n40297,2995\n40298,1980\n40298,8991\n40299,206\n40300,483\n40301,298\n40302,485\n40303,149\n40304,40305\n40306,273\n40306,274\n40307,40308\n40309,255\n40310,298\n40311,485\n40312,72\n40313,1085\n40314,72\n40315,294\n40316,481\n40317,1893\n40318,58\n40319,46\n40320,1319\n40321,818\n40322,557\n40323,862\n40324,557\n40325,557\n40326,557\n40327,40328\n40329,3695\n40330,1082\n40331,160\n40332,980\n40333,202\n40333,203\n40333,873\n40334,980\n40335,366\n40336,366\n40337,673\n40338,1298\n40339,760\n40340,298\n40341,485\n40342,40343\n40344,1191\n40344,1192\n40344,2253\n40344,6824\n40345,273\n40345,274\n40346,346\n40347,298\n40348,485\n40349,1707\n40350,1769\n40351,272\n40352,298\n40353,485\n40354,65\n40355,1332\n40355,1572\n40356,298\n40357,485\n40358,611\n40359,40360\n40361,5366\n40362,346\n40363,346\n40364,273\n40364,274\n40365,2411\n40366,323\n40368,40369\n40371,1149\n40372,269\n40374,48\n40375,323\n40376,809\n40377,40378\n40379,111\n40379,652\n40379,1453\n40379,1572\n40379,1722\n40379,2626\n40379,3538\n40379,14458\n40380,40381\n40382,40383\n40382,41442\n40384,40383\n40384,41442\n40385,40386\n40387,1458\n40388,557\n40390,40391\n40390,107400\n40392,994\n40392,33444\n40392,40393\n40394,40157\n40395,40396\n40395,49761\n40395,50760\n40395,56217\n40395,61106\n40395,66615\n40395,68069\n40395,89334\n40395,93913\n40395,95372\n40395,95506\n40395,97485\n40395,109682\n40395,109732\n40395,110313\n40395,111854\n40397,1453\n40398,40399\n40400,65\n40401,40402\n40403,1313\n40404,292\n40405,784\n40406,294\n40407,40408\n40407,51852\n40407,67582\n40407,102906\n40409,296\n40410,298\n40411,557\n40412,17772\n40413,2574\n40414,366\n40415,366\n40416,366\n40417,366\n40418,366\n40419,50\n40419,147\n40419,158\n40419,406\n40419,620\n40419,779\n40419,1776\n40419,2931\n40419,8822\n40420,784\n40421,1133\n40422,195\n40423,137\n40424,328\n40424,7124\n40425,298\n40426,485\n40427,323\n40428,298\n40429,485\n40430,1\n40431,1893\n40432,10\n40433,99\n40434,79\n40435,30\n40435,240\n40435,302\n40436,40437\n40438,704\n40439,3555\n40440,106\n40440,1888\n40441,1973\n40442,15\n40442,292\n40442,1572\n40442,1634\n40442,3769\n40443,1968\n40444,175\n40445,358\n40446,425\n40446,1276\n40447,772\n40448,252\n40448,318\n40448,41170\n40449,3247\n40449,17588\n40450,660\n40451,147\n40452,79\n40453,299\n40453,1122\n40453,1544\n40454,79\n40456,1012\n40459,1858\n40460,1860\n40462,697\n40463,255\n40464,1132\n40465,781\n40466,1132\n40467,781\n40468,306\n40468,307\n40469,657\n40469,221333\n40470,22\n40472,1858\n40473,1860\n40474,433\n40474,1634\n40475,392\n40475,1151\n40476,1849\n40477,259\n40478,671\n40479,344\n40480,1010\n40481,72\n40482,40483\n40484,72\n40485,50\n40486,111\n40486,3538\n40486,9006\n40487,392\n40487,644\n40488,671\n40489,184\n40490,743\n40491,5130\n40493,3872\n40494,248\n40495,1181\n40498,1973\n40498,3507\n40499,3413\n40500,222\n40500,455\n40500,1019\n40501,171\n40502,1140\n40502,2443\n40503,79\n40504,1659\n40505,2506\n40507,192\n40508,10\n40509,298\n40510,485\n40511,32\n40511,911\n40512,206\n40513,167\n40513,299\n40513,301\n40513,5662\n40513,73570\n40514,149\n40514,184\n40514,859\n40514,1619\n40514,1623\n40515,40516\n40517,4039\n40519,1132\n40520,781\n40521,1803\n40522,40523\n40524,467\n40524,872\n40524,1001\n40525,72\n40526,932\n40527,79\n40528,1634\n40529,1715\n40530,32\n40530,392\n40530,697\n40530,809\n40531,217\n40531,240\n40531,264\n40531,1417\n40531,1796\n40531,3804\n40532,1688\n40533,1243\n40534,273\n40534,274\n40535,104\n40535,147\n40535,5213\n40536,1983\n40537,1893\n40538,1724\n40539,104\n40540,455\n40541,1300\n40542,493\n40542,682\n40542,1220\n40542,1222\n40542,72439\n40543,647\n40544,344\n40545,422\n40548,1893\n40549,178\n40550,39564\n40551,137\n40554,40555\n40556,602\n40557,932\n40558,140\n40558,287\n40558,809\n40558,19010\n40559,151\n40560,1238\n40561,920\n40562,2617\n40562,3507\n40563,720\n40564,40565\n40566,313\n40566,389\n40566,660\n40566,2424\n40566,2646\n40566,5933\n40566,6506\n40566,19443\n40567,255\n40568,609\n40569,682\n40569,72439\n40570,620\n40571,202\n40571,203\n40571,718\n40572,217\n40573,192\n40574,302\n40576,301\n40577,298\n40578,485\n40579,704\n40579,1732\n40580,626\n40581,500\n40582,1962\n40583,1052\n40584,1882\n40585,2775\n40586,54\n40587,2210\n40587,4237\n40588,929\n40588,1127\n40588,1400\n40588,1566\n40589,588\n40589,590\n40589,714\n40590,1849\n40591,259\n40592,1132\n40593,781\n40594,1556\n40595,1949\n40596,500\n40597,1962\n40598,1052\n40599,1882\n40600,2775\n40601,54\n40602,2210\n40602,4237\n40603,500\n40604,217\n40604,1118\n40604,1796\n40605,809\n40607,1132\n40608,781\n40609,5405\n40610,623\n40610,1805\n40612,79\n40614,1849\n40615,827\n40616,79\n40617,500\n40618,1962\n40619,1052\n40620,1882\n40621,2775\n40622,54\n40623,2210\n40623,4237\n40624,602\n40625,14989\n40626,79\n40627,79\n40628,79\n40629,731\n40630,500\n40631,1962\n40632,1052\n40633,1882\n40634,2775\n40635,54\n40636,2210\n40636,4237\n40637,2775\n40638,79\n40639,602\n40640,79\n40641,2105\n40642,1085\n40642,1284\n40643,264\n40643,349\n40643,652\n40643,2312\n40643,3260\n40645,72\n40646,50\n40646,79\n40647,40648\n40649,4066\n40650,72\n40651,24505\n40652,1983\n40653,83\n40654,79\n40655,1243\n40656,2506\n40657,873\n40657,1210\n40658,63\n40658,79\n40659,1132\n40660,781\n40661,2506\n40662,1132\n40663,781\n40664,10\n40665,20\n40667,83\n40668,15119\n40669,34\n40669,35\n40669,217\n40669,283\n40669,536\n40669,1019\n40670,392\n40672,1893\n40673,171\n40674,907\n40674,932\n40676,1977\n40676,1978\n40677,1893\n40678,1210\n40679,298\n40680,143\n40681,485\n40682,261\n40682,694\n40682,852\n40682,2812\n40683,1539\n40684,298\n40685,485\n40687,40688\n40689,18726\n40690,240\n40690,1085\n40692,920\n40693,143\n40694,314\n40695,973\n40696,1\n40697,1949\n40698,200\n40698,1105\n40698,1177\n40699,120\n40699,1175\n40700,40701\n40702,1224\n40703,217\n40703,392\n40703,1072\n40703,3252\n40703,4637\n40704,2506\n40705,647\n40706,344\n40707,1707\n40708,1512\n40708,5992\n40709,336\n40710,503\n40711,647\n40712,344\n40713,287\n40713,462\n40713,595\n40713,1033\n40713,1052\n40715,1132\n40716,781\n40717,271\n40718,408\n40718,491\n40718,827\n40719,1370\n40720,577\n40721,1858\n40722,1860\n40723,332\n40723,577\n40723,788\n40723,980\n40723,27041\n40724,579\n40724,893\n40725,1858\n40726,1860\n40727,1858\n40728,1860\n40730,151\n40731,34\n40731,35\n40732,657\n40733,393\n40734,1722\n40735,1132\n40736,781\n40737,13661\n40738,1132\n40739,781\n40740,422\n40740,918\n40740,1118\n40740,1844\n40741,973\n40742,2105\n40743,2828\n40744,500\n40745,1962\n40746,1052\n40747,1882\n40748,2775\n40749,54\n40750,2210\n40750,4237\n40751,4190\n40752,79\n40753,79\n40754,4190\n40755,973\n40755,51421\n40756,2775\n40757,50\n40757,79\n40758,1984\n40758,3949\n40759,1163\n40760,302\n40760,861\n40760,893\n40761,1132\n40762,781\n40763,415\n40764,158\n40765,973\n40766,1556\n40767,298\n40768,485\n40769,1132\n40770,781\n40771,647\n40772,344\n40773,7652\n40774,2105\n40775,2590\n40776,309\n40776,310\n40776,1635\n40776,1688\n40776,6556\n40777,219\n40779,40780\n40781,72\n40783,623\n40783,1143\n40783,1374\n40784,1749\n40786,40787\n40788,1132\n40789,781\n40790,34\n40790,35\n40790,536\n40790,4672\n40791,247\n40793,3297\n40795,657\n40795,809\n40796,779\n40797,175\n40799,134\n40799,248\n40800,240\n40801,1715\n40802,536\n40803,779\n40804,647\n40805,344\n40806,79\n40806,604\n40807,1370\n40808,2367\n40810,2626\n40811,920\n40812,657\n40812,2224\n40812,13980\n40814,1388\n40815,72\n40816,40817\n40818,40819\n40821,660\n40822,72\n40823,349\n40824,818\n40825,5987\n40826,72\n40827,3193\n40829,1019\n40829,2646\n40829,13661\n40830,1983\n40831,273\n40831,274\n40832,393\n40832,1531\n40833,171\n40834,1132\n40835,781\n40836,640\n40837,72\n40838,1893\n40839,22\n40839,873\n40840,1803\n40841,137\n40842,225\n40843,500\n40844,1962\n40845,1052\n40846,1882\n40847,2775\n40848,54\n40849,2210\n40849,4237\n40850,760\n40850,1285\n40851,694\n40851,781\n40851,1419\n40851,2116\n40852,72\n40853,344\n40854,285\n40855,313\n40855,1140\n40855,1718\n40856,1132\n40857,781\n40858,500\n40859,1962\n40860,1052\n40861,1285\n40862,1882\n40863,2775\n40864,54\n40865,2210\n40865,4237\n40866,192\n40868,3507\n40869,1007\n40871,255\n40872,285\n40873,406\n40873,779\n40874,147\n40875,1085\n40876,1203\n40876,1955\n40877,3148\n40878,151\n40879,5405\n40880,366\n40881,206\n40882,788\n40883,772\n40884,392\n40885,171\n40886,217\n40886,278\n40887,1844\n40888,387\n40890,509\n40890,595\n40890,1453\n40891,299\n40892,72\n40893,48\n40894,267\n40895,1052\n40896,483\n40896,6556\n40897,483\n40898,1359\n40899,2379\n40900,972\n40901,3960\n40902,72\n40904,72\n40905,247\n40906,40907\n40908,184\n40909,920\n40910,50\n40911,40912\n40911,57849\n40911,63627\n40913,298\n40914,439\n40915,79\n40916,222\n40917,143\n40918,809\n40919,15\n40920,1858\n40921,1860\n40922,135\n40922,138\n40923,644\n40924,1033\n40925,171\n40926,79\n40927,346\n40928,255\n40928,2991\n40929,79\n40930,1381\n40931,79\n40933,1782\n40934,171\n40935,23010\n40936,390\n40936,534\n40936,1085\n40937,79\n40938,1556\n40939,79\n40940,9121\n40941,2379\n40942,68\n40942,193129\n40943,344\n40944,160\n40945,40946\n40947,3830\n40948,68\n40948,301\n40949,40950\n40951,40950\n40952,40950\n40953,40954\n40955,388\n40956,2045\n40957,247\n40957,184349\n40959,272\n40960,563\n40961,255\n40962,83\n40963,86\n40964,3218\n40965,1893\n40966,5310\n40967,604\n40968,72\n40969,344\n40970,285\n40972,264\n40974,143\n40975,26\n40975,59\n40975,885\n40976,143\n40977,1287\n40978,875\n40979,40980\n40981,264\n40981,1007\n40981,1289\n40981,1381\n40981,1551\n40983,79\n40984,40985\n40986,4831\n40987,907\n40987,932\n40987,73570\n40989,298\n40990,485\n40991,1381\n40992,1227\n40992,1229\n40993,135\n40993,298\n40993,588\n40993,590\n40993,1119\n40993,2205\n40993,33424\n40993,48505\n40993,58979\n40993,88266\n40994,1227\n40994,1229\n40995,525\n40995,1140\n40995,2209\n40997,500\n40998,1962\n40999,1052\n41000,1882\n41001,2775\n41002,54\n41003,2210\n41003,4237\n41004,920\n41005,41006\n41007,264\n41008,264\n41009,41010\n41011,379\n41012,1955\n41013,640\n41014,41015\n41016,893\n41017,1572\n41018,158\n41019,217\n41020,41021\n41022,250\n41022,1684\n41023,138\n41023,579\n41024,1871\n41025,83\n41025,536\n41025,4672\n41025,7698\n41028,1707\n41029,1749\n41030,1467\n41031,1368\n41032,4\n41032,5\n41032,8270\n41033,1381\n41034,261\n41035,41036\n41037,920\n41038,1046\n41039,280\n41039,364\n41039,485\n41039,920\n41039,2590\n41039,4220\n41039,17245\n41039,66297\n41039,193129\n41040,1\n41041,10\n41041,113156\n41042,41043\n41044,1181\n41045,93\n41045,94\n41046,422\n41047,56\n41048,6303\n41049,72\n41050,206\n41050,41051\n41052,14366\n41053,949\n41054,72\n41055,779\n41056,1102\n41057,1175\n41058,137\n41058,779\n41059,406\n41059,779\n41060,872\n41061,41062\n41061,135295\n41063,41064\n41065,275\n41066,4039\n41067,41068\n41069,81\n41070,442\n41071,41072\n41073,41074\n41075,808\n41076,440\n41077,1332\n41078,104\n41078,850\n41079,818\n41080,489\n41081,233\n41082,81\n41083,873\n41084,873\n41084,2209\n41085,4831\n41089,3447\n41090,596\n41091,2995\n41092,622\n41093,1132\n41094,781\n41095,1381\n41096,366\n41096,500\n41096,682\n41096,72439\n41097,422\n41098,56\n41099,392\n41100,3451\n41100,3452\n41101,702\n41101,703\n41102,1893\n41103,83\n41103,505\n41105,770\n41106,818\n41106,1210\n41106,127158\n41108,19443\n41109,366\n41110,366\n41111,366\n41112,366\n41113,366\n41114,366\n41115,366\n41116,366\n41117,366\n41118,366\n41119,366\n41120,366\n41121,366\n41122,7117\n41123,8855\n41125,207\n41126,306\n41126,307\n41127,298\n41128,485\n41130,483\n41131,435\n41132,392\n41133,79\n41134,1688\n41135,255\n41136,217\n41136,818\n41136,3182\n41137,83\n41137,415\n41138,79\n41140,873\n41141,1767\n41142,171\n41143,147\n41144,22\n41145,634\n41146,192\n41146,439\n41147,356\n41147,615\n41148,779\n41148,1181\n41149,1323\n41150,102\n41151,1326\n41152,408\n41155,615\n41156,1058\n41157,389\n41159,1332\n41161,505\n41162,1010\n41163,996\n41164,26\n41164,59\n41165,158\n41165,1181\n41166,50\n41166,79\n41167,19443\n41168,393\n41169,372\n41170,252\n41170,516\n41170,1220\n41170,1222\n41171,3804\n41172,158\n41173,509\n41173,3538\n41175,79\n41175,178\n41175,827\n41176,255\n41177,255\n41178,2775\n41179,3724\n41180,388\n41181,422\n41182,422\n41183,422\n41184,422\n41185,422\n41186,422\n41187,422\n41188,422\n41189,422\n41190,1836\n41191,340\n41191,611\n41192,200\n41193,422\n41194,79\n41195,2750\n41196,48\n41197,1722\n41199,171\n41200,202\n41200,203\n41201,79\n41202,200\n41203,5375\n41204,18831\n41206,818\n41206,1149\n41206,3507\n41207,388\n41207,852\n41209,200\n41210,206\n41211,589\n41212,346\n41213,1\n41213,20\n41213,22\n41213,48\n41213,72\n41213,104\n41213,130\n41213,135\n41213,137\n41213,146\n41213,151\n41213,163\n41213,192\n41213,207\n41213,209\n41213,247\n41213,250\n41213,251\n41213,252\n41213,256\n41213,258\n41213,259\n41213,262\n41213,264\n41213,272\n41213,273\n41213,275\n41213,278\n41213,280\n41213,283\n41213,289\n41213,290\n41213,299\n41213,302\n41213,305\n41213,306\n41213,307\n41213,313\n41213,314\n41213,315\n41213,326\n41213,330\n41213,337\n41213,338\n41213,347\n41213,352\n41213,356\n41213,406\n41213,581\n41213,752\n41213,801\n41213,852\n41213,972\n41213,994\n41213,1133\n41213,1151\n41213,1313\n41213,1381\n41213,1684\n41213,1818\n41213,2266\n41213,4771\n41213,9457\n41213,17245\n41213,94134\n41214,79\n41215,26\n41215,59\n41216,79\n41217,932\n41219,79\n41220,1068\n41221,48\n41221,65\n41221,120\n41221,285\n41221,438\n41221,599\n41221,660\n41221,795\n41221,818\n41221,868\n41221,1122\n41221,1454\n41221,1801\n41221,1849\n41221,2480\n41221,2646\n41221,2699\n41222,2889\n41223,81\n41224,996\n41225,8854\n41227,200\n41228,41229\n41230,175\n41230,252\n41230,314\n41230,332\n41230,446\n41230,452\n41230,599\n41230,623\n41230,685\n41230,693\n41230,1014\n41230,1619\n41230,1973\n41230,9457\n41231,115\n41231,118\n41233,83\n41234,1436\n41234,2979\n41235,893\n41236,252\n41236,318\n41236,779\n41236,41170\n41237,505\n41238,233\n41238,372\n41238,3135\n41239,1010\n41240,200\n41242,433\n41242,1634\n41243,2775\n41244,957\n41244,1815\n41245,41246\n41248,233\n41248,372\n41249,1634\n41250,1506\n41251,1634\n41252,97\n41253,483\n41253,36761\n41254,1132\n41255,781\n41256,24505\n41257,743\n41258,217\n41258,1118\n41258,1417\n41259,41260\n41261,233\n41262,920\n41263,626\n41264,215\n41265,1127\n41265,1522\n41265,1893\n41265,2312\n41266,4101\n41267,872\n41269,79\n41270,450\n41270,1400\n41270,3623\n41271,200\n41272,852\n41273,192\n41275,467\n41276,32\n41276,392\n41276,697\n41276,809\n41277,79\n41278,200\n41279,818\n41280,200\n41281,2646\n41282,1429\n41283,309\n41283,310\n41283,1891\n41285,222\n41285,247\n41285,273\n41285,274\n41285,304\n41285,347\n41285,644\n41285,994\n41285,1402\n41285,1801\n41285,2995\n41285,4545\n41286,631\n41286,3467\n41287,1147\n41289,72\n41290,1188\n41291,2995\n41292,1019\n41293,3370\n41293,14453\n41294,211\n41295,644\n41296,875\n41297,717\n41298,287\n41300,22\n41302,58\n41303,46\n41305,389\n41306,30\n41307,1707\n41308,22\n41310,261\n41311,158\n41312,9026\n41313,83\n41315,1298\n41316,577\n41316,788\n41317,1454\n41317,1732\n41320,1634\n41321,302\n41321,2116\n41322,283\n41322,718\n41323,86\n41324,200\n41325,140\n41325,264\n41325,515\n41326,41327\n41326,75112\n41328,200\n41329,994\n41329,1707\n41329,1888\n41331,356\n41332,431\n41332,968\n41333,455\n41333,1019\n41334,251\n41334,631\n41334,59931\n41335,1983\n41336,72\n41336,296\n41336,312\n41336,323\n41336,479\n41336,525\n41336,647\n41336,991\n41336,1052\n41336,1188\n41336,1267\n41336,1579\n41336,1659\n41336,1707\n41336,1749\n41336,2260\n41336,2605\n41336,3585\n41336,3695\n41336,13538\n41336,49057\n41337,178\n41339,571\n41340,1977\n41340,1978\n41341,455\n41342,20\n41342,435\n41342,1590\n41343,652\n41345,309\n41345,310\n41345,358\n41345,483\n41345,868\n41345,1326\n41345,81233\n41346,302\n41346,861\n41347,200\n41347,392\n41348,10\n41349,22\n41350,79\n41351,1240\n41351,76096\n41353,439\n41354,2828\n41355,809\n41356,1983\n41357,136\n41357,137\n41357,1479\n41358,310\n41359,314\n41359,3367\n41360,784\n41361,79\n41361,1619\n41362,298\n41363,485\n41364,1634\n41365,356\n41366,60576\n41367,10\n41368,515\n41369,999\n41370,83\n41371,3260\n41372,34\n41372,35\n41373,1096\n41375,1\n41376,861\n41378,314\n41378,315\n41378,447\n41378,509\n41378,875\n41378,142409\n41378,146280\n41378,159365\n41379,41380\n41381,333\n41383,83\n41384,79\n41385,99\n41385,147\n41385,178\n41385,192\n41385,206\n41385,602\n41385,640\n41385,1181\n41385,1515\n41385,2244\n41387,247\n41390,393\n41392,861\n41394,1326\n41395,760\n41395,1631\n41395,2620\n41396,473\n41396,8149\n41397,779\n41398,1127\n41399,83\n41400,298\n41401,485\n41403,298\n41404,485\n41406,140\n41407,36398\n41409,83\n41410,4549\n41411,349\n41412,2274\n41413,111\n41414,13745\n41415,32\n41416,392\n41417,779\n41418,366\n41419,697\n41420,809\n41421,1240\n41422,1151\n41423,1515\n41424,66\n41425,1836\n41426,509\n41427,1590\n41428,158\n41428,206\n41429,149\n41429,406\n41430,47\n41430,2469\n41431,21408\n41432,779\n41433,18831\n41434,328\n41434,7124\n41435,314\n41435,510\n41435,538\n41435,875\n41435,934\n41435,1424\n41435,6661\n41435,146280\n41435,159365\n41436,652\n41436,1893\n41437,5591\n41438,287\n41439,2617\n41440,1133\n41443,222\n41444,302\n41445,877\n41446,3474\n41447,34\n41447,35\n41447,455\n41448,106\n41448,1370\n41450,385\n41450,1274\n41450,37088\n41451,158\n41452,920\n41453,1151\n41453,1893\n41454,298\n41455,485\n41456,664\n41456,2178\n41456,4545\n41457,10\n41457,217\n41457,2574\n41457,19005\n41458,50\n41459,247\n41460,21408\n41461,41462\n41461,83453\n41463,233\n41464,19\n41464,415\n41464,1072\n41464,1571\n41464,1871\n41464,2424\n41464,2944\n41465,1579\n41466,79\n41467,450\n41468,652\n41469,298\n41470,1722\n41471,784\n41472,1608\n41473,83\n41474,217\n41476,595\n41477,115\n41477,118\n41478,509\n41478,1043\n41478,19010\n41479,298\n41480,81\n41481,1127\n41482,83\n41483,1805\n41484,515\n41485,264\n41486,595\n41487,151\n41488,1849\n41489,1837\n41490,222\n41490,644\n41490,1858\n41490,2989\n41490,2991\n41491,48\n41492,4\n41492,5\n41494,54\n41495,2296\n41496,79\n41498,510\n41499,1608\n41500,217\n41502,6695\n41503,182\n41504,178\n41504,538\n41504,622\n41505,184\n41506,483\n41507,2105\n41508,104\n41508,557\n41508,953\n41508,954\n41509,663\n41509,664\n41510,516\n41511,575\n41511,697\n41512,5987\n41513,158\n41514,217\n41515,147\n41516,247\n41517,406\n41518,41519\n41522,920\n41523,510\n41524,254\n41525,104\n41526,690\n41527,431\n41528,167\n41528,240\n41528,301\n41528,1160\n41528,1564\n41528,1818\n41528,73570\n41529,41530\n41529,88070\n41531,1326\n41532,388\n41533,3\n41534,10\n41535,1370\n41536,1551\n41537,2411\n41538,269\n41538,20771\n41539,376\n41540,885\n41541,219\n41541,1803\n41542,63\n41543,273\n41543,274\n41544,147\n41545,79\n41545,111\n41545,202\n41545,203\n41545,333\n41545,586\n41545,1370\n41546,278\n41546,455\n41547,772\n41548,86\n41548,178\n41548,1635\n41548,1891\n41548,20757\n41549,1298\n41550,278\n41550,283\n41551,1127\n41551,1711\n41551,1836\n41552,1603\n41552,6861\n41553,3413\n41554,1181\n41555,3\n41556,326\n41557,146\n41558,10\n41559,1\n41560,8854\n41562,20\n41563,1983\n41565,207\n41566,406\n41567,356\n41567,615\n41568,843\n41569,818\n41570,406\n41571,1983\n41572,72\n41573,805\n41574,298\n41575,485\n41576,298\n41577,485\n41578,859\n41579,1740\n41580,81\n41581,8854\n41582,516\n41583,372\n41584,171\n41585,557\n41586,557\n41587,4146\n41588,1284\n41588,4504\n41589,72\n41590,589\n41590,1001\n41590,1085\n41590,2296\n41590,2590\n41591,4637\n41592,6298\n41593,1274\n41594,202\n41594,203\n41594,366\n41594,500\n41595,2735\n41596,1983\n41597,41598\n41599,2244\n41600,1163\n41601,30236\n41602,497\n41602,1175\n41603,30\n41603,175\n41603,328\n41604,2146\n41605,2048\n41606,151\n41607,41608\n41609,861\n41610,8180\n41611,1085\n41612,41613\n41614,1608\n41615,2782\n41615,4548\n41616,269\n41617,250\n41617,1684\n41618,41619\n41620,72\n41621,71\n41621,104\n41621,611\n41621,704\n41621,1319\n41621,1368\n41621,2367\n41622,1983\n41623,1235\n41623,1335\n41624,8788\n41625,758\n41625,3695\n41626,818\n41627,1181\n41628,1085\n41629,275\n41630,3724\n41631,119\n41631,151\n41631,192\n41631,309\n41631,310\n41631,1400\n41631,2073\n41631,13910\n41632,605\n41632,843\n41632,907\n41632,1293\n41632,3138\n41633,1227\n41633,1229\n41633,1252\n41633,1253\n41633,21944\n41633,86416\n41634,7155\n41635,79\n41636,323\n41637,1033\n41638,1740\n41639,932\n41640,422\n41641,41642\n41643,83\n41644,459\n41645,1402\n41646,392\n41647,1243\n41648,772\n41649,41650\n41651,2244\n41652,493\n41652,586\n41652,1265\n41652,1266\n41652,1370\n41653,536\n41654,872\n41655,2146\n41656,305\n41656,447\n41656,538\n41656,671\n41656,190492\n41657,269\n41658,269\n41659,931\n41660,893\n41661,704\n41662,809\n41663,1881\n41664,195\n41665,32\n41665,34\n41665,35\n41665,202\n41665,203\n41665,283\n41665,392\n41665,536\n41665,623\n41665,996\n41665,1001\n41665,1201\n41665,1274\n41665,1467\n41665,1644\n41665,2045\n41665,2266\n41665,2671\n41665,2699\n41665,2784\n41665,3252\n41665,4549\n41665,7092\n41665,13546\n41666,211\n41667,872\n41668,1\n41668,94\n41668,184\n41668,206\n41668,2787\n41669,743\n41670,704\n41671,577\n41672,207\n41673,980\n41674,5440\n41675,211\n41676,1381\n41677,2436\n41678,8907\n41679,3260\n41680,1556\n41681,72\n41682,760\n41682,1818\n41683,2590\n41684,255\n41685,41686\n41687,1\n41687,20\n41687,22\n41687,48\n41687,63\n41687,72\n41687,79\n41687,81\n41687,86\n41687,104\n41687,107\n41687,130\n41687,135\n41687,137\n41687,146\n41687,147\n41687,149\n41687,151\n41687,163\n41687,178\n41687,182\n41687,184\n41687,192\n41687,206\n41687,207\n41687,209\n41687,217\n41687,240\n41687,247\n41687,250\n41687,251\n41687,252\n41687,254\n41687,256\n41687,258\n41687,259\n41687,262\n41687,264\n41687,269\n41687,272\n41687,273\n41687,274\n41687,275\n41687,277\n41687,278\n41687,280\n41687,283\n41687,289\n41687,290\n41687,299\n41687,302\n41687,305\n41687,306\n41687,307\n41687,309\n41687,310\n41687,313\n41687,314\n41687,315\n41687,318\n41687,326\n41687,330\n41687,337\n41687,338\n41687,340\n41687,347\n41687,352\n41687,356\n41687,406\n41687,435\n41687,465\n41687,516\n41687,525\n41687,538\n41687,581\n41687,626\n41687,647\n41687,649\n41687,668\n41687,736\n41687,752\n41687,801\n41687,805\n41687,808\n41687,843\n41687,852\n41687,861\n41687,893\n41687,920\n41687,934\n41687,954\n41687,972\n41687,994\n41687,1019\n41687,1133\n41687,1147\n41687,1151\n41687,1179\n41687,1201\n41687,1210\n41687,1220\n41687,1222\n41687,1247\n41687,1309\n41687,1313\n41687,1381\n41687,1434\n41687,1449\n41687,1452\n41687,1465\n41687,1509\n41687,1644\n41687,1684\n41687,1707\n41687,1796\n41687,1818\n41687,1844\n41687,1949\n41687,1973\n41687,2048\n41687,2260\n41687,2266\n41687,2421\n41687,2837\n41687,3989\n41687,3999\n41687,4771\n41687,4903\n41687,5326\n41687,5718\n41687,5996\n41687,6059\n41687,8993\n41687,9457\n41687,10318\n41687,16019\n41687,16687\n41687,17245\n41687,21944\n41687,41170\n41687,66754\n41687,94134\n41687,106502\n41688,779\n41689,3246\n41689,3247\n41690,620\n41691,41692\n41693,158\n41694,192\n41695,1515\n41696,192\n41697,703\n41698,779\n41699,41700\n41701,158\n41702,704\n41703,9195\n41704,41705\n41704,43927\n41704,48293\n41706,285\n41707,2931\n41708,620\n41709,41710\n41711,134\n41712,8854\n41713,843\n41714,41715\n41716,41717\n41716,43825\n41718,158\n41719,41720\n41721,1381\n41722,233\n41723,106\n41724,385\n41725,1531\n41726,298\n41727,485\n41728,1133\n41729,178\n41730,1238\n41731,473\n41731,8149\n41732,2351\n41733,1452\n41734,298\n41735,485\n41736,589\n41736,1085\n41737,298\n41738,485\n41739,1858\n41740,1860\n41741,3451\n41741,3452\n41742,147\n41743,50\n41744,861\n41745,192\n41746,1531\n41747,1877\n41748,366\n41749,1\n41749,1127\n41750,366\n41751,366\n41752,366\n41753,366\n41754,366\n41755,366\n41756,366\n41757,366\n41758,366\n41759,366\n41760,872\n41760,1127\n41760,1381\n41760,1893\n41760,6695\n41761,366\n41762,366\n41763,41764\n41765,366\n41766,406\n41767,1068\n41767,7087\n41767,18416\n41767,35661\n41767,40713\n41767,57025\n41768,397\n41769,1392\n41771,518\n41773,726\n41774,158\n41774,9166\n41775,160\n41776,306\n41776,307\n41777,34\n41777,35\n41779,20\n41779,86\n41779,136\n41779,151\n41779,206\n41779,222\n41779,273\n41779,310\n41779,344\n41779,459\n41779,485\n41779,567\n41779,579\n41779,628\n41779,666\n41779,744\n41779,762\n41779,811\n41779,868\n41779,1326\n41779,1424\n41779,1425\n41779,1572\n41779,1749\n41779,1849\n41779,2353\n41779,2701\n41779,3039\n41779,6279\n41779,69714\n41779,73959\n41779,76086\n41779,78030\n41779,80903\n41780,392\n41780,1363\n41782,4771\n41783,360\n41783,2051\n41784,23701\n41785,346\n41786,652\n41787,41788\n41789,41790\n41792,2995\n41793,255\n41794,1181\n41795,626\n41796,336\n41796,1089\n41796,6119\n41797,779\n41798,1479\n41799,493\n41800,195\n41801,158\n41801,779\n41801,4192\n41801,4193\n41802,184\n41803,622\n41804,772\n41804,1294\n41806,312\n41807,875\n41808,1749\n41809,1323\n41810,102\n41811,1326\n41812,408\n41813,79\n41814,422\n41815,422\n41816,1821\n41816,2867\n41816,22880\n41817,79\n41818,41819\n41820,1227\n41820,1229\n41822,4355\n41823,9121\n41824,227\n41825,704\n41826,26\n41826,59\n41826,3794\n41827,336\n41828,422\n41829,393\n41829,980\n41830,422\n41831,620\n41832,422\n41833,422\n41834,422\n41836,422\n41837,1688\n41838,18790\n41839,143\n41841,312\n41841,336\n41841,457\n41841,525\n41841,1274\n41844,336\n41845,217\n41845,536\n41845,13575\n41846,1102\n41847,2048\n41848,5547\n41849,298\n41851,3960\n41852,9560\n41852,16045\n41853,41853\n41854,657\n41854,1881\n41854,2779\n41854,5301\n41855,264\n41855,1659\n41855,2979\n41856,1266\n41856,1370\n41857,83\n41858,784\n41859,875\n41861,772\n41863,1707\n41864,752\n41865,592\n41866,32\n41866,392\n41866,697\n41866,809\n41867,433\n41867,1634\n41868,1983\n41869,3999\n41870,217\n41871,120\n41871,240\n41871,332\n41871,338\n41871,1293\n41871,1844\n41871,1955\n41871,11147\n41872,83\n41873,296\n41874,79\n41875,2989\n41875,2991\n41875,3367\n41875,13361\n41876,312\n41876,872\n41877,666\n41878,1231\n41879,184\n41879,673\n41880,349\n41880,1298\n41880,1805\n41880,3193\n41880,3260\n41881,1033\n41882,805\n41883,1274\n41884,379\n41885,980\n41885,1010\n41886,509\n41886,510\n41886,1453\n41886,150022\n41888,392\n41888,3260\n41889,1257\n41890,158\n41890,2646\n41891,843\n41892,79\n41892,333\n41893,838\n41893,1172\n41893,1796\n41893,1837\n41894,1181\n41895,248\n41895,364\n41896,1265\n41896,1266\n41897,1732\n41899,1143\n41900,1284\n41901,1732\n41902,758\n41903,907\n41903,932\n41906,442\n41907,171\n41907,788\n41907,841\n41907,920\n41908,41909\n41910,581\n41911,302\n41912,248\n41912,450\n41912,1332\n41913,41914\n41915,13\n41915,733\n41915,920\n41915,1085\n41915,1089\n41915,1293\n41915,1619\n41917,3653\n41918,390\n41919,605\n41920,589\n41921,6068\n41922,515\n41923,50\n41924,344\n41925,1539\n41926,1294\n41928,433\n41928,1634\n41929,1983\n41930,66\n41931,644\n41932,575\n41932,697\n41932,2045\n41933,21442\n41934,349\n41935,907\n41936,356\n41937,3003\n41938,261\n41939,1424\n41940,41941\n41943,861\n41944,20\n41945,79\n41946,3003\n41948,1556\n41949,301\n41949,304\n41949,752\n41949,968\n41950,417\n41951,261\n41951,1419\n41951,1466\n41952,147\n41952,158\n41952,184\n41953,1454\n41955,500\n41956,1962\n41957,1052\n41958,1882\n41959,2775\n41960,54\n41961,2210\n41961,4237\n41962,1509\n41963,968\n41964,2646\n41965,278\n41968,408\n41969,1257\n41970,2372\n41971,1707\n41973,1836\n41974,2674\n41974,16153\n41975,346\n41976,1977\n41976,1978\n41977,41978\n41979,349\n41979,644\n41980,79\n41980,694\n41980,2775\n41981,222\n41982,442\n41983,710\n41984,861\n41985,79\n41987,192\n41987,663\n41988,811\n41989,298\n41990,485\n41992,24505\n41993,3003\n41994,527\n41994,740\n41994,741\n41997,907\n41999,302\n42000,104\n42001,1590\n42002,1515\n42003,217\n42004,42005\n42004,68069\n42004,86832\n42004,104497\n42004,108706\n42004,109691\n42004,131470\n42004,167441\n42004,169205\n42004,170881\n42004,172523\n42004,213536\n42006,15\n42006,256\n42006,292\n42006,441\n42006,1572\n42006,1722\n42006,2889\n42007,3538\n42008,79\n42010,209\n42011,269\n42011,1070\n42011,1634\n42012,1891\n42013,579\n42014,42015\n42014,53663\n42016,151\n42017,489\n42018,79\n42019,758\n42020,302\n42021,710\n42022,872\n42023,42024\n42025,252\n42026,1801\n42027,873\n42029,289\n42029,290\n42029,417\n42029,1085\n42029,2296\n42029,3623\n42030,4455\n42031,97\n42032,1467\n42032,2421\n42033,79\n42034,3003\n42036,1235\n42036,1335\n42037,389\n42038,215\n42039,227\n42040,2701\n42041,328\n42042,1016\n42043,1722\n42044,383\n42045,111\n42046,3538\n42047,1332\n42048,1939\n42049,248\n42050,1882\n42051,850\n42052,9001\n42053,136\n42054,4771\n42055,9029\n42056,1745\n42057,1977\n42057,1978\n42058,7270\n42059,1016\n42060,718\n42061,302\n42062,5405\n42063,104\n42064,1\n42064,147\n42064,158\n42064,206\n42064,336\n42064,505\n42064,602\n42064,676\n42064,695\n42064,1425\n42064,1458\n42064,1518\n42064,1601\n42064,2037\n42064,2244\n42064,3449\n42064,4177\n42064,9394\n42064,15795\n42064,35439\n42064,42064\n42064,80266\n42064,142749\n42064,240174\n42065,167\n42066,704\n42067,1579\n42068,42069\n42068,53132\n42068,66083\n42068,69834\n42068,70377\n42068,71544\n42068,100978\n42068,104187\n42068,107513\n42068,109665\n42068,109672\n42068,110776\n42068,113734\n42068,113835\n42068,114774\n42068,115163\n42068,115555\n42068,122750\n42068,123580\n42068,123722\n42068,123977\n42068,124750\n42068,124829\n42068,125485\n42068,125771\n42068,125803\n42068,126112\n42068,128343\n42068,129369\n42068,129520\n42068,129906\n42068,130628\n42068,131106\n42068,131158\n42068,131176\n42068,132279\n42068,219901\n42070,120\n42070,261\n42070,694\n42070,949\n42072,42073\n42074,278\n42075,83\n42076,4611\n42077,1544\n42078,302\n42081,1179\n42082,1113\n42083,809\n42084,1837\n42085,687\n42086,1179\n42087,1001\n42088,1544\n42089,304\n42089,1188\n42090,298\n42091,485\n42092,1368\n42093,79\n42094,3538\n42095,1858\n42096,1860\n42097,42098\n42099,20771\n42100,111\n42101,1149\n42102,1179\n42103,312\n42104,557\n42105,72\n42106,42107\n42108,358\n42109,163\n42109,579\n42109,1673\n42110,206\n42111,7698\n42112,22\n42112,302\n42112,749\n42112,811\n42112,861\n42112,875\n42112,893\n42112,2017\n42113,1572\n42113,1688\n42114,509\n42114,1143\n42114,1454\n42116,34\n42116,35\n42116,240\n42116,332\n42116,809\n42116,1072\n42116,1564\n42116,1782\n42116,1837\n42116,3135\n42116,3695\n42117,79\n42118,500\n42119,195\n42119,393\n42119,32475\n42120,417\n42122,1429\n42124,192\n42125,859\n42126,247\n42127,1707\n42128,349\n42129,602\n42130,149\n42130,406\n42130,640\n42132,518\n42132,19443\n42133,206\n42134,10\n42135,252\n42135,406\n42136,146\n42136,589\n42136,3999\n42136,92476\n42137,149\n42138,195\n42139,652\n42140,1888\n42141,2617\n42141,31896\n42142,376\n42143,4771\n42146,298\n42147,146\n42148,37\n42148,71\n42148,563\n42148,611\n42148,920\n42148,1235\n42148,1335\n42148,1449\n42149,1837\n42150,10\n42151,8719\n42152,151\n42153,217\n42154,406\n42156,4823\n42157,86\n42158,1298\n42159,2590\n42160,302\n42161,233\n42161,372\n42162,65\n42162,571\n42163,72\n42164,1224\n42165,2048\n42166,106\n42166,192\n42166,285\n42166,306\n42166,307\n42166,337\n42166,346\n42166,393\n42166,406\n42166,435\n42166,447\n42166,516\n42166,538\n42166,620\n42166,1181\n42166,1370\n42166,1388\n42166,1515\n42166,1531\n42166,6119\n42167,527\n42168,805\n42169,42170\n42171,42172\n42173,500\n42174,366\n42175,417\n42176,42177\n42178,292\n42178,1453\n42179,264\n42179,1893\n42180,143\n42181,1893\n42182,158\n42184,72\n42186,217\n42186,1417\n42187,250\n42187,1684\n42188,247\n42188,2867\n42188,22880\n42189,83\n42190,1858\n42191,1860\n42192,843\n42193,309\n42193,310\n42194,219\n42195,1240\n42196,1837\n42197,13745\n42198,1634\n42199,1590\n42200,349\n42201,3\n42202,140\n42203,893\n42204,79\n42205,83\n42206,415\n42206,1293\n42207,973\n42207,1117\n42208,72\n42209,3507\n42210,120\n42211,3409\n42212,399\n42213,2779\n42214,272\n42215,31517\n42216,34\n42216,35\n42217,119\n42218,4594\n42219,42220\n42221,4252\n42222,1201\n42223,1801\n42224,50\n42225,781\n42226,9022\n42227,20771\n42228,332\n42229,3367\n42230,417\n42231,42232\n42233,2784\n42234,14126\n42235,1240\n42236,4549\n42237,323\n42238,85\n42239,2646\n42240,379\n42241,9098\n42242,8235\n42243,72\n42244,1146\n42245,473\n42246,264\n42246,304\n42246,599\n42247,1265\n42247,1266\n42248,483\n42249,258\n42250,217\n42251,602\n42252,500\n42253,1847\n42254,186\n42254,2979\n42255,1210\n42255,1801\n42256,83\n42257,1417\n42258,41\n42258,163\n42258,337\n42258,929\n42258,9024\n42259,980\n42260,42261\n42260,96873\n42262,3193\n42263,344\n42264,344\n42265,392\n42265,872\n42265,1240\n42265,4252\n42265,6955\n42266,99\n42267,247\n42268,72\n42269,42270\n42269,57516\n42269,77404\n42269,85534\n42269,86869\n42269,239480\n42271,298\n42272,485\n42273,83\n42274,2671\n42275,595\n42276,2607\n42277,42278\n42279,515\n42280,1085\n42281,294\n42283,42284\n42283,69337\n42283,83064\n42283,93631\n42283,97578\n42283,108745\n42283,176013\n42283,176161\n42285,195\n42285,5874\n42285,6119\n42285,16767\n42286,557\n42288,298\n42289,485\n42290,336\n42291,34\n42291,35\n42291,83\n42292,269\n42293,42294\n42293,45989\n42295,298\n42296,485\n42297,269\n42298,417\n42299,37759\n42300,557\n42301,557\n42303,195\n42304,652\n42305,515\n42305,652\n42305,1893\n42306,577\n42306,805\n42307,332\n42307,1058\n42308,31977\n42308,42309\n42308,43775\n42308,95849\n42308,108307\n42310,500\n42311,1962\n42312,1052\n42313,1882\n42314,2775\n42315,54\n42316,2210\n42316,4237\n42317,1556\n42318,1298\n42319,801\n42320,1715\n42321,1644\n42322,20\n42323,417\n42323,1177\n42324,6119\n42325,2837\n42326,1983\n42327,1118\n42328,10\n42329,79\n42330,83\n42331,3876\n42332,1085\n42333,485\n42333,859\n42334,718\n42335,167\n42335,217\n42335,240\n42335,390\n42335,444\n42335,589\n42335,631\n42335,932\n42335,968\n42335,1001\n42335,1010\n42335,1085\n42335,1231\n42335,1326\n42335,1531\n42335,1715\n42335,1962\n42335,2083\n42336,8270\n42337,1590\n42338,42339\n42340,718\n42341,430\n42342,1707\n42343,344\n42344,1149\n42345,704\n42346,195\n42346,2244\n42347,79\n42348,417\n42349,175\n42350,83\n42351,338\n42351,420\n42351,652\n42351,1453\n42351,1659\n42351,1688\n42351,2626\n42351,4039\n42352,861\n42353,2367\n42354,72\n42355,42356\n42357,10\n42358,42359\n42360,991\n42361,184\n42362,285\n42363,1188\n42364,294\n42365,704\n42366,3069\n42367,640\n42368,5265\n42369,347\n42370,26\n42370,59\n42371,481\n42372,1\n42373,1571\n42374,1515\n42375,2719\n42376,1305\n42377,872\n42378,2775\n42379,447\n42380,304\n42381,1454\n42382,42383\n42384,841\n42385,280\n42386,640\n42386,42387\n42388,1007\n42389,417\n42389,862\n42390,138\n42390,1227\n42390,1229\n42390,1252\n42390,1253\n42390,21944\n42390,86416\n42391,704\n42392,1235\n42392,1335\n42392,2931\n42393,323\n42394,805\n42395,301\n42395,968\n42395,1837\n42396,4355\n42397,1\n42398,42399\n42400,304\n42401,42402\n42403,42404\n42405,42404\n42406,704\n42407,366\n42408,366\n42409,366\n42410,366\n42411,366\n42412,366\n42413,366\n42414,366\n42415,2073\n42416,42417\n42418,42419\n42420,63\n42421,1167\n42422,2083\n42423,233\n42424,301\n42424,968\n42425,2351\n42426,483\n42427,515\n42429,3069\n42430,149\n42431,264\n42431,1509\n42432,1326\n42433,873\n42433,1479\n42433,2557\n42434,7768\n42435,1479\n42436,2574\n42437,42438\n42439,2178\n42439,4545\n42440,366\n42441,366\n42442,872\n42443,694\n42444,21408\n42445,1803\n42446,366\n42447,873\n42448,1235\n42448,1335\n42449,397\n42450,1381\n42452,1052\n42453,1012\n42453,1177\n42454,97\n42454,120\n42454,178\n42454,818\n42454,141912\n42455,34\n42455,35\n42456,79\n42457,209\n42458,1010\n42459,687\n42459,1556\n42460,42461\n42462,784\n42463,3960\n42465,1877\n42465,40497\n42466,500\n42467,306\n42467,307\n42468,42469\n42470,985\n42471,366\n42472,349\n42474,392\n42474,1146\n42475,671\n42476,620\n42476,3367\n42477,184\n42478,19\n42479,79\n42479,202\n42479,203\n42480,42481\n42482,6750\n42484,137\n42485,2775\n42486,447\n42487,602\n42487,620\n42487,8244\n42488,259\n42489,2995\n42490,473\n42490,8149\n42492,1181\n42493,147\n42493,158\n42493,80266\n42494,489\n42495,1368\n42496,72\n42497,1323\n42498,102\n42499,1326\n42500,408\n42501,104\n42501,557\n42501,953\n42501,954\n42501,1939\n42502,72\n42503,42504\n42505,483\n42506,178\n42507,79\n42508,50\n42508,1515\n42510,801\n42511,285\n42512,422\n42513,422\n42514,422\n42515,422\n42516,422\n42517,422\n42518,392\n42518,805\n42518,1179\n42519,422\n42520,9121\n42521,65\n42521,440\n42522,2526\n42523,20\n42523,269\n42523,346\n42523,349\n42523,439\n42523,752\n42523,760\n42523,868\n42523,1010\n42523,1289\n42523,1425\n42523,1515\n42523,1590\n42523,1644\n42524,868\n42524,1285\n42524,1289\n42524,1425\n42525,1927\n42526,1227\n42526,1229\n42527,255\n42528,1284\n42529,65\n42529,467\n42530,273\n42530,274\n42532,1983\n42534,1983\n42535,1608\n42536,83\n42537,301\n42537,518\n42537,720\n42537,795\n42537,1052\n42537,1326\n42537,1436\n42537,1837\n42537,2979\n42537,3218\n42538,503\n42539,217\n42540,200\n42541,200\n42541,772\n42542,1983\n42544,972\n42545,240\n42545,1203\n42545,1955\n42546,158\n42547,1767\n42548,9121\n42549,312\n42550,811\n42551,422\n42552,2051\n42553,1983\n42554,81\n42554,215\n42554,503\n42555,2296\n42556,42557\n42556,44660\n42556,47492\n42556,78377\n42556,81418\n42556,83497\n42556,86675\n42556,87654\n42556,89656\n42556,89999\n42556,93263\n42556,95980\n42556,101885\n42556,102056\n42556,106227\n42556,110423\n42558,1983\n42560,3872\n42560,7124\n42560,8868\n42561,479\n42561,953\n42562,48\n42562,710\n42563,500\n42564,147\n42564,1608\n42565,5405\n42566,602\n42567,1132\n42568,781\n42569,1776\n42570,42571\n42573,42574\n42575,292\n42575,462\n42575,852\n42575,1722\n42575,3367\n42575,3538\n42576,602\n42577,175\n42578,718\n42579,302\n42579,2116\n42580,202\n42581,2572\n42581,44725\n42582,289\n42582,290\n42582,417\n42582,1085\n42582,2205\n42582,2206\n42582,2296\n42582,33424\n42582,75912\n42582,94134\n42583,47\n42583,2469\n42584,209\n42586,366\n42588,723\n42589,310\n42590,356\n42590,852\n42591,366\n42592,1072\n42593,1070\n42593,15179\n42594,349\n42595,46\n42595,744\n42595,750\n42595,762\n42595,783\n42595,1293\n42595,1849\n42596,158\n42597,861\n42598,444\n42598,783\n42598,968\n42598,1160\n42598,1293\n42598,1300\n42598,3422\n42598,5662\n42599,392\n42599,631\n42599,1285\n42600,3695\n42603,13538\n42604,255\n42605,515\n42606,50\n42606,149\n42607,1983\n42608,1509\n42609,907\n42609,932\n42610,87\n42612,252\n42613,83\n42613,285\n42613,2779\n42613,2784\n42617,178\n42618,6888\n42619,1531\n42620,500\n42621,417\n42622,605\n42623,15573\n42624,818\n42625,4453\n42626,388\n42627,42628\n42629,393\n42630,17772\n42631,7233\n42632,2434\n42633,1298\n42634,2931\n42635,1634\n42636,626\n42637,2296\n42638,349\n42639,1877\n42640,29380\n42641,622\n42642,202\n42642,203\n42643,7572\n42644,586\n42645,1001\n42646,372\n42647,1294\n42648,264\n42649,2671\n42650,973\n42651,6068\n42652,4455\n42653,192\n42654,1007\n42655,510\n42656,3507\n42657,1085\n42658,86\n42659,563\n42660,861\n42661,1590\n42662,1639\n42663,140\n42664,515\n42665,227\n42666,435\n42667,8798\n42668,1133\n42669,697\n42670,1363\n42671,718\n42672,3238\n42673,158\n42674,34\n42674,1467\n42674,21290\n42674,41877\n42674,43155\n42674,43164\n42674,43167\n42674,43259\n42674,44069\n42674,44457\n42675,298\n42676,356\n42678,1556\n42680,158\n42681,192\n42682,278\n42683,435\n42683,980\n42684,3\n42684,163\n42684,302\n42684,605\n42684,2116\n42684,19010\n42685,217\n42685,1417\n42686,42687\n42689,949\n42690,775\n42691,222\n42691,455\n42691,2775\n42692,920\n42693,264\n42693,1749\n42693,14550\n42694,3\n42695,1068\n42696,652\n42697,3999\n42697,5440\n42698,298\n42699,1105\n42699,1429\n42700,149\n42701,500\n42702,22\n42702,752\n42703,1977\n42703,1978\n42704,79\n42706,3094\n42707,326\n42708,852\n42709,1836\n42710,509\n42711,1590\n42712,349\n42713,2274\n42714,5987\n42715,111\n42716,13745\n42717,32\n42718,392\n42719,779\n42720,697\n42721,8798\n42722,809\n42723,1240\n42724,3260\n42725,1085\n42725,1634\n42725,2423\n42725,18726\n42725,29619\n42725,41772\n42725,42725\n42725,45066\n42725,45501\n42725,47365\n42725,47401\n42725,47970\n42725,54528\n42725,57654\n42725,59210\n42725,60523\n42725,66767\n42725,68955\n42725,72821\n42725,87725\n42725,114708\n42725,114709\n42725,114711\n42725,118577\n42725,120695\n42725,125606\n42725,129040\n42725,139812\n42725,146017\n42725,156447\n42725,164376\n42725,165752\n42725,166932\n42725,169599\n42725,169952\n42725,169962\n42725,170694\n42725,171371\n42725,181064\n42725,184356\n42725,186706\n42725,186709\n42725,216805\n42725,218377\n42725,245631\n42725,245632\n42725,259473\n42726,287\n42727,599\n42728,163\n42728,302\n42728,579\n42728,1849\n42728,6303\n42728,191860\n42729,1132\n42730,781\n42732,3069\n42733,48\n42733,704\n42734,46\n42734,304\n42734,481\n42734,485\n42734,744\n42734,750\n42734,783\n42734,1124\n42734,1167\n42734,1402\n42734,1479\n42735,1844\n42736,2915\n42737,500\n42737,949\n42738,668\n42739,217\n42739,379\n42740,1644\n42741,644\n42742,536\n42744,247\n42745,1454\n42746,602\n42747,360\n42748,994\n42749,1118\n42750,1983\n42751,54\n42751,1309\n42751,1707\n42751,2315\n42751,2605\n42752,602\n42752,620\n42753,2923\n42753,4190\n42754,873\n42755,1659\n42756,602\n42757,1858\n42758,1860\n42759,861\n42760,602\n42761,10\n42761,182\n42761,1417\n42762,120\n42762,225\n42762,261\n42762,332\n42762,694\n42762,1181\n42762,1419\n42763,1181\n42764,72\n42765,3321\n42766,1238\n42767,783\n42767,1616\n42768,264\n42768,1509\n42769,8270\n42770,1370\n42771,2775\n42772,447\n42774,577\n42774,1429\n42775,2995\n42776,97\n42777,1368\n42778,366\n42779,287\n42779,685\n42779,694\n42779,849\n42779,1319\n42781,660\n42782,602\n42783,602\n42784,254\n42784,557\n42784,954\n42784,1939\n42785,178\n42785,2750\n42786,1782\n42787,106\n42787,147\n42787,251\n42787,252\n42787,493\n42787,682\n42787,1243\n42787,1512\n42787,5992\n42788,500\n42789,304\n42790,1284\n42791,717\n42791,861\n42793,349\n42794,1955\n42795,1955\n42796,500\n42797,79\n42798,422\n42799,56\n42800,217\n42800,1417\n42801,602\n42802,1381\n42803,77\n42803,1298\n42804,657\n42805,1556\n42806,158\n42806,252\n42806,302\n42806,622\n42807,225\n42807,248\n42808,579\n42809,968\n42809,20359\n42810,298\n42810,1001\n42810,1085\n42810,1474\n42810,2089\n42810,2572\n42810,2940\n42810,21944\n42810,178576\n42811,3846\n42812,376\n42815,435\n42815,1033\n42816,2775\n42817,447\n42818,818\n42820,1133\n42821,622\n42822,4\n42822,5\n42823,248\n42823,447\n42823,1818\n42824,640\n42825,563\n42826,536\n42827,1085\n42828,10\n42829,483\n42830,3804\n42831,54\n42832,1181\n42832,1243\n42832,2867\n42832,22880\n42833,167\n42833,968\n42833,2979\n42834,872\n42835,698\n42835,750\n42836,7416\n42837,818\n42838,919\n42839,372\n42839,390\n42839,75912\n42840,151\n42841,390\n42841,589\n42841,1119\n42842,676\n42843,247\n42844,83\n42844,119\n42844,278\n42844,347\n42844,364\n42844,372\n42844,389\n42844,417\n42844,455\n42844,525\n42844,626\n42844,805\n42844,907\n42844,972\n42844,1019\n42844,1085\n42844,1274\n42844,1298\n42844,1363\n42844,1465\n42844,1467\n42844,1718\n42844,1801\n42844,1881\n42844,2266\n42844,2434\n42844,2553\n42844,2590\n42844,2646\n42844,4172\n42844,13575\n42845,30\n42846,1715\n42847,5405\n42849,1181\n42850,292\n42851,907\n42851,932\n42852,302\n42853,171\n42854,222\n42854,657\n42854,3182\n42854,4411\n42855,247\n42856,4549\n42857,1612\n42858,1298\n42859,83\n42860,9121\n42861,634\n42862,298\n42863,485\n42864,206\n42865,920\n42866,42867\n42868,1782\n42869,309\n42869,310\n42870,79\n42871,2045\n42872,2782\n42873,2797\n42874,1181\n42875,422\n42876,56\n42877,3\n42878,14366\n42879,298\n42880,485\n42881,5547\n42882,86\n42883,2315\n42884,8373\n42885,42886\n42887,42886\n42888,42886\n42889,42886\n42890,42886\n42891,42886\n42892,42886\n42893,42886\n42894,1531\n42895,240\n42896,2775\n42897,447\n42898,240\n42899,79\n42899,1010\n42899,1011\n42900,10\n42900,113156\n42901,1571\n42902,3069\n42903,640\n42904,42905\n42906,4903\n42907,1608\n42908,2048\n42909,1192\n42910,704\n42911,818\n42912,949\n42913,289\n42913,290\n42914,136\n42915,42916\n42917,271\n42917,615\n42917,1188\n42917,2089\n42917,3695\n42917,9021\n42917,9536\n42917,35750\n42917,35751\n42918,298\n42918,805\n42918,911\n42918,1368\n42918,2775\n42919,42920\n42921,980\n42922,22\n42923,42924\n42925,146\n42926,225\n42927,483\n42928,126\n42928,534\n42929,42930\n42929,46150\n42931,2353\n42932,171\n42933,264\n42934,4192\n42934,4193\n42935,1235\n42935,1335\n42936,233\n42937,872\n42938,515\n42938,1381\n42939,42940\n42939,132588\n42939,179937\n42941,1\n42942,272\n42943,202\n42943,203\n42944,42945\n42946,1\n42947,652\n42948,3258\n42949,9560\n42950,675\n42951,34\n42951,35\n42951,83\n42951,147\n42951,862\n42951,1001\n42951,1122\n42951,1785\n42951,5718\n42952,219\n42952,233\n42953,151\n42954,41\n42954,1608\n42954,43749\n42954,73662\n42955,5366\n42956,731\n42957,206\n42958,636\n42959,557\n42960,178\n42961,557\n42962,254\n42962,2379\n42964,731\n42965,99\n42966,893\n42966,1374\n42966,1556\n42967,366\n42968,1\n42969,406\n42970,657\n42971,233\n42972,2620\n42973,497\n42974,202\n42974,203\n42974,493\n42975,42976\n42977,240\n42978,83\n42979,731\n42980,167\n42980,301\n42980,968\n42980,1012\n42980,1241\n42980,1436\n42980,1522\n42980,2083\n42980,2557\n42980,2979\n42980,3218\n42981,809\n42982,5440\n42983,949\n42984,852\n42985,1509\n42986,7\n42987,14366\n42988,417\n42990,356\n42990,852\n42990,1718\n42990,2646\n42990,5591\n42991,4611\n42992,107\n42993,1007\n42994,360\n42995,14996\n42996,640\n42997,323\n42998,356\n42998,390\n42998,1140\n42998,5540\n42998,6068\n42998,9457\n42999,4691\n43000,72\n43001,1235\n43001,1335\n43002,1370\n43003,1436\n43004,424\n43005,106\n43007,467\n43007,743\n43007,1803\n43008,43009\n43008,51048\n43008,219348\n43010,107\n43011,422\n43012,56\n43013,602\n43014,43015\n43016,602\n43017,346\n43018,43019\n43020,1353\n43021,4594\n43022,43023\n43024,647\n43024,43025\n43026,30\n43027,805\n43028,1010\n43029,2775\n43030,447\n43031,1556\n43032,35687\n43033,640\n43034,433\n43035,422\n43036,56\n43037,43038\n43039,1\n43040,99\n43041,349\n43042,43043\n43044,704\n43045,120\n43046,43047\n43048,2574\n43050,805\n43051,1010\n43052,704\n43055,1411\n43056,217\n43057,704\n43058,704\n43059,160\n43060,442\n43060,2436\n43060,3474\n43061,392\n43062,8854\n43063,207\n43065,10\n43066,366\n43067,366\n43068,366\n43069,366\n43070,366\n43071,160\n43072,366\n43073,366\n43074,366\n43075,366\n43076,366\n43077,481\n43078,366\n43079,366\n43080,366\n43081,366\n43082,233\n43083,366\n43084,7416\n43085,102\n43085,408\n43086,43087\n43086,51130\n43086,52283\n43088,43089\n43090,503\n43090,1149\n43090,1282\n43091,1551\n43092,704\n43093,366\n43094,872\n43095,752\n43096,827\n43096,3328\n43097,872\n43098,1424\n43099,861\n43100,893\n43101,652\n43101,1579\n43102,3451\n43102,3452\n43103,907\n43103,932\n43104,634\n43106,15\n43107,1118\n43108,43109\n43110,217\n43111,3602\n43111,7757\n43112,1983\n43113,485\n43114,312\n43114,872\n43114,1453\n43115,248\n43116,298\n43117,485\n43118,160\n43119,919\n43120,202\n43120,1659\n43120,14819\n43122,306\n43122,307\n43123,4146\n43124,43125\n43126,298\n43127,485\n43128,330\n43128,885\n43129,918\n43130,602\n43132,872\n43133,310\n43133,3039\n43134,4220\n43134,6487\n43135,287\n43135,809\n43135,19010\n43136,34\n43136,35\n43137,1298\n43137,1616\n43138,79\n43139,1858\n43140,1860\n43141,175\n43141,693\n43141,2146\n43142,254\n43143,1238\n43144,43145\n43146,366\n43147,516\n43148,422\n43149,422\n43150,79\n43150,1326\n43151,596\n43151,1639\n43152,422\n43153,422\n43154,422\n43156,298\n43157,1400\n43158,485\n43159,422\n43160,422\n43161,422\n43162,647\n43163,344\n43165,1287\n43166,66\n43168,43169\n43170,3538\n43173,1235\n43173,1335\n43174,1\n43174,5375\n43175,146\n43175,779\n43176,704\n43177,704\n43178,1282\n43178,1882\n43178,2210\n43178,4237\n43179,33611\n43180,10\n43180,113156\n43181,652\n43182,337\n43183,163\n43183,186\n43183,302\n43183,703\n43183,893\n43183,1556\n43183,2116\n43183,3769\n43184,1133\n43185,2411\n43186,1133\n43187,417\n43188,483\n43189,217\n43190,43191\n43193,1298\n43194,240\n43194,2989\n43194,2991\n43194,3328\n43195,4411\n43196,1033\n43199,640\n43200,919\n43202,431\n43205,211\n43205,5440\n43206,602\n43208,592\n43209,2367\n43210,65\n43210,868\n43211,298\n43212,485\n43213,1011\n43213,1127\n43213,1849\n43216,2810\n43216,3611\n43216,6032\n43216,6424\n43216,9708\n43216,18028\n43216,71824\n43216,72530\n43216,74658\n43216,125011\n43216,138654\n43216,142256\n43216,145851\n43216,163891\n43216,185271\n43216,188481\n43216,190241\n43216,223659\n43216,247074\n43216,263931\n43217,1631\n43218,2995\n43220,2373\n43221,1891\n43222,1052\n43223,120\n43223,261\n43223,1466\n43224,14989\n43226,932\n43227,911\n43228,1151\n43228,1454\n43229,485\n43230,336\n43231,258\n43231,818\n43231,872\n43231,2991\n43232,841\n43233,872\n43233,1267\n43233,1579\n43233,3367\n43233,49057\n43234,392\n43234,644\n43235,167\n43235,2083\n43236,217\n43236,467\n43236,872\n43237,795\n43239,30\n43239,267\n43239,328\n43239,440\n43239,622\n43239,779\n43239,809\n43239,1179\n43239,1515\n43239,3246\n43239,3247\n43239,60576\n43239,68069\n43239,141912\n43240,1227\n43240,1229\n43241,994\n43242,811\n43243,1434\n43245,302\n43245,420\n43245,1414\n43246,644\n43247,1285\n43247,1888\n43247,2590\n43248,1284\n43248,1715\n43249,43250\n43251,1983\n43252,43253\n43254,346\n43255,206\n43256,682\n43256,72439\n43257,104\n43257,1881\n43261,77\n43261,85\n43262,644\n43262,2105\n43263,195\n43265,1102\n43266,48\n43266,726\n43267,704\n43268,2353\n43270,5405\n43271,736\n43273,222\n43273,283\n43273,289\n43273,290\n43273,81233\n43273,94134\n43274,1238\n43275,406\n43276,1803\n43277,30331\n43279,809\n43279,19010\n43280,647\n43280,1289\n43280,1893\n43280,49057\n43281,406\n43282,577\n43283,1452\n43284,1127\n43285,256\n43286,17897\n43287,1425\n43288,167\n43288,1298\n43288,1522\n43288,1616\n43289,605\n43290,192\n43291,1429\n43292,304\n43293,389\n43294,1118\n43295,1858\n43296,1860\n43297,1085\n43298,379\n43298,707\n43301,671\n43302,292\n43302,1014\n43303,222\n43303,289\n43303,290\n43303,338\n43303,1151\n43304,366\n43305,240\n43305,809\n43306,1243\n43307,18726\n43308,929\n43309,160\n43309,736\n43310,1243\n43311,2048\n43312,957\n43312,1815\n43313,225\n43314,255\n43315,81\n43317,346\n43318,859\n43319,296\n43320,1927\n43321,392\n43322,68\n43322,1400\n43323,1858\n43324,1860\n43327,200\n43328,1644\n43331,760\n43332,932\n43332,1016\n43333,1010\n43333,1011\n43334,775\n43335,299\n43336,344\n43336,710\n43336,1711\n43336,1836\n43337,22\n43337,2017\n43338,682\n43340,77\n43341,120\n43341,1466\n43341,2372\n43342,356\n43342,973\n43343,372\n43343,1955\n43344,687\n43345,302\n43346,167\n43346,1284\n43346,2083\n43347,372\n43348,285\n43348,406\n43348,779\n43349,77\n43350,1370\n43352,200\n43352,1282\n43353,30\n43353,1608\n43353,14989\n43354,77\n43355,1429\n43356,247\n43357,1\n43358,1844\n43359,1429\n43360,273\n43360,274\n43361,271\n43362,447\n43363,1298\n43364,192\n43364,264\n43364,592\n43364,1181\n43364,1531\n43365,1175\n43366,571\n43366,868\n43367,298\n43368,485\n43369,83\n43370,406\n43371,247\n43372,447\n43373,1147\n43374,30\n43374,1179\n43375,136\n43375,563\n43376,447\n43377,795\n43378,3135\n43379,79\n43380,1\n43380,313\n43381,79\n43382,900\n43383,222\n43383,440\n43383,536\n43383,949\n43383,1019\n43383,4355\n43383,7092\n43384,269\n43385,43386\n43387,1556\n43388,2244\n43389,160\n43390,379\n43390,385\n43391,872\n43392,7124\n43393,602\n43394,41\n43394,134\n43394,332\n43394,714\n43394,1001\n43394,1119\n43394,1284\n43394,1715\n43394,1955\n43394,2205\n43394,2286\n43394,4237\n43394,33424\n43396,143\n43399,79\n43400,2590\n43401,151\n43402,439\n43403,835\n43403,1968\n43404,718\n43405,1370\n43406,264\n43407,240\n43407,877\n43407,4637\n43408,1010\n43409,280\n43409,664\n43409,2353\n43409,9015\n43409,17245\n43410,710\n43411,43412\n43411,81806\n43413,1181\n43414,4823\n43415,79\n43416,1556\n43417,2367\n43418,93\n43418,94\n43419,1085\n43420,392\n43421,151\n43422,195\n43422,314\n43423,717\n43424,247\n43425,304\n43426,1551\n43427,43428\n43429,366\n43430,599\n43431,602\n43432,2315\n43433,328\n43434,602\n43435,809\n43437,647\n43439,192\n43439,406\n43440,20771\n43441,493\n43441,1381\n43443,577\n43443,1429\n43444,7429\n43445,1078\n43446,3161\n43447,563\n43448,563\n43449,1429\n43450,640\n43451,158\n43452,97\n43452,424\n43452,1639\n43452,1801\n43452,3295\n43452,3296\n43453,278\n43454,1\n43455,4\n43455,5\n43455,355\n43456,535\n43457,1849\n43458,298\n43459,485\n43460,15\n43460,415\n43460,1474\n43460,4218\n43460,66500\n43461,44\n43462,1893\n43463,390\n43464,424\n43465,298\n43466,485\n43467,72\n43468,30\n43468,364\n43468,417\n43468,442\n43468,1179\n43468,1368\n43468,1415\n43469,2775\n43470,447\n43471,2775\n43472,447\n43473,298\n43474,485\n43475,483\n43476,13919\n43479,557\n43480,557\n43481,557\n43482,8719\n43483,138\n43484,865\n43485,557\n43486,137\n43487,118\n43487,4597\n43488,704\n43489,8719\n43490,138\n43491,865\n43492,557\n43493,137\n43494,43495\n43494,47148\n43494,77965\n43494,102958\n43494,110954\n43494,121111\n43494,124415\n43494,133481\n43494,178366\n43496,8719\n43497,138\n43498,865\n43499,557\n43500,137\n43501,118\n43501,4597\n43502,118\n43502,4597\n43503,8719\n43504,138\n43505,865\n43506,557\n43507,137\n43508,118\n43508,4597\n43510,920\n43511,9323\n43512,250\n43512,1684\n43513,72\n43514,43515\n43516,296\n43517,417\n43518,704\n43519,2775\n43520,447\n43521,389\n43522,43523\n43524,298\n43525,485\n43526,1285\n43526,7124\n43527,43528\n43529,422\n43530,56\n43531,269\n43532,43533\n43532,66268\n43534,149\n43535,8788\n43536,2351\n43537,1118\n43538,622\n43539,1644\n43540,417\n43541,397\n43541,483\n43542,187\n43543,43544\n43545,20\n43546,43547\n43549,298\n43550,485\n43551,9560\n43552,149\n43553,1556\n43554,240\n43555,43556\n43555,57562\n43557,43558\n43557,97632\n43559,192\n43559,663\n43559,664\n43560,7117\n43561,9560\n43562,43563\n43564,1531\n43565,1634\n43566,1201\n43568,872\n43569,589\n43570,2867\n43570,22880\n43571,43572\n43573,222\n43574,171\n43575,211\n43576,5440\n43577,697\n43577,3260\n43578,4101\n43579,147\n43580,557\n43581,43582\n43583,225\n43584,585\n43585,376\n43586,43587\n43588,8884\n43589,1085\n43590,43591\n43592,233\n43593,1821\n43594,43595\n43596,1782\n43597,4549\n43598,43599\n43600,1977\n43600,1978\n43601,72\n43602,330\n43603,273\n43603,274\n43613,56\n43613,140\n43613,18638\n43613,43613\n43613,163955\n43613,163956\n43613,164280\n43613,164289\n43613,182022\n43614,366\n43615,366\n43616,366\n43617,366\n43618,366\n43619,298\n43620,485\n43621,43622\n43623,68\n43624,2048\n43625,306\n43625,307\n43626,3069\n43627,146\n43628,283\n43629,2416\n43629,2417\n43631,1454\n43632,515\n43633,13\n43634,43635\n43636,298\n43637,485\n43638,43639\n43640,2266\n43641,366\n43642,483\n43645,2296\n43646,872\n43646,1151\n43647,111\n43647,760\n43648,932\n43650,422\n43651,422\n43652,422\n43653,422\n43654,422\n43655,422\n43656,422\n43657,79\n43658,996\n43659,5440\n43660,222\n43660,1467\n43660,13137\n43661,298\n43662,485\n43663,43664\n43663,81871\n43663,104660\n43665,349\n43666,1631\n43668,298\n43669,485\n43670,158\n43670,202\n43670,406\n43671,43672\n43673,285\n43674,134\n43675,50\n43675,762\n43675,2156\n43675,21944\n43675,124668\n43676,805\n43678,104\n43679,9026\n43680,1983\n43681,298\n43682,485\n43683,44\n43684,875\n43687,1181\n43688,718\n43689,399\n43690,628\n43691,718\n43692,163\n43692,209\n43692,302\n43692,579\n43692,861\n43692,1556\n43693,718\n43694,2411\n43695,2626\n43697,2995\n43698,273\n43698,274\n43700,1579\n43701,1467\n43702,79\n43703,2737\n43704,518\n43705,3193\n43706,31122\n43707,97\n43708,72\n43709,850\n43710,875\n43711,417\n43712,298\n43713,485\n43714,4691\n43714,114600\n43715,818\n43717,4066\n43718,1140\n43718,1287\n43718,1309\n43718,1453\n43718,1572\n43718,2443\n43719,43720\n43721,406\n43722,83\n43723,1707\n43724,2867\n43724,2868\n43724,22880\n43725,931\n43726,83\n43727,137\n43728,272\n43728,1414\n43729,1509\n43730,1509\n43731,503\n43733,273\n43733,274\n43734,83\n43734,217\n43734,323\n43734,358\n43734,577\n43734,1072\n43734,1240\n43734,1274\n43734,1590\n43734,2045\n43734,2979\n43735,718\n43736,6682\n43737,120\n43737,1466\n43737,2807\n43738,1849\n43739,1479\n43741,424\n43742,43743\n43744,211\n43744,714\n43745,7\n43745,43746\n43745,86419\n43745,89186\n43745,103290\n43745,129144\n43745,170482\n43747,43748\n43747,219639\n43749,1608\n43749,43749\n43749,57109\n43749,77315\n43751,518\n43753,4237\n43753,182162\n43754,931\n43755,43756\n43757,589\n43758,1414\n43759,43760\n43761,602\n43762,1085\n43763,48\n43764,43765\n43766,10\n43767,115\n43767,118\n43768,5405\n43770,273\n43770,274\n43771,43772\n43773,43774\n43776,682\n43776,72439\n43777,1289\n43778,932\n43778,1016\n43778,4237\n43778,182162\n43779,1767\n43780,171\n43781,1085\n43782,1266\n43782,1370\n43783,207\n43784,43785\n43786,973\n43787,447\n43788,483\n43789,5343\n43790,217\n43791,289\n43791,290\n43792,28072\n43793,557\n43794,2506\n43795,3\n43796,602\n43797,376\n43798,23011\n43799,1085\n43800,328\n43801,2351\n43802,233\n43803,704\n43804,704\n43805,652\n43806,9121\n43807,557\n43808,107\n43809,2416\n43809,2417\n43810,292\n43811,338\n43812,3447\n43813,298\n43814,195\n43815,1133\n43816,3538\n43817,2048\n43818,2995\n43819,3960\n43820,1007\n43821,2574\n43822,43823\n43824,63\n43826,868\n43826,162599\n43827,1858\n43828,1860\n43829,160\n43830,893\n43830,1326\n43830,1715\n43830,124668\n43831,1323\n43832,102\n43833,1326\n43834,408\n43835,2674\n43836,43837\n43838,151\n43840,298\n43841,485\n43842,43843\n43844,1983\n43845,602\n43846,240\n43846,1285\n43846,1785\n43846,2620\n43846,5718\n43849,17228\n43850,43851\n43852,640\n43853,957\n43857,1821\n43858,1821\n43859,1257\n43860,872\n43861,8270\n43862,43863\n43864,269\n43865,44\n43866,48\n43867,43868\n43867,48823\n43867,52479\n43869,1116\n43870,6682\n43871,175\n43871,1773\n43872,483\n43873,233\n43874,1227\n43874,1229\n43875,972\n43875,1010\n43875,1298\n43876,240\n43877,1506\n43880,483\n43880,2867\n43880,2868\n43880,22880\n43881,30\n43882,79\n43883,1274\n43884,171\n43885,192\n43885,336\n43885,493\n43885,663\n43885,3872\n43886,447\n43886,538\n43887,43888\n43889,287\n43890,143\n43891,146\n43891,158\n43891,192\n43891,285\n43891,336\n43891,406\n43891,620\n43891,779\n43891,920\n43891,1515\n43891,1531\n43891,1893\n43892,222\n43893,41\n43893,304\n43893,328\n43893,634\n43893,141912\n43894,422\n43895,56\n43896,19010\n43897,718\n43898,33082\n43900,43901\n43902,43901\n43903,104\n43903,953\n43904,422\n43905,56\n43906,43907\n43908,493\n43908,920\n43909,1707\n43910,929\n43912,991\n43913,376\n43914,1881\n43916,43917\n43918,2105\n43920,298\n43921,485\n43922,20257\n43923,298\n43924,485\n43925,872\n43926,10\n43928,1837\n43930,861\n43932,406\n43932,1775\n43932,55849\n43933,126\n43934,126\n43935,72\n43936,772\n43937,557\n43938,862\n43939,557\n43940,557\n43941,557\n43942,5906\n43943,557\n43944,626\n43945,278\n43946,137\n43947,862\n43948,5906\n43949,557\n43950,626\n43951,278\n43952,137\n43953,862\n43954,2837\n43955,147\n43956,3069\n43957,20813\n43958,704\n43959,43960\n43959,50900\n43959,63051\n43959,64098\n43959,67573\n43959,69171\n43959,74448\n43959,87386\n43961,1\n43961,273\n43961,274\n43961,626\n43961,647\n43961,1415\n43962,1983\n43963,83\n43963,202\n43963,203\n43963,217\n43963,577\n43963,1072\n43963,1590\n43963,2266\n43963,2274\n43963,2784\n43963,2931\n43963,3182\n43963,3538\n43963,4637\n43963,7092\n43964,602\n43965,330\n43965,783\n43965,2572\n43965,3538\n43966,72\n43967,344\n43968,285\n43969,1983\n43970,43971\n43972,718\n43973,1983\n43974,43975\n43976,104\n43977,1983\n43978,298\n43979,485\n43980,72\n43981,217\n43982,5976\n43984,1179\n43985,323\n43986,43987\n43986,89495\n43988,202\n43988,455\n43988,536\n43988,694\n43988,996\n43988,1240\n43988,1274\n43988,1572\n43988,1608\n43988,1644\n43988,2266\n43988,2274\n43988,2671\n43988,2699\n43988,2784\n43988,3182\n43988,3538\n43988,4549\n43988,7092\n43989,2797\n43990,493\n43991,850\n43992,592\n43993,43994\n43995,1181\n43996,366\n43997,366\n43998,366\n43999,366\n44000,366\n44001,366\n44002,312\n44003,366\n44004,1220\n44004,1222\n44005,44006\n44007,1368\n44008,704\n44009,44010\n44011,861\n44012,44013\n44014,422\n44015,56\n44016,44017\n44018,44017\n44020,422\n44021,44022\n44023,44024\n44025,44026\n44027,104\n44028,9121\n44029,338\n44030,422\n44031,56\n44032,1983\n44033,292\n44034,178\n44035,294\n44036,296\n44037,298\n44038,1767\n44039,861\n44040,2526\n44041,10\n44042,383\n44043,1175\n44044,10\n44045,1151\n44046,44047\n44048,83\n44049,1238\n44050,581\n44051,1452\n44052,233\n44054,44055\n44056,500\n44057,1191\n44058,784\n44059,2312\n44060,390\n44060,20535\n44061,2701\n44062,147\n44062,184\n44063,1289\n44065,1858\n44066,1860\n44067,861\n44068,657\n44068,2266\n44071,5165\n44072,301\n44074,298\n44075,485\n44076,146\n44078,255\n44079,893\n44080,477\n44080,23287\n44081,795\n44083,306\n44083,307\n44085,1140\n44085,9030\n44086,1858\n44087,1860\n44088,4831\n44089,1983\n44090,298\n44091,485\n44092,72\n44093,344\n44094,285\n44095,292\n44095,599\n44095,872\n44095,1151\n44096,255\n44097,10\n44098,79\n44099,1858\n44100,1860\n44101,626\n44103,397\n44104,330\n44105,167\n44106,422\n44107,31073\n44108,79\n44109,79\n44110,195\n44110,1515\n44111,483\n44112,604\n44113,292\n44115,163\n44115,309\n44115,310\n44115,392\n44115,818\n44115,872\n44116,393\n44118,79\n44119,640\n44120,184\n44120,304\n44120,602\n44120,980\n44120,1252\n44120,1253\n44120,1285\n44120,1821\n44120,2528\n44120,4455\n44121,671\n44122,104\n44123,483\n44123,1082\n44124,292\n44125,26\n44125,59\n44126,1118\n44127,1801\n44128,292\n44129,1711\n44130,1238\n44131,422\n44132,422\n44133,422\n44134,422\n44135,217\n44135,222\n44135,1019\n44136,393\n44136,35486\n44136,79349\n44137,422\n44138,422\n44139,422\n44140,422\n44141,422\n44142,422\n44143,422\n44144,640\n44146,640\n44147,1663\n44148,640\n44149,2944\n44150,640\n44152,640\n44153,298\n44154,485\n44155,65\n44157,65\n44157,868\n44157,162599\n44158,1466\n44158,6955\n44159,292\n44160,292\n44161,1241\n44161,1849\n44161,2620\n44162,192\n44164,718\n44165,97\n44165,5405\n44166,557\n44167,292\n44168,292\n44169,1127\n44170,72\n44171,83\n44171,143\n44171,599\n44171,17346\n44173,292\n44174,5101\n44175,292\n44177,2210\n44177,4237\n44178,30428\n44179,292\n44180,298\n44181,485\n44182,1010\n44182,1955\n44183,1891\n44184,14366\n44185,135\n44186,5547\n44186,6955\n44186,8180\n44187,292\n44189,292\n44190,273\n44190,274\n44190,1082\n44191,240\n44193,392\n44194,309\n44194,310\n44195,66\n44195,868\n44197,273\n44197,274\n44197,313\n44197,66754\n44198,15573\n44199,298\n44200,485\n44201,1556\n44202,58\n44203,298\n44204,485\n44205,3507\n44206,292\n44207,1983\n44207,1984\n44208,868\n44209,690\n44210,338\n44211,1849\n44212,104\n44213,406\n44213,779\n44214,392\n44215,592\n44217,4355\n44218,3960\n44219,310\n44219,3039\n44220,1289\n44221,1973\n44222,3585\n44222,156379\n44223,649\n44224,2995\n44225,2244\n44226,644\n44229,980\n44230,980\n44231,980\n44232,309\n44232,310\n44232,1203\n44232,3135\n44233,1429\n44234,1181\n44237,240\n44237,1203\n44237,1955\n44238,717\n44239,489\n44239,893\n44240,20\n44241,99\n44242,56\n44242,252\n44243,538\n44245,602\n44246,1893\n44248,211\n44248,4411\n44251,934\n44252,298\n44253,485\n44254,644\n44255,1659\n44256,120\n44256,503\n44257,309\n44257,310\n44258,1429\n44259,1\n44261,861\n44262,388\n44263,3999\n44265,2312\n44269,186\n44269,500\n44272,1566\n44273,1203\n44274,4101\n44275,2744\n44276,647\n44277,344\n44278,264\n44278,515\n44278,647\n44278,1289\n44278,2626\n44279,15573\n44280,1181\n44281,292\n44282,298\n44283,485\n44284,289\n44284,290\n44285,195\n44286,861\n44288,1052\n44289,292\n44290,861\n44291,2073\n44293,292\n44293,918\n44293,31934\n44294,602\n44296,83\n44297,602\n44298,760\n44298,1149\n44298,1631\n44299,1392\n44301,222\n44301,682\n44301,2944\n44301,2989\n44301,2991\n44301,3115\n44301,28130\n44301,72439\n44303,640\n44305,861\n44306,72\n44307,647\n44308,344\n44309,312\n44310,79\n44310,192\n44310,269\n44310,809\n44310,1425\n44310,1844\n44310,5213\n44312,2828\n44315,44\n44316,298\n44317,485\n44318,1102\n44319,298\n44320,485\n44321,292\n44322,292\n44323,861\n44324,647\n44325,344\n44326,1052\n44327,647\n44328,344\n44329,222\n44329,313\n44329,455\n44329,657\n44329,2646\n44329,2779\n44330,1285\n44330,84257\n44331,861\n44332,861\n44333,2353\n44334,287\n44335,557\n44336,247\n44337,298\n44338,485\n44339,273\n44339,274\n44342,1381\n44343,273\n44343,274\n44344,50\n44344,99\n44345,435\n44346,30\n44347,661\n44347,20573\n44347,188658\n44347,190259\n44347,192041\n44347,192116\n44347,192465\n44347,193564\n44348,1612\n44348,4455\n44350,726\n44351,660\n44352,875\n44353,195\n44354,298\n44355,485\n44356,731\n44357,918\n44358,861\n44359,298\n44360,485\n44361,875\n44362,779\n44363,3447\n44364,760\n44365,861\n44366,647\n44367,2292\n44368,2178\n44368,4545\n44368,139010\n44369,50\n44370,640\n44370,1149\n44370,2867\n44370,2868\n44370,8488\n44371,5375\n44372,298\n44373,485\n44374,298\n44375,485\n44376,292\n44377,393\n44377,1531\n44378,255\n44380,217\n44380,233\n44381,875\n44382,2205\n44382,2206\n44382,33424\n44383,298\n44384,485\n44385,795\n44385,968\n44385,973\n44385,3756\n44386,312\n44387,772\n44388,515\n44388,1052\n44389,861\n44390,252\n44390,318\n44391,336\n44391,571\n44391,2083\n44392,83\n44393,1807\n44393,1955\n44394,996\n44396,104\n44397,389\n44397,1858\n44399,710\n44399,1147\n44400,392\n44401,259\n44401,788\n44401,28294\n44402,264\n44403,167\n44403,1167\n44403,1231\n44403,1837\n44403,2083\n44403,5662\n44405,1370\n44407,104\n44407,248\n44408,83\n44410,83\n44410,51502\n44410,68069\n44410,77336\n44410,256337\n44411,717\n44413,356\n44414,393\n44415,1052\n44416,467\n44416,525\n44416,818\n44417,44418\n44419,2073\n44420,1052\n44421,907\n44421,932\n44423,79\n44424,611\n44424,873\n44424,1634\n44424,1860\n44424,2828\n44424,8072\n44425,312\n44426,240\n44427,1571\n44428,1749\n44429,392\n44430,32\n44430,392\n44430,697\n44430,3003\n44431,44432\n44431,54393\n44431,87600\n44431,89592\n44431,105267\n44431,108279\n44431,113210\n44431,235517\n44431,261910\n44433,5213\n44434,1014\n44435,392\n44435,697\n44437,1243\n44438,483\n44439,285\n44440,104\n44441,4\n44441,5\n44441,859\n44441,1243\n44442,313\n44442,657\n44443,83\n44444,1085\n44445,1224\n44446,298\n44447,346\n44448,626\n44449,20\n44449,86\n44449,784\n44449,5212\n44449,6682\n44449,20257\n44451,58\n44451,596\n44453,310\n44454,1821\n44455,422\n44456,56\n44459,1985\n44460,106\n44460,192\n44460,337\n44460,435\n44460,447\n44460,726\n44460,1388\n44460,3989\n44460,6119\n44461,389\n44462,772\n44463,422\n44464,56\n44465,718\n44466,30\n44467,346\n44468,298\n44469,485\n44470,44471\n44470,51523\n44470,92428\n44470,117516\n44470,121559\n44472,298\n44473,485\n44474,151\n44475,298\n44476,485\n44477,1313\n44478,5192\n44479,338\n44479,852\n44480,167\n44480,2083\n44481,304\n44483,346\n44485,273\n44485,274\n44486,1608\n44487,760\n44487,1149\n44487,1631\n44487,3585\n44488,346\n44489,417\n44490,4039\n44491,356\n44492,1590\n44492,1644\n44493,346\n44494,376\n44495,272\n44496,346\n44497,79\n44498,83\n44498,2671\n44499,72\n44500,406\n44501,250\n44501,1684\n44502,247\n44503,1707\n44505,72\n44507,264\n44507,1509\n44507,1893\n44507,2312\n44508,171\n44509,209\n44510,392\n44512,1133\n44514,1467\n44515,2867\n44515,22880\n44516,344\n44516,577\n44517,227\n44518,86\n44518,167\n44518,301\n44518,356\n44518,852\n44518,941\n44518,1010\n44518,1284\n44518,1298\n44518,1522\n44518,2083\n44518,2191\n44518,2372\n44518,2557\n44518,2979\n44518,3138\n44519,209\n44520,704\n44522,292\n44522,1238\n44522,1572\n44522,1722\n44523,2421\n44524,255\n44525,8308\n44526,255\n44527,1300\n44528,344\n44528,577\n44529,704\n44530,44531\n44530,55424\n44530,60631\n44532,209\n44533,44534\n44535,44534\n44536,209\n44537,1983\n44538,1983\n44539,202\n44539,203\n44539,1243\n44540,44541\n44542,358\n44543,211\n44543,671\n44544,44545\n44546,5874\n44547,1634\n44548,298\n44549,485\n44551,1001\n44552,44553\n44554,44555\n44554,80363\n44554,93079\n44554,111481\n44554,185108\n44556,2421\n44557,44558\n44557,54090\n44557,56882\n44557,68470\n44557,171730\n44557,192740\n44557,235206\n44559,44560\n44561,44562\n44563,557\n44564,557\n44565,209\n44566,202\n44566,203\n44567,1623\n44568,481\n44569,3069\n44571,44572\n44573,10\n44574,3\n44575,209\n44577,2867\n44577,2868\n44577,22880\n44578,248\n44578,450\n44578,1332\n44579,631\n44580,602\n44581,602\n44582,1452\n44582,4637\n44583,3999\n44584,406\n44585,83\n44586,673\n44586,2373\n44587,422\n44588,56\n44589,579\n44590,1983\n44591,861\n44592,346\n44593,34\n44593,35\n44593,217\n44594,843\n44595,2351\n44596,1983\n44597,406\n44598,44599\n44600,79\n44601,1252\n44601,1253\n44602,34\n44602,35\n44603,346\n44604,44605\n44606,107\n44608,1\n44609,1118\n44610,805\n44611,1058\n44612,30\n44613,211\n44614,861\n44615,5440\n44616,147\n44617,3507\n44618,602\n44619,861\n44620,346\n44621,850\n44622,346\n44623,779\n44624,222\n44624,1590\n44626,626\n44627,6068\n44628,264\n44629,44630\n44631,44632\n44631,84064\n44631,89461\n44631,100588\n44633,1381\n44634,392\n44634,1796\n44635,10\n44636,1740\n44637,372\n44638,247\n44639,516\n44640,81\n44641,1556\n44642,920\n44643,44644\n44645,8270\n44646,1370\n44647,861\n44648,1749\n44649,1117\n44650,44651\n44650,52438\n44650,84906\n44650,155315\n44652,417\n44653,1007\n44654,147\n44654,206\n44654,994\n44654,2244\n44655,801\n44656,346\n44657,346\n44659,3538\n44661,346\n44662,346\n44663,346\n44664,207\n44665,862\n44665,2590\n44666,704\n44667,3246\n44667,3247\n44668,346\n44670,292\n44671,805\n44672,72\n44673,44674\n44676,44677\n44676,87542\n44676,96298\n44676,106795\n44678,346\n44679,81\n44680,83\n44681,44682\n44681,52132\n44683,366\n44684,366\n44685,366\n44686,4453\n44687,366\n44688,366\n44689,44690\n44691,366\n44692,366\n44693,366\n44694,99\n44695,366\n44696,366\n44697,366\n44698,346\n44699,408\n44700,1773\n44701,233\n44702,83\n44703,346\n44704,298\n44705,485\n44706,408\n44706,1016\n44707,515\n44708,1977\n44708,1978\n44709,346\n44710,1634\n44711,50\n44711,79\n44712,72\n44713,1010\n44715,718\n44718,251\n44719,439\n44719,622\n44720,360\n44721,872\n44722,585\n44724,346\n44725,417\n44725,431\n44725,446\n44725,534\n44725,588\n44725,590\n44725,677\n44725,685\n44725,714\n44725,862\n44725,943\n44725,997\n44725,1462\n44725,1641\n44725,2285\n44725,2572\n44725,2874\n44725,3623\n44725,4222\n44725,5563\n44725,5902\n44725,7194\n44725,8537\n44725,9028\n44725,16668\n44725,18035\n44725,19132\n44725,44725\n44725,46874\n44725,51972\n44725,56350\n44725,57041\n44725,58400\n44725,63729\n44725,66345\n44725,73279\n44725,75912\n44725,81508\n44725,85930\n44725,90976\n44725,93206\n44725,94247\n44725,99003\n44725,104341\n44725,107947\n44725,108282\n44725,108555\n44725,117924\n44725,118156\n44725,125173\n44725,125174\n44725,134039\n44725,140222\n44725,140666\n44725,150059\n44725,150067\n44725,152600\n44725,161892\n44725,162568\n44725,162578\n44725,174890\n44725,176454\n44725,176791\n44725,178576\n44725,182476\n44725,183573\n44725,183575\n44725,185877\n44725,189477\n44725,193129\n44725,194414\n44725,217459\n44725,219904\n44725,221310\n44725,221666\n44725,225563\n44725,230599\n44725,235952\n44725,236594\n44725,236821\n44725,238191\n44725,241746\n44725,247743\n44725,248796\n44726,79\n44726,195\n44727,5130\n44728,10\n44728,113156\n44729,3451\n44729,3452\n44730,195\n44731,207\n44733,346\n44734,287\n44735,306\n44735,307\n44736,818\n44737,346\n44738,1298\n44739,4\n44739,5\n44739,527\n44739,794\n44740,835\n44740,4039\n44741,292\n44742,151\n44744,32475\n44745,346\n44746,264\n44746,809\n44746,2646\n44746,5213\n44747,861\n44748,298\n44749,485\n44750,222\n44750,13361\n44751,209\n44752,44753\n44755,2083\n44756,305\n44757,1149\n44758,422\n44759,255\n44760,422\n44761,422\n44762,779\n44763,704\n44764,298\n44765,485\n44766,422\n44767,704\n44768,3161\n44768,44769\n44770,422\n44771,422\n44772,422\n44773,422\n44774,422\n44775,175\n44776,5405\n44777,852\n44778,929\n44778,4678\n44780,1240\n44780,76096\n44781,298\n44782,485\n44783,4810\n44784,147\n44785,1118\n44786,2923\n44787,536\n44787,2173\n44788,640\n44789,640\n44790,640\n44791,195\n44791,596\n44791,749\n44791,752\n44791,1033\n44791,1151\n44792,775\n44793,79\n44793,149\n44794,640\n44795,332\n44795,383\n44795,406\n44795,509\n44795,1298\n44795,1722\n44795,3135\n44795,14819\n44796,720\n44798,79\n44798,192\n44799,312\n44800,19\n44801,264\n44801,1659\n44801,2979\n44802,72\n44803,4411\n44804,344\n44804,349\n44804,392\n44804,1836\n44807,931\n44808,5591\n44809,240\n44810,500\n44811,1962\n44812,1052\n44813,1882\n44814,2775\n44815,54\n44816,2210\n44816,4237\n44817,360\n44818,1181\n44819,1323\n44820,102\n44821,1326\n44822,408\n44823,79\n44824,920\n44827,510\n44829,779\n44831,340\n44834,9121\n44835,996\n44836,328\n44838,83\n44838,694\n44839,718\n44839,760\n44839,1631\n44840,647\n44841,344\n44842,120\n44844,44845\n44846,1118\n44847,393\n44848,1749\n44849,704\n44850,7360\n44851,298\n44852,485\n44854,557\n44855,779\n44856,44857\n44858,1179\n44860,931\n44861,151\n44862,929\n44863,760\n44864,38634\n44865,273\n44865,274\n44865,313\n44865,66754\n44866,44867\n44868,2923\n44869,240\n44870,1955\n44871,1140\n44871,2443\n44873,718\n44874,298\n44875,485\n44877,1\n44877,147\n44877,206\n44877,1815\n44877,2244\n44877,80266\n44877,89035\n44878,996\n44879,403\n44879,1805\n44880,1179\n44881,649\n44883,1181\n44883,1204\n44884,298\n44885,485\n44886,222\n44886,536\n44886,596\n44887,690\n44887,872\n44888,1515\n44889,1977\n44889,1978\n44890,178\n44891,861\n44892,1893\n44893,65\n44895,87\n44895,392\n44895,433\n44895,2699\n44898,1402\n44899,209\n44900,3724\n44901,72\n44902,344\n44903,285\n44904,240\n44905,34\n44905,991\n44906,83\n44907,5440\n44908,200\n44909,644\n44910,2744\n44910,3247\n44911,298\n44912,485\n44913,1411\n44913,3804\n44914,346\n44915,222\n44915,605\n44916,209\n44917,1033\n44918,1454\n44919,726\n44919,859\n44920,23783\n44921,760\n44921,1085\n44921,3585\n44922,336\n44922,459\n44923,602\n44924,309\n44924,310\n44925,209\n44926,852\n44928,2744\n44928,3247\n44929,302\n44929,579\n44929,861\n44929,1010\n44929,1849\n44929,6303\n44930,298\n44931,485\n44933,868\n44934,422\n44936,209\n44937,937\n44937,1117\n44937,2191\n44938,44939\n44938,69414\n44940,167\n44940,1544\n44941,893\n44942,4276\n44943,3069\n44944,264\n44944,491\n44944,515\n44945,435\n44946,1983\n44947,200\n44948,302\n44948,1659\n44949,211\n44949,217\n44949,309\n44949,310\n44949,609\n44949,623\n44949,818\n44949,1019\n44949,1118\n44949,1210\n44949,1796\n44950,406\n44951,417\n44951,1085\n44951,1955\n44951,3623\n44952,861\n44953,140\n44953,467\n44953,515\n44954,920\n44955,271\n44956,10\n44957,3949\n44958,392\n44959,417\n44960,304\n44961,151\n44962,63\n44962,137\n44962,326\n44962,422\n44962,736\n44962,752\n44962,1011\n44962,1140\n44962,1220\n44962,1222\n44962,1881\n44962,2411\n44962,30331\n44963,920\n44964,5405\n44965,1227\n44965,1229\n44965,2105\n44965,4220\n44965,4611\n44966,479\n44967,9457\n44968,298\n44969,485\n44972,35\n44972,167\n44972,536\n44972,2671\n44972,23287\n44972,102560\n44972,127158\n44972,207045\n44973,222\n44973,4637\n44973,19443\n44974,298\n44975,485\n44976,9121\n44977,712\n44978,1893\n44978,2312\n44979,500\n44980,160\n44981,702\n44983,1531\n44984,346\n44985,346\n44986,346\n44987,298\n44988,485\n44989,1119\n44990,346\n44990,1294\n44991,1188\n44992,79\n44993,4\n44993,5\n44994,1623\n44994,17590\n44995,3451\n44995,3452\n44996,17593\n44997,3209\n44998,65\n44999,743\n45000,390\n45001,893\n45001,2750\n45002,252\n45002,318\n45003,996\n45004,693\n45005,932\n45006,346\n45007,657\n45008,346\n45009,657\n45010,104\n45011,346\n45012,389\n45013,1803\n45014,1140\n45014,5547\n45015,2506\n45016,934\n45017,7360\n45018,1070\n45019,893\n45020,30766\n45020,45021\n45020,45022\n45020,45023\n45020,45024\n45025,581\n45026,22\n45026,602\n45026,652\n45026,1070\n45026,1860\n45026,1893\n45027,5469\n45029,34\n45029,35\n45029,536\n45029,4672\n45030,215\n45030,417\n45031,406\n45032,1715\n45032,3804\n45033,850\n45033,1400\n45034,83\n45035,1803\n45036,45037\n45039,45040\n45041,1805\n45042,346\n45043,45044\n45046,171\n45047,292\n45048,647\n45049,344\n45050,347\n45050,697\n45050,6955\n45051,1559\n45052,192\n45052,586\n45053,602\n45054,151\n45055,298\n45056,485\n45057,1285\n45058,10\n45059,980\n45060,104\n45062,298\n45063,485\n45065,849\n45065,911\n45066,1085\n45066,15100\n45066,16228\n45066,18726\n45066,18727\n45066,19276\n45066,20315\n45066,29619\n45066,32058\n45066,32832\n45066,33702\n45066,34271\n45066,35745\n45066,36014\n45066,41578\n45066,41772\n45066,42725\n45066,45495\n45066,45501\n45066,45748\n45066,47365\n45066,47401\n45066,47700\n45066,47955\n45066,47965\n45066,47968\n45066,47970\n45066,48466\n45066,52154\n45066,52292\n45066,52296\n45066,52298\n45066,52303\n45066,52306\n45066,52307\n45066,52308\n45066,52309\n45066,52311\n45066,52312\n45066,52314\n45066,52317\n45066,52319\n45066,52320\n45066,52519\n45066,53863\n45066,54511\n45066,54514\n45066,54528\n45066,55348\n45066,55363\n45066,57654\n45066,57894\n45066,57895\n45066,58614\n45066,58619\n45066,59210\n45066,60050\n45066,60084\n45066,60523\n45066,63462\n45066,63481\n45066,63662\n45066,64197\n45066,65426\n45066,65430\n45066,65472\n45066,66749\n45066,66767\n45066,66818\n45066,66838\n45066,66847\n45066,66870\n45066,66910\n45066,67052\n45066,68660\n45066,68908\n45066,71901\n45066,72821\n45066,73008\n45066,73480\n45066,73517\n45066,77720\n45066,78897\n45066,78980\n45066,79528\n45066,82525\n45066,84383\n45066,87725\n45066,88507\n45066,88599\n45066,95604\n45066,97651\n45066,101798\n45066,104425\n45066,107646\n45066,111687\n45066,114184\n45066,114657\n45066,114660\n45066,114708\n45066,114709\n45066,117188\n45066,117313\n45066,117315\n45066,117888\n45066,118531\n45066,118535\n45066,118538\n45066,118551\n45066,118553\n45066,118561\n45066,118564\n45066,118566\n45066,118573\n45066,118576\n45066,118577\n45066,118580\n45066,118592\n45066,118646\n45066,119065\n45066,119066\n45066,119078\n45066,119084\n45066,119085\n45066,119086\n45066,119087\n45066,119089\n45066,119234\n45066,119607\n45066,119803\n45066,120107\n45066,120113\n45066,120695\n45066,121239\n45066,121641\n45066,122178\n45066,122768\n45066,123407\n45066,125606\n45066,126168\n45066,127886\n45066,129825\n45066,130028\n45066,130551\n45066,131856\n45066,158773\n45066,159476\n45066,160271\n45066,160276\n45066,160855\n45066,161720\n45066,161723\n45066,162776\n45066,163154\n45066,163703\n45066,164376\n45066,164520\n45066,165085\n45066,166272\n45066,166932\n45066,168791\n45066,169597\n45066,169599\n45066,170694\n45066,171872\n45066,172248\n45066,173299\n45066,173333\n45066,177059\n45066,178559\n45066,184356\n45066,184860\n45066,186669\n45066,186709\n45066,188054\n45066,191323\n45066,192054\n45066,216259\n45066,216805\n45066,234001\n45066,244195\n45066,245614\n45066,254005\n45066,259471\n45066,259472\n45066,260952\n45067,2590\n45072,664\n45072,20359\n45075,563\n45077,1227\n45077,1229\n45077,86416\n45079,120\n45080,301\n45080,2557\n45082,304\n45084,1282\n45085,45086\n45087,516\n45088,1177\n45093,346\n45094,83\n45095,579\n45096,660\n45097,1402\n45098,302\n45099,346\n45100,850\n45101,435\n45101,439\n45101,622\n45101,1531\n45103,2045\n45104,346\n45105,2506\n45106,2506\n45107,45108\n45109,326\n45109,873\n45110,79\n45111,298\n45112,485\n45113,875\n45115,298\n45116,485\n45117,151\n45118,298\n45119,485\n45120,45121\n45122,215\n45124,360\n45125,273\n45126,390\n45127,1285\n45127,3328\n45128,589\n45129,1118\n45131,3467\n45132,1531\n45133,1072\n45134,58\n45134,801\n45134,1140\n45135,2083\n45136,605\n45136,1119\n45136,1167\n45136,2995\n45136,103860\n45137,1014\n45138,45139\n45140,4\n45140,5\n45140,292\n45140,441\n45140,446\n45140,693\n45140,5627\n45140,6621\n45141,1363\n45142,875\n45145,215\n45146,483\n45147,8994\n45148,215\n45149,211\n45149,2421\n45150,376\n45152,240\n45152,588\n45152,590\n45152,592\n45152,818\n45153,171\n45154,3695\n45155,79\n45156,182\n45156,841\n45156,1515\n45156,45594\n45157,298\n45158,485\n45159,93\n45159,94\n45160,45161\n45162,298\n45163,485\n45164,1181\n45165,298\n45166,485\n45167,77\n45167,1544\n45167,1749\n45169,360\n45170,23701\n45171,3507\n45172,211\n45173,247\n45174,872\n45175,248\n45176,273\n45176,274\n45177,2105\n45178,4604\n45179,1204\n45180,1551\n45181,97\n45182,298\n45183,485\n45184,388\n45184,435\n45184,48505\n45185,14989\n45186,298\n45187,485\n45188,389\n45189,264\n45190,104\n45191,298\n45192,485\n45193,298\n45194,485\n45195,22\n45195,37\n45195,567\n45195,968\n45195,1210\n45195,1284\n45196,1181\n45197,34\n45197,35\n45197,222\n45198,34\n45198,35\n45198,250\n45198,1684\n45199,1983\n45200,346\n45201,740\n45201,741\n45202,2979\n45203,491\n45203,852\n45203,1449\n45204,304\n45205,45206\n45207,5366\n45208,298\n45209,485\n45210,697\n45211,1359\n45212,649\n45213,577\n45214,298\n45215,485\n45216,298\n45217,485\n45218,1858\n45219,1860\n45220,640\n45220,4192\n45220,4193\n45221,779\n45222,233\n45222,240\n45222,592\n45222,631\n45222,714\n45222,760\n45222,1785\n45222,1818\n45222,2416\n45222,2417\n45222,5718\n45223,626\n45224,1871\n45225,21826\n45226,1858\n45227,1860\n45228,118\n45228,4597\n45229,217\n45229,1417\n45230,7416\n45231,167\n45231,240\n45231,347\n45231,372\n45231,605\n45231,615\n45231,720\n45231,907\n45231,968\n45231,1001\n45231,1085\n45231,1122\n45231,1133\n45231,1160\n45231,1167\n45231,1231\n45231,1284\n45231,1298\n45231,1436\n45231,1522\n45231,1564\n45231,1785\n45231,1837\n45231,2620\n45231,3193\n45231,3194\n45231,3207\n45231,3218\n45231,3422\n45231,5662\n45231,5718\n45232,640\n45233,298\n45234,485\n45235,3585\n45236,10\n45237,346\n45238,602\n45239,1298\n45240,557\n45241,557\n45242,2782\n45243,271\n45244,1882\n45245,72\n45246,349\n45247,87\n45248,264\n45249,417\n45250,298\n45251,485\n45252,45253\n45255,602\n45257,3161\n45258,949\n45259,4810\n45260,163\n45260,6303\n45262,3161\n45263,298\n45264,485\n45265,298\n45266,485\n45267,536\n45268,1085\n45269,2506\n45270,1133\n45271,2775\n45272,447\n45273,1243\n45274,1381\n45275,920\n45276,45277\n45278,1955\n45278,2775\n45279,99\n45280,298\n45281,485\n45282,45283\n45284,298\n45285,485\n45286,298\n45287,485\n45288,1634\n45289,1\n45289,868\n45289,1619\n45289,7956\n45290,1\n45291,652\n45291,1429\n45292,44\n45293,1414\n45294,310\n45294,6556\n45295,206\n45296,104\n45297,3161\n45298,310\n45299,119\n45300,195\n45301,30\n45301,264\n45301,640\n45301,1980\n45301,4823\n45302,805\n45303,160\n45304,596\n45304,749\n45304,1368\n45305,45306\n45307,818\n45308,640\n45309,45310\n45311,1001\n45312,2178\n45312,4545\n45313,99\n45314,158\n45315,2334\n45316,81\n45317,503\n45318,247\n45319,1\n45319,195\n45319,306\n45319,307\n45319,330\n45319,994\n45319,1247\n45319,3161\n45320,267\n45321,83\n45322,72\n45323,493\n45323,586\n45323,1243\n45323,1265\n45323,1266\n45325,563\n45326,81\n45327,217\n45327,247\n45327,372\n45327,467\n45327,1181\n45328,14650\n45329,8270\n45330,1556\n45331,1983\n45333,366\n45334,366\n45335,366\n45336,366\n45337,366\n45338,366\n45339,366\n45340,366\n45341,192\n45342,366\n45343,366\n45344,366\n45345,366\n45346,187\n45347,366\n45348,366\n45349,366\n45350,2995\n45351,20\n45352,2574\n45353,175\n45354,2626\n45355,704\n45356,704\n45358,206\n45359,9560\n45360,45361\n45360,47607\n45362,233\n45363,346\n45364,1419\n45365,3182\n45366,195\n45367,19227\n45368,515\n45369,4611\n45370,1544\n45371,298\n45372,485\n45374,330\n45375,2351\n45376,2351\n45377,8788\n45378,240\n45379,298\n45380,485\n45381,1118\n45382,1\n45383,147\n45384,298\n45385,485\n45386,312\n45387,2607\n45388,298\n45389,485\n45390,626\n45390,920\n45391,58\n45392,46\n45393,45394\n45395,1238\n45396,298\n45397,485\n45398,77\n45398,788\n45398,1631\n45399,50\n45399,602\n45399,3218\n45399,4866\n45400,1452\n45402,346\n45403,338\n45403,835\n45403,1968\n45404,1844\n45405,330\n45406,346\n45407,372\n45407,1082\n45408,330\n45410,163\n45410,489\n45411,306\n45411,307\n45412,577\n45412,1105\n45413,811\n45414,45415\n45417,45418\n45419,602\n45419,3218\n45419,4866\n45420,298\n45421,485\n45422,206\n45422,1631\n45423,972\n45424,1509\n45427,206\n45427,217\n45427,240\n45427,457\n45427,467\n45427,534\n45427,868\n45427,1085\n45427,1803\n45427,75912\n45427,152855\n45428,151\n45430,640\n45431,640\n45432,640\n45433,611\n45433,1718\n45434,3\n45435,290\n45435,2206\n45435,2995\n45435,8788\n45436,24763\n45436,45437\n45438,182\n45438,3507\n45439,422\n45440,3260\n45441,422\n45442,422\n45443,422\n45444,422\n45445,422\n45446,422\n45447,422\n45448,1298\n45448,1616\n45449,422\n45450,422\n45451,158\n45452,1968\n45453,440\n45454,146\n45454,167\n45454,726\n45455,1010\n45456,1644\n45457,298\n45458,485\n45459,346\n45460,1590\n45460,1644\n45462,2944\n45463,1858\n45464,1860\n45465,298\n45466,485\n45467,261\n45468,72\n45469,2574\n45470,346\n45471,255\n45472,1001\n45473,309\n45473,310\n45474,119\n45474,577\n45474,1400\n45475,875\n45476,704\n45477,106\n45479,602\n45480,301\n45480,872\n45480,968\n45480,2557\n45481,182\n45481,2173\n45482,515\n45483,50\n45484,1732\n45485,273\n45485,805\n45485,1980\n45485,8991\n45486,349\n45487,1718\n45488,72\n45490,58\n45491,46\n45492,2353\n45493,652\n45494,206\n45495,1515\n45496,3207\n45497,346\n45499,72\n45500,2424\n45502,217\n45503,483\n45504,298\n45505,485\n45506,3555\n45507,264\n45508,1707\n45509,336\n45510,167\n45511,389\n45511,2646\n45512,626\n45513,1\n45514,500\n45515,843\n45516,1016\n45517,2775\n45518,447\n45519,3345\n45520,859\n45521,1707\n45522,79\n45523,1653\n45523,2436\n45525,2995\n45526,1782\n45528,1274\n45529,79\n45530,420\n45532,1818\n45533,1707\n45534,575\n45534,5540\n45535,1332\n45535,1572\n45536,209\n45537,34\n45537,35\n45538,32\n45538,349\n45538,392\n45538,509\n45538,510\n45538,644\n45538,697\n45538,809\n45538,3003\n45538,76096\n45539,1188\n45540,86\n45541,97\n45542,1285\n45542,6263\n45544,305\n45544,859\n45544,1147\n45545,717\n45546,200\n45547,849\n45548,577\n45549,287\n45550,225\n45550,557\n45550,5405\n45551,255\n45552,1151\n45552,1454\n45553,500\n45554,1962\n45555,1052\n45556,1882\n45557,2775\n45558,54\n45559,2210\n45559,4237\n45560,417\n45560,1580\n45561,1151\n45561,1454\n45562,298\n45563,485\n45564,435\n45565,149\n45566,34\n45566,35\n45567,298\n45568,485\n45569,389\n45570,1243\n45571,1429\n45572,26\n45572,59\n45573,149\n45575,209\n45576,1749\n45577,7\n45577,211\n45577,4078\n45577,7124\n45578,1319\n45579,209\n45580,209\n45581,644\n45582,20\n45583,86\n45584,217\n45584,949\n45586,209\n45587,209\n45588,518\n45589,481\n45590,891\n45590,949\n45590,1363\n45590,2191\n45590,148742\n45591,907\n45592,209\n45593,72\n45595,160\n45595,3003\n45596,26\n45596,59\n45597,211\n45598,5440\n45600,1227\n45600,1229\n45601,301\n45601,615\n45601,968\n45602,225\n45603,1858\n45604,1860\n45605,217\n45606,577\n45607,149\n45608,217\n45608,19443\n45609,500\n45611,1977\n45611,1978\n45612,160\n45613,5718\n45614,99\n45615,209\n45616,1749\n45617,2995\n45618,97\n45619,209\n45620,306\n45620,307\n45621,872\n45621,6695\n45622,1858\n45623,1319\n45624,209\n45625,209\n45627,611\n45628,72\n45629,872\n45630,1070\n45630,4455\n45631,106\n45632,415\n45632,13361\n45633,346\n45634,158\n45635,1983\n45636,707\n45637,301\n45638,360\n45639,217\n45639,1417\n45640,6726\n45641,45642\n45643,328\n45643,1305\n45644,45642\n45645,1927\n45646,640\n45647,283\n45647,2775\n45649,202\n45649,203\n45650,305\n45652,4611\n45653,1544\n45654,2828\n45655,360\n45656,192\n45657,3413\n45659,20771\n45660,147\n45660,1235\n45660,1335\n45660,21944\n45661,2210\n45661,4237\n45662,1429\n45663,251\n45663,1512\n45663,5992\n45664,77\n45665,4504\n45666,34\n45666,35\n45666,2266\n45666,127158\n45666,188791\n45666,212914\n45667,809\n45668,294\n45668,567\n45668,3345\n45669,718\n45670,1564\n45671,178\n45671,2671\n45671,6298\n45672,1663\n45673,1085\n45674,818\n45675,1370\n45676,932\n45677,1707\n45678,1181\n45679,338\n45679,14556\n45680,622\n45681,344\n45682,6303\n45684,682\n45685,287\n45685,1149\n45686,14434\n45687,417\n45688,872\n45689,298\n45690,485\n45691,1659\n45692,2668\n45694,1564\n45695,509\n45696,628\n45697,346\n45698,287\n45698,697\n45698,1653\n45699,919\n45700,13661\n45701,994\n45703,346\n45704,1058\n45704,1113\n45704,1623\n45705,287\n45706,346\n45707,83\n45707,620\n45708,50\n45708,71\n45708,473\n45708,2750\n45709,209\n45710,702\n45710,873\n45710,874\n45710,1001\n45710,1801\n45711,1007\n45711,1289\n45711,3999\n45713,1837\n45714,332\n45714,862\n45715,3367\n45716,337\n45716,509\n45717,483\n45717,1432\n45717,1803\n45718,1179\n45719,1033\n45720,1243\n45721,1068\n45721,1474\n45721,1789\n45722,4355\n45723,1068\n45725,577\n45726,247\n45727,442\n45728,45729\n45728,79092\n45728,205452\n45730,626\n45732,45733\n45734,444\n45735,26\n45735,59\n45736,26\n45736,59\n45738,1858\n45739,1860\n45740,6955\n45741,1363\n45742,10\n45743,972\n45744,107\n45744,372\n45744,1309\n45744,14231\n45745,68\n45746,258\n45747,209\n45748,79\n45748,309\n45748,310\n45748,467\n45748,1191\n45748,1192\n45750,301\n45750,861\n45750,893\n45750,1231\n45750,2979\n45750,3422\n45752,1016\n45752,2379\n45753,980\n45754,222\n45754,590\n45754,1419\n45754,2292\n45755,151\n45756,424\n45757,1370\n45760,240\n45761,272\n45762,1\n45763,134\n45763,135\n45763,137\n45763,138\n45763,2105\n45764,346\n45765,83\n45766,41\n45767,45768\n45769,1388\n45770,72\n45771,3\n45772,195\n45773,264\n45774,86\n45775,4771\n45776,968\n45776,1564\n45777,217\n45778,563\n45778,920\n45779,1417\n45780,4192\n45780,4193\n45781,87\n45781,17384\n45782,5405\n45783,795\n45784,1474\n45785,58\n45785,1140\n45786,1465\n45787,1007\n45787,1289\n45787,3999\n45788,45789\n45790,209\n45792,6303\n45793,45794\n45795,93\n45795,94\n45796,45797\n45798,1858\n45799,1860\n45800,184\n45801,247\n45802,875\n45803,634\n45804,86\n45805,298\n45806,485\n45807,376\n45808,56\n45809,623\n45810,34\n45810,35\n45810,217\n45811,392\n45812,818\n45813,209\n45814,171\n45815,949\n45816,671\n45817,10\n45818,605\n45819,620\n45820,1881\n45821,647\n45822,344\n45823,518\n45823,3089\n45825,604\n45826,2073\n45826,2626\n45827,1001\n45828,1564\n45829,298\n45830,485\n45832,5101\n45833,83\n45834,1\n45835,45836\n45837,273\n45837,274\n45839,775\n45840,640\n45841,4192\n45841,4193\n45842,640\n45843,58\n45844,46\n45845,1227\n45845,1229\n45846,192\n45847,640\n45848,435\n45849,1556\n45850,640\n45851,557\n45852,557\n45853,10\n45853,720\n45853,877\n45853,907\n45853,972\n45853,1010\n45853,1117\n45853,1122\n45853,1167\n45853,1284\n45853,1544\n45853,1623\n45853,1849\n45853,1973\n45853,2191\n45853,3218\n45853,5662\n45854,1877\n45855,760\n45856,862\n45857,5718\n45858,1274\n45859,5213\n45860,3447\n45861,45862\n45863,2286\n45864,72\n45865,186\n45865,1326\n45865,1411\n45865,3804\n45867,1298\n45868,640\n45869,21487\n45870,631\n45870,760\n45870,805\n45870,1462\n45870,8537\n45871,146\n45871,1247\n45871,1368\n45872,2367\n45873,250\n45873,1684\n45874,217\n45874,1019\n45875,298\n45876,485\n45877,5101\n45878,338\n45878,356\n45878,525\n45878,852\n45878,920\n45879,483\n45880,4060\n45881,86\n45882,217\n45882,222\n45883,3830\n45884,45885\n45886,41\n45886,206\n45886,301\n45886,592\n45886,694\n45886,1465\n45886,1608\n45886,1801\n45886,2775\n45886,9030\n45887,779\n45888,874\n45889,104\n45889,134\n45889,135\n45889,850\n45890,1033\n45892,2436\n45893,298\n45894,485\n45895,7416\n45896,1458\n45897,1133\n45899,515\n45900,389\n45901,160\n45902,3804\n45903,68\n45904,106\n45904,333\n45904,586\n45904,59021\n45904,60576\n45905,102\n45907,3447\n45908,104\n45909,298\n45910,485\n45911,704\n45912,390\n45912,589\n45912,1544\n45913,151\n45915,44\n45916,273\n45916,274\n45917,389\n45918,298\n45919,485\n45920,420\n45921,1379\n45922,1326\n45923,640\n45924,45925\n45924,49727\n45926,45927\n45928,366\n45929,10\n45929,113156\n45930,151\n45931,6726\n45932,417\n45933,1370\n45934,417\n45935,862\n45935,2590\n45936,41\n45937,704\n45939,225\n45940,631\n45941,1893\n45942,16207\n45943,346\n45944,602\n45945,4192\n45945,4193\n45946,1033\n45947,346\n45948,1556\n45949,7\n45950,215\n45951,207\n45952,45953\n45955,704\n45956,2146\n45957,207\n45958,9560\n45959,45960\n45961,3804\n45962,671\n45963,45964\n45965,1767\n45966,2735\n45967,704\n45968,186\n45968,775\n45969,186\n45970,45971\n45972,2574\n45973,45974\n45976,45977\n45978,1796\n45979,261\n45981,424\n45982,83\n45982,1707\n45983,259\n45983,272\n45983,1070\n45985,818\n45985,861\n45987,45988\n45991,872\n45993,1\n45993,83\n45993,273\n45993,298\n45993,626\n45993,859\n45993,1058\n45993,1415\n45993,1571\n45993,4039\n45993,4355\n45994,86\n45995,808\n45995,1465\n45997,233\n45998,515\n46000,489\n46001,68\n46001,269\n46001,483\n46001,710\n46001,784\n46001,1241\n46001,1345\n46001,1572\n46001,2083\n46001,3069\n46001,5874\n46002,298\n46003,485\n46004,50\n46005,298\n46006,485\n46007,255\n46008,46009\n46008,47112\n46008,61608\n46008,71632\n46008,80510\n46008,89282\n46008,91002\n46008,104494\n46008,124252\n46008,124357\n46008,127606\n46008,128617\n46008,129859\n46008,130667\n46008,132256\n46008,134503\n46010,209\n46011,1551\n46013,48\n46014,46015\n46016,46017\n46018,3451\n46018,3452\n46019,19\n46020,366\n46021,366\n46022,366\n46023,240\n46024,366\n46025,366\n46026,366\n46027,186\n46028,1151\n46028,2436\n46028,5547\n46029,366\n46030,467\n46030,1556\n46031,366\n46033,366\n46034,202\n46034,203\n46035,1143\n46036,366\n46037,366\n46038,366\n46039,366\n46040,366\n46041,366\n46042,1858\n46043,1860\n46044,46045\n46044,62881\n46047,500\n46048,46049\n46050,366\n46051,907\n46051,932\n46053,941\n46054,1046\n46055,306\n46055,307\n46056,2784\n46057,46058\n46059,720\n46060,298\n46061,485\n46062,30\n46062,328\n46064,3\n46065,298\n46066,485\n46067,1983\n46068,298\n46069,485\n46070,333\n46071,298\n46072,485\n46073,1858\n46074,1860\n46075,968\n46076,579\n46077,1191\n46078,292\n46079,503\n46080,192\n46080,247\n46080,406\n46080,467\n46080,599\n46080,56150\n46081,346\n46083,1181\n46084,26\n46084,59\n46085,264\n46086,2553\n46087,56\n46088,577\n46089,349\n46089,697\n46090,1782\n46092,356\n46093,859\n46094,592\n46095,46096\n46097,46096\n46098,46096\n46099,46096\n46100,46096\n46101,46096\n46102,46096\n46103,46096\n46104,46096\n46105,46096\n46106,46096\n46107,46096\n46108,46096\n46109,46096\n46110,46096\n46111,46096\n46112,46096\n46113,46096\n46114,46096\n46115,46096\n46116,46096\n46117,422\n46118,422\n46119,422\n46120,422\n46121,422\n46122,422\n46123,422\n46124,422\n46125,422\n46126,422\n46127,273\n46127,274\n46128,1001\n46128,3804\n46129,3258\n46129,28107\n46130,46131\n46132,1888\n46133,3769\n46134,1220\n46134,1222\n46135,79\n46135,147\n46135,149\n46135,406\n46136,248\n46136,1332\n46137,577\n46137,1070\n46138,298\n46139,485\n46140,932\n46141,349\n46141,1836\n46142,22\n46143,1453\n46144,60576\n46145,10\n46145,1572\n46146,5405\n46151,2353\n46152,225\n46152,248\n46153,151\n46155,2083\n46156,192\n46157,4060\n46159,137\n46160,302\n46161,3653\n46162,298\n46163,485\n46164,6750\n46165,68\n46165,83\n46165,356\n46165,390\n46165,392\n46165,455\n46165,536\n46165,703\n46165,752\n46165,1043\n46165,1274\n46165,1284\n46165,1849\n46165,1860\n46165,2421\n46165,2590\n46165,2779\n46165,3367\n46165,5301\n46165,5591\n46165,6068\n46165,7194\n46165,32784\n46166,4771\n46167,1732\n46168,1072\n46169,252\n46169,1220\n46169,1222\n46170,301\n46170,861\n46170,893\n46170,2979\n46172,65\n46172,957\n46172,1815\n46173,1749\n46174,2931\n46175,861\n46177,720\n46178,186\n46178,2209\n46178,3804\n46179,557\n46180,192\n46182,668\n46182,1803\n46183,202\n46183,203\n46184,171\n46185,516\n46186,65\n46187,832\n46188,298\n46189,485\n46190,186\n46191,577\n46192,4611\n46193,83\n46194,1556\n46195,272\n46196,422\n46197,50\n46197,206\n46197,340\n46198,158\n46199,1309\n46200,877\n46201,2506\n46202,1385\n46203,2073\n46204,1265\n46204,1266\n46205,2929\n46205,23701\n46206,1659\n46207,1590\n46208,186\n46209,392\n46209,509\n46211,302\n46212,273\n46212,274\n46213,298\n46214,485\n46215,2506\n46216,1400\n46216,4805\n46217,723\n46218,298\n46219,485\n46220,46221\n46222,46223\n46224,206\n46225,644\n46226,1052\n46226,1579\n46228,175\n46229,2775\n46230,447\n46231,2867\n46231,22880\n46232,175\n46233,222\n46234,1466\n46235,315\n46236,1298\n46237,623\n46237,1805\n46239,66\n46240,571\n46240,1893\n46240,5547\n46241,2784\n46242,392\n46244,195\n46246,72\n46247,46248\n46247,104917\n46247,108179\n46249,3804\n46250,907\n46250,1284\n46251,687\n46252,1531\n46253,3260\n46254,15573\n46255,596\n46255,1368\n46256,657\n46257,1707\n46258,6837\n46259,344\n46260,1001\n46261,1332\n46261,5405\n46262,107\n46262,296\n46263,298\n46264,485\n46267,736\n46269,195\n46270,516\n46271,79\n46271,264\n46271,392\n46271,433\n46271,525\n46271,818\n46271,832\n46271,934\n46271,1058\n46271,1210\n46271,1955\n46271,2557\n46271,5250\n46271,8276\n46271,127158\n46271,207837\n46272,622\n46273,5310\n46274,1571\n46275,1977\n46275,1978\n46276,431\n46276,784\n46276,943\n46277,392\n46278,1571\n46279,5405\n46280,143\n46281,602\n46282,1688\n46283,720\n46286,663\n46286,664\n46287,1454\n46288,130\n46288,3999\n46289,72\n46290,3161\n46292,195\n46293,240\n46293,818\n46294,389\n46294,3260\n46295,2607\n46295,4101\n46296,86\n46297,2828\n46298,149\n46299,1224\n46299,3177\n46300,932\n46301,2923\n46301,4190\n46303,3582\n46304,1058\n46305,46306\n46307,577\n46308,1858\n46309,1203\n46310,1860\n46311,247\n46312,130\n46313,298\n46314,485\n46315,195\n46316,240\n46316,372\n46316,1955\n46317,1639\n46318,1983\n46319,841\n46320,1400\n46321,120\n46321,217\n46321,222\n46321,349\n46321,392\n46321,433\n46321,467\n46321,868\n46321,1118\n46321,1411\n46321,2989\n46321,2991\n46321,3367\n46321,3804\n46321,141912\n46321,162599\n46322,83\n46323,301\n46323,877\n46323,907\n46323,972\n46323,1117\n46323,1284\n46323,1522\n46323,54362\n46324,261\n46325,663\n46325,1370\n46326,439\n46326,1559\n46327,636\n46328,7360\n46329,2989\n46329,2991\n46329,27041\n46330,72\n46331,149\n46331,424\n46331,1058\n46332,859\n46333,338\n46334,158\n46334,406\n46335,818\n46336,333\n46337,146\n46338,972\n46338,1572\n46339,1572\n46339,1688\n46340,852\n46340,1238\n46340,1572\n46340,1722\n46340,3538\n46341,1210\n46342,140\n46344,3182\n46345,1392\n46346,1983\n46347,3321\n46348,485\n46349,222\n46350,440\n46351,3069\n46352,1639\n46353,1893\n46354,1659\n46354,6695\n46355,392\n46356,273\n46356,274\n46357,2178\n46357,4545\n46358,731\n46359,356\n46359,852\n46360,149\n46361,852\n46362,1287\n46363,9029\n46364,602\n46365,289\n46365,290\n46365,417\n46366,346\n46367,2105\n46368,392\n46368,1240\n46368,1465\n46369,58\n46370,11\n46370,15\n46370,83\n46370,178\n46370,505\n46370,644\n46370,663\n46370,664\n46370,707\n46370,712\n46370,713\n46370,809\n46370,1087\n46370,1089\n46370,1191\n46370,1623\n46370,2605\n46370,3258\n46370,3967\n46370,3999\n46371,298\n46372,485\n46373,991\n46374,26\n46374,59\n46375,1955\n46376,1235\n46376,1335\n46377,30\n46378,4252\n46380,872\n46380,6695\n46381,83\n46382,4611\n46383,1544\n46384,83\n46385,1085\n46386,1058\n46387,68\n46388,920\n46389,72\n46390,731\n46393,298\n46394,485\n46395,1033\n46396,590\n46396,20813\n46397,211\n46397,664\n46399,2506\n46400,872\n46400,1659\n46401,2424\n46402,1235\n46402,1335\n46403,46404\n46405,6303\n46406,48\n46406,130\n46406,649\n46406,1007\n46406,1132\n46406,1147\n46406,1381\n46406,1452\n46406,1639\n46408,788\n46410,151\n46411,818\n46412,1052\n46413,264\n46414,298\n46415,485\n46417,1\n46417,1127\n46418,657\n46419,364\n46420,843\n46421,46422\n46421,86966\n46423,920\n46425,1436\n46426,247\n46427,79\n46427,994\n46428,298\n46429,312\n46430,483\n46431,1019\n46431,1635\n46432,85\n46433,2646\n46434,399\n46435,2779\n46436,46437\n46438,302\n46438,579\n46438,687\n46438,811\n46438,861\n46438,1659\n46438,2116\n46438,4453\n46439,875\n46440,252\n46440,344\n46440,647\n46440,919\n46441,3\n46442,46443\n46444,788\n46445,72\n46446,65\n46447,1858\n46448,1860\n46449,1274\n46450,1381\n46451,671\n46452,83\n46453,81\n46454,1122\n46455,46456\n46457,360\n46458,71\n46459,647\n46459,1146\n46460,1414\n46461,46462\n46463,346\n46464,704\n46465,195\n46465,217\n46465,222\n46465,302\n46465,1033\n46465,2668\n46465,5375\n46466,718\n46467,376\n46468,247\n46469,1479\n46470,302\n46471,72\n46472,479\n46473,718\n46474,2557\n46476,93\n46476,94\n46478,34\n46478,35\n46479,360\n46480,875\n46481,83\n46482,1881\n46483,4611\n46484,72\n46484,292\n46484,312\n46484,1052\n46484,3538\n46484,3695\n46485,83\n46486,192\n46486,256\n46486,862\n46487,310\n46488,1414\n46489,8308\n46490,1265\n46490,1266\n46491,393\n46491,1033\n46492,704\n46493,10\n46494,875\n46495,500\n46496,217\n46497,972\n46498,200\n46499,240\n46500,302\n46501,949\n46502,225\n46503,920\n46504,72\n46505,1608\n46505,4903\n46506,72\n46507,1151\n46508,4810\n46509,77\n46510,46511\n46512,704\n46513,272\n46514,1707\n46515,22\n46515,1210\n46516,6789\n46517,2506\n46518,187\n46519,58\n46520,1033\n46521,795\n46522,298\n46523,485\n46524,557\n46525,557\n46526,9121\n46528,563\n46529,269\n46530,46531\n46532,704\n46533,298\n46534,485\n46535,1556\n46536,872\n46537,704\n46538,389\n46539,592\n46540,2266\n46541,455\n46541,7092\n46542,304\n46543,32\n46544,2506\n46545,1572\n46546,346\n46547,46548\n46549,861\n46550,206\n46551,44\n46553,72\n46554,344\n46555,285\n46556,292\n46557,557\n46558,1309\n46558,1955\n46558,3129\n46559,485\n46560,779\n46561,1043\n46562,46563\n46562,52144\n46564,1881\n46565,158\n46566,1140\n46567,254\n46567,557\n46568,1353\n46569,376\n46570,1224\n46571,885\n46572,704\n46573,4594\n46574,1564\n46574,1785\n46574,2620\n46574,5718\n46575,30\n46576,46577\n46578,9025\n46580,760\n46581,5343\n46582,2319\n46583,83\n46584,301\n46584,968\n46586,41941\n46587,563\n46588,2045\n46589,46590\n46592,704\n46593,72\n46594,1133\n46595,72\n46596,46597\n46599,264\n46599,736\n46600,99\n46601,704\n46602,592\n46604,46605\n46606,312\n46606,1052\n46608,301\n46609,147\n46609,779\n46609,141912\n46610,571\n46610,1893\n46610,5343\n46610,5547\n46611,631\n46612,1085\n46613,79\n46614,240\n46615,356\n46615,516\n46615,1220\n46615,1222\n46616,46617\n46618,536\n46619,46620\n46621,46622\n46623,298\n46624,485\n46625,28072\n46626,46627\n46628,233\n46629,620\n46630,50\n46632,46633\n46634,4344\n46634,8373\n46635,827\n46636,30\n46637,97\n46638,698\n46638,762\n46638,1740\n46638,1782\n46638,13991\n46638,77637\n46638,85842\n46638,161560\n46638,175946\n46638,178743\n46638,191902\n46639,872\n46640,1359\n46640,15179\n46642,2506\n46643,312\n46644,602\n46645,3451\n46645,3452\n46646,46647\n46648,808\n46649,366\n46650,9323\n46651,366\n46652,366\n46653,366\n46654,366\n46655,366\n46656,366\n46657,366\n46658,366\n46659,697\n46659,2045\n46660,366\n46661,72\n46662,366\n46663,366\n46664,366\n46665,1140\n46665,5547\n46666,366\n46667,301\n46667,968\n46668,1203\n46669,631\n46669,1363\n46669,2372\n46669,2671\n46670,366\n46672,366\n46673,697\n46674,366\n46675,366\n46676,1127\n46677,309\n46677,310\n46678,366\n46679,366\n46680,17384\n46681,422\n46682,56\n46683,1332\n46684,392\n46684,697\n46685,72\n46686,697\n46686,96130\n46687,1368\n46689,306\n46689,307\n46691,3193\n46692,3193\n46694,779\n46696,1509\n46697,3193\n46698,760\n46698,1149\n46698,1631\n46699,1010\n46699,1122\n46699,1849\n46700,68\n46700,387\n46701,3193\n46702,788\n46703,147\n46704,1912\n46705,1968\n46706,1815\n46706,35687\n46707,8270\n46708,2995\n46709,46710\n46711,46712\n46713,46714\n46715,422\n46716,56\n46717,589\n46717,1294\n46717,1326\n46717,3804\n46718,3193\n46719,130\n46720,1010\n46721,1231\n46722,775\n46723,46724\n46725,392\n46725,644\n46726,666\n46726,15179\n46727,868\n46728,1133\n46729,1968\n46730,422\n46731,422\n46732,422\n46733,422\n46734,4411\n46735,422\n46736,1511\n46736,3069\n46737,406\n46738,1639\n46739,2989\n46739,2991\n46740,217\n46741,2607\n46742,1284\n46743,2292\n46744,50\n46745,1392\n46746,171\n46747,34\n46747,35\n46747,83\n46747,493\n46747,1608\n46748,217\n46748,222\n46748,536\n46748,1417\n46749,1177\n46750,104\n46751,264\n46752,422\n46753,56\n46754,77\n46754,160\n46754,299\n46754,388\n46754,483\n46754,620\n46754,1749\n46754,2421\n46754,4903\n46756,422\n46757,422\n46758,422\n46759,422\n46760,422\n46762,1323\n46763,102\n46764,1326\n46765,408\n46767,46768\n46769,1151\n46769,1711\n46769,1836\n46770,302\n46771,717\n46772,422\n46773,56\n46774,581\n46775,516\n46775,1014\n46776,225\n46776,431\n46777,527\n46778,417\n46779,104\n46780,422\n46781,56\n46782,209\n46784,422\n46785,56\n46786,15573\n46787,907\n46788,1983\n46790,389\n46791,72\n46792,968\n46792,1293\n46793,344\n46794,647\n46795,344\n46796,518\n46796,1326\n46797,209\n46798,330\n46799,120\n46800,83\n46800,385\n46800,605\n46800,749\n46800,2224\n46800,5034\n46800,5591\n46801,2506\n46802,2506\n46804,301\n46804,1231\n46804,1293\n46804,5662\n46805,2116\n46805,2372\n46806,1212\n46807,852\n46807,1326\n46808,2626\n46808,8907\n46809,455\n46810,5405\n46811,1893\n46811,5547\n46812,19010\n46813,264\n46813,1659\n46814,919\n46815,422\n46816,1983\n46817,56\n46818,26\n46818,59\n46819,83\n46820,301\n46820,1231\n46821,240\n46821,1955\n46822,481\n46823,4190\n46825,1284\n46825,1688\n46826,483\n46827,392\n46828,264\n46828,1893\n46829,130\n46829,264\n46829,1749\n46830,202\n46831,481\n46832,483\n46832,1400\n46832,3524\n46832,3695\n46833,1033\n46835,736\n46836,26\n46836,59\n46836,83\n46836,250\n46836,344\n46836,500\n46836,1684\n46836,3967\n46837,718\n46838,178\n46838,1033\n46839,167\n46839,467\n46839,1796\n46840,920\n46841,596\n46842,891\n46844,779\n46844,1033\n46845,1151\n46845,1454\n46846,1276\n46847,602\n46848,285\n46848,779\n46849,481\n46849,604\n46850,718\n46851,1849\n46853,30\n46854,46855\n46854,132719\n46856,104\n46856,557\n46856,953\n46856,954\n46856,5405\n46857,22\n46858,5662\n46859,1877\n46860,304\n46861,663\n46861,664\n46862,332\n46862,1515\n46864,644\n46865,422\n46866,87\n46866,1769\n46866,1836\n46867,106\n46867,1370\n46867,6119\n46868,37\n46869,1285\n46870,251\n46871,20\n46871,86\n46871,675\n46872,1983\n46873,1235\n46873,1335\n46874,104\n46874,138\n46874,289\n46874,290\n46874,372\n46874,503\n46874,557\n46874,586\n46874,631\n46874,714\n46874,805\n46874,1016\n46874,1119\n46874,1149\n46874,1955\n46874,2105\n46874,4220\n46874,4571\n46874,6556\n46874,44725\n46874,94134\n46874,136072\n46874,172012\n46874,176782\n46875,393\n46875,439\n46876,1858\n46877,1860\n46878,222\n46879,602\n46879,634\n46880,634\n46881,37\n46881,698\n46881,1782\n46882,611\n46883,932\n46883,1016\n46883,2205\n46883,2206\n46884,264\n46885,717\n46885,1058\n46885,2646\n46886,455\n46887,1858\n46888,1860\n46889,652\n46890,195\n46891,818\n46892,1033\n46892,19010\n46893,79\n46894,818\n46895,358\n46896,875\n46897,1220\n46897,1222\n46898,252\n46899,775\n46900,251\n46901,500\n46902,1962\n46903,1052\n46904,1882\n46905,2775\n46906,54\n46907,2210\n46907,4237\n46908,240\n46909,1274\n46910,397\n46911,392\n46911,644\n46911,1151\n46912,1977\n46912,1978\n46913,720\n46914,714\n46914,2205\n46914,2206\n46915,485\n46915,2310\n46916,1707\n46917,6119\n46918,120\n46919,1220\n46919,1222\n46920,252\n46921,251\n46923,1983\n46924,720\n46924,775\n46924,877\n46924,907\n46924,973\n46924,1001\n46924,1117\n46924,1284\n46924,1522\n46924,1715\n46924,1732\n46924,1837\n46924,2083\n46924,2191\n46924,9024\n46925,861\n46926,932\n46927,1370\n46928,9030\n46930,1220\n46930,1222\n46931,252\n46932,251\n46933,344\n46933,1836\n46934,302\n46934,4453\n46935,390\n46936,818\n46936,1151\n46937,697\n46938,392\n46938,1860\n46938,3769\n46939,328\n46940,1220\n46940,1222\n46941,252\n46942,251\n46943,3111\n46944,259\n46945,217\n46945,1289\n46945,1381\n46946,151\n46947,509\n46947,1043\n46948,3585\n46949,248\n46950,1559\n46950,25573\n46951,852\n46952,366\n46952,527\n46952,740\n46952,741\n46952,743\n46953,1276\n46954,1227\n46954,1229\n46954,1252\n46954,1253\n46954,21944\n46954,40566\n46955,10\n46956,2979\n46957,1016\n46958,298\n46959,485\n46960,717\n46961,2828\n46962,1590\n46963,264\n46964,717\n46965,326\n46966,1789\n46967,1707\n46968,872\n46969,1419\n46970,467\n46970,538\n46970,920\n46970,1893\n46971,1052\n46971,1983\n46972,206\n46973,1803\n46974,151\n46975,3804\n46976,207\n46977,298\n46978,485\n46980,1803\n46981,68\n46982,1462\n46982,8537\n46983,46984\n46985,258\n46986,31976\n46987,312\n46988,575\n46989,439\n46991,1007\n46992,207\n46993,994\n46994,4039\n46995,663\n46995,1010\n46995,1298\n46995,1616\n46995,1749\n46995,2191\n46996,567\n46997,873\n46997,874\n46998,2506\n46999,2668\n47000,861\n47001,349\n47002,852\n47003,1858\n47004,1860\n47005,872\n47005,1659\n47006,510\n47006,2045\n47008,510\n47009,510\n47009,1143\n47009,1453\n47011,875\n47011,1400\n47011,1893\n47012,779\n47014,510\n47015,147\n47016,47017\n47018,1052\n47019,1177\n47019,47020\n47019,51845\n47019,85072\n47019,212888\n47021,875\n47022,81233\n47024,622\n47026,818\n47027,83\n47028,510\n47029,1\n47030,801\n47030,1140\n47030,5547\n47032,83\n47033,736\n47033,1927\n47034,264\n47034,433\n47035,1220\n47035,1222\n47036,252\n47037,251\n47038,510\n47039,832\n47040,292\n47040,312\n47041,301\n47042,1740\n47043,264\n47043,1749\n47043,14550\n47044,390\n47046,697\n47047,3\n47047,106\n47047,510\n47047,875\n47047,1848\n47048,83\n47048,5591\n47049,3\n47049,510\n47051,167\n47051,2083\n47052,442\n47053,779\n47054,8270\n47055,481\n47056,4549\n47057,66\n47058,954\n47058,10318\n47059,1220\n47059,1222\n47060,1796\n47061,2867\n47061,22880\n47062,338\n47063,1274\n47064,47065\n47066,673\n47067,63\n47068,1707\n47069,302\n47070,26\n47070,59\n47072,1046\n47073,2979\n47074,301\n47075,628\n47076,264\n47077,4355\n47078,163\n47078,440\n47079,302\n47079,861\n47081,83\n47081,577\n47081,1871\n47081,3115\n47082,510\n47083,433\n47084,1220\n47084,1222\n47085,252\n47086,251\n47087,5308\n47088,47089\n47090,1240\n47091,1085\n47091,1285\n47092,247\n47093,38634\n47094,34\n47094,35\n47095,640\n47095,3507\n47096,47097\n47098,420\n47098,1572\n47098,1653\n47098,1722\n47098,3538\n47099,151\n47100,292\n47100,745\n47100,1238\n47100,1677\n47100,3830\n47100,24500\n47101,704\n47102,704\n47103,941\n47104,23011\n47105,48\n47106,192\n47106,217\n47106,392\n47106,435\n47106,1210\n47106,1392\n47106,1796\n47106,1844\n47106,4355\n47107,861\n47108,920\n47109,18298\n47110,907\n47111,861\n47113,178\n47113,1033\n47114,186\n47114,518\n47114,1326\n47114,1849\n47114,5130\n47115,340\n47116,652\n47117,1467\n47118,450\n47119,1119\n47120,46\n47121,217\n47122,483\n47123,302\n47124,147\n47124,158\n47124,406\n47125,2372\n47126,202\n47126,203\n47127,736\n47128,252\n47128,314\n47128,516\n47128,41170\n47129,676\n47130,861\n47131,264\n47131,392\n47131,577\n47131,1559\n47131,1860\n47131,3182\n47131,4760\n47131,6303\n47132,151\n47133,5310\n47134,626\n47135,302\n47136,247\n47137,934\n47137,1033\n47138,58\n47139,47140\n47141,652\n47142,301\n47142,435\n47142,447\n47142,1033\n47142,1590\n47143,809\n47144,636\n47145,450\n47146,647\n47147,344\n47149,72\n47150,160\n47151,47151\n47152,497\n47152,510\n47152,516\n47152,1655\n47152,2334\n47153,1522\n47153,2557\n47153,73570\n47154,1289\n47154,1509\n47155,376\n47156,349\n47157,920\n47159,861\n47159,3260\n47160,72\n47161,240\n47161,372\n47161,862\n47161,1085\n47161,2812\n47162,83\n47163,366\n47164,366\n47165,366\n47166,366\n47167,366\n47168,47169\n47168,61516\n47168,137178\n47168,141506\n47168,146097\n47168,147722\n47168,153116\n47168,159691\n47168,190974\n47170,366\n47171,47172\n47173,298\n47173,372\n47173,852\n47173,1285\n47173,1309\n47173,1955\n47173,2590\n47173,2812\n47174,47175\n47174,49846\n47174,75538\n47174,75894\n47174,76136\n47174,77834\n47174,84897\n47174,105067\n47174,154875\n47174,155435\n47176,652\n47177,1454\n47178,147\n47179,104\n47180,500\n47181,3\n47181,4\n47181,5\n47181,26\n47181,32\n47181,34\n47181,35\n47181,48\n47181,50\n47181,59\n47181,63\n47181,68\n47181,72\n47181,79\n47181,81\n47181,83\n47181,86\n47181,97\n47181,104\n47181,106\n47181,107\n47181,116\n47181,119\n47181,134\n47181,135\n47181,136\n47181,137\n47181,146\n47181,149\n47181,158\n47181,163\n47181,182\n47181,187\n47181,192\n47181,195\n47181,200\n47181,202\n47181,203\n47181,207\n47181,219\n47181,222\n47181,225\n47181,247\n47181,248\n47181,256\n47181,261\n47181,264\n47181,273\n47181,274\n47181,278\n47181,287\n47181,294\n47181,296\n47181,299\n47181,302\n47181,305\n47181,306\n47181,307\n47181,309\n47181,310\n47181,313\n47181,315\n47181,326\n47181,328\n47181,332\n47181,333\n47181,344\n47181,360\n47181,366\n47181,376\n47181,387\n47181,392\n47181,393\n47181,399\n47181,403\n47181,406\n47181,420\n47181,422\n47181,430\n47181,433\n47181,435\n47181,438\n47181,439\n47181,447\n47181,452\n47181,455\n47181,489\n47181,491\n47181,493\n47181,497\n47181,505\n47181,509\n47181,516\n47181,538\n47181,557\n47181,596\n47181,602\n47181,615\n47181,622\n47181,626\n47181,649\n47181,652\n47181,657\n47181,663\n47181,664\n47181,671\n47181,673\n47181,682\n47181,697\n47181,704\n47181,714\n47181,717\n47181,720\n47181,736\n47181,743\n47181,752\n47181,758\n47181,760\n47181,770\n47181,772\n47181,779\n47181,784\n47181,801\n47181,809\n47181,811\n47181,827\n47181,843\n47181,850\n47181,862\n47181,874\n47181,875\n47181,893\n47181,918\n47181,919\n47181,920\n47181,929\n47181,932\n47181,973\n47181,991\n47181,994\n47181,1016\n47181,1019\n47181,1033\n47181,1052\n47181,1070\n47181,1085\n47181,1096\n47181,1127\n47181,1130\n47181,1140\n47181,1149\n47181,1179\n47181,1181\n47181,1188\n47181,1227\n47181,1229\n47181,1235\n47181,1240\n47181,1243\n47181,1285\n47181,1294\n47181,1298\n47181,1309\n47181,1335\n47181,1368\n47181,1370\n47181,1381\n47181,1392\n47181,1400\n47181,1419\n47181,1436\n47181,1449\n47181,1453\n47181,1454\n47181,1458\n47181,1465\n47181,1474\n47181,1509\n47181,1515\n47181,1522\n47181,1531\n47181,1539\n47181,1544\n47181,1572\n47181,1590\n47181,1623\n47181,1631\n47181,1634\n47181,1639\n47181,1644\n47181,1688\n47181,1707\n47181,1722\n47181,1749\n47181,1767\n47181,1773\n47181,1782\n47181,1796\n47181,1801\n47181,1805\n47181,1807\n47181,1818\n47181,1844\n47181,1849\n47181,1860\n47181,1871\n47181,1877\n47181,1881\n47181,1891\n47181,1912\n47181,1927\n47181,1962\n47181,1968\n47181,1984\n47181,2045\n47181,2083\n47181,2087\n47181,2089\n47181,2178\n47181,2205\n47181,2206\n47181,2210\n47181,2224\n47181,2266\n47181,2286\n47181,2315\n47181,2367\n47181,2372\n47181,2373\n47181,2411\n47181,2421\n47181,2424\n47181,2572\n47181,2607\n47181,2646\n47181,2701\n47181,2750\n47181,2782\n47181,2797\n47181,2837\n47181,2915\n47181,2931\n47181,2940\n47181,2944\n47181,2995\n47181,3003\n47181,3069\n47181,3148\n47181,3194\n47181,3209\n47181,3218\n47181,3252\n47181,3409\n47181,3507\n47181,3695\n47181,4039\n47181,4101\n47181,4172\n47181,4237\n47181,4276\n47181,4453\n47181,4545\n47181,4637\n47181,4760\n47181,4805\n47181,4865\n47181,4866\n47181,4903\n47181,5192\n47181,5213\n47181,5250\n47181,5301\n47181,5326\n47181,5358\n47181,5540\n47181,5662\n47181,5726\n47181,5911\n47181,6051\n47181,6119\n47181,6298\n47181,6837\n47181,6861\n47181,7117\n47181,7143\n47181,7155\n47181,7614\n47181,7698\n47181,8541\n47181,9004\n47181,9008\n47181,13661\n47181,14352\n47181,15807\n47181,21944\n47181,27550\n47181,31976\n47181,37414\n47181,47268\n47182,640\n47183,20771\n47184,1572\n47185,743\n47186,1888\n47187,273\n47187,274\n47188,3999\n47189,34\n47189,35\n47190,2367\n47191,301\n47192,2367\n47193,217\n47193,222\n47193,1417\n47194,289\n47194,290\n47195,577\n47196,1400\n47197,392\n47197,660\n47198,424\n47199,1070\n47200,516\n47201,430\n47202,4691\n47203,772\n47204,47205\n47206,557\n47207,8719\n47208,138\n47209,865\n47210,557\n47211,137\n47212,652\n47213,118\n47213,4597\n47214,21944\n47215,217\n47216,557\n47217,557\n47218,392\n47218,697\n47219,47220\n47221,424\n47222,44\n47223,2083\n47224,287\n47225,1858\n47226,1860\n47227,126\n47228,47229\n47230,275\n47231,1149\n47232,477\n47233,1858\n47234,1860\n47235,779\n47236,1210\n47237,47238\n47237,61889\n47240,99\n47241,240\n47242,87\n47243,1179\n47244,1556\n47245,72\n47246,332\n47246,1888\n47246,9025\n47247,120\n47248,2367\n47249,72\n47250,255\n47251,72\n47252,557\n47253,417\n47253,605\n47253,1634\n47254,330\n47255,779\n47255,1515\n47256,872\n47257,47258\n47259,195\n47260,111\n47260,4355\n47260,4771\n47261,861\n47262,72\n47263,344\n47264,285\n47265,272\n47266,47267\n47266,62821\n47269,1381\n47270,489\n47271,406\n47272,22\n47272,178\n47272,211\n47272,622\n47272,1891\n47273,3209\n47274,6303\n47275,68\n47276,47277\n47278,292\n47279,389\n47280,500\n47281,1962\n47282,1052\n47283,1882\n47284,2775\n47285,54\n47286,2210\n47286,4237\n47287,417\n47288,47289\n47290,47291\n47290,65248\n47290,113424\n47290,114567\n47290,115795\n47290,120517\n47290,122860\n47290,123350\n47290,124805\n47290,126467\n47292,2244\n47293,1284\n47294,289\n47294,290\n47295,872\n47296,298\n47297,485\n47298,47299\n47300,47301\n47302,47303\n47302,50738\n47302,84367\n47302,95316\n47302,103636\n47302,107326\n47302,206972\n47304,536\n47305,4101\n47306,664\n47306,20359\n47307,1980\n47307,8991\n47309,147\n47309,158\n47309,206\n47309,406\n47309,779\n47309,2244\n47310,47311\n47312,1368\n47313,47314\n47316,885\n47317,861\n47318,252\n47318,318\n47319,225\n47320,663\n47320,664\n47321,440\n47322,8884\n47323,714\n47324,1085\n47325,2574\n47326,808\n47327,47328\n47329,644\n47330,920\n47331,275\n47332,452\n47332,918\n47333,4039\n47335,86\n47335,167\n47335,240\n47335,301\n47335,372\n47335,567\n47335,589\n47335,605\n47335,615\n47335,631\n47335,720\n47335,801\n47335,907\n47335,968\n47335,972\n47335,973\n47335,1010\n47335,1122\n47335,1124\n47335,1140\n47335,1167\n47335,1231\n47335,1241\n47335,1284\n47335,1298\n47335,1309\n47335,1436\n47335,1522\n47335,1544\n47335,1564\n47335,1782\n47335,1785\n47335,1818\n47335,1837\n47335,1849\n47335,1893\n47335,2191\n47335,2372\n47335,2557\n47335,2620\n47335,2979\n47335,3193\n47335,3207\n47335,3218\n47336,489\n47337,2048\n47339,47340\n47341,298\n47342,485\n47345,704\n47346,47347\n47346,105020\n47348,233\n47349,1452\n47351,1070\n47352,366\n47353,366\n47354,366\n47355,366\n47356,366\n47357,1238\n47358,17384\n47359,47360\n47363,1287\n47364,861\n47367,861\n47368,160\n47368,309\n47368,310\n47368,929\n47368,972\n47368,1305\n47368,1559\n47368,1749\n47368,3999\n47368,142430\n47369,6837\n47370,306\n47370,307\n47371,240\n47371,818\n47372,178\n47373,2367\n47374,68\n47375,3804\n47376,47377\n47378,2775\n47379,447\n47380,1323\n47381,102\n47382,1326\n47383,408\n47384,47385\n47386,86\n47387,2750\n47388,269\n47388,850\n47389,14434\n47390,47391\n47390,54796\n47392,422\n47393,422\n47394,422\n47395,422\n47396,422\n47397,422\n47398,422\n47399,422\n47400,30\n47403,5308\n47404,36398\n47405,47406\n47407,195\n47408,8270\n47409,30\n47409,1796\n47409,47410\n47409,49200\n47409,52977\n47409,54147\n47409,60899\n47409,65299\n47409,69552\n47409,78413\n47409,82357\n47409,82518\n47409,83182\n47409,84674\n47409,85192\n47409,93368\n47409,93418\n47409,100455\n47409,105415\n47409,106602\n47409,107314\n47409,108564\n47409,110198\n47409,111782\n47409,112695\n47409,115520\n47409,120190\n47409,120303\n47409,120417\n47409,120754\n47409,122364\n47409,124008\n47409,124964\n47409,125787\n47409,126350\n47409,128417\n47409,128581\n47409,128806\n47409,129041\n47409,129336\n47409,129365\n47409,130051\n47409,135740\n47409,143590\n47409,151809\n47409,157958\n47411,5874\n47412,20\n47412,1033\n47413,47414\n47415,3069\n47416,47416\n47417,920\n47418,47419\n47420,202\n47420,203\n47422,932\n47423,577\n47424,301\n47424,968\n47425,2828\n47426,481\n47427,2334\n47428,255\n47429,17384\n47430,271\n47431,1\n47432,818\n47433,2567\n47434,206\n47435,346\n47436,248\n47437,2296\n47438,72\n47439,2646\n47440,1274\n47441,47442\n47443,302\n47443,687\n47443,811\n47443,893\n47443,1374\n47443,2116\n47444,79\n47445,217\n47446,178\n47447,6695\n47448,222\n47449,3960\n47450,1837\n47451,47452\n47453,14996\n47454,14674\n47455,31977\n47456,805\n47457,7270\n47458,849\n47459,872\n47460,346\n47461,4101\n47461,6556\n47462,137\n47463,2512\n47464,634\n47466,267\n47467,9560\n47468,310\n47469,65\n47470,483\n47471,192\n47471,588\n47471,590\n47471,1140\n47471,1579\n47471,1769\n47471,1893\n47471,2051\n47471,3474\n47471,5547\n47471,8907\n47471,31977\n47471,49057\n47471,68069\n47472,217\n47473,18726\n47474,1458\n47475,743\n47476,47477\n47478,47477\n47479,47477\n47480,47477\n47482,1425\n47482,2674\n47484,366\n47485,79\n47486,298\n47487,485\n47488,47489\n47488,56149\n47488,68069\n47488,74727\n47488,106003\n47488,109501\n47488,113594\n47490,298\n47491,485\n47493,1479\n47494,47495\n47496,47497\n47498,298\n47499,485\n47500,79\n47501,271\n47502,827\n47502,1392\n47502,1531\n47503,1381\n47504,1707\n47505,158\n47505,406\n47505,779\n47505,1181\n47505,1515\n47506,47507\n47508,442\n47509,44\n47510,366\n47511,366\n47512,2146\n47513,527\n47514,47515\n47517,968\n47518,390\n47518,589\n47518,156379\n47519,10\n47520,772\n47521,2146\n47522,15179\n47523,47524\n47525,1149\n47526,1265\n47526,1266\n47526,47527\n47526,170460\n47528,47529\n47530,47531\n47530,120575\n47533,298\n47534,485\n47535,72\n47536,54\n47536,47537\n47538,26\n47538,59\n47539,47539\n47539,58575\n47540,994\n47540,21944\n47541,16207\n47542,273\n47542,274\n47543,298\n47544,485\n47546,298\n47547,485\n47548,1368\n47549,1715\n47550,379\n47550,1274\n47551,21944\n47552,219\n47552,743\n47553,298\n47554,485\n47555,516\n47556,1181\n47557,298\n47558,485\n47559,47560\n47561,841\n47562,3069\n47563,388\n47564,1181\n47565,72\n47566,344\n47567,285\n47568,704\n47569,206\n47570,1204\n47571,13\n47571,298\n47571,994\n47572,187\n47573,1414\n47574,47575\n47576,47575\n47577,47575\n47578,47575\n47579,195\n47580,557\n47581,195\n47582,893\n47583,7270\n47584,72\n47585,330\n47586,1796\n47587,3413\n47588,779\n47589,1623\n47590,47591\n47592,698\n47593,312\n47594,346\n47595,3246\n47595,3247\n47596,344\n47597,585\n47598,6888\n47600,233\n47601,8788\n47602,1379\n47603,290\n47603,8992\n47604,1767\n47605,7652\n47606,81\n47608,3246\n47608,3247\n47609,107\n47610,2416\n47610,2417\n47611,292\n47612,338\n47613,47614\n47615,298\n47616,1133\n47617,3538\n47618,72\n47619,3413\n47620,1247\n47621,634\n47622,1634\n47623,366\n47624,366\n47625,366\n47626,366\n47627,366\n47628,366\n47629,298\n47630,485\n47631,47632\n47631,135847\n47633,783\n47634,1\n47634,11\n47634,86\n47634,192\n47634,315\n47634,330\n47634,333\n47634,397\n47634,444\n47634,452\n47634,581\n47634,713\n47634,929\n47634,1014\n47634,1058\n47634,1113\n47634,1191\n47634,1192\n47634,1220\n47634,1241\n47634,1300\n47634,1579\n47634,1677\n47634,1749\n47634,2083\n47634,2373\n47634,2526\n47634,2923\n47634,3999\n47634,4218\n47634,23287\n47634,50318\n47635,6891\n47636,2923\n47637,240\n47638,1181\n47639,1323\n47640,102\n47641,1326\n47642,408\n47643,1955\n47645,4597\n47647,26\n47647,59\n47648,406\n47649,392\n47649,1860\n47650,259\n47651,269\n47651,571\n47651,599\n47651,47652\n47651,53746\n47651,55251\n47653,2506\n47654,861\n47654,1453\n47655,256\n47656,872\n47657,872\n47658,309\n47658,310\n47658,626\n47659,2367\n47660,149\n47661,602\n47662,481\n47663,602\n47664,5213\n47665,366\n47666,13661\n47667,2574\n47668,30\n47670,1707\n47670,20004\n47671,588\n47671,590\n47673,252\n47673,275\n47674,217\n47674,1419\n47675,932\n47676,861\n47677,47678\n47679,255\n47680,8788\n47681,10\n47681,22\n47681,50\n47681,65\n47681,68\n47681,72\n47681,79\n47681,81\n47681,94\n47681,120\n47681,134\n47681,136\n47681,137\n47681,178\n47681,195\n47681,202\n47681,203\n47681,206\n47681,215\n47681,217\n47681,222\n47681,233\n47681,240\n47681,252\n47681,261\n47681,278\n47681,301\n47681,302\n47681,310\n47681,312\n47681,332\n47681,349\n47681,366\n47681,372\n47681,388\n47681,390\n47681,392\n47681,431\n47681,439\n47681,446\n47681,455\n47681,467\n47681,489\n47681,503\n47681,525\n47681,577\n47681,579\n47681,588\n47681,590\n47681,622\n47681,631\n47681,687\n47681,697\n47681,752\n47681,760\n47681,809\n47681,818\n47681,861\n47681,868\n47681,872\n47681,949\n47681,994\n47681,1001\n47681,1010\n47681,1019\n47681,1085\n47681,1118\n47681,1119\n47681,1149\n47681,1151\n47681,1231\n47681,1285\n47681,1309\n47681,1332\n47681,1419\n47681,1466\n47681,1556\n47681,1572\n47681,1634\n47681,1659\n47681,1749\n47681,1769\n47681,1776\n47681,1782\n47681,1796\n47681,1877\n47681,1955\n47681,2017\n47681,2073\n47681,2443\n47681,2620\n47681,2787\n47681,2797\n47681,2979\n47681,2989\n47681,2991\n47681,3135\n47681,3328\n47681,3331\n47681,3345\n47681,3507\n47681,4453\n47681,4823\n47681,5343\n47681,5358\n47681,6279\n47681,6303\n47681,9007\n47681,9015\n47681,9026\n47681,14352\n47681,17309\n47681,21442\n47681,22580\n47681,31896\n47682,1803\n47684,919\n47685,30\n47686,104\n47687,47688\n47689,206\n47690,47691\n47692,652\n47693,4678\n47694,298\n47695,647\n47696,344\n47697,920\n47697,1796\n47698,1381\n47699,206\n47701,118\n47702,47703\n47704,47705\n47707,292\n47707,360\n47707,918\n47707,1509\n47707,3328\n47707,215276\n47708,1326\n47711,1509\n47712,1243\n47713,302\n47714,26\n47714,59\n47715,718\n47716,483\n47717,47718\n47719,2668\n47720,151\n47720,2607\n47721,149\n47722,1175\n47724,47725\n47726,171\n47727,171\n47728,1220\n47728,1222\n47728,1655\n47729,118\n47729,4597\n47730,158\n47731,47732\n47733,10\n47733,113156\n47734,2073\n47735,1238\n47736,47737\n47738,693\n47739,102\n47740,376\n47741,171\n47742,647\n47743,344\n47744,919\n47745,775\n47746,47747\n47748,192\n47749,1238\n47752,358\n47752,1432\n47753,1285\n47754,1132\n47755,781\n47756,389\n47759,2045\n47761,1238\n47762,2135\n47765,2135\n47766,240\n47767,1285\n47767,1300\n47768,1285\n47768,1688\n47769,13546\n47770,1119\n47770,1285\n47770,3585\n47771,22\n47772,206\n47772,406\n47772,205478\n47773,1085\n47773,18726\n47774,626\n47775,795\n47776,2178\n47776,4545\n47777,47778\n47779,269\n47780,6369\n47781,160\n47782,47783\n47784,406\n47786,1001\n47786,47787\n47786,61161\n47786,75954\n47786,99808\n47786,106603\n47786,112103\n47786,114252\n47786,119749\n47786,132000\n47786,142428\n47786,172362\n47786,243028\n47788,47789\n47790,44\n47791,718\n47792,718\n47793,68\n47793,119\n47794,151\n47794,312\n47795,47796\n47797,557\n47798,862\n47799,671\n47800,557\n47801,557\n47802,557\n47803,718\n47804,26\n47804,59\n47805,4\n47805,5\n47805,68\n47805,134\n47805,784\n47805,2089\n47805,2469\n47805,2940\n47805,4220\n47805,5871\n47805,21944\n47805,40942\n47805,48006\n47805,66297\n47805,148461\n47805,172232\n47805,192522\n47805,193129\n47806,527\n47807,312\n47808,1235\n47808,1335\n47808,27621\n47808,27623\n47809,18790\n47810,240\n47810,592\n47811,47812\n47813,1231\n47813,1782\n47814,743\n47815,3209\n47816,47817\n47818,3602\n47819,25\n47819,26\n47819,59\n47819,865\n47819,994\n47819,1432\n47819,2088\n47819,21944\n47820,907\n47821,718\n47822,47823\n47824,47823\n47825,1849\n47826,668\n47826,843\n47827,346\n47827,3115\n47828,1332\n47829,31976\n47830,137\n47831,72\n47832,919\n47833,516\n47834,1\n47834,32\n47834,137\n47834,273\n47834,274\n47834,652\n47834,671\n47834,736\n47834,827\n47834,859\n47834,931\n47834,1058\n47834,1415\n47835,673\n47835,1130\n47836,873\n47836,1210\n47837,47838\n47839,47840\n47839,54836\n47841,47842\n47843,56\n47844,47845\n47846,1274\n47847,310\n47847,3039\n47848,818\n47849,2867\n47850,861\n47851,22\n47852,251\n47853,861\n47854,22\n47855,97\n47856,47857\n47858,1127\n47859,47860\n47861,718\n47862,47863\n47864,47865\n47866,861\n47867,22\n47868,861\n47869,22\n47870,577\n47871,47872\n47871,213668\n47873,250\n47874,47875\n47874,51645\n47874,51895\n47874,80393\n47874,81267\n47876,206\n47877,47878\n47877,112102\n47879,861\n47880,22\n47881,1506\n47882,1019\n47883,47884\n47885,8235\n47886,312\n47887,14989\n47888,13910\n47889,841\n47890,240\n47891,35687\n47892,602\n47893,3538\n47894,760\n47895,301\n47895,372\n47895,907\n47895,968\n47895,1544\n47895,1837\n47896,72\n47897,47898\n47899,1127\n47900,15\n47901,390\n47902,160\n47903,1623\n47904,4\n47904,5\n47905,743\n47906,17593\n47907,3209\n47908,3451\n47908,3452\n47909,65\n47910,195\n47911,4177\n47912,918\n47913,261\n47913,333\n47914,47915\n47916,1033\n47917,206\n47918,207\n47919,1836\n47920,47921\n47920,95632\n47920,102187\n47922,47923\n47924,1181\n47925,980\n47926,292\n47927,294\n47928,296\n47929,298\n47930,146\n47931,1058\n47933,171\n47935,626\n47936,376\n47938,255\n47939,47940\n47941,1659\n47942,200\n47943,47944\n47945,843\n47946,1238\n47947,1085\n47948,1452\n47949,1776\n47950,264\n47951,47952\n47953,1531\n47954,718\n47957,861\n47958,22\n47959,510\n47960,366\n47962,366\n47963,2668\n47964,366\n47966,207\n47967,83\n47969,510\n47971,31976\n47973,509\n47973,510\n47974,1544\n47975,500\n47976,510\n47979,209\n47980,647\n47981,344\n47982,309\n47982,310\n47983,510\n47984,693\n47985,510\n47986,47987\n47989,312\n47990,509\n47991,58\n47992,46\n47993,509\n47993,510\n47993,875\n47994,510\n47996,510\n47998,358\n47998,509\n47998,510\n48001,1127\n48002,301\n48002,5250\n48003,604\n48004,118\n48004,304\n48004,337\n48004,346\n48004,595\n48004,994\n48004,1688\n48004,2315\n48004,4597\n48005,344\n48006,68\n48006,186\n48006,388\n48006,518\n48006,693\n48006,775\n48006,795\n48006,1235\n48006,1326\n48006,1411\n48006,1545\n48006,1715\n48006,2006\n48006,3370\n48006,3804\n48006,5130\n48006,5961\n48006,6837\n48006,15474\n48006,111074\n48006,111140\n48006,111141\n48006,111162\n48007,1639\n48008,1579\n48009,330\n48010,835\n48011,911\n48012,455\n48012,973\n48012,5343\n48012,29380\n48013,843\n48014,58\n48015,46\n48016,338\n48016,710\n48018,48019\n48020,1374\n48021,626\n48022,652\n48023,843\n48024,941\n48024,1262\n48024,3830\n48025,620\n48025,1072\n48026,393\n48026,1531\n48027,306\n48027,307\n48028,302\n48029,83\n48031,809\n48032,843\n48033,202\n48033,203\n48034,34\n48034,536\n48036,671\n48037,184\n48038,233\n48038,577\n48039,211\n48040,251\n48040,516\n48040,1179\n48041,835\n48042,202\n48042,203\n48044,861\n48045,22\n48046,206\n48046,366\n48047,2371\n48048,827\n48049,192\n48049,202\n48049,203\n48049,2371\n48050,634\n48051,467\n48052,261\n48052,694\n48053,586\n48053,1985\n48053,59021\n48054,1132\n48055,781\n48056,875\n48057,2371\n48058,1673\n48059,861\n48060,22\n48061,861\n48062,579\n48063,22\n48064,760\n48065,1132\n48066,626\n48067,48068\n48069,760\n48070,577\n48071,255\n48072,1782\n48074,801\n48075,581\n48076,298\n48077,485\n48078,393\n48078,485\n48078,577\n48078,788\n48078,138686\n48079,72\n48080,344\n48081,285\n48082,34\n48082,35\n48082,313\n48082,536\n48082,2646\n48083,775\n48084,1749\n48086,1204\n48087,1001\n48087,4222\n48088,626\n48090,1983\n48091,626\n48092,1782\n48093,315\n48093,1789\n48094,206\n48095,1019\n48096,340\n48097,2292\n48097,2889\n48098,424\n48100,217\n48101,304\n48101,356\n48101,852\n48101,2334\n48102,577\n48102,788\n48102,1429\n48102,1715\n48102,4039\n48104,1323\n48105,102\n48106,1326\n48107,408\n48108,626\n48109,752\n48109,874\n48109,1210\n48109,1801\n48110,1782\n48112,1293\n48113,2351\n48115,3507\n48116,1127\n48117,48118\n48119,79\n48119,1417\n48120,934\n48121,516\n48122,1370\n48124,1417\n48125,697\n48126,160\n48127,652\n48128,65\n48128,467\n48129,337\n48130,301\n48130,1293\n48130,1782\n48132,1722\n48133,184\n48133,704\n48134,422\n48135,1016\n48136,104\n48136,557\n48136,953\n48136,954\n48137,422\n48138,1782\n48139,1782\n48140,467\n48140,868\n48141,1220\n48141,1222\n48142,252\n48143,251\n48144,843\n48145,422\n48146,215\n48146,1016\n48147,422\n48148,392\n48148,1151\n48149,3804\n48150,422\n48151,119\n48151,192\n48151,309\n48151,310\n48151,577\n48151,1400\n48151,21944\n48152,422\n48153,1417\n48154,422\n48155,718\n48155,1745\n48156,422\n48157,422\n48158,32\n48159,264\n48160,422\n48163,346\n48164,206\n48164,818\n48164,1118\n48164,4260\n48164,115659\n48164,142870\n48166,1556\n48167,731\n48168,809\n48168,980\n48169,272\n48169,668\n48171,861\n48172,22\n48174,1058\n48174,3585\n48176,668\n48178,980\n48179,403\n48179,628\n48179,794\n48180,1707\n48181,79\n48182,68\n48182,360\n48182,1127\n48186,592\n48187,5662\n48188,134\n48188,135\n48188,137\n48188,138\n48188,2105\n48189,219\n48191,1179\n48193,83\n48193,536\n48194,338\n48195,58\n48196,46\n48198,640\n48199,861\n48200,22\n48201,19\n48202,861\n48202,2017\n48203,3252\n48204,392\n48205,2744\n48207,920\n48208,222\n48208,536\n48208,4672\n48208,18831\n48209,83\n48216,1782\n48218,1231\n48218,1782\n48219,1782\n48221,1782\n48223,1782\n48224,717\n48224,1782\n48225,1010\n48225,1241\n48225,1782\n48227,1782\n48228,1133\n48228,14797\n48229,37\n48231,1782\n48232,1782\n48233,171\n48234,211\n48234,5440\n48235,1803\n48235,21442\n48237,192\n48237,1849\n48238,37\n48238,1782\n48238,1837\n48239,56\n48240,634\n48241,634\n48242,1782\n48243,439\n48243,996\n48244,1118\n48245,663\n48245,664\n48245,1224\n48246,22\n48246,1860\n48246,5265\n48247,920\n48248,1983\n48249,1010\n48250,1381\n48250,49057\n48251,301\n48252,2073\n48253,328\n48253,349\n48253,389\n48253,697\n48253,795\n48253,818\n48253,3260\n48253,3804\n48254,332\n48254,1353\n48254,3331\n48254,27041\n48255,21442\n48256,1688\n48257,433\n48258,83\n48259,462\n48259,1688\n48260,301\n48260,657\n48260,1010\n48261,79\n48262,18831\n48263,968\n48264,392\n48264,2116\n48265,1001\n48266,392\n48267,1782\n48268,171\n48269,83\n48270,626\n48271,433\n48272,920\n48273,83\n48274,10\n48275,79\n48277,1353\n48278,79\n48278,298\n48278,615\n48279,1639\n48280,577\n48281,171\n48282,167\n48283,389\n48283,1019\n48283,1860\n48283,148742\n48284,83\n48285,718\n48286,563\n48287,349\n48287,1160\n48287,1381\n48288,718\n48289,577\n48290,202\n48290,579\n48290,794\n48290,1033\n48290,1374\n48290,1590\n48295,138\n48296,206\n48298,589\n48299,1240\n48299,1454\n48300,83\n48301,333\n48302,644\n48304,37\n48304,167\n48304,1782\n48305,37\n48305,301\n48305,1231\n48305,1782\n48306,868\n48308,1983\n48309,83\n48311,217\n48312,184\n48313,178\n48314,301\n48314,1085\n48315,65\n48316,9030\n48317,1160\n48318,20\n48319,32\n48319,65\n48319,222\n48319,875\n48319,2191\n48319,5540\n48320,56\n48320,147\n48320,158\n48320,192\n48321,1143\n48323,4\n48323,5\n48323,424\n48325,2528\n48326,5726\n48327,481\n48328,2436\n48329,467\n48330,34\n48330,35\n48332,20\n48332,182\n48333,392\n48333,875\n48333,1363\n48333,1836\n48333,3260\n48334,805\n48335,264\n48336,1644\n48337,1188\n48340,323\n48341,6263\n48342,83\n48344,5\n48344,557\n48344,615\n48344,1235\n48344,1684\n48344,3794\n48344,4114\n48344,5700\n48344,6621\n48344,9542\n48344,15742\n48344,17364\n48344,21944\n48344,34060\n48344,45701\n48344,48344\n48344,48345\n48344,53885\n48344,55176\n48344,56438\n48344,69395\n48344,69396\n48344,69665\n48344,71657\n48344,74648\n48344,80661\n48344,101805\n48344,102822\n48344,104457\n48344,110550\n48344,112489\n48345,1319\n48346,1033\n48348,579\n48349,557\n48350,83\n48352,718\n48353,1715\n48354,1033\n48355,1749\n48356,1033\n48357,328\n48358,6263\n48359,360\n48360,1201\n48361,3\n48361,435\n48362,1531\n48364,149\n48364,178\n48364,333\n48364,439\n48364,505\n48364,622\n48364,868\n48364,1803\n48364,21442\n48365,32\n48365,392\n48365,697\n48365,809\n48365,76096\n48366,843\n48367,932\n48368,784\n48369,1955\n48371,1276\n48372,389\n48372,455\n48372,657\n48372,949\n48372,32751\n48372,33508\n48373,1977\n48373,1978\n48374,254\n48374,596\n48374,1363\n48374,4276\n48375,861\n48376,22\n48377,861\n48378,22\n48380,516\n48381,63\n48382,439\n48383,366\n48384,2668\n48385,37\n48385,698\n48385,717\n48385,1616\n48385,1715\n48385,1740\n48385,1782\n48386,718\n48387,6661\n48388,647\n48389,233\n48390,809\n48391,1285\n48392,68\n48393,1871\n48394,1590\n48394,1644\n48395,328\n48396,7757\n48399,1707\n48400,65\n48400,467\n48400,868\n48401,2828\n48402,444\n48403,333\n48405,626\n48405,3193\n48406,3135\n48407,48408\n48409,79\n48409,622\n48409,2775\n48410,192\n48411,634\n48412,1105\n48413,571\n48413,868\n48414,349\n48414,2372\n48415,186\n48415,1509\n48415,5547\n48416,273\n48416,274\n48417,2436\n48418,195\n48418,217\n48418,240\n48418,251\n48418,326\n48418,392\n48418,516\n48418,1454\n48418,1572\n48418,3804\n48421,1782\n48423,919\n48424,1782\n48425,138\n48425,1332\n48426,83\n48427,536\n48428,138\n48429,2083\n48432,32\n48432,349\n48432,392\n48433,3138\n48434,83\n48435,6119\n48436,130\n48439,326\n48439,358\n48439,415\n48439,714\n48439,736\n48439,783\n48439,1011\n48439,1043\n48439,1262\n48439,3653\n48439,48505\n48440,9026\n48442,104\n48442,1939\n48443,338\n48444,202\n48445,233\n48446,1522\n48447,48448\n48447,55510\n48447,69348\n48449,392\n48451,104\n48451,200\n48451,442\n48451,714\n48451,805\n48452,147\n48453,433\n48454,247\n48455,602\n48455,3218\n48455,4866\n48457,58\n48458,46\n48459,516\n48460,147\n48460,158\n48460,1235\n48460,1335\n48461,433\n48462,673\n48463,4066\n48464,2626\n48466,26\n48466,59\n48467,255\n48469,296\n48469,2626\n48470,1572\n48471,1113\n48471,1381\n48471,1400\n48471,4831\n48471,13136\n48472,2210\n48472,4237\n48473,1235\n48473,1335\n48473,21944\n48475,852\n48475,2590\n48476,48\n48477,140\n48478,120\n48478,1052\n48479,647\n48480,344\n48481,171\n48482,467\n48483,657\n48484,861\n48484,893\n48485,171\n48488,2506\n48490,920\n48491,516\n48491,1127\n48492,1220\n48492,1222\n48493,252\n48494,251\n48495,2048\n48496,433\n48498,433\n48499,48500\n48501,33598\n48502,433\n48502,1634\n48503,1955\n48504,1133\n48504,3370\n48504,3585\n48504,14453\n48505,186\n48505,388\n48505,518\n48505,685\n48505,707\n48505,852\n48505,911\n48505,1021\n48505,1043\n48505,1084\n48505,1113\n48505,1326\n48505,1345\n48505,3193\n48505,3623\n48505,5704\n48505,6032\n48505,6424\n48505,6638\n48505,6641\n48505,8107\n48505,14572\n48505,18097\n48505,23349\n48505,25395\n48505,28107\n48505,40993\n48505,45184\n48505,48505\n48505,49373\n48505,52232\n48505,56921\n48505,57144\n48505,58218\n48505,58424\n48505,67097\n48505,72956\n48505,73216\n48505,87871\n48505,96685\n48505,126873\n48505,127140\n48505,127154\n48505,131356\n48505,131362\n48505,131753\n48505,135978\n48505,136186\n48505,143410\n48505,147995\n48505,152959\n48505,163450\n48505,169505\n48505,169715\n48505,169811\n48505,170554\n48505,170687\n48505,180987\n48505,182917\n48505,183144\n48505,183283\n48505,188754\n48505,189697\n48505,190361\n48505,194910\n48505,202379\n48505,212995\n48505,214004\n48505,214663\n48505,215928\n48505,221809\n48505,227728\n48505,231111\n48505,243482\n48505,243489\n48505,247782\n48505,250831\n48505,252568\n48505,252714\n48505,255066\n48505,255564\n48505,255760\n48505,255763\n48505,257772\n48505,263329\n48505,263736\n48505,264476\n48507,264\n48507,652\n48508,1773\n48508,14472\n48509,2353\n48510,37\n48512,283\n48512,1509\n48513,79\n48513,2017\n48514,1151\n48514,1836\n48515,222\n48515,360\n48515,455\n48516,37\n48517,310\n48518,1282\n48519,48520\n48521,346\n48522,422\n48523,56\n48524,252\n48524,318\n48524,516\n48525,1345\n48526,4193\n48527,536\n48527,18831\n48528,184\n48530,818\n48531,1001\n48532,104\n48532,248\n48532,991\n48532,1267\n48532,1659\n48532,2605\n48533,48534\n48535,2116\n48536,138\n48537,264\n48538,65\n48538,467\n48538,868\n48539,1147\n48539,1509\n48539,1962\n48539,2089\n48539,2940\n48539,21944\n48539,36819\n48540,302\n48540,2607\n48543,2607\n48544,2607\n48545,167\n48545,225\n48545,299\n48545,349\n48545,809\n48545,968\n48545,1284\n48545,2372\n48545,2607\n48545,3756\n48546,660\n48547,119\n48548,48\n48549,477\n48549,805\n48550,718\n48550,1745\n48551,647\n48552,344\n48553,718\n48554,48555\n48556,312\n48557,668\n48558,527\n48559,48560\n48561,264\n48561,1381\n48562,298\n48564,222\n48564,1417\n48565,1368\n48565,17346\n48566,483\n48567,83\n48568,264\n48569,48570\n48571,209\n48572,202\n48572,203\n48572,516\n48573,366\n48574,425\n48574,992\n48575,312\n48576,151\n48577,1782\n48578,34\n48578,35\n48579,2334\n48580,296\n48580,1381\n48581,6357\n48582,299\n48583,25222\n48584,920\n48585,72\n48586,417\n48587,247\n48587,2867\n48587,22880\n48588,1151\n48589,301\n48590,149\n48591,209\n48591,687\n48592,1556\n48593,138\n48594,1235\n48594,1335\n48594,21944\n48595,1151\n48596,861\n48596,893\n48597,138\n48598,10\n48599,30\n48599,81\n48599,134\n48599,136\n48599,215\n48599,225\n48599,227\n48599,254\n48599,503\n48599,557\n48599,636\n48599,850\n48599,953\n48599,1016\n48599,1149\n48599,1179\n48599,1282\n48599,1332\n48599,1368\n48599,1745\n48599,1844\n48599,1939\n48599,3507\n48599,4276\n48599,4355\n48599,7124\n48599,7270\n48599,8990\n48599,8991\n48599,8992\n48599,8994\n48599,20063\n48600,5375\n48601,68\n48601,81\n48601,5103\n48603,27550\n48604,861\n48605,22\n48606,919\n48607,19413\n48608,302\n48610,356\n48610,3474\n48611,147\n48611,184\n48611,697\n48612,217\n48612,592\n48612,1818\n48613,294\n48614,2775\n48615,447\n48616,1509\n48617,48618\n48619,79\n48619,192\n48620,104\n48620,217\n48621,272\n48622,634\n48623,4475\n48624,134\n48625,599\n48626,247\n48627,1257\n48628,72\n48629,1400\n48630,861\n48630,893\n48631,20\n48632,4678\n48633,843\n48634,72\n48635,861\n48636,1722\n48637,227\n48638,72\n48639,120\n48639,2646\n48641,392\n48642,34\n48642,35\n48643,259\n48643,221336\n48644,349\n48644,392\n48644,1151\n48645,647\n48646,344\n48647,72\n48648,19010\n48649,346\n48650,376\n48651,720\n48652,160\n48653,631\n48653,1085\n48654,72\n48655,302\n48656,34\n48656,35\n48657,349\n48657,392\n48657,697\n48657,703\n48657,720\n48657,3260\n48657,3612\n48658,392\n48659,1849\n48660,1466\n48661,3148\n48662,1298\n48663,302\n48663,2116\n48664,48665\n48666,72\n48667,187\n48668,48669\n48668,51734\n48668,53118\n48668,57772\n48670,77\n48671,86\n48672,516\n48674,217\n48674,392\n48675,72\n48676,10\n48677,1402\n48678,72\n48679,704\n48680,7416\n48681,72\n48682,1381\n48683,72\n48684,48685\n48686,1836\n48687,1844\n48688,20\n48689,72\n48690,640\n48691,27041\n48692,102\n48693,83\n48693,285\n48693,949\n48693,2779\n48693,2784\n48694,252\n48694,1188\n48695,72\n48696,3069\n48697,579\n48698,79\n48699,417\n48700,72\n48701,30\n48701,1179\n48702,376\n48703,885\n48704,34\n48704,35\n48704,313\n48704,2646\n48705,718\n48706,250\n48706,1684\n48707,289\n48707,290\n48708,557\n48709,714\n48709,1119\n48710,557\n48711,626\n48712,615\n48713,72\n48714,2506\n48715,50\n48715,158\n48715,406\n48715,779\n48716,211\n48716,1001\n48716,1844\n48717,79\n48717,743\n48717,8714\n48717,95583\n48718,217\n48718,240\n48719,1608\n48720,313\n48721,5101\n48721,8072\n48722,138\n48723,861\n48724,22\n48725,44\n48726,136\n48727,794\n48728,718\n48729,77\n48729,392\n48729,415\n48729,644\n48729,657\n48729,918\n48729,1453\n48729,1454\n48729,1858\n48729,1860\n48729,1871\n48729,2266\n48729,2699\n48729,3003\n48729,8235\n48729,214734\n48730,48731\n48732,250\n48732,1684\n48733,68\n48734,72\n48735,93\n48735,94\n48736,247\n48737,1453\n48738,50\n48739,718\n48740,1238\n48741,1888\n48742,349\n48743,707\n48744,872\n48745,247\n48746,140\n48747,417\n48747,3069\n48748,1014\n48749,406\n48750,2351\n48751,8788\n48752,4691\n48753,48754\n48755,48756\n48757,171\n48758,450\n48759,390\n48760,1016\n48761,450\n48762,273\n48762,274\n48763,302\n48765,86\n48765,167\n48765,301\n48765,567\n48765,589\n48765,605\n48765,615\n48765,720\n48765,801\n48765,907\n48765,972\n48765,973\n48765,1001\n48765,1124\n48765,1140\n48765,1167\n48765,1241\n48765,1284\n48765,1298\n48765,1309\n48765,1436\n48765,1522\n48765,1782\n48765,1785\n48765,1955\n48765,2083\n48765,2191\n48765,2372\n48765,2443\n48765,2557\n48765,2620\n48765,2979\n48765,3138\n48765,3193\n48765,3207\n48766,192\n48766,693\n48767,48768\n48769,704\n48771,366\n48772,788\n48773,439\n48774,358\n48774,931\n48775,1858\n48776,1860\n48777,1927\n48778,240\n48778,784\n48778,805\n48778,818\n48778,1462\n48778,3467\n48779,206\n48780,37414\n48781,63\n48781,202\n48781,203\n48781,493\n48782,749\n48782,1146\n48782,6059\n48783,83\n48783,389\n48783,949\n48784,330\n48785,48786\n48787,918\n48787,2979\n48788,599\n48789,63\n48790,1579\n48791,4101\n48792,809\n48793,599\n48794,1016\n48795,209\n48796,2931\n48797,577\n48798,444\n48799,126\n48800,424\n48801,1220\n48801,1222\n48802,171\n48803,5440\n48804,211\n48805,192\n48805,406\n48806,252\n48806,318\n48807,252\n48808,48809\n48810,72\n48811,72\n48814,1572\n48815,2048\n48816,1385\n48817,264\n48818,14130\n48819,48820\n48819,63978\n48821,48822\n48824,147\n48824,337\n48825,417\n48826,392\n48826,1151\n48827,1465\n48828,2411\n48829,301\n48830,1551\n48831,310\n48832,301\n48832,392\n48832,442\n48833,328\n48834,704\n48835,704\n48836,72\n48838,30\n48839,10\n48839,2146\n48840,1\n48841,1\n48842,1860\n48843,704\n48844,192\n48844,336\n48844,372\n48844,973\n48844,1085\n48844,2371\n48844,68069\n48845,240\n48846,980\n48847,264\n48848,366\n48849,366\n48850,312\n48850,1052\n48851,366\n48852,366\n48853,366\n48854,366\n48855,868\n48856,626\n48857,273\n48857,274\n48858,72\n48859,233\n48860,538\n48860,5213\n48861,10\n48862,417\n48863,81\n48866,83\n48867,1715\n48868,171\n48872,393\n48873,515\n48875,83\n48878,4611\n48879,1544\n48880,4611\n48881,1544\n48882,893\n48885,72\n48887,275\n48888,393\n48889,431\n48889,455\n48890,160\n48892,148742\n48893,298\n48894,485\n48895,455\n48895,1284\n48895,1634\n48895,148742\n48896,1718\n48896,2646\n48897,2979\n48898,32\n48898,41\n48898,48\n48898,107\n48898,250\n48898,252\n48898,278\n48898,360\n48898,385\n48898,483\n48898,575\n48898,620\n48898,673\n48898,718\n48898,749\n48898,779\n48898,784\n48898,893\n48898,920\n48898,973\n48898,1119\n48898,1160\n48898,1220\n48898,1222\n48898,1238\n48898,1345\n48898,1353\n48898,1684\n48898,1832\n48898,1888\n48898,1962\n48898,2315\n48898,2779\n48898,3207\n48898,4771\n48898,5911\n48898,6119\n48898,19443\n48898,19519\n48899,3451\n48899,3452\n48900,1782\n48901,1381\n48902,217\n48903,1381\n48904,1381\n48905,1381\n48906,178\n48907,1381\n48908,147\n48908,252\n48908,1220\n48908,1222\n48909,186\n48909,1381\n48910,1149\n48911,202\n48911,203\n48912,56\n48913,1381\n48914,1858\n48915,1860\n48916,1381\n48917,151\n48917,192\n48917,500\n48917,1224\n48917,1803\n48917,4903\n48918,861\n48919,22\n48920,225\n48921,301\n48922,48\n48923,1858\n48924,1860\n48925,1381\n48926,48\n48927,415\n48928,690\n48928,832\n48929,104\n48930,1149\n48931,406\n48932,346\n48934,1381\n48935,2073\n48936,1983\n48937,1381\n48938,1983\n48939,248\n48940,306\n48940,307\n48941,301\n48942,1085\n48944,1927\n48945,1381\n48946,302\n48947,8788\n48948,1085\n48949,338\n48949,1453\n48950,2436\n48951,217\n48951,1019\n48951,1417\n48952,694\n48953,1381\n48954,389\n48955,693\n48955,4260\n48955,7117\n48955,15547\n48956,849\n48957,652\n48958,48\n48960,326\n48961,838\n48962,392\n48962,1146\n48963,259\n48963,668\n48965,1309\n48966,58\n48967,46\n48968,920\n48969,147\n48970,611\n48971,1381\n48972,1849\n48972,32784\n48973,302\n48973,1010\n48974,393\n48974,999\n48974,1388\n48975,233\n48975,1203\n48975,3135\n48976,1381\n48977,941\n48979,1085\n48981,1381\n48982,273\n48982,439\n48982,818\n48982,992\n48984,452\n48985,1454\n48986,422\n48987,422\n48988,1509\n48989,422\n48990,1749\n48991,358\n48992,1132\n48993,422\n48994,781\n48995,599\n48996,422\n48997,1381\n48998,302\n48998,467\n48999,336\n49000,571\n49000,868\n49000,1556\n49000,21944\n49001,1381\n49002,227\n49003,6424\n49004,1345\n49006,652\n49007,269\n49008,20359\n49010,718\n49011,65\n49011,868\n49011,1385\n49013,1323\n49014,102\n49015,1326\n49016,408\n49018,302\n49019,1238\n49019,2379\n49020,1436\n49021,264\n49024,1298\n49025,422\n49027,992\n49027,1276\n49027,1860\n49027,19488\n49027,75912\n49028,718\n49029,422\n49031,973\n49031,1298\n49032,422\n49033,422\n49034,264\n49034,1381\n49035,134\n49035,135\n49035,200\n49035,298\n49035,372\n49035,431\n49035,588\n49035,590\n49035,631\n49035,714\n49035,805\n49035,932\n49035,1016\n49035,1955\n49035,6556\n49036,1556\n49037,22\n49037,6726\n49038,422\n49039,264\n49039,117163\n49040,417\n49041,338\n49041,1634\n49042,1247\n49044,49044\n49045,71\n49045,1368\n49045,3467\n49046,2351\n49047,2266\n49048,248\n49049,2590\n49050,202\n49050,203\n49051,1844\n49052,1983\n49053,104\n49054,31073\n49055,1124\n49056,49057\n49058,138\n49059,289\n49059,290\n49059,94134\n49060,1298\n49061,302\n49062,1572\n49062,1722\n49063,509\n49065,1858\n49066,1860\n49067,192\n49068,433\n49069,435\n49070,184\n49071,202\n49071,203\n49072,907\n49073,5366\n49074,1818\n49075,147\n49076,72\n49076,557\n49076,1001\n49076,1210\n49076,75912\n49077,58\n49078,46\n49080,58\n49081,46\n49082,3413\n49083,1782\n49084,298\n49085,485\n49086,1133\n49087,1007\n49087,1381\n49087,1551\n49087,3999\n49088,439\n49089,104\n49089,592\n49090,48\n49091,26\n49091,59\n49092,805\n49092,1210\n49092,1381\n49092,8180\n49093,58\n49094,46\n49095,932\n49096,1871\n49097,2779\n49098,1381\n49098,1893\n49098,7155\n49099,58\n49100,46\n49101,301\n49102,1326\n49103,893\n49104,390\n49104,3115\n49104,6068\n49105,1298\n49106,346\n49107,1179\n49108,30\n49108,2116\n49108,19010\n49108,22293\n49109,25222\n49110,1146\n49111,48\n49112,481\n49112,811\n49113,536\n49113,18831\n49115,557\n49116,1298\n49117,30\n49117,58\n49117,251\n49117,563\n49117,626\n49117,749\n49117,795\n49117,811\n49117,1133\n49117,1368\n49117,1821\n49117,2590\n49117,5708\n49117,21736\n49117,33598\n49118,44013\n49120,79\n49121,37\n49121,202\n49121,440\n49121,615\n49121,794\n49121,868\n49121,1345\n49121,1370\n49121,1411\n49121,2979\n49121,2989\n49121,2991\n49121,5130\n49121,75912\n49122,49123\n49124,718\n49125,1284\n49125,1522\n49125,5662\n49126,1298\n49127,389\n49127,657\n49128,718\n49129,736\n49129,1893\n49129,49057\n49129,81070\n49130,718\n49131,49132\n49133,305\n49134,134\n49134,248\n49134,289\n49134,290\n49134,298\n49134,588\n49134,590\n49134,1745\n49134,94134\n49136,1132\n49137,49138\n49139,392\n49139,433\n49139,644\n49139,697\n49139,1151\n49140,718\n49142,163\n49143,1858\n49144,1860\n49145,1227\n49145,1229\n49145,21944\n49146,163\n49147,10\n49147,163\n49147,202\n49147,203\n49147,217\n49147,332\n49147,333\n49147,483\n49147,1240\n49147,1465\n49147,69377\n49147,69993\n49147,70554\n49148,163\n49149,163\n49150,920\n49151,1113\n49152,81\n49152,1749\n49152,2296\n49154,1019\n49155,163\n49155,302\n49155,893\n49156,163\n49157,163\n49158,163\n49159,481\n49160,163\n49160,805\n49161,516\n49162,349\n49163,163\n49164,163\n49165,163\n49166,493\n49167,163\n49168,280\n49168,1821\n49168,17245\n49171,163\n49172,251\n49172,252\n49172,465\n49172,516\n49174,1655\n49175,392\n49175,931\n49177,222\n49179,163\n49179,215276\n49180,143\n49181,5212\n49182,147\n49184,1241\n49185,163\n49186,163\n49186,579\n49187,22\n49187,163\n49187,302\n49187,392\n49187,579\n49187,1151\n49187,1749\n49187,1836\n49189,1085\n49189,2989\n49189,2991\n49190,298\n49191,485\n49192,163\n49194,65\n49194,868\n49195,252\n49195,318\n49195,1220\n49195,1222\n49195,41170\n49196,697\n49197,1220\n49197,1222\n49198,1220\n49198,1222\n49199,2668\n49201,644\n49202,163\n49202,302\n49203,298\n49204,163\n49205,163\n49206,3\n49207,1381\n49208,392\n49209,1551\n49210,1425\n49211,163\n49212,49213\n49214,422\n49215,56\n49216,422\n49217,56\n49218,163\n49219,422\n49220,56\n49221,65\n49221,467\n49221,868\n49222,919\n49223,147\n49223,163\n49223,8332\n49223,30428\n49224,657\n49225,473\n49226,861\n49227,22\n49228,861\n49229,2210\n49229,3209\n49230,22\n49231,392\n49232,41\n49233,714\n49234,49235\n49236,1241\n49237,163\n49238,163\n49239,694\n49240,349\n49241,1149\n49242,1858\n49243,1860\n49244,775\n49245,298\n49246,485\n49247,81\n49247,202\n49247,203\n49247,272\n49247,631\n49247,1001\n49247,1282\n49247,1284\n49247,4355\n49248,163\n49249,850\n49250,2989\n49250,2991\n49251,163\n49252,392\n49253,264\n49253,2312\n49255,163\n49256,163\n49257,366\n49257,1287\n49258,49259\n49260,252\n49261,264\n49261,1289\n49262,536\n49262,2784\n49262,18831\n49264,163\n49266,1381\n49266,1893\n49267,628\n49268,298\n49269,485\n49271,431\n49272,163\n49273,163\n49273,302\n49274,861\n49275,22\n49276,49277\n49278,6303\n49279,850\n49280,1118\n49281,163\n49283,1309\n49284,868\n49285,626\n49287,500\n49288,1962\n49289,1052\n49290,1882\n49291,2775\n49292,54\n49293,2210\n49293,4237\n49294,1381\n49295,794\n49297,240\n49297,301\n49297,1955\n49298,850\n49299,137\n49299,222\n49299,1019\n49299,1635\n49299,5101\n49299,6323\n49299,8235\n49300,577\n49301,1634\n49302,26\n49302,59\n49303,305\n49304,861\n49305,22\n49306,1977\n49306,1978\n49307,850\n49308,163\n49308,302\n49308,579\n49310,3872\n49311,1623\n49312,49313\n49314,493\n49315,310\n49316,178\n49317,192\n49317,336\n49318,292\n49319,302\n49320,1235\n49320,1335\n49322,20771\n49323,1102\n49324,389\n49325,24505\n49326,850\n49327,1252\n49327,1253\n49328,328\n49329,647\n49330,9026\n49331,21944\n49332,7652\n49333,1849\n49334,48\n49335,83\n49336,1072\n49337,240\n49337,264\n49337,467\n49337,1019\n49337,1181\n49337,1210\n49337,1531\n49337,4355\n49338,929\n49339,227\n49339,503\n49339,1149\n49340,163\n49340,893\n49342,68\n49342,202\n49342,203\n49342,1181\n49343,163\n49343,118336\n49344,163\n49345,163\n49346,760\n49348,302\n49349,1007\n49351,192\n49352,1572\n49352,1722\n49353,949\n49353,2105\n49354,163\n49355,872\n49355,1127\n49355,1893\n49355,49057\n49355,191860\n49356,850\n49357,626\n49358,972\n49359,49360\n49361,932\n49362,3260\n49362,3367\n49363,222\n49364,58\n49365,46\n49366,452\n49367,1247\n49368,184\n49370,163\n49371,28693\n49372,248\n49372,1332\n49373,63\n49373,163\n49373,192\n49373,207\n49373,261\n49373,292\n49373,733\n49373,1167\n49373,1571\n49373,1580\n49373,1619\n49373,1849\n49373,2315\n49373,48505\n49374,56\n49375,163\n49376,509\n49378,187\n49379,389\n49379,4771\n49380,3507\n49381,538\n49382,431\n49383,1509\n49386,3\n49386,349\n49386,392\n49386,510\n49386,3260\n49387,760\n49388,682\n49388,72439\n49389,592\n49390,2737\n49391,518\n49392,3193\n49393,31122\n49395,1509\n49396,58\n49397,46\n49398,631\n49398,1631\n49398,84257\n49399,163\n49401,247\n49402,83\n49402,299\n49402,309\n49402,310\n49402,459\n49402,1509\n49402,2674\n49403,68\n49403,1836\n49404,1639\n49405,1579\n49406,850\n49407,5212\n49408,1210\n49409,850\n49410,167\n49410,301\n49410,73570\n49411,1179\n49413,1001\n49414,1544\n49415,861\n49416,22\n49417,481\n49420,440\n49420,794\n49420,1740\n49421,389\n49422,312\n49423,788\n49424,1132\n49426,811\n49427,850\n49428,111\n49429,1149\n49430,557\n49431,312\n49432,72\n49433,1179\n49434,222\n49435,1509\n49436,49437\n49438,850\n49440,850\n49442,1634\n49443,1509\n49444,48\n49444,459\n49445,1837\n49446,611\n49447,1509\n49449,1634\n49450,422\n49451,56\n49452,2045\n49453,264\n49454,163\n49455,809\n49456,1955\n49457,1119\n49458,349\n49459,1381\n49460,1019\n49460,4172\n49461,491\n49462,1707\n49463,195\n49464,1381\n49465,1556\n49466,163\n49467,3507\n49468,1454\n49469,46\n49469,163\n49469,1580\n49470,1033\n49470,1590\n49470,1644\n49470,6661\n49471,1177\n49473,209\n49474,7652\n49475,211\n49476,861\n49477,163\n49479,346\n49480,17346\n49481,4823\n49482,1381\n49483,431\n49484,422\n49485,56\n49486,58\n49487,46\n49488,852\n49489,861\n49490,32673\n49491,2045\n49492,7652\n49493,143\n49494,346\n49495,3467\n49496,3328\n49497,163\n49497,579\n49498,1235\n49498,1335\n49498,3507\n49500,217\n49501,649\n49502,49503\n49504,1789\n49505,58\n49506,46\n49507,211\n49508,163\n49509,72\n49510,749\n49511,1509\n49512,1284\n49513,1509\n49514,5662\n49515,58\n49516,46\n49517,3507\n49518,1033\n49519,516\n49520,893\n49520,1149\n49521,779\n49522,3331\n49523,1509\n49524,195\n49525,920\n49526,557\n49527,1102\n49528,1515\n49529,158\n49530,459\n49532,3872\n49533,483\n49534,579\n49535,1085\n49535,2572\n49535,3623\n49536,779\n49536,30428\n49537,8270\n49538,1381\n49539,1203\n49539,3135\n49540,736\n49541,760\n49542,49543\n49542,60319\n49542,61278\n49542,64450\n49544,49545\n49546,192\n49547,779\n49547,68069\n49547,141912\n49548,1033\n49549,1849\n49550,32\n49550,330\n49550,408\n49550,843\n49550,1113\n49550,1571\n49550,3769\n49551,34\n49551,35\n49551,536\n49551,2646\n49551,4672\n49551,18831\n49552,211\n49553,99\n49553,206\n49553,994\n49553,30331\n49553,60576\n49554,314\n49554,1085\n49555,49556\n49557,1167\n49558,309\n49558,310\n49559,79\n49560,779\n49562,151\n49563,406\n49563,779\n49563,1181\n49563,124889\n49564,779\n49565,118\n49565,4597\n49566,779\n49567,406\n49567,779\n49568,1608\n49569,392\n49569,1151\n49570,120\n49570,240\n49570,2812\n49571,34\n49571,35\n49572,779\n49573,779\n49574,779\n49576,1326\n49577,859\n49578,4771\n49579,158\n49579,779\n49580,779\n49581,195\n49581,30418\n49583,1381\n49584,1381\n49585,779\n49585,68069\n49586,779\n49586,68069\n49586,118336\n49586,141912\n49588,72\n49589,141912\n49590,26\n49590,59\n49591,22\n49591,358\n49592,1877\n49593,1509\n49594,211\n49595,1326\n49596,10\n49597,592\n49598,10\n49599,7416\n49600,1858\n49601,1860\n49602,163\n49603,215\n49604,4611\n49605,1590\n49605,1644\n49607,4611\n49608,931\n49609,861\n49610,211\n49611,86\n49612,1052\n49613,861\n49614,22\n49615,2296\n49616,158\n49617,104\n49618,34\n49618,1718\n49619,1556\n49620,422\n49621,56\n49622,563\n49623,3960\n49624,1282\n49625,19227\n49628,49629\n49630,247\n49632,34\n49632,35\n49632,2224\n49632,2646\n49633,1453\n49635,3474\n49636,435\n49637,1454\n49638,422\n49639,56\n49640,217\n49640,455\n49640,1417\n49641,640\n49642,536\n49642,1019\n49643,87\n49643,312\n49644,861\n49645,22\n49646,390\n49647,120\n49647,694\n49647,877\n49647,1284\n49647,1353\n49647,1419\n49647,148742\n49648,338\n49649,163\n49650,211\n49651,467\n49652,22\n49654,2105\n49655,120\n49656,1085\n49657,760\n49657,1631\n49658,163\n49659,49660\n49661,516\n49662,19010\n49663,557\n49664,422\n49665,56\n49666,1531\n49667,392\n49668,859\n49669,72\n49670,272\n49671,1285\n49672,743\n49673,5212\n49674,1058\n49675,1381\n49675,1551\n49676,376\n49677,1639\n49678,1579\n49679,151\n49680,1235\n49680,1335\n49681,49682\n49683,302\n49684,509\n49684,510\n49685,120\n49685,1353\n49686,626\n49687,861\n49688,22\n49689,32\n49690,868\n49691,120\n49691,2812\n49692,292\n49692,338\n49692,467\n49692,745\n49693,422\n49694,56\n49696,2979\n49697,48\n49697,1659\n49698,2424\n49700,37\n49700,717\n49700,1782\n49701,49702\n49703,302\n49704,292\n49705,83\n49706,1509\n49707,1509\n49708,509\n49709,9026\n49710,509\n49710,510\n49710,1151\n49711,158\n49711,406\n49711,779\n49712,1085\n49713,2073\n49714,1509\n49715,1639\n49715,2646\n49716,13745\n49717,49718\n49719,968\n49720,2205\n49720,2206\n49721,68\n49722,861\n49723,22\n49724,515\n49724,1454\n49725,211\n49726,450\n49728,49729\n49730,163\n49731,87\n49731,1151\n49732,163\n49733,589\n49733,1509\n49734,1773\n49735,2944\n49736,17263\n49737,2931\n49739,392\n49740,1179\n49741,240\n49741,818\n49742,49743\n49744,1227\n49744,1229\n49745,200\n49747,312\n49748,58\n49749,46\n49750,1858\n49751,1860\n49752,68\n49753,217\n49753,222\n49753,1417\n49754,49755\n49756,49757\n49756,53688\n49756,56854\n49756,57126\n49756,61891\n49756,80301\n49756,87523\n49756,87853\n49758,49759\n49760,136\n49760,137\n49760,312\n49760,406\n49760,1749\n49762,1163\n49763,292\n49764,49765\n49766,557\n49767,269\n49768,557\n49769,302\n49770,31934\n49771,20004\n49772,13\n49773,3538\n49774,313\n49775,264\n49776,83\n49777,3724\n49778,102\n49778,693\n49778,841\n49778,1363\n49778,14231\n49779,49780\n49781,1132\n49782,781\n49783,1149\n49784,261\n49784,2989\n49784,2991\n49784,27041\n49784,32751\n49785,44\n49786,1844\n49787,1265\n49787,1266\n49788,261\n49789,663\n49789,664\n49790,94\n49790,206\n49790,571\n49790,868\n49790,2787\n49790,3345\n49791,147\n49791,192\n49791,336\n49791,406\n49791,779\n49791,1458\n49791,55849\n49792,1417\n49793,2315\n49794,4594\n49795,1807\n49796,49797\n49798,1805\n49799,49800\n49801,779\n49802,596\n49802,1368\n49803,8820\n49804,1132\n49805,781\n49806,3447\n49807,2506\n49808,1509\n49809,1509\n49809,109503\n49810,1149\n49811,147\n49811,622\n49813,931\n49814,219\n49815,850\n49816,14819\n49817,907\n49818,818\n49819,49820\n49821,1509\n49822,8992\n49823,1058\n49823,17309\n49823,21442\n49824,585\n49825,599\n49825,1639\n49825,1796\n49826,1363\n49827,893\n49829,2775\n49830,447\n49831,743\n49832,779\n49833,272\n49834,23049\n49835,147\n49835,1181\n49836,83\n49836,261\n49836,718\n49837,1776\n49838,779\n49838,68069\n49838,141912\n49839,3804\n49840,1149\n49841,298\n49842,485\n49843,3069\n49844,1858\n49845,1860\n49847,483\n49848,5366\n49849,275\n49850,1381\n49851,1070\n49851,1619\n49852,163\n49853,973\n49854,1983\n49855,49856\n49855,56106\n49855,68641\n49855,100669\n49855,101156\n49855,261422\n49857,10\n49857,126161\n49858,1805\n49859,779\n49860,2443\n49861,49862\n49863,2944\n49864,107\n49865,258\n49866,301\n49867,704\n49869,3\n49870,1\n49871,289\n49871,290\n49872,72\n49873,344\n49874,285\n49875,1370\n49876,1821\n49877,323\n49878,996\n49879,22\n49879,233\n49879,596\n49881,49882\n49883,72\n49884,49885\n49886,49887\n49888,83\n49889,312\n49890,493\n49890,1927\n49891,1531\n49892,1181\n49893,1715\n49894,349\n49895,323\n49896,178\n49897,107\n49898,392\n49899,143\n49900,609\n49901,49902\n49903,9121\n49904,500\n49905,1116\n49906,192\n49907,8270\n49908,50\n49909,273\n49909,274\n49910,163\n49911,647\n49912,49913\n49914,15748\n49915,49916\n49915,98297\n49917,1715\n49918,49919\n49920,233\n49921,163\n49921,310\n49921,503\n49922,163\n49923,577\n49924,301\n49925,49926\n49927,697\n49928,163\n49929,163\n49930,163\n49930,827\n49931,6661\n49932,72\n49933,795\n49934,7360\n49935,893\n49936,163\n49937,515\n49938,163\n49939,1411\n49939,3804\n49940,2605\n49941,9029\n49942,163\n49943,163\n49943,579\n49944,163\n49945,163\n49946,1149\n49947,1149\n49948,660\n49949,58\n49950,46\n49951,762\n49952,77\n49952,717\n49952,784\n49953,344\n49954,2931\n49955,72\n49956,58\n49957,46\n49958,808\n49959,87\n49959,111\n49959,326\n49959,347\n49959,372\n49959,388\n49959,392\n49959,752\n49959,968\n49959,1085\n49959,1133\n49959,1210\n49959,1231\n49959,1240\n49959,1241\n49959,1359\n49959,1465\n49959,1479\n49959,1522\n49959,1544\n49959,2045\n49959,2083\n49959,3218\n49959,3260\n49959,5718\n49959,31976\n49960,493\n49960,1127\n49962,2296\n49963,589\n49963,850\n49964,49965\n49966,49967\n49968,861\n49969,22\n49970,163\n49971,1149\n49972,485\n49973,163\n49974,5662\n49975,151\n49976,1381\n49978,32\n49978,349\n49978,388\n49978,392\n49978,575\n49978,697\n49978,1210\n49978,2045\n49979,861\n49980,22\n49981,980\n49982,366\n49983,366\n49984,366\n49986,1132\n49986,1639\n49987,163\n49988,366\n49989,366\n49990,431\n49991,302\n49991,467\n49991,1122\n49992,366\n49993,397\n49994,366\n49995,163\n49996,2775\n49997,447\n49999,163\n50001,160\n50001,163\n50002,42232\n50003,264\n50003,14945\n50004,202\n50004,203\n50006,1556\n50007,1381\n50008,3218\n50009,306\n50009,307\n50010,217\n50010,264\n50011,7\n50011,14989\n50012,134\n50012,138\n50013,1590\n50013,68069\n50014,868\n50015,481\n50017,13\n50018,657\n50019,1132\n50020,1449\n50020,1688\n50021,1882\n50022,579\n50022,4823\n50024,50025\n50026,2995\n50027,589\n50028,79\n50029,1313\n50030,163\n50030,302\n50030,344\n50030,1087\n50031,15573\n50032,163\n50033,1381\n50034,346\n50034,1068\n50034,2353\n50035,25873\n50036,192\n50038,1149\n50039,4411\n50040,647\n50042,50043\n50044,344\n50045,72\n50047,1019\n50048,1019\n50049,50043\n50050,298\n50051,485\n50052,140\n50053,609\n50054,77\n50055,640\n50056,996\n50057,640\n50058,163\n50059,2646\n50059,3209\n50060,640\n50061,158\n50063,497\n50064,996\n50065,58\n50066,46\n50067,640\n50068,2620\n50070,296\n50070,1893\n50070,3507\n50070,7155\n50071,1858\n50072,1860\n50073,996\n50074,640\n50075,83\n50076,509\n50078,996\n50079,392\n50079,1860\n50080,640\n50082,1509\n50083,457\n50083,4190\n50084,151\n50085,1323\n50086,102\n50087,1326\n50088,408\n50089,996\n50090,337\n50090,8332\n50091,115\n50091,118\n50092,6298\n50093,996\n50094,794\n50094,1559\n50095,602\n50096,911\n50096,1559\n50097,72\n50099,83\n50100,1058\n50101,301\n50102,1858\n50103,1860\n50104,1635\n50104,1955\n50105,2045\n50106,579\n50107,192\n50108,422\n50109,422\n50110,422\n50111,422\n50112,422\n50114,422\n50115,1531\n50116,251\n50117,473\n50117,8149\n50118,422\n50119,422\n50120,1556\n50121,861\n50122,22\n50123,493\n50123,586\n50123,682\n50123,72439\n50123,189839\n50125,422\n50126,163\n50128,626\n50129,1531\n50130,251\n50132,1782\n50133,346\n50133,435\n50133,447\n50133,586\n50133,1294\n50134,160\n50135,1140\n50136,3830\n50137,827\n50138,2668\n50139,1659\n50140,1572\n50141,6661\n50141,191355\n50142,392\n50143,1801\n50144,1531\n50146,1891\n50147,2266\n50148,119\n50148,1252\n50148,1253\n50148,1844\n50148,3804\n50148,6249\n50148,21944\n50149,388\n50150,2923\n50150,4190\n50151,1556\n50152,2979\n50154,393\n50154,859\n50154,980\n50154,1531\n50155,1531\n50156,215\n50157,202\n50157,203\n50157,497\n50157,626\n50158,26\n50158,59\n50158,861\n50161,158\n50161,1001\n50161,2646\n50162,50163\n50164,3804\n50165,285\n50166,22\n50166,992\n50167,285\n50168,1068\n50169,1210\n50170,992\n50172,505\n50172,1096\n50173,3367\n50174,838\n50175,1149\n50178,1881\n50179,1983\n50180,497\n50181,497\n50182,1572\n50182,1722\n50183,1556\n50184,861\n50185,22\n50186,392\n50186,1151\n50186,1572\n50186,1722\n50187,649\n50191,195\n50191,1181\n50192,1149\n50193,2292\n50194,192\n50194,3507\n50195,1590\n50196,26\n50196,59\n50197,843\n50198,1509\n50199,1149\n50200,251\n50201,602\n50202,1181\n50203,240\n50203,1285\n50205,510\n50206,1149\n50208,72\n50209,2646\n50210,644\n50210,1836\n50212,447\n50214,1556\n50215,861\n50216,22\n50217,1149\n50221,640\n50222,1188\n50223,163\n50223,302\n50223,579\n50224,2310\n50226,592\n50229,65\n50230,1313\n50232,251\n50233,1531\n50234,388\n50234,2557\n50235,861\n50236,1556\n50237,861\n50238,22\n50239,481\n50240,72\n50241,217\n50241,310\n50241,500\n50241,1417\n50241,1796\n50241,3804\n50242,1556\n50243,861\n50244,22\n50245,1096\n50246,178\n50246,1612\n50247,1559\n50251,79\n50252,3846\n50253,1749\n50254,3538\n50255,338\n50256,718\n50256,749\n50257,251\n50258,309\n50258,310\n50259,68\n50259,1782\n50260,1556\n50261,861\n50262,22\n50263,1127\n50264,360\n50265,1149\n50266,1010\n50266,1479\n50267,2048\n50268,676\n50269,254\n50270,192\n50272,980\n50273,1968\n50274,1381\n50275,795\n50276,393\n50276,980\n50276,1096\n50277,338\n50278,333\n50279,192\n50281,106\n50282,957\n50284,758\n50285,217\n50285,455\n50285,631\n50285,1612\n50285,2775\n50286,66\n50289,4771\n50290,415\n50291,48\n50292,1509\n50293,934\n50294,2668\n50295,749\n50296,1556\n50297,861\n50298,22\n50299,58\n50300,46\n50301,557\n50302,602\n50303,50304\n50305,1210\n50306,1821\n50307,2995\n50308,852\n50309,611\n50310,273\n50310,274\n50311,217\n50311,1796\n50311,3804\n50312,364\n50314,302\n50315,435\n50317,500\n50319,644\n50320,206\n50320,1572\n50320,50321\n50322,264\n50324,175\n50324,21944\n50324,31977\n50325,660\n50325,1860\n50326,20004\n50327,726\n50328,2353\n50328,7143\n50329,682\n50329,72439\n50330,298\n50331,1089\n50332,690\n50333,920\n50334,1479\n50335,859\n50335,1531\n50336,623\n50337,1140\n50337,31896\n50339,2784\n50340,481\n50341,77\n50342,609\n50343,579\n50344,1821\n50345,106\n50346,333\n50348,81\n50349,1572\n50350,2574\n50351,251\n50352,2073\n50352,2668\n50353,104\n50354,1590\n50355,447\n50355,788\n50357,1871\n50358,397\n50359,1210\n50359,1639\n50360,264\n50361,83\n50362,1634\n50363,273\n50363,274\n50364,135\n50365,718\n50366,163\n50367,392\n50367,809\n50368,783\n50369,744\n50370,3218\n50371,1479\n50372,211\n50374,267\n50375,579\n50375,1172\n50376,333\n50377,1001\n50378,438\n50378,736\n50379,1977\n50379,1978\n50380,302\n50381,652\n50382,875\n50383,79\n50384,2421\n50385,87\n50385,991\n50386,818\n50387,163\n50389,3297\n50390,2286\n50390,142430\n50390,142879\n50391,26\n50391,59\n50392,1181\n50393,509\n50393,1238\n50395,1293\n50395,1782\n50398,106\n50399,954\n50399,1939\n50399,10318\n50400,509\n50401,2319\n50402,973\n50403,934\n50405,45437\n50407,3069\n50408,581\n50409,652\n50409,1860\n50410,2590\n50411,1313\n50412,178\n50413,1007\n50414,534\n50415,1556\n50416,861\n50417,22\n50418,431\n50419,900\n50420,275\n50420,309\n50420,310\n50420,809\n50420,1266\n50420,162599\n50421,1\n50422,146\n50422,336\n50423,301\n50423,1837\n50424,298\n50425,485\n50426,20\n50427,50428\n50431,1871\n50432,493\n50433,32\n50434,252\n50435,1556\n50436,861\n50437,22\n50438,195\n50439,151\n50439,1247\n50441,337\n50443,843\n50444,333\n50445,86\n50445,795\n50445,920\n50445,934\n50445,2367\n50446,143\n50448,1392\n50449,19010\n50450,676\n50450,745\n50451,151\n50451,192\n50451,309\n50451,310\n50451,577\n50451,1400\n50452,147\n50452,2244\n50452,21826\n50453,647\n50456,515\n50457,50\n50458,1858\n50459,1860\n50461,1590\n50462,2244\n50463,1068\n50464,644\n50464,1012\n50464,2699\n50464,5469\n50465,298\n50466,485\n50467,2373\n50468,1474\n50469,140\n50469,272\n50470,996\n50471,1556\n50472,861\n50473,22\n50474,1572\n50474,1722\n50475,996\n50476,252\n50477,1849\n50478,996\n50479,996\n50480,996\n50481,1509\n50483,1474\n50484,252\n50485,996\n50486,996\n50487,996\n50490,1782\n50491,2506\n50492,2051\n50493,459\n50493,832\n50494,1119\n50495,187\n50496,4475\n50497,50498\n50497,160575\n50497,259505\n50499,309\n50499,310\n50500,178\n50500,447\n50500,538\n50500,934\n50501,1724\n50502,1300\n50503,301\n50503,1300\n50504,1893\n50505,1474\n50506,1381\n50507,337\n50507,344\n50508,1370\n50509,1285\n50510,250\n50510,310\n50510,346\n50510,1058\n50510,1381\n50510,1684\n50510,3039\n50510,29380\n50511,1147\n50512,106\n50513,163\n50513,302\n50513,579\n50515,1474\n50516,302\n50516,579\n50516,861\n50517,283\n50518,503\n50519,1203\n50520,58\n50521,46\n50522,1160\n50522,1732\n50522,1837\n50523,1858\n50524,1860\n50525,2083\n50526,5212\n50527,657\n50528,1531\n50529,805\n50530,1474\n50531,298\n50532,485\n50535,818\n50536,1608\n50537,485\n50538,63\n50539,500\n50540,68\n50540,233\n50540,420\n50540,1818\n50542,1010\n50542,1849\n50542,32784\n50543,32\n50543,422\n50543,1070\n50543,118336\n50544,1143\n50544,1363\n50544,14556\n50545,14989\n50547,160\n50548,10\n50548,1849\n50549,17309\n50550,731\n50551,68\n50553,107\n50553,749\n50553,893\n50553,1146\n50554,422\n50555,56\n50556,1370\n50556,2782\n50557,811\n50558,3409\n50560,1531\n50561,1001\n50562,2083\n50563,366\n50564,1608\n50565,167\n50565,818\n50566,5987\n50567,2083\n50568,509\n50569,509\n50571,97\n50572,1983\n50574,483\n50575,440\n50576,41\n50576,1608\n50577,264\n50578,875\n50579,99\n50580,516\n50581,302\n50581,579\n50582,72\n50583,77\n50583,1962\n50584,211\n50585,1284\n50586,1803\n50587,151\n50588,818\n50589,1608\n50590,83\n50590,455\n50591,264\n50592,171\n50593,536\n50593,2784\n50594,202\n50594,203\n50595,973\n50596,536\n50597,86\n50598,991\n50599,30\n50599,1179\n50600,1424\n50601,149\n50604,2867\n50604,2868\n50604,22880\n50605,640\n50606,178\n50606,358\n50607,907\n50607,221280\n50608,252\n50609,516\n50609,1454\n50610,50611\n50612,1284\n50613,1634\n50614,743\n50615,1240\n50616,160\n50616,337\n50616,452\n50616,457\n50616,586\n50616,668\n50616,713\n50616,784\n50616,1262\n50616,1332\n50616,1368\n50616,1572\n50616,1796\n50616,2701\n50616,2915\n50617,1634\n50618,138\n50619,206\n50620,1414\n50621,980\n50622,301\n50623,2779\n50624,818\n50625,949\n50626,252\n50627,1313\n50628,93\n50628,94\n50629,126\n50631,13546\n50632,83\n50633,1010\n50636,1192\n50637,4810\n50638,1058\n50639,48\n50640,99\n50642,106\n50642,497\n50642,874\n50643,264\n50644,1458\n50645,1181\n50646,626\n50647,8270\n50648,424\n50649,920\n50649,1893\n50650,215\n50651,136\n50651,225\n50651,248\n50651,1368\n50652,4078\n50653,640\n50654,50655\n50654,56681\n50656,640\n50657,6661\n50658,849\n50659,2083\n50660,772\n50661,640\n50663,640\n50664,48\n50665,3079\n50666,192\n50667,44\n50668,2674\n50669,1531\n50670,4060\n50671,640\n50672,818\n50673,2929\n50674,859\n50675,135\n50676,430\n50677,32\n50677,65\n50677,875\n50677,2191\n50677,5540\n50678,1572\n50678,1722\n50680,50681\n50682,1807\n50683,192\n50683,663\n50684,1858\n50685,1860\n50686,323\n50687,850\n50688,298\n50689,485\n50690,349\n50690,577\n50690,980\n50690,27041\n50691,1149\n50692,827\n50693,493\n50694,731\n50695,3538\n50696,3413\n50697,525\n50698,8270\n50699,50700\n50701,283\n50702,315\n50703,312\n50704,171\n50705,264\n50705,1007\n50705,3999\n50706,50707\n50708,996\n50709,500\n50710,1639\n50711,1572\n50712,333\n50712,500\n50712,718\n50713,21944\n50714,301\n50715,94\n50715,2787\n50716,1381\n50717,1265\n50717,1266\n50718,50719\n50720,953\n50721,779\n50722,1381\n50723,102\n50724,206\n50725,20790\n50726,298\n50727,485\n50728,50729\n50730,50731\n50730,60096\n50732,8788\n50733,50734\n50735,50736\n50735,80117\n50737,862\n50739,2572\n50740,50741\n50742,743\n50743,931\n50744,72\n50745,137\n50745,557\n50746,50747\n50748,289\n50748,290\n50749,206\n50750,2944\n50751,500\n50752,1962\n50753,1052\n50754,1882\n50755,2775\n50756,54\n50757,2210\n50757,4237\n50758,50759\n50761,1579\n50762,2697\n50763,50764\n50765,50764\n50766,5547\n50767,1634\n50768,72\n50769,344\n50770,285\n50771,50772\n50773,50774\n50773,75782\n50773,77277\n50773,78048\n50773,78267\n50773,81351\n50773,87528\n50773,114665\n50773,118910\n50773,123223\n50773,123695\n50773,123728\n50773,124692\n50773,125131\n50773,126439\n50773,128009\n50773,128444\n50773,128578\n50775,304\n50776,376\n50777,163\n50778,8270\n50779,2146\n50780,50781\n50782,652\n50783,24505\n50784,50785\n50784,106885\n50784,112766\n50784,112846\n50784,116297\n50784,125355\n50784,126578\n50784,177316\n50784,178926\n50786,233\n50787,50788\n50789,515\n50790,50791\n50792,366\n50793,366\n50794,366\n50795,366\n50796,50797\n50798,366\n50799,366\n50800,366\n50801,1639\n50802,366\n50803,366\n50804,366\n50805,50806\n50807,7652\n50808,50809\n50811,1608\n50812,50813\n50812,89408\n50814,809\n50815,312\n50815,510\n50816,1019\n50816,1467\n50817,779\n50818,50819\n50820,306\n50820,307\n50821,50822\n50821,161511\n50823,1531\n50824,147\n50824,158\n50824,73906\n50825,83\n50826,2506\n50827,358\n50827,1659\n50828,818\n50829,83\n50830,79\n50831,72\n50832,344\n50833,285\n50834,298\n50835,485\n50836,1983\n50837,137\n50838,3003\n50839,1891\n50841,6750\n50843,50844\n50845,206\n50846,107\n50847,1452\n50849,1452\n50850,273\n50850,1116\n50851,222\n50852,34395\n50853,50854\n50855,251\n50856,760\n50857,1119\n50858,273\n50858,274\n50859,644\n50860,422\n50861,1844\n50861,2782\n50862,298\n50863,485\n50864,171\n50866,50867\n50868,1204\n50869,595\n50869,1453\n50870,364\n50871,649\n50872,50873\n50874,5662\n50875,1240\n50876,79\n50876,1052\n50877,850\n50878,1007\n50879,818\n50879,1151\n50879,60445\n50879,60446\n50879,60449\n50879,60450\n50879,60451\n50879,60452\n50879,60453\n50879,60454\n50879,60455\n50879,60456\n50879,60462\n50879,60474\n50879,60479\n50879,60480\n50879,60491\n50879,60646\n50879,60647\n50879,60648\n50879,60659\n50879,60662\n50879,61229\n50879,61367\n50879,61371\n50879,61384\n50879,61392\n50879,61395\n50879,61404\n50879,61414\n50880,3079\n50881,649\n50882,2367\n50883,50884\n50885,393\n50885,1531\n50885,4545\n50885,139010\n50886,2646\n50888,256\n50889,21944\n50890,596\n50891,1893\n50892,50893\n50894,1210\n50895,1082\n50896,3\n50896,609\n50897,3447\n50898,17228\n50899,292\n50901,50902\n50903,1210\n50904,2244\n50905,50906\n50907,50908\n50909,3846\n50910,312\n50910,592\n50911,483\n50912,3161\n50913,805\n50914,349\n50915,50916\n50917,50918\n50919,72\n50920,338\n50920,462\n50920,710\n50920,1893\n50921,954\n50921,10318\n50922,30\n50922,772\n50922,954\n50922,10318\n50922,198024\n50923,585\n50924,151\n50925,50926\n50925,102013\n50925,259172\n50927,358\n50928,1149\n50930,481\n50931,1359\n50932,275\n50933,907\n50934,602\n50934,3218\n50934,4866\n50935,143\n50936,3413\n50937,1707\n50938,309\n50938,310\n50939,1882\n50939,2210\n50940,50941\n50942,718\n50942,893\n50942,1359\n50944,874\n50945,4066\n50946,3069\n50947,160\n50948,3370\n50948,14453\n50949,1313\n50951,874\n50952,50953\n50954,1179\n50955,302\n50955,310\n50956,10\n50957,376\n50958,21487\n50959,50960\n50961,1639\n50962,406\n50963,50964\n50963,52374\n50963,53354\n50963,53440\n50963,55511\n50963,70453\n50963,77295\n50963,77526\n50963,82533\n50963,82550\n50963,83324\n50963,90052\n50963,93419\n50963,96379\n50963,103928\n50963,104130\n50963,107068\n50963,107359\n50963,108831\n50963,109731\n50963,195184\n50965,14483\n50966,8180\n50967,447\n50968,2146\n50969,2775\n50970,447\n50971,5405\n50972,439\n50973,1402\n50974,1509\n50975,8270\n50976,50977\n50978,6068\n50979,1805\n50981,58\n50982,46\n50983,1767\n50984,652\n50985,272\n50986,1102\n50987,167\n50987,392\n50987,433\n50987,595\n50987,809\n50987,818\n50987,872\n50987,1151\n50987,1210\n50987,1238\n50987,1453\n50987,3258\n50987,127158\n50988,158\n50989,50990\n50991,158\n50992,7358\n50992,7363\n50993,1452\n50994,6682\n50995,589\n50996,589\n50997,50998\n50999,254\n51000,592\n51001,1368\n51003,23701\n51004,2929\n51005,51006\n51007,9121\n51008,953\n51009,51010\n51011,1188\n51012,615\n51013,289\n51013,290\n51014,261\n51015,9025\n51016,68\n51017,2697\n51018,1955\n51019,195\n51020,51021\n51022,51023\n51024,178\n51025,51026\n51025,52748\n51025,103648\n51027,2995\n51028,51029\n51030,6068\n51031,1102\n51032,51033\n51034,6027\n51035,447\n51036,302\n51037,51038\n51039,51040\n51041,51040\n51042,51043\n51044,932\n51045,1983\n51046,462\n51047,31977\n51047,54494\n51047,58769\n51047,61536\n51047,69295\n51047,94609\n51047,101641\n51047,111283\n51047,114258\n51047,119756\n51049,1509\n51050,51051\n51052,51053\n51054,525\n51055,7360\n51056,801\n51057,1146\n51059,51060\n51061,1353\n51062,2944\n51063,51064\n51065,500\n51066,366\n51067,25873\n51068,72\n51070,3209\n51071,489\n51072,51073\n51074,383\n51075,2995\n51076,15573\n51077,2178\n51077,4545\n51078,51079\n51081,3413\n51083,72\n51084,344\n51085,285\n51086,2436\n51087,1531\n51088,1767\n51089,953\n51090,51091\n51090,68069\n51090,82878\n51090,86832\n51090,95251\n51090,100380\n51090,198574\n51090,219231\n51092,158\n51093,652\n51094,3069\n51095,3872\n51096,7358\n51096,7363\n51097,51098\n51097,53415\n51097,53547\n51097,53972\n51097,82479\n51097,83318\n51099,2697\n51100,51101\n51102,51103\n51104,406\n51104,435\n51105,81\n51106,51107\n51108,72\n51109,1210\n51110,7124\n51111,1858\n51112,1414\n51113,953\n51114,2995\n51115,51116\n51118,366\n51119,366\n51120,366\n51121,366\n51123,2048\n51124,151\n51125,272\n51126,79\n51126,192\n51126,217\n51126,222\n51126,973\n51126,1118\n51126,1417\n51127,1133\n51128,51129\n51131,184\n51132,392\n51133,340\n51135,306\n51135,307\n51136,51137\n51138,26\n51138,59\n51139,1033\n51140,859\n51141,859\n51142,99\n51143,167\n51143,299\n51144,760\n51145,83\n51146,1238\n51146,9542\n51146,21944\n51147,422\n51148,56\n51149,422\n51150,422\n51151,422\n51152,422\n51153,422\n51154,422\n51155,422\n51156,652\n51157,611\n51158,273\n51158,274\n51159,1556\n51160,2506\n51161,2506\n51162,1\n51162,94\n51162,206\n51162,2787\n51163,87\n51164,1767\n51165,1844\n51165,51166\n51165,85471\n51165,86563\n51165,90623\n51165,96352\n51167,1201\n51168,1893\n51169,79\n51170,175\n51170,206\n51171,392\n51171,623\n51172,1858\n51173,1860\n51174,932\n51175,818\n51176,160\n51176,736\n51176,1127\n51176,1893\n51176,49057\n51177,312\n51178,1381\n51179,1722\n51180,644\n51181,1893\n51182,4\n51182,5\n51183,527\n51184,447\n51185,1116\n51186,664\n51186,20359\n51187,63\n51187,217\n51187,588\n51187,590\n51187,1143\n51187,3260\n51187,51188\n51187,52252\n51187,60749\n51187,69411\n51187,78317\n51187,80315\n51187,82800\n51187,84675\n51187,87700\n51187,88046\n51187,89365\n51187,89777\n51187,108952\n51187,156993\n51187,157245\n51187,159893\n51187,160234\n51187,171235\n51187,213151\n51187,213597\n51187,219440\n51187,221715\n51187,222046\n51187,231440\n51187,235585\n51189,51190\n51191,393\n51192,72\n51193,344\n51194,285\n51195,3538\n51196,72\n51197,344\n51198,285\n51199,1381\n51199,1452\n51200,217\n51200,51201\n51200,57077\n51200,57485\n51200,68507\n51200,70655\n51200,83779\n51200,91154\n51200,94554\n51200,95949\n51200,96121\n51200,96386\n51200,96925\n51200,100000\n51200,100840\n51200,112198\n51200,112224\n51200,115922\n51200,120317\n51200,122352\n51200,134522\n51200,147319\n51200,153735\n51200,170303\n51200,171964\n51200,172271\n51200,174445\n51200,181295\n51200,182716\n51200,218885\n51200,219082\n51200,220616\n51200,229367\n51200,235411\n51200,235781\n51200,240057\n51200,249661\n51200,249800\n51200,263537\n51202,72\n51203,2828\n51204,51205\n51206,120\n51207,72\n51208,344\n51209,285\n51210,87\n51210,312\n51211,120\n51212,171\n51213,51214\n51215,1782\n51216,51216\n51217,872\n51218,1014\n51219,51220\n51221,51220\n51222,1\n51223,1241\n51224,7117\n51225,51226\n51227,586\n51228,51229\n51228,64456\n51228,67599\n51228,77324\n51228,86832\n51228,103233\n51228,112131\n51230,51231\n51230,129424\n51232,1414\n51233,1572\n51234,907\n51235,1556\n51236,663\n51236,664\n51237,136\n51238,20359\n51239,872\n51240,2411\n51241,1858\n51242,1860\n51243,51244\n51245,26\n51245,59\n51245,3794\n51246,151\n51247,640\n51248,51249\n51250,51251\n51252,240\n51252,2372\n51253,269\n51253,30331\n51254,51255\n51256,72\n51257,652\n51257,1968\n51258,26\n51258,59\n51258,21944\n51259,557\n51260,79\n51260,147\n51260,192\n51260,195\n51260,206\n51260,503\n51260,1181\n51261,697\n51262,72\n51263,20813\n51264,211\n51264,664\n51265,240\n51265,264\n51265,818\n51266,151\n51267,1043\n51268,51269\n51270,809\n51271,6068\n51272,278\n51273,1531\n51274,206\n51274,788\n51274,4611\n51275,86\n51276,51277\n51278,44\n51280,51281\n51282,51283\n51282,53907\n51284,872\n51285,344\n51286,195\n51287,417\n51289,868\n51290,850\n51291,72\n51292,376\n51293,743\n51294,557\n51295,557\n51296,557\n51297,8719\n51298,138\n51299,865\n51300,557\n51301,137\n51302,21944\n51303,118\n51303,4597\n51304,8719\n51305,138\n51306,865\n51307,557\n51308,137\n51309,21944\n51310,118\n51310,4597\n51311,8719\n51312,138\n51313,865\n51314,557\n51315,137\n51316,21944\n51317,118\n51317,4597\n51318,8719\n51319,138\n51320,865\n51321,557\n51322,137\n51323,21944\n51324,118\n51324,4597\n51325,6051\n51326,358\n51327,1119\n51328,298\n51329,485\n51330,1285\n51331,51332\n51333,2367\n51334,2590\n51335,1531\n51336,8788\n51337,2351\n51338,68\n51339,7\n51340,51341\n51340,54526\n51340,71118\n51340,77325\n51342,187\n51343,1072\n51344,51345\n51346,51345\n51347,516\n51348,1801\n51349,9560\n51350,51351\n51352,50960\n51353,298\n51354,485\n51355,818\n51356,81\n51357,919\n51358,4823\n51359,240\n51359,269\n51359,818\n51359,1210\n51359,17309\n51359,127158\n51360,261\n51361,97\n51362,5440\n51363,202\n51363,203\n51364,718\n51365,192\n51366,17334\n51367,932\n51368,7652\n51369,6068\n51370,483\n51371,240\n51372,626\n51372,652\n51372,931\n51372,4355\n51373,652\n51374,929\n51375,1102\n51377,51376\n51378,51379\n51378,87552\n51380,51381\n51382,7652\n51383,953\n51384,652\n51385,31977\n51386,589\n51387,3872\n51388,7358\n51388,7363\n51389,2797\n51390,447\n51391,1019\n51392,1767\n51393,1767\n51394,8270\n51395,1102\n51396,1414\n51397,657\n51398,1515\n51399,31934\n51400,500\n51401,366\n51402,14989\n51403,171\n51404,628\n51405,22\n51406,51407\n51408,850\n51409,167\n51410,158\n51410,779\n51412,233\n51413,336\n51413,626\n51413,1082\n51413,1732\n51413,2868\n51413,3999\n51414,366\n51416,8270\n51417,1531\n51418,51419\n51418,126628\n51420,63\n51422,306\n51422,307\n51423,87\n51423,372\n51424,50\n51425,158\n51426,298\n51427,137\n51428,1058\n51429,83\n51430,1247\n51432,51432\n51433,143\n51434,240\n51435,50960\n51436,51437\n51438,94\n51438,184\n51438,2787\n51439,422\n51440,422\n51441,422\n51442,422\n51443,422\n51444,422\n51445,422\n51446,422\n51447,4611\n51448,1181\n51449,4611\n51450,2995\n51451,626\n51452,48\n51453,51454\n51453,68069\n51453,78313\n51453,82200\n51453,83797\n51453,90534\n51453,111680\n51455,51456\n51455,155619\n51457,51458\n51459,51460\n51461,389\n51462,261\n51464,932\n51465,120\n51465,261\n51466,195\n51467,2334\n51468,298\n51469,485\n51470,344\n51472,51473\n51474,261\n51475,328\n51476,1001\n51477,1001\n51478,953\n51479,136\n51480,83\n51481,779\n51482,1556\n51483,920\n51484,7\n51485,509\n51486,51487\n51488,51489\n51488,78290\n51488,83942\n51488,84336\n51488,89009\n51488,89379\n51488,93855\n51488,104834\n51488,105990\n51488,106829\n51488,108867\n51488,116650\n51488,118807\n51488,121094\n51488,121819\n51488,194006\n51490,872\n51491,392\n51492,312\n51492,652\n51493,51494\n51495,51496\n51497,615\n51498,240\n51499,1462\n51499,8537\n51500,51501\n51503,120\n51503,503\n51503,4066\n51504,973\n51505,120\n51505,261\n51505,694\n51505,32751\n51506,206\n51507,872\n51508,195\n51509,843\n51509,3089\n51510,473\n51510,8149\n51511,2351\n51512,3876\n51513,4611\n51514,483\n51515,941\n51516,872\n51517,299\n51518,3413\n51519,622\n51520,779\n51521,779\n51522,875\n51524,51525\n51524,76400\n51524,83854\n51526,9560\n51527,1776\n51528,298\n51529,450\n51530,8270\n51531,44\n51532,1381\n51532,1551\n51532,51533\n51534,1556\n51535,861\n51536,22\n51537,1298\n51538,1046\n51538,2334\n51540,972\n51541,7360\n51542,1181\n51543,433\n51544,51545\n51544,56870\n51544,86290\n51546,51547\n51548,801\n51550,644\n51551,312\n51552,1782\n51555,4611\n51556,379\n51557,10\n51557,113156\n51560,592\n51561,72\n51562,4192\n51562,4193\n51563,1767\n51564,273\n51564,274\n51564,1070\n51565,4611\n51566,273\n51566,274\n51566,1070\n51567,30766\n51568,868\n51569,51570\n51571,1179\n51572,1968\n51573,366\n51574,366\n51575,366\n51576,2995\n51577,51578\n51579,51580\n51582,1860\n51583,51584\n51585,240\n51587,7194\n51587,138686\n51588,175\n51588,7194\n51589,7194\n51589,138686\n51590,1052\n51590,1515\n51590,5101\n51591,292\n51592,51593\n51594,15573\n51595,346\n51596,51597\n51598,51599\n51601,376\n51602,68\n51603,3069\n51604,51605\n51606,51607\n51606,56693\n51608,51609\n51610,51611\n51612,51613\n51615,72\n51617,233\n51618,10\n51619,310\n51620,805\n51621,1803\n51622,3246\n51622,3247\n51623,107\n51624,2416\n51624,2417\n51625,292\n51626,338\n51627,298\n51628,626\n51629,1133\n51630,3538\n51631,275\n51632,51633\n51634,51635\n51636,51635\n51637,515\n51637,1033\n51638,1659\n51639,27550\n51640,211\n51641,1515\n51642,298\n51643,485\n51644,875\n51646,51647\n51648,51647\n51649,577\n51651,171\n51652,222\n51652,1019\n51652,113481\n51653,298\n51654,485\n51655,687\n51656,26\n51656,59\n51656,21944\n51657,86\n51658,1556\n51659,211\n51660,932\n51661,3260\n51662,1454\n51663,104\n51665,278\n51666,390\n51666,1085\n51667,104\n51668,51669\n51670,104\n51671,104\n51672,240\n51672,2083\n51673,1381\n51674,8788\n51675,51676\n51677,2775\n51678,447\n51679,31977\n51681,130\n51682,358\n51683,1010\n51685,258\n51686,206\n51687,2506\n51688,2506\n51689,51690\n51691,302\n51691,538\n51692,195\n51693,51694\n51695,483\n51696,21487\n51697,299\n51698,1072\n51699,202\n51699,203\n51701,3999\n51702,312\n51703,647\n51704,1858\n51705,1860\n51706,51707\n51708,202\n51709,51710\n51711,51712\n51711,72719\n51711,83173\n51713,422\n51714,56\n51715,8868\n51716,422\n51717,56\n51718,392\n51718,809\n51719,186\n51719,3804\n51720,333\n51722,27215\n51723,51724\n51725,346\n51726,1882\n51727,312\n51727,392\n51727,127158\n51728,167\n51729,376\n51730,72\n51731,10\n51732,51733\n51735,21944\n51736,21944\n51736,87772\n51736,116235\n51737,21944\n51738,219\n51739,330\n51739,349\n51739,783\n51739,2572\n51739,3538\n51740,51741\n51742,22293\n51743,931\n51744,346\n51745,195\n51746,360\n51747,1353\n51748,557\n51749,557\n51750,862\n51751,5906\n51752,557\n51753,626\n51754,278\n51755,137\n51756,862\n51757,5906\n51758,557\n51759,626\n51760,278\n51761,137\n51762,862\n51763,557\n51764,557\n51765,1858\n51766,1860\n51767,1801\n51768,1623\n51769,1858\n51770,1860\n51771,51772\n51773,19227\n51774,217\n51775,3474\n51776,51777\n51778,51779\n51778,56825\n51778,68866\n51778,77276\n51778,82015\n51778,84122\n51778,101464\n51778,102950\n51778,104968\n51778,112184\n51778,120963\n51780,51781\n51782,422\n51783,56\n51784,21944\n51785,3413\n51786,72\n51787,344\n51788,285\n51789,28294\n51790,72\n51791,1149\n51792,51793\n51794,694\n51794,784\n51794,1353\n51794,162599\n51797,1305\n51798,1151\n51799,217\n51800,51801\n51802,206\n51803,1773\n51804,51805\n51806,323\n51807,51808\n51807,90781\n51807,97576\n51807,119582\n51807,120693\n51807,124646\n51807,126333\n51807,128302\n51807,128596\n51807,129126\n51807,130089\n51807,130956\n51807,141450\n51809,422\n51810,56\n51811,51812\n51813,422\n51814,422\n51815,422\n51816,422\n51817,422\n51818,422\n51819,422\n51820,422\n51821,422\n51822,51823\n51824,422\n51825,56\n51826,51827\n51828,581\n51829,5375\n51830,51831\n51832,422\n51833,56\n51834,51835\n51836,1381\n51838,126\n51839,292\n51840,294\n51841,296\n51842,298\n51843,3069\n51844,4597\n51846,323\n51847,2210\n51847,4237\n51848,640\n51849,51850\n51851,872\n51853,872\n51854,301\n51855,3148\n51856,87\n51858,51859\n51860,51861\n51862,51863\n51862,52531\n51862,53339\n51862,74605\n51862,86663\n51862,98847\n51862,98934\n51862,102162\n51862,105063\n51862,106029\n51862,199149\n51865,51866\n51867,491\n51868,579\n51869,51870\n51871,77\n51872,72\n51873,868\n51873,1556\n51874,634\n51875,207\n51876,1132\n51877,781\n51878,51879\n51880,332\n51880,657\n51880,873\n51880,1210\n51880,2266\n51880,5667\n51881,1381\n51882,163\n51883,760\n51884,252\n51884,337\n51884,457\n51885,2607\n51886,843\n51887,51888\n51889,167\n51889,2083\n51890,1151\n51891,51892\n51893,163\n51893,579\n51894,252\n51894,318\n51896,760\n51897,255\n51898,1556\n51899,647\n51900,51901\n51902,306\n51902,307\n51903,671\n51904,497\n51905,668\n51906,252\n51907,163\n51907,579\n51908,51909\n51910,1323\n51911,102\n51912,1326\n51913,408\n51914,934\n51915,51916\n51917,301\n51919,818\n51920,1509\n51921,818\n51924,392\n51925,34\n51925,35\n51925,818\n51925,1796\n51926,358\n51926,3409\n51927,344\n51928,875\n51929,818\n51930,1556\n51931,1556\n51932,717\n51934,83\n51935,4453\n51936,875\n51937,135\n51938,312\n51938,535\n51939,1149\n51940,1556\n51941,1968\n51943,1381\n51944,68\n51945,72\n51946,344\n51947,285\n51948,577\n51949,51950\n51951,298\n51952,485\n51953,406\n51954,309\n51954,310\n51954,929\n51954,1566\n51956,72\n51957,344\n51958,285\n51959,222\n51960,626\n51962,240\n51963,388\n51964,51965\n51966,485\n51967,58\n51967,1140\n51968,72\n51969,344\n51970,285\n51971,1531\n51972,417\n51972,852\n51972,1085\n51972,3623\n51972,75912\n51972,185874\n51975,497\n51976,515\n51977,186\n51977,264\n51977,3367\n51978,1639\n51980,3\n51981,808\n51981,2424\n51982,72\n51984,1556\n51985,861\n51986,22\n51987,51988\n51989,485\n51989,717\n51989,861\n51990,97\n51991,338\n51991,462\n51991,710\n51991,1893\n51992,2867\n51992,2868\n51992,22880\n51995,192\n51995,346\n51995,538\n51996,83\n51997,51998\n51999,171\n52000,83\n52001,644\n52002,44\n52003,192\n52004,1608\n52006,20\n52007,52008\n52009,298\n52010,485\n52011,422\n52012,56\n52013,192\n52014,579\n52015,809\n52017,119\n52018,3\n52019,2867\n52019,22880\n52020,875\n52021,1014\n52021,1623\n52022,1858\n52023,1860\n52024,1509\n52025,422\n52026,56\n52027,52028\n52029,52028\n52030,433\n52031,52032\n52033,417\n52033,805\n52033,1085\n52033,1749\n52033,1818\n52033,2286\n52033,2620\n52034,298\n52035,485\n52036,2443\n52037,1579\n52038,2274\n52039,736\n52040,298\n52041,485\n52042,72\n52043,58\n52044,46\n52045,52046\n52047,1368\n52048,433\n52048,687\n52048,1556\n52049,3209\n52050,703\n52051,736\n52052,592\n52053,217\n52054,261\n52055,775\n52055,1411\n52056,104\n52057,72\n52058,344\n52059,285\n52060,3297\n52062,525\n52063,392\n52063,1769\n52064,500\n52066,2867\n52066,2868\n52066,22880\n52067,299\n52067,1010\n52067,1122\n52067,1849\n52067,3207\n52068,743\n52069,160\n52070,1623\n52071,4\n52071,5\n52072,390\n52073,3451\n52073,3452\n52074,17593\n52075,3209\n52076,65\n52077,467\n52077,868\n52077,1556\n52078,309\n52078,310\n52079,72\n52080,344\n52081,285\n52082,805\n52084,440\n52085,192\n52086,406\n52087,72\n52088,344\n52089,285\n52090,1556\n52091,907\n52092,41\n52092,200\n52093,1858\n52094,1860\n52095,52096\n52097,309\n52097,310\n52098,346\n52099,417\n52100,34\n52100,35\n52101,366\n52102,366\n52102,15119\n52104,72\n52104,137\n52107,4101\n52109,366\n52111,240\n52112,37\n52113,2319\n52116,417\n52117,3260\n52118,217\n52118,536\n52119,3413\n52123,37\n52123,1782\n52124,1016\n52125,1052\n52125,2156\n52126,192\n52126,366\n52127,435\n52128,346\n52130,18726\n52133,163\n52134,626\n52134,852\n52135,346\n52136,346\n52137,1287\n52138,151\n52139,875\n52140,602\n52141,1210\n52142,1\n52142,1127\n52143,772\n52145,483\n52147,1556\n52148,861\n52149,22\n52150,134\n52151,247\n52152,818\n52153,10\n52153,818\n52153,31977\n52154,431\n52155,346\n52156,83\n52156,285\n52156,949\n52156,2779\n52156,2784\n52157,850\n52158,83\n52159,389\n52160,609\n52161,424\n52162,376\n52163,1326\n52165,52166\n52167,52168\n52169,72\n52170,30\n52171,285\n52171,406\n52171,620\n52171,779\n52171,1515\n52172,247\n52172,2867\n52172,22880\n52173,2292\n52174,579\n52175,920\n52176,275\n52177,862\n52178,27041\n52179,52180\n52181,346\n52182,392\n52183,4805\n52184,376\n52185,885\n52186,1983\n52187,694\n52188,301\n52188,189303\n52189,10\n52190,86\n52190,1070\n52190,1313\n52190,2089\n52190,2940\n52190,21944\n52190,43203\n52190,52232\n52190,144556\n52191,250\n52191,1684\n52192,261\n52193,673\n52193,818\n52194,392\n52195,1010\n52197,1623\n52198,557\n52199,557\n52200,1773\n52202,134\n52204,1773\n52205,832\n52206,372\n52206,1001\n52207,516\n52208,390\n52209,1773\n52210,104\n52210,292\n52210,1274\n52211,52212\n52213,72\n52214,736\n52215,52216\n52217,4895\n52218,147\n52218,306\n52218,307\n52218,406\n52218,585\n52218,779\n52218,1181\n52220,52221\n52222,736\n52223,1411\n52223,1564\n52224,50\n52225,52226\n52227,52228\n52229,852\n52230,310\n52231,8854\n52233,2574\n52235,151\n52235,1332\n52235,3724\n52236,240\n52237,267\n52238,83\n52239,682\n52240,52241\n52240,62138\n52240,67632\n52240,81388\n52240,119952\n52240,124201\n52240,127454\n52242,52243\n52244,4903\n52245,1608\n52246,973\n52247,72\n52248,344\n52249,285\n52250,267\n52251,81\n52254,10\n52255,289\n52255,290\n52256,2048\n52257,290\n52257,859\n52258,1046\n52259,250\n52259,1684\n52260,52261\n52261,52261\n52262,8992\n52263,2244\n52264,2146\n52265,1977\n52265,1978\n52266,592\n52267,1773\n52268,147\n52269,52270\n52271,233\n52272,52273\n52274,52275\n52276,850\n52277,779\n52278,163\n52279,52280\n52281,473\n52282,104\n52284,3246\n52284,3247\n52285,72\n52286,344\n52287,285\n52288,366\n52289,872\n52290,366\n52291,366\n52293,366\n52294,195\n52295,2867\n52295,22880\n52297,366\n52299,366\n52300,366\n52301,366\n52302,366\n52304,366\n52305,366\n52310,289\n52310,290\n52313,264\n52315,52316\n52318,7652\n52321,52322\n52323,52324\n52325,192\n52326,515\n52327,652\n52328,215\n52329,2931\n52330,1767\n52331,1858\n52332,1860\n52333,306\n52333,307\n52334,4611\n52335,1544\n52336,1\n52337,397\n52338,3447\n52339,192\n52340,158\n52341,54\n52341,68\n52341,99\n52341,1238\n52341,1891\n52341,1973\n52341,2315\n52342,192\n52343,919\n52343,1240\n52343,5469\n52344,52345\n52346,579\n52347,617\n52347,784\n52347,1146\n52347,1368\n52347,2565\n52347,22835\n52347,38144\n52347,65395\n52347,70032\n52348,83\n52350,433\n52351,392\n52351,1860\n52352,163\n52353,3872\n52354,1133\n52355,346\n52356,623\n52359,7358\n52359,7363\n52360,4475\n52360,8992\n52361,599\n52362,87\n52363,2697\n52364,1673\n52365,6051\n52366,52367\n52368,1882\n52369,626\n52370,818\n52372,1058\n52373,8270\n52375,3467\n52376,714\n52377,163\n52378,477\n52378,2168\n52378,4672\n52379,433\n52380,83\n52381,3252\n52382,34\n52382,35\n52383,15179\n52384,953\n52385,953\n52386,195\n52387,602\n52388,7652\n52389,1688\n52390,309\n52390,310\n52391,818\n52393,111\n52393,203\n52394,34\n52394,4193\n52394,19227\n52395,874\n52396,1452\n52397,1688\n52398,52399\n52400,202\n52400,203\n52401,136\n52402,994\n52403,973\n52403,1732\n52404,344\n52405,2460\n52406,932\n52407,302\n52408,1210\n52409,1619\n52410,510\n52412,953\n52414,510\n52415,312\n52416,3209\n52417,151\n52418,422\n52419,422\n52420,422\n52421,422\n52422,422\n52423,422\n52424,862\n52424,1181\n52425,1276\n52426,422\n52427,298\n52428,485\n52429,422\n52430,422\n52431,137\n52432,919\n52433,86\n52433,586\n52433,1267\n52434,3447\n52435,130\n52436,1287\n52437,79\n52437,178\n52437,538\n52437,4455\n52439,14472\n52440,312\n52441,130\n52441,19413\n52442,644\n52443,509\n52443,1453\n52444,298\n52445,264\n52446,4066\n52447,3370\n52447,14453\n52448,1313\n52449,225\n52450,195\n52451,3960\n52452,215\n52452,1882\n52453,326\n52453,586\n52453,1345\n52455,452\n52455,2206\n52456,211\n52457,302\n52458,163\n52460,1724\n52461,1556\n52462,861\n52463,22\n52464,1556\n52465,861\n52466,22\n52468,406\n52469,192\n52470,195\n52471,72\n52472,344\n52473,285\n52474,252\n52475,104\n52476,859\n52477,290\n52477,3798\n52478,1046\n52480,298\n52482,801\n52483,163\n52484,2351\n52485,8788\n52486,15573\n52487,1414\n52488,862\n52488,3367\n52488,5911\n52491,1058\n52492,510\n52493,217\n52493,1796\n52493,3804\n52494,58\n52495,46\n52496,72\n52497,344\n52498,285\n52500,192\n52500,406\n52501,1556\n52502,1556\n52503,9195\n52504,72\n52505,779\n52506,366\n52507,5366\n52508,72\n52509,1531\n52510,247\n52511,3252\n52512,1818\n52513,6263\n52514,298\n52515,485\n52516,52517\n52518,602\n52519,202\n52519,203\n52520,2944\n52520,148742\n52522,358\n52523,588\n52523,590\n52523,1590\n52523,1893\n52523,9003\n52524,1014\n52525,27773\n52526,483\n52527,3246\n52527,3247\n52528,46\n52528,972\n52528,973\n52528,1284\n52529,7652\n52530,779\n52532,1715\n52533,403\n52533,861\n52534,202\n52534,203\n52534,372\n52535,2146\n52537,151\n52538,240\n52538,289\n52538,290\n52538,298\n52538,417\n52538,609\n52538,2205\n52538,2206\n52538,2296\n52538,2572\n52538,3474\n52538,3623\n52538,4475\n52538,8180\n52538,21711\n52539,167\n52539,186\n52539,240\n52539,372\n52539,435\n52539,818\n52539,1085\n52539,1181\n52539,1298\n52539,1309\n52539,1531\n52539,1807\n52539,2797\n52539,81233\n52539,127158\n52540,1858\n52541,1860\n52542,875\n52543,364\n52544,52545\n52546,2244\n52547,1231\n52548,52549\n52550,178\n52551,346\n52551,516\n52551,1462\n52551,3804\n52551,8537\n52552,862\n52553,44\n52554,6051\n52555,147\n52556,3960\n52557,346\n52558,1715\n52559,392\n52559,918\n52560,192\n52560,202\n52560,203\n52560,422\n52560,516\n52561,1287\n52562,72\n52563,1\n52564,953\n52565,52566\n52567,376\n52568,83\n52569,640\n52570,47\n52570,2469\n52571,4066\n52572,217\n52573,586\n52574,1767\n52575,72\n52576,192\n52577,557\n52578,557\n52579,1572\n52580,178\n52581,68\n52582,8180\n52583,743\n52584,7416\n52585,68\n52585,240\n52585,1745\n52585,1955\n52585,11147\n52586,10\n52587,346\n52588,10\n52589,577\n52590,383\n52591,72\n52592,52593\n52592,69731\n52594,72\n52595,83\n52595,304\n52595,467\n52595,861\n52595,868\n52595,1590\n52595,162599\n52596,622\n52597,72\n52598,143\n52599,4810\n52600,72\n52601,149\n52602,4594\n52603,877\n52604,10\n52605,52606\n52607,3295\n52608,178\n52609,346\n52610,1707\n52611,581\n52612,72\n52613,344\n52614,285\n52615,305\n52616,211\n52616,718\n52617,671\n52618,640\n52619,640\n52620,850\n52621,3949\n52622,306\n52622,307\n52622,682\n52622,72439\n52623,2205\n52623,2206\n52623,33424\n52624,338\n52625,640\n52626,3295\n52627,640\n52628,72\n52629,644\n52630,744\n52631,3218\n52632,783\n52633,1479\n52634,52635\n52636,292\n52637,2506\n52638,72\n52639,52640\n52641,336\n52642,52643\n52642,104096\n52642,104653\n52642,129239\n52642,130113\n52642,130617\n52642,133310\n52642,136636\n52642,165054\n52644,72\n52645,2923\n52646,1531\n52647,278\n52648,1556\n52649,861\n52650,22\n52651,52652\n52654,366\n52655,366\n52656,366\n52657,366\n52658,366\n52659,366\n52660,366\n52661,366\n52662,875\n52663,640\n52664,417\n52665,72\n52666,72\n52667,346\n52668,2574\n52669,1711\n52670,346\n52671,640\n52672,850\n52672,972\n52672,3246\n52672,3247\n52673,346\n52674,1452\n52675,83\n52676,302\n52676,388\n52676,1085\n52677,1179\n52678,52679\n52680,346\n52681,72\n52682,17228\n52684,52685\n52686,392\n52687,3321\n52688,52689\n52690,2073\n52691,83\n52693,52694\n52696,1718\n52697,52698\n52699,346\n52700,358\n52701,611\n52702,1353\n52703,346\n52704,10\n52705,422\n52706,827\n52707,72\n52708,1634\n52709,52710\n52709,100394\n52709,201129\n52712,640\n52713,72\n52714,346\n52715,202\n52715,203\n52716,346\n52717,2411\n52718,52719\n52720,779\n52720,1385\n52720,6487\n52720,52721\n52720,68069\n52720,81025\n52720,81461\n52720,82013\n52720,83227\n52720,83690\n52720,92729\n52720,94925\n52720,96140\n52720,96277\n52720,100635\n52720,104684\n52720,107682\n52720,109447\n52720,111399\n52720,111910\n52720,114963\n52720,116359\n52720,116643\n52720,117216\n52720,124730\n52720,125762\n52720,126426\n52720,126860\n52720,129515\n52720,130131\n52720,130603\n52720,131720\n52720,132161\n52720,139107\n52720,141504\n52720,147229\n52720,149801\n52720,161781\n52720,169575\n52720,169778\n52720,184276\n52720,228837\n52720,239227\n52720,242661\n52720,242673\n52722,346\n52723,31060\n52724,1634\n52725,32475\n52726,233\n52727,312\n52728,872\n52729,626\n52730,515\n52731,312\n52731,3695\n52732,779\n52733,81\n52734,355\n52735,19986\n52737,693\n52738,577\n52739,23011\n52740,52741\n52742,832\n52743,52744\n52745,52746\n52747,832\n52749,660\n52750,306\n52750,307\n52751,301\n52751,379\n52752,379\n52753,379\n52754,1323\n52755,102\n52756,1326\n52757,408\n52758,1882\n52759,346\n52760,52761\n52762,346\n52763,346\n52764,577\n52765,312\n52766,346\n52767,818\n52768,83\n52770,41\n52770,1177\n52771,433\n52772,1118\n52773,907\n52774,298\n52775,485\n52776,704\n52777,389\n52778,2506\n52779,1715\n52780,298\n52781,485\n52782,52783\n52782,65373\n52784,346\n52785,52786\n52787,52788\n52789,2178\n52789,4545\n52790,726\n52790,37414\n52791,1309\n52792,72\n52792,3695\n52793,52794\n52793,91211\n52793,200837\n52795,309\n52795,310\n52795,1888\n52796,1836\n52797,137\n52797,5405\n52798,929\n52798,1509\n52799,58\n52800,46\n52801,264\n52802,182\n52803,4\n52803,5\n52804,581\n52805,298\n52806,609\n52807,52808\n52809,493\n52810,258\n52811,312\n52811,1722\n52811,3538\n52812,1146\n52813,758\n52814,1572\n52815,1238\n52816,52817\n52818,26\n52818,59\n52819,592\n52820,392\n52821,140\n52821,515\n52821,191860\n52822,52823\n52822,61834\n52822,65297\n52825,52826\n52827,52826\n52828,52826\n52829,18726\n52830,163\n52831,749\n52832,52833\n52832,53308\n52832,85357\n52832,116154\n52832,119973\n52832,124321\n52832,133874\n52832,147531\n52834,10\n52835,83\n52836,52837\n52838,3507\n52839,240\n52840,1579\n52841,1639\n52842,406\n52843,309\n52843,310\n52844,1122\n52845,640\n52846,422\n52847,1231\n52848,137\n52849,344\n52849,4823\n52850,515\n52852,3370\n52852,14453\n52853,52854\n52855,406\n52856,850\n52857,2351\n52858,298\n52859,314\n52859,779\n52860,872\n52861,493\n52862,1564\n52862,1818\n52862,3630\n52863,298\n52864,485\n52865,609\n52866,146\n52867,406\n52868,652\n52869,52870\n52871,52872\n52873,72\n52874,644\n52875,52876\n52877,422\n52878,422\n52879,422\n52880,422\n52881,422\n52882,422\n52883,422\n52884,424\n52885,1844\n52886,676\n52887,178\n52888,957\n52888,1815\n52889,298\n52890,485\n52891,21944\n52892,52893\n52894,4\n52894,5\n52895,422\n52896,779\n52897,187\n52898,52899\n52900,138\n52901,52902\n52901,52903\n52902,3507\n52904,376\n52905,312\n52906,3413\n52907,687\n52908,717\n52908,1782\n52909,1556\n52910,861\n52911,22\n52912,1522\n52913,485\n52914,52915\n52916,255\n52919,233\n52919,240\n52920,81\n52921,779\n52922,911\n52922,20757\n52923,2979\n52924,206\n52926,158\n52926,252\n52926,622\n52927,3804\n52928,77\n52929,515\n52930,50\n52931,1247\n52932,1740\n52933,3193\n52934,2048\n52935,87\n52935,372\n52936,393\n52937,326\n52937,579\n52938,151\n52939,255\n52940,255\n52941,483\n52942,1715\n52943,602\n52944,149\n52945,1715\n52947,3467\n52948,3328\n52949,2506\n52950,2506\n52951,422\n52952,56\n52953,106\n52954,503\n52955,1326\n52956,52957\n52958,136\n52959,4637\n52960,81\n52961,247\n52962,346\n52963,195\n52963,217\n52963,657\n52964,289\n52964,290\n52964,94134\n52965,259\n52966,7614\n52967,52968\n52969,79\n52970,628\n52970,859\n52971,178\n52972,592\n52973,602\n52975,167\n52975,2557\n52975,2979\n52976,58\n52978,217\n52979,631\n52980,184\n52981,1085\n52982,52983\n52984,1085\n52985,1149\n52986,72\n52987,1891\n52988,422\n52989,56\n52990,72\n52991,1893\n52992,52993\n52994,1257\n52995,2178\n52995,4545\n52996,626\n52997,20\n52998,704\n52999,10\n53000,187\n53001,3328\n53002,3467\n53003,3148\n53004,332\n53005,920\n53006,15068\n53007,77\n53008,53009\n53010,285\n53010,518\n53011,1509\n53012,2590\n53013,53014\n53013,101963\n53015,3413\n53017,99\n53018,874\n53019,704\n53020,1132\n53021,206\n53022,72\n53023,1462\n53023,8537\n53024,3724\n53025,53026\n53027,972\n53028,2590\n53029,1782\n53030,192\n53030,333\n53030,1181\n53030,4192\n53030,4193\n53031,1181\n53031,4193\n53032,106\n53033,1\n53033,184\n53034,21944\n53035,874\n53036,358\n53037,1544\n53038,640\n53039,640\n53040,310\n53041,53042\n53041,100803\n53043,536\n53043,1274\n53044,344\n53045,53046\n53047,292\n53050,53051\n53052,53053\n53054,53055\n53054,62061\n53056,53057\n53058,346\n53059,392\n53060,1016\n53061,195\n53062,53063\n53064,53065\n53067,1313\n53068,53069\n53070,2574\n53071,53072\n53073,3161\n53074,1782\n53075,227\n53076,636\n53077,53078\n53079,1058\n53080,714\n53081,2506\n53082,326\n53083,53084\n53085,1363\n53086,240\n53087,53088\n53089,53090\n53091,1531\n53092,53093\n53094,640\n53095,53096\n53095,85624\n53095,101114\n53095,126548\n53095,129468\n53095,157810\n53095,161045\n53095,168253\n53095,173660\n53097,1118\n53099,53100\n53101,304\n53102,671\n53103,1\n53103,94\n53103,795\n53103,2787\n53103,30331\n53104,53105\n53106,309\n53106,310\n53107,500\n53108,366\n53109,3872\n53110,640\n53111,2797\n53112,1247\n53113,53114\n53113,63773\n53113,93747\n53115,233\n53116,126\n53116,202\n53116,203\n53116,479\n53116,1392\n53116,3872\n53116,4192\n53116,4193\n53116,17228\n53117,65\n53119,3999\n53120,515\n53122,485\n53123,872\n53124,805\n53125,72\n53126,355\n53127,1644\n53128,438\n53129,859\n53130,72\n53131,668\n53133,346\n53134,720\n53134,907\n53135,147\n53136,366\n53137,366\n53138,366\n53139,366\n53140,366\n53142,366\n53143,312\n53144,366\n53145,366\n53146,366\n53147,366\n53148,366\n53149,366\n53150,366\n53151,366\n53152,366\n53153,366\n53154,779\n53156,306\n53156,307\n53157,516\n53158,209\n53158,1014\n53160,346\n53161,217\n53162,18726\n53163,163\n53164,14434\n53165,872\n53167,147\n53167,493\n53167,1247\n53168,83\n53169,809\n53169,6726\n53171,6750\n53172,53173\n53174,1043\n53175,358\n53176,346\n53177,1\n53178,581\n53179,3370\n53179,14453\n53180,346\n53181,872\n53182,1160\n53182,1381\n53182,103860\n53183,422\n53184,72\n53185,1983\n53186,644\n53188,3138\n53189,483\n53190,72\n53191,17263\n53192,1962\n53193,676\n53194,72\n53195,1977\n53195,1978\n53198,187\n53199,1381\n53200,3\n53200,1392\n53201,178\n53202,72\n53203,192\n53203,302\n53203,1231\n53203,1313\n53203,1425\n53203,4237\n53203,142405\n53203,182162\n53204,10\n53204,184\n53204,306\n53204,307\n53204,772\n53204,801\n53204,1140\n53204,2443\n53204,3474\n53205,3413\n53206,1\n53206,1127\n53206,1619\n53206,1707\n53207,58\n53208,46\n53209,53210\n53211,818\n53212,333\n53213,53214\n53215,18726\n53216,163\n53218,5440\n53219,994\n53220,151\n53221,137\n53222,1707\n53223,1891\n53224,996\n53225,2048\n53227,4475\n53228,1285\n53229,2506\n53231,53232\n53233,509\n53233,510\n53234,53235\n53236,195\n53238,349\n53239,207\n53240,376\n53241,439\n53242,349\n53243,292\n53244,19010\n53245,255\n53246,31977\n53247,158\n53247,206\n53248,21944\n53249,34\n53249,35\n53249,250\n53249,1684\n53250,408\n53251,158\n53252,87\n53253,53254\n53253,69160\n53253,84004\n53253,92030\n53256,72\n53257,1579\n53258,859\n53259,44\n53260,53261\n53262,53263\n53264,1146\n53265,422\n53266,422\n53267,422\n53268,422\n53269,422\n53270,422\n53271,422\n53272,422\n53273,422\n53275,53276\n53277,53278\n53279,595\n53280,676\n53281,3413\n53282,53283\n53284,83\n53285,2701\n53286,571\n53286,2224\n53286,2989\n53286,2991\n53287,2995\n53288,118\n53288,4597\n53289,15573\n53290,207\n53291,1707\n53292,2048\n53293,275\n53294,832\n53295,874\n53296,687\n53297,255\n53298,187\n53299,53300\n53299,75554\n53299,126228\n53301,53302\n53303,3695\n53305,1631\n53306,1474\n53307,509\n53307,510\n53309,3413\n53310,1240\n53312,30\n53312,358\n53312,1149\n53312,1983\n53312,53313\n53312,78474\n53312,92299\n53312,99628\n53312,104786\n53312,107124\n53312,179531\n53312,204612\n53312,249212\n53314,298\n53315,485\n53316,302\n53316,515\n53317,1181\n53318,743\n53319,1309\n53320,346\n53321,72\n53322,9121\n53323,3960\n53324,50\n53324,4193\n53325,254\n53326,1767\n53327,1353\n53328,53329\n53330,240\n53331,652\n53332,8270\n53333,107\n53334,1102\n53335,772\n53337,53338\n53340,53341\n53342,255\n53343,1247\n53343,1644\n53343,1844\n53344,151\n53345,31977\n53345,53346\n53345,83309\n53345,94325\n53345,100725\n53345,102276\n53345,114316\n53345,118765\n53345,125776\n53345,126442\n53345,131558\n53345,184064\n53347,850\n53348,149\n53349,53350\n53351,151\n53352,417\n53353,2105\n53355,53356\n53355,82417\n53357,1235\n53357,1335\n53358,1\n53359,349\n53360,4101\n53361,10\n53362,195\n53363,72\n53364,346\n53366,640\n53367,859\n53368,346\n53369,53370\n53371,275\n53372,53373\n53374,366\n53375,366\n53376,366\n53377,366\n53378,366\n53379,366\n53380,366\n53381,366\n53382,366\n53383,366\n53384,366\n53385,206\n53386,2929\n53387,366\n53388,366\n53389,515\n53390,53391\n53392,195\n53393,53394\n53395,355\n53396,18726\n53397,163\n53398,450\n53399,4192\n53399,4193\n53400,58\n53400,801\n53400,1140\n53400,1177\n53400,1893\n53400,3474\n53401,306\n53401,307\n53402,626\n53403,202\n53403,203\n53404,358\n53404,2105\n53405,346\n53406,83\n53407,1531\n53408,151\n53409,346\n53410,104\n53411,868\n53412,53413\n53414,581\n53416,536\n53417,1634\n53418,424\n53419,273\n53419,274\n53420,305\n53420,366\n53420,500\n53420,718\n53420,1204\n53420,1796\n53420,2373\n53420,20535\n53421,1955\n53423,53424\n53425,1140\n53425,3474\n53425,5547\n53426,1323\n53427,102\n53428,1326\n53429,408\n53430,1257\n53431,1837\n53432,53433\n53434,53435\n53436,644\n53437,298\n53438,861\n53439,818\n53441,676\n53442,1556\n53443,861\n53444,22\n53445,1116\n53446,920\n53446,2178\n53446,4545\n53447,422\n53448,422\n53450,422\n53451,422\n53452,422\n53453,422\n53455,7117\n53456,1715\n53457,195\n53458,483\n53459,187\n53460,195\n53461,1715\n53462,4611\n53463,53464\n53465,53466\n53467,53468\n53467,93922\n53467,100273\n53467,102369\n53469,3413\n53470,195\n53470,222\n53470,1466\n53470,1635\n53470,3135\n53470,3148\n53470,8235\n53471,192\n53472,192\n53473,2206\n53473,31896\n53474,211\n53475,83\n53476,206\n53478,1014\n53479,720\n53479,877\n53479,907\n53479,1284\n53479,1522\n53479,1732\n53479,2191\n53479,3194\n53479,3422\n53480,1844\n53481,392\n53482,1531\n53483,83\n53484,53485\n53486,53487\n53488,53489\n53490,312\n53492,652\n53493,53494\n53495,120\n53495,1353\n53496,151\n53497,219\n53498,259\n53500,1419\n53501,264\n53501,1551\n53502,8822\n53503,53504\n53505,53506\n53507,1556\n53508,861\n53509,22\n53510,500\n53511,143\n53512,1837\n53513,3129\n53514,79\n53516,8270\n53517,151\n53519,779\n53520,53521\n53522,349\n53523,53524\n53525,217\n53525,536\n53525,1417\n53526,53527\n53528,809\n53529,376\n53530,1119\n53531,1058\n53532,489\n53533,349\n53534,3260\n53535,169\n53537,21944\n53538,247\n53538,1309\n53538,3135\n53538,3328\n53541,44\n53542,21944\n53543,72\n53544,53545\n53546,72\n53548,640\n53549,640\n53550,312\n53551,1201\n53552,346\n53554,557\n53555,557\n53556,557\n53557,8719\n53558,138\n53559,865\n53560,557\n53561,137\n53562,21944\n53563,118\n53563,4597\n53564,8719\n53565,138\n53566,865\n53567,557\n53568,137\n53569,21944\n53570,118\n53570,4597\n53571,10\n53572,8719\n53573,138\n53574,865\n53575,557\n53576,137\n53577,118\n53577,4597\n53578,21944\n53579,8719\n53580,138\n53581,865\n53582,557\n53583,137\n53584,21944\n53585,118\n53585,4597\n53586,53587\n53588,53587\n53590,53591\n53592,17334\n53593,8270\n53594,106\n53594,538\n53594,1531\n53594,1634\n53596,53597\n53598,120\n53599,4078\n53600,53601\n53602,53603\n53606,2367\n53607,640\n53608,640\n53609,21944\n53610,640\n53611,640\n53612,53613\n53614,53615\n53616,53617\n53618,53619\n53620,53621\n53623,120\n53624,640\n53625,240\n53625,424\n53625,438\n53625,515\n53625,588\n53625,590\n53625,779\n53625,1634\n53625,3246\n53625,3247\n53626,1181\n53627,53628\n53629,1462\n53629,8537\n53630,452\n53631,1247\n53632,184\n53634,247\n53635,225\n53636,1767\n53637,1309\n53637,22880\n53638,247\n53639,53640\n53641,1179\n53642,640\n53643,1522\n53645,53646\n53647,640\n53648,53649\n53650,326\n53650,873\n53651,53652\n53653,640\n53654,346\n53655,397\n53656,346\n53657,53658\n53659,118\n53659,4597\n53660,275\n53661,874\n53662,17228\n53664,1773\n53665,644\n53666,16196\n53667,53668\n53669,53670\n53671,184\n53672,53673\n53674,53675\n53676,233\n53677,346\n53678,640\n53679,195\n53680,515\n53681,83\n53682,53683\n53682,84235\n53682,121489\n53684,355\n53685,53686\n53687,1968\n53689,310\n53690,1181\n53691,306\n53691,307\n53692,53693\n53694,8788\n53695,118\n53695,4597\n53696,53697\n53698,8270\n53699,1284\n53701,83\n53702,366\n53703,366\n53704,366\n53705,366\n53706,366\n53707,366\n53708,366\n53709,366\n53710,83\n53711,207\n53712,3069\n53713,420\n53714,298\n53715,485\n53716,704\n53717,301\n53717,1715\n53718,581\n53719,333\n53720,83\n53721,53722\n53723,21944\n53724,83\n53725,3148\n53726,106\n53726,1370\n53726,56998\n53726,62895\n53726,89736\n53726,191355\n53727,53728\n53729,294\n53729,596\n53729,784\n53729,1119\n53729,2424\n53730,1556\n53731,861\n53732,22\n53733,515\n53733,589\n53733,1877\n53734,1072\n53735,255\n53736,255\n53737,1016\n53737,2205\n53737,2206\n53737,33424\n53738,1556\n53739,861\n53740,22\n53741,932\n53742,1381\n53743,207\n53744,481\n53745,346\n53747,7\n53748,21944\n53749,7\n53751,389\n53752,298\n53753,485\n53754,861\n53754,2116\n53755,53756\n53757,1238\n53758,973\n53759,1133\n53761,79\n53761,104\n53761,111\n53761,134\n53761,192\n53761,200\n53761,202\n53761,203\n53761,215\n53761,227\n53761,240\n53761,248\n53761,264\n53761,289\n53761,290\n53761,298\n53761,309\n53761,310\n53761,333\n53761,503\n53761,516\n53761,588\n53761,590\n53761,631\n53761,636\n53761,714\n53761,805\n53761,1016\n53761,1102\n53761,1119\n53761,1149\n53761,1181\n53761,1282\n53761,1462\n53761,1631\n53761,1659\n53761,1745\n53761,1849\n53761,1955\n53761,1962\n53761,2205\n53761,2206\n53761,2286\n53761,2443\n53761,4355\n53761,6955\n53761,8180\n53761,8537\n53761,9005\n53761,9006\n53761,9010\n53761,54004\n53762,53763\n53764,298\n53765,485\n53766,298\n53767,485\n53768,2210\n53768,4237\n53769,22580\n53770,1462\n53770,8537\n53771,53772\n53773,2828\n53774,346\n53775,872\n53776,18726\n53777,163\n53778,3413\n53779,53780\n53781,332\n53781,389\n53782,850\n53783,3069\n53784,346\n53785,136\n53786,53787\n53788,8822\n53789,2421\n53790,53791\n53792,137\n53793,1688\n53794,217\n53795,10\n53795,50\n53795,120\n53795,147\n53795,151\n53795,222\n53795,248\n53795,647\n53795,657\n53795,1235\n53795,1335\n53795,1381\n53795,4504\n53796,346\n53797,195\n53798,3695\n53799,298\n53800,485\n53801,3695\n53802,3246\n53802,3247\n53803,7\n53804,195\n53805,53806\n53807,1381\n53808,53809\n53810,298\n53811,485\n53812,483\n53813,3069\n53814,376\n53815,2334\n53816,72\n53817,72\n53818,53818\n53820,53821\n53822,676\n53823,2979\n53824,17334\n53825,53826\n53827,640\n53828,640\n53829,994\n53829,1235\n53829,1335\n53830,640\n53831,36388\n53832,106\n53833,53834\n53833,86775\n53833,86788\n53833,95723\n53833,99009\n53833,115824\n53833,117406\n53833,117504\n53835,53836\n53837,1556\n53838,1400\n53839,274\n53839,1210\n53839,1980\n53840,393\n53841,53842\n53843,44\n53844,346\n53845,2506\n53846,2017\n53847,1\n53848,3960\n53849,53850\n53851,72\n53852,640\n53853,53854\n53855,53856\n53855,120676\n53855,135668\n53855,196520\n53857,72\n53858,17334\n53859,1983\n53860,366\n53861,53862\n53863,18726\n53863,68955\n53864,2146\n53865,693\n53865,1458\n53866,1181\n53867,640\n53868,8270\n53869,53870\n53871,298\n53872,485\n53873,1058\n53874,53875\n53876,53877\n53879,1858\n53880,1860\n53881,1858\n53882,1860\n53883,72\n53884,267\n53886,994\n53888,53889\n53890,53891\n53892,72\n53894,53895\n53896,53897\n53898,53899\n53900,53901\n53902,187\n53903,53904\n53906,2506\n53908,9560\n53909,53910\n53912,31977\n53913,53914\n53915,275\n53916,874\n53917,1849\n53918,1776\n53920,1381\n53922,557\n53923,147\n53924,240\n53925,53926\n53925,73060\n53925,94641\n53925,111198\n53925,112404\n53925,120148\n53927,536\n53927,1019\n53927,1417\n53928,72\n53929,81\n53930,72\n53931,53932\n53933,233\n53934,1773\n53935,346\n53936,53937\n53938,18726\n53939,53940\n53941,163\n53942,515\n53943,417\n53944,107\n53945,2416\n53945,2417\n53946,292\n53947,338\n53948,53949\n53950,298\n53951,743\n53952,151\n53953,1133\n53954,3538\n53955,53956\n53955,59993\n53957,355\n53958,668\n53959,53960\n53961,53960\n53962,634\n53963,907\n53963,22880\n53964,211\n53965,53966\n53967,366\n53968,366\n53969,366\n53970,53971\n53973,136\n53974,18726\n53975,53975\n53976,72\n53977,663\n53977,664\n53978,346\n53979,676\n53981,515\n53982,652\n53983,911\n53983,6638\n53984,2506\n53985,907\n53985,1117\n53986,581\n53987,2206\n53987,31896\n53988,151\n53989,298\n53990,485\n53991,53992\n53993,56\n53994,3724\n53995,872\n53996,872\n53997,187\n53999,160\n54000,54001\n54002,740\n54002,741\n54003,346\n54005,83\n54006,83\n54007,4177\n54008,346\n54009,3413\n54010,21944\n54011,875\n54012,54013\n54014,636\n54015,274\n54015,1210\n54015,1980\n54016,647\n54017,344\n54018,274\n54018,1210\n54018,1980\n54019,5375\n54020,275\n54021,874\n54022,54023\n54024,313\n54025,599\n54026,1118\n54027,718\n54028,3069\n54029,54030\n54029,93921\n54029,117192\n54029,128661\n54029,155923\n54031,346\n54032,772\n54033,346\n54034,312\n54035,66\n54036,779\n54036,3999\n54037,147\n54038,2244\n54041,349\n54042,483\n54043,1417\n54044,79\n54045,54046\n54047,2506\n54048,54049\n54050,1556\n54051,433\n54052,54053\n54054,422\n54054,1556\n54055,5662\n54056,310\n54057,305\n54057,1818\n54058,54059\n54060,240\n54061,306\n54061,307\n54063,54064\n54065,1188\n54066,305\n54067,581\n54068,219\n54070,346\n54071,417\n54072,79\n54073,795\n54074,305\n54075,97\n54076,346\n54079,54080\n54081,18726\n54082,305\n54083,907\n54084,18726\n54085,18726\n54087,298\n54088,485\n54089,360\n54091,217\n54091,1417\n54092,415\n54094,54095\n54094,57563\n54096,302\n54097,3370\n54097,14453\n54098,18726\n54099,44\n54100,163\n54101,298\n54102,485\n54103,126\n54103,1663\n54105,160\n54106,931\n54107,1014\n54108,510\n54110,346\n54111,832\n54112,557\n54113,557\n54114,515\n54115,862\n54117,557\n54118,557\n54120,5469\n54121,596\n54122,54123\n54124,1284\n54125,54126\n54127,54128\n54129,54130\n54129,60229\n54129,85442\n54129,161127\n54129,173011\n54129,180357\n54129,197409\n54129,198167\n54131,1014\n54132,326\n54133,54134\n54135,54136\n54137,54138\n54139,298\n54140,485\n54141,202\n54141,203\n54143,602\n54144,602\n54145,1381\n54146,980\n54146,1531\n54148,54149\n54150,72\n54151,20\n54152,54153\n54152,57732\n54152,73006\n54152,90577\n54152,99023\n54154,17334\n54155,4980\n54156,3069\n54158,422\n54159,422\n54160,422\n54161,422\n54162,422\n54163,422\n54164,422\n54165,422\n54166,422\n54167,54168\n54169,1181\n54170,72\n54171,298\n54172,485\n54173,640\n54174,1133\n54175,54176\n54177,54178\n54179,54180\n54181,207\n54182,827\n54183,163\n54184,54185\n54186,577\n54187,118\n54187,4597\n54188,676\n54189,424\n54189,3209\n54190,137\n54191,72\n54192,16921\n54192,113497\n54193,54194\n54195,48\n54195,87\n54195,111\n54195,130\n54195,163\n54195,178\n54195,184\n54195,192\n54195,217\n54195,264\n54195,296\n54195,309\n54195,310\n54195,344\n54195,346\n54195,435\n54195,510\n54195,515\n54195,516\n54195,538\n54195,579\n54195,589\n54195,647\n54195,801\n54195,811\n54195,932\n54195,1001\n54195,1007\n54195,1058\n54195,1118\n54195,1122\n54195,1188\n54195,1267\n54195,1294\n54195,1452\n54195,1509\n54195,1531\n54195,1962\n54195,1968\n54195,2116\n54195,2626\n54195,3041\n54195,3089\n54195,3345\n54195,3585\n54195,3695\n54195,5358\n54195,5911\n54195,6119\n54195,9024\n54195,14352\n54195,19356\n54195,31896\n54195,36985\n54195,54202\n54196,278\n54197,240\n54198,302\n54199,54200\n54201,54201\n54203,54204\n54205,83\n54205,278\n54205,292\n54205,313\n54205,326\n54205,356\n54205,385\n54205,417\n54205,424\n54205,477\n54205,663\n54205,697\n54205,752\n54205,781\n54205,1140\n54205,1167\n54205,1201\n54205,1240\n54205,1465\n54205,1571\n54205,1881\n54205,2224\n54205,2266\n54205,2367\n54205,2553\n54205,2944\n54205,3467\n54205,4220\n54205,5326\n54205,5591\n54205,7698\n54205,8463\n54205,16614\n54205,19443\n54206,187\n54207,640\n54208,83\n54208,455\n54208,949\n54209,54210\n54211,346\n54212,211\n54213,805\n54214,54215\n54216,596\n54217,640\n54218,3413\n54219,6888\n54220,292\n54221,54222\n54223,294\n54225,296\n54226,298\n54227,34\n54227,35\n54228,557\n54229,640\n54230,9195\n54232,298\n54233,485\n54234,79\n54234,931\n54234,21442\n54235,10\n54236,248\n54236,626\n54237,54238\n54239,206\n54239,240\n54239,315\n54239,406\n54239,489\n54239,652\n54239,809\n54239,934\n54239,1118\n54239,1140\n54239,1210\n54239,1370\n54239,1381\n54239,1400\n54239,1462\n54239,1776\n54239,1844\n54239,1877\n54239,2334\n54239,4066\n54239,6303\n54239,6661\n54239,8537\n54239,54202\n54239,54243\n54240,54241\n54240,94516\n54242,278\n54244,298\n54245,485\n54246,515\n54247,1639\n54248,54249\n54251,392\n54252,1844\n54253,7360\n54254,366\n54255,366\n54256,805\n54257,515\n54257,4771\n54258,4101\n54259,333\n54259,431\n54259,439\n54259,440\n54259,444\n54259,1102\n54259,1177\n54259,1326\n54259,4453\n54259,5213\n54259,6955\n54259,54264\n54259,54272\n54260,163\n54261,355\n54262,718\n54262,4101\n54263,151\n54265,907\n54266,54267\n54268,160\n54269,1891\n54270,147\n54271,596\n54271,1368\n54273,163\n54274,4\n54274,5\n54274,65\n54274,68\n54274,72\n54274,79\n54274,94\n54274,97\n54274,119\n54274,227\n54274,302\n54274,305\n54274,310\n54274,323\n54274,340\n54274,358\n54274,392\n54274,420\n54274,442\n54274,479\n54274,491\n54274,577\n54274,622\n54274,628\n54274,687\n54274,818\n54274,827\n54274,841\n54274,859\n54274,861\n54274,872\n54274,994\n54274,1033\n54274,1052\n54274,1289\n54274,1466\n54274,1551\n54274,1556\n54274,1590\n54274,1612\n54274,1707\n54274,1715\n54274,1749\n54274,1796\n54274,1818\n54274,1893\n54274,2205\n54274,2206\n54274,2209\n54274,2260\n54274,2312\n54274,2443\n54274,2787\n54274,2979\n54274,3039\n54274,4411\n54274,6051\n54274,8180\n54274,8541\n54274,8820\n54274,9018\n54274,9028\n54274,17309\n54274,17384\n54274,20359\n54274,32475\n54274,54284\n54274,54362\n54275,140\n54275,827\n54276,58\n54277,46\n54278,163\n54279,808\n54280,1087\n54281,850\n54282,54283\n54282,197862\n54285,211\n54285,1844\n54286,1149\n54288,2105\n54289,1556\n54290,1639\n54291,202\n54291,333\n54291,439\n54291,694\n54291,788\n54291,862\n54292,202\n54292,203\n54293,255\n54294,893\n54295,602\n54295,2353\n54295,6966\n54295,13486\n54296,58\n54298,868\n54299,53617\n54301,1381\n54302,932\n54303,54304\n54303,95935\n54305,718\n54308,192\n54310,72\n54311,344\n54312,285\n54314,671\n54316,314\n54316,779\n54317,1635\n54318,79\n54319,163\n54321,493\n54322,640\n54323,640\n54324,640\n54325,360\n54328,222\n54330,251\n54331,167\n54331,1381\n54332,1151\n54332,1572\n54333,450\n54334,424\n54335,349\n54336,54337\n54338,1509\n54339,163\n54340,43604\n54341,1140\n54341,1240\n54341,3367\n54342,3331\n54343,58\n54344,54345\n54346,346\n54347,611\n54347,1677\n54347,37414\n54348,818\n54349,893\n54349,1556\n54350,54351\n54353,1566\n54354,79\n54356,298\n54357,485\n54358,58\n54359,1653\n54359,2889\n54360,344\n54360,1711\n54360,1836\n54363,510\n54364,516\n54366,305\n54367,1151\n54368,344\n54369,843\n54370,868\n54371,1566\n54372,1531\n54373,516\n54373,1220\n54373,1222\n54374,592\n54375,1231\n54376,1927\n54377,298\n54378,346\n54379,415\n54380,54381\n54382,1818\n54383,1663\n54384,1285\n54385,1556\n54386,581\n54387,685\n54388,376\n54389,8270\n54390,911\n54392,1566\n54394,818\n54396,1977\n54396,1978\n54397,87\n54397,697\n54398,81\n54398,137\n54398,215\n54398,1282\n54399,10\n54399,2574\n54399,3111\n54400,920\n54400,1559\n54402,356\n54402,852\n54403,972\n54403,973\n54403,1284\n54403,3804\n54404,873\n54405,422\n54406,422\n54407,636\n54409,422\n54410,1181\n54411,422\n54412,200\n54413,422\n54414,422\n54415,422\n54416,422\n54417,233\n54418,72\n54419,360\n54421,1119\n54421,2995\n54422,13361\n54423,58\n54424,240\n54424,1085\n54425,657\n54426,1241\n54427,818\n54428,360\n54429,68\n54430,79\n54432,1381\n54433,1590\n54434,106\n54435,389\n54436,171\n54436,605\n54436,3182\n54436,5358\n54436,14352\n54436,142430\n54437,392\n54440,932\n54441,312\n54442,872\n54443,298\n54444,485\n54445,1118\n54446,1849\n54447,872\n54448,3328\n54449,500\n54450,577\n54451,500\n54452,313\n54452,385\n54452,5591\n54453,1509\n54454,1608\n54454,77315\n54455,1068\n54455,1506\n54456,37\n54456,1782\n54457,356\n54458,1612\n54459,72\n54460,4678\n54461,872\n54462,850\n54463,292\n54464,389\n54465,671\n54465,1181\n54465,1381\n54466,79\n54467,406\n54468,626\n54469,980\n54470,640\n54471,422\n54472,147\n54472,158\n54472,406\n54473,1983\n54475,872\n54476,292\n54477,557\n54478,877\n54479,4805\n54480,389\n54482,54483\n54484,222\n54484,278\n54484,891\n54484,1019\n54486,2436\n54488,859\n54489,217\n54490,54491\n54492,1782\n54493,577\n54493,788\n54493,1070\n54493,1105\n54493,127158\n54493,138686\n54496,305\n54497,500\n54498,1962\n54499,1052\n54500,1882\n54501,2775\n54502,54\n54503,2210\n54503,4237\n54504,390\n54504,518\n54504,973\n54504,1284\n54504,1849\n54504,230519\n54506,99\n54507,1181\n54507,68069\n54508,1220\n54508,1222\n54509,1381\n54512,195\n54513,20757\n54515,34\n54515,35\n54516,1556\n54517,861\n54518,22\n54519,640\n54520,571\n54521,344\n54522,72\n54523,344\n54524,285\n54525,3138\n54527,718\n54529,2812\n54531,581\n54531,918\n54532,2775\n54532,4805\n54533,79\n54534,4475\n54535,269\n54536,192\n54537,240\n54538,818\n54539,31073\n54541,649\n54542,34\n54542,35\n54542,83\n54542,217\n54542,949\n54543,217\n54543,1417\n54544,1181\n54545,640\n54545,4192\n54545,4193\n54546,298\n54547,557\n54548,54549\n54551,240\n54551,1285\n54551,5718\n54552,104\n54552,162599\n54553,184\n54554,54555\n54556,1983\n54557,392\n54557,697\n54557,1240\n54557,3003\n54558,743\n54560,417\n54562,147\n54563,163\n54566,1789\n54566,174551\n54567,305\n54568,1639\n54569,1300\n54570,592\n54571,120\n54571,1019\n54572,760\n54573,595\n54574,779\n54575,1149\n54575,1631\n54576,1639\n54577,1210\n54579,346\n54580,1033\n54582,56\n54582,30331\n54583,862\n54585,298\n54586,485\n54587,30\n54587,134\n54587,1179\n54588,83\n54589,83\n54589,338\n54589,1274\n54589,2572\n54589,6068\n54589,13136\n54590,1551\n54592,779\n54593,1127\n54594,54595\n54596,195\n54597,247\n54598,406\n54599,22\n54600,364\n54601,1381\n54602,389\n54603,811\n54604,1181\n54605,1370\n54605,2782\n54606,301\n54606,615\n54607,392\n54608,66\n54609,54609\n54610,37088\n54611,34\n54611,35\n54612,328\n54612,7124\n54614,195\n54615,104\n54615,784\n54615,1001\n54615,1462\n54615,8537\n54616,10\n54616,126\n54616,217\n54616,302\n54616,397\n54616,1118\n54616,1191\n54616,1192\n54616,1204\n54616,1559\n54616,1663\n54616,1844\n54616,2173\n54616,2253\n54616,3524\n54616,3582\n54616,4165\n54617,996\n54618,30\n54618,305\n54618,1871\n54619,2506\n54620,305\n54622,54623\n54622,80508\n54622,82500\n54622,92691\n54624,4192\n54624,4193\n54625,805\n54625,1282\n54626,1634\n54627,424\n54628,795\n54629,118\n54629,4597\n54630,81\n54632,1276\n54632,3698\n54633,312\n54634,634\n54634,2421\n54636,1238\n54637,744\n54638,2146\n54639,392\n54640,1983\n54641,137\n54643,2224\n54644,779\n54645,305\n54645,1796\n54647,671\n54648,358\n54649,932\n54650,376\n54651,885\n54652,1388\n54653,406\n54654,392\n54655,54656\n54657,346\n54658,30\n54658,1179\n54659,1454\n54660,275\n54661,298\n54662,2697\n54663,2048\n54664,292\n54665,636\n54666,41\n54667,473\n54668,364\n54670,54671\n54672,54673\n54674,1227\n54674,1229\n54674,1252\n54674,1253\n54674,21944\n54675,483\n54677,743\n54678,2646\n54679,151\n54681,389\n54682,10\n54683,18726\n54684,22\n54684,163\n54684,302\n54684,579\n54684,818\n54684,861\n54684,1556\n54684,4453\n54685,631\n54685,2995\n54686,54687\n54688,447\n54688,671\n54689,163\n54690,54691\n54692,147\n54692,158\n54693,41\n54694,54695\n54696,54695\n54697,298\n54698,485\n54699,21944\n54702,240\n54702,1119\n54703,273\n54703,274\n54703,313\n54704,1381\n54705,178\n54706,83\n54707,83\n54708,749\n54710,72\n54711,5405\n54712,1096\n54713,2372\n54714,1801\n54715,54716\n54717,72\n54718,344\n54719,285\n54720,72\n54721,54722\n54723,1332\n54724,247\n54725,134\n54726,3069\n54727,72\n54728,333\n54729,54730\n54731,1462\n54731,8537\n54732,788\n54732,1531\n54732,6803\n54733,3538\n54734,83\n54735,54736\n54737,289\n54737,290\n54738,83\n54739,2411\n54739,6803\n54740,312\n54741,516\n54742,527\n54742,740\n54742,741\n54742,743\n54743,1623\n54744,406\n54744,1515\n54745,1858\n54746,1860\n54747,376\n54748,346\n54749,1132\n54750,781\n54751,86\n54751,301\n54751,907\n54751,1293\n54751,1436\n54751,1522\n54751,2083\n54751,2557\n54751,2979\n54752,2995\n54753,1467\n54754,907\n54754,22880\n54755,1309\n54756,406\n54757,54758\n54757,55411\n54757,64084\n54757,83681\n54757,87565\n54757,95838\n54759,10\n54760,83\n54760,1274\n54760,2779\n54760,2784\n54760,28130\n54761,772\n54762,563\n54763,72\n54764,2434\n54765,393\n54765,1531\n54766,72\n54767,344\n54768,285\n54770,274\n54770,1210\n54770,1980\n54771,393\n54772,1381\n54773,346\n54774,252\n54776,1014\n54777,72\n54778,344\n54779,285\n54780,10\n54781,718\n54782,1\n54782,306\n54782,307\n54782,491\n54782,1425\n54782,1515\n54782,4039\n54782,4260\n54782,165561\n54782,260893\n54783,54783\n54784,83\n54784,455\n54784,949\n54785,2367\n54786,54787\n54788,1551\n54789,99\n54790,1188\n54791,65\n54792,54793\n54794,557\n54795,3370\n54795,14453\n54797,1181\n54797,141912\n54798,439\n54798,1789\n54799,406\n54800,147\n54800,158\n54801,557\n54802,557\n54803,1181\n54804,15068\n54805,54806\n54807,690\n54808,1033\n54808,1612\n54809,44\n54810,54811\n54812,301\n54813,372\n54815,137\n54816,640\n54817,309\n54817,310\n54818,406\n54819,72\n54820,406\n54821,9029\n54823,623\n54823,1805\n54824,2105\n54825,298\n54826,485\n54827,1634\n54828,72\n54829,920\n54830,1566\n54831,349\n54832,640\n54833,147\n54833,158\n54834,704\n54835,312\n54837,2048\n54838,195\n54839,3413\n54840,72\n54841,247\n54842,809\n54843,676\n54844,516\n54845,452\n54845,2206\n54846,54847\n54846,124064\n54846,124198\n54846,136179\n54846,156151\n54846,170123\n54846,173040\n54846,176182\n54846,178990\n54846,190651\n54846,213524\n54846,221569\n54846,225505\n54846,232431\n54846,234617\n54846,239667\n54846,244985\n54846,253764\n54846,257162\n54846,258229\n54846,263875\n54846,264545\n54848,54849\n54850,54851\n54852,801\n54852,1140\n54852,3474\n54852,5547\n54853,1860\n54854,602\n54855,602\n54856,118\n54856,4597\n54857,1204\n54858,54859\n54860,340\n54861,54862\n54861,155356\n54863,72\n54864,503\n54866,1551\n54867,8270\n54868,920\n54869,26\n54869,59\n54869,117\n54869,885\n54869,886\n54869,1235\n54869,1335\n54869,54870\n54871,493\n54871,586\n54871,663\n54871,59021\n54872,1551\n54873,187\n54874,2334\n54875,171\n54876,79\n54877,54878\n54879,54880\n54881,31977\n54882,349\n54883,3413\n54884,323\n54885,21944\n54886,356\n54888,9018\n54889,54890\n54891,252\n54892,1265\n54892,1266\n54893,9018\n54894,779\n54895,779\n54896,83\n54897,54898\n54899,1181\n54900,333\n54901,479\n54902,115\n54902,118\n54903,1149\n54904,104\n54904,134\n54905,275\n54906,360\n54907,424\n54908,233\n54909,704\n54910,217\n54910,1417\n54911,79\n54911,147\n54912,54913\n54914,850\n54915,54915\n54916,163\n54916,489\n54917,515\n54918,54919\n54920,704\n54921,872\n54922,2351\n54923,1707\n54924,392\n54924,1860\n54925,349\n54926,269\n54927,355\n54929,1247\n54929,1644\n54929,1844\n54930,302\n54931,459\n54932,54933\n54934,1789\n54935,298\n54936,485\n54937,195\n54938,583\n54940,3\n54941,1096\n54942,207\n54943,18726\n54944,292\n54945,192\n54945,340\n54945,505\n54945,893\n54945,1927\n54945,4172\n54945,45437\n54946,302\n54946,579\n54946,687\n54946,2116\n54947,306\n54947,307\n54948,222\n54948,455\n54948,972\n54948,6068\n54949,718\n54950,366\n54951,248\n54951,1332\n54951,1572\n54951,1844\n54951,11147\n54952,392\n54952,809\n54953,72\n54954,3967\n54955,192\n54956,206\n54957,278\n54957,1274\n54958,66\n54958,149\n54958,467\n54958,671\n54958,818\n54958,21442\n54959,3\n54960,1590\n54961,72\n54962,344\n54962,1711\n54962,1836\n54964,54965\n54966,167\n54967,422\n54968,422\n54969,422\n54970,422\n54971,2889\n54972,58\n54973,626\n54974,298\n54975,485\n54976,1711\n54977,500\n54978,26181\n54979,83\n54979,694\n54979,3367\n54980,178\n54981,83\n54982,516\n54983,973\n54984,422\n54985,422\n54986,422\n54987,307\n54987,682\n54987,72439\n54989,422\n54990,422\n54991,2178\n54991,4545\n54992,302\n54992,2116\n54993,500\n54994,500\n54995,1983\n54996,393\n54997,137\n54998,581\n54999,55000\n55001,932\n55002,55003\n55002,89180\n55002,92307\n55002,94628\n55002,98692\n55002,100186\n55002,123413\n55002,170446\n55002,217739\n55002,254477\n55004,79\n55005,1181\n55007,233\n55008,55009\n55008,57979\n55008,68296\n55010,298\n55011,485\n55012,83\n55012,6955\n55014,337\n55014,586\n55015,1858\n55016,1860\n55018,647\n55019,752\n55021,264\n55022,111\n55022,289\n55022,290\n55022,309\n55022,310\n55022,1631\n55023,97\n55023,8180\n55023,30331\n55024,292\n55025,72\n55026,415\n55027,292\n55030,893\n55032,79\n55033,389\n55034,56\n55034,79\n55034,192\n55034,202\n55034,333\n55034,1181\n55034,256681\n55035,19443\n55036,56\n55036,192\n55036,406\n55036,620\n55036,1515\n55037,7360\n55038,760\n55039,949\n55040,1590\n55040,1644\n55041,809\n55042,21944\n55043,1858\n55044,1860\n55045,874\n55047,596\n55047,3507\n55050,1858\n55051,1860\n55052,433\n55053,298\n55054,3507\n55055,79\n55055,2775\n55056,1858\n55057,1860\n55058,55059\n55060,1326\n55061,1608\n55062,1858\n55063,1860\n55066,346\n55067,55068\n55069,18726\n55070,3069\n55071,292\n55072,55073\n55074,163\n55075,56\n55075,99\n55075,192\n55075,493\n55075,1181\n55075,30331\n55075,60576\n55076,1908\n55076,55077\n55078,433\n55079,644\n55080,968\n55080,1001\n55081,875\n55082,2083\n55083,275\n55084,83\n55085,79\n55086,151\n55086,2266\n55087,1149\n55088,8992\n55089,602\n55090,832\n55091,415\n55093,852\n55093,1133\n55095,269\n55096,652\n55098,712\n55099,301\n55099,968\n55100,1298\n55101,752\n55102,298\n55103,485\n55104,186\n55105,211\n55105,538\n55105,1844\n55107,104\n55108,83\n55109,875\n55110,875\n55111,1132\n55112,781\n55113,1452\n55114,79\n55115,515\n55116,83\n55117,779\n55118,1179\n55119,1623\n55120,2995\n55121,222\n55122,1836\n55124,192\n55124,493\n55125,1639\n55126,602\n55127,79\n55129,55130\n55131,3653\n55132,1313\n55133,7124\n55134,875\n55135,20359\n55136,1231\n55137,137\n55139,875\n55140,920\n55141,147\n55142,10\n55143,1871\n55144,1\n55144,171\n55145,577\n55146,1119\n55146,1962\n55146,4218\n55146,4220\n55147,392\n55148,302\n55148,312\n55148,861\n55148,1556\n55149,240\n55149,818\n55149,859\n55150,292\n55151,1454\n55151,1722\n55152,5662\n55153,389\n55155,2048\n55156,392\n55156,626\n55156,1240\n55157,83\n55158,6627\n55160,104\n55160,138\n55161,1984\n55162,18726\n55163,932\n55163,1016\n55163,2205\n55163,2206\n55163,2567\n55163,33424\n55163,245910\n55164,2775\n55165,447\n55166,163\n55168,104\n55168,240\n55168,264\n55168,2436\n55169,1082\n55170,55171\n55172,1370\n55172,1821\n55173,255\n55174,577\n55174,671\n55174,1276\n55175,1370\n55175,1821\n55177,4771\n55178,991\n55178,1267\n55178,1579\n55178,2605\n55179,1564\n55179,1707\n55179,1955\n55179,6837\n55179,66500\n55179,125569\n55181,302\n55181,6303\n55184,1968\n55185,1326\n55186,640\n55187,7416\n55188,55189\n55190,298\n55191,485\n55192,622\n55193,676\n55194,1210\n55195,222\n55195,657\n55195,13546\n55196,30236\n55197,392\n55198,68\n55198,9021\n55199,2557\n55200,483\n55201,222\n55202,389\n55202,1072\n55203,2944\n55203,7698\n55204,500\n55205,1663\n55206,3138\n55207,55208\n55207,157843\n55209,160\n55211,346\n55212,1634\n55213,1370\n55213,1821\n55214,233\n55214,240\n55215,30\n55216,55217\n55218,1370\n55218,1821\n55220,10\n55221,310\n55221,3161\n55223,151\n55224,433\n55226,55227\n55228,55227\n55230,1370\n55230,1821\n55231,433\n55231,1010\n55231,1298\n55231,75912\n55232,55233\n55232,231213\n55233,34\n55234,2784\n55234,55233\n55234,231213\n55235,55233\n55235,98399\n55236,1370\n55236,1821\n55237,3698\n55238,55233\n55238,68069\n55238,94464\n55239,55240\n55239,205383\n55241,273\n55241,274\n55242,217\n55243,1983\n55244,18831\n55245,1370\n55245,1821\n55246,187\n55247,640\n55248,222\n55248,657\n55249,18831\n55250,37\n55252,2572\n55254,1\n55254,336\n55254,397\n55254,406\n55254,1425\n55254,8055\n55254,102560\n55255,147\n55255,516\n55255,920\n55255,1181\n55256,83\n55257,217\n55258,146\n55259,4\n55259,5\n55260,55233\n55262,872\n55264,994\n55265,2421\n55267,1370\n55267,1821\n55268,55269\n55270,55271\n55272,994\n55273,996\n55274,376\n55275,885\n55276,55277\n55278,3413\n55280,7\n55280,309\n55280,310\n55281,376\n55282,704\n55283,55284\n55285,885\n55286,1474\n55287,440\n55287,622\n55287,3367\n55288,37088\n55289,305\n55290,247\n55291,579\n55292,875\n55293,376\n55294,192\n55295,163\n55296,202\n55296,203\n55297,1370\n55297,1821\n55298,126\n55298,346\n55298,972\n55299,17346\n55301,557\n55302,4504\n55303,424\n55305,195\n55306,1454\n55307,271\n55308,602\n55309,55310\n55311,72\n55312,704\n55313,622\n55314,1370\n55314,1821\n55315,30\n55317,55318\n55319,158\n55319,252\n55320,9195\n55321,83\n55322,1858\n55323,1860\n55324,1858\n55325,1860\n55326,333\n55326,36819\n55329,222\n55331,30\n55332,1608\n55333,805\n55334,137\n55335,1298\n55336,30\n55337,83\n55338,35\n55338,83\n55339,83\n55340,3804\n55341,250\n55341,1684\n55342,1805\n55343,1370\n55343,1821\n55344,8270\n55345,309\n55345,310\n55346,309\n55346,310\n55347,795\n55349,30\n55350,1085\n55351,171\n55352,1370\n55352,1821\n55353,1381\n55354,306\n55354,307\n55355,676\n55356,255\n55357,605\n55358,861\n55359,233\n55359,1715\n55359,4146\n55360,557\n55361,1631\n55362,557\n55364,55365\n55366,3413\n55367,184\n55367,21442\n55368,640\n55369,146\n55370,7270\n55371,222\n55372,604\n55374,9121\n55375,872\n55377,1127\n55379,30\n55380,805\n55381,44\n55382,219\n55383,393\n55383,1388\n55383,1531\n55383,4455\n55384,1359\n55385,30\n55386,433\n55387,433\n55388,349\n55389,1381\n55390,406\n55391,1453\n55392,1556\n55393,861\n55394,22\n55395,602\n55396,994\n55397,1227\n55397,1229\n55398,3653\n55399,2867\n55399,22880\n55400,217\n55401,481\n55403,750\n55403,783\n55403,1319\n55404,30\n55405,861\n55406,187\n55407,72\n55409,818\n55410,151\n55412,222\n55413,1844\n55414,622\n55414,55415\n55416,557\n55416,636\n55416,943\n55416,1332\n55416,1572\n55416,1844\n55416,7757\n55417,312\n55418,644\n55419,298\n55420,485\n55421,30\n55422,9560\n55425,346\n55426,406\n55427,1644\n55427,6661\n55428,3413\n55429,187\n55430,55431\n55432,289\n55432,290\n55433,30\n55434,55435\n55436,55435\n55438,30\n55439,30\n55440,106\n55440,1370\n55440,168463\n55441,30\n55442,55443\n55444,55445\n55446,338\n55447,389\n55448,7124\n55449,26\n55449,59\n55449,1238\n55449,2367\n55449,4039\n55450,83\n55451,563\n55452,192\n55452,333\n55453,72\n55454,6249\n55455,1238\n55456,602\n55457,55458\n55459,72\n55460,72\n55461,4101\n55462,83\n55463,211\n55464,20359\n55465,83\n55466,55467\n55468,55469\n55471,640\n55471,7270\n55472,21944\n55473,1181\n55474,360\n55475,147\n55476,55477\n55478,55479\n55480,55481\n55482,55483\n55484,668\n55484,852\n55484,2146\n55484,6323\n55484,55485\n55484,106954\n55484,119786\n55484,127995\n55484,129037\n55484,130134\n55484,132431\n55484,133713\n55484,135487\n55484,139353\n55484,141566\n55484,144402\n55484,147200\n55484,151866\n55484,160719\n55486,2367\n55487,349\n55488,1247\n55489,146\n55490,693\n55491,7416\n55492,55493\n55494,30\n55495,30\n55496,30\n55498,30\n55499,55500\n55501,72\n55502,195\n55503,1977\n55503,1978\n55504,55505\n55506,349\n55507,18831\n55508,932\n55509,294\n55512,1033\n55513,55514\n55515,1368\n55516,372\n55517,55518\n55519,72\n55520,72\n55521,861\n55523,392\n55524,72\n55525,30\n55526,1070\n55527,479\n55528,366\n55529,366\n55530,366\n55531,137\n55532,55533\n55534,81\n55535,515\n55536,55537\n55539,18726\n55540,72\n55541,163\n55542,349\n55542,392\n55543,634\n55544,355\n55545,55546\n55547,55546\n55548,1010\n55548,1677\n55549,713\n55550,298\n55551,485\n55552,873\n55552,1210\n55552,236180\n55553,298\n55554,485\n55555,3451\n55555,3452\n55556,392\n55557,1175\n55557,4411\n55558,1858\n55559,1860\n55560,163\n55561,18831\n55562,13538\n55563,30\n55565,1559\n55567,58\n55567,261\n55567,312\n55567,1140\n55567,1544\n55567,2480\n55567,3182\n55567,3207\n55567,19443\n55569,1858\n55570,306\n55570,307\n55571,1860\n55572,18726\n55573,602\n55574,563\n55575,563\n55576,563\n55577,340\n55578,163\n55579,3\n55580,1612\n55581,252\n55581,516\n55581,1220\n55581,1222\n55583,120\n55583,1235\n55583,1462\n55584,55585\n55585,149\n55585,336\n55585,1425\n55585,1603\n55585,1776\n55585,1803\n55585,1877\n55585,21442\n55585,26450\n55585,118336\n55586,2979\n55587,602\n55588,1058\n55589,2775\n55590,447\n55591,5405\n55592,626\n55593,1381\n55594,1623\n55596,215\n55598,68\n55598,372\n55598,805\n55598,1068\n55598,1359\n55598,4220\n55598,230515\n55599,1132\n55600,781\n55601,269\n55602,79\n55603,104\n55603,439\n55603,509\n55604,313\n55605,15523\n55606,55607\n55608,222\n55609,83\n55610,3209\n55611,1293\n55611,1556\n55613,1132\n55614,781\n55615,433\n55616,298\n55617,485\n55618,37\n55618,3999\n55619,1858\n55620,1860\n55621,1132\n55622,781\n55623,336\n55624,920\n55625,330\n55626,1124\n55627,55628\n55629,697\n55630,1711\n55630,1836\n55631,422\n55632,422\n55633,422\n55634,422\n55635,422\n55636,673\n55637,422\n55638,192\n55638,195\n55639,1326\n55640,422\n55641,3555\n55642,298\n55643,485\n55644,1052\n55645,1132\n55646,781\n55647,422\n55648,163\n55649,344\n55649,1844\n55649,2073\n55649,13538\n55650,422\n55651,3\n55651,233\n55651,518\n55651,775\n55651,795\n55651,1326\n55651,1411\n55651,1715\n55651,3094\n55651,3804\n55651,4146\n55651,5130\n55652,298\n55653,485\n55654,55655\n55654,108904\n55654,131480\n55659,1608\n55660,770\n55661,818\n55662,30\n55663,251\n55663,516\n55664,1805\n55665,217\n55665,455\n55665,1417\n55666,611\n55667,500\n55668,467\n55668,536\n55668,538\n55668,1881\n55668,2867\n55668,2868\n55668,22880\n55668,156379\n55669,30\n55670,1265\n55670,1266\n55671,932\n55672,120\n55673,3069\n55674,1634\n55675,581\n55676,118\n55676,4597\n55677,283\n55677,425\n55677,1276\n55678,592\n55679,79\n55680,30\n55681,261\n55681,1353\n55682,602\n55683,301\n55683,189303\n55684,1849\n55685,135\n55686,120\n55686,217\n55686,809\n55686,1411\n55686,2750\n55686,3804\n55686,15609\n55687,1132\n55688,781\n55689,1803\n55690,714\n55691,500\n55692,493\n55692,586\n55693,450\n55694,493\n55696,392\n55697,1132\n55698,781\n55699,611\n55700,2979\n55701,41\n55702,1140\n55702,3474\n55703,1544\n55703,3207\n55704,151\n55704,202\n55704,841\n55704,1425\n55704,1474\n55704,30331\n55705,602\n55706,2979\n55708,3804\n55709,500\n55710,1132\n55711,781\n55712,1096\n55712,2704\n55714,1381\n55715,852\n55715,3003\n55717,55718\n55719,1132\n55720,781\n55721,676\n55722,254\n55722,557\n55722,1939\n55723,252\n55724,55725\n55724,191777\n55726,2979\n55727,34\n55727,35\n55727,872\n55728,30\n55730,1132\n55731,781\n55732,79\n55733,222\n55733,657\n55733,760\n55733,1368\n55734,422\n55736,602\n55737,147\n55738,515\n55739,50\n55740,30\n55742,81\n55744,269\n55745,788\n55746,919\n55747,1167\n55747,2979\n55748,644\n55749,1132\n55750,781\n55752,1132\n55753,781\n55754,83\n55755,1983\n55756,392\n55757,217\n55758,1707\n55759,158\n55760,290\n55760,714\n55760,1511\n55760,2206\n55760,33424\n55760,94134\n55760,245910\n55761,83\n55762,1052\n55762,1368\n55763,838\n55764,68\n55764,818\n55765,8854\n55766,2312\n55767,30\n55768,1132\n55769,781\n55770,676\n55771,55772\n55773,536\n55774,119\n55774,577\n55774,1400\n55774,1927\n55775,1370\n55777,1132\n55778,781\n55780,818\n55781,1132\n55782,781\n55783,1983\n55784,1181\n55785,1267\n55786,187\n55787,1085\n55787,1210\n55787,3182\n55788,302\n55790,147\n55791,626\n55793,1151\n55794,222\n55794,657\n55795,5547\n55796,217\n55796,467\n55797,1132\n55798,781\n55799,137\n55800,106\n55801,784\n55802,298\n55803,485\n55804,875\n55805,83\n55805,126\n55805,872\n55805,957\n55805,6424\n55808,134\n55808,8714\n55809,267\n55810,422\n55811,56\n55812,68\n55813,233\n55813,332\n55813,3135\n55814,1962\n55815,83\n55817,3413\n55818,2719\n55819,3370\n55819,14453\n55820,1\n55821,1462\n55821,8537\n55822,393\n55823,151\n55824,1454\n55825,187\n55826,136\n55827,305\n55827,1188\n55827,2253\n55827,4101\n55827,13538\n55827,142426\n55828,1127\n55828,1566\n55829,302\n55829,2116\n55830,1132\n55831,781\n55832,58\n55832,403\n55832,586\n55832,693\n55832,1118\n55832,5250\n55832,113878\n55833,68\n55834,5310\n55835,422\n55836,56\n55837,1381\n55838,55839\n55838,71153\n55838,125613\n55840,83\n55840,217\n55840,278\n55840,536\n55840,577\n55840,1429\n55840,1608\n55840,13575\n55841,718\n55842,55843\n55844,422\n55845,56\n55846,392\n55847,55848\n55847,76169\n55849,147\n55849,158\n55849,406\n55849,8055\n55849,55849\n55849,102560\n55849,220502\n55850,6556\n55851,3413\n55852,422\n55853,56\n55854,1419\n55855,50\n55855,389\n55856,58\n55857,46\n55858,392\n55858,1014\n55860,1132\n55861,781\n55862,811\n55863,1659\n55864,68\n55865,483\n55866,3069\n55867,63\n55867,422\n55868,1715\n55869,39247\n55870,217\n55871,278\n55872,16687\n55873,1309\n55874,392\n55875,1402\n55876,349\n55877,5469\n55878,2083\n55879,1531\n55880,1323\n55881,102\n55882,1326\n55883,408\n55884,631\n55884,1085\n55884,1785\n55884,3115\n55885,717\n55886,493\n55886,682\n55886,72439\n55887,217\n55887,222\n55887,379\n55887,1019\n55887,1417\n55887,5343\n55889,2048\n55890,55891\n55892,217\n55893,83\n55894,278\n55895,1201\n55896,290\n55896,859\n55897,1046\n55898,3630\n55899,309\n55899,310\n55900,79\n55901,577\n55902,1556\n55903,301\n55905,135\n55905,596\n55905,784\n55905,1052\n55905,1368\n55906,406\n55907,83\n55908,18726\n55909,536\n55910,536\n55911,200\n55912,272\n55913,55914\n55915,163\n55916,4\n55916,5\n55917,663\n55917,818\n55917,1370\n55917,1821\n55919,1132\n55920,392\n55921,781\n55922,72\n55923,932\n55924,120\n55924,861\n55924,162599\n55925,55926\n55928,171\n55929,328\n55929,7124\n55930,801\n55930,1140\n55931,233\n55931,240\n55932,1411\n55933,920\n55934,7124\n55935,140\n55935,697\n55935,5540\n55936,34\n55936,35\n55936,217\n55936,536\n55937,1711\n55937,1836\n55938,417\n55939,202\n55939,203\n55940,602\n55941,23701\n55942,2574\n55943,151\n55944,2867\n55944,22880\n55945,2045\n55946,379\n55947,356\n55948,301\n55948,615\n55948,968\n55949,1782\n55950,3\n55951,1962\n55952,515\n55954,7124\n55955,309\n55955,310\n55955,483\n55956,6556\n55957,718\n55958,439\n55959,1181\n55960,640\n55961,1893\n55962,2045\n55963,438\n55963,811\n55963,1247\n55963,3148\n55963,5213\n55965,9005\n55966,233\n55966,240\n55967,875\n55968,805\n55969,1132\n55970,781\n55971,349\n55972,206\n55973,17588\n55974,406\n55974,55849\n55975,247\n55976,676\n55978,83\n55979,130\n55980,1181\n55981,240\n55982,184\n55984,222\n55984,1618\n55985,602\n55986,1188\n55988,602\n55989,107\n55990,79\n55990,217\n55990,435\n55991,55992\n55993,376\n55994,55995\n55995,72912\n55995,92762\n55995,93739\n55995,100540\n55995,105027\n55995,120350\n55995,150246\n55995,174586\n55996,602\n55997,79\n55998,55999\n56000,56001\n56002,1893\n56002,4294\n56003,3724\n56004,1132\n56005,781\n56006,147\n56006,158\n56006,1803\n56006,89035\n56008,447\n56008,538\n56008,934\n56008,3804\n56009,20359\n56010,3695\n56011,56012\n56013,10\n56013,1623\n56014,1983\n56015,269\n56016,56017\n56018,784\n56019,422\n56020,56\n56021,56022\n56023,86\n56024,207\n56025,83\n56027,862\n56028,392\n56029,254\n56029,557\n56030,294\n56031,56032\n56033,6303\n56035,557\n56036,56037\n56036,68069\n56036,73803\n56036,78094\n56039,372\n56039,907\n56039,968\n56039,1544\n56039,1837\n56039,1955\n56040,379\n56040,536\n56040,1618\n56041,611\n56042,1287\n56043,56044\n56045,9029\n56047,222\n56048,557\n56049,557\n56050,1556\n56051,50\n56052,1983\n56053,72\n56054,30\n56055,56056\n56057,56058\n56059,20\n56060,207\n56061,1858\n56062,1860\n56063,56064\n56065,202\n56065,203\n56066,17557\n56067,44\n56068,56069\n56068,112122\n56070,868\n56071,30\n56071,7124\n56072,158\n56073,83\n56074,30\n56075,5547\n56076,875\n56078,298\n56079,485\n56080,366\n56081,1803\n56082,184\n56084,56085\n56086,56087\n56088,30\n56089,481\n56089,911\n56089,1449\n56090,5976\n56091,918\n56092,1058\n56093,602\n56094,602\n56095,1454\n56097,30\n56098,366\n56099,72\n56100,14996\n56101,56102\n56103,56102\n56103,132469\n56104,1983\n56105,5976\n56107,15\n56108,65\n56111,1983\n56113,1983\n56114,56115\n56116,9560\n56117,206\n56118,146\n56119,1623\n56120,273\n56120,274\n56120,422\n56121,1858\n56122,1860\n56123,79\n56124,1773\n56125,56126\n56127,56126\n56129,3\n56129,5874\n56130,50887\n56131,392\n56132,442\n56133,30\n56134,72\n56135,56136\n56137,17334\n56138,980\n56139,30\n56140,1612\n56141,779\n56142,515\n56143,163\n56144,72\n56145,392\n56145,809\n56146,23010\n56147,72\n56148,3148\n56150,259\n56150,272\n56150,393\n56150,577\n56150,599\n56150,726\n56150,788\n56150,859\n56150,980\n56150,1105\n56150,1381\n56150,1388\n56150,1531\n56150,1973\n56150,2178\n56150,4455\n56150,4545\n56150,23487\n56150,35486\n56150,56150\n56150,118436\n56150,118438\n56150,139010\n56150,142952\n56150,153787\n56151,56152\n56153,56154\n56155,2436\n56156,30\n56157,56158\n56159,178\n56159,859\n56159,3209\n56160,83\n56161,4\n56161,5\n56162,30\n56163,56164\n56165,1224\n56166,422\n56167,175\n56169,442\n56170,1363\n56171,30\n56172,4453\n56173,422\n56174,56\n56175,56176\n56177,30\n56178,137\n56179,106\n56180,5440\n56181,211\n56182,304\n56183,56184\n56185,30\n56186,588\n56186,590\n56186,1419\n56187,1571\n56188,1977\n56188,1978\n56189,422\n56190,30\n56191,1773\n56192,30\n56193,56194\n56195,255\n56196,56197\n56198,1238\n56199,349\n56200,233\n56201,302\n56202,704\n56203,2244\n56204,931\n56205,515\n56207,379\n56208,346\n56209,586\n56210,1983\n56211,240\n56212,841\n56213,355\n56214,668\n56216,1274\n56218,163\n56219,56220\n56221,1452\n56222,58\n56223,46\n56224,1429\n56224,3467\n56224,3507\n56225,493\n56225,788\n56225,1927\n56226,50\n56226,158\n56226,285\n56226,307\n56226,4192\n56226,4193\n56227,1132\n56228,781\n56229,2867\n56229,22880\n56230,479\n56231,393\n56231,726\n56232,306\n56232,307\n56233,298\n56234,485\n56235,2506\n56236,298\n56237,485\n56238,3085\n56239,9195\n56241,640\n56243,298\n56244,485\n56245,668\n56248,298\n56249,485\n56250,240\n56251,918\n56252,366\n56253,366\n56254,248\n56255,366\n56256,623\n56256,1805\n56256,4760\n56257,602\n56258,2506\n56259,56\n56259,147\n56260,1983\n56265,1082\n56266,1881\n56267,536\n56268,1983\n56269,30\n56271,1634\n56272,323\n56273,298\n56274,79\n56274,273\n56274,274\n56274,21944\n56275,6750\n56276,1082\n56277,83\n56278,1983\n56280,137\n56282,1082\n56285,704\n56286,1127\n56287,1983\n56289,18726\n56290,640\n56291,640\n56292,640\n56293,163\n56294,397\n56294,142430\n56294,142879\n56295,130\n56296,56297\n56298,106\n56299,72\n56300,422\n56301,422\n56302,422\n56304,422\n56305,422\n56306,422\n56307,422\n56308,422\n56309,7124\n56311,79\n56312,269\n56313,1983\n56314,301\n56315,22\n56315,861\n56316,577\n56317,697\n56320,760\n56320,1149\n56322,1241\n56324,37\n56325,217\n56327,30\n56328,1368\n56329,581\n56330,932\n56331,1983\n56332,13661\n56333,1381\n56334,467\n56334,868\n56334,162599\n56335,442\n56336,536\n56336,1274\n56337,392\n56338,1531\n56339,30\n56340,1132\n56341,781\n56342,18726\n56343,328\n56343,7124\n56345,349\n56345,697\n56345,3260\n56347,163\n56348,3949\n56349,160\n56349,259\n56349,994\n56349,19010\n56350,44725\n56352,893\n56354,1556\n56355,2048\n56356,72\n56358,107\n56358,4823\n56359,422\n56360,56\n56361,1983\n56362,1871\n56363,86\n56364,66\n56365,433\n56365,467\n56365,872\n56365,1010\n56365,1298\n56366,356\n56367,1132\n56368,781\n56369,202\n56369,203\n56369,21944\n56371,673\n56371,1130\n56372,1058\n56374,68\n56374,4220\n56376,7124\n56378,2424\n56379,481\n56380,222\n56381,188\n56382,182\n56386,333\n56387,192\n56388,500\n56389,1962\n56390,1052\n56391,1882\n56392,1893\n56393,2775\n56394,54\n56396,211\n56396,366\n56396,500\n56397,287\n56397,22293\n56398,1711\n56399,1789\n56400,527\n56400,88450\n56400,95152\n56400,140778\n56400,192861\n56400,207038\n56400,264504\n56401,305\n56401,1082\n56401,1807\n56402,298\n56403,485\n56404,911\n56404,972\n56405,2915\n56406,50\n56406,1631\n56407,1298\n56409,97\n56409,217\n56411,248\n56412,99\n56412,356\n56412,1140\n56412,1888\n56413,1531\n56414,694\n56416,15573\n56417,1977\n56417,1978\n56418,1893\n56419,83\n56420,298\n56421,485\n56422,292\n56422,673\n56423,577\n56424,577\n56425,1179\n56426,1381\n56426,1639\n56428,264\n56428,56429\n56428,57827\n56428,76717\n56428,99019\n56428,104864\n56428,104887\n56428,108283\n56428,109794\n56428,123504\n56428,204383\n56430,752\n56430,2353\n56430,124668\n56431,515\n56431,1052\n56431,1267\n56431,1579\n56431,1893\n56431,2312\n56431,3695\n56432,30331\n56433,5405\n56434,151\n56436,3413\n56437,1983\n56439,779\n56440,861\n56441,2775\n56443,447\n56444,949\n56444,2421\n56445,1284\n56446,5547\n56447,5405\n56448,605\n56449,1688\n56450,309\n56450,310\n56450,5718\n56451,2266\n56452,2351\n56453,644\n56454,134\n56456,518\n56458,2424\n56459,56460\n56462,3695\n56464,1805\n56465,240\n56466,217\n56467,1653\n56468,581\n56471,676\n56473,397\n56475,859\n56476,503\n56476,704\n56477,2744\n56479,30236\n56480,718\n56481,809\n56482,56483\n56486,118\n56486,4597\n56487,4453\n56488,19443\n56489,140\n56489,389\n56489,671\n56489,1167\n56490,1980\n56490,8991\n56491,34\n56491,35\n56492,664\n56492,20359\n56493,6068\n56494,2995\n56495,8992\n56497,1381\n56497,56498\n56499,72\n56500,442\n56501,779\n56503,298\n56504,406\n56505,50\n56506,366\n56507,72\n56508,2828\n56509,516\n56510,1983\n56511,56512\n56513,184\n56514,346\n56515,247\n56516,258\n56517,1181\n56518,2266\n56519,1515\n56521,1127\n56522,422\n56523,56\n56524,346\n56525,278\n56526,187\n56527,206\n56528,1983\n56530,1983\n56532,1323\n56534,102\n56535,1326\n56536,408\n56537,134\n56537,873\n56537,1082\n56537,1955\n56538,875\n56539,809\n56539,2292\n56542,388\n56543,920\n56544,577\n56545,392\n56546,56547\n56548,1319\n56549,1267\n56550,72\n56551,442\n56552,292\n56552,483\n56553,442\n56556,447\n56557,779\n56557,1515\n56557,68069\n56558,202\n56558,203\n56559,2775\n56560,447\n56561,2775\n56562,447\n56563,56564\n56565,356\n56566,3413\n56567,146\n56567,673\n56567,685\n56567,827\n56567,1634\n56567,2460\n56567,21442\n56567,92476\n56568,2372\n56569,744\n56570,312\n56570,1167\n56571,611\n56572,1983\n56573,255\n56574,8788\n56575,1849\n56576,1531\n56578,875\n56579,30\n56580,615\n56581,255\n56582,832\n56583,332\n56583,3135\n56584,34\n56584,35\n56584,389\n56584,536\n56584,891\n56584,1019\n56584,1052\n56584,1531\n56584,7768\n56584,28130\n56585,1082\n56587,356\n56588,493\n56590,1608\n56591,72\n56592,344\n56593,285\n56594,1782\n56595,783\n56596,296\n56596,9030\n56597,1544\n56598,415\n56599,255\n56600,34\n56600,35\n56600,222\n56600,2266\n56601,1392\n56602,1181\n56602,1590\n56603,83\n56604,872\n56605,178\n56606,536\n56607,2671\n56608,872\n56609,287\n56609,809\n56610,1007\n56611,247\n56612,1014\n56612,1796\n56613,442\n56614,392\n56615,1149\n56617,248\n56618,1085\n56619,10\n56620,483\n56621,442\n56622,158\n56623,48\n56624,140\n56625,1639\n56626,875\n56627,1983\n56628,30\n56629,41\n56629,1012\n56629,1177\n56630,602\n56631,83\n56632,697\n56632,5469\n56633,868\n56634,151\n56635,602\n56637,1033\n56638,602\n56639,5101\n56639,5102\n56640,1363\n56640,1454\n56641,1082\n56642,30\n56643,366\n56644,304\n56644,775\n56644,1140\n56644,3474\n56644,4411\n56645,1608\n56646,932\n56646,1298\n56647,392\n56649,310\n56650,356\n56650,631\n56650,1119\n56651,1659\n56652,346\n56653,631\n56654,640\n56655,147\n56655,158\n56656,516\n56657,56658\n56659,557\n56660,1983\n56661,275\n56662,56663\n56664,4355\n56665,1844\n56666,346\n56667,261\n56667,333\n56668,467\n56668,518\n56668,50176\n56668,52232\n56669,1227\n56669,1229\n56669,86416\n56670,1082\n56671,455\n56672,1479\n56673,536\n56675,247\n56677,292\n56679,389\n56679,1072\n56680,184\n56682,18726\n56683,255\n56684,1313\n56685,388\n56686,163\n56687,1983\n56688,376\n56689,4903\n56690,376\n56691,885\n56692,515\n56692,647\n56692,801\n56692,835\n56692,1893\n56692,2626\n56692,5440\n56694,704\n56695,56696\n56697,563\n56698,1188\n56699,56700\n56701,56700\n56702,56700\n56703,949\n56704,1235\n56704,1335\n56705,83\n56706,349\n56707,271\n56708,30\n56709,1962\n56710,68\n56710,2590\n56710,66297\n56711,2590\n56713,65\n56714,304\n56715,1001\n56716,56717\n56718,225\n56719,72\n56720,344\n56721,285\n56722,949\n56723,1402\n56724,36442\n56725,1983\n56726,3138\n56727,918\n56728,557\n56729,72\n56730,344\n56731,285\n56732,640\n56733,56734\n56735,261\n56735,333\n56737,818\n56738,1235\n56738,1335\n56739,557\n56740,557\n56741,178\n56742,3111\n56743,4549\n56744,442\n56745,302\n56746,1082\n56747,56748\n56749,56750\n56751,58\n56751,86\n56751,167\n56751,240\n56751,301\n56751,372\n56751,444\n56751,567\n56751,589\n56751,605\n56751,615\n56751,631\n56751,720\n56751,801\n56751,843\n56751,907\n56751,968\n56751,972\n56751,973\n56751,1010\n56751,1122\n56751,1124\n56751,1140\n56751,1167\n56751,1231\n56751,1241\n56751,1284\n56751,1298\n56751,1309\n56751,1436\n56751,1522\n56751,1544\n56751,1564\n56751,1782\n56751,1785\n56751,1818\n56751,1837\n56751,1893\n56751,1955\n56751,2083\n56751,2191\n56751,2372\n56751,2557\n56751,2620\n56751,2979\n56751,3193\n56751,3194\n56751,3207\n56751,3218\n56752,1132\n56753,781\n56754,83\n56755,225\n56756,147\n56756,1247\n56757,255\n56758,10\n56759,17772\n56760,1235\n56760,1335\n56760,1462\n56761,1247\n56761,1644\n56761,1844\n56762,250\n56762,1684\n56763,44\n56764,83\n56765,72\n56766,344\n56767,285\n56769,1644\n56770,3370\n56770,14453\n56771,1363\n56772,4611\n56773,3247\n56773,7358\n56773,7363\n56774,3999\n56775,852\n56776,72\n56777,72\n56778,704\n56779,72\n56780,1285\n56781,269\n56782,592\n56783,72\n56784,372\n56785,72\n56786,3069\n56787,65\n56788,83\n56788,389\n56788,455\n56788,805\n56788,1718\n56788,1756\n56788,2779\n56788,2784\n56788,28130\n56789,1608\n56790,4903\n56791,217\n56791,920\n56792,56793\n56795,56796\n56797,5101\n56797,6627\n56798,4594\n56799,34\n56799,35\n56799,379\n56799,2784\n56800,1983\n56801,202\n56801,203\n56801,346\n56801,1531\n56802,30\n56803,861\n56804,65\n56805,56806\n56805,57835\n56807,733\n56808,2506\n56810,30\n56811,10\n56812,515\n56813,1058\n56814,77\n56815,30\n56816,794\n56816,17346\n56817,422\n56818,422\n56819,422\n56820,422\n56821,422\n56822,422\n56823,422\n56824,422\n56826,107\n56827,56828\n56829,207\n56830,366\n56831,366\n56832,980\n56833,81\n56834,56835\n56836,56837\n56838,10\n56839,30\n56840,175\n56841,72\n56842,54064\n56843,1980\n56843,8991\n56844,215\n56845,56846\n56847,330\n56848,206\n56849,4810\n56850,972\n56852,274\n56852,1210\n56852,1980\n56853,393\n56855,56856\n56857,146\n56858,56859\n56860,30\n56861,56862\n56863,602\n56864,255\n56865,726\n56866,240\n56867,452\n56868,919\n56869,167\n56871,5906\n56872,233\n56873,56874\n56875,991\n56876,900\n56877,264\n56878,56879\n56880,1267\n56881,515\n56883,372\n56884,56884\n56885,586\n56886,56887\n56888,15\n56889,355\n56890,1559\n56891,56892\n56891,57521\n56891,57700\n56893,1085\n56893,75912\n56894,56895\n56894,63842\n56894,69400\n56894,70001\n56897,663\n56897,664\n56898,1370\n56898,1821\n56899,240\n56900,1085\n56900,75912\n56901,644\n56902,1707\n56903,852\n56903,19443\n56904,1353\n56905,17334\n56906,1844\n56907,1238\n56908,1267\n56910,788\n56911,433\n56911,918\n56912,663\n56912,664\n56913,2574\n56914,406\n56914,779\n56915,56916\n56917,1085\n56918,1796\n56919,2506\n56920,2506\n56921,852\n56921,48505\n56922,1983\n56924,392\n56925,640\n56926,640\n56927,1132\n56928,781\n56929,192\n56932,56933\n56934,726\n56936,1096\n56937,1639\n56938,202\n56938,203\n56938,493\n56939,34\n56939,158\n56940,269\n56941,4252\n56942,83\n56943,21944\n56944,859\n56945,1133\n56947,1082\n56947,1544\n56949,2590\n56950,10\n56951,56952\n56954,1858\n56955,1860\n56956,430\n56957,17228\n56959,4980\n56960,2929\n56961,187\n56962,2373\n56963,431\n56964,3653\n56965,525\n56965,1188\n56966,1085\n56968,134\n56969,1102\n56970,1326\n56973,417\n56974,8149\n56975,202\n56975,203\n56976,1118\n56977,676\n56979,1309\n56980,640\n56981,581\n56982,1240\n56983,1118\n56984,1001\n56985,493\n56987,202\n56987,203\n56988,211\n56989,261\n56991,500\n56992,252\n56992,41170\n56993,515\n56993,1127\n56994,647\n56995,356\n56996,56997\n56999,602\n57000,920\n57001,671\n57001,1096\n57001,2915\n57002,333\n57002,557\n57002,636\n57002,663\n57002,664\n57002,14483\n57003,505\n57004,1266\n57004,2931\n57005,2367\n57006,685\n57006,5591\n57006,6068\n57008,439\n57008,15573\n57009,852\n57010,1085\n57011,1983\n57012,1531\n57013,640\n57015,94\n57015,2787\n57016,4101\n57017,676\n57018,2411\n57019,1983\n57020,1983\n57022,21944\n57023,389\n57024,718\n57025,30\n57025,267\n57025,278\n57025,328\n57025,440\n57025,622\n57025,3247\n57026,406\n57027,2048\n57028,3999\n57029,217\n57030,158\n57031,2371\n57032,682\n57033,1454\n57034,14556\n57035,718\n57036,567\n57036,1284\n57036,2557\n57037,56\n57038,1140\n57038,5547\n57039,273\n57039,274\n57040,435\n57042,417\n57044,30\n57045,57046\n57047,289\n57047,290\n57049,626\n57050,2274\n57051,195\n57052,929\n57053,3069\n57054,47\n57054,417\n57054,1564\n57054,2469\n57055,1132\n57056,781\n57057,217\n57059,1474\n57060,602\n57061,1370\n57062,57063\n57062,70566\n57062,250349\n57064,1313\n57065,500\n57065,718\n57066,1167\n57067,1132\n57068,781\n57069,298\n57070,346\n57073,1326\n57074,111\n57076,4193\n57076,8822\n57078,217\n57079,83\n57081,586\n57081,1175\n57088,973\n57090,1977\n57090,1978\n57092,392\n57094,285\n57094,2779\n57094,2784\n57095,43203\n57096,87\n57096,1151\n57105,222\n57107,920\n57116,1181\n57117,631\n57118,57119\n57120,171\n57122,1590\n57124,346\n57125,459\n57125,852\n57125,1160\n57127,3422\n57128,58\n57129,46\n57130,57131\n57132,457\n57133,147\n57133,158\n57133,406\n57134,273\n57134,274\n57135,515\n57136,130\n57136,1564\n57137,2116\n57138,2116\n57140,2116\n57141,8992\n57142,2116\n57143,30\n57143,259\n57143,328\n57143,440\n57143,577\n57143,596\n57143,788\n57143,794\n57143,859\n57143,1070\n57143,1105\n57143,1179\n57143,1368\n57143,2253\n57143,4455\n57143,138686\n57144,304\n57144,356\n57144,852\n57144,2436\n57144,48505\n57146,57145\n57147,209\n57148,1962\n57149,5213\n57150,3138\n57151,360\n57151,392\n57151,500\n57152,2506\n57153,2506\n57154,158\n57155,2506\n57156,1132\n57157,781\n57159,868\n57160,3474\n57161,3328\n57161,4771\n57162,2266\n57163,1556\n57164,973\n57165,500\n57166,5405\n57168,919\n57169,1531\n57170,8855\n57171,5405\n57172,626\n57173,81\n57174,1282\n57175,1140\n57176,57177\n57178,10\n57178,113156\n57179,2116\n57181,980\n57182,66\n57182,83\n57182,301\n57182,314\n57182,467\n57182,868\n57182,1122\n57182,1241\n57182,1782\n57182,1844\n57182,2191\n57182,31206\n57184,1326\n57185,247\n57185,2867\n57185,22880\n57186,360\n57187,217\n57187,222\n57187,536\n57187,18831\n57189,1566\n57190,298\n57191,917\n57192,852\n57193,72\n57193,285\n57194,209\n57194,1631\n57195,21944\n57196,1179\n57197,3422\n57198,2506\n57200,57201\n57202,57203\n57204,743\n57205,186\n57205,877\n57205,968\n57205,1284\n57205,1955\n57205,2572\n57205,3756\n57206,3\n57206,1608\n57207,467\n57208,312\n57208,1240\n57208,1454\n57208,2372\n57208,5591\n57208,15523\n57210,1238\n57212,2506\n57213,2506\n57214,57215\n57216,3\n57217,717\n57218,86\n57219,422\n57220,56\n57221,1010\n57222,685\n57223,875\n57224,30\n57225,255\n57227,2506\n57228,206\n57229,344\n57229,1711\n57229,1836\n57231,875\n57232,37\n57232,1231\n57232,1782\n57232,5662\n57233,151\n57234,483\n57236,1274\n57237,1639\n57238,1579\n57239,9018\n57240,83\n57241,1818\n57242,1983\n57243,259\n57243,272\n57244,392\n57245,57246\n57247,644\n57248,1983\n57249,217\n57249,435\n57249,536\n57249,1284\n57250,483\n57250,6556\n57251,57252\n57253,1227\n57253,1229\n57253,86416\n57254,9323\n57255,57256\n57257,272\n57258,392\n57259,202\n57259,203\n57259,925\n57260,255\n57261,818\n57262,1983\n57263,255\n57264,57265\n57264,68069\n57264,83910\n57266,313\n57267,8598\n57268,17384\n57269,269\n57270,306\n57270,307\n57271,250\n57271,1684\n57272,3069\n57273,704\n57273,1265\n57273,1266\n57274,83\n57275,302\n57276,973\n57277,255\n57278,473\n57278,8149\n57279,406\n57280,225\n57281,151\n57282,72\n57283,1556\n57284,861\n57285,22\n57286,8270\n57287,30\n57288,79\n57289,57290\n57291,376\n57292,19413\n57293,328\n57293,7124\n57294,406\n57295,422\n57296,56\n57297,406\n57298,809\n57299,392\n57300,57301\n57302,57303\n57304,57305\n57306,30\n57307,57308\n57309,83\n57310,255\n57311,187\n57312,83\n57313,1983\n57314,30\n57315,30\n57316,1167\n57317,15\n57317,2260\n57318,55849\n57319,57320\n57321,30\n57322,9021\n57323,1769\n57324,10\n57325,1289\n57326,640\n57327,406\n57328,57329\n57330,94\n57330,430\n57330,1235\n57330,1335\n57330,2787\n57331,6179\n57331,6180\n57332,57333\n57334,7194\n57335,83\n57335,3094\n57336,10\n57336,222\n57336,588\n57336,590\n57336,1419\n57337,254\n57338,657\n57339,22924\n57340,1326\n57341,83\n57342,57343\n57344,433\n57345,1368\n57346,433\n57347,779\n57348,1210\n57349,3182\n57350,1204\n57351,694\n57351,2775\n57352,5405\n57353,536\n57353,682\n57353,57354\n57354,1011\n57354,2159\n57354,4303\n57354,225774\n57355,83\n57356,338\n57357,557\n57358,8719\n57359,138\n57360,865\n57361,557\n57362,137\n57363,21944\n57364,118\n57364,4597\n57365,8719\n57366,138\n57367,865\n57368,557\n57369,137\n57370,21944\n57371,118\n57371,4597\n57372,364\n57373,57374\n57375,8719\n57376,138\n57377,865\n57378,557\n57379,2367\n57380,137\n57381,21944\n57382,118\n57382,4597\n57383,8719\n57384,138\n57385,865\n57386,557\n57387,137\n57388,21944\n57389,118\n57389,4597\n57390,557\n57391,557\n57392,57393\n57394,44\n57395,2506\n57396,2506\n57397,219\n57397,336\n57397,397\n57397,1130\n57397,30331\n57398,424\n57401,366\n57402,907\n57403,676\n57404,10\n57405,250\n57405,1684\n57406,1722\n57407,289\n57407,290\n57408,4548\n57409,149\n57410,356\n57410,14550\n57411,852\n57411,3630\n57413,1370\n57414,489\n57416,336\n57416,406\n57416,1181\n57418,247\n57418,252\n57418,925\n57418,1119\n57418,1179\n57418,1220\n57418,1222\n57418,41170\n57419,222\n57420,760\n57421,779\n57422,3960\n57423,7270\n57424,57425\n57426,57425\n57427,171\n57428,4903\n57429,1608\n57430,57431\n57432,57433\n57434,57435\n57436,57437\n57438,704\n57439,372\n57440,203\n57440,2931\n57441,81\n57442,3148\n57443,261\n57443,333\n57444,1707\n57445,2506\n57446,187\n57447,1381\n57448,8270\n57449,57450\n57451,957\n57451,1815\n57452,1980\n57452,8991\n57453,5375\n57455,406\n57456,3999\n57457,862\n57458,1016\n57459,57460\n57461,178\n57462,861\n57463,163\n57464,57465\n57466,57467\n57468,57469\n57470,3413\n57471,72\n57472,2506\n57473,2506\n57475,147\n57476,147\n57476,779\n57477,4453\n57478,298\n57478,852\n57478,862\n57478,8855\n57479,57480\n57481,72\n57482,301\n57482,372\n57483,57484\n57483,74681\n57483,98648\n57486,2989\n57486,2991\n57487,251\n57487,1512\n57487,5992\n57488,57489\n57490,255\n57491,8788\n57492,4066\n57493,57494\n57495,57496\n57497,83\n57498,850\n57499,57500\n57501,1323\n57501,3370\n57501,3872\n57502,83\n57505,225\n57508,8884\n57509,57510\n57509,64309\n57511,52345\n57511,87346\n57511,115001\n57511,122712\n57511,145672\n57511,147000\n57511,155592\n57511,156030\n57511,156153\n57511,213816\n57512,1085\n57513,7652\n57514,71\n57514,278\n57514,304\n57514,390\n57514,467\n57514,4220\n57514,6059\n57515,795\n57517,57518\n57519,57520\n57522,366\n57523,366\n57524,57525\n57526,34\n57526,35\n57526,1033\n57527,366\n57528,366\n57529,233\n57530,57531\n57532,57533\n57532,82389\n57532,85342\n57532,100033\n57534,57535\n57536,515\n57537,57538\n57539,178\n57540,355\n57542,57543\n57542,91752\n57544,973\n57545,211\n57545,7363\n57546,1556\n57547,861\n57548,22\n57549,424\n57550,30\n57551,83\n57552,57553\n57555,1556\n57556,861\n57557,22\n57558,417\n57559,1132\n57560,781\n57561,336\n57561,406\n57564,875\n57566,581\n57567,255\n57568,1085\n57569,4611\n57570,57571\n57572,932\n57573,1608\n57574,79\n57575,783\n57576,57577\n57578,1140\n57580,447\n57581,57582\n57583,818\n57583,1353\n57584,17334\n57585,1707\n57586,366\n57587,57588\n57589,298\n57590,485\n57591,647\n57592,1882\n57593,57594\n57595,14989\n57596,2116\n57597,83\n57598,1203\n57599,392\n57600,525\n57601,1962\n57602,240\n57603,72\n57604,134\n57605,875\n57607,592\n57607,1082\n57608,2296\n57610,4810\n57612,1033\n57613,1556\n57614,861\n57615,22\n57616,9560\n57617,1556\n57618,861\n57619,22\n57620,57621\n57622,6303\n57623,713\n57624,333\n57624,868\n57625,57626\n57627,57628\n57627,69836\n57629,424\n57630,8788\n57631,841\n57632,2506\n57633,440\n57634,233\n57634,1608\n57635,18726\n57637,718\n57638,2590\n57639,333\n57640,333\n57640,1893\n57641,1556\n57642,861\n57643,22\n57644,1227\n57644,1229\n57644,1252\n57644,1253\n57644,21944\n57644,86416\n57645,2574\n57646,50\n57647,163\n57648,56\n57649,21944\n57650,1556\n57651,861\n57652,22\n57653,481\n57655,818\n57655,907\n57656,349\n57657,207\n57658,50\n57659,5976\n57660,57660\n57661,57662\n57663,929\n57664,505\n57665,505\n57666,57667\n57668,15\n57669,72\n57670,344\n57671,285\n57672,57673\n57674,57673\n57675,483\n57676,5874\n57677,376\n57678,23701\n57680,1082\n57681,310\n57682,349\n57683,622\n57684,18726\n57685,704\n57686,163\n57688,24332\n57690,57691\n57692,1893\n57694,2048\n57695,72\n57696,24505\n57698,2105\n57699,289\n57699,290\n57701,34\n57701,1776\n57701,4193\n57703,2506\n57704,2506\n57705,2506\n57706,493\n57707,57708\n57709,2351\n57710,3079\n57711,104\n57712,515\n57713,30\n57714,104\n57715,57716\n57717,417\n57718,21944\n57719,5440\n57720,211\n57721,875\n57722,1511\n57722,3069\n57723,151\n57724,920\n57725,57726\n57727,57728\n57729,30\n57730,57731\n57730,65483\n57734,676\n57735,57736\n57737,10\n57738,57739\n57738,102964\n57741,8270\n57742,2048\n57744,2574\n57744,17309\n57745,57746\n57747,187\n57748,233\n57749,3413\n57750,366\n57751,366\n57752,515\n57753,147\n57753,158\n57754,366\n57755,366\n57756,366\n57757,634\n57758,392\n57759,107\n57760,2416\n57760,2417\n57761,292\n57762,338\n57763,298\n57764,1133\n57765,3538\n57766,57767\n57766,94029\n57768,355\n57769,4504\n57771,18726\n57773,163\n57773,2116\n57774,57775\n57776,57777\n57776,91605\n57778,2146\n57779,57780\n57781,309\n57781,310\n57782,1556\n57783,861\n57784,22\n57785,1014\n57786,859\n57788,22\n57788,287\n57789,1881\n57790,83\n57791,57792\n57793,7358\n57793,7363\n57794,18726\n57795,163\n57796,893\n57797,30\n57798,3695\n57799,932\n57802,535\n57802,760\n57803,581\n57805,57806\n57807,392\n57808,636\n57809,57810\n57809,132322\n57811,972\n57812,1844\n57813,57814\n57815,211\n57816,589\n57817,72\n57818,690\n57819,2506\n57820,640\n57822,4355\n57823,206\n57824,1353\n57826,195\n57828,72\n57829,57830\n57831,1058\n57832,349\n57836,57837\n57839,455\n57839,2944\n57839,6506\n57840,72\n57841,57842\n57841,71207\n57841,84966\n57841,88657\n57841,92192\n57841,92475\n57844,147\n57844,149\n57845,875\n57846,3999\n57847,676\n57848,483\n57850,872\n57851,278\n57851,615\n57851,660\n57851,781\n57851,1262\n57851,1274\n57851,1718\n57852,1983\n57853,57854\n57855,875\n57856,77\n57857,72\n57858,57859\n57860,72\n57861,577\n57862,57863\n57864,2506\n57865,1175\n57866,7360\n57867,57868\n57869,187\n57871,1363\n57872,107\n57872,805\n57873,1210\n57874,269\n57875,2775\n57876,1844\n57877,344\n57878,6051\n57879,3161\n57880,1247\n57881,57882\n57883,272\n57884,1285\n57885,5440\n57886,3161\n57887,17588\n57888,2367\n57889,1644\n57890,16207\n57891,676\n57892,1033\n57893,344\n57896,704\n57897,459\n57898,3413\n57899,171\n57900,1132\n57901,781\n57902,305\n57902,2206\n57902,3247\n57903,7124\n57904,640\n57905,57906\n57907,222\n57907,283\n57907,455\n57907,2266\n57908,30\n57909,4810\n57910,200\n57910,298\n57910,302\n57910,714\n57910,1119\n57910,1179\n57910,1659\n57910,1962\n57910,2156\n57910,2205\n57910,6303\n57910,33424\n57910,245910\n57911,72\n57912,192\n57913,3069\n57914,30766\n57915,1285\n57916,57917\n57919,252\n57920,2209\n57921,72\n57922,6682\n57923,4355\n57924,779\n57925,30\n57926,5101\n57927,72\n57928,273\n57928,274\n57928,142433\n57929,957\n57929,1247\n57929,1815\n57929,1893\n57930,30\n57931,57932\n57933,346\n57934,79\n57935,72\n57936,30\n57937,30\n57938,72\n57940,44\n57941,72\n57942,72\n57943,417\n57943,1235\n57944,620\n57945,206\n57946,1181\n57947,433\n57948,31977\n57949,557\n57950,5906\n57951,626\n57952,278\n57953,137\n57954,862\n57955,5906\n57956,557\n57957,433\n57958,626\n57959,278\n57960,137\n57961,862\n57962,557\n57963,557\n57964,862\n57965,779\n57965,1132\n57966,557\n57967,557\n57968,1983\n57969,827\n57970,211\n57970,7363\n57971,30\n57972,346\n57973,1881\n57974,657\n57975,22924\n57976,406\n57978,211\n57980,349\n57981,57981\n57982,57983\n57984,818\n57985,1285\n57986,349\n57987,310\n57988,704\n57989,5366\n57990,146\n57991,58\n57992,46\n57993,4411\n57994,57995\n57996,57997\n57998,57999\n58000,1776\n58000,4193\n58001,34\n58001,158\n58002,21487\n58002,22880\n58003,30\n58004,477\n58005,30\n58006,58007\n58006,76917\n58006,92629\n58006,149489\n58006,257273\n58006,259970\n58006,260043\n58008,147\n58008,149\n58009,422\n58010,422\n58011,422\n58012,422\n58013,422\n58014,422\n58015,422\n58016,4691\n58017,422\n58018,422\n58019,500\n58021,58022\n58023,875\n58024,875\n58025,697\n58026,1381\n58027,332\n58028,1181\n58029,477\n58030,477\n58031,58032\n58033,433\n58034,310\n58035,586\n58036,310\n58037,3161\n58038,1983\n58040,83\n58041,171\n58042,207\n58043,7\n58044,72\n58045,58046\n58047,704\n58048,536\n58048,4672\n58048,7698\n58049,72\n58050,2436\n58051,811\n58052,376\n58053,254\n58054,118\n58054,4597\n58055,72\n58056,195\n58057,58058\n58059,328\n58059,7124\n58060,30\n58061,356\n58062,1370\n58063,2048\n58064,3538\n58065,292\n58066,294\n58067,296\n58068,5547\n58069,298\n58070,58071\n58073,346\n58074,760\n58075,346\n58076,58077\n58078,704\n58079,4823\n58080,255\n58081,58082\n58083,203\n58083,2931\n58084,3960\n58085,233\n58086,58087\n58088,58087\n58089,30\n58090,1238\n58091,58092\n58091,102275\n58091,125788\n58091,126399\n58091,129518\n58093,104\n58093,137\n58094,515\n58095,1181\n58096,2116\n58097,1452\n58098,1541\n58099,918\n58100,1210\n58101,718\n58102,3148\n58103,634\n58104,477\n58105,30\n58106,8270\n58107,58108\n58109,137\n58110,30\n58111,919\n58112,355\n58113,647\n58114,344\n58115,255\n58115,9001\n58115,15636\n58115,28130\n58115,58116\n58117,310\n58117,805\n58118,207\n58119,58120\n58121,366\n58122,7117\n58123,1381\n58124,58125\n58126,2116\n58127,366\n58128,79\n58129,366\n58130,207\n58131,147\n58131,158\n58131,192\n58131,406\n58131,779\n58131,1181\n58131,1515\n58132,15\n58133,1707\n58134,1010\n58135,1616\n58136,415\n58137,704\n58138,1085\n58139,1033\n58140,58141\n58142,2373\n58143,58144\n58145,41\n58145,760\n58146,206\n58148,1132\n58149,781\n58150,500\n58151,146\n58152,1858\n58153,1860\n58154,588\n58154,590\n58155,392\n58156,1639\n58157,298\n58158,485\n58159,192\n58159,1181\n58160,346\n58161,326\n58162,671\n58163,147\n58164,1639\n58165,58166\n58167,184\n58168,671\n58169,406\n58169,55849\n58170,1132\n58171,781\n58172,30\n58173,750\n58173,783\n58173,1319\n58174,3321\n58175,217\n58175,788\n58176,255\n58178,652\n58179,1893\n58180,215\n58181,149\n58182,1058\n58183,205\n58183,485\n58183,611\n58184,779\n58185,364\n58186,1132\n58187,781\n58188,305\n58189,30\n58190,980\n58191,346\n58192,1381\n58193,207\n58193,302\n58193,2373\n58193,9457\n58194,1381\n58195,640\n58196,640\n58197,83\n58198,392\n58199,346\n58200,918\n58201,58\n58202,46\n58203,195\n58203,1474\n58203,1849\n58204,862\n58205,79\n58206,1818\n58208,1319\n58209,72\n58210,1722\n58210,3367\n58211,1722\n58213,420\n58215,149\n58215,406\n58216,3069\n58217,160\n58218,48505\n58219,184\n58221,425\n58222,809\n58224,379\n58224,388\n58226,973\n58227,58228\n58229,136\n58229,3247\n58230,206\n58231,1983\n58232,171\n58233,581\n58234,58235\n58236,163\n58237,392\n58238,911\n58241,932\n58242,8855\n58243,1085\n58244,631\n58244,1085\n58244,1785\n58246,875\n58247,911\n58248,779\n58249,346\n58250,7652\n58251,13980\n58252,644\n58252,918\n58253,18726\n58254,346\n58255,163\n58256,5405\n58257,1132\n58258,781\n58259,58260\n58262,58263\n58264,2379\n58265,50\n58266,657\n58267,149\n58267,622\n58268,611\n58268,1718\n58271,515\n58271,872\n58271,1052\n58271,1509\n58271,1579\n58271,1639\n58271,1893\n58271,2626\n58271,6695\n58272,304\n58273,422\n58274,21487\n58275,68\n58275,1285\n58275,1888\n58275,2590\n58276,609\n58276,875\n58276,1888\n58277,1556\n58278,1240\n58279,4691\n58282,1298\n58284,1010\n58285,736\n58286,827\n58288,151\n58289,631\n58289,775\n58289,999\n58289,1284\n58289,1326\n58289,2209\n58292,931\n58292,1118\n58293,7316\n58294,1411\n58296,158\n58298,58299\n58300,79\n58301,1608\n58302,83\n58302,2784\n58302,28130\n58303,1132\n58304,781\n58305,644\n58306,19443\n58307,2379\n58308,1509\n58309,1309\n58310,525\n58310,1309\n58311,1309\n58312,535\n58312,872\n58313,968\n58314,72\n58315,422\n58316,56\n58317,16196\n58318,1274\n58320,1007\n58321,861\n58322,2867\n58322,22880\n58323,1132\n58324,781\n58325,30\n58326,72\n58327,344\n58328,285\n58329,6298\n58330,671\n58330,1068\n58331,240\n58332,415\n58332,2750\n58333,137\n58334,477\n58335,605\n58336,406\n58337,406\n58338,1531\n58339,58340\n58339,72464\n58339,83179\n58339,105014\n58341,972\n58341,7117\n58342,20004\n58343,3111\n58344,422\n58345,30\n58346,1132\n58347,781\n58348,1132\n58349,781\n58350,158\n58350,1181\n58351,1977\n58351,1978\n58352,30\n58353,298\n58354,58355\n58356,1579\n58356,1639\n58357,968\n58358,644\n58359,497\n58360,209\n58362,58363\n58364,1551\n58365,406\n58366,676\n58367,248\n58368,118\n58368,4597\n58369,278\n58371,30\n58372,302\n58372,433\n58372,2116\n58372,6303\n58373,1058\n58373,2626\n58374,718\n58374,8180\n58375,171\n58377,1782\n58378,50\n58379,30\n58380,577\n58381,2045\n58382,240\n58383,720\n58384,298\n58385,485\n58386,1370\n58387,779\n58388,30\n58389,58390\n58391,1132\n58392,781\n58393,596\n58393,885\n58393,1368\n58393,5213\n58395,34\n58395,35\n58396,58397\n58398,58397\n58399,187\n58401,147\n58401,158\n58401,406\n58402,2286\n58403,261\n58403,278\n58403,283\n58403,2319\n58403,2646\n58403,6789\n58404,240\n58405,1844\n58406,567\n58408,30\n58409,299\n58410,298\n58411,485\n58414,1955\n58415,3413\n58416,811\n58417,3\n58417,34\n58417,35\n58417,106\n58417,158\n58417,178\n58417,192\n58417,202\n58417,203\n58417,217\n58417,251\n58417,252\n58417,337\n58417,346\n58417,435\n58417,516\n58417,586\n58417,622\n58417,640\n58417,663\n58417,664\n58417,1181\n58417,1220\n58417,1222\n58417,1243\n58417,1294\n58417,1370\n58417,1590\n58417,1635\n58417,2567\n58417,2931\n58417,3161\n58417,4192\n58417,4193\n58417,5874\n58417,5976\n58417,6119\n58417,8598\n58417,8771\n58417,8811\n58417,8822\n58417,8907\n58418,298\n58419,485\n58420,66\n58420,171\n58420,467\n58420,693\n58420,868\n58420,1345\n58420,81233\n58421,1243\n58422,147\n58422,158\n58422,1181\n58423,22\n58423,861\n58424,388\n58424,518\n58424,911\n58424,1345\n58424,6638\n58424,48505\n58425,202\n58425,203\n58426,298\n58427,485\n58429,1132\n58430,781\n58433,151\n58434,283\n58435,1284\n58436,247\n58437,4611\n58438,1544\n58439,852\n58439,3630\n58440,5213\n58441,1858\n58442,1860\n58444,34\n58444,35\n58444,973\n58445,171\n58446,56\n58447,1284\n58448,1634\n58449,442\n58449,1001\n58449,3474\n58450,217\n58450,1796\n58451,4611\n58452,3069\n58453,2646\n58454,240\n58454,818\n58455,1262\n58456,255\n58456,918\n58457,1515\n58458,1181\n58459,483\n58460,1962\n58461,72\n58462,1188\n58463,118\n58463,4597\n58464,83\n58465,3474\n58466,1078\n58466,1659\n58468,31122\n58470,358\n58471,4604\n58472,932\n58472,1016\n58473,1284\n58475,1511\n58475,3069\n58477,30\n58478,261\n58479,158\n58480,783\n58481,30\n58482,146\n58484,192\n58484,861\n58484,1659\n58485,240\n58486,1298\n58486,1659\n58486,1749\n58487,30\n58488,313\n58488,2421\n58489,240\n58489,818\n58490,657\n58491,30\n58492,8270\n58493,611\n58494,918\n58495,255\n58496,8598\n58497,17384\n58498,30\n58499,875\n58500,255\n58501,991\n58502,251\n58503,240\n58503,372\n58503,1082\n58503,1085\n58503,1580\n58503,1807\n58503,2812\n58503,4222\n58503,6068\n58503,212692\n58504,697\n58506,1858\n58508,1860\n58509,37\n58509,611\n58509,1449\n58509,1782\n58510,349\n58511,1556\n58512,2443\n58513,247\n58514,1881\n58515,907\n58515,973\n58515,1210\n58515,1544\n58515,1715\n58515,1785\n58515,2797\n58515,2991\n58516,151\n58517,1381\n58518,758\n58519,58520\n58521,58522\n58523,1509\n58523,1551\n58524,602\n58525,217\n58526,195\n58527,248\n58527,313\n58527,685\n58527,2460\n58528,772\n58529,3\n58530,31977\n58531,83\n58533,994\n58533,1432\n58534,1707\n58535,58536\n58537,217\n58538,1085\n58539,30\n58540,392\n58541,7416\n58542,994\n58543,7416\n58544,251\n58545,1707\n58547,1298\n58548,563\n58549,30\n58550,192\n58550,861\n58550,1659\n58551,247\n58552,147\n58552,439\n58553,97\n58554,32\n58554,388\n58554,779\n58554,1240\n58555,30\n58556,195\n58557,1511\n58557,3069\n58558,1773\n58559,30\n58559,66\n58559,118\n58559,151\n58559,272\n58559,273\n58559,274\n58559,422\n58559,505\n58559,602\n58559,887\n58559,1247\n58559,4101\n58559,4597\n58559,4691\n58559,68192\n58561,6068\n58562,392\n58563,68\n58564,240\n58564,818\n58565,4355\n58565,4771\n58566,20790\n58567,4691\n58568,255\n58568,918\n58569,1368\n58569,5405\n58570,2379\n58571,1151\n58571,1836\n58572,30\n58573,58574\n58576,58577\n58576,82143\n58578,376\n58579,72\n58580,1332\n58580,21944\n58581,5547\n58582,58583\n58584,1119\n58585,346\n58586,20\n58587,138\n58588,72\n58589,240\n58590,3069\n58591,93\n58591,94\n58592,58593\n58594,346\n58595,346\n58596,259\n58597,346\n58598,3960\n58599,17228\n58600,1181\n58602,346\n58603,83\n58604,83\n58605,536\n58606,2671\n58607,1458\n58608,298\n58609,485\n58610,2292\n58612,147\n58612,158\n58613,137\n58615,72\n58616,30\n58617,852\n58617,3630\n58617,185877\n58618,72\n58620,58621\n58622,58623\n58624,1707\n58625,298\n58626,485\n58627,1983\n58628,44\n58629,206\n58630,557\n58631,557\n58632,255\n58633,2782\n58634,5375\n58635,104\n58636,271\n58637,784\n58638,151\n58639,1718\n58640,147\n58640,158\n58640,2244\n58641,255\n58641,918\n58642,1052\n58643,931\n58644,1707\n58645,72\n58646,203\n58646,2931\n58647,333\n58649,2244\n58650,207\n58650,873\n58650,1210\n58651,72\n58652,406\n58653,50\n58654,30\n58655,609\n58655,626\n58656,58657\n58658,392\n58659,1639\n58660,222\n58661,182\n58662,14989\n58663,1417\n58664,1289\n58665,957\n58666,718\n58667,1\n58667,20\n58667,668\n58667,1623\n58668,72\n58670,97\n58671,305\n58671,2206\n58671,3247\n58672,640\n58673,298\n58674,485\n58675,422\n58676,422\n58677,422\n58678,422\n58679,422\n58680,422\n58681,422\n58682,422\n58683,422\n58684,356\n58684,3474\n58685,422\n58686,420\n58686,843\n58686,9015\n58687,255\n58688,1010\n58689,192\n58689,406\n58689,1181\n58690,3331\n58691,973\n58692,34\n58692,35\n58692,83\n58693,58694\n58693,67102\n58695,920\n58696,30\n58697,1805\n58698,1740\n58699,953\n58700,126\n58701,17228\n58702,393\n58703,1132\n58704,781\n58705,118\n58705,4597\n58706,146\n58707,875\n58708,1007\n58709,30\n58710,255\n58711,30\n58712,247\n58713,4060\n58714,779\n58715,557\n58716,126\n58717,676\n58718,631\n58719,628\n58720,28072\n58721,2697\n58722,38634\n58724,518\n58724,1326\n58724,14797\n58725,10\n58726,58727\n58728,4192\n58728,4193\n58729,1370\n58730,58731\n58732,2506\n58733,907\n58734,1414\n58735,3209\n58736,58736\n58737,147\n58737,192\n58737,406\n58737,4192\n58737,4193\n58738,2048\n58739,10\n58740,3370\n58740,14453\n58741,58742\n58743,8180\n58744,58745\n58744,64524\n58746,118\n58746,4597\n58747,4980\n58748,9457\n58749,188\n58750,137\n58751,10\n58752,393\n58753,178\n58754,202\n58754,203\n58755,1980\n58755,8992\n58756,9560\n58757,435\n58758,1776\n58758,4193\n58759,20790\n58760,58761\n58762,657\n58763,192\n58763,663\n58763,664\n58763,3872\n58764,2944\n58764,5976\n58765,192\n58766,58767\n58768,2292\n58770,4504\n58771,1019\n58772,58773\n58774,1313\n58775,841\n58776,140\n58778,640\n58779,21944\n58780,452\n58781,1634\n58782,273\n58782,274\n58783,1284\n58784,1133\n58784,22880\n58785,438\n58788,298\n58789,485\n58790,7358\n58790,7363\n58791,233\n58793,393\n58794,58795\n58794,87573\n58794,101423\n58794,105231\n58794,110970\n58796,1240\n58797,298\n58798,485\n58799,58800\n58801,310\n58802,515\n58803,273\n58803,274\n58804,718\n58805,634\n58805,1160\n58805,13980\n58806,406\n58806,779\n58807,45023\n58809,58810\n58811,1007\n58812,355\n58813,634\n58814,273\n58814,274\n58814,589\n58815,406\n58816,393\n58817,623\n58818,7360\n58819,346\n58820,46\n58820,48\n58820,56\n58820,68\n58820,72\n58820,79\n58820,83\n58820,99\n58820,120\n58820,130\n58820,167\n58820,192\n58820,217\n58820,248\n58820,261\n58820,264\n58820,283\n58820,285\n58820,301\n58820,312\n58820,315\n58820,332\n58820,349\n58820,364\n58820,372\n58820,392\n58820,393\n58820,406\n58820,417\n58820,422\n58820,435\n58820,450\n58820,455\n58820,477\n58820,493\n58820,503\n58820,509\n58820,510\n58820,525\n58820,538\n58820,575\n58820,577\n58820,589\n58820,602\n58820,615\n58820,636\n58820,660\n58820,671\n58820,682\n58820,697\n58820,702\n58820,720\n58820,726\n58820,779\n58820,783\n58820,808\n58820,850\n58820,859\n58820,907\n58820,932\n58820,968\n58820,973\n58820,980\n58820,1007\n58820,1010\n58820,1052\n58820,1082\n58820,1105\n58820,1117\n58820,1122\n58820,1149\n58820,1181\n58820,1210\n58820,1231\n58820,1240\n58820,1257\n58820,1282\n58820,1294\n58820,1326\n58820,1332\n58820,1353\n58820,1370\n58820,1429\n58820,1454\n58820,1465\n58820,1467\n58820,1479\n58820,1515\n58820,1522\n58820,1531\n58820,1539\n58820,1749\n58820,1756\n58820,1805\n58820,1807\n58820,1849\n58820,1858\n58820,1871\n58820,1877\n58820,1893\n58820,1949\n58820,1955\n58820,2083\n58820,2178\n58820,2191\n58820,2353\n58820,2421\n58820,2424\n58820,2557\n58820,2572\n58820,2590\n58820,2775\n58820,2779\n58820,2812\n58820,3115\n58820,3207\n58820,3218\n58820,3252\n58820,3260\n58820,3585\n58820,3623\n58820,3630\n58820,3695\n58820,4545\n58820,4637\n58820,5667\n58820,5906\n58820,6059\n58820,6506\n58820,6789\n58820,7092\n58820,9743\n58820,14945\n58820,22799\n58821,602\n58823,698\n58824,58825\n58824,92698\n58826,3538\n58827,1434\n58828,1143\n58829,19443\n58830,1132\n58831,781\n58832,58833\n58834,298\n58835,485\n58836,10\n58836,30\n58836,175\n58836,693\n58836,1188\n58836,2797\n58836,3582\n58836,127158\n58837,209\n58838,1858\n58839,1860\n58840,985\n58841,252\n58842,209\n58843,280\n58844,130\n58845,4604\n58847,366\n58848,209\n58849,1927\n58850,9323\n58851,6068\n58852,366\n58854,366\n58855,366\n58857,366\n58858,209\n58859,366\n58860,192\n58860,337\n58860,8854\n58861,366\n58862,366\n58863,366\n58864,328\n58865,298\n58866,485\n58867,346\n58868,1381\n58869,1745\n58870,30\n58872,209\n58873,4177\n58874,247\n58875,248\n58875,1133\n58875,1881\n58875,115659\n58876,66\n58876,171\n58876,467\n58876,868\n58877,907\n58877,932\n58878,58879\n58880,392\n58880,1888\n58880,3769\n58881,171\n58882,1033\n58883,1359\n58884,54\n58885,30\n58886,83\n58887,58888\n58889,10\n58889,8854\n58889,146764\n58890,2989\n58890,2991\n58891,801\n58892,202\n58892,1127\n58893,3111\n58894,200\n58894,2443\n58895,41\n58896,346\n58897,392\n58898,673\n58899,1506\n58900,415\n58900,666\n58900,3999\n58901,918\n58902,918\n58903,918\n58905,640\n58906,301\n58907,640\n58908,640\n58909,640\n58910,1663\n58911,41\n58912,4\n58912,5\n58913,438\n58913,1247\n58913,3148\n58913,164572\n58914,202\n58914,203\n58915,200\n58917,1247\n58917,30331\n58918,107\n58919,6303\n58920,30331\n58921,999\n58921,1001\n58923,1149\n58924,171\n58926,1556\n58927,861\n58928,22\n58929,7270\n58930,1132\n58931,781\n58933,45310\n58934,30\n58936,340\n58936,1096\n58936,2460\n58936,3003\n58937,1267\n58938,346\n58939,72\n58940,135\n58942,581\n58943,1531\n58944,195\n58946,1179\n58947,346\n58948,233\n58948,301\n58948,1235\n58948,1335\n58948,4146\n58949,3069\n58950,932\n58951,1858\n58952,1860\n58953,2436\n58954,30331\n58955,433\n58956,372\n58957,330\n58958,1265\n58958,1266\n58959,1087\n58961,1085\n58962,534\n58963,527\n58963,1983\n58963,8714\n58964,136\n58964,178\n58964,760\n58965,2351\n58966,255\n58967,843\n58968,657\n58969,647\n58970,344\n58971,302\n58971,579\n58972,652\n58973,493\n58974,893\n58975,2590\n58976,3079\n58977,1087\n58978,299\n58980,647\n58981,344\n58982,379\n58982,415\n58983,1983\n58985,1479\n58986,2006\n58987,2006\n58988,304\n58989,640\n58990,697\n58990,818\n58991,406\n58991,1425\n58992,22\n58993,557\n58994,256\n58994,356\n58995,1983\n58996,720\n58997,2006\n58998,861\n58999,338\n58999,668\n59000,430\n59000,1235\n59000,1335\n59001,467\n59001,872\n59002,586\n59003,2006\n59004,18726\n59005,611\n59005,911\n59006,134\n59006,431\n59006,805\n59007,1127\n59008,7358\n59008,7363\n59009,163\n59010,647\n59011,344\n59012,217\n59012,240\n59012,818\n59013,385\n59014,425\n59015,202\n59015,203\n59016,422\n59017,1572\n59018,644\n59019,2178\n59019,4545\n59020,1\n59020,149\n59020,178\n59020,256\n59020,275\n59020,333\n59020,336\n59020,337\n59020,439\n59020,505\n59020,538\n59020,868\n59020,934\n59020,1776\n59020,21442\n59021,106\n59021,333\n59021,337\n59021,469\n59021,586\n59021,18761\n59021,21528\n59021,22241\n59021,32654\n59021,48053\n59021,54871\n59021,60576\n59021,62208\n59021,65844\n59021,65966\n59021,66206\n59021,66966\n59021,67164\n59021,68651\n59021,70005\n59021,70006\n59021,92361\n59021,110506\n59021,124052\n59021,127987\n59021,130644\n59021,130882\n59021,134660\n59021,134661\n59021,134662\n59021,134668\n59021,134670\n59021,134674\n59021,136979\n59021,139859\n59021,140306\n59021,148479\n59021,148899\n59021,148901\n59021,156372\n59021,161473\n59021,166369\n59021,168842\n59021,171205\n59021,186248\n59021,189141\n59021,192154\n59021,260772\n59022,299\n59023,1836\n59024,509\n59025,1590\n59026,349\n59027,5987\n59028,2274\n59029,111\n59030,13745\n59031,32\n59032,392\n59033,779\n59034,697\n59035,8798\n59036,809\n59037,287\n59038,1240\n59039,3260\n59040,59041\n59042,346\n59044,2782\n59045,760\n59046,620\n59048,171\n59049,5405\n59050,304\n59051,225\n59051,349\n59052,406\n59053,79\n59055,647\n59056,344\n59057,15\n59057,2260\n59058,240\n59058,1019\n59058,1181\n59058,4355\n59059,158\n59060,5874\n59061,1122\n59062,577\n59063,647\n59064,344\n59065,392\n59065,1590\n59066,167\n59066,301\n59066,333\n59066,577\n59066,919\n59066,968\n59066,1133\n59066,1293\n59066,2443\n59066,2557\n59066,5662\n59067,41\n59068,30\n59069,302\n59069,420\n59069,1414\n59069,1466\n59070,360\n59071,1983\n59072,50\n59073,72\n59074,907\n59074,932\n59075,217\n59076,72\n59077,1181\n59078,346\n59080,1179\n59081,30\n59082,861\n59083,211\n59083,1014\n59083,3695\n59085,392\n59086,222\n59086,536\n59086,1072\n59086,1467\n59086,1539\n59086,2168\n59086,2424\n59086,2784\n59086,2944\n59086,13137\n59087,222\n59087,278\n59087,283\n59087,389\n59087,634\n59087,657\n59087,781\n59087,1019\n59087,1274\n59087,1571\n59087,1718\n59087,1871\n59087,1881\n59087,2266\n59087,4594\n59087,6789\n59087,6888\n59087,7768\n59087,29475\n59088,760\n59088,1149\n59089,310\n59091,264\n59092,743\n59093,1531\n59094,30\n59095,1590\n59096,2006\n59098,516\n59099,2006\n59100,818\n59102,59103\n59104,2006\n59105,137\n59106,1801\n59107,1977\n59107,1978\n59108,32\n59108,83\n59108,392\n59108,697\n59109,10\n59109,222\n59110,483\n59111,422\n59112,1149\n59113,852\n59113,980\n59114,360\n59116,682\n59117,877\n59117,1284\n59118,2006\n59119,16207\n59120,2574\n59121,1801\n59122,784\n59122,19443\n59123,217\n59123,2775\n59124,760\n59125,1968\n59126,21442\n59127,1531\n59129,59130\n59131,1983\n59132,2209\n59134,602\n59135,58\n59136,46\n59137,1179\n59138,1052\n59138,1659\n59139,868\n59140,1181\n59141,360\n59142,209\n59143,968\n59143,1241\n59143,1436\n59145,360\n59146,1052\n59146,2006\n59147,1425\n59148,818\n59149,59149\n59149,133639\n59150,577\n59151,315\n59151,431\n59151,1252\n59151,1253\n59152,1659\n59153,1983\n59154,134\n59155,130\n59156,147\n59156,149\n59156,1623\n59157,167\n59158,406\n59158,1181\n59159,2006\n59160,2006\n59161,264\n59162,301\n59162,1298\n59163,647\n59164,2526\n59165,59166\n59167,809\n59168,50\n59169,86\n59170,38236\n59171,392\n59172,255\n59173,8788\n59174,22\n59175,2506\n59176,41\n59176,415\n59178,703\n59179,330\n59180,818\n59180,59181\n59182,392\n59183,178\n59183,192\n59183,920\n59183,1620\n59184,59184\n59185,1122\n59186,874\n59186,2697\n59187,1659\n59187,1749\n59189,2006\n59190,515\n59191,1151\n59192,1836\n59193,2274\n59194,289\n59194,290\n59194,805\n59194,2205\n59194,2206\n59194,94134\n59195,1805\n59196,1556\n59197,192\n59197,256\n59198,259\n59199,536\n59200,310\n59201,3507\n59201,6424\n59202,41\n59204,388\n59208,104\n59208,134\n59208,200\n59208,358\n59208,372\n59208,714\n59208,760\n59209,425\n59211,120\n59212,289\n59212,290\n59213,4223\n59214,151\n59215,130\n59216,202\n59216,203\n59216,1556\n59217,1711\n59218,200\n59218,278\n59218,1072\n59218,1836\n59218,1871\n59218,2421\n59218,3585\n59219,640\n59220,1127\n59221,1274\n59222,240\n59223,83\n59224,202\n59224,1659\n59225,676\n59227,704\n59228,907\n59228,932\n59229,1749\n59229,3585\n59230,3507\n59231,518\n59232,718\n59233,718\n59234,779\n59235,366\n59236,718\n59237,126\n59238,72\n59239,10\n59240,151\n59242,4355\n59243,752\n59244,8270\n59245,120\n59245,1860\n59245,6955\n59246,72\n59247,779\n59248,10\n59249,255\n59250,788\n59251,83\n59252,1858\n59253,1860\n59254,72\n59255,602\n59256,442\n59257,72\n59257,2782\n59257,35486\n59258,163\n59259,10\n59260,34\n59260,35\n59261,1858\n59262,1860\n59263,483\n59263,79599\n59264,615\n59264,720\n59264,877\n59264,907\n59264,1732\n59264,2191\n59264,3422\n59265,875\n59266,59267\n59268,21944\n59269,167\n59269,467\n59269,687\n59269,794\n59269,1151\n59270,158\n59271,663\n59271,664\n59272,31896\n59273,104\n59273,215\n59273,714\n59273,1212\n59273,1282\n59273,1745\n59273,4222\n59273,111142\n59273,176782\n59275,2590\n59276,920\n59277,10\n59278,30\n59279,83\n59280,255\n59281,118\n59281,4597\n59282,59283\n59284,48\n59285,1181\n59286,30\n59287,187\n59289,298\n59290,485\n59291,18726\n59292,247\n59293,392\n59293,697\n59294,72\n59295,255\n59295,918\n59296,163\n59297,1531\n59298,24332\n59299,422\n59300,1962\n59301,422\n59302,184\n59303,72\n59304,647\n59305,344\n59306,422\n59307,392\n59308,10\n59308,139451\n59309,358\n59310,8714\n59311,422\n59312,59313\n59314,13661\n59315,422\n59316,376\n59317,200\n59318,147\n59319,7358\n59319,7363\n59320,211\n59321,59322\n59323,72\n59324,1877\n59325,1072\n59326,493\n59326,1265\n59326,1266\n59326,1370\n59327,72\n59328,217\n59329,330\n59330,72\n59331,949\n59332,136\n59332,3247\n59333,3413\n59334,801\n59334,1140\n59334,1177\n59334,1893\n59334,5547\n59335,301\n59336,346\n59337,704\n59338,779\n59339,30\n59340,779\n59341,907\n59341,2191\n59342,30\n59343,298\n59344,34\n59344,35\n59344,217\n59344,536\n59344,4672\n59344,13546\n59344,18831\n59345,136\n59346,298\n59347,278\n59348,1019\n59349,13980\n59350,1556\n59351,861\n59352,22\n59353,77\n59354,932\n59355,77\n59356,1298\n59357,59358\n59359,406\n59360,406\n59361,1284\n59362,298\n59363,485\n59364,602\n59364,1181\n59365,346\n59366,30\n59367,72\n59368,240\n59369,252\n59369,1179\n59369,1210\n59369,1326\n59369,1381\n59370,298\n59371,485\n59372,422\n59373,346\n59374,422\n59375,422\n59376,557\n59377,557\n59378,227\n59379,376\n59380,422\n59381,885\n59382,4355\n59383,83\n59384,671\n59385,298\n59386,346\n59387,485\n59388,779\n59389,54284\n59390,481\n59391,1181\n59391,1531\n59392,10\n59393,346\n59394,106\n59395,217\n59395,536\n59395,2797\n59396,111\n59396,703\n59396,1722\n59396,3538\n59396,3612\n59397,379\n59398,657\n59398,6789\n59399,3246\n59399,3247\n59400,14989\n59401,50\n59402,779\n59403,50\n59404,59405\n59406,250\n59406,1684\n59407,305\n59408,704\n59409,59410\n59409,104666\n59409,113762\n59409,128080\n59411,23011\n59412,9323\n59413,17334\n59414,586\n59414,1243\n59415,704\n59416,393\n59417,636\n59418,349\n59419,515\n59420,1858\n59421,1860\n59422,83\n59423,1531\n59424,10\n59425,50\n59426,1556\n59427,2506\n59428,2506\n59429,2506\n59430,10\n59431,72\n59432,59432\n59433,17334\n59435,313\n59436,72\n59437,455\n59438,72\n59439,841\n59440,5405\n59441,72\n59442,602\n59443,602\n59444,602\n59445,72\n59446,872\n59447,59448\n59449,118\n59449,4597\n59450,72\n59451,59452\n59453,151\n59453,2607\n59455,676\n59456,516\n59457,383\n59458,72\n59459,118\n59459,4597\n59460,72\n59461,72\n59462,72\n59463,313\n59464,663\n59464,664\n59464,788\n59464,5265\n59465,313\n59466,920\n59466,994\n59466,2923\n59466,4094\n59467,704\n59468,59469\n59468,110980\n59470,59471\n59472,72\n59473,206\n59474,72\n59475,72\n59477,2260\n59478,346\n59479,72\n59480,289\n59480,290\n59481,118\n59481,4597\n59482,34\n59482,35\n59483,72\n59484,72\n59485,349\n59486,8822\n59487,72\n59488,34\n59488,35\n59489,19227\n59490,72\n59491,72\n59492,72\n59493,1688\n59494,3\n59495,240\n59496,4604\n59497,72\n59498,44\n59499,72\n59500,704\n59501,10\n59502,59503\n59504,8822\n59505,72\n59506,59507\n59508,72\n59509,63\n59510,2292\n59511,17228\n59513,137\n59514,676\n59515,2379\n59516,301\n59517,206\n59517,2617\n59517,9239\n59517,59931\n59518,5101\n59519,72\n59520,72\n59521,72\n59522,72\n59523,21944\n59524,72\n59525,72\n59526,83\n59527,72\n59528,72\n59529,30\n59530,2567\n59531,24505\n59532,72\n59533,704\n59534,217\n59534,872\n59534,1118\n59534,1796\n59535,1119\n59536,346\n59537,21944\n59538,72\n59539,137\n59540,59541\n59542,30\n59543,30\n59544,192\n59544,663\n59544,1089\n59545,7117\n59546,225\n59547,35687\n59548,8990\n59549,346\n59550,7\n59551,187\n59552,6263\n59553,9323\n59554,2351\n59555,72\n59556,22\n59556,72\n59556,97\n59556,285\n59557,59558\n59559,195\n59559,27217\n59560,652\n59562,918\n59563,72\n59564,72\n59565,233\n59566,81\n59567,59568\n59569,1181\n59570,3413\n59571,2995\n59572,1019\n59572,1462\n59573,72\n59574,1\n59575,158\n59576,1265\n59576,1266\n59577,59578\n59579,21944\n59580,79\n59581,167\n59581,2979\n59582,406\n59583,195\n59583,27217\n59584,192\n59585,5547\n59586,310\n59586,805\n59587,1980\n59587,8991\n59588,805\n59589,134\n59590,5375\n59591,1033\n59592,355\n59593,693\n59594,346\n59595,30\n59596,2105\n59597,186\n59598,1140\n59598,5547\n59599,366\n59600,647\n59601,344\n59602,366\n59603,366\n59604,366\n59605,366\n59606,366\n59607,366\n59609,366\n59610,366\n59611,44013\n59612,21944\n59613,431\n59614,366\n59615,217\n59616,801\n59616,1140\n59616,1177\n59616,1985\n59616,3474\n59617,801\n59617,1140\n59617,3474\n59618,72\n59619,509\n59620,567\n59620,900\n59621,305\n59622,305\n59623,30\n59624,147\n59624,158\n59624,1122\n59625,26\n59625,59\n59626,7270\n59627,47\n59627,2469\n59628,1058\n59629,72\n59632,217\n59633,3177\n59634,850\n59635,1274\n59637,72\n59638,850\n59639,58\n59640,46\n59641,1551\n59642,58\n59643,46\n59645,693\n59646,104\n59647,10\n59647,147\n59647,158\n59647,628\n59647,795\n59647,1411\n59647,1572\n59647,3804\n59647,4039\n59647,6323\n59648,72\n59649,891\n59650,2443\n59651,346\n59652,72\n59654,3260\n59657,240\n59658,467\n59658,1452\n59658,1849\n59658,32784\n59659,72\n59660,72\n59661,83\n59662,1127\n59663,439\n59663,1033\n59664,3830\n59665,1058\n59667,72\n59668,640\n59669,640\n59670,72\n59671,72\n59672,2915\n59673,72\n59674,907\n59674,932\n59675,1298\n59675,3804\n59676,72\n59677,1607\n59677,4355\n59678,7124\n59679,147\n59681,72\n59682,21944\n59683,2506\n59684,255\n59685,1644\n59686,2775\n59687,447\n59688,195\n59689,3582\n59690,54\n59691,1531\n59692,72\n59693,285\n59694,195\n59696,59697\n59698,195\n59699,26\n59699,59\n59701,581\n59703,1323\n59704,72\n59705,536\n59706,240\n59706,818\n59707,59708\n59709,9457\n59710,192\n59711,406\n59712,4\n59712,5\n59712,104\n59712,136\n59712,557\n59712,885\n59712,1368\n59712,1939\n59712,5405\n59712,13704\n59713,118\n59713,4597\n59715,1319\n59716,72\n59717,59718\n59719,59718\n59720,59718\n59721,72\n59722,907\n59722,932\n59724,875\n59725,2178\n59725,4545\n59726,1010\n59727,217\n59727,1118\n59728,292\n59728,622\n59729,252\n59730,349\n59731,392\n59731,1151\n59732,7092\n59733,79\n59734,1143\n59735,2460\n59737,1284\n59738,55849\n59739,302\n59739,811\n59740,50\n59741,439\n59745,302\n59746,158\n59746,406\n59746,55849\n59748,158\n59751,1556\n59752,390\n59752,752\n59752,2590\n59752,6068\n59753,911\n59754,417\n59756,1033\n59757,1881\n59758,1608\n59759,195\n59760,644\n59761,79\n59762,140\n59762,191860\n59764,602\n59765,9560\n59766,337\n59767,6263\n59768,17228\n59769,34\n59769,35\n59769,18831\n59770,850\n59772,875\n59773,433\n59773,2017\n59775,298\n59776,59777\n59778,579\n59778,6303\n59779,217\n59780,192\n59781,298\n59782,485\n59783,875\n59784,704\n59785,6119\n59787,389\n59787,1466\n59788,83\n59788,536\n59788,949\n59788,18831\n59789,79\n59790,500\n59792,557\n59793,4672\n59793,18831\n59795,1531\n59797,79\n59797,136\n59797,137\n59797,290\n59797,590\n59797,760\n59797,805\n59797,1181\n59797,1462\n59797,2206\n59797,8180\n59798,1326\n59799,536\n59799,4672\n59799,18831\n59800,9121\n59801,808\n59802,195\n59803,4039\n59804,8270\n59805,217\n59805,222\n59805,536\n59805,18831\n59807,217\n59807,1417\n59807,18831\n59808,344\n59808,1127\n59808,1140\n59808,1893\n59808,5547\n59808,54362\n59809,34\n59809,35\n59809,217\n59809,536\n59809,1417\n59809,18831\n59810,536\n59810,18831\n59811,304\n59813,304\n59814,18831\n59816,20813\n59817,2697\n59819,536\n59819,18831\n59820,18831\n59821,344\n59822,7698\n59822,18831\n59823,1014\n59824,72\n59825,151\n59826,1326\n59826,3585\n59826,14797\n59827,79\n59828,195\n59829,30\n59830,379\n59833,26\n59833,59\n59833,577\n59833,1844\n59834,1531\n59835,1462\n59835,31896\n59836,8270\n59837,1181\n59838,349\n59839,248\n59840,5405\n59841,406\n59842,20\n59843,1983\n59844,79\n59844,663\n59844,664\n59845,422\n59846,56\n59848,83\n59849,358\n59850,18726\n59853,86\n59854,163\n59856,1274\n59857,2506\n59858,2506\n59859,422\n59860,56\n59861,56\n59862,925\n59863,1531\n59864,1803\n59865,2828\n59867,1001\n59868,430\n59869,59870\n59871,2931\n59872,217\n59872,425\n59872,3507\n59874,298\n59875,485\n59876,313\n59877,1332\n59878,31977\n59879,99\n59880,433\n59881,187\n59882,273\n59882,274\n59883,202\n59883,203\n59884,536\n59884,972\n59884,1363\n59884,1881\n59884,13136\n59885,1551\n59888,663\n59888,664\n59890,86\n59891,58\n59892,46\n59893,1132\n59894,859\n59895,302\n59896,158\n59897,1531\n59898,1983\n59899,273\n59899,274\n59899,1400\n59900,422\n59901,1133\n59902,557\n59903,422\n59904,215\n59905,422\n59906,422\n59907,30\n59908,968\n59908,1801\n59909,872\n59910,6627\n59911,422\n59912,422\n59913,422\n59914,838\n59915,118\n59915,4597\n59916,422\n59917,3246\n59917,3247\n59918,1240\n59918,1454\n59919,1551\n59920,972\n59920,973\n59920,148742\n59921,34\n59921,35\n59921,1715\n59921,2209\n59922,3451\n59922,3452\n59923,151\n59923,1844\n59924,6027\n59925,30\n59926,118\n59926,4597\n59927,30\n59929,1016\n59930,779\n59931,68\n59931,1004\n59931,1285\n59931,1462\n59931,8537\n59931,41334\n59931,62982\n59931,82285\n59931,84256\n59931,85931\n59931,88094\n59931,96606\n59931,112530\n59931,114060\n59931,114092\n59931,116548\n59931,117134\n59931,119863\n59931,122992\n59931,132922\n59931,136164\n59931,149142\n59931,151170\n59931,151423\n59932,2995\n59933,5662\n59935,5405\n59936,557\n59938,30\n59939,79\n59940,120\n59940,225\n59940,248\n59940,328\n59940,383\n59940,392\n59940,592\n59940,622\n59940,631\n59940,714\n59940,795\n59940,805\n59940,934\n59940,1001\n59940,1010\n59940,1085\n59940,1133\n59940,1149\n59940,1177\n59940,1181\n59940,1274\n59940,1326\n59940,1466\n59940,1522\n59940,1634\n59940,1722\n59940,1849\n59940,1977\n59940,1978\n59940,2045\n59940,2443\n59940,2989\n59940,2991\n59940,3138\n59940,3538\n59940,9001\n59940,14126\n59940,14797\n59940,14819\n59941,2506\n59942,30\n59943,99\n59944,1531\n59945,647\n59946,344\n59947,868\n59948,79\n59949,77\n59949,269\n59950,3\n59952,23010\n59954,72\n59955,200\n59955,859\n59955,1122\n59955,32475\n59956,248\n59956,450\n59956,1332\n59956,5405\n59957,302\n59957,340\n59957,467\n59957,586\n59957,596\n59957,861\n59957,893\n59957,1058\n59957,1556\n59959,676\n59960,104\n59961,1167\n59962,30\n59963,217\n59964,5265\n59965,10\n59966,704\n59967,158\n59968,16196\n59969,1531\n59970,83\n59971,602\n59971,4866\n59972,2146\n59973,30\n59974,1012\n59975,21944\n59976,26\n59976,59\n59978,4172\n59979,147\n59979,149\n59979,158\n59979,406\n59979,622\n59980,1983\n59981,151\n59982,1181\n59983,83\n59984,1284\n59985,59986\n59987,442\n59988,676\n59989,346\n59990,392\n59990,510\n59990,697\n59990,818\n59991,49887\n59992,389\n59994,932\n59995,6726\n59996,1287\n59997,158\n59997,206\n59998,104\n59998,217\n59998,872\n59998,1118\n59998,1417\n59999,209\n60000,9029\n60001,171\n60002,602\n60003,602\n60004,289\n60004,290\n60005,1\n60005,117\n60005,1345\n60005,2712\n60006,640\n60007,862\n60007,1332\n60008,9342\n60008,9529\n60009,2191\n60010,392\n60011,264\n60012,72\n60013,254\n60014,1531\n60015,5\n60015,117\n60015,2089\n60015,2940\n60015,9386\n60015,21944\n60016,1531\n60017,22519\n60018,72\n60019,406\n60020,392\n60020,918\n60022,861\n60023,278\n60025,323\n60026,1955\n60028,72\n60029,115\n60029,118\n60030,1070\n60031,3999\n60032,850\n60033,1462\n60033,8537\n60034,563\n60035,376\n60036,652\n60037,298\n60038,485\n60039,647\n60040,344\n60041,602\n60042,72\n60043,3413\n60044,1531\n60045,195\n60045,779\n60046,1531\n60047,72\n60048,483\n60049,1313\n60050,18726\n60050,41772\n60050,186030\n60051,58\n60052,46\n60053,247\n60054,392\n60055,160\n60056,72\n60057,72\n60058,431\n60058,2353\n60060,1118\n60061,34\n60061,35\n60062,72\n60063,60064\n60065,151\n60065,911\n60066,631\n60067,58\n60068,46\n60069,1231\n60070,72\n60071,72\n60072,455\n60072,2590\n60073,33598\n60074,60075\n60076,72\n60077,34\n60077,1776\n60077,4193\n60078,3321\n60079,694\n60080,83\n60082,60083\n60084,1515\n60085,1181\n60086,312\n60086,1010\n60087,4355\n60088,968\n60088,3218\n60089,138\n60089,184\n60089,850\n60089,968\n60089,1085\n60089,1368\n60089,2105\n60089,4545\n60090,60091\n60092,72\n60093,72\n60094,1082\n60095,200\n60095,557\n60095,1368\n60097,1265\n60097,1266\n60098,60099\n60100,920\n60101,309\n60101,310\n60102,843\n60103,557\n60104,557\n60105,477\n60107,83\n60108,117\n60108,1227\n60108,2712\n60108,21944\n60108,86416\n60109,72\n60110,72\n60111,392\n60112,72\n60113,1033\n60114,72\n60115,1149\n60116,3653\n60117,72\n60118,1556\n60119,72\n60119,312\n60120,72\n60121,392\n60122,3260\n60123,72\n60124,60125\n60126,72\n60127,779\n60128,72\n60129,779\n60130,72\n60131,158\n60132,72\n60133,779\n60134,1556\n60135,72\n60136,417\n60136,714\n60136,2286\n60137,417\n60137,714\n60137,1749\n60137,1818\n60137,2286\n60137,2620\n60138,515\n60138,1381\n60139,72\n60140,60141\n60142,2929\n60143,5366\n60144,60145\n60146,72\n60147,72\n60148,60149\n60148,105096\n60148,141235\n60150,349\n60151,72\n60152,50\n60153,72\n60154,72\n60155,72\n60156,72\n60157,60158\n60159,72\n60160,1796\n60161,1531\n60162,1707\n60163,60164\n60163,105943\n60163,110176\n60165,72\n60166,72\n60167,1860\n60168,72\n60169,30\n60170,72\n60171,72\n60172,1531\n60173,298\n60174,72\n60175,72\n60176,58\n60177,46\n60178,107\n60179,72\n60180,160\n60181,207\n60182,704\n60183,58\n60184,46\n60185,171\n60186,44\n60187,72\n60188,1634\n60189,424\n60190,626\n60191,602\n60192,60193\n60194,72\n60195,704\n60196,1181\n60197,72\n60198,72\n60199,10\n60200,72\n60201,255\n60202,72\n60203,72\n60204,58\n60205,46\n60206,1572\n60208,10\n60209,1782\n60210,8822\n60211,1531\n60212,704\n60213,151\n60214,1212\n60215,455\n60216,2315\n60218,60219\n60220,333\n60221,104\n60222,346\n60223,859\n60223,1531\n60224,4252\n60224,5987\n60225,602\n60226,602\n60227,72\n60228,704\n60231,72\n60232,1608\n60233,72\n60234,72\n60235,72\n60236,72\n60237,72\n60238,2867\n60238,2868\n60238,22880\n60239,72\n60240,862\n60240,2590\n60241,72\n60242,60243\n60244,72\n60245,72\n60246,72\n60247,72\n60248,289\n60248,290\n60248,3041\n60249,2351\n60250,72\n60251,72\n60252,392\n60252,1151\n60253,1363\n60254,72\n60255,60256\n60255,71483\n60255,82603\n60257,1\n60258,68\n60259,346\n60260,72\n60261,671\n60262,346\n60263,72\n60264,704\n60265,137\n60266,72\n60267,72\n60268,72\n60269,1181\n60270,147\n60271,310\n60272,1181\n60273,72\n60274,72\n60275,346\n60276,605\n60277,563\n60278,346\n60279,72\n60280,79\n60281,60282\n60283,160\n60283,305\n60283,538\n60284,704\n60285,41\n60286,704\n60287,1238\n60288,233\n60289,2083\n60290,3467\n60291,500\n60292,1962\n60293,1052\n60294,1882\n60295,2775\n60296,54\n60297,255\n60298,72\n60299,60300\n60299,69259\n60301,2995\n60302,17334\n60303,72\n60304,104\n60304,192\n60304,240\n60304,493\n60304,760\n60304,1181\n60304,149534\n60305,72\n60306,355\n60307,687\n60307,1556\n60309,2557\n60310,1452\n60311,775\n60312,500\n60313,1962\n60314,1052\n60315,1882\n60316,2775\n60317,54\n60318,2574\n60320,718\n60320,1227\n60320,1229\n60320,4823\n60320,21944\n60320,86416\n60321,5034\n60322,2292\n60323,50\n60324,3999\n60325,4771\n60326,79\n60327,58\n60328,46\n60329,60330\n60331,1132\n60332,781\n60333,48\n60333,1452\n60334,298\n60335,485\n60336,647\n60337,344\n60338,79\n60339,1858\n60340,1860\n60341,298\n60342,485\n60344,298\n60345,485\n60346,477\n60347,1858\n60348,1860\n60349,26\n60349,59\n60350,60351\n60350,91494\n60350,96378\n60350,105158\n60350,119776\n60353,366\n60354,298\n60355,485\n60356,760\n60356,1149\n60356,1631\n60358,366\n60359,366\n60360,366\n60361,366\n60362,366\n60363,366\n60364,366\n60365,255\n60366,366\n60367,366\n60368,366\n60369,366\n60370,366\n60371,366\n60372,366\n60373,346\n60374,918\n60375,37\n60375,968\n60375,1293\n60375,1782\n60376,1858\n60377,1860\n60378,1224\n60379,192\n60380,83\n60382,366\n60383,366\n60384,346\n60385,292\n60385,704\n60385,1285\n60385,66297\n60385,171641\n60386,255\n60388,1181\n60389,182\n60390,1285\n60391,60392\n60393,640\n60394,240\n60395,56\n60396,1531\n60397,647\n60398,344\n60399,663\n60399,664\n60401,60402\n60404,251\n60404,465\n60405,3999\n60407,203\n60407,2697\n60407,4193\n60408,1102\n60409,1102\n60410,818\n60410,46891\n60410,60411\n60410,60650\n60410,60661\n60410,60690\n60410,61042\n60410,61365\n60412,247\n60412,2867\n60412,22880\n60413,626\n60414,772\n60414,4691\n60414,6068\n60415,301\n60415,563\n60416,72\n60417,346\n60418,795\n60418,68069\n60418,86832\n60419,158\n60419,406\n60420,3474\n60421,192\n60422,60423\n60424,581\n60425,60426\n60427,762\n60428,6726\n60429,1776\n60429,4193\n60430,34\n60430,158\n60431,2178\n60431,4545\n60432,1955\n60432,66500\n60433,72\n60434,1363\n60434,15523\n60437,783\n60438,682\n60439,1531\n60440,1556\n60441,1127\n60442,1019\n60443,158\n60443,779\n60443,1181\n60444,347\n60444,702\n60444,874\n60447,17334\n60448,298\n60457,1467\n60459,503\n60459,1149\n60460,143\n60460,1204\n60460,1844\n60460,17346\n60461,35905\n60463,240\n60463,1285\n60464,225\n60464,248\n60465,1977\n60465,1978\n60466,344\n60466,1140\n60466,1363\n60466,1836\n60466,3474\n60466,5547\n60467,34\n60467,35\n60467,83\n60467,217\n60467,379\n60467,390\n60467,392\n60467,571\n60467,599\n60467,660\n60467,697\n60467,872\n60467,918\n60467,1019\n60467,1285\n60467,1796\n60467,1805\n60468,1274\n60469,515\n60470,2775\n60471,447\n60472,657\n60473,3623\n60475,5405\n60476,644\n60481,60482\n60481,131079\n60483,195\n60484,4594\n60485,602\n60486,3555\n60487,2812\n60488,2989\n60488,2991\n60489,56\n60490,1707\n60492,99\n60493,2411\n60494,240\n60494,372\n60494,1085\n60494,1580\n60494,2812\n60494,4222\n60495,1179\n60496,147\n60496,206\n60496,422\n60496,1458\n60497,1368\n60498,3524\n60499,202\n60499,203\n60499,272\n60499,1370\n60500,760\n60500,1149\n60500,1436\n60501,83\n60502,18726\n60503,1745\n60504,1122\n60506,134\n60507,163\n60508,99\n60509,2116\n60510,827\n60511,392\n60512,4177\n60513,247\n60514,1227\n60514,1229\n60515,217\n60516,682\n60517,859\n60517,1531\n60518,406\n60519,4\n60519,5\n60521,86\n60521,109720\n60522,1313\n60523,309\n60523,310\n60524,292\n60526,146\n60527,827\n60527,3653\n60528,1192\n60529,72\n60530,602\n60531,852\n60532,86\n60533,206\n60534,450\n60534,24332\n60535,1983\n60536,1983\n60537,4066\n60538,192\n60538,671\n60540,1078\n60541,301\n60541,968\n60541,73570\n60542,301\n60542,604\n60542,968\n60543,207\n60544,1188\n60544,1381\n60545,1118\n60546,1983\n60547,10\n60548,760\n60548,1149\n60548,3653\n60549,663\n60549,664\n60550,850\n60551,1531\n60552,211\n60553,918\n60554,406\n60555,60556\n60559,7757\n60560,1276\n60561,4504\n60562,60563\n60564,1167\n60564,1241\n60564,2557\n60566,783\n60567,10\n60567,195\n60568,301\n60568,968\n60568,1160\n60569,171\n60570,358\n60571,60572\n60573,79\n60576,1\n60576,10\n60576,56\n60576,99\n60576,106\n60576,130\n60576,146\n60576,147\n60576,158\n60576,192\n60576,285\n60576,314\n60576,333\n60576,336\n60576,337\n60576,406\n60576,422\n60576,425\n60576,586\n60576,602\n60576,620\n60576,622\n60576,779\n60576,841\n60576,920\n60576,1011\n60576,1027\n60576,1089\n60576,1181\n60576,1425\n60576,1464\n60576,1619\n60576,1623\n60576,1825\n60576,1969\n60576,1973\n60576,1985\n60576,1994\n60576,2032\n60576,2217\n60576,2903\n60576,3895\n60576,4190\n60576,5401\n60576,6119\n60576,7296\n60576,7768\n60576,7794\n60576,8244\n60576,8867\n60576,12263\n60576,13221\n60576,15437\n60576,15795\n60576,16493\n60576,17139\n60576,17151\n60576,18637\n60576,20982\n60576,21394\n60576,22616\n60576,23031\n60576,23783\n60576,24230\n60576,25467\n60576,28350\n60576,29895\n60576,30331\n60576,35537\n60576,35561\n60576,38834\n60576,38882\n60576,41366\n60576,43239\n60576,46144\n60576,47095\n60576,49553\n60576,55075\n60576,59021\n60576,60576\n60576,62226\n60576,62457\n60576,62686\n60576,65844\n60576,67908\n60576,68024\n60576,70965\n60576,71028\n60576,78688\n60576,78875\n60576,79768\n60576,80266\n60576,84685\n60576,92476\n60576,93081\n60576,99819\n60576,106352\n60576,109411\n60576,115968\n60576,115969\n60576,115970\n60576,117726\n60576,121321\n60576,123797\n60576,126727\n60576,131905\n60576,133983\n60576,137014\n60576,137015\n60576,137016\n60576,139859\n60576,140355\n60576,147341\n60576,148370\n60576,148479\n60576,150210\n60576,150446\n60576,150841\n60576,156372\n60576,159733\n60576,168354\n60576,171143\n60576,171144\n60576,172640\n60576,175883\n60576,181815\n60576,188779\n60576,193008\n60576,197730\n60576,204124\n60576,221675\n60576,228521\n60576,229950\n60576,230516\n60576,232390\n60576,232696\n60576,232855\n60576,238338\n60576,239548\n60576,241031\n60576,241086\n60576,243708\n60576,250406\n60576,252713\n60576,257164\n60576,258627\n60577,795\n60578,72\n60579,602\n60580,602\n60581,2506\n60582,247\n60583,136\n60583,160\n60583,346\n60584,2506\n60587,663\n60587,664\n60588,2351\n60589,907\n60590,34\n60590,35\n60590,313\n60590,2224\n60590,2646\n60590,5326\n60591,29380\n60592,4101\n60593,1118\n60594,60595\n60596,60595\n60597,60595\n60598,571\n60598,1326\n60599,1634\n60600,775\n60601,663\n60601,664\n60602,406\n60603,41\n60603,1608\n60604,406\n60605,326\n60605,873\n60606,652\n60607,907\n60607,932\n60608,72\n60609,1531\n60611,1983\n60612,2205\n60612,2206\n60612,33424\n60613,10\n60614,315\n60615,19\n60616,9195\n60617,1381\n60618,626\n60619,660\n60619,1871\n60620,660\n60620,1871\n60621,72\n60622,344\n60623,285\n60624,2867\n60624,2868\n60624,22880\n60625,21944\n60626,2116\n60627,240\n60627,818\n60628,2775\n60629,447\n60630,392\n60632,269\n60633,269\n60634,1132\n60635,781\n60636,2224\n60637,140\n60639,298\n60640,1151\n60641,557\n60642,60643\n60644,202\n60644,203\n60645,483\n60649,50\n60649,2923\n60651,609\n60652,58\n60653,1033\n60654,104\n60654,3246\n60655,79\n60656,302\n60657,3209\n60658,1\n60658,422\n60658,972\n60658,973\n60658,1010\n60658,1298\n60658,7768\n60660,292\n60663,83\n60664,247\n60665,34\n60665,35\n60665,536\n60666,83\n60666,285\n60666,2779\n60666,2784\n60667,195\n60668,1572\n60669,137\n60670,26\n60670,59\n60671,1782\n60672,104\n60672,136\n60672,557\n60672,1319\n60673,217\n60673,252\n60674,72\n60675,503\n60676,151\n60677,510\n60678,392\n60679,872\n60680,217\n60681,372\n60682,1143\n60683,147\n60683,158\n60683,206\n60683,2244\n60684,203\n60684,2931\n60685,1531\n60686,1740\n60687,372\n60688,516\n60689,81\n60691,652\n60691,2206\n60692,4355\n60693,304\n60694,344\n60694,1070\n60695,5976\n60696,671\n60697,16687\n60698,1803\n60699,1247\n60699,1424\n60700,264\n60701,106\n60701,586\n60701,1985\n60702,861\n60703,714\n60704,136\n60704,137\n60705,247\n60706,60707\n60708,344\n60709,1381\n60710,493\n60711,676\n60712,440\n60713,333\n60713,841\n60714,1871\n60715,126\n60716,4895\n60717,704\n60718,675\n60718,1078\n60719,697\n60720,1462\n60720,31896\n60721,151\n60722,422\n60723,422\n60724,47\n60724,2469\n60725,2867\n60725,22880\n60726,422\n60727,422\n60728,422\n60729,422\n60730,422\n60731,422\n60732,535\n60733,37\n60733,66\n60733,1181\n60734,417\n60735,459\n60736,647\n60737,344\n60738,647\n60739,344\n60740,17228\n60741,3960\n60742,455\n60743,704\n60744,310\n60745,872\n60746,1531\n60747,3161\n60748,1983\n60750,30\n60751,1235\n60751,1335\n60753,26\n60753,59\n60754,1983\n60755,1007\n60756,347\n60757,346\n60758,72\n60759,5212\n60760,1707\n60761,255\n60762,8788\n60763,2312\n60764,104\n60764,332\n60765,273\n60765,274\n60766,704\n60767,704\n60768,140\n60769,60770\n60769,64305\n60769,64330\n60771,1983\n60772,187\n60773,1149\n60774,783\n60775,83\n60775,2779\n60775,2784\n60776,225\n60777,577\n60778,65\n60779,77\n60780,2205\n60780,2206\n60780,33424\n60781,503\n60783,1983\n60784,783\n60785,1235\n60785,1335\n60786,622\n60787,557\n60788,557\n60790,8270\n60791,68\n60792,60793\n60794,1210\n60795,206\n60795,657\n60796,137\n60797,358\n60798,58\n60799,46\n60800,1289\n60801,581\n60802,1381\n60803,3413\n60804,1962\n60805,595\n60806,850\n60807,30\n60808,1983\n60809,932\n60810,72\n60811,72\n60812,30\n60813,2506\n60814,1564\n60814,1785\n60815,60816\n60817,30\n60818,1983\n60819,79\n60820,72\n60821,1655\n60822,376\n60823,885\n60824,6068\n60825,30\n60826,563\n60827,563\n60828,563\n60829,5405\n60830,1\n60831,1659\n60832,332\n60833,2506\n60834,392\n60834,1151\n60835,83\n60836,379\n60837,527\n60838,1531\n60839,1381\n60840,72\n60841,83\n60842,269\n60843,393\n60844,83\n60845,298\n60846,485\n60847,1531\n60848,83\n60850,60851\n60852,862\n60853,72\n60854,83\n60855,1392\n60855,21442\n60856,360\n60857,330\n60857,349\n60857,783\n60857,973\n60857,2572\n60857,3538\n60858,4594\n60859,872\n60860,859\n60861,1531\n60863,60864\n60863,128099\n60865,3846\n60866,446\n60867,72\n60868,344\n60869,285\n60870,147\n60870,1265\n60870,1266\n60870,1370\n60870,5212\n60871,252\n60872,1673\n60873,1462\n60873,8537\n60874,1179\n60874,1305\n60874,2701\n60875,1531\n60876,22\n60876,861\n60876,893\n60877,2775\n60878,447\n60879,60880\n60879,70899\n60879,107268\n60879,171947\n60881,1983\n60882,60883\n60884,1531\n60885,97\n60886,104\n60886,134\n60886,135\n60886,136\n60886,137\n60886,138\n60886,557\n60886,1368\n60886,1939\n60886,2105\n60887,30236\n60888,18726\n60889,163\n60890,72\n60891,151\n60891,911\n60892,602\n60893,602\n60894,269\n60895,72\n60896,1118\n60897,1955\n60898,147\n60900,305\n60900,1544\n60901,30\n60902,10\n60902,31977\n60904,60905\n60904,63564\n60904,73146\n60904,93475\n60904,98006\n60904,102853\n60904,104591\n60904,112606\n60904,126313\n60904,144661\n60904,158477\n60904,168648\n60904,176729\n60904,217570\n60904,231196\n60904,253441\n60906,393\n60907,72\n60908,68\n60908,2512\n60908,7155\n60908,221300\n60909,187\n60909,302\n60909,326\n60910,2506\n60911,349\n60912,1531\n60913,310\n60913,503\n60913,874\n60914,602\n60915,60916\n60917,72\n60918,206\n60919,10\n60919,113156\n60920,72\n60921,602\n60922,302\n60923,52\n60923,175\n60924,862\n60925,801\n60925,5547\n60926,3\n60927,1531\n60929,557\n60930,1368\n60931,4980\n60932,44\n60933,72\n60934,602\n60935,60936\n60937,1140\n60937,2443\n60938,7652\n60939,83\n60940,10\n60941,72\n60942,60943\n60942,126293\n60944,7117\n60945,16045\n60946,72\n60947,60948\n60947,123217\n60947,125479\n60947,136645\n60949,104\n60950,1267\n60951,704\n60952,72\n60953,1531\n60954,225\n60955,72\n60956,72\n60957,1140\n60957,5547\n60958,1419\n60959,30\n60960,72\n60961,233\n60962,872\n60963,346\n60964,21944\n60965,712\n60966,21944\n60967,149\n60967,622\n60968,72\n60969,72\n60970,60971\n60972,60973\n60974,346\n60975,588\n60975,590\n60976,72\n60977,788\n60978,366\n60979,72\n60980,366\n60981,366\n60982,366\n60983,366\n60984,77\n60985,366\n60987,366\n60988,366\n60989,366\n60990,366\n60991,366\n60992,366\n60993,366\n60994,2319\n60995,366\n60996,60997\n60998,72\n60999,355\n61000,61001\n61002,138\n61003,346\n61004,289\n61004,290\n61004,714\n61004,1962\n61004,2008\n61004,94134\n61004,111142\n61005,3451\n61005,3452\n61006,48\n61007,202\n61007,251\n61008,861\n61009,261\n61009,1419\n61010,30\n61011,527\n61012,1179\n61012,1305\n61013,1531\n61014,1531\n61015,61016\n61017,61018\n61020,30\n61021,1220\n61021,1222\n61022,217\n61024,26\n61024,59\n61025,330\n61026,676\n61027,579\n61027,2116\n61028,1983\n61029,918\n61030,2867\n61030,22880\n61031,2944\n61032,298\n61033,485\n61034,718\n61035,873\n61036,6119\n61037,47\n61037,2469\n61038,61039\n61038,194653\n61038,243023\n61040,14989\n61043,7698\n61044,1531\n61045,1983\n61046,1858\n61047,1860\n61048,32\n61048,392\n61048,1151\n61049,745\n61050,1707\n61051,1127\n61052,83\n61053,336\n61053,586\n61053,1353\n61053,1579\n61053,2775\n61054,1551\n61056,58\n61057,46\n61058,843\n61059,1353\n61060,1323\n61061,102\n61062,1326\n61063,408\n61065,1707\n61066,256\n61067,647\n61068,344\n61070,1001\n61071,1247\n61071,30331\n61072,640\n61073,811\n61074,346\n61075,1858\n61076,1860\n61077,500\n61078,1962\n61079,1052\n61080,1882\n61081,2775\n61082,54\n61083,292\n61083,1449\n61083,1572\n61083,1722\n61083,3367\n61084,481\n61085,657\n61085,743\n61085,6068\n61085,13136\n61086,1531\n61087,97\n61088,7757\n61089,278\n61089,392\n61089,431\n61089,435\n61089,589\n61089,631\n61089,671\n61089,818\n61089,838\n61089,1014\n61089,1130\n61089,1149\n61089,1326\n61089,1844\n61089,2045\n61089,2373\n61089,3135\n61091,15573\n61092,195\n61092,5101\n61092,5103\n61092,31346\n61093,2775\n61094,34\n61094,35\n61094,536\n61095,15\n61097,581\n61098,1072\n61099,1724\n61100,489\n61102,557\n61102,707\n61102,1326\n61103,206\n61104,1715\n61105,775\n61107,298\n61109,485\n61110,240\n61110,3135\n61111,980\n61111,1096\n61112,718\n61113,356\n61114,61115\n61116,1019\n61117,1274\n61117,1858\n61118,72\n61119,1326\n61121,379\n61121,536\n61121,1284\n61122,72\n61123,442\n61124,602\n61125,885\n61126,187\n61127,885\n61127,13704\n61128,346\n61129,58\n61130,46\n61131,931\n61132,147\n61133,22\n61134,97\n61135,779\n61135,68069\n61136,1140\n61136,5547\n61137,66\n61138,980\n61139,972\n61139,973\n61140,20813\n61141,1007\n61142,392\n61142,697\n61143,79\n61144,1140\n61144,1240\n61144,1465\n61145,346\n61146,577\n61147,3804\n61148,392\n61148,1949\n61149,61150\n61151,644\n61152,649\n61153,718\n61154,21944\n61155,1172\n61156,72\n61157,344\n61158,285\n61160,222\n61162,336\n61163,1133\n61164,72\n61165,72\n61166,1127\n61166,1893\n61166,49057\n61166,81070\n61167,56\n61167,685\n61167,1319\n61168,849\n61169,356\n61170,195\n61171,477\n61172,4039\n61173,3413\n61174,106\n61174,538\n61174,1531\n61174,1634\n61175,346\n61176,259\n61176,4039\n61178,392\n61179,137\n61180,893\n61180,1289\n61181,1983\n61182,349\n61182,697\n61182,1769\n61183,287\n61183,809\n61184,1707\n61185,298\n61186,485\n61187,1977\n61187,1978\n61188,1033\n61189,3148\n61190,346\n61191,211\n61192,158\n61198,58\n61199,46\n61202,596\n61202,779\n61202,1135\n61203,1707\n61204,1749\n61205,694\n61206,240\n61207,278\n61208,356\n61208,3258\n61209,457\n61210,4\n61210,5\n61211,77\n61213,32\n61213,71\n61213,611\n61213,690\n61213,788\n61213,932\n61213,1113\n61213,1133\n61213,1319\n61213,1436\n61213,66297\n61214,1132\n61215,781\n61216,298\n61217,485\n61218,58\n61219,3321\n61221,30\n61222,58\n61223,46\n61224,1803\n61225,1639\n61226,1579\n61227,298\n61228,1634\n61230,500\n61232,1962\n61233,1052\n61234,1882\n61235,2775\n61236,54\n61238,72\n61239,10\n61239,192\n61240,140\n61240,1052\n61240,1127\n61240,1579\n61240,1639\n61240,1893\n61240,2312\n61240,6695\n61241,298\n61242,485\n61243,657\n61243,718\n61244,217\n61245,452\n61246,83\n61247,872\n61248,58\n61249,46\n61250,79\n61252,298\n61253,485\n61254,217\n61255,292\n61255,338\n61255,4039\n61256,58\n61257,46\n61258,1231\n61259,50\n61259,79\n61259,137\n61260,2506\n61261,240\n61262,305\n61263,48\n61264,2506\n61265,592\n61266,61267\n61268,298\n61269,485\n61270,207\n61271,30\n61272,589\n61273,3872\n61274,1608\n61275,217\n61275,222\n61276,61277\n61279,1132\n61280,1238\n61281,781\n61282,8270\n61283,298\n61284,485\n61285,20\n61286,536\n61286,697\n61287,83\n61288,18726\n61289,1983\n61290,1467\n61291,647\n61292,344\n61293,30\n61294,252\n61294,516\n61294,1220\n61294,1222\n61295,61296\n61295,120471\n61295,151779\n61295,157985\n61295,168541\n61297,163\n61298,676\n61299,30\n61300,298\n61301,485\n61302,61303\n61304,1983\n61305,240\n61306,390\n61308,30\n61310,477\n61311,1323\n61312,102\n61313,1326\n61314,408\n61315,1983\n61316,21944\n61317,760\n61318,1631\n61319,455\n61321,483\n61322,2424\n61323,1983\n61324,240\n61324,269\n61324,640\n61324,760\n61324,818\n61324,862\n61324,920\n61324,67995\n61325,72\n61327,861\n61328,72\n61329,30\n61330,195\n61331,1531\n61332,1579\n61333,663\n61333,664\n61334,1227\n61334,1229\n61335,19443\n61336,119\n61336,278\n61336,364\n61336,372\n61336,389\n61336,417\n61336,455\n61336,525\n61336,805\n61336,907\n61336,1085\n61336,1298\n61336,1718\n61336,1801\n61336,1881\n61336,2266\n61336,2590\n61336,13575\n61337,151\n61338,13136\n61339,30\n61340,72\n61341,1289\n61343,479\n61344,577\n61345,907\n61345,1284\n61346,459\n61347,1871\n61348,301\n61348,304\n61348,752\n61348,968\n61349,1127\n61350,843\n61351,718\n61352,2367\n61353,918\n61354,586\n61354,663\n61354,664\n61355,222\n61355,1881\n61355,18831\n61356,415\n61356,493\n61356,868\n61356,1363\n61356,1955\n61357,2646\n61358,356\n61359,240\n61359,372\n61359,932\n61359,1001\n61359,1479\n61360,195\n61360,269\n61360,337\n61360,1181\n61361,15068\n61362,255\n61363,147\n61364,206\n61366,151\n61368,58\n61369,46\n61370,1881\n61372,2421\n61373,83\n61374,13980\n61375,2048\n61376,783\n61377,1639\n61378,1579\n61379,158\n61380,1639\n61381,1579\n61382,1639\n61383,1579\n61385,1639\n61386,1579\n61387,602\n61388,2867\n61388,2868\n61388,22880\n61389,3653\n61390,61391\n61393,305\n61394,158\n61396,171\n61397,61398\n61399,2506\n61400,493\n61401,61402\n61403,647\n61403,991\n61403,1188\n61403,1267\n61403,1287\n61403,1659\n61403,2312\n61403,13538\n61405,19443\n61406,298\n61407,31977\n61408,2931\n61409,479\n61409,1980\n61410,225\n61411,240\n61411,1010\n61412,61413\n61415,861\n61416,115\n61416,118\n61417,72\n61418,298\n61419,485\n61420,8719\n61421,138\n61422,557\n61423,865\n61424,137\n61425,217\n61425,1417\n61426,118\n61426,4597\n61427,21944\n61428,8719\n61429,138\n61430,865\n61431,557\n61432,137\n61433,118\n61433,4597\n61434,21944\n61435,8719\n61436,138\n61437,865\n61438,557\n61439,137\n61440,118\n61440,4597\n61441,21944\n61442,8719\n61443,138\n61444,865\n61445,557\n61446,137\n61447,118\n61447,4597\n61448,21944\n61449,861\n61450,422\n61451,83\n61452,72\n61453,422\n61454,422\n61455,72\n61456,422\n61457,422\n61458,422\n61459,422\n61460,809\n61461,676\n61462,251\n61463,72\n61464,298\n61465,647\n61466,344\n61468,72\n61469,79\n61470,72\n61470,167\n61470,588\n61470,590\n61471,250\n61471,1684\n61472,1007\n61473,72\n61474,1188\n61475,72\n61476,596\n61477,660\n61477,1871\n61478,6068\n61479,45024\n61480,663\n61480,664\n61481,72\n61482,187\n61483,1119\n61484,273\n61484,274\n61485,644\n61486,647\n61487,344\n61488,83\n61489,647\n61490,344\n61491,392\n61491,697\n61491,3260\n61492,2506\n61494,779\n61495,3413\n61496,1266\n61496,1776\n61497,3989\n61498,647\n61499,344\n61500,298\n61501,485\n61502,557\n61503,557\n61504,557\n61505,72\n61507,72\n61508,158\n61509,215\n61509,1016\n61509,1212\n61509,1257\n61509,1882\n61510,3094\n61511,86\n61511,167\n61511,240\n61511,301\n61511,372\n61511,567\n61511,589\n61511,605\n61511,615\n61511,631\n61511,720\n61511,801\n61511,907\n61511,968\n61511,972\n61511,973\n61511,1010\n61511,1122\n61511,1124\n61511,1140\n61511,1167\n61511,1231\n61511,1241\n61511,1284\n61511,1298\n61511,1309\n61511,1436\n61511,1522\n61511,1544\n61511,1564\n61511,1782\n61511,1785\n61511,1807\n61511,1818\n61511,1837\n61511,1893\n61511,1955\n61511,2083\n61511,2191\n61511,2372\n61511,2557\n61511,2620\n61511,2775\n61511,2979\n61511,3193\n61511,3207\n61511,3218\n61511,20359\n61512,1707\n61513,349\n61514,932\n61517,61518\n61519,61518\n61520,1858\n61521,1860\n61522,10\n61523,13\n61523,450\n61523,611\n61523,8854\n61523,255750\n61524,602\n61525,3069\n61526,640\n61527,10\n61528,1133\n61529,346\n61530,309\n61530,310\n61531,61532\n61533,83\n61534,61535\n61537,3246\n61537,3247\n61538,61539\n61540,24332\n61541,1858\n61542,1860\n61543,106\n61544,72\n61545,7652\n61546,932\n61546,1016\n61547,536\n61548,393\n61549,346\n61550,72\n61551,61552\n61553,72\n61554,72\n61555,211\n61555,972\n61556,72\n61557,61558\n61559,346\n61560,346\n61561,349\n61562,72\n61563,2048\n61564,3999\n61565,72\n61566,22\n61566,2017\n61567,1235\n61567,1335\n61568,2506\n61569,392\n61570,602\n61571,298\n61572,485\n61573,30236\n61574,254\n61575,7360\n61576,306\n61576,307\n61577,10\n61577,113156\n61578,273\n61578,274\n61579,1882\n61580,346\n61581,61582\n61583,61584\n61585,44\n61586,366\n61587,333\n61587,346\n61587,366\n61588,9598\n61589,225\n61590,8884\n61591,298\n61592,589\n61593,1175\n61593,22880\n61594,1085\n61595,6051\n61596,81\n61598,30\n61599,644\n61600,30\n61601,261\n61603,7416\n61604,417\n61605,233\n61606,136\n61609,61610\n61611,61612\n61611,63525\n61613,366\n61614,366\n61615,366\n61616,366\n61617,366\n61618,366\n61619,366\n61620,355\n61621,10\n61622,72\n61623,8598\n61624,30\n61625,19\n61625,743\n61625,749\n61626,1803\n61626,118336\n61627,298\n61628,485\n61629,19\n61629,56\n61629,588\n61629,590\n61630,1132\n61631,907\n61632,697\n61634,83\n61635,61636\n61637,2205\n61637,2206\n61638,61639\n61640,61641\n61640,63860\n61640,217844\n61640,227703\n61640,264709\n61643,2116\n61644,18726\n61646,163\n61647,1515\n61648,2646\n61649,240\n61650,581\n61651,602\n61652,784\n61653,61654\n61655,298\n61656,485\n61657,158\n61657,779\n61658,333\n61659,1531\n61661,1052\n61662,274\n61662,1368\n61663,515\n61664,872\n61665,219\n61665,273\n61665,302\n61665,422\n61665,481\n61665,483\n61665,1010\n61665,1238\n61665,1353\n61665,1580\n61665,1891\n61665,2168\n61665,2210\n61665,2553\n61665,4237\n61665,182162\n61666,818\n61667,15573\n61669,1368\n61671,61672\n61673,2506\n61674,2353\n61675,63\n61676,1608\n61677,1509\n61678,2424\n61679,104\n61679,136\n61679,225\n61679,248\n61679,953\n61679,1179\n61679,1368\n61679,1939\n61679,5405\n61679,7270\n61680,676\n61681,602\n61682,718\n61683,22\n61683,269\n61683,861\n61684,50\n61685,794\n61686,298\n61687,485\n61688,248\n61689,83\n61690,195\n61691,433\n61692,694\n61692,704\n61692,66297\n61693,187\n61694,326\n61694,2443\n61695,2506\n61697,1368\n61698,2506\n61699,30\n61700,3413\n61701,61702\n61703,994\n61703,21944\n61704,261\n61705,6682\n61706,872\n61707,72\n61708,1858\n61709,1860\n61710,61711\n61710,62767\n61710,66470\n61710,78005\n61710,115017\n61710,120331\n61712,18726\n61713,163\n61715,30\n61716,1001\n61717,3804\n61718,1556\n61719,315\n61720,72\n61721,344\n61722,285\n61723,14366\n61724,15748\n61725,479\n61726,647\n61727,344\n61728,647\n61729,344\n61730,1381\n61730,2292\n61731,72\n61732,344\n61733,285\n61734,192\n61735,647\n61736,344\n61737,31896\n61738,1844\n61739,50\n61740,346\n61741,349\n61742,61743\n61744,1085\n61745,30\n61746,389\n61747,1608\n61748,1127\n61749,1858\n61750,1860\n61751,422\n61752,422\n61753,1117\n61754,1608\n61755,269\n61756,2367\n61757,61758\n61757,87660\n61757,117526\n61759,61760\n61761,1467\n61762,422\n61763,2646\n61764,30766\n61765,497\n61766,3193\n61767,676\n61768,1479\n61769,932\n61770,328\n61771,455\n61772,72\n61773,309\n61773,310\n61774,305\n61775,3474\n61776,72\n61777,344\n61778,285\n61779,187\n61780,3538\n61781,298\n61782,485\n61783,387\n61785,61786\n61787,160\n61788,3413\n61789,72\n61790,344\n61791,285\n61792,298\n61793,485\n61794,72\n61795,344\n61796,285\n61797,61798\n61799,72\n61800,344\n61801,285\n61802,72\n61803,344\n61804,285\n61805,72\n61806,1415\n61807,1033\n61808,30\n61809,13546\n61811,2506\n61812,1655\n61813,61814\n61813,63835\n61813,70638\n61815,44\n61816,61817\n61818,298\n61819,485\n61820,2351\n61821,346\n61822,794\n61823,349\n61824,1133\n61824,2006\n61825,1235\n61825,1335\n61826,104\n61827,483\n61828,72\n61829,344\n61830,285\n61831,18726\n61832,163\n61833,515\n61835,3069\n61836,61837\n61838,30\n61839,57842\n61840,7\n61840,211\n61841,72\n61842,344\n61843,285\n61844,233\n61845,393\n61847,676\n61848,240\n61849,107\n61850,2416\n61850,2417\n61851,292\n61852,338\n61853,298\n61854,1133\n61855,3538\n61856,355\n61857,187\n61858,61859\n61860,3413\n61861,54064\n61862,1980\n61862,8991\n61863,215\n61864,30\n61864,640\n61864,1085\n61864,1871\n61865,298\n61866,298\n61867,485\n61868,72\n61869,344\n61870,285\n61871,298\n61872,485\n61873,61874\n61875,19413\n61876,1323\n61877,102\n61878,1326\n61879,408\n61880,907\n61881,349\n61882,10\n61883,61884\n61883,90542\n61883,107321\n61885,581\n61886,859\n61887,298\n61888,485\n61890,872\n61892,872\n61893,72\n61894,344\n61895,285\n61896,372\n61897,72\n61898,344\n61899,285\n61901,596\n61902,596\n61903,366\n61904,366\n61905,366\n61906,366\n61907,366\n61908,366\n61909,366\n61910,17334\n61911,1707\n61912,58\n61912,1167\n61915,605\n61916,366\n61917,1140\n61917,5547\n61918,83\n61918,17263\n61919,2173\n61920,298\n61921,485\n61922,346\n61923,718\n61924,298\n61925,485\n61926,745\n61927,14989\n61928,994\n61929,2506\n61930,483\n61931,602\n61932,61933\n61934,980\n61935,872\n61936,872\n61937,298\n61938,485\n61939,211\n61940,433\n61941,111\n61942,640\n61943,120\n61943,588\n61943,590\n61943,1419\n61944,1082\n61945,61946\n61947,30\n61948,30\n61949,1962\n61950,298\n61951,485\n61952,192\n61952,3872\n61953,301\n61954,72\n61955,344\n61956,285\n61957,61958\n61959,477\n61960,207\n61961,1631\n61962,2506\n61963,255\n61964,872\n61965,605\n61966,30\n61967,44725\n61968,34\n61968,35\n61968,167\n61968,187\n61968,217\n61968,222\n61968,283\n61968,455\n61968,631\n61968,657\n61968,713\n61968,1019\n61968,1210\n61968,1635\n61968,1807\n61968,1871\n61968,2266\n61968,2775\n61968,6789\n61968,8235\n61968,20771\n61969,1556\n61970,861\n61971,22\n61972,61973\n61974,289\n61974,290\n61974,714\n61975,48\n61976,81\n61977,1983\n61978,1983\n61979,61980\n61981,1983\n61985,586\n61986,34\n61986,35\n61987,25873\n61988,61989\n61990,1566\n61991,1019\n61992,393\n61993,406\n61994,217\n61994,1007\n61994,1289\n61995,477\n61996,1544\n61997,557\n61998,557\n61999,557\n62000,167\n62002,557\n62003,862\n62004,62005\n62007,6027\n62008,158\n62009,298\n62010,485\n62011,957\n62011,1815\n62012,2048\n62013,932\n62014,62015\n62016,1556\n62017,861\n62018,22\n62019,431\n62019,631\n62020,447\n62021,298\n62022,485\n62023,10\n62024,972\n62025,1556\n62026,861\n62027,22\n62028,72\n62029,527\n62030,647\n62031,1454\n62032,39247\n62033,99\n62034,62035\n62036,602\n62037,62038\n62039,602\n62040,602\n62041,602\n62042,62043\n62044,62043\n62045,62043\n62046,62043\n62047,62043\n62048,918\n62049,106\n62050,298\n62051,1381\n62051,1551\n62052,602\n62053,17588\n62054,62055\n62056,389\n62057,366\n62058,366\n62059,366\n62060,602\n62062,44\n62063,366\n62064,422\n62065,422\n62066,422\n62067,422\n62068,422\n62069,422\n62070,422\n62071,202\n62071,203\n62072,477\n62073,62074\n62075,171\n62076,289\n62076,290\n62077,422\n62078,217\n62078,1417\n62079,422\n62080,422\n62081,422\n62082,4453\n62083,1983\n62084,62085\n62086,493\n62087,134\n62088,34\n62088,35\n62089,2210\n62089,4237\n62089,182162\n62090,62091\n62092,298\n62093,62094\n62096,994\n62097,222\n62098,15573\n62099,292\n62100,294\n62101,296\n62102,298\n62103,5547\n62104,312\n62104,5547\n62105,217\n62106,62107\n62106,244080\n62109,994\n62110,8992\n62111,585\n62112,255\n62113,602\n62114,298\n62115,485\n62116,10\n62116,2146\n62117,3585\n62118,366\n62119,233\n62120,366\n62121,62122\n62123,366\n62124,366\n62125,602\n62126,275\n62127,62128\n62129,50\n62129,309\n62129,310\n62129,1566\n62130,62131\n62132,62131\n62133,366\n62134,1411\n62135,175\n62136,62137\n62139,2995\n62140,62141\n62142,1572\n62143,15573\n62144,7\n62145,18726\n62146,62147\n62148,163\n62149,333\n62149,346\n62149,366\n62149,1247\n62150,355\n62152,1860\n62153,1247\n62154,298\n62155,485\n62156,4039\n62157,994\n62158,298\n62159,485\n62160,298\n62160,1241\n62160,1436\n62160,2083\n62160,9024\n62161,1058\n62163,515\n62163,5130\n62164,306\n62164,307\n62166,298\n62167,485\n62168,298\n62169,485\n62171,2372\n62172,467\n62172,571\n62172,868\n62173,255\n62174,240\n62175,62176\n62177,30\n62178,62179\n62180,62181\n62182,298\n62183,485\n62184,158\n62185,62186\n62187,83\n62188,392\n62189,500\n62190,30\n62191,1127\n62192,104\n62192,134\n62192,2105\n62193,649\n62194,30\n62195,406\n62195,1033\n62195,1474\n62195,1849\n62195,2782\n62195,3876\n62195,6661\n62196,652\n62197,3370\n62197,14453\n62199,298\n62200,485\n62201,62202\n62203,671\n62204,104\n62204,875\n62204,1117\n62204,2191\n62204,148742\n62205,485\n62207,577\n62208,333\n62208,59021\n62209,3003\n62210,104\n62210,137\n62211,79\n62211,500\n62211,1749\n62213,602\n62214,2209\n62215,30331\n62216,310\n62217,3161\n62218,1556\n62219,861\n62220,22\n62221,2590\n62222,178\n62223,393\n62224,30\n62225,392\n62226,60576\n62227,160\n62228,298\n62229,485\n62230,298\n62231,485\n62232,3345\n62233,676\n62234,1033\n62234,1789\n62235,83\n62236,1893\n62237,304\n62238,83\n62239,852\n62240,30\n62241,217\n62241,1417\n62242,581\n62243,62244\n62245,1096\n62245,3555\n62247,5405\n62248,1962\n62249,1983\n62250,875\n62251,298\n62252,485\n62253,1983\n62254,1983\n62255,1983\n62256,1417\n62257,489\n62258,1983\n62259,1983\n62260,58\n62263,392\n62264,289\n62264,657\n62264,94134\n62265,439\n62265,1776\n62266,187\n62267,200\n62268,298\n62269,485\n62271,62272\n62273,140\n62274,240\n62275,309\n62275,310\n62276,752\n62277,158\n62278,79\n62279,302\n62281,422\n62282,62283\n62284,62283\n62285,3413\n62286,83\n62286,217\n62286,222\n62286,313\n62286,634\n62286,694\n62286,752\n62286,849\n62286,1419\n62286,1454\n62286,2224\n62286,5591\n62286,188791\n62287,1983\n62288,97\n62289,217\n62289,1417\n62290,23783\n62292,298\n62293,485\n62295,298\n62296,485\n62301,422\n62302,209\n62302,579\n62302,687\n62302,861\n62302,893\n62302,1374\n62303,2205\n62303,2206\n62303,2210\n62303,4237\n62304,1506\n62305,54\n62306,3872\n62307,422\n62308,577\n62309,557\n62310,71\n62311,62312\n62313,1776\n62313,4611\n62314,809\n62315,644\n62316,852\n62317,1983\n62318,178\n62318,4158\n62318,48912\n62318,62319\n62318,103739\n62318,129903\n62318,143528\n62318,158562\n62318,216044\n62318,216515\n62318,220934\n62318,237276\n62319,852\n62320,356\n62321,30\n62322,217\n62322,872\n62322,1417\n62322,1844\n62323,200\n62323,248\n62324,557\n62325,30\n62326,23783\n62327,1608\n62328,1556\n62329,68\n62329,433\n62329,1634\n62330,2793\n62331,868\n62332,8180\n62336,697\n62337,1434\n62339,147\n62340,1305\n62341,4190\n62342,920\n62344,62345\n62346,388\n62348,130\n62351,107\n62352,30\n62353,22\n62353,442\n62354,5101\n62354,15119\n62355,1634\n62356,622\n62356,31977\n62357,1983\n62358,298\n62359,485\n62360,6506\n62361,364\n62361,714\n62362,872\n62363,298\n62364,485\n62365,271\n62366,55849\n62367,48\n62368,4\n62368,5\n62369,1977\n62369,1978\n62370,200\n62372,406\n62373,868\n62374,493\n62375,1749\n62376,349\n62377,261\n62378,1515\n62379,62380\n62381,8149\n62382,160\n62382,222\n62383,34\n62383,217\n62383,536\n62384,22\n62384,1146\n62385,1285\n62386,592\n62387,1274\n62388,1776\n62389,298\n62390,485\n62391,298\n62392,485\n62393,233\n62393,3135\n62395,1033\n62396,30\n62397,72\n62398,1556\n62399,861\n62400,22\n62401,493\n62402,167\n62403,163\n62404,973\n62405,217\n62405,1417\n62406,34\n62406,35\n62407,79\n62407,1749\n62409,2828\n62410,6068\n62411,30\n62411,63\n62411,1309\n62412,467\n62413,392\n62414,697\n62414,1240\n62415,1240\n62416,1033\n62417,15\n62417,292\n62417,397\n62417,668\n62417,745\n62423,23783\n62424,500\n62425,298\n62426,485\n62427,18726\n62429,3555\n62430,79\n62432,3\n62433,1181\n62434,30\n62434,192\n62434,298\n62434,862\n62434,1085\n62434,1462\n62434,7124\n62434,8537\n62435,163\n62436,1707\n62438,58\n62439,431\n62439,762\n62439,103860\n62440,83\n62441,2411\n62442,158\n62443,743\n62444,200\n62444,772\n62444,1332\n62445,298\n62446,485\n62447,209\n62448,9015\n62449,1231\n62450,248\n62451,2979\n62452,1579\n62454,62455\n62456,62455\n62457,138\n62457,195\n62457,644\n62457,752\n62457,907\n62457,1619\n62457,1973\n62457,2244\n62457,60576\n62458,1033\n62459,222\n62459,389\n62459,634\n62459,657\n62459,1072\n62459,33508\n62460,247\n62461,868\n62461,15573\n62461,75912\n62462,1983\n62463,1052\n62464,209\n62465,62466\n62468,1133\n62469,192\n62470,8\n62470,273\n62470,274\n62470,372\n62470,485\n62470,581\n62470,647\n62470,668\n62470,675\n62470,827\n62470,1058\n62470,1313\n62470,3612\n62471,1619\n62472,704\n62473,1007\n62474,1133\n62475,62476\n62475,70423\n62475,115497\n62475,122820\n62475,129407\n62475,129622\n62475,130440\n62475,155568\n62477,217\n62477,1417\n62478,2979\n62479,868\n62481,275\n62482,372\n62482,588\n62482,590\n62482,631\n62482,714\n62482,805\n62482,1119\n62482,1282\n62482,1402\n62482,1608\n62482,1818\n62482,2210\n62482,2620\n62482,2797\n62482,2989\n62482,2991\n62482,3507\n62482,4237\n62482,4752\n62482,57802\n62482,62482\n62482,143414\n62482,143415\n62482,257474\n62482,261162\n62483,71\n62484,1085\n62484,1133\n62484,3474\n62484,4504\n62486,535\n62487,1849\n62487,32784\n62487,189128\n62488,302\n62488,579\n62488,861\n62489,852\n62490,690\n62491,302\n62491,2116\n62492,192\n62492,1181\n62493,160\n62494,83\n62495,2506\n62497,338\n62497,652\n62497,835\n62497,1052\n62497,1127\n62497,1381\n62497,1551\n62497,1893\n62497,2626\n62498,107\n62500,9098\n62501,22\n62502,30\n62504,2744\n62504,4222\n62505,2979\n62508,72\n62509,71\n62509,86\n62509,304\n62509,356\n62509,563\n62509,599\n62509,611\n62509,615\n62509,631\n62509,717\n62509,788\n62509,811\n62509,852\n62509,859\n62509,1085\n62509,1309\n62509,1368\n62509,1541\n62509,1740\n62509,1749\n62509,1782\n62509,6068\n62509,7155\n62510,477\n62511,1001\n62512,209\n62513,1707\n62514,72\n62515,1181\n62517,1298\n62519,30\n62520,30\n62521,209\n62523,298\n62524,485\n62525,136\n62526,22\n62526,760\n62526,2224\n62527,1707\n62528,62529\n62528,87348\n62528,114532\n62530,79\n62530,406\n62530,620\n62530,1515\n62531,875\n62532,72\n62533,920\n62534,2979\n62535,62536\n62535,107257\n62537,151\n62538,333\n62539,536\n62539,781\n62539,2646\n62539,2944\n62539,7698\n62540,62541\n62542,1608\n62543,2506\n62544,72\n62545,344\n62546,285\n62547,2073\n62548,62549\n62550,473\n62551,640\n62552,298\n62553,485\n62554,6068\n62555,8149\n62556,104\n62557,483\n62558,62559\n62560,178\n62560,240\n62560,435\n62560,62561\n62562,393\n62563,22\n62563,217\n62563,1417\n62563,2017\n62563,17309\n62564,744\n62565,72\n62566,332\n62568,83\n62569,360\n62571,178\n62572,62573\n62572,105992\n62572,116322\n62574,30\n62575,1623\n62576,920\n62577,247\n62578,62579\n62580,62581\n62582,251\n62582,1512\n62582,5992\n62583,107\n62584,62585\n62586,298\n62587,485\n62588,602\n62589,106\n62590,72\n62593,745\n62593,2443\n62594,298\n62595,485\n62597,1177\n62597,2334\n62598,328\n62599,360\n62600,2266\n62600,18831\n62601,72\n62602,6726\n62603,874\n62604,801\n62604,1140\n62605,500\n62605,622\n62606,314\n62607,72\n62608,809\n62608,1313\n62608,2828\n62610,586\n62611,3260\n62612,364\n62613,298\n62614,485\n62615,1414\n62616,358\n62616,1096\n62616,1326\n62617,83\n62618,5375\n62619,1132\n62620,1983\n62621,781\n62622,72\n62623,949\n62623,1419\n62624,26\n62624,59\n62624,21944\n62625,872\n62626,779\n62626,68069\n62627,209\n62628,338\n62629,1983\n62630,779\n62631,10\n62632,192\n62632,779\n62633,306\n62633,307\n62633,333\n62633,1181\n62634,676\n62635,676\n62636,5440\n62637,72\n62638,344\n62639,285\n62640,557\n62641,557\n62642,704\n62643,269\n62644,2979\n62645,1707\n62646,1773\n62647,62648\n62647,63183\n62647,66111\n62647,98743\n62647,109742\n62647,130757\n62649,72\n62650,62651\n62652,83\n62653,62654\n62655,187\n62656,72\n62657,62658\n62657,233837\n62659,2506\n62660,171\n62661,79\n62662,21944\n62663,704\n62664,3069\n62665,62666\n62667,390\n62667,1363\n62668,187\n62669,687\n62670,30\n62671,389\n62672,192\n62673,1983\n62674,1983\n62675,1117\n62676,1603\n62677,62677\n62679,704\n62680,1284\n62681,1566\n62682,392\n62683,137\n62684,3413\n62685,81\n62686,158\n62686,406\n62686,620\n62686,1181\n62686,1425\n62686,102560\n62687,1370\n62688,62689\n62690,3653\n62691,1414\n62692,62693\n62694,275\n62695,182\n62696,1265\n62696,1266\n62697,20004\n62698,72\n62699,702\n62699,703\n62700,62701\n62702,192\n62704,3538\n62705,54\n62705,5906\n62706,10\n62707,62708\n62709,62710\n62711,5547\n62712,2671\n62713,62714\n62715,5440\n62716,62717\n62718,35687\n62719,62720\n62721,589\n62722,422\n62723,6068\n62724,62725\n62726,21944\n62727,704\n62728,62729\n62730,1238\n62731,366\n62732,3246\n62732,3247\n62733,366\n62734,18726\n62735,163\n62736,366\n62738,1452\n62739,37\n62739,1782\n62740,77\n62741,1509\n62742,102\n62743,233\n62744,62745\n62744,128545\n62746,130\n62747,355\n62749,340\n62750,366\n62751,126\n62752,83\n62753,1326\n62754,118\n62754,333\n62755,585\n62756,349\n62757,209\n62758,1326\n62758,1531\n62759,1436\n62760,306\n62760,307\n62761,676\n62762,62763\n62764,1467\n62765,66\n62766,171\n62768,515\n62769,668\n62770,209\n62771,68\n62772,62773\n62774,62775\n62776,62775\n62777,62775\n62778,58\n62779,644\n62781,147\n62782,58\n62783,46\n62784,56\n62785,310\n62786,571\n62787,1419\n62788,1844\n62789,83\n62790,356\n62790,390\n62790,6068\n62790,9457\n62791,62792\n62793,187\n62794,640\n62795,2775\n62796,447\n62798,264\n62798,515\n62798,647\n62798,835\n62798,1147\n62798,1289\n62798,1893\n62798,6695\n62799,207\n62800,1983\n62802,1631\n62803,640\n62804,1509\n62805,891\n62807,19\n62808,55849\n62809,760\n62810,16045\n62811,248\n62812,918\n62813,1414\n62814,518\n62814,1010\n62814,1298\n62814,1300\n62814,1411\n62814,2784\n62815,3413\n62817,97\n62818,209\n62818,489\n62818,827\n62818,2073\n62819,217\n62819,592\n62820,30\n62822,685\n62822,849\n62824,292\n62824,338\n62825,30\n62826,62827\n62828,417\n62830,106\n62831,30\n62833,1323\n62834,102\n62835,1326\n62836,408\n62838,62839\n62840,151\n62841,2260\n62842,1012\n62845,581\n62846,1983\n62847,62848\n62849,1181\n62850,5250\n62852,192\n62852,663\n62852,1089\n62852,3872\n62853,1175\n62854,202\n62854,251\n62855,1119\n62856,47\n62856,2469\n62857,1983\n62859,433\n62859,1634\n62860,515\n62860,1127\n62860,1893\n62860,49057\n62861,388\n62862,195\n62863,209\n62864,62865\n62866,62865\n62867,640\n62868,306\n62868,307\n62868,991\n62868,1220\n62868,1222\n62869,1381\n62870,5213\n62871,102\n62871,1113\n62871,1323\n62872,1707\n62873,2744\n62875,422\n62876,422\n62877,422\n62878,422\n62879,422\n62880,422\n62882,422\n62883,422\n62884,422\n62885,422\n62886,525\n62886,1012\n62886,1119\n62886,1177\n62886,1564\n62886,1818\n62887,422\n62888,1844\n62888,2867\n62888,2868\n62889,663\n62889,664\n62890,1623\n62891,68\n62892,68\n62893,1227\n62893,1229\n62893,21944\n62893,86416\n62894,872\n62896,5405\n62897,1634\n62898,2424\n62899,1019\n62900,4355\n62901,1983\n62902,251\n62904,663\n62905,2979\n62906,356\n62907,298\n62908,818\n62909,1102\n62910,1531\n62911,1983\n62913,62914\n62915,644\n62917,62918\n62919,483\n62920,209\n62921,760\n62921,1858\n62922,62923\n62924,298\n62924,347\n62924,615\n62924,1243\n62924,2367\n62924,7429\n62925,1531\n62926,1287\n62927,10\n62927,11\n62927,50\n62927,79\n62927,195\n62927,252\n62927,272\n62927,305\n62927,485\n62927,602\n62927,920\n62927,1319\n62927,1891\n62927,3209\n62927,4455\n62927,5213\n62927,7117\n62928,171\n62929,298\n62930,485\n62931,32\n62931,41\n62931,58\n62931,264\n62931,309\n62931,310\n62931,328\n62931,344\n62931,390\n62931,439\n62931,455\n62931,538\n62931,649\n62931,779\n62931,784\n62931,872\n62931,877\n62931,973\n62931,1289\n62931,1381\n62931,1436\n62931,1452\n62931,1458\n62931,3695\n62931,16687\n62931,115659\n62931,227669\n62932,167\n62932,349\n62932,808\n62932,1167\n62932,1522\n62932,5301\n62932,6955\n62933,18726\n62934,20\n62935,644\n62936,406\n62937,1474\n62939,163\n62940,644\n62941,247\n62942,50\n62942,305\n62942,516\n62942,920\n62942,22280\n62943,941\n62944,292\n62944,1143\n62944,1453\n62944,1653\n62944,1722\n62945,209\n62946,415\n62946,6487\n62947,62948\n62949,211\n62951,875\n62951,1836\n62952,58\n62953,62954\n62955,941\n62956,628\n62957,200\n62957,248\n62959,1531\n62960,1634\n62961,424\n62963,920\n62964,332\n62964,1119\n62964,6556\n62965,1381\n62966,1634\n62967,424\n62968,30\n62969,717\n62970,240\n62971,205\n62972,209\n62973,30\n62974,83\n62975,2416\n62975,2417\n62976,4094\n62977,1370\n62978,195\n62979,918\n62980,644\n62981,344\n62982,1016\n62982,84257\n62984,996\n62985,47\n62985,2469\n62987,579\n62988,10\n62988,14366\n62988,14483\n62989,27550\n62990,873\n62990,874\n62990,1210\n62991,1983\n62992,298\n62993,485\n62994,392\n62994,1454\n62995,1425\n62997,1769\n62998,287\n62998,349\n62998,3602\n62998,4252\n62999,1467\n63000,63001\n63002,209\n63003,1509\n63004,2697\n63005,2775\n63007,636\n63008,298\n63009,485\n63010,34\n63010,35\n63010,41\n63010,222\n63010,278\n63010,283\n63010,349\n63010,389\n63010,534\n63010,536\n63010,634\n63010,657\n63010,781\n63010,949\n63010,1019\n63010,1072\n63010,1085\n63010,1274\n63010,1467\n63010,1539\n63010,1571\n63010,1718\n63010,1871\n63010,1881\n63010,2168\n63010,2266\n63010,2319\n63010,2424\n63010,2784\n63010,2944\n63010,2995\n63010,3370\n63010,3623\n63010,4594\n63010,5976\n63010,6789\n63010,6888\n63010,7768\n63010,13137\n63010,14453\n63010,15573\n63010,29475\n63011,248\n63012,586\n63013,298\n63014,485\n63015,1836\n63017,2116\n63018,1844\n63019,1983\n63020,918\n63021,1181\n63022,1983\n63023,63024\n63025,1983\n63026,209\n63027,72\n63029,676\n63030,248\n63031,4611\n63032,222\n63032,264\n63033,302\n63033,893\n63034,248\n63035,68\n63036,1888\n63037,818\n63038,941\n63038,2812\n63039,1224\n63040,483\n63041,1871\n63042,209\n63043,63044\n63045,1776\n63046,140\n63047,4411\n63048,586\n63048,1243\n63049,102\n63049,1113\n63049,1323\n63050,83\n63052,1033\n63052,1531\n63053,65\n63054,240\n63054,1955\n63055,1871\n63056,676\n63057,8907\n63058,7652\n63059,388\n63059,14126\n63060,2646\n63061,349\n63062,1001\n63062,3094\n63063,393\n63064,209\n63066,289\n63066,290\n63066,298\n63066,417\n63066,592\n63066,1085\n63066,2296\n63066,94134\n63067,301\n63067,861\n63067,893\n63067,1231\n63067,2979\n63067,3422\n63068,1019\n63071,392\n63072,247\n63073,2979\n63074,417\n63075,83\n63075,852\n63075,3422\n63075,6068\n63075,44725\n63079,3367\n63080,1805\n63081,34\n63081,35\n63081,68\n63081,167\n63081,217\n63081,227\n63081,240\n63081,248\n63081,264\n63081,289\n63081,290\n63081,301\n63081,392\n63081,406\n63081,435\n63081,442\n63081,479\n63081,493\n63081,516\n63081,588\n63081,590\n63081,875\n63081,1010\n63081,1014\n63081,1019\n63081,1085\n63081,1151\n63081,1181\n63081,1210\n63081,1282\n63081,1370\n63081,1462\n63081,1466\n63081,1531\n63081,2671\n63081,2979\n63081,3804\n63081,8537\n63081,94134\n63081,144988\n63083,818\n63084,640\n63085,4672\n63086,273\n63086,274\n63086,313\n63087,9018\n63088,577\n63088,852\n63088,1070\n63089,920\n63090,760\n63091,1983\n63092,209\n63093,5405\n63095,126\n63096,809\n63096,19010\n63097,32\n63097,720\n63097,875\n63097,1117\n63097,1241\n63097,3260\n63097,14458\n63097,76096\n63097,115474\n63098,417\n63099,485\n63100,10\n63101,187\n63102,240\n63102,301\n63102,567\n63102,1160\n63102,1359\n63102,1462\n63102,1785\n63102,1818\n63102,1832\n63102,2620\n63102,5718\n63102,8537\n63103,32\n63106,151\n63107,240\n63107,818\n63108,63109\n63110,393\n63111,2979\n63112,63113\n63114,140\n63115,63116\n63117,298\n63118,485\n63119,217\n63120,83\n63121,301\n63121,2979\n63121,5662\n63122,422\n63123,56\n63124,356\n63124,5591\n63125,20\n63125,536\n63125,647\n63125,1151\n63125,1363\n63125,1571\n63125,2411\n63125,13361\n63125,66500\n63126,192\n63126,406\n63126,620\n63126,779\n63126,1515\n63127,626\n63128,818\n63129,483\n63131,622\n63132,107\n63132,2646\n63133,1836\n63134,3413\n63135,1983\n63136,251\n63136,252\n63136,577\n63136,1105\n63136,1220\n63136,1222\n63136,1429\n63137,3\n63138,83\n63139,63140\n63141,376\n63142,83\n63143,885\n63144,1707\n63145,636\n63146,1181\n63147,63148\n63149,1381\n63149,1551\n63149,1639\n63150,861\n63151,1085\n63153,611\n63154,4611\n63155,63156\n63157,247\n63158,217\n63158,301\n63158,872\n63158,1085\n63159,611\n63159,852\n63160,431\n63161,63162\n63161,153670\n63163,4355\n63164,2411\n63165,652\n63167,1247\n63168,1082\n63169,9195\n63170,79\n63171,298\n63172,5405\n63173,920\n63174,861\n63176,783\n63177,79\n63178,640\n63180,493\n63182,312\n63184,571\n63184,1634\n63185,192\n63185,1243\n63186,571\n63187,772\n63187,1179\n63188,83\n63189,536\n63190,2671\n63191,10\n63192,77\n63193,1319\n63194,217\n63195,1707\n63196,772\n63198,1608\n63199,620\n63200,577\n63202,5440\n63203,1522\n63204,557\n63205,557\n63206,704\n63207,13980\n63208,1707\n63209,24505\n63210,7652\n63211,1983\n63212,349\n63213,269\n63214,805\n63215,1983\n63216,298\n63217,485\n63218,3413\n63219,3085\n63221,63222\n63223,920\n63224,349\n63225,298\n63226,485\n63227,932\n63228,302\n63228,4823\n63228,6303\n63229,298\n63230,485\n63231,340\n63232,178\n63233,79\n63234,1858\n63235,1858\n63236,1860\n63237,1860\n63238,219\n63239,697\n63240,9121\n63241,1556\n63242,861\n63243,22\n63244,120\n63245,704\n63246,271\n63247,72\n63247,1363\n63248,63249\n63250,602\n63251,602\n63252,1858\n63253,1860\n63254,195\n63255,251\n63255,516\n63255,893\n63255,1033\n63256,1634\n63257,424\n63258,298\n63259,485\n63260,63261\n63262,158\n63262,63263\n63264,21944\n63265,298\n63266,485\n63267,63268\n63269,640\n63270,233\n63270,240\n63270,590\n63270,592\n63270,631\n63270,805\n63270,1785\n63270,1818\n63270,2620\n63270,5718\n63271,1983\n63272,862\n63273,328\n63275,184\n63276,30\n63277,366\n63278,107\n63279,104\n63279,134\n63279,135\n63279,137\n63280,63281\n63282,63283\n63284,248\n63285,779\n63286,63287\n63288,63287\n63289,920\n63290,2480\n63291,862\n63292,1181\n63293,63294\n63295,63296\n63297,2351\n63298,147\n63299,63300\n63301,1511\n63301,3069\n63302,907\n63303,3804\n63304,269\n63305,44\n63306,6263\n63307,1522\n63308,275\n63309,7124\n63310,7652\n63311,16045\n63312,9560\n63313,9560\n63314,171\n63315,9121\n63316,1644\n63317,30\n63318,5440\n63319,431\n63320,366\n63321,366\n63322,366\n63323,366\n63324,366\n63325,366\n63326,366\n63327,1634\n63328,273\n63328,274\n63329,104\n63329,136\n63329,200\n63329,254\n63329,442\n63329,636\n63329,953\n63329,1368\n63329,1939\n63330,233\n63331,63332\n63333,872\n63334,63335\n63336,79\n63337,47\n63337,2469\n63338,71\n63338,332\n63338,1821\n63338,21736\n63339,366\n63340,2351\n63341,119\n63341,1298\n63341,4545\n63342,323\n63343,1619\n63344,1590\n63345,211\n63346,355\n63347,439\n63347,1776\n63348,79\n63348,775\n63349,1\n63350,784\n63350,1559\n63350,2209\n63351,252\n63352,72\n63353,385\n63353,1241\n63354,2979\n63355,779\n63355,68069\n63356,7124\n63357,18726\n63358,298\n63359,485\n63360,163\n63361,2205\n63361,33424\n63361,245910\n63362,34\n63362,35\n63362,313\n63363,992\n63364,366\n63365,30\n63366,707\n63368,422\n63369,56\n63370,811\n63370,861\n63370,893\n63372,1326\n63372,14797\n63373,192\n63374,333\n63374,346\n63374,366\n63374,1247\n63375,304\n63375,387\n63375,390\n63375,589\n63375,666\n63375,849\n63375,1363\n63375,1419\n63375,2460\n63375,2590\n63375,3367\n63375,4222\n63375,5591\n63375,21982\n63376,6682\n63377,298\n63378,485\n63379,1659\n63380,298\n63381,485\n63382,298\n63383,485\n63384,433\n63385,473\n63385,8149\n63388,252\n63388,318\n63389,252\n63390,647\n63391,859\n63392,657\n63393,1707\n63394,306\n63394,307\n63395,433\n63396,63397\n63398,640\n63399,63400\n63401,344\n63403,622\n63405,433\n63406,13538\n63408,972\n63409,233\n63410,222\n63410,278\n63410,2775\n63411,186\n63411,240\n63411,818\n63411,1623\n63411,127158\n63413,356\n63413,859\n63413,1285\n63414,2775\n63415,21944\n63416,473\n63417,298\n63418,485\n63419,171\n63420,1122\n63424,868\n63425,439\n63425,579\n63426,89\n63427,1359\n63428,364\n63429,581\n63430,55849\n63431,392\n63432,328\n63432,392\n63432,622\n63432,2266\n63432,9030\n63433,79\n63434,10\n63434,147\n63434,158\n63434,336\n63434,682\n63434,1243\n63434,1512\n63434,2244\n63434,2528\n63434,72439\n63435,364\n63436,668\n63436,843\n63436,1191\n63437,850\n63438,462\n63438,1146\n63438,1949\n63439,55479\n63440,676\n63441,720\n63442,83\n63443,195\n63444,992\n63445,1323\n63446,102\n63447,1326\n63448,408\n63449,1392\n63451,623\n63452,392\n63452,697\n63453,63454\n63455,809\n63456,147\n63457,31237\n63458,217\n63458,1019\n63459,417\n63460,147\n63461,425\n63463,30\n63464,447\n63465,5405\n63466,63467\n63468,63467\n63469,304\n63470,579\n63470,63471\n63472,30331\n63474,13136\n63475,693\n63476,497\n63477,187\n63478,1509\n63479,893\n63480,1818\n63481,346\n63482,30\n63483,206\n63483,1326\n63484,312\n63485,304\n63486,63487\n63488,6682\n63489,3413\n63490,3538\n63491,567\n63491,604\n63491,750\n63491,762\n63492,6726\n63493,302\n63494,107\n63494,151\n63495,3724\n63496,644\n63497,4355\n63498,23010\n63499,439\n63500,433\n63501,63502\n63503,392\n63503,1240\n63504,1619\n63504,13538\n63506,3260\n63509,389\n63510,222\n63511,1634\n63512,206\n63512,435\n63512,2617\n63513,7360\n63514,209\n63516,21944\n63517,7652\n63518,577\n63518,788\n63518,1274\n63519,34\n63519,35\n63519,222\n63519,379\n63519,385\n63519,536\n63519,779\n63519,2944\n63520,178\n63521,2105\n63522,21944\n63523,1531\n63524,209\n63526,6303\n63528,1977\n63528,1978\n63529,422\n63530,422\n63531,422\n63532,1332\n63533,422\n63534,422\n63535,422\n63536,875\n63537,422\n63538,2775\n63539,422\n63540,422\n63541,21944\n63542,240\n63543,349\n63544,980\n63544,1531\n63544,2178\n63544,4545\n63544,16331\n63544,139010\n63545,195\n63546,875\n63546,1454\n63547,1010\n63548,1983\n63549,760\n63550,21944\n63551,485\n63552,30\n63553,31896\n63554,255\n63555,422\n63556,83\n63557,330\n63558,147\n63559,875\n63560,356\n63561,30\n63562,349\n63563,5987\n63565,21944\n63566,843\n63566,3804\n63567,209\n63568,571\n63568,868\n63569,336\n63570,63571\n63570,70056\n63570,98355\n63572,493\n63572,1181\n63572,2867\n63572,2868\n63572,22880\n63573,417\n63574,1118\n63575,117\n63575,200\n63575,2712\n63575,21944\n63576,772\n63577,30\n63578,557\n63579,999\n63580,146\n63580,158\n63580,192\n63580,285\n63580,336\n63580,406\n63580,620\n63580,779\n63580,920\n63580,1515\n63580,1531\n63580,1893\n63583,518\n63584,6303\n63585,147\n63585,158\n63585,206\n63585,406\n63585,1181\n63585,1515\n63586,21944\n63587,1639\n63588,435\n63588,1531\n63590,30\n63593,392\n63593,1146\n63594,30\n63595,811\n63596,138\n63596,557\n63596,1368\n63597,30\n63598,509\n63598,1634\n63598,1782\n63598,75912\n63599,30\n63600,30\n63601,2045\n63602,30\n63603,3\n63604,304\n63604,1962\n63605,1556\n63606,861\n63607,22\n63608,63609\n63610,1096\n63611,30\n63612,30\n63613,23011\n63614,30\n63615,536\n63616,1265\n63616,1266\n63617,1012\n63619,30\n63620,310\n63621,301\n63622,2775\n63623,447\n63624,22\n63625,30\n63626,63\n63626,332\n63628,217\n63628,1417\n63629,1\n63629,4\n63629,5\n63629,65\n63629,694\n63629,1082\n63629,1807\n63629,2926\n63629,4411\n63630,3182\n63631,30\n63632,30\n63633,30\n63634,663\n63634,1089\n63635,868\n63636,726\n63637,1634\n63638,424\n63639,135\n63639,596\n63639,784\n63639,1052\n63639,1368\n63640,3209\n63641,1179\n63642,973\n63643,134\n63644,704\n63645,247\n63645,2867\n63645,22880\n63646,63647\n63648,301\n63649,206\n63651,1274\n63652,346\n63653,588\n63653,590\n63655,285\n63655,779\n63655,1515\n63656,364\n63656,372\n63656,2209\n63657,439\n63658,473\n63659,248\n63660,63661\n63662,1085\n63663,83\n63664,2146\n63665,2274\n63666,83\n63667,151\n63668,30\n63669,338\n63670,30\n63671,1860\n63672,1858\n63673,3069\n63674,83\n63675,861\n63676,186\n63676,301\n63676,518\n63676,525\n63676,795\n63676,1085\n63676,1235\n63676,1326\n63676,1715\n63676,2205\n63676,2206\n63676,3804\n63676,4146\n63676,21711\n63676,33424\n63677,264\n63677,1551\n63678,852\n63679,30\n63680,68\n63681,247\n63682,1392\n63683,217\n63683,1417\n63684,34\n63684,35\n63685,219\n63686,30\n63687,30\n63688,920\n63689,5310\n63690,30\n63691,8788\n63692,72\n63693,175\n63694,392\n63695,1\n63696,38634\n63697,209\n63698,40159\n63699,68\n63699,77\n63699,104\n63699,107\n63699,120\n63699,134\n63699,137\n63699,151\n63699,184\n63699,252\n63699,269\n63699,273\n63699,278\n63699,283\n63699,287\n63699,294\n63699,326\n63699,328\n63699,340\n63699,349\n63699,356\n63699,358\n63699,364\n63699,392\n63699,417\n63699,595\n63699,611\n63699,668\n63699,707\n63699,752\n63699,760\n63699,784\n63699,805\n63699,1070\n63699,1087\n63699,1143\n63699,1167\n63699,1220\n63699,1222\n63699,1257\n63699,1285\n63699,1313\n63699,1531\n63699,1559\n63699,1634\n63699,1718\n63699,1860\n63699,2105\n63699,2266\n63699,2367\n63699,2411\n63699,2744\n63699,2779\n63699,2931\n63699,4146\n63699,4597\n63699,5326\n63699,5540\n63699,6556\n63699,7757\n63699,9028\n63699,19010\n63699,21944\n63699,162599\n63699,188791\n63699,212914\n63699,213089\n63700,107\n63701,34\n63701,35\n63703,841\n63704,1544\n63705,1572\n63706,1449\n63707,71\n63708,1571\n63709,991\n63710,247\n63712,285\n63713,697\n63715,5265\n63716,1001\n63717,1515\n63718,1188\n63719,1858\n63720,1860\n63721,294\n63722,1\n63723,347\n63724,106\n63724,337\n63725,1305\n63726,26\n63726,59\n63727,3069\n63728,134\n63729,44725\n63730,1983\n63731,233\n63732,8308\n63733,704\n63734,957\n63734,1815\n63735,538\n63735,996\n63735,1294\n63736,72\n63737,596\n63738,596\n63739,240\n63739,694\n63740,805\n63742,280\n63743,333\n63744,557\n63745,557\n63746,557\n63747,1572\n63748,2351\n63750,2334\n63750,3602\n63751,30\n63752,685\n63753,50\n63754,1370\n63754,1821\n63755,379\n63755,1096\n63756,63757\n63758,58\n63758,3474\n63758,5547\n63759,255\n63760,30\n63761,483\n63762,1531\n63763,83\n63764,184\n63765,2506\n63766,557\n63767,79\n63768,178\n63769,273\n63769,274\n63770,30\n63771,72\n63772,358\n63774,875\n63777,2506\n63778,58\n63779,46\n63780,58\n63781,46\n63782,2989\n63782,2991\n63783,2506\n63784,744\n63784,1844\n63784,19010\n63785,2506\n63786,9025\n63787,2620\n63788,63789\n63790,310\n63791,1707\n63792,424\n63793,417\n63793,611\n63793,852\n63794,151\n63795,63796\n63797,63798\n63799,72\n63800,344\n63801,285\n63803,63804\n63803,171437\n63805,3960\n63806,366\n63807,344\n63807,3474\n63807,5547\n63808,366\n63809,104\n63810,366\n63811,1235\n63811,1335\n63811,2089\n63811,2940\n63811,21944\n63812,15573\n63813,704\n63814,2210\n63814,4237\n63815,63816\n63817,366\n63818,18726\n63819,63820\n63821,63822\n63823,163\n63824,704\n63825,22\n63825,211\n63826,252\n63826,318\n63826,41170\n63827,563\n63828,366\n63829,252\n63829,318\n63829,41170\n63830,63831\n63832,611\n63833,2590\n63834,18726\n63836,18726\n63837,163\n63838,1370\n63838,1821\n63839,50791\n63840,671\n63841,366\n63843,30\n63844,8270\n63845,63846\n63847,1363\n63848,304\n63849,63850\n63849,82446\n63849,129486\n63851,704\n63852,3\n63853,63854\n63855,2867\n63855,2868\n63855,22880\n63856,2506\n63857,5375\n63858,63859\n63861,30\n63862,240\n63862,1411\n63862,63863\n63862,90817\n63862,109195\n63864,195\n63864,640\n63864,17228\n63864,27217\n63865,925\n63866,685\n63867,752\n63867,63868\n63867,78963\n63867,90618\n63867,91133\n63867,92100\n63867,92826\n63867,108337\n63867,108614\n63867,117580\n63867,156583\n63867,177387\n63869,63870\n63871,72\n63872,344\n63873,285\n63874,233\n63875,44\n63876,14366\n63877,30\n63878,611\n63879,872\n63879,1127\n63881,1983\n63882,72\n63883,818\n63884,1776\n63885,63886\n63887,376\n63888,10\n63889,2367\n63890,920\n63891,676\n63892,611\n63893,355\n63894,3209\n63895,611\n63895,1449\n63896,6027\n63897,63898\n63899,1983\n63900,3804\n63901,302\n63901,1019\n63902,611\n63903,13361\n63904,302\n63907,1235\n63907,1335\n63908,1984\n63909,10\n63909,704\n63909,784\n63909,805\n63909,1149\n63909,1631\n63910,875\n63911,18726\n63912,163\n63913,2979\n63914,58\n63915,46\n63916,202\n63916,203\n63917,875\n63918,827\n63919,63920\n63921,875\n63922,4980\n63923,358\n63924,118\n63924,4597\n63925,209\n63926,571\n63926,868\n63926,1096\n63927,1014\n63928,302\n63929,58\n63930,46\n63931,704\n63932,29380\n63933,192\n63934,360\n63934,2626\n63935,3960\n63936,1544\n63937,640\n63938,640\n63940,640\n63941,479\n63942,779\n63943,538\n63944,302\n63946,2574\n63947,1113\n63948,209\n63950,640\n63951,2775\n63952,447\n63953,1858\n63954,1860\n63955,137\n63957,63958\n63959,63960\n63961,2168\n63961,2944\n63961,18831\n63963,907\n63963,932\n63964,187\n63965,1955\n63965,8276\n63966,356\n63966,843\n63967,626\n63967,752\n63967,1571\n63967,1634\n63968,1707\n63969,1363\n63970,4455\n63972,417\n63973,907\n63975,581\n63976,301\n63977,2995\n63979,1326\n63980,50\n63980,516\n63980,622\n63981,63982\n63983,3474\n63984,818\n63984,17309\n63985,920\n63986,83\n63987,406\n63987,1515\n63989,3413\n63990,120\n63990,752\n63990,1119\n63990,6068\n63991,83\n63992,66\n63993,298\n63994,485\n63995,676\n63996,63997\n63998,338\n63998,668\n63999,64000\n64001,1359\n64002,1556\n64003,240\n64003,255\n64004,1323\n64005,102\n64006,1326\n64007,408\n64008,5662\n64009,1289\n64010,106\n64010,192\n64010,251\n64010,346\n64010,435\n64010,447\n64010,516\n64010,586\n64010,620\n64010,934\n64010,1033\n64010,1175\n64010,1512\n64010,1985\n64010,5992\n64011,3695\n64012,26\n64012,59\n64013,3585\n64014,875\n64016,264\n64016,1127\n64016,1381\n64016,1893\n64017,392\n64019,58\n64020,46\n64022,187\n64023,644\n64024,644\n64024,697\n64024,3003\n64025,192\n64026,1085\n64026,1580\n64026,75912\n64029,424\n64030,483\n64032,171\n64033,417\n64034,875\n64035,304\n64037,106\n64037,337\n64038,3413\n64039,602\n64041,273\n64041,274\n64042,2574\n64043,525\n64044,406\n64045,64046\n64047,140\n64048,35486\n64049,336\n64050,1392\n64051,422\n64052,422\n64053,422\n64054,422\n64055,599\n64056,422\n64057,422\n64058,422\n64059,422\n64060,422\n64061,1294\n64062,586\n64063,337\n64064,929\n64065,4177\n64066,77\n64067,192\n64067,337\n64067,841\n64067,2244\n64068,2646\n64070,167\n64070,2083\n64072,87\n64072,392\n64072,595\n64072,703\n64072,872\n64072,1151\n64072,1572\n64072,2274\n64074,1085\n64075,66\n64075,467\n64075,868\n64076,875\n64077,1447\n64078,287\n64078,733\n64078,827\n64079,192\n64079,285\n64080,1977\n64080,1978\n64081,72\n64082,344\n64083,285\n64085,2775\n64086,87\n64086,392\n64086,595\n64086,703\n64086,872\n64086,1151\n64086,1572\n64086,2274\n64087,875\n64088,1590\n64089,2889\n64090,636\n64091,64092\n64091,113456\n64091,120467\n64091,123431\n64091,160563\n64091,186447\n64091,213626\n64091,213640\n64091,231961\n64091,237516\n64091,240350\n64091,242982\n64093,289\n64093,290\n64094,310\n64095,1608\n64097,217\n64099,3161\n64100,64101\n64103,107\n64104,392\n64105,2929\n64106,146\n64107,151\n64108,278\n64108,694\n64108,1019\n64108,6789\n64109,875\n64110,1858\n64111,1860\n64112,1241\n64113,874\n64114,4455\n64115,17228\n64116,130\n64117,4611\n64118,1544\n64119,83\n64120,349\n64121,687\n64121,1556\n64122,302\n64123,44\n64124,852\n64124,5591\n64125,247\n64126,605\n64127,1140\n64127,5547\n64128,1983\n64129,106\n64129,1033\n64129,6119\n64130,518\n64130,1113\n64130,1326\n64130,1955\n64130,8270\n64131,392\n64132,1769\n64133,1891\n64134,72\n64135,577\n64135,1429\n64136,41\n64137,356\n64138,302\n64139,219\n64140,280\n64141,206\n64142,287\n64143,422\n64144,56\n64145,592\n64148,2979\n64149,1119\n64150,1119\n64151,861\n64152,702\n64152,874\n64152,1210\n64153,192\n64153,622\n64153,663\n64153,664\n64154,1298\n64154,1436\n64155,2421\n64156,1167\n64158,1837\n64159,1639\n64160,1579\n64161,1688\n64162,1837\n64164,850\n64165,6750\n64166,1147\n64167,861\n64168,66\n64169,4980\n64170,3209\n64171,292\n64171,312\n64171,1177\n64171,2443\n64172,233\n64173,6068\n64174,1608\n64175,483\n64176,64177\n64178,264\n64178,736\n64179,704\n64180,64181\n64182,1010\n64182,1849\n64183,349\n64184,2995\n64185,1019\n64185,1462\n64186,26\n64186,59\n64186,21944\n64187,861\n64188,390\n64188,6068\n64189,147\n64189,158\n64190,1639\n64191,1579\n64192,1454\n64192,8541\n64193,483\n64194,64195\n64196,83\n64197,1085\n64197,75912\n64198,151\n64199,233\n64200,106\n64200,192\n64200,202\n64200,203\n64200,252\n64200,318\n64200,516\n64200,586\n64200,1220\n64200,1222\n64200,16201\n64200,41170\n64201,259\n64202,64203\n64205,1635\n64206,207\n64206,647\n64206,934\n64206,1058\n64206,1247\n64207,779\n64208,818\n64209,1571\n64210,292\n64211,83\n64212,1849\n64214,1\n64215,1983\n64216,64217\n64218,500\n64219,366\n64220,178\n64221,2590\n64222,86\n64222,104\n64222,516\n64222,671\n64222,932\n64222,953\n64222,1127\n64222,1243\n64222,1458\n64222,3507\n64222,4355\n64223,86\n64224,1096\n64225,875\n64226,973\n64227,3538\n64228,247\n64229,392\n64230,2671\n64231,83\n64232,8992\n64233,5366\n64234,65\n64236,1590\n64236,1644\n64237,390\n64237,424\n64237,438\n64237,479\n64237,536\n64237,644\n64237,1058\n64237,1282\n64237,2528\n64237,3041\n64237,7155\n64238,875\n64240,1\n64241,280\n64241,17245\n64242,33598\n64243,2367\n64244,406\n64245,83\n64246,195\n64247,772\n64248,1\n64249,7652\n64250,875\n64251,72\n64252,1556\n64253,875\n64254,592\n64255,1363\n64256,1274\n64257,2006\n64258,779\n64258,68069\n64259,1381\n64260,861\n64261,298\n64262,485\n64263,7360\n64264,390\n64265,30\n64266,1465\n64267,326\n64268,4\n64268,5\n64270,835\n64271,247\n64272,671\n64273,21944\n64274,527\n64275,1227\n64275,1229\n64275,86416\n64276,657\n64277,3413\n64278,2944\n64279,302\n64280,527\n64281,64282\n64283,10\n64283,120\n64283,278\n64283,333\n64283,467\n64283,3297\n64283,5101\n64283,37414\n64283,66733\n64283,66797\n64283,66898\n64284,364\n64284,1252\n64284,1253\n64285,134\n64286,1285\n64287,455\n64288,657\n64289,225\n64290,827\n64291,4903\n64292,1551\n64293,779\n64295,3507\n64296,5213\n64297,743\n64298,21944\n64299,72\n64300,240\n64300,269\n64301,4192\n64301,4193\n64302,30\n64303,376\n64304,885\n64306,14797\n64307,64308\n64310,1096\n64311,83\n64312,72\n64313,30\n64314,389\n64315,1082\n64316,107\n64317,202\n64317,203\n64318,64319\n64320,557\n64321,557\n64322,1707\n64323,2506\n64324,1235\n64324,1335\n64324,1462\n64325,8270\n64326,704\n64327,305\n64328,217\n64329,6068\n64331,2775\n64332,447\n64333,1983\n64334,596\n64334,1368\n64335,118\n64335,4597\n64336,30\n64337,64338\n64340,704\n64341,240\n64341,1955\n64342,30\n64343,298\n64344,485\n64345,4594\n64346,83\n64347,104\n64347,136\n64347,596\n64347,617\n64347,1368\n64347,38144\n64347,40220\n64347,64509\n64347,65395\n64347,66873\n64348,64349\n64350,779\n64351,120\n64352,4895\n64353,56\n64353,192\n64353,1623\n64354,34\n64354,35\n64354,2784\n64355,949\n64356,64357\n64358,1462\n64358,8537\n64359,862\n64360,4895\n64361,269\n64362,515\n64363,30\n64364,30\n64365,206\n64366,704\n64367,72\n64368,64369\n64370,328\n64371,64372\n64373,64374\n64375,779\n64376,932\n64377,8270\n64378,417\n64379,663\n64379,664\n64380,2205\n64380,2206\n64381,393\n64382,8822\n64383,72\n64384,344\n64385,285\n64386,118\n64386,4597\n64387,8308\n64388,13919\n64389,704\n64390,30\n64391,2506\n64392,4276\n64392,22880\n64393,1133\n64394,704\n64395,704\n64396,663\n64396,664\n64397,358\n64397,687\n64398,1634\n64399,424\n64400,298\n64401,18726\n64402,163\n64403,64404\n64405,3182\n64406,1980\n64406,8991\n64407,134\n64408,779\n64409,202\n64409,203\n64409,332\n64409,1392\n64409,1572\n64409,6837\n64410,2116\n64411,64412\n64413,217\n64414,1133\n64415,704\n64416,2367\n64417,9323\n64418,417\n64419,973\n64420,7358\n64420,7363\n64421,211\n64422,118\n64422,4597\n64423,118\n64423,4597\n64424,676\n64425,366\n64426,366\n64427,366\n64428,366\n64429,366\n64430,366\n64431,366\n64432,366\n64433,366\n64434,366\n64435,30\n64436,366\n64437,366\n64438,366\n64440,366\n64441,366\n64442,366\n64443,366\n64444,64445\n64446,1265\n64446,1266\n64448,2266\n64449,233\n64451,3413\n64453,2116\n64454,2048\n64455,376\n64457,1298\n64457,1732\n64457,75912\n64458,64459\n64460,9005\n64461,355\n64462,171\n64463,1181\n64464,1968\n64465,298\n64466,485\n64467,1858\n64468,1860\n64470,251\n64470,465\n64471,302\n64472,64473\n64474,4192\n64474,4193\n64475,425\n64475,1276\n64476,1740\n64477,433\n64477,1634\n64478,1927\n64479,657\n64480,2775\n64481,447\n64482,3\n64482,1871\n64483,1983\n64484,1983\n64485,1983\n64486,310\n64487,298\n64488,682\n64489,64490\n64491,1860\n64492,251\n64492,465\n64492,877\n64492,1985\n64493,779\n64495,1858\n64496,1860\n64497,264\n64497,515\n64497,736\n64497,1289\n64498,217\n64499,1860\n64500,44\n64501,1634\n64502,79\n64503,875\n64504,1688\n64505,640\n64506,336\n64507,1590\n64508,874\n64510,349\n64511,1235\n64511,1335\n64511,2209\n64511,8180\n64511,21711\n64512,703\n64514,107\n64514,2646\n64515,50\n64516,500\n64517,1962\n64518,1052\n64519,1882\n64520,2775\n64521,54\n64522,1983\n64523,1983\n64525,589\n64525,1001\n64525,1085\n64526,1001\n64526,1235\n64526,1335\n64526,2116\n64527,515\n64528,30\n64529,1983\n64530,1220\n64531,2775\n64532,447\n64533,749\n64533,1146\n64533,3538\n64534,2334\n64535,602\n64536,64537\n64538,980\n64539,406\n64540,581\n64541,808\n64543,596\n64544,1506\n64545,1983\n64546,202\n64546,203\n64547,1127\n64548,64549\n64550,1881\n64550,5326\n64551,682\n64552,1220\n64552,1222\n64553,252\n64554,251\n64556,682\n64557,349\n64558,682\n64558,72439\n64559,2353\n64560,682\n64560,72439\n64561,682\n64561,72439\n64562,261\n64562,333\n64563,251\n64563,252\n64563,925\n64563,1220\n64563,1222\n64563,41170\n64564,1776\n64564,4193\n64565,34\n64565,158\n64566,5591\n64568,158\n64568,1181\n64569,485\n64570,467\n64570,189839\n64571,1688\n64572,439\n64573,30331\n64574,278\n64575,254\n64576,1267\n64578,240\n64578,1285\n64579,1983\n64581,1955\n64582,79\n64582,333\n64585,1983\n64586,273\n64586,274\n64588,2116\n64589,623\n64589,1805\n64590,4611\n64591,349\n64592,1085\n64593,805\n64596,7652\n64597,273\n64597,274\n64598,406\n64598,516\n64598,1181\n64599,1663\n64600,72\n64601,644\n64603,107\n64603,200\n64603,364\n64603,3474\n64604,302\n64605,1983\n64606,973\n64607,1509\n64608,390\n64609,273\n64609,274\n64610,440\n64611,222\n64612,1243\n64613,433\n64614,5405\n64615,1210\n64616,536\n64617,577\n64617,1429\n64618,1983\n64619,1983\n64621,1133\n64622,338\n64622,340\n64622,344\n64622,360\n64622,515\n64622,835\n64622,1052\n64622,1127\n64622,1224\n64622,1267\n64622,1663\n64622,1673\n64622,1836\n64622,1893\n64622,2312\n64622,2367\n64622,13538\n64622,49057\n64622,81070\n64624,788\n64625,431\n64626,425\n64627,10\n64628,2574\n64629,5405\n64630,868\n64631,41\n64631,1119\n64633,264\n64634,219\n64634,68069\n64635,893\n64637,868\n64638,1608\n64639,17334\n64640,364\n64641,312\n64642,1522\n64643,203\n64643,2931\n64644,479\n64645,415\n64646,1579\n64647,1639\n64648,30\n64648,248\n64649,1977\n64649,1978\n64650,493\n64651,5212\n64652,275\n64653,2205\n64653,2206\n64653,33424\n64654,64655\n64657,500\n64658,1962\n64659,1052\n64660,1882\n64661,2775\n64662,54\n64663,1860\n64664,192\n64665,302\n64667,809\n64668,1881\n64669,620\n64669,8244\n64670,1140\n64671,1274\n64672,81\n64672,200\n64673,8180\n64675,697\n64675,703\n64676,4771\n64677,5102\n64677,15119\n64678,671\n64678,1294\n64679,64680\n64679,85299\n64681,390\n64681,775\n64682,1326\n64683,538\n64684,439\n64684,809\n64684,141912\n64685,1010\n64685,1326\n64686,510\n64687,211\n64688,872\n64689,248\n64690,30\n64691,1243\n64692,422\n64693,422\n64694,422\n64695,422\n64696,422\n64697,422\n64698,422\n64699,422\n64700,364\n64701,859\n64702,422\n64703,1181\n64704,1608\n64705,298\n64706,2995\n64707,1462\n64708,1522\n64709,309\n64709,310\n64709,1181\n64710,422\n64711,422\n64712,536\n64713,54\n64715,126\n64715,972\n64715,1267\n64715,2605\n64715,3474\n64716,920\n64717,222\n64718,188\n64719,182\n64720,240\n64721,422\n64722,1844\n64722,162599\n64723,72\n64724,1453\n64725,83\n64726,500\n64727,439\n64728,1962\n64729,1052\n64730,1882\n64731,2775\n64732,30\n64733,54\n64734,64735\n64736,581\n64737,515\n64738,2436\n64739,784\n64740,525\n64741,920\n64743,957\n64743,1815\n64744,1590\n64746,259\n64747,697\n64748,58\n64749,46\n64750,2506\n64751,784\n64752,313\n64753,7757\n64754,1\n64754,149\n64754,160\n64754,222\n64754,340\n64754,397\n64754,644\n64754,668\n64754,783\n64754,985\n64754,1012\n64754,1191\n64754,1192\n64754,1204\n64754,1345\n64754,1388\n64754,1434\n64754,1608\n64754,1634\n64754,1663\n64754,1776\n64754,1803\n64754,2253\n64754,2310\n64754,2699\n64754,3524\n64754,3630\n64754,3999\n64754,4903\n64754,5469\n64754,6824\n64754,28107\n64754,50318\n64754,81070\n64754,90845\n64754,136072\n64755,30\n64756,392\n64756,493\n64757,920\n64758,58\n64759,46\n64760,8991\n64762,64763\n64764,455\n64764,6789\n64765,1531\n64766,1465\n64768,439\n64768,447\n64768,1531\n64769,1118\n64770,34\n64770,35\n64770,313\n64771,392\n64771,1363\n64771,1454\n64772,292\n64773,292\n64774,390\n64775,1381\n64775,1893\n64776,4276\n64777,392\n64778,83\n64779,64780\n64781,704\n64782,1001\n64783,1001\n64784,1556\n64785,272\n64786,252\n64786,1220\n64786,1222\n64787,422\n64788,56\n64789,500\n64790,1962\n64791,1052\n64792,1882\n64793,2775\n64794,54\n64795,1639\n64796,1579\n64797,151\n64798,50\n64798,97\n64798,106\n64798,147\n64798,178\n64798,202\n64798,203\n64798,298\n64798,333\n64798,337\n64798,417\n64798,493\n64798,515\n64798,588\n64798,590\n64798,620\n64798,622\n64798,628\n64798,640\n64798,779\n64798,1085\n64798,1132\n64798,1175\n64798,1247\n64798,1370\n64798,1509\n64798,1515\n64798,1531\n64798,2073\n64798,2296\n64798,2782\n64798,2931\n64798,3876\n64798,6279\n64798,8270\n64798,8788\n64799,292\n64800,1579\n64801,1639\n64802,1287\n64803,30\n64804,9029\n64805,1370\n64806,1980\n64806,8991\n64807,4475\n64808,932\n64809,72\n64810,7092\n64811,34\n64811,1776\n64811,4193\n64812,861\n64813,41\n64813,68\n64813,240\n64813,294\n64813,431\n64813,631\n64813,760\n64813,784\n64813,805\n64813,818\n64813,1119\n64813,1285\n64813,2995\n64813,3135\n64813,9021\n64814,1983\n64815,2205\n64815,2206\n64816,366\n64817,72\n64818,344\n64819,285\n64820,2506\n64821,795\n64821,3094\n64822,83\n64823,392\n64823,1151\n64823,1240\n64823,1454\n64824,1782\n64825,479\n64825,6695\n64826,1181\n64827,240\n64828,932\n64829,1181\n64830,57854\n64831,1177\n64831,4548\n64831,6263\n64832,151\n64833,136\n64834,1556\n64835,269\n64836,72\n64837,1319\n64838,1265\n64839,872\n64840,41\n64840,233\n64840,1119\n64840,3135\n64841,19\n64841,83\n64841,1881\n64841,2266\n64841,5326\n64842,206\n64843,493\n64844,366\n64845,795\n64845,1566\n64846,107\n64846,4771\n64848,809\n64849,1962\n64850,431\n64851,516\n64852,64853\n64854,175\n64855,1359\n64855,1785\n64856,200\n64856,772\n64857,364\n64858,1539\n64859,278\n64860,1983\n64861,202\n64861,203\n64863,64864\n64865,3\n64865,34\n64865,35\n64865,106\n64865,158\n64865,178\n64865,192\n64865,202\n64865,203\n64865,217\n64865,251\n64865,252\n64865,337\n64865,346\n64865,435\n64865,516\n64865,586\n64865,622\n64865,640\n64865,663\n64865,664\n64865,1175\n64865,1181\n64865,1220\n64865,1222\n64865,1243\n64865,1294\n64865,1370\n64865,1590\n64865,1635\n64865,2567\n64865,2931\n64865,3161\n64865,4192\n64865,4193\n64865,5874\n64865,5976\n64865,6119\n64865,8598\n64865,8771\n64865,8811\n64865,8822\n64865,8907\n64865,16201\n64866,298\n64867,485\n64868,292\n64869,784\n64870,477\n64871,64872\n64871,228665\n64873,332\n64874,72\n64875,344\n64876,285\n64877,1285\n64878,704\n64878,1140\n64879,1274\n64880,83\n64881,72\n64882,694\n64882,1608\n64883,2506\n64884,2506\n64885,328\n64886,158\n64886,2931\n64887,900\n64888,64889\n64890,644\n64891,64892\n64893,1265\n64894,704\n64895,22\n64895,1707\n64896,676\n64897,151\n64898,805\n64899,8719\n64900,138\n64901,865\n64902,557\n64903,137\n64904,118\n64904,4597\n64905,21944\n64906,8719\n64907,138\n64908,865\n64909,557\n64910,137\n64911,118\n64911,4597\n64912,21944\n64913,8719\n64914,138\n64915,865\n64916,557\n64917,137\n64918,118\n64918,4597\n64919,21944\n64920,292\n64921,8719\n64922,138\n64923,865\n64924,557\n64925,137\n64926,118\n64926,4597\n64927,21944\n64928,557\n64929,557\n64930,557\n64931,1181\n64932,72\n64933,5405\n64934,515\n64934,1452\n64934,2626\n64935,10\n64935,113156\n64936,305\n64937,644\n64938,1007\n64939,1140\n64940,704\n64941,3507\n64942,1381\n64943,227\n64944,481\n64945,64946\n64947,4475\n64948,64949\n64950,298\n64951,485\n64952,1392\n64953,8270\n64954,14989\n64955,48\n64956,493\n64957,393\n64958,2837\n64959,340\n64960,779\n64961,6837\n64962,1127\n64963,302\n64964,1127\n64965,489\n64966,779\n64967,72\n64968,255\n64969,225\n64970,19005\n64971,64972\n64973,2867\n64973,22880\n64974,250\n64974,1684\n64975,644\n64976,3960\n64977,366\n64978,366\n64979,366\n64981,21487\n64981,22880\n64982,4039\n64983,704\n64984,215\n64985,932\n64986,602\n64988,64989\n64990,64991\n64992,71\n64992,304\n64992,417\n64992,611\n64993,72\n64994,206\n64995,2051\n64997,493\n64998,657\n64999,3413\n65000,779\n65001,65002\n65003,779\n65004,65005\n65004,103286\n65004,105057\n65006,1453\n65007,118\n65007,4597\n65008,2775\n65009,447\n65010,1881\n65011,483\n65012,18726\n65013,163\n65014,65015\n65016,65017\n65018,2775\n65019,447\n65020,2697\n65021,4101\n65022,841\n65023,225\n65024,8884\n65026,1085\n65027,676\n65028,202\n65028,203\n65029,1370\n65030,187\n65031,87\n65031,140\n65031,1453\n65031,1572\n65032,3413\n65033,2506\n65034,147\n65035,30\n65036,30\n65037,233\n65038,9121\n65039,72\n65040,1551\n65041,44\n65042,65043\n65044,376\n65045,20359\n65046,355\n65047,8270\n65048,349\n65049,147\n65050,366\n65051,366\n65052,366\n65053,932\n65054,366\n65055,310\n65056,2206\n65056,3247\n65056,17588\n65058,2048\n65059,65060\n65061,932\n65062,65\n65063,65064\n65065,5976\n65066,195\n65067,652\n65068,107\n65069,171\n65070,652\n65071,1118\n65072,581\n65073,83\n65074,72\n65075,344\n65076,285\n65077,18726\n65078,50\n65079,163\n65080,1127\n65081,364\n65082,596\n65082,1368\n65083,424\n65084,118\n65084,4597\n65085,586\n65086,1381\n65086,2292\n65087,203\n65087,2931\n65088,104\n65088,636\n65089,868\n65090,417\n65091,72\n65092,344\n65093,285\n65094,79\n65095,147\n65095,151\n65096,4177\n65097,4177\n65098,195\n65099,841\n65100,657\n65101,364\n65101,431\n65101,1252\n65101,1253\n65102,859\n65103,4691\n65104,298\n65105,485\n65107,18726\n65108,163\n65109,83\n65110,1298\n65111,118\n65111,4597\n65112,217\n65113,217\n65114,30\n65115,65116\n65117,72\n65118,240\n65119,1462\n65119,2351\n65120,10\n65121,72\n65122,344\n65123,285\n65124,5375\n65125,30\n65126,1231\n65127,30\n65128,2506\n65129,30\n65130,676\n65131,65132\n65131,72184\n65133,408\n65134,21944\n65135,731\n65136,4895\n65137,676\n65138,187\n65139,8149\n65141,3413\n65142,1085\n65143,30\n65144,1058\n65145,3413\n65146,30\n65147,79\n65148,120\n65149,515\n65150,30\n65151,779\n65152,104\n65152,135\n65152,138\n65152,248\n65152,510\n65153,8788\n65154,158\n65155,206\n65156,184\n65157,149\n65158,298\n65159,485\n65160,3804\n65161,1368\n65162,1425\n65163,422\n65164,298\n65165,485\n65166,56\n65167,2244\n65168,1458\n65169,187\n65170,298\n65171,485\n65172,267\n65173,640\n65174,366\n65175,137\n65176,8907\n65177,298\n65178,485\n65179,292\n65180,8270\n65181,18790\n65182,147\n65183,171\n65184,30\n65185,2367\n65186,392\n65186,1146\n65186,1151\n65187,349\n65188,215\n65188,298\n65188,417\n65188,592\n65188,760\n65188,1085\n65188,1285\n65188,1564\n65188,1818\n65188,1955\n65188,2205\n65188,2206\n65188,2296\n65188,2620\n65188,5718\n65188,33424\n65189,1087\n65190,657\n65191,7652\n65191,22880\n65192,1133\n65193,671\n65194,195\n65194,332\n65194,640\n65194,1572\n65194,27217\n65195,3413\n65196,104\n65199,704\n65200,2367\n65201,184\n65202,273\n65202,631\n65203,1479\n65204,313\n65205,346\n65206,298\n65207,211\n65208,491\n65208,1058\n65209,261\n65210,346\n65211,30\n65212,72\n65213,907\n65214,346\n65215,346\n65216,346\n65217,481\n65218,346\n65219,30\n65220,81\n65221,28072\n65222,779\n65223,1332\n65224,3069\n65225,65226\n65227,424\n65228,269\n65229,1773\n65230,287\n65231,53763\n65232,72\n65233,483\n65234,346\n65235,30\n65236,932\n65237,1353\n65238,30\n65239,704\n65240,704\n65241,30\n65242,72\n65243,3370\n65243,14453\n65244,6027\n65245,14989\n65246,65247\n65249,349\n65250,178\n65251,30\n65252,30\n65253,272\n65253,596\n65253,1381\n65253,3999\n65254,65255\n65256,255\n65257,8788\n65258,1181\n65259,30\n65260,65261\n65262,18726\n65263,147\n65263,192\n65263,406\n65263,4192\n65263,4193\n65264,87\n65265,163\n65266,17228\n65267,422\n65268,56\n65270,376\n65271,171\n65272,21487\n65272,22880\n65273,2506\n65274,1133\n65275,346\n65276,65277\n65276,97598\n65276,110977\n65278,83\n65279,83\n65280,346\n65281,366\n65282,233\n65283,366\n65284,676\n65285,44\n65286,107\n65287,2416\n65287,2417\n65288,292\n65289,338\n65290,298\n65291,65292\n65293,187\n65294,1133\n65295,3538\n65296,30\n65298,30\n65300,3413\n65301,355\n65302,346\n65303,1634\n65304,424\n65305,87\n65305,1151\n65306,872\n65307,65308\n65309,346\n65310,841\n65311,671\n65312,1962\n65313,366\n65314,779\n65315,65316\n65317,1235\n65317,17772\n65318,417\n65319,72\n65320,349\n65321,8270\n65322,65323\n65322,123591\n65322,205763\n65324,23011\n65325,577\n65326,200\n65326,372\n65326,588\n65326,590\n65326,805\n65327,581\n65328,65329\n65331,973\n65332,602\n65333,30\n65333,557\n65333,1102\n65333,1265\n65333,5440\n65334,346\n65335,65336\n65337,79\n65338,171\n65339,65340\n65341,65342\n65343,30\n65344,3297\n65344,65345\n65346,4810\n65347,1265\n65348,1983\n65349,39247\n65350,1858\n65351,1860\n65352,779\n65353,779\n65354,10\n65355,298\n65356,485\n65357,298\n65358,485\n65359,298\n65360,485\n65361,298\n65362,485\n65363,30\n65364,298\n65365,485\n65366,65367\n65366,132308\n65368,1117\n65369,217\n65369,2867\n65369,22880\n65371,240\n65372,45960\n65374,93\n65374,94\n65374,2787\n65376,1509\n65377,2296\n65378,349\n65380,30\n65381,338\n65382,65383\n65384,65385\n65386,192\n65387,120\n65387,261\n65387,588\n65387,590\n65387,1419\n65387,2416\n65387,2417\n65387,3331\n65388,483\n65389,65390\n65391,104\n65391,557\n65391,953\n65391,954\n65391,1939\n65392,19986\n65393,259\n65394,30\n65395,596\n65395,1368\n65396,50\n65396,99\n65396,192\n65397,8822\n65398,30\n65400,65401\n65402,875\n65403,298\n65404,485\n65405,30\n65406,366\n65407,65408\n65409,17334\n65410,515\n65411,290\n65411,585\n65412,274\n65413,200\n65413,1119\n65414,298\n65415,485\n65416,45022\n65417,907\n65419,602\n65419,3218\n65420,1326\n65421,219\n65422,640\n65423,72\n65424,344\n65425,285\n65427,65428\n65429,203\n65429,2931\n65431,118\n65431,4597\n65432,65433\n65434,640\n65435,30\n65436,1707\n65437,79\n65438,2775\n65439,447\n65440,72\n65441,344\n65442,285\n65443,30\n65444,872\n65445,30\n65446,1511\n65446,3069\n65447,366\n65448,310\n65448,805\n65449,68\n65450,30\n65451,557\n65452,5906\n65453,626\n65454,137\n65455,278\n65456,862\n65457,5906\n65458,557\n65459,626\n65460,278\n65461,137\n65462,862\n65463,557\n65464,557\n65465,557\n65466,557\n65467,862\n65468,65469\n65470,65471\n65473,30\n65474,2775\n65475,447\n65476,493\n65477,298\n65478,485\n65479,79\n65480,875\n65481,433\n65482,72\n65484,10\n65485,72\n65486,344\n65487,285\n65488,1955\n65489,1634\n65490,479\n65491,9195\n65493,682\n65493,72439\n65494,10\n65495,30\n65496,298\n65497,485\n65498,72\n65499,344\n65500,285\n65501,640\n65502,72\n65503,344\n65504,285\n65505,5976\n65506,72\n65507,30\n65508,65509\n65510,104\n65511,1980\n65511,8991\n65512,5375\n65513,65514\n65515,72\n65516,344\n65517,285\n65518,433\n65519,433\n65520,65521\n65522,485\n65522,65522\n65522,65627\n65522,112094\n65522,138968\n65522,168264\n65523,65524\n65523,81670\n65523,94001\n65523,107774\n65523,111233\n65523,121207\n65523,122725\n65523,124155\n65523,124987\n65525,104\n65525,135\n65526,30\n65527,261\n65528,932\n65529,657\n65530,4192\n65530,4193\n65531,640\n65532,9195\n65533,557\n65534,21487\n65534,22880\n65535,1133\n65536,7117\n65537,35905\n65538,6027\n65539,65540\n65541,389\n65542,1381\n65543,5976\n65544,640\n65545,290\n65545,585\n65546,9025\n65547,65548\n65549,18726\n65550,163\n65551,65552\n65553,704\n65554,2073\n65555,30\n65556,25344\n65557,779\n65559,10\n65560,65561\n65563,2506\n65564,30\n65565,3148\n65566,41\n65568,158\n65568,406\n65568,3209\n65568,5375\n65569,2995\n65570,805\n65571,676\n65572,292\n65573,588\n65573,590\n65574,294\n65575,296\n65576,298\n65577,30\n65578,8675\n65579,255\n65580,6027\n65581,328\n65582,640\n65582,2206\n65582,3247\n65583,7124\n65584,65585\n65584,99194\n65586,187\n65587,1392\n65587,1745\n65588,3413\n65589,1745\n65590,8598\n65591,704\n65592,1238\n65594,310\n65594,805\n65595,1452\n65596,233\n65597,30\n65598,30\n65599,65600\n65599,96208\n65599,105110\n65599,217281\n65599,235331\n65599,252421\n65599,259921\n65601,44\n65602,65603\n65604,392\n65605,366\n65606,217\n65607,874\n65608,65609\n65610,1776\n65611,255\n65612,3148\n65613,1955\n65614,1541\n65615,14098\n65615,25395\n65615,28193\n65615,67867\n65615,156718\n65615,213931\n65615,247765\n65616,83\n65618,393\n65619,8822\n65620,355\n65621,5250\n65622,171\n65623,79\n65624,337\n65625,586\n65628,1010\n65629,158\n65630,337\n65631,586\n65632,1140\n65632,1465\n65633,337\n65634,586\n65635,775\n65635,795\n65635,1001\n65635,1411\n65635,2006\n65635,5130\n65636,349\n65637,298\n65638,485\n65639,1181\n65641,337\n65642,586\n65643,8270\n65644,314\n65645,2116\n65646,1019\n65647,920\n65648,255\n65649,30\n65651,1531\n65652,264\n65652,687\n65652,893\n65653,1\n65653,467\n65653,1844\n65653,162599\n65654,671\n65655,147\n65656,1243\n65657,79\n65658,5366\n65659,184\n65660,392\n65661,1132\n65662,781\n65663,126\n65663,1133\n65664,217\n65666,2574\n65667,2699\n65668,298\n65669,485\n65670,872\n65671,1634\n65672,500\n65673,1962\n65674,1052\n65675,1882\n65676,2775\n65677,54\n65678,671\n65679,66\n65680,34\n65680,35\n65681,104\n65681,111\n65681,134\n65681,248\n65681,309\n65681,310\n65681,332\n65681,372\n65681,483\n65681,503\n65681,588\n65681,590\n65681,631\n65681,714\n65681,760\n65681,805\n65681,1119\n65681,1149\n65681,1282\n65681,1462\n65681,1631\n65681,1849\n65681,1882\n65681,1955\n65681,2008\n65681,2205\n65681,2209\n65681,2210\n65681,2443\n65681,2797\n65681,4237\n65681,6556\n65681,8537\n65681,33424\n65682,1265\n65682,1266\n65683,704\n65684,366\n65686,1007\n65687,875\n65688,41\n65690,640\n65691,875\n65692,640\n65693,1858\n65694,1860\n65696,8788\n65697,1608\n65699,195\n65700,620\n65701,3295\n65702,3960\n65703,1188\n65704,563\n65706,500\n65707,425\n65707,1235\n65707,1335\n65708,1345\n65709,302\n65709,893\n65710,79\n65711,298\n65711,1659\n65711,2205\n65711,2286\n65711,4220\n65711,33424\n65711,66297\n65712,298\n65713,485\n65714,3209\n65715,299\n65716,79\n65717,6357\n65718,192\n65719,1724\n65720,72\n65721,344\n65722,285\n65723,147\n65723,149\n65723,171\n65723,859\n65723,1623\n65724,207\n65725,577\n65725,762\n65725,1247\n65726,72\n65727,344\n65728,285\n65729,1983\n65730,1860\n65731,1983\n65732,731\n65733,1844\n65734,58\n65735,46\n65736,1860\n65737,120\n65738,171\n65739,1556\n65740,337\n65741,586\n65743,83\n65744,920\n65745,479\n65747,104\n65747,760\n65747,818\n65748,22\n65750,500\n65751,779\n65752,18726\n65754,298\n65755,485\n65756,717\n65757,996\n65758,163\n65759,50\n65759,2353\n65761,273\n65761,274\n65762,2048\n65763,3999\n65764,779\n65765,581\n65766,442\n65766,1939\n65767,240\n65767,1019\n65768,240\n65769,784\n65769,1119\n65769,1285\n65769,1462\n65769,1888\n65769,84257\n65769,185877\n65770,192\n65770,604\n65772,579\n65773,309\n65773,310\n65774,422\n65775,422\n65776,422\n65777,422\n65778,422\n65779,17588\n65780,422\n65781,422\n65782,422\n65783,631\n65783,1285\n65784,422\n65785,390\n65785,784\n65786,346\n65787,337\n65788,586\n65789,1\n65789,283\n65789,6837\n65790,1011\n65791,1590\n65791,1644\n65792,337\n65793,586\n65794,459\n65795,240\n65795,417\n65797,1001\n65798,171\n65799,187\n65800,422\n65801,56\n65802,17228\n65803,644\n65805,3582\n65806,440\n65806,794\n65806,1740\n65807,1411\n65808,1179\n65810,337\n65811,586\n65812,26\n65812,59\n65812,430\n65812,994\n65812,1235\n65812,1335\n65812,3816\n65812,3817\n65812,21944\n65813,356\n65814,1634\n65815,536\n65816,805\n65817,119\n65817,192\n65817,217\n65817,305\n65817,337\n65817,577\n65817,1188\n65817,1400\n65817,2253\n65817,4101\n65817,13538\n65817,21944\n65817,142426\n65818,707\n65818,713\n65818,3999\n65818,258631\n65819,20\n65821,1\n65822,1\n65823,1\n65824,292\n65824,1085\n65824,1688\n65824,1722\n65825,72\n65826,1\n65826,147\n65826,336\n65827,1807\n65827,1893\n65827,149534\n65829,1688\n65830,1132\n65831,781\n65834,415\n65836,32\n65836,273\n65836,289\n65836,290\n65837,72\n65838,344\n65839,285\n65840,557\n65842,1326\n65843,86\n65845,1509\n65846,106\n65846,158\n65846,272\n65846,337\n65846,346\n65846,439\n65846,516\n65846,726\n65846,934\n65846,980\n65846,1181\n65846,2178\n65846,4545\n65847,264\n65847,467\n65847,515\n65847,1127\n65847,1147\n65847,1551\n65847,1659\n65847,2626\n65848,364\n65849,27550\n65850,433\n65851,209\n65852,622\n65853,1474\n65854,2775\n65854,204093\n65855,1977\n65855,1978\n65856,240\n65856,818\n65856,17309\n65858,788\n65859,693\n65863,500\n65863,718\n65864,30\n65864,104\n65864,134\n65864,135\n65864,136\n65864,137\n65864,138\n65864,1432\n65864,1564\n65864,4276\n65865,1323\n65866,102\n65867,1326\n65868,408\n65869,875\n65871,344\n65871,1711\n65871,1836\n65872,4060\n65873,195\n65873,305\n65873,310\n65873,3039\n65874,35905\n65875,360\n65876,71\n65878,195\n65879,30\n65880,81\n65881,240\n65881,302\n65881,779\n65881,818\n65881,1515\n65881,3041\n65881,3999\n65881,92476\n65882,422\n65883,56\n65884,356\n65885,184\n65886,862\n65886,3367\n65887,130\n65888,6303\n65888,63471\n65889,1243\n65890,240\n65892,536\n65893,18726\n65894,163\n65895,483\n65897,1284\n65898,1465\n65899,65900\n65901,611\n65901,2867\n65901,2868\n65902,298\n65903,485\n65904,79\n65905,313\n65906,390\n65907,158\n65907,779\n65908,406\n65909,372\n65910,247\n65911,1619\n65911,37414\n65911,193129\n65912,240\n65912,818\n65913,21944\n65915,1\n65915,467\n65915,868\n65915,1844\n65915,156379\n65915,162599\n65916,66\n65917,79\n65918,1179\n65918,2701\n65919,859\n65919,972\n65920,1370\n65921,422\n65922,56\n65923,1556\n65924,310\n65925,493\n65926,1619\n65927,516\n65928,919\n65930,1231\n65931,187\n65931,390\n65931,489\n65931,615\n65931,852\n65931,968\n65931,999\n65931,1718\n65931,1801\n65931,1805\n65931,3182\n65931,3422\n65931,4760\n65931,5591\n65931,6068\n65931,214131\n65932,298\n65933,485\n65934,79\n65935,305\n65936,86\n65936,602\n65937,30\n65938,147\n65938,158\n65939,83\n65940,1860\n65940,6955\n65941,10\n65942,298\n65943,65944\n65945,79\n65946,217\n65946,222\n65946,5265\n65946,6789\n65947,657\n65947,1019\n65948,920\n65949,292\n65950,50\n65950,77\n65950,79\n65950,211\n65950,217\n65950,283\n65950,333\n65950,344\n65950,360\n65950,422\n65950,527\n65950,583\n65950,586\n65950,623\n65950,652\n65950,718\n65950,731\n65950,1149\n65950,1177\n65950,1201\n65950,1210\n65950,1392\n65950,1425\n65950,1466\n65950,1572\n65950,1801\n65950,2617\n65950,3295\n65950,3804\n65950,5726\n65950,13136\n65950,17309\n65950,67005\n65950,69377\n65950,69381\n65950,69890\n65952,30\n65953,1001\n65953,3094\n65954,4980\n65955,35486\n65956,149\n65957,920\n65959,704\n65960,292\n65961,292\n65962,292\n65964,1188\n65965,222\n65965,455\n65965,1019\n65966,59021\n65967,137\n65968,772\n65969,151\n65970,349\n65970,3260\n65971,2379\n65972,920\n65973,422\n65974,56\n65976,671\n65977,676\n65978,1619\n65979,477\n65980,647\n65981,65982\n65983,200\n65983,2224\n65983,2286\n65983,8180\n65984,760\n65985,676\n65986,65987\n65988,65989\n65990,30\n65991,704\n65992,250\n65992,1684\n65993,1749\n65994,247\n65995,104\n65995,136\n65995,138\n65995,557\n65995,1368\n65996,10\n65997,104\n65998,65999\n66000,389\n66000,1072\n66001,117\n66001,2712\n66002,3297\n66003,875\n66004,47\n66004,2469\n66005,4218\n66005,4220\n66005,66297\n66007,4475\n66008,195\n66009,187\n66010,872\n66011,406\n66011,779\n66012,355\n66012,991\n66013,818\n66014,217\n66015,622\n66016,298\n66017,485\n66018,2590\n66019,83\n66020,704\n66021,376\n66022,151\n66023,417\n66024,3413\n66025,217\n66026,72\n66027,704\n66028,149\n66029,10\n66030,636\n66031,130\n66031,264\n66031,1007\n66031,1010\n66031,1509\n66031,1551\n66031,3041\n66031,3999\n66031,5440\n66032,818\n66033,251\n66034,2367\n66035,671\n66036,1127\n66036,49057\n66037,861\n66038,271\n66039,586\n66040,2178\n66040,4545\n66041,104\n66042,298\n66043,66044\n66045,206\n66045,690\n66046,312\n66047,30\n66048,240\n66048,818\n66049,2775\n66050,187\n66051,2867\n66051,22880\n66052,298\n66053,485\n66054,447\n66055,211\n66055,7363\n66056,557\n66057,30\n66060,298\n66062,455\n66063,392\n66064,1801\n66064,3182\n66065,30\n66066,1241\n66066,1849\n66066,2620\n66067,1\n66068,3602\n66069,873\n66070,1210\n66071,104\n66071,134\n66072,592\n66073,10\n66074,30\n66076,72\n66077,298\n66079,485\n66080,557\n66081,557\n66082,211\n66084,516\n66085,30\n66086,240\n66087,1298\n66088,3413\n66089,349\n66091,16045\n66092,83\n66093,65999\n66094,1639\n66095,2929\n66096,2929\n66098,1639\n66099,1016\n66100,433\n66101,640\n66102,671\n66103,415\n66104,433\n66105,563\n66106,1803\n66107,298\n66108,485\n66109,206\n66110,417\n66112,83\n66113,247\n66114,1247\n66115,72\n66116,417\n66117,493\n66118,779\n66119,1274\n66120,217\n66121,779\n66122,72\n66123,536\n66124,2146\n66124,31977\n66125,66126\n66127,66128\n66127,175254\n66129,4276\n66130,577\n66131,704\n66132,431\n66133,217\n66134,455\n66135,2146\n66136,2379\n66137,151\n66138,195\n66139,779\n66140,72\n66141,392\n66142,292\n66144,406\n66145,620\n66146,366\n66147,118\n66147,4597\n66148,1453\n66148,1785\n66148,3804\n66149,779\n66150,8598\n66151,602\n66152,17384\n66153,104\n66153,137\n66154,779\n66155,200\n66155,772\n66156,298\n66157,104\n66157,135\n66158,310\n66159,66160\n66159,110199\n66159,115051\n66159,115149\n66159,123461\n66159,206046\n66161,8270\n66162,34\n66162,35\n66163,1871\n66164,376\n66165,4475\n66166,972\n66167,72\n66168,640\n66169,267\n66170,640\n66171,779\n66172,66173\n66174,5375\n66175,192\n66175,333\n66176,10\n66177,3\n66177,3538\n66177,7358\n66177,7363\n66177,15609\n66178,3\n66180,704\n66181,10\n66182,3316\n66183,1070\n66184,687\n66185,207\n66186,640\n66187,422\n66188,1368\n66189,195\n66190,862\n66190,1085\n66190,2590\n66190,8884\n66191,3960\n66192,809\n66193,195\n66194,4455\n66195,932\n66196,602\n66197,22125\n66198,968\n66199,589\n66200,640\n66201,10\n66203,151\n66203,1773\n66204,349\n66205,211\n66206,493\n66206,59021\n66207,66208\n66209,273\n66209,274\n66210,349\n66211,663\n66211,664\n66211,980\n66212,66213\n66214,1634\n66215,1688\n66216,81\n66216,3370\n66217,1201\n66218,298\n66219,485\n66220,66221\n66222,8270\n66223,536\n66224,66225\n66226,3895\n66227,32\n66227,34\n66227,35\n66227,72\n66227,104\n66227,111\n66227,120\n66227,178\n66227,192\n66227,202\n66227,203\n66227,217\n66227,225\n66227,248\n66227,283\n66227,296\n66227,301\n66227,332\n66227,346\n66227,358\n66227,372\n66227,383\n66227,388\n66227,390\n66227,392\n66227,422\n66227,439\n66227,455\n66227,509\n66227,518\n66227,525\n66227,586\n66227,631\n66227,687\n66227,717\n66227,720\n66227,752\n66227,779\n66227,795\n66227,873\n66227,907\n66227,919\n66227,934\n66227,968\n66227,980\n66227,1001\n66227,1010\n66227,1052\n66227,1085\n66227,1133\n66227,1140\n66227,1149\n66227,1167\n66227,1177\n66227,1179\n66227,1210\n66227,1231\n66227,1240\n66227,1274\n66227,1298\n66227,1309\n66227,1326\n66227,1332\n66227,1381\n66227,1411\n66227,1436\n66227,1466\n66227,1515\n66227,1522\n66227,1544\n66227,1564\n66227,1590\n66227,1634\n66227,1644\n66227,1715\n66227,1722\n66227,1837\n66227,1849\n66227,1877\n66227,1893\n66227,1939\n66227,1977\n66227,1978\n66227,2045\n66227,2443\n66227,2557\n66227,2620\n66227,2699\n66227,2979\n66227,2989\n66227,2991\n66227,3135\n66227,3182\n66227,3194\n66227,3207\n66227,3218\n66227,3422\n66227,3538\n66227,3695\n66227,3804\n66227,3999\n66227,5405\n66227,5662\n66227,5718\n66227,5874\n66227,6068\n66227,6955\n66227,8180\n66227,14126\n66227,14797\n66227,14819\n66228,515\n66228,835\n66229,1201\n66230,872\n66231,222\n66231,393\n66232,72\n66233,310\n66233,805\n66234,72\n66235,868\n66236,233\n66237,2146\n66238,760\n66238,1149\n66239,10\n66239,113156\n66241,1052\n66242,534\n66244,273\n66244,274\n66245,50\n66245,687\n66245,868\n66245,893\n66245,968\n66245,2116\n66245,5265\n66247,3\n66248,355\n66249,740\n66249,741\n66250,301\n66250,538\n66251,66252\n66253,222\n66253,657\n66254,337\n66255,586\n66256,118\n66256,4597\n66257,1181\n66258,439\n66258,861\n66258,1294\n66258,1776\n66259,305\n66260,1634\n66261,8270\n66262,707\n66263,337\n66264,586\n66265,1392\n66266,1181\n66267,1962\n66269,333\n66270,292\n66271,337\n66272,586\n66274,1274\n66275,30\n66276,138\n66277,195\n66278,10\n66278,54\n66278,104\n66278,147\n66278,192\n66278,195\n66278,252\n66278,275\n66278,333\n66278,336\n66278,452\n66278,500\n66278,563\n66278,577\n66278,586\n66278,620\n66278,622\n66278,628\n66278,657\n66278,760\n66278,872\n66278,972\n66278,992\n66278,1118\n66278,1140\n66278,1163\n66278,1204\n66278,1257\n66278,1267\n66278,1631\n66278,1655\n66278,1659\n66278,1893\n66278,3260\n66278,3507\n66278,5874\n66278,30428\n66278,43203\n66278,54284\n66279,1983\n66280,209\n66281,302\n66282,17588\n66283,640\n66284,66285\n66286,1983\n66287,907\n66287,932\n66288,10\n66288,48\n66288,275\n66288,277\n66288,483\n66288,615\n66288,4748\n66288,69266\n66289,81\n66290,217\n66290,467\n66290,920\n66291,296\n66293,3960\n66294,1181\n66295,1181\n66297,68\n66297,356\n66297,387\n66297,685\n66297,852\n66297,1715\n66297,2590\n66297,2620\n66297,4218\n66297,4220\n66297,4222\n66297,4532\n66297,8632\n66297,16717\n66297,20982\n66297,24906\n66297,33728\n66297,36250\n66297,37534\n66297,38822\n66297,42810\n66297,56710\n66297,60385\n66297,65711\n66297,66005\n66297,66297\n66297,110144\n66297,114182\n66297,114901\n66297,116543\n66297,127158\n66297,128361\n66297,137881\n66297,144231\n66297,158949\n66297,177034\n66297,178576\n66297,180348\n66297,181130\n66297,186065\n66297,187297\n66297,193129\n66297,206174\n66297,212048\n66297,212077\n66297,228524\n66297,228629\n66297,229109\n66297,230366\n66297,255240\n66297,255242\n66297,257052\n66297,257113\n66298,22\n66298,217\n66298,1590\n66300,918\n66301,557\n66301,818\n66301,2017\n66302,2929\n66303,657\n66304,393\n66304,1235\n66305,372\n66305,442\n66305,704\n66305,872\n66305,1882\n66305,2697\n66305,4355\n66305,54004\n66306,4193\n66306,4355\n66307,2931\n66308,399\n66309,34\n66309,1776\n66310,1\n66310,10\n66310,50\n66310,58\n66310,137\n66310,158\n66310,195\n66310,222\n66310,273\n66310,312\n66310,333\n66310,344\n66310,435\n66310,673\n66310,818\n66310,1462\n66310,1509\n66310,1635\n66310,1659\n66310,2017\n66310,3555\n66310,8537\n66310,66754\n66311,192\n66311,285\n66311,305\n66311,422\n66311,431\n66311,459\n66311,536\n66311,622\n66311,657\n66311,811\n66311,859\n66311,1122\n66311,1163\n66311,1740\n66311,2371\n66311,2867\n66311,2868\n66311,5301\n66311,17384\n66311,54004\n66312,72\n66313,640\n66314,640\n66315,640\n66316,640\n66317,640\n66318,1181\n66319,72\n66320,1509\n66322,827\n66322,1707\n66323,259\n66324,66325\n66324,110238\n66326,1181\n66328,599\n66329,1085\n66329,2083\n66330,875\n66331,326\n66331,21944\n66332,1181\n66334,215\n66336,1983\n66338,657\n66339,1181\n66340,481\n66341,298\n66341,131604\n66342,1181\n66343,104\n66343,2443\n66344,996\n66346,10\n66346,136\n66346,217\n66346,452\n66346,457\n66346,599\n66346,985\n66346,1181\n66346,2617\n66346,3630\n66346,35687\n66347,980\n66348,215\n66348,336\n66348,596\n66348,2210\n66348,4237\n66348,116074\n66348,154168\n66348,172609\n66348,182320\n66350,703\n66350,852\n66351,1655\n66352,50\n66353,2210\n66353,4237\n66354,579\n66354,811\n66354,7194\n66355,433\n66357,596\n66358,273\n66358,274\n66358,640\n66358,1572\n66359,83\n66361,1181\n66362,248\n66363,248\n66364,68\n66365,252\n66365,1220\n66366,1\n66366,222\n66366,7092\n66368,433\n66369,209\n66370,1181\n66371,16019\n66373,248\n66374,344\n66375,72\n66376,146\n66377,2083\n66378,56\n66378,147\n66378,158\n66379,83\n66380,1033\n66380,1151\n66380,68069\n66380,86832\n66380,131303\n66381,510\n66382,151\n66384,301\n66385,477\n66386,2146\n66387,493\n66387,682\n66387,72439\n66388,1893\n66389,1238\n66390,2775\n66391,447\n66392,527\n66392,657\n66392,758\n66393,811\n66394,605\n66394,2315\n66395,1181\n66396,9007\n66397,349\n66397,697\n66397,1985\n66398,1\n66399,66\n66400,387\n66400,920\n66401,273\n66401,274\n66401,66754\n66402,1181\n66403,285\n66404,240\n66405,192\n66405,920\n66405,1118\n66406,893\n66407,66408\n66409,10\n66409,431\n66409,809\n66409,1181\n66409,2979\n66409,3252\n66410,1243\n66412,1619\n66413,134\n66413,227\n66413,289\n66413,290\n66413,292\n66413,387\n66413,745\n66413,1058\n66413,1267\n66413,1634\n66413,1677\n66413,1724\n66413,1891\n66413,3194\n66413,3830\n66413,6263\n66413,16614\n66414,581\n66415,344\n66416,920\n66417,1046\n66418,433\n66419,1983\n66420,861\n66421,338\n66421,2779\n66422,628\n66423,309\n66423,310\n66424,859\n66426,313\n66429,433\n66430,304\n66431,3698\n66431,19488\n66432,209\n66433,83\n66433,86\n66433,269\n66433,841\n66434,66435\n66436,66435\n66437,269\n66438,1509\n66439,304\n66439,1305\n66441,304\n66441,1326\n66442,337\n66443,586\n66444,171\n66445,66446\n66447,2146\n66448,980\n66448,1531\n66449,1149\n66450,1220\n66450,1222\n66451,1639\n66452,17309\n66453,622\n66454,140\n66456,932\n66457,283\n66458,337\n66459,586\n66460,5212\n66461,66462\n66463,72\n66464,206\n66465,192\n66465,577\n66465,1776\n66466,389\n66467,736\n66467,49057\n66467,81070\n66468,120\n66468,389\n66468,3115\n66469,42220\n66472,859\n66473,298\n66474,485\n66475,1590\n66475,223179\n66475,226902\n66476,3260\n66477,4192\n66477,4193\n66478,1983\n66480,1465\n66481,1893\n66482,644\n66483,1983\n66484,87\n66484,1151\n66484,2274\n66485,422\n66486,1326\n66487,422\n66488,422\n66489,631\n66489,2620\n66489,6837\n66490,422\n66491,422\n66492,298\n66493,485\n66494,422\n66495,422\n66497,1267\n66498,422\n66499,5101\n66500,611\n66500,631\n66500,1118\n66500,1807\n66500,1955\n66500,2208\n66500,2991\n66500,6837\n66500,13555\n66500,14597\n66500,49456\n66500,60432\n66500,63965\n66500,76748\n66500,82564\n66500,103090\n66500,103092\n66500,106492\n66500,146393\n66500,152894\n66503,422\n66504,296\n66505,2620\n66506,972\n66506,973\n66506,1300\n66509,2146\n66510,10\n66511,636\n66513,3115\n66514,30\n66516,337\n66517,586\n66518,1265\n66518,1266\n66519,1631\n66520,749\n66520,1313\n66520,1571\n66521,1983\n66522,1893\n66523,744\n66523,783\n66523,1033\n66524,1893\n66525,1181\n66526,10\n66526,306\n66526,307\n66526,344\n66526,657\n66526,838\n66526,861\n66528,1\n66530,605\n66531,87\n66531,3507\n66531,31977\n66532,10\n66532,15\n66532,22\n66532,50\n66532,79\n66532,104\n66532,119\n66532,130\n66532,158\n66532,206\n66532,227\n66532,259\n66532,267\n66532,292\n66532,338\n66532,352\n66532,571\n66532,604\n66532,615\n66532,760\n66532,907\n66532,992\n66532,996\n66532,1052\n66532,1068\n66532,1127\n66532,1359\n66532,1837\n66532,6298\n66532,8270\n66532,67888\n66532,73959\n66533,50\n66534,779\n66535,338\n66536,1590\n66537,485\n66538,1590\n66538,31237\n66539,4237\n66540,1220\n66540,1222\n66541,136\n66542,10\n66543,577\n66544,5265\n66545,20\n66546,1977\n66546,1978\n66547,485\n66548,158\n66548,644\n66548,779\n66548,1515\n66550,2224\n66551,1983\n66553,83\n66555,2224\n66556,809\n66556,862\n66557,868\n66558,195\n66558,17228\n66558,27217\n66559,682\n66559,1512\n66559,5992\n66559,72439\n66560,760\n66561,2411\n66562,106\n66562,393\n66562,527\n66562,745\n66562,1313\n66562,2089\n66562,2940\n66562,8270\n66562,21944\n66562,73626\n66564,184\n66565,957\n66565,1815\n66566,1515\n66567,79\n66567,192\n66567,571\n66567,2266\n66567,3207\n66567,43613\n66569,640\n66570,2620\n66571,640\n66572,292\n66572,1085\n66572,1285\n66572,171641\n66573,30\n66573,240\n66573,301\n66573,366\n66573,704\n66573,875\n66573,5547\n66574,640\n66575,32\n66575,505\n66575,647\n66575,20757\n66576,622\n66577,1805\n66578,911\n66579,1572\n66579,70331\n66580,4805\n66581,8598\n66582,356\n66583,17384\n66584,356\n66584,788\n66585,1231\n66586,222\n66586,301\n66586,620\n66586,718\n66586,2989\n66586,2991\n66586,3182\n66586,20771\n66587,1085\n66588,3999\n66588,14550\n66589,595\n66591,30\n66592,160\n66593,3507\n66594,1300\n66595,49193\n66596,3209\n66598,1590\n66598,1796\n66598,3804\n66599,663\n66599,664\n66600,146\n66600,14366\n66601,31977\n66602,50\n66603,406\n66604,192\n66604,893\n66605,158\n66606,2073\n66607,337\n66608,586\n66609,337\n66610,586\n66611,1379\n66612,720\n66612,1188\n66613,130\n66614,277\n66614,290\n66614,585\n66616,2979\n66617,66\n66617,868\n66618,240\n66619,1462\n66619,8537\n66620,337\n66621,586\n66622,66623\n66622,170376\n66624,10\n66625,1085\n66626,1224\n66627,720\n66628,44\n66629,32\n66629,349\n66629,392\n66629,509\n66629,595\n66629,644\n66629,697\n66629,779\n66629,918\n66629,1240\n66629,1363\n66629,1454\n66629,1465\n66629,1805\n66629,1893\n66629,2699\n66629,4760\n66629,9098\n66631,497\n66631,668\n66631,762\n66631,1132\n66631,1147\n66632,835\n66632,1127\n66632,1893\n66632,81070\n66633,24505\n66634,32\n66635,1818\n66636,1893\n66637,134\n66637,248\n66637,332\n66638,2146\n66639,79\n66639,631\n66640,640\n66642,17588\n66643,579\n66644,968\n66645,435\n66646,30\n66647,81\n66648,147\n66648,171\n66648,859\n66650,66651\n66652,596\n66653,6068\n66654,30\n66655,50\n66656,1133\n66657,805\n66658,30\n66659,310\n66660,433\n66660,1634\n66662,392\n66662,1151\n66663,10\n66664,22\n66664,818\n66665,525\n66666,344\n66666,1836\n66667,30\n66668,77\n66669,433\n66669,1118\n66669,5547\n66670,760\n66670,1785\n66670,3422\n66671,30331\n66672,355\n66673,83\n66674,13661\n66675,366\n66676,1411\n66677,13361\n66678,126\n66678,190492\n66679,1858\n66680,1860\n66681,1634\n66682,222\n66682,358\n66682,536\n66682,1019\n66684,30\n66685,66686\n66687,333\n66687,1181\n66688,21944\n66690,1572\n66691,417\n66691,1235\n66692,72\n66693,31977\n66694,66695\n66697,1247\n66698,872\n66699,72\n66700,8788\n66701,130\n66703,54\n66703,217\n66703,222\n66703,379\n66703,477\n66703,536\n66703,634\n66703,781\n66703,949\n66703,1019\n66703,1274\n66703,1417\n66703,1724\n66703,2168\n66703,2421\n66703,2646\n66703,2784\n66703,2944\n66703,7698\n66704,30\n66705,366\n66706,485\n66706,24500\n66707,184\n66708,1634\n66709,424\n66711,1181\n66711,1265\n66712,1860\n66713,30\n66715,644\n66716,994\n66716,1235\n66716,1335\n66717,5405\n66718,21944\n66719,66720\n66721,147\n66722,657\n66723,151\n66724,10\n66724,113156\n66725,718\n66726,117\n66726,192\n66726,211\n66726,283\n66726,444\n66726,611\n66726,772\n66726,1149\n66726,1247\n66726,1265\n66726,1266\n66726,1388\n66726,1807\n66726,2712\n66726,2775\n66726,2989\n66726,2991\n66726,3218\n66726,3422\n66726,3756\n66726,4748\n66726,6789\n66726,66727\n66726,69215\n66726,69601\n66726,70279\n66726,70563\n66726,70586\n66726,73626\n66728,1980\n66728,8991\n66729,134\n66730,3422\n66731,779\n66732,1608\n66734,83\n66735,779\n66735,1769\n66736,1955\n66737,1359\n66738,1556\n66739,861\n66740,22\n66741,30\n66742,259\n66743,1193\n66743,1512\n66743,5992\n66743,25757\n66743,66743\n66743,80361\n66744,247\n66745,22\n66746,2146\n66747,676\n66748,1298\n66750,3246\n66750,3247\n66751,393\n66752,6323\n66754,273\n66755,66756\n66757,66758\n66757,89875\n66759,209\n66759,302\n66759,687\n66760,605\n66761,6303\n66762,481\n66763,19133\n66763,66695\n66763,66764\n66765,536\n66766,1635\n66768,515\n66769,455\n66770,151\n66771,222\n66772,1983\n66773,376\n66774,240\n66775,195\n66776,26\n66776,59\n66776,21944\n66777,1381\n66778,72\n66779,233\n66779,1181\n66780,50\n66780,219\n66780,1068\n66780,2209\n66780,4411\n66780,5192\n66781,360\n66782,326\n66783,1531\n66784,2674\n66785,287\n66786,1782\n66787,392\n66788,376\n66789,885\n66790,861\n66791,66792\n66793,134\n66796,7698\n66798,779\n66799,333\n66800,557\n66800,954\n66800,1939\n66801,640\n66801,2206\n66802,66803\n66804,1467\n66805,536\n66806,1257\n66806,2379\n66807,1381\n66808,248\n66809,32\n66810,1983\n66811,66812\n66814,2995\n66815,1118\n66816,1462\n66816,2351\n66817,26\n66817,59\n66817,994\n66819,21487\n66819,22880\n66820,4276\n66821,872\n66822,1133\n66823,247\n66824,1556\n66825,861\n66826,22\n66827,1118\n66828,483\n66829,805\n66830,310\n66831,211\n66831,333\n66833,682\n66834,1140\n66834,2443\n66835,203\n66835,372\n66836,83\n66837,2671\n66839,438\n66840,66841\n66842,66843\n66844,1968\n66845,1265\n66845,1266\n66846,1983\n66848,1\n66850,438\n66851,1707\n66852,72\n66853,217\n66854,58\n66855,252\n66856,1287\n66857,9029\n66858,79\n66859,417\n66860,65\n66860,287\n66860,1267\n66860,1294\n66860,1400\n66860,1631\n66860,2371\n66860,3297\n66860,5469\n66861,72\n66862,66863\n66864,493\n66865,30\n66866,66867\n66868,714\n66868,1119\n66869,779\n66871,10\n66872,477\n66873,1368\n66874,557\n66875,557\n66878,160\n66879,171\n66880,66881\n66882,66883\n66884,1210\n66885,222\n66885,1019\n66886,72\n66887,240\n66888,30\n66889,302\n66890,1\n66890,200\n66890,202\n66890,203\n66890,222\n66890,252\n66890,571\n66890,779\n66890,872\n66890,1181\n66890,1572\n66890,41170\n66891,422\n66892,56\n66893,2626\n66895,66896\n66897,515\n66899,302\n66899,893\n66900,118\n66900,4597\n66901,30\n66902,79\n66903,66904\n66903,66925\n66905,8822\n66906,2929\n66907,200\n66907,772\n66908,151\n66908,309\n66908,310\n66908,21944\n66911,2424\n66912,671\n66913,118\n66913,4597\n66914,118\n66914,4597\n66915,366\n66916,344\n66916,4611\n66917,586\n66918,1309\n66918,1955\n66919,272\n66920,17334\n66921,644\n66922,149\n66923,50\n66924,439\n66926,30\n66927,1\n66928,298\n66929,485\n66930,313\n66930,406\n66930,536\n66931,1181\n66932,207\n66933,298\n66934,485\n66936,406\n66936,536\n66937,1722\n66938,1556\n66939,1419\n66940,2931\n66941,72\n66942,392\n66943,1058\n66943,1434\n66943,3585\n66944,1612\n66944,2146\n66945,1983\n66946,66947\n66948,1\n66949,3370\n66949,14453\n66951,818\n66952,8270\n66953,192\n66954,10\n66955,640\n66956,10\n66957,72\n66958,149\n66959,8270\n66960,240\n66961,192\n66962,1140\n66963,685\n66963,919\n66963,1363\n66963,2480\n66963,3193\n66963,3467\n66963,3524\n66963,5662\n66963,6837\n66964,72\n66965,626\n66966,59021\n66967,30\n66968,805\n66969,23011\n66970,30\n66971,1\n66972,66973\n66974,83\n66974,258\n66975,66976\n66977,195\n66978,2315\n66979,9121\n66980,1556\n66981,861\n66982,22\n66983,158\n66983,2931\n66985,99\n66986,1085\n66986,2590\n66987,298\n66988,485\n66989,30\n66990,467\n66991,252\n66992,255\n66993,65999\n66994,1983\n66995,178\n66996,2351\n66997,8788\n66998,10\n66999,406\n67000,19133\n67000,66813\n67000,67299\n67001,2073\n67002,920\n67003,310\n67004,571\n67004,67005\n67006,30\n67007,67008\n67009,557\n67010,217\n67011,818\n67012,104\n67012,483\n67012,588\n67012,590\n67012,859\n67012,1149\n67012,1181\n67012,1860\n67012,5265\n67012,21944\n67012,67013\n67015,479\n67015,682\n67016,4771\n67017,3804\n67018,1\n67019,1551\n67020,932\n67021,4276\n67021,22880\n67022,1133\n67023,2867\n67023,22880\n67024,2506\n67025,1980\n67025,8991\n67026,2048\n67027,30\n67028,240\n67028,332\n67028,372\n67028,1140\n67028,1285\n67028,1955\n67028,2371\n67028,9026\n67029,1\n67030,9560\n67031,104\n67032,779\n67033,1608\n67034,151\n67035,30\n67036,30\n67037,30\n67038,1634\n67039,1634\n67040,349\n67041,1634\n67042,2371\n67043,1019\n67044,79\n67045,1265\n67045,1266\n67046,1983\n67047,1326\n67048,211\n67049,5440\n67050,233\n67051,673\n67053,67054\n67055,175\n67055,693\n67056,9560\n67057,355\n67058,493\n67059,640\n67061,366\n67062,79\n67063,2506\n67064,302\n67065,2146\n67066,366\n67067,225\n67068,393\n67068,3724\n67069,30\n67070,93\n67070,94\n67071,4355\n67072,34\n67072,1776\n67072,4193\n67073,298\n67075,67076\n67077,2779\n67078,192\n67078,920\n67079,45023\n67080,2286\n67081,2146\n67082,206\n67084,217\n67084,2867\n67084,22880\n67085,67086\n67088,516\n67089,206\n67089,4220\n67089,6119\n67090,972\n67090,973\n67091,622\n67092,972\n67093,1531\n67094,3804\n67095,67096\n67097,873\n67097,48505\n67098,333\n67098,1262\n67098,1313\n67098,1402\n67100,2146\n67101,58\n67103,67104\n67105,254\n67106,811\n67107,1983\n67108,310\n67108,483\n67108,1147\n67108,3039\n67109,1381\n67110,63\n67110,344\n67111,2480\n67112,3447\n67113,4060\n67114,67115\n67116,467\n67116,1782\n67116,1837\n67117,275\n67117,277\n67118,497\n67119,439\n67119,1033\n67120,1267\n67121,424\n67121,3769\n67122,875\n67123,1072\n67124,450\n67125,843\n67126,2315\n67129,843\n67130,843\n67131,1010\n67132,167\n67132,301\n67133,843\n67134,158\n67135,67136\n67137,3695\n67138,843\n67139,1243\n67140,72\n67141,287\n67141,1634\n67142,972\n67143,2931\n67144,63\n67145,50\n67146,1085\n67147,941\n67147,3182\n67148,333\n67149,79\n67152,775\n67155,187\n67156,67157\n67158,604\n67159,252\n67159,1220\n67159,1222\n67160,435\n67161,259\n67162,557\n67163,1893\n67164,106\n67164,59021\n67165,333\n67167,1240\n67168,852\n67168,6068\n67169,2372\n67170,67171\n67172,809\n67172,1326\n67173,94\n67173,184\n67173,2787\n67174,160\n67175,83\n67176,67177\n67178,1556\n67179,805\n67180,481\n67181,875\n67182,356\n67183,571\n67183,647\n67183,1452\n67183,3297\n67183,6119\n67183,20771\n67184,503\n67185,240\n67185,444\n67185,818\n67185,1796\n67185,2812\n67186,2371\n67187,10\n67187,79\n67187,134\n67187,147\n67187,178\n67187,202\n67187,203\n67187,287\n67187,323\n67187,333\n67187,366\n67187,720\n67187,805\n67187,1400\n67187,2372\n67187,2995\n67187,32475\n67188,422\n67189,422\n67190,652\n67191,422\n67192,422\n67193,422\n67194,422\n67195,21944\n67196,158\n67197,2931\n67197,8811\n67198,726\n67199,516\n67199,103389\n67199,130977\n67200,422\n67201,422\n67202,422\n67203,2116\n67204,5547\n67205,314\n67205,673\n67205,849\n67205,1130\n67206,195\n67207,1531\n67210,440\n67210,1085\n67211,67212\n67213,99\n67214,1858\n67215,1860\n67216,1\n67217,63\n67217,147\n67217,251\n67217,252\n67217,493\n67217,516\n67217,1243\n67217,1265\n67217,1266\n67217,1789\n67217,1927\n67217,3451\n67217,3452\n67217,17772\n67217,41170\n67218,1893\n67219,442\n67221,885\n67222,2889\n67223,18298\n67224,48\n67225,932\n67226,1201\n67227,1531\n67228,581\n67229,192\n67229,493\n67230,30\n67232,1381\n67233,477\n67234,1001\n67235,30\n67236,516\n67236,1001\n67236,1313\n67237,1370\n67238,1381\n67239,72\n67240,344\n67241,285\n67242,20257\n67244,118\n67244,4597\n67245,2146\n67247,67248\n67249,779\n67249,1181\n67249,1515\n67251,217\n67251,269\n67251,389\n67251,818\n67251,1019\n67251,1796\n67252,67253\n67254,136\n67254,137\n67255,333\n67257,663\n67257,664\n67258,72\n67259,344\n67260,285\n67261,636\n67262,9010\n67265,1143\n67266,120\n67266,694\n67266,148742\n67268,22\n67269,1572\n67270,6323\n67272,1210\n67272,5547\n67272,6119\n67273,67274\n67275,393\n67276,264\n67276,1007\n67276,1509\n67276,1551\n67276,191860\n67277,67278\n67279,344\n67279,1836\n67280,50\n67281,1707\n67282,1531\n67283,1370\n67283,1821\n67283,21736\n67284,5326\n67285,67286\n67287,118\n67287,4597\n67288,20771\n67289,1531\n67290,788\n67292,422\n67293,1983\n67294,21944\n67295,1631\n67296,5101\n67297,760\n67298,21944\n67300,247\n67301,13\n67302,1531\n67304,1531\n67305,30\n67306,67307\n67308,22\n67310,20\n67311,929\n67312,2929\n67313,192\n67313,346\n67313,949\n67313,1531\n67313,1572\n67313,6955\n67314,392\n67315,408\n67317,48\n67318,1983\n67319,586\n67320,50\n67321,818\n67322,644\n67323,264\n67324,1927\n67325,3345\n67326,366\n67328,77\n67329,515\n67330,1368\n67331,83\n67332,356\n67333,809\n67334,202\n67334,203\n67335,10\n67335,35\n67335,79\n67335,130\n67335,182\n67335,200\n67335,302\n67335,431\n67335,440\n67335,459\n67335,505\n67335,525\n67335,702\n67335,843\n67335,929\n67335,1147\n67335,1252\n67335,1374\n67335,1782\n67335,1803\n67335,1837\n67335,1962\n67335,2626\n67335,3297\n67335,4748\n67335,5726\n67335,6487\n67335,31206\n67335,72811\n67335,76185\n67335,81640\n67336,406\n67337,252\n67338,79\n67338,217\n67338,68671\n67338,69601\n67338,69829\n67339,217\n67339,536\n67339,2266\n67340,2116\n67342,67343\n67342,67349\n67343,95642\n67344,8992\n67345,10\n67345,86\n67345,192\n67345,330\n67345,527\n67345,1177\n67345,1181\n67345,5265\n67346,3538\n67347,406\n67348,1893\n67351,872\n67352,252\n67352,41170\n67353,298\n67355,1634\n67356,328\n67356,355\n67356,364\n67356,885\n67356,2315\n67356,21944\n67357,72\n67358,344\n67359,285\n67360,859\n67360,2782\n67361,158\n67361,252\n67361,622\n67361,41170\n67362,6323\n67363,818\n67364,2590\n67365,628\n67366,622\n67367,192\n67368,1506\n67368,1619\n67368,5908\n67369,217\n67370,310\n67371,920\n67372,44\n67373,1531\n67374,3585\n67375,479\n67376,217\n67376,1019\n67377,1085\n67378,67379\n67380,682\n67380,2244\n67380,72439\n67381,309\n67381,310\n67381,760\n67382,1531\n67383,4691\n67384,58\n67384,217\n67384,1001\n67384,1411\n67384,1564\n67385,406\n67386,1531\n67387,1531\n67388,178\n67389,843\n67390,1955\n67391,217\n67391,1019\n67392,1634\n67393,647\n67394,344\n67395,577\n67395,1105\n67395,138686\n67396,1058\n67396,1653\n67398,1140\n67399,10\n67399,113156\n67400,10\n67401,72\n67402,344\n67403,285\n67404,2646\n67405,278\n67406,477\n67407,67408\n67409,366\n67410,515\n67411,1052\n67412,579\n67413,3161\n67414,65\n67415,56\n67416,67417\n67419,6387\n67420,422\n67421,56\n67422,779\n67423,872\n67424,4237\n67425,694\n67425,2557\n67426,1019\n67427,175\n67428,1556\n67430,337\n67431,586\n67432,44\n67433,1179\n67433,2146\n67434,247\n67435,337\n67436,586\n67437,67438\n67439,83\n67440,843\n67441,996\n67443,57810\n67443,67444\n67445,147\n67445,406\n67445,1425\n67445,80266\n67446,67447\n67448,67447\n67449,67447\n67450,67447\n67451,67447\n67452,67447\n67453,1370\n67453,1821\n67454,1453\n67455,640\n67456,1\n67457,48\n67457,136\n67457,211\n67457,240\n67457,358\n67457,397\n67457,483\n67457,628\n67457,673\n67457,707\n67457,713\n67457,718\n67457,740\n67457,741\n67457,809\n67457,1019\n67457,1127\n67457,1177\n67457,1572\n67457,3260\n67457,3367\n67457,4611\n67457,8270\n67457,15068\n67457,15119\n67458,949\n67459,283\n67460,195\n67461,2006\n67462,1085\n67463,67464\n67465,5547\n67466,406\n67466,1181\n67467,1572\n67468,72\n67469,663\n67469,664\n67470,801\n67470,54362\n67471,83\n67472,2506\n67473,292\n67474,67475\n67476,588\n67476,590\n67478,1572\n67480,8270\n67481,30\n67482,387\n67483,347\n67484,493\n67484,682\n67485,389\n67485,1072\n67486,1179\n67486,1305\n67487,657\n67488,720\n67488,973\n67488,1001\n67488,1117\n67488,1522\n67488,1715\n67488,2191\n67489,2073\n67490,86\n67490,202\n67490,203\n67490,439\n67490,611\n67490,809\n67491,455\n67492,10\n67493,1782\n67494,805\n67495,21944\n67496,31237\n67497,3367\n67498,4\n67498,5\n67499,772\n67499,1659\n67499,1688\n67500,1181\n67502,2574\n67503,704\n67504,1556\n67505,861\n67506,22\n67507,714\n67507,1119\n67508,151\n67509,4039\n67510,585\n67511,861\n67512,390\n67512,2480\n67512,3207\n67513,1381\n67514,67515\n67516,67517\n67518,292\n67519,801\n67519,1085\n67519,54362\n67520,10\n67520,195\n67520,302\n67520,657\n67520,1572\n67520,73074\n67521,376\n67522,885\n67523,827\n67524,760\n67525,2574\n67526,1\n67526,620\n67526,6387\n67527,827\n67528,222\n67529,67530\n67531,182\n67534,2775\n67535,22\n67536,175\n67536,671\n67536,693\n67536,1147\n67536,1623\n67537,287\n67537,809\n67537,19010\n67539,67540\n67541,280\n67541,17245\n67542,433\n67543,563\n67544,5547\n67545,1381\n67546,50\n67547,515\n67548,483\n67549,392\n67550,200\n67551,1\n67552,67553\n67555,2480\n67556,79\n67557,1238\n67557,1893\n67557,3538\n67558,67559\n67560,1149\n67561,1227\n67561,1229\n67562,628\n67563,195\n67563,779\n67564,346\n67565,217\n67565,536\n67565,1019\n67566,298\n67567,485\n67568,10\n67569,247\n67570,588\n67570,590\n67571,67572\n67574,605\n67574,1634\n67575,682\n67576,376\n67577,1858\n67578,1860\n67579,422\n67580,56\n67581,433\n67583,515\n67584,1274\n67585,843\n67586,338\n67587,10\n67588,1319\n67589,455\n67590,1785\n67591,1001\n67592,184\n67593,136\n67593,137\n67593,534\n67593,657\n67593,843\n67593,885\n67593,1058\n67595,5718\n67596,217\n67597,233\n67598,467\n67598,872\n67600,4237\n67601,1556\n67602,861\n67603,22\n67604,349\n67604,605\n67604,626\n67604,752\n67604,1590\n67604,3182\n67605,406\n67606,1556\n67607,687\n67607,1556\n67608,72\n67609,67610\n67611,67612\n67611,76522\n67611,111560\n67611,132026\n67611,170344\n67613,17228\n67614,107\n67614,195\n67614,200\n67614,302\n67614,536\n67614,32475\n67614,105292\n67614,206542\n67615,422\n67616,56\n67617,72\n67618,344\n67619,285\n67620,192\n67621,206\n67622,1858\n67623,1860\n67624,3148\n67625,493\n67626,77\n67627,195\n67629,615\n67630,973\n67630,5547\n67631,184\n67633,5547\n67634,278\n67634,1363\n67634,1756\n67634,2224\n67634,2421\n67634,6068\n67635,10\n67635,1033\n67636,269\n67637,67638\n67639,67640\n67641,3161\n67642,1782\n67643,283\n67643,1001\n67644,1579\n67645,403\n67646,67647\n67648,298\n67649,158\n67650,67651\n67652,557\n67653,67654\n67655,557\n67656,72\n67657,192\n67657,1007\n67657,1181\n67658,3367\n67659,54\n67660,752\n67661,2274\n67662,510\n67662,861\n67663,20257\n67664,16196\n67665,346\n67666,7416\n67667,907\n67667,1117\n67668,657\n67669,450\n67670,433\n67671,72\n67672,602\n67673,137\n67674,67675\n67674,258469\n67674,261905\n67676,72\n67677,406\n67678,1466\n67678,5976\n67679,137\n67679,1135\n67680,217\n67681,1858\n67682,1860\n67683,72\n67684,195\n67685,83\n67686,623\n67686,1805\n67687,21944\n67688,211\n67688,7363\n67689,1556\n67690,861\n67691,22\n67692,536\n67693,130\n67693,207\n67693,252\n67693,775\n67693,1243\n67693,189788\n67694,65\n67695,1858\n67696,1860\n67697,1381\n67698,67699\n67700,278\n67701,7416\n67702,5547\n67703,310\n67703,805\n67704,338\n67705,10\n67706,1556\n67707,861\n67708,22\n67709,4355\n67710,34\n67710,1776\n67710,4193\n67711,158\n67712,5440\n67713,171\n67714,171\n67715,1858\n67716,1860\n67718,83\n67719,2266\n67720,907\n67721,422\n67722,56\n67723,349\n67723,697\n67724,67725\n67726,2146\n67726,2929\n67727,151\n67728,151\n67729,346\n67730,167\n67731,450\n67732,338\n67733,1085\n67734,493\n67735,47031\n67736,843\n67737,862\n67738,149\n67739,72\n67740,3\n67741,2506\n67742,2867\n67742,22880\n67743,4504\n67744,602\n67745,1871\n67746,305\n67747,450\n67748,3069\n67749,346\n67750,586\n67751,4192\n67751,4193\n67752,269\n67753,83\n67754,1\n67755,1776\n67755,4193\n67756,72\n67757,8270\n67758,731\n67759,631\n67759,720\n67759,932\n67759,1085\n67759,1732\n67759,3194\n67759,3422\n67760,30\n67761,1133\n67762,72\n67763,34\n67763,1776\n67763,4193\n67764,158\n67765,602\n67766,72\n67767,240\n67768,10\n67769,10\n67770,1235\n67770,1335\n67771,1983\n67772,30\n67773,3804\n67774,2351\n67775,67776\n67777,15573\n67778,67779\n67780,2146\n67781,30\n67782,207\n67783,450\n67784,67785\n67787,58\n67788,46\n67789,972\n67789,973\n67790,2073\n67791,255\n67792,72\n67793,872\n67794,67795\n67796,2574\n67796,4355\n67797,2744\n67798,843\n67799,67800\n67801,67800\n67802,647\n67803,344\n67804,664\n67804,1085\n67805,72\n67806,6323\n67807,30\n67808,2506\n67809,309\n67809,310\n67810,72\n67811,30\n67812,30\n67812,104\n67812,134\n67812,135\n67812,138\n67813,298\n67814,72\n67815,795\n67816,3413\n67817,1363\n67818,46\n67818,1124\n67819,10\n67819,406\n67819,1181\n67819,4192\n67819,4193\n67820,207\n67821,72\n67822,206\n67823,447\n67823,1590\n67823,1644\n67824,536\n67824,718\n67824,1068\n67824,1160\n67824,67825\n67824,68052\n67824,80815\n67826,255\n67827,932\n67828,406\n67829,3193\n67830,1776\n67830,4193\n67831,34\n67831,158\n67832,102\n67833,269\n67834,67835\n67836,1858\n67837,1860\n67838,22\n67838,5726\n67839,233\n67840,579\n67841,3413\n67842,50\n67842,79\n67842,430\n67842,760\n67842,4355\n67842,86479\n67843,72\n67844,1531\n67845,366\n67846,3\n67846,230509\n67846,230517\n67847,72\n67848,602\n67848,3218\n67849,72\n67850,355\n67851,577\n67851,1149\n67853,714\n67853,1010\n67853,1276\n67854,2506\n67855,10\n67855,287\n67855,671\n67855,1294\n67855,15573\n67856,2048\n67857,5343\n67858,1639\n67859,72\n67860,1\n67862,1289\n67862,1579\n67863,72\n67864,58\n67866,1\n67866,50\n67866,147\n67866,620\n67866,1623\n67867,1\n67867,34\n67867,35\n67867,287\n67867,304\n67867,338\n67867,392\n67867,433\n67867,440\n67867,467\n67867,862\n67867,1118\n67867,1381\n67867,1796\n67867,1801\n67867,2253\n67867,3804\n67867,6424\n67867,14098\n67867,67868\n67869,67870\n67871,137\n67871,1432\n67871,21944\n67872,1715\n67872,67873\n67874,296\n67874,479\n67874,991\n67874,1102\n67874,1287\n67874,1579\n67874,9030\n67875,67876\n67877,2646\n67878,1893\n67879,83\n67880,1749\n67880,3585\n67881,298\n67882,485\n67883,215\n67884,843\n67885,682\n67885,72439\n67886,389\n67886,631\n67887,147\n67889,160\n67890,364\n67892,2146\n67893,67894\n67895,10\n67896,1240\n67897,130\n67898,668\n67898,736\n67898,1619\n67900,171\n67901,137\n67902,640\n67903,515\n67904,640\n67905,3507\n67906,1370\n67907,893\n67908,60576\n67909,835\n67910,479\n67911,346\n67912,4101\n67913,852\n67914,1612\n67915,1284\n67916,217\n67917,83\n67917,217\n67917,536\n67918,1985\n67919,538\n67920,602\n67921,346\n67922,248\n67923,1\n67924,48\n67925,481\n67926,1298\n67927,1335\n67928,195\n67928,312\n67928,640\n67928,875\n67928,1149\n67928,1177\n67928,1631\n67928,4101\n67929,668\n67930,48\n67931,222\n67932,50\n67932,222\n67933,135\n67934,217\n67935,10\n67935,22\n67937,15573\n67938,67939\n67942,192\n67943,392\n67944,67945\n67947,160\n67947,163\n67947,192\n67947,340\n67947,477\n67947,599\n67947,671\n67947,841\n67947,1453\n67947,1634\n67947,3297\n67948,287\n67949,137\n67951,818\n67952,657\n67953,65\n67954,1556\n67956,1188\n67957,79\n67958,388\n67959,2146\n67960,301\n67960,919\n67960,2620\n67961,717\n67962,136\n67962,137\n67963,83\n67965,1181\n67966,287\n67967,1127\n67968,309\n67968,310\n67969,422\n67970,344\n67971,422\n67972,2353\n67973,422\n67974,422\n67975,67976\n67977,422\n67979,422\n67980,422\n67981,631\n67981,1531\n67982,450\n67983,72\n67985,827\n67986,107\n67986,111\n67986,749\n67986,932\n67986,1146\n67986,3538\n67986,3695\n67987,248\n67988,994\n67988,1124\n67989,72\n67990,1860\n67991,298\n67992,485\n67993,298\n67994,485\n67995,61324\n67995,67995\n67995,227149\n67996,1522\n67996,2557\n67997,1392\n67998,693\n68002,2436\n68003,2775\n68004,447\n68005,56\n68005,2315\n68006,264\n68006,289\n68006,290\n68006,1449\n68006,1844\n68006,2286\n68006,94134\n68006,144988\n68007,745\n68008,1227\n68008,1229\n68009,2719\n68010,72\n68011,219\n68012,1515\n68013,1551\n68015,68016\n68015,125314\n68016,68016\n68017,178\n68019,422\n68020,10\n68021,393\n68022,273\n68022,66754\n68023,31237\n68025,571\n68028,1267\n68029,6068\n68030,2073\n68031,86\n68031,344\n68032,602\n68033,72\n68034,467\n68034,868\n68035,818\n68036,34\n68036,35\n68036,1417\n68037,1858\n68038,1860\n68039,13538\n68041,195\n68042,171\n68043,195\n68044,392\n68045,1983\n68047,298\n68048,485\n68049,602\n68050,1608\n68051,1085\n68051,89388\n68054,136\n68054,2557\n68055,1984\n68056,5212\n68058,1285\n68059,406\n68061,604\n68062,192\n68062,195\n68063,2372\n68066,65\n68066,302\n68066,485\n68066,497\n68066,583\n68066,657\n68066,798\n68066,1058\n68066,1149\n68066,1782\n68066,3297\n68067,111\n68068,222\n68068,1019\n68069,10\n68069,50\n68069,99\n68069,146\n68069,285\n68069,391\n68069,406\n68069,410\n68069,446\n68069,622\n68069,779\n68069,809\n68069,841\n68069,875\n68069,1181\n68069,1464\n68069,1502\n68069,1515\n68069,1776\n68069,1825\n68069,2132\n68069,2244\n68069,2374\n68069,2880\n68069,3449\n68069,4465\n68069,4558\n68069,4623\n68069,4663\n68069,6646\n68069,7818\n68069,8944\n68069,9554\n68069,9747\n68069,13589\n68069,14040\n68069,14700\n68069,15608\n68069,18295\n68069,19278\n68069,19782\n68069,20160\n68069,20521\n68069,23877\n68069,23882\n68069,23954\n68069,24045\n68069,24113\n68069,24835\n68069,26972\n68069,34524\n68069,35623\n68069,37150\n68069,38989\n68069,39624\n68069,40288\n68069,43239\n68069,48844\n68069,49547\n68069,49585\n68069,49586\n68069,49589\n68069,49838\n68069,54507\n68069,54797\n68069,56557\n68069,61135\n68069,62626\n68069,63355\n68069,64258\n68069,68069\n68069,69014\n68069,69015\n68069,69022\n68069,69033\n68069,69070\n68069,69076\n68069,69077\n68069,69088\n68069,69089\n68069,69090\n68069,69096\n68069,69097\n68069,69099\n68069,69104\n68069,69112\n68069,69118\n68069,69121\n68069,69122\n68069,69134\n68069,69136\n68069,69161\n68069,69162\n68069,69165\n68069,69168\n68069,69169\n68069,69182\n68069,69183\n68069,69184\n68069,69186\n68069,69187\n68069,69189\n68069,69191\n68069,69207\n68069,69210\n68069,69218\n68069,69219\n68069,69225\n68069,69226\n68069,69231\n68069,69233\n68069,69234\n68069,69235\n68069,69254\n68069,69255\n68069,69256\n68069,69258\n68069,69270\n68069,69280\n68069,69285\n68069,69293\n68069,69297\n68069,69298\n68069,69299\n68069,69302\n68069,69313\n68069,69314\n68069,69315\n68069,69324\n68069,69338\n68069,69339\n68069,69341\n68069,69357\n68069,69358\n68069,69359\n68069,69556\n68069,70232\n68069,70348\n68069,70995\n68069,77566\n68069,80068\n68069,80074\n68069,80088\n68069,80103\n68069,80113\n68069,80125\n68069,80138\n68069,80150\n68069,80169\n68069,80191\n68069,80340\n68069,80501\n68069,87143\n68069,87277\n68069,88429\n68069,88444\n68069,88622\n68069,88867\n68069,89687\n68069,89788\n68069,89808\n68069,89833\n68069,89840\n68069,89849\n68069,89851\n68069,89869\n68069,89966\n68069,90005\n68069,90037\n68069,90088\n68069,90139\n68069,90211\n68069,90457\n68069,90482\n68069,90535\n68069,90794\n68069,90942\n68069,91112\n68069,91126\n68069,91246\n68069,91285\n68069,92089\n68069,92091\n68069,92476\n68069,92530\n68069,92736\n68069,92984\n68069,93125\n68069,93138\n68069,93164\n68069,93287\n68069,93290\n68069,93331\n68069,93537\n68069,93694\n68069,93813\n68069,94183\n68069,94203\n68069,94332\n68069,94382\n68069,94627\n68069,94856\n68069,94859\n68069,94902\n68069,94933\n68069,94935\n68069,95003\n68069,95050\n68069,95149\n68069,95355\n68069,95360\n68069,95371\n68069,95385\n68069,95424\n68069,95465\n68069,95497\n68069,95517\n68069,95530\n68069,95564\n68069,95584\n68069,95587\n68069,95589\n68069,95628\n68069,95645\n68069,95692\n68069,95695\n68069,95704\n68069,95705\n68069,95715\n68069,95748\n68069,95749\n68069,95759\n68069,95768\n68069,95784\n68069,95786\n68069,95822\n68069,95978\n68069,95983\n68069,96057\n68069,96091\n68069,96097\n68069,96112\n68069,96124\n68069,96323\n68069,96816\n68069,97568\n68069,97649\n68069,97650\n68069,97846\n68069,100012\n68069,100013\n68069,100022\n68069,100023\n68069,100024\n68069,100025\n68069,100026\n68069,100027\n68069,100028\n68069,100029\n68069,101666\n68069,103361\n68069,103819\n68069,107049\n68069,107051\n68069,108138\n68069,108273\n68069,108477\n68069,109268\n68069,109358\n68069,109489\n68069,110454\n68069,111217\n68069,112380\n68069,118336\n68069,119941\n68069,125049\n68069,125933\n68069,126067\n68069,131192\n68069,131302\n68069,133451\n68069,133963\n68069,134238\n68069,134673\n68069,135441\n68069,136174\n68069,137254\n68069,137743\n68069,137793\n68069,138055\n68069,138876\n68069,138957\n68069,139388\n68069,139748\n68069,140010\n68069,140042\n68069,140054\n68069,141912\n68069,141945\n68069,142977\n68069,148507\n68069,148508\n68069,148509\n68069,148513\n68069,148515\n68069,148516\n68069,148519\n68069,148520\n68069,148601\n68069,149020\n68069,150120\n68069,150123\n68069,150128\n68069,150129\n68069,150401\n68069,150550\n68069,150700\n68069,152136\n68069,153335\n68069,154436\n68069,157361\n68069,159277\n68069,160572\n68069,160880\n68069,161297\n68069,161759\n68069,163129\n68069,163651\n68069,164119\n68069,164847\n68069,165444\n68069,166365\n68069,166367\n68069,166371\n68069,166377\n68069,166380\n68069,166381\n68069,166384\n68069,166387\n68069,166389\n68069,166396\n68069,166401\n68069,166405\n68069,166409\n68069,166410\n68069,166415\n68069,166418\n68069,166420\n68069,166424\n68069,166427\n68069,166428\n68069,166437\n68069,166440\n68069,166447\n68069,166449\n68069,166452\n68069,166456\n68069,166459\n68069,166462\n68069,166464\n68069,166469\n68069,166470\n68069,166476\n68069,166477\n68069,166478\n68069,166482\n68069,166484\n68069,166488\n68069,166490\n68069,166497\n68069,166501\n68069,166502\n68069,166509\n68069,166515\n68069,166517\n68069,166518\n68069,166523\n68069,166529\n68069,166534\n68069,166539\n68069,166546\n68069,166549\n68069,166552\n68069,166553\n68069,166555\n68069,166560\n68069,166561\n68069,166566\n68069,166573\n68069,166574\n68069,166594\n68069,166601\n68069,166608\n68069,166612\n68069,166614\n68069,166618\n68069,166623\n68069,166626\n68069,166664\n68069,166665\n68069,166691\n68069,166694\n68069,166747\n68069,166834\n68069,166856\n68069,167202\n68069,167239\n68069,167267\n68069,167354\n68069,167818\n68069,168928\n68069,184913\n68069,224372\n68069,229772\n68069,229840\n68069,236173\n68069,238330\n68069,247186\n68070,1522\n68071,1551\n68071,191860\n68072,704\n68073,30\n68074,273\n68074,66754\n68075,97\n68076,4895\n68077,1359\n68079,41\n68080,302\n68081,202\n68081,203\n68081,217\n68081,920\n68082,192\n68082,663\n68083,22\n68083,222\n68083,326\n68083,838\n68083,2607\n68084,102\n68084,326\n68084,758\n68087,83\n68088,1436\n68089,50\n68089,893\n68089,141912\n68090,872\n68091,160\n68091,515\n68092,557\n68094,68095\n68096,500\n68096,718\n68096,1860\n68097,314\n68097,2646\n68098,360\n68098,1052\n68099,195\n68100,302\n68100,687\n68101,893\n68102,302\n68103,623\n68104,775\n68105,195\n68106,1977\n68106,1978\n68107,1871\n68108,202\n68108,203\n68110,3474\n68111,68112\n68113,136\n68113,137\n68113,433\n68114,393\n68115,8822\n68116,136\n68117,2224\n68118,5547\n68118,6119\n68119,25636\n68119,68120\n68122,63\n68123,605\n68123,2315\n68124,333\n68124,622\n68124,3370\n68124,14453\n68125,1370\n68126,1417\n68127,30\n68128,557\n68130,1659\n68131,37\n68131,698\n68131,1782\n68132,1181\n68133,14989\n68134,1572\n68136,1\n68137,240\n68137,1181\n68138,68139\n68141,22\n68141,158\n68141,167\n68141,211\n68141,577\n68141,760\n68141,809\n68141,1188\n68141,1210\n68141,1844\n68141,3297\n68141,5265\n68141,32475\n68143,54\n68145,393\n68146,536\n68147,1707\n68148,694\n68148,1707\n68149,1803\n68151,872\n68152,1010\n68153,2351\n68154,34\n68154,35\n68155,415\n68155,467\n68155,703\n68155,718\n68155,770\n68155,931\n68156,15573\n68157,259\n68158,1175\n68159,247\n68160,1\n68161,68162\n68163,48\n68164,34\n68164,35\n68164,217\n68164,1417\n68164,13980\n68165,1181\n68166,10\n68166,397\n68166,509\n68166,6303\n68167,298\n68168,602\n68169,2319\n68170,2506\n68171,784\n68171,1544\n68172,272\n68172,393\n68172,447\n68172,949\n68172,1466\n68172,1531\n68172,2178\n68172,3260\n68172,4545\n68173,222\n68173,283\n68173,2266\n68173,211889\n68174,1388\n68175,86\n68176,1179\n68177,184\n68178,972\n68178,973\n68179,1007\n68180,1\n68181,79\n68182,79\n68182,358\n68183,79\n68183,192\n68183,21442\n68184,972\n68184,973\n68185,577\n68186,972\n68186,973\n68188,435\n68189,2116\n68190,485\n68191,516\n68193,298\n68194,485\n68196,160\n68197,581\n68198,2421\n68199,450\n68201,467\n68202,644\n68203,447\n68204,358\n68204,1118\n68205,1402\n68206,259\n68207,222\n68208,1417\n68209,2506\n68210,868\n68212,3\n68213,1572\n68213,1722\n68213,14458\n68214,10\n68215,68216\n68218,41\n68219,240\n68219,4355\n68220,439\n68221,972\n68221,973\n68222,1419\n68223,30\n68225,8270\n68226,588\n68226,590\n68227,536\n68227,1019\n68228,10\n68229,1417\n68230,1417\n68231,337\n68232,586\n68233,1049\n68233,6387\n68233,7117\n68233,92641\n68233,92645\n68233,158032\n68234,6750\n68235,953\n68236,6323\n68237,1608\n68238,900\n68239,2506\n68240,44\n68242,310\n68243,3161\n68244,745\n68245,389\n68245,1019\n68245,1467\n68245,2421\n68246,2506\n68247,1133\n68248,301\n68248,631\n68250,676\n68251,875\n68252,3161\n68253,843\n68254,435\n68254,1033\n68255,298\n68256,485\n68257,875\n68258,2351\n68260,15573\n68261,3161\n68262,406\n68263,30\n68264,151\n68265,30\n68266,83\n68266,5591\n68267,2073\n68269,1844\n68270,2146\n68270,19005\n68271,1559\n68272,623\n68272,1805\n68272,3260\n68273,640\n68274,34\n68274,1776\n68275,503\n68276,2617\n68277,663\n68277,664\n68277,1531\n68277,2178\n68277,2931\n68277,4545\n68277,6119\n68277,56150\n68278,68279\n68280,640\n68280,1001\n68281,72\n68282,30\n68283,1773\n68284,206\n68285,30\n68286,21487\n68286,22880\n68287,1133\n68288,349\n68288,3260\n68289,30\n68290,1388\n68291,68292\n68293,483\n68294,483\n68295,493\n68297,30\n68298,247\n68299,861\n68300,2719\n68301,4475\n68303,2574\n68304,273\n68305,6323\n68306,217\n68307,83\n68308,187\n68309,10\n68310,592\n68310,1119\n68310,1631\n68310,1635\n68310,2620\n68310,2995\n68311,149\n68312,640\n68314,72\n68315,15\n68315,217\n68315,298\n68315,349\n68315,358\n68315,360\n68315,567\n68315,615\n68315,668\n68315,783\n68315,859\n68315,1072\n68315,1113\n68315,1117\n68315,1323\n68315,1381\n68315,1388\n68315,1796\n68315,1968\n68315,2372\n68315,9004\n68316,592\n68317,97\n68318,247\n68319,652\n68320,1639\n68321,1556\n68322,222\n68323,259\n68324,68325\n68324,84065\n68324,87875\n68324,95805\n68324,100742\n68324,108720\n68324,114268\n68324,119730\n68324,122410\n68324,122805\n68324,123370\n68326,289\n68326,290\n68327,187\n68328,2146\n68329,1572\n68329,1688\n68330,130\n68331,264\n68331,1381\n68332,852\n68333,50\n68334,30\n68335,2146\n68336,59\n68336,67397\n68338,1235\n68338,1335\n68339,640\n68340,134\n68341,206\n68342,2929\n68343,577\n68343,3297\n68344,23701\n68345,1001\n68346,195\n68347,1644\n68348,481\n68349,479\n68350,72\n68351,72\n68352,1551\n68353,862\n68354,68355\n68356,247\n68356,2867\n68356,22880\n68357,918\n68358,30\n68359,146\n68360,68361\n68362,136\n68363,4\n68363,5\n68364,2626\n68365,4066\n68366,83\n68367,225\n68368,13\n68369,1319\n68370,1\n68370,147\n68370,859\n68370,1181\n68370,240174\n68371,1467\n68373,516\n68373,538\n68373,1175\n68374,30\n68375,79\n68375,134\n68375,163\n68375,203\n68375,305\n68375,567\n68375,631\n68375,744\n68375,809\n68375,861\n68375,1010\n68375,1572\n68375,1939\n68375,2867\n68375,2868\n68375,8714\n68375,21944\n68375,25222\n68376,557\n68377,1968\n68378,192\n68379,2699\n68380,450\n68381,9018\n68382,1204\n68383,852\n68384,8822\n68385,292\n68386,186\n68386,628\n68386,5192\n68386,6303\n68387,483\n68388,118\n68388,4597\n68389,195\n68389,779\n68390,557\n68391,79\n68392,72\n68393,1235\n68393,1335\n68394,68395\n68396,72\n68397,6323\n68398,2205\n68398,2206\n68399,10\n68400,68401\n68402,175\n68402,1368\n68402,4941\n68403,18726\n68404,557\n68405,493\n68406,72\n68407,163\n68408,1782\n68409,1133\n68410,30\n68411,30\n68412,167\n68414,68415\n68416,72\n68417,72\n68419,77\n68419,104\n68419,248\n68419,372\n68419,383\n68419,509\n68419,592\n68419,862\n68419,1001\n68419,1007\n68419,1149\n68419,1722\n68419,1939\n68419,1977\n68419,1978\n68419,2701\n68419,3585\n68419,5405\n68420,640\n68421,72\n68422,72\n68423,126\n68424,20257\n68425,366\n68426,72\n68427,525\n68428,420\n68429,515\n68430,72\n68431,3\n68432,557\n68433,83\n68434,7360\n68435,146\n68436,23701\n68437,403\n68438,72\n68439,2146\n68440,2674\n68441,2351\n68442,72\n68443,8788\n68444,72\n68445,72\n68446,1151\n68447,222\n68448,3538\n68449,1238\n68450,298\n68451,485\n68452,34\n68452,35\n68452,83\n68452,217\n68452,278\n68452,852\n68452,1467\n68453,72\n68454,1\n68455,994\n68456,7358\n68456,7363\n68457,298\n68458,485\n68459,657\n68459,19443\n68460,510\n68461,779\n68462,217\n68463,171\n68464,104\n68464,248\n68464,850\n68464,1332\n68465,1133\n68466,68467\n68468,65\n68469,2146\n68471,2073\n68472,65\n68472,158\n68472,252\n68472,264\n68472,467\n68472,599\n68472,622\n68472,1235\n68472,1335\n68472,1659\n68472,2979\n68473,588\n68474,259\n68474,344\n68475,68476\n68477,5212\n68478,2351\n68480,784\n68481,178\n68483,10\n68484,68485\n68486,68487\n68488,1572\n68489,4594\n68490,5547\n68491,346\n68492,3\n68493,8991\n68495,30\n68496,68497\n68498,7757\n68499,2506\n68500,450\n68501,450\n68502,217\n68503,557\n68504,589\n68504,1001\n68505,640\n68506,1452\n68508,68509\n68510,920\n68511,346\n68512,158\n68513,406\n68514,50\n68515,35687\n68516,346\n68517,68518\n68519,68518\n68520,68518\n68521,68518\n68522,346\n68523,376\n68524,2048\n68525,406\n68525,779\n68526,973\n68527,211\n68527,7363\n68528,72\n68529,18726\n68530,72\n68531,1247\n68532,240\n68533,8270\n68534,602\n68535,671\n68536,14483\n68537,147\n68538,2506\n68539,2506\n68540,2506\n68541,255\n68542,217\n68543,7\n68543,211\n68544,79\n68544,326\n68545,366\n68546,366\n68547,3447\n68548,217\n68549,30\n68550,1707\n68551,1252\n68551,1253\n68552,1133\n68553,392\n68554,68555\n68554,104881\n68556,1133\n68557,2146\n68558,3451\n68558,3452\n68559,2073\n68560,968\n68561,340\n68562,192\n68563,67343\n68564,628\n68565,211\n68566,68567\n68568,289\n68568,290\n68568,3041\n68569,392\n68570,10\n68571,264\n68571,1381\n68572,932\n68573,120\n68574,83\n68575,233\n68576,68577\n68578,422\n68579,79\n68580,2574\n68580,68581\n68582,1353\n68583,106\n68583,278\n68583,287\n68583,328\n68583,509\n68583,811\n68583,893\n68583,1007\n68583,1085\n68583,1235\n68583,1335\n68583,1556\n68583,1571\n68583,1782\n68583,2116\n68583,2209\n68583,2260\n68583,115659\n68583,142473\n68584,2506\n68585,2506\n68586,207\n68587,2506\n68588,258\n68589,302\n68590,1453\n68591,631\n68592,481\n68593,1644\n68594,68595\n68596,760\n68597,1807\n68598,355\n68599,588\n68599,590\n68600,137\n68601,118\n68601,4597\n68602,2506\n68604,54\n68604,158\n68604,660\n68604,2424\n68604,2646\n68605,1353\n68606,1983\n68607,775\n68608,1247\n68609,392\n68610,2334\n68612,137\n68612,13136\n68613,65\n68613,868\n68614,1381\n68615,1983\n68616,2334\n68617,872\n68618,50\n68618,2979\n68619,406\n68620,346\n68621,312\n68622,30\n68623,298\n68624,485\n68625,1012\n68625,1241\n68625,2557\n68626,2506\n68627,571\n68627,868\n68627,1181\n68628,346\n68629,163\n68629,305\n68629,563\n68629,911\n68629,991\n68629,1132\n68629,1623\n68630,328\n68630,1085\n68630,1241\n68630,2205\n68630,2206\n68630,130708\n68630,207523\n68631,6661\n68633,217\n68634,811\n68635,163\n68635,302\n68637,33611\n68638,949\n68639,1983\n68640,1\n68640,149\n68642,918\n68643,58\n68644,46\n68645,86\n68646,222\n68646,657\n68647,6661\n68648,3804\n68649,146\n68650,1983\n68651,59021\n68652,640\n68653,2319\n68654,273\n68655,1572\n68656,1801\n68657,1773\n68658,14366\n68659,8180\n68661,240\n68661,588\n68661,590\n68662,640\n68663,640\n68665,302\n68666,640\n68667,640\n68668,1983\n68670,1238\n68670,8149\n68672,1983\n68673,447\n68675,195\n68676,1531\n68678,149\n68678,745\n68678,1776\n68678,2371\n68678,2867\n68678,3193\n68678,5265\n68678,22880\n68679,972\n68679,973\n68680,415\n68681,808\n68681,1240\n68681,1465\n68682,130\n68684,83\n68685,336\n68686,2017\n68686,17309\n68687,68688\n68689,6323\n68690,240\n68691,356\n68691,852\n68691,2995\n68692,302\n68693,1983\n68694,14483\n68695,147\n68695,149\n68695,158\n68695,1803\n68696,455\n68698,1243\n68699,206\n68699,222\n68699,455\n68699,485\n68699,611\n68699,712\n68699,1177\n68701,893\n68701,1374\n68702,779\n68703,581\n68704,222\n68705,301\n68706,187\n68706,1227\n68706,1229\n68707,192\n68708,1353\n68709,240\n68710,30\n68712,1177\n68712,2210\n68713,1556\n68714,972\n68715,264\n68716,2421\n68717,1983\n68718,32\n68718,392\n68718,918\n68719,356\n68720,15573\n68721,356\n68723,515\n68724,1085\n68726,483\n68727,1531\n68728,340\n68729,2073\n68731,605\n68732,2135\n68733,167\n68733,1167\n68733,1436\n68733,3218\n68733,5301\n68733,73570\n68734,1983\n68735,259\n68735,264\n68735,567\n68735,611\n68735,1181\n68735,1707\n68735,1893\n68735,21944\n68737,827\n68738,158\n68739,50\n68740,406\n68741,259\n68742,852\n68743,55995\n68743,68744\n68745,356\n68747,292\n68748,1983\n68749,298\n68750,485\n68751,406\n68752,422\n68753,422\n68754,10\n68754,628\n68756,2867\n68756,22880\n68757,433\n68758,1203\n68758,2146\n68759,309\n68759,310\n68760,310\n68761,636\n68762,2626\n68763,160\n68764,10\n68765,694\n68766,2506\n68767,195\n68768,477\n68769,972\n68771,760\n68772,20\n68772,59\n68772,644\n68772,783\n68772,838\n68772,1363\n68772,1572\n68772,2605\n68772,2704\n68772,3794\n68772,17897\n68773,1977\n68773,1978\n68775,1639\n68776,222\n68777,188\n68778,182\n68779,248\n68780,1231\n68780,3115\n68781,431\n68782,252\n68782,41170\n68783,5547\n68784,5547\n68785,973\n68786,9005\n68788,68789\n68790,5547\n68790,110269\n68791,5547\n68792,68793\n68794,372\n68794,5547\n68795,433\n68797,457\n68798,79\n68798,140\n68798,147\n68798,160\n68798,287\n68798,302\n68798,326\n68798,346\n68798,358\n68798,408\n68798,422\n68798,459\n68798,473\n68798,481\n68798,493\n68798,581\n68798,622\n68798,671\n68798,707\n68798,868\n68798,996\n68798,1117\n68798,1119\n68798,1247\n68798,1265\n68798,1266\n68798,1276\n68798,1294\n68798,1323\n68798,1425\n68798,1572\n68798,1631\n68798,1644\n68798,2421\n68798,2807\n68798,3297\n68798,52232\n68799,2045\n68800,379\n68801,1688\n68802,171\n68803,5547\n68804,1072\n68805,247\n68806,424\n68806,6556\n68807,5547\n68808,450\n68809,676\n68810,50\n68811,292\n68811,509\n68811,1722\n68812,657\n68813,1368\n68814,21944\n68815,3872\n68816,147\n68816,158\n68816,447\n68816,1181\n68816,2178\n68816,3989\n68818,53763\n68819,137\n68819,1381\n68820,968\n68820,1072\n68820,6955\n68821,450\n68822,393\n68823,14483\n68824,1388\n68825,2626\n68825,49057\n68826,4637\n68827,233\n68827,301\n68827,525\n68827,1235\n68827,1335\n68827,4146\n68828,843\n68829,147\n68829,256\n68829,1014\n68830,10\n68830,760\n68831,248\n68831,626\n68831,636\n68831,1282\n68832,972\n68834,1572\n68835,309\n68835,310\n68836,255\n68837,422\n68839,907\n68839,1284\n68840,259\n68842,422\n68843,422\n68844,422\n68845,5547\n68846,483\n68847,5547\n68848,58\n68849,46\n68850,422\n68851,138\n68852,422\n68853,1556\n68854,861\n68855,22\n68856,1043\n68856,42220\n68857,586\n68858,140\n68859,68860\n68861,644\n68862,30\n68863,86\n68863,118\n68863,292\n68863,306\n68863,307\n68863,315\n68863,340\n68863,483\n68863,663\n68863,664\n68863,668\n68863,1151\n68863,1179\n68863,1623\n68863,1837\n68863,4597\n68863,6506\n68864,15573\n68865,760\n68867,217\n68868,1858\n68869,1860\n68870,1893\n68870,2312\n68870,6968\n68872,2421\n68873,1167\n68873,2979\n68874,1210\n68875,7\n68876,561\n68876,911\n68876,972\n68877,602\n68879,1127\n68880,202\n68880,203\n68881,392\n68881,760\n68882,493\n68883,298\n68884,485\n68885,439\n68886,3367\n68887,126\n68887,671\n68887,1033\n68889,827\n68889,1201\n68890,1639\n68892,4193\n68893,46\n68893,972\n68893,973\n68894,1634\n68895,298\n68896,485\n68897,247\n68898,151\n68899,389\n68899,1363\n68899,1849\n68900,827\n68901,3999\n68902,406\n68903,68904\n68905,671\n68906,467\n68907,1359\n68909,586\n68910,146\n68910,467\n68910,92476\n68911,602\n68912,309\n68912,310\n68913,102\n68913,408\n68913,518\n68913,1113\n68913,1323\n68913,3193\n68914,1010\n68915,704\n68916,202\n68916,203\n68916,1745\n68918,1287\n68919,9029\n68920,2421\n68921,1381\n68922,861\n68923,151\n68924,17309\n68925,30\n68925,1179\n68926,2421\n68927,298\n68928,3\n68929,1149\n68930,392\n68931,8270\n68932,146\n68933,390\n68934,859\n68936,206\n68937,301\n68937,1837\n68938,104\n68939,8270\n68940,1323\n68941,102\n68942,1326\n68943,408\n68944,68945\n68946,440\n68946,1001\n68947,1235\n68947,1335\n68948,3447\n68949,1140\n68949,3474\n68949,5547\n68950,5547\n68951,704\n68951,1052\n68951,1359\n68951,1782\n68951,3989\n68952,47\n68952,743\n68952,2469\n68952,8714\n68953,68954\n68953,219768\n68955,1085\n68955,18727\n68955,165542\n68955,165994\n68956,187\n68957,344\n68958,2073\n68959,195\n68960,83\n68961,852\n68962,818\n68963,1001\n68964,657\n68965,973\n68967,285\n68967,392\n68967,779\n68968,393\n68969,20771\n68971,1556\n68972,217\n68973,704\n68974,392\n68975,399\n68975,536\n68976,68977\n68978,294\n68979,2923\n68980,289\n68980,290\n68982,1010\n68983,332\n68984,602\n68985,1556\n68986,861\n68987,22\n68988,379\n68989,376\n68990,338\n68991,2146\n68992,107\n68992,273\n68992,355\n68992,452\n68992,493\n68992,1146\n68993,202\n68993,203\n68993,588\n68993,590\n68994,301\n68995,3295\n68997,1133\n68998,376\n68999,442\n69000,48\n69001,885\n69002,557\n69003,278\n69004,809\n69005,1\n69005,202\n69005,203\n69005,222\n69005,657\n69006,1363\n69007,366\n69008,2926\n69009,1572\n69010,1608\n69011,247\n69012,6068\n69013,805\n69016,68069\n69017,68069\n69017,86832\n69018,68069\n69018,86832\n69019,1309\n69020,417\n69021,557\n69023,68069\n69024,68069\n69025,557\n69026,8719\n69027,138\n69028,557\n69029,865\n69030,137\n69031,118\n69031,4597\n69032,21944\n69034,8719\n69035,138\n69036,865\n69037,557\n69038,137\n69039,118\n69039,4597\n69040,21944\n69041,8719\n69042,138\n69043,3623\n69044,865\n69045,557\n69046,137\n69047,298\n69048,485\n69049,118\n69049,4597\n69050,21944\n69051,779\n69051,68069\n69051,86832\n69052,8719\n69053,138\n69054,865\n69055,557\n69056,366\n69057,366\n69058,137\n69059,118\n69059,4597\n69060,21944\n69061,118\n69061,4597\n69062,258\n69063,417\n69064,217\n69065,1411\n69066,1556\n69067,861\n69068,22\n69069,1891\n69071,68069\n69071,86832\n69072,602\n69073,69074\n69075,493\n69078,68069\n69079,588\n69079,590\n69080,222\n69080,305\n69080,1181\n69081,30\n69082,69083\n69084,779\n69084,68069\n69085,10\n69085,187\n69085,267\n69085,693\n69086,4411\n69087,431\n69091,68069\n69092,68069\n69093,206\n69094,1608\n69095,4039\n69098,206\n69100,68069\n69101,68069\n69102,273\n69103,1773\n69103,9598\n69105,657\n69106,779\n69106,68069\n69106,141912\n69107,477\n69108,68069\n69109,222\n69111,5547\n69113,19986\n69114,8270\n69115,69116\n69117,1769\n69117,68069\n69119,356\n69119,417\n69119,459\n69119,852\n69119,2572\n69119,189303\n69120,44\n69123,68069\n69124,68069\n69124,86832\n69126,850\n69127,68069\n69129,2719\n69130,250\n69130,1684\n69131,69132\n69133,240\n69135,333\n69137,1243\n69138,30\n69139,68069\n69140,68069\n69141,68069\n69142,68069\n69143,8270\n69144,1238\n69145,2979\n69146,56\n69147,233\n69148,158\n69148,406\n69148,779\n69148,1181\n69148,1515\n69149,338\n69150,422\n69151,1285\n69152,195\n69153,68069\n69153,86832\n69154,68069\n69154,86832\n69155,68069\n69155,86832\n69156,68069\n69156,86832\n69157,68069\n69158,68069\n69158,86832\n69159,68069\n69159,86832\n69163,1983\n69164,1014\n69166,68069\n69167,118\n69167,4597\n69170,68069\n69172,264\n69173,1381\n69174,68069\n69174,86832\n69175,68069\n69176,68069\n69176,86832\n69177,557\n69178,1007\n69179,68069\n69180,483\n69181,68069\n69185,45022\n69188,2646\n69190,68069\n69192,68069\n69193,862\n69194,68069\n69195,422\n69196,422\n69197,422\n69198,422\n69199,422\n69200,68069\n69200,86832\n69201,422\n69202,422\n69203,422\n69204,422\n69205,422\n69206,422\n69208,68069\n69209,779\n69209,68069\n69211,83\n69212,69213\n69214,69215\n69216,202\n69216,203\n69217,72\n69220,68069\n69220,83086\n69220,91052\n69220,97025\n69221,104\n69221,953\n69221,954\n69221,1368\n69221,10318\n69222,907\n69223,68069\n69223,86832\n69224,515\n69227,225\n69228,69229\n69230,1265\n69230,1266\n69232,704\n69236,68069\n69236,86832\n69237,424\n69238,310\n69239,1118\n69240,3069\n69241,557\n69242,8884\n69243,68069\n69244,5547\n69245,1085\n69246,69247\n69246,119523\n69248,68069\n69249,644\n69250,455\n69250,623\n69250,1240\n69250,4760\n69250,6059\n69251,918\n69252,171\n69253,805\n69257,489\n69260,1285\n69261,151\n69262,843\n69263,1188\n69264,69265\n69267,72\n69268,7360\n69269,77\n69271,450\n69272,72\n69273,344\n69273,5547\n69274,366\n69275,68069\n69276,72\n69277,657\n69278,69279\n69281,233\n69282,393\n69283,69284\n69286,79\n69286,211\n69286,256\n69286,283\n69286,333\n69286,505\n69286,1014\n69286,5405\n69286,18298\n69287,289\n69287,290\n69288,1085\n69289,417\n69290,2296\n69291,1127\n69292,30\n69294,355\n69296,433\n69300,240\n69301,932\n69303,4060\n69304,372\n69304,1210\n69305,69306\n69307,2775\n69308,447\n69309,2775\n69310,447\n69311,843\n69312,589\n69312,818\n69312,953\n69312,2351\n69312,2995\n69312,6068\n69312,15573\n69316,693\n69317,333\n69318,192\n69320,3148\n69321,126\n69322,372\n69323,269\n69325,6323\n69326,16196\n69327,1\n69328,1\n69329,10\n69330,83\n69331,69332\n69333,58\n69334,46\n69335,163\n69335,438\n69335,1043\n69335,8270\n69336,1033\n69340,581\n69342,68069\n69342,86832\n69343,79\n69343,211\n69343,352\n69343,567\n69343,5405\n69343,5726\n69344,68069\n69345,567\n69346,68069\n69347,83\n69349,485\n69350,1247\n69351,69352\n69353,1127\n69354,779\n69355,973\n69355,4504\n69356,10\n69360,907\n69361,602\n69362,2351\n69363,18831\n69364,72\n69365,1566\n69366,424\n69366,805\n69367,72\n69368,1509\n69369,392\n69370,273\n69370,647\n69371,872\n69372,515\n69373,3999\n69374,69375\n69376,97\n69378,20359\n69379,333\n69379,760\n69379,808\n69379,2867\n69379,2868\n69379,73452\n69380,980\n69382,275\n69383,640\n69383,1644\n69383,7124\n69383,7270\n69383,9010\n69385,1411\n69386,69387\n69388,58\n69389,46\n69390,104\n69391,30\n69392,1285\n69393,69394\n69393,72023\n69397,4935\n69398,538\n69399,1370\n69401,493\n69402,79\n69402,192\n69402,372\n69402,425\n69402,577\n69402,599\n69402,740\n69402,741\n69402,861\n69402,1052\n69402,1140\n69402,1313\n69402,1893\n69402,20004\n69402,75912\n69403,333\n69404,9195\n69405,1058\n69406,69407\n69408,1113\n69409,885\n69410,779\n69412,991\n69413,20\n69413,366\n69413,424\n69413,500\n69413,622\n69413,1033\n69413,1085\n69413,1388\n69413,1531\n69413,1590\n69413,4455\n69415,184\n69416,483\n69417,2146\n69418,364\n69419,192\n69420,69421\n69422,1623\n69423,107\n69423,442\n69424,3069\n69425,69426\n69427,211\n69427,7363\n69428,4453\n69429,1140\n69429,5547\n69430,652\n69431,5212\n69432,83\n69433,1539\n69434,72\n69435,67939\n69436,79\n69437,13\n69438,10\n69439,72\n69440,240\n69440,1402\n69440,1818\n69441,207\n69442,994\n69443,515\n69444,4805\n69444,5908\n69445,50\n69445,79\n69445,104\n69445,250\n69445,372\n69445,527\n69445,668\n69445,698\n69445,762\n69445,811\n69445,861\n69445,1305\n69445,1326\n69445,1684\n69445,1707\n69445,1776\n69445,1782\n69445,1844\n69445,1860\n69445,2116\n69445,2371\n69445,2944\n69445,3135\n69445,3367\n69445,6837\n69445,24763\n69446,66\n69446,87\n69446,1590\n69447,2775\n69448,447\n69449,376\n69450,1776\n69450,4193\n69451,72\n69452,69453\n69452,157966\n69454,1639\n69455,1479\n69456,636\n69457,602\n69458,32\n69459,69460\n69461,136\n69462,1127\n69463,30\n69464,392\n69464,918\n69465,69466\n69467,289\n69467,290\n69467,657\n69467,685\n69467,3345\n69468,602\n69469,640\n69469,2206\n69470,7124\n69471,79\n69472,2089\n69472,2940\n69472,21944\n69473,17309\n69474,2089\n69474,2940\n69474,21944\n69475,393\n69476,8822\n69477,4276\n69477,22880\n69478,1133\n69479,479\n69480,973\n69481,72\n69482,827\n69483,657\n69484,195\n69485,7360\n69486,1181\n69487,72\n69488,298\n69489,485\n69490,8788\n69491,171\n69492,477\n69493,640\n69494,973\n69495,21487\n69495,22880\n69496,1133\n69497,69498\n69499,2506\n69500,69501\n69502,2506\n69503,34\n69503,35\n69504,72\n69505,69506\n69508,779\n69509,10\n69509,113156\n69510,72\n69511,779\n69512,1368\n69513,21944\n69515,158\n69515,252\n69515,622\n69515,862\n69516,622\n69516,1419\n69517,240\n69518,393\n69519,147\n69519,158\n69519,406\n69519,779\n69519,1181\n69519,1458\n69519,1515\n69520,8991\n69521,805\n69522,69523\n69524,9318\n69525,69526\n69527,147\n69527,158\n69527,779\n69527,1515\n69528,69529\n69530,14483\n69531,8822\n69532,850\n69533,1392\n69534,69535\n69536,1608\n69537,32475\n69538,5405\n69539,69540\n69541,392\n69541,623\n69542,557\n69543,69544\n69545,8991\n69546,130\n69547,18726\n69548,184\n69549,481\n69550,872\n69551,8992\n69553,872\n69554,1465\n69555,1871\n69557,137\n69558,7652\n69559,2620\n69560,420\n69561,640\n69562,233\n69563,107\n69564,292\n69565,2416\n69565,2417\n69566,338\n69567,1285\n69568,298\n69569,366\n69570,713\n69571,1133\n69572,3538\n69573,69574\n69575,69574\n69576,69577\n69578,21944\n69579,19227\n69580,17588\n69582,34\n69582,158\n69583,69584\n69586,1411\n69587,69588\n69589,346\n69590,137\n69591,72\n69592,818\n69593,1893\n69594,137\n69595,657\n69596,298\n69597,485\n69598,240\n69599,158\n69600,1644\n69602,1\n69602,217\n69602,459\n69602,640\n69602,2617\n69602,2923\n69603,349\n69604,17334\n69605,72\n69606,72\n69607,34\n69607,35\n69607,949\n69607,1467\n69607,2266\n69607,2944\n69608,72\n69609,72\n69610,298\n69611,485\n69612,2146\n69613,192\n69613,663\n69614,215\n69615,779\n69616,32475\n69617,298\n69618,485\n69619,907\n69620,2351\n69621,298\n69622,485\n69623,13361\n69624,372\n69624,999\n69625,1769\n69626,6068\n69627,305\n69628,999\n69629,68069\n69630,298\n69631,485\n69632,1052\n69633,1531\n69634,72\n69635,2266\n69636,640\n69637,192\n69638,200\n69639,72\n69640,515\n69641,8992\n69642,1149\n69643,5366\n69644,275\n69646,1181\n69647,503\n69647,1118\n69648,1224\n69649,1046\n69650,515\n69651,69652\n69651,220490\n69651,227655\n69653,999\n69654,72\n69655,72\n69656,72\n69657,72\n69658,206\n69659,72\n69660,818\n69661,1224\n69662,3069\n69663,294\n69664,118\n69664,4597\n69666,171\n69667,240\n69667,500\n69667,581\n69667,70390\n69668,1\n69668,50\n69668,175\n69668,406\n69668,640\n69668,55849\n69668,102560\n69669,31977\n69670,79\n69671,68069\n69672,366\n69673,290\n69673,585\n69674,68\n69675,69676\n69678,3252\n69679,907\n69679,1117\n69679,148742\n69680,481\n69681,9121\n69682,2048\n69683,859\n69684,1247\n69685,1454\n69686,69687\n69686,69714\n69686,71024\n69686,73452\n69688,252\n69688,289\n69688,290\n69688,318\n69688,332\n69688,841\n69688,1132\n69688,1285\n69688,1381\n69688,4545\n69688,139010\n69689,4691\n69690,69691\n69692,72\n69693,4192\n69693,4193\n69694,48\n69695,79\n69696,54\n69697,534\n69698,1749\n69699,336\n69700,2178\n69700,4545\n69700,56150\n69700,139010\n69701,483\n69702,48\n69703,48\n69704,167\n69705,118\n69705,4597\n69706,1359\n69707,21944\n69708,48\n69709,657\n69710,1033\n69711,779\n69712,5265\n69713,251\n69713,252\n69713,1220\n69713,1222\n69713,41170\n69715,151\n69716,392\n69717,430\n69718,406\n69719,298\n69720,485\n69721,2506\n69722,3089\n69723,994\n69725,256\n69725,305\n69725,1782\n69725,3209\n69725,9018\n69725,69687\n69726,8235\n69727,2929\n69728,23701\n69729,376\n69730,557\n69732,663\n69732,779\n69733,393\n69734,6682\n69735,69736\n69737,481\n69738,8992\n69739,805\n69740,1707\n69741,289\n69741,290\n69742,34\n69742,1776\n69742,4193\n69743,158\n69744,30\n69745,366\n69746,1243\n69747,69748\n69747,89204\n69749,2995\n69750,841\n69750,1462\n69751,2775\n69752,298\n69753,485\n69754,366\n69755,69756\n69757,874\n69758,557\n69759,862\n69760,557\n69761,557\n69762,136\n69763,3246\n69764,63\n69765,557\n69766,779\n69767,206\n69768,333\n69769,219\n69770,298\n69771,485\n69772,1983\n69773,647\n69774,344\n69775,433\n69776,219\n69777,2506\n69779,980\n69780,271\n69781,872\n69782,872\n69783,872\n69784,1983\n69785,2995\n69786,779\n69787,1962\n69788,1359\n69789,2506\n69791,1181\n69792,477\n69793,602\n69794,477\n69795,310\n69796,1177\n69796,2210\n69797,79\n69797,911\n69798,920\n69799,704\n69800,602\n69801,178\n69802,602\n69803,602\n69804,602\n69805,602\n69806,2146\n69807,8991\n69808,2266\n69809,602\n69810,4\n69810,5\n69810,355\n69810,743\n69810,2089\n69810,2940\n69811,2931\n69811,4078\n69812,2506\n69813,195\n69814,68069\n69815,420\n69816,392\n69817,69818\n69819,69820\n69821,2351\n69823,682\n69824,626\n69825,2146\n69826,21487\n69826,22880\n69827,1313\n69828,4276\n69830,4101\n69831,18726\n69832,69833\n69832,69894\n69832,76461\n69832,84964\n69832,87535\n69832,90613\n69832,91601\n69832,93844\n69832,94436\n69832,98824\n69832,99485\n69832,99936\n69832,100222\n69832,100488\n69832,103442\n69832,103673\n69832,109229\n69832,111067\n69832,111563\n69832,111567\n69832,112733\n69832,112769\n69832,115475\n69832,117669\n69832,118074\n69832,119446\n69832,119630\n69832,120200\n69832,122170\n69832,122175\n69832,122337\n69832,123144\n69832,124327\n69832,124702\n69832,125241\n69832,125304\n69832,125608\n69832,129218\n69832,132422\n69832,133880\n69835,479\n69835,589\n69835,849\n69835,3297\n69835,66898\n69837,255\n69839,779\n69840,273\n69841,973\n69842,292\n69843,294\n69844,30\n69844,137\n69844,225\n69844,772\n69844,1332\n69845,296\n69846,298\n69847,1411\n69848,422\n69849,56\n69850,422\n69851,56\n69852,1238\n69853,1452\n69854,240\n69855,187\n69857,704\n69858,3413\n69859,68\n69860,69861\n69862,366\n69863,1566\n69864,69865\n69866,1776\n69867,1238\n69868,233\n69869,69870\n69873,4748\n69873,68725\n69874,1818\n69875,69876\n69877,644\n69878,874\n69879,158\n69880,69881\n69882,23287\n69883,178\n69883,439\n69883,1776\n69883,1877\n69885,589\n69886,953\n69887,3246\n69888,30\n69889,118\n69889,4597\n69891,422\n69892,56\n69893,3\n69893,206\n69895,38634\n69896,557\n69897,118\n69897,333\n69898,4039\n69899,30\n69900,298\n69901,485\n69902,2224\n69903,217\n69904,298\n69905,485\n69908,1860\n69909,5547\n69911,298\n69912,485\n69913,120\n69914,2146\n69915,1414\n69916,192\n69916,202\n69916,620\n69916,760\n69916,1462\n69916,8537\n69917,79\n69918,298\n69919,485\n69920,1181\n69921,255\n69922,222\n69924,298\n69925,485\n69926,298\n69927,485\n69928,1983\n69929,326\n69930,671\n69931,302\n69931,2116\n69933,69934\n69935,1122\n69936,875\n69937,15609\n69938,298\n69939,485\n69940,907\n69941,217\n69941,949\n69942,932\n69943,1127\n69944,8180\n69946,784\n69947,571\n69947,818\n69947,868\n69948,671\n69949,68069\n69950,347\n69951,203\n69951,2931\n69952,333\n69953,918\n69954,2646\n69955,298\n69956,485\n69957,515\n69957,652\n69957,872\n69957,1893\n69958,192\n69958,1181\n69959,579\n69959,2146\n69960,1860\n69961,479\n69962,415\n69963,731\n69964,640\n69965,640\n69966,160\n69967,2775\n69968,1181\n69969,422\n69970,422\n69971,422\n69972,422\n69973,422\n69974,5718\n69975,422\n69976,309\n69976,310\n69977,160\n69979,30\n69980,2411\n69981,240\n69981,818\n69982,2931\n69983,805\n69984,2697\n69985,6955\n69989,2421\n69990,657\n69990,1474\n69991,248\n69991,1140\n69992,344\n69994,1010\n69995,1102\n69996,1388\n69997,676\n69998,240\n69999,602\n70000,1012\n70002,298\n70003,485\n70004,862\n70005,516\n70006,106\n70006,59021\n70007,5212\n70008,2626\n70009,17309\n70010,70011\n70012,392\n70013,2697\n70015,1556\n70019,30\n70020,4192\n70020,4193\n70022,207\n70023,298\n70024,485\n70025,1140\n70025,5547\n70026,5405\n70028,299\n70028,604\n70028,1293\n70028,1837\n70029,697\n70029,852\n70029,3003\n70030,298\n70031,485\n70033,749\n70034,298\n70035,485\n70036,760\n70037,30\n70038,1274\n70039,50\n70040,83\n70041,254\n70042,604\n70043,1052\n70043,1368\n70045,818\n70045,2646\n70046,599\n70047,1011\n70048,372\n70049,4192\n70049,4193\n70050,1962\n70051,192\n70052,70053\n70054,5547\n70055,30\n70057,71\n70058,298\n70059,485\n70060,671\n70060,1181\n70061,192\n70062,215\n70063,3769\n70064,187\n70066,355\n70070,30\n70071,439\n70073,1803\n70074,30\n70076,68069\n70077,30\n70078,1639\n70078,8788\n70079,160\n70079,675\n70080,202\n70080,203\n70081,1803\n70083,298\n70084,485\n70085,30\n70086,850\n70087,1882\n70088,310\n70088,596\n70088,3039\n70088,75912\n70089,30\n70090,1381\n70091,72\n70092,147\n70092,406\n70093,577\n70094,30\n70095,30\n70096,1983\n70097,9560\n70098,45960\n70099,8270\n70100,72\n70101,298\n70102,485\n70103,72\n70104,355\n70105,137\n70106,222\n70106,1019\n70107,20\n70108,72\n70109,1118\n70110,1240\n70112,79\n70113,620\n70114,392\n70114,1240\n70115,30\n70116,1381\n70117,298\n70118,485\n70119,1359\n70120,920\n70121,1240\n70122,673\n70123,72\n70124,347\n70124,1096\n70126,1801\n70127,261\n70128,3804\n70129,420\n70129,509\n70130,1631\n70133,440\n70134,5366\n70135,1977\n70135,1978\n70136,186\n70136,968\n70136,1240\n70137,1181\n70138,1803\n70138,21442\n70138,118336\n70139,349\n70140,298\n70141,485\n70142,160\n70145,21944\n70147,818\n70147,1240\n70148,2995\n70149,3\n70150,422\n70151,784\n70152,56\n70153,3003\n70154,1284\n70155,1085\n70156,2146\n70157,298\n70158,485\n70159,65\n70160,65\n70161,1046\n70162,298\n70163,485\n70164,1140\n70164,2443\n70164,3474\n70164,5547\n70165,518\n70166,1052\n70166,1849\n70167,298\n70168,485\n70169,868\n70169,1707\n70170,17334\n70171,298\n70172,485\n70173,4455\n70174,397\n70175,1467\n70176,65\n70177,3451\n70177,3452\n70178,17593\n70179,1983\n70181,3209\n70182,3451\n70182,3452\n70183,17593\n70184,65\n70185,640\n70185,159365\n70186,1769\n70187,1623\n70188,4\n70188,5\n70189,390\n70190,743\n70191,160\n70192,647\n70193,344\n70194,3209\n70195,417\n70195,1085\n70195,2205\n70195,2206\n70195,2296\n70195,33424\n70196,1531\n70197,1983\n70198,70199\n70201,1515\n70202,920\n70203,195\n70203,3538\n70204,34\n70204,1718\n70207,477\n70208,151\n70209,1127\n70210,298\n70211,485\n70212,15\n70212,693\n70213,32\n70213,392\n70213,697\n70214,233\n70214,304\n70214,649\n70214,704\n70214,893\n70214,932\n70214,1458\n70214,3069\n70215,571\n70215,1014\n70215,1326\n70216,298\n70217,485\n70218,338\n70219,750\n70220,147\n70220,158\n70220,42064\n70221,356\n70221,5591\n70222,920\n70223,5212\n70224,360\n70224,827\n70224,1117\n70224,1677\n70224,2274\n70224,2807\n70224,3630\n70225,65\n70225,586\n70226,240\n70226,818\n70227,107\n70227,4548\n70228,222\n70228,455\n70229,192\n70229,9457\n70231,14231\n70231,21944\n70231,66297\n70233,30\n70234,264\n70235,433\n70235,1240\n70236,65\n70236,571\n70236,868\n70237,1298\n70238,298\n70239,485\n70240,1\n70241,611\n70242,392\n70243,247\n70244,5547\n70245,70246\n70247,272\n70248,392\n70249,299\n70249,1319\n70250,5366\n70251,160\n70252,2775\n70253,70254\n70255,3413\n70256,330\n70257,875\n70258,158\n70259,83\n70260,298\n70261,485\n70262,1085\n70263,19\n70264,2296\n70265,72\n70266,72\n70267,477\n70268,1623\n70269,743\n70270,390\n70271,4\n70271,5\n70272,160\n70273,184\n70274,5310\n70275,1556\n70276,360\n70277,1070\n70277,1240\n70277,1467\n70278,2105\n70281,58\n70282,46\n70283,70284\n70285,874\n70286,918\n70287,875\n70288,431\n70288,510\n70289,70290\n70291,392\n70292,135\n70293,70294\n70295,222\n70295,1019\n70296,333\n70296,406\n70297,30\n70298,527\n70299,356\n70300,70301\n70302,30\n70303,406\n70304,3413\n70305,714\n70305,1962\n70306,5375\n70307,30\n70308,72\n70309,623\n70309,1805\n70310,298\n70311,195\n70313,151\n70314,46\n70314,459\n70314,744\n70314,783\n70314,1479\n70315,70316\n70315,83828\n70317,158\n70318,1634\n70318,1807\n70319,536\n70319,2424\n70320,999\n70321,298\n70322,372\n70322,1962\n70323,818\n70326,58\n70327,46\n70328,70329\n70330,611\n70332,364\n70332,431\n70332,1252\n70332,1253\n70332,1888\n70333,827\n70334,657\n70335,8149\n70336,1052\n70337,20\n70337,160\n70337,477\n70337,481\n70337,644\n70337,666\n70337,1043\n70337,2168\n70337,13137\n70337,23287\n70338,588\n70338,590\n70338,1419\n70339,1634\n70340,346\n70341,34\n70341,35\n70341,83\n70342,44\n70343,346\n70344,70345\n70347,1309\n70348,779\n70348,68069\n70349,918\n70351,1522\n70352,631\n70353,772\n70354,1285\n70355,346\n70356,682\n70357,1181\n70357,1515\n70358,72\n70359,1858\n70360,1860\n70361,1881\n70362,18790\n70363,1572\n70364,217\n70364,222\n70365,433\n70366,931\n70367,192\n70367,207\n70367,675\n70367,698\n70368,72\n70369,999\n70370,70371\n70372,581\n70373,557\n70373,596\n70373,2210\n70373,4237\n70373,4355\n70374,422\n70375,56\n70376,1284\n70378,1224\n70379,146\n70379,779\n70379,2244\n70380,70381\n70380,101083\n70382,93\n70382,94\n70383,1326\n70384,408\n70385,70386\n70387,104\n70388,333\n70389,406\n70391,346\n70392,247\n70393,298\n70394,485\n70395,392\n70395,457\n70395,503\n70395,644\n70395,657\n70395,697\n70395,714\n70395,794\n70395,918\n70395,1012\n70395,1019\n70395,1147\n70395,1293\n70395,1359\n70395,1363\n70395,1522\n70395,1544\n70395,1663\n70395,1818\n70395,2083\n70395,2253\n70395,2605\n70395,3003\n70395,3474\n70395,4165\n70395,5547\n70395,48505\n70396,10\n70397,346\n70399,376\n70400,1323\n70401,102\n70402,704\n70403,1235\n70403,1335\n70404,63\n70404,252\n70404,318\n70404,516\n70405,631\n70406,1467\n70407,2146\n70408,455\n70409,2424\n70410,1467\n70411,1085\n70412,1871\n70413,83\n70414,2421\n70415,13980\n70416,1149\n70417,581\n70418,328\n70419,20\n70420,1844\n70421,2434\n70422,483\n70424,1454\n70424,19443\n70425,1515\n70427,3161\n70428,338\n70428,420\n70428,872\n70428,1572\n70428,1688\n70428,1722\n70428,1836\n70428,3538\n70429,70430\n70431,8991\n70432,251\n70433,1370\n70433,1821\n70434,366\n70434,657\n70434,760\n70434,1267\n70434,2244\n70435,309\n70435,310\n70435,1284\n70436,2506\n70437,872\n70438,1370\n70438,1821\n70439,663\n70439,664\n70439,1149\n70440,207\n70441,515\n70442,10\n70443,577\n70444,615\n70444,1119\n70445,30\n70446,2506\n70447,1983\n70448,3695\n70449,269\n70450,22\n70451,4611\n70452,4611\n70454,21944\n70455,346\n70456,70457\n70458,932\n70459,10\n70460,333\n70461,1381\n70462,557\n70463,557\n70464,118\n70464,4597\n70465,206\n70466,18790\n70467,389\n70468,479\n70469,346\n70470,70471\n70472,9195\n70473,79\n70473,140\n70473,202\n70473,203\n70473,360\n70473,1052\n70473,1118\n70473,1132\n70473,1298\n70473,1313\n70473,1572\n70473,1579\n70473,1659\n70473,1968\n70473,2224\n70473,2626\n70473,21408\n70473,191860\n70474,344\n70476,5366\n70477,932\n70478,70478\n70479,70480\n70481,37414\n70482,704\n70483,493\n70483,2146\n70484,931\n70487,515\n70490,1634\n70492,5366\n70493,195\n70494,147\n70494,158\n70495,973\n70496,70497\n70498,1634\n70499,422\n70500,56\n70501,301\n70501,596\n70501,2006\n70502,326\n70502,349\n70503,269\n70504,1181\n70505,602\n70506,1235\n70506,1335\n70507,30\n70508,67343\n70509,358\n70509,422\n70510,2416\n70510,2417\n70511,920\n70512,313\n70513,602\n70514,602\n70515,70516\n70517,72\n70519,70520\n70521,178\n70522,704\n70523,70524\n70525,749\n70526,393\n70526,2146\n70526,3872\n70528,30\n70529,247\n70530,333\n70531,8180\n70532,1243\n70533,70534\n70535,70536\n70537,852\n70538,30\n70539,30\n70540,647\n70541,344\n70542,111\n70542,217\n70542,388\n70542,455\n70542,14126\n70543,30\n70544,640\n70545,344\n70546,8180\n70547,9560\n70548,83\n70549,30\n70550,70524\n70551,83\n70552,70524\n70553,640\n70555,640\n70556,202\n70556,203\n70557,70558\n70559,70558\n70560,1140\n70560,1381\n70561,99\n70562,118\n70562,4597\n70564,163\n70565,1\n70567,2889\n70568,875\n70569,479\n70570,4604\n70571,640\n70572,70524\n70573,563\n70574,70524\n70575,657\n70576,70524\n70577,70524\n70578,518\n70579,269\n70580,70524\n70581,70524\n70582,70524\n70583,310\n70584,70585\n70587,3960\n70588,70589\n70588,77460\n70588,80280\n70588,96075\n70588,100086\n70588,102961\n70588,110301\n70588,115174\n70588,122074\n70588,125739\n70588,129314\n70588,130982\n70588,131104\n70588,134178\n70588,139836\n70590,70524\n70591,70524\n70592,366\n70593,70524\n70594,366\n70595,70524\n70596,70524\n70597,1551\n70598,70524\n70599,70524\n70600,8270\n70601,70524\n70602,70603\n70602,123340\n70602,134419\n70604,1653\n70605,70524\n70606,254\n70607,70524\n70608,70609\n70610,195\n70611,70524\n70612,70524\n70613,3413\n70614,70615\n70616,467\n70617,70524\n70618,693\n70619,70524\n70620,70524\n70621,70524\n70622,70524\n70623,240\n70624,697\n70625,70524\n70626,70524\n70627,393\n70628,2351\n70629,70524\n70630,70631\n70632,366\n70633,366\n70634,70524\n70635,70524\n70636,70524\n70637,104\n70637,134\n70637,138\n70637,4237\n70637,182162\n70639,70524\n70640,657\n70641,70524\n70642,3413\n70643,70524\n70644,3321\n70645,70524\n70646,70524\n70647,70524\n70648,1531\n70649,622\n70650,70524\n70651,30\n70652,30\n70653,70524\n70654,70524\n70656,163\n70657,298\n70658,485\n70659,70524\n70660,70524\n70661,1749\n70662,70524\n70663,644\n70664,70524\n70666,70524\n70667,1033\n70667,41767\n70668,766\n70669,70524\n70670,13361\n70671,70524\n70672,70524\n70673,70674\n70675,70524\n70676,70524\n70677,70524\n70678,233\n70679,70524\n70680,30\n70681,70524\n70682,70524\n70683,70524\n70684,30\n70685,30\n70686,79\n70687,70524\n70688,70524\n70689,873\n70689,1210\n70690,70524\n70691,70524\n70692,355\n70693,70524\n70694,70524\n70695,70524\n70696,70524\n70697,70524\n70698,604\n70699,70524\n70700,435\n70701,70524\n70702,2045\n70703,2353\n70704,70524\n70705,70706\n70707,70708\n70709,70524\n70710,704\n70712,704\n70713,30\n70714,30\n70715,70524\n70716,275\n70717,70524\n70718,1140\n70718,5547\n70719,21944\n70720,346\n70721,875\n70722,30\n70724,1370\n70726,70524\n70727,70524\n70728,207\n70729,70524\n70730,1983\n70731,70732\n70734,872\n70735,8991\n70736,70524\n70737,3\n70737,1590\n70739,70524\n70740,158\n70740,406\n70740,779\n70740,1181\n70740,1515\n70741,287\n70741,809\n70741,19010\n70742,431\n70743,450\n70744,70524\n70745,337\n70745,586\n70746,1631\n70747,254\n70748,149\n70749,147\n70750,920\n70751,647\n70752,344\n70753,187\n70754,298\n70755,485\n70756,58\n70757,70524\n70758,30\n70759,298\n70760,485\n70761,843\n70762,575\n70762,2045\n70763,70524\n70765,70524\n70766,310\n70767,875\n70768,70524\n70769,30\n70770,192\n70770,333\n70770,1634\n70770,2574\n70771,70524\n70772,16019\n70773,83\n70774,70524\n70775,70524\n70776,83\n70777,70524\n70778,70524\n70779,70524\n70780,356\n70781,70524\n70782,70524\n70783,70524\n70784,631\n70785,70524\n70786,557\n70787,1368\n70788,70524\n70789,211\n70790,70524\n70791,70524\n70793,5547\n70794,70524\n70795,19010\n70796,70524\n70797,30\n70798,435\n70799,70524\n70800,527\n70801,1955\n70802,1181\n70803,8235\n70804,178\n70804,289\n70804,290\n70804,1046\n70804,1119\n70804,1531\n70804,6027\n70804,13546\n70805,70524\n70806,393\n70807,70524\n70808,298\n70809,485\n70810,298\n70811,535\n70811,872\n70811,9030\n70812,485\n70813,58\n70814,70524\n70816,118\n70816,4597\n70817,70524\n70820,1140\n70820,3474\n70820,5547\n70821,70822\n70823,309\n70823,310\n70823,483\n70823,3039\n70824,868\n70825,2779\n70825,2784\n70826,70524\n70827,2744\n70828,868\n70829,70524\n70830,1181\n70831,70524\n70832,1590\n70832,6661\n70833,3367\n70834,70524\n70835,527\n70836,19010\n70837,70524\n70838,5547\n70839,784\n70840,32475\n70841,70524\n70843,366\n70843,406\n70844,70524\n70845,685\n70846,70524\n70847,868\n70848,693\n70849,70524\n70850,77\n70850,1619\n70851,422\n70852,1619\n70853,1531\n70854,240\n70855,70524\n70856,70524\n70857,843\n70858,277\n70858,279\n70858,13529\n70858,70858\n70859,1070\n70860,70524\n70861,83\n70862,349\n70863,70524\n70864,70524\n70865,70524\n70866,1858\n70867,1860\n70868,70524\n70869,195\n70870,868\n70870,162599\n70872,1474\n70873,818\n70874,70524\n70875,344\n70876,70524\n70878,70524\n70879,34\n70879,35\n70880,48\n70881,70524\n70883,1436\n70883,1984\n70883,5708\n70884,70524\n70885,147\n70885,422\n70887,1782\n70888,222\n70889,70524\n70890,217\n70890,1019\n70891,298\n70892,485\n70893,70524\n70894,70895\n70896,206\n70896,682\n70896,920\n70896,72439\n70897,136\n70898,72\n70900,30\n70900,328\n70900,1033\n70900,1939\n70902,2312\n70903,581\n70904,1639\n70905,79\n70905,536\n70905,70906\n70905,115219\n70907,70906\n70908,571\n70908,868\n70909,70524\n70910,2506\n70911,70912\n70913,422\n70914,907\n70915,70524\n70916,215\n70917,70918\n70920,1127\n70920,2424\n70921,70524\n70922,298\n70923,1858\n70924,1860\n70925,2224\n70926,7757\n70928,392\n70928,1151\n70929,160\n70931,206\n70932,30\n70933,346\n70934,1359\n70936,346\n70937,515\n70938,1860\n70939,146\n70939,92476\n70942,18790\n70943,10\n70944,1805\n70945,4455\n70946,595\n70946,2617\n70947,972\n70948,859\n70949,1983\n70950,72\n70951,252\n70951,1220\n70951,1222\n70951,41170\n70952,1858\n70953,1860\n70954,30\n70955,1983\n70956,2506\n70957,1844\n70958,1146\n70959,3602\n70960,326\n70962,392\n70963,1769\n70964,3447\n70965,1\n70965,60576\n70967,48\n70968,7757\n70970,104\n70970,1368\n70971,1130\n70972,8270\n70973,1983\n70974,356\n70975,70976\n70975,122838\n70975,128240\n70975,128616\n70975,129152\n70977,298\n70978,485\n70979,7698\n70980,1983\n70982,9025\n70983,1177\n70984,1368\n70985,702\n70985,752\n70985,874\n70985,1133\n70985,1210\n70985,1801\n70986,713\n70987,599\n70988,1983\n70989,2646\n70990,1983\n70991,83\n70993,872\n70995,779\n70995,141912\n70996,50\n70997,693\n70997,75912\n70998,259\n70999,160\n70999,827\n70999,1147\n71000,3321\n71001,71002\n71003,422\n71004,349\n71005,611\n71006,433\n71007,489\n71007,2116\n71008,1167\n71009,299\n71010,1181\n71011,79\n71012,30\n71013,70524\n71014,406\n71015,372\n71015,393\n71015,100740\n71015,100949\n71015,101263\n71015,101689\n71015,103339\n71015,103495\n71016,47\n71016,184\n71016,202\n71016,203\n71016,2469\n71017,417\n71017,626\n71017,1133\n71018,3507\n71019,4355\n71020,34\n71020,1776\n71020,4193\n71021,158\n71023,406\n71025,1939\n71027,79\n71027,158\n71027,192\n71027,202\n71027,203\n71027,333\n71027,586\n71027,663\n71027,664\n71027,1181\n71027,3876\n71028,56\n71028,147\n71028,158\n71028,192\n71028,60576\n71029,852\n71030,663\n71030,664\n71030,2178\n71030,4545\n71030,56150\n71031,694\n71033,1240\n71034,30\n71034,622\n71035,18831\n71036,406\n71036,435\n71037,289\n71037,290\n71037,344\n71037,620\n71037,685\n71037,1252\n71037,1253\n71037,2116\n71038,233\n71039,1844\n71040,422\n71041,422\n71042,298\n71043,485\n71044,422\n71045,422\n71047,422\n71048,200\n71048,1319\n71048,1955\n71048,2775\n71049,422\n71050,1359\n71051,406\n71052,422\n71053,422\n71054,515\n71054,1579\n71054,1893\n71054,2312\n71055,731\n71056,440\n71057,1001\n71058,422\n71059,56\n71061,94\n71061,885\n71061,2787\n71061,13704\n71062,640\n71063,392\n71063,697\n71064,1467\n71065,2146\n71066,302\n71066,579\n71067,872\n71069,852\n71069,5591\n71070,390\n71070,417\n71070,1285\n71071,5310\n71072,3069\n71073,283\n71074,455\n71075,2206\n71075,6726\n71076,32\n71076,37\n71076,54\n71076,83\n71076,140\n71076,217\n71076,278\n71076,283\n71076,304\n71076,385\n71076,388\n71076,392\n71076,538\n71076,577\n71076,589\n71076,626\n71076,660\n71076,749\n71076,752\n71076,859\n71076,919\n71076,949\n71076,1010\n71076,1151\n71076,1175\n71076,1212\n71076,1241\n71076,1287\n71076,1289\n71076,1298\n71076,1309\n71076,1479\n71076,1509\n71076,1579\n71076,1616\n71076,1634\n71076,1801\n71076,1871\n71076,2421\n71076,2424\n71076,2646\n71076,3507\n71076,3585\n71076,3999\n71076,6059\n71076,6424\n71076,9015\n71076,14483\n71076,22293\n71076,35486\n71077,1556\n71081,3538\n71082,720\n71084,875\n71085,4\n71085,5\n71085,620\n71085,628\n71085,1572\n71086,366\n71087,247\n71088,366\n71089,71090\n71091,640\n71091,2206\n71092,1871\n71093,134\n71094,1359\n71095,406\n71096,48\n71097,301\n71098,972\n71098,973\n71099,3069\n71100,392\n71101,273\n71102,137\n71103,106\n71103,337\n71104,178\n71105,1381\n71106,30\n71107,1531\n71108,577\n71109,1181\n71110,261\n71110,1119\n71111,302\n71112,151\n71113,1149\n71113,1631\n71113,5265\n71114,338\n71115,30\n71116,452\n71117,2367\n71119,192\n71120,850\n71121,805\n71122,1359\n71123,134\n71124,640\n71125,71126\n71127,393\n71128,30\n71129,483\n71130,2995\n71131,147\n71132,640\n71133,907\n71133,1284\n71134,1151\n71135,247\n71136,8270\n71137,83\n71138,376\n71139,885\n71140,2146\n71141,392\n71142,19010\n71143,372\n71145,2697\n71146,71147\n71148,83\n71149,536\n71150,2671\n71151,622\n71152,1033\n71154,652\n71155,160\n71156,1893\n71157,79\n71158,1\n71161,536\n71161,44725\n71162,1509\n71163,1531\n71164,376\n71165,626\n71166,818\n71167,192\n71168,1323\n71169,102\n71170,1326\n71171,408\n71172,10\n71173,30\n71174,805\n71175,310\n71176,2697\n71177,1715\n71178,48\n71179,30\n71180,392\n71180,1151\n71181,536\n71182,71183\n71184,509\n71184,510\n71184,1043\n71184,1424\n71184,1805\n71184,3367\n71185,809\n71185,22293\n71186,259\n71187,1285\n71188,852\n71188,2699\n71189,30\n71190,2782\n71191,2209\n71192,171\n71193,1133\n71194,433\n71195,298\n71196,485\n71197,298\n71198,485\n71199,217\n71200,516\n71201,1531\n71202,44\n71203,140\n71203,1462\n71204,818\n71205,3804\n71206,1707\n71208,3409\n71209,972\n71210,557\n71211,298\n71212,485\n71213,640\n71214,557\n71215,994\n71216,393\n71217,2526\n71218,72\n71219,640\n71220,298\n71221,485\n71222,206\n71223,8598\n71224,704\n71225,147\n71226,137\n71227,71228\n71229,865\n71229,1432\n71230,406\n71231,333\n71232,50\n71233,841\n71234,146\n71235,336\n71236,585\n71237,602\n71238,779\n71239,192\n71240,71240\n71241,620\n71242,622\n71243,79\n71244,44\n71245,6119\n71246,285\n71247,99\n71248,3960\n71249,2719\n71250,71251\n71252,269\n71253,8270\n71254,2995\n71255,233\n71255,240\n71255,590\n71255,592\n71255,631\n71255,1785\n71255,1818\n71255,2620\n71255,5718\n71256,805\n71257,3555\n71258,13\n71258,489\n71259,298\n71260,485\n71261,72\n71262,338\n71263,779\n71264,417\n71265,1265\n71265,1266\n71266,1181\n71267,1010\n71268,3321\n71269,30\n71270,1749\n71271,452\n71272,1247\n71273,184\n71274,200\n71275,5265\n71276,296\n71276,671\n71277,222\n71278,298\n71279,485\n71280,71281\n71282,640\n71282,2206\n71283,7124\n71284,298\n71285,485\n71286,71287\n71288,527\n71289,298\n71290,485\n71291,30\n71292,5908\n71293,277\n71293,585\n71294,240\n71294,1962\n71295,1359\n71296,1\n71297,251\n71297,1243\n71298,1370\n71299,30\n71300,298\n71301,485\n71302,17886\n71303,1\n71303,147\n71303,149\n71303,158\n71303,171\n71303,184\n71303,206\n71303,606\n71303,1458\n71303,1619\n71303,1623\n71303,2244\n71303,4507\n71303,7817\n71303,8854\n71303,23861\n71303,26841\n71303,39437\n71303,40514\n71303,65723\n71303,71303\n71303,76835\n71303,87843\n71303,87870\n71303,112537\n71303,121575\n71303,138831\n71303,147380\n71303,179365\n71303,194784\n71303,207140\n71303,207671\n71303,228739\n71303,247936\n71303,258183\n71303,258567\n71303,262171\n71304,83\n71305,3507\n71306,779\n71307,5440\n71308,907\n71309,8180\n71310,4355\n71311,10\n71312,1359\n71313,1881\n71314,602\n71315,602\n71316,818\n71317,795\n71318,333\n71319,71320\n71321,1590\n71322,292\n71323,45024\n71324,664\n71324,1085\n71325,358\n71325,2266\n71326,392\n71326,1151\n71328,1359\n71329,10\n71329,750\n71330,72\n71331,217\n71331,1893\n71332,192\n71332,3872\n71333,920\n71333,957\n71333,1815\n71334,70524\n71335,450\n71336,70524\n71337,3872\n71338,920\n71339,920\n71340,209\n71341,71342\n71343,71\n71344,71344\n71345,1983\n71346,801\n71346,1140\n71346,5547\n71347,595\n71348,71349\n71350,338\n71351,70524\n71352,70524\n71353,195\n71354,422\n71355,70524\n71356,2775\n71357,447\n71358,70524\n71359,70524\n71360,207\n71361,586\n71362,136\n71362,217\n71362,254\n71362,6249\n71363,70524\n71364,346\n71365,70524\n71366,336\n71367,1983\n71368,338\n71369,366\n71370,8270\n71371,366\n71372,30\n71373,366\n71374,366\n71375,70524\n71376,30\n71376,328\n71376,1179\n71376,1305\n71376,2146\n71376,2701\n71376,7124\n71377,932\n71378,81\n71379,1411\n71380,70524\n71381,346\n71382,70524\n71383,70524\n71384,70524\n71385,138\n71385,1368\n71385,2105\n71386,70524\n71387,70524\n71388,70524\n71389,70524\n71390,70524\n71391,30\n71392,70524\n71393,70524\n71394,70524\n71395,70524\n71396,70524\n71397,70524\n71398,70524\n71399,346\n71400,70524\n71401,346\n71402,70524\n71403,2697\n71404,70524\n71405,70524\n71406,71407\n71408,70524\n71409,18726\n71410,70524\n71411,163\n71412,70524\n71413,70524\n71414,70524\n71415,70524\n71416,70524\n71417,70524\n71418,70524\n71419,70524\n71420,70524\n71421,70524\n71422,70524\n71423,70524\n71424,70524\n71425,309\n71425,310\n71426,70524\n71427,70524\n71428,1983\n71429,70524\n71430,70524\n71431,70524\n71432,70524\n71433,70524\n71434,70524\n71435,70524\n71436,818\n71437,393\n71438,70524\n71439,70524\n71440,70524\n71441,70524\n71442,346\n71443,805\n71444,70524\n71445,70524\n71446,70524\n71447,240\n71448,70524\n71449,18726\n71450,70524\n71451,70524\n71452,9121\n71453,3960\n71454,1462\n71454,8537\n71455,70524\n71456,70524\n71457,346\n71458,1140\n71458,5547\n71459,70524\n71460,70524\n71461,71462\n71461,84517\n71461,88100\n71463,71464\n71465,70524\n71466,83\n71466,217\n71466,278\n71466,455\n71466,536\n71466,1467\n71467,70524\n71468,70524\n71469,70524\n71470,70524\n71471,841\n71472,70524\n71473,346\n71474,70524\n71475,70524\n71476,70524\n71477,71478\n71479,70524\n71480,70524\n71481,70524\n71482,1167\n71484,70524\n71485,71486\n71487,70524\n71488,71489\n71490,71489\n71491,70524\n71492,70524\n71493,704\n71494,70524\n71495,70524\n71496,7358\n71496,7363\n71497,70524\n71498,70524\n71499,70524\n71500,70524\n71501,70524\n71502,70524\n71503,70524\n71504,70524\n71505,70524\n71506,70524\n71507,70524\n71508,70524\n71509,70524\n71510,70524\n71511,70524\n71512,70524\n71513,70524\n71514,70524\n71515,861\n71516,70524\n71517,70524\n71518,70524\n71519,118\n71519,4597\n71520,118\n71520,4597\n71521,70524\n71522,175\n71523,70524\n71524,70524\n71525,9195\n71526,71527\n71526,72930\n71526,88908\n71526,91035\n71526,92066\n71526,92315\n71526,92601\n71526,96820\n71526,99682\n71526,104960\n71526,105528\n71526,107143\n71528,70524\n71529,70524\n71530,3246\n71531,70524\n71532,450\n71533,1977\n71533,1978\n71534,70524\n71535,70524\n71536,973\n71537,70524\n71538,71539\n71540,850\n71540,1572\n71541,70524\n71542,68\n71543,70524\n71545,97\n71546,70524\n71547,1267\n71548,2116\n71549,302\n71550,3695\n71551,70524\n71552,2574\n71553,5212\n71554,70524\n71555,71556\n71557,21487\n71558,233\n71559,289\n71559,290\n71560,178\n71560,403\n71560,408\n71560,579\n71560,827\n71560,1479\n71560,1572\n71560,1803\n71560,1968\n71560,3653\n71561,70524\n71562,557\n71563,70524\n71564,479\n71565,71566\n71567,70524\n71568,4101\n71569,70524\n71570,644\n71571,70524\n71572,1467\n71573,687\n71574,1634\n71575,70524\n71576,70524\n71577,70524\n71578,70524\n71579,70524\n71580,71581\n71583,70524\n71585,70524\n71586,10\n71586,1265\n71586,1266\n71587,70524\n71588,355\n71589,70524\n71590,314\n71591,70524\n71592,70524\n71593,70524\n71594,70524\n71595,70524\n71596,337\n71597,586\n71598,70524\n71599,178\n71600,93\n71600,94\n71601,3960\n71602,346\n71603,70524\n71604,2697\n71605,70524\n71606,70524\n71607,71608\n71609,269\n71611,70524\n71612,346\n71613,70524\n71614,70524\n71615,1801\n71616,70524\n71617,1179\n71618,70524\n71619,70524\n71620,2421\n71621,70524\n71622,435\n71622,500\n71623,70524\n71624,70524\n71625,1836\n71626,209\n71627,70524\n71628,579\n71629,70524\n71630,34\n71630,35\n71631,79\n71631,1707\n71633,70524\n71634,70524\n71635,779\n71636,70524\n71637,70524\n71638,10\n71638,772\n71638,1188\n71639,70524\n71640,298\n71641,485\n71642,70524\n71643,718\n71644,433\n71644,1531\n71645,70524\n71646,1140\n71646,5547\n71648,347\n71648,563\n71648,2367\n71649,65\n71649,868\n71650,104\n71651,3960\n71652,70524\n71653,628\n71654,70524\n71655,34\n71655,1776\n71655,4193\n71656,70524\n71658,192\n71659,70524\n71660,604\n71661,657\n71662,146\n71662,344\n71662,2699\n71662,106502\n71663,2995\n71665,515\n71666,70524\n71667,70524\n71668,217\n71669,72\n71670,70524\n71672,71673\n71674,70524\n71675,63\n71675,79\n71675,202\n71675,203\n71675,233\n71675,247\n71675,397\n71675,473\n71675,491\n71675,505\n71675,868\n71675,1590\n71675,1663\n71675,1803\n71675,2617\n71675,2646\n71675,5726\n71675,31977\n71676,2574\n71677,70524\n71678,818\n71679,72\n71680,932\n71681,70524\n71682,192\n71683,1659\n71684,1179\n71685,298\n71686,485\n71687,1096\n71688,775\n71689,70524\n71691,1707\n71692,70524\n71693,1265\n71693,1266\n71694,68069\n71695,1983\n71696,1531\n71697,779\n71697,818\n71697,1010\n71698,298\n71699,485\n71700,99\n71701,70524\n71702,70524\n71703,240\n71705,861\n71706,392\n71707,8270\n71708,240\n71708,372\n71708,1082\n71708,1085\n71708,1580\n71708,1807\n71708,2812\n71708,4222\n71708,212692\n71709,1653\n71710,2812\n71712,186\n71713,70524\n71714,30\n71715,298\n71716,485\n71717,30\n71718,323\n71719,70524\n71720,298\n71721,485\n71722,70524\n71723,298\n71724,485\n71726,1033\n71727,1749\n71728,338\n71729,1515\n71730,1858\n71731,1860\n71732,21944\n71733,70524\n71734,79\n71734,1707\n71735,70524\n71737,516\n71738,298\n71739,485\n71740,70524\n71741,50\n71741,79\n71741,147\n71741,158\n71741,178\n71741,192\n71741,285\n71741,406\n71741,620\n71741,622\n71741,779\n71741,1531\n71741,2931\n71742,1276\n71742,2626\n71743,298\n71744,485\n71746,56\n71747,1240\n71749,422\n71750,1140\n71750,3474\n71750,5547\n71751,422\n71752,240\n71753,422\n71754,422\n71755,422\n71756,422\n71758,422\n71759,422\n71760,422\n71761,171\n71761,330\n71761,1608\n71762,83\n71763,70524\n71764,1140\n71764,3474\n71764,5547\n71765,1\n71766,298\n71767,485\n71768,70524\n71769,70524\n71770,135\n71770,138\n71770,211\n71770,304\n71770,795\n71770,1001\n71770,1181\n71770,1305\n71770,1844\n71770,2105\n71770,2867\n71770,2868\n71770,3094\n71770,5625\n71770,8442\n71770,9294\n71770,16906\n71770,18256\n71770,27715\n71770,31802\n71770,38429\n71770,38875\n71770,48119\n71770,48716\n71770,54410\n71770,57182\n71770,64687\n71770,71770\n71770,72684\n71770,99223\n71770,103575\n71770,106504\n71770,114211\n71770,135821\n71770,155460\n71770,161915\n71770,165041\n71770,172265\n71770,178478\n71770,185413\n71770,189378\n71770,189889\n71770,190471\n71770,192082\n71770,192085\n71770,217552\n71770,218584\n71770,221060\n71770,221061\n71770,223945\n71770,224907\n71770,225578\n71770,227327\n71770,232125\n71770,232177\n71770,232910\n71770,232919\n71770,232951\n71770,233981\n71770,241103\n71770,241749\n71770,245870\n71770,256392\n71771,70524\n71772,2146\n71773,779\n71774,417\n71775,6955\n71776,70524\n71777,136\n71777,137\n71778,70524\n71779,209\n71780,298\n71781,485\n71782,206\n71783,71784\n71785,70524\n71786,41\n71786,301\n71786,1177\n71787,202\n71787,203\n71788,267\n71789,557\n71790,70524\n71791,298\n71792,485\n71794,70524\n71795,273\n71796,818\n71797,206\n71798,140\n71799,30\n71800,1298\n71801,151\n71801,178\n71801,2989\n71801,2991\n71802,106\n71804,70524\n71805,298\n71806,485\n71807,206\n71807,907\n71807,1241\n71808,70524\n71810,70524\n71811,581\n71812,70524\n71813,70524\n71814,70524\n71815,1983\n71816,2146\n71817,4078\n71818,70524\n71819,1807\n71821,726\n71822,3260\n71823,3069\n71824,1639\n71825,104\n71826,58\n71827,46\n71828,298\n71829,485\n71830,158\n71830,392\n71830,433\n71830,779\n71830,1836\n71830,2292\n71831,671\n71832,167\n71833,50\n71834,158\n71835,147\n71835,206\n71835,1458\n71836,3623\n71837,1220\n71837,1222\n71838,30\n71839,1707\n71840,70524\n71841,298\n71842,1749\n71842,2605\n71843,493\n71844,32475\n71845,158\n71845,206\n71845,1801\n71845,55849\n71845,118336\n71846,1983\n71847,72\n71848,70524\n71849,3474\n71850,70524\n71852,2116\n71853,30\n71854,70524\n71855,1140\n71855,5547\n71856,872\n71857,134\n71858,392\n71859,58\n71860,46\n71861,292\n71862,104\n71863,2574\n71865,7124\n71866,2697\n71867,349\n71867,5540\n71868,1837\n71869,417\n71870,1983\n71871,393\n71873,41\n71873,406\n71874,44\n71875,1619\n71876,151\n71877,1634\n71878,323\n71879,2979\n71880,79\n71880,718\n71880,760\n71881,1983\n71882,2674\n71883,1977\n71883,1978\n71885,24505\n71886,2590\n71887,422\n71888,697\n71889,8270\n71890,3623\n71891,477\n71892,920\n71893,104\n71893,557\n71893,953\n71893,954\n71893,1368\n71893,5405\n71894,71895\n71896,188\n71897,182\n71898,1639\n71899,222\n71900,14556\n71902,63\n71902,620\n71903,7757\n71904,338\n71905,557\n71906,477\n71907,907\n71908,34\n71908,1718\n71910,333\n71910,346\n71910,366\n71910,1247\n71911,333\n71912,406\n71913,1608\n71914,356\n71914,455\n71914,852\n71914,5591\n71915,1140\n71915,5547\n71916,1608\n71917,779\n71918,247\n71918,301\n71918,302\n71919,2116\n71920,1001\n71922,79\n71922,338\n71922,1118\n71923,1983\n71924,483\n71925,2146\n71926,106\n71927,50\n71928,515\n71929,640\n71930,516\n71931,206\n71932,71933\n71934,273\n71934,1544\n71935,83\n71935,206\n71935,586\n71935,718\n71935,1888\n71935,8675\n71935,14458\n71936,1722\n71936,2697\n71937,392\n71937,14556\n71938,10318\n71939,406\n71940,255\n71941,640\n71942,652\n71943,22580\n71944,527\n71944,743\n71944,95152\n71945,273\n71946,1655\n71947,8270\n71948,71949\n71950,372\n71951,298\n71952,485\n71953,4549\n71954,843\n71955,298\n71956,485\n71957,5547\n71958,467\n71959,312\n71959,1010\n71960,227\n71960,843\n71962,65\n71962,868\n71963,151\n71964,298\n71965,298\n71966,485\n71967,71949\n71968,663\n71968,664\n71970,58\n71971,46\n71972,1400\n71973,467\n71974,30\n71974,41\n71975,1556\n71976,1388\n71977,489\n71977,577\n71977,1400\n71978,868\n71979,3041\n71980,37\n71981,259\n71982,5547\n71983,602\n71984,726\n71985,252\n71985,41170\n71989,5718\n71990,1805\n71991,272\n71991,328\n71991,994\n71993,714\n71994,346\n71995,801\n71995,1140\n71995,2443\n71995,5547\n71996,349\n71996,697\n71996,3260\n71997,907\n71998,336\n72000,192\n72000,333\n72000,74845\n72000,100915\n72000,101912\n72000,108302\n72002,1983\n72003,1983\n72004,1227\n72004,1229\n72005,1983\n72006,72007\n72008,5547\n72009,10\n72010,346\n72012,77\n72013,1891\n72014,50\n72015,72\n72016,147\n72016,422\n72016,907\n72016,2191\n72016,4545\n72016,139010\n72018,120\n72018,261\n72018,272\n72018,310\n72018,563\n72018,862\n72018,907\n72018,1368\n72018,1462\n72018,1466\n72018,3328\n72018,8537\n72018,9015\n72019,312\n72020,697\n72022,151\n72022,309\n72022,310\n72024,346\n72025,1379\n72026,151\n72027,247\n72028,240\n72029,1323\n72030,102\n72031,1326\n72032,408\n72033,48\n72034,1143\n72035,147\n72035,178\n72035,447\n72035,1531\n72035,1541\n72036,285\n72036,2620\n72037,72038\n72039,2480\n72040,338\n72041,338\n72042,217\n72043,252\n72043,318\n72043,41170\n72044,433\n72045,2351\n72046,861\n72047,83\n72047,217\n72049,406\n72050,247\n72051,338\n72052,72\n72053,907\n72054,20\n72055,3161\n72056,147\n72056,80266\n72057,44\n72058,346\n72059,72\n72060,72061\n72062,392\n72063,346\n72064,83\n72065,302\n72066,346\n72068,493\n72068,772\n72068,949\n72068,1715\n72068,1927\n72068,1985\n72069,48\n72070,809\n72070,22293\n72071,406\n72072,32475\n72073,1133\n72074,438\n72075,3\n72075,34\n72075,35\n72075,106\n72075,158\n72075,178\n72075,192\n72075,202\n72075,203\n72075,217\n72075,251\n72075,252\n72075,346\n72075,435\n72075,586\n72075,622\n72075,640\n72075,663\n72075,664\n72075,1181\n72075,1220\n72075,1222\n72075,1243\n72075,1294\n72075,1370\n72075,1590\n72075,1635\n72075,2567\n72075,2931\n72075,3161\n72075,4192\n72075,4193\n72075,5874\n72075,5976\n72075,6119\n72075,8598\n72075,8771\n72075,8811\n72075,8822\n72075,8907\n72075,41170\n72076,9560\n72078,30\n72079,433\n72080,34\n72080,35\n72081,1287\n72082,9029\n72083,217\n72083,663\n72083,664\n72083,779\n72083,809\n72083,920\n72083,1033\n72083,1181\n72083,1381\n72083,1414\n72083,2073\n72083,2889\n72084,171\n72085,1983\n72087,111\n72087,595\n72087,1572\n72087,3538\n72088,5440\n72089,8854\n72090,72091\n72092,147\n72093,10\n72094,1634\n72095,346\n72096,83\n72097,2244\n72098,1458\n72099,184\n72100,120\n72100,577\n72101,192\n72102,314\n72103,557\n72104,557\n72105,422\n72106,56\n72107,1634\n72108,850\n72109,72110\n72111,106\n72112,338\n72113,346\n72114,10\n72115,493\n72116,146\n72116,147\n72116,957\n72116,1707\n72116,1815\n72116,92476\n72117,433\n72118,72\n72119,2116\n72121,30\n72122,615\n72122,1782\n72123,15\n72123,83\n72123,206\n72123,1634\n72123,4252\n72124,72125\n72126,72125\n72127,30\n72128,2146\n72129,422\n72130,56\n72131,850\n72132,175\n72132,2372\n72132,31977\n72133,577\n72134,557\n72135,452\n72136,8270\n72137,346\n72138,850\n72139,1068\n72140,455\n72141,358\n72142,932\n72142,1149\n72142,80261\n72142,94137\n72142,98214\n72142,170446\n72142,235494\n72142,239497\n72142,246526\n72143,477\n72144,2590\n72145,30\n72146,861\n72147,3538\n72148,72149\n72150,393\n72151,45960\n72152,8868\n72153,171\n72154,72155\n72156,338\n72157,21487\n72157,22880\n72158,1133\n72159,207\n72160,298\n72161,485\n72162,406\n72162,779\n72162,1181\n72163,292\n72164,323\n72165,298\n72166,485\n72167,1881\n72168,330\n72168,1235\n72169,247\n72170,872\n72171,1429\n72172,6726\n72173,83\n72173,358\n72174,72175\n72176,8675\n72177,72178\n72179,18726\n72180,14366\n72181,346\n72182,392\n72183,668\n72185,660\n72186,8270\n72187,70524\n72188,422\n72189,56\n72190,298\n72191,485\n72192,59870\n72193,70524\n72194,72195\n72196,1381\n72197,192\n72198,1608\n72199,70524\n72200,422\n72201,56\n72202,22\n72202,58\n72202,192\n72202,859\n72202,1388\n72202,13661\n72203,70524\n72204,779\n72205,70524\n72206,1608\n72207,70524\n72208,70524\n72209,473\n72210,2607\n72211,393\n72212,5405\n72213,70524\n72214,72215\n72214,108864\n72214,112702\n72214,126417\n72216,1274\n72217,70524\n72218,70524\n72219,70524\n72220,72221\n72222,17228\n72223,30\n72224,70524\n72225,323\n72226,94\n72226,72227\n72228,957\n72229,70524\n72230,70524\n72231,70524\n72232,30\n72233,1782\n72234,58\n72235,46\n72236,1143\n72237,70524\n72238,70524\n72239,70524\n72240,70524\n72241,70524\n72242,70524\n72243,70524\n72244,70524\n72245,30\n72246,70524\n72247,70524\n72248,346\n72249,70524\n72250,862\n72250,1085\n72250,2590\n72252,70524\n72253,70524\n72254,70524\n72255,687\n72256,79\n72257,70524\n72258,1983\n72259,70524\n72260,70524\n72261,2367\n72262,30\n72263,9010\n72264,30\n72265,70524\n72266,70524\n72267,72268\n72269,70524\n72270,72271\n72272,70524\n72273,72274\n72275,1102\n72276,70524\n72277,70524\n72278,652\n72279,72280\n72281,690\n72282,328\n72283,87\n72283,392\n72283,1151\n72284,30\n72285,70524\n72286,70524\n72287,118\n72287,4597\n72288,20\n72289,8854\n72290,70524\n72291,70524\n72292,70524\n72293,70524\n72294,1140\n72294,5547\n72295,70524\n72296,70524\n72297,70524\n72298,30\n72299,70524\n72300,70524\n72301,70524\n72302,1181\n72303,70524\n72304,70524\n72305,70524\n72306,70524\n72307,346\n72308,72309\n72310,304\n72311,2929\n72312,8270\n72313,1363\n72314,70524\n72315,70524\n72316,818\n72317,70524\n72318,70524\n72319,70524\n72320,70524\n72321,1796\n72322,1541\n72323,704\n72324,70524\n72325,70524\n72326,1425\n72327,70524\n72328,70524\n72329,70524\n72330,70524\n72331,70524\n72332,805\n72333,70524\n72334,70524\n72335,70524\n72336,70524\n72337,70524\n72338,70524\n72339,1452\n72340,34\n72340,35\n72341,70524\n72342,55479\n72343,72344\n72345,1381\n72346,70524\n72347,70524\n72348,72349\n72350,70524\n72351,5547\n72352,72353\n72354,222\n72354,278\n72354,349\n72354,389\n72354,1871\n72355,302\n72355,2116\n72356,70524\n72357,8991\n72358,264\n72359,387\n72360,70524\n72361,3804\n72362,70524\n72363,233\n72364,5547\n72365,805\n72366,850\n72367,70524\n72368,70524\n72369,376\n72370,1238\n72371,72372\n72371,130163\n72373,70524\n72374,70524\n72375,70524\n72376,2116\n72377,70524\n72378,21487\n72378,22880\n72379,70524\n72380,70524\n72381,2116\n72382,70524\n72383,70524\n72384,23011\n72385,70524\n72386,479\n72387,70524\n72388,70524\n72389,16019\n72390,355\n72391,70524\n72392,70524\n72393,298\n72394,485\n72395,83\n72395,852\n72395,5591\n72396,5547\n72397,70524\n72398,2116\n72399,70524\n72400,366\n72401,366\n72402,571\n72402,868\n72403,2116\n72404,70524\n72405,70524\n72406,2116\n72407,70524\n72408,366\n72409,934\n72410,366\n72411,366\n72412,10\n72413,366\n72414,4276\n72415,647\n72416,140\n72416,1462\n72417,70524\n72418,298\n72419,485\n72420,70524\n72421,70524\n72422,2929\n72423,23701\n72424,70524\n72425,56\n72425,704\n72425,714\n72425,932\n72426,5547\n72427,70524\n72428,192\n72429,2116\n72430,70524\n72431,137\n72432,298\n72432,346\n72432,615\n72432,1243\n72432,7429\n72433,70524\n72434,663\n72434,664\n72435,70524\n72437,1458\n72438,70524\n72439,682\n72439,1512\n72439,5992\n72441,1983\n72442,70524\n72444,70524\n72445,2116\n72446,70524\n72447,70524\n72448,70524\n72449,70524\n72450,70524\n72451,70524\n72452,70524\n72453,70524\n72454,70524\n72455,70524\n72456,70524\n72457,70524\n72458,70524\n72459,1\n72460,70524\n72461,70524\n72462,298\n72463,485\n72465,70524\n72466,673\n72467,809\n72468,1983\n72469,70524\n72470,3079\n72471,1983\n72472,277\n72472,8992\n72474,70524\n72475,70524\n72476,1983\n72477,70524\n72478,70524\n72479,733\n72480,30\n72481,70524\n72482,843\n72483,70524\n72484,872\n72485,1891\n72486,298\n72487,485\n72488,571\n72488,868\n72489,280\n72489,1707\n72489,17245\n72490,1983\n72491,70524\n72492,663\n72492,664\n72493,146\n72494,70524\n72496,70524\n72497,70524\n72498,1381\n72499,7117\n72500,2048\n72501,70524\n72502,301\n72503,70524\n72505,779\n72506,5547\n72507,70524\n72508,422\n72509,70524\n72510,422\n72511,422\n72513,70524\n72514,70524\n72515,1515\n72516,70524\n72517,70524\n72518,70524\n72519,3999\n72520,70524\n72521,298\n72522,485\n72523,10\n72523,1388\n72523,1509\n72523,1836\n72523,2617\n72523,5192\n72524,1235\n72524,1335\n72525,283\n72526,457\n72526,557\n72526,589\n72526,704\n72526,1402\n72526,1417\n72526,1458\n72526,5213\n72527,2416\n72527,2417\n72528,422\n72529,467\n72529,920\n72530,6424\n72531,70524\n72532,422\n72533,422\n72534,70524\n72535,1181\n72536,422\n72537,422\n72538,8180\n72539,20813\n72540,479\n72541,7358\n72541,7363\n72542,1858\n72543,1860\n72544,70524\n72545,66\n72546,1860\n72547,515\n72548,1293\n72549,3612\n72550,72551\n72552,298\n72553,485\n72554,137\n72556,70524\n72557,298\n72558,3\n72559,485\n72560,70524\n72561,97\n72562,48\n72562,254\n72562,994\n72565,2697\n72566,70524\n72567,5440\n72568,70524\n72569,859\n72569,1368\n72570,278\n72571,70524\n72572,2319\n72573,676\n72574,1860\n72575,1370\n72576,248\n72577,273\n72578,83\n72579,7757\n72580,1849\n72581,30\n72583,48\n72584,72585\n72586,184\n72586,264\n72586,1955\n72587,1983\n72588,5547\n72589,137\n72589,720\n72589,1453\n72590,4903\n72590,13136\n72591,70524\n72593,1860\n72594,467\n72594,868\n72595,222\n72597,272\n72598,516\n72598,2775\n72599,8598\n72600,581\n72601,2735\n72602,70524\n72603,602\n72604,83\n72605,126\n72606,298\n72607,485\n72608,70524\n72609,647\n72610,344\n72611,1118\n72612,1556\n72613,252\n72613,41170\n72614,50\n72615,1247\n72616,2146\n72617,450\n72618,872\n72619,70524\n72620,48\n72621,167\n72622,287\n72622,314\n72622,809\n72623,403\n72624,1359\n72627,178\n72628,1707\n72629,72630\n72631,45023\n72632,2674\n72632,16153\n72633,477\n72634,55849\n72635,72636\n72637,827\n72639,111\n72639,134\n72639,240\n72639,372\n72639,631\n72639,805\n72639,1001\n72639,1368\n72639,1955\n72639,1962\n72639,2286\n72640,70524\n72641,2574\n72642,70524\n72643,17334\n72644,251\n72644,465\n72644,516\n72645,3413\n72646,467\n72647,206\n72648,467\n72648,868\n72649,298\n72650,485\n72651,1858\n72652,1860\n72653,647\n72654,344\n72655,298\n72656,485\n72657,372\n72657,1368\n72657,1962\n72657,2286\n72658,58\n72659,46\n72660,70524\n72661,991\n72662,158\n72663,827\n72663,1370\n72664,733\n72665,149\n72666,1776\n72667,5366\n72668,58\n72669,46\n72670,79\n72670,1673\n72671,6059\n72672,433\n72673,163\n72673,1240\n72673,1241\n72673,2116\n72673,3769\n72674,65\n72675,2205\n72675,2206\n72676,6303\n72677,1085\n72677,75912\n72678,406\n72679,333\n72680,424\n72682,83\n72683,200\n72684,111\n72684,805\n72684,1462\n72684,8537\n72685,58\n72686,46\n72687,70524\n72688,1977\n72688,1978\n72689,442\n72689,2367\n72690,657\n72692,2334\n72693,28072\n72694,2626\n72695,72696\n72698,422\n72699,56\n72700,175\n72701,439\n72702,1860\n72703,302\n72704,70524\n72705,775\n72706,581\n72707,420\n72708,1432\n72708,21944\n72709,1124\n72710,2048\n72711,151\n72712,1769\n72713,18298\n72714,17334\n72715,66\n72715,158\n72715,163\n72715,264\n72715,269\n72715,278\n72715,309\n72715,310\n72715,435\n72715,628\n72715,752\n72715,784\n72715,1010\n72715,1326\n72715,1374\n72715,1531\n72715,2979\n72715,4823\n72715,5265\n72716,72717\n72718,631\n72720,604\n72720,1293\n72722,6424\n72723,2744\n72724,868\n72725,1707\n72726,563\n72726,615\n72726,1241\n72726,3422\n72726,5662\n72729,72730\n72731,171\n72732,1454\n72734,158\n72735,44\n72736,147\n72736,158\n72737,301\n72739,247\n72740,72741\n72742,704\n72742,1212\n72742,1282\n72744,50\n72744,99\n72745,392\n72746,72747\n72749,34\n72749,35\n72751,417\n72752,811\n72753,58\n72754,46\n72756,72757\n72758,2607\n72759,932\n72760,2116\n72761,48\n72762,171\n72763,832\n72764,666\n72764,750\n72764,973\n72764,1167\n72764,1284\n72764,1298\n72764,2191\n72764,4185\n72764,4359\n72764,7349\n72764,30328\n72764,61307\n72764,63038\n72764,72764\n72764,87994\n72764,95380\n72764,96685\n72764,105429\n72764,107162\n72764,147958\n72764,156293\n72764,170883\n72764,189264\n72764,190521\n72764,190525\n72764,227286\n72764,237320\n72764,244016\n72765,138\n72766,1140\n72767,477\n72768,850\n72769,24505\n72770,72771\n72770,106422\n72772,195\n72773,483\n72774,433\n72776,868\n72777,158\n72778,431\n72778,188791\n72779,1556\n72780,6051\n72781,422\n72782,56\n72783,68\n72785,287\n72786,872\n72787,433\n72788,868\n72789,222\n72790,48\n72791,48\n72792,48\n72793,227\n72794,118\n72794,4597\n72795,247\n72795,2867\n72795,22880\n72796,134\n72797,310\n72797,805\n72798,298\n72799,485\n72801,392\n72802,1140\n72803,137\n72804,292\n72805,6750\n72806,171\n72807,48\n72808,918\n72809,1807\n72810,72811\n72812,48\n72813,433\n72814,298\n72815,366\n72816,287\n72816,809\n72816,19010\n72817,195\n72817,1639\n72818,2944\n72820,1467\n72821,41\n72822,687\n72822,861\n72822,893\n72823,1801\n72824,968\n72825,149\n72825,336\n72825,406\n72826,344\n72827,72828\n72829,70524\n72830,70524\n72831,72832\n72833,557\n72834,22\n72835,811\n72836,158\n72836,406\n72837,707\n72838,130\n72838,1551\n72839,151\n72841,72842\n72843,1860\n72844,3612\n72845,595\n72846,2274\n72847,392\n72848,4760\n72849,6059\n72850,5658\n72851,4252\n72852,623\n72853,697\n72854,6955\n72856,1381\n72857,1284\n72858,264\n72858,1289\n72859,631\n72860,70524\n72861,8822\n72862,217\n72863,779\n72864,1247\n72865,136\n72865,563\n72866,83\n72867,483\n72868,68\n72868,20359\n72868,72869\n72870,1323\n72871,102\n72872,1326\n72873,408\n72874,147\n72874,158\n72874,1458\n72874,1803\n72874,56006\n72874,58612\n72874,81185\n72874,89035\n72874,102579\n72874,102580\n72874,102581\n72874,102582\n72874,102583\n72874,102595\n72874,102602\n72874,102635\n72874,102680\n72874,102684\n72874,102715\n72875,949\n72876,1531\n72877,34\n72877,35\n72877,313\n72877,1313\n72877,1718\n72877,2224\n72877,2646\n72877,5326\n72878,2224\n72879,376\n72880,72881\n72882,34\n72882,35\n72883,1467\n72884,147\n72885,247\n72886,298\n72889,240\n72889,818\n72890,2506\n72891,611\n72892,58\n72892,344\n72892,801\n72892,2443\n72892,5547\n72893,72\n72894,6682\n72895,79\n72896,56\n72896,422\n72896,30331\n72896,60576\n72897,8270\n72898,56\n72898,422\n72898,30331\n72898,60576\n72899,79\n72900,107\n72901,207\n72902,392\n72902,1240\n72902,3260\n72903,644\n72904,872\n72905,1608\n72906,1429\n72907,111\n72907,200\n72907,240\n72907,805\n72907,1462\n72907,1962\n72907,8537\n72908,83\n72909,483\n72910,10\n72910,714\n72910,1612\n72910,2146\n72910,6682\n72911,668\n72913,376\n72914,885\n72915,301\n72915,968\n72916,313\n72916,385\n72916,660\n72916,949\n72916,2779\n72916,4637\n72917,225\n72918,459\n72919,1119\n72920,134\n72921,1775\n72922,200\n72923,72924\n72925,364\n72926,1140\n72926,5547\n72927,140\n72927,264\n72928,2979\n72929,83\n72931,557\n72932,779\n72933,557\n72934,346\n72935,1133\n72936,79\n72937,219\n72938,1551\n72939,5547\n72940,5547\n72941,1143\n72942,3003\n72943,1127\n72944,346\n72945,5265\n72946,72947\n72946,112745\n72946,228118\n72948,949\n72950,192\n72951,207\n72951,358\n72951,366\n72951,417\n72951,1052\n72951,1252\n72951,1253\n72951,1319\n72951,1332\n72951,1571\n72951,1634\n72951,2424\n72951,2620\n72951,2867\n72951,2868\n72952,577\n72953,1235\n72953,1335\n72954,809\n72955,2572\n72956,48505\n72957,70524\n72958,336\n72958,422\n72959,137\n72960,1285\n72961,1201\n72962,1858\n72963,1860\n72964,1072\n72965,298\n72966,485\n72967,338\n72968,30\n72969,1608\n72970,72971\n72972,298\n72973,485\n72974,3895\n72975,450\n72975,4193\n72976,4594\n72977,8788\n72978,1608\n72979,72980\n72981,1359\n72982,195\n72983,72\n72984,72985\n72986,1983\n72987,72988\n72989,743\n72990,1285\n72991,298\n72992,485\n72993,477\n72994,557\n72996,72997\n72998,358\n72999,18726\n73000,163\n73001,32475\n73002,8270\n73003,2775\n73004,447\n73005,493\n73007,72\n73008,811\n73008,1465\n73009,1551\n73010,393\n73011,452\n73012,111\n73013,73014\n73015,1140\n73015,2443\n73016,149\n73016,3194\n73017,4597\n73018,73019\n73020,3297\n73021,73022\n73021,106675\n73023,366\n73024,70524\n73025,366\n73026,366\n73027,366\n73028,73029\n73030,366\n73031,1140\n73031,5547\n73032,70524\n73033,70524\n73034,366\n73035,579\n73036,70524\n73037,70524\n73038,2116\n73039,70524\n73040,73041\n73042,70524\n73043,118\n73044,70524\n73045,70524\n73046,676\n73047,907\n73048,70524\n73049,2073\n73050,310\n73051,70524\n73052,1639\n73053,70524\n73054,577\n73055,10\n73056,805\n73057,872\n73058,422\n73059,56\n73061,70524\n73062,5547\n73063,70524\n73064,1634\n73065,422\n73066,56\n73067,70524\n73068,70524\n73069,2995\n73070,70524\n73071,70524\n73072,70524\n73073,70524\n73075,1140\n73075,5547\n73076,70524\n73077,1179\n73078,23010\n73079,70524\n73080,70524\n73081,70524\n73082,70524\n73083,70524\n73084,2590\n73085,70524\n73086,2146\n73087,70524\n73088,70524\n73089,50\n73090,7358\n73090,7363\n73091,151\n73092,70524\n73093,70524\n73094,70524\n73095,70524\n73096,70524\n73097,70524\n73098,422\n73099,56\n73100,8991\n73101,5375\n73102,70524\n73103,70524\n73104,70524\n73105,5547\n73106,70524\n73107,70524\n73108,70524\n73109,3161\n73110,4276\n73111,4453\n73112,393\n73113,424\n73116,70524\n73118,171\n73119,70524\n73120,493\n73121,473\n73121,668\n73121,712\n73121,1313\n73122,73123\n73122,136215\n73124,70524\n73125,70524\n73126,6068\n73127,70524\n73128,366\n73129,366\n73130,366\n73131,366\n73132,366\n73133,10\n73134,233\n73135,644\n73136,70524\n73137,70524\n73138,298\n73139,485\n73140,1285\n73141,1133\n73142,7363\n73142,8270\n73143,493\n73143,1085\n73144,364\n73144,431\n73145,2146\n73147,163\n73147,302\n73147,2116\n73148,70524\n73149,323\n73150,73151\n73152,298\n73153,485\n73154,355\n73155,707\n73156,70524\n73157,70524\n73158,70524\n73159,2989\n73159,2991\n73160,515\n73162,5405\n73162,189303\n73163,298\n73164,485\n73165,44\n73166,200\n73167,70524\n73168,70524\n73169,479\n73170,70524\n73171,70524\n73172,195\n73172,332\n73172,6837\n73172,27217\n73173,2116\n73174,2116\n73175,301\n73176,70524\n73177,3695\n73178,298\n73179,485\n73180,309\n73180,310\n73180,1509\n73181,1893\n73182,1140\n73182,5547\n73183,298\n73184,485\n73185,10\n73185,113156\n73187,973\n73188,1983\n73189,1858\n73190,1860\n73191,1782\n73192,2506\n73193,1803\n73194,1805\n73194,3003\n73195,255\n73196,8788\n73198,389\n73199,298\n73200,485\n73201,192\n73202,1140\n73202,5547\n73203,73203\n73204,1801\n73205,3209\n73206,21944\n73207,422\n73207,1983\n73208,640\n73210,3161\n73211,1659\n73212,73213\n73214,70524\n73217,73218\n73219,1227\n73219,1229\n73220,1010\n73221,779\n73222,248\n73223,6068\n73224,70524\n73225,393\n73226,70524\n73227,393\n73228,8822\n73229,1579\n73230,2995\n73231,372\n73231,685\n73231,1285\n73231,1776\n73231,118336\n73232,158\n73232,171\n73233,3260\n73234,70524\n73235,272\n73236,310\n73237,301\n73237,1849\n73238,70524\n73239,1265\n73239,1266\n73240,920\n73242,70524\n73243,70524\n73244,360\n73245,70524\n73246,366\n73247,70524\n73248,589\n73248,1085\n73248,6068\n73249,217\n73250,240\n73251,422\n73252,422\n73253,70524\n73254,422\n73255,422\n73256,19443\n73257,70524\n73258,70524\n73259,278\n73259,852\n73260,818\n73261,68\n73262,304\n73262,586\n73262,694\n73262,843\n73263,5547\n73264,240\n73264,1181\n73265,356\n73265,852\n73266,536\n73267,422\n73269,644\n73270,518\n73271,422\n73272,422\n73273,422\n73274,422\n73275,58\n73276,46\n73277,83\n73278,264\n73279,657\n73279,44725\n73282,20\n73283,70524\n73284,1858\n73285,1860\n73286,48\n73287,217\n73287,240\n73287,3623\n73288,1619\n73288,205627\n73289,1458\n73290,972\n73290,973\n73291,5547\n73292,5265\n73294,346\n73295,70524\n73296,581\n73298,592\n73299,1247\n73300,310\n73300,805\n73301,346\n73302,733\n73303,1858\n73304,1860\n73305,58\n73306,46\n73307,589\n73308,749\n73309,158\n73309,1515\n73311,749\n73312,364\n73313,68\n73313,1844\n73314,872\n73315,749\n73316,676\n73317,1893\n73318,171\n73319,81\n73319,439\n73319,588\n73319,590\n73319,636\n73319,841\n73319,1033\n73319,2674\n73320,301\n73320,968\n73321,477\n73322,1282\n73323,1425\n73324,2146\n73325,1634\n73326,5440\n73328,907\n73329,70524\n73330,1227\n73330,1229\n73330,21944\n73331,477\n73332,920\n73333,972\n73334,431\n73334,631\n73334,1411\n73335,118\n73335,4597\n73337,107\n73337,346\n73337,1888\n73338,2178\n73338,4545\n73339,48\n73340,48\n73341,346\n73342,167\n73342,1300\n73342,2083\n73343,1983\n73344,73345\n73344,85322\n73344,90366\n73344,112873\n73344,113052\n73344,120488\n73346,809\n73347,5547\n73349,48\n73350,690\n73351,301\n73351,1522\n73351,2083\n73352,70524\n73353,1381\n73354,48\n73355,86\n73355,167\n73355,968\n73355,1293\n73355,1359\n73355,1837\n73355,3207\n73355,3422\n73355,5301\n73355,5662\n73356,48\n73357,298\n73358,485\n73359,358\n73359,611\n73362,163\n73363,240\n73363,818\n73364,333\n73364,992\n73365,1559\n73366,39247\n73367,450\n73369,298\n73370,485\n73371,298\n73372,485\n73373,3161\n73374,1983\n73375,3003\n73376,1220\n73376,1222\n73376,41170\n73377,477\n73378,167\n73379,2209\n73381,1353\n73382,7\n73382,309\n73382,310\n73383,5547\n73384,1400\n73385,2620\n73387,240\n73388,872\n73388,1453\n73389,70524\n73390,55849\n73391,859\n73392,1118\n73393,1983\n73394,48\n73395,192\n73396,1289\n73397,147\n73397,567\n73397,1227\n73397,1229\n73397,1572\n73397,3182\n73398,875\n73399,422\n73399,602\n73399,1204\n73401,344\n73401,5547\n73402,1977\n73402,1978\n73403,1707\n73404,1068\n73405,1968\n73406,714\n73407,602\n73408,2979\n73409,58\n73409,1140\n73409,5547\n73410,298\n73411,485\n73412,4355\n73413,34\n73413,1776\n73413,4193\n73414,760\n73415,30\n73416,30\n73417,251\n73417,252\n73417,516\n73417,1220\n73417,1222\n73417,2567\n73417,41170\n73418,1007\n73419,83\n73420,1983\n73421,22\n73421,873\n73422,1803\n73423,302\n73424,346\n73425,1140\n73425,5547\n73426,30\n73427,1033\n73428,21944\n73429,70524\n73430,298\n73431,485\n73432,433\n73433,5405\n73434,5547\n73435,7358\n73435,7363\n73436,73437\n73438,1140\n73438,5547\n73439,27621\n73439,27623\n73440,195\n73441,225\n73441,248\n73442,1370\n73443,5547\n73444,1058\n73445,22\n73446,1983\n73447,1240\n73448,392\n73449,217\n73450,240\n73451,455\n73451,2424\n73454,1274\n73455,585\n73456,1140\n73456,5547\n73457,1007\n73457,30331\n73458,4691\n73458,114600\n73459,779\n73460,467\n73461,1955\n73462,5547\n73463,1983\n73464,30\n73465,48\n73466,315\n73467,1858\n73468,1860\n73469,3507\n73470,298\n73471,58\n73472,46\n73473,1849\n73474,1983\n73475,1844\n73476,22\n73477,1844\n73478,1983\n73479,1010\n73481,872\n73482,298\n73483,485\n73484,30\n73485,3069\n73486,30\n73487,2979\n73488,1983\n73489,346\n73490,203\n73490,2931\n73491,1556\n73492,980\n73493,298\n73494,485\n73495,346\n73496,5212\n73497,5547\n73498,298\n73499,485\n73500,1368\n73501,1983\n73502,392\n73503,151\n73504,50\n73504,111\n73504,158\n73504,333\n73504,538\n73504,779\n73504,1181\n73504,1265\n73504,1266\n73504,2931\n73504,3872\n73504,8270\n73505,187\n73506,1983\n73507,500\n73509,167\n73509,186\n73509,301\n73509,379\n73509,717\n73509,968\n73509,1010\n73509,1231\n73509,1326\n73509,1370\n73509,1411\n73509,1782\n73509,1837\n73509,2557\n73509,3804\n73510,252\n73510,318\n73510,1220\n73510,1222\n73511,298\n73512,485\n73513,137\n73514,1359\n73515,158\n73516,1105\n73517,259\n73518,70524\n73519,130\n73520,4810\n73521,5547\n73522,70524\n73524,1368\n73525,1860\n73526,420\n73527,346\n73528,79\n73529,1860\n73530,3612\n73531,595\n73532,2274\n73533,392\n73534,4760\n73535,6059\n73536,5658\n73537,4252\n73538,623\n73539,697\n73540,6955\n73541,592\n73542,932\n73543,70524\n73544,298\n73545,298\n73546,485\n73547,259\n73548,298\n73549,485\n73550,801\n73550,5547\n73551,79\n73552,364\n73553,333\n73554,310\n73554,805\n73555,1634\n73556,862\n73556,1085\n73556,1474\n73556,1789\n73556,2205\n73556,33424\n73558,298\n73559,485\n73560,483\n73560,42009\n73561,22\n73561,893\n73562,1247\n73562,7124\n73562,9010\n73562,17588\n73563,717\n73564,30\n73565,8270\n73566,310\n73566,805\n73567,2574\n73568,4771\n73569,178\n73569,259\n73570,167\n73570,299\n73570,390\n73570,459\n73570,1085\n73570,1167\n73570,1284\n73570,1319\n73570,1436\n73570,1522\n73570,1616\n73570,1837\n73570,2083\n73570,2479\n73570,2979\n73570,3207\n73570,3407\n73570,4286\n73570,6712\n73570,13252\n73570,15588\n73570,29759\n73570,30253\n73570,40513\n73570,40987\n73570,43346\n73570,47153\n73570,50565\n73570,68733\n73570,73660\n73570,75912\n73570,80310\n73570,83321\n73570,85459\n73570,99759\n73570,109838\n73570,127858\n73570,130798\n73570,135145\n73570,141050\n73570,145187\n73570,157363\n73570,157375\n73570,164357\n73570,164449\n73570,164879\n73570,165005\n73570,168526\n73570,168778\n73570,170638\n73570,171204\n73570,171295\n73570,175310\n73570,176096\n73570,176645\n73570,176776\n73570,178611\n73570,178695\n73570,179041\n73570,179575\n73570,180115\n73570,180991\n73570,181021\n73570,181110\n73570,181279\n73570,181290\n73570,181835\n73570,181901\n73570,181906\n73570,181950\n73570,182002\n73570,182077\n73570,182327\n73570,182446\n73570,182508\n73570,182521\n73570,182554\n73570,182620\n73570,184948\n73570,186532\n73570,186651\n73570,187534\n73570,189876\n73570,190469\n73570,192899\n73570,192915\n73570,192952\n73570,193627\n73570,194494\n73570,194517\n73570,194603\n73570,194611\n73570,195984\n73570,203101\n73570,204098\n73570,213752\n73570,215383\n73570,216755\n73570,217335\n73570,217992\n73570,220347\n73570,221163\n73570,222421\n73570,222510\n73570,222652\n73570,224029\n73570,227233\n73570,228432\n73570,229660\n73570,231071\n73570,233956\n73570,234686\n73570,234815\n73570,235274\n73570,235944\n73570,236100\n73570,237828\n73570,238691\n73570,238778\n73570,240432\n73570,240973\n73570,241317\n73570,241878\n73570,242187\n73570,242285\n73570,242412\n73570,243639\n73570,244135\n73570,244612\n73570,244733\n73570,246033\n73570,246039\n73570,246077\n73570,246443\n73570,247178\n73570,247223\n73570,247746\n73570,247790\n73570,247974\n73570,247977\n73570,247998\n73570,248014\n73570,249179\n73570,249303\n73570,249830\n73570,249866\n73570,249885\n73570,250066\n73570,250649\n73570,250814\n73570,250926\n73570,251498\n73570,251923\n73570,253395\n73570,253397\n73570,253801\n73570,254392\n73570,254444\n73570,254565\n73570,255137\n73570,255612\n73570,257026\n73570,258373\n73570,258917\n73570,258940\n73570,259358\n73570,259554\n73570,259560\n73570,259655\n73570,260016\n73570,260929\n73570,260938\n73570,260949\n73570,262305\n73570,262313\n73570,263393\n73570,263936\n73570,263943\n73570,263952\n73571,151\n73572,83\n73573,104\n73573,289\n73573,290\n73573,298\n73573,328\n73573,704\n73573,714\n73573,1282\n73573,1402\n73573,2105\n73573,2205\n73573,2206\n73573,2286\n73573,2572\n73573,4218\n73573,33424\n73573,94134\n73574,1531\n73575,267\n73576,65\n73577,65\n73578,1240\n73579,50\n73580,147\n73580,1462\n73581,7358\n73581,7363\n73582,1235\n73582,1335\n73583,5547\n73584,1858\n73585,1860\n73586,346\n73587,273\n73588,1860\n73589,3612\n73590,595\n73591,2274\n73592,392\n73593,4760\n73594,6059\n73595,5658\n73596,4252\n73597,623\n73598,697\n73599,6955\n73600,1133\n73601,171\n73602,5906\n73603,557\n73604,626\n73605,278\n73606,137\n73607,862\n73608,192\n73608,622\n73608,631\n73608,841\n73608,1033\n73608,1181\n73608,1388\n73608,1531\n73609,5547\n73610,8719\n73611,138\n73612,865\n73613,557\n73614,137\n73615,118\n73615,4597\n73616,56\n73617,21944\n73618,160\n73619,31934\n73620,5547\n73621,333\n73622,1983\n73623,676\n73624,376\n73625,3474\n73625,5547\n73627,1858\n73628,1860\n73629,1085\n73630,338\n73630,389\n73631,77\n73632,298\n73633,485\n73634,392\n73635,5547\n73636,171\n73637,406\n73639,79\n73639,136\n73639,192\n73639,217\n73639,254\n73639,6249\n73640,30\n73641,298\n73642,485\n73643,779\n73644,809\n73645,920\n73646,346\n73647,1858\n73648,1860\n73649,623\n73650,1983\n73651,489\n73652,1983\n73653,1411\n73654,7124\n73655,1133\n73656,2048\n73657,3148\n73658,151\n73658,364\n73658,431\n73659,1775\n73660,1127\n73660,1893\n73660,2083\n73660,2626\n73660,3474\n73660,49057\n73660,73570\n73661,30\n73661,79\n73661,393\n73661,406\n73661,493\n73661,1265\n73661,1266\n73662,1608\n73663,5405\n73664,1274\n73665,83\n73666,364\n73667,312\n73667,1052\n73668,187\n73669,338\n73670,5547\n73671,5547\n73672,640\n73673,17588\n73674,83\n73675,1247\n73676,32475\n73677,338\n73678,81\n73679,392\n73680,1117\n73681,202\n73681,203\n73681,422\n73682,44\n73683,298\n73684,485\n73685,1181\n73686,447\n73687,3161\n73688,1133\n73689,305\n73689,447\n73689,538\n73689,671\n73690,424\n73691,5405\n73692,5547\n73693,34\n73693,35\n73693,44\n73693,50\n73693,79\n73693,106\n73693,147\n73693,178\n73693,192\n73693,195\n73693,202\n73693,203\n73693,215\n73693,252\n73693,261\n73693,285\n73693,289\n73693,290\n73693,301\n73693,323\n73693,332\n73693,336\n73693,337\n73693,346\n73693,406\n73693,422\n73693,435\n73693,439\n73693,447\n73693,503\n73693,516\n73693,525\n73693,538\n73693,585\n73693,586\n73693,592\n73693,640\n73693,671\n73693,694\n73693,760\n73693,779\n73693,788\n73693,862\n73693,907\n73693,934\n73693,968\n73693,1085\n73693,1175\n73693,1220\n73693,1222\n73693,1247\n73693,1326\n73693,1370\n73693,1425\n73693,1515\n73693,1531\n73693,1722\n73693,1732\n73693,1782\n73693,2178\n73693,2205\n73693,2244\n73693,2296\n73693,2567\n73693,3085\n73693,3804\n73693,4455\n73693,4545\n73693,5726\n73693,6119\n73693,9007\n73693,15573\n73693,16019\n73693,33424\n73693,94134\n73694,30\n73695,338\n73696,140\n73696,264\n73696,571\n73696,1238\n73696,1453\n73696,6303\n73696,7124\n73696,16614\n73697,107\n73697,4771\n73698,72\n73699,424\n73700,10\n73701,5212\n73702,893\n73703,602\n73704,602\n73705,289\n73705,290\n73706,273\n73707,328\n73708,22\n73709,30\n73710,17334\n73711,2351\n73712,2995\n73713,10\n73713,1462\n73714,9025\n73715,81\n73716,493\n73717,72\n73718,467\n73718,155469\n73719,32\n73720,79\n73721,934\n73722,435\n73723,269\n73724,79\n73725,70524\n73726,298\n73727,485\n73728,171\n73729,298\n73730,485\n73731,147\n73731,406\n73732,3422\n73733,389\n73734,30\n73735,9018\n73736,1265\n73736,1266\n73737,58\n73737,292\n73737,801\n73737,1140\n73737,1177\n73737,1893\n73737,2334\n73737,2443\n73737,3474\n73737,5547\n73738,346\n73739,147\n73739,178\n73739,346\n73739,663\n73739,664\n73739,779\n73739,1247\n73740,206\n73741,760\n73742,38634\n73743,50\n73743,192\n73743,333\n73743,1033\n73743,4193\n73744,483\n73745,41\n73745,134\n73745,137\n73745,442\n73745,1179\n73745,1368\n73745,1962\n73745,2156\n73745,4222\n73746,30\n73747,6726\n73748,6323\n73749,1181\n73750,30\n73751,372\n73752,203\n73752,2931\n73753,30\n73754,1243\n73755,1181\n73756,30\n73757,137\n73758,73759\n73760,2574\n73761,30\n73762,70524\n73763,30\n73764,70524\n73765,338\n73765,586\n73765,772\n73765,1014\n73765,6424\n73766,34\n73766,1776\n73766,4193\n73767,3321\n73768,70524\n73769,8308\n73770,70524\n73771,1181\n73772,1133\n73773,222\n73773,1462\n73774,70524\n73775,2590\n73776,225\n73777,8884\n73778,1133\n73779,45960\n73780,6027\n73781,1085\n73782,8991\n73783,32475\n73784,2266\n73785,406\n73787,10\n73787,247\n73787,2146\n73788,1210\n73789,187\n73790,850\n73791,77\n73792,17334\n73793,97\n73794,8270\n73795,450\n73795,4193\n73796,4276\n73797,344\n73797,3474\n73797,5547\n73798,250\n73798,424\n73798,1634\n73798,1684\n73798,3467\n73799,7416\n73800,23010\n73801,973\n73802,211\n73802,7363\n73804,479\n73804,640\n73804,1745\n73804,17228\n73805,233\n73806,5547\n73807,18726\n73808,160\n73809,31934\n73810,30\n73811,70524\n73812,1265\n73812,1266\n73813,70524\n73814,70524\n73815,406\n73815,779\n73816,3413\n73817,355\n73818,73819\n73820,1175\n73821,70524\n73822,1007\n73823,298\n73824,485\n73825,4672\n73826,30\n73828,302\n73829,298\n73830,485\n73831,118\n73831,4597\n73832,79\n73833,10\n73834,2146\n73835,93\n73835,94\n73836,999\n73837,1639\n73838,1227\n73838,1229\n73839,581\n73840,46\n73840,182\n73840,1893\n73841,298\n73842,485\n73843,215\n73844,83\n73845,1634\n73846,1282\n73846,4691\n73846,6506\n73846,90845\n73847,298\n73848,485\n73849,298\n73850,485\n73851,3960\n73852,70524\n73853,7360\n73854,48\n73854,130\n73854,1007\n73854,1147\n73854,3999\n73855,298\n73856,485\n73857,298\n73858,485\n73859,1323\n73860,102\n73861,1326\n73862,408\n73863,298\n73864,485\n73865,83\n73866,30\n73867,536\n73868,1210\n73868,86479\n73869,772\n73870,70524\n73871,493\n73871,1266\n73872,999\n73873,420\n73874,160\n73875,1983\n73876,30\n73876,5440\n73877,298\n73878,485\n73879,298\n73880,485\n73881,2617\n73882,3069\n73883,302\n73884,16045\n73885,422\n73886,422\n73887,422\n73888,422\n73889,422\n73890,422\n73891,422\n73892,422\n73893,422\n73894,422\n73895,72\n73896,779\n73897,298\n73898,485\n73899,1803\n73900,10\n73901,240\n73901,779\n73901,68069\n73902,1623\n73903,248\n73904,72\n73905,73906\n73907,30\n73909,158\n73910,184\n73911,206\n73912,73906\n73913,328\n73913,1247\n73913,1572\n73913,7124\n73914,1247\n73915,957\n73915,1815\n73916,1458\n73917,493\n73918,1181\n73919,175\n73920,1368\n73921,10\n73922,1118\n73923,1\n73924,6726\n73925,784\n73926,957\n73927,233\n73928,602\n73929,620\n73930,383\n73931,1133\n73932,336\n73933,72\n73933,1363\n73934,149\n73935,336\n73936,932\n73937,73938\n73939,1235\n73939,1335\n73940,23783\n73941,73942\n73941,99423\n73943,28149\n73944,663\n73944,664\n73945,30331\n73946,2995\n73947,841\n73947,1462\n73948,32475\n73949,1113\n73950,2528\n73951,171\n73952,682\n73952,72439\n73953,2244\n73954,805\n73955,10\n73955,147\n73955,2867\n73955,2868\n73956,275\n73956,277\n73957,874\n73958,72\n73958,79\n73958,147\n73958,192\n73958,337\n73958,772\n73958,1181\n73958,28203\n73960,147\n73960,158\n73960,1803\n73960,8027\n73960,88604\n73960,94871\n73960,102472\n73960,102473\n73960,102474\n73960,102475\n73960,102476\n73960,102477\n73960,102478\n73960,102479\n73960,102480\n73960,102481\n73960,102485\n73960,102577\n73960,102679\n73960,102680\n73960,102681\n73960,102732\n73960,102733\n73960,102748\n73960,102749\n73961,30\n73962,390\n73962,628\n73963,8270\n73964,420\n73965,1118\n73965,6051\n73966,192\n73966,1181\n73967,973\n73968,211\n73968,7363\n73969,657\n73970,1102\n73971,305\n73971,2206\n73971,33424\n73972,219\n73972,455\n73973,79\n73974,1479\n73975,376\n73976,1411\n73977,24763\n73978,8308\n73980,1265\n73980,1266\n73981,640\n73982,44\n73983,1608\n73984,72\n73985,79\n73986,72\n73987,192\n73988,1462\n73988,8537\n73989,160\n73990,31934\n73991,1241\n73992,1\n73992,5375\n73993,10\n73993,455\n73993,571\n73993,868\n73993,1832\n73994,2867\n73994,22880\n73995,364\n73996,79\n73997,79\n73998,79\n73999,2506\n74000,1326\n74000,1509\n74001,163\n74002,79\n74003,160\n74004,333\n74005,79\n74006,79\n74007,2146\n74008,493\n74008,1266\n74009,79\n74010,79\n74011,8270\n74012,1551\n74013,424\n74014,704\n74015,809\n74016,907\n74017,452\n74018,7124\n74019,628\n74020,2697\n74021,3960\n74022,298\n74023,485\n74024,366\n74025,160\n74025,336\n74025,827\n74025,1058\n74025,1968\n74026,72\n74027,2334\n74028,2334\n74029,72\n74030,87\n74031,233\n74032,19005\n74033,72\n74034,107\n74035,2416\n74035,2417\n74036,292\n74037,338\n74038,298\n74039,1133\n74040,3538\n74041,9121\n74042,657\n74043,2379\n74044,355\n74045,588\n74045,590\n74046,2146\n74047,240\n74048,932\n74049,72\n74050,346\n74051,298\n74052,485\n74053,222\n74054,338\n74054,389\n74055,1707\n74056,298\n74057,485\n74058,801\n74059,602\n74060,346\n74061,298\n74062,485\n74063,779\n74064,581\n74065,211\n74066,158\n74067,72\n74068,406\n74069,79\n74070,195\n74070,247\n74070,298\n74070,622\n74070,1309\n74070,3538\n74070,8235\n74071,1415\n74072,4276\n74073,1323\n74074,102\n74075,1326\n74076,408\n74077,1415\n74078,784\n74079,1745\n74080,2048\n74081,240\n74082,973\n74083,3094\n74084,694\n74085,1462\n74085,8537\n74086,422\n74087,56\n74088,1983\n74089,1151\n74090,332\n74090,934\n74090,1776\n74091,5405\n74092,79\n74092,215\n74092,1289\n74093,4475\n74094,1983\n74095,1983\n74096,18726\n74097,151\n74098,1\n74099,21944\n74100,163\n74101,4611\n74102,483\n74103,2944\n74104,1\n74105,872\n74106,79\n74107,72\n74108,874\n74109,483\n74110,4810\n74111,893\n74112,372\n74113,158\n74114,704\n74115,171\n74116,175\n74117,779\n74118,23011\n74119,3960\n74120,202\n74120,206\n74120,252\n74120,318\n74120,1284\n74120,1319\n74121,10\n74122,126\n74122,623\n74122,1359\n74122,1805\n74123,79\n74124,8270\n74125,2995\n74126,50\n74127,3161\n74128,346\n74129,184\n74130,151\n74131,3370\n74131,14453\n74132,1033\n74133,422\n74133,991\n74134,178\n74135,34\n74135,35\n74135,290\n74136,664\n74136,7360\n74137,1888\n74138,1140\n74138,5547\n74139,1531\n74140,34\n74140,158\n74141,277\n74141,1149\n74142,1955\n74143,664\n74143,8991\n74145,1556\n74146,861\n74147,22\n74148,298\n74148,372\n74148,1962\n74148,88820\n74149,83\n74150,222\n74150,1462\n74152,275\n74152,277\n74153,1085\n74154,872\n74155,248\n74156,338\n74157,805\n74158,10\n74158,79\n74158,2867\n74158,2868\n74158,22880\n74159,805\n74160,805\n74161,310\n74162,310\n74163,1983\n74164,338\n74165,333\n74166,41\n74167,217\n74168,376\n74169,79\n74170,3804\n74171,1955\n74172,328\n74173,779\n74174,72\n74175,17228\n74176,195\n74177,74178\n74179,1927\n74180,795\n74181,72\n74182,333\n74182,1531\n74183,298\n74184,485\n74185,44\n74186,298\n74187,485\n74188,298\n74189,485\n74190,298\n74191,485\n74192,74193\n74194,557\n74195,557\n74196,557\n74197,557\n74198,862\n74199,5405\n74200,571\n74201,346\n74202,79\n74203,676\n74204,1531\n74205,298\n74206,485\n74207,275\n74207,277\n74208,1531\n74209,1089\n74209,1623\n74212,158\n74213,579\n74213,602\n74213,626\n74213,4823\n74213,7194\n74214,1707\n74215,10\n74216,4611\n74217,862\n74218,3960\n74219,1014\n74220,1019\n74221,79\n74221,1323\n74222,58\n74223,2506\n74224,99\n74225,72\n74226,1467\n74227,1010\n74228,2775\n74229,447\n74230,30\n74232,1858\n74233,1860\n74234,439\n74234,934\n74235,534\n74236,5976\n74237,72\n74238,875\n74239,252\n74239,318\n74240,72\n74241,70524\n74242,79\n74243,968\n74244,70524\n74246,1140\n74246,5547\n74247,1309\n74248,206\n74249,779\n74250,5547\n74251,72\n74252,72\n74253,70524\n74254,255\n74255,2296\n74256,104\n74257,70524\n74258,503\n74259,58\n74259,1235\n74260,302\n74261,70524\n74262,74263\n74262,120505\n74264,74263\n74264,120505\n74265,70524\n74266,195\n74267,70524\n74268,7360\n74269,70524\n74270,3413\n74271,70524\n74272,70524\n74273,70524\n74274,292\n74275,332\n74275,2995\n74276,294\n74277,296\n74278,298\n74279,70524\n74280,70524\n74281,70524\n74282,383\n74282,420\n74283,4276\n74284,420\n74285,222\n74285,1462\n74286,70524\n74287,70524\n74288,636\n74289,70524\n74290,70524\n74291,70524\n74292,70524\n74293,7\n74294,72\n74295,70524\n74296,3804\n74297,795\n74298,3193\n74299,525\n74300,1001\n74301,1436\n74302,1238\n74303,70524\n74304,70524\n74305,70524\n74306,70524\n74307,79\n74308,70524\n74309,273\n74309,459\n74309,626\n74310,1052\n74311,1452\n74312,70524\n74313,298\n74314,485\n74315,10\n74315,292\n74315,337\n74315,868\n74315,1010\n74315,1326\n74315,16196\n74315,21944\n74316,70524\n74317,70524\n74318,248\n74319,644\n74320,70524\n74321,602\n74322,70524\n74323,217\n74323,222\n74324,70524\n74325,70524\n74326,70524\n74327,187\n74328,70524\n74329,298\n74330,485\n74331,70524\n74332,298\n74333,485\n74334,70524\n74335,1414\n74336,298\n74337,485\n74338,636\n74338,841\n74338,1276\n74338,1745\n74338,2286\n74339,70524\n74340,676\n74341,872\n74342,668\n74343,70524\n74344,70524\n74345,70524\n74346,70524\n74347,70524\n74348,70524\n74349,714\n74349,1149\n74349,3297\n74350,70524\n74351,1227\n74351,1229\n74351,1252\n74351,1253\n74351,86416\n74352,70524\n74353,557\n74354,70524\n74355,372\n74355,442\n74355,609\n74355,1732\n74355,2191\n74356,70524\n74357,424\n74358,70524\n74359,147\n74359,167\n74359,217\n74359,1001\n74359,1608\n74359,2083\n74360,1181\n74362,70524\n74363,70524\n74364,70524\n74365,1181\n74366,79\n74367,70524\n74369,70524\n74370,1181\n74371,827\n74372,1181\n74373,70524\n74374,344\n74375,827\n74377,298\n74378,485\n74379,1858\n74380,1860\n74381,1655\n74382,5547\n74383,1860\n74384,70524\n74385,70524\n74386,652\n74387,104\n74387,254\n74387,557\n74387,953\n74387,954\n74387,1368\n74388,70524\n74389,70524\n74390,516\n74391,70524\n74392,70524\n74393,4748\n74394,70524\n74395,999\n74396,70524\n74398,455\n74399,70524\n74400,70524\n74401,70524\n74402,671\n74403,147\n74404,3079\n74404,6387\n74404,7117\n74405,70524\n74406,184\n74407,70524\n74408,70524\n74409,355\n74411,70524\n74412,70524\n74413,626\n74414,70524\n74415,301\n74415,615\n74415,968\n74416,1803\n74418,70524\n74419,694\n74420,70524\n74421,70524\n74422,493\n74423,104\n74423,134\n74423,1882\n74424,1119\n74425,79\n74426,70524\n74427,312\n74428,422\n74429,422\n74430,422\n74431,422\n74432,1127\n74433,422\n74434,422\n74435,1070\n74436,794\n74437,422\n74438,422\n74439,422\n74440,2646\n74441,118\n74441,4597\n74442,222\n74443,422\n74444,30428\n74447,79\n74447,516\n74450,70524\n74451,30331\n74452,671\n74453,255\n74454,79\n74454,577\n74454,788\n74454,1181\n74456,74456\n74457,3724\n74458,217\n74459,79\n74460,298\n74460,6068\n74461,70524\n74463,70524\n74464,991\n74466,1102\n74467,333\n74468,70524\n74469,1749\n74470,222\n74471,79\n74471,1243\n74472,70524\n74473,70524\n74474,467\n74475,70524\n74476,206\n74476,1118\n74477,171\n74478,304\n74478,356\n74478,775\n74478,852\n74478,2334\n74479,2205\n74479,2206\n74480,70524\n74482,631\n74482,4222\n74483,640\n74484,640\n74485,9015\n74486,301\n74486,615\n74486,968\n74486,1293\n74487,640\n74488,1140\n74488,5547\n74490,240\n74491,70524\n74492,72\n74493,302\n74494,83\n74495,340\n74496,953\n74497,356\n74498,2480\n74499,70524\n74501,298\n74502,485\n74503,337\n74504,17588\n74505,215\n74505,1010\n74505,2210\n74505,4237\n74506,585\n74507,302\n74508,298\n74509,485\n74510,1955\n74511,248\n74512,298\n74513,485\n74514,252\n74514,318\n74514,1220\n74514,1222\n74515,356\n74516,79\n74517,160\n74517,360\n74517,3003\n74517,3653\n74518,255\n74519,1556\n74520,868\n74521,298\n74522,485\n74524,298\n74525,485\n74526,178\n74526,439\n74526,1776\n74527,255\n74528,70524\n74529,50\n74530,195\n74531,3804\n74533,120\n74533,3115\n74534,251\n74534,465\n74535,795\n74535,1619\n74536,1465\n74537,3161\n74538,140\n74538,1462\n74539,32475\n74540,2775\n74542,75912\n74543,1323\n74544,102\n74545,1326\n74546,408\n74548,779\n74549,4611\n74550,72\n74551,1070\n74551,1096\n74552,1181\n74553,949\n74554,209\n74555,278\n74555,660\n74555,781\n74555,1274\n74555,1718\n74555,5034\n74556,1\n74556,149\n74556,292\n74556,435\n74556,439\n74556,483\n74556,493\n74556,538\n74556,599\n74556,868\n74556,920\n74556,972\n74556,1010\n74556,1133\n74556,1241\n74556,1326\n74556,1359\n74556,1837\n74556,1844\n74556,2083\n74556,21944\n74557,809\n74558,79\n74559,875\n74560,2989\n74560,2991\n74561,21944\n74562,338\n74563,5547\n74565,390\n74566,1858\n74567,1860\n74568,209\n74569,346\n74570,134\n74571,30\n74572,338\n74573,579\n74573,861\n74573,1556\n74574,467\n74574,868\n74575,2045\n74576,1955\n74577,1293\n74578,178\n74579,209\n74580,1531\n74581,34\n74581,35\n74582,841\n74585,843\n74587,74588\n74589,34\n74589,35\n74590,292\n74591,1509\n74592,1133\n74593,4192\n74593,4193\n74594,310\n74594,7363\n74594,8270\n74595,850\n74596,1858\n74597,1860\n74598,1707\n74599,1238\n74600,222\n74600,455\n74600,1274\n74601,628\n74602,147\n74602,158\n74606,17228\n74607,215\n74609,74610\n74611,862\n74612,147\n74612,911\n74612,1844\n74613,30\n74614,500\n74615,147\n74615,158\n74615,206\n74615,1181\n74615,1515\n74615,2244\n74615,30331\n74615,42064\n74615,80266\n74616,1977\n74616,1978\n74617,6119\n74618,1227\n74618,1229\n74619,147\n74619,1276\n74619,8332\n74620,41\n74621,298\n74622,485\n74623,74624\n74623,97005\n74626,1238\n74627,415\n74628,206\n74629,15609\n74630,1262\n74631,941\n74632,1181\n74633,893\n74633,4823\n74634,745\n74635,167\n74635,299\n74635,3630\n74636,1877\n74637,483\n74638,801\n74639,305\n74640,178\n74640,195\n74640,406\n74640,611\n74640,740\n74640,741\n74640,877\n74640,1010\n74640,1118\n74640,1181\n74640,1241\n74640,1294\n74640,1572\n74640,1837\n74641,1531\n74642,392\n74643,292\n74644,5308\n74645,328\n74645,8180\n74646,171\n74647,1070\n74649,1425\n74650,1370\n74651,602\n74652,422\n74653,70524\n74654,406\n74655,302\n74655,433\n74655,538\n74655,861\n74657,620\n74658,222\n74658,278\n74659,5547\n74660,30\n74661,298\n74662,485\n74663,72\n74664,344\n74665,285\n74666,313\n74667,68\n74668,37\n74669,1227\n74669,1229\n74670,1132\n74670,1381\n74670,1509\n74671,605\n74672,589\n74673,31934\n74674,1181\n74675,70524\n74676,1140\n74677,70524\n74678,344\n74680,973\n74682,72\n74683,248\n74684,285\n74685,626\n74685,775\n74685,852\n74685,3804\n74687,973\n74687,1707\n74688,30\n74689,406\n74690,5547\n74691,46\n74692,247\n74693,2979\n74694,255\n74695,309\n74695,310\n74696,372\n74696,599\n74696,714\n74696,1282\n74697,1776\n74699,30\n74700,99\n74700,146\n74701,2421\n74703,301\n74704,30\n74704,200\n74704,772\n74704,4941\n74704,28203\n74705,1718\n74706,493\n74706,1266\n74707,1181\n74708,8270\n74709,68\n74710,1289\n74711,171\n74712,255\n74713,4691\n74714,717\n74715,640\n74716,211\n74716,302\n74716,919\n74718,195\n74718,74719\n74720,379\n74721,1411\n74722,3695\n74723,206\n74724,6424\n74725,30\n74726,2979\n74728,30\n74729,255\n74730,258\n74731,875\n74732,68\n74733,455\n74734,772\n74735,577\n74737,79\n74738,158\n74739,151\n74740,195\n74741,217\n74742,206\n74743,292\n74744,481\n74745,83\n74745,143\n74745,1204\n74745,1844\n74745,17346\n74746,247\n74747,843\n74749,1370\n74749,1821\n74750,697\n74751,255\n74752,376\n74753,298\n74754,1749\n74755,850\n74756,8822\n74757,1556\n74758,305\n74759,252\n74759,318\n74760,1033\n74761,406\n74762,872\n74763,818\n74764,206\n74765,2146\n74766,772\n74767,483\n74768,222\n74769,30\n74771,20\n74771,309\n74771,310\n74771,577\n74771,1400\n74771,21442\n74772,467\n74772,868\n74773,1078\n74774,79\n74774,192\n74774,406\n74774,435\n74774,586\n74774,980\n74774,4192\n74774,4193\n74775,1181\n74776,536\n74777,1985\n74778,83\n74779,1634\n74780,2671\n74781,557\n74782,1252\n74782,1253\n74783,557\n74784,557\n74785,557\n74786,493\n74786,1266\n74787,4220\n74788,298\n74789,79\n74790,852\n74791,5547\n74792,376\n74793,885\n74794,452\n74795,3069\n74796,875\n74797,83\n74798,875\n74799,358\n74800,184\n74801,8270\n74802,859\n74803,358\n74804,83\n74805,13361\n74806,158\n74806,333\n74807,1983\n74808,664\n74808,818\n74808,14483\n74808,23701\n74809,312\n74810,74811\n74812,310\n74813,1392\n74814,106\n74814,158\n74814,192\n74814,252\n74814,285\n74814,306\n74814,307\n74814,318\n74814,337\n74814,346\n74814,406\n74814,435\n74814,447\n74814,493\n74814,516\n74814,620\n74814,1181\n74814,1220\n74814,1222\n74814,1370\n74814,1515\n74814,1531\n74814,6119\n74815,305\n74816,58\n74817,46\n74818,217\n74818,1417\n74819,74811\n74820,147\n74821,217\n74822,1085\n74823,310\n74824,74825\n74826,44\n74827,70524\n74828,74829\n74828,88894\n74828,123068\n74830,4\n74830,5\n74830,65\n74830,72\n74830,97\n74830,140\n74830,147\n74830,178\n74830,184\n74830,192\n74830,206\n74830,209\n74830,296\n74830,302\n74830,304\n74830,305\n74830,333\n74830,340\n74830,344\n74830,346\n74830,431\n74830,435\n74830,440\n74830,444\n74830,457\n74830,479\n74830,491\n74830,515\n74830,516\n74830,536\n74830,577\n74830,579\n74830,589\n74830,595\n74830,622\n74830,652\n74830,671\n74830,801\n74830,809\n74830,827\n74830,835\n74830,841\n74830,861\n74830,872\n74830,918\n74830,920\n74830,932\n74830,968\n74830,994\n74830,1007\n74830,1019\n74830,1058\n74830,1102\n74830,1118\n74830,1177\n74830,1181\n74830,1267\n74830,1294\n74830,1326\n74830,1381\n74830,1392\n74830,1417\n74830,1452\n74830,1466\n74830,1531\n74830,1579\n74830,1590\n74830,1612\n74830,1677\n74830,1707\n74830,1818\n74830,1968\n74830,2073\n74830,2244\n74830,2334\n74830,2353\n74830,2443\n74830,2867\n74830,3999\n74830,4823\n74830,5440\n74830,5911\n74830,6303\n74830,6661\n74830,7270\n74830,9018\n74830,9028\n74830,14945\n74830,17309\n74830,20359\n74830,21944\n74830,22880\n74830,54202\n74830,54243\n74830,54272\n74830,54284\n74830,54362\n74831,920\n74833,247\n74834,433\n74835,2116\n74836,602\n74837,1858\n74838,1860\n74840,41\n74841,2116\n74842,70524\n74843,450\n74844,7358\n74844,7363\n74846,74847\n74848,74849\n74851,72\n74852,323\n74853,70524\n74854,634\n74855,31977\n74856,70524\n74857,70524\n74858,74859\n74860,70524\n74861,70524\n74862,70524\n74863,70524\n74864,70524\n74865,70524\n74866,333\n74866,980\n74866,1388\n74866,1531\n74866,4455\n74866,4545\n74866,15573\n74866,139010\n74867,147\n74868,70524\n74869,70524\n74870,4549\n74871,70524\n74872,1631\n74873,588\n74873,590\n74875,70524\n74876,70524\n74877,622\n74878,70524\n74879,70524\n74880,70524\n74881,70524\n74882,70524\n74883,74884\n74885,70524\n74886,70524\n74887,393\n74888,70524\n74889,74890\n74891,70524\n74892,70524\n74893,77\n74894,70524\n74895,70524\n74896,70524\n74897,70524\n74898,1467\n74899,70524\n74900,70524\n74901,70524\n74902,70524\n74903,70524\n74904,388\n74905,577\n74906,2424\n74907,70524\n74908,70524\n74909,2351\n74910,70524\n74911,1634\n74912,74913\n74914,70524\n74915,70524\n74916,577\n74917,1871\n74918,70524\n74919,70524\n74920,70524\n74921,70524\n74922,70524\n74923,70524\n74924,70524\n74925,70524\n74926,8990\n74927,3161\n74928,349\n74929,70524\n74930,3148\n74930,4193\n74931,13980\n74932,70524\n74933,70524\n74934,310\n74935,72\n74936,70524\n74937,19986\n74938,70524\n74939,70524\n74940,70524\n74941,70524\n74943,70524\n74944,1\n74945,932\n74946,22924\n74947,818\n74948,74949\n74948,78294\n74948,83620\n74948,96438\n74948,100982\n74948,103273\n74948,110412\n74948,113219\n74948,115368\n74948,124662\n74948,125656\n74948,126202\n74948,159561\n74950,70524\n74951,74952\n74953,707\n74954,503\n74955,323\n74956,70524\n74957,233\n74958,2146\n74959,7124\n74960,985\n74961,70524\n74962,994\n74963,70524\n74964,338\n74965,70524\n74966,70524\n74967,70524\n74968,70524\n74970,41\n74971,20\n74971,48\n74971,1010\n74971,2244\n74971,35750\n74971,35751\n74972,718\n74973,1858\n74974,1860\n74975,1479\n74976,70524\n74977,70524\n74978,70524\n74979,622\n74980,70524\n74981,70524\n74982,70524\n74983,70524\n74984,70524\n74985,1858\n74986,1860\n74987,70524\n74988,615\n74989,3695\n74990,83\n74991,83\n74992,70524\n74993,70524\n74994,70524\n74995,269\n74995,1531\n74996,1\n74996,7\n74996,22\n74996,2017\n74997,58\n74998,46\n74999,1877\n75000,422\n75001,56\n75002,86\n75003,70524\n75004,75005\n75004,84781\n75004,109370\n75006,302\n75007,97\n75008,70524\n75009,302\n75010,207\n75011,302\n75012,70524\n75013,70524\n75014,252\n75014,318\n75015,1571\n75015,2315\n75016,467\n75017,745\n75018,104\n75018,254\n75018,557\n75018,953\n75019,1019\n75020,70524\n75021,467\n75022,140\n75023,70524\n75024,70524\n75025,70524\n75026,70524\n75027,1639\n75028,70524\n75029,70524\n75030,1001\n75031,140\n75032,207\n75033,70524\n75034,70524\n75035,4355\n75036,32\n75037,70524\n75038,70524\n75039,70524\n75040,500\n75041,292\n75042,70524\n75043,70524\n75044,875\n75045,340\n75045,557\n75045,671\n75045,827\n75045,1151\n75045,1881\n75045,2421\n75045,9457\n75045,30331\n75045,81233\n75046,70524\n75047,70524\n75048,779\n75048,1181\n75049,70524\n75051,14483\n75052,70524\n75053,861\n75054,932\n75055,70524\n75056,907\n75057,972\n75058,70524\n75059,682\n75059,1512\n75059,5992\n75059,72439\n75060,70524\n75061,422\n75062,70524\n75063,422\n75064,70524\n75065,422\n75067,422\n75068,70524\n75069,422\n75070,422\n75071,422\n75072,422\n75073,70524\n75074,140\n75075,171\n75076,70524\n75077,422\n75078,2797\n75079,70524\n75080,264\n75080,1007\n75080,1551\n75080,5440\n75081,70524\n75082,70524\n75083,408\n75084,875\n75084,6955\n75085,70524\n75086,70524\n75089,1968\n75090,70524\n75091,1973\n75092,1411\n75093,292\n75093,4771\n75094,222\n75094,1019\n75095,1559\n75096,140\n75096,450\n75097,70524\n75098,497\n75099,70524\n75100,81\n75101,70524\n75102,788\n75104,70524\n75105,70524\n75106,70524\n75107,140\n75108,8541\n75109,70524\n75110,70524\n75111,1001\n75113,6627\n75115,70524\n75116,70524\n75117,70524\n75119,21944\n75120,623\n75120,1805\n75121,313\n75122,70524\n75123,264\n75124,70524\n75125,30\n75126,772\n75126,15807\n75127,140\n75128,83\n75129,70524\n75130,784\n75131,70524\n75132,626\n75132,720\n75132,2045\n75132,2146\n75132,3194\n75132,5405\n75133,70524\n75134,171\n75135,70524\n75137,312\n75138,640\n75139,435\n75139,440\n75139,467\n75140,140\n75141,2146\n75142,70524\n75143,70524\n75145,70524\n75146,70524\n75147,422\n75148,240\n75149,30\n75150,70524\n75151,1559\n75152,422\n75153,304\n75153,356\n75153,801\n75153,5547\n75154,70524\n75156,5101\n75156,15119\n75157,70524\n75158,70524\n75159,70524\n75160,70524\n75161,422\n75162,184\n75164,23287\n75165,70524\n75166,24763\n75167,2224\n75167,2784\n75168,652\n75169,70524\n75171,872\n75172,23287\n75173,70524\n75174,70524\n75175,70524\n75176,442\n75177,70524\n75178,70524\n75179,1805\n75180,77\n75180,862\n75181,1058\n75182,79\n75183,1119\n75184,41\n75184,68\n75184,240\n75184,390\n75184,431\n75184,760\n75184,784\n75184,805\n75184,818\n75184,1119\n75184,1285\n75184,1309\n75184,1608\n75184,1631\n75184,1888\n75184,2590\n75184,2620\n75184,2995\n75184,3135\n75184,4220\n75184,7194\n75184,66297\n75185,298\n75186,30\n75187,134\n75188,2116\n75189,211\n75190,775\n75190,911\n75193,23287\n75194,596\n75194,5101\n75195,1010\n75198,202\n75198,203\n75199,3538\n75200,2146\n75201,346\n75202,346\n75203,1801\n75204,1370\n75204,1821\n75204,2782\n75205,6323\n75209,2590\n75210,215\n75212,1323\n75213,102\n75214,1326\n75215,408\n75217,70524\n75218,690\n75219,70524\n75220,346\n75221,575\n75222,346\n75224,298\n75225,485\n75226,192\n75227,788\n75228,2590\n75229,861\n75229,4453\n75230,2353\n75231,272\n75232,1388\n75232,1984\n75232,3949\n75233,261\n75234,158\n75235,718\n75236,663\n75236,664\n75237,2590\n75238,527\n75239,294\n75239,631\n75239,694\n75239,4222\n75240,949\n75241,811\n75242,1612\n75243,893\n75244,6323\n75245,736\n75246,1454\n75247,5547\n75248,493\n75249,99\n75249,406\n75249,602\n75249,620\n75249,841\n75249,1181\n75249,240174\n75250,1454\n75251,1140\n75251,5547\n75253,251\n75253,465\n75254,217\n75255,920\n75256,248\n75258,70524\n75259,70524\n75260,70524\n75261,1707\n75262,720\n75263,6506\n75264,805\n75264,1326\n75264,1955\n75266,1977\n75266,1978\n75267,70524\n75268,70524\n75269,1715\n75269,9018\n75270,70524\n75271,1796\n75272,299\n75272,1293\n75272,3260\n75273,422\n75274,56\n75275,467\n75276,779\n75277,81\n75278,2266\n75279,379\n75279,577\n75279,1454\n75280,312\n75282,130\n75282,184\n75282,422\n75282,671\n75282,1224\n75283,920\n75284,422\n75285,56\n75286,45022\n75287,1133\n75288,1619\n75289,843\n75290,372\n75291,79\n75292,397\n75292,1663\n75293,467\n75293,868\n75295,217\n75295,301\n75295,536\n75295,1454\n75295,75912\n75296,1732\n75296,2557\n75298,1179\n75298,1319\n75298,6068\n75299,772\n75300,1785\n75301,338\n75303,337\n75304,1359\n75305,2116\n75306,657\n75307,14819\n75308,302\n75309,50\n75309,620\n75309,1623\n75310,850\n75311,30\n75312,2274\n75313,1836\n75315,571\n75315,2209\n75317,30\n75318,2209\n75319,107\n75320,30\n75321,30\n75322,30\n75324,298\n75325,485\n75326,30\n75327,620\n75327,2367\n75328,225\n75329,69394\n75330,175\n75331,920\n75332,50\n75333,818\n75334,366\n75335,649\n75335,3999\n75336,298\n75337,485\n75338,467\n75340,34\n75340,35\n75340,313\n75340,536\n75340,634\n75340,1718\n75340,2224\n75340,2646\n75340,5326\n75341,805\n75342,1181\n75343,949\n75344,1368\n75345,1893\n75346,1181\n75347,873\n75348,217\n75349,439\n75350,615\n75351,290\n75351,8855\n75352,34\n75352,663\n75352,664\n75353,277\n75353,5366\n75354,467\n75354,1893\n75355,852\n75356,1608\n75357,22\n75357,48\n75357,79\n75357,87\n75357,151\n75357,163\n75357,206\n75357,209\n75357,217\n75357,240\n75357,248\n75357,358\n75357,393\n75357,435\n75357,439\n75357,538\n75357,611\n75357,622\n75357,811\n75357,920\n75357,1019\n75357,1033\n75357,1068\n75357,1188\n75357,1210\n75357,1289\n75357,1305\n75357,1749\n75357,1785\n75357,1796\n75357,1962\n75357,2017\n75357,2116\n75357,2205\n75357,2206\n75357,2260\n75357,2353\n75357,2367\n75357,2617\n75357,3695\n75357,4066\n75357,4411\n75357,5358\n75357,8180\n75357,8820\n75357,9024\n75357,9029\n75357,13136\n75357,13538\n75357,13910\n75357,14352\n75357,14556\n75357,19356\n75357,36985\n75358,34\n75358,35\n75358,356\n75358,852\n75359,827\n75360,2244\n75361,184\n75362,217\n75362,252\n75362,779\n75362,920\n75362,1033\n75362,1181\n75363,310\n75363,313\n75363,849\n75363,1285\n75363,1319\n75363,1368\n75363,1566\n75363,3039\n75364,346\n75365,2210\n75365,4237\n75365,182162\n75366,1014\n75367,718\n75368,70524\n75369,298\n75370,485\n75371,2837\n75372,3135\n75373,346\n75374,2867\n75374,22880\n75375,818\n75376,1019\n75377,779\n75377,1515\n75378,1454\n75379,718\n75380,207\n75381,355\n75382,240\n75382,372\n75383,217\n75383,233\n75383,240\n75383,1417\n75383,2334\n75384,151\n75385,1\n75386,868\n75387,207\n75388,309\n75388,310\n75389,585\n75390,788\n75390,1388\n75391,222\n75392,86\n75393,1634\n75394,217\n75394,301\n75394,604\n75394,3422\n75395,626\n75396,30\n75397,83\n75398,79\n75399,2146\n75401,1635\n75402,30\n75403,30\n75404,346\n75405,30\n75406,30\n75407,3\n75408,21944\n75409,247\n75410,1033\n75411,8788\n75412,1381\n75413,376\n75414,48\n75415,4611\n75416,30\n75417,2286\n75418,58\n75418,801\n75418,1140\n75418,1449\n75418,3474\n75418,4771\n75418,5547\n75419,346\n75420,79\n75421,1243\n75422,171\n75423,349\n75424,292\n75424,801\n75424,1140\n75424,1146\n75424,3474\n75425,818\n75427,79\n75428,1227\n75428,1229\n75428,21944\n75429,30\n75430,483\n75431,663\n75431,664\n75431,2178\n75431,4545\n75431,56150\n75432,640\n75433,818\n75434,1368\n75435,79\n75436,298\n75437,485\n75438,872\n75439,1429\n75440,298\n75441,1132\n75442,30\n75443,140\n75444,267\n75445,30\n75446,1319\n75447,850\n75448,668\n75449,30\n75450,30\n75451,30\n75452,280\n75452,17245\n75453,3507\n75454,70524\n75455,1983\n75456,280\n75456,17245\n75457,72\n75458,298\n75459,485\n75460,30\n75461,358\n75462,301\n75462,687\n75462,752\n75462,893\n75462,1837\n75462,2116\n75462,2266\n75463,7416\n75464,30\n75465,557\n75466,83\n75467,843\n75468,298\n75469,485\n75470,158\n75471,5547\n75472,1608\n75472,2424\n75472,4903\n75473,861\n75474,298\n75475,485\n75476,557\n75477,557\n75478,195\n75479,83\n75480,1544\n75481,862\n75482,644\n75483,602\n75484,1227\n75484,1229\n75485,872\n75486,1143\n75487,30\n75488,146\n75489,75490\n75489,100727\n75491,200\n75492,184\n75493,72\n75494,693\n75496,3069\n75497,2116\n75498,346\n75499,972\n75500,163\n75501,1231\n75501,1782\n75502,75503\n75505,17886\n75506,338\n75506,872\n75506,1058\n75506,1572\n75506,1688\n75506,1722\n75506,1893\n75506,3538\n75506,191860\n75507,745\n75508,1707\n75509,422\n75510,56\n75511,75512\n75513,422\n75514,56\n75515,75516\n75517,75518\n75519,301\n75519,861\n75519,893\n75519,2979\n75520,1556\n75521,55849\n75522,58\n75523,46\n75524,589\n75525,577\n75526,313\n75527,313\n75528,264\n75528,1659\n75528,2979\n75529,192\n75529,1509\n75530,1235\n75530,1335\n75531,7117\n75532,75533\n75532,95683\n75534,75535\n75536,75537\n75540,516\n75541,2784\n75542,30\n75543,81\n75544,247\n75545,30\n75546,17886\n75547,2775\n75548,447\n75549,346\n75550,147\n75551,30\n75552,338\n75555,2590\n75557,1\n75557,147\n75557,149\n75557,2244\n75558,195\n75559,72\n75560,314\n75560,392\n75561,70524\n75562,207\n75563,30\n75564,671\n75565,70524\n75566,1556\n75567,70524\n75568,70524\n75569,872\n75570,75571\n75572,1429\n75573,83\n75574,70524\n75575,30\n75576,70524\n75577,70524\n75578,668\n75580,1551\n75581,75582\n75583,75583\n75584,75585\n75586,72\n75587,70524\n75588,70524\n75589,94\n75589,2787\n75590,70524\n75591,75592\n75591,100607\n75593,87\n75594,70524\n75595,75596\n75597,70524\n75598,640\n75599,70524\n75600,70524\n75601,1181\n75602,70524\n75603,75604\n75605,30\n75606,70524\n75607,70524\n75608,70524\n75609,30\n75610,70524\n75611,2574\n75611,75612\n75611,83049\n75611,104823\n75611,120211\n75611,121817\n75611,124276\n75613,70524\n75614,70524\n75615,1143\n75616,70524\n75617,70524\n75618,70524\n75619,70524\n75620,70524\n75621,72\n75622,70524\n75623,333\n75623,1181\n75624,70524\n75625,70524\n75626,30\n75627,70524\n75628,70524\n75629,640\n75630,70524\n75631,30\n75632,70524\n75633,70524\n75634,70524\n75635,70524\n75636,70524\n75637,70524\n75638,70524\n75639,70524\n75640,70524\n75641,70524\n75642,70524\n75643,70524\n75644,70524\n75645,70524\n75646,70524\n75647,70524\n75648,70524\n75649,70524\n75650,70524\n75651,70524\n75652,70524\n75653,70524\n75654,75654\n75655,70524\n75656,70524\n75657,70524\n75658,70524\n75659,70524\n75660,70524\n75661,70524\n75662,75663\n75664,3872\n75665,70524\n75666,70524\n75667,70524\n75668,70524\n75669,70524\n75670,70524\n75671,70524\n75672,247\n75672,2867\n75672,22880\n75673,70524\n75674,70524\n75675,70524\n75676,70524\n75677,70524\n75678,70524\n75679,70524\n75680,70524\n75681,70524\n75682,70524\n75683,70524\n75684,70524\n75685,70524\n75686,70524\n75687,70524\n75688,70524\n75689,70524\n75690,70524\n75691,70524\n75692,70524\n75693,70524\n75694,872\n75695,424\n75697,338\n75697,623\n75698,70524\n75699,70524\n75700,70524\n75701,70524\n75702,30\n75703,30\n75704,70524\n75705,70524\n75706,70524\n75707,640\n75708,70524\n75709,1220\n75709,1222\n75710,70524\n75711,75712\n75713,298\n75714,485\n75715,70524\n75716,233\n75717,70524\n75718,75719\n75718,99463\n75720,70524\n75721,70524\n75722,70524\n75723,70524\n75724,70524\n75725,70524\n75726,75727\n75728,75727\n75729,70524\n75730,70524\n75731,70524\n75732,70524\n75733,70524\n75734,70524\n75735,75736\n75737,70524\n75738,298\n75739,485\n75740,70524\n75741,70524\n75742,70524\n75743,70524\n75744,79\n75744,333\n75745,70524\n75746,70524\n75747,70524\n75748,70524\n75749,70524\n75750,70524\n75752,70524\n75753,70524\n75756,1860\n75757,652\n75758,16196\n75759,467\n75760,75761\n75762,2116\n75763,355\n75764,222\n75764,932\n75764,973\n75764,1284\n75764,1467\n75764,1715\n75764,2191\n75764,2784\n75765,2574\n75766,70524\n75767,70524\n75768,3003\n75769,70524\n75770,70524\n75771,70524\n75772,70524\n75773,70524\n75774,70524\n75775,70524\n75777,1140\n75777,3474\n75777,5547\n75778,140\n75779,30\n75780,70524\n75781,70524\n75783,333\n75784,1983\n75785,510\n75787,379\n75788,206\n75789,70524\n75790,70524\n75791,75792\n75793,30\n75794,167\n75794,2083\n75795,233\n75796,120\n75797,70524\n75798,41\n75798,516\n75798,779\n75799,252\n75799,318\n75800,932\n75801,872\n75802,444\n75803,70524\n75804,70524\n75805,1983\n75806,2775\n75807,70524\n75808,70524\n75809,75810\n75811,2646\n75812,70524\n75813,278\n75814,652\n75815,70524\n75817,147\n75817,440\n75817,5212\n75818,70524\n75819,333\n75819,663\n75819,664\n75820,784\n75821,70524\n75822,70524\n75823,71\n75824,70524\n75825,192\n75825,309\n75825,310\n75825,577\n75825,2073\n75825,2626\n75826,1983\n75827,79\n75828,640\n75829,2775\n75830,70524\n75831,640\n75832,640\n75833,861\n75834,70524\n75835,147\n75836,1983\n75837,83\n75838,70524\n75839,70524\n75840,1718\n75840,2646\n75842,70524\n75843,70524\n75844,1801\n75845,70524\n75846,227\n75847,70524\n75848,872\n75848,7698\n75849,70524\n75850,70524\n75851,481\n75852,70524\n75853,70524\n75854,70524\n75855,360\n75856,577\n75857,70524\n75858,70524\n75859,595\n75859,1688\n75859,5540\n75860,2931\n75862,1849\n75863,137\n75864,70524\n75865,70524\n75866,83\n75867,1590\n75868,75869\n75870,70524\n75871,70524\n75872,240\n75873,34\n75873,35\n75873,2266\n75874,1983\n75875,1133\n75876,147\n75876,158\n75876,406\n75876,779\n75877,70524\n75878,18726\n75879,30\n75879,1102\n75880,70524\n75881,1466\n75882,70524\n75883,259\n75883,493\n75883,577\n75883,690\n75883,788\n75883,1001\n75883,1531\n75884,457\n75886,70524\n75887,70524\n75888,70524\n75889,50\n75890,71\n75890,1224\n75891,515\n75892,70524\n75893,70524\n75895,70524\n75896,310\n75896,3039\n75897,70524\n75898,571\n75898,868\n75899,30\n75900,70524\n75901,70524\n75902,70524\n75903,422\n75904,4355\n75906,422\n75907,422\n75908,422\n75909,70524\n75910,422\n75911,422\n75912,1\n75912,3\n75912,10\n75912,34\n75912,35\n75912,41\n75912,46\n75912,58\n75912,233\n75912,240\n75912,254\n75912,255\n75912,294\n75912,298\n75912,299\n75912,301\n75912,304\n75912,314\n75912,327\n75912,372\n75912,390\n75912,397\n75912,406\n75912,417\n75912,425\n75912,439\n75912,440\n75912,444\n75912,446\n75912,452\n75912,457\n75912,518\n75912,534\n75912,535\n75912,573\n75912,589\n75912,590\n75912,592\n75912,596\n75912,599\n75912,631\n75912,632\n75912,676\n75912,685\n75912,693\n75912,714\n75912,720\n75912,733\n75912,765\n75912,775\n75912,784\n75912,788\n75912,794\n75912,795\n75912,805\n75912,810\n75912,818\n75912,838\n75912,849\n75912,852\n75912,862\n75912,872\n75912,911\n75912,932\n75912,950\n75912,972\n75912,1001\n75912,1010\n75912,1011\n75912,1014\n75912,1045\n75912,1085\n75912,1118\n75912,1119\n75912,1130\n75912,1133\n75912,1181\n75912,1191\n75912,1195\n75912,1220\n75912,1222\n75912,1262\n75912,1282\n75912,1284\n75912,1285\n75912,1300\n75912,1402\n75912,1417\n75912,1445\n75912,1459\n75912,1462\n75912,1464\n75912,1505\n75912,1518\n75912,1522\n75912,1564\n75912,1566\n75912,1572\n75912,1580\n75912,1663\n75912,1715\n75912,1796\n75912,1825\n75912,1844\n75912,1973\n75912,2069\n75912,2095\n75912,2191\n75912,2193\n75912,2204\n75912,2224\n75912,2253\n75912,2296\n75912,2373\n75912,2511\n75912,2512\n75912,2572\n75912,2747\n75912,2995\n75912,3488\n75912,3504\n75912,3507\n75912,3524\n75912,3582\n75912,3623\n75912,3724\n75912,3841\n75912,3944\n75912,4222\n75912,4308\n75912,4415\n75912,4514\n75912,5186\n75912,5472\n75912,5486\n75912,5695\n75912,5851\n75912,5961\n75912,6004\n75912,6068\n75912,6474\n75912,6837\n75912,6904\n75912,7109\n75912,7117\n75912,7194\n75912,7386\n75912,7759\n75912,7790\n75912,8261\n75912,8537\n75912,8807\n75912,8884\n75912,9028\n75912,9342\n75912,9457\n75912,13412\n75912,13657\n75912,14011\n75912,14358\n75912,14414\n75912,14674\n75912,15109\n75912,15221\n75912,15254\n75912,15259\n75912,15386\n75912,16192\n75912,16524\n75912,16955\n75912,17116\n75912,19061\n75912,19560\n75912,19592\n75912,19798\n75912,20757\n75912,21589\n75912,21721\n75912,22268\n75912,22389\n75912,23468\n75912,25385\n75912,26032\n75912,28545\n75912,28832\n75912,30373\n75912,31794\n75912,32692\n75912,32725\n75912,33339\n75912,33764\n75912,34117\n75912,34876\n75912,35561\n75912,36755\n75912,36761\n75912,37743\n75912,38770\n75912,38822\n75912,42839\n75912,44725\n75912,49027\n75912,49121\n75912,51666\n75912,51972\n75912,55827\n75912,61089\n75912,62461\n75912,64026\n75912,64197\n75912,70032\n75912,70981\n75912,72677\n75912,73248\n75912,74542\n75912,75295\n75912,75912\n75912,75936\n75912,76037\n75912,76704\n75912,76836\n75912,76971\n75912,77551\n75912,77743\n75912,78621\n75912,78672\n75912,79235\n75912,79238\n75912,79240\n75912,79242\n75912,79528\n75912,80268\n75912,80354\n75912,80368\n75912,80464\n75912,81239\n75912,81508\n75912,81563\n75912,82568\n75912,82587\n75912,82731\n75912,82735\n75912,82741\n75912,83151\n75912,83159\n75912,83160\n75912,83161\n75912,83162\n75912,83164\n75912,83167\n75912,83220\n75912,83222\n75912,83317\n75912,83383\n75912,83920\n75912,84377\n75912,84381\n75912,84382\n75912,84385\n75912,84402\n75912,85702\n75912,85705\n75912,85716\n75912,85717\n75912,85723\n75912,86582\n75912,86619\n75912,88596\n75912,89040\n75912,90079\n75912,90192\n75912,90620\n75912,91749\n75912,92838\n75912,93038\n75912,93040\n75912,93053\n75912,93526\n75912,93707\n75912,93752\n75912,94156\n75912,94870\n75912,94873\n75912,94876\n75912,95301\n75912,95365\n75912,95585\n75912,95757\n75912,96649\n75912,97867\n75912,97897\n75912,98772\n75912,99756\n75912,101466\n75912,101473\n75912,101475\n75912,103822\n75912,103910\n75912,104275\n75912,104277\n75912,104305\n75912,104564\n75912,105327\n75912,105496\n75912,106892\n75912,107417\n75912,107885\n75912,109834\n75912,112212\n75912,112727\n75912,114364\n75912,115474\n75912,120830\n75912,121863\n75912,123664\n75912,125866\n75912,126694\n75912,127158\n75912,127171\n75912,127173\n75912,127179\n75912,127216\n75912,127217\n75912,127218\n75912,127220\n75912,127843\n75912,129696\n75912,129745\n75912,129855\n75912,129869\n75912,130755\n75912,130756\n75912,130762\n75912,130764\n75912,130765\n75912,130766\n75912,130767\n75912,130768\n75912,131211\n75912,132935\n75912,135918\n75912,137974\n75912,137991\n75912,138094\n75912,138114\n75912,138116\n75912,138143\n75912,139918\n75912,141073\n75912,143238\n75912,145128\n75912,145235\n75912,145386\n75912,147810\n75912,147888\n75912,158950\n75912,160884\n75912,165214\n75912,165344\n75912,167667\n75912,168470\n75912,169878\n75912,170595\n75912,171053\n75912,171727\n75912,172522\n75912,178576\n75912,180936\n75912,182303\n75912,185874\n75912,185877\n75912,189196\n75912,194403\n75912,199161\n75912,207659\n75912,212692\n75912,212916\n75912,215874\n75912,215915\n75912,216138\n75912,216519\n75912,216522\n75912,216621\n75912,216634\n75912,216636\n75912,216639\n75912,216640\n75912,216705\n75912,216711\n75912,216716\n75912,216719\n75912,220268\n75912,220285\n75912,221068\n75912,222501\n75912,223719\n75912,225328\n75912,228841\n75912,229559\n75912,229824\n75912,230254\n75912,234677\n75912,242949\n75912,243185\n75912,245975\n75912,249055\n75912,255475\n75912,256175\n75912,256178\n75912,256183\n75912,264559\n75913,70524\n75914,422\n75915,70524\n75916,70524\n75917,70524\n75918,70524\n75919,422\n75920,70524\n75921,392\n75922,70524\n75923,70524\n75924,801\n75924,1177\n75924,2443\n75924,3474\n75925,70524\n75926,70524\n75927,70524\n75928,70524\n75929,70524\n75930,70524\n75931,408\n75932,200\n75933,70524\n75934,2116\n75935,147\n75938,30\n75939,70524\n75940,171\n75941,70524\n75942,1323\n75943,102\n75944,1326\n75945,408\n75946,30\n75947,70524\n75948,604\n75949,70524\n75950,70524\n75951,493\n75952,149\n75953,70524\n75955,70524\n75956,70524\n75958,70524\n75960,493\n75961,70524\n75963,907\n75965,70524\n75968,70524\n75969,805\n75970,70524\n75971,694\n75973,240\n75974,70524\n75976,70524\n75978,70524\n75980,70524\n75981,70524\n75982,827\n75982,1326\n75983,20\n75984,70524\n75985,70524\n75986,70524\n75987,10\n75988,70524\n75989,309\n75989,310\n75990,70524\n75991,70524\n75992,579\n75992,682\n75992,2373\n75992,72439\n75993,70524\n75994,70524\n75995,70524\n75996,136\n75997,304\n75997,795\n75998,70524\n75999,70524\n76000,83\n76001,70524\n76002,70524\n76003,1007\n76004,70524\n76005,70524\n76006,70524\n76007,70524\n76008,1326\n76009,1805\n76010,70524\n76011,1707\n76012,1983\n76013,111\n76015,682\n76015,1858\n76016,70524\n76017,70524\n76018,70524\n76019,1977\n76019,1978\n76021,76020\n76021,233740\n76021,240223\n76022,1955\n76023,70524\n76024,1089\n76025,346\n76026,70524\n76027,70524\n76028,2334\n76029,76030\n76029,85338\n76029,89034\n76029,92382\n76029,97133\n76029,98726\n76029,106729\n76029,114770\n76029,114934\n76029,114968\n76029,117366\n76029,119635\n76029,120049\n76029,123730\n76029,124258\n76029,126429\n76029,131307\n76029,131327\n76029,132608\n76031,70524\n76032,70524\n76033,3069\n76034,70524\n76035,70524\n76036,70524\n76037,75912\n76038,3724\n76039,1265\n76039,1266\n76040,264\n76040,1007\n76040,1551\n76041,718\n76042,76043\n76042,81868\n76044,2105\n76045,1556\n76046,1509\n76047,682\n76048,6837\n76049,1860\n76050,184\n76050,1891\n76051,1782\n76052,467\n76054,457\n76055,4895\n76056,1531\n76057,1238\n76058,146\n76058,15807\n76059,163\n76059,2116\n76060,1\n76060,20\n76060,86\n76060,118\n76060,675\n76060,957\n76060,1815\n76060,1893\n76060,2605\n76060,4597\n76061,70524\n76062,70524\n76063,70524\n76064,772\n76065,70524\n76066,70524\n76067,70524\n76068,70524\n76069,70524\n76070,70524\n76071,70524\n76072,1140\n76072,5547\n76073,70524\n76074,70524\n76075,1140\n76076,70524\n76078,557\n76078,1939\n76079,217\n76080,97\n76080,313\n76080,406\n76080,435\n76080,516\n76080,622\n76080,1370\n76081,309\n76081,310\n76081,1623\n76081,6556\n76082,10\n76082,175\n76083,76084\n76085,1531\n76087,1241\n76088,18726\n76089,19010\n76090,1381\n76092,55849\n76093,1858\n76094,1860\n76096,167\n76096,392\n76096,779\n76096,127158\n76097,298\n76098,485\n76099,516\n76099,599\n76099,1531\n76100,70524\n76101,287\n76101,338\n76101,862\n76101,27041\n76102,70524\n76103,70524\n76104,1749\n76104,14550\n76105,70524\n76106,663\n76106,664\n76106,1849\n76107,70524\n76108,21944\n76108,79349\n76109,70524\n76110,1858\n76111,1860\n76112,70524\n76113,70524\n76114,70524\n76115,70524\n76116,70524\n76117,70524\n76118,70524\n76119,70524\n76120,70524\n76121,70524\n76122,70524\n76123,298\n76124,485\n76125,2421\n76126,70524\n76127,406\n76128,346\n76129,447\n76129,752\n76130,1551\n76131,70524\n76132,859\n76133,70524\n76134,356\n76134,631\n76135,70524\n76137,252\n76137,318\n76138,70524\n76139,1462\n76139,8537\n76140,843\n76141,34\n76141,35\n76141,283\n76141,455\n76141,949\n76141,2266\n76142,467\n76142,868\n76144,313\n76145,644\n76145,1132\n76145,1238\n76146,70524\n76147,72\n76147,81\n76147,111\n76147,215\n76147,227\n76147,233\n76147,312\n76147,372\n76147,388\n76147,557\n76147,605\n76147,626\n76147,1085\n76147,1140\n76147,1149\n76147,1179\n76147,1238\n76147,1479\n76147,1572\n76147,2209\n76147,3538\n76147,3695\n76147,8798\n76147,9018\n76147,14797\n76147,33611\n76148,1\n76149,885\n76150,1010\n76151,1118\n76152,251\n76152,465\n76152,1927\n76153,48\n76154,875\n76155,21944\n76156,2244\n76157,206\n76158,79\n76159,843\n76160,298\n76161,485\n76162,779\n76163,72\n76164,147\n76164,158\n76165,70524\n76166,70524\n76167,852\n76168,70524\n76170,140\n76170,515\n76171,2867\n76171,2868\n76171,22880\n76172,147\n76173,102\n76174,577\n76175,21944\n76176,1274\n76177,346\n76178,483\n76179,2697\n76181,356\n76181,442\n76181,862\n76181,1368\n76181,185877\n76182,111\n76182,240\n76182,503\n76182,932\n76182,1085\n76182,1462\n76182,1818\n76182,2205\n76182,2206\n76182,4355\n76182,8537\n76182,33424\n76182,245910\n76183,366\n76183,500\n76184,151\n76186,34\n76186,35\n76186,261\n76186,313\n76186,431\n76186,442\n76186,518\n76186,609\n76186,626\n76186,634\n76186,749\n76186,775\n76186,818\n76186,1001\n76186,1235\n76186,1285\n76186,1313\n76186,1335\n76186,1715\n76186,1718\n76186,2209\n76186,2443\n76186,2646\n76186,3474\n76186,3804\n76186,5326\n76186,13575\n76186,15807\n76186,21711\n76187,70524\n76188,72\n76189,30\n76190,1882\n76191,41\n76191,97\n76191,285\n76191,640\n76191,668\n76192,3\n76192,34\n76192,35\n76192,63\n76192,106\n76192,158\n76192,178\n76192,192\n76192,202\n76192,203\n76192,217\n76192,251\n76192,252\n76192,318\n76192,337\n76192,346\n76192,435\n76192,465\n76192,516\n76192,586\n76192,622\n76192,640\n76192,663\n76192,664\n76192,694\n76192,1175\n76192,1181\n76192,1220\n76192,1222\n76192,1243\n76192,1294\n76192,1370\n76192,1590\n76192,1635\n76192,2567\n76192,2931\n76192,3161\n76192,4192\n76192,4193\n76192,5874\n76192,5976\n76192,6119\n76192,8598\n76192,8771\n76192,8811\n76192,8822\n76192,8907\n76192,16201\n76193,852\n76194,861\n76195,120\n76196,1085\n76197,1623\n76198,116\n76198,2087\n76199,467\n76199,1345\n76199,9457\n76200,920\n76201,579\n76202,1801\n76203,298\n76204,485\n76205,71\n76207,1556\n76208,1293\n76208,1818\n76208,2620\n76208,5718\n76209,1467\n76210,104\n76211,30\n76212,628\n76212,7358\n76212,7363\n76213,1368\n76214,1939\n76215,4192\n76215,4193\n76216,70524\n76217,1983\n76218,1241\n76220,298\n76221,485\n76222,5343\n76223,581\n76224,18726\n76225,298\n76226,485\n76227,602\n76228,192\n76228,6323\n76229,163\n76230,390\n76231,346\n76232,160\n76233,328\n76233,1608\n76236,602\n76238,772\n76239,99\n76240,58\n76241,46\n76242,850\n76243,422\n76244,56\n76245,76246\n76247,247\n76248,298\n76249,485\n76250,48\n76251,76252\n76251,77291\n76251,79805\n76251,81622\n76251,85296\n76251,85394\n76251,89845\n76251,99841\n76253,561\n76254,3999\n76256,83\n76257,652\n76258,72\n76263,1149\n76263,1631\n76264,30\n76265,6682\n76276,1608\n76277,30\n76282,557\n76283,107\n76284,557\n76285,2244\n76286,76287\n76288,298\n76289,2367\n76290,602\n76291,76292\n76293,65\n76293,184\n76293,195\n76293,222\n76293,571\n76293,1572\n76293,1837\n76293,2089\n76293,2940\n76293,3297\n76293,21944\n76295,310\n76296,147\n76296,158\n76296,206\n76296,254\n76296,406\n76296,455\n76296,779\n76296,1282\n76296,5343\n76297,19413\n76298,430\n76299,577\n76300,76301\n76302,2797\n76303,76304\n76305,217\n76305,1417\n76306,76307\n76308,79\n76309,994\n76310,76311\n76312,366\n76313,81\n76314,298\n76315,485\n76316,602\n76316,611\n76316,1001\n76316,5101\n76317,76318\n76319,70524\n76320,1983\n76321,76322\n76323,1007\n76324,280\n76324,17245\n76325,333\n76326,1140\n76326,3474\n76326,5547\n76327,417\n76328,1\n76330,43203\n76331,4039\n76332,140\n76334,602\n76335,1860\n76336,30\n76337,602\n76338,147\n76338,1462\n76339,349\n76340,1634\n76341,479\n76342,44\n76343,626\n76344,70524\n76345,676\n76346,70524\n76347,192\n76347,663\n76347,1089\n76348,76349\n76350,151\n76351,250\n76351,1684\n76352,70524\n76353,76354\n76355,602\n76356,70524\n76357,832\n76358,50\n76358,79\n76358,393\n76358,406\n76358,493\n76358,585\n76358,586\n76358,592\n76358,704\n76359,70524\n76360,70524\n76361,2351\n76362,15573\n76363,70524\n76364,70524\n76365,76366\n76365,105351\n76367,4475\n76368,70524\n76369,70524\n76370,843\n76371,70524\n76372,70524\n76373,70524\n76374,70524\n76375,70524\n76376,70524\n76377,4193\n76377,8598\n76378,850\n76379,70524\n76380,70524\n76381,70524\n76382,714\n76383,70524\n76384,70524\n76385,70524\n76386,261\n76386,333\n76386,1985\n76387,70524\n76388,17588\n76389,2048\n76390,1133\n76391,272\n76391,7363\n76392,70524\n76393,70524\n76394,70524\n76395,70524\n76396,76397\n76398,70524\n76399,76397\n76401,70524\n76402,76403\n76404,70524\n76405,920\n76406,70524\n76407,2590\n76408,70524\n76409,70524\n76410,72\n76411,70524\n76412,70524\n76413,70524\n76414,70524\n76416,70524\n76417,70524\n76418,79\n76418,704\n76419,70524\n76420,70524\n76421,70524\n76422,70524\n76423,70524\n76424,70524\n76425,70524\n76426,70524\n76427,70524\n76428,70524\n76429,70524\n76430,70524\n76431,70524\n76432,70524\n76433,70524\n76434,66\n76434,1531\n76435,70524\n76436,70524\n76437,70524\n76438,70524\n76439,70524\n76440,70524\n76441,70524\n76442,70524\n76443,8270\n76444,70524\n76445,70524\n76446,1007\n76447,70524\n76448,70524\n76449,70524\n76450,70524\n76451,70524\n76452,1010\n76453,76454\n76455,1363\n76456,70524\n76457,298\n76458,70524\n76459,557\n76460,70524\n76462,70524\n76463,671\n76464,70524\n76465,70524\n76466,70524\n76467,70524\n76468,147\n76469,70524\n76470,70524\n76471,70524\n76472,70524\n76473,70524\n76474,70524\n76475,70524\n76476,620\n76476,1515\n76477,70524\n76478,251\n76478,465\n76478,1531\n76478,2567\n76479,70524\n76480,70524\n76481,70524\n76482,70524\n76483,70524\n76484,76485\n76486,70524\n76487,70524\n76488,70524\n76489,70524\n76490,70524\n76491,70524\n76492,70524\n76493,70524\n76494,1238\n76495,70524\n76496,70524\n76497,70524\n76498,70524\n76499,1452\n76500,70524\n76501,70524\n76502,70524\n76503,70524\n76504,70524\n76505,70524\n76506,217\n76507,70524\n76508,70524\n76509,70524\n76510,70524\n76511,70524\n76512,70524\n76513,70524\n76514,3246\n76515,30\n76516,70524\n76517,70524\n76518,70524\n76519,70524\n76520,70524\n76521,70524\n76523,70524\n76524,70524\n76525,70524\n76526,30\n76527,30\n76528,70524\n76529,70524\n76530,70524\n76531,70524\n76532,70524\n76533,8270\n76534,70524\n76535,13\n76536,70524\n76537,2116\n76538,70524\n76539,349\n76540,70524\n76541,70524\n76542,70524\n76543,70524\n76544,70524\n76545,70524\n76546,17309\n76547,70524\n76548,76549\n76550,70524\n76551,376\n76552,70524\n76553,70524\n76554,76555\n76556,233\n76557,70524\n76558,70524\n76559,70524\n76560,70524\n76561,70524\n76562,70524\n76563,70524\n76564,70524\n76565,70524\n76566,70524\n76567,70524\n76568,70524\n76569,70524\n76570,70524\n76571,222\n76571,592\n76571,1818\n76572,70524\n76573,70524\n76574,70524\n76575,518\n76576,70524\n76577,70524\n76578,70524\n76579,2697\n76580,8270\n76581,70524\n76582,1983\n76583,70524\n76584,70524\n76585,70524\n76586,76587\n76588,70524\n76589,70524\n76590,70524\n76591,30\n76592,70524\n76593,70524\n76595,70524\n76596,70524\n76597,70524\n76598,4101\n76599,70524\n76600,70524\n76601,70524\n76602,805\n76603,70524\n76604,70524\n76605,70524\n76606,298\n76607,485\n76608,47\n76608,2469\n76609,70524\n76610,70524\n76611,70524\n76612,652\n76613,70524\n76614,76615\n76616,70524\n76617,70524\n76618,70524\n76619,70524\n76620,70524\n76621,70524\n76622,70524\n76623,70524\n76624,868\n76625,70524\n76626,70524\n76627,70524\n76628,70524\n76629,70524\n76631,70524\n76632,444\n76633,70524\n76634,422\n76635,56\n76636,1559\n76637,70524\n76638,70524\n76639,70524\n76640,1267\n76641,70524\n76642,119\n76643,79\n76644,70524\n76645,70524\n76646,70524\n76647,70524\n76648,192\n76650,355\n76651,70524\n76652,70524\n76653,70524\n76654,70524\n76656,70524\n76658,70524\n76659,70524\n76660,516\n76661,483\n76662,70524\n76663,70524\n76664,70524\n76665,55849\n76666,70524\n76667,70524\n76668,76669\n76670,70524\n76671,76672\n76673,70524\n76674,94\n76674,2787\n76675,70524\n76676,70524\n76677,76678\n76677,168333\n76677,222692\n76677,234264\n76679,46\n76679,1124\n76680,70524\n76681,70524\n76682,70524\n76683,70524\n76684,604\n76685,980\n76686,70524\n76687,70524\n76688,70524\n76689,2775\n76690,447\n76691,70524\n76692,70524\n76693,70524\n76694,70524\n76695,70524\n76696,660\n76697,70524\n76698,70524\n76699,76700\n76701,1132\n76702,781\n76703,70524\n76705,3\n76705,388\n76705,510\n76706,70524\n76707,422\n76708,56\n76709,862\n76710,70524\n76711,70524\n76712,70524\n76713,70524\n76714,70524\n76715,30\n76715,333\n76715,622\n76716,70524\n76718,726\n76719,70524\n76720,1370\n76720,2782\n76720,3876\n76721,70524\n76722,1414\n76722,1608\n76723,1140\n76724,70524\n76725,422\n76726,171\n76727,422\n76728,422\n76729,422\n76730,70524\n76731,25\n76731,2088\n76732,240\n76732,818\n76733,850\n76734,422\n76735,358\n76735,611\n76736,70524\n76737,422\n76738,422\n76739,422\n76740,70524\n76741,76742\n76743,1858\n76744,1860\n76745,430\n76746,932\n76747,70524\n76749,175\n76749,309\n76749,310\n76749,1177\n76749,2210\n76749,6556\n76750,70524\n76751,70524\n76752,8270\n76753,70524\n76754,70524\n76756,70524\n76757,70524\n76758,1359\n76759,79\n76760,70524\n76761,70524\n76762,70524\n76763,406\n76763,1181\n76765,70524\n76766,70524\n76767,70524\n76768,70524\n76769,70524\n76770,7757\n76771,422\n76772,56\n76773,70524\n76774,1381\n76775,70524\n76776,999\n76777,70524\n76778,70524\n76779,70524\n76780,70524\n76781,83\n76782,70524\n76783,70524\n76784,70524\n76786,70524\n76787,1381\n76788,907\n76788,2191\n76789,6323\n76790,70524\n76791,444\n76791,1608\n76791,2574\n76791,76792\n76791,84173\n76791,86074\n76791,90536\n76791,92214\n76791,96867\n76791,105286\n76791,105426\n76791,108308\n76791,109714\n76791,111247\n76791,111784\n76791,116330\n76791,120298\n76791,120328\n76791,120798\n76791,121120\n76791,122754\n76791,122817\n76791,125685\n76793,70524\n76794,70524\n76796,70524\n76797,1381\n76798,70524\n76799,5591\n76800,604\n76801,652\n76804,8994\n76805,510\n76806,70524\n76807,70524\n76808,509\n76809,70524\n76810,3\n76811,1181\n76812,70524\n76813,275\n76813,313\n76813,775\n76813,1381\n76813,2782\n76814,70524\n76815,58\n76815,126\n76815,441\n76815,535\n76815,872\n76816,70524\n76817,1515\n76818,1572\n76819,6424\n76820,192\n76820,663\n76820,1089\n76821,312\n76822,70524\n76823,70524\n76824,3538\n76825,76826\n76827,338\n76828,104\n76829,79\n76830,178\n76831,2697\n76832,70524\n76833,70524\n76834,2116\n76835,1\n76835,147\n76835,149\n76835,158\n76835,171\n76835,184\n76835,606\n76835,1623\n76835,2438\n76835,26841\n76835,39437\n76835,65723\n76835,71303\n76835,77571\n76835,87870\n76835,112537\n76835,151045\n76836,75912\n76837,76838\n76839,1858\n76840,1860\n76841,1243\n76842,70524\n76843,79\n76844,663\n76844,664\n76845,149\n76846,70524\n76848,70524\n76849,2915\n76850,147\n76850,149\n76850,184\n76850,1425\n76851,346\n76852,70524\n76853,1707\n76855,302\n76856,809\n76857,219\n76858,76859\n76860,1149\n76861,79\n76862,70524\n76863,467\n76864,30\n76865,70524\n76866,106\n76866,192\n76866,337\n76866,435\n76866,447\n76866,726\n76866,1388\n76866,3989\n76866,6119\n76867,333\n76868,70524\n76870,467\n76870,868\n76871,70524\n76873,70524\n76874,207\n76875,7358\n76875,7363\n76876,217\n76877,467\n76878,1663\n76879,1801\n76880,70524\n76881,1313\n76882,664\n76882,809\n76882,1191\n76882,3999\n76883,726\n76884,1858\n76885,1860\n76886,70524\n76887,1556\n76888,1140\n76888,3474\n76889,1323\n76890,102\n76891,1326\n76892,408\n76893,147\n76893,195\n76893,118336\n76894,302\n76894,893\n76895,34\n76895,35\n76895,283\n76895,455\n76895,536\n76895,949\n76895,2266\n76897,861\n76897,2116\n76898,1381\n76899,862\n76899,1381\n76901,673\n76902,43203\n76903,70524\n76904,15523\n76906,1274\n76907,70524\n76908,1381\n76909,859\n76910,726\n76911,1414\n76912,4276\n76913,4146\n76914,2590\n76915,278\n76916,30428\n76918,76919\n76920,602\n76921,467\n76921,868\n76922,3\n76923,1977\n76923,1978\n76924,557\n76924,1082\n76925,171\n76926,298\n76927,485\n76928,3194\n76929,392\n76930,602\n76931,76932\n76933,366\n76934,366\n76935,422\n76935,602\n76936,422\n76937,56\n76938,1849\n76939,557\n76939,1082\n76940,310\n76941,907\n76942,70524\n76943,1849\n76944,859\n76944,1429\n76945,70524\n76947,178\n76948,7358\n76948,7363\n76949,76950\n76951,37414\n76952,79\n76952,192\n76952,483\n76952,714\n76952,1424\n76952,2371\n76952,2617\n76952,32914\n76952,58979\n76952,88266\n76953,1616\n76954,163\n76954,2116\n76955,70524\n76956,875\n76957,70524\n76959,247\n76960,1313\n76961,58\n76962,46\n76963,422\n76964,56\n76965,467\n76966,310\n76967,1381\n76968,217\n76968,455\n76969,809\n76969,920\n76969,1844\n76970,392\n76972,304\n76973,1210\n76973,2372\n76973,2480\n76973,2979\n76974,5405\n76976,861\n76977,9166\n76978,1522\n76979,868\n76981,2574\n76982,298\n76983,485\n76984,298\n76985,485\n76986,298\n76987,485\n76989,392\n76989,1590\n76989,1644\n76991,1881\n76993,393\n76993,980\n76993,1096\n76994,422\n76995,56\n76996,217\n76996,3507\n76996,3804\n76998,809\n77000,2373\n77001,70524\n77003,390\n77004,70524\n77005,83\n77007,366\n77008,41\n77008,68\n77008,240\n77008,294\n77008,431\n77008,631\n77008,760\n77008,784\n77008,805\n77008,818\n77008,1119\n77008,1285\n77008,2995\n77008,3135\n77008,9021\n77009,366\n77010,366\n77011,366\n77012,366\n77013,37\n77014,206\n77015,2379\n77016,417\n77017,861\n77018,366\n77019,750\n77021,366\n77022,1381\n77023,422\n77024,56\n77025,366\n77027,422\n77028,56\n77029,366\n77030,3209\n77031,77032\n77033,70524\n77034,83\n77035,358\n77035,440\n77036,1001\n77037,1235\n77037,1335\n77039,149\n77040,640\n77041,206\n77042,4222\n77043,1\n77044,7572\n77046,79\n77047,602\n77049,647\n77049,1175\n77050,83\n77051,1556\n77052,861\n77053,22\n77054,422\n77055,56\n77057,264\n77058,298\n77059,485\n77060,1515\n77060,30331\n77061,273\n77062,602\n77063,77064\n77065,151\n77066,1849\n77067,1564\n77068,1955\n77069,1893\n77070,422\n77071,56\n77072,3804\n77073,1715\n77074,1231\n77075,390\n77076,3422\n77077,5662\n77078,968\n77079,233\n77080,3\n77081,1001\n77082,63\n77083,14797\n77084,518\n77085,77086\n77087,1449\n77088,3\n77088,510\n77089,1432\n77090,24763\n77091,149\n77091,184\n77091,900\n77091,1425\n77092,1319\n77093,1436\n77094,30\n77095,1287\n77096,298\n77097,485\n77098,222\n77098,1019\n77099,9029\n77100,615\n77102,602\n77103,626\n77104,301\n77104,968\n77104,1782\n77105,79\n77105,1807\n77106,1608\n77107,1247\n77109,518\n77110,4691\n77111,2421\n77112,111\n77113,10\n77113,113156\n77114,919\n77115,79\n77116,356\n77116,2334\n77117,682\n77118,1962\n77119,663\n77119,664\n77120,473\n77121,376\n77122,862\n77123,247\n77124,1639\n77125,2443\n77125,77126\n77127,301\n77127,604\n77127,968\n77128,907\n77128,1462\n77128,8537\n77129,30\n77130,2315\n77131,640\n77132,2146\n77133,668\n77134,333\n77135,252\n77135,318\n77136,77137\n77138,55849\n77139,2367\n77140,1458\n77141,247\n77142,261\n77143,310\n77144,5358\n77144,14352\n77147,2191\n77148,59\n77148,3794\n77150,30\n77151,1235\n77151,1335\n77152,83\n77153,422\n77154,56\n77155,1983\n77156,1983\n77158,422\n77159,56\n77160,1983\n77161,77162\n77161,82456\n77161,93408\n77163,10\n77164,934\n77165,31896\n77166,151\n77167,1608\n77168,4903\n77169,417\n77170,536\n77171,640\n77172,1515\n77173,77174\n77175,225\n77177,1058\n77178,77179\n77180,2617\n77182,72\n77184,4\n77184,5\n77184,22\n77184,65\n77184,72\n77184,119\n77184,192\n77184,195\n77184,206\n77184,209\n77184,217\n77184,248\n77184,305\n77184,340\n77184,435\n77184,442\n77184,479\n77184,491\n77184,536\n77184,595\n77184,622\n77184,628\n77184,818\n77184,861\n77184,872\n77184,893\n77184,920\n77184,994\n77184,1019\n77184,1052\n77184,1305\n77184,1417\n77184,1466\n77184,1612\n77184,1639\n77184,1644\n77184,1818\n77184,1893\n77184,2017\n77184,2073\n77184,2209\n77184,2353\n77184,2443\n77184,2617\n77184,4039\n77184,4823\n77184,8541\n77184,9018\n77184,9029\n77184,13538\n77184,13910\n77184,17309\n77184,20359\n77184,21944\n77185,72\n77186,72\n77187,77188\n77189,872\n77190,267\n77191,2048\n77192,435\n77193,1085\n77194,338\n77196,1556\n77197,392\n77197,697\n77198,32\n77198,34\n77198,35\n77198,50\n77198,63\n77198,99\n77198,106\n77198,134\n77198,192\n77198,195\n77198,215\n77198,217\n77198,233\n77198,251\n77198,252\n77198,272\n77198,289\n77198,290\n77198,298\n77198,318\n77198,323\n77198,332\n77198,333\n77198,336\n77198,337\n77198,392\n77198,393\n77198,406\n77198,430\n77198,447\n77198,465\n77198,493\n77198,516\n77198,525\n77198,585\n77198,586\n77198,592\n77198,609\n77198,615\n77198,620\n77198,622\n77198,663\n77198,664\n77198,779\n77198,788\n77198,805\n77198,862\n77198,907\n77198,925\n77198,980\n77198,1001\n77198,1010\n77198,1033\n77198,1220\n77198,1222\n77198,1231\n77198,1294\n77198,1326\n77198,1388\n77198,1425\n77198,1515\n77198,1531\n77198,1551\n77198,1722\n77198,1955\n77198,2205\n77198,2206\n77198,2210\n77198,2334\n77198,2567\n77198,2782\n77198,2931\n77198,3115\n77198,3148\n77198,3321\n77198,3804\n77198,4237\n77198,6119\n77199,557\n77200,557\n77201,1181\n77202,1227\n77202,1229\n77202,1252\n77202,1253\n77202,86416\n77203,338\n77204,1983\n77205,9457\n77206,77207\n77208,77209\n77210,151\n77211,338\n77212,376\n77213,151\n77214,827\n77215,65\n77216,217\n77217,707\n77219,283\n77220,1623\n77221,252\n77221,318\n77222,417\n77223,885\n77224,10\n77225,338\n77226,346\n77227,1432\n77228,6682\n77229,77230\n77231,18726\n77232,338\n77233,859\n77234,70524\n77235,1564\n77236,6387\n77237,184\n77238,1068\n77239,272\n77240,1381\n77241,736\n77243,588\n77243,590\n77244,338\n77245,3089\n77247,77248\n77249,1\n77250,338\n77251,1087\n77252,644\n77253,77254\n77255,422\n77256,422\n77257,338\n77258,596\n77259,146\n77259,158\n77259,192\n77259,202\n77259,285\n77259,620\n77259,1893\n77259,92476\n77260,77261\n77262,8180\n77264,44\n77265,151\n77266,697\n77267,1634\n77268,77269\n77270,346\n77271,483\n77272,4980\n77273,10\n77274,1858\n77275,1860\n77278,1782\n77279,1858\n77280,1860\n77281,72\n77282,393\n77283,72\n77284,1634\n77285,72\n77286,77287\n77288,6695\n77290,640\n77292,70524\n77294,2421\n77296,1623\n77297,422\n77298,175\n77299,77300\n77299,119706\n77301,250\n77301,1684\n77302,77303\n77304,35687\n77305,77306\n77307,70524\n77308,77309\n77310,147\n77310,149\n77311,70524\n77312,70524\n77313,70524\n77314,72\n77315,1608\n77315,77315\n77316,77317\n77318,1551\n77319,70524\n77320,77321\n77322,77323\n77326,70524\n77327,70524\n77328,70524\n77329,298\n77330,485\n77331,70524\n77332,34\n77332,35\n77333,289\n77333,290\n77334,70524\n77335,70524\n77337,70524\n77338,422\n77339,56\n77340,70524\n77341,422\n77342,56\n77343,70524\n77344,70524\n77345,862\n77345,2590\n77346,77347\n77348,70524\n77349,70524\n77350,1188\n77351,70524\n77352,70524\n77353,77354\n77355,77356\n77357,70524\n77358,70524\n77359,10\n77360,77361\n77363,72\n77364,70524\n77365,70524\n77366,70524\n77367,70524\n77368,52\n77369,70524\n77370,70524\n77371,70524\n77372,72\n77373,70524\n77374,7358\n77374,7363\n77375,70524\n77376,70524\n77377,70524\n77378,147\n77378,158\n77379,192\n77380,70524\n77381,70524\n77382,70524\n77384,70524\n77386,717\n77387,70524\n77388,1659\n77389,77390\n77391,70524\n77392,70524\n77393,70524\n77394,70524\n77395,70524\n77396,70524\n77397,70524\n77398,70524\n77399,70524\n77400,70524\n77401,70524\n77402,77403\n77405,70524\n77406,70524\n77407,70524\n77408,70524\n77409,676\n77410,70524\n77411,77412\n77413,70524\n77414,70524\n77415,30\n77416,70524\n77417,77418\n77419,77418\n77420,70524\n77421,70524\n77422,70524\n77423,366\n77424,22\n77424,809\n77425,366\n77426,366\n77427,366\n77428,366\n77429,366\n77430,366\n77431,366\n77432,366\n77433,366\n77434,70524\n77435,30\n77436,77437\n77438,70524\n77439,200\n77440,77441\n77442,366\n77443,1287\n77444,422\n77445,56\n77446,784\n77447,70524\n77448,323\n77449,1619\n77450,70524\n77451,70524\n77452,70524\n77453,70524\n77454,70524\n77455,70524\n77456,422\n77457,56\n77458,70524\n77459,70524\n77461,652\n77462,70524\n77463,70524\n77464,70524\n77465,872\n77466,70524\n77467,4192\n77467,4193\n77468,70524\n77469,77470\n77471,70524\n77472,70524\n77473,37\n77473,973\n77473,1231\n77473,1740\n77473,189303\n77474,70524\n77475,70524\n77476,70524\n77477,70524\n77478,70524\n77479,70524\n77480,70524\n77481,602\n77482,30\n77483,70524\n77484,298\n77485,485\n77486,1425\n77487,30\n77488,1544\n77489,298\n77490,70524\n77491,70524\n77492,77493\n77494,70524\n77496,355\n77497,1381\n77498,70524\n77499,818\n77500,233\n77501,70524\n77503,70524\n77504,30\n77505,1381\n77506,338\n77507,70524\n77508,70524\n77509,83\n77510,70524\n77511,158\n77511,920\n77511,1425\n77511,1619\n77512,217\n77513,83\n77514,73570\n77515,70524\n77516,602\n77517,298\n77518,485\n77520,636\n77521,70524\n77522,70524\n77524,70524\n77525,1782\n77528,258\n77528,6179\n77528,6180\n77530,70524\n77532,1983\n77534,636\n77535,70524\n77536,1425\n77537,70524\n77538,433\n77539,70524\n77540,70524\n77541,70524\n77542,298\n77543,485\n77544,298\n77545,485\n77546,70524\n77548,70524\n77549,6955\n77550,525\n77552,70524\n77553,70524\n77554,682\n77554,1353\n77554,72439\n77555,1425\n77556,48\n77557,77558\n77560,707\n77561,184\n77562,79\n77562,868\n77564,77565\n77566,1659\n77566,2605\n77566,13361\n77566,68069\n77568,3207\n77569,2775\n77570,2048\n77572,2828\n77573,70524\n77574,70524\n77575,292\n77575,623\n77575,644\n77575,671\n77575,877\n77575,1058\n77575,1179\n77575,1619\n77575,2567\n77575,2701\n77575,2737\n77575,3089\n77575,3331\n77575,4771\n77575,15807\n77575,30331\n77575,52232\n77575,141912\n77576,70524\n77577,21944\n77578,70524\n77579,70524\n77580,298\n77581,485\n77582,70524\n77583,70524\n77584,70524\n77585,70524\n77586,70524\n77587,604\n77589,70524\n77590,70524\n77591,70524\n77593,70524\n77594,422\n77595,422\n77596,70524\n77597,604\n77598,422\n77599,859\n77600,455\n77601,422\n77602,422\n77603,422\n77604,422\n77605,70524\n77606,422\n77607,422\n77608,70524\n77609,70524\n77610,392\n77610,1240\n77611,70524\n77612,604\n77613,70524\n77614,318\n77614,1220\n77614,1222\n77615,70524\n77616,604\n77617,70524\n77618,70524\n77619,70524\n77620,77621\n77622,70524\n77623,70524\n77624,70524\n77625,70524\n77626,83\n77627,5405\n77628,70524\n77629,70524\n77630,70524\n77631,255\n77632,70524\n77633,663\n77633,664\n77634,473\n77635,70524\n77637,698\n77637,1215\n77637,13353\n77637,46638\n77637,80486\n77637,82293\n77637,82300\n77637,82307\n77637,82314\n77637,82320\n77637,82883\n77637,82899\n77637,172623\n77637,175890\n77637,176067\n77637,178584\n77637,184754\n77637,189201\n77638,217\n77639,298\n77640,485\n77641,1579\n77642,6824\n77644,130\n77645,30\n77647,3069\n77648,102\n77649,310\n77650,1619\n77651,309\n77651,310\n77653,8270\n77654,171\n77655,70524\n77657,77658\n77659,222\n77661,79\n77661,704\n77662,358\n77663,136\n77665,424\n77666,77667\n77666,86372\n77666,196068\n77666,206050\n77666,207931\n77666,241392\n77668,70524\n77669,422\n77670,56\n77671,34\n77671,35\n77671,1801\n77671,1973\n77671,3507\n77672,22\n77673,640\n77674,640\n77675,1436\n77676,644\n77677,77677\n77678,167\n77678,615\n77678,2083\n77679,1353\n77680,422\n77681,56\n77682,885\n77683,1203\n77684,1962\n77685,1323\n77686,102\n77687,1326\n77688,408\n77689,875\n77690,1782\n77691,1177\n77691,2210\n77692,1353\n77694,557\n77694,907\n77694,1849\n77694,4355\n77695,81\n77696,70524\n77697,1001\n77698,298\n77699,485\n77700,298\n77701,485\n77702,1467\n77703,602\n77704,1019\n77705,602\n77706,77707\n77708,136\n77710,81\n77710,503\n77710,3507\n77712,298\n77713,485\n77714,70524\n77715,13\n77716,86\n77716,491\n77716,1522\n77716,75912\n77717,1973\n77718,77719\n77718,78625\n77718,84997\n77718,90021\n77718,101215\n77721,34\n77721,35\n77722,455\n77722,1805\n77723,70524\n77724,151\n77725,875\n77725,1276\n77726,8992\n77727,31934\n77729,158\n77730,1977\n77730,1978\n77731,77732\n77733,10\n77733,158\n77733,3999\n77733,28149\n77734,1402\n77735,83\n77735,211\n77735,3297\n77736,2737\n77737,518\n77738,3193\n77739,31122\n77740,4611\n77741,1544\n77742,309\n77742,310\n77743,147\n77743,349\n77743,668\n77743,1402\n77743,2373\n77743,75912\n77744,3\n77745,346\n77746,298\n77747,485\n77748,77749\n77750,3769\n77751,258\n77752,818\n77753,302\n77754,298\n77755,485\n77756,298\n77757,485\n77758,4355\n77759,34\n77759,35\n77759,2646\n77760,70524\n77761,1858\n77762,1860\n77763,1425\n77764,310\n77764,76096\n77765,390\n77766,298\n77767,422\n77768,56\n77769,623\n77769,1805\n77771,77772\n77773,2512\n77774,1782\n77775,83\n77776,298\n77777,485\n77778,1983\n77779,267\n77780,1381\n77781,623\n77781,1805\n77782,2205\n77782,2206\n77783,10\n77784,58\n77785,46\n77786,859\n77787,1858\n77788,1860\n77789,615\n77789,1782\n77790,1381\n77791,392\n77792,328\n77793,2105\n77794,18726\n77795,835\n77796,298\n77797,485\n77799,48\n77800,77801\n77800,87603\n77802,48\n77803,48\n77804,48\n77805,718\n77806,83\n77807,859\n77808,609\n77808,2315\n77808,2775\n77810,77811\n77810,246626\n77813,192\n77815,3252\n77816,287\n77816,809\n77816,19010\n77817,818\n77818,4771\n77819,818\n77820,8598\n77821,2646\n77822,77822\n77823,1893\n77824,392\n77825,30\n77826,1983\n77827,55849\n77828,25222\n77830,713\n77831,2775\n77832,107\n77832,2646\n77833,1118\n77836,97\n77836,211\n77836,861\n77837,3\n77838,827\n77839,783\n77840,77841\n77842,392\n77843,1531\n77845,70524\n77846,273\n77846,313\n77847,158\n77848,93\n77849,30\n77851,77852\n77853,151\n77854,779\n77854,1033\n77855,536\n77856,4597\n77857,313\n77857,2421\n77858,1837\n77859,1556\n77860,994\n77861,147\n77861,1247\n77861,164572\n77862,450\n77863,2379\n77864,4192\n77864,4193\n77865,2626\n77866,338\n77867,516\n77868,623\n77868,1805\n77869,7358\n77869,7363\n77870,843\n77871,1289\n77872,338\n77873,2979\n77874,3451\n77874,3452\n77875,1133\n77876,302\n77877,338\n77879,336\n77880,151\n77881,289\n77881,290\n77882,602\n77883,579\n77883,811\n77884,34\n77884,35\n77885,310\n77886,206\n77887,557\n77888,72\n77890,147\n77891,72\n77892,72\n77893,22\n77894,136\n77895,1274\n77896,72\n77897,344\n77898,285\n77899,207\n77900,15119\n77901,358\n77902,107\n77903,298\n77904,485\n77905,818\n77906,56\n77906,1181\n77907,346\n77908,72\n77909,252\n77909,318\n77910,29294\n77911,298\n77912,485\n77913,72\n77914,2116\n77915,222\n77916,1707\n77918,202\n77918,406\n77918,1085\n77918,1749\n77919,72\n77919,588\n77919,590\n77920,77921\n77923,72\n77924,349\n77925,9012\n77926,83\n77927,489\n77928,59870\n77929,2931\n77930,79\n77931,104\n77932,79\n77933,1287\n77934,577\n77935,772\n77936,9029\n77937,8719\n77938,138\n77939,865\n77940,557\n77941,137\n77942,72\n77943,118\n77943,4597\n77944,21944\n77945,349\n77946,1858\n77947,1860\n77948,72\n77949,252\n77949,318\n77949,1220\n77950,134\n77951,72\n77952,452\n77953,636\n77954,557\n77955,557\n77956,557\n77957,3297\n77958,77959\n77960,1019\n77961,77962\n77961,82463\n77961,92449\n77961,115846\n77961,118796\n77961,121834\n77961,129276\n77963,77964\n77966,14989\n77967,349\n77968,219\n77969,72\n77970,1285\n77971,2775\n77972,447\n77973,77974\n77975,72\n77976,527\n77977,779\n77978,30\n77979,23010\n77980,690\n77981,7652\n77982,602\n77983,907\n77984,6068\n77985,30\n77986,8855\n77987,68069\n77987,77988\n77987,86832\n77989,2351\n77990,77991\n77992,557\n77993,147\n77993,158\n77993,206\n77993,779\n77993,6279\n77993,23783\n77993,80266\n77994,2995\n77995,70524\n77996,5591\n77997,779\n77998,44\n77999,795\n77999,3804\n77999,4039\n78000,2590\n78001,809\n78002,636\n78003,207\n78004,602\n78006,644\n78007,10\n78008,872\n78009,1429\n78010,640\n78011,668\n78012,78013\n78012,97747\n78012,111658\n78012,116367\n78012,120600\n78012,140372\n78012,153789\n78012,172885\n78012,186199\n78012,224409\n78014,9560\n78015,779\n78016,211\n78017,78018\n78019,483\n78020,78021\n78022,18726\n78023,195\n78024,2146\n78025,78026\n78025,78954\n78027,261\n78028,424\n78028,1402\n78029,577\n78031,78032\n78031,176598\n78033,376\n78034,70524\n78035,70524\n78036,70524\n78037,30\n78037,81\n78037,104\n78037,1745\n78038,70524\n78039,78040\n78041,70524\n78042,1143\n78043,30\n78044,805\n78045,70524\n78046,70524\n78047,818\n78049,31934\n78050,225\n78051,652\n78052,333\n78053,78054\n78053,85207\n78053,85603\n78053,100580\n78053,104957\n78053,105191\n78053,122814\n78053,159237\n78053,166565\n78053,170102\n78053,178345\n78053,182324\n78053,193740\n78053,199000\n78053,199163\n78053,215758\n78053,226420\n78053,227824\n78053,244524\n78053,245216\n78053,246877\n78053,259926\n78053,260713\n78055,8884\n78056,2411\n78057,70524\n78058,2048\n78059,192\n78059,663\n78059,3872\n78060,24505\n78061,24505\n78062,24505\n78063,850\n78064,779\n78066,1085\n78067,78067\n78068,207\n78069,78070\n78071,8270\n78072,78073\n78074,1962\n78075,72\n78076,328\n78077,68467\n78078,70524\n78079,78080\n78079,128543\n78081,422\n78082,56\n78084,18726\n78085,366\n78086,366\n78087,366\n78088,366\n78089,70524\n78090,333\n78091,393\n78092,70524\n78093,233\n78095,78096\n78097,70524\n78098,9195\n78099,70524\n78100,72\n78101,702\n78102,949\n78103,78104\n78105,713\n78106,1711\n78107,147\n78107,602\n78108,93\n78109,431\n78110,78111\n78110,141106\n78112,78113\n78114,1231\n78115,5405\n78116,78117\n78118,355\n78119,70524\n78122,70524\n78123,1515\n78124,503\n78125,78126\n78127,1608\n78127,77315\n78128,932\n78129,72\n78130,685\n78131,298\n78132,485\n78133,994\n78134,202\n78134,203\n78135,1379\n78136,83\n78137,1140\n78137,5547\n78138,83\n78139,78140\n78141,298\n78142,485\n78143,78144\n78145,264\n78145,1381\n78146,1844\n78147,5726\n78148,1983\n78149,83\n78150,83\n78151,83\n78152,83\n78153,83\n78154,209\n78154,1631\n78155,1323\n78156,102\n78157,1326\n78158,408\n78159,720\n78160,1033\n78161,431\n78161,1252\n78161,1253\n78162,2931\n78163,1509\n78164,628\n78165,336\n78165,718\n78166,30\n78167,18726\n78168,872\n78169,158\n78170,586\n78171,78172\n78174,1425\n78175,422\n78176,78177\n78178,7316\n78179,298\n78180,485\n78181,392\n78182,4039\n78183,78184\n78185,346\n78186,1014\n78188,15119\n78189,6263\n78190,1240\n78190,6955\n78191,55849\n78192,192\n78193,602\n78194,304\n78195,79\n78196,3872\n78197,298\n78198,485\n78199,1309\n78200,30\n78201,1983\n78202,255\n78203,602\n78204,255\n78205,8788\n78206,78207\n78208,30\n78209,406\n78210,78211\n78213,10\n78214,30\n78215,30\n78216,872\n78217,206\n78218,72\n78219,72\n78220,72\n78221,72\n78222,70524\n78223,4980\n78224,907\n78225,366\n78226,2048\n78227,13136\n78228,483\n78229,1287\n78230,72\n78231,78232\n78233,160\n78234,805\n78235,30\n78236,39247\n78237,86\n78237,167\n78237,217\n78237,589\n78237,605\n78237,615\n78237,907\n78237,973\n78237,1001\n78237,1124\n78237,1167\n78237,1241\n78237,1782\n78237,1785\n78237,1955\n78237,3193\n78238,78239\n78240,70524\n78241,70524\n78242,1127\n78242,1893\n78243,178\n78244,44\n78245,30\n78246,376\n78247,258\n78248,3447\n78249,10\n78250,137\n78252,30\n78253,298\n78254,485\n78255,1479\n78256,68467\n78257,22\n78257,211\n78257,1267\n78257,37414\n78258,779\n78259,10\n78261,78262\n78263,78264\n78265,640\n78266,146\n78268,151\n78269,346\n78270,78271\n78272,78273\n78272,128568\n78275,1072\n78278,1332\n78279,4548\n78280,151\n78282,78283\n78284,78283\n78286,78287\n78288,78289\n78291,1983\n78292,78293\n78292,82960\n78295,393\n78296,8991\n78297,450\n78297,4193\n78298,664\n78298,4475\n78299,70524\n78301,292\n78302,178\n78303,30\n78304,280\n78304,17245\n78306,78307\n78308,78309\n78310,2867\n78310,22880\n78311,175\n78311,78312\n78311,155612\n78315,78316\n78315,80810\n78315,83522\n78318,346\n78319,78320\n78321,167\n78322,2787\n78323,17588\n78324,233\n78325,78326\n78327,1192\n78328,355\n78329,3413\n78330,78331\n78332,70524\n78333,70524\n78334,70524\n78335,70524\n78336,70524\n78337,70524\n78338,70524\n78339,22924\n78340,1133\n78341,22\n78342,30\n78343,3069\n78344,4810\n78345,1419\n78346,30\n78347,623\n78348,779\n78349,379\n78349,3538\n78350,364\n78351,240\n78352,106\n78352,586\n78352,17772\n78353,222\n78354,188\n78355,602\n78356,7757\n78357,3960\n78359,219\n78360,30\n78361,30\n78362,192\n78363,70524\n78364,83\n78365,8991\n78366,151\n78367,209\n78368,2506\n78369,872\n78370,872\n78371,30\n78372,68\n78373,2697\n78374,289\n78374,290\n78375,178\n78376,70524\n78378,147\n78378,192\n78378,1033\n78378,1127\n78378,1181\n78378,1893\n78378,3872\n78378,5547\n78378,49057\n78379,575\n78380,211\n78381,94\n78382,1634\n78383,3413\n78384,1188\n78385,30\n78386,267\n78387,107\n78388,2416\n78388,2417\n78389,292\n78390,338\n78391,298\n78392,1133\n78393,3538\n78394,346\n78395,30\n78396,483\n78397,640\n78397,726\n78397,7124\n78397,7270\n78398,187\n78399,78400\n78401,217\n78402,34\n78402,35\n78403,30\n78404,1634\n78405,1962\n78406,3003\n78407,30\n78408,30\n78409,3999\n78410,72\n78411,644\n78412,1962\n78414,78415\n78416,376\n78417,5405\n78418,431\n78419,30\n78420,450\n78421,433\n78422,273\n78423,78424\n78425,31934\n78426,78427\n78428,592\n78429,349\n78430,1707\n78431,1634\n78432,1707\n78433,30\n78434,1285\n78435,102\n78436,99\n78437,602\n78438,298\n78439,485\n78440,422\n78441,56\n78442,31934\n78443,557\n78444,862\n78445,557\n78446,45960\n78447,30\n78448,298\n78449,9030\n78450,557\n78451,44\n78452,557\n78454,1707\n78455,8270\n78456,1127\n78457,893\n78458,1531\n78459,72\n78460,1849\n78461,1\n78461,4\n78461,5\n78461,8\n78461,11\n78461,20\n78461,48\n78461,130\n78461,160\n78461,430\n78461,668\n78461,736\n78461,3612\n78461,4252\n78461,16687\n78462,450\n78463,3\n78463,50\n78463,147\n78463,285\n78463,392\n78463,516\n78463,779\n78463,1243\n78463,1289\n78463,1298\n78463,1411\n78464,9195\n78465,450\n78466,450\n78467,2929\n78468,78469\n78470,158\n78471,349\n78471,392\n78472,1127\n78473,30\n78475,30\n78476,78477\n78478,30\n78479,647\n78480,31896\n78481,30\n78482,298\n78483,485\n78485,602\n78486,10\n78487,337\n78488,78489\n78490,602\n78491,602\n78492,602\n78493,602\n78494,602\n78495,602\n78496,602\n78497,192\n78497,202\n78497,203\n78497,422\n78497,516\n78498,70524\n78499,1235\n78499,1335\n78500,1231\n78500,1462\n78501,693\n78501,3370\n78502,70524\n78503,366\n78504,49887\n78505,8990\n78506,70524\n78507,70524\n78508,70524\n78509,70524\n78510,55479\n78511,70524\n78512,70524\n78513,70524\n78514,50\n78515,50\n78516,70524\n78517,70524\n78518,70524\n78519,78520\n78519,95726\n78519,110976\n78521,70524\n78522,70524\n78523,70524\n78524,70524\n78525,586\n78526,70524\n78527,70524\n78528,70524\n78529,70524\n78530,70524\n78531,72\n78532,63\n78533,78534\n78535,255\n78536,72\n78537,70524\n78538,872\n78539,70524\n78540,10\n78541,254\n78542,70524\n78543,70524\n78544,70524\n78545,70524\n78546,70524\n78547,70524\n78548,70524\n78549,70524\n78550,70524\n78551,70524\n78552,292\n78553,70524\n78554,818\n78555,294\n78556,296\n78557,298\n78558,70524\n78559,70524\n78560,70524\n78561,932\n78562,70524\n78563,652\n78564,70524\n78565,70524\n78566,70524\n78567,70524\n78568,70524\n78569,366\n78570,366\n78571,70524\n78572,70524\n78573,298\n78574,70524\n78575,70524\n78576,70524\n78577,70524\n78578,70524\n78579,70524\n78580,70524\n78581,70524\n78582,70524\n78583,17588\n78584,140\n78584,1462\n78585,70524\n78586,2048\n78587,70524\n78588,1238\n78589,70524\n78590,70524\n78591,1181\n78592,1452\n78593,70524\n78594,70524\n78595,22924\n78596,70524\n78597,70524\n78598,420\n78599,70524\n78600,70524\n78601,233\n78603,70524\n78604,70524\n78605,200\n78605,248\n78606,70524\n78607,70524\n78608,70524\n78609,79\n78610,70524\n78611,70524\n78612,70524\n78613,70524\n78614,70524\n78615,70524\n78616,66\n78617,70524\n78618,9560\n78619,70524\n78620,18726\n78622,70524\n78623,818\n78623,32751\n78624,355\n78626,70524\n78627,1773\n78628,70524\n78629,874\n78630,70524\n78632,70524\n78633,70524\n78634,70524\n78636,70524\n78637,70524\n78638,2116\n78639,862\n78639,991\n78640,70524\n78641,70524\n78642,78643\n78642,123756\n78645,70524\n78646,2116\n78647,255\n78648,1201\n78649,70524\n78650,1332\n78651,75912\n78652,70524\n78653,1122\n78653,75912\n78654,70524\n78655,70524\n78656,1287\n78657,3413\n78658,70524\n78659,70524\n78660,70524\n78661,1247\n78662,17334\n78664,30\n78665,25344\n78666,943\n78667,577\n78667,1388\n78669,527\n78669,740\n78669,741\n78670,70524\n78671,1012\n78672,75912\n78673,70524\n78674,713\n78675,875\n78676,1284\n78677,70524\n78678,690\n78680,70524\n78681,70524\n78685,78686\n78687,70524\n78688,60576\n78689,70524\n78690,97\n78691,805\n78692,70524\n78693,70524\n78694,70524\n78695,671\n78696,714\n78696,1572\n78697,14133\n78697,16309\n78697,38822\n78698,298\n78699,485\n78700,310\n78701,70524\n78702,50\n78702,779\n78703,557\n78703,1939\n78703,5405\n78704,70524\n78705,1454\n78706,70524\n78709,298\n78710,485\n78711,79\n78712,1127\n78713,70524\n78714,70524\n78715,264\n78715,1659\n78716,698\n78717,202\n78717,301\n78717,1688\n78718,111\n78718,289\n78718,290\n78718,94134\n78719,78720\n78719,89061\n78721,991\n78721,2312\n78722,640\n78723,640\n78724,640\n78725,579\n78725,63471\n78726,422\n78727,10\n78729,850\n78730,422\n78731,422\n78732,422\n78733,422\n78734,422\n78735,483\n78736,422\n78737,22\n78737,366\n78737,996\n78738,422\n78740,1052\n78741,422\n78742,422\n78743,422\n78744,875\n78745,442\n78746,104\n78746,489\n78747,2995\n78748,70524\n78751,920\n78752,70524\n78753,34\n78753,35\n78754,83\n78755,72\n78756,344\n78757,285\n78758,422\n78759,140\n78760,264\n78761,70524\n78762,3252\n78763,34\n78763,158\n78765,5212\n78766,70524\n78767,392\n78768,140\n78769,70524\n78770,298\n78771,485\n78772,104\n78772,134\n78772,1844\n78773,70524\n78774,298\n78775,485\n78776,3538\n78777,70524\n78778,70524\n78779,1127\n78780,70524\n78781,1983\n78782,298\n78783,485\n78784,70524\n78785,70524\n78786,70524\n78788,70524\n78789,70524\n78790,1715\n78791,70524\n78792,347\n78792,356\n78792,1955\n78792,2572\n78792,4222\n78793,70524\n78794,79\n78795,70524\n78796,70524\n78797,7\n78798,309\n78798,310\n78799,70524\n78800,70524\n78802,78803\n78804,3003\n78806,240\n78808,171\n78809,2775\n78810,447\n78811,1127\n78814,56\n78814,1181\n78815,58\n78816,46\n78817,70524\n78818,72\n78819,1323\n78820,102\n78821,1326\n78822,408\n78823,1782\n78823,2353\n78824,1556\n78825,318\n78825,1220\n78825,1222\n78826,477\n78827,70524\n78828,703\n78828,843\n78828,1453\n78828,1465\n78828,2697\n78828,24763\n78829,6638\n78830,298\n78831,485\n78832,71\n78832,811\n78832,1634\n78832,1881\n78832,3769\n78835,1012\n78836,1836\n78837,1506\n78838,3413\n78839,195\n78839,457\n78839,2367\n78839,4039\n78839,13136\n78840,97\n78841,302\n78842,349\n78843,79\n78844,30\n78845,1392\n78846,136\n78846,298\n78846,417\n78846,557\n78846,1612\n78847,171\n78848,907\n78849,1454\n78850,852\n78851,78852\n78851,84073\n78851,87636\n78851,95765\n78851,100545\n78853,273\n78853,483\n78853,1116\n78853,30427\n78854,2116\n78855,557\n78856,477\n78857,41\n78858,485\n78858,615\n78859,7358\n78859,7363\n78860,2116\n78861,217\n78861,1274\n78862,2116\n78863,8270\n78864,30\n78865,1454\n78866,801\n78867,1962\n78869,818\n78870,79\n78871,5405\n78872,147\n78872,158\n78872,252\n78874,1033\n78875,60576\n78877,248\n78877,364\n78878,9560\n78879,493\n78879,1927\n78880,1052\n78880,1623\n78882,1732\n78882,187176\n78883,252\n78884,1309\n78885,1140\n78885,5547\n78886,30\n78887,1033\n78888,875\n78889,30\n78890,1801\n78891,41\n78891,104\n78891,289\n78891,298\n78891,588\n78891,590\n78891,1085\n78891,1119\n78891,1179\n78891,1715\n78891,1749\n78891,1962\n78891,4237\n78891,4771\n78891,94134\n78891,205488\n78892,252\n78893,827\n78895,14989\n78896,30\n78897,1707\n78898,775\n78899,78900\n78901,217\n78903,30\n78904,408\n78907,503\n78908,8270\n78909,1\n78909,79\n78910,733\n78911,217\n78911,1417\n78913,2048\n78914,298\n78915,485\n78916,240\n78917,304\n78918,247\n78919,1801\n78920,422\n78921,56\n78922,1033\n78924,592\n78925,2116\n78926,422\n78927,56\n78928,202\n78928,203\n78929,202\n78929,203\n78930,202\n78930,203\n78931,202\n78931,203\n78932,509\n78932,510\n78932,1043\n78933,10\n78934,136\n78935,1181\n78936,77\n78936,233\n78936,283\n78936,1105\n78936,1363\n78937,298\n78938,485\n78939,1796\n78942,417\n78943,1556\n78944,4\n78944,5\n78944,192\n78945,298\n78946,485\n78947,111\n78947,557\n78948,1151\n78949,1801\n78950,827\n78951,120\n78951,1374\n78952,318\n78952,1220\n78952,1222\n78953,483\n78955,72\n78956,215\n78957,1983\n78958,1001\n78959,980\n78960,79\n78961,1010\n78962,872\n78964,70524\n78965,1506\n78966,160\n78966,1289\n78966,49057\n78967,332\n78968,663\n78968,664\n78969,663\n78969,664\n78970,663\n78970,664\n78971,2178\n78971,2979\n78971,4545\n78972,2156\n78972,9343\n78974,72\n78975,252\n78975,318\n78976,151\n78977,422\n78978,56\n78979,1227\n78979,1229\n78979,86416\n78981,805\n78981,1149\n78982,516\n78983,10\n78983,251\n78983,516\n78983,1175\n78983,1512\n78983,5992\n78983,78984\n78986,1033\n78988,79\n78989,1983\n78990,1243\n78991,192\n78992,602\n78993,298\n78994,602\n78996,1133\n78997,298\n78998,485\n78999,538\n79000,557\n79001,8798\n79002,515\n79003,577\n79004,980\n79005,151\n79005,3623\n79006,622\n79006,1033\n79007,557\n79008,376\n79009,1285\n79010,934\n79010,1033\n79011,310\n79012,83\n79014,24505\n79015,19443\n79016,298\n79017,485\n79018,252\n79018,318\n79019,2416\n79019,2417\n79020,134\n79021,1309\n79022,247\n79023,30\n79024,30\n79027,30\n79028,30\n79029,30\n79030,2135\n79031,233\n79031,240\n79031,590\n79031,592\n79031,631\n79031,805\n79031,1785\n79031,1818\n79031,2620\n79031,5718\n79032,693\n79033,30\n79034,126\n79035,298\n79036,485\n79037,328\n79037,932\n79037,954\n79037,1016\n79037,1149\n79037,10318\n79038,30\n79039,557\n79040,657\n79041,615\n79042,1117\n79043,160\n79044,358\n79045,30\n79046,41\n79047,104\n79048,557\n79049,8270\n79050,30\n79051,298\n79052,485\n79053,298\n79054,485\n79055,22\n79055,2372\n79056,1707\n79057,1117\n79058,557\n79059,1298\n79060,1298\n79061,557\n79062,557\n79063,8854\n79064,44\n79065,83\n79066,2116\n79067,9560\n79068,298\n79069,485\n79070,3069\n79071,602\n79072,481\n79073,65\n79074,622\n79075,1227\n79075,1229\n79076,417\n79077,452\n79078,21944\n79079,3\n79080,2205\n79080,2206\n79081,298\n79082,485\n79083,577\n79084,392\n79084,1240\n79084,1454\n79085,30\n79086,1782\n79087,160\n79088,626\n79089,273\n79090,417\n79091,849\n79093,450\n79094,30\n79095,30\n79096,30\n79097,602\n79098,602\n79099,30\n79100,30\n79101,602\n79102,14366\n79103,72\n79104,30\n79105,2590\n79106,417\n79107,72\n79108,79109\n79110,70524\n79111,994\n79112,70524\n79114,1332\n79115,636\n79116,207\n79117,900\n79118,70524\n79119,1019\n79120,70524\n79121,70524\n79122,19986\n79123,70524\n79124,175\n79125,70524\n79126,70524\n79127,872\n79128,70524\n79129,70524\n79130,1429\n79131,70524\n79132,70524\n79133,70524\n79134,602\n79135,70524\n79136,70524\n79137,83\n79139,70524\n79140,1127\n79141,70524\n79142,70524\n79143,668\n79145,4066\n79146,70524\n79147,70524\n79148,70524\n79149,70524\n79150,70524\n79151,70524\n79152,70524\n79153,862\n79153,2590\n79154,376\n79155,885\n79156,70524\n79157,70524\n79158,70524\n79159,68467\n79160,70524\n79161,602\n79162,70524\n79163,70524\n79164,70524\n79165,70524\n79166,70524\n79167,70524\n79168,70524\n79169,70524\n79170,70524\n79171,70524\n79172,70524\n79173,70524\n79174,70524\n79175,70524\n79176,79177\n79178,70524\n79179,70524\n79180,70524\n79182,70524\n79183,70524\n79184,70524\n79185,70524\n79186,577\n79187,323\n79188,70524\n79189,70524\n79190,968\n79191,70524\n79192,70524\n79193,1210\n79194,70524\n79195,70524\n79196,70524\n79197,70524\n79198,70524\n79199,70524\n79200,70524\n79201,2574\n79201,79202\n79203,70524\n79204,70524\n79205,1007\n79206,301\n79206,968\n79206,1837\n79206,2083\n79207,70524\n79208,70524\n79209,70524\n79210,79211\n79212,70524\n79213,70524\n79214,83\n79215,70524\n79216,1379\n79217,70524\n79218,298\n79219,485\n79220,602\n79221,298\n79222,485\n79223,70524\n79224,70524\n79225,70524\n79226,70524\n79227,70524\n79228,70524\n79229,1085\n79230,70524\n79231,70524\n79232,233\n79233,70524\n79234,70524\n79236,70524\n79237,70524\n79239,70524\n79241,70524\n79243,2315\n79243,2701\n79244,366\n79245,1977\n79245,1978\n79246,366\n79247,70524\n79248,366\n79249,388\n79250,70524\n79251,70524\n79252,2116\n79253,70524\n79254,309\n79254,310\n79255,79256\n79257,70524\n79258,70524\n79259,70524\n79260,70524\n79261,10\n79261,1235\n79262,70524\n79263,827\n79264,70524\n79265,298\n79266,485\n79267,4177\n79268,247\n79269,685\n79269,4545\n79269,21944\n79269,139010\n79270,195\n79271,184\n79272,2775\n79273,447\n79274,70524\n79275,70524\n79276,50\n79277,10\n79278,248\n79279,70524\n79280,81\n79281,70524\n79282,70524\n79284,70524\n79285,9012\n79286,1353\n79287,70524\n79288,70524\n79289,1467\n79290,1381\n79291,1381\n79292,1381\n79294,163\n79295,222\n79295,220502\n79296,1143\n79297,79298\n79297,120544\n79299,392\n79301,328\n79302,450\n79303,5101\n79303,5102\n79304,158\n79305,147\n79305,195\n79305,4193\n79306,273\n79306,360\n79306,818\n79306,6695\n79307,1353\n79308,8855\n79309,298\n79310,485\n79311,298\n79312,485\n79313,657\n79313,2421\n79315,79316\n79317,79318\n79319,355\n79320,4\n79320,5\n79320,134\n79320,527\n79320,743\n79320,1984\n79320,2674\n79320,4810\n79320,8714\n79320,21944\n79320,95152\n79321,292\n79322,1127\n79323,1146\n79324,1167\n79325,79326\n79327,222\n79327,4637\n79328,1893\n79329,859\n79331,24505\n79332,8180\n79334,1509\n79334,1688\n79337,1179\n79338,1359\n79340,389\n79340,1313\n79341,4504\n79342,707\n79343,433\n79344,292\n79345,305\n79346,16153\n79347,640\n79348,640\n79350,1140\n79351,79352\n79353,690\n79355,2116\n79356,285\n79356,1655\n79356,92476\n79358,652\n79359,251\n79359,516\n79359,663\n79359,1175\n79359,1243\n79360,1016\n79360,2209\n79361,422\n79362,18726\n79363,422\n79364,422\n79365,422\n79366,422\n79367,577\n79367,788\n79367,1070\n79367,138686\n79370,7124\n79371,3003\n79372,79352\n79373,2674\n79373,16153\n79375,422\n79376,422\n79377,422\n79378,3960\n79379,1010\n79381,527\n79381,740\n79381,741\n79381,743\n79382,1707\n79384,4691\n79385,3413\n79386,1635\n79387,779\n79388,874\n79389,83\n79390,1140\n79391,1531\n79392,868\n79394,602\n79396,483\n79396,657\n79396,6556\n79396,232766\n79397,278\n79397,431\n79397,1252\n79397,1253\n79398,299\n79399,932\n79400,17588\n79401,422\n79402,1119\n79403,907\n79405,422\n79406,56\n79407,657\n79408,171\n79409,360\n79411,1227\n79411,1229\n79412,1\n79412,79\n79412,387\n79413,1227\n79413,1229\n79413,86416\n79414,622\n79415,248\n79416,602\n79417,579\n79417,868\n79417,9457\n79418,1012\n79419,422\n79420,56\n79421,422\n79422,79423\n79422,99946\n79425,151\n79426,602\n79429,301\n79431,1001\n79432,389\n79433,206\n79434,602\n79435,58\n79436,602\n79437,1231\n79438,5718\n79439,1564\n79440,2083\n79441,2620\n79442,388\n79443,1837\n79444,687\n79445,3422\n79446,5662\n79447,3193\n79448,1955\n79449,1782\n79450,301\n79451,1522\n79452,2191\n79453,3194\n79454,907\n79455,1167\n79456,968\n79457,1544\n79458,3218\n79459,3207\n79460,3138\n79461,1298\n79462,720\n79463,195\n79464,147\n79464,195\n79467,22293\n79468,1231\n79469,1858\n79470,1860\n79471,934\n79471,1033\n79473,586\n79473,1001\n79473,1285\n79475,137\n79475,200\n79476,79477\n79478,592\n79479,171\n79480,289\n79480,290\n79481,1893\n79482,1571\n79483,424\n79483,1634\n79484,516\n79485,269\n79485,315\n79485,805\n79485,994\n79485,1147\n79485,1844\n79485,3695\n79485,7698\n79486,2205\n79486,2206\n79487,422\n79488,79489\n79490,56\n79492,1323\n79493,102\n79494,240\n79495,1326\n79496,408\n79497,2315\n79498,6726\n79499,2367\n79500,9010\n79501,8990\n79503,2646\n79504,310\n79505,1210\n79506,861\n79507,417\n79508,2775\n79509,447\n79510,68\n79511,240\n79512,467\n79512,1893\n79513,264\n79515,389\n79515,1072\n79516,1033\n79517,784\n79517,2646\n79519,720\n79520,310\n79521,2674\n79522,252\n79523,579\n79524,104\n79524,134\n79524,138\n79525,1058\n79526,48\n79527,707\n79527,1447\n79528,299\n79528,457\n79528,467\n79528,623\n79528,717\n79528,972\n79528,1001\n79528,1240\n79528,1293\n79528,1776\n79528,1803\n79528,75912\n79528,118336\n79528,141912\n79529,2674\n79529,16153\n79530,422\n79531,56\n79532,147\n79532,149\n79532,397\n79533,34\n79533,35\n79533,1284\n79533,7698\n79534,640\n79535,1019\n79536,8868\n79537,17588\n79538,422\n79539,56\n79540,111\n79540,240\n79542,1010\n79543,2574\n79544,364\n79544,431\n79545,500\n79546,222\n79546,79547\n79546,88092\n79546,89930\n79546,92627\n79546,100608\n79546,103615\n79546,104566\n79546,105301\n79546,108480\n79546,110465\n79546,110900\n79546,111003\n79546,111061\n79546,111347\n79546,111670\n79546,111991\n79546,112038\n79546,112144\n79546,112718\n79546,113289\n79546,113432\n79546,113600\n79546,113821\n79546,114311\n79546,114609\n79546,114758\n79546,114879\n79546,114972\n79546,115148\n79546,115331\n79546,115442\n79546,116231\n79546,116354\n79546,116851\n79546,117347\n79546,117372\n79546,117491\n79546,117515\n79546,117524\n79546,117574\n79546,117709\n79546,118067\n79546,119632\n79546,119762\n79546,120051\n79546,120650\n79546,122129\n79546,122311\n79546,122625\n79546,122846\n79546,123162\n79546,123711\n79546,123741\n79546,123810\n79546,124826\n79546,125210\n79546,125438\n79546,125766\n79546,126547\n79546,126645\n79546,126857\n79546,127552\n79546,127811\n79546,128021\n79546,128531\n79546,129665\n79546,129721\n79546,130055\n79546,130098\n79546,130106\n79546,130641\n79546,134161\n79546,137125\n79546,139551\n79546,143710\n79546,146918\n79546,147107\n79546,148644\n79546,155542\n79546,155998\n79546,156969\n79546,159118\n79546,168203\n79546,178044\n79546,178053\n79546,181456\n79546,181557\n79546,184433\n79546,188313\n79546,192482\n79546,192800\n79546,201573\n79546,204910\n79546,206251\n79546,214770\n79546,217017\n79546,217132\n79546,217242\n79546,217444\n79546,217743\n79546,218725\n79546,219412\n79546,219454\n79546,219485\n79546,219494\n79546,227982\n79546,231471\n79546,233726\n79546,234585\n79548,7757\n79549,292\n79550,167\n79550,217\n79550,301\n79550,631\n79550,1010\n79550,1085\n79551,657\n79552,3161\n79553,22924\n79554,393\n79554,435\n79554,439\n79556,4355\n79558,298\n79559,1\n79559,10\n79559,2244\n79559,21826\n79560,999\n79562,1805\n79563,1010\n79564,310\n79565,1019\n79567,160\n79568,158\n79568,393\n79569,1068\n79570,1127\n79570,1381\n79571,63\n79573,79\n79574,83\n79574,315\n79575,79\n79576,287\n79577,509\n79577,150022\n79578,269\n79579,1881\n79581,298\n79582,873\n79583,217\n79583,872\n79584,4\n79584,5\n79585,1707\n79586,503\n79587,83\n79588,873\n79589,222\n79590,808\n79591,577\n79592,1821\n79593,302\n79594,1579\n79595,1796\n79596,479\n79597,1541\n79600,1983\n79601,2424\n79602,158\n79603,305\n79604,79605\n79606,79605\n79608,209\n79608,258973\n79609,313\n79609,852\n79610,19010\n79611,422\n79612,56\n79613,356\n79613,615\n79613,852\n79615,6726\n79616,248\n79616,557\n79616,875\n79617,31934\n79619,41\n79619,68\n79619,240\n79619,390\n79619,392\n79619,431\n79619,631\n79619,760\n79619,784\n79619,805\n79619,818\n79619,1119\n79619,1285\n79619,1309\n79619,1608\n79619,1631\n79619,1888\n79619,2590\n79619,2620\n79619,2995\n79619,3135\n79619,4220\n79619,7194\n79619,66297\n79619,84257\n79620,1191\n79621,2674\n79622,83\n79623,79624\n79623,84797\n79623,86121\n79623,86212\n79625,818\n79626,932\n79627,184\n79627,2206\n79628,83\n79629,1179\n79630,868\n79631,775\n79632,1374\n79633,1132\n79634,781\n79635,422\n79636,56\n79637,1891\n79641,1849\n79642,240\n79643,41\n79644,2929\n79645,1007\n79646,994\n79647,663\n79647,664\n79648,663\n79648,664\n79649,663\n79649,664\n79650,657\n79651,58\n79652,46\n79653,251\n79653,465\n79656,79657\n79658,79659\n79660,2620\n79661,2334\n79662,772\n79663,1983\n79664,527\n79664,740\n79664,741\n79665,83\n79665,592\n79667,2674\n79667,16153\n79668,1381\n79669,1844\n79670,422\n79672,247\n79673,433\n79673,1634\n79674,392\n79676,809\n79677,875\n79678,206\n79678,222\n79678,254\n79678,455\n79678,1019\n79678,1282\n79678,5343\n79678,73570\n79679,1776\n79680,657\n79681,338\n79682,217\n79683,79\n79683,1181\n79683,2260\n79684,2244\n79685,206\n79686,1556\n79687,1858\n79688,1860\n79691,772\n79692,660\n79693,14989\n79694,7416\n79695,32\n79695,302\n79695,818\n79695,957\n79695,2979\n79696,140\n79697,267\n79698,7\n79700,1127\n79702,72\n79703,298\n79704,485\n79705,1858\n79706,1860\n79707,1033\n79708,83\n79709,483\n79710,1147\n79711,79712\n79711,107985\n79711,184056\n79713,605\n79713,2083\n79714,3\n79715,1458\n79716,1243\n79717,431\n79718,8992\n79719,557\n79720,557\n79721,2944\n79722,2224\n79722,13661\n79723,134\n79724,8270\n79725,2209\n79726,72\n79727,72\n79728,309\n79728,310\n79728,841\n79728,994\n79728,1566\n79729,647\n79730,344\n79731,72\n79732,3331\n79733,333\n79734,167\n79734,446\n79734,1522\n79735,1893\n79736,1749\n79737,1782\n79738,5101\n79739,481\n79740,726\n79741,676\n79742,596\n79743,1860\n79744,215\n79744,233\n79744,240\n79744,289\n79744,290\n79744,298\n79744,372\n79744,417\n79744,503\n79744,592\n79744,631\n79744,760\n79744,805\n79744,932\n79744,1016\n79744,1082\n79744,1085\n79744,1282\n79744,1285\n79744,1309\n79744,1462\n79744,1564\n79744,1608\n79744,1715\n79744,1785\n79744,1818\n79744,1955\n79744,1962\n79744,2205\n79744,2296\n79744,2620\n79744,5718\n79744,8537\n79744,33424\n79744,94134\n79744,245910\n79745,44\n79746,794\n79747,30\n79748,2979\n79749,336\n79750,31934\n79751,30\n79752,106\n79753,30\n79754,298\n79755,485\n79756,30\n79757,6837\n79758,3999\n79759,63\n79760,2379\n79761,298\n79762,485\n79763,5366\n79764,79765\n79766,30\n79767,305\n79769,72\n79770,3467\n79771,1515\n79772,760\n79773,392\n79773,697\n79773,1151\n79773,3003\n79774,920\n79776,10\n79777,422\n79778,56\n79779,6252\n79780,41\n79780,1012\n79780,1177\n79781,6556\n79782,147\n79783,30\n79783,1179\n79784,79785\n79786,248\n79788,577\n79789,640\n79790,393\n79790,4545\n79790,139010\n79791,215\n79793,392\n79794,195\n79794,306\n79794,307\n79794,406\n79794,779\n79794,1181\n79794,1515\n79795,79796\n79797,631\n79798,79799\n79800,424\n79801,862\n79803,30\n79806,79807\n79808,79809\n79810,3246\n79811,75912\n79812,79813\n79814,79\n79815,298\n79816,485\n79817,585\n79818,397\n79819,21944\n79820,366\n79821,640\n79822,602\n79823,79824\n79825,118\n79825,4597\n79826,579\n79827,79828\n79829,932\n79830,467\n79831,7358\n79831,7363\n79832,160\n79834,3246\n79836,385\n79837,134\n79838,233\n79839,2205\n79839,2206\n79840,222\n79841,577\n79841,2775\n79842,6837\n79843,355\n79844,1191\n79845,298\n79846,485\n79847,647\n79848,344\n79849,1849\n79850,1359\n79851,2480\n79852,397\n79853,207\n79854,431\n79855,2775\n79856,447\n79857,34\n79857,35\n79857,2266\n79858,222\n79858,1893\n79858,103860\n79859,333\n79859,811\n79859,1210\n79860,2775\n79861,671\n79861,827\n79862,79863\n79864,640\n79865,79866\n79865,123109\n79867,2116\n79868,72\n79869,518\n79869,1955\n79870,2775\n79871,1467\n79872,1559\n79873,455\n79874,336\n79875,1807\n79876,19\n79876,743\n79876,749\n79876,1388\n79876,142430\n79876,142473\n79876,142879\n79877,2424\n79878,1119\n79879,493\n79879,682\n79879,1821\n79879,21736\n79879,72439\n79883,44877\n79883,80266\n79883,174526\n79884,602\n79885,1623\n79886,360\n79888,422\n79889,422\n79890,422\n79891,422\n79892,422\n79893,422\n79894,178\n79895,422\n79896,663\n79896,664\n79897,422\n79898,30\n79899,151\n79900,30\n79901,41\n79902,422\n79903,56\n79904,1871\n79905,30\n79906,6051\n79907,907\n79908,704\n79908,1140\n79908,5547\n79909,932\n79910,516\n79911,775\n79912,264\n79912,1381\n79913,1836\n79914,83\n79915,171\n79916,907\n79917,8463\n79918,30\n79919,485\n79921,431\n79922,493\n79922,1411\n79923,58\n79923,184\n79923,202\n79923,203\n79923,261\n79923,273\n79923,671\n79923,994\n79923,1309\n79923,1821\n79923,2528\n79923,3148\n79923,4222\n79923,190492\n79924,1087\n79925,79926\n79927,313\n79927,1467\n79928,225\n79929,604\n79930,697\n79930,1010\n79930,1117\n79931,2421\n79932,13980\n79933,83\n79934,620\n79935,3\n79936,455\n79936,1019\n79936,1467\n79937,1243\n79938,79\n79939,690\n79940,660\n79941,5405\n79942,775\n79944,376\n79945,934\n79945,1033\n79946,5547\n79947,1579\n79948,50\n79949,1323\n79950,102\n79951,1326\n79952,408\n79953,515\n79954,50\n79955,20\n79956,481\n79957,20771\n79958,79959\n79958,97627\n79958,103510\n79958,114133\n79958,141606\n79960,136\n79960,1332\n79960,1619\n79961,417\n79962,79963\n79964,298\n79965,485\n79966,54\n79966,135\n79966,278\n79966,283\n79966,455\n79966,634\n79966,660\n79966,1353\n79966,1539\n79966,2424\n79966,2553\n79966,2646\n79966,6506\n79966,7768\n79967,192\n79968,1118\n79970,1509\n79972,1146\n79974,805\n79975,104\n79976,620\n79977,493\n79977,652\n79978,4060\n79979,1509\n79980,10\n79981,30\n79983,298\n79984,485\n79985,79986\n79988,1240\n79989,298\n79990,485\n79991,3207\n79992,364\n79993,298\n79994,485\n79995,6323\n79996,79997\n79998,302\n79998,861\n79999,298\n80000,485\n80001,80002\n80001,83137\n80003,873\n80003,1419\n80005,298\n80006,485\n80009,167\n80009,518\n80009,615\n80009,1454\n80009,2979\n80010,298\n80011,485\n80012,140\n80013,22\n80014,1265\n80014,1266\n80016,417\n80017,1983\n80019,264\n80021,79\n80022,56\n80022,147\n80022,192\n80022,30331\n80023,500\n80024,56\n80024,30331\n80025,275\n80025,277\n80026,56\n80026,30331\n80026,60576\n80027,682\n80028,56\n80028,30331\n80029,1893\n80030,80031\n80032,481\n80033,192\n80034,1326\n80035,298\n80036,111\n80036,4771\n80037,80038\n80039,298\n80040,485\n80041,58\n80042,515\n80043,192\n80044,24505\n80046,1707\n80049,289\n80049,290\n80049,483\n80049,503\n80049,631\n80049,636\n80049,805\n80049,1282\n80049,2443\n80049,94134\n80050,693\n80051,298\n80052,485\n80053,579\n80053,861\n80053,1556\n80054,518\n80055,298\n80056,1453\n80056,2073\n80056,68069\n80056,86832\n80057,673\n80057,849\n80057,2460\n80058,1\n80058,50\n80058,147\n80058,158\n80058,406\n80058,1181\n80059,920\n80059,1089\n80059,1619\n80060,604\n80060,1293\n80060,2480\n80060,3422\n80061,79\n80062,301\n80062,567\n80062,604\n80062,615\n80062,1740\n80063,22293\n80064,843\n80065,366\n80065,500\n80066,861\n80067,3069\n80069,3115\n80070,477\n80071,79\n80072,358\n80073,2867\n80073,22880\n80075,68069\n80077,298\n80078,485\n80079,192\n80081,647\n80082,344\n80083,192\n80083,440\n80083,489\n80083,577\n80083,893\n80083,1400\n80083,1796\n80083,3804\n80083,4453\n80084,467\n80084,868\n80085,306\n80085,307\n80086,1287\n80087,9029\n80089,68069\n80090,68069\n80091,68069\n80091,86832\n80091,234030\n80092,192\n80093,68069\n80094,68069\n80095,68069\n80096,392\n80097,68069\n80098,581\n80099,147\n80100,346\n80101,34\n80101,35\n80102,611\n80102,1370\n80105,1117\n80106,298\n80107,485\n80109,30\n80110,24505\n80111,2775\n80112,376\n80114,7092\n80115,439\n80115,538\n80115,1590\n80118,640\n80119,663\n80119,664\n80121,640\n80122,1849\n80123,30\n80124,571\n80126,5591\n80127,68069\n80128,376\n80129,68069\n80130,4220\n80131,240\n80132,18726\n80133,117\n80133,2712\n80134,301\n80135,21944\n80136,68069\n80137,1010\n80137,1298\n80139,68069\n80139,86832\n80139,95770\n80139,110058\n80139,121419\n80139,123767\n80139,125129\n80139,130183\n80139,133313\n80139,144465\n80139,161810\n80140,589\n80141,6068\n80142,1849\n80143,390\n80144,557\n80145,640\n80146,592\n80148,68069\n80149,1818\n80150,68069\n80150,86832\n80152,68069\n80153,949\n80153,13980\n80154,346\n80155,301\n80157,392\n80158,1707\n80159,422\n80160,56\n80161,30\n80162,4\n80162,5\n80163,30\n80164,557\n80165,483\n80166,996\n80170,68069\n80170,86832\n80171,30\n80172,1001\n80173,206\n80173,459\n80173,827\n80173,980\n80173,1220\n80173,1222\n80173,2353\n80174,640\n80175,392\n80175,1151\n80176,640\n80177,604\n80178,358\n80179,15573\n80180,289\n80180,290\n80181,2351\n80182,1556\n80183,1891\n80184,1252\n80184,1253\n80184,21944\n80186,2775\n80187,151\n80188,292\n80188,1688\n80189,4672\n80190,920\n80192,392\n80193,2367\n80195,83\n80196,1769\n80197,206\n80198,861\n80199,83\n80200,2116\n80201,536\n80202,920\n80203,1238\n80204,206\n80205,586\n80206,251\n80206,465\n80207,269\n80208,577\n80209,80210\n80211,1381\n80212,2146\n80213,23010\n80214,557\n80215,34\n80215,35\n80215,83\n80216,211\n80217,1118\n80218,557\n80219,298\n80220,485\n80221,80222\n80223,298\n80224,485\n80225,147\n80225,89035\n80226,1105\n80227,676\n80228,195\n80229,364\n80230,557\n80231,5440\n80232,298\n80233,485\n80234,1707\n80235,640\n80236,2590\n80237,647\n80238,344\n80239,1381\n80240,3069\n80241,647\n80242,344\n80243,433\n80244,509\n80244,1572\n80244,1722\n80244,4039\n80245,431\n80246,80247\n80248,192\n80249,207\n80250,500\n80251,366\n80252,187\n80253,273\n80254,68069\n80255,1983\n80256,1429\n80257,875\n80258,1983\n80259,269\n80260,640\n80262,885\n80263,668\n80264,269\n80265,500\n80266,1\n80266,147\n80266,148\n80266,158\n80266,175\n80266,206\n80266,336\n80266,406\n80266,640\n80266,1425\n80266,1458\n80266,2244\n80266,5916\n80266,13270\n80266,15330\n80266,15795\n80266,16891\n80266,19936\n80266,25571\n80266,30943\n80266,42064\n80266,44877\n80266,60576\n80266,66714\n80266,79883\n80266,80120\n80266,80266\n80266,80515\n80266,81315\n80266,81456\n80266,82103\n80266,82244\n80266,83401\n80266,87803\n80266,89035\n80266,91363\n80266,92476\n80266,93782\n80266,100737\n80266,118336\n80266,128904\n80266,139137\n80266,149319\n80266,153004\n80266,154193\n80266,163945\n80266,177995\n80266,183850\n80266,187331\n80266,188635\n80266,214374\n80266,217689\n80266,219541\n80266,227521\n80266,237840\n80267,44\n80268,289\n80268,290\n80268,417\n80268,1085\n80268,2206\n80268,2296\n80268,75912\n80268,94134\n80268,144988\n80269,481\n80270,107\n80271,640\n80272,134\n80273,647\n80274,344\n80275,872\n80276,640\n80277,79\n80277,94409\n80278,557\n80279,256\n80281,605\n80282,640\n80283,647\n80284,344\n80286,1143\n80287,30\n80288,2480\n80289,2244\n80290,477\n80291,640\n80292,640\n80293,217\n80293,536\n80293,949\n80293,13575\n80294,2929\n80295,364\n80295,431\n80295,1252\n80295,1253\n80296,640\n80299,175\n80300,873\n80303,80304\n80303,89903\n80305,147\n80307,99\n80308,622\n80309,195\n80310,73570\n80313,1639\n80314,2146\n80316,304\n80317,3069\n80318,312\n80319,2528\n80320,292\n80321,44\n80323,602\n80324,8598\n80325,2244\n80326,1452\n80327,298\n80328,485\n80329,80330\n80331,80332\n80333,233\n80334,1238\n80335,536\n80335,852\n80335,4672\n80335,7698\n80336,663\n80336,664\n80337,832\n80338,406\n80338,420\n80338,760\n80338,841\n80338,1247\n80338,1572\n80338,2701\n80338,4192\n80338,4193\n80339,255\n80341,1\n80342,1\n80343,3\n80344,80345\n80346,636\n80346,2135\n80347,1707\n80349,273\n80350,422\n80351,56\n80352,30\n80353,1639\n80354,75912\n80355,447\n80356,355\n80357,80358\n80359,366\n80362,97\n80362,9457\n80364,140\n80365,80361\n80366,3\n80367,21944\n80368,50\n80368,130\n80368,209\n80368,393\n80368,473\n80368,602\n80368,841\n80368,1566\n80368,1571\n80368,1955\n80368,3451\n80368,3452\n80368,4223\n80368,6955\n80368,75912\n80368,88820\n80369,3585\n80370,1454\n80371,1411\n80372,704\n80373,80374\n80375,1298\n80376,2626\n80377,192\n80377,202\n80377,203\n80377,516\n80378,240\n80378,301\n80379,301\n80379,973\n80379,1160\n80379,1293\n80379,1300\n80379,103860\n80380,1359\n80381,907\n80382,30331\n80385,4252\n80386,920\n80388,358\n80389,80390\n80391,80392\n80394,1033\n80395,1117\n80396,202\n80396,233\n80396,1287\n80397,333\n80397,622\n80397,1033\n80398,424\n80398,1634\n80399,206\n80400,302\n80400,579\n80401,752\n80403,5405\n80404,3413\n80406,1132\n80407,781\n80408,44\n80409,602\n80410,278\n80411,80412\n80413,79\n80413,2867\n80413,2868\n80413,22880\n80414,422\n80415,422\n80416,422\n80417,422\n80418,1132\n80419,781\n80420,422\n80421,422\n80422,422\n80423,7698\n80424,422\n80425,126\n80425,217\n80425,536\n80425,872\n80425,1417\n80426,1181\n80427,1247\n80428,364\n80429,1962\n80430,972\n80431,19010\n80431,22293\n80432,631\n80433,30\n80434,302\n80435,298\n80436,485\n80437,8788\n80438,3193\n80439,779\n80440,467\n80440,868\n80441,2244\n80442,457\n80443,2775\n80444,447\n80445,2775\n80446,447\n80447,1572\n80448,68\n80448,71\n80448,86\n80448,442\n80448,795\n80448,1821\n80448,2367\n80448,15179\n80448,21736\n80448,193129\n80449,1715\n80450,1623\n80451,83\n80451,302\n80452,50\n80453,2045\n80454,818\n80455,147\n80455,622\n80456,298\n80457,485\n80458,83\n80459,589\n80461,298\n80462,485\n80463,146\n80463,92476\n80463,106502\n80464,58\n80464,75912\n80465,349\n80466,417\n80467,1132\n80468,781\n80471,298\n80472,485\n80475,515\n80475,1052\n80475,1579\n80476,932\n80477,2436\n80478,10\n80479,261\n80480,34\n80480,35\n80480,333\n80480,657\n80481,30\n80482,1796\n80483,599\n80484,298\n80485,485\n80487,631\n80488,217\n80489,431\n80489,784\n80491,80492\n80493,171\n80494,968\n80495,2701\n80496,994\n80497,21944\n80498,599\n80499,497\n80500,1332\n80501,779\n80501,68069\n80502,515\n80503,195\n80504,5405\n80506,80507\n80509,10\n80511,19010\n80512,298\n80513,485\n80514,151\n80516,1803\n80517,2411\n80518,292\n80519,1801\n80519,14061\n80519,78949\n80519,131253\n80519,189266\n80521,23783\n80522,80523\n80524,298\n80525,485\n80526,1556\n80527,73570\n80528,1370\n80530,2668\n80531,602\n80532,1323\n80533,102\n80534,1326\n80535,408\n80536,919\n80537,433\n80538,119\n80538,192\n80538,309\n80538,310\n80538,577\n80538,2073\n80538,2626\n80539,80540\n80541,171\n80542,3367\n80542,3474\n80542,162599\n80543,717\n80543,1782\n80544,72\n80545,344\n80546,285\n80547,467\n80549,358\n80550,660\n80551,918\n80552,931\n80553,1858\n80554,1860\n80556,457\n80557,731\n80558,620\n80560,207\n80561,21944\n80562,2480\n80563,27041\n80564,2244\n80565,158\n80566,5405\n80567,596\n80569,424\n80570,1454\n80571,269\n80572,392\n80573,80574\n80575,158\n80575,779\n80576,1977\n80576,1978\n80577,1240\n80577,20771\n80578,151\n80579,1132\n80580,781\n80581,81\n80582,298\n80583,34\n80583,35\n80583,283\n80583,313\n80583,455\n80583,1019\n80583,1539\n80583,1881\n80583,2319\n80583,2944\n80583,7768\n80583,29475\n80584,27041\n80585,312\n80587,379\n80588,1556\n80589,1132\n80590,781\n80591,1132\n80592,781\n80593,397\n80594,1127\n80595,171\n80596,50\n80597,1140\n80597,5547\n80598,222\n80600,2244\n80601,527\n80602,207\n80603,2105\n80605,1983\n80606,252\n80607,75912\n80608,811\n80609,1172\n80609,1844\n80609,162599\n80613,346\n80614,1983\n80615,2083\n80616,240\n80618,269\n80618,435\n80619,685\n80620,2116\n80621,2421\n80622,999\n80622,1192\n80622,3538\n80622,4165\n80623,32\n80624,7572\n80625,80626\n80627,8\n80627,130\n80627,862\n80627,1016\n80627,1147\n80627,1818\n80627,2315\n80627,2411\n80627,4637\n80627,8714\n80627,28130\n80627,118336\n80628,18726\n80629,285\n80631,116\n80631,430\n80631,994\n80631,2087\n80632,850\n80633,2244\n80634,1381\n80635,10\n80636,388\n80637,217\n80638,1072\n80639,4637\n80640,34\n80640,35\n80641,455\n80642,2266\n80643,1429\n80644,1274\n80645,2421\n80646,1201\n80647,919\n80648,6955\n80649,47\n80649,2469\n80650,406\n80651,516\n80652,750\n80653,163\n80654,312\n80655,3630\n80656,192\n80656,663\n80657,602\n80658,431\n80659,1010\n80659,1298\n80659,1837\n80660,1140\n80662,1033\n80663,2116\n80664,1132\n80665,781\n80666,301\n80667,287\n80667,809\n80667,19010\n80669,1467\n80671,4895\n80673,31934\n80674,626\n80675,309\n80675,310\n80675,483\n80675,6556\n80675,80676\n80679,3695\n80680,393\n80681,333\n80682,852\n80682,2699\n80683,346\n80684,406\n80685,515\n80686,744\n80687,2372\n80688,941\n80689,832\n80690,615\n80691,1544\n80692,783\n80693,2626\n80694,298\n80695,485\n80696,602\n80697,217\n80697,1417\n80697,5976\n80698,1556\n80699,158\n80700,298\n80701,326\n80701,392\n80701,3804\n80702,1644\n80703,30\n80703,134\n80703,349\n80703,392\n80703,1007\n80703,2334\n80703,2701\n80703,3085\n80703,3260\n80704,126\n80704,872\n80704,4771\n80705,1707\n80706,10\n80707,80708\n80710,1007\n80711,1415\n80711,15807\n80712,602\n80713,420\n80714,2626\n80715,21944\n80716,56\n80718,72\n80719,344\n80720,285\n80721,657\n80722,158\n80722,779\n80723,247\n80724,240\n80725,134\n80726,115\n80726,118\n80727,34\n80727,35\n80727,58\n80727,111\n80727,192\n80727,264\n80727,289\n80727,290\n80727,422\n80727,479\n80727,586\n80727,1007\n80727,1085\n80727,1151\n80727,1210\n80727,1453\n80727,1659\n80727,1893\n80727,3695\n80727,5265\n80727,8180\n80728,392\n80729,240\n80732,644\n80733,406\n80734,136\n80735,292\n80736,247\n80736,2867\n80736,22880\n80737,1773\n80737,80731\n80739,158\n80740,298\n80741,726\n80742,30\n80743,273\n80744,30\n80745,949\n80747,72\n80748,30\n80749,557\n80750,233\n80751,818\n80752,332\n80753,875\n80754,30\n80755,2775\n80756,1631\n80756,55849\n80757,358\n80758,86\n80759,30\n80760,305\n80760,467\n80760,2105\n80761,10\n80763,158\n80763,1515\n80764,171\n80765,1\n80766,83\n80767,2671\n80768,477\n80769,225\n80770,557\n80771,1298\n80772,557\n80773,557\n80774,2244\n80774,23783\n80774,30331\n80774,256681\n80775,1644\n80776,72\n80777,2191\n80778,2116\n80779,30\n80780,30\n80781,267\n80782,68\n80783,392\n80784,80785\n80784,98945\n80786,392\n80787,302\n80787,579\n80787,1556\n80788,80789\n80788,83698\n80790,30\n80791,30\n80792,516\n80793,1235\n80793,1335\n80794,577\n80795,151\n80796,1707\n80797,107\n80798,3193\n80799,805\n80800,1608\n80801,516\n80802,147\n80802,158\n80803,481\n80804,406\n80805,30\n80806,30\n80807,1983\n80808,30\n80809,483\n80811,420\n80812,30\n80813,130\n80814,273\n80816,358\n80817,1707\n80818,30\n80819,4611\n80820,252\n80820,318\n80820,1220\n80820,1222\n80821,72\n80822,79\n80823,217\n80823,652\n80823,1452\n80823,1639\n80824,1181\n80825,3\n80825,1085\n80826,178\n80827,2590\n80828,1414\n80829,195\n80829,4039\n80830,8798\n80831,111\n80831,309\n80831,310\n80831,1715\n80831,6627\n80832,10\n80833,332\n80834,207\n80835,32\n80835,392\n80835,3003\n80836,7\n80836,211\n80836,315\n80836,788\n80836,14989\n80837,305\n80838,80839\n80840,571\n80841,872\n80842,1285\n80843,1429\n80844,10\n80845,158\n80846,668\n80847,1467\n80849,455\n80850,1773\n80850,80737\n80851,2424\n80852,1871\n80853,7698\n80855,30\n80856,366\n80857,366\n80858,366\n80859,250\n80859,602\n80859,1684\n80859,1962\n80860,80861\n80862,1143\n80863,620\n80864,30\n80865,278\n80865,640\n80865,3585\n80866,2244\n80867,366\n80868,366\n80869,80870\n80871,50\n80872,17588\n80873,50\n80874,80875\n80876,3\n80876,346\n80876,439\n80877,1745\n80878,640\n80879,1001\n80879,1085\n80880,80881\n80882,32\n80882,392\n80883,1509\n80884,704\n80885,80886\n80887,298\n80888,485\n80889,38634\n80890,298\n80891,485\n80892,346\n80893,640\n80894,640\n80895,30\n80896,872\n80897,376\n80898,1590\n80898,1644\n80899,134\n80900,80901\n80902,233\n80904,516\n80905,6303\n80906,972\n80907,5212\n80908,743\n80909,358\n80910,355\n80911,415\n80911,1143\n80911,1454\n80911,15523\n80912,147\n80913,147\n80913,149\n80913,158\n80913,13654\n80913,16003\n80913,56006\n80913,102586\n80913,102587\n80913,102588\n80913,102589\n80915,652\n80916,1132\n80917,781\n80918,298\n80919,485\n80920,872\n80921,298\n80922,485\n80923,690\n80923,788\n80924,1247\n80925,703\n80926,2048\n80927,422\n80928,56\n80929,1177\n80929,2210\n80930,219\n80931,8149\n80933,206\n80934,10\n80934,301\n80934,304\n80934,440\n80934,473\n80934,652\n80934,671\n80934,736\n80934,835\n80934,968\n80934,1085\n80934,1392\n80934,1677\n80934,1785\n80934,2244\n80934,3999\n80934,7270\n80934,14556\n80934,14945\n80936,217\n80937,217\n80938,2073\n80939,1392\n80940,640\n80941,309\n80941,310\n80941,483\n80942,147\n80942,399\n80943,30\n80944,694\n80945,79\n80946,6424\n80947,872\n80948,217\n80948,1118\n80949,222\n80950,10\n80951,102\n80952,302\n80952,579\n80952,6303\n80953,147\n80954,217\n80954,1014\n80954,1204\n80955,360\n80955,1289\n80956,2353\n80956,3756\n80957,309\n80957,310\n80957,809\n80957,6556\n80958,907\n80959,422\n80960,44\n80961,422\n80962,422\n80963,422\n80964,422\n80965,422\n80966,337\n80966,657\n80966,838\n80966,1454\n80967,422\n80968,422\n80969,718\n80970,217\n80970,457\n80972,664\n80972,1085\n80973,50\n80973,192\n80974,192\n80975,1417\n80976,119\n80976,1400\n80977,80978\n80979,83\n80980,518\n80982,1133\n80982,1479\n80983,893\n80983,3769\n80985,1010\n80986,1132\n80987,781\n80988,344\n80988,1564\n80989,805\n80990,254\n80991,2286\n80992,7\n80992,97\n80994,859\n80995,360\n80995,81070\n80996,46\n80997,269\n80998,1132\n80999,781\n81000,50\n81000,79\n81001,30\n81002,2286\n81003,21944\n81004,389\n81004,1756\n81005,305\n81007,2173\n81008,31934\n81009,346\n81010,3295\n81011,907\n81012,874\n81013,1359\n81014,808\n81015,1132\n81016,781\n81018,233\n81019,6638\n81020,1515\n81021,1132\n81022,781\n81024,379\n81024,1417\n81026,171\n81027,392\n81028,1132\n81029,781\n81030,217\n81031,4637\n81032,455\n81033,2266\n81034,1201\n81035,1135\n81036,2421\n81037,240\n81038,146\n81039,346\n81040,1132\n81041,781\n81043,2775\n81044,349\n81045,5987\n81046,1590\n81047,563\n81047,809\n81047,3467\n81049,647\n81050,344\n81051,31934\n81052,50\n81052,192\n81053,252\n81053,1220\n81053,1222\n81054,3297\n81055,1962\n81057,2116\n81058,697\n81059,1608\n81060,1417\n81061,20\n81061,538\n81062,217\n81062,1417\n81063,1132\n81064,781\n81065,289\n81065,290\n81066,1977\n81066,1978\n81068,222\n81068,283\n81068,657\n81068,949\n81068,1201\n81068,1467\n81068,2266\n81068,5906\n81068,13136\n81069,81070\n81069,174550\n81069,174561\n81070,1298\n81071,538\n81071,934\n81072,30\n81073,392\n81074,392\n81075,1400\n81077,2421\n81078,874\n81079,167\n81080,1132\n81081,781\n81082,1132\n81083,781\n81084,134\n81084,138\n81085,1132\n81086,781\n81088,30\n81089,1132\n81090,781\n81091,1580\n81092,1274\n81093,2989\n81093,2991\n81095,151\n81096,171\n81097,647\n81098,344\n81099,81100\n81101,2626\n81103,10\n81104,1801\n81105,81070\n81106,6298\n81107,1012\n81108,1177\n81109,41\n81110,298\n81111,485\n81112,2244\n81113,1132\n81114,781\n81115,1132\n81116,781\n81119,3\n81120,1243\n81121,251\n81122,20\n81124,527\n81124,736\n81124,781\n81124,849\n81124,1844\n81124,2460\n81125,1132\n81126,781\n81127,68069\n81128,346\n81129,298\n81130,485\n81131,605\n81132,818\n81133,818\n81134,8270\n81135,525\n81135,1119\n81135,1326\n81135,1796\n81136,1132\n81137,781\n81138,298\n81139,485\n81140,366\n81141,875\n81142,577\n81143,1127\n81144,602\n81145,269\n81146,1417\n81147,392\n81149,500\n81149,37414\n81150,602\n81151,5034\n81152,4903\n81154,392\n81154,433\n81155,81156\n81157,65\n81157,79\n81157,147\n81157,202\n81157,203\n81157,217\n81157,252\n81157,318\n81157,422\n81158,422\n81159,634\n81161,602\n81162,1132\n81163,781\n81164,2574\n81165,2436\n81166,58\n81167,46\n81168,81169\n81170,158\n81171,24505\n81173,538\n81174,118\n81174,4597\n81176,30\n81178,1392\n81179,83\n81180,48\n81181,1132\n81182,781\n81183,10\n81184,592\n81185,147\n81185,158\n81186,4672\n81187,392\n81188,479\n81189,195\n81190,30\n81191,83\n81192,875\n81193,991\n81193,2045\n81194,222\n81195,30\n81196,318\n81196,1220\n81196,1222\n81197,852\n81198,392\n81199,15523\n81200,147\n81200,422\n81201,147\n81201,158\n81202,251\n81202,465\n81203,81204\n81203,98705\n81205,599\n81205,1796\n81206,5440\n81207,431\n81207,1252\n81207,1253\n81208,349\n81209,81210\n81211,13745\n81212,671\n81213,1010\n81214,934\n81215,1240\n81216,312\n81217,50\n81218,1531\n81219,1082\n81220,2674\n81220,16153\n81221,4895\n81222,376\n81223,1749\n81224,81225\n81226,1962\n81227,298\n81228,485\n81229,874\n81230,657\n81231,1274\n81232,83\n81233,126\n81233,186\n81233,314\n81233,433\n81233,440\n81233,467\n81233,538\n81233,577\n81233,676\n81233,685\n81233,693\n81233,814\n81233,868\n81233,872\n81233,911\n81233,939\n81233,1011\n81233,1014\n81233,1118\n81233,1281\n81233,1531\n81233,1566\n81233,1655\n81233,1663\n81233,2874\n81233,5307\n81233,6452\n81233,7968\n81233,8535\n81233,18244\n81233,18377\n81233,20757\n81233,29713\n81233,34963\n81233,38707\n81233,39412\n81233,41345\n81233,43273\n81233,47022\n81233,58420\n81233,68086\n81233,72529\n81233,83393\n81233,83817\n81233,83993\n81233,84495\n81233,84644\n81233,84652\n81233,84701\n81233,84702\n81233,85796\n81233,85878\n81233,87141\n81233,94184\n81233,95341\n81233,95580\n81233,95608\n81233,100139\n81233,112300\n81233,112964\n81233,116982\n81233,117720\n81233,119493\n81233,119663\n81233,125487\n81233,134914\n81233,137666\n81233,138759\n81233,138760\n81233,138761\n81233,138762\n81233,138763\n81233,138764\n81233,138765\n81233,142463\n81233,146346\n81233,146745\n81233,148825\n81233,150874\n81233,152819\n81233,152855\n81233,156379\n81233,162599\n81234,83\n81235,3069\n81236,22\n81236,515\n81237,920\n81238,261\n81239,75912\n81240,72\n81241,255\n81242,298\n81243,4192\n81243,4193\n81244,298\n81245,485\n81246,332\n81247,140\n81247,160\n81248,1556\n81249,557\n81250,1571\n81250,2224\n81250,2421\n81250,5326\n81250,19443\n81251,366\n81252,81070\n81253,366\n81254,366\n81255,366\n81256,366\n81257,366\n81258,24505\n81259,19227\n81260,392\n81261,358\n81263,81264\n81265,809\n81266,485\n81266,138686\n81268,1359\n81269,392\n81270,195\n81271,1319\n81272,24505\n81273,2421\n81274,392\n81274,697\n81275,72\n81276,195\n81277,137\n81279,2116\n81281,298\n81282,485\n81283,1962\n81285,8719\n81286,138\n81287,865\n81288,557\n81289,137\n81290,118\n81290,4597\n81291,21944\n81292,5547\n81295,5906\n81296,557\n81297,626\n81298,278\n81299,137\n81300,862\n81301,557\n81302,2178\n81302,4545\n81303,301\n81303,567\n81303,968\n81305,557\n81306,2274\n81307,422\n81308,56\n81309,24505\n81310,577\n81311,5310\n81312,250\n81312,1684\n81313,9560\n81314,1118\n81314,4192\n81314,4193\n81315,516\n81316,30\n81317,346\n81318,81318\n81319,479\n81320,1085\n81321,346\n81322,24505\n81323,178\n81324,289\n81324,290\n81324,1962\n81324,2205\n81324,2206\n81324,2286\n81324,2315\n81324,3069\n81325,261\n81326,178\n81327,2574\n81328,30\n81329,644\n81330,586\n81331,481\n81332,2590\n81333,623\n81333,1805\n81334,1298\n81335,1509\n81336,207\n81337,83\n81338,83\n81339,872\n81340,1429\n81341,81342\n81343,5547\n81344,366\n81345,668\n81346,1033\n81347,7360\n81348,920\n81348,1634\n81348,81349\n81348,123037\n81350,3\n81352,81353\n81354,493\n81355,298\n81356,485\n81357,483\n81358,24505\n81359,3297\n81361,1143\n81362,81363\n81364,81365\n81366,81367\n81368,292\n81369,225\n81371,8884\n81372,81373\n81374,81373\n81375,81373\n81376,81373\n81377,81373\n81378,1085\n81379,366\n81380,366\n81381,81382\n81383,1284\n81384,3297\n81385,81386\n81387,602\n81389,81390\n81391,233\n81392,1001\n81393,81394\n81395,602\n81396,355\n81397,81398\n81399,1977\n81399,1978\n81400,81401\n81402,206\n81403,147\n81406,298\n81407,485\n81408,106\n81408,302\n81408,392\n81408,758\n81408,1043\n81408,1122\n81408,1858\n81408,1881\n81408,1984\n81408,2353\n81408,3003\n81408,3069\n81408,3193\n81408,6059\n81408,7956\n81408,27041\n81408,37088\n81409,6682\n81410,298\n81411,485\n81412,1132\n81413,781\n81414,298\n81415,485\n81416,81417\n81419,298\n81420,485\n81421,81422\n81423,163\n81424,298\n81425,485\n81426,3695\n81427,298\n81428,485\n81429,83\n81430,81431\n81432,81433\n81434,2989\n81434,2991\n81435,346\n81436,3\n81436,304\n81437,1323\n81438,102\n81439,1326\n81440,408\n81441,192\n81441,206\n81441,586\n81441,720\n81442,81443\n81444,171\n81446,516\n81447,81448\n81449,298\n81450,485\n81451,167\n81452,609\n81452,999\n81452,1882\n81452,2105\n81453,107\n81454,258\n81455,10\n81456,206\n81456,80266\n81458,1506\n81458,22125\n81459,81460\n81463,81464\n81465,34\n81465,35\n81465,106\n81465,158\n81465,192\n81465,217\n81465,251\n81465,252\n81465,318\n81465,337\n81465,346\n81465,435\n81465,465\n81465,586\n81465,640\n81465,663\n81465,664\n81465,1181\n81465,1220\n81465,1222\n81465,1243\n81465,1294\n81465,1590\n81465,1635\n81465,2567\n81465,3161\n81465,4192\n81465,4193\n81465,5976\n81465,6119\n81465,8598\n81465,8771\n81465,8811\n81465,8822\n81466,81467\n81468,81469\n81470,81471\n81472,731\n81473,30\n81474,298\n81475,485\n81476,30\n81477,3069\n81478,17588\n81479,48\n81480,388\n81481,3507\n81482,1707\n81483,1608\n81484,592\n81484,697\n81484,1284\n81484,2045\n81485,81486\n81487,72\n81488,24505\n81489,81490\n81491,393\n81492,2367\n81493,252\n81493,318\n81494,1749\n81495,22\n81496,298\n81497,485\n81498,298\n81499,485\n81500,81501\n81503,483\n81504,298\n81505,485\n81506,376\n81507,217\n81508,10\n81508,41\n81508,104\n81508,200\n81508,298\n81508,301\n81508,417\n81508,442\n81508,534\n81508,589\n81508,631\n81508,685\n81508,745\n81508,760\n81508,827\n81508,862\n81508,1085\n81508,1119\n81508,1262\n81508,1368\n81508,1462\n81508,1580\n81508,2296\n81508,2995\n81508,3474\n81508,3623\n81508,4220\n81508,4222\n81508,6068\n81508,7194\n81508,8537\n81508,8884\n81508,9028\n81508,31977\n81508,44725\n81508,75912\n81508,178576\n81508,185874\n81508,185877\n81509,1653\n81510,47\n81510,2469\n81511,34\n81511,35\n81511,1313\n81512,298\n81513,485\n81514,5547\n81515,726\n81515,743\n81515,142409\n81515,146280\n81516,24505\n81517,81518\n81519,1274\n81521,147\n81522,479\n81523,1033\n81524,392\n81525,6891\n81526,72\n81527,344\n81528,285\n81529,30\n81530,81531\n81532,72\n81533,298\n81534,485\n81535,298\n81536,485\n81537,1132\n81538,781\n81539,298\n81540,485\n81541,30\n81542,298\n81543,485\n81544,30\n81545,30\n81546,107\n81547,81548\n81549,3447\n81550,1479\n81551,72\n81552,1381\n81552,8868\n81552,81553\n81552,94581\n81552,111751\n81552,116726\n81554,1612\n81556,298\n81557,485\n81558,72\n81559,72\n81560,30\n81561,81562\n81563,75912\n81564,1132\n81565,781\n81566,483\n81567,1132\n81568,781\n81569,298\n81570,485\n81571,81572\n81573,1127\n81574,611\n81575,2116\n81576,1133\n81578,481\n81579,219\n81579,743\n81580,18726\n81581,250\n81581,1684\n81583,30\n81584,588\n81584,590\n81585,72\n81586,81587\n81588,1983\n81589,9121\n81590,663\n81590,664\n81591,81592\n81593,81594\n81595,1132\n81596,781\n81597,72\n81598,30\n81599,81600\n81601,30\n81602,1608\n81603,81604\n81605,81604\n81606,1531\n81607,366\n81608,366\n81609,366\n81610,81611\n81612,81613\n81614,3209\n81616,10\n81617,1544\n81618,4192\n81618,4193\n81619,81613\n81620,1181\n81623,72\n81626,81627\n81628,72\n81629,422\n81630,56\n81631,15573\n81632,81633\n81634,1871\n81635,81636\n81637,81638\n81639,72\n81641,72\n81642,195\n81643,233\n81644,72\n81645,81646\n81645,88905\n81647,83\n81647,81648\n81647,88084\n81649,346\n81650,151\n81651,195\n81652,107\n81653,2416\n81653,2417\n81654,292\n81655,338\n81656,195\n81657,298\n81658,1133\n81659,3538\n81660,81661\n81662,81661\n81663,30\n81664,3246\n81664,3247\n81665,355\n81666,30\n81667,675\n81668,81669\n81668,81712\n81668,87816\n81668,256707\n81671,187\n81672,272\n81673,8270\n81674,81675\n81676,175\n81676,310\n81677,1102\n81678,3413\n81680,211\n81681,2775\n81682,53763\n81683,81684\n81685,393\n81686,233\n81686,347\n81687,83\n81688,1836\n81689,972\n81689,1010\n81689,1531\n81690,158\n81690,2574\n81692,10\n81694,81695\n81696,2048\n81697,298\n81698,485\n81699,7\n81700,7360\n81701,298\n81702,485\n81703,104\n81703,254\n81703,5405\n81704,81705\n81704,101079\n81704,122272\n81704,122431\n81704,160152\n81704,261358\n81706,2889\n81706,3260\n81707,81707\n81708,1287\n81708,1531\n81709,81710\n81711,516\n81713,81714\n81713,243145\n81715,1052\n81716,81717\n81718,1707\n81719,392\n81720,81721\n81722,81721\n81723,81724\n81725,861\n81726,1007\n81727,81728\n81727,170410\n81729,81730\n81731,72\n81732,344\n81733,285\n81734,298\n81735,485\n81736,1983\n81737,81738\n81737,120140\n81739,255\n81741,81742\n81743,81744\n81745,13661\n81746,269\n81746,1684\n81747,1127\n81748,483\n81749,349\n81750,298\n81751,485\n81752,1634\n81753,1983\n81754,30\n81755,19986\n81756,188\n81757,417\n81758,861\n81759,22\n81760,81761\n81762,862\n81763,72\n81764,3447\n81765,72\n81766,8149\n81767,5405\n81768,72\n81769,81770\n81771,81772\n81773,81772\n81774,81772\n81775,685\n81775,26450\n81776,1844\n81777,687\n81778,158\n81779,72\n81780,78232\n81781,81782\n81784,338\n81786,577\n81787,333\n81787,435\n81787,440\n81787,1033\n81788,298\n81789,485\n81790,3872\n81791,30\n81792,298\n81793,485\n81794,298\n81795,485\n81797,72\n81798,81070\n81799,3331\n81800,202\n81800,203\n81801,376\n81802,557\n81803,1010\n81804,557\n81805,862\n81807,2146\n81808,557\n81809,81810\n81811,557\n81812,81813\n81814,81813\n81815,1309\n81816,34\n81816,158\n81817,15573\n81818,1983\n81820,30\n81821,1983\n81822,2334\n81823,81824\n81825,433\n81826,206\n81827,149\n81828,323\n81829,333\n81830,30\n81831,119\n81831,200\n81832,1177\n81832,2775\n81833,718\n81834,1688\n81834,2989\n81834,2991\n81835,1220\n81835,1222\n81835,2775\n81836,81837\n81838,81839\n81838,85472\n81838,126213\n81840,2168\n81841,252\n81841,318\n81842,455\n81843,81844\n81845,602\n81846,602\n81848,422\n81849,422\n81850,422\n81851,422\n81852,81853\n81854,422\n81855,422\n81856,422\n81857,422\n81859,422\n81860,24505\n81861,15573\n81862,1858\n81863,1860\n81864,14366\n81866,24505\n81867,31934\n81869,81870\n81872,1\n81873,81874\n81873,112870\n81873,134308\n81873,171545\n81875,31934\n81876,72\n81878,81879\n81880,31934\n81881,602\n81882,602\n81883,602\n81884,907\n81885,30\n81886,72\n81888,81889\n81890,602\n81891,602\n81892,30\n81893,602\n81894,5547\n81895,24505\n81896,602\n81897,1238\n81898,30\n81898,328\n81899,1452\n81900,30\n81901,81902\n81901,251698\n81901,262210\n81903,81904\n81905,2787\n81906,33082\n81907,2292\n81908,94\n81909,818\n81910,652\n81911,292\n81912,294\n81913,296\n81914,298\n81917,10\n81918,652\n81920,818\n81921,81922\n81923,81924\n81925,233\n81926,30\n81927,81928\n81927,105016\n81929,433\n81930,58\n81931,46\n81932,30\n81934,298\n81935,485\n81936,4865\n81936,4866\n81937,1010\n81938,302\n81939,195\n81940,818\n81941,81942\n81943,355\n81944,1715\n81945,2574\n81946,1127\n81946,1381\n81948,749\n81950,818\n81951,652\n81952,81953\n81954,2989\n81954,2991\n81955,5908\n81957,2923\n81958,81959\n81960,81961\n81962,31934\n81963,255\n81964,1983\n81965,147\n81967,2048\n81968,72\n81969,30\n81969,772\n81969,4941\n81971,104\n81971,252\n81971,1001\n81971,1707\n81971,21442\n81972,298\n81973,485\n81975,72\n81976,818\n81977,19\n81977,278\n81977,1571\n81977,2224\n81977,2421\n81977,5326\n81978,302\n81979,3135\n81980,1707\n81981,2775\n81982,447\n81983,1058\n81984,209\n81985,366\n81986,868\n81987,366\n81988,366\n81989,366\n81990,671\n81992,72\n81994,392\n81995,259\n81996,389\n82000,417\n82001,99\n82002,1634\n82003,2048\n82005,151\n82005,631\n82007,392\n82008,82009\n82010,1962\n82011,2048\n82012,83\n82017,626\n82018,195\n82019,431\n82020,862\n82022,2116\n82023,304\n82024,130\n82024,1007\n82027,996\n82028,85\n82029,34\n82029,35\n82029,1313\n82030,15\n82031,1319\n82032,72\n82033,1556\n82034,366\n82035,3612\n82036,175\n82037,81\n82038,1983\n82040,957\n82040,82013\n82041,195\n82042,30\n82043,441\n82043,1722\n82044,195\n82045,302\n82045,579\n82046,640\n82047,640\n82048,338\n82048,1127\n82048,1722\n82049,82050\n82051,1082\n82051,1149\n82052,1566\n82053,557\n82057,649\n82058,805\n82059,24505\n82060,18726\n82061,206\n82062,93\n82062,94\n82063,206\n82064,2334\n82065,1608\n82066,1323\n82067,102\n82068,1326\n82069,408\n82070,273\n82071,1983\n82072,1392\n82073,2073\n82074,862\n82075,1803\n82076,2334\n82077,455\n82078,818\n82079,178\n82080,1132\n82081,781\n82082,24505\n82083,1858\n82084,1860\n82085,1231\n82085,1370\n82085,1782\n82086,2116\n82087,151\n82088,192\n82089,602\n82090,1243\n82091,3999\n82092,301\n82093,1707\n82094,252\n82094,272\n82094,1370\n82094,1893\n82095,718\n82095,1631\n82096,1326\n82097,1608\n82098,447\n82100,949\n82101,283\n82101,7698\n82101,9743\n82102,18298\n82103,10\n82103,175\n82103,94409\n82104,23783\n82105,2116\n82106,1631\n82108,192\n82109,527\n82109,743\n82109,8714\n82109,95583\n82110,20\n82110,489\n82110,1133\n82110,1147\n82111,82112\n82113,1284\n82115,1147\n82115,1707\n82116,604\n82117,1707\n82118,332\n82119,83\n82119,563\n82120,406\n82121,1033\n82122,211\n82123,2421\n82124,34\n82124,35\n82124,313\n82124,431\n82124,442\n82124,609\n82124,626\n82124,749\n82124,1046\n82124,1235\n82124,1335\n82124,1715\n82124,1718\n82124,13575\n82124,15807\n82124,21711\n82125,134\n82126,8270\n82128,527\n82128,743\n82128,8714\n82129,1227\n82129,1229\n82131,422\n82132,422\n82133,422\n82134,422\n82135,209\n82136,422\n82137,1844\n82138,48\n82139,30\n82140,3115\n82141,30\n82142,392\n82144,1132\n82145,781\n82146,1983\n82147,663\n82147,664\n82147,2867\n82147,2868\n82149,240\n82150,222\n82151,366\n82151,760\n82152,81070\n82153,1983\n82154,247\n82155,579\n82156,1983\n82157,2274\n82158,1454\n82159,1836\n82160,663\n82160,664\n82161,713\n82162,120\n82162,694\n82164,442\n82164,749\n82165,503\n82166,79\n82167,2620\n82168,30\n82169,120\n82170,1522\n82171,280\n82171,17245\n82172,872\n82173,328\n82173,3538\n82174,433\n82175,1241\n82175,3422\n82176,34\n82176,536\n82176,2266\n82177,1858\n82178,1860\n82179,1132\n82180,781\n82181,1231\n82182,406\n82183,2367\n82184,1132\n82185,781\n82186,1858\n82187,1860\n82188,9010\n82189,82190\n82191,649\n82192,1127\n82193,1132\n82194,781\n82195,82196\n82197,240\n82197,283\n82197,491\n82197,1052\n82197,1201\n82197,1509\n82198,30\n82199,151\n82201,82202\n82203,30\n82204,104\n82204,557\n82204,953\n82205,360\n82205,762\n82206,444\n82207,86\n82209,872\n82210,82211\n82212,298\n82213,485\n82214,82215\n82216,264\n82218,1509\n82218,1551\n82220,30\n82221,483\n82222,82223\n82222,83653\n82222,104810\n82222,111362\n82222,111701\n82222,114656\n82222,172840\n82222,191766\n82222,199160\n82222,242349\n82222,250743\n82225,24505\n82226,82227\n82228,489\n82229,772\n82230,772\n82232,272\n82232,314\n82233,859\n82234,1522\n82235,360\n82235,1893\n82235,6695\n82236,107\n82236,111\n82236,4771\n82237,22\n82237,207\n82237,314\n82238,82239\n82240,406\n82241,34\n82241,35\n82241,79\n82241,147\n82241,158\n82241,406\n82241,622\n82241,640\n82241,779\n82241,809\n82241,1425\n82241,1515\n82241,5874\n82242,192\n82243,392\n82244,107\n82244,200\n82244,1462\n82244,8180\n82244,8537\n82244,80266\n82245,493\n82247,304\n82248,4691\n82250,30\n82251,1313\n82252,733\n82254,392\n82254,2699\n82255,611\n82255,1370\n82256,30\n82257,1298\n82257,1616\n82258,302\n82258,1374\n82259,431\n82260,433\n82261,30\n82262,1844\n82263,259\n82264,1844\n82265,1844\n82266,72\n82267,602\n82268,2775\n82269,72\n82270,207\n82271,82272\n82271,84529\n82273,1132\n82274,781\n82275,1287\n82276,252\n82277,167\n82278,1151\n82279,631\n82280,3507\n82281,875\n82282,33201\n82283,151\n82284,417\n82285,59931\n82286,1119\n82287,536\n82288,557\n82289,3413\n82290,1635\n82291,4039\n82292,333\n82296,349\n82297,151\n82298,255\n82301,832\n82303,240\n82303,1309\n82304,442\n82304,1140\n82304,3474\n82305,3069\n82308,2048\n82309,1132\n82310,781\n82312,247\n82313,222\n82313,1019\n82315,980\n82316,338\n82316,1127\n82317,1531\n82318,1132\n82319,781\n82321,809\n82322,1983\n82323,30331\n82324,2244\n82325,82326\n82328,48\n82329,217\n82330,388\n82331,1072\n82332,34\n82332,35\n82333,4637\n82334,455\n82335,2266\n82336,1429\n82337,1274\n82338,1201\n82339,919\n82340,2421\n82341,6955\n82342,298\n82343,485\n82344,422\n82345,5034\n82346,58\n82347,46\n82348,827\n82349,516\n82349,1220\n82349,1222\n82350,34\n82350,35\n82350,949\n82350,13980\n82351,536\n82352,1631\n82353,602\n82355,2671\n82356,83\n82358,30\n82359,30\n82360,30\n82361,433\n82362,718\n82363,3413\n82364,47\n82364,2469\n82365,1983\n82366,1983\n82367,481\n82368,4611\n82369,1983\n82371,760\n82371,1149\n82372,602\n82373,602\n82374,30\n82375,134\n82376,3069\n82377,298\n82378,485\n82379,82380\n82381,82382\n82381,99457\n82383,175\n82384,861\n82385,874\n82386,516\n82387,557\n82388,1556\n82390,557\n82391,298\n82392,485\n82394,424\n82395,626\n82396,30\n82397,10\n82398,250\n82398,1684\n82399,82400\n82401,298\n82402,485\n82403,30\n82404,1608\n82405,30\n82406,1844\n82407,515\n82408,1392\n82409,83\n82410,72\n82411,206\n82412,30\n82413,18726\n82414,602\n82415,82416\n82418,72\n82419,49887\n82420,640\n82421,1289\n82421,1509\n82422,433\n82422,818\n82423,1551\n82424,72\n82425,72\n82427,1608\n82428,82429\n82430,82431\n82430,83223\n82430,88175\n82430,90853\n82430,112618\n82432,72\n82433,298\n82434,485\n82435,640\n82436,30\n82437,72\n82438,9457\n82439,30\n82440,301\n82440,861\n82440,893\n82440,2979\n82441,809\n82442,1688\n82443,82444\n82445,72\n82447,1\n82448,106\n82449,82450\n82451,79\n82452,602\n82453,602\n82454,602\n82455,779\n82457,72\n82459,82460\n82461,247\n82462,3804\n82464,1962\n82465,875\n82467,202\n82467,203\n82468,82469\n82470,72\n82471,344\n82472,285\n82473,82474\n82475,82476\n82477,82478\n82480,10\n82481,1149\n82481,5101\n82481,5102\n82481,15119\n82481,55077\n82483,82484\n82483,121912\n82485,994\n82486,72\n82488,72\n82490,1181\n82491,30\n82492,149\n82493,392\n82494,636\n82495,82496\n82495,107860\n82495,110957\n82497,1849\n82498,202\n82499,333\n82499,1181\n82502,602\n82503,671\n82504,147\n82505,184\n82507,77\n82508,1467\n82509,2089\n82509,2940\n82509,21944\n82509,107196\n82509,129403\n82509,138617\n82509,141492\n82509,172048\n82510,82511\n82512,366\n82513,406\n82514,9030\n82515,388\n82516,344\n82517,2116\n82519,209\n82520,366\n82521,366\n82522,247\n82522,809\n82523,393\n82524,485\n82525,1085\n82526,302\n82526,893\n82527,406\n82528,893\n82529,21944\n82530,30\n82532,1860\n82534,79\n82535,160\n82536,233\n82537,344\n82538,298\n82539,1210\n82540,392\n82540,623\n82540,1143\n82541,1132\n82542,1132\n82543,1419\n82544,1132\n82545,195\n82546,82547\n82546,84984\n82546,85387\n82546,87646\n82546,89932\n82546,91222\n82546,93319\n82546,98700\n82546,100187\n82546,118797\n82546,119069\n82546,122509\n82546,123972\n82546,126656\n82546,129356\n82546,137787\n82546,139860\n82546,140078\n82546,142006\n82546,144467\n82548,14472\n82549,1132\n82551,366\n82552,366\n82553,211\n82553,5101\n82554,82555\n82557,652\n82558,781\n82559,7155\n82560,1132\n82561,34\n82561,35\n82561,536\n82561,949\n82561,1019\n82561,1274\n82561,1467\n82561,1718\n82561,2266\n82561,2944\n82561,4594\n82561,6888\n82561,29475\n82562,455\n82563,647\n82564,66500\n82565,366\n82566,2775\n82567,32\n82569,209\n82570,222\n82570,455\n82570,536\n82570,694\n82571,781\n82572,676\n82573,323\n82574,360\n82574,1893\n82575,207\n82576,1871\n82577,781\n82578,781\n82579,1818\n82580,1844\n82581,83\n82583,1132\n82584,781\n82585,875\n82586,2048\n82587,75912\n82588,1082\n82589,298\n82590,485\n82591,973\n82592,10\n82592,79\n82592,206\n82592,435\n82592,622\n82592,1370\n82592,1776\n82592,5310\n82592,7614\n82593,10\n82594,875\n82595,875\n82596,781\n82597,872\n82599,195\n82600,2146\n82601,781\n82602,2116\n82602,6303\n82604,1132\n82605,781\n82606,1132\n82607,333\n82609,73570\n82610,1132\n82611,781\n82612,1132\n82613,781\n82614,312\n82615,366\n82616,1381\n82616,21944\n82617,781\n82618,2572\n82619,647\n82620,82621\n82620,100612\n82620,100634\n82622,1132\n82623,781\n82624,875\n82625,1132\n82626,2867\n82626,2868\n82628,34\n82628,35\n82628,222\n82628,313\n82628,536\n82628,588\n82628,590\n82628,634\n82628,1313\n82628,1419\n82628,2224\n82628,2646\n82628,5326\n82629,24505\n82630,2048\n82631,781\n82632,366\n82633,1130\n82634,1326\n82635,1132\n82636,11\n82637,1140\n82638,1860\n82639,82533\n82640,366\n82641,640\n82643,298\n82645,406\n82645,779\n82645,1181\n82646,1983\n82647,364\n82648,298\n82649,485\n82650,298\n82651,485\n82653,292\n82654,18726\n82655,30\n82656,298\n82657,485\n82658,1247\n82658,1644\n82658,1844\n82659,1718\n82659,5034\n82660,577\n82661,298\n82662,485\n82664,726\n82664,859\n82665,360\n82665,1289\n82666,920\n82666,1181\n82667,818\n82668,30\n82669,1506\n82670,577\n82670,1466\n82671,781\n82672,292\n82673,1370\n82673,2782\n82673,3876\n82673,36398\n82674,1132\n82675,781\n82676,1\n82676,20\n82676,668\n82676,1623\n82677,292\n82678,1132\n82679,781\n82680,1983\n82681,48\n82682,292\n82683,298\n82684,485\n82686,406\n82686,2931\n82688,6068\n82689,82690\n82691,171\n82692,422\n82693,2116\n82694,82694\n82695,1118\n82696,1132\n82697,781\n82698,392\n82699,1132\n82700,781\n82701,30\n82702,3\n82703,631\n82703,1085\n82703,1579\n82703,1893\n82703,2590\n82703,3623\n82703,185877\n82704,1132\n82705,781\n82706,1043\n82706,1267\n82707,1323\n82708,102\n82709,1326\n82710,408\n82711,10\n82711,113156\n82712,22\n82713,1132\n82714,781\n82716,1167\n82716,2292\n82716,2334\n82717,1274\n82719,298\n82720,485\n82722,72\n82723,344\n82724,285\n82725,240\n82726,298\n82727,485\n82728,1132\n82729,781\n82730,2116\n82731,827\n82731,1818\n82731,3069\n82731,3695\n82731,75912\n82733,390\n82733,1580\n82733,4222\n82734,1274\n82736,818\n82737,1132\n82738,781\n82739,134\n82739,493\n82739,626\n82739,685\n82739,973\n82739,1240\n82739,1323\n82739,3538\n82739,221828\n82739,227376\n82742,298\n82743,485\n82744,1888\n82744,2590\n82746,3804\n82746,187176\n82748,1298\n82749,160\n82750,1860\n82751,4192\n82751,4193\n82752,298\n82753,485\n82754,1132\n82755,781\n82756,1860\n82759,376\n82760,376\n82761,184\n82761,2244\n82763,1284\n82763,148742\n82764,278\n82765,1572\n82766,1977\n82766,1978\n82767,14458\n82769,65\n82770,82771\n82772,140\n82773,2116\n82774,1722\n82775,82776\n82777,93\n82777,94\n82778,83\n82779,222\n82779,1019\n82780,2048\n82781,192\n82782,518\n82783,3\n82784,1805\n82785,1805\n82786,1711\n82787,50\n82788,8798\n82789,417\n82790,1837\n82791,1893\n82793,444\n82794,663\n82794,664\n82795,1836\n82796,227\n82797,1265\n82797,1266\n82798,718\n82799,579\n82801,372\n82802,72\n82803,344\n82804,285\n82805,850\n82807,5405\n82808,827\n82809,298\n82810,485\n82811,392\n82812,47\n82812,2469\n82813,850\n82814,140\n82815,82816\n82817,713\n82819,104\n82819,289\n82819,290\n82819,337\n82819,726\n82819,94134\n82819,149534\n82820,82821\n82822,795\n82822,14797\n82823,140\n82825,1608\n82826,1860\n82828,140\n82829,209\n82830,140\n82831,1151\n82831,2697\n82831,4903\n82832,82833\n82835,140\n82836,850\n82837,640\n82838,1220\n82838,1222\n82839,1688\n82839,26288\n82839,32978\n82839,78717\n82840,1359\n82841,2421\n82842,2574\n82843,2372\n82844,1858\n82845,1860\n82846,850\n82847,1132\n82848,1132\n82849,781\n82850,781\n82852,805\n82853,1132\n82854,781\n82855,147\n82856,72\n82857,344\n82858,285\n82859,1181\n82860,202\n82860,203\n82861,79\n82862,720\n82863,2421\n82864,1132\n82865,781\n82866,1983\n82867,54\n82868,2646\n82869,289\n82869,290\n82869,1631\n82870,337\n82870,500\n82871,301\n82871,968\n82872,439\n82872,1474\n82872,1612\n82872,1789\n82873,136\n82873,1332\n82873,1368\n82874,202\n82874,203\n82875,2105\n82876,467\n82877,302\n82879,4039\n82880,713\n82881,298\n82884,58\n82884,1140\n82885,885\n82886,50\n82886,1515\n82887,240\n82888,10\n82889,968\n82890,24505\n82891,151\n82892,248\n82893,2421\n82896,1140\n82897,1392\n82898,406\n82900,349\n82900,809\n82901,1515\n82902,68069\n82903,1837\n82904,140\n82905,82906\n82905,86955\n82905,101654\n82905,105045\n82905,108544\n82905,124950\n82907,1837\n82908,4\n82908,5\n82908,184\n82908,602\n82908,3218\n82909,1160\n82910,483\n82911,77\n82912,1608\n82913,850\n82914,82915\n82916,34\n82916,35\n82917,485\n82919,298\n82920,1983\n82921,79\n82922,222\n82922,1019\n82923,298\n82924,485\n82925,8270\n82926,640\n82927,72\n82928,640\n82930,640\n82931,30\n82932,2048\n82933,1531\n82934,7360\n82936,862\n82937,82938\n82939,1551\n82940,422\n82941,1392\n82942,422\n82943,422\n82944,9560\n82945,422\n82946,82947\n82948,422\n82949,422\n82950,2286\n82951,72\n82952,4192\n82952,4193\n82953,1118\n82954,376\n82955,885\n82956,275\n82957,422\n82958,640\n82959,422\n82961,3367\n82962,247\n82963,1132\n82964,781\n82965,4039\n82966,1608\n82967,850\n82968,82968\n82969,140\n82970,267\n82971,861\n82972,298\n82973,485\n82975,527\n82975,1188\n82977,261\n82978,82979\n82980,784\n82981,647\n82982,344\n82983,206\n82984,209\n82985,72\n82986,344\n82987,285\n82988,872\n82989,5101\n82990,247\n82991,206\n82992,134\n82993,994\n82994,510\n82995,217\n82995,1796\n82996,392\n82997,1127\n82998,557\n82999,557\n83000,206\n83001,515\n83001,770\n83001,49057\n83002,255\n83003,604\n83004,1175\n83005,83006\n83007,2620\n83008,10\n83009,1983\n83010,8788\n83011,2351\n83012,328\n83013,175\n83014,1623\n83015,298\n83016,485\n83017,30\n83018,392\n83018,697\n83019,305\n83020,2296\n83021,240\n83021,1285\n83022,250\n83022,1684\n83024,298\n83025,485\n83027,44\n83028,602\n83029,192\n83030,4453\n83031,1132\n83032,781\n83033,72\n83034,46\n83034,58\n83034,994\n83035,192\n83036,310\n83038,298\n83039,485\n83040,151\n83041,72\n83042,2411\n83043,298\n83044,1462\n83044,8537\n83045,83046\n83045,86218\n83045,100158\n83045,105822\n83045,111749\n83047,83048\n83050,33611\n83051,192\n83052,1096\n83053,30\n83054,5440\n83055,211\n83056,175\n83057,298\n83058,24505\n83059,1860\n83060,1181\n83061,83062\n83063,72\n83065,72\n83066,83067\n83068,83069\n83070,626\n83071,83072\n83073,146\n83074,63\n83075,3999\n83076,83077\n83078,298\n83079,30\n83081,192\n83082,83083\n83085,585\n83087,1\n83088,557\n83091,392\n83092,1522\n83093,72\n83095,388\n83095,14126\n83096,687\n83097,602\n83098,1359\n83099,1556\n83100,1844\n83101,2266\n83102,30\n83103,83104\n83105,5440\n83106,30\n83107,30\n83108,83109\n83110,83111\n83112,818\n83113,9007\n83114,652\n83115,72\n83116,72\n83117,119\n83118,83119\n83120,24505\n83121,366\n83122,366\n83123,366\n83124,366\n83125,366\n83126,366\n83127,366\n83128,366\n83129,366\n83130,366\n83131,83132\n83133,163\n83134,1033\n83135,134\n83136,2048\n83138,1130\n83139,1392\n83140,968\n83140,1241\n83140,1436\n83141,83142\n83143,422\n83144,56\n83145,140\n83145,160\n83146,233\n83147,140\n83148,1332\n83149,83150\n83152,83153\n83154,140\n83154,1381\n83155,2312\n83155,83156\n83157,140\n83158,5718\n83163,30\n83165,30\n83166,72\n83168,83169\n83170,30\n83171,163\n83171,809\n83171,83172\n83174,968\n83174,1293\n83175,676\n83177,868\n83178,1749\n83180,116\n83180,994\n83180,1010\n83180,1849\n83180,2087\n83181,137\n83183,136\n83185,355\n83186,83187\n83188,1147\n83188,1789\n83188,75912\n83189,3370\n83189,14453\n83191,83192\n83193,175\n83194,1247\n83194,1644\n83195,140\n83196,579\n83196,673\n83198,178\n83199,1105\n83200,1132\n83201,781\n83202,422\n83203,56\n83204,79\n83205,211\n83205,1556\n83205,2312\n83206,45021\n83207,45024\n83208,83209\n83210,45310\n83211,45023\n83212,45022\n83213,78232\n83214,30766\n83215,32\n83216,140\n83217,338\n83217,818\n83218,518\n83218,1326\n83219,3413\n83221,140\n83221,16196\n83224,1566\n83225,868\n83226,5326\n83228,467\n83229,972\n83230,3\n83231,83232\n83231,111741\n83234,422\n83235,422\n83236,360\n83237,83238\n83239,422\n83241,422\n83242,422\n83243,422\n83244,422\n83245,422\n83246,640\n83247,640\n83248,3069\n83250,195\n83251,489\n83252,83253\n83255,278\n83255,338\n83257,302\n83258,557\n83259,358\n83260,2775\n83261,447\n83262,843\n83262,1231\n83263,15\n83264,34\n83264,35\n83264,37\n83264,41\n83264,68\n83264,71\n83264,83\n83264,86\n83264,107\n83264,136\n83264,151\n83264,167\n83264,187\n83264,222\n83264,240\n83264,248\n83264,251\n83264,294\n83264,313\n83264,347\n83264,417\n83264,424\n83264,431\n83264,467\n83264,557\n83264,589\n83264,605\n83264,615\n83264,631\n83264,736\n83264,784\n83264,795\n83264,805\n83264,818\n83264,843\n83264,861\n83264,907\n83264,920\n83264,934\n83264,957\n83264,973\n83264,980\n83264,1001\n83264,1012\n83264,1119\n83264,1124\n83264,1133\n83264,1140\n83264,1167\n83264,1210\n83264,1235\n83264,1241\n83264,1243\n83264,1285\n83264,1335\n83264,1370\n83264,1612\n83264,1782\n83264,1785\n83264,1815\n83264,1955\n83264,2260\n83264,2590\n83264,2620\n83264,2931\n83264,2979\n83264,2995\n83264,3135\n83264,3193\n83264,5547\n83264,9021\n83264,13136\n83264,103860\n83265,72\n83266,344\n83267,285\n83269,3260\n83270,72\n83271,422\n83272,56\n83273,298\n83274,485\n83275,58\n83276,1132\n83277,781\n83279,48\n83280,30\n83281,298\n83282,485\n83284,30\n83285,93\n83285,94\n83286,4193\n83287,2775\n83288,1983\n83289,83\n83290,79\n83291,973\n83293,149\n83294,920\n83295,2626\n83296,3804\n83297,1132\n83298,781\n83299,20771\n83300,18726\n83301,217\n83301,240\n83301,392\n83301,1085\n83301,1417\n83301,1467\n83301,9005\n83302,72\n83303,439\n83304,1556\n83305,30\n83306,733\n83307,79\n83308,81661\n83310,75912\n83311,3447\n83312,1243\n83313,2116\n83314,68\n83314,79\n83314,192\n83314,222\n83314,333\n83314,467\n83314,516\n83314,631\n83314,1119\n83314,1284\n83314,1623\n83314,1722\n83315,275\n83315,1265\n83315,1266\n83316,2775\n83317,2353\n83317,75912\n83319,252\n83319,586\n83321,167\n83321,972\n83321,973\n83321,1010\n83321,1732\n83321,73570\n83322,83323\n83326,31934\n83328,3524\n83329,14989\n83330,30\n83331,968\n83332,298\n83333,485\n83334,50\n83335,515\n83337,30\n83338,251\n83338,516\n83338,1512\n83338,5992\n83339,30\n83340,389\n83340,1019\n83340,1467\n83340,2421\n83341,240\n83341,1309\n83342,79\n83342,312\n83342,1749\n83343,240\n83344,3069\n83345,1284\n83346,298\n83347,485\n83348,1707\n83349,22\n83349,718\n83350,422\n83351,56\n83352,298\n83353,485\n83354,298\n83355,485\n83356,1983\n83357,298\n83358,485\n83359,1551\n83360,312\n83360,525\n83360,1749\n83361,175\n83362,1240\n83363,1655\n83364,2017\n83365,30\n83366,1132\n83367,781\n83368,794\n83369,444\n83370,493\n83370,586\n83370,1265\n83370,1266\n83370,1370\n83372,158\n83373,868\n83374,557\n83375,30\n83376,72\n83377,83378\n83379,602\n83379,694\n83379,733\n83379,1014\n83379,1326\n83379,1844\n83379,1955\n83379,13538\n83380,919\n83381,298\n83382,485\n83383,336\n83383,75912\n83384,392\n83384,433\n83384,875\n83385,3069\n83386,83387\n83388,1122\n83389,726\n83390,83391\n83392,136\n83393,733\n83394,312\n83395,1243\n83396,83397\n83396,202253\n83398,298\n83399,485\n83400,111\n83401,147\n83401,336\n83401,1888\n83401,149534\n83402,477\n83403,83404\n83405,336\n83405,640\n83406,240\n83406,406\n83407,58\n83408,46\n83409,58\n83410,46\n83411,83412\n83413,1977\n83413,1978\n83414,30\n83415,20\n83416,693\n83417,1147\n83418,1983\n83419,72\n83420,344\n83421,285\n83422,251\n83422,1927\n83423,2116\n83424,30\n83425,489\n83425,1531\n83428,178\n83428,346\n83428,435\n83428,439\n83428,447\n83428,1531\n83428,1590\n83428,5212\n83428,6119\n83429,1381\n83430,83431\n83432,596\n83433,302\n83433,344\n83434,22\n83434,240\n83434,516\n83435,4611\n83436,302\n83437,875\n83439,599\n83441,372\n83441,1888\n83442,63\n83444,1118\n83445,81\n83445,1392\n83445,1745\n83446,349\n83446,392\n83446,623\n83447,406\n83448,22\n83449,462\n83449,872\n83450,2775\n83451,222\n83454,1983\n83456,340\n83457,1298\n83459,595\n83460,160\n83462,2116\n83463,30\n83464,30\n83465,72764\n83466,72\n83467,147\n83467,1803\n83468,344\n83469,285\n83470,83471\n83472,1181\n83473,178\n83474,406\n83475,83476\n83477,83476\n83478,83476\n83479,83476\n83480,302\n83480,811\n83480,893\n83481,30\n83483,147\n83483,158\n83484,158\n83484,406\n83485,30\n83486,83487\n83489,875\n83490,861\n83490,2116\n83491,10\n83492,272\n83493,301\n83493,1782\n83494,298\n83495,485\n83496,104\n83496,134\n83496,631\n83496,1119\n83496,1179\n83496,1282\n83496,1715\n83496,2286\n83498,1955\n83498,2089\n83498,2286\n83498,2940\n83498,21944\n83499,1132\n83500,781\n83502,264\n83503,178\n83504,41\n83504,72\n83504,79\n83504,104\n83504,120\n83504,163\n83504,178\n83504,192\n83504,200\n83504,211\n83504,222\n83504,275\n83504,301\n83504,315\n83504,328\n83504,349\n83504,358\n83504,366\n83504,372\n83504,389\n83504,390\n83504,392\n83504,397\n83504,406\n83504,467\n83504,481\n83504,500\n83504,544\n83504,562\n83504,571\n83504,588\n83504,590\n83504,596\n83504,602\n83504,660\n83504,666\n83504,671\n83504,694\n83504,760\n83504,779\n83504,784\n83504,801\n83504,809\n83504,818\n83504,868\n83504,920\n83504,949\n83504,957\n83504,972\n83504,1010\n83504,1019\n83504,1085\n83504,1119\n83504,1140\n83504,1149\n83504,1188\n83504,1220\n83504,1222\n83504,1224\n83504,1240\n83504,1276\n83504,1284\n83504,1345\n83504,1359\n83504,1385\n83504,1419\n83504,1462\n83504,1515\n83504,1616\n83504,1623\n83504,1631\n83504,1707\n83504,1801\n83504,1815\n83504,1858\n83504,1893\n83504,1904\n83504,1908\n83504,1983\n83504,2371\n83504,2557\n83504,2572\n83504,2775\n83504,3115\n83504,3182\n83504,3258\n83504,4455\n83504,5102\n83504,5405\n83504,8270\n83504,8332\n83504,8537\n83504,17309\n83504,21442\n83504,28130\n83504,30365\n83504,31803\n83504,40566\n83504,68069\n83504,75912\n83504,80519\n83504,81070\n83504,86832\n83504,95278\n83504,127158\n83504,128466\n83504,141912\n83504,142430\n83504,162599\n83504,175323\n83504,178576\n83504,201326\n83504,220502\n83505,713\n83506,178\n83507,83508\n83509,104\n83509,557\n83510,261\n83510,333\n83511,302\n83511,893\n83512,301\n83512,444\n83512,1300\n83513,515\n83514,1\n83514,1227\n83514,86416\n83516,83517\n83518,483\n83519,972\n83520,581\n83520,750\n83520,2923\n83520,4571\n83521,48\n83524,516\n83525,70631\n83527,21944\n83528,30\n83529,298\n83530,485\n83531,671\n83533,1181\n83534,1078\n83535,586\n83536,6682\n83537,563\n83538,2292\n83539,8788\n83540,272\n83541,1140\n83542,868\n83543,602\n83544,392\n83544,1010\n83545,22\n83546,2557\n83547,111\n83547,2209\n83548,992\n83548,1631\n83548,1973\n83548,2045\n83548,2266\n83548,6638\n83548,29475\n83548,88653\n83548,88654\n83549,827\n83550,222\n83551,832\n83552,1220\n83552,1222\n83554,202\n83554,203\n83555,83556\n83557,272\n83558,272\n83559,622\n83560,1515\n83561,620\n83562,1467\n83563,296\n83564,83565\n83566,264\n83567,388\n83568,1888\n83569,557\n83570,34\n83570,35\n83571,657\n83572,1\n83573,660\n83574,72\n83575,344\n83576,285\n83577,24505\n83578,406\n83580,1132\n83581,781\n83582,147\n83582,195\n83584,557\n83585,30\n83587,1\n83588,289\n83588,290\n83588,94134\n83589,1983\n83590,72\n83591,30\n83593,83594\n83595,704\n83596,424\n83597,885\n83598,1220\n83598,4220\n83599,175\n83600,298\n83601,485\n83602,3507\n83603,1466\n83604,298\n83605,72\n83606,9121\n83607,2421\n83608,1370\n83609,647\n83610,344\n83611,809\n83612,602\n83613,10\n83614,264\n83615,2674\n83616,83617\n83618,1370\n83619,1607\n83619,1634\n83621,3\n83622,298\n83623,485\n83624,4611\n83625,1789\n83626,779\n83626,1515\n83627,247\n83628,1132\n83629,781\n83630,455\n83630,1019\n83631,811\n83632,83632\n83633,1127\n83635,493\n83636,5405\n83637,1860\n83638,1227\n83638,1229\n83639,671\n83640,83\n83641,83642\n83643,83644\n83645,30\n83646,298\n83647,485\n83648,1782\n83649,422\n83650,56\n83651,240\n83651,289\n83651,290\n83651,338\n83651,144988\n83652,527\n83654,3161\n83655,83656\n83657,557\n83658,557\n83659,50\n83660,527\n83660,743\n83661,422\n83662,56\n83663,287\n83664,298\n83665,485\n83666,422\n83667,56\n83668,1181\n83668,3507\n83669,1363\n83670,30\n83671,298\n83672,485\n83673,376\n83674,885\n83675,1707\n83676,118\n83676,4597\n83677,4\n83677,5\n83677,280\n83677,483\n83677,644\n83677,731\n83677,743\n83677,885\n83677,994\n83677,1116\n83677,1172\n83677,1432\n83677,1775\n83677,2411\n83677,2735\n83677,4611\n83677,4691\n83677,4810\n83677,4903\n83677,6487\n83677,13704\n83677,17245\n83677,88820\n83677,94510\n83677,171294\n83678,2574\n83679,83680\n83682,628\n83683,278\n83683,595\n83683,1151\n83683,1287\n83683,1634\n83683,1871\n83683,3507\n83684,1127\n83685,346\n83686,1983\n83687,805\n83688,22\n83689,83690\n83691,5375\n83692,1983\n83693,10\n83694,1133\n83695,577\n83696,450\n83697,1274\n83699,450\n83700,58\n83701,46\n83702,247\n83703,1556\n83704,602\n83705,483\n83706,30\n83707,83708\n83707,217449\n83707,223015\n83707,223246\n83707,224902\n83707,226531\n83707,257261\n83709,1285\n83710,273\n83711,1227\n83711,1229\n83712,44\n83713,83714\n83715,30\n83716,134\n83717,1608\n83718,72764\n83719,7360\n83720,450\n83721,83722\n83723,862\n83723,1085\n83724,93\n83724,94\n83725,2351\n83726,3069\n83727,278\n83728,1452\n83729,3069\n83730,4548\n83731,516\n83732,1363\n83733,83734\n83735,83734\n83736,18726\n83737,104\n83737,134\n83737,136\n83738,366\n83739,366\n83740,366\n83741,1019\n83742,872\n83743,450\n83744,872\n83745,222\n83745,657\n83745,1019\n83745,1467\n83745,2421\n83745,5343\n83746,376\n83747,376\n83748,30\n83749,72\n83750,872\n83751,1238\n83753,83754\n83755,83754\n83756,83754\n83757,83754\n83758,18726\n83759,83760\n83761,167\n83761,2083\n83762,72\n83763,258\n83766,240\n83768,72\n83769,455\n83770,83771\n83772,298\n83773,485\n83774,1984\n83774,8714\n83775,83776\n83777,422\n83778,56\n83780,3\n83780,304\n83782,83783\n83784,233\n83785,390\n83786,83787\n83788,83789\n83792,8855\n83794,50\n83794,422\n83796,408\n83798,151\n83798,4678\n83799,8270\n83801,1132\n83802,781\n83804,83805\n83806,22\n83806,515\n83807,7757\n83808,2574\n83809,355\n83812,309\n83812,310\n83813,37414\n83814,481\n83815,652\n83818,968\n83819,1132\n83820,781\n83821,2351\n83822,8270\n83824,2567\n83825,302\n83827,2782\n83829,264\n83831,5212\n83832,865\n83833,118\n83833,4597\n83834,8719\n83835,21944\n83836,298\n83837,485\n83838,255\n83839,387\n83840,1160\n83842,818\n83843,779\n83844,222\n83846,1983\n83847,31934\n83848,31934\n83849,640\n83850,1267\n83851,5547\n83852,83853\n83855,151\n83856,192\n83858,200\n83858,225\n83858,248\n83858,1332\n83859,911\n83860,422\n83861,422\n83862,422\n83863,422\n83864,349\n83865,147\n83865,158\n83865,89035\n83866,392\n83867,422\n83868,422\n83869,422\n83870,422\n83871,1608\n83873,652\n83876,493\n83876,779\n83877,298\n83878,485\n83879,424\n83880,58\n83881,46\n83883,713\n83884,63\n83885,1858\n83886,1860\n83887,1556\n83888,932\n83889,24505\n83890,285\n83890,1515\n83891,203\n83891,479\n83892,640\n83892,146280\n83892,159365\n83895,1122\n83896,3\n83897,83\n83898,663\n83898,664\n83900,83901\n83902,2797\n83903,3623\n83904,304\n83905,1985\n83905,2775\n83906,602\n83907,175\n83908,83909\n83911,298\n83912,68\n83913,704\n83915,920\n83917,1388\n83918,602\n83921,516\n83922,83923\n83922,87342\n83924,577\n83925,264\n83926,1247\n83926,1644\n83927,120\n83927,455\n83927,1019\n83928,302\n83929,24505\n83930,200\n83932,48\n83932,731\n83933,4611\n83934,1544\n83935,2411\n83936,240\n83937,980\n83938,10\n83939,1559\n83940,805\n83940,1001\n83940,1085\n83940,1659\n83940,4222\n83940,6068\n83940,178576\n83940,212692\n83941,1181\n83943,1323\n83944,102\n83945,1326\n83946,408\n83947,272\n83947,447\n83947,1033\n83947,1877\n83949,275\n83949,72439\n83950,1983\n83951,1983\n83953,818\n83954,557\n83955,605\n83956,5405\n83957,811\n83958,328\n83960,2782\n83961,1167\n83962,647\n83963,344\n83966,479\n83967,392\n83967,2699\n83968,298\n83969,485\n83970,736\n83971,10\n83971,113156\n83972,83973\n83974,120\n83974,283\n83974,455\n83974,949\n83974,1201\n83974,1801\n83974,2779\n83974,2784\n83974,4637\n83974,13980\n83975,83976\n83977,5547\n83978,18726\n83979,22\n83980,1509\n83982,24505\n83983,298\n83984,485\n83985,1977\n83985,1978\n83986,9121\n83987,1082\n83988,477\n83989,251\n83990,1634\n83991,827\n83992,604\n83994,264\n83995,18298\n83996,93\n83996,94\n83997,647\n83997,1893\n83998,58\n83999,46\n84000,1181\n84001,784\n84002,3422\n84003,4672\n84005,63\n84005,252\n84005,516\n84005,1220\n84005,1222\n84006,1181\n84007,581\n84009,184\n84010,302\n84011,58\n84012,46\n84013,1181\n84014,3555\n84015,4611\n84016,1544\n84017,745\n84017,1677\n84018,312\n84018,516\n84019,596\n84020,72\n84021,171\n84022,81\n84023,107\n84023,675\n84023,1515\n84023,1849\n84023,89035\n84024,310\n84024,3039\n84025,160\n84026,2737\n84027,518\n84028,3193\n84029,31122\n84030,84031\n84032,247\n84033,310\n84034,217\n84034,278\n84034,356\n84034,536\n84035,84036\n84037,267\n84038,313\n84038,1309\n84038,1805\n84038,2105\n84038,4597\n84038,75912\n84039,668\n84040,84041\n84043,994\n84044,304\n84044,644\n84044,994\n84044,1801\n84045,1010\n84048,120\n84048,1419\n84049,2421\n84050,158\n84050,247\n84051,15523\n84052,1608\n84053,1235\n84053,1335\n84054,84055\n84056,79\n84057,872\n84058,379\n84060,84061\n84060,113361\n84060,123893\n84060,124641\n84060,132810\n84060,142700\n84062,485\n84066,2421\n84067,2421\n84068,1359\n84070,3069\n84071,1722\n84072,30\n84074,660\n84075,1590\n84076,10\n84077,1836\n84078,336\n84079,84080\n84081,192\n84083,146\n84083,779\n84083,1515\n84084,720\n84084,877\n84084,907\n84084,1284\n84084,1522\n84084,1732\n84084,2191\n84084,3194\n84084,3422\n84085,86\n84086,605\n84087,5662\n84088,1849\n84089,301\n84090,1231\n84091,5718\n84092,1564\n84093,2083\n84094,2620\n84095,1837\n84096,3422\n84097,3193\n84098,1241\n84099,1782\n84100,1522\n84101,2191\n84102,907\n84103,3194\n84104,1167\n84105,968\n84106,1544\n84107,3218\n84108,3207\n84109,3138\n84110,2557\n84111,1298\n84112,720\n84113,1210\n84114,1359\n84115,2421\n84116,104\n84117,146\n84118,328\n84119,84120\n84121,589\n84121,818\n84121,907\n84121,953\n84121,1414\n84121,2351\n84121,2995\n84121,6068\n84121,8788\n84121,15573\n84123,2775\n84124,447\n84125,264\n84126,406\n84127,433\n84128,58\n84129,46\n84130,30\n84131,30\n84132,356\n84133,415\n84133,431\n84133,509\n84133,631\n84133,1453\n84133,1454\n84133,1949\n84133,3258\n84133,21982\n84134,392\n84135,192\n84135,333\n84135,84136\n84137,202\n84137,203\n84138,247\n84139,30\n84140,698\n84141,84142\n84143,1082\n84144,779\n84145,10\n84146,30\n84147,84148\n84149,222\n84149,240\n84149,657\n84150,10\n84151,10\n84152,30\n84153,1556\n84154,10\n84155,30\n84157,713\n84158,30\n84159,1118\n84160,615\n84160,968\n84160,1293\n84160,1300\n84161,2048\n84162,450\n84164,72\n84165,1181\n84166,30\n84167,450\n84168,3321\n84169,589\n84169,5358\n84170,84171\n84172,1634\n84174,72\n84176,1085\n84177,15119\n84178,1203\n84179,10\n84180,577\n84183,10\n84184,557\n84185,30\n84186,657\n84187,1531\n84188,25873\n84189,1608\n84190,483\n84192,358\n84193,694\n84193,2775\n84194,84195\n84196,20\n84196,309\n84196,310\n84196,577\n84196,929\n84196,1400\n84196,2372\n84196,21442\n84196,21944\n84197,577\n84198,640\n84199,1807\n84200,298\n84201,485\n84202,462\n84202,1673\n84203,1181\n84204,2775\n84205,10\n84206,72\n84207,8990\n84208,516\n84209,3999\n84210,267\n84211,10\n84212,32\n84212,392\n84212,1363\n84212,2274\n84212,2699\n84213,84214\n84215,298\n84216,485\n84217,84218\n84219,557\n84220,557\n84221,30\n84222,376\n84223,15179\n84224,885\n84225,44\n84226,6682\n84227,2116\n84228,314\n84228,698\n84229,626\n84230,118\n84230,4597\n84231,536\n84232,2146\n84233,58\n84234,46\n84236,84237\n84238,175\n84239,298\n84240,602\n84241,440\n84242,30\n84243,577\n84244,298\n84245,485\n84246,406\n84247,72\n84248,9025\n84249,3872\n84250,1608\n84251,1782\n84252,84253\n84254,72\n84255,83\n84255,1235\n84255,1335\n84256,84257\n84258,250\n84258,1684\n84259,1711\n84260,72\n84261,72\n84262,84263\n84264,1888\n84264,1962\n84265,30\n84266,602\n84267,1235\n84267,1335\n84268,72\n84269,450\n84270,72\n84271,32475\n84272,664\n84272,20359\n84273,644\n84274,13\n84275,30\n84276,73452\n84277,84278\n84279,30\n84280,479\n84281,30\n84282,84283\n84284,2590\n84285,1298\n84286,602\n84287,1893\n84288,1849\n84289,84290\n84289,100895\n84289,109798\n84289,112126\n84291,84292\n84293,84294\n84295,84296\n84295,96506\n84297,84292\n84298,207\n84299,30\n84300,84301\n84302,872\n84303,1429\n84304,30\n84305,920\n84306,84307\n84309,668\n84310,84311\n84312,84313\n84314,697\n84314,1769\n84315,18726\n84316,4895\n84318,1238\n84320,2073\n84321,84322\n84324,84325\n84324,215733\n84327,310\n84328,309\n84328,310\n84329,1143\n84330,72\n84331,84331\n84334,30\n84335,676\n84337,346\n84338,366\n84339,366\n84340,2782\n84342,84343\n84344,84345\n84346,431\n84347,84348\n84349,84350\n84351,84352\n84353,72\n84354,84355\n84356,10\n84357,779\n84358,84359\n84360,72\n84361,84362\n84361,129382\n84361,130126\n84363,310\n84364,72\n84365,84366\n84368,233\n84369,84370\n84371,818\n84373,2775\n84374,211\n84375,10\n84375,113156\n84378,2048\n84379,298\n84380,485\n84381,75912\n84384,72\n84385,75912\n84386,8854\n84387,17228\n84388,349\n84389,2443\n84392,298\n84393,485\n84394,4611\n84395,1544\n84396,3447\n84397,355\n84398,298\n84399,485\n84400,298\n84401,485\n84402,75912\n84403,107\n84403,118\n84403,306\n84403,307\n84403,309\n84403,310\n84403,417\n84403,483\n84403,644\n84403,784\n84403,1240\n84403,1432\n84403,1571\n84403,1722\n84403,1912\n84403,2315\n84403,2367\n84403,4597\n84403,4771\n84403,6556\n84403,15807\n84403,19010\n84403,232766\n84405,272\n84406,84407\n84406,117511\n84406,200790\n84408,644\n84408,668\n84409,392\n84410,805\n84411,1432\n84412,298\n84413,485\n84414,298\n84415,485\n84416,146\n84416,2699\n84417,298\n84418,485\n84419,79\n84420,298\n84421,485\n84422,72\n84424,298\n84425,485\n84426,72\n84427,298\n84428,485\n84429,911\n84430,298\n84431,485\n84432,72\n84433,376\n84434,2116\n84435,24505\n84436,314\n84437,147\n84437,158\n84437,1181\n84437,2244\n84438,298\n84439,485\n84440,298\n84441,485\n84442,140\n84444,346\n84445,171\n84446,163\n84447,1847\n84448,298\n84449,485\n84450,1247\n84450,1644\n84451,130\n84452,222\n84453,298\n84454,485\n84455,171\n84456,298\n84457,485\n84458,336\n84458,422\n84458,1803\n84458,1837\n84460,298\n84461,485\n84462,298\n84463,485\n84464,160\n84464,424\n84466,211\n84467,298\n84468,485\n84469,640\n84470,298\n84471,485\n84472,640\n84473,640\n84474,259\n84474,577\n84475,24505\n84476,104\n84476,138\n84476,503\n84476,1212\n84476,1282\n84476,1882\n84477,1274\n84478,310\n84478,3039\n84479,392\n84479,1893\n84480,920\n84481,24505\n84482,84483\n84484,217\n84485,497\n84486,483\n84486,602\n84489,87\n84490,63\n84490,140\n84490,360\n84491,298\n84492,485\n84493,392\n84493,809\n84493,872\n84493,15609\n84495,527\n84495,81233\n84496,84497\n84498,178\n84498,779\n84499,2775\n84500,1087\n84501,104\n84501,557\n84501,953\n84501,954\n84502,1844\n84503,2116\n84504,83\n84505,356\n84507,563\n84507,2782\n84508,1353\n84509,422\n84510,422\n84511,422\n84512,422\n84513,422\n84514,422\n84515,298\n84516,485\n84520,298\n84521,485\n84522,1172\n84523,1085\n84524,30\n84525,298\n84526,485\n84527,10\n84530,911\n84531,304\n84532,84533\n84532,90660\n84534,602\n84535,1807\n84537,84538\n84539,1227\n84539,1229\n84540,171\n84543,298\n84544,485\n84545,406\n84546,1323\n84547,102\n84548,1326\n84549,408\n84550,72\n84551,104\n84551,136\n84551,138\n84551,557\n84551,1368\n84552,2775\n84553,907\n84554,298\n84555,485\n84556,41\n84556,1119\n84557,1132\n84558,781\n84559,1\n84559,130\n84559,138\n84559,160\n84559,163\n84559,256\n84559,287\n84559,294\n84559,299\n84559,305\n84559,349\n84559,459\n84559,596\n84559,634\n84559,663\n84559,664\n84559,668\n84559,690\n84559,718\n84559,832\n84559,968\n84559,1298\n84559,1345\n84559,1381\n84559,1454\n84559,1837\n84559,1860\n84559,1871\n84559,1891\n84560,84561\n84564,602\n84567,596\n84569,602\n84570,491\n84571,84572\n84573,6323\n84574,6323\n84575,809\n84575,2116\n84576,1149\n84578,6323\n84579,79\n84580,171\n84581,422\n84582,1220\n84582,1222\n84583,252\n84584,251\n84585,2775\n84586,749\n84587,1858\n84589,21944\n84590,147\n84591,298\n84592,485\n84594,2116\n84595,43610\n84596,602\n84597,1133\n84598,8598\n84599,372\n84599,2146\n84601,1140\n84602,1707\n84603,298\n84604,485\n84606,149\n84606,158\n84607,10\n84608,557\n84609,259\n84609,273\n84609,415\n84609,22293\n84610,206\n84611,1522\n84612,2205\n84612,2206\n84612,33424\n84613,84614\n84615,392\n84615,697\n84616,84617\n84618,3413\n84619,175\n84620,298\n84621,273\n84621,682\n84621,72439\n84622,30\n84623,84624\n84625,211\n84625,500\n84626,252\n84627,2017\n84628,577\n84630,393\n84631,920\n84634,1033\n84635,873\n84635,1052\n84635,5405\n84636,1191\n84637,84638\n84641,2205\n84641,2206\n84641,33424\n84642,1370\n84643,4504\n84643,8989\n84645,206\n84645,2487\n84646,422\n84647,720\n84648,9098\n84649,30\n84650,84651\n84650,85511\n84650,86766\n84650,98676\n84650,101139\n84650,101664\n84653,252\n84654,1113\n84655,1191\n84655,5405\n84656,111\n84657,668\n84658,805\n84659,192\n84661,30\n84662,302\n84663,81\n84663,192\n84664,3161\n84665,84666\n84667,1010\n84668,84669\n84668,157996\n84670,1531\n84671,30\n84672,720\n84673,93\n84673,94\n84676,30\n84677,120\n84678,84679\n84678,95319\n84678,122232\n84680,30\n84681,843\n84681,75912\n84683,84684\n84686,1634\n84687,749\n84688,147\n84688,149\n84688,184\n84688,1623\n84690,84691\n84692,30\n84693,1425\n84696,1181\n84697,84698\n84699,3069\n84700,861\n84702,1345\n84702,1655\n84703,417\n84704,827\n84705,5469\n84706,24505\n84707,1608\n84708,30\n84709,5440\n84710,1227\n84710,1229\n84711,929\n84712,652\n84713,4611\n84714,3135\n84715,1858\n84716,1860\n84717,275\n84718,280\n84718,1877\n84718,17245\n84719,126\n84719,1300\n84720,589\n84721,1419\n84722,1070\n84723,994\n84724,2379\n84725,118\n84725,4597\n84726,72\n84727,2205\n84727,2206\n84728,147\n84728,149\n84729,1539\n84730,19443\n84731,859\n84732,84733\n84732,84956\n84732,97001\n84732,97634\n84732,104904\n84732,124724\n84732,129617\n84734,1860\n84735,84733\n84736,1858\n84737,1860\n84739,259\n84740,852\n84741,83\n84742,23010\n84743,640\n84744,211\n84745,2045\n84746,84747\n84748,693\n84749,30331\n84750,372\n84751,195\n84752,118\n84752,4597\n84753,620\n84754,298\n84755,485\n84757,2797\n84759,1240\n84760,72\n84761,24505\n84762,84763\n84764,84763\n84765,84763\n84765,90852\n84766,749\n84767,640\n84768,118\n84768,4597\n84769,84770\n84771,84772\n84773,84774\n84775,1556\n84776,175\n84777,298\n84778,640\n84779,557\n84780,3\n84782,1858\n84783,1860\n84784,72\n84785,72\n84786,355\n84787,84257\n84788,84789\n84790,84791\n84792,640\n84793,536\n84794,2073\n84795,30\n84795,557\n84795,1332\n84795,5405\n84795,84796\n84798,358\n84799,868\n84800,72\n84801,433\n84802,3260\n84803,8719\n84804,138\n84805,865\n84806,557\n84807,137\n84808,118\n84808,4597\n84809,21944\n84810,68069\n84811,809\n84812,84813\n84814,84815\n84814,86980\n84814,91457\n84814,176987\n84816,1132\n84817,781\n84819,248\n84820,1836\n84821,1782\n84822,106\n84822,586\n84822,1370\n84822,6119\n84823,676\n84824,586\n84825,4193\n84825,8822\n84826,72\n84827,72\n84828,1983\n84829,84830\n84831,72\n84832,83\n84833,84834\n84835,72\n84836,84837\n84838,84837\n84839,577\n84840,217\n84841,2797\n84842,505\n84843,255\n84844,211\n84845,298\n84846,485\n84847,1181\n84848,347\n84848,1402\n84849,4611\n84850,72\n84851,557\n84852,557\n84853,83\n84854,557\n84855,2775\n84856,83\n84858,84859\n84860,518\n84860,622\n84860,682\n84860,891\n84860,1326\n84860,2646\n84860,2775\n84860,57354\n84860,72439\n84860,156379\n84861,2116\n84862,72\n84863,72\n84864,602\n84865,422\n84866,422\n84867,422\n84868,422\n84870,84871\n84872,136\n84873,289\n84873,290\n84874,72\n84875,422\n84876,422\n84877,298\n84878,485\n84879,743\n84880,72\n84881,84882\n84883,477\n84884,310\n84885,44\n84886,72\n84887,577\n84888,248\n84889,422\n84890,4611\n84891,422\n84892,1\n84893,298\n84894,485\n84895,422\n84896,72\n84898,7614\n84899,84900\n84901,525\n84902,72\n84903,50\n84903,211\n84903,571\n84903,868\n84905,72\n84907,72\n84908,84909\n84910,30\n84912,83\n84913,644\n84914,72\n84916,187\n84917,84918\n84919,2351\n84920,8788\n84921,72\n84922,30\n84923,636\n84925,615\n84926,704\n84927,2590\n84928,84929\n84930,72\n84931,72\n84932,1359\n84933,72\n84934,1118\n84934,1181\n84935,84936\n84937,72\n84938,207\n84939,84940\n84941,305\n84942,72\n84943,301\n84944,84945\n84944,132646\n84944,144847\n84946,72\n84947,81\n84948,872\n84949,1429\n84950,1590\n84951,10\n84952,3413\n84953,668\n84954,640\n84957,84958\n84957,99950\n84957,124351\n84959,84956\n84960,84961\n84962,1379\n84963,175\n84965,298\n84967,167\n84967,392\n84967,1240\n84968,30\n84969,188\n84970,2266\n84971,3331\n84972,63\n84973,615\n84974,483\n84975,1749\n84976,1143\n84977,2292\n84978,167\n84979,704\n84980,84981\n84982,84983\n84985,72\n84986,872\n84987,222\n84988,84989\n84988,100529\n84988,255613\n84990,84991\n84992,65\n84992,252\n84992,994\n84992,1572\n84992,2797\n84992,3260\n84992,3846\n84993,84994\n84993,258743\n84995,151\n84996,84997\n84998,225\n84999,175\n85000,298\n85001,147\n85001,158\n85002,85003\n85004,85005\n85006,85007\n85008,85009\n85010,1977\n85010,1978\n85011,872\n85012,8884\n85013,1085\n85014,366\n85015,9195\n85016,85017\n85018,68\n85019,8270\n85020,233\n85021,85022\n85024,30\n85025,28072\n85026,85027\n85028,1531\n85029,72\n85030,481\n85030,2083\n85030,4637\n85031,140\n85032,85033\n85034,72\n85036,355\n85037,1001\n85038,1858\n85039,1860\n85040,1140\n85040,2443\n85040,32751\n85041,622\n85041,1531\n85042,85043\n85044,1247\n85044,1644\n85045,743\n85046,45024\n85047,45310\n85048,45023\n85049,30766\n85050,83209\n85051,49887\n85052,392\n85053,9195\n85054,175\n85055,298\n85056,13\n85057,78400\n85058,34\n85058,35\n85058,106\n85058,586\n85058,588\n85058,590\n85058,17772\n85059,85060\n85062,33082\n85063,202\n85063,203\n85064,349\n85065,83\n85066,422\n85067,56\n85068,85069\n85070,85071\n85073,85072\n85074,30\n85075,83\n85076,195\n85077,30\n85078,240\n85079,171\n85080,85081\n85080,94625\n85082,85083\n85082,87354\n85082,98408\n85082,100544\n85082,106204\n85082,231907\n85084,1323\n85085,102\n85086,1326\n85087,408\n85088,48\n85089,3447\n85090,298\n85091,485\n85092,615\n85093,485\n85094,158\n85094,192\n85094,252\n85095,163\n85097,6323\n85098,489\n85099,4101\n85100,3069\n85101,30\n85102,1181\n85103,417\n85104,1287\n85105,119\n85106,264\n85107,93\n85107,94\n85108,85108\n85109,32475\n85110,1235\n85110,1335\n85111,647\n85112,285\n85113,85114\n85115,298\n85116,485\n85117,2931\n85118,225\n85119,76096\n85120,1096\n85121,30\n85122,1151\n85123,252\n85124,3999\n85125,8270\n85126,85127\n85128,48\n85129,85130\n85129,86948\n85129,107056\n85131,3413\n85132,16045\n85133,85134\n85135,907\n85136,1181\n85137,85137\n85138,85139\n85138,86158\n85138,88327\n85138,108438\n85138,127628\n85138,129527\n85140,1634\n85141,30\n85142,450\n85143,30\n85144,30\n85145,1381\n85146,85147\n85149,994\n85150,30\n85151,85152\n85153,9195\n85154,1309\n85155,907\n85156,718\n85157,1332\n85158,1132\n85159,781\n85160,376\n85161,206\n85162,3447\n85163,85164\n85165,10\n85165,113156\n85166,1579\n85167,1983\n85168,85169\n85170,3148\n85172,85173\n85174,1300\n85176,50321\n85177,85178\n85179,1381\n85180,44\n85181,85182\n85181,150236\n85183,271\n85184,477\n85185,85186\n85187,298\n85188,485\n85189,30\n85190,298\n85191,485\n85193,85194\n85195,85196\n85197,85198\n85199,1479\n85200,298\n85201,485\n85203,15573\n85204,50\n85205,85206\n85208,3079\n85209,85210\n85211,636\n85212,595\n85213,298\n85214,485\n85215,146\n85216,85217\n85218,10\n85219,85220\n85221,85222\n85223,85224\n85225,85226\n85227,602\n85228,85229\n85230,4060\n85231,126\n85232,85233\n85234,850\n85235,602\n85236,298\n85237,485\n85238,85239\n85240,85241\n85242,6837\n85243,1844\n85244,146\n85245,85246\n85247,85248\n85249,393\n85250,31934\n85251,85252\n85253,31934\n85254,175\n85255,298\n85256,4611\n85257,483\n85258,6682\n85259,1309\n85260,85261\n85262,347\n85263,85264\n85265,85266\n85267,85268\n85269,85270\n85272,85272\n85273,3321\n85274,85275\n85276,85277\n85276,96902\n85276,104624\n85276,107586\n85278,85279\n85280,72\n85281,85282\n85283,85284\n85285,85286\n85287,85288\n85289,10\n85290,83\n85291,72\n85293,85294\n85295,85294\n85295,109784\n85295,145006\n85297,233\n85298,30\n85300,862\n85302,72\n85303,1181\n85304,85305\n85304,145784\n85306,602\n85307,602\n85308,8270\n85309,18726\n85310,107\n85311,2416\n85311,2417\n85312,292\n85313,338\n85314,298\n85316,3538\n85317,1133\n85318,85319\n85323,85324\n85325,85324\n85326,355\n85327,872\n85328,1858\n85329,1860\n85330,85331\n85332,85333\n85334,298\n85335,485\n85336,85337\n85339,85340\n85343,85344\n85345,45021\n85346,45022\n85347,78232\n85348,85349\n85350,392\n85351,4691\n85352,602\n85353,85354\n85355,259\n85358,63\n85359,376\n85360,298\n85361,275\n85362,275\n85363,240\n85364,275\n85365,275\n85366,749\n85367,275\n85368,275\n85369,275\n85370,1323\n85371,102\n85372,1326\n85373,408\n85374,85375\n85376,693\n85377,640\n85378,333\n85379,1102\n85380,652\n85381,8788\n85382,953\n85383,2351\n85384,6068\n85385,589\n85388,85389\n85390,184\n85391,1227\n85391,1229\n85391,86416\n85392,536\n85393,72\n85395,85396\n85397,72\n85398,85399\n85400,602\n85401,827\n85402,85403\n85404,2506\n85405,298\n85406,485\n85407,85408\n85409,872\n85410,872\n85411,2351\n85412,85413\n85414,195\n85416,85417\n85418,450\n85419,18298\n85420,292\n85421,85422\n85425,2048\n85426,85427\n85428,85429\n85430,211\n85432,652\n85433,336\n85434,1983\n85435,1116\n85436,818\n85437,85438\n85439,6682\n85440,85441\n85443,18726\n85444,7155\n85445,298\n85446,485\n85447,1132\n85448,781\n85449,278\n85449,455\n85450,85451\n85452,72\n85453,85454\n85455,333\n85456,217\n85457,85458\n85459,1160\n85459,73570\n85460,577\n85460,862\n85461,22\n85462,31934\n85463,22\n85464,72\n85465,1844\n85466,24505\n85467,30\n85468,147\n85469,99\n85470,841\n85473,1531\n85474,872\n85475,636\n85476,85477\n85478,298\n85479,485\n85481,81070\n85482,4903\n85483,52\n85483,175\n85483,140269\n85485,30\n85486,852\n85486,4218\n85486,4222\n85488,1247\n85488,1644\n85489,72\n85490,636\n85491,376\n85492,85493\n85494,85495\n85496,85495\n85497,31934\n85498,14434\n85499,298\n85500,485\n85502,1844\n85503,349\n85504,85505\n85506,18726\n85507,85508\n85509,85510\n85512,206\n85512,1096\n85513,85514\n85515,2779\n85516,85517\n85518,9195\n85519,9560\n85520,72\n85521,346\n85522,1287\n85523,298\n85524,485\n85525,147\n85525,158\n85525,779\n85525,1515\n85525,240174\n85526,72\n85527,44\n85528,422\n85529,422\n85530,56\n85531,417\n85533,557\n85535,104\n85536,1007\n85537,1939\n85538,137\n85539,85540\n85541,4611\n85542,392\n85543,149\n85544,417\n85545,85546\n85547,85548\n85549,366\n85550,366\n85551,366\n85552,557\n85553,862\n85554,557\n85555,309\n85555,310\n85555,483\n85555,6556\n85555,232766\n85556,557\n85557,85558\n85559,85560\n85561,602\n85562,1860\n85563,85564\n85565,483\n85566,333\n85567,360\n85567,1227\n85567,1229\n85567,21944\n85568,45022\n85569,602\n85570,392\n85571,602\n85572,602\n85573,4504\n85574,602\n85575,422\n85576,422\n85577,422\n85578,422\n85579,588\n85579,590\n85580,602\n85581,422\n85582,422\n85583,422\n85584,422\n85585,422\n85586,422\n85588,602\n85589,602\n85590,1506\n85591,602\n85592,874\n85593,3069\n85594,93\n85594,94\n85595,602\n85596,1181\n85597,310\n85598,3258\n85599,30\n85600,72\n85601,8990\n85602,3413\n85604,310\n85605,310\n85606,7358\n85606,7363\n85607,85608\n85607,199480\n85609,30\n85610,4\n85610,5\n85610,104\n85610,557\n85610,885\n85610,953\n85610,954\n85610,1368\n85610,5405\n85611,184\n85612,417\n85613,175\n85614,298\n85615,118\n85615,333\n85616,5366\n85617,85618\n85619,41\n85620,72\n85621,1175\n85622,10\n85622,872\n85623,417\n85625,417\n85626,106\n85626,1888\n85627,85628\n85630,85631\n85632,255\n85633,85634\n85635,85634\n85636,85634\n85637,932\n85638,424\n85639,3\n85640,640\n85641,2334\n85642,2572\n85643,85644\n85645,85646\n85647,652\n85648,32475\n85649,130\n85650,85651\n85652,4060\n85653,85654\n85655,206\n85656,2244\n85656,30331\n85657,79\n85658,292\n85659,294\n85660,296\n85661,298\n85663,3260\n85664,175\n85665,298\n85666,424\n85667,13\n85668,2048\n85669,85670\n85671,30\n85672,1247\n85672,1644\n85673,24505\n85674,233\n85675,3209\n85676,599\n85677,85678\n85680,1238\n85681,1452\n85682,779\n85683,23701\n85684,1776\n85686,346\n85687,273\n85688,1132\n85689,781\n85690,872\n85691,1132\n85692,781\n85693,493\n85693,843\n85693,3148\n85694,872\n85695,868\n85696,2224\n85697,2116\n85698,1707\n85699,85700\n85701,355\n85701,873\n85703,355\n85704,255\n85706,636\n85707,171\n85708,850\n85709,24505\n85710,217\n85711,217\n85712,1544\n85713,30236\n85714,1160\n85715,1531\n85718,79\n85719,360\n85719,1235\n85719,1335\n85720,671\n85721,30\n85722,3069\n85723,75912\n85725,4101\n85726,104\n85727,657\n85728,2867\n85728,2868\n85729,292\n85730,372\n85731,2779\n85731,4594\n85734,994\n85735,250\n85735,1684\n85736,14126\n85737,15\n85738,30\n85739,167\n85739,252\n85739,949\n85739,1385\n85740,118\n85740,4597\n85741,30\n85742,206\n85742,16614\n85742,66297\n85743,1231\n85743,1782\n85745,278\n85746,48\n85747,85748\n85747,87424\n85749,2719\n85751,175\n85751,693\n85752,206\n85752,704\n85752,760\n85752,1220\n85752,1531\n85752,1707\n85753,805\n85754,30\n85755,2116\n85756,1370\n85757,850\n85759,85760\n85761,640\n85762,1479\n85762,4545\n85762,139010\n85763,85764\n85763,141317\n85765,640\n85766,640\n85768,1608\n85769,1298\n85770,18726\n85775,85776\n85777,81\n85778,640\n85779,1235\n85779,1335\n85780,302\n85781,850\n85782,1556\n85783,1837\n85784,5405\n85785,209\n85786,1634\n85787,71\n85788,83\n85789,1983\n85790,579\n85793,615\n85794,2421\n85795,900\n85796,81233\n85797,622\n85798,1858\n85799,1860\n85800,1210\n85801,1085\n85801,2296\n85801,2995\n85803,338\n85804,104\n85804,457\n85804,18790\n85805,83\n85806,147\n85807,2775\n85808,302\n85808,579\n85808,861\n85809,452\n85810,1247\n85811,184\n85812,34\n85812,35\n85813,304\n85813,1429\n85813,1955\n85814,30\n85814,175\n85814,200\n85814,225\n85814,248\n85814,328\n85814,364\n85814,557\n85814,596\n85814,772\n85814,784\n85814,1309\n85814,1332\n85814,1368\n85814,4276\n85814,4936\n85814,4941\n85814,5405\n85814,15807\n85814,28203\n85814,95554\n85815,85816\n85817,149\n85817,859\n85817,1623\n85818,2867\n85818,2868\n85819,248\n85820,422\n85823,13980\n85824,85825\n85826,875\n85827,271\n85828,3003\n85829,30\n85829,328\n85829,440\n85829,622\n85829,809\n85829,992\n85829,1276\n85829,1515\n85829,2744\n85829,3246\n85829,3247\n85829,4355\n85831,8270\n85832,779\n85833,171\n85834,309\n85834,310\n85834,473\n85834,497\n85834,644\n85834,872\n85834,1058\n85834,1188\n85835,872\n85836,192\n85837,1323\n85838,102\n85839,1326\n85840,408\n85841,602\n85842,178\n85842,424\n85842,668\n85842,698\n85842,873\n85842,874\n85842,1801\n85843,93\n85843,94\n85844,849\n85845,4611\n85846,85847\n85848,571\n85848,868\n85849,1390\n85850,2017\n85850,17309\n85852,289\n85852,290\n85852,644\n85852,3003\n85852,94134\n85853,240\n85854,30\n85855,137\n85856,1749\n85857,9457\n85858,3769\n85859,120\n85859,315\n85859,694\n85859,726\n85859,953\n85859,1353\n85859,3585\n85860,1983\n85861,1132\n85862,781\n85863,433\n85864,252\n85864,278\n85864,694\n85865,850\n85866,920\n85867,1844\n85870,66\n85870,527\n85870,3246\n85872,195\n85873,1284\n85874,337\n85874,586\n85876,534\n85877,167\n85879,147\n85879,149\n85879,158\n85879,206\n85879,406\n85879,1458\n85879,1515\n85879,2244\n85879,80266\n85879,89035\n85879,149534\n85880,392\n85881,372\n85882,718\n85883,850\n85884,2116\n85885,310\n85886,85887\n85889,1068\n85890,175\n85891,298\n85892,406\n85893,602\n85894,3695\n85895,360\n85895,602\n85896,77\n85897,24505\n85898,85899\n85900,602\n85901,3069\n85902,636\n85903,195\n85904,2626\n85905,1\n85906,1454\n85907,714\n85907,15119\n85908,48\n85909,366\n85909,389\n85909,697\n85909,779\n85909,21442\n85909,76096\n85910,76096\n85911,433\n85912,636\n85914,538\n85915,920\n85916,1436\n85916,1454\n85917,171\n85918,151\n85920,875\n85921,1265\n85921,1266\n85921,3297\n85922,267\n85923,477\n85924,1181\n85925,30\n85926,557\n85927,1072\n85928,6303\n85929,58\n85931,1285\n85931,59931\n85931,84257\n85932,1659\n85933,151\n85934,32\n85935,5718\n85937,420\n85938,20\n85939,222\n85939,1133\n85940,30\n85941,1203\n85942,2146\n85943,195\n85943,2868\n85944,994\n85945,48\n85947,1432\n85948,94\n85948,2787\n85949,14434\n85950,273\n85952,1782\n85953,30\n85954,390\n85956,1522\n85957,717\n85958,1149\n85959,85960\n85959,96450\n85959,114811\n85959,177534\n85959,238938\n85959,261583\n85959,263163\n85961,1785\n85962,2929\n85963,24505\n85964,1298\n85967,1203\n85969,843\n85969,2146\n85969,5440\n85970,1203\n85971,1146\n85972,1203\n85973,85974\n85975,333\n85975,85974\n85976,85974\n85976,95129\n85977,85974\n85977,95129\n85978,107\n85978,1167\n85979,10\n85979,65\n85979,66\n85979,147\n85979,149\n85979,171\n85979,184\n85979,192\n85979,252\n85979,726\n85979,859\n85979,868\n85979,957\n85979,1247\n85979,1262\n85979,1559\n85979,1815\n85979,2253\n85979,21442\n85979,164572\n85980,663\n85980,664\n85981,85982\n85983,301\n85983,968\n85983,1782\n85984,252\n85984,1220\n85984,1222\n85986,1052\n85987,3585\n85988,85989\n85990,32\n85990,392\n85991,63\n85991,106\n85991,337\n85991,516\n85992,87\n85993,406\n85994,211\n85995,1789\n85996,406\n85997,8270\n85998,536\n85999,147\n86000,158\n86001,390\n86002,571\n86002,868\n86003,178\n86003,1531\n86003,1541\n86005,392\n86005,1240\n86006,1105\n86007,671\n86008,535\n86009,602\n86010,301\n86011,1402\n86012,509\n86012,510\n86013,422\n86014,56\n86015,298\n86015,304\n86015,3069\n86016,1782\n86018,309\n86018,310\n86019,14434\n86020,1235\n86020,1335\n86020,1400\n86021,1\n86022,1608\n86023,83\n86024,29380\n86025,86026\n86027,58\n86028,46\n86029,3177\n86030,58\n86031,46\n86032,48\n86033,1715\n86034,422\n86035,56\n86036,493\n86037,48\n86038,104\n86038,557\n86038,953\n86038,1939\n86039,7\n86039,596\n86040,636\n86041,32\n86041,34\n86041,35\n86041,77\n86041,111\n86041,202\n86041,203\n86041,217\n86041,261\n86041,283\n86041,323\n86041,346\n86041,358\n86041,388\n86041,392\n86041,406\n86041,455\n86041,493\n86041,509\n86041,536\n86041,623\n86041,694\n86041,805\n86041,859\n86041,862\n86041,873\n86041,874\n86041,919\n86041,949\n86041,996\n86041,1001\n86041,1072\n86041,1119\n86041,1201\n86041,1240\n86041,1274\n86041,1454\n86041,1465\n86041,1467\n86041,1564\n86041,1572\n86041,1590\n86041,1635\n86041,1644\n86041,1722\n86041,1801\n86041,1927\n86041,2045\n86041,2266\n86041,2274\n86041,2671\n86041,2784\n86041,2979\n86041,2989\n86041,2991\n86041,3135\n86041,3182\n86041,3538\n86041,4594\n86041,4637\n86041,6955\n86041,7092\n86041,8180\n86041,13546\n86041,14126\n86042,704\n86042,1257\n86043,272\n86043,422\n86043,788\n86043,911\n86044,772\n86045,994\n86045,3816\n86045,3817\n86046,86047\n86048,86049\n86050,1332\n86050,1955\n86050,8276\n86051,1179\n86052,79\n86053,417\n86054,483\n86055,1844\n86056,86057\n86058,86059\n86060,657\n86061,3297\n86062,417\n86065,4\n86065,5\n86065,65\n86065,160\n86065,355\n86065,390\n86065,743\n86065,1623\n86065,3209\n86065,3451\n86065,3452\n86065,17593\n86065,142879\n86066,620\n86067,30\n86067,1179\n86068,86069\n86071,10\n86071,1881\n86072,808\n86073,10\n86075,302\n86076,47\n86076,2469\n86077,1858\n86078,1860\n86079,296\n86079,647\n86079,991\n86079,1749\n86080,697\n86081,1607\n86082,4223\n86083,146\n86084,86085\n86087,392\n86087,433\n86088,86089\n86090,22\n86090,5101\n86090,258973\n86091,577\n86092,136\n86093,417\n86094,500\n86095,493\n86096,2775\n86097,14989\n86098,1531\n86099,32475\n86100,79\n86101,68\n86102,294\n86103,24505\n86104,305\n86105,175\n86106,1608\n86107,298\n86109,640\n86110,1052\n86111,355\n86112,1201\n86113,663\n86113,664\n86113,2178\n86113,4545\n86113,6119\n86114,10\n86115,3297\n86116,772\n86117,516\n86122,2048\n86123,175\n86124,298\n86125,1274\n86126,86127\n86128,1359\n86129,1556\n86130,417\n86131,31934\n86132,86133\n86134,86133\n86135,376\n86136,602\n86137,602\n86138,602\n86139,657\n86139,1033\n86139,75912\n86140,1749\n86141,1122\n86142,58\n86143,46\n86144,1116\n86145,158\n86145,307\n86146,4611\n86147,83\n86148,2671\n86149,818\n86150,1634\n86150,5547\n86151,158\n86151,307\n86152,3135\n86153,749\n86154,312\n86155,557\n86156,557\n86157,30\n86159,4611\n86160,30\n86161,1467\n86162,3069\n86163,48\n86164,872\n86165,1140\n86166,86167\n86168,86169\n86170,31934\n86171,455\n86172,30\n86173,2424\n86174,336\n86174,406\n86175,175\n86176,1370\n86176,1821\n86177,298\n86178,1247\n86178,1644\n86179,1467\n86180,222\n86181,1871\n86182,424\n86183,344\n86184,2434\n86185,2421\n86186,83\n86187,13980\n86188,338\n86189,298\n86190,485\n86191,202\n86191,203\n86192,248\n86193,86194\n86195,86194\n86196,86197\n86199,79\n86199,195\n86199,217\n86199,302\n86199,388\n86199,452\n86199,455\n86199,457\n86199,467\n86199,535\n86199,579\n86199,588\n86199,590\n86199,599\n86199,631\n86199,668\n86199,687\n86199,849\n86199,872\n86199,1149\n86199,1274\n86199,1294\n86199,1417\n86199,1639\n86199,2266\n86199,2443\n86199,2605\n86199,4177\n86199,4760\n86199,5874\n86199,14368\n86199,156379\n86200,10\n86201,83\n86202,86203\n86202,106189\n86202,113239\n86202,123304\n86202,123651\n86202,131159\n86204,79\n86206,258\n86207,640\n86208,602\n86209,602\n86210,86211\n86213,310\n86214,1359\n86215,72\n86216,344\n86217,285\n86219,1201\n86220,843\n86221,10\n86222,1235\n86222,1335\n86223,86224\n86225,10\n86225,312\n86226,644\n86227,422\n86228,422\n86229,17309\n86230,86231\n86232,422\n86233,422\n86234,1010\n86235,422\n86236,422\n86237,422\n86238,602\n86239,422\n86240,171\n86241,422\n86242,310\n86243,602\n86245,86246\n86247,86248\n86249,130\n86249,1381\n86250,86251\n86252,602\n86253,850\n86253,1572\n86257,30\n86258,602\n86259,417\n86260,602\n86261,250\n86261,1684\n86262,4611\n86263,192\n86263,622\n86263,631\n86263,841\n86263,1033\n86263,1181\n86263,1388\n86263,1531\n86264,30\n86265,86266\n86267,58\n86268,46\n86269,58\n86270,46\n86271,557\n86272,24505\n86273,86274\n86275,493\n86276,207\n86277,30\n86278,30\n86279,310\n86280,1105\n86281,255\n86282,473\n86283,86284\n86285,30\n86287,713\n86288,393\n86289,63\n86291,44\n86292,1085\n86293,30\n86294,333\n86295,6556\n86296,994\n86297,86298\n86299,30\n86300,86300\n86301,30\n86302,302\n86302,687\n86302,861\n86302,893\n86302,1556\n86303,10\n86304,1688\n86305,86306\n86307,4193\n86307,8270\n86308,664\n86308,991\n86309,9015\n86310,1414\n86311,640\n86312,86313\n86314,3161\n86315,1313\n86316,1033\n86317,8992\n86318,417\n86319,7652\n86320,652\n86321,118\n86321,8270\n86322,10\n86323,1149\n86324,310\n86325,86326\n86327,86328\n86329,63\n86329,136\n86329,261\n86330,195\n86331,28\n86331,4571\n86332,53763\n86333,86334\n86335,86336\n86337,1085\n86338,1844\n86339,289\n86339,290\n86340,1509\n86341,467\n86342,34\n86342,35\n86343,79\n86343,1247\n86344,233\n86345,24505\n86346,86347\n86348,86349\n86350,86351\n86352,86026\n86353,48\n86354,392\n86355,140\n86355,338\n86355,1224\n86355,1968\n86357,24505\n86358,58\n86359,46\n86360,50\n86361,211\n86362,355\n86363,86364\n86365,86366\n86367,86366\n86368,86366\n86369,366\n86370,3148\n86370,6323\n86371,1127\n86373,81\n86374,6556\n86375,1612\n86376,505\n86377,505\n86378,86379\n86380,1235\n86380,1335\n86381,207\n86383,48\n86384,1618\n86384,4223\n86384,13137\n86385,3297\n86386,462\n86387,158\n86388,24505\n86391,1289\n86392,2506\n86393,137\n86394,86395\n86396,86395\n86397,4101\n86398,1118\n86401,2506\n86402,10\n86402,485\n86402,571\n86402,920\n86402,1715\n86402,127158\n86403,2506\n86404,2506\n86405,2506\n86406,2506\n86407,2506\n86408,2506\n86409,2506\n86410,2506\n86411,2506\n86412,2506\n86413,2506\n86414,147\n86415,2506\n86417,184\n86418,86419\n86422,310\n86423,602\n86424,1644\n86425,500\n86426,178\n86426,272\n86426,337\n86426,346\n86426,393\n86426,435\n86426,439\n86426,447\n86426,516\n86426,934\n86426,980\n86426,1033\n86426,1175\n86426,1294\n86426,1531\n86426,1541\n86426,2178\n86426,3989\n86426,4455\n86426,4545\n86427,360\n86427,515\n86428,392\n86430,1240\n86431,58\n86432,46\n86433,660\n86434,18726\n86435,79\n86435,195\n86435,779\n86435,1515\n86436,1745\n86437,571\n86438,712\n86441,202\n86441,203\n86442,1247\n86443,86444\n86446,184\n86447,2315\n86448,86449\n86450,431\n86452,86453\n86455,500\n86456,1962\n86457,1052\n86458,1882\n86459,2775\n86460,54\n86461,217\n86461,19443\n86462,1118\n86463,626\n86464,452\n86464,457\n86464,918\n86464,1417\n86464,75912\n86464,143287\n86465,338\n86466,217\n86466,264\n86466,893\n86467,86468\n86469,86468\n86471,1149\n86472,86473\n86474,509\n86474,510\n86475,215\n86476,875\n86477,586\n86478,1052\n86478,1118\n86478,1298\n86478,6695\n86480,1631\n86481,83\n86482,953\n86484,3321\n86485,86486\n86487,32475\n86488,1284\n86488,1522\n86489,83\n86492,1181\n86493,1118\n86495,907\n86496,86497\n86498,86497\n86499,86500\n86501,49887\n86502,86503\n86504,1893\n86506,298\n86506,626\n86506,693\n86506,2995\n86507,1707\n86508,86509\n86510,420\n86511,30\n86511,1179\n86513,1181\n86514,34\n86514,35\n86516,86517\n86518,301\n86518,968\n86518,1454\n86519,30331\n86520,485\n86521,1955\n86522,28072\n86523,1858\n86524,1860\n86525,86526\n86528,54\n86529,1749\n86530,83\n86530,217\n86530,379\n86530,536\n86530,1240\n86530,2784\n86530,4637\n86531,875\n86532,406\n86533,178\n86534,1179\n86535,602\n86536,217\n86537,1132\n86538,781\n86539,422\n86541,86542\n86543,209\n86543,302\n86543,579\n86544,3079\n86545,81070\n86546,86547\n86548,2266\n86549,219\n86549,1058\n86549,1509\n86549,1653\n86549,1844\n86550,21944\n86551,136\n86552,86553\n86554,872\n86556,1836\n86557,3507\n86558,301\n86558,2083\n86559,660\n86561,22\n86561,3079\n86562,972\n86564,86565\n86566,1381\n86567,713\n86568,1132\n86569,781\n86570,83\n86571,20\n86572,175\n86573,240\n86574,1033\n86575,1323\n86576,102\n86577,1326\n86578,408\n86579,1983\n86580,298\n86581,36985\n86583,30\n86583,1179\n86584,3135\n86585,818\n86586,2244\n86587,602\n86588,515\n86588,3555\n86589,801\n86590,147\n86591,1635\n86592,859\n86593,86594\n86595,86594\n86596,298\n86597,485\n86598,104\n86598,225\n86598,953\n86598,1179\n86598,1368\n86598,1939\n86598,5405\n86598,7270\n86600,1749\n86601,2812\n86602,779\n86603,1132\n86604,781\n86605,86606\n86607,4165\n86607,75912\n86608,973\n86609,1390\n86610,187\n86611,292\n86612,10\n86612,30\n86612,693\n86612,127158\n86613,104\n86613,225\n86613,248\n86613,953\n86613,1368\n86613,1939\n86613,5405\n86613,7270\n86614,104\n86614,225\n86614,248\n86614,953\n86614,1368\n86614,1939\n86614,5405\n86614,7270\n86615,104\n86615,225\n86615,248\n86615,953\n86615,1368\n86615,1939\n86615,5405\n86615,7270\n86616,720\n86617,3695\n86618,1133\n86619,694\n86619,75912\n86620,604\n86620,861\n86620,5265\n86621,818\n86622,292\n86623,3297\n86624,1058\n86625,292\n86626,805\n86626,1955\n86627,83\n86628,1132\n86629,781\n86630,292\n86632,292\n86633,1805\n86634,1132\n86635,781\n86636,292\n86637,10\n86638,292\n86639,86640\n86641,207\n86642,292\n86643,1033\n86644,292\n86645,175\n86646,30\n86646,1179\n86647,298\n86648,477\n86649,1132\n86650,781\n86653,1132\n86654,781\n86655,647\n86656,344\n86657,301\n86658,1436\n86658,1707\n86658,3769\n86659,579\n86659,694\n86659,75912\n86660,602\n86661,1392\n86662,2274\n86664,13546\n86665,444\n86666,192\n86667,743\n86667,8714\n86667,95583\n86668,86669\n86670,406\n86671,592\n86672,1118\n86673,217\n86673,1417\n86674,217\n86674,1212\n86674,1462\n86674,8537\n86674,9015\n86676,5440\n86677,106\n86678,2434\n86680,298\n86681,485\n86682,301\n86683,577\n86684,2334\n86686,314\n86686,779\n86686,141912\n86687,875\n86688,509\n86689,493\n86690,1454\n86691,30\n86691,328\n86691,1179\n86692,147\n86693,1506\n86694,178\n86695,1634\n86698,5440\n86699,1458\n86701,779\n86702,30\n86703,195\n86704,30\n86705,2744\n86706,602\n86707,163\n86708,1132\n86709,781\n86710,5213\n86711,2006\n86713,602\n86714,602\n86715,1509\n86716,1181\n86717,1102\n86718,86718\n86719,31934\n86720,1509\n86721,1132\n86722,781\n86723,24505\n86724,1240\n86724,1634\n86725,442\n86726,406\n86726,640\n86726,841\n86726,1181\n86726,104843\n86726,106302\n86727,86728\n86729,9537\n86730,34\n86730,35\n86730,222\n86730,313\n86730,536\n86730,588\n86730,590\n86730,634\n86730,1313\n86730,1419\n86730,1718\n86730,2224\n86730,2646\n86731,86732\n86733,809\n86734,2944\n86735,312\n86735,949\n86736,255\n86737,3474\n86738,1132\n86739,781\n86740,5405\n86741,68069\n86742,1033\n86743,86744\n86745,640\n86746,10\n86747,1149\n86748,918\n86749,3474\n86750,596\n86751,86752\n86753,240\n86753,589\n86753,1001\n86753,1019\n86753,8541\n86753,14797\n86754,58\n86755,46\n86756,1149\n86757,86758\n86759,1326\n86760,818\n86761,588\n86761,590\n86762,1849\n86763,356\n86764,72\n86765,493\n86765,586\n86765,682\n86765,72439\n86767,217\n86767,536\n86767,18831\n86768,72\n86770,483\n86771,267\n86772,140\n86773,86774\n86776,1801\n86777,24505\n86779,10\n86779,113156\n86781,10\n86781,113140\n86783,10\n86783,113140\n86784,72\n86785,247\n86786,104\n86786,111\n86786,248\n86786,289\n86786,290\n86786,372\n86786,588\n86786,590\n86786,631\n86786,636\n86786,714\n86786,1181\n86786,1282\n86786,1462\n86786,1745\n86786,1955\n86786,2205\n86786,2206\n86786,2443\n86786,3804\n86786,8180\n86786,8537\n86787,10\n86787,113140\n86787,221302\n86789,376\n86791,1012\n86791,1119\n86791,1177\n86792,994\n86793,2006\n86794,222\n86795,167\n86795,73570\n86796,86797\n86798,30\n86799,1858\n86800,1860\n86801,86802\n86803,3724\n86804,86805\n86806,83\n86807,518\n86808,376\n86809,885\n86810,86811\n86812,1181\n86813,86814\n86815,30\n86815,328\n86817,86818\n86817,102115\n86817,103009\n86819,86820\n86819,119420\n86819,120180\n86821,1132\n86822,781\n86823,86824\n86823,91597\n86823,91617\n86823,101371\n86823,124255\n86823,132255\n86823,178510\n86823,195143\n86823,200567\n86823,259478\n86825,86826\n86828,289\n86828,290\n86828,1392\n86828,2205\n86828,2206\n86828,3069\n86829,4611\n86830,94\n86830,2787\n86830,86832\n86831,557\n86832,1776\n86832,80340\n86832,166410\n86832,166502\n86832,166694\n86832,167072\n86832,167074\n86832,167118\n86832,167124\n86832,167127\n86832,167129\n86832,167132\n86832,167138\n86832,167141\n86832,167151\n86832,167154\n86832,167165\n86832,167168\n86832,167169\n86832,167197\n86832,167202\n86832,167239\n86832,167240\n86832,167248\n86832,167267\n86832,167283\n86832,167311\n86832,167354\n86832,168711\n86833,704\n86835,1188\n86836,301\n86836,1085\n86838,171\n86839,1556\n86840,1531\n86841,1132\n86842,781\n86844,24505\n86845,86846\n86847,392\n86848,250\n86848,1684\n86849,1844\n86850,358\n86851,40497\n86853,298\n86854,485\n86855,801\n86856,704\n86857,557\n86858,557\n86859,1454\n86860,24505\n86861,1590\n86862,298\n86863,485\n86864,406\n86865,118\n86865,4597\n86867,340\n86868,217\n86868,406\n86868,788\n86868,3135\n86870,516\n86871,86872\n86873,1132\n86874,781\n86875,602\n86876,86877\n86878,1247\n86878,164572\n86879,2315\n86881,200\n86882,310\n86884,406\n86885,602\n86886,602\n86887,602\n86888,602\n86889,301\n86890,3148\n86891,2116\n86892,1285\n86893,10\n86893,22\n86893,120\n86893,211\n86893,309\n86893,310\n86893,360\n86893,406\n86893,483\n86893,493\n86893,657\n86893,682\n86893,694\n86893,784\n86893,1749\n86893,2045\n86893,2210\n86893,2617\n86893,4237\n86893,6556\n86893,72439\n86893,232766\n86894,86895\n86896,422\n86897,422\n86898,422\n86899,1181\n86900,422\n86901,422\n86902,86903\n86904,86903\n86905,422\n86906,422\n86907,292\n86908,2209\n86909,86910\n86911,3094\n86912,8270\n86913,577\n86914,202\n86914,203\n86915,861\n86916,175\n86917,298\n86918,86919\n86921,86922\n86921,98930\n86921,120410\n86923,649\n86924,920\n86925,83209\n86926,45024\n86927,45310\n86928,45021\n86929,254\n86930,557\n86931,10\n86931,113156\n86932,586\n86933,704\n86934,86935\n86936,779\n86937,323\n86938,366\n86939,3331\n86940,2224\n86941,1033\n86941,2045\n86942,97\n86943,704\n86944,596\n86945,2590\n86947,779\n86949,63\n86950,1844\n86951,207\n86952,175\n86953,298\n86954,818\n86956,146\n86957,163\n86958,310\n86959,704\n86960,872\n86961,1429\n86962,86963\n86964,668\n86965,86966\n86967,86968\n86969,86970\n86971,86972\n86973,72\n86974,72\n86975,72\n86976,872\n86977,2048\n86978,86979\n86981,994\n86982,48\n86984,1432\n86985,94\n86985,2787\n86986,14434\n86987,273\n86988,1143\n86989,932\n86990,86991\n86992,86993\n86994,1977\n86994,1978\n86995,900\n86995,1332\n86996,130\n86997,292\n86998,298\n86999,417\n87000,1247\n87000,1644\n87001,233\n87002,1149\n87003,87004\n87003,118231\n87006,97\n87006,269\n87007,2017\n87008,783\n87008,1294\n87009,160\n87009,567\n87009,611\n87009,663\n87009,712\n87009,760\n87009,1147\n87009,1429\n87009,1579\n87009,1612\n87009,2210\n87009,2605\n87009,2668\n87009,4237\n87009,4678\n87010,1522\n87011,911\n87012,1319\n87013,4475\n87014,4193\n87014,8822\n87015,8991\n87016,2506\n87017,87018\n87017,88895\n87017,93834\n87019,79\n87020,45023\n87021,49887\n87022,78232\n87023,45022\n87024,30766\n87025,278\n87026,79\n87026,192\n87026,1070\n87027,1132\n87028,781\n87029,1132\n87030,781\n87031,140\n87032,355\n87033,3069\n87034,1132\n87035,781\n87036,929\n87037,66\n87037,1579\n87038,160\n87038,1147\n87039,1203\n87040,2116\n87041,312\n87042,1132\n87043,781\n87044,2797\n87045,136\n87046,2191\n87047,298\n87048,485\n87049,72\n87050,344\n87051,285\n87052,1058\n87053,298\n87054,485\n87055,1132\n87056,781\n87057,1241\n87058,481\n87059,1132\n87060,781\n87061,1319\n87061,2668\n87062,20\n87063,1515\n87064,171\n87065,586\n87066,356\n87066,852\n87067,920\n87067,1127\n87068,1132\n87069,781\n87070,292\n87071,640\n87072,1132\n87073,781\n87074,640\n87075,392\n87076,640\n87077,2296\n87078,149\n87079,240\n87079,392\n87079,1240\n87079,1572\n87080,79\n87081,1010\n87082,44\n87083,75912\n87084,1326\n87085,1149\n87087,1132\n87088,781\n87089,58\n87090,46\n87091,1707\n87092,1132\n87093,781\n87094,1132\n87095,781\n87096,980\n87096,1531\n87097,87098\n87100,1436\n87101,5405\n87103,602\n87105,1512\n87105,5992\n87106,58\n87107,46\n87108,1132\n87109,781\n87110,31073\n87111,1566\n87112,349\n87112,356\n87112,697\n87112,801\n87112,852\n87112,3507\n87113,1227\n87113,86416\n87114,68\n87115,592\n87116,422\n87117,56\n87118,525\n87118,1837\n87118,3297\n87119,577\n87120,93\n87120,94\n87121,390\n87121,1085\n87122,579\n87122,1294\n87122,2146\n87122,2353\n87122,109187\n87123,178\n87123,406\n87124,631\n87124,693\n87125,299\n87126,1132\n87127,781\n87128,83\n87129,79\n87130,215\n87131,2286\n87132,442\n87134,13538\n87135,30\n87136,333\n87137,58\n87138,46\n87139,2367\n87142,1707\n87143,779\n87143,68069\n87144,1147\n87145,620\n87146,188\n87147,1070\n87148,1287\n87149,167\n87150,1132\n87151,781\n87152,1235\n87152,1335\n87153,1509\n87154,422\n87155,56\n87156,298\n87157,485\n87158,1118\n87159,9457\n87160,2379\n87161,2506\n87162,602\n87163,2434\n87164,147\n87165,1016\n87166,87167\n87168,136\n87168,717\n87168,733\n87168,1332\n87168,7757\n87169,1175\n87170,346\n87170,1612\n87170,1877\n87170,2353\n87170,6661\n87172,1467\n87174,602\n87175,843\n87176,87177\n87178,32\n87178,3003\n87179,72\n87180,344\n87181,285\n87182,1132\n87183,781\n87185,171\n87186,1644\n87187,422\n87188,87189\n87188,150626\n87190,1390\n87193,255\n87193,563\n87193,2867\n87193,2868\n87194,285\n87195,34\n87195,35\n87196,1309\n87197,20\n87198,18726\n87199,693\n87200,1\n87200,304\n87200,481\n87200,3830\n87200,6424\n87200,28107\n87201,1070\n87202,2266\n87203,33082\n87204,1419\n87205,87206\n87207,192\n87210,19\n87210,56\n87210,146\n87210,272\n87210,743\n87210,749\n87210,3538\n87210,60576\n87210,92476\n87211,602\n87212,298\n87213,485\n87214,1858\n87215,1860\n87216,980\n87217,72\n87218,344\n87219,1359\n87220,285\n87221,1132\n87222,781\n87224,2460\n87225,298\n87226,485\n87227,1132\n87228,781\n87229,1267\n87230,1323\n87231,102\n87232,1326\n87233,408\n87234,592\n87234,1085\n87235,611\n87235,733\n87236,1132\n87237,781\n87239,676\n87240,83\n87241,307\n87241,1181\n87241,4193\n87242,4355\n87243,225\n87246,631\n87247,175\n87248,298\n87249,87250\n87251,215\n87252,298\n87253,485\n87254,8270\n87255,8270\n87256,240\n87257,87258\n87259,312\n87260,1893\n87261,557\n87262,592\n87263,158\n87264,2315\n87265,87266\n87265,103639\n87267,72\n87268,344\n87269,285\n87270,442\n87272,1893\n87273,287\n87273,733\n87274,1220\n87274,1222\n87275,2750\n87276,1274\n87277,779\n87277,1803\n87277,68069\n87277,141912\n87278,87279\n87280,87281\n87282,106\n87282,330\n87282,1181\n87283,298\n87284,485\n87285,106\n87286,2146\n87287,301\n87287,968\n87287,1782\n87288,589\n87288,1655\n87289,9560\n87290,48\n87291,151\n87292,1580\n87293,1858\n87294,1860\n87295,483\n87296,1776\n87297,264\n87297,649\n87297,1289\n87297,3999\n87298,87299\n87300,885\n87302,349\n87302,575\n87303,3069\n87307,83\n87307,1240\n87308,1240\n87310,668\n87311,87312\n87314,58\n87315,46\n87316,72\n87317,344\n87318,285\n87319,1454\n87322,1265\n87322,1266\n87323,158\n87325,602\n87325,144457\n87325,216487\n87326,626\n87329,97\n87329,491\n87329,15609\n87330,602\n87333,640\n87334,1381\n87335,219\n87335,949\n87336,87337\n87338,30\n87338,1179\n87339,3252\n87341,649\n87341,1132\n87341,1432\n87343,298\n87344,485\n87345,954\n87345,10318\n87349,1359\n87350,1436\n87351,1130\n87352,175\n87353,187\n87356,298\n87357,1432\n87358,87359\n87360,392\n87360,1151\n87360,1769\n87360,2274\n87361,58\n87362,46\n87363,602\n87364,392\n87365,1796\n87366,184\n87367,1293\n87367,3422\n87368,87369\n87370,392\n87370,2775\n87370,3003\n87370,6627\n87371,2775\n87372,536\n87372,7698\n87373,5405\n87374,1370\n87375,298\n87376,485\n87377,467\n87377,1368\n87378,1556\n87379,1707\n87380,447\n87381,527\n87382,287\n87383,1955\n87384,1425\n87385,3\n87387,30331\n87389,1116\n87390,392\n87391,298\n87392,485\n87393,10\n87394,1007\n87395,406\n87396,225\n87397,1381\n87398,68\n87399,301\n87399,968\n87399,1782\n87399,189303\n87400,527\n87401,87402\n87403,86\n87404,34\n87404,35\n87404,217\n87404,949\n87405,1983\n87406,65\n87407,2351\n87408,87409\n87410,779\n87411,422\n87412,56\n87413,175\n87414,87415\n87416,298\n87417,1983\n87418,3413\n87419,422\n87420,56\n87421,376\n87422,87423\n87422,96183\n87425,392\n87426,3\n87427,1893\n87428,647\n87429,344\n87430,217\n87431,2797\n87432,120\n87433,1332\n87434,422\n87435,56\n87436,2797\n87437,376\n87438,885\n87439,104\n87440,298\n87441,485\n87442,240\n87442,3069\n87443,87444\n87445,34\n87445,35\n87445,217\n87445,5976\n87446,422\n87447,56\n87448,192\n87449,87450\n87451,134\n87452,509\n87452,1010\n87453,87453\n87454,433\n87455,1449\n87456,298\n87457,485\n87458,30\n87459,72\n87460,158\n87461,872\n87461,1659\n87461,1893\n87462,4611\n87463,1579\n87464,477\n87465,298\n87466,485\n87467,392\n87467,697\n87468,388\n87469,149\n87469,21944\n87470,631\n87471,4980\n87472,6726\n87473,87474\n87475,1274\n87476,333\n87477,406\n87478,1132\n87479,781\n87480,1688\n87481,1707\n87482,875\n87483,298\n87484,485\n87485,647\n87486,344\n87487,2146\n87487,95222\n87487,108489\n87488,178\n87488,1572\n87488,2045\n87488,5343\n87489,87490\n87491,875\n87492,406\n87493,349\n87493,697\n87493,3260\n87494,1983\n87495,2797\n87496,390\n87496,589\n87497,907\n87498,30\n87499,87500\n87501,30\n87502,557\n87503,30\n87504,1001\n87505,647\n87506,344\n87507,41\n87507,1119\n87508,30\n87509,505\n87510,6837\n87511,9030\n87512,45022\n87513,30\n87514,557\n87515,30\n87516,557\n87517,647\n87518,344\n87519,30\n87520,647\n87521,344\n87522,652\n87524,158\n87524,516\n87525,1881\n87526,30\n87527,358\n87529,87530\n87531,298\n87532,485\n87533,1363\n87534,4771\n87536,298\n87537,485\n87538,30\n87541,577\n87541,794\n87543,5440\n87544,1289\n87545,333\n87546,3999\n87547,264\n87548,1381\n87549,1381\n87550,20\n87551,1807\n87553,779\n87554,3041\n87555,1007\n87556,1551\n87558,255\n87559,1381\n87560,1639\n87561,87562\n87563,433\n87564,358\n87564,3409\n87567,1140\n87568,2116\n87569,87569\n87570,30\n87574,1235\n87574,1335\n87575,473\n87575,8149\n87576,13919\n87577,73570\n87578,1556\n87579,87580\n87579,96127\n87581,30\n87582,292\n87583,252\n87584,422\n87585,422\n87586,422\n87587,422\n87588,422\n87589,1149\n87590,422\n87591,6726\n87592,4980\n87593,422\n87594,422\n87595,577\n87596,1033\n87597,6726\n87598,30\n87599,422\n87601,87602\n87604,1858\n87605,1860\n87607,1132\n87608,781\n87609,87610\n87611,859\n87612,392\n87613,30\n87614,7155\n87615,328\n87616,2775\n87617,447\n87618,87618\n87619,8270\n87620,577\n87622,671\n87623,3409\n87624,2626\n87625,30\n87626,87627\n87628,79\n87629,360\n87630,3069\n87631,2210\n87631,4237\n87632,1014\n87633,676\n87634,285\n87635,104\n87637,10\n87637,87638\n87639,862\n87640,726\n87641,13\n87642,252\n87643,2292\n87644,3413\n87645,24505\n87647,393\n87647,87648\n87649,87650\n87651,30\n87652,87652\n87653,779\n87655,4980\n87656,6726\n87657,175\n87658,304\n87659,298\n87661,4101\n87662,87663\n87664,222\n87664,278\n87664,349\n87664,389\n87664,577\n87664,1871\n87665,349\n87666,393\n87667,872\n87668,973\n87668,1968\n87669,298\n87670,1143\n87671,87672\n87671,100468\n87671,111527\n87673,4611\n87674,1544\n87675,4611\n87676,1544\n87677,209\n87677,302\n87677,859\n87677,861\n87677,1127\n87677,2979\n87678,87679\n87680,1639\n87681,310\n87682,186\n87683,10\n87684,1707\n87685,1238\n87687,233\n87688,151\n87688,1417\n87689,510\n87690,1452\n87692,8\n87692,1072\n87692,2646\n87693,1132\n87694,781\n87695,424\n87696,1707\n87697,358\n87697,3409\n87698,24505\n87699,581\n87701,5405\n87702,1707\n87702,2867\n87702,2868\n87703,87704\n87705,493\n87705,1181\n87705,1370\n87705,2867\n87705,2868\n87706,4611\n87708,68\n87708,697\n87708,1175\n87708,2590\n87709,455\n87709,536\n87709,2944\n87710,355\n87711,167\n87711,240\n87711,818\n87711,949\n87711,2334\n87711,2480\n87711,6695\n87713,87714\n87715,784\n87716,34\n87716,35\n87716,1466\n87717,30\n87717,34\n87717,35\n87717,134\n87717,158\n87717,200\n87717,536\n87717,663\n87717,664\n87717,1085\n87717,1572\n87717,2048\n87717,7358\n87717,7363\n87717,19227\n87717,20359\n87718,1016\n87719,1466\n87720,676\n87721,2867\n87721,2868\n87722,87723\n87724,818\n87726,87727\n87728,4760\n87730,3999\n87731,3252\n87732,872\n87733,392\n87733,1240\n87734,2574\n87735,273\n87736,1891\n87737,58\n87738,46\n87739,586\n87739,1634\n87739,16614\n87740,602\n87741,78400\n87742,1151\n87743,1181\n87743,240174\n87745,535\n87746,287\n87747,160\n87747,1033\n87748,985\n87749,356\n87750,477\n87751,477\n87752,2048\n87753,27041\n87755,44\n87756,535\n87757,87758\n87760,920\n87764,1122\n87765,907\n87766,24505\n87768,1634\n87769,71\n87771,1983\n87773,477\n87775,356\n87776,87777\n87778,15141\n87779,344\n87780,6726\n87781,4980\n87782,87783\n87784,422\n87785,422\n87786,422\n87787,422\n87788,422\n87789,211\n87790,76096\n87791,56\n87791,175\n87791,417\n87791,626\n87791,1220\n87791,1222\n87791,1285\n87791,1319\n87791,1566\n87791,1571\n87792,422\n87793,779\n87793,1181\n87794,422\n87795,192\n87796,195\n87797,298\n87798,485\n87799,158\n87799,280\n87799,337\n87799,393\n87799,714\n87799,1181\n87799,2989\n87799,2991\n87799,17245\n87799,118336\n87799,180487\n87799,189839\n87799,248431\n87800,467\n87801,1436\n87802,1556\n87803,516\n87803,80266\n87804,309\n87804,310\n87805,1983\n87806,298\n87807,485\n87808,34\n87808,35\n87808,626\n87809,932\n87810,3003\n87812,929\n87813,446\n87813,1033\n87814,211\n87815,83\n87818,225\n87818,557\n87818,772\n87818,1368\n87819,72\n87820,140\n87820,264\n87820,779\n87820,1515\n87821,87822\n87821,102829\n87825,158\n87826,3507\n87827,298\n87828,72\n87829,485\n87830,516\n87830,1220\n87830,1222\n87830,1983\n87831,1977\n87831,1978\n87832,259\n87833,87834\n87835,21944\n87836,13538\n87837,1381\n87838,301\n87838,968\n87838,1782\n87839,217\n87839,13546\n87840,1511\n87840,2315\n87840,3069\n87841,389\n87841,1849\n87842,861\n87842,893\n87845,2443\n87846,7\n87846,309\n87846,310\n87847,171\n87848,1118\n87849,87850\n87851,1058\n87852,97\n87854,1707\n87855,222\n87856,577\n87856,1105\n87857,30\n87858,30\n87859,87860\n87861,87862\n87863,640\n87864,602\n87865,2045\n87866,415\n87866,557\n87867,433\n87868,611\n87869,1531\n87870,1\n87870,147\n87870,149\n87870,158\n87870,175\n87870,606\n87870,733\n87870,859\n87870,1089\n87870,1619\n87870,1623\n87870,23861\n87870,26841\n87870,34806\n87870,39437\n87870,61320\n87870,66472\n87870,71303\n87870,76835\n87870,77571\n87870,85817\n87870,87843\n87870,87870\n87870,89035\n87870,91055\n87870,107083\n87870,112537\n87870,117881\n87870,119388\n87870,121575\n87870,138831\n87870,146001\n87870,147380\n87870,147935\n87870,150013\n87870,151045\n87870,159028\n87870,165851\n87870,181904\n87870,220022\n87870,220042\n87870,227294\n87870,245896\n87870,246034\n87870,249110\n87870,251478\n87870,257659\n87870,259650\n87871,388\n87871,446\n87871,518\n87871,1113\n87871,1326\n87871,3193\n87871,6638\n87871,48505\n87872,602\n87873,87874\n87876,1231\n87877,2528\n87878,83\n87879,310\n87880,1247\n87880,1644\n87881,1623\n87883,596\n87884,557\n87884,1082\n87885,406\n87886,167\n87887,577\n87889,225\n87890,310\n87892,135\n87892,2017\n87893,467\n87893,868\n87895,1390\n87896,261\n87897,217\n87897,406\n87897,599\n87898,852\n87899,1983\n87900,30\n87901,500\n87902,58\n87903,46\n87904,192\n87905,15\n87907,2867\n87907,2868\n87908,1122\n87908,1849\n87908,32784\n87909,1977\n87909,1978\n87910,97\n87911,323\n87912,68\n87913,389\n87913,873\n87913,1240\n87913,1465\n87913,2620\n87914,949\n87915,87916\n87918,379\n87918,2944\n87919,87920\n87921,302\n87921,346\n87921,827\n87921,934\n87921,1294\n87921,1319\n87921,31206\n87922,160\n87923,1241\n87924,818\n87925,392\n87925,5547\n87926,87927\n87926,100184\n87926,104232\n87926,105417\n87928,2315\n87928,3069\n87929,68\n87929,104\n87929,2436\n87929,4571\n87929,5405\n87930,1132\n87931,422\n87932,56\n87933,87934\n87935,63\n87935,6119\n87936,87937\n87938,72\n87939,422\n87940,56\n87941,209\n87942,30\n87943,292\n87944,602\n87945,207\n87946,420\n87947,596\n87948,620\n87949,1231\n87950,87951\n87953,247\n87954,217\n87954,222\n87954,467\n87954,1019\n87955,1359\n87956,87957\n87958,21944\n87959,255\n87960,1133\n87961,10\n87962,356\n87962,21982\n87963,6726\n87964,4980\n87965,602\n87966,611\n87967,87968\n87969,3623\n87970,206\n87971,147\n87971,158\n87972,1265\n87972,1266\n87973,3069\n87974,602\n87976,106\n87976,408\n87977,83\n87978,657\n87979,872\n87980,4411\n87982,21944\n87983,1016\n87984,87985\n87986,240\n87987,18726\n87988,83\n87989,7155\n87990,247\n87990,393\n87991,818\n87992,7155\n87995,2646\n87999,3413\n88000,30\n88001,1531\n88002,278\n88003,175\n88004,137\n88004,30331\n88005,843\n88006,298\n88007,479\n88008,298\n88009,485\n88011,22\n88012,158\n88012,192\n88012,663\n88012,664\n88013,1149\n88014,192\n88015,473\n88017,1151\n88017,1893\n88019,209\n88021,1181\n88022,111\n88023,330\n88024,72\n88025,602\n88026,3474\n88027,1370\n88028,8270\n88029,6323\n88030,217\n88031,248\n88032,1564\n88032,3094\n88033,1983\n88034,406\n88035,622\n88035,1033\n88036,1016\n88036,2210\n88036,4237\n88037,192\n88038,8270\n88039,206\n88040,158\n88040,192\n88040,406\n88040,422\n88041,2775\n88042,447\n88043,22\n88043,240\n88044,336\n88045,907\n88047,30\n88048,1370\n88050,30\n88051,292\n88052,48\n88053,467\n88053,868\n88054,994\n88055,30\n88056,163\n88056,305\n88056,447\n88056,563\n88056,733\n88056,1132\n88056,1201\n88056,8501\n88056,15573\n88057,893\n88058,704\n88059,18726\n88060,602\n88061,310\n88061,3039\n88062,22\n88062,41\n88062,81\n88062,104\n88062,192\n88062,215\n88062,442\n88062,503\n88062,957\n88062,1392\n88062,1815\n88062,3507\n88062,9005\n88062,111142\n88063,713\n88064,483\n88065,305\n88066,88067\n88068,88069\n88071,72\n88072,217\n88073,137\n88074,240\n88074,332\n88075,3\n88076,5662\n88077,4980\n88078,6726\n88079,175\n88080,310\n88081,298\n88082,1033\n88083,66\n88085,269\n88085,1782\n88086,206\n88087,217\n88087,1019\n88088,247\n88089,72\n88090,68069\n88091,88092\n88093,72\n88094,784\n88094,59931\n88094,84257\n88095,647\n88096,344\n88097,88098\n88099,147\n88099,158\n88099,406\n88099,1181\n88101,72\n88103,862\n88104,298\n88105,4691\n88106,175\n88107,147\n88109,298\n88110,72\n88111,1579\n88112,1707\n88113,4611\n88114,4771\n88115,19986\n88116,88117\n88118,310\n88119,3474\n88120,233\n88120,518\n88120,775\n88120,795\n88120,1326\n88120,1715\n88120,3094\n88120,3804\n88120,4146\n88120,5130\n88121,16196\n88122,2626\n88123,420\n88124,949\n88125,4691\n88126,843\n88127,10\n88128,1201\n88130,292\n88131,72\n88132,1688\n88133,104\n88133,2209\n88134,338\n88135,827\n88136,557\n88137,225\n88138,1707\n88139,1359\n88140,298\n88141,485\n88142,358\n88143,483\n88144,602\n88145,247\n88146,41\n88147,557\n88148,557\n88149,862\n88150,1556\n88151,88152\n88153,4810\n88154,77\n88155,8270\n88156,1566\n88157,250\n88157,1684\n88158,72\n88159,704\n88160,2979\n88161,88162\n88164,4980\n88165,6726\n88166,298\n88167,485\n88168,10\n88169,1707\n88169,2260\n88170,8992\n88171,30\n88172,10\n88172,222\n88173,968\n88173,1436\n88174,2646\n88176,577\n88177,2116\n88178,88179\n88180,195\n88181,30\n88182,298\n88183,485\n88184,30\n88185,88186\n88187,88188\n88189,4594\n88190,175\n88191,298\n88192,18726\n88193,163\n88194,88195\n88196,333\n88198,30\n88199,682\n88199,72439\n88200,2590\n88201,8788\n88202,88203\n88204,4895\n88205,88206\n88207,207\n88208,146\n88209,5366\n88210,30\n88211,626\n88212,676\n88213,872\n88214,483\n88215,30\n88217,88218\n88219,88220\n88221,1531\n88222,668\n88223,862\n88224,376\n88225,88226\n88228,255\n88229,187\n88230,1429\n88231,3447\n88232,88233\n88235,3413\n88236,13\n88237,252\n88238,2626\n88239,88240\n88239,139802\n88239,140598\n88239,144820\n88241,88242\n88243,1143\n88244,640\n88245,88245\n88246,640\n88247,88248\n88249,88250\n88251,366\n88252,366\n88253,88254\n88253,101685\n88253,115907\n88255,88255\n88256,233\n88257,30\n88258,298\n88259,485\n88260,298\n88261,485\n88262,298\n88263,485\n88264,88265\n88267,10\n88268,88269\n88270,10\n88271,88272\n88273,111\n88274,872\n88275,219\n88276,3003\n88277,88278\n88279,88278\n88280,88281\n88282,740\n88282,741\n88283,28130\n88284,3069\n88285,24505\n88286,818\n88287,292\n88288,88289\n88288,148103\n88288,213398\n88290,209\n88291,355\n88292,298\n88293,485\n88294,7360\n88295,2867\n88295,2868\n88296,392\n88296,697\n88297,79\n88297,1644\n88298,292\n88300,2146\n88301,6556\n88302,88303\n88302,94526\n88304,292\n88305,2116\n88306,390\n88306,431\n88306,631\n88306,968\n88306,973\n88306,1326\n88306,3756\n88306,5301\n88307,1983\n88309,48\n88310,1016\n88311,1132\n88312,781\n88313,1983\n88314,4276\n88315,30\n88316,217\n88317,88318\n88319,647\n88320,344\n88322,217\n88323,931\n88324,1016\n88325,83\n88326,292\n88328,868\n88328,1309\n88329,292\n88330,88331\n88332,72\n88333,344\n88334,285\n88335,527\n88335,743\n88335,1984\n88335,8714\n88336,292\n88337,1858\n88338,1860\n88340,349\n88342,1220\n88342,1222\n88343,252\n88344,251\n88345,2979\n88346,602\n88347,891\n88348,149\n88348,184\n88348,1623\n88349,30\n88350,88351\n88352,726\n88353,4691\n88354,192\n88354,200\n88355,518\n88355,1326\n88356,663\n88356,1089\n88357,640\n88358,640\n88359,44\n88360,602\n88361,640\n88362,195\n88363,1531\n88364,88365\n88366,2048\n88367,315\n88367,6661\n88368,88369\n88370,718\n88371,447\n88372,2506\n88373,88374\n88375,422\n88376,1722\n88377,422\n88378,968\n88378,1782\n88379,422\n88380,422\n88381,7117\n88382,422\n88383,422\n88384,422\n88385,422\n88386,8270\n88387,422\n88388,422\n88389,72\n88389,126\n88389,312\n88389,314\n88389,323\n88389,784\n88389,872\n88389,991\n88389,1052\n88389,1078\n88389,1127\n88389,1188\n88389,1267\n88389,1453\n88389,1579\n88389,1659\n88389,1663\n88389,1893\n88389,2605\n88389,3260\n88389,3538\n88389,3695\n88389,6824\n88389,13538\n88389,49057\n88389,81070\n88390,485\n88391,252\n88392,2646\n88393,1983\n88394,425\n88394,2744\n88395,360\n88396,1132\n88397,781\n88399,712\n88400,1240\n88400,1419\n88400,5591\n88401,720\n88402,22\n88403,392\n88404,861\n88404,893\n88404,1118\n88404,1374\n88405,83\n88406,932\n88407,1983\n88408,8270\n88409,301\n88409,968\n88410,2173\n88411,88412\n88413,8270\n88414,313\n88414,328\n88416,827\n88418,1801\n88420,481\n88420,1381\n88420,3999\n88421,1247\n88421,1644\n88422,2367\n88423,911\n88423,1564\n88424,88425\n88426,726\n88428,248\n88430,493\n88430,516\n88430,733\n88431,195\n88432,298\n88433,485\n88434,292\n88435,1983\n88436,579\n88437,349\n88437,1590\n88437,1805\n88437,3260\n88438,17228\n88439,818\n88440,1016\n88441,595\n88442,215\n88443,302\n88443,340\n88444,779\n88444,68069\n88445,3585\n88446,195\n88447,818\n88448,34\n88448,35\n88448,2224\n88449,3585\n88451,2574\n88452,366\n88454,8270\n88455,779\n88456,10\n88457,87\n88458,171\n88459,2719\n88460,3370\n88460,14453\n88461,192\n88462,48\n88463,202\n88463,203\n88464,72\n88465,344\n88466,285\n88467,192\n88467,211\n88467,366\n88467,500\n88468,48\n88470,493\n88471,10\n88472,1390\n88474,175\n88475,392\n88475,1722\n88476,302\n88476,687\n88476,861\n88477,298\n88478,980\n88479,88480\n88481,310\n88482,1707\n88483,693\n88484,8270\n88485,1133\n88486,2411\n88487,579\n88488,88489\n88488,103975\n88490,493\n88491,23701\n88492,326\n88493,340\n88493,6638\n88494,120\n88495,171\n88495,379\n88495,968\n88495,1434\n88495,1939\n88496,298\n88497,485\n88498,515\n88499,875\n88500,5591\n88501,146\n88501,383\n88501,403\n88501,27041\n88502,88503\n88504,30\n88505,1955\n88506,88506\n88508,88509\n88510,586\n88511,2434\n88512,4549\n88513,7572\n88514,192\n88517,433\n88518,577\n88518,900\n88519,875\n88520,2744\n88521,2073\n88522,30\n88524,88525\n88526,195\n88527,30\n88528,30\n88529,21944\n88530,88531\n88532,298\n88533,485\n88534,240\n88535,2146\n88536,2744\n88537,1149\n88538,48\n88539,467\n88540,515\n88540,1267\n88540,1289\n88541,83\n88541,97\n88541,305\n88541,366\n88543,663\n88543,664\n88544,875\n88545,1181\n88546,18726\n88547,581\n88548,137\n88549,934\n88550,4611\n88551,1544\n88552,4611\n88553,1544\n88554,187\n88555,304\n88556,1785\n88557,195\n88558,298\n88559,485\n88560,1140\n88561,225\n88562,2944\n88563,48\n88564,877\n88565,1284\n88566,397\n88567,298\n88568,485\n88570,1368\n88571,1531\n88572,406\n88573,3413\n88574,252\n88575,202\n88575,203\n88576,1019\n88577,1559\n88578,10\n88578,217\n88579,49057\n88580,444\n88581,7\n88581,3295\n88581,4980\n88581,6263\n88581,19986\n88581,23049\n88581,49887\n88581,58621\n88583,579\n88584,1531\n88585,119\n88586,2784\n88587,1949\n88588,298\n88589,485\n88590,859\n88591,455\n88592,1531\n88595,1007\n88596,126\n88596,596\n88596,75912\n88597,1374\n88598,1309\n88598,1955\n88600,147\n88601,88602\n88603,1085\n88604,147\n88604,158\n88605,1631\n88606,1417\n88607,338\n88608,1010\n88609,83\n88610,602\n88611,22\n88611,450\n88612,893\n88613,493\n88614,171\n88616,2045\n88617,30\n88618,8788\n88620,151\n88621,72\n88621,312\n88622,68069\n88623,588\n88623,590\n88624,304\n88625,72\n88626,72\n88627,406\n88627,586\n88628,1359\n88629,86\n88630,500\n88631,30\n88632,3069\n88633,217\n88633,379\n88633,1240\n88633,3182\n88633,6955\n88634,2146\n88635,4411\n88636,21944\n88637,292\n88638,1274\n88639,83\n88640,83\n88641,10\n88641,147\n88642,41\n88643,13\n88644,592\n88645,3623\n88646,248\n88647,1132\n88648,781\n88649,292\n88650,631\n88651,175\n88652,275\n88655,298\n88656,10\n88658,88659\n88660,6323\n88661,287\n88661,809\n88661,2116\n88661,3769\n88662,10\n88663,88664\n88663,93917\n88665,1133\n88666,30\n88667,2421\n88668,1531\n88669,195\n88670,88671\n88672,861\n88673,88674\n88673,95507\n88673,100214\n88673,105234\n88675,1634\n88676,126\n88676,1392\n88676,1572\n88676,9195\n88677,50\n88678,720\n88679,515\n88680,479\n88681,1556\n88682,920\n88683,88684\n88685,88684\n88686,30\n88687,30\n88688,713\n88689,195\n88690,1939\n88691,376\n88692,779\n88692,141912\n88693,893\n88694,175\n88695,298\n88696,272\n88697,310\n88698,79\n88699,72\n88700,344\n88701,285\n88702,500\n88703,30\n88704,1659\n88705,111\n88705,595\n88705,1151\n88705,1572\n88705,3538\n88706,68\n88707,175\n88708,809\n88709,309\n88709,310\n88710,298\n88711,657\n88711,2989\n88711,2991\n88712,372\n88713,310\n88714,88715\n88716,1860\n88717,1882\n88718,483\n88719,72\n88720,344\n88721,285\n88722,2436\n88723,88724\n88725,30\n88726,500\n88728,88729\n88730,289\n88730,290\n88731,30\n88732,88733\n88734,107\n88735,83\n88736,30\n88737,850\n88739,310\n88740,602\n88741,160\n88742,88743\n88744,640\n88744,4355\n88745,30\n88745,48\n88745,63\n88745,106\n88745,140\n88745,147\n88745,149\n88745,158\n88745,202\n88745,203\n88745,261\n88745,296\n88745,302\n88745,323\n88745,332\n88745,333\n88745,337\n88745,406\n88745,503\n88745,515\n88745,516\n88745,588\n88745,590\n88745,622\n88745,647\n88745,652\n88745,736\n88745,1052\n88745,1102\n88745,1289\n88745,1381\n88745,1509\n88745,1551\n88745,1579\n88745,1639\n88745,1659\n88745,3585\n88745,3999\n88745,5440\n88745,9007\n88745,14945\n88747,481\n88748,1\n88749,306\n88749,307\n88749,1707\n88750,422\n88751,422\n88752,422\n88753,422\n88754,422\n88755,422\n88756,422\n88757,422\n88758,422\n88759,50\n88759,273\n88759,671\n88759,1149\n88760,640\n88761,88762\n88763,88764\n88765,30\n88766,88767\n88768,1149\n88769,489\n88770,10\n88771,862\n88772,557\n88773,557\n88774,557\n88775,8719\n88776,138\n88777,865\n88778,557\n88779,137\n88780,118\n88780,4597\n88781,21944\n88782,30\n88783,5906\n88784,557\n88785,626\n88786,278\n88787,137\n88788,862\n88789,1531\n88789,2178\n88789,4545\n88789,56150\n88789,139010\n88790,298\n88791,485\n88792,298\n88793,485\n88794,1888\n88795,298\n88796,485\n88797,200\n88798,1515\n88799,305\n88801,7652\n88802,2626\n88803,652\n88804,24505\n88805,356\n88806,1858\n88807,1860\n88808,1007\n88809,254\n88810,644\n88811,24505\n88813,88814\n88815,6726\n88816,4980\n88818,88819\n88820,40\n88820,502\n88820,590\n88820,967\n88820,994\n88820,1282\n88820,1962\n88820,2237\n88820,2286\n88820,3794\n88820,4114\n88820,4571\n88820,6621\n88820,8812\n88820,9516\n88820,16709\n88820,21944\n88820,34060\n88820,34180\n88820,36250\n88820,38272\n88820,88820\n88820,91386\n88820,105810\n88820,105811\n88820,122486\n88820,127001\n88820,142493\n88820,147530\n88820,159140\n88820,161125\n88820,173282\n88820,195898\n88820,198711\n88820,214704\n88821,310\n88823,393\n88823,980\n88823,1531\n88824,88825\n88826,640\n88827,1608\n88828,163\n88829,88830\n88831,88832\n88831,88846\n88833,88834\n88835,30\n88836,88837\n88838,30\n88839,88840\n88841,88842\n88843,126\n88844,949\n88845,30\n88847,30\n88848,24505\n88849,88850\n88851,1882\n88852,88853\n88856,88857\n88858,676\n88859,88860\n88861,433\n88863,302\n88863,420\n88863,1466\n88864,88865\n88866,1001\n88867,146\n88867,779\n88867,68069\n88867,92476\n88867,118336\n88867,141912\n88868,88869\n88870,88871\n88870,92441\n88870,93282\n88870,93407\n88870,94470\n88870,97035\n88870,110926\n88870,111001\n88870,112047\n88870,122367\n88870,125336\n88872,88873\n88874,88873\n88875,88873\n88877,88878\n88879,44013\n88880,225\n88881,134\n88881,588\n88881,590\n88881,1381\n88882,8884\n88883,88884\n88885,72\n88886,88887\n88888,1085\n88890,88889\n88890,179022\n88891,72\n88892,483\n88893,30\n88896,137\n88897,1247\n88897,1644\n88898,88899\n88900,88901\n88902,640\n88903,72\n88904,72\n88906,366\n88907,366\n88909,72\n88910,3447\n88911,233\n88912,88913\n88914,652\n88915,88916\n88918,83\n88919,1844\n88920,1419\n88921,252\n88922,202\n88922,203\n88923,355\n88924,88925\n88926,72\n88927,392\n88928,431\n88929,18726\n88930,88931\n88932,88933\n88934,2292\n88935,298\n88936,192\n88937,3069\n88938,1531\n88939,440\n88940,579\n88941,392\n88941,1659\n88942,45021\n88943,45022\n88944,83209\n88945,45024\n88946,45310\n88947,49887\n88948,30766\n88949,45023\n88950,275\n88951,589\n88952,88953\n88954,44\n88956,93\n88956,94\n88957,360\n88958,88959\n88960,88961\n88962,88961\n88963,88964\n88965,88966\n88967,22\n88967,360\n88967,515\n88967,1381\n88968,932\n88969,88970\n88971,88972\n88973,2266\n88974,3999\n88975,83\n88976,5250\n88977,595\n88977,1453\n88977,1572\n88977,1722\n88978,30\n88979,24505\n88980,1608\n88981,83\n88982,171\n88983,388\n88984,18726\n88985,163\n88986,310\n88987,298\n88988,485\n88989,24505\n88991,2048\n88992,298\n88993,485\n88994,88995\n88996,88997\n88998,88999\n89000,1070\n89001,13\n89002,3331\n89003,1151\n89004,1368\n89005,30\n89006,89007\n89008,372\n89010,13980\n89011,417\n89012,861\n89013,48\n89014,1235\n89014,1335\n89015,1181\n89016,298\n89017,485\n89018,89019\n89020,1085\n89021,779\n89021,21442\n89022,89023\n89024,1052\n89025,30\n89026,10\n89027,292\n89028,89029\n89030,146\n89031,63\n89032,718\n89033,3585\n89035,1\n89035,126\n89035,146\n89035,147\n89035,149\n89035,158\n89035,171\n89035,184\n89035,206\n89035,336\n89035,406\n89035,505\n89035,640\n89035,1089\n89035,1425\n89035,1458\n89035,1515\n89035,2244\n89035,2528\n89035,80266\n89035,89035\n89035,92476\n89035,118336\n89036,89037\n89038,72\n89040,589\n89041,89042\n89043,2045\n89043,29253\n89044,2411\n89045,298\n89046,485\n89047,483\n89048,1132\n89049,781\n89050,1247\n89050,1644\n89051,89052\n89053,89054\n89053,89866\n89053,92054\n89053,92483\n89053,104290\n89053,106660\n89053,113206\n89053,113611\n89053,114479\n89053,120379\n89053,125549\n89053,127091\n89053,128090\n89053,129349\n89053,130000\n89053,131160\n89053,131590\n89055,217\n89055,1417\n89057,72\n89058,3447\n89059,89060\n89062,89063\n89064,89063\n89065,206\n89066,72\n89067,392\n89067,779\n89068,72\n89070,4453\n89071,1\n89072,72\n89073,72\n89074,713\n89075,89076\n89077,89076\n89078,89076\n89079,89080\n89079,117322\n89079,143003\n89079,156097\n89079,157335\n89079,163507\n89079,184665\n89079,193928\n89081,27621\n89081,27623\n89082,6068\n89083,89084\n89085,1556\n89086,72\n89087,72\n89088,14434\n89089,9026\n89091,18726\n89092,1531\n89093,89094\n89095,932\n89096,6682\n89097,195\n89098,163\n89099,72\n89100,589\n89101,30\n89102,3467\n89103,1531\n89103,14366\n89104,10\n89104,1844\n89104,2073\n89104,2274\n89104,8270\n89104,9024\n89104,13136\n89105,72\n89106,310\n89107,328\n89108,89109\n89110,3260\n89111,6682\n89113,18726\n89114,850\n89115,30\n89116,30\n89117,1287\n89118,178\n89118,1522\n89119,1479\n89120,72\n89121,3447\n89123,72\n89124,1707\n89124,14434\n89125,72\n89127,481\n89128,30\n89129,4192\n89129,4193\n89130,89131\n89132,3161\n89133,147\n89134,89135\n89136,89135\n89137,89135\n89138,89135\n89139,89135\n89140,72\n89141,72\n89142,89143\n89144,24505\n89145,3148\n89147,920\n89147,1639\n89148,83\n89148,304\n89148,309\n89148,310\n89148,389\n89148,415\n89148,538\n89148,631\n89148,673\n89148,714\n89148,920\n89148,973\n89148,1033\n89148,1122\n89148,1167\n89148,1179\n89148,1181\n89148,1294\n89148,1474\n89148,1644\n89148,1805\n89148,1849\n89148,1891\n89148,2224\n89148,2334\n89148,2590\n89148,3769\n89148,5405\n89148,21944\n89148,124668\n89148,143287\n89149,89150\n89151,302\n89152,24505\n89153,6387\n89154,24505\n89155,68467\n89156,30\n89156,217\n89156,264\n89156,278\n89156,328\n89156,2979\n89157,89158\n89159,89158\n89160,89158\n89161,89158\n89162,89158\n89163,89158\n89164,430\n89164,1571\n89164,1821\n89164,4903\n89165,72\n89166,89167\n89168,72\n89169,2146\n89170,366\n89171,72\n89172,72\n89173,89174\n89173,89336\n89173,120323\n89175,89176\n89177,9026\n89178,89179\n89181,89182\n89183,602\n89184,6051\n89185,272\n89187,89188\n89189,676\n89190,175\n89191,65\n89192,187\n89193,200\n89195,8270\n89196,89197\n89198,187\n89199,89200\n89202,89203\n89205,1353\n89206,31896\n89207,2929\n89208,184\n89209,233\n89210,89211\n89212,3447\n89213,89214\n89215,3413\n89216,107\n89217,2416\n89217,2417\n89218,292\n89219,338\n89220,298\n89221,3538\n89222,1133\n89223,120\n89223,1235\n89224,1977\n89224,1978\n89225,355\n89226,2351\n89227,89228\n89229,89228\n89230,89228\n89231,89232\n89233,4039\n89234,1509\n89235,6837\n89236,89237\n89236,100111\n89238,89239\n89240,89241\n89242,72\n89243,344\n89244,285\n89246,89247\n89248,30\n89249,24505\n89250,2048\n89251,6387\n89253,805\n89254,1247\n89254,1644\n89255,620\n89257,89258\n89259,31934\n89260,422\n89261,422\n89262,422\n89263,422\n89264,422\n89265,422\n89266,422\n89267,422\n89268,422\n89269,422\n89270,72\n89271,344\n89272,285\n89273,1531\n89274,89275\n89276,89277\n89278,158\n89279,89280\n89281,89280\n89283,718\n89284,1235\n89284,1335\n89285,2867\n89285,2868\n89288,89289\n89290,6179\n89290,6180\n89291,577\n89293,89292\n89295,78232\n89296,126\n89297,126\n89297,23011\n89298,89299\n89298,92631\n89300,393\n89301,89302\n89301,92806\n89303,89304\n89305,72\n89306,211\n89307,3209\n89308,328\n89309,18726\n89310,344\n89311,48\n89312,349\n89313,175\n89314,310\n89315,163\n89316,89317\n89318,392\n89319,994\n89320,89321\n89322,89321\n89323,89324\n89325,3447\n89326,89327\n89328,89328\n89329,89330\n89331,2782\n89332,366\n89333,18726\n89335,3003\n89337,1707\n89338,483\n89339,89340\n89341,577\n89342,298\n89343,485\n89344,298\n89345,485\n89346,500\n89347,644\n89348,89349\n89350,1368\n89351,376\n89352,652\n89353,2351\n89354,151\n89355,89356\n89357,301\n89358,89359\n89360,89361\n89362,18298\n89363,298\n89364,485\n89366,718\n89367,50\n89367,79\n89367,86\n89367,102\n89367,163\n89367,195\n89367,206\n89367,314\n89367,397\n89367,422\n89367,503\n89367,631\n89367,652\n89367,744\n89367,758\n89367,996\n89367,1113\n89367,1117\n89367,1160\n89367,1238\n89367,1247\n89367,1326\n89367,1509\n89367,1572\n89367,1631\n89367,1644\n89367,1871\n89367,4231\n89367,34879\n89368,178\n89369,89370\n89371,89370\n89372,89370\n89373,743\n89374,89375\n89376,298\n89377,485\n89380,298\n89381,485\n89382,298\n89383,485\n89384,298\n89385,485\n89386,178\n89387,389\n89389,9121\n89390,298\n89391,485\n89392,439\n89393,349\n89394,89395\n89396,298\n89397,485\n89398,602\n89399,1117\n89399,1122\n89401,312\n89402,298\n89403,485\n89404,89405\n89406,151\n89407,44\n89409,557\n89410,862\n89411,557\n89412,557\n89413,557\n89414,557\n89415,298\n89416,485\n89417,602\n89418,602\n89419,602\n89420,89421\n89422,187\n89423,907\n89423,1122\n89424,89425\n89426,89425\n89427,146\n89427,383\n89427,403\n89427,1127\n89427,27041\n89427,92476\n89428,10\n89429,34\n89429,35\n89429,6789\n89430,89431\n89432,366\n89433,366\n89434,175\n89434,693\n89435,298\n89436,485\n89437,258\n89438,298\n89439,485\n89440,298\n89441,485\n89442,175\n89443,89444\n89445,195\n89446,89447\n89448,1458\n89449,577\n89449,1531\n89450,805\n89451,62561\n89452,1313\n89453,30\n89454,1983\n89455,1509\n89456,850\n89457,175\n89458,298\n89459,30\n89460,30\n89462,424\n89463,89464\n89466,30\n89467,89468\n89470,89471\n89472,298\n89473,485\n89474,1749\n89474,3585\n89475,2146\n89476,349\n89477,33082\n89478,7155\n89479,188\n89480,89481\n89480,90592\n89480,92233\n89482,89483\n89484,222\n89485,422\n89486,56\n89487,72\n89488,72\n89489,420\n89490,10\n89491,89492\n89491,117404\n89493,1452\n89494,328\n89496,652\n89497,1531\n89498,818\n89499,292\n89500,294\n89501,296\n89502,298\n89503,175\n89504,298\n89505,2048\n89506,24505\n89507,89508\n89509,1238\n89510,292\n89511,89512\n89513,89512\n89514,233\n89515,79\n89516,874\n89517,376\n89518,726\n89519,1571\n89520,89521\n89522,698\n89523,89524\n89525,252\n89526,89527\n89528,211\n89529,827\n89529,1803\n89529,5213\n89530,1247\n89530,1644\n89531,89531\n89532,8\n89533,89534\n89535,1085\n89536,1127\n89537,485\n89537,6263\n89538,89539\n89540,140\n89541,390\n89541,1010\n89541,2146\n89542,252\n89542,1220\n89542,1222\n89543,302\n89543,1294\n89544,838\n89545,192\n89546,302\n89546,579\n89546,1556\n89548,298\n89549,485\n89550,79\n89551,1359\n89552,1016\n89553,255\n89554,567\n89555,30\n89556,326\n89556,2116\n89558,577\n89558,1070\n89558,1105\n89558,1531\n89559,1132\n89560,781\n89562,21944\n89563,160\n89564,671\n89565,1531\n89566,18726\n89567,83\n89568,671\n89569,147\n89570,1096\n89571,620\n89572,184\n89573,9457\n89575,271\n89576,1240\n89577,1122\n89578,538\n89579,473\n89580,663\n89580,664\n89580,994\n89580,1556\n89581,934\n89582,3069\n89583,563\n89584,41\n89584,631\n89586,640\n89587,640\n89588,640\n89589,931\n89590,89591\n89593,217\n89594,79\n89595,4455\n89596,473\n89596,8149\n89597,89598\n89599,1118\n89600,147\n89600,158\n89600,779\n89601,1844\n89602,415\n89603,422\n89604,388\n89605,93\n89605,94\n89606,206\n89607,818\n89608,1151\n89608,1836\n89609,779\n89610,2784\n89611,875\n89612,264\n89612,749\n89612,1381\n89612,2605\n89613,1417\n89614,24926\n89615,151\n89616,992\n89616,19488\n89618,827\n89619,932\n89620,209\n89620,489\n89621,1400\n89622,760\n89622,1149\n89622,1631\n89623,392\n89623,84257\n89624,225\n89624,248\n89624,450\n89624,850\n89624,1332\n89624,5405\n89625,83\n89626,2626\n89627,298\n89628,485\n89630,1240\n89631,48\n89632,516\n89633,269\n89634,3724\n89635,392\n89636,48\n89638,356\n89638,1326\n89639,422\n89640,215\n89641,298\n89642,485\n89643,500\n89644,422\n89645,422\n89646,310\n89647,422\n89648,422\n89649,422\n89650,422\n89651,422\n89652,422\n89653,89654\n89655,1796\n89658,30331\n89660,10\n89661,287\n89661,809\n89662,104\n89662,134\n89662,137\n89662,138\n89663,89664\n89665,1010\n89666,1688\n89667,1707\n89667,1893\n89668,1132\n89669,2379\n89670,30\n89671,305\n89672,1179\n89673,1467\n89674,623\n89674,1805\n89675,1390\n89676,859\n89677,30\n89678,158\n89679,312\n89679,1177\n89679,1235\n89680,89681\n89680,157835\n89680,160137\n89680,184275\n89680,190234\n89680,218779\n89680,219892\n89680,229218\n89680,239074\n89680,241030\n89680,251877\n89682,500\n89683,89684\n89685,485\n89686,784\n89687,779\n89687,68069\n89688,2775\n89689,447\n89690,1285\n89692,1359\n89693,1556\n89694,2775\n89695,447\n89696,298\n89697,485\n89699,340\n89699,473\n89700,30\n89701,10\n89702,30\n89704,302\n89704,811\n89704,893\n89705,72\n89706,344\n89707,285\n89709,200\n89709,1033\n89711,999\n89711,1119\n89713,30\n89714,3297\n89716,1381\n89717,30\n89718,1977\n89718,1978\n89719,477\n89720,1087\n89721,433\n89722,217\n89723,3507\n89724,467\n89724,536\n89725,358\n89725,1252\n89725,1253\n89725,1465\n89725,1634\n89725,2867\n89725,2868\n89726,516\n89727,30\n89728,1087\n89729,406\n89730,137\n89731,623\n89731,1805\n89732,120\n89733,868\n89734,31934\n89735,310\n89737,1381\n89738,15\n89738,207\n89738,713\n89738,4172\n89739,195\n89740,3207\n89741,89741\n89743,1220\n89743,1222\n89744,252\n89745,251\n89746,360\n89746,703\n89749,622\n89751,171\n89752,337\n89752,439\n89752,538\n89753,868\n89754,663\n89754,2480\n89755,41\n89755,1243\n89755,1544\n89756,1220\n89756,1222\n89757,137\n89758,477\n89759,477\n89760,206\n89761,779\n89762,932\n89763,147\n89763,158\n89763,1181\n89763,118336\n89764,47\n89764,467\n89764,2469\n89766,852\n89767,3756\n89768,861\n89769,1381\n89770,209\n89771,310\n89772,313\n89772,634\n89772,783\n89772,1058\n89772,2646\n89773,68069\n89773,86832\n89774,1531\n89775,89776\n89779,1893\n89780,1769\n89781,527\n89781,740\n89781,741\n89781,743\n89782,222\n89783,200\n89784,247\n89785,17309\n89786,599\n89786,1707\n89786,1983\n89787,652\n89789,68069\n89790,843\n89791,79\n89792,298\n89793,485\n89795,8991\n89796,1127\n89796,1893\n89797,6323\n89798,483\n89799,89799\n89800,417\n89801,222\n89802,287\n89803,217\n89803,872\n89804,68069\n89805,422\n89806,56\n89807,68069\n89807,86832\n89807,103860\n89809,392\n89810,772\n89811,68069\n89812,163\n89812,209\n89812,438\n89813,557\n89814,89815\n89816,2646\n89816,3623\n89817,1818\n89818,15523\n89819,420\n89820,1888\n89821,1381\n89822,772\n89823,1240\n89823,3182\n89823,6955\n89824,809\n89825,392\n89827,349\n89827,1072\n89827,13361\n89828,298\n89829,485\n89830,1836\n89831,500\n89832,3069\n89834,68069\n89835,1147\n89835,1891\n89836,68069\n89837,167\n89837,2083\n89838,83\n89839,2292\n89839,2889\n89841,175\n89842,298\n89843,682\n89843,1353\n89843,72439\n89844,3069\n89847,104\n89848,30\n89850,1381\n89852,30\n89853,1231\n89854,68069\n89854,86832\n89855,1381\n89856,1381\n89857,247\n89857,269\n89857,516\n89858,994\n89859,48\n89860,1432\n89861,94\n89861,2787\n89862,14434\n89863,273\n89864,89865\n89868,2319\n89870,48\n89871,973\n89871,1179\n89872,392\n89873,30\n89874,602\n89876,872\n89877,247\n89878,158\n89879,89879\n89880,1818\n89881,83\n89882,195\n89884,89885\n89886,3069\n89887,1818\n89888,1818\n89889,1818\n89890,22\n89890,255\n89890,563\n89890,818\n89891,89892\n89893,376\n89894,1818\n89895,1818\n89896,107\n89897,1818\n89898,579\n89900,149\n89901,1082\n89901,1807\n89901,1818\n89902,30\n89904,88820\n89905,68069\n89906,1818\n89907,48\n89907,275\n89907,980\n89908,1818\n89909,137\n89910,10\n89911,1572\n89911,1818\n89912,264\n89913,30\n89914,1453\n89915,107\n89915,200\n89915,1462\n89915,8180\n89915,8537\n89915,88820\n89916,89917\n89918,1818\n89919,292\n89920,89921\n89922,89921\n89923,1818\n89924,805\n89925,392\n89926,89927\n89929,358\n89929,1844\n89931,30\n89933,2775\n89934,447\n89935,1707\n89936,1\n89937,1298\n89938,175\n89939,298\n89940,2775\n89941,447\n89942,89943\n89944,326\n89944,1313\n89945,10\n89946,843\n89948,1453\n89949,29380\n89950,89951\n89952,206\n89953,89953\n89954,644\n89955,68069\n89956,1363\n89957,89958\n89959,640\n89960,1515\n89961,6298\n89962,1465\n89963,717\n89963,784\n89963,1381\n89964,859\n89965,175\n89966,68069\n89967,298\n89968,56\n89968,192\n89969,89970\n89971,557\n89972,557\n89973,89974\n89975,89976\n89977,89976\n89978,89976\n89979,1818\n89980,1\n89981,323\n89982,89983\n89984,516\n89985,20004\n89986,89987\n89988,184\n89989,89990\n89991,89992\n89993,21944\n89994,1082\n89994,1818\n89995,89996\n89997,481\n89998,89996\n89998,143208\n90000,90001\n90002,18726\n90003,90004\n90005,68069\n90006,623\n90007,1127\n90008,90009\n90010,8854\n90011,72\n90012,21944\n90013,90014\n90015,1983\n90016,657\n90017,1983\n90018,1983\n90019,90020\n90022,9598\n90023,602\n90024,1983\n90025,90026\n90027,68069\n90028,130\n90029,48\n90030,66\n90030,868\n90030,2371\n90032,10\n90033,2750\n90034,631\n90034,1085\n90034,2083\n90034,3115\n90035,90036\n90035,101949\n90035,140202\n90035,140209\n90037,68069\n90038,3413\n90039,862\n90040,90041\n90042,195\n90043,3447\n90044,90045\n90046,602\n90047,77\n90048,104\n90049,1467\n90050,14366\n90051,388\n90053,30\n90054,2424\n90055,30\n90056,90057\n90058,2668\n90059,30\n90060,30\n90061,1871\n90062,90063\n90062,194311\n90064,255\n90065,2146\n90066,2319\n90067,147\n90067,1462\n90068,1801\n90069,366\n90070,366\n90071,13980\n90072,90073\n90074,90073\n90075,90073\n90076,222\n90076,455\n90076,657\n90076,2424\n90076,21435\n90076,90076\n90076,98961\n90076,234754\n90077,392\n90078,233\n90080,310\n90081,577\n90083,77\n90084,90085\n90086,90087\n90088,68069\n90089,1818\n90090,34\n90090,35\n90091,7652\n90092,2168\n90093,1893\n90094,1479\n90095,907\n90096,1467\n90097,868\n90098,90099\n90100,346\n90101,10\n90102,1818\n90103,388\n90104,90105\n90106,302\n90107,2424\n90108,298\n90109,485\n90110,1818\n90111,5034\n90112,104\n90113,1849\n90114,90115\n90116,571\n90117,21944\n90119,175\n90121,1871\n90122,298\n90123,1\n90124,207\n90125,602\n90126,10\n90127,859\n90128,1818\n90129,602\n90130,862\n90131,640\n90132,1019\n90132,5250\n90134,90135\n90136,149\n90137,392\n90138,20\n90138,182\n90138,440\n90138,489\n90138,1011\n90138,1133\n90138,1172\n90138,1204\n90138,1844\n90139,68069\n90139,141912\n90140,1119\n90141,209\n90142,447\n90143,1143\n90144,623\n90144,1805\n90144,4760\n90145,1359\n90146,497\n90147,200\n90148,503\n90150,30\n90151,422\n90152,56\n90153,640\n90154,640\n90155,90155\n90156,1983\n90157,2116\n90159,30\n90160,640\n90161,104\n90161,953\n90162,19443\n90163,872\n90164,22\n90164,211\n90164,141912\n90165,30\n90166,1132\n90167,781\n90168,1893\n90169,81070\n90170,1807\n90170,1818\n90171,30\n90172,143\n90173,79\n90173,1289\n90174,779\n90174,68069\n90175,120\n90176,49887\n90177,1564\n90177,1785\n90177,4146\n90180,206\n90181,337\n90181,1370\n90182,477\n90183,1298\n90183,2979\n90184,83\n90185,167\n90185,1300\n90186,932\n90188,90189\n90190,90189\n90191,1033\n90192,75912\n90193,602\n90194,298\n90195,485\n90196,447\n90197,1287\n90199,163\n90199,1511\n90199,3069\n90200,392\n90201,726\n90202,97\n90203,3538\n90204,90205\n90204,105971\n90206,1181\n90207,1052\n90208,1849\n90209,209\n90211,439\n90211,68069\n90212,68467\n90213,360\n90213,872\n90214,90215\n90216,626\n90217,298\n90218,485\n90219,192\n90220,4146\n90221,21944\n90222,477\n90223,90224\n90225,493\n90225,586\n90226,1590\n90227,90228\n90229,90230\n90231,90230\n90232,90230\n90233,90234\n90235,1458\n90236,15523\n90237,1631\n90238,620\n90239,171\n90240,477\n90241,356\n90242,1287\n90243,30\n90244,9560\n90245,9029\n90246,379\n90248,477\n90249,81070\n90250,3695\n90252,477\n90253,305\n90253,762\n90254,46\n90254,444\n90254,567\n90254,968\n90254,973\n90255,687\n90256,16196\n90259,292\n90260,422\n90262,422\n90263,422\n90264,422\n90265,422\n90266,209\n90267,422\n90268,422\n90269,422\n90270,422\n90272,422\n90273,422\n90274,200\n90275,875\n90276,72\n90277,344\n90278,285\n90279,248\n90280,175\n90281,90281\n90282,298\n90284,647\n90285,344\n90286,1323\n90287,102\n90288,1326\n90289,408\n90290,200\n90290,772\n90291,209\n90292,626\n90293,422\n90293,1127\n90294,1732\n90296,852\n90299,79\n90300,457\n90301,2205\n90301,2206\n90301,2775\n90301,33424\n90302,272\n90302,1294\n90303,209\n90304,406\n90305,599\n90307,1001\n90309,1001\n90310,589\n90311,240\n90312,269\n90313,1390\n90314,81070\n90315,209\n90316,17309\n90317,392\n90318,1466\n90319,298\n90320,485\n90321,9457\n90322,90323\n90322,109424\n90324,1381\n90326,79\n90326,1257\n90326,3085\n90327,809\n90328,79\n90329,2367\n90331,298\n90332,485\n90336,22\n90336,2750\n90338,875\n90339,90340\n90341,90342\n90343,90344\n90345,442\n90346,720\n90349,861\n90350,1634\n90351,48\n90352,3\n90353,167\n90354,697\n90355,2073\n90356,233\n90357,1368\n90357,1509\n90357,1639\n90359,657\n90360,1240\n90361,30\n90362,195\n90363,264\n90363,1509\n90363,191860\n90364,202\n90364,203\n90365,147\n90367,90368\n90369,360\n90369,515\n90369,1151\n90369,1381\n90369,1639\n90369,2617\n90370,406\n90370,779\n90370,68069\n90371,22\n90372,104\n90373,298\n90374,485\n90375,10\n90376,48\n90377,313\n90378,30\n90379,86\n90380,1453\n90384,90385\n90386,247\n90387,195\n90388,34\n90388,35\n90388,313\n90388,634\n90389,1293\n90389,1417\n90389,1844\n90390,875\n90391,72\n90392,663\n90392,664\n90392,994\n90392,1837\n90393,392\n90393,483\n90394,209\n90395,206\n90395,280\n90395,17245\n90396,72\n90397,30\n90398,473\n90399,72\n90400,10\n90401,1912\n90402,30\n90403,1019\n90404,72764\n90405,779\n90405,68069\n90406,392\n90407,392\n90408,10\n90409,68069\n90410,931\n90411,251\n90411,252\n90411,516\n90411,925\n90411,1220\n90411,1222\n90411,2567\n90413,72\n90415,72\n90416,483\n90417,30\n90417,200\n90418,309\n90418,310\n90418,760\n90419,483\n90419,862\n90420,376\n90421,885\n90422,81\n90423,72\n90424,344\n90425,285\n90426,2526\n90427,34\n90427,35\n90428,850\n90429,392\n90430,850\n90431,267\n90432,1871\n90432,2421\n90433,850\n90434,30\n90435,1127\n90436,376\n90437,247\n90438,30\n90439,90440\n90441,90440\n90442,1323\n90443,30\n90444,90445\n90446,65\n90447,872\n90448,30\n90449,106\n90450,195\n90450,6323\n90451,90452\n90453,457\n90454,433\n90455,147\n90455,1515\n90456,2782\n90457,68069\n90458,209\n90459,760\n90460,557\n90461,90461\n90462,140\n90463,267\n90464,1983\n90465,158\n90466,167\n90466,299\n90466,2083\n90467,209\n90468,134\n90468,3135\n90469,1707\n90470,868\n90471,3260\n90472,34\n90472,35\n90473,136\n90475,50\n90475,388\n90476,358\n90477,4355\n90478,90479\n90480,90481\n90480,95457\n90482,779\n90482,68069\n90483,202\n90483,203\n90484,70631\n90485,1836\n90486,24505\n90487,1\n90487,184\n90487,620\n90488,32\n90488,760\n90489,72\n90490,389\n90491,779\n90492,3422\n90493,557\n90494,2116\n90495,1983\n90496,90497\n90498,433\n90499,557\n90500,90501\n90502,298\n90503,485\n90504,1458\n90505,298\n90506,485\n90507,647\n90508,344\n90509,1818\n90510,577\n90511,850\n90512,90513\n90514,90515\n90516,850\n90517,285\n90518,850\n90520,4611\n90521,602\n90522,602\n90523,422\n90524,56\n90525,885\n90526,298\n90527,485\n90528,467\n90528,588\n90528,590\n90528,75912\n90529,90530\n90531,90532\n90533,1381\n90535,68069\n90537,5440\n90538,10\n90539,1181\n90540,250\n90540,1684\n90541,79\n90543,72\n90544,90545\n90546,1531\n90546,2178\n90546,4545\n90546,56150\n90547,90548\n90549,5366\n90550,2995\n90551,90552\n90553,18726\n90554,77\n90555,72\n90556,217\n90557,90558\n90559,205\n90560,850\n90562,841\n90563,1319\n90564,275\n90565,1571\n90566,313\n90567,313\n90568,313\n90569,289\n90569,290\n90570,195\n90570,27217\n90571,90572\n90571,120558\n90573,90574\n90575,313\n90576,1167\n90578,195\n90579,19986\n90580,2178\n90580,4545\n90581,90582\n90583,90584\n90585,589\n90585,1001\n90586,390\n90587,195\n90588,90589\n90590,90591\n90593,4678\n90594,344\n90594,827\n90595,3148\n90596,5405\n90597,872\n90598,872\n90599,3246\n90600,671\n90601,1210\n90601,2083\n90601,90602\n90601,126606\n90601,151521\n90603,207\n90604,90605\n90606,90605\n90607,175\n90608,298\n90609,72\n90610,72\n90611,90612\n90614,90615\n90616,30\n90617,233\n90619,3392\n90621,2351\n90622,2116\n90624,704\n90625,347\n90626,90627\n90629,298\n90630,485\n90631,90632\n90633,149\n90633,163\n90633,703\n90633,809\n90634,97\n90635,10\n90636,1135\n90637,90638\n90639,355\n90640,2867\n90640,2868\n90641,452\n90642,1247\n90643,184\n90644,97\n90645,602\n90645,13661\n90646,298\n90647,485\n90648,34\n90648,35\n90650,163\n90650,2116\n90651,626\n90652,83\n90652,577\n90652,949\n90653,313\n90653,379\n90653,1274\n90654,90655\n90656,305\n90658,90659\n90658,94437\n90661,90660\n90663,1309\n90663,1955\n90664,2146\n90665,626\n90665,1392\n90665,93401\n90668,1531\n90669,90670\n90671,32\n90671,118336\n90672,90673\n90674,636\n90675,868\n90676,90677\n90678,557\n90679,1368\n90680,491\n90680,827\n90680,2315\n90681,347\n90682,1983\n90683,200\n90684,736\n90685,255\n90686,2048\n90687,360\n90688,843\n90689,90690\n90691,187\n90692,972\n90693,640\n90694,640\n90695,79\n90696,843\n90697,640\n90698,90699\n90700,30\n90701,1149\n90702,726\n90702,868\n90703,835\n90703,1893\n90706,1531\n90707,843\n90708,140\n90709,90710\n90711,718\n90712,264\n90713,97\n90714,140\n90715,22293\n90716,167\n90717,147\n90717,158\n90717,336\n90718,932\n90719,83\n90720,843\n90720,1590\n90722,611\n90723,481\n90724,1858\n90725,809\n90726,1579\n90727,90728\n90729,90728\n90730,90728\n90731,90728\n90732,10\n90733,1556\n90734,140\n90735,58\n90736,338\n90736,1238\n90736,4039\n90737,626\n90738,422\n90740,90741\n90742,422\n90743,422\n90744,422\n90745,422\n90746,422\n90747,90748\n90749,1181\n90750,422\n90751,422\n90752,3413\n90753,859\n90755,455\n90756,581\n90757,264\n90757,302\n90757,893\n90758,557\n90759,3507\n90761,151\n90761,685\n90762,301\n90762,717\n90762,1293\n90762,1782\n90763,422\n90764,861\n90765,39564\n90766,1715\n90767,1127\n90768,1\n90769,1359\n90770,137\n90770,611\n90770,50318\n90770,75912\n90771,1220\n90771,1222\n90772,477\n90773,171\n90774,252\n90775,1467\n90776,477\n90778,931\n90778,1127\n90778,1893\n90778,4823\n90779,20\n90780,1243\n90782,1284\n90783,1983\n90784,298\n90785,485\n90786,2266\n90787,217\n90789,477\n90790,1359\n90792,13538\n90794,779\n90794,68069\n90794,118336\n90794,141912\n90795,2146\n90796,527\n90796,8714\n90797,1390\n90798,1016\n90800,536\n90801,647\n90802,344\n90803,1707\n90804,467\n90804,1143\n90805,2379\n90806,8990\n90807,136\n90808,510\n90809,336\n90809,631\n90811,1983\n90812,1977\n90812,1978\n90813,26181\n90814,90815\n90816,158\n90818,602\n90819,302\n90819,579\n90819,1556\n90820,90821\n90823,406\n90824,1983\n90825,90826\n90828,1096\n90829,2105\n90830,2116\n90831,8072\n90832,175\n90833,30\n90834,298\n90835,433\n90836,1983\n90838,1983\n90839,240\n90840,849\n90841,1274\n90842,90843\n90844,477\n90845,71\n90845,7087\n90845,90845\n90845,123847\n90845,170952\n90845,264446\n90845,264454\n90845,264773\n90846,433\n90848,1298\n90849,477\n90850,90851\n90854,86\n90854,1089\n90855,1381\n90856,420\n90857,225\n90857,248\n90857,431\n90857,932\n90857,941\n90857,968\n90857,1832\n90857,22799\n90858,1983\n90859,138\n90859,360\n90859,21944\n90860,9560\n90861,1132\n90862,781\n90863,640\n90864,54\n90864,83\n90864,140\n90864,660\n90864,752\n90864,919\n90864,1287\n90864,1309\n90864,1871\n90864,2424\n90865,3297\n90866,90867\n90868,18298\n90869,72\n90870,151\n90870,2668\n90873,1326\n90874,1132\n90875,781\n90876,1805\n90877,90878\n90879,1132\n90880,781\n90881,2979\n90882,90883\n90884,868\n90885,314\n90886,79\n90886,346\n90886,525\n90887,647\n90888,344\n90889,1132\n90890,781\n90891,1132\n90892,781\n90893,850\n90894,483\n90894,90845\n90895,3252\n90895,7092\n90896,1551\n90897,346\n90898,1132\n90899,781\n90900,160\n90901,1132\n90902,781\n90903,442\n90903,557\n90903,2334\n90904,1116\n90905,299\n90905,1837\n90905,5301\n90907,1132\n90908,781\n90909,65\n90909,85\n90910,3003\n90911,85\n90912,718\n90912,3069\n90913,117\n90913,885\n90913,994\n90913,1212\n90913,1432\n90913,2712\n90914,1132\n90915,781\n90916,1707\n90917,31934\n90918,1796\n90919,1267\n90920,636\n90921,3\n90922,843\n90923,3207\n90924,347\n90925,111\n90925,1119\n90925,2989\n90925,2991\n90926,15523\n90927,1983\n90928,90929\n90930,48\n90930,147\n90930,1425\n90931,72\n90932,2646\n90933,315\n90933,439\n90933,671\n90933,996\n90933,1474\n90934,68069\n90935,500\n90936,136\n90936,137\n90938,83\n90938,333\n90939,50\n90940,1836\n90941,90941\n90942,68069\n90943,200\n90944,1289\n90944,3474\n90945,417\n90946,90947\n90948,248\n90949,592\n90950,90951\n90950,130019\n90952,140\n90953,3422\n90954,30\n90955,2244\n90957,83\n90957,278\n90958,10\n90959,278\n90959,1417\n90960,852\n90961,298\n90962,485\n90963,30\n90964,510\n90965,907\n90966,1151\n90967,788\n90968,1381\n90970,140\n90970,2353\n90971,200\n90972,459\n90973,22\n90974,175\n90975,298\n90976,44725\n90977,30\n90978,376\n90980,90981\n90983,10\n90984,657\n90985,90986\n90985,92612\n90985,200654\n90985,204933\n90987,264\n90987,1289\n90988,636\n90989,298\n90990,485\n90991,10\n90991,113156\n90993,149\n90994,90995\n90994,97770\n90994,123934\n90996,20771\n90997,90998\n90999,467\n91000,247\n91001,417\n91003,1274\n91004,91005\n91006,58\n91007,46\n91008,97\n91009,2775\n91010,447\n91011,393\n91012,31934\n91013,211\n91014,147\n91014,158\n91015,2867\n91015,2868\n91016,1531\n91017,450\n91018,1877\n91020,298\n91021,485\n91022,91023\n91024,91023\n91025,88820\n91026,207\n91026,2668\n91027,450\n91028,298\n91029,485\n91030,10\n91030,1235\n91031,309\n91031,310\n91032,22\n91033,91034\n91036,366\n91037,366\n91038,366\n91039,483\n91040,91041\n91042,91041\n91043,217\n91043,1417\n91044,136\n91045,3\n91045,233\n91047,393\n91048,1531\n91049,647\n91050,344\n91053,302\n91054,102\n91055,147\n91055,149\n91055,1623\n91056,298\n91057,485\n91058,1033\n91059,1319\n91060,143\n91061,557\n91062,557\n91063,298\n91064,485\n91065,298\n91066,485\n91067,687\n91068,779\n91069,30\n91070,602\n91071,865\n91071,994\n91072,602\n91073,91074\n91075,171\n91076,1363\n91077,1359\n91078,8854\n91079,968\n91080,158\n91081,140\n91082,450\n91083,298\n91084,485\n91085,602\n91086,433\n91087,1359\n91088,602\n91089,91090\n91092,875\n91093,1608\n91094,602\n91095,91096\n91097,72\n91098,2775\n91099,447\n91100,175\n91101,298\n91102,195\n91103,195\n91105,91106\n91107,1983\n91108,206\n91109,417\n91110,83\n91111,258\n91112,68069\n91113,392\n91114,859\n91115,636\n91116,850\n91117,91118\n91119,91120\n91121,91122\n91123,313\n91124,306\n91124,307\n91125,68467\n91126,68069\n91127,255\n91128,536\n91129,3161\n91130,30\n91131,91132\n91134,195\n91135,2671\n91136,91137\n91136,96400\n91138,602\n91139,175\n91140,298\n91141,366\n91142,682\n91142,72439\n91143,151\n91144,1238\n91145,1452\n91146,34\n91146,35\n91146,536\n91147,91148\n91149,30\n91150,233\n91151,195\n91152,91153\n91155,862\n91156,91157\n91159,30\n91160,1132\n91161,781\n91162,30\n91164,298\n91165,485\n91166,1983\n91167,4611\n91168,1544\n91169,483\n91171,91172\n91171,113108\n91173,4611\n91174,1544\n91175,298\n91176,485\n91177,760\n91179,91180\n91181,415\n91183,355\n91184,6556\n91185,58\n91186,1821\n91187,302\n91187,579\n91188,1001\n91190,1298\n91191,30\n91193,91194\n91195,298\n91196,485\n91197,784\n91198,91199\n91200,1634\n91201,1858\n91202,1860\n91203,298\n91204,485\n91205,3695\n91208,1010\n91209,1359\n91210,285\n91212,7572\n91213,298\n91214,485\n91215,602\n91216,298\n91217,485\n91218,1016\n91219,63\n91220,861\n91220,893\n91220,2750\n91221,251\n91223,91224\n91225,298\n91226,485\n91227,4611\n91228,1544\n91229,158\n91230,240\n91230,588\n91230,590\n91230,592\n91233,640\n91235,640\n91236,91237\n91238,91237\n91239,640\n91240,91241\n91242,640\n91243,77\n91244,2775\n91245,447\n91247,3524\n91248,1983\n91249,91250\n91251,91237\n91252,91253\n91252,151630\n91254,4571\n91255,147\n91256,406\n91257,289\n91257,290\n91261,298\n91262,485\n91263,120\n91263,1858\n91264,91265\n91266,298\n91267,485\n91268,1608\n91269,693\n91270,994\n91272,3447\n91273,980\n91274,136\n91274,137\n91275,1132\n91276,781\n91277,649\n91278,1818\n91279,783\n91280,932\n91281,160\n91282,1983\n91283,83\n91284,32\n91284,392\n91284,644\n91284,2699\n91284,3003\n91284,4903\n91285,1776\n91285,68069\n91286,649\n91287,14126\n91288,107\n91289,457\n91290,875\n91291,868\n91292,1454\n91294,30236\n91295,1085\n91297,1359\n91298,206\n91299,1287\n91301,1085\n91302,140\n91303,1858\n91304,1860\n91305,298\n91306,485\n91308,736\n91308,14366\n91310,1238\n91311,1955\n91312,868\n91313,1359\n91314,2292\n91315,91316\n91317,652\n91318,424\n91319,647\n91320,344\n91321,18726\n91322,752\n91323,171\n91324,2915\n91325,1639\n91326,392\n91327,163\n91328,91328\n91329,104\n91329,2626\n91330,818\n91331,1983\n91332,175\n91333,298\n91334,403\n91335,171\n91336,171\n91337,1127\n91337,1287\n91339,10\n91340,536\n91340,1019\n91340,1274\n91342,390\n91343,72\n91344,1556\n91345,184\n91347,171\n91348,794\n91349,91350\n91351,91352\n91351,96486\n91353,91354\n91355,609\n91355,60576\n91356,1390\n91357,422\n91357,602\n91358,392\n91359,251\n91360,91361\n91362,30\n91364,1220\n91364,1222\n91365,171\n91366,1359\n91368,2017\n91369,252\n91370,83\n91371,392\n91372,298\n91373,485\n91374,5547\n91375,298\n91376,485\n91377,195\n91378,171\n91379,875\n91380,832\n91381,91382\n91383,91384\n91383,115156\n91383,120261\n91383,167362\n91385,147\n91385,306\n91385,307\n91385,620\n91385,682\n91385,72439\n91386,4571\n91386,88820\n91387,21944\n91388,364\n91389,137\n91389,703\n91390,602\n91391,91392\n91391,97652\n91391,113312\n91391,128508\n91393,91392\n91394,1133\n91394,1566\n91395,652\n91397,147\n91398,217\n91398,222\n91398,1417\n91398,2168\n91399,592\n91400,1298\n91401,1359\n91402,1019\n91403,247\n91404,91405\n91404,91927\n91404,93376\n91404,99906\n91404,102354\n91404,105347\n91404,106243\n91404,109742\n91404,114362\n91404,114739\n91404,114891\n91404,117411\n91404,120878\n91404,138237\n91406,1235\n91406,1335\n91407,372\n91408,175\n91409,58\n91410,46\n91411,32\n91411,697\n91412,2334\n91413,298\n91414,2574\n91415,192\n91416,929\n91417,536\n91418,91419\n91420,91421\n91422,31977\n91423,602\n91424,596\n91425,2116\n91427,1160\n91428,973\n91430,1353\n91431,91432\n91433,868\n91435,366\n91435,500\n91437,5547\n91438,136\n91439,424\n91440,136\n91441,240\n91442,1243\n91443,3413\n91445,422\n91445,602\n91445,707\n91446,1509\n91447,91448\n91449,973\n91450,1955\n91451,422\n91452,56\n91454,192\n91455,1265\n91455,1266\n91456,433\n91458,1509\n91458,1551\n91459,79\n91461,247\n91462,1425\n91463,392\n91464,247\n91465,202\n91465,91466\n91467,195\n91468,818\n91469,1309\n91470,1807\n91471,4980\n91472,6726\n91473,91474\n91475,30\n91476,91477\n91478,91479\n91480,30\n91481,875\n91482,1359\n91483,91484\n91485,91486\n91488,1085\n91488,1298\n91488,1326\n91489,83\n91490,536\n91491,91492\n91493,91492\n91495,81\n91496,875\n91497,302\n91498,48\n91499,602\n91500,2867\n91500,2868\n91501,104\n91502,72\n91503,602\n91504,247\n91505,240\n91505,818\n91506,647\n91507,344\n91508,5213\n91509,79\n91510,602\n91511,1634\n91512,1474\n91513,66\n91513,868\n91514,273\n91515,86\n91516,1715\n91517,1564\n91518,158\n91519,4355\n91520,72\n91520,91521\n91522,34\n91522,35\n91522,536\n91522,657\n91522,4672\n91523,626\n91524,72\n91525,346\n91525,510\n91525,91526\n91527,376\n91528,3\n91529,3135\n91530,344\n91530,647\n91531,30\n91532,91533\n91534,422\n91535,56\n91536,254\n91536,1282\n91536,5343\n91537,1151\n91538,298\n91539,485\n91541,272\n91542,119\n91542,516\n91543,298\n91544,485\n91545,298\n91546,485\n91547,1132\n91548,781\n91549,217\n91549,1007\n91549,1289\n91550,30\n91552,1235\n91552,1335\n91553,91554\n91555,1167\n91556,171\n91557,5405\n91558,980\n91559,91560\n91559,103949\n91559,111648\n91559,125558\n91559,128782\n91559,133248\n91559,141547\n91559,141730\n91559,142223\n91559,150314\n91559,152300\n91561,91560\n91562,4355\n91563,868\n91564,875\n91565,30\n91566,557\n91567,875\n91568,450\n91569,91570\n91571,91572\n91571,174078\n91573,225\n91574,289\n91574,290\n91575,91576\n91577,1118\n91578,1132\n91579,781\n91580,247\n91581,483\n91582,358\n91583,91584\n91585,240\n91585,442\n91585,805\n91585,1962\n91586,72\n91587,97\n91588,579\n91588,2116\n91589,3\n91590,91591\n91592,1849\n91593,557\n91594,91595\n91596,557\n91598,602\n91599,356\n91599,615\n91600,602\n91602,1572\n91603,298\n91604,485\n91606,217\n91606,872\n91606,918\n91606,2574\n91606,2617\n91606,16196\n91607,72\n91608,1010\n91609,2116\n91610,91611\n91612,422\n91614,91615\n91616,850\n91618,65\n91619,328\n91620,1240\n91620,1454\n91621,1608\n91622,772\n91622,26251\n91622,28203\n91623,577\n91624,17772\n91625,602\n91626,91627\n91626,118180\n91628,393\n91629,30\n91630,91631\n91633,850\n91634,107\n91635,1359\n91636,4594\n91637,72\n91638,450\n91639,1257\n91640,450\n91641,3367\n91642,3367\n91643,91644\n91645,187\n91646,392\n91647,91648\n91649,304\n91649,4411\n91650,298\n91651,485\n91653,91654\n91655,509\n91656,91657\n91658,1724\n91659,424\n91660,602\n91661,91662\n91663,72\n91664,2590\n91665,91666\n91667,91668\n91669,8788\n91670,91671\n91672,422\n91673,422\n91674,422\n91675,422\n91676,422\n91677,422\n91678,83\n91678,269\n91678,1014\n91679,422\n91680,422\n91681,91682\n91683,422\n91684,422\n91685,72\n91686,344\n91687,285\n91688,207\n91689,91690\n91691,250\n91691,1684\n91692,805\n91693,872\n91694,1429\n91695,668\n91696,602\n91697,6556\n91698,30\n91699,222\n91700,91701\n91702,30\n91703,91704\n91705,20813\n91706,14434\n91707,424\n91708,872\n91709,481\n91711,1133\n91712,91713\n91714,1143\n91715,1370\n91715,1821\n91715,2782\n91715,21736\n91716,91717\n91718,91719\n91721,78120\n91722,1007\n91723,88820\n91724,91725\n91726,392\n91727,91728\n91729,83\n91729,278\n91730,586\n91731,640\n91732,3\n91733,2620\n91734,366\n91735,366\n91736,366\n91737,65\n91738,91739\n91740,671\n91741,87\n91741,392\n91741,1363\n91741,2699\n91742,233\n91743,91744\n91745,7\n91745,126\n91745,332\n91745,1392\n91745,3872\n91745,6837\n91745,9195\n91745,17228\n91746,302\n91746,579\n91747,91748\n91749,75912\n91750,91751\n91753,750\n91754,91755\n91756,3422\n91757,304\n91758,91759\n91760,1566\n91761,355\n91762,872\n91763,298\n91764,485\n91766,72\n91767,795\n91768,859\n91769,30\n91770,140\n91771,500\n91772,1962\n91773,1052\n91774,1882\n91775,2775\n91776,54\n91777,503\n91778,1326\n91779,2979\n91780,115\n91780,118\n91780,4597\n91781,171\n91781,1623\n91782,862\n91783,1247\n91784,500\n91785,1962\n91786,1052\n91787,1882\n91788,2775\n91789,54\n91791,615\n91791,1243\n91791,1319\n91791,2572\n91792,192\n91794,1132\n91795,781\n91796,178\n91796,805\n91796,1368\n91796,5405\n91797,30\n91798,818\n91799,1572\n91800,835\n91800,3177\n91801,31977\n91802,5405\n91803,349\n91804,1359\n91805,1977\n91805,1978\n91806,91807\n91808,206\n91808,1118\n91809,433\n91810,439\n91811,527\n91812,992\n91813,72\n91814,222\n91817,217\n91818,872\n91819,88820\n91821,75912\n91822,91823\n91824,63\n91824,252\n91824,516\n91825,30\n91826,392\n91829,91830\n91831,1707\n91831,1955\n91831,66500\n91832,3538\n91833,147\n91833,333\n91833,1181\n91834,379\n91835,30\n91836,455\n91837,868\n91838,1001\n91841,571\n91842,575\n91842,1284\n91843,83\n91844,452\n91844,535\n91844,918\n91844,1655\n91845,275\n91846,694\n91847,91848\n91849,687\n91851,457\n91852,626\n91854,2319\n91855,1381\n91856,877\n91857,1381\n91858,5440\n91859,932\n91860,86\n91861,605\n91862,195\n91863,32\n91863,392\n91863,697\n91863,918\n91863,3003\n91864,1313\n91865,184\n91865,251\n91865,313\n91865,44725\n91866,422\n91867,422\n91868,422\n91869,422\n91870,422\n91871,422\n91872,422\n91873,422\n91874,422\n91875,422\n91876,298\n91877,485\n91879,15\n91879,2292\n91880,818\n91880,6059\n91881,301\n91882,1265\n91882,1266\n91883,3069\n91884,91885\n91886,19443\n91887,75912\n91888,2371\n91890,536\n91890,230514\n91891,3182\n91892,19010\n91892,22293\n91893,479\n91894,3297\n91895,1243\n91896,736\n91896,1289\n91898,1282\n91899,34\n91899,35\n91900,136\n91901,1400\n91902,1836\n91903,151\n91903,657\n91904,875\n91905,581\n91906,1019\n91906,13137\n91907,485\n91908,140\n91909,175\n91910,298\n91911,527\n91912,1390\n91913,1429\n91914,1146\n91915,91916\n91915,103754\n91915,104070\n91915,104125\n91917,1011\n91918,298\n91919,485\n91920,302\n91921,1556\n91924,298\n91925,485\n91926,1212\n91928,91929\n91930,91931\n91933,207\n91934,592\n91935,1659\n91936,310\n91936,3039\n91937,264\n91937,6323\n91938,58\n91939,46\n91940,75912\n91941,298\n91943,4935\n91945,920\n91947,467\n91948,200\n91949,4475\n91950,298\n91951,485\n91953,390\n91954,433\n91955,91956\n91957,1191\n91958,875\n91959,72\n91961,58\n91962,46\n91963,75912\n91964,58\n91965,46\n91966,75912\n91967,392\n91967,697\n91967,1722\n91967,2697\n91967,3538\n91968,58\n91969,46\n91970,75912\n91971,58\n91972,75912\n91973,46\n91974,1359\n91974,1882\n91975,240\n91975,301\n91975,372\n91975,589\n91975,631\n91975,1010\n91975,1085\n91976,760\n91976,1149\n91977,299\n91977,21944\n91978,175\n91979,298\n91980,287\n91980,809\n91981,918\n91982,1220\n91982,1222\n91983,872\n91984,130\n91985,663\n91985,664\n91986,1118\n91987,907\n91988,726\n91989,626\n91990,5213\n91991,167\n91992,872\n91993,818\n91995,3260\n91996,827\n91998,973\n92001,240\n92002,599\n92003,1837\n92004,92005\n92006,3069\n92007,850\n92008,333\n92009,628\n92010,1140\n92010,5547\n92011,392\n92012,4611\n92013,2775\n92014,447\n92015,72\n92016,2926\n92017,972\n92018,298\n92019,485\n92021,252\n92022,92023\n92024,1381\n92025,1010\n92026,30\n92027,298\n92028,485\n92029,72\n92031,872\n92032,92033\n92034,30\n92035,294\n92035,500\n92037,1579\n92038,850\n92039,1326\n92040,92041\n92042,579\n92043,92044\n92045,779\n92045,6323\n92046,34\n92046,35\n92047,104\n92049,392\n92050,81070\n92051,20771\n92052,92053\n92055,215\n92056,2697\n92057,137\n92057,304\n92057,1332\n92057,1888\n92058,298\n92059,485\n92060,1983\n92061,920\n92062,92063\n92064,167\n92065,1893\n92067,56\n92068,620\n92069,1\n92070,50\n92071,158\n92072,1515\n92073,99\n92074,714\n92075,703\n92076,5213\n92077,30\n92078,2867\n92078,2868\n92079,92080\n92081,30\n92082,652\n92083,1608\n92084,3193\n92085,2553\n92086,92087\n92088,557\n92089,68069\n92089,141912\n92090,30\n92091,779\n92091,68069\n92091,141912\n92093,34\n92093,35\n92094,72\n92095,30\n92096,30\n92097,92098\n92099,2646\n92101,772\n92103,83\n92104,358\n92105,19\n92106,602\n92107,8270\n92108,4220\n92109,178\n92109,406\n92109,714\n92109,779\n92109,801\n92109,1001\n92109,1203\n92109,1265\n92109,1266\n92109,1715\n92109,1955\n92109,2626\n92109,4146\n92109,9024\n92109,21711\n92109,54243\n92109,72750\n92109,92133\n92110,809\n92111,310\n92112,285\n92113,1370\n92114,640\n92115,92116\n92115,94007\n92117,557\n92118,557\n92119,557\n92120,1010\n92120,1122\n92120,1241\n92120,1849\n92120,2620\n92120,32784\n92121,8719\n92122,138\n92123,865\n92124,557\n92125,1016\n92126,137\n92127,3507\n92128,118\n92128,4597\n92129,21944\n92130,88820\n92131,187\n92132,1467\n92133,146\n92134,92135\n92134,100159\n92136,92137\n92138,6682\n92139,22\n92140,192\n92140,19413\n92141,81\n92141,175\n92141,215\n92141,233\n92141,290\n92141,328\n92141,590\n92141,592\n92141,693\n92141,704\n92141,714\n92141,1118\n92141,1149\n92141,1212\n92141,1257\n92141,1402\n92141,2210\n92141,3069\n92141,30124\n92141,33424\n92142,2116\n92143,294\n92144,2411\n92145,1353\n92146,328\n92147,10\n92148,298\n92149,485\n92150,3872\n92151,72\n92152,1363\n92154,92155\n92156,92157\n92158,1515\n92159,577\n92160,1893\n92161,72\n92162,406\n92162,779\n92163,247\n92164,2334\n92165,273\n92166,92167\n92166,100533\n92166,105684\n92168,92169\n92170,92171\n92172,1132\n92173,781\n92174,175\n92175,68069\n92176,92177\n92178,92179\n92180,92181\n92182,72\n92183,704\n92184,72\n92185,68069\n92186,68069\n92187,92188\n92189,158\n92190,298\n92191,485\n92193,298\n92194,485\n92195,298\n92196,485\n92197,298\n92198,485\n92199,301\n92200,92201\n92202,704\n92203,72\n92204,92205\n92206,92206\n92207,2590\n92208,92209\n92210,376\n92211,207\n92212,772\n92213,87\n92215,92216\n92217,92218\n92219,8270\n92220,920\n92220,92221\n92220,93477\n92220,129394\n92220,131878\n92220,157132\n92220,239692\n92220,240899\n92222,92223\n92222,92499\n92222,108789\n92224,1796\n92225,872\n92226,1429\n92227,225\n92228,668\n92229,92230\n92229,131578\n92231,92232\n92234,8884\n92235,92236\n92237,240\n92237,389\n92237,455\n92237,694\n92238,1085\n92239,704\n92239,5547\n92240,92241\n92242,968\n92242,1462\n92242,1564\n92242,1785\n92242,1818\n92242,8537\n92243,92244\n92245,72\n92246,72\n92247,92248\n92249,158\n92250,92251\n92252,366\n92253,366\n92254,4980\n92255,6726\n92256,589\n92257,920\n92258,233\n92259,872\n92260,1143\n92261,1243\n92262,872\n92263,92264\n92265,1243\n92266,72\n92267,92268\n92269,652\n92270,388\n92271,92272\n92271,100523\n92273,718\n92274,671\n92275,355\n92276,298\n92277,485\n92278,15573\n92279,92280\n92281,158\n92282,92283\n92284,72\n92285,298\n92286,485\n92287,92288\n92289,41\n92289,83\n92289,671\n92289,850\n92289,1807\n92289,6387\n92289,142473\n92290,1977\n92290,1978\n92291,92292\n92293,44\n92294,577\n92296,92297\n92298,32475\n92300,83\n92301,298\n92302,485\n92303,602\n92304,875\n92305,298\n92306,485\n92308,602\n92309,92310\n92311,1634\n92311,6638\n92312,298\n92313,485\n92314,2784\n92316,92317\n92318,92319\n92318,119575\n92320,92321\n92322,72\n92323,92324\n92325,422\n92326,422\n92327,422\n92328,422\n92329,422\n92330,422\n92331,422\n92332,422\n92333,310\n92334,92335\n92336,5547\n92337,875\n92338,602\n92339,92340\n92341,875\n92342,219\n92343,10\n92346,406\n92348,240\n92349,92350\n92351,9195\n92352,25873\n92353,34\n92353,35\n92354,3538\n92355,872\n92356,5250\n92357,693\n92358,17228\n92359,92360\n92362,333\n92362,59021\n92363,171\n92364,72\n92365,92366\n92365,171817\n92365,184741\n92365,217981\n92367,298\n92368,485\n92369,92370\n92369,106531\n92369,108680\n92369,238519\n92371,136\n92372,92373\n92372,103365\n92372,135339\n92372,139049\n92376,92377\n92378,1247\n92379,6303\n92380,1247\n92381,483\n92383,92384\n92385,586\n92386,640\n92387,92388\n92389,30\n92390,16207\n92391,195\n92392,1732\n92393,4611\n92394,298\n92395,485\n92396,92397\n92398,24505\n92399,376\n92400,1707\n92401,92402\n92403,92404\n92405,92404\n92406,92407\n92408,333\n92409,92410\n92411,10\n92411,515\n92411,652\n92411,872\n92411,1052\n92411,1127\n92411,1151\n92411,1659\n92411,1893\n92411,3695\n92412,298\n92413,485\n92414,298\n92415,485\n92416,298\n92417,485\n92418,92419\n92420,1479\n92421,390\n92422,136\n92423,875\n92424,298\n92425,485\n92426,92427\n92429,991\n92430,2146\n92431,602\n92432,72\n92434,602\n92435,92436\n92437,298\n92438,485\n92439,7652\n92442,92443\n92444,338\n92444,2244\n92446,1\n92447,175\n92447,92448\n92447,105891\n92447,222590\n92450,92451\n92452,83\n92453,417\n92454,92455\n92456,92457\n92458,1201\n92459,92460\n92461,92460\n92462,97\n92463,92464\n92465,92466\n92467,289\n92467,290\n92468,92469\n92471,92472\n92473,92474\n92476,10\n92476,106\n92476,146\n92476,336\n92476,406\n92476,620\n92476,841\n92476,1425\n92476,92476\n92476,118336\n92477,92478\n92479,92480\n92479,105093\n92481,92482\n92484,2867\n92484,2868\n92485,92486\n92487,92488\n92489,92488\n92490,92488\n92491,92492\n92493,92494\n92495,92496\n92497,92498\n92500,1983\n92501,1983\n92502,872\n92504,310\n92505,147\n92506,4691\n92507,92508\n92509,92510\n92511,233\n92512,35486\n92513,175\n92514,298\n92515,92516\n92517,54362\n92518,366\n92519,704\n92520,366\n92521,366\n92522,107\n92523,2416\n92523,2417\n92524,292\n92525,338\n92526,298\n92527,1133\n92528,3538\n92529,24505\n92530,68069\n92532,92533\n92534,355\n92535,146\n92536,175\n92537,92538\n92539,298\n92540,392\n92541,104\n92542,24505\n92543,298\n92544,485\n92545,298\n92546,485\n92547,175\n92548,298\n92549,298\n92550,485\n92551,92552\n92553,72\n92554,298\n92555,485\n92556,92557\n92558,92559\n92560,1132\n92561,781\n92562,2674\n92562,16153\n92563,500\n92564,1962\n92565,1052\n92566,1882\n92567,2775\n92568,54\n92569,175\n92571,298\n92572,211\n92573,92574\n92575,298\n92576,485\n92577,21944\n92578,273\n92579,92580\n92581,1127\n92581,1893\n92581,49057\n92582,602\n92583,1871\n92584,92585\n92586,586\n92587,602\n92588,92589\n92590,240\n92591,1983\n92592,2506\n92593,872\n92594,872\n92595,298\n92596,485\n92597,602\n92598,92599\n92600,571\n92602,92603\n92604,875\n92605,83\n92606,875\n92608,92609\n92611,178\n92613,92614\n92615,676\n92616,1072\n92617,298\n92618,485\n92619,1400\n92620,298\n92621,485\n92623,450\n92624,72\n92625,72\n92626,875\n92630,497\n92632,4691\n92633,55849\n92634,779\n92635,298\n92636,485\n92637,92638\n92639,92640\n92642,92643\n92644,483\n92646,298\n92647,485\n92648,1983\n92649,1983\n92650,298\n92651,485\n92652,868\n92653,92654\n92655,126\n92655,1392\n92655,17228\n92656,588\n92656,590\n92656,714\n92656,2008\n92656,7768\n92657,92658\n92659,92660\n92661,298\n92662,485\n92663,298\n92664,485\n92665,72\n92666,516\n92667,2779\n92668,72\n92669,92670\n92671,298\n92672,485\n92673,92674\n92675,72\n92676,151\n92677,1247\n92678,3447\n92679,298\n92680,485\n92681,92682\n92683,92682\n92684,92685\n92686,92687\n92688,779\n92689,557\n92690,72\n92692,376\n92693,21944\n92694,1132\n92695,781\n92696,72\n92697,72\n92699,92700\n92701,2775\n92702,447\n92703,1\n92705,92706\n92707,557\n92708,557\n92709,862\n92710,72\n92711,1432\n92712,72\n92713,72\n92714,298\n92715,485\n92716,72\n92717,72\n92718,557\n92719,72\n92720,557\n92721,92722\n92724,192\n92724,217\n92724,439\n92724,527\n92724,877\n92724,1844\n92724,5265\n92725,2617\n92726,72\n92727,72\n92728,622\n92730,298\n92731,485\n92732,779\n92733,302\n92734,92735\n92734,103949\n92734,124712\n92734,129415\n92734,141521\n92734,144581\n92734,149687\n92736,68069\n92737,72\n92738,433\n92739,68467\n92740,850\n92742,298\n92743,485\n92744,1858\n92744,14126\n92745,298\n92746,485\n92747,58\n92748,2979\n92749,818\n92750,602\n92751,72\n92753,602\n92754,92755\n92756,92757\n92758,195\n92759,72\n92760,72\n92761,439\n92763,72\n92764,92765\n92766,72\n92767,92768\n92769,1359\n92770,92771\n92772,72\n92773,92773\n92774,63\n92774,209\n92774,893\n92774,992\n92774,1579\n92774,1891\n92775,875\n92776,92777\n92778,92779\n92780,450\n92781,72\n92782,92783\n92784,8270\n92785,10\n92786,1544\n92792,620\n92792,8244\n92794,92795\n92796,92797\n92798,92799\n92800,1\n92801,195\n92802,21944\n92803,1238\n92805,178\n92807,92808\n92809,261\n92810,10\n92810,2574\n92810,3297\n92811,1776\n92812,178\n92813,292\n92814,294\n92815,296\n92816,298\n92817,1452\n92818,30\n92819,72\n92820,92821\n92822,92823\n92822,125712\n92824,872\n92825,175\n92827,298\n92828,2178\n92828,4545\n92829,366\n92830,366\n92831,366\n92832,366\n92833,233\n92834,92835\n92836,37\n92836,301\n92836,1293\n92836,1782\n92839,485\n92840,72\n92841,309\n92841,310\n92842,146\n92843,850\n92844,1782\n92845,355\n92846,893\n92847,147\n92848,7698\n92849,186\n92850,92851\n92852,994\n92853,48\n92854,1432\n92855,94\n92855,2787\n92856,14434\n92857,273\n92858,47\n92858,1381\n92858,2469\n92859,2083\n92860,211\n92861,1572\n92862,310\n92862,3039\n92863,875\n92864,92865\n92866,92866\n92868,893\n92869,1016\n92870,1531\n92872,420\n92873,626\n92874,760\n92874,1149\n92874,1631\n92875,671\n92877,1058\n92878,349\n92879,206\n92880,515\n92881,516\n92881,1243\n92881,206297\n92882,850\n92883,278\n92883,356\n92883,852\n92883,2699\n92883,5591\n92884,285\n92885,175\n92886,92887\n92888,92889\n92891,298\n92893,7\n92894,158\n92895,818\n92896,3447\n92897,406\n92898,3258\n92898,94409\n92899,422\n92900,92901\n92902,422\n92903,422\n92904,422\n92905,483\n92906,579\n92907,158\n92907,1805\n92908,1983\n92909,22\n92909,861\n92910,640\n92912,640\n92913,1033\n92914,2146\n92915,422\n92916,422\n92917,422\n92918,422\n92919,2286\n92920,422\n92921,422\n92922,283\n92922,634\n92922,781\n92922,1436\n92923,872\n92924,1132\n92925,781\n92927,50\n92928,225\n92929,72\n92930,344\n92931,285\n92932,852\n92933,422\n92934,22\n92934,178\n92934,1849\n92934,20535\n92935,68\n92935,186\n92935,264\n92935,301\n92935,1837\n92936,195\n92937,1267\n92939,1132\n92940,781\n92941,72\n92942,1983\n92943,175\n92943,4980\n92944,56\n92944,102\n92944,344\n92944,1001\n92944,1789\n92944,2205\n92944,2310\n92944,33424\n92946,1132\n92947,781\n92948,1305\n92949,932\n92950,72\n92952,500\n92953,366\n92954,72\n92955,1927\n92955,92956\n92955,119111\n92957,92956\n92958,92956\n92959,1033\n92960,827\n92961,92962\n92963,602\n92964,417\n92965,30\n92966,525\n92966,26306\n92967,35486\n92968,83\n92969,92969\n92970,202\n92970,203\n92972,1179\n92973,298\n92974,485\n92975,30\n92976,1130\n92977,1858\n92978,1860\n92979,140\n92979,577\n92979,1289\n92979,1474\n92979,7698\n92980,5405\n92981,72\n92982,30\n92983,1201\n92984,779\n92984,68069\n92985,211\n92986,358\n92987,1370\n92987,2782\n92988,356\n92989,217\n92990,1240\n92991,72\n92992,1608\n92993,8991\n92994,422\n92994,459\n92995,783\n92996,92997\n92998,92999\n93000,1146\n93000,1240\n93001,671\n93001,3999\n93001,4771\n93001,30331\n93002,862\n93003,392\n93004,178\n93005,934\n93006,779\n93007,2812\n93008,516\n93008,1243\n93008,3507\n93009,298\n93010,72\n93011,485\n93012,1556\n93013,1390\n93014,298\n93015,485\n93016,178\n93017,285\n93017,422\n93017,1381\n93017,139010\n93018,72\n93019,93020\n93022,1983\n93023,72\n93028,4771\n93029,760\n93031,167\n93033,1267\n93035,93036\n93039,1983\n93042,1118\n93044,48\n93044,2353\n93045,1983\n93047,136\n93048,1323\n93049,102\n93050,1326\n93051,408\n93054,240\n93055,93056\n93058,264\n93058,479\n93058,1147\n93059,30\n93060,68069\n93061,202\n93061,203\n93062,1419\n93064,72\n93065,1837\n93066,222\n93068,1132\n93069,781\n93070,1181\n93070,23783\n93071,1235\n93071,1335\n93071,1368\n93071,3207\n93075,809\n93076,72\n93077,1132\n93078,781\n93080,301\n93081,442\n93081,1078\n93081,1659\n93081,60576\n93084,862\n93085,134\n93085,138\n93085,1368\n93085,2105\n93086,72\n93087,93088\n93089,2923\n93089,3524\n93090,2353\n93091,1082\n93092,2646\n93093,167\n93096,1849\n93097,779\n93098,72\n93099,615\n93099,1564\n93100,30\n93101,72\n93102,93103\n93104,225\n93104,703\n93104,1688\n93105,9195\n93106,93107\n93108,72\n93109,596\n93111,72\n93112,483\n93113,22\n93113,175\n93113,207\n93113,240\n93113,287\n93113,326\n93113,392\n93113,397\n93113,433\n93113,446\n93113,693\n93113,702\n93113,752\n93113,818\n93113,873\n93113,874\n93113,1634\n93113,5667\n93114,15\n93115,30\n93116,247\n93118,439\n93119,130\n93119,795\n93119,861\n93119,1149\n93119,1531\n93119,1782\n93119,4355\n93119,21982\n93120,93121\n93122,310\n93122,3039\n93123,5547\n93124,3\n93125,779\n93125,68069\n93125,141912\n93126,1722\n93127,3260\n93128,88820\n93129,72\n93130,79\n93132,3\n93133,1392\n93133,1745\n93134,1882\n93135,2353\n93137,602\n93138,779\n93138,68069\n93139,93140\n93141,296\n93142,1359\n93143,104\n93143,338\n93143,360\n93143,462\n93143,835\n93143,3695\n93143,4039\n93143,21408\n93144,30\n93145,146\n93147,861\n93148,1359\n93149,7698\n93150,843\n93151,72\n93152,726\n93153,843\n93154,811\n93155,1893\n93156,140\n93156,1285\n93156,3585\n93156,6263\n93157,22\n93157,861\n93158,222\n93159,30\n93160,862\n93161,483\n93162,298\n93163,485\n93164,779\n93164,68069\n93166,72\n93167,333\n93168,1415\n93169,72\n93170,146\n93172,779\n93173,30\n93173,200\n93173,772\n93173,28203\n93174,147\n93174,158\n93174,1181\n93175,772\n93176,30\n93178,4355\n93179,72\n93180,30\n93181,149\n93182,302\n93183,72\n93184,6955\n93185,1274\n93186,83\n93186,304\n93187,422\n93189,72\n93190,72\n93191,72\n93192,30\n93193,392\n93194,72\n93195,779\n93196,93197\n93198,30\n93199,192\n93199,314\n93199,920\n93200,30\n93201,30\n93202,93203\n93204,72\n93205,72\n93206,733\n93206,1082\n93207,251\n93207,44725\n93208,175\n93209,30\n93210,298\n93211,3193\n93212,72\n93213,72\n93214,344\n93215,285\n93216,298\n93217,485\n93218,298\n93219,485\n93220,30\n93221,68069\n93222,72\n93223,93224\n93225,30\n93226,6789\n93227,178\n93228,72\n93229,28130\n93230,252\n93231,93232\n93233,852\n93234,167\n93235,687\n93235,1556\n93235,6303\n93236,3507\n93237,312\n93238,72\n93239,663\n93239,779\n93240,298\n93241,485\n93242,376\n93243,93244\n93245,93246\n93247,83\n93248,3623\n93249,536\n93250,93251\n93252,254\n93252,503\n93252,704\n93253,298\n93254,485\n93255,72\n93256,344\n93257,285\n93258,592\n93259,1467\n93260,450\n93261,72\n93262,455\n93264,392\n93264,697\n93265,2424\n93266,298\n93267,485\n93269,30\n93270,1871\n93271,2421\n93272,72\n93273,298\n93274,485\n93275,30\n93276,2421\n93277,83\n93278,13980\n93279,2421\n93280,72\n93281,72\n93283,10\n93284,852\n93285,136\n93285,252\n93285,272\n93285,333\n93285,435\n93285,516\n93285,1033\n93285,1370\n93285,1893\n93285,4545\n93285,139010\n93285,240174\n93286,602\n93287,68069\n93288,298\n93289,485\n93290,779\n93290,68069\n93291,93292\n93293,93294\n93295,30\n93296,8373\n93297,298\n93298,485\n93299,72\n93300,1837\n93301,602\n93302,72\n93303,72\n93304,83\n93305,22\n93306,2319\n93307,298\n93308,485\n93309,450\n93310,10\n93311,251\n93311,516\n93311,1243\n93311,93311\n93311,189788\n93311,189794\n93311,234695\n93312,72\n93313,1635\n93314,920\n93315,1\n93316,72\n93317,557\n93318,920\n93320,6789\n93321,93322\n93323,93322\n93324,4611\n93325,557\n93326,557\n93328,358\n93329,1143\n93330,1927\n93331,99\n93331,68069\n93332,422\n93333,56\n93334,29380\n93335,72\n93336,72\n93337,72\n93338,408\n93338,3769\n93339,3447\n93340,93341\n93342,72\n93343,93322\n93344,72\n93345,4611\n93346,2379\n93347,72\n93348,298\n93349,485\n93350,72\n93351,1983\n93352,8855\n93353,6682\n93354,4980\n93355,6726\n93356,298\n93357,485\n93358,93359\n93360,72\n93361,602\n93362,298\n93363,485\n93364,130\n93366,10\n93367,602\n93369,671\n93370,93371\n93372,450\n93373,872\n93375,477\n93377,298\n93378,485\n93379,93380\n93381,126\n93382,93383\n93384,577\n93385,1858\n93386,1860\n93387,22\n93388,450\n93389,93390\n93389,97859\n93391,298\n93392,485\n93393,1608\n93394,93395\n93396,602\n93397,202\n93397,203\n93399,240\n93400,1117\n93402,93403\n93404,481\n93405,1983\n93406,255\n93409,72\n93410,1132\n93411,781\n93412,104\n93412,134\n93412,135\n93412,136\n93412,137\n93412,138\n93412,557\n93412,850\n93412,1368\n93412,2105\n93413,93414\n93415,2590\n93416,93417\n93420,3370\n93420,14453\n93421,163\n93422,93423\n93424,1983\n93426,1\n93427,207\n93428,34\n93428,35\n93429,104\n93430,30\n93431,93432\n93433,1001\n93434,93435\n93436,107\n93437,93438\n93439,93440\n93439,99637\n93439,100406\n93439,115532\n93439,117371\n93439,123787\n93439,124728\n93439,149399\n93439,153518\n93439,168767\n93439,238928\n93439,239026\n93439,242969\n93441,872\n93442,1429\n93443,4771\n93444,668\n93445,93446\n93447,93448\n93449,15748\n93450,93451\n93452,93451\n93453,93451\n93454,93455\n93456,872\n93457,2867\n93457,2868\n93459,93460\n93461,872\n93462,346\n93463,640\n93464,676\n93466,296\n93467,422\n93468,56\n93469,93470\n93471,233\n93472,93473\n93474,93474\n93476,1143\n93478,10\n93478,113156\n93479,93480\n93481,704\n93482,1707\n93483,1977\n93483,1978\n93484,3413\n93485,9457\n93486,171\n93487,346\n93489,149\n93490,30\n93491,1132\n93492,781\n93493,171\n93494,171\n93495,2353\n93496,1359\n93497,355\n93498,577\n93500,119\n93500,577\n93500,1400\n93500,21944\n93501,1983\n93502,93503\n93504,207\n93505,41\n93506,247\n93507,1240\n93508,175\n93510,1776\n93511,298\n93512,217\n93513,9010\n93514,697\n93515,106\n93516,408\n93517,911\n93518,147\n93520,931\n93522,640\n93523,640\n93524,671\n93525,640\n93526,75912\n93527,178\n93527,211\n93528,2775\n93529,1983\n93530,931\n93531,8270\n93532,93532\n93534,920\n93535,406\n93535,1181\n93538,422\n93539,406\n93539,602\n93540,477\n93543,422\n93544,422\n93545,422\n93546,422\n93547,160\n93548,422\n93549,2506\n93550,422\n93551,422\n93552,422\n93553,93554\n93555,93554\n93557,1805\n93558,81\n93559,93560\n93561,93560\n93562,1247\n93562,164572\n93563,1580\n93564,2506\n93565,1634\n93567,1140\n93568,2506\n93570,93571\n93572,805\n93573,1033\n93574,72\n93575,30\n93577,957\n93577,1247\n93577,1815\n93577,164572\n93578,151\n93579,932\n93580,83\n93581,171\n93582,586\n93583,19010\n93584,255\n93585,255\n93586,273\n93586,313\n93587,1608\n93588,34\n93588,35\n93588,167\n93588,283\n93588,289\n93588,290\n93588,631\n93588,760\n93588,1149\n93588,1181\n93588,1240\n93588,1282\n93588,1631\n93588,2266\n93588,3507\n93588,94134\n93589,151\n93590,167\n93590,2979\n93591,30\n93592,1326\n93593,23783\n93594,483\n93595,93596\n93598,79\n93599,1010\n93599,1849\n93600,287\n93600,393\n93600,447\n93600,516\n93600,980\n93600,1612\n93600,15573\n93601,720\n93603,2867\n93603,2868\n93604,10\n93607,1284\n93610,175\n93611,160\n93612,298\n93614,809\n93615,907\n93615,2191\n93616,360\n93616,628\n93616,1147\n93616,1149\n93616,4823\n93617,615\n93617,7698\n93618,2775\n93619,356\n93620,79\n93620,1181\n93621,2436\n93622,602\n93623,991\n93623,1749\n93624,1284\n93625,1858\n93626,1860\n93627,30\n93628,500\n93629,302\n93630,2506\n93632,602\n93633,104\n93633,217\n93633,346\n93634,602\n93635,79\n93636,222\n93636,657\n93636,1467\n93636,2266\n93636,2421\n93636,6424\n93637,602\n93638,393\n93638,450\n93638,671\n93638,893\n93638,1012\n93638,1243\n93638,1294\n93638,1309\n93638,15573\n93639,93640\n93641,602\n93642,217\n93643,356\n93643,843\n93643,1432\n93644,209\n93645,356\n93645,843\n93645,1432\n93646,1390\n93647,1127\n93648,1163\n93649,147\n93649,158\n93649,1803\n93650,158\n93652,1580\n93654,93655\n93656,477\n93657,1132\n93658,781\n93660,1132\n93661,781\n93662,1417\n93663,1267\n93664,602\n93665,356\n93666,356\n93667,1400\n93668,1132\n93669,781\n93670,408\n93672,137\n93672,586\n93672,2574\n93672,4039\n93673,6661\n93674,563\n93674,2867\n93674,2868\n93675,1220\n93675,1222\n93676,252\n93677,251\n93678,2506\n93680,13538\n93681,1132\n93682,781\n93683,1462\n93683,8537\n93684,1240\n93684,1454\n93685,1181\n93686,93687\n93688,934\n93689,640\n93690,209\n93691,34\n93691,35\n93691,68\n93691,1085\n93691,185877\n93692,525\n93692,973\n93692,4146\n93694,779\n93694,68069\n93695,509\n93696,240\n93697,93698\n93699,2506\n93700,1132\n93701,781\n93702,366\n93705,30\n93706,1849\n93708,200\n93709,302\n93709,579\n93709,861\n93709,893\n93710,1381\n93711,535\n93711,1014\n93711,1118\n93712,1132\n93713,781\n93714,1118\n93714,6695\n93715,779\n93717,972\n93718,676\n93718,1566\n93721,467\n93721,868\n93721,1745\n93722,93723\n93724,302\n93724,579\n93725,147\n93725,1803\n93726,602\n93727,392\n93728,30\n93728,571\n93728,622\n93728,868\n93729,30\n93729,28203\n93731,1374\n93732,240\n93733,875\n93734,93735\n93737,2146\n93738,302\n93740,4222\n93742,1677\n93744,298\n93745,485\n93746,1392\n93748,424\n93749,171\n93750,93751\n93752,1085\n93752,1118\n93752,6695\n93752,75912\n93753,209\n93755,1012\n93755,1309\n93755,1983\n93756,452\n93756,535\n93756,918\n93756,1655\n93757,4039\n93758,577\n93758,868\n93759,192\n93761,93762\n93764,3\n93766,849\n93766,1844\n93768,19\n93768,278\n93768,283\n93768,356\n93768,1571\n93768,1871\n93768,2421\n93768,5326\n93768,6068\n93768,19443\n93769,1580\n93771,1118\n93772,93773\n93775,178\n93776,5405\n93777,920\n93778,192\n93778,452\n93778,516\n93778,685\n93778,849\n93778,1370\n93778,30331\n93778,207659\n93779,1203\n93780,192\n93781,147\n93781,158\n93781,406\n93783,30\n93784,68069\n93785,68069\n93786,749\n93787,1001\n93788,68069\n93789,68069\n93790,146\n93790,2274\n93790,92476\n93791,3258\n93792,202\n93792,203\n93793,6638\n93794,406\n93795,171\n93796,93797\n93799,1454\n93800,1707\n93801,1140\n93801,5547\n93802,4504\n93803,184\n93803,779\n93804,713\n93805,3\n93806,438\n93807,2995\n93808,3161\n93809,34\n93809,35\n93810,3895\n93811,158\n93812,151\n93813,68069\n93813,141912\n93814,875\n93815,175\n93816,298\n93817,1220\n93817,1222\n93818,93819\n93820,392\n93821,920\n93822,726\n93823,577\n93824,636\n93825,72\n93826,310\n93828,1010\n93830,178\n93831,2274\n93832,809\n93833,406\n93835,167\n93835,2083\n93836,4637\n93837,4637\n93838,252\n93840,195\n93840,19005\n93841,1983\n93842,1179\n93843,657\n93845,1370\n93846,602\n93847,602\n93848,3623\n93849,1983\n93850,1085\n93851,557\n93852,920\n93853,10\n93853,113156\n93854,602\n93856,875\n93857,222\n93858,483\n93859,602\n93860,22\n93860,332\n93860,1776\n93860,21442\n93861,1132\n93862,781\n93863,346\n93865,376\n93866,602\n93867,93868\n93869,358\n93870,93871\n93872,93873\n93874,93873\n93875,93873\n93877,1132\n93878,781\n93879,93879\n93880,269\n93881,140\n93882,267\n93883,1\n93884,147\n93884,1803\n93885,93886\n93887,178\n93888,1133\n93889,861\n93890,10\n93892,2116\n93893,93894\n93895,93896\n93897,1177\n93897,2210\n93899,1140\n93899,1151\n93900,30\n93901,557\n93902,557\n93903,1016\n93903,2210\n93904,93905\n93906,577\n93907,439\n93908,2367\n93909,1983\n93910,255\n93911,93912\n93914,206\n93914,1181\n93915,93916\n93918,2506\n93919,1224\n93920,138\n93923,602\n93924,93925\n93926,206\n93927,577\n93928,93929\n93930,1388\n93931,1370\n93931,1821\n93932,30\n93933,287\n93934,931\n93935,2590\n93936,516\n93937,305\n93938,93939\n93940,1127\n93941,250\n93941,1684\n93942,207\n93943,50\n93944,631\n93944,2083\n93945,250\n93945,1684\n93946,93947\n93948,1807\n93950,83\n93951,93952\n93953,2617\n93953,93954\n93953,108419\n93955,602\n93956,1818\n93957,872\n93958,1429\n93959,240\n93959,1285\n93960,4101\n93961,5405\n93962,215\n93963,435\n93964,1012\n93965,668\n93966,323\n93967,346\n93968,859\n93969,2668\n93970,41\n93971,1634\n93972,93973\n93975,5547\n93976,602\n93977,602\n93978,602\n93979,602\n93980,602\n93981,602\n93982,602\n93983,481\n93984,602\n93985,1143\n93986,718\n93987,861\n93988,1983\n93989,90481\n93990,7\n93990,211\n93991,93992\n93993,93994\n93995,247\n93996,602\n93997,72\n93998,252\n93999,158\n94000,2351\n94002,72\n94003,332\n94004,801\n94006,97\n94008,323\n94009,872\n94010,366\n94011,3297\n94012,31977\n94013,1181\n94014,63\n94015,94016\n94017,94018\n94017,206827\n94019,1085\n94020,704\n94021,704\n94022,366\n94023,366\n94024,366\n94025,366\n94026,48\n94027,94028\n94030,94031\n94032,233\n94033,1424\n94034,94035\n94036,149\n94037,106\n94038,94039\n94040,94039\n94041,94039\n94042,94039\n94043,344\n94044,160\n94045,344\n94047,163\n94048,2867\n94048,2868\n94049,422\n94050,56\n94051,355\n94052,206\n94052,577\n94053,195\n94054,1983\n94055,1132\n94056,781\n94057,1132\n94058,781\n94059,310\n94060,1132\n94061,781\n94062,192\n94064,389\n94064,660\n94064,6556\n94064,19443\n94065,392\n94066,372\n94067,1132\n94068,781\n94069,1566\n94070,1776\n94071,94072\n94073,393\n94075,21944\n94076,3258\n94077,217\n94077,457\n94077,818\n94077,872\n94077,1417\n94078,151\n94079,663\n94079,664\n94079,2178\n94079,4545\n94080,640\n94081,640\n94082,2674\n94083,640\n94084,1132\n94085,781\n94086,1033\n94087,167\n94088,298\n94089,485\n94090,171\n94091,37414\n94093,356\n94094,422\n94095,920\n94095,1619\n94096,422\n94097,760\n94098,422\n94099,422\n94100,827\n94101,762\n94102,422\n94103,422\n94104,422\n94105,422\n94106,422\n94107,1860\n94108,3612\n94109,595\n94110,2274\n94111,392\n94112,4760\n94113,6059\n94114,5658\n94115,4252\n94116,623\n94117,697\n94118,6955\n94119,422\n94120,422\n94122,704\n94123,20\n94123,287\n94124,850\n94125,30\n94126,285\n94126,3585\n94128,875\n94130,30331\n94132,980\n94133,10\n94134,289\n94134,290\n94134,304\n94134,372\n94134,704\n94134,714\n94134,1402\n94134,1608\n94134,2008\n94134,2205\n94134,2286\n94134,2315\n94134,33424\n94134,144988\n94135,94136\n94138,355\n94138,991\n94139,1939\n94140,94141\n94142,94141\n94142,155946\n94143,44\n94144,158\n94145,818\n94146,3069\n94147,2775\n94148,94149\n94150,1466\n94151,1204\n94151,1663\n94151,127158\n94152,2205\n94152,33424\n94153,7092\n94154,664\n94154,20359\n94155,1082\n94155,1085\n94157,953\n94158,602\n94158,5213\n94160,83\n94161,809\n94162,1058\n94163,1274\n94164,94165\n94166,94165\n94167,457\n94168,932\n94169,79\n94169,1512\n94169,5992\n94169,189788\n94169,189794\n94169,189842\n94169,223738\n94170,873\n94171,515\n94172,515\n94173,366\n94174,358\n94174,510\n94176,207\n94176,1058\n94176,1151\n94176,1556\n94177,1132\n94178,781\n94179,1240\n94180,422\n94181,56\n94182,1564\n94183,68069\n94185,366\n94186,1220\n94186,1222\n94187,252\n94188,251\n94189,30\n94190,147\n94190,149\n94190,2244\n94190,21826\n94191,392\n94192,2775\n94193,447\n94194,920\n94195,852\n94195,1274\n94195,1571\n94195,2944\n94195,18831\n94196,272\n94197,30\n94198,2424\n94199,602\n94200,602\n94201,1983\n94203,68069\n94204,94205\n94206,195\n94206,652\n94206,794\n94207,366\n94208,602\n94210,187\n94211,2436\n94211,3474\n94212,94213\n94214,868\n94215,94216\n94217,422\n94218,72\n94219,875\n94220,358\n94221,1019\n94222,392\n94222,697\n94223,87\n94223,1363\n94224,209\n94226,1390\n94227,809\n94229,2266\n94230,10\n94231,149\n94232,5405\n94233,20\n94234,1983\n94235,1983\n94236,602\n94237,1425\n94239,3252\n94240,209\n94241,861\n94243,195\n94244,4980\n94245,6726\n94247,44725\n94248,385\n94248,32751\n94249,126\n94249,467\n94249,868\n94250,366\n94251,68\n94251,119\n94252,809\n94253,1087\n94254,30331\n94255,3422\n94256,77\n94256,557\n94257,310\n94257,3039\n94257,21944\n94258,3\n94258,34\n94258,35\n94258,106\n94258,178\n94258,192\n94258,202\n94258,203\n94258,217\n94258,251\n94258,252\n94258,337\n94258,346\n94258,435\n94258,516\n94258,586\n94258,663\n94258,664\n94258,1175\n94258,1181\n94258,1220\n94258,1222\n94258,1243\n94258,1294\n94258,1370\n94258,1590\n94258,1635\n94258,2567\n94258,3161\n94258,5976\n94258,6119\n94258,16201\n94259,22580\n94260,602\n94261,366\n94262,704\n94262,1140\n94262,5547\n94263,30\n94264,2867\n94264,2868\n94265,94266\n94267,247\n94268,94269\n94270,273\n94271,356\n94272,94273\n94274,602\n94275,30\n94277,422\n94278,56\n94280,1381\n94282,1572\n94283,703\n94285,344\n94286,171\n94287,1070\n94288,304\n94288,4455\n94289,862\n94290,557\n94291,1877\n94293,697\n94294,1240\n94295,68467\n94296,805\n94297,99\n94298,949\n94299,34\n94299,35\n94299,313\n94299,697\n94299,7698\n94300,366\n94300,500\n94302,420\n94303,602\n94305,349\n94306,1068\n94307,1007\n94308,852\n94310,602\n94311,1146\n94313,5405\n94314,422\n94316,740\n94316,741\n94317,200\n94317,328\n94317,772\n94317,4936\n94318,22\n94319,192\n94319,195\n94319,200\n94319,278\n94319,285\n94319,372\n94319,392\n94319,406\n94319,640\n94319,694\n94319,779\n94319,843\n94319,1010\n94319,1175\n94319,1181\n94319,1298\n94319,1515\n94319,1955\n94319,2210\n94319,2286\n94319,2416\n94319,2417\n94319,3585\n94319,3804\n94319,4237\n94319,5874\n94319,6119\n94320,850\n94321,1033\n94322,58\n94323,46\n94324,75912\n94326,94327\n94326,100224\n94328,3\n94329,5547\n94330,450\n94332,68069\n94333,346\n94334,666\n94334,991\n94334,1052\n94334,1127\n94334,1749\n94334,3585\n94334,5130\n94334,6695\n94334,49057\n94335,717\n94336,818\n94336,1118\n94336,127158\n94337,1836\n94339,195\n94340,54\n94341,1127\n94342,222\n94343,94344\n94345,94346\n94347,298\n94348,485\n94349,94350\n94351,22293\n94352,68\n94353,1515\n94354,175\n94355,1939\n94356,298\n94357,68\n94357,852\n94358,184\n94359,4672\n94360,79\n94360,203\n94360,333\n94360,1181\n94361,1140\n94362,872\n94363,9560\n94364,376\n94365,2646\n94365,3623\n94366,516\n94367,1580\n94368,581\n94369,862\n94369,2590\n94370,1133\n94371,72\n94372,3069\n94373,392\n94374,94375\n94376,7652\n94377,3\n94378,920\n94379,2867\n94379,2868\n94380,1858\n94381,483\n94382,68069\n94383,779\n94384,7\n94385,83\n94386,1449\n94387,258\n94388,2837\n94389,4748\n94390,151\n94391,1132\n94392,781\n94393,1983\n94394,579\n94395,861\n94396,602\n94397,289\n94397,290\n94398,30\n94399,1556\n94400,302\n94401,5708\n94402,611\n94403,7117\n94404,251\n94405,859\n94406,1849\n94407,72\n94408,94409\n94409,2244\n94409,15795\n94409,25348\n94409,45225\n94409,79559\n94409,80277\n94409,82103\n94409,94408\n94409,94409\n94409,95508\n94409,95511\n94409,95512\n94409,95518\n94409,95526\n94409,99500\n94409,100326\n94409,103800\n94409,104951\n94409,106347\n94410,72\n94411,366\n94412,406\n94413,72\n94414,72\n94415,406\n94416,94417\n94418,72\n94419,346\n94420,10\n94421,30\n94422,252\n94422,1220\n94422,1222\n94423,72\n94424,30\n94425,885\n94426,1805\n94427,1370\n94428,72\n94429,1\n94430,1368\n94431,1016\n94431,2210\n94431,4237\n94432,72\n94433,94434\n94435,280\n94435,932\n94435,1177\n94435,3148\n94435,17245\n94439,557\n94440,557\n94441,72\n94442,346\n94443,94444\n94445,72\n94446,298\n94447,485\n94448,94449\n94450,37\n94451,393\n94452,1745\n94454,79\n94455,611\n94456,48\n94456,980\n94457,94458\n94459,273\n94461,7117\n94462,72\n94463,1556\n94465,48\n94466,392\n94467,818\n94468,3\n94469,310\n94471,346\n94472,94473\n94472,118574\n94472,240536\n94474,94475\n94476,264\n94476,15573\n94477,72\n94478,1556\n94479,435\n94480,30\n94481,72\n94482,450\n94483,30\n94484,94485\n94486,94485\n94487,3321\n94488,809\n94489,72\n94490,72\n94491,302\n94492,602\n94493,217\n94494,72\n94495,843\n94496,72\n94497,450\n94498,991\n94499,356\n94500,94501\n94502,14989\n94503,1118\n94504,72\n94506,72\n94507,72\n94508,267\n94509,72\n94511,602\n94512,158\n94513,72\n94514,72\n94515,149\n94517,72\n94518,94519\n94520,602\n94521,72\n94522,118\n94522,4597\n94523,72\n94524,94525\n94527,1860\n94528,3612\n94529,595\n94530,2274\n94531,392\n94532,4760\n94533,6059\n94534,5658\n94535,4252\n94536,623\n94537,697\n94538,6955\n94539,72\n94540,72\n94541,72\n94542,72\n94543,175\n94543,94544\n94543,172484\n94543,205752\n94545,72\n94546,72\n94547,72\n94548,72\n94549,72\n94550,72\n94551,72\n94552,94553\n94555,72\n94556,72\n94557,6068\n94558,72\n94559,72\n94560,2931\n94561,1688\n94563,72\n94564,72\n94565,4903\n94567,72\n94568,72\n94569,18726\n94570,126\n94570,256\n94570,435\n94570,668\n94570,1191\n94570,1192\n94570,2373\n94570,7316\n94570,13136\n94571,50\n94571,79\n94571,393\n94571,406\n94571,493\n94571,585\n94571,586\n94571,592\n94571,704\n94572,163\n94574,252\n94575,72\n94576,72\n94579,50\n94580,3345\n94582,72\n94583,346\n94584,72\n94585,267\n94586,72\n94587,72\n94588,72\n94589,94590\n94591,481\n94592,94593\n94594,94595\n94596,72\n94598,94599\n94598,155696\n94600,72\n94601,72\n94602,104\n94603,206\n94603,932\n94603,6323\n94603,8270\n94604,1001\n94605,72\n94606,94607\n94608,72\n94610,7\n94611,1608\n94612,3209\n94613,346\n94614,967\n94615,10\n94616,1238\n94617,94618\n94619,1452\n94620,72\n94621,72\n94622,2867\n94622,2868\n94623,94624\n94626,602\n94627,68069\n94629,4192\n94629,4193\n94630,304\n94631,323\n94632,94633\n94634,94635\n94636,589\n94636,1001\n94637,94638\n94639,862\n94640,875\n94642,72\n94643,72\n94644,94645\n94646,515\n94647,255\n94648,72\n94649,72\n94650,72\n94651,30\n94652,366\n94653,366\n94654,366\n94655,366\n94656,366\n94657,94658\n94657,110495\n94657,124068\n94657,127566\n94659,366\n94660,366\n94661,72\n94662,366\n94663,483\n94665,298\n94666,485\n94667,3069\n94668,72\n94669,94670\n94671,163\n94672,48\n94673,48\n94674,48\n94675,48\n94676,48\n94677,30\n94678,104\n94678,94679\n94678,106437\n94678,116889\n94678,120425\n94680,811\n94681,1274\n94682,79\n94682,24500\n94683,94684\n94685,233\n94686,211\n94687,94688\n94689,94690\n94691,94692\n94693,693\n94694,994\n94695,3\n94696,72\n94697,48\n94697,58\n94697,130\n94697,146\n94697,151\n94697,158\n94697,200\n94697,269\n94697,306\n94697,307\n94697,309\n94697,310\n94697,313\n94697,349\n94697,364\n94697,439\n94697,589\n94697,660\n94697,736\n94697,749\n94697,760\n94697,862\n94697,934\n94697,992\n94697,994\n94697,1033\n94697,1113\n94697,1151\n94697,1293\n94697,1298\n94697,1345\n94697,1368\n94697,1417\n94697,1556\n94697,1860\n94697,1973\n94697,2205\n94697,2260\n94697,2812\n94697,3218\n94697,4903\n94697,30331\n94697,33424\n94697,90845\n94697,92476\n94697,162599\n94697,227061\n94697,245910\n94698,422\n94699,72\n94700,163\n94701,392\n94702,1181\n94704,346\n94706,510\n94707,298\n94708,485\n94709,1132\n94710,781\n94711,72\n94712,2286\n94713,72\n94714,72\n94715,344\n94716,285\n94717,2116\n94718,72\n94719,94720\n94721,72\n94723,13137\n94724,1235\n94724,1335\n94725,72\n94727,72\n94728,72\n94729,385\n94731,72\n94732,3003\n94733,94734\n94735,1132\n94736,781\n94737,355\n94738,1381\n94739,736\n94740,972\n94742,390\n94743,72\n94744,388\n94745,167\n94745,2083\n94746,781\n94747,1118\n94748,94749\n94750,1033\n94751,602\n94752,503\n94752,577\n94752,949\n94754,72\n94755,30\n94756,215\n94757,2775\n94758,447\n94759,577\n94760,640\n94761,118\n94761,668\n94761,1070\n94761,4597\n94762,175\n94763,298\n94764,485\n94765,298\n94766,1220\n94766,1222\n94767,493\n94768,202\n94768,203\n94769,252\n94770,1512\n94770,5992\n94772,1240\n94773,682\n94773,72439\n94774,106\n94775,1243\n94777,72\n94779,104\n94779,1659\n94780,72\n94781,1052\n94782,3069\n94783,422\n94784,333\n94785,422\n94786,422\n94787,422\n94788,422\n94789,422\n94790,1188\n94791,422\n94792,20\n94793,422\n94794,1458\n94795,422\n94796,422\n94797,94798\n94799,717\n94800,287\n94801,503\n94801,6661\n94802,94803\n94804,94803\n94805,175\n94806,118\n94806,4597\n94807,298\n94808,136\n94808,2379\n94808,5405\n94809,344\n94810,2334\n94811,9560\n94812,298\n94813,485\n94814,760\n94815,94816\n94818,783\n94819,1201\n94820,44\n94821,712\n94822,2775\n94823,356\n94826,676\n94827,1531\n94828,340\n94829,1243\n94830,1415\n94831,1531\n94832,30\n94833,30\n94834,11\n94834,178\n94834,211\n94834,305\n94834,309\n94834,310\n94834,333\n94834,422\n94834,452\n94834,527\n94834,579\n94834,622\n94834,698\n94834,718\n94834,740\n94834,741\n94834,750\n94834,762\n94834,1117\n94834,1181\n94834,1392\n94834,1417\n94834,1740\n94834,1782\n94834,1891\n94834,3367\n94834,5718\n94834,6303\n94834,14183\n94834,37414\n94835,1118\n94836,1707\n94837,30\n94838,83\n94839,356\n94840,94841\n94842,1118\n94842,6695\n94845,567\n94845,750\n94845,762\n94845,968\n94845,1293\n94846,586\n94847,8992\n94848,2995\n94849,58\n94850,46\n94851,75912\n94853,9010\n94854,626\n94854,1381\n94855,932\n94856,68069\n94857,298\n94858,485\n94859,68069\n94859,141912\n94860,298\n94861,485\n94862,167\n94863,20\n94863,694\n94863,717\n94863,872\n94864,3804\n94865,151\n94865,577\n94865,1400\n94866,22\n94867,94868\n94869,328\n94871,147\n94871,158\n94871,1515\n94872,868\n94874,424\n94875,347\n94875,873\n94877,163\n94877,818\n94878,1390\n94879,94880\n94881,467\n94881,934\n94881,1370\n94882,186\n94883,310\n94884,6051\n94885,1140\n94885,5547\n94886,195\n94887,192\n94888,298\n94889,485\n94891,1220\n94891,1222\n94892,94893\n94894,850\n94895,3872\n94896,22\n94898,147\n94898,1803\n94899,66\n94899,252\n94900,2784\n94900,7698\n94902,68069\n94903,1556\n94904,252\n94904,1220\n94904,1222\n94905,1151\n94906,63\n94906,251\n94906,435\n94906,516\n94906,1243\n94906,1844\n94907,2775\n94908,447\n94909,49887\n94910,673\n94911,3115\n94913,30418\n94914,1531\n94914,4545\n94914,139010\n94915,273\n94916,1707\n94916,31976\n94917,302\n94917,861\n94917,1556\n94918,72\n94919,175\n94920,31934\n94921,298\n94922,72\n94923,344\n94924,285\n94926,479\n94927,893\n94928,79\n94929,1881\n94930,323\n94931,252\n94932,390\n94932,592\n94932,675\n94932,918\n94932,1010\n94932,1140\n94933,68069\n94934,5976\n94935,779\n94935,68069\n94937,215\n94937,503\n94937,1212\n94937,1282\n94937,1392\n94938,167\n94938,301\n94939,3507\n94939,204124\n94940,240\n94940,1285\n94941,3069\n94943,79\n94943,422\n94944,1688\n94945,1118\n94947,94948\n94949,44725\n94950,467\n94950,868\n94951,312\n94951,1151\n94952,278\n94952,577\n94954,346\n94956,79\n94957,406\n94958,673\n94958,1130\n94958,2373\n94959,171\n94960,346\n94962,178\n94963,1043\n94964,1707\n94966,4672\n94967,349\n94968,326\n94969,994\n94970,107\n94971,298\n94972,485\n94973,94974\n94975,6506\n94976,251\n94977,275\n94978,167\n94978,2083\n94979,2421\n94980,1294\n94981,30\n94982,252\n94983,94984\n94983,123475\n94985,346\n94986,301\n94986,406\n94987,302\n94988,10\n94988,2146\n94989,736\n94990,151\n94991,1707\n94993,1465\n94994,346\n94995,893\n94995,980\n94996,2116\n94997,567\n94998,1454\n94999,1323\n95000,102\n95001,1326\n95002,408\n95003,68069\n95004,30\n95005,20\n95006,589\n95008,385\n95010,973\n95011,850\n95013,1531\n95014,1118\n95015,644\n95016,200\n95016,586\n95016,772\n95016,1033\n95016,1332\n95017,7652\n95018,175\n95019,298\n95020,920\n95021,302\n95022,30\n95023,95024\n95025,292\n95026,21944\n95026,31206\n95027,1551\n95028,980\n95029,676\n95030,217\n95030,1417\n95031,479\n95032,95033\n95034,5547\n95035,72\n95036,8308\n95037,72\n95038,346\n95039,1465\n95040,406\n95042,30\n95042,1179\n95043,240\n95044,79\n95045,95046\n95047,861\n95048,1635\n95049,1392\n95049,1796\n95049,3804\n95050,68069\n95051,1381\n95051,1551\n95052,422\n95053,56\n95054,957\n95054,1815\n95054,1871\n95055,302\n95055,579\n95055,159365\n95056,827\n95057,207\n95058,671\n95059,536\n95061,30\n95062,10\n95064,818\n95065,949\n95066,809\n95067,310\n95068,3069\n95069,1454\n95070,72\n95071,298\n95072,485\n95073,2460\n95074,95075\n95076,861\n95077,8270\n95078,30\n95079,623\n95080,3538\n95081,1509\n95082,28072\n95083,30\n95084,1836\n95085,30\n95086,298\n95087,485\n95088,95089\n95090,6726\n95091,376\n95092,104\n95092,557\n95092,953\n95093,1133\n95094,644\n95095,1644\n95096,158\n95097,83\n95100,158\n95101,30\n95102,736\n95103,485\n95104,907\n95105,310\n95107,503\n95107,2620\n95107,4771\n95108,420\n95109,392\n95110,1707\n95111,932\n95111,1298\n95112,233\n95113,920\n95114,136\n95114,5405\n95115,72\n95116,171\n95118,972\n95118,973\n95118,1284\n95119,225\n95120,10\n95121,72\n95122,346\n95123,95124\n95125,376\n95126,885\n95127,3447\n95128,1983\n95130,83\n95131,72\n95132,8822\n95133,202\n95133,203\n95134,2424\n95136,1116\n95137,483\n95138,346\n95139,95140\n95139,253841\n95142,557\n95143,557\n95144,95145\n95146,95147\n95148,1133\n95149,68069\n95150,1133\n95151,346\n95152,5\n95152,741\n95152,776\n95152,3847\n95152,6226\n95152,9526\n95152,14316\n95152,21389\n95152,33292\n95152,34988\n95152,54742\n95152,56400\n95152,71944\n95152,106726\n95152,114542\n95152,148738\n95152,152892\n95152,154710\n95152,176340\n95152,181787\n95152,186301\n95152,195680\n95152,222578\n95152,224469\n95152,233311\n95153,1634\n95154,779\n95154,68069\n95155,1359\n95156,2617\n95157,95158\n95159,2704\n95160,41\n95161,493\n95162,781\n95163,1132\n95164,95165\n95166,178\n95167,29380\n95168,72\n95169,163\n95170,602\n95173,2506\n95174,4594\n95175,95176\n95177,628\n95178,4192\n95178,4193\n95178,5265\n95179,2351\n95180,500\n95181,1962\n95182,1052\n95183,1882\n95184,2775\n95185,54\n95186,30\n95188,72\n95189,95190\n95191,2319\n95192,1556\n95193,72\n95194,1381\n95195,41\n95195,1368\n95196,72\n95197,95198\n95199,95200\n95201,2367\n95202,346\n95203,58\n95204,46\n95205,75912\n95206,140\n95206,95207\n95208,21944\n95209,95209\n95210,422\n95211,56\n95212,95213\n95215,644\n95216,406\n95217,95218\n95219,1\n95220,250\n95220,1684\n95221,72\n95223,72\n95224,95225\n95226,222\n95227,21944\n95228,72\n95229,1235\n95229,1335\n95230,3\n95231,72\n95232,95233\n95234,1590\n95235,72\n95236,95237\n95238,875\n95239,184\n95240,72\n95241,30\n95242,973\n95243,292\n95244,95245\n95246,1785\n95247,95248\n95249,95250\n95252,89035\n95253,95254\n95255,779\n95256,95257\n95258,95259\n95260,30\n95261,19\n95261,77\n95261,442\n95262,95263\n95264,30\n95265,30\n95266,95267\n95268,202\n95268,203\n95269,95270\n95271,1265\n95271,1266\n95272,872\n95273,2506\n95274,14483\n95275,95276\n95277,872\n95279,779\n95280,366\n95281,366\n95282,366\n95283,366\n95284,3260\n95285,5718\n95286,366\n95287,233\n95288,366\n95289,366\n95290,366\n95291,72\n95292,366\n95293,366\n95294,95295\n95297,3209\n95298,95299\n95300,251\n95301,1085\n95302,30331\n95303,2116\n95304,911\n95306,95307\n95308,623\n95309,1359\n95310,698\n95311,178\n95312,97\n95313,1977\n95313,1978\n95314,1449\n95314,240174\n95315,676\n95317,953\n95317,2201\n95317,24500\n95318,9560\n95320,991\n95321,289\n95321,290\n95322,310\n95323,95324\n95325,1858\n95326,1860\n95327,41\n95327,671\n95328,95329\n95328,95348\n95330,1238\n95331,675\n95332,2073\n95333,47\n95333,2469\n95334,718\n95335,479\n95335,17228\n95336,310\n95337,252\n95340,302\n95341,81233\n95342,95343\n95344,668\n95345,690\n95347,292\n95347,1619\n95349,1132\n95350,781\n95351,907\n95352,37\n95353,1132\n95354,781\n95355,68069\n95356,473\n95357,1132\n95358,781\n95360,68069\n95361,972\n95363,1132\n95364,781\n95365,75912\n95366,258\n95367,1132\n95368,781\n95369,44\n95370,1181\n95371,68069\n95373,195\n95374,349\n95375,760\n95376,95377\n95378,457\n95379,2315\n95380,852\n95380,72764\n95381,217\n95382,1001\n95383,298\n95384,485\n95385,68069\n95386,15\n95386,163\n95386,233\n95386,1113\n95386,1402\n95386,1634\n95387,259\n95388,95389\n95390,83\n95391,147\n95391,158\n95391,1803\n95392,333\n95393,9195\n95394,586\n95394,3297\n95395,932\n95396,217\n95397,515\n95397,736\n95398,1181\n95399,310\n95401,1132\n95402,781\n95403,1085\n95403,75912\n95404,1858\n95405,1860\n95406,1359\n95407,1132\n95408,781\n95410,360\n95410,515\n95410,1893\n95412,1467\n95414,2173\n95415,99\n95416,95417\n95416,115022\n95419,493\n95420,422\n95421,336\n95423,422\n95424,68069\n95425,30\n95426,95427\n95428,95427\n95429,95427\n95430,95427\n95431,95427\n95432,72\n95433,422\n95434,422\n95435,422\n95436,422\n95437,422\n95438,446\n95438,693\n95438,16196\n95439,422\n95440,422\n95441,422\n95442,422\n95443,95443\n95444,302\n95444,372\n95444,628\n95444,704\n95444,868\n95444,941\n95444,1370\n95444,1572\n95444,2312\n95444,2371\n95444,5440\n95444,6789\n95445,779\n95446,1551\n95448,206\n95449,3207\n95450,1707\n95451,95452\n95453,30\n95454,147\n95454,158\n95454,206\n95454,333\n95454,42064\n95455,6424\n95456,34\n95456,35\n95458,2590\n95459,571\n95460,202\n95460,203\n95461,1983\n95462,1294\n95462,2775\n95463,1132\n95464,781\n95465,68069\n95465,118336\n95465,141912\n95466,893\n95469,663\n95469,103860\n95470,515\n95471,95472\n95473,95474\n95475,1390\n95476,920\n95477,1105\n95478,422\n95479,151\n95480,202\n95480,203\n95481,2244\n95482,620\n95483,602\n95484,422\n95485,195\n95486,1465\n95487,356\n95488,1551\n95489,340\n95490,2424\n95491,8235\n95492,1179\n95493,1454\n95494,118\n95494,1133\n95495,356\n95496,1927\n95496,2775\n95497,68069\n95498,356\n95499,994\n95500,1551\n95501,296\n95501,968\n95502,3003\n95503,55849\n95504,389\n95505,1151\n95505,2574\n95509,287\n95510,433\n95514,95515\n95517,779\n95517,68069\n95519,433\n95521,364\n95522,2995\n95523,119\n95523,192\n95523,1400\n95524,68069\n95525,68069\n95527,392\n95528,68069\n95529,2646\n95530,68069\n95531,175\n95532,298\n95533,422\n95534,333\n95535,302\n95536,22\n95537,41\n95538,119\n95539,102\n95539,698\n95539,1634\n95539,2315\n95539,3769\n95540,1860\n95541,779\n95542,1323\n95543,102\n95544,1326\n95545,408\n95546,1639\n95547,577\n95548,422\n95549,56\n95550,2116\n95551,1551\n95552,34\n95552,35\n95552,217\n95552,5976\n95553,5547\n95554,200\n95554,772\n95554,805\n95554,1368\n95554,3474\n95554,4941\n95554,9516\n95554,9529\n95554,16551\n95554,28203\n95554,95554\n95554,95567\n95554,95586\n95554,102647\n95554,111317\n95554,114088\n95554,114463\n95554,116544\n95554,129534\n95554,142901\n95554,146501\n95556,95557\n95558,30\n95559,920\n95560,392\n95561,3960\n95562,104\n95562,1939\n95562,7270\n95563,425\n95563,1276\n95563,3698\n95564,779\n95564,68069\n95564,141912\n95565,95566\n95567,30331\n95567,95554\n95568,95569\n95572,1983\n95573,95574\n95575,925\n95576,425\n95576,1298\n95577,1096\n95578,841\n95579,3999\n95580,81233\n95581,95582\n95585,75912\n95587,779\n95587,68069\n95588,256\n95588,1078\n95590,1127\n95590,1893\n95591,217\n95592,287\n95593,1220\n95593,1222\n95594,252\n95595,251\n95596,388\n95597,1368\n95599,1392\n95600,111\n95601,1220\n95601,1222\n95602,252\n95603,251\n95605,1179\n95607,206\n95608,81233\n95609,516\n95609,1118\n95610,175\n95611,240\n95612,2979\n95613,163\n95614,298\n95615,392\n95616,240\n95617,10\n95617,11\n95617,50\n95617,195\n95617,252\n95617,272\n95617,305\n95617,485\n95617,920\n95617,1319\n95617,1891\n95617,5213\n95617,7117\n95618,4193\n95618,7360\n95619,1132\n95620,781\n95621,95622\n95623,623\n95624,1531\n95626,95627\n95628,68069\n95629,2775\n95630,95631\n95630,255330\n95633,861\n95634,1033\n95635,346\n95636,1266\n95636,5714\n95637,326\n95638,175\n95639,996\n95640,298\n95641,72\n95642,87638\n95644,72\n95645,68069\n95646,202\n95646,203\n95647,3804\n95648,95649\n95650,167\n95651,440\n95651,1531\n95652,310\n95653,1466\n95654,994\n95655,32751\n95656,1265\n95656,1266\n95657,95658\n95659,809\n95660,255\n95661,72\n95662,1068\n95663,95664\n95665,8270\n95666,1220\n95666,1222\n95667,252\n95668,251\n95669,273\n95670,32\n95670,349\n95670,697\n95671,95672\n95673,171\n95675,95675\n95676,94409\n95677,1370\n95678,30\n95679,2244\n95680,714\n95681,376\n95682,95583\n95684,1551\n95685,483\n95686,875\n95687,30\n95688,1220\n95688,1222\n95689,252\n95690,251\n95691,151\n95692,68069\n95693,994\n95694,953\n95695,68069\n95696,346\n95697,687\n95699,95700\n95701,1132\n95702,781\n95703,72\n95704,68069\n95705,68069\n95706,83\n95707,72\n95708,215\n95709,14989\n95710,349\n95711,994\n95712,4611\n95713,4611\n95714,72\n95715,779\n95715,68069\n95716,346\n95717,95718\n95719,95720\n95721,95720\n95722,932\n95725,58\n95725,1140\n95725,1177\n95727,95728\n95729,95730\n95731,1844\n95732,5906\n95733,557\n95734,626\n95735,278\n95736,137\n95737,862\n95738,8719\n95739,138\n95740,865\n95741,557\n95742,137\n95743,118\n95743,4597\n95744,21944\n95745,88820\n95746,557\n95747,557\n95748,779\n95748,68069\n95748,141912\n95749,68069\n95750,72\n95751,557\n95752,516\n95753,1353\n95754,1326\n95755,493\n95756,493\n95757,10\n95757,417\n95757,1085\n95757,75912\n95758,994\n95759,68069\n95760,2775\n95761,83\n95762,4453\n95763,83\n95764,717\n95764,1167\n95766,118\n95766,4597\n95767,516\n95768,68069\n95769,30\n95772,7124\n95774,30\n95776,30\n95777,30\n95778,611\n95778,852\n95778,2775\n95779,95780\n95781,202\n95781,203\n95782,30\n95783,206\n95784,52\n95784,175\n95784,68069\n95785,30\n95786,779\n95786,68069\n95787,644\n95789,1096\n95790,13919\n95791,30\n95792,30\n95793,313\n95794,346\n95795,1359\n95796,136\n95796,5405\n95797,95798\n95799,95800\n95801,481\n95802,95803\n95804,289\n95804,290\n95806,175\n95806,3111\n95806,4980\n95807,994\n95808,72\n95809,72\n95810,422\n95811,422\n95812,422\n95813,422\n95814,422\n95815,422\n95816,422\n95817,422\n95818,422\n95819,422\n95820,30\n95821,676\n95822,1776\n95822,68069\n95823,79\n95823,493\n95823,682\n95823,1175\n95823,72439\n95823,189839\n95823,189842\n95824,72\n95825,422\n95826,56\n95827,422\n95828,56\n95829,2351\n95830,30\n95831,72\n95832,406\n95833,95834\n95835,72\n95837,1893\n95839,95840\n95841,30\n95842,95843\n95844,95845\n95846,72\n95847,95848\n95850,1265\n95850,1266\n95851,72\n95852,95853\n95854,588\n95854,590\n95854,1419\n95855,483\n95856,175\n95857,779\n95858,72\n95859,95860\n95861,289\n95861,290\n95862,72\n95863,30\n95864,95865\n95866,72\n95867,240\n95868,72\n95869,95869\n95870,95871\n95872,95873\n95874,1368\n95875,225\n95876,95877\n95878,8884\n95879,72\n95880,1085\n95881,72\n95882,7652\n95883,72\n95884,1133\n95885,95886\n95887,72\n95888,72\n95889,72\n95890,72\n95891,233\n95892,95893\n95894,72\n95895,95896\n95897,72\n95899,95899\n95900,9121\n95901,72\n95903,95904\n95905,95906\n95905,138838\n95905,150648\n95907,298\n95908,485\n95909,4548\n95910,72\n95911,95912\n95913,119\n95913,577\n95913,1400\n95913,21944\n95914,118\n95914,4597\n95915,72\n95916,95917\n95918,95917\n95919,95920\n95921,1509\n95921,3041\n95922,158\n95923,95924\n95925,72\n95926,3804\n95927,809\n95928,95929\n95930,44\n95931,79\n95931,994\n95932,95933\n95934,83\n95936,932\n95937,95938\n95939,95940\n95939,104722\n95939,262307\n95941,192\n95941,309\n95941,310\n95942,298\n95943,3\n95944,485\n95945,72\n95946,95938\n95947,95948\n95950,50\n95950,99\n95950,285\n95950,336\n95950,622\n95950,818\n95950,8055\n95950,35447\n95951,393\n95952,366\n95953,83\n95954,104\n95955,30\n95956,30\n95958,31934\n95959,309\n95959,310\n95960,31977\n95961,95962\n95963,668\n95964,676\n95965,95966\n95967,95968\n95969,95970\n95971,9457\n95972,72\n95973,1323\n95974,102\n95975,1326\n95976,408\n95977,5547\n95979,1\n95981,36985\n95982,4355\n95983,68069\n95984,422\n95985,56\n95987,5547\n95988,21487\n95989,28072\n95990,95991\n95992,72\n95993,483\n95994,30\n95997,72\n95998,72\n95999,72\n96000,72\n96001,72\n96003,200\n96004,366\n96005,366\n96006,1572\n96007,227\n96008,1590\n96008,1644\n96009,366\n96010,366\n96011,366\n96012,366\n96013,30\n96014,366\n96015,366\n96016,151\n96017,1608\n96019,1722\n96020,1635\n96021,301\n96021,304\n96021,372\n96021,631\n96021,932\n96021,1001\n96021,1085\n96021,1122\n96021,1715\n96022,68069\n96023,72\n96024,55585\n96025,72\n96026,8270\n96027,48\n96028,1776\n96029,96030\n96031,72\n96032,96033\n96034,795\n96035,1379\n96036,72\n96037,72\n96038,96039\n96040,96041\n96042,7360\n96043,1\n96043,1309\n96044,96045\n96046,2296\n96047,96048\n96049,43203\n96050,72\n96051,30\n96052,96053\n96054,96055\n96056,376\n96057,285\n96057,779\n96057,68069\n96058,96059\n96060,147\n96060,252\n96061,72\n96062,96063\n96064,72\n96065,72\n96066,30\n96067,30\n96068,96069\n96070,622\n96070,861\n96070,21589\n96071,72\n96072,344\n96073,285\n96074,30\n96076,24505\n96077,96077\n96078,298\n96079,485\n96080,1479\n96081,390\n96082,96083\n96084,1977\n96084,1978\n96085,83\n96086,96087\n96088,52261\n96089,417\n96090,233\n96091,68069\n96092,93\n96092,94\n96093,30\n96094,417\n96095,96096\n96097,779\n96097,68069\n96098,30\n96099,96100\n96101,94409\n96102,72\n96103,602\n96104,72\n96105,96106\n96107,84257\n96108,510\n96109,119\n96109,577\n96110,30\n96112,68069\n96112,141912\n96113,872\n96114,72\n96115,96116\n96117,126\n96118,366\n96119,366\n96120,72\n96122,72\n96124,68069\n96125,72\n96126,158\n96128,6682\n96129,1749\n96131,72\n96132,72\n96133,5440\n96134,72\n96135,72\n96136,96137\n96136,96904\n96138,72\n96139,163\n96141,96142\n96143,96144\n96145,30\n96146,10\n96148,96149\n96150,8855\n96151,3538\n96153,7360\n96154,52\n96154,206059\n96155,96156\n96157,96158\n96159,3413\n96160,126\n96161,3413\n96162,3161\n96163,72\n96164,72\n96165,233\n96166,96167\n96168,96169\n96170,72\n96171,72\n96172,393\n96173,96174\n96175,1033\n96176,107\n96177,2416\n96177,2417\n96178,292\n96179,338\n96180,298\n96181,1133\n96182,3538\n96184,366\n96185,346\n96186,96187\n96188,1655\n96189,452\n96190,355\n96191,252\n96192,390\n96192,592\n96192,675\n96192,918\n96192,1010\n96192,1140\n96193,497\n96194,918\n96195,96196\n96197,72\n96198,96199\n96200,72\n96201,96202\n96203,96204\n96205,5375\n96207,72\n96209,96210\n96211,535\n96212,640\n96213,72\n96214,44\n96215,72\n96216,96217\n96218,96219\n96220,575\n96220,697\n96221,298\n96222,485\n96223,932\n96224,298\n96225,485\n96226,96227\n96228,1043\n96229,676\n96230,72\n96231,96232\n96231,124248\n96233,31934\n96234,292\n96235,457\n96236,96237\n96239,473\n96240,222\n96240,2266\n96241,3447\n96242,2528\n96243,96244\n96245,96246\n96247,1891\n96248,96249\n96250,96251\n96252,72\n96253,30\n96254,1402\n96255,1287\n96256,9029\n96257,1983\n96258,779\n96259,96260\n96261,14434\n96262,3960\n96263,96264\n96265,1707\n96266,222\n96266,301\n96266,536\n96266,577\n96267,30\n96268,72\n96269,602\n96270,96271\n96272,671\n96273,805\n96274,96275\n96276,2506\n96278,872\n96279,1210\n96280,1580\n96281,96282\n96283,96284\n96285,30\n96286,30\n96288,289\n96288,290\n96288,682\n96288,2286\n96288,72439\n96289,640\n96290,147\n96290,158\n96292,422\n96293,56\n96294,30\n96295,96296\n96297,366\n96299,17588\n96300,147\n96300,158\n96301,1146\n96302,111\n96302,1962\n96303,83\n96304,72\n96306,30\n96307,4101\n96308,41\n96309,10\n96310,3297\n96311,96312\n96313,72\n96314,18726\n96316,163\n96317,389\n96318,2334\n96319,72\n96320,240\n96321,30\n96322,1247\n96323,1776\n96323,68069\n96324,516\n96325,467\n96326,30\n96327,2371\n96328,72\n96329,7117\n96330,10\n96331,2775\n96332,447\n96333,1608\n96334,3967\n96335,192\n96336,515\n96337,96338\n96340,30\n96341,273\n96343,827\n96344,389\n96345,483\n96346,1085\n96346,1608\n96347,96348\n96349,96348\n96350,8270\n96351,30\n96353,1888\n96354,758\n96355,72\n96356,200\n96356,1177\n96356,1241\n96357,48\n96357,118\n96357,340\n96357,589\n96357,596\n96357,647\n96357,649\n96357,694\n96357,749\n96357,752\n96357,861\n96357,934\n96357,1033\n96357,1179\n96357,1298\n96357,1432\n96357,1449\n96357,1644\n96357,1715\n96357,1818\n96357,2083\n96357,2315\n96357,3182\n96357,4223\n96357,4597\n96357,6789\n96357,16019\n96357,37414\n96358,72\n96359,8270\n96360,827\n96361,1531\n96362,1132\n96363,781\n96364,96365\n96366,557\n96367,862\n96368,1132\n96369,781\n96370,557\n96371,557\n96372,557\n96375,9195\n96376,3413\n96377,269\n96380,72\n96382,22\n96383,2424\n96384,96385\n96387,452\n96388,8788\n96389,30\n96390,30\n96391,333\n96392,96393\n96395,850\n96396,72\n96397,72\n96398,602\n96399,697\n96401,72\n96402,96403\n96404,349\n96405,72\n96406,96407\n96408,96409\n96410,332\n96411,30\n96412,72\n96413,1572\n96414,8788\n96415,72\n96416,72\n96417,1118\n96418,96419\n96418,96529\n96420,96419\n96421,96419\n96422,96419\n96423,96419\n96424,310\n96425,2995\n96426,30\n96427,96427\n96428,96429\n96430,1238\n96431,175\n96432,298\n96433,8180\n96434,96435\n96436,1452\n96437,10\n96439,323\n96440,292\n96441,96442\n96443,294\n96444,296\n96445,298\n96446,50\n96447,376\n96448,96449\n96451,30\n96452,726\n96453,233\n96454,1085\n96456,96457\n96459,96460\n96461,868\n96462,6861\n96463,96464\n96466,1\n96466,285\n96466,534\n96466,620\n96466,4453\n96466,5874\n96467,2351\n96468,292\n96468,24500\n96468,193129\n96469,96469\n96470,9029\n96471,795\n96473,1580\n96473,103860\n96474,21944\n96475,96476\n96478,79\n96480,3003\n96481,75912\n96482,968\n96482,103860\n96484,30\n96487,571\n96488,973\n96489,30\n96490,602\n96491,422\n96492,56\n96493,151\n96494,96495\n96496,21944\n96497,415\n96498,202\n96498,203\n96499,96500\n96501,1732\n96502,671\n96503,366\n96504,298\n96505,485\n96507,356\n96508,72\n96509,50\n96511,8788\n96512,875\n96515,1858\n96516,1860\n96517,96518\n96517,130566\n96519,44\n96520,217\n96520,240\n96520,397\n96520,1172\n96520,1370\n96520,2310\n96522,30\n96523,422\n96524,422\n96525,422\n96526,422\n96527,422\n96528,422\n96530,422\n96531,422\n96532,422\n96533,422\n96534,422\n96535,422\n96536,30\n96538,3367\n96539,872\n96540,868\n96541,326\n96542,3413\n96543,760\n96544,30\n96545,932\n96546,1203\n96547,455\n96548,66\n96549,163\n96549,312\n96549,811\n96549,1619\n96549,205627\n96550,360\n96551,255\n96552,875\n96553,467\n96554,83\n96555,146\n96555,779\n96556,827\n96557,873\n96557,1210\n96558,360\n96559,298\n96560,485\n96561,779\n96561,141912\n96562,1132\n96563,781\n96564,640\n96565,1556\n96566,1132\n96567,781\n96568,364\n96568,2590\n96569,433\n96570,298\n96571,485\n96573,859\n96574,663\n96574,1436\n96574,2979\n96574,32577\n96575,752\n96576,422\n96577,56\n96579,493\n96580,130\n96581,15\n96582,1127\n96583,151\n96583,1179\n96584,2779\n96585,1220\n96585,1222\n96586,252\n96587,251\n96588,96588\n96589,134\n96589,493\n96591,585\n96593,66\n96594,58\n96595,640\n96596,640\n96597,309\n96597,310\n96598,252\n96598,1220\n96598,1222\n96599,3297\n96601,1572\n96601,96602\n96601,159270\n96601,172021\n96601,201886\n96601,204912\n96603,298\n96604,485\n96605,1608\n96606,59931\n96606,84257\n96607,54\n96608,433\n96609,943\n96609,2867\n96609,2868\n96610,7092\n96611,167\n96612,671\n96615,252\n96616,192\n96617,356\n96618,1220\n96618,1222\n96619,252\n96620,251\n96622,934\n96623,2775\n96624,96625\n96626,626\n96627,96628\n96629,6627\n96631,301\n96631,1293\n96632,97\n96633,97\n96634,344\n96636,1556\n96637,192\n96637,406\n96638,515\n96639,859\n96640,1877\n96641,184\n96642,1707\n96643,240\n96644,697\n96644,3260\n96645,163\n96645,302\n96645,1556\n96646,1531\n96647,818\n96648,657\n96648,7092\n96649,269\n96649,406\n96649,75912\n96650,19986\n96651,30\n96652,30\n96655,72\n96656,872\n96657,104\n96658,483\n96658,1776\n96659,99\n96661,13546\n96662,1390\n96663,97\n96664,195\n96667,255\n96668,86\n96669,171\n96670,579\n96670,589\n96670,868\n96670,6119\n96671,1453\n96671,1881\n96672,72\n96673,918\n96674,202\n96674,240\n96674,17309\n96675,911\n96676,563\n96677,298\n96678,485\n96679,358\n96681,868\n96682,1612\n96683,273\n96684,392\n96685,390\n96685,1298\n96687,1235\n96687,1335\n96688,30\n96689,973\n96690,1010\n96691,1118\n96692,3260\n96695,96696\n96697,118\n96697,4597\n96699,433\n96700,516\n96701,875\n96702,2334\n96704,775\n96705,96706\n96707,9560\n96708,1181\n96708,1515\n96709,96710\n96712,714\n96713,1287\n96715,422\n96718,1019\n96718,190492\n96720,137\n96721,195\n96721,30331\n96722,30\n96724,663\n96724,1089\n96725,118\n96725,4597\n96726,146\n96727,30\n96728,140\n96728,1893\n96729,1140\n96730,875\n96731,96732\n96733,66\n96733,868\n96733,156379\n96734,96735\n96736,58\n96737,994\n96738,46\n96739,75912\n96740,1417\n96741,718\n96742,30\n96743,30\n96744,1707\n96745,3367\n96746,96747\n96748,298\n96748,442\n96748,805\n96749,118\n96749,4597\n96751,875\n96752,301\n96753,875\n96754,298\n96755,485\n96756,2146\n96757,1\n96758,96759\n96758,113116\n96760,809\n96762,949\n96763,968\n96764,48\n96764,63\n96764,118\n96764,306\n96764,307\n96764,340\n96764,589\n96764,647\n96764,649\n96764,749\n96764,752\n96764,934\n96764,994\n96764,1151\n96764,1179\n96764,1289\n96764,1298\n96764,1432\n96764,1449\n96764,1644\n96764,1818\n96764,2296\n96764,4223\n96764,4597\n96764,16019\n96764,37414\n96764,142879\n96765,23783\n96766,302\n96766,309\n96766,310\n96766,415\n96766,657\n96766,827\n96766,862\n96766,1715\n96766,2411\n96766,4218\n96766,5326\n96766,142405\n96767,3367\n96768,1274\n96769,83\n96770,151\n96771,96772\n96773,192\n96773,827\n96774,195\n96775,292\n96776,1370\n96776,1821\n96778,843\n96780,827\n96781,1893\n96782,120\n96782,240\n96782,406\n96783,772\n96784,1332\n96785,850\n96786,577\n96787,697\n96788,83\n96788,222\n96789,68\n96789,326\n96789,392\n96789,671\n96789,934\n96789,1805\n96789,2116\n96789,4760\n96789,4823\n96789,177883\n96790,96791\n96792,2929\n96793,843\n96794,134\n96794,657\n96795,433\n96796,72\n96797,313\n96798,175\n96799,298\n96800,360\n96800,1893\n96801,298\n96802,485\n96803,602\n96804,602\n96805,3623\n96806,1\n96807,1188\n96808,298\n96809,485\n96810,2073\n96811,96812\n96813,579\n96814,2048\n96815,424\n96816,285\n96816,779\n96816,68069\n96817,315\n96817,934\n96818,202\n96818,203\n96819,579\n96821,96822\n96823,14989\n96824,422\n96825,1432\n96826,872\n96827,301\n96827,1293\n96827,3422\n96828,809\n96829,10\n96830,2646\n96830,3623\n96832,96833\n96834,252\n96834,1220\n96834,1222\n96835,1571\n96837,1231\n96837,1782\n96838,3115\n96839,333\n96840,96841\n96842,586\n96842,1243\n96844,8270\n96845,720\n96845,1837\n96846,442\n96846,54362\n96847,65\n96847,123721\n96848,2775\n96849,1019\n96850,34\n96850,35\n96851,525\n96851,841\n96852,72\n96853,8180\n96854,1572\n96855,446\n96858,271\n96859,72\n96860,1462\n96860,8537\n96861,843\n96863,96864\n96865,557\n96866,1133\n96868,2210\n96868,4237\n96869,518\n96869,22293\n96870,1983\n96871,657\n96872,875\n96874,72\n96875,209\n96876,209\n96878,358\n96879,72\n96880,72\n96881,3695\n96882,483\n96883,96884\n96883,97769\n96883,120805\n96883,121432\n96883,124290\n96883,129290\n96883,139166\n96883,140383\n96883,162827\n96883,175507\n96883,177767\n96883,235248\n96883,248311\n96885,24505\n96886,96887\n96889,392\n96891,96892\n96893,500\n96894,255\n96895,8270\n96896,516\n96897,640\n96897,1181\n96898,652\n96898,96899\n96898,169961\n96898,173020\n96900,72\n96901,872\n96903,72\n96905,72\n96906,557\n96907,557\n96908,2116\n96909,96910\n96911,323\n96912,21944\n96913,195\n96913,222\n96913,1019\n96914,301\n96916,862\n96917,96918\n96919,207\n96920,96921\n96922,184\n96923,96924\n96926,577\n96927,298\n96928,485\n96929,3260\n96930,255\n96931,217\n96932,3260\n96933,68\n96934,23783\n96935,298\n96936,485\n96938,309\n96938,310\n96939,1634\n96940,298\n96941,485\n96942,21487\n96943,602\n96944,151\n96945,8180\n96946,96947\n96948,23010\n96949,1007\n96950,483\n96951,626\n96952,360\n96953,96954\n96955,2590\n96956,96957\n96958,72\n96959,96960\n96959,120071\n96961,1983\n96962,96963\n96964,96965\n96966,207\n96967,96968\n96969,592\n96970,96971\n96972,267\n96973,96974\n96975,344\n96976,4604\n96977,872\n96978,1429\n96979,96980\n96981,489\n96982,668\n96983,424\n96984,96985\n96986,96987\n96988,323\n96989,323\n96990,255\n96992,9560\n96993,96994\n96995,3\n96996,704\n96997,96998\n96999,97000\n97002,97003\n97004,97001\n97006,97007\n97008,97009\n97010,97011\n97012,203\n97012,372\n97013,1467\n97014,1143\n97015,481\n97016,34\n97016,158\n97017,97018\n97019,2424\n97020,206\n97021,1871\n97022,515\n97023,447\n97024,8270\n97026,422\n97027,56\n97028,116\n97028,994\n97028,2087\n97029,306\n97029,307\n97030,13980\n97031,9026\n97032,6119\n97033,77\n97034,388\n97036,1181\n97037,289\n97037,290\n97038,376\n97040,97041\n97042,258\n97043,310\n97044,310\n97045,2506\n97046,32\n97048,72\n97049,298\n97050,485\n97051,3079\n97052,151\n97053,682\n97053,72439\n97054,312\n97055,79\n97056,10\n97057,805\n97058,151\n97059,310\n97060,264\n97060,1659\n97061,527\n97062,30\n97063,163\n97064,827\n97065,1977\n97065,1978\n97066,206\n97067,195\n97068,697\n97068,1454\n97069,233\n97070,252\n97070,1220\n97070,1222\n97071,7360\n97072,30\n97073,97074\n97076,298\n97077,485\n97078,467\n97079,97080\n97081,500\n97082,1782\n97083,14126\n97084,1509\n97085,932\n97087,406\n97088,623\n97089,355\n97090,1298\n97091,862\n97092,1893\n97093,97094\n97093,120783\n97093,153500\n97093,174708\n97093,185030\n97093,185776\n97093,223300\n97095,340\n97095,579\n97096,207\n97097,97098\n97099,500\n97100,605\n97101,393\n97102,184\n97104,849\n97104,1844\n97105,1381\n97106,1849\n97108,47\n97108,2469\n97109,298\n97110,485\n97111,634\n97112,137\n97113,1968\n97114,298\n97115,485\n97116,264\n97116,577\n97117,97118\n97119,1939\n97120,147\n97121,50\n97122,2351\n97123,500\n97124,97125\n97126,1566\n97127,1240\n97128,30\n97129,1132\n97130,781\n97131,1\n97132,130\n97132,462\n97132,872\n97132,1127\n97134,298\n97135,485\n97137,422\n97138,422\n97139,298\n97140,485\n97141,422\n97142,422\n97143,422\n97144,422\n97145,422\n97146,422\n97147,999\n97147,1801\n97147,4760\n97147,5591\n97148,298\n97149,485\n97150,298\n97151,485\n97152,3422\n97153,97154\n97155,406\n97156,298\n97157,485\n97158,1531\n97159,97160\n97161,298\n97162,485\n97163,1130\n97164,298\n97165,485\n97166,2699\n97167,1132\n97168,781\n97169,6682\n97170,283\n97171,314\n97172,1722\n97173,97174\n97173,112982\n97175,640\n97176,640\n97177,422\n97178,14819\n97179,640\n97180,422\n97181,422\n97182,640\n97183,3252\n97184,255\n97185,217\n97186,355\n97187,422\n97188,56\n97189,932\n97190,1782\n97191,579\n97192,693\n97193,1616\n97194,596\n97196,1368\n97196,2353\n97197,149\n97198,72\n97199,626\n97200,2626\n97201,1724\n97202,3161\n97203,1132\n97204,781\n97205,273\n97205,1118\n97207,217\n97208,980\n97209,1745\n97210,2995\n97211,1677\n97212,7\n97212,1289\n97212,1381\n97212,3999\n97212,14366\n97213,1381\n97214,671\n97215,581\n97215,717\n97215,784\n97215,204093\n97216,298\n97217,485\n97218,1132\n97219,781\n97220,455\n97220,657\n97221,3135\n97222,1132\n97223,781\n97224,2416\n97224,2417\n97225,294\n97226,147\n97227,97228\n97229,298\n97230,485\n97231,510\n97232,151\n97233,577\n97234,622\n97235,184\n97236,835\n97236,49057\n97237,383\n97238,3623\n97239,818\n97240,920\n97241,83\n97242,97243\n97244,805\n97245,809\n97246,302\n97247,1087\n97249,264\n97250,4276\n97251,72\n97252,97253\n97254,1132\n97255,781\n97256,3623\n97257,77\n97258,1118\n97259,3135\n97260,58\n97261,994\n97262,46\n97263,75912\n97264,626\n97265,298\n97266,485\n97267,1305\n97268,15068\n97269,1274\n97270,1127\n97271,97272\n97273,500\n97274,8270\n97275,298\n97276,485\n97277,298\n97278,485\n97280,13361\n97281,97282\n97284,97285\n97286,99\n97286,146\n97286,314\n97286,779\n97286,8055\n97287,1132\n97288,781\n97289,147\n97289,220502\n97291,861\n97292,2224\n97293,1551\n97294,97295\n97296,97297\n97298,602\n97299,1390\n97300,589\n97301,298\n97302,485\n97303,261\n97305,602\n97306,920\n97307,19\n97307,34\n97307,35\n97307,222\n97307,278\n97307,283\n97307,313\n97307,389\n97307,536\n97307,634\n97307,657\n97307,781\n97307,949\n97307,1019\n97307,1072\n97307,1274\n97307,1467\n97307,1539\n97307,1571\n97307,1718\n97307,1871\n97307,1881\n97307,2168\n97307,2266\n97307,2319\n97307,2424\n97307,2784\n97307,2944\n97307,4594\n97307,5976\n97307,6789\n97307,6888\n97307,7768\n97307,13137\n97307,29475\n97308,1634\n97309,217\n97310,949\n97312,79\n97313,491\n97314,392\n97315,298\n97316,485\n97317,392\n97317,1151\n97318,1616\n97319,97320\n97321,163\n97321,31206\n97323,602\n97324,1939\n97325,972\n97326,151\n97326,388\n97326,536\n97327,97328\n97327,124242\n97329,1298\n97330,167\n97330,3138\n97331,676\n97332,298\n97333,485\n97334,1132\n97335,781\n97338,1149\n97338,3085\n97339,6119\n97340,1370\n97340,1821\n97341,97342\n97343,302\n97344,310\n97345,1323\n97346,102\n97347,1326\n97348,408\n97349,97350\n97353,6323\n97354,302\n97354,489\n97355,781\n97356,1132\n97357,298\n97358,485\n97360,485\n97361,344\n97362,685\n97363,720\n97365,1939\n97366,267\n97367,200\n97369,1181\n97370,298\n97371,485\n97373,206\n97376,500\n97377,1962\n97378,1052\n97379,1882\n97380,2775\n97381,54\n97382,118\n97382,4597\n97383,2436\n97384,500\n97385,272\n97386,30\n97387,3695\n97388,500\n97389,225\n97395,500\n97396,310\n97396,483\n97396,3039\n97398,1454\n97399,30\n97400,515\n97400,862\n97401,30\n97402,184\n97403,252\n97403,1220\n97403,1222\n97405,3209\n97406,1016\n97406,1119\n97408,272\n97409,30\n97410,30\n97411,187\n97412,10\n97412,67343\n97413,500\n97414,1220\n97414,1222\n97415,252\n97416,251\n97418,272\n97420,1877\n97422,240\n97423,333\n97423,406\n97423,493\n97423,733\n97423,779\n97423,4190\n97423,6119\n97423,60576\n97423,141912\n97424,97425\n97426,211\n97426,500\n97431,1707\n97433,6323\n97434,97434\n97435,326\n97440,272\n97441,1939\n97443,8149\n97444,147\n97444,158\n97446,255\n97447,97448\n97449,72\n97450,1019\n97451,805\n97451,1118\n97451,4237\n97451,182162\n97452,97453\n97454,7360\n97455,406\n97456,149\n97457,749\n97458,298\n97459,485\n97460,333\n97462,10\n97463,97464\n97465,3413\n97466,83\n97467,483\n97468,97469\n97470,97471\n97472,467\n97473,467\n97474,467\n97475,1058\n97476,693\n97477,994\n97478,30\n97479,3623\n97480,255\n97481,10\n97482,1001\n97483,72\n97484,1381\n97486,920\n97487,151\n97489,97488\n97490,149\n97492,5440\n97493,3\n97494,3999\n97495,83\n97495,309\n97495,310\n97495,1235\n97495,1335\n97496,344\n97497,3623\n97498,264\n97498,1749\n97498,14550\n97499,406\n97499,439\n97500,58\n97501,994\n97502,46\n97503,75912\n97504,255\n97505,801\n97505,1140\n97505,3474\n97505,5547\n97507,2719\n97508,3370\n97508,14453\n97509,920\n97510,1805\n97511,1033\n97512,671\n97513,3246\n97514,920\n97515,1010\n97516,3804\n97517,2590\n97518,518\n97519,1381\n97520,1715\n97521,9015\n97522,86\n97523,605\n97524,444\n97525,1837\n97526,215\n97527,298\n97528,485\n97529,195\n97531,622\n97532,1590\n97533,192\n97534,586\n97535,252\n97536,217\n97536,1796\n97536,1844\n97536,2512\n97538,333\n97539,875\n97540,217\n97540,1417\n97541,1893\n97542,602\n97543,1210\n97544,247\n97544,920\n97545,694\n97545,1466\n97545,1796\n97546,485\n97547,697\n97548,588\n97548,590\n97550,72\n97551,406\n97552,644\n97553,2266\n97554,932\n97555,452\n97556,171\n97557,622\n97558,1590\n97559,192\n97560,586\n97562,795\n97563,72\n97564,97565\n97566,622\n97567,333\n97568,68069\n97569,22\n97570,14366\n97571,97572\n97571,111628\n97571,120512\n97571,121839\n97571,139017\n97573,9323\n97574,30\n97575,9195\n97577,7\n97579,3069\n97580,72\n97581,6263\n97582,4980\n97583,19986\n97584,14989\n97585,16045\n97586,30\n97587,97588\n97589,1132\n97590,781\n97591,1556\n97592,233\n97593,8855\n97594,3623\n97595,1531\n97596,920\n97597,372\n97600,1462\n97600,2697\n97601,7124\n97602,211\n97603,5440\n97604,97605\n97606,406\n97607,332\n97607,356\n97608,5911\n97609,97609\n97610,72\n97611,784\n97612,30\n97613,202\n97613,203\n97613,509\n97613,2266\n97613,2784\n97613,7092\n97614,333\n97614,5906\n97615,192\n97616,1381\n97617,2775\n97619,217\n97620,393\n97621,3623\n97622,298\n97623,485\n97624,30\n97625,140\n97626,5911\n97628,259\n97629,358\n97630,2224\n97631,147\n97633,192\n97633,222\n97633,577\n97633,626\n97635,97634\n97636,34\n97636,35\n97637,640\n97638,1210\n97639,718\n97640,140\n97641,267\n97642,83\n97643,72\n97644,862\n97645,72\n97646,3949\n97647,1068\n97647,1789\n97648,349\n97649,4455\n97649,68069\n97653,994\n97654,292\n97655,33611\n97656,1132\n97657,781\n97658,1227\n97658,86416\n97659,1132\n97660,781\n97661,647\n97662,97663\n97664,72\n97666,516\n97667,1210\n97668,622\n97669,72\n97670,97671\n97673,72\n97674,72\n97675,557\n97676,652\n97677,72\n97678,557\n97679,72\n97680,344\n97681,3079\n97682,30\n97683,118\n97683,4597\n97684,1266\n97684,1462\n97684,2048\n97685,30\n97686,72\n97687,184\n97689,72\n97690,72\n97691,72\n97692,137\n97693,30\n97694,10\n97694,1235\n97695,4101\n97696,30\n97697,485\n97697,3447\n97698,72\n97699,5301\n97700,206\n97700,3524\n97701,968\n97701,2353\n97702,435\n97703,1262\n97704,885\n97704,13704\n97705,422\n97706,56\n97707,1181\n97708,344\n97709,298\n97710,485\n97712,3623\n97713,171\n97714,1118\n97714,2617\n97715,872\n97716,298\n97717,485\n97718,392\n97718,1151\n97719,30\n97720,356\n97721,422\n97722,56\n97723,438\n97723,1181\n97724,97725\n97726,1619\n97727,72\n97729,1\n97729,4\n97729,5\n97729,32\n97729,65\n97729,160\n97729,206\n97729,283\n97729,392\n97729,433\n97729,509\n97729,577\n97729,626\n97729,644\n97729,685\n97729,697\n97729,784\n97729,809\n97729,1082\n97729,1363\n97729,1807\n97729,1858\n97729,2274\n97729,2699\n97729,2926\n97729,3999\n97729,4903\n97729,18726\n97729,76096\n97729,109503\n97730,893\n97731,3555\n97732,298\n97733,485\n97734,273\n97735,17588\n97736,994\n97737,30\n97738,2436\n97739,264\n97740,1531\n97741,97742\n97743,1381\n97744,972\n97744,973\n97744,4504\n97745,885\n97745,13704\n97746,1634\n97748,424\n97749,97750\n97751,392\n97752,207\n97753,97754\n97755,874\n97756,97757\n97758,4504\n97760,10\n97761,97762\n97764,72\n97765,250\n97765,1684\n97766,240\n97766,1955\n97766,3135\n97767,1007\n97768,211\n97768,256\n97771,323\n97772,431\n97772,631\n97773,1\n97774,310\n97775,323\n97776,2867\n97776,2868\n97777,3447\n97778,2146\n97779,126\n97780,4066\n97781,3413\n97782,3161\n97783,1313\n97784,192\n97785,1939\n97786,10\n97787,676\n97788,393\n97789,1381\n97790,1265\n97790,1266\n97791,3209\n97792,859\n97793,332\n97794,225\n97795,3148\n97796,5405\n97797,2797\n97798,158\n97799,2048\n97800,5366\n97801,1149\n97802,479\n97803,333\n97804,2931\n97805,7358\n97805,7363\n97806,714\n97807,3872\n97808,2697\n97809,1102\n97810,652\n97811,5440\n97812,953\n97813,6068\n97814,589\n97815,1414\n97816,2995\n97817,7652\n97818,240\n97819,1\n97820,97821\n97822,1033\n97823,2719\n97824,503\n97825,34\n97825,35\n97825,217\n97825,536\n97825,1417\n97826,861\n97827,376\n97828,4805\n97829,192\n97830,8270\n97831,30\n97832,366\n97833,1085\n97835,171\n97836,1175\n97837,671\n97838,481\n97839,97840\n97841,973\n97842,671\n97844,30\n97845,118\n97845,4597\n97846,1515\n97846,68069\n97847,97848\n97849,918\n97850,805\n97851,118\n97851,4597\n97852,97853\n97854,97855\n97856,97857\n97858,1181\n97860,779\n97861,8270\n97862,298\n97863,485\n97864,8270\n97865,298\n97866,485\n97867,46\n97867,58\n97867,75912\n97869,30\n97871,397\n97871,783\n97872,862\n97873,97874\n97875,97876\n97877,406\n97878,97879\n97881,7124\n97882,47\n97882,2469\n97883,1531\n97884,298\n97885,485\n97886,3623\n97887,269\n97888,163\n97890,97891\n97892,1619\n97893,485\n97895,292\n97896,893\n97898,17588\n97899,298\n97900,485\n97901,406\n97902,355\n97903,137\n97904,388\n97905,79\n97905,217\n97906,2371\n97907,30\n97908,20\n97908,1072\n97909,30\n97910,222\n97910,455\n97911,292\n97912,3\n97913,292\n97914,1983\n97915,32\n97915,349\n97915,392\n97915,697\n97915,875\n97915,1363\n97916,1381\n97917,298\n97918,485\n97919,1479\n97919,1858\n97919,6068\n97920,2353\n97921,233\n97922,97923\n97924,283\n97924,455\n97924,477\n97924,536\n97924,862\n97924,1419\n97924,1465\n97924,1466\n97924,1467\n97924,1608\n97924,2168\n97924,2784\n97925,868\n97926,467\n97927,27041\n97929,671\n97930,79\n97931,450\n97932,1326\n97933,217\n97934,240\n97934,272\n97934,299\n97934,379\n97934,483\n97934,1118\n97934,1119\n97934,1429\n97934,1796\n97934,2512\n97934,6556\n97935,640\n97936,3447\n97937,2146\n97938,126\n97939,3161\n97940,874\n97941,192\n97942,10\n97943,44\n97944,676\n97945,1381\n97946,1265\n97946,1266\n97947,859\n97948,332\n97949,225\n97950,5405\n97951,2797\n97952,158\n97953,2048\n97954,5366\n97955,1149\n97956,479\n97957,333\n97958,611\n97959,2931\n97960,714\n97961,3872\n97962,1102\n97963,652\n97964,953\n97965,6068\n97966,589\n97967,1414\n97968,2995\n97969,7652\n97970,119\n97970,577\n97970,918\n97970,2073\n97970,3507\n97971,209\n97972,292\n97973,1893\n97974,3367\n97975,4192\n97975,4193\n97976,2334\n97977,292\n97978,209\n97979,97980\n97979,132510\n97979,161932\n97981,301\n97982,298\n97983,485\n97984,30\n97985,1858\n97986,1860\n97989,315\n97989,671\n97990,22\n97990,130\n97990,163\n97990,192\n97990,195\n97990,206\n97990,267\n97990,269\n97990,272\n97990,301\n97990,302\n97990,333\n97990,422\n97990,433\n97990,457\n97990,483\n97990,622\n97990,687\n97990,697\n97990,712\n97990,868\n97990,1033\n97990,1117\n97990,1127\n97990,1181\n97990,1188\n97990,1191\n97990,1240\n97990,1509\n97990,1634\n97990,1837\n97990,2017\n97990,2371\n97990,2812\n97990,5874\n97990,6303\n97990,17309\n97990,54284\n97990,72811\n97991,875\n97992,3724\n97993,338\n97993,697\n97993,1127\n97994,5101\n97995,97996\n97997,209\n97998,2617\n97999,422\n98000,422\n98001,422\n98002,422\n98003,1612\n98004,98005\n98007,1181\n98008,98009\n98010,32475\n98011,1235\n98011,1335\n98013,298\n98014,485\n98015,209\n98016,98017\n98018,9195\n98019,338\n98019,3003\n98019,6059\n98020,98021\n98022,827\n98023,1551\n98024,1506\n98025,209\n98026,98027\n98028,98029\n98030,3623\n98031,875\n98033,98034\n98035,298\n98036,485\n98037,626\n98038,1332\n98039,330\n98039,957\n98039,1815\n98041,422\n98042,56\n98043,372\n98043,1082\n98043,1467\n98043,2296\n98044,579\n98045,14989\n98046,50\n98046,3653\n98046,14989\n98047,1096\n98049,779\n98050,98051\n98052,98053\n98054,298\n98055,485\n98056,433\n98057,626\n98058,875\n98059,393\n98060,1381\n98061,28072\n98062,1033\n98063,586\n98064,72\n98065,58\n98066,538\n98067,206\n98068,417\n98069,1265\n98069,1266\n98070,422\n98071,422\n98072,872\n98073,596\n98073,668\n98073,19010\n98074,298\n98075,485\n98076,1479\n98077,298\n98078,485\n98079,422\n98081,422\n98082,3003\n98083,5375\n98084,209\n98085,304\n98085,631\n98085,932\n98085,1122\n98086,1572\n98087,98088\n98089,98090\n98091,640\n98092,1087\n98093,16045\n98094,726\n98095,390\n98095,444\n98095,1085\n98096,868\n98097,98098\n98099,202\n98099,203\n98099,252\n98099,406\n98099,516\n98100,298\n98101,485\n98102,875\n98103,209\n98104,292\n98105,209\n98106,298\n98107,485\n98109,72\n98110,872\n98111,1436\n98112,78232\n98113,134\n98113,289\n98113,94134\n98114,1590\n98115,5310\n98116,1293\n98116,1417\n98116,3392\n98117,1556\n98118,292\n98119,875\n98120,209\n98121,98122\n98123,227\n98124,1052\n98124,1078\n98125,422\n98126,875\n98127,30\n98128,563\n98129,175\n98130,3161\n98131,298\n98132,2574\n98132,14989\n98133,736\n98133,3612\n98133,16687\n98134,872\n98135,509\n98135,510\n98136,292\n98139,292\n98140,875\n98141,500\n98142,1252\n98142,1253\n98143,585\n98145,7358\n98145,7363\n98146,72\n98147,366\n98148,98149\n98150,292\n98151,98149\n98152,417\n98152,1531\n98153,676\n98154,422\n98155,56\n98156,1132\n98157,781\n98158,130\n98159,779\n98160,292\n98161,1313\n98162,433\n98163,1893\n98164,2424\n98165,292\n98166,433\n98167,20\n98168,5547\n98169,2989\n98169,2991\n98170,1893\n98171,1096\n98172,1390\n98173,422\n98174,875\n98175,56\n98176,875\n98177,1\n98177,4\n98177,5\n98177,8\n98177,11\n98177,20\n98177,48\n98177,130\n98177,160\n98177,430\n98177,497\n98177,712\n98177,736\n98177,1016\n98177,1113\n98177,1147\n98177,3612\n98177,4252\n98177,16687\n98177,28130\n98177,124668\n98178,97\n98179,21944\n98181,126\n98181,457\n98181,1293\n98183,147\n98184,1010\n98186,1309\n98187,1096\n98188,5405\n98190,2617\n98191,3769\n98193,215\n98193,240\n98193,328\n98194,1033\n98196,209\n98197,875\n98198,1284\n98199,267\n98200,72\n98202,875\n98203,875\n98204,23011\n98205,718\n98207,467\n98208,2353\n98211,83\n98212,809\n98213,450\n98215,1544\n98216,875\n98217,3623\n98218,795\n98218,4355\n98219,1284\n98220,1132\n98221,781\n98222,68069\n98223,676\n98224,65\n98225,305\n98226,278\n98226,5405\n98227,41\n98227,698\n98227,1419\n98227,2775\n98227,60576\n98228,3623\n98229,9121\n98230,298\n98231,485\n98232,3623\n98233,7155\n98234,3331\n98235,6837\n98237,388\n98238,187\n98239,827\n98241,483\n98242,184\n98243,298\n98244,485\n98245,298\n98246,485\n98247,4\n98247,5\n98247,406\n98247,431\n98247,483\n98247,1776\n98248,3003\n98249,98250\n98251,693\n98252,5405\n98253,1983\n98254,8714\n98255,30\n98256,50\n98256,138\n98256,360\n98256,579\n98256,805\n98256,1033\n98256,1140\n98256,1572\n98256,1955\n98256,37414\n98257,30\n98258,333\n98260,258\n98261,287\n98262,657\n98262,1363\n98262,13361\n98264,1323\n98265,102\n98266,1326\n98267,408\n98268,302\n98269,98270\n98271,372\n98272,525\n98273,261\n98274,4177\n98275,79\n98275,104\n98275,186\n98275,302\n98275,805\n98275,861\n98275,1417\n98276,298\n98277,485\n98278,1332\n98279,615\n98279,666\n98279,783\n98279,941\n98280,7652\n98281,3872\n98282,298\n98283,485\n98284,372\n98284,442\n98284,1962\n98285,1436\n98286,302\n98287,1893\n98288,298\n98289,485\n98290,527\n98292,217\n98292,536\n98293,72\n98294,843\n98295,98296\n98298,450\n98299,3623\n98300,1556\n98301,332\n98301,1955\n98302,1655\n98303,462\n98303,8149\n98304,406\n98305,187\n98306,298\n98307,485\n98308,37\n98309,140\n98310,106\n98311,862\n98312,283\n98313,6068\n98314,2073\n98316,248\n98317,2995\n98319,392\n98319,1151\n98320,30\n98321,852\n98322,406\n98323,1179\n98324,1871\n98325,392\n98325,697\n98326,258\n98327,392\n98328,805\n98329,222\n98329,301\n98329,2421\n98329,5343\n98330,7652\n98331,240\n98332,843\n98333,1400\n98334,1102\n98335,760\n98336,726\n98337,158\n98338,818\n98339,58\n98341,1417\n98342,72\n98343,5405\n98344,1181\n98345,8180\n98346,3623\n98347,217\n98348,1749\n98349,98350\n98351,30\n98352,98353\n98352,119257\n98354,292\n98356,1939\n98357,3413\n98358,843\n98359,98360\n98361,3623\n98362,8270\n98363,292\n98364,467\n98365,269\n98366,81070\n98367,2319\n98368,292\n98369,483\n98370,298\n98371,485\n98372,3135\n98373,2224\n98374,422\n98375,56\n98376,3623\n98378,3623\n98379,147\n98379,151\n98380,2775\n98380,3623\n98381,2421\n98382,392\n98383,106\n98383,1147\n98383,2605\n98383,3999\n98384,693\n98385,7092\n98386,333\n98387,98388\n98389,1\n98390,255\n98391,1181\n98392,873\n98393,298\n98394,485\n98395,98396\n98397,392\n98398,805\n98400,1033\n98400,2244\n98401,171\n98402,772\n98403,289\n98403,290\n98403,94134\n98404,467\n98405,72\n98406,1608\n98409,86\n98410,1453\n98411,3623\n98412,376\n98413,195\n98414,30\n98415,527\n98416,1707\n98417,298\n98418,485\n98419,72\n98420,94409\n98421,885\n98421,13704\n98422,620\n98423,72\n98425,171\n98428,30\n98430,3623\n98431,422\n98432,56\n98433,171\n98434,98435\n98436,98437\n98438,98437\n98439,98437\n98440,98437\n98441,171\n98442,3623\n98443,1266\n98443,2048\n98444,30\n98445,1085\n98446,435\n98447,219\n98448,5405\n98449,1858\n98450,1860\n98451,818\n98452,72\n98453,2646\n98454,843\n98455,356\n98456,622\n98457,30\n98458,668\n98459,664\n98459,20359\n98460,98461\n98462,98463\n98464,1118\n98464,1531\n98465,271\n98466,994\n98467,298\n98468,485\n98469,1305\n98470,72\n98471,98472\n98473,2867\n98473,2868\n98474,292\n98475,292\n98476,1381\n98477,30\n98478,298\n98479,485\n98480,620\n98480,1515\n98481,30\n98482,72\n98483,298\n98484,485\n98485,30\n98486,298\n98487,485\n98488,652\n98489,98490\n98491,1016\n98492,760\n98493,137\n98494,422\n98495,56\n98496,852\n98497,98498\n98499,98500\n98501,72\n98502,30\n98503,2671\n98504,151\n98507,1326\n98508,430\n98508,758\n98509,98510\n98511,30\n98512,1282\n98513,366\n98514,557\n98515,557\n98516,30\n98517,3246\n98517,3247\n98518,1939\n98519,63\n98520,676\n98521,1265\n98521,1266\n98522,3209\n98523,332\n98524,8855\n98525,3148\n98526,5405\n98527,158\n98528,48\n98528,130\n98528,1007\n98528,1381\n98528,1551\n98528,3999\n98529,1149\n98530,333\n98531,2931\n98532,7358\n98532,7363\n98533,3872\n98534,2697\n98535,1102\n98536,652\n98537,953\n98538,6068\n98539,192\n98540,1414\n98541,7652\n98542,5101\n98543,623\n98544,202\n98544,203\n98544,925\n98545,2146\n98546,83\n98547,98548\n98549,30\n98550,1140\n98551,30\n98552,147\n98552,149\n98552,158\n98552,622\n98553,98554\n98555,192\n98556,1143\n98557,98558\n98559,72\n98560,72\n98561,72\n98562,72\n98563,2867\n98563,2868\n98564,72\n98565,72\n98566,1458\n98567,34\n98567,35\n98567,2146\n98568,644\n98569,516\n98570,68069\n98571,72\n98572,72\n98573,406\n98574,8854\n98575,422\n98576,56\n98578,516\n98579,298\n98580,485\n98581,98582\n98583,98584\n98583,131897\n98585,3193\n98586,4355\n98587,5405\n98588,1531\n98589,72\n98590,8788\n98591,422\n98592,56\n98593,298\n98594,485\n98595,1531\n98596,2073\n98597,3413\n98598,98599\n98600,2146\n98601,1882\n98602,72\n98603,217\n98603,1417\n98604,2867\n98604,2868\n98605,207\n98607,72\n98608,20\n98609,298\n98610,485\n98612,3209\n98613,98614\n98615,1515\n98616,430\n98616,994\n98617,72\n98618,98619\n98621,178\n98622,178\n98623,872\n98624,72\n98625,1429\n98626,671\n98627,269\n98628,98629\n98630,3069\n98631,98632\n98633,30\n98634,118\n98634,4597\n98635,72\n98636,14989\n98637,7358\n98637,7363\n98638,195\n98639,34\n98639,35\n98641,2146\n98642,72\n98643,577\n98643,21944\n98644,3069\n98645,481\n98646,874\n98646,1210\n98647,557\n98649,98648\n98650,50\n98650,79\n98650,393\n98650,406\n98650,493\n98650,585\n98650,586\n98650,592\n98650,704\n98651,98648\n98652,211\n98653,5440\n98654,98655\n98656,3724\n98657,1531\n98658,158\n98658,406\n98659,483\n98660,2146\n98661,873\n98661,874\n98661,1210\n98662,9026\n98663,147\n98664,98665\n98666,652\n98667,98668\n98669,358\n98670,30\n98671,98672\n98673,450\n98674,146\n98675,289\n98675,290\n98677,1789\n98678,98679\n98680,859\n98681,450\n98683,98684\n98685,10\n98686,45021\n98687,49887\n98688,45024\n98689,30766\n98690,98691\n98693,3148\n98694,5405\n98695,652\n98696,72\n98697,98698\n98699,1238\n98701,98702\n98703,98704\n98706,2116\n98707,682\n98707,72439\n98708,151\n98709,2590\n98710,2671\n98711,72\n98712,843\n98714,693\n98715,301\n98715,1133\n98716,1782\n98717,98718\n98720,137\n98721,98722\n98723,72\n98724,98725\n98728,255\n98729,366\n98730,366\n98731,98732\n98733,366\n98734,34\n98734,158\n98735,1452\n98736,1939\n98737,147\n98738,50\n98739,577\n98740,98741\n98742,72\n98744,30\n98745,366\n98746,861\n98746,1556\n98747,805\n98748,3872\n98749,272\n98750,714\n98751,98752\n98751,103623\n98753,72\n98754,98755\n98756,515\n98757,70631\n98758,328\n98759,2367\n98760,98761\n98762,687\n98763,98764\n98765,72\n98766,98767\n98768,575\n98769,4475\n98770,72\n98771,510\n98772,75912\n98773,292\n98774,98775\n98774,184886\n98776,118\n98776,4597\n98777,1449\n98778,292\n98779,355\n98781,1893\n98782,1858\n98783,1860\n98784,118\n98784,4597\n98786,1132\n98787,781\n98789,98790\n98791,233\n98793,98794\n98795,261\n98796,872\n98797,1359\n98798,48\n98799,1132\n98800,781\n98801,1381\n98802,868\n98803,98804\n98805,31122\n98806,209\n98807,809\n98808,178\n98809,1132\n98810,781\n98811,811\n98811,1619\n98812,72\n98813,446\n98814,192\n98815,527\n98816,868\n98817,1531\n98821,1977\n98821,1978\n98822,875\n98823,72\n98825,862\n98826,483\n98827,21944\n98828,104\n98829,693\n98830,994\n98831,137\n98832,97\n98834,76096\n98835,3623\n98836,3370\n98836,14453\n98837,200\n98837,772\n98837,28203\n98838,163\n98839,34\n98839,158\n98840,240\n98841,340\n98841,1058\n98842,1132\n98843,781\n98844,1417\n98845,313\n98845,1881\n98846,158\n98848,2590\n98849,9195\n98850,581\n98851,9195\n98852,1801\n98853,1181\n98855,422\n98856,72\n98857,422\n98858,422\n98859,422\n98860,98861\n98862,422\n98863,422\n98864,1287\n98865,422\n98866,422\n98867,422\n98868,422\n98869,292\n98870,333\n98875,1133\n98876,1556\n98877,98878\n98879,83\n98881,98882\n98885,907\n98886,30\n98887,1132\n98888,781\n98889,140\n98889,149\n98890,2424\n98891,422\n98893,30\n98894,10\n98897,72\n98898,652\n98899,455\n98900,98901\n98902,147\n98902,1803\n98903,72\n98905,292\n98906,932\n98907,30\n98908,22\n98909,991\n98910,483\n98911,1276\n98912,991\n98913,1243\n98914,7652\n98915,261\n98916,1983\n98917,714\n98917,1955\n98918,83\n98918,455\n98919,1132\n98920,781\n98921,171\n98923,1238\n98924,48\n98925,596\n98925,784\n98925,805\n98925,1973\n98925,2416\n98925,2417\n98926,2784\n98927,336\n98929,79\n98932,372\n98933,760\n98935,63\n98936,87\n98936,40360\n98937,620\n98939,278\n98940,217\n98940,313\n98940,503\n98940,1417\n98940,5130\n98941,1132\n98942,781\n98943,23783\n98944,1192\n98946,1201\n98947,5591\n98948,30\n98949,98950\n98949,103636\n98949,104636\n98949,110396\n98949,198056\n98951,1191\n98952,1188\n98953,30\n98954,17228\n98955,9121\n98956,45024\n98957,4066\n98958,184\n98959,2209\n98960,1509\n98961,455\n98961,212983\n98961,214114\n98961,217616\n98962,1707\n98963,2719\n98964,3370\n98964,14453\n98966,1390\n98968,392\n98969,422\n98970,56\n98971,98972\n98974,175\n98975,98975\n98976,850\n98977,298\n98978,420\n98979,98980\n98981,312\n98982,850\n98983,87\n98984,390\n98985,628\n98986,33611\n98987,269\n98988,24763\n98989,2205\n98989,33424\n98990,298\n98991,485\n98992,104\n98993,184\n98994,126\n98995,2626\n98996,98997\n98998,1506\n98999,22\n99001,30\n99002,406\n99003,788\n99003,1849\n99003,44725\n99004,875\n99005,1515\n99006,99007\n99008,273\n99008,39247\n99011,8270\n99012,1203\n99012,1955\n99013,1203\n99014,99015\n99016,1181\n99018,163\n99020,609\n99020,805\n99021,99022\n99024,18726\n99025,310\n99026,623\n99027,207\n99028,3623\n99030,422\n99031,392\n99032,56\n99033,77\n99034,99035\n99036,21944\n99037,1769\n99038,202\n99038,203\n99038,8996\n99039,72\n99040,99041\n99042,1085\n99043,364\n99044,1247\n99045,503\n99046,3623\n99047,99048\n99049,4611\n99050,1007\n99050,3041\n99050,8868\n99051,81\n99052,3585\n99055,538\n99058,240\n99063,726\n99064,99065\n99066,1983\n99067,99068\n99069,647\n99070,344\n99071,30\n99072,30\n99073,99074\n99075,1381\n99076,852\n99077,1980\n99077,8270\n99078,34\n99078,134\n99079,1414\n99080,151\n99080,493\n99081,99082\n99083,99084\n99085,392\n99085,1151\n99085,2436\n99086,206\n99087,647\n99088,344\n99089,175\n99090,3623\n99091,3209\n99092,298\n99093,647\n99094,344\n99095,79\n99096,287\n99097,192\n99097,779\n99098,72\n99099,99100\n99101,146\n99101,733\n99102,3695\n99104,1132\n99105,781\n99106,31934\n99107,1019\n99109,99109\n99110,3209\n99111,1019\n99112,3\n99113,349\n99114,702\n99114,1210\n99115,104\n99115,557\n99115,953\n99115,954\n99116,48\n99117,58\n99118,994\n99119,46\n99120,75912\n99122,10\n99123,877\n99124,30\n99124,200\n99124,772\n99124,28203\n99126,48\n99127,1231\n99129,72\n99130,15523\n99131,99132\n99134,1860\n99136,167\n99139,1132\n99140,781\n99141,30\n99142,1983\n99143,137\n99144,1235\n99144,1335\n99145,1181\n99148,356\n99149,1203\n99150,1776\n99151,10\n99152,1235\n99152,1335\n99153,3138\n99154,248\n99155,171\n99157,99158\n99159,30\n99160,151\n99160,1844\n99161,439\n99162,306\n99162,307\n99163,271\n99164,2506\n99166,3\n99166,932\n99166,8788\n99168,309\n99168,310\n99168,21944\n99169,58\n99169,71\n99169,251\n99169,255\n99169,287\n99169,493\n99169,563\n99169,577\n99169,626\n99169,671\n99169,698\n99169,788\n99169,795\n99169,801\n99169,811\n99169,991\n99169,1012\n99169,1068\n99169,1070\n99169,1133\n99169,1309\n99169,1368\n99169,1449\n99169,1474\n99169,1789\n99169,2367\n99169,2436\n99169,5961\n99169,6837\n99169,16331\n99169,185874\n99169,193129\n99170,1118\n99171,1132\n99172,781\n99173,1235\n99173,1335\n99174,99175\n99176,99177\n99178,298\n99179,485\n99180,599\n99181,99182\n99183,1983\n99184,292\n99185,72\n99186,21944\n99187,83\n99188,99189\n99190,202\n99190,203\n99190,1243\n99191,515\n99192,536\n99193,588\n99193,590\n99196,302\n99198,1821\n99201,850\n99202,99203\n99204,175\n99205,298\n99206,406\n99207,1511\n99207,3069\n99208,2697\n99209,3\n99210,267\n99211,19986\n99212,23011\n99213,30\n99214,1181\n99215,337\n99215,2244\n99216,577\n99217,21944\n99219,147\n99220,72\n99221,3623\n99222,3724\n99223,2867\n99223,2868\n99224,99225\n99226,422\n99227,56\n99228,72\n99229,225\n99230,3623\n99231,99232\n99233,99234\n99235,557\n99236,72\n99238,30\n99239,3623\n99240,3623\n99241,358\n99242,99243\n99244,2626\n99245,6323\n99246,557\n99247,676\n99248,298\n99249,485\n99250,557\n99251,99252\n99253,338\n99254,1531\n99255,333\n99255,336\n99255,406\n99256,14434\n99257,1085\n99258,292\n99259,577\n99260,1\n99261,818\n99262,1983\n99263,187\n99264,439\n99265,3623\n99266,99267\n99266,160603\n99268,99269\n99270,1284\n99271,455\n99272,652\n99273,30\n99274,18639\n99275,843\n99276,72\n99277,2116\n99278,850\n99279,1983\n99280,1983\n99281,481\n99282,875\n99283,99284\n99285,137\n99285,586\n99285,4039\n99285,99287\n99286,376\n99288,99289\n99290,298\n99291,485\n99292,250\n99292,1684\n99293,151\n99294,874\n99295,1359\n99296,16153\n99297,577\n99298,2371\n99299,118\n99299,4597\n99300,99301\n99302,885\n99302,13704\n99303,1118\n99304,422\n99305,56\n99306,10\n99307,99308\n99309,192\n99310,1939\n99311,10\n99312,1381\n99313,1265\n99313,1266\n99314,3209\n99315,859\n99316,225\n99317,8855\n99318,5405\n99319,2048\n99320,1149\n99321,333\n99322,2931\n99323,7358\n99323,7363\n99324,450\n99325,8270\n99326,714\n99327,2697\n99329,5440\n99330,298\n99331,485\n99333,953\n99334,6068\n99335,589\n99336,1414\n99337,1235\n99337,1335\n99338,99339\n99340,99341\n99340,109726\n99340,126436\n99340,153837\n99342,149\n99343,1260\n99344,298\n99345,485\n99346,310\n99347,8822\n99348,422\n99349,56\n99350,72\n99351,99352\n99354,118\n99354,4597\n99355,868\n99355,1151\n99356,18726\n99357,298\n99358,485\n99359,3413\n99360,207\n99361,338\n99362,1132\n99363,781\n99364,338\n99365,2590\n99366,99367\n99366,155451\n99368,1133\n99369,644\n99370,3413\n99371,255\n99372,366\n99373,99374\n99375,493\n99376,483\n99377,835\n99378,32\n99379,1983\n99380,99381\n99382,207\n99383,1149\n99384,4101\n99385,99386\n99387,120\n99388,99389\n99390,850\n99391,99392\n99393,99394\n99395,99396\n99397,872\n99398,1429\n99399,99400\n99403,99404\n99405,668\n99407,4487\n99408,30\n99408,772\n99409,258\n99412,104\n99412,134\n99412,135\n99412,136\n99412,137\n99412,850\n99413,99414\n99416,1181\n99416,1515\n99417,843\n99418,99419\n99420,2506\n99421,30\n99422,2699\n99424,99425\n99426,264\n99427,298\n99428,485\n99429,99430\n99431,310\n99432,589\n99433,17588\n99434,4039\n99435,2351\n99436,372\n99437,6323\n99438,697\n99438,1465\n99438,1836\n99439,1608\n99440,99441\n99442,3623\n99443,298\n99444,485\n99445,811\n99446,1143\n99447,795\n99448,119\n99449,1163\n99450,872\n99451,99452\n99453,44\n99454,99455\n99456,72\n99458,255\n99459,99460\n99464,280\n99464,17245\n99465,58\n99466,994\n99467,46\n99468,75912\n99469,99470\n99471,99472\n99473,44\n99474,206\n99475,850\n99476,14989\n99477,99478\n99479,602\n99480,920\n99481,99482\n99483,99484\n99486,99487\n99488,779\n99488,21944\n99489,2017\n99490,314\n99491,151\n99492,850\n99493,931\n99494,99495\n99497,920\n99498,30\n99499,20\n99500,1135\n99500,94409\n99501,30\n99502,1776\n99504,104\n99504,134\n99504,136\n99505,99506\n99507,355\n99508,137\n99509,697\n99509,1769\n99510,602\n99511,872\n99512,99513\n99514,99515\n99516,298\n99517,485\n99519,99520\n99521,818\n99522,781\n99523,1132\n99524,1612\n99525,801\n99525,1224\n99525,1241\n99526,30\n99526,200\n99526,772\n99526,28203\n99527,83\n99527,801\n99527,99528\n99529,86\n99529,4823\n99530,389\n99531,2574\n99532,1566\n99533,99534\n99535,99536\n99537,233\n99539,1132\n99540,781\n99541,273\n99543,22\n99544,1631\n99545,1983\n99546,298\n99547,485\n99548,1415\n99549,118\n99549,4597\n99550,79\n99551,30\n99552,640\n99553,640\n99554,99555\n99556,872\n99558,3538\n99559,422\n99560,56\n99561,1983\n99562,1210\n99562,2620\n99562,5718\n99563,99564\n99563,181390\n99565,2646\n99566,272\n99567,298\n99568,485\n99569,99570\n99571,34\n99571,35\n99571,389\n99572,422\n99574,3422\n99575,422\n99576,3623\n99577,422\n99578,422\n99579,422\n99580,422\n99581,56\n99582,422\n99583,422\n99584,422\n99585,422\n99586,422\n99587,10\n99588,298\n99589,485\n99590,1858\n99591,1860\n99592,868\n99593,8072\n99594,811\n99595,2775\n99596,447\n99597,907\n99597,148742\n99598,83\n99599,1983\n99600,1983\n99601,1983\n99602,392\n99602,1240\n99602,1465\n99603,3623\n99604,298\n99605,485\n99606,406\n99606,579\n99606,620\n99606,118336\n99608,579\n99609,1132\n99610,781\n99611,134\n99611,137\n99611,1368\n99612,99613\n99612,105194\n99612,105323\n99614,1132\n99615,781\n99616,1893\n99617,1983\n99618,1983\n99619,99620\n99621,298\n99622,485\n99623,2699\n99624,1132\n99625,781\n99626,167\n99626,1231\n99626,1241\n99626,1837\n99626,2083\n99626,2557\n99627,932\n99629,1033\n99630,3623\n99631,422\n99632,56\n99633,77\n99634,422\n99635,56\n99636,1983\n99638,72\n99639,850\n99640,3623\n99641,372\n99642,1298\n99643,2782\n99644,3524\n99645,1983\n99646,1559\n99647,3623\n99648,83\n99649,175\n99650,850\n99651,298\n99652,30\n99653,1983\n99654,509\n99655,1803\n99657,72\n99658,1132\n99659,781\n99660,3623\n99661,97\n99662,217\n99663,99664\n99665,1370\n99666,818\n99667,2048\n99668,422\n99669,56\n99670,298\n99671,485\n99673,3623\n99675,240\n99676,72\n99677,3623\n99679,516\n99679,2168\n99680,1390\n99681,390\n99681,1085\n99681,1522\n99683,97\n99684,3623\n99685,1149\n99686,1\n99687,392\n99688,1707\n99689,538\n99689,2353\n99690,72\n99692,1287\n99693,171\n99694,346\n99694,1033\n99695,9029\n99696,3138\n99697,3069\n99698,72\n99699,72\n99700,99701\n99700,103539\n99700,170238\n99700,243818\n99702,3623\n99703,192\n99703,202\n99703,203\n99703,663\n99704,10\n99705,3069\n99706,72\n99708,1983\n99709,1983\n99710,99711\n99710,129460\n99712,298\n99713,485\n99714,99715\n99716,202\n99716,203\n99716,4177\n99717,72\n99719,3069\n99720,623\n99720,1240\n99722,1608\n99723,240\n99723,298\n99723,1462\n99723,8180\n99723,8537\n99724,79\n99724,760\n99726,99727\n99730,99731\n99732,849\n99732,9457\n99732,207659\n99733,302\n99735,1977\n99735,1978\n99736,536\n99736,1417\n99737,579\n99737,2373\n99738,1132\n99739,781\n99740,248\n99741,1132\n99742,781\n99744,393\n99745,397\n99746,1313\n99747,137\n99748,158\n99749,538\n99750,160\n99750,693\n99750,3538\n99751,99752\n99753,151\n99755,195\n99757,3069\n99758,850\n99759,167\n99759,73570\n99760,58\n99761,622\n99764,99765\n99767,58\n99768,972\n99769,175\n99770,2979\n99771,1085\n99772,1127\n99773,775\n99774,298\n99776,8270\n99777,192\n99777,500\n99778,1474\n99779,1818\n99780,147\n99780,422\n99781,301\n99782,442\n99783,1220\n99783,1222\n99784,160\n99785,24505\n99786,151\n99786,1070\n99786,3804\n99786,7429\n99790,852\n99792,536\n99793,104\n99794,200\n99794,772\n99795,240\n99797,5440\n99798,7358\n99798,7363\n99799,818\n99799,3247\n99801,240\n99802,968\n99802,1293\n99803,163\n99804,21944\n99805,302\n99805,809\n99805,1289\n99805,1509\n99805,3999\n99806,850\n99807,109568\n99807,178422\n99809,10\n99811,775\n99812,5326\n99813,160\n99814,3623\n99815,772\n99816,72\n99817,647\n99818,344\n99819,406\n99819,620\n99820,647\n99821,344\n99822,72\n99824,309\n99824,310\n99824,3623\n99824,221292\n99825,1298\n99825,1749\n99825,72764\n99827,772\n99828,99829\n99830,3623\n99831,2620\n99833,3623\n99835,1939\n99836,50\n99838,192\n99839,1983\n99840,3623\n99842,1818\n99843,99844\n99845,392\n99846,1181\n99847,481\n99848,1803\n99850,1983\n99851,6424\n99852,953\n99853,1140\n99853,2443\n99854,557\n99855,805\n99856,973\n99858,3623\n99859,1479\n99859,48505\n99860,99861\n99862,99863\n99864,3623\n99865,76096\n99867,4691\n99868,850\n99869,99870\n99871,2116\n99872,209\n99873,217\n99873,1417\n99874,392\n99875,83\n99875,1058\n99875,1370\n99875,1821\n99875,2168\n99875,2292\n99875,8235\n99876,392\n99877,22\n99878,120\n99878,590\n99878,1419\n99879,99880\n99879,120860\n99882,99883\n99884,980\n99885,1010\n99886,83\n99887,1132\n99888,781\n99889,640\n99890,841\n99891,99892\n99893,99894\n99895,4078\n99896,1980\n99896,8991\n99897,99898\n99899,536\n99901,862\n99902,1379\n99903,309\n99903,310\n99904,920\n99905,364\n99905,2590\n99907,973\n99908,640\n99910,1243\n99911,118\n99911,4597\n99912,676\n99913,178\n99914,4935\n99915,2244\n99916,126\n99916,1118\n99917,344\n99917,647\n99918,1608\n99919,31934\n99920,366\n99921,875\n99922,83\n99922,668\n99922,841\n99922,843\n99922,1801\n99923,3623\n99924,1247\n99925,310\n99926,743\n99927,493\n99928,261\n99929,1181\n99930,298\n99931,485\n99932,10\n99933,2775\n99934,809\n99935,99936\n99937,1001\n99938,99939\n99940,215\n99941,406\n99942,187\n99943,99944\n99945,312\n99947,99948\n99951,72\n99952,99953\n99955,147\n99955,158\n99955,192\n99955,195\n99955,202\n99955,203\n99955,252\n99955,301\n99955,337\n99955,406\n99955,493\n99955,509\n99955,663\n99955,664\n99955,1181\n99955,1235\n99955,1335\n99955,1590\n99955,1782\n99955,2178\n99955,4545\n99955,21944\n99956,72\n99957,3804\n99958,151\n99959,1844\n99960,72\n99961,72\n99962,1462\n99962,9010\n99963,1046\n99964,99965\n99966,8719\n99967,138\n99968,865\n99969,557\n99970,137\n99971,118\n99971,4597\n99972,21944\n99973,88820\n99975,99976\n99977,72\n99978,557\n99979,333\n99980,3623\n99981,557\n99982,557\n99983,557\n99984,8270\n99986,99987\n99988,72\n99989,1801\n99990,493\n99990,682\n99990,72439\n99991,818\n99992,13661\n99993,99994\n99995,30\n99996,99997\n99998,611\n99998,920\n99999,1\n100001,100002\n100003,21944\n100004,289\n100004,290\n100005,72\n100006,20757\n100007,100008\n100009,9195\n100010,693\n100011,994\n100014,100015\n100016,2719\n100017,3370\n100017,14453\n100018,178\n100019,192\n100020,2506\n100021,115\n100021,118\n100029,141912\n100030,118\n100030,4597\n100031,31934\n100032,264\n100034,862\n100035,356\n100036,100037\n100038,10\n100038,577\n100038,2017\n100039,376\n100040,920\n100041,100042\n100043,100044\n100045,100046\n100047,100046\n100048,1572\n100049,2048\n100050,72\n100051,200\n100052,433\n100053,1287\n100053,9030\n100054,100055\n100056,72\n100057,151\n100058,100059\n100060,106\n100060,195\n100060,1033\n100061,1556\n100062,151\n100063,72\n100064,2737\n100064,100065\n100066,100067\n100068,1\n100069,862\n100070,8270\n100071,252\n100072,158\n100072,336\n100072,1425\n100073,100074\n100075,195\n100076,310\n100077,682\n100077,72439\n100078,151\n100080,483\n100081,611\n100081,920\n100082,72\n100083,72\n100087,100088\n100089,19986\n100090,10\n100091,7358\n100091,7363\n100092,2105\n100093,1773\n100094,4980\n100095,693\n100095,3370\n100096,192\n100098,30\n100098,1235\n100099,111\n100100,536\n100101,422\n100102,422\n100103,422\n100104,422\n100105,422\n100106,422\n100107,422\n100108,422\n100109,422\n100110,422\n100112,1353\n100113,1955\n100114,2506\n100116,18726\n100117,269\n100118,163\n100119,97\n100120,100121\n100122,628\n100123,850\n100124,918\n100125,536\n100125,3247\n100126,6888\n100127,2868\n100127,2995\n100128,225\n100129,4101\n100130,100131\n100132,8884\n100134,1085\n100135,18726\n100136,100137\n100138,7360\n100139,240\n100139,435\n100139,818\n100140,100141\n100142,344\n100142,5547\n100144,4101\n100145,841\n100146,2797\n100148,100149\n100150,872\n100151,100152\n100153,44\n100154,100155\n100154,131524\n100154,133324\n100157,872\n100160,100161\n100162,100163\n100164,79\n100165,233\n100166,435\n100167,676\n100168,63\n100169,310\n100170,100171\n100172,366\n100173,366\n100174,366\n100175,366\n100176,366\n100178,1033\n100179,859\n100180,859\n100181,859\n100182,859\n100183,859\n100185,8180\n100188,372\n100189,8180\n100190,3370\n100190,14453\n100191,85\n100191,4549\n100192,355\n100193,872\n100194,994\n100195,100196\n100197,99762\n100198,310\n100199,795\n100200,68\n100200,859\n100201,2828\n100202,30\n100202,310\n100203,874\n100204,1419\n100205,10\n100206,489\n100207,100208\n100210,100211\n100212,1132\n100213,781\n100215,1132\n100216,781\n100217,3069\n100218,68\n100218,697\n100218,1175\n100218,2590\n100219,510\n100220,100221\n100225,697\n100225,1151\n100225,1769\n100226,298\n100227,485\n100228,100229\n100230,100231\n100232,41\n100234,68467\n100235,83\n100236,932\n100238,93\n100238,94\n100239,147\n100240,100241\n100242,100243\n100244,18726\n100245,2048\n100246,918\n100247,497\n100248,163\n100249,2244\n100250,1127\n100251,1181\n100252,850\n100253,100254\n100255,841\n100256,86\n100257,4611\n100258,2797\n100259,100260\n100261,100262\n100263,535\n100264,850\n100265,100266\n100267,1323\n100268,102\n100269,1326\n100270,779\n100270,68069\n100271,100272\n100274,1058\n100275,1010\n100277,1983\n100278,34\n100278,35\n100279,2995\n100280,15573\n100281,1659\n100282,2697\n100283,240\n100284,100285\n100286,100287\n100286,128496\n100288,100289\n100290,850\n100291,1132\n100292,781\n100293,2244\n100294,872\n100295,731\n100296,1181\n100297,202\n100297,203\n100298,298\n100299,485\n100300,1983\n100301,72\n100302,68467\n100304,72\n100305,1241\n100305,2083\n100306,588\n100306,590\n100307,859\n100308,30\n100310,49887\n100311,333\n100311,1893\n100312,30\n100313,1085\n100314,30\n100315,1132\n100316,781\n100317,100318\n100320,100321\n100322,827\n100323,3623\n100324,100325\n100326,94409\n100328,100329\n100330,100331\n100332,2506\n100333,1983\n100334,100335\n100336,30\n100337,100338\n100339,873\n100339,2557\n100340,100341\n100342,72\n100343,1551\n100344,72\n100345,30\n100346,30\n100347,100348\n100349,30\n100350,309\n100350,310\n100351,693\n100352,100353\n100354,30\n100355,30\n100358,100359\n100360,805\n100361,3447\n100362,298\n100363,485\n100364,100365\n100366,10\n100367,72\n100368,433\n100369,72\n100370,100371\n100372,100373\n100375,14483\n100377,6051\n100378,97\n100379,30\n100381,1181\n100382,72\n100383,859\n100384,2989\n100384,2991\n100385,100386\n100387,1479\n100388,390\n100389,1132\n100390,781\n100391,1132\n100392,781\n100395,1132\n100396,781\n100397,100398\n100399,83\n100400,151\n100401,30\n100402,217\n100403,100404\n100405,151\n100407,100408\n100409,149\n100409,602\n100410,100411\n100410,100452\n100412,100413\n100414,160\n100415,1132\n100416,781\n100417,3413\n100418,100419\n100420,100421\n100422,8270\n100423,515\n100424,71\n100424,217\n100424,663\n100425,483\n100426,100411\n100427,100428\n100429,843\n100430,100431\n100432,1016\n100432,2210\n100433,671\n100434,795\n100435,72\n100436,55849\n100437,100438\n100439,72\n100441,1\n100441,859\n100442,44\n100443,100444\n100445,298\n100446,485\n100447,1282\n100448,273\n100449,100450\n100451,2351\n100453,207\n100454,1149\n100456,1655\n100457,255\n100458,18726\n100459,163\n100460,452\n100461,100462\n100463,100464\n100465,100466\n100467,10\n100469,5405\n100471,100472\n100473,100473\n100474,100475\n100476,497\n100477,918\n100478,100479\n100480,3623\n100481,100481\n100482,8270\n100483,2867\n100483,2868\n100484,100485\n100486,795\n100489,8180\n100490,100491\n100492,676\n100493,21944\n100494,1188\n100495,44013\n100496,292\n100497,58\n100497,72\n100498,8855\n100499,100500\n100501,1181\n100502,1368\n100503,1634\n100504,9121\n100505,3960\n100506,45023\n100507,96187\n100508,9560\n100509,2574\n100510,17334\n100511,45310\n100512,309\n100512,310\n100513,44013\n100514,5976\n100515,31977\n100515,100516\n100517,3413\n100518,34\n100518,35\n100518,1019\n100518,1572\n100518,5265\n100519,100520\n100521,195\n100522,24505\n100524,973\n100525,2797\n100526,714\n100526,2797\n100527,273\n100528,503\n100530,704\n100531,588\n100531,590\n100532,100533\n100534,2244\n100535,5405\n100536,203\n100536,3872\n100537,714\n100538,100539\n100541,3209\n100542,100543\n100546,2797\n100547,100548\n100549,657\n100550,100551\n100552,907\n100553,6068\n100554,100555\n100556,588\n100556,590\n100557,872\n100558,535\n100559,107\n100560,2416\n100560,2417\n100561,292\n100562,338\n100563,298\n100564,1133\n100565,3538\n100566,100567\n100568,15573\n100569,20790\n100570,973\n100571,2995\n100572,158\n100573,452\n100574,9010\n100575,292\n100576,100577\n100578,233\n100579,2931\n100581,8180\n100582,100583\n100584,100585\n100586,100587\n100589,100590\n100591,10\n100592,217\n100593,1462\n100593,9010\n100594,1309\n100595,628\n100596,100597\n100598,100599\n100600,1462\n100600,9010\n100601,366\n100602,366\n100603,192\n100604,366\n100605,3999\n100606,20790\n100609,349\n100610,100611\n100613,862\n100614,118\n100614,4597\n100615,100616\n100617,134\n100618,1313\n100619,310\n100620,8855\n100621,8855\n100622,872\n100623,355\n100624,72\n100625,344\n100626,285\n100627,100628\n100629,100630\n100631,100630\n100632,100630\n100633,100630\n100636,100637\n100636,109422\n100638,100639\n100638,184800\n100640,10\n100641,78232\n100642,100643\n100644,7652\n100645,1769\n100646,30\n100647,59313\n100648,406\n100649,2797\n100650,100651\n100652,7652\n100653,63\n100654,9195\n100655,1414\n100656,2697\n100657,8788\n100658,22924\n100659,1359\n100660,310\n100661,72\n100662,344\n100663,285\n100664,65\n100665,273\n100666,211\n100667,1379\n100668,8991\n100670,100671\n100672,4453\n100673,171\n100674,1858\n100675,1860\n100676,1858\n100677,1860\n100678,48\n100679,2266\n100680,252\n100681,33082\n100682,100683\n100684,100685\n100686,298\n100687,485\n100688,100689\n100688,236961\n100690,6068\n100691,8270\n100692,5440\n100693,417\n100694,9195\n100695,8270\n100696,23010\n100697,100698\n100699,30\n100700,100701\n100703,100704\n100705,8270\n100706,932\n100707,3999\n100708,100709\n100710,682\n100710,72439\n100711,8270\n100712,100713\n100714,1\n100715,202\n100715,203\n100716,850\n100717,1462\n100717,7124\n100718,1133\n100719,868\n100720,907\n100721,2351\n100722,23010\n100723,6068\n100724,206\n100726,364\n100728,83\n100729,310\n100730,3161\n100731,1313\n100732,309\n100732,310\n100733,1634\n100734,100735\n100736,726\n100737,80266\n100738,589\n100739,1414\n100741,100741\n100743,100744\n100745,310\n100746,953\n100747,298\n100748,485\n100749,171\n100750,676\n100751,2995\n100752,4571\n100753,100754\n100755,240\n100756,795\n100757,5405\n100759,21944\n100760,7652\n100761,20813\n100762,2995\n100763,100764\n100765,973\n100766,3413\n100767,206\n100768,8992\n100769,10\n100770,841\n100770,1634\n100770,6051\n100770,18726\n100771,100772\n100773,3999\n100774,1118\n100775,372\n100776,2146\n100777,1252\n100777,1253\n100778,290\n100778,1572\n100779,6027\n100780,2697\n100781,3413\n100782,100783\n100784,30\n100785,932\n100786,1033\n100787,457\n100788,310\n100789,310\n100790,4475\n100791,100792\n100793,126\n100794,310\n100795,1102\n100796,973\n100797,516\n100798,23011\n100799,100800\n100801,100802\n100804,45023\n100805,17334\n100806,96187\n100807,9560\n100808,3960\n100809,27356\n100810,45024\n100811,14366\n100812,704\n100813,389\n100814,202\n100814,203\n100815,13661\n100816,2506\n100817,861\n100818,872\n100819,872\n100820,30\n100821,843\n100822,97\n100823,1707\n100824,2697\n100825,973\n100826,8855\n100827,1659\n100828,34\n100828,292\n100829,452\n100830,158\n100831,779\n100832,3148\n100833,1011\n100834,5726\n100835,100836\n100837,310\n100838,8822\n100839,795\n100841,100842\n100843,100844\n100845,1016\n100846,8855\n100847,100848\n100849,45021\n100850,45024\n100851,49887\n100852,30766\n100853,100854\n100855,178\n100857,100858\n100859,2697\n100860,100861\n100862,126\n100863,8855\n100864,100865\n100866,3148\n100867,626\n100868,34\n100868,158\n100869,8463\n100870,147\n100871,184\n100872,10\n100873,34\n100873,19227\n100874,479\n100875,333\n100875,406\n100876,5405\n100877,100878\n100879,310\n100880,640\n100881,100882\n100883,100884\n100885,160\n100886,8855\n100887,100888\n100890,126\n100891,100892\n100893,4078\n100894,652\n100896,21944\n100897,8855\n100898,1684\n100898,2334\n100899,2929\n100900,1052\n100901,2697\n100902,100903\n100904,100903\n100905,100903\n100906,100903\n100907,100903\n100908,2506\n100909,2574\n100910,50\n100911,1368\n100912,875\n100913,714\n100914,3872\n100916,8855\n100917,100918\n100919,192\n100920,10\n100921,14989\n100922,1201\n100923,589\n100924,994\n100925,50\n100926,10\n100927,100928\n100929,9560\n100930,192\n100931,406\n100932,100933\n100934,8855\n100935,406\n100937,714\n100938,3872\n100939,779\n100940,202\n100940,203\n100940,372\n100940,1572\n100941,2105\n100942,841\n100945,850\n100946,207\n100947,2697\n100950,100951\n100952,1\n100953,652\n100954,628\n100955,275\n100956,1102\n100957,310\n100958,1265\n100958,1266\n100959,100960\n100961,714\n100962,8270\n100963,203\n100963,17588\n100964,3872\n100965,100966\n100965,117585\n100967,1266\n100967,5714\n100968,818\n100969,1634\n100970,78232\n100971,726\n100972,779\n100974,557\n100975,1181\n100976,31934\n100977,192\n100977,332\n100979,3161\n100980,652\n100981,479\n100983,18726\n100984,536\n100985,1016\n100986,1181\n100987,163\n100988,7360\n100989,704\n100990,100991\n100992,100993\n100994,1235\n100994,1335\n100995,2867\n100995,2868\n100996,100997\n100998,652\n100998,1007\n100999,406\n101000,8270\n101001,663\n101001,664\n101002,640\n101003,184\n101004,2574\n101005,101006\n101007,1133\n101009,2929\n101010,101011\n101013,1285\n101014,693\n101015,5440\n101016,2697\n101017,953\n101018,8270\n101019,6068\n101020,589\n101021,1414\n101022,30\n101023,211\n101024,5405\n101025,1379\n101026,2697\n101027,2668\n101028,298\n101029,485\n101030,34580\n101031,1016\n101031,2868\n101032,918\n101033,2995\n101034,1033\n101035,628\n101036,6888\n101037,2574\n101039,101040\n101041,30\n101042,3872\n101043,101044\n101045,333\n101046,3413\n101047,1265\n101047,1266\n101048,1181\n101048,1392\n101050,298\n101051,485\n101052,1181\n101053,258\n101054,101055\n101056,337\n101057,1414\n101058,307\n101058,20359\n101059,663\n101059,664\n101060,589\n101061,3161\n101062,2931\n101063,6068\n101064,4039\n101065,219\n101066,7652\n101067,45960\n101068,101069\n101070,859\n101071,101072\n101073,1181\n101074,2379\n101075,3447\n101076,7360\n101077,8270\n101078,862\n101080,3447\n101081,8270\n101082,1449\n101084,393\n101086,6027\n101087,1707\n101088,17228\n101089,968\n101089,101090\n101091,10\n101092,24505\n101093,24505\n101094,4060\n101095,31934\n101096,9560\n101097,101098\n101097,101856\n101099,298\n101100,485\n101101,1133\n101101,7363\n101102,557\n101103,101104\n101105,557\n101106,862\n101107,101108\n101109,557\n101110,557\n101112,406\n101113,2048\n101115,18726\n101116,1043\n101117,859\n101118,298\n101119,485\n101120,101121\n101122,1266\n101122,2048\n101123,479\n101124,101125\n101124,105955\n101126,392\n101127,326\n101128,298\n101129,485\n101131,3846\n101132,146\n101133,22\n101135,298\n101136,485\n101137,225\n101138,1179\n101140,1414\n101141,101142\n101144,206\n101145,30\n101146,34\n101146,35\n101146,1801\n101147,298\n101148,485\n101149,202\n101149,203\n101150,78400\n101151,17588\n101152,34\n101152,290\n101152,7652\n101153,420\n101154,422\n101155,19986\n101157,298\n101158,485\n101159,101160\n101161,2719\n101162,1287\n101163,101164\n101165,101164\n101166,1163\n101167,2797\n101168,7155\n101169,393\n101170,4276\n101171,87\n101172,8992\n101173,4192\n101173,4193\n101174,298\n101175,485\n101176,206\n101177,4165\n101179,101180\n101181,8992\n101182,298\n101183,485\n101184,30\n101185,101186\n101187,101186\n101188,101186\n101189,101186\n101190,101186\n101191,1939\n101192,101193\n101194,101195\n101196,1033\n101197,184\n101198,151\n101199,101200\n101201,101202\n101203,137\n101204,682\n101204,72439\n101205,2048\n101206,151\n101208,151\n101209,3258\n101209,6682\n101210,10\n101211,101212\n101213,101214\n101216,151\n101217,1359\n101218,101219\n101218,104206\n101218,104738\n101218,105484\n101220,3069\n101221,44\n101222,2353\n101223,101224\n101225,779\n101226,788\n101227,273\n101228,7124\n101229,9560\n101230,184\n101231,101232\n101233,195\n101234,3804\n101235,101236\n101237,211\n101238,3623\n101239,3623\n101240,202\n101240,203\n101240,925\n101241,33611\n101242,30\n101242,211\n101242,557\n101242,1102\n101242,5440\n101243,953\n101244,6068\n101245,422\n101246,422\n101247,422\n101248,422\n101249,422\n101250,422\n101251,422\n101252,422\n101253,422\n101254,422\n101255,1414\n101256,841\n101256,1801\n101257,422\n101258,417\n101259,422\n101260,56\n101261,101262\n101264,1939\n101265,147\n101266,50\n101267,5375\n101268,676\n101269,310\n101270,489\n101271,100888\n101272,647\n101273,344\n101274,652\n101275,805\n101276,779\n101277,1287\n101277,9030\n101278,272\n101279,13\n101280,184\n101281,101282\n101283,101284\n101285,980\n101286,31896\n101287,1181\n101288,3413\n101289,101290\n101291,2868\n101291,2995\n101292,24505\n101293,101294\n101295,713\n101296,483\n101297,175\n101298,151\n101299,479\n101300,298\n101301,657\n101302,1419\n101303,18726\n101304,424\n101304,1634\n101305,101306\n101307,101306\n101308,101306\n101309,30766\n101310,163\n101311,118\n101311,4597\n101312,68467\n101314,8270\n101315,704\n101316,1119\n101317,1181\n101318,8270\n101320,843\n101321,187\n101323,45960\n101324,17772\n101325,2868\n101325,2995\n101326,8598\n101327,119\n101328,3447\n101330,6726\n101331,14366\n101332,9323\n101333,9195\n101334,7\n101335,6263\n101336,4980\n101337,3295\n101338,19986\n101339,16045\n101340,9560\n101341,24332\n101342,23011\n101343,17334\n101344,9121\n101345,3960\n101346,2574\n101347,28072\n101348,3246\n101349,118\n101349,4597\n101350,175\n101351,298\n101352,101353\n101354,151\n101355,8270\n101357,3413\n101358,68467\n101359,126\n101360,289\n101360,290\n101361,9025\n101362,1181\n101363,118\n101363,4597\n101364,3413\n101365,3370\n101365,14453\n101366,101367\n101368,192\n101369,779\n101369,1181\n101370,9121\n101372,8822\n101373,3447\n101374,1939\n101375,101376\n101378,41\n101379,310\n101380,101381\n101382,101381\n101383,101381\n101384,101381\n101385,101381\n101386,6051\n101387,101388\n101387,109297\n101389,298\n101390,3413\n101391,41\n101392,101393\n101394,292\n101395,294\n101396,298\n101397,292\n101398,1452\n101399,296\n101400,1955\n101401,1188\n101402,290\n101402,372\n101403,101404\n101405,2697\n101406,81\n101407,676\n101408,9195\n101409,101410\n101411,21944\n101412,693\n101413,406\n101414,3148\n101415,907\n101416,872\n101417,8991\n101418,175\n101419,298\n101420,1046\n101421,406\n101422,1238\n101424,30\n101425,1181\n101426,872\n101427,872\n101428,101429\n101430,68467\n101431,101432\n101433,1392\n101434,1133\n101435,3413\n101436,693\n101437,5343\n101438,7358\n101438,7363\n101439,1102\n101440,2105\n101441,101441\n101442,101443\n101444,83\n101445,8868\n101447,83\n101448,23011\n101449,101450\n101451,366\n101452,366\n101453,101454\n101455,101456\n101457,2931\n101458,310\n101459,101460\n101461,101460\n101462,101463\n101465,101464\n101467,2574\n101468,333\n101469,222\n101470,1572\n101471,147\n101472,240\n101473,611\n101474,68\n101475,75912\n101476,63471\n101477,101478\n101479,233\n101480,1210\n101481,264\n101482,151\n101483,101484\n101485,301\n101485,968\n101485,1782\n101486,2048\n101487,310\n101488,483\n101489,7360\n101490,1119\n101491,7360\n101492,707\n101494,298\n101495,485\n101496,7652\n101497,1881\n101498,187\n101498,302\n101498,305\n101498,868\n101498,1130\n101498,1326\n101498,8149\n101499,254\n101500,392\n101501,19986\n101502,298\n101503,485\n101504,644\n101505,744\n101505,2083\n101506,1381\n101506,1436\n101507,101507\n101508,31896\n101509,101510\n101511,622\n101512,1046\n101513,298\n101514,485\n101515,973\n101516,452\n101517,15573\n101518,328\n101519,3413\n101520,1381\n101520,2620\n101521,136\n101522,2048\n101523,2416\n101523,2417\n101524,101525\n101526,1118\n101527,1467\n101529,101530\n101531,1265\n101531,1266\n101532,406\n101533,101534\n101535,206\n101536,3447\n101537,101538\n101539,163\n101540,175\n101541,3960\n101542,2351\n101543,1132\n101544,298\n101545,781\n101548,24505\n101549,184\n101550,835\n101551,22\n101551,349\n101551,444\n101551,1300\n101551,1805\n101551,2979\n101551,3207\n101551,5662\n101553,389\n101554,101555\n101556,356\n101557,355\n101558,3623\n101559,1479\n101559,48505\n101560,160\n101561,99\n101561,779\n101561,141912\n101562,310\n101563,203\n101563,3872\n101564,272\n101565,2436\n101567,298\n101568,485\n101569,217\n101569,872\n101570,65\n101571,481\n101572,10\n101574,585\n101575,217\n101575,3507\n101576,273\n101577,389\n101578,1010\n101579,640\n101580,1072\n101581,1132\n101582,781\n101583,158\n101583,240\n101584,101585\n101586,1118\n101587,134\n101587,137\n101587,850\n101589,1132\n101590,781\n101591,1016\n101592,3447\n101593,671\n101594,252\n101594,1220\n101594,1222\n101595,2296\n101596,3623\n101597,1392\n101598,809\n101599,406\n101600,1132\n101601,781\n101602,611\n101603,58\n101604,994\n101605,46\n101606,75912\n101607,272\n101608,58\n101609,994\n101610,46\n101611,75912\n101612,623\n101612,1805\n101613,2617\n101613,4193\n101614,356\n101615,2296\n101616,13\n101617,1388\n101619,3623\n101620,28072\n101621,346\n101622,58\n101623,994\n101624,46\n101625,75912\n101626,333\n101626,462\n101626,483\n101626,571\n101626,861\n101626,1181\n101626,2116\n101626,3555\n101627,101628\n101629,390\n101629,1167\n101630,980\n101631,101632\n101633,175\n101634,58\n101635,6861\n101636,298\n101637,1224\n101638,31206\n101640,31977\n101642,3246\n101643,58\n101644,101645\n101647,312\n101648,68\n101648,195\n101648,3804\n101649,222\n101649,657\n101650,1132\n101651,781\n101652,33328\n101652,102413\n101655,697\n101656,872\n101657,158\n101657,3193\n101658,417\n101659,147\n101660,68467\n101661,1132\n101661,1801\n101662,151\n101663,333\n101665,4146\n101667,192\n101667,217\n101668,7652\n101669,58\n101670,535\n101671,1001\n101672,101673\n101674,1381\n101675,272\n101676,101677\n101678,259\n101678,577\n101678,859\n101678,2373\n101678,4165\n101678,192522\n101679,255\n101680,1556\n101681,1298\n101682,272\n101682,841\n101683,6068\n101687,25348\n101687,101688\n101688,197740\n101690,16614\n101691,310\n101692,1858\n101693,1860\n101694,640\n101695,83\n101696,1132\n101697,781\n101698,1118\n101699,83\n101700,1132\n101701,101702\n101701,117546\n101703,781\n101704,493\n101705,306\n101705,307\n101706,72\n101707,422\n101708,56\n101709,1001\n101710,101711\n101712,1132\n101713,781\n101714,337\n101714,358\n101714,586\n101714,1319\n101714,1402\n101714,1837\n101714,3297\n101714,6789\n101715,151\n101716,390\n101716,1715\n101717,101718\n101719,392\n101719,1146\n101720,1298\n101721,302\n101721,2116\n101722,147\n101722,149\n101722,158\n101722,206\n101722,406\n101722,1458\n101722,1515\n101722,2244\n101722,80266\n101722,89035\n101722,149534\n101724,3623\n101725,101726\n101727,2443\n101728,1390\n101729,3623\n101732,859\n101733,101734\n101735,217\n101735,536\n101735,657\n101735,4223\n101735,7768\n101735,13137\n101736,101737\n101738,422\n101739,118\n101739,4597\n101740,302\n101740,489\n101740,1556\n101741,47\n101741,2469\n101742,101743\n101744,1132\n101745,781\n101747,1132\n101748,781\n101749,101750\n101751,1289\n101752,5440\n101753,1707\n101754,178\n101755,101756\n101758,3999\n101759,264\n101760,333\n101761,626\n101762,1132\n101763,781\n101764,75912\n101765,602\n101767,1381\n101768,6027\n101769,2744\n101770,149\n101771,577\n101771,980\n101772,577\n101773,101774\n101775,676\n101777,298\n101778,485\n101779,1247\n101780,101781\n101782,1452\n101783,3041\n101784,255\n101785,1551\n101786,101787\n101788,1551\n101789,1007\n101790,2367\n101791,34\n101791,605\n101791,33424\n101792,1105\n101793,1033\n101794,3623\n101795,457\n101797,4078\n101799,1381\n101800,3623\n101801,347\n101802,1639\n101803,7124\n101804,22\n101804,1634\n101806,996\n101807,626\n101808,97\n101808,192\n101808,302\n101808,483\n101808,615\n101808,843\n101808,929\n101808,1068\n101808,1782\n101809,1983\n101809,138686\n101809,188791\n101811,240\n101812,6303\n101813,596\n101814,994\n101815,3148\n101816,1132\n101817,781\n101818,611\n101818,1619\n101819,788\n101820,264\n101820,1509\n101821,3698\n101822,101823\n101824,2574\n101825,79\n101827,1836\n101828,34\n101828,35\n101828,634\n101828,2646\n101829,862\n101830,1749\n101831,671\n101832,752\n101834,2626\n101835,97\n101836,663\n101838,663\n101839,602\n101840,93319\n101841,467\n101843,31934\n101844,422\n101845,1836\n101846,56\n101847,1151\n101848,1070\n101849,447\n101850,269\n101851,134\n101852,1363\n101853,1715\n101855,4192\n101855,4193\n101857,101858\n101859,1238\n101860,3804\n101861,602\n101864,1085\n101865,5375\n101866,31896\n101867,2017\n101868,406\n101869,58\n101870,58\n101871,994\n101872,46\n101873,75912\n101874,1634\n101874,1877\n101875,101876\n101877,309\n101877,310\n101878,202\n101878,203\n101878,697\n101878,1175\n101878,2590\n101879,147\n101879,158\n101879,269\n101880,344\n101882,2737\n101883,140\n101883,1132\n101883,1289\n101883,1509\n101883,1968\n101884,6303\n101886,349\n101887,992\n101888,1149\n101889,1238\n101890,30\n101890,200\n101891,1381\n101892,1072\n101893,1313\n101894,202\n101894,203\n101895,349\n101896,248\n101896,949\n101896,1133\n101897,207\n101899,2646\n101900,585\n101901,623\n101902,1243\n101903,991\n101904,272\n101905,1149\n101906,1089\n101908,101909\n101910,101911\n101913,120\n101914,392\n101915,1659\n101916,592\n101917,447\n101919,433\n101920,101921\n101922,151\n101922,682\n101922,72439\n101923,310\n101924,21487\n101925,3507\n101926,21487\n101927,21487\n101928,516\n101928,925\n101929,1220\n101929,1222\n101930,252\n101931,101932\n101933,251\n101934,2296\n101934,101935\n101936,9018\n101937,1634\n101938,682\n101938,72439\n101939,388\n101940,151\n101941,1231\n101942,1265\n101942,1266\n101943,4355\n101944,1509\n101945,2266\n101945,25348\n101946,115\n101946,118\n101947,2701\n101948,907\n101951,9195\n101952,217\n101952,9005\n101953,119\n101954,852\n101954,1454\n101954,2436\n101955,775\n101955,3804\n101956,7117\n101957,310\n101959,3161\n101960,255\n101961,1836\n101962,1551\n101965,493\n101966,138\n101967,949\n101968,3079\n101969,1836\n101970,349\n101971,14550\n101972,2048\n101973,8992\n101974,7155\n101975,151\n101975,33424\n101976,3846\n101977,1149\n101978,1235\n101978,8270\n101979,8270\n101980,6824\n101981,104\n101982,18726\n101983,1531\n101984,175\n101985,1773\n101986,298\n101987,623\n101988,859\n101989,1531\n101990,843\n101991,356\n101992,258\n101993,1132\n101994,781\n101996,1181\n101997,920\n101998,859\n101998,8855\n101999,801\n102000,130\n102000,151\n102000,292\n102000,310\n102000,473\n102000,527\n102000,1089\n102000,1572\n102000,2617\n102000,3039\n102001,1285\n102002,704\n102002,1140\n102002,5547\n102003,479\n102004,31934\n102007,1133\n102009,184\n102010,3507\n102011,102012\n102014,22\n102014,861\n102015,5976\n102016,248\n102017,3148\n102018,5405\n102019,22\n102020,417\n102022,2146\n102023,137\n102024,1220\n102024,1222\n102025,252\n102026,251\n102027,1266\n102027,5714\n102028,102029\n102028,108944\n102030,17772\n102031,772\n102032,1238\n102033,269\n102033,1551\n102034,850\n102035,1181\n102036,772\n102037,1201\n102038,102039\n102041,102042\n102043,147\n102043,195\n102043,779\n102044,592\n102044,1085\n102045,31934\n102046,693\n102047,333\n102048,1102\n102049,652\n102050,953\n102051,2351\n102052,6068\n102053,589\n102054,1414\n102055,1133\n102057,15573\n102058,2995\n102059,376\n102060,563\n102061,58\n102062,493\n102063,795\n102064,58\n102066,2351\n102067,273\n102068,438\n102069,372\n102070,44\n102071,1939\n102072,147\n102073,252\n102073,1220\n102073,1222\n102074,50\n102075,30\n102075,225\n102075,772\n102076,1\n102077,399\n102078,290\n102078,859\n102079,1188\n102080,731\n102081,949\n102082,557\n102083,2646\n102084,652\n102085,417\n102085,2417\n102086,58\n102087,586\n102088,167\n102088,301\n102089,102090\n102091,102090\n102092,5547\n102093,14434\n102094,602\n102095,697\n102096,403\n102096,693\n102097,8788\n102098,483\n102099,2351\n102100,28072\n102101,874\n102103,602\n102104,1132\n102105,781\n102107,663\n102108,663\n102109,102110\n102111,1282\n102112,920\n102113,302\n102113,579\n102114,422\n102116,760\n102116,1149\n102118,28072\n102119,1782\n102120,31934\n102121,72\n102122,602\n102123,25348\n102123,101688\n102124,557\n102125,306\n102125,307\n102126,72\n102126,312\n102126,1052\n102127,58\n102128,58\n102129,994\n102130,46\n102131,75912\n102132,8855\n102133,269\n102134,920\n102135,390\n102135,399\n102135,557\n102135,17309\n102136,358\n102137,534\n102138,2073\n102139,102140\n102141,23011\n102142,1623\n102143,644\n102144,1634\n102145,41\n102146,383\n102147,7\n102148,34\n102148,290\n102148,652\n102149,7652\n102150,298\n102151,485\n102152,467\n102153,493\n102154,1175\n102155,1659\n102156,1844\n102157,355\n102158,1132\n102159,781\n102160,1509\n102161,102161\n102163,389\n102164,1745\n102165,602\n102166,3804\n102167,217\n102168,920\n102169,158\n102170,1016\n102171,20359\n102172,8855\n102173,49887\n102174,704\n102175,1368\n102176,1181\n102177,2116\n102178,310\n102178,805\n102179,102180\n102181,557\n102182,557\n102183,102184\n102183,122832\n102185,309\n102185,310\n102186,518\n102188,602\n102189,6323\n102190,444\n102191,602\n102192,1653\n102192,6027\n102193,452\n102194,3\n102195,1119\n102196,298\n102197,485\n102198,563\n102199,577\n102200,68\n102201,30\n102201,1235\n102202,209\n102203,8270\n102204,779\n102205,306\n102205,307\n102207,298\n102208,485\n102209,393\n102210,718\n102211,102212\n102213,102214\n102213,110653\n102215,8270\n102216,330\n102216,1235\n102216,1335\n102217,102218\n102219,9026\n102220,9560\n102221,151\n102221,344\n102221,457\n102221,577\n102221,579\n102221,671\n102221,827\n102221,1118\n102221,1392\n102221,1400\n102221,1417\n102221,1509\n102221,1612\n102221,1818\n102221,2073\n102221,2353\n102221,3999\n102221,4823\n102221,5440\n102221,6661\n102222,3069\n102223,693\n102223,1707\n102224,102225\n102226,1983\n102228,38158\n102229,184\n102230,102231\n102232,178\n102233,102234\n102235,3999\n102236,557\n102237,7360\n102238,102239\n102240,299\n102241,433\n102242,602\n102243,3960\n102244,19227\n102245,158\n102246,102247\n102248,21944\n102249,2620\n102250,104\n102250,289\n102250,290\n102250,298\n102250,332\n102250,372\n102250,588\n102250,590\n102250,805\n102250,1001\n102250,1046\n102250,1962\n102250,2209\n102250,2286\n102250,94134\n102251,306\n102251,307\n102252,15573\n102253,1016\n102254,87638\n102255,146\n102256,8788\n102257,93\n102257,94\n102258,2590\n102259,366\n102260,72\n102261,481\n102262,72\n102263,102264\n102263,126370\n102265,134\n102265,636\n102266,2995\n102267,949\n102267,968\n102268,206\n102269,1016\n102270,72\n102271,207\n102272,146\n102272,489\n102272,615\n102272,2116\n102273,1353\n102274,620\n102277,102278\n102279,195\n102280,1201\n102281,3804\n102282,72\n102283,872\n102284,8270\n102285,1745\n102286,1419\n102287,663\n102288,1429\n102289,102290\n102291,1266\n102291,2048\n102292,588\n102292,590\n102293,4066\n102294,668\n102295,2626\n102296,126\n102297,102297\n102298,102299\n102300,81\n102301,3370\n102301,14453\n102302,227\n102303,146\n102304,652\n102305,980\n102306,200\n102307,772\n102308,1276\n102308,4193\n102309,134\n102310,2048\n102311,1285\n102312,312\n102313,2719\n102314,3370\n102314,14453\n102315,1179\n102315,1305\n102315,2701\n102316,192\n102316,292\n102317,58\n102318,1143\n102319,5366\n102321,7360\n102322,137\n102323,315\n102324,1414\n102325,2351\n102326,4276\n102327,137\n102328,102329\n102330,1515\n102331,32\n102331,114929\n102332,32\n102333,30\n102334,102335\n102336,3258\n102337,65\n102337,163\n102337,392\n102337,868\n102337,1010\n102338,102339\n102340,102339\n102341,406\n102341,1068\n102342,102343\n102344,536\n102345,1556\n102346,178\n102347,832\n102348,102349\n102350,163\n102351,1939\n102352,102353\n102355,3\n102355,301\n102355,302\n102355,372\n102355,518\n102355,932\n102355,1007\n102355,1082\n102355,1241\n102355,1479\n102355,1818\n102356,134\n102357,1285\n102357,4193\n102358,118\n102358,4597\n102359,175\n102360,298\n102361,1849\n102362,151\n102363,102364\n102365,102366\n102367,333\n102367,108554\n102368,779\n102370,455\n102371,14483\n102372,222\n102373,2367\n102374,298\n102375,485\n102376,4475\n102377,135\n102378,102379\n102380,827\n102381,1238\n102382,102383\n102384,30\n102385,102386\n102387,233\n102388,2782\n102389,6506\n102390,1983\n102391,932\n102392,5192\n102393,3724\n102394,30\n102395,861\n102396,805\n102396,1745\n102396,2205\n102396,111142\n102396,255969\n102397,1837\n102398,102399\n102400,644\n102401,602\n102401,808\n102402,1132\n102403,781\n102404,195\n102405,5405\n102406,178\n102406,215\n102406,861\n102406,877\n102406,21944\n102407,868\n102407,2146\n102408,515\n102410,406\n102410,1515\n102411,704\n102412,1977\n102412,1978\n102414,1227\n102414,86416\n102415,2146\n102416,298\n102417,485\n102418,2607\n102419,9166\n102420,1133\n102421,134\n102422,536\n102424,415\n102425,102426\n102427,4594\n102428,14126\n102429,187\n102431,1247\n102432,298\n102433,485\n102434,406\n102435,872\n102436,102437\n102438,675\n102439,675\n102440,835\n102441,1298\n102442,355\n102443,862\n102444,151\n102445,2646\n102446,1893\n102447,2889\n102448,30\n102449,1392\n102450,298\n102451,485\n102452,207\n102454,8820\n102455,872\n102456,872\n102457,22\n102458,1052\n102459,2626\n102460,3413\n102461,749\n102462,102463\n102464,1849\n102465,23783\n102465,30331\n102466,273\n102467,58\n102468,994\n102469,46\n102470,75912\n102471,1140\n102482,1127\n102483,994\n102484,206\n102484,1572\n102484,8180\n102486,72\n102487,102487\n102489,1608\n102490,1912\n102491,861\n102492,2646\n102493,151\n102495,217\n102496,1590\n102497,68\n102498,1240\n102499,872\n102500,72\n102501,5540\n102502,209\n102504,2646\n102505,137\n102506,1177\n102507,666\n102507,972\n102507,1849\n102507,32784\n102507,72764\n102507,124668\n102508,818\n102510,435\n102511,1132\n102512,781\n102513,310\n102513,631\n102513,1177\n102513,3039\n102513,232766\n102514,1707\n102515,973\n102517,22\n102519,872\n102520,72\n102522,285\n102522,422\n102522,1381\n102523,483\n102524,147\n102525,2266\n102526,622\n102527,65\n102528,2699\n102529,1531\n102530,1531\n102532,760\n102533,3069\n102534,102535\n102538,3182\n102539,1722\n102540,1238\n102541,14819\n102542,422\n102543,422\n102544,422\n102545,422\n102546,3623\n102547,422\n102548,422\n102549,422\n102551,296\n102552,422\n102553,647\n102553,872\n102554,422\n102555,2411\n102556,422\n102558,83\n102559,259\n102559,397\n102560,56\n102560,106\n102560,147\n102560,149\n102560,158\n102560,175\n102560,192\n102560,195\n102560,285\n102560,336\n102560,406\n102560,446\n102560,505\n102560,620\n102560,640\n102560,841\n102560,1370\n102560,1425\n102560,1458\n102560,1515\n102560,1518\n102560,3449\n102560,3810\n102560,21442\n102560,30428\n102560,30577\n102560,38976\n102560,55849\n102560,60576\n102560,62686\n102560,102560\n102560,103852\n102560,104926\n102560,118336\n102560,123797\n102560,124889\n102560,125411\n102560,126059\n102560,126850\n102560,127158\n102560,128671\n102560,130247\n102560,135273\n102560,135312\n102560,142496\n102560,144231\n102560,173854\n102560,179708\n102560,180487\n102560,188662\n102560,191355\n102560,197495\n102560,198435\n102560,230380\n102560,232928\n102560,253203\n102560,255046\n102562,30\n102563,102564\n102566,30\n102567,1132\n102568,781\n102569,18831\n102569,55210\n102570,104\n102571,137\n102572,1033\n102573,2646\n102574,217\n102576,30331\n102584,2168\n102585,577\n102585,949\n102590,58\n102591,994\n102592,46\n102593,75912\n102594,577\n102595,147\n102595,158\n102595,1546\n102595,8027\n102595,58612\n102595,80266\n102595,81185\n102595,83483\n102595,102595\n102595,102596\n102595,102597\n102595,102598\n102595,102599\n102595,102678\n102595,102741\n102595,102742\n102595,102743\n102595,102744\n102601,622\n102603,9560\n102604,217\n102605,3623\n102608,383\n102609,5440\n102614,209\n102616,1390\n102619,349\n102620,538\n102621,56\n102621,147\n102621,158\n102621,192\n102622,102623\n102624,102623\n102625,8270\n102626,171\n102627,77\n102628,14674\n102629,1132\n102630,781\n102631,389\n102632,1454\n102633,298\n102634,485\n102636,1227\n102636,86416\n102637,1893\n102638,355\n102640,104\n102640,557\n102640,953\n102641,827\n102642,481\n102643,3069\n102644,1977\n102644,1978\n102645,1983\n102646,167\n102646,3218\n102649,102650\n102651,557\n102652,358\n102653,1220\n102653,1222\n102654,252\n102655,251\n102656,217\n102656,1417\n102657,690\n102658,850\n102659,1326\n102660,298\n102661,485\n102662,676\n102663,20\n102664,760\n102665,1001\n102666,175\n102667,217\n102669,298\n102670,261\n102671,86\n102673,2353\n102674,83\n102674,240\n102675,920\n102677,3623\n102683,21944\n102685,21944\n102686,79\n102686,192\n102687,240\n102688,1983\n102689,1332\n102690,1531\n102691,862\n102692,120\n102693,1046\n102695,444\n102695,567\n102695,685\n102695,849\n102695,1043\n102695,1653\n102695,2460\n102695,6955\n102695,214131\n102696,4218\n102697,2735\n102698,22\n102698,136\n102698,137\n102698,207\n102698,455\n102698,623\n102698,744\n102698,1293\n102698,1479\n102698,1955\n102699,462\n102699,1659\n102700,2784\n102701,3260\n102702,623\n102703,171\n102704,920\n102704,1345\n102705,289\n102705,290\n102705,2296\n102705,94134\n102707,1323\n102708,102\n102709,1326\n102710,720\n102712,104\n102712,137\n102713,58\n102714,1231\n102716,240\n102718,392\n102719,338\n102719,340\n102719,1381\n102719,1893\n102720,2590\n102721,298\n102722,485\n102723,102724\n102723,107337\n102725,2590\n102726,56\n102727,192\n102728,349\n102731,349\n102734,102735\n102736,493\n102736,1927\n102737,310\n102739,328\n102739,622\n102740,83\n102743,147\n102743,80266\n102745,527\n102746,408\n102747,1309\n102750,3623\n102751,2995\n102753,1836\n102754,1465\n102754,1801\n102757,271\n102758,225\n102759,1531\n102760,493\n102761,9098\n102762,8798\n102763,7572\n102764,4549\n102765,1132\n102766,493\n102766,577\n102766,1105\n102766,1927\n102767,874\n102768,515\n102769,2574\n102770,2590\n102771,273\n102772,5540\n102774,1298\n102775,102776\n102777,450\n102778,818\n102778,868\n102779,275\n102780,827\n102781,2775\n102782,447\n102783,841\n102784,2797\n102785,872\n102786,1\n102786,171\n102786,957\n102786,1815\n102787,171\n102788,30\n102789,251\n102789,252\n102789,1220\n102789,1222\n102790,1837\n102791,20\n102792,393\n102793,305\n102794,3623\n102795,4146\n102796,366\n102796,515\n102797,240\n102797,1285\n102798,1849\n102799,163\n102800,588\n102800,590\n102801,209\n102801,217\n102801,302\n102802,931\n102803,388\n102804,3804\n102805,3623\n102806,1707\n102807,101534\n102808,87\n102809,1132\n102810,781\n102812,102813\n102814,294\n102815,586\n102816,1893\n102816,1968\n102817,1515\n102817,21944\n102818,102819\n102820,1836\n102821,10\n102823,184\n102824,160\n102825,615\n102826,1\n102827,10\n102828,195\n102830,932\n102831,106\n102831,192\n102831,337\n102831,435\n102831,447\n102831,726\n102831,1388\n102831,3989\n102831,6119\n102832,118\n102832,4597\n102833,72\n102834,1370\n102835,146\n102837,30\n102838,4771\n102839,2286\n102840,178\n102841,392\n102842,21944\n102843,3623\n102844,1132\n102845,781\n102846,872\n102848,1707\n102849,602\n102850,140\n102851,267\n102852,6638\n102854,425\n102854,1276\n102854,3507\n102854,3698\n102855,628\n102856,298\n102857,485\n102858,483\n102859,102860\n102861,843\n102862,333\n102863,298\n102864,485\n102865,1247\n102867,102868\n102869,557\n102870,102871\n102872,8788\n102873,557\n102874,192\n102875,310\n102876,30\n102877,79\n102878,102879\n102880,310\n102881,18726\n102882,862\n102883,298\n102884,485\n102885,32\n102885,575\n102885,918\n102885,3003\n102886,102887\n102888,861\n102889,102890\n102892,151\n102893,579\n102893,1801\n102894,1127\n102895,500\n102896,102897\n102898,102899\n102900,7360\n102901,21408\n102902,83\n102903,8270\n102904,206\n102905,79\n102907,1033\n102908,250\n102908,1684\n102909,298\n102910,485\n102911,450\n102912,264\n102913,1452\n102914,1551\n102915,203\n102915,372\n102916,1639\n102917,1381\n102918,102919\n102920,3413\n102921,1220\n102921,1222\n102922,147\n102922,158\n102923,450\n102924,292\n102925,312\n102926,149\n102927,146\n102927,106502\n102928,1623\n102929,1425\n102930,158\n102931,640\n102932,42064\n102933,60576\n102934,336\n102935,102936\n102937,2737\n102938,518\n102939,3193\n102940,31122\n102942,450\n102943,1181\n102944,30\n102945,422\n102946,56\n102947,102948\n102949,261\n102951,102952\n102954,1282\n102955,1370\n102956,102957\n102959,102960\n102962,306\n102962,307\n102963,795\n102965,102966\n102967,1085\n102968,450\n102969,1181\n102970,450\n102971,102972\n102973,184\n102974,58\n102975,3161\n102976,310\n102977,1556\n102979,175\n102980,298\n102981,171\n102982,261\n102983,102984\n102985,72\n102987,34\n102987,8270\n102988,7652\n102989,2590\n102990,102991\n102992,874\n102993,290\n102993,850\n102994,1188\n102995,671\n102996,72\n102997,58\n102998,102999\n103000,1544\n103001,298\n103002,485\n103003,818\n103003,907\n103003,1414\n103003,2351\n103003,2995\n103003,6068\n103003,8180\n103003,15573\n103005,4611\n103006,1544\n103007,4611\n103008,1544\n103010,527\n103011,9457\n103012,103013\n103014,184\n103015,225\n103016,4453\n103017,563\n103018,1893\n103019,647\n103020,2744\n103021,8855\n103022,2626\n103023,1201\n103024,640\n103025,58\n103026,30\n103027,366\n103028,269\n103029,30\n103030,9121\n103031,431\n103032,809\n103033,477\n103034,640\n103035,775\n103036,30\n103037,103038\n103039,24505\n103040,192\n103041,233\n103042,248\n103043,23701\n103044,10\n103045,694\n103046,850\n103047,1572\n103048,206\n103048,209\n103049,103050\n103051,697\n103053,171\n103054,240\n103055,355\n103056,103057\n103059,640\n103061,4220\n103062,103063\n103064,2775\n103065,447\n103066,130\n103068,175\n103069,140\n103070,302\n103071,298\n103072,58\n103073,422\n103074,422\n103075,2421\n103076,422\n103077,1\n103078,103079\n103080,2626\n103082,563\n103083,1836\n103084,50\n103085,592\n103086,726\n103087,872\n103088,273\n103089,7\n103091,273\n103093,136\n103094,1515\n103095,422\n103096,422\n103097,406\n103098,422\n103099,779\n103100,422\n103101,422\n103102,285\n103103,422\n103104,56\n103106,422\n103108,422\n103109,422\n103111,602\n103112,1363\n103113,1363\n103114,50321\n103115,103116\n103117,1858\n103118,430\n103118,2674\n103119,4066\n103120,248\n103121,1893\n103122,195\n103123,943\n103124,1801\n103125,97\n103126,30331\n103127,23783\n103128,1858\n103130,1531\n103131,3413\n103132,422\n103133,302\n103134,30\n103135,211\n103136,7124\n103137,2574\n103138,222\n103139,97\n103140,805\n103141,1132\n103142,781\n103143,1572\n103144,433\n103145,640\n103146,298\n103147,485\n103148,1782\n103149,50\n103150,7\n103151,10\n103152,103153\n103154,306\n103154,307\n103155,55849\n103156,1118\n103157,23783\n103158,1127\n103159,1363\n103161,1132\n103162,781\n103163,269\n103163,356\n103163,1381\n103163,1844\n103163,9457\n103163,13538\n103163,21944\n103164,500\n103165,1962\n103166,1052\n103167,1882\n103168,2775\n103169,54\n103173,620\n103173,1058\n103174,267\n103177,862\n103179,3623\n103180,305\n103181,2334\n103182,1132\n103183,781\n103184,1858\n103185,1860\n103186,103187\n103188,2244\n103189,104\n103190,5310\n103191,83\n103193,2646\n103194,356\n103195,467\n103196,103197\n103198,167\n103199,1707\n103200,968\n103201,5405\n103202,973\n103203,4678\n103204,2979\n103205,83\n103206,827\n103207,907\n103207,1284\n103207,148742\n103208,30\n103208,841\n103208,850\n103209,103210\n103211,1010\n103212,714\n103213,1849\n103214,103215\n103216,596\n103216,1368\n103217,2334\n103220,1085\n103220,156379\n103222,323\n103222,462\n103222,4453\n103223,779\n103223,4193\n103224,103225\n103226,479\n103226,861\n103226,1579\n103227,690\n103227,3724\n103228,1390\n103229,336\n103229,1572\n103230,349\n103231,2889\n103234,103235\n103236,211\n103237,48\n103237,326\n103237,31896\n103238,579\n103238,1707\n103238,162599\n103239,273\n103240,149\n103240,3089\n103241,779\n103241,2244\n103242,30331\n103243,1181\n103244,1659\n103245,1955\n103246,1052\n103247,1623\n103248,1\n103249,422\n103250,336\n103252,149\n103253,422\n103254,192\n103254,217\n103254,9005\n103255,184\n103256,261\n103256,1203\n103257,1220\n103257,1222\n103258,252\n103259,103260\n103261,103260\n103262,103260\n103263,251\n103264,103260\n103265,103260\n103266,103267\n103268,103267\n103269,240\n103269,1203\n103270,1177\n103271,1043\n103275,1257\n103276,87\n103276,1058\n103276,1454\n103276,1634\n103276,3260\n103276,3367\n103277,1203\n103278,493\n103279,2286\n103280,349\n103281,503\n103281,862\n103281,1392\n103281,5101\n103281,27041\n103283,1359\n103284,209\n103285,3\n103288,805\n103289,2574\n103291,538\n103291,1284\n103292,171\n103293,1220\n103293,1222\n103294,252\n103295,251\n103296,175\n103297,4060\n103298,3623\n103299,298\n103300,2867\n103300,2868\n103301,58\n103302,994\n103303,46\n103304,75912\n103305,171\n103306,1323\n103307,102\n103308,1326\n103309,518\n103309,1955\n103310,10\n103311,850\n103312,72\n103313,103314\n103315,298\n103316,485\n103317,3\n103318,10\n103318,3297\n103319,1240\n103319,1465\n103320,1132\n103321,781\n103323,240\n103324,202\n103324,203\n103325,32\n103325,285\n103325,392\n103325,644\n103325,697\n103325,809\n103325,2699\n103325,3003\n103326,1467\n103327,481\n103328,103329\n103330,103331\n103332,1359\n103333,147\n103333,3135\n103334,918\n103335,10\n103336,252\n103337,2371\n103338,75912\n103340,1172\n103341,1572\n103342,2334\n103343,140\n103344,1085\n103345,1033\n103346,4192\n103346,4193\n103347,1133\n103349,7572\n103350,6789\n103351,103352\n103353,1634\n103354,302\n103355,1801\n103356,240\n103356,372\n103356,805\n103358,1388\n103359,285\n103360,579\n103361,68069\n103362,663\n103363,103364\n103366,760\n103366,1149\n103366,1511\n103366,1631\n103366,3069\n103367,151\n103368,450\n103369,647\n103370,3623\n103372,302\n103373,640\n103374,2334\n103375,103376\n103377,1247\n103378,2017\n103379,4220\n103379,66297\n103380,298\n103381,485\n103382,344\n103383,302\n103384,1359\n103385,406\n103386,23701\n103387,1\n103387,119\n103388,3\n103390,3623\n103391,103392\n103393,1151\n103393,1836\n103395,356\n103396,422\n103397,56\n103398,1836\n103399,736\n103400,50\n103401,515\n103404,392\n103405,1858\n103406,1860\n103407,1955\n103408,255\n103410,171\n103411,2674\n103411,16153\n103412,1284\n103414,3\n103415,1\n103416,103417\n103418,1220\n103418,1222\n103419,252\n103420,251\n103421,151\n103422,255\n103423,289\n103423,290\n103424,1955\n103425,1146\n103426,3623\n103427,2620\n103428,103429\n103430,68\n103431,20771\n103432,1085\n103434,1240\n103435,103436\n103437,731\n103437,3297\n103438,192\n103439,3623\n103440,283\n103441,217\n103443,184\n103444,30\n103445,103446\n103447,106\n103448,10\n103450,392\n103451,1359\n103452,103453\n103454,202\n103454,203\n103455,2574\n103456,3138\n103457,83\n103458,1085\n103459,72\n103460,1608\n103461,9598\n103462,1608\n103463,861\n103464,310\n103465,1707\n103467,360\n103468,269\n103469,3653\n103470,376\n103471,392\n103472,3623\n103473,422\n103474,298\n103475,485\n103476,1462\n103476,2334\n103477,17588\n103478,1127\n103479,479\n103479,682\n103479,72439\n103480,1247\n103481,192\n103482,2605\n103483,3585\n103484,3623\n103485,72\n103486,30766\n103487,53763\n103488,68467\n103489,45024\n103490,45023\n103491,68467\n103492,973\n103493,72\n103494,3623\n103496,485\n103497,28755\n103498,1782\n103499,718\n103500,3623\n103501,557\n103502,557\n103503,55849\n103504,795\n103505,1016\n103505,2379\n103506,10\n103507,103508\n103509,3623\n103511,772\n103512,2944\n103513,83\n103514,1319\n103515,103516\n103517,103518\n103519,103520\n103521,663\n103522,1227\n103522,2089\n103522,2940\n103522,86416\n103523,10\n103524,167\n103524,301\n103524,1119\n103524,1177\n103524,1785\n103524,1818\n103525,1284\n103525,1955\n103526,431\n103526,631\n103526,1659\n103527,5540\n103528,1\n103529,217\n103529,1417\n103530,1531\n103531,72\n103532,202\n103532,203\n103532,682\n103532,949\n103532,72439\n103533,636\n103533,1262\n103533,1332\n103533,1844\n103534,10\n103535,1298\n103536,435\n103537,1634\n103538,103539\n103540,2590\n103541,103542\n103544,536\n103545,4611\n103546,147\n103546,158\n103547,72\n103548,48\n103549,1132\n103550,781\n103551,149\n103552,103552\n103553,588\n103553,590\n103554,843\n103555,356\n103556,3\n103557,397\n103558,1556\n103559,577\n103560,160\n103561,6789\n103562,103563\n103564,919\n103565,72\n103566,68\n103567,1707\n103569,483\n103570,68\n103571,34\n103571,35\n103572,72\n103573,72\n103574,10\n103575,272\n103575,315\n103575,479\n103576,118\n103576,4597\n103577,2146\n103578,72\n103579,1243\n103580,2775\n103581,447\n103582,72\n103583,1132\n103584,781\n103585,450\n103586,292\n103587,103588\n103589,72\n103591,72\n103592,72\n103593,103594\n103595,1235\n103595,1335\n103596,312\n103597,103598\n103599,406\n103601,1359\n103602,1\n103603,1659\n103604,72\n103605,422\n103606,422\n103607,422\n103608,192\n103609,422\n103610,422\n103611,301\n103611,1385\n103612,422\n103613,422\n103614,422\n103616,422\n103617,422\n103618,247\n103619,422\n103621,103622\n103621,120522\n103624,72\n103625,103626\n103625,111302\n103625,144497\n103627,103628\n103630,2646\n103631,406\n103632,9598\n103633,973\n103634,1203\n103635,136\n103635,450\n103635,563\n103635,2867\n103635,2868\n103637,103638\n103640,103641\n103642,72\n103643,255\n103645,103646\n103647,252\n103649,103650\n103652,103653\n103654,103655\n103656,158\n103657,87\n103657,301\n103657,392\n103657,1722\n103657,16614\n103658,304\n103659,195\n103660,103661\n103662,1238\n103663,269\n103663,590\n103664,1452\n103665,72\n103667,103668\n103669,676\n103670,37\n103674,1722\n103675,3079\n103677,272\n103678,693\n103678,14366\n103678,14483\n103679,19227\n103680,5714\n103681,267\n103682,1265\n103682,1266\n103683,202\n103683,203\n103684,258\n103685,1381\n103686,366\n103687,147\n103687,158\n103687,206\n103687,2244\n103688,420\n103690,103691\n103692,1326\n103693,103694\n103695,103696\n103697,2367\n103699,103700\n103701,206\n103702,3474\n103703,72\n103704,103705\n103704,110938\n103704,110973\n103704,111013\n103704,111808\n103704,111926\n103704,123418\n103706,233\n103707,3297\n103708,2557\n103709,934\n103710,563\n103711,46\n103712,206\n103713,30\n103714,397\n103717,5405\n103719,3623\n103720,1294\n103721,1659\n103723,10\n103723,20\n103723,22\n103723,447\n103724,1058\n103726,657\n103727,309\n103727,310\n103728,30\n103729,973\n103730,136\n103730,137\n103731,704\n103732,1977\n103732,1978\n103733,292\n103734,195\n103734,360\n103734,392\n103734,1572\n103734,37414\n103735,1284\n103736,877\n103737,195\n103738,510\n103740,640\n103741,103742\n103743,640\n103744,3623\n103745,1983\n103746,202\n103746,203\n103747,911\n103747,1634\n103747,2460\n103748,2995\n103749,364\n103750,1912\n103751,103752\n103753,3623\n103755,1955\n103755,2775\n103756,264\n103756,1289\n103757,1415\n103758,1415\n103759,1415\n103760,500\n103761,2146\n103762,2371\n103763,3474\n103764,1400\n103765,2572\n103766,1893\n103767,718\n103767,4810\n103768,805\n103769,1415\n103770,489\n103770,795\n103770,1400\n103773,10\n103774,1983\n103776,63\n103776,877\n103776,985\n103776,3999\n103776,75912\n103777,30\n103779,634\n103781,147\n103781,158\n103781,192\n103781,779\n103782,1805\n103783,89035\n103784,1167\n103784,2979\n103785,287\n103786,2244\n103787,55995\n103788,158\n103789,158\n103790,349\n103791,1556\n103792,1284\n103793,718\n103794,3623\n103795,298\n103796,485\n103797,925\n103798,72\n103799,222\n103800,94409\n103802,994\n103802,21944\n103803,83\n103804,611\n103805,137\n103805,1274\n103806,50\n103807,452\n103808,1247\n103809,184\n103810,72\n103811,6119\n103812,3623\n103814,733\n103815,31977\n103816,1454\n103817,1390\n103818,247\n103819,68069\n103820,868\n103821,392\n103823,140\n103824,23010\n103825,1860\n103826,809\n103826,1836\n103827,1359\n103828,2646\n103828,141912\n103829,309\n103829,310\n103829,6556\n103830,147\n103831,1607\n103832,30\n103832,991\n103833,336\n103834,306\n103834,307\n103835,171\n103836,1858\n103837,1860\n103839,1\n103840,893\n103841,256\n103842,1\n103842,422\n103843,1179\n103845,611\n103846,536\n103847,14483\n103848,3623\n103849,1707\n103850,13137\n103851,932\n103852,336\n103852,406\n103852,620\n103852,622\n103852,841\n103852,1425\n103852,102560\n103853,79\n103853,862\n103855,387\n103855,1058\n103856,1785\n103857,72\n103858,1332\n103859,1293\n103860,46\n103860,301\n103860,372\n103860,444\n103860,567\n103860,663\n103860,783\n103860,937\n103860,968\n103860,1160\n103860,1293\n103860,1300\n103860,1580\n103860,1627\n103860,1715\n103860,1852\n103860,5186\n103860,31784\n103860,38446\n103860,62439\n103860,64027\n103860,95469\n103860,96482\n103860,103860\n103860,112994\n103860,113698\n103860,114178\n103860,114664\n103860,114685\n103860,115046\n103860,115095\n103860,115098\n103860,115099\n103860,115680\n103860,115707\n103860,116695\n103860,117327\n103860,117346\n103860,120510\n103860,123021\n103860,123173\n103860,123422\n103860,124082\n103860,126572\n103860,127158\n103860,128729\n103860,130993\n103860,131214\n103860,131217\n103860,133141\n103860,136301\n103860,137759\n103860,137760\n103860,138194\n103860,151155\n103860,160923\n103860,164635\n103860,164638\n103860,165987\n103860,167092\n103860,172724\n103860,173207\n103860,174995\n103860,181028\n103860,186657\n103860,188791\n103860,189303\n103860,195265\n103860,195747\n103860,195762\n103860,199736\n103860,199785\n103860,213238\n103860,215591\n103860,221730\n103860,222563\n103860,222565\n103860,222567\n103860,222575\n103860,222652\n103860,239992\n103860,240018\n103860,241970\n103860,251473\n103860,254249\n103860,255136\n103860,257078\n103860,265026\n103861,1247\n103862,1556\n103863,175\n103864,298\n103865,485\n103866,29380\n103867,298\n103868,333\n103869,1983\n103871,252\n103873,3260\n103874,3623\n103875,1359\n103876,2116\n103877,356\n103878,312\n103878,205627\n103879,2989\n103879,2991\n103880,581\n103882,103883\n103884,103883\n103885,252\n103886,66\n103886,252\n103887,779\n103888,65\n103888,66\n103888,467\n103889,875\n103890,483\n103891,563\n103893,298\n103894,485\n103896,623\n103896,697\n103896,1240\n103896,1805\n103898,252\n103899,875\n103900,893\n103900,3258\n103901,581\n103902,72\n103903,344\n103904,285\n103905,1359\n103906,1033\n103907,406\n103908,5726\n103909,1467\n103910,1381\n103910,75912\n103911,195\n103912,252\n103913,283\n103913,389\n103913,13137\n103913,19443\n103914,455\n103915,2424\n103917,298\n103917,626\n103917,1284\n103917,1381\n103919,1359\n103923,1871\n103924,252\n103925,493\n103925,1893\n103926,58\n103927,760\n103929,2421\n103930,83\n103931,13980\n103932,252\n103933,1188\n103935,1381\n103936,503\n103937,83\n103938,252\n103939,676\n103940,103941\n103942,1773\n103943,3623\n103944,103944\n103945,227\n103946,264\n103947,3623\n103950,146\n103951,5405\n103952,3623\n103953,4549\n103954,252\n103955,843\n103956,21944\n103957,195\n103958,147\n103958,215\n103958,392\n103958,779\n103958,1010\n103958,1801\n103959,217\n103960,615\n103961,184\n103962,9025\n103963,10\n103964,215\n103965,1434\n103966,1220\n103966,1222\n103967,3623\n103968,252\n103969,872\n103970,663\n103971,663\n103972,9560\n103973,103974\n103976,4611\n103977,103978\n103979,1858\n103980,1860\n103981,302\n103983,3623\n103984,6068\n103985,252\n103986,3623\n103987,1220\n103987,1222\n103988,252\n103989,251\n103990,640\n103991,252\n103992,309\n103992,310\n103992,1531\n103992,13546\n103992,23487\n103993,290\n103993,23701\n103994,103995\n103996,30\n103997,72\n103998,435\n103999,252\n104001,1220\n104001,1222\n104002,65\n104003,104004\n104005,4935\n104006,271\n104007,2146\n104008,151\n104009,392\n104010,435\n104011,592\n104012,481\n104013,171\n104014,104015\n104014,129671\n104016,251\n104016,252\n104016,1220\n104016,1222\n104017,843\n104018,356\n104019,1429\n104020,158\n104020,192\n104020,247\n104020,252\n104020,516\n104020,622\n104020,717\n104020,1012\n104020,1238\n104021,875\n104022,422\n104023,56\n104024,136\n104025,68\n104026,301\n104027,261\n104028,7124\n104029,3623\n104030,304\n104031,104032\n104033,1467\n104033,1871\n104033,2421\n104033,5906\n104034,6789\n104035,175\n104036,1326\n104037,1122\n104038,298\n104039,192\n104040,663\n104041,104042\n104043,187\n104044,5440\n104045,111\n104045,309\n104045,310\n104046,302\n104046,579\n104046,687\n104047,292\n104048,104049\n104050,269\n104051,718\n104052,2797\n104053,217\n104053,1019\n104054,7416\n104055,104056\n104057,21944\n104058,252\n104058,516\n104058,1220\n104058,1222\n104059,104060\n104059,139461\n104061,3623\n104062,21944\n104063,10\n104064,2506\n104065,104066\n104067,4101\n104068,1858\n104069,1860\n104071,72\n104072,298\n104073,485\n104074,605\n104075,30\n104076,104077\n104078,663\n104079,251\n104080,3623\n104081,72\n104082,360\n104083,104084\n104086,1955\n104087,72\n104088,72\n104089,225\n104090,72\n104091,48\n104092,6682\n104093,104094\n104095,72\n104097,72\n104098,557\n104099,557\n104100,557\n104101,3148\n104102,503\n104103,2923\n104104,4903\n104105,770\n104106,30\n104107,151\n104107,1293\n104108,673\n104109,349\n104110,323\n104111,30\n104112,862\n104112,1010\n104113,358\n104114,30\n104115,3260\n104116,949\n104118,483\n104119,433\n104120,104121\n104122,4594\n104123,10\n104124,72\n104126,10\n104127,104128\n104129,366\n104131,298\n104132,485\n104133,250\n104133,1684\n104134,376\n104135,20\n104136,2083\n104137,1782\n104138,2116\n104139,104140\n104141,1572\n104142,83\n104143,805\n104144,310\n104145,298\n104146,485\n104147,3623\n104148,72\n104149,795\n104150,298\n104151,485\n104153,72\n104154,433\n104155,104156\n104157,2048\n104158,104159\n104160,30\n104161,1033\n104162,920\n104163,104164\n104165,104166\n104167,149\n104168,644\n104169,455\n104169,750\n104169,1893\n104170,1467\n104171,104172\n104173,577\n104174,1\n104175,862\n104176,3623\n104177,2434\n104178,104179\n104181,104182\n104183,3041\n104184,16196\n104185,252\n104185,1220\n104185,1222\n104186,310\n104188,602\n104188,994\n104188,2931\n104189,104190\n104191,63\n104192,21944\n104193,104194\n104195,118\n104195,4597\n104196,104197\n104198,366\n104198,859\n104199,30\n104200,2590\n104201,406\n104202,372\n104203,2697\n104204,1058\n104205,118\n104205,4597\n104207,1201\n104208,1046\n104209,290\n104209,4193\n104209,8270\n104210,1188\n104211,1332\n104212,151\n104213,72\n104214,72\n104215,72\n104216,872\n104217,1429\n104218,1181\n104219,3474\n104219,84257\n104220,72\n104221,310\n104222,137\n104223,668\n104224,1188\n104225,694\n104225,1659\n104226,1102\n104228,1019\n104228,2051\n104228,3474\n104230,72\n104233,104234\n104236,292\n104237,104238\n104240,207\n104241,72\n104242,439\n104243,1\n104244,2626\n104245,390\n104246,206\n104247,3623\n104248,676\n104250,433\n104251,298\n104252,485\n104253,1284\n104254,2697\n104255,289\n104255,290\n104256,850\n104257,694\n104257,1659\n104258,872\n104259,1893\n104260,298\n104261,485\n104262,3769\n104263,1541\n104264,22\n104264,1467\n104264,2784\n104265,233\n104266,868\n104267,1143\n104268,1985\n104269,72\n104270,1096\n104271,104272\n104273,9024\n104274,298\n104274,305\n104274,628\n104278,93\n104278,94\n104279,298\n104280,485\n104281,875\n104282,137\n104283,310\n104284,298\n104285,485\n104286,875\n104287,652\n104288,1623\n104289,1252\n104289,1253\n104291,3623\n104292,3413\n104293,104294\n104295,3623\n104296,298\n104297,485\n104300,2775\n104301,447\n104302,104303\n104304,527\n104305,1181\n104306,8270\n104307,355\n104308,1893\n104309,298\n104310,485\n104311,48\n104313,3623\n104314,1265\n104314,1266\n104315,104316\n104317,56\n104319,104320\n104321,1\n104321,209\n104321,779\n104321,4237\n104322,3623\n104323,222\n104323,535\n104323,1293\n104323,2421\n104323,75912\n104324,1238\n104325,3724\n104326,206\n104327,337\n104328,104329\n104330,1359\n104331,640\n104332,1707\n104333,1707\n104334,137\n104335,640\n104336,37414\n104338,1893\n104339,160\n104339,473\n104339,567\n104339,663\n104339,712\n104339,1147\n104339,1429\n104339,1579\n104339,1612\n104339,2605\n104339,2668\n104339,3967\n104339,4678\n104340,302\n104342,273\n104343,298\n104344,485\n104345,1462\n104345,8537\n104346,972\n104347,671\n104348,72\n104349,3623\n104350,1284\n104351,602\n104352,422\n104353,422\n104354,693\n104355,34\n104355,35\n104356,298\n104357,485\n104358,620\n104359,264\n104359,1893\n104360,298\n104361,485\n104362,422\n104363,422\n104365,422\n104367,422\n104368,422\n104369,422\n104370,422\n104371,422\n104372,422\n104373,422\n104374,422\n104375,298\n104376,485\n104377,422\n104379,310\n104380,712\n104381,1659\n104382,104383\n104384,991\n104386,1983\n104387,399\n104387,781\n104387,1052\n104388,994\n104389,1955\n104391,868\n104392,6303\n104393,158\n104394,111\n104394,290\n104394,309\n104394,310\n104394,111142\n104395,422\n104396,56\n104397,392\n104398,2620\n104399,104400\n104402,147\n104403,809\n104404,202\n104404,203\n104405,58\n104406,1559\n104410,1298\n104411,273\n104411,1052\n104412,2334\n104413,406\n104414,1390\n104415,302\n104416,192\n104419,7270\n104420,1572\n104421,5213\n104422,83\n104423,298\n104424,485\n104426,202\n104426,203\n104428,79\n104429,302\n104429,2116\n104430,6556\n104431,298\n104432,485\n104433,3209\n104434,104435\n104436,500\n104437,58\n104438,994\n104439,46\n104440,75912\n104441,298\n104442,485\n104443,344\n104444,298\n104445,485\n104446,941\n104447,1634\n104448,2812\n104449,349\n104450,147\n104451,247\n104452,1289\n104454,346\n104455,703\n104456,151\n104456,586\n104458,861\n104459,1181\n104460,252\n104460,1659\n104460,3331\n104461,493\n104462,657\n104463,302\n104463,861\n104463,1374\n104464,657\n104466,104467\n104468,1052\n104469,1359\n104470,151\n104471,579\n104472,192\n104472,663\n104473,644\n104473,1836\n104473,13361\n104474,660\n104474,3695\n104474,19010\n104475,628\n104476,1\n104477,2590\n104478,217\n104478,8270\n104479,1181\n104479,1515\n104480,9195\n104481,392\n104482,1893\n104483,4903\n104483,13136\n104484,515\n104484,1052\n104484,49057\n104485,310\n104486,272\n104487,483\n104488,269\n104489,2506\n104490,918\n104490,1010\n104492,1370\n104493,2506\n104496,58\n104498,1191\n104499,481\n104500,690\n104501,5405\n104502,302\n104503,1096\n104504,392\n104505,862\n104506,3507\n104507,301\n104507,623\n104508,515\n104509,206\n104510,14366\n104511,7092\n104515,104516\n104517,8270\n104518,657\n104519,175\n104520,298\n104521,805\n104523,779\n104524,1181\n104525,1323\n104526,102\n104527,1326\n104528,3623\n104529,298\n104530,485\n104531,2797\n104532,3623\n104533,3623\n104534,1370\n104534,14989\n104535,1143\n104536,440\n104536,1085\n104536,1796\n104537,63\n104537,1949\n104538,775\n104539,1130\n104539,1844\n104539,204124\n104540,392\n104541,1368\n104541,1715\n104541,1962\n104543,682\n104543,72439\n104544,493\n104545,104546\n104547,1058\n104548,1707\n104550,1858\n104551,1860\n104552,4078\n104553,1572\n104554,3623\n104555,225\n104555,248\n104555,1962\n104555,8180\n104555,28203\n104556,6638\n104557,392\n104558,240\n104559,907\n104560,1118\n104560,1284\n104561,3260\n104562,7360\n104563,302\n104564,75912\n104565,390\n104565,415\n104565,623\n104565,1070\n104565,1140\n104565,1805\n104565,1860\n104565,3367\n104565,4760\n104565,5591\n104565,26041\n104567,1192\n104568,779\n104569,440\n104570,657\n104571,602\n104572,1801\n104575,1359\n104576,41\n104577,1836\n104578,192\n104579,3069\n104580,15573\n104581,211\n104582,2266\n104584,3623\n104585,1309\n104586,65\n104587,4611\n104588,1544\n104589,907\n104590,107\n104590,200\n104590,227\n104590,240\n104590,372\n104590,442\n104590,714\n104590,805\n104590,1962\n104590,4237\n104592,1001\n104592,4771\n104592,162599\n104593,1590\n104594,104595\n104596,171\n104597,801\n104599,376\n104600,885\n104600,13704\n104601,2506\n104602,360\n104603,30\n104604,1359\n104605,252\n104605,314\n104605,1220\n104605,1222\n104606,104607\n104608,1359\n104609,298\n104610,485\n104611,104612\n104613,195\n104614,104\n104615,3623\n104616,389\n104617,298\n104618,485\n104619,298\n104620,485\n104621,805\n104622,5213\n104623,301\n104625,1052\n104625,2312\n104625,6695\n104626,195\n104626,301\n104626,332\n104626,430\n104626,1001\n104626,1235\n104626,1335\n104627,862\n104627,1434\n104628,779\n104629,202\n104629,203\n104630,309\n104630,310\n104630,483\n104630,1119\n104630,1807\n104630,1888\n104630,6556\n104630,193486\n104632,390\n104633,1381\n104633,1551\n104634,6323\n104635,104636\n104637,609\n104637,55849\n104638,779\n104639,17334\n104640,45023\n104641,52270\n104642,104643\n104644,9560\n104645,68467\n104646,27356\n104647,10\n104648,392\n104649,652\n104650,1235\n104650,1335\n104651,1033\n104652,2266\n104654,20771\n104655,588\n104655,590\n104656,3\n104658,1984\n104661,43203\n104662,72\n104663,4504\n104664,1132\n104665,781\n104667,104\n104668,104669\n104670,30\n104671,2989\n104671,2991\n104672,809\n104674,30\n104675,55849\n104676,920\n104677,104678\n104679,389\n104679,588\n104679,590\n104679,1531\n104680,30331\n104681,273\n104682,1117\n104683,850\n104685,104686\n104687,104686\n104688,104686\n104689,298\n104690,485\n104691,222\n104692,376\n104693,55849\n104694,55849\n104695,104696\n104697,515\n104698,2210\n104698,4237\n104699,255\n104700,248\n104700,5405\n104701,8719\n104702,138\n104703,865\n104704,557\n104705,388\n104706,137\n104707,118\n104707,4597\n104708,88820\n104709,21944\n104710,557\n104711,557\n104712,557\n104713,137\n104714,104715\n104716,261\n104717,184\n104718,10\n104719,657\n104721,1789\n104723,2421\n104724,55849\n104725,222\n104727,682\n104727,72439\n104728,104729\n104730,77\n104731,72\n104732,83\n104733,104734\n104735,49887\n104736,264\n104736,736\n104737,406\n104739,118\n104739,4597\n104740,298\n104741,485\n104742,30\n104743,483\n104744,332\n104745,1564\n104745,3094\n104746,356\n104747,346\n104748,932\n104749,30\n104750,6323\n104751,1572\n104752,222\n104753,104754\n104755,104756\n104757,298\n104758,485\n104759,779\n104760,1243\n104761,104762\n104761,107150\n104761,253566\n104761,261694\n104761,264156\n104763,10\n104764,9323\n104765,2719\n104765,104766\n104767,30\n104768,7360\n104769,10\n104770,1368\n104771,206\n104773,104774\n104775,104776\n104777,1359\n104778,192\n104778,6119\n104779,310\n104780,805\n104781,2506\n104782,195\n104783,1085\n104784,1326\n104785,1353\n104787,1860\n104788,104789\n104790,32\n104790,392\n104790,697\n104791,104792\n104793,104794\n104795,18726\n104796,163\n104797,1776\n104798,10\n104799,207\n104800,104801\n104802,104801\n104803,104801\n104804,104801\n104806,104807\n104808,225\n104809,8884\n104811,1085\n104813,925\n104814,1085\n104816,779\n104817,9195\n104818,420\n104819,30\n104820,34\n104820,35\n104820,58\n104820,111\n104820,158\n104820,192\n104820,264\n104820,289\n104820,290\n104820,312\n104820,333\n104820,406\n104820,422\n104820,479\n104820,585\n104820,620\n104820,872\n104820,1007\n104820,1078\n104820,1085\n104820,1140\n104820,1151\n104820,1181\n104820,1210\n104820,1453\n104820,1659\n104820,1749\n104820,1893\n104820,2073\n104820,2782\n104820,2931\n104820,3695\n104820,3876\n104820,5265\n104820,8180\n104820,8270\n104820,8788\n104820,8907\n104821,1181\n104824,1274\n104825,240\n104826,2590\n104827,104828\n104829,32475\n104830,147\n104830,1462\n104831,7124\n104832,8855\n104835,1\n104836,65\n104836,255\n104836,292\n104836,315\n104836,390\n104836,592\n104836,675\n104836,918\n104836,1010\n104836,1363\n104836,1414\n104836,4252\n104837,366\n104838,2697\n104839,7124\n104840,953\n104841,3370\n104841,31896\n104842,439\n104844,151\n104846,271\n104847,187\n104848,104849\n104850,233\n104851,104852\n104853,693\n104853,14366\n104853,14483\n104854,310\n104856,72\n104857,1305\n104858,32475\n104859,20359\n104860,79\n104861,515\n104861,1085\n104862,7155\n104863,1070\n104865,104866\n104867,104868\n104869,355\n104870,809\n104871,671\n104872,72\n104874,994\n104875,83\n104876,586\n104877,310\n104877,406\n104878,2116\n104878,4453\n104878,6303\n104879,104880\n104882,1046\n104883,188\n104884,875\n104885,843\n104886,422\n104888,3260\n104889,83\n104890,1436\n104891,8180\n104892,525\n104893,366\n104894,3161\n104895,1564\n104896,1181\n104897,1072\n104898,500\n104899,366\n104900,104901\n104902,195\n104905,104904\n104906,104907\n104908,310\n104909,491\n104910,104911\n104913,586\n104913,21944\n104916,3804\n104918,718\n104919,809\n104919,868\n104920,422\n104921,56\n104922,55849\n104923,805\n104924,805\n104925,310\n104926,147\n104926,158\n104926,336\n104926,406\n104926,1425\n104926,1803\n104926,16083\n104926,26234\n104926,80266\n104926,102560\n104926,103852\n104926,116651\n104926,118336\n104926,126767\n104926,126769\n104926,126772\n104926,126926\n104926,126930\n104926,126988\n104926,126990\n104926,126998\n104926,127203\n104926,127204\n104926,127278\n104926,127280\n104926,127283\n104926,127290\n104926,127324\n104926,127332\n104926,127703\n104926,128223\n104926,128228\n104926,128282\n104926,128294\n104926,128344\n104926,128810\n104926,128937\n104926,240174\n104927,3\n104927,1012\n104927,1177\n104927,1564\n104927,3094\n104928,104929\n104928,105907\n104928,113864\n104928,116378\n104930,1359\n104931,850\n104932,481\n104933,104934\n104935,626\n104936,3538\n104937,104938\n104939,333\n104940,875\n104941,3161\n104942,104943\n104944,87\n104945,290\n104945,4193\n104945,8270\n104946,45960\n104947,7360\n104948,68\n104949,225\n104950,1\n104951,682\n104951,72439\n104951,94409\n104952,8907\n104953,626\n104954,104955\n104956,118\n104956,4597\n104958,9457\n104959,8270\n104962,310\n104963,805\n104964,104965\n104966,119\n104966,192\n104966,309\n104966,310\n104966,577\n104966,1400\n104966,21944\n104967,118\n104967,4597\n104969,626\n104970,273\n104971,2784\n104972,310\n104973,3069\n104974,346\n104976,346\n104977,200\n104978,292\n104979,605\n104981,2590\n104982,104983\n104984,10\n104985,346\n104986,1019\n104987,160\n104988,107\n104988,137\n104988,346\n104988,720\n104988,1119\n104988,1177\n104988,2210\n104988,2668\n104988,4237\n104988,182162\n104989,3\n104990,8270\n104991,32\n104992,104993\n104994,1479\n104995,390\n104996,298\n104997,485\n104998,104999\n105000,18726\n105001,290\n105001,714\n105001,1962\n105001,2205\n105001,2286\n105001,3069\n105001,33424\n105003,72\n105004,344\n105005,285\n105006,217\n105006,240\n105006,818\n105007,1\n105008,8270\n105009,105010\n105011,4691\n105012,408\n105013,347\n105013,994\n105015,6263\n105017,269\n105017,809\n105017,1133\n105017,4193\n105018,105019\n105021,2646\n105022,1\n105023,310\n105024,1227\n105024,86416\n105025,105026\n105028,137\n105029,105030\n105031,2379\n105032,105033\n105034,843\n105035,151\n105036,346\n105037,104999\n105038,151\n105039,137\n105040,3804\n105041,387\n105041,1912\n105041,22071\n105042,310\n105043,30\n105046,18726\n105047,105048\n105049,1181\n105050,349\n105051,35905\n105052,97\n105053,105054\n105055,105056\n105058,115\n105058,118\n105059,4039\n105060,272\n105061,203\n105061,424\n105061,479\n105062,676\n105064,4504\n105065,104\n105066,151\n105068,8788\n105069,45021\n105070,45022\n105071,9121\n105072,3960\n105073,24332\n105074,17487\n105075,105075\n105076,105077\n105078,105079\n105080,693\n105080,3370\n105081,105082\n105083,118\n105083,4597\n105084,8270\n105085,1133\n105086,105087\n105088,105089\n105090,105091\n105094,105095\n105097,273\n105098,105099\n105100,105101\n105102,30\n105103,118\n105103,4597\n105104,779\n105105,107\n105106,2416\n105106,2417\n105107,292\n105108,338\n105109,298\n105111,1133\n105112,3538\n105113,105114\n105115,105116\n105117,233\n105118,483\n105119,30\n105120,158\n105121,376\n105122,310\n105123,105124\n105125,406\n105126,1977\n105126,1978\n105127,758\n105128,503\n105129,105130\n105131,225\n105132,328\n105133,8270\n105134,872\n105135,355\n105136,5366\n105138,79\n105140,332\n105140,479\n105141,8270\n105142,310\n105143,105144\n105146,215\n105147,137\n105148,137\n105149,9323\n105150,406\n105151,105152\n105153,102\n105154,105155\n105156,932\n105157,907\n105157,932\n105157,973\n105157,1010\n105157,1284\n105157,1298\n105157,1837\n105157,1849\n105157,2191\n105159,105160\n105161,105162\n105163,1962\n105164,1977\n105164,1978\n105165,1313\n105166,4980\n105167,30\n105168,105169\n105170,30\n105171,2334\n105172,7358\n105172,7363\n105175,1140\n105175,3474\n105175,5547\n105176,105177\n105178,713\n105179,27356\n105180,68467\n105181,45023\n105182,45023\n105183,105184\n105185,105186\n105187,481\n105188,1323\n105189,102\n105190,1326\n105192,859\n105192,9195\n105193,88820\n105195,841\n105196,105197\n105198,222\n105199,105200\n105201,3872\n105202,87\n105203,255\n105204,1515\n105205,7092\n105206,1359\n105207,2620\n105208,644\n105208,949\n105208,1801\n105208,4549\n105210,211\n105211,10\n105212,3872\n105213,292\n105214,115\n105214,118\n105215,211\n105216,862\n105217,3161\n105218,192\n105219,973\n105220,872\n105221,760\n105221,1149\n105221,1631\n105222,2266\n105223,105224\n105226,105227\n105228,105229\n105232,30\n105233,2590\n105235,920\n105236,30\n105237,105238\n105239,346\n105240,779\n105241,44013\n105242,1983\n105243,1132\n105244,781\n105245,30\n105246,105247\n105248,30\n105249,118\n105249,4597\n105250,483\n105251,493\n105252,527\n105253,206\n105254,292\n105255,30\n105257,2244\n105258,30\n105259,184\n105259,1089\n105259,1619\n105259,1623\n105260,676\n105261,105262\n105264,1181\n105265,30\n105266,30\n105268,30\n105269,3623\n105270,2244\n105271,6682\n105273,779\n105274,105275\n105276,55849\n105277,55849\n105278,3623\n105279,105280\n105281,717\n105283,2244\n105284,55849\n105285,55849\n105288,105289\n105290,3413\n105291,872\n105293,24505\n105295,310\n105296,1313\n105297,376\n105298,273\n105299,105300\n105302,105303\n105305,298\n105306,485\n105307,105308\n105309,105310\n105311,81\n105312,30\n105313,439\n105315,298\n105316,485\n105317,1467\n105317,2266\n105318,972\n105319,366\n105319,972\n105320,1014\n105321,393\n105322,55849\n105324,602\n105325,31934\n105326,602\n105327,41\n105327,1119\n105328,640\n105329,298\n105330,485\n105331,557\n105332,862\n105333,557\n105334,557\n105335,557\n105336,5906\n105337,557\n105338,626\n105339,278\n105340,137\n105341,862\n105342,105343\n105344,31977\n105345,160\n105346,219\n105348,13538\n105349,105350\n105352,850\n105353,105354\n105357,5547\n105358,7117\n105359,1359\n105360,366\n105361,105362\n105364,298\n105365,485\n105366,779\n105367,1298\n105368,118\n105368,4597\n105369,10\n105370,105371\n105372,602\n105373,105374\n105375,211\n105376,292\n105377,140\n105378,433\n105379,602\n105380,422\n105381,422\n105382,422\n105383,422\n105384,422\n105385,422\n105386,422\n105387,422\n105388,422\n105390,7124\n105391,422\n105393,640\n105394,225\n105395,2929\n105396,417\n105397,1893\n105398,2744\n105399,8822\n105400,2146\n105401,996\n105402,3246\n105403,175\n105404,298\n105405,779\n105406,1181\n105407,105408\n105409,175\n105410,298\n105411,9018\n105412,392\n105413,24505\n105414,1634\n105416,2979\n105418,105419\n105421,105422\n105423,1452\n105424,105425\n105427,151\n105429,72764\n105430,292\n105431,19986\n105432,294\n105433,296\n105434,298\n105435,1238\n105436,5976\n105437,79\n105438,346\n105439,105440\n105441,151\n105443,178\n105444,4192\n105444,4193\n105445,23701\n105446,2334\n105447,2371\n105448,192\n105449,23701\n105450,1033\n105451,72\n105452,119\n105453,1634\n105454,105455\n105456,9560\n105457,671\n105458,105459\n105460,233\n105461,422\n105462,56\n105463,5103\n105464,298\n105465,485\n105466,298\n105467,485\n105468,298\n105469,485\n105470,1939\n105470,14453\n105471,30\n105472,338\n105473,602\n105474,105475\n105476,1\n105478,310\n105479,1238\n105479,1653\n105480,1132\n105481,781\n105482,105483\n105485,403\n105486,1801\n105487,3297\n105488,406\n105490,355\n105491,79\n105491,9457\n105492,2116\n105494,586\n105495,668\n105496,1085\n105496,75912\n105497,273\n105499,868\n105500,611\n105501,310\n105502,809\n105503,72\n105505,151\n105506,493\n105507,105508\n105509,338\n105510,422\n105511,56\n105512,811\n105513,579\n105514,3413\n105515,868\n105517,850\n105519,868\n105520,571\n105521,27041\n105521,37414\n105522,640\n105523,640\n105524,344\n105525,2557\n105529,1688\n105530,3804\n105532,972\n105532,1122\n105532,1298\n105533,640\n105534,255\n105535,1623\n105536,22\n105537,105538\n105539,657\n105540,358\n105541,105541\n105542,79\n105543,953\n105544,2697\n105545,1070\n105546,298\n105547,485\n105548,192\n105549,779\n105550,749\n105551,861\n105552,1118\n105554,105555\n105556,1782\n105557,1634\n105558,298\n105559,485\n105560,2574\n105562,2146\n105563,714\n105563,1085\n105563,2286\n105564,149\n105564,1776\n105566,97\n105568,30331\n105569,687\n105569,2073\n105570,1556\n105571,326\n105571,702\n105572,2646\n105573,5405\n105574,9030\n105575,481\n105576,254\n105576,557\n105576,954\n105576,1939\n105576,10318\n105577,158\n105578,1644\n105579,447\n105580,5405\n105581,332\n105581,644\n105582,326\n105582,356\n105582,775\n105582,1127\n105582,1143\n105582,2210\n105582,3623\n105582,4237\n105583,1224\n105585,1118\n105587,1531\n105588,160\n105589,850\n105590,2146\n105591,1368\n105592,663\n105594,217\n105595,192\n105595,1893\n105596,14719\n105597,493\n105599,83\n105600,16196\n105601,209\n105602,392\n105603,392\n105604,1105\n105604,193578\n105605,675\n105605,1058\n105605,1298\n105606,1749\n105607,17487\n105608,27356\n105609,8907\n105610,264\n105611,406\n105612,149\n105613,356\n105615,1836\n105615,3538\n105616,63\n105617,447\n105617,1590\n105618,4611\n105619,1544\n105621,1390\n105622,417\n105623,4611\n105624,1544\n105625,1515\n105626,5547\n105627,676\n105629,4611\n105630,24332\n105631,1544\n105632,640\n105632,1284\n105633,298\n105634,485\n105635,298\n105636,485\n105637,30\n105638,171\n105639,433\n105641,136\n105641,5405\n105642,1479\n105643,718\n105644,980\n105645,312\n105646,441\n105647,861\n105648,4611\n105649,1544\n105650,5213\n105652,302\n105653,2646\n105654,240\n105655,811\n105657,255\n105659,779\n105660,352\n105660,1172\n105661,147\n105662,718\n105663,929\n105665,1289\n105666,758\n105667,3623\n105668,392\n105669,536\n105670,278\n105671,3623\n105672,1130\n105672,4260\n105673,544\n105674,818\n105676,187\n105677,1634\n105678,10\n105678,3297\n105679,1718\n105680,1462\n105680,8537\n105681,1983\n105682,718\n105683,1659\n105685,105684\n105685,118305\n105686,852\n105686,1740\n105688,1608\n105690,140\n105691,2089\n105691,2940\n105691,21944\n105692,285\n105692,1127\n105693,1608\n105694,3623\n105696,105697\n105698,269\n105699,718\n105700,1133\n105701,217\n105702,718\n105703,718\n105704,56\n105704,192\n105704,602\n105705,1509\n105706,713\n105707,3623\n105708,4548\n105709,147\n105710,3623\n105711,1983\n105712,3623\n105713,433\n105714,663\n105715,8270\n105716,392\n105717,2274\n105719,536\n105720,209\n105720,302\n105722,1801\n105723,356\n105724,105725\n105726,557\n105726,859\n105726,2191\n105727,2244\n105728,431\n105729,79\n105729,4453\n105731,1298\n105731,1326\n105732,1085\n105733,66\n105733,252\n105733,314\n105733,467\n105733,868\n105733,1140\n105734,217\n105734,1370\n105735,298\n105736,485\n105737,861\n105738,87\n105738,1235\n105738,1335\n105740,1564\n105742,304\n105743,907\n105743,1001\n105745,417\n105746,663\n105748,1235\n105748,1335\n105749,3623\n105752,1\n105753,30\n105754,1368\n105755,3209\n105756,105757\n105758,588\n105758,590\n105759,1655\n105760,1515\n105761,175\n105762,298\n105763,106\n105764,184\n105765,58\n105765,1082\n105766,2266\n105767,147\n105768,171\n105769,973\n105771,298\n105772,485\n105773,489\n105774,1425\n105775,1801\n105776,852\n105777,850\n105778,105779\n105780,972\n105780,1284\n105780,1298\n105781,34\n105781,35\n105782,1467\n105783,302\n105783,420\n105783,1414\n105783,1466\n105784,809\n105784,893\n105784,3769\n105785,3260\n105786,1175\n105787,893\n105788,158\n105789,2989\n105789,2991\n105790,442\n105791,1608\n105792,105793\n105794,310\n105795,298\n105796,485\n105797,805\n105798,72\n105799,72\n105800,2351\n105801,422\n105802,56\n105803,30\n105803,200\n105803,5405\n105804,15573\n105805,994\n105806,192\n105807,87312\n105807,153007\n105808,6789\n105809,72\n105810,1282\n105810,4571\n105810,88820\n105810,105811\n105811,588\n105811,590\n105811,994\n105811,1282\n105811,4571\n105811,88820\n105812,2719\n105813,184\n105813,2224\n105813,2244\n105813,21826\n105815,3370\n105815,3447\n105815,14453\n105816,4611\n105818,136\n105819,72\n105820,2073\n105823,483\n105824,852\n105826,994\n105827,1274\n105828,136\n105829,602\n105830,72\n105831,217\n105832,105833\n105834,275\n105834,954\n105834,72439\n105835,83\n105836,30\n105837,105838\n105839,557\n105840,175\n105841,1116\n105842,1265\n105842,1266\n105843,105843\n105844,298\n105845,136\n105846,875\n105847,105848\n105849,671\n105850,105851\n105852,160\n105854,195\n105855,105856\n105855,106821\n105855,108262\n105857,358\n105858,10\n105859,105860\n105861,3003\n105862,6387\n105863,481\n105864,809\n105866,1707\n105867,875\n105869,581\n105870,184\n105872,527\n105873,3209\n105874,602\n105875,6387\n105876,2995\n105877,3161\n105878,636\n105879,298\n105880,4177\n105881,247\n105882,195\n105883,3960\n105884,254\n105885,1309\n105886,54284\n105887,3\n105888,79\n105889,8788\n105890,83\n105892,302\n105892,2116\n105893,8992\n105894,298\n105895,485\n105896,1151\n105897,13\n105898,392\n105899,273\n105900,2116\n105902,1012\n105903,557\n105904,30\n105905,557\n105906,10\n105906,67343\n105908,105907\n105909,72\n105910,346\n105911,105912\n105913,431\n105913,784\n105914,158\n105914,333\n105915,602\n105916,346\n105916,2590\n105917,2626\n105918,105919\n105920,105921\n105922,577\n105923,602\n105924,862\n105925,1506\n105926,8270\n105927,4611\n105928,450\n105929,83\n105930,5301\n105931,272\n105932,269\n105933,261\n105934,4611\n105935,105936\n105937,105938\n105939,1707\n105940,310\n105941,442\n105941,1368\n105941,3474\n105944,23701\n105945,602\n105946,298\n105947,485\n105948,4101\n105949,34\n105949,35\n105949,2784\n105950,255\n105951,72\n105952,10\n105953,1402\n105954,72\n105956,298\n105957,485\n105958,376\n105959,422\n105960,422\n105961,422\n105962,422\n105963,2590\n105964,422\n105965,422\n105966,422\n105967,422\n105968,105969\n105970,346\n105972,207\n105974,1634\n105975,105976\n105977,872\n105978,1429\n105979,668\n105980,1087\n105981,1891\n105982,422\n105983,422\n105984,1127\n105985,422\n105986,105987\n105988,105989\n105991,72\n105993,105994\n105995,3623\n105996,55849\n105997,105998\n105999,2315\n106000,1143\n106001,202\n106002,14453\n106004,37\n106004,63\n106004,447\n106004,493\n106004,1512\n106004,1740\n106004,1821\n106004,5992\n106005,1983\n106006,106007\n106008,422\n106009,106010\n106011,4545\n106011,106012\n106011,139010\n106013,126\n106014,106015\n106014,108478\n106014,125155\n106014,125687\n106016,422\n106017,1467\n106018,72\n106019,23011\n106020,346\n106021,862\n106022,843\n106023,175\n106024,1871\n106025,298\n106026,602\n106027,2590\n106028,13980\n106030,376\n106031,2671\n106032,1634\n106033,106034\n106035,118\n106035,4597\n106036,106037\n106038,72\n106039,1436\n106040,7358\n106040,7363\n106041,77\n106042,72\n106043,72\n106044,217\n106045,106046\n106047,106048\n106049,146\n106050,388\n106051,4453\n106052,58\n106053,106054\n106055,2424\n106056,1634\n106057,118\n106057,4597\n106058,118\n106058,333\n106059,28072\n106060,106061\n106062,1571\n106064,9015\n106065,106066\n106065,106671\n106067,585\n106068,171\n106069,1130\n106071,693\n106072,106073\n106072,108324\n106074,366\n106075,3260\n106076,718\n106077,233\n106078,106079\n106080,298\n106081,485\n106082,273\n106083,1127\n106083,1590\n106083,2353\n106084,175\n106085,298\n106087,515\n106087,4039\n106087,68069\n106088,2244\n106090,503\n106091,104\n106092,2353\n106093,2266\n106094,872\n106095,355\n106096,358\n106097,106098\n106097,157231\n106099,195\n106100,151\n106100,5440\n106101,15573\n106102,536\n106102,33424\n106103,4475\n106104,222\n106104,536\n106104,18831\n106105,3177\n106107,298\n106108,485\n106109,515\n106109,1381\n106110,1983\n106111,32\n106112,222\n106112,455\n106112,1019\n106113,309\n106113,310\n106115,298\n106116,485\n106117,219\n106118,106119\n106120,310\n106121,875\n106122,106123\n106124,72\n106125,344\n106126,285\n106127,1140\n106129,219\n106130,134\n106131,949\n106132,647\n106133,344\n106134,1556\n106135,207\n106137,30\n106138,647\n106139,3695\n106140,6837\n106141,269\n106143,431\n106144,1983\n106145,1379\n106146,481\n106147,75912\n106148,2353\n106149,968\n106150,647\n106151,344\n106152,596\n106154,4611\n106155,1544\n106158,1479\n106159,1983\n106160,647\n106161,344\n106162,106163\n106165,178\n106166,1181\n106167,206\n106168,111\n106168,273\n106168,652\n106169,195\n106170,280\n106170,17245\n106171,134\n106172,8822\n106173,704\n106174,79\n106175,1326\n106175,5547\n106176,1167\n106176,1204\n106176,1319\n106176,1544\n106177,417\n106178,779\n106179,483\n106180,3\n106180,251\n106180,3003\n106181,1858\n106182,1860\n106183,875\n106185,3623\n106186,30\n106188,2867\n106188,2868\n106190,1326\n106191,8180\n106192,805\n106193,3623\n106194,10\n106194,1608\n106198,2995\n106199,652\n106200,72\n106200,94\n106201,843\n106202,30\n106203,338\n106203,392\n106203,918\n106203,3260\n106205,500\n106206,3623\n106207,30\n106209,3623\n106210,1181\n106211,941\n106212,1722\n106214,1285\n106214,2620\n106215,83\n106216,3623\n106217,1801\n106218,259\n106218,336\n106219,872\n106220,1014\n106221,1179\n106222,1285\n106223,497\n106224,1285\n106225,269\n106225,1684\n106226,1509\n106228,872\n106229,1285\n106230,467\n106231,393\n106232,3623\n106233,310\n106234,41\n106234,1285\n106235,647\n106236,344\n106237,3538\n106238,527\n106240,106241\n106242,483\n106242,232766\n106244,440\n106245,1285\n106246,536\n106246,2979\n106246,3804\n106247,211\n106247,4078\n106247,7124\n106248,146\n106249,1453\n106250,818\n106251,4039\n106255,356\n106255,852\n106255,1801\n106255,5591\n106256,195\n106257,184\n106258,1983\n106259,20\n106259,707\n106259,713\n106260,872\n106261,685\n106262,106263\n106264,1151\n106265,861\n106266,1326\n106267,615\n106268,195\n106268,640\n106269,30\n106270,195\n106271,1390\n106272,34\n106272,35\n106273,102\n106274,79\n106274,192\n106274,392\n106274,1177\n106274,1400\n106274,1402\n106274,2210\n106275,1323\n106277,106278\n106279,17228\n106280,17334\n106281,83\n106282,3960\n106283,2574\n106284,106285\n106286,1983\n106287,647\n106288,344\n106289,2506\n106290,403\n106291,3623\n106293,1243\n106294,3623\n106295,875\n106296,1132\n106297,781\n106298,326\n106299,760\n106300,366\n106300,640\n106303,1977\n106303,1978\n106305,440\n106306,146\n106306,106502\n106307,106307\n106308,1419\n106311,726\n106312,2460\n106313,1983\n106314,79\n106315,949\n106316,206\n106317,79\n106319,843\n106320,26041\n106321,79\n106322,861\n106323,647\n106324,344\n106325,3623\n106327,435\n106328,175\n106329,240\n106330,298\n106332,1243\n106333,663\n106334,32\n106335,207\n106336,3138\n106337,7757\n106338,171\n106342,106343\n106344,106345\n106346,3623\n106347,94409\n106349,2353\n106350,106351\n106354,843\n106355,704\n106357,356\n106358,163\n106358,305\n106358,489\n106358,1132\n106359,298\n106360,485\n106361,1332\n106361,1844\n106362,3623\n106363,760\n106364,1127\n106365,301\n106365,615\n106366,30\n106368,503\n106369,720\n106370,3623\n106371,760\n106372,106373\n106374,301\n106374,372\n106374,907\n106374,968\n106374,1544\n106374,1837\n106374,1955\n106374,2620\n106376,68\n106377,671\n106377,1590\n106377,1644\n106377,1776\n106377,33298\n106378,30\n106379,3623\n106380,2334\n106381,1257\n106383,289\n106383,290\n106383,1274\n106384,30\n106386,485\n106388,23783\n106389,23783\n106390,3623\n106391,907\n106392,1415\n106393,30\n106394,106395\n106397,106398\n106399,106400\n106399,110005\n106401,23783\n106402,1631\n106403,326\n106405,63\n106405,202\n106405,203\n106405,251\n106405,252\n106405,516\n106405,663\n106405,1243\n106405,1512\n106405,1927\n106405,5992\n106405,17772\n106406,3623\n106407,30\n106408,1955\n106409,1151\n106410,6051\n106411,3623\n106412,72\n106413,23783\n106414,1289\n106415,298\n106416,485\n106417,289\n106417,290\n106418,1509\n106419,1639\n106419,3695\n106421,994\n106423,72\n106424,344\n106425,285\n106426,366\n106427,106428\n106429,30\n106430,140\n106430,264\n106431,862\n106432,1462\n106432,8537\n106433,1639\n106434,422\n106435,30\n106436,10\n106438,1016\n106440,2775\n106441,447\n106442,111\n106443,215\n106444,285\n106445,596\n106446,106447\n106448,571\n106448,868\n106449,1016\n106450,827\n106451,44013\n106452,5976\n106453,1332\n106454,217\n106455,44\n106456,2867\n106456,2868\n106457,3447\n106458,2146\n106459,126\n106460,4066\n106461,3413\n106462,3161\n106463,1313\n106464,874\n106465,192\n106466,1939\n106467,10\n106468,676\n106469,1381\n106470,1265\n106470,1266\n106471,3209\n106472,859\n106473,332\n106474,225\n106475,3148\n106476,5405\n106477,2797\n106478,158\n106479,1572\n106480,346\n106481,333\n106482,2931\n106483,30\n106484,8270\n106485,2697\n106486,1102\n106487,302\n106488,1414\n106489,1001\n106490,3804\n106491,1579\n106492,1955\n106492,66500\n106493,3\n106494,206\n106495,422\n106496,56\n106497,717\n106498,2867\n106498,2868\n106499,707\n106499,156379\n106501,58\n106503,211\n106505,195\n106506,106507\n106508,1220\n106508,1222\n106509,252\n106510,251\n106511,240\n106512,106513\n106515,136\n106516,175\n106517,68\n106518,298\n106519,1381\n106520,1235\n106520,1335\n106520,21944\n106522,994\n106523,106524\n106525,305\n106526,557\n106527,1893\n106528,106529\n106530,3507\n106532,106533\n106534,2574\n106535,255\n106536,41\n106537,30\n106539,376\n106540,30\n106541,483\n106542,30\n106543,217\n106544,255\n106545,875\n106546,255\n106547,267\n106548,140\n106549,255\n106550,106551\n106552,106552\n106553,79\n106554,1132\n106555,781\n106556,467\n106557,557\n106558,106559\n106560,557\n106561,1140\n106562,106563\n106564,106565\n106566,30\n106567,631\n106568,184\n106569,1983\n106570,1\n106571,557\n106572,875\n106573,72\n106574,344\n106575,285\n106576,106577\n106578,323\n106579,289\n106579,290\n106580,106581\n106582,310\n106583,106584\n106585,255\n106586,1332\n106587,647\n106588,344\n106589,106590\n106591,106592\n106593,1033\n106594,30\n106595,1298\n106596,44\n106597,972\n106598,30\n106599,106600\n106601,275\n106604,3623\n106605,298\n106606,485\n106607,134\n106607,138\n106607,5694\n106608,106608\n106609,1509\n106610,207\n106611,298\n106612,485\n106613,68\n106614,106615\n106616,358\n106617,2797\n106618,1893\n106619,704\n106620,4611\n106621,4611\n106622,192\n106622,602\n106623,250\n106623,1684\n106624,280\n106624,17245\n106625,106626\n106627,2173\n106627,19413\n106629,392\n106630,3623\n106632,647\n106633,344\n106634,1235\n106634,1335\n106636,493\n106638,106639\n106638,118697\n106640,106641\n106642,602\n106643,2116\n106645,1556\n106646,106647\n106649,841\n106650,577\n106652,323\n106653,10\n106654,636\n106655,106656\n106655,108617\n106655,109483\n106655,111542\n106655,123477\n106655,123915\n106655,124520\n106655,125751\n106655,125760\n106655,125798\n106655,131526\n106655,150579\n106657,252\n106658,106659\n106661,105912\n106662,106663\n106664,55849\n106666,106667\n106668,106669\n106670,310\n106672,106673\n106674,195\n106674,202\n106674,203\n106674,27217\n106676,106677\n106678,106679\n106680,2590\n106681,106682\n106683,3623\n106684,2590\n106685,875\n106686,32475\n106687,17588\n106688,178\n106688,346\n106689,68\n106690,2995\n106691,106692\n106693,106692\n106694,106692\n106695,118\n106695,4597\n106697,207\n106698,760\n106699,1149\n106700,8822\n106701,106692\n106703,392\n106704,106705\n106706,704\n106707,626\n106707,1881\n106708,872\n106709,1429\n106710,106711\n106712,184\n106713,1001\n106714,668\n106715,1531\n106716,586\n106717,32\n106719,106720\n106722,233\n106724,167\n106725,1240\n106726,527\n106726,95152\n106727,106728\n106730,718\n106731,338\n106732,273\n106733,106734\n106735,78232\n106736,106737\n106738,207\n106739,106740\n106741,72\n106742,30\n106743,10\n106744,106745\n106746,366\n106747,366\n106748,298\n106749,485\n106750,366\n106751,1220\n106751,1222\n106752,252\n106753,251\n106754,3623\n106755,875\n106756,106757\n106758,1402\n106759,682\n106759,1353\n106759,72439\n106760,1860\n106761,1572\n106762,1118\n106763,195\n106764,1096\n106765,717\n106766,309\n106766,310\n106767,379\n106767,1010\n106768,366\n106769,48\n106769,254\n106769,647\n106770,106771\n106772,298\n106773,485\n106774,518\n106775,32\n106775,1515\n106775,141912\n106776,422\n106777,422\n106778,422\n106779,422\n106780,422\n106781,422\n106782,312\n106783,1132\n106784,781\n106785,344\n106787,379\n106787,2784\n106788,30\n106789,202\n106789,203\n106790,1132\n106791,781\n106792,422\n106793,422\n106794,1143\n106796,1579\n106796,1893\n106796,3538\n106797,106798\n106799,106798\n106800,356\n106801,3507\n106802,422\n106803,422\n106804,298\n106805,485\n106806,106807\n106808,3623\n106809,493\n106810,31893\n106810,110762\n106811,1860\n106813,657\n106814,310\n106815,843\n106815,991\n106815,992\n106815,1014\n106816,298\n106817,485\n106818,6119\n106819,184\n106819,602\n106819,1515\n106820,1118\n106822,1132\n106823,781\n106824,79\n106830,602\n106833,22\n106834,134\n106834,135\n106834,137\n106834,138\n106834,1415\n106834,2638\n106834,2675\n106834,2775\n106834,2804\n106834,3247\n106834,3678\n106834,5694\n106834,7938\n106834,8049\n106834,16235\n106834,16717\n106834,16966\n106834,21795\n106834,21867\n106834,48188\n106834,72021\n106834,79314\n106834,101440\n106834,106835\n106834,111223\n106834,113501\n106834,113735\n106834,119924\n106834,120010\n106834,120965\n106834,120966\n106834,152199\n106834,174393\n106836,106837\n106838,22\n106839,349\n106840,175\n106841,77\n106841,862\n106842,106843\n106842,117294\n106844,72\n106845,3623\n106846,749\n106847,30\n106848,442\n106849,3507\n106850,1860\n106852,106853\n106854,1860\n106855,1453\n106856,1332\n106857,1732\n106858,1390\n106859,4355\n106860,3467\n106861,3328\n106862,3467\n106863,1132\n106864,781\n106865,3623\n106866,872\n106867,1070\n106867,6837\n106869,3623\n106870,304\n106871,175\n106873,422\n106875,298\n106876,626\n106877,106878\n106879,298\n106880,485\n106881,106882\n106883,1858\n106884,1860\n106886,868\n106887,259\n106887,493\n106888,1127\n106889,83\n106891,994\n106893,147\n106893,158\n106894,1836\n106895,106896\n106895,114788\n106895,123791\n106895,139087\n106895,151260\n106897,920\n106898,493\n106899,66\n106899,868\n106901,872\n106902,1019\n106903,406\n106904,1559\n106905,366\n106906,1276\n106907,313\n106908,493\n106909,3\n106910,7\n106911,1247\n106912,3623\n106913,1132\n106914,781\n106915,503\n106916,10\n106917,252\n106918,657\n106919,483\n106919,588\n106919,590\n106920,805\n106921,3623\n106922,3623\n106923,579\n106924,760\n106925,1860\n106926,338\n106927,151\n106927,1400\n106927,2073\n106928,1858\n106930,1072\n106931,360\n106931,1127\n106931,1893\n106932,994\n106933,215\n106934,640\n106935,3623\n106936,3138\n106937,126\n106937,640\n106938,957\n106940,1983\n106941,1623\n106942,1045\n106942,137589\n106943,1977\n106943,1978\n106944,1983\n106945,372\n106945,1085\n106946,1130\n106947,1132\n106948,781\n106949,14366\n106950,3\n106950,230509\n106950,230517\n106951,450\n106952,515\n106953,450\n106955,875\n106956,30331\n106957,1858\n106958,1860\n106959,140\n106962,1323\n106963,102\n106964,1326\n106965,1220\n106965,1222\n106966,252\n106967,251\n106968,45437\n106969,622\n106970,217\n106970,272\n106970,489\n106970,1370\n106970,1623\n106972,602\n106973,55849\n106974,647\n106975,344\n106977,422\n106978,56\n106979,106980\n106981,760\n106983,272\n106984,1474\n106985,500\n106985,2073\n106986,999\n106987,99\n106988,358\n106989,30\n106992,518\n106993,1243\n106994,338\n106994,1151\n106996,298\n106997,485\n106998,30\n106999,30\n107000,1465\n107002,30\n107003,660\n107004,1085\n107005,21944\n107006,247\n107007,893\n107008,89035\n107010,298\n107011,485\n107012,107013\n107015,10\n107016,302\n107017,1515\n107018,206\n107018,1326\n107018,156379\n107020,510\n107021,1515\n107022,79\n107023,171\n107025,356\n107026,972\n107027,388\n107028,1019\n107029,273\n107030,406\n107031,1515\n107032,68069\n107032,141912\n107033,79\n107034,158\n107035,713\n107036,107037\n107038,22\n107039,392\n107041,843\n107042,1370\n107043,477\n107043,32475\n107044,779\n107045,273\n107046,647\n107047,344\n107048,360\n107048,1893\n107049,779\n107049,1181\n107049,68069\n107050,3003\n107051,68069\n107051,141912\n107052,302\n107052,579\n107053,818\n107054,1181\n107055,206\n107057,240\n107058,743\n107058,8714\n107059,843\n107060,10\n107061,843\n107062,1556\n107063,107064\n107065,107064\n107065,188227\n107066,657\n107067,1326\n107069,3623\n107070,563\n107071,30\n107072,151\n107073,301\n107073,615\n107073,1293\n107075,202\n107075,203\n107076,115\n107076,118\n107077,2436\n107078,406\n107079,644\n107079,697\n107080,217\n107080,1417\n107081,217\n107081,1417\n107082,3182\n107083,775\n107083,1619\n107084,83\n107084,304\n107085,107086\n107087,2315\n107088,298\n107089,485\n107090,422\n107091,56\n107092,3623\n107094,602\n107095,30\n107096,3\n107096,372\n107097,4101\n107098,1707\n107099,30\n107100,34\n107100,35\n107100,313\n107100,634\n107100,1724\n107100,2646\n107100,115474\n107101,718\n107103,83\n107104,726\n107105,3623\n107106,433\n107107,2073\n107108,493\n107109,862\n107109,1010\n107110,30\n107111,30\n107112,151\n107115,309\n107115,310\n107115,483\n107116,433\n107117,298\n107118,485\n107119,3623\n107120,107121\n107120,129340\n107120,185161\n107120,241521\n107122,3623\n107125,1113\n107126,175\n107127,3193\n107128,298\n107129,3623\n107130,772\n107131,30\n107132,3003\n107134,30\n107135,557\n107136,151\n107137,577\n107138,422\n107139,56\n107140,302\n107140,1240\n107140,1436\n107140,1465\n107141,415\n107142,14126\n107144,273\n107145,107146\n107147,146\n107147,106502\n107148,158\n107149,3623\n107151,1132\n107152,781\n107153,298\n107154,485\n107156,358\n107157,1085\n107157,1955\n107158,107158\n107159,298\n107160,485\n107161,1837\n107162,72764\n107163,104\n107163,136\n107163,254\n107163,557\n107163,953\n107163,954\n107163,1368\n107163,1939\n107163,10318\n107164,107165\n107167,222\n107168,2779\n107169,1467\n107170,1132\n107171,781\n107172,1012\n107172,1119\n107172,1177\n107173,557\n107174,557\n107175,3623\n107176,298\n107177,485\n107178,693\n107179,2116\n107180,206\n107181,192\n107181,219\n107181,240\n107182,28072\n107183,120\n107183,273\n107183,1052\n107184,1132\n107185,781\n107186,3623\n107187,1417\n107188,872\n107189,30\n107191,1891\n107192,107193\n107194,217\n107194,536\n107194,1417\n107195,107196\n107197,862\n107198,577\n107199,222\n107199,2266\n107200,107201\n107202,477\n107203,1043\n107204,310\n107205,862\n107206,273\n107207,704\n107208,718\n107209,392\n107210,1033\n107211,1181\n107213,376\n107215,272\n107215,4455\n107216,1181\n107217,175\n107218,298\n107219,1509\n107220,422\n107221,56\n107222,298\n107223,485\n107224,298\n107225,485\n107226,3623\n107227,107228\n107229,107230\n107231,192\n107232,644\n107233,392\n107234,596\n107235,2590\n107236,298\n107237,485\n107239,37\n107239,717\n107240,2867\n107240,2868\n107241,32\n107241,392\n107242,406\n107243,1181\n107244,1452\n107245,207\n107246,862\n107247,581\n107248,10\n107249,298\n107250,485\n107251,589\n107253,872\n107254,1429\n107255,107256\n107258,1265\n107258,1266\n107259,929\n107260,668\n107261,68\n107262,309\n107262,310\n107262,483\n107263,2367\n107265,273\n107266,1089\n107266,107267\n107269,1677\n107270,22\n107271,192\n107272,602\n107273,602\n107274,107275\n107276,37759\n107277,107278\n107279,338\n107279,107548\n107280,338\n107281,1143\n107282,30\n107283,3623\n107284,1241\n107285,107286\n107287,1085\n107288,107289\n107290,107289\n107292,2266\n107294,2590\n107295,34\n107295,202\n107295,203\n107295,1001\n107295,1572\n107295,3252\n107295,7092\n107296,107297\n107298,557\n107299,312\n107299,358\n107299,509\n107300,3623\n107301,1238\n107302,779\n107303,30\n107304,72\n107305,118\n107305,4597\n107306,175\n107307,483\n107308,298\n107309,1452\n107310,1871\n107311,30\n107312,107313\n107316,107317\n107318,107319\n107320,255\n107322,107323\n107324,8991\n107327,233\n107328,481\n107330,571\n107332,1181\n107333,107334\n107335,1252\n107335,1253\n107336,355\n107338,107339\n107340,344\n107342,99\n107343,718\n107344,388\n107345,275\n107346,310\n107347,309\n107347,310\n107347,31976\n107349,422\n107350,56\n107351,1454\n107352,2178\n107352,4545\n107353,175\n107354,590\n107354,2178\n107354,4545\n107354,17245\n107355,298\n107356,222\n107356,2266\n107357,422\n107360,422\n107361,422\n107362,422\n107363,1204\n107364,422\n107365,422\n107366,3538\n107367,107368\n107369,217\n107369,278\n107370,500\n107371,602\n107372,107373\n107374,652\n107375,151\n107376,195\n107376,285\n107376,1515\n107377,500\n107377,1227\n107377,86416\n107378,30\n107379,779\n107379,1515\n107379,92476\n107379,106502\n107380,1181\n107381,30\n107382,137\n107383,340\n107384,422\n107385,697\n107386,760\n107387,4611\n107388,1544\n107389,811\n107390,30\n107391,137\n107392,647\n107393,344\n107395,1181\n107396,595\n107397,72\n107398,344\n107399,285\n107401,72\n107402,344\n107403,285\n107404,3585\n107404,9030\n107407,1531\n107408,372\n107408,390\n107409,72\n107410,30\n107411,671\n107412,671\n107413,1556\n107414,919\n107415,23783\n107416,136\n107416,137\n107418,349\n107419,1860\n107422,336\n107423,278\n107423,141912\n107425,861\n107426,252\n107427,302\n107427,861\n107428,589\n107429,447\n107430,30331\n107431,392\n107432,1467\n107433,1821\n107434,1580\n107435,3623\n107436,130\n107437,1515\n107438,1821\n107439,795\n107440,422\n107441,3079\n107442,46\n107442,744\n107442,775\n107442,3422\n107442,5662\n107443,1132\n107444,781\n107445,83\n107446,1400\n107446,1612\n107447,99807\n107448,202\n107448,203\n107449,107450\n107451,337\n107452,356\n107452,615\n107452,968\n107453,3623\n107454,47\n107454,2469\n107455,219\n107457,516\n107458,222\n107458,588\n107458,590\n107458,991\n107458,1177\n107458,8270\n107458,182162\n107459,592\n107460,130\n107460,1289\n107461,3069\n107462,417\n107463,1181\n107464,1955\n107466,690\n107467,801\n107467,1033\n107467,1160\n107467,3474\n107467,40566\n107467,66297\n107468,392\n107468,697\n107468,1363\n107468,2699\n107468,4903\n107469,872\n107469,150022\n107470,107471\n107472,3623\n107473,3623\n107474,7358\n107474,7363\n107475,2557\n107476,292\n107477,422\n107478,1381\n107480,4611\n107481,1544\n107482,1803\n107483,264\n107483,497\n107483,1579\n107483,3258\n107483,13538\n107484,30\n107485,2116\n107485,258973\n107486,1323\n107487,102\n107488,1326\n107489,2205\n107489,2296\n107489,33424\n107490,1381\n107491,2116\n107492,920\n107492,1782\n107492,7092\n107493,310\n107494,622\n107495,1580\n107497,704\n107498,137\n107499,107500\n107501,310\n107503,287\n107503,809\n107504,795\n107505,107506\n107507,827\n107508,636\n107509,422\n107510,422\n107511,4611\n107512,1544\n107514,1821\n107515,422\n107516,872\n107517,79\n107518,1243\n107519,4611\n107520,1544\n107521,567\n107522,827\n107523,872\n107524,302\n107525,151\n107525,1891\n107525,3585\n107526,1893\n107526,1968\n107526,17346\n107527,310\n107529,406\n107530,14650\n107531,30\n107532,481\n107533,346\n107534,518\n107535,107536\n107537,72\n107538,261\n107540,30\n107541,1132\n107542,781\n107543,1390\n107544,1235\n107544,1335\n107545,3623\n107546,68069\n107547,28072\n107549,299\n107550,2443\n107551,1289\n107551,1551\n107552,22\n107553,107554\n107555,2443\n107556,647\n107557,344\n107558,647\n107559,344\n107560,83\n107563,72\n107564,2353\n107565,1860\n107566,79\n107567,30\n107569,30\n107570,107571\n107572,32\n107572,697\n107572,809\n107573,1782\n107574,202\n107574,203\n107574,440\n107574,631\n107575,7124\n107576,181063\n107577,222\n107578,240\n107579,97\n107580,217\n107581,3623\n107583,302\n107584,4611\n107585,1572\n107587,4455\n107588,50\n107589,10\n107590,107591\n107595,3623\n107596,83\n107597,167\n107598,222\n107598,2266\n107599,22\n107600,690\n107601,1644\n107602,1805\n107604,3623\n107605,433\n107606,30\n107607,973\n107608,209\n107609,392\n107609,772\n107611,27621\n107611,27623\n107612,585\n107613,10\n107613,328\n107613,704\n107613,705\n107613,134822\n107614,439\n107615,30\n107617,30\n107618,861\n107619,1782\n107620,107621\n107622,3623\n107623,13\n107623,72\n107624,2178\n107624,4545\n107625,107626\n107627,1983\n107628,1235\n107628,1335\n107629,440\n107629,631\n107630,563\n107631,55077\n107632,1179\n107633,175\n107634,298\n107635,206\n107636,30\n107637,167\n107638,252\n107639,660\n107643,151\n107644,1033\n107645,217\n107647,417\n107648,1177\n107649,107650\n107651,34\n107651,35\n107652,392\n107653,4611\n107654,1544\n107655,102\n107655,107\n107655,207\n107655,273\n107655,1058\n107655,1313\n107655,2315\n107655,4571\n107655,6387\n107655,13136\n107655,30331\n107656,2719\n107657,3094\n107658,146\n107658,106502\n107659,1381\n107660,809\n107661,72\n107662,586\n107662,920\n107663,272\n107663,435\n107663,516\n107663,1893\n107664,107665\n107666,422\n107667,58\n107668,994\n107669,46\n107670,75912\n107671,406\n107672,805\n107673,557\n107673,954\n107674,107675\n107676,577\n107676,21944\n107677,175\n107678,298\n107679,48\n107680,4611\n107681,1544\n107684,4611\n107685,557\n107686,137\n107687,310\n107689,15\n107690,2590\n107691,195\n107692,991\n107693,750\n107693,1849\n107694,22\n107694,861\n107695,298\n107696,485\n107697,358\n107698,4611\n107699,1544\n107700,149\n107700,406\n107701,107701\n107702,2979\n107703,422\n107704,72\n107705,1644\n107706,30\n107707,83\n107708,298\n107709,485\n107710,2266\n107711,2671\n107712,609\n107713,72\n107714,422\n107715,3623\n107716,2073\n107717,30\n107718,107719\n107718,129529\n107720,536\n107721,2116\n107722,1639\n107723,873\n107724,1801\n107725,433\n107726,805\n107727,31977\n107728,850\n107729,72\n107730,390\n107731,557\n107732,557\n107733,107734\n107735,30\n107736,1655\n107737,577\n107738,83\n107739,527\n107740,4594\n107741,483\n107742,805\n107743,652\n107744,30\n107745,31977\n107746,713\n107747,310\n107748,107749\n107750,30\n107751,202\n107751,203\n107752,79\n107753,1707\n107754,192\n107755,2775\n107756,447\n107757,1238\n107758,589\n107758,775\n107758,1001\n107759,302\n107759,861\n107759,893\n107759,1220\n107759,1222\n107759,2775\n107760,2260\n107761,261\n107761,60576\n107762,278\n107762,1252\n107762,1253\n107763,2775\n107764,447\n107766,289\n107766,290\n107767,1782\n107768,2797\n107769,2590\n107770,862\n107771,30\n107771,772\n107771,3623\n107772,298\n107773,485\n107775,861\n107776,3623\n107777,1381\n107778,330\n107778,1313\n107779,207\n107780,206\n107781,294\n107782,30\n107783,4611\n107784,1544\n107785,6252\n107786,389\n107787,872\n107788,1429\n107789,20\n107790,346\n107791,107792\n107793,644\n107794,4101\n107795,1285\n107795,3328\n107796,668\n107797,255\n107798,298\n107799,485\n107800,261\n107800,333\n107801,1177\n107801,4237\n107801,182162\n107802,557\n107803,1566\n107804,107805\n107806,184\n107807,178\n107807,222\n107807,1289\n107807,2671\n107807,4545\n107807,6298\n107807,56150\n107807,139010\n107808,1143\n107809,779\n107810,1238\n107811,107812\n107811,108443\n107813,107814\n107815,107816\n107817,1590\n107818,147\n107818,2867\n107818,2868\n107819,30\n107820,433\n107821,107822\n107823,2506\n107824,72\n107825,4611\n107826,1544\n107827,1235\n107827,1335\n107828,310\n107829,30\n107830,850\n107831,310\n107832,30\n107833,1566\n107834,30\n107835,83\n107836,310\n107838,392\n107839,107840\n107841,72\n107842,14453\n107843,248\n107844,843\n107845,107846\n107847,147\n107848,376\n107849,1\n107850,310\n107851,37759\n107852,72\n107853,72\n107854,2244\n107855,72\n107856,10\n107857,72\n107858,805\n107859,310\n107861,107862\n107863,1983\n107864,107865\n107864,116939\n107864,123450\n107864,123552\n107866,107867\n107869,872\n107870,72\n107871,107872\n107873,2929\n107874,107875\n107876,107877\n107878,392\n107879,255\n107880,107881\n107882,2617\n107883,107881\n107884,3623\n107886,75912\n107887,1132\n107888,781\n107889,455\n107890,192\n107890,309\n107890,310\n107891,3623\n107892,1132\n107893,781\n107894,827\n107895,233\n107896,72\n107897,8270\n107898,83\n107899,298\n107900,485\n107901,192\n107902,107903\n107904,107903\n107905,1417\n107907,1282\n107908,273\n107909,4611\n107910,1544\n107912,4611\n107913,1544\n107914,4220\n107915,184\n107916,65\n107918,1707\n107919,2173\n107920,1127\n107921,298\n107922,485\n107924,811\n107925,433\n107926,20\n107927,3623\n107928,107928\n107929,355\n107930,861\n107931,22\n107932,861\n107933,22\n107934,2699\n107935,1132\n107936,781\n107937,273\n107937,313\n107938,4611\n107939,1544\n107940,1132\n107941,781\n107942,3756\n107943,107944\n107945,315\n107946,433\n107947,44725\n107948,483\n107949,22\n107950,861\n107951,83\n107952,647\n107953,344\n107954,222\n107955,861\n107956,22\n107957,1607\n107958,160\n107960,2699\n107961,1707\n107961,13538\n107962,68\n107963,134\n107964,107965\n107967,20\n107968,195\n107968,332\n107968,17228\n107968,27217\n107970,206\n107971,3161\n107972,135\n107974,1449\n107975,130\n107975,718\n107976,994\n107977,779\n107977,1803\n107977,68069\n107977,141912\n107978,2699\n107979,1619\n107980,994\n107980,2995\n107981,81\n107982,346\n107984,690\n107986,5591\n107987,134\n107988,1715\n107989,3413\n107990,178\n107991,72\n107992,663\n107992,1265\n107992,1266\n107993,2699\n107994,450\n107995,1556\n107996,23701\n107997,48\n107998,592\n107999,222\n107999,2266\n108000,1\n108000,130\n108000,252\n108000,340\n108000,626\n108000,647\n108000,726\n108000,827\n108000,994\n108000,1309\n108000,1313\n108000,2411\n108000,3474\n108000,21442\n108001,302\n108001,697\n108001,1381\n108001,1769\n108001,19010\n108003,298\n108004,485\n108005,79\n108006,108007\n108008,298\n108009,485\n108011,72\n108012,7\n108013,2779\n108014,200\n108015,298\n108016,485\n108017,433\n108018,586\n108019,994\n108020,240\n108020,2296\n108021,433\n108022,200\n108022,1419\n108023,1467\n108024,611\n108025,298\n108026,485\n108027,298\n108028,485\n108030,1132\n108031,781\n108033,994\n108034,994\n108035,1332\n108036,6955\n108037,1566\n108039,714\n108039,33424\n108040,83\n108042,252\n108042,1220\n108042,1222\n108043,557\n108044,298\n108045,485\n108046,1390\n108047,611\n108048,838\n108048,1293\n108049,861\n108050,861\n108051,22\n108052,22\n108053,108054\n108055,273\n108057,310\n108058,676\n108059,255\n108060,1132\n108061,781\n108062,336\n108062,868\n108063,589\n108064,108065\n108067,171\n108067,330\n108068,1132\n108069,781\n108070,346\n108071,163\n108071,579\n108071,893\n108071,1556\n108071,2674\n108071,162599\n108072,30\n108074,704\n108075,388\n108076,206\n108077,192\n108077,1113\n108078,171\n108079,2411\n108080,1287\n108081,108082\n108084,467\n108086,17476\n108087,272\n108087,1332\n108088,467\n108089,1634\n108090,1132\n108091,781\n108092,328\n108093,1803\n108094,108095\n108096,718\n108097,7360\n108098,392\n108102,1247\n108102,164572\n108103,30331\n108104,3297\n108105,3\n108106,72\n108107,310\n108108,2867\n108108,2868\n108109,310\n108110,1359\n108111,1181\n108113,79\n108114,289\n108114,290\n108114,94134\n108115,149\n108116,397\n108118,108119\n108120,108119\n108121,718\n108122,3623\n108123,372\n108124,2626\n108125,72\n108126,602\n108129,2260\n108130,301\n108130,304\n108130,968\n108131,240\n108131,372\n108131,1001\n108132,579\n108133,516\n108134,1688\n108135,217\n108137,602\n108138,779\n108138,1052\n108138,68069\n108139,298\n108140,485\n108142,298\n108143,485\n108144,2506\n108145,1707\n108147,433\n108148,985\n108150,108151\n108152,704\n108153,328\n108154,433\n108155,602\n108156,712\n108157,298\n108158,485\n108161,22\n108162,861\n108163,328\n108164,450\n108165,1429\n108165,1509\n108166,137\n108166,163\n108166,349\n108166,663\n108166,968\n108166,1572\n108166,2750\n108166,3612\n108167,1983\n108168,298\n108169,485\n108170,1287\n108171,72\n108172,483\n108173,718\n108174,41\n108175,302\n108175,2116\n108176,41\n108177,602\n108178,2699\n108180,108181\n108182,298\n108183,485\n108184,298\n108185,485\n108186,433\n108187,305\n108188,34\n108188,7652\n108189,298\n108190,485\n108191,217\n108192,108193\n108194,346\n108196,55849\n108197,1515\n108198,3623\n108199,72\n108200,30\n108200,328\n108201,657\n108202,3623\n108203,126\n108204,298\n108205,485\n108207,55849\n108209,108210\n108211,19\n108211,146\n108211,743\n108211,749\n108211,106502\n108212,3\n108213,1309\n108214,328\n108215,175\n108216,298\n108217,1939\n108218,108219\n108220,108219\n108221,55849\n108222,72\n108223,55849\n108224,55849\n108225,108226\n108227,3623\n108228,3872\n108229,3193\n108230,1556\n108232,5591\n108233,809\n108234,8270\n108235,298\n108236,485\n108237,9006\n108238,13546\n108239,2868\n108239,3413\n108240,1392\n108241,2351\n108242,108243\n108244,8719\n108245,138\n108246,557\n108247,137\n108248,118\n108248,4597\n108249,21944\n108251,865\n108252,137\n108253,557\n108254,596\n108254,843\n108254,1801\n108255,108256\n108257,310\n108258,151\n108259,298\n108260,485\n108261,217\n108263,10\n108264,376\n108265,557\n108266,557\n108267,557\n108268,298\n108269,485\n108270,718\n108271,298\n108272,485\n108273,68069\n108273,141912\n108274,510\n108275,743\n108275,1140\n108275,130618\n108276,108277\n108278,718\n108280,346\n108281,79\n108282,536\n108282,2006\n108282,2620\n108282,3367\n108282,44725\n108284,298\n108285,485\n108286,298\n108287,485\n108288,215\n108289,934\n108290,527\n108291,1773\n108292,450\n108293,108294\n108295,7358\n108295,7363\n108296,20\n108297,772\n108298,72\n108299,344\n108301,285\n108303,108304\n108305,298\n108306,485\n108309,298\n108310,485\n108311,289\n108311,290\n108312,108313\n108314,298\n108315,485\n108316,557\n108317,5908\n108318,310\n108319,298\n108320,485\n108321,298\n108322,485\n108323,72\n108325,6068\n108326,309\n108326,310\n108327,298\n108328,485\n108329,298\n108330,485\n108331,72\n108333,30\n108334,2931\n108335,72\n108336,72\n108338,636\n108339,108340\n108339,157792\n108341,1939\n108342,147\n108342,1265\n108342,1266\n108343,108344\n108345,628\n108346,108347\n108348,108349\n108350,58\n108351,1147\n108352,108353\n108354,108353\n108355,108353\n108356,108353\n108357,108353\n108358,72\n108359,1235\n108359,1247\n108359,1335\n108359,3148\n108359,19031\n108359,164572\n108360,147\n108361,21944\n108362,779\n108363,108364\n108366,108367\n108368,30\n108369,7416\n108371,225\n108372,2146\n108373,108374\n108375,8884\n108376,1085\n108377,483\n108378,2867\n108378,2868\n108379,10\n108379,198\n108379,1773\n108379,108379\n108379,206059\n108379,221314\n108380,872\n108381,108382\n108383,6027\n108384,290\n108384,2797\n108385,2697\n108386,30\n108387,195\n108388,3069\n108390,481\n108391,28072\n108392,9195\n108393,72\n108394,72\n108395,344\n108396,285\n108397,2915\n108397,72439\n108399,393\n108400,108401\n108400,113187\n108400,113705\n108402,366\n108403,366\n108404,366\n108405,72\n108406,417\n108407,108408\n108409,184\n108410,4066\n108411,355\n108412,5547\n108413,515\n108414,640\n108415,5366\n108416,72\n108417,206\n108418,2605\n108420,385\n108421,1707\n108422,108423\n108424,30\n108425,206\n108427,366\n108428,108429\n108430,30\n108431,30\n108432,30\n108433,718\n108434,481\n108435,2351\n108436,298\n108437,485\n108439,83\n108441,433\n108442,65567\n108444,718\n108445,83\n108446,346\n108448,72\n108449,344\n108450,285\n108451,1177\n108452,1566\n108453,108454\n108455,1983\n108456,3585\n108457,108458\n108459,72\n108460,344\n108461,285\n108462,108463\n108464,72\n108465,479\n108466,393\n108467,805\n108468,108469\n108470,4597\n108471,298\n108472,485\n108473,310\n108474,805\n108475,108476\n108477,779\n108477,68069\n108477,141912\n108479,30\n108481,108482\n108481,114936\n108483,481\n108484,30\n108485,973\n108485,1968\n108486,106\n108487,298\n108488,485\n108491,628\n108491,1796\n108493,5547\n108494,108495\n108494,133152\n108497,108498\n108499,1983\n108499,111142\n108500,202\n108501,30\n108502,30\n108503,302\n108504,261\n108505,72\n108506,72\n108507,108508\n108509,72\n108510,344\n108511,285\n108512,240\n108513,72\n108515,72\n108516,718\n108518,108519\n108520,72\n108521,298\n108522,485\n108523,1984\n108524,108525\n108524,122698\n108526,108527\n108526,216019\n108526,217160\n108529,760\n108530,108531\n108532,72\n108533,72\n108534,72\n108535,134\n108536,72\n108537,108538\n108539,72\n108540,346\n108541,108542\n108543,2083\n108545,1608\n108546,72\n108547,108548\n108549,346\n108550,875\n108551,72\n108552,344\n108553,285\n108555,192\n108555,44725\n108556,108557\n108559,83\n108559,130\n108559,1616\n108559,8072\n108560,108561\n108562,108561\n108563,30\n108565,2334\n108566,1353\n108567,310\n108569,2995\n108570,206\n108571,1847\n108572,72\n108573,9029\n108574,3623\n108575,108576\n108577,7\n108578,376\n108579,640\n108580,333\n108581,1102\n108582,652\n108583,8788\n108584,108585\n108586,108587\n108588,192\n108588,3367\n108589,108590\n108591,2506\n108592,118\n108592,4597\n108593,108594\n108595,108596\n108597,770\n108598,2779\n108599,298\n108600,485\n108601,779\n108602,72\n108603,4\n108603,5\n108604,1479\n108605,30\n108606,390\n108607,4810\n108608,2073\n108609,779\n108610,30\n108611,72\n108612,72\n108613,72\n108615,108616\n108618,389\n108619,273\n108620,108621\n108622,1556\n108623,6323\n108624,108625\n108626,907\n108626,7363\n108627,1531\n108628,1085\n108629,108630\n108631,108632\n108633,1359\n108634,287\n108635,108636\n108637,1402\n108638,358\n108639,30\n108640,108641\n108643,102\n108644,30\n108645,30\n108646,108647\n108648,366\n108649,366\n108650,392\n108650,1151\n108651,72\n108652,72\n108653,108654\n108655,2995\n108656,108657\n108658,108657\n108659,30\n108660,108661\n108662,108663\n108664,30\n108666,483\n108667,108667\n108668,671\n108669,349\n108671,108672\n108673,108674\n108675,83\n108676,108677\n108676,171675\n108678,1634\n108681,872\n108683,32\n108683,392\n108683,697\n108684,23783\n108685,310\n108686,3447\n108687,3413\n108688,8270\n108689,206\n108690,233\n108691,108692\n108693,108694\n108695,557\n108696,107\n108697,292\n108698,2416\n108698,2417\n108699,338\n108700,298\n108701,108702\n108703,1133\n108704,3538\n108707,310\n108708,108709\n108710,30\n108711,108712\n108713,108714\n108715,108716\n108715,122826\n108715,126240\n108718,83\n108719,355\n108721,3804\n108721,8270\n108723,310\n108724,108725\n108726,298\n108727,485\n108731,9195\n108732,1359\n108733,1579\n108733,1659\n108734,255\n108735,255\n108736,255\n108737,255\n108738,13980\n108739,481\n108740,118\n108740,4597\n108741,71\n108741,72\n108741,485\n108741,611\n108741,1612\n108741,255750\n108742,240\n108743,108744\n108746,2506\n108747,108748\n108749,872\n108750,872\n108751,392\n108752,255\n108753,30\n108754,509\n108754,510\n108754,872\n108754,150022\n108755,422\n108756,422\n108757,422\n108758,422\n108759,422\n108760,422\n108761,422\n108762,422\n108763,872\n108764,422\n108765,422\n108766,422\n108767,3538\n108768,779\n108769,108770\n108772,108772\n108773,108774\n108775,941\n108776,602\n108777,255\n108778,30\n108779,108780\n108781,1608\n108782,483\n108783,247\n108784,269\n108785,17228\n108786,2699\n108787,254\n108787,557\n108788,261\n108790,273\n108791,1326\n108791,15573\n108792,2506\n108793,108794\n108795,108794\n108796,108797\n108798,108799\n108800,108801\n108802,108803\n108804,108805\n108806,192\n108806,222\n108807,1414\n108808,108809\n108810,805\n108811,108812\n108813,108814\n108815,68069\n108817,108818\n108819,850\n108820,108821\n108822,3079\n108823,108824\n108825,108826\n108827,30\n108828,850\n108830,2224\n108832,108833\n108834,20\n108834,408\n108834,668\n108834,1087\n108834,1388\n108835,30\n108836,760\n108836,1368\n108837,310\n108838,338\n108839,108840\n108841,310\n108842,298\n108843,485\n108844,108844\n108845,2506\n108846,805\n108847,718\n108848,50\n108849,108850\n108851,108852\n108853,81070\n108854,298\n108855,485\n108856,108857\n108858,81070\n108859,1\n108859,147\n108859,158\n108860,298\n108861,485\n108862,108863\n108865,30\n108866,713\n108868,108869\n108870,108871\n108872,72\n108873,310\n108874,72\n108875,72\n108876,108877\n108878,10\n108879,1796\n108880,108881\n108882,108883\n108884,108885\n108886,30\n108887,108888\n108889,108890\n108891,108890\n108892,37\n108892,717\n108893,7698\n108894,310\n108895,108896\n108897,602\n108899,1955\n108900,455\n108900,2266\n108901,406\n108902,30\n108903,1133\n108905,79\n108905,479\n108905,1181\n108905,1572\n108906,108907\n108908,1238\n108909,108910\n108911,1452\n108912,292\n108913,294\n108914,296\n108915,298\n108916,872\n108917,108918\n108919,376\n108920,333\n108921,222\n108922,120\n108923,184\n108925,108926\n108927,187\n108928,233\n108929,2574\n108930,108931\n108932,30\n108933,30\n108934,30\n108935,3161\n108936,22\n108936,108937\n108938,108939\n108938,139162\n108941,108942\n108943,108944\n108945,108944\n108946,1722\n108947,108948\n108949,671\n108950,1359\n108951,704\n108953,44\n108954,422\n108955,422\n108956,422\n108957,422\n108958,422\n108959,422\n108960,422\n108961,422\n108962,422\n108963,422\n108964,422\n108965,422\n108966,422\n108968,349\n108969,30\n108971,3297\n108972,83\n108973,298\n108974,485\n108975,108976\n108977,30\n108978,1556\n108979,872\n108980,406\n108981,108982\n108983,1551\n108984,392\n108985,108986\n108987,310\n108988,83\n108989,433\n108990,1179\n108991,1284\n108991,1634\n108992,973\n108993,592\n108994,6424\n108995,30\n108996,20\n108997,30\n108998,485\n108999,707\n109000,109001\n109002,109003\n109004,850\n109006,251\n109007,255\n109008,718\n109009,1977\n109009,1978\n109010,2574\n109011,10\n109012,167\n109013,1181\n109014,536\n109015,240\n109016,859\n109016,874\n109017,109018\n109019,72\n109020,298\n109021,485\n109022,109023\n109024,136\n109024,137\n109024,309\n109024,310\n109024,312\n109025,109026\n109027,433\n109030,535\n109031,72\n109032,344\n109033,285\n109034,2416\n109034,2417\n109036,222\n109036,657\n109036,992\n109037,109038\n109039,109040\n109041,72\n109042,344\n109043,285\n109044,109045\n109046,932\n109047,109048\n109049,22\n109049,861\n109050,420\n109051,795\n109052,8788\n109053,2083\n109053,2191\n109053,5301\n109054,2867\n109054,2868\n109055,515\n109056,109057\n109058,818\n109059,217\n109059,536\n109059,1417\n109060,450\n109061,450\n109062,9195\n109063,743\n109064,55849\n109065,55849\n109066,109067\n109068,1257\n109069,55849\n109070,968\n109070,1370\n109071,772\n109072,109073\n109074,102\n109075,298\n109076,485\n109078,557\n109079,862\n109080,137\n109081,557\n109082,109083\n109084,376\n109085,298\n109086,485\n109087,3623\n109088,298\n109089,485\n109090,298\n109091,485\n109092,2699\n109093,298\n109094,485\n109095,109096\n109097,1983\n109099,483\n109100,298\n109101,485\n109102,206\n109103,557\n109104,557\n109105,718\n109106,346\n109107,79\n109108,557\n109109,109110\n109111,109112\n109113,2699\n109114,109115\n109116,346\n109117,109118\n109119,72\n109120,1181\n109121,1402\n109122,760\n109123,30\n109124,298\n109125,485\n109126,298\n109127,485\n109128,577\n109128,1707\n109129,1181\n109130,704\n109131,21442\n109132,1707\n109133,72\n109134,109135\n109136,30\n109137,775\n109138,3623\n109139,3094\n109140,2266\n109141,72\n109143,30\n109144,109145\n109146,30\n109147,72\n109148,72\n109149,109150\n109151,862\n109152,109153\n109154,192\n109155,72\n109156,447\n109157,447\n109158,171\n109159,209\n109160,2244\n109161,1313\n109162,366\n109163,109164\n109163,116832\n109165,72\n109166,516\n109167,109168\n109169,109170\n109171,72\n109172,72\n109173,1\n109174,1955\n109175,3413\n109176,2379\n109176,2868\n109177,2931\n109178,13546\n109179,8991\n109180,109181\n109182,109183\n109184,109185\n109184,115649\n109186,106\n109186,586\n109186,17772\n109188,109189\n109190,704\n109191,109192\n109193,843\n109194,17334\n109196,109197\n109198,109198\n109199,422\n109200,56\n109201,202\n109201,203\n109201,493\n109202,119\n109203,422\n109204,56\n109205,640\n109206,109207\n109208,109209\n109210,704\n109211,3804\n109212,22\n109213,109214\n109215,1773\n109216,109217\n109218,147\n109219,109220\n109221,109220\n109222,109223\n109224,267\n109225,109226\n109228,178\n109230,862\n109231,109232\n109233,30\n109234,1368\n109235,30\n109237,109236\n109237,112509\n109238,30\n109239,30\n109240,1572\n109240,19005\n109241,4611\n109242,1544\n109243,2506\n109244,109245\n109244,151252\n109244,153214\n109246,109247\n109248,233\n109249,2353\n109250,1556\n109251,30\n109252,30\n109253,35486\n109254,298\n109255,485\n109256,1454\n109257,1556\n109258,2083\n109259,433\n109259,68069\n109259,141912\n109260,3623\n109261,23011\n109262,30\n109263,30\n109264,79\n109265,184\n109265,258\n109265,332\n109265,379\n109265,3467\n109266,1844\n109267,1241\n109268,392\n109268,1769\n109268,68069\n109270,611\n109271,850\n109273,217\n109273,2671\n109274,287\n109274,652\n109275,81\n109276,298\n109277,485\n109278,2373\n109280,433\n109281,450\n109284,207\n109289,718\n109291,704\n109292,3297\n109293,72\n109294,109295\n109296,109295\n109298,660\n109299,1402\n109300,44\n109301,431\n109304,690\n109304,1782\n109305,6068\n109306,1359\n109307,109308\n109309,22\n109310,861\n109311,538\n109312,287\n109313,579\n109314,3\n109316,3413\n109317,338\n109317,1631\n109320,79\n109321,2867\n109321,2868\n109323,302\n109324,3623\n109325,779\n109326,3623\n109327,676\n109328,269\n109328,1172\n109328,1844\n109329,151\n109329,1235\n109329,72439\n109330,104\n109330,134\n109331,109332\n109333,1313\n109334,2775\n109335,447\n109336,874\n109337,109338\n109339,136\n109340,109341\n109342,5440\n109344,355\n109345,109346\n109347,147\n109348,392\n109349,481\n109350,455\n109351,72\n109352,309\n109352,310\n109352,333\n109352,433\n109352,536\n109352,577\n109352,623\n109352,626\n109352,907\n109352,919\n109352,1001\n109352,1133\n109352,1151\n109352,1715\n109352,3804\n109352,13546\n109354,1298\n109356,302\n109357,355\n109358,68069\n109358,141912\n109359,1467\n109360,397\n109361,2867\n109361,2868\n109362,557\n109363,422\n109364,1707\n109365,422\n109366,422\n109367,146\n109367,285\n109367,406\n109367,585\n109367,620\n109367,1515\n109367,92476\n109368,3623\n109369,149\n109369,406\n109369,1425\n109371,422\n109372,422\n109373,422\n109374,422\n109375,422\n109376,422\n109377,422\n109378,872\n109378,1151\n109379,298\n109380,485\n109381,1359\n109382,1359\n109383,358\n109384,192\n109385,1844\n109386,843\n109387,640\n109388,640\n109389,640\n109390,640\n109392,72\n109392,408\n109392,417\n109392,1891\n109392,2607\n109392,9457\n109393,919\n109394,171\n109395,932\n109396,1983\n109397,55849\n109398,298\n109399,485\n109400,252\n109400,1220\n109400,1222\n109401,192\n109403,192\n109403,256\n109404,72\n109405,298\n109406,485\n109407,109408\n109411,206\n109411,333\n109411,60576\n109413,9560\n109414,1177\n109415,175\n109416,4611\n109417,2116\n109418,298\n109419,760\n109421,22293\n109423,809\n109425,493\n109426,175\n109426,264\n109426,693\n109427,586\n109428,1390\n109429,83\n109430,364\n109430,1010\n109431,109432\n109433,3623\n109434,809\n109434,19010\n109435,287\n109436,577\n109437,388\n109438,2244\n109439,72\n109440,1688\n109441,2931\n109442,298\n109443,485\n109444,483\n109444,1927\n109445,1082\n109446,126\n109448,298\n109449,485\n109450,252\n109452,868\n109453,340\n109454,2416\n109454,2417\n109454,3209\n109456,175\n109457,109458\n109459,298\n109460,355\n109460,873\n109461,795\n109462,1782\n109463,30\n109464,109465\n109466,149\n109467,1467\n109468,440\n109469,1085\n109469,6068\n109470,72\n109471,30\n109472,109473\n109474,298\n109475,485\n109476,22\n109476,1007\n109476,3999\n109477,422\n109478,56\n109479,356\n109479,852\n109480,2353\n109481,79\n109482,79\n109484,298\n109485,485\n109486,72\n109487,109488\n109490,72\n109491,392\n109491,918\n109492,720\n109494,3623\n109495,1509\n109496,2590\n109497,72\n109498,1235\n109498,1335\n109502,483\n109503,957\n109503,1246\n109503,1247\n109503,1815\n109503,5244\n109503,7159\n109503,14650\n109503,49809\n109503,109503\n109503,125572\n109503,127910\n109503,134398\n109503,139025\n109503,151719\n109503,151724\n109503,154049\n109503,154091\n109503,154484\n109503,163588\n109503,163793\n109503,164572\n109503,166429\n109503,168933\n109503,170004\n109503,170392\n109503,182645\n109505,138\n109506,1551\n109507,1388\n109508,1849\n109509,1293\n109510,772\n109511,135\n109512,718\n109513,207\n109514,1566\n109515,1566\n109516,1566\n109517,1566\n109518,1722\n109519,843\n109520,3623\n109521,356\n109522,79\n109524,1977\n109524,1978\n109525,108193\n109526,703\n109527,406\n109528,657\n109529,109530\n109531,406\n109532,872\n109534,1429\n109535,109536\n109537,222\n109537,455\n109537,2266\n109538,314\n109538,1425\n109540,55849\n109541,55849\n109542,602\n109543,151\n109544,668\n109545,302\n109545,861\n109545,893\n109546,1888\n109547,109548\n109549,109548\n109550,2607\n109551,6303\n109552,3538\n109554,779\n109554,68069\n109554,141912\n109556,109557\n109559,703\n109560,1113\n109560,1619\n109561,2045\n109563,118\n109563,4597\n109564,1608\n109565,30\n109566,21487\n109567,302\n109568,30\n109568,200\n109568,772\n109568,99807\n109569,298\n109570,485\n109571,344\n109572,192\n109573,102\n109573,1326\n109573,14797\n109574,2699\n109575,31977\n109576,22\n109577,202\n109577,203\n109577,516\n109578,79\n109579,861\n109580,3695\n109581,1143\n109582,30\n109583,1105\n109584,809\n109585,694\n109587,1285\n109588,718\n109589,809\n109591,30\n109593,4\n109593,5\n109594,333\n109595,349\n109596,579\n109596,1509\n109597,109598\n109599,292\n109600,72\n109601,850\n109603,376\n109604,885\n109604,13704\n109605,872\n109606,304\n109606,1085\n109606,156379\n109607,72\n109608,55849\n109609,9010\n109610,209\n109610,273\n109611,175\n109612,298\n109613,392\n109614,10\n109615,4810\n109616,292\n109617,1608\n109618,744\n109619,356\n109620,941\n109621,163\n109621,302\n109621,861\n109622,1181\n109623,1381\n109624,104\n109624,631\n109624,1458\n109625,615\n109626,8993\n109627,178\n109627,2677\n109627,3000\n109627,5728\n109627,80427\n109627,110336\n109627,110338\n109627,110345\n109628,1544\n109629,783\n109630,2135\n109632,147\n109632,158\n109632,422\n109633,1983\n109634,376\n109635,140\n109636,267\n109637,467\n109638,439\n109638,1370\n109638,1512\n109638,5992\n109639,3769\n109640,485\n109641,1019\n109641,1590\n109641,2931\n109641,8811\n109642,1707\n109643,718\n109644,35486\n109645,72\n109646,72\n109647,1531\n109648,1319\n109649,1844\n109650,1132\n109651,781\n109652,72\n109653,1132\n109654,781\n109655,30\n109655,200\n109655,772\n109655,99807\n109656,932\n109657,30\n109658,30\n109659,422\n109660,56\n109661,356\n109662,557\n109663,1058\n109664,557\n109666,41\n109667,72\n109669,109670\n109671,287\n109671,1607\n109673,3069\n109674,287\n109675,422\n109676,56\n109677,109678\n109679,5906\n109680,227\n109681,536\n109683,72\n109684,991\n109685,202\n109685,203\n109686,147\n109686,422\n109687,1151\n109689,435\n109692,1639\n109693,1149\n109694,996\n109695,843\n109696,356\n109697,109698\n109699,2353\n109700,255\n109701,278\n109701,536\n109701,577\n109701,595\n109701,13575\n109702,109703\n109704,137\n109705,795\n109706,34\n109706,35\n109706,217\n109706,222\n109706,278\n109706,455\n109706,657\n109706,781\n109706,949\n109706,1072\n109706,1274\n109706,1467\n109706,1571\n109706,1718\n109706,1881\n109706,2168\n109706,2944\n109706,4594\n109706,6888\n109706,29475\n109707,118\n109707,4597\n109708,87\n109708,392\n109708,1453\n109708,1572\n109708,1722\n109708,1836\n109708,2697\n109708,14458\n109709,271\n109710,1803\n109711,30\n109712,596\n109713,2351\n109715,160\n109715,360\n109715,2411\n109715,3653\n109716,217\n109717,2620\n109718,273\n109719,109720\n109721,435\n109722,202\n109722,203\n109724,72\n109725,843\n109727,356\n109728,313\n109728,328\n109728,994\n109729,72\n109733,109732\n109734,109735\n109737,30\n109738,68069\n109739,109740\n109739,120312\n109741,72\n109743,2574\n109744,109745\n109746,72\n109747,72\n109748,147\n109749,30\n109750,366\n109751,779\n109752,366\n109753,118\n109753,4597\n109754,195\n109755,109756\n109757,109758\n109759,106\n109760,109761\n109762,109763\n109765,72\n109766,255\n109767,275\n109768,1634\n109769,30\n109770,72\n109771,30\n109772,30\n109773,30\n109774,8992\n109775,4192\n109775,4193\n109776,151\n109778,109779\n109780,109781\n109782,298\n109783,485\n109786,704\n109788,109789\n109790,109791\n109790,111580\n109790,114498\n109790,114753\n109792,3507\n109793,534\n109795,557\n109796,109797\n109799,1085\n109800,79\n109801,233\n109802,397\n109803,109804\n109805,206\n109806,1132\n109807,781\n109808,2620\n109809,919\n109810,72\n109810,233\n109810,346\n109810,1939\n109810,2205\n109810,4146\n109810,7124\n109810,33424\n109811,8270\n109812,109813\n109814,1893\n109817,109818\n109819,120\n109819,588\n109819,590\n109819,1466\n109820,326\n109821,328\n109822,109823\n109824,109825\n109826,30\n109827,452\n109827,535\n109827,918\n109827,1655\n109828,9560\n109829,3258\n109830,563\n109832,595\n109832,703\n109833,1634\n109834,75912\n109835,206\n109837,1888\n109838,209\n109838,299\n109838,388\n109838,390\n109838,775\n109838,907\n109838,972\n109838,1012\n109838,1167\n109838,1241\n109838,1284\n109838,1298\n109838,1359\n109838,1436\n109838,1544\n109838,1616\n109838,1635\n109838,1837\n109838,2191\n109838,3207\n109838,3218\n109838,4146\n109838,73570\n109838,103860\n109839,577\n109840,717\n109840,1293\n109841,1893\n109841,49057\n109842,1257\n109843,2506\n109844,31073\n109845,344\n109846,44\n109847,2797\n109848,422\n109849,422\n109850,422\n109852,422\n109853,422\n109854,422\n109855,422\n109857,422\n109858,1796\n109859,422\n109860,422\n109861,422\n109862,422\n109863,1635\n109863,2750\n109864,805\n109865,393\n109866,433\n109867,1001\n109868,3623\n109869,79\n109870,726\n109871,852\n109872,1151\n109873,79\n109874,206\n109875,298\n109876,485\n109877,431\n109877,602\n109877,631\n109877,3218\n109878,3623\n109879,467\n109879,868\n109879,4252\n109879,162599\n109880,209\n109880,861\n109881,5440\n109882,298\n109883,485\n109884,302\n109885,996\n109885,1033\n109885,7872\n109885,7992\n109885,17426\n109885,17904\n109885,19191\n109885,30390\n109885,45018\n109885,76718\n109885,109885\n109885,109888\n109885,111702\n109885,114603\n109885,118970\n109885,119522\n109885,129917\n109885,138011\n109885,138153\n109885,139545\n109885,145511\n109885,145514\n109885,147357\n109885,150113\n109885,165251\n109886,10\n109887,30331\n109889,872\n109890,1612\n109891,305\n109891,2646\n109892,372\n109892,1285\n109894,222\n109895,3623\n109897,206\n109898,1619\n109899,278\n109900,636\n109901,19010\n109902,1122\n109903,452\n109904,1247\n109905,184\n109906,298\n109907,485\n109908,623\n109909,1556\n109910,1858\n109911,1860\n109912,477\n109913,980\n109914,1858\n109915,1860\n109916,1688\n109917,1983\n109918,694\n109919,536\n109919,1980\n109920,1177\n109921,1608\n109922,1818\n109924,20\n109925,5591\n109926,1177\n109927,298\n109928,485\n109929,795\n109930,2699\n109932,485\n109933,563\n109934,406\n109935,81070\n109936,467\n109936,868\n109936,152855\n109937,493\n109938,481\n109939,310\n109941,392\n109942,298\n109943,485\n109944,388\n109945,332\n109945,344\n109946,79\n109946,3804\n109947,718\n109947,893\n109948,752\n109949,298\n109950,485\n109952,663\n109952,2178\n109952,4545\n109953,838\n109953,1417\n109954,34\n109954,35\n109955,2266\n109956,310\n109957,3623\n109958,104\n109958,136\n109958,557\n109958,1179\n109958,1368\n109959,493\n109959,1265\n109959,1266\n109960,1402\n109961,6051\n109962,393\n109963,1381\n109964,1033\n109965,586\n109966,72\n109967,222\n109968,58\n109969,206\n109970,417\n109971,1265\n109971,1266\n109972,178\n109973,1955\n109974,1796\n109975,9025\n109976,289\n109976,290\n109977,23701\n109978,8868\n109979,2334\n109980,631\n109981,8822\n109982,16196\n109983,5405\n109984,258\n109985,907\n109985,31896\n109986,450\n109987,23010\n109988,1939\n109989,1707\n109990,17588\n109991,7124\n109992,640\n109993,211\n109993,718\n109993,44725\n109994,47\n109994,2469\n109994,227061\n109995,272\n109996,497\n109997,1130\n109998,1390\n109999,240\n109999,818\n110000,3623\n110001,1634\n110002,6789\n110003,718\n110004,47\n110004,2469\n110006,1968\n110007,3623\n110009,3623\n110010,697\n110010,3769\n110011,233\n110011,518\n110012,422\n110013,184\n110014,110015\n110016,278\n110016,660\n110016,891\n110017,298\n110018,485\n110019,1977\n110019,1978\n110020,301\n110021,298\n110022,485\n110023,2797\n110024,1821\n110025,1858\n110026,1860\n110027,973\n110028,72\n110030,1858\n110031,1860\n110032,292\n110032,332\n110032,1619\n110032,2782\n110033,192\n110033,442\n110033,1392\n110033,30331\n110034,920\n110035,1858\n110036,1860\n110037,849\n110038,360\n110039,1323\n110040,102\n110041,1326\n110042,83\n110043,134\n110045,795\n110046,298\n110047,485\n110048,626\n110050,788\n110052,110053\n110054,779\n110055,298\n110056,485\n110057,1326\n110059,298\n110060,485\n110061,298\n110062,485\n110064,110065\n110066,3623\n110067,298\n110068,485\n110069,3623\n110070,1285\n110071,1381\n110072,298\n110073,485\n110074,3623\n110075,392\n110075,1417\n110076,1179\n110077,298\n110078,485\n110079,577\n110079,647\n110080,298\n110081,485\n110082,2775\n110083,447\n110084,252\n110085,1370\n110086,298\n110087,485\n110088,1285\n110089,171\n110090,435\n110091,344\n110093,1775\n110093,1962\n110094,3623\n110095,30\n110096,110097\n110098,920\n110099,3623\n110100,1285\n110101,77\n110101,269\n110103,298\n110104,485\n110105,1285\n110106,298\n110107,485\n110108,3623\n110110,10\n110111,298\n110112,485\n110113,636\n110116,392\n110116,1143\n110117,50\n110118,240\n110118,299\n110118,2083\n110118,127158\n110119,622\n110119,1033\n110120,3623\n110121,2506\n110122,143\n110123,3623\n110124,30\n110125,1462\n110125,8537\n110126,240\n110127,452\n110127,590\n110128,79\n110129,146\n110130,20359\n110131,843\n110132,1769\n110132,5547\n110133,1033\n110134,356\n110135,140\n110136,592\n110138,30\n110139,298\n110140,485\n110142,63\n110143,32751\n110145,110146\n110147,298\n110148,485\n110150,287\n110150,433\n110151,467\n110151,868\n110152,462\n110153,119\n110153,644\n110153,1363\n110154,1085\n110156,3623\n110158,1572\n110159,647\n110161,298\n110162,485\n110163,5366\n110164,298\n110165,485\n110166,1860\n110167,483\n110168,346\n110169,30\n110169,200\n110169,772\n110169,128491\n110171,30\n110172,198\n110173,252\n110174,868\n110175,298\n110177,485\n110178,3623\n110179,1\n110180,1590\n110181,516\n110182,298\n110183,485\n110184,298\n110185,485\n110187,861\n110188,22\n110189,920\n110190,326\n110190,589\n110190,1001\n110190,1210\n110191,255\n110192,1769\n110193,1265\n110193,1266\n110194,192\n110195,1177\n110196,389\n110197,222\n110200,1634\n110201,571\n110202,3623\n110203,175\n110204,298\n110205,20\n110206,657\n110207,3079\n110208,72\n110209,557\n110210,10\n110211,3623\n110212,72\n110213,72\n110214,47\n110214,852\n110214,1332\n110214,2469\n110214,189303\n110215,110216\n110217,240\n110217,372\n110218,861\n110220,3148\n110221,3623\n110222,240\n110223,406\n110223,602\n110224,110225\n110226,3623\n110227,88820\n110228,2286\n110229,146\n110229,406\n110229,779\n110231,298\n110232,485\n110233,264\n110234,1240\n110235,1749\n110235,14550\n110236,557\n110237,557\n110239,110240\n110241,298\n110242,485\n110243,3623\n110244,406\n110245,3623\n110246,1849\n110247,779\n110248,1282\n110249,3623\n110250,1085\n110252,3623\n110253,151\n110255,6387\n110256,10\n110256,113156\n110257,151\n110258,1458\n110259,118\n110259,4597\n110260,346\n110261,795\n110262,2244\n110263,467\n110263,868\n110264,3623\n110265,309\n110265,310\n110265,1566\n110266,72\n110267,1749\n110268,3623\n110270,202\n110271,2506\n110272,110273\n110272,175851\n110274,110275\n110276,32\n110276,3003\n110277,110278\n110279,2506\n110280,110281\n110282,3623\n110283,818\n110284,31977\n110285,72\n110286,3623\n110287,772\n110288,302\n110289,1644\n110290,10\n110291,577\n110292,4903\n110293,72\n110294,392\n110295,147\n110295,192\n110295,1243\n110296,118\n110296,4597\n110297,1001\n110298,481\n110299,515\n110300,72\n110302,72\n110303,110304\n110305,697\n110306,1252\n110306,1253\n110307,184\n110308,110309\n110310,110311\n110312,406\n110314,2574\n110315,72\n110316,657\n110317,79\n110318,2266\n110319,1359\n110321,1192\n110322,973\n110322,1732\n110323,557\n110324,557\n110325,171\n110326,366\n110327,207\n110328,392\n110329,298\n110330,485\n110331,110332\n110333,110332\n110334,310\n110335,30\n110336,493\n110336,795\n110337,30\n110339,872\n110340,1429\n110341,2353\n110342,298\n110343,485\n110344,668\n110345,110346\n110345,133228\n110345,133229\n110345,133231\n110345,133232\n110345,133233\n110345,133234\n110345,135501\n110345,136802\n110345,147232\n110345,170347\n110345,187763\n110345,255129\n110347,3695\n110348,1118\n110349,250\n110349,1684\n110350,704\n110351,310\n110352,10\n110353,66297\n110354,310\n110355,149\n110356,1381\n110357,72\n110358,1564\n110358,3094\n110359,72\n110360,2411\n110361,47\n110361,2469\n110362,8308\n110363,250\n110363,1684\n110364,72\n110365,72\n110366,1143\n110367,110368\n110369,158\n110370,192\n110371,1707\n110372,310\n110373,1858\n110374,1860\n110375,298\n110376,485\n110379,2590\n110380,304\n110381,994\n110382,72\n110383,1007\n110384,110385\n110388,557\n110389,30\n110390,516\n110391,3041\n110392,110393\n110394,1227\n110394,86416\n110395,358\n110397,72\n110398,30\n110399,920\n110400,110401\n110402,30\n110403,1983\n110404,602\n110405,3623\n110406,30\n110407,868\n110408,247\n110409,83\n110410,298\n110411,485\n110414,310\n110415,2116\n110416,704\n110417,30\n110418,110419\n110420,10\n110420,34\n110420,35\n110420,83\n110420,261\n110420,283\n110420,455\n110420,536\n110420,1072\n110420,1467\n110420,2266\n110420,2671\n110420,2989\n110420,2991\n110420,7092\n110420,13546\n110420,31977\n110421,110422\n110424,110425\n110426,72\n110428,35905\n110429,110430\n110431,72\n110432,1181\n110433,72\n110434,30\n110435,1085\n110436,809\n110438,30\n110439,110440\n110441,175\n110442,298\n110443,110444\n110445,435\n110445,447\n110445,1033\n110445,1590\n110446,392\n110447,1452\n110448,255\n110449,392\n110450,1590\n110451,30\n110452,110453\n110454,68069\n110455,126\n110455,640\n110456,30\n110457,1238\n110458,81\n110459,1571\n110460,110461\n110462,294\n110463,110464\n110466,332\n110467,304\n110468,2671\n110469,581\n110470,110471\n110472,30\n110473,147\n110474,110475\n110476,1167\n110477,35687\n110478,392\n110480,110481\n110482,2574\n110483,2319\n110484,222\n110484,2266\n110485,8\n110486,809\n110486,22293\n110488,310\n110489,602\n110490,233\n110491,6303\n110492,289\n110492,290\n110492,94134\n110492,144988\n110493,483\n110494,459\n110496,192\n110497,110498\n110499,110500\n110501,385\n110502,3246\n110504,1590\n110504,1644\n110506,106\n110506,1370\n110506,59021\n110506,168463\n110506,168479\n110507,431\n110508,77\n110509,1119\n110509,1962\n110509,2205\n110509,4222\n110509,13361\n110509,33424\n110509,111142\n110510,302\n110510,3769\n110510,162599\n110511,264\n110511,515\n110511,1381\n110511,1968\n110512,868\n110513,6955\n110514,355\n110515,1247\n110516,356\n110517,22\n110518,116\n110518,430\n110518,2087\n110519,206\n110520,178\n110521,1453\n110522,996\n110523,920\n110524,1634\n110525,1740\n110526,44\n110528,1782\n110529,422\n110530,422\n110531,422\n110532,422\n110533,2646\n110534,80266\n110535,640\n110536,588\n110536,590\n110537,294\n110538,130\n110540,360\n110540,1224\n110541,1962\n110542,1293\n110543,298\n110544,485\n110545,163\n110546,1985\n110547,1096\n110548,647\n110549,344\n110551,4691\n110552,298\n110553,485\n110554,1247\n110555,1285\n110556,2867\n110556,2868\n110557,1118\n110558,298\n110559,485\n110560,1707\n110561,2244\n110562,110563\n110564,1556\n110565,287\n110566,1858\n110567,1860\n110568,323\n110569,415\n110570,147\n110570,1181\n110571,298\n110572,485\n110573,1858\n110574,1860\n110575,167\n110575,852\n110575,968\n110575,1849\n110575,5301\n110575,32784\n110575,73570\n110576,323\n110577,58\n110578,994\n110579,46\n110580,75912\n110581,1858\n110582,1860\n110583,907\n110585,1858\n110586,1860\n110587,298\n110588,485\n110589,163\n110589,302\n110590,72\n110591,344\n110592,285\n110593,167\n110593,433\n110593,811\n110593,861\n110593,76096\n110593,127158\n110594,2699\n110595,2867\n110595,2868\n110597,392\n110598,349\n110598,575\n110598,3260\n110600,467\n110600,868\n110601,215\n110602,1402\n110603,252\n110603,1220\n110603,1222\n110604,1262\n110605,301\n110605,861\n110605,1231\n110605,3422\n110606,6027\n110607,2506\n110608,1105\n110609,392\n110610,510\n110611,2506\n110612,2506\n110613,31977\n110614,893\n110615,83\n110616,1293\n110617,130\n110619,1707\n110620,215\n110622,1707\n110623,50\n110623,206\n110623,841\n110625,2646\n110626,298\n110627,485\n110628,8270\n110629,302\n110629,861\n110630,2574\n110631,713\n110632,1\n110633,72\n110635,346\n110635,435\n110635,586\n110635,1294\n110635,1963\n110635,6119\n110636,408\n110637,1323\n110638,102\n110639,1326\n110640,65\n110640,467\n110640,868\n110640,31896\n110641,1871\n110641,2421\n110642,2506\n110645,178\n110646,1293\n110647,450\n110647,1118\n110647,1388\n110648,483\n110649,1634\n110650,278\n110651,298\n110652,485\n110654,1745\n110655,1634\n110657,302\n110658,422\n110659,298\n110660,485\n110662,298\n110663,485\n110664,1082\n110665,1359\n110666,1707\n110667,422\n110668,298\n110669,1082\n110670,485\n110671,483\n110672,192\n110679,110680\n110681,7698\n110684,2506\n110685,298\n110686,485\n110687,1105\n110688,7698\n110689,83\n110692,1515\n110693,273\n110694,110695\n110694,120423\n110697,1130\n110698,200\n110698,772\n110700,1707\n110701,298\n110702,485\n110703,726\n110705,298\n110706,485\n110707,107\n110707,124668\n110709,907\n110710,175\n110711,3161\n110712,312\n110712,1882\n110713,1096\n110714,298\n110715,3161\n110716,1235\n110716,1335\n110717,294\n110717,328\n110717,2416\n110717,2417\n110717,227061\n110718,273\n110719,34\n110719,35\n110719,97\n110720,119\n110721,1858\n110722,1860\n110723,859\n110724,435\n110725,222\n110726,110727\n110729,79\n110730,406\n110731,5405\n110732,302\n110733,2775\n110734,447\n110735,1177\n110736,149\n110736,622\n110736,1776\n110738,843\n110739,356\n110740,795\n110742,1368\n110743,72\n110744,392\n110745,3260\n110746,118\n110746,4597\n110747,72\n110748,1881\n110749,356\n110750,217\n110750,467\n110752,1276\n110753,439\n110753,2991\n110754,406\n110755,2351\n110756,118\n110756,1414\n110757,222\n110758,130\n110759,360\n110759,1639\n110760,717\n110760,1381\n110761,447\n110762,111142\n110763,518\n110763,1955\n110764,2506\n110765,850\n110766,83\n110767,818\n110768,252\n110769,726\n110770,1284\n110771,240\n110772,247\n110773,79\n110774,623\n110774,1805\n110775,340\n110775,4548\n110778,30\n110779,298\n110780,485\n110781,2178\n110781,4545\n110782,557\n110783,1368\n110784,1608\n110785,130\n110786,313\n110787,1515\n110788,406\n110789,298\n110790,485\n110791,298\n110792,485\n110793,298\n110794,485\n110795,10\n110795,841\n110795,1175\n110796,72\n110797,431\n110799,110800\n110801,72\n110802,110803\n110802,111860\n110804,483\n110805,31977\n110806,175\n110807,425\n110807,583\n110807,690\n110807,1805\n110808,3467\n110809,298\n110810,4895\n110811,72\n110812,158\n110813,1298\n110814,30\n110815,1381\n110816,30\n110817,10\n110818,323\n110819,1130\n110820,50\n110821,1893\n110822,6837\n110823,7360\n110824,392\n110825,299\n110826,298\n110827,485\n110828,557\n110829,298\n110830,485\n110831,298\n110832,485\n110833,298\n110834,485\n110835,110836\n110837,298\n110838,485\n110839,158\n110840,360\n110841,358\n110842,292\n110843,949\n110844,83\n110845,298\n110846,485\n110847,3623\n110848,1531\n110849,3623\n110850,536\n110850,1515\n110851,518\n110852,3623\n110853,3623\n110854,298\n110855,110856\n110857,485\n110858,200\n110858,1033\n110858,1085\n110858,1572\n110858,2617\n110858,3297\n110858,4039\n110859,2506\n110860,175\n110861,2506\n110862,298\n110863,3623\n110864,704\n110865,392\n110866,2506\n110867,2506\n110868,110869\n110870,718\n110871,2116\n110872,30\n110873,110874\n110875,949\n110876,1368\n110877,110878\n110880,130\n110881,704\n110882,1773\n110883,3507\n110885,392\n110886,110887\n110888,79\n110889,577\n110890,1718\n110891,273\n110892,557\n110893,30\n110894,557\n110895,83\n110896,211\n110897,452\n110897,918\n110897,1655\n110898,338\n110899,5908\n110901,22125\n110902,30\n110903,536\n110904,217\n110905,366\n110907,4903\n110908,3623\n110909,1113\n110910,491\n110911,1707\n110912,110913\n110914,2590\n110915,1773\n110917,110918\n110919,207\n110920,130\n110921,79\n110921,333\n110922,22\n110923,481\n110924,298\n110925,485\n110927,110928\n110929,872\n110930,1429\n110931,175\n110932,2266\n110933,86\n110933,167\n110933,301\n110933,968\n110933,1160\n110933,1462\n110933,1564\n110933,2372\n110933,2620\n110933,5718\n110933,7416\n110933,8537\n110935,605\n110936,107\n110937,668\n110940,72\n110941,81\n110942,392\n110943,72\n110944,1289\n110945,5440\n110946,269\n110947,3999\n110948,264\n110949,298\n110950,485\n110951,1381\n110952,110953\n110955,110956\n110958,843\n110959,704\n110960,602\n110961,310\n110962,313\n110962,326\n110962,2421\n110963,1143\n110964,422\n110965,56\n110966,3041\n110967,1452\n110968,1551\n110969,1007\n110971,1117\n110971,3260\n110974,1033\n110975,602\n110978,1381\n110979,1639\n110981,602\n110982,1531\n110983,184\n110984,72\n110985,207\n110986,110987\n110988,110989\n110990,255\n110991,110992\n110993,872\n110994,292\n110995,406\n110995,620\n110995,1515\n110995,8244\n110996,346\n110997,110998\n110999,255\n111000,872\n111002,392\n111004,72\n111006,2506\n111007,2506\n111008,2506\n111009,2506\n111010,2506\n111011,111012\n111014,167\n111015,390\n111015,717\n111016,111017\n111018,1977\n111018,1978\n111019,1140\n111019,5547\n111020,233\n111021,111022\n111023,8788\n111024,111025\n111026,111027\n111028,68\n111029,399\n111030,2646\n111034,111035\n111036,136\n111038,704\n111039,111040\n111041,206\n111041,1707\n111042,623\n111048,1082\n111051,1082\n111052,355\n111053,346\n111054,2506\n111055,433\n111056,1359\n111057,298\n111058,485\n111059,1033\n111060,827\n111063,1631\n111064,376\n111066,23011\n111068,207\n111069,302\n111070,298\n111071,485\n111072,118\n111072,4597\n111073,1105\n111075,849\n111076,433\n111077,111078\n111079,312\n111080,111081\n111082,1001\n111083,37\n111085,693\n111085,1132\n111086,3623\n111087,264\n111087,191860\n111090,811\n111091,3623\n111092,467\n111093,422\n111094,56\n111095,5375\n111096,515\n111097,849\n111098,973\n111099,3623\n111100,1177\n111101,1893\n111102,408\n111102,599\n111103,422\n111104,56\n111105,2889\n111106,326\n111107,3830\n111108,1133\n111110,44\n111111,749\n111112,349\n111112,3260\n111113,34\n111113,35\n111113,250\n111113,1684\n111114,433\n111115,422\n111116,422\n111117,422\n111118,72764\n111119,422\n111120,392\n111121,422\n111122,422\n111123,422\n111124,422\n111125,422\n111127,422\n111128,422\n111129,422\n111130,422\n111131,1949\n111132,151\n111133,72\n111134,1238\n111135,3623\n111136,346\n111138,1085\n111138,2296\n111139,850\n111142,5\n111142,104\n111142,289\n111142,304\n111142,328\n111142,704\n111142,714\n111142,1402\n111142,1511\n111142,1745\n111142,1962\n111142,2008\n111142,2089\n111142,2940\n111142,3069\n111142,3565\n111142,4114\n111142,4218\n111142,4367\n111142,4532\n111142,25385\n111142,28811\n111142,31893\n111142,34403\n111142,76704\n111142,94134\n111142,104394\n111142,108499\n111142,110509\n111142,110762\n111142,111142\n111142,123824\n111142,130229\n111142,130254\n111142,131812\n111142,132216\n111142,133627\n111142,136546\n111142,138074\n111142,140142\n111142,164735\n111142,176782\n111142,180854\n111142,183075\n111142,191198\n111142,191291\n111142,212968\n111142,216643\n111142,228899\n111142,235862\n111142,243209\n111142,254215\n111142,254422\n111142,259608\n111143,72\n111144,72\n111145,72\n111146,30\n111147,805\n111147,1564\n111148,298\n111149,485\n111150,72\n111151,158\n111151,406\n111151,779\n111151,1181\n111151,1515\n111152,72\n111153,72\n111154,72\n111155,1544\n111156,4611\n111157,4611\n111158,1544\n111159,1858\n111160,1860\n111161,346\n111162,3804\n111163,346\n111164,217\n111165,66\n111165,868\n111166,30\n111168,298\n111169,485\n111170,301\n111170,1293\n111170,1782\n111172,217\n111173,217\n111174,1983\n111175,1556\n111176,1769\n111177,289\n111177,290\n111178,83\n111179,111180\n111181,2775\n111182,447\n111183,3769\n111184,83\n111185,3623\n111186,151\n111187,163\n111188,392\n111190,2931\n111191,302\n111193,1860\n111196,111197\n111200,310\n111201,2371\n111201,220502\n111202,1096\n111203,2371\n111204,111205\n111206,206\n111207,1326\n111208,298\n111209,485\n111210,1807\n111211,72\n111212,344\n111213,285\n111214,2334\n111215,298\n111216,485\n111217,160\n111217,779\n111217,1381\n111217,1551\n111217,68069\n111217,118336\n111218,417\n111218,1635\n111219,1220\n111219,1222\n111220,252\n111221,251\n111222,949\n111222,1618\n111222,13980\n111224,2506\n111225,195\n111226,862\n111226,27041\n111227,111228\n111229,58\n111230,994\n111231,46\n111232,75912\n111234,2506\n111235,298\n111236,485\n111237,1858\n111238,1860\n111239,1293\n111240,1860\n111241,868\n111242,83\n111243,1858\n111244,1860\n111245,247\n111246,1390\n111248,298\n111249,485\n111250,192\n111253,50\n111254,346\n111255,862\n111255,27041\n111256,120\n111256,6303\n111257,1749\n111259,247\n111260,298\n111261,485\n111262,1858\n111263,1860\n111264,1983\n111265,32\n111268,2244\n111269,135\n111270,1070\n111271,408\n111272,1323\n111273,102\n111274,1326\n111275,671\n111276,111277\n111276,117508\n111278,3623\n111279,107\n111280,158\n111280,192\n111280,1181\n111281,97\n111281,1319\n111281,7117\n111282,1096\n111284,647\n111285,111286\n111287,349\n111288,3367\n111290,107230\n111291,27356\n111292,1745\n111292,1849\n111292,4237\n111292,182162\n111293,302\n111294,1707\n111295,1247\n111296,23287\n111297,1210\n111299,862\n111300,1801\n111301,1707\n111303,111304\n111306,1849\n111306,32784\n111308,111309\n111310,592\n111313,595\n111313,1058\n111314,298\n111315,485\n111316,1522\n111317,200\n111317,116400\n111318,313\n111319,1436\n111320,106\n111322,346\n111323,149\n111325,30\n111326,8788\n111327,4611\n111328,1544\n111329,452\n111329,918\n111329,1655\n111330,1240\n111330,1466\n111331,801\n111332,2699\n111333,1127\n111334,4604\n111335,7768\n111336,3069\n111337,30\n111338,298\n111339,485\n111340,106\n111340,596\n111340,1368\n111340,1564\n111340,4548\n111341,111342\n111343,861\n111344,1118\n111345,360\n111346,3161\n111348,37\n111348,301\n111348,717\n111348,968\n111348,1231\n111348,1782\n111349,861\n111349,1374\n111350,72\n111351,240\n111352,10\n111353,88820\n111354,175\n111355,557\n111356,1368\n111357,43203\n111358,392\n111359,298\n111360,485\n111361,358\n111363,298\n111364,2929\n111365,1359\n111366,298\n111366,1085\n111368,30\n111369,2867\n111369,2868\n111371,1454\n111372,83\n111373,1858\n111374,1860\n111375,298\n111376,485\n111377,994\n111378,72\n111379,72\n111380,72\n111381,366\n111383,366\n111384,366\n111385,366\n111386,366\n111387,30\n111388,72\n111389,366\n111390,366\n111391,704\n111392,3623\n111393,278\n111394,346\n111395,72\n111396,2506\n111398,704\n111400,3507\n111401,346\n111402,640\n111403,392\n111404,346\n111406,287\n111407,818\n111408,422\n111409,56\n111410,392\n111411,158\n111412,2750\n111413,1858\n111414,1860\n111415,23783\n111416,111417\n111418,72\n111419,2506\n111420,135\n111421,346\n111422,252\n111422,516\n111422,1220\n111422,1222\n111424,137\n111425,48\n111427,48\n111428,30331\n111429,217\n111430,298\n111430,1085\n111432,1590\n111432,6661\n111433,535\n111434,79\n111435,72\n111436,30\n111437,30\n111438,72\n111439,447\n111440,72\n111441,1796\n111442,1096\n111443,147\n111443,89035\n111444,72\n111445,344\n111446,285\n111447,422\n111448,56\n111449,704\n111450,30\n111451,3623\n111452,120\n111453,298\n111454,485\n111455,704\n111456,557\n111457,809\n111458,3623\n111459,868\n111460,79\n111461,389\n111462,298\n111463,485\n111464,3585\n111465,111466\n111467,111468\n111469,30\n111470,376\n111471,392\n111472,111473\n111474,30\n111475,358\n111476,4611\n111477,1544\n111478,30\n111479,111480\n111482,111483\n111484,298\n111485,485\n111486,72\n111487,805\n111488,111489\n111490,592\n111491,298\n111492,485\n111493,389\n111493,1046\n111493,54284\n111494,557\n111495,1289\n111496,557\n111497,557\n111498,5906\n111499,557\n111500,626\n111501,278\n111502,137\n111503,862\n111504,8719\n111505,704\n111506,138\n111507,865\n111508,557\n111509,2867\n111509,2868\n111510,137\n111511,118\n111511,4597\n111512,88820\n111513,809\n111514,1858\n111515,1860\n111516,2116\n111517,298\n111518,485\n111519,111520\n111521,72\n111522,298\n111523,485\n111524,111525\n111526,111525\n111528,3623\n111529,289\n111529,290\n111530,346\n111531,259\n111532,346\n111533,111534\n111535,577\n111536,298\n111537,485\n111538,346\n111539,217\n111539,809\n111540,358\n111541,920\n111543,111544\n111545,83\n111546,111547\n111548,111549\n111550,10\n111550,113156\n111551,111552\n111551,121210\n111551,133395\n111553,973\n111554,111555\n111556,346\n111557,111558\n111559,247\n111561,652\n111561,1133\n111561,6068\n111562,2590\n111564,247\n111565,30\n111566,111567\n111568,111569\n111570,1359\n111571,207\n111573,872\n111574,1429\n111575,72\n111576,72\n111577,1132\n111578,781\n111579,668\n111581,640\n111582,483\n111583,58621\n111584,52270\n111585,9560\n111586,96187\n111587,27356\n111588,1353\n111589,310\n111590,10\n111590,113156\n111591,71\n111592,83\n111593,298\n111594,485\n111595,422\n111596,56\n111597,8270\n111598,298\n111599,485\n111600,1143\n111601,72\n111602,30\n111603,366\n111604,366\n111605,202\n111605,203\n111606,44725\n111607,72\n111608,111609\n111611,225\n111612,111613\n111614,111615\n111616,1467\n111617,372\n111618,111619\n111620,8884\n111621,455\n111622,2424\n111623,1085\n111624,704\n111625,538\n111626,1871\n111627,328\n111629,2421\n111630,83\n111631,13980\n111632,195\n111633,503\n111634,3367\n111635,111636\n111637,111638\n111639,111640\n111641,175\n111642,298\n111644,72\n111646,111647\n111649,72\n111650,233\n111651,111652\n111653,111654\n111655,111656\n111657,72\n111660,111661\n111662,72\n111663,267\n111664,206\n111665,72\n111666,355\n111667,111668\n111669,206\n111671,111672\n111673,96187\n111674,298\n111675,485\n111676,332\n111677,38634\n111678,41\n111679,4276\n111681,111682\n111683,422\n111684,56\n111685,687\n111685,1556\n111686,72\n111688,422\n111689,422\n111690,422\n111691,422\n111692,422\n111693,422\n111694,422\n111695,422\n111696,346\n111697,422\n111698,83\n111699,346\n111700,422\n111703,875\n111704,422\n111705,56\n111706,94\n111706,2787\n111707,16153\n111708,422\n111709,56\n111710,111711\n111712,671\n111713,536\n111714,83\n111715,872\n111715,7698\n111716,623\n111717,111718\n111717,111765\n111717,111807\n111717,111810\n111719,111720\n111722,973\n111723,408\n111724,1323\n111725,102\n111726,1326\n111727,1559\n111729,346\n111730,973\n111731,247\n111733,346\n111734,973\n111735,111736\n111737,111738\n111739,714\n111739,1818\n111740,920\n111742,298\n111743,485\n111744,298\n111745,485\n111746,30\n111747,1181\n111748,30\n111750,30\n111752,973\n111753,392\n111754,111755\n111756,111757\n111758,298\n111759,485\n111760,346\n111761,577\n111762,111763\n111766,1707\n111767,743\n111768,850\n111769,111770\n111771,1608\n111772,111773\n111774,111773\n111775,1010\n111775,1243\n111775,189128\n111776,111777\n111778,3161\n111779,298\n111780,485\n111781,106\n111783,151\n111785,111786\n111787,622\n111788,310\n111789,2266\n111790,298\n111791,485\n111792,690\n111793,79\n111793,97\n111793,147\n111793,192\n111793,203\n111793,206\n111793,255\n111793,305\n111793,323\n111793,346\n111793,352\n111793,435\n111793,438\n111793,516\n111793,585\n111793,622\n111793,1135\n111793,1181\n111793,1222\n111793,1238\n111793,1326\n111793,1400\n111793,1844\n111793,1891\n111793,3370\n111793,3804\n111793,5213\n111793,5726\n111793,7117\n111793,7614\n111793,9179\n111793,9208\n111793,25222\n111794,146\n111794,106502\n111795,111796\n111797,310\n111798,111799\n111800,827\n111801,111802\n111803,111804\n111803,111834\n111805,422\n111806,56\n111809,34\n111809,35\n111809,77\n111809,111\n111809,202\n111809,203\n111809,313\n111809,358\n111809,493\n111809,536\n111809,623\n111809,859\n111809,862\n111809,919\n111809,949\n111809,1240\n111809,1274\n111809,1465\n111809,1467\n111809,1572\n111809,1644\n111809,2045\n111809,2266\n111809,2671\n111809,2931\n111809,2979\n111809,4594\n111809,6955\n111809,7092\n111809,8180\n111809,13546\n111809,14126\n111809,29475\n111811,1127\n111811,1769\n111812,111813\n111812,112987\n111814,1181\n111815,111816\n111817,72\n111818,571\n111818,1465\n111819,50\n111820,5101\n111821,483\n111822,111823\n111824,72\n111826,111827\n111829,376\n111830,1181\n111831,1181\n111832,111833\n111835,111836\n111837,111838\n111839,1479\n111840,390\n111841,111842\n111843,111844\n111845,72\n111846,310\n111847,6837\n111848,298\n111849,485\n111850,147\n111850,158\n111850,217\n111850,252\n111850,406\n111850,516\n111850,779\n111850,968\n111850,1001\n111850,1370\n111851,111852\n111853,349\n111856,111857\n111858,111859\n111861,72\n111862,111863\n111864,111865\n111866,72\n111867,72\n111868,631\n111869,111870\n111871,8270\n111872,111873\n111874,310\n111875,79\n111876,72\n111877,72\n111878,72\n111879,9098\n111880,44725\n111881,72\n111882,3623\n111883,111884\n111887,160\n111888,366\n111889,366\n111890,366\n111891,8992\n111892,366\n111893,779\n111894,2146\n111895,310\n111896,310\n111897,111898\n111899,104\n111900,1033\n111902,83\n111904,72\n111905,111906\n111905,127123\n111907,310\n111908,83\n111912,83\n111913,111914\n111916,111917\n111918,206\n111919,111920\n111919,113260\n111919,113264\n111921,83\n111922,602\n111923,111924\n111925,83\n111927,111928\n111929,233\n111930,1181\n111931,111932\n111933,602\n111934,953\n111935,107\n111936,2416\n111936,2417\n111937,292\n111938,338\n111939,333\n111939,240174\n111940,298\n111941,1133\n111942,3538\n111943,206\n111944,206\n111945,222\n111946,1\n111946,2617\n111947,355\n111948,5102\n111949,310\n111950,111950\n111951,9457\n111952,310\n111954,3804\n111955,2266\n111956,118\n111956,4597\n111957,72\n111958,72\n111959,72\n111960,5102\n111961,111962\n111963,805\n111965,140\n111966,8270\n111967,973\n111968,1323\n111970,66297\n111971,907\n111973,718\n111974,111975\n111974,134040\n111976,72\n111977,346\n111979,310\n111980,72\n111981,312\n111981,525\n111981,868\n111982,72\n111983,3135\n111984,72\n111985,111986\n111987,2506\n111988,111989\n111990,209\n111990,302\n111992,44013\n111993,1332\n111994,44\n111995,2867\n111995,2868\n111996,3447\n111997,2146\n111998,126\n111999,4066\n112000,3413\n112001,3161\n112002,1313\n112003,874\n112004,192\n112005,1939\n112006,10\n112007,676\n112008,393\n112009,1381\n112010,1265\n112010,1266\n112011,3209\n112012,859\n112013,8855\n112014,3148\n112015,5405\n112016,272\n112016,1531\n112017,3207\n112018,602\n112019,217\n112020,422\n112021,56\n112023,349\n112024,805\n112025,1235\n112025,1335\n112026,10\n112027,112028\n112029,1837\n112030,112031\n112032,818\n112033,567\n112033,1345\n112034,112035\n112034,118203\n112036,406\n112037,859\n112039,1132\n112040,781\n112041,602\n112042,112043\n112044,30\n112045,112046\n112048,112049\n112050,34\n112050,35\n112056,1634\n112059,376\n112060,713\n112061,79\n112061,269\n112061,422\n112061,663\n112061,779\n112061,868\n112062,1655\n112063,2506\n112064,622\n112065,9560\n112066,493\n112067,557\n112068,862\n112069,557\n112070,557\n112071,557\n112072,298\n112073,485\n112074,298\n112075,485\n112076,112077\n112078,22\n112079,298\n112080,485\n112081,862\n112081,27041\n112082,392\n112083,136\n112084,994\n112085,112086\n112087,805\n112088,287\n112089,3769\n112090,2775\n112091,447\n112092,4611\n112093,859\n112095,4611\n112096,1544\n112097,1858\n112098,1860\n112099,586\n112099,5101\n112100,72\n112101,1707\n112104,30\n112105,112106\n112107,158\n112108,175\n112109,112110\n112111,994\n112112,112113\n112114,112115\n112116,1181\n112117,1608\n112118,217\n112118,536\n112119,160\n112120,433\n112121,779\n112123,178\n112124,112125\n112127,112128\n112130,1359\n112132,112133\n112134,640\n112135,8788\n112136,273\n112137,112138\n112139,222\n112140,112141\n112143,483\n112145,827\n112146,151\n112147,151\n112148,112149\n112148,113689\n112148,148169\n112148,153744\n112150,112151\n112152,112151\n112153,3585\n112154,112155\n112157,872\n112158,872\n112159,1238\n112160,292\n112161,294\n112162,296\n112163,298\n112164,1452\n112165,112166\n112167,872\n112168,435\n112168,586\n112169,392\n112170,310\n112171,112172\n112174,147\n112174,1623\n112175,112176\n112177,392\n112178,112179\n112180,112181\n112182,298\n112183,485\n112185,1192\n112186,298\n112187,485\n112188,30\n112189,58\n112190,994\n112191,46\n112192,75912\n112193,4611\n112194,1544\n112195,2506\n112196,390\n112197,671\n112199,147\n112200,184\n112201,30\n112203,30\n112204,112205\n112206,424\n112207,251\n112208,19010\n112208,22293\n112209,366\n112210,366\n112211,366\n112213,671\n112215,298\n112216,485\n112217,868\n112218,1132\n112219,781\n112220,1782\n112221,433\n112223,390\n112223,422\n112223,717\n112223,1294\n112223,1644\n112223,3003\n112225,447\n112227,202\n112228,861\n112229,22\n112230,283\n112230,5265\n112231,397\n112232,626\n112233,2353\n112234,623\n112234,1805\n112235,72\n112236,112237\n112240,49057\n112241,140\n112242,259\n112243,868\n112244,1531\n112245,397\n112245,142430\n112246,251\n112246,516\n112247,2205\n112247,33424\n112248,640\n112249,112250\n112251,640\n112252,640\n112253,1085\n112254,2775\n112255,447\n112256,19\n112256,2424\n112256,5326\n112257,309\n112257,310\n112258,255\n112260,422\n112261,56\n112262,392\n112263,5326\n112264,1436\n112265,1436\n112266,1010\n112267,953\n112268,271\n112269,112270\n112271,422\n112272,422\n112273,5547\n112274,49057\n112275,34\n112275,35\n112276,422\n112277,489\n112277,893\n112277,1556\n112277,6303\n112278,422\n112279,422\n112280,422\n112281,422\n112282,1132\n112283,781\n112284,422\n112285,364\n112286,422\n112288,422\n112289,112290\n112291,422\n112292,422\n112293,422\n112294,79\n112295,2416\n112295,2417\n112296,1132\n112297,781\n112298,72\n112299,843\n112300,309\n112300,310\n112300,868\n112300,81233\n112302,30\n112303,392\n112304,112305\n112306,640\n112307,79\n112308,302\n112309,392\n112310,483\n112311,44\n112312,83\n112313,1858\n112314,1860\n112315,1001\n112316,433\n112317,272\n112317,273\n112317,422\n112317,1803\n112318,973\n112319,417\n112321,178\n112321,1465\n112321,6059\n112322,356\n112323,3297\n112324,195\n112325,1252\n112325,1253\n112326,217\n112327,298\n112328,390\n112328,1001\n112329,485\n112331,77\n112332,298\n112333,485\n112334,310\n112336,112337\n112338,973\n112339,450\n112340,344\n112340,3967\n112341,112342\n112343,1127\n112344,315\n112345,1252\n112345,1253\n112346,137\n112347,10\n112347,3297\n112348,112349\n112350,298\n112351,485\n112352,452\n112352,457\n112352,676\n112352,918\n112352,1655\n112353,3623\n112354,1085\n112355,450\n112355,5405\n112356,3623\n112357,389\n112358,1860\n112359,1858\n112360,3623\n112361,104\n112362,2480\n112363,1556\n112365,1130\n112367,273\n112368,3623\n112369,1977\n112369,1978\n112370,112371\n112372,379\n112373,5440\n112374,602\n112376,932\n112377,489\n112378,868\n112379,358\n112379,509\n112380,146\n112380,779\n112380,13361\n112380,92476\n112380,141912\n112381,298\n112382,485\n112383,298\n112384,485\n112385,1634\n112386,112387\n112388,72\n112390,623\n112391,1983\n112392,510\n112393,2353\n112394,1983\n112395,1132\n112396,781\n112397,1265\n112397,1266\n112398,586\n112399,920\n112400,6051\n112401,422\n112402,56\n112403,130\n112403,1007\n112403,1551\n112403,3999\n112403,36819\n112405,1634\n112406,6051\n112407,1132\n112408,781\n112409,779\n112410,1014\n112411,392\n112412,21408\n112413,298\n112414,485\n112415,217\n112416,302\n112417,3623\n112418,392\n112419,298\n112420,485\n112421,1132\n112422,781\n112423,47\n112423,2469\n112424,1132\n112425,781\n112426,1132\n112427,781\n112428,1132\n112429,781\n112430,298\n112431,485\n112432,2480\n112433,202\n112433,346\n112433,358\n112433,671\n112433,3804\n112434,1634\n112435,158\n112436,920\n112437,850\n112437,4193\n112438,788\n112438,148742\n112439,392\n112439,535\n112440,310\n112441,676\n112442,22\n112442,1374\n112443,37\n112444,112445\n112446,1132\n112447,781\n112448,422\n112449,56\n112450,1043\n112451,112452\n112453,1132\n112454,781\n112455,158\n112455,252\n112456,1132\n112457,781\n112458,302\n112459,809\n112460,467\n112460,920\n112461,112462\n112463,1132\n112464,2989\n112464,2991\n112465,781\n112466,222\n112466,455\n112467,217\n112469,147\n112469,158\n112469,118336\n112470,1265\n112470,1266\n112471,1132\n112472,781\n112473,392\n112474,2989\n112474,2991\n112475,1001\n112476,467\n112477,563\n112478,3623\n112479,718\n112479,1127\n112480,406\n112480,1749\n112481,4691\n112482,1893\n112483,477\n112484,477\n112485,1127\n112485,49057\n112486,215\n112487,4611\n112488,1544\n112490,3623\n112491,31977\n112492,298\n112493,485\n112495,4611\n112496,1544\n112497,3\n112498,973\n112498,1298\n112499,406\n112500,1240\n112502,422\n112503,1332\n112503,1590\n112504,372\n112504,1082\n112505,254\n112505,557\n112505,954\n112505,1939\n112506,3623\n112507,3623\n112508,240\n112510,215\n112511,850\n112512,18831\n112513,6638\n112514,298\n112515,485\n112516,563\n112517,875\n112518,3623\n112519,112520\n112521,1619\n112522,206\n112522,5726\n112522,6119\n112523,1298\n112525,3623\n112527,372\n112527,444\n112527,2191\n112527,148742\n112528,2436\n112529,72\n112530,1285\n112530,84257\n112531,657\n112532,379\n112533,135\n112534,83\n112535,2775\n112536,447\n112537,1\n112537,147\n112537,149\n112537,171\n112537,184\n112537,859\n112537,1623\n112537,89035\n112543,298\n112544,485\n112545,356\n112546,2572\n112546,2590\n112547,175\n112549,298\n112550,2191\n112551,50\n112551,138\n112551,1087\n112551,1140\n112551,1332\n112551,1572\n112551,1860\n112551,1955\n112551,2286\n112551,5265\n112552,3623\n112553,372\n112553,1001\n112554,4411\n112555,336\n112556,272\n112557,330\n112558,1\n112558,209\n112559,779\n112559,1515\n112560,657\n112561,3\n112561,230509\n112561,230517\n112562,72\n112563,626\n112564,240\n112565,3623\n112566,4411\n112567,750\n112568,907\n112569,671\n112571,146\n112571,106502\n112572,483\n112573,779\n112574,1298\n112575,941\n112576,21408\n112577,442\n112578,112579\n112580,536\n112581,310\n112582,112583\n112584,850\n112585,392\n112586,130\n112587,175\n112588,309\n112588,310\n112589,298\n112590,827\n112591,147\n112593,439\n112593,671\n112594,112595\n112596,171\n112597,83\n112598,862\n112599,298\n112600,485\n112601,1634\n112602,862\n112603,1132\n112604,781\n112605,4411\n112607,862\n112608,850\n112609,6506\n112610,1631\n112611,336\n112611,1033\n112612,72\n112613,298\n112614,485\n112615,112616\n112617,136\n112619,392\n112619,433\n112619,1634\n112620,1127\n112621,112622\n112623,392\n112623,1240\n112624,112625\n112624,123385\n112626,3695\n112627,862\n112628,272\n112628,435\n112628,1893\n112629,795\n112630,3161\n112631,415\n112632,72\n112633,586\n112634,195\n112634,422\n112634,80266\n112635,5547\n112636,861\n112637,3\n112638,941\n112639,2506\n112640,298\n112641,485\n112642,4691\n112643,801\n112643,189842\n112644,112645\n112646,112647\n112648,941\n112649,298\n112650,485\n112651,376\n112652,875\n112653,240\n112654,30\n112655,687\n112656,586\n112656,1243\n112657,298\n112658,485\n112659,175\n112659,112660\n112659,118747\n112659,120222\n112659,132178\n112659,133855\n112659,134407\n112659,136952\n112659,139105\n112659,141612\n112659,142224\n112659,143355\n112659,144587\n112659,146739\n112659,149776\n112659,151894\n112659,154925\n112659,156065\n112659,157157\n112659,170424\n112659,172454\n112659,172925\n112659,181502\n112659,182688\n112659,204052\n112659,206649\n112659,208008\n112659,212704\n112659,214014\n112659,217250\n112659,217379\n112659,218707\n112659,219643\n112659,221813\n112659,225756\n112659,225839\n112659,226808\n112661,1085\n112662,2867\n112662,2868\n112663,818\n112664,298\n112665,485\n112666,877\n112667,2146\n112668,72\n112669,211\n112669,2775\n112670,78232\n112671,557\n112672,557\n112673,586\n112674,602\n112675,112676\n112677,32\n112678,310\n112679,2205\n112679,33424\n112680,435\n112681,1113\n112682,147\n112683,996\n112684,112685\n112686,298\n112686,596\n112687,1085\n112688,843\n112689,112690\n112691,3872\n112692,356\n112693,875\n112694,3207\n112696,2797\n112697,3623\n112698,712\n112699,175\n112699,1773\n112699,171297\n112700,3623\n112701,72\n112703,302\n112704,298\n112705,485\n112707,112707\n112708,2351\n112709,112710\n112709,113049\n112711,333\n112712,920\n112713,250\n112713,1684\n112714,112715\n112716,4455\n112719,68\n112719,127158\n112722,809\n112722,973\n112723,602\n112725,809\n112726,83\n112727,83\n112727,1085\n112727,75912\n112728,631\n112729,34\n112729,35\n112729,2266\n112730,269\n112731,112732\n112731,113293\n112731,118973\n112731,121178\n112731,123489\n112734,72\n112735,83\n112736,861\n112737,22\n112738,119\n112739,30\n112741,346\n112742,65\n112743,704\n112744,192\n112746,112747\n112748,310\n112751,112752\n112753,112754\n112755,72\n112756,435\n112757,298\n112758,485\n112759,112760\n112761,1149\n112762,442\n112763,195\n112764,112765\n112767,1844\n112768,126\n112770,23011\n112771,298\n112772,485\n112773,310\n112774,112775\n112776,233\n112777,861\n112778,22\n112779,1132\n112780,781\n112781,2671\n112782,893\n112786,657\n112787,1983\n112788,68\n112789,1240\n112789,1465\n112790,3\n112791,298\n112792,485\n112793,298\n112794,485\n112795,81\n112796,112797\n112798,611\n112799,403\n112800,298\n112801,485\n112802,207\n112803,112804\n112805,760\n112807,422\n112808,298\n112809,485\n112810,44\n112810,15609\n112810,27041\n112811,571\n112811,872\n112812,192\n112812,663\n112814,2045\n112816,422\n112817,298\n112818,485\n112819,467\n112820,1659\n112821,298\n112822,485\n112823,1359\n112824,366\n112825,21408\n112826,310\n112827,366\n112828,893\n112829,907\n112829,2191\n112830,298\n112831,485\n112833,640\n112834,298\n112835,485\n112836,640\n112837,83\n112838,640\n112841,1276\n112841,1639\n112842,83\n112842,536\n112844,1634\n112845,355\n112847,422\n112848,422\n112849,422\n112850,422\n112851,422\n112852,422\n112853,1019\n112854,422\n112855,422\n112856,422\n112857,422\n112858,1509\n112859,314\n112859,623\n112859,1240\n112860,112860\n112861,422\n112862,422\n112863,422\n112864,2173\n112865,422\n112866,422\n112867,644\n112868,3\n112869,1188\n112871,298\n112872,485\n112874,392\n112875,252\n112875,516\n112875,1220\n112875,1222\n112876,717\n112877,298\n112878,485\n112879,287\n112880,112881\n112882,500\n112884,4060\n112885,344\n112886,671\n112887,298\n112888,485\n112889,34\n112889,35\n112890,749\n112891,422\n112892,56\n112893,392\n112894,79\n112896,1240\n112897,364\n112898,175\n112899,941\n112900,298\n112901,83\n112903,2812\n112903,172181\n112904,1089\n112905,252\n112906,240\n112907,389\n112907,861\n112907,919\n112907,2315\n112908,1019\n112910,1722\n112910,3367\n112910,112912\n112911,298\n112913,485\n112914,1289\n112915,2244\n112916,1019\n112917,72\n112918,441\n112919,372\n112919,805\n112919,1149\n112921,1927\n112923,392\n112923,1143\n112923,1151\n112923,1240\n112923,1454\n112923,1836\n112923,2443\n112924,19010\n112925,72\n112926,3623\n112927,575\n112928,996\n112929,1309\n112930,1467\n112932,72\n112933,1858\n112934,1860\n112935,1715\n112936,668\n112937,1634\n112939,1390\n112940,112941\n112943,720\n112944,586\n112945,175\n112946,298\n112947,435\n112947,1179\n112949,30\n112951,298\n112952,485\n112953,631\n112954,581\n112954,2604\n112954,34092\n112954,37787\n112954,64736\n112954,112954\n112954,176970\n112954,207006\n112955,1983\n112956,1132\n112957,781\n112959,112960\n112959,133925\n112959,159106\n112961,3872\n112962,631\n112962,1212\n112963,68\n112964,1019\n112964,115474\n112965,623\n112965,1590\n112965,1644\n112966,602\n112967,302\n112968,1220\n112968,1222\n112969,79\n112970,1983\n112971,3297\n112973,932\n112976,1858\n112977,1860\n112978,861\n112979,2626\n112980,146\n112981,1983\n112983,893\n112984,49057\n112985,435\n112986,107\n112988,298\n112989,485\n112990,408\n112991,1323\n112992,102\n112993,1326\n112995,615\n112997,298\n112998,485\n112999,103860\n113000,113001\n113002,301\n113003,657\n113003,1019\n113003,2266\n113003,181063\n113004,602\n113005,1983\n113006,240\n113007,79\n113008,1634\n113009,304\n113010,435\n113011,2443\n113011,5547\n113012,3\n113013,1984\n113013,3949\n113014,146\n113015,1707\n113016,1983\n113017,1465\n113018,788\n113019,21408\n113020,1849\n113020,3003\n113021,685\n113021,1130\n113022,13910\n113023,360\n113024,79\n113025,248\n113026,5405\n113027,149\n113027,220502\n113028,298\n113029,485\n113030,467\n113031,158\n113032,298\n113033,485\n113034,312\n113035,1087\n113036,843\n113037,861\n113038,22\n113039,58\n113040,994\n113041,46\n113042,75912\n113043,861\n113044,22\n113045,113046\n113048,907\n113050,406\n113051,1179\n113053,660\n113054,2315\n113055,3623\n113056,1745\n113057,140\n113058,1240\n113059,146\n113060,1844\n113060,113060\n113061,356\n113061,387\n113062,83\n113063,298\n113064,485\n113066,1085\n113068,269\n113069,1634\n113070,720\n113071,602\n113072,209\n113072,861\n113073,1388\n113074,515\n113075,298\n113076,485\n113077,510\n113078,433\n113079,3623\n113080,3623\n113081,644\n113082,3769\n113083,3367\n113084,113085\n113086,24763\n113087,83\n113088,298\n113089,485\n113090,113091\n113092,136\n113092,459\n113092,2557\n113093,1837\n113094,1019\n113094,3367\n113095,920\n113096,515\n113096,1381\n113096,1511\n113096,3069\n113098,3507\n113099,435\n113100,941\n113101,1801\n113102,4611\n113103,503\n113106,843\n113107,356\n113109,175\n113111,178\n113111,1033\n113112,298\n113113,835\n113114,252\n113115,557\n113117,3872\n113118,298\n113119,485\n113120,298\n113121,485\n113122,3069\n113123,1235\n113123,1335\n113123,5375\n113125,106\n113126,358\n113127,298\n113128,485\n113129,2411\n113131,3367\n113132,175\n113133,850\n113134,113135\n113136,298\n113137,1309\n113138,772\n113139,392\n113140,10\n113140,86780\n113140,86782\n113140,86790\n113141,113142\n113143,113144\n113145,827\n113146,271\n113147,68\n113148,704\n113149,113150\n113149,227725\n113151,376\n113152,536\n113153,1858\n113154,1860\n113155,893\n113156,10\n113156,73\n113156,175\n113156,693\n113156,1113\n113156,1306\n113156,4260\n113156,8664\n113156,19336\n113156,20107\n113156,20351\n113156,23217\n113156,30946\n113156,32699\n113156,38121\n113156,39039\n113156,39492\n113156,41041\n113156,42900\n113156,43180\n113156,45929\n113156,51557\n113156,55437\n113156,61577\n113156,64935\n113156,66724\n113156,67399\n113156,69509\n113156,73185\n113156,83971\n113156,85165\n113156,86779\n113156,86790\n113156,93853\n113156,106436\n113156,110256\n113156,113156\n113156,113160\n113156,125118\n113156,125719\n113156,126055\n113156,127825\n113156,130522\n113156,134100\n113156,136289\n113156,136644\n113156,136923\n113156,140274\n113156,140276\n113156,142083\n113156,142093\n113156,143023\n113156,143473\n113156,153202\n113156,153350\n113156,154531\n113156,154864\n113156,156186\n113156,157508\n113156,159259\n113156,159659\n113156,160577\n113156,161025\n113156,162698\n113156,163661\n113156,163875\n113156,163883\n113156,164163\n113156,164166\n113156,164200\n113156,164307\n113156,166742\n113156,166999\n113156,167188\n113156,167881\n113156,169041\n113156,169050\n113156,169631\n113156,170027\n113156,171449\n113156,172382\n113156,174123\n113156,174345\n113156,175608\n113156,176207\n113156,176627\n113156,177045\n113156,177554\n113156,180746\n113156,181552\n113156,181982\n113156,182667\n113156,183089\n113156,183917\n113156,184084\n113156,185041\n113156,186029\n113156,186737\n113156,188926\n113156,189672\n113156,190358\n113156,191541\n113156,198950\n113156,212205\n113156,214302\n113156,215749\n113156,216445\n113156,217810\n113156,218248\n113156,226069\n113156,226614\n113156,227490\n113156,227588\n113156,228765\n113156,229289\n113156,229964\n113156,232339\n113156,232401\n113156,236151\n113156,242535\n113156,244472\n113156,244904\n113156,248991\n113156,250982\n113156,251020\n113156,252752\n113156,252917\n113156,253020\n113156,253380\n113156,254395\n113156,259835\n113156,259852\n113156,260644\n113156,262200\n113157,372\n113157,1085\n113157,2812\n113158,298\n113159,485\n113161,140\n113162,267\n113163,2116\n113164,113165\n113167,59\n113167,83\n113167,994\n113167,1252\n113167,1253\n113167,3794\n113167,4691\n113168,2244\n113169,1458\n113170,147\n113171,184\n113172,206\n113173,113173\n113174,113175\n113176,113175\n113177,704\n113178,81\n113179,577\n113180,422\n113181,422\n113182,3695\n113183,83\n113183,991\n113183,1089\n113183,1623\n113183,30331\n113184,298\n113185,485\n113188,422\n113189,422\n113190,142870\n113190,148600\n113192,113193\n113194,252\n113195,113196\n113197,6119\n113198,147\n113199,113200\n113201,113201\n113202,3623\n113203,147\n113203,195\n113204,83\n113205,994\n113207,2867\n113207,2868\n113208,392\n113209,611\n113211,586\n113212,29380\n113213,872\n113214,483\n113215,2590\n113216,149\n113217,298\n113218,485\n113220,207\n113221,10\n113221,113140\n113222,10\n113222,693\n113222,1188\n113222,32475\n113223,175\n113224,149\n113225,113226\n113225,114903\n113227,298\n113228,89035\n113229,872\n113230,1429\n113231,994\n113232,885\n113232,13704\n113233,298\n113234,485\n113235,113236\n113237,668\n113238,406\n113240,1240\n113241,1962\n113242,957\n113242,1815\n113243,113244\n113243,120191\n113245,872\n113246,602\n113247,1143\n113248,206\n113249,818\n113250,217\n113250,20359\n113251,113252\n113253,406\n113254,309\n113254,310\n113255,113256\n113257,333\n113258,113259\n113258,147634\n113261,1803\n113262,10\n113263,137\n113265,113266\n113267,184\n113268,366\n113270,113271\n113270,125076\n113270,129595\n113270,179581\n113270,220371\n113270,238471\n113270,239384\n113272,294\n113273,35687\n113274,1133\n113275,289\n113275,290\n113276,2590\n113277,222\n113277,1019\n113278,113279\n113280,2146\n113281,3321\n113282,7416\n113284,113285\n113286,113287\n113288,581\n113290,1769\n113290,5547\n113291,310\n113292,772\n113294,77\n113295,1458\n113296,346\n113297,1821\n113298,273\n113298,2367\n113299,202\n113300,1085\n113301,657\n113302,1467\n113303,392\n113304,206\n113305,217\n113306,388\n113307,2424\n113308,298\n113309,485\n113310,328\n113311,175\n113314,113315\n113316,233\n113317,1871\n113318,811\n113319,113319\n113320,175\n113321,298\n113322,298\n113323,485\n113324,861\n113325,22\n113326,2373\n113328,873\n113330,435\n113330,515\n113330,1381\n113330,2867\n113330,2868\n113332,113333\n113334,1977\n113334,1978\n113335,355\n113336,225\n113336,932\n113336,1252\n113336,1253\n113336,141912\n113337,6119\n113338,79\n113340,4\n113340,5\n113341,63\n113341,79\n113341,251\n113341,442\n113341,516\n113341,779\n113341,30331\n113342,862\n113342,1631\n113343,13980\n113344,83\n113345,298\n113346,485\n113347,298\n113348,485\n113349,31977\n113350,861\n113351,22\n113352,302\n113353,68\n113353,356\n113353,852\n113353,2590\n113353,4411\n113355,387\n113358,718\n113359,452\n113359,535\n113359,918\n113359,1655\n113360,929\n113363,207\n113364,640\n113365,640\n113366,640\n113367,640\n113368,640\n113369,467\n113370,79\n113371,1927\n113372,861\n113373,22\n113374,422\n113375,13661\n113376,22\n113377,861\n113378,852\n113379,557\n113381,8270\n113382,22\n113383,861\n113385,422\n113386,557\n113387,422\n113388,422\n113389,422\n113390,422\n113391,422\n113393,422\n113394,422\n113395,422\n113396,422\n113397,1858\n113398,1860\n113399,1132\n113400,781\n113401,217\n113403,422\n113404,422\n113405,422\n113406,1132\n113407,781\n113408,251\n113408,516\n113409,422\n113410,9010\n113411,872\n113412,146\n113413,626\n113415,467\n113416,28072\n113418,113419\n113420,83\n113422,1132\n113423,781\n113425,1860\n113425,6955\n113426,13538\n113427,2775\n113428,447\n113429,850\n113429,1118\n113430,1785\n113431,3\n113433,592\n113434,3695\n113435,647\n113436,344\n113437,2572\n113438,1309\n113439,113440\n113441,397\n113442,340\n113443,19986\n113446,217\n113446,1118\n113447,772\n113447,1282\n113447,1332\n113448,1858\n113449,1860\n113450,1655\n113451,459\n113451,518\n113451,631\n113451,973\n113451,1479\n113452,175\n113453,298\n113454,349\n113455,592\n113458,15179\n113459,89035\n113460,119\n113460,151\n113460,192\n113460,309\n113460,310\n113460,577\n113460,1167\n113460,1400\n113461,586\n113462,151\n113463,1531\n113464,113465\n113467,1707\n113469,934\n113470,3367\n113471,137\n113471,200\n113471,772\n113471,1332\n113472,50\n113473,113474\n113475,515\n113476,356\n113477,586\n113479,1289\n113479,1509\n113479,131675\n113480,1467\n113482,1058\n113483,221\n113484,20\n113486,113487\n113488,79\n113489,221\n113490,119\n113491,298\n113492,485\n113493,71\n113494,113495\n113494,122080\n113496,222\n113496,1019\n113498,83\n113499,973\n113500,107\n113500,805\n113502,113503\n113504,390\n113504,626\n113504,649\n113504,1151\n113504,1381\n113504,1452\n113504,1579\n113504,6027\n113505,83\n113506,222\n113506,13661\n113507,264\n113508,275\n113509,1390\n113510,1390\n113511,347\n113512,1893\n113512,191860\n113514,298\n113515,485\n113516,1707\n113518,113519\n113520,1007\n113521,893\n113521,35092\n113522,1007\n113523,1007\n113524,25222\n113525,408\n113526,1323\n113527,102\n113528,1326\n113529,657\n113530,941\n113531,536\n113532,1130\n113532,1844\n113535,868\n113536,30\n113537,968\n113538,1688\n113539,3695\n113540,1\n113541,760\n113541,1368\n113542,113542\n113543,1085\n113544,3623\n113545,1132\n113546,781\n113547,301\n113548,1007\n113549,713\n113551,1132\n113552,781\n113553,1072\n113554,30\n113555,10\n113555,693\n113556,68069\n113557,240\n113558,1659\n113559,104\n113561,1836\n113561,13361\n113562,626\n113563,1608\n113564,657\n113565,1007\n113566,298\n113567,485\n113568,1007\n113569,30\n113570,657\n113571,9121\n113572,2617\n113573,459\n113573,980\n113573,1381\n113574,366\n113575,83209\n113578,113579\n113580,1240\n113581,184\n113582,718\n113583,346\n113584,2116\n113585,2266\n113585,23287\n113585,127158\n113585,181063\n113585,190492\n113585,212914\n113586,406\n113587,200\n113588,1132\n113589,781\n113590,10\n113591,72\n113592,113593\n113597,30\n113598,392\n113598,918\n113598,2979\n113599,1181\n113601,211\n113602,1436\n113603,140\n113604,1\n113604,147\n113604,1515\n113605,1298\n113606,379\n113607,1132\n113608,781\n113609,175\n113610,389\n113612,113613\n113614,298\n113615,30\n113616,1001\n113617,30\n113618,1479\n113618,1801\n113619,113620\n113621,493\n113622,215\n113623,158\n113623,406\n113623,779\n113623,1515\n113624,4611\n113625,1927\n113626,14483\n113627,6051\n113628,626\n113629,536\n113630,83\n113631,217\n113632,994\n113633,83\n113634,843\n113635,1417\n113636,104\n113637,392\n113638,3297\n113639,660\n113640,151\n113641,2146\n113642,2353\n113644,30\n113645,994\n113646,30\n113647,602\n113648,3804\n113649,1715\n113650,1231\n113651,3422\n113652,626\n113653,968\n113654,1298\n113655,233\n113656,5662\n113657,3\n113658,1001\n113659,63\n113660,518\n113661,14797\n113662,779\n113663,30\n113664,366\n113665,136\n113666,30\n113667,298\n113668,485\n113669,72\n113670,366\n113671,862\n113672,175\n113673,3623\n113674,298\n113675,7360\n113676,66297\n113677,2105\n113678,6487\n113679,4220\n113680,333\n113681,1608\n113682,818\n113683,3623\n113684,72\n113685,113686\n113687,30\n113688,994\n113690,209\n113691,1858\n113692,1860\n113693,1858\n113694,1860\n113695,72\n113696,217\n113697,3623\n113698,103860\n113700,83\n113701,3623\n113702,3623\n113703,994\n113704,113704\n113707,557\n113707,954\n113707,1939\n113708,918\n113710,483\n113711,298\n113712,485\n113713,2923\n113713,4190\n113714,3623\n113715,30\n113716,113717\n113718,599\n113719,2506\n113720,30\n113721,240\n113722,1983\n113723,255\n113724,862\n113725,106\n113726,1132\n113727,781\n113728,1132\n113729,781\n113730,1326\n113731,2782\n113732,557\n113733,872\n113736,30\n113738,222\n113739,994\n113740,113741\n113742,657\n113743,160\n113744,160\n113745,252\n113745,1220\n113745,1222\n113746,43203\n113747,1556\n113748,113749\n113750,206\n113751,30\n113752,1359\n113753,113754\n113755,483\n113756,1132\n113757,781\n113758,483\n113758,644\n113759,1085\n113760,372\n113760,1285\n113761,442\n113763,10\n113763,113156\n113764,657\n113765,113765\n113766,113767\n113768,1858\n113769,1860\n113770,113771\n113772,602\n113773,435\n113774,83\n113775,113776\n113777,682\n113777,72439\n113778,843\n113779,356\n113780,1227\n113780,5405\n113780,86416\n113781,647\n113782,34\n113782,35\n113782,283\n113782,536\n113782,1201\n113782,1274\n113782,2266\n113782,2671\n113782,2784\n113782,7092\n113784,113785\n113786,861\n113787,22\n113788,195\n113789,175\n113790,298\n113791,163\n113791,818\n113791,868\n113793,304\n113794,850\n113795,850\n113796,113797\n113798,104\n113798,136\n113798,1368\n113799,7\n113799,22\n113799,211\n113799,2017\n113800,113801\n113802,32\n113803,1001\n113804,72\n113805,72\n113806,1235\n113806,1335\n113807,255\n113808,184\n113809,1659\n113810,8992\n113811,602\n113812,30\n113813,113814\n113815,1927\n113817,68\n113817,843\n113818,30\n113819,72\n113820,479\n113822,72\n113823,2506\n113824,1235\n113824,1335\n113825,113826\n113827,30\n113828,1449\n113829,113830\n113831,72\n113833,366\n113834,366\n113836,1019\n113837,30\n113838,113839\n113840,406\n113841,346\n113842,233\n113843,146\n113843,994\n113843,1204\n113844,1132\n113845,781\n113846,113847\n113848,525\n113848,1326\n113849,491\n113850,355\n113851,5987\n113852,557\n113853,406\n113853,422\n113853,779\n113853,113854\n113853,116327\n113853,120682\n113855,252\n113856,298\n113857,485\n113858,269\n113859,113860\n113861,312\n113862,72\n113865,328\n113866,217\n113866,392\n113866,779\n113868,1858\n113869,1860\n113870,10\n113870,175\n113871,433\n113872,55849\n113873,1181\n113874,5405\n113875,1858\n113876,1860\n113877,32\n113877,3003\n113878,403\n113878,693\n113878,7795\n113878,20030\n113878,147758\n113879,1105\n113880,298\n113881,485\n113882,328\n113883,640\n113884,640\n113885,640\n113886,37\n113886,1782\n113887,50\n113888,3623\n113889,1858\n113890,1860\n113891,422\n113892,452\n113892,535\n113892,918\n113892,1655\n113893,349\n113894,2699\n113895,422\n113896,422\n113897,422\n113898,657\n113899,422\n113900,422\n113902,422\n113903,422\n113904,408\n113905,1983\n113906,298\n113907,485\n113908,1130\n113909,682\n113909,72439\n113910,1782\n113911,5405\n113912,298\n113913,485\n113915,1983\n113916,991\n113917,113918\n113919,433\n113920,422\n113921,647\n113922,422\n113923,422\n113924,422\n113925,422\n113927,579\n113928,252\n113929,1983\n113931,599\n113933,510\n113934,1688\n113935,3623\n113936,87\n113937,1531\n113937,2178\n113937,4545\n113937,139010\n113939,631\n113939,1285\n113939,84257\n113940,68\n113941,30\n113942,1962\n113943,577\n113944,1449\n113945,920\n113946,6119\n113947,206\n113948,3623\n113949,626\n113950,298\n113951,485\n113952,973\n113953,217\n113954,602\n113955,794\n113958,158\n113958,192\n113958,1181\n113958,1531\n113958,103153\n113959,481\n113959,1135\n113959,1172\n113959,1191\n113959,1204\n113959,1663\n113959,5213\n113959,14674\n113960,298\n113961,485\n113962,510\n113963,509\n113964,113965\n113966,859\n113967,292\n113969,760\n113969,1177\n113969,2210\n113970,536\n113971,1118\n113973,360\n113973,1893\n113973,49057\n113974,1556\n113975,298\n113976,485\n113977,298\n113978,485\n113979,3623\n113980,72\n113981,299\n113982,41\n113982,1285\n113983,298\n113984,485\n113985,1181\n113987,1285\n113988,1181\n113989,1285\n113990,1977\n113990,1978\n113991,1285\n113992,30\n113993,30\n113994,4611\n113995,30\n113996,298\n113997,485\n113998,1298\n113999,1509\n114000,137\n114001,850\n114002,1151\n114003,21408\n114004,5933\n114004,6506\n114005,114006\n114007,114006\n114008,1474\n114009,452\n114009,1655\n114010,1858\n114011,1860\n114012,30\n114013,536\n114014,206\n114015,510\n114016,83\n114016,385\n114016,447\n114016,5874\n114017,1240\n114018,4193\n114019,149\n114019,158\n114019,406\n114020,130\n114021,147\n114022,7155\n114023,6068\n114024,97\n114025,21408\n114026,30\n114027,83\n114027,784\n114028,1390\n114029,1858\n114030,1860\n114031,577\n114032,611\n114033,30\n114034,1860\n114035,794\n114036,114037\n114038,114037\n114039,120\n114040,58\n114041,760\n114043,3585\n114044,4611\n114045,1544\n114046,30\n114047,1634\n114048,1127\n114048,1893\n114048,49057\n114049,175\n114050,298\n114051,298\n114052,485\n114053,47\n114053,2469\n114054,422\n114056,184\n114057,1010\n114058,1274\n114059,602\n114060,59931\n114060,84257\n114061,2775\n114062,175\n114062,485\n114063,3623\n114064,72\n114064,240\n114064,372\n114064,442\n114064,588\n114064,590\n114064,714\n114064,1016\n114064,1368\n114064,1745\n114064,8180\n114066,875\n114067,602\n114069,31237\n114071,875\n114072,289\n114072,290\n114072,94134\n114073,403\n114074,2989\n114074,2991\n114075,163\n114076,4611\n114077,1544\n114078,302\n114078,861\n114079,714\n114080,623\n114080,1805\n114081,4611\n114082,1544\n114083,302\n114083,579\n114084,3209\n114085,37\n114086,775\n114087,827\n114089,1983\n114090,200\n114091,493\n114092,1119\n114092,84257\n114094,483\n114095,1983\n114096,7698\n114097,1983\n114098,1240\n114099,752\n114100,298\n114101,485\n114102,1274\n114102,5933\n114102,6506\n114103,298\n114104,485\n114105,1130\n114106,467\n114107,298\n114108,485\n114109,120\n114110,72\n114111,433\n114112,269\n114113,626\n114114,14434\n114115,79\n114116,114117\n114118,417\n114120,298\n114121,485\n114122,805\n114123,2989\n114123,2991\n114124,30\n114125,7117\n114126,160\n114126,1381\n114127,1285\n114128,58\n114129,994\n114130,46\n114131,75912\n114132,859\n114134,294\n114135,1285\n114136,393\n114136,980\n114137,349\n114138,1871\n114139,392\n114140,298\n114141,485\n114142,30\n114143,298\n114144,485\n114145,30\n114146,68\n114147,1181\n114148,1082\n114149,207\n114151,175\n114152,1082\n114153,298\n114154,647\n114155,1235\n114155,1335\n114156,30\n114157,30\n114158,623\n114158,852\n114158,1240\n114159,3507\n114160,1007\n114161,850\n114162,289\n114162,290\n114163,3623\n114164,1235\n114164,1335\n114164,1684\n114167,640\n114168,28072\n114169,3623\n114170,1860\n114172,2646\n114173,1381\n114174,586\n114175,516\n114176,251\n114176,693\n114176,1677\n114177,251\n114178,103860\n114179,1983\n114180,114181\n114182,66297\n114183,392\n114185,441\n114186,1891\n114187,301\n114189,114190\n114191,83\n114192,1238\n114194,2915\n114194,72439\n114195,209\n114195,2253\n114196,1749\n114197,120\n114198,72\n114199,2244\n114201,733\n114202,1556\n114203,349\n114203,809\n114204,1955\n114205,114206\n114207,346\n114208,5366\n114209,114210\n114211,211\n114211,809\n114212,175\n114213,298\n114214,114215\n114216,114217\n114218,72\n114220,1033\n114222,862\n114223,114224\n114225,298\n114226,485\n114227,72\n114228,30\n114229,592\n114230,114231\n114233,114234\n114235,83\n114236,206\n114237,30\n114238,34\n114238,6068\n114240,586\n114241,2506\n114242,111\n114242,13136\n114243,2506\n114244,114244\n114245,66297\n114246,160\n114247,1677\n114248,557\n114249,114250\n114251,346\n114253,435\n114254,376\n114255,885\n114255,13704\n114256,302\n114257,233\n114262,298\n114263,485\n114264,843\n114265,233\n114266,356\n114267,310\n114269,1608\n114270,415\n114271,920\n114272,298\n114273,485\n114274,178\n114275,30\n114276,346\n114277,30\n114278,1082\n114279,483\n114280,872\n114282,538\n114282,577\n114282,1294\n114282,33298\n114283,114284\n114285,114286\n114287,1243\n114288,14989\n114289,1010\n114290,1801\n114291,31896\n114292,388\n114293,23701\n114294,72\n114295,392\n114296,3069\n114297,44\n114297,861\n114298,114299\n114300,1181\n114301,30\n114302,72\n114303,114304\n114305,72\n114306,114307\n114308,602\n114309,298\n114310,485\n114312,30\n114313,1243\n114314,222\n114315,1235\n114315,17588\n114317,980\n114318,310\n114319,1243\n114320,118\n114320,4597\n114321,1243\n114322,114323\n114324,1238\n114325,114326\n114327,30\n114330,366\n114331,585\n114332,4475\n114333,7270\n114334,366\n114335,366\n114336,72\n114337,1243\n114338,346\n114339,175\n114340,872\n114341,1243\n114342,805\n114343,2048\n114344,298\n114345,485\n114346,298\n114347,485\n114348,310\n114349,1243\n114350,1243\n114351,1243\n114352,1243\n114353,467\n114353,1167\n114353,1368\n114354,941\n114355,602\n114356,1243\n114357,32\n114358,702\n114358,873\n114359,233\n114360,137\n114361,137\n114363,1243\n114364,75912\n114365,794\n114366,298\n114367,485\n114368,1243\n114369,298\n114370,485\n114371,30\n114372,1243\n114373,1452\n114374,452\n114374,457\n114374,535\n114374,676\n114374,918\n114374,1655\n114375,114376\n114377,209\n114378,1243\n114379,1860\n114380,1243\n114381,255\n114382,1858\n114383,1860\n114384,1858\n114385,1860\n114386,1243\n114387,3003\n114388,298\n114389,485\n114390,114391\n114392,104\n114393,32475\n114394,1058\n114395,1983\n114396,1860\n114398,1243\n114399,1243\n114400,6955\n114401,536\n114402,1243\n114403,1243\n114404,425\n114405,298\n114406,485\n114407,1858\n114408,1860\n114409,5213\n114410,1776\n114411,602\n114412,5405\n114413,2506\n114414,289\n114414,609\n114414,2315\n114414,94134\n114415,107\n114416,114417\n114418,298\n114419,485\n114420,298\n114421,485\n114423,640\n114424,640\n114425,298\n114426,485\n114427,217\n114429,114430\n114431,2353\n114432,298\n114433,485\n114434,298\n114435,485\n114436,1243\n114437,726\n114438,30\n114439,209\n114439,861\n114440,30\n114441,1243\n114442,422\n114443,422\n114444,422\n114445,79\n114445,301\n114445,760\n114446,292\n114446,2367\n114447,30\n114448,663\n114449,1243\n114451,907\n114452,1243\n114453,2674\n114453,16153\n114455,2590\n114456,536\n114456,1860\n114457,422\n114458,56\n114461,1096\n114463,95554\n114464,1837\n114465,875\n114466,422\n114467,422\n114469,422\n114470,422\n114471,2775\n114472,447\n114473,422\n114474,1243\n114475,422\n114476,264\n114476,1509\n114477,1243\n114478,209\n114480,1243\n114481,779\n114481,1181\n114481,1515\n114482,422\n114483,56\n114485,301\n114486,114487\n114488,1243\n114489,346\n114490,1858\n114491,1860\n114492,355\n114493,1127\n114493,49057\n114494,1243\n114495,1243\n114496,68069\n114497,1332\n114497,1844\n114499,483\n114500,1572\n114501,2979\n114502,422\n114503,56\n114504,1977\n114504,1978\n114505,114506\n114507,1983\n114508,1007\n114509,718\n114510,114511\n114512,425\n114513,1243\n114514,422\n114515,56\n114516,137\n114517,83\n114519,1836\n114519,13361\n114520,1243\n114521,50\n114522,1243\n114523,682\n114523,72439\n114524,1243\n114525,994\n114526,1243\n114527,5265\n114528,1243\n114529,1133\n114530,994\n114533,1983\n114534,3623\n114536,1983\n114537,44\n114538,1243\n114540,104\n114540,302\n114541,1243\n114542,527\n114542,1663\n114542,95152\n114543,63\n114543,106\n114543,251\n114543,439\n114543,516\n114543,1220\n114543,1222\n114543,1243\n114543,1512\n114543,5992\n114543,6119\n114543,16201\n114544,779\n114544,3769\n114545,1243\n114546,693\n114547,718\n114547,45437\n114548,1243\n114549,269\n114550,1243\n114551,195\n114552,2244\n114554,79\n114555,298\n114556,485\n114557,114558\n114560,50\n114560,79\n114560,192\n114560,195\n114560,422\n114560,859\n114560,994\n114560,4455\n114560,6051\n114560,6119\n114561,536\n114562,86\n114564,298\n114565,485\n114566,417\n114568,2266\n114569,589\n114570,676\n114571,1243\n114572,3069\n114573,1243\n114574,1243\n114575,107\n114576,1243\n114577,147\n114577,158\n114578,114579\n114580,920\n114581,733\n114581,1257\n114582,420\n114582,114590\n114583,1298\n114584,875\n114585,3367\n114586,843\n114587,1644\n114588,3367\n114589,6119\n114591,408\n114592,1323\n114593,102\n114594,1326\n114595,72\n114596,493\n114597,287\n114597,809\n114598,3623\n114599,1390\n114600,693\n114602,3623\n114604,209\n114604,861\n114605,2607\n114606,467\n114606,868\n114607,1522\n114608,1805\n114610,107\n114611,503\n114611,114581\n114612,2574\n114614,81\n114615,200\n114616,186\n114616,801\n114617,1298\n114618,4220\n114619,79\n114620,314\n114620,392\n114620,599\n114621,83\n114622,694\n114622,1240\n114623,1837\n114624,83\n114625,301\n114625,1782\n114626,3602\n114627,349\n114628,83\n114629,202\n114629,203\n114630,301\n114630,968\n114630,1167\n114630,1544\n114630,1837\n114630,2083\n114630,3194\n114630,3207\n114630,3218\n114630,5662\n114631,1425\n114632,83\n114633,160\n114633,671\n114633,1147\n114633,1623\n114636,483\n114637,346\n114638,1010\n114639,1983\n114640,19\n114641,2371\n114643,392\n114643,1210\n114644,392\n114645,346\n114646,338\n114647,941\n114648,278\n114649,298\n114650,485\n114651,2506\n114652,13980\n114653,72\n114654,392\n114658,298\n114659,485\n114661,175\n114662,298\n114663,346\n114664,103860\n114667,1858\n114668,1860\n114670,1659\n114671,994\n114671,1052\n114673,222\n114674,83\n114675,240\n114675,1955\n114677,114677\n114678,3623\n114680,289\n114680,304\n114680,1119\n114680,4411\n114680,94134\n114681,83\n114682,972\n114682,973\n114682,1010\n114682,1298\n114682,3804\n114682,124668\n114682,171641\n114682,187176\n114683,55849\n114684,8308\n114685,103860\n114686,55849\n114687,195\n114688,55849\n114689,447\n114689,538\n114690,809\n114691,55849\n114692,114693\n114694,55849\n114695,83\n114696,72\n114697,304\n114698,4611\n114699,1544\n114700,147\n114701,4611\n114702,1544\n114703,743\n114705,298\n114706,485\n114707,1467\n114710,717\n114712,1220\n114712,1222\n114713,252\n114714,251\n114715,3623\n114716,114717\n114718,3623\n114719,86\n114720,114721\n114722,557\n114723,8719\n114724,138\n114725,865\n114726,557\n114727,137\n114728,118\n114728,4597\n114729,88820\n114730,557\n114731,1556\n114732,557\n114733,1801\n114734,114735\n114734,140049\n114734,143176\n114736,557\n114737,140\n114738,240\n114738,301\n114741,114742\n114743,240\n114743,1715\n114744,1243\n114745,114746\n114747,704\n114748,222\n114749,1001\n114749,1326\n114749,3193\n114749,3804\n114749,14797\n114750,1801\n114751,676\n114752,146\n114754,114755\n114756,114757\n114759,255\n114760,114761\n114762,114763\n114764,114765\n114767,3297\n114768,114769\n114772,114773\n114775,4453\n114776,114777\n114778,114778\n114779,114780\n114781,114780\n114782,114780\n114783,114780\n114784,114785\n114786,225\n114789,114790\n114791,114792\n114793,114794\n114795,850\n114796,233\n114797,206\n114798,267\n114799,292\n114800,585\n114801,4453\n114803,8884\n114804,30\n114805,355\n114806,114807\n114808,1085\n114809,83\n114812,366\n114813,366\n114814,366\n114815,366\n114816,366\n114817,83\n114818,652\n114819,333\n114820,25348\n114820,101688\n114821,25348\n114821,101688\n114822,83\n114823,114824\n114825,114826\n114829,114830\n114832,83\n114833,83\n114834,83\n114835,83\n114836,968\n114838,130\n114838,1007\n114838,1289\n114839,1634\n114840,439\n114840,586\n114840,875\n114840,1284\n114840,1293\n114840,1370\n114840,1740\n114840,23287\n114840,127158\n114841,657\n114842,779\n114843,760\n114843,1119\n114843,1149\n114843,1631\n114844,424\n114845,1860\n114846,333\n114846,1289\n114847,310\n114848,592\n114849,44\n114850,114851\n114852,1298\n114853,114854\n114855,114856\n114857,114858\n114859,366\n114860,422\n114861,56\n114862,1298\n114863,408\n114864,1323\n114865,102\n114866,1326\n114867,9318\n114868,114869\n114870,114871\n114872,406\n114873,805\n114874,310\n114875,114876\n114877,1127\n114878,267\n114880,602\n114881,1474\n114882,1019\n114883,3623\n114884,2334\n114885,392\n114886,114887\n114888,72\n114889,72\n114890,1058\n114892,298\n114893,485\n114894,192\n114895,10\n114896,3003\n114897,72\n114898,536\n114899,114900\n114901,66297\n114902,483\n114904,3623\n114905,3623\n114906,3623\n114907,3623\n114908,240\n114908,1402\n114908,1818\n114908,178576\n114909,3623\n114910,2146\n114911,114912\n114913,2266\n114914,346\n114915,114916\n114917,114918\n114919,79\n114919,106\n114919,192\n114919,202\n114919,333\n114919,586\n114919,1033\n114919,1370\n114919,17772\n114920,114921\n114923,406\n114924,114925\n114926,118\n114926,4597\n114927,1238\n114928,1116\n114928,1332\n114928,1844\n114930,114931\n114932,114933\n114935,30\n114937,255\n114938,557\n114939,1522\n114940,30\n114942,1479\n114943,390\n114944,296\n114945,298\n114946,485\n114947,72\n114948,114949\n114950,114951\n114952,48\n114952,140\n114952,1052\n114953,503\n114954,406\n114954,21442\n114955,1247\n114956,114957\n114958,72\n114959,114960\n114961,805\n114962,3\n114962,50\n114962,68\n114962,81\n114962,106\n114962,120\n114962,147\n114962,158\n114962,178\n114962,186\n114962,200\n114962,202\n114962,215\n114962,217\n114962,233\n114962,240\n114962,252\n114962,261\n114962,264\n114962,289\n114962,294\n114962,328\n114962,332\n114962,337\n114962,372\n114962,387\n114962,388\n114962,406\n114962,422\n114962,431\n114962,435\n114962,493\n114962,510\n114962,516\n114962,586\n114962,592\n114962,611\n114962,631\n114962,694\n114962,704\n114962,707\n114962,760\n114962,784\n114962,818\n114962,875\n114962,1001\n114962,1016\n114962,1068\n114962,1082\n114962,1149\n114962,1175\n114962,1181\n114962,1212\n114962,1243\n114962,1257\n114962,1282\n114962,1285\n114962,1309\n114962,1419\n114962,1466\n114962,1511\n114962,1564\n114962,1608\n114962,1631\n114962,1635\n114962,1715\n114962,1785\n114962,1796\n114962,1801\n114962,1807\n114962,1818\n114962,1821\n114962,1877\n114962,1888\n114962,1927\n114962,1955\n114962,1962\n114962,1985\n114962,2045\n114962,2205\n114962,2286\n114962,2315\n114962,2411\n114962,2590\n114962,2620\n114962,2775\n114962,2797\n114962,2812\n114962,2989\n114962,2991\n114962,3069\n114962,3115\n114962,3135\n114962,3182\n114962,3319\n114962,3328\n114962,3467\n114962,4193\n114962,4218\n114962,4237\n114962,4545\n114962,5440\n114962,5718\n114962,6424\n114962,6638\n114962,6837\n114962,7155\n114962,8180\n114962,9001\n114962,9005\n114962,9015\n114962,9021\n114962,9024\n114962,9025\n114962,11147\n114962,20535\n114962,21736\n114962,26041\n114962,27041\n114962,27550\n114962,28107\n114962,33424\n114962,54004\n114962,56150\n114962,94134\n114962,101473\n114962,101474\n114962,182162\n114964,114965\n114966,114967\n114970,147\n114970,23783\n114973,1955\n114974,114975\n114976,114977\n114978,113156\n114979,713\n114980,109308\n114981,109308\n114982,109308\n114983,114984\n114985,114986\n114987,503\n114987,33424\n114988,114989\n114990,114991\n114992,114993\n114994,114994\n114995,72\n114996,233\n114999,115000\n115002,107\n115003,2416\n115003,2417\n115004,292\n115005,338\n115006,298\n115007,1133\n115008,3538\n115009,115010\n115011,206\n115012,355\n115014,2266\n115015,115016\n115018,115019\n115020,346\n115021,795\n115023,298\n115024,485\n115025,137\n115026,83\n115027,1458\n115028,147\n115028,1458\n115029,44\n115030,147\n115030,1458\n115031,841\n115032,115033\n115034,115035\n115036,135\n115037,346\n115038,115039\n115040,2779\n115041,255\n115042,255\n115043,58\n115044,115045\n115046,103860\n115047,115048\n115049,10\n115049,251\n115049,1370\n115050,250\n115050,493\n115050,1453\n115050,1684\n115050,118054\n115050,164657\n115052,269\n115053,1515\n115054,14434\n115055,115056\n115057,1462\n115057,20790\n115058,602\n115059,602\n115060,206\n115061,2506\n115062,872\n115063,872\n115064,68069\n115065,392\n115066,287\n115066,809\n115066,19010\n115068,115069\n115070,1436\n115071,115072\n115073,115072\n115074,72\n115075,115\n115075,118\n115076,1796\n115077,158\n115078,115079\n115080,422\n115081,56\n115082,483\n115084,115085\n115084,116328\n115086,346\n115087,1927\n115088,305\n115089,920\n115090,422\n115091,56\n115092,115093\n115094,83\n115095,103860\n115096,30\n115097,1146\n115098,103860\n115100,2506\n115101,255\n115102,115103\n115105,115105\n115106,115\n115106,118\n115107,433\n115108,1102\n115109,115110\n115111,115112\n115113,115114\n115115,115116\n115117,1149\n115119,557\n115120,862\n115121,115122\n115123,115123\n115124,1058\n115125,298\n115126,485\n115128,34\n115128,35\n115128,1313\n115129,115130\n115131,115132\n115133,115132\n115134,115132\n115135,115136\n115137,1007\n115138,477\n115139,455\n115139,1019\n115140,704\n115141,1149\n115143,1014\n115144,968\n115145,115146\n115150,3260\n115151,2775\n115152,447\n115153,115154\n115153,172167\n115155,120\n115155,4691\n115157,83\n115157,217\n115157,222\n115157,261\n115157,283\n115157,379\n115157,455\n115157,536\n115157,657\n115157,694\n115157,781\n115157,1072\n115157,1274\n115157,1467\n115157,1608\n115157,1718\n115157,1881\n115157,2266\n115157,2646\n115157,2671\n115157,2779\n115157,2784\n115157,3252\n115157,4594\n115157,6888\n115157,29475\n115157,37088\n115158,115159\n115160,115161\n115162,10\n115164,30\n115164,1179\n115165,7416\n115166,640\n115167,843\n115168,83\n115168,259\n115168,500\n115168,3507\n115169,1707\n115170,301\n115171,115172\n115173,19227\n115175,115176\n115177,292\n115178,115179\n115180,294\n115181,1238\n115182,296\n115183,779\n115183,4193\n115184,298\n115185,115186\n115187,1452\n115188,222\n115189,137\n115190,83\n115191,233\n115192,115193\n115194,83\n115195,83\n115196,393\n115197,115198\n115199,115200\n115201,115202\n115203,115204\n115205,366\n115206,366\n115207,366\n115208,366\n115209,452\n115209,535\n115209,676\n115209,918\n115209,1655\n115210,115211\n115213,115214\n115215,115216\n115217,115216\n115218,346\n115220,312\n115221,2867\n115221,2868\n115222,256\n115222,1014\n115223,20813\n115224,258\n115225,349\n115226,355\n115227,1118\n115229,4355\n115230,298\n115231,485\n115232,602\n115233,73570\n115234,115235\n115234,243312\n115236,704\n115237,10\n115238,1572\n115239,1837\n115240,298\n115241,920\n115242,422\n115243,20\n115243,577\n115243,2931\n115244,602\n115245,389\n115246,72\n115247,79\n115248,602\n115249,2083\n115250,640\n115251,818\n115251,1807\n115251,1955\n115252,718\n115253,1019\n115254,422\n115255,422\n115256,422\n115257,422\n115258,422\n115259,422\n115260,422\n115261,422\n115262,1977\n115262,1978\n115263,302\n115263,2116\n115264,309\n115264,310\n115265,422\n115266,422\n115267,115268\n115269,422\n115270,83\n115271,6119\n115272,83\n115273,83\n115274,115275\n115276,255\n115277,827\n115278,875\n115279,115280\n115281,83\n115282,49057\n115283,1118\n115285,302\n115286,1634\n115287,841\n115288,44\n115289,217\n115289,872\n115289,1796\n115289,2626\n115290,406\n115290,779\n115291,2367\n115294,222\n115295,1659\n115296,217\n115298,588\n115298,590\n115298,805\n115299,22\n115299,192\n115299,217\n115300,595\n115301,302\n115302,500\n115303,200\n115304,200\n115305,795\n115306,301\n115308,115309\n115310,483\n115311,1556\n115312,10\n115313,115314\n115316,1289\n115318,718\n115319,422\n115320,56\n115321,171\n115322,252\n115322,1220\n115322,1222\n115325,175\n115326,1722\n115327,298\n115328,163\n115329,1619\n115330,907\n115332,1122\n115333,149\n115335,1858\n115336,1860\n115337,3367\n115338,115339\n115340,442\n115341,147\n115341,23783\n115342,422\n115343,56\n115344,115345\n115346,115347\n115348,115348\n115349,298\n115350,485\n115351,240\n115352,222\n115353,2605\n115354,859\n115355,171\n115356,217\n115357,10\n115357,175\n115357,184\n115357,206\n115358,115359\n115360,577\n115361,1465\n115362,920\n115363,1274\n115364,536\n115365,261\n115366,309\n115366,310\n115367,13538\n115369,248\n115369,1284\n115370,422\n115371,56\n115372,149\n115372,406\n115373,215\n115374,2989\n115374,2991\n115375,49887\n115376,704\n115377,175\n115378,3623\n115379,79\n115380,298\n115381,3960\n115382,337\n115383,115384\n115385,115386\n115388,310\n115389,536\n115389,779\n115390,1769\n115391,536\n115392,30\n115393,483\n115394,34\n115394,349\n115394,392\n115394,433\n115394,623\n115394,644\n115394,697\n115394,1860\n115396,195\n115397,104\n115398,704\n115399,1\n115400,1531\n115401,1363\n115402,200\n115402,225\n115402,772\n115403,1659\n115404,717\n115405,50\n115406,2367\n115407,3623\n115408,536\n115410,422\n115411,56\n115412,1007\n115413,79\n115414,55849\n115415,55849\n115416,55849\n115417,55849\n115418,55849\n115419,115420\n115421,843\n115422,55849\n115423,1070\n115424,346\n115425,717\n115426,376\n115427,3623\n115428,885\n115428,13704\n115429,55849\n115430,4611\n115431,818\n115432,175\n115433,298\n115434,389\n115435,358\n115436,862\n115437,557\n115438,298\n115439,485\n115440,477\n115440,23287\n115440,127158\n115440,214240\n115441,3623\n115443,278\n115444,55849\n115445,115446\n115447,115446\n115448,387\n115449,115450\n115451,704\n115452,115453\n115454,2116\n115455,1807\n115456,328\n115457,2701\n115458,1509\n115459,1893\n115460,406\n115461,192\n115461,406\n115462,2506\n115463,158\n115463,30428\n115464,115465\n115467,577\n115468,175\n115469,298\n115470,704\n115471,202\n115471,203\n115472,298\n115473,485\n115474,8\n115474,34\n115474,35\n115474,54\n115474,83\n115474,222\n115474,278\n115474,283\n115474,302\n115474,313\n115474,314\n115474,336\n115474,338\n115474,379\n115474,397\n115474,452\n115474,455\n115474,457\n115474,536\n115474,599\n115474,634\n115474,635\n115474,676\n115474,781\n115474,838\n115474,843\n115474,849\n115474,891\n115474,949\n115474,1011\n115474,1014\n115474,1118\n115474,1130\n115474,1274\n115474,1417\n115474,1434\n115474,1566\n115474,1618\n115474,1663\n115474,1881\n115474,1916\n115474,2159\n115474,2224\n115474,2319\n115474,2373\n115474,2421\n115474,2424\n115474,2646\n115474,2784\n115474,2821\n115474,3672\n115474,4048\n115474,4190\n115474,4234\n115474,4579\n115474,6822\n115474,6880\n115474,6904\n115474,7092\n115474,7698\n115474,7767\n115474,7768\n115474,9457\n115474,13622\n115474,13868\n115474,14094\n115474,17116\n115474,17273\n115474,18831\n115474,19413\n115474,19443\n115474,20757\n115474,24274\n115474,25272\n115474,28130\n115474,37088\n115474,63097\n115474,107100\n115474,112964\n115474,115474\n115474,120759\n115474,127158\n115474,127776\n115474,138701\n115474,146304\n115474,151760\n115474,157052\n115474,160809\n115474,168522\n115474,171621\n115474,171710\n115474,173332\n115474,175944\n115474,175945\n115474,176430\n115474,181063\n115474,188791\n115474,190108\n115474,194138\n115474,194315\n115474,207659\n115474,212914\n115474,221547\n115474,236740\n115474,237026\n115474,238184\n115474,241554\n115474,244132\n115474,248552\n115476,2506\n115477,788\n115478,1509\n115479,3\n115479,32\n115479,37\n115479,255\n115479,337\n115479,392\n115479,467\n115479,510\n115479,516\n115479,586\n115479,595\n115479,663\n115479,697\n115479,707\n115479,818\n115479,932\n115479,972\n115479,973\n115479,1010\n115479,1085\n115479,1118\n115479,1175\n115479,1243\n115479,1265\n115479,1266\n115479,1284\n115479,1370\n115479,1462\n115479,1465\n115479,1580\n115479,1776\n115479,1801\n115479,1821\n115479,1837\n115479,1860\n115479,1927\n115479,1985\n115479,2045\n115479,2191\n115479,2296\n115479,2782\n115479,2995\n115479,3182\n115479,3804\n115479,3999\n115479,6303\n115479,6424\n115479,6638\n115479,7194\n115479,8537\n115479,9028\n115479,44725\n115480,3209\n115481,406\n115482,356\n115483,8854\n115484,1309\n115485,115486\n115487,147\n115487,158\n115488,1707\n115490,298\n115491,485\n115492,1608\n115494,1181\n115495,516\n115496,207\n115498,207\n115499,115500\n115503,536\n115504,2590\n115505,9195\n115506,1429\n115507,115508\n115509,668\n115510,602\n115512,115513\n115514,258\n115515,872\n115516,115517\n115518,115519\n115521,1776\n115522,269\n115523,422\n115524,56\n115525,1143\n115526,779\n115527,171\n115528,918\n115529,7124\n115530,1955\n115531,104\n115531,134\n115531,136\n115531,137\n115531,138\n115531,205627\n115533,115534\n115536,115537\n115536,170475\n115536,172505\n115538,289\n115538,290\n115539,147\n115539,1458\n115539,80266\n115539,89035\n115539,102560\n115540,115541\n115542,115543\n115544,4545\n115545,1509\n115546,115547\n115548,115549\n115550,115551\n115552,4545\n115552,139010\n115553,215\n115554,227\n115556,2671\n115557,251\n115558,115559\n115560,115559\n115561,115559\n115562,115559\n115563,115564\n115565,516\n115565,2146\n115566,994\n115567,48\n115568,1432\n115569,94\n115569,2787\n115570,3\n115571,14434\n115572,273\n115573,175\n115574,298\n115576,1509\n115577,403\n115578,366\n115579,366\n115580,233\n115581,115582\n115583,1240\n115583,1454\n115584,2315\n115585,452\n115585,535\n115585,676\n115585,918\n115585,1655\n115586,115587\n115588,115587\n115589,206\n115590,115591\n115592,115593\n115594,175\n115595,298\n115596,310\n115597,115598\n115599,115600\n115601,115602\n115603,355\n115605,115606\n115607,310\n115608,240\n115609,1119\n115609,1462\n115609,8537\n115610,2989\n115610,2991\n115611,422\n115612,115613\n115614,422\n115615,1220\n115615,1222\n115616,252\n115617,251\n115618,422\n115619,422\n115620,422\n115621,422\n115622,422\n115623,422\n115624,422\n115625,422\n115626,422\n115627,422\n115628,422\n115629,452\n115630,1247\n115631,184\n115632,3623\n115633,1801\n115634,442\n115634,1177\n115634,2334\n115635,931\n115636,356\n115636,615\n115637,175\n115638,298\n115639,346\n115640,115641\n115643,920\n115643,1043\n115644,595\n115644,657\n115644,1453\n115644,2617\n115645,602\n115646,481\n115647,275\n115647,1927\n115648,406\n115650,1392\n115651,261\n115653,2506\n115654,1127\n115654,1289\n115654,49057\n115655,115656\n115657,333\n115657,1531\n115657,4455\n115657,15573\n115658,50\n115659,660\n115659,4260\n115659,6506\n115659,40566\n115659,115659\n115659,142409\n115659,142870\n115659,143287\n115659,144962\n115659,145502\n115659,145524\n115659,146280\n115659,146314\n115659,146952\n115659,154423\n115659,155480\n115659,155481\n115659,155493\n115659,155497\n115659,159115\n115659,159365\n115660,115661\n115662,379\n115663,875\n115664,1556\n115665,115666\n115667,392\n115667,1240\n115667,1453\n115667,1837\n115668,1289\n115668,2617\n115669,389\n115670,240\n115671,392\n115672,222\n115673,1181\n115674,1580\n115676,298\n115677,485\n115678,83\n115679,1531\n115680,103860\n115681,1284\n115681,1715\n115682,44\n115683,302\n115684,49057\n115685,115686\n115687,483\n115688,4\n115688,5\n115688,59\n115688,94\n115688,114\n115688,117\n115688,250\n115688,885\n115688,1212\n115688,1235\n115688,1335\n115688,1432\n115688,1684\n115688,2088\n115688,2089\n115688,2712\n115688,2787\n115688,2940\n115688,3794\n115688,13704\n115688,154690\n115689,2775\n115690,447\n115691,298\n115692,485\n115693,602\n115694,408\n115695,1323\n115696,102\n115697,1326\n115698,809\n115699,805\n115699,2995\n115700,602\n115701,1390\n115702,1977\n115702,1978\n115703,3695\n115704,557\n115704,772\n115705,1119\n115706,1749\n115707,103860\n115708,72\n115709,2209\n115710,115711\n115712,640\n115713,1240\n115713,1465\n115714,1033\n115715,158\n115715,1001\n115716,720\n115717,147\n115717,158\n115717,206\n115718,115719\n115720,147\n115720,149\n115720,158\n115720,206\n115720,406\n115720,1458\n115720,1515\n115720,2244\n115720,80266\n115720,89035\n115720,149534\n115721,718\n115722,115723\n115724,115725\n115726,602\n115727,602\n115728,602\n115729,267\n115731,450\n115732,115733\n115734,3623\n115735,298\n115736,346\n115737,302\n115738,206\n115739,3623\n115740,5591\n115741,3623\n115742,3695\n115744,195\n115745,1479\n115746,827\n115747,115748\n115749,147\n115749,158\n115749,206\n115749,1458\n115750,3507\n115751,602\n115752,72\n115753,1939\n115754,115755\n115756,450\n115756,640\n115757,393\n115758,72\n115759,602\n115760,406\n115761,717\n115761,1167\n115762,115763\n115764,72\n115765,72\n115766,344\n115767,285\n115768,663\n115769,96187\n115770,3623\n115771,309\n115771,310\n115771,577\n115771,1400\n115772,3623\n115773,1127\n115774,1454\n115775,222\n115776,323\n115776,1102\n115777,55849\n115778,3623\n115779,483\n115780,356\n115781,3623\n115782,779\n115783,115784\n115786,1769\n115787,602\n115788,195\n115789,588\n115789,590\n115789,84257\n115790,72\n115791,349\n115791,3260\n115792,1\n115792,79\n115792,149\n115792,273\n115792,1983\n115792,6556\n115792,16953\n115793,1119\n115794,602\n115796,346\n115797,115798\n115799,1509\n115800,115801\n115802,72\n115803,94\n115803,2787\n115804,222\n115805,852\n115806,222\n115807,211\n115808,70631\n115809,115810\n115811,1608\n115813,346\n115814,34\n115814,35\n115815,1309\n115816,1623\n115817,78232\n115818,175\n115819,115820\n115821,115822\n115823,298\n115825,140\n115826,267\n115827,447\n115828,1608\n115829,115830\n115831,72\n115832,344\n115833,285\n115835,14434\n115836,557\n115837,1531\n115838,726\n115839,1133\n115840,2797\n115841,332\n115842,115843\n115844,115845\n115847,175\n115848,298\n115849,269\n115849,760\n115849,1149\n115849,1631\n115850,557\n115851,557\n115852,3846\n115853,3623\n115854,1515\n115855,72\n115856,302\n115857,602\n115858,602\n115859,406\n115860,859\n115860,972\n115861,4066\n115862,358\n115863,2146\n115864,298\n115865,298\n115866,485\n115867,485\n115868,779\n115868,1515\n115869,72\n115870,355\n115871,175\n115872,355\n115873,298\n115874,72\n115875,72\n115876,622\n115877,704\n115878,697\n115879,704\n115880,115881\n115882,2116\n115883,158\n115883,779\n115884,115885\n115887,115\n115887,118\n115888,77\n115889,3135\n115890,602\n115891,602\n115892,115893\n115894,1247\n115895,704\n115896,704\n115897,175\n115898,298\n115899,41\n115900,704\n115901,2315\n115901,2620\n115901,5718\n115901,33424\n115902,577\n115903,310\n115904,2379\n115905,4545\n115905,139010\n115906,17228\n115909,115910\n115909,121689\n115909,139246\n115911,206\n115915,72\n115916,215\n115918,2590\n115919,115920\n115921,3246\n115923,115924\n115925,366\n115926,366\n115927,393\n115928,83\n115929,207\n115932,298\n115933,485\n115934,1238\n115935,602\n115936,1452\n115937,83\n115938,349\n115939,843\n115940,3370\n115940,14453\n115941,104\n115942,1282\n115943,872\n115944,1509\n115945,1429\n115946,233\n115948,81070\n115949,1634\n115950,668\n115951,2931\n115952,931\n115953,115954\n115955,388\n115956,10\n115956,33424\n115957,2351\n115958,1019\n115959,1359\n115962,48\n115963,1181\n115964,4611\n115965,1105\n115966,602\n115967,493\n115967,1608\n115972,111\n115973,985\n115974,392\n115975,48\n115977,640\n115978,640\n115979,240\n115979,588\n115979,590\n115980,30\n115981,640\n115982,640\n115983,209\n115984,115985\n115986,510\n115987,425\n115988,115989\n115988,237138\n115990,795\n115991,355\n115993,422\n115994,56\n115995,2312\n115996,843\n115996,1130\n115997,717\n115998,422\n115999,6955\n116000,422\n116001,422\n116002,422\n116003,422\n116004,38634\n116005,422\n116006,422\n116007,805\n116008,422\n116009,422\n116010,422\n116011,422\n116012,422\n116013,422\n116014,1955\n116016,1326\n116018,481\n116019,66\n116020,3623\n116022,3135\n116023,1089\n116024,4611\n116025,1544\n116026,130\n116026,1132\n116027,4611\n116028,1544\n116029,264\n116029,649\n116029,1381\n116029,1893\n116029,36819\n116030,192\n116030,202\n116031,388\n116031,694\n116031,859\n116031,1298\n116032,1143\n116033,195\n116033,779\n116034,557\n116035,1089\n116036,1359\n116037,1955\n116037,2812\n116038,1359\n116039,2083\n116040,2979\n116041,135\n116041,137\n116041,620\n116041,2105\n116042,3653\n116042,5192\n116043,442\n116043,1962\n116044,467\n116044,868\n116045,1132\n116046,781\n116047,750\n116048,84257\n116049,292\n116050,1132\n116051,781\n116052,292\n116053,30\n116054,5547\n116056,779\n116057,175\n116058,298\n116059,1238\n116061,116062\n116063,713\n116064,55849\n116065,1132\n116066,781\n116067,30\n116068,149\n116068,406\n116069,30\n116070,1132\n116071,781\n116072,195\n116073,30\n116074,222\n116074,3623\n116074,172243\n116075,1556\n116076,44\n116077,261\n116077,2512\n116077,2989\n116077,2991\n116078,408\n116079,1323\n116080,102\n116081,1326\n116082,2434\n116084,1551\n116084,3041\n116085,644\n116085,19443\n116086,344\n116089,292\n116090,1977\n116090,1978\n116092,818\n116094,81\n116095,934\n116095,1033\n116096,718\n116097,30\n116098,408\n116099,30\n116100,20771\n116101,30\n116102,372\n116102,1580\n116104,298\n116105,1623\n116106,1858\n116107,1860\n116108,30\n116109,30\n116110,515\n116111,50\n116112,332\n116113,3\n116114,192\n116114,217\n116114,467\n116114,1118\n116114,1417\n116115,509\n116116,1118\n116117,356\n116119,49057\n116120,602\n116121,72\n116122,344\n116123,285\n116124,17228\n116125,406\n116125,602\n116126,116127\n116128,1019\n116129,1132\n116130,781\n116131,841\n116132,406\n116133,202\n116133,203\n116134,2379\n116136,1313\n116137,525\n116138,30\n116139,233\n116139,294\n116139,631\n116140,1220\n116140,1222\n116141,252\n116142,251\n116144,1572\n116145,48\n116146,106\n116146,1241\n116147,83\n116148,15523\n116149,30\n116150,71\n116150,1782\n116151,602\n116152,298\n116153,485\n116155,72\n116156,344\n116157,285\n116158,149\n116159,116160\n116161,116160\n116163,406\n116164,1085\n116166,406\n116167,1220\n116167,1222\n116168,252\n116169,251\n116170,315\n116171,116172\n116173,5101\n116173,5103\n116174,116175\n116176,79\n116177,808\n116177,1240\n116178,2083\n116179,116180\n116181,116182\n116183,743\n116184,1715\n116187,116188\n116190,48\n116192,2699\n116194,116195\n116198,1782\n116199,3623\n116200,2506\n116204,704\n116205,1117\n116206,602\n116207,302\n116207,467\n116208,175\n116209,298\n116210,192\n116212,22\n116213,861\n116214,206\n116215,30\n116216,97\n116217,255\n116218,1893\n116218,49057\n116219,255\n116220,255\n116221,255\n116222,1118\n116223,483\n116224,116225\n116226,1220\n116226,1222\n116227,252\n116228,251\n116229,452\n116229,918\n116229,1655\n116230,467\n116232,116233\n116232,121760\n116232,129339\n116232,141263\n116234,273\n116236,1220\n116236,1222\n116237,252\n116238,251\n116239,269\n116240,1127\n116241,1\n116242,422\n116243,56\n116244,116245\n116246,392\n116247,994\n116248,209\n116248,302\n116248,1556\n116249,1181\n116250,175\n116251,116252\n116253,298\n116254,287\n116254,809\n116255,116256\n116257,116258\n116259,68\n116259,1888\n116259,2443\n116260,1326\n116261,252\n116263,704\n116264,2146\n116265,86\n116266,1511\n116266,3069\n116267,72\n116268,344\n116269,285\n116270,147\n116270,158\n116270,89035\n116271,222\n116272,1284\n116273,175\n116274,298\n116275,1010\n116276,376\n116277,885\n116277,13704\n116278,192\n116278,663\n116279,403\n116280,22\n116281,861\n116282,175\n116283,298\n116284,116285\n116286,83\n116286,178\n116286,779\n116287,116288\n116289,483\n116290,192\n116291,116292\n116293,557\n116294,557\n116295,116296\n116298,206\n116299,116299\n116300,298\n116301,485\n116302,602\n116303,602\n116304,602\n116305,175\n116306,298\n116307,116308\n116309,160\n116309,397\n116309,515\n116309,1132\n116309,1381\n116309,5440\n116310,861\n116311,30\n116312,3\n116313,116314\n116315,116314\n116316,30\n116317,356\n116318,1127\n116319,99\n116320,116321\n116323,30\n116324,30\n116325,175\n116326,298\n116329,217\n116329,536\n116331,116332\n116333,200\n116334,227\n116335,843\n116336,298\n116337,485\n116338,30\n116339,920\n116340,72\n116341,72\n116342,30\n116343,1235\n116343,1335\n116344,116345\n116346,72\n116347,1522\n116348,1522\n116349,72\n116350,116351\n116352,704\n116353,1368\n116355,255\n116356,178\n116357,35687\n116358,1522\n116360,116361\n116362,1509\n116363,323\n116364,116365\n116366,72\n116368,304\n116369,83\n116370,116371\n116373,2367\n116374,83\n116375,872\n116377,233\n116379,17309\n116380,581\n116382,116383\n116384,250\n116384,1684\n116385,861\n116386,116387\n116388,116387\n116389,81070\n116390,22\n116391,861\n116392,366\n116393,2274\n116394,1132\n116395,781\n116396,217\n116396,20359\n116397,422\n116398,56\n116399,66\n116400,493\n116400,682\n116400,72439\n116402,349\n116404,116405\n116406,1608\n116407,893\n116408,1132\n116409,781\n116411,83\n116412,602\n116414,392\n116415,861\n116416,1374\n116417,302\n116418,433\n116419,687\n116420,314\n116421,602\n116422,116423\n116424,4823\n116425,861\n116426,22\n116427,22\n116428,861\n116429,861\n116430,22\n116431,875\n116432,346\n116433,292\n116434,22\n116435,861\n116436,22\n116437,861\n116438,1007\n116439,1070\n116440,861\n116441,22\n116442,209\n116443,973\n116444,781\n116445,1132\n116446,415\n116447,589\n116448,1298\n116449,579\n116450,163\n116450,302\n116450,323\n116451,872\n116452,2373\n116453,447\n116454,1052\n116455,1118\n116456,586\n116457,640\n116458,893\n116459,1070\n116460,1132\n116461,781\n116462,81070\n116463,861\n116464,22\n116465,298\n116466,485\n116467,920\n116468,355\n116469,422\n116470,422\n116472,422\n116473,422\n116474,422\n116475,422\n116476,2668\n116477,422\n116478,422\n116479,149\n116479,269\n116479,406\n116480,968\n116481,392\n116482,422\n116483,875\n116484,861\n116485,22\n116486,116487\n116488,861\n116489,22\n116490,298\n116491,485\n116492,422\n116493,422\n116494,422\n116496,422\n116497,222\n116498,422\n116499,1370\n116500,116501\n116502,292\n116504,1580\n116505,9025\n116508,1580\n116509,48\n116510,313\n116510,660\n116510,1805\n116510,2006\n116511,298\n116512,485\n116514,481\n116515,509\n116516,30\n116518,8991\n116519,298\n116520,485\n116521,140\n116521,1052\n116521,1893\n116521,49057\n116521,191860\n116522,192\n116523,1515\n116524,49057\n116524,81070\n116525,1414\n116526,592\n116527,417\n116528,1132\n116529,781\n116530,167\n116531,30\n116531,248\n116531,599\n116532,861\n116533,22\n116534,252\n116535,516\n116535,868\n116535,1983\n116536,920\n116536,1623\n116537,2379\n116539,202\n116539,203\n116541,222\n116542,485\n116543,167\n116543,299\n116543,349\n116543,714\n116543,1001\n116543,1544\n116543,1715\n116543,2253\n116543,2620\n116543,127158\n116544,111\n116544,95554\n116544,111317\n116545,907\n116546,483\n116547,3\n116548,84257\n116549,536\n116550,861\n116551,22\n116552,861\n116553,22\n116557,292\n116558,56\n116559,4895\n116560,1837\n116561,298\n116562,485\n116563,356\n116564,298\n116565,485\n116566,309\n116566,310\n116568,827\n116570,868\n116571,206\n116572,206\n116572,240\n116573,44\n116574,843\n116575,175\n116576,58\n116577,994\n116578,46\n116579,75912\n116580,298\n116581,83\n116582,932\n116583,1390\n116584,49057\n116585,160\n116586,292\n116587,136\n116587,137\n116587,1240\n116587,1465\n116590,120\n116590,158\n116590,167\n116590,240\n116590,289\n116590,301\n116590,312\n116590,372\n116590,392\n116590,406\n116590,431\n116590,592\n116590,631\n116590,784\n116590,805\n116590,809\n116590,919\n116590,1001\n116590,1085\n116590,1119\n116590,1133\n116590,1240\n116590,1241\n116590,1285\n116590,1287\n116590,1466\n116590,1467\n116590,1511\n116590,1871\n116590,2205\n116590,2421\n116590,2443\n116590,2557\n116590,2620\n116590,2671\n116590,2995\n116590,3069\n116590,3135\n116590,5906\n116590,8788\n116590,15609\n116590,33424\n116590,94134\n116590,245910\n116591,4\n116591,5\n116592,861\n116593,22\n116594,516\n116597,1085\n116598,1285\n116598,84257\n116600,1001\n116601,1556\n116602,422\n116603,1400\n116604,278\n116604,1240\n116604,1370\n116604,1466\n116604,2266\n116605,3138\n116606,356\n116607,1977\n116607,1978\n116608,3999\n116608,162599\n116609,116610\n116611,592\n116612,1707\n116613,134\n116613,1282\n116615,1893\n116616,827\n116616,934\n116617,467\n116619,1220\n116619,1222\n116620,252\n116621,251\n116623,861\n116624,22\n116625,4611\n116626,1544\n116627,4611\n116628,1544\n116629,1466\n116630,1400\n116630,2073\n116631,147\n116632,4\n116632,5\n116632,355\n116633,861\n116634,22\n116635,611\n116636,1453\n116637,240\n116638,406\n116639,406\n116640,602\n116641,1177\n116642,1282\n116644,493\n116645,5591\n116646,861\n116647,22\n116648,4823\n116649,222\n116649,1019\n116651,147\n116651,158\n116651,422\n116652,202\n116652,203\n116653,248\n116656,49057\n116657,83\n116658,2867\n116658,2868\n116659,298\n116660,485\n116661,417\n116662,10\n116663,30\n116664,2379\n116665,22\n116666,861\n116667,298\n116668,485\n116669,592\n116670,175\n116671,861\n116672,22\n116673,22\n116674,861\n116675,14550\n116676,298\n116677,1289\n116678,861\n116679,22\n116680,30\n116681,252\n116682,1858\n116683,1860\n116684,861\n116685,22\n116686,2379\n116687,536\n116687,1201\n116688,1381\n116690,2775\n116691,447\n116692,147\n116692,252\n116692,1220\n116692,1222\n116693,1001\n116695,103860\n116696,2379\n116697,435\n116697,5212\n116698,861\n116699,50\n116700,861\n116701,22\n116702,861\n116703,22\n116704,158\n116705,22\n116706,72\n116707,344\n116708,285\n116710,252\n116710,1220\n116710,1222\n116711,333\n116712,200\n116712,2089\n116712,2940\n116713,406\n116714,861\n116715,22\n116716,34\n116716,35\n116716,389\n116716,536\n116716,949\n116717,483\n116718,779\n116718,991\n116718,1287\n116718,1515\n116718,2605\n116718,141912\n116719,175\n116720,2379\n116721,1634\n116721,116722\n116723,298\n116724,718\n116725,875\n116727,55849\n116728,116729\n116730,346\n116731,83\n116732,30\n116733,2379\n116734,1085\n116735,116736\n116737,875\n116738,875\n116739,1635\n116740,704\n116741,1001\n116742,55849\n116743,3623\n116744,872\n116745,875\n116746,3623\n116748,467\n116749,503\n116749,1149\n116750,1\n116751,920\n116752,30\n116753,3367\n116754,30\n116755,875\n116756,267\n116757,493\n116758,850\n116759,1849\n116760,1132\n116761,781\n116762,1551\n116762,3041\n116762,5440\n116763,1132\n116764,781\n116765,1132\n116766,781\n116767,376\n116768,250\n116768,1684\n116769,1522\n116770,392\n116771,358\n116772,158\n116773,3079\n116774,116775\n116776,116777\n116778,850\n116779,431\n116780,1522\n116781,949\n116782,8719\n116783,138\n116784,865\n116785,557\n116786,137\n116787,118\n116787,4597\n116788,4545\n116789,88820\n116790,222\n116791,1033\n116791,118336\n116792,557\n116793,557\n116794,1127\n116795,55849\n116796,1132\n116797,781\n116798,602\n116799,602\n116800,850\n116801,116802\n116803,72\n116804,344\n116805,285\n116806,55849\n116807,623\n116807,1805\n116808,55849\n116809,222\n116810,55849\n116811,116812\n116813,4545\n116814,1453\n116815,30\n116816,215\n116817,116818\n116819,264\n116820,1381\n116821,1007\n116822,30236\n116823,2775\n116824,447\n116825,640\n116826,116827\n116828,1927\n116830,356\n116831,88820\n116833,116834\n116836,83\n116837,116838\n116839,72\n116840,58\n116841,1414\n116842,4980\n116843,116844\n116845,455\n116845,599\n116845,1019\n116846,116847\n116848,14989\n116849,620\n116850,872\n116852,366\n116853,5547\n116854,366\n116855,366\n116856,42419\n116857,832\n116858,233\n116859,116860\n116861,4611\n116862,1544\n116863,4611\n116864,1544\n116865,4611\n116866,1544\n116867,4611\n116868,1544\n116869,4611\n116870,1544\n116871,4611\n116872,1544\n116873,255\n116874,1653\n116876,30\n116878,207\n116878,874\n116880,30\n116881,137\n116882,1238\n116883,1132\n116884,781\n116885,1132\n116886,781\n116887,861\n116888,1167\n116890,1452\n116891,215\n116892,32\n116893,167\n116894,30\n116896,298\n116897,485\n116898,838\n116899,116900\n116901,30\n116902,852\n116903,186\n116904,30\n116905,310\n116906,3585\n116907,55849\n116908,252\n116909,640\n116910,602\n116911,634\n116912,355\n116914,1707\n116915,602\n116916,366\n116917,392\n116918,184\n116919,422\n116919,1149\n116921,1132\n116922,781\n116923,116924\n116925,55849\n116926,30\n116927,116928\n116930,30\n116931,422\n116932,422\n116933,422\n116934,422\n116936,422\n116937,422\n116938,1985\n116940,422\n116941,422\n116942,422\n116943,422\n116944,422\n116945,422\n116946,422\n116947,422\n116948,240\n116949,849\n116950,22\n116951,1132\n116952,781\n116953,991\n116954,10\n116955,457\n116955,4066\n116957,515\n116958,217\n116958,294\n116958,592\n116958,1818\n116959,620\n116959,2244\n116959,80266\n116961,116962\n116963,640\n116964,116965\n116966,481\n116967,217\n116967,536\n116967,577\n116967,1608\n116968,72\n116969,2210\n116969,4237\n116970,1132\n116971,781\n116972,158\n116973,49057\n116974,1007\n116975,1127\n116975,1893\n116975,49057\n116975,81070\n116976,1893\n116976,49057\n116977,1201\n116978,1893\n116979,2775\n116980,447\n116981,1893\n116981,49057\n116982,272\n116982,467\n116982,868\n116982,162599\n116983,827\n116984,406\n116985,509\n116985,1151\n116986,105304\n116987,861\n116988,647\n116989,344\n116990,116991\n116992,116993\n116994,15523\n116995,1309\n116996,55849\n116997,10\n116999,1132\n117000,781\n117001,805\n117001,1007\n117002,30\n117002,63\n117002,1309\n117003,1955\n117004,83\n117005,875\n117006,175\n117007,298\n117008,592\n117008,872\n117009,49057\n117009,81070\n117010,397\n117011,2867\n117011,2868\n117012,273\n117012,1400\n117013,388\n117013,525\n117013,838\n117013,843\n117013,1014\n117013,1130\n117013,1326\n117013,1844\n117014,1556\n117015,217\n117015,1417\n117016,2867\n117016,2868\n117017,994\n117018,83\n117018,1085\n117018,1181\n117019,809\n117020,310\n117021,30\n117022,44\n117023,264\n117024,83\n117026,932\n117027,200\n117028,195\n117029,72\n117030,222\n117031,1388\n117032,117033\n117034,292\n117035,1132\n117036,781\n117037,602\n117038,1836\n117039,30\n117040,861\n117041,22\n117043,392\n117044,313\n117045,636\n117046,31977\n117047,104\n117048,1977\n117048,1978\n117049,392\n117050,1132\n117051,781\n117052,861\n117053,22\n117054,1390\n117055,861\n117056,22\n117057,147\n117058,333\n117060,149\n117060,467\n117060,868\n117060,2991\n117062,217\n117062,872\n117063,1132\n117064,781\n117065,1858\n117066,1860\n117067,200\n117068,117069\n117070,30\n117071,151\n117072,147\n117072,149\n117072,158\n117072,1014\n117074,1590\n117076,1019\n117077,298\n117078,485\n117079,30\n117080,1007\n117082,264\n117083,222\n117084,264\n117084,1912\n117085,636\n117086,4611\n117087,1544\n117088,4611\n117089,1544\n117090,1298\n117091,1858\n117092,1860\n117093,17228\n117094,5405\n117095,4611\n117096,1544\n117097,4611\n117098,1544\n117099,1117\n117099,148742\n117100,861\n117101,1858\n117102,1860\n117103,2674\n117103,30331\n117104,818\n117104,1749\n117105,557\n117106,72\n117107,949\n117108,366\n117109,467\n117109,868\n117110,1243\n117111,30\n117113,333\n117114,217\n117115,868\n117115,156379\n117115,162599\n117116,30\n117118,41\n117118,84257\n117119,30\n117120,117121\n117122,920\n117123,147\n117123,202\n117123,516\n117123,663\n117123,920\n117123,1181\n117124,2626\n117125,30\n117126,602\n117127,175\n117128,298\n117129,640\n117130,1893\n117130,49057\n117131,356\n117132,1388\n117133,483\n117134,59931\n117134,84257\n117135,222\n117137,1858\n117138,1860\n117139,117140\n117141,1818\n117142,222\n117142,455\n117143,1590\n117144,222\n117145,1220\n117145,1222\n117146,2416\n117146,2417\n117146,5908\n117147,222\n117147,455\n117148,192\n117149,117150\n117149,129445\n117151,222\n117152,392\n117152,1151\n117152,1893\n117153,192\n117154,119\n117155,2411\n117156,30\n117157,435\n117157,1644\n117158,175\n117159,158\n117159,192\n117160,298\n117161,72\n117162,117163\n117164,117165\n117166,72\n117167,55849\n117168,147\n117169,6506\n117170,9015\n117171,2312\n117172,117173\n117174,1353\n117175,215\n117176,622\n117179,1332\n117180,809\n117181,1132\n117182,781\n117183,30\n117183,200\n117183,772\n117184,835\n117184,1509\n117184,3041\n117186,1132\n117187,781\n117189,248\n117190,1132\n117191,781\n117193,557\n117194,20771\n117195,309\n117195,310\n117196,1454\n117197,1181\n117198,2266\n117200,171\n117201,4611\n117202,450\n117203,117204\n117205,1556\n117206,1844\n117207,450\n117208,298\n117209,485\n117210,117211\n117212,450\n117213,536\n117214,392\n117215,17346\n117217,117218\n117219,117220\n117221,55849\n117222,16196\n117223,117224\n117225,1544\n117226,72\n117226,94\n117227,994\n117228,358\n117229,117230\n117231,283\n117231,509\n117231,536\n117231,801\n117231,907\n117231,1122\n117231,1177\n117231,1467\n117231,1511\n117231,1522\n117231,2620\n117231,2784\n117231,3069\n117231,4545\n117232,602\n117233,602\n117234,72\n117235,72\n117236,2116\n117237,516\n117238,30\n117239,10\n117240,30\n117241,376\n117242,2421\n117243,2929\n117244,563\n117245,195\n117245,640\n117246,1118\n117247,32\n117247,302\n117247,779\n117247,2292\n117248,117249\n117250,30\n117251,117252\n117253,233\n117254,577\n117255,292\n117256,366\n117257,366\n117258,431\n117259,30\n117260,4935\n117261,1531\n117261,1985\n117263,9015\n117264,4192\n117264,4193\n117265,175\n117266,298\n117267,355\n117268,2506\n117269,336\n117270,1858\n117271,1860\n117272,217\n117272,872\n117272,1118\n117273,2574\n117274,117275\n117276,1858\n117277,1860\n117278,219\n117279,83\n117280,2590\n117281,200\n117281,772\n117282,6119\n117283,1509\n117284,222\n117285,117286\n117287,117288\n117289,207\n117291,973\n117292,1531\n117293,392\n117293,1085\n117295,452\n117296,1247\n117297,184\n117298,408\n117299,1323\n117300,102\n117301,1326\n117302,4691\n117303,117304\n117305,44\n117306,269\n117307,932\n117308,222\n117308,455\n117309,1844\n117310,433\n117311,9457\n117312,872\n117314,1429\n117316,117317\n117316,136916\n117316,137814\n117316,138604\n117316,141143\n117319,1132\n117320,781\n117321,1085\n117323,1132\n117324,781\n117325,99\n117326,30\n117327,103860\n117328,872\n117329,1132\n117330,781\n117331,298\n117332,485\n117333,586\n117334,668\n117335,117336\n117337,3804\n117339,117340\n117341,1983\n117342,298\n117343,485\n117344,298\n117345,485\n117346,103860\n117348,875\n117348,5718\n117349,55849\n117350,117351\n117352,240\n117353,55849\n117354,393\n117355,1181\n117356,117357\n117358,117357\n117359,117357\n117360,1453\n117361,50\n117362,483\n117363,2135\n117364,994\n117365,1707\n117367,298\n117368,485\n117370,376\n117373,117374\n117375,704\n117377,117378\n117379,10\n117380,117381\n117382,3316\n117383,175\n117384,1070\n117385,994\n117386,687\n117387,158\n117388,994\n117389,1368\n117390,30\n117391,30\n117392,6387\n117393,117394\n117395,3623\n117396,83\n117396,585\n117396,1177\n117396,182162\n117397,704\n117397,1140\n117397,5547\n117398,1479\n117399,117400\n117401,117402\n117403,390\n117405,779\n117407,175\n117408,30\n117409,117410\n117412,117413\n117412,125808\n117412,129967\n117412,132572\n117415,135\n117416,117417\n117418,310\n117419,310\n117420,117421\n117422,117423\n117424,147\n117425,843\n117426,117427\n117428,1143\n117429,147\n117430,843\n117431,72\n117432,10\n117433,117434\n117435,207\n117436,117437\n117438,117439\n117440,255\n117441,366\n117442,366\n117443,366\n117444,117445\n117446,663\n117447,117448\n117449,117450\n117451,117452\n117453,117453\n117454,117455\n117456,83\n117457,83\n117458,83\n117459,117460\n117459,261995\n117461,117462\n117461,190725\n117463,233\n117464,117465\n117466,107\n117467,2416\n117467,2417\n117468,292\n117469,338\n117470,298\n117471,1133\n117472,3538\n117473,30\n117474,355\n117475,117476\n117477,117478\n117479,536\n117481,117482\n117483,1572\n117484,117485\n117486,3623\n117487,3623\n117488,117489\n117490,406\n117492,827\n117493,84906\n117494,84906\n117495,333\n117496,298\n117497,485\n117498,859\n117499,55849\n117500,117501\n117502,592\n117503,30\n117504,117504\n117505,388\n117506,117507\n117509,602\n117510,117511\n117512,117511\n117513,117511\n117514,44\n117517,117518\n117519,117520\n117521,602\n117522,994\n117523,4545\n117525,22293\n117527,30\n117528,2620\n117529,30\n117530,620\n117530,8244\n117531,483\n117532,333\n117533,184\n117534,875\n117535,875\n117536,875\n117537,657\n117537,2017\n117537,2266\n117538,117539\n117540,2989\n117540,2991\n117543,117544\n117545,310\n117547,117548\n117549,117548\n117550,875\n117552,287\n117552,326\n117552,1607\n117552,1634\n117552,127158\n117553,117554\n117555,217\n117556,994\n117557,718\n117558,1\n117558,206\n117559,433\n117560,117561\n117562,117561\n117563,433\n117564,376\n117565,117566\n117565,118204\n117567,117568\n117569,33082\n117570,389\n117572,22\n117575,2351\n117576,14797\n117577,117578\n117579,862\n117581,994\n117582,713\n117584,557\n117587,30\n117588,252\n117588,516\n117589,134\n117590,1181\n117591,30\n117592,175\n117593,30\n117594,30\n117595,298\n117596,994\n117597,30\n117598,298\n117599,485\n117600,147\n117601,2146\n117602,30\n117604,34\n117604,7358\n117604,7363\n117605,994\n117606,298\n117607,485\n117608,171\n117609,973\n117610,32\n117611,117612\n117613,1132\n117614,781\n117615,202\n117615,203\n117616,72\n117617,30\n117618,72\n117619,117620\n117619,151192\n117619,158963\n117619,241940\n117621,83\n117622,422\n117623,422\n117624,422\n117625,422\n117626,422\n117627,422\n117628,422\n117629,422\n117630,422\n117631,422\n117632,422\n117633,143\n117634,30\n117635,310\n117636,640\n117637,30\n117638,602\n117639,117640\n117641,2351\n117642,117643\n117644,602\n117645,9560\n117646,1179\n117647,6068\n117648,1235\n117648,8992\n117649,175\n117650,298\n117651,310\n117652,261\n117653,346\n117654,117655\n117654,123719\n117656,1238\n117657,117658\n117659,1282\n117659,2045\n117659,2244\n117659,3999\n117660,1452\n117661,292\n117662,694\n117662,2266\n117662,13137\n117663,294\n117664,861\n117665,22\n117666,83\n117667,83\n117668,296\n117670,366\n117671,366\n117672,366\n117673,30\n117674,298\n117675,233\n117676,117677\n117678,1033\n117679,310\n117681,22\n117682,861\n117683,117684\n117686,602\n117687,184\n117688,707\n117689,117690\n117691,18790\n117693,298\n117694,485\n117697,3999\n117698,455\n117699,1715\n117700,931\n117701,355\n117702,1105\n117703,346\n117704,875\n117705,671\n117706,2367\n117707,1860\n117708,18790\n117710,1276\n117712,30\n117712,772\n117712,99807\n117713,1127\n117715,875\n117716,211\n117716,366\n117716,861\n117717,2775\n117718,447\n117719,206\n117720,66\n117720,147\n117720,217\n117720,571\n117720,81233\n117721,1572\n117722,2353\n117723,779\n117724,15\n117725,1007\n117726,60576\n117727,18790\n117728,298\n117729,485\n117730,4611\n117731,1544\n117732,4611\n117733,1544\n117734,447\n117735,1284\n117736,20\n117737,3331\n117738,1860\n117739,1132\n117740,781\n117743,1133\n117744,22\n117745,861\n117746,640\n117747,96187\n117748,192\n117749,1010\n117750,298\n117751,485\n117752,843\n117753,422\n117754,56\n117755,1132\n117756,781\n117757,1968\n117758,117759\n117760,338\n117761,586\n117762,481\n117764,1033\n117765,515\n117766,117767\n117768,1556\n117769,71\n117771,146\n117771,147\n117771,313\n117771,489\n117771,685\n117771,92476\n117772,349\n117773,843\n117774,2260\n117775,292\n117775,1688\n117776,1033\n117777,1977\n117777,1978\n117778,298\n117779,485\n117781,1033\n117782,1105\n117783,298\n117784,485\n117785,14434\n117786,3623\n117789,140\n117789,264\n117789,390\n117789,515\n117789,1381\n117789,1968\n117789,2017\n117789,2626\n117789,16687\n117790,1132\n117791,781\n117792,117793\n117795,685\n117795,2460\n117796,250\n117796,1684\n117797,408\n117798,1580\n117799,240\n117799,626\n117799,1085\n117799,1715\n117800,83\n117801,298\n117802,485\n117803,298\n117804,485\n117805,973\n117806,875\n117807,9457\n117808,2460\n117809,63\n117810,366\n117810,500\n117811,718\n117812,1132\n117813,781\n117814,1359\n117815,55849\n117816,332\n117817,536\n117817,2168\n117817,2266\n117818,79\n117818,841\n117818,911\n117818,1319\n117818,1707\n117818,2315\n117819,302\n117820,843\n117821,408\n117822,1323\n117823,102\n117824,1326\n117825,843\n117826,4611\n117827,1544\n117828,140\n117829,298\n117830,485\n117831,298\n117832,485\n117833,4611\n117834,1544\n117836,1247\n117837,298\n117838,485\n117839,140\n117840,158\n117840,202\n117840,203\n117840,252\n117840,622\n117841,68\n117842,120\n117842,733\n117842,818\n117842,1146\n117843,298\n117844,485\n117845,4611\n117846,1544\n117847,5265\n117848,4611\n117849,1544\n117850,355\n117852,298\n117853,485\n117854,932\n117855,298\n117856,485\n117857,861\n117858,22\n117859,1181\n117859,1381\n117860,1955\n117861,2379\n117862,557\n117863,175\n117864,4355\n117865,298\n117866,485\n117867,98192\n117868,117869\n117870,298\n117871,298\n117872,485\n117873,298\n117874,485\n117875,117876\n117877,255\n117878,255\n117879,255\n117880,3507\n117881,147\n117881,1089\n117881,1623\n117883,2926\n117884,79\n117885,467\n117886,346\n117887,58\n117887,338\n117887,340\n117887,442\n117887,609\n117887,801\n117887,1140\n117887,1147\n117887,1177\n117887,1381\n117887,1509\n117887,2443\n117887,3474\n117887,5547\n117887,60576\n117890,4611\n117891,1544\n117892,779\n117893,1140\n117893,5547\n117894,1803\n117895,309\n117895,310\n117897,425\n117898,5405\n117899,79\n117900,298\n117901,485\n117902,49057\n117902,81070\n117903,175\n117904,298\n117905,240\n117906,22\n117907,861\n117908,811\n117909,111\n117910,22\n117911,861\n117912,515\n117913,1181\n117913,1544\n117914,1085\n117915,389\n117916,10\n117917,79\n117918,433\n117919,743\n117919,8714\n117920,392\n117921,136\n117923,346\n117924,44725\n117925,485\n117926,251\n117927,19443\n117928,718\n117929,298\n117930,485\n117931,298\n117932,485\n117933,117934\n117935,298\n117936,485\n117938,704\n117939,1072\n117940,868\n117941,1181\n117942,1220\n117942,1222\n117943,252\n117944,251\n117945,30\n117946,760\n117947,1556\n117948,811\n117949,120\n117950,10\n117951,491\n117952,3316\n117953,298\n117954,485\n117955,175\n117956,136\n117956,137\n117957,595\n117957,703\n117958,1070\n117959,252\n117960,687\n117962,1572\n117963,1010\n117964,10\n117964,2574\n117965,657\n117965,6789\n117966,1877\n117966,21442\n117967,3623\n117968,273\n117970,298\n117971,485\n117972,298\n117973,485\n117974,79\n117974,178\n117974,435\n117974,663\n117974,1033\n117974,1385\n117974,1877\n117974,21442\n117975,298\n117976,485\n117977,1072\n117978,298\n117979,485\n117980,467\n117981,298\n117982,485\n117984,80266\n117985,298\n117986,485\n117987,579\n117988,267\n117989,1368\n117990,117991\n117992,1381\n117993,34\n117993,35\n117994,222\n117994,455\n117994,599\n117995,779\n117998,392\n117998,809\n117999,298\n118000,485\n118001,462\n118001,2646\n118002,849\n118003,4545\n118004,602\n118005,264\n118006,252\n118008,298\n118009,485\n118010,622\n118010,1844\n118011,298\n118012,485\n118013,483\n118014,30\n118015,264\n118015,1893\n118016,673\n118016,1011\n118017,79\n118018,255\n118019,30331\n118020,760\n118020,1119\n118020,1631\n118022,99\n118023,422\n118024,56\n118025,422\n118026,30\n118027,30\n118028,1010\n118029,187\n118030,118031\n118032,1212\n118033,1010\n118035,2371\n118036,388\n118037,2083\n118038,406\n118039,3623\n118040,875\n118041,907\n118043,30\n118045,30\n118046,1644\n118047,206\n118048,536\n118049,285\n118049,1515\n118050,4545\n118050,56150\n118050,139010\n118051,55849\n118052,1001\n118053,151\n118055,118056\n118057,217\n118058,602\n118059,602\n118060,1522\n118061,1608\n118062,79\n118062,136\n118062,137\n118062,203\n118062,333\n118062,1181\n118063,147\n118063,158\n118064,298\n118065,485\n118066,3252\n118069,30\n118070,175\n118071,2224\n118072,298\n118073,376\n118075,30\n118076,1467\n118077,118078\n118079,192\n118080,2434\n118081,9024\n118082,1776\n118083,1968\n118084,10\n118085,467\n118085,868\n118086,393\n118086,980\n118087,30\n118088,30\n118089,1033\n118090,2244\n118091,163\n118092,868\n118093,743\n118094,258\n118095,171\n118096,2506\n118097,30\n118098,118099\n118100,301\n118101,1033\n118102,30\n118103,118104\n118103,173026\n118105,2421\n118106,557\n118107,557\n118108,4475\n118109,118110\n118112,171\n118113,2506\n118114,1127\n118115,376\n118117,885\n118117,13704\n118118,30\n118119,406\n118120,30\n118121,202\n118121,203\n118122,2210\n118122,4237\n118122,182162\n118123,30\n118125,13361\n118126,175\n118126,7795\n118126,14483\n118127,30\n118128,118129\n118130,118131\n118132,1007\n118133,30\n118134,88820\n118135,44725\n118136,178\n118136,435\n118136,439\n118136,538\n118136,671\n118136,1033\n118136,1294\n118137,30\n118138,1509\n118139,30\n118140,120\n118140,1466\n118142,1707\n118143,1\n118144,372\n118144,1285\n118144,2989\n118144,2991\n118145,30\n118146,30\n118147,1556\n118148,55849\n118149,1359\n118150,30\n118151,30\n118152,30\n118153,704\n118154,158\n118155,435\n118156,862\n118156,44725\n118157,30\n118158,994\n118159,920\n118160,843\n118161,356\n118162,346\n118163,875\n118164,2460\n118164,2923\n118164,4190\n118165,861\n118166,2224\n118167,30\n118168,536\n118169,30\n118170,30\n118171,435\n118172,118173\n118174,843\n118175,356\n118176,392\n118177,30\n118178,72\n118179,202\n118179,203\n118181,557\n118182,1010\n118183,72\n118184,118185\n118186,30\n118187,118188\n118189,422\n118191,118192\n118193,1140\n118193,5547\n118194,3258\n118195,2244\n118196,72\n118197,893\n118198,175\n118199,298\n118200,1837\n118201,393\n118202,809\n118205,704\n118206,704\n118207,1\n118208,255\n118208,221307\n118209,808\n118210,346\n118211,118212\n118213,118212\n118214,346\n118215,118216\n118217,2367\n118218,640\n118219,178\n118220,75912\n118221,106\n118221,337\n118222,233\n118223,346\n118224,99\n118224,146\n118224,911\n118224,1285\n118224,92476\n118225,366\n118226,4611\n118227,1544\n118230,1849\n118232,346\n118233,58\n118234,994\n118235,46\n118236,75912\n118237,1177\n118237,2210\n118239,58\n118240,994\n118241,46\n118242,75912\n118244,346\n118245,340\n118245,682\n118245,2244\n118245,72439\n118246,1688\n118246,1707\n118247,207\n118248,289\n118248,290\n118248,1119\n118248,1149\n118248,1326\n118248,31977\n118248,94134\n118249,206\n118249,1888\n118250,1453\n118251,1\n118253,420\n118253,493\n118255,861\n118256,22\n118257,83\n118258,1522\n118258,1619\n118259,195\n118261,372\n118261,852\n118262,360\n118262,49057\n118264,119\n118264,151\n118264,192\n118264,202\n118264,500\n118264,577\n118264,622\n118264,1118\n118264,1224\n118265,1467\n118266,118267\n118268,2506\n118269,1509\n118270,118271\n118272,1070\n118273,118274\n118275,571\n118276,422\n118277,422\n118278,422\n118279,422\n118280,422\n118281,718\n118281,1210\n118282,1116\n118283,195\n118284,422\n118285,422\n118286,422\n118287,626\n118288,422\n118289,2574\n118290,911\n118290,2073\n118291,422\n118292,422\n118293,467\n118294,422\n118295,2424\n118296,422\n118297,355\n118298,422\n118299,136\n118300,55849\n118301,1749\n118301,14550\n118302,1096\n118303,50321\n118304,118305\n118306,873\n118307,2353\n118308,151\n118309,149\n118310,1105\n118311,1927\n118312,217\n118312,3804\n118313,422\n118314,56\n118315,1436\n118316,1983\n118317,497\n118317,527\n118318,518\n118318,3260\n118319,3623\n118320,143\n118321,118322\n118321,141121\n118321,144609\n118321,145742\n118321,179368\n118321,205658\n118321,214162\n118321,244229\n118321,249109\n118321,258610\n118323,264\n118324,389\n118325,3623\n118326,557\n118326,784\n118326,968\n118328,1983\n118329,415\n118329,717\n118330,481\n118331,10\n118331,30\n118331,32\n118331,34\n118331,35\n118331,37\n118331,50\n118331,58\n118331,65\n118331,72\n118331,94\n118331,104\n118331,106\n118331,111\n118331,115\n118331,120\n118331,134\n118331,137\n118331,146\n118331,158\n118331,163\n118331,167\n118331,171\n118331,192\n118331,202\n118331,206\n118331,207\n118331,240\n118331,248\n118331,264\n118331,272\n118331,273\n118331,283\n118331,287\n118331,289\n118331,290\n118331,301\n118331,309\n118331,310\n118331,314\n118331,333\n118331,338\n118331,356\n118331,372\n118331,392\n118331,417\n118331,422\n118331,433\n118331,450\n118331,452\n118331,473\n118331,479\n118331,500\n118331,503\n118331,516\n118331,525\n118331,536\n118331,567\n118331,615\n118331,628\n118331,631\n118331,640\n118331,647\n118331,652\n118331,657\n118331,673\n118331,698\n118331,714\n118331,736\n118331,760\n118331,772\n118331,781\n118331,795\n118331,805\n118331,843\n118331,859\n118331,872\n118331,907\n118331,932\n118331,949\n118331,980\n118331,994\n118331,1014\n118331,1019\n118331,1043\n118331,1046\n118331,1072\n118331,1089\n118331,1118\n118331,1133\n118331,1140\n118331,1175\n118331,1181\n118331,1210\n118331,1220\n118331,1222\n118331,1231\n118331,1265\n118331,1266\n118331,1284\n118331,1285\n118331,1370\n118331,1374\n118331,1381\n118331,1402\n118331,1462\n118331,1467\n118331,1511\n118331,1551\n118331,1572\n118331,1634\n118331,1635\n118331,1659\n118331,1718\n118331,1724\n118331,1749\n118331,1782\n118331,1844\n118331,1881\n118331,1893\n118331,1955\n118331,1968\n118331,2048\n118331,2205\n118331,2266\n118331,2292\n118331,2334\n118331,2460\n118331,2512\n118331,2574\n118331,2671\n118331,2719\n118331,2744\n118331,2750\n118331,2782\n118331,2784\n118331,2787\n118331,2807\n118331,3069\n118331,3129\n118331,3207\n118331,3238\n118331,3252\n118331,3295\n118331,3321\n118331,3345\n118331,3370\n118331,3695\n118331,3724\n118331,3804\n118331,4223\n118331,4276\n118331,4355\n118331,4453\n118331,4455\n118331,4487\n118331,4594\n118331,4637\n118331,4823\n118331,5358\n118331,5591\n118331,5718\n118331,5874\n118331,6184\n118331,6888\n118331,7124\n118331,7270\n118331,7360\n118331,7572\n118331,8180\n118331,8270\n118331,8537\n118331,8989\n118331,8992\n118331,8993\n118331,9007\n118331,9008\n118331,9010\n118331,9024\n118331,9179\n118331,13136\n118331,13575\n118331,13910\n118331,14352\n118331,14453\n118331,14556\n118331,14945\n118331,17772\n118331,21650\n118331,21716\n118331,22663\n118331,25222\n118331,29475\n118331,33424\n118331,34006\n118331,42232\n118331,49193\n118331,58376\n118331,92476\n118331,94134\n118331,125569\n118331,164068\n118331,164085\n118331,164097\n118331,164102\n118331,164106\n118331,164108\n118331,164109\n118331,175362\n118331,175363\n118331,175365\n118331,216631\n118331,216638\n118332,63\n118333,875\n118334,118335\n118336,1\n118336,11\n118336,20\n118336,50\n118336,146\n118336,147\n118336,149\n118336,158\n118336,175\n118336,192\n118336,206\n118336,285\n118336,314\n118336,336\n118336,397\n118336,406\n118336,452\n118336,457\n118336,505\n118336,599\n118336,620\n118336,640\n118336,676\n118336,685\n118336,779\n118336,818\n118336,838\n118336,849\n118336,920\n118336,1011\n118336,1014\n118336,1089\n118336,1118\n118336,1147\n118336,1262\n118336,1370\n118336,1425\n118336,1445\n118336,1458\n118336,1619\n118336,1623\n118336,1663\n118336,1776\n118336,1803\n118336,1901\n118336,2102\n118336,2244\n118336,2373\n118336,2400\n118336,2511\n118336,2609\n118336,3221\n118336,3571\n118336,3895\n118336,4109\n118336,4514\n118336,4663\n118336,5592\n118336,5981\n118336,6684\n118336,6904\n118336,7818\n118336,8421\n118336,8867\n118336,9394\n118336,13520\n118336,14113\n118336,15330\n118336,15587\n118336,16019\n118336,17285\n118336,18327\n118336,20371\n118336,21253\n118336,21442\n118336,24835\n118336,26450\n118336,28930\n118336,31796\n118336,35623\n118336,38386\n118336,42064\n118336,46609\n118336,49343\n118336,49586\n118336,50543\n118336,60576\n118336,61626\n118336,64258\n118336,68069\n118336,68149\n118336,70138\n118336,71830\n118336,71845\n118336,73231\n118336,76893\n118336,79528\n118336,80266\n118336,87799\n118336,88867\n118336,89035\n118336,89763\n118336,90794\n118336,92476\n118336,94986\n118336,95465\n118336,102560\n118336,104926\n118336,111217\n118336,112469\n118336,113357\n118336,116479\n118336,116791\n118336,118336\n118336,118904\n118336,119592\n118336,121001\n118336,123962\n118336,124016\n118336,124347\n118336,126717\n118336,127158\n118336,127170\n118336,131284\n118336,131813\n118336,134640\n118336,135378\n118336,136174\n118336,137183\n118336,138471\n118336,138472\n118336,138682\n118336,139577\n118336,140760\n118336,141790\n118336,141912\n118336,145035\n118336,154168\n118336,155025\n118336,155652\n118336,155680\n118336,156225\n118336,157361\n118336,158267\n118336,160689\n118336,160787\n118336,160912\n118336,161094\n118336,161221\n118336,161578\n118336,165536\n118336,166992\n118336,167567\n118336,167641\n118336,168480\n118336,169385\n118336,169620\n118336,171748\n118336,171761\n118336,174450\n118336,176396\n118336,176961\n118336,177590\n118336,177934\n118336,179615\n118336,180487\n118336,181210\n118336,181764\n118336,182339\n118336,183449\n118336,183772\n118336,185387\n118336,186631\n118336,188874\n118336,192449\n118336,192456\n118336,193170\n118336,204227\n118336,207513\n118336,214808\n118336,215276\n118336,215874\n118336,217984\n118336,218391\n118336,218740\n118336,218866\n118336,218958\n118336,220502\n118336,220935\n118336,222842\n118336,224568\n118336,225795\n118336,227210\n118336,227283\n118336,227372\n118336,227373\n118336,227392\n118336,227393\n118336,227400\n118336,227423\n118336,227458\n118336,227466\n118336,227566\n118336,227572\n118336,227810\n118336,228297\n118336,228513\n118336,228908\n118336,229134\n118336,232152\n118336,232772\n118336,233429\n118336,233645\n118336,233651\n118336,234382\n118336,234693\n118336,235881\n118336,236120\n118336,236899\n118336,240174\n118336,241558\n118336,241719\n118336,241735\n118336,241827\n118336,242345\n118336,242420\n118336,242826\n118336,244263\n118336,244679\n118336,245845\n118336,245974\n118336,246075\n118336,247217\n118336,249055\n118336,252482\n118336,255710\n118336,256199\n118336,256412\n118336,256660\n118336,258284\n118336,258723\n118336,258840\n118336,258902\n118336,260213\n118336,261702\n118337,3623\n118338,388\n118339,1983\n118340,4545\n118340,139010\n118341,907\n118342,118343\n118345,346\n118345,439\n118345,447\n118345,671\n118345,934\n118345,980\n118345,1033\n118345,1181\n118345,1265\n118345,1266\n118345,1590\n118346,118305\n118347,292\n118347,2209\n118348,3623\n118349,273\n118349,1116\n118350,393\n118351,718\n118352,356\n118353,146\n118354,3623\n118355,704\n118356,22\n118358,5547\n118360,63\n118360,516\n118360,733\n118361,3623\n118362,1285\n118362,84257\n118364,118365\n118366,1509\n118367,68\n118368,3623\n118369,310\n118370,1247\n118371,2209\n118373,30\n118375,467\n118375,13599\n118376,2083\n118377,240\n118378,83\n118378,2775\n118379,1983\n118380,3623\n118381,1983\n118382,30\n118383,1888\n118384,1858\n118385,1860\n118386,479\n118387,118388\n118389,3623\n118390,516\n118391,3623\n118393,3623\n118395,118396\n118397,408\n118398,1323\n118399,102\n118400,1326\n118401,1220\n118401,1222\n118403,1146\n118409,920\n118410,1858\n118411,1860\n118412,158\n118413,1858\n118414,1860\n118415,3623\n118416,49057\n118417,298\n118418,485\n118419,1888\n118419,2590\n118419,6068\n118420,83\n118421,83\n118422,29380\n118423,298\n118424,485\n118425,120\n118425,240\n118425,406\n118425,877\n118426,932\n118427,852\n118428,602\n118429,171\n118430,2617\n118432,2209\n118433,422\n118434,56\n118437,118\n118437,4545\n118437,4597\n118439,1983\n118440,298\n118441,485\n118442,3623\n118443,298\n118444,485\n118445,422\n118446,56\n118448,175\n118449,19443\n118449,188791\n118450,72\n118451,1635\n118452,302\n118453,143\n118454,22\n118454,467\n118455,3623\n118456,63\n118457,2116\n118458,1133\n118459,120\n118459,3115\n118460,1707\n118461,34\n118461,35\n118462,422\n118463,56\n118464,171\n118466,406\n118467,333\n118467,406\n118468,1179\n118469,30\n118470,302\n118471,158\n118472,949\n118473,422\n118474,358\n118475,422\n118476,56\n118477,143\n118478,3207\n118479,392\n118480,467\n118480,868\n118481,2205\n118481,33424\n118482,392\n118483,10\n118486,392\n118487,1370\n118488,1151\n118489,2572\n118490,240\n118490,818\n118491,315\n118492,6119\n118493,41\n118494,2775\n118495,447\n118496,30\n118497,393\n118498,704\n118499,422\n118500,56\n118501,893\n118502,309\n118502,310\n118502,588\n118502,590\n118502,6556\n118503,104\n118503,636\n118504,483\n118505,422\n118506,56\n118507,3623\n118508,65\n118509,3\n118509,34\n118509,35\n118509,106\n118509,158\n118509,178\n118509,192\n118509,202\n118509,203\n118509,217\n118509,251\n118509,252\n118509,337\n118509,346\n118509,435\n118509,516\n118509,586\n118509,622\n118509,640\n118509,663\n118509,1175\n118509,1181\n118509,1220\n118509,1222\n118509,1243\n118509,1294\n118509,1370\n118509,1590\n118509,1635\n118509,2567\n118509,3161\n118509,4192\n118509,4193\n118509,5874\n118509,5976\n118509,6119\n118509,8598\n118509,8771\n118509,8811\n118509,8822\n118509,8907\n118509,16201\n118510,167\n118510,301\n118511,599\n118512,1962\n118513,66\n118514,636\n118515,1282\n118516,72\n118517,346\n118518,3538\n118518,19005\n118519,34\n118519,35\n118520,200\n118520,772\n118521,372\n118522,63\n118523,240\n118523,1285\n118524,1007\n118525,151\n118526,647\n118527,344\n118528,219\n118529,310\n118530,389\n118532,991\n118532,33424\n118533,563\n118534,2351\n118536,2244\n118537,602\n118539,356\n118540,240\n118540,326\n118540,379\n118540,615\n118540,626\n118540,631\n118540,702\n118540,873\n118540,874\n118540,968\n118540,1085\n118540,1177\n118540,1715\n118540,1801\n118541,37\n118542,1608\n118544,1285\n118545,994\n118546,55849\n118547,875\n118548,1285\n118549,118550\n118554,994\n118555,994\n118556,1707\n118557,1453\n118558,22\n118558,861\n118560,1285\n118562,1983\n118563,34\n118565,3623\n118567,3623\n118568,298\n118569,485\n118570,1151\n118571,298\n118572,485\n118575,30\n118578,298\n118579,485\n118581,1332\n118582,1858\n118583,1860\n118584,30\n118585,516\n118585,1512\n118586,118587\n118588,3623\n118589,779\n118590,83\n118591,467\n118593,557\n118594,991\n118595,3623\n118596,392\n118597,3623\n118598,30\n118599,704\n118600,704\n118601,3623\n118602,140\n118603,267\n118604,422\n118605,56\n118606,118607\n118606,119809\n118606,129176\n118609,376\n118610,422\n118611,704\n118612,298\n118613,485\n118614,109503\n118615,1631\n118616,358\n118617,1707\n118618,435\n118619,206\n118620,215\n118621,346\n118623,392\n118624,647\n118625,344\n118626,298\n118627,485\n118628,136\n118628,596\n118629,217\n118630,298\n118631,485\n118632,346\n118633,704\n118634,104\n118635,118636\n118635,178178\n118635,181337\n118635,203841\n118635,215390\n118635,215445\n118635,217357\n118635,219710\n118635,221466\n118635,222413\n118635,227475\n118635,227958\n118635,232549\n118635,240606\n118635,242882\n118635,247579\n118635,249031\n118635,250388\n118635,254393\n118635,264947\n118637,346\n118639,298\n118640,485\n118641,557\n118642,557\n118643,2421\n118644,298\n118645,485\n118647,1707\n118648,207\n118649,310\n118650,3623\n118651,1590\n118652,647\n118653,344\n118654,1955\n118655,30\n118656,843\n118657,644\n118658,356\n118659,118660\n118661,280\n118661,17245\n118662,972\n118663,30\n118664,850\n118665,1858\n118666,1860\n118667,1368\n118668,1238\n118669,393\n118670,861\n118671,68\n118671,4220\n118672,118673\n118672,127711\n118675,515\n118676,872\n118677,2574\n118678,107\n118678,111\n118678,240\n118678,298\n118678,372\n118678,442\n118678,805\n118678,2209\n118678,2775\n118678,8180\n118679,3653\n118680,30\n118681,298\n118682,485\n118683,885\n118683,13704\n118684,3623\n118685,171\n118686,167\n118686,301\n118686,2557\n118687,3623\n118688,827\n118689,240\n118690,136\n118690,137\n118691,2116\n118692,6789\n118693,1052\n118694,3623\n118695,3623\n118696,2334\n118698,875\n118699,151\n118700,250\n118700,1684\n118701,118702\n118703,118704\n118705,1359\n118706,30\n118707,298\n118708,485\n118709,704\n118710,1298\n118711,292\n118712,1858\n118713,1860\n118714,298\n118715,485\n118716,15\n118717,134\n118718,452\n118718,457\n118718,535\n118718,676\n118718,918\n118718,1655\n118719,577\n118720,118721\n118722,30\n118723,1858\n118724,1860\n118725,949\n118725,1133\n118726,30\n118727,3260\n118728,328\n118729,192\n118729,1243\n118730,118731\n118732,602\n118733,602\n118734,9006\n118735,171\n118736,118737\n118738,2351\n118739,118740\n118741,431\n118741,631\n118741,44725\n118742,118743\n118744,602\n118745,2590\n118746,356\n118746,516\n118748,805\n118749,862\n118752,592\n118752,1085\n118753,207\n118754,872\n118756,1070\n118757,309\n118757,310\n118758,118759\n118760,118761\n118762,872\n118763,1429\n118764,323\n118766,668\n118767,118768\n118769,366\n118770,366\n118771,366\n118772,366\n118773,301\n118774,118775\n118776,118777\n118778,647\n118779,344\n118781,647\n118782,344\n118783,233\n118784,1247\n118785,83\n118786,83\n118787,83\n118789,118790\n118791,83\n118792,1509\n118793,136\n118794,346\n118795,30\n118798,264\n118798,1289\n118798,1381\n118798,1551\n118798,3999\n118799,516\n118800,1983\n118802,30\n118803,743\n118804,2296\n118805,30\n118806,1298\n118806,1927\n118808,1860\n118809,2460\n118810,118811\n118813,647\n118814,344\n118815,862\n118816,527\n118816,740\n118816,741\n118816,743\n118817,992\n118818,3297\n118819,1807\n118820,718\n118821,240\n118821,631\n118821,818\n118821,1749\n118821,1785\n118821,2334\n118821,5718\n118821,9010\n118822,602\n118823,30\n118824,118825\n118826,118827\n118828,225\n118829,338\n118830,1359\n118832,355\n118833,298\n118834,485\n118835,283\n118835,477\n118835,536\n118835,1201\n118835,1417\n118835,2944\n118836,518\n118836,900\n118836,1096\n118836,1345\n118836,1793\n118836,19421\n118836,68913\n118837,30\n118838,160\n118839,2205\n118839,33424\n118840,647\n118841,344\n118844,30\n118846,192\n118847,718\n118848,760\n118848,1860\n118849,333\n118850,349\n118851,422\n118852,3623\n118853,422\n118854,1143\n118855,422\n118856,422\n118857,422\n118858,422\n118859,422\n118860,626\n118862,422\n118863,422\n118864,195\n118865,422\n118866,310\n118867,310\n118868,422\n118869,422\n118870,515\n118871,422\n118872,222\n118873,192\n118874,298\n118875,485\n118876,422\n118877,1210\n118878,801\n118878,81070\n118879,22\n118879,211\n118880,1623\n118880,2379\n118881,861\n118882,397\n118883,346\n118884,3182\n118885,481\n118886,298\n118887,485\n118888,10\n118892,1105\n118895,1175\n118896,14100\n118897,337\n118898,500\n118899,118900\n118902,302\n118903,5547\n118904,337\n118904,118336\n118905,557\n118906,1368\n118907,760\n118908,2775\n118909,447\n118912,1509\n118916,875\n118917,315\n118918,1608\n118919,1977\n118919,1978\n118920,516\n118921,1001\n118922,118\n118922,422\n118922,557\n118922,852\n118922,4597\n118924,788\n118925,920\n118926,473\n118927,4545\n118927,56150\n118927,139010\n118928,1147\n118929,10\n118930,920\n118931,7\n118931,302\n118931,2775\n118931,3846\n118932,301\n118932,3422\n118934,175\n118935,657\n118936,298\n118937,579\n118938,455\n118940,852\n118941,54\n118942,54\n118942,2775\n118943,83\n118944,298\n118945,485\n118946,417\n118947,30\n118949,147\n118949,1458\n118950,849\n118951,447\n118951,6955\n118952,302\n118954,58\n118955,907\n118956,356\n118956,852\n118957,346\n118959,264\n118959,1132\n118959,1381\n118960,408\n118961,298\n118962,485\n118963,366\n118965,118966\n118967,1977\n118967,1978\n118968,134\n118969,493\n118971,390\n118972,949\n118974,72\n118975,2436\n118976,136\n118977,609\n118979,30\n118980,48\n118981,392\n118981,1453\n118982,356\n118982,1844\n118983,79\n118984,58\n118985,30\n118986,30\n118987,575\n118988,875\n118989,1284\n118989,2083\n118991,1298\n118992,631\n118993,1130\n118994,3474\n118995,3474\n118996,30\n118997,136\n118998,4220\n119000,1881\n119001,623\n119002,1105\n119003,1133\n119004,140\n119005,22\n119006,801\n119007,6506\n119009,119010\n119012,358\n119013,1105\n119014,37\n119014,1782\n119015,1836\n119016,1113\n119017,1105\n119019,195\n119020,1359\n119021,136\n119022,134\n119022,254\n119023,515\n119024,50\n119025,483\n119026,932\n119027,22\n119028,861\n119029,1707\n119030,1436\n119031,455\n119032,1381\n119033,310\n119034,920\n119035,298\n119036,485\n119037,1789\n119038,483\n119039,1655\n119040,10\n119041,4\n119041,5\n119041,527\n119042,4504\n119042,6323\n119043,1105\n119044,5662\n119045,717\n119046,264\n119046,1893\n119047,30\n119048,389\n119049,920\n119050,861\n119051,22\n119052,623\n119053,217\n119053,283\n119053,1019\n119053,1417\n119054,425\n119054,3507\n119055,119056\n119058,10\n119059,209\n119060,175\n119061,1370\n119062,298\n119063,340\n119064,1285\n119067,81\n119067,503\n119068,2421\n119068,22293\n119070,422\n119071,56\n119072,79\n119074,907\n119075,5547\n119076,119077\n119079,390\n119080,588\n119080,590\n119080,805\n119081,119082\n119083,86\n119088,3297\n119090,6506\n119091,1370\n119093,175\n119094,119\n119095,298\n119096,3623\n119097,1285\n119098,745\n119099,392\n119099,2292\n119099,2889\n119100,3079\n119101,107\n119102,120\n119102,1353\n119103,479\n119104,222\n119105,557\n119106,875\n119107,119108\n119109,55849\n119112,1181\n119113,298\n119114,485\n119115,119116\n119117,1118\n119118,119119\n119120,248\n119120,5405\n119121,298\n119122,485\n119123,366\n119124,1105\n119125,310\n119126,3623\n119127,805\n119128,579\n119129,298\n119130,485\n119131,30\n119132,3804\n119132,14797\n119133,346\n119134,81\n119135,280\n119135,17245\n119136,289\n119136,290\n119136,94134\n119137,2867\n119137,2868\n119138,868\n119140,1210\n119141,1506\n119142,3623\n119143,5906\n119144,557\n119145,626\n119146,278\n119147,137\n119148,862\n119149,557\n119150,557\n119151,579\n119152,30\n119153,6506\n119154,634\n119155,206\n119156,356\n119156,1332\n119156,2436\n119157,862\n119158,19519\n119159,119160\n119161,304\n119162,483\n119163,158\n119164,301\n119164,615\n119166,31977\n119167,4545\n119168,209\n119169,310\n119170,56\n119171,130\n119172,356\n119173,30\n119174,30\n119175,392\n119176,292\n119177,269\n119178,192\n119178,1243\n119179,999\n119180,1243\n119181,240\n119182,1007\n119183,130\n119184,48\n119185,30\n119186,119187\n119188,175\n119189,298\n119190,30\n119191,435\n119192,79\n119193,843\n119194,356\n119195,309\n119195,310\n119195,403\n119196,13137\n119197,346\n119198,119199\n119200,13980\n119201,417\n119201,1285\n119202,586\n119203,1818\n119204,119205\n119206,72\n119207,119208\n119209,119209\n119210,346\n119211,119212\n119213,77\n119214,119215\n119217,119218\n119217,172004\n119219,1001\n119219,1085\n119220,136\n119220,137\n119220,809\n119221,1467\n119222,3\n119223,1882\n119223,2210\n119223,4237\n119224,1381\n119225,862\n119226,388\n119227,872\n119228,4545\n119228,139010\n119229,2424\n119230,301\n119230,968\n119230,1837\n119230,2083\n119231,346\n119232,1871\n119233,310\n119235,233\n119236,893\n119236,6059\n119237,366\n119238,366\n119239,1118\n119240,298\n119241,485\n119243,106\n119244,158\n119245,346\n119246,1293\n119247,30\n119248,192\n119249,202\n119249,203\n119250,1096\n119251,355\n119252,1927\n119253,1149\n119254,255\n119255,137\n119256,83\n119256,775\n119256,1127\n119258,134\n119259,30\n119260,1241\n119261,333\n119262,859\n119263,6506\n119266,1240\n119267,30\n119268,861\n119269,22\n119271,206\n119272,248\n119273,11\n119274,30\n119275,313\n119275,1313\n119276,22\n119277,861\n119278,206\n119279,3804\n119279,14797\n119280,4611\n119281,1544\n119282,795\n119283,422\n119284,56\n119285,30\n119286,943\n119287,602\n119288,861\n119289,22\n119290,6506\n119291,22\n119292,119293\n119294,861\n119295,287\n119296,298\n119297,485\n119298,1888\n119298,4220\n119299,119300\n119303,298\n119304,485\n119305,818\n119307,1326\n119308,615\n119309,422\n119310,56\n119311,1782\n119312,3507\n119313,872\n119314,298\n119315,485\n119317,422\n119318,422\n119319,422\n119320,2045\n119321,422\n119322,422\n119323,422\n119324,422\n119325,788\n119325,841\n119326,422\n119327,1293\n119328,4611\n119329,1544\n119330,422\n119331,417\n119332,422\n119333,1707\n119334,760\n119335,422\n119336,422\n119337,1220\n119337,1222\n119338,1983\n119341,79\n119342,1087\n119343,4548\n119344,392\n119346,861\n119347,22\n119348,1087\n119349,657\n119349,1616\n119349,2266\n119350,3623\n119351,2274\n119352,1474\n119353,83\n119354,1858\n119355,1860\n119356,3623\n119357,22\n119358,861\n119360,3623\n119361,3623\n119362,920\n119363,2353\n119364,1556\n119365,298\n119366,485\n119367,4545\n119369,3623\n119370,1590\n119371,422\n119372,56\n119373,1805\n119374,3623\n119375,390\n119376,298\n119377,485\n119378,119379\n119380,72\n119382,5547\n119382,54362\n119383,2775\n119384,447\n119385,422\n119386,56\n119388,251\n119388,920\n119389,1983\n119390,663\n119390,1147\n119392,79\n119394,818\n119395,1220\n119395,1222\n119396,252\n119397,251\n119398,525\n119398,4039\n119399,877\n119400,422\n119401,56\n119402,1072\n119402,5375\n119403,861\n119404,79\n119405,818\n119407,1240\n119408,83\n119409,743\n119410,195\n119411,4672\n119411,18831\n119412,18831\n119413,1983\n119414,134\n119416,818\n119417,328\n119418,1985\n119419,32\n119419,178\n119419,439\n119419,493\n119419,875\n119419,1010\n119419,1429\n119419,1927\n119421,714\n119422,115\n119422,118\n119422,2991\n119423,7270\n119424,408\n119425,1323\n119426,102\n119427,1326\n119429,22\n119430,861\n119431,536\n119431,872\n119431,1072\n119431,1240\n119432,1011\n119433,1359\n119434,406\n119435,83\n119436,406\n119438,147\n119438,149\n119438,406\n119438,585\n119439,1977\n119439,1978\n119440,298\n119441,485\n119442,818\n119443,671\n119443,1188\n119443,144962\n119444,137\n119447,119448\n119449,298\n119450,485\n119451,392\n119452,743\n119453,3623\n119454,192\n119454,779\n119454,1515\n119456,366\n119456,1749\n119457,14797\n119458,14797\n119460,14797\n119461,1392\n119462,14797\n119463,417\n119464,483\n119465,119466\n119467,809\n119468,1474\n119469,30\n119470,3623\n119471,5130\n119473,3769\n119474,1058\n119475,862\n119477,1634\n119478,309\n119478,310\n119478,577\n119479,37\n119479,717\n119479,1782\n119480,571\n119480,868\n119481,269\n119482,422\n119483,4545\n119483,139010\n119484,932\n119485,1147\n119486,298\n119487,485\n119488,843\n119489,104\n119489,134\n119490,4545\n119490,56150\n119490,139010\n119491,843\n119492,1467\n119493,467\n119493,81233\n119493,152855\n119494,455\n119495,2424\n119497,1118\n119498,4611\n119499,1544\n119500,3\n119501,1871\n119502,106\n119503,119504\n119505,175\n119506,83\n119507,2421\n119508,13980\n119509,44\n119510,1284\n119513,1607\n119514,2436\n119515,1140\n119515,5547\n119516,72\n119517,344\n119518,285\n119519,1363\n119520,4066\n119521,3623\n119524,861\n119525,22\n119526,406\n119527,809\n119528,119529\n119530,72\n119531,344\n119532,285\n119533,392\n119533,3003\n119534,119535\n119537,312\n119538,392\n119539,4545\n119540,422\n119541,349\n119541,392\n119541,1151\n119542,192\n119542,663\n119542,1089\n119543,211\n119544,313\n119545,1235\n119545,1335\n119546,30\n119547,149\n119547,406\n119548,298\n119549,30\n119550,1240\n119551,515\n119552,934\n119553,483\n119554,602\n119555,298\n119556,485\n119558,779\n119558,1515\n119559,1151\n119560,694\n119560,2775\n119561,671\n119562,4220\n119563,30\n119564,2315\n119565,30\n119567,30\n119568,192\n119569,697\n119570,30\n119571,406\n119572,72\n119573,968\n119574,516\n119576,861\n119578,22\n119580,2421\n119583,5405\n119584,104\n119585,3623\n119586,1634\n119587,3474\n119588,3623\n119590,1381\n119591,3653\n119592,3367\n119592,3846\n119592,118336\n119593,450\n119594,392\n119595,1458\n119596,240\n119597,296\n119598,3623\n119599,3623\n119600,346\n119601,3623\n119602,30\n119603,1247\n119604,273\n119605,175\n119606,298\n119608,1436\n119609,450\n119610,167\n119611,3623\n119612,1522\n119613,366\n119614,1227\n119614,1252\n119614,1253\n119614,86416\n119615,628\n119616,31977\n119617,120\n119617,261\n119617,588\n119617,590\n119617,1419\n119617,2416\n119617,2417\n119617,3331\n119618,34\n119618,35\n119619,577\n119620,3623\n119621,358\n119622,30\n119623,211\n119624,2421\n119625,120\n119626,1769\n119627,136\n119627,137\n119627,2557\n119628,30\n119629,50\n119629,146\n119629,151\n119629,1556\n119631,3623\n119633,202\n119633,203\n119636,3623\n119637,10\n119638,422\n119639,56\n119640,1556\n119641,119642\n119641,150344\n119641,175891\n119643,50\n119643,862\n119644,623\n119646,3623\n119647,119648\n119649,1962\n119650,1462\n119650,8537\n119651,346\n119651,510\n119652,2205\n119652,33424\n119653,138\n119654,1085\n119655,206\n119656,269\n119657,557\n119658,557\n119659,862\n119660,557\n119661,158\n119662,23783\n119667,1133\n119668,1860\n119669,3612\n119670,595\n119671,2274\n119672,392\n119673,4760\n119674,6059\n119675,5658\n119676,4252\n119677,623\n119678,697\n119679,6955\n119680,1860\n119681,3612\n119682,595\n119683,2274\n119684,392\n119685,4760\n119686,6059\n119687,5658\n119688,4252\n119689,623\n119690,697\n119691,6955\n119692,818\n119695,119696\n119695,121074\n119695,227710\n119698,1631\n119699,119700\n119702,298\n119703,485\n119704,366\n119705,1707\n119710,3623\n119711,192\n119711,779\n119712,30\n119713,1266\n119713,8788\n119714,323\n119715,298\n119716,485\n119717,30\n119718,1240\n119719,119720\n119721,557\n119722,119723\n119724,30\n119725,30\n119726,2775\n119727,447\n119728,392\n119728,623\n119729,140\n119731,500\n119731,929\n119732,392\n119734,6789\n119735,843\n119736,72\n119737,344\n119738,285\n119739,119740\n119741,119742\n119743,510\n119744,602\n119745,818\n119746,119747\n119748,31977\n119750,206\n119751,63\n119752,310\n119754,30\n119755,30\n119757,130\n119758,158\n119758,1181\n119760,149\n119761,118192\n119763,346\n119764,10\n119765,278\n119766,13980\n119767,346\n119768,1353\n119769,107\n119769,852\n119770,4545\n119771,119772\n119773,255\n119774,872\n119775,4545\n119775,139010\n119777,1454\n119778,872\n119779,4545\n119779,139010\n119780,298\n119781,485\n119782,704\n119783,119784\n119785,872\n119787,30\n119788,233\n119789,760\n119790,3207\n119791,119792\n119793,644\n119794,714\n119795,4611\n119796,1544\n119797,366\n119798,366\n119799,366\n119800,1238\n119801,1001\n119802,310\n119804,872\n119805,1\n119806,119807\n119808,349\n119808,567\n119808,1436\n119808,1837\n119810,119811\n119812,63\n119813,119814\n119815,298\n119816,485\n119817,298\n119818,485\n119819,861\n119820,22\n119821,861\n119822,22\n119823,119824\n119825,309\n119825,310\n119826,63\n119827,450\n119828,355\n119829,2351\n119830,151\n119831,1133\n119832,20790\n119833,1388\n119834,30\n119835,707\n119836,875\n119837,298\n119838,485\n119839,22\n119840,392\n119840,2553\n119841,1359\n119843,1359\n119844,30\n119845,611\n119846,15\n119847,119848\n119849,298\n119850,485\n119851,1452\n119852,717\n119853,972\n119853,1284\n119855,1359\n119856,30\n119857,2191\n119858,326\n119858,1572\n119858,1749\n119859,726\n119860,1818\n119861,119862\n119863,68\n119863,631\n119863,59931\n119863,84257\n119865,397\n119866,119867\n119868,22\n119869,861\n119870,337\n119870,483\n119870,509\n119870,1118\n119870,1345\n119872,1590\n119872,1644\n119873,397\n119874,861\n119875,22\n119876,41\n119877,596\n119878,1888\n119879,422\n119880,500\n119881,1962\n119882,1052\n119883,1882\n119884,2775\n119885,54\n119886,422\n119887,422\n119888,422\n119889,422\n119890,1240\n119891,422\n119892,422\n119893,422\n119895,422\n119896,3804\n119897,422\n119898,422\n119899,422\n119900,422\n119901,795\n119902,1808\n119903,30\n119904,422\n119905,383\n119906,111\n119906,202\n119906,203\n119907,571\n119908,298\n119909,485\n119910,422\n119912,615\n119913,66\n119914,20\n119914,65\n119914,66\n119914,83\n119914,140\n119914,147\n119914,158\n119914,171\n119914,195\n119914,202\n119914,203\n119914,217\n119914,240\n119914,252\n119914,269\n119914,309\n119914,310\n119914,346\n119914,366\n119914,439\n119914,447\n119914,467\n119914,510\n119914,516\n119914,538\n119914,626\n119914,687\n119914,752\n119914,779\n119914,818\n119914,868\n119914,874\n119914,920\n119914,949\n119914,1001\n119914,1019\n119914,1133\n119914,1151\n119914,1231\n119914,1285\n119914,1289\n119914,1368\n119914,1370\n119914,1590\n119914,1644\n119914,1782\n119914,1801\n119914,2073\n119914,2244\n119914,3804\n119914,31206\n119914,31896\n119915,119916\n119917,2572\n119918,143\n119919,41\n119920,151\n119922,893\n119925,2244\n119926,30\n119927,178\n119928,392\n119929,481\n119930,1179\n119931,3623\n119932,389\n119933,425\n119934,750\n119935,72\n119936,30\n119937,30\n119938,302\n119938,493\n119939,392\n119939,1309\n119940,1392\n119941,68069\n119942,3623\n119944,1858\n119945,1860\n119946,1132\n119947,781\n119948,30\n119949,301\n119949,631\n119949,968\n119950,134\n119951,328\n119953,818\n119954,302\n119955,83\n119956,3003\n119959,22\n119960,1818\n119961,1133\n119963,175\n119964,22\n119965,861\n119966,298\n119967,83\n119968,1506\n119969,68069\n119970,467\n119971,346\n119972,346\n119974,30\n119975,1688\n119976,497\n119976,874\n119977,97\n119978,703\n119978,874\n119978,949\n119978,1240\n119978,1805\n119978,3182\n119978,3258\n119978,19443\n119979,693\n119980,1368\n119981,1983\n119982,1370\n119983,22\n119983,360\n119983,536\n119984,119985\n119986,3555\n119987,134\n119988,48\n119989,1436\n119990,3967\n119991,14100\n119991,210028\n119992,968\n119993,1010\n119993,119994\n119995,392\n119996,571\n119997,119998\n119997,125333\n119999,714\n119999,111142\n120000,392\n120001,63\n120002,202\n120002,203\n120003,175\n120004,298\n120005,360\n120006,1515\n120007,120008\n120007,121823\n120009,2626\n120011,298\n120012,485\n120013,79\n120014,1844\n120015,120016\n120017,269\n120018,1608\n120019,298\n120020,485\n120021,3422\n120022,875\n120023,467\n120023,156379\n120024,861\n120025,22\n120026,602\n120027,298\n120028,485\n120029,30\n120029,328\n120030,4611\n120031,1544\n120032,120033\n120032,244517\n120035,240\n120036,875\n120037,4611\n120038,1544\n120039,58\n120040,994\n120041,46\n120042,75912\n120044,805\n120046,861\n120047,22\n120048,346\n120050,192\n120052,435\n120052,447\n120052,538\n120052,671\n120052,1877\n120052,5996\n120053,450\n120054,1977\n120054,1978\n120056,408\n120057,1323\n120058,102\n120059,1326\n120060,50\n120060,2923\n120061,34\n120061,35\n120061,536\n120062,58\n120063,994\n120064,46\n120065,75912\n120066,302\n120067,289\n120067,290\n120067,94134\n120069,1449\n120070,1458\n120070,42064\n120072,450\n120073,392\n120074,30\n120075,195\n120077,30\n120078,3094\n120079,30\n120080,120081\n120083,503\n120084,30\n120085,579\n120086,46\n120086,48\n120086,56\n120086,130\n120086,138\n120086,278\n120086,304\n120086,444\n120086,455\n120086,459\n120086,575\n120086,660\n120086,726\n120086,744\n120086,749\n120086,795\n120086,859\n120086,996\n120086,1117\n120086,1122\n120086,1274\n120086,1644\n120086,2315\n120086,2424\n120086,2646\n120086,2944\n120086,3115\n120086,3623\n120086,4220\n120086,7768\n120086,13137\n120086,76096\n120087,1531\n120089,3507\n120090,447\n120090,671\n120091,1388\n120093,1818\n120094,217\n120095,209\n120096,7117\n120097,346\n120098,1293\n120099,106\n120100,130\n120100,1544\n120100,1807\n120101,2590\n120103,1590\n120104,252\n120104,516\n120104,1220\n120104,1222\n120105,30\n120106,206\n120106,4611\n120109,1033\n120109,1590\n120109,1644\n120110,2017\n120111,957\n120111,1815\n120112,258\n120115,1293\n120116,140\n120117,140\n120118,2191\n120119,2750\n120120,3623\n120121,422\n120122,195\n120123,1983\n120124,640\n120125,1749\n120126,3623\n120127,30\n120128,467\n120129,1607\n120130,4691\n120131,63\n120132,592\n120132,1001\n120133,422\n120133,1707\n120134,50\n120135,269\n120136,240\n120137,120138\n120139,704\n120141,30\n120142,30331\n120143,120144\n120143,183712\n120146,1132\n120147,781\n120150,44\n120151,1821\n120152,1001\n120153,120154\n120155,20\n120155,79\n120155,202\n120155,203\n120155,292\n120155,333\n120155,360\n120155,435\n120155,439\n120155,440\n120155,447\n120155,538\n120155,557\n120155,579\n120155,671\n120155,794\n120155,808\n120155,996\n120155,1033\n120155,1068\n120155,1118\n120155,1167\n120155,1294\n120155,1332\n120155,1368\n120155,1370\n120155,1474\n120155,1544\n120155,1590\n120155,1644\n120155,1663\n120155,1776\n120155,2224\n120155,2353\n120155,3422\n120155,3582\n120155,4823\n120155,5662\n120155,6661\n120155,6824\n120155,21442\n120155,190492\n120157,233\n120157,589\n120157,1085\n120158,868\n120159,304\n120160,435\n120161,120162\n120164,366\n120165,875\n120166,120167\n120168,120167\n120169,1019\n120170,2867\n120170,2868\n120171,175\n120172,298\n120173,843\n120174,1293\n120175,346\n120176,4611\n120177,1544\n120178,4611\n120179,1544\n120181,1133\n120182,202\n120182,203\n120183,1551\n120184,392\n120185,2353\n120186,694\n120187,346\n120188,158\n120188,269\n120188,406\n120188,622\n120188,5874\n120188,8308\n120189,55849\n120194,875\n120195,120196\n120195,129526\n120198,392\n120199,1285\n120201,120202\n120201,148495\n120201,207165\n120201,223072\n120203,137\n120204,136\n120205,192\n120205,663\n120206,9195\n120207,195\n120208,195\n120208,442\n120208,500\n120209,875\n120210,1544\n120212,809\n120213,2353\n120214,147\n120215,450\n120216,843\n120217,932\n120218,47\n120218,2469\n120219,779\n120220,808\n120221,450\n120223,5366\n120224,6051\n120225,8719\n120226,138\n120227,865\n120228,557\n120229,120230\n120231,137\n120232,118\n120232,4597\n120233,88820\n120234,557\n120235,557\n120236,557\n120237,120238\n120239,240\n120239,372\n120239,1082\n120239,1955\n120240,34\n120240,35\n120241,5547\n120242,136\n120244,120245\n120247,503\n120247,1773\n120248,206\n120249,1474\n120250,9743\n120251,30\n120252,34\n120252,35\n120253,1858\n120254,1860\n120255,217\n120256,4895\n120257,1\n120257,859\n120257,980\n120257,1368\n120257,1571\n120257,4571\n120257,4691\n120257,30331\n120259,885\n120259,13704\n120260,202\n120260,203\n120262,175\n120263,1983\n120264,195\n120265,1359\n120266,483\n120267,30\n120268,83\n120269,2083\n120271,298\n120272,485\n120273,158\n120274,240\n120275,120276\n120275,204525\n120277,22\n120278,861\n120279,22\n120280,861\n120281,120282\n120283,120284\n120285,120286\n120287,120288\n120289,1072\n120290,3623\n120292,120293\n120295,120296\n120297,120296\n120299,120300\n120301,120302\n120304,211\n120305,120306\n120307,72\n120308,120309\n120310,120311\n120314,120315\n120316,483\n120318,120319\n120320,120321\n120322,323\n120324,120325\n120326,1313\n120327,20771\n120329,7\n120330,72\n120332,120333\n120334,120335\n120336,1368\n120337,7316\n120338,120339\n120340,120341\n120342,366\n120343,366\n120344,120345\n120346,120347\n120348,120349\n120351,233\n120352,120353\n120354,120355\n120356,1127\n120357,120358\n120359,130\n120360,875\n120361,893\n120362,120363\n120364,120363\n120365,120366\n120367,120368\n120369,120370\n120371,355\n120372,120373\n120375,120376\n120377,406\n120378,83\n120380,120381\n120382,120381\n120383,120384\n120386,422\n120387,422\n120388,422\n120389,422\n120390,422\n120391,422\n120392,422\n120393,422\n120394,422\n120395,422\n120396,422\n120397,422\n120398,4545\n120398,139010\n120400,346\n120401,1267\n120402,312\n120403,83\n120404,298\n120405,485\n120406,333\n120407,83\n120408,3623\n120409,30\n120411,859\n120412,500\n120413,120414\n120415,1\n120416,160\n120418,2617\n120419,120420\n120419,134439\n120419,139354\n120419,141281\n120419,143615\n120419,158028\n120419,180624\n120421,26041\n120422,30\n120424,657\n120426,30\n120427,120428\n120429,861\n120430,22\n120431,120432\n120433,4193\n120434,298\n120435,485\n120436,280\n120436,1821\n120436,17245\n120436,21736\n120437,10\n120438,10\n120439,714\n120440,203\n120440,7270\n120441,1247\n120442,647\n120443,1335\n120444,758\n120445,1235\n120445,1684\n120446,3960\n120447,44\n120448,6556\n120449,217\n120449,536\n120449,571\n120449,1284\n120449,1417\n120449,1782\n120449,162599\n120451,973\n120452,602\n120453,120454\n120456,310\n120457,120458\n120459,120460\n120462,83\n120463,30\n120464,14797\n120466,4193\n120468,859\n120472,120473\n120474,1707\n120475,479\n120476,83\n120477,269\n120479,1858\n120480,1860\n120481,3846\n120482,516\n120482,1425\n120483,346\n120484,6627\n120485,1\n120486,30\n120487,602\n120489,602\n120490,7757\n120491,422\n120492,56\n120493,14797\n120494,571\n120495,485\n120496,422\n120497,30\n120498,120499\n120500,2979\n120500,15179\n120501,120502\n120501,120504\n120502,1402\n120503,202\n120503,203\n120503,333\n120503,500\n120503,588\n120503,590\n120503,1531\n120503,1724\n120503,1968\n120503,2073\n120503,3804\n120503,5310\n120506,120507\n120509,151\n120510,103860\n120511,68\n120511,84257\n120513,273\n120514,298\n120515,485\n120516,346\n120518,120519\n120520,120521\n120523,120524\n120525,483\n120526,120\n120527,450\n120528,4545\n120528,56150\n120528,139010\n120529,450\n120530,120531\n120532,120533\n120534,2719\n120535,15573\n120536,184\n120537,120538\n120539,1479\n120540,72\n120541,344\n120542,285\n120543,390\n120545,120546\n120547,450\n120548,602\n120549,120550\n120551,120552\n120553,450\n120554,137\n120555,602\n120557,4355\n120559,202\n120559,203\n120560,640\n120561,450\n120562,83\n120563,120564\n120565,120566\n120567,120568\n120569,120570\n120571,1821\n120572,233\n120573,120574\n120576,366\n120577,107\n120578,310\n120578,805\n120579,310\n120580,2416\n120580,2417\n120581,292\n120582,338\n120583,298\n120584,450\n120585,1133\n120586,3538\n120587,563\n120588,355\n120589,1181\n120590,346\n120591,120592\n120593,120594\n120595,2574\n120595,3297\n120596,120597\n120598,120599\n120601,697\n120602,1634\n120604,55849\n120605,120606\n120607,120608\n120609,22\n120610,861\n120612,980\n120613,1085\n120614,2367\n120615,72\n120616,30\n120617,408\n120618,1323\n120619,102\n120620,1326\n120621,120622\n120623,1231\n120624,120625\n120626,1707\n120627,120628\n120629,120630\n120631,44\n120632,120633\n120634,1425\n120635,72\n120636,1181\n120638,5250\n120639,30\n120640,30\n120641,120642\n120643,120642\n120644,120642\n120645,9015\n120646,151\n120647,2506\n120648,872\n120649,872\n120652,483\n120653,99\n120654,118\n120654,4597\n120655,2244\n120656,20813\n120657,309\n120657,310\n120659,4218\n120660,1368\n120661,240\n120662,422\n120663,500\n120664,120665\n120666,120667\n120668,358\n120669,187\n120670,1449\n120671,30\n120672,2135\n120673,120\n120673,273\n120673,1052\n120674,2775\n120675,447\n120677,83\n120678,120679\n120680,37414\n120681,72\n120683,818\n120684,120685\n120686,435\n120686,439\n120687,120688\n120687,128495\n120687,173079\n120687,260684\n120689,120690\n120692,1707\n120694,2620\n120696,450\n120697,120698\n120699,206\n120700,120701\n120702,120703\n120704,120704\n120705,120706\n120707,120708\n120709,120710\n120712,602\n120713,72\n120714,120715\n120716,120717\n120716,192362\n120718,120719\n120720,1388\n120721,557\n120722,557\n120723,298\n120724,485\n120725,893\n120726,3\n120727,467\n120728,55849\n120729,602\n120730,1388\n120732,1509\n120733,557\n120734,602\n120735,602\n120737,422\n120738,422\n120739,422\n120740,422\n120741,422\n120742,422\n120743,422\n120744,422\n120745,422\n120746,422\n120747,422\n120748,120749\n120750,422\n120751,422\n120752,433\n120753,527\n120755,33611\n120756,1072\n120757,1181\n120758,72\n120759,536\n120761,175\n120762,298\n120763,120764\n120765,1007\n120766,120767\n120768,104\n120769,184\n120770,72\n120771,120772\n120773,602\n120775,120776\n120775,159821\n120777,72\n120778,120779\n120780,292\n120781,72\n120782,294\n120784,296\n120785,298\n120786,450\n120787,302\n120788,120789\n120790,120791\n120792,120793\n120794,120795\n120794,141493\n120796,120797\n120799,1238\n120800,72\n120801,298\n120802,485\n120803,1452\n120804,30\n120806,233\n120807,120808\n120809,4611\n120810,1544\n120811,1359\n120812,19227\n120813,275\n120814,337\n120814,1370\n120815,120816\n120817,30\n120818,687\n120818,811\n120818,861\n120818,893\n120818,1509\n120819,1240\n120819,1465\n120820,872\n120821,120822\n120823,355\n120824,433\n120825,264\n120827,298\n120828,485\n120829,527\n120830,86\n120832,66\n120832,868\n120834,1007\n120835,4771\n120836,4611\n120837,1544\n120838,1010\n120838,2006\n120839,163\n120839,209\n120839,302\n120839,326\n120839,489\n120839,579\n120839,589\n120839,687\n120839,893\n120839,2116\n120840,222\n120841,3467\n120842,83\n120843,4771\n120844,503\n120845,120846\n120847,227\n120848,931\n120848,1149\n120848,14458\n120849,4355\n120850,107\n120851,225\n120852,111\n120853,623\n120854,30\n120856,269\n120857,120858\n120859,18831\n120861,431\n120862,298\n120863,485\n120864,4190\n120865,640\n120866,640\n120867,527\n120867,743\n120868,120869\n120870,1983\n120871,120872\n120873,83\n120874,392\n120875,760\n120876,252\n120876,1220\n120876,1222\n120877,660\n120880,605\n120880,1118\n120881,346\n120882,1566\n120883,147\n120884,1458\n120885,120886\n120887,4545\n120887,139010\n120888,120889\n120890,120891\n120892,149\n120893,140\n120893,652\n120893,818\n120893,1289\n120893,1381\n120893,1509\n120893,1968\n120893,4453\n120894,120895\n120897,255\n120898,859\n120899,406\n120900,3209\n120901,355\n120901,1374\n120902,500\n120904,875\n120906,1556\n120907,818\n120908,500\n120909,808\n120910,647\n120911,344\n120912,3538\n120913,119\n120914,209\n120917,4611\n120918,1544\n120919,3422\n120921,83\n120922,1167\n120923,620\n120923,8244\n120925,233\n120925,1608\n120927,673\n120927,1844\n120928,4611\n120929,1544\n120930,1452\n120931,261\n120933,120934\n120935,422\n120936,56\n120937,5547\n120938,4611\n120939,1544\n120940,66\n120940,1116\n120941,22\n120942,861\n120943,861\n120944,22\n120945,22\n120946,861\n120947,861\n120948,22\n120950,120951\n120950,131012\n120950,215032\n120952,4611\n120953,1544\n120954,298\n120955,485\n120956,389\n120957,872\n120958,457\n120960,718\n120964,673\n120964,5908\n120968,861\n120969,22\n120970,1085\n120971,422\n120972,56\n120973,298\n120974,485\n120975,861\n120976,22\n120977,1715\n120978,5301\n120979,392\n120980,2367\n120981,2224\n120982,1849\n120983,65\n120984,158\n120985,36985\n120986,30\n120988,30\n120990,408\n120991,298\n120992,485\n120993,2051\n120993,49057\n120995,4771\n120996,1132\n120997,781\n120999,1707\n121000,760\n121001,118336\n121003,298\n121004,485\n121005,14797\n121006,14797\n121008,14797\n121009,14797\n121010,4771\n121011,14797\n121012,1707\n121014,415\n121014,717\n121014,2646\n121015,994\n121016,298\n121017,485\n121018,298\n121019,485\n121020,355\n121021,422\n121022,107\n121022,4771\n121023,72\n121024,516\n121024,1220\n121024,1222\n121025,121026\n121029,1977\n121029,1978\n121030,63\n121031,121032\n121033,104\n121033,134\n121033,227\n121033,240\n121033,248\n121033,264\n121033,289\n121033,290\n121033,298\n121033,503\n121033,631\n121033,636\n121033,714\n121033,1119\n121033,1282\n121033,1392\n121033,1462\n121033,1955\n121033,2205\n121033,2209\n121033,8180\n121033,8537\n121033,33424\n121033,94134\n121034,850\n121035,388\n121036,30\n121038,298\n121039,485\n121040,1634\n121041,932\n121042,875\n121043,349\n121043,1769\n121044,2367\n121045,626\n121046,264\n121046,835\n121047,9560\n121048,589\n121049,1293\n121050,693\n121051,2744\n121052,264\n121052,1381\n121053,298\n121054,485\n121055,647\n121056,344\n121057,557\n121058,422\n121059,56\n121060,660\n121060,868\n121060,949\n121061,121062\n121063,647\n121064,344\n121065,875\n121066,3623\n121068,90845\n121069,344\n121070,647\n121071,647\n121072,344\n121073,893\n121075,433\n121075,1888\n121076,104\n121077,121078\n121079,302\n121080,872\n121080,1151\n121080,1836\n121080,127158\n121081,557\n121082,273\n121083,5405\n121084,392\n121085,209\n121085,302\n121085,861\n121087,121088\n121090,417\n121090,1085\n121091,49887\n121092,1388\n121093,366\n121095,202\n121095,203\n121095,32475\n121096,1132\n121097,781\n121098,147\n121098,158\n121098,184\n121098,779\n121098,1458\n121098,118336\n121099,1858\n121100,1860\n121101,19010\n121102,19443\n121103,72\n121104,5405\n121106,1359\n121107,852\n121109,10\n121109,4220\n121109,178576\n121110,192\n121110,336\n121110,422\n121110,602\n121110,1619\n121110,1623\n121110,4272\n121112,121113\n121114,121115\n121117,301\n121117,1782\n121118,602\n121121,251\n121122,422\n121123,56\n121124,206\n121125,107\n121126,215\n121127,1882\n121128,323\n121129,3507\n121130,301\n121132,536\n121132,557\n121133,14797\n121134,1220\n121134,1222\n121135,252\n121136,251\n121137,72\n121139,14797\n121140,14797\n121142,1220\n121142,1222\n121143,252\n121144,251\n121145,389\n121146,577\n121147,518\n121147,1298\n121148,6955\n121149,536\n121150,55849\n121151,121152\n121153,55849\n121154,1466\n121155,516\n121156,104\n121157,121158\n121159,79\n121160,536\n121160,657\n121161,217\n121161,1417\n121162,1010\n121163,301\n121163,968\n121163,1782\n121164,158\n121165,422\n121166,56\n121167,861\n121168,298\n121169,485\n121170,121171\n121172,4895\n121173,175\n121174,298\n121175,422\n121176,56\n121177,6506\n121179,222\n121180,34\n121180,35\n121181,3422\n121182,1181\n121183,483\n121184,13361\n121185,1893\n121185,3474\n121186,509\n121187,107\n121188,358\n121189,1556\n121190,83\n121191,4771\n121192,2367\n121193,687\n121194,779\n121195,406\n121196,158\n121197,278\n121197,455\n121198,516\n121199,2828\n121200,302\n121200,861\n121200,893\n121201,1096\n121202,302\n121203,14797\n121204,704\n121205,1010\n121206,557\n121208,2506\n121209,818\n121211,4771\n121212,358\n121213,217\n121213,467\n121213,592\n121214,121215\n121216,779\n121217,557\n121218,557\n121219,1001\n121220,121221\n121222,3804\n121223,307\n121223,3846\n121224,452\n121224,2991\n121225,991\n121227,72\n121228,861\n121229,121230\n121231,217\n121231,240\n121231,592\n121231,1001\n121231,1818\n121232,72\n121233,298\n121234,485\n121236,121237\n121238,4222\n121238,87415\n121240,121241\n121242,430\n121242,994\n121242,3816\n121242,3817\n121243,30\n121244,328\n121245,30\n121246,215\n121248,8854\n121249,121250\n121251,121252\n121254,72\n121255,79\n121256,422\n121257,56\n121258,298\n121259,485\n121260,2116\n121261,72\n121262,206\n121263,1381\n121264,4691\n121265,248\n121265,2156\n121266,647\n121267,344\n121268,175\n121269,298\n121270,72\n121271,424\n121272,1927\n121273,72\n121274,1531\n121275,30\n121276,577\n121277,592\n121278,118192\n121279,121280\n121281,422\n121282,56\n121283,2146\n121284,72\n121285,121286\n121287,4545\n121287,139010\n121288,920\n121289,206\n121290,104\n121291,5366\n121292,2719\n121292,2868\n121293,72\n121294,79\n121295,72\n121297,83\n121298,72\n121299,121300\n121299,129654\n121301,94\n121301,2787\n121302,4545\n121304,8270\n121305,83\n121306,192\n121308,72\n121309,1566\n121310,422\n121311,56\n121312,872\n121313,1429\n121314,121315\n121316,121317\n121318,72\n121319,121320\n121321,60576\n121322,298\n121323,485\n121324,302\n121325,83\n121325,209\n121325,3507\n121325,55849\n121325,60576\n121326,72\n121327,1147\n121328,668\n121329,2135\n121330,72\n121331,72\n121332,1132\n121333,781\n121334,19356\n121334,19443\n121335,147\n121336,233\n121337,1515\n121338,121339\n121340,72\n121341,366\n121342,366\n121343,726\n121344,140\n121344,264\n121344,809\n121345,121346\n121347,355\n121348,652\n121349,338\n121349,462\n121349,473\n121349,491\n121349,1058\n121349,1238\n121349,2367\n121349,2626\n121349,4039\n121349,8149\n121350,422\n121351,72\n121352,4611\n121353,1544\n121354,71\n121354,2512\n121354,123847\n121355,1860\n121356,1241\n121357,4611\n121358,1544\n121359,452\n121359,457\n121359,535\n121359,676\n121359,918\n121359,1655\n121360,795\n121361,50\n121362,376\n121363,861\n121364,22\n121365,435\n121366,518\n121367,631\n121368,4611\n121369,1544\n121371,455\n121372,1282\n121374,1858\n121375,1860\n121376,2334\n121377,567\n121378,1212\n121379,660\n121380,333\n121381,818\n121381,1801\n121381,2319\n121381,2991\n121381,3182\n121381,6424\n121382,2209\n121383,20\n121383,3507\n121384,467\n121384,868\n121385,690\n121387,647\n121388,344\n121389,640\n121390,525\n121391,30428\n121392,1068\n121393,30\n121394,1143\n121395,1085\n121396,18831\n121397,259\n121398,422\n121399,422\n121400,422\n121401,422\n121402,422\n121403,422\n121404,422\n121405,422\n121406,422\n121407,422\n121408,422\n121409,392\n121410,452\n121411,1247\n121412,68069\n121413,184\n121414,121415\n121416,808\n121417,149\n121417,406\n121418,3474\n121420,269\n121421,1659\n121423,207\n121424,81\n121425,1284\n121426,4611\n121427,1544\n121428,298\n121429,485\n121430,4611\n121431,1544\n121434,455\n121435,422\n121436,4545\n121436,56150\n121436,139010\n121437,671\n121437,1177\n121437,182162\n121438,2671\n121439,1381\n121441,146\n121441,92476\n121442,195\n121442,27217\n121447,30\n121448,1860\n121450,83\n121451,388\n121452,30\n121454,30\n121455,1844\n121456,58\n121457,994\n121458,46\n121459,75912\n121460,30\n121461,3585\n121462,1858\n121463,1860\n121464,433\n121465,1072\n121466,872\n121467,121468\n121469,1663\n121470,875\n121471,1010\n121472,81\n121473,968\n121473,1240\n121474,652\n121474,1893\n121475,455\n121476,693\n121476,1608\n121477,392\n121478,30\n121479,121480\n121481,269\n121483,623\n121484,972\n121485,298\n121486,72\n121487,344\n121488,285\n121490,575\n121491,30\n121492,30\n121493,673\n121494,1181\n121496,2312\n121497,1803\n121497,5213\n121498,34\n121498,35\n121499,298\n121500,485\n121501,41\n121501,158\n121501,160\n121501,15573\n121502,2296\n121503,2334\n121504,72\n121505,392\n121505,433\n121505,435\n121505,849\n121505,919\n121505,934\n121505,1607\n121505,1805\n121506,269\n121507,1220\n121507,1222\n121508,252\n121509,251\n121510,72\n121512,1983\n121513,1983\n121514,121515\n121516,1436\n121517,30\n121517,200\n121517,772\n121517,99807\n121518,1381\n121519,1782\n121520,121521\n121522,175\n121523,298\n121524,240\n121525,408\n121526,1323\n121527,102\n121528,1326\n121530,634\n121531,760\n121532,3695\n121533,417\n121534,66\n121535,1\n121536,1247\n121537,1509\n121538,2617\n121539,602\n121540,7155\n121542,1012\n121543,801\n121544,7155\n121545,907\n121546,184\n121547,422\n121548,56\n121549,298\n121550,485\n121551,1132\n121552,781\n121553,30331\n121554,1241\n121555,1722\n121556,760\n121557,467\n121558,907\n121560,1858\n121561,1860\n121562,2572\n121563,1551\n121563,3999\n121564,121565\n121566,644\n121567,298\n121568,485\n121569,222\n121570,1381\n121571,647\n121572,344\n121574,1849\n121575,184\n121576,2116\n121576,19010\n121577,178\n121579,515\n121580,1983\n121581,121582\n121583,158\n121584,1509\n121584,1551\n121585,323\n121586,72\n121587,149\n121587,406\n121588,1363\n121589,32\n121590,298\n121591,485\n121592,392\n121593,2699\n121594,79\n121594,251\n121594,3585\n121595,298\n121596,485\n121597,932\n121598,433\n121599,222\n121600,1119\n121600,1462\n121601,743\n121602,30\n121603,1983\n121604,1983\n121605,30\n121607,72\n121608,264\n121609,457\n121610,435\n121611,3\n121612,1140\n121613,406\n121614,121614\n121615,1326\n121616,215\n121616,714\n121616,1282\n121616,111142\n121616,176782\n121617,1449\n121618,30\n121619,217\n121619,1417\n121621,247\n121622,30\n121623,455\n121623,1019\n121625,200\n121626,175\n121627,30\n121628,298\n121629,1052\n121629,1127\n121629,1893\n121629,2626\n121629,49057\n121630,30\n121631,72\n121632,65\n121632,868\n121632,31896\n121633,647\n121634,344\n121636,1474\n121637,30\n121638,30\n121639,72\n121640,557\n121642,34\n121642,35\n121643,121644\n121645,636\n121646,222\n121646,1881\n121647,1240\n121648,30\n121649,1745\n121650,135\n121651,44\n121652,875\n121654,304\n121655,135\n121656,217\n121657,1068\n121658,1509\n121659,298\n121660,485\n121661,192\n121661,309\n121661,310\n121661,13910\n121663,252\n121663,1220\n121663,1222\n121664,240\n121664,1955\n121665,135\n121666,55849\n121667,30\n121668,647\n121669,344\n121670,872\n121671,72\n121672,30\n121673,30\n121674,30\n121675,41\n121676,422\n121677,56\n121679,147\n121679,158\n121680,72\n121681,1132\n121682,781\n121683,406\n121684,304\n121685,483\n121686,30\n121687,63\n121688,30\n121690,30\n121691,30\n121693,1359\n121694,269\n121695,136\n121695,137\n121696,885\n121696,13704\n121697,1467\n121698,417\n121698,862\n121698,1119\n121698,2184\n121698,3094\n121698,13828\n121698,16077\n121698,18425\n121698,19944\n121698,75912\n121698,121090\n121699,206\n121700,1556\n121701,83\n121702,8213\n121703,30\n121704,2782\n121705,206\n121706,850\n121707,503\n121708,140\n121709,267\n121710,30\n121711,1265\n121711,1266\n121712,3960\n121713,1326\n121714,195\n121715,4895\n121716,79\n121717,22\n121717,292\n121717,337\n121717,1844\n121717,75912\n121718,151\n121718,577\n121718,1400\n121718,2073\n121719,30\n121720,10\n121721,707\n121722,5405\n121723,10\n121724,222\n121725,30\n121726,30\n121727,13919\n121728,30\n121729,788\n121730,1608\n121731,118\n121731,4597\n121732,30\n121733,433\n121734,1132\n121735,781\n121736,30\n121737,171\n121738,2797\n121739,171\n121740,121741\n121742,516\n121743,557\n121744,55849\n121745,121746\n121747,158\n121748,557\n121749,372\n121750,104\n121751,217\n121751,536\n121753,10\n121754,333\n121755,392\n121756,175\n121757,298\n121758,160\n121758,515\n121759,209\n121759,3695\n121759,4691\n121761,589\n121761,775\n121761,843\n121761,1001\n121762,121763\n121764,135\n121765,121766\n121765,170185\n121765,220065\n121768,1\n121769,1531\n121770,30\n121771,121772\n121773,121774\n121775,1\n121777,714\n121778,631\n121779,121780\n121781,251\n121782,121783\n121784,424\n121785,422\n121786,422\n121787,422\n121788,422\n121789,422\n121790,422\n121791,422\n121792,422\n121793,422\n121794,2373\n121795,422\n121796,422\n121797,422\n121798,422\n121799,240\n121800,121801\n121802,30\n121803,1265\n121803,1266\n121804,121805\n121806,1821\n121808,30\n121809,1309\n121810,121811\n121812,121813\n121815,121816\n121818,175\n121820,298\n121821,1818\n121822,222\n121824,4545\n121824,139010\n121825,994\n121826,17245\n121827,121828\n121829,626\n121830,240\n121831,171\n121832,121833\n121835,2244\n121836,11147\n121837,932\n121838,20813\n121840,121841\n121842,121843\n121844,872\n121845,280\n121845,17245\n121846,462\n121847,72\n121848,121849\n121850,1849\n121851,200\n121853,269\n121854,121855\n121856,310\n121857,557\n121858,1368\n121859,1238\n121860,581\n121861,1782\n121862,392\n121863,46\n121863,589\n121863,596\n121863,75912\n121863,178576\n121863,185874\n121864,859\n121865,1452\n121866,121867\n121868,121869\n121870,298\n121871,485\n121872,121873\n121874,121875\n121876,121877\n121879,121880\n121881,872\n121882,720\n121883,72\n121884,121885\n121886,75912\n121887,310\n121888,104\n121889,872\n121890,1983\n121891,158\n121892,34\n121892,35\n121892,406\n121892,657\n121893,1172\n121894,104\n121896,1707\n121898,104643\n121901,298\n121902,485\n121903,186\n121903,1707\n121904,2979\n121905,298\n121906,485\n121907,200\n121908,298\n121909,485\n121910,1370\n121910,1385\n121911,7652\n121913,264\n121914,298\n121915,485\n121917,355\n121918,972\n121919,41\n121919,671\n121922,356\n121923,2989\n121923,2991\n121924,527\n121925,298\n121926,485\n121927,178\n121929,1368\n121930,151\n121930,497\n121931,1326\n121932,2979\n121934,298\n121935,485\n121936,433\n121937,298\n121938,485\n121939,79\n121941,298\n121942,485\n121943,302\n121944,298\n121945,485\n121946,298\n121947,485\n121948,4545\n121949,2979\n121952,298\n121953,485\n121954,146\n121954,567\n121954,1634\n121954,92476\n121955,158\n121957,215\n121957,16755\n121958,30\n121959,3474\n121959,19010\n121961,861\n121962,22\n121963,615\n121964,298\n121965,485\n121966,121967\n121968,1293\n121970,121970\n121971,379\n121971,1274\n121971,1353\n121972,298\n121973,485\n121974,298\n121975,485\n121976,2574\n121977,147\n121977,149\n121978,1293\n121979,657\n121980,121981\n121982,10\n121983,114217\n121984,114217\n121985,1007\n121985,1509\n121985,1551\n121985,3999\n121986,192\n121987,4611\n121988,1544\n121989,6955\n121990,298\n121991,485\n121992,22\n121993,861\n121995,298\n121996,485\n121997,200\n121998,5405\n121999,1556\n122000,1381\n122001,298\n122002,485\n122004,4611\n122005,1544\n122006,2979\n122007,1590\n122008,287\n122008,314\n122009,1509\n122010,4545\n122010,139010\n122011,175\n122012,298\n122013,1149\n122014,4545\n122014,56150\n122014,139010\n122016,269\n122018,1085\n122019,298\n122020,485\n122021,122022\n122023,122024\n122025,298\n122026,485\n122027,298\n122028,485\n122029,919\n122030,83\n122032,149\n122032,406\n122032,1776\n122033,298\n122034,485\n122035,536\n122036,71\n122038,3260\n122039,818\n122040,1181\n122041,515\n122042,111\n122042,1151\n122042,1572\n122043,81\n122044,298\n122045,485\n122046,175\n122047,3003\n122048,298\n122049,106\n122050,934\n122051,240\n122051,5547\n122052,647\n122053,344\n122055,718\n122056,298\n122057,485\n122058,309\n122058,310\n122060,4611\n122061,1544\n122062,393\n122063,97\n122063,2812\n122064,122065\n122066,83\n122067,2146\n122068,718\n122069,4611\n122070,1544\n122071,122072\n122073,4691\n122075,298\n122076,485\n122077,298\n122078,285\n122079,30\n122081,254\n122082,287\n122083,30\n122084,30\n122085,893\n122087,439\n122088,298\n122089,485\n122090,509\n122090,150022\n122091,663\n122091,685\n122091,1058\n122091,1220\n122091,1222\n122091,5192\n122091,5540\n122092,22\n122093,81\n122094,200\n122094,299\n122094,515\n122094,2674\n122094,2779\n122094,28130\n122094,30331\n122094,142433\n122095,408\n122096,1323\n122097,102\n122098,1326\n122099,515\n122100,30\n122101,577\n122102,6323\n122103,83\n122104,195\n122105,920\n122107,4545\n122108,122109\n122110,1590\n122110,1644\n122111,843\n122112,4611\n122113,1544\n122114,30\n122115,217\n122116,349\n122116,2784\n122117,1590\n122118,920\n122120,240\n122121,1181\n122122,4545\n122122,56150\n122122,139010\n122123,1149\n122124,586\n122125,206\n122126,433\n122127,536\n122127,1881\n122128,79\n122130,344\n122130,2646\n122130,3209\n122131,1359\n122132,968\n122132,1293\n122133,1374\n122134,50\n122135,192\n122135,309\n122135,310\n122135,13910\n122136,255\n122136,4701\n122136,6895\n122136,9689\n122136,13445\n122136,24916\n122136,34524\n122136,93134\n122136,119416\n122136,120907\n122136,121951\n122136,122136\n122136,122207\n122136,122425\n122136,123355\n122136,123396\n122136,123397\n122136,126053\n122136,126589\n122136,128472\n122136,128965\n122136,129101\n122136,130197\n122136,130519\n122136,130761\n122136,130840\n122136,131532\n122136,131860\n122136,131861\n122136,131944\n122136,132068\n122136,133020\n122136,134909\n122136,134958\n122136,134967\n122136,134968\n122136,145207\n122136,146030\n122136,146413\n122138,994\n122139,1143\n122139,1836\n122140,248\n122140,5405\n122141,328\n122141,1608\n122142,1181\n122143,515\n122144,23701\n122145,79\n122145,1052\n122146,122147\n122148,859\n122149,1235\n122149,1335\n122150,346\n122151,310\n122152,310\n122153,1181\n122155,122156\n122157,328\n122158,30\n122159,106\n122159,1231\n122159,2083\n122159,5662\n122160,283\n122160,626\n122161,649\n122162,30\n122164,1893\n122165,1033\n122167,1220\n122167,1222\n122168,252\n122169,251\n122171,2784\n122172,1085\n122174,726\n122176,557\n122177,2205\n122177,33424\n122177,245910\n122179,264\n122180,422\n122181,56\n122183,72\n122184,3623\n122185,579\n122185,2116\n122186,30\n122187,3623\n122188,175\n122189,462\n122189,8149\n122190,298\n122191,30\n122193,44\n122194,1010\n122195,389\n122196,355\n122197,516\n122197,1512\n122199,30\n122200,392\n122200,697\n122200,1240\n122200,1454\n122200,1465\n122200,3260\n122200,15523\n122201,2371\n122202,134\n122202,203\n122203,1010\n122204,122205\n122206,440\n122208,3623\n122209,483\n122210,4545\n122210,56150\n122210,139010\n122211,417\n122213,30\n122214,3623\n122215,980\n122216,450\n122217,406\n122218,122219\n122220,140\n122221,30\n122222,358\n122223,406\n122224,1551\n122225,1033\n122226,3\n122226,372\n122226,390\n122226,968\n122226,8992\n122227,30\n122228,122229\n122231,885\n122231,13704\n122233,333\n122234,3623\n122235,122236\n122237,122238\n122239,289\n122239,290\n122239,94134\n122240,122241\n122242,557\n122243,5906\n122244,557\n122245,626\n122246,278\n122247,137\n122248,862\n122249,255\n122250,557\n122251,30\n122252,122253\n122255,19\n122256,30\n122257,147\n122258,920\n122259,1531\n122260,346\n122261,147\n122262,147\n122263,147\n122264,30\n122265,1043\n122266,440\n122267,4771\n122268,872\n122269,2929\n122270,393\n122271,433\n122273,122274\n122273,147206\n122276,3623\n122277,500\n122278,1962\n122279,1052\n122280,1882\n122281,2775\n122282,54\n122283,289\n122283,290\n122283,94134\n122284,89035\n122285,2146\n122285,2574\n122286,122287\n122288,422\n122289,660\n122290,30\n122291,175\n122292,392\n122293,122294\n122295,298\n122296,298\n122297,485\n122298,30\n122300,122301\n122302,298\n122303,485\n122304,931\n122305,122306\n122307,634\n122307,994\n122308,122309\n122310,1001\n122312,72\n122313,344\n122314,285\n122315,1113\n122316,122317\n122318,211\n122319,30\n122320,10\n122320,2574\n122321,122322\n122323,30\n122324,195\n122325,4\n122325,5\n122326,2775\n122327,447\n122328,72\n122329,122330\n122329,152723\n122331,636\n122332,310\n122333,1001\n122333,1326\n122333,3193\n122333,3804\n122333,14797\n122334,240\n122335,644\n122335,122336\n122338,83\n122339,255\n122340,122341\n122342,122343\n122344,54\n122345,872\n122347,636\n122348,298\n122349,485\n122350,122351\n122353,10\n122354,657\n122355,171\n122356,636\n122357,304\n122358,122359\n122360,122361\n122362,217\n122363,779\n122363,141912\n122365,4611\n122366,1544\n122368,122369\n122370,425\n122371,1722\n122372,366\n122373,704\n122374,366\n122377,366\n122378,122379\n122380,305\n122381,366\n122382,366\n122383,72\n122384,779\n122385,30\n122386,310\n122387,872\n122388,122389\n122391,481\n122392,292\n122394,83\n122395,941\n122396,289\n122396,290\n122396,3003\n122396,94134\n122397,83\n122399,827\n122400,859\n122401,122402\n122403,718\n122404,1370\n122405,355\n122407,314\n122407,779\n122407,141912\n122412,2353\n122416,2353\n122417,2353\n122418,175\n122419,1240\n122420,298\n122421,2089\n122421,2940\n122423,779\n122424,2353\n122426,602\n122427,2315\n122428,151\n122429,192\n122429,663\n122430,779\n122430,141912\n122432,264\n122433,697\n122434,175\n122435,298\n122436,2353\n122437,779\n122438,503\n122439,211\n122439,314\n122439,599\n122439,775\n122439,784\n122439,1001\n122439,3094\n122440,355\n122440,760\n122442,1707\n122443,3653\n122444,122445\n122446,122447\n122448,372\n122449,25573\n122450,1619\n122451,167\n122451,261\n122451,301\n122451,333\n122451,444\n122451,592\n122451,615\n122451,919\n122451,968\n122451,1133\n122451,2205\n122451,2557\n122451,3422\n122451,5662\n122451,33424\n122453,1474\n122454,783\n122455,1509\n122456,1172\n122458,2775\n122459,447\n122460,147\n122461,3623\n122462,2979\n122463,422\n122464,422\n122465,422\n122466,2574\n122467,422\n122468,422\n122469,422\n122470,1133\n122471,422\n122472,1479\n122473,2411\n122474,264\n122475,356\n122476,422\n122477,422\n122478,685\n122478,26450\n122479,422\n122480,422\n122481,72\n122482,30\n122483,106\n122484,1773\n122485,843\n122486,4571\n122487,718\n122488,1368\n122489,146\n122489,779\n122489,141912\n122490,1220\n122490,1222\n122491,252\n122492,251\n122493,83\n122496,83\n122497,83\n122497,5591\n122498,79\n122499,652\n122500,1240\n122501,843\n122502,158\n122503,660\n122504,30\n122505,49887\n122506,328\n122506,372\n122506,2812\n122506,4222\n122507,861\n122508,160\n122508,1381\n122510,718\n122512,388\n122513,175\n122514,298\n122515,1634\n122516,240\n122516,592\n122516,1818\n122517,697\n122517,2626\n122517,3260\n122518,1556\n122520,1240\n122520,1465\n122521,697\n122522,1220\n122522,1222\n122523,252\n122524,251\n122525,818\n122526,79\n122527,30\n122528,685\n122529,1146\n122529,13136\n122530,23287\n122530,200543\n122531,1860\n122532,1181\n122532,30331\n122533,1289\n122533,1968\n122534,349\n122535,30\n122536,72\n122537,875\n122538,1147\n122539,1454\n122540,2929\n122541,30\n122542,596\n122543,527\n122544,147\n122545,809\n122546,647\n122547,344\n122548,433\n122549,122550\n122551,72\n122552,2017\n122552,2626\n122552,17309\n122554,30\n122555,122556\n122559,30\n122560,4691\n122562,304\n122562,1068\n122562,1294\n122564,647\n122565,344\n122567,254\n122568,207\n122569,1240\n122569,1345\n122570,30\n122571,596\n122572,240\n122573,87\n122573,140\n122573,323\n122573,392\n122573,510\n122573,1151\n122573,1453\n122573,1572\n122573,1722\n122573,2697\n122574,809\n122575,1001\n122576,1220\n122576,1222\n122577,252\n122578,251\n122579,30\n122580,1849\n122581,130\n122582,1147\n122583,122584\n122585,985\n122586,392\n122586,1151\n122587,41\n122587,217\n122588,811\n122589,298\n122590,485\n122592,1220\n122592,1222\n122593,252\n122594,251\n122595,1858\n122596,1860\n122597,122598\n122599,30\n122600,273\n122601,30\n122602,1608\n122603,3474\n122604,2373\n122605,34\n122605,35\n122606,805\n122606,81233\n122609,313\n122610,122611\n122612,1220\n122612,1222\n122613,252\n122614,811\n122615,251\n122616,83\n122616,1240\n122617,1220\n122617,1222\n122618,252\n122619,251\n122621,217\n122621,714\n122621,1282\n122621,9005\n122623,126\n122624,326\n122626,349\n122627,298\n122628,485\n122629,907\n122630,122631\n122632,72\n122633,1220\n122633,1222\n122634,252\n122635,251\n122637,1844\n122638,72\n122639,1381\n122640,83\n122641,433\n122642,122643\n122644,296\n122645,3623\n122646,527\n122647,850\n122648,175\n122649,298\n122650,818\n122651,17309\n122652,2867\n122652,2868\n122653,122654\n122653,141243\n122655,440\n122656,126\n122657,440\n122657,1033\n122658,122659\n122661,663\n122662,7092\n122663,273\n122664,252\n122665,46\n122666,10\n122667,240\n122667,611\n122668,46\n122668,48\n122668,56\n122668,130\n122668,138\n122668,278\n122668,304\n122668,444\n122668,459\n122668,575\n122668,660\n122668,726\n122668,744\n122668,749\n122668,795\n122668,859\n122668,996\n122668,1117\n122668,1122\n122668,1274\n122668,1644\n122668,2315\n122668,2424\n122668,2646\n122668,2944\n122668,3115\n122668,3623\n122668,4220\n122668,7768\n122668,13137\n122668,76096\n122669,1052\n122670,652\n122671,356\n122671,852\n122671,1722\n122672,1634\n122673,1858\n122674,1860\n122675,435\n122675,440\n122676,872\n122677,4611\n122680,3623\n122681,298\n122682,485\n122683,32\n122684,63\n122684,489\n122684,1623\n122685,1220\n122685,1222\n122686,252\n122687,251\n122688,338\n122689,399\n122690,1522\n122691,1888\n122692,795\n122692,96471\n122693,3623\n122694,310\n122695,1010\n122696,298\n122697,485\n122699,393\n122700,920\n122701,406\n122702,99\n122702,779\n122702,141912\n122703,122704\n122705,65\n122705,586\n122706,30\n122707,652\n122708,83\n122709,557\n122710,9121\n122713,142433\n122714,4771\n122716,30\n122717,358\n122718,389\n122719,949\n122720,30\n122721,22\n122722,10\n122723,122724\n122726,596\n122727,557\n122728,557\n122729,704\n122730,862\n122731,122732\n122733,557\n122734,122732\n122735,2083\n122736,122737\n122738,122739\n122740,483\n122741,72\n122742,72\n122743,344\n122744,285\n122745,3246\n122746,1235\n122746,1335\n122747,861\n122748,22\n122751,1556\n122752,994\n122753,23783\n122755,122756\n122757,30\n122758,1844\n122759,122760\n122761,949\n122762,994\n122763,72\n122764,122765\n122766,893\n122767,872\n122769,206\n122770,873\n122771,200\n122772,30\n122773,255\n122774,175\n122775,298\n122776,122777\n122778,920\n122779,122780\n122781,122782\n122783,55849\n122784,184\n122785,10\n122786,577\n122787,7270\n122788,1608\n122789,485\n122790,1235\n122790,1335\n122791,647\n122792,122793\n122794,1227\n122794,86416\n122795,431\n122795,631\n122795,760\n122795,784\n122796,2572\n122797,46\n122797,387\n122798,602\n122799,366\n122800,366\n122801,366\n122802,4545\n122803,366\n122804,323\n122806,440\n122807,3367\n122808,805\n122809,2590\n122810,72\n122811,4545\n122812,122813\n122815,31977\n122816,704\n122818,207\n122819,72\n122821,122822\n122824,72\n122825,4545\n122825,139010\n122827,34\n122827,35\n122828,872\n122829,1429\n122830,255\n122831,3695\n122833,668\n122835,30\n122836,122837\n122839,122840\n122841,122842\n122843,72\n122844,872\n122845,602\n122847,72\n122848,4771\n122849,122850\n122851,72\n122852,122853\n122854,298\n122855,485\n122856,72\n122857,1143\n122858,872\n122859,240\n122861,366\n122863,122864\n122865,233\n122866,287\n122867,298\n122868,485\n122869,1238\n122870,1293\n122871,122872\n122871,130717\n122873,122874\n122875,1058\n122876,1707\n122877,79\n122877,489\n122878,149\n122878,406\n122879,2168\n122881,626\n122882,861\n122883,22\n122884,298\n122885,485\n122886,160\n122887,122888\n122889,1452\n122890,440\n122891,4545\n122891,56150\n122892,83\n122893,704\n122894,779\n122895,557\n122896,1556\n122897,2775\n122898,447\n122899,22\n122900,861\n122901,2353\n122902,1220\n122902,1222\n122903,252\n122904,251\n122905,685\n122905,1619\n122905,193129\n122906,171\n122907,861\n122908,22\n122909,83\n122910,55849\n122911,252\n122912,83\n122913,859\n122915,3474\n122917,72\n122918,422\n122919,422\n122920,422\n122921,120\n122921,240\n122921,332\n122921,372\n122921,818\n122921,1082\n122921,1807\n122922,422\n122923,422\n122924,422\n122925,422\n122926,422\n122927,422\n122928,392\n122929,422\n122930,422\n122931,422\n122932,422\n122933,422\n122935,783\n122936,872\n122937,7757\n122938,652\n122940,1370\n122941,56\n122941,313\n122941,733\n122941,775\n122941,1313\n122941,1623\n122941,4545\n122943,1631\n122945,215\n122946,122947\n122948,298\n122949,485\n122950,1858\n122951,1860\n122952,7092\n122953,783\n122954,346\n122955,2572\n122957,647\n122958,344\n122959,323\n122959,358\n122959,388\n122959,623\n122959,694\n122959,1072\n122959,1465\n122959,1927\n122959,3135\n122959,4549\n122959,14126\n122960,23783\n122961,122962\n122963,2775\n122964,447\n122965,111\n122966,4611\n122967,1544\n122968,980\n122969,1188\n122970,660\n122971,861\n122972,22\n122976,779\n122977,3653\n122978,4\n122978,5\n122978,355\n122979,158\n122981,160\n122983,158\n122985,298\n122986,485\n122987,500\n122988,875\n122989,1235\n122989,1335\n122990,254\n122991,862\n122992,1285\n122992,84257\n122994,122995\n122996,500\n122997,1962\n122998,1052\n122999,1882\n123000,264\n123001,2775\n123002,54\n123003,349\n123003,3260\n123004,636\n123005,861\n123006,22\n123007,120\n123007,332\n123007,372\n123007,818\n123007,1082\n123007,1807\n123008,298\n123009,485\n123010,264\n123011,2867\n123011,2868\n123012,175\n123013,1309\n123014,298\n123015,298\n123016,485\n123017,779\n123017,141912\n123018,346\n123019,2775\n123020,447\n123022,7092\n123023,442\n123023,1140\n123024,1243\n123025,192\n123025,406\n123026,920\n123028,8308\n123029,346\n123030,422\n123031,3585\n123032,1116\n123033,123034\n123036,422\n123038,1220\n123038,1222\n123039,252\n123040,251\n123041,538\n123041,1010\n123042,83\n123043,6303\n123044,968\n123045,3507\n123046,346\n123047,4545\n123047,56150\n123047,139010\n123049,240\n123050,2590\n123051,97\n123052,123053\n123054,123055\n123056,310\n123057,1419\n123057,3115\n123058,4611\n123059,1544\n123060,211\n123061,1531\n123061,4545\n123062,1289\n123063,1858\n123064,1860\n123065,422\n123066,422\n123067,1634\n123069,123070\n123071,1858\n123072,1860\n123073,422\n123074,467\n123074,868\n123074,156379\n123074,162599\n123075,346\n123076,2045\n123078,123079\n123081,123082\n123083,123079\n123084,79\n123084,422\n123086,422\n123087,79\n123087,3804\n123089,160\n123090,346\n123091,206\n123092,485\n123093,123094\n123095,298\n123096,485\n123097,968\n123098,298\n123099,485\n123100,207\n123101,37\n123102,30\n123102,200\n123102,772\n123104,222\n123106,123107\n123108,22\n123110,440\n123111,304\n123112,602\n123113,309\n123113,310\n123114,134\n123115,3623\n123116,862\n123117,875\n123118,392\n123118,1860\n123119,175\n123120,298\n123122,68069\n123123,72\n123124,1531\n123125,123126\n123127,30\n123129,222\n123131,2784\n123132,557\n123133,934\n123134,298\n123135,485\n123136,1133\n123137,1\n123138,10\n123139,440\n123140,5405\n123141,623\n123142,346\n123143,640\n123145,3695\n123146,30\n123149,467\n123150,932\n123151,206\n123152,392\n123153,1983\n123154,5405\n123155,356\n123156,994\n123157,123158\n123159,264\n123160,704\n123161,1203\n123163,440\n123164,312\n123165,515\n123165,1033\n123166,298\n123167,485\n123168,301\n123168,1298\n123169,440\n123170,1284\n123171,647\n123172,344\n123174,2048\n123175,2156\n123176,1001\n123177,140\n123177,586\n123178,920\n123179,175\n123180,72\n123181,344\n123182,285\n123183,697\n123184,298\n123185,104\n123186,312\n123186,338\n123187,440\n123189,10\n123190,55849\n123192,920\n123193,920\n123194,273\n123195,147\n123196,147\n123197,3623\n123198,147\n123199,147\n123201,111\n123201,3538\n123202,920\n123203,10\n123204,1151\n123205,22\n123205,809\n123205,861\n123205,2017\n123205,17309\n123206,4545\n123207,206\n123208,87\n123209,9030\n123210,211\n123211,809\n123212,1132\n123213,781\n123214,123215\n123214,123740\n123214,129390\n123214,129763\n123214,130300\n123216,406\n123218,10\n123218,113156\n123219,123220\n123221,346\n123222,30\n123224,30\n123225,557\n123226,557\n123227,123228\n123229,557\n123230,30\n123231,8719\n123232,138\n123233,865\n123234,557\n123235,137\n123236,118\n123236,4597\n123237,88820\n123238,86\n123238,167\n123238,240\n123238,301\n123238,567\n123238,605\n123238,615\n123238,631\n123238,720\n123238,907\n123238,968\n123238,972\n123238,973\n123238,1010\n123238,1122\n123238,1124\n123238,1167\n123238,1231\n123238,1241\n123238,1284\n123238,1298\n123238,1436\n123238,1522\n123238,1544\n123238,1564\n123238,1782\n123238,1785\n123238,1818\n123238,1837\n123238,2191\n123238,2372\n123238,2557\n123238,2620\n123238,2979\n123238,3193\n123238,3207\n123238,3218\n123240,994\n123241,994\n123242,123243\n123244,1143\n123245,346\n123247,63\n123247,493\n123248,1012\n123249,440\n123250,222\n123251,55849\n123252,801\n123253,123254\n123255,1140\n123255,5547\n123256,302\n123257,346\n123258,338\n123260,2173\n123261,30\n123262,123263\n123264,123265\n123266,422\n123267,123268\n123269,422\n123270,422\n123271,422\n123272,422\n123273,422\n123274,422\n123275,422\n123276,422\n123277,422\n123278,72\n123279,602\n123280,123281\n123282,779\n123282,123281\n123283,123281\n123284,2775\n123285,447\n123286,516\n123287,379\n123288,123289\n123290,30\n123291,1085\n123292,1465\n123293,30\n123294,72\n123295,175\n123296,298\n123297,338\n123298,123299\n123300,704\n123301,123302\n123303,72\n123305,123306\n123307,72\n123308,123309\n123310,602\n123311,72\n123312,184\n123313,123314\n123315,862\n123316,123317\n123318,123319\n123320,1\n123321,72\n123322,123323\n123324,123325\n123326,72\n123327,72\n123328,123329\n123330,72\n123331,72\n123332,255\n123333,72\n123334,1860\n123335,310\n123336,72\n123337,233\n123338,8884\n123339,81\n123341,1085\n123342,366\n123343,366\n123344,366\n123345,366\n123346,123347\n123348,304\n123349,355\n123351,862\n123352,30\n123353,330\n123354,1127\n123354,1368\n123356,862\n123357,117163\n123358,79\n123359,1631\n123360,83\n123361,222\n123362,123363\n123364,206\n123365,123366\n123367,72\n123368,83\n123369,72\n123371,2266\n123372,72\n123373,123374\n123373,226007\n123375,2574\n123377,123377\n123378,704\n123378,1821\n123379,843\n123379,1474\n123380,273\n123381,1522\n123382,406\n123383,123384\n123386,72\n123387,344\n123388,285\n123389,72\n123390,949\n123391,30\n123392,30\n123393,123394\n123398,392\n123399,273\n123400,72\n123401,393\n123402,72\n123403,14434\n123404,206\n123405,302\n123406,1572\n123408,123409\n123410,1623\n123411,3653\n123412,123413\n123414,123415\n123414,256642\n123416,841\n123417,392\n123417,433\n123419,206\n123420,79\n123421,704\n123422,73570\n123422,103860\n123423,72\n123424,1479\n123425,390\n123426,483\n123427,50\n123427,147\n123427,202\n123427,203\n123427,285\n123427,333\n123427,406\n123427,620\n123427,994\n123427,1181\n123427,1515\n123427,2782\n123427,4545\n123428,123429\n123430,1608\n123430,1801\n123432,298\n123433,485\n123434,123435\n123436,1359\n123437,346\n123439,1285\n123440,994\n123441,2744\n123442,49057\n123443,346\n123444,79\n123445,298\n123446,485\n123447,34\n123447,35\n123447,1715\n123448,406\n123449,83\n123451,53763\n123452,346\n123453,920\n123454,875\n123455,123456\n123457,123458\n123459,44\n123460,1181\n123462,17487\n123463,366\n123464,123465\n123466,310\n123467,310\n123468,310\n123469,192\n123469,326\n123469,397\n123469,702\n123469,1211\n123469,2307\n123469,4315\n123469,18383\n123469,49978\n123469,114643\n123469,130241\n123469,143959\n123469,151386\n123470,123471\n123472,72\n123473,7358\n123473,7363\n123474,72\n123476,9025\n123478,83\n123479,123480\n123482,123483\n123484,123485\n123486,158\n123487,123488\n123490,123491\n123492,805\n123493,949\n123495,233\n123496,346\n123497,123498\n123499,123500\n123499,123510\n123499,123559\n123499,124447\n123499,124680\n123499,129469\n123499,131567\n123499,131896\n123499,144405\n123501,123502\n123501,151568\n123503,355\n123505,467\n123506,346\n123507,818\n123508,123509\n123511,1955\n123512,123513\n123514,123515\n123517,1571\n123518,1235\n123518,1335\n123519,123520\n123521,111\n123521,949\n123521,1072\n123522,123523\n123524,72\n123525,344\n123526,285\n123528,123529\n123531,652\n123532,123533\n123534,2526\n123535,304\n123536,123537\n123538,72\n123539,344\n123540,285\n123541,10\n123542,140\n123542,287\n123542,392\n123542,809\n123542,191860\n123543,123544\n123545,123546\n123547,104\n123547,136\n123547,557\n123547,1939\n123548,123549\n123550,72\n123553,273\n123554,1181\n123555,123556\n123557,298\n123558,485\n123560,714\n123561,1179\n123561,1305\n123561,2701\n123562,72\n123563,123564\n123565,72\n123566,123567\n123569,123570\n123571,123572\n123573,123574\n123575,346\n123576,31896\n123577,20813\n123578,932\n123579,1707\n123581,3623\n123582,44\n123583,123584\n123585,123586\n123587,694\n123587,1623\n123588,123589\n123590,1688\n123592,875\n123593,72\n123594,783\n123594,1241\n123594,1294\n123595,123596\n123597,72\n123598,72\n123599,344\n123600,72\n123601,285\n123602,123603\n123604,123605\n123606,389\n123607,389\n123607,1849\n123608,467\n123609,2373\n123610,123610\n123611,422\n123612,56\n123613,2373\n123614,346\n123615,123616\n123617,298\n123618,485\n123619,346\n123620,123621\n123622,500\n123623,788\n123624,123624\n123625,123626\n123627,949\n123628,346\n123629,123630\n123632,55849\n123633,55849\n123634,602\n123635,392\n123636,30\n123637,123638\n123639,19\n123640,123641\n123642,1707\n123643,123644\n123646,8854\n123647,406\n123648,406\n123648,585\n123649,72\n123650,72\n123652,273\n123653,557\n123654,557\n123655,640\n123656,72\n123657,557\n123658,557\n123659,433\n123660,72\n123661,123662\n123663,72\n123664,86\n123664,75912\n123665,123666\n123667,123666\n123668,192\n123670,41\n123670,920\n123670,1881\n123670,4355\n123670,5405\n123670,227669\n123671,72\n123672,123673\n123674,72\n123675,996\n123676,68\n123676,240\n123677,72\n123678,2775\n123679,447\n123680,123681\n123682,72\n123683,30\n123684,298\n123685,485\n123686,72\n123687,344\n123688,285\n123690,1282\n123691,123692\n123693,123694\n123696,875\n123697,72\n123698,344\n123699,285\n123700,123701\n123702,123703\n123704,503\n123705,123706\n123707,123708\n123710,30\n123712,2411\n123713,23011\n123714,483\n123715,195\n123715,123716\n123717,123718\n123720,1265\n123720,1266\n123723,30\n123724,72\n123725,809\n123725,141912\n123726,2807\n123727,602\n123729,4771\n123731,123732\n123733,292\n123734,1285\n123735,294\n123736,296\n123737,298\n123738,72\n123742,123743\n123744,1238\n123745,72\n123746,1452\n123747,72\n123748,233\n123749,123750\n123751,72\n123752,366\n123753,366\n123754,366\n123755,206\n123757,2205\n123757,33424\n123757,245910\n123758,217\n123759,123760\n123761,58\n123762,994\n123763,46\n123764,75912\n123765,298\n123766,485\n123768,920\n123769,72\n123770,355\n123771,671\n123772,147\n123773,775\n123774,184\n123775,72\n123776,872\n123777,72\n123778,41\n123780,211\n123780,193129\n123780,220502\n123781,1983\n123782,516\n123783,298\n123784,485\n123785,240\n123785,968\n123785,1479\n123785,1955\n123785,189303\n123788,602\n123789,171\n123790,171\n123792,1844\n123793,72\n123794,861\n123795,171\n123796,289\n123796,760\n123796,2617\n123796,81070\n123796,94134\n123797,841\n123797,7794\n123797,8867\n123797,14091\n123797,14511\n123797,24835\n123797,25571\n123797,60576\n123797,82819\n123797,87799\n123797,89915\n123797,180487\n123797,182933\n123797,184739\n123797,189839\n123797,190344\n123797,193661\n123797,199529\n123797,201152\n123797,201164\n123797,201277\n123797,203984\n123797,204048\n123797,219855\n123797,219856\n123797,219906\n123797,221744\n123797,225542\n123797,234810\n123797,243622\n123797,250838\n123797,254451\n123798,1014\n123799,171\n123800,1580\n123801,1860\n123802,72\n123803,123804\n123805,657\n123806,123807\n123809,68\n123809,1707\n123811,1070\n123811,2828\n123812,673\n123813,1888\n123814,149\n123814,406\n123814,1425\n123815,72\n123816,298\n123817,485\n123818,1983\n123819,298\n123820,485\n123821,859\n123822,920\n123824,111142\n123825,1580\n123826,5405\n123827,72\n123828,344\n123829,285\n123830,261\n123830,32751\n123831,123832\n123833,30\n123833,440\n123833,622\n123833,1033\n123833,1179\n123835,422\n123836,56\n123837,720\n123837,907\n123838,1580\n123839,72\n123841,422\n123842,422\n123843,56\n123844,811\n123845,2146\n123846,256\n123846,440\n123846,13538\n123847,90845\n123848,1381\n123850,481\n123851,972\n123851,1010\n123852,1631\n123852,6627\n123853,827\n123854,1070\n123855,97\n123856,83\n123858,171\n123859,312\n123861,422\n123862,422\n123863,422\n123864,422\n123865,422\n123866,422\n123867,422\n123868,422\n123869,422\n123870,79\n123871,422\n123872,422\n123873,422\n123874,255\n123875,422\n123876,433\n123876,1590\n123876,7092\n123878,1556\n123879,1566\n123880,195\n123881,123882\n123883,298\n123884,485\n123885,1016\n123885,2209\n123886,94\n123886,430\n123886,2787\n123886,3816\n123886,3817\n123887,79\n123888,298\n123889,485\n123890,106\n123890,149\n123890,158\n123890,406\n123890,1425\n123890,102560\n123891,408\n123895,269\n123896,422\n123897,56\n123898,1359\n123899,134\n123899,2105\n123900,1359\n123901,2205\n123901,33424\n123902,30\n123903,671\n123903,3846\n123904,175\n123905,298\n123906,72\n123907,123908\n123909,298\n123910,485\n123911,392\n123912,440\n123913,217\n123916,2421\n123917,483\n123918,5591\n123919,1151\n123920,195\n123921,2775\n123922,447\n123923,893\n123924,298\n123925,485\n123926,406\n123927,1381\n123928,19010\n123929,298\n123930,485\n123932,1132\n123933,781\n123935,2205\n123935,33424\n123938,72\n123939,344\n123940,285\n123941,985\n123942,79\n123943,1179\n123944,192\n123944,1509\n123945,671\n123946,30\n123947,843\n123948,652\n123949,187\n123950,388\n123951,392\n123952,1282\n123952,2205\n123952,33424\n123953,269\n123954,79\n123955,30\n123957,579\n123958,2867\n123958,2868\n123960,120\n123961,171\n123962,118336\n123963,668\n123964,431\n123964,2784\n123966,1858\n123967,1860\n123968,4691\n123970,202\n123970,843\n123970,1370\n123971,301\n123973,843\n123974,1858\n123975,1860\n123976,30\n123979,932\n123980,843\n123981,861\n123982,22\n123983,422\n123984,56\n123985,920\n123986,640\n123987,30\n123988,3507\n123989,1888\n123990,760\n123991,202\n123991,203\n123992,788\n123993,1127\n123994,872\n123995,58\n123996,994\n123997,46\n123998,75912\n123999,1019\n124000,30\n124001,305\n124002,298\n124003,485\n124004,626\n124005,5405\n124006,30\n124007,718\n124007,891\n124009,66\n124009,920\n124011,344\n124012,261\n124013,1370\n124015,3\n124015,775\n124015,8992\n124016,118336\n124017,968\n124017,1293\n124018,2867\n124018,2868\n124019,2253\n124019,142426\n124020,14989\n124021,160\n124022,248\n124023,2512\n124024,875\n124025,1858\n124026,1860\n124027,536\n124027,2319\n124029,298\n124030,485\n124031,124032\n124033,1370\n124033,21736\n124034,124035\n124036,124037\n124038,875\n124039,124040\n124039,136283\n124041,83\n124043,200\n124044,44\n124046,124047\n124048,175\n124049,298\n124050,2048\n124051,1001\n124052,333\n124052,59021\n124053,124054\n124055,83\n124056,2379\n124057,79\n124058,72\n124059,344\n124060,285\n124063,3260\n124065,30331\n124066,222\n124067,861\n124069,1644\n124070,261\n124070,292\n124070,337\n124070,435\n124070,538\n124070,602\n124070,671\n124070,1293\n124072,440\n124073,124073\n124075,124075\n124076,875\n124077,202\n124077,203\n124078,1707\n124079,30\n124080,30\n124081,30\n124082,103860\n124083,2797\n124084,1323\n124085,124085\n124086,392\n124088,30\n124089,30\n124090,1007\n124091,34\n124091,35\n124091,217\n124092,124093\n124094,19010\n124095,30\n124096,30\n124097,149\n124097,21442\n124098,30\n124099,30\n124100,175\n124101,298\n124102,1955\n124103,697\n124104,1132\n124105,781\n124106,379\n124107,30\n124109,1227\n124109,86416\n124110,30\n124111,483\n124112,4771\n124113,5310\n124114,97\n124115,30\n124116,314\n124116,467\n124116,1556\n124117,602\n124118,310\n124118,3039\n124119,48\n124120,602\n124121,557\n124122,4060\n124123,557\n124124,557\n124125,171\n124126,500\n124127,1962\n124128,1052\n124129,1882\n124130,2775\n124131,54\n124132,124133\n124134,124135\n124136,158\n124137,124138\n124139,358\n124140,104\n124140,200\n124141,124142\n124143,298\n124144,485\n124145,124146\n124147,30\n124148,124148\n124149,298\n124150,485\n124151,30\n124152,158\n124154,30\n124156,171\n124157,30\n124158,4672\n124159,30\n124160,872\n124161,72\n124162,30\n124163,885\n124163,13704\n124164,3538\n124165,30\n124166,2334\n124167,158\n124167,2775\n124168,1888\n124169,2775\n124170,602\n124171,298\n124172,485\n124175,124176\n124177,124178\n124179,2116\n124180,298\n124181,485\n124182,515\n124183,72\n124184,344\n124185,285\n124187,5908\n124189,124190\n124191,779\n124192,273\n124193,422\n124194,56\n124195,264\n124196,1381\n124197,30\n124199,422\n124200,56\n124202,1007\n124203,124204\n124205,124206\n124207,124208\n124209,577\n124210,1722\n124210,3538\n124211,124212\n124213,240\n124214,124215\n124216,422\n124217,119205\n124217,140995\n124218,422\n124219,602\n124220,422\n124221,422\n124222,422\n124223,422\n124224,422\n124225,422\n124226,124227\n124228,422\n124229,422\n124230,422\n124231,422\n124232,602\n124233,124234\n124235,3804\n124236,14797\n124237,2737\n124238,518\n124239,3193\n124240,31122\n124241,346\n124243,1467\n124244,72\n124245,147\n124246,1309\n124247,269\n124247,1844\n124249,124250\n124251,30\n124253,2590\n124254,72\n124255,124255\n124256,124257\n124259,2915\n124260,589\n124260,1001\n124261,30\n124262,843\n124263,171\n124264,640\n124265,68\n124265,2590\n124266,207\n124267,30\n124268,596\n124269,124270\n124271,602\n124272,124273\n124274,2292\n124275,30\n124277,346\n124278,124279\n124280,1381\n124281,346\n124283,872\n124284,1458\n124285,872\n124286,1429\n124287,346\n124288,772\n124291,35905\n124292,124293\n124294,30\n124295,202\n124296,124297\n124298,1179\n124299,389\n124300,1085\n124301,366\n124302,366\n124303,83\n124304,366\n124305,366\n124306,124307\n124308,366\n124309,366\n124310,366\n124312,30\n124313,668\n124314,4771\n124315,10\n124316,124317\n124318,657\n124320,644\n124322,233\n124323,1132\n124324,781\n124325,2411\n124326,1007\n124328,346\n124329,920\n124330,103860\n124331,489\n124332,579\n124334,872\n124335,124336\n124337,124338\n124339,97\n124340,124341\n124342,4455\n124343,309\n124343,310\n124344,872\n124345,294\n124346,1143\n124347,1776\n124347,118336\n124348,355\n124349,124350\n124349,143331\n124352,72\n124353,63\n124355,30\n124356,1707\n124358,30\n124360,30\n124362,907\n124363,3804\n124364,1449\n124365,1631\n124366,2209\n124367,30\n124368,217\n124368,536\n124368,3507\n124369,30\n124370,124371\n124372,13538\n124373,640\n124375,68\n124375,1210\n124376,124377\n124378,457\n124378,596\n124379,346\n124380,58\n124381,994\n124382,46\n124383,75912\n124384,994\n124385,5547\n124386,79\n124386,192\n124387,1608\n124388,442\n124389,264\n124390,222\n124391,349\n124391,422\n124391,668\n124391,801\n124392,58\n124393,1132\n124394,781\n124395,215\n124396,217\n124397,450\n124398,920\n124399,58\n124400,994\n124401,46\n124402,75912\n124403,264\n124404,663\n124405,22\n124406,124407\n124408,1551\n124409,1803\n124410,994\n124411,481\n124412,79\n124412,192\n124413,1531\n124414,302\n124417,1400\n124418,124419\n124420,30\n124422,503\n124423,160\n124423,1749\n124424,1001\n124425,302\n124425,579\n124425,2116\n124426,422\n124426,30365\n124427,422\n124428,2867\n124428,2868\n124429,56\n124430,252\n124431,2574\n124432,2671\n124434,707\n124434,1201\n124436,140\n124437,760\n124438,35905\n124440,1033\n124440,1294\n124441,2310\n124443,355\n124445,124446\n124448,107\n124449,5547\n124450,868\n124451,980\n124452,298\n124453,485\n124454,626\n124455,83\n124456,22\n124457,536\n124458,861\n124459,346\n124459,538\n124461,22\n124462,868\n124463,175\n124464,298\n124465,1252\n124465,1253\n124466,332\n124467,3474\n124468,192\n124469,1417\n124470,217\n124470,390\n124470,631\n124470,872\n124470,932\n124470,968\n124470,1001\n124470,1085\n124470,1118\n124470,1122\n124470,1796\n124470,1962\n124471,146\n124473,79\n124473,147\n124473,192\n124474,1118\n124476,298\n124477,485\n124478,202\n124478,203\n124479,1177\n124480,485\n124481,298\n124482,1579\n124483,2979\n124484,298\n124485,485\n124486,4545\n124486,139010\n124487,23287\n124489,1858\n124490,1860\n124491,299\n124492,440\n124493,1572\n124494,1400\n124496,1801\n124497,147\n124497,206\n124497,406\n124498,298\n124499,485\n124500,503\n124501,406\n124502,240\n124504,2775\n124505,447\n124506,298\n124507,485\n124508,1531\n124509,1\n124510,298\n124511,485\n124513,760\n124515,485\n124516,298\n124517,2620\n124518,809\n124519,760\n124522,1285\n124523,392\n124525,336\n124526,1326\n124527,1635\n124528,124529\n124530,124531\n124532,217\n124533,2979\n124534,332\n124535,267\n124536,22\n124537,146\n124538,720\n124540,203\n124540,920\n124541,408\n124542,1323\n124543,102\n124544,1326\n124545,1010\n124546,87\n124548,147\n124548,202\n124548,439\n124548,516\n124548,663\n124548,920\n124548,1181\n124549,510\n124551,510\n124552,264\n124553,346\n124554,611\n124555,124556\n124557,124558\n124559,124558\n124560,124558\n124561,124558\n124562,222\n124563,1564\n124564,22\n124565,124566\n124567,1858\n124568,1860\n124569,175\n124570,298\n124571,712\n124573,1285\n124575,567\n124576,349\n124576,455\n124576,697\n124576,1860\n124576,6955\n124577,457\n124577,515\n124577,557\n124577,581\n124577,868\n124577,941\n124577,1130\n124577,2373\n124577,4545\n124577,56150\n124577,139010\n124578,1265\n124578,1266\n124579,30\n124580,1881\n124581,602\n124582,217\n124583,178\n124585,130\n124585,292\n124585,462\n124585,483\n124585,1639\n124585,1653\n124586,1639\n124587,275\n124588,30\n124589,147\n124589,149\n124589,158\n124589,206\n124589,406\n124589,1458\n124589,1515\n124589,2244\n124589,80266\n124589,89035\n124589,149534\n124590,1285\n124590,8537\n124590,84257\n124591,30\n124592,422\n124592,473\n124592,577\n124592,615\n124592,640\n124592,762\n124592,949\n124592,1010\n124592,1058\n124592,1265\n124592,1266\n124592,1607\n124592,1749\n124592,1807\n124592,4146\n124592,4355\n124592,5961\n124592,8072\n124592,9457\n124592,90845\n124592,131675\n124593,536\n124594,247\n124595,455\n124595,31896\n124597,1\n124598,1608\n124599,72\n124600,1858\n124601,1860\n124602,1858\n124603,1860\n124604,536\n124605,346\n124606,907\n124607,301\n124607,1231\n124607,1293\n124607,1782\n124608,693\n124609,406\n124610,1010\n124611,30\n124612,124613\n124614,301\n124614,1001\n124615,1801\n124616,4611\n124617,1858\n124618,1860\n124619,346\n124620,4611\n124621,261\n124621,333\n124622,1105\n124623,872\n124624,809\n124625,22\n124626,83\n124627,30\n124628,124629\n124630,30\n124631,485\n124632,298\n124633,1014\n124634,175\n124635,298\n124636,124637\n124639,217\n124639,536\n124639,1417\n124639,4672\n124639,18831\n124640,1227\n124640,86416\n124642,483\n124643,195\n124643,5874\n124643,6119\n124643,16767\n124644,222\n124644,455\n124645,113156\n124647,298\n124648,485\n124649,31977\n124651,1285\n124652,217\n124653,323\n124654,298\n124655,485\n124656,124657\n124659,30\n124660,140\n124661,267\n124663,1370\n124664,22\n124665,124666\n124667,30\n124668,287\n124668,666\n124668,676\n124668,877\n124668,907\n124668,937\n124668,972\n124668,1010\n124668,1117\n124668,1122\n124668,1298\n124668,1575\n124668,1849\n124668,7530\n124668,21249\n124668,32784\n124668,38299\n124668,56430\n124668,72764\n124668,92017\n124668,102507\n124668,107616\n124668,124668\n124668,131798\n124668,131799\n124668,131801\n124668,131802\n124668,131803\n124668,131804\n124668,131805\n124668,131806\n124668,135074\n124668,135075\n124668,137058\n124668,137059\n124668,140357\n124668,158556\n124668,159112\n124668,159116\n124668,162739\n124668,163010\n124668,164960\n124668,166285\n124668,168252\n124668,171641\n124668,176427\n124668,177254\n124668,177362\n124668,180341\n124668,182790\n124668,183568\n124668,185991\n124668,187176\n124668,195145\n124668,195575\n124668,196038\n124668,196197\n124668,196657\n124668,198235\n124668,204791\n124668,204801\n124668,205673\n124668,211899\n124668,217539\n124668,218495\n124668,225480\n124668,232771\n124668,240457\n124668,244105\n124668,244800\n124668,247499\n124668,255471\n124668,259293\n124669,30\n124670,140\n124671,1985\n124672,30\n124673,2828\n124674,200\n124675,557\n124676,30\n124677,1429\n124678,2353\n124679,30\n124681,1085\n124682,285\n124683,704\n124684,4691\n124685,124686\n124687,206\n124688,358\n124690,872\n124691,557\n124693,557\n124694,1309\n124695,30\n124696,388\n124697,184\n124698,124699\n124700,1140\n124700,5547\n124701,344\n124703,219\n124705,1001\n124706,358\n124707,1556\n124708,615\n124709,217\n124709,1417\n124710,79\n124711,1359\n124714,124715\n124716,124717\n124718,50176\n124719,298\n124720,485\n124721,2116\n124722,30\n124723,346\n124725,298\n124726,485\n124727,124724\n124729,433\n124731,1707\n124732,22\n124733,124734\n124735,1181\n124735,2931\n124736,124737\n124738,577\n124739,124740\n124741,22\n124742,149\n124743,489\n124744,358\n124745,1715\n124746,1858\n124747,1860\n124748,124749\n124751,124752\n124753,124754\n124755,920\n124756,1807\n124757,31977\n124758,30\n124759,124760\n124761,1849\n124762,862\n124763,479\n124764,124765\n124764,132566\n124766,134\n124766,72439\n124767,1467\n124768,2590\n124769,346\n124770,455\n124771,2424\n124772,206\n124773,346\n124774,366\n124775,366\n124776,346\n124777,366\n124778,1871\n124779,366\n124780,366\n124781,366\n124782,83\n124783,2421\n124784,13980\n124785,30\n124786,124787\n124788,124789\n124788,137818\n124788,190203\n124788,234074\n124790,207\n124791,30\n124792,346\n124793,134\n124793,991\n124794,7358\n124794,7363\n124795,22\n124796,124797\n124798,124799\n124800,124801\n124802,872\n124803,1429\n124804,1238\n124806,124807\n124809,1452\n124810,233\n124811,124812\n124813,264\n124814,668\n124815,1133\n124816,147\n124816,149\n124817,158\n124818,718\n124819,1707\n124820,422\n124821,56\n124822,120\n124822,1419\n124823,1474\n124824,22\n124825,2557\n124827,346\n124828,346\n124830,124831\n124832,124833\n124834,79\n124835,4611\n124836,647\n124837,344\n124838,1881\n124839,346\n124840,119\n124841,579\n124842,289\n124842,290\n124842,94134\n124843,4611\n124844,1544\n124845,124846\n124847,56\n124847,333\n124847,406\n124847,422\n124847,505\n124847,602\n124847,3218\n124847,4866\n124847,124847\n124848,2775\n124849,447\n124850,1939\n124851,640\n124852,640\n124853,640\n124854,1007\n124854,1551\n124854,3999\n124855,1608\n124856,41\n124856,1608\n124858,1007\n124859,422\n124860,56\n124861,355\n124862,124863\n124864,1257\n124865,422\n124866,56\n124867,592\n124868,611\n124869,500\n124870,63\n124870,106\n124870,337\n124870,1175\n124870,1821\n124871,151\n124872,240\n124872,1888\n124873,22\n124874,968\n124874,1293\n124874,1782\n124875,346\n124876,980\n124877,1888\n124878,22\n124879,124880\n124882,682\n124882,1353\n124882,72439\n124883,503\n124884,1803\n124885,79\n124886,602\n124887,718\n124888,1143\n124889,1\n124889,147\n124889,336\n124889,406\n124889,620\n124889,841\n124889,1425\n124889,2244\n124889,8244\n124889,9532\n124889,55254\n124889,102560\n124889,124889\n124889,126059\n124889,130379\n124889,135245\n124889,145651\n124890,485\n124891,298\n124892,1151\n124893,481\n124894,1707\n124895,493\n124896,19010\n124897,278\n124897,726\n124897,1001\n124897,3182\n124897,3585\n124898,1133\n124898,2334\n124899,503\n124900,124901\n124902,124901\n124903,868\n124905,467\n124905,868\n124906,22\n124907,1191\n124908,31073\n124909,4223\n124910,862\n124910,27041\n124911,1635\n124912,22\n124913,1983\n124914,422\n124915,422\n124916,358\n124917,422\n124918,302\n124919,422\n124920,422\n124921,422\n124922,422\n124923,422\n124924,422\n124925,422\n124927,422\n124929,422\n124930,2073\n124931,1509\n124932,425\n124932,1276\n124932,142430\n124933,178\n124934,422\n124935,273\n124936,422\n124937,1580\n124938,563\n124939,1844\n124940,868\n124941,3507\n124942,467\n124943,219\n124946,1556\n124947,1556\n124948,207\n124949,1769\n124949,59021\n124951,1007\n124952,1983\n124953,467\n124954,602\n124956,30\n124957,1326\n124957,31122\n124958,202\n124958,203\n124959,124960\n124961,22\n124962,30\n124963,626\n124965,599\n124966,852\n124967,30\n124967,248\n124968,124969\n124971,83\n124972,577\n124972,1388\n124973,124973\n124974,22\n124975,68\n124976,885\n124976,13704\n124978,124979\n124980,346\n124982,406\n124982,60576\n124983,1417\n124984,30\n124985,346\n124988,346\n124989,557\n124992,22\n124993,48\n124996,175\n124997,298\n124998,647\n124998,3218\n125001,264\n125002,485\n125003,298\n125004,72\n125006,1559\n125007,30\n125008,389\n125009,760\n125010,602\n125012,125013\n125012,139891\n125012,141972\n125014,868\n125015,344\n125016,647\n125017,392\n125018,841\n125019,72\n125020,1033\n125021,48\n125022,994\n125023,500\n125024,125025\n125027,337\n125029,175\n125030,827\n125032,298\n125033,4545\n125034,1359\n125035,1010\n125036,72\n125037,1983\n125038,433\n125039,868\n125040,1544\n125041,2557\n125043,356\n125044,1807\n125045,615\n125047,1359\n125048,222\n125049,68069\n125050,941\n125051,744\n125052,783\n125053,58\n125053,140\n125053,346\n125053,358\n125053,515\n125053,647\n125053,835\n125053,1381\n125053,1400\n125053,1579\n125053,1893\n125053,5440\n125054,1345\n125054,3474\n125055,1707\n125056,694\n125057,397\n125058,1072\n125059,843\n125060,83\n125060,207\n125062,125063\n125064,818\n125065,1608\n125065,1984\n125065,8072\n125066,3769\n125067,72\n125068,22\n125069,125070\n125071,3804\n125072,22\n125073,1105\n125074,125075\n125077,811\n125078,392\n125079,1001\n125079,1177\n125080,125081\n125081,125081\n125083,135\n125084,885\n125084,13704\n125085,596\n125087,1417\n125088,30\n125089,859\n125090,1140\n125090,5547\n125091,264\n125092,392\n125092,697\n125093,515\n125093,1619\n125094,30\n125095,15\n125096,485\n125097,3830\n125098,602\n125099,602\n125100,285\n125101,893\n125101,992\n125101,5908\n125102,852\n125103,125104\n125105,991\n125105,1707\n125105,2605\n125106,125107\n125106,131400\n125108,602\n125109,602\n125110,151\n125112,130\n125113,718\n125114,649\n125115,1285\n125116,30\n125117,1381\n125118,10\n125118,309\n125118,310\n125118,113156\n125119,602\n125120,1983\n125121,338\n125122,609\n125123,175\n125124,697\n125125,298\n125126,602\n125127,3447\n125128,20771\n125130,893\n125132,30\n125133,120\n125134,483\n125135,392\n125136,83\n125137,22\n125139,83\n125141,298\n125142,485\n125143,467\n125144,23783\n125145,22\n125146,1167\n125147,83\n125148,125149\n125150,217\n125150,1608\n125151,79\n125152,200\n125153,872\n125154,973\n125154,1235\n125154,1335\n125156,125156\n125157,30\n125158,920\n125159,125160\n125161,392\n125162,536\n125163,1801\n125164,72\n125164,515\n125164,827\n125165,10\n125166,298\n125167,485\n125168,125169\n125170,125171\n125172,264\n125172,1381\n125173,44725\n125175,125176\n125177,125178\n125179,2744\n125179,127158\n125180,125181\n125182,515\n125183,422\n125184,56\n125185,515\n125186,22\n125187,22\n125188,718\n125189,125190\n125191,30\n125192,30\n125193,932\n125195,364\n125196,125197\n125198,55849\n125199,125200\n125201,3623\n125202,2135\n125203,55849\n125204,697\n125205,30\n125206,875\n125207,125208\n125209,872\n125211,5906\n125212,557\n125213,626\n125214,278\n125215,137\n125216,862\n125217,557\n125218,1722\n125219,557\n125220,130\n125222,1467\n125223,280\n125223,17245\n125224,1453\n125225,125226\n125227,298\n125228,485\n125229,1467\n125230,6387\n125231,346\n125232,389\n125233,872\n125234,72\n125236,158\n125237,440\n125239,3623\n125240,8798\n125242,455\n125242,657\n125242,213089\n125243,118\n125243,4597\n125244,406\n125245,248\n125245,760\n125246,125247\n125248,72\n125249,885\n125249,13704\n125250,557\n125251,44\n125252,68\n125253,6506\n125254,1860\n125255,125256\n125257,647\n125258,30\n125259,125260\n125261,1860\n125262,422\n125263,1454\n125264,862\n125265,379\n125266,125267\n125268,2367\n125269,2572\n125270,1127\n125271,22\n125272,211\n125273,30\n125274,195\n125275,72\n125276,125277\n125278,2775\n125279,447\n125280,302\n125280,861\n125280,893\n125281,30\n125282,298\n125283,485\n125284,4611\n125285,125286\n125287,255\n125288,125289\n125290,240\n125290,333\n125290,1085\n125291,1388\n125292,72\n125293,72\n125294,125295\n125296,217\n125296,516\n125297,52\n125297,175\n125298,312\n125299,7155\n125300,125301\n125302,392\n125303,72\n125305,125306\n125307,30\n125308,125309\n125310,1143\n125311,125312\n125313,72\n125314,125314\n125315,116\n125315,994\n125315,2087\n125316,4611\n125317,125318\n125319,389\n125320,872\n125321,312\n125322,72\n125323,125324\n125326,366\n125327,366\n125328,366\n125329,125330\n125331,107\n125332,366\n125334,72\n125335,83\n125337,1634\n125338,125339\n125340,222\n125341,125342\n125343,125344\n125345,125344\n125346,233\n125347,125348\n125349,125350\n125351,7155\n125352,31977\n125354,1579\n125356,255\n125357,192\n125358,125359\n125360,22\n125361,125362\n125363,22\n125364,2574\n125365,22\n125366,518\n125366,3804\n125367,217\n125367,1805\n125368,7155\n125369,217\n125369,1844\n125369,2557\n125370,192\n125372,920\n125372,1243\n125374,298\n125375,485\n125376,3207\n125377,781\n125378,1132\n125381,125382\n125383,872\n125384,1105\n125385,1082\n125386,305\n125387,125388\n125389,1893\n125391,698\n125392,22\n125393,298\n125394,485\n125395,640\n125396,640\n125397,125397\n125398,640\n125399,7155\n125400,1284\n125401,406\n125401,493\n125402,217\n125403,125404\n125406,1001\n125407,340\n125408,1058\n125409,4039\n125410,406\n125412,424\n125413,22\n125414,893\n125415,273\n125416,125417\n125418,1381\n125419,330\n125420,602\n125421,298\n125422,485\n125423,3653\n125424,827\n125425,248\n125425,2436\n125425,4237\n125425,7155\n125425,182162\n125426,22\n125427,22\n125428,2379\n125429,1133\n125430,7155\n125431,22\n125432,125433\n125434,22\n125437,393\n125437,439\n125437,671\n125437,893\n125437,1243\n125439,481\n125440,389\n125441,422\n125442,7155\n125444,422\n125445,2671\n125446,422\n125447,422\n125448,422\n125449,422\n125450,422\n125451,422\n125452,422\n125453,422\n125454,422\n125455,125456\n125457,298\n125458,485\n125459,240\n125460,22\n125461,442\n125461,852\n125462,1425\n125463,2775\n125464,447\n125465,83\n125467,22\n125468,125469\n125470,1983\n125471,5547\n125472,358\n125472,1058\n125472,2572\n125472,8714\n125474,1556\n125475,22\n125476,134\n125477,192\n125478,22\n125480,704\n125481,19010\n125482,222\n125482,2424\n125483,1140\n125484,671\n125486,22\n125488,3724\n125489,125490\n125491,467\n125492,500\n125493,1962\n125494,1052\n125495,1882\n125496,2775\n125497,54\n125498,408\n125499,5375\n125501,392\n125501,644\n125502,455\n125503,861\n125503,2116\n125504,7155\n125505,907\n125507,22\n125510,424\n125511,843\n125512,17309\n125514,3623\n125515,298\n125516,485\n125518,406\n125519,72\n125520,4691\n125521,125522\n125523,125524\n125526,347\n125527,1837\n125528,626\n125529,273\n125530,175\n125531,298\n125532,479\n125533,171\n125534,3623\n125535,125536\n125537,30\n125539,106\n125540,366\n125541,408\n125542,1323\n125543,102\n125544,1326\n125545,1608\n125546,358\n125548,509\n125548,510\n125548,872\n125550,424\n125551,251\n125552,7155\n125553,3252\n125555,2367\n125556,125557\n125559,340\n125560,809\n125560,1143\n125560,1860\n125561,147\n125562,30\n125564,252\n125564,868\n125565,125566\n125567,22\n125568,30\n125569,5358\n125569,14352\n125569,125569\n125570,298\n125571,485\n125572,109503\n125573,298\n125574,485\n125575,2205\n125575,33424\n125576,994\n125577,346\n125578,22\n125580,1707\n125581,1608\n125582,292\n125582,3370\n125582,14453\n125584,932\n125585,125586\n125587,30\n125590,22\n125591,30\n125593,211\n125594,2373\n125595,500\n125596,1962\n125597,1052\n125598,1882\n125599,2775\n125600,54\n125601,103860\n125602,1167\n125603,22\n125605,1983\n125607,994\n125609,22\n125610,467\n125611,1707\n125612,54284\n125614,175\n125615,171\n125616,298\n125617,30\n125618,298\n125619,485\n125620,171\n125621,1235\n125621,1335\n125623,30\n125624,2416\n125624,2417\n125625,1849\n125626,994\n125627,48\n125628,1432\n125629,94\n125629,2787\n125630,14434\n125631,171\n125632,200\n125633,273\n125634,439\n125634,595\n125634,2424\n125634,3182\n125635,72\n125636,344\n125637,285\n125638,868\n125639,877\n125640,302\n125640,861\n125640,893\n125641,1235\n125641,1335\n125642,994\n125643,125643\n125644,392\n125644,1240\n125644,6955\n125645,346\n125646,81\n125646,622\n125647,346\n125648,171\n125649,503\n125652,1\n125653,72\n125654,125655\n125658,2205\n125658,33424\n125660,994\n125661,406\n125662,994\n125663,192\n125664,71\n125665,30\n125666,30\n125667,125668\n125669,355\n125670,125671\n125672,151\n125673,872\n125674,125675\n125674,199985\n125676,3252\n125677,171\n125678,147\n125679,4192\n125679,4193\n125680,7360\n125681,1707\n125682,1425\n125683,557\n125684,30\n125686,30\n125688,125689\n125690,7155\n125691,483\n125692,233\n125693,704\n125695,72\n125696,125697\n125698,358\n125699,171\n125700,55849\n125701,1608\n125702,422\n125703,56\n125704,422\n125705,56\n125707,125708\n125709,125710\n125713,760\n125713,7155\n125714,366\n125715,366\n125716,1515\n125717,862\n125718,72\n125720,125721\n125722,125723\n125724,285\n125725,634\n125725,2266\n125726,30\n125727,34\n125727,35\n125727,907\n125727,973\n125727,1001\n125727,1133\n125727,3507\n125727,8180\n125727,19946\n125728,30\n125729,30236\n125730,125731\n125732,22\n125733,22\n125734,30\n125735,1634\n125736,30\n125737,557\n125738,72\n125740,557\n125741,30\n125742,862\n125743,206\n125744,557\n125745,158\n125746,3846\n125747,72\n125748,125749\n125750,178\n125750,1776\n125752,219\n125753,8714\n125754,149\n125754,585\n125754,1425\n125755,356\n125755,2989\n125755,2991\n125757,1247\n125758,248\n125759,3555\n125761,158\n125763,872\n125764,79\n125765,577\n125768,130\n125769,250\n125769,1684\n125772,79\n125772,125773\n125772,126575\n125774,105793\n125775,206\n125777,255\n125778,125779\n125780,640\n125781,563\n125783,125784\n125785,1983\n125786,72\n125789,72\n125790,125791\n125792,72\n125793,125794\n125795,872\n125796,125797\n125799,602\n125800,720\n125800,1052\n125800,4980\n125801,125802\n125804,30\n125805,125806\n125807,30\n125809,255\n125810,255\n125811,125812\n125813,366\n125814,3148\n125815,34\n125815,6323\n125816,2989\n125816,2991\n125817,211\n125818,652\n125818,1266\n125819,1551\n125820,1096\n125821,125822\n125823,125824\n125825,233\n125826,850\n125827,79\n125828,626\n125829,1888\n125830,1983\n125831,7652\n125832,3555\n125833,1238\n125834,355\n125835,125836\n125837,264\n125837,1289\n125837,1893\n125839,1452\n125841,972\n125842,125843\n125844,1860\n125845,103860\n125846,7155\n125847,500\n125848,222\n125848,455\n125849,302\n125850,788\n125851,125852\n125853,1392\n125854,192\n125855,788\n125856,493\n125857,647\n125858,30\n125859,30\n125860,30\n125861,7155\n125862,125863\n125864,805\n125864,7155\n125865,615\n125866,75912\n125867,943\n125868,809\n125870,1181\n125871,473\n125872,184\n125872,206\n125873,1070\n125874,30\n125877,222\n125878,34\n125878,35\n125879,772\n125879,28203\n125880,673\n125880,1130\n125881,72\n125882,72\n125883,1515\n125885,510\n125885,852\n125886,163\n125886,1556\n125886,2116\n125888,202\n125888,203\n125888,393\n125889,125890\n125891,79\n125892,298\n125893,485\n125894,2775\n125895,447\n125896,104643\n125897,298\n125898,485\n125899,577\n125899,980\n125900,1240\n125901,72\n125902,344\n125903,285\n125904,481\n125905,5547\n125906,19010\n125907,1019\n125908,298\n125909,485\n125911,30\n125913,30\n125914,2443\n125915,30\n125916,2574\n125917,2367\n125918,83\n125919,22\n125920,192\n125921,192\n125922,1359\n125923,647\n125924,344\n125925,422\n125926,422\n125927,422\n125928,422\n125929,422\n125930,422\n125931,422\n125932,422\n125933,68069\n125934,422\n125935,422\n125936,422\n125937,422\n125938,422\n125939,125940\n125941,422\n125942,125943\n125944,125945\n125946,875\n125948,1368\n125950,1707\n125951,1359\n125952,4222\n125954,302\n125955,186\n125955,392\n125955,1893\n125955,3474\n125956,287\n125957,302\n125958,298\n125959,485\n125960,18831\n125961,18831\n125964,79\n125965,602\n125966,1707\n125967,32\n125967,104\n125967,392\n125967,1836\n125967,6556\n125968,4545\n125968,56150\n125969,788\n125971,1282\n125972,18831\n125973,264\n125973,1284\n125974,1132\n125975,781\n125976,6837\n125977,125978\n125979,852\n125979,1298\n125979,1436\n125980,222\n125980,536\n125980,55233\n125984,1983\n125985,30\n125986,18831\n125987,1001\n125988,125989\n125988,126591\n125990,217\n125991,298\n125992,485\n125994,30\n125995,175\n125996,298\n125997,485\n125998,298\n125999,126000\n126001,850\n126002,126003\n126004,30\n126005,1235\n126005,1335\n126006,4545\n126006,139010\n126007,907\n126008,718\n126009,200\n126010,2784\n126011,485\n126012,22\n126013,58\n126013,71\n126013,251\n126013,255\n126013,287\n126013,298\n126013,493\n126013,563\n126013,577\n126013,626\n126013,663\n126013,671\n126013,698\n126013,788\n126013,795\n126013,801\n126013,811\n126013,991\n126013,1012\n126013,1068\n126013,1070\n126013,1133\n126013,1309\n126013,1368\n126013,1429\n126013,1449\n126013,1474\n126013,1634\n126013,1789\n126013,2367\n126013,2436\n126013,5405\n126013,5961\n126013,6837\n126013,16331\n126013,185874\n126013,193129\n126014,515\n126015,408\n126016,1323\n126017,102\n126018,1326\n126019,809\n126020,298\n126021,485\n126022,563\n126023,422\n126024,422\n126025,106\n126025,3069\n126026,760\n126026,1715\n126027,2006\n126028,510\n126029,1118\n126031,10\n126033,932\n126035,2373\n126037,222\n126037,7768\n126038,563\n126039,206\n126040,202\n126040,203\n126041,640\n126042,640\n126044,1247\n126045,5547\n126046,163\n126047,163\n126049,3115\n126050,1210\n126051,126052\n126053,818\n126054,652\n126057,1849\n126058,20771\n126059,102560\n126060,222\n126061,192\n126062,30\n126063,652\n126064,2367\n126065,126066\n126067,779\n126067,68069\n126068,1052\n126069,422\n126070,56\n126071,126072\n126073,107\n126074,72\n126075,344\n126076,285\n126077,1849\n126078,1085\n126080,422\n126081,56\n126082,44\n126083,717\n126084,1722\n126086,1359\n126087,30\n126088,1556\n126089,200\n126090,46\n126091,949\n126091,1849\n126092,126093\n126094,10\n126095,1458\n126096,195\n126098,332\n126099,298\n126100,485\n126101,875\n126102,22\n126104,200\n126105,175\n126106,298\n126107,406\n126107,620\n126107,779\n126107,1515\n126108,126109\n126110,843\n126110,1849\n126111,2646\n126113,222\n126114,1363\n126115,77\n126116,805\n126117,126118\n126119,217\n126120,302\n126120,861\n126120,893\n126120,1556\n126121,126122\n126123,1635\n126124,217\n126125,868\n126126,107\n126127,2416\n126127,2417\n126128,292\n126129,338\n126130,175\n126131,298\n126132,298\n126133,1580\n126134,332\n126135,1775\n126136,30\n126137,1133\n126138,3538\n126139,1285\n126140,50\n126141,3623\n126142,22\n126143,4545\n126145,30\n126146,175\n126147,332\n126148,130\n126149,298\n126150,126151\n126152,809\n126153,125197\n126154,406\n126155,126156\n126157,41\n126157,1462\n126157,3135\n126157,8537\n126158,30331\n126159,195\n126160,4545\n126160,139010\n126161,175\n126161,49857\n126161,126161\n126161,150910\n126163,932\n126164,72\n126165,56\n126165,94\n126165,147\n126165,192\n126165,602\n126165,1243\n126165,2787\n126165,240174\n126166,298\n126167,485\n126169,557\n126170,126171\n126172,557\n126173,8719\n126174,138\n126175,557\n126176,865\n126177,885\n126177,13704\n126178,137\n126179,118\n126179,4597\n126180,1359\n126181,88820\n126182,118\n126182,4597\n126183,516\n126184,126185\n126186,222\n126187,113156\n126188,557\n126189,1635\n126190,178\n126190,20757\n126191,126192\n126193,126192\n126194,126195\n126196,516\n126197,4545\n126198,557\n126199,557\n126200,30\n126201,107\n126203,22\n126204,72\n126205,2775\n126206,447\n126207,151\n126208,1238\n126209,126210\n126211,30\n126214,1515\n126215,126216\n126217,22\n126218,30\n126219,30\n126220,1370\n126221,1849\n126222,422\n126223,56\n126224,118\n126224,4597\n126226,200\n126227,483\n126229,126230\n126231,30\n126232,1849\n126233,392\n126234,310\n126235,1769\n126236,126237\n126238,126239\n126241,602\n126242,602\n126243,126244\n126245,126246\n126247,126248\n126249,17334\n126250,126251\n126252,126253\n126254,233\n126255,602\n126256,422\n126257,422\n126258,422\n126259,422\n126260,355\n126261,422\n126262,422\n126263,422\n126264,422\n126265,422\n126266,422\n126267,422\n126268,422\n126269,126270\n126272,298\n126273,485\n126274,6556\n126275,23783\n126276,22\n126277,30\n126278,441\n126279,392\n126280,126281\n126282,283\n126282,657\n126282,2266\n126283,83\n126284,481\n126285,2574\n126286,83\n126287,1955\n126288,79\n126288,203\n126288,333\n126288,1181\n126289,126290\n126292,158\n126292,406\n126292,2995\n126292,141912\n126294,2931\n126294,2991\n126295,126296\n126297,3612\n126298,818\n126299,48\n126299,3695\n126300,3585\n126301,126302\n126303,2367\n126304,30\n126305,30\n126307,79\n126308,841\n126309,586\n126309,920\n126310,30\n126311,1289\n126312,392\n126314,30\n126315,292\n126316,126317\n126318,602\n126319,30\n126320,30\n126321,907\n126322,30\n126323,602\n126324,1285\n126325,30\n126326,55849\n126327,640\n126328,126329\n126330,1359\n126331,22\n126332,827\n126334,125479\n126335,126336\n126337,30\n126338,126339\n126340,422\n126341,56\n126342,30\n126343,22\n126344,483\n126345,22\n126346,309\n126346,310\n126347,1467\n126348,126349\n126351,273\n126352,126353\n126354,30\n126355,126356\n126357,126358\n126359,147\n126359,158\n126359,206\n126359,1425\n126359,118336\n126360,126361\n126362,126363\n126364,5405\n126365,126366\n126367,72\n126368,147\n126369,72\n126371,310\n126372,126373\n126375,8270\n126376,30\n126377,104\n126377,200\n126377,1572\n126378,68\n126379,3297\n126380,743\n126380,8714\n126381,30\n126382,355\n126383,126384\n126385,126386\n126387,22\n126388,364\n126389,1479\n126391,390\n126392,875\n126393,107\n126394,994\n126395,22\n126396,126397\n126398,22\n126400,349\n126400,2274\n126400,5540\n126401,171\n126402,30\n126403,298\n126404,485\n126405,126406\n126407,104\n126408,298\n126409,485\n126410,149\n126411,994\n126412,1844\n126413,126414\n126415,126416\n126418,30\n126419,126420\n126419,133777\n126419,139243\n126421,72\n126422,344\n126423,285\n126424,126425\n126427,126428\n126430,30\n126431,126432\n126433,126434\n126437,126438\n126440,704\n126441,233\n126443,107\n126445,2416\n126445,2417\n126446,292\n126447,338\n126448,298\n126450,1133\n126451,3538\n126452,126453\n126454,355\n126455,346\n126456,30\n126457,126458\n126460,171\n126461,126462\n126463,557\n126464,72\n126465,344\n126466,285\n126468,126469\n126470,994\n126471,171\n126472,994\n126473,481\n126474,588\n126474,590\n126475,1231\n126476,690\n126477,22\n126479,126480\n126481,171\n126482,126483\n126484,126485\n126486,126487\n126488,1359\n126489,126490\n126489,225773\n126491,126492\n126493,1608\n126494,859\n126495,30\n126496,126497\n126498,126498\n126499,3069\n126500,44725\n126501,408\n126502,1323\n126503,102\n126504,1326\n126505,9195\n126507,440\n126508,31977\n126509,932\n126510,30\n126511,994\n126512,115\n126512,118\n126513,302\n126514,126515\n126516,1983\n126517,195\n126517,417\n126518,346\n126519,435\n126519,1033\n126520,2506\n126521,872\n126522,872\n126523,126524\n126525,30\n126526,30\n126527,30\n126528,126528\n126529,126530\n126531,30\n126532,346\n126534,346\n126535,30\n126536,30\n126537,2105\n126538,1807\n126539,859\n126540,4611\n126541,22\n126542,126543\n126544,1983\n126545,126546\n126549,22\n126550,22\n126551,346\n126552,22\n126553,126554\n126555,1118\n126556,126557\n126558,171\n126559,126560\n126561,171\n126562,1773\n126565,83\n126566,346\n126567,346\n126569,346\n126571,22\n126572,103860\n126573,273\n126574,483\n126576,126577\n126579,171\n126581,22\n126582,19010\n126583,991\n126584,273\n126585,557\n126586,557\n126587,557\n126588,557\n126589,818\n126590,83\n126594,83\n126596,126597\n126599,602\n126600,6506\n126601,344\n126602,126603\n126605,30\n126607,2224\n126608,1252\n126608,1253\n126609,3769\n126610,2574\n126611,358\n126612,171\n126613,192\n126613,202\n126613,203\n126613,602\n126613,663\n126613,1623\n126614,1858\n126615,1860\n126616,30\n126617,1135\n126618,22\n126618,2421\n126619,690\n126620,186\n126620,2646\n126620,2979\n126621,126622\n126621,132924\n126621,133731\n126621,140246\n126621,143120\n126621,148913\n126623,126624\n126625,30\n126626,126627\n126629,30\n126630,30\n126631,30\n126632,30\n126633,240\n126634,126635\n126636,126635\n126637,30\n126638,126639\n126640,137\n126641,557\n126643,219\n126644,1010\n126646,422\n126647,56\n126648,4545\n126648,139010\n126649,292\n126650,30\n126651,126652\n126653,1238\n126654,294\n126655,296\n126657,298\n126658,1452\n126659,126659\n126660,406\n126661,22\n126662,388\n126663,872\n126664,233\n126665,571\n126665,1556\n126665,162599\n126666,206\n126667,579\n126668,333\n126669,30\n126670,1359\n126671,146\n126672,2379\n126676,83\n126677,83\n126678,579\n126680,118\n126680,4597\n126683,83\n126684,355\n126686,736\n126687,30\n126688,1893\n126689,3413\n126690,2567\n126691,571\n126692,171\n126693,171\n126695,171\n126696,315\n126696,346\n126696,571\n126696,934\n126696,1033\n126696,1294\n126697,3724\n126699,30\n126700,579\n126701,79\n126702,171\n126703,163\n126704,2574\n126705,120\n126705,389\n126706,392\n126706,1465\n126707,4611\n126708,1544\n126709,2775\n126710,447\n126711,298\n126712,485\n126713,298\n126714,485\n126716,30\n126717,1776\n126717,118336\n126718,298\n126719,485\n126720,809\n126721,304\n126722,55849\n126723,640\n126724,595\n126724,703\n126724,1151\n126724,1453\n126724,1722\n126724,3258\n126725,640\n126726,640\n126728,450\n126729,298\n126730,485\n126732,217\n126733,422\n126734,56\n126735,577\n126735,919\n126736,356\n126737,972\n126738,640\n126739,422\n126740,175\n126741,657\n126742,422\n126743,422\n126744,422\n126745,422\n126746,422\n126747,422\n126748,422\n126749,422\n126750,6303\n126751,422\n126753,647\n126754,344\n126755,422\n126756,422\n126757,872\n126758,1858\n126759,1860\n126761,32\n126762,450\n126763,83\n126764,158\n126764,309\n126764,310\n126764,1001\n126764,2646\n126765,48\n126765,1619\n126766,481\n126768,1467\n126770,596\n126771,3623\n126773,589\n126774,126775\n126774,128241\n126774,128836\n126776,126777\n126778,76096\n126779,83\n126780,433\n126781,287\n126781,809\n126781,19010\n126782,1544\n126783,4611\n126784,1326\n126784,3555\n126785,71\n126786,79\n126787,1167\n126787,1616\n126787,2979\n126788,5130\n126789,4545\n126790,1556\n126791,994\n126792,48\n126793,1432\n126795,94\n126795,2787\n126796,22\n126797,14434\n126798,273\n126799,4611\n126800,1544\n126801,22\n126802,207\n126803,178\n126805,3623\n126806,240\n126806,17309\n126807,1298\n126808,852\n126808,1298\n126809,1858\n126810,1860\n126812,818\n126812,1085\n126813,1805\n126814,577\n126814,3207\n126816,1579\n126817,366\n126817,1392\n126818,3207\n126819,7194\n126821,4895\n126822,5547\n126823,1436\n126824,126825\n126826,3623\n126827,433\n126828,175\n126829,126830\n126831,1238\n126831,3474\n126832,298\n126833,4611\n126834,1544\n126835,126836\n126837,1127\n126839,3623\n126841,192\n126841,657\n126841,1531\n126841,191355\n126842,22\n126843,873\n126843,874\n126844,577\n126845,652\n126846,126847\n126848,22\n126849,4545\n126850,102560\n126851,77\n126852,772\n126853,2367\n126855,626\n126855,126918\n126856,620\n126858,68467\n126861,809\n126862,1082\n126863,259\n126863,1143\n126864,452\n126865,30331\n126867,3623\n126872,433\n126873,609\n126873,2775\n126873,3623\n126873,48505\n126874,920\n126875,1082\n126877,1082\n126878,30\n126879,126880\n126881,589\n126881,3623\n126881,178576\n126881,185877\n126882,1082\n126883,872\n126884,1776\n126885,422\n126886,56\n126887,298\n126888,485\n126889,171\n126890,22\n126891,408\n126892,1323\n126893,102\n126894,1326\n126895,298\n126896,485\n126897,171\n126899,500\n126902,1132\n126903,781\n126904,647\n126905,146\n126906,344\n126907,1082\n126908,356\n126908,788\n126909,693\n126910,171\n126911,146\n126912,647\n126913,344\n126914,5405\n126914,189303\n126915,22\n126916,10\n126917,1181\n126919,158\n126920,63\n126920,104\n126920,200\n126920,289\n126920,290\n126920,406\n126920,818\n126920,1177\n126920,1749\n126920,2605\n126920,6955\n126920,94134\n126921,302\n126922,298\n126923,485\n126924,772\n126927,2006\n126928,171\n126929,347\n126931,126932\n126933,602\n126934,126935\n126937,171\n126938,563\n126939,1837\n126940,83\n126941,726\n126942,175\n126942,5591\n126943,171\n126944,483\n126945,809\n126946,217\n126947,22\n126948,422\n126949,56\n126950,126951\n126952,1082\n126952,1955\n126953,222\n126953,455\n126954,450\n126955,206\n126956,1160\n126957,30\n126958,171\n126959,126960\n126961,30\n126962,20063\n126963,30\n126965,126966\n126967,126968\n126969,718\n126970,248\n126971,104\n126971,1417\n126972,346\n126973,46\n126973,240\n126973,631\n126973,973\n126973,1122\n126973,1160\n126973,1284\n126973,1544\n126973,1785\n126973,1837\n126973,2191\n126973,3194\n126973,3207\n126973,3218\n126973,5662\n126973,5718\n126973,20359\n126974,171\n126975,4355\n126976,868\n126977,358\n126978,1466\n126979,14989\n126980,301\n126980,467\n126981,1359\n126982,2205\n126982,33424\n126983,104\n126984,575\n126985,298\n126986,485\n126989,222\n126992,1220\n126992,1222\n126993,252\n126994,251\n126995,1368\n126996,2367\n126997,175\n126999,298\n127000,211\n127000,366\n127002,146\n127003,647\n127004,344\n127005,146\n127006,647\n127007,344\n127008,52270\n127009,127010\n127009,132201\n127011,222\n127013,1531\n127014,7092\n127015,346\n127016,775\n127017,30\n127018,392\n127019,557\n127020,1832\n127022,217\n127023,175\n127024,298\n127027,127028\n127029,200\n127029,372\n127029,1962\n127030,30\n127031,255\n127032,30\n127033,146\n127034,647\n127035,344\n127036,30\n127037,55849\n127038,192\n127039,30\n127040,30\n127041,298\n127042,485\n127043,1860\n127044,1707\n127045,55849\n127046,192\n127046,333\n127047,30\n127048,83\n127049,107\n127050,58\n127050,107\n127050,647\n127051,358\n127052,107\n127053,422\n127054,22\n127055,557\n127056,557\n127057,30\n127058,579\n127059,76096\n127060,30\n127061,258\n127062,127063\n127064,298\n127065,485\n127066,4611\n127067,1151\n127068,30\n127069,30\n127070,137\n127071,10\n127072,536\n127072,852\n127072,4672\n127073,175\n127074,298\n127075,158\n127077,30\n127078,175\n127079,298\n127080,422\n127081,56\n127082,389\n127082,1072\n127083,953\n127083,72439\n127084,255\n127085,255\n127086,349\n127087,22\n127088,22\n127089,30\n127090,6027\n127092,1509\n127093,577\n127094,1085\n127095,1467\n127095,1871\n127095,2421\n127095,5906\n127096,30\n127097,2775\n127098,447\n127099,602\n127100,442\n127100,818\n127101,22\n127102,18831\n127103,211\n127104,14366\n127104,14483\n127105,289\n127105,290\n127105,94134\n127106,22\n127107,240\n127108,22\n127109,1016\n127109,4237\n127110,2931\n127111,83\n127112,1458\n127113,772\n127114,602\n127115,207\n127116,1085\n127117,330\n127118,657\n127119,294\n127120,113474\n127121,267\n127122,171\n127124,843\n127125,127126\n127127,1571\n127128,636\n127129,127130\n127131,5366\n127132,1607\n127132,19010\n127133,127134\n127135,233\n127136,2353\n127137,389\n127138,22\n127139,6303\n127140,48505\n127141,298\n127142,485\n127143,333\n127144,119\n127145,1707\n127146,355\n127147,868\n127148,657\n127148,2266\n127148,2646\n127148,6424\n127149,743\n127150,207\n127151,1707\n127152,972\n127153,1707\n127154,1983\n127154,48505\n127156,68069\n127157,5405\n127158,34\n127158,35\n127158,50\n127158,68\n127158,83\n127158,126\n127158,149\n127158,158\n127158,167\n127158,186\n127158,192\n127158,195\n127158,202\n127158,217\n127158,240\n127158,261\n127158,278\n127158,283\n127158,287\n127158,289\n127158,290\n127158,294\n127158,298\n127158,299\n127158,301\n127158,332\n127158,333\n127158,349\n127158,372\n127158,389\n127158,392\n127158,397\n127158,406\n127158,417\n127158,433\n127158,439\n127158,455\n127158,505\n127158,510\n127158,516\n127158,536\n127158,577\n127158,586\n127158,588\n127158,590\n127158,592\n127158,622\n127158,623\n127158,631\n127158,693\n127158,694\n127158,697\n127158,714\n127158,752\n127158,779\n127158,809\n127158,818\n127158,861\n127158,872\n127158,907\n127158,918\n127158,949\n127158,951\n127158,968\n127158,973\n127158,1001\n127158,1010\n127158,1019\n127158,1023\n127158,1045\n127158,1058\n127158,1085\n127158,1146\n127158,1151\n127158,1210\n127158,1240\n127158,1241\n127158,1284\n127158,1285\n127158,1309\n127158,1370\n127158,1453\n127158,1462\n127158,1465\n127158,1466\n127158,1467\n127158,1498\n127158,1515\n127158,1518\n127158,1522\n127158,1531\n127158,1564\n127158,1566\n127158,1580\n127158,1619\n127158,1623\n127158,1634\n127158,1715\n127158,1785\n127158,1796\n127158,1805\n127158,1818\n127158,1821\n127158,1837\n127158,1860\n127158,1955\n127158,1985\n127158,1996\n127158,2008\n127158,2083\n127158,2205\n127158,2235\n127158,2253\n127158,2296\n127158,2470\n127158,2480\n127158,2511\n127158,2557\n127158,2620\n127158,2671\n127158,2812\n127158,2903\n127158,2979\n127158,2989\n127158,2991\n127158,3135\n127158,4146\n127158,4234\n127158,4382\n127158,4532\n127158,5208\n127158,5231\n127158,5388\n127158,6837\n127158,8243\n127158,8537\n127158,9021\n127158,9025\n127158,9330\n127158,13390\n127158,13546\n127158,13637\n127158,15277\n127158,15424\n127158,15493\n127158,15556\n127158,16362\n127158,16455\n127158,17116\n127158,17151\n127158,17813\n127158,19454\n127158,21414\n127158,21420\n127158,21580\n127158,21736\n127158,22259\n127158,22808\n127158,23287\n127158,24778\n127158,25863\n127158,26125\n127158,26318\n127158,26362\n127158,26480\n127158,28353\n127158,28545\n127158,28973\n127158,29866\n127158,31745\n127158,32650\n127158,33424\n127158,35624\n127158,36512\n127158,39059\n127158,39564\n127158,39695\n127158,41206\n127158,44972\n127158,45666\n127158,46271\n127158,50987\n127158,51359\n127158,51727\n127158,52539\n127158,53726\n127158,54493\n127158,59012\n127158,59077\n127158,59226\n127158,59990\n127158,63411\n127158,66297\n127158,72889\n127158,74696\n127158,75912\n127158,76096\n127158,86402\n127158,86612\n127158,94134\n127158,94151\n127158,98275\n127158,102560\n127158,103860\n127158,110593\n127158,112722\n127158,112938\n127158,113585\n127158,114840\n127158,116543\n127158,118336\n127158,121080\n127158,127158\n127158,138139\n127158,138686\n127158,139641\n127158,141377\n127158,142109\n127158,144231\n127158,144849\n127158,146001\n127158,147034\n127158,147812\n127158,148970\n127158,152152\n127158,160247\n127158,160870\n127158,162008\n127158,165586\n127158,168271\n127158,169948\n127158,171129\n127158,171641\n127158,171648\n127158,174327\n127158,176115\n127158,176510\n127158,176541\n127158,177455\n127158,178573\n127158,178576\n127158,179278\n127158,179804\n127158,180244\n127158,180992\n127158,181945\n127158,182506\n127158,187420\n127158,187464\n127158,187805\n127158,187950\n127158,187975\n127158,187976\n127158,187977\n127158,188542\n127158,188753\n127158,189103\n127158,189152\n127158,190737\n127158,190756\n127158,191355\n127158,191358\n127158,193977\n127158,194645\n127158,194963\n127158,195048\n127158,207045\n127158,207600\n127158,214197\n127158,217531\n127158,218455\n127158,221407\n127158,223391\n127158,225336\n127158,228348\n127158,228456\n127158,231436\n127158,233709\n127158,236252\n127158,245910\n127158,250326\n127158,256222\n127158,256312\n127158,257994\n127158,262551\n127159,647\n127160,344\n127161,1579\n127161,4691\n127163,146\n127164,104\n127165,1058\n127166,805\n127167,127168\n127169,663\n127170,118336\n127172,4545\n127172,56150\n127172,139010\n127173,75912\n127174,22\n127176,579\n127177,422\n127178,1564\n127179,75912\n127180,794\n127180,8541\n127181,920\n127182,772\n127183,58\n127184,994\n127185,46\n127186,75912\n127187,2083\n127188,227\n127188,2379\n127189,602\n127190,19010\n127191,1118\n127192,192\n127193,1556\n127194,422\n127195,422\n127196,422\n127197,4\n127197,5\n127198,1608\n127199,422\n127200,422\n127201,422\n127202,422\n127205,422\n127206,779\n127207,41\n127208,479\n127209,422\n127210,147\n127210,158\n127211,22\n127212,127213\n127214,422\n127216,75912\n127218,75912\n127219,481\n127220,75912\n127221,302\n127221,433\n127221,687\n127221,861\n127221,893\n127221,1659\n127221,4453\n127222,63\n127223,248\n127223,1332\n127225,83\n127226,22\n127227,167\n127227,2083\n127228,50\n127228,1181\n127229,605\n127230,298\n127231,485\n127232,422\n127233,1858\n127234,1860\n127235,743\n127236,602\n127237,217\n127238,2367\n127239,298\n127240,485\n127241,22\n127242,1564\n127243,146\n127244,647\n127245,344\n127246,340\n127247,485\n127248,298\n127249,2574\n127250,1858\n127251,1860\n127252,72\n127253,344\n127254,285\n127255,275\n127256,127257\n127258,344\n127259,285\n127260,72\n127261,647\n127262,146\n127263,344\n127264,17897\n127265,146\n127266,994\n127267,818\n127268,175\n127269,298\n127270,30331\n127271,72\n127272,5405\n127273,30\n127274,147\n127275,602\n127276,1983\n127277,1118\n127279,1707\n127281,1707\n127282,305\n127284,1707\n127285,1149\n127287,338\n127288,184\n127289,1707\n127291,1392\n127292,1707\n127293,937\n127294,1973\n127294,2310\n127295,30\n127296,3623\n127297,779\n127298,422\n127299,694\n127300,6119\n127301,184\n127302,217\n127303,37\n127304,22\n127305,127306\n127307,477\n127308,1881\n127309,30\n127310,3467\n127311,3328\n127312,3467\n127313,1707\n127314,2209\n127315,269\n127316,500\n127316,1381\n127318,104\n127319,79\n127320,175\n127321,298\n127323,1119\n127325,1436\n127326,1888\n127328,298\n127329,485\n127331,250\n127331,1684\n127334,435\n127335,1454\n127335,148742\n127336,1556\n127337,1707\n127338,63\n127338,251\n127338,516\n127339,200\n127339,2995\n127340,811\n127342,408\n127342,1326\n127342,1707\n127343,302\n127343,433\n127344,83\n127345,636\n127346,58\n127347,994\n127348,46\n127349,58\n127350,1\n127351,147\n127352,1181\n127353,30\n127354,79\n127355,631\n127356,200\n127357,1707\n127358,146\n127359,647\n127360,344\n127361,408\n127362,1323\n127363,102\n127364,1326\n127365,907\n127366,158\n127367,83\n127367,206\n127367,2553\n127368,58\n127369,328\n127370,843\n127371,634\n127372,192\n127372,1688\n127373,3623\n127374,1509\n127375,252\n127376,22\n127377,79\n127379,72\n127380,344\n127381,285\n127382,127383\n127384,3623\n127385,843\n127387,1\n127388,22\n127389,72\n127390,344\n127391,285\n127392,3148\n127394,7323\n127394,127395\n127396,720\n127397,557\n127398,22\n127399,22\n127400,175\n127401,298\n127402,861\n127405,79\n127405,195\n127406,3623\n127407,30\n127408,146\n127409,647\n127410,344\n127411,140\n127412,2671\n127413,1359\n127414,1285\n127415,3623\n127416,3623\n127417,22\n127418,1293\n127418,1782\n127419,1033\n127420,314\n127420,599\n127423,328\n127424,1285\n127425,3623\n127426,86\n127426,538\n127426,1133\n127426,1241\n127426,1313\n127426,31206\n127428,269\n127430,1\n127432,22\n127433,467\n127434,3467\n127435,217\n127436,1509\n127437,1707\n127438,111\n127439,1881\n127440,58\n127440,801\n127441,301\n127442,328\n127443,298\n127444,485\n127445,875\n127446,30\n127447,22\n127448,184\n127449,211\n127449,269\n127449,622\n127449,1014\n127450,127451\n127452,200\n127453,3260\n127455,30\n127456,3623\n127457,450\n127458,22\n127459,151\n127460,485\n127461,1177\n127462,602\n127463,602\n127464,602\n127465,252\n127466,192\n127466,217\n127466,439\n127466,877\n127466,1844\n127466,5265\n127467,22\n127468,602\n127469,2775\n127470,5908\n127471,872\n127472,312\n127472,5101\n127473,30\n127474,192\n127474,1089\n127475,30\n127476,1019\n127477,347\n127478,3069\n127479,346\n127481,41\n127482,171\n127483,483\n127485,602\n127486,4549\n127487,50\n127487,146\n127487,147\n127487,158\n127487,192\n127487,195\n127487,206\n127487,333\n127487,585\n127487,640\n127487,841\n127487,1181\n127488,140\n127489,267\n127492,30\n127493,127494\n127495,3623\n127496,1858\n127497,1860\n127498,602\n127499,1220\n127499,1222\n127500,1659\n127501,79\n127502,1860\n127503,4\n127503,5\n127504,222\n127504,657\n127505,2205\n127505,33424\n127506,3623\n127507,127508\n127509,58\n127510,127511\n127512,171\n127513,697\n127515,784\n127515,1381\n127515,2373\n127516,83\n127517,784\n127517,1345\n127517,1381\n127517,2373\n127518,127519\n127521,72\n127522,127523\n127524,127525\n127526,557\n127527,557\n127528,30\n127529,55849\n127530,55849\n127531,309\n127531,310\n127532,127533\n127534,127535\n127536,5405\n127537,885\n127537,13704\n127538,58\n127539,55849\n127540,3967\n127541,22\n127542,1458\n127543,1167\n127544,22\n127545,875\n127546,5405\n127547,22\n127548,1608\n127549,83\n127550,2779\n127551,2116\n127553,602\n127554,602\n127555,192\n127555,1243\n127556,5405\n127557,137\n127558,137\n127559,19413\n127560,127561\n127560,199950\n127562,273\n127563,602\n127564,22\n127565,5547\n127567,875\n127568,255\n127569,22\n127570,171\n127571,127572\n127573,22\n127574,264\n127575,1381\n127576,450\n127577,1007\n127578,450\n127579,1608\n127580,602\n127581,602\n127582,602\n127583,602\n127584,30\n127586,801\n127587,1203\n127588,2083\n127589,310\n127590,127591\n127592,422\n127593,56\n127594,127595\n127596,127597\n127599,83\n127600,310\n127601,306\n127601,307\n127602,137\n127602,2105\n127603,127604\n127605,932\n127607,83\n127610,2617\n127611,127612\n127613,127614\n127616,83\n127618,592\n127619,127620\n127621,34\n127621,35\n127623,1238\n127624,171\n127625,30\n127626,1452\n127627,10\n127629,1707\n127630,6303\n127631,233\n127632,1707\n127633,491\n127633,1143\n127633,1363\n127633,1453\n127633,1653\n127633,19519\n127633,40360\n127634,171\n127635,30\n127636,408\n127639,104\n127640,127641\n127642,355\n127643,22\n127644,452\n127644,457\n127644,535\n127644,676\n127644,918\n127644,1655\n127645,518\n127645,1010\n127645,1452\n127649,3370\n127649,14453\n127652,1877\n127655,273\n127656,222\n127657,171\n127658,1370\n127659,22\n127660,875\n127661,79\n127662,1544\n127663,147\n127664,118\n127664,137\n127664,252\n127664,264\n127664,589\n127664,720\n127664,749\n127664,779\n127664,872\n127664,907\n127664,1085\n127664,1368\n127664,1467\n127664,1939\n127664,2105\n127664,4237\n127664,4597\n127664,6119\n127664,182162\n127665,1888\n127666,22\n127667,1882\n127669,1556\n127670,718\n127671,273\n127672,640\n127673,640\n127674,640\n127675,640\n127676,2719\n127676,73938\n127677,422\n127678,1564\n127679,422\n127680,422\n127681,422\n127682,422\n127683,422\n127684,422\n127685,422\n127686,422\n127687,422\n127688,422\n127689,702\n127689,1608\n127689,6424\n127690,422\n127691,1551\n127692,315\n127693,298\n127694,485\n127695,127696\n127697,907\n127698,344\n127699,647\n127700,146\n127701,3623\n127704,425\n127707,22\n127708,2574\n127709,22\n127710,75912\n127713,481\n127714,248\n127715,1631\n127716,22\n127717,3623\n127719,332\n127719,27041\n127720,287\n127720,809\n127720,19010\n127721,163\n127721,2116\n127723,315\n127724,932\n127726,1014\n127726,1434\n127727,22\n127728,83\n127730,1659\n127731,34\n127731,35\n127734,298\n127735,485\n127736,589\n127739,4355\n127741,1849\n127741,6424\n127743,6789\n127744,127745\n127746,127747\n127751,127752\n127755,22\n127756,1732\n127761,827\n127762,1085\n127762,1285\n127763,127764\n127763,138940\n127765,22\n127766,22\n127767,22\n127768,631\n127769,422\n127770,56\n127771,240\n127771,760\n127771,84257\n127772,22\n127773,1623\n127775,3623\n127776,83\n127776,18831\n127777,22\n127778,2017\n127780,13538\n127782,171\n127784,406\n127786,1556\n127787,6955\n127790,2590\n127791,2073\n127793,1509\n127794,1118\n127795,252\n127795,1220\n127795,1222\n127797,631\n127798,1564\n127802,84257\n127803,861\n127804,557\n127805,2411\n127806,1983\n127807,1849\n127807,5301\n127808,287\n127808,809\n127808,19010\n127809,3246\n127810,827\n127812,127813\n127815,602\n127816,801\n127817,22\n127818,433\n127819,2434\n127820,22\n127821,1556\n127822,422\n127823,56\n127824,3623\n127825,113156\n127826,1603\n127827,690\n127830,3585\n127831,557\n127832,158\n127833,1607\n127835,1238\n127836,111\n127836,4771\n127838,994\n127839,22\n127840,994\n127841,809\n127842,1181\n127843,1082\n127843,1085\n127843,75912\n127844,175\n127845,298\n127846,714\n127848,408\n127849,1323\n127850,102\n127851,1326\n127853,358\n127855,622\n127855,1033\n127856,1326\n127857,408\n127858,301\n127858,968\n127858,1167\n127858,1300\n127858,1522\n127858,73570\n127859,30\n127860,843\n127862,127863\n127862,157214\n127865,875\n127866,1616\n127867,127867\n127868,72\n127869,1177\n127869,4548\n127869,6263\n127870,127871\n127872,538\n127872,1284\n127873,328\n127874,84257\n127875,843\n127877,1531\n127878,127879\n127880,22\n127881,127882\n127883,1849\n127884,127885\n127888,827\n127889,994\n127890,31073\n127891,1556\n127892,72\n127893,332\n127894,22\n127896,994\n127897,86\n127899,22\n127901,467\n127902,22\n127903,22\n127904,1191\n127905,22\n127906,422\n127907,1776\n127908,54\n127909,440\n127911,994\n127912,1381\n127913,994\n127914,859\n127915,22\n127916,175\n127917,298\n127918,455\n127919,1298\n127920,79\n127920,192\n127920,2674\n127920,16153\n127921,127922\n127923,1140\n127923,49057\n127924,27041\n127925,1085\n127927,72\n127928,48\n127929,772\n127930,994\n127931,1881\n127932,312\n127932,510\n127933,893\n127934,5405\n127935,467\n127936,127937\n127938,30\n127938,99807\n127939,1893\n127940,77\n127941,1858\n127942,1860\n127943,127944\n127945,48\n127946,996\n127947,22\n127948,127949\n127951,366\n127952,298\n127953,485\n127954,801\n127954,5547\n127955,272\n127955,255911\n127956,3623\n127957,127958\n127959,818\n127959,2017\n127960,127961\n127962,583\n127963,22\n127964,127965\n127966,483\n127967,72\n127968,422\n127969,56\n127970,206\n127971,3623\n127972,7124\n127973,1608\n127974,72\n127975,149\n127976,72\n127977,415\n127978,22\n127979,127980\n127981,1539\n127983,687\n127984,22\n127985,392\n127985,1240\n127986,557\n127987,59021\n127988,602\n127989,406\n127990,4805\n127991,919\n127992,72\n127993,346\n127994,72\n127996,55849\n127997,3623\n127998,127999\n128000,907\n128001,269\n128001,4548\n128001,142433\n128001,143287\n128002,379\n128002,2784\n128003,2460\n128004,192\n128005,337\n128006,298\n128007,485\n128008,358\n128011,22\n128012,22\n128013,358\n128014,22\n128015,557\n128016,5906\n128017,557\n128018,626\n128019,278\n128020,137\n128022,862\n128023,557\n128024,22\n128025,55849\n128026,22\n128027,72\n128028,72\n128029,685\n128030,72\n128031,344\n128032,285\n128033,850\n128034,72\n128035,298\n128036,485\n128038,968\n128039,72\n128040,809\n128041,1849\n128041,5301\n128041,20359\n128042,431\n128043,1531\n128044,128045\n128047,435\n128048,298\n128049,485\n128050,1298\n128051,30\n128052,450\n128053,843\n128056,30\n128058,433\n128059,422\n128060,56\n128061,128062\n128064,2775\n128065,447\n128066,128067\n128068,298\n128069,485\n128070,2379\n128071,3\n128072,128073\n128074,22\n128075,30\n128076,22\n128077,22\n128078,206\n128079,333\n128079,435\n128079,440\n128079,1033\n128079,1531\n128081,171\n128082,217\n128082,536\n128083,602\n128084,1749\n128085,602\n128086,128087\n128088,44725\n128089,2411\n128091,128092\n128091,139605\n128093,862\n128094,128095\n128096,128097\n128098,30\n128100,35905\n128101,304\n128102,128103\n128104,298\n128105,485\n128106,22\n128107,128108\n128109,233\n128110,602\n128111,452\n128111,457\n128111,535\n128111,676\n128111,918\n128111,1655\n128112,406\n128113,255\n128114,202\n128115,22\n128117,355\n128118,104\n128119,602\n128120,1559\n128121,1309\n128122,875\n128124,602\n128125,72\n128126,1181\n128128,5547\n128129,718\n128131,209\n128132,63\n128133,187\n128134,1033\n128135,22\n128136,151\n128137,209\n128138,328\n128139,209\n128140,640\n128141,5101\n128141,5102\n128142,1509\n128143,1715\n128143,21442\n128144,20\n128144,63\n128144,736\n128144,1151\n128144,1247\n128144,1368\n128144,1881\n128145,726\n128146,264\n128146,1381\n128147,1326\n128148,83\n128149,83\n128151,83\n128152,83\n128153,146\n128154,647\n128155,344\n128156,104\n128157,424\n128158,7092\n128159,1285\n128160,18831\n128162,287\n128162,809\n128162,19010\n128163,1285\n128164,1608\n128164,1801\n128165,424\n128167,358\n128168,22\n128169,481\n128170,251\n128171,68\n128172,3695\n128173,22\n128175,94\n128175,994\n128175,2787\n128176,704\n128177,827\n128177,142473\n128178,298\n128179,485\n128180,171\n128181,83\n128182,22\n128183,1984\n128184,22\n128185,34\n128185,35\n128186,422\n128187,422\n128188,22\n128189,422\n128190,422\n128191,422\n128192,422\n128193,422\n128194,422\n128195,422\n128196,422\n128197,994\n128198,22\n128199,422\n128200,128201\n128202,22\n128203,22\n128204,22\n128205,992\n128207,22\n128208,30\n128209,3135\n128210,146\n128211,772\n128212,772\n128213,772\n128214,772\n128215,328\n128217,968\n128218,772\n128219,1359\n128220,772\n128222,63\n128222,252\n128222,344\n128222,602\n128222,685\n128222,841\n128222,911\n128222,1070\n128222,1085\n128222,1566\n128222,2572\n128224,1007\n128225,22\n128226,163\n128226,1556\n128227,171\n128229,2205\n128229,33424\n128230,209\n128231,571\n128232,298\n128233,485\n128235,1608\n128236,146\n128237,647\n128238,344\n128242,596\n128243,3\n128246,772\n128247,1789\n128248,1556\n128249,4810\n128250,1612\n128251,1551\n128252,217\n128253,1293\n128254,493\n128254,626\n128255,1556\n128256,22\n128257,5547\n128258,3623\n128259,171\n128260,20\n128260,1368\n128261,1509\n128261,4571\n128263,3623\n128264,209\n128265,298\n128266,485\n128267,298\n128268,485\n128270,392\n128270,592\n128270,1805\n128271,158\n128272,20813\n128273,536\n128274,4611\n128275,1544\n128276,73570\n128277,712\n128277,1113\n128277,3218\n128277,28130\n128278,22\n128279,22\n128280,207\n128280,326\n128280,874\n128280,5667\n128280,13457\n128280,17305\n128281,175\n128283,136\n128283,137\n128284,298\n128285,128286\n128287,1010\n128287,1715\n128288,1\n128289,1282\n128290,128291\n128292,994\n128295,30\n128295,333\n128295,622\n128296,779\n128297,26041\n128298,22\n128300,30\n128301,209\n128303,1566\n128304,259\n128305,298\n128306,485\n128307,22\n128308,801\n128309,3582\n128311,298\n128312,485\n128314,338\n128314,8149\n128315,422\n128316,56\n128318,980\n128319,733\n128319,2424\n128320,818\n128321,313\n128322,485\n128323,298\n128325,467\n128325,872\n128326,1860\n128327,1858\n128328,4\n128328,5\n128328,1243\n128329,22\n128330,344\n128331,83\n128332,1309\n128333,22\n128334,217\n128335,4545\n128335,139010\n128336,697\n128338,1776\n128339,1509\n128340,22\n128341,5440\n128344,147\n128344,158\n128345,1590\n128346,41\n128347,22\n128348,1072\n128349,1707\n128350,171\n128351,3623\n128352,83\n128353,2867\n128353,2868\n128354,30\n128355,130\n128356,1085\n128357,403\n128358,22\n128359,22\n128360,83\n128362,22\n128363,209\n128364,2367\n128365,248\n128366,861\n128367,22\n128368,718\n128369,718\n128370,2421\n128371,175\n128372,5908\n128373,298\n128374,1381\n128375,20771\n128376,483\n128377,920\n128378,1388\n128379,1381\n128380,14483\n128381,30\n128382,1284\n128383,1001\n128384,128384\n128385,124889\n128386,285\n128387,422\n128388,56\n128389,1773\n128390,422\n128391,56\n128392,2480\n128393,1858\n128394,1860\n128395,30\n128396,563\n128397,671\n128398,999\n128399,298\n128400,485\n128401,1531\n128401,4545\n128401,56150\n128401,139010\n128402,1962\n128403,954\n128403,10318\n128404,72\n128405,344\n128406,285\n128407,1707\n128409,128410\n128411,2590\n128412,333\n128412,337\n128413,4771\n128414,22\n128415,113156\n128416,22\n128418,298\n128419,485\n128421,68\n128422,420\n128423,128424\n128425,22\n128426,467\n128427,1556\n128428,22\n128429,128430\n128431,264\n128432,346\n128433,1479\n128434,3623\n128435,1181\n128436,393\n128437,128438\n128440,3623\n128441,1181\n128442,128443\n128445,1458\n128446,1143\n128447,346\n128448,217\n128451,30\n128452,72\n128456,1282\n128456,1882\n128458,298\n128459,485\n128460,30\n128461,874\n128462,2567\n128463,298\n128464,485\n128465,1381\n128467,298\n128468,485\n128469,515\n128470,22\n128471,1522\n128472,818\n128473,949\n128474,440\n128475,1663\n128476,128477\n128478,450\n128479,128477\n128480,557\n128481,557\n128482,626\n128483,557\n128484,862\n128485,557\n128486,147\n128487,2210\n128487,4237\n128488,355\n128489,772\n128490,128491\n128492,128493\n128494,128495\n128497,58\n128498,994\n128499,46\n128500,602\n128501,885\n128501,13704\n128502,22\n128503,1072\n128504,200\n128505,298\n128506,485\n128507,431\n128509,1531\n128510,128511\n128512,356\n128512,611\n128513,22\n128514,107\n128515,171\n128516,86\n128516,167\n128516,299\n128516,676\n128516,744\n128516,2372\n128517,22\n128518,1072\n128519,261\n128520,255\n128521,417\n128522,72\n128523,344\n128524,285\n128526,3623\n128527,435\n128529,310\n128530,149\n128532,22\n128533,366\n128534,366\n128535,3623\n128536,22\n128537,2048\n128538,130\n128539,1007\n128540,48\n128541,171\n128542,843\n128544,1247\n128546,128547\n128548,310\n128549,86\n128550,128551\n128552,450\n128553,128554\n128555,22\n128556,422\n128557,56\n128558,1149\n128559,15573\n128560,714\n128561,307\n128561,8788\n128563,579\n128564,22\n128565,128566\n128567,151\n128569,1\n128570,128571\n128572,406\n128572,1181\n128573,128574\n128575,1181\n128576,2421\n128577,2590\n128579,128580\n128582,128583\n128584,52\n128584,140269\n128584,206059\n128585,171\n128586,175\n128587,128588\n128590,207\n128591,147\n128591,158\n128592,602\n128593,2296\n128594,515\n128594,647\n128594,1289\n128597,147\n128597,149\n128598,128599\n128600,128601\n128602,872\n128603,128604\n128605,1429\n128606,128607\n128608,536\n128609,668\n128610,872\n128611,298\n128612,485\n128613,30\n128614,128615\n128618,994\n128619,128620\n128621,128620\n128622,850\n128623,128624\n128625,233\n128626,128627\n128628,128629\n128630,83\n128631,128632\n128634,259\n128635,718\n128636,158\n128636,292\n128638,128639\n128640,493\n128642,389\n128642,626\n128643,2146\n128644,22\n128645,355\n128646,1749\n128647,22\n128648,202\n128648,203\n128649,452\n128650,1381\n128651,255\n128652,4611\n128653,1544\n128655,128656\n128657,366\n128658,146\n128659,647\n128660,344\n128663,158\n128664,424\n128665,433\n128667,240\n128667,269\n128668,422\n128669,56\n128670,640\n128671,102560\n128672,406\n128673,163\n128674,310\n128675,2775\n128676,447\n128677,128678\n128680,1400\n128681,1608\n128682,43203\n128683,48\n128684,146\n128685,647\n128686,344\n128687,146\n128688,647\n128689,344\n128690,657\n128691,1332\n128692,146\n128693,647\n128694,344\n128695,422\n128696,422\n128697,422\n128698,422\n128699,422\n128700,422\n128701,1326\n128702,422\n128704,2045\n128704,189834\n128705,1140\n128705,5547\n128706,1359\n128707,171\n128709,1151\n128709,1453\n128710,22\n128711,406\n128712,872\n128713,647\n128714,344\n128715,146\n128716,992\n128717,422\n128718,222\n128719,1326\n128720,422\n128721,146\n128722,647\n128723,344\n128724,422\n128725,422\n128726,422\n128727,1204\n128728,107\n128728,795\n128728,1177\n128728,1257\n128728,1388\n128728,1888\n128728,2775\n128728,3085\n128729,1580\n128729,103860\n128730,422\n128731,312\n128732,481\n128733,3\n128733,136\n128733,137\n128733,217\n128733,301\n128733,388\n128733,510\n128733,615\n128733,657\n128733,973\n128733,1010\n128733,1210\n128733,1231\n128733,1241\n128733,1284\n128733,1298\n128733,1544\n128733,1801\n128733,1837\n128733,1844\n128733,2045\n128733,2266\n128733,2372\n128733,2557\n128735,3\n128735,372\n128736,22\n128737,1893\n128737,49057\n128738,873\n128739,22\n128740,994\n128741,1608\n128742,1284\n128743,206\n128744,1238\n128745,250\n128745,1684\n128746,128747\n128748,1749\n128749,422\n128750,56\n128751,1608\n128752,1285\n128753,1118\n128753,1663\n128754,647\n128755,146\n128756,647\n128757,344\n128758,83\n128759,1858\n128760,1860\n128763,175\n128764,298\n128766,298\n128767,485\n128768,422\n128770,83\n128770,217\n128770,379\n128770,1019\n128770,1417\n128771,22\n128772,79\n128773,83\n128773,668\n128774,994\n128775,186\n128776,22\n128778,595\n128778,1453\n128779,1888\n128780,13136\n128781,5908\n128783,809\n128784,178\n128784,467\n128785,2779\n128786,596\n128788,536\n128789,171\n128790,788\n128791,298\n128792,485\n128793,422\n128794,56\n128795,596\n128796,22\n128798,111\n128799,175\n128800,298\n128802,1181\n128803,140\n128803,292\n128803,515\n128803,1659\n128804,22\n128805,843\n128807,1010\n128808,843\n128809,818\n128811,22\n128812,22\n128813,1368\n128814,801\n128816,298\n128817,485\n128818,994\n128819,310\n128820,4252\n128821,22\n128822,388\n128822,973\n128822,1298\n128822,1326\n128822,1849\n128824,22\n128826,22\n128827,146\n128828,647\n128829,344\n128830,697\n128831,178\n128831,346\n128831,435\n128831,447\n128831,538\n128831,671\n128831,934\n128831,1294\n128831,1877\n128832,146\n128833,647\n128834,344\n128835,934\n128837,298\n128838,485\n128839,146\n128840,647\n128841,344\n128842,647\n128843,344\n128844,146\n128845,392\n128846,304\n128847,273\n128848,1983\n128849,515\n128850,1452\n128851,1983\n128852,37\n128852,136\n128852,557\n128852,1368\n128852,2006\n128853,5547\n128854,1858\n128855,1860\n128857,146\n128858,647\n128859,344\n128860,450\n128861,128862\n128863,994\n128864,304\n128866,200\n128867,985\n128867,75912\n128868,868\n128870,240\n128870,859\n128870,972\n128870,1326\n128871,1425\n128872,304\n128872,349\n128872,1326\n128872,2460\n128872,3003\n128872,6059\n128872,26041\n128873,30\n128875,298\n128876,485\n128877,932\n128878,151\n128879,994\n128880,1644\n128881,994\n128882,3623\n128883,30\n128884,442\n128885,22\n128886,128887\n128888,694\n128890,920\n128891,596\n128892,128893\n128894,3467\n128895,862\n128896,80266\n128897,636\n128897,1844\n128898,128899\n128900,128901\n128902,663\n128902,2205\n128902,33424\n128903,48\n128904,422\n128904,80266\n128905,697\n128907,918\n128907,1454\n128908,22\n128909,577\n128910,222\n128911,22\n128912,7652\n128913,2048\n128914,602\n128915,611\n128916,22\n128918,192\n128919,843\n128920,1400\n128921,30\n128922,299\n128922,1544\n128922,2083\n128922,2588\n128922,3848\n128922,128929\n128922,128945\n128922,128946\n128922,131329\n128922,134179\n128922,134871\n128922,135367\n128922,143540\n128923,48505\n128924,934\n128925,875\n128926,843\n128927,77\n128928,35687\n128929,1522\n128929,128922\n128930,302\n128930,2116\n128931,128932\n128933,1436\n128934,1284\n128934,2750\n128935,1070\n128936,934\n128938,346\n128939,346\n128940,22\n128941,30\n128942,1140\n128942,3474\n128942,5547\n128944,873\n128945,128922\n128946,128922\n128947,149\n128948,301\n128948,1466\n128948,32751\n128949,875\n128951,356\n128952,146\n128953,647\n128954,344\n128955,30\n128956,510\n128956,2045\n128957,30\n128958,30\n128959,835\n128960,30\n128961,22\n128962,30\n128963,3623\n128964,30\n128965,818\n128966,333\n128967,175\n128968,298\n128969,663\n128969,809\n128969,1381\n128969,1414\n128969,1639\n128969,1805\n128969,2889\n128969,141912\n128970,516\n128971,55849\n128972,596\n128973,128974\n128976,406\n128977,1284\n128978,314\n128978,1001\n128979,515\n128980,298\n128981,485\n128982,994\n128983,647\n128984,146\n128985,344\n128987,128988\n128989,313\n128990,994\n128991,510\n128992,30\n128993,30\n128994,994\n128995,30\n128996,525\n128996,843\n128996,1849\n128997,5547\n128999,129000\n129001,72\n129002,3260\n129003,129004\n129005,151\n129006,2048\n129007,298\n129008,485\n129009,8332\n129009,129010\n129011,7652\n129012,779\n129013,55849\n129014,72\n129015,55849\n129016,129017\n129018,1858\n129019,1860\n129020,1858\n129021,1860\n129022,129023\n129024,596\n129025,55849\n129026,1858\n129027,1860\n129028,31977\n129029,55849\n129031,298\n129032,485\n129033,76096\n129034,1983\n129035,19\n129035,83\n129035,949\n129035,1010\n129035,1881\n129035,211889\n129036,358\n129036,626\n129038,994\n129040,1512\n129040,5992\n129042,994\n129044,129045\n129046,809\n129047,422\n129048,56\n129049,3623\n129050,30\n129051,5911\n129052,298\n129053,485\n129054,994\n129055,158\n129056,129057\n129058,994\n129059,994\n129060,129061\n129062,875\n129063,3623\n129064,994\n129065,129066\n129067,865\n129068,129069\n129070,332\n129071,81\n129071,215\n129072,557\n129073,3623\n129074,158\n129075,137\n129076,88820\n129077,129078\n129079,55849\n129080,8719\n129081,118\n129081,4597\n129082,151\n129083,557\n129084,55849\n129085,41\n129085,332\n129085,1608\n129085,32751\n129087,2353\n129088,557\n129089,557\n129090,1381\n129091,287\n129091,809\n129092,129093\n129094,346\n129095,138\n129096,7\n129097,7\n129097,79\n129098,31977\n129100,227\n129102,34\n129102,35\n129102,2646\n129103,1559\n129105,298\n129106,485\n129107,346\n129108,129109\n129110,22\n129111,167\n129111,301\n129111,907\n129112,22\n129113,129114\n129115,113156\n129116,2083\n129117,525\n129118,577\n129120,129121\n129122,2367\n129123,647\n129124,129125\n129127,516\n129128,129129\n129130,72\n129131,344\n129132,285\n129134,171\n129135,10\n129136,240\n129137,22\n129138,129139\n129140,129141\n129142,298\n129143,485\n129145,1102\n129146,129147\n129148,171\n129149,206\n129150,298\n129151,485\n129153,1509\n129154,393\n129155,83\n129156,346\n129157,116\n129157,994\n129157,2087\n129157,2590\n129158,113156\n129160,129161\n129162,129161\n129163,129164\n129165,129166\n129167,129168\n129169,483\n129170,129171\n129172,129173\n129174,1001\n129175,30\n129175,328\n129177,862\n129178,129179\n129180,366\n129181,366\n129182,233\n129183,129184\n129185,636\n129185,1319\n129186,30\n129187,129188\n129189,30\n129190,5547\n129191,72\n129192,72\n129193,72\n129194,1085\n129195,158\n129195,779\n129195,1515\n129196,2506\n129197,113156\n129198,298\n129199,485\n129200,355\n129202,346\n129203,192\n129203,217\n129203,285\n129203,536\n129203,779\n129203,1454\n129203,1515\n129203,3193\n129203,3999\n129203,6119\n129203,6638\n129204,22\n129205,129206\n129207,1181\n129208,129209\n129210,273\n129210,313\n129210,1122\n129211,1836\n129217,52270\n129219,481\n129220,1309\n129221,6068\n129222,602\n129224,22\n129225,83\n129226,22\n129227,406\n129228,200\n129229,1983\n129230,1531\n129231,129232\n129231,235021\n129234,22\n129235,22\n129236,222\n129237,22\n129238,2506\n129240,22\n129241,1860\n129242,30\n129243,22\n129244,129245\n129248,129249\n129250,4748\n129251,30\n129252,22\n129253,129254\n129255,215\n129256,298\n129257,485\n129258,477\n129259,30\n129260,1531\n129261,22\n129262,129263\n129264,240\n129264,818\n129265,22\n129266,450\n129267,22\n129268,483\n129269,1635\n129270,22\n129271,129272\n129273,129274\n129275,875\n129277,450\n129278,994\n129279,994\n129280,994\n129282,30\n129283,2210\n129283,4237\n129284,1454\n129285,129286\n129287,184\n129288,920\n129289,22\n129291,129292\n129293,129294\n129295,298\n129296,485\n129297,275\n129299,346\n129300,129301\n129302,129303\n129304,22\n129306,129307\n129308,1882\n129309,31977\n129309,129310\n129309,131141\n129311,994\n129312,483\n129313,994\n129315,422\n129316,392\n129316,433\n129316,623\n129319,4611\n129320,743\n129321,129322\n129323,30\n129324,30\n129325,30\n129326,422\n129327,56\n129328,129329\n129330,1479\n129331,22\n129332,390\n129333,129334\n129337,346\n129338,2574\n129341,129342\n129343,129344\n129346,30\n129347,129348\n129350,129351\n129352,298\n129353,485\n129354,31977\n129355,30\n129358,129359\n129360,211\n129361,22\n129362,2116\n129363,129364\n129366,129367\n129368,72\n129370,58\n129372,58\n129373,422\n129374,422\n129375,422\n129376,422\n129377,422\n129378,422\n129379,422\n129380,422\n129381,171\n129383,30\n129384,129385\n129384,198038\n129386,129387\n129388,129389\n129391,129392\n129391,153717\n129393,127257\n129395,129396\n129397,129398\n129399,129400\n129401,52\n129401,175\n129401,140270\n129401,212234\n129402,1353\n129404,346\n129405,129406\n129408,30\n129409,129410\n129411,129412\n129413,129414\n129413,154005\n129416,129417\n129418,129419\n129420,10\n129421,1572\n129422,704\n129425,129426\n129427,129428\n129429,129430\n129431,602\n129432,30\n129434,129435\n129436,129437\n129438,129439\n129438,173611\n129440,129441\n129442,129443\n129444,233\n129446,366\n129447,366\n129448,1381\n129448,33424\n129449,7124\n129450,129451\n129452,30\n129453,107\n129454,2416\n129454,2417\n129455,292\n129456,338\n129457,129458\n129459,298\n129461,1133\n129462,3538\n129463,355\n129464,129464\n129465,346\n129466,30\n129467,455\n129470,129471\n129472,298\n129473,485\n129474,129475\n129476,83\n129477,1284\n129478,1631\n129479,346\n129480,818\n129481,129482\n129483,875\n129484,81\n129484,106\n129484,1579\n129484,2073\n129484,6119\n129484,251515\n129487,22\n129489,346\n129491,22\n129492,129493\n129494,1566\n129495,22\n129496,1566\n129497,22\n129498,602\n129499,1181\n129500,1133\n129501,298\n129502,485\n129503,129504\n129505,1531\n129505,4545\n129505,56150\n129506,450\n129507,129508\n129509,22\n129510,129511\n129512,206\n129513,129514\n129516,999\n129517,1544\n129519,79\n129522,129523\n129524,129525\n129528,994\n129530,22\n129531,30\n129532,994\n129533,195\n129534,134\n129534,200\n129534,772\n129534,1282\n129534,4941\n129534,34321\n129534,92289\n129534,172810\n129534,200694\n129535,760\n129536,1133\n129536,2334\n129537,302\n129537,818\n129538,123465\n129540,129541\n129542,129543\n129544,379\n129545,4611\n129545,103860\n129546,103860\n129547,129548\n129549,22\n129550,22\n129551,1284\n129552,483\n129553,1140\n129554,129555\n129556,586\n129557,1962\n129558,219\n129559,875\n129560,129561\n129560,240344\n129562,22\n129563,694\n129564,481\n129565,129566\n129567,129568\n129569,72\n129570,1635\n129571,1326\n129572,129573\n129574,79\n129575,129576\n129577,129578\n129579,1849\n129580,3585\n129581,557\n129582,72\n129583,557\n129584,557\n129585,22\n129586,557\n129587,718\n129588,22\n129589,1773\n129590,298\n129591,485\n129592,146\n129593,647\n129594,344\n129596,30\n129597,129598\n129599,433\n129600,743\n129601,1043\n129602,875\n129603,129604\n129605,602\n129606,602\n129607,602\n129608,134\n129608,2421\n129609,779\n129610,129611\n129612,217\n129613,30\n129614,97\n129615,1773\n129616,346\n129618,2775\n129619,447\n129620,129621\n129623,30\n129624,30\n129625,30\n129626,515\n129626,652\n129627,129628\n129629,72\n129630,72\n129631,129632\n129633,129634\n129635,129636\n129637,72\n129638,129639\n129638,132350\n129640,129641\n129642,310\n129643,129644\n129645,2697\n129646,3872\n129647,222\n129648,30\n129650,147\n129650,149\n129651,310\n129652,129653\n129655,366\n129657,366\n129658,366\n129659,516\n129660,41\n129660,784\n129661,292\n129662,294\n129663,296\n129664,298\n129666,129667\n129668,129669\n129670,30\n129672,275\n129673,129674\n129675,129676\n129677,129678\n129679,129680\n129681,129682\n129683,129684\n129686,129687\n129688,19005\n129689,19005\n129690,129691\n129692,907\n129692,972\n129692,1117\n129692,2191\n129692,13474\n129692,14077\n129692,31383\n129692,50607\n129692,54083\n129692,125505\n129692,135910\n129692,136382\n129693,129694\n129695,261\n129697,1\n129697,273\n129698,1238\n129699,129687\n129700,1566\n129701,1033\n129702,872\n129703,671\n129704,147\n129705,252\n129706,1452\n129707,184\n129708,2646\n129709,129710\n129711,136\n129712,129713\n129714,83\n129718,355\n129722,1962\n129724,875\n129725,392\n129726,994\n129727,22\n129728,994\n129728,1227\n129728,1252\n129728,1253\n129728,21944\n129728,86416\n129729,129730\n129731,129732\n129733,129734\n129735,393\n129735,980\n129736,1452\n129737,272\n129737,1033\n129738,129739\n129741,994\n129742,58\n129743,46\n129744,1052\n129744,1368\n129745,75912\n129746,1616\n129747,299\n129748,422\n129749,129750\n129751,422\n129752,422\n129753,422\n129754,422\n129755,422\n129756,500\n129757,1132\n129758,781\n129759,312\n129760,22\n129764,818\n129765,87\n129765,1454\n129766,994\n129767,129768\n129769,149\n129769,163\n129771,298\n129772,485\n129773,850\n129774,626\n129775,775\n129776,1284\n129778,1014\n129779,209\n129780,602\n129781,602\n129782,313\n129783,994\n129785,602\n129786,79\n129787,1326\n129788,298\n129789,485\n129790,10\n129790,119\n129790,267\n129790,309\n129790,310\n129790,657\n129790,795\n129790,1167\n129790,1400\n129790,1659\n129790,1677\n129790,2073\n129790,2626\n129790,2646\n129790,3804\n129791,222\n129792,22\n129793,22\n129794,718\n129796,920\n129798,31934\n129799,83\n129801,3623\n129802,340\n129803,1132\n129804,781\n129805,760\n129806,575\n129807,3960\n129808,129809\n129809,3258\n129810,801\n129810,5547\n129811,596\n129812,6888\n129813,200\n129814,41\n129815,736\n129816,22\n129817,809\n129818,272\n129819,1127\n129820,273\n129821,129822\n129824,1052\n129826,129827\n129828,2867\n129828,2868\n129829,255\n129830,255\n129831,697\n129832,1085\n129832,3507\n129833,980\n129834,312\n129836,516\n129837,48\n129838,762\n129839,79\n129840,48505\n129841,65\n129845,1893\n129846,525\n129847,3161\n129848,146\n129849,647\n129850,344\n129851,809\n129854,68\n129854,22071\n129856,718\n129856,1745\n129857,129858\n129860,994\n129861,9743\n129862,2867\n129862,2868\n129863,129864\n129865,1465\n129866,129867\n129869,75912\n129870,697\n129871,298\n129872,485\n129873,7155\n129874,298\n129875,129876\n129877,431\n129878,697\n129879,30\n129880,240\n129882,298\n129883,485\n129884,143\n129886,493\n129889,697\n129890,392\n129890,809\n129890,1143\n129891,30331\n129892,4611\n129893,1544\n129894,1132\n129895,781\n129896,11\n129897,83\n129898,129899\n129900,994\n129901,422\n129902,255\n129903,192\n129903,206\n129903,577\n129903,590\n129903,1177\n129903,1844\n129903,2073\n129903,2626\n129903,4237\n129903,8270\n129903,182162\n129904,302\n129904,579\n129905,433\n129907,58\n129909,433\n129911,58\n129912,994\n129913,46\n129914,818\n129914,1014\n129915,2620\n129916,760\n129918,801\n129919,200\n129920,4823\n129921,302\n129922,346\n129925,163\n129925,305\n129925,447\n129925,1132\n129925,8501\n129925,15573\n129926,135\n129926,149\n129926,1515\n129927,852\n129929,68\n129930,30\n129931,1332\n129932,3\n129934,143\n129935,129936\n129937,994\n129938,30\n129939,129940\n129941,349\n129942,657\n129942,1479\n129942,1522\n129943,129944\n129945,1707\n129946,30\n129947,129948\n129949,129948\n129951,577\n129952,30\n129953,525\n129956,30\n129957,134\n129958,129959\n129960,30\n129961,30\n129962,602\n129963,602\n129964,68\n129965,129966\n129968,481\n129969,1289\n129970,149\n129971,310\n129972,818\n129973,8788\n129974,2045\n129976,146\n129977,647\n129978,344\n129979,957\n129980,1181\n129983,129984\n129985,483\n129986,22\n129989,129990\n129989,184774\n129989,199648\n129989,230676\n129991,957\n129992,957\n129993,1807\n129994,275\n129995,222\n129996,129997\n129998,5547\n129999,1888\n130001,130002\n130003,215\n130004,255\n130005,130006\n130008,130009\n130008,135741\n130008,137878\n130011,130011\n130012,22\n130013,1016\n130013,2210\n130013,4237\n130014,579\n130015,1177\n130016,302\n130017,130018\n130017,164695\n130020,258\n130021,130022\n130023,861\n130024,30\n130025,171\n130026,1458\n130027,1\n130027,149\n130027,1803\n130027,21442\n130029,957\n130030,269\n130032,30\n130033,557\n130034,79\n130035,557\n130036,704\n130036,1707\n130037,330\n130038,30\n130039,130040\n130041,130042\n130043,130044\n130045,178\n130045,586\n130046,310\n130047,760\n130048,697\n130049,697\n130050,1773\n130052,30\n130053,9195\n130054,1085\n130056,130057\n130058,15573\n130059,1370\n130060,585\n130061,307\n130061,45960\n130062,209\n130064,130065\n130066,22\n130067,875\n130069,72\n130070,151\n130070,17772\n130071,305\n130072,1252\n130072,1253\n130073,298\n130074,485\n130075,130076\n130077,305\n130077,2146\n130079,14472\n130080,1298\n130081,15\n130082,957\n130083,994\n130084,346\n130085,184\n130086,346\n130087,957\n130088,30\n130090,602\n130091,298\n130092,485\n130093,640\n130094,360\n130095,1370\n130095,1821\n130096,302\n130096,861\n130096,893\n130097,7416\n130099,2083\n130100,130101\n130102,30\n130103,292\n130104,130105\n130107,779\n130108,130109\n130110,588\n130110,590\n130111,333\n130112,289\n130112,290\n130112,94134\n130114,130115\n130116,447\n130117,130118\n130119,832\n130120,4597\n130121,3538\n130122,872\n130123,1\n130123,2787\n130123,30331\n130125,94\n130125,795\n130127,366\n130128,366\n130129,366\n130130,366\n130132,202\n130132,203\n130132,1181\n130133,192\n130133,333\n130135,417\n130136,175\n130137,30\n130138,55849\n130139,130140\n130141,233\n130142,79\n130142,1181\n130143,211\n130144,2460\n130145,1707\n130146,130147\n130148,30\n130150,1458\n130151,1132\n130152,781\n130153,298\n130154,485\n130155,130156\n130157,130158\n130159,355\n130160,2105\n130161,130162\n130164,49057\n130165,211\n130166,3094\n130167,415\n130167,1465\n130168,1001\n130169,736\n130170,83\n130171,130172\n130173,130174\n130175,48\n130176,389\n130177,130178\n130179,7092\n130180,586\n130181,1571\n130182,167\n130182,301\n130182,510\n130182,2979\n130184,557\n130184,636\n130185,859\n130185,1127\n130186,104\n130187,1425\n130188,130189\n130190,130191\n130192,30\n130193,1849\n130194,640\n130195,417\n130196,346\n130198,1509\n130199,1509\n130200,1509\n130201,980\n130202,1509\n130203,30\n130204,808\n130205,3623\n130207,30\n130208,1509\n130209,313\n130209,1224\n130210,2205\n130210,33424\n130212,209\n130213,9457\n130214,422\n130215,422\n130216,422\n130217,422\n130218,422\n130219,422\n130220,422\n130221,422\n130222,30428\n130223,22\n130224,422\n130225,30\n130226,30\n130227,1509\n130228,873\n130229,111142\n130230,433\n130231,980\n130231,1509\n130232,130233\n130234,1509\n130235,589\n130236,130237\n130238,1849\n130238,2372\n130239,1849\n130239,32784\n130240,1247\n130241,1210\n130242,66500\n130243,200\n130244,130245\n130246,83\n130249,1140\n130250,1509\n130250,4771\n130251,422\n130252,56\n130253,392\n130254,111142\n130255,130256\n130257,83\n130258,1381\n130259,151\n130261,134\n130262,30\n130263,827\n130264,868\n130265,422\n130266,56\n130267,2480\n130269,760\n130270,718\n130272,35687\n130274,30\n130275,120\n130275,222\n130275,278\n130275,389\n130275,455\n130275,949\n130275,1635\n130275,1860\n130275,2424\n130275,2671\n130275,6955\n130275,37088\n130276,2411\n130277,875\n130278,372\n130279,717\n130280,171\n130281,130282\n130283,994\n130284,6323\n130285,171\n130286,1858\n130287,1860\n130288,217\n130289,994\n130290,1509\n130291,994\n130292,1556\n130293,264\n130293,697\n130293,1551\n130293,1769\n130293,191860\n130294,130295\n130297,392\n130297,1949\n130298,994\n130299,30\n130301,2646\n130302,999\n130303,79\n130304,868\n130305,994\n130306,994\n130307,994\n130308,17525\n130309,146\n130310,344\n130311,647\n130312,22\n130313,406\n130314,10\n130315,843\n130316,298\n130317,485\n130318,2460\n130319,994\n130320,337\n130320,346\n130320,671\n130320,726\n130320,934\n130320,980\n130320,1181\n130320,1531\n130321,623\n130322,58\n130323,843\n130324,1509\n130325,255\n130326,994\n130327,294\n130328,55849\n130329,1\n130331,2944\n130332,1983\n130333,5212\n130334,994\n130336,760\n130338,1983\n130339,1078\n130340,147\n130340,406\n130340,663\n130340,779\n130340,1515\n130341,1014\n130343,130344\n130345,298\n130346,485\n130347,392\n130348,994\n130349,79\n130350,586\n130351,346\n130352,1326\n130353,452\n130354,1247\n130355,184\n130357,107\n130357,200\n130357,227\n130357,240\n130357,372\n130357,442\n130357,588\n130357,590\n130357,805\n130357,1659\n130358,130359\n130360,1252\n130360,1253\n130361,1745\n130362,3\n130363,809\n130363,861\n130364,4\n130364,5\n130365,5265\n130366,1001\n130367,130368\n130369,72\n130370,344\n130371,285\n130372,1509\n130373,406\n130374,130375\n130376,809\n130377,1127\n130378,206\n130380,30\n130381,147\n130382,433\n130383,1722\n130384,515\n130385,994\n130386,278\n130387,217\n130388,130389\n130390,83\n130392,171\n130393,994\n130394,130395\n130396,1722\n130397,175\n130398,298\n130399,19413\n130400,30\n130401,130402\n130403,862\n130405,447\n130406,2775\n130407,315\n130407,447\n130407,671\n130407,996\n130407,1068\n130407,1474\n130407,1789\n130408,481\n130409,3623\n130410,697\n130411,1722\n130412,130413\n130414,30\n130416,83\n130417,408\n130418,1323\n130419,102\n130420,1326\n130421,123415\n130422,3623\n130424,636\n130424,1332\n130424,1572\n130425,957\n130426,130427\n130428,202\n130428,203\n130429,957\n130430,306\n130430,307\n130431,147\n130431,2867\n130431,2868\n130432,1474\n130433,30\n130434,994\n130435,1805\n130436,30\n130437,3623\n130439,140\n130441,30\n130442,167\n130442,567\n130442,666\n130442,783\n130442,1284\n130442,3193\n130442,124668\n130443,217\n130445,3138\n130446,868\n130447,515\n130448,22\n130449,1556\n130450,2671\n130451,1608\n130453,433\n130454,1105\n130455,1298\n130455,1616\n130456,151\n130457,2995\n130458,649\n130459,3623\n130460,302\n130461,119\n130462,875\n130463,1285\n130464,346\n130465,1955\n130465,2989\n130465,2991\n130466,557\n130466,772\n130467,1326\n130468,151\n130468,685\n130468,2460\n130469,1515\n130470,86832\n130471,1837\n130471,1882\n130471,5718\n130472,30\n130473,2784\n130474,536\n130475,149\n130476,30\n130477,206\n130478,147\n130479,30\n130480,588\n130480,590\n130481,30\n130482,483\n130483,175\n130484,298\n130485,192\n130485,620\n130485,8244\n130485,102560\n130486,885\n130486,13704\n130487,872\n130488,158\n130489,557\n130490,760\n130492,30\n130493,59021\n130494,455\n130494,1019\n130495,202\n130495,203\n130496,1644\n130498,697\n130498,1240\n130498,2620\n130499,79\n130501,417\n130502,72\n130503,358\n130504,1274\n130506,72\n130507,328\n130508,130509\n130510,595\n130511,10\n130512,72\n130513,107\n130513,364\n130514,313\n130515,255\n130516,557\n130516,772\n130517,44\n130518,3623\n130520,171\n130522,113156\n130523,602\n130524,2205\n130524,2334\n130524,3207\n130524,33424\n130525,130526\n130527,140\n130528,267\n130529,222\n130529,2266\n130530,602\n130531,1467\n130532,779\n130533,130534\n130536,477\n130537,10\n130538,264\n130539,477\n130540,893\n130541,30\n130542,602\n130543,2116\n130544,30\n130545,30\n130546,1285\n130548,557\n130549,557\n130550,30\n130552,1400\n130552,2073\n130553,289\n130553,290\n130553,94134\n130554,525\n130555,1849\n130556,2209\n130557,1309\n130558,577\n130559,704\n130560,255\n130561,852\n130562,72\n130563,631\n130564,332\n130564,3135\n130565,294\n130567,1888\n130567,2775\n130568,72\n130569,536\n130570,130571\n130572,130573\n130574,875\n130575,30\n130576,1238\n130577,500\n130578,1962\n130579,1052\n130580,1882\n130581,2775\n130582,54\n130583,1220\n130583,1222\n130584,298\n130585,485\n130586,31934\n130587,113156\n130588,1449\n130589,872\n130590,31934\n130591,7\n130591,97\n130592,192\n130592,779\n130593,1858\n130594,1860\n130595,1858\n130596,1860\n130597,30\n130598,704\n130599,393\n130600,1467\n130601,130602\n130604,2434\n130605,72\n130606,72\n130607,500\n130608,1962\n130609,1052\n130610,1882\n130611,2775\n130612,54\n130613,292\n130615,301\n130616,2590\n130619,1381\n130620,4146\n130621,3041\n130622,22\n130623,72\n130624,207\n130625,30\n130626,130627\n130629,30\n130630,298\n130631,485\n130632,130633\n130634,479\n130635,1238\n130636,872\n130637,1429\n130638,1033\n130639,130640\n130642,171\n130643,668\n130644,59021\n130645,130646\n130647,79\n130648,1\n130649,130650\n130651,13980\n130652,22\n130654,779\n130655,2574\n130656,9018\n130657,693\n130658,1467\n130659,455\n130660,130661\n130662,2424\n130663,130664\n130665,130666\n130668,1143\n130669,13980\n130670,31977\n130671,1871\n130672,130673\n130674,240\n130675,252\n130676,130677\n130678,83\n130679,2421\n130680,13980\n130681,346\n130682,77\n130683,1773\n130685,83\n130685,97\n130685,120\n130685,140\n130685,158\n130685,305\n130685,372\n130685,387\n130685,392\n130685,439\n130685,493\n130685,497\n130685,596\n130685,628\n130685,685\n130685,690\n130685,717\n130685,718\n130685,736\n130685,809\n130685,868\n130685,919\n130685,949\n130685,1127\n130685,1181\n130685,1238\n130685,1240\n130685,1326\n130685,1453\n130685,1466\n130685,1572\n130685,1844\n130685,1893\n130685,2371\n130685,3297\n130685,4455\n130685,5102\n130685,26749\n130685,30365\n130685,37759\n130685,68069\n130685,72764\n130685,88820\n130685,130686\n130685,130980\n130685,131171\n130685,132004\n130685,132282\n130685,139045\n130685,139048\n130685,161537\n130685,161790\n130685,162453\n130687,957\n130688,1467\n130689,83\n130690,393\n130691,626\n130691,217389\n130691,218731\n130691,228846\n130692,233\n130693,30\n130694,130695\n130696,388\n130697,2424\n130698,1238\n130699,328\n130701,366\n130702,1452\n130703,366\n130704,366\n130705,366\n130706,366\n130709,130710\n130711,1454\n130712,671\n130713,130714\n130715,1983\n130716,1016\n130716,2210\n130716,4237\n130718,1509\n130720,355\n130721,1871\n130723,34\n130723,35\n130724,697\n130725,2224\n130726,7117\n130728,30\n130729,1118\n130730,30\n130731,104\n130731,134\n130732,222\n130732,18831\n130733,712\n130734,467\n130735,146\n130735,92476\n130736,809\n130737,1402\n130739,1860\n130739,15179\n130740,422\n130741,422\n130742,422\n130743,422\n130744,422\n130745,422\n130746,422\n130747,422\n130748,392\n130749,3218\n130750,422\n130751,422\n130752,3507\n130754,615\n130756,75912\n130758,22\n130759,130760\n130762,850\n130762,75912\n130764,75912\n130767,75912\n130769,697\n130770,22\n130771,104\n130771,736\n130771,1458\n130772,30\n130772,328\n130772,622\n130772,1276\n130773,515\n130773,1007\n130773,1147\n130773,1289\n130773,1509\n130773,1551\n130773,3041\n130773,3999\n130773,36819\n130774,2989\n130774,2991\n130775,302\n130777,1608\n130778,58\n130778,801\n130778,1140\n130778,1653\n130778,2436\n130780,433\n130781,83\n130782,147\n130782,158\n130783,2646\n130783,4672\n130783,18831\n130784,1289\n130784,1551\n130787,130788\n130790,818\n130791,130792\n130793,130792\n130794,609\n130795,217\n130795,326\n130795,349\n130795,379\n130795,388\n130795,518\n130795,595\n130795,949\n130795,1010\n130795,1133\n130795,1722\n130795,1985\n130795,2979\n130795,3538\n130796,130797\n130798,299\n130798,1319\n130798,73570\n130799,557\n130800,1572\n130801,3\n130801,240\n130801,372\n130801,1001\n130802,1105\n130803,130804\n130803,147809\n130803,179117\n130803,223084\n130803,233461\n130803,250477\n130803,253851\n130805,254\n130806,167\n130806,301\n130806,328\n130806,442\n130806,455\n130806,1012\n130806,1370\n130806,1465\n130806,1522\n130806,1801\n130806,1949\n130806,2006\n130806,2083\n130806,2334\n130806,55849\n130807,1732\n130808,302\n130808,861\n130809,7092\n130810,515\n130811,50\n130812,130813\n130814,980\n130815,192\n130816,347\n130816,1801\n130817,685\n130817,1436\n130818,3623\n130819,217\n130820,200\n130821,83\n130822,994\n130823,6119\n130824,312\n130825,577\n130826,264\n130827,994\n130828,1607\n130829,72\n130831,7\n130832,7\n130833,7\n130834,611\n130835,957\n130837,83\n130838,406\n130839,36985\n130841,240\n130842,1556\n130843,417\n130844,3194\n130845,994\n130846,1127\n130847,1132\n130848,781\n130849,55849\n130850,171\n130851,392\n130851,918\n130852,217\n130853,1160\n130854,852\n130854,941\n130855,1284\n130856,273\n130859,30331\n130860,175\n130861,222\n130863,298\n130865,1188\n130866,120\n130866,694\n130866,1419\n130867,298\n130868,485\n130869,2620\n130870,697\n130871,577\n130872,4611\n130873,1544\n130874,827\n130875,3193\n130876,130876\n130877,83\n130878,760\n130879,147\n130880,298\n130881,485\n130882,59021\n130883,1458\n130884,1326\n130885,726\n130886,30\n130887,130888\n130889,240\n130889,301\n130889,1818\n130890,1332\n130892,30\n130893,571\n130894,79\n130894,1181\n130895,3\n130897,203\n130897,7052\n130897,130897\n130897,131014\n130897,133712\n130897,138408\n130898,818\n130899,994\n130900,626\n130901,30\n130904,592\n130905,79\n130906,433\n130907,30\n130908,10\n130909,30\n130910,1332\n130911,843\n130912,1332\n130913,344\n130914,1326\n130915,827\n130915,2367\n130916,408\n130917,1323\n130918,102\n130919,1326\n130920,130921\n130922,240\n130922,467\n130922,868\n130923,1653\n130925,640\n130926,30\n130927,660\n130928,30\n130929,22\n130930,130931\n130932,1016\n130933,1\n130934,907\n130934,1122\n130935,1313\n130935,1479\n130937,1634\n130938,1572\n130938,1623\n130939,1388\n130940,1392\n130941,1479\n130943,577\n130944,1707\n130945,130946\n130947,130946\n130949,301\n130950,30\n130952,30\n130953,55849\n130954,481\n130955,30\n130958,717\n130959,130960\n130961,55849\n130962,55849\n130963,104\n130963,557\n130963,953\n130963,954\n130963,1939\n130964,83\n130965,167\n130965,1544\n130966,1805\n130967,79\n130968,55849\n130970,1983\n130972,171\n130973,215\n130974,130975\n130976,366\n130978,1509\n130979,31934\n130981,5440\n130983,1181\n130983,240174\n130985,1\n130986,1298\n130986,1436\n130986,1785\n130986,1818\n130987,55849\n130988,192\n130989,1434\n130990,217\n130990,1417\n130991,248\n130992,1007\n130993,103860\n130994,720\n130994,1326\n130994,5662\n130995,130996\n130997,130998\n130997,136842\n130999,175\n131000,1096\n131001,483\n131002,298\n131003,34\n131003,35\n131005,1132\n131006,781\n131007,131008\n131007,141339\n131009,406\n131010,1\n131011,104\n131011,605\n131011,1564\n131011,2210\n131011,4237\n131013,202\n131014,130897\n131015,1370\n131015,2671\n131016,957\n131017,389\n131018,957\n131020,72\n131021,344\n131022,285\n131023,131024\n131025,206\n131027,167\n131027,1001\n131027,1167\n131027,1231\n131027,2191\n131027,3422\n131028,5908\n131029,957\n131030,760\n131032,957\n131033,2334\n131034,120\n131035,1722\n131036,10\n131037,30\n131039,251\n131039,252\n131039,516\n131039,1220\n131039,1222\n131039,1512\n131039,5992\n131040,1707\n131041,1033\n131041,1590\n131042,328\n131044,406\n131046,267\n131047,131048\n131047,138322\n131047,139450\n131047,184530\n131049,120\n131050,1370\n131051,79\n131052,885\n131052,13704\n131053,30\n131054,273\n131055,8854\n131056,131057\n131058,294\n131058,805\n131059,602\n131060,59021\n131061,59021\n131062,2775\n131063,447\n131064,131065\n131066,557\n131067,5906\n131068,557\n131069,626\n131070,278\n131071,137\n131072,862\n131073,557\n131074,131075\n131076,219\n131077,30\n131078,30\n131081,392\n131081,644\n131082,602\n131083,1515\n131084,30\n131085,2048\n131086,30\n131087,131088\n131089,131090\n131091,131092\n131093,346\n131094,30\n131095,30\n131096,9457\n131097,862\n131098,435\n131099,131100\n131101,30\n131102,2460\n131103,280\n131103,17245\n131105,30\n131107,818\n131108,22\n131109,30\n131110,131111\n131112,131111\n131113,225\n131114,1556\n131115,30\n131116,131117\n131118,30\n131119,1359\n131120,30\n131121,131122\n131123,22\n131124,30\n131125,86\n131126,292\n131127,131128\n131129,131130\n131131,22\n131132,1400\n131132,2073\n131133,980\n131133,1096\n131134,22\n131135,957\n131136,957\n131137,255\n131138,17228\n131140,30\n131142,30\n131143,131144\n131145,1\n131146,346\n131146,1033\n131147,131148\n131149,30\n131150,30\n131151,957\n131152,131153\n131154,3474\n131155,131156\n131157,10\n131157,1773\n131161,131162\n131163,366\n131164,366\n131165,366\n131166,602\n131167,749\n131168,171\n131169,861\n131172,131173\n131174,131175\n131177,280\n131177,17245\n131179,872\n131180,255\n131181,333\n131182,131183\n131184,315\n131185,131186\n131187,233\n131189,422\n131190,1132\n131191,781\n131192,68069\n131193,602\n131194,298\n131195,485\n131196,34\n131196,35\n131196,389\n131196,13137\n131197,5908\n131198,30\n131199,131200\n131199,134719\n131199,146955\n131199,154958\n131201,272\n131202,1707\n131203,406\n131204,872\n131205,217\n131205,313\n131205,536\n131205,843\n131207,68467\n131208,171\n131210,1191\n131210,2253\n131211,3392\n131211,21442\n131211,75912\n131212,55849\n131213,258\n131214,103860\n131215,355\n131216,34\n131216,35\n131216,120\n131216,134\n131216,222\n131216,225\n131216,278\n131216,283\n131216,313\n131216,389\n131216,431\n131216,455\n131216,657\n131216,694\n131216,949\n131216,1072\n131216,1177\n131216,1860\n131216,2424\n131216,6955\n131216,7768\n131216,13137\n131216,19349\n131216,182162\n131218,104\n131219,104\n131220,104\n131221,406\n131222,862\n131222,27041\n131222,118815\n131222,144079\n131222,190204\n131223,841\n131224,34\n131224,35\n131224,120\n131224,283\n131224,455\n131224,467\n131224,657\n131224,694\n131224,949\n131224,1019\n131224,2424\n131224,2646\n131224,3115\n131224,8180\n131225,175\n131227,298\n131228,366\n131228,500\n131229,1881\n131230,30\n131231,422\n131232,422\n131233,422\n131234,422\n131235,422\n131236,422\n131237,422\n131239,422\n131240,422\n131241,422\n131242,676\n131243,58\n131244,994\n131245,46\n131247,2574\n131248,663\n131248,1370\n131248,6119\n131249,772\n131251,859\n131254,1590\n131254,1644\n131255,2775\n131256,447\n131257,211\n131257,264\n131258,56\n131259,158\n131260,83\n131261,89035\n131262,1608\n131263,309\n131263,310\n131264,30\n131265,215\n131266,254\n131266,424\n131266,2315\n131267,106\n131268,313\n131269,1267\n131270,254\n131271,83\n131272,305\n131273,1556\n131275,83\n131276,3367\n131277,97\n131277,192\n131278,652\n131280,736\n131281,22\n131282,1707\n131283,340\n131284,118336\n131286,135\n131287,131288\n131287,139432\n131289,192\n131289,663\n131290,240\n131291,171\n131292,801\n131293,1240\n131294,41\n131295,440\n131295,1033\n131296,602\n131296,620\n131296,8244\n131298,83\n131299,83\n131300,22\n131301,392\n131302,68069\n131304,392\n131305,1285\n131306,907\n131309,702\n131310,103860\n131311,22\n131312,302\n131313,83\n131314,22\n131315,83\n131316,158\n131317,994\n131319,718\n131320,175\n131321,406\n131322,298\n131324,50\n131324,79\n131324,261\n131324,333\n131324,406\n131324,585\n131324,4192\n131324,4193\n131325,718\n131326,1580\n131328,195\n131328,247\n131328,298\n131328,636\n131328,1309\n131328,4177\n131329,128922\n131330,694\n131330,784\n131331,30331\n131332,79\n131333,340\n131334,1479\n131336,392\n131336,697\n131336,1836\n131336,15609\n131336,214734\n131337,868\n131337,5101\n131338,1983\n131339,557\n131340,433\n131341,994\n131342,1803\n131343,195\n131344,2209\n131345,1634\n131346,22\n131347,66\n131347,202\n131347,240\n131347,599\n131347,911\n131347,1188\n131347,1796\n131347,1844\n131347,2073\n131349,1509\n131350,850\n131351,439\n131351,493\n131353,1474\n131355,1300\n131357,131358\n131359,379\n131359,536\n131359,949\n131360,818\n131361,25222\n131362,48505\n131363,313\n131364,1284\n131365,994\n131366,15\n131367,932\n131368,83\n131368,852\n131369,424\n131370,2373\n131371,107\n131371,298\n131371,503\n131371,588\n131371,590\n131371,631\n131371,784\n131371,805\n131371,1119\n131371,1149\n131371,1326\n131371,1392\n131371,1635\n131371,1801\n131371,1818\n131371,2205\n131371,33424\n131371,60576\n131372,2312\n131373,919\n131374,503\n131374,1392\n131375,10\n131376,3\n131377,673\n131378,30\n131379,72\n131380,718\n131381,134\n131382,30\n131383,1801\n131384,18831\n131385,6661\n131387,907\n131389,852\n131390,283\n131391,1167\n131392,30\n131393,5591\n131394,30\n131395,30\n131396,131397\n131398,73570\n131399,1284\n131401,158\n131402,30\n131403,72\n131404,30\n131405,304\n131406,994\n131407,72\n131408,192\n131408,217\n131408,439\n131408,877\n131408,1844\n131408,5265\n131409,467\n131410,298\n131411,340\n131412,273\n131413,30\n131415,420\n131416,392\n131417,875\n131418,313\n131420,1240\n131421,30\n131422,10\n131423,72\n131424,285\n131425,131426\n131427,83\n131428,175\n131429,192\n131429,1392\n131429,30331\n131431,146\n131432,344\n131433,647\n131434,9004\n131435,149\n131436,515\n131437,455\n131438,3623\n131439,875\n131440,652\n131441,30\n131442,1608\n131443,875\n131444,30\n131445,515\n131446,30\n131447,72\n131448,344\n131449,285\n131450,4771\n131451,217\n131452,217\n131452,1417\n131453,30\n131454,2146\n131455,592\n131456,83\n131457,158\n131457,252\n131458,2266\n131459,72\n131460,30\n131461,1556\n131462,104\n131463,158\n131464,1515\n131465,30\n131466,131467\n131466,131909\n131466,132666\n131466,141092\n131466,206553\n131466,216875\n131466,225526\n131466,226884\n131468,1858\n131469,1860\n131471,72\n131472,72\n131473,72\n131474,1235\n131474,1335\n131475,30\n131476,3623\n131477,72\n131478,200\n131479,557\n131481,72\n131482,131483\n131484,349\n131485,131486\n131487,289\n131487,290\n131487,94134\n131488,1181\n131489,192\n131489,663\n131490,483\n131491,994\n131492,392\n131493,72\n131494,1309\n131495,1509\n131496,255\n131497,54\n131497,222\n131497,278\n131497,1019\n131497,2424\n131498,358\n131499,1072\n131500,131501\n131502,30\n131503,10\n131503,102\n131503,211\n131504,37\n131504,1370\n131504,2782\n131504,150022\n131504,150037\n131505,557\n131506,557\n131507,557\n131508,131509\n131508,132237\n131510,500\n131511,862\n131512,171\n131513,72\n131514,3\n131514,388\n131514,510\n131514,3182\n131514,6638\n131514,28107\n131515,72\n131516,346\n131518,1608\n131519,1556\n131520,30\n131521,222\n131522,994\n131523,55849\n131525,30\n131527,147\n131528,147\n131529,2116\n131530,147\n131531,1010\n131534,346\n131535,131536\n131537,147\n131537,195\n131537,1515\n131538,131539\n131540,994\n131541,10\n131542,957\n131543,131544\n131545,358\n131546,131547\n131548,957\n131549,379\n131550,957\n131551,175\n131552,392\n131553,298\n131554,30\n131555,563\n131555,1070\n131556,30\n131557,3\n131559,602\n131560,30\n131561,55849\n131562,30\n131563,30\n131564,240\n131565,779\n131566,30\n131568,585\n131569,131570\n131571,1458\n131572,1033\n131572,1590\n131572,1789\n131573,83\n131574,131575\n131576,805\n131577,72\n131579,131578\n131580,131581\n131582,1235\n131582,1335\n131583,481\n131585,131586\n131587,131588\n131589,131588\n131591,31977\n131591,131592\n131593,195\n131594,310\n131595,1429\n131596,131597\n131598,131599\n131598,132925\n131600,30\n131601,668\n131602,131603\n131605,131606\n131607,131606\n131608,131609\n131610,481\n131611,481\n131612,131613\n131614,131615\n131616,131617\n131618,1019\n131619,2617\n131620,3413\n131621,1143\n131623,30\n131624,233\n131625,131626\n131627,131628\n131629,131630\n131631,2260\n131632,30\n131633,1043\n131634,131635\n131636,131637\n131638,83\n131639,355\n131640,1893\n131641,668\n131642,151\n131646,392\n131647,131648\n131649,206\n131650,30\n131650,328\n131650,435\n131650,440\n131650,622\n131650,794\n131650,1191\n131650,4355\n131651,1707\n131652,222\n131652,389\n131652,972\n131652,1010\n131652,1298\n131652,6506\n131653,392\n131653,697\n131654,131655\n131656,131657\n131658,131657\n131659,6119\n131660,1238\n131661,22\n131662,1424\n131662,5192\n131663,1782\n131664,1858\n131665,1860\n131666,1033\n131667,131668\n131670,602\n131671,15\n131672,147\n131672,158\n131672,1181\n131673,1474\n131675,1381\n131676,30\n131677,264\n131678,72\n131679,131680\n131681,1046\n131682,5250\n131683,192\n131684,30\n131685,192\n131686,422\n131687,422\n131688,422\n131689,422\n131690,340\n131691,422\n131692,422\n131693,422\n131694,422\n131695,160\n131696,422\n131698,422\n131699,422\n131700,30\n131701,2674\n131702,2553\n131703,79\n131704,366\n131705,131706\n131707,131706\n131708,30\n131709,392\n131710,30\n131711,1858\n131712,1860\n131714,14366\n131715,131716\n131717,1368\n131718,63\n131718,134\n131719,1452\n131721,255\n131723,563\n131724,131725\n131726,2116\n131727,30\n131728,994\n131729,1962\n131730,30\n131730,200\n131731,30\n131732,422\n131733,1544\n131734,4611\n131735,1858\n131736,1860\n131737,83\n131738,131739\n131740,872\n131741,338\n131742,160\n131743,994\n131744,795\n131745,83\n131746,309\n131746,310\n131746,483\n131747,32\n131748,222\n131749,233\n131750,264\n131751,657\n131752,304\n131753,388\n131753,48505\n131754,682\n131754,72439\n131757,626\n131758,994\n131759,131760\n131762,30\n131763,30\n131764,827\n131764,849\n131764,1132\n131764,1844\n131765,2557\n131766,994\n131767,994\n131768,477\n131769,422\n131770,422\n131771,31977\n131771,131772\n131771,132809\n131773,252\n131773,516\n131773,1220\n131773,1222\n131774,455\n131775,779\n131776,131777\n131779,65\n131779,602\n131779,795\n131779,818\n131779,868\n131779,1849\n131780,536\n131781,107\n131783,973\n131783,1167\n131783,1241\n131783,127158\n131786,206\n131787,1512\n131787,5992\n131788,131789\n131790,209\n131791,571\n131792,868\n131793,131794\n131793,139408\n131793,152761\n131795,131796\n131797,264\n131798,124668\n131799,124668\n131800,136\n131801,124668\n131803,124668\n131805,124668\n131807,209\n131808,467\n131808,868\n131808,1345\n131808,156379\n131808,162599\n131809,1122\n131811,3623\n131813,118336\n131814,304\n131814,392\n131814,435\n131814,538\n131814,640\n131814,794\n131814,795\n131814,861\n131814,1559\n131814,1590\n131814,2334\n131814,3474\n131815,75912\n131816,1707\n131816,2553\n131817,30\n131818,2296\n131819,1512\n131819,5992\n131820,209\n131822,34\n131822,35\n131822,278\n131822,349\n131822,392\n131822,433\n131822,138686\n131823,20\n131824,2371\n131825,252\n131826,1512\n131826,5992\n131827,628\n131827,1118\n131827,1210\n131827,1639\n131827,2266\n131827,8235\n131828,1949\n131828,13136\n131828,171641\n131829,131830\n131831,1512\n131831,5992\n131832,1058\n131833,1512\n131833,5992\n131834,406\n131836,192\n131836,285\n131836,779\n131836,1515\n131836,6119\n131836,6638\n131837,2668\n131838,131839\n131840,349\n131841,131842\n131843,22\n131844,1220\n131844,1222\n131845,1370\n131845,1821\n131846,79\n131846,192\n131847,55849\n131848,55849\n131849,55849\n131850,55849\n131851,2089\n131851,2940\n131852,481\n131853,131853\n131854,1326\n131855,3623\n131857,1515\n131858,1370\n131858,1821\n131859,200\n131863,622\n131864,195\n131865,3623\n131866,55849\n131868,131869\n131870,131869\n131871,167\n131872,131873\n131872,138294\n131874,200\n131875,2371\n131876,292\n131877,131878\n131879,1151\n131880,356\n131880,1119\n131881,563\n131884,515\n131885,3623\n131886,1127\n131887,55849\n131888,124668\n131889,301\n131889,861\n131889,1231\n131889,2979\n131889,3422\n131890,248\n131890,1844\n131890,1860\n131891,10\n131892,137\n131894,313\n131895,1707\n131898,136\n131899,1860\n131900,131901\n131902,111\n131902,217\n131902,509\n131902,536\n131902,873\n131902,1210\n131902,4252\n131903,422\n131904,56\n131905,158\n131906,358\n131907,192\n131908,1323\n131910,509\n131910,510\n131911,44\n131912,1612\n131913,147\n131914,264\n131915,175\n131916,298\n131917,1210\n131919,248\n131919,1631\n131920,131921\n131920,135315\n131920,137952\n131922,124668\n131923,131924\n131925,1579\n131926,261\n131926,1466\n131927,694\n131929,973\n131930,131931\n131932,1715\n131932,4146\n131933,30\n131935,392\n131937,1370\n131938,1257\n131940,131941\n131942,131943\n131945,3804\n131946,131947\n131948,131949\n131950,131951\n131950,137972\n131950,141378\n131952,104\n131952,1368\n131953,994\n131954,131955\n131954,132699\n131954,133373\n131956,30\n131957,131958\n131959,131958\n131960,131961\n131962,994\n131963,485\n131963,3447\n131964,718\n131966,131967\n131966,141300\n131968,18726\n131970,151\n131971,1722\n131972,372\n131972,205226\n131973,1132\n131974,781\n131975,233\n131976,920\n131977,1181\n131978,1001\n131979,6323\n131980,131981\n131982,72\n131983,392\n131984,493\n131985,392\n131986,131987\n131988,131987\n131989,131987\n131990,131991\n131990,132664\n131990,134868\n131990,135355\n131990,137988\n131990,138611\n131990,144584\n131990,144735\n131990,145209\n131990,149807\n131990,159395\n131992,2116\n131993,134\n131993,248\n131994,131995\n131996,6303\n131997,1458\n131998,30\n131999,406\n131999,422\n131999,620\n131999,1181\n132001,132002\n132001,132003\n132005,372\n132005,760\n132005,1149\n132006,2626\n132009,1556\n132010,589\n132011,83\n132012,1298\n132013,132014\n132016,1116\n132017,192\n132018,132019\n132020,132021\n132022,132023\n132024,132025\n132027,132025\n132028,309\n132029,178\n132030,132031\n132032,132033\n132034,809\n132035,132036\n132037,577\n132038,22\n132039,2296\n132040,134\n132041,4895\n132042,1247\n132043,994\n132044,6726\n132045,663\n132045,4545\n132045,6119\n132045,139010\n132046,132047\n132048,406\n132049,349\n132050,557\n132051,557\n132052,8719\n132053,138\n132054,865\n132055,557\n132056,137\n132057,88820\n132058,118\n132058,4597\n132059,1608\n132060,994\n132061,557\n132062,292\n132062,389\n132063,58\n132064,147\n132064,206\n132065,132066\n132067,225\n132068,818\n132069,132070\n132071,132072\n132073,132072\n132074,132075\n132076,2590\n132077,1181\n132078,30\n132079,516\n132080,770\n132081,132082\n132083,132084\n132085,379\n132085,385\n132085,536\n132085,634\n132085,1274\n132085,1618\n132085,2253\n132085,2784\n132085,2944\n132085,148742\n132086,207\n132087,2051\n132088,8884\n132089,872\n132090,1429\n132091,332\n132092,1033\n132093,132094\n132095,668\n132096,1085\n132097,132098\n132099,132098\n132100,132101\n132102,994\n132103,422\n132104,422\n132105,422\n132106,422\n132107,422\n132108,132109\n132110,132111\n132110,141389\n132110,147663\n132110,151600\n132112,132113\n132114,1509\n132115,30\n132116,132117\n132116,140664\n132116,234884\n132116,235294\n132118,132119\n132120,1143\n132121,72\n132122,920\n132123,422\n132124,171\n132125,132126\n132125,179584\n132127,132128\n132127,134943\n132127,139752\n132129,3260\n132130,132131\n132132,132133\n132134,422\n132135,132136\n132137,132136\n132138,132136\n132139,872\n132140,483\n132141,132142\n132141,132227\n132141,132710\n132143,557\n132144,422\n132145,422\n132146,843\n132146,1849\n132147,132148\n132147,136741\n132149,422\n132150,422\n132151,200\n132152,358\n132153,132154\n132155,233\n132156,132157\n132158,366\n132159,366\n132160,1983\n132162,132163\n132164,132165\n132167,132168\n132169,132170\n132171,2116\n132172,355\n132173,30\n132174,132175\n132176,83\n132177,83\n132179,132180\n132181,132182\n132183,663\n132183,972\n132183,973\n132183,1010\n132183,1297\n132183,1298\n132183,1749\n132183,1991\n132183,2625\n132183,4359\n132183,4696\n132183,7936\n132183,13771\n132183,15330\n132183,34140\n132184,132185\n132187,132188\n132189,132190\n132189,133159\n132189,135789\n132191,422\n132192,132193\n132194,310\n132195,422\n132196,422\n132197,132198\n132199,132200\n132199,147075\n132199,149768\n132199,157266\n132199,159153\n132202,132203\n132202,133835\n132202,134799\n132202,136817\n132202,137970\n132202,140591\n132202,140696\n132204,132205\n132206,72\n132207,132208\n132207,135179\n132207,135820\n132209,132210\n132211,83\n132212,132213\n132212,138939\n132212,141380\n132212,141499\n132214,132215\n132216,304\n132216,483\n132216,1085\n132216,4222\n132216,6068\n132217,481\n132218,500\n132219,1267\n132219,2989\n132219,2991\n132220,132221\n132222,132223\n132224,4771\n132225,1631\n132226,422\n132228,30\n132229,406\n132230,132231\n132232,107\n132232,372\n132233,422\n132234,132235\n132236,287\n132236,657\n132236,1210\n132238,779\n132239,3653\n132239,245431\n132240,714\n132241,636\n132242,1188\n132243,3872\n132244,104\n132245,72\n132246,372\n132247,1462\n132247,4276\n132248,932\n132249,2146\n132250,132251\n132252,356\n132252,1247\n132253,44\n132254,477\n132257,222\n132258,422\n132259,481\n132260,132261\n132260,171458\n132262,132263\n132264,120\n132265,779\n132266,3538\n132267,326\n132268,132269\n132270,4060\n132271,132272\n132273,132274\n132275,132276\n132277,132278\n132280,132281\n132283,132284\n132285,132286\n132287,132288\n132289,3474\n132290,132291\n132292,483\n132293,104643\n132294,310\n132295,132296\n132297,132298\n132299,158\n132299,252\n132299,622\n132299,1749\n132300,132301\n132300,149926\n132302,1590\n132303,932\n132304,132305\n132304,132617\n132306,1634\n132309,1858\n132310,1860\n132311,333\n132311,588\n132311,590\n132313,192\n132314,527\n132315,217\n132315,862\n132315,872\n132315,1118\n132315,1181\n132315,1796\n132315,2266\n132315,7194\n132316,132317\n132318,132319\n132320,132319\n132323,171\n132324,167\n132325,132326\n132327,355\n132328,509\n132329,132330\n132331,132332\n132333,132334\n132335,1033\n132336,269\n132337,422\n132338,32751\n132339,132340\n132341,588\n132341,590\n132342,455\n132342,2146\n132342,132343\n132342,155565\n132342,177199\n132342,177668\n132342,185992\n132344,422\n132345,1479\n132346,5101\n132347,390\n132348,298\n132349,485\n132351,30\n132352,422\n132353,132354\n132355,132356\n132357,132357\n132358,72\n132359,285\n132360,344\n132361,118\n132361,333\n132362,132363\n132364,209\n132365,132366\n132367,132368\n132369,298\n132370,485\n132371,132372\n132373,132374\n132375,132376\n132375,132721\n132377,255\n132378,132379\n132382,1243\n132383,132384\n132385,22\n132386,132387\n132388,22\n132389,132390\n132391,31934\n132392,298\n132393,485\n132394,132395\n132396,30\n132397,422\n132398,132399\n132400,132401\n132402,292\n132403,200\n132404,147\n132405,132406\n132407,22\n132408,805\n132409,310\n132410,704\n132411,462\n132413,422\n132414,132415\n132416,422\n132417,132418\n132417,141110\n132417,143448\n132419,132420\n132421,83\n132423,1773\n132424,233\n132425,132426\n132427,132428\n132427,138848\n132427,141731\n132427,144658\n132427,152591\n132429,132430\n132432,132433\n132432,133989\n132434,132435\n132434,134106\n132437,366\n132438,366\n132439,366\n132440,366\n132441,441\n132441,626\n132441,1653\n132441,4771\n132441,17068\n132441,39355\n132441,71165\n132441,108728\n132441,147073\n132441,149287\n132441,150644\n132441,154331\n132441,164885\n132441,164902\n132441,176219\n132441,176400\n132441,176429\n132441,176753\n132442,355\n132443,366\n132444,366\n132445,366\n132446,366\n132447,132448\n132449,1745\n132449,132450\n132449,132451\n132452,1509\n132453,83\n132454,132455\n132456,30331\n132457,298\n132458,485\n132459,4611\n132460,1544\n132461,132462\n132463,72\n132464,72\n132465,285\n132466,285\n132467,344\n132468,344\n132470,132471\n132472,72\n132473,344\n132474,285\n132475,132476\n132478,16153\n132479,422\n132480,852\n132481,298\n132482,485\n132483,132484\n132483,169074\n132485,422\n132486,30\n132487,132488\n132489,132490\n132491,132492\n132491,132861\n132493,132494\n132495,640\n132496,22\n132497,132498\n132499,1072\n132500,132501\n132502,132503\n132504,132505\n132506,132507\n132509,137\n132511,1564\n132511,3194\n132512,1415\n132513,422\n132514,132515\n132516,132517\n132518,422\n132519,422\n132520,72\n132521,285\n132522,344\n132523,994\n132524,422\n132525,994\n132526,422\n132527,56\n132528,132529\n132530,932\n132531,953\n132532,132533\n132534,422\n132535,195\n132536,714\n132537,132538\n132539,132540\n132541,192\n132542,118\n132542,4597\n132543,132544\n132545,1116\n132546,422\n132547,422\n132548,132549\n132550,1983\n132551,132552\n132553,312\n132554,333\n132554,2782\n132554,2931\n132554,3872\n132555,132556\n132557,132558\n132557,135041\n132557,135084\n132557,135634\n132557,138605\n132557,139213\n132557,141508\n132557,141585\n132557,141619\n132557,148146\n132560,30\n132562,602\n132563,602\n132564,137\n132565,2506\n132567,132568\n132569,872\n132570,872\n132571,30\n132573,72\n132574,344\n132575,285\n132576,132577\n132578,72\n132579,344\n132580,285\n132581,298\n132582,485\n132583,481\n132584,364\n132585,132586\n132587,1467\n132589,132590\n132591,30\n132592,1773\n132594,132595\n132596,132597\n132598,132599\n132600,872\n132601,994\n132602,132603\n132604,372\n132604,1285\n132604,2989\n132604,2991\n132605,171\n132606,483\n132607,873\n132609,1515\n132610,132611\n132612,393\n132613,22\n132614,132615\n132616,1837\n132618,132619\n132621,132622\n132623,132624\n132623,132700\n132623,132942\n132623,133195\n132623,134839\n132623,135604\n132623,135688\n132623,135768\n132623,139269\n132623,142671\n132623,144410\n132623,144521\n132623,144540\n132625,132626\n132627,132628\n132629,132630\n132631,422\n132632,132633\n132632,133825\n132634,994\n132635,132636\n132637,422\n132638,477\n132640,422\n132641,240\n132642,557\n132643,557\n132644,557\n132645,557\n132647,132648\n132649,994\n132650,132651\n132650,143687\n132650,144749\n132652,132653\n132654,137\n132655,1509\n132656,132657\n132656,226258\n132656,229090\n132658,4611\n132659,1544\n132660,134\n132660,417\n132661,422\n132662,999\n132663,5310\n132665,422\n132667,422\n132668,1247\n132669,22\n132670,289\n132670,290\n132670,718\n132670,94134\n132671,298\n132672,485\n132673,132674\n132675,602\n132676,602\n132677,83\n132678,298\n132679,485\n132680,298\n132681,485\n132682,132683\n132682,137876\n132682,139625\n132684,132685\n132686,1479\n132687,515\n132688,298\n132689,485\n132690,298\n132691,485\n132692,5662\n132693,132694\n132695,63\n132695,171\n132695,250\n132695,1363\n132695,1684\n132696,132697\n132698,10\n132701,14434\n132702,8332\n132703,602\n132704,393\n132704,980\n132704,1531\n132705,132706\n132707,132706\n132708,602\n132709,422\n132711,289\n132711,290\n132711,94134\n132712,22\n132714,132715\n132716,132717\n132718,68\n132720,200\n132722,132723\n132724,132725\n132726,8270\n132728,132729\n132728,159523\n132730,4545\n132731,132732\n132733,292\n132734,132735\n132736,294\n132737,296\n132738,298\n132739,422\n132740,422\n132741,1414\n132742,4039\n132743,30\n132744,132745\n132746,422\n132747,422\n132748,132749\n132750,30\n132751,132752\n132753,132754\n132755,422\n132756,233\n132757,132758\n132759,14989\n132761,72\n132762,422\n132763,132763\n132764,422\n132765,83\n132766,422\n132769,302\n132769,861\n132770,79\n132771,366\n132772,366\n132773,1238\n132774,366\n132775,366\n132776,422\n132777,366\n132778,366\n132779,298\n132780,485\n132781,366\n132782,366\n132783,422\n132784,264\n132785,422\n132787,30\n132788,2557\n132789,72\n132790,344\n132791,285\n132792,3207\n132793,422\n132794,422\n132795,14989\n132796,132797\n132798,3069\n132799,663\n132801,1983\n132802,647\n132803,146\n132804,344\n132805,1452\n132806,355\n132807,132808\n132811,422\n132812,56\n132813,1118\n132814,649\n132815,358\n132816,875\n132817,2411\n132818,298\n132819,485\n132821,2353\n132823,200\n132823,372\n132823,805\n132824,146\n132825,647\n132826,344\n132827,500\n132828,1962\n132829,1052\n132830,1882\n132831,2775\n132832,54\n132833,76096\n132834,2411\n132835,868\n132836,255\n132837,875\n132838,10\n132839,30\n132840,1962\n132841,500\n132842,1052\n132843,1882\n132844,2775\n132845,54\n132846,1113\n132847,477\n132848,2931\n132849,7652\n132850,118\n132850,4597\n132851,146\n132852,647\n132853,344\n132855,298\n132856,485\n132857,1465\n132858,994\n132859,1212\n132862,422\n132865,298\n132866,485\n132867,200\n132868,34\n132868,35\n132868,222\n132868,389\n132868,455\n132868,536\n132868,657\n132869,479\n132871,298\n132872,485\n132873,1467\n132874,209\n132875,579\n132876,873\n132877,994\n132879,1332\n132880,104\n132880,136\n132880,275\n132880,298\n132880,379\n132880,408\n132880,626\n132880,694\n132880,736\n132880,801\n132880,859\n132880,873\n132880,934\n132880,980\n132880,1070\n132880,1140\n132880,1143\n132880,1220\n132880,1222\n132880,1309\n132880,1368\n132880,1424\n132880,1881\n132880,2105\n132880,2209\n132880,2224\n132880,2266\n132880,2750\n132880,3367\n132880,3370\n132880,3507\n132880,7117\n132880,9457\n132880,14453\n132880,193578\n132881,422\n132883,481\n132884,104\n132884,134\n132884,135\n132885,132886\n132887,83\n132888,333\n132890,147\n132891,347\n132891,356\n132893,1556\n132894,1007\n132895,1241\n132896,588\n132896,590\n132896,8180\n132897,132898\n132899,192\n132900,225\n132901,809\n132902,83\n132903,192\n132903,30331\n132905,187\n132906,1590\n132907,422\n132908,467\n132909,136\n132910,1707\n132911,146\n132912,647\n132913,344\n132914,132915\n132916,994\n132917,1210\n132917,1801\n132918,718\n132919,994\n132920,195\n132921,134\n132921,205627\n132922,59931\n132922,84257\n132923,20\n132923,30\n132923,403\n132923,602\n132923,762\n132923,794\n132923,849\n132923,1016\n132923,1607\n132923,1805\n132923,142405\n132926,652\n132927,592\n132928,332\n132929,406\n132932,146\n132933,647\n132934,344\n132935,119\n132935,75912\n132936,875\n132937,119\n132939,422\n132941,306\n132941,307\n132943,209\n132944,132945\n132946,408\n132947,1323\n132948,102\n132949,1326\n132950,631\n132950,84257\n132952,1\n132952,149\n132952,406\n132953,1\n132954,477\n132955,30\n132956,175\n132957,298\n132958,146\n132959,647\n132960,344\n132961,1282\n132963,30\n132964,1515\n132966,422\n132968,422\n132969,509\n132970,422\n132971,4252\n132972,3111\n132973,120\n132974,30\n132975,422\n132976,422\n132977,918\n132978,22\n132979,485\n132980,298\n132981,30\n132982,422\n132983,1634\n132984,72\n132985,344\n132986,285\n132987,932\n132988,422\n132989,875\n132990,875\n132991,22\n132992,1326\n132992,2353\n132993,422\n132994,44\n132995,30\n132996,7155\n132997,1085\n132998,264\n132998,2779\n132998,16687\n132998,57354\n132999,1983\n133000,3585\n133001,133002\n133005,306\n133005,307\n133005,406\n133005,620\n133005,779\n133005,1515\n133005,8244\n133006,422\n133007,875\n133008,1332\n133009,422\n133010,875\n133011,22\n133012,5034\n133013,422\n133014,294\n133015,104\n133015,557\n133015,953\n133015,954\n133016,137\n133017,422\n133018,30\n133019,309\n133019,310\n133019,483\n133020,818\n133022,133023\n133024,536\n133024,2784\n133024,7698\n133025,72\n133026,344\n133027,285\n133028,22\n133029,30\n133030,389\n133031,406\n133032,422\n133033,147\n133035,422\n133036,133037\n133038,422\n133039,579\n133040,422\n133041,22\n133042,1127\n133042,1893\n133042,5547\n133042,49057\n133043,422\n133044,217\n133044,1085\n133044,1417\n133045,259\n133046,1\n133046,500\n133047,309\n133047,310\n133048,1012\n133049,1860\n133050,133051\n133052,422\n133053,907\n133054,1181\n133055,483\n133056,1860\n133057,422\n133058,30\n133059,422\n133060,56\n133061,422\n133062,358\n133063,422\n133064,422\n133065,422\n133066,422\n133067,81\n133068,422\n133069,422\n133070,422\n133071,422\n133072,1579\n133072,2312\n133072,2626\n133073,592\n133074,422\n133075,222\n133076,30\n133077,388\n133078,136\n133079,133080\n133081,4678\n133082,146\n133083,647\n133084,344\n133086,222\n133087,827\n133087,1033\n133088,417\n133089,422\n133090,56\n133091,518\n133091,3260\n133092,217\n133093,433\n133094,22\n133095,312\n133096,133097\n133098,509\n133100,83\n133101,202\n133102,178\n133104,875\n133105,134\n133105,222\n133105,283\n133106,1984\n133107,1425\n133108,133109\n133110,1127\n133110,1551\n133110,1893\n133111,372\n133111,631\n133112,440\n133112,538\n133113,120\n133114,251\n133114,516\n133115,133116\n133117,22\n133118,240\n133118,818\n133118,1240\n133119,1127\n133120,30\n133121,63\n133123,422\n133124,22\n133125,477\n133126,175\n133127,422\n133128,422\n133129,422\n133130,422\n133131,422\n133132,15748\n133133,79\n133134,10\n133135,364\n133136,1425\n133137,1133\n133138,1749\n133138,3585\n133139,32\n133139,392\n133139,644\n133139,697\n133139,3003\n133140,22\n133141,103860\n133142,217\n133144,133145\n133144,134190\n133144,139005\n133144,140942\n133144,141123\n133144,141209\n133144,189235\n133146,22\n133147,649\n133148,422\n133149,133150\n133151,1212\n133153,301\n133154,1247\n133155,1381\n133156,422\n133157,133158\n133157,151641\n133157,202100\n133157,222966\n133157,226224\n133157,229424\n133157,234537\n133157,241459\n133157,250462\n133160,1052\n133160,2626\n133161,333\n133162,136\n133163,7\n133163,3846\n133164,346\n133165,133166\n133167,509\n133167,510\n133167,1332\n133168,10\n133169,133170\n133172,10\n133174,406\n133175,422\n133176,133177\n133178,1531\n133179,22\n133180,133181\n133182,422\n133183,192\n133183,602\n133183,663\n133183,5726\n133184,422\n133185,56\n133186,957\n133187,957\n133188,1454\n133188,21982\n133189,133190\n133189,142704\n133189,173172\n133189,184712\n133192,957\n133193,957\n133194,577\n133196,392\n133197,171\n133198,158\n133199,1531\n133200,133201\n133200,136684\n133200,181310\n133200,184163\n133202,392\n133203,852\n133203,1722\n133203,21982\n133204,264\n133205,133206\n133207,133208\n133209,557\n133210,557\n133211,344\n133212,72\n133213,285\n133214,133215\n133216,22\n133217,640\n133218,240\n133219,422\n133220,762\n133221,718\n133222,1\n133223,602\n133224,255\n133225,72\n133226,344\n133227,285\n133230,2590\n133235,422\n133236,5101\n133237,872\n133239,298\n133240,485\n133241,133242\n133243,298\n133244,485\n133245,2353\n133246,1359\n133247,671\n133249,133249\n133250,5101\n133251,149\n133252,994\n133253,79\n133254,72\n133255,344\n133256,285\n133257,151\n133258,206\n133259,885\n133259,13704\n133260,298\n133261,485\n133262,422\n133263,3623\n133264,994\n133265,133266\n133267,525\n133268,209\n133269,1309\n133270,1116\n133271,422\n133272,631\n133273,422\n133274,294\n133275,422\n133276,133277\n133278,422\n133279,1368\n133279,1639\n133280,30\n133281,10\n133282,422\n133283,83\n133284,891\n133285,875\n133286,133287\n133288,760\n133288,943\n133288,1149\n133289,252\n133290,1177\n133291,640\n133293,264\n133294,202\n133295,620\n133295,8244\n133296,1007\n133297,37\n133298,133299\n133300,175\n133301,298\n133302,1556\n133303,133304\n133305,30\n133306,192\n133307,1381\n133308,422\n133309,372\n133309,390\n133309,1085\n133311,3258\n133312,3246\n133314,862\n133314,1085\n133314,2590\n133315,481\n133316,134\n133317,222\n133318,602\n133319,302\n133320,133321\n133322,422\n133323,422\n133325,133326\n133325,133425\n133327,163\n133327,868\n133327,21442\n133328,133329\n133330,298\n133331,1663\n133331,6824\n133332,673\n133333,422\n133334,422\n133335,422\n133336,422\n133337,422\n133338,422\n133339,133340\n133341,422\n133342,422\n133343,422\n133344,422\n133345,1983\n133346,233\n133347,1425\n133348,346\n133349,302\n133349,861\n133349,893\n133349,1556\n133350,602\n133351,422\n133352,30\n133353,1276\n133354,3258\n133355,346\n133356,406\n133357,346\n133359,58\n133360,994\n133361,46\n133362,366\n133363,366\n133364,868\n133364,1085\n133366,83\n133367,346\n133368,104\n133368,1118\n133369,355\n133370,58\n133371,994\n133372,46\n133374,1392\n133375,433\n133376,868\n133377,22\n133378,1326\n133379,868\n133380,1722\n133381,392\n133382,298\n133383,485\n133385,30\n133387,577\n133388,364\n133389,364\n133390,19443\n133391,994\n133392,72\n133393,118336\n133394,364\n133396,452\n133397,1247\n133398,184\n133399,1001\n133400,346\n133401,422\n133402,577\n133403,994\n133404,843\n133405,743\n133406,133407\n133408,805\n133409,298\n133410,485\n133411,985\n133412,298\n133413,485\n133414,287\n133415,422\n133416,22\n133417,269\n133417,346\n133417,1052\n133417,1085\n133418,447\n133419,240\n133419,784\n133419,805\n133419,943\n133419,1359\n133419,2205\n133419,33424\n133420,422\n133421,2574\n133422,1204\n133423,22\n133424,22\n133426,805\n133427,1858\n133428,1860\n133429,994\n133430,1860\n133431,1858\n133432,843\n133433,392\n133433,467\n133434,932\n133434,996\n133434,1010\n133435,25348\n133435,101688\n133436,422\n133437,3321\n133438,133439\n133441,298\n133442,485\n133444,2574\n133445,483\n133446,298\n133447,485\n133448,1776\n133449,298\n133450,485\n133451,68069\n133453,301\n133454,195\n133455,2775\n133456,447\n133457,104\n133458,1432\n133458,133527\n133459,634\n133461,417\n133462,435\n133462,440\n133463,1955\n133464,1566\n133465,422\n133466,868\n133467,58\n133468,994\n133469,46\n133470,422\n133471,2480\n133472,874\n133473,2989\n133473,2991\n133474,264\n133474,1151\n133475,422\n133476,1722\n133477,422\n133478,287\n133479,726\n133480,392\n133482,422\n133483,37\n133483,1740\n133486,2168\n133487,55849\n133488,34\n133488,35\n133488,18831\n133489,8072\n133490,994\n133491,298\n133492,485\n133493,4545\n133494,2775\n133495,447\n133496,422\n133497,56\n133498,657\n133498,5326\n133499,868\n133500,872\n133501,538\n133502,298\n133503,485\n133504,83\n133505,422\n133506,83\n133507,422\n133508,422\n133509,133510\n133511,195\n133512,422\n133513,994\n133514,422\n133515,147\n133515,192\n133515,406\n133515,1181\n133516,175\n133517,298\n133518,298\n133519,485\n133520,42\n133521,994\n133522,516\n133523,63\n133524,133525\n133526,63\n133528,422\n133529,994\n133530,298\n133531,485\n133533,994\n133534,72\n133535,1608\n133537,34\n133537,35\n133538,200\n133538,1462\n133538,8537\n133540,15\n133540,2260\n133541,850\n133541,1453\n133542,326\n133544,175\n133545,167\n133545,762\n133545,783\n133545,1241\n133546,104\n133547,298\n133548,467\n133549,1370\n133550,278\n133551,298\n133552,485\n133553,59\n133553,79\n133553,138\n133553,3794\n133555,693\n133557,717\n133557,1782\n133558,192\n133559,133560\n133562,408\n133563,1323\n133564,102\n133565,1326\n133566,388\n133566,518\n133566,6638\n133567,2989\n133567,2991\n133568,422\n133569,56\n133570,2701\n133571,133572\n133573,160\n133574,994\n133575,209\n133575,302\n133575,571\n133575,893\n133575,1849\n133577,481\n133578,422\n133579,72\n133580,1417\n133580,1796\n133581,305\n133583,118\n133583,4597\n133586,805\n133588,175\n133589,2371\n133590,720\n133591,206\n133592,298\n133594,292\n133595,130\n133596,1608\n133597,3769\n133598,30\n133599,852\n133600,133601\n133603,30\n133604,133605\n133606,301\n133606,592\n133606,919\n133606,1955\n133606,2557\n133607,133608\n133609,30\n133610,107\n133611,83\n133612,1359\n133613,2416\n133613,2417\n133614,292\n133615,338\n133616,298\n133617,852\n133618,422\n133619,1368\n133620,1133\n133621,30\n133622,3538\n133623,1326\n133625,1210\n133626,406\n133627,111142\n133630,1\n133631,1452\n133632,422\n133633,58\n133634,994\n133635,46\n133636,4895\n133637,422\n133638,515\n133640,1359\n133641,422\n133642,83\n133643,408\n133644,1801\n133645,30\n133646,422\n133647,1001\n133647,3094\n133648,805\n133649,4748\n133650,1858\n133651,1860\n133652,1282\n133653,422\n133654,72\n133655,344\n133656,285\n133657,30\n133658,30\n133659,3623\n133660,422\n133661,30\n133662,422\n133663,30\n133664,3623\n133665,852\n133666,200\n133666,2443\n133667,301\n133668,1001\n133669,4193\n133670,843\n133671,779\n133673,577\n133674,77\n133675,292\n133676,175\n133677,422\n133678,56\n133679,422\n133680,2460\n133681,298\n133682,485\n133683,298\n133684,422\n133685,56\n133686,133687\n133688,640\n133689,34\n133689,35\n133689,13980\n133690,1127\n133690,6837\n133691,422\n133692,602\n133693,422\n133694,422\n133695,422\n133696,422\n133697,422\n133698,422\n133699,422\n133701,422\n133702,1016\n133702,2210\n133702,4237\n133703,422\n133704,30\n133705,136\n133706,147\n133706,158\n133707,1220\n133707,1222\n133708,133709\n133710,133709\n133711,920\n133712,130897\n133715,217\n133715,283\n133715,388\n133715,392\n133715,862\n133715,949\n133715,1240\n133715,1454\n133715,1465\n133715,1564\n133715,2274\n133715,4637\n133715,8180\n133716,422\n133717,422\n133718,3623\n133719,133720\n133721,422\n133722,34\n133722,536\n133723,24505\n133724,133725\n133726,422\n133727,442\n133728,195\n133729,2371\n133730,455\n133732,818\n133733,602\n133734,393\n133735,406\n133736,422\n133737,422\n133738,133739\n133740,422\n133741,355\n133742,422\n133743,422\n133744,861\n133746,422\n133747,920\n133748,422\n133749,422\n133750,422\n133751,422\n133752,422\n133753,175\n133754,298\n133755,483\n133756,668\n133757,422\n133758,1858\n133759,1860\n133760,515\n133761,994\n133762,422\n133763,2867\n133763,2868\n133765,278\n133766,13980\n133767,850\n133768,3\n133768,240\n133768,590\n133769,140\n133770,435\n133771,3623\n133772,736\n133772,1370\n133773,3252\n133774,18831\n133775,298\n133776,485\n133778,158\n133779,3252\n133780,1556\n133781,557\n133782,267\n133783,140\n133784,752\n133785,783\n133786,920\n133787,843\n133788,1572\n133789,79\n133790,133791\n133792,1707\n133793,195\n133794,557\n133795,557\n133796,298\n133797,485\n133798,422\n133799,493\n133799,586\n133799,1265\n133799,1266\n133799,1370\n133800,217\n133801,2797\n133802,56\n133803,422\n133804,536\n133805,302\n133806,240\n133807,2224\n133808,133809\n133810,313\n133811,55849\n133812,41\n133813,133814\n133815,2989\n133815,2991\n133816,393\n133817,712\n133818,171\n133819,79\n133820,1368\n133821,934\n133822,435\n133823,41\n133824,269\n133826,2574\n133827,1551\n133829,34\n133829,35\n133830,2646\n133832,1085\n133833,104\n133836,10\n133836,2574\n133837,447\n133838,2775\n133839,602\n133840,171\n133841,133842\n133843,1805\n133844,4805\n133845,2775\n133846,447\n133847,2744\n133848,289\n133848,290\n133848,2868\n133848,94134\n133849,133850\n133851,1566\n133852,133853\n133854,1181\n133856,298\n133857,485\n133858,133859\n133858,138187\n133858,139899\n133858,149982\n133860,133861\n133862,133863\n133864,3623\n133865,602\n133866,133867\n133868,133869\n133870,52270\n133871,483\n133872,130\n133872,1551\n133873,1085\n133873,2590\n133875,22\n133876,267\n133877,671\n133878,422\n133879,1001\n133881,422\n133882,133883\n133882,171513\n133882,184284\n133882,237089\n133882,239437\n133884,422\n133885,422\n133886,133887\n133888,1010\n133888,1012\n133889,346\n133890,392\n133891,1515\n133892,192\n133892,663\n133893,3695\n133894,233\n133895,422\n133896,422\n133897,422\n133898,1238\n133899,422\n133900,133901\n133902,422\n133903,422\n133904,422\n133905,422\n133906,422\n133907,422\n133908,133909\n133910,133909\n133911,133909\n133912,133909\n133913,133909\n133914,422\n133915,1452\n133916,133917\n133918,422\n133919,355\n133920,929\n133921,209\n133922,439\n133923,422\n133924,15\n133926,422\n133927,264\n133928,422\n133929,1359\n133930,422\n133931,931\n133932,133933\n133932,155600\n133934,133935\n133936,704\n133937,58\n133938,994\n133939,46\n133940,862\n133941,292\n133942,58\n133943,994\n133944,46\n133945,422\n133947,79\n133948,592\n133949,422\n133950,133951\n133952,422\n133953,3623\n133954,931\n133955,1285\n133956,485\n133957,473\n133957,3003\n133958,209\n133959,442\n133959,694\n133959,749\n133959,2775\n133959,136072\n133960,647\n133960,835\n133960,1522\n133961,192\n133962,338\n133963,779\n133963,68069\n133964,133965\n133966,133966\n133967,31977\n133968,2574\n133969,89035\n133970,209\n133972,298\n133973,485\n133974,2572\n133975,1715\n133976,3079\n133977,1807\n133978,752\n133978,10216\n133978,29009\n133978,133784\n133978,227348\n133979,801\n133980,147\n133983,333\n133983,60576\n133984,1326\n133985,994\n133986,422\n133987,56\n133990,626\n133991,422\n133992,1293\n133993,422\n133994,133995\n133994,137951\n133996,313\n133997,422\n133998,3623\n133999,134000\n134001,134002\n134003,280\n134003,980\n134003,17245\n134004,481\n134005,422\n134007,994\n134008,422\n134009,868\n134010,920\n134011,422\n134012,422\n134013,3623\n134014,422\n134015,13136\n134016,422\n134017,994\n134018,175\n134019,298\n134020,55849\n134022,422\n134023,68\n134023,6119\n134024,8820\n134025,422\n134026,2926\n134027,8072\n134028,140\n134029,422\n134031,422\n134032,56\n134034,827\n134035,178\n134036,406\n134037,134038\n134041,1188\n134042,389\n134042,1858\n134042,2671\n134042,4637\n134042,7698\n134042,40566\n134042,148742\n134043,422\n134044,422\n134045,56\n134046,422\n134048,809\n134049,422\n134050,200\n134051,422\n134052,1509\n134053,422\n134054,7698\n134055,58\n134056,4672\n134056,18831\n134057,158\n134057,779\n134058,222\n134059,46\n134060,422\n134061,422\n134062,83\n134063,309\n134063,310\n134064,994\n134065,134066\n134067,287\n134067,809\n134067,19010\n134068,299\n134068,1243\n134068,90845\n134069,83\n134070,134071\n134072,134071\n134073,134071\n134074,134071\n134075,134071\n134076,134071\n134077,134071\n134078,134071\n134079,783\n134079,3207\n134080,920\n134080,1181\n134080,4545\n134080,139010\n134081,1068\n134082,58\n134083,994\n134084,46\n134085,563\n134086,1858\n134087,1860\n134088,422\n134091,2209\n134092,636\n134093,1033\n134094,422\n134095,2436\n134096,3623\n134097,356\n134097,1580\n134099,83\n134100,113156\n134101,83\n134103,726\n134104,422\n134105,509\n134107,1858\n134108,1860\n134110,422\n134112,134113\n134114,663\n134115,332\n134116,875\n134117,994\n134118,1353\n134119,422\n134120,56\n134121,1551\n134122,422\n134123,422\n134124,56\n134125,515\n134126,195\n134127,1298\n134128,146\n134129,647\n134130,344\n134131,408\n134132,1323\n134133,102\n134134,1326\n134135,72\n134136,994\n134137,37\n134138,195\n134139,340\n134140,1285\n134140,1888\n134140,5933\n134140,40566\n134141,1556\n134142,1776\n134143,835\n134143,1522\n134144,333\n134145,784\n134146,2116\n134147,217\n134147,420\n134147,515\n134147,1453\n134147,1579\n134147,1722\n134147,1893\n134147,2626\n134147,4039\n134148,2557\n134149,175\n134150,72\n134151,422\n134152,422\n134153,298\n134155,3507\n134156,994\n134157,134158\n134159,422\n134160,56\n134162,1381\n134163,79\n134164,503\n134164,1257\n134165,1749\n134166,907\n134167,1631\n134168,536\n134168,7092\n134168,40566\n134169,422\n134170,134171\n134172,3623\n134173,406\n134174,222\n134175,134176\n134177,852\n134179,167\n134179,2083\n134179,128922\n134180,1858\n134181,1860\n134182,366\n134183,302\n134183,663\n134184,1801\n134186,422\n134187,1210\n134187,1544\n134187,2083\n134188,1801\n134189,7155\n134191,1001\n134192,422\n134193,1634\n134194,287\n134194,809\n134194,19010\n134195,1359\n134196,134197\n134198,333\n134200,134201\n134202,83\n134202,1467\n134203,809\n134204,422\n134205,34\n134205,35\n134205,222\n134205,536\n134205,2266\n134206,1241\n134207,422\n134208,118\n134208,4597\n134209,72\n134210,422\n134211,422\n134212,337\n134212,623\n134212,3367\n134212,27041\n134213,422\n134214,72\n134215,422\n134216,422\n134217,422\n134218,422\n134219,422\n134220,422\n134221,422\n134222,206\n134223,1590\n134224,422\n134225,422\n134227,3260\n134228,1033\n134229,919\n134230,134231\n134232,422\n134233,175\n134234,113156\n134235,422\n134236,2371\n134237,298\n134238,68069\n134239,557\n134240,393\n134241,422\n134242,652\n134243,422\n134244,1151\n134245,1837\n134246,422\n134247,338\n134248,422\n134249,536\n134249,18831\n134250,20771\n134251,801\n134252,202\n134252,1623\n134252,2371\n134253,298\n134254,485\n134255,801\n134256,163\n134257,693\n134258,298\n134259,485\n134260,8854\n134261,134262\n134261,138368\n134261,141482\n134261,151685\n134261,161004\n134263,298\n134264,485\n134265,37\n134266,195\n134267,536\n134268,3623\n134269,422\n134270,136\n134270,557\n134270,920\n134270,1368\n134270,1623\n134271,557\n134273,298\n134274,485\n134275,422\n134276,1285\n134277,861\n134278,3623\n134279,175\n134280,298\n134281,557\n134282,195\n134283,493\n134285,622\n134286,50\n134287,422\n134288,134289\n134290,577\n134290,138686\n134291,37\n134291,1231\n134292,422\n134293,392\n134294,3135\n134295,30\n134296,422\n134298,685\n134299,30\n134300,30\n134301,30\n134302,994\n134303,663\n134304,30\n134305,30\n134306,433\n134307,30\n134309,5405\n134310,30\n134311,134312\n134313,3\n134314,477\n134315,1001\n134316,424\n134317,900\n134318,134319\n134320,8854\n134321,781\n134322,602\n134323,30\n134324,3069\n134325,1983\n134326,483\n134327,422\n134328,56\n134329,298\n134329,714\n134330,147\n134331,134332\n134333,134334\n134335,422\n134336,422\n134337,885\n134337,13704\n134338,22\n134339,134340\n134341,1179\n134341,2923\n134341,3695\n134342,4\n134342,5\n134343,134344\n134345,809\n134346,4545\n134346,139010\n134347,2867\n134347,2868\n134348,255\n134349,134350\n134351,298\n134352,485\n134353,138\n134354,865\n134355,137\n134356,118\n134356,4597\n134357,557\n134358,8719\n134359,88820\n134360,577\n134361,134362\n134361,139102\n134361,170831\n134361,214364\n134361,262219\n134363,240\n134363,301\n134363,592\n134363,615\n134363,968\n134363,1785\n134363,1818\n134363,2620\n134363,5718\n134364,134365\n134366,134367\n134368,1556\n134369,557\n134370,422\n134371,557\n134372,557\n134373,422\n134374,557\n134375,422\n134376,5906\n134377,557\n134378,278\n134379,626\n134380,137\n134381,862\n134382,485\n134383,298\n134384,149\n134385,134386\n134387,420\n134388,298\n134389,485\n134390,1782\n134391,134392\n134393,1363\n134394,79\n134395,602\n134396,843\n134397,422\n134400,34\n134400,35\n134400,313\n134401,222\n134402,422\n134403,1252\n134403,1253\n134404,422\n134405,134406\n134408,422\n134409,422\n134410,113156\n134411,2146\n134412,422\n134413,72\n134414,344\n134415,285\n134416,602\n134417,31977\n134418,994\n134421,2775\n134422,447\n134423,422\n134424,1462\n134424,8537\n134425,1983\n134426,647\n134427,1983\n134428,34\n134428,35\n134428,1417\n134429,3\n134429,233\n134429,304\n134429,328\n134429,347\n134429,682\n134429,893\n134429,1458\n134429,1511\n134429,3069\n134429,72439\n134430,3623\n134431,83\n134432,9537\n134433,124734\n134434,859\n134435,134436\n134437,1949\n134438,392\n134438,918\n134440,4\n134440,5\n134441,602\n134442,422\n134443,289\n134443,290\n134443,94134\n134444,6303\n134445,30\n134446,134447\n134448,195\n134449,422\n134450,134451\n134452,134453\n134454,134455\n134456,850\n134457,422\n134458,422\n134459,366\n134460,366\n134461,366\n134462,366\n134463,366\n134464,366\n134465,366\n134466,304\n134467,134468\n134469,134470\n134471,422\n134472,422\n134474,1531\n134475,134476\n134477,192\n134478,233\n134479,134480\n134479,136375\n134481,873\n134481,1801\n134481,3182\n134482,132387\n134483,422\n134484,255\n134485,16153\n134486,355\n134487,467\n134487,516\n134487,1385\n134488,134489\n134491,22\n134494,872\n134495,1860\n134496,835\n134497,392\n134497,1860\n134498,1149\n134498,1782\n134498,2116\n134498,2411\n134499,30\n134500,1089\n134501,736\n134502,30\n134505,1949\n134506,1860\n134506,6955\n134507,202\n134507,1085\n134508,602\n134509,30\n134510,422\n134511,298\n134512,485\n134513,146\n134514,602\n134515,134516\n134517,440\n134518,588\n134518,590\n134519,393\n134520,22\n134521,302\n134521,861\n134521,893\n134524,283\n134525,1512\n134525,5992\n134526,2416\n134526,2417\n134528,718\n134529,602\n134530,657\n134531,252\n134532,602\n134533,1608\n134534,649\n134535,1983\n134536,195\n134537,261\n134540,83\n134541,1983\n134542,602\n134543,760\n134543,1631\n134544,83\n134545,483\n134545,1058\n134545,1559\n134545,8149\n134546,298\n134547,485\n134548,718\n134549,668\n134550,1007\n134551,602\n134552,1983\n134554,344\n134555,72\n134556,285\n134557,422\n134558,602\n134560,714\n134561,481\n134562,167\n134562,73570\n134563,22\n134564,22\n134565,422\n134566,175\n134567,346\n134567,1877\n134568,298\n134569,264\n134569,16687\n134570,1181\n134570,1531\n134571,509\n134572,195\n134573,3260\n134574,779\n134575,3769\n134576,1285\n134576,1888\n134577,104\n134578,346\n134579,1580\n134580,2926\n134581,192\n134582,83\n134583,3209\n134584,301\n134584,868\n134585,875\n134586,134587\n134589,55849\n134590,875\n134592,134593\n134594,1860\n134595,1858\n134596,3623\n134597,222\n134597,389\n134597,1608\n134597,7757\n134597,13361\n134598,422\n134601,422\n134602,1130\n134602,5213\n134603,422\n134604,422\n134605,422\n134606,422\n134607,422\n134608,422\n134609,422\n134610,422\n134611,3\n134612,422\n134613,422\n134614,422\n134615,1556\n134616,422\n134617,422\n134618,422\n134619,48\n134619,56\n134619,252\n134619,408\n134619,422\n134619,652\n134619,1052\n134619,1465\n134619,1644\n134619,2312\n134619,2315\n134619,189839\n134619,215276\n134622,175\n134623,422\n134624,298\n134626,422\n134627,97\n134630,219\n134631,222\n134632,66297\n134633,217\n134633,1417\n134636,83\n134637,5591\n134638,219\n134642,1370\n134643,287\n134644,83\n134645,422\n134647,1149\n134648,422\n134651,195\n134651,1515\n134652,171\n134653,422\n134654,56\n134655,1818\n134656,1293\n134657,55849\n134658,1579\n134658,1659\n134659,333\n134659,60576\n134663,55849\n134664,346\n134665,13136\n134666,134667\n134669,304\n134671,1147\n134672,809\n134672,973\n134672,1010\n134672,1085\n134672,112722\n134672,134672\n134672,161880\n134672,220728\n134672,220729\n134672,220732\n134673,779\n134673,68069\n134675,422\n134676,6955\n134677,252\n134677,516\n134678,1968\n134679,1968\n134680,111\n134681,579\n134681,893\n134681,1556\n134681,1659\n134681,221828\n134682,134683\n134684,783\n134686,408\n134687,1323\n134688,1326\n134689,102\n134690,346\n134691,760\n134692,1608\n134693,83\n134694,140\n134694,3003\n134695,733\n134697,720\n134698,346\n134699,147\n134700,433\n134701,99\n134702,718\n134705,1019\n134707,346\n134708,31977\n134708,134709\n134710,422\n134711,56\n134712,1858\n134713,1860\n134714,1858\n134715,1860\n134717,433\n134718,392\n134720,760\n134721,1858\n134722,30\n134723,1551\n134724,973\n134725,3193\n134726,1454\n134727,1007\n134728,13538\n134730,2750\n134731,994\n134733,980\n134734,2244\n134734,80266\n134735,1370\n134737,175\n134738,298\n134739,422\n134740,920\n134741,485\n134742,298\n134743,30\n134744,346\n134746,1252\n134746,1253\n134748,483\n134748,577\n134748,1130\n134748,2373\n134748,4165\n134748,192522\n134749,83\n134750,392\n134750,697\n134750,875\n134751,30\n134752,422\n134755,392\n134756,298\n134757,485\n134759,200\n134761,5405\n134762,1181\n134763,483\n134764,1985\n134765,422\n134766,467\n134767,422\n134768,435\n134769,1415\n134770,83\n134771,422\n134773,287\n134773,809\n134773,19010\n134775,175\n134776,422\n134777,809\n134778,439\n134779,211\n134780,298\n134781,158\n134782,422\n134783,1326\n134784,192\n134785,34\n134785,35\n134786,346\n134787,346\n134789,422\n134790,422\n134791,422\n134792,622\n134793,422\n134794,1590\n134795,285\n134796,1515\n134800,37\n134801,422\n134802,467\n134803,1983\n134804,134805\n134806,83\n134807,304\n134808,623\n134809,134810\n134811,134810\n134812,175\n134813,55849\n134814,298\n134815,422\n134816,1983\n134817,636\n134818,422\n134819,422\n134820,3111\n134821,422\n134823,134824\n134825,1983\n134826,346\n134827,422\n134828,602\n134829,134830\n134829,227852\n134831,31977\n134832,30\n134833,586\n134834,557\n134835,1072\n134836,652\n134837,1858\n134838,1860\n134840,885\n134840,13704\n134841,211\n134842,435\n134844,439\n134847,30\n134848,129412\n134849,134850\n134851,422\n134852,1019\n134853,557\n134854,134855\n134856,1515\n134857,3623\n134858,875\n134859,422\n134860,843\n134861,346\n134862,602\n134863,2367\n134866,2048\n134867,301\n134867,615\n134867,968\n134867,1832\n134867,1837\n134867,2083\n134867,3756\n134870,422\n134871,2083\n134871,128922\n134872,219\n134874,422\n134875,422\n134876,30\n134877,557\n134878,557\n134879,557\n134881,862\n134882,640\n134883,31977\n134883,141176\n134884,631\n134885,298\n134886,485\n134887,346\n134888,663\n134889,602\n134890,2073\n134892,134893\n134894,358\n134895,422\n134896,422\n134897,422\n134898,422\n134899,422\n134900,422\n134901,422\n134902,30\n134903,5366\n134904,200\n134904,240\n134904,592\n134904,1462\n134904,8180\n134904,8537\n134905,704\n134907,1085\n134908,631\n134910,134911\n134912,422\n134913,949\n134914,81233\n134915,333\n134916,298\n134917,485\n134918,1522\n134919,1556\n134920,30\n134921,2116\n134922,30\n134923,202\n134924,30\n134925,30\n134926,134927\n134928,30\n134929,217\n134929,1417\n134930,30\n134931,422\n134932,134933\n134932,139204\n134932,144401\n134934,346\n134935,30\n134936,602\n134937,392\n134937,918\n134938,134939\n134938,164691\n134940,602\n134941,602\n134942,422\n134944,422\n134945,134946\n134947,422\n134948,718\n134949,422\n134950,422\n134951,271\n134952,134953\n134954,2443\n134955,577\n134956,30\n134957,240\n134959,134960\n134959,138818\n134959,152742\n134961,2421\n134962,134963\n134964,872\n134965,1515\n134966,422\n134969,30\n134970,422\n134971,422\n134972,171\n134973,422\n134974,83\n134975,1359\n134976,264\n134977,30\n134978,134979\n134980,30\n134981,1381\n134982,779\n134983,634\n134985,240\n134986,406\n134987,134988\n134989,30\n134990,30\n134991,30\n134992,83\n134993,422\n134994,83\n134995,134996\n134997,2590\n134998,200\n134999,30\n135000,30\n135001,207\n135002,346\n135003,135004\n135005,34\n135005,35\n135006,1007\n135007,135008\n135009,135010\n135011,135010\n135012,872\n135013,1429\n135015,668\n135016,135017\n135016,147063\n135016,157147\n135016,172892\n135016,178760\n135016,226373\n135016,233207\n135016,257451\n135016,257787\n135018,1849\n135019,310\n135019,779\n135019,861\n135019,1313\n135019,1332\n135019,1688\n135019,5375\n135019,8868\n135020,30\n135021,693\n135021,1033\n135021,9018\n135021,20813\n135022,79\n135022,252\n135022,333\n135023,44\n135023,676\n135023,850\n135023,1722\n135023,1955\n135023,2697\n135023,8990\n135023,17588\n135023,32475\n135024,422\n135025,135026\n135027,72\n135028,135029\n135030,4545\n135030,139010\n135031,422\n135032,422\n135033,255\n135034,2367\n135035,422\n135036,310\n135037,135038\n135039,1012\n135040,536\n135040,7698\n135042,30\n135044,30\n135046,135047\n135048,355\n135049,233\n135050,1143\n135051,1983\n135052,135053\n135054,298\n135055,485\n135056,344\n135057,285\n135058,72\n135059,333\n135062,192\n135064,135065\n135066,1659\n135067,422\n135069,83\n135070,63\n135071,2367\n135073,1359\n135074,124668\n135077,2944\n135079,178\n135080,1238\n135081,417\n135081,1564\n135082,417\n135082,1564\n135083,372\n135085,83\n135088,1983\n135089,622\n135090,30\n135091,422\n135092,602\n135093,703\n135095,58\n135097,602\n135098,1381\n135098,1715\n135100,440\n135101,931\n135102,424\n135103,1276\n135105,1119\n135106,649\n135107,1285\n135108,2779\n135109,1983\n135110,2574\n135112,515\n135113,366\n135114,366\n135115,872\n135116,366\n135117,366\n135118,433\n135119,366\n135120,366\n135121,6323\n135122,366\n135123,86\n135125,2572\n135126,422\n135127,298\n135128,485\n135129,222\n135130,838\n135130,1012\n135130,1419\n135131,877\n135131,1117\n135132,83\n135133,287\n135133,809\n135133,19010\n135134,4\n135134,5\n135134,65\n135134,72\n135134,87\n135134,97\n135134,178\n135134,184\n135134,192\n135134,206\n135134,209\n135134,217\n135134,296\n135134,301\n135134,302\n135134,304\n135134,305\n135134,333\n135134,340\n135134,346\n135134,406\n135134,431\n135134,435\n135134,440\n135134,444\n135134,479\n135134,515\n135134,516\n135134,536\n135134,589\n135134,595\n135134,622\n135134,631\n135134,652\n135134,736\n135134,801\n135134,809\n135134,835\n135134,841\n135134,861\n135134,872\n135134,918\n135134,920\n135134,932\n135134,968\n135134,994\n135134,996\n135134,1007\n135134,1019\n135134,1058\n135134,1102\n135134,1118\n135134,1177\n135134,1267\n135134,1294\n135134,1326\n135134,1359\n135134,1370\n135134,1381\n135134,1452\n135134,1466\n135134,1531\n135134,1579\n135134,1590\n135134,1677\n135134,1707\n135134,1968\n135134,2017\n135134,2244\n135134,2334\n135134,2443\n135134,2867\n135134,2868\n135134,2979\n135134,5911\n135134,6119\n135134,6303\n135134,7270\n135134,8541\n135134,9018\n135134,14945\n135134,17309\n135134,20359\n135134,54202\n135134,54243\n135134,54272\n135134,54284\n135134,54362\n135135,206\n135136,1452\n135138,592\n135138,1818\n135139,932\n135140,83\n135141,10\n135142,135143\n135144,135143\n135145,37\n135145,46\n135145,68\n135145,86\n135145,167\n135145,217\n135145,240\n135145,264\n135145,299\n135145,301\n135145,312\n135145,349\n135145,372\n135145,388\n135145,390\n135145,392\n135145,435\n135145,444\n135145,510\n135145,518\n135145,536\n135145,589\n135145,615\n135145,626\n135145,631\n135145,717\n135145,720\n135145,744\n135145,775\n135145,818\n135145,832\n135145,862\n135145,877\n135145,907\n135145,932\n135145,968\n135145,972\n135145,973\n135145,1001\n135145,1010\n135145,1012\n135145,1085\n135145,1117\n135145,1122\n135145,1160\n135145,1167\n135145,1210\n135145,1231\n135145,1241\n135145,1284\n135145,1285\n135145,1298\n135145,1319\n135145,1326\n135145,1359\n135145,1370\n135145,1436\n135145,1453\n135145,1462\n135145,1479\n135145,1522\n135145,1531\n135145,1544\n135145,1564\n135145,1715\n135145,1732\n135145,1740\n135145,1782\n135145,1785\n135145,1818\n135145,1832\n135145,1837\n135145,1849\n135145,2045\n135145,2083\n135145,2191\n135145,2205\n135145,2372\n135145,2480\n135145,2557\n135145,2620\n135145,2812\n135145,2979\n135145,2989\n135145,2991\n135145,3207\n135145,3218\n135145,3392\n135145,3422\n135145,3630\n135145,3804\n135145,4146\n135145,5301\n135145,5662\n135145,5718\n135145,8276\n135145,8537\n135145,14819\n135145,32784\n135145,33424\n135145,73570\n135145,103860\n135146,7\n135146,22\n135146,2017\n135146,17309\n135147,872\n135148,994\n135149,1224\n135150,135151\n135152,783\n135153,73938\n135154,344\n135155,72\n135156,285\n135158,79\n135159,781\n135160,1132\n135161,175\n135162,298\n135163,137\n135164,3999\n135164,4066\n135165,481\n135169,79\n135174,720\n135175,1220\n135175,1222\n135176,252\n135177,251\n135178,200\n135181,278\n135182,259\n135187,422\n135188,83\n135189,1860\n135190,1858\n135191,72\n135192,344\n135193,285\n135195,84257\n135197,135198\n135199,79\n135200,135201\n135208,868\n135214,994\n135215,698\n135216,1285\n135217,135218\n135219,31977\n135222,2775\n135223,135224\n135225,135226\n135227,1252\n135227,1253\n135228,809\n135229,1789\n135230,135231\n135233,217\n135233,388\n135233,510\n135233,1240\n135234,83\n135236,685\n135236,841\n135236,911\n135236,973\n135236,2310\n135236,44725\n135238,20\n135238,957\n135238,1815\n135238,4218\n135239,72\n135240,344\n135241,285\n135242,663\n135243,422\n135244,195\n135244,393\n135244,1149\n135246,299\n135246,3207\n135247,1235\n135247,1335\n135248,422\n135249,30331\n135250,3623\n135251,1782\n135252,301\n135253,192\n135253,217\n135253,309\n135253,310\n135254,875\n135255,2979\n135256,340\n135257,107\n135258,97\n135259,1252\n135259,1253\n135260,577\n135261,72\n135262,1522\n135263,1707\n135264,135265\n135266,4355\n135269,1181\n135270,120\n135270,222\n135270,278\n135270,455\n135270,694\n135270,3115\n135270,7768\n135270,13137\n135271,140\n135272,623\n135272,1805\n135273,102560\n135274,215\n135274,278\n135274,301\n135274,328\n135274,694\n135274,1019\n135274,1033\n135274,1282\n135274,1962\n135275,1147\n135277,146\n135278,337\n135279,1844\n135280,135281\n135282,135281\n135283,10\n135284,1122\n135285,120\n135285,1001\n135286,254\n135286,289\n135286,290\n135286,636\n135286,784\n135286,862\n135286,94134\n135288,1001\n135291,422\n135292,422\n135293,56\n135294,56\n135296,422\n135297,135298\n135299,360\n135299,1122\n135300,1608\n135301,3\n135310,1033\n135311,932\n135312,102560\n135313,907\n135314,72\n135316,392\n135319,278\n135319,431\n135322,195\n135322,640\n135322,21487\n135323,200\n135324,344\n135325,285\n135326,72\n135327,72\n135328,344\n135329,285\n135330,3623\n135332,392\n135336,731\n135337,135338\n135340,3623\n135341,50\n135341,406\n135341,622\n135341,141912\n135342,298\n135343,485\n135344,875\n135345,3623\n135346,22\n135347,2209\n135348,602\n135349,602\n135350,135351\n135352,344\n135353,72\n135354,285\n135356,72\n135357,1608\n135358,1257\n135359,72\n135360,72\n135361,439\n135362,72\n135363,20771\n135364,298\n135365,485\n135366,466\n135366,868\n135366,6761\n135366,81233\n135366,106899\n135367,128922\n135368,850\n135371,171\n135372,10\n135373,862\n135374,536\n135375,298\n135376,485\n135377,406\n135378,84257\n135378,118336\n135379,217\n135380,135381\n135382,1707\n135383,862\n135384,118\n135384,450\n135384,4597\n135385,3623\n135386,1564\n135387,72\n135389,178\n135389,439\n135390,579\n135391,455\n135392,135393\n135394,135395\n135396,135397\n135398,875\n135399,175\n135400,298\n135401,72\n135402,240\n135403,483\n135404,809\n135405,30\n135406,557\n135407,135408\n135407,149355\n135407,175816\n135409,6955\n135410,557\n135411,557\n135412,557\n135413,8719\n135414,138\n135415,865\n135416,557\n135417,137\n135418,88820\n135419,118\n135419,4597\n135420,1623\n135421,225\n135422,149\n135423,1623\n135424,3538\n135425,30\n135426,636\n135426,1844\n135427,422\n135428,332\n135429,1882\n135430,850\n135431,457\n135431,497\n135431,535\n135431,676\n135431,918\n135432,72\n135433,344\n135434,285\n135435,135436\n135437,1983\n135438,72\n135439,285\n135440,344\n135441,68069\n135442,135443\n135444,422\n135445,422\n135446,422\n135447,422\n135448,422\n135449,8884\n135451,406\n135451,779\n135452,255\n135453,422\n135454,135455\n135456,83\n135457,135458\n135459,1085\n135460,22\n135461,22\n135462,1052\n135463,175\n135464,298\n135465,87\n135465,200\n135466,135467\n135468,893\n135469,503\n135470,346\n135471,135472\n135473,2590\n135474,135475\n135476,422\n135477,56\n135478,344\n135479,72\n135480,285\n135481,147\n135482,2286\n135483,72\n135484,344\n135485,285\n135488,135489\n135490,135489\n135491,233\n135492,72\n135493,72\n135494,422\n135495,422\n135496,647\n135497,355\n135498,571\n135499,1392\n135503,135504\n135503,149696\n135505,994\n135506,994\n135507,994\n135508,481\n135509,366\n135510,366\n135511,366\n135512,366\n135513,366\n135514,135514\n135515,79\n135516,83\n135517,135518\n135519,422\n135520,422\n135521,994\n135522,422\n135523,138\n135525,422\n135526,1411\n135527,3193\n135528,783\n135529,994\n135530,408\n135531,102\n135532,1323\n135533,1326\n135543,809\n135544,287\n135545,140\n135545,287\n135545,809\n135545,19010\n135550,809\n135558,287\n135558,809\n135558,19010\n135559,287\n135559,809\n135559,19010\n135563,287\n135563,809\n135564,135565\n135566,422\n135567,135568\n135569,255\n135570,932\n135571,251\n135572,118\n135572,4597\n135573,118\n135573,422\n135573,4597\n135574,422\n135575,949\n135576,932\n135577,422\n135578,118\n135578,4597\n135579,422\n135580,422\n135581,113156\n135582,72\n135583,344\n135584,285\n135585,175\n135585,841\n135585,1247\n135586,422\n135587,1415\n135588,422\n135589,422\n135590,135591\n135592,422\n135593,135594\n135595,358\n135596,422\n135597,135598\n135599,422\n135600,422\n135601,602\n135602,1847\n135603,137\n135605,422\n135606,422\n135607,602\n135608,312\n135609,344\n135610,285\n135611,72\n135612,422\n135613,30\n135614,72\n135615,994\n135616,422\n135617,422\n135618,422\n135619,83\n135620,4771\n135621,422\n135623,1479\n135624,390\n135625,718\n135626,1353\n135627,130\n135627,184\n135627,298\n135627,422\n135627,1224\n135628,248\n135628,1631\n135629,135630\n135631,135632\n135633,147\n135635,1388\n135636,135637\n135638,135639\n135640,135641\n135642,135643\n135644,640\n135645,393\n135646,392\n135647,135648\n135649,483\n135650,20\n135650,151\n135650,2923\n135651,31977\n135652,135653\n135654,372\n135655,34\n135655,35\n135655,313\n135656,602\n135657,422\n135658,366\n135659,366\n135660,366\n135661,233\n135662,2367\n135662,8235\n135663,107\n135664,2416\n135664,2417\n135665,292\n135666,338\n135667,298\n135669,1133\n135670,3538\n135671,422\n135672,422\n135673,1238\n135674,422\n135675,355\n135676,147\n135676,622\n135677,151\n135678,1241\n135679,1715\n135680,298\n135681,485\n135682,135683\n135684,135685\n135686,83\n135687,481\n135689,4\n135689,5\n135690,479\n135691,433\n135692,135693\n135694,485\n135695,298\n135696,298\n135697,485\n135699,83\n135700,1241\n135701,130\n135702,422\n135703,422\n135704,422\n135705,422\n135706,158\n135706,252\n135706,622\n135706,862\n135707,72\n135708,113481\n135709,392\n135710,55849\n135711,422\n135712,422\n135713,422\n135714,422\n135715,422\n135716,422\n135717,422\n135718,422\n135719,20004\n135720,422\n135721,433\n135722,137\n135723,422\n135724,135725\n135726,1983\n135727,422\n135728,84257\n135729,422\n135730,2775\n135731,447\n135732,1414\n135733,485\n135734,298\n135735,2779\n135737,200\n135739,875\n135739,907\n135739,972\n135739,24107\n135739,36918\n135739,45853\n135743,135744\n135746,2416\n135746,2417\n135747,163\n135748,1332\n135749,55849\n135750,135751\n135752,135753\n135754,483\n135755,1151\n135756,118\n135756,4597\n135757,1983\n135758,1860\n135759,1858\n135760,704\n135761,79\n135761,333\n135762,602\n135763,422\n135764,422\n135766,135767\n135769,5375\n135771,2296\n135772,406\n135772,818\n135773,1782\n135780,240\n135781,515\n135782,557\n135783,557\n135784,135785\n135786,116\n135786,2087\n135787,2674\n135788,138\n135790,994\n135791,994\n135792,636\n135793,72\n135794,994\n135795,994\n135796,994\n135797,83\n135798,2210\n135798,4237\n135799,30\n135800,2979\n135801,994\n135802,557\n135803,557\n135804,994\n135805,994\n135806,30\n135807,485\n135808,298\n135809,298\n135810,485\n135811,875\n135812,1117\n135812,124668\n135813,135814\n135815,422\n135816,4611\n135817,1707\n135818,135819\n135821,111\n135821,240\n135821,805\n135821,1085\n135821,1462\n135821,8537\n135822,994\n135823,994\n135824,1181\n135825,994\n135826,22\n135827,135828\n135829,135828\n135830,602\n135831,602\n135832,135833\n135834,309\n135834,310\n135835,146\n135835,306\n135835,307\n135835,704\n135835,2626\n135835,5375\n135835,8868\n135836,135837\n135838,2674\n135839,135840\n135841,135842\n135843,135844\n135845,135846\n135848,422\n135849,422\n135850,818\n135851,1151\n135852,135853\n135854,72\n135855,135856\n135857,3623\n135858,3999\n135859,1417\n135860,135861\n135862,372\n135864,135865\n135866,135867\n135868,292\n135869,366\n135870,366\n135871,366\n135872,294\n135873,44\n135874,296\n135875,298\n135876,389\n135877,452\n135877,457\n135877,497\n135877,535\n135877,676\n135877,918\n135877,1655\n135878,135879\n135880,333\n135880,346\n135880,366\n135880,1247\n135880,164572\n135881,392\n135881,918\n135882,390\n135883,119\n135884,135885\n135886,602\n135887,671\n135888,147\n135889,135890\n135891,184\n135893,2209\n135894,1284\n135895,422\n135896,41\n135897,135898\n135899,1238\n135900,1619\n135901,1452\n135902,1381\n135903,269\n135905,439\n135906,515\n135906,1381\n135907,355\n135908,718\n135910,907\n135911,298\n135912,485\n135914,422\n135915,485\n135916,298\n135917,994\n135919,292\n135921,287\n135921,433\n135922,1858\n135923,1860\n135924,298\n135925,485\n135926,1122\n135926,6059\n135927,10\n135927,2146\n135927,54284\n135929,602\n135930,135931\n135932,135933\n135934,72\n135935,83\n135936,1370\n135937,8180\n135939,4611\n135940,1544\n135941,994\n135942,994\n135943,255\n135944,233\n135945,340\n135945,515\n135946,1167\n135946,2979\n135950,360\n135950,509\n135950,1119\n135951,30\n135951,328\n135951,1179\n135951,1305\n135952,631\n135953,994\n135954,337\n135955,22\n135955,805\n135955,920\n135955,1293\n135956,298\n135957,1285\n135958,1782\n135959,994\n135960,79\n135961,130\n135962,79\n135963,485\n135964,422\n135965,481\n135966,79\n135967,439\n135968,1858\n135969,3507\n135970,1564\n135972,1293\n135973,1147\n135974,56\n135975,1860\n135976,372\n135977,859\n135979,994\n135981,58\n135981,801\n135981,1140\n135981,1147\n135981,1653\n135981,2436\n135981,4771\n135982,328\n135983,56\n135983,209\n135985,422\n135986,56\n135987,10\n135987,628\n135987,991\n135987,4260\n135988,994\n135989,473\n135989,8149\n135990,868\n135990,1782\n135991,41\n135992,178\n135992,1877\n136001,190492\n136005,178\n136009,1612\n136009,2173\n136011,1556\n136012,609\n136012,1257\n136012,1359\n136012,2315\n136013,344\n136015,337\n136016,136017\n136018,760\n136018,1149\n136018,1631\n136019,4545\n136019,56150\n136019,139010\n136020,298\n136021,485\n136022,202\n136022,497\n136022,505\n136022,516\n136022,676\n136022,843\n136022,1220\n136022,1222\n136022,1417\n136022,1512\n136022,1663\n136022,72439\n136023,1639\n136024,83\n136025,136026\n136028,287\n136028,809\n136028,19010\n136029,1238\n136031,3507\n136032,1983\n136033,968\n136033,1436\n136033,1740\n136033,5301\n136034,192\n136036,372\n136037,1663\n136038,875\n136039,15\n136040,360\n136040,4571\n136041,22\n136042,79\n136042,1175\n136042,189839\n136042,189842\n136043,1043\n136045,298\n136046,485\n136047,602\n136048,72\n136049,422\n136050,3830\n136050,174849\n136051,81070\n136053,15\n136054,408\n136054,493\n136054,518\n136055,200\n136056,32\n136056,3260\n136056,76096\n136057,97\n136058,209\n136059,1151\n136060,298\n136061,485\n136062,602\n136063,222\n136063,1019\n136064,3524\n136065,949\n136066,94\n136066,795\n136067,1\n136067,2787\n136067,4691\n136067,30331\n136067,142430\n136068,34\n136068,35\n136069,6303\n136070,13361\n136071,72\n136072,58\n136072,104\n136072,135\n136072,292\n136072,441\n136072,784\n136072,795\n136072,1415\n136072,7768\n136073,147\n136073,158\n136074,200\n136074,772\n136075,136076\n136077,222\n136077,1010\n136078,147\n136079,136080\n136081,485\n136082,298\n136085,1844\n136087,1175\n136088,44\n136089,298\n136090,485\n136091,147\n136092,147\n136094,907\n136095,1631\n136096,515\n136098,136099\n136100,422\n136101,136102\n136103,147\n136104,1370\n136104,1715\n136106,605\n136107,287\n136108,217\n136110,30\n136110,772\n136111,422\n136112,872\n136113,136114\n136113,151940\n136115,1559\n136117,298\n136118,485\n136120,34\n136120,35\n136120,217\n136120,536\n136121,577\n136122,298\n136123,485\n136124,134\n136126,1749\n136126,81233\n136127,1402\n136128,175\n136129,56\n136129,175\n136129,626\n136129,1285\n136129,1319\n136129,1571\n136130,1127\n136131,298\n136132,827\n136134,392\n136135,388\n136136,392\n136138,1087\n136138,1707\n136140,2744\n136141,136142\n136143,1707\n136144,17476\n136145,406\n136146,178\n136146,233\n136146,240\n136146,269\n136146,1085\n136146,1531\n136147,298\n136148,485\n136151,136152\n136154,1707\n136155,72\n136156,344\n136157,285\n136158,31977\n136159,1515\n136160,22\n136161,1240\n136162,287\n136162,809\n136162,19010\n136163,202\n136163,251\n136164,84257\n136167,602\n136168,588\n136168,590\n136168,1419\n136169,200\n136170,22\n136171,206\n136172,136173\n136174,68069\n136174,118336\n136175,58\n136175,1140\n136176,422\n136177,301\n136178,136179\n136180,1707\n136181,406\n136184,717\n136185,147\n136186,388\n136186,48505\n136188,489\n136188,577\n136188,1400\n136188,1844\n136190,919\n136193,2837\n136194,104\n136194,697\n136194,704\n136194,862\n136194,4545\n136195,875\n136196,175\n136197,298\n136198,344\n136199,72\n136200,285\n136201,83\n136202,17772\n136203,49057\n136204,136205\n136206,136207\n136208,579\n136209,5130\n136210,30\n136211,718\n136212,1462\n136212,8537\n136213,422\n136214,2224\n136216,1893\n136217,248\n136217,1332\n136217,5405\n136218,1634\n136219,422\n136220,146\n136221,344\n136222,647\n136223,1773\n136224,215\n136225,422\n136227,215\n136228,694\n136229,422\n136230,483\n136231,337\n136232,240\n136233,1052\n136233,1749\n136233,1968\n136236,136072\n136237,3804\n136238,1893\n136239,217\n136240,278\n136241,83\n136242,3804\n136243,885\n136243,13704\n136244,525\n136245,957\n136246,1309\n136247,5405\n136248,422\n136249,631\n136250,294\n136251,136252\n136253,872\n136254,13136\n136255,222\n136256,671\n136257,310\n136258,72\n136259,631\n136259,1635\n136260,2224\n136261,2674\n136262,138\n136263,116\n136263,2087\n136264,920\n136265,116\n136265,138\n136265,2087\n136266,397\n136266,483\n136267,272\n136268,349\n136269,136270\n136271,1181\n136272,2371\n136273,346\n136274,1151\n136276,136277\n136280,240\n136281,536\n136282,136072\n136286,422\n136287,422\n136288,1332\n136290,2224\n136291,994\n136292,83\n136293,79\n136294,994\n136295,557\n136296,557\n136297,760\n136297,1631\n136298,2048\n136299,994\n136300,2574\n136301,103860\n136301,189303\n136302,422\n136303,1370\n136304,422\n136305,1556\n136306,1220\n136306,1222\n136307,500\n136308,1962\n136309,2775\n136310,1052\n136311,54\n136312,1882\n136313,171\n136314,868\n136315,30331\n136316,149\n136317,136318\n136319,309\n136319,310\n136320,136321\n136322,136323\n136324,151\n136325,422\n136326,392\n136327,718\n136328,3623\n136329,1127\n136330,875\n136331,515\n136332,485\n136333,298\n136334,589\n136334,1001\n136335,298\n136336,485\n136337,994\n136338,1359\n136339,733\n136340,136341\n136342,83\n136343,83\n136345,515\n136346,422\n136347,147\n136348,304\n136350,250\n136350,1684\n136351,1052\n136352,1181\n136353,2944\n136354,2674\n136355,138\n136356,116\n136356,2087\n136357,2205\n136357,2209\n136357,6184\n136357,33424\n136358,72\n136359,344\n136360,285\n136361,422\n136362,809\n136363,167\n136364,136173\n136365,72\n136366,2590\n136367,118\n136367,4597\n136369,79\n136370,136371\n136372,393\n136373,1983\n136374,30\n136376,383\n136377,147\n136378,346\n136379,147\n136380,577\n136381,422\n136382,907\n136383,389\n136383,596\n136383,1849\n136383,32784\n136384,2590\n136385,422\n136386,195\n136387,1849\n136388,957\n136389,136390\n136391,77\n136392,949\n136392,17263\n136393,83\n136394,602\n136395,602\n136396,1467\n136398,366\n136399,366\n136400,366\n136401,366\n136402,388\n136403,422\n136404,422\n136405,422\n136406,2424\n136407,136408\n136409,233\n136410,1983\n136411,1359\n136412,136072\n136413,136072\n136414,1955\n136415,4190\n136416,136417\n136418,422\n136419,298\n136420,485\n136421,355\n136422,1871\n136423,248\n136425,2701\n136426,422\n136427,136\n136428,355\n136429,298\n136430,485\n136431,620\n136432,302\n136433,455\n136434,4066\n136435,312\n136436,718\n136437,2353\n136437,4190\n136438,30\n136439,485\n136440,298\n136441,136442\n136443,134\n136444,7416\n136446,2889\n136447,397\n136448,13980\n136449,2674\n136450,138\n136451,116\n136451,2087\n136452,4771\n136452,9010\n136454,2775\n136455,447\n136456,3507\n136457,1105\n136458,433\n136459,647\n136460,344\n136461,146\n136462,135\n136462,294\n136462,431\n136462,784\n136462,805\n136462,1052\n136462,1119\n136462,1177\n136462,1368\n136462,1608\n136462,1635\n136462,182162\n136463,192\n136463,516\n136463,1370\n136463,1619\n136463,30331\n136465,422\n136466,83\n136468,137\n136469,158\n136469,252\n136469,622\n136470,1858\n136471,79\n136472,136473\n136474,163\n136475,602\n136476,79\n136478,217\n136478,1019\n136479,1220\n136479,1222\n136480,252\n136481,251\n136483,1019\n136491,1419\n136496,283\n136499,1467\n136509,1381\n136511,1298\n136512,693\n136514,1240\n136516,209\n136516,2116\n136517,163\n136519,422\n136522,2674\n136523,116\n136523,2087\n136524,138\n136525,805\n136526,3630\n136527,136528\n136529,805\n136529,1285\n136530,949\n136531,1052\n136532,146\n136533,344\n136534,647\n136535,195\n136536,54\n136536,195\n136536,1274\n136537,827\n136538,467\n136539,3524\n136540,83\n136541,254\n136542,452\n136543,1247\n136544,184\n136547,146\n136548,647\n136549,344\n136551,301\n136551,968\n136551,1293\n136552,175\n136553,775\n136553,795\n136553,3804\n136553,23437\n136554,298\n136555,1860\n136556,146\n136557,647\n136558,269\n136559,344\n136561,647\n136562,146\n136563,344\n136564,647\n136565,344\n136566,718\n136567,146\n136568,634\n136569,167\n136569,2083\n136570,5405\n136572,1146\n136573,515\n136575,2590\n136576,137\n136577,58\n136578,46\n136579,994\n136582,146\n136583,647\n136584,344\n136585,611\n136586,515\n136587,248\n136588,344\n136589,1608\n136590,1531\n136590,4545\n136590,139010\n136591,209\n136592,994\n136593,1105\n136594,444\n136595,515\n136596,875\n136597,146\n136598,647\n136599,344\n136600,77\n136601,422\n136602,581\n136603,99\n136603,314\n136603,779\n136603,141912\n136604,1608\n136605,22\n136606,120\n136607,1962\n136608,209\n136609,422\n136610,718\n136611,422\n136612,868\n136613,720\n136614,217\n136616,422\n136617,120\n136617,261\n136619,83\n136620,2460\n136621,3623\n136624,302\n136625,175\n136627,298\n136628,1984\n136629,58\n136631,3507\n136632,4611\n136633,1544\n136634,58\n136635,1715\n136637,577\n136637,919\n136638,333\n136639,44\n136641,163\n136641,6303\n136642,811\n136643,467\n136644,10\n136646,392\n136647,433\n136648,515\n136650,200\n136650,772\n136651,287\n136651,809\n136651,19010\n136654,1298\n136655,302\n136656,22\n136656,48\n136656,79\n136656,151\n136656,163\n136656,240\n136656,358\n136656,392\n136656,393\n136656,439\n136656,538\n136656,622\n136656,934\n136656,1033\n136656,1068\n136656,1188\n136656,1210\n136656,1289\n136656,1305\n136656,1785\n136656,1796\n136656,1962\n136656,2116\n136656,2205\n136656,2260\n136656,2312\n136656,3089\n136656,4066\n136656,8180\n136656,8820\n136656,9024\n136656,13910\n136656,19356\n136656,33424\n136656,36985\n136657,801\n136657,1085\n136657,75912\n136658,136\n136658,1014\n136660,1147\n136662,563\n136663,4611\n136664,1544\n136665,7768\n136666,58\n136667,192\n136668,596\n136668,1332\n136669,994\n136670,192\n136671,1096\n136672,422\n136673,422\n136674,483\n136674,852\n136674,2646\n136674,2775\n136675,713\n136677,422\n136678,422\n136680,602\n136681,602\n136682,589\n136683,417\n136683,525\n136683,805\n136683,1085\n136683,1140\n136683,1749\n136683,1818\n136683,2286\n136683,2620\n136685,313\n136686,379\n136687,1181\n136689,422\n136690,136691\n136690,152737\n136692,2296\n136693,7124\n136694,422\n136695,379\n136696,422\n136697,467\n136698,801\n136699,397\n136702,422\n136703,422\n136704,827\n136705,422\n136706,422\n136707,389\n136708,422\n136709,422\n136710,422\n136711,3623\n136712,406\n136716,225\n136718,1019\n136719,481\n136720,4\n136720,5\n136720,1381\n136721,147\n136722,760\n136724,599\n136725,422\n136726,19010\n136727,1220\n136727,1222\n136728,252\n136729,251\n136730,602\n136731,875\n136732,147\n136732,1458\n136733,949\n136734,811\n136735,422\n136736,55849\n136737,1285\n136738,79\n136738,192\n136738,202\n136738,333\n136739,83\n136740,1749\n136742,3331\n136742,13136\n136743,1749\n136744,801\n136745,1858\n136746,1860\n136747,1\n136747,859\n136747,3069\n136748,1858\n136749,1860\n136750,406\n136751,136752\n136753,372\n136753,1082\n136754,577\n136755,206\n136756,994\n136758,111\n136758,875\n136759,304\n136760,163\n136761,186\n136761,1118\n136762,202\n136763,58\n136764,1240\n136765,158\n136766,171\n136767,1722\n136768,346\n136769,994\n136770,483\n136771,30\n136772,136773\n136774,1454\n136775,10\n136775,2574\n136775,31977\n136776,422\n136777,406\n136778,422\n136779,406\n136779,779\n136779,1181\n136780,422\n136781,217\n136781,1417\n136782,149\n136783,2224\n136784,1001\n136785,30\n136786,557\n136788,2674\n136789,116\n136789,2087\n136790,138\n136791,149\n136791,184\n136792,934\n136792,1033\n136794,885\n136794,13704\n136795,3585\n136796,779\n136797,5405\n136798,136799\n136800,1882\n136801,130\n136801,140\n136801,323\n136801,332\n136801,1007\n136801,1105\n136801,1289\n136801,1429\n136801,1509\n136801,1551\n136801,2797\n136801,3319\n136801,3328\n136801,3331\n136801,3999\n136803,392\n136803,918\n136804,3630\n136805,30\n136806,1118\n136806,1566\n136807,158\n136807,2931\n136807,8822\n136808,389\n136809,358\n136810,312\n136811,113156\n136812,140\n136813,267\n136814,192\n136814,779\n136815,2750\n136816,1332\n136818,8270\n136819,557\n136820,557\n136821,417\n136822,298\n136823,485\n136824,175\n136825,298\n136826,994\n136827,298\n136828,485\n136829,151\n136830,811\n136831,255\n136832,3623\n136833,422\n136834,30\n136835,422\n136836,313\n136837,22\n136838,1082\n136839,422\n136840,30\n136841,178\n136841,439\n136843,994\n136844,2083\n136845,136\n136846,58\n136847,994\n136848,46\n136849,136850\n136851,30\n136852,206\n136853,1\n136854,6323\n136855,457\n136855,497\n136855,535\n136855,676\n136855,918\n136855,1655\n136856,136857\n136858,136859\n136860,389\n136861,22\n136862,1007\n136863,779\n136864,30\n136865,920\n136866,136867\n136868,779\n136869,2116\n136870,467\n136871,192\n136872,602\n136873,136874\n136875,602\n136876,83\n136877,30\n136878,22\n136879,602\n136880,136881\n136882,602\n136883,602\n136884,602\n136885,1571\n136886,171\n136887,136888\n136887,154093\n136889,22\n136890,861\n136891,72\n136892,136893\n136894,72\n136895,136896\n136897,1515\n136898,30\n136899,138\n136900,2674\n136901,116\n136901,2087\n136903,10\n136904,422\n136905,422\n136906,422\n136907,136908\n136909,135\n136909,137\n136910,668\n136911,422\n136912,422\n136913,22\n136914,1556\n136915,422\n136917,136918\n136917,140960\n136919,422\n136920,111\n136921,3069\n136922,1467\n136923,113156\n136924,422\n136925,422\n136926,455\n136927,2424\n136928,422\n136929,366\n136930,1871\n136931,366\n136932,422\n136933,422\n136934,2421\n136935,83\n136936,13980\n136937,422\n136938,19010\n136939,136940\n136941,422\n136942,422\n136943,1085\n136944,422\n136945,344\n136945,647\n136945,1544\n136946,4355\n136947,640\n136948,298\n136949,485\n136951,5375\n136953,294\n136954,30\n136955,30\n136956,422\n136957,602\n136958,422\n136959,136960\n136961,422\n136962,818\n136963,1821\n136964,718\n136965,422\n136966,422\n136967,422\n136968,1238\n136971,222\n136972,1033\n136973,1452\n136974,136975\n136976,422\n136977,355\n136978,893\n136979,333\n136979,59021\n136980,233\n136981,509\n136982,1462\n136982,8537\n136983,932\n136984,422\n136987,1544\n136988,298\n136989,485\n136992,647\n136992,1175\n136993,287\n136993,809\n136993,19010\n136994,2286\n136995,2205\n136995,33424\n136996,206\n136996,217\n136996,406\n136996,694\n136997,805\n136997,2620\n136998,811\n136999,1359\n137000,1907\n137001,698\n137003,171\n137004,2674\n137005,116\n137005,2087\n137006,138\n137007,206\n137010,515\n137011,315\n137012,1818\n137020,433\n137021,843\n137023,843\n137024,861\n137025,843\n137026,328\n137027,137028\n137029,240\n137030,949\n137032,433\n137033,1849\n137034,435\n137034,439\n137035,298\n137036,485\n137037,577\n137038,422\n137039,1353\n137040,137041\n137042,949\n137043,392\n137044,918\n137045,1631\n137046,248\n137046,1631\n137047,994\n137048,1118\n137048,19005\n137049,481\n137050,22\n137051,298\n137052,485\n137053,422\n137055,137056\n137055,142230\n137057,163\n137058,171641\n137059,877\n137059,124668\n137059,187176\n137059,227669\n137060,298\n137061,485\n137062,273\n137063,175\n137064,6027\n137065,298\n137066,287\n137067,137068\n137067,138607\n137067,142233\n137069,134\n137069,372\n137070,1984\n137071,2116\n137072,422\n137073,22\n137074,200\n137075,1707\n137076,422\n137077,298\n137078,485\n137079,137080\n137081,2224\n137082,30\n137083,422\n137084,298\n137085,485\n137086,107\n137087,298\n137088,485\n137090,422\n137091,843\n137092,994\n137093,447\n137094,83\n137095,30\n137096,41\n137096,1608\n137097,422\n137098,1531\n137099,1962\n137100,6303\n137101,772\n137102,1381\n137103,994\n137105,712\n137106,30\n137107,2979\n137108,240\n137108,760\n137108,1010\n137109,158\n137110,298\n137111,485\n137112,843\n137113,968\n137114,1140\n137115,72\n137116,285\n137117,344\n137118,269\n137119,3507\n137120,843\n137121,843\n137122,175\n137123,298\n137124,68\n137127,640\n137128,467\n137129,467\n137129,1893\n137130,158\n137131,158\n137133,158\n137136,994\n137137,58\n137138,46\n137139,298\n137140,485\n137141,81070\n137144,2146\n137144,19986\n137145,287\n137146,58\n137147,994\n137148,46\n137150,698\n137151,379\n137152,406\n137152,422\n137152,457\n137152,620\n137152,1458\n137153,298\n137154,485\n137155,30\n137156,30\n137157,292\n137157,2775\n137158,1749\n137158,1962\n137159,957\n137160,3\n137161,433\n137162,58\n137163,46\n137164,994\n137165,2775\n137166,447\n137167,372\n137168,602\n137169,301\n137169,717\n137169,1782\n137170,135\n137171,1220\n137171,1222\n137172,252\n137173,251\n137174,65\n137175,1415\n137176,957\n137177,433\n137179,137180\n137182,107\n137182,200\n137182,2443\n137183,118336\n137184,467\n137185,5469\n137186,957\n137187,195\n137188,422\n137189,19010\n137190,1220\n137190,1222\n137191,251\n137192,252\n137193,1118\n137194,3623\n137196,30\n137197,19010\n137199,433\n137200,422\n137201,72\n137201,442\n137201,1962\n137201,155473\n137202,433\n137203,175\n137204,805\n137205,442\n137205,1282\n137205,2089\n137205,2156\n137205,2940\n137205,4571\n137206,256\n137207,298\n137208,310\n137210,957\n137211,422\n137212,56\n137213,83\n137214,366\n137215,868\n137216,3623\n137217,54\n137218,30\n137219,298\n137220,485\n137221,195\n137222,136072\n137224,30\n137225,745\n137226,211\n137227,30\n137228,30\n137228,1179\n137229,298\n137230,485\n137231,30\n137232,2979\n137233,68\n137234,30\n137235,602\n137236,366\n137237,2312\n137238,3\n137240,1118\n137241,137242\n137243,1085\n137244,200\n137244,225\n137244,772\n137244,1332\n137246,30\n137246,1179\n137247,44\n137249,30\n137249,1179\n137250,818\n137251,602\n137252,602\n137253,808\n137256,479\n137257,631\n137259,811\n137260,775\n137260,843\n137262,422\n137263,422\n137264,509\n137265,868\n137265,152855\n137265,156379\n137271,202\n137271,2371\n137272,392\n137272,4252\n137273,312\n137274,536\n137275,760\n137275,1149\n137276,557\n137277,68069\n137278,137279\n137284,1345\n137292,640\n137296,1284\n137302,50\n137302,79\n137311,861\n137311,50321\n137330,202\n137410,5101\n137420,467\n137420,571\n137420,868\n137426,809\n137463,2371\n137499,2371\n137525,467\n137525,868\n137526,162599\n137534,2371\n137540,2371\n137563,1653\n137563,220502\n137660,760\n137670,346\n137704,206\n137713,366\n137733,422\n137734,1860\n137736,602\n137737,1458\n137738,483\n137739,3623\n137740,1749\n137741,22\n137742,2260\n137744,422\n137745,30\n137746,1860\n137747,1858\n137749,30\n137750,422\n137751,4252\n137752,431\n137752,1326\n137752,1782\n137752,5961\n137752,156379\n137753,1782\n137754,30\n137755,422\n137756,137757\n137758,3623\n137761,87\n137762,422\n137763,422\n137764,3409\n137766,422\n137767,68\n137769,240\n137769,818\n137769,1608\n137770,994\n137771,55849\n137772,422\n137773,422\n137774,422\n137775,422\n137776,920\n137777,422\n137778,422\n137779,422\n137780,4611\n137781,1544\n137784,422\n137785,30\n137786,1515\n137788,30\n137789,602\n137790,1515\n137791,120\n137792,137792\n137793,68069\n137793,141912\n137794,994\n137796,422\n137797,34\n137797,35\n137797,634\n137797,2646\n137798,149\n137800,422\n137801,1149\n137802,422\n137803,422\n137804,885\n137804,13704\n137805,30\n137806,872\n137807,137808\n137809,626\n137810,137811\n137812,56\n137812,147\n137812,158\n137813,5440\n137815,602\n137816,302\n137816,861\n137816,893\n137817,107\n137819,126\n137819,872\n137819,1151\n137820,240\n137821,248\n137822,137823\n137824,30\n137825,557\n137826,137827\n137828,2379\n137829,493\n137831,30\n137832,563\n137833,192\n137834,160\n137835,422\n137836,1298\n137837,302\n137838,1175\n137839,994\n137840,72\n137841,1175\n137842,657\n137842,2266\n137843,1962\n137844,500\n137845,2775\n137846,1052\n137847,54\n137848,1882\n137849,171\n137850,30\n137851,30\n137852,557\n137853,557\n137854,56\n137855,422\n137856,5906\n137857,557\n137858,626\n137859,278\n137860,137\n137861,862\n137862,137863\n137864,538\n137865,417\n137866,151\n137867,422\n137868,1551\n137868,3999\n137870,68069\n137871,30\n137872,1556\n137873,623\n137874,30\n137875,16153\n137877,6789\n137879,137880\n137881,2105\n137881,4220\n137881,66297\n137882,422\n137883,137884\n137885,30\n137886,1882\n137887,30\n137888,30\n137889,973\n137889,9018\n137890,6252\n137891,422\n137892,137893\n137894,538\n137895,30\n137896,30\n137897,346\n137898,2146\n137899,346\n137900,192\n137901,2574\n137902,30\n137903,861\n137904,435\n137905,422\n137906,994\n137907,8854\n137908,422\n137909,4895\n137910,994\n137911,843\n137912,137913\n137914,2750\n137915,422\n137916,422\n137917,56\n137918,422\n137919,137920\n137921,602\n137922,602\n137923,2421\n137924,602\n137925,2116\n137927,143\n137928,493\n137930,30\n137931,994\n137932,137933\n137934,137934\n137935,22\n137936,30\n137937,2146\n137937,3297\n137937,42419\n137938,72\n137939,81233\n137940,72\n137941,81\n137941,1511\n137941,3069\n137941,4771\n137942,640\n137943,30\n137944,30\n137945,481\n137946,72\n137947,392\n137948,34\n137948,35\n137948,2784\n137949,818\n137950,2244\n137953,862\n137953,2590\n137954,1849\n137955,137956\n137957,714\n137958,872\n137959,137960\n137959,144490\n137959,148698\n137959,151855\n137959,152484\n137961,87\n137961,192\n137961,200\n137961,240\n137961,278\n137961,285\n137961,333\n137961,388\n137961,503\n137961,694\n137961,1033\n137961,1072\n137961,1151\n137961,1181\n137961,1257\n137961,1298\n137961,1515\n137961,1805\n137961,1836\n137961,1871\n137961,1955\n137961,2421\n137961,3138\n137961,3585\n137961,60576\n137962,22\n137963,383\n137964,10\n137964,130\n137964,140\n137964,515\n137964,640\n137964,647\n137964,736\n137964,801\n137964,835\n137964,1052\n137964,1381\n137964,1893\n137964,1968\n137964,2626\n137964,3297\n137964,5440\n137965,422\n137966,2867\n137966,2868\n137967,137968\n137969,1052\n137971,255\n137973,392\n137975,422\n137976,1\n137976,163\n137976,859\n137976,980\n137976,4571\n137976,30331\n137977,422\n137978,137979\n137982,219\n137983,2944\n137983,6506\n137984,134406\n137985,233\n137986,422\n137987,83\n137989,1181\n137990,72\n137993,355\n137994,818\n137995,972\n137996,312\n137997,1033\n137998,137999\n138000,137999\n138001,137999\n138002,137999\n138003,22\n138004,346\n138005,1858\n138006,1860\n138008,392\n138008,849\n138008,1132\n138010,222\n138012,138013\n138014,72\n138015,3653\n138016,477\n138016,536\n138016,2168\n138017,1085\n138018,75912\n138028,3538\n138029,113156\n138030,32\n138030,104\n138030,868\n138030,1326\n138030,1345\n138030,1796\n138030,3623\n138030,3804\n138030,156379\n138032,75912\n138034,1370\n138035,120\n138035,332\n138035,392\n138035,809\n138035,1284\n138035,1858\n138035,2989\n138035,2991\n138036,278\n138036,13361\n138041,1860\n138050,41\n138051,2668\n138053,217\n138053,1531\n138054,30\n138055,68069\n138056,302\n138058,1177\n138059,875\n138060,620\n138061,72\n138063,1224\n138063,3177\n138064,192\n138065,749\n138066,1509\n138067,557\n138068,2266\n138069,138070\n138071,302\n138072,1858\n138073,1860\n138074,111142\n138075,515\n138077,247\n138078,500\n138079,2775\n138080,1962\n138081,1052\n138082,1882\n138083,54\n138085,1467\n138086,1858\n138087,1860\n138088,175\n138089,298\n138090,58\n138091,994\n138092,46\n138093,97\n138093,32475\n138095,481\n138096,22\n138100,346\n138101,1556\n138103,200\n138103,772\n138103,1368\n138103,5405\n138104,671\n138105,4810\n138106,302\n138107,994\n138108,1479\n138109,422\n138110,422\n138111,1479\n138112,1479\n138113,147\n138114,75912\n138115,41\n138115,671\n138116,75912\n138117,346\n138119,83\n138120,527\n138120,8714\n138121,422\n138122,2671\n138123,163\n138123,209\n138123,302\n138123,435\n138123,2116\n138124,579\n138124,4823\n138125,1776\n138125,1877\n138126,422\n138128,422\n138129,422\n138130,557\n138131,422\n138132,338\n138133,422\n138134,175\n138135,602\n138136,657\n138136,1284\n138136,1363\n138136,13361\n138137,298\n138138,264\n138138,4548\n138140,994\n138141,209\n138142,1149\n138143,75912\n138144,422\n138145,994\n138146,422\n138147,2146\n138148,850\n138149,195\n138150,138151\n138154,22\n138156,3111\n138157,83\n138163,333\n138166,333\n138167,364\n138168,83\n138168,217\n138169,251\n138169,994\n138170,422\n138171,56\n138172,850\n138173,1240\n138176,640\n138177,104\n138177,254\n138177,557\n138177,953\n138177,954\n138177,1939\n138177,10318\n138178,510\n138179,171\n138180,527\n138181,1858\n138182,1860\n138183,3367\n138184,3297\n138185,111\n138185,714\n138186,1707\n138188,408\n138189,1326\n138190,1323\n138191,827\n138192,102\n138193,868\n138194,103860\n138195,1220\n138195,1222\n138196,592\n138197,195\n138198,660\n138199,1013\n138199,1241\n138199,1479\n138199,1522\n138199,2557\n138199,13593\n138199,42433\n138199,46271\n138199,140689\n138200,302\n138201,779\n138202,195\n138203,4823\n138204,22\n138205,313\n138205,425\n138206,647\n138207,146\n138208,344\n138211,158\n138212,4276\n138214,2775\n138218,1\n138228,1688\n138229,1858\n138230,1860\n138232,1688\n138233,248\n138233,312\n138233,557\n138235,875\n138236,312\n138238,385\n138240,602\n138241,392\n138242,215\n138243,422\n138244,240\n138244,622\n138244,818\n138244,127158\n138246,760\n138247,571\n138247,868\n138248,81\n138250,195\n138251,195\n138252,392\n138252,697\n138253,907\n138254,1983\n138255,116\n138255,2087\n138256,138\n138257,2674\n138258,3623\n138259,138260\n138261,195\n138262,2205\n138262,33424\n138263,875\n138264,3623\n138265,3623\n138266,3623\n138267,994\n138268,3623\n138269,195\n138270,195\n138271,760\n138272,563\n138273,30\n138274,577\n138275,171\n138276,392\n138276,697\n138277,251\n138278,18831\n138279,68\n138279,2620\n138280,577\n138281,30\n138282,30\n138283,77\n138284,620\n138285,30\n138286,30\n138287,30\n138288,435\n138288,538\n138288,671\n138289,138290\n138291,1181\n138292,602\n138293,175\n138300,298\n138301,3623\n138302,79\n138303,2371\n138304,273\n138305,422\n138306,56\n138307,10\n138308,760\n138309,372\n138312,10\n138313,1127\n138314,406\n138315,5405\n138316,147\n138316,406\n138316,622\n138317,893\n138318,1285\n138318,1635\n138319,422\n138320,1010\n138321,1\n138323,5469\n138324,46\n138325,58\n138326,46\n138327,994\n138328,6506\n138329,1707\n138330,1133\n138331,1326\n138332,3069\n138333,994\n138334,435\n138336,422\n138337,68\n138338,8788\n138339,23783\n138340,422\n138341,130\n138341,264\n138341,628\n138341,687\n138341,859\n138341,893\n138341,1122\n138341,1140\n138341,1400\n138341,1462\n138341,1551\n138341,1556\n138341,3345\n138341,5358\n138341,8537\n138341,9029\n138341,13136\n138341,13538\n138341,14352\n138342,195\n138343,515\n138344,79\n138344,217\n138344,247\n138344,467\n138344,1181\n138345,2750\n138346,422\n138348,422\n138350,843\n138351,72\n138352,5213\n138353,68\n138354,72\n138355,422\n138356,56\n138357,875\n138358,138359\n138360,233\n138361,885\n138361,13704\n138362,30\n138363,1235\n138363,1335\n138364,422\n138365,72\n138366,346\n138367,875\n138369,171\n138370,1608\n138371,30\n138372,536\n138373,72\n138374,72\n138375,72\n138376,801\n138376,1140\n138376,1177\n138376,1893\n138376,3474\n138377,3507\n138378,1707\n138379,34\n138379,35\n138380,328\n138381,140\n138382,1634\n138383,422\n138384,56\n138385,1544\n138386,2701\n138387,252\n138388,557\n138389,202\n138390,1564\n138391,557\n138392,2557\n138393,1939\n138394,264\n138394,736\n138394,1007\n138394,1010\n138394,1289\n138394,1509\n138394,1551\n138394,3041\n138394,3999\n138394,5440\n138395,980\n138396,557\n138397,1298\n138398,406\n138399,248\n138400,862\n138401,1231\n138402,714\n138403,873\n138404,383\n138405,72\n138406,1893\n138407,5405\n138408,130897\n138409,390\n138410,1837\n138411,422\n138412,56\n138413,1381\n138414,2353\n138415,3422\n138416,862\n138417,509\n138418,1515\n138419,752\n138421,1522\n138422,3207\n138423,264\n138424,525\n138425,3538\n138426,215\n138427,56\n138428,422\n138429,19010\n138430,1133\n138431,3804\n138432,3218\n138433,1749\n138434,493\n138435,2045\n138436,3138\n138437,439\n138438,704\n138439,5662\n138440,1821\n138441,1849\n138441,32784\n138442,1436\n138443,1522\n138444,1001\n138445,3507\n138446,5718\n138447,518\n138448,63\n138449,6068\n138450,907\n138451,1715\n138452,1326\n138453,192\n138454,717\n138455,301\n138456,1181\n138457,14797\n138458,1392\n138459,795\n138460,3182\n138461,3194\n138462,6955\n138463,2620\n138464,72\n138465,158\n138466,138467\n138466,144690\n138468,422\n138469,1877\n138470,175\n138471,147\n138471,158\n138471,1458\n138471,118336\n138472,147\n138472,158\n138472,663\n138472,1458\n138472,118336\n138473,298\n138474,422\n138475,56\n138476,968\n138477,81\n138478,2979\n138479,113156\n138480,1010\n138481,8180\n138482,372\n138483,346\n138484,720\n138485,1634\n138486,1007\n138487,72\n138488,333\n138489,957\n138489,1815\n138490,1085\n138491,107\n138492,58\n138493,994\n138494,46\n138495,72\n138496,1240\n138497,393\n138498,779\n138499,72\n138500,622\n138501,1590\n138502,388\n138503,285\n138504,631\n138505,2205\n138505,33424\n138506,111\n138507,1181\n138508,1149\n138509,2699\n138510,1608\n138511,1167\n138512,919\n138513,1722\n138514,392\n138515,422\n138516,56\n138517,592\n138518,1282\n138519,4771\n138520,1707\n138521,1359\n138522,8270\n138523,1210\n138524,255\n138525,9001\n138526,72\n138527,1309\n138528,138529\n138530,1381\n138531,200\n138532,58\n138533,994\n138534,46\n138535,195\n138536,422\n138537,483\n138538,58\n138539,994\n138540,46\n138541,72\n138542,72\n138543,422\n138544,56\n138545,8270\n138546,2574\n138547,422\n138548,138549\n138550,138551\n138552,147\n138555,138556\n138555,175790\n138557,298\n138557,714\n138557,1118\n138557,1313\n138557,1939\n138557,2205\n138557,3538\n138557,24763\n138557,33424\n138557,33611\n138558,1608\n138559,138560\n138561,138560\n138562,138563\n138564,192\n138565,602\n138566,422\n138567,56\n138568,8270\n138569,452\n138569,497\n138569,918\n138569,1655\n138570,138571\n138572,83\n138573,861\n138574,138575\n138576,273\n138577,138\n138577,200\n138578,602\n138579,138580\n138581,138582\n138581,148189\n138583,19010\n138584,589\n138584,631\n138584,1001\n138585,393\n138586,135\n138587,431\n138587,1085\n138587,2296\n138587,2590\n138588,805\n138589,138590\n138591,1140\n138591,5547\n138592,30\n138593,779\n138594,72\n138595,30\n138596,138597\n138598,30\n138599,138600\n138601,138602\n138603,72\n138606,72\n138608,255\n138609,994\n138610,994\n138612,138613\n138614,138613\n138615,138616\n138615,190656\n138618,30\n138619,264\n138619,1659\n138619,2979\n138620,138621\n138622,30\n138623,30\n138624,58\n138625,46\n138626,994\n138627,233\n138628,30\n138629,366\n138630,355\n138631,217\n138632,366\n138633,209\n138634,366\n138635,366\n138636,366\n138637,718\n138637,893\n138638,138639\n138640,30\n138641,30\n138642,138643\n138642,140833\n138642,146566\n138644,1238\n138645,138646\n138648,602\n138649,1425\n138650,392\n138651,994\n138652,58\n138653,46\n138655,872\n138656,1837\n138657,138658\n138659,1381\n138659,191860\n138660,1509\n138661,1608\n138662,1381\n138662,1893\n138663,202\n138664,136072\n138666,264\n138666,1381\n138666,1509\n138666,191860\n138667,1452\n138668,171\n138669,138670\n138671,640\n138672,56\n138673,422\n138674,149\n138677,557\n138678,557\n138679,46\n138679,58\n138682,118336\n138683,1359\n138686,259\n138686,392\n138686,577\n138686,697\n138686,726\n138686,788\n138686,902\n138686,1070\n138686,1105\n138686,1805\n138686,6646\n138686,13302\n138686,25398\n138686,28282\n138686,33728\n138686,48078\n138686,53286\n138686,54493\n138686,57143\n138686,67395\n138686,77566\n138686,83845\n138686,127158\n138686,132992\n138686,134290\n138686,138686\n138686,138713\n138686,140460\n138686,140829\n138686,141819\n138686,141846\n138686,142758\n138686,144231\n138686,147500\n138686,147507\n138686,147524\n138686,147544\n138686,147554\n138686,147566\n138686,147974\n138686,148008\n138686,148035\n138686,148056\n138686,148057\n138686,148069\n138686,148070\n138686,148071\n138686,148072\n138686,148248\n138686,148253\n138686,148278\n138686,148280\n138686,148282\n138686,148283\n138686,148437\n138686,148449\n138686,148450\n138686,148455\n138686,148458\n138686,148464\n138686,148465\n138686,148467\n138686,150151\n138686,158981\n138686,160320\n138686,160870\n138686,165683\n138686,165717\n138686,166981\n138686,167709\n138686,167716\n138686,168330\n138686,168956\n138686,171567\n138686,171584\n138686,171589\n138686,171593\n138686,171737\n138686,171760\n138686,172511\n138686,172731\n138686,173708\n138686,174504\n138686,174510\n138686,174518\n138686,174532\n138686,175219\n138686,175298\n138686,175301\n138686,175311\n138686,175410\n138686,175939\n138686,176839\n138686,179156\n138686,187483\n138686,192522\n138686,193276\n138686,215420\n138686,215879\n138686,216118\n138686,216126\n138686,224263\n138686,226462\n138686,228435\n138686,229792\n138686,230487\n138686,243649\n138686,250526\n138687,515\n138688,178\n138689,1149\n138690,850\n138691,30\n138692,195\n138693,19010\n138694,309\n138694,310\n138694,55849\n138695,647\n138696,146\n138697,344\n138698,1564\n138699,79\n138700,808\n138701,115474\n138702,388\n138703,30\n138704,292\n138705,146\n138706,647\n138707,344\n138708,893\n138709,63\n138710,195\n138711,30\n138712,227\n138712,1635\n138712,2421\n138712,2750\n138712,8855\n138713,138686\n138714,175\n138715,298\n138716,138717\n138721,795\n138722,850\n138723,1983\n138724,30\n138725,994\n138726,147\n138726,158\n138726,178\n138727,996\n138728,1220\n138728,1222\n138729,252\n138730,251\n138732,3623\n138733,83\n138734,298\n138735,485\n138736,248\n138736,1631\n138737,1363\n138739,1509\n138740,310\n138741,1858\n138742,1860\n138744,292\n138745,422\n138746,422\n138747,314\n138748,422\n138749,422\n138750,575\n138751,195\n138752,71\n138753,138754\n138753,139789\n138753,139834\n138753,140600\n138753,140933\n138753,140991\n138753,141055\n138753,141084\n138753,141721\n138753,141955\n138753,142128\n138753,142132\n138753,143232\n138753,143431\n138753,150443\n138755,68\n138756,17897\n138758,1544\n138763,868\n138763,1345\n138766,2315\n138767,136\n138768,422\n138769,56\n138770,1858\n138771,1860\n138772,138773\n138774,1608\n138776,868\n138776,9029\n138777,1858\n138778,1860\n138779,146\n138780,647\n138781,344\n138782,356\n138782,1888\n138783,349\n138783,356\n138784,175\n138785,481\n138786,298\n138787,770\n138788,138789\n138790,422\n138791,56\n138792,215\n138793,151\n138794,673\n138795,592\n138795,138795\n138795,165739\n138795,166489\n138796,22\n138797,206\n138797,620\n138797,1181\n138798,138799\n138800,408\n138801,1323\n138802,102\n138803,1326\n138804,138805\n138806,85354\n138807,3724\n138808,344\n138809,58\n138810,994\n138811,46\n138812,138813\n138814,1181\n138815,146\n138816,682\n138816,42064\n138816,72439\n138817,349\n138817,1769\n138819,1805\n138819,1860\n138820,30\n138821,22\n138823,972\n138825,252\n138825,1220\n138825,1222\n138826,697\n138827,195\n138828,195\n138829,217\n138829,861\n138831,147\n138831,149\n138831,171\n138831,89035\n138832,72\n138833,577\n138834,22\n138835,46\n138836,58\n138837,994\n138839,138840\n138839,178455\n138841,994\n138842,58\n138843,46\n138844,309\n138844,310\n138846,392\n138847,1149\n138849,422\n138850,56\n138851,81070\n138852,171\n138853,515\n138854,515\n138855,467\n138856,22\n138857,30\n138858,111\n138860,406\n138861,1363\n138862,1983\n138865,30\n138866,1220\n138866,1222\n138867,206\n138868,794\n138869,298\n138870,485\n138871,3111\n138872,138873\n138875,147\n138876,779\n138876,68069\n138876,141912\n138877,536\n138877,1417\n138878,918\n138879,255\n138880,392\n138880,3260\n138881,406\n138882,4355\n138883,23783\n138885,138886\n138887,138888\n138889,957\n138891,30\n138892,146\n138893,647\n138894,344\n138895,31977\n138895,138896\n138895,143660\n138897,15\n138898,66297\n138898,178576\n138899,1132\n138900,30\n138902,8854\n138903,175\n138905,346\n138906,298\n138907,30\n138908,2944\n138909,55849\n138910,30\n138911,55849\n138912,393\n138913,1007\n138915,389\n138915,1353\n138916,1688\n138917,907\n138918,30\n138919,516\n138919,1220\n138919,1222\n138920,422\n138921,56\n138922,1776\n138923,30\n138924,138925\n138926,957\n138927,1052\n138927,2626\n138928,138929\n138930,949\n138931,392\n138932,30\n138933,72\n138934,200\n138934,328\n138935,314\n138936,467\n138936,818\n138937,30\n138938,1359\n138941,406\n138942,1220\n138942,1222\n138943,251\n138944,252\n138945,138946\n138947,30\n138948,1220\n138948,1222\n138949,252\n138950,251\n138951,30\n138952,30\n138955,3623\n138956,516\n138957,68069\n138958,30\n138959,30\n138960,206\n138961,55849\n138962,557\n138963,536\n138964,435\n138965,875\n138966,406\n138967,1888\n138969,422\n138970,56\n138971,346\n138972,30\n138973,138974\n138975,358\n138976,30\n138977,994\n138978,147\n138978,206\n138978,80266\n138979,346\n138980,557\n138981,8719\n138982,138\n138983,865\n138984,557\n138985,137\n138986,118\n138986,4597\n138987,88820\n138988,30\n138989,175\n138990,500\n138991,1882\n138992,1962\n138993,1052\n138994,2775\n138995,54\n138996,1010\n138996,1122\n138997,298\n138998,8270\n138999,225\n139002,1212\n139003,1707\n139004,79\n139004,358\n139007,146\n139008,647\n139009,344\n139011,332\n139012,151\n139013,424\n139014,2443\n139015,79\n139016,609\n139018,139019\n139018,142777\n139020,932\n139021,332\n139022,1368\n139023,2367\n139024,392\n139024,697\n139024,918\n139026,8884\n139027,801\n139029,56\n139030,422\n139031,346\n139032,525\n139034,16153\n139035,4545\n139035,139010\n139036,1309\n139037,139038\n139039,631\n139040,294\n139041,30\n139042,139043\n139044,30\n139046,957\n139047,346\n139050,1085\n139051,483\n139052,139053\n139054,139055\n139056,1001\n139057,516\n139057,1370\n139058,30\n139059,252\n139059,1220\n139059,1222\n139060,1849\n139060,32784\n139061,589\n139062,1001\n139063,139064\n139065,30\n139066,192\n139067,30\n139068,1007\n139069,139070\n139071,139070\n139072,139070\n139073,10\n139074,366\n139075,1181\n139076,10\n139077,779\n139078,344\n139079,72\n139080,285\n139081,233\n139082,346\n139083,355\n139084,285\n139085,344\n139086,72\n139088,3260\n139090,957\n139091,139092\n139093,139094\n139093,141161\n139095,1001\n139095,2205\n139095,33424\n139096,139097\n139098,298\n139099,485\n139100,104\n139101,30\n139103,139104\n139106,481\n139108,139109\n139110,83\n139111,104\n139111,137\n139111,1282\n139112,687\n139113,647\n139114,146\n139115,344\n139117,2048\n139118,306\n139118,307\n139119,83\n139121,5102\n139122,72\n139123,344\n139124,285\n139125,1707\n139126,408\n139127,1323\n139128,102\n139129,1326\n139130,779\n139131,1370\n139132,58\n139133,994\n139134,46\n139135,1858\n139136,1860\n139137,206\n139137,80266\n139138,16153\n139139,30\n139140,44\n139141,450\n139142,7757\n139143,1608\n139144,22\n139145,333\n139146,4611\n139147,217\n139148,30\n139149,30\n139150,422\n139151,56\n139152,22\n139153,481\n139153,731\n139154,58\n139155,1102\n139156,158\n139157,809\n139158,2367\n139159,1983\n139160,139161\n139163,30\n139164,1181\n139165,346\n139167,1983\n139168,139169\n139170,146\n139171,1849\n139171,32784\n139172,72\n139173,920\n139173,949\n139173,3769\n139174,240\n139175,30\n139176,934\n139176,949\n139176,2744\n139177,72\n139178,160\n139179,139180\n139181,1983\n139182,2574\n139183,16153\n139184,116\n139184,2087\n139185,138\n139186,2674\n139187,139188\n139189,139190\n139191,481\n139192,1381\n139193,1858\n139194,1860\n139195,457\n139195,535\n139195,918\n139195,1655\n139196,957\n139197,139198\n139199,602\n139200,483\n139201,760\n139202,72\n139203,602\n139205,602\n139206,139207\n139208,146\n139209,647\n139210,344\n139211,366\n139212,1181\n139214,1531\n139215,139216\n139217,146\n139218,647\n139219,344\n139220,139221\n139222,55849\n139223,79\n139224,83\n139225,83\n139226,139227\n139228,1392\n139228,1745\n139229,139230\n139231,139232\n139233,139234\n139235,2506\n139236,30\n139237,19010\n139238,30\n139239,139240\n139239,181426\n139241,139242\n139244,30\n139247,366\n139248,366\n139249,30\n139251,233\n139252,139253\n139254,107\n139255,2416\n139255,2417\n139256,292\n139257,338\n139258,30\n139259,298\n139260,1133\n139261,3538\n139262,355\n139263,602\n139264,602\n139265,9007\n139266,500\n139267,366\n139268,1118\n139270,63\n139271,22\n139272,481\n139273,718\n139274,481\n139275,918\n139276,30\n139277,171\n139278,30\n139279,861\n139280,21442\n139281,195\n139282,30\n139283,139284\n139285,957\n139286,55849\n139287,149\n139288,957\n139289,783\n139290,30\n139291,957\n139292,30\n139293,72\n139294,344\n139295,285\n139296,372\n139297,30\n139298,994\n139299,30\n139300,344\n139301,72\n139302,285\n139303,9001\n139304,358\n139305,171\n139306,2506\n139307,139308\n139307,142727\n139307,144736\n139307,151261\n139309,920\n139310,872\n139311,872\n139312,139313\n139314,344\n139315,72\n139316,285\n139317,30\n139318,30\n139319,287\n139320,957\n139321,631\n139322,72\n139323,285\n139324,344\n139325,30\n139326,920\n139326,1634\n139327,957\n139328,957\n139329,6068\n139330,483\n139331,240\n139332,309\n139332,310\n139333,34\n139333,35\n139334,30\n139335,149\n139336,1262\n139337,957\n139338,957\n139339,957\n139340,344\n139341,285\n139342,72\n139343,957\n139344,957\n139345,957\n139346,957\n139347,30\n139348,139349\n139350,6303\n139351,30\n139352,30\n139355,30\n139356,72\n139357,139358\n139357,144406\n139359,30\n139360,2797\n139361,32\n139362,72\n139363,344\n139364,285\n139365,30\n139366,515\n139367,366\n139368,79\n139369,957\n139370,83\n139371,422\n139372,56\n139373,302\n139374,957\n139375,389\n139376,219\n139377,843\n139377,4545\n139377,56150\n139377,139010\n139378,957\n139379,248\n139380,957\n139381,957\n139382,30\n139383,30\n139384,557\n139386,557\n139387,557\n139388,68069\n139389,1298\n139389,1749\n139390,30\n139391,731\n139392,1220\n139392,1222\n139393,850\n139394,344\n139395,72\n139396,285\n139397,392\n139398,107\n139399,718\n139400,516\n139401,83\n139402,139403\n139402,144453\n139404,56\n139405,422\n139406,422\n139407,56\n139409,139410\n139411,422\n139412,422\n139413,422\n139414,422\n139415,422\n139416,422\n139417,422\n139418,422\n139419,422\n139420,422\n139421,422\n139422,422\n139423,147\n139424,139425\n139426,72\n139427,344\n139428,285\n139429,30\n139430,957\n139431,30\n139433,139434\n139435,366\n139436,278\n139437,32\n139437,202\n139437,283\n139437,323\n139437,392\n139437,455\n139437,536\n139437,577\n139437,623\n139437,874\n139437,949\n139437,1201\n139437,1274\n139437,1454\n139437,1644\n139437,1722\n139437,2266\n139437,2671\n139437,2784\n139437,2931\n139437,7092\n139438,158\n139439,1019\n139440,1837\n139441,30\n139442,292\n139443,366\n139444,34\n139444,35\n139445,294\n139446,30\n139447,30\n139448,296\n139449,298\n139451,139451\n139452,30\n139454,139455\n139456,233\n139457,1983\n139458,72\n139459,344\n139460,285\n139462,1238\n139463,314\n139464,2105\n139466,1452\n139467,355\n139468,139469\n139470,872\n139471,1858\n139472,1860\n139475,30\n139476,55849\n139477,58\n139478,2312\n139479,58\n139480,697\n139481,644\n139482,827\n139483,827\n139484,139485\n139486,30\n139487,134\n139488,292\n139489,980\n139490,55849\n139491,139492\n139493,1417\n139494,579\n139494,1257\n139495,818\n139495,127158\n139496,79\n139497,4545\n139497,56150\n139497,139010\n139499,500\n139500,366\n139501,433\n139502,272\n139503,920\n139504,147\n139504,158\n139504,206\n139504,406\n139504,1515\n139505,30\n139506,392\n139507,344\n139508,285\n139509,72\n139510,255\n139511,602\n139513,481\n139514,516\n139517,1556\n139518,602\n139519,137\n139520,718\n139521,195\n139522,106\n139522,134\n139522,1119\n139522,1745\n139522,2156\n139522,2205\n139522,33424\n139523,827\n139524,58\n139527,760\n139528,289\n139528,290\n139528,94134\n139530,1515\n139531,408\n139532,932\n139533,302\n139534,602\n139535,83\n139536,1983\n139538,5358\n139538,14352\n139539,309\n139539,310\n139539,536\n139540,149\n139541,4611\n139542,1072\n139543,1285\n139544,4222\n139545,433\n139545,934\n139546,22\n139547,647\n139548,146\n139549,344\n139550,302\n139550,489\n139550,579\n139550,687\n139550,811\n139550,818\n139550,861\n139550,893\n139550,1556\n139550,2116\n139553,332\n139555,752\n139556,344\n139557,72\n139558,285\n139559,794\n139561,22\n139563,1070\n139565,3069\n139566,527\n139566,743\n139567,63\n139568,44\n139570,83\n139570,467\n139570,694\n139570,1181\n139570,1623\n139570,3623\n139570,136014\n139571,372\n139572,1118\n139573,873\n139574,647\n139575,146\n139576,344\n139578,59021\n139579,515\n139580,146\n139581,647\n139582,344\n139583,596\n139584,702\n139585,30\n139586,346\n139588,30\n139590,1983\n139591,273\n139591,1132\n139592,1276\n139593,2205\n139593,33424\n139594,140\n139595,647\n139596,146\n139597,344\n139599,22482\n139600,996\n139601,366\n139602,366\n139603,366\n139604,1177\n139604,2210\n139606,577\n139607,139608\n139609,72\n139610,344\n139611,285\n139613,46\n139614,1085\n139615,1359\n139616,2989\n139616,2991\n139617,4545\n139617,139010\n139618,139619\n139620,417\n139621,3507\n139622,30\n139623,5440\n139624,457\n139624,1267\n139626,259\n139627,843\n139628,22\n139629,3585\n139630,4691\n139631,22\n139632,25\n139632,33\n139632,40\n139632,60\n139632,117\n139632,1255\n139632,1432\n139632,1775\n139632,2469\n139632,2674\n139632,2712\n139632,4079\n139632,5871\n139632,9539\n139632,44244\n139632,154690\n139633,920\n139633,1805\n139634,1326\n139635,663\n139636,392\n139637,392\n139639,139640\n139641,818\n139641,127158\n139642,843\n139643,994\n139644,30\n139645,2620\n139646,932\n139647,579\n139647,2373\n139648,137\n139650,406\n139651,1368\n139652,130\n139652,315\n139652,372\n139652,1285\n139652,1888\n139652,2989\n139652,2991\n139653,79\n139654,30\n139655,79\n139656,139657\n139658,663\n139659,240\n139661,41\n139662,139663\n139664,30\n139665,30\n139666,1688\n139667,557\n139668,22\n139669,72\n139670,483\n139671,306\n139671,307\n139672,30\n139673,146\n139674,647\n139675,344\n139676,994\n139677,58\n139678,46\n139679,994\n139680,1370\n139681,139682\n139683,139684\n139685,222\n139685,2989\n139685,2991\n139686,30\n139688,34\n139688,35\n139688,222\n139688,283\n139688,389\n139688,536\n139688,657\n139688,781\n139688,949\n139688,1019\n139688,1072\n139688,1467\n139688,1718\n139688,1881\n139688,2266\n139688,2671\n139688,2784\n139688,4594\n139688,5976\n139688,6888\n139688,29475\n139688,42232\n139689,83\n139689,130\n139689,305\n139689,489\n139689,668\n139689,805\n139689,941\n139689,1058\n139689,1096\n139689,1147\n139689,1479\n139689,1837\n139689,2704\n139689,3218\n139689,3769\n139689,6487\n139690,34\n139690,35\n139690,536\n139690,949\n139691,515\n139691,818\n139692,1117\n139693,58\n139694,1608\n139695,760\n139695,1149\n139696,636\n139697,151\n139699,32751\n139701,809\n139702,372\n139703,139704\n139705,994\n139706,346\n139707,30\n139708,200\n139709,227\n139710,134\n139711,140\n139712,1001\n139713,22\n139714,1466\n139715,6955\n139716,516\n139717,652\n139718,247\n139719,1289\n139720,1579\n139721,861\n139722,10\n139722,68\n139722,94\n139722,111\n139722,119\n139722,195\n139722,227\n139722,309\n139722,310\n139722,315\n139722,323\n139722,420\n139722,442\n139722,452\n139722,473\n139722,489\n139722,510\n139722,704\n139722,818\n139722,1001\n139722,1052\n139722,1085\n139722,1659\n139722,1715\n139722,1776\n139722,1893\n139722,2209\n139722,2626\n139722,2787\n139722,3039\n139722,3041\n139722,4039\n139722,4453\n139722,5213\n139722,6051\n139722,6955\n139722,32475\n139722,54264\n139723,72\n139724,285\n139725,344\n139726,392\n139727,175\n139728,298\n139729,30\n139730,425\n139731,298\n139732,485\n139733,500\n139734,251\n139735,920\n139736,1608\n139737,7\n139738,30\n139739,48\n139740,130\n139741,485\n139742,298\n139743,1871\n139744,48\n139745,752\n139745,9024\n139746,22\n139747,536\n139747,44725\n139748,285\n139748,392\n139748,433\n139748,623\n139748,1181\n139748,1590\n139748,1644\n139748,1805\n139748,68069\n139748,92476\n139749,10\n139749,2574\n139750,2224\n139751,1564\n139753,346\n139756,158\n139757,994\n139758,10\n139758,2574\n139759,68069\n139760,1119\n139760,48505\n139761,139762\n139763,5265\n139764,364\n139765,808\n139765,6955\n139766,139767\n139769,139770\n139771,2574\n139772,1639\n139773,139774\n139775,31977\n139776,171\n139777,602\n139778,139779\n139780,1707\n139781,415\n139783,344\n139784,285\n139785,72\n139786,481\n139787,852\n139788,8854\n139790,139791\n139792,30\n139793,1210\n139794,602\n139795,2083\n139796,83\n139797,406\n139798,30\n139799,9015\n139800,557\n139801,493\n139803,435\n139804,861\n139805,843\n139806,72\n139807,139808\n139809,1590\n139810,149\n139811,30\n139813,30\n139814,3623\n139815,392\n139816,139817\n139818,72\n139819,994\n139820,298\n139821,72\n139822,3999\n139823,422\n139824,422\n139825,422\n139826,422\n139827,422\n139828,422\n139829,422\n139830,422\n139831,467\n139831,1590\n139832,919\n139833,32\n139835,1515\n139837,139838\n139839,139838\n139840,139838\n139841,139838\n139842,139838\n139843,139838\n139844,139838\n139845,139838\n139846,602\n139847,31977\n139847,140171\n139848,714\n139849,527\n139849,581\n139850,536\n139851,139852\n139851,145292\n139851,219527\n139853,366\n139854,2620\n139855,366\n139856,366\n139857,366\n139858,1749\n139859,59021\n139859,60576\n139861,255\n139862,920\n139863,1181\n139864,1556\n139865,139866\n139865,160144\n139867,30\n139868,30\n139869,139870\n139869,141243\n139869,141768\n139869,185815\n139869,217107\n139869,217263\n139869,234203\n139869,235137\n139869,246782\n139871,30\n139872,139873\n139874,310\n139875,843\n139876,175\n139876,1773\n139877,431\n139877,631\n139877,44725\n139878,346\n139879,1458\n139880,1012\n139880,1122\n139880,1849\n139880,32784\n139881,389\n139882,139883\n139882,150938\n139884,30\n139885,640\n139886,862\n139887,2411\n139888,30\n139889,294\n139890,657\n139892,1821\n139893,1801\n139894,139895\n139896,602\n139897,406\n139898,6837\n139900,30\n139901,298\n139902,485\n139903,299\n139904,2116\n139905,843\n139906,516\n139907,2266\n139908,309\n139908,310\n139909,1847\n139911,233\n139912,602\n139913,103860\n139915,30\n139916,139917\n139919,167\n139919,775\n139920,139921\n139922,139923\n139924,5213\n139925,298\n139926,485\n139927,264\n139927,861\n139928,657\n139928,762\n139929,849\n139929,9457\n139930,118\n139930,4597\n139931,119\n139932,139933\n139934,298\n139935,485\n139938,718\n139939,1402\n139940,2411\n139941,30\n139942,3367\n139943,240\n139943,1818\n139944,298\n139945,485\n139947,433\n139948,422\n139949,1181\n139950,6506\n139951,717\n139953,72\n139954,72\n139954,225\n139954,248\n139954,296\n139954,358\n139954,383\n139954,509\n139954,850\n139954,1052\n139954,1179\n139954,1332\n139954,1722\n139954,1893\n139954,1939\n139954,3538\n139954,3695\n139954,5405\n139955,1634\n139956,1566\n139957,83\n139958,1010\n139959,1522\n139960,56\n139961,422\n139962,72\n139964,1983\n139966,5667\n139967,1118\n139968,481\n139969,4545\n139969,139010\n139970,273\n139971,139972\n139973,588\n139973,590\n139974,3079\n139975,1118\n139976,392\n139976,433\n139977,1118\n139978,10\n139979,893\n139980,1419\n139981,1285\n139982,358\n139983,302\n139985,2312\n139986,422\n139988,875\n139989,3623\n139990,3623\n139991,875\n139992,4455\n139994,298\n139994,818\n139994,44725\n139994,178576\n139995,1893\n139996,994\n139997,46\n139998,58\n139999,714\n140000,1893\n140001,233\n140001,301\n140001,525\n140001,1235\n140002,5405\n140003,1893\n140004,104\n140005,557\n140006,784\n140007,209\n140008,248\n140008,1332\n140009,22\n140010,779\n140010,68069\n140011,1564\n140012,408\n140013,1323\n140014,102\n140015,1326\n140016,690\n140017,1425\n140018,209\n140019,1262\n140021,217\n140021,932\n140021,1010\n140022,30\n140023,298\n140024,1012\n140025,1807\n140026,4611\n140027,623\n140028,175\n140029,298\n140031,1070\n140032,285\n140033,425\n140034,1085\n140035,1564\n140036,1127\n140037,920\n140038,697\n140038,2620\n140039,994\n140040,7155\n140041,269\n140043,3695\n140045,44\n140046,147\n140047,932\n140048,818\n140050,1544\n140051,15119\n140053,1058\n140055,283\n140055,313\n140055,455\n140055,657\n140055,1019\n140055,2421\n140055,2424\n140055,5192\n140055,7768\n140055,20757\n140055,115474\n140056,167\n140056,1849\n140056,5301\n140056,32784\n140057,1130\n140058,718\n140059,515\n140060,1220\n140060,1222\n140061,252\n140062,251\n140063,72\n140065,720\n140066,30\n140067,72\n140069,1181\n140070,1132\n140071,994\n140073,980\n140074,392\n140075,2209\n140076,640\n140077,1983\n140080,2353\n140081,1644\n140082,3367\n140085,104\n140086,240\n140087,134\n140088,163\n140089,55849\n140090,1411\n140092,289\n140092,290\n140092,94134\n140092,144988\n140094,623\n140094,1805\n140095,397\n140095,592\n140095,1818\n140096,140097\n140099,346\n140100,440\n140100,694\n140100,1284\n140101,206\n140102,127158\n140103,515\n140104,206\n140105,140106\n140107,140108\n140109,140108\n140110,140108\n140111,140108\n140112,140108\n140113,55849\n140114,1014\n140115,167\n140115,1284\n140116,1284\n140118,2224\n140119,346\n140121,136072\n140122,178\n140122,315\n140122,622\n140122,1033\n140123,1858\n140124,18831\n140125,30\n140126,30\n140127,356\n140127,577\n140127,852\n140128,175\n140129,298\n140130,55849\n140131,663\n140135,392\n140136,481\n140137,1749\n140138,217\n140138,536\n140138,1417\n140139,301\n140140,2224\n140141,15119\n140143,1149\n140144,1968\n140145,1612\n140146,875\n140147,3623\n140148,140149\n140150,1612\n140151,1392\n140152,515\n140153,841\n140154,217\n140155,344\n140156,72\n140157,285\n140158,30\n140160,994\n140161,46\n140162,58\n140163,1010\n140164,298\n140165,485\n140166,483\n140167,406\n140168,301\n140168,467\n140169,79\n140170,7360\n140172,1001\n140173,1983\n140174,1411\n140176,135\n140177,920\n140178,240\n140179,222\n140179,1415\n140181,406\n140181,779\n140182,406\n140183,557\n140184,72\n140185,885\n140185,13704\n140186,267\n140187,140\n140188,872\n140189,1058\n140190,872\n140191,435\n140192,907\n140193,301\n140194,2574\n140195,873\n140195,874\n140196,2421\n140197,13485\n140198,56\n140199,422\n140200,255\n140201,358\n140203,843\n140204,171\n140205,422\n140206,56\n140207,79\n140207,1181\n140210,30\n140211,1983\n140212,255\n140213,403\n140214,106\n140215,417\n140216,171\n140217,994\n140218,2116\n140219,872\n140220,1177\n140220,6263\n140221,1116\n140223,255\n140225,278\n140226,577\n140227,4611\n140228,8854\n140229,160\n140229,707\n140230,30\n140231,1707\n140231,20004\n140232,22\n140233,72\n140234,72\n140235,22\n140236,872\n140237,72\n140238,323\n140239,72\n140240,1556\n140241,30\n140242,2590\n140243,72\n140244,140245\n140247,640\n140247,3695\n140248,1659\n140249,30236\n140250,207\n140251,140252\n140253,140252\n140254,306\n140254,307\n140255,22\n140256,140257\n140258,392\n140259,140260\n140261,872\n140262,1429\n140263,668\n140264,140265\n140266,22\n140267,217\n140267,1417\n140268,602\n140271,1143\n140272,7416\n140273,310\n140274,113156\n140275,269\n140276,113156\n140277,140278\n140279,366\n140280,72\n140281,827\n140282,251\n140283,140284\n140285,1818\n140286,233\n140287,140288\n140287,145288\n140287,156789\n140287,158089\n140291,31977\n140294,3\n140295,1388\n140295,142430\n140295,142473\n140296,355\n140297,515\n140298,22\n140299,222\n140300,872\n140301,140302\n140303,140304\n140305,626\n140306,59021\n140307,3724\n140308,808\n140308,6424\n140308,212914\n140309,207\n140309,693\n140310,298\n140311,485\n140312,647\n140313,596\n140314,602\n140316,911\n140318,811\n140319,4355\n140320,808\n140321,140322\n140323,140322\n140324,1181\n140325,137\n140325,138\n140326,1359\n140327,72\n140329,718\n140330,557\n140331,1298\n140332,1844\n140333,1224\n140333,3507\n140334,72\n140335,422\n140336,344\n140338,309\n140338,310\n140339,920\n140340,3193\n140342,222\n140342,389\n140342,455\n140342,657\n140343,302\n140344,422\n140345,422\n140346,422\n140347,422\n140348,422\n140349,422\n140350,422\n140351,422\n140352,422\n140353,37\n140356,3182\n140358,328\n140359,140360\n140359,141667\n140361,298\n140362,485\n140363,872\n140364,818\n140366,140367\n140368,30\n140369,1414\n140371,30\n140373,1019\n140374,140375\n140376,332\n140378,536\n140379,1284\n140380,4571\n140381,200\n140382,140383\n140385,481\n140386,779\n140387,195\n140388,3623\n140390,77\n140391,304\n140392,775\n140393,1417\n140394,79\n140395,439\n140396,175\n140397,72\n140398,58\n140399,298\n140400,2017\n140401,1238\n140402,309\n140402,310\n140403,309\n140403,310\n140404,124668\n140405,35750\n140405,35751\n140406,58\n140407,1452\n140408,1509\n140409,663\n140410,775\n140411,138\n140412,16153\n140413,116\n140413,2087\n140414,2674\n140417,83\n140418,72\n140419,113156\n140420,433\n140421,140422\n140423,622\n140424,200\n140424,2443\n140425,292\n140427,356\n140427,852\n140428,408\n140429,1323\n140430,1326\n140431,102\n140432,657\n140432,6506\n140434,671\n140435,79\n140435,202\n140435,251\n140435,252\n140435,516\n140435,1181\n140435,1220\n140435,1222\n140435,1243\n140436,811\n140437,994\n140438,1715\n140439,136\n140440,920\n140441,779\n140442,920\n140443,920\n140444,1556\n140445,1893\n140446,920\n140447,1140\n140447,5547\n140448,663\n140449,957\n140449,1815\n140450,44\n140451,4611\n140452,7768\n140452,37088\n140453,1181\n140455,31073\n140456,1782\n140457,209\n140458,167\n140459,200\n140460,79\n140460,389\n140460,676\n140460,138686\n140461,209\n140462,2989\n140462,2991\n140463,3218\n140464,6027\n140465,22293\n140466,140467\n140468,3623\n140469,264\n140469,1289\n140470,56\n140471,83\n140472,83\n140473,779\n140474,406\n140475,30331\n140476,140477\n140478,140477\n140479,1007\n140480,3623\n140481,579\n140484,146\n140485,647\n140486,344\n140488,1707\n140489,422\n140490,56\n140492,58\n140493,366\n140494,1400\n140495,366\n140496,602\n140497,1085\n140498,893\n140499,422\n140500,56\n140502,1127\n140504,2775\n140505,447\n140506,5101\n140507,772\n140508,2775\n140509,447\n140511,289\n140511,290\n140511,304\n140511,4411\n140511,94134\n140513,515\n140514,30\n140515,30\n140516,1118\n140517,3623\n140518,663\n140519,718\n140520,949\n140520,208669\n140521,663\n140522,22\n140523,68\n140524,200\n140525,3623\n140528,602\n140529,3623\n140530,1359\n140531,873\n140532,200\n140533,3623\n140534,1149\n140535,175\n140537,298\n140538,861\n140539,207\n140540,809\n140542,875\n140543,875\n140544,111142\n140545,147\n140546,3623\n140548,644\n140549,72\n140550,7092\n140551,175\n140552,602\n140553,920\n140554,72\n140555,240\n140556,1402\n140557,255\n140558,79\n140559,1127\n140560,592\n140561,835\n140562,2506\n140563,298\n140564,485\n140565,298\n140566,485\n140567,392\n140568,920\n140569,99\n140569,1363\n140569,1465\n140569,13361\n140569,148742\n140570,485\n140571,298\n140572,298\n140573,485\n140574,485\n140575,298\n140576,298\n140577,485\n140578,392\n140580,138\n140581,116\n140581,2087\n140582,16153\n140583,2674\n140584,4611\n140585,2979\n140586,1707\n140587,602\n140588,115474\n140589,972\n140590,72\n140592,140593\n140594,240\n140595,577\n140596,557\n140597,7360\n140599,104\n140601,19010\n140602,366\n140603,366\n140604,366\n140605,366\n140606,366\n140607,366\n140608,920\n140609,2590\n140610,140611\n140612,140613\n140614,435\n140615,207\n140616,140617\n140618,872\n140619,1429\n140620,2995\n140621,2617\n140622,255\n140623,668\n140624,1634\n140625,304\n140626,140627\n140628,31977\n140629,7155\n140630,140\n140632,140633\n140636,233\n140637,714\n140638,140639\n140640,140639\n140641,140642\n140643,140644\n140643,141673\n140643,142585\n140645,1143\n140647,6506\n140648,140649\n140650,217\n140650,1417\n140651,1882\n140652,355\n140653,356\n140653,852\n140654,602\n140654,1425\n140655,602\n140656,1465\n140658,140659\n140660,140661\n140662,140661\n140666,44725\n140667,422\n140668,422\n140669,422\n140670,422\n140671,422\n140672,422\n140673,422\n140674,422\n140675,422\n140676,422\n140677,422\n140678,422\n140680,30\n140681,75912\n140682,140683\n140684,2443\n140686,392\n140686,697\n140686,1769\n140687,2105\n140689,2557\n140691,1631\n140692,743\n140692,8714\n140694,408\n140694,1326\n140698,140699\n140703,83\n140704,623\n140704,1805\n140705,1231\n140706,83\n140709,83\n140710,72\n140712,140713\n140714,1204\n140716,481\n140717,433\n140718,875\n140719,118\n140719,4597\n140720,442\n140721,497\n140722,151\n140723,298\n140724,485\n140725,1122\n140726,136\n140727,634\n140728,980\n140730,393\n140731,175\n140732,298\n140733,1849\n140733,32784\n140734,2671\n140735,252\n140735,415\n140735,1454\n140736,809\n140737,259\n140738,111\n140739,1556\n140740,83\n140741,1300\n140742,1556\n140743,4223\n140744,200\n140746,808\n140748,918\n140749,6506\n140750,388\n140751,1893\n140752,652\n140753,79\n140754,920\n140755,634\n140757,663\n140758,5034\n140761,485\n140762,298\n140763,408\n140764,1323\n140765,1326\n140766,102\n140767,455\n140768,1252\n140768,1253\n140769,298\n140770,485\n140771,509\n140771,510\n140772,827\n140773,104\n140773,134\n140773,137\n140773,138\n140773,205627\n140774,1782\n140775,113156\n140776,1612\n140779,392\n140780,222\n140781,56\n140781,2244\n140782,310\n140783,1707\n140784,1707\n140786,292\n140787,1167\n140787,5718\n140788,596\n140789,392\n140790,861\n140792,30\n140793,872\n140795,859\n140796,581\n140797,309\n140797,310\n140798,206\n140798,2105\n140799,3623\n140800,140801\n140802,309\n140802,310\n140803,309\n140803,310\n140804,44\n140805,949\n140806,26041\n140807,1305\n140808,273\n140808,313\n140809,4545\n140809,139010\n140810,309\n140810,310\n140812,140813\n140814,450\n140816,22\n140817,779\n140819,30\n140820,140821\n140822,58\n140823,994\n140824,46\n140825,875\n140826,1192\n140827,714\n140829,1130\n140829,138686\n140830,22\n140831,663\n140832,278\n140832,2421\n140834,258\n140834,72439\n140835,663\n140836,163\n140837,30\n140839,30\n140840,1252\n140840,1253\n140841,309\n140841,310\n140842,586\n140843,14126\n140844,663\n140845,1564\n140846,358\n140847,328\n140848,1298\n140849,1515\n140850,455\n140851,636\n140852,34\n140852,35\n140853,586\n140854,3804\n140855,30331\n140856,2989\n140856,2991\n140857,1466\n140858,294\n140858,2620\n140859,631\n140860,1274\n140861,392\n140862,261\n140862,493\n140862,2045\n140863,217\n140864,140865\n140866,333\n140867,875\n140868,5440\n140869,217\n140870,440\n140871,1579\n140872,247\n140873,217\n140874,79\n140875,1\n140875,184\n140876,1467\n140877,30\n140878,393\n140879,136\n140879,137\n140880,9001\n140881,1359\n140882,3623\n140883,283\n140884,10\n140884,222\n140884,446\n140885,697\n140886,827\n140887,2116\n140888,875\n140889,1465\n140890,2353\n140891,192\n140892,175\n140893,298\n140894,516\n140895,219\n140896,1984\n140897,79\n140898,1522\n140899,22\n140900,602\n140901,1836\n140902,538\n140903,808\n140904,10\n140905,149\n140906,1298\n140907,140908\n140909,140908\n140910,885\n140910,13704\n140911,718\n140912,140913\n140914,406\n140915,483\n140916,192\n140917,200\n140917,332\n140917,1177\n140918,557\n140919,1016\n140920,140921\n140922,140923\n140924,140925\n140926,79\n140927,1235\n140927,1335\n140928,107\n140928,240\n140928,1462\n140928,8537\n140929,83\n140930,358\n140931,697\n140932,872\n140934,41\n140934,68\n140934,240\n140934,294\n140934,631\n140934,760\n140934,805\n140934,1119\n140934,1285\n140934,2995\n140934,3135\n140935,949\n140936,770\n140937,2116\n140938,392\n140939,1252\n140939,1253\n140940,1224\n140943,577\n140944,140945\n140946,140945\n140947,602\n140948,602\n140949,140950\n140951,862\n140951,907\n140952,171\n140953,920\n140954,298\n140955,485\n140956,140957\n140958,10\n140959,364\n140961,140962\n140961,141025\n140961,141484\n140961,141611\n140961,145799\n140961,213896\n140961,218101\n140961,257854\n140961,259305\n140961,265037\n140963,140964\n140965,140966\n140967,140966\n140968,207\n140969,140970\n140971,140972\n140973,872\n140974,1429\n140975,310\n140976,10\n140977,289\n140977,290\n140977,2205\n140977,2296\n140977,33424\n140977,94134\n140978,140979\n140980,668\n140981,140982\n140983,140984\n140985,30\n140987,140988\n140989,1143\n140990,697\n140992,140993\n140994,113156\n140996,140997\n140998,140999\n140998,141352\n141000,141001\n141003,255\n141004,141005\n141006,72\n141007,3209\n141008,233\n141009,366\n141010,366\n141011,366\n141012,366\n141013,366\n141014,366\n141015,366\n141016,366\n141018,355\n141019,861\n141021,323\n141022,1238\n141023,30\n141024,366\n141026,1452\n141027,1068\n141028,298\n141029,485\n141030,422\n141031,809\n141032,422\n141033,422\n141034,422\n141035,422\n141036,422\n141037,422\n141038,422\n141039,422\n141040,72\n141041,422\n141042,422\n141043,422\n141044,422\n141045,298\n141046,485\n141047,536\n141048,81\n141049,33611\n141050,167\n141051,175\n141052,298\n141053,1634\n141054,481\n141056,83\n141057,602\n141059,83\n141060,79\n141061,248\n141061,1332\n141062,141063\n141064,1608\n141065,875\n141066,141067\n141066,151654\n141066,195248\n141066,196822\n141066,198591\n141066,220525\n141066,236393\n141066,242482\n141066,243133\n141066,245042\n141068,217\n141069,1458\n141070,1298\n141071,83\n141071,1467\n141072,602\n141073,589\n141073,75912\n141074,1181\n141075,147\n141076,141077\n141078,392\n141079,408\n141080,1326\n141081,1323\n141082,102\n141083,2116\n141085,312\n141086,872\n141087,510\n141088,1531\n141089,1149\n141089,1266\n141090,175\n141091,298\n141093,120\n141094,422\n141095,446\n141096,3422\n141097,44\n141098,2116\n141099,1688\n141100,141101\n141100,161001\n141100,181232\n141100,252233\n141100,257349\n141102,79\n141103,79\n141104,663\n141105,1436\n141107,1458\n141108,596\n141109,30\n141111,141112\n141113,3\n141113,2620\n141114,140\n141114,1052\n141114,1127\n141114,1579\n141114,1639\n141114,1893\n141114,2312\n141114,3695\n141114,6695\n141115,3\n141115,2620\n141116,30\n141118,312\n141119,55849\n141120,760\n141122,68\n141124,779\n141125,107\n141125,579\n141126,141127\n141128,634\n141128,6298\n141129,72\n141130,141131\n141132,1631\n141133,1955\n141134,141135\n141136,34\n141136,35\n141136,83\n141136,222\n141136,278\n141136,283\n141136,389\n141136,406\n141136,536\n141136,657\n141136,694\n141136,720\n141136,781\n141136,877\n141136,907\n141136,949\n141136,1019\n141136,1072\n141136,1284\n141136,1467\n141136,1522\n141136,1718\n141136,1732\n141136,1881\n141136,1955\n141136,2191\n141136,2266\n141136,2671\n141136,2699\n141136,2784\n141136,3115\n141136,3194\n141136,3422\n141136,4594\n141136,5976\n141136,6888\n141136,29475\n141136,42232\n141137,1033\n141138,141139\n141138,142937\n141142,1939\n141144,298\n141145,485\n141146,141147\n141148,1282\n141149,301\n141149,968\n141150,1240\n141151,663\n141152,175\n141153,875\n141154,298\n141155,333\n141156,289\n141156,290\n141156,94134\n141157,875\n141158,885\n141158,13704\n141159,158\n141159,406\n141159,1181\n141162,1509\n141163,424\n141164,141165\n141166,141165\n141167,2590\n141168,50\n141168,79\n141169,255\n141170,72\n141171,141172\n141173,1465\n141174,30\n141177,364\n141178,422\n141179,298\n141179,714\n141179,805\n141179,2205\n141179,33424\n141179,136072\n141179,245910\n141180,206\n141180,72764\n141181,481\n141182,422\n141183,56\n141184,620\n141184,4611\n141185,1188\n141186,1085\n141187,264\n141188,697\n141188,808\n141188,1240\n141188,1453\n141188,2699\n141188,3367\n141188,24763\n141189,30\n141190,141191\n141190,149676\n141192,30\n141193,1556\n141194,1983\n141195,875\n141196,3623\n141197,10\n141197,273\n141198,422\n141199,56\n141200,932\n141201,141202\n141203,104\n141204,141205\n141206,72\n141207,225\n141208,1707\n141210,557\n141211,5906\n141212,626\n141213,278\n141214,137\n141215,862\n141216,557\n141217,8719\n141218,138\n141219,865\n141220,557\n141221,137\n141222,118\n141222,4597\n141223,88820\n141224,171\n141225,332\n141226,141226\n141227,30\n141228,255\n141229,255\n141231,83\n141232,68069\n141233,72\n141234,525\n141236,1707\n141237,1359\n141238,1309\n141239,1509\n141240,631\n141241,1247\n141242,294\n141244,8884\n141245,1252\n141245,1253\n141246,779\n141247,1117\n141248,726\n141248,852\n141249,255\n141250,141251\n141250,186181\n141252,1085\n141253,141254\n141255,30\n141256,1556\n141257,141258\n141257,144934\n141259,346\n141259,873\n141259,996\n141259,1105\n141259,1119\n141259,1564\n141259,1635\n141259,1801\n141259,1927\n141259,2274\n141259,2784\n141259,7092\n141260,141261\n141262,20257\n141264,30\n141265,2367\n141266,30\n141267,30\n141268,344\n141269,72\n141270,285\n141271,141272\n141273,141274\n141273,154178\n141275,30\n141276,8373\n141277,141278\n141279,141278\n141280,141278\n141282,2334\n141283,141284\n141285,447\n141285,1181\n141286,141287\n141289,141290\n141291,141292\n141293,483\n141294,30\n141295,304\n141296,30\n141297,30\n141298,141299\n141301,1\n141302,141303\n141304,30\n141305,141306\n141307,366\n141308,366\n141309,366\n141310,366\n141311,366\n141312,366\n141313,30\n141314,30\n141315,217\n141315,1417\n141316,1007\n141318,158\n141319,233\n141321,54\n141321,278\n141321,283\n141321,455\n141321,1019\n141321,1467\n141321,1871\n141321,2421\n141321,6789\n141321,37088\n141323,55849\n141324,355\n141325,83\n141326,31977\n141326,151807\n141326,207317\n141326,220677\n141327,141328\n141327,151587\n141327,156888\n141329,83\n141330,141331\n141333,141334\n141336,83\n141337,141338\n141341,83\n141342,83\n141343,141344\n141343,145832\n141347,861\n141348,83\n141349,481\n141350,141351\n141353,30\n141354,83\n141355,30\n141355,99807\n141356,2266\n141357,1149\n141358,141359\n141360,994\n141361,30\n141362,83\n141363,141364\n141365,141364\n141366,141364\n141367,141364\n141368,141364\n141369,141364\n141370,141371\n141372,141373\n141374,44\n141375,30\n141376,149\n141376,195\n141377,406\n141377,127158\n141379,994\n141381,141382\n141383,141382\n141384,141382\n141385,141382\n141386,994\n141387,141388\n141390,392\n141390,1001\n141391,255\n141392,255\n141393,994\n141394,141395\n141394,149386\n141394,151811\n141396,72\n141397,393\n141398,141399\n141400,141401\n141400,142241\n141402,994\n141403,30\n141404,636\n141405,1607\n141406,1359\n141407,141408\n141409,149\n141410,72\n141411,72\n141412,1608\n141413,141414\n141415,141416\n141417,129410\n141418,22\n141419,141420\n141421,366\n141422,366\n141423,30\n141424,141425\n141426,192\n141427,72\n141428,72\n141429,171\n141430,30\n141431,141432\n141433,72\n141434,483\n141435,141436\n141437,141436\n141438,141439\n141440,72\n141441,30\n141442,78400\n141443,994\n141444,994\n141445,483\n141446,141447\n141448,141449\n141451,602\n141453,1509\n141454,3260\n141455,141456\n141457,611\n141458,3079\n141459,1509\n141460,3079\n141461,1983\n141462,141463\n141464,602\n141465,72\n141466,1479\n141467,141468\n141469,390\n141470,30\n141471,72\n141472,1983\n141473,3148\n141474,2989\n141474,2991\n141475,141476\n141477,141478\n141480,602\n141481,135179\n141483,1247\n141485,602\n141486,1531\n141487,83\n141488,106\n141488,60576\n141489,72\n141490,151\n141491,1983\n141494,151\n141495,141496\n141497,141498\n141500,258\n141501,875\n141502,141503\n141507,663\n141509,141510\n141511,30\n141512,141513\n141514,141515\n141516,141517\n141518,141519\n141520,104\n141520,134\n141520,135\n141520,136\n141520,137\n141520,138\n141520,557\n141520,850\n141520,1368\n141520,2105\n141522,30\n141523,141524\n141525,30\n141526,1181\n141527,141528\n141529,141528\n141531,83\n141532,72\n141534,107\n141535,292\n141536,2416\n141536,2417\n141537,338\n141538,298\n141539,1133\n141540,141541\n141542,3538\n141543,141544\n141545,355\n141546,137\n141549,2784\n141550,83\n141551,141552\n141553,141552\n141554,30\n141555,4611\n141556,83\n141558,83\n141559,119\n141560,302\n141561,83\n141562,83\n141563,1818\n141564,567\n141564,1345\n141565,83\n141567,83\n141567,1467\n141568,298\n141569,485\n141571,141572\n141573,1983\n141574,1858\n141575,1860\n141576,19519\n141577,481\n141580,298\n141581,485\n141582,298\n141583,485\n141584,3524\n141586,602\n141587,141588\n141589,83\n141592,1707\n141593,141594\n141595,141596\n141597,1955\n141597,3623\n141598,141599\n141600,44\n141602,141603\n141604,72\n141605,602\n141607,1241\n141608,30\n141609,141610\n141613,1955\n141614,32\n141615,55849\n141616,141617\n141620,30\n141621,48\n141622,289\n141622,290\n141622,94134\n141623,557\n141624,875\n141625,240\n141625,127158\n141626,671\n141627,141628\n141627,155532\n141629,141630\n141631,141630\n141632,83\n141632,1313\n141633,872\n141634,1374\n141635,372\n141635,631\n141636,358\n141637,141638\n141639,1220\n141639,1222\n141639,1512\n141640,141641\n141642,141643\n141644,55849\n141645,141646\n141647,141646\n141648,72\n141649,602\n141650,141651\n141652,850\n141653,141654\n141655,141654\n141656,6424\n141656,28107\n141657,602\n141658,602\n141659,8270\n141660,3623\n141661,328\n141662,1267\n141663,850\n141664,557\n141665,557\n141666,557\n141668,141669\n141670,30\n141671,850\n141672,50\n141674,850\n141675,850\n141676,141677\n141678,850\n141679,141680\n141681,1983\n141682,141683\n141684,141683\n141685,141686\n141687,141686\n141688,141686\n141689,141686\n141690,141686\n141691,141686\n141692,850\n141693,1983\n141694,16153\n141695,2674\n141696,116\n141696,2087\n141697,138\n141698,1105\n141699,1294\n141700,141701\n141702,141703\n141704,2266\n141705,422\n141706,422\n141707,422\n141708,422\n141709,422\n141710,422\n141711,422\n141712,422\n141713,422\n141714,422\n141715,1983\n141717,1983\n141718,30\n141719,141720\n141723,602\n141724,1117\n141725,141726\n141725,151300\n141727,447\n141728,2775\n141729,83\n141732,141733\n141734,30\n141735,141736\n141737,10\n141737,37\n141737,50\n141737,106\n141737,147\n141737,158\n141737,192\n141737,195\n141737,267\n141737,333\n141737,337\n141737,505\n141737,586\n141737,640\n141737,663\n141737,779\n141737,872\n141737,1177\n141737,1370\n141737,1572\n141737,1985\n141737,2782\n141737,3148\n141737,6323\n141737,27217\n141738,366\n141739,366\n141740,366\n141741,30\n141742,483\n141743,30\n141744,30\n141745,200\n141746,141747\n141748,292\n141749,294\n141750,296\n141751,298\n141752,141753\n141754,141753\n141755,151\n141756,141757\n141758,30\n141759,393\n141760,2590\n141761,141762\n141763,1849\n141763,32784\n141765,141766\n141767,207\n141769,83\n141770,14989\n141771,14989\n141772,14989\n141773,690\n141774,1381\n141776,83\n141777,1983\n141778,1238\n141779,450\n141780,538\n141781,141782\n141783,872\n141785,1429\n141786,1452\n141787,872\n141788,200\n141790,147\n141790,149\n141790,158\n141790,178\n141790,406\n141790,585\n141790,602\n141790,622\n141790,1425\n141791,83\n141793,1241\n141794,647\n141795,2574\n141796,1983\n141797,1782\n141798,141799\n141800,141799\n141801,141799\n141802,141799\n141803,141799\n141804,141799\n141805,141799\n141806,141799\n141808,668\n141810,483\n141811,850\n141812,149\n141813,273\n141815,2574\n141816,136072\n141817,467\n141818,7698\n141820,447\n141822,149\n141823,1243\n141824,1531\n141825,55849\n141826,872\n141827,5101\n141828,1370\n141829,141830\n141831,1235\n141831,1335\n141832,433\n141833,149\n141833,195\n141834,784\n141835,392\n141837,298\n141838,485\n141839,843\n141840,278\n141840,176782\n141841,843\n141842,30\n141843,843\n141845,1983\n141847,602\n141848,1580\n141849,1127\n141852,1220\n141852,1222\n141853,137\n141854,579\n141855,63\n141856,22\n141857,481\n141859,1659\n141860,760\n141860,818\n141860,1149\n141860,1631\n141860,142473\n141862,30\n141863,1559\n141864,30\n141865,30\n141869,55849\n141870,1531\n141871,1858\n141872,1860\n141874,30\n141875,2312\n141876,2116\n141877,30\n141878,872\n141879,1149\n141880,1858\n141881,1860\n141882,1238\n141883,217\n141883,336\n141883,1163\n141883,1181\n141883,1531\n141884,872\n141885,22\n141886,5718\n141887,671\n141888,141889\n141888,145279\n141888,150284\n141890,7698\n141891,83\n141893,22\n141895,1556\n141896,22\n141897,141898\n141899,141900\n141901,30\n141902,37\n141903,668\n141904,2989\n141904,2991\n141905,141906\n141907,141906\n141908,141906\n141909,31977\n141910,2989\n141910,2991\n141911,2989\n141911,2991\n141912,50\n141912,146\n141912,149\n141912,175\n141912,195\n141912,211\n141912,285\n141912,328\n141912,336\n141912,406\n141912,505\n141912,620\n141912,622\n141912,779\n141912,809\n141912,841\n141912,903\n141912,1502\n141912,1521\n141912,1604\n141912,2418\n141912,3449\n141912,4354\n141912,4465\n141912,4558\n141912,4617\n141912,5601\n141912,5604\n141912,5678\n141912,6646\n141912,13235\n141912,13390\n141912,14040\n141912,18400\n141912,18646\n141912,20494\n141912,24835\n141912,26133\n141912,29055\n141912,31942\n141912,32786\n141912,35623\n141912,38989\n141912,40288\n141912,43239\n141912,43893\n141912,46609\n141912,49547\n141912,49585\n141912,49586\n141912,49838\n141912,64684\n141912,68069\n141912,68089\n141912,70995\n141912,77566\n141912,79528\n141912,84059\n141912,86686\n141912,87277\n141912,88692\n141912,88867\n141912,90139\n141912,90794\n141912,92091\n141912,92476\n141912,93125\n141912,94859\n141912,95465\n141912,95599\n141912,95628\n141912,95748\n141912,96561\n141912,97423\n141912,100029\n141912,103828\n141912,106775\n141912,107032\n141912,107051\n141912,107423\n141912,107977\n141912,108273\n141912,108477\n141912,109259\n141912,109358\n141912,112380\n141912,116718\n141912,118336\n141912,122407\n141912,122430\n141912,122437\n141912,122489\n141912,122702\n141912,123725\n141912,126292\n141912,135341\n141912,136603\n141912,137793\n141912,141790\n141912,141912\n141912,143192\n141912,145035\n141912,147316\n141912,149343\n141912,150096\n141912,150452\n141912,152788\n141912,152795\n141912,152798\n141912,152836\n141912,152904\n141912,152921\n141912,153133\n141912,153192\n141912,154390\n141912,154750\n141912,155437\n141912,155722\n141912,156702\n141912,158280\n141912,158539\n141912,159778\n141912,164187\n141912,164354\n141912,165211\n141912,165230\n141912,165374\n141912,165756\n141912,165784\n141912,166386\n141912,166409\n141912,166528\n141912,167832\n141912,169460\n141912,171748\n141912,171813\n141912,176455\n141912,185461\n141912,187768\n141912,189927\n141912,191939\n141912,204235\n141912,207570\n141912,207691\n141912,211746\n141912,214621\n141912,219634\n141912,219917\n141912,221250\n141912,221261\n141912,221934\n141912,221936\n141912,222121\n141912,224650\n141912,224670\n141912,229182\n141912,230737\n141912,237579\n141912,237580\n141912,237623\n141912,238330\n141912,241504\n141912,243853\n141912,245440\n141912,247061\n141912,249788\n141912,253323\n141912,255484\n141912,255532\n141912,258288\n141912,259513\n141912,260788\n141913,779\n141913,1515\n141914,48\n141914,1151\n141915,141916\n141917,225\n141917,4039\n141917,5405\n141918,2367\n141920,298\n141921,485\n141922,1238\n141923,611\n141925,30\n141926,1167\n141927,1289\n141928,22\n141929,255\n141930,255\n141931,175\n141932,298\n141933,22\n141935,44\n141936,30\n141937,1858\n141938,1860\n141939,932\n141940,30\n141941,16153\n141942,116\n141942,2087\n141943,2674\n141944,138\n141945,99\n141945,779\n141945,68069\n141946,3756\n141947,579\n141948,1983\n141949,2782\n141950,55849\n141951,1143\n141952,1204\n141953,663\n141954,1531\n141956,79\n141957,2979\n141958,211\n141959,1119\n141961,37\n141962,83\n141963,697\n141966,141967\n141968,406\n141969,510\n141970,1801\n141975,205\n141976,1127\n141977,141978\n141979,141978\n141980,349\n141981,1722\n141983,255\n141984,1849\n141984,32784\n141985,592\n141985,1001\n141986,247\n141987,1175\n141988,422\n141989,422\n141990,422\n141991,422\n141992,422\n141993,422\n141994,422\n141995,422\n141996,55849\n141997,516\n141997,1243\n141997,206297\n141998,298\n141999,485\n142000,1509\n142001,1119\n142002,349\n142002,392\n142002,595\n142002,694\n142002,1240\n142002,1453\n142002,1454\n142002,2699\n142002,3367\n142002,9098\n142002,24763\n142003,298\n142004,485\n142005,127158\n142007,142008\n142007,153096\n142009,30\n142010,5440\n142011,142012\n142011,246895\n142013,178\n142015,2574\n142017,1370\n142018,424\n142020,30\n142022,994\n142023,515\n142024,2266\n142025,4455\n142026,1368\n142027,3623\n142028,435\n142029,1849\n142029,15807\n142029,32784\n142030,406\n142031,14458\n142032,356\n142032,852\n142032,1179\n142032,6068\n142033,195\n142034,1\n142034,83\n142034,160\n142034,702\n142034,712\n142035,72\n142036,536\n142037,2867\n142037,2868\n142038,30\n142039,422\n142039,602\n142040,1119\n142041,175\n142042,455\n142043,298\n142045,811\n142046,843\n142047,424\n142049,433\n142051,251\n142051,252\n142051,577\n142051,1105\n142051,1220\n142051,1222\n142051,1429\n142053,142054\n142055,874\n142055,1210\n142056,973\n142057,94\n142057,116\n142057,994\n142057,1235\n142057,2087\n142058,872\n142059,907\n142060,3\n142061,392\n142062,433\n142063,2274\n142064,298\n142065,485\n142066,372\n142068,142069\n142071,83\n142072,1515\n142073,142073\n142075,2989\n142075,2991\n142076,827\n142077,973\n142078,149\n142079,142080\n142081,483\n142082,3507\n142084,240\n142085,142086\n142087,142086\n142089,142090\n142091,406\n142092,392\n142096,30\n142097,142098\n142099,142100\n142101,142102\n142101,148645\n142101,149611\n142103,527\n142104,30\n142105,1127\n142106,2379\n142107,142108\n142109,439\n142109,1370\n142109,127158\n142110,142111\n142112,142113\n142114,142113\n142116,149\n142117,312\n142118,142119\n142120,4220\n142121,3846\n142122,178\n142123,1955\n142124,149\n142125,113156\n142126,1434\n142127,171\n142129,142130\n142131,1452\n142131,21982\n142133,379\n142134,3111\n142135,1247\n142136,1188\n142137,142138\n142137,158969\n142139,142140\n142141,264\n142141,1381\n142142,4545\n142142,139010\n142143,142144\n142145,280\n142145,17245\n142146,55849\n142147,422\n142148,56\n142149,298\n142150,485\n142151,149\n142151,406\n142152,30\n142153,602\n142154,142155\n142156,120\n142157,489\n142158,142159\n142160,142161\n142162,113156\n142163,663\n142164,142165\n142166,298\n142167,485\n142168,30\n142169,3\n142170,151\n142171,515\n142172,138\n142173,116\n142173,2087\n142174,16153\n142175,2674\n142176,298\n142177,485\n142178,30\n142179,142180\n142181,647\n142182,344\n142183,146\n142184,1381\n142185,366\n142186,647\n142187,146\n142188,344\n142189,1149\n142190,264\n142191,142192\n142193,30\n142194,30\n142195,30\n142196,147\n142197,158\n142198,30\n142199,255\n142200,142201\n142202,2590\n142203,142204\n142205,657\n142206,30\n142207,142208\n142209,142210\n142211,142212\n142213,142214\n142215,30\n142216,30\n142217,142218\n142219,63\n142220,142221\n142222,142221\n142225,312\n142225,358\n142226,602\n142228,83\n142231,142232\n142231,152355\n142234,142235\n142236,1522\n142237,1252\n142237,1253\n142238,142239\n142240,30\n142242,16196\n142243,142244\n142245,843\n142246,298\n142247,485\n142248,355\n142249,660\n142250,326\n142250,433\n142250,934\n142250,1559\n142251,671\n142252,147\n142253,184\n142254,298\n142255,485\n142257,1252\n142257,1253\n142259,222\n142259,657\n142260,349\n142260,392\n142260,433\n142261,2699\n142262,2073\n142263,1608\n142264,50\n142264,595\n142265,142266\n142267,1509\n142269,142270\n142271,346\n142272,142273\n142274,663\n142275,1849\n142275,32784\n142276,346\n142278,481\n142279,1858\n142280,1860\n142282,862\n142282,2105\n142283,41\n142284,1608\n142285,142286\n142287,160\n142287,515\n142287,1298\n142287,1749\n142288,30\n142289,1580\n142290,151\n142291,4760\n142292,875\n142293,875\n142294,233\n142295,4411\n142296,332\n142296,636\n142297,422\n142298,422\n142299,422\n142300,422\n142301,422\n142302,422\n142303,422\n142304,422\n142305,422\n142306,422\n142307,422\n142308,422\n142309,1188\n142310,142311\n142312,167\n142312,186\n142312,301\n142312,379\n142312,717\n142312,968\n142312,1010\n142312,1231\n142312,1326\n142312,1370\n142312,1411\n142312,1782\n142312,1837\n142312,2557\n142312,3804\n142313,83\n142314,717\n142315,972\n142316,287\n142317,10\n142317,175\n142318,149\n142319,809\n142320,344\n142321,360\n142321,579\n142321,1298\n142322,149\n142323,850\n142324,30\n142325,175\n142326,55849\n142327,142328\n142329,142328\n142330,298\n142331,72\n142332,294\n142333,1962\n142334,481\n142335,136\n142335,557\n142336,298\n142337,485\n142338,240\n142338,818\n142339,1722\n142340,392\n142340,1465\n142341,360\n142342,808\n142343,137\n142343,602\n142344,136\n142345,142346\n142347,142346\n142348,872\n142349,142350\n142351,358\n142352,72\n142353,298\n142354,485\n142355,900\n142356,2989\n142356,2991\n142357,30\n142358,485\n142359,298\n142360,30\n142361,1635\n142363,142364\n142365,142364\n142366,142364\n142367,462\n142367,4039\n142367,5405\n142368,33424\n142369,298\n142369,647\n142369,994\n142370,720\n142371,30\n142372,1707\n142373,142374\n142375,142374\n142376,142374\n142377,142374\n142378,206\n142379,1608\n142380,116\n142380,2087\n142381,138\n142382,2674\n142383,16153\n142384,893\n142384,999\n142384,1146\n142385,1070\n142386,30\n142387,328\n142388,4260\n142388,142405\n142388,142870\n142388,148412\n142388,154423\n142388,178654\n142389,408\n142390,1323\n142391,1326\n142392,102\n142394,850\n142395,217\n142395,1019\n142395,1274\n142396,1181\n142397,305\n142397,1265\n142397,1266\n142398,314\n142399,717\n142400,1010\n142401,142402\n142403,1149\n142404,142405\n142405,175\n142405,4260\n142406,142407\n142408,142409\n142408,146280\n142412,298\n142413,485\n142414,611\n142415,346\n142416,158\n142417,2296\n142418,44\n142419,1858\n142420,1860\n142421,30\n142423,13538\n142424,195\n142425,142426\n142429,142430\n142430,142405\n142430,142430\n142430,142473\n142430,142879\n142430,147191\n142431,2296\n142432,142433\n142434,298\n142435,485\n142436,142405\n142436,148412\n142437,30\n142438,30\n142440,657\n142441,1019\n142442,912\n142442,40566\n142443,356\n142443,392\n142443,852\n142443,2699\n142444,30\n142445,1608\n142446,104\n142446,254\n142446,557\n142446,953\n142446,954\n142447,602\n142448,1608\n142449,390\n142450,2266\n142452,875\n142454,390\n142455,2617\n142457,1858\n142458,1860\n142459,3474\n142460,718\n142461,30\n142462,875\n142464,3507\n142464,4980\n142465,406\n142466,1860\n142467,1858\n142468,142430\n142468,142473\n142468,142879\n142469,346\n142470,3623\n142471,424\n142473,4260\n142473,142405\n142473,142430\n142473,142473\n142473,142879\n142473,148412\n142474,142430\n142474,142473\n142474,142879\n142475,694\n142476,372\n142476,631\n142477,175\n142479,567\n142479,609\n142480,298\n142482,30\n142483,346\n142484,3260\n142485,1188\n142485,4101\n142485,13538\n142486,142405\n142487,907\n142487,2191\n142488,251\n142489,850\n142490,142426\n142491,30\n142492,907\n142493,4571\n142493,88820\n142494,298\n142495,485\n142496,102560\n142496,124889\n142497,137\n142498,298\n142499,485\n142500,515\n142500,652\n142502,30\n142503,1821\n142504,151\n142505,58\n142506,389\n142506,795\n142507,128103\n142508,3367\n142509,30\n142510,994\n142511,30\n142512,30\n142513,1635\n142514,200\n142514,772\n142517,346\n142518,30\n142520,171\n142521,1782\n142521,5440\n142522,631\n142522,1635\n142523,142409\n142523,146280\n142525,602\n142526,142527\n142528,142527\n142529,3\n142531,772\n142532,1298\n142533,142534\n142535,1204\n142536,602\n142537,2334\n142538,142539\n142540,22\n142541,509\n142541,510\n142541,575\n142541,875\n142542,1858\n142543,1860\n142544,142545\n142547,752\n142548,1544\n142549,1893\n142550,356\n142552,34\n142552,35\n142552,536\n142554,615\n142555,779\n142556,1001\n142557,6068\n142558,694\n142559,30\n142560,647\n142561,146\n142562,344\n142563,22\n142564,312\n142564,1151\n142564,1240\n142565,941\n142566,744\n142567,783\n142568,760\n142569,1241\n142569,2083\n142570,20\n142570,83\n142570,497\n142570,602\n142570,142433\n142571,142572\n142573,536\n142573,55233\n142574,299\n142574,6357\n142575,142576\n142577,142576\n142578,515\n142579,1983\n142580,631\n142581,267\n142582,140\n142583,424\n142584,10\n142586,142587\n142588,1858\n142589,1860\n142590,4611\n142592,83\n142593,390\n142594,37\n142595,240\n142596,1844\n142596,142430\n142596,142473\n142596,142879\n142597,1655\n142598,557\n142599,142600\n142601,63\n142602,483\n142603,30\n142604,160\n142604,250\n142604,310\n142604,346\n142604,1058\n142604,1381\n142604,1684\n142604,3039\n142604,29380\n142605,113156\n142606,1955\n142607,1133\n142608,920\n142609,18831\n142610,50\n142610,387\n142610,599\n142610,2931\n142610,86820\n142610,115843\n142610,118336\n142610,142611\n142610,143226\n142610,149816\n142610,154204\n142610,156453\n142610,156554\n142610,157276\n142610,157278\n142610,157818\n142610,157908\n142610,157954\n142610,157964\n142610,158025\n142610,158500\n142610,158613\n142610,158626\n142610,158628\n142610,158832\n142610,158849\n142610,159197\n142610,159263\n142610,159642\n142610,159653\n142610,159662\n142610,159911\n142610,159991\n142610,160236\n142610,160268\n142610,160424\n142610,160485\n142610,161161\n142610,161799\n142610,162436\n142610,167278\n142610,168203\n142610,168306\n142610,168468\n142610,168603\n142610,168968\n142610,170244\n142610,170266\n142610,170345\n142610,170447\n142610,170489\n142610,170664\n142610,171879\n142610,173090\n142610,176928\n142610,181032\n142610,181419\n142610,183725\n142610,183912\n142610,184008\n142610,184185\n142610,184315\n142610,184362\n142610,185337\n142610,186006\n142610,212170\n142610,214184\n142610,215209\n142610,216241\n142610,218800\n142610,219714\n142610,220063\n142610,221150\n142610,222674\n142610,225919\n142610,226284\n142610,226862\n142610,226933\n142610,227713\n142610,227816\n142610,227931\n142610,227947\n142610,228198\n142610,231659\n142610,231662\n142610,231670\n142610,231829\n142610,232164\n142610,232287\n142610,232352\n142610,233095\n142610,233591\n142610,233887\n142610,236482\n142610,237110\n142610,239304\n142610,239341\n142610,239506\n142610,239669\n142610,240315\n142610,245153\n142610,246681\n142610,247643\n142610,247953\n142610,248705\n142610,250412\n142610,253416\n142610,253712\n142610,254962\n142610,257084\n142610,257448\n142610,257471\n142610,260151\n142610,263604\n142610,264300\n142612,142613\n142614,885\n142614,13704\n142615,355\n142616,1551\n142616,3999\n142617,850\n142618,298\n142619,485\n142621,358\n142622,1707\n142623,602\n142623,3218\n142624,142625\n142626,79\n142627,30\n142628,280\n142629,346\n142630,435\n142631,30\n142632,1707\n142633,346\n142634,77\n142635,142636\n142637,760\n142638,1001\n142639,366\n142640,346\n142641,30\n142642,171\n142643,843\n142644,872\n142645,1300\n142646,158\n142647,142430\n142647,147191\n142648,142649\n142650,298\n142651,485\n142652,861\n142653,1298\n142654,602\n142655,1962\n142656,16153\n142657,116\n142657,2087\n142658,2674\n142659,138\n142660,292\n142661,872\n142662,1962\n142663,142664\n142665,30\n142666,142667\n142668,72\n142669,30\n142670,30\n142672,116\n142672,2087\n142673,138\n142674,1385\n142675,2674\n142676,16153\n142677,142678\n142679,30\n142680,142681\n142682,30\n142683,142684\n142685,323\n142686,2116\n142687,72\n142688,809\n142689,147\n142689,158\n142690,72\n142691,142692\n142693,142692\n142694,142692\n142695,142692\n142696,142692\n142697,142692\n142698,142692\n142699,346\n142701,323\n142702,344\n142703,4260\n142705,3\n142706,30\n142707,872\n142708,72\n142709,346\n142710,577\n142711,72\n142712,142713\n142714,240\n142715,356\n142716,636\n142717,1607\n142718,1608\n142719,366\n142720,366\n142721,366\n142722,366\n142723,83\n142724,485\n142725,298\n142726,485\n142728,355\n142730,298\n142731,485\n142732,142733\n142734,142733\n142735,142733\n142736,142733\n142737,142733\n142738,142733\n142739,142733\n142740,142733\n142742,3\n142743,1858\n142744,1860\n142745,481\n142746,422\n142747,56\n142748,849\n142748,6068\n142749,147\n142749,1458\n142749,1515\n142749,2244\n142749,21442\n142749,42064\n142751,302\n142752,142430\n142752,142473\n142752,142879\n142753,233\n142754,424\n142755,333\n142756,346\n142757,626\n142757,852\n142758,138686\n142759,602\n142760,72\n142763,422\n142764,422\n142765,422\n142766,422\n142767,422\n142768,142769\n142770,107\n142771,481\n142772,406\n142772,2205\n142772,33424\n142773,602\n142774,682\n142774,1353\n142774,72439\n142778,30\n142779,163\n142780,1274\n142781,1608\n142782,142426\n142783,493\n142783,1181\n142784,1608\n142785,58\n142786,97\n142787,663\n142789,175\n142790,298\n142791,58\n142792,994\n142793,46\n142794,1608\n142795,2775\n142796,447\n142797,481\n142798,663\n142799,142800\n142801,302\n142801,328\n142801,602\n142803,640\n142804,663\n142805,663\n142806,1888\n142807,1133\n142808,134\n142808,372\n142809,18831\n142810,2191\n142811,518\n142812,1634\n142813,2590\n142814,718\n142814,1127\n142815,285\n142817,1858\n142818,1860\n142819,30\n142820,1983\n142821,1858\n142822,1860\n142823,1858\n142824,1860\n142825,1858\n142826,1860\n142827,2989\n142827,2991\n142828,1888\n142829,875\n142830,146\n142831,647\n142832,344\n142833,873\n142834,417\n142834,2296\n142835,859\n142836,195\n142838,346\n142839,142840\n142841,83\n142842,647\n142843,146\n142844,344\n142845,175\n142846,1608\n142847,298\n142848,875\n142851,298\n142852,485\n142854,1849\n142854,32784\n142856,1608\n142857,83\n142858,15\n142860,58\n142861,994\n142862,46\n142864,252\n142864,516\n142865,79\n142866,599\n142867,309\n142867,310\n142868,22293\n142869,142870\n142871,2506\n142872,1323\n142873,1326\n142874,408\n142875,102\n142876,346\n142877,309\n142877,310\n142878,142879\n142880,994\n142881,406\n142881,779\n142881,1515\n142882,920\n142882,1089\n142882,1619\n142884,406\n142885,207\n142886,2671\n142887,1240\n142888,2334\n142890,217\n142891,309\n142891,310\n142893,30\n142894,920\n142894,1118\n142895,1210\n142896,333\n142897,142898\n142899,1608\n142900,1181\n142902,83\n142902,192\n142902,211\n142902,455\n142902,949\n142902,1623\n142903,142904\n142905,1608\n142906,2260\n142907,1415\n142908,2312\n142909,4545\n142909,139010\n142910,142911\n142912,147\n142912,158\n142912,406\n142912,779\n142913,106\n142913,586\n142913,1370\n142913,6119\n142914,631\n142915,366\n142915,525\n142917,3602\n142918,44\n142919,1133\n142920,30\n142921,1001\n142922,309\n142922,310\n142922,1707\n142923,1001\n142924,142925\n142926,346\n142927,877\n142928,3623\n142930,588\n142930,590\n142930,805\n142931,875\n142932,140\n142933,142934\n142935,10\n142938,1608\n142940,30\n142941,20771\n142942,1359\n142943,1608\n142944,2312\n142945,861\n142946,3507\n142947,717\n142948,81\n142949,1132\n142950,781\n142951,893\n142952,4545\n142952,139010\n142953,30\n142954,843\n142955,1293\n142955,2373\n142956,72\n142956,1135\n142957,861\n142958,623\n142958,1805\n142959,1429\n142960,3260\n142961,1608\n142962,920\n142963,171\n142964,142965\n142966,1608\n142967,68\n142968,1644\n142969,885\n142969,1252\n142969,1253\n142969,13704\n142971,251\n142972,1608\n142973,30\n142974,346\n142975,298\n142976,485\n142977,68069\n142978,30\n142979,346\n142980,1983\n142981,30\n142982,30\n142983,994\n142984,994\n142985,1284\n142986,349\n142987,5101\n142988,455\n142989,1983\n142990,1167\n142990,2979\n142991,668\n142992,872\n142993,140\n142994,301\n142995,30\n142996,30\n142997,332\n142998,2334\n142999,68069\n143000,1983\n143001,112707\n143001,143741\n143001,147369\n143002,142426\n143004,158\n143005,30\n143006,424\n143007,200\n143008,143009\n143010,143009\n143011,143009\n143012,143009\n143013,143009\n143014,143009\n143015,143009\n143016,30\n143017,1132\n143018,781\n143019,483\n143020,72\n143021,143022\n143023,10\n143023,113156\n143024,1858\n143025,1860\n143026,30\n143027,30\n143028,143029\n143030,34\n143030,35\n143031,143032\n143034,30\n143035,346\n143037,379\n143038,1143\n143039,171\n143040,143041\n143043,875\n143045,113156\n143047,72\n143048,72\n143049,72\n143050,143051\n143052,305\n143052,1818\n143053,2443\n143054,18831\n143055,146\n143056,647\n143057,344\n143058,272\n143059,30\n143060,346\n143062,72\n143063,934\n143064,760\n143065,143066\n143067,392\n143069,143070\n143071,332\n143071,1119\n143072,58\n143073,72\n143074,72\n143075,30\n143076,30\n143077,1556\n143078,1893\n143079,2506\n143080,83\n143081,1085\n143082,1849\n143082,32784\n143083,247\n143084,30\n143085,72\n143086,10\n143087,30\n143088,602\n143089,3\n143090,72\n143091,15119\n143092,149\n143093,1140\n143095,1132\n143096,781\n143097,1127\n143098,493\n143099,3623\n143100,1326\n143102,422\n143103,56\n143104,1007\n143104,3041\n143106,872\n143107,211\n143108,30\n143109,516\n143109,1644\n143110,1127\n143111,2334\n143112,417\n143112,2296\n143113,346\n143114,1\n143115,346\n143116,32\n143116,392\n143117,1210\n143118,72\n143119,30\n143121,516\n143122,1143\n143123,143124\n143125,143126\n143127,143128\n143129,5906\n143130,557\n143131,240\n143132,626\n143133,278\n143134,137\n143135,862\n143137,920\n143138,30\n143139,41\n143139,634\n143140,2073\n143141,79\n143141,136\n143141,192\n143141,202\n143141,217\n143141,254\n143141,333\n143141,1181\n143142,254\n143143,406\n143144,1556\n143145,30\n143146,30\n143147,485\n143148,298\n143149,298\n143150,485\n143151,481\n143152,355\n143153,450\n143154,1983\n143155,355\n143156,346\n143157,920\n143158,1983\n143159,346\n143160,143161\n143162,2989\n143162,2991\n143163,346\n143164,171\n143165,298\n143166,485\n143167,1\n143168,1179\n143169,292\n143170,30\n143171,893\n143172,424\n143173,30\n143174,72\n143175,192\n143177,143178\n143179,142405\n143180,2506\n143181,143182\n143183,49057\n143184,422\n143185,56\n143186,34\n143186,35\n143187,13919\n143188,146\n143189,647\n143190,344\n143191,372\n143191,631\n143191,1212\n143192,406\n143192,141912\n143193,1149\n143193,1177\n143193,2210\n143193,4237\n143194,1016\n143194,2210\n143194,4237\n143194,182162\n143195,30\n143195,1608\n143196,30\n143197,72\n143198,30\n143199,143200\n143201,30\n143202,344\n143203,4691\n143204,30\n143205,143206\n143207,72\n143209,143210\n143211,58\n143212,143213\n143214,143213\n143215,143213\n143216,143213\n143217,143213\n143218,143213\n143219,143213\n143220,143213\n143221,143222\n143223,30\n143224,255\n143225,143213\n143227,4545\n143227,56150\n143227,139010\n143228,30\n143229,142870\n143230,298\n143231,485\n143233,30\n143233,328\n143233,1179\n143234,273\n143235,872\n143236,1707\n143237,309\n143237,310\n143239,143240\n143241,2244\n143242,602\n143243,140\n143243,285\n143243,92476\n143245,920\n143246,211\n143247,333\n143248,143249\n143250,143249\n143251,143249\n143252,143249\n143253,143249\n143254,143249\n143255,143249\n143256,143249\n143257,355\n143258,4260\n143259,861\n143260,602\n143261,1639\n143263,143264\n143265,30\n143266,1983\n143267,171\n143268,140\n143269,920\n143270,485\n143271,509\n143272,784\n143273,1509\n143274,663\n143275,143249\n143276,143249\n143277,30\n143278,602\n143279,626\n143280,1132\n143281,781\n143282,120\n143283,302\n143283,861\n143284,207\n143286,143287\n143287,10\n143288,602\n143289,143290\n143291,422\n143292,422\n143293,422\n143294,455\n143295,422\n143296,422\n143297,422\n143298,422\n143299,356\n143299,843\n143300,1962\n143301,422\n143302,422\n143303,422\n143304,422\n143305,422\n143307,1425\n143308,142426\n143308,145751\n143309,207\n143310,781\n143311,1132\n143312,30\n143313,301\n143314,707\n143315,30\n143316,16153\n143317,143318\n143319,4411\n143320,1238\n143321,1608\n143322,1381\n143323,467\n143323,868\n143324,1243\n143325,233\n143326,1052\n143327,1452\n143328,346\n143329,481\n143332,808\n143333,1068\n143334,515\n143335,1608\n143336,26041\n143336,136072\n143337,1849\n143337,32784\n143338,195\n143338,333\n143339,206\n143342,346\n143343,1118\n143344,682\n143344,72439\n143345,4411\n143345,162599\n143347,462\n143348,1001\n143349,1608\n143350,626\n143350,1381\n143350,1452\n143350,1639\n143351,485\n143352,392\n143352,3260\n143353,83\n143354,2480\n143356,493\n143357,515\n143358,577\n143359,143360\n143361,1070\n143362,143363\n143364,1608\n143365,146\n143366,647\n143367,344\n143369,1016\n143369,2210\n143369,4237\n143369,182162\n143372,142430\n143372,142473\n143372,142879\n143373,142430\n143373,142473\n143373,142879\n143374,21442\n143375,1608\n143376,577\n143378,1608\n143379,920\n143380,1556\n143382,34\n143382,35\n143382,907\n143382,973\n143382,1001\n143382,1133\n143382,8180\n143382,19946\n143383,949\n143384,140\n143385,1608\n143388,872\n143389,743\n143390,175\n143391,298\n143392,142473\n143392,142879\n143393,289\n143393,290\n143393,2286\n143393,94134\n143394,1983\n143394,14352\n143396,779\n143397,1983\n143398,312\n143399,149\n143399,406\n143400,312\n143403,1105\n143404,58\n143405,994\n143407,46\n143408,264\n143408,1127\n143408,1381\n143408,1893\n143409,31073\n143410,292\n143410,48505\n143411,1300\n143412,130\n143412,1332\n143413,120\n143416,130\n143416,1332\n143417,900\n143418,333\n143418,346\n143418,366\n143418,1247\n143419,217\n143420,30\n143421,2073\n143422,312\n143423,1392\n143424,217\n143424,314\n143424,493\n143424,682\n143424,1417\n143424,72439\n143425,579\n143426,602\n143428,14434\n143429,143430\n143429,152733\n143432,1608\n143433,312\n143434,702\n143435,563\n143437,298\n143438,485\n143440,30\n143441,452\n143442,1247\n143443,184\n143444,298\n143445,485\n143446,10\n143446,175\n143447,44\n143449,2224\n143450,30\n143451,1608\n143452,1608\n143453,248\n143454,1608\n143455,2089\n143455,2940\n143456,2315\n143457,1818\n143458,1608\n143459,134\n143459,588\n143459,590\n143459,714\n143459,2156\n143460,481\n143461,142430\n143461,142473\n143461,142879\n143462,1983\n143463,874\n143463,1210\n143464,4895\n143465,1359\n143466,467\n143467,171\n143468,467\n143468,571\n143469,1860\n143470,1858\n143471,435\n143472,1659\n143473,113156\n143474,2045\n143475,312\n143476,292\n143477,1140\n143477,5547\n143478,1962\n143479,577\n143479,1105\n143480,292\n143482,843\n143483,1983\n143484,1572\n143485,2045\n143486,264\n143486,652\n143487,5212\n143488,298\n143489,485\n143490,22\n143491,483\n143492,301\n143494,19\n143496,31977\n143497,143498\n143499,79\n143500,1019\n143500,1888\n143501,575\n143502,1858\n143503,1860\n143504,2646\n143504,18831\n143505,248\n143506,2572\n143508,68069\n143509,301\n143510,850\n143511,536\n143512,3\n143513,536\n143514,143515\n143516,4192\n143516,4193\n143517,143518\n143519,143520\n143521,50\n143521,333\n143521,779\n143521,1181\n143522,1983\n143523,312\n143524,143525\n143526,104\n143526,137\n143526,138\n143527,3623\n143528,442\n143528,1434\n143529,310\n143529,3039\n143530,872\n143531,3623\n143532,809\n143533,516\n143534,703\n143534,918\n143534,1453\n143535,79\n143535,192\n143535,202\n143535,333\n143535,1181\n143536,525\n143537,143538\n143539,3623\n143541,215\n143542,885\n143542,13704\n143543,1844\n143543,27834\n143544,515\n143545,83\n143546,136072\n143547,424\n143547,907\n143548,149\n143549,557\n143550,143551\n143552,30\n143553,1860\n143554,1858\n143555,283\n143555,862\n143555,949\n143555,1240\n143555,1465\n143555,1564\n143555,2274\n143555,4637\n143556,9743\n143557,1467\n143558,30\n143559,30\n143561,30\n143562,252\n143563,2867\n143563,2868\n143564,30\n143565,30\n143566,1235\n143566,1335\n143567,718\n143568,1515\n143569,358\n143570,30\n143571,30\n143572,255\n143573,2434\n143574,1773\n143575,192\n143575,30331\n143576,30\n143577,493\n143577,586\n143577,1265\n143577,1266\n143577,1370\n143578,143579\n143580,30\n143581,30\n143582,1707\n143583,30\n143584,3623\n143585,81\n143586,657\n143587,30\n143588,143589\n143588,170332\n143588,249765\n143591,557\n143592,862\n143593,358\n143594,1235\n143594,1335\n143595,143596\n143597,143596\n143598,143596\n143599,143596\n143600,143596\n143601,113156\n143602,957\n143603,2116\n143604,298\n143605,485\n143606,957\n143607,147\n143607,149\n143607,158\n143607,171\n143607,184\n143607,2244\n143607,73906\n143608,7760\n143609,22\n143609,599\n143609,920\n143610,346\n143611,1983\n143612,3507\n143613,527\n143614,4594\n143616,309\n143616,310\n143618,55849\n143619,850\n143620,885\n143620,13704\n143621,143622\n143623,192\n143624,143625\n143626,143625\n143627,143625\n143628,143625\n143629,1707\n143630,493\n143631,16153\n143632,217\n143633,435\n143635,151\n143636,72\n143638,211\n143639,843\n143640,142405\n143641,577\n143642,142405\n143643,142405\n143644,147\n143644,192\n143644,1243\n143645,240\n143646,104\n143646,134\n143647,4637\n143648,143649\n143650,22\n143651,602\n143652,1801\n143653,143654\n143655,2590\n143656,1282\n143657,207\n143658,143659\n143661,10\n143661,2929\n143661,143662\n143661,161414\n143661,169271\n143663,872\n143664,1429\n143665,143666\n143667,143666\n143668,143666\n143669,143666\n143670,143666\n143671,668\n143672,872\n143673,158\n143673,55849\n143674,171\n143675,366\n143676,366\n143677,366\n143678,366\n143679,366\n143680,366\n143681,366\n143682,366\n143683,4545\n143683,139010\n143684,72\n143685,143686\n143688,30\n143689,30\n143690,143691\n143692,779\n143693,143694\n143693,150753\n143695,1007\n143696,1143\n143697,192\n143697,663\n143698,30\n143699,1467\n143700,455\n143701,2424\n143702,1871\n143703,493\n143704,83\n143705,13980\n143706,2421\n143707,143708\n143709,142433\n143711,450\n143712,143713\n143714,485\n143715,298\n143716,143717\n143718,255\n143719,795\n143720,143287\n143721,355\n143722,312\n143724,1019\n143725,289\n143725,290\n143725,657\n143725,932\n143725,94134\n143726,143727\n143728,143729\n143730,285\n143730,994\n143731,736\n143731,835\n143732,30\n143733,16153\n143734,485\n143735,298\n143736,140\n143737,5718\n143739,636\n143740,240\n143742,143743\n143744,1858\n143745,1860\n143746,167\n143747,483\n143747,675\n143747,1241\n143748,128922\n143749,1707\n143750,1238\n143751,202\n143752,390\n143752,1436\n143753,143754\n143755,143756\n143757,143758\n143759,143760\n143761,143762\n143763,143764\n143765,143766\n143767,143768\n143769,143770\n143771,143772\n143773,143774\n143775,143776\n143777,143778\n143779,143780\n143781,143782\n143783,143784\n143785,143786\n143787,143788\n143789,143790\n143791,143792\n143793,2371\n143794,143287\n143795,143796\n143797,143798\n143799,143800\n143801,143802\n143803,143804\n143805,143806\n143807,143808\n143809,143810\n143811,143812\n143813,143814\n143815,143816\n143817,143818\n143819,143820\n143821,143822\n143823,143824\n143825,143826\n143827,143828\n143829,143830\n143831,143832\n143833,143834\n143835,143836\n143837,143838\n143839,143840\n143841,143842\n143843,143844\n143845,143846\n143847,143848\n143849,143850\n143851,143852\n143853,143854\n143855,143856\n143857,143858\n143859,143860\n143861,143862\n143863,143864\n143865,143866\n143867,143868\n143869,143870\n143871,143872\n143873,143874\n143875,143876\n143877,143878\n143879,143880\n143881,143882\n143883,143884\n143885,143886\n143887,143888\n143889,143890\n143891,143892\n143893,143894\n143895,143896\n143897,143898\n143899,143900\n143901,143902\n143903,143904\n143905,143906\n143907,143908\n143909,143910\n143911,143912\n143913,143914\n143915,143916\n143917,143918\n143919,143920\n143921,143922\n143923,143924\n143925,143926\n143943,1010\n143945,143946\n143947,918\n143948,1452\n143949,422\n143950,30\n143951,142405\n143952,1241\n143957,571\n143957,868\n143959,752\n143959,873\n143959,1210\n143960,1639\n143961,104\n143961,332\n143962,143963\n143964,571\n143965,63\n143966,233\n143967,30\n143969,515\n143970,481\n143972,781\n143973,1132\n143974,760\n143975,22\n143977,22\n143978,143979\n143980,175\n143981,298\n143983,35486\n143984,980\n143985,726\n143986,83\n143987,843\n143988,422\n143989,422\n143990,422\n143991,422\n143992,422\n143993,356\n143993,611\n143993,795\n143993,1113\n143993,1319\n143993,193129\n143994,422\n143995,422\n143996,422\n143997,422\n143998,1070\n143998,142426\n143999,920\n144000,346\n144001,957\n144001,1815\n144004,1634\n144005,292\n144006,485\n144007,298\n144008,30\n144010,571\n144010,868\n144011,447\n144011,996\n144011,1474\n144012,640\n144013,843\n144014,2775\n144015,500\n144016,1962\n144017,54\n144018,1052\n144019,1882\n144020,640\n144021,640\n144022,146\n144022,422\n144022,467\n144022,620\n144022,673\n144022,1172\n144022,1425\n144022,1663\n144022,4411\n144022,30331\n144022,92476\n144023,1858\n144024,1860\n144025,1608\n144026,55849\n144027,55849\n144028,1983\n144030,868\n144031,481\n144032,211\n144032,697\n144035,147\n144035,158\n144036,1858\n144037,1860\n144038,781\n144039,1132\n144040,285\n144040,309\n144040,310\n144041,1858\n144042,1860\n144044,1608\n144045,1789\n144046,973\n144046,9457\n144047,1608\n144048,48\n144049,1132\n144050,781\n144051,868\n144052,500\n144053,1962\n144054,1052\n144055,1882\n144056,2775\n144057,54\n144058,1608\n144059,1663\n144060,442\n144061,1132\n144062,781\n144063,775\n144064,2989\n144064,2991\n144065,175\n144066,144067\n144068,298\n144069,743\n144071,149\n144072,120\n144073,251\n144073,516\n144073,1512\n144074,408\n144075,102\n144076,1323\n144077,1326\n144078,406\n144079,862\n144081,577\n144082,949\n144083,605\n144084,1608\n144085,872\n144086,4545\n144086,139010\n144087,1177\n144088,2209\n144089,579\n144090,55849\n144092,1130\n144092,1616\n144093,30\n144094,44\n144095,30\n144096,32\n144096,392\n144096,76096\n144097,30\n144098,760\n144099,1\n144100,252\n144100,1220\n144100,1222\n144101,1359\n144102,611\n144103,1858\n144104,1860\n144105,136\n144106,611\n144107,563\n144108,48\n144108,1133\n144109,22\n144111,5718\n144112,1608\n144113,849\n144114,1175\n144115,516\n144116,30\n144117,65\n144118,22\n144119,313\n144119,6556\n144120,433\n144121,392\n144121,536\n144121,1118\n144121,1284\n144122,611\n144123,666\n144123,693\n144123,973\n144123,1117\n144123,1298\n144123,4359\n144123,7349\n144123,28289\n144123,30376\n144123,72764\n144123,80993\n144123,90404\n144123,98227\n144123,107162\n144123,131828\n144123,147958\n144123,157131\n144123,162996\n144123,163117\n144123,170883\n144123,172827\n144123,174967\n144124,4611\n144125,1544\n144127,5405\n144128,22\n144131,818\n144132,3\n144134,144135\n144136,852\n144137,22\n144138,217\n144140,72\n144141,4260\n144141,142433\n144141,143287\n144142,192\n144144,144145\n144146,20771\n144147,850\n144148,2944\n144148,18831\n144149,663\n144150,859\n144151,668\n144151,3367\n144153,18831\n144154,140\n144156,18831\n144157,144158\n144161,515\n144161,1381\n144162,30\n144163,1359\n144165,390\n144167,175\n144168,298\n144169,30\n144170,144171\n144172,144173\n144174,406\n144174,779\n144174,1181\n144175,424\n144176,144177\n144178,3538\n144179,388\n144179,1849\n144180,55849\n144181,1294\n144182,72\n144183,144184\n144185,1707\n144186,1368\n144187,704\n144188,30\n144189,406\n144189,35000\n144189,45495\n144189,237013\n144190,55849\n144191,1983\n144192,142405\n144192,154408\n144193,55849\n144194,55849\n144195,557\n144196,137\n144197,595\n144198,144199\n144200,30\n144201,202\n144202,202\n144203,346\n144204,346\n144205,1140\n144206,346\n144207,30\n144208,151\n144209,1001\n144209,1955\n144210,332\n144211,3999\n144212,424\n144213,592\n144214,30\n144215,144216\n144217,346\n144218,123546\n144219,144220\n144221,2506\n144222,9743\n144223,663\n144224,596\n144225,30\n144226,30\n144228,30\n144229,144230\n144231,68\n144231,240\n144231,301\n144231,392\n144231,446\n144231,457\n144231,693\n144231,697\n144231,818\n144231,861\n144231,1240\n144231,2480\n144231,2944\n144231,4220\n144231,23287\n144231,66297\n144231,102560\n144231,127158\n144231,138686\n144231,179804\n144231,207045\n144232,30\n144233,144234\n144235,144234\n144236,144234\n144237,144234\n144238,144234\n144239,1132\n144240,575\n144241,144242\n144243,525\n144244,1309\n144245,175\n144245,1773\n144246,8719\n144247,138\n144248,865\n144249,557\n144250,107\n144251,1133\n144252,292\n144253,298\n144254,3538\n144255,137\n144256,118\n144256,4597\n144257,88820\n144258,611\n144259,557\n144260,1983\n144261,631\n144262,1803\n144263,294\n144264,72\n144265,184\n144266,920\n144267,2590\n144268,2646\n144268,18831\n144269,4748\n144270,2367\n144271,364\n144272,450\n144273,3989\n144274,5708\n144275,144276\n144277,144278\n144279,16953\n144280,7117\n144281,63\n144282,2867\n144282,2868\n144283,1309\n144284,1821\n144285,980\n144286,1927\n144287,144288\n144289,392\n144289,1836\n144290,1612\n144291,859\n144292,485\n144293,144294\n144295,144294\n144296,144294\n144297,144294\n144298,144294\n144299,144294\n144300,144294\n144301,144294\n144302,144294\n144303,144294\n144304,175\n144305,175\n144306,298\n144307,2006\n144308,30\n144309,2506\n144310,30\n144311,356\n144311,1722\n144312,72\n144313,146\n144314,344\n144315,647\n144316,30\n144317,30\n144318,144319\n144320,144321\n144322,202\n144323,222\n144323,455\n144323,657\n144323,2266\n144324,171\n144325,30\n144326,255\n144327,485\n144328,298\n144329,32475\n144330,144331\n144332,1284\n144333,452\n144333,818\n144334,450\n144334,717\n144335,30\n144336,144337\n144338,393\n144339,364\n144339,450\n144339,611\n144339,980\n144339,1619\n144339,2367\n144339,4748\n144339,16953\n144340,175\n144341,298\n144343,30\n144345,2674\n144345,16153\n144346,481\n144347,450\n144348,144349\n144350,144349\n144351,83\n144351,356\n144352,450\n144353,175\n144354,298\n144355,704\n144356,704\n144357,422\n144358,422\n144359,422\n144360,422\n144361,422\n144362,422\n144363,422\n144364,422\n144365,422\n144366,144367\n144368,144369\n144370,144369\n144371,144369\n144372,144369\n144373,450\n144374,450\n144375,120\n144375,588\n144375,590\n144375,1419\n144376,1133\n144377,483\n144378,393\n144379,144380\n144381,225\n144382,30\n144383,72\n144384,72\n144385,2506\n144386,366\n144387,14472\n144388,72\n144389,144390\n144391,30\n144392,30\n144393,144394\n144395,298\n144396,485\n144397,144398\n144399,8884\n144400,30\n144403,143287\n144404,1085\n144407,355\n144408,144409\n144411,158\n144411,2244\n144412,144413\n144414,30\n144416,144417\n144418,171\n144419,1014\n144420,298\n144421,485\n144422,2506\n144424,144425\n144426,1962\n144427,144428\n144429,336\n144429,406\n144429,620\n144429,779\n144429,1163\n144429,1181\n144429,5726\n144429,8055\n144430,142473\n144430,142879\n144431,1608\n144432,83\n144433,996\n144434,2506\n144435,144436\n144437,3\n144438,144439\n144440,144439\n144441,144439\n144442,144439\n144443,144439\n144444,1118\n144445,144446\n144447,346\n144448,408\n144449,1323\n144450,1326\n144451,102\n144452,450\n144454,2506\n144455,144456\n144455,172883\n144458,44\n144459,144460\n144461,298\n144462,485\n144463,298\n144464,485\n144466,202\n144468,146\n144469,647\n144470,344\n144471,72\n144472,622\n144472,1033\n144473,192\n144474,144475\n144476,144477\n144478,142405\n144479,206\n144480,144481\n144482,144481\n144483,144481\n144484,144481\n144485,144481\n144486,144481\n144487,144481\n144488,58\n144489,30\n144491,144492\n144493,2411\n144494,298\n144495,485\n144496,142870\n144498,114206\n144499,114206\n144500,114206\n144501,10\n144501,2574\n144502,81\n144503,144504\n144505,144504\n144506,1001\n144507,358\n144508,83\n144509,144510\n144511,2506\n144512,144513\n144514,2506\n144515,805\n144515,2572\n144515,2775\n144516,144517\n144518,144517\n144519,144517\n144520,144517\n144522,1773\n144523,72\n144524,184\n144524,2244\n144524,21826\n144525,1608\n144526,144527\n144528,171\n144529,1566\n144530,144531\n144532,144533\n144534,144533\n144535,144533\n144536,144533\n144537,144533\n144538,144533\n144539,144533\n144541,2506\n144542,4\n144542,5\n144543,483\n144544,144545\n144546,144547\n144548,596\n144549,346\n144550,144551\n144552,1479\n144553,390\n144554,144555\n144557,144558\n144559,2506\n144560,144561\n144562,144563\n144564,144563\n144565,6068\n144566,144567\n144568,9743\n144569,144570\n144571,2572\n144572,144573\n144574,1284\n144575,32475\n144576,3585\n144577,144578\n144579,158\n144580,920\n144582,3538\n144582,103860\n144583,626\n144585,144586\n144588,144589\n144590,144589\n144591,144589\n144592,144589\n144593,144589\n144594,144589\n144595,144589\n144596,144597\n144598,1776\n144599,346\n144600,298\n144601,485\n144602,2146\n144603,144604\n144605,875\n144606,30\n144607,144608\n144610,3507\n144611,144612\n144613,3623\n144614,366\n144615,366\n144616,144617\n144618,142405\n144619,1860\n144620,1858\n144621,15573\n144623,144624\n144625,144624\n144626,107\n144627,2416\n144627,2417\n144628,292\n144629,338\n144630,298\n144631,1133\n144632,3538\n144633,83\n144635,355\n144638,144639\n144640,760\n144641,83\n144642,83\n144643,433\n144644,233\n144648,144649\n144650,144651\n144652,83\n144654,7155\n144655,1359\n144656,158\n144659,144660\n144662,144663\n144664,144665\n144664,147719\n144666,1381\n144667,144668\n144669,1707\n144671,83\n144672,144673\n144674,144675\n144676,144677\n144678,144679\n144680,760\n144681,83\n144682,22\n144683,144684\n144687,130\n144688,192\n144688,195\n144688,1877\n144688,4545\n144688,139010\n144689,2931\n144691,1247\n144693,144694\n144696,144697\n144698,144699\n144700,44\n144701,144702\n144701,153944\n144701,158885\n144701,159525\n144701,182165\n144703,144704\n144703,214406\n144703,217221\n144703,221633\n144703,224436\n144705,144706\n144707,144708\n144709,134\n144709,309\n144709,310\n144709,611\n144709,626\n144709,717\n144709,862\n144709,1151\n144709,1265\n144709,1266\n144709,1285\n144709,1381\n144709,1749\n144709,1782\n144710,146\n144711,647\n144712,344\n144713,138\n144714,83\n144716,6068\n144717,144718\n144719,31977\n144720,144721\n144722,144723\n144724,144725\n144726,134\n144727,144728\n144729,222\n144729,379\n144729,634\n144731,2506\n144733,872\n144734,872\n144737,1085\n144738,144739\n144740,144741\n144742,144743\n144744,144745\n144746,144747\n144748,1807\n144750,30\n144751,240\n144752,298\n144753,485\n144754,144755\n144756,589\n144757,144758\n144759,444\n144760,326\n144760,579\n144761,113156\n144762,657\n144763,144764\n144765,500\n144766,2775\n144767,1962\n144768,54\n144769,1052\n144770,1882\n144771,222\n144772,144773\n144774,718\n144775,30\n144776,144777\n144778,144777\n144779,144780\n144781,30\n144782,144783\n144784,144785\n144786,144787\n144788,144787\n144789,144787\n144790,144791\n144792,557\n144793,30\n144795,557\n144796,557\n144797,3138\n144798,144799\n144800,142473\n144801,483\n144802,481\n144803,144804\n144805,1252\n144805,1253\n144806,577\n144807,2146\n144808,298\n144809,485\n144810,298\n144811,485\n144812,144813\n144814,144815\n144816,144817\n144818,298\n144819,485\n144821,30\n144822,2775\n144823,447\n144824,16153\n144825,2989\n144825,2991\n144826,142405\n144827,251\n144828,422\n144829,56\n144830,144831\n144832,83\n144833,142473\n144834,805\n144835,140\n144836,160\n144836,310\n144836,346\n144836,1381\n144836,1684\n144836,3039\n144836,29380\n144837,668\n144837,3367\n144838,1210\n144839,144840\n144841,1188\n144842,1052\n144843,86\n144844,144845\n144846,149\n144848,118\n144848,4597\n144849,56\n144849,99\n144849,192\n144849,202\n144849,439\n144849,516\n144849,1370\n144849,23287\n144849,102560\n144849,127158\n144849,138686\n144849,191355\n144849,207045\n144849,212914\n144850,422\n144851,422\n144852,422\n144853,422\n144854,422\n144855,422\n144856,422\n144857,30\n144858,72\n144859,312\n144860,144861\n144862,4545\n144862,139010\n144863,422\n144864,56\n144865,1285\n144866,292\n144867,294\n144868,296\n144869,298\n144870,175\n144871,298\n144872,704\n144873,406\n144874,16331\n144876,195\n144877,83\n144878,1070\n144879,72\n144880,22\n144881,142430\n144881,147191\n144883,485\n144884,298\n144885,144886\n144889,1509\n144890,366\n144891,366\n144892,21442\n144893,79\n144894,1509\n144895,50\n144895,149\n144895,406\n144895,1425\n144895,21442\n144896,142426\n144897,3695\n144898,485\n144899,298\n144900,663\n144901,83\n144903,87\n144905,515\n144907,1479\n144908,48\n144909,671\n144910,171\n144911,355\n144912,4611\n144913,1544\n144914,4611\n144915,1544\n144916,1531\n144916,4545\n144916,139010\n144918,640\n144919,346\n144921,636\n144922,144923\n144924,171\n144925,217\n144926,1544\n144927,4611\n144928,783\n144929,4611\n144930,1544\n144933,171\n144935,143287\n144936,285\n144937,192\n144938,4611\n144939,1544\n144940,251\n144941,4611\n144942,1544\n144943,2989\n144943,2991\n144944,144945\n144946,178\n144947,1007\n144948,1474\n144949,144950\n144949,152318\n144951,22293\n144952,144953\n144952,157046\n144954,577\n144954,1033\n144955,1252\n144955,1253\n144956,43203\n144957,30\n144958,1417\n144958,19443\n144959,3585\n144960,1608\n144961,1564\n144962,148600\n144963,1688\n144964,1608\n144965,285\n144966,1608\n144967,144968\n144969,985\n144970,668\n144971,1531\n144972,144973\n144974,79\n144975,2775\n144976,447\n144977,1\n144979,65\n144981,19010\n144982,175\n144983,298\n144984,1133\n144985,467\n144986,1082\n144987,827\n144988,304\n144988,704\n144988,714\n144988,1402\n144988,1818\n144988,1962\n144988,2205\n144988,2286\n144988,2315\n144988,3069\n144988,33424\n144989,875\n144990,146\n144991,647\n144992,344\n144993,360\n144994,1082\n144995,1012\n144997,10\n144998,372\n144998,1285\n144999,733\n145000,145001\n145002,1849\n145002,32784\n145003,106\n145003,1082\n145003,1732\n145004,255\n145005,255\n145007,779\n145008,1326\n145009,1151\n145010,140\n145011,54362\n145012,6298\n145013,145014\n145015,106\n145015,1370\n145015,6119\n145016,175\n145017,934\n145018,1052\n145019,1285\n145020,298\n145021,143287\n145023,1151\n145023,1836\n145023,2274\n145025,515\n145026,252\n145027,1707\n145028,44\n145031,1252\n145031,1253\n145031,4823\n145032,1612\n145033,1773\n145034,2989\n145034,2991\n145035,779\n145036,577\n145037,1608\n145038,718\n145039,200\n145040,142405\n145041,50\n145041,79\n145041,111\n145041,147\n145041,158\n145041,178\n145041,192\n145041,195\n145041,333\n145041,346\n145041,406\n145041,435\n145041,538\n145041,622\n145041,631\n145041,640\n145041,779\n145041,1033\n145041,1181\n145041,1265\n145041,1266\n145041,1388\n145041,1531\n145041,2931\n145041,3872\n145041,4192\n145041,4193\n145042,657\n145044,424\n145045,72\n145046,187\n145048,2989\n145048,2991\n145052,146\n145053,344\n145054,647\n145055,22\n145058,20\n145059,146\n145060,647\n145061,344\n145062,1544\n145063,4611\n145064,4611\n145065,1544\n145067,957\n145068,957\n145069,10\n145070,30\n145071,22\n145073,1544\n145074,4611\n145075,4611\n145076,1544\n145077,273\n145079,146\n145080,142473\n145082,1133\n145083,50\n145084,278\n145086,1955\n145087,1707\n145088,538\n145088,1289\n145088,1877\n145089,1707\n145090,957\n145091,3769\n145092,134\n145092,2105\n145094,3623\n145096,3804\n145097,1821\n145097,21736\n145098,30\n145099,433\n145100,120\n145100,588\n145100,590\n145101,663\n145102,509\n145103,1247\n145105,217\n145106,252\n145107,240\n145108,1579\n145108,2312\n145109,72\n145110,83\n145111,4611\n145112,1544\n145113,4611\n145114,1544\n145115,298\n145116,485\n145117,875\n145118,447\n145119,2775\n145120,264\n145120,1509\n145120,1551\n145121,1282\n145122,83\n145123,2224\n145124,1285\n145125,991\n145125,1707\n145126,1300\n145128,1085\n145129,919\n145131,392\n145132,145133\n145135,30\n145136,690\n145136,2073\n145137,97\n145138,1877\n145138,40497\n145139,424\n145140,145141\n145142,58\n145142,87\n145142,292\n145142,801\n145142,872\n145142,1140\n145142,1146\n145142,1177\n145142,1326\n145142,1392\n145142,1653\n145142,1836\n145142,1893\n145142,2436\n145142,2443\n145142,3474\n145142,3804\n145142,54004\n145143,175\n145144,298\n145145,145146\n145147,875\n145148,287\n145149,852\n145150,1359\n145150,19755\n145151,145152\n145154,83\n145155,3069\n145156,1149\n145157,72\n145158,1149\n145159,875\n145160,145161\n145162,30\n145163,83\n145164,65\n145164,71\n145164,272\n145164,611\n145166,145167\n145166,151833\n145168,142405\n145169,406\n145170,875\n145171,10\n145172,171\n145173,433\n145174,200\n145175,72\n145176,4545\n145176,56150\n145176,139010\n145177,19356\n145178,344\n145179,145180\n145181,145182\n145183,3111\n145184,136\n145185,55849\n145187,73570\n145188,145189\n145190,55849\n145191,145192\n145193,83\n145193,259\n145194,72\n145195,217\n145196,251\n145197,775\n145198,809\n145198,1210\n145198,1342\n145198,2053\n145198,34775\n145198,145148\n145198,173423\n145199,346\n145200,996\n145201,483\n145202,145203\n145204,145205\n145206,72\n145207,818\n145208,30\n145210,217\n145210,1417\n145211,10\n145211,2626\n145212,586\n145213,145214\n145215,2590\n145216,557\n145217,657\n145218,1052\n145219,145220\n145223,586\n145224,145225\n145226,135\n145226,1843\n145226,4799\n145227,30\n145228,142405\n145229,72\n145230,30\n145231,145232\n145233,145234\n145235,75912\n145236,1509\n145237,255\n145238,255\n145239,707\n145241,1608\n145242,30\n145243,30\n145245,251\n145246,145247\n145248,30\n145249,145250\n145251,255\n145252,422\n145253,15119\n145254,72\n145255,15748\n145256,145257\n145258,30\n145259,22\n145260,1858\n145261,1860\n145262,145263\n145264,1858\n145265,1860\n145266,30\n145267,55849\n145268,145268\n145269,30\n145270,2421\n145272,145273\n145274,145275\n145276,328\n145277,175\n145278,592\n145280,72\n145281,175\n145282,298\n145283,184\n145284,255\n145285,255\n145286,6068\n145287,1085\n145287,2747\n145287,6068\n145287,7819\n145287,16955\n145287,36015\n145287,73248\n145287,75912\n145287,132216\n145287,147789\n145287,148196\n145289,30\n145290,145291\n145293,30\n145294,145295\n145296,145297\n145298,366\n145299,366\n145300,366\n145301,631\n145301,1085\n145302,145303\n145304,145305\n145306,622\n145307,4545\n145307,139010\n145308,145309\n145310,1773\n145312,1381\n145312,142426\n145313,355\n145314,9457\n145315,30\n145317,143287\n145318,1241\n145319,248\n145321,827\n145322,4611\n145323,1544\n145324,4611\n145325,1544\n145326,215\n145327,717\n145328,1608\n145329,4611\n145330,1544\n145331,4611\n145332,1544\n145333,222\n145334,481\n145335,68069\n145336,534\n145337,233\n145338,87\n145340,71\n145340,685\n145342,130\n145343,15\n145344,640\n145345,500\n145346,1882\n145347,2775\n145348,54\n145349,1052\n145350,1962\n145351,32\n145352,422\n145353,422\n145354,422\n145355,422\n145356,422\n145357,422\n145358,422\n145359,422\n145360,422\n145361,422\n145362,452\n145363,1247\n145364,184\n145365,1177\n145366,663\n145366,937\n145367,907\n145368,283\n145370,1858\n145371,1860\n145372,1858\n145373,1860\n145375,63\n145376,142405\n145377,3769\n145378,83\n145379,623\n145380,30\n145381,666\n145383,1332\n145384,145385\n145389,663\n145392,175\n145393,200\n145394,298\n145395,809\n145396,336\n145397,255\n145398,1962\n145399,577\n145401,1858\n145402,1860\n145404,206\n145405,285\n145405,779\n145406,60576\n145407,1293\n145407,1522\n145407,28107\n145407,213089\n145408,811\n145409,392\n145410,113156\n145411,973\n145412,500\n145413,1962\n145414,1052\n145415,1882\n145416,2775\n145417,54\n145418,142430\n145418,142473\n145418,142879\n145421,337\n145422,500\n145423,1052\n145424,1882\n145425,2775\n145426,54\n145427,1962\n145428,4355\n145429,287\n145430,145431\n145430,152225\n145430,154188\n145432,145433\n145434,563\n145435,1612\n145436,563\n145437,957\n145438,1608\n145439,145440\n145441,30\n145442,666\n145443,137\n145444,1858\n145445,1860\n145446,2168\n145447,388\n145448,666\n145449,60576\n145450,227\n145452,663\n145453,142430\n145453,142473\n145453,142879\n145454,30\n145455,957\n145456,2572\n145457,424\n145457,6556\n145459,1147\n145459,2989\n145459,2991\n145460,55849\n145462,3724\n145462,15179\n145463,996\n145464,663\n145466,1454\n145467,211\n145467,949\n145467,1655\n145467,1844\n145467,2209\n145467,8270\n145468,30\n145469,4455\n145470,275\n145471,1149\n145472,663\n145473,225\n145473,332\n145473,1515\n145474,1608\n145476,500\n145477,1962\n145478,2775\n145479,1052\n145480,54\n145481,1882\n145482,717\n145483,1608\n145484,717\n145485,1556\n145487,147\n145487,663\n145488,1608\n145489,44\n145490,1608\n145492,312\n145493,217\n145494,1983\n145495,932\n145496,875\n145497,34\n145497,389\n145497,536\n145497,2784\n145498,4611\n145499,1544\n145500,4611\n145501,1544\n145502,877\n145503,422\n145504,56\n145505,30\n145506,4611\n145507,1544\n145508,4611\n145509,1544\n145510,278\n145513,1014\n145515,1801\n145516,30\n145517,663\n145518,160\n145519,115659\n145519,142870\n145520,440\n145521,1556\n145522,485\n145523,298\n145525,151\n145525,2073\n145526,663\n145527,666\n145528,663\n145529,4\n145529,5\n145529,1235\n145529,1335\n145530,760\n145531,30\n145532,4571\n145535,175\n145537,278\n145538,298\n145540,278\n145541,278\n145542,663\n145543,278\n145544,278\n145546,77\n145548,1858\n145549,1860\n145550,2775\n145551,447\n145553,16153\n145554,138\n145555,116\n145555,2087\n145556,2674\n145557,1608\n145558,1608\n145559,30\n145562,278\n145564,1608\n145565,1608\n145567,2979\n145568,877\n145569,1247\n145570,364\n145571,663\n145573,663\n145574,49057\n145575,30\n145577,515\n145577,1241\n145577,3585\n145578,4611\n145579,1544\n145581,1544\n145582,4611\n145583,622\n145585,4611\n145586,1544\n145587,1544\n145588,4611\n145589,663\n145591,4611\n145592,1544\n145593,4611\n145594,1544\n145595,206\n145596,5591\n145597,175\n145598,372\n145599,298\n145600,602\n145601,859\n145602,72\n145604,663\n145605,135\n145606,72\n145609,145610\n145611,663\n145612,145613\n145614,145613\n145615,145613\n145616,145613\n145617,145613\n145618,145613\n145619,145613\n145620,145613\n145621,663\n145622,1149\n145624,663\n145625,104\n145625,240\n145625,850\n145626,784\n145627,1243\n145628,1860\n145629,1858\n145632,1564\n145633,467\n145633,152855\n145634,1564\n145636,467\n145636,868\n145636,162599\n145637,167\n145637,252\n145638,663\n145639,240\n145639,1955\n145640,1210\n145641,1140\n145643,1749\n145643,2006\n145645,2436\n145647,3297\n145648,663\n145650,663\n145651,124889\n145652,868\n145653,2775\n145654,717\n145655,393\n145656,772\n145657,795\n145658,1332\n145659,2646\n145659,18831\n145660,2590\n145661,1370\n145662,455\n145663,106\n145664,116\n145664,2087\n145665,6119\n145666,138\n145667,16153\n145668,2674\n145669,145670\n145671,493\n145671,1265\n145671,1266\n145673,56\n145674,422\n145675,422\n145676,56\n145677,349\n145678,16153\n145679,2674\n145680,138\n145681,116\n145681,2087\n145682,140\n145683,267\n145684,433\n145685,557\n145686,663\n145687,55849\n145688,1509\n145689,116\n145689,2087\n145690,138\n145691,16153\n145692,2674\n145693,30\n145694,1019\n145695,278\n145696,30\n145697,9743\n145698,145699\n145700,623\n145701,358\n145702,278\n145703,63\n145703,877\n145703,3538\n145704,485\n145705,298\n145706,406\n145707,207\n145708,893\n145709,145710\n145711,485\n145712,298\n145713,145714\n145715,145714\n145716,145714\n145717,145714\n145718,145719\n145720,222\n145720,657\n145721,278\n145722,13980\n145723,72\n145724,145725\n145726,145725\n145727,145725\n145728,717\n145728,2480\n145729,30\n145730,430\n145730,994\n145730,1235\n145730,1335\n145731,147\n145732,435\n145733,743\n145733,145734\n145735,171\n145736,372\n145737,145738\n145739,145739\n145740,145741\n145743,843\n145744,145745\n145746,298\n145747,485\n145748,30\n145749,415\n145750,142426\n145750,145751\n145752,145753\n145754,358\n145755,145756\n145757,278\n145758,217\n145759,83\n145760,278\n145761,145762\n145763,7155\n145764,149\n145765,663\n145766,3\n145767,30\n145768,2116\n145769,145770\n145771,577\n145772,483\n145773,264\n145774,113156\n145775,1381\n145776,3321\n145777,2416\n145777,2417\n145778,1634\n145779,30\n145780,145781\n145782,30\n145783,1007\n145785,158\n145786,356\n145787,72\n145788,145789\n145790,2590\n145791,267\n145792,72\n145793,581\n145794,145795\n145796,72\n145797,255\n145798,207\n145800,431\n145800,631\n145800,1085\n145800,2296\n145801,2146\n145802,142405\n145803,30\n145804,30\n145805,30\n145806,872\n145807,668\n145808,145809\n145810,145811\n145812,83\n145813,143287\n145815,298\n145816,485\n145817,145818\n145819,143287\n145820,83\n145822,119\n145822,14126\n145823,510\n145824,355\n145825,422\n145826,129639\n145827,760\n145829,1087\n145830,1454\n145831,536\n145834,145835\n145836,1238\n145837,919\n145838,145839\n145841,337\n145842,138\n145843,16153\n145844,116\n145844,2087\n145845,2674\n145846,3207\n145847,1983\n145848,1452\n145852,5591\n145853,4611\n145854,1544\n145855,671\n145856,83\n145857,1132\n145858,1983\n145859,233\n145860,4611\n145861,1544\n145862,259\n145863,48\n145864,1634\n145865,2775\n145868,2775\n145869,1983\n145870,563\n145872,893\n145874,1608\n145876,309\n145876,310\n145876,3039\n145876,6556\n145877,1146\n145878,534\n145878,4260\n145879,83\n145880,500\n145880,718\n145881,143287\n145882,8854\n145883,75912\n145885,142426\n145885,145502\n145885,145751\n145886,1556\n145887,577\n145888,30\n145889,30\n145890,83\n145891,302\n145891,2116\n145892,175\n145893,298\n145894,1160\n145895,32\n145896,217\n145896,127158\n145897,424\n145898,48\n145899,1332\n145900,65\n145900,1118\n145901,424\n145902,3804\n145902,14797\n145903,140\n145904,206\n145905,1608\n145906,422\n145907,56\n145908,289\n145908,290\n145908,144988\n145909,602\n145909,3218\n145910,467\n145911,145912\n145913,1\n145913,81\n145913,106\n145913,134\n145913,251\n145913,273\n145913,275\n145913,298\n145913,340\n145913,497\n145913,567\n145913,620\n145913,626\n145913,663\n145913,694\n145913,736\n145913,760\n145913,827\n145913,859\n145913,861\n145913,862\n145913,931\n145913,1058\n145913,1082\n145913,1113\n145913,1122\n145913,1127\n145913,1402\n145913,1415\n145913,1732\n145913,1807\n145913,2315\n145913,2867\n145913,2868\n145913,3003\n145913,4039\n145913,145502\n145914,79\n145915,634\n145916,779\n145917,717\n145917,1332\n145918,111\n145918,631\n145918,752\n145918,795\n145918,873\n145918,919\n145918,1001\n145918,1210\n145918,1274\n145918,1309\n145918,1522\n145918,2045\n145918,3182\n145918,6068\n145918,6955\n145919,1363\n145920,248\n145920,1332\n145921,1240\n145922,682\n145922,1512\n145922,5992\n145922,72439\n145923,145924\n145925,422\n145927,30\n145928,1707\n145929,175\n145930,714\n145931,818\n145932,298\n145934,455\n145935,3585\n145936,312\n145937,2775\n145938,3653\n145939,145940\n145942,3585\n145943,422\n145944,3653\n145945,422\n145946,422\n145947,422\n145948,422\n145949,422\n145950,422\n145951,422\n145952,567\n145953,422\n145954,422\n145955,158\n145956,1860\n145957,1858\n145958,1571\n145960,2105\n145961,1556\n145962,1983\n145963,356\n145965,142430\n145965,142473\n145966,206\n145967,9008\n145970,136\n145971,1608\n145972,1608\n145973,1858\n145974,1860\n145975,663\n145976,444\n145977,240\n145977,2205\n145977,33424\n145979,538\n145979,1837\n145980,818\n145981,130\n145981,483\n145981,4223\n145981,75912\n145982,1392\n145983,130\n145983,261\n145983,298\n145983,305\n145983,473\n145983,557\n145983,647\n145983,666\n145983,694\n145983,703\n145983,726\n145983,877\n145983,893\n145983,1058\n145983,1368\n145983,1388\n145983,1619\n145983,2135\n145983,3089\n145983,3999\n145983,4172\n145983,5540\n145983,5658\n145983,6638\n145983,191355\n145984,46\n145987,83\n145988,136\n145989,298\n145990,485\n145991,385\n145991,408\n145991,2421\n145991,37088\n145993,1353\n145994,718\n145997,298\n145998,485\n145999,1858\n146000,1860\n146001,240\n146001,818\n146001,872\n146001,1623\n146001,1955\n146001,2512\n146001,2989\n146001,2991\n146001,127158\n146001,194645\n146002,1181\n146003,44\n146004,1608\n146005,1096\n146005,3555\n146006,500\n146007,1052\n146008,1962\n146009,1882\n146010,2775\n146011,54\n146012,81233\n146013,392\n146013,644\n146014,406\n146015,146016\n146018,422\n146019,56\n146020,579\n146021,142473\n146022,142409\n146023,1241\n146023,1522\n146023,2083\n146024,805\n146025,660\n146025,40566\n146025,142870\n146025,144962\n146025,145502\n146025,146280\n146025,146314\n146025,189792\n146026,302\n146028,843\n146029,50\n146029,192\n146029,2244\n146029,2931\n146031,663\n146032,1608\n146033,875\n146034,349\n146035,146036\n146037,146036\n146038,146036\n146039,694\n146040,269\n146041,422\n146041,707\n146042,175\n146043,435\n146044,298\n146045,3\n146046,760\n146046,1085\n146046,2296\n146047,1284\n146048,843\n146049,875\n146050,146051\n146052,500\n146053,1962\n146054,1882\n146055,1052\n146056,2775\n146057,54\n146058,393\n146058,1096\n146059,72\n146060,1782\n146061,301\n146062,4810\n146063,3623\n146064,980\n146065,2557\n146066,87\n146067,167\n146068,48505\n146069,146070\n146071,483\n146073,3\n146073,32\n146073,217\n146073,222\n146073,326\n146073,349\n146073,388\n146073,392\n146073,433\n146073,509\n146073,657\n146073,697\n146073,720\n146073,752\n146073,809\n146073,872\n146073,873\n146073,874\n146073,907\n146073,919\n146073,932\n146073,973\n146073,1010\n146073,1019\n146073,1133\n146073,1143\n146073,1210\n146073,1240\n146073,1284\n146073,1363\n146073,1453\n146073,1454\n146073,1465\n146073,1634\n146073,1801\n146073,1805\n146073,1836\n146073,1837\n146073,1860\n146073,1871\n146073,1881\n146073,2045\n146073,2191\n146073,2266\n146073,2421\n146073,2699\n146073,3182\n146073,4252\n146073,6789\n146073,6955\n146073,7092\n146074,1479\n146075,3623\n146076,392\n146077,175\n146078,298\n146079,3623\n146080,83\n146081,83\n146082,1707\n146083,269\n146085,83\n146086,87\n146087,83\n146088,1858\n146089,1860\n146090,885\n146090,13704\n146092,1983\n146095,1858\n146096,1860\n146098,83\n146099,83\n146100,455\n146101,1858\n146102,1860\n146104,83\n146105,149\n146107,843\n146107,3467\n146108,3623\n146109,3623\n146110,81\n146111,3623\n146112,255\n146113,142870\n146114,1019\n146115,516\n146116,647\n146117,1149\n146118,3623\n146119,500\n146120,1052\n146121,1962\n146122,1882\n146123,2775\n146124,54\n146125,71\n146125,491\n146125,611\n146125,843\n146125,852\n146125,859\n146125,1449\n146126,592\n146127,1282\n146128,704\n146129,2923\n146130,862\n146131,9001\n146132,1983\n146133,118\n146133,4597\n146135,278\n146135,28130\n146136,118\n146136,4597\n146137,104\n146137,254\n146139,1359\n146140,5906\n146141,557\n146142,626\n146143,278\n146144,137\n146145,862\n146146,146147\n146148,55849\n146149,83\n146150,10\n146150,113156\n146151,22\n146152,809\n146153,34\n146153,35\n146154,500\n146155,1962\n146156,1882\n146157,2775\n146158,1052\n146159,54\n146160,1265\n146160,1266\n146161,1133\n146162,1983\n146163,30\n146164,500\n146165,1882\n146166,2775\n146167,1962\n146168,54\n146169,1052\n146170,2944\n146170,18831\n146171,255\n146172,575\n146173,861\n146175,200\n146176,55849\n146177,146178\n146179,918\n146180,240\n146180,372\n146180,1082\n146180,1285\n146180,1309\n146180,1955\n146181,195\n146182,171\n146183,83\n146184,500\n146185,54\n146186,1962\n146187,1052\n146188,2775\n146189,1882\n146190,929\n146191,718\n146192,146193\n146194,675\n146194,743\n146195,146196\n146197,146198\n146199,30331\n146200,5591\n146201,107\n146202,146203\n146204,143287\n146205,868\n146206,146207\n146208,602\n146209,255\n146210,146211\n146212,30\n146213,146214\n146215,184\n146216,146217\n146219,4545\n146219,56150\n146219,139010\n146220,109308\n146221,1474\n146222,1309\n146223,1127\n146224,146225\n146226,146227\n146228,146229\n146230,146231\n146232,146231\n146233,146231\n146234,146231\n146235,146231\n146236,146231\n146237,862\n146238,30\n146239,146240\n146241,222\n146242,3999\n146243,304\n146244,146245\n146246,452\n146246,535\n146246,918\n146246,1655\n146247,557\n146248,255\n146249,104\n146250,219\n146250,535\n146250,731\n146250,957\n146250,1815\n146250,1888\n146251,628\n146252,355\n146253,48\n146254,358\n146255,647\n146257,146258\n146260,344\n146260,360\n146261,422\n146262,422\n146263,422\n146264,422\n146265,422\n146266,422\n146267,422\n146268,422\n146269,30\n146270,422\n146271,422\n146272,718\n146273,422\n146274,422\n146275,240\n146276,1551\n146277,2480\n146278,3507\n146279,142409\n146279,146280\n146279,148600\n146279,159365\n146280,40566\n146280,115659\n146280,146280\n146280,148600\n146280,159365\n146282,21442\n146283,233\n146284,4823\n146286,146287\n146288,171\n146289,146\n146290,344\n146291,647\n146292,1858\n146293,1860\n146294,217\n146295,298\n146296,485\n146297,146298\n146299,663\n146300,592\n146300,1001\n146301,2915\n146302,225\n146302,431\n146303,808\n146303,1860\n146304,222\n146304,18831\n146307,3585\n146308,931\n146309,171\n146310,142405\n146310,154408\n146313,146314\n146315,420\n146316,500\n146317,1962\n146318,2775\n146319,54\n146320,1052\n146321,1882\n146322,97\n146323,943\n146324,1146\n146325,843\n146326,1556\n146327,500\n146328,1882\n146329,2775\n146330,1962\n146331,54\n146332,1052\n146333,175\n146334,310\n146334,3039\n146335,2671\n146336,298\n146337,287\n146338,344\n146338,5547\n146339,500\n146340,1052\n146341,1882\n146342,1962\n146343,2775\n146344,54\n146345,299\n146346,1130\n146346,81233\n146347,215\n146348,83\n146350,5405\n146351,312\n146352,2083\n146354,142405\n146355,809\n146356,83\n146357,2989\n146357,2991\n146359,1983\n146360,146361\n146362,163\n146362,660\n146363,346\n146365,146366\n146367,623\n146367,1805\n146368,3218\n146369,83\n146370,200\n146371,315\n146372,500\n146373,2775\n146374,1962\n146375,1052\n146376,54\n146377,1882\n146378,175\n146379,5213\n146380,298\n146381,406\n146382,636\n146383,1608\n146384,58\n146385,994\n146386,46\n146387,827\n146389,1608\n146390,1983\n146391,602\n146392,736\n146393,66500\n146395,3507\n146396,1294\n146397,55849\n146398,1608\n146399,1608\n146400,1608\n146401,694\n146402,1749\n146402,14719\n146403,146404\n146405,83\n146406,1608\n146407,58\n146408,994\n146409,46\n146410,79\n146410,120\n146411,252\n146413,818\n146414,4504\n146415,3623\n146416,30\n146417,447\n146418,2775\n146419,30\n146420,22\n146421,79\n146422,171\n146423,146424\n146425,55849\n146426,1181\n146428,1707\n146430,1608\n146432,875\n146433,1531\n146434,167\n146435,994\n146436,58\n146437,46\n146438,2083\n146439,775\n146440,83\n146441,184\n146441,182744\n146442,1860\n146443,2775\n146444,447\n146447,1531\n146449,3069\n146451,175\n146452,171\n146454,63\n146455,58\n146456,994\n146457,46\n146458,50\n146459,1858\n146460,1860\n146461,390\n146462,301\n146462,717\n146462,1782\n146464,577\n146465,406\n146466,801\n146467,557\n146468,1014\n146469,58\n146470,994\n146471,46\n146472,389\n146472,455\n146473,298\n146474,859\n146475,968\n146477,1085\n146478,557\n146479,557\n146480,577\n146481,55849\n146482,2646\n146483,68\n146484,34\n146484,35\n146484,2646\n146485,146486\n146487,2105\n146488,366\n146489,146490\n146491,440\n146492,366\n146493,200\n146493,1177\n146494,717\n146495,1429\n146496,949\n146496,968\n146497,346\n146497,435\n146497,586\n146497,1294\n146497,6119\n146498,861\n146499,640\n146500,280\n146502,2210\n146502,4237\n146502,182162\n146503,483\n146504,3474\n146505,907\n146506,309\n146506,310\n146507,72\n146508,120\n146509,406\n146510,435\n146511,392\n146512,515\n146513,850\n146514,63\n146515,146516\n146517,167\n146518,30\n146518,1179\n146519,843\n146520,588\n146520,590\n146520,805\n146521,3623\n146522,1381\n146523,207\n146524,1255\n146524,1462\n146524,8537\n146524,50943\n146525,48\n146526,349\n146527,142405\n146528,200\n146528,1177\n146529,146530\n146531,146530\n146532,872\n146533,1429\n146534,1608\n146535,1608\n146536,2590\n146538,668\n146539,1179\n146540,1298\n146541,557\n146542,862\n146543,949\n146545,577\n146546,2073\n146547,13745\n146548,104\n146549,146550\n146551,949\n146551,968\n146552,640\n146553,3623\n146554,1243\n146555,862\n146556,2567\n146557,146558\n146559,3623\n146560,3069\n146561,1556\n146562,30\n146564,1143\n146565,358\n146567,994\n146568,557\n146570,142426\n146571,130\n146573,116\n146573,2087\n146574,16153\n146575,138\n146576,2674\n146577,850\n146578,1143\n146579,1235\n146579,1335\n146580,120\n146581,358\n146582,149\n146583,30\n146584,146585\n146586,875\n146587,3623\n146588,5310\n146589,4355\n146590,1188\n146591,264\n146592,30\n146593,1381\n146594,222\n146595,120\n146596,1007\n146597,146598\n146599,142405\n146600,577\n146601,2116\n146602,10\n146603,301\n146603,717\n146603,1782\n146604,146605\n146606,146607\n146606,157885\n146608,146609\n146610,346\n146611,671\n146612,577\n146613,30\n146614,146615\n146616,2083\n146617,146618\n146619,272\n146620,2590\n146621,146622\n146623,1707\n146624,30\n146625,30\n146626,22\n146626,818\n146627,56\n146628,422\n146629,146630\n146631,622\n146632,146633\n146634,146635\n146634,153015\n146637,355\n146638,3260\n146640,72\n146641,1010\n146642,143287\n146643,146644\n146645,1436\n146646,694\n146646,1968\n146647,538\n146648,255\n146649,420\n146649,515\n146649,652\n146649,1893\n146649,117163\n146650,104\n146651,119\n146653,1707\n146654,30331\n146655,146656\n146657,30\n146658,30331\n146659,30\n146661,1326\n146662,1608\n146663,3218\n146664,640\n146665,2296\n146666,1707\n146667,1238\n146668,1007\n146669,1544\n146670,4611\n146671,835\n146671,1298\n146672,83\n146672,278\n146672,366\n146672,949\n146672,1274\n146672,1571\n146672,1881\n146672,2779\n146672,5906\n146673,30\n146674,1033\n146676,424\n146677,328\n146678,422\n146679,422\n146680,422\n146681,422\n146682,422\n146683,422\n146684,422\n146685,422\n146686,422\n146687,422\n146688,1522\n146689,1452\n146690,287\n146691,146692\n146693,4611\n146694,1544\n146695,302\n146695,861\n146695,893\n146696,579\n146697,146698\n146699,146698\n146700,146698\n146701,146698\n146702,146698\n146703,146698\n146704,146698\n146705,147\n146706,18831\n146707,422\n146708,809\n146709,4611\n146710,1544\n146711,356\n146713,233\n146714,3623\n146715,481\n146716,6068\n146717,146718\n146719,575\n146719,1769\n146720,1556\n146721,65\n146722,676\n146722,801\n146722,1140\n146723,1544\n146724,4611\n146725,4611\n146726,1544\n146727,424\n146728,302\n146729,827\n146730,393\n146731,4611\n146732,1544\n146733,5405\n146734,83\n146735,175\n146736,58\n146737,298\n146738,142426\n146740,1608\n146741,1608\n146742,1608\n146744,1608\n146746,949\n146747,269\n146748,818\n146749,3\n146750,483\n146751,2083\n146752,859\n146753,663\n146754,175\n146755,298\n146756,424\n146758,22\n146759,424\n146760,1240\n146761,146762\n146763,577\n146765,994\n146766,138\n146767,116\n146767,2087\n146768,2674\n146769,16153\n146770,602\n146771,872\n146772,760\n146773,592\n146774,261\n146775,718\n146776,2775\n146777,447\n146778,592\n146779,602\n146780,14797\n146781,2737\n146782,518\n146783,3193\n146784,3804\n146785,31122\n146786,19010\n146787,192\n146787,408\n146787,536\n146787,1313\n146787,1893\n146787,2617\n146787,24763\n146788,1323\n146789,102\n146790,408\n146791,1326\n146794,252\n146794,1220\n146794,1222\n146795,538\n146796,255\n146797,2979\n146799,1608\n146800,106\n146802,4611\n146803,1544\n146804,4611\n146805,1544\n146806,1181\n146808,5213\n146810,72\n146811,72\n146812,2923\n146813,167\n146813,299\n146814,195\n146815,640\n146817,146818\n146819,273\n146820,58\n146820,301\n146820,304\n146820,356\n146820,360\n146820,442\n146820,872\n146820,1010\n146820,1363\n146820,1715\n146820,1836\n146820,1893\n146820,2334\n146820,3474\n146820,13361\n146820,81070\n146821,30\n146822,65\n146823,248\n146824,22\n146826,302\n146827,8990\n146828,30\n146829,146830\n146831,435\n146832,843\n146833,422\n146834,56\n146835,992\n146835,1300\n146835,1579\n146835,1718\n146836,439\n146836,671\n146837,509\n146838,149\n146838,406\n146839,2319\n146840,346\n146841,467\n146841,868\n146842,784\n146843,171\n146845,202\n146847,72\n146848,818\n146849,483\n146850,1531\n146851,272\n146852,292\n146853,1326\n146854,433\n146855,344\n146856,72\n146857,285\n146858,1608\n146859,447\n146860,4895\n146861,622\n146862,1893\n146862,5547\n146863,1381\n146864,22\n146866,209\n146866,302\n146867,980\n146868,663\n146869,192\n146870,142473\n146871,146871\n146872,146873\n146874,146873\n146875,146873\n146876,146873\n146877,146873\n146878,146873\n146879,30\n146880,30\n146881,22\n146882,3623\n146883,298\n146884,485\n146885,818\n146886,1415\n146887,55849\n146888,1392\n146889,1353\n146890,248\n146891,809\n146892,23783\n146893,1298\n146894,146895\n146896,146895\n146897,146895\n146898,1181\n146899,525\n146900,50\n146900,158\n146900,192\n146900,195\n146900,285\n146900,306\n146900,307\n146900,393\n146900,406\n146900,422\n146900,620\n146900,1181\n146900,1370\n146900,1515\n146900,5874\n146901,557\n146902,30\n146903,1265\n146903,1266\n146904,298\n146905,485\n146906,8719\n146907,138\n146908,865\n146909,557\n146910,137\n146911,118\n146911,4597\n146912,88820\n146913,557\n146914,313\n146915,2989\n146915,2991\n146916,313\n146917,336\n146917,676\n146917,1010\n146919,72\n146920,2867\n146920,2868\n146921,358\n146922,30\n146923,481\n146925,72\n146926,72\n146927,525\n146928,30\n146929,146930\n146931,130\n146932,195\n146933,1309\n146934,1983\n146935,22\n146936,1556\n146937,30\n146938,72\n146939,527\n146939,138686\n146940,175\n146941,298\n146942,631\n146943,146944\n146945,850\n146946,332\n146947,294\n146949,2116\n146950,1983\n146951,146952\n146953,40566\n146954,175\n146956,298\n146957,408\n146957,1298\n146958,35\n146959,577\n146960,1007\n146961,146962\n146963,146964\n146963,190918\n146965,34\n146965,35\n146966,146967\n146968,146969\n146970,34\n146970,35\n146970,202\n146970,217\n146970,283\n146970,455\n146970,536\n146970,949\n146970,1001\n146970,1201\n146970,1274\n146970,1467\n146970,1927\n146970,2266\n146970,2784\n146970,2979\n146970,4637\n146970,7092\n146971,424\n146972,146973\n146972,151555\n146974,273\n146975,146976\n146977,146978\n146979,372\n146979,1231\n146980,30\n146981,309\n146981,310\n146982,422\n146983,422\n146984,422\n146985,422\n146986,422\n146987,422\n146988,422\n146989,422\n146990,422\n146991,422\n146992,1085\n146993,225\n146994,146994\n146995,207\n146996,146997\n146998,2590\n146999,1414\n147001,147002\n147001,147893\n147003,147002\n147003,147893\n147004,872\n147005,1429\n147006,225\n147007,668\n147008,393\n147009,22\n147010,586\n147010,1243\n147011,422\n147012,8884\n147013,1143\n147014,1085\n147015,147016\n147017,355\n147018,1247\n147019,452\n147020,184\n147021,536\n147023,147024\n147025,147024\n147026,147024\n147027,147024\n147028,147024\n147029,147024\n147030,147024\n147031,147024\n147032,171\n147033,233\n147034,818\n147034,66297\n147035,1858\n147036,1860\n147037,147038\n147039,83\n147040,1284\n147040,1860\n147041,22\n147042,1983\n147043,4101\n147044,147045\n147049,83\n147050,481\n147051,147052\n147053,83\n147054,147055\n147056,10\n147057,255\n147058,147059\n147060,147061\n147062,158\n147064,510\n147065,1323\n147066,408\n147067,102\n147068,1326\n147069,2506\n147070,2506\n147071,1590\n147071,1805\n147072,44\n147073,626\n147074,30\n147076,147077\n147078,206\n147079,586\n147079,875\n147080,147081\n147082,366\n147082,439\n147082,536\n147082,872\n147082,1033\n147082,1805\n147082,30331\n147083,147084\n147085,32\n147085,137\n147085,275\n147085,358\n147085,417\n147085,444\n147085,615\n147085,762\n147085,770\n147085,972\n147085,1143\n147085,1220\n147085,1222\n147085,1241\n147085,1983\n147085,3623\n147085,5933\n147085,15523\n147085,103860\n147085,115659\n147085,144556\n147085,154408\n147086,1983\n147087,147088\n147089,147090\n147091,147092\n147093,147094\n147095,704\n147097,2191\n147098,3094\n147099,83\n147099,694\n147099,1837\n147100,202\n147101,147102\n147103,779\n147104,1370\n147105,3623\n147106,171\n147108,3623\n147109,147110\n147111,3623\n147112,30\n147113,147114\n147115,483\n147116,3623\n147117,240\n147118,1010\n147119,1235\n147119,1335\n147120,1479\n147121,1370\n147122,147123\n147124,390\n147125,147126\n147125,149989\n147127,1707\n147128,592\n147129,22\n147129,1227\n147129,86416\n147130,1082\n147131,22\n147131,211\n147133,72\n147134,2506\n147135,72\n147136,1415\n147137,255\n147138,72\n147139,222\n147140,602\n147141,19\n147142,1858\n147143,1860\n147144,481\n147145,841\n147146,640\n147147,366\n147148,298\n147149,422\n147150,56\n147151,147152\n147153,107\n147154,2416\n147154,2417\n147155,292\n147156,338\n147157,355\n147158,298\n147159,1133\n147160,3538\n147161,233\n147162,2574\n147163,1188\n147164,893\n147165,147166\n147167,1127\n147168,481\n147170,147171\n147173,1860\n147174,1858\n147175,1858\n147176,1860\n147177,485\n147178,298\n147180,147181\n147182,2989\n147182,2991\n147183,54\n147184,298\n147185,485\n147186,408\n147187,1323\n147188,102\n147189,1326\n147190,142430\n147190,147191\n147192,1983\n147193,872\n147194,932\n147195,147196\n147197,3258\n147198,147199\n147201,135\n147202,5375\n147203,79\n147203,525\n147204,1707\n147205,3623\n147207,72\n147208,72\n147209,140\n147209,158\n147209,160\n147209,178\n147209,340\n147209,406\n147209,479\n147209,1287\n147209,1659\n147209,1893\n147209,2931\n147209,4504\n147209,8598\n147209,8822\n147210,885\n147210,13704\n147211,957\n147212,957\n147213,147214\n147215,957\n147216,1707\n147217,298\n147218,485\n147219,298\n147220,485\n147221,72\n147222,298\n147223,485\n147224,195\n147224,406\n147224,779\n147225,240\n147227,289\n147227,290\n147227,144988\n147228,2371\n147230,850\n147231,151\n147233,137\n147234,240\n147235,557\n147236,1983\n147237,557\n147238,1983\n147239,1983\n147240,30\n147241,3623\n147242,147243\n147244,784\n147244,258887\n147245,1983\n147246,1983\n147247,1983\n147248,1370\n147249,626\n147250,718\n147251,422\n147252,422\n147253,422\n147254,422\n147255,422\n147256,422\n147257,422\n147258,422\n147259,422\n147260,422\n147261,7092\n147262,72\n147263,1392\n147264,1983\n147265,1983\n147266,1983\n147267,30\n147268,743\n147269,1844\n147270,87\n147270,217\n147270,392\n147270,509\n147270,510\n147270,595\n147270,703\n147270,843\n147270,872\n147270,1151\n147270,1453\n147270,1465\n147270,1572\n147270,1722\n147270,1836\n147270,2274\n147270,2697\n147270,24763\n147271,142473\n147272,289\n147272,290\n147272,144988\n147273,602\n147274,147275\n147276,142433\n147277,30\n147278,147279\n147280,1179\n147281,602\n147282,483\n147283,269\n147284,175\n147285,147286\n147287,147286\n147288,968\n147289,1370\n147290,147291\n147292,151\n147293,292\n147294,366\n147295,366\n147296,294\n147297,296\n147298,298\n147299,147300\n147301,147302\n147303,41\n147305,422\n147306,56\n147307,30\n147308,1849\n147308,32784\n147309,192\n147311,301\n147311,717\n147311,1231\n147311,1782\n147312,355\n147313,298\n147314,485\n147315,83\n147317,485\n147318,298\n147320,147321\n147322,147323\n147325,455\n147326,640\n147327,56\n147327,422\n147328,142426\n147328,145751\n147330,349\n147331,312\n147332,34\n147332,35\n147332,83\n147332,217\n147332,313\n147332,634\n147332,1313\n147332,1718\n147332,2224\n147332,2931\n147332,6298\n147333,338\n147334,640\n147335,137\n147336,30\n147338,233\n147339,1688\n147340,22\n147342,22\n147343,422\n147344,2191\n147345,366\n147346,500\n147347,663\n147348,22\n147349,422\n147350,2017\n147352,3138\n147353,217\n147354,640\n147355,107\n147356,872\n147358,10\n147359,1238\n147360,868\n147361,1608\n147362,805\n147363,1608\n147364,779\n147364,2701\n147365,795\n147367,1849\n147367,32784\n147368,868\n147368,156379\n147370,1452\n147371,671\n147372,4066\n147373,481\n147374,1782\n147375,795\n147376,41\n147376,58\n147376,264\n147376,309\n147376,310\n147376,328\n147376,344\n147376,390\n147376,439\n147376,455\n147376,538\n147376,779\n147376,872\n147376,877\n147376,1289\n147376,1381\n147376,1436\n147376,1452\n147376,16687\n147376,227669\n147377,2244\n147378,3507\n147379,83\n147380,149\n147380,859\n147380,1623\n147381,1089\n147382,175\n147383,298\n147384,147385\n147386,671\n147388,717\n147389,1608\n147393,147\n147395,184\n147396,1370\n147397,309\n147397,310\n147398,142426\n147399,3623\n147400,431\n147400,1789\n147401,424\n147402,1707\n147403,22\n147404,1860\n147405,1858\n147406,202\n147407,22\n147408,784\n147408,1118\n147408,2424\n147409,255\n147410,941\n147411,37\n147412,22\n147413,58\n147413,1140\n147413,1653\n147413,1836\n147413,2436\n147413,4771\n147413,136072\n147414,15\n147415,356\n147415,852\n147417,1821\n147418,1282\n147420,41\n147420,3135\n147421,1282\n147422,298\n147423,485\n147424,22\n147425,2620\n147426,222\n147427,76096\n147431,2620\n147432,2312\n147433,104\n147433,136\n147433,298\n147433,1368\n147433,2105\n147435,2620\n147437,626\n147442,302\n147442,579\n147443,41\n147446,752\n147446,5540\n147451,143287\n147452,2620\n147453,2146\n147454,536\n147455,485\n147458,50\n147458,994\n147458,1181\n147458,1425\n147460,83\n147461,127158\n147462,22\n147462,1860\n147464,83\n147465,136\n147467,192\n147467,406\n147467,1623\n147468,30\n147470,83\n147471,147472\n147471,177375\n147471,178776\n147475,1132\n147475,142473\n147475,142879\n147476,1616\n147477,272\n147478,447\n147479,2775\n147480,301\n147481,1160\n147482,10\n147483,2784\n147484,301\n147485,292\n147485,1776\n147486,83\n147487,83\n147488,83\n147490,875\n147491,3623\n147492,107\n147492,745\n147493,4691\n147495,158\n147495,192\n147498,76096\n147499,2620\n147501,850\n147502,1177\n147503,919\n147504,1467\n147505,44\n147506,86\n147508,145240\n147509,1238\n147510,852\n147512,1556\n147514,1370\n147515,207\n147515,328\n147515,390\n147515,702\n147515,873\n147515,874\n147515,1133\n147516,147\n147516,158\n147516,406\n147517,1634\n147519,640\n147520,1858\n147521,1860\n147522,1805\n147525,1789\n147526,3538\n147527,673\n147528,147529\n147530,338\n147530,4571\n147530,88820\n147532,167\n147535,2620\n147536,586\n147538,147539\n147541,1419\n147543,2191\n147545,1238\n147547,30\n147548,2083\n147548,2557\n147549,298\n147550,485\n147551,79\n147552,393\n147553,1119\n147555,83\n147556,142405\n147556,154408\n147557,2979\n147558,2048\n147559,571\n147560,2775\n147561,447\n147562,623\n147562,1805\n147563,30\n147564,19010\n147565,217\n147566,138686\n147567,206\n147568,147\n147569,1370\n147570,30\n147571,8798\n147572,2668\n147573,435\n147574,30\n147575,640\n147576,195\n147577,483\n147578,30\n147579,772\n147580,34\n147580,1235\n147580,3804\n147580,15807\n147582,65\n147582,171\n147582,467\n147583,634\n147583,2224\n147583,2646\n147584,30\n147585,72\n147586,344\n147587,285\n147588,147589\n147590,2617\n147591,30\n147592,30\n147593,850\n147595,65\n147595,71\n147595,272\n147595,611\n147596,269\n147597,1454\n147598,2210\n147598,4237\n147599,147600\n147601,248\n147601,5405\n147604,255\n147605,142433\n147606,1287\n147607,1608\n147608,536\n147609,142405\n147610,1370\n147611,248\n147611,5405\n147612,30\n147613,1370\n147614,158\n147614,406\n147614,779\n147614,1181\n147614,1515\n147615,1515\n147617,147618\n147619,147620\n147621,1287\n147622,406\n147623,3507\n147624,56\n147624,147\n147624,192\n147624,1243\n147624,3507\n147624,240174\n147625,147626\n147627,1289\n147628,2506\n147629,885\n147629,13704\n147630,9024\n147631,147632\n147633,1282\n147633,2210\n147633,4237\n147633,182162\n147635,861\n147636,1623\n147637,644\n147638,2146\n147639,147640\n147642,217\n147643,30\n147644,346\n147646,58\n147647,3507\n147648,3370\n147648,14453\n147649,30\n147650,346\n147651,30\n147652,79\n147653,147654\n147655,1707\n147656,147657\n147658,147659\n147660,422\n147661,56\n147662,3623\n147664,58\n147665,994\n147666,46\n147667,147668\n147669,30\n147670,147671\n147672,19\n147673,473\n147673,1240\n147673,2173\n147673,4252\n147673,5405\n147674,50\n147674,146\n147674,147\n147674,158\n147674,358\n147674,406\n147674,510\n147674,779\n147674,1181\n147674,1515\n147674,92476\n147675,147123\n147676,431\n147677,406\n147678,20\n147678,207\n147678,390\n147678,424\n147678,438\n147678,736\n147678,835\n147678,874\n147678,907\n147678,1282\n147678,1425\n147678,1432\n147678,1634\n147678,7155\n147679,30\n147680,422\n147681,56\n147682,58\n147683,994\n147684,46\n147685,2923\n147686,58\n147687,994\n147688,46\n147689,42220\n147691,30\n147692,623\n147692,1805\n147693,250\n147693,1684\n147694,298\n147695,485\n147696,733\n147697,3538\n147699,147700\n147701,30\n147702,147703\n147704,406\n147705,1551\n147706,147707\n147708,264\n147709,147710\n147711,850\n147712,147713\n147714,147715\n147716,147717\n147720,147721\n147723,171\n147724,30\n147725,136\n147725,137\n147726,1319\n147727,30\n147728,68\n147729,147730\n147731,8854\n147732,1769\n147733,147734\n147735,147736\n147737,435\n147738,843\n147739,147740\n147741,273\n147742,843\n147743,222\n147744,34\n147744,35\n147744,313\n147745,56\n147746,422\n147747,2889\n147748,143287\n147749,309\n147749,310\n147750,388\n147751,104\n147751,557\n147751,885\n147751,1368\n147751,1939\n147751,5405\n147751,13704\n147752,366\n147753,366\n147754,366\n147755,366\n147756,809\n147756,811\n147757,355\n147758,113878\n147759,809\n147760,30\n147761,772\n147762,147763\n147764,1818\n147765,1858\n147766,1860\n147767,347\n147767,702\n147767,752\n147767,873\n147767,874\n147767,1133\n147767,1210\n147767,1801\n147767,3182\n147767,28693\n147767,44743\n147769,1858\n147770,1860\n147771,1462\n147771,4475\n147772,435\n147773,217\n147773,467\n147774,147775\n147776,147777\n147778,500\n147779,1052\n147780,1962\n147781,1882\n147782,2775\n147783,54\n147784,147785\n147786,344\n147787,72\n147788,285\n147790,30\n147791,835\n147792,147793\n147794,500\n147795,1052\n147796,1962\n147797,1882\n147798,2775\n147799,54\n147800,147801\n147802,147801\n147803,147801\n147804,147801\n147805,147801\n147806,147801\n147807,147801\n147808,147801\n147810,75912\n147812,1285\n147812,127158\n147813,346\n147814,510\n147817,349\n147818,143287\n147820,147821\n147822,147823\n147825,30\n147826,1140\n147826,1836\n147826,3474\n147827,671\n147828,6895\n147828,13445\n147828,24605\n147828,34524\n147828,93134\n147828,113791\n147828,119416\n147828,120907\n147828,121209\n147828,122136\n147828,123396\n147828,125472\n147828,126053\n147828,128472\n147828,128825\n147828,128965\n147828,129101\n147828,130840\n147828,131532\n147828,132068\n147828,133020\n147828,134958\n147828,134968\n147828,145207\n147828,146413\n147828,146748\n147828,147828\n147828,147847\n147828,148531\n147828,149567\n147828,150477\n147828,150561\n147828,152526\n147828,158399\n147828,158474\n147828,158550\n147828,165734\n147828,166779\n147828,167617\n147828,168644\n147828,169191\n147828,169517\n147828,170450\n147828,221942\n147828,222032\n147828,224143\n147828,224171\n147828,225684\n147829,422\n147830,422\n147831,422\n147832,422\n147833,422\n147834,422\n147835,422\n147836,422\n147837,422\n147838,422\n147839,1707\n147840,30\n147841,147801\n147842,30\n147843,151\n147844,147845\n147846,784\n147846,1118\n147848,18831\n147850,298\n147851,485\n147852,175\n147853,83\n147854,147855\n147856,9010\n147857,298\n147858,1774\n147858,147859\n147859,663\n147861,481\n147862,233\n147863,5547\n147864,147865\n147864,159902\n147864,246879\n147864,249827\n147866,147867\n147868,1579\n147869,422\n147870,3653\n147873,390\n147874,592\n147875,298\n147876,485\n147877,264\n147877,16687\n147878,485\n147879,298\n147880,2671\n147881,137\n147882,104\n147883,167\n147883,299\n147883,3218\n147883,207045\n147884,7155\n147885,1807\n147886,298\n147888,1085\n147888,75912\n147889,1707\n147890,119\n147891,134\n147892,1127\n147894,1012\n147895,1564\n147896,30\n147897,72\n147898,344\n147899,285\n147900,184\n147902,3695\n147903,30\n147904,640\n147905,2775\n147906,447\n147907,818\n147908,142426\n147909,4895\n147910,83\n147911,215\n147911,141840\n147911,148456\n147911,148875\n147911,152789\n147912,406\n147913,422\n147914,56\n147915,217\n147916,457\n147916,673\n147916,1070\n147917,1858\n147918,1860\n147919,72\n147920,344\n147921,285\n147923,389\n147923,18831\n147924,1293\n147925,2191\n147926,142405\n147927,424\n147928,1293\n147929,7194\n147930,697\n147931,79\n147931,217\n147931,247\n147931,1181\n147932,175\n147933,1462\n147933,8537\n147934,298\n147936,269\n147937,467\n147938,1133\n147939,278\n147940,885\n147940,13704\n147941,72\n147942,285\n147943,344\n147944,72\n147945,285\n147946,344\n147948,1858\n147949,1860\n147950,31073\n147951,1722\n147952,7194\n147953,1309\n147955,1818\n147956,147956\n147957,818\n147958,72764\n147959,1707\n147960,163\n147961,389\n147961,433\n147962,852\n147963,298\n147964,485\n147965,147966\n147968,720\n147969,289\n147969,290\n147969,144988\n147970,72\n147971,344\n147972,285\n147973,272\n147975,455\n147976,72\n147977,344\n147978,285\n147979,3623\n147982,34\n147982,35\n147982,18831\n147983,79\n147984,1274\n147985,48\n147985,583\n147986,147987\n147988,417\n147989,1119\n147989,103860\n147990,142426\n147991,72\n147992,344\n147993,285\n147994,2191\n147996,147997\n147999,72\n148000,344\n148001,285\n148002,30\n148003,72\n148004,344\n148005,285\n148006,586\n148010,1274\n148011,1274\n148012,392\n148012,875\n148013,72\n148014,344\n148015,285\n148016,485\n148017,298\n148020,99\n148021,809\n148022,148023\n148024,72\n148025,285\n148026,344\n148027,5213\n148028,30\n148029,148030\n148031,1858\n148032,1860\n148036,187\n148037,1252\n148037,1253\n148038,171\n148039,1096\n148040,1127\n148041,2646\n148042,1893\n148043,875\n148044,623\n148044,1805\n148045,175\n148048,148049\n148050,571\n148051,298\n148052,694\n148052,852\n148052,1085\n148052,4222\n148053,2797\n148054,305\n148054,841\n148054,3695\n148054,7429\n148058,147\n148059,264\n148061,3\n148062,2617\n148063,104\n148064,843\n148066,1359\n148067,2286\n148068,30\n148073,30\n148074,2989\n148074,2991\n148075,809\n148076,994\n148076,1255\n148076,1432\n148076,1775\n148076,2674\n148076,50943\n148076,171294\n148078,148079\n148080,784\n148081,267\n148082,94\n148082,885\n148082,2787\n148082,13704\n148083,9010\n148084,1070\n148085,148086\n148087,298\n148088,485\n148089,1417\n148090,79\n148090,1462\n148091,3\n148092,9010\n148093,326\n148094,273\n148094,399\n148094,406\n148095,4223\n148096,34\n148096,35\n148097,21442\n148098,167\n148099,483\n148100,389\n148101,1019\n148102,932\n148104,147\n148104,23783\n148105,255\n148106,148107\n148108,994\n148109,779\n148110,885\n148110,13704\n148112,68\n148113,907\n148114,1127\n148114,1893\n148114,49057\n148114,81070\n148115,240\n148116,1285\n148117,1293\n148118,30\n148119,148120\n148121,8270\n148122,994\n148123,2506\n148124,148125\n148126,435\n148127,2191\n148128,240\n148129,5326\n148130,18831\n148131,81\n148132,843\n148133,200\n148134,406\n148135,24505\n148136,175\n148137,801\n148138,140\n148139,267\n148140,298\n148141,2205\n148141,33424\n148142,994\n148143,406\n148144,30236\n148145,3474\n148147,1381\n148148,919\n148149,994\n148150,30\n148151,175\n148152,298\n148153,1381\n148154,994\n148155,313\n148156,1132\n148157,994\n148158,602\n148159,602\n148160,44\n148161,148162\n148163,2224\n148164,1984\n148164,3949\n148165,3069\n148166,148167\n148168,515\n148170,147\n148170,158\n148171,148172\n148171,151008\n148171,239106\n148173,1381\n148174,483\n148175,142405\n148176,148177\n148178,1556\n148179,148180\n148179,183998\n148179,239216\n148179,239493\n148179,249824\n148179,253732\n148179,262163\n148179,263651\n148181,920\n148183,1707\n148184,148185\n148186,356\n148187,148188\n148190,1143\n148191,389\n148192,415\n148192,1143\n148193,147\n148193,1458\n148193,89035\n148194,575\n148194,697\n148195,1\n148196,6068\n148197,2671\n148198,516\n148199,18831\n148200,148201\n148202,30\n148203,808\n148204,1467\n148205,148206\n148207,30\n148208,148209\n148210,1634\n148211,148212\n148213,140\n148214,148215\n148216,2989\n148216,2991\n148217,3\n148218,72\n148219,285\n148220,344\n148221,355\n148222,366\n148223,366\n148224,571\n148225,37414\n148226,497\n148226,1172\n148227,58\n148228,46\n148229,994\n148230,1984\n148230,3949\n148231,852\n148232,143287\n148233,148234\n148235,30\n148236,1385\n148237,406\n148238,137\n148239,994\n148241,1425\n148242,292\n148243,298\n148244,485\n148245,298\n148246,485\n148249,392\n148250,148251\n148252,5591\n148254,97\n148255,862\n148256,206\n148257,422\n148258,422\n148259,743\n148260,422\n148261,422\n148262,422\n148263,422\n148264,422\n148265,134\n148266,422\n148267,422\n148268,422\n148270,1608\n148271,148272\n148274,4260\n148274,156379\n148276,312\n148276,991\n148276,1707\n148276,2605\n148279,406\n148281,136\n148281,137\n148281,312\n148284,485\n148285,994\n148286,827\n148287,1818\n148288,292\n148289,233\n148290,1544\n148291,4611\n148292,1544\n148293,4611\n148294,868\n148294,1572\n148295,481\n148296,292\n148297,225\n148297,805\n148298,20\n148298,1070\n148298,1402\n148298,1707\n148298,2923\n148299,83\n148300,292\n148301,1359\n148302,136\n148303,994\n148304,636\n148306,994\n148307,577\n148308,292\n148309,3804\n148310,338\n148310,1326\n148310,21827\n148310,154469\n148310,159294\n148310,171069\n148310,172880\n148312,994\n148314,138686\n148315,175\n148316,292\n148317,298\n148318,292\n148319,1616\n148321,994\n148322,142433\n148323,994\n148324,83\n148327,515\n148328,142409\n148328,146280\n148329,305\n148330,298\n148331,485\n148332,536\n148333,41\n148333,1462\n148333,8537\n148334,994\n148336,1070\n148338,302\n148339,424\n148340,184\n148341,907\n148342,298\n148343,485\n148344,2867\n148344,2868\n148345,30\n148347,1984\n148348,3653\n148349,292\n148350,485\n148351,298\n148353,668\n148354,22\n148356,626\n148357,1033\n148358,980\n148359,148360\n148361,1133\n148361,1392\n148363,9010\n148364,292\n148365,2296\n148365,101935\n148366,148367\n148368,996\n148369,602\n148371,994\n148373,298\n148374,485\n148375,30\n148376,130776\n148377,30\n148379,107\n148380,292\n148381,994\n148382,30\n148383,138686\n148384,175\n148385,3623\n148386,3623\n148387,972\n148387,1010\n148388,292\n148389,298\n148392,518\n148393,8373\n148394,222\n148395,4611\n148396,1544\n148397,4611\n148398,1544\n148399,994\n148401,200\n148401,832\n148402,6068\n148403,292\n148404,1326\n148405,934\n148405,980\n148406,292\n148407,292\n148408,292\n148409,779\n148410,292\n148411,142405\n148411,148412\n148413,685\n148413,2460\n148414,1400\n148415,142405\n148415,148412\n148416,1858\n148417,1860\n148418,298\n148419,485\n148420,1608\n148421,1132\n148422,843\n148423,292\n148424,1370\n148426,1085\n148427,1300\n148427,3258\n148428,509\n148429,3769\n148430,313\n148431,37088\n148432,146\n148433,344\n148434,647\n148435,148436\n148437,1105\n148437,138686\n148438,1298\n148440,148441\n148442,79\n148444,872\n148444,1796\n148446,1608\n148447,1132\n148448,302\n148448,1893\n148451,577\n148452,1132\n148453,1608\n148454,227\n148456,176782\n148457,264\n148459,563\n148460,5213\n148462,2210\n148462,4237\n148463,211\n148466,142473\n148466,142879\n148468,408\n148469,1323\n148470,102\n148471,1326\n148472,1877\n148473,459\n148474,142870\n148475,491\n148476,5547\n148477,148478\n148479,59021\n148479,60576\n148480,48\n148481,435\n148482,148483\n148484,22\n148485,119\n148486,473\n148487,932\n148488,175\n148488,206\n148488,253147\n148489,18831\n148490,1392\n148491,32\n148491,392\n148491,1363\n148491,1858\n148491,76096\n148492,843\n148493,146\n148493,285\n148493,406\n148493,1655\n148494,30\n148496,994\n148497,994\n148498,885\n148498,13704\n148499,957\n148499,1815\n148501,885\n148501,13704\n148502,2146\n148503,1305\n148504,467\n148505,779\n148506,240\n148508,68069\n148510,147\n148511,264\n148512,920\n148514,255\n148515,68069\n148517,1515\n148518,467\n148521,217\n148522,579\n148523,1556\n148524,68069\n148525,302\n148526,861\n148527,137\n148528,148529\n148530,1238\n148532,1274\n148533,148534\n148535,1452\n148536,417\n148537,406\n148538,1381\n148539,148540\n148541,68069\n148542,1860\n148543,5405\n148544,22\n148545,1707\n148546,611\n148547,446\n148548,148548\n148549,862\n148549,6068\n148550,30\n148551,30\n148552,2590\n148553,30\n148554,148555\n148556,148557\n148556,150907\n148558,805\n148559,5906\n148560,557\n148561,626\n148562,278\n148563,137\n148564,862\n148565,30\n148566,15573\n148567,207\n148568,1858\n148569,1860\n148570,1127\n148571,148572\n148573,481\n148574,483\n148575,146\n148576,647\n148577,344\n148578,18831\n148578,55210\n148579,1429\n148580,668\n148581,148582\n148583,206\n148584,1707\n148585,148586\n148587,148586\n148588,148586\n148589,148586\n148590,148586\n148591,557\n148592,640\n148593,148594\n148595,2209\n148596,467\n148597,1707\n148598,304\n148599,1332\n148601,56\n148601,158\n148601,175\n148601,285\n148601,336\n148601,406\n148601,620\n148601,640\n148601,779\n148601,875\n148601,1425\n148601,1515\n148601,68069\n148602,1143\n148603,143287\n148604,44\n148605,18831\n148606,195\n148606,406\n148606,779\n148607,1309\n148607,1955\n148607,2775\n148608,148609\n148608,204121\n148610,1370\n148611,358\n148612,148613\n148614,148615\n148616,1319\n148617,1235\n148617,1335\n148618,557\n148619,148620\n148621,1515\n148622,144556\n148623,1634\n148624,795\n148625,148626\n148627,148626\n148628,2116\n148629,779\n148629,1181\n148630,1192\n148631,2205\n148631,33424\n148632,148633\n148634,344\n148635,68069\n148636,1201\n148637,34\n148637,35\n148637,714\n148638,30\n148639,1871\n148640,1556\n148641,577\n148642,148643\n148646,697\n148646,1769\n148647,872\n148648,862\n148648,2590\n148649,148650\n148651,148650\n148652,148653\n148654,366\n148655,366\n148656,72\n148657,255\n148658,356\n148658,1243\n148659,850\n148660,148661\n148662,30\n148664,30\n148665,4611\n148666,1544\n148667,862\n148668,467\n148669,18831\n148670,4611\n148671,1544\n148672,4611\n148673,1544\n148674,355\n148675,671\n148676,79\n148677,1707\n148679,726\n148680,697\n148681,75912\n148682,726\n148683,148684\n148685,4611\n148686,1544\n148688,305\n148689,5547\n148690,493\n148690,3148\n148691,872\n148692,83\n148693,2782\n148694,4611\n148695,1544\n148696,868\n148697,68\n148699,1634\n148701,148702\n148703,346\n148704,809\n148705,148706\n148707,147\n148708,148709\n148710,4611\n148711,1544\n148712,3367\n148713,1544\n148714,2296\n148715,148716\n148717,148716\n148718,148716\n148720,18831\n148721,366\n148722,233\n148723,422\n148724,56\n148725,1789\n148726,148727\n148728,292\n148729,422\n148730,422\n148731,422\n148732,422\n148733,422\n148734,422\n148735,287\n148735,314\n148736,422\n148737,422\n148738,527\n148738,95152\n148739,302\n148740,422\n148742,380\n148742,390\n148742,907\n148742,972\n148742,973\n148742,1284\n148742,1544\n148742,1732\n148742,2191\n148742,2372\n148742,3207\n148742,4362\n148742,8032\n148742,9684\n148742,14572\n148742,15272\n148742,17154\n148742,20055\n148742,22544\n148742,23351\n148742,25272\n148742,31785\n148742,34258\n148742,38974\n148742,39562\n148742,45590\n148742,48283\n148742,48892\n148742,48895\n148742,49647\n148742,52520\n148742,54504\n148742,59920\n148742,62204\n148742,69679\n148742,82763\n148742,99597\n148742,103207\n148742,112527\n148742,117099\n148742,132085\n148742,134042\n148742,140569\n148742,148742\n148742,150114\n148742,158990\n148742,163057\n148742,165669\n148742,165894\n148742,167287\n148742,178252\n148742,179336\n148742,181948\n148742,192627\n148742,192668\n148742,193765\n148742,194407\n148742,194532\n148742,194533\n148742,194540\n148742,194546\n148742,195168\n148742,195173\n148742,195180\n148742,197614\n148742,198780\n148742,199511\n148742,199763\n148742,204041\n148742,205673\n148742,219861\n148742,221896\n148742,222808\n148742,223916\n148742,228158\n148742,228439\n148742,230305\n148742,232032\n148742,233453\n148742,233472\n148742,233583\n148742,234055\n148742,234088\n148742,234140\n148742,234171\n148742,234227\n148742,234267\n148742,234343\n148742,234803\n148742,234804\n148742,234807\n148742,234818\n148742,234859\n148742,234976\n148742,234996\n148742,235263\n148742,235786\n148742,235868\n148742,235878\n148742,235928\n148742,235989\n148742,235998\n148742,236009\n148742,236014\n148742,236032\n148742,236045\n148742,236067\n148742,236070\n148742,236084\n148742,236114\n148742,236125\n148742,236146\n148742,236152\n148742,236164\n148742,236169\n148742,236184\n148742,236320\n148742,236341\n148742,236347\n148742,236448\n148742,236452\n148742,236542\n148742,236549\n148742,236571\n148742,236612\n148742,236644\n148742,236652\n148742,236775\n148742,236847\n148742,236894\n148742,236898\n148742,236941\n148742,236970\n148742,236977\n148742,236982\n148742,237565\n148742,237917\n148742,238221\n148742,238248\n148742,238277\n148742,239863\n148742,239934\n148742,239968\n148742,240044\n148742,241825\n148742,242171\n148742,242457\n148742,243320\n148742,243331\n148742,243478\n148742,243575\n148742,243605\n148742,243931\n148742,243987\n148742,244116\n148742,244143\n148742,244147\n148742,244172\n148742,244178\n148742,244213\n148742,244237\n148742,244265\n148742,244887\n148742,244978\n148742,247829\n148742,247927\n148742,247962\n148742,249701\n148742,249843\n148742,250760\n148742,250988\n148742,251318\n148742,251538\n148742,253312\n148742,254174\n148742,255456\n148742,257403\n148742,260158\n148743,422\n148745,148746\n148748,500\n148749,1962\n148750,1052\n148751,1882\n148752,2775\n148753,54\n148754,143287\n148756,292\n148757,3653\n148758,251\n148758,516\n148758,1243\n148759,406\n148760,4611\n148761,1544\n148762,850\n148763,372\n148763,809\n148764,1556\n148766,178\n148766,315\n148766,346\n148766,393\n148766,435\n148766,439\n148766,538\n148766,671\n148766,934\n148766,996\n148766,1068\n148766,1294\n148766,1590\n148766,1612\n148766,1644\n148766,1877\n148766,2353\n148766,6661\n148767,138686\n148768,1466\n148769,175\n148770,83\n148772,481\n148773,1531\n148773,4455\n148773,4545\n148773,56150\n148774,298\n148775,843\n148776,298\n148777,485\n148778,872\n148779,68\n148780,217\n148780,1419\n148781,3653\n148782,720\n148782,1284\n148783,298\n148784,485\n148785,68069\n148786,2557\n148787,148788\n148790,195\n148792,422\n148793,56\n148797,2671\n148798,148799\n148800,626\n148801,872\n148802,2371\n148803,2784\n148804,1370\n148805,298\n148806,485\n148808,158\n148809,283\n148809,455\n148811,83\n148812,144556\n148814,2353\n148816,83\n148818,302\n148818,579\n148819,1132\n148820,1608\n148821,6119\n148822,337\n148823,392\n148823,697\n148826,485\n148827,83\n148828,138686\n148829,175\n148831,298\n148832,1893\n148833,2353\n148834,1634\n148836,292\n148837,222\n148837,18831\n148838,86\n148839,50\n148840,516\n148841,160\n148841,1298\n148842,581\n148846,1467\n148847,1425\n148850,292\n148851,209\n148852,640\n148854,433\n148855,1353\n148856,1544\n148857,4611\n148858,292\n148859,2353\n148860,3846\n148861,142426\n148862,148863\n148864,287\n148865,577\n148866,222\n148866,536\n148866,2784\n148867,1467\n148868,1608\n148869,3555\n148870,142405\n148870,154408\n148871,142433\n148872,148873\n148874,417\n148874,1635\n148876,301\n148876,968\n148877,142426\n148878,1132\n148879,1608\n148880,1345\n148881,1345\n148882,292\n148883,1167\n148884,148885\n148886,158\n148886,336\n148886,406\n148886,620\n148886,779\n148886,1163\n148886,1181\n148886,5726\n148886,8055\n148887,240\n148888,417\n148889,2989\n148889,2991\n148890,3\n148891,151\n148892,1010\n148893,795\n148894,875\n148896,141912\n148897,875\n148898,1544\n148900,301\n148902,22\n148903,298\n148904,485\n148906,626\n148909,30\n148910,118\n148910,4597\n148911,622\n148912,406\n148914,843\n148915,843\n148917,406\n148918,918\n148919,83\n148920,467\n148921,918\n148922,2626\n148923,640\n148924,843\n148925,148926\n148927,1984\n148927,3949\n148928,10\n148928,455\n148928,1122\n148929,200\n148930,292\n148931,640\n148932,885\n148932,13704\n148933,2353\n148934,861\n148935,2923\n148936,1243\n148936,240174\n148937,577\n148938,209\n148938,302\n148939,6068\n148940,843\n148941,1167\n148942,222\n148942,18831\n148943,1235\n148943,1335\n148944,18831\n148945,148946\n148947,483\n148948,292\n148949,422\n148950,56\n148951,1893\n148952,148953\n148954,68\n148954,356\n148954,408\n148954,852\n148954,3069\n148955,467\n148956,422\n148957,56\n148958,1181\n148960,72\n148961,602\n148962,602\n148963,3138\n148964,148965\n148966,148965\n148968,372\n148968,589\n148968,968\n148969,142473\n148970,192\n148970,406\n148970,439\n148970,818\n148970,2371\n148970,103698\n148970,118336\n148970,127158\n148971,408\n148972,102\n148973,1323\n148974,1326\n148975,83\n148976,2979\n148977,292\n148978,2296\n148979,640\n148980,63\n148981,83\n148982,148983\n148984,1509\n148984,1551\n148985,435\n148986,5440\n148988,142405\n148989,1551\n148990,1374\n148991,3111\n148992,30\n148993,1467\n148994,1235\n148994,1335\n148995,26041\n148996,30\n148997,422\n148998,56\n148999,422\n149000,56\n149001,356\n149002,1370\n149003,843\n149004,1776\n149005,885\n149005,13704\n149006,30\n149007,72\n149008,2312\n149009,1983\n149010,149011\n149012,2719\n149013,192\n149014,1515\n149015,788\n149016,192\n149017,22\n149018,149018\n149019,30\n149020,68069\n149021,30\n149023,557\n149024,862\n149025,149026\n149025,149072\n149027,920\n149028,440\n149028,1033\n149029,575\n149030,994\n149031,107\n149031,4771\n149032,850\n149033,392\n149034,2931\n149035,1243\n149036,149037\n149038,422\n149039,56\n149040,323\n149041,298\n149042,485\n149043,30\n149044,149045\n149046,142430\n149047,138686\n149048,175\n149049,588\n149049,590\n149049,1072\n149049,1419\n149049,3252\n149049,4637\n149050,298\n149051,217\n149052,149053\n149054,393\n149055,422\n149056,56\n149057,30\n149058,58\n149059,30\n149060,136\n149061,298\n149062,485\n149063,1888\n149065,83\n149066,3623\n149067,167\n149068,30\n149069,1449\n149070,298\n149071,485\n149073,72\n149074,1175\n149075,149076\n149077,420\n149077,652\n149078,30\n149080,72\n149081,344\n149081,2646\n149082,255\n149083,72\n149084,44\n149085,72\n149086,72\n149087,563\n149088,30\n149089,72\n149090,1659\n149091,1849\n149092,138686\n149093,175\n149094,298\n149095,5547\n149096,30\n149097,1\n149097,1572\n149098,149099\n149098,154187\n149100,640\n149101,1240\n149101,1465\n149102,1782\n149103,640\n149104,50\n149105,1467\n149106,455\n149107,2424\n149108,1871\n149109,2421\n149110,83\n149111,13980\n149112,192\n149113,3804\n149114,7416\n149115,19\n149115,34\n149115,35\n149115,217\n149115,222\n149115,313\n149115,379\n149115,385\n149115,399\n149115,477\n149115,536\n149115,634\n149115,660\n149115,781\n149115,891\n149115,949\n149115,1201\n149115,1274\n149115,1571\n149115,1618\n149115,1881\n149115,2224\n149115,2266\n149115,2553\n149115,2646\n149115,2784\n149115,2944\n149115,4672\n149115,5326\n149115,6298\n149115,7092\n149115,7698\n149115,8463\n149115,17346\n149115,18831\n149115,23287\n149115,28130\n149115,57354\n149115,217598\n149116,138686\n149117,175\n149118,298\n149119,640\n149120,149121\n149122,149121\n149123,149121\n149124,149125\n149126,366\n149127,366\n149128,255\n149129,149130\n149131,149130\n149132,149130\n149133,149134\n149135,149134\n149136,640\n149137,1033\n149138,3585\n149139,149140\n149142,59931\n149142,84257\n149143,5547\n149145,30\n149146,355\n149147,30\n149148,30\n149150,143287\n149152,13661\n149154,149155\n149156,30\n149157,149158\n149159,30\n149160,292\n149161,149162\n149163,298\n149164,485\n149165,292\n149166,292\n149167,1241\n149169,907\n149170,292\n149171,292\n149172,30\n149173,663\n149174,206\n149175,292\n149176,1345\n149177,994\n149178,1392\n149178,5662\n149179,1181\n149180,149181\n149182,149183\n149184,3623\n149185,143287\n149186,140\n149187,1836\n149189,149190\n149191,292\n149192,259\n149192,788\n149193,292\n149194,146\n149195,4355\n149196,72\n149197,1052\n149198,389\n149200,422\n149201,422\n149202,422\n149203,422\n149204,422\n149205,422\n149206,422\n149207,1122\n149208,422\n149209,422\n149210,422\n149211,422\n149212,422\n149213,140\n149214,30\n149215,30\n149216,30\n149217,30\n149218,422\n149219,30\n149220,30\n149221,1070\n149222,30\n149223,222\n149223,2944\n149224,283\n149225,2416\n149225,2417\n149226,1274\n149227,158\n149228,536\n149229,138686\n149230,175\n149231,872\n149232,298\n149233,97\n149233,440\n149235,202\n149236,481\n149237,2210\n149237,4237\n149238,233\n149240,2353\n149242,298\n149243,485\n149245,79\n149246,46\n149246,666\n149246,744\n149246,750\n149246,1124\n149246,1167\n149247,1326\n149248,7768\n149249,83\n149250,843\n149251,336\n149251,5726\n149252,389\n149253,149254\n149255,1467\n149256,2209\n149257,30\n149258,1293\n149259,750\n149259,762\n149259,854\n149259,1040\n149259,1616\n149259,2942\n149259,29015\n149259,72764\n149259,98279\n149259,124668\n149259,130442\n149259,149246\n149259,154325\n149259,155010\n149259,156287\n149259,174776\n149259,177293\n149259,179067\n149260,30\n149261,868\n149262,2173\n149263,1603\n149264,1220\n149264,1222\n149265,392\n149266,138\n149269,3623\n149270,779\n149270,21442\n149271,1012\n149271,7757\n149272,422\n149273,56\n149274,30\n149275,356\n149276,392\n149276,592\n149277,356\n149278,4355\n149279,1359\n149280,83\n149281,149282\n149283,3623\n149284,1179\n149285,1858\n149286,1860\n149287,626\n149289,356\n149290,302\n149290,2116\n149291,4611\n149292,1544\n149294,81070\n149295,4611\n149296,1544\n149297,4611\n149298,1544\n149299,215\n149299,417\n149299,805\n149299,1016\n149299,1282\n149299,1462\n149299,8537\n149300,657\n149301,872\n149302,97\n149302,422\n149302,2989\n149302,2991\n149303,30\n149305,142426\n149306,994\n149307,30610\n149307,149308\n149309,3623\n149310,442\n149311,994\n149313,202\n149314,424\n149315,891\n149316,22\n149318,586\n149319,44877\n149319,80266\n149319,87803\n149319,89035\n149319,123892\n149319,237840\n149319,262657\n149320,1231\n149321,3623\n149322,994\n149324,422\n149324,467\n149324,602\n149325,202\n149326,422\n149326,602\n149327,1089\n149328,447\n149329,2775\n149330,30\n149331,72\n149332,3623\n149333,72\n149334,160\n149335,149336\n149337,149336\n149338,202\n149339,393\n149340,907\n149341,72\n149342,994\n149343,392\n149343,1454\n149343,141912\n149344,5212\n149345,3623\n149346,310\n149346,3039\n149347,149348\n149349,602\n149350,1608\n149351,1132\n149352,2979\n149353,557\n149354,4039\n149356,356\n149357,273\n149357,313\n149358,682\n149358,72439\n149359,149360\n149362,2244\n149363,2045\n149364,149365\n149366,1623\n149366,4980\n149366,5213\n149367,525\n149368,278\n149369,8180\n149370,1309\n149371,720\n149372,1370\n149373,1844\n149373,2460\n149374,72\n149375,631\n149376,3585\n149377,294\n149378,918\n149379,192\n149380,1001\n149381,23783\n149382,22\n149383,372\n149384,6059\n149385,518\n149385,775\n149387,932\n149388,138686\n149389,175\n149390,149391\n149392,149391\n149393,298\n149395,994\n149396,72\n149397,192\n149398,518\n149400,30\n149401,994\n149402,147\n149403,30\n149404,3623\n149405,875\n149406,4146\n149407,86\n149408,422\n149409,56\n149410,1715\n149411,86\n149412,1893\n149413,605\n149414,1955\n149415,5662\n149416,301\n149417,1849\n149418,1231\n149419,5718\n149420,1564\n149421,2083\n149422,752\n149423,390\n149424,3422\n149425,388\n149426,3193\n149427,1782\n149428,1522\n149429,1241\n149430,2191\n149431,3194\n149432,907\n149433,1167\n149434,968\n149435,1544\n149436,3218\n149437,3207\n149438,3138\n149439,2557\n149440,1298\n149441,720\n149442,1010\n149443,240\n149444,1359\n149445,932\n149446,2979\n149447,1479\n149448,302\n149449,30\n149451,178\n149452,1001\n149454,149455\n149456,217\n149457,2224\n149458,8798\n149459,7572\n149461,1467\n149462,477\n149462,536\n149462,2646\n149462,18831\n149462,57354\n149463,536\n149463,852\n149463,2784\n149463,18831\n149464,217\n149465,72\n149466,30\n149468,142430\n149469,72\n149470,640\n149471,2224\n149472,640\n149473,147\n149473,149\n149473,158\n149474,149475\n149476,107\n149477,149478\n149477,169766\n149477,170985\n149477,177547\n149477,181505\n149477,242956\n149477,246623\n149479,149480\n149481,137\n149482,640\n149483,30\n149484,149485\n149486,149487\n149488,5547\n149490,149491\n149493,994\n149494,493\n149495,149496\n149497,248\n149498,217\n149499,149500\n149501,809\n149502,149503\n149504,149503\n149505,149506\n149507,149506\n149508,149506\n149509,149506\n149510,149506\n149511,149506\n149512,149506\n149513,149506\n149514,149506\n149515,149516\n149517,138686\n149518,175\n149519,1858\n149520,1860\n149521,298\n149522,1467\n149523,640\n149524,557\n149525,8719\n149526,138\n149527,865\n149528,557\n149529,137\n149530,118\n149530,4597\n149531,149532\n149533,88820\n149534,147\n149534,158\n149534,336\n149534,640\n149534,1458\n149534,3449\n149534,19413\n149534,60304\n149534,82819\n149534,98201\n149534,123399\n149534,149534\n149534,151061\n149534,167063\n149534,167670\n149534,168325\n149534,168326\n149534,192624\n149534,205211\n149534,213699\n149534,216446\n149534,217886\n149534,238920\n149534,242744\n149534,247455\n149534,257778\n149534,257844\n149535,1132\n149536,1608\n149537,4895\n149538,72\n149539,1608\n149540,1132\n149541,138686\n149542,175\n149543,422\n149544,422\n149545,422\n149546,422\n149547,422\n149548,298\n149549,422\n149550,149551\n149552,422\n149553,422\n149554,65\n149555,704\n149556,422\n149557,392\n149558,200\n149558,1177\n149559,149560\n149561,72\n149562,1749\n149563,332\n149564,72\n149566,1181\n149568,72\n149569,149570\n149571,149570\n149572,985\n149573,72\n149574,481\n149575,147\n149576,149577\n149578,149577\n149579,149577\n149580,271\n149581,147\n149582,872\n149583,1707\n149584,149585\n149586,149587\n149588,536\n149589,149587\n149590,149587\n149591,149587\n149592,149587\n149593,149587\n149595,149596\n149597,149598\n149599,264\n149600,149601\n149602,149601\n149603,149601\n149604,149601\n149605,149601\n149606,149601\n149607,149601\n149608,1381\n149609,149610\n149612,149613\n149614,422\n149615,56\n149616,1007\n149617,123350\n149617,149618\n149617,224656\n149617,257535\n149619,225\n149620,149621\n149622,149621\n149623,149621\n149624,149621\n149625,138686\n149626,175\n149627,298\n149628,149629\n149628,158366\n149630,8884\n149631,240\n149632,240\n149632,592\n149632,1818\n149633,149634\n149635,149636\n149637,149638\n149639,149638\n149640,149638\n149641,149638\n149642,1085\n149643,483\n149644,366\n149645,355\n149646,149647\n149648,344\n149649,233\n149650,30\n149651,30610\n149651,149652\n149651,227738\n149651,227739\n149651,227741\n149651,231571\n149651,242747\n149651,262580\n149653,149\n149654,149655\n149656,149657\n149658,481\n149659,422\n149660,56\n149662,1149\n149663,149664\n149665,652\n149666,1151\n149666,1253\n149666,1266\n149666,33424\n149667,149668\n149669,602\n149670,149671\n149672,779\n149673,149674\n149675,34\n149675,35\n149675,37\n149675,44\n149675,50\n149675,58\n149675,59\n149675,79\n149675,97\n149675,104\n149675,106\n149675,111\n149675,116\n149675,135\n149675,143\n149675,147\n149675,178\n149675,195\n149675,202\n149675,264\n149675,278\n149675,289\n149675,290\n149675,312\n149675,333\n149675,337\n149675,372\n149675,393\n149675,406\n149675,422\n149675,479\n149675,493\n149675,516\n149675,577\n149675,585\n149675,588\n149675,590\n149675,592\n149675,620\n149675,622\n149675,628\n149675,640\n149675,720\n149675,779\n149675,872\n149675,877\n149675,907\n149675,949\n149675,994\n149675,1007\n149675,1033\n149675,1078\n149675,1085\n149675,1132\n149675,1140\n149675,1151\n149675,1175\n149675,1210\n149675,1212\n149675,1247\n149675,1265\n149675,1266\n149675,1284\n149675,1370\n149675,1381\n149675,1453\n149675,1454\n149675,1509\n149675,1515\n149675,1522\n149675,1531\n149675,1634\n149675,1659\n149675,1732\n149675,1749\n149675,1776\n149675,1893\n149675,2051\n149675,2073\n149675,2087\n149675,2191\n149675,2371\n149675,2782\n149675,2931\n149675,3194\n149675,3422\n149675,3695\n149675,3794\n149675,3876\n149675,4079\n149675,4192\n149675,4193\n149675,5265\n149675,5310\n149675,5440\n149675,5708\n149675,8180\n149675,8270\n149675,8308\n149675,8598\n149675,8788\n149675,8811\n149675,8822\n149675,8907\n149675,9542\n149675,31237\n149675,44244\n149675,94134\n149675,103153\n149675,164572\n149677,83\n149679,1323\n149680,102\n149681,1326\n149682,408\n149684,72\n149685,72\n149686,932\n149688,6682\n149689,149690\n149691,56\n149692,422\n149693,72\n149694,1149\n149695,222\n149695,1881\n149695,18831\n149697,149698\n149699,5405\n149700,1805\n149701,481\n149702,918\n149703,44\n149704,149705\n149706,289\n149706,290\n149706,144988\n149707,5540\n149708,1370\n149708,1877\n149709,8270\n149710,149711\n149712,149\n149713,149714\n149715,149714\n149716,149714\n149717,149714\n149718,149714\n149719,1181\n149720,83\n149721,149\n149723,72\n149724,149\n149725,996\n149726,1181\n149727,485\n149728,298\n149729,149730\n149731,138686\n149732,175\n149733,247\n149734,298\n149735,72\n149736,652\n149737,1252\n149737,1253\n149738,1544\n149739,4611\n149740,1479\n149741,390\n149742,298\n149743,485\n149744,142405\n149744,148412\n149745,149745\n149746,611\n149747,117374\n149748,850\n149749,1707\n149750,149751\n149752,366\n149753,485\n149754,298\n149755,149\n149756,2312\n149757,2567\n149758,760\n149759,72\n149760,1252\n149761,72\n149762,1118\n149763,217\n149764,149765\n149766,149767\n149769,483\n149770,885\n149770,13704\n149771,149772\n149773,72\n149774,5547\n149775,30\n149777,22\n149778,30\n149779,795\n149780,422\n149781,56\n149782,142405\n149783,30\n149784,149785\n149786,30\n149787,30\n149788,640\n149789,366\n149791,107\n149792,2416\n149792,2417\n149793,292\n149794,338\n149795,355\n149796,111\n149797,298\n149798,233\n149799,1133\n149800,3538\n149805,195\n149805,406\n149805,779\n149806,83\n149811,83\n149814,918\n149815,134\n149815,240\n149815,372\n149815,390\n149815,431\n149815,590\n149815,818\n149815,1061\n149815,1081\n149815,1082\n149815,1085\n149815,1285\n149815,2512\n149815,2812\n149815,3879\n149815,5186\n149815,7805\n149815,9342\n149815,9739\n149815,14597\n149815,20560\n149815,24839\n149815,31796\n149815,37368\n149815,42839\n149815,43343\n149815,47173\n149815,59208\n149815,61896\n149815,62591\n149815,94134\n149815,114064\n149815,141635\n149815,144998\n149815,150741\n149815,152226\n149815,155547\n149815,159383\n149815,164857\n149815,164975\n149815,165387\n149815,169103\n149817,1858\n149818,1860\n149819,602\n149822,83\n149824,22\n149826,481\n149829,22\n149830,79\n149832,83\n149840,22\n149841,149842\n149843,22\n149844,636\n149845,30\n149846,907\n149846,1522\n149847,56\n149848,422\n149849,850\n149850,1858\n149851,1860\n149852,932\n149853,422\n149854,56\n149855,358\n149856,22\n149857,149858\n149859,30\n149860,149861\n149862,149\n149863,104\n149863,134\n149863,135\n149864,918\n149865,2506\n149866,872\n149867,872\n149868,30\n149869,136072\n149870,149871\n149873,149874\n149875,1247\n149876,149877\n149878,149879\n149880,149879\n149881,957\n149882,13661\n149883,149884\n149885,149\n149886,149887\n149888,240\n149889,149890\n149891,422\n149892,56\n149893,3653\n149894,167\n149895,149896\n149897,149896\n149898,149896\n149899,149896\n149900,149896\n149901,298\n149902,485\n149903,340\n149904,557\n149905,557\n149906,55849\n149907,483\n149908,1590\n149908,1644\n149911,422\n149912,422\n149913,422\n149914,422\n149915,422\n149916,422\n149917,422\n149918,422\n149919,422\n149920,298\n149921,485\n149922,2312\n149923,1102\n149924,149925\n149927,873\n149927,1274\n149927,4637\n149928,151\n149929,149930\n149931,1102\n149932,142405\n149933,142473\n149934,149935\n149936,1849\n149937,1849\n149938,149939\n149940,149941\n149942,30\n149943,301\n149943,717\n149943,1782\n149944,30\n149945,2048\n149946,83\n149947,493\n149947,3148\n149948,138686\n149949,481\n149950,175\n149951,298\n149952,149953\n149954,149955\n149956,2048\n149957,2868\n149957,7652\n149958,862\n149959,255\n149959,7363\n149960,1119\n149961,41\n149962,292\n149963,1087\n149964,2991\n149964,7358\n149964,7363\n149965,479\n149966,294\n149967,296\n149968,298\n149969,138686\n149970,175\n149971,149972\n149973,298\n149974,422\n149975,149976\n149977,149976\n149978,138686\n149979,175\n149980,298\n149983,149984\n149985,149984\n149986,149984\n149987,149984\n149988,149984\n149990,149991\n149992,602\n149993,233\n149994,355\n149995,143287\n149997,788\n149999,54\n149999,83\n149999,283\n149999,313\n149999,455\n149999,1201\n149999,19349\n149999,117231\n149999,168627\n150000,22\n150001,1877\n150001,40497\n150002,422\n150003,56\n150004,485\n150005,298\n150006,861\n150007,150008\n150009,1235\n150009,1335\n150010,301\n150010,615\n150010,968\n150010,1782\n150011,868\n150011,81233\n150012,3999\n150013,184\n150014,1326\n150015,240\n150015,872\n150016,338\n150016,390\n150016,626\n150016,657\n150016,1241\n150016,1289\n150016,5906\n150017,206\n150018,14136\n150018,150019\n150018,150025\n150018,150026\n150018,150029\n150018,150031\n150018,150032\n150018,150033\n150018,150034\n150018,150035\n150018,150036\n150018,150039\n150018,150089\n150018,150473\n150018,150474\n150018,150475\n150018,150476\n150018,151467\n150018,151468\n150018,151469\n150018,152187\n150018,154673\n150018,154674\n150018,154851\n150018,154852\n150018,156130\n150018,157042\n150018,158311\n150018,158312\n150018,158313\n150018,158314\n150018,158315\n150018,159816\n150018,159817\n150018,159818\n150018,160359\n150018,160360\n150018,162660\n150018,165393\n150018,167323\n150020,346\n150021,509\n150022,509\n150022,510\n150022,872\n150022,1025\n150022,16455\n150022,20591\n150022,23626\n150022,31080\n150022,41886\n150022,79577\n150022,107469\n150022,108754\n150022,122090\n150022,153129\n150022,153165\n150022,153776\n150022,154180\n150022,154183\n150022,156482\n150022,156972\n150023,1608\n150024,1132\n150028,255\n150030,1181\n150037,509\n150037,875\n150037,47993\n150037,150022\n150037,150037\n150037,150038\n150037,151424\n150037,151696\n150037,151990\n150037,154336\n150037,154361\n150037,154368\n150037,154379\n150037,154597\n150037,154826\n150037,154999\n150037,155712\n150037,156212\n150037,156281\n150037,156768\n150037,156902\n150037,157748\n150037,159015\n150038,106\n150040,1608\n150041,1132\n150042,1179\n150043,2353\n150044,485\n150045,298\n150046,195\n150047,142426\n150048,647\n150049,146\n150050,344\n150051,1818\n150052,252\n150053,22\n150054,2620\n150055,1001\n150056,481\n150057,483\n150059,44725\n150060,1608\n150061,1132\n150062,592\n150063,143287\n150065,1608\n150066,1132\n150068,83\n150069,515\n150070,652\n150071,44725\n150072,777\n150072,150084\n150073,1849\n150074,671\n150075,142426\n150076,301\n150076,1133\n150077,150078\n150081,1564\n150083,356\n150083,717\n150084,187\n150085,312\n150086,500\n150086,718\n150087,422\n150088,56\n150090,21442\n150091,1608\n150092,1132\n150093,687\n150093,893\n150093,1556\n150094,19010\n150095,1130\n150096,141912\n150097,219\n150098,346\n150099,2989\n150099,2991\n150100,1298\n150101,563\n150102,918\n150103,1127\n150104,356\n150106,422\n150107,2617\n150108,4193\n150108,5440\n150108,25348\n150109,111\n150110,346\n150111,30331\n150112,20\n150112,581\n150112,712\n150115,2979\n150116,1284\n150117,1033\n150118,150119\n150120,68069\n150121,1224\n150121,3999\n150122,1556\n150123,68069\n150124,217\n150124,536\n150126,37\n150127,1608\n150129,68069\n150130,408\n150131,102\n150132,1323\n150133,1326\n150134,2775\n150135,447\n150136,81\n150136,749\n150136,1417\n150136,3507\n150136,9015\n150137,83\n150138,192\n150139,138686\n150140,175\n150141,298\n150142,1133\n150144,515\n150145,1707\n150146,779\n150146,23991\n150146,145405\n150146,150171\n150147,3297\n150148,433\n150149,784\n150150,140\n150151,843\n150151,138686\n150152,30\n150154,306\n150154,307\n150155,455\n150156,1010\n150157,657\n150158,150159\n150160,809\n150161,1119\n150162,1801\n150164,392\n150166,2244\n150167,8213\n150168,2334\n150169,83\n150170,3138\n150174,788\n150175,195\n150176,127158\n150177,217\n150177,18831\n150178,1644\n150179,83\n150180,301\n150182,2995\n150183,907\n150184,58\n150185,994\n150187,150188\n150189,1132\n150189,1381\n150189,1452\n150190,2923\n150191,215\n150192,273\n150193,83\n150194,209\n150194,861\n150195,994\n150196,1639\n150197,602\n150198,907\n150199,3\n150200,142433\n150201,1231\n150202,631\n150202,1119\n150202,1888\n150202,84257\n150203,142405\n150204,772\n150205,251\n150206,137\n150206,994\n150206,1070\n150207,254\n150208,150209\n150211,240\n150213,2528\n150214,1368\n150215,1590\n150216,240\n150217,150218\n150217,172905\n150219,422\n150220,56\n150221,406\n150222,5310\n150223,941\n150224,302\n150225,483\n150226,30331\n150227,760\n150228,422\n150229,56\n150230,3474\n150231,1238\n150232,1452\n150233,422\n150234,56\n150235,557\n150237,302\n150237,861\n150238,3623\n150239,2867\n150239,2868\n150240,222\n150241,48\n150242,358\n150243,248\n150244,1\n150244,994\n150245,269\n150247,885\n150247,13704\n150248,30\n150249,278\n150250,3623\n150251,72\n150252,138686\n150253,175\n150254,2367\n150255,675\n150256,72\n150257,298\n150258,22\n150259,873\n150260,994\n150261,1544\n150262,994\n150263,3\n150264,298\n150265,485\n150266,150267\n150268,150269\n150270,3260\n150271,150272\n150273,1240\n150274,1466\n150275,150276\n150277,818\n150278,150279\n150280,150281\n150282,1805\n150283,2116\n150285,72\n150286,577\n150287,13\n150288,150289\n150290,387\n150291,83\n150291,299\n150291,181063\n150292,435\n150293,83\n150294,356\n150295,843\n150296,138686\n150297,175\n150298,424\n150299,298\n150300,1579\n150300,2626\n150301,422\n150301,707\n150302,3041\n150303,818\n150303,1140\n150303,2436\n150304,1127\n150305,479\n150306,298\n150307,485\n150308,1\n150309,2590\n150310,72\n150311,207\n150312,134\n150312,2105\n150315,302\n150316,872\n150317,668\n150318,1644\n150319,22\n150320,72\n150321,30\n150322,795\n150323,1429\n150324,850\n150325,72\n150326,175\n150327,392\n150328,1143\n150329,150330\n150331,150332\n150333,150334\n150335,150336\n150337,1801\n150338,366\n150339,150340\n150341,30331\n150341,259187\n150342,54\n150342,225\n150342,269\n150342,393\n150342,3297\n150343,312\n150345,150346\n150347,292\n150348,150349\n150350,467\n150351,202\n150352,150353\n150354,355\n150355,5662\n150356,306\n150356,307\n150356,406\n150357,18831\n150358,107\n150358,240\n150358,425\n150358,805\n150359,586\n150359,1531\n150359,42628\n150360,1132\n150361,781\n150362,298\n150363,485\n150364,138686\n150365,175\n150366,1556\n150367,298\n150368,273\n150368,313\n150369,781\n150370,1132\n150371,1608\n150373,4611\n150374,1544\n150375,298\n150376,485\n150377,298\n150378,485\n150379,1801\n150380,579\n150381,298\n150382,485\n150383,1590\n150384,48\n150385,1132\n150386,781\n150387,422\n150388,422\n150389,422\n150390,422\n150391,422\n150392,422\n150393,422\n150394,422\n150395,422\n150396,422\n150397,422\n150398,422\n150399,483\n150399,232766\n150400,302\n150402,422\n150403,577\n150404,136\n150406,406\n150406,620\n150407,907\n150408,143287\n150409,143287\n150410,907\n150411,2775\n150412,1635\n150413,150414\n150415,1146\n150416,22\n150417,192\n150417,256\n150418,8308\n150419,481\n150420,298\n150421,485\n150422,1241\n150423,972\n150424,298\n150425,485\n150426,264\n150426,1968\n150427,83\n150428,2867\n150428,2868\n150429,668\n150429,1607\n150431,233\n150432,3370\n150432,14453\n150433,3\n150435,422\n150436,56\n150437,150438\n150439,215\n150440,1243\n150441,579\n150441,809\n150442,1096\n150444,160\n150445,222\n150445,536\n150445,18831\n150445,49057\n150447,160\n150448,389\n150449,240\n150449,392\n150449,439\n150450,9015\n150451,145751\n150452,141912\n150453,215\n150454,19413\n150456,760\n150457,299\n150459,31977\n150460,2744\n150461,2073\n150462,338\n150463,7\n150464,81\n150464,215\n150464,254\n150464,503\n150464,1282\n150464,1368\n150464,1392\n150465,389\n150466,150467\n150468,872\n150470,536\n150472,366\n150477,818\n150478,1370\n150479,660\n150480,7124\n150481,666\n150482,298\n150483,485\n150484,485\n150485,298\n150486,247\n150487,602\n150488,720\n150490,1718\n150491,309\n150491,310\n150492,626\n150493,4060\n150494,1082\n150495,150496\n150497,160\n150497,1127\n150498,8149\n150499,150500\n150501,7087\n150501,55871\n150502,30\n150503,1085\n150504,2671\n150505,827\n150506,1014\n150506,1235\n150507,15\n150507,358\n150508,467\n150509,1858\n150511,1860\n150512,861\n150513,150514\n150515,422\n150516,56\n150517,2620\n150518,868\n150519,202\n150520,83\n150521,571\n150522,1818\n150523,2572\n150524,150525\n150526,406\n150528,1082\n150530,10\n150531,1368\n150532,3260\n150533,809\n150533,22293\n150534,186\n150535,138686\n150536,175\n150537,298\n150538,146\n150538,92476\n150540,1323\n150541,408\n150542,102\n150543,1326\n150544,50\n150545,6556\n150546,1293\n150547,6556\n150548,1181\n150549,3623\n150550,68069\n150551,483\n150552,932\n150553,3623\n150554,1381\n150555,146\n150556,83\n150557,309\n150557,310\n150558,2244\n150559,273\n150559,313\n150560,264\n150562,1252\n150562,1253\n150563,1571\n150564,2867\n150564,2868\n150565,893\n150565,1556\n150566,83\n150567,843\n150568,2209\n150569,138686\n150570,175\n150571,298\n150572,1836\n150573,72\n150574,240\n150575,79\n150576,72\n150577,135\n150577,885\n150577,13704\n150578,30\n150580,261\n150581,2867\n150581,2868\n150582,392\n150583,640\n150586,72\n150587,150588\n150589,30\n150590,150591\n150592,338\n150593,68\n150593,233\n150593,1722\n150593,1818\n150594,620\n150595,30\n150596,579\n150597,30\n150599,30\n150600,1001\n150601,885\n150601,13704\n150602,422\n150603,34\n150603,35\n150603,313\n150603,634\n150603,1718\n150603,2646\n150603,5326\n150604,467\n150605,30\n150606,138686\n150607,175\n150608,10\n150609,298\n150610,150611\n150612,150611\n150613,44\n150614,83\n150615,150616\n150617,202\n150618,4611\n150619,1544\n150620,150621\n150622,30\n150623,957\n150624,2979\n150627,206\n150627,309\n150627,310\n150628,272\n150629,435\n150630,422\n150631,843\n150632,516\n150632,1370\n150633,150634\n150635,150634\n150636,1556\n150637,150638\n150639,996\n150640,862\n150641,3041\n150642,150643\n150644,626\n150645,452\n150645,457\n150645,535\n150645,676\n150645,918\n150645,1655\n150646,1132\n150647,671\n150649,143287\n150650,31977\n150652,19356\n150653,355\n150654,1531\n150655,150267\n150656,150657\n150658,30\n150659,150660\n150661,150662\n150663,150664\n150665,1707\n150666,21442\n150667,150668\n150669,30\n150670,2266\n150671,150672\n150673,136\n150674,1238\n150675,596\n150675,1368\n150676,640\n150677,146\n150678,647\n150679,344\n150680,2319\n150681,142870\n150682,1452\n150683,1332\n150684,138686\n150685,175\n150686,422\n150687,422\n150688,422\n150689,422\n150690,422\n150691,298\n150692,422\n150693,422\n150694,483\n150695,422\n150696,422\n150697,422\n150698,422\n150699,422\n150701,455\n150702,150703\n150704,150703\n150705,150703\n150706,79\n150707,30\n150709,346\n150711,143287\n150712,919\n150713,516\n150714,252\n150715,1220\n150715,1222\n150716,150717\n150719,259\n150720,1220\n150720,1222\n150721,516\n150722,252\n150723,996\n150724,861\n150725,150726\n150727,481\n150728,30\n150729,150730\n150731,83\n150732,1293\n150733,1773\n150734,81233\n150735,5591\n150736,18831\n150737,473\n150738,83\n150739,68\n150741,261\n150741,269\n150741,346\n150741,372\n150741,818\n150741,81233\n150742,1556\n150743,2244\n150745,1707\n150746,192\n150746,1623\n150747,518\n150749,577\n150750,150751\n150752,30\n150755,1707\n150756,668\n150757,872\n150758,1858\n150759,1860\n150760,32\n150761,30\n150762,41\n150762,999\n150762,1177\n150763,515\n150764,818\n150765,1353\n150766,577\n150766,1058\n150767,22\n150768,1096\n150769,30\n150770,240\n150770,1955\n150771,290\n150771,2995\n150771,144988\n150772,1102\n150773,5\n150773,452\n150774,2048\n150776,5405\n150777,644\n150778,142208\n150779,142208\n150780,142208\n150781,142208\n150782,536\n150783,3003\n150783,4903\n150785,217\n150787,397\n150788,336\n150789,652\n150790,298\n150791,485\n150792,447\n150793,2775\n150795,21826\n150796,1\n150797,289\n150797,290\n150797,3003\n150797,94134\n150798,872\n150799,298\n150800,485\n150801,941\n150802,1181\n150803,298\n150804,485\n150805,41\n150805,225\n150805,1012\n150805,1177\n150805,7757\n150806,151\n150807,2312\n150808,3999\n150809,20\n150810,626\n150811,137\n150812,3623\n150813,219\n150814,202\n150815,626\n150816,1707\n150817,306\n150817,307\n150818,72\n150818,160\n150818,2744\n150819,305\n150820,408\n150821,1323\n150822,102\n150823,843\n150824,1326\n150825,150826\n150827,366\n150828,259\n150829,5405\n150830,4193\n150831,588\n150831,590\n150832,202\n150833,150834\n150835,1776\n150836,26041\n150837,1381\n150838,333\n150838,393\n150838,980\n150838,1388\n150838,1531\n150838,4455\n150838,15573\n150839,973\n150839,1284\n150839,1419\n150840,167\n150841,602\n150841,60576\n150842,392\n150844,150845\n150846,30\n150847,151\n150848,1381\n150849,346\n150850,1467\n150851,217\n150851,19443\n150852,72\n150853,34\n150853,35\n150853,1467\n150854,138686\n150855,175\n150857,298\n150858,222\n150858,536\n150858,2784\n150858,18831\n150859,2083\n150860,1001\n150861,1436\n150862,2775\n150863,30\n150864,72\n150866,1564\n150867,217\n150868,483\n150869,1133\n150870,5034\n150871,1119\n150872,34\n150872,35\n150873,406\n150874,81233\n150875,536\n150876,2045\n150877,422\n150878,150879\n150878,153513\n150880,1707\n150881,215\n150882,809\n150883,20771\n150884,150885\n150886,150885\n150887,631\n150888,309\n150888,310\n150889,577\n150890,919\n150891,805\n150892,1118\n150893,874\n150894,261\n150895,760\n150896,3135\n150897,2506\n150898,283\n150899,2506\n150900,2421\n150901,120\n150902,138686\n150903,175\n150904,298\n150905,81233\n150906,1370\n150908,30\n150909,147\n150911,72\n150912,818\n150913,65\n150913,868\n150914,150915\n150916,5906\n150917,557\n150918,626\n150919,278\n150920,137\n150921,862\n150922,2668\n150923,72\n150924,447\n150925,2775\n150926,10\n150927,298\n150928,485\n150929,996\n150930,81\n150931,1332\n150932,310\n150933,150934\n150935,346\n150936,885\n150936,13704\n150937,30\n150939,3623\n150940,150941\n150942,2506\n150943,76096\n150944,150945\n150946,150947\n150948,150949\n150950,150951\n150952,1462\n150952,8537\n150953,72\n150954,269\n150955,862\n150956,264\n150957,255\n150958,150959\n150960,240\n150961,1801\n150962,72\n150963,72\n150964,79\n150965,68\n150966,424\n150968,779\n150969,133326\n150970,366\n150972,72\n150973,30\n150974,211\n150974,314\n150974,440\n150974,466\n150974,467\n150974,536\n150974,868\n150974,872\n150974,1345\n150974,1623\n150974,1796\n150974,1797\n150974,2373\n150974,2907\n150974,16522\n150974,18326\n150974,48998\n150974,49337\n150974,155761\n150974,156379\n150974,161339\n150974,162599\n150974,183424\n150974,214199\n150974,238634\n150975,150976\n150977,2296\n150978,150979\n150980,640\n150981,150982\n150983,211\n150984,640\n150985,72\n150986,304\n150987,1151\n150988,957\n150988,1815\n150989,46\n150990,3069\n150991,1012\n150992,255\n150993,452\n150993,457\n150993,535\n150993,676\n150993,843\n150993,918\n150993,1655\n150994,605\n150995,406\n150996,355\n150997,1001\n150998,150999\n150998,201602\n151000,640\n151001,151002\n151003,2292\n151004,485\n151005,298\n151006,333\n151007,1001\n151009,1566\n151010,1132\n151011,1608\n151012,425\n151013,477\n151013,2750\n151014,422\n151015,422\n151016,422\n151017,422\n151018,422\n151019,422\n151020,422\n151021,422\n151022,2646\n151023,818\n151024,422\n151025,422\n151026,422\n151027,577\n151028,21442\n151029,10\n151029,2580\n151031,22\n151032,151033\n151034,493\n151035,333\n151036,151037\n151038,302\n151039,2224\n151040,996\n151041,292\n151042,1509\n151043,233\n151044,1247\n151046,312\n151047,1634\n151048,1052\n151048,1181\n151048,30428\n151049,217\n151050,481\n151051,1359\n151052,217\n151053,149\n151054,151055\n151054,264944\n151056,209\n151056,302\n151056,2116\n151057,1707\n151058,788\n151060,949\n151061,336\n151062,97\n151063,818\n151064,2292\n151065,467\n151066,1707\n151068,1231\n151069,83\n151070,30\n151071,588\n151071,590\n151071,592\n151071,805\n151071,1462\n151071,1635\n151071,2620\n151071,8537\n151072,3623\n151073,3\n151074,440\n151077,605\n151078,151079\n151080,631\n151080,84257\n151082,406\n151083,138686\n151084,175\n151085,298\n151088,602\n151089,151090\n151092,527\n151092,579\n151092,611\n151092,615\n151092,675\n151092,1113\n151092,1305\n151092,1572\n151092,1881\n151092,3258\n151092,142473\n151093,1434\n151094,151095\n151096,151095\n151097,346\n151098,605\n151099,298\n151100,485\n151101,273\n151102,227\n151102,2379\n151103,444\n151104,1715\n151106,30\n151107,328\n151108,390\n151109,1381\n151110,151111\n151112,4771\n151113,248\n151114,605\n151115,72\n151116,605\n151117,1858\n151118,1860\n151119,1\n151120,160\n151121,151122\n151124,30\n151125,1509\n151126,1849\n151127,151128\n151129,602\n151130,1454\n151133,54\n151134,1210\n151135,393\n151138,3623\n151139,134\n151139,1266\n151140,2931\n151141,433\n151142,54\n151143,1140\n151143,2443\n151144,142433\n151145,30\n151146,602\n151147,151148\n151149,1531\n151149,4545\n151149,56150\n151150,1612\n151151,298\n151152,485\n151153,779\n151153,68069\n151153,141912\n151154,2073\n151155,103860\n151156,784\n151157,283\n151158,22\n151159,596\n151159,19010\n151160,605\n151161,211\n151162,605\n151163,30\n151164,605\n151165,273\n151166,602\n151167,605\n151168,215\n151168,217\n151169,1019\n151170,84257\n151171,1888\n151172,605\n151173,605\n151174,151175\n151176,605\n151177,19\n151178,885\n151178,13704\n151179,2923\n151180,184\n151181,483\n151182,1143\n151183,1220\n151183,1222\n151184,346\n151185,1556\n151186,605\n151187,296\n151188,30\n151189,138686\n151190,175\n151191,605\n151193,577\n151194,298\n151195,30\n151196,30\n151197,392\n151198,3623\n151199,605\n151200,605\n151201,1247\n151202,605\n151203,818\n151204,605\n151205,292\n151206,605\n151207,30\n151208,605\n151209,605\n151210,605\n151211,79\n151212,605\n151213,605\n151214,435\n151215,605\n151216,1085\n151217,602\n151218,151219\n151220,34\n151220,35\n151221,949\n151222,557\n151223,843\n151224,809\n151225,2750\n151226,406\n151227,843\n151228,1132\n151229,781\n151230,358\n151231,269\n151231,640\n151232,247\n151233,346\n151234,605\n151235,557\n151236,862\n151237,298\n151238,485\n151239,605\n151240,22\n151241,605\n151242,3003\n151243,1326\n151244,298\n151245,485\n151246,278\n151247,949\n151248,2116\n151249,2443\n151250,171\n151251,1707\n151253,605\n151254,346\n151255,142426\n151256,151257\n151258,577\n151259,2506\n151262,202\n151263,30\n151264,346\n151265,151266\n151267,151266\n151268,151266\n151269,605\n151270,346\n151271,151272\n151273,151272\n151274,151272\n151275,151272\n151276,151272\n151277,151272\n151278,151272\n151279,151272\n151280,557\n151281,2411\n151282,233\n151283,151284\n151285,135\n151286,72\n151287,485\n151288,298\n151289,151290\n151291,151292\n151293,346\n151293,435\n151293,439\n151293,447\n151293,1033\n151293,1590\n151294,207\n151295,1\n151296,2506\n151297,1707\n151298,972\n151299,2590\n151301,872\n151302,1429\n151303,151304\n151305,151306\n151307,841\n151308,1849\n151309,389\n151310,668\n151311,178\n151312,704\n151313,151314\n151313,155588\n151315,1143\n151316,366\n151317,151318\n151319,736\n151320,151321\n151322,46\n151322,586\n151322,1531\n151323,3\n151324,309\n151324,310\n151325,255\n151326,2506\n151327,2506\n151328,355\n151329,151330\n151331,151330\n151332,151330\n151333,151330\n151334,698\n151334,1293\n151334,1782\n151335,900\n151336,647\n151337,146\n151338,151339\n151340,151339\n151341,151339\n151342,344\n151343,392\n151344,298\n151345,485\n151347,422\n151348,298\n151349,485\n151350,68\n151351,233\n151352,3085\n151353,479\n151354,602\n151355,344\n151356,151357\n151358,2421\n151358,13661\n151359,392\n151360,1749\n151361,32\n151361,644\n151361,2699\n151361,3003\n151361,76096\n151362,907\n151363,3507\n151364,1983\n151365,150022\n151366,151367\n151368,644\n151368,859\n151368,1151\n151368,2224\n151368,3507\n151369,1238\n151370,151371\n151372,9015\n151373,1072\n151374,422\n151375,422\n151376,422\n151377,422\n151378,422\n151379,422\n151380,422\n151381,422\n151382,422\n151383,422\n151384,422\n151385,422\n151386,1210\n151387,1143\n151388,160\n151389,302\n151391,452\n151391,457\n151391,535\n151391,676\n151391,843\n151391,918\n151391,1655\n151392,1300\n151393,875\n151394,1544\n151395,4611\n151396,2775\n151397,447\n151398,809\n151398,22293\n151398,186522\n151399,142473\n151400,111\n151400,290\n151400,309\n151400,310\n151400,94134\n151400,144988\n151401,579\n151401,1556\n151402,136\n151403,602\n151405,2146\n151406,1634\n151407,1452\n151410,151411\n151412,151411\n151413,151411\n151415,151411\n151416,151411\n151417,151411\n151418,1298\n151419,595\n151421,344\n151422,206\n151423,1119\n151423,84257\n151425,1175\n151426,1313\n151426,2224\n151427,83\n151428,1089\n151428,1623\n151429,467\n151431,151432\n151433,217\n151433,22580\n151434,298\n151435,485\n151436,30\n151437,602\n151438,65\n151438,467\n151439,972\n151439,1522\n151439,1544\n151440,1740\n151441,602\n151442,149\n151442,21442\n151443,592\n151444,83\n151446,718\n151447,138686\n151448,175\n151449,298\n151450,994\n151451,1400\n151451,1844\n151452,142870\n151453,142433\n151455,483\n151456,503\n151458,30\n151459,79\n151460,907\n151461,557\n151464,1452\n151464,1849\n151465,929\n151466,602\n151471,408\n151472,102\n151473,1326\n151474,1323\n151475,779\n151476,130\n151476,140\n151476,160\n151476,264\n151476,302\n151476,515\n151476,1052\n151476,1085\n151476,1132\n151476,1147\n151476,1381\n151476,1551\n151476,1659\n151476,1893\n151476,5440\n151477,4260\n151478,907\n151479,225\n151481,358\n151483,406\n151485,779\n151486,1707\n151487,4771\n151488,302\n151489,809\n151489,872\n151490,602\n151491,850\n151492,118\n151492,4597\n151493,3\n151494,142426\n151496,283\n151497,435\n151498,1522\n151499,8180\n151500,135\n151501,1860\n151502,595\n151503,3612\n151504,2274\n151505,392\n151506,4760\n151507,6059\n151508,5658\n151509,4252\n151510,623\n151511,697\n151512,6955\n151513,6837\n151514,1241\n151517,137\n151518,843\n151520,779\n151523,309\n151523,310\n151524,1983\n151525,192\n151526,151527\n151528,20771\n151530,209\n151531,278\n151531,852\n151532,3623\n151533,1983\n151534,422\n151535,151536\n151537,151538\n151539,1370\n151540,809\n151540,19010\n151541,3507\n151542,392\n151543,704\n151544,1332\n151545,872\n151546,55849\n151547,3507\n151548,147\n151549,151550\n151551,1983\n151552,1231\n151553,120\n151554,1849\n151556,10\n151557,483\n151558,809\n151559,23783\n151560,579\n151560,63471\n151561,151562\n151561,153594\n151563,151564\n151565,151566\n151567,151566\n151569,151570\n151571,138686\n151572,175\n151573,151574\n151575,298\n151576,862\n151576,907\n151576,1007\n151576,1010\n151577,557\n151578,8719\n151579,138\n151580,865\n151581,557\n151582,137\n151583,88820\n151584,118\n151584,4597\n151585,137\n151586,1359\n151589,115659\n151589,148600\n151590,2210\n151590,4237\n151593,2210\n151593,4237\n151595,1368\n151596,278\n151597,7360\n151598,142405\n151599,4903\n151601,151602\n151603,222\n151604,332\n151605,10\n151606,1181\n151607,72\n151608,344\n151609,285\n151610,20790\n151611,663\n151612,772\n151613,2367\n151614,481\n151615,151616\n151617,7652\n151618,151619\n151620,83\n151621,31977\n151623,278\n151624,772\n151625,525\n151626,1309\n151627,72\n151628,344\n151629,285\n151631,631\n151632,294\n151633,663\n151633,1253\n151633,25348\n151634,1149\n151635,843\n151637,151638\n151639,151640\n151642,151643\n151644,366\n151645,366\n151646,366\n151647,326\n151648,151649\n151650,151651\n151652,151653\n151655,225\n151656,151657\n151658,151\n151659,862\n151660,1\n151661,827\n151663,138686\n151664,175\n151665,298\n151666,217\n151666,1417\n151667,8884\n151668,251\n151668,1151\n151669,1085\n151670,151671\n151672,355\n151673,577\n151674,151675\n151677,140\n151677,5440\n151678,233\n151679,151680\n151681,151680\n151682,151680\n151683,151680\n151684,151680\n151686,2334\n151687,151688\n151689,151690\n151691,151692\n151693,151694\n151695,31977\n151696,150037\n151697,931\n151699,2989\n151699,2991\n151700,151701\n151703,151704\n151705,422\n151706,422\n151707,422\n151708,422\n151709,422\n151710,422\n151711,422\n151712,422\n151713,422\n151714,422\n151715,422\n151716,275\n151717,452\n151718,919\n151720,1860\n151721,1858\n151722,83\n151723,30\n151725,602\n151727,72\n151728,118\n151728,4597\n151729,44\n151730,151731\n151732,422\n151733,485\n151734,298\n151735,640\n151736,151737\n151736,183932\n151736,261390\n151738,147\n151739,344\n151740,72\n151741,285\n151742,151743\n151744,483\n151745,781\n151746,1132\n151747,4545\n151747,56150\n151748,151749\n151750,151749\n151751,1132\n151752,781\n151753,2266\n151754,346\n151755,158\n151756,151757\n151758,72\n151759,7416\n151760,707\n151760,891\n151760,115474\n151761,2443\n151762,818\n151763,151764\n151765,515\n151766,602\n151767,2210\n151767,4237\n151768,483\n151769,346\n151770,452\n151770,457\n151770,535\n151770,676\n151770,843\n151770,918\n151770,1655\n151772,1773\n151774,406\n151775,1707\n151777,1479\n151778,390\n151780,4611\n151781,151782\n151783,30\n151784,992\n151785,151786\n151787,151786\n151788,310\n151789,779\n151790,149534\n151791,151792\n151793,151794\n151795,151796\n151797,151798\n151799,151798\n151800,151798\n151801,366\n151802,366\n151803,366\n151804,147\n151805,366\n151806,346\n151808,1773\n151810,1133\n151810,31977\n151812,217\n151813,151814\n151815,107\n151816,2416\n151816,2417\n151817,292\n151818,338\n151819,355\n151821,298\n151822,1133\n151823,3538\n151824,65\n151824,292\n151824,390\n151824,430\n151824,1016\n151825,346\n151826,30\n151827,726\n151828,726\n151829,151830\n151831,151830\n151832,151830\n151834,30\n151835,233\n151836,252\n151837,151838\n151839,151838\n151840,336\n151841,500\n151842,366\n151843,1368\n151844,151845\n151846,207\n151847,151848\n151850,481\n151851,151852\n151853,1\n151853,106\n151853,333\n151853,602\n151853,841\n151853,1425\n151853,13221\n151853,148370\n151853,148479\n151854,151\n151856,151857\n151858,151859\n151862,151863\n151864,298\n151865,485\n151868,3538\n151869,1893\n151870,30\n151871,151872\n151873,72\n151874,408\n151875,1323\n151876,1326\n151877,102\n151878,16953\n151879,44\n151880,336\n151881,726\n151882,483\n151883,151884\n151885,602\n151886,151887\n151888,657\n151889,5213\n151890,252\n151891,2210\n151891,4237\n151891,182162\n151892,151893\n151895,640\n151897,7\n151898,151899\n151901,151902\n151904,1102\n151905,862\n151906,2797\n151907,102\n151908,1707\n151910,557\n151911,557\n151912,931\n151912,14458\n151913,151914\n151916,718\n151917,693\n151918,1608\n151919,151920\n151921,2210\n151921,4237\n151922,240\n151922,1181\n151922,4355\n151923,406\n151924,467\n151924,996\n151925,31977\n151926,30\n151927,151928\n151929,30\n151930,30\n151931,1663\n151932,142473\n151933,1284\n151934,151935\n151936,151935\n151937,151935\n151938,151935\n151939,1556\n151941,452\n151941,457\n151941,535\n151941,676\n151941,843\n151941,918\n151941,1655\n151942,1179\n151943,142433\n151944,447\n151945,2775\n151946,151947\n151948,151949\n151950,151949\n151952,2944\n151953,509\n151954,151955\n151956,151957\n151958,493\n151959,289\n151959,290\n151959,144988\n151960,144556\n151961,4611\n151962,217\n151962,1417\n151963,30\n151964,602\n151966,292\n151967,294\n151968,296\n151969,298\n151970,366\n151971,366\n151972,693\n151973,366\n151974,366\n151975,151976\n151977,850\n151978,72\n151979,302\n151980,151981\n151982,233\n151983,151984\n151985,355\n151986,406\n151986,620\n151986,1127\n151987,626\n151988,671\n151990,150037\n151992,628\n151992,718\n151993,147\n151994,184\n151998,577\n151999,1132\n152000,1608\n152001,115\n152001,118\n152002,1238\n152003,346\n152004,1452\n152005,640\n152008,1127\n152009,30\n152010,430\n152011,344\n152012,647\n152013,146\n152014,346\n152015,83\n152016,1608\n152017,1132\n152018,516\n152018,2312\n152019,283\n152020,152021\n152023,467\n152024,390\n152025,250\n152025,1684\n152026,467\n152028,450\n152029,298\n152030,485\n152031,1133\n152032,209\n152033,146\n152034,344\n152035,647\n152036,83\n152037,481\n152040,2105\n152042,615\n152043,152044\n152045,1707\n152046,422\n152047,422\n152048,1326\n152049,422\n152050,422\n152051,422\n152052,422\n152053,422\n152054,422\n152055,422\n152056,422\n152057,422\n152058,422\n152059,146\n152060,344\n152061,647\n152062,872\n152063,422\n152064,2750\n152065,647\n152066,146\n152067,344\n152068,255\n152069,3623\n152070,875\n152071,152072\n152074,994\n152075,58\n152076,46\n152077,30\n152078,5591\n152079,146\n152080,647\n152081,344\n152082,647\n152083,344\n152084,146\n152085,1102\n152086,178\n152087,3367\n152087,5540\n152088,138686\n152089,175\n152090,298\n152091,1282\n152091,2210\n152091,4237\n152091,182162\n152092,3804\n152093,146\n152094,647\n152095,344\n152096,1293\n152097,146\n152098,647\n152099,344\n152100,6424\n152101,3602\n152102,152103\n152104,1776\n152105,671\n152106,72\n152107,1462\n152107,1707\n152108,1551\n152109,178\n152110,72\n152110,137\n152110,447\n152110,557\n152110,611\n152110,652\n152110,704\n152111,72\n152112,1858\n152113,1860\n152114,2205\n152114,33424\n152115,1858\n152116,1860\n152117,10\n152119,2750\n152120,1983\n152121,32475\n152122,79\n152123,6682\n152123,72439\n152124,483\n152125,707\n152126,248\n152128,447\n152129,809\n152130,957\n152131,72\n152132,4545\n152132,56150\n152133,805\n152133,1011\n152133,1402\n152134,2775\n152135,447\n152136,68069\n152136,141912\n152137,302\n152138,134\n152138,2105\n152139,99\n152140,422\n152141,21442\n152142,1058\n152143,408\n152144,1323\n152145,1326\n152146,102\n152147,152148\n152149,152150\n152151,160\n152152,240\n152152,818\n152152,127158\n152153,873\n152154,2775\n152155,447\n152156,671\n152157,795\n152158,1012\n152159,875\n152160,3623\n152161,477\n152162,1882\n152163,152164\n152165,30331\n152166,5326\n152167,932\n152168,44\n152169,781\n152170,1132\n152171,309\n152171,310\n152172,1132\n152173,781\n152174,358\n152176,602\n152177,298\n152178,485\n152180,588\n152180,590\n152181,71\n152181,1619\n152183,32\n152185,1522\n152186,717\n152186,852\n152186,2372\n152188,269\n152189,138686\n152190,175\n152191,1414\n152192,34\n152192,953\n152193,2083\n152194,298\n152196,152197\n152198,134\n152198,137\n152200,647\n152201,146\n152202,344\n152203,577\n152204,13661\n152205,30\n152206,1\n152207,835\n152208,261\n152208,333\n152209,152210\n152211,932\n152212,868\n152212,156379\n152213,152214\n152215,30\n152216,907\n152217,302\n152217,861\n152218,861\n152219,4545\n152219,56150\n152219,139010\n152220,152221\n152222,30\n152223,7360\n152226,372\n152226,1001\n152227,346\n152228,152229\n152230,138686\n152231,175\n152232,298\n152233,697\n152234,994\n152235,957\n152236,255\n152237,602\n152238,602\n152239,392\n152240,34\n152240,35\n152241,269\n152242,885\n152242,13704\n152243,1983\n152244,152245\n152246,55233\n152247,483\n152248,2923\n152249,602\n152250,138686\n152251,175\n152252,298\n152253,485\n152254,298\n152255,3069\n152256,76096\n152257,1893\n152258,255\n152259,1572\n152260,483\n152260,31206\n152261,1707\n152262,72\n152263,483\n152264,30\n152265,138686\n152266,175\n152267,298\n152268,264\n152269,152270\n152271,557\n152273,310\n152274,344\n152275,285\n152276,72\n152277,72\n152278,30\n152279,358\n152280,772\n152281,30\n152282,30\n152283,30\n152284,72\n152285,240\n152286,72\n152287,152288\n152289,30\n152290,30\n152291,72\n152292,422\n152293,56\n152294,31977\n152295,2443\n152296,147\n152296,158\n152297,1238\n152298,783\n152298,1167\n152298,1436\n152298,1635\n152298,1849\n152298,2979\n152298,3392\n152298,7969\n152298,39047\n152298,55726\n152298,152298\n152298,162663\n152298,164983\n152298,165005\n152298,165111\n152298,165247\n152298,165253\n152298,167001\n152298,167021\n152298,167027\n152298,167750\n152298,167752\n152298,168477\n152298,170767\n152298,170802\n152298,171133\n152298,171145\n152298,171164\n152298,171203\n152298,171252\n152298,171663\n152298,172510\n152298,176478\n152298,179096\n152298,179122\n152298,182341\n152298,187431\n152298,188586\n152298,193112\n152298,194465\n152298,195152\n152298,214006\n152299,163\n152299,283\n152299,668\n152299,843\n152299,1607\n152301,160\n152302,30\n152303,2116\n152304,152305\n152306,152305\n152307,152308\n152309,1773\n152310,79\n152311,332\n152312,1556\n152313,152314\n152315,10\n152316,313\n152316,447\n152317,30\n152319,30\n152320,152321\n152322,577\n152323,72\n152324,152325\n152326,152325\n152327,171\n152328,152329\n152330,10\n152331,72\n152332,18831\n152333,255\n152334,344\n152335,72\n152336,285\n152337,1849\n152338,285\n152339,72\n152340,344\n152341,10\n152342,10\n152343,2590\n152344,152345\n152346,1007\n152347,152348\n152349,795\n152350,152351\n152352,207\n152353,872\n152354,1429\n152356,152357\n152359,972\n152360,491\n152361,152362\n152361,159613\n152363,152364\n152365,152366\n152367,152366\n152368,152366\n152369,668\n152370,1522\n152371,310\n152372,843\n152373,152374\n152375,152376\n152377,779\n152378,1143\n152379,1085\n152379,2590\n152380,8854\n152380,255750\n152381,264\n152381,1551\n152382,152383\n152384,452\n152384,457\n152384,535\n152384,676\n152384,843\n152384,918\n152384,1655\n152385,3209\n152386,1465\n152387,841\n152388,1556\n152389,8308\n152390,1849\n152392,485\n152393,298\n152394,366\n152395,366\n152396,366\n152397,366\n152398,366\n152399,366\n152400,366\n152401,483\n152402,355\n152403,305\n152404,30\n152406,37\n152407,2944\n152408,795\n152409,577\n152410,3297\n152411,602\n152412,30\n152414,141912\n152415,233\n152416,346\n152417,640\n152418,640\n152419,577\n152420,3507\n152421,422\n152422,422\n152423,422\n152424,422\n152425,422\n152426,422\n152427,422\n152428,422\n152429,422\n152430,422\n152431,422\n152432,422\n152433,72\n152435,1707\n152436,240\n152437,682\n152437,1243\n152437,72439\n152437,189839\n152438,2146\n152439,142426\n152440,48505\n152441,152442\n152443,79\n152443,1572\n152444,30\n152445,30\n152446,1172\n152448,577\n152448,1105\n152449,312\n152450,305\n152450,563\n152450,671\n152451,326\n152451,874\n152452,83\n152453,779\n152454,152455\n152456,392\n152457,843\n152458,107\n152459,994\n152461,94\n152461,2787\n152462,1715\n152463,832\n152464,1132\n152465,781\n152466,152467\n152468,301\n152468,444\n152468,1160\n152470,781\n152471,1132\n152472,152473\n152472,253614\n152474,3630\n152475,302\n152476,192\n152477,2775\n152478,447\n152479,22\n152480,298\n152481,485\n152482,835\n152483,447\n152486,72\n152487,285\n152488,344\n152489,1566\n152490,602\n152491,1132\n152492,1608\n152493,152494\n152495,1801\n152496,152497\n152498,1608\n152499,1132\n152500,3623\n152501,87\n152502,1707\n152502,189788\n152503,356\n152504,467\n152505,184\n152505,2244\n152506,1608\n152507,1132\n152508,577\n152509,1\n152509,149\n152509,152515\n152510,481\n152511,1319\n152513,424\n152514,272\n152516,1294\n152518,3623\n152519,152520\n152521,58\n152521,251\n152521,255\n152521,287\n152521,493\n152521,563\n152521,577\n152521,626\n152521,663\n152521,671\n152521,698\n152521,788\n152521,795\n152521,801\n152521,1012\n152521,1068\n152521,1070\n152521,1133\n152521,1309\n152521,1368\n152521,1429\n152521,1449\n152521,1474\n152521,2367\n152521,2436\n152521,5405\n152521,5961\n152521,6837\n152521,16331\n152522,720\n152523,137\n152524,781\n152525,493\n152525,1265\n152525,1266\n152527,72\n152528,1132\n152529,152530\n152531,137\n152531,1368\n152533,1262\n152534,206\n152535,115\n152535,118\n152535,307\n152536,255\n152537,143287\n152538,30\n152539,827\n152540,278\n152541,577\n152542,795\n152543,158\n152543,192\n152544,602\n152545,240\n152545,152546\n152545,246492\n152548,152549\n152550,158\n152551,240\n152554,1127\n152555,138686\n152556,175\n152557,1707\n152558,298\n152559,152560\n152559,248432\n152559,264294\n152561,932\n152562,1\n152563,1177\n152564,37\n152565,83\n152566,685\n152567,3602\n152569,1007\n152570,4504\n152571,1282\n152573,152574\n152575,152574\n152576,801\n152577,171\n152578,56\n152579,779\n152580,2512\n152581,289\n152581,290\n152581,94134\n152582,510\n152583,222\n152584,2116\n152585,30\n152586,784\n152587,1033\n152588,563\n152589,631\n152589,760\n152593,152594\n152595,113156\n152596,1033\n152597,801\n152597,852\n152597,3507\n152598,726\n152598,859\n152598,1531\n152599,1590\n152599,1644\n152600,44725\n152601,254\n152602,200\n152603,406\n152604,467\n152605,1119\n152606,1436\n152606,2979\n152607,30\n152608,152609\n152610,30\n152611,152612\n152613,152614\n152615,663\n152616,30\n152617,3804\n152618,30\n152619,1140\n152619,5547\n152620,390\n152620,2286\n152621,152622\n152624,30\n152625,366\n152626,206\n152627,366\n152628,366\n152629,255\n152630,313\n152631,390\n152632,48\n152633,312\n152634,1425\n152635,30\n152636,483\n152637,30\n152638,1252\n152638,1253\n152639,417\n152640,152641\n152642,435\n152643,346\n152644,104\n152644,557\n152644,953\n152644,954\n152644,1368\n152644,5405\n152645,931\n152646,152647\n152648,30\n152649,9457\n152650,1707\n152651,346\n152652,843\n152653,152654\n152655,72\n152656,285\n152657,344\n152658,152659\n152660,602\n152661,422\n152662,56\n152663,30\n152664,30\n152665,22\n152666,483\n152667,1983\n152668,30\n152669,5213\n152670,140\n152671,267\n152672,118\n152672,4597\n152673,30\n152674,430\n152674,994\n152674,3816\n152674,3817\n152675,30\n152676,30\n152677,152678\n152679,298\n152680,485\n152681,779\n152682,1707\n152683,152684\n152685,536\n152685,949\n152686,7092\n152688,1117\n152689,920\n152690,2371\n152691,3\n152692,152693\n152692,236468\n152694,1805\n152695,1631\n152696,30\n152697,195\n152698,152699\n152700,1707\n152701,152702\n152701,157381\n152701,229586\n152703,34\n152703,35\n152703,4223\n152704,346\n152705,152706\n152707,113156\n152708,602\n152709,138686\n152710,175\n152711,298\n152712,1240\n152713,9457\n152714,623\n152714,1805\n152715,34\n152715,35\n152716,10\n152717,18831\n152718,424\n152719,152720\n152721,152722\n152724,346\n152725,152726\n152727,1\n152728,152729\n152730,269\n152731,222\n152732,358\n152734,152735\n152736,1634\n152738,1458\n152739,772\n152740,1085\n152741,657\n152743,30\n152744,1556\n152745,2590\n152746,298\n152747,485\n152748,152749\n152750,294\n152751,1210\n152752,30\n152753,30\n152754,452\n152754,457\n152754,535\n152754,676\n152754,843\n152754,918\n152754,1655\n152755,298\n152756,485\n152757,152758\n152759,30\n152760,850\n152762,152763\n152764,152765\n152767,292\n152767,19519\n152768,355\n152769,3653\n152770,850\n152771,298\n152772,485\n152773,485\n152774,298\n152775,4771\n152776,483\n152776,1172\n152777,647\n152778,146\n152779,344\n152780,267\n152781,3370\n152781,14453\n152783,30\n152784,485\n152785,298\n152786,467\n152787,158\n152788,779\n152788,141912\n152789,4222\n152790,233\n152791,1238\n152792,424\n152793,424\n152794,1452\n152795,141912\n152796,640\n152797,640\n152798,141912\n152799,640\n152800,422\n152801,640\n152802,422\n152803,422\n152804,422\n152805,422\n152806,422\n152807,422\n152808,422\n152809,422\n152810,422\n152811,422\n152812,390\n152813,152814\n152815,152814\n152816,152814\n152817,422\n152819,81233\n152820,1424\n152821,1284\n152822,1707\n152823,920\n152824,907\n152825,444\n152826,5662\n152827,673\n152829,784\n152830,346\n152831,372\n152832,152833\n152834,493\n152835,626\n152836,141912\n152837,346\n152838,835\n152839,602\n152840,602\n152841,83\n152842,3\n152844,447\n152845,2775\n152846,138686\n152847,175\n152848,298\n152849,355\n152849,19010\n152849,21442\n152850,1072\n152851,58\n152852,994\n152853,46\n152854,358\n152855,287\n152855,467\n152855,868\n152855,6990\n152855,18110\n152855,18397\n152855,18941\n152855,34353\n152855,38437\n152855,45427\n152855,109936\n152855,119493\n152855,131808\n152855,137265\n152855,145646\n152855,155439\n152855,155490\n152855,155691\n152855,155702\n152855,156183\n152855,158078\n152855,158176\n152855,159049\n152855,160815\n152855,160878\n152855,165753\n152856,481\n152857,302\n152858,852\n152859,1085\n152860,3623\n152861,875\n152862,493\n152862,3148\n152863,850\n152864,406\n152864,779\n152865,1070\n152866,30\n152867,346\n152868,31977\n152869,657\n152870,4895\n152871,422\n152872,3623\n152873,1132\n152874,781\n152875,10\n152876,1\n152877,278\n152878,1181\n152879,178\n152880,4611\n152881,1544\n152882,152883\n152884,298\n152885,485\n152886,49057\n152887,147\n152889,439\n152890,298\n152891,485\n152892,527\n152893,207\n152893,299\n152895,2775\n152896,447\n152897,4611\n152898,1544\n152899,1127\n152900,219\n152901,3623\n152902,406\n152903,30\n152904,141912\n152905,299\n152905,1267\n152906,292\n152907,932\n152908,30\n152909,485\n152910,298\n152911,3623\n152912,3623\n152913,953\n152914,388\n152915,222\n152915,18831\n152916,178\n152917,1132\n152918,781\n152919,30\n152920,861\n152921,141912\n152922,843\n152924,424\n152925,30\n152926,483\n152927,2006\n152927,2620\n152929,1509\n152929,1551\n152930,44\n152931,3\n152932,5405\n152933,1326\n152934,2784\n152936,602\n152937,1001\n152938,801\n152939,2646\n152940,30\n152941,30\n152942,663\n152943,30\n152944,2146\n152945,752\n152945,968\n152946,141912\n152947,450\n152948,355\n152949,152950\n152951,152952\n152953,138686\n152954,175\n152955,298\n152956,366\n152957,366\n152958,1016\n152959,48505\n152961,1285\n152962,58\n152963,994\n152964,46\n152965,366\n152966,366\n152967,366\n152968,366\n152969,227\n152969,2379\n152970,72\n152971,602\n152972,255\n152973,493\n152974,941\n152974,2750\n152975,313\n152976,251\n152976,252\n152976,516\n152976,1220\n152976,1222\n152976,1370\n152977,147\n152979,1285\n152980,875\n152983,346\n152984,1985\n152985,152986\n152987,1252\n152987,1253\n152988,30\n152989,152989\n152990,152991\n152992,152991\n152993,30\n152994,147\n152994,158\n152995,152996\n152997,207\n152997,252\n152997,1243\n152998,55233\n152999,493\n153000,3138\n153001,23783\n153002,602\n153003,602\n153005,3623\n153006,1289\n153008,240\n153009,3623\n153010,657\n153011,657\n153012,167\n153012,968\n153012,2083\n153013,2334\n153014,1274\n153016,160\n153016,3003\n153017,17886\n153018,153019\n153020,72\n153021,153022\n153023,2797\n153024,153025\n153026,153025\n153027,153025\n153028,153025\n153029,153025\n153030,153025\n153031,153025\n153032,153025\n153033,153025\n153034,153025\n153035,153036\n153037,147191\n153038,1\n153039,5906\n153040,557\n153041,626\n153042,278\n153043,137\n153044,862\n153045,113156\n153046,30\n153047,450\n153048,72\n153049,346\n153050,153051\n153052,30\n153053,118\n153053,4597\n153054,1181\n153055,1181\n153056,406\n153057,153058\n153059,1707\n153060,255\n153061,4355\n153062,153063\n153064,30\n153065,2620\n153066,483\n153067,217\n153068,1368\n153069,1282\n153070,153071\n153072,1368\n153073,2506\n153074,153075\n153076,34\n153076,35\n153078,269\n153079,30\n153080,406\n153081,153082\n153083,30\n153084,142870\n153085,2572\n153086,153087\n153088,2620\n153089,247\n153090,153091\n153092,142870\n153093,588\n153093,590\n153093,1419\n153094,1\n153094,32\n153094,54\n153094,87\n153094,160\n153094,192\n153094,195\n153094,269\n153094,273\n153094,285\n153094,299\n153094,302\n153094,312\n153094,323\n153094,333\n153094,336\n153094,344\n153094,364\n153094,366\n153094,372\n153094,388\n153094,392\n153094,397\n153094,403\n153094,415\n153094,441\n153094,483\n153094,485\n153094,509\n153094,510\n153094,595\n153094,596\n153094,620\n153094,640\n153094,685\n153094,703\n153094,717\n153094,784\n153094,872\n153094,918\n153094,991\n153094,1010\n153094,1118\n153094,1143\n153094,1147\n153094,1151\n153094,1319\n153094,1515\n153094,1653\n153094,1677\n153094,1836\n153094,1888\n153094,1891\n153094,2116\n153094,2168\n153094,2201\n153094,2424\n153094,2436\n153094,2553\n153094,2605\n153094,3260\n153094,3830\n153094,4220\n153094,4571\n153094,16687\n153094,22293\n153094,27041\n153094,37088\n153094,118336\n153094,189303\n153094,258887\n153095,452\n153095,457\n153095,535\n153095,843\n153095,918\n153095,1655\n153097,153096\n153098,153096\n153099,153096\n153100,153096\n153101,153096\n153102,153096\n153103,153096\n153104,139010\n153105,877\n153106,349\n153107,153108\n153109,153108\n153110,153108\n153111,255\n153112,30\n153113,973\n153114,980\n153115,289\n153115,290\n153115,94134\n153117,355\n153119,579\n153120,5547\n153121,1298\n153122,392\n153123,97\n153124,30\n153125,30\n153126,602\n153127,1058\n153128,97\n153129,150022\n153130,1298\n153131,1858\n153132,1860\n153133,141912\n153134,264\n153135,145502\n153136,422\n153137,422\n153138,422\n153139,422\n153140,31977\n153141,1858\n153142,1860\n153143,422\n153144,422\n153145,422\n153146,422\n153147,422\n153148,422\n153149,422\n153150,422\n153151,422\n153152,422\n153153,1252\n153153,1253\n153154,640\n153155,640\n153156,422\n153157,640\n153158,640\n153159,640\n153160,1400\n153161,153162\n153163,957\n153163,1815\n153164,1368\n153166,153167\n153168,153167\n153169,685\n153170,233\n153171,118\n153171,4597\n153172,9015\n153173,141912\n153174,153175\n153178,420\n153178,509\n153178,510\n153178,1836\n153179,151\n153180,167\n153181,784\n153181,1118\n153182,459\n153183,1608\n153184,1132\n153185,424\n153186,907\n153187,875\n153188,1718\n153189,1836\n153190,2620\n153191,141912\n153192,141912\n153193,399\n153194,3623\n153195,949\n153196,63\n153197,346\n153198,1143\n153198,1454\n153200,147\n153200,158\n153201,160\n153203,192\n153203,1181\n153204,153205\n153206,809\n153207,83\n153208,3623\n153209,4\n153209,5\n153210,515\n153210,652\n153211,1014\n153211,1058\n153212,251\n153212,252\n153215,406\n153216,217\n153217,19010\n153218,2775\n153220,447\n153221,1419\n153222,2775\n153223,447\n153224,439\n153224,1033\n153225,861\n153225,893\n153226,163\n153226,447\n153226,8501\n153228,153229\n153231,907\n153232,1240\n153233,167\n153233,2083\n153235,3623\n153236,1181\n153237,346\n153238,178\n153239,56\n153240,422\n153241,422\n153242,56\n153244,138686\n153245,175\n153246,775\n153247,298\n153248,536\n153249,2424\n153250,2353\n153251,1070\n153252,2421\n153254,200\n153258,1467\n153259,3623\n153260,3138\n153261,287\n153262,663\n153263,852\n153265,1133\n153266,500\n153267,1962\n153268,1052\n153269,1882\n153270,2775\n153271,54\n153272,34\n153272,35\n153275,113156\n153276,192\n153277,1072\n153278,3623\n153279,30\n153280,6424\n153281,1858\n153282,1860\n153283,980\n153283,1070\n153285,153286\n153287,328\n153288,68069\n153289,153290\n153291,153290\n153292,153290\n153293,3623\n153294,2244\n153295,160\n153296,3623\n153297,3623\n153298,1\n153299,3623\n153301,138686\n153302,175\n153303,298\n153304,41\n153304,332\n153305,3623\n153306,240\n153306,372\n153306,1001\n153307,3623\n153308,843\n153309,483\n153310,2421\n153311,153312\n153313,349\n153314,1132\n153315,1608\n153316,389\n153317,3623\n153318,3630\n153320,424\n153321,2620\n153322,151\n153322,192\n153322,309\n153322,310\n153322,577\n153322,1167\n153323,406\n153323,585\n153323,779\n153323,1298\n153324,503\n153325,3623\n153326,4490\n153327,467\n153328,1262\n153329,145751\n153330,3507\n153331,726\n153332,217\n153332,536\n153333,483\n153334,145751\n153335,68069\n153336,2105\n153337,48\n153338,3623\n153339,153340\n153341,1571\n153342,2224\n153343,779\n153344,408\n153345,2923\n153346,153347\n153348,73570\n153349,3623\n153351,3623\n153352,6051\n153352,54272\n153353,485\n153354,298\n153355,30\n153356,1608\n153357,58\n153358,153359\n153360,200\n153361,2991\n153361,7358\n153361,7363\n153362,479\n153362,1462\n153363,3623\n153364,153365\n153366,3623\n153367,113156\n153368,34\n153368,35\n153368,83\n153369,153370\n153371,312\n153372,34\n153372,35\n153372,217\n153373,314\n153373,788\n153373,1531\n153374,18831\n153375,406\n153376,153377\n153378,805\n153379,251\n153379,920\n153380,435\n153381,13361\n153382,1531\n153383,153384\n153385,422\n153385,589\n153385,1425\n153386,30\n153387,1235\n153387,1335\n153388,843\n153389,875\n153390,153391\n153392,2574\n153393,1849\n153394,536\n153395,1419\n153396,588\n153396,590\n153397,83\n153398,217\n153399,2209\n153400,153401\n153402,455\n153402,1019\n153403,4903\n153404,83\n153405,298\n153406,485\n153407,479\n153407,1289\n153407,1381\n153407,1551\n153408,2867\n153408,2868\n153409,1227\n153409,86416\n153410,1515\n153411,1983\n153412,153413\n153414,153413\n153415,557\n153416,862\n153417,1707\n153418,72764\n153419,973\n153420,147\n153420,158\n153421,79\n153422,644\n153423,424\n153424,153425\n153426,1238\n153427,1381\n153428,2557\n153429,153430\n153431,106\n153432,143287\n153433,153434\n153435,153434\n153436,153434\n153437,153434\n153438,153434\n153439,153434\n153440,153434\n153441,153434\n153442,153434\n153443,153434\n153444,153434\n153445,153434\n153447,4594\n153448,269\n153450,153451\n153452,146952\n153453,435\n153454,56\n153455,422\n153456,779\n153457,149\n153458,272\n153458,333\n153458,1877\n153459,843\n153460,366\n153461,153462\n153463,366\n153464,366\n153465,366\n153466,366\n153467,366\n153468,1204\n153468,1462\n153469,2367\n153470,1181\n153471,153472\n153473,994\n153474,58\n153475,46\n153476,153477\n153478,153479\n153480,153479\n153481,153479\n153482,153483\n153484,4193\n153484,8270\n153485,406\n153486,1235\n153486,1335\n153487,23010\n153488,138686\n153489,175\n153490,298\n153491,1769\n153492,795\n153493,8270\n153494,30\n153495,30\n153496,138686\n153497,175\n153498,891\n153498,1881\n153499,298\n153501,153502\n153503,9121\n153504,153505\n153506,3960\n153507,45310\n153508,17334\n153509,9121\n153510,14366\n153511,153512\n153514,8270\n153515,83\n153515,217\n153516,8270\n153517,18831\n153519,8270\n153520,372\n153520,2991\n153521,2367\n153522,153523\n153524,153525\n153526,153525\n153527,178\n153528,153529\n153530,153529\n153531,255\n153532,783\n153533,30\n153534,1096\n153535,452\n153535,457\n153535,535\n153535,676\n153535,843\n153535,918\n153535,1655\n153536,30\n153538,298\n153539,485\n153540,355\n153541,153542\n153543,153544\n153545,153544\n153546,310\n153547,310\n153548,58\n153549,994\n153550,46\n153551,30\n153552,30331\n153553,58\n153554,994\n153555,46\n153556,153557\n153558,153559\n153560,843\n153561,298\n153562,485\n153563,788\n153564,485\n153565,298\n153566,104\n153567,4192\n153567,4193\n153568,4193\n153569,146\n153570,8270\n153571,2617\n153572,264\n153574,72\n153575,58\n153576,1400\n153578,328\n153579,640\n153580,153581\n153582,153583\n153584,153583\n153585,422\n153586,422\n153587,4453\n153588,422\n153589,422\n153590,422\n153591,422\n153592,422\n153593,422\n153595,422\n153596,422\n153597,422\n153598,259\n153599,422\n153600,1204\n153600,1707\n153602,233\n153603,153604\n153605,153606\n153607,2146\n153608,2671\n153609,8822\n153610,3999\n153611,146\n153612,647\n153613,344\n153614,30\n153615,8855\n153616,120\n153618,58\n153619,147\n153619,795\n153619,1417\n153619,1572\n153619,1616\n153620,779\n153622,1181\n153623,146\n153624,647\n153625,344\n153626,859\n153627,994\n153628,58\n153629,46\n153630,149\n153630,1776\n153631,2574\n153632,439\n153632,2411\n153633,481\n153635,72\n153636,202\n153637,1572\n153638,153639\n153640,153639\n153641,153639\n153642,8270\n153643,1238\n153644,153645\n153646,153645\n153647,392\n153648,312\n153648,1167\n153648,1240\n153648,1454\n153648,5591\n153649,1572\n153649,2073\n153649,19005\n153649,44370\n153650,146\n153651,1105\n153652,147\n153653,292\n153654,611\n153655,1659\n153656,138686\n153657,175\n153658,34\n153658,35\n153659,298\n153660,1332\n153660,5405\n153661,1133\n153662,222\n153663,372\n153663,2991\n153664,1133\n153665,153666\n153667,153666\n153669,1298\n153669,1707\n153671,379\n153672,153666\n153673,83\n153674,153675\n153676,779\n153677,153678\n153679,1133\n153680,2775\n153681,447\n153682,1452\n153683,1146\n153685,1133\n153686,2775\n153687,447\n153688,22\n153688,120\n153689,985\n153690,726\n153691,1133\n153692,1132\n153693,1608\n153694,1133\n153695,153696\n153697,153698\n153699,138686\n153700,175\n153701,298\n153702,1181\n153703,79\n153704,3246\n153705,1085\n153706,2775\n153707,447\n153708,298\n153709,485\n153710,685\n153711,1370\n153712,406\n153713,1370\n153714,5356\n153715,586\n153716,30\n153718,1326\n153718,31122\n153719,1133\n153720,932\n153720,1085\n153720,1462\n153720,1818\n153720,4355\n153720,8537\n153720,33424\n153721,10\n153722,2116\n153723,781\n153724,1132\n153725,433\n153726,1309\n153727,1623\n153728,1132\n153729,781\n153731,781\n153732,1132\n153733,861\n153734,872\n153734,1796\n153736,1509\n153737,875\n153738,1707\n153739,289\n153739,1133\n153739,94134\n153740,2244\n153742,289\n153742,290\n153742,94134\n153742,142433\n153743,1133\n153745,50321\n153747,30\n153748,2353\n153749,4545\n153749,56150\n153749,139010\n153750,1001\n153750,2105\n153751,153752\n153753,142870\n153754,305\n153754,4101\n153754,13538\n153754,142426\n153755,1133\n153756,261\n153757,781\n153758,1132\n153759,483\n153760,296\n153761,452\n153762,44\n153763,1181\n153764,1522\n153765,406\n153765,622\n153765,779\n153766,283\n153767,525\n153768,1326\n153769,1001\n153770,195\n153771,113156\n153772,146\n153773,143287\n153775,56\n153776,150022\n153777,158\n153777,1181\n153777,1462\n153777,8537\n153778,30\n153779,8270\n153780,23783\n153782,30\n153783,153784\n153783,160438\n153783,206113\n153783,217233\n153783,220073\n153783,223245\n153785,483\n153786,1235\n153786,1335\n153787,4545\n153787,139010\n153788,1241\n153790,153791\n153792,206\n153793,296\n153793,1659\n153794,184\n153795,153796\n153797,1001\n153798,202\n153799,392\n153800,525\n153801,72\n153802,298\n153803,485\n153804,8270\n153805,200\n153806,805\n153807,30\n153808,1133\n153809,503\n153810,973\n153811,107\n153812,447\n153813,893\n153815,153816\n153817,422\n153818,56\n153819,72\n153820,389\n153821,795\n153822,298\n153823,485\n153824,63\n153825,483\n153826,422\n153827,333\n153827,980\n153827,4545\n153827,15573\n153827,139010\n153828,1515\n153828,153829\n153830,5310\n153831,72\n153832,72\n153833,153834\n153835,298\n153836,485\n153838,45022\n153839,1212\n153840,809\n153841,704\n153842,153843\n153844,137\n153845,557\n153846,8719\n153847,138\n153848,865\n153849,557\n153850,137\n153851,118\n153851,4597\n153852,88820\n153853,852\n153854,385\n153855,6068\n153856,485\n153857,298\n153858,1163\n153859,1522\n153860,788\n153860,852\n153861,20359\n153862,704\n153863,704\n153864,1309\n153865,1285\n153866,115\n153866,118\n153867,1149\n153868,795\n153869,333\n153870,479\n153871,113156\n153872,631\n153873,107\n153873,3538\n153874,525\n153875,1\n153876,3623\n153877,356\n153877,852\n153878,153879\n153878,218651\n153880,294\n153881,137\n153881,200\n153881,2931\n153882,1266\n153884,675\n153885,255\n153886,392\n153887,107\n153887,4771\n153888,138686\n153889,175\n153890,298\n153891,142426\n153893,332\n153894,310\n153895,422\n153896,422\n153897,1722\n153898,422\n153899,422\n153900,422\n153901,422\n153902,422\n153903,422\n153904,422\n153905,422\n153906,1019\n153907,153908\n153909,15573\n153910,307\n153910,45960\n153911,615\n153913,30\n153914,153915\n153916,298\n153917,485\n153918,10\n153919,1285\n153920,72\n153921,153922\n153923,3069\n153924,255\n153925,72\n153926,56\n153927,422\n153928,72\n153929,310\n153930,406\n153930,50321\n153931,372\n153932,72\n153933,577\n153934,1132\n153935,333\n153935,4545\n153935,139010\n153936,2590\n153937,72\n153938,72\n153939,366\n153940,366\n153941,366\n153942,366\n153943,30\n153945,153946\n153947,153946\n153948,153946\n153949,153946\n153950,153946\n153951,113156\n153952,153953\n153954,313\n153955,153956\n153957,72\n153958,668\n153959,269\n153960,72\n153961,2617\n153962,2995\n153963,3297\n153964,931\n153965,255\n153966,862\n153966,2590\n153967,515\n153968,1113\n153969,153970\n153971,30\n153972,310\n153973,153974\n153975,225\n153976,30\n153977,153978\n153979,147\n153980,192\n153981,298\n153982,8884\n153983,233\n153984,355\n153985,1381\n153986,1085\n153987,452\n153987,457\n153987,535\n153987,676\n153987,843\n153987,918\n153988,931\n153988,1453\n153989,1479\n153989,1849\n153990,333\n153991,1001\n153992,485\n153993,298\n153994,485\n153995,298\n153996,1659\n153997,1381\n153998,132021\n153998,153999\n153998,157871\n153998,219570\n153998,228108\n153998,230635\n154000,154001\n154002,485\n154003,298\n154004,356\n154004,431\n154004,852\n154004,1010\n154004,2646\n154004,4222\n154006,30\n154007,141912\n154008,872\n154009,154010\n154011,34\n154011,35\n154012,1707\n154013,481\n154014,310\n154015,142870\n154016,1381\n154016,33424\n154017,340\n154018,795\n154020,83\n154021,154022\n154023,154023\n154024,154025\n154024,157198\n154024,173054\n154024,183678\n154026,1181\n154027,447\n154028,2775\n154029,447\n154030,2775\n154032,298\n154033,485\n154034,222\n154035,1085\n154036,1210\n154037,240\n154038,247\n154039,217\n154040,310\n154041,1085\n154043,8270\n154044,34\n154044,35\n154044,158\n154044,275\n154044,333\n154044,1572\n154044,2073\n154044,9010\n154044,17588\n154044,20359\n154044,135585\n154045,310\n154046,485\n154047,298\n154048,2697\n154050,1163\n154051,154052\n154053,154052\n154054,602\n154055,31977\n154056,240\n154057,30\n154059,154060\n154061,3409\n154062,483\n154063,56\n154064,422\n154065,154066\n154067,1551\n154068,195\n154069,154070\n154071,5976\n154072,1201\n154072,1235\n154073,6068\n154074,154075\n154076,171\n154077,154078\n154079,481\n154080,557\n154081,30\n154082,154083\n154084,2590\n154085,154086\n154087,154088\n154089,154090\n154091,5375\n154091,109503\n154092,10\n154092,588\n154092,590\n154092,1419\n154094,795\n154095,145502\n154096,1479\n154097,154098\n154099,390\n154100,154101\n154102,118\n154102,4597\n154103,219\n154104,30\n154106,273\n154107,1\n154108,1849\n154109,154110\n154111,485\n154112,298\n154113,827\n154114,142870\n154115,154116\n154117,154116\n154118,154116\n154119,154120\n154121,592\n154123,143287\n154124,154125\n154124,207589\n154124,230183\n154124,236986\n154126,154127\n154128,366\n154129,366\n154130,1\n154130,518\n154130,557\n154130,862\n154130,6051\n154131,154132\n154133,30\n154134,2617\n154135,233\n154136,452\n154136,457\n154136,535\n154136,676\n154136,843\n154136,918\n154136,1655\n154137,809\n154138,355\n154139,107\n154140,2416\n154140,2417\n154141,292\n154142,338\n154143,298\n154144,154145\n154144,213474\n154144,213983\n154144,228164\n154144,240936\n154144,241517\n154144,247682\n154146,1133\n154147,3538\n154148,154149\n154150,4192\n154150,4193\n154151,602\n154152,602\n154153,602\n154154,120\n154155,154156\n154157,30\n154158,154159\n154160,143\n154161,485\n154162,298\n154163,1\n154164,779\n154165,781\n154166,1132\n154167,346\n154168,149\n154168,505\n154168,16019\n154168,38976\n154168,118336\n154169,30\n154170,22\n154171,313\n154172,1773\n154173,154174\n154175,44\n154176,1181\n154177,1181\n154179,134\n154181,154182\n154183,510\n154183,872\n154185,1132\n154186,1608\n154189,483\n154190,154191\n154192,222\n154192,18831\n154194,154195\n154196,358\n154197,943\n154198,217\n154198,222\n154198,1417\n154198,19010\n154199,122732\n154200,557\n154201,557\n154202,154203\n154205,483\n154206,795\n154207,779\n154208,56\n154209,422\n154210,273\n154211,1132\n154212,1608\n154213,154214\n154215,154216\n154217,1132\n154218,1608\n154219,154220\n154221,1132\n154222,1608\n154223,13\n154224,1227\n154224,86416\n154225,483\n154225,707\n154226,154227\n154228,3623\n154229,184\n154230,1247\n154231,452\n154232,222\n154233,142473\n154234,3623\n154235,772\n154237,1105\n154238,154239\n154240,30\n154241,602\n154242,602\n154243,602\n154244,602\n154245,704\n154246,1572\n154247,154248\n154249,4545\n154249,139010\n154250,154251\n154250,157911\n154250,177317\n154250,198594\n154250,220472\n154250,231488\n154250,250083\n154250,252556\n154252,154253\n154254,875\n154255,7416\n154256,138686\n154257,175\n154258,298\n154259,206\n154260,1572\n154261,292\n154262,406\n154263,294\n154264,296\n154265,298\n154266,192\n154266,406\n154266,586\n154266,4193\n154267,452\n154267,457\n154267,535\n154267,676\n154267,843\n154267,918\n154267,1655\n154268,83\n154269,1807\n154270,154271\n154272,154273\n154274,154275\n154276,58\n154277,994\n154278,46\n154279,58\n154280,994\n154281,46\n154283,877\n154284,4545\n154284,139010\n154285,355\n154286,358\n154287,602\n154288,422\n154289,56\n154290,3623\n154291,4545\n154291,139010\n154292,55077\n154293,106\n154293,1370\n154293,6119\n154294,206\n154295,366\n154296,106\n154296,130\n154296,663\n154296,919\n154296,1179\n154296,1556\n154296,28107\n154297,358\n154297,932\n154297,941\n154298,366\n154299,154300\n154301,408\n154302,72\n154303,1181\n154304,485\n154305,298\n154306,640\n154307,640\n154308,640\n154309,30\n154310,1132\n154311,781\n154312,1238\n154313,485\n154314,298\n154315,30\n154316,309\n154316,310\n154316,483\n154317,154318\n154319,760\n154320,72\n154321,1452\n154322,2775\n154323,447\n154324,760\n154325,666\n154326,671\n154328,1068\n154329,934\n154330,455\n154330,2424\n154333,255\n154334,146\n154336,150037\n154337,602\n154338,1877\n154339,149\n154340,1370\n154341,3623\n154342,875\n154343,149\n154344,154345\n154346,146\n154347,344\n154348,647\n154349,83\n154350,143287\n154351,63\n154351,251\n154351,1220\n154351,1222\n154352,154353\n154354,726\n154355,1132\n154356,1608\n154357,285\n154358,72\n154359,344\n154360,2073\n154362,1241\n154363,538\n154364,195\n154365,344\n154365,360\n154366,83\n154367,1837\n154368,150037\n154369,138686\n154370,175\n154372,298\n154373,30\n154374,302\n154376,252\n154377,2073\n154378,779\n154379,150037\n154380,211\n154381,195\n154381,1370\n154382,907\n154382,2191\n154383,640\n154384,417\n154385,1010\n154386,827\n154387,30\n154389,875\n154391,19443\n154393,30\n154394,596\n154395,615\n154397,2253\n154397,5213\n154398,1749\n154399,581\n154400,34\n154400,35\n154401,154402\n154403,2744\n154404,217\n154407,4260\n154407,142433\n154407,143287\n154407,154408\n154409,1052\n154409,1102\n154410,41\n154412,323\n154412,1052\n154412,1102\n154413,538\n154414,17588\n154415,818\n154416,56\n154417,422\n154418,1608\n154419,1132\n154420,3623\n154421,1287\n154422,1052\n154422,1102\n154424,19443\n154425,1363\n154426,83\n154427,154428\n154429,154428\n154430,154428\n154431,760\n154432,872\n154433,332\n154434,1927\n154435,30\n154437,113156\n154438,1151\n154439,602\n154440,1052\n154440,1102\n154441,385\n154441,3252\n154443,154444\n154445,138686\n154446,175\n154447,298\n154448,154449\n154450,261\n154451,2244\n154452,392\n154453,65\n154454,1052\n154454,1102\n154455,485\n154456,298\n154457,104\n154458,72\n154459,1151\n154460,2923\n154461,15\n154462,154463\n154462,181567\n154464,356\n154464,852\n154465,1052\n154465,1102\n154466,195\n154467,435\n154468,1052\n154468,1102\n154470,30\n154471,1467\n154472,1052\n154472,1102\n154473,861\n154474,30\n154475,622\n154476,83\n154477,154478\n154479,147\n154479,158\n154479,336\n154480,147\n154480,149\n154480,158\n154480,21442\n154481,272\n154482,779\n154483,843\n154485,147\n154486,192\n154487,49057\n154488,525\n154489,1151\n154490,1298\n154491,22\n154492,255\n154493,406\n154493,1181\n154494,406\n154495,18831\n154496,272\n154497,2557\n154498,2506\n154499,872\n154500,872\n154501,515\n154502,740\n154502,741\n154502,743\n154503,154504\n154505,154504\n154506,154504\n154507,154504\n154508,1659\n154508,2512\n154509,861\n154510,406\n154510,779\n154510,1181\n154511,483\n154512,1052\n154512,1102\n154513,1773\n154514,154515\n154516,154515\n154517,72\n154518,663\n154520,2210\n154520,4237\n154522,154523\n154524,30\n154525,206\n154526,1052\n154526,1102\n154527,694\n154527,2646\n154528,30\n154529,30\n154530,83\n154532,872\n154533,30\n154534,422\n154535,56\n154536,79\n154537,298\n154538,485\n154539,422\n154540,56\n154541,602\n154542,485\n154543,298\n154544,171\n154545,55233\n154546,602\n154547,149\n154548,273\n154549,30\n154550,8855\n154551,1467\n154552,299\n154553,30\n154554,30\n154555,154556\n154557,2434\n154558,247\n154559,273\n154560,184\n154561,873\n154562,22\n154563,1247\n154564,154565\n154566,269\n154567,41\n154568,22\n154569,149\n154570,1603\n154574,30\n154575,2782\n154576,575\n154576,697\n154577,146\n154578,647\n154579,344\n154580,1181\n154581,2506\n154582,154583\n154584,3507\n154585,72\n154586,602\n154587,485\n154588,298\n154589,3623\n154590,154591\n154592,3623\n154593,30\n154594,439\n154595,3623\n154596,389\n154597,150037\n154598,30\n154599,1370\n154599,1877\n154600,72\n154601,142405\n154602,1821\n154603,3623\n154604,1284\n154605,154606\n154607,949\n154608,1052\n154608,1102\n154609,34\n154609,35\n154610,63\n154611,312\n154611,358\n154611,595\n154612,1467\n154613,455\n154614,2424\n154615,30\n154616,1871\n154617,1052\n154617,1102\n154618,2421\n154619,83\n154620,13980\n154621,30\n154622,2590\n154623,1033\n154624,452\n154624,457\n154624,535\n154624,676\n154624,843\n154624,918\n154624,1655\n154625,843\n154626,72\n154627,536\n154628,83\n154628,120\n154628,217\n154628,278\n154628,493\n154628,536\n154628,949\n154628,1274\n154628,1467\n154628,1608\n154629,154630\n154631,355\n154632,358\n154633,83\n154634,138686\n154635,175\n154636,31977\n154637,298\n154638,366\n154639,366\n154640,467\n154641,366\n154642,1224\n154643,1133\n154644,233\n154645,435\n154647,289\n154647,290\n154647,94134\n154648,818\n154649,911\n154650,72\n154651,113156\n154652,3\n154653,72\n154654,22293\n154656,72\n154658,255\n154659,30\n154660,640\n154661,640\n154662,422\n154663,56\n154664,640\n154665,422\n154666,56\n154667,31977\n154668,154669\n154670,1893\n154672,30\n154675,56\n154676,422\n154677,1227\n154677,86416\n154678,392\n154679,1188\n154680,717\n154681,30\n154682,510\n154682,150022\n154683,1072\n154684,72\n154685,1556\n154687,536\n154688,2944\n154688,4223\n154689,83\n154690,25\n154690,1255\n154690,2088\n154690,50943\n154691,509\n154692,652\n154694,1072\n154695,920\n154696,30\n154697,154698\n154699,30\n154700,1132\n154701,781\n154702,875\n154703,602\n154704,154705\n154706,154707\n154708,72\n154709,2989\n154709,2991\n154710,95152\n154711,760\n154712,158\n154712,206\n154712,640\n154713,31977\n154714,72\n154715,781\n154716,1132\n154717,31977\n154718,83\n154719,278\n154720,217\n154721,149\n154722,72\n154723,344\n154724,285\n154725,72\n154727,63\n154728,1359\n154729,1\n154730,22293\n154731,72\n154732,1\n154733,21442\n154734,2782\n154734,40782\n154735,109503\n154736,79\n154736,388\n154737,27041\n154738,99\n154738,852\n154739,58\n154740,994\n154741,46\n154742,72\n154743,433\n154744,868\n154745,602\n154745,779\n154746,22\n154746,861\n154747,500\n154748,109503\n154749,483\n154751,596\n154752,154753\n154754,30\n154755,2334\n154756,852\n154757,720\n154758,23783\n154759,392\n154760,299\n154761,138686\n154762,175\n154763,298\n154764,1151\n154766,31977\n154767,509\n154767,1010\n154768,1177\n154769,1204\n154770,779\n154771,142433\n154772,356\n154772,852\n154773,1634\n154774,3623\n154775,154776\n154777,626\n154778,171\n154779,83\n154780,1740\n154781,2480\n154782,313\n154783,175\n154784,142426\n154786,30\n154786,99807\n154787,31977\n154788,22\n154789,934\n154790,1359\n154791,5310\n154792,2421\n154793,1309\n154794,3328\n154795,134\n154795,225\n154795,278\n154795,289\n154795,290\n154795,364\n154795,431\n154795,510\n154795,94134\n154796,932\n154797,312\n154798,72\n154799,3129\n154800,304\n154801,333\n154801,1298\n154802,3135\n154803,392\n154804,1955\n154805,44\n154806,392\n154807,55849\n154808,1068\n154809,215\n154810,138686\n154811,175\n154812,298\n154813,483\n154814,4146\n154815,77\n154815,5440\n154816,372\n154817,48\n154818,4545\n154818,139010\n154821,83\n154822,2671\n154823,1043\n154824,272\n154824,811\n154824,1556\n154825,72\n154826,150037\n154827,406\n154828,154829\n154830,752\n154831,718\n154832,120\n154833,154408\n154834,217\n154835,455\n154836,222\n154837,5343\n154838,19443\n154839,406\n154839,779\n154840,298\n154841,485\n154842,143287\n154843,5440\n154844,611\n154845,143287\n154846,10\n154847,154848\n154849,178\n154853,171\n154854,273\n154855,163\n154855,467\n154856,720\n154856,745\n154856,862\n154856,2411\n154856,4571\n154856,6789\n154857,3260\n154858,968\n154859,86\n154859,301\n154859,615\n154859,907\n154859,973\n154859,1001\n154859,1241\n154859,1284\n154859,1522\n154859,1782\n154859,1955\n154859,2083\n154859,2557\n154859,2979\n154860,171\n154861,3623\n154863,1544\n154864,10\n154864,113156\n154865,356\n154866,615\n154867,885\n154867,13704\n154868,192\n154869,972\n154870,941\n154871,744\n154872,783\n154873,154874\n154876,1871\n154877,779\n154878,1\n154879,779\n154880,1522\n154881,296\n154882,406\n154883,843\n154883,1293\n154884,602\n154885,56\n154886,422\n154888,779\n154889,577\n154890,852\n154893,2371\n154894,114600\n154895,1133\n154896,356\n154896,852\n154897,30\n154898,640\n154899,393\n154900,843\n154901,406\n154902,1105\n154903,144962\n154904,240\n154905,818\n154906,143287\n154907,1\n154908,22\n154909,50\n154909,158\n154909,406\n154909,622\n154910,298\n154911,485\n154912,72\n154913,72\n154914,113156\n154915,292\n154916,154917\n154918,640\n154919,154920\n154921,171\n154922,2506\n154923,1151\n154924,1639\n154926,779\n154927,510\n154927,919\n154927,1860\n154928,154929\n154928,160111\n154930,154931\n154932,779\n154933,422\n154934,56\n154935,305\n154936,175\n154937,147\n154938,424\n154939,18790\n154940,590\n154941,640\n154942,30\n154943,72\n154944,72\n154945,154946\n154947,850\n154948,154949\n154950,30\n154951,366\n154952,366\n154953,1888\n154954,154955\n154956,920\n154957,640\n154959,640\n154960,72\n154961,393\n154962,640\n154963,30\n154964,640\n154965,323\n154966,424\n154967,1001\n154968,154969\n154970,862\n154971,640\n154972,192\n154972,620\n154973,452\n154973,457\n154973,535\n154973,676\n154973,843\n154973,918\n154973,1655\n154974,355\n154975,640\n154976,911\n154977,154978\n154979,233\n154980,602\n154981,298\n154982,485\n154983,154984\n154985,467\n154986,21442\n154987,1118\n154988,154989\n154991,1893\n154991,2617\n154992,424\n154993,1179\n154993,1293\n154993,1821\n154993,19010\n154993,21736\n154993,22293\n154994,1238\n154995,30\n154996,788\n154997,1860\n154998,1858\n154999,150037\n155000,1452\n155001,818\n155002,640\n155004,200\n155005,155006\n155007,422\n155008,56\n155010,666\n155011,252\n155012,175\n155013,155014\n155015,155014\n155016,500\n155017,366\n155018,30\n155021,240\n155021,442\n155021,805\n155022,30\n155023,22\n155024,9457\n155025,118336\n155026,663\n155026,1089\n155028,1220\n155028,1222\n155028,189788\n155031,1359\n155032,15179\n155033,141912\n155034,6119\n155035,6119\n155036,7\n155037,736\n155038,994\n155039,58\n155040,46\n155041,14989\n155042,485\n155043,298\n155044,485\n155045,298\n155046,178\n155046,211\n155046,1891\n155047,893\n155048,175\n155048,422\n155049,1608\n155050,1132\n155051,1882\n155052,422\n155053,422\n155054,1235\n155054,1335\n155054,2088\n155054,154690\n155055,872\n155056,1\n155057,1425\n155058,422\n155058,805\n155059,510\n155060,83\n155061,1241\n155062,1243\n155063,240\n155065,29380\n155066,30\n155067,184\n155068,344\n155069,1210\n155070,298\n155071,485\n155072,240\n155073,1119\n155074,809\n155075,1105\n155076,155077\n155078,4453\n155081,206\n155082,63\n155083,485\n155084,298\n155085,23783\n155086,83\n155086,760\n155087,76096\n155088,2923\n155089,298\n155090,485\n155091,788\n155093,622\n155093,1531\n155094,1085\n155094,1117\n155094,1849\n155094,124668\n155094,171641\n155095,22\n155096,788\n155097,142433\n155098,1267\n155099,142433\n155100,433\n155101,873\n155102,467\n155103,171\n155104,4223\n155106,671\n155107,433\n155108,388\n155109,485\n155110,298\n155111,1132\n155112,269\n155112,861\n155113,1773\n155114,298\n155115,485\n155117,298\n155118,200\n155119,485\n155120,298\n155121,240\n155121,417\n155121,592\n155121,1085\n155121,1309\n155121,1580\n155121,2205\n155121,3623\n155121,33424\n155122,1353\n155123,83\n155124,872\n155125,302\n155126,171\n155127,32\n155127,141912\n155128,155129\n155130,155129\n155131,155129\n155132,155129\n155133,1181\n155134,4223\n155135,726\n155136,379\n155137,30\n155138,932\n155139,483\n155140,843\n155141,809\n155142,392\n155143,273\n155144,392\n155145,1284\n155146,248\n155147,1007\n155149,1052\n155149,1201\n155150,861\n155151,44\n155152,34\n155152,35\n155153,30\n155154,155155\n155156,2048\n155157,195\n155158,911\n155158,1803\n155159,1188\n155160,227\n155160,433\n155160,1635\n155160,2421\n155160,2750\n155160,8855\n155161,30\n155162,18831\n155163,1359\n155164,259\n155165,611\n155166,920\n155167,30\n155168,389\n155169,2775\n155170,447\n155172,779\n155173,79\n155174,30\n155175,30\n155176,497\n155177,155178\n155179,155178\n155180,184\n155182,302\n155183,41\n155183,1608\n155184,557\n155185,264\n155185,736\n155185,1289\n155186,1400\n155187,483\n155188,126\n155188,972\n155189,1860\n155190,1858\n155191,1127\n155192,142405\n155193,298\n155194,485\n155195,195\n155196,22\n155197,83\n155197,536\n155197,660\n155197,4637\n155197,7092\n155198,2334\n155199,885\n155199,13704\n155200,4355\n155201,1844\n155202,30\n155203,22\n155204,862\n155205,142433\n155206,3623\n155207,273\n155208,158\n155209,1078\n155210,22\n155211,536\n155211,2944\n155211,18831\n155212,852\n155213,1188\n155214,294\n155215,285\n155216,3069\n155217,255\n155218,1305\n155219,2590\n155220,155221\n155222,17309\n155223,149\n155224,1612\n155225,240\n155226,1368\n155227,3801\n155227,70166\n155229,949\n155229,1417\n155230,30\n155231,155232\n155233,155232\n155234,155232\n155235,155232\n155236,155232\n155237,155232\n155238,155232\n155239,8844\n155240,1210\n155240,236180\n155241,5906\n155242,557\n155243,626\n155244,278\n155245,137\n155246,56\n155247,422\n155248,862\n155249,920\n155250,151\n155251,422\n155252,56\n155253,485\n155254,298\n155255,158\n155255,1181\n155256,422\n155257,56\n155258,647\n155259,344\n155260,146\n155261,30\n155262,668\n155262,1559\n155263,306\n155263,307\n155264,7572\n155265,932\n155266,158\n155267,636\n155268,30\n155269,389\n155270,155271\n155272,77\n155273,56\n155274,422\n155275,30\n155276,292\n155277,30\n155278,30\n155278,248\n155279,155280\n155281,264\n155282,1381\n155283,1860\n155284,1858\n155285,30\n155286,280\n155286,17245\n155287,30\n155288,15\n155289,30\n155290,138686\n155291,175\n155292,298\n155293,1007\n155294,1235\n155294,1335\n155295,779\n155296,138686\n155297,175\n155298,298\n155299,155300\n155301,72\n155302,155303\n155304,215\n155305,4545\n155305,139010\n155306,536\n155306,254009\n155307,155308\n155309,577\n155310,138686\n155311,175\n155312,298\n155313,115659\n155313,148600\n155313,155481\n155314,4545\n155314,56150\n155314,139010\n155316,366\n155317,366\n155318,155319\n155320,1782\n155321,5662\n155322,37\n155323,1231\n155324,2750\n155325,68\n155326,1181\n155327,155328\n155329,255\n155330,392\n155331,292\n155331,972\n155332,304\n155334,852\n155335,72\n155336,261\n155337,346\n155338,30\n155339,63\n155340,452\n155340,457\n155340,535\n155340,676\n155340,843\n155340,918\n155340,1655\n155341,30\n155342,142426\n155343,1181\n155344,332\n155345,424\n155346,355\n155347,9029\n155348,233\n155350,704\n155351,4545\n155351,139010\n155352,4545\n155352,139010\n155353,788\n155354,79\n155355,142430\n155355,142879\n155357,509\n155357,1043\n155358,298\n155359,485\n155360,704\n155362,640\n155363,758\n155363,1385\n155364,1773\n155366,9457\n155367,248\n155368,72\n155370,155371\n155372,1474\n155373,781\n155374,1132\n155375,422\n155376,56\n155377,647\n155378,146\n155379,344\n155380,195\n155381,536\n155382,781\n155383,1132\n155384,328\n155385,1181\n155387,422\n155388,56\n155389,1453\n155390,1241\n155391,138686\n155392,175\n155393,605\n155394,298\n155395,1011\n155396,1805\n155398,726\n155399,1608\n155400,152855\n155402,2266\n155405,809\n155405,19010\n155408,30\n155409,483\n155410,83\n155411,736\n155412,13136\n155413,22\n155414,726\n155415,19010\n155416,2775\n155417,447\n155418,146\n155418,92476\n155419,714\n155420,626\n155421,385\n155422,15523\n155424,783\n155424,2372\n155426,1782\n155427,640\n155428,485\n155429,18831\n155430,30\n155432,137\n155433,247\n155433,2867\n155433,2868\n155434,346\n155436,143287\n155438,2989\n155438,2991\n155439,152855\n155440,22\n155442,58\n155443,994\n155444,46\n155446,155447\n155448,390\n155449,1282\n155450,673\n155452,3069\n155453,1293\n155453,2979\n155454,18831\n155455,483\n155456,1132\n155457,1608\n155458,81233\n155458,162580\n155458,162583\n155458,162585\n155459,467\n155460,138\n155460,2105\n155462,932\n155464,1\n155465,83\n155466,602\n155468,1127\n155469,467\n155469,73718\n155469,156379\n155469,162580\n155469,162688\n155469,162700\n155470,77\n155472,86\n155472,167\n155472,301\n155472,843\n155472,907\n155472,1231\n155472,1284\n155472,1436\n155472,2557\n155472,2979\n155473,298\n155474,248\n155475,602\n155476,30\n155477,588\n155477,590\n155477,8180\n155478,30\n155479,852\n155482,68\n155483,287\n155484,30\n155485,138686\n155486,175\n155487,44\n155489,298\n155491,30\n155492,1105\n155494,30\n155495,1425\n155496,30\n155498,30\n155499,42064\n155500,195\n155501,30\n155502,1181\n155503,893\n155504,22\n155505,422\n155506,56\n155507,818\n155508,861\n155510,577\n155511,155512\n155513,149\n155513,192\n155513,779\n155514,195\n155515,415\n155516,30\n155517,184\n155518,192\n155519,4771\n155520,120\n155521,290\n155521,714\n155521,33424\n155521,94134\n155523,155524\n155525,1556\n155526,2620\n155527,2048\n155528,687\n155529,602\n155531,72\n155533,146\n155534,344\n155535,647\n155536,1983\n155538,72\n155539,206\n155541,72\n155543,1769\n155544,850\n155545,155546\n155547,372\n155548,8854\n155548,255750\n155549,435\n155550,127158\n155551,2923\n155552,1962\n155553,557\n155554,862\n155555,563\n155556,149018\n155557,2006\n155558,843\n155559,83\n155560,155561\n155562,72\n155563,83\n155564,2590\n155566,1181\n155567,154408\n155569,222\n155570,298\n155571,4594\n155572,435\n155573,289\n155573,290\n155573,94134\n155574,843\n155575,72\n155576,1001\n155576,1465\n155577,1359\n155578,30\n155579,596\n155580,640\n155581,640\n155582,563\n155583,602\n155584,30\n155585,366\n155586,155587\n155586,218614\n155586,240300\n155586,262669\n155586,264170\n155586,264702\n155589,2784\n155590,192\n155591,195\n155593,30\n155594,30\n155595,8854\n155595,255750\n155596,1509\n155597,30\n155598,23132\n155599,184\n155601,577\n155602,142405\n155603,30\n155604,1572\n155605,1085\n155606,155607\n155608,479\n155609,1415\n155610,155611\n155613,255\n155614,30\n155615,248\n155616,34\n155616,35\n155617,452\n155617,457\n155617,535\n155617,676\n155617,843\n155617,918\n155617,1655\n155618,355\n155620,233\n155621,5034\n155622,818\n155623,1240\n155624,3804\n155625,34\n155625,35\n155626,440\n155627,30\n155628,1707\n155629,171\n155630,485\n155631,298\n155633,298\n155634,485\n155635,171\n155636,195\n155637,155638\n155637,155986\n155637,158622\n155637,183097\n155637,189299\n155637,204968\n155637,262793\n155639,442\n155640,875\n155641,3623\n155642,155643\n155644,485\n155645,485\n155646,843\n155647,1238\n155648,483\n155649,2867\n155649,2868\n155650,30\n155651,344\n155653,2671\n155654,3507\n155655,1241\n155656,158\n155657,3623\n155658,1133\n155659,622\n155659,1590\n155660,2146\n155661,1452\n155662,21442\n155663,1238\n155664,72\n155665,306\n155665,307\n155665,4571\n155666,248\n155668,420\n155669,493\n155669,1181\n155670,2775\n155671,447\n155672,312\n155673,417\n155674,1564\n155675,1132\n155676,781\n155677,192\n155678,1370\n155679,55849\n155681,55849\n155682,86\n155683,63\n155683,251\n155684,56\n155685,422\n155686,4355\n155687,30\n155688,83\n155689,877\n155690,31073\n155691,868\n155691,152855\n155692,63\n155692,390\n155692,1370\n155692,3218\n155694,171\n155695,34\n155695,35\n155697,1284\n155698,1068\n155699,485\n155700,147\n155701,1707\n155703,22\n155704,298\n155707,4672\n155708,388\n155708,567\n155708,1284\n155708,1326\n155709,393\n155710,1544\n155713,155714\n155715,30\n155715,63\n155715,516\n155715,1231\n155715,1381\n155715,118336\n155716,155717\n155718,1181\n155719,685\n155720,155721\n155722,141912\n155723,2073\n155725,697\n155726,634\n155727,146\n155728,647\n155729,344\n155730,344\n155731,155732\n155733,509\n155734,127158\n155735,1\n155735,433\n155735,1877\n155736,479\n155736,841\n155736,30331\n155737,155738\n155739,636\n155740,104\n155740,694\n155740,795\n155740,3623\n155741,203\n155742,138686\n155743,1\n155743,1019\n155743,30331\n155744,175\n155745,298\n155746,1127\n155746,49057\n155747,155748\n155749,155748\n155750,5405\n155752,3069\n155753,83\n155754,4223\n155755,3260\n155756,95554\n155757,1019\n155758,3623\n155759,146\n155760,273\n155760,305\n155760,330\n155760,420\n155760,485\n155760,663\n155761,467\n155762,1425\n155763,1353\n155764,3297\n155764,27654\n155765,113156\n155766,233\n155767,467\n155768,435\n155769,932\n155770,72\n155771,49057\n155772,2048\n155773,843\n155774,2048\n155775,44\n155776,30\n155777,1274\n155778,83\n155779,30\n155780,392\n155781,1381\n155782,1127\n155784,72\n155785,2557\n155786,292\n155787,30\n155788,83\n155789,149\n155789,240\n155789,301\n155789,336\n155789,392\n155789,406\n155789,536\n155789,808\n155789,818\n155789,823\n155789,1001\n155789,1370\n155789,1453\n155789,6935\n155789,18996\n155789,19663\n155789,37147\n155789,42112\n155789,67363\n155789,71678\n155789,127158\n155789,138139\n155789,144231\n155789,147828\n155789,151063\n155789,159832\n155789,170734\n155789,181439\n155790,72\n155791,158\n155791,390\n155791,406\n155791,575\n155791,592\n155791,596\n155791,760\n155791,784\n155791,1010\n155791,1143\n155791,1241\n155791,1590\n155791,2191\n155791,2266\n155791,2699\n155791,2779\n155791,6059\n155791,13980\n155792,3623\n155793,525\n155794,875\n155795,155796\n155797,3623\n155798,1309\n155799,422\n155800,56\n155801,155802\n155803,1285\n155804,5405\n155805,1556\n155807,631\n155808,294\n155809,202\n155810,3507\n155811,30\n155812,155813\n155814,72\n155815,515\n155816,30\n155817,30\n155818,1010\n155818,1849\n155819,118\n155819,422\n155819,4597\n155819,5405\n155820,72\n155821,30\n155822,55849\n155823,3193\n155824,155825\n155826,1509\n155827,1284\n155828,155829\n155830,30\n155831,30\n155832,30\n155833,30\n155834,30\n155835,30\n155836,875\n155837,30\n155838,424\n155839,155840\n155841,30\n155842,852\n155843,155844\n155845,809\n155846,885\n155846,13704\n155847,30\n155848,30\n155849,1749\n155850,155851\n155852,1359\n155853,1359\n155854,113156\n155855,155856\n155857,30\n155858,155859\n155858,169822\n155860,1572\n155861,875\n155862,155863\n155864,155865\n155866,557\n155867,8719\n155868,138\n155869,865\n155870,137\n155871,557\n155872,118\n155872,4597\n155873,88820\n155874,155875\n155876,72\n155877,30\n155878,118\n155878,4597\n155879,72\n155880,332\n155881,72\n155882,2671\n155883,72\n155884,72\n155885,50\n155885,79\n155886,1707\n155888,1359\n155889,485\n155890,298\n155891,22\n155892,155893\n155894,155895\n155896,155897\n155898,138686\n155900,175\n155901,298\n155902,255\n155903,155904\n155906,5405\n155907,269\n155908,72\n155909,30\n155910,366\n155911,3623\n155912,155913\n155914,23783\n155916,155917\n155918,155919\n155921,155922\n155924,225\n155925,155926\n155927,146\n155927,92476\n155928,44725\n155929,861\n155930,155931\n155932,1782\n155933,155934\n155935,155936\n155937,30\n155938,862\n155939,155940\n155941,155942\n155943,155944\n155945,233\n155947,155948\n155949,155950\n155951,355\n155952,155953\n155954,1368\n155955,483\n155956,452\n155956,457\n155956,535\n155956,676\n155956,843\n155956,918\n155956,1655\n155957,155958\n155959,8884\n155960,155961\n155962,1220\n155962,1222\n155963,516\n155964,252\n155965,155966\n155967,222\n155968,726\n155969,726\n155970,726\n155971,326\n155972,1085\n155973,202\n155974,563\n155975,422\n155976,647\n155977,1014\n155978,358\n155979,83\n155980,72\n155981,155982\n155983,155984\n155985,3507\n155987,187\n155988,1181\n155989,155990\n155991,155992\n155993,138686\n155994,175\n155995,298\n155996,932\n155997,3538\n155999,41\n156000,156001\n156002,292\n156002,7698\n156003,156004\n156005,72\n156006,422\n156007,56\n156008,2168\n156009,72\n156011,422\n156012,56\n156013,292\n156014,72\n156015,1247\n156016,439\n156017,156018\n156019,156020\n156021,192\n156022,298\n156023,72\n156024,156025\n156026,156027\n156028,48\n156029,72\n156031,422\n156032,422\n156033,422\n156034,422\n156035,602\n156036,422\n156037,422\n156038,422\n156039,422\n156040,422\n156041,422\n156042,422\n156043,1240\n156044,422\n156045,1143\n156045,1151\n156045,2697\n156046,358\n156047,875\n156048,30\n156049,156050\n156051,1118\n156052,1479\n156053,390\n156054,1227\n156054,86416\n156055,346\n156056,8270\n156057,2626\n156058,1087\n156059,1414\n156060,158\n156061,818\n156062,346\n156063,72\n156064,1509\n156066,156067\n156068,30\n156069,156070\n156071,156072\n156071,205406\n156073,156074\n156075,130106\n156076,156077\n156078,452\n156078,457\n156078,535\n156078,676\n156078,843\n156078,918\n156078,1655\n156079,156080\n156081,30\n156082,233\n156083,30\n156084,156085\n156086,355\n156087,312\n156088,296\n156089,156090\n156091,954\n156091,10318\n156092,640\n156093,184\n156094,422\n156095,56\n156096,1559\n156098,704\n156099,779\n156100,58\n156101,46\n156102,994\n156103,309\n156103,310\n156104,156105\n156106,3804\n156107,41\n156108,156109\n156110,2209\n156111,30\n156112,907\n156113,285\n156113,330\n156113,1247\n156113,1425\n156114,31977\n156115,932\n156116,636\n156117,283\n156119,2334\n156120,850\n156121,156122\n156123,156122\n156124,156122\n156125,156122\n156126,156122\n156128,718\n156129,392\n156131,72\n156133,875\n156134,875\n156135,147\n156136,483\n156137,171\n156138,1204\n156139,422\n156140,56\n156141,301\n156142,1284\n156143,2296\n156143,101935\n156144,30\n156145,406\n156145,1515\n156146,156147\n156148,156149\n156150,310\n156152,1849\n156154,602\n156155,4355\n156156,557\n156157,557\n156158,957\n156159,156159\n156160,156161\n156160,158024\n156160,174711\n156160,193302\n156160,239460\n156162,304\n156163,30\n156164,2205\n156164,33424\n156165,577\n156165,127158\n156166,1227\n156166,86416\n156167,88820\n156168,447\n156169,2775\n156170,485\n156171,298\n156172,142870\n156173,175\n156174,206\n156175,743\n156176,156177\n156178,142473\n156179,2784\n156180,72\n156181,366\n156182,366\n156183,152855\n156184,30\n156185,3804\n156186,113156\n156188,156189\n156190,640\n156191,138686\n156192,175\n156193,298\n156194,346\n156195,2411\n156196,1458\n156197,1849\n156198,292\n156199,294\n156200,296\n156201,298\n156202,1807\n156203,160\n156204,160\n156205,160\n156206,30\n156207,147\n156208,671\n156209,184\n156210,156211\n156212,150037\n156213,30\n156214,30\n156215,452\n156215,457\n156215,535\n156215,676\n156215,843\n156215,918\n156215,1655\n156216,298\n156217,485\n156218,156219\n156220,175\n156221,233\n156222,7155\n156223,355\n156224,663\n156225,118336\n156227,156228\n156229,58\n156230,994\n156231,46\n156232,83\n156233,811\n156234,298\n156235,485\n156236,1238\n156238,358\n156239,298\n156240,485\n156241,1452\n156242,30\n156243,941\n156244,298\n156245,485\n156247,30\n156248,22\n156249,640\n156250,1773\n156251,872\n156252,589\n156253,2775\n156254,447\n156255,485\n156256,298\n156258,663\n156259,346\n156261,5101\n156262,310\n156263,1118\n156263,22293\n156264,467\n156264,162599\n156265,2105\n156266,192\n156267,22\n156268,156269\n156270,2775\n156271,671\n156272,422\n156273,602\n156274,1608\n156275,1132\n156276,1425\n156277,1659\n156278,1858\n156279,1860\n156280,149\n156281,150037\n156282,156283\n156284,3623\n156285,875\n156286,557\n156288,41\n156289,83\n156290,255\n156291,222\n156292,338\n156292,360\n156292,835\n156292,1381\n156292,1968\n156292,4039\n156293,72764\n156294,636\n156294,850\n156295,6424\n156296,222\n156297,1983\n156298,1177\n156299,397\n156300,868\n156301,142433\n156302,2353\n156303,1240\n156304,356\n156305,602\n156306,2312\n156307,304\n156308,1359\n156311,156312\n156314,30\n156315,1368\n156316,1608\n156317,1132\n156318,996\n156319,1368\n156321,41\n156322,3623\n156323,22\n156324,872\n156325,631\n156326,861\n156327,138686\n156328,175\n156329,1474\n156329,1789\n156330,298\n156331,1858\n156332,1860\n156333,3138\n156334,685\n156334,2315\n156335,516\n156336,1220\n156336,1222\n156337,252\n156340,972\n156341,1127\n156341,1893\n156341,49057\n156342,1220\n156342,1222\n156343,516\n156344,252\n156345,1240\n156346,115659\n156347,1608\n156348,1132\n156350,483\n156351,1608\n156352,261\n156352,694\n156352,32751\n156353,30\n156354,1425\n156355,30\n156357,298\n156358,485\n156359,171\n156360,1323\n156361,408\n156362,102\n156363,1326\n156364,805\n156365,156366\n156367,485\n156368,298\n156370,640\n156371,1247\n156372,59021\n156372,60576\n156373,3623\n156374,707\n156375,81070\n156376,44\n156377,30\n156378,30\n156379,37\n156379,68\n156379,467\n156379,868\n156379,929\n156379,1326\n156379,1345\n156379,1566\n156379,1849\n156379,3585\n156379,5654\n156379,5717\n156379,5944\n156379,8406\n156379,8408\n156379,8411\n156379,14311\n156379,14651\n156379,17431\n156379,18213\n156379,18218\n156379,18224\n156379,18256\n156379,18399\n156379,18834\n156379,20550\n156379,21540\n156379,32820\n156379,40025\n156379,44222\n156379,96733\n156379,131808\n156379,136655\n156379,137752\n156379,138030\n156379,148274\n156379,155469\n156379,156379\n156379,160877\n156379,160888\n156379,161170\n156379,161194\n156379,161284\n156379,161510\n156379,161877\n156379,162599\n156379,162666\n156379,162680\n156379,162682\n156379,162881\n156379,163466\n156379,164100\n156379,165667\n156379,165718\n156379,167043\n156379,169470\n156379,171764\n156379,173146\n156379,174382\n156379,174448\n156379,174824\n156379,175391\n156379,177241\n156379,180347\n156379,182603\n156379,186085\n156379,188824\n156379,188843\n156379,190090\n156379,194969\n156379,195752\n156379,197858\n156379,213254\n156379,219846\n156379,221278\n156379,224489\n156379,229215\n156379,229872\n156379,230998\n156379,232718\n156379,234044\n156379,237616\n156379,237624\n156379,237632\n156379,244207\n156379,247361\n156379,249652\n156379,249675\n156379,252743\n156379,256909\n156379,256959\n156379,262557\n156379,263109\n156379,263820\n156380,874\n156381,72\n156382,1858\n156383,1860\n156384,142426\n156384,145751\n156384,147123\n156385,280\n156385,17245\n156386,4545\n156386,139010\n156387,932\n156388,30\n156389,298\n156390,485\n156391,827\n156392,192\n156392,406\n156393,467\n156394,2048\n156395,103860\n156396,2048\n156397,138686\n156398,175\n156399,1368\n156400,1707\n156401,298\n156402,1983\n156403,1068\n156404,146\n156404,779\n156404,1515\n156404,92476\n156405,346\n156406,156407\n156408,850\n156409,1010\n156410,206\n156411,141912\n156413,346\n156414,752\n156415,2989\n156415,2991\n156416,158\n156417,217\n156418,83\n156419,312\n156420,459\n156421,3623\n156422,2923\n156423,1388\n156424,19\n156424,356\n156424,1571\n156424,2421\n156424,5326\n156425,48\n156426,1235\n156426,1284\n156426,1335\n156426,7124\n156427,843\n156427,1388\n156428,483\n156429,298\n156430,485\n156431,79\n156431,6119\n156432,1353\n156433,156434\n156436,949\n156437,119\n156438,850\n156439,30\n156440,30\n156441,30\n156442,269\n156443,1001\n156444,1564\n156445,640\n156446,48\n156448,1775\n156449,285\n156450,406\n156451,885\n156451,13704\n156452,3623\n156454,843\n156455,323\n156457,83\n156458,1085\n156459,217\n156460,861\n156461,240\n156462,1556\n156463,579\n156464,302\n156465,850\n156466,156467\n156468,156469\n156468,158501\n156468,158719\n156468,159711\n156468,160272\n156470,6303\n156471,393\n156471,2782\n156472,1556\n156473,99\n156474,255\n156476,72\n156477,200\n156478,34\n156478,35\n156478,313\n156478,536\n156478,634\n156478,1313\n156478,1718\n156478,2224\n156478,2646\n156479,247\n156480,175\n156481,1572\n156482,150022\n156483,30\n156484,298\n156485,485\n156486,435\n156487,3602\n156488,657\n156488,718\n156488,2421\n156489,843\n156490,364\n156491,657\n156492,2319\n156493,714\n156494,138686\n156495,1001\n156496,175\n156497,298\n156498,779\n156499,861\n156500,202\n156501,2929\n156502,968\n156503,156504\n156505,1769\n156506,389\n156506,392\n156506,2699\n156507,72\n156508,10\n156508,2617\n156508,2626\n156508,3297\n156508,21487\n156509,1007\n156510,563\n156511,54\n156512,366\n156513,366\n156514,77\n156515,54\n156516,563\n156517,30\n156518,346\n156519,663\n156520,99\n156521,30\n156522,388\n156523,2424\n156524,392\n156524,1151\n156525,1467\n156526,366\n156527,355\n156527,2590\n156528,818\n156528,1776\n156528,2617\n156529,13980\n156530,452\n156530,457\n156530,535\n156530,676\n156530,843\n156530,918\n156530,1655\n156531,298\n156532,485\n156533,156534\n156535,48\n156536,355\n156537,104\n156537,557\n156537,953\n156537,954\n156538,156539\n156541,233\n156542,360\n156544,1659\n156544,127158\n156545,31977\n156547,994\n156548,58\n156549,46\n156550,30\n156551,142426\n156552,301\n156553,30\n156555,920\n156556,1118\n156557,1796\n156558,872\n156559,217\n156560,515\n156561,147\n156562,1572\n156563,151\n156564,2421\n156565,34\n156565,35\n156566,119\n156567,30\n156568,640\n156569,640\n156570,1203\n156571,10\n156571,104\n156572,30\n156573,30\n156576,671\n156576,1181\n156577,1132\n156578,781\n156579,1707\n156580,2889\n156581,163\n156581,579\n156584,346\n156585,309\n156585,310\n156586,147\n156587,142405\n156588,346\n156589,1\n156590,1319\n156591,200\n156591,248\n156591,1332\n156592,30\n156594,356\n156595,138686\n156596,175\n156597,298\n156598,1151\n156599,1749\n156600,1556\n156601,571\n156601,868\n156602,467\n156602,571\n156606,571\n156606,868\n156607,571\n156614,30\n156615,83\n156616,875\n156617,115659\n156618,422\n156620,206\n156621,1740\n156622,7\n156623,602\n156624,1179\n156625,32\n156626,156627\n156628,714\n156629,292\n156630,994\n156631,58\n156632,46\n156633,3804\n156634,704\n156635,192\n156636,1836\n156637,261\n156638,30\n156639,779\n156640,592\n156641,500\n156642,142433\n156643,68069\n156644,30\n156645,136\n156646,2191\n156646,142426\n156646,145751\n156647,1707\n156648,30\n156650,1402\n156651,283\n156653,298\n156654,485\n156655,726\n156656,272\n156656,1634\n156656,22293\n156657,2443\n156658,58\n156659,994\n156660,46\n156661,30\n156662,156663\n156664,2605\n156665,30\n156666,1782\n156667,30\n156668,160\n156669,406\n156670,1556\n156671,392\n156672,1465\n156673,30\n156674,1001\n156675,156676\n156677,366\n156678,30\n156679,240\n156680,83\n156681,120\n156681,264985\n156683,2775\n156684,447\n156685,302\n156686,2775\n156687,447\n156688,1882\n156689,104\n156690,30\n156691,356\n156691,852\n156691,185877\n156692,30\n156693,694\n156694,30\n156695,206\n156696,142426\n156696,145751\n156697,156698\n156700,536\n156701,30\n156702,141912\n156703,113156\n156704,79\n156705,671\n156706,620\n156707,346\n156708,156709\n156710,1608\n156712,273\n156713,44\n156714,50\n156714,202\n156714,349\n156714,586\n156714,875\n156714,1175\n156714,1289\n156714,1370\n156714,1454\n156714,1877\n156714,1985\n156714,3999\n156714,4545\n156714,139010\n156715,30\n156716,1058\n156717,147\n156717,893\n156717,1580\n156719,146\n156719,149\n156719,158\n156719,195\n156719,252\n156719,269\n156719,1385\n156719,92476\n156720,9030\n156721,50\n156721,406\n156721,779\n156722,1265\n156722,1266\n156723,30\n156724,83\n156725,138686\n156726,175\n156728,298\n156729,252\n156730,422\n156731,56\n156732,113156\n156733,302\n156734,536\n156735,1143\n156736,843\n156737,1058\n156738,406\n156739,156740\n156739,164652\n156739,167689\n156739,171436\n156741,140\n156742,65\n156743,483\n156744,2620\n156745,907\n156746,811\n156747,2210\n156747,4237\n156748,137\n156749,5718\n156750,10\n156751,1454\n156752,137\n156753,137\n156754,563\n156755,346\n156756,156757\n156758,252\n156759,83\n156760,634\n156761,557\n156762,72\n156763,147\n156764,3623\n156765,7416\n156766,346\n156767,1001\n156768,150037\n156769,358\n156770,34\n156770,35\n156770,83\n156770,217\n156770,536\n156770,660\n156770,852\n156770,1133\n156770,4637\n156770,7092\n156771,1010\n156772,30\n156773,310\n156774,5405\n156775,346\n156776,346\n156777,346\n156778,957\n156778,1815\n156779,602\n156780,346\n156781,3623\n156782,3623\n156783,1007\n156784,312\n156785,37\n156785,717\n156786,30\n156787,2116\n156788,13361\n156791,346\n156792,292\n156792,304\n156792,390\n156792,626\n156792,1285\n156792,1479\n156792,1801\n156792,1858\n156792,1881\n156792,6068\n156793,435\n156794,30\n156795,83\n156795,222\n156795,536\n156795,631\n156795,1085\n156795,2334\n156796,259\n156797,156798\n156799,843\n156800,3182\n156801,500\n156802,1052\n156803,1962\n156804,1882\n156805,2775\n156806,54\n156807,3623\n156808,156809\n156810,200\n156811,1132\n156812,30\n156813,65\n156814,3161\n156816,83\n156817,156818\n156819,346\n156820,389\n156821,278\n156822,22\n156823,156824\n156825,10\n156826,167\n156826,301\n156826,605\n156826,907\n156826,1436\n156827,668\n156828,30\n156829,1773\n156830,175\n156831,130\n156832,424\n156833,30\n156834,160\n156835,8308\n156836,313\n156837,313\n156838,3370\n156838,14453\n156839,156840\n156841,206\n156842,310\n156843,118\n156844,1105\n156845,155481\n156846,1634\n156847,269\n156848,843\n156849,3041\n156850,366\n156851,366\n156852,202\n156853,640\n156854,83\n156855,841\n156856,346\n156857,818\n156858,657\n156859,156860\n156861,156862\n156863,156862\n156864,294\n156865,2411\n156866,805\n156867,1801\n156868,299\n156869,422\n156870,56\n156871,7155\n156872,424\n156873,3507\n156874,422\n156875,56\n156876,972\n156877,156878\n156879,536\n156880,452\n156880,457\n156880,535\n156880,676\n156880,843\n156880,918\n156880,1655\n156881,620\n156881,779\n156881,5310\n156882,30\n156883,156884\n156886,1608\n156887,355\n156889,346\n156890,330\n156891,1858\n156892,1860\n156893,994\n156894,46\n156895,58\n156896,1893\n156897,1238\n156899,141272\n156899,156900\n156901,671\n156903,1452\n156904,408\n156905,631\n156906,4411\n156908,233\n156909,640\n156910,640\n156911,577\n156912,640\n156913,663\n156914,872\n156914,2424\n156915,3\n156917,422\n156918,3623\n156919,457\n156921,111\n156921,760\n156922,156923\n156924,1132\n156925,48\n156926,994\n156927,22\n156928,156929\n156930,2353\n156932,292\n156933,1707\n156934,142433\n156936,536\n156937,178\n156937,192\n156938,1707\n156939,435\n156939,467\n156940,138686\n156941,175\n156942,298\n156943,358\n156944,87\n156946,156947\n156948,1068\n156948,4805\n156949,314\n156949,536\n156950,622\n156950,1033\n156950,1531\n156951,104\n156952,302\n156952,1579\n156952,1659\n156953,302\n156954,83\n156955,20771\n156956,726\n156957,41\n156958,1177\n156959,346\n156960,809\n156960,224874\n156960,263956\n156960,263958\n156961,1782\n156961,162599\n156962,156963\n156964,346\n156965,24562\n156966,861\n156967,1177\n156968,781\n156970,808\n156970,4355\n156970,9457\n156971,58\n156972,150022\n156973,647\n156974,146\n156975,344\n156976,142426\n156977,1052\n156977,1151\n156977,2697\n156978,406\n156979,146\n156980,647\n156981,344\n156982,120\n156982,1001\n156982,1151\n156982,1479\n156983,156984\n156985,809\n156986,781\n156987,200\n156988,1968\n156989,994\n156990,192\n156991,366\n156994,1298\n156994,18298\n156995,30\n156996,138686\n156997,175\n156998,527\n156999,1608\n157000,298\n157001,563\n157002,1241\n157003,222\n157004,157005\n157006,192\n157007,106\n157008,3\n157009,157010\n157011,647\n157012,146\n157013,344\n157014,483\n157015,2146\n157016,157017\n157018,2083\n157019,30\n157020,81070\n157021,346\n157022,30\n157023,433\n157024,818\n157025,2699\n157026,720\n157026,775\n157028,200\n157031,3623\n157032,994\n157033,58\n157033,801\n157034,852\n157034,1740\n157035,158\n157036,640\n157037,30\n157038,3623\n157039,3623\n157040,346\n157041,30\n157043,200\n157044,644\n157047,346\n157048,30\n157049,5933\n157049,6506\n157051,392\n157051,1858\n157051,2274\n157052,283\n157052,115474\n157053,843\n157054,1285\n157054,1888\n157054,2083\n157055,72\n157056,344\n157057,285\n157058,30\n157059,30\n157060,1127\n157062,346\n157063,30\n157064,30\n157065,30\n157066,157067\n157068,346\n157069,2048\n157070,2048\n157072,138686\n157073,332\n157074,175\n157075,563\n157076,298\n157077,83\n157077,178\n157077,195\n157077,442\n157077,500\n157078,862\n157079,306\n157079,307\n157080,30\n157081,77\n157083,1363\n157084,158\n157085,346\n157086,516\n157087,1353\n157088,157089\n157090,1068\n157091,415\n157091,996\n157092,346\n157093,298\n157094,485\n157095,3260\n157095,5540\n157096,417\n157097,175\n157098,30\n157099,346\n157100,346\n157101,157102\n157103,56\n157104,422\n157105,346\n157106,195\n157106,406\n157106,640\n157107,113156\n157108,1284\n157109,44\n157110,1181\n157111,83\n157112,346\n157113,6506\n157114,4545\n157114,139010\n157115,920\n157116,157117\n157118,30\n157119,7124\n157120,141912\n157121,1133\n157122,346\n157123,157124\n157125,346\n157126,30\n157127,360\n157127,1893\n157128,1240\n157129,157130\n157133,200\n157133,772\n157134,994\n157135,157136\n157137,1631\n157138,1085\n157138,1522\n157139,146\n157140,647\n157141,344\n157142,146\n157143,647\n157144,344\n157145,50\n157145,841\n157145,2048\n157146,87\n157148,536\n157149,157150\n157151,254\n157152,113156\n157153,1608\n157154,1132\n157155,4545\n157155,139010\n157156,2334\n157158,5906\n157159,557\n157160,626\n157161,278\n157162,137\n157163,862\n157164,30\n157165,30\n157166,1007\n157167,298\n157168,485\n157169,30\n157170,5265\n157171,157172\n157173,885\n157173,13704\n157174,1359\n157175,2334\n157176,435\n157177,30\n157178,146280\n157178,159365\n157179,72\n157180,157181\n157182,30\n157183,157184\n157185,346\n157186,240\n157186,430\n157186,1001\n157186,1235\n157186,1335\n157186,1368\n157186,1381\n157186,1882\n157187,157188\n157189,30\n157190,30\n157191,30\n157192,843\n157193,111\n157193,292\n157193,314\n157193,373\n157193,441\n157193,27495\n157193,33283\n157193,46166\n157193,135620\n157193,152775\n157193,153887\n157193,179221\n157193,217264\n157193,223724\n157194,949\n157195,264\n157195,491\n157195,515\n157197,309\n157197,310\n157199,10\n157199,34\n157199,35\n157199,217\n157199,222\n157199,455\n157199,5343\n157200,346\n157201,30\n157202,920\n157203,157204\n157205,111\n157205,1105\n157206,557\n157207,30\n157208,30\n157209,307\n157209,682\n157209,72439\n157210,157211\n157212,50\n157213,2105\n157215,30\n157216,2205\n157216,33424\n157218,657\n157219,269\n157220,2210\n157220,4237\n157221,1860\n157222,157223\n157224,83\n157224,219\n157224,818\n157224,1132\n157224,1313\n157225,30\n157226,269\n157227,435\n157228,22\n157229,843\n157230,602\n157232,157233\n157234,157235\n157236,30\n157237,30\n157238,30\n157239,30\n157240,30\n157241,1087\n157242,72\n157243,1127\n157244,202\n157246,420\n157246,467\n157246,872\n157246,1579\n157247,841\n157248,255\n157249,113156\n157250,861\n157251,579\n157252,302\n157253,157254\n157255,157256\n157257,1085\n157257,2590\n157258,157259\n157260,7757\n157261,861\n157262,72\n157264,298\n157265,485\n157267,346\n157268,509\n157268,1836\n157269,142473\n157270,980\n157270,1117\n157271,452\n157271,457\n157271,535\n157271,676\n157271,843\n157271,918\n157271,1655\n157272,671\n157273,862\n157273,1001\n157274,157275\n157277,355\n157279,65\n157280,157281\n157282,2274\n157283,346\n157284,142426\n157285,1544\n157286,4611\n157287,157288\n157289,147\n157289,158\n157290,30\n157292,447\n157293,2775\n157294,233\n157295,30\n157296,147\n157297,992\n157297,1276\n157299,157300\n157301,157302\n157303,120\n157304,157305\n157306,15\n157306,1179\n157307,346\n157309,1117\n157310,366\n157311,366\n157312,640\n157313,640\n157314,366\n157316,195\n157317,79\n157317,525\n157317,4691\n157318,875\n157320,269\n157322,760\n157323,726\n157325,10\n157326,298\n157326,417\n157326,1085\n157326,1212\n157326,1285\n157326,1785\n157326,1818\n157326,1955\n157326,2205\n157326,2296\n157326,5718\n157326,33424\n157327,718\n157328,346\n157329,157330\n157331,1068\n157334,2915\n157337,41\n157339,264\n157339,296\n157339,14550\n157340,138686\n157341,175\n157342,298\n157343,1707\n157344,1240\n157346,1068\n157347,1105\n157347,1285\n157348,1544\n157349,4611\n157350,818\n157351,118\n157351,4597\n157352,309\n157352,310\n157353,158\n157354,142433\n157355,447\n157356,2775\n157357,1893\n157358,1858\n157359,1860\n157360,30\n157361,779\n157361,68069\n157361,118336\n157362,873\n157363,1837\n157363,73570\n157364,994\n157365,147\n157365,158\n157366,4222\n157368,83\n157369,10\n157369,2574\n157370,1571\n157371,202\n157372,200\n157373,1113\n157374,717\n157375,73570\n157377,7360\n157379,485\n157380,298\n157382,106\n157383,356\n157384,431\n157385,1715\n157387,868\n157388,868\n157389,157390\n157391,328\n157392,1893\n157392,49057\n157394,157395\n157396,483\n157397,2210\n157397,4237\n157398,143287\n157399,83\n157402,557\n157403,1227\n157403,86416\n157404,146\n157405,647\n157406,344\n157408,292\n157409,261\n157411,157412\n157413,968\n157414,147191\n157416,592\n157416,602\n157418,14550\n157419,3630\n157420,312\n157421,3194\n157422,3623\n157423,138686\n157424,2048\n157425,175\n157426,994\n157427,298\n157428,3623\n157429,298\n157430,485\n157431,2048\n157432,358\n157433,1877\n157434,435\n157435,30\n157436,264\n157437,3623\n157439,1612\n157440,157441\n157440,189877\n157440,215590\n157440,217397\n157442,346\n157444,346\n157445,843\n157446,3623\n157447,392\n157448,4903\n157449,138\n157450,83\n157451,1105\n157452,4060\n157453,3623\n157454,149\n157454,21442\n157455,247\n157455,2867\n157455,2868\n157457,801\n157458,1836\n157458,13361\n157459,328\n157460,344\n157461,72\n157462,285\n157463,390\n157464,72\n157465,142405\n157466,2266\n157467,4223\n157469,2048\n157470,2334\n157471,269\n157472,1252\n157472,1253\n157473,44\n157474,346\n157475,83\n157476,346\n157477,30\n157478,885\n157478,13704\n157479,435\n157480,157481\n157480,157884\n157482,30\n157483,1235\n157483,1335\n157484,58\n157485,2244\n157486,827\n157487,217\n157487,1417\n157487,18831\n157488,3\n157489,557\n157490,862\n157491,843\n157492,595\n157493,1151\n157494,344\n157495,72\n157496,285\n157497,4594\n157498,1274\n157499,72\n157500,10\n157500,113156\n157501,450\n157502,1085\n157503,30\n157504,30\n157505,4611\n157506,30\n157507,1058\n157508,113156\n157509,1238\n157510,72\n157511,72\n157512,1385\n157513,1235\n157513,1335\n157514,868\n157515,151\n157516,1087\n157518,83\n157519,1001\n157520,919\n157520,994\n157521,779\n157522,30\n157523,760\n157524,972\n157525,157526\n157527,30\n157528,1556\n157529,302\n157530,392\n157530,697\n157532,346\n157533,760\n157534,760\n157535,72\n157536,760\n157537,1462\n157538,626\n157539,850\n157540,50\n157540,147\n157541,366\n157542,366\n157543,366\n157544,366\n157545,366\n157546,452\n157546,457\n157546,535\n157546,676\n157546,843\n157546,918\n157546,1655\n157547,255\n157548,3695\n157549,893\n157550,355\n157551,72\n157552,510\n157553,422\n157554,56\n157555,157556\n157557,157558\n157559,346\n157560,292\n157560,7698\n157561,481\n157562,346\n157564,422\n157565,56\n157566,1837\n157567,147\n157567,406\n157567,779\n157567,1893\n157567,2017\n157568,50\n157569,346\n157571,3623\n157572,483\n157573,233\n157574,972\n157575,1012\n157576,640\n157577,4611\n157578,1544\n157579,2671\n157580,2244\n157581,647\n157582,344\n157583,146\n157584,346\n157586,4611\n157587,1544\n157588,861\n157589,1238\n157590,647\n157591,146\n157592,344\n157593,299\n157594,3207\n157595,996\n157596,142426\n157597,4691\n157599,852\n157599,1888\n157600,302\n157601,868\n157602,1807\n157603,3623\n157604,138686\n157605,175\n157606,298\n157607,2146\n157608,433\n157609,1452\n157610,671\n157610,1181\n157611,392\n157612,760\n157613,1454\n157614,1551\n157614,159477\n157615,4571\n157616,301\n157617,1715\n157618,118\n157618,422\n157618,4597\n157618,5405\n157619,647\n157620,146\n157621,344\n157622,269\n157623,994\n157624,146\n157625,647\n157626,344\n157627,2775\n157628,3135\n157629,1893\n157630,5591\n157631,592\n157632,726\n157633,83\n157634,379\n157635,157636\n157637,485\n157638,211\n157639,298\n157640,157641\n157642,138686\n157643,175\n157644,298\n157645,422\n157646,56\n157647,1\n157647,104999\n157648,406\n157649,652\n157650,310\n157651,393\n157652,113156\n157653,302\n157655,1860\n157656,1858\n157657,457\n157658,875\n157659,875\n157660,138686\n157661,175\n157662,298\n157663,1305\n157664,302\n157665,127158\n157667,30\n157668,3623\n157669,1984\n157670,1818\n157672,620\n157673,1844\n157674,788\n157675,3623\n157676,3623\n157677,3623\n157678,3623\n157679,50\n157681,682\n157681,1070\n157681,72439\n157682,3260\n157684,760\n157685,84257\n157687,104\n157687,557\n157687,953\n157687,954\n157688,536\n157688,2266\n157689,1715\n157690,200\n157691,34\n157691,35\n157692,30\n157693,157694\n157695,1267\n157696,30\n157697,1181\n157698,195\n157699,146\n157700,647\n157701,344\n157702,760\n157703,275\n157705,346\n157706,261\n157707,149\n157707,622\n157709,3367\n157710,2048\n157711,2048\n157712,5405\n157713,420\n157713,595\n157713,1688\n157714,157715\n157716,157715\n157717,157715\n157718,157715\n157719,503\n157721,1019\n157722,145240\n157723,104\n157723,136\n157723,254\n157723,557\n157723,953\n157723,1368\n157723,1939\n157723,7270\n157724,113156\n157725,3138\n157726,779\n157727,676\n157728,626\n157729,1818\n157730,138686\n157731,175\n157732,5405\n157733,298\n157734,157735\n157736,30\n157737,44\n157738,30\n157738,200\n157738,772\n157739,1805\n157740,3623\n157741,1220\n157741,1222\n157742,158\n157743,3623\n157744,1298\n157745,1298\n157746,406\n157747,83\n157748,150037\n157749,1531\n157750,1001\n157751,312\n157752,3623\n157753,346\n157754,157755\n157756,843\n157757,3623\n157758,72\n157759,818\n157761,809\n157762,157763\n157764,473\n157765,3623\n157766,3623\n157767,83\n157768,3623\n157769,2620\n157770,332\n157771,83\n157772,358\n157773,346\n157774,1844\n157775,779\n157776,157777\n157778,358\n157779,557\n157780,557\n157781,8719\n157782,138\n157783,1882\n157784,865\n157785,557\n157786,137\n157787,118\n157787,4597\n157788,88820\n157789,157790\n157791,7416\n157793,142405\n157794,72\n157795,760\n157796,264\n157796,1639\n157797,16019\n157798,1179\n157799,72\n157800,2367\n157801,1087\n157802,30\n157803,135\n157803,2105\n157804,577\n157805,2116\n157806,1893\n157807,1381\n157808,254\n157809,269\n157811,452\n157812,3370\n157812,7124\n157813,1149\n157814,577\n157815,862\n157815,2590\n157816,652\n157817,2590\n157819,31977\n157820,355\n157821,157822\n157823,10\n157824,157825\n157826,157825\n157827,157825\n157828,157825\n157829,157825\n157830,452\n157830,457\n157830,497\n157830,535\n157830,676\n157830,843\n157830,918\n157830,1655\n157831,872\n157832,207\n157833,1429\n157834,8884\n157836,392\n157837,668\n157838,1085\n157839,536\n157839,18831\n157840,1143\n157841,157842\n157844,1858\n157845,1860\n157846,157847\n157848,2989\n157848,2991\n157849,4\n157849,5\n157850,83\n157851,784\n157852,225\n157853,157854\n157855,146\n157856,647\n157857,344\n157858,1068\n157859,994\n157860,1858\n157861,1860\n157862,994\n157863,485\n157864,298\n157865,157866\n157868,1058\n157868,13538\n157869,30\n157872,1359\n157873,157874\n157875,20257\n157876,1805\n157877,328\n157878,44\n157879,422\n157880,56\n157881,932\n157882,346\n157883,483\n157886,827\n157887,422\n157888,422\n157889,422\n157890,422\n157891,422\n157892,422\n157893,422\n157894,422\n157895,422\n157896,422\n157897,422\n157898,422\n157899,222\n157900,10\n157901,30\n157902,2626\n157903,83\n157904,336\n157905,30\n157906,30\n157907,536\n157909,273\n157910,72\n157912,252\n157913,157914\n157915,640\n157916,298\n157917,485\n157918,141912\n157919,195\n157919,1454\n157920,10\n157921,668\n157922,1564\n157923,592\n157924,157925\n157926,127158\n157927,313\n157928,2506\n157929,493\n157929,920\n157930,422\n157931,157932\n157933,157934\n157935,157936\n157937,2168\n157938,1773\n157939,1181\n157940,953\n157941,15119\n157941,31346\n157942,298\n157943,485\n157944,298\n157945,485\n157946,157947\n157948,157949\n157950,2266\n157951,157952\n157953,30\n157955,113156\n157956,704\n157957,135\n157957,137\n157959,1\n157959,649\n157960,157961\n157962,157963\n157965,640\n157967,157968\n157969,157968\n157970,157968\n157971,631\n157972,157973\n157974,252\n157974,516\n157974,1220\n157974,1222\n157975,157976\n157975,160173\n157977,355\n157978,233\n157979,107\n157980,2416\n157980,2417\n157981,292\n157982,338\n157983,107\n157983,338\n157983,372\n157983,862\n157983,1001\n157983,1133\n157983,1837\n157984,298\n157986,157987\n157988,157989\n157990,1133\n157991,3538\n157992,157993\n157992,224072\n157992,227608\n157992,228036\n157994,298\n157995,485\n157997,157998\n157999,72\n158002,1058\n158003,305\n158003,1132\n158004,647\n158005,344\n158006,146\n158007,22\n158008,158009\n158010,1844\n158011,187\n158012,273\n158013,158014\n158015,2367\n158016,3258\n158017,158018\n158019,44\n158020,158021\n158020,223216\n158020,227856\n158020,238758\n158020,240856\n158020,254185\n158020,257701\n158020,265001\n158022,158023\n158022,219579\n158026,328\n158027,932\n158029,483\n158030,48\n158031,6387\n158033,2506\n158034,872\n158035,872\n158036,58\n158036,328\n158037,30\n158038,158039\n158040,30\n158041,704\n158042,175\n158043,1722\n158044,30\n158045,240\n158046,30\n158047,30\n158048,72\n158049,1257\n158049,3085\n158051,72\n158052,344\n158053,285\n158054,30\n158056,483\n158057,1359\n158058,30\n158059,1181\n158060,1983\n158060,1984\n158060,3949\n158061,72\n158062,704\n158063,171\n158064,171\n158065,10\n158066,3524\n158067,4545\n158067,139010\n158068,557\n158069,557\n158070,72\n158071,72\n158072,72\n158073,20757\n158074,298\n158075,485\n158076,1893\n158077,72\n158078,467\n158078,152855\n158079,760\n158079,954\n158079,1580\n158079,10318\n158080,158081\n158083,211\n158085,142473\n158086,1566\n158087,72\n158088,3148\n158090,158091\n158092,158093\n158094,310\n158095,158096\n158097,83\n158097,86\n158097,219\n158097,818\n158097,985\n158097,1132\n158097,1313\n158098,4545\n158098,139010\n158099,328\n158100,309\n158101,158102\n158103,309\n158104,1849\n158105,1458\n158106,158107\n158106,198047\n158108,4939\n158108,4940\n158108,4941\n158109,158110\n158111,72\n158112,309\n158113,30\n158114,309\n158115,72\n158116,255\n158117,72\n158118,72\n158119,1644\n158120,72\n158122,72\n158123,72\n158124,292\n158125,1070\n158126,294\n158127,32475\n158128,296\n158129,298\n158130,302\n158131,72\n158132,158133\n158134,233\n158135,355\n158137,56\n158138,422\n158139,358\n158140,72\n158141,647\n158142,344\n158143,146\n158144,366\n158146,366\n158147,733\n158148,733\n158149,450\n158150,1655\n158151,158152\n158153,1293\n158154,1544\n158155,4611\n158156,1238\n158157,452\n158157,457\n158158,3555\n158159,726\n158160,1715\n158161,142409\n158161,146280\n158161,159365\n158162,994\n158163,58\n158164,46\n158166,1452\n158167,255\n158168,151\n158169,58\n158170,994\n158171,46\n158172,171\n158174,298\n158175,485\n158177,117795\n158178,467\n158179,1014\n158180,640\n158181,3507\n158182,868\n158183,2775\n158184,447\n158185,138686\n158186,175\n158187,640\n158188,298\n158189,211\n158190,298\n158191,485\n158192,1177\n158193,676\n158193,918\n158194,485\n158195,298\n158196,2210\n158196,4237\n158197,631\n158198,422\n158199,283\n158200,1151\n158201,450\n158202,255\n158203,158204\n158205,1707\n158206,647\n158207,146\n158208,344\n158209,647\n158210,344\n158211,146\n158212,536\n158212,694\n158212,949\n158213,1359\n158214,647\n158215,146\n158216,344\n158217,171\n158218,872\n158219,973\n158219,1293\n158220,1860\n158221,1858\n158222,3695\n158223,872\n158224,68069\n158225,83\n158226,138686\n158227,175\n158228,298\n158229,298\n158230,485\n158231,647\n158232,344\n158233,146\n158234,1608\n158235,1132\n158236,1715\n158237,86\n158238,158239\n158240,671\n158241,145751\n158242,1319\n158243,83\n158244,72\n158245,390\n158246,87\n158246,1274\n158246,1454\n158248,217\n158248,314\n158249,1559\n158250,138686\n158251,175\n158252,298\n158253,389\n158254,2944\n158255,1454\n158256,760\n158257,557\n158258,1\n158259,872\n158260,1252\n158260,1253\n158261,1284\n158262,346\n158264,827\n158265,30\n158266,30\n158268,1210\n158269,1119\n158270,287\n158270,3999\n158271,344\n158271,685\n158272,392\n158274,1715\n158275,1849\n158276,868\n158277,1860\n158278,1858\n158279,801\n158282,30\n158284,1474\n158285,1089\n158286,217\n158286,1417\n158287,801\n158288,2460\n158289,994\n158289,190492\n158290,344\n158292,1962\n158293,3769\n158294,15\n158295,158296\n158298,535\n158298,843\n158300,596\n158301,907\n158303,5265\n158304,200\n158304,248\n158305,138686\n158306,175\n158307,298\n158308,1118\n158309,292\n158310,217\n158316,850\n158317,647\n158318,256\n158319,298\n158320,485\n158321,406\n158322,30\n158323,1117\n158324,217\n158324,455\n158324,1417\n158325,72\n158326,86\n158328,158329\n158330,72\n158331,255\n158332,15573\n158333,142473\n158335,1010\n158336,1844\n158339,269\n158340,136\n158341,44\n158343,79\n158344,450\n158345,932\n158346,2048\n158347,2048\n158348,450\n158349,406\n158351,312\n158352,422\n158352,602\n158353,83\n158355,779\n158355,141912\n158356,1089\n158357,158358\n158359,516\n158360,34\n158360,35\n158361,557\n158362,2048\n158363,483\n158364,2048\n158367,72\n158368,138686\n158369,175\n158370,83\n158370,278\n158371,298\n158372,602\n158373,1707\n158374,302\n158375,158376\n158377,255\n158378,2209\n158379,3\n158379,704\n158380,298\n158381,485\n158383,450\n158384,72\n158384,2782\n158385,240\n158386,217\n158387,2045\n158388,178\n158388,259\n158388,315\n158388,346\n158388,393\n158388,435\n158388,439\n158388,538\n158388,671\n158388,934\n158388,996\n158388,1033\n158388,1068\n158388,1163\n158388,1294\n158388,1590\n158388,1612\n158388,1644\n158388,1877\n158388,2353\n158388,6661\n158389,138686\n158390,175\n158391,483\n158392,17309\n158393,298\n158394,30\n158395,450\n158396,431\n158398,5034\n158400,6323\n158402,885\n158402,13704\n158403,158404\n158405,5034\n158406,557\n158407,158408\n158409,158408\n158410,158408\n158411,158408\n158412,1117\n158413,1289\n158414,2209\n158414,14434\n158415,358\n158416,8854\n158417,2574\n158418,760\n158419,158420\n158421,760\n158422,760\n158423,158424\n158425,1181\n158426,760\n158427,1556\n158428,158429\n158430,850\n158431,240\n158432,72\n158433,247\n158434,158435\n158436,862\n158437,602\n158438,2083\n158439,467\n158440,2116\n158441,34\n158441,35\n158442,516\n158443,138686\n158444,175\n158445,516\n158446,298\n158447,20\n158448,158449\n158450,158451\n158452,1556\n158453,577\n158454,72\n158455,557\n158456,980\n158457,2775\n158458,366\n158459,647\n158460,146\n158461,344\n158462,577\n158463,158464\n158465,10\n158466,146\n158467,344\n158468,647\n158469,158470\n158471,158472\n158475,818\n158476,687\n158478,158479\n158480,1285\n158481,760\n158482,72\n158483,142405\n158484,255\n158485,255\n158486,1417\n158487,158488\n158489,255\n158490,420\n158491,420\n158492,72\n158493,72\n158494,2697\n158495,72\n158496,184\n158497,158498\n158499,2590\n158502,1235\n158502,1335\n158503,2146\n158504,72\n158505,158506\n158507,4192\n158507,4193\n158508,178\n158509,872\n158510,1429\n158511,72\n158512,10\n158512,3316\n158513,704\n158514,668\n158515,30\n158516,72\n158517,72\n158518,72\n158519,2146\n158520,862\n158521,207\n158522,146952\n158523,72\n158524,450\n158525,158526\n158527,158526\n158528,167\n158528,301\n158528,972\n158529,1143\n158530,115659\n158531,32475\n158532,158533\n158534,83\n158535,3769\n158536,233\n158537,355\n158538,255\n158539,141912\n158540,485\n158541,298\n158542,30\n158543,452\n158543,457\n158543,535\n158543,676\n158543,843\n158543,918\n158543,1655\n158544,298\n158545,485\n158546,289\n158546,290\n158546,94134\n158547,1509\n158548,485\n158549,298\n158550,818\n158551,146\n158552,647\n158553,344\n158554,298\n158555,485\n158556,72764\n158556,124668\n158557,41\n158559,158560\n158561,1151\n158561,1363\n158563,158564\n158566,422\n158566,602\n158567,1127\n158568,136072\n158569,640\n158570,640\n158571,264\n158571,999\n158571,1147\n158571,1179\n158571,1515\n158571,1559\n158571,6880\n158572,433\n158572,1634\n158573,1179\n158573,1612\n158574,1801\n158575,171\n158576,911\n158577,143287\n158578,4545\n158578,139010\n158579,557\n158580,663\n158583,663\n158584,1267\n158584,2605\n158585,1479\n158588,72\n158590,106\n158591,255\n158592,1465\n158593,1707\n158595,450\n158596,83\n158598,138686\n158599,175\n158600,313\n158601,298\n158602,602\n158603,3846\n158604,356\n158605,447\n158606,2989\n158606,2991\n158607,7\n158608,718\n158609,467\n158610,1019\n158611,827\n158612,356\n158614,222\n158615,784\n158615,142473\n158616,516\n158617,309\n158617,310\n158617,483\n158618,784\n158619,1240\n158620,968\n158621,827\n158623,1010\n158624,779\n158625,83\n158627,467\n158627,868\n158627,156379\n158627,162599\n158629,104\n158632,1085\n158632,5213\n158633,536\n158633,18831\n158634,720\n158635,1151\n158636,142409\n158636,146280\n158637,158\n158639,931\n158640,571\n158641,743\n158642,107\n158643,142473\n158644,195\n158645,31977\n158646,344\n158647,647\n158648,146\n158649,158650\n158651,217\n158652,868\n158653,2775\n158654,718\n158655,13361\n158657,138686\n158658,175\n158659,298\n158661,146\n158662,647\n158663,344\n158664,2260\n158665,827\n158666,83\n158667,788\n158669,2083\n158670,146\n158671,647\n158672,344\n158673,450\n158674,1\n158674,1402\n158675,447\n158676,2775\n158677,255\n158678,1908\n158678,55077\n158679,1860\n158680,1858\n158681,433\n158682,455\n158682,657\n158683,292\n158684,240\n158684,760\n158684,1019\n158685,1323\n158686,102\n158687,408\n158688,1326\n158689,994\n158690,146\n158691,647\n158692,344\n158693,602\n158694,146\n158695,647\n158696,344\n158697,1309\n158698,852\n158699,980\n158700,192\n158700,818\n158701,360\n158701,1893\n158702,467\n158704,663\n158705,631\n158705,1078\n158705,4223\n158707,518\n158707,1955\n158708,1127\n158709,358\n158710,146\n158711,647\n158712,344\n158713,344\n158714,146\n158715,647\n158716,142473\n158717,991\n158718,20\n158718,118336\n158720,146280\n158721,2371\n158722,44\n158723,313\n158724,84257\n158725,932\n158726,158727\n158728,2048\n158730,313\n158731,602\n158732,255\n158733,2048\n158734,312\n158734,338\n158734,3538\n158735,71\n158736,809\n158737,536\n158738,83\n158739,1419\n158740,972\n158741,14797\n158742,3804\n158743,2737\n158744,518\n158745,3193\n158746,31122\n158747,1\n158748,217\n158749,588\n158749,590\n158750,868\n158751,467\n158751,868\n158752,3148\n158753,422\n158754,515\n158755,217\n158756,278\n158757,83\n158758,146\n158759,344\n158760,647\n158761,3623\n158762,364\n158762,609\n158762,1844\n158762,1973\n158763,158763\n158764,704\n158765,994\n158766,406\n158767,781\n158768,83\n158769,138686\n158770,175\n158771,298\n158772,483\n158774,1891\n158775,48\n158775,86\n158775,292\n158775,315\n158775,340\n158775,483\n158775,620\n158775,663\n158775,668\n158775,1151\n158775,1179\n158775,1623\n158775,1837\n158775,4597\n158775,6506\n158776,158777\n158778,158777\n158779,3623\n158780,158\n158781,83\n158782,435\n158783,2244\n158784,10\n158785,2572\n158786,877\n158786,5101\n158787,843\n158788,206\n158788,217\n158788,283\n158788,1019\n158788,1417\n158788,2266\n158789,310\n158789,3039\n158790,72\n158791,158792\n158793,1381\n158794,406\n158795,158796\n158797,310\n158798,158799\n158801,301\n158801,968\n158802,1\n158804,215\n158805,72\n158806,1858\n158807,1860\n158809,704\n158810,146\n158811,647\n158812,344\n158813,536\n158814,885\n158814,13704\n158815,178\n158816,285\n158816,1655\n158816,92476\n158817,1149\n158818,158819\n158818,175143\n158820,83\n158821,192\n158822,83\n158823,2989\n158823,2991\n158824,10\n158825,3623\n158826,4355\n158827,795\n158828,3623\n158829,28755\n158830,1983\n158831,1618\n158831,19443\n158833,217\n158834,2797\n158835,107\n158836,1877\n158837,2460\n158838,192\n158838,336\n158838,818\n158838,127158\n158839,647\n158840,146\n158841,344\n158842,72\n158843,893\n158844,1001\n158845,805\n158845,2209\n158846,83\n158848,255\n158850,269\n158851,994\n158852,302\n158853,6837\n158855,278\n158856,72\n158857,158858\n158857,166816\n158859,631\n158860,30\n158861,72\n158862,2083\n158863,450\n158864,146\n158865,647\n158866,344\n158867,346\n158868,30\n158869,255\n158871,1149\n158872,135\n158873,647\n158874,146\n158875,344\n158876,2889\n158877,1353\n158878,483\n158879,158880\n158881,158882\n158883,158884\n158883,190667\n158886,158887\n158888,1467\n158889,455\n158890,2424\n158891,1871\n158892,536\n158893,2421\n158894,83\n158895,13980\n158896,83\n158897,158898\n158899,843\n158900,158901\n158902,158903\n158904,3345\n158905,366\n158906,310\n158907,355\n158908,1655\n158909,2867\n158910,452\n158911,158912\n158913,2367\n158914,149\n158916,146\n158917,647\n158918,344\n158919,233\n158920,657\n158921,671\n158922,452\n158922,843\n158922,918\n158923,1132\n158924,50\n158924,30428\n158925,1267\n158925,1893\n158925,3999\n158925,49057\n158926,717\n158927,1238\n158929,843\n158930,818\n158931,1452\n158932,985\n158932,1070\n158933,58\n158934,994\n158935,46\n158936,58\n158937,994\n158938,46\n158939,376\n158940,1860\n158941,1858\n158942,336\n158943,97\n158944,1801\n158945,3623\n158946,310\n158946,3039\n158949,805\n158949,1659\n158949,66297\n158950,126\n158951,2590\n158952,72\n158953,622\n158954,592\n158956,217\n158958,1983\n158960,1149\n158961,994\n158962,346\n158964,138686\n158965,22293\n158966,175\n158967,298\n158968,41\n158968,1252\n158968,1253\n158970,1033\n158971,1522\n158972,136\n158973,158974\n158975,358\n158976,852\n158976,1010\n158977,83\n158980,726\n158982,980\n158983,158984\n158985,313\n158986,647\n158987,146\n158988,344\n158989,675\n158989,1590\n158990,392\n158990,809\n158990,877\n158990,1284\n158990,148742\n158991,30\n158992,579\n158993,433\n158994,485\n158995,298\n158996,1968\n158998,138686\n158999,1240\n159000,175\n159001,30\n159002,159003\n159004,415\n159004,1143\n159005,81\n159006,298\n159007,907\n159008,4355\n159009,1014\n159010,160\n159011,1001\n159012,1016\n159014,571\n159017,809\n159018,893\n159019,452\n159019,457\n159019,535\n159019,676\n159019,843\n159019,918\n159019,1655\n159020,302\n159021,46\n159021,233\n159021,292\n159021,332\n159021,525\n159021,586\n159021,592\n159021,954\n159021,972\n159021,1467\n159021,2286\n159021,3695\n159021,10318\n159021,42628\n159022,743\n159023,309\n159023,310\n159024,261\n159025,698\n159026,302\n159026,2116\n159026,6303\n159027,1707\n159028,1\n159028,147\n159028,149\n159028,171\n159028,1623\n159030,146\n159031,647\n159032,344\n159033,217\n159033,379\n159033,1454\n159034,717\n159035,485\n159037,283\n159038,302\n159038,861\n159038,893\n159038,1556\n159039,72\n159040,83\n159041,3555\n159042,1860\n159043,1858\n159044,19010\n159046,159047\n159049,868\n159049,152855\n159050,1860\n159051,1858\n159052,130\n159053,30\n159055,1323\n159056,1326\n159057,408\n159058,102\n159059,717\n159060,146\n159061,72\n159062,344\n159063,285\n159065,1326\n159066,1893\n159067,818\n159067,4548\n159068,3507\n159069,733\n159069,1623\n159070,184\n159071,1368\n159072,138\n159072,1858\n159072,13136\n159073,861\n159074,124668\n159075,1474\n159076,485\n159077,298\n159079,697\n159080,483\n159081,149\n159082,697\n159082,49057\n159083,843\n159084,217\n159085,178\n159087,657\n159088,2260\n159089,671\n159090,72\n159091,312\n159093,71\n159093,859\n159094,217\n159094,2443\n159095,17309\n159096,392\n159097,1531\n159098,72\n159099,44\n159100,104\n159101,138686\n159102,175\n159103,366\n159103,1860\n159104,298\n159105,72\n159107,2146\n159108,151\n159108,309\n159108,310\n159109,2205\n159109,33424\n159110,225\n159111,2048\n159113,2626\n159114,2048\n159116,283\n159116,379\n159116,431\n159116,634\n159116,5591\n159117,366\n159117,972\n159119,4571\n159120,1858\n159121,1860\n159122,72\n159123,932\n159124,1309\n159126,3555\n159127,760\n159128,195\n159129,784\n159129,221306\n159130,994\n159131,1858\n159132,1860\n159133,149\n159133,406\n159134,32\n159134,392\n159134,509\n159134,644\n159134,697\n159134,809\n159134,1363\n159134,1858\n159134,2274\n159134,2699\n159134,4903\n159134,76096\n159135,195\n159136,138686\n159137,159138\n159139,175\n159140,4571\n159141,298\n159142,1007\n159143,406\n159144,6506\n159145,1608\n159146,83\n159147,704\n159148,676\n159149,146\n159150,647\n159151,344\n159152,994\n159154,328\n159155,68\n159156,861\n159157,30\n159158,925\n159159,247\n159159,516\n159160,269\n159161,147\n159162,30\n159163,3949\n159164,1566\n159165,483\n159166,136\n159166,563\n159167,1663\n159168,4611\n159169,1544\n159170,2373\n159171,1010\n159172,1983\n159173,861\n159174,30\n159175,3695\n159176,457\n159176,535\n159176,676\n159176,843\n159176,918\n159176,1655\n159179,3\n159180,493\n159180,1265\n159180,1266\n159181,113156\n159182,159183\n159184,640\n159185,1984\n159186,159187\n159188,247\n159188,2867\n159188,2868\n159189,1274\n159190,346\n159191,83\n159192,159193\n159194,3069\n159195,312\n159195,358\n159196,640\n159198,1\n159199,146\n159200,647\n159201,344\n159202,2367\n159203,1332\n159204,159205\n159206,13361\n159207,577\n159208,58\n159209,10\n159209,90388\n159209,156760\n159210,1715\n159211,2620\n159211,5908\n159212,6027\n159213,5906\n159214,557\n159215,626\n159216,278\n159217,137\n159218,862\n159219,636\n159220,137\n159221,1796\n159221,19519\n159222,159223\n159224,435\n159225,159226\n159227,843\n159228,647\n159229,344\n159230,146\n159231,949\n159232,2480\n159233,455\n159234,4222\n159235,2617\n159236,4192\n159238,1140\n159239,1188\n159240,1181\n159241,225\n159242,444\n159243,159244\n159245,273\n159246,980\n159247,255\n159248,1707\n159249,602\n159250,4223\n159251,56\n159252,422\n159253,255\n159254,255\n159255,255\n159256,1007\n159259,113156\n159260,920\n159261,113156\n159262,859\n159264,269\n159265,143287\n159266,585\n159266,622\n159266,73938\n159267,175\n159268,1188\n159269,83\n159272,328\n159272,779\n159273,4549\n159274,422\n159275,142405\n159276,147\n159277,68069\n159278,328\n159279,63\n159280,1313\n159281,159282\n159283,159284\n159285,312\n159286,273\n159287,2626\n159288,147\n159289,104\n159290,137\n159290,1181\n159291,581\n159292,3695\n159293,843\n159295,22\n159296,255\n159297,269\n159298,304\n159299,72\n159300,72\n159301,119\n159302,640\n159303,1147\n159304,298\n159305,1807\n159306,1012\n159307,272\n159307,439\n159307,563\n159307,980\n159307,2353\n159307,2367\n159307,15573\n159308,1458\n159309,652\n159310,75912\n159311,255\n159312,285\n159313,355\n159314,184\n159315,151\n159316,1127\n159317,360\n159318,707\n159319,3447\n159320,6627\n159321,647\n159322,146\n159323,344\n159324,159325\n159326,305\n159327,452\n159327,457\n159327,676\n159327,843\n159327,918\n159328,647\n159329,344\n159330,146\n159331,233\n159332,142473\n159333,827\n159334,1326\n159335,255\n159336,366\n159338,366\n159340,1385\n159342,536\n159343,240\n159344,142473\n159345,592\n159346,1\n159348,433\n159349,4223\n159350,841\n159351,275\n159353,843\n159354,1860\n159355,1858\n159356,200\n159357,640\n159358,1319\n159359,58\n159360,444\n159360,720\n159360,1001\n159360,1732\n159361,1844\n159362,994\n159363,58\n159364,46\n159367,344\n159368,647\n159369,146\n159370,485\n159371,298\n159373,54\n159374,372\n159375,861\n159375,893\n159376,392\n159377,4504\n159378,138686\n159379,175\n159380,298\n159381,1509\n159382,54\n159382,83\n159382,140\n159382,660\n159382,752\n159382,919\n159382,1287\n159382,1309\n159382,1479\n159382,1579\n159382,1871\n159382,2424\n159382,6424\n159383,372\n159383,588\n159383,590\n159383,805\n159383,1368\n159385,920\n159386,657\n159386,1019\n159386,2266\n159387,251\n159388,1858\n159389,1860\n159392,251\n159393,1572\n159394,138\n159394,1616\n159394,13361\n159394,19413\n159396,1210\n159397,346\n159399,920\n159400,79\n159400,818\n159402,372\n159403,1149\n159404,920\n159405,34\n159405,35\n159405,222\n159405,2266\n159407,1707\n159408,2146\n159411,151\n159412,3\n159413,83\n159414,255\n159415,2828\n159416,1580\n159416,2590\n159418,255\n159419,159420\n159421,784\n159422,1715\n159423,2209\n159425,372\n159425,1285\n159425,2991\n159426,200\n159427,1888\n159429,211\n159430,1001\n159433,30\n159434,779\n159435,1243\n159436,1010\n159437,784\n159438,2210\n159438,4237\n159440,1160\n159441,1566\n159442,850\n159443,408\n159444,102\n159445,1323\n159446,1326\n159447,58\n159448,994\n159449,46\n159450,83\n159451,104\n159452,872\n159453,1267\n159455,77\n159455,269\n159456,622\n159457,19010\n159458,83\n159460,1241\n159460,1474\n159460,1927\n159460,7757\n159461,2557\n159462,309\n159462,310\n159463,58\n159464,994\n159465,46\n159466,1707\n159467,439\n159468,4260\n159469,302\n159470,994\n159471,58\n159472,46\n159473,326\n159474,704\n159475,302\n159478,138686\n159479,175\n159480,849\n159480,187176\n159481,298\n159482,83\n159483,240\n159484,483\n159485,72\n159486,44\n159487,302\n159488,273\n159489,44\n159490,1454\n159492,138\n159492,302\n159492,849\n159492,1011\n159492,1849\n159493,2048\n159494,302\n159496,145751\n159497,346\n159498,932\n159499,1419\n159500,302\n159501,588\n159501,590\n159502,217\n159503,167\n159504,3467\n159505,379\n159506,309\n159506,310\n159506,161171\n159507,1983\n159508,557\n159509,602\n159510,1010\n159511,269\n159512,557\n159513,1243\n159514,676\n159515,159516\n159517,1243\n159518,557\n159519,1151\n159520,6638\n159521,994\n159522,360\n159524,3623\n159526,3623\n159527,452\n159527,127158\n159528,138686\n159529,175\n159531,406\n159532,292\n159533,215\n159533,240\n159533,372\n159533,417\n159533,592\n159533,631\n159533,805\n159533,932\n159533,1082\n159533,1282\n159533,1462\n159533,1564\n159533,1608\n159533,1785\n159533,1818\n159533,1955\n159533,1962\n159533,2620\n159533,4237\n159533,8537\n159533,182162\n159534,298\n159535,349\n159536,1370\n159537,435\n159538,406\n159539,457\n159540,406\n159541,83\n159542,536\n159543,1821\n159544,159545\n159546,697\n159547,3623\n159548,30\n159549,159550\n159551,843\n159552,843\n159553,240\n159554,8270\n159555,4903\n159556,358\n159557,1474\n159558,289\n159558,290\n159558,94134\n159559,390\n159560,30\n159562,4260\n159562,142430\n159562,142473\n159562,142879\n159563,1983\n159564,195\n159565,159566\n159567,83\n159568,605\n159569,330\n159570,151\n159571,949\n159572,557\n159573,862\n159574,577\n159575,2116\n159576,184\n159577,106954\n159578,106954\n159579,106954\n159580,602\n159581,306\n159581,307\n159582,602\n159583,1773\n159585,1773\n159586,1773\n159587,184\n159588,1773\n159589,137\n159590,875\n159591,1773\n159592,1773\n159593,171\n159594,1773\n159595,602\n159596,1773\n159597,697\n159598,77\n159599,202\n159600,1773\n159601,525\n159602,107\n159603,1309\n159604,138686\n159605,1881\n159606,175\n159607,1285\n159608,298\n159609,1298\n159610,83\n159611,631\n159612,294\n159614,113156\n159615,184\n159616,557\n159617,4594\n159618,149\n159619,159620\n159621,9457\n159622,159623\n159624,83\n159624,278\n159626,138686\n159627,175\n159628,298\n159629,640\n159630,159631\n159632,563\n159633,206\n159634,1235\n159634,1335\n159635,1773\n159636,2411\n159637,779\n159638,159639\n159640,2620\n159641,30\n159643,49057\n159644,1773\n159644,182728\n159645,1\n159646,2590\n159647,159648\n159649,872\n159650,1429\n159651,920\n159652,247\n159654,159655\n159656,668\n159657,159658\n159659,113156\n159660,159661\n159663,337\n159663,338\n159663,393\n159663,439\n159663,626\n159663,649\n159663,772\n159663,2367\n159664,1474\n159665,2506\n159666,301\n159666,968\n159666,1001\n159666,1837\n159666,2083\n159667,358\n159668,255\n159669,2506\n159670,424\n159671,1143\n159672,417\n159674,355\n159675,76096\n159676,344\n159676,671\n159676,1425\n159676,1619\n159676,23783\n159677,626\n159678,994\n159679,46\n159680,58\n159681,366\n159683,366\n159685,58\n159686,46\n159687,994\n159688,302\n159690,3555\n159693,280\n159693,733\n159693,17245\n159694,868\n159695,1891\n159696,868\n159697,233\n159698,58\n159699,994\n159700,46\n159701,2353\n159702,868\n159704,868\n159705,63471\n159707,349\n159708,1773\n159709,1631\n159710,310\n159712,41\n159712,1119\n159712,1462\n159712,8537\n159713,850\n159714,58\n159715,994\n159716,46\n159718,240\n159719,907\n159720,259\n159720,775\n159721,483\n159723,1284\n159725,433\n159726,240\n159726,818\n159727,356\n159727,852\n159727,5591\n159728,1293\n159729,500\n159730,450\n159731,302\n159732,1359\n159734,138686\n159735,175\n159736,1425\n159737,9015\n159738,298\n159739,2671\n159740,2775\n159741,447\n159742,68\n159743,30\n159743,175\n159743,227\n159743,1179\n159743,2782\n159743,3148\n159743,6051\n159743,8501\n159743,14472\n159743,27834\n159745,1238\n159746,772\n159747,1117\n159748,30\n159749,704\n159750,4260\n159751,4411\n159752,675\n159752,784\n159752,76096\n159753,392\n159753,1454\n159753,1572\n159753,3804\n159754,1417\n159755,1274\n159758,251\n159760,159761\n159762,31206\n159763,58\n159764,994\n159765,46\n159766,1556\n159767,1749\n159768,4771\n159770,3\n159771,1452\n159772,760\n159773,83\n159774,48\n159775,360\n159776,332\n159777,135\n159778,779\n159778,68069\n159778,86832\n159778,141912\n159779,138686\n159780,175\n159781,298\n159782,535\n159785,163\n159785,6303\n159786,202\n159787,4611\n159788,1326\n159789,16687\n159790,5591\n159791,1773\n159793,104\n159793,254\n159793,557\n159793,953\n159793,954\n159793,1939\n159794,222\n159794,657\n159794,1140\n159794,2266\n159795,159796\n159797,30\n159798,516\n159799,30\n159801,1070\n159802,726\n159803,907\n159804,356\n159805,1608\n159806,1132\n159807,192\n159807,195\n159807,406\n159807,422\n159807,620\n159807,1181\n159808,397\n159809,159810\n159811,159810\n159812,195\n159813,313\n159815,1773\n159819,392\n159822,159823\n159824,222\n159825,254\n159826,159827\n159828,30\n159829,920\n159830,2944\n159831,1773\n159832,261\n159834,159835\n159836,159835\n159837,536\n159839,861\n159840,1707\n159841,44\n159842,1858\n159843,1860\n159844,875\n159845,1773\n159846,3\n159847,2620\n159848,159365\n159849,393\n159850,435\n159851,126\n159851,649\n159851,731\n159852,1858\n159853,1860\n159854,779\n159855,673\n159856,2146\n159857,1715\n159858,2048\n159859,2048\n159860,349\n159861,3507\n159862,159863\n159864,843\n159865,907\n159866,467\n159867,54\n159867,278\n159867,304\n159867,392\n159867,577\n159867,589\n159867,626\n159867,859\n159867,932\n159867,1151\n159867,1175\n159867,1212\n159867,1289\n159867,1298\n159867,1309\n159867,1479\n159867,1509\n159867,1634\n159867,1871\n159867,2421\n159867,3585\n159867,9015\n159867,14483\n159867,14797\n159867,189266\n159868,1749\n159869,932\n159870,779\n159871,1285\n159873,1298\n159874,149\n159874,406\n159875,83\n159876,146\n159877,647\n159878,344\n159879,2775\n159880,447\n159881,602\n159882,159883\n159884,1639\n159885,3\n159886,392\n159886,1143\n159886,1240\n159886,2699\n159887,1284\n159888,2083\n159889,4571\n159890,19010\n159891,611\n159892,1287\n159894,435\n159895,467\n159896,138686\n159897,175\n159898,298\n159899,13661\n159900,420\n159901,859\n159903,1274\n159904,5874\n159904,6955\n159905,83\n159906,467\n159906,868\n159907,843\n159908,41\n159908,328\n159908,704\n159908,760\n159908,784\n159908,805\n159908,1149\n159908,1285\n159908,1402\n159908,1631\n159908,8180\n159908,232709\n159909,30\n159910,269\n159912,1773\n159913,159914\n159915,536\n159916,1509\n159917,340\n159917,668\n159918,1181\n159919,957\n159920,1238\n159921,225\n159921,248\n159922,885\n159922,13704\n159923,118\n159923,4597\n159924,159925\n159926,58\n159926,217\n159926,1449\n159926,1612\n159926,1983\n159927,8719\n159928,138\n159929,865\n159930,557\n159931,137\n159932,88820\n159933,118\n159933,4597\n159934,137\n159935,1298\n159936,809\n159937,99\n159938,1274\n159945,3\n159946,159947\n159948,483\n159949,622\n159950,516\n159951,252\n159952,1220\n159952,1222\n159953,973\n159954,49057\n159954,81070\n159955,1983\n159956,450\n159956,2719\n159957,30\n159959,861\n159960,8719\n159961,138\n159962,865\n159963,557\n159964,137\n159965,118\n159965,4597\n159966,88820\n159968,557\n159969,920\n159970,718\n159971,171\n159973,34\n159973,35\n159974,159975\n159976,298\n159977,485\n159978,7416\n159980,4571\n159982,184\n159983,222\n159984,87\n159984,217\n159984,392\n159984,595\n159984,872\n159984,1572\n159984,2274\n159985,332\n159986,159987\n159988,2979\n159989,760\n159990,358\n159992,2506\n159993,485\n159994,37\n159995,994\n159996,158\n159997,1298\n159998,1298\n159999,269\n160000,211\n160001,160002\n160003,160002\n160004,160005\n160006,536\n160006,4672\n160007,147\n160008,1\n160009,160010\n160009,172108\n160011,160012\n160013,160012\n160014,160012\n160015,640\n160016,289\n160016,290\n160016,94134\n160017,626\n160018,225\n160019,160020\n160021,160020\n160022,160020\n160023,160020\n160024,160020\n160025,356\n160026,366\n160028,160029\n160030,292\n160030,644\n160030,1012\n160030,2699\n160030,5469\n160031,160032\n160033,233\n160034,355\n160035,452\n160036,8884\n160037,160038\n160039,1773\n160039,132423\n160039,160040\n160039,207905\n160039,212200\n160039,213441\n160039,213442\n160039,213443\n160039,213444\n160039,213445\n160039,213452\n160039,213455\n160039,214970\n160039,216375\n160039,216796\n160039,216911\n160039,216919\n160040,1773\n160041,99\n160042,1085\n160043,485\n160044,298\n160045,160046\n160047,726\n160048,726\n160049,726\n160050,760\n160051,994\n160052,1639\n160053,1359\n160054,83\n160056,485\n160057,298\n160058,760\n160059,4\n160059,5\n160060,408\n160061,1323\n160062,102\n160063,1326\n160064,760\n160065,1016\n160066,72\n160067,200\n160068,893\n160070,1983\n160071,167\n160072,760\n160073,640\n160074,1564\n160074,2620\n160074,5718\n160075,687\n160075,861\n160075,893\n160077,142405\n160078,160079\n160080,875\n160081,99\n160082,622\n160083,1177\n160084,483\n160085,99\n160086,83\n160087,602\n160088,160089\n160090,760\n160091,151\n160092,2989\n160092,2991\n160093,483\n160094,602\n160095,760\n160096,136\n160097,760\n160098,760\n160099,7416\n160100,388\n160101,714\n160102,760\n160103,160104\n160105,596\n160106,949\n160107,640\n160108,160109\n160110,1010\n160112,160113\n160114,160113\n160115,160116\n160117,1210\n160118,160119\n160120,160121\n160122,10\n160123,30\n160124,160125\n160126,160127\n160128,160129\n160130,160131\n160132,160133\n160134,1544\n160135,160136\n160138,1707\n160139,160140\n160141,160142\n160143,65\n160145,72\n160146,233\n160147,355\n160148,107\n160149,2416\n160149,2417\n160150,292\n160151,338\n160153,298\n160154,8180\n160155,1631\n160156,1133\n160157,3538\n160158,160159\n160160,160161\n160162,1133\n160162,103860\n160163,505\n160163,5913\n160163,13556\n160163,14289\n160163,21394\n160163,157904\n160163,207659\n160165,160166\n160167,760\n160168,1052\n160169,1893\n160170,160171\n160172,760\n160174,160175\n160176,160175\n160177,160175\n160178,160175\n160180,310\n160181,160182\n160183,72\n160184,217\n160185,261\n160185,372\n160185,390\n160186,1298\n160187,1773\n160188,160189\n160190,535\n160191,408\n160192,1323\n160193,1326\n160194,102\n160195,631\n160196,160197\n160196,162238\n160198,44\n160199,55849\n160200,55849\n160201,1212\n160202,154408\n160203,48\n160204,346\n160205,55849\n160206,30\n160207,55849\n160208,160209\n160210,50\n160211,160212\n160213,310\n160214,160215\n160216,483\n160217,30\n160220,2260\n160221,779\n160222,344\n160223,647\n160224,146\n160225,1425\n160226,920\n160227,4545\n160227,139010\n160228,160229\n160230,160231\n160232,875\n160233,99\n160235,657\n160237,1282\n160238,457\n160239,160240\n160241,366\n160242,557\n160243,557\n160245,160246\n160247,509\n160247,872\n160247,127158\n160248,8180\n160249,358\n160250,336\n160250,1803\n160251,422\n160252,422\n160253,422\n160254,422\n160255,422\n160256,422\n160257,422\n160258,422\n160259,422\n160260,422\n160261,160262\n160263,50\n160264,187\n160265,73938\n160266,1707\n160267,1252\n160267,1253\n160269,1985\n160270,1773\n160273,269\n160274,142473\n160277,30\n160278,31977\n160279,3623\n160280,389\n160281,8855\n160282,309\n160282,310\n160283,72\n160283,184\n160284,72\n160285,328\n160286,30\n160287,217\n160287,267\n160287,872\n160287,1118\n160287,1796\n160289,772\n160290,160291\n160292,346\n160293,843\n160294,292\n160295,294\n160296,296\n160297,298\n160298,160299\n160300,160299\n160301,83\n160302,147\n160303,671\n160304,184\n160305,83\n160306,41\n160307,160308\n160310,233\n160311,355\n160312,259\n160313,99\n160314,1844\n160315,875\n160316,366\n160317,160318\n160320,138686\n160322,5034\n160323,160324\n160326,30\n160327,30\n160328,397\n160329,2867\n160329,2868\n160331,99\n160332,160333\n160334,1238\n160335,309\n160335,310\n160336,211\n160337,640\n160338,1452\n160339,1572\n160339,2116\n160341,333\n160342,259\n160343,1212\n160345,631\n160346,392\n160347,875\n160348,3623\n160349,673\n160350,779\n160351,1132\n160352,1608\n160353,217\n160354,1132\n160355,1608\n160356,875\n160357,56\n160357,422\n160357,92476\n160358,149\n160361,875\n160362,15\n160362,58\n160362,994\n160362,3538\n160362,7360\n160363,328\n160364,4611\n160365,1544\n160366,138686\n160367,175\n160368,298\n160369,8855\n160370,868\n160371,1436\n160372,30\n160372,313\n160373,301\n160373,1293\n160373,3422\n160373,229644\n160374,83\n160375,3\n160375,16687\n160378,1240\n160379,16687\n160381,477\n160382,640\n160383,16687\n160384,994\n160385,3623\n160386,146\n160387,1085\n160388,1085\n160389,4260\n160390,158\n160391,477\n160392,994\n160393,15\n160395,264\n160396,10\n160397,760\n160398,55233\n160399,393\n160401,3623\n160402,1117\n160403,360\n160403,1893\n160404,1572\n160405,3623\n160406,872\n160407,1608\n160409,140\n160409,1010\n160409,1298\n160410,636\n160410,1807\n160411,83\n160412,48\n160412,349\n160412,809\n160413,160414\n160415,217\n160415,536\n160416,760\n160417,79\n160418,3623\n160419,160420\n160421,671\n160422,1267\n160423,1163\n160423,1789\n160425,160426\n160427,861\n160427,2116\n160428,34\n160428,35\n160429,160430\n160431,1132\n160432,1608\n160433,136\n160435,99\n160439,577\n160440,760\n160441,433\n160441,907\n160442,4218\n160443,843\n160445,41\n160446,3769\n160447,483\n160448,808\n160448,1639\n160449,1274\n160450,48\n160450,58\n160450,104\n160450,111\n160450,248\n160450,264\n160450,312\n160450,442\n160450,503\n160450,557\n160450,636\n160450,749\n160450,801\n160450,862\n160450,1016\n160450,1082\n160450,1147\n160450,1149\n160450,1257\n160450,1267\n160450,1282\n160450,1332\n160450,1381\n160450,1466\n160450,1564\n160450,1659\n160450,1745\n160450,1807\n160450,1882\n160450,1955\n160450,1962\n160450,2205\n160450,3115\n160450,3135\n160450,3474\n160450,33424\n160452,422\n160453,422\n160454,422\n160455,72\n160456,344\n160457,285\n160458,269\n160459,160460\n160461,406\n160462,422\n160463,422\n160464,422\n160465,422\n160466,422\n160467,422\n160468,422\n160469,422\n160470,2373\n160471,83\n160472,273\n160473,1179\n160474,477\n160475,1326\n160476,44\n160477,663\n160478,41\n160479,1118\n160480,3623\n160481,2373\n160482,1773\n160483,1893\n160484,714\n160486,99\n160487,809\n160488,217\n160489,3507\n160490,86\n160490,388\n160490,589\n160490,1284\n160490,1522\n160490,1844\n160491,3623\n160492,142430\n160492,142879\n160493,1274\n160494,1801\n160495,932\n160496,941\n160496,1149\n160497,516\n160498,22\n160498,247\n160498,14472\n160499,2048\n160500,389\n160502,87\n160503,63\n160504,2590\n160505,240\n160506,3\n160506,1467\n160506,16687\n160507,1419\n160508,875\n160509,588\n160509,590\n160510,83\n160511,252\n160512,252\n160513,1893\n160514,1465\n160515,505\n160516,875\n160517,328\n160518,248\n160519,515\n160520,106\n160520,1370\n160522,138686\n160523,32751\n160524,175\n160525,1564\n160526,1564\n160528,298\n160529,1274\n160529,1634\n160530,192\n160531,48\n160532,30\n160533,2116\n160534,994\n160535,3623\n160536,925\n160537,850\n160538,392\n160539,640\n160539,1175\n160540,151\n160541,424\n160542,151\n160543,30\n160545,1274\n160545,1634\n160546,920\n160547,72\n160547,312\n160547,1052\n160547,2605\n160549,1140\n160550,118\n160550,422\n160550,4597\n160551,994\n160552,1\n160553,287\n160554,278\n160555,13980\n160556,640\n160557,1551\n160558,447\n160559,2775\n160560,192\n160560,3872\n160561,1773\n160562,805\n160564,160565\n160566,1436\n160567,4490\n160568,83\n160568,278\n160569,72\n160570,344\n160571,285\n160572,68069\n160573,571\n160574,240\n160576,30236\n160577,113156\n160578,83\n160579,1844\n160579,5405\n160580,994\n160581,994\n160582,233\n160583,861\n160584,217\n160585,579\n160586,1556\n160587,302\n160588,146\n160589,647\n160590,344\n160591,255\n160592,255\n160593,171\n160594,861\n160594,1287\n160594,3148\n160595,255\n160596,1479\n160597,1381\n160598,647\n160599,146\n160600,344\n160601,1474\n160602,358\n160604,1707\n160605,557\n160606,1247\n160607,1247\n160608,34\n160608,35\n160608,83\n160609,30\n160610,447\n160611,2775\n160612,1773\n160613,3252\n160614,4637\n160615,344\n160615,142433\n160616,843\n160617,8270\n160618,994\n160619,138686\n160620,175\n160621,298\n160622,34\n160622,35\n160623,801\n160624,15\n160625,30\n160626,171\n160627,72\n160628,1659\n160629,30\n160630,479\n160630,1289\n160630,1381\n160630,1551\n160631,3003\n160631,3258\n160631,3653\n160632,1298\n160633,160634\n160635,160634\n160636,2116\n160637,30\n160638,749\n160639,932\n160640,435\n160641,843\n160642,30\n160643,1007\n160644,22\n160645,160646\n160647,72\n160648,577\n160649,356\n160650,247\n160651,54\n160652,160653\n160654,2244\n160655,175\n160656,1381\n160656,2292\n160657,83\n160658,30\n160659,366\n160660,366\n160661,366\n160662,1773\n160663,2590\n160664,2590\n160665,1001\n160666,77\n160667,200\n160667,772\n160667,1332\n160668,167\n160668,301\n160668,2083\n160669,1467\n160670,872\n160671,207\n160672,1429\n160673,48\n160674,10\n160675,388\n160676,586\n160677,2424\n160678,150022\n160679,668\n160680,306\n160680,307\n160681,1419\n160681,3297\n160682,640\n160683,745\n160684,1181\n160685,355\n160686,745\n160687,1849\n160688,3\n160688,230509\n160688,230517\n160689,118336\n160690,1224\n160691,781\n160692,1132\n160693,783\n160693,2737\n160694,893\n160695,4611\n160696,1544\n160697,671\n160698,336\n160698,1803\n160698,21442\n160699,141292\n160701,233\n160702,893\n160703,13980\n160704,1782\n160705,3612\n160706,1860\n160707,595\n160708,392\n160709,2274\n160710,4760\n160711,6059\n160712,5658\n160713,4252\n160714,623\n160715,697\n160716,6955\n160717,1151\n160718,2373\n160720,142433\n160721,433\n160723,1014\n160724,631\n160725,355\n160726,313\n160726,1718\n160726,2646\n160726,5326\n160727,104\n160728,1789\n160729,294\n160730,1240\n160731,147\n160732,1634\n160733,79\n160734,160735\n160736,72\n160737,1143\n160738,379\n160738,2784\n160740,1849\n160741,972\n160742,72\n160743,8\n160743,48\n160743,86\n160743,178\n160743,340\n160743,483\n160743,647\n160743,707\n160743,3582\n160744,1033\n160745,718\n160746,1247\n160747,422\n160748,422\n160749,422\n160750,422\n160751,422\n160752,422\n160753,422\n160754,422\n160755,640\n160756,640\n160757,422\n160758,422\n160759,422\n160760,422\n160761,30\n160762,1160\n160763,160764\n160765,160766\n160767,83\n160768,406\n160769,206\n160770,158\n160770,406\n160770,779\n160771,160772\n160773,718\n160774,809\n160775,138686\n160776,175\n160777,160778\n160779,298\n160780,336\n160781,2671\n160782,118\n160782,4597\n160783,2116\n160784,2105\n160785,72\n160787,1776\n160787,118336\n160788,907\n160789,623\n160789,1805\n160790,433\n160791,30\n160792,1608\n160793,1132\n160794,1509\n160794,1551\n160795,72\n160796,344\n160797,285\n160798,222\n160799,433\n160800,1085\n160800,33424\n160801,6303\n160801,148742\n160802,1608\n160803,1132\n160804,30\n160805,119\n160805,347\n160805,364\n160805,372\n160805,455\n160805,525\n160805,626\n160805,805\n160805,907\n160805,1019\n160805,1274\n160805,1718\n160805,2553\n160806,3623\n160807,1133\n160808,557\n160809,34\n160809,35\n160809,18831\n160809,115474\n160810,1807\n160811,433\n160812,868\n160813,206\n160813,15119\n160816,217\n160816,1559\n160817,72\n160818,360\n160818,1893\n160820,240\n160821,760\n160822,72\n160823,344\n160824,285\n160825,301\n160825,1010\n160825,1241\n160825,1522\n160826,872\n160827,1118\n160828,1212\n160829,336\n160829,422\n160830,6303\n160831,687\n160831,1556\n160832,652\n160833,389\n160834,126\n160834,818\n160834,874\n160834,1293\n160834,1294\n160834,1326\n160835,994\n160836,2156\n160836,9343\n160837,1167\n160838,68\n160838,240\n160839,720\n160840,1149\n160841,160842\n160843,306\n160843,307\n160844,809\n160846,1323\n160847,30\n160848,63\n160849,1559\n160850,1541\n160851,1849\n160852,301\n160853,907\n160854,592\n160855,151\n160855,309\n160855,310\n160856,83\n160857,1467\n160858,636\n160861,818\n160862,160863\n160864,919\n160865,23783\n160866,2989\n160866,2991\n160868,152855\n160870,392\n160870,779\n160870,788\n160870,809\n160870,23287\n160870,127158\n160870,138686\n160870,207837\n160871,1274\n160872,160873\n160874,30\n160875,192\n160875,406\n160876,1893\n160876,49057\n160879,14193\n160880,68069\n160881,2590\n160882,31977\n160883,999\n160885,1130\n160886,1370\n160887,269\n160889,68069\n160890,72\n160891,3623\n160893,743\n160894,760\n160895,68\n160896,58\n160896,801\n160896,1140\n160897,1385\n160897,115659\n160898,973\n160899,7\n160900,2048\n160901,663\n160902,1458\n160903,406\n160904,138686\n160905,175\n160906,298\n160908,703\n160909,44\n160910,390\n160911,3623\n160912,336\n160912,118336\n160913,861\n160914,527\n160915,83\n160916,264\n160917,49057\n160918,483\n160919,298\n160920,485\n160921,932\n160922,240\n160923,301\n160923,1293\n160923,103860\n160924,592\n160925,83\n160925,2671\n160926,485\n160927,298\n160928,135\n160928,66297\n160929,160930\n160931,138686\n160932,175\n160933,301\n160934,298\n160935,3260\n160936,195\n160937,3\n160937,264\n160938,72\n160940,622\n160942,41\n160943,32751\n160944,18831\n160945,313\n160945,2646\n160946,160947\n160948,30\n160949,302\n160949,720\n160950,467\n160952,536\n160953,477\n160954,2719\n160955,83\n160956,217\n160956,2116\n160957,420\n160958,424\n160959,2750\n160960,171\n160961,907\n160962,163\n160962,346\n160964,138686\n160965,175\n160966,893\n160967,298\n160968,406\n160969,30\n160970,5366\n160971,417\n160971,483\n160971,2105\n160972,83\n160973,217\n160974,269\n160975,34\n160975,35\n160975,240\n160975,283\n160975,332\n160975,536\n160975,657\n160975,949\n160975,1019\n160975,1072\n160975,1539\n160975,1955\n160975,2168\n160975,2319\n160975,4594\n160976,171\n160977,557\n160978,267\n160979,2373\n160980,160981\n160982,72\n160983,160984\n160985,1773\n160986,2867\n160986,2868\n160987,994\n160988,392\n160989,160990\n160991,160990\n160992,160990\n160993,160990\n160994,160990\n160995,160990\n160996,1332\n160997,843\n160998,264\n160998,3538\n160998,5213\n160999,1631\n161000,3138\n161002,192\n161003,255\n161005,1509\n161006,467\n161007,207\n161008,1474\n161009,390\n161010,2421\n161011,358\n161012,406\n161013,843\n161013,1241\n161014,115659\n161015,19010\n161016,355\n161017,217\n161018,83\n161019,298\n161020,485\n161021,358\n161022,1984\n161022,3949\n161023,161024\n161025,113156\n161026,161027\n161028,34\n161028,35\n161028,83\n161028,158\n161028,217\n161028,278\n161028,313\n161028,634\n161028,660\n161028,852\n161028,1133\n161028,1313\n161028,1466\n161028,1467\n161028,1718\n161028,2224\n161028,2646\n161028,4637\n161028,5326\n161028,7092\n161029,72\n161030,19413\n161031,161032\n161033,536\n161034,86\n161035,79\n161036,142870\n161037,171\n161038,671\n161039,301\n161040,563\n161041,269\n161042,312\n161043,87\n161044,1309\n161046,563\n161047,346\n161048,356\n161049,536\n161050,161051\n161052,142405\n161053,1118\n161054,577\n161055,217\n161056,640\n161057,2116\n161058,2923\n161059,310\n161060,289\n161060,290\n161060,94134\n161061,920\n161062,330\n161063,332\n161064,202\n161065,1458\n161066,3041\n161067,640\n161068,467\n161069,366\n161070,366\n161071,366\n161072,2146\n161073,473\n161074,2073\n161075,1285\n161076,640\n161077,577\n161078,2590\n161079,640\n161080,50\n161081,355\n161082,72\n161083,344\n161084,285\n161086,422\n161087,56\n161088,161089\n161090,233\n161091,1267\n161092,119\n161094,118336\n161095,358\n161096,142870\n161097,1033\n161098,161099\n161101,310\n161102,2607\n161103,2146\n161104,714\n161105,1465\n161107,760\n161108,760\n161109,1238\n161110,422\n161111,805\n161112,640\n161113,1452\n161114,589\n161115,809\n161116,714\n161117,161118\n161119,749\n161120,1284\n161121,161122\n161123,1858\n161124,1860\n161125,4571\n161126,8072\n161128,994\n161129,626\n161130,422\n161131,422\n161132,422\n161133,422\n161134,422\n161135,422\n161136,422\n161137,422\n161138,422\n161139,920\n161140,138686\n161141,422\n161142,175\n161143,422\n161144,422\n161146,298\n161147,994\n161148,1639\n161149,994\n161151,171\n161153,450\n161154,1722\n161156,795\n161157,147\n161158,509\n161158,510\n161159,631\n161162,885\n161162,13704\n161163,83\n161164,328\n161164,22482\n161165,644\n161167,794\n161168,72\n161169,200\n161172,192\n161172,663\n161173,467\n161174,5405\n161175,142405\n161177,151\n161178,10\n161178,3111\n161179,2989\n161179,2991\n161180,596\n161181,389\n161181,920\n161181,3769\n161182,135\n161183,65\n161183,71\n161183,611\n161184,19010\n161185,171\n161185,1434\n161186,202\n161187,779\n161187,1033\n161187,1181\n161188,333\n161189,2424\n161192,106\n161192,2923\n161193,97\n161195,8270\n161197,634\n161197,6298\n161198,422\n161199,56\n161200,187\n161201,250\n161201,1684\n161202,113156\n161203,222\n161203,1467\n161203,2923\n161203,3524\n161204,515\n161205,161206\n161207,2224\n161208,146\n161209,358\n161210,252\n161210,493\n161211,1085\n161212,1479\n161213,202\n161214,393\n161215,1132\n161216,781\n161218,120\n161218,1210\n161218,1240\n161218,1466\n161219,1359\n161220,1070\n161221,118336\n161222,2590\n161223,30\n161224,127158\n161225,535\n161226,408\n161227,102\n161228,1323\n161229,1326\n161230,1849\n161231,3623\n161232,1749\n161233,83\n161234,56\n161235,422\n161236,388\n161237,8180\n161238,3367\n161239,1172\n161240,161241\n161242,1085\n161243,772\n161244,467\n161245,1210\n161246,298\n161247,485\n161248,1467\n161249,911\n161250,1313\n161251,1220\n161251,1222\n161252,516\n161253,252\n161254,1773\n161256,663\n161257,8854\n161258,158\n161259,3623\n161260,1240\n161261,843\n161262,1326\n161263,1949\n161265,10\n161266,907\n161267,2590\n161268,772\n161269,3623\n161270,1240\n161271,95554\n161272,315\n161272,538\n161273,422\n161274,7416\n161275,422\n161276,422\n161277,422\n161278,422\n161279,422\n161280,422\n161281,1893\n161282,211\n161283,422\n161285,422\n161286,422\n161287,120\n161288,422\n161289,433\n161289,467\n161289,1607\n161289,162599\n161290,2048\n161291,328\n161292,83\n161293,2620\n161294,622\n161295,623\n161296,175\n161297,68069\n161298,79\n161299,390\n161299,1580\n161300,1058\n161301,10\n161302,1858\n161303,1860\n161304,1392\n161305,932\n161306,217\n161307,1332\n161308,58\n161309,994\n161310,46\n161311,1007\n161312,1052\n161312,14550\n161313,515\n161314,207\n161316,1634\n161323,406\n161324,161325\n161326,30\n161328,663\n161330,483\n161333,994\n161334,314\n161334,788\n161336,872\n161338,1429\n161339,467\n161340,138686\n161341,175\n161343,298\n161347,287\n161349,72\n161350,151\n161351,247\n161351,2867\n161351,2868\n161352,5987\n161353,301\n161354,217\n161354,1417\n161355,3246\n161356,536\n161356,652\n161356,2784\n161357,34\n161357,35\n161358,161359\n161360,668\n161361,255\n161362,1515\n161363,217\n161364,138686\n161365,467\n161366,175\n161367,83\n161368,83\n161369,298\n161370,126\n161371,22\n161372,298\n161373,485\n161374,850\n161375,596\n161375,1465\n161376,1319\n161377,161378\n161379,1639\n161380,1274\n161381,483\n161382,364\n161382,2590\n161383,372\n161384,636\n161384,1844\n161385,1298\n161386,640\n161387,161388\n161389,2146\n161390,83\n161392,634\n161393,1309\n161394,5906\n161395,557\n161396,626\n161397,278\n161398,137\n161399,862\n161400,83\n161401,467\n161402,631\n161403,59021\n161404,435\n161405,843\n161406,86\n161407,602\n161408,1359\n161409,22\n161410,138686\n161411,1359\n161412,175\n161413,298\n161415,171\n161416,340\n161416,142426\n161417,1359\n161418,885\n161418,13704\n161419,1415\n161420,161421\n161422,289\n161422,290\n161422,94134\n161423,147\n161424,1052\n161425,920\n161426,252\n161426,1370\n161426,1877\n161427,1033\n161428,252\n161429,278\n161430,442\n161431,30\n161432,1143\n161433,563\n161434,3\n161435,161436\n161437,366\n161438,366\n161439,366\n161440,366\n161441,366\n161442,366\n161443,366\n161444,1001\n161444,5911\n161445,10\n161446,509\n161446,510\n161447,119\n161448,155481\n161449,161450\n161451,2105\n161452,5405\n161453,6424\n161454,19986\n161455,161456\n161457,255\n161458,636\n161459,30\n161460,66297\n161461,485\n161462,1235\n161462,1335\n161463,1326\n161464,200\n161465,355\n161466,107\n161466,417\n161466,3069\n161467,233\n161468,779\n161469,579\n161470,138686\n161471,175\n161472,298\n161473,59021\n161474,485\n161475,298\n161476,6661\n161477,147\n161478,222\n161479,1177\n161480,298\n161481,485\n161482,467\n161483,1130\n161484,788\n161485,1882\n161486,1012\n161488,1014\n161489,483\n161490,171\n161491,749\n161492,718\n161493,397\n161494,422\n161495,422\n161496,422\n161497,422\n161498,422\n161499,422\n161500,422\n161502,422\n161503,422\n161504,86\n161505,126\n161505,337\n161505,1370\n161506,422\n161507,422\n161508,422\n161509,929\n161512,1130\n161512,2373\n161513,872\n161515,83\n161516,2775\n161517,447\n161518,1566\n161519,83\n161519,356\n161519,388\n161519,750\n161519,1274\n161519,1454\n161519,1718\n161519,2168\n161519,5591\n161519,6068\n161519,37088\n161519,57354\n161520,309\n161520,310\n161521,626\n161521,2995\n161522,4611\n161525,1556\n161526,2931\n161527,640\n161528,130\n161529,130\n161530,687\n161531,1267\n161532,417\n161532,1085\n161533,130\n161534,240\n161534,877\n161534,145502\n161534,179804\n161535,8990\n161536,1707\n161538,138686\n161539,175\n161540,79\n161541,30331\n161542,298\n161543,3804\n161544,118\n161544,4597\n161545,4066\n161546,292\n161546,1274\n161549,2443\n161551,3129\n161552,752\n161553,1309\n161554,3328\n161555,264\n161555,301\n161555,1531\n161556,49057\n161557,130\n161558,138686\n161559,175\n161560,698\n161561,1392\n161562,298\n161563,83\n161564,3129\n161565,390\n161566,4611\n161567,298\n161568,485\n161569,3135\n161570,1955\n161571,81\n161571,192\n161571,2312\n161572,749\n161573,200\n161574,20\n161575,784\n161576,278\n161576,657\n161576,1019\n161576,3409\n161576,5911\n161576,8855\n161577,138686\n161578,118336\n161579,175\n161580,298\n161582,252\n161583,516\n161586,1955\n161587,83\n161588,1313\n161589,805\n161591,868\n161592,1127\n161592,49057\n161593,1220\n161593,1222\n161594,55849\n161595,2744\n161596,406\n161598,408\n161599,1323\n161600,1326\n161601,102\n161602,130\n161603,58\n161604,994\n161605,46\n161606,1836\n161607,775\n161608,143287\n161609,6303\n161610,1381\n161611,178\n161612,4691\n161613,1147\n161614,671\n161615,4218\n161616,2784\n161617,315\n161617,457\n161618,1001\n161619,83\n161620,493\n161620,3148\n161621,72\n161622,301\n161623,305\n161624,1285\n161625,1127\n161626,1210\n161627,760\n161629,34\n161629,35\n161630,1210\n161631,1370\n161632,2048\n161634,563\n161634,920\n161635,779\n161636,1805\n161636,207837\n161637,535\n161637,1010\n161638,83\n161639,30\n161640,83\n161641,1453\n161642,1309\n161643,130\n161643,1452\n161644,2411\n161645,483\n161646,7\n161646,3846\n161647,264\n161648,1432\n161649,44\n161650,932\n161651,953\n161652,104\n161653,704\n161654,178\n161655,72\n161656,10\n161657,30\n161659,1\n161659,2443\n161659,6955\n161660,647\n161661,433\n161662,2784\n161663,23783\n161665,6695\n161666,83\n161667,634\n161668,138686\n161669,175\n161670,184\n161671,72\n161672,298\n161673,4637\n161674,30\n161675,10\n161676,30\n161677,907\n161678,2744\n161679,6726\n161680,77\n161681,55849\n161682,55849\n161683,536\n161684,192\n161684,309\n161684,310\n161685,852\n161686,30\n161687,467\n161688,406\n161689,2424\n161690,49057\n161691,55849\n161692,2989\n161692,2991\n161693,2784\n161694,81\n161695,435\n161696,1235\n161696,1335\n161697,217\n161698,30\n161699,289\n161699,290\n161699,94134\n161700,1132\n161701,781\n161702,781\n161703,1132\n161704,697\n161705,557\n161706,1132\n161707,781\n161708,134\n161709,843\n161710,1282\n161711,1181\n161712,3\n161713,6303\n161714,130\n161715,358\n161716,217\n161717,192\n161718,1257\n161719,358\n161721,557\n161722,862\n161724,107\n161724,745\n161724,2678\n161725,693\n161726,30\n161727,1474\n161728,527\n161729,278\n161730,296\n161731,1\n161732,240\n161733,79\n161734,726\n161734,3967\n161735,704\n161736,2775\n161737,2373\n161738,267\n161739,2116\n161740,2944\n161741,30\n161742,278\n161743,2646\n161744,885\n161744,13704\n161745,49057\n161746,726\n161747,726\n161748,30\n161749,1419\n161750,2828\n161751,49057\n161752,1688\n161753,217\n161753,1417\n161754,760\n161755,4594\n161756,516\n161757,1266\n161757,5714\n161758,118\n161758,4597\n161759,68069\n161760,142870\n161761,693\n161762,7614\n161763,577\n161764,298\n161765,485\n161766,760\n161767,298\n161768,485\n161770,1551\n161771,760\n161772,760\n161773,22924\n161774,563\n161775,900\n161776,862\n161777,269\n161778,118\n161778,4597\n161779,202\n161780,581\n161782,1001\n161783,30\n161784,1509\n161785,760\n161786,611\n161787,760\n161788,161789\n161791,30\n161792,2590\n161793,58\n161794,850\n161795,151\n161796,1634\n161797,4545\n161797,139010\n161798,247\n161800,207\n161801,1634\n161802,872\n161803,30\n161804,602\n161805,2626\n161806,30\n161807,1429\n161808,255\n161809,1247\n161809,1363\n161809,164572\n161811,366\n161812,668\n161813,366\n161814,366\n161815,366\n161816,366\n161817,366\n161818,366\n161819,366\n161820,366\n161821,355\n161822,994\n161823,58\n161824,994\n161825,46\n161826,30\n161827,30\n161828,920\n161829,233\n161830,1858\n161831,1860\n161832,130\n161832,36819\n161833,58\n161834,46\n161835,994\n161836,58\n161837,994\n161838,46\n161839,161840\n161839,178035\n161841,784\n161842,1181\n161843,467\n161843,868\n161843,162599\n161844,874\n161845,781\n161846,1132\n161847,640\n161848,861\n161849,1143\n161850,994\n161851,3182\n161852,171\n161854,298\n161855,485\n161856,202\n161856,493\n161857,13136\n161858,1282\n161860,726\n161861,19443\n161862,187\n161863,873\n161864,422\n161865,366\n161866,500\n161867,422\n161868,56\n161869,146\n161870,647\n161871,344\n161872,760\n161872,1631\n161873,1388\n161875,298\n161876,485\n161877,156379\n161878,859\n161879,2671\n161880,809\n161881,779\n161882,4260\n161882,143287\n161883,515\n161884,22\n161885,422\n161886,422\n161887,433\n161888,422\n161889,422\n161890,422\n161891,422\n161893,390\n161894,422\n161895,422\n161896,422\n161897,422\n161898,422\n161899,1238\n161900,30\n161901,726\n161902,2812\n161903,138686\n161904,175\n161905,298\n161907,358\n161908,447\n161909,2775\n161910,5708\n161911,1298\n161912,146\n161913,1639\n161915,415\n161915,1849\n161915,2083\n161916,81070\n161917,422\n161918,422\n161919,72\n161919,104\n161919,147\n161919,592\n161919,1010\n161919,1289\n161920,1452\n161921,1132\n161922,781\n161923,22\n161924,217\n161925,49057\n161926,577\n161927,83\n161928,1955\n161929,1381\n161930,1001\n161931,1117\n161933,392\n161934,2775\n161935,447\n161936,22\n161937,393\n161939,1363\n161940,240\n161940,8180\n161941,83\n161941,217\n161941,261\n161941,379\n161941,536\n161941,694\n161941,1072\n161941,1467\n161941,2421\n161941,2784\n161941,13546\n161942,868\n161943,1749\n161944,22\n161946,17346\n161947,1572\n161947,4771\n161948,1313\n161949,1326\n161950,49057\n161951,227\n161952,49057\n161953,1773\n161954,1756\n161955,585\n161955,718\n161956,161957\n161959,251\n161960,406\n161960,1515\n161962,602\n161964,1001\n161965,1707\n161966,602\n161967,49057\n161968,215\n161969,602\n161970,22\n161971,760\n161972,49057\n161974,138686\n161975,175\n161976,30\n161978,298\n161979,298\n161980,485\n161981,602\n161982,298\n161983,485\n161984,3582\n161985,1844\n161986,211\n161986,366\n161986,640\n161987,21442\n161988,161989\n161990,222\n161991,1449\n161991,1927\n161992,1881\n161993,1363\n161994,536\n161995,72\n161996,602\n161997,355\n161998,349\n161998,392\n161998,697\n161999,718\n162000,340\n162002,994\n162003,602\n162004,35750\n162004,35751\n162005,58\n162006,46\n162007,994\n162008,192\n162008,406\n162008,620\n162008,818\n162008,1370\n162008,2371\n162008,103698\n162008,118336\n162008,127158\n162009,30\n162009,682\n162009,772\n162009,72439\n162010,192\n162011,336\n162012,726\n162013,697\n162014,22\n162015,130\n162017,634\n162019,1707\n162020,4611\n162021,1167\n162022,2590\n162023,22\n162024,15\n162025,1\n162026,217\n162026,1417\n162027,749\n162028,1252\n162028,1253\n162029,162030\n162031,2048\n162032,154408\n162033,44\n162034,1284\n162035,592\n162036,162037\n162038,843\n162039,22\n162040,1151\n162041,417\n162042,19010\n162043,309\n162043,310\n162044,162045\n162046,1381\n162047,58\n162047,71\n162047,1449\n162047,1612\n162047,2590\n162047,5718\n162048,30\n162050,1163\n162051,994\n162052,34\n162052,35\n162052,217\n162053,30\n162054,2367\n162055,1985\n162055,8270\n162055,32475\n162055,67343\n162056,525\n162057,30\n162058,79\n162059,162060\n162061,4453\n162062,707\n162063,1212\n162064,1052\n162065,49057\n162066,628\n162067,83\n162068,760\n162069,1033\n162070,2168\n162071,142870\n162072,162073\n162074,483\n162075,1893\n162076,932\n162077,1452\n162078,1659\n162079,861\n162080,65\n162081,34\n162081,35\n162082,1499\n162083,252\n162084,1220\n162084,1222\n162085,516\n162086,467\n162087,21442\n162088,2266\n162089,147\n162090,162091\n162092,615\n162093,30\n162094,8719\n162095,159365\n162096,138\n162097,865\n162098,557\n162099,222\n162100,3\n162101,137\n162102,118\n162102,4597\n162103,30\n162104,88820\n162105,113156\n162106,346\n162107,137\n162108,3623\n162109,1132\n162110,781\n162111,760\n162112,2146\n162113,162114\n162115,30\n162116,215\n162117,996\n162118,30\n162119,30\n162120,875\n162121,240\n162121,301\n162121,631\n162121,775\n162121,1785\n162122,49057\n162123,3623\n162124,467\n162125,3623\n162126,178\n162126,1033\n162127,323\n162128,18831\n162129,3623\n162130,8270\n162131,323\n162132,200\n162132,1212\n162133,4611\n162134,760\n162135,162136\n162137,1276\n162138,162139\n162141,4691\n162142,809\n162143,255\n162144,3\n162146,162147\n162148,171\n162149,485\n162150,298\n162151,1298\n162152,79\n162153,72\n162154,134\n162155,525\n162156,1309\n162157,1285\n162158,151\n162159,298\n162160,485\n162161,631\n162162,294\n162163,557\n162164,2590\n162165,2590\n162166,557\n162168,147\n162168,158\n162170,7316\n162172,932\n162173,3148\n162174,217\n162174,1417\n162175,1240\n162176,222\n162177,1566\n162178,8463\n162179,788\n162179,852\n162180,663\n162181,489\n162182,1265\n162182,1266\n162183,1085\n162184,885\n162184,13704\n162185,298\n162186,485\n162187,30\n162188,1882\n162189,298\n162190,485\n162191,332\n162192,2367\n162193,485\n162194,298\n162195,663\n162196,22\n162197,1212\n162198,577\n162199,138686\n162200,420\n162201,175\n162202,30\n162203,50\n162204,298\n162205,875\n162206,657\n162207,477\n162208,346\n162209,516\n162210,1474\n162211,2373\n162212,358\n162213,30\n162214,30\n162215,267\n162216,81\n162217,388\n162218,86\n162219,86\n162220,86\n162221,22580\n162222,280\n162222,17245\n162223,22580\n162224,151\n162225,900\n162226,30\n162227,3623\n162228,30\n162229,3623\n162230,30\n162231,2590\n162232,225\n162233,162234\n162235,1085\n162236,622\n162237,30\n162239,162240\n162241,8884\n162242,589\n162242,1001\n162243,1085\n162244,5343\n162245,30\n162246,3623\n162247,30\n162248,3623\n162249,2073\n162250,233\n162251,355\n162253,366\n162254,366\n162255,366\n162256,1238\n162257,298\n162258,485\n162259,366\n162260,366\n162261,366\n162262,187\n162263,118\n162263,4597\n162264,8992\n162265,2116\n162266,275\n162267,22\n162268,5366\n162269,585\n162270,1551\n162272,79\n162273,49057\n162274,30\n162275,718\n162276,1247\n162277,192\n162277,1089\n162278,8270\n162279,8991\n162280,30\n162281,200\n162282,264\n162283,30\n162284,30\n162285,30\n162286,30\n162287,24505\n162288,30\n162289,30\n162290,83\n162291,1707\n162292,3209\n162293,2266\n162294,118\n162294,333\n162294,33424\n162295,1893\n162296,30\n162297,3623\n162298,3623\n162299,162300\n162299,197504\n162301,577\n162302,872\n162303,3079\n162304,162305\n162306,72\n162307,162308\n162309,72\n162311,3724\n162312,30\n162313,298\n162314,483\n162315,932\n162316,195\n162317,1773\n162318,994\n162319,162320\n162321,1773\n162322,1240\n162323,509\n162324,30\n162325,1359\n162326,2590\n162327,485\n162328,298\n162329,146\n162329,92476\n162330,346\n162331,2224\n162332,240\n162333,30\n162334,1479\n162335,22\n162336,390\n162338,760\n162339,346\n162340,298\n162341,30\n162342,760\n162343,72\n162344,358\n162345,4611\n162346,207\n162347,3623\n162348,872\n162349,1429\n162350,749\n162351,30\n162352,30\n162353,298\n162354,485\n162355,668\n162356,30\n162357,346\n162358,760\n162359,72\n162360,22580\n162361,1773\n162362,65\n162363,2775\n162364,447\n162365,447\n162366,2775\n162367,30\n162368,72\n162369,30\n162370,162371\n162372,640\n162373,1143\n162374,2146\n162375,178\n162376,162377\n162378,346\n162379,355\n162380,107\n162381,2416\n162381,2417\n162382,292\n162383,338\n162384,298\n162385,1133\n162386,3538\n162387,366\n162388,366\n162389,366\n162390,366\n162391,366\n162392,366\n162393,298\n162394,485\n162395,346\n162396,1572\n162397,872\n162398,269\n162399,167\n162400,304\n162400,2334\n162401,3297\n162402,41\n162403,22\n162404,22\n162405,586\n162406,1871\n162407,1983\n162408,483\n162409,760\n162410,918\n162411,918\n162412,72\n162413,455\n162414,623\n162415,30\n162416,346\n162417,994\n162418,72\n162419,72\n162420,346\n162421,932\n162422,868\n162423,1983\n162424,2506\n162425,30\n162426,872\n162427,872\n162428,1608\n162429,872\n162430,8463\n162431,1983\n162432,10\n162432,113156\n162433,2797\n162434,332\n162435,158\n162435,596\n162435,1368\n162437,1769\n162438,240\n162439,557\n162440,557\n162441,1983\n162442,142405\n162443,1983\n162444,30\n162445,55849\n162446,255\n162447,644\n162448,222\n162448,588\n162448,590\n162448,1419\n162449,485\n162450,298\n162451,1289\n162452,171\n162454,485\n162455,298\n162456,372\n162456,1085\n162457,142473\n162458,162459\n162460,1659\n162461,749\n162462,137\n162463,145751\n162464,175\n162465,30\n162466,1203\n162467,795\n162468,273\n162469,83\n162470,83\n162471,360\n162472,292\n162473,294\n162474,296\n162475,298\n162476,422\n162477,56\n162478,1149\n162479,1949\n162480,233\n162481,1118\n162482,355\n162483,152855\n162484,1252\n162484,1253\n162485,41\n162486,366\n162487,366\n162488,366\n162489,1238\n162490,298\n162491,485\n162492,1385\n162493,58\n162494,994\n162495,58\n162496,46\n162497,455\n162498,1452\n162499,149\n162499,1639\n162500,273\n162501,996\n162502,602\n162503,332\n162504,779\n162505,358\n162506,330\n162507,278\n162508,360\n162509,1639\n162510,424\n162511,1240\n162512,312\n162513,477\n162514,34\n162514,35\n162516,422\n162517,422\n162518,422\n162519,422\n162520,422\n162521,390\n162522,422\n162523,422\n162524,422\n162525,422\n162526,422\n162527,422\n162528,422\n162529,422\n162530,422\n162533,1467\n162534,671\n162535,784\n162536,148412\n162537,192\n162538,346\n162538,671\n162540,516\n162541,1220\n162541,1222\n162542,252\n162543,71\n162543,1782\n162543,256380\n162544,55849\n162545,718\n162546,760\n162547,309\n162547,310\n162547,1147\n162548,3\n162550,55849\n162551,162552\n162554,422\n162555,56\n162556,794\n162557,483\n162558,323\n162558,1052\n162558,1102\n162559,718\n162560,6627\n162561,483\n162564,83\n162568,44725\n162570,298\n162571,485\n162572,1179\n162572,28107\n162573,200\n162573,1962\n162574,68\n162574,685\n162574,849\n162574,1085\n162574,1844\n162574,26450\n162575,3623\n162576,875\n162579,358\n162580,155469\n162584,3623\n162585,155469\n162586,1453\n162587,5405\n162588,1146\n162589,3623\n162590,875\n162591,364\n162592,390\n162594,1252\n162594,1253\n162595,130\n162596,21442\n162597,49057\n162598,424\n162599,32\n162599,158\n162599,259\n162599,272\n162599,278\n162599,287\n162599,314\n162599,433\n162599,466\n162599,467\n162599,495\n162599,658\n162599,676\n162599,868\n162599,911\n162599,973\n162599,1011\n162599,1021\n162599,1130\n162599,1345\n162599,1368\n162599,1370\n162599,1373\n162599,1916\n162599,4251\n162599,5183\n162599,6059\n162599,6685\n162599,6990\n162599,8274\n162599,14304\n162599,16286\n162599,16357\n162599,16522\n162599,18203\n162599,18244\n162599,18248\n162599,18275\n162599,18310\n162599,18333\n162599,18397\n162599,18398\n162599,19854\n162599,20295\n162599,21540\n162599,22391\n162599,25395\n162599,26242\n162599,31280\n162599,32929\n162599,32978\n162599,35204\n162599,36920\n162599,38300\n162599,38733\n162599,43826\n162599,44157\n162599,46321\n162599,48404\n162599,50420\n162599,51794\n162599,55924\n162599,56334\n162599,64069\n162599,64722\n162599,68155\n162599,70870\n162599,76722\n162599,97423\n162599,98802\n162599,103238\n162599,108071\n162599,110510\n162599,116982\n162599,117115\n162599,120449\n162599,123074\n162599,124116\n162599,124942\n162599,126665\n162599,131808\n162599,136467\n162599,136501\n162599,137526\n162599,137663\n162599,143345\n162599,147489\n162599,150350\n162599,156264\n162599,156379\n162599,156931\n162599,158627\n162599,161289\n162599,161510\n162599,161843\n162599,162599\n162599,163934\n162599,165667\n162599,171259\n162599,172654\n162599,173761\n162599,175409\n162599,176082\n162599,176452\n162599,176609\n162599,177307\n162599,177315\n162599,177582\n162599,177818\n162599,177819\n162599,177960\n162599,178797\n162599,180970\n162599,182515\n162599,183815\n162599,183962\n162599,186105\n162599,188251\n162599,188406\n162599,188529\n162599,188830\n162599,189179\n162599,189204\n162599,189228\n162599,189786\n162599,191878\n162599,191879\n162599,191880\n162599,191881\n162599,191986\n162599,192662\n162599,192986\n162599,193418\n162599,194320\n162599,194433\n162599,194441\n162599,195535\n162599,195690\n162599,196167\n162599,197858\n162599,204581\n162599,207438\n162599,211911\n162599,211915\n162599,212099\n162599,214634\n162599,214736\n162599,214895\n162599,215343\n162599,216103\n162599,216713\n162599,219849\n162599,220396\n162599,220407\n162599,220521\n162599,222524\n162599,223741\n162599,224020\n162599,229068\n162599,229195\n162599,229839\n162599,229856\n162599,229946\n162599,230351\n162599,230585\n162599,231190\n162599,231763\n162599,233609\n162599,233618\n162599,233630\n162599,234064\n162599,234081\n162599,234736\n162599,234779\n162599,234790\n162599,234838\n162599,234866\n162599,235875\n162599,235951\n162599,235958\n162599,236062\n162599,236396\n162599,236922\n162599,236949\n162599,236950\n162599,237357\n162599,238098\n162599,238353\n162599,241535\n162599,244207\n162599,244705\n162599,245303\n162599,245595\n162599,247041\n162599,248574\n162599,248839\n162599,248856\n162599,249679\n162599,249767\n162599,250993\n162599,252506\n162599,252554\n162599,255210\n162599,255239\n162599,255243\n162599,255649\n162599,258519\n162599,260344\n162599,260558\n162599,260806\n162599,260811\n162599,262412\n162599,263287\n162599,263433\n162599,264383\n162599,264386\n162599,264392\n162601,4039\n162602,1400\n162603,718\n162605,577\n162605,138686\n162606,283\n162607,875\n162608,233\n162608,1616\n162608,2334\n162608,19010\n162609,356\n162609,843\n162610,309\n162610,310\n162612,3949\n162613,1175\n162614,636\n162615,1323\n162616,1326\n162617,102\n162618,408\n162619,875\n162621,622\n162622,358\n162623,1309\n162624,3328\n162625,5405\n162627,3129\n162628,3135\n162629,1955\n162630,1769\n162631,1\n162631,209\n162632,344\n162632,1512\n162632,5992\n162634,233\n162635,1769\n162636,760\n162637,34\n162637,35\n162637,2646\n162638,302\n162640,602\n162641,1127\n162641,1893\n162641,49057\n162642,30\n162643,142473\n162644,422\n162645,760\n162646,875\n162647,298\n162648,485\n162649,145240\n162650,358\n162651,113156\n162652,298\n162653,485\n162654,240\n162654,818\n162655,1983\n162656,1133\n162657,147\n162658,151\n162659,609\n162659,2775\n162662,2605\n162663,1635\n162664,5440\n162665,1509\n162667,117\n162667,250\n162667,1684\n162667,2712\n162667,3089\n162667,3524\n162667,4691\n162668,145240\n162669,2334\n162670,718\n162671,515\n162672,79\n162673,1068\n162674,30\n162675,2775\n162677,2775\n162678,2048\n162679,2775\n162681,932\n162682,156379\n162683,30\n162684,1782\n162685,2944\n162685,18831\n162686,1\n162687,30\n162689,30\n162690,302\n162690,893\n162691,30\n162694,392\n162697,893\n162698,113156\n162699,422\n162700,155469\n162701,772\n162705,349\n162706,3623\n162707,885\n162707,13704\n162708,1326\n162709,83\n162710,3161\n162711,30\n162712,113156\n162713,346\n162714,252\n162714,1220\n162714,1222\n162715,298\n162716,485\n162717,285\n162718,142430\n162719,392\n162720,2775\n162721,447\n162722,760\n162723,467\n162724,349\n162725,138686\n162726,175\n162727,56\n162728,422\n162729,920\n162730,298\n162731,72\n162732,439\n162732,103860\n162733,1\n162734,145240\n162735,760\n162736,72\n162737,422\n162738,56\n162739,663\n162739,877\n162739,1117\n162739,1284\n162739,124668\n162740,30\n162741,107\n162742,2105\n162743,2105\n162744,1179\n162745,30\n162746,1\n162747,30\n162748,72\n162749,4672\n162750,557\n162751,2775\n162752,447\n162753,620\n162754,2105\n162755,222\n162756,875\n162757,557\n162758,147\n162759,3\n162760,875\n162761,55849\n162762,2210\n162762,4237\n162763,302\n162764,302\n162765,477\n162766,875\n162767,657\n162768,1474\n162769,358\n162770,358\n162771,5375\n162773,72\n162775,875\n162777,640\n162778,406\n162779,640\n162780,862\n162781,640\n162782,146\n162783,344\n162783,1512\n162783,1888\n162783,5992\n162784,1544\n162784,2083\n162785,56\n162786,422\n162787,843\n162788,875\n162789,1590\n162790,264\n162790,1551\n162791,4611\n162792,83\n162792,87\n162792,818\n162792,985\n162792,1132\n162792,1313\n162793,72\n162794,500\n162795,175\n162796,346\n162797,19\n162797,2266\n162798,2116\n162799,818\n162800,72\n162801,1359\n162802,8308\n162803,358\n162804,255\n162805,30\n162806,247\n162807,6303\n162808,264\n162809,422\n162810,56\n162811,175\n162812,323\n162812,1052\n162812,1102\n162813,392\n162813,862\n162813,949\n162813,1240\n162813,1465\n162813,1564\n162813,2274\n162813,4637\n162813,8180\n162814,760\n162815,760\n162816,760\n162817,875\n162818,422\n162819,422\n162820,162821\n162820,204684\n162822,162823\n162824,390\n162824,467\n162824,4220\n162825,875\n162826,178\n162828,818\n162829,2590\n162830,577\n162831,366\n162832,366\n162833,366\n162834,366\n162835,366\n162836,366\n162838,207\n162840,493\n162840,3148\n162841,79\n162842,346\n162843,872\n162844,240\n162845,704\n162846,872\n162847,1429\n162848,13136\n162849,30\n162850,485\n162851,298\n162852,668\n162853,1893\n162854,779\n162855,358\n162855,1052\n162856,1381\n162857,760\n162858,269\n162859,233\n162860,1363\n162862,145240\n162863,422\n162864,56\n162865,403\n162865,693\n162866,2105\n162867,127158\n162868,818\n162869,795\n162870,217\n162871,360\n162872,273\n162872,1893\n162873,48\n162874,1332\n162875,44725\n162876,1224\n162877,344\n162877,5547\n162878,1118\n162879,1140\n162880,217\n162883,875\n162884,81\n162885,298\n162886,485\n162887,302\n162888,3135\n162889,392\n162891,2744\n162892,1353\n162895,147\n162896,422\n162897,422\n162898,422\n162899,422\n162900,422\n162901,1058\n162902,1962\n162904,422\n162905,422\n162906,422\n162907,920\n162908,422\n162909,422\n162910,422\n162911,422\n162912,3367\n162913,422\n162914,422\n162915,557\n162916,1368\n162917,1143\n162918,868\n162919,1466\n162920,217\n162921,489\n162922,1449\n162923,138686\n162924,175\n162925,794\n162926,298\n162927,2931\n162928,83\n162929,957\n162929,1247\n162929,1815\n162929,164572\n162931,1655\n162932,994\n162932,2168\n162932,2744\n162932,22293\n162933,1436\n162934,206\n162935,676\n162936,3135\n162937,4611\n162938,145502\n162938,145751\n162939,1326\n162940,336\n162941,992\n162942,457\n162943,22\n162944,135\n162944,682\n162944,72439\n162945,9457\n162946,452\n162947,65\n162947,71\n162947,272\n162947,611\n162948,1240\n162949,2671\n162951,349\n162952,457\n162955,358\n162956,30\n162957,920\n162958,285\n162958,1149\n162959,720\n162960,801\n162961,81070\n162962,146\n162963,647\n162964,344\n162965,1033\n162966,87\n162966,323\n162966,1143\n162966,2697\n162967,424\n162968,422\n162969,56\n162970,994\n162971,355\n162973,422\n162974,56\n162976,636\n162977,1837\n162978,752\n162978,1274\n162979,805\n162980,79\n162981,254\n162982,1274\n162983,83\n162986,56\n162987,422\n162988,298\n162989,485\n162991,272\n162993,254\n162994,136\n162994,137\n162995,142473\n162996,72764\n162997,269\n162998,406\n162999,149\n163001,18831\n163002,83\n163003,192\n163006,1983\n163008,779\n163010,124668\n163012,459\n163014,557\n163014,631\n163016,1531\n163017,77\n163017,557\n163018,585\n163018,1776\n163019,1181\n163020,298\n163021,485\n163022,65\n163022,217\n163023,3260\n163024,1836\n163025,130\n163026,571\n163027,875\n163028,406\n163029,1860\n163030,1858\n163031,289\n163031,290\n163031,94134\n163032,2073\n163033,497\n163034,918\n163035,2867\n163035,2868\n163036,202\n163037,1388\n163038,34\n163038,536\n163038,1571\n163038,2944\n163039,147\n163040,1167\n163041,32\n163042,805\n163043,1\n163043,3769\n163044,861\n163046,2590\n163047,302\n163048,2048\n163049,577\n163050,1860\n163051,1858\n163054,920\n163055,184\n163056,875\n163057,1284\n163057,148742\n163058,30\n163059,861\n163060,99\n163061,647\n163062,344\n163063,406\n163064,932\n163065,146\n163066,1255\n163066,1775\n163066,50943\n163066,171294\n163067,389\n163069,3138\n163070,44\n163072,893\n163073,1220\n163073,1222\n163074,516\n163075,252\n163076,138686\n163077,175\n163078,298\n163080,130\n163080,743\n163080,36819\n163081,83\n163081,119\n163081,222\n163081,278\n163081,285\n163081,347\n163081,364\n163081,366\n163081,372\n163081,389\n163081,417\n163081,455\n163081,525\n163081,626\n163081,795\n163081,805\n163081,907\n163081,949\n163081,972\n163081,1012\n163081,1019\n163081,1085\n163081,1274\n163081,1309\n163081,1363\n163081,1465\n163081,1467\n163081,1718\n163081,1756\n163081,1801\n163081,1881\n163081,2266\n163081,2286\n163081,2434\n163081,2553\n163081,2590\n163081,2646\n163081,2779\n163081,3507\n163081,4172\n163081,13575\n163081,141912\n163082,631\n163083,72\n163084,1392\n163085,1072\n163086,704\n163087,4611\n163088,1544\n163089,388\n163090,163091\n163092,8598\n163093,83\n163094,704\n163095,72\n163096,83\n163097,1220\n163097,1222\n163098,252\n163099,516\n163100,2371\n163101,4611\n163102,1544\n163104,535\n163106,56\n163107,422\n163108,3804\n163109,483\n163110,366\n163111,366\n163112,366\n163113,366\n163114,422\n163114,1623\n163115,2411\n163116,294\n163118,273\n163119,779\n163120,1149\n163120,1635\n163121,779\n163122,704\n163123,372\n163124,83\n163125,34\n163125,35\n163125,217\n163125,389\n163125,455\n163125,536\n163125,1019\n163126,107\n163128,217\n163129,68069\n163130,852\n163131,509\n163132,585\n163133,1968\n163134,422\n163135,56\n163136,7\n163136,2931\n163137,7416\n163138,310\n163138,3039\n163139,1572\n163140,146\n163140,92476\n163141,647\n163142,344\n163143,1132\n163144,1608\n163145,83\n163146,156379\n163147,640\n163148,1085\n163149,3069\n163150,211\n163151,312\n163152,83\n163153,147\n163155,302\n163156,333\n163157,1512\n163157,5992\n163158,779\n163160,222\n163161,536\n163162,83\n163163,217\n163164,30\n163165,2697\n163166,206\n163167,422\n163168,467\n163169,99\n163170,861\n163171,9018\n163172,1370\n163172,1877\n163173,30\n163174,920\n163175,30\n163176,267\n163177,142870\n163178,2373\n163179,5976\n163180,760\n163181,772\n163182,435\n163183,1939\n163184,72\n163185,760\n163186,843\n163187,1509\n163188,30\n163189,1274\n163190,240\n163191,447\n163192,2775\n163193,30\n163194,631\n163195,10\n163196,72\n163197,113156\n163198,2590\n163199,30\n163200,178\n163200,211\n163201,292\n163202,760\n163203,900\n163204,30\n163205,406\n163206,138686\n163207,175\n163208,298\n163209,143287\n163210,843\n163211,155481\n163212,885\n163212,13704\n163213,2006\n163214,900\n163215,366\n163216,366\n163217,875\n163218,366\n163219,107\n163219,3538\n163220,278\n163221,1773\n163222,1773\n163223,875\n163224,779\n163224,1181\n163225,424\n163226,72\n163227,72\n163228,72\n163229,81\n163230,30\n163231,2048\n163232,72\n163233,1010\n163234,72\n163235,862\n163236,1\n163237,104\n163237,134\n163237,135\n163238,516\n163239,217\n163239,1417\n163240,1085\n163240,2590\n163241,147\n163242,289\n163242,290\n163242,94134\n163243,298\n163244,772\n163245,2146\n163246,41\n163246,631\n163246,784\n163246,1119\n163246,1462\n163246,2995\n163246,8537\n163247,163248\n163249,138686\n163250,175\n163251,163252\n163253,392\n163254,1462\n163254,8537\n163256,760\n163257,298\n163258,485\n163259,163260\n163261,155481\n163262,233\n163263,4223\n163264,366\n163265,83\n163266,366\n163267,355\n163268,344\n163269,192\n163269,202\n163269,206\n163269,217\n163269,222\n163269,310\n163269,333\n163269,500\n163269,588\n163269,590\n163269,760\n163269,1181\n163269,1210\n163269,1531\n163269,1724\n163269,1844\n163269,1968\n163269,2073\n163269,2626\n163269,3039\n163269,3804\n163269,5310\n163269,5358\n163269,8270\n163269,14352\n163269,25222\n163269,41767\n163271,83\n163271,104\n163271,147\n163271,252\n163271,538\n163271,1001\n163271,1644\n163271,1707\n163271,5213\n163271,21442\n163275,379\n163276,417\n163276,677\n163276,852\n163276,1085\n163276,1130\n163276,2572\n163276,2747\n163276,3623\n163276,3944\n163276,4220\n163276,19805\n163276,21589\n163276,33728\n163276,34419\n163276,48087\n163276,59273\n163276,73745\n163276,74482\n163276,75912\n163276,154004\n163276,159234\n163276,160400\n163276,184926\n163276,186065\n163276,191888\n163276,192238\n163277,1147\n163278,1238\n163280,1572\n163281,1238\n163282,697\n163283,156379\n163283,162599\n163284,1452\n163285,1118\n163286,433\n163287,794\n163288,760\n163289,6556\n163290,126\n163290,264\n163290,1147\n163291,1571\n163292,301\n163293,980\n163293,1326\n163294,422\n163295,56\n163296,422\n163297,422\n163298,422\n163299,690\n163300,422\n163301,422\n163302,2105\n163304,1113\n163304,7194\n163305,422\n163306,422\n163307,422\n163308,142879\n163309,422\n163310,422\n163311,302\n163311,893\n163312,422\n163313,422\n163314,931\n163315,1769\n163317,358\n163318,59021\n163319,14366\n163320,868\n163322,872\n163323,422\n163324,422\n163325,65\n163326,818\n163326,127158\n163327,433\n163329,872\n163330,269\n163331,200\n163332,1014\n163333,4611\n163334,1544\n163335,505\n163336,163337\n163339,875\n163340,138686\n163341,175\n163342,142430\n163342,142473\n163342,142879\n163343,298\n163344,417\n163345,849\n163345,1345\n163345,1707\n163345,13538\n163346,1132\n163347,2989\n163347,2991\n163348,671\n163349,406\n163350,217\n163351,372\n163352,1796\n163353,269\n163354,1252\n163354,1253\n163355,788\n163356,6424\n163357,1167\n163358,83\n163359,1012\n163359,1241\n163360,3258\n163360,6424\n163360,13136\n163361,4252\n163362,127158\n163363,1616\n163364,389\n163365,649\n163366,818\n163366,3695\n163367,1309\n163368,3328\n163369,3129\n163370,41\n163370,1616\n163371,3135\n163372,1955\n163373,336\n163373,1623\n163374,406\n163374,2334\n163375,1462\n163375,8537\n163376,1844\n163376,5213\n163378,315\n163378,538\n163378,671\n163378,1294\n163378,103698\n163379,875\n163380,968\n163381,1140\n163382,3\n163382,907\n163383,209\n163384,1388\n163385,809\n163385,6837\n163386,875\n163387,985\n163389,72\n163390,1332\n163391,510\n163392,1467\n163393,312\n163395,68\n163395,254\n163395,1010\n163396,2775\n163397,447\n163398,505\n163399,186\n163400,278\n163401,10\n163402,875\n163403,1458\n163404,34\n163404,35\n163405,623\n163405,1860\n163406,3507\n163407,557\n163408,893\n163409,6323\n163410,875\n163411,1252\n163411,1253\n163412,312\n163413,113156\n163414,779\n163414,1623\n163415,63\n163415,1512\n163415,5992\n163416,269\n163417,6303\n163418,668\n163420,827\n163420,1147\n163421,1983\n163423,358\n163424,1634\n163425,22\n163425,877\n163426,192\n163427,358\n163428,801\n163431,634\n163432,1983\n163433,2646\n163434,2867\n163434,2868\n163435,875\n163436,163\n163437,1252\n163437,1253\n163438,3507\n163439,422\n163440,557\n163441,1608\n163442,1132\n163443,1001\n163444,536\n163445,19010\n163446,298\n163447,485\n163448,313\n163448,1345\n163449,509\n163450,388\n163450,744\n163450,762\n163450,852\n163450,877\n163450,1113\n163450,3756\n163450,48505\n163451,801\n163451,852\n163452,1608\n163453,1132\n163454,968\n163454,1231\n163454,1564\n163454,1832\n163455,269\n163456,1983\n163457,1983\n163458,809\n163459,843\n163461,298\n163462,485\n163463,298\n163464,485\n163465,158\n163465,217\n163465,269\n163465,493\n163465,622\n163465,779\n163465,920\n163465,1033\n163467,298\n163468,485\n163469,298\n163470,485\n163471,227\n163471,298\n163471,310\n163472,1893\n163473,422\n163474,2590\n163475,1252\n163475,1253\n163476,1118\n163477,417\n163478,422\n163479,56\n163481,72\n163482,16019\n163483,422\n163484,2048\n163485,1001\n163486,644\n163487,473\n163487,4220\n163487,81070\n163488,1319\n163489,302\n163490,644\n163491,483\n163492,138686\n163493,175\n163494,3623\n163495,298\n163496,298\n163497,485\n163498,452\n163499,184\n163500,1247\n163501,509\n163502,875\n163503,1167\n163504,135\n163504,596\n163504,784\n163504,1052\n163504,1368\n163505,1359\n163506,55849\n163508,30\n163509,1252\n163509,1253\n163510,932\n163511,875\n163512,55849\n163513,3623\n163514,704\n163515,3507\n163516,1085\n163517,1001\n163518,4545\n163518,139010\n163519,149\n163520,752\n163521,1474\n163522,592\n163523,10\n163524,1474\n163525,875\n163526,83\n163527,171\n163527,330\n163527,957\n163527,1815\n163528,516\n163529,252\n163530,1220\n163530,1222\n163531,779\n163531,4193\n163532,217\n163533,875\n163534,422\n163535,1132\n163536,781\n163537,862\n163538,1462\n163538,8537\n163539,312\n163540,1511\n163540,3069\n163541,1467\n163542,217\n163543,252\n163544,872\n163545,163546\n163547,749\n163548,392\n163549,718\n163550,861\n163551,247\n163551,2867\n163551,2868\n163552,147\n163553,536\n163553,2944\n163554,44\n163556,73570\n163557,875\n163558,875\n163559,875\n163560,467\n163561,875\n163562,875\n163563,875\n163564,875\n163565,875\n163566,875\n163567,1181\n163568,885\n163568,13704\n163569,431\n163570,4823\n163571,99\n163572,155481\n163573,1927\n163574,1467\n163575,358\n163576,2373\n163577,259\n163578,3804\n163579,5906\n163580,626\n163581,278\n163582,557\n163583,137\n163584,1326\n163585,862\n163586,1572\n163587,1252\n163587,1253\n163588,330\n163588,957\n163588,1247\n163588,14650\n163588,109503\n163588,164572\n163589,577\n163590,1511\n163590,3069\n163591,2434\n163592,3623\n163593,358\n163594,6387\n163595,6387\n163596,72\n163597,392\n163598,1019\n163599,30\n163600,3623\n163601,563\n163602,72\n163603,301\n163603,968\n163603,1837\n163604,875\n163605,875\n163606,1298\n163607,491\n163608,557\n163609,868\n163610,240\n163611,306\n163611,307\n163612,298\n163613,485\n163614,1102\n163615,485\n163616,298\n163618,13538\n163619,920\n163620,358\n163621,1983\n163622,30\n163623,130\n163624,72\n163625,557\n163626,77\n163627,247\n163628,1085\n163628,75912\n163629,442\n163630,784\n163631,563\n163633,83\n163634,298\n163635,485\n163636,8854\n163637,485\n163638,298\n163639,138686\n163640,175\n163641,298\n163642,1149\n163643,292\n163644,2590\n163646,1058\n163647,2775\n163648,563\n163649,138686\n163650,175\n163651,68069\n163652,298\n163653,5906\n163654,8270\n163655,628\n163655,3295\n163656,2923\n163657,4453\n163658,1474\n163659,1474\n163660,358\n163661,113156\n163662,358\n163663,875\n163664,875\n163665,640\n163666,99\n163667,862\n163667,1001\n163667,1085\n163667,2590\n163667,8884\n163668,1238\n163669,99\n163670,240\n163671,366\n163672,366\n163673,389\n163674,366\n163675,366\n163676,1238\n163677,2590\n163678,1467\n163679,455\n163680,2424\n163681,1871\n163682,2421\n163683,83\n163684,13980\n163685,289\n163685,290\n163685,94134\n163686,30\n163687,13919\n163688,1\n163689,832\n163690,83\n163691,255\n163692,304\n163693,298\n163694,485\n163695,298\n163696,485\n163697,581\n163698,1544\n163699,4611\n163700,433\n163701,1881\n163702,649\n163704,3999\n163705,5469\n163706,355\n163707,233\n163708,163709\n163710,298\n163711,485\n163712,1058\n163713,1551\n163713,3041\n163714,142405\n163715,516\n163716,252\n163717,1220\n163717,1222\n163719,167\n163719,2083\n163720,298\n163721,485\n163722,30\n163723,392\n163724,850\n163725,1707\n163726,809\n163727,109503\n163728,467\n163728,5440\n163728,242246\n163730,30331\n163731,206\n163733,328\n163734,30\n163735,1117\n163736,358\n163737,2105\n163738,1274\n163739,592\n163740,1707\n163743,2989\n163743,2991\n163745,393\n163746,557\n163746,954\n163746,1939\n163747,2779\n163748,360\n163748,2617\n163749,422\n163750,1707\n163751,422\n163752,450\n163753,422\n163754,422\n163755,422\n163756,557\n163757,422\n163758,171\n163759,592\n163759,1010\n163760,647\n163761,146\n163761,92476\n163762,344\n163763,422\n163764,422\n163765,422\n163767,907\n163768,1001\n163770,20535\n163771,200\n163771,252\n163772,13661\n163773,269\n163774,1181\n163775,195\n163776,344\n163777,647\n163778,146\n163778,92476\n163779,200\n163779,28203\n163780,852\n163780,1085\n163781,358\n163786,50\n163786,631\n163787,485\n163788,298\n163789,500\n163790,247\n163791,138686\n163792,4545\n163792,56150\n163792,139010\n163793,957\n163793,1247\n163793,1815\n163793,109503\n163793,164572\n163794,175\n163795,875\n163796,312\n163797,298\n163798,586\n163799,79\n163800,422\n163801,1454\n163803,3207\n163805,518\n163805,1955\n163806,2750\n163807,875\n163808,1955\n163809,745\n163810,1844\n163812,30\n163813,2116\n163814,3623\n163815,1252\n163815,1253\n163816,81070\n163817,299\n163818,1385\n163819,602\n163820,589\n163821,138\n163821,1212\n163821,1882\n163822,640\n163823,536\n163824,875\n163825,1807\n163826,1983\n163827,447\n163828,2775\n163830,1955\n163831,146\n163831,92476\n163832,344\n163833,647\n163834,1983\n163835,772\n163836,647\n163837,344\n163838,875\n163839,3623\n163841,146\n163841,92476\n163842,142426\n163843,1130\n163845,83\n163846,81\n163847,717\n163848,3367\n163849,1893\n163850,7360\n163851,269\n163852,1118\n163853,703\n163854,422\n163855,422\n163856,589\n163857,703\n163858,1370\n163859,1252\n163859,1253\n163860,1274\n163860,2266\n163861,602\n163862,920\n163863,745\n163863,868\n163864,138686\n163865,30\n163866,175\n163867,104\n163867,557\n163867,953\n163867,954\n163867,1368\n163868,2353\n163870,666\n163871,145240\n163872,393\n163873,81\n163874,356\n163874,2590\n163875,113156\n163876,875\n163877,1019\n163878,358\n163879,493\n163880,536\n163880,1019\n163882,206\n163884,126\n163885,599\n163886,389\n163887,1368\n163888,2205\n163888,33424\n163889,875\n163890,1001\n163891,134\n163891,248\n163892,875\n163893,577\n163894,3\n163895,344\n163896,647\n163897,146\n163897,92476\n163898,34\n163898,290\n163898,671\n163898,919\n163898,1133\n163898,1210\n163898,1785\n163898,2045\n163898,2191\n163898,2205\n163898,2209\n163898,3804\n163898,33424\n163898,94134\n163899,2244\n163900,298\n163901,485\n163902,211\n163904,1927\n163905,3623\n163906,328\n163907,3623\n163908,30\n163909,34\n163909,35\n163910,875\n163911,3623\n163912,3623\n163913,1858\n163914,1860\n163915,861\n163917,372\n163919,77\n163919,563\n163919,581\n163920,379\n163921,985\n163922,302\n163923,1551\n163923,1893\n163924,957\n163924,1815\n163926,30\n163927,1983\n163930,861\n163932,1370\n163932,156379\n163933,431\n163935,1858\n163936,1860\n163937,1454\n163938,248\n163939,155481\n163940,195\n163941,2048\n163942,3804\n163943,301\n163944,424\n163945,439\n163946,1381\n163947,1345\n163948,192\n163949,83\n163950,142433\n163951,151\n163952,697\n163953,83\n163953,126\n163953,305\n163953,805\n163953,941\n163953,1058\n163953,1096\n163953,1479\n163953,1837\n163953,3218\n163953,3769\n163953,6487\n163954,1332\n163957,2590\n163958,687\n163959,102\n163960,483\n163961,1285\n163962,360\n163962,1893\n163962,2617\n163963,55849\n163965,2244\n163966,28130\n163966,142473\n163968,435\n163969,54\n163969,283\n163969,455\n163969,3792\n163969,15694\n163969,30549\n163969,165053\n163969,172486\n163970,292\n163971,5440\n163972,30\n163973,278\n163974,13980\n163975,54\n163976,8822\n163977,1298\n163978,192\n163978,30331\n163979,37\n163980,6303\n163981,772\n163982,843\n163983,22\n163984,406\n163985,406\n163986,392\n163987,647\n163988,344\n163989,146\n163989,92476\n163990,920\n163991,994\n163992,147\n163992,184\n163994,1257\n163995,467\n163996,5366\n163997,1580\n163998,146\n163998,92476\n163999,647\n164000,344\n164001,393\n164002,697\n164002,1769\n164003,509\n164004,50\n164004,192\n164004,1181\n164004,4193\n164005,2744\n164006,1243\n164008,647\n164009,146\n164009,92476\n164010,344\n164011,2296\n164012,72\n164013,1608\n164014,861\n164015,83\n164016,30\n164017,1474\n164018,146\n164018,92476\n164019,344\n164020,647\n164021,994\n164022,217\n164022,538\n164022,663\n164022,779\n164022,809\n164022,920\n164022,1033\n164022,1181\n164022,1381\n164022,1414\n164022,1639\n164022,1805\n164022,2073\n164022,2889\n164022,3193\n164022,5440\n164022,141912\n164023,301\n164023,717\n164023,1181\n164023,1782\n164024,1019\n164025,875\n164026,192\n164027,366\n164028,1181\n164029,442\n164030,65\n164031,1160\n164032,44\n164033,885\n164033,13704\n164034,435\n164035,781\n164036,1132\n164037,1132\n164038,781\n164039,72\n164040,151\n164041,358\n164042,875\n164043,875\n164044,875\n164045,72\n164046,1274\n164047,749\n164048,366\n164049,30\n164050,1\n164051,30\n164053,164054\n164055,137\n164056,83\n164056,217\n164056,278\n164056,509\n164056,1019\n164056,3409\n164057,718\n164057,2929\n164058,30\n164059,30\n164060,563\n164061,330\n164062,843\n164063,30\n164064,592\n164065,30\n164066,72\n164067,875\n164069,557\n164070,862\n164071,72\n164072,406\n164073,289\n164073,290\n164073,94134\n164074,557\n164075,178\n164076,83\n164077,1381\n164078,563\n164079,151\n164080,323\n164080,1052\n164080,1102\n164081,704\n164082,1132\n164083,781\n164084,72\n164086,1235\n164086,1335\n164087,1973\n164088,980\n164089,72\n164090,994\n164091,30\n164092,1319\n164093,1210\n164094,949\n164095,50\n164095,58\n164095,86\n164095,104\n164095,106\n164095,135\n164095,136\n164095,137\n164095,167\n164095,217\n164095,227\n164095,247\n164095,252\n164095,254\n164095,269\n164095,332\n164095,364\n164095,392\n164095,393\n164095,420\n164095,433\n164095,515\n164095,516\n164095,538\n164095,589\n164095,596\n164095,636\n164095,644\n164095,720\n164095,749\n164095,779\n164095,795\n164095,907\n164095,968\n164095,1007\n164095,1085\n164095,1179\n164095,1363\n164095,1381\n164095,1453\n164095,1522\n164095,1544\n164095,1715\n164095,1818\n164095,1837\n164095,2083\n164095,2105\n164095,2191\n164095,2620\n164095,2931\n164095,3003\n164095,3367\n164095,4355\n164095,4545\n164095,5405\n164095,5718\n164095,6119\n164095,55849\n164095,139010\n164096,1556\n164098,7416\n164099,358\n164100,147\n164100,156379\n164101,2371\n164103,4260\n164103,142405\n164103,142473\n164103,147123\n164104,644\n164105,640\n164107,83\n164107,278\n164110,302\n164111,63049\n164111,188749\n164112,72\n164113,344\n164114,285\n164115,83\n164116,4594\n164117,267\n164118,2373\n164119,68069\n164120,302\n164120,2105\n164121,32\n164121,392\n164121,509\n164121,875\n164122,557\n164123,1181\n164124,861\n164125,1113\n164126,2590\n164127,72\n164128,3846\n164129,406\n164129,620\n164130,516\n164131,72\n164132,1474\n164133,1102\n164134,422\n164135,2574\n164136,1181\n164137,358\n164138,206\n164139,209\n164140,366\n164141,1773\n164142,3623\n164143,22\n164144,875\n164145,875\n164146,1381\n164147,298\n164148,485\n164149,1419\n164150,30\n164151,920\n164152,875\n164153,195\n164154,900\n164156,298\n164157,485\n164158,344\n164159,647\n164160,146\n164160,92476\n164161,305\n164162,30365\n164164,30\n164165,207\n164167,233\n164168,2367\n164169,72\n164170,577\n164171,30\n164172,328\n164173,72\n164174,1429\n164175,30\n164176,872\n164177,49057\n164178,668\n164179,389\n164180,44725\n164182,862\n164183,2244\n164184,298\n164185,485\n164187,79\n164187,141912\n164188,298\n164189,485\n164190,323\n164192,366\n164193,366\n164194,366\n164195,366\n164196,366\n164197,255\n164198,355\n164199,233\n164200,113156\n164201,2116\n164202,647\n164203,146\n164203,92476\n164204,344\n164205,146\n164205,92476\n164206,647\n164207,344\n164208,330\n164209,255\n164210,68069\n164213,818\n164214,1052\n164215,46\n164215,233\n164215,292\n164215,332\n164215,525\n164215,631\n164215,760\n164215,843\n164215,954\n164215,972\n164215,1467\n164215,1531\n164215,2286\n164215,3507\n164215,3695\n164215,10318\n164216,255\n164217,358\n164219,4455\n164221,3041\n164222,868\n164223,749\n164224,571\n164225,252\n164225,516\n164225,1220\n164225,1222\n164227,422\n164228,422\n164229,422\n164230,422\n164231,422\n164232,1612\n164233,422\n164234,15\n164234,1400\n164235,217\n164235,240\n164236,1052\n164237,278\n164238,784\n164239,422\n164240,422\n164241,422\n164242,422\n164243,422\n164244,422\n164245,358\n164246,240\n164247,422\n164248,1608\n164249,147\n164249,158\n164250,310\n164250,3039\n164252,240\n164253,3623\n164254,1082\n164255,1220\n164255,1222\n164256,516\n164257,252\n164258,1181\n164260,1858\n164261,1860\n164263,273\n164263,313\n164264,417\n164264,1635\n164265,1238\n164267,68\n164267,104\n164267,298\n164267,323\n164267,631\n164267,714\n164267,1085\n164267,1659\n164267,2205\n164267,6068\n164267,33424\n164268,292\n164269,941\n164270,3623\n164272,931\n164273,3623\n164274,256\n164275,1400\n164276,2083\n164277,907\n164278,1858\n164279,1860\n164280,43613\n164281,358\n164282,1417\n164284,827\n164285,1452\n164287,557\n164288,211\n164290,344\n164291,72\n164292,102\n164293,285\n164294,138686\n164295,175\n164296,298\n164297,602\n164298,259\n164299,1556\n164301,240\n164302,146\n164302,779\n164302,92476\n164302,141912\n164303,358\n164305,206\n164307,113156\n164309,875\n164310,83\n164311,358\n164312,1122\n164313,1130\n164314,328\n164315,1385\n164317,2671\n164318,1143\n164319,843\n164320,273\n164321,2775\n164322,447\n164324,171\n164325,3135\n164326,467\n164326,801\n164327,217\n164328,1220\n164328,1222\n164329,577\n164330,1072\n164331,146\n164331,92476\n164332,647\n164333,344\n164334,2979\n164335,301\n164336,136\n164336,137\n164337,703\n164338,1\n164339,158\n164339,406\n164340,647\n164341,344\n164342,146\n164342,92476\n164343,195\n164345,195\n164346,647\n164347,344\n164348,146\n164348,92476\n164349,647\n164350,344\n164351,146\n164351,92476\n164352,1509\n164354,68069\n164354,141912\n164355,991\n164356,195\n164357,73570\n164358,18831\n164359,138686\n164360,175\n164361,298\n164362,698\n164362,1782\n164363,1172\n164364,77\n164364,269\n164365,1001\n164366,162599\n164367,439\n164367,671\n164369,312\n164369,525\n164371,240\n164372,1068\n164372,1370\n164375,360\n164375,406\n164375,1014\n164377,1773\n164379,192\n164380,1479\n164381,128906\n164382,184\n164383,58\n164384,2590\n164385,690\n164385,788\n164386,261\n164387,439\n164387,80266\n164388,8463\n164389,455\n164389,1019\n164390,358\n164391,136\n164392,137\n164393,2371\n164394,302\n164395,602\n164396,211\n164396,1001\n164397,392\n164397,440\n164397,644\n164397,1117\n164398,18831\n164399,11\n164399,97\n164400,392\n164402,861\n164404,207\n164405,424\n164406,283\n164407,1085\n164408,379\n164408,1274\n164408,2646\n164409,151\n164409,273\n164409,306\n164409,307\n164409,338\n164409,390\n164409,489\n164409,589\n164409,626\n164409,675\n164409,762\n164409,861\n164409,862\n164409,973\n164409,1127\n164409,1285\n164409,1381\n164409,1644\n164409,1881\n164409,2590\n164409,3258\n164409,3585\n164409,5326\n164409,5469\n164410,872\n164411,2048\n164412,1429\n164413,2421\n164414,99\n164415,227\n164416,690\n164417,1203\n164417,1955\n164418,138686\n164419,195\n164420,175\n164421,298\n164422,7768\n164423,631\n164425,536\n164426,50\n164428,264\n164429,146\n164429,92476\n164430,647\n164431,344\n164432,760\n164433,217\n164434,385\n164435,2244\n164436,1749\n164437,298\n164438,485\n164439,2944\n164440,264\n164441,1085\n164442,1893\n164443,1127\n164444,920\n164445,1147\n164446,312\n164447,2244\n164448,68\n164448,985\n164448,1837\n164449,73570\n164450,1462\n164450,8537\n164451,467\n164452,83\n164453,668\n164454,2989\n164454,2991\n164455,2590\n164456,875\n164457,2590\n164458,104\n164458,225\n164458,557\n164458,1368\n164459,841\n164460,195\n164461,602\n164462,577\n164463,467\n164464,349\n164465,217\n164466,273\n164467,87\n164468,195\n164470,972\n164470,1010\n164471,1143\n164472,83\n164473,195\n164474,247\n164475,8719\n164476,392\n164477,346\n164477,18831\n164478,1858\n164479,1860\n164480,142473\n164481,195\n164482,8719\n164483,138\n164484,865\n164485,557\n164486,137\n164487,118\n164487,4597\n164488,88820\n164489,358\n164490,818\n164491,3623\n164492,2574\n164493,875\n164494,2372\n164495,809\n164496,973\n164497,56\n164498,422\n164499,55849\n164500,493\n164501,302\n164502,134\n164503,358\n164504,861\n164505,164506\n164507,885\n164507,13704\n164508,1\n164509,6303\n164510,994\n164511,389\n164512,389\n164513,557\n164514,406\n164515,72\n164516,269\n164517,55849\n164518,489\n164519,358\n164522,332\n164523,147\n164524,749\n164525,298\n164526,485\n164527,312\n164528,485\n164529,298\n164530,1323\n164531,6387\n164532,1860\n164533,1858\n164534,1860\n164535,1858\n164536,6387\n164537,83\n164538,861\n164539,485\n164540,298\n164541,3367\n164542,68\n164543,72\n164544,932\n164545,147\n164545,2048\n164546,164547\n164549,269\n164550,280\n164550,17245\n164551,2210\n164551,4237\n164552,536\n164553,225\n164554,631\n164554,1085\n164554,4222\n164555,366\n164556,483\n164557,8884\n164558,1085\n164559,2353\n164560,206\n164561,875\n164562,818\n164563,233\n164564,355\n164565,1860\n164566,1858\n164567,83\n164568,346\n164569,298\n164570,485\n164571,581\n164572,147\n164572,158\n164572,175\n164572,336\n164572,957\n164572,1247\n164572,1815\n164572,2244\n164572,118336\n164572,164572\n164574,1\n164574,94\n164574,184\n164574,934\n164574,2787\n164575,422\n164576,30\n164577,422\n164578,422\n164579,422\n164580,422\n164581,422\n164582,422\n164583,298\n164584,485\n164585,72\n164586,631\n164587,171\n164588,158\n164589,406\n164590,83\n164591,72\n164592,3872\n164593,72\n164594,72\n164595,818\n164596,81070\n164597,577\n164598,83\n164598,217\n164598,536\n164598,13575\n164599,1893\n164599,49057\n164600,358\n164601,138686\n164602,175\n164603,298\n164604,142405\n164605,72\n164606,408\n164607,1326\n164608,102\n164609,1323\n164610,1522\n164612,346\n164612,586\n164613,1608\n164614,1132\n164615,483\n164616,195\n164617,195\n164618,217\n164619,298\n164620,485\n164621,72\n164622,503\n164623,164624\n164625,668\n164627,3161\n164628,647\n164629,146\n164629,92476\n164630,344\n164631,30\n164632,135\n164632,2775\n164634,328\n164636,85\n164637,72\n164638,103860\n164639,1479\n164640,298\n164641,485\n164642,390\n164643,10\n164644,72\n164645,726\n164646,30\n164647,72\n164648,72\n164649,72\n164650,602\n164651,195\n164653,72\n164654,146\n164654,92476\n164655,79\n164656,160\n164658,430\n164658,4571\n164659,366\n164660,366\n164661,366\n164662,1381\n164663,195\n164664,151\n164666,99\n164667,195\n164668,312\n164669,366\n164670,366\n164671,366\n164672,164673\n164674,366\n164675,366\n164676,366\n164677,366\n164678,137\n164679,233\n164680,366\n164681,366\n164682,4691\n164683,2620\n164684,355\n164685,107\n164686,2416\n164686,2417\n164687,292\n164688,338\n164689,50\n164690,298\n164692,1133\n164693,3538\n164694,30\n164697,4611\n164699,1849\n164700,1509\n164701,344\n164702,146\n164702,92476\n164703,647\n164704,109503\n164705,994\n164707,1309\n164708,72\n164709,1983\n164710,1052\n164711,1\n164712,136\n164713,138686\n164714,175\n164715,298\n164716,118\n164716,4597\n164717,1452\n164718,772\n164719,1983\n164720,30\n164721,3260\n164722,861\n164723,72\n164724,30\n164725,1452\n164726,142405\n164727,440\n164728,298\n164729,485\n164730,299\n164731,44\n164732,30\n164733,422\n164734,56\n164735,111142\n164736,164737\n164738,3623\n164739,48\n164740,366\n164741,393\n164742,2989\n164742,2991\n164743,726\n164744,1212\n164745,358\n164746,72\n164747,366\n164748,366\n164749,366\n164750,366\n164751,164752\n164753,88820\n164754,1238\n164755,1769\n164756,1983\n164757,557\n164758,557\n164759,557\n164760,202\n164761,2779\n164762,483\n164763,7416\n164764,1983\n164765,875\n164766,1181\n164767,158\n164767,406\n164767,438\n164767,585\n164767,2931\n164768,30\n164771,30\n164772,1983\n164773,875\n164774,72\n164775,142473\n164776,72\n164777,30\n164778,72\n164779,875\n164780,72\n164781,171\n164781,957\n164781,1815\n164782,310\n164783,72\n164784,72\n164785,30\n164786,72\n164787,602\n164788,875\n164789,72\n164790,30\n164791,1289\n164792,424\n164793,72\n164794,56\n164795,422\n164796,72\n164797,72\n164798,1467\n164799,8308\n164800,269\n164801,72\n164802,875\n164804,310\n164805,2319\n164806,292\n164807,294\n164808,296\n164809,298\n164810,83\n164811,589\n164811,75912\n164812,72\n164813,233\n164814,72\n164815,1287\n164816,22\n164816,272\n164816,152855\n164816,239153\n164817,355\n164818,72\n164819,19\n164820,1707\n164821,30\n164822,934\n164823,209\n164823,299\n164823,6654\n164824,1454\n164825,868\n164826,14556\n164827,714\n164827,1238\n164828,32\n164829,72\n164830,726\n164831,393\n164833,251\n164833,6556\n164835,1458\n164836,301\n164836,968\n164836,3422\n164837,48\n164838,422\n164839,56\n164840,772\n164841,872\n164842,422\n164843,56\n164844,225\n164845,1368\n164847,68069\n164848,615\n164849,640\n164850,640\n164851,640\n164852,640\n164853,10\n164854,640\n164855,5908\n164856,137\n164856,269\n164856,273\n164857,372\n164858,422\n164859,422\n164860,252\n164861,1634\n164863,1293\n164863,115659\n164864,920\n164865,2775\n164866,447\n164867,252\n164868,422\n164869,422\n164870,422\n164871,422\n164872,422\n164873,422\n164874,422\n164875,422\n164876,841\n164877,682\n164877,1353\n164877,72439\n164878,657\n164879,73570\n164880,1113\n164881,1608\n164882,1132\n164884,1707\n164885,626\n164886,309\n164886,310\n164886,31976\n164887,30\n164888,54\n164890,30\n164891,631\n164892,671\n164893,1224\n164894,3193\n164895,30\n164896,72\n164897,7698\n164898,30\n164899,835\n164900,107\n164900,1151\n164901,294\n164903,1983\n164904,1282\n164905,301\n164906,1801\n164907,328\n164908,240\n164909,1983\n164910,102560\n164911,5375\n164912,138686\n164913,175\n164914,298\n164915,1284\n164916,140\n164916,736\n164916,1289\n164916,1551\n164916,1968\n164918,1117\n164918,1284\n164920,299\n164921,58\n164922,994\n164923,46\n164924,30\n164925,1888\n164926,760\n164927,349\n164928,10\n164928,175\n164928,1118\n164928,20792\n164930,30\n164931,136\n164931,137\n164932,457\n164932,852\n164933,1983\n164934,503\n164935,1983\n164936,1801\n164937,195\n164938,142433\n164939,1566\n164941,1096\n164941,2073\n164941,6452\n164942,3769\n164943,44\n164944,102\n164944,1326\n164944,14797\n164945,200\n164945,1939\n164945,2443\n164946,79\n164946,206\n164946,315\n164946,435\n164946,690\n164946,1326\n164946,1612\n164946,1877\n164946,2353\n164947,22\n164947,86\n164948,30\n164949,2944\n164949,4223\n164951,240\n164951,877\n164952,1849\n164953,2867\n164953,2868\n164954,138686\n164955,175\n164956,298\n164958,298\n164959,485\n164961,142473\n164961,142879\n164962,794\n164963,994\n164967,83\n164968,269\n164971,850\n164972,4571\n164973,358\n164975,372\n164975,442\n164976,872\n164979,516\n164981,1033\n164982,4571\n164984,3804\n164985,14797\n164986,2737\n164987,518\n164988,3193\n164989,31122\n164990,138686\n164991,175\n164992,298\n164993,1247\n164993,164572\n164995,3623\n164997,1247\n164997,164572\n164998,615\n164999,852\n165001,72\n165002,3623\n165003,99\n165004,875\n165005,73570\n165006,143287\n165007,422\n165008,3193\n165009,19\n165010,55849\n165011,4571\n165013,1579\n165013,2646\n165014,1608\n165016,1118\n165018,163\n165018,6303\n165019,1634\n165020,631\n165022,1590\n165022,1644\n165023,392\n165023,1240\n165024,467\n165026,72\n165027,422\n165028,1385\n165030,192\n165031,907\n165032,408\n165033,1323\n165034,102\n165035,1326\n165036,467\n165037,111\n165038,784\n165039,2944\n165042,136\n165043,1580\n165043,103860\n165044,557\n165045,134\n165046,202\n165047,3079\n165049,563\n165050,2989\n165050,2991\n165051,1858\n165052,1860\n165055,151\n165056,5\n165056,94\n165056,114\n165056,117\n165056,1235\n165056,2089\n165056,2712\n165056,3794\n165056,13704\n165056,154690\n165057,1479\n165058,165059\n165060,138686\n165061,175\n165062,5405\n165063,298\n165064,682\n165064,1474\n165064,72439\n165065,1454\n165066,592\n165067,72\n165067,222\n165068,393\n165069,30\n165070,794\n165071,1085\n165072,2334\n165073,1319\n165074,631\n165075,1860\n165076,1454\n165077,1955\n165078,302\n165079,146\n165079,92476\n165080,344\n165081,647\n165082,1707\n165083,328\n165084,30\n165086,233\n165087,1888\n165088,217\n165089,195\n165090,333\n165090,980\n165090,4545\n165090,15573\n165090,139010\n165091,217\n165092,278\n165093,83\n165094,640\n165095,1381\n165095,1452\n165096,2590\n165097,134\n165098,146\n165098,92476\n165099,344\n165100,647\n165101,44\n165102,30\n165103,72\n165104,2620\n165105,852\n165105,1085\n165106,72\n165107,273\n165108,932\n165109,4504\n165110,247\n165112,55849\n165113,30\n165114,788\n165115,1385\n165116,1385\n165117,920\n165118,30\n165119,483\n165120,72\n165121,2590\n165122,160\n165123,1983\n165124,72\n165125,4611\n165126,4355\n165127,2506\n165128,138\n165128,2674\n165128,16153\n165129,30\n165130,55849\n165131,72\n165132,30\n165133,195\n165134,1559\n165135,50\n165135,79\n165136,72\n165137,30\n165138,4260\n165138,142473\n165138,165139\n165140,3623\n165142,779\n165143,875\n165144,30\n165145,3623\n165146,72\n165147,1509\n165148,1509\n165149,1257\n165150,72\n165151,72\n165152,72\n165153,346\n165154,818\n165155,875\n165156,72\n165157,589\n165158,240\n165159,346\n165160,875\n165161,56\n165162,422\n165163,72\n165164,32751\n165165,346\n165166,366\n165167,366\n165168,1033\n165169,72\n165170,2979\n165171,5343\n165172,843\n165173,77\n165174,72\n165175,30\n165176,1467\n165177,147\n165178,671\n165179,184\n165180,2506\n165181,388\n165182,2424\n165183,72\n165184,147\n165184,158\n165184,206\n165185,366\n165186,3623\n165187,1181\n165188,163\n165188,2116\n165189,1085\n165190,1707\n165191,355\n165192,142426\n165193,233\n165194,165195\n165196,346\n165197,623\n165198,392\n165198,1769\n165199,346\n165200,1858\n165201,1860\n165202,1983\n165203,1844\n165204,1247\n165204,164572\n165205,673\n165205,1130\n165206,158\n165208,1238\n165209,72\n165210,72\n165212,1452\n165213,30\n165215,72\n165216,596\n165217,13980\n165219,843\n165220,41\n165221,3538\n165222,146\n165222,92476\n165223,647\n165224,344\n165225,145240\n165226,138686\n165227,175\n165228,298\n165230,697\n165230,141912\n165231,1149\n165232,313\n165232,685\n165233,41\n165234,422\n165235,422\n165236,422\n165237,422\n165238,422\n165239,422\n165240,422\n165241,422\n165242,422\n165243,422\n165244,422\n165245,1227\n165245,86416\n165248,41\n165249,79\n165252,147\n165254,1188\n165255,592\n165255,1818\n165255,4062\n165255,4596\n165255,13294\n165255,14376\n165255,14554\n165255,22562\n165255,87262\n165255,103085\n165255,188867\n165256,717\n165257,287\n165258,344\n165259,358\n165260,392\n165261,136\n165262,694\n165263,875\n165264,1220\n165264,1222\n165265,516\n165266,252\n165267,1849\n165268,762\n165269,500\n165270,1052\n165271,1882\n165272,2775\n165273,1962\n165274,54\n165275,298\n165276,485\n165277,138686\n165278,175\n165279,298\n165280,206\n165281,1436\n165282,1522\n165284,1893\n165285,893\n165286,392\n165286,849\n165286,3003\n165286,6068\n165287,298\n165288,485\n165289,6627\n165290,165291\n165292,206\n165293,631\n165294,298\n165295,485\n165296,809\n165297,48\n165298,1849\n165299,1805\n165300,72\n165301,433\n165302,104\n165302,2210\n165302,4237\n165303,694\n165304,298\n165305,485\n165306,1707\n165307,1571\n165308,717\n165309,298\n165310,485\n165312,55849\n165313,171\n165314,485\n165315,298\n165316,79\n165317,349\n165318,760\n165320,818\n165321,2116\n165322,298\n165323,485\n165325,298\n165326,485\n165327,1425\n165329,358\n165330,312\n165332,165333\n165334,1631\n165335,875\n165336,3623\n165337,333\n165337,2671\n165338,718\n165340,158\n165340,406\n165341,34\n165341,35\n165342,1118\n165343,652\n165347,1132\n165348,781\n165349,843\n165350,22\n165350,130\n165351,2744\n165352,152855\n165353,65\n165353,71\n165353,611\n165355,1425\n165356,406\n165356,2626\n165357,393\n165358,34\n165358,35\n165359,298\n165360,485\n165362,760\n165363,567\n165363,5540\n165364,206\n165366,31977\n165368,1590\n165369,707\n165372,240\n165373,147\n165373,356\n165373,447\n165373,852\n165374,141912\n165376,673\n165377,720\n165378,875\n165379,875\n165381,1085\n165382,640\n165383,298\n165384,485\n165385,1305\n165386,1188\n165387,372\n165387,1285\n165389,794\n165390,850\n165391,202\n165392,4545\n165392,139010\n165394,1227\n165394,86416\n165395,1425\n165396,298\n165397,485\n165398,439\n165399,557\n165400,287\n165401,55849\n165402,192\n165403,346\n165404,302\n165405,333\n165406,779\n165407,794\n165407,3949\n165408,393\n165409,1590\n165410,302\n165411,861\n165412,861\n165413,217\n165414,178\n165415,579\n165416,1556\n165417,22\n165418,703\n165419,1363\n165420,141912\n165422,893\n165422,1434\n165423,142870\n165424,1449\n165426,671\n165426,2868\n165427,1309\n165429,3328\n165432,557\n165433,3129\n165434,138\n165435,1522\n165436,3135\n165437,1955\n165438,1782\n165439,301\n165439,818\n165439,881\n165439,907\n165439,972\n165439,973\n165439,1010\n165439,1271\n165439,1284\n165439,1298\n165439,1360\n165439,1518\n165439,1798\n165439,1849\n165439,1853\n165439,2307\n165439,2595\n165439,7969\n165439,13513\n165439,21127\n165439,24962\n165439,33799\n165439,58284\n165439,81937\n165439,116275\n165439,123851\n165439,127158\n165439,131652\n165439,154385\n165439,160409\n165439,178900\n165439,187818\n165439,218020\n165439,231447\n165439,232267\n165439,236039\n165440,707\n165441,209\n165443,346\n165444,68069\n165445,2048\n165446,2590\n165447,1220\n165447,1222\n165448,516\n165449,252\n165450,415\n165452,158\n165452,192\n165452,406\n165452,422\n165452,424\n165452,493\n165453,1118\n165454,1282\n165455,749\n165456,1425\n165458,563\n165459,138686\n165460,175\n165461,298\n165462,192\n165462,457\n165464,344\n165465,972\n165465,973\n165465,4504\n165466,483\n165467,1127\n165468,72\n165469,1167\n165469,1298\n165469,2979\n165470,389\n165471,389\n165472,433\n165473,4545\n165473,139010\n165474,1274\n165475,302\n165476,2210\n165476,4237\n165478,2671\n165479,861\n165480,1220\n165480,1222\n165481,406\n165482,252\n165483,251\n165484,55849\n165485,3129\n165486,3129\n165487,72\n165488,4611\n165489,1544\n165492,118\n165492,422\n165492,4597\n165492,5405\n165493,50\n165493,406\n165493,1181\n165493,1414\n165493,1515\n165493,2931\n165494,240\n165495,222\n165496,640\n165497,240\n165498,72\n165499,1247\n165499,164572\n165500,893\n165501,2989\n165501,2991\n165502,68\n165503,1858\n165504,1860\n165505,795\n165506,328\n165507,147\n165508,83\n165509,1619\n165510,72\n165511,44\n165512,269\n165513,406\n165514,1452\n165515,30\n165516,467\n165517,392\n165518,516\n165519,1220\n165519,1222\n165520,252\n165521,358\n165522,392\n165523,167\n165524,8308\n165525,248\n165526,72\n165527,563\n165528,330\n165529,83\n165530,4411\n165531,485\n165532,298\n165533,525\n165534,1381\n165535,1309\n165536,1776\n165536,118336\n165537,1285\n165538,83\n165539,72\n165540,631\n165541,575\n165543,294\n165544,23783\n165545,364\n165546,314\n165546,141912\n165547,795\n165548,330\n165549,138686\n165550,175\n165551,298\n165552,1381\n165553,13361\n165554,4611\n165555,83\n165556,30\n165557,30\n165558,187\n165559,493\n165560,165561\n165562,278\n165563,22\n165564,1608\n165565,72\n165566,68\n165567,72\n165568,55849\n165569,850\n165570,707\n165571,165572\n165573,2989\n165573,2991\n165574,19010\n165575,130\n165576,346\n165577,138686\n165578,175\n165579,165580\n165581,30\n165582,298\n165583,588\n165583,590\n165584,72\n165585,72\n165586,388\n165586,392\n165586,623\n165586,779\n165586,1424\n165586,127158\n165586,171641\n165586,207837\n165587,447\n165588,2775\n165589,2146\n165590,3623\n165591,255\n165592,72\n165593,165594\n165595,1243\n165596,8270\n165597,273\n165598,72\n165599,217\n165600,1983\n165601,1247\n165601,164572\n165602,30\n165603,5366\n165604,72\n165605,138686\n165606,175\n165607,1715\n165608,298\n165609,165610\n165611,30\n165612,30\n165613,30\n165614,30\n165615,165616\n165617,72\n165618,3623\n165619,68069\n165620,1381\n165621,1007\n165622,760\n165622,2292\n165623,424\n165624,104\n165624,557\n165624,953\n165624,954\n165624,5405\n165626,1\n165627,175\n165628,579\n165629,2775\n165630,634\n165630,1313\n165630,5034\n165632,493\n165633,875\n165634,355\n165635,875\n165636,1353\n165637,1238\n165638,4611\n165639,1544\n165640,28130\n165641,30\n165642,1893\n165642,2312\n165643,2210\n165643,4237\n165645,147\n165645,21442\n165645,240174\n165646,202\n165648,1608\n165649,30\n165650,3623\n165651,3756\n165652,1415\n165653,2353\n165655,344\n165657,8072\n165658,72\n165659,447\n165660,285\n165661,1860\n165662,3623\n165663,1858\n165664,285\n165665,72\n165666,1241\n165668,328\n165669,1284\n165669,148742\n165670,72\n165671,30\n165672,592\n165673,233\n165675,698\n165675,175914\n165675,175946\n165675,177380\n165675,179148\n165675,179149\n165675,183862\n165675,185309\n165675,188674\n165675,188720\n165675,189170\n165675,189192\n165675,190427\n165675,191898\n165675,192384\n165675,194529\n165675,194992\n165675,200584\n165675,200585\n165675,202949\n165675,202953\n165675,202960\n165676,682\n165676,72439\n165677,408\n165677,1326\n165678,1452\n165679,30\n165680,309\n165680,310\n165680,1400\n165681,462\n165682,3623\n165684,422\n165685,422\n165686,422\n165687,509\n165689,1773\n165690,779\n165691,422\n165692,422\n165693,422\n165694,422\n165695,422\n165696,875\n165697,622\n165698,136\n165699,142879\n165700,30\n165701,1368\n165702,30331\n165703,312\n165704,873\n165704,3182\n165705,344\n165706,422\n165707,1052\n165708,3623\n165709,1332\n165710,503\n165711,184\n165712,141912\n165713,1983\n165714,875\n165715,301\n165716,304\n165718,156379\n165719,171\n165720,165721\n165722,4611\n165723,1544\n165724,30\n165725,605\n165726,272\n165727,1634\n165728,346\n165729,431\n165729,784\n165730,760\n165731,136\n165732,83\n165735,920\n165736,972\n165738,467\n165740,1531\n165741,4545\n165741,139010\n165742,83\n165743,138686\n165744,972\n165745,175\n165746,972\n165747,972\n165748,403\n165748,693\n165749,298\n165751,640\n165754,1639\n165757,1\n165757,83\n165758,83\n165759,1257\n165760,2210\n165760,4237\n165761,3623\n165762,252\n165762,1220\n165762,1222\n165763,79\n165764,1001\n165766,136\n165768,563\n165769,37\n165769,968\n165769,1001\n165769,1068\n165769,1231\n165769,1326\n165769,1370\n165769,3585\n165769,3804\n165769,14797\n165771,136\n165772,4611\n165773,1544\n165774,1127\n165776,1388\n165776,30331\n165777,1983\n165778,718\n165779,127158\n165780,1388\n165780,1531\n165781,83\n165782,301\n165783,1983\n165785,717\n165786,718\n165786,8180\n165787,875\n165788,360\n165789,809\n165790,571\n165791,30\n165792,1511\n165792,3069\n165793,994\n165794,994\n165795,3507\n165797,298\n165798,485\n165799,693\n165800,485\n165801,298\n165802,137\n165802,1891\n165803,592\n165804,358\n165806,588\n165806,590\n165808,3585\n165809,138686\n165810,175\n165811,298\n165812,818\n165813,397\n165815,1132\n165816,1608\n165817,1608\n165818,1132\n165820,1132\n165821,1608\n165822,2367\n165823,79\n165824,4611\n165825,1544\n165826,1608\n165827,1132\n165828,907\n165829,707\n165830,248\n165831,1132\n165832,1608\n165833,1132\n165834,1608\n165835,186\n165836,1181\n165837,1927\n165838,668\n165839,485\n165840,298\n165841,1132\n165842,781\n165843,687\n165844,83\n165845,7572\n165847,875\n165849,1132\n165850,781\n165851,1\n165851,147\n165851,149\n165851,158\n165851,184\n165851,1619\n165852,626\n165853,2209\n165854,1821\n165855,1085\n165856,72\n165857,406\n165858,1722\n165859,346\n165860,1634\n165861,875\n165862,1132\n165863,1608\n165865,1425\n165866,1983\n165867,5212\n165868,2105\n165869,406\n165870,4571\n165871,65\n165871,868\n165873,2837\n165874,1858\n165875,1860\n165876,328\n165877,843\n165878,3999\n165879,467\n165879,571\n165879,872\n165880,4101\n165881,1789\n165882,435\n165884,693\n165885,972\n165886,406\n165887,3623\n165888,1522\n165889,1118\n165889,5250\n165890,972\n165891,994\n165892,1287\n165894,148742\n165895,344\n165896,72\n165897,285\n165898,30\n165898,1179\n165899,435\n165900,1511\n165900,3069\n165901,2048\n165902,611\n165903,1177\n165906,563\n165907,843\n165908,83\n165909,620\n165909,893\n165912,178\n165914,1740\n165916,1132\n165917,781\n165918,301\n165919,356\n165919,852\n165919,973\n165919,1544\n165920,138686\n165921,175\n165922,30\n165923,298\n165924,1118\n165925,83\n165926,83\n165927,28130\n165929,1801\n165930,1323\n165931,1326\n165932,408\n165933,102\n165934,83\n165935,1572\n165937,2048\n165938,83\n165939,483\n165940,72\n165941,83\n165942,346\n165943,23783\n165947,13661\n165948,83\n165949,136\n165951,252\n165953,72\n165954,30\n165955,406\n165956,68\n165957,3623\n165958,3695\n165959,55849\n165960,30\n165962,136\n165963,151\n165964,83\n165965,72\n165966,72\n165967,83\n165968,1\n165968,86\n165968,117\n165968,273\n165968,485\n165968,2712\n165968,5212\n165969,634\n165970,467\n165971,1240\n165972,760\n165973,72\n165974,142473\n165975,34\n165975,35\n165976,907\n165977,118\n165977,953\n165978,479\n165979,657\n165979,1240\n165979,1805\n165979,6059\n165980,273\n165981,301\n165982,30\n165983,83\n165984,83\n165985,503\n165986,557\n165988,818\n165989,698\n165990,1149\n165991,3623\n165992,2784\n165993,631\n165995,3623\n165996,1474\n165997,358\n165998,30\n165999,217\n165999,1007\n166000,9029\n166001,2367\n166002,1309\n166003,788\n166004,1414\n166005,5906\n166006,557\n166007,626\n166008,278\n166009,137\n166010,862\n166011,392\n166012,991\n166013,175\n166014,72\n166015,107\n166016,34\n166016,35\n166017,1188\n166018,861\n166019,222\n166020,77\n166020,5440\n166021,301\n166022,184\n166023,155481\n166024,841\n166026,38634\n166027,302\n166028,2620\n166029,781\n166030,1132\n166031,8854\n166032,298\n166033,485\n166034,44\n166035,1\n166036,10\n166036,192\n166037,206\n166038,72\n166039,30\n166040,485\n166041,298\n166042,72\n166043,72\n166044,1571\n166045,72\n166046,1511\n166046,3069\n166047,1655\n166048,2506\n166049,1188\n166050,779\n166051,285\n166052,294\n166053,1305\n166054,2116\n166055,347\n166056,577\n166057,5265\n166058,676\n166059,707\n166060,285\n166061,77\n166061,85\n166062,1515\n166063,920\n166064,30\n166065,298\n166066,485\n166067,457\n166068,267\n166069,467\n166069,868\n166070,278\n166071,298\n166072,485\n166073,452\n166074,304\n166075,23783\n166076,1860\n166077,1858\n166078,455\n166079,885\n166079,13704\n166081,1381\n166082,623\n166082,1805\n166083,1274\n166084,1\n166085,1132\n166086,1608\n166087,1608\n166088,1132\n166089,2923\n166090,2572\n166091,30\n166092,2590\n166093,602\n166094,536\n166095,1634\n166096,2995\n166097,227\n166098,4066\n166099,2526\n166100,693\n166101,30\n166103,450\n166104,589\n166105,3321\n166106,784\n166107,211\n166108,1019\n166109,34\n166109,35\n166110,8270\n166111,289\n166111,290\n166111,94134\n166112,3960\n166113,118\n166113,907\n166114,1010\n166115,433\n166116,27356\n166117,6027\n166118,16045\n166119,3960\n166120,4078\n166121,1133\n166122,200\n166123,602\n166124,118\n166124,4597\n166125,1019\n166126,383\n166127,5366\n166128,146\n166128,92476\n166129,200\n166130,1462\n166130,8537\n166131,9121\n166132,2620\n166133,2073\n166134,714\n166135,9018\n166136,1247\n166136,164572\n166137,622\n166138,1133\n166139,187\n166140,1001\n166141,7360\n166142,907\n166143,4453\n166144,1392\n166145,557\n166146,2051\n166147,211\n166148,585\n166149,1149\n166150,21826\n166151,1939\n166152,6068\n166153,158\n166154,332\n166155,8270\n166156,2995\n166157,3161\n166158,1659\n166159,8180\n166160,32475\n166161,383\n166162,9166\n166163,1849\n166164,207\n166165,254\n166166,5366\n166167,8788\n166168,1818\n166168,17245\n166169,772\n166170,7270\n166171,1807\n166172,2995\n166173,140\n166174,1227\n166174,86416\n166175,115\n166175,118\n166176,33201\n166177,146\n166177,92476\n166178,515\n166179,151\n166180,9121\n166181,693\n166182,1688\n166183,2379\n166184,264\n166185,1402\n166186,4980\n166187,557\n166188,622\n166189,622\n166190,50\n166190,222\n166190,248\n166190,1939\n166191,126\n166192,589\n166193,115\n166193,118\n166194,779\n166195,9560\n166196,126\n166197,49887\n166198,2929\n166199,267\n166200,953\n166200,3872\n166201,1181\n166202,275\n166203,1019\n166204,336\n166205,146\n166205,92476\n166206,7652\n166207,8180\n166208,3413\n166209,96187\n166210,784\n166211,515\n166212,42220\n166213,275\n166214,49057\n166215,2719\n166216,2292\n166217,8992\n166218,5976\n166219,30370\n166220,383\n166221,435\n166222,2209\n166223,4252\n166224,1235\n166224,1335\n166225,10\n166226,313\n166227,2574\n166228,298\n166229,5405\n166230,9030\n166231,1844\n166232,3999\n166233,248\n166234,631\n166235,222\n166236,151\n166237,50\n166238,682\n166238,72439\n166239,455\n166240,312\n166241,225\n166242,163\n166243,8235\n166244,2224\n166245,137\n166246,151\n166246,72439\n166247,83\n166248,36985\n166249,1379\n166250,42220\n166251,267\n166252,166253\n166254,171\n166255,171\n166256,273\n166257,872\n166258,1429\n166259,184\n166260,10\n166261,30\n166262,389\n166263,8788\n166264,577\n166265,1143\n166266,668\n166267,273\n166268,497\n166269,30\n166270,3041\n166271,83\n166273,195\n166274,355\n166275,192\n166275,256\n166278,1188\n166279,3769\n166280,217\n166280,13546\n166281,83\n166282,1132\n166283,781\n166284,255\n166285,124668\n166286,142473\n166288,313\n166288,455\n166288,657\n166288,1274\n166288,1718\n166288,2779\n166288,3252\n166288,4637\n166288,37088\n166288,45437\n166289,422\n166291,1860\n166292,1858\n166293,422\n166294,592\n166295,422\n166296,298\n166297,485\n166298,422\n166299,422\n166300,422\n166301,422\n166302,422\n166303,422\n166304,422\n166305,422\n166306,146\n166306,92476\n166307,647\n166308,344\n166309,83\n166310,388\n166311,5405\n166312,233\n166313,259\n166314,640\n166315,1381\n166316,1058\n166317,602\n166318,467\n166319,602\n166320,1453\n166322,273\n166323,1608\n166324,1132\n166325,1608\n166326,1132\n166327,1749\n166329,240\n166329,4355\n166330,611\n166330,1718\n166331,240\n166331,1085\n166331,1955\n166332,72\n166333,285\n166334,344\n166335,1181\n166336,1801\n166338,1458\n166338,183670\n166339,217\n166339,240\n166339,292\n166339,861\n166339,1204\n166339,1796\n166339,2017\n166340,1860\n166341,1858\n166342,417\n166343,332\n166344,602\n166345,166346\n166347,1449\n166347,1927\n166349,217\n166349,1417\n166350,115\n166350,118\n166351,2915\n166353,602\n166354,79\n166355,217\n166356,83\n166357,1467\n166358,994\n166359,493\n166360,1927\n166361,72\n166362,1749\n166364,138686\n166366,175\n166368,147\n166368,158\n166368,184\n166369,333\n166369,59021\n166370,252\n166372,298\n166373,20\n166373,743\n166374,68069\n166374,86832\n166376,83\n166378,10\n166378,1252\n166378,1253\n166379,510\n166382,462\n166385,2083\n166386,141912\n166390,68069\n166390,86832\n166391,68069\n166391,86832\n166392,68069\n166392,86832\n166393,920\n166395,106\n166395,147\n166395,149\n166395,406\n166397,200\n166398,68069\n166398,86832\n166399,68069\n166399,86832\n166400,579\n166402,557\n166403,3623\n166404,118\n166404,4597\n166406,68069\n166407,328\n166408,151\n166409,141912\n166411,68069\n166411,86832\n166412,68069\n166412,86832\n166413,660\n166414,1688\n166416,68069\n166417,1983\n166419,68069\n166421,68069\n166421,86832\n166422,1181\n166423,195\n166425,68069\n166425,86832\n166426,68069\n166426,86832\n166430,68069\n166430,86832\n166431,68069\n166431,86832\n166432,440\n166432,622\n166432,1033\n166432,141912\n166433,1631\n166434,994\n166436,68069\n166436,86832\n166438,3623\n166441,68069\n166441,86832\n166444,6387\n166445,6387\n166446,6387\n166448,68069\n166448,86832\n166450,1132\n166451,1608\n166453,720\n166453,907\n166453,973\n166453,1284\n166453,1715\n166453,1837\n166453,9024\n166454,760\n166457,68069\n166457,86832\n166458,68069\n166458,86832\n166460,83\n166463,275\n166466,166467\n166468,644\n166471,138686\n166472,1858\n166473,1860\n166474,994\n166475,175\n166479,2460\n166480,298\n166481,1241\n166483,68069\n166483,86832\n166485,417\n166487,338\n166487,4039\n166491,68069\n166491,86832\n166492,83\n166492,818\n166493,68069\n166493,86832\n166494,1390\n166495,1860\n166496,1858\n166498,1559\n166499,147\n166499,149\n166500,68069\n166500,86832\n166503,68069\n166503,86832\n166504,707\n166505,68069\n166505,86832\n166506,346\n166507,1707\n166508,707\n166510,251\n166511,2443\n166512,166513\n166512,178954\n166514,1837\n166516,68069\n166519,68069\n166520,68069\n166520,86832\n166521,1240\n166521,1644\n166521,68069\n166521,86832\n166522,3623\n166524,779\n166524,68069\n166524,86832\n166524,141912\n166525,68069\n166525,86832\n166526,1858\n166527,1860\n166528,141912\n166530,68069\n166530,86832\n166531,68069\n166532,83\n166533,4411\n166535,68069\n166535,86832\n166536,195\n166537,422\n166538,56\n166540,68069\n166540,86832\n166541,1619\n166542,68069\n166542,86832\n166543,907\n166544,743\n166544,1983\n166545,994\n166547,37414\n166548,1363\n166550,68069\n166550,86832\n166551,254\n166554,579\n166556,138686\n166557,175\n166559,298\n166562,422\n166563,68069\n166563,86832\n166563,169205\n166563,206795\n166563,214444\n166564,68069\n166567,731\n166569,406\n166570,2353\n166571,68069\n166571,86832\n166575,68069\n166575,86832\n166582,2353\n166583,2353\n166584,251\n166584,2353\n166598,68069\n166599,68069\n166599,86832\n166600,158\n166602,68069\n166603,2274\n166603,68069\n166603,86832\n166603,184321\n166604,68069\n166604,86832\n166605,68069\n166605,86832\n166606,360\n166606,2617\n166607,72\n166609,4411\n166610,68069\n166610,86832\n166611,7\n166613,68069\n166613,86832\n166615,1467\n166616,775\n166617,775\n166620,718\n166621,301\n166621,68069\n166624,8822\n166625,1381\n166628,760\n166629,1984\n166629,3949\n166630,1467\n166632,1858\n166633,1860\n166634,19488\n166635,72\n166636,602\n166637,302\n166638,104\n166638,852\n166639,4455\n166640,1860\n166641,1858\n166642,1858\n166643,1860\n166644,60576\n166645,167\n166646,406\n166647,563\n166648,330\n166649,809\n166650,333\n166651,255\n166652,1118\n166653,972\n166654,408\n166655,1326\n166656,1323\n166657,102\n166659,72\n166660,72\n166661,1608\n166662,1132\n166663,1515\n166666,240\n166667,1955\n166667,8180\n166668,68069\n166669,2784\n166670,1\n166671,2048\n166672,278\n166673,934\n166675,247\n166675,2867\n166675,2868\n166676,602\n166677,72\n166678,1984\n166679,2944\n166680,760\n166680,1631\n166681,2784\n166683,195\n166684,875\n166685,142430\n166685,142473\n166685,142879\n166685,215276\n166686,304\n166687,68069\n166687,86832\n166688,2353\n166689,151\n166692,2784\n166693,10\n166696,247\n166697,2353\n166698,760\n166699,72\n166700,805\n166701,1392\n166702,2784\n166703,151\n166704,240\n166704,1359\n166705,2784\n166706,72\n166707,1241\n166707,1298\n166707,1436\n166707,1479\n166707,1522\n166707,1616\n166707,2480\n166707,2557\n166707,2979\n166708,483\n166709,1284\n166710,2784\n166711,422\n166712,56\n166714,808\n166715,2784\n166716,151\n166717,209\n166718,2784\n166719,2784\n166720,875\n166721,2784\n166722,2296\n166723,68069\n166724,2784\n166725,56\n166726,422\n166727,68069\n166727,86832\n166728,2784\n166729,2784\n166730,536\n166731,72\n166732,217\n166733,252\n166734,72\n166735,2784\n166736,795\n166737,2373\n166738,2784\n166739,2784\n166740,2784\n166741,2784\n166742,113156\n166743,192\n166743,1243\n166744,2784\n166745,2784\n166746,467\n166748,306\n166748,307\n166748,406\n166748,620\n166749,301\n166750,2784\n166751,2784\n166752,72\n166753,72\n166754,2784\n166755,2784\n166756,140\n166758,72\n166759,72\n166760,30\n166761,392\n166762,2979\n166763,301\n166764,30\n166765,408\n166766,2784\n166767,166768\n166769,2784\n166770,920\n166771,631\n166772,861\n166773,301\n166774,44\n166775,4594\n166776,752\n166777,968\n166778,72\n166780,1381\n166781,250\n166781,1058\n166781,1381\n166781,1684\n166781,29380\n166782,72\n166783,1133\n166784,30\n166785,83\n166786,1235\n166786,1335\n166787,222\n166788,30\n166789,994\n166790,4220\n166791,2784\n166792,2784\n166793,406\n166794,1300\n166795,72\n166796,107\n166797,146\n166797,92476\n166798,647\n166799,344\n166800,3003\n166801,142405\n166802,83\n166803,2784\n166804,1531\n166805,557\n166806,862\n166807,707\n166808,72\n166809,209\n166809,489\n166810,72\n166811,843\n166812,1363\n166813,1659\n166814,302\n166815,147\n166818,58\n166819,72\n166820,760\n166821,1235\n166821,1335\n166822,68069\n166822,86832\n166823,166824\n166825,195\n166826,592\n166826,1818\n166827,2671\n166828,1707\n166829,485\n166830,298\n166831,420\n166832,1085\n166833,267\n166835,298\n166836,485\n166837,602\n166838,298\n166839,485\n166840,647\n166841,146\n166841,92476\n166842,344\n166843,72\n166844,111924\n166845,2784\n166846,2671\n166847,581\n166848,302\n166849,994\n166850,3623\n166851,602\n166852,310\n166852,805\n166853,885\n166853,13704\n166854,72\n166855,4192\n166855,4193\n166857,2784\n166858,1274\n166859,72\n166860,3623\n166861,3623\n166862,217\n166863,861\n166864,784\n166865,138686\n166866,175\n166867,298\n166868,861\n166869,2784\n166870,72\n166871,900\n166872,72\n166873,3623\n166874,4\n166874,5\n166874,994\n166874,1252\n166874,1253\n166875,3041\n166876,255\n166877,602\n166878,269\n166879,424\n166880,14472\n166881,485\n166882,298\n166883,1858\n166884,1860\n166885,2367\n166886,577\n166887,1247\n166887,164572\n166888,1381\n166889,83\n166890,1179\n166891,309\n166891,310\n166892,1\n166894,2411\n166895,72\n166896,30\n166897,355\n166898,207\n166899,422\n166900,56\n166901,422\n166902,56\n166903,298\n166904,485\n166905,647\n166906,344\n166907,146\n166907,92476\n166908,485\n166909,298\n166910,1087\n166911,72\n166912,344\n166913,285\n166914,1612\n166915,1634\n166916,1509\n166917,65\n166918,302\n166919,222\n166920,3623\n166921,233\n166922,2353\n166923,1010\n166924,640\n166925,344\n166926,146\n166926,92476\n166927,640\n166928,647\n166929,344\n166930,2353\n166931,30\n166934,893\n166935,2312\n166936,1858\n166937,1860\n166938,146\n166938,92476\n166939,647\n166940,344\n166941,4260\n166942,195\n166943,1132\n166944,781\n166945,146\n166945,92476\n166946,647\n166947,344\n166948,779\n166950,15748\n166951,1238\n166952,2671\n166954,422\n166955,422\n166956,422\n166957,422\n166958,422\n166959,647\n166960,146\n166960,92476\n166961,344\n166962,422\n166963,422\n166964,422\n166965,422\n166966,422\n166967,422\n166968,422\n166969,1663\n166970,852\n166970,75912\n166971,140\n166972,467\n166972,156379\n166973,2353\n166974,195\n166975,1663\n166976,30\n166977,1612\n166978,158\n166978,779\n166979,138686\n166980,175\n166981,2460\n166981,138686\n166982,1243\n166983,41\n166983,1462\n166983,8537\n166984,298\n166986,49057\n166987,1010\n166989,346\n166993,3\n166994,1707\n166995,4222\n166996,1608\n166997,1132\n166998,693\n166998,14366\n166999,113156\n167002,592\n167003,30\n167004,1452\n167005,83\n167006,10\n167007,1262\n167008,1858\n167009,1860\n167010,3623\n167011,255\n167013,147\n167014,138686\n167015,337\n167016,175\n167017,30\n167018,337\n167018,852\n167019,298\n167020,22\n167022,302\n167023,422\n167024,56\n167025,68069\n167025,86832\n167026,1172\n167028,195\n167029,104\n167030,1052\n167032,516\n167033,50\n167034,195\n167036,79\n167036,1181\n167037,644\n167037,1117\n167038,843\n167039,536\n167040,18831\n167041,843\n167042,592\n167044,2557\n167045,3623\n167046,269\n167047,718\n167048,3623\n167050,1363\n167051,1425\n167052,1118\n167053,577\n167055,841\n167056,611\n167058,2421\n167059,211\n167061,252\n167062,483\n167063,104\n167063,714\n167063,760\n167063,1458\n167064,397\n167066,86832\n167067,779\n167068,602\n167069,932\n167069,991\n167069,9029\n167070,86832\n167073,192\n167075,602\n167076,1659\n167077,86832\n167077,207750\n167078,292\n167079,138686\n167080,175\n167081,298\n167082,893\n167083,390\n167083,968\n167083,1326\n167083,3756\n167083,5301\n167084,1181\n167085,86832\n167086,435\n167086,1612\n167087,1566\n167088,6506\n167089,104\n167089,314\n167089,392\n167090,264\n167091,2353\n167092,103860\n167093,4146\n167094,55849\n167095,83\n167096,1298\n167097,518\n167098,467\n167099,86832\n167100,408\n167101,1326\n167102,1323\n167103,972\n167104,102\n167105,34\n167105,35\n167106,248\n167107,86832\n167108,264\n167108,1381\n167109,86832\n167110,86832\n167111,146\n167111,92476\n167112,647\n167113,344\n167114,2048\n167115,187\n167117,175\n167119,298\n167120,72\n167121,86832\n167122,733\n167123,289\n167123,290\n167123,94134\n167125,3623\n167126,602\n167128,195\n167130,120\n167131,146280\n167131,159365\n167133,86832\n167134,158\n167135,301\n167136,779\n167137,86832\n167139,868\n167140,195\n167142,592\n167142,1818\n167142,2315\n167143,167143\n167144,647\n167145,146\n167145,92476\n167146,344\n167147,1707\n167148,273\n167149,86832\n167150,431\n167150,6506\n167152,1132\n167153,781\n167155,83\n167156,30\n167157,1147\n167158,298\n167159,485\n167160,1368\n167162,30\n167163,158\n167164,2334\n167166,2209\n167167,393\n167170,48\n167171,120\n167172,1127\n167173,467\n167174,657\n167175,809\n167176,932\n167177,1240\n167182,289\n167182,290\n167182,94134\n167183,344\n167184,72\n167185,285\n167186,338\n167187,44\n167188,113156\n167189,366\n167190,366\n167191,366\n167192,366\n167193,366\n167194,911\n167195,366\n167196,1160\n167198,1782\n167199,72\n167200,86832\n167201,885\n167201,13704\n167203,302\n167204,557\n167205,8719\n167206,138\n167207,865\n167208,557\n167209,137\n167210,118\n167210,4597\n167211,1070\n167212,88820\n167213,1623\n167214,72\n167215,861\n167216,72\n167217,577\n167218,326\n167219,431\n167220,83\n167221,167222\n167223,622\n167224,1893\n167225,332\n167226,489\n167227,83\n167228,1001\n167229,30\n167230,151\n167231,2312\n167232,273\n167233,167234\n167235,2797\n167236,779\n167237,30\n167238,622\n167241,3623\n167242,30\n167243,424\n167244,72\n167245,577\n167246,267\n167247,1072\n167249,167250\n167251,167252\n167251,220846\n167253,422\n167254,422\n167255,422\n167256,422\n167257,167258\n167259,422\n167260,422\n167261,422\n167262,422\n167263,422\n167264,422\n167265,422\n167266,422\n167268,147\n167269,72\n167270,900\n167271,1001\n167272,167273\n167272,219415\n167274,973\n167275,225\n167276,392\n167277,72\n167279,2048\n167280,72\n167281,72\n167282,8884\n167284,72\n167285,366\n167286,503\n167287,148742\n167288,1085\n167289,483\n167290,167291\n167290,230604\n167292,298\n167293,485\n167294,355\n167295,233\n167296,167297\n167298,1458\n167299,83\n167300,255\n167301,171\n167302,72\n167303,105793\n167304,707\n167305,875\n167306,167307\n167308,406\n167309,781\n167310,1132\n167312,592\n167312,1818\n167313,784\n167314,509\n167315,640\n167316,1220\n167316,1222\n167317,516\n167318,252\n167319,360\n167320,2617\n167321,602\n167322,30\n167324,4545\n167324,139010\n167325,1359\n167326,408\n167327,1326\n167328,1323\n167329,102\n167330,272\n167330,2868\n167331,7358\n167331,7363\n167332,134\n167333,818\n167333,4193\n167334,2797\n167335,907\n167336,58\n167337,1313\n167338,72\n167339,972\n167340,4799\n167341,611\n167343,3085\n167344,134\n167345,366\n167346,44\n167347,602\n167348,192\n167351,5\n167351,1253\n167351,1432\n167351,2089\n167351,2940\n167351,5871\n167351,13704\n167351,171294\n167352,1962\n167353,206\n167355,72\n167356,41\n167357,592\n167358,30\n167359,30\n167360,483\n167361,72\n167363,3623\n167364,22071\n167365,760\n167366,72\n167367,1227\n167367,86416\n167368,72\n167369,3804\n167370,1436\n167371,8\n167372,1479\n167373,390\n167374,72\n167375,72\n167376,167377\n167378,3623\n167379,200\n167379,1282\n167380,22\n167381,200\n167382,261\n167383,167384\n167385,72\n167386,167387\n167388,72\n167389,72\n167390,4611\n167391,72\n167392,113156\n167393,72\n167394,63\n167395,1284\n167395,3474\n167396,994\n167396,48955\n167397,72\n167398,72\n167399,7416\n167400,72\n167401,1572\n167402,72\n167403,10\n167404,72\n167405,72\n167406,142405\n167407,72\n167408,2051\n167409,2574\n167410,850\n167411,233\n167412,1381\n167413,355\n167414,1939\n167415,602\n167416,255\n167417,298\n167418,107\n167419,292\n167420,1133\n167421,338\n167422,2416\n167422,2417\n167423,3538\n167424,68069\n167425,175\n167426,663\n167427,1252\n167427,1253\n167428,83\n167428,390\n167429,631\n167430,171\n167432,55849\n167433,1227\n167433,86416\n167434,72\n167435,167436\n167437,22\n167438,158\n167439,136\n167439,137\n167440,1631\n167441,167441\n167442,994\n167443,338\n167443,439\n167443,649\n167444,385\n167445,1087\n167446,872\n167447,72\n167448,328\n167449,167450\n167451,557\n167452,972\n167453,7360\n167455,994\n167456,2506\n167457,872\n167458,872\n167459,4223\n167460,167461\n167462,48\n167463,4594\n167464,30\n167465,298\n167466,485\n167467,55849\n167468,41\n167469,79\n167470,135\n167471,72\n167472,6303\n167473,72\n167474,302\n167475,1707\n167476,885\n167476,13704\n167477,137\n167478,355\n167480,994\n167481,557\n167482,557\n167483,557\n167484,298\n167485,485\n167486,772\n167486,6051\n167487,994\n167488,2607\n167489,994\n167490,994\n167491,483\n167492,3115\n167493,2979\n167494,5726\n167495,1425\n167496,4611\n167498,240\n167500,167501\n167502,2424\n167503,344\n167504,647\n167505,146\n167505,92476\n167506,736\n167507,972\n167508,113156\n167509,422\n167511,142473\n167516,167517\n167518,167517\n167519,167517\n167521,167\n167521,301\n167521,3207\n167522,278\n167523,5440\n167527,620\n167528,72\n167529,22\n167529,760\n167529,818\n167530,406\n167531,137\n167532,6249\n167533,306\n167533,307\n167534,72\n167535,1515\n167536,779\n167538,72\n167539,422\n167541,4545\n167541,139010\n167544,652\n167545,292\n167546,294\n167547,296\n167548,298\n167549,2889\n167550,247\n167551,1238\n167552,3507\n167553,1452\n167554,7155\n167555,167556\n167557,1849\n167558,4545\n167558,139010\n167559,346\n167560,355\n167561,233\n167562,10\n167562,30\n167562,34\n167562,35\n167562,65\n167562,79\n167562,120\n167562,158\n167562,192\n167562,206\n167562,217\n167562,264\n167562,267\n167562,278\n167562,305\n167562,309\n167562,310\n167562,328\n167562,333\n167562,417\n167562,435\n167562,440\n167562,485\n167562,493\n167562,509\n167562,628\n167562,712\n167562,718\n167562,760\n167562,779\n167562,872\n167562,1010\n167562,1033\n167562,1118\n167562,1179\n167562,1276\n167562,1282\n167562,1313\n167562,1509\n167562,1572\n167562,1659\n167562,1749\n167562,1939\n167562,1955\n167562,2146\n167562,2979\n167562,3297\n167562,5130\n167562,5265\n167562,6119\n167562,6837\n167562,16687\n167562,54284\n167562,127158\n167562,141912\n167563,41\n167564,86832\n167565,968\n167566,72\n167568,48\n167569,3804\n167569,4411\n167570,2334\n167571,1284\n167572,843\n167573,1181\n167574,389\n167575,83\n167577,1858\n167578,1860\n167582,83\n167583,736\n167584,142430\n167585,86832\n167586,704\n167587,107\n167587,4771\n167588,222\n167590,417\n167591,873\n167592,1210\n167593,919\n167594,1132\n167595,781\n167596,1858\n167597,1860\n167598,422\n167599,422\n167600,422\n167601,838\n167601,1014\n167602,422\n167603,422\n167604,422\n167606,422\n167607,422\n167608,422\n167609,422\n167610,422\n167611,422\n167612,919\n167613,366\n167614,1132\n167615,1608\n167616,736\n167618,850\n167619,510\n167621,3\n167622,795\n167624,30\n167625,1241\n167626,1572\n167627,3\n167628,138686\n167629,1417\n167630,175\n167631,602\n167632,602\n167633,252\n167633,1220\n167633,1222\n167634,298\n167635,330\n167636,248\n167636,1745\n167637,1566\n167638,690\n167639,1566\n167640,743\n167641,868\n167641,1033\n167641,118336\n167642,2312\n167643,2312\n167645,9457\n167646,760\n167647,907\n167648,337\n167649,390\n167650,79\n167651,652\n167652,3555\n167653,406\n167654,392\n167654,19010\n167655,640\n167656,142879\n167657,640\n167658,671\n167659,151\n167660,640\n167661,640\n167662,640\n167663,640\n167664,872\n167665,178\n167666,22\n167667,75912\n167668,217\n167668,536\n167671,868\n167673,433\n167674,1252\n167674,1253\n167675,138686\n167676,440\n167677,175\n167678,298\n167679,4545\n167679,139010\n167680,972\n167681,907\n167682,1556\n167683,435\n167685,79\n167686,6119\n167687,1893\n167687,2312\n167688,134\n167690,294\n167692,3003\n167693,136\n167694,994\n167695,184\n167697,142433\n167698,225\n167699,48\n167701,1072\n167702,941\n167703,302\n167704,255\n167705,255\n167706,255\n167707,167708\n167709,138686\n167710,577\n167710,1722\n167713,79\n167715,1127\n167717,269\n167718,875\n167719,4545\n167719,139010\n167720,779\n167721,2353\n167722,10\n167724,422\n167725,56\n167726,1801\n167727,1608\n167728,1132\n167729,273\n167732,1231\n167733,72\n167734,4545\n167734,139010\n167735,422\n167736,56\n167737,818\n167738,302\n167739,22293\n167740,346\n167741,1544\n167742,1151\n167743,202\n167744,2353\n167745,30\n167746,557\n167747,657\n167748,841\n167751,149\n167754,931\n167755,2989\n167755,2991\n167760,2371\n167761,1773\n167762,1544\n167763,408\n167764,102\n167765,1326\n167766,1323\n167768,2411\n167769,328\n167770,328\n167770,784\n167770,805\n167770,1119\n167771,818\n167772,477\n167773,299\n167774,392\n167776,184\n167777,206\n167777,142473\n167778,200\n167779,302\n167780,2073\n167781,861\n167781,2116\n167782,1579\n167783,72\n167784,285\n167785,344\n167786,579\n167787,1122\n167788,1531\n167789,1058\n167790,1231\n167791,850\n167792,255\n167793,107\n167795,579\n167796,13361\n167797,483\n167798,111\n167798,290\n167798,309\n167798,310\n167798,760\n167798,94134\n167799,557\n167800,2048\n167801,852\n167801,2590\n167801,4220\n167802,3695\n167803,3623\n167804,106\n167805,83\n167806,59\n167806,94\n167806,2787\n167806,3794\n167807,3\n167808,2083\n167808,5301\n167809,843\n167810,138686\n167811,175\n167812,104\n167813,298\n167814,298\n167815,142426\n167816,1773\n167817,636\n167818,68069\n167819,301\n167821,1858\n167822,1860\n167823,1807\n167824,285\n167825,1127\n167826,167827\n167828,119\n167829,2146\n167830,30\n167831,63\n167831,202\n167831,247\n167831,516\n167832,141912\n167833,422\n167834,372\n167835,184\n167836,104\n167837,312\n167838,932\n167839,1821\n167840,338\n167841,209\n167841,302\n167841,2116\n167843,146\n167843,92476\n167844,344\n167845,647\n167846,104\n167846,248\n167846,636\n167846,1282\n167848,44\n167849,849\n167851,344\n167852,647\n167853,146\n167853,92476\n167854,104\n167855,2775\n167856,447\n167857,104\n167857,557\n167858,1785\n167859,4545\n167859,139010\n167860,30\n167861,338\n167863,1608\n167864,406\n167865,302\n167866,1227\n167866,86416\n167867,885\n167867,13704\n167868,1220\n167868,1222\n167869,516\n167870,252\n167871,1220\n167871,1222\n167872,252\n167873,516\n167874,167875\n167876,30\n167877,106\n167878,861\n167879,1151\n167880,1467\n167882,818\n167883,1634\n167884,435\n167885,647\n167886,146\n167886,92476\n167887,344\n167888,137\n167889,1849\n167890,2315\n167891,467\n167892,536\n167893,145240\n167894,30\n167895,106\n167896,2315\n167897,19010\n167898,422\n167899,1983\n167900,55849\n167901,289\n167901,290\n167901,2296\n167901,94134\n167902,302\n167903,843\n167904,7416\n167905,818\n167906,55849\n167908,6119\n167909,2797\n167910,332\n167911,3331\n167912,3319\n167913,2797\n167914,3328\n167915,736\n167916,332\n167917,3331\n167918,3319\n167919,3328\n167920,2797\n167921,332\n167922,3331\n167923,344\n167924,72\n167925,285\n167926,2797\n167927,2797\n167928,3319\n167929,332\n167930,332\n167931,3331\n167932,2797\n167933,302\n167934,2797\n167935,3319\n167936,2797\n167937,2797\n167938,332\n167939,2797\n167940,332\n167941,788\n167942,332\n167943,3331\n167944,2797\n167945,406\n167946,2797\n167947,217\n167948,3331\n167949,3328\n167950,2797\n167951,332\n167952,3331\n167953,332\n167954,2797\n167955,332\n167956,3331\n167957,2797\n167958,2797\n167959,4411\n167960,79\n167961,2797\n167962,332\n167963,422\n167964,56\n167965,2797\n167966,2797\n167967,2797\n167968,2797\n167969,332\n167970,3331\n167971,388\n167972,167973\n167974,3331\n167975,332\n167976,3331\n167978,2797\n167979,332\n167980,332\n167981,3331\n167982,3331\n167983,332\n167984,3331\n167985,2797\n167986,332\n167987,3331\n167988,2797\n167989,332\n167990,332\n167991,332\n167992,3331\n167993,332\n167994,2797\n167995,332\n167996,422\n167997,2797\n167998,2797\n167999,2797\n168000,2797\n168001,2797\n168002,3328\n168003,3331\n168004,3331\n168005,3319\n168006,3319\n168007,3319\n168008,3331\n168009,332\n168010,3331\n168011,3331\n168012,332\n168013,332\n168014,30\n168015,332\n168016,3331\n168017,2797\n168018,332\n168019,2797\n168020,332\n168021,3331\n168022,2797\n168023,332\n168024,332\n168025,3331\n168026,2797\n168027,2797\n168028,749\n168029,3319\n168030,3328\n168031,3319\n168032,3319\n168033,3319\n168034,3331\n168035,3331\n168036,3319\n168037,3319\n168038,3331\n168039,3331\n168040,3319\n168041,3331\n168042,2797\n168043,3331\n168044,332\n168045,3331\n168046,332\n168047,332\n168048,3331\n168049,2797\n168050,2797\n168051,332\n168052,2797\n168053,2797\n168054,2797\n168055,332\n168056,247\n168057,3319\n168058,3328\n168059,3319\n168060,3328\n168061,4222\n168062,3328\n168063,3319\n168064,3319\n168065,861\n168066,3319\n168067,3319\n168068,3331\n168069,3319\n168070,332\n168071,2797\n168072,332\n168073,3319\n168074,3319\n168075,3319\n168076,332\n168077,3331\n168078,332\n168079,3331\n168080,3328\n168081,3319\n168082,3319\n168083,3328\n168084,3319\n168085,3319\n168086,3319\n168087,3328\n168088,2797\n168089,406\n168090,3319\n168091,3331\n168092,2797\n168093,332\n168094,3331\n168095,3331\n168096,3319\n168097,3331\n168098,3319\n168099,332\n168100,3331\n168103,3328\n168104,3319\n168105,3328\n168106,3328\n168107,3328\n168108,168109\n168110,3319\n168111,3328\n168112,30\n168113,332\n168114,3331\n168115,3331\n168116,3328\n168117,3319\n168118,3319\n168119,3319\n168120,3328\n168121,3328\n168122,3328\n168123,3328\n168124,467\n168125,3328\n168126,3328\n168127,3328\n168128,3319\n168129,3328\n168130,3319\n168131,3328\n168132,3331\n168133,3319\n168134,3328\n168135,3328\n168136,3328\n168137,3319\n168138,3319\n168139,3328\n168140,3328\n168141,3319\n168142,3328\n168143,3328\n168144,72\n168145,344\n168146,3328\n168147,285\n168148,3328\n168149,3328\n168150,3328\n168151,3328\n168152,3328\n168153,3328\n168154,3328\n168155,3328\n168156,3328\n168157,168158\n168157,246843\n168159,772\n168160,68\n168160,932\n168161,273\n168162,704\n168163,2146\n168164,247\n168165,283\n168165,455\n168165,2266\n168165,9343\n168166,72\n168167,326\n168168,72\n168169,704\n168170,72\n168171,72\n168172,772\n168173,72\n168174,240\n168175,592\n168176,1033\n168177,72\n168178,344\n168179,285\n168180,72\n168181,344\n168182,285\n168183,206\n168184,516\n168184,717\n168184,920\n168185,516\n168186,332\n168187,2797\n168188,3331\n168189,4545\n168189,139010\n168190,3319\n168191,3328\n168192,202\n168193,1133\n168194,337\n168194,338\n168194,393\n168194,439\n168194,626\n168194,649\n168194,772\n168194,2367\n168195,360\n168195,1893\n168196,168197\n168198,240\n168199,493\n168199,1265\n168199,1266\n168200,72\n168201,72\n168202,72\n168204,72\n168205,72\n168206,72\n168207,72\n168208,72\n168209,72\n168210,72\n168212,2051\n168213,392\n168214,72\n168215,72\n168216,269\n168217,72\n168218,72\n168219,202\n168219,142405\n168220,72\n168221,72\n168222,4545\n168222,139010\n168223,843\n168224,83\n168225,72\n168226,72\n168227,255\n168228,779\n168229,1\n168229,10\n168229,65\n168229,217\n168229,222\n168229,444\n168229,704\n168229,932\n168229,1001\n168229,1118\n168229,1122\n168229,1564\n168229,1962\n168230,168231\n168232,422\n168233,56\n168234,292\n168234,644\n168234,723\n168234,1012\n168234,2699\n168234,3999\n168234,5469\n168235,366\n168236,366\n168237,366\n168238,366\n168239,366\n168240,366\n168241,1414\n168242,344\n168243,72\n168244,285\n168245,146\n168245,779\n168245,92476\n168246,433\n168247,366\n168248,433\n168249,355\n168250,251\n168251,640\n168252,124668\n168254,485\n168255,298\n168257,63\n168259,622\n168260,209\n168263,1353\n168265,596\n168266,1860\n168267,1858\n168268,4545\n168268,139010\n168269,298\n168270,485\n168271,240\n168271,818\n168271,1623\n168271,127158\n168272,1707\n168273,749\n168274,301\n168275,233\n168276,1052\n168277,30\n168278,640\n168279,640\n168280,1220\n168280,1222\n168281,3695\n168284,1860\n168285,422\n168286,422\n168287,422\n168288,422\n168289,422\n168290,422\n168291,422\n168292,422\n168293,422\n168294,422\n168295,422\n168296,3218\n168297,1860\n168298,934\n168299,4545\n168299,139010\n168302,3999\n168302,36819\n168303,142433\n168304,1118\n168304,6837\n168305,147\n168307,1858\n168308,1860\n168309,818\n168310,439\n168310,22293\n168312,340\n168313,4545\n168313,139010\n168314,1983\n168316,149\n168317,72\n168318,1220\n168318,1222\n168319,202\n168320,1844\n168321,1844\n168322,1844\n168323,3260\n168324,2266\n168325,149534\n168326,149534\n168327,518\n168327,1326\n168328,1860\n168329,97\n168330,577\n168331,248\n168331,1332\n168332,209\n168334,138686\n168335,175\n168336,389\n168337,298\n168338,302\n168339,934\n168340,736\n168341,1893\n168342,206\n168343,772\n168344,1453\n168345,1177\n168346,736\n168347,2646\n168348,1133\n168350,2674\n168351,30\n168352,207\n168353,2083\n168354,158\n168355,1849\n168356,577\n168356,1105\n168358,1227\n168358,86416\n168359,1332\n168361,1359\n168362,200\n168362,8537\n168363,301\n168364,140\n168364,736\n168364,1289\n168364,1968\n168364,2367\n168367,140\n168368,247\n168369,158\n168369,1181\n168369,1515\n168369,21442\n168369,221309\n168369,221311\n168371,138686\n168372,175\n168373,298\n168374,251\n168375,510\n168376,934\n168377,41\n168378,1983\n168379,71\n168380,346\n168381,168382\n168383,2310\n168384,158\n168387,2310\n168388,3\n168388,509\n168388,510\n168388,693\n168388,872\n168388,875\n168388,29008\n168389,611\n168391,328\n168392,72\n168394,1522\n168394,2979\n168395,171\n168396,360\n168396,1893\n168397,149\n168398,130897\n168399,46\n168400,934\n168401,2083\n168403,72\n168404,34\n168404,35\n168405,697\n168406,1326\n168407,1893\n168408,346\n168410,83\n168411,167\n168412,340\n168412,459\n168412,874\n168412,1818\n168412,3999\n168413,602\n168414,994\n168415,138686\n168416,175\n168417,4571\n168418,298\n168419,72\n168420,269\n168421,1556\n168422,720\n168423,431\n168424,3769\n168425,2315\n168426,1893\n168427,1001\n168428,827\n168429,1436\n168430,86832\n168431,4611\n168432,1544\n168434,893\n168436,1085\n168437,1860\n168438,1858\n168439,4548\n168440,186\n168442,818\n168443,1818\n168444,19443\n168445,657\n168448,893\n168448,1659\n168449,19443\n168450,2224\n168451,5540\n168452,1893\n168453,217\n168454,818\n168455,19443\n168458,1707\n168459,1858\n168460,1860\n168461,1122\n168462,6661\n168467,1274\n168469,795\n168470,1085\n168470,2296\n168470,75912\n168471,1893\n168472,30\n168473,302\n168474,20\n168474,46\n168474,107\n168474,146\n168474,151\n168474,207\n168474,273\n168474,332\n168474,349\n168474,390\n168474,424\n168474,438\n168474,479\n168474,497\n168474,536\n168474,579\n168474,647\n168474,657\n168474,736\n168474,794\n168474,835\n168474,874\n168474,907\n168474,1058\n168474,1188\n168474,1282\n168474,1293\n168474,1425\n168474,1749\n168474,1775\n168474,1818\n168474,2191\n168474,2315\n168474,2480\n168474,2528\n168474,2620\n168474,2701\n168474,2744\n168474,3041\n168474,3538\n168474,4691\n168474,7155\n168474,28130\n168474,88820\n168474,92476\n168474,171294\n168475,340\n168476,2353\n168478,861\n168480,184\n168480,118336\n168481,158\n168482,1718\n168483,2590\n168484,2590\n168485,503\n168486,592\n168487,56\n168488,422\n168489,435\n168490,408\n168491,1323\n168492,102\n168493,1326\n168494,72\n168495,2048\n168496,435\n168497,1285\n168498,4260\n168499,264\n168499,808\n168499,1118\n168500,3\n168501,1140\n168502,360\n168503,72\n168505,184\n168507,2506\n168508,996\n168509,272\n168509,934\n168509,1449\n168509,1612\n168510,868\n168512,919\n168513,302\n168513,2116\n168514,843\n168515,55849\n168516,298\n168517,485\n168518,1122\n168519,994\n168520,168521\n168522,115474\n168523,994\n168524,326\n168524,1151\n168525,5908\n168526,73570\n168527,83\n168528,422\n168529,56\n168530,178\n168530,1877\n168531,623\n168533,2775\n168534,2775\n168535,83\n168536,588\n168536,590\n168536,1419\n168537,509\n168537,875\n168538,35750\n168538,35751\n168539,2620\n168544,346\n168548,3623\n168549,994\n168550,55849\n168551,34\n168551,35\n168552,1531\n168553,1531\n168554,4165\n168555,184\n168556,233\n168557,422\n168558,56\n168559,302\n168560,861\n168561,579\n168562,1556\n168563,168564\n168563,190299\n168565,217\n168567,875\n168568,2266\n168569,3623\n168570,1220\n168570,1222\n168571,516\n168572,252\n168573,626\n168575,994\n168577,72\n168578,344\n168579,285\n168581,1769\n168582,72\n168583,83\n168584,83\n168585,349\n168585,575\n168587,111\n168587,240\n168587,588\n168587,590\n168587,8180\n168588,178\n168589,366\n168590,302\n168591,2373\n168592,142430\n168592,147191\n168593,30\n168594,192\n168594,195\n168594,302\n168595,1181\n168595,1220\n168595,1222\n168595,1266\n168595,2782\n168596,83\n168598,1893\n168599,168600\n168601,278\n168604,994\n168605,743\n168606,8788\n168606,17263\n168606,29253\n168606,29294\n168607,1556\n168608,3623\n168609,72\n168610,298\n168611,485\n168612,647\n168613,146\n168613,92476\n168614,344\n168615,794\n168616,72\n168617,344\n168618,72\n168619,285\n168620,72\n168621,932\n168622,2607\n168623,861\n168625,557\n168626,1556\n168627,283\n168628,588\n168628,590\n168628,1419\n168629,56\n168629,1243\n168630,72\n168631,861\n168632,483\n168633,366\n168634,247\n168635,298\n168636,485\n168637,207\n168638,72\n168639,298\n168640,485\n168641,87\n168641,217\n168641,392\n168641,595\n168641,843\n168641,872\n168641,1453\n168641,1465\n168641,1572\n168641,2274\n168641,2697\n168641,24763\n168642,1623\n168643,222\n168643,1572\n168645,4571\n168646,63\n168646,90845\n168647,83\n168649,1801\n168650,485\n168651,298\n168652,302\n168653,72\n168654,302\n168655,934\n168656,2073\n168657,2372\n168658,72\n168659,885\n168659,13704\n168660,422\n168661,56\n168662,358\n168663,1\n168664,861\n168665,72\n168666,217\n168667,406\n168668,72\n168669,2367\n168670,859\n168671,577\n168672,140\n168673,1860\n168674,435\n168675,536\n168676,467\n168677,83\n168678,392\n168679,217\n168680,1010\n168681,2797\n168682,195\n168683,1474\n168684,302\n168685,843\n168686,222\n168687,267\n168688,4545\n168688,139010\n168689,222\n168690,2646\n168691,278\n168692,622\n168693,344\n168694,72\n168695,285\n168696,134\n168697,1419\n168698,588\n168698,590\n168699,83\n168700,151\n168701,875\n168702,435\n168703,640\n168704,467\n168704,1590\n168705,72\n168706,843\n168707,671\n168708,30\n168709,83\n168710,72\n168712,72\n168713,168714\n168715,72\n168716,900\n168717,83\n168718,571\n168719,147\n168720,83\n168721,1860\n168722,1858\n168723,255\n168724,65\n168724,586\n168725,577\n168726,631\n168726,760\n168727,1132\n168728,264\n168729,83\n168730,72\n168731,2116\n168732,1381\n168733,313\n168734,4545\n168734,139010\n168735,424\n168736,168737\n168739,72\n168740,1007\n168741,72\n168742,23783\n168743,1001\n168744,86832\n168745,292\n168745,801\n168745,1177\n168745,1893\n168745,3370\n168745,14453\n168746,1240\n168747,1181\n168748,1007\n168749,2590\n168750,298\n168751,485\n168752,168753\n168752,246247\n168754,72\n168755,636\n168757,168758\n168759,435\n168760,366\n168761,366\n168762,72\n168763,4545\n168763,139010\n168764,355\n168765,1089\n168768,251\n168769,302\n168771,302\n168772,1298\n168773,83\n168774,4611\n168775,4611\n168776,1544\n168777,1544\n168778,73570\n168779,1544\n168780,4611\n168781,1238\n168782,1452\n168783,1143\n168784,1033\n168786,3507\n168787,907\n168788,671\n168789,48\n168790,1132\n168791,142879\n168793,795\n168794,859\n168795,6627\n168796,4545\n168796,139010\n168798,1707\n168800,142433\n168801,48\n168802,640\n168803,640\n168805,640\n168806,1007\n168807,640\n168808,1454\n168809,22\n168810,640\n168811,640\n168812,83\n168813,392\n168813,509\n168813,1240\n168814,298\n168815,485\n168816,422\n168817,422\n168818,422\n168819,422\n168820,422\n168821,422\n168822,422\n168823,1\n168823,149\n168824,422\n168825,422\n168826,422\n168827,422\n168828,207\n168829,2671\n168830,107\n168830,1984\n168831,65\n168832,868\n168833,1893\n168834,1359\n168835,2775\n168835,4548\n168836,15\n168837,1113\n168838,2209\n168839,1326\n168840,58\n168841,104\n168841,136\n168841,557\n168841,1368\n168842,59021\n168845,1052\n168846,83\n168847,1238\n168848,23783\n168849,1707\n168851,1551\n168852,298\n168853,485\n168854,22\n168854,760\n168855,1707\n168856,4545\n168856,139010\n168857,875\n168858,104\n168859,1551\n168860,2590\n168861,1769\n168861,3260\n168862,1551\n168863,1551\n168864,298\n168865,485\n168866,441\n168868,63\n168869,302\n168870,209\n168871,3830\n168872,138686\n168873,175\n168876,298\n168877,328\n168878,137\n168879,209\n168880,1745\n168881,1231\n168883,636\n168884,994\n168885,1801\n168886,126\n168886,2253\n168886,5310\n168887,1707\n168888,19\n168888,1881\n168889,752\n168889,2590\n168891,1001\n168893,3258\n168894,142409\n168895,760\n168895,6556\n168896,273\n168897,1363\n168898,142473\n168899,647\n168900,146\n168900,92476\n168901,344\n168902,1429\n168903,168904\n168905,151\n168906,209\n168907,1616\n168908,3370\n168908,14453\n168909,104\n168909,557\n168909,953\n168909,954\n168909,1939\n168910,31073\n168911,779\n168912,38158\n168913,682\n168913,72439\n168914,202\n168914,252\n168914,516\n168915,301\n168916,202\n168917,83\n168918,4545\n168918,139010\n168919,1143\n168920,158\n168921,1580\n168922,178\n168922,302\n168922,467\n168923,72\n168925,5366\n168925,8598\n168926,328\n168926,1282\n168926,173296\n168927,477\n168928,68069\n168929,79\n168930,72\n168931,872\n168932,996\n168933,109503\n168935,557\n168936,10\n168937,31073\n168938,1566\n168939,2460\n168940,337\n168941,360\n168942,2371\n168943,3148\n168943,6323\n168944,649\n168945,141912\n168946,138686\n168947,175\n168948,3623\n168949,893\n168950,3769\n168951,298\n168952,302\n168953,22\n168954,673\n168956,138686\n168957,424\n168958,301\n168959,736\n168960,209\n168961,104\n168962,957\n168962,1815\n168963,79\n168964,994\n168966,668\n168969,805\n168970,302\n168972,1298\n168974,127158\n168975,30\n168976,406\n168977,138686\n168978,175\n168979,217\n168979,240\n168979,818\n168980,298\n168981,2296\n168982,707\n168983,579\n168984,168985\n168986,431\n168987,72\n168988,344\n168989,285\n168993,1149\n168994,762\n168995,302\n168996,30\n168997,209\n168998,83\n168999,2209\n169000,536\n169001,3\n169002,1319\n169003,273\n169004,58\n169005,994\n169006,46\n169007,141912\n169008,83\n169009,811\n169010,843\n169011,134\n169012,19010\n169013,8822\n169014,3474\n169015,592\n169016,5405\n169019,88820\n169020,736\n169021,169022\n169023,920\n169024,577\n169024,852\n169025,5547\n169026,1252\n169026,1253\n169028,273\n169029,77\n169031,169032\n169033,422\n169034,56\n169035,1425\n169036,408\n169037,1323\n169038,102\n169039,1326\n169041,113156\n169042,301\n169043,255\n169044,1400\n169045,83\n169046,1707\n169047,147\n169049,1240\n169051,59021\n169052,30\n169054,2048\n169055,577\n169056,10\n169056,302\n169056,304\n169056,579\n169056,932\n169056,1118\n169056,1122\n169056,1522\n169056,1572\n169057,4545\n169057,56150\n169057,139010\n169059,996\n169060,852\n169061,877\n169063,83\n169064,72\n169065,1149\n169067,195\n169068,7360\n169069,209\n169070,752\n169072,301\n169072,302\n169072,690\n169072,818\n169072,868\n169072,2292\n169072,3089\n169072,3507\n169072,68069\n169073,444\n169075,147\n169076,240\n169077,1381\n169077,9015\n169078,30\n169079,195\n169080,447\n169081,83\n169082,30\n169083,2867\n169083,2868\n169084,158\n169085,1323\n169086,344\n169087,852\n169088,2210\n169088,4237\n169089,3623\n169090,422\n169091,56\n169092,169093\n169094,30\n169095,602\n169096,42064\n169097,30\n169098,2775\n169099,169100\n169101,1117\n169101,1715\n169102,83\n169103,372\n169104,1425\n169105,200\n169105,299\n169105,2674\n169105,2779\n169105,30331\n169105,142433\n169106,557\n169108,1012\n169109,30\n169110,72\n169111,72\n169112,1551\n169113,417\n169114,209\n169115,127617\n169116,994\n169117,169118\n169119,142473\n169120,1231\n169121,622\n169122,22\n169123,1566\n169124,510\n169125,557\n169126,1608\n169127,30\n169128,72\n169129,30\n169130,4545\n169130,139010\n169131,626\n169132,467\n169133,980\n169134,217\n169134,240\n169134,592\n169134,1818\n169135,592\n169136,178\n169136,435\n169136,1590\n169137,267\n169138,422\n169139,56\n169140,6303\n169141,2923\n169142,1531\n169143,431\n169144,83\n169145,3623\n169146,875\n169147,1782\n169149,2626\n169150,516\n169151,252\n169152,1220\n169152,1222\n169153,932\n169154,10\n169155,200\n169156,72\n169157,615\n169158,406\n169159,516\n169160,1353\n169161,596\n169163,994\n169165,885\n169165,13704\n169166,406\n169167,3623\n169168,372\n169168,1085\n169169,2775\n169170,3623\n169171,247\n169172,83\n169173,563\n169174,483\n169175,72\n169176,491\n169176,1449\n169177,248\n169178,254\n169180,207\n169180,874\n169180,1133\n169181,72\n169183,72\n169184,72\n169185,72\n169186,328\n169187,1274\n169188,1381\n169189,366\n169190,309\n169190,310\n169191,818\n169192,72\n169193,483\n169194,269\n169195,5906\n169196,557\n169197,278\n169198,626\n169199,137\n169200,862\n169201,48\n169202,34\n169202,536\n169203,2506\n169204,72\n169206,6837\n169207,13919\n169208,920\n169209,146\n169209,92476\n169210,1\n169212,34\n169212,35\n169212,222\n169212,1618\n169212,2224\n169212,2944\n169213,25348\n169213,101688\n169214,406\n169215,81\n169216,1181\n169217,72\n169218,2775\n169219,1655\n169220,83\n169220,278\n169221,1801\n169222,4545\n169222,139010\n169223,2292\n169223,2889\n169224,676\n169225,233\n169225,3135\n169226,355\n169227,3585\n169228,72\n169229,372\n169230,22\n169231,2083\n169232,457\n169233,48\n169234,452\n169235,2244\n169236,1688\n169237,169238\n169239,3003\n169240,596\n169241,72\n169242,4545\n169242,139010\n169243,255\n169244,1655\n169245,885\n169245,13704\n169246,48\n169247,48\n169248,72\n169249,169250\n169251,920\n169252,72\n169253,72\n169254,22\n169255,30\n169256,147\n169257,169258\n169259,30\n169260,1363\n169261,169262\n169261,199537\n169263,3260\n169264,206\n169265,1849\n169266,422\n169267,56\n169268,1556\n169269,918\n169270,497\n169272,147\n169273,424\n169274,72\n169277,1432\n169278,875\n169279,169280\n169281,1467\n169282,455\n169283,2424\n169284,72\n169285,30\n169286,1871\n169287,862\n169287,2590\n169288,2421\n169289,83\n169290,13980\n169291,195\n169292,3041\n169293,255\n169294,169295\n169296,169297\n169298,304\n169299,169300\n169301,1707\n169302,626\n169302,2995\n169303,366\n169304,366\n169305,366\n169306,366\n169307,2048\n169308,355\n169309,22\n169310,30\n169311,21442\n169312,19010\n169313,358\n169314,104\n169315,312\n169316,22\n169317,1149\n169318,801\n169318,1177\n169319,2443\n169321,3207\n169322,1707\n169323,22\n169324,55849\n169325,467\n169325,868\n169326,425\n169328,585\n169328,718\n169329,1227\n169329,86416\n169330,1631\n169331,640\n169332,697\n169332,1769\n169333,142430\n169333,147191\n169334,1927\n169335,636\n169336,79\n169338,1608\n169339,431\n169339,631\n169340,704\n169341,2646\n169342,1298\n169343,72\n169344,344\n169345,285\n169346,79\n169347,6726\n169348,673\n169349,200\n169351,292\n169352,79\n169353,422\n169354,422\n169355,422\n169356,422\n169357,422\n169359,422\n169360,422\n169361,422\n169362,83\n169363,422\n169364,422\n169365,302\n169367,217\n169367,1417\n169369,171\n169370,422\n169372,760\n169374,827\n169375,2989\n169375,2991\n169376,118\n169376,4597\n169377,222\n169377,283\n169377,743\n169377,1983\n169377,35486\n169379,267\n169382,9005\n169383,138686\n169384,175\n169385,149\n169385,158\n169385,406\n169386,1033\n169388,62561\n169389,298\n169390,2244\n169393,818\n169394,233\n169396,313\n169397,1860\n169398,1858\n169399,134\n169401,467\n169401,571\n169401,868\n169402,1707\n169404,843\n169406,2671\n169407,493\n169408,169409\n169410,718\n169410,1968\n169411,849\n169412,652\n169413,1579\n169414,217\n169415,1849\n169416,657\n169417,1363\n169417,5591\n169418,447\n169419,2775\n169422,372\n169423,1118\n169424,302\n169424,893\n169425,843\n169426,337\n169427,169428\n169429,138686\n169430,175\n169431,1955\n169432,660\n169433,298\n169434,50\n169435,843\n169436,397\n169436,483\n169437,859\n169438,3623\n169439,3623\n169441,4545\n169441,139010\n169442,209\n169443,431\n169445,169446\n169445,224354\n169445,235366\n169447,169446\n169448,302\n169449,489\n169449,258973\n169450,1858\n169451,1860\n169452,649\n169453,247\n169453,2867\n169453,2868\n169455,19443\n169456,158\n169456,406\n169457,146\n169457,92476\n169458,647\n169459,344\n169460,68069\n169460,141912\n169461,843\n169462,1181\n169463,1011\n169464,5726\n169465,2367\n169466,1241\n169467,720\n169468,195\n169468,147191\n169469,1188\n169470,156379\n169471,1858\n169472,1860\n169473,392\n169474,79\n169475,151\n169476,169477\n169478,147\n169479,309\n169479,310\n169479,3039\n169480,37\n169480,356\n169480,717\n169480,1782\n169481,1172\n169483,209\n169484,1511\n169484,3069\n169485,138686\n169486,175\n169487,298\n169488,336\n169489,1858\n169490,1860\n169491,292\n169492,775\n169493,1707\n169494,392\n169495,1858\n169496,1860\n169497,113156\n169498,622\n169499,781\n169500,408\n169501,1323\n169502,102\n169503,1326\n169504,3695\n169508,500\n169509,1882\n169510,1962\n169511,2775\n169512,1052\n169513,54\n169515,3830\n169516,217\n169518,126\n169519,1858\n169520,1860\n169521,146\n169521,92476\n169522,647\n169523,344\n169524,577\n169525,254\n169526,809\n169527,577\n169528,718\n169529,3623\n169530,272\n169531,424\n169533,1181\n169534,149534\n169535,72\n169536,467\n169537,1140\n169538,592\n169539,1381\n169539,1634\n169540,3\n169541,577\n169542,302\n169544,1058\n169545,83\n169546,843\n169547,360\n169547,1893\n169548,104\n169548,592\n169548,1745\n169549,146\n169549,92476\n169550,862\n169551,138686\n169552,175\n169553,417\n169556,1782\n169557,392\n169559,298\n169560,192\n169563,4545\n169563,139010\n169564,283\n169564,455\n169566,3623\n169567,497\n169567,1655\n169568,4903\n169569,50\n169569,192\n169569,1181\n169569,1425\n169570,169571\n169572,145751\n169573,483\n169576,500\n169577,366\n169578,19010\n169579,2373\n169580,5310\n169581,4549\n169582,1353\n169583,2735\n169584,4545\n169584,139010\n169585,1607\n169586,1390\n169587,72\n169588,4220\n169589,328\n169590,83\n169591,1265\n169591,1266\n169592,2083\n169593,1381\n169594,7360\n169595,379\n169595,2646\n169596,360\n169600,240\n169600,301\n169600,372\n169600,589\n169600,801\n169600,968\n169600,1140\n169600,1309\n169600,1522\n169600,1544\n169600,1818\n169600,1893\n169600,1955\n169601,1836\n169603,13661\n169604,44\n169605,4611\n169606,169607\n169608,81\n169608,107\n169608,111\n169608,233\n169608,240\n169608,292\n169608,294\n169608,298\n169608,323\n169608,338\n169608,372\n169608,390\n169608,417\n169608,442\n169608,503\n169608,525\n169608,557\n169608,592\n169608,818\n169608,862\n169608,932\n169608,953\n169608,1046\n169608,1085\n169608,1133\n169608,1149\n169608,1179\n169608,1370\n169608,1392\n169608,1564\n169608,1580\n169608,1608\n169608,1635\n169608,1715\n169608,1749\n169608,1782\n169608,1818\n169608,1837\n169608,1893\n169608,2205\n169608,2209\n169608,2296\n169608,2334\n169608,2416\n169608,2417\n169608,2744\n169608,2812\n169608,3507\n169608,3538\n169608,4294\n169608,4355\n169608,5265\n169608,6068\n169608,7155\n169608,7233\n169608,8537\n169608,9021\n169608,9025\n169608,21711\n169608,33424\n169610,435\n169611,1\n169612,392\n169612,1769\n169613,477\n169614,72\n169615,3148\n169616,1983\n169617,467\n169618,50\n169619,163\n169619,1127\n169619,1893\n169621,72\n169622,18831\n169623,366\n169624,636\n169624,1332\n169624,1844\n169625,843\n169626,7416\n169627,192\n169627,272\n169627,336\n169627,337\n169627,393\n169627,435\n169627,516\n169627,663\n169627,980\n169627,1033\n169627,1175\n169627,1265\n169627,1266\n169627,1370\n169627,1590\n169627,1776\n169627,4545\n169627,139010\n169628,366\n169629,861\n169630,217\n169632,579\n169633,1556\n169634,302\n169635,289\n169635,290\n169635,94134\n169636,557\n169637,1429\n169638,2266\n169639,217\n169640,1201\n169641,455\n169642,34\n169642,35\n169643,388\n169644,2421\n169645,1274\n169647,1\n169649,596\n169650,4545\n169650,139010\n169651,872\n169652,392\n169653,312\n169654,358\n169655,1474\n169656,169657\n169656,170533\n169656,188832\n169656,190378\n169658,563\n169659,8854\n169661,72\n169662,330\n169663,875\n169664,4594\n169665,1177\n169666,557\n169667,862\n169668,2775\n169669,447\n169670,2989\n169670,2991\n169671,169671\n169672,83\n169673,2671\n169674,72\n169675,169676\n169677,113156\n169678,596\n169679,145502\n169680,72\n169681,72\n169682,1058\n169683,30\n169684,875\n169685,211\n169685,240\n169685,518\n169685,1326\n169685,1659\n169685,6556\n169686,209\n169687,389\n169687,455\n169688,302\n169689,142426\n169690,2260\n169691,72\n169692,22\n169693,1235\n169693,1335\n169694,875\n169695,72\n169696,949\n169697,885\n169697,13704\n169698,30\n169699,3182\n169700,1722\n169701,344\n169702,138686\n169703,1078\n169704,72\n169705,175\n169706,366\n169707,298\n169708,435\n169709,68069\n169710,72\n169711,72\n169712,843\n169713,861\n169714,581\n169715,48505\n169716,809\n169717,4771\n169718,46\n169719,994\n169720,58\n169721,169722\n169723,72\n169725,1068\n169726,169727\n169728,267\n169729,106\n169730,72\n169731,581\n169731,918\n169732,72\n169733,301\n169734,72\n169735,515\n169736,72\n169737,920\n169739,72\n169740,972\n169741,72\n169742,255\n169743,34\n169743,217\n169743,536\n169743,1417\n169744,422\n169745,56\n169746,72\n169747,240\n169748,8854\n169749,4411\n169750,72\n169751,330\n169752,563\n169753,577\n169754,72\n169755,388\n169755,1113\n169756,169757\n169758,306\n169758,307\n169759,392\n169760,900\n169761,142870\n169763,15609\n169764,875\n169765,77\n169767,169768\n169769,83\n169770,8854\n169771,169772\n169773,852\n169774,2590\n169775,169776\n169777,668\n169779,72\n169780,22\n169781,169782\n169783,862\n169784,4220\n169785,120774\n169786,72\n169787,207\n169788,75912\n169789,72\n169790,72\n169791,72\n169792,872\n169793,72\n169794,366\n169795,577\n169796,366\n169797,366\n169798,1143\n169799,1429\n169800,809\n169801,72\n169802,104\n169802,136\n169802,138\n169803,1893\n169804,133560\n169805,155481\n169807,355\n169808,128905\n169808,173664\n169808,173712\n169808,189173\n169809,1\n169810,1085\n169811,1113\n169811,48505\n169812,255\n169813,169814\n169816,6556\n169819,1983\n169821,209\n169823,717\n169824,142405\n169825,2353\n169826,209\n169827,72\n169828,760\n169828,1243\n169829,356\n169830,875\n169831,2775\n169832,447\n169833,875\n169834,875\n169835,1235\n169835,1335\n169837,1082\n169838,809\n169838,19010\n169839,34\n169839,35\n169839,313\n169839,634\n169839,1313\n169839,1718\n169839,2224\n169839,2646\n169840,136072\n169841,1247\n169841,164572\n169842,485\n169843,360\n169844,439\n169845,640\n169846,192\n169847,422\n169848,422\n169849,422\n169850,422\n169851,422\n169852,422\n169853,422\n169854,146\n169854,92476\n169855,647\n169856,344\n169857,422\n169858,422\n169859,1370\n169860,4222\n169863,1452\n169863,1579\n169863,2312\n169864,685\n169864,1688\n169865,252\n169865,1220\n169865,1222\n169865,2400\n169865,108042\n169865,165762\n169865,190346\n169866,3623\n169867,1011\n169867,1381\n169867,3999\n169868,169869\n169870,422\n169871,1238\n169872,1072\n169872,13661\n169873,626\n169874,155481\n169875,1289\n169876,622\n169877,138686\n169878,75912\n169879,313\n169880,175\n169881,13661\n169882,107\n169882,805\n169883,980\n169884,298\n169885,1276\n169886,497\n169888,2671\n169889,1177\n169889,2210\n169889,182162\n169890,752\n169891,1608\n169892,1132\n169893,2775\n169894,447\n169895,784\n169896,818\n169897,289\n169897,290\n169897,2296\n169897,94134\n169901,302\n169902,1452\n169904,146\n169904,92476\n169905,647\n169906,344\n169907,596\n169908,1715\n169909,151\n169909,788\n169910,1240\n169911,1177\n169911,6263\n169912,2989\n169912,2991\n169913,602\n169914,1096\n169915,1425\n169916,68\n169917,805\n169918,1132\n169919,1282\n169920,2775\n169921,447\n169922,3623\n169923,626\n169924,1151\n169925,781\n169926,302\n169927,1370\n169928,1140\n169929,3724\n169930,22\n169931,1033\n169932,3623\n169933,779\n169936,557\n169937,169938\n169939,192\n169940,18831\n169941,1608\n169942,304\n169942,356\n169942,852\n169943,302\n169945,875\n169947,222\n169947,657\n169947,1019\n169947,1871\n169947,2266\n169947,6789\n169948,818\n169948,127158\n169949,1893\n169950,138686\n169951,175\n169953,298\n169954,195\n169954,406\n169954,599\n169954,640\n169957,1072\n169958,3623\n169959,22524\n169960,1634\n169962,360\n169962,589\n169963,1608\n169964,1132\n169965,1319\n169966,34\n169966,35\n169966,406\n169967,79\n169968,145240\n169969,72\n169970,818\n169971,698\n169971,873\n169972,392\n169972,1240\n169973,743\n169974,72\n169975,3623\n169976,392\n169978,200\n169980,72\n169982,4771\n169983,22\n169984,145751\n169985,1509\n169986,355\n169986,4571\n169987,1608\n169988,920\n169989,5591\n169990,718\n169991,932\n169991,991\n169991,2416\n169991,2417\n169991,5908\n169992,209\n169993,657\n169994,1332\n169994,145524\n169995,611\n169996,1370\n169997,622\n169999,163\n169999,305\n169999,489\n169999,1132\n169999,3003\n170000,779\n170000,21442\n170002,79\n170002,127158\n170003,1175\n170005,1019\n170006,1085\n170007,19010\n170008,72\n170009,155481\n170010,158\n170010,366\n170010,694\n170011,2244\n170012,1436\n170012,1882\n170013,1140\n170014,592\n170015,155481\n170016,1359\n170017,23783\n170018,850\n170019,1984\n170020,72\n170021,2590\n170022,72\n170023,72\n170024,298\n170025,485\n170027,113156\n170028,298\n170029,485\n170030,980\n170031,557\n170032,240\n170032,818\n170032,1285\n170032,1807\n170032,1888\n170032,127158\n170032,179804\n170033,697\n170034,192\n170035,392\n170036,192\n170036,1033\n170038,811\n170039,435\n170040,1319\n170041,240\n170042,155481\n170044,72\n170045,467\n170046,1801\n170047,289\n170047,290\n170047,94134\n170048,83\n170048,278\n170049,302\n170050,30\n170051,4545\n170051,139010\n170052,301\n170053,795\n170054,968\n170055,510\n170056,170057\n170058,1893\n170059,861\n170060,255\n170062,138686\n170063,175\n170064,1893\n170065,72\n170066,298\n170067,505\n170068,87\n170069,392\n170070,202\n170071,72\n170072,170073\n170074,72\n170075,392\n170076,155481\n170077,809\n170078,467\n170079,752\n170080,44\n170081,72\n170082,72\n170083,294\n170083,631\n170084,302\n170085,72\n170087,392\n170087,2699\n170088,72\n170089,170090\n170092,72\n170093,298\n170094,485\n170095,2367\n170096,298\n170097,485\n170098,1522\n170099,1285\n170100,577\n170101,72\n170103,5375\n170104,1368\n170105,338\n170106,72\n170107,170108\n170109,9343\n170110,1836\n170111,72\n170112,107\n170113,68069\n170114,1001\n170115,5987\n170116,3623\n170117,875\n170118,109503\n170119,809\n170120,1425\n170121,304\n170122,72\n170124,63\n170124,202\n170124,251\n170124,346\n170125,422\n170126,56\n170127,72\n170128,489\n170129,328\n170129,704\n170129,134822\n170130,30\n170131,13\n170132,83\n170133,704\n170133,134822\n170134,1265\n170134,1266\n170135,1177\n170136,206\n170136,254\n170137,2373\n170139,8719\n170140,8719\n170141,557\n170142,138\n170143,865\n170144,557\n170145,137\n170146,118\n170146,4597\n170147,88820\n170148,72\n170149,285\n170149,406\n170149,620\n170149,779\n170149,118336\n170149,149534\n170150,602\n170151,30236\n170152,269\n170153,3003\n170154,563\n170155,304\n170156,83\n170157,1220\n170157,1222\n170158,516\n170159,252\n170160,422\n170161,56\n170162,1179\n170163,5310\n170164,1133\n170165,170166\n170167,1773\n170168,1474\n170169,332\n170170,72\n170171,170172\n170173,360\n170174,718\n170175,72\n170176,467\n170177,1235\n170177,1335\n170178,358\n170179,1531\n170180,489\n170182,483\n170183,697\n170184,779\n170186,1551\n170187,1247\n170187,164572\n170188,207\n170189,292\n170190,72\n170191,170192\n170193,868\n170194,30\n170195,328\n170196,267\n170197,1608\n170198,1132\n170199,170200\n170201,2353\n170202,30\n170203,175\n170204,107\n170205,30\n170206,30\n170207,30\n170208,30\n170209,2671\n170210,247\n170211,900\n170212,1181\n170213,30\n170214,918\n170215,30\n170216,577\n170217,2116\n170218,225\n170219,30\n170220,30\n170221,1659\n170222,30\n170223,170224\n170225,8884\n170226,536\n170228,703\n170228,784\n170229,704\n170230,3846\n170231,3538\n170232,358\n170233,134\n170234,366\n170235,30\n170236,1167\n170236,1241\n170236,2083\n170237,2105\n170239,310\n170239,657\n170239,818\n170239,1010\n170239,25222\n170240,171\n170241,1085\n170242,1849\n170243,302\n170245,104\n170246,422\n170247,56\n170248,366\n170249,366\n170250,72\n170251,8270\n170252,170253\n170254,743\n170255,83\n170256,485\n170257,298\n170258,934\n170259,30\n170260,72\n170261,72\n170262,158\n170263,72\n170264,2353\n170265,493\n170267,2719\n170268,366\n170269,137\n170270,72\n170271,55849\n170272,980\n170273,972\n170273,1010\n170274,72\n170275,640\n170275,805\n170276,30\n170277,3623\n170278,1143\n170279,142433\n170281,158\n170282,72\n170283,298\n170284,485\n170285,72\n170286,79\n170287,72\n170288,44\n170290,55849\n170291,6252\n170292,72\n170293,170294\n170295,72\n170296,170297\n170298,170297\n170299,170297\n170300,1773\n170301,72\n170302,592\n170304,2135\n170305,1001\n170306,72\n170307,515\n170308,72\n170309,138686\n170310,175\n170311,298\n170312,358\n170313,170314\n170315,170316\n170317,3623\n170317,171641\n170318,3623\n170319,30\n170320,3623\n170321,3623\n170322,994\n170323,1149\n170324,58\n170325,1479\n170326,4223\n170327,390\n170328,298\n170329,485\n170330,994\n170331,72\n170333,485\n170334,298\n170335,485\n170336,72\n170337,358\n170338,170339\n170340,344\n170341,5101\n170341,15119\n170342,298\n170343,485\n170346,483\n170348,875\n170349,1284\n170350,72\n170351,170352\n170353,602\n170354,602\n170355,269\n170356,602\n170357,7124\n170358,602\n170359,850\n170360,170361\n170362,72\n170363,366\n170364,366\n170365,366\n170366,83\n170369,170370\n170371,50\n170372,170373\n170374,170375\n170377,83\n170378,107\n170379,2416\n170379,2417\n170380,292\n170381,338\n170383,298\n170384,1133\n170385,3538\n170386,170387\n170390,392\n170391,1893\n170393,170394\n170393,228610\n170395,83\n170397,2334\n170398,1220\n170398,1222\n170399,516\n170400,252\n170401,843\n170402,5726\n170403,1011\n170404,170405\n170406,1381\n170407,1458\n170408,170409\n170411,30\n170412,994\n170413,1\n170414,192\n170414,336\n170414,1623\n170415,15748\n170416,2146\n170417,170418\n170419,1146\n170420,749\n170421,366\n170422,126\n170423,2244\n170425,1058\n170426,170427\n170429,30\n170430,170431\n170432,103860\n170433,1363\n170434,170435\n170436,1544\n170437,48\n170438,1238\n170439,138686\n170440,175\n170441,298\n170442,170443\n170444,440\n170445,3209\n170448,3422\n170449,72\n170452,170453\n170454,358\n170455,994\n170456,392\n170457,170458\n170459,1984\n170461,462\n170462,144962\n170462,173366\n170463,55849\n170464,557\n170465,557\n170466,557\n170467,72\n170468,535\n170469,485\n170470,298\n170471,510\n170472,620\n170473,41\n170474,72\n170476,170477\n170478,505\n170478,33298\n170479,447\n170480,2775\n170481,20004\n170483,126\n170485,592\n170486,328\n170487,30\n170488,142473\n170490,602\n170491,106\n170491,178\n170491,393\n170491,439\n170491,538\n170491,1033\n170492,269\n170493,483\n170494,149\n170495,149\n170496,104\n170496,136\n170496,225\n170496,248\n170496,254\n170496,557\n170496,953\n170496,954\n170496,1179\n170496,1332\n170496,1368\n170496,1939\n170496,9010\n170496,10318\n170497,30\n170498,170499\n170500,170501\n170502,1247\n170502,164572\n170504,30\n170505,30\n170506,30\n170507,200\n170508,4545\n170508,139010\n170509,393\n170510,292\n170511,294\n170512,296\n170513,298\n170514,366\n170515,366\n170516,366\n170517,366\n170518,366\n170519,366\n170520,366\n170521,147\n170522,671\n170523,184\n170524,147\n170525,83\n170527,4165\n170528,22\n170529,698\n170530,1085\n170530,1522\n170532,355\n170534,818\n170535,195\n170536,2421\n170538,30\n170539,48\n170541,1238\n170542,315\n170543,22\n170543,861\n170544,30\n170545,48\n170546,718\n170547,718\n170548,1452\n170549,147191\n170550,1801\n170552,1181\n170553,63\n170553,3218\n170555,170556\n170557,113156\n170558,579\n170559,2353\n170560,83\n170562,422\n170562,620\n170562,1425\n170562,1515\n170562,21442\n170563,1151\n170564,147191\n170565,312\n170566,142433\n170567,640\n170568,640\n170569,640\n170570,145240\n170571,640\n170572,48\n170573,811\n170574,255\n170575,109503\n170576,422\n170577,387\n170578,422\n170579,422\n170580,422\n170581,422\n170582,422\n170583,422\n170584,422\n170585,801\n170586,422\n170587,422\n170588,356\n170589,392\n170590,1122\n170591,422\n170592,640\n170593,640\n170594,137\n170595,41\n170595,68\n170595,233\n170595,1085\n170595,1119\n170595,1132\n170595,1608\n170595,1745\n170595,3135\n170595,75912\n170596,1522\n170597,251\n170597,1363\n170598,170599\n170600,994\n170601,994\n170601,1235\n170601,1335\n170602,48\n170603,671\n170605,30\n170606,107\n170607,175\n170609,138\n170610,126\n170611,55849\n170613,2048\n170613,6279\n170614,55849\n170615,1983\n170617,48\n170618,1132\n170619,1608\n170621,752\n170622,1149\n170624,875\n170625,158\n170625,500\n170627,1363\n170629,2373\n170630,1608\n170631,1132\n170633,170634\n170635,5469\n170636,843\n170638,73570\n170639,138686\n170640,779\n170642,175\n170643,167\n170644,1425\n170645,298\n170646,147\n170646,1381\n170646,2116\n170647,120\n170647,240\n170647,406\n170647,877\n170649,2373\n170650,21442\n170651,929\n170653,784\n170654,358\n170655,2373\n170656,99\n170657,30331\n170658,811\n170659,875\n170660,634\n170661,171\n170662,406\n170662,602\n170665,676\n170665,2373\n170666,1623\n170667,298\n170668,2373\n170669,1033\n170670,1010\n170671,1776\n170672,872\n170673,690\n170674,489\n170675,872\n170676,1010\n170677,489\n170678,707\n170679,707\n170680,3629\n170680,3836\n170680,6424\n170680,23311\n170680,26249\n170680,60781\n170680,76819\n170680,124423\n170680,127170\n170680,137578\n170680,170681\n170680,172665\n170680,176040\n170680,183942\n170680,183943\n170680,183944\n170680,183946\n170680,183947\n170680,183948\n170680,183949\n170680,183950\n170680,183951\n170680,183952\n170680,184766\n170680,189156\n170680,189768\n170680,189770\n170680,190279\n170680,190285\n170680,190288\n170680,192909\n170680,193498\n170680,212357\n170680,220431\n170680,225576\n170680,250659\n170680,254871\n170680,258186\n170682,5405\n170683,718\n170686,563\n170687,356\n170687,48505\n170687,141912\n170688,30\n170689,1688\n170690,811\n170692,145240\n170693,99\n170695,2460\n170696,30\n170697,1309\n170698,3328\n170704,346\n170705,30\n170706,586\n170707,3135\n170708,1955\n170709,81\n170710,58\n170711,994\n170712,46\n170713,1\n170714,4223\n170715,170716\n170717,138686\n170718,175\n170720,298\n170721,104\n170721,111\n170721,240\n170721,1085\n170721,1181\n170721,1462\n170721,1818\n170721,8537\n170722,22\n170723,192\n170724,1151\n170726,586\n170727,269\n170728,1955\n170729,301\n170729,937\n170729,968\n170729,1293\n170729,1782\n170729,21435\n170729,37983\n170729,134681\n170729,142806\n170729,177568\n170729,218675\n170729,220326\n170729,221828\n170729,221920\n170729,224790\n170729,227376\n170729,241017\n170729,241141\n170729,243302\n170729,245835\n170729,245850\n170730,3623\n170731,1749\n170733,192\n170734,818\n170735,55849\n170737,760\n170738,298\n170739,485\n170741,3769\n170742,1284\n170743,1\n170744,80469\n170745,809\n170746,149\n170746,622\n170747,818\n170748,170090\n170749,5405\n170752,2775\n170753,447\n170754,717\n170755,252\n170756,170757\n170758,206\n170758,240174\n170759,872\n170760,392\n170761,141912\n170762,1276\n170763,209\n170764,779\n170766,305\n170768,137\n170768,649\n170769,392\n170770,1707\n170771,273\n170771,36985\n170772,994\n170775,302\n170776,704\n170777,195\n170778,1274\n170780,302\n170781,44\n170782,147\n170782,406\n170782,779\n170782,1515\n170784,718\n170786,3695\n170787,4545\n170787,139010\n170788,932\n170789,195\n170790,3623\n170791,146\n170791,92476\n170792,647\n170793,344\n170794,957\n170794,1247\n170794,1815\n170794,164572\n170795,314\n170796,483\n170797,137\n170799,146\n170799,92476\n170800,647\n170801,344\n170804,516\n170805,3623\n170806,83\n170806,2671\n170807,1220\n170807,1222\n170808,516\n170809,252\n170810,301\n170812,516\n170813,126\n170813,462\n170813,872\n170813,1151\n170815,55849\n170816,1893\n170817,483\n170819,717\n170820,304\n170821,170821\n170822,37\n170823,1289\n170824,7\n170825,3999\n170826,14366\n170827,1509\n170829,1381\n170830,718\n170832,23783\n170833,10\n170835,158\n170835,640\n170835,1572\n170836,1284\n170837,875\n170838,485\n170839,298\n170840,707\n170841,1955\n170842,1220\n170842,1222\n170843,252\n170844,516\n170845,885\n170845,13704\n170846,1623\n170847,2931\n170849,1623\n170850,30\n170851,571\n170852,752\n170853,733\n170853,1140\n170855,2373\n170856,749\n170857,1149\n170858,1332\n170859,202\n170860,145240\n170861,3804\n170862,467\n170863,72\n170864,285\n170865,344\n170866,8854\n170867,1309\n170868,30\n170869,333\n170870,298\n170871,485\n170872,2989\n170872,2991\n170873,671\n170875,2146\n170876,852\n170877,301\n170878,55849\n170879,1858\n170880,1860\n170882,577\n170882,1429\n170884,72\n170885,83\n170886,588\n170886,590\n170887,1419\n170888,104\n170889,563\n170890,1085\n170891,779\n170892,30\n170893,30\n170894,1893\n170895,30\n170897,207\n170897,852\n170898,1849\n170899,358\n170900,30\n170901,30\n170902,850\n170903,55849\n170904,30\n170904,328\n170905,994\n170906,1368\n170907,1955\n170908,302\n170909,702\n170909,873\n170910,170911\n170910,176592\n170910,184423\n170910,188308\n170910,218339\n170910,229433\n170910,243505\n170912,592\n170913,435\n170914,1119\n170914,1282\n170914,2205\n170914,33424\n170915,1983\n170916,2411\n170917,602\n170918,1133\n170919,147\n170919,417\n170919,1635\n170920,843\n170921,707\n170922,1983\n170923,1983\n170924,278\n170925,68\n170926,602\n170927,240\n170928,1\n170928,149\n170928,602\n170928,1425\n170929,2292\n170930,3218\n170931,861\n170932,850\n170933,215\n170934,301\n170935,170936\n170937,525\n170938,55849\n170939,1309\n170940,1285\n170941,1509\n170942,346\n170943,631\n170944,294\n170945,1359\n170946,30\n170947,126\n170947,118336\n170948,298\n170949,255\n170950,30\n170951,968\n170952,90845\n170953,30\n170954,30\n170955,330\n170956,150313\n170957,30\n170958,602\n170959,602\n170960,30\n170961,467\n170962,30\n170963,424\n170964,2048\n170965,252\n170966,13\n170967,2146\n170968,77\n170969,1653\n170970,442\n170971,392\n170972,2266\n170973,1467\n170974,1556\n170975,247\n170976,920\n170977,388\n170978,843\n170979,2424\n170980,1235\n170980,1335\n170981,861\n170982,3\n170983,875\n170984,167\n170984,1544\n170986,170987\n170988,170989\n170990,13980\n170991,68\n170992,1707\n170993,171\n170994,602\n170995,79\n170996,79\n170997,366\n170998,366\n170999,366\n171000,932\n171001,366\n171002,366\n171003,390\n171004,72\n171005,30\n171006,355\n171007,536\n171008,83\n171009,1653\n171010,972\n171011,2292\n171013,55849\n171014,477\n171014,644\n171014,2944\n171015,192\n171015,1294\n171019,209\n171021,302\n171022,1220\n171022,1222\n171024,79\n171025,31977\n171026,1773\n171027,1309\n171028,323\n171029,707\n171030,2590\n171031,718\n171032,225\n171033,269\n171033,313\n171033,949\n171035,707\n171036,1012\n171037,83\n171038,171039\n171040,309\n171040,310\n171041,2296\n171042,30\n171042,328\n171043,640\n171044,2184\n171044,148365\n171044,171041\n171045,77\n171046,158\n171046,252\n171046,309\n171046,310\n171046,622\n171046,1749\n171047,1359\n171048,1707\n171049,1858\n171050,1860\n171051,360\n171052,717\n171052,1326\n171053,589\n171053,75912\n171054,640\n171055,195\n171055,336\n171056,493\n171056,1425\n171057,68\n171058,10\n171059,252\n171060,1243\n171061,3999\n171062,1132\n171063,1608\n171064,3218\n171065,907\n171066,422\n171067,422\n171068,422\n171070,422\n171071,422\n171072,422\n171073,422\n171074,422\n171075,83\n171076,30331\n171077,422\n171078,360\n171078,4571\n171079,217\n171080,34\n171080,35\n171081,4637\n171082,1072\n171083,455\n171084,2266\n171085,1201\n171086,1274\n171087,1429\n171088,2421\n171089,120\n171090,107\n171090,240\n171091,920\n171092,422\n171093,422\n171094,138686\n171095,467\n171096,175\n171097,602\n171098,602\n171099,3252\n171100,2944\n171101,3238\n171102,298\n171103,1619\n171103,1623\n171104,134\n171106,422\n171107,784\n171108,808\n171110,422\n171111,707\n171112,685\n171113,171\n171114,336\n171115,278\n171116,147\n171116,158\n171117,272\n171118,171119\n171120,718\n171121,217\n171122,13661\n171123,301\n171124,1124\n171125,2671\n171126,929\n171127,2671\n171128,2590\n171129,872\n171129,127158\n171130,30\n171131,877\n171132,609\n171134,30\n171134,175\n171134,227\n171134,1179\n171134,2782\n171134,3148\n171134,6051\n171134,8501\n171134,14472\n171134,27834\n171135,79\n171136,893\n171137,97\n171137,1659\n171138,7698\n171139,1147\n171140,63471\n171141,292\n171142,292\n171143,60576\n171144,60576\n171146,171\n171147,86416\n171148,167\n171150,1801\n171151,209\n171152,346\n171153,356\n171154,422\n171155,1011\n171156,561\n171156,911\n171157,1858\n171158,1860\n171159,41\n171160,2775\n171161,447\n171162,355\n171163,292\n171165,623\n171166,146\n171166,92476\n171167,647\n171168,344\n171170,30\n171171,3538\n171172,147\n171172,158\n171172,333\n171172,435\n171172,15573\n171173,875\n171174,1688\n171175,134\n171176,2353\n171177,720\n171179,1241\n171180,72\n171181,2646\n171181,2775\n171182,1359\n171183,852\n171184,146\n171184,92476\n171185,647\n171186,344\n171187,577\n171188,843\n171189,3769\n171190,5405\n171191,30\n171192,72764\n171193,1201\n171194,2775\n171195,919\n171196,1522\n171197,138686\n171198,175\n171200,298\n171201,6424\n171202,1087\n171204,73570\n171205,59021\n171207,200\n171208,32\n171208,440\n171209,634\n171209,1083\n171209,171210\n171211,202\n171212,273\n171213,868\n171214,393\n171215,217\n171215,949\n171215,1019\n171216,336\n171217,406\n171218,592\n171219,1556\n171220,4771\n171221,217\n171221,949\n171221,1019\n171221,5976\n171222,349\n171223,83\n171224,949\n171224,4252\n171225,302\n171226,30\n171227,8822\n171228,1858\n171229,1860\n171230,272\n171231,104\n171232,83\n171232,1014\n171233,485\n171234,298\n171236,143287\n171237,298\n171238,485\n171239,1151\n171240,1149\n171241,861\n171242,579\n171243,1556\n171244,217\n171245,1012\n171246,48\n171247,111924\n171248,1118\n171249,999\n171249,4355\n171250,849\n171250,1011\n171250,2083\n171251,1707\n171253,285\n171254,779\n171255,1019\n171256,209\n171257,435\n171258,134\n171258,248\n171259,1\n171260,206\n171260,2073\n171260,2626\n171260,13910\n171260,142426\n171262,2353\n171263,2312\n171264,298\n171265,485\n171266,726\n171267,15573\n171268,406\n171268,920\n171269,19227\n171270,483\n171271,2480\n171272,83\n171273,83\n171274,217\n171275,278\n171276,843\n171277,356\n171278,515\n171279,647\n171280,515\n171281,9098\n171282,515\n171283,8270\n171284,4571\n171285,1858\n171286,1860\n171287,302\n171288,158\n171288,406\n171289,171290\n171292,22\n171292,760\n171292,818\n171293,200\n171295,301\n171295,73570\n171296,1127\n171298,200\n171299,697\n171300,222\n171300,657\n171300,2266\n171301,577\n171302,72\n171303,7416\n171304,1634\n171305,366\n171306,920\n171307,843\n171307,2373\n171308,417\n171308,525\n171308,1818\n171309,287\n171310,861\n171311,171312\n171313,1132\n171314,3623\n171315,3623\n171316,2620\n171317,415\n171319,861\n171320,155481\n171321,252\n171321,516\n171322,760\n171323,8854\n171324,1007\n171325,1309\n171326,1294\n171327,4571\n171328,252\n171329,861\n171330,1274\n171331,126\n171332,2210\n171332,4237\n171333,252\n171333,516\n171334,467\n171336,1417\n171337,388\n171338,636\n171339,171340\n171341,1326\n171342,21408\n171343,932\n171344,717\n171345,712\n171346,211\n171347,298\n171348,485\n171349,7092\n171350,30\n171351,7092\n171352,577\n171353,44\n171354,2168\n171355,2828\n171356,259\n171356,467\n171356,868\n171357,2373\n171358,3260\n171359,298\n171360,485\n171361,195\n171361,55849\n171362,298\n171363,485\n171364,30\n171366,8270\n171369,332\n171370,1274\n171372,805\n171373,171374\n171375,252\n171375,516\n171376,2867\n171376,2868\n171377,289\n171377,290\n171377,94134\n171378,298\n171379,485\n171380,30\n171381,255\n171382,72\n171383,602\n171384,1274\n171385,5213\n171386,707\n171387,30\n171388,211\n171388,808\n171389,366\n171390,1782\n171391,1274\n171392,1284\n171393,2557\n171394,366\n171395,30\n171396,2979\n171397,301\n171398,1522\n171399,86\n171400,907\n171401,167\n171402,298\n171403,485\n171404,2083\n171405,30\n171406,577\n171407,30\n171408,602\n171409,631\n171410,30\n171411,171412\n171413,1001\n171414,406\n171415,444\n171416,1274\n171417,1425\n171418,1381\n171418,3258\n171419,147\n171419,158\n171419,406\n171419,779\n171419,1019\n171419,1247\n171419,1515\n171419,73570\n171419,164572\n171420,704\n171421,30\n171422,171423\n171424,192\n171424,973\n171424,1414\n171425,34\n171425,35\n171425,313\n171425,13575\n171426,171427\n171428,30\n171429,301\n171430,302\n171431,1773\n171432,30\n171433,30\n171434,2923\n171435,333\n171438,1803\n171439,2775\n171440,447\n171441,30\n171442,278\n171443,366\n171444,2312\n171446,255\n171447,30\n171448,1381\n171449,113156\n171450,273\n171451,4222\n171452,267\n171453,30\n171454,30\n171455,5213\n171456,30\n171457,3623\n171459,30\n171460,30\n171461,30\n171462,134\n171463,137\n171464,628\n171465,885\n171465,13704\n171466,1608\n171467,167\n171467,1241\n171467,1837\n171467,2083\n171468,435\n171469,72\n171470,30\n171471,30\n171472,30\n171473,30\n171474,563\n171475,86\n171475,167\n171475,301\n171475,589\n171475,605\n171475,615\n171475,907\n171475,973\n171475,1001\n171475,1124\n171475,1167\n171475,1241\n171475,1284\n171475,1522\n171475,1782\n171475,1785\n171475,1955\n171475,2083\n171475,2557\n171475,2979\n171475,3193\n171476,30\n171477,30\n171478,563\n171479,900\n171480,30\n171481,30\n171482,30\n171483,818\n171484,1858\n171485,1860\n171486,146\n171486,92476\n171487,647\n171488,344\n171489,30\n171489,1001\n171490,30\n171491,323\n171492,1803\n171493,269\n171494,1181\n171495,424\n171496,323\n171497,516\n171498,30\n171499,30\n171500,861\n171501,1749\n171501,1785\n171501,2334\n171502,1556\n171503,269\n171504,1001\n171504,2590\n171505,30\n171506,323\n171507,1821\n171508,83\n171509,7\n171509,211\n171510,467\n171511,171512\n171514,171515\n171516,8270\n171517,72\n171518,30\n171519,779\n171520,510\n171521,323\n171522,1844\n171523,323\n171524,393\n171525,577\n171526,323\n171527,21408\n171528,323\n171529,1181\n171530,323\n171532,485\n171533,298\n171534,1707\n171535,355\n171536,1188\n171537,366\n171538,171539\n171540,1247\n171540,164572\n171541,366\n171542,366\n171543,366\n171546,779\n171547,171548\n171549,1284\n171550,79\n171553,3507\n171554,1639\n171555,862\n171556,323\n171559,1238\n171560,32\n171560,392\n171562,30\n171563,200\n171564,1452\n171565,30\n171566,83\n171568,294\n171568,631\n171569,893\n171570,83\n171574,83\n171575,323\n171576,323\n171577,1860\n171579,2837\n171582,2989\n171582,2991\n171583,2083\n171586,83\n171588,1274\n171590,30\n171591,462\n171594,5213\n171595,38158\n171596,406\n171597,577\n171598,145240\n171599,104\n171600,209\n171601,202\n171602,579\n171603,415\n171604,30\n171605,30\n171606,305\n171607,1877\n171608,726\n171609,467\n171610,920\n171611,489\n171612,38711\n171613,1882\n171614,516\n171615,138686\n171616,2334\n171617,175\n171618,1449\n171619,298\n171620,1212\n171621,115474\n171622,852\n171622,1782\n171623,640\n171626,1293\n171626,1300\n171628,489\n171629,760\n171630,202\n171631,58\n171632,151\n171633,136\n171634,119\n171635,30\n171636,640\n171637,146\n171637,92476\n171638,647\n171639,344\n171641,10\n171641,425\n171641,446\n171641,783\n171641,937\n171641,972\n171641,1010\n171641,1085\n171641,1122\n171641,1284\n171641,1849\n171641,15277\n171641,24924\n171641,124668\n171641,127158\n171641,131828\n171641,171641\n171641,171642\n171641,183448\n171641,183737\n171641,225708\n171641,225719\n171641,226471\n171641,226498\n171641,226512\n171641,226513\n171641,226516\n171641,226519\n171641,226936\n171641,227005\n171641,227006\n171641,228237\n171641,228319\n171641,228322\n171641,228369\n171641,228414\n171641,228430\n171641,228449\n171641,230937\n171641,230950\n171641,232745\n171641,232771\n171641,232812\n171641,232822\n171641,236626\n171641,237320\n171641,247887\n171645,718\n171646,489\n171647,21442\n171648,240\n171648,269\n171648,439\n171648,1181\n171648,1531\n171648,2812\n171649,392\n171650,171\n171651,1149\n171652,718\n171653,2574\n171654,3413\n171655,525\n171656,1359\n171657,256\n171657,703\n171657,874\n171658,1983\n171660,4611\n171661,1544\n171662,577\n171664,4611\n171665,1544\n171666,4611\n171667,1544\n171668,4611\n171669,1544\n171670,4611\n171671,872\n171672,1544\n171673,503\n171674,111\n171676,278\n171677,158\n171678,138686\n171679,592\n171680,175\n171681,8822\n171682,298\n171683,2411\n171684,1\n171685,1282\n171686,809\n171687,222\n171688,2775\n171689,447\n171690,13910\n171691,626\n171691,1571\n171691,1634\n171691,124668\n171692,58\n171692,118\n171692,272\n171692,422\n171692,647\n171692,4597\n171693,707\n171694,707\n171696,1058\n171700,171\n171702,636\n171705,3474\n171706,4594\n171707,590\n171707,1419\n171708,389\n171709,500\n171710,115474\n171711,577\n171712,328\n171713,1659\n171714,68\n171716,1146\n171717,298\n171718,485\n171719,145240\n171720,1289\n171721,2146\n171722,134\n171723,30\n171724,83\n171725,1983\n171726,135\n171726,2210\n171726,4237\n171726,182162\n171728,298\n171729,485\n171731,647\n171732,146\n171732,92476\n171733,344\n171735,3474\n171738,1085\n171739,435\n171739,1033\n171740,8541\n171741,171742\n171743,1274\n171744,657\n171745,22\n171746,631\n171747,483\n171748,118336\n171748,141912\n171749,158\n171750,58\n171751,171752\n171754,202\n171755,602\n171756,4805\n171757,195\n171757,885\n171757,13704\n171758,430\n171759,148412\n171760,356\n171760,138686\n171761,149\n171761,118336\n171762,861\n171763,30\n171764,109503\n171764,156379\n171765,142426\n171767,2979\n171768,302\n171769,991\n171769,1188\n171769,172012\n171771,302\n171773,302\n171774,1452\n171776,1769\n171777,809\n171778,30\n171778,685\n171778,1188\n171778,13538\n171779,6556\n171781,171782\n171783,861\n171784,1135\n171785,1608\n171786,1135\n171788,138686\n171790,175\n171792,298\n171793,525\n171795,149\n171795,269\n171795,406\n171796,54\n171797,602\n171798,1773\n171799,217\n171799,1019\n171799,1417\n171800,32\n171800,217\n171800,222\n171800,264\n171800,349\n171800,515\n171800,697\n171800,736\n171800,779\n171800,809\n171800,872\n171800,1019\n171800,1143\n171800,1363\n171802,302\n171803,602\n171806,269\n171807,647\n171808,146\n171808,92476\n171809,344\n171810,217\n171810,240\n171810,292\n171810,861\n171811,1298\n171812,602\n171815,30\n171816,1608\n171818,515\n171819,269\n171820,294\n171821,801\n171821,2436\n171822,2443\n171823,366\n171824,602\n171825,30\n171826,30\n171827,589\n171828,1274\n171829,272\n171829,934\n171829,1449\n171830,861\n171831,278\n171832,2421\n171833,2367\n171834,859\n171835,602\n171836,433\n171837,30\n171838,366\n171838,500\n171839,2379\n171840,3\n171841,5906\n171842,557\n171843,278\n171844,626\n171845,137\n171846,862\n171847,298\n171848,885\n171848,13704\n171849,861\n171850,30\n171851,1212\n171852,366\n171853,30\n171854,366\n171855,171856\n171857,366\n171858,72\n171859,366\n171860,366\n171861,72\n171862,392\n171863,171864\n171865,1544\n171865,2083\n171866,72\n171867,315\n171868,433\n171869,323\n171870,315\n171871,932\n171873,30\n171874,233\n171875,217\n171875,240\n171875,301\n171875,372\n171875,631\n171875,1001\n171875,1010\n171875,1085\n171875,1522\n171875,1715\n171876,72\n171877,1298\n171878,518\n171880,30\n171881,392\n171881,467\n171882,3623\n171883,455\n171885,184\n171886,1368\n171887,72\n171888,10\n171889,3623\n171890,44\n171891,72\n171892,248\n171893,1085\n171894,30\n171895,247\n171895,2867\n171895,2868\n171896,171897\n171898,72\n171899,333\n171900,171901\n171902,171901\n171903,467\n171904,72\n171905,113156\n171906,30\n171907,30\n171908,483\n171909,171910\n171911,805\n171912,30\n171913,171914\n171915,124668\n171916,422\n171917,278\n171918,30\n171919,1452\n171919,1579\n171919,2312\n171920,893\n171921,372\n171921,1085\n171922,72\n171923,298\n171924,485\n171925,1639\n171926,22\n171927,3\n171927,304\n171928,920\n171929,1983\n171930,1058\n171931,72\n171932,1634\n171933,536\n171934,2116\n171935,22\n171935,760\n171935,818\n171936,918\n171937,1\n171938,406\n171939,2620\n171940,1474\n171941,247\n171942,366\n171943,843\n171944,366\n171945,10\n171946,1359\n171948,30\n171949,366\n171950,171951\n171952,893\n171953,852\n171954,366\n171955,563\n171956,330\n171957,323\n171959,83\n171960,1\n171961,30\n171962,5405\n171963,15748\n171965,171966\n171967,171968\n171969,301\n171969,968\n171969,1293\n171970,171971\n171972,171973\n171974,31977\n171975,581\n171976,240\n171977,171978\n171979,2379\n171980,171981\n171982,2590\n171983,72\n171984,302\n171985,255\n171986,323\n171987,278\n171988,95554\n171989,72\n171990,255\n171991,83\n171992,171993\n171994,171993\n171995,2590\n171996,602\n171997,323\n171998,171999\n172000,118\n172001,217\n172001,422\n172001,760\n172001,1019\n172002,172003\n172005,172006\n172007,146\n172007,424\n172007,92476\n172008,10\n172009,2371\n172010,355\n172011,328\n172011,1179\n172011,1305\n172011,2701\n172011,7124\n172012,784\n172012,4218\n172012,4220\n172013,172014\n172013,184262\n172013,197324\n172013,218587\n172016,30\n172017,46\n172018,100450\n172019,38711\n172020,34\n172020,35\n172022,640\n172023,358\n172024,749\n172025,172026\n172027,337\n172028,599\n172030,1707\n172031,298\n172032,485\n172033,393\n172034,298\n172035,485\n172036,431\n172036,949\n172037,920\n172038,388\n172039,115659\n172039,142870\n172040,255\n172041,107\n172042,868\n172043,811\n172043,1603\n172044,2367\n172045,83\n172046,72\n172047,1122\n172049,72\n172050,577\n172052,337\n172053,337\n172054,640\n172055,808\n172056,640\n172057,337\n172058,1326\n172059,835\n172060,1623\n172062,313\n172063,835\n172064,406\n172065,5310\n172066,58\n172067,994\n172068,46\n172069,338\n172070,209\n172072,138686\n172073,175\n172074,920\n172075,626\n172076,298\n172077,192\n172078,254\n172079,4611\n172080,1544\n172081,467\n172082,2979\n172083,1612\n172084,1151\n172085,298\n172086,485\n172087,337\n172088,2292\n172089,252\n172090,1515\n172091,4678\n172093,145240\n172095,217\n172096,811\n172097,30\n172098,2671\n172099,30\n172103,6506\n172104,462\n172105,7360\n172107,1140\n172107,2443\n172107,3474\n172107,3538\n172109,2312\n172110,1135\n172112,1608\n172113,56\n172114,843\n172116,172117\n172118,1\n172119,516\n172120,209\n172121,1836\n172122,392\n172123,146280\n172123,159365\n172123,186045\n172124,136\n172125,55849\n172126,298\n172127,485\n172128,602\n172129,302\n172129,811\n172130,760\n172132,749\n172133,1181\n172134,298\n172135,485\n172136,1\n172137,209\n172139,835\n172140,209\n172141,240\n172141,298\n172142,261\n172143,55849\n172144,687\n172145,56\n172146,1274\n172147,138686\n172148,175\n172149,172150\n172151,333\n172151,2979\n172152,298\n172153,55849\n172154,5405\n172155,55849\n172156,81\n172156,663\n172156,4545\n172156,139010\n172157,240\n172158,252\n172159,1326\n172160,707\n172161,72\n172162,5405\n172163,647\n172164,344\n172166,146\n172166,92476\n172168,623\n172169,3209\n172170,1474\n172171,252\n172172,473\n172173,1\n172174,192\n172175,147\n172176,4611\n172177,1544\n172178,313\n172179,4611\n172180,1544\n172181,150038\n172182,79\n172183,442\n172186,309\n172186,310\n172187,172188\n172187,226482\n172187,227987\n172189,1955\n172190,1359\n172191,1773\n172193,6556\n172194,1326\n172195,433\n172196,172197\n172198,1181\n172199,251\n172200,50\n172200,3695\n172201,447\n172202,2775\n172203,6955\n172204,240\n172205,4594\n172206,120\n172207,919\n172208,172012\n172209,5405\n172210,172211\n172212,151\n172212,192\n172212,309\n172212,310\n172212,577\n172212,1400\n172213,302\n172214,2775\n172215,447\n172216,158\n172217,323\n172218,104\n172218,134\n172218,135\n172219,360\n172219,1127\n172219,1893\n172219,21408\n172220,15\n172220,1653\n172221,1891\n172222,861\n172224,457\n172224,2460\n172224,4190\n172224,26450\n172225,623\n172226,1058\n172227,919\n172228,634\n172229,1458\n172230,972\n172231,1274\n172233,843\n172234,5591\n172235,30\n172236,323\n172237,1240\n172238,500\n172239,83\n172240,623\n172241,697\n172241,1769\n172242,852\n172243,176782\n172244,485\n172245,298\n172246,673\n172247,861\n172249,932\n172250,163\n172250,736\n172251,510\n172251,3182\n172252,103860\n172255,435\n172256,868\n172257,48505\n172258,5405\n172259,302\n172259,861\n172260,875\n172261,861\n172262,5591\n172263,1298\n172264,2574\n172265,211\n172265,59434\n172265,75140\n172265,84903\n172265,234524\n172266,843\n172267,172268\n172269,255\n172270,172150\n172273,366\n172274,302\n172275,146\n172275,92476\n172276,647\n172277,344\n172278,68\n172278,563\n172278,1385\n172278,1837\n172279,104\n172279,868\n172279,872\n172279,1326\n172279,1796\n172279,3804\n172280,493\n172280,1265\n172280,1266\n172281,577\n172282,305\n172282,841\n172282,3695\n172282,7429\n172283,83\n172284,843\n172285,290\n172285,344\n172285,94134\n172286,172287\n172286,217313\n172288,2210\n172288,4237\n172289,1001\n172290,72\n172291,467\n172292,172293\n172294,907\n172294,2191\n172295,861\n172296,217\n172296,1417\n172297,862\n172298,1265\n172298,1266\n172299,718\n172300,227\n172301,130\n172302,34\n172302,35\n172302,250\n172302,1684\n172303,72\n172304,302\n172305,83\n172306,536\n172307,217\n172308,3\n172310,885\n172310,13704\n172311,1282\n172312,1007\n172313,1749\n172314,72\n172315,1252\n172315,1253\n172316,30\n172317,435\n172318,515\n172319,302\n172320,875\n172321,920\n172322,68\n172323,861\n172324,843\n172325,1085\n172326,1608\n172327,1132\n172328,146\n172328,92476\n172329,72\n172330,366\n172331,392\n172332,467\n172333,146\n172333,92476\n172334,344\n172335,647\n172336,278\n172336,356\n172336,536\n172336,577\n172336,1429\n172337,841\n172338,30\n172339,72\n172340,980\n172341,252\n172342,1235\n172342,1335\n172343,44\n172344,4594\n172345,932\n172346,30331\n172347,323\n172347,595\n172347,736\n172347,1509\n172347,1551\n172348,31977\n172349,417\n172350,3623\n172351,309\n172351,310\n172351,579\n172351,1010\n172352,733\n172353,358\n172354,5101\n172355,707\n172356,707\n172357,2373\n172358,557\n172359,862\n172360,202\n172361,2367\n172363,1058\n172365,172366\n172367,14231\n172368,577\n172369,86\n172370,996\n172371,483\n172372,872\n172373,172374\n172375,30\n172376,1072\n172377,861\n172378,83\n172379,32\n172381,50\n172381,79\n172381,406\n172381,493\n172381,585\n172381,586\n172381,592\n172381,1247\n172381,1265\n172381,1266\n172381,1985\n172381,2931\n172381,19031\n172381,164572\n172382,10\n172382,3297\n172383,387\n172383,22071\n172385,172386\n172387,920\n172388,1608\n172389,2797\n172390,147\n172391,298\n172392,485\n172393,1274\n172394,83\n172395,2735\n172396,301\n172396,372\n172396,801\n172396,907\n172396,968\n172396,1140\n172396,1241\n172396,1309\n172396,1544\n172396,1837\n172396,1893\n172396,1955\n172397,172398\n172399,392\n172399,1151\n172400,1298\n172401,485\n172402,298\n172403,602\n172404,389\n172405,30\n172406,424\n172407,861\n172408,289\n172408,290\n172408,94134\n172409,1571\n172410,2274\n172411,577\n172412,79\n172413,72\n172414,424\n172415,172416\n172417,172418\n172419,72\n172420,306\n172420,307\n172421,366\n172422,8854\n172423,72\n172424,366\n172425,424\n172426,77\n172427,2572\n172428,172429\n172430,269\n172431,1274\n172432,172433\n172432,247600\n172434,172433\n172435,172433\n172435,247600\n172436,172433\n172437,172438\n172439,120\n172440,640\n172441,636\n172442,172443\n172444,1849\n172445,932\n172446,364\n172447,1133\n172448,58\n172449,850\n172450,2205\n172450,33424\n172451,994\n172452,172453\n172455,255\n172456,21442\n172457,72\n172458,30\n172459,172460\n172461,323\n172462,1284\n172463,28072\n172464,640\n172465,1566\n172466,640\n172467,366\n172468,30\n172469,1133\n172470,323\n172473,536\n172474,301\n172474,589\n172474,838\n172474,972\n172474,1284\n172474,1715\n172474,4286\n172474,30373\n172474,65897\n172474,73570\n172474,75912\n172474,138136\n172474,144121\n172474,164915\n172474,166453\n172475,577\n172476,355\n172477,273\n172478,4545\n172478,139010\n172479,30\n172480,140\n172481,515\n172482,30\n172483,30\n172485,141912\n172486,37088\n172487,4771\n172488,3467\n172489,2319\n172490,146\n172490,92476\n172491,647\n172492,344\n172494,795\n172494,980\n172494,1293\n172494,2979\n172494,3804\n172495,71\n172496,516\n172497,1191\n172498,733\n172498,818\n172499,1309\n172500,83\n172501,483\n172501,6556\n172503,172504\n172506,310\n172508,79\n172509,640\n172511,138686\n172512,217\n172512,1417\n172513,673\n172515,160\n172515,457\n172515,1381\n172516,172517\n172518,415\n172518,16687\n172519,1132\n172520,1608\n172521,41\n172522,301\n172522,1010\n172522,75912\n172522,127158\n172524,3949\n172525,586\n172526,1238\n172527,106\n172529,195\n172530,2671\n172532,467\n172533,920\n172535,138686\n172536,2737\n172537,175\n172538,254\n172539,298\n172540,172541\n172542,30\n172542,328\n172543,25222\n172544,1058\n172545,392\n172546,63\n172546,6119\n172547,835\n172548,1452\n172550,450\n172551,1607\n172553,147191\n172554,340\n172554,489\n172554,28130\n172555,336\n172555,1973\n172557,55849\n172558,1247\n172558,164572\n172559,393\n172561,2775\n172562,447\n172563,50\n172563,158\n172563,1776\n172563,2931\n172563,8822\n172565,56\n172566,1133\n172567,172568\n172569,1133\n172570,171\n172571,1135\n172573,298\n172574,485\n172575,172576\n172577,146\n172577,92476\n172578,346\n172579,430\n172580,1177\n172581,94\n172581,885\n172581,2787\n172581,13704\n172582,1122\n172583,968\n172585,818\n172586,314\n172586,1345\n172587,358\n172588,142870\n172589,2443\n172589,2931\n172591,481\n172592,2944\n172593,1608\n172594,1132\n172595,252\n172596,275\n172597,467\n172598,301\n172599,623\n172600,843\n172601,272\n172602,1326\n172603,151\n172604,8598\n172605,1127\n172606,698\n172606,50083\n172606,85842\n172606,172607\n172606,176453\n172606,179143\n172606,179146\n172606,181848\n172606,184772\n172606,184914\n172606,189712\n172606,189716\n172606,191347\n172606,191864\n172606,195125\n172606,201245\n172608,439\n172610,202\n172611,2209\n172612,2460\n172613,30\n172614,1345\n172615,1122\n172617,841\n172619,450\n172620,3\n172620,20\n172620,32\n172620,34\n172620,35\n172620,37\n172620,50\n172620,63\n172620,68\n172620,72\n172620,81\n172620,83\n172620,86\n172620,104\n172620,106\n172620,111\n172620,120\n172620,136\n172620,140\n172620,158\n172620,178\n172620,192\n172620,202\n172620,207\n172620,215\n172620,217\n172620,225\n172620,227\n172620,233\n172620,240\n172620,248\n172620,278\n172620,283\n172620,301\n172620,302\n172620,312\n172620,326\n172620,328\n172620,332\n172620,333\n172620,346\n172620,349\n172620,358\n172620,383\n172620,388\n172620,390\n172620,392\n172620,406\n172620,417\n172620,422\n172620,435\n172620,439\n172620,455\n172620,493\n172620,503\n172620,509\n172620,510\n172620,515\n172620,518\n172620,525\n172620,536\n172620,538\n172620,575\n172620,577\n172620,586\n172620,589\n172620,592\n172620,605\n172620,615\n172620,622\n172620,626\n172620,671\n172620,687\n172620,697\n172620,702\n172620,704\n172620,714\n172620,717\n172620,718\n172620,720\n172620,726\n172620,752\n172620,779\n172620,801\n172620,809\n172620,850\n172620,859\n172620,873\n172620,874\n172620,875\n172620,907\n172620,919\n172620,932\n172620,934\n172620,968\n172620,973\n172620,1001\n172620,1010\n172620,1016\n172620,1052\n172620,1072\n172620,1102\n172620,1133\n172620,1140\n172620,1151\n172620,1167\n172620,1175\n172620,1177\n172620,1181\n172620,1201\n172620,1210\n172620,1231\n172620,1240\n172620,1241\n172620,1265\n172620,1266\n172620,1274\n172620,1282\n172620,1287\n172620,1289\n172620,1294\n172620,1298\n172620,1309\n172620,1332\n172620,1359\n172620,1368\n172620,1370\n172620,1374\n172620,1381\n172620,1429\n172620,1452\n172620,1465\n172620,1466\n172620,1467\n172620,1479\n172620,1515\n172620,1522\n172620,1531\n172620,1544\n172620,1551\n172620,1564\n172620,1572\n172620,1579\n172620,1590\n172620,1634\n172620,1639\n172620,1644\n172620,1715\n172620,1722\n172620,1745\n172620,1756\n172620,1782\n172620,1789\n172620,1821\n172620,1836\n172620,1837\n172620,1849\n172620,1858\n172620,1877\n172620,1882\n172620,1893\n172620,1927\n172620,1939\n172620,1955\n172620,1985\n172620,2006\n172620,2045\n172620,2083\n172620,2191\n172620,2205\n172620,2266\n172620,2274\n172620,2421\n172620,2434\n172620,2443\n172620,2557\n172620,2620\n172620,2646\n172620,2701\n172620,2784\n172620,2931\n172620,2979\n172620,2989\n172620,2991\n172620,3135\n172620,3138\n172620,3193\n172620,3194\n172620,3207\n172620,3218\n172620,3260\n172620,3367\n172620,3422\n172620,3474\n172620,3507\n172620,3538\n172620,3585\n172620,3612\n172620,3695\n172620,3999\n172620,4172\n172620,4453\n172620,4549\n172620,4594\n172620,4637\n172620,4771\n172620,5326\n172620,5440\n172620,5662\n172620,5718\n172620,5911\n172620,5987\n172620,6068\n172620,6955\n172620,7270\n172620,7572\n172620,8373\n172620,8798\n172620,9001\n172620,9015\n172620,9029\n172620,9098\n172620,13745\n172620,14126\n172620,14797\n172620,15609\n172620,28107\n172620,33424\n172620,37088\n172620,44743\n172620,172621\n172622,818\n172625,81\n172625,104\n172625,254\n172626,516\n172627,424\n172628,126\n172629,1566\n172630,809\n172631,497\n172632,107\n172633,151\n172634,115659\n172635,1782\n172637,138686\n172638,175\n172639,298\n172640,60576\n172641,433\n172642,79\n172643,1151\n172644,172645\n172647,217\n172648,145240\n172649,4571\n172650,835\n172651,1927\n172652,809\n172653,140\n172655,811\n172656,703\n172657,536\n172658,309\n172658,310\n172659,6556\n172660,2646\n172661,130\n172662,433\n172663,172664\n172666,1052\n172666,2626\n172667,118\n172667,422\n172667,4597\n172667,5405\n172670,302\n172671,479\n172672,1749\n172673,360\n172674,760\n172676,2105\n172677,516\n172678,2083\n172679,1323\n172680,408\n172681,907\n172682,102\n172683,1326\n172684,1010\n172684,1143\n172684,1240\n172685,172686\n172685,174418\n172685,192186\n172685,203660\n172685,241936\n172687,872\n172688,3623\n172689,202\n172690,835\n172691,843\n172692,366\n172693,366\n172694,366\n172695,366\n172696,366\n172697,366\n172698,623\n172699,366\n172700,366\n172701,107\n172701,111\n172701,4771\n172702,240\n172702,392\n172703,134\n172704,135\n172705,1634\n172706,631\n172707,7698\n172708,29380\n172709,809\n172709,1085\n172710,1010\n172711,217\n172712,640\n172714,779\n172715,862\n172716,3623\n172717,515\n172719,113156\n172720,217\n172720,1417\n172721,137\n172721,698\n172722,140\n172723,217\n172723,392\n172723,536\n172723,1417\n172725,2775\n172726,602\n172726,3218\n172727,571\n172728,397\n172729,30\n172730,30\n172731,138686\n172732,9457\n172733,151\n172734,3623\n172735,760\n172735,994\n172735,1274\n172735,1454\n172736,818\n172737,3623\n172738,483\n172739,302\n172740,1265\n172740,1266\n172741,1390\n172742,1454\n172743,943\n172743,1332\n172743,5405\n172744,172745\n172744,172790\n172746,1326\n172747,1227\n172747,86416\n172748,861\n172749,187\n172750,160\n172751,126\n172751,649\n172751,731\n172752,340\n172753,8854\n172754,1220\n172754,1222\n172755,251\n172756,252\n172758,450\n172759,712\n172760,626\n172761,875\n172762,3623\n172763,736\n172763,1282\n172764,736\n172765,289\n172765,290\n172765,94134\n172767,30\n172768,885\n172768,13704\n172769,1252\n172769,1253\n172770,211\n172771,581\n172771,918\n172772,489\n172773,3623\n172774,875\n172775,3623\n172776,435\n172777,3623\n172778,172779\n172781,252\n172782,1220\n172782,1222\n172783,516\n172784,120\n172785,843\n172786,7652\n172787,1773\n172788,809\n172789,113156\n172791,467\n172792,135\n172792,1332\n172793,138\n172794,865\n172795,557\n172796,137\n172797,118\n172797,4597\n172798,88820\n172799,10\n172799,113156\n172800,450\n172801,10\n172801,113156\n172802,3623\n172803,44\n172804,1274\n172805,83\n172806,172807\n172808,172809\n172810,129534\n172811,1858\n172812,1\n172813,450\n172814,1707\n172815,1298\n172816,4545\n172816,56150\n172816,139010\n172818,332\n172819,1453\n172820,72\n172821,4637\n172822,588\n172822,590\n172823,450\n172824,450\n172825,8788\n172826,450\n172828,72\n172829,3507\n172830,255\n172831,172832\n172833,1253\n172833,1511\n172833,2931\n172834,172835\n172836,1\n172837,149\n172838,1556\n172839,256\n172841,72\n172842,72\n172843,24505\n172844,4475\n172845,6303\n172846,172847\n172848,34\n172848,35\n172848,202\n172848,217\n172848,455\n172848,509\n172848,536\n172848,1274\n172848,1467\n172848,2266\n172848,2784\n172848,4594\n172848,7092\n172849,172850\n172851,292\n172852,14366\n172853,172854\n172855,2590\n172856,72\n172857,72\n172858,439\n172859,225\n172860,366\n172861,172862\n172863,1983\n172864,275\n172865,1285\n172866,366\n172867,366\n172868,83\n172869,172870\n172871,389\n172872,8884\n172873,104\n172874,1085\n172875,172876\n172875,175266\n172877,4545\n172877,139010\n172878,172879\n172881,172882\n172884,72\n172886,355\n172887,172888\n172889,72\n172889,312\n172890,875\n172891,875\n172893,147191\n172894,134\n172894,135\n172894,137\n172894,138\n172894,2105\n172895,83\n172896,172897\n172896,175099\n172898,172899\n172900,172901\n172902,172903\n172906,714\n172909,171\n172910,172911\n172912,30\n172913,172911\n172914,172915\n172916,146\n172916,92476\n172917,344\n172918,647\n172919,1085\n172920,657\n172921,1323\n172922,408\n172923,102\n172924,1326\n172926,994\n172927,1033\n172928,493\n172929,58\n172930,994\n172931,4455\n172932,577\n172933,366\n172934,366\n172935,366\n172936,366\n172937,366\n172938,366\n172939,172940\n172941,172942\n172943,1300\n172944,743\n172945,875\n172946,450\n172947,44\n172948,172949\n172948,186460\n172950,34\n172950,35\n172950,313\n172950,2784\n172950,14126\n172951,450\n172952,3623\n172953,932\n172954,818\n172955,72\n172956,4252\n172956,7092\n172957,172958\n172959,72\n172960,172961\n172962,920\n172963,811\n172964,172965\n172966,195\n172966,32475\n172967,393\n172968,172969\n172970,72\n172971,483\n172972,850\n172973,72\n172974,2572\n172975,72\n172976,5540\n172977,72\n172978,1479\n172979,390\n172980,355\n172981,422\n172982,640\n172983,1402\n172984,3260\n172987,640\n172988,640\n172989,72\n172990,450\n172991,850\n172992,46\n172993,994\n172994,58\n172995,172996\n172995,223335\n172995,223502\n172997,206\n172998,172999\n173000,644\n173001,366\n173002,173003\n173004,72\n173006,72\n173007,30\n173007,328\n173007,7124\n173008,269\n173009,173010\n173012,850\n173013,151\n173014,173015\n173016,1544\n173017,323\n173018,1001\n173019,1001\n173021,6068\n173022,30\n173023,173024\n173025,1608\n173027,355\n173028,107\n173029,2416\n173029,2417\n173030,292\n173031,338\n173032,298\n173034,1133\n173035,3538\n173036,305\n173037,83\n173038,1359\n173039,602\n173041,6119\n173042,173043\n173044,485\n173045,3467\n173046,515\n173047,173048\n173050,173051\n173052,302\n173053,1118\n173053,215276\n173055,298\n173056,485\n173057,1240\n173058,1240\n173059,1175\n173060,485\n173061,298\n173062,1240\n173063,1149\n173064,195\n173065,1240\n173066,1240\n173067,1240\n173068,760\n173069,1240\n173070,1240\n173071,602\n173072,1240\n173073,173074\n173073,204941\n173075,385\n173076,388\n173077,1608\n173078,1132\n173080,310\n173080,3039\n173081,83\n173082,34\n173082,35\n173083,602\n173084,455\n173085,366\n173086,1363\n173087,44\n173088,932\n173089,17309\n173091,3999\n173092,704\n173093,1465\n173094,2506\n173095,1983\n173096,298\n173097,485\n173098,872\n173099,872\n173100,872\n173101,138686\n173102,175\n173103,298\n173104,1181\n173105,298\n173106,485\n173107,298\n173108,485\n173109,366\n173110,366\n173111,827\n173112,138686\n173113,175\n173114,298\n173115,136\n173116,602\n173117,687\n173118,602\n173119,602\n173120,264\n173120,994\n173120,1659\n173120,2979\n173121,557\n173122,557\n173123,557\n173124,1544\n173125,240\n173126,1796\n173127,1241\n173128,1522\n173129,148742\n173130,372\n173131,1001\n173132,173133\n173134,483\n173135,8788\n173136,4611\n173137,248\n173138,1300\n173139,30\n173141,483\n173142,298\n173143,485\n173144,3003\n173146,156379\n173147,1572\n173149,483\n173150,1707\n173151,142473\n173152,173153\n173154,615\n173155,994\n173157,147\n173158,602\n173159,1265\n173159,1266\n173160,184\n173161,602\n173162,843\n173163,3695\n173165,35\n173165,634\n173166,323\n173168,450\n173169,450\n173170,269\n173171,140\n173171,227\n173171,1163\n173171,1179\n173171,1509\n173171,1688\n173171,2379\n173173,292\n173174,294\n173175,296\n173176,298\n173177,298\n173178,1807\n173179,184\n173180,1127\n173181,285\n173182,1072\n173183,636\n173184,56\n173186,1012\n173187,994\n173188,1235\n173188,1335\n173190,59\n173190,3794\n173191,83\n173192,113156\n173193,355\n173194,811\n173194,868\n173195,217\n173196,433\n173197,79\n173198,298\n173199,485\n173200,142409\n173200,159365\n173201,79\n173202,516\n173202,920\n173203,1707\n173204,173205\n173206,602\n173207,103860\n173208,30\n173209,392\n173209,808\n173209,918\n173209,997\n173209,1240\n173209,1465\n173209,1663\n173209,3258\n173209,6059\n173209,31414\n173209,104537\n173209,176812\n173209,182609\n173210,1238\n173211,843\n173212,10\n173213,1452\n173214,2105\n173215,83\n173216,3258\n173217,994\n173218,1014\n173219,1983\n173220,1983\n173221,994\n173222,240\n173223,1011\n173224,16153\n173225,142426\n173226,1011\n173227,10\n173228,1082\n173230,388\n173230,406\n173230,141912\n173231,146\n173231,158\n173231,192\n173231,202\n173231,285\n173231,620\n173231,1893\n173231,92476\n173233,447\n173234,2775\n173235,1014\n173236,1\n173237,392\n173239,1\n173240,1181\n173241,83\n173242,1133\n173243,298\n173244,485\n173245,173246\n173247,248\n173247,1332\n173248,640\n173249,22\n173250,640\n173251,19413\n173251,36819\n173253,795\n173254,240\n173255,310\n173255,3039\n173256,668\n173257,941\n173259,30\n173260,873\n173261,6059\n173262,173263\n173266,1983\n173267,707\n173268,104\n173268,663\n173269,920\n173270,467\n173272,147\n173273,63471\n173274,55849\n173275,671\n173276,749\n173277,726\n173279,6059\n173280,726\n173281,4571\n173282,4571\n173282,88820\n173283,2210\n173283,4237\n173284,81\n173285,6059\n173286,447\n173287,2775\n173288,760\n173289,209\n173290,704\n173291,1001\n173292,2867\n173292,2868\n173294,32\n173294,87\n173294,349\n173294,392\n173294,1836\n173294,2699\n173296,704\n173296,1282\n173297,106\n173297,535\n173298,5375\n173300,623\n173301,640\n173302,1309\n173303,3328\n173304,1707\n173305,1238\n173306,3135\n173307,1955\n173308,991\n173309,784\n173309,7194\n173310,138686\n173311,175\n173312,173313\n173314,261\n173314,852\n173315,142426\n173317,298\n173318,184\n173318,2244\n173319,433\n173319,1634\n173320,1151\n173321,255\n173322,142430\n173322,147191\n173324,195\n173325,136\n173326,55849\n173327,615\n173327,657\n173327,3182\n173328,147\n173328,158\n173329,387\n173330,167\n173331,589\n173331,808\n173331,968\n173331,1715\n173332,115474\n173334,360\n173336,56\n173337,515\n173338,255\n173339,15673\n173340,718\n173341,215\n173341,328\n173341,704\n173341,1149\n173341,1212\n173341,1739\n173341,2237\n173341,2721\n173341,7000\n173341,74547\n173341,173296\n173342,1858\n173343,1860\n173344,586\n173345,994\n173346,1659\n173348,1821\n173349,173350\n173351,1849\n173353,173354\n173353,177141\n173353,231846\n173353,242426\n173355,1608\n173356,1132\n173357,358\n173358,41\n173359,372\n173361,1019\n173362,211\n173364,83\n173365,173366\n173367,1147\n173368,714\n173370,3830\n173371,247\n173372,818\n173373,1298\n173374,1127\n173375,138686\n173376,175\n173377,56\n173378,1381\n173379,298\n173380,202\n173381,102\n173382,1326\n173383,1323\n173384,408\n173385,312\n173386,994\n173389,273\n173390,1072\n173391,2775\n173392,447\n173393,173394\n173395,192\n173399,1127\n173400,259\n173401,605\n173402,30\n173403,1608\n173404,1132\n173405,272\n173406,120\n173406,217\n173406,278\n173406,283\n173406,388\n173406,389\n173406,455\n173406,536\n173406,623\n173406,949\n173406,1201\n173406,1240\n173406,1274\n173406,1590\n173406,2266\n173406,2421\n173406,4637\n173407,269\n173408,23783\n173409,843\n173409,227669\n173410,647\n173411,415\n173413,577\n173414,173415\n173416,918\n173417,1858\n173418,1860\n173419,338\n173421,356\n173422,483\n173423,287\n173423,809\n173424,994\n173425,173426\n173428,1608\n173429,1132\n173430,255\n173431,1608\n173432,1132\n173433,1608\n173434,1132\n173435,972\n173436,58\n173436,71\n173436,251\n173436,255\n173436,287\n173436,298\n173436,493\n173436,563\n173436,577\n173436,626\n173436,671\n173436,698\n173436,788\n173436,795\n173436,801\n173436,811\n173436,991\n173436,1012\n173436,1068\n173436,1070\n173436,1133\n173436,1309\n173436,1368\n173436,1429\n173436,1449\n173436,1474\n173436,1634\n173436,1789\n173436,2367\n173436,2436\n173436,5405\n173436,5961\n173436,6837\n173436,16331\n173436,185874\n173436,193129\n173437,175\n173438,493\n173438,1127\n173439,151\n173441,142405\n173442,1243\n173443,406\n173443,1425\n173444,252\n173445,251\n173446,1220\n173446,1222\n173447,302\n173448,83\n173449,252\n173450,1220\n173450,1222\n173451,251\n173452,13361\n173453,83\n173454,861\n173455,682\n173455,72439\n173456,298\n173457,485\n173458,406\n173459,760\n173460,146280\n173460,159365\n173461,1181\n173462,2315\n173464,1181\n173465,4611\n173466,44\n173467,338\n173468,99\n173469,457\n173470,1210\n173471,467\n173472,406\n173473,173474\n173473,249556\n173475,1474\n173476,1634\n173476,6323\n173477,852\n173478,3623\n173479,505\n173480,467\n173481,467\n173482,222\n173483,1893\n173484,30\n173485,298\n173486,485\n173487,1893\n173488,1402\n173489,30\n173490,72\n173491,173492\n173493,503\n173494,1773\n173496,2944\n173497,173498\n173499,30\n173500,222\n173501,30\n173502,72\n173503,640\n173504,30\n173505,173506\n173507,83\n173508,640\n173509,72\n173510,72\n173511,173512\n173513,83\n173514,138686\n173515,743\n173516,175\n173517,298\n173518,72\n173519,1175\n173519,1893\n173519,7155\n173520,19443\n173521,439\n173522,30\n173523,2116\n173524,577\n173525,1381\n173526,202\n173527,485\n173528,298\n173529,15573\n173530,1247\n173530,164572\n173531,1370\n173532,358\n173533,779\n173534,424\n173534,1085\n173535,536\n173536,5908\n173537,366\n173538,30\n173539,1167\n173540,366\n173541,366\n173542,366\n173543,811\n173544,379\n173544,1274\n173544,2646\n173545,136\n173546,2210\n173546,4237\n173547,217\n173547,536\n173547,2784\n173548,994\n173549,247\n173550,173551\n173552,171\n173553,104\n173553,192\n173553,217\n173553,302\n173553,333\n173553,406\n173553,455\n173553,588\n173553,590\n173553,5265\n173553,5343\n173553,7270\n173554,1127\n173555,7416\n173556,439\n173557,173558\n173559,450\n173560,8854\n173560,255750\n173561,158\n173561,192\n173561,336\n173561,586\n173562,1359\n173563,5718\n173564,3367\n173565,525\n173566,81\n173566,104\n173566,254\n173567,1309\n173568,1285\n173569,631\n173570,1509\n173571,2590\n173572,294\n173573,217\n173575,173576\n173579,885\n173579,13704\n173580,56\n173581,450\n173582,195\n173583,173584\n173585,30\n173586,207\n173587,392\n173588,215\n173589,932\n173590,173590\n173591,1070\n173592,309\n173592,310\n173593,173593\n173594,1511\n173594,3846\n173595,20813\n173596,178\n173597,1285\n173598,269\n173599,1467\n173600,4\n173600,5\n173600,1133\n173600,3582\n173600,17590\n173600,17593\n173601,72\n173602,872\n173603,1429\n173604,211\n173605,72\n173606,13\n173606,137\n173606,140\n173606,1179\n173607,301\n173608,95554\n173609,72\n173610,1143\n173612,668\n173613,5265\n173614,1579\n173615,72\n173616,2744\n173617,3507\n173618,1749\n173619,7233\n173620,81\n173621,366\n173622,366\n173623,366\n173624,366\n173625,22\n173625,920\n173626,663\n173627,72\n173628,173629\n173630,818\n173631,1149\n173632,7155\n173633,525\n173634,2210\n173634,4237\n173635,1608\n173636,30\n173637,173638\n173639,1782\n173640,372\n173641,808\n173642,355\n173643,875\n173644,2373\n173645,861\n173646,491\n173647,50\n173648,2979\n173649,5976\n173650,1175\n173651,994\n173652,2371\n173653,1860\n173654,1858\n173655,1858\n173656,1860\n173657,151\n173658,972\n173663,356\n173663,615\n173663,968\n173665,1858\n173666,1860\n173667,994\n173668,2923\n173668,4190\n173670,298\n173671,485\n173673,500\n173676,1749\n173677,83\n173678,1175\n173680,602\n173681,173682\n173683,200\n173685,949\n173687,602\n173688,1046\n173689,298\n173690,485\n173691,209\n173692,1458\n173693,602\n173694,302\n173694,1147\n173694,3999\n173695,602\n173696,602\n173697,602\n173699,602\n173700,1474\n173702,120\n173704,149\n173705,4223\n173706,337\n173707,811\n173708,138686\n173709,2671\n173709,6506\n173710,467\n173711,356\n173711,1740\n173714,1860\n173715,1858\n173716,328\n173717,1608\n173718,1132\n173719,417\n173720,285\n173720,779\n173720,1515\n173721,346\n173722,1608\n173723,1132\n173724,58\n173725,994\n173726,46\n173727,358\n173728,5405\n173729,849\n173729,1267\n173730,920\n173731,467\n173732,138686\n173733,349\n173733,392\n173733,4252\n173734,175\n173735,907\n173736,294\n173737,298\n173738,577\n173739,184\n173740,3623\n173742,2353\n173744,5130\n173745,1132\n173746,1608\n173747,302\n173748,6323\n173749,1359\n173750,5591\n173751,1132\n173752,1608\n173753,1608\n173754,1132\n173755,707\n173756,1608\n173757,30\n173758,1132\n173759,173760\n173762,718\n173763,48\n173764,30\n173766,8501\n173767,142405\n173768,720\n173769,259\n173769,21442\n173770,1058\n173771,1707\n173772,1707\n173773,207\n173775,872\n173776,195\n173777,795\n173777,1289\n173777,1715\n173778,673\n173779,346\n173780,2411\n173781,1313\n173782,79\n173783,596\n173784,302\n173785,1179\n173786,557\n173787,455\n173788,292\n173790,483\n173792,750\n173793,406\n173794,3209\n173795,3094\n173796,136\n173798,4260\n173799,163\n173799,467\n173800,207\n173801,4260\n173802,1749\n173803,83\n173804,2626\n173805,56\n173806,698\n173807,1210\n173808,2646\n173809,192\n173810,283\n173811,301\n173813,2353\n173814,852\n173815,503\n173815,1274\n173816,264\n173816,835\n173816,1659\n173818,136\n173819,24763\n173820,1968\n173821,3695\n173823,273\n173823,2367\n173824,269\n173826,602\n173827,134\n173828,30\n173828,200\n173829,2371\n173830,2367\n173831,304\n173832,668\n173833,83\n173835,2590\n173836,356\n173836,852\n173836,5591\n173837,1449\n173838,1224\n173839,900\n173839,3507\n173840,1175\n173841,852\n173841,1179\n173842,919\n173843,4220\n173844,682\n173844,72439\n173845,3194\n173846,5358\n173846,14352\n173847,336\n173848,1007\n173849,48\n173850,1220\n173850,1222\n173851,251\n173852,252\n173853,422\n173855,390\n173856,615\n173857,4260\n173858,261\n173859,1210\n173860,2979\n173860,173861\n173862,48\n173863,200\n173864,173865\n173867,1893\n173868,248\n173869,473\n173870,72\n173871,1359\n173873,497\n173874,346\n173875,301\n173876,1715\n173877,861\n173878,868\n173879,859\n173880,323\n173881,493\n173881,1659\n173881,1927\n173882,302\n173883,1564\n173884,1319\n173885,315\n173886,861\n173887,1319\n173888,173889\n173888,234548\n173890,392\n173891,30\n173892,861\n173893,302\n173894,877\n173896,1844\n173897,925\n173899,2224\n173900,827\n173901,9021\n173902,83\n173903,843\n173904,707\n173905,1955\n173906,1623\n173907,240\n173907,1564\n173908,30\n173908,1332\n173909,283\n173911,6682\n173912,142473\n173914,515\n173915,18726\n173916,83\n173917,269\n173919,677\n173919,48291\n173919,51505\n173919,129695\n173919,150741\n173919,156352\n173920,211\n173921,6059\n173922,6119\n173923,447\n173924,30\n173925,602\n173926,9457\n173927,2083\n173928,602\n173929,10\n173930,6387\n173931,1432\n173932,626\n173933,6119\n173934,184\n173935,56\n173936,563\n173937,852\n173937,5591\n173938,602\n173939,1309\n173940,392\n173941,72\n173942,1983\n173943,151\n173944,497\n173944,1400\n173945,515\n173946,30\n173947,302\n173948,349\n173948,392\n173949,1619\n173950,1087\n173951,1634\n173952,644\n173953,1127\n173955,88820\n173956,240\n173956,1955\n173957,634\n173958,1381\n173959,2923\n173960,483\n173961,355\n173962,30\n173963,417\n173964,2620\n173965,30\n173966,366\n173967,104\n173967,557\n173967,1368\n173968,366\n173969,366\n173970,6303\n173970,9025\n173971,30\n173972,1089\n173973,252\n173973,1385\n173974,1072\n173975,920\n173976,4101\n173977,17590\n173978,392\n173979,1623\n173980,1590\n173981,3194\n173982,72\n173983,14650\n173984,390\n173985,389\n173986,147191\n173987,483\n173988,254\n173989,467\n173990,122406\n173991,217\n173992,83\n173993,893\n173994,65\n173995,8854\n173995,255750\n173996,173997\n173998,2620\n173999,1220\n173999,1222\n174000,516\n174001,252\n174002,1801\n174003,1220\n174003,1222\n174004,252\n174005,516\n174006,102\n174007,1559\n174008,510\n174009,151\n174010,493\n174011,723\n174012,1014\n174013,832\n174014,1796\n174015,972\n174016,2210\n174016,4237\n174017,174018\n174019,634\n174020,294\n174021,718\n174022,1298\n174023,5326\n174024,557\n174025,1274\n174026,48\n174027,302\n174028,309\n174028,310\n174029,647\n174030,146\n174030,92476\n174031,344\n174032,2105\n174033,119\n174034,861\n174035,447\n174036,138686\n174037,885\n174037,13704\n174038,313\n174039,861\n174040,640\n174041,8235\n174042,174043\n174042,185712\n174044,5718\n174045,811\n174046,72\n174047,1436\n174048,861\n174049,174050\n174051,30\n174052,5405\n174053,306\n174053,307\n174054,72\n174055,147\n174056,255\n174057,195\n174058,503\n174059,1149\n174060,211\n174061,160\n174062,1983\n174063,640\n174064,1655\n174065,841\n174066,72\n174067,113156\n174068,312\n174069,1608\n174070,1132\n174071,219\n174072,278\n174073,1274\n174074,5250\n174075,1085\n174076,1707\n174077,2797\n174079,1474\n174080,3089\n174081,843\n174082,117\n174082,2712\n174083,2373\n174084,2867\n174084,2868\n174085,4411\n174086,323\n174087,500\n174088,2775\n174089,1962\n174090,54\n174091,1052\n174092,1882\n174093,261\n174094,81\n174095,2367\n174096,13661\n174097,206\n174098,479\n174099,859\n174100,272\n174101,272\n174102,736\n174103,736\n174104,332\n174105,1381\n174106,72\n174107,596\n174108,30\n174109,779\n174110,379\n174111,2574\n174112,752\n174113,994\n174114,138686\n174115,379\n174116,175\n174117,596\n174118,596\n174119,577\n174120,298\n174121,2315\n174123,113156\n174124,336\n174124,406\n174125,107\n174126,56\n174127,4594\n174128,1332\n174129,160951\n174130,302\n174131,13919\n174132,994\n174133,30\n174134,3724\n174135,3724\n174136,3724\n174137,30\n174138,1466\n174139,264\n174140,264\n174141,264\n174142,577\n174142,852\n174143,602\n174144,577\n174145,861\n174146,130\n174147,130\n174148,130\n174149,72\n174150,30\n174151,298\n174152,485\n174153,30\n174154,14366\n174155,147\n174156,1247\n174156,164572\n174157,972\n174158,30\n174159,72\n174160,640\n174161,1014\n174162,174163\n174162,258717\n174162,264532\n174164,292\n174165,1014\n174166,1014\n174167,1\n174168,1\n174169,1821\n174170,1014\n174171,2116\n174172,1078\n174173,1078\n174174,1078\n174175,994\n174176,994\n174177,994\n174178,233\n174179,233\n174180,219\n174181,219\n174182,72\n174183,219\n174184,811\n174185,811\n174186,811\n174187,973\n174188,217\n174189,309\n174189,310\n174190,309\n174190,310\n174191,309\n174191,310\n174192,206\n174192,2674\n174192,3258\n174193,1332\n174194,1007\n174195,130\n174196,726\n174197,726\n174198,726\n174199,160\n174200,160\n174201,160\n174202,772\n174203,147\n174204,56\n174205,2590\n174206,749\n174207,749\n174208,302\n174209,775\n174210,41\n174211,233\n174212,424\n174213,3623\n174214,3623\n174215,393\n174216,137\n174217,137\n174218,1133\n174219,1133\n174220,1707\n174221,1707\n174222,174223\n174224,2590\n174225,932\n174226,861\n174227,104\n174228,4691\n174229,3148\n174230,920\n174231,206\n174232,872\n174233,663\n174234,1821\n174235,2411\n174236,3161\n174237,269\n174238,138686\n174239,175\n174240,298\n174241,207\n174242,602\n174243,657\n174244,192\n174245,30\n174246,83\n174246,217\n174246,278\n174246,536\n174246,1467\n174247,72\n174248,338\n174249,366\n174250,1429\n174251,366\n174252,366\n174253,366\n174254,366\n174255,366\n174256,72\n174257,2590\n174258,44\n174259,1143\n174260,668\n174261,72\n174262,872\n174263,72\n174264,1860\n174265,1858\n174266,1572\n174267,602\n174268,602\n174269,3769\n174270,355\n174271,298\n174272,79\n174274,1434\n174275,3041\n174276,2443\n174278,2775\n174279,444\n174279,567\n174279,1160\n174279,1300\n174280,1238\n174281,685\n174282,310\n174282,805\n174282,1235\n174282,1335\n174282,1749\n174283,579\n174284,1452\n174285,1010\n174285,1012\n174285,1122\n174285,1241\n174285,1849\n174286,1132\n174287,1805\n174288,3297\n174289,422\n174290,422\n174291,422\n174292,602\n174293,671\n174294,1\n174295,422\n174296,422\n174297,422\n174298,422\n174299,422\n174300,422\n174301,422\n174302,2334\n174303,422\n174305,387\n174305,481\n174305,663\n174305,1677\n174305,3999\n174306,6837\n174307,1400\n174308,760\n174309,174310\n174311,79\n174312,292\n174313,2105\n174314,1608\n174315,1402\n174316,1608\n174317,1132\n174318,28107\n174319,1132\n174320,1608\n174321,56\n174322,596\n174323,200\n174323,8180\n174324,14434\n174325,6059\n174326,148885\n174327,818\n174327,127158\n174328,145240\n174331,682\n174331,72439\n174333,577\n174334,30\n174335,676\n174336,1858\n174337,1860\n174338,138686\n174339,83\n174340,175\n174341,372\n174341,1082\n174341,6068\n174342,160\n174342,694\n174343,467\n174343,868\n174344,298\n174345,113156\n174346,467\n174347,920\n174348,1983\n174349,56\n174350,1\n174351,682\n174351,72439\n174352,4039\n174353,21442\n174354,145240\n174355,500\n174356,994\n174358,254\n174360,333\n174361,1579\n174361,1659\n174362,450\n174363,1284\n174365,79\n174368,72\n174369,192\n174370,477\n174371,1417\n174373,1659\n174374,1983\n174375,2775\n174376,72\n174378,1240\n174379,142473\n174379,174380\n174381,392\n174382,156379\n174383,83\n174384,1983\n174385,682\n174385,72439\n174387,422\n174389,333\n174389,586\n174390,119\n174390,192\n174390,309\n174390,310\n174390,577\n174390,1400\n174392,3\n174393,2105\n174394,273\n174394,313\n174395,207\n174396,652\n174397,657\n174399,99287\n174400,592\n174402,30\n174403,1118\n174403,1572\n174404,149\n174405,1608\n174406,1132\n174407,19010\n174409,447\n174410,2775\n174412,718\n174413,994\n174414,577\n174415,1608\n174416,1132\n174417,336\n174419,22\n174420,147\n174420,184\n174420,859\n174420,1247\n174420,164572\n174422,1253\n174422,6888\n174422,164572\n174423,23783\n174424,877\n174425,931\n174426,302\n174426,1556\n174427,422\n174429,515\n174430,261\n174432,3804\n174433,31122\n174434,3193\n174435,518\n174436,2737\n174437,14797\n174438,467\n174439,455\n174440,217\n174441,1072\n174442,1132\n174443,1608\n174444,34\n174446,34\n174447,72\n174448,868\n174448,1392\n174448,156379\n174449,147\n174449,149\n174449,252\n174450,21442\n174450,118336\n174451,425\n174452,2089\n174452,2940\n174452,3003\n174454,292\n174455,406\n174456,602\n174458,704\n174459,1983\n174459,2867\n174459,2868\n174460,217\n174460,301\n174460,631\n174460,1001\n174460,1010\n174461,178\n174461,439\n174461,671\n174461,1033\n174461,1789\n174462,6119\n174463,323\n174465,127158\n174466,668\n174467,660\n174468,22\n174469,356\n174469,788\n174470,1298\n174472,390\n174473,211\n174474,647\n174474,1175\n174475,302\n174476,55849\n174477,843\n174478,3623\n174480,392\n174480,697\n174481,138686\n174482,175\n174483,63\n174484,50\n174485,158\n174486,1983\n174487,298\n174489,4218\n174490,1175\n174492,120\n174493,56\n174493,287\n174494,1949\n174494,6059\n174495,298\n174496,485\n174497,34\n174497,35\n174497,250\n174497,1684\n174498,301\n174499,694\n174499,15523\n174500,333\n174501,252\n174502,215\n174503,1007\n174505,142870\n174506,515\n174507,861\n174508,104\n174509,8463\n174511,328\n174512,147\n174512,1458\n174513,142426\n174515,217\n174516,652\n174517,120\n174517,202\n174517,217\n174517,261\n174517,349\n174517,379\n174517,509\n174517,805\n174517,859\n174517,873\n174517,874\n174517,1119\n174517,1454\n174517,1564\n174517,1635\n174517,1722\n174517,1801\n174517,1927\n174517,2931\n174517,3135\n174517,3538\n174517,6638\n174519,3367\n174520,72\n174521,72\n174522,136\n174523,83\n174524,58\n174525,515\n174527,138686\n174528,175\n174529,4571\n174530,298\n174531,392\n174533,3\n174535,192\n174535,779\n174536,467\n174537,248\n174538,372\n174539,56\n174540,2244\n174541,19\n174542,1639\n174543,1285\n174544,2244\n174545,408\n174546,10\n174546,113156\n174547,1319\n174548,120\n174548,3115\n174549,37\n174549,717\n174553,1132\n174554,1608\n174555,485\n174556,298\n174557,3\n174559,489\n174560,6424\n174562,3135\n174563,174564\n174565,1556\n174566,138686\n174567,175\n174568,298\n174569,1326\n174570,102\n174571,408\n174572,1323\n174573,5906\n174574,557\n174575,626\n174576,278\n174577,137\n174578,862\n174579,622\n174580,72\n174581,340\n174582,22293\n174583,1983\n174585,120\n174587,406\n174588,120\n174589,7416\n174590,72\n174591,657\n174592,406\n174593,72\n174594,255\n174595,72\n174597,2620\n174598,885\n174598,13704\n174599,207\n174600,1\n174601,255\n174602,174603\n174604,68\n174605,174606\n174607,1117\n174610,120\n174611,120\n174612,120\n174613,1220\n174613,1222\n174614,252\n174615,516\n174616,1274\n174617,107\n174617,1556\n174618,302\n174619,278\n174620,247\n174620,2867\n174620,2868\n174621,1231\n174622,298\n174623,485\n174624,255\n174625,872\n174626,1429\n174627,920\n174628,146\n174628,92476\n174630,485\n174631,298\n174632,269\n174633,1220\n174633,1222\n174634,516\n174635,252\n174636,30\n174637,1220\n174637,1222\n174638,516\n174639,252\n174640,366\n174640,500\n174641,516\n174642,2590\n174643,8854\n174644,302\n174645,577\n174646,1298\n174647,8822\n174648,174649\n174650,298\n174651,485\n174652,406\n174653,1274\n174654,1014\n174655,217\n174655,1417\n174656,861\n174657,1014\n174658,1113\n174659,602\n174660,264\n174660,843\n174661,994\n174662,1014\n174663,309\n174663,310\n174663,6556\n174665,1381\n174666,292\n174667,174668\n174669,2083\n174670,1871\n174671,10\n174672,2574\n174673,333\n174674,2867\n174674,2868\n174675,2737\n174676,174677\n174678,192\n174679,406\n174680,557\n174681,1220\n174681,1222\n174682,10\n174683,872\n174684,222\n174685,269\n174686,447\n174687,2775\n174688,447\n174689,2775\n174690,602\n174691,602\n174692,1474\n174693,358\n174694,483\n174695,1\n174696,2006\n174697,323\n174698,83\n174699,30\n174700,973\n174700,1284\n174700,1419\n174701,44\n174702,392\n174703,2116\n174704,174705\n174707,602\n174709,577\n174710,72\n174712,255\n174713,304\n174714,1117\n174714,1284\n174715,99\n174716,10\n174718,1639\n174719,146280\n174719,159365\n174720,668\n174721,994\n174722,1143\n174723,174724\n174723,219482\n174723,248523\n174723,248683\n174725,355\n174726,99\n174728,30\n174729,126\n174730,99\n174731,130\n174732,3724\n174734,206\n174734,2146\n174735,174735\n174736,99\n174737,406\n174738,202\n174740,33611\n174741,516\n174742,1267\n174743,298\n174744,485\n174745,1612\n174746,294\n174746,313\n174748,602\n174749,516\n174750,1220\n174750,1222\n174751,252\n174753,217\n174754,809\n174754,22293\n174756,422\n174757,422\n174758,422\n174759,422\n174760,422\n174761,422\n174762,422\n174763,422\n174764,422\n174765,422\n174766,422\n174767,4637\n174768,422\n174769,390\n174770,104\n174770,1284\n174771,557\n174772,217\n174774,422\n174775,83\n174778,516\n174779,3630\n174780,3524\n174781,37\n174782,83\n174784,422\n174785,18790\n174788,516\n174789,50\n174789,158\n174789,1776\n174789,2931\n174789,8822\n174791,174792\n174791,258666\n174793,174794\n174795,144962\n174796,30\n174797,336\n174798,30\n174799,852\n174800,1985\n174801,22\n174802,302\n174803,577\n174804,932\n174805,333\n174806,312\n174807,138686\n174808,175\n174809,174810\n174812,22\n174813,298\n174814,332\n174815,1\n174816,248\n174818,663\n174819,640\n174820,640\n174821,640\n174822,640\n174823,1467\n174825,130\n174825,1007\n174826,467\n174827,920\n174828,726\n174829,994\n174830,13661\n174831,278\n174832,2210\n174832,4237\n174833,83\n174835,192\n174836,835\n174837,8463\n174838,1300\n174840,72\n174842,818\n174843,3\n174845,515\n174846,4453\n174847,1132\n174847,142430\n174848,174849\n174849,292\n174849,609\n174849,1653\n174849,3830\n174849,138102\n174849,174849\n174849,196147\n174849,220899\n174850,949\n174851,577\n174852,301\n174852,932\n174852,968\n174852,1300\n174852,1522\n174853,72\n174854,1400\n174855,63\n174855,106\n174855,192\n174855,202\n174855,252\n174855,337\n174855,516\n174855,586\n174855,694\n174855,861\n174855,1220\n174855,1222\n174855,1243\n174855,1635\n174855,6119\n174855,16201\n174856,140\n174857,818\n174858,1370\n174859,1113\n174860,178\n174861,113156\n174862,623\n174863,138686\n174864,175\n174865,298\n174866,174867\n174868,1769\n174868,1893\n174869,264\n174869,736\n174870,113156\n174871,298\n174872,485\n174874,994\n174875,22\n174876,222\n174876,590\n174876,1419\n174878,1359\n174879,174880\n174879,264843\n174881,920\n174883,72\n174884,392\n174885,1300\n174886,5987\n174887,171\n174888,30\n174889,760\n174889,1149\n174890,44725\n174891,174892\n174893,338\n174893,1052\n174894,338\n174894,1052\n174894,21408\n174895,337\n174896,859\n174897,991\n174898,138686\n174899,1707\n174900,175\n174901,264\n174902,298\n174903,22\n174904,1181\n174905,704\n174906,527\n174908,450\n174909,647\n174910,104\n174910,240\n174910,264\n174910,289\n174910,290\n174910,312\n174910,372\n174910,442\n174910,636\n174910,1082\n174910,1466\n174910,1608\n174910,1807\n174910,1893\n174910,1955\n174910,2620\n174910,3115\n174910,3695\n174910,8276\n174910,94134\n174911,1118\n174912,289\n174912,290\n174912,94134\n174913,2073\n174914,1531\n174915,1893\n174916,657\n174917,72\n174918,30\n174919,752\n174920,58\n174920,442\n174920,609\n174920,24500\n174921,113156\n174922,35687\n174923,2210\n174923,4237\n174924,775\n174925,515\n174926,623\n174927,602\n174928,1326\n174929,408\n174930,102\n174931,111\n174932,1323\n174933,240\n174934,252\n174935,302\n174937,283\n174938,455\n174939,72\n174940,493\n174941,577\n174942,704\n174945,120\n174946,994\n174947,3695\n174948,392\n174949,30\n174950,240\n174950,332\n174950,372\n174950,1285\n174950,1955\n174950,3331\n174950,9026\n174951,302\n174953,1381\n174954,247\n174955,222\n174955,278\n174955,657\n174955,1571\n174955,5326\n174956,292\n174957,83\n174958,392\n174959,657\n174960,72\n174961,1359\n174962,301\n174964,1368\n174965,30\n174966,1\n174966,4\n174966,5\n174966,65\n174966,694\n174966,784\n174966,1082\n174966,1807\n174966,2926\n174966,4411\n174966,109503\n174968,30\n174969,588\n174969,590\n174970,72\n174972,415\n174973,1453\n174974,99\n174975,326\n174976,4571\n174977,178\n174978,515\n174979,1893\n174980,467\n174981,2210\n174981,4237\n174981,182162\n174983,30\n174984,392\n174985,333\n174986,861\n174987,852\n174987,1285\n174987,1309\n174988,862\n174989,30\n174990,1807\n174991,215\n174992,1326\n174993,2979\n174994,30\n174995,103860\n174996,932\n174997,850\n174998,850\n174999,596\n174999,1368\n175001,483\n175002,657\n175003,30\n175004,1014\n175005,1608\n175006,1132\n175007,1014\n175008,83\n175008,278\n175009,71\n175009,1449\n175009,1983\n175009,2590\n175009,5718\n175010,146\n175010,92476\n175011,283\n175012,113156\n175013,255\n175014,306\n175014,307\n175015,77\n175016,30\n175017,56\n175018,422\n175019,2506\n175021,972\n175022,392\n175023,2436\n175024,63\n175024,106\n175024,158\n175024,192\n175024,252\n175024,285\n175024,306\n175024,307\n175024,337\n175024,346\n175024,393\n175024,406\n175024,435\n175024,447\n175024,459\n175024,483\n175024,493\n175024,516\n175024,538\n175024,586\n175024,602\n175024,620\n175024,779\n175024,1181\n175024,1220\n175024,1294\n175024,1370\n175024,1388\n175024,1515\n175024,1531\n175024,2353\n175024,6119\n175025,435\n175026,278\n175027,292\n175028,20\n175030,145240\n175031,640\n175032,32751\n175033,968\n175033,973\n175033,1160\n175033,1293\n175033,1300\n175033,103860\n175034,622\n175035,217\n175035,1417\n175037,30\n175038,557\n175039,206\n175040,72\n175041,187\n175042,843\n175043,1983\n175044,861\n175045,72\n175046,301\n175047,333\n175048,1220\n175048,1222\n175049,516\n175050,252\n175051,2735\n175052,83\n175053,5591\n175055,1722\n175056,439\n175057,949\n175058,171\n175059,5375\n175059,109503\n175060,1474\n175061,358\n175063,346\n175064,211\n175065,2775\n175066,447\n175067,818\n175069,141912\n175070,557\n175071,30\n175072,862\n175073,563\n175074,330\n175075,752\n175075,968\n175076,264\n175077,920\n175078,171\n175079,392\n175080,424\n175081,1014\n175083,10\n175084,3695\n175085,760\n175086,33611\n175087,4903\n175088,433\n175089,83\n175090,72\n175091,302\n175092,885\n175092,13704\n175093,3367\n175094,63\n175095,304\n175096,4594\n175097,211\n175098,366\n175100,366\n175101,366\n175102,366\n175103,366\n175104,968\n175105,30\n175106,30\n175107,1782\n175108,862\n175109,932\n175110,44\n175111,269\n175112,151\n175113,30\n175114,30\n175115,1007\n175116,2116\n175117,1298\n175118,861\n175119,200\n175120,2367\n175121,72\n175122,1893\n175123,784\n175123,2424\n175124,79\n175124,435\n175124,1181\n175125,83\n175126,151\n175127,278\n175128,250\n175128,1684\n175129,113156\n175130,30\n175131,1133\n175132,30\n175133,103860\n175134,271\n175135,175136\n175137,577\n175139,1436\n175140,1326\n175141,918\n175142,113156\n175146,142870\n175147,563\n175148,187\n175149,312\n175150,175151\n175152,333\n175153,366\n175154,2590\n175155,217\n175155,536\n175156,147\n175156,158\n175157,668\n175158,207\n175159,158\n175160,640\n175161,581\n175163,207\n175164,175165\n175166,862\n175166,1001\n175166,1085\n175166,2590\n175166,8884\n175167,175168\n175169,328\n175170,175171\n175172,100365\n175173,72\n175174,30\n175175,261\n175176,390\n175177,872\n175178,1429\n175179,175180\n175181,8308\n175182,8308\n175183,248\n175185,298\n175186,30\n175187,158\n175187,406\n175187,779\n175187,1181\n175187,1515\n175187,1531\n175188,510\n175189,832\n175190,1143\n175192,178\n175193,10\n175194,602\n175195,289\n175195,290\n175195,94134\n175196,195\n175196,1014\n175196,55849\n175197,515\n175197,652\n175197,1381\n175197,1893\n175198,1893\n175199,1849\n175200,1\n175202,872\n175203,355\n175204,424\n175205,647\n175206,1252\n175206,1253\n175208,1608\n175209,1132\n175210,175211\n175212,586\n175214,818\n175215,175216\n175217,187\n175218,222\n175218,657\n175218,2266\n175218,2421\n175218,8060\n175218,8227\n175218,175222\n175218,218568\n175218,224576\n175218,245243\n175218,245541\n175219,138686\n175220,1224\n175221,107\n175223,1836\n175224,422\n175225,1267\n175226,422\n175227,422\n175228,422\n175229,83\n175230,422\n175231,422\n175232,56\n175233,422\n175234,422\n175235,536\n175236,422\n175237,422\n175238,422\n175239,422\n175240,2671\n175241,32\n175242,175243\n175244,3585\n175245,126\n175247,422\n175248,1566\n175249,1332\n175250,195\n175251,422\n175252,809\n175253,1888\n175255,151\n175256,3422\n175257,302\n175258,209\n175259,891\n175260,175261\n175262,30\n175262,693\n175262,1188\n175263,346\n175264,1238\n175265,1707\n175267,1881\n175268,1298\n175269,872\n175270,467\n175271,920\n175272,1130\n175273,209\n175274,1559\n175275,1284\n175276,240\n175278,1893\n175279,1893\n175280,5405\n175281,868\n175283,1220\n175283,1222\n175284,872\n175285,994\n175285,1235\n175285,1335\n175286,337\n175287,30\n175288,142473\n175290,631\n175291,1118\n175292,58\n175293,1452\n175296,720\n175297,11\n175299,309\n175299,310\n175302,55849\n175303,30\n175307,356\n175308,178\n175308,20757\n175309,626\n175310,299\n175310,720\n175310,775\n175310,907\n175310,968\n175310,1010\n175310,1117\n175310,2372\n175310,3218\n175310,3630\n175310,5301\n175310,73570\n175311,1612\n175311,138686\n175313,264\n175313,535\n175314,138686\n175316,175\n175317,875\n175318,3623\n175319,298\n175320,1363\n175321,1033\n175322,698\n175322,85842\n175322,172606\n175322,189201\n175322,205173\n175322,205588\n175322,251293\n175322,255722\n175322,255729\n175322,256397\n175322,259561\n175322,261801\n175322,262399\n175323,3370\n175324,406\n175324,779\n175324,1515\n175325,301\n175325,1293\n175325,3422\n175327,687\n175328,192\n175329,1140\n175330,861\n175332,54\n175332,852\n175334,516\n175336,175337\n175338,278\n175339,3258\n175340,1001\n175342,356\n175343,1033\n175344,980\n175344,994\n175347,147123\n175348,30\n175348,32\n175348,34\n175348,35\n175348,58\n175348,72\n175348,106\n175348,111\n175348,115\n175348,118\n175348,134\n175348,146\n175348,158\n175348,167\n175348,202\n175348,206\n175348,264\n175348,272\n175348,283\n175348,289\n175348,290\n175348,333\n175348,346\n175348,356\n175348,372\n175348,417\n175348,422\n175348,433\n175348,450\n175348,452\n175348,473\n175348,479\n175348,500\n175348,516\n175348,525\n175348,536\n175348,615\n175348,626\n175348,631\n175348,640\n175348,652\n175348,714\n175348,718\n175348,795\n175348,841\n175348,859\n175348,907\n175348,949\n175348,980\n175348,1019\n175348,1046\n175348,1119\n175348,1133\n175348,1149\n175348,1181\n175348,1210\n175348,1220\n175348,1222\n175348,1241\n175348,1265\n175348,1266\n175348,1285\n175348,1370\n175348,1374\n175348,1467\n175348,1531\n175348,1551\n175348,1572\n175348,1718\n175348,1724\n175348,1782\n175348,1844\n175348,1881\n175348,1893\n175348,1955\n175348,2209\n175348,2266\n175348,2334\n175348,2416\n175348,2417\n175348,2671\n175348,2744\n175348,2750\n175348,2782\n175348,3129\n175348,3207\n175348,3321\n175348,3345\n175348,3724\n175348,3804\n175348,4355\n175348,4487\n175348,4594\n175348,4823\n175348,5591\n175348,5718\n175348,6184\n175348,6888\n175348,7124\n175348,7360\n175348,8180\n175348,8270\n175348,8989\n175348,8992\n175348,8993\n175348,9008\n175348,9010\n175348,14945\n175348,21650\n175348,21716\n175348,25222\n175348,29475\n175348,34006\n175348,49193\n175348,92476\n175348,94134\n175348,164068\n175348,164102\n175348,175362\n175348,175363\n175348,175365\n175349,148742\n175350,2989\n175350,2991\n175351,516\n175352,1220\n175352,1222\n175353,252\n175354,104\n175355,6789\n175356,1326\n175357,1070\n175358,254\n175359,217\n175360,500\n175361,1070\n175364,251\n175364,252\n175364,516\n175364,538\n175364,925\n175364,1220\n175364,1222\n175364,2567\n175366,30331\n175367,6955\n175368,893\n175368,1556\n175369,1231\n175370,58\n175371,994\n175372,46\n175373,1087\n175374,175375\n175376,56\n175377,3067\n175377,15547\n175377,175377\n175377,175378\n175377,177856\n175377,178407\n175377,179016\n175377,179993\n175377,181094\n175377,183227\n175377,183230\n175377,183234\n175377,183696\n175377,186012\n175377,186170\n175377,187421\n175377,188127\n175377,188574\n175379,56\n175381,149\n175382,1608\n175383,1132\n175384,254\n175384,289\n175384,290\n175384,636\n175384,784\n175384,1001\n175384,1119\n175384,94134\n175386,1\n175387,1707\n175388,1893\n175389,2480\n175390,120\n175391,156379\n175392,44\n175393,5405\n175394,640\n175395,1014\n175396,1220\n175396,1222\n175397,252\n175398,516\n175399,272\n175400,217\n175401,872\n175402,1132\n175404,167\n175404,301\n175404,312\n175404,538\n175404,622\n175404,1287\n175404,1531\n175404,2443\n175405,333\n175406,7416\n175407,142426\n175408,6682\n175411,30\n175413,1033\n175414,485\n175415,298\n175417,3\n175418,1132\n175419,1608\n175420,255\n175421,211\n175422,1298\n175423,1509\n175424,1893\n175425,240\n175425,17309\n175426,278\n175426,356\n175426,852\n175427,1052\n175428,2312\n175429,2116\n175430,304\n175432,192\n175434,1390\n175435,261\n175436,623\n175437,1769\n175438,563\n175440,309\n175440,310\n175441,175442\n175443,435\n175444,30\n175445,515\n175446,200\n175447,1096\n175448,1\n175449,217\n175450,30\n175451,1127\n175452,452\n175453,1247\n175453,164572\n175454,184\n175455,14819\n175456,843\n175457,72\n175458,151\n175458,694\n175459,2205\n175459,4237\n175459,33424\n175459,182162\n175460,175461\n175460,235683\n175462,1390\n175463,298\n175464,3\n175465,137\n175466,1309\n175467,595\n175467,6789\n175467,6837\n175468,1175\n175469,120\n175470,626\n175471,885\n175471,13704\n175472,3367\n175473,269\n175474,663\n175475,140\n175475,1179\n175476,2646\n175477,581\n175477,918\n175478,56\n175479,422\n175480,489\n175481,920\n175482,1608\n175483,586\n175484,872\n175485,7416\n175486,1801\n175487,1068\n175488,240\n175489,120\n175490,1608\n175491,138686\n175492,957\n175492,1623\n175492,1815\n175492,221327\n175493,175494\n175495,557\n175496,138\n175497,865\n175498,557\n175499,137\n175500,88820\n175501,83\n175502,118\n175502,4597\n175503,1326\n175504,408\n175505,102\n175506,1323\n175508,4903\n175509,7416\n175510,809\n175512,1\n175513,1177\n175514,872\n175515,356\n175516,332\n175517,30\n175518,1467\n175519,175520\n175521,298\n175522,485\n175523,138686\n175524,175\n175525,83\n175526,424\n175527,422\n175528,56\n175529,356\n175529,6059\n175530,516\n175531,269\n175532,104\n175532,252\n175532,1707\n175532,21442\n175533,175534\n175535,175536\n175537,202\n175538,111\n175538,4355\n175538,4771\n175539,195\n175539,1284\n175540,2929\n175541,23701\n175542,301\n175543,483\n175544,250\n175544,1684\n175545,175546\n175545,217795\n175547,151\n175548,225\n175549,602\n175550,4475\n175551,1467\n175552,455\n175553,872\n175554,2424\n175555,8884\n175556,1871\n175557,7124\n175558,83\n175559,2421\n175560,13980\n175561,175562\n175563,1085\n175564,151\n175565,113156\n175566,355\n175567,919\n175568,175569\n175570,8788\n175572,1370\n175573,72\n175574,72\n175575,1882\n175576,1531\n175577,83\n175578,2506\n175579,72\n175580,287\n175581,72\n175582,142473\n175583,118\n175583,422\n175583,4597\n175583,5405\n175584,9025\n175585,1133\n175586,192\n175586,1400\n175587,1572\n175588,1267\n175589,83\n175589,278\n175589,1881\n175589,7698\n175590,83\n175590,1010\n175590,211889\n175591,83\n175592,83\n175592,1010\n175593,30\n175594,44\n175595,175596\n175597,7360\n175598,30\n175599,809\n175600,72\n175601,843\n175602,83\n175603,30\n175604,1509\n175606,302\n175607,2867\n175607,2868\n175608,10\n175608,113156\n175609,2779\n175610,269\n175611,252\n175612,175613\n175614,195\n175615,175616\n175617,392\n175618,30\n175620,2379\n175621,483\n175622,1776\n175623,2379\n175624,72\n175625,9239\n175626,2506\n175627,2979\n175628,175629\n175630,240\n175631,1127\n175632,483\n175633,1014\n175634,1014\n175635,1014\n175636,1014\n175637,1014\n175638,994\n175639,596\n175640,175641\n175642,620\n175643,431\n175644,602\n175645,187\n175646,175647\n175648,3260\n175649,206\n175650,1010\n175651,175652\n175653,1479\n175654,390\n175655,602\n175656,2506\n175657,55849\n175658,450\n175659,340\n175660,175661\n175662,175663\n175664,1359\n175665,17588\n175666,175667\n175668,158\n175669,1014\n175670,142426\n175671,2506\n175672,145502\n175673,175674\n175675,602\n175676,4611\n175677,111\n175678,2244\n175679,2697\n175680,366\n175681,366\n175682,366\n175683,366\n175684,366\n175685,366\n175686,366\n175687,366\n175688,455\n175689,850\n175690,6682\n175691,850\n175692,160\n175693,4355\n175694,175695\n175696,30\n175697,309\n175697,310\n175698,920\n175699,366\n175700,72\n175701,355\n175702,107\n175703,2416\n175703,2417\n175704,292\n175705,338\n175706,298\n175707,1133\n175708,3538\n175709,111924\n175710,1177\n175712,1001\n175713,718\n175714,292\n175714,356\n175714,1085\n175714,1285\n175714,171641\n175715,175716\n175717,215\n175718,485\n175719,298\n175720,175721\n175722,1212\n175723,442\n175724,1509\n175725,248\n175725,450\n175725,943\n175725,1572\n175725,5423\n175725,13207\n175725,190276\n175727,167\n175727,202\n175727,217\n175727,392\n175727,393\n175727,588\n175727,590\n175727,657\n175727,752\n175727,919\n175727,968\n175727,1175\n175727,1231\n175727,1419\n175727,2083\n175727,2443\n175727,4672\n175728,1572\n175729,175730\n175731,2737\n175732,142870\n175733,187\n175734,4192\n175734,4193\n175735,467\n175736,850\n175737,450\n175738,313\n175738,536\n175738,818\n175739,1707\n175740,72\n175741,217\n175742,4571\n175743,175744\n175745,272\n175746,326\n175746,1240\n175746,2699\n175747,72\n175748,1014\n175749,1014\n175750,968\n175751,1639\n175752,175753\n175754,10\n175755,2590\n175756,106\n175756,207\n175756,275\n175757,1014\n175758,557\n175759,30\n175760,13661\n175761,72\n175762,344\n175763,285\n175764,872\n175765,931\n175766,358\n175767,298\n175768,485\n175769,72\n175770,264\n175770,1968\n175771,147\n175772,392\n175773,668\n175773,6357\n175774,450\n175775,30\n175776,697\n175777,1210\n175777,1801\n175778,72\n175779,147\n175779,252\n175779,1220\n175781,736\n175782,167\n175782,1544\n175783,146\n175783,92476\n175784,647\n175785,344\n175786,72\n175787,72\n175789,1392\n175791,640\n175792,2572\n175793,557\n175794,557\n175795,310\n175796,2506\n175797,2506\n175798,2506\n175799,1220\n175799,1222\n175800,516\n175801,252\n175802,146\n175802,285\n175802,406\n175802,1655\n175802,92476\n175804,30\n175805,298\n175806,485\n175807,485\n175808,298\n175809,30\n175810,72\n175811,7768\n175812,72\n175813,175814\n175815,30\n175817,30\n175818,142473\n175819,994\n175820,202\n175821,30\n175822,72\n175823,175824\n175825,30\n175826,485\n175827,298\n175828,483\n175829,1707\n175830,175831\n175832,72\n175833,1014\n175834,30\n175835,209\n175836,2506\n175837,30\n175838,292\n175839,30\n175840,294\n175841,296\n175842,298\n175843,671\n175844,147\n175845,184\n175846,1247\n175846,164572\n175847,83\n175848,2867\n175848,2868\n175849,1707\n175850,5034\n175852,355\n175853,22\n175854,175855\n175856,108347\n175856,175857\n175856,224110\n175856,229038\n175856,239300\n175856,257377\n175856,264054\n175858,1634\n175859,298\n175860,485\n175861,175862\n175863,875\n175864,175865\n175866,175867\n175868,647\n175869,146\n175869,92476\n175870,344\n175871,302\n175872,72\n175873,79\n175873,106\n175873,192\n175873,202\n175873,333\n175873,586\n175873,1181\n175873,17772\n175874,1238\n175875,175876\n175877,217\n175878,1452\n175879,6424\n175880,4220\n175881,994\n175882,424\n175883,60576\n175884,83\n175885,285\n175886,175887\n175888,296\n175889,1105\n175892,306\n175892,307\n175892,682\n175892,72439\n175893,202\n175894,2083\n175895,349\n175896,1984\n175897,83\n175898,2572\n175899,450\n175900,2411\n175901,158\n175902,1298\n175903,372\n175903,390\n175903,805\n175903,873\n175903,1082\n175903,1122\n175903,1807\n175903,1955\n175903,6068\n175903,6837\n175904,640\n175905,1983\n175906,640\n175907,1298\n175908,640\n175909,130\n175910,5212\n175911,467\n175911,571\n175911,868\n175912,1635\n175913,392\n175916,22\n175918,6424\n175919,222\n175919,19443\n175920,6119\n175921,941\n175922,31073\n175923,1454\n175924,5375\n175926,467\n175927,920\n175928,920\n175929,138686\n175930,175\n175931,5405\n175932,949\n175932,17263\n175934,980\n175935,264\n175936,835\n175937,702\n175938,1332\n175940,2083\n175941,934\n175942,1773\n175943,1663\n175950,885\n175950,13704\n175951,1224\n175952,1370\n175953,671\n175954,2353\n175955,1467\n175956,1146\n175956,1452\n175957,356\n175958,772\n175958,15807\n175959,10\n175960,1608\n175961,202\n175962,79\n175963,994\n175964,1368\n175965,138686\n175966,175\n175967,104\n175968,389\n175968,13361\n175969,301\n175970,538\n175971,843\n175972,415\n175972,1143\n175973,9457\n175974,137\n175976,622\n175977,536\n175978,3695\n175979,1298\n175980,22\n175981,255\n175983,1132\n175984,3507\n175985,23783\n175986,1566\n175988,631\n175990,255\n175991,356\n175991,1085\n175993,240\n175993,818\n175994,138686\n175995,175\n175996,313\n175997,1465\n175999,682\n175999,72439\n176001,275\n176001,968\n176002,137\n176003,137\n176004,1132\n176005,1608\n176006,994\n176008,1298\n176009,1359\n176010,1033\n176012,957\n176012,1815\n176012,205478\n176014,138686\n176015,175\n176016,83\n176017,145240\n176018,313\n176019,251\n176019,252\n176020,577\n176021,360\n176022,360\n176022,1893\n176023,1058\n176024,518\n176024,1326\n176025,30\n176026,72\n176027,167\n176028,19413\n176029,485\n176030,843\n176030,44725\n176031,305\n176031,1844\n176032,1415\n176033,3507\n176034,292\n176034,1688\n176034,4771\n176035,176036\n176037,640\n176038,22\n176038,861\n176039,433\n176040,481\n176040,3830\n176040,6424\n176041,919\n176041,1133\n176041,1188\n176042,1019\n176043,497\n176044,801\n176045,2205\n176045,33424\n176046,634\n176047,500\n176047,189839\n176048,209\n176048,302\n176049,151\n176050,176051\n176052,809\n176054,211\n176055,137\n176056,805\n176057,336\n176058,1724\n176059,752\n176059,1210\n176060,920\n176061,5591\n176062,22\n176063,6424\n176064,349\n176064,392\n176065,435\n176066,515\n176068,2373\n176069,2923\n176070,176071\n176073,298\n176074,406\n176075,485\n176076,994\n176077,652\n176078,142433\n176079,843\n176080,111142\n176080,148875\n176081,175\n176083,138686\n176084,2944\n176085,422\n176086,2353\n176087,302\n176088,602\n176089,1282\n176090,868\n176090,1235\n176090,1335\n176091,406\n176092,83\n176093,1052\n176093,1893\n176095,195\n176096,167\n176096,73570\n176097,636\n176098,861\n176099,392\n176100,671\n176101,1\n176102,30\n176103,862\n176104,636\n176105,885\n176105,5405\n176105,13704\n176106,9457\n176107,287\n176108,83\n176109,252\n176110,516\n176111,1220\n176111,1222\n176112,2073\n176113,1579\n176113,1659\n176114,602\n176115,50\n176115,167\n176115,779\n176115,818\n176115,861\n176115,127158\n176116,447\n176117,1688\n176118,1105\n176119,1353\n176120,1782\n176121,30\n176122,1432\n176123,483\n176124,390\n176125,207\n176126,6556\n176127,493\n176128,68\n176129,22\n176130,58\n176131,83\n176132,160\n176133,83\n176133,278\n176135,994\n176136,1177\n176137,455\n176138,151\n176139,79\n176139,217\n176139,247\n176139,1181\n176140,83\n176141,328\n176142,302\n176143,4571\n176144,861\n176145,178\n176146,2590\n176147,1429\n176148,30\n176149,30\n176150,577\n176151,1143\n176152,176153\n176154,355\n176155,315\n176156,113156\n176157,315\n176158,3623\n176159,1509\n176160,668\n176162,516\n176163,885\n176163,13704\n176164,30\n176165,269\n176166,23783\n176167,217\n176167,240\n176167,301\n176167,631\n176167,1001\n176167,1010\n176167,1085\n176167,1522\n176167,1715\n176168,176169\n176170,1462\n176170,8537\n176171,33424\n176172,310\n176172,6556\n176173,1052\n176174,1467\n176175,30\n176176,875\n176177,467\n176177,779\n176177,893\n176178,30\n176179,360\n176180,55849\n176181,872\n176183,1132\n176184,1608\n176185,393\n176186,2116\n176187,1247\n176187,164572\n176188,305\n176188,337\n176190,1\n176191,1274\n176192,538\n176192,934\n176193,302\n176193,406\n176193,420\n176193,1414\n176193,1466\n176194,8854\n176195,1474\n176196,58\n176197,1252\n176197,1253\n176198,473\n176199,72\n176200,176201\n176202,72\n176203,68\n176204,72\n176205,516\n176206,58\n176207,113156\n176208,1639\n176209,302\n176210,640\n176211,304\n176212,176213\n176214,97\n176215,1014\n176216,861\n176217,1014\n176218,455\n176220,8854\n176221,30\n176222,115659\n176223,200\n176224,406\n176225,72\n176226,30\n176227,285\n176228,285\n176229,115659\n176230,1\n176230,94\n176230,184\n176230,206\n176230,2787\n176231,72\n176232,602\n176234,55849\n176235,510\n176235,1749\n176236,1007\n176237,452\n176238,147\n176238,306\n176238,307\n176238,406\n176238,585\n176238,779\n176238,1181\n176239,55849\n176240,176241\n176242,83\n176243,147\n176244,1\n176245,272\n176246,247\n176247,1014\n176248,784\n176248,1462\n176249,72\n176250,2775\n176251,447\n176252,30\n176253,176254\n176255,30\n176256,2266\n176257,338\n176258,56\n176259,422\n176260,240\n176260,388\n176260,389\n176260,467\n176260,509\n176260,818\n176260,2045\n176260,7154\n176260,15566\n176260,36591\n176260,100219\n176260,176235\n176261,137\n176262,83\n176263,30\n176264,1858\n176265,1860\n176266,44\n176267,1127\n176268,843\n176269,1014\n176270,366\n176271,30236\n176272,77\n176273,862\n176274,72\n176275,875\n176276,145240\n176277,447\n176278,2775\n176279,176280\n176281,72\n176282,602\n176283,215\n176284,135\n176285,1467\n176286,30\n176287,406\n176288,346\n176289,333\n176290,137\n176291,388\n176292,2424\n176293,602\n176294,602\n176295,72\n176296,602\n176297,10\n176298,83\n176299,366\n176300,146\n176300,92476\n176301,647\n176302,344\n176303,1893\n176304,1893\n176305,240\n176305,372\n176305,1085\n176305,1580\n176305,2812\n176305,4222\n176306,1257\n176307,366\n176308,366\n176309,366\n176310,366\n176311,366\n176312,1984\n176313,424\n176315,1447\n176316,184\n176317,137\n176319,13980\n176320,4453\n176321,200\n176322,586\n176325,2646\n176326,5265\n176327,46\n176328,784\n176330,875\n176331,602\n176332,390\n176333,261\n176334,875\n176337,30\n176338,30\n176339,3623\n176341,1673\n176342,344\n176343,5662\n176344,83\n176345,1179\n176346,206\n176347,292\n176347,1688\n176348,192\n176349,994\n176350,184\n176352,2116\n176353,56\n176354,422\n176355,640\n176356,640\n176358,1179\n176359,640\n176361,313\n176362,440\n176362,794\n176363,2979\n176365,1019\n176366,55849\n176367,920\n176368,1511\n176368,3069\n176369,5976\n176370,1417\n176371,147\n176372,3623\n176374,467\n176375,788\n176376,7155\n176377,138686\n176378,175\n176379,3367\n176380,1509\n176381,3623\n176383,346\n176384,1132\n176385,1608\n176386,980\n176387,252\n176388,1359\n176389,850\n176390,217\n176391,3623\n176392,2671\n176393,875\n176394,2775\n176395,447\n176396,202\n176396,406\n176396,841\n176396,3895\n176396,6501\n176396,6684\n176396,8867\n176396,14829\n176396,18192\n176396,30514\n176396,36795\n176396,43670\n176396,44877\n176396,96543\n176396,106981\n176396,118336\n176396,176894\n176396,189856\n176396,192025\n176396,193491\n176396,193593\n176396,193654\n176396,194257\n176396,194595\n176396,211955\n176396,230328\n176396,232715\n176396,232724\n176396,233621\n176396,235996\n176396,236079\n176396,245388\n176396,249028\n176396,249211\n176396,249886\n176396,250193\n176396,251859\n176396,254211\n176396,254411\n176396,254412\n176396,255499\n176396,256812\n176396,256813\n176396,256814\n176396,256815\n176396,256816\n176396,257996\n176396,258255\n176396,259128\n176396,261824\n176396,263410\n176396,264358\n176397,79\n176398,2116\n176399,1305\n176401,138686\n176403,175\n176405,1707\n176406,581\n176409,818\n176410,2191\n176411,1474\n176412,147\n176413,393\n176414,994\n176415,874\n176416,406\n176417,142430\n176417,147191\n176417,192485\n176418,440\n176418,1033\n176419,2312\n176420,65\n176420,71\n176420,272\n176420,611\n176421,147\n176422,2210\n176422,4237\n176423,994\n176424,176425\n176424,265192\n176426,872\n176427,124668\n176428,718\n176429,626\n176430,217\n176431,355\n176433,248\n176435,30\n176436,285\n176437,146\n176437,92476\n176438,406\n176438,1181\n176439,30\n176440,301\n176441,931\n176442,557\n176444,192\n176444,1089\n176445,171\n176446,217\n176447,859\n176448,557\n176449,972\n176450,1\n176451,1326\n176452,162599\n176454,44725\n176456,1033\n176457,1033\n176459,720\n176461,918\n176462,801\n176463,1789\n176466,298\n176467,485\n176468,346\n176470,406\n176471,1860\n176472,602\n176473,215\n176475,83\n176476,406\n176476,1425\n176477,151\n176479,72\n176480,344\n176481,285\n176483,644\n176485,68\n176486,34\n176486,35\n176487,30\n176488,557\n176489,30\n176490,1858\n176491,1860\n176492,217\n176493,483\n176494,718\n176495,30\n176496,138686\n176497,175\n176498,1531\n176498,4611\n176499,2784\n176500,2626\n176501,563\n176502,301\n176503,671\n176505,349\n176506,3177\n176507,30\n176508,1871\n176509,130664\n176512,1544\n176513,356\n176514,615\n176515,176516\n176517,30\n176519,323\n176521,167\n176522,30\n176523,941\n176525,744\n176526,2210\n176526,4237\n176527,783\n176528,515\n176529,957\n176529,1815\n176530,784\n176531,557\n176532,557\n176533,301\n176534,430\n176535,4411\n176536,430\n176537,1102\n176538,424\n176539,149\n176539,251\n176539,586\n176539,920\n176540,267\n176541,127158\n176544,1807\n176546,5405\n176547,142426\n176548,599\n176549,2620\n176552,557\n176553,332\n176553,788\n176553,9007\n176554,252\n176556,290\n176556,714\n176556,1511\n176556,33424\n176556,94134\n176557,209\n176559,392\n176559,623\n176559,1805\n176559,1860\n176559,2697\n176560,861\n176561,302\n176562,176563\n176564,79\n176565,10\n176566,631\n176568,907\n176569,1140\n176570,56\n176571,422\n176572,557\n176573,1220\n176573,1222\n176574,516\n176575,252\n176576,1432\n176578,900\n176579,217\n176579,1019\n176580,8463\n176581,23783\n176582,151\n176583,301\n176584,2923\n176585,647\n176586,1381\n176587,366\n176588,313\n176589,2089\n176589,2940\n176591,264\n176593,30\n176594,30\n176595,3804\n176596,30\n176597,83\n176599,134\n176600,424\n176601,211\n176602,72\n176603,298\n176604,485\n176605,525\n176606,1309\n176607,278\n176608,120\n176608,248\n176608,251\n176608,557\n176608,1309\n176608,1749\n176608,3695\n176608,143287\n176610,1285\n176611,44\n176612,631\n176613,1326\n176614,294\n176615,6303\n176616,72\n176617,278\n176618,620\n176619,99\n176620,557\n176621,178\n176621,302\n176621,467\n176622,176623\n176622,184219\n176622,204989\n176624,115\n176624,118\n176625,1474\n176626,424\n176627,113156\n176628,538\n176629,176630\n176631,176632\n176633,10\n176633,3111\n176634,557\n176635,240\n176636,850\n176637,302\n176637,579\n176637,687\n176638,422\n176639,56\n176640,30\n176641,99\n176642,358\n176644,1634\n176645,167\n176645,73570\n176646,247\n176647,2373\n176648,313\n176648,1282\n176648,2224\n176649,298\n176650,485\n176651,1\n176652,30\n176653,406\n176653,1655\n176653,92476\n176654,206\n176655,2411\n176656,21442\n176656,142426\n176657,1014\n176658,1014\n176659,1014\n176660,1014\n176661,991\n176661,5366\n176662,433\n176663,30\n176664,158\n176665,176666\n176667,30\n176668,450\n176669,366\n176670,592\n176671,366\n176672,2782\n176672,8854\n176673,323\n176674,176675\n176676,264\n176677,366\n176678,366\n176679,366\n176680,366\n176681,366\n176682,366\n176683,176684\n176685,485\n176686,298\n176687,298\n176688,485\n176689,217\n176689,536\n176690,115659\n176691,302\n176693,366\n176693,1414\n176694,861\n176695,671\n176696,30\n176697,250\n176697,1684\n176698,285\n176699,2116\n176700,323\n176701,577\n176702,366\n176703,949\n176704,450\n176705,273\n176706,30\n176707,483\n176708,30\n176709,872\n176710,424\n176711,30\n176712,323\n176713,176714\n176715,99\n176716,126\n176717,932\n176718,176719\n176720,175\n176721,328\n176722,176723\n176724,1821\n176725,2205\n176725,33424\n176726,623\n176726,1805\n176727,83\n176728,994\n176730,447\n176731,2775\n176732,127158\n176733,127158\n176734,147\n176735,932\n176736,500\n176737,2775\n176738,1962\n176739,54\n176740,1052\n176741,1882\n176742,323\n176743,2590\n176744,355\n176745,1893\n176747,302\n176749,626\n176750,158\n176752,1241\n176754,305\n176755,305\n176756,330\n176757,1566\n176758,1955\n176760,1707\n176761,309\n176761,310\n176762,1238\n176763,176764\n176765,557\n176766,1452\n176767,207\n176768,557\n176769,1893\n176770,868\n176771,703\n176772,779\n176773,136\n176775,323\n176776,2083\n176777,176778\n176779,34\n176779,35\n176780,4218\n176781,1732\n176782,104\n176782,215\n176782,704\n176782,1212\n176782,1282\n176782,1402\n176782,1432\n176782,4222\n176782,15077\n176782,16755\n176782,46874\n176782,59273\n176782,111142\n176782,118913\n176782,121616\n176782,141840\n176782,148456\n176782,148875\n176782,152789\n176782,172243\n176782,176782\n176782,190541\n176782,194521\n176782,197873\n176782,200855\n176782,245556\n176782,255028\n176783,138686\n176784,83\n176785,602\n176786,259\n176786,859\n176787,171\n176788,1167\n176789,30\n176790,602\n176791,44725\n176792,1522\n176792,1927\n176793,113156\n176794,252\n176796,99\n176797,841\n176798,30\n176799,1858\n176800,1860\n176801,171\n176802,1881\n176803,596\n176804,602\n176805,209\n176806,275\n176807,353\n176807,176808\n176809,58\n176810,994\n176811,46\n176812,1949\n176813,30\n176814,1151\n176814,1453\n176814,1722\n176814,3258\n176814,3538\n176816,1294\n176816,2480\n176817,158\n176818,23783\n176819,838\n176820,333\n176821,1319\n176822,1544\n176824,392\n176825,31073\n176826,137\n176827,467\n176828,920\n176829,1474\n176831,1512\n176831,5992\n176832,328\n176833,254\n176834,1749\n176835,192\n176835,217\n176835,305\n176835,1188\n176835,4101\n176835,13538\n176835,142426\n176836,1319\n176836,9542\n176837,859\n176838,356\n176838,1326\n176839,138686\n176840,485\n176841,298\n176843,1052\n176843,3345\n176844,503\n176846,406\n176847,21442\n176848,302\n176849,872\n176850,13661\n176851,1429\n176852,151\n176853,1132\n176854,1608\n176856,920\n176857,1220\n176857,1222\n176858,252\n176859,251\n176860,140\n176861,58\n176862,994\n176863,46\n176864,138686\n176865,175\n176867,392\n176867,433\n176869,1151\n176870,2205\n176870,33424\n176870,245910\n176871,314\n176871,1085\n176872,1419\n176873,602\n176874,861\n176875,1769\n176878,779\n176879,626\n176880,55849\n176881,176882\n176883,41\n176883,1016\n176883,1745\n176884,473\n176885,1531\n176885,35486\n176886,1616\n176887,1769\n176888,1143\n176889,30\n176890,176891\n176892,809\n176893,1769\n176895,516\n176895,1220\n176895,1222\n176896,1\n176897,668\n176898,1769\n176899,697\n176899,1769\n176900,1769\n176901,1769\n176902,762\n176902,994\n176903,1769\n176904,217\n176905,81\n176906,1359\n176907,1805\n176909,1309\n176910,30\n176911,2017\n176912,312\n176913,10\n176914,1769\n176915,726\n176917,1390\n176918,176919\n176920,1085\n176921,30\n176922,3555\n176923,292\n176924,7572\n176925,30\n176926,120\n176926,3115\n176927,176928\n176929,2944\n176930,302\n176931,406\n176932,2379\n176933,406\n176934,176935\n176936,30\n176937,1858\n176938,1860\n176939,900\n176940,256\n176941,66297\n176943,1893\n176944,41\n176944,104\n176944,372\n176944,431\n176944,631\n176944,784\n176944,805\n176944,1119\n176944,1188\n176944,1635\n176944,1659\n176944,13538\n176945,30\n176946,1353\n176947,66297\n176948,111\n176948,290\n176948,309\n176948,310\n176948,94134\n176951,30\n176952,1688\n176953,30\n176954,1132\n176955,1608\n176957,1149\n176958,843\n176959,217\n176959,222\n176960,996\n176961,1776\n176961,21442\n176962,178\n176963,304\n176964,106\n176965,1140\n176966,1381\n176967,1436\n176968,176969\n176970,581\n176971,6068\n176972,1210\n176973,424\n176974,328\n176975,2424\n176977,2590\n176978,557\n176979,202\n176979,240\n176979,599\n176979,911\n176979,1188\n176979,1796\n176979,2073\n176980,2646\n176980,3623\n176981,1580\n176982,557\n176983,602\n176984,2373\n176985,4571\n176986,473\n176988,1052\n176988,1659\n176989,459\n176990,56\n176991,422\n176992,862\n176994,107\n176995,4545\n176995,56150\n176996,1531\n176997,422\n176998,138686\n176999,515\n177000,175\n177001,1556\n177002,726\n177003,310\n177004,366\n177005,83\n177006,408\n177007,278\n177008,217\n177009,192\n177010,1265\n177010,1266\n177011,1151\n177012,1590\n177013,360\n177013,1127\n177013,1769\n177014,1241\n177014,1837\n177014,1849\n177016,2367\n177017,1220\n177017,1222\n177018,252\n177019,516\n177020,30\n177021,1511\n177021,3069\n177022,581\n177023,726\n177024,509\n177024,510\n177025,557\n177027,304\n177028,3135\n177029,862\n177030,991\n177030,1298\n177031,79\n177033,392\n177034,1319\n177034,66297\n177035,467\n177035,156379\n177036,65\n177037,248\n177038,195\n177039,299\n177039,1181\n177039,2646\n177040,2944\n177041,30\n177042,6837\n177043,330\n177044,1298\n177045,113156\n177046,68\n177046,81\n177047,483\n177048,1769\n177049,1\n177050,142426\n177051,211\n177052,4903\n177053,666\n177053,744\n177053,750\n177053,1124\n177054,158\n177054,483\n177055,392\n177056,588\n177056,590\n177057,589\n177057,3846\n177058,1\n177060,775\n177061,932\n177062,298\n177063,485\n177064,991\n177065,302\n177068,145240\n177069,1939\n177070,1381\n177071,273\n177072,704\n177073,861\n177074,2646\n177075,55849\n177076,366\n177077,1274\n177078,298\n177079,485\n177080,818\n177081,1566\n177082,142426\n177082,145751\n177083,177084\n177085,366\n177086,663\n177087,991\n177088,885\n177088,13704\n177089,1769\n177090,298\n177091,485\n177092,72\n177093,9029\n177094,485\n177095,298\n177096,222\n177096,818\n177096,1796\n177097,34\n177097,35\n177097,379\n177097,3252\n177098,177099\n177100,794\n177101,1707\n177102,83\n177103,140\n177104,30\n177105,5906\n177106,557\n177107,626\n177108,278\n177109,137\n177110,862\n177112,10\n177113,285\n177114,30\n177115,596\n177116,920\n177117,330\n177118,563\n177119,30\n177120,30\n177121,1707\n177122,920\n177123,30\n177124,4571\n177125,142426\n177126,30\n177127,31977\n177128,2620\n177129,30\n177130,406\n177131,2779\n177132,72\n177133,289\n177133,290\n177133,94134\n177135,1639\n177136,259\n177137,30\n177138,83\n177138,379\n177139,333\n177140,77\n177142,647\n177143,146\n177143,92476\n177144,344\n177145,30\n177146,2048\n177147,861\n177147,919\n177148,349\n177149,30\n177150,30\n177151,177152\n177153,980\n177154,72\n177155,1058\n177156,1\n177157,5366\n177158,72\n177159,447\n177160,2775\n177161,422\n177162,30\n177163,422\n177164,422\n177165,422\n177166,422\n177167,422\n177168,422\n177169,422\n177170,422\n177171,602\n177172,30\n177173,30\n177174,30\n177175,8822\n177176,72\n177177,30\n177178,30\n177179,72\n177180,340\n177181,602\n177182,1243\n177183,602\n177184,59\n177184,94\n177184,2787\n177184,3794\n177185,72\n177186,155481\n177187,275\n177188,278\n177189,285\n177190,50\n177191,83\n177192,841\n177193,602\n177194,269\n177195,177196\n177195,203595\n177197,920\n177198,336\n177198,599\n177198,1623\n177200,113156\n177201,872\n177202,2735\n177203,177204\n177203,204663\n177205,740\n177205,741\n177206,843\n177207,177208\n177209,1453\n177210,63\n177211,72\n177212,68\n177213,63\n177214,177215\n177216,217\n177216,446\n177216,872\n177216,1118\n177216,1796\n177216,3297\n177216,19005\n177217,99\n177218,255\n177219,177220\n177221,1634\n177222,177223\n177224,211\n177225,1677\n177226,338\n177226,1058\n177226,4039\n177227,56\n177227,652\n177228,247\n177229,137\n177230,355\n177231,1070\n177231,1677\n177232,577\n177233,104\n177233,120\n177233,202\n177233,217\n177233,379\n177233,455\n177233,577\n177233,949\n177233,1274\n177233,1608\n177233,2266\n177233,2784\n177233,7092\n177233,13546\n177234,1623\n177235,1132\n177236,1608\n177238,459\n177239,1769\n177240,390\n177241,571\n177241,156379\n177242,2701\n177243,647\n177244,146\n177244,92476\n177245,344\n177246,467\n177246,868\n177247,811\n177247,893\n177248,392\n177249,408\n177251,337\n177252,301\n177253,72\n177254,124668\n177255,338\n177256,2353\n177257,336\n177257,1623\n177258,136\n177259,640\n177260,2787\n177261,94\n177262,422\n177263,422\n177264,640\n177265,422\n177266,422\n177267,422\n177268,143287\n177269,422\n177270,422\n177271,640\n177272,422\n177273,422\n177274,422\n177275,640\n177276,1247\n177276,164572\n177277,452\n177278,184\n177279,640\n177280,252\n177281,177282\n177283,137\n177283,1707\n177284,289\n177284,290\n177284,94134\n177285,1984\n177286,1203\n177287,994\n177288,58\n177289,46\n177290,1359\n177291,640\n177292,209\n177292,579\n177293,666\n177294,1871\n177294,2266\n177294,2421\n177295,1707\n177296,142426\n177296,145751\n177297,138686\n177298,175\n177299,356\n177299,1119\n177300,788\n177301,83\n177302,137\n177303,1769\n177304,485\n177305,298\n177306,60576\n177307,162599\n177308,425\n177310,3258\n177311,818\n177312,120\n177313,467\n177314,920\n177315,162599\n177318,1608\n177319,1132\n177320,59\n177320,3794\n177321,251\n177322,602\n177323,602\n177325,1860\n177326,1858\n177327,3252\n177328,1033\n177329,852\n177330,56\n177331,422\n177332,83\n177333,3209\n177334,1132\n177335,147\n177336,852\n177336,957\n177336,1815\n177337,726\n177338,287\n177338,843\n177338,19010\n177339,779\n177340,1608\n177341,872\n177342,68216\n177344,192\n177346,138686\n177347,4672\n177348,175\n177349,332\n177349,5469\n177349,6119\n177350,310\n177350,6556\n177351,447\n177352,2775\n177353,240\n177353,818\n177355,6059\n177356,21442\n177357,4611\n177358,1\n177359,30\n177360,2737\n177361,252\n177363,192\n177364,805\n177365,28107\n177367,2784\n177369,124668\n177370,602\n177371,397\n177372,252\n177373,393\n177374,996\n177376,338\n177377,136\n177378,1011\n177379,809\n177381,6059\n177383,83\n177384,620\n177385,1014\n177386,248\n177388,493\n177389,459\n177390,222\n177391,920\n177392,920\n177393,79\n177395,346\n177396,10\n177397,252\n177398,151\n177399,620\n177400,392\n177400,1860\n177400,15609\n177401,5405\n177402,406\n177403,447\n177404,30\n177405,622\n177406,779\n177407,302\n177407,579\n177407,687\n177407,1374\n177408,1220\n177408,1222\n177409,251\n177410,252\n177411,1608\n177412,1132\n177413,1293\n177414,23010\n177415,918\n177416,1117\n177417,707\n177418,1860\n177419,1858\n177420,30\n177421,171\n177422,292\n177422,442\n177422,4771\n177422,185877\n177423,83\n177424,138686\n177425,175\n177426,338\n177427,95338\n177428,4455\n177430,269\n177432,83\n177433,6059\n177437,217\n177437,314\n177437,1085\n177437,3623\n177437,75912\n177438,328\n177439,3474\n177440,794\n177441,2434\n177442,79\n177443,1070\n177444,406\n177445,893\n177446,875\n177447,775\n177448,435\n177449,697\n177450,48\n177451,602\n177452,1181\n177453,602\n177454,9457\n177455,240\n177456,602\n177457,515\n177458,177459\n177460,843\n177461,177462\n177461,197212\n177461,206278\n177461,206650\n177461,206850\n177461,219411\n177461,226970\n177461,249527\n177461,250085\n177461,261317\n177461,264128\n177461,264731\n177463,1010\n177463,1298\n177464,147\n177464,217\n177465,422\n177465,577\n177465,615\n177465,762\n177465,949\n177465,1058\n177465,1265\n177465,1266\n177465,1607\n177465,1749\n177465,5961\n177465,9457\n177465,90845\n177465,131675\n177466,177467\n177468,43613\n177469,920\n177470,147\n177470,158\n177471,142405\n177472,30\n177473,247\n177473,2867\n177473,2868\n177474,142426\n177475,1203\n177476,338\n177477,1572\n177478,34\n177478,35\n177479,48\n177480,483\n177481,602\n177482,1509\n177484,48\n177485,30\n177486,278\n177486,455\n177486,2266\n177486,7768\n177488,620\n177489,2646\n177490,55849\n177491,2646\n177492,83\n177493,1274\n177494,850\n177495,158\n177496,2367\n177497,406\n177498,704\n177499,366\n177501,424\n177502,1323\n177503,1326\n177504,408\n177505,102\n177506,1465\n177507,2995\n177508,306\n177508,307\n177509,77\n177510,302\n177513,1133\n177514,301\n177514,1231\n177514,3422\n177515,779\n177516,10\n177518,442\n177519,673\n177520,225\n177521,306\n177521,307\n177522,366\n177523,1241\n177523,1849\n177523,19831\n177523,177369\n177523,187176\n177523,218495\n177523,260284\n177523,260285\n177524,1515\n177525,779\n177526,30\n177527,30\n177528,435\n177529,1235\n177529,1335\n177530,30\n177531,1\n177531,149\n177532,115659\n177533,399\n177535,1844\n177536,634\n177537,1\n177538,56\n177539,422\n177540,44725\n177541,10\n177541,1773\n177542,1274\n177543,1014\n177544,83\n177545,1014\n177546,1014\n177548,885\n177548,13704\n177549,83\n177550,843\n177551,4594\n177552,563\n177553,143287\n177556,177557\n177558,493\n177559,30\n177560,366\n177561,393\n177561,1531\n177562,557\n177563,2620\n177564,862\n177565,538\n177565,934\n177566,622\n177567,302\n177569,55849\n177570,302\n177571,1474\n177572,873\n177572,1058\n177572,1243\n177573,861\n177574,330\n177575,919\n177576,1785\n177577,934\n177578,302\n177579,563\n177580,861\n177581,957\n177581,1815\n177583,302\n177584,30\n177585,255\n177586,30\n177587,240\n177589,406\n177590,118336\n177591,177592\n177593,30\n177594,99\n177595,2048\n177596,30\n177597,136\n177598,287\n177599,30\n177600,302\n177601,2737\n177602,30\n177603,278\n177604,861\n177605,3804\n177606,1635\n177606,1659\n177607,861\n177608,247\n177609,83\n177610,298\n177611,485\n177612,250\n177612,1684\n177613,285\n177614,3623\n177615,142405\n177616,932\n177617,30\n177618,177619\n177620,861\n177621,177622\n177623,35\n177623,634\n177623,805\n177623,1011\n177623,42121\n177624,602\n177626,177627\n177628,151\n177629,99\n177630,278\n177631,177632\n177633,30\n177634,30\n177635,602\n177636,620\n177637,602\n177638,30\n177640,83\n177641,10\n177642,83\n177643,406\n177644,779\n177645,10\n177646,1\n177647,30236\n177648,306\n177648,307\n177649,1515\n177650,779\n177651,366\n177652,1085\n177653,1\n177654,15609\n177655,34\n177655,35\n177655,202\n177655,217\n177655,261\n177655,536\n177655,1001\n177655,1274\n177655,1927\n177655,2266\n177655,2671\n177655,2784\n177655,4594\n177655,4637\n177655,7092\n177656,206\n177657,44\n177658,72\n177659,1\n177659,943\n177660,366\n177661,1608\n177662,652\n177663,652\n177664,346\n177665,1179\n177666,2506\n177667,30\n177669,255\n177670,2506\n177671,349\n177672,261\n177672,1955\n177673,75912\n177674,58\n177675,46\n177676,994\n177677,602\n177678,177679\n177678,199628\n177678,218931\n177678,254108\n177678,262373\n177680,557\n177681,358\n177683,285\n177683,779\n177684,3148\n177685,355\n177686,1235\n177686,1335\n177687,30\n177688,647\n177689,344\n177690,146\n177690,92476\n177691,177692\n177693,147\n177693,158\n177693,178\n177693,337\n177693,447\n177693,516\n177693,1181\n177693,1388\n177693,1531\n177693,4455\n177693,4545\n177693,6119\n177693,56150\n177694,577\n177695,366\n177696,366\n177697,366\n177698,422\n177699,366\n177700,30\n177701,302\n177702,1085\n177702,2083\n177703,366\n177704,366\n177705,19010\n177706,366\n177707,1893\n177708,516\n177708,907\n177708,1623\n177709,1608\n177710,1132\n177711,30\n177713,56\n177713,43613\n177714,1388\n177715,450\n177716,177717\n177719,1462\n177719,8907\n177720,186\n177721,312\n177722,852\n177723,83\n177724,1893\n177725,3422\n177726,30\n177729,2296\n177730,1007\n177731,422\n177732,422\n177733,422\n177734,422\n177735,422\n177736,422\n177737,422\n177738,422\n177739,422\n177740,422\n177741,422\n177742,8598\n177743,15179\n177744,392\n177745,673\n177746,1893\n177747,1707\n177748,433\n177751,1\n177753,1238\n177754,1385\n177755,2367\n177756,3003\n177758,177759\n177760,177761\n177762,4611\n177763,599\n177764,920\n177765,467\n177766,83\n177768,58\n177769,875\n177770,48\n177771,872\n177772,2353\n177774,177775\n177777,259\n177777,676\n177778,240\n177778,372\n177778,390\n177778,968\n177779,1359\n177780,2671\n177781,6506\n177782,602\n177783,142433\n177784,1474\n177785,358\n177786,843\n177787,177788\n177789,1149\n177790,142426\n177791,130\n177792,1452\n177793,536\n177793,4672\n177794,843\n177795,2116\n177796,718\n177797,447\n177798,2775\n177800,138686\n177801,175\n177802,1844\n177803,289\n177803,358\n177803,1127\n177803,1332\n177803,1844\n177803,6682\n177803,94134\n177804,1509\n177805,536\n177806,72\n177807,186\n177808,516\n177809,1220\n177809,1222\n177810,252\n177811,202\n177813,422\n177814,192\n177814,779\n177815,4\n177815,5\n177816,406\n177818,162599\n177819,162599\n177820,1122\n177821,1235\n177821,1335\n177822,2209\n177823,1572\n177824,1014\n177824,2979\n177827,1955\n177828,336\n177828,1623\n177829,647\n177830,146\n177830,92476\n177831,344\n177832,28203\n177833,34\n177833,35\n177833,217\n177834,536\n177837,151\n177838,2353\n177840,222\n177841,1\n177841,147\n177841,149\n177841,89035\n177842,563\n177842,818\n177843,590\n177843,1419\n177844,626\n177845,138686\n177846,660\n177846,666\n177846,743\n177847,175\n177848,298\n177849,485\n177850,425\n177851,1001\n177852,72\n177853,1551\n177854,1132\n177855,1608\n177857,141912\n177858,493\n177859,285\n177860,177861\n177862,358\n177863,477\n177863,536\n177864,392\n177865,2209\n177866,1132\n177867,1608\n177868,536\n177869,1143\n177870,106\n177871,30\n177872,309\n177872,310\n177873,252\n177874,1220\n177874,1222\n177875,251\n177876,247\n177877,83\n177878,83\n177879,178\n177880,5405\n177881,177882\n177884,557\n177885,1175\n177887,872\n177887,1151\n177888,602\n177889,647\n177890,344\n177891,146\n177891,92476\n177892,459\n177893,422\n177894,56\n177895,447\n177896,2775\n177897,934\n177899,23783\n177901,586\n177902,5440\n177904,516\n177906,2205\n177906,33424\n177906,245910\n177907,240\n177908,2784\n177909,431\n177910,336\n177910,1623\n177911,23783\n177912,23783\n177913,907\n177914,1359\n177915,177916\n177917,1531\n177918,581\n177922,389\n177923,1522\n177923,2979\n177924,893\n177925,302\n177925,893\n177927,1001\n177928,2989\n177928,2991\n177929,1177\n177931,298\n177932,485\n177933,3695\n177935,217\n177936,309\n177936,310\n177937,1085\n177938,200\n177939,389\n177941,151\n177942,140\n177942,515\n177942,1436\n177944,72\n177945,389\n177945,660\n177945,7092\n177947,177948\n177949,1274\n177950,1127\n177951,515\n177952,356\n177952,852\n177952,1085\n177953,55849\n177954,605\n177955,366\n177956,366\n177957,2116\n177958,302\n177959,861\n177960,162599\n177961,577\n177962,1370\n177963,30\n177964,37\n177965,2620\n177966,3413\n177967,1776\n177968,55849\n177969,55849\n177970,55849\n177971,314\n177971,1010\n177972,55849\n177973,1085\n177974,389\n177974,1240\n177974,1465\n177974,2620\n177975,99\n177975,147\n177975,158\n177975,206\n177976,571\n177977,55849\n177978,1179\n177978,1353\n177978,2146\n177978,3297\n177978,5326\n177979,30\n177980,30\n177981,211\n177982,1010\n177983,30\n177984,30\n177985,30\n177988,30\n177990,287\n177990,809\n177990,19010\n177991,298\n177992,485\n177993,30\n177994,30\n177996,30\n177997,72\n177998,392\n177999,30\n178000,1359\n178001,55849\n178002,1220\n178002,1222\n178003,22580\n178004,83\n178004,843\n178005,406\n178006,885\n178006,13704\n178007,332\n178008,1984\n178009,1623\n178010,8373\n178011,30\n178012,167\n178012,240\n178012,301\n178012,567\n178012,615\n178012,968\n178012,1122\n178012,1160\n178012,1231\n178012,1293\n178012,1298\n178012,1436\n178012,1462\n178012,1564\n178012,1785\n178012,1832\n178012,2083\n178012,2191\n178012,2979\n178012,3207\n178012,3328\n178012,5662\n178012,5718\n178012,8537\n178012,189303\n178012,221828\n178012,231939\n178013,843\n178014,30\n178015,2590\n178016,178017\n178018,809\n178019,65\n178020,1769\n178021,102\n178022,408\n178023,1323\n178024,1326\n178025,72\n178026,328\n178027,255\n178028,72\n178029,34\n178029,35\n178029,83\n178030,2373\n178031,292\n178031,1204\n178031,1332\n178031,1572\n178031,5258\n178031,7806\n178031,180118\n178031,187284\n178031,208551\n178031,210011\n178031,211584\n178032,278\n178033,1707\n178034,83\n178036,1782\n178037,557\n178038,138\n178039,865\n178040,557\n178041,137\n178042,88820\n178043,118\n178043,4597\n178045,30\n178046,1014\n178047,30\n178048,1014\n178049,28130\n178050,2590\n178051,30\n178052,1014\n178054,302\n178055,30\n178056,1\n178057,1\n178058,178059\n178060,240\n178060,588\n178060,590\n178060,2205\n178060,33424\n178061,861\n178062,55849\n178063,55849\n178064,280\n178064,17245\n178065,35\n178065,269\n178065,439\n178065,516\n178065,2979\n178066,1612\n178068,178069\n178070,406\n178071,178072\n178073,485\n178074,298\n178075,30\n178076,489\n178077,126\n178077,206\n178077,435\n178078,626\n178078,1309\n178078,2779\n178078,2784\n178079,111\n178079,2868\n178080,1390\n178081,298\n178082,485\n178083,207\n178084,392\n178086,358\n178087,602\n178089,366\n178090,602\n178091,872\n178092,1429\n178093,264\n178094,1381\n178095,346\n178096,1007\n178097,4771\n178098,3193\n178099,1143\n178100,285\n178101,668\n178102,250\n178102,1684\n178103,7270\n178104,77\n178104,269\n178105,250\n178105,1684\n178106,285\n178107,3422\n178108,46\n178109,9010\n178110,30\n178111,44\n178112,483\n178113,30\n178114,862\n178115,225\n178116,34\n178116,35\n178117,1181\n178118,6556\n178119,8884\n178120,1001\n178120,4060\n178121,30\n178122,30\n178123,1085\n178124,424\n178125,1379\n178126,366\n178127,366\n178128,366\n178129,366\n178130,366\n178131,818\n178132,536\n178133,30\n178134,355\n178135,972\n178136,83\n178138,628\n178139,872\n178140,2646\n178141,83\n178142,50\n178143,2224\n178144,83\n178145,4193\n178149,8788\n178151,2073\n178153,298\n178154,485\n178155,30\n178156,349\n178157,1\n178158,147\n178158,1425\n178159,1572\n178160,1016\n178161,30\n178162,337\n178163,106\n178164,8822\n178165,440\n178166,479\n178167,3846\n178168,142870\n178169,1285\n178170,30\n178171,516\n178172,2209\n178173,192\n178174,50\n178175,30\n178176,30\n178177,195\n178179,779\n178180,588\n178180,590\n178181,1718\n178182,19\n178183,818\n178184,3370\n178184,8992\n178185,652\n178185,1462\n178186,30\n178187,422\n178188,422\n178189,422\n178190,422\n178191,422\n178192,422\n178193,422\n178194,422\n178195,422\n178196,422\n178197,422\n178198,422\n178199,1425\n178200,3623\n178201,22\n178202,1\n178203,1\n178204,178205\n178206,493\n178206,1531\n178207,424\n178208,222\n178208,1639\n178209,861\n178210,602\n178211,483\n178212,30\n178213,178214\n178213,206594\n178215,30\n178216,30\n178217,30\n178218,178219\n178220,310\n178221,312\n178223,4691\n178224,178225\n178226,178227\n178228,222\n178229,920\n178230,83\n178231,788\n178231,1531\n178232,178233\n178234,602\n178235,447\n178236,13136\n178237,483\n178238,178239\n178238,184534\n178240,137\n178240,1082\n178240,1888\n178241,631\n178242,269\n178243,275\n178244,1\n178245,602\n178246,577\n178246,647\n178246,1544\n178247,1132\n178248,1608\n178249,178250\n178251,178250\n178252,1284\n178252,148742\n178253,104\n178253,200\n178254,862\n178255,178256\n178257,500\n178258,1962\n178259,1052\n178260,1882\n178261,2775\n178262,54\n178263,178\n178264,516\n178265,602\n178266,809\n178267,602\n178268,602\n178269,602\n178271,30\n178272,3623\n178273,1479\n178274,117163\n178275,390\n178276,30\n178277,314\n178278,2048\n178279,22\n178280,178281\n178282,178283\n178284,875\n178285,875\n178286,146\n178286,92476\n178287,647\n178288,344\n178289,178290\n178289,232903\n178291,178292\n178293,843\n178294,207\n178295,178296\n178297,1014\n178298,3111\n178298,216890\n178298,217767\n178298,240334\n178299,178300\n178301,809\n178302,301\n178303,366\n178304,366\n178305,366\n178306,366\n178307,187\n178308,140\n178309,178310\n178311,10\n178312,3252\n178313,178314\n178315,3085\n178316,1773\n178317,178318\n178319,850\n178320,72\n178321,202\n178321,142870\n178322,178323\n178324,72\n178326,652\n178327,2697\n178328,557\n178329,7652\n178330,184\n178330,991\n178330,1179\n178330,1639\n178330,5366\n178331,137\n178332,30\n178333,178334\n178335,355\n178336,107\n178337,2416\n178337,2417\n178338,292\n178339,338\n178340,298\n178341,1133\n178342,3538\n178343,178344\n178346,4192\n178346,4193\n178347,1707\n178348,137\n178349,137\n178350,1359\n178351,1796\n178351,3804\n178352,3447\n178353,206\n178355,337\n178356,30\n178357,3218\n178358,1556\n178359,178360\n178362,72\n178363,872\n178364,872\n178365,32\n178368,178369\n178370,178369\n178371,779\n178372,7360\n178373,137\n178374,422\n178375,56\n178376,1305\n178377,1072\n178378,30\n178379,972\n178380,10\n178381,301\n178382,178383\n178384,178385\n178386,31977\n178386,178387\n178388,2146\n178389,7\n178390,160\n178391,1962\n178392,7316\n178393,3161\n178394,304\n178395,875\n178396,247\n178397,2296\n178398,406\n178399,2775\n178400,447\n178401,489\n178402,269\n178403,30\n178404,4810\n178405,355\n178406,483\n178408,485\n178409,298\n178410,6682\n178411,79\n178412,2506\n178413,2646\n178414,1151\n178415,872\n178416,872\n178417,178418\n178419,2989\n178419,2991\n178420,2367\n178421,2367\n178423,4252\n178424,1\n178425,178426\n178427,30\n178428,994\n178429,202\n178430,694\n178431,72\n178432,994\n178433,1893\n178433,117163\n178434,557\n178435,557\n178436,628\n178437,557\n178438,22293\n178439,178440\n178441,15807\n178442,647\n178443,15807\n178444,932\n178445,200\n178447,3804\n178448,1\n178449,972\n178450,178451\n178452,389\n178453,206\n178454,19\n178456,2750\n178457,312\n178457,1052\n178457,3695\n178459,3769\n178460,178461\n178462,527\n178463,1612\n178464,178465\n178466,4611\n178467,30\n178468,292\n178469,500\n178470,4101\n178471,972\n178472,366\n178473,1467\n178474,3246\n178475,636\n178476,1\n178477,142473\n178478,211\n178479,602\n178480,2260\n178481,313\n178482,599\n178483,366\n178484,323\n178485,805\n178486,30\n178487,72\n178488,1\n178489,178490\n178491,72\n178492,54\n178493,97\n178494,779\n178495,602\n178496,104\n178497,178498\n178499,1769\n178500,72\n178501,7124\n178502,30\n178503,255\n178504,1715\n178505,178506\n178507,602\n178508,310\n178509,835\n178511,509\n178512,5976\n178513,366\n178515,292\n178516,294\n178517,138\n178518,296\n178519,298\n178520,72\n178521,388\n178522,30\n178523,178524\n178525,30\n178526,3769\n178527,72\n178528,1224\n178529,30\n178530,136\n178531,843\n178532,269\n178533,355\n178534,192\n178534,4192\n178534,4193\n178535,58\n178536,994\n178537,46\n178538,119\n178539,640\n178540,147\n178541,1479\n178542,2205\n178542,33424\n178544,83\n178545,2421\n178547,1\n178548,178549\n178550,1238\n178551,337\n178552,1452\n178553,337\n178556,360\n178556,697\n178556,1769\n178558,5375\n178559,760\n178560,178561\n178562,1\n178564,178565\n178566,949\n178567,994\n178568,623\n178569,3297\n178570,178571\n178573,167\n178573,861\n178573,1241\n178573,76096\n178573,127158\n178574,3474\n178575,640\n178576,41\n178576,272\n178576,298\n178576,417\n178576,862\n178576,911\n178576,1179\n178576,1474\n178576,2204\n178576,2237\n178576,2296\n178576,2572\n178576,2923\n178576,3623\n178576,4190\n178576,4222\n178576,6068\n178576,7194\n178576,15277\n178576,22389\n178576,38822\n178576,42810\n178576,44725\n178576,60381\n178576,66297\n178576,75912\n178576,97423\n178576,114908\n178576,119957\n178576,121109\n178576,127158\n178576,138898\n178576,139994\n178576,160971\n178576,178576\n178576,180583\n178576,181891\n178576,185300\n178576,185460\n178576,185874\n178576,185877\n178576,189174\n178576,191174\n178576,191467\n178576,192322\n178576,207528\n178576,217502\n178576,221101\n178576,228585\n178576,231072\n178576,242177\n178576,242227\n178576,254990\n178576,262420\n178577,640\n178578,640\n178579,422\n178580,422\n178581,422\n178582,422\n178583,422\n178585,422\n178586,422\n178587,422\n178588,422\n178589,422\n178590,640\n178591,994\n178592,422\n178593,422\n178594,83\n178595,41\n178598,626\n178599,1072\n178600,233\n178601,920\n178602,589\n178603,1566\n178604,467\n178605,269\n178606,685\n178606,1113\n178606,1319\n178606,24500\n178607,184\n178608,2146\n178610,1566\n178611,167\n178611,2979\n178611,73570\n178612,83\n178613,55849\n178614,3623\n178615,872\n178616,671\n178617,868\n178619,875\n178620,999\n178621,999\n178623,178623\n178625,5591\n178628,10\n178629,146\n178629,92476\n178630,647\n178631,344\n178632,397\n178633,146\n178633,92476\n178634,647\n178635,344\n178636,1608\n178637,1132\n178638,240\n178639,1010\n178640,602\n178641,2421\n178642,302\n178643,1072\n178644,2045\n178645,455\n178646,2266\n178647,217\n178648,4594\n178649,4637\n178650,1201\n178651,1818\n178653,269\n178655,255\n178656,571\n178656,868\n178658,1\n178659,2083\n178660,22\n178661,781\n178662,1132\n178663,138686\n178664,302\n178665,175\n178666,875\n178667,171\n178668,697\n178669,4771\n178671,178672\n178673,146\n178673,92476\n178674,422\n178676,1707\n178677,87\n178677,1240\n178678,579\n178679,302\n178680,861\n178681,217\n178682,3804\n178683,178684\n178685,1983\n178686,1274\n178687,97\n178687,158\n178688,994\n178689,240\n178690,994\n178691,994\n178692,994\n178693,994\n178694,2416\n178694,2417\n178695,2083\n178696,40566\n178697,1132\n178698,781\n178699,178700\n178701,126\n178701,872\n178701,1151\n178704,781\n178705,1132\n178707,138686\n178708,175\n178709,433\n178710,151\n178711,60\n178711,994\n178711,9539\n178711,16614\n178711,21944\n178712,516\n178713,1\n178714,272\n178715,704\n178716,358\n178717,167\n178718,217\n178719,30331\n178720,433\n178721,158\n178721,941\n178723,663\n178724,467\n178725,30\n178726,467\n178726,868\n178726,1345\n178727,657\n178728,994\n178729,1220\n178729,1222\n178730,1276\n178730,3698\n178731,439\n178732,1559\n178733,19010\n178735,994\n178737,3218\n178738,868\n178739,2749\n178739,2750\n178739,27282\n178739,39408\n178739,55686\n178739,68135\n178739,87275\n178739,109863\n178739,163806\n178739,164477\n178739,178739\n178739,179183\n178739,179272\n178739,179321\n178739,179829\n178739,179863\n178739,181291\n178739,181292\n178739,181435\n178739,181451\n178739,182009\n178739,182070\n178739,182905\n178739,183468\n178739,188838\n178739,189279\n178739,189344\n178739,189478\n178739,192976\n178739,212021\n178739,214776\n178739,215509\n178739,215677\n178739,217244\n178739,217548\n178739,226591\n178739,229275\n178740,1467\n178741,1860\n178742,1858\n178744,996\n178745,3555\n178746,994\n178747,872\n178748,779\n178749,346\n178749,435\n178749,447\n178749,586\n178749,1294\n178750,1673\n178751,1151\n178752,22\n178753,79\n178754,151\n178755,809\n178756,1773\n178757,292\n178757,366\n178757,500\n178757,972\n178757,4101\n178758,1181\n178759,30\n178761,22\n178763,292\n178764,1893\n178765,515\n178766,1962\n178767,500\n178768,1052\n178769,1882\n178770,2775\n178771,54\n178772,50\n178773,868\n178774,30\n178775,1623\n178777,30\n178778,779\n178780,861\n178781,893\n178782,918\n178783,485\n178784,298\n178785,138686\n178786,175\n178788,422\n178789,56\n178790,1370\n178791,447\n178792,2775\n178793,447\n178794,2775\n178795,2775\n178796,447\n178797,162599\n178798,485\n178799,298\n178800,178801\n178802,1462\n178802,8537\n178802,84257\n178803,422\n178804,56\n178805,120\n178806,158\n178809,151\n178809,972\n178809,1402\n178810,1616\n178810,2979\n178812,852\n178812,2168\n178813,30\n178814,424\n178815,433\n178816,622\n178817,83\n178818,30\n178819,3422\n178821,8463\n178822,30\n178823,483\n178824,620\n178825,1370\n178826,483\n178827,1722\n178827,3538\n178828,1579\n178829,151\n178830,1462\n178830,8537\n178831,146\n178831,92476\n178832,647\n178833,344\n178834,30\n178835,302\n178836,406\n178837,178838\n178839,344\n178840,146\n178840,92476\n178841,647\n178842,356\n178843,14434\n178844,56\n178845,422\n178847,30\n178848,83\n178849,102\n178850,141912\n178851,30\n178852,30\n178853,83\n178855,306\n178855,307\n178857,1801\n178858,1515\n178859,779\n178860,861\n178861,83\n178862,1467\n178863,536\n178864,217\n178865,1140\n178866,278\n178867,1\n178868,636\n178869,136\n178870,389\n178872,640\n178873,294\n178873,1001\n178874,1571\n178875,34\n178875,389\n178875,536\n178875,1072\n178875,1539\n178875,1881\n178875,2424\n178875,2944\n178875,4594\n178875,5976\n178875,13137\n178876,406\n178876,1181\n178876,1515\n178877,178878\n178879,557\n178881,647\n178882,366\n178883,406\n178884,1454\n178885,2620\n178886,2421\n178887,718\n178888,178889\n178890,861\n178890,2116\n178891,83\n178892,2373\n178893,219\n178894,602\n178895,1370\n178896,1821\n178897,86\n178897,167\n178897,301\n178897,907\n178897,1522\n178897,2083\n178897,2191\n178897,2557\n178897,2979\n178897,3138\n178898,358\n178899,485\n178900,1010\n178901,393\n178902,525\n178903,1309\n178904,83\n178905,595\n178906,1285\n178907,557\n178908,485\n178909,1033\n178910,707\n178911,3524\n178913,631\n178914,294\n178915,1381\n178916,1381\n178917,1474\n178918,178919\n178920,247\n178921,118336\n178922,2116\n178923,891\n178924,79\n178925,7416\n178927,115659\n178927,148600\n178928,1014\n178929,1014\n178930,1014\n178931,1612\n178932,760\n178933,178934\n178935,1014\n178936,298\n178937,485\n178938,485\n178939,298\n178940,298\n178941,485\n178942,577\n178943,1616\n178945,30\n178946,516\n178947,252\n178948,1220\n178948,1222\n178949,30\n178950,107\n178950,536\n178950,3138\n178951,30\n178952,34\n178952,35\n178953,72\n178955,30\n178956,30\n178957,30\n178958,30\n178959,30\n178960,30\n178961,602\n178962,86416\n178963,1149\n178964,1253\n178965,2590\n178966,30\n178967,599\n178968,30\n178969,54\n178970,247\n178971,431\n178972,63\n178973,30\n178974,422\n178975,56\n178976,30\n178977,30\n178978,30\n178979,932\n178980,138\n178981,178982\n178983,178984\n178985,2979\n178986,640\n178987,704\n178988,1298\n178989,207\n178991,178992\n178993,872\n178994,1429\n178995,155481\n178996,178997\n178996,212497\n178998,56\n178999,422\n179000,668\n179001,50\n179001,140\n179001,147\n179001,222\n179002,54\n179003,184\n179004,54\n179005,147\n179005,422\n179006,30\n179007,968\n179008,1143\n179009,424\n179010,7155\n179011,366\n179012,145240\n179013,151\n179014,4691\n179015,1634\n179017,30\n179018,30\n179019,1893\n179020,1893\n179021,30\n179023,355\n179024,48\n179024,292\n179024,397\n179024,483\n179025,30\n179026,356\n179026,611\n179027,1769\n179028,179029\n179030,2083\n179030,2557\n179031,5591\n179032,142210\n179033,1417\n179034,1479\n179035,483\n179035,999\n179036,30\n179037,1522\n179038,83\n179040,744\n179041,73570\n179042,640\n179044,1132\n179045,781\n179047,1238\n179048,1818\n179048,4218\n179048,4237\n179048,182162\n179049,852\n179049,1309\n179050,179051\n179052,179053\n179055,875\n179056,838\n179056,852\n179056,1119\n179056,1203\n179056,1309\n179056,1807\n179056,1955\n179056,44393\n179056,45278\n179056,47173\n179056,66918\n179056,173956\n179056,174910\n179056,176758\n179058,171\n179059,1287\n179060,707\n179061,1522\n179062,447\n179063,2775\n179064,171\n179065,200\n179066,875\n179068,171\n179069,781\n179070,1132\n179073,2775\n179074,447\n179075,147\n179076,422\n179077,422\n179078,422\n179079,179080\n179079,235190\n179082,422\n179083,422\n179084,422\n179085,1893\n179086,422\n179087,422\n179088,422\n179089,422\n179090,850\n179091,422\n179092,422\n179093,422\n179094,1368\n179095,422\n179097,56\n179098,422\n179099,596\n179100,1858\n179101,1860\n179102,171\n179103,63\n179104,467\n179105,920\n179106,149\n179106,192\n179106,406\n179106,1425\n179107,1132\n179108,781\n179109,3623\n179110,875\n179112,179113\n179114,149\n179115,1127\n179116,2367\n179118,779\n179120,171\n179121,505\n179123,305\n179124,138686\n179125,175\n179126,175\n179126,31977\n179127,287\n179128,843\n179129,120\n179129,261\n179130,209\n179131,72\n179132,104\n179133,1210\n179134,72\n179135,809\n179136,142426\n179137,1019\n179137,2266\n179137,7092\n179138,392\n179139,206\n179140,79\n179141,1298\n179141,1749\n179141,6695\n179142,3\n179144,179145\n179147,146\n179147,92476\n179152,2775\n179153,447\n179154,1010\n179155,120\n179155,261\n179157,336\n179157,1623\n179158,120\n179159,269\n179160,435\n179160,467\n179160,579\n179160,2116\n179161,120\n179162,120\n179163,269\n179164,252\n179165,2205\n179165,33424\n179166,72\n179168,1984\n179170,179171\n179170,179175\n179170,179555\n179170,186809\n179170,242680\n179172,179170\n179173,22\n179174,718\n179177,557\n179178,1127\n179179,179180\n179181,269\n179182,920\n179184,179185\n179186,1860\n179187,1858\n179188,10\n179189,2146\n179190,136\n179192,179193\n179196,366\n179196,500\n179197,310\n179198,292\n179199,138686\n179200,175\n179201,273\n179202,315\n179203,390\n179204,120\n179207,1381\n179209,9457\n179210,120\n179210,261\n179211,120\n179212,264\n179213,120\n179214,1276\n179215,406\n179216,278\n179217,315\n179219,55849\n179220,287\n179221,275\n179221,4771\n179222,1531\n179223,336\n179224,56\n179225,422\n179226,720\n179227,2557\n179228,179229\n179230,1359\n179231,79\n179232,278\n179233,179170\n179234,1572\n179235,406\n179236,273\n179240,596\n179241,3\n179242,179170\n179243,264\n179243,1147\n179244,179170\n179245,919\n179246,179170\n179248,179170\n179249,179170\n179250,557\n179251,179170\n179253,179170\n179254,435\n179255,592\n179256,179170\n179257,179170\n179258,356\n179259,720\n179259,877\n179259,907\n179259,1284\n179259,1732\n179259,2191\n179259,3422\n179260,1257\n179261,5591\n179262,3\n179263,1858\n179264,1860\n179265,273\n179266,179170\n179269,346\n179270,54\n179271,156379\n179273,83\n179274,179170\n179275,720\n179275,877\n179275,907\n179275,1284\n179275,1732\n179275,2191\n179275,3422\n179276,179277\n179278,146\n179278,149\n179278,285\n179278,620\n179278,92476\n179279,171\n179280,13\n179281,393\n179281,980\n179282,119\n179282,151\n179282,192\n179282,577\n179282,1400\n179282,2073\n179283,113156\n179284,4220\n179285,843\n179286,192\n179287,1927\n179288,435\n179289,671\n179289,190492\n179290,1939\n179291,3538\n179292,7270\n179293,1722\n179294,225\n179295,9001\n179296,227\n179297,248\n179298,4771\n179299,9029\n179300,111\n179301,136\n179302,1016\n179303,215\n179304,1882\n179305,503\n179306,1332\n179307,850\n179308,383\n179309,1745\n179310,179170\n179311,179170\n179312,5405\n179313,104\n179314,294\n179315,602\n179315,4805\n179316,515\n179317,918\n179318,968\n179319,179170\n179320,623\n179320,1805\n179322,22\n179322,120\n179322,302\n179322,861\n179322,6303\n179323,3\n179324,1127\n179325,602\n179326,843\n179327,647\n179328,146\n179328,92476\n179329,344\n179330,596\n179331,179170\n179332,146\n179332,92476\n179333,647\n179334,344\n179335,76096\n179336,1284\n179336,1285\n179336,148742\n179337,599\n179337,1118\n179338,200\n179339,179170\n179340,1298\n179341,179170\n179342,634\n179345,1634\n179346,142870\n179347,138686\n179348,71\n179348,611\n179349,175\n179350,179170\n179352,179170\n179353,557\n179354,151\n179355,273\n179356,1181\n179357,217\n179357,779\n179357,920\n179357,1033\n179358,30\n179359,147191\n179360,1509\n179361,1298\n179362,120\n179363,1\n179364,1001\n179366,1212\n179367,120\n179369,142870\n179370,179170\n179371,120\n179373,718\n179374,918\n179376,1181\n179377,2735\n179379,179170\n179380,179170\n179381,1001\n179382,2646\n179383,1151\n179384,30\n179385,302\n179386,179170\n179388,179170\n179389,147\n179389,158\n179389,184\n179389,2868\n179390,3623\n179391,3\n179393,390\n179393,479\n179393,586\n179393,636\n179393,28130\n179395,1309\n179396,1181\n179397,422\n179398,56\n179399,1212\n179400,179170\n179401,179170\n179402,2373\n179403,697\n179404,557\n179405,147\n179405,195\n179405,843\n179406,497\n179407,179170\n179408,1359\n179410,1127\n179411,146\n179411,92476\n179412,647\n179413,344\n179414,179170\n179415,1014\n179416,1014\n179417,56\n179418,422\n179419,179170\n179420,269\n179421,179170\n179422,179423\n179424,1556\n179425,328\n179426,179170\n179427,179170\n179428,1381\n179429,1\n179430,179170\n179431,781\n179432,1132\n179433,30\n179434,30\n179435,179170\n179436,861\n179437,179170\n179438,179170\n179439,30\n179440,179170\n179441,149\n179441,1425\n179442,30\n179443,2266\n179444,179170\n179445,302\n179446,179170\n179447,3623\n179448,6556\n179449,269\n179450,72\n179451,83\n179452,2797\n179453,1227\n179453,86416\n179454,149\n179455,179170\n179456,358\n179457,302\n179458,861\n179459,30\n179460,171\n179461,179170\n179462,30\n179463,77\n179464,222\n179465,717\n179466,861\n179467,571\n179468,516\n179469,252\n179470,1220\n179470,1222\n179471,278\n179472,269\n179473,30\n179474,143287\n179475,30\n179476,179170\n179477,23010\n179478,179170\n179479,264\n179480,743\n179481,30\n179482,310\n179483,1332\n179484,30\n179485,285\n179486,30\n179487,932\n179488,179489\n179488,199003\n179488,220087\n179488,229501\n179488,233874\n179488,240003\n179488,244802\n179488,245444\n179490,138686\n179491,175\n179492,389\n179493,179170\n179494,179170\n179495,179170\n179496,179170\n179497,30\n179498,195\n179499,1085\n179500,179170\n179501,1893\n179502,1707\n179503,179170\n179504,179170\n179505,54\n179506,30\n179507,179170\n179508,444\n179509,563\n179510,779\n179511,54\n179512,179170\n179513,1010\n179514,5366\n179516,671\n179517,222\n179518,255\n179519,340\n179520,138686\n179521,175\n179522,179170\n179523,30\n179524,1096\n179524,1118\n179525,179170\n179526,330\n179527,30\n179528,179170\n179529,30\n179530,712\n179532,483\n179533,179170\n179534,179170\n179535,179170\n179536,516\n179536,1220\n179536,1222\n179536,1821\n179536,21736\n179537,1\n179538,179170\n179539,179170\n179540,179170\n179541,179170\n179542,179170\n179543,850\n179544,58\n179545,46\n179546,994\n179547,179170\n179548,602\n179549,602\n179550,88820\n179551,602\n179552,250\n179552,1684\n179553,285\n179554,179170\n179556,179170\n179557,250\n179557,1684\n179558,285\n179559,44\n179560,179170\n179561,68\n179562,179170\n179563,179170\n179564,179170\n179565,943\n179566,740\n179566,741\n179567,2784\n179568,1001\n179568,1474\n179569,65\n179569,493\n179569,586\n179570,147\n179571,179170\n179572,2735\n179573,841\n179574,1821\n179575,167\n179575,73570\n179576,1453\n179577,179578\n179579,1132\n179580,30\n179582,2574\n179583,872\n179585,704\n179586,2506\n179587,94\n179587,1235\n179587,1335\n179587,2787\n179588,2750\n179589,900\n179590,424\n179591,179170\n179592,179170\n179593,179170\n179594,333\n179595,179596\n179597,179170\n179598,179170\n179599,179170\n179600,3161\n179601,485\n179602,298\n179603,137\n179604,179170\n179605,393\n179606,30\n179607,602\n179608,58\n179609,994\n179610,46\n179611,1769\n179612,779\n179613,6068\n179614,355\n179616,58\n179617,994\n179618,46\n179619,337\n179619,360\n179620,313\n179621,313\n179622,3769\n179624,422\n179625,56\n179626,211\n179627,79\n179627,192\n179629,2083\n179630,312\n179631,1238\n179632,422\n179633,56\n179634,15748\n179635,202\n179636,392\n179636,872\n179636,1151\n179636,1836\n179637,602\n179638,83\n179639,818\n179640,22\n179641,68\n179641,3328\n179642,1452\n179643,893\n179644,340\n179644,668\n179645,422\n179646,56\n179647,1579\n179648,179170\n179649,2784\n179650,726\n179650,3507\n179651,2048\n179653,179170\n179655,23011\n179656,140\n179657,1181\n179658,179659\n179660,269\n179661,179170\n179662,179170\n179663,79\n179664,2867\n179664,2868\n179665,652\n179666,1381\n179667,1284\n179668,571\n179669,179170\n179670,30\n179672,366\n179673,211\n179673,315\n179673,788\n179673,861\n179674,843\n179675,138686\n179676,175\n179677,179170\n179678,222\n179679,422\n179680,991\n179681,422\n179682,422\n179683,422\n179684,422\n179685,422\n179686,422\n179687,56\n179688,422\n179689,1608\n179690,422\n179691,1132\n179692,422\n179694,422\n179695,422\n179696,422\n179697,422\n179698,422\n179699,6556\n179700,991\n179701,422\n179702,1309\n179703,920\n179705,1608\n179706,1132\n179707,72\n179707,1465\n179707,221828\n179708,406\n179708,779\n179708,102560\n179709,1019\n179710,467\n179711,1147\n179712,151\n179713,337\n179713,920\n179713,1877\n179714,493\n179715,433\n179716,278\n179716,455\n179716,536\n179716,1019\n179716,2424\n179717,269\n179718,79\n179719,920\n179720,4611\n179722,120\n179723,1949\n179723,2699\n179723,6059\n179724,1345\n179725,1113\n179725,1313\n179725,1381\n179726,440\n179727,215\n179727,2210\n179727,4237\n179728,2737\n179730,525\n179731,215\n179732,1096\n179733,138686\n179734,175\n179735,1105\n179736,1274\n179737,422\n179738,56\n179739,1116\n179739,1332\n179739,1844\n179740,3623\n179741,422\n179742,56\n179745,640\n179747,1449\n179748,422\n179749,56\n179751,1172\n179752,563\n179753,1858\n179754,1860\n179755,2506\n179756,179170\n179757,4571\n179758,875\n179759,179170\n179760,652\n179761,179170\n179762,366\n179763,1837\n179764,54\n179765,240\n179766,422\n179767,56\n179768,893\n179769,841\n179770,79\n179771,422\n179772,56\n179773,1172\n179775,192\n179775,1089\n179776,285\n179777,134\n179777,248\n179778,272\n179779,179170\n179780,663\n179781,1033\n179782,179170\n179783,1326\n179784,55849\n179785,337\n179785,346\n179785,393\n179785,439\n179785,447\n179785,671\n179785,726\n179785,934\n179785,980\n179785,1033\n179785,1175\n179785,1181\n179785,1294\n179785,1531\n179785,1590\n179785,4455\n179786,272\n179787,1087\n179788,179170\n179790,422\n179791,56\n179792,13661\n179793,167\n179793,447\n179793,671\n179793,968\n179793,1033\n179793,1590\n179793,2557\n179793,2620\n179793,2979\n179794,1616\n179795,652\n179796,602\n179798,1962\n179799,500\n179800,1882\n179801,2775\n179802,54\n179803,1052\n179804,240\n179804,397\n179804,631\n179804,676\n179804,818\n179804,1663\n179804,1853\n179804,13637\n179804,127158\n179804,146001\n179804,161534\n179804,198668\n179804,253226\n179804,254471\n179805,652\n179806,138686\n179807,623\n179808,349\n179809,175\n179810,1033\n179810,1175\n179811,79\n179812,349\n179813,179814\n179815,179814\n179816,179814\n179817,142430\n179817,142473\n179817,142879\n179818,302\n179819,3695\n179820,83\n179821,2784\n179822,158\n179823,439\n179824,217\n179825,30\n179826,55849\n179827,30\n179828,179170\n179830,22\n179831,788\n179832,302\n179833,4611\n179835,1284\n179836,1893\n179837,861\n179840,83\n179841,30\n179842,83\n179843,55849\n179844,1769\n179845,349\n179846,2083\n179847,30\n179848,272\n179849,8822\n179852,1608\n179853,30\n179854,30\n179855,146\n179855,92476\n179856,647\n179856,30331\n179857,704\n179858,843\n179859,138686\n179861,175\n179862,2244\n179862,4637\n179862,207424\n179864,34\n179864,35\n179864,192\n179864,779\n179864,949\n179864,1608\n179866,1240\n179867,106\n179867,6119\n179868,1893\n179869,2205\n179869,33424\n179870,22\n179871,1010\n179873,536\n179873,2083\n179874,9028\n179875,302\n179876,417\n179876,1635\n179877,1631\n179878,179170\n179879,22\n179880,861\n179882,179170\n179883,1454\n179884,1010\n179885,56\n179886,422\n179887,1688\n179888,179170\n179889,515\n179890,968\n179891,3623\n179892,3623\n179893,3623\n179894,195\n179895,435\n179896,83\n179897,652\n179898,671\n179899,4571\n179900,1882\n179902,2334\n179903,310\n179904,515\n179906,179170\n179907,843\n179908,392\n179909,137\n179910,22\n179911,151\n179912,55849\n179913,1326\n179914,408\n179915,102\n179916,1323\n179917,179170\n179918,634\n179919,179170\n179920,302\n179921,149\n179921,158\n179921,285\n179921,406\n179921,779\n179921,1181\n179921,1515\n179922,179923\n179924,179170\n179925,1085\n179926,179170\n179927,663\n179928,1511\n179928,3069\n179929,1955\n179930,872\n179931,875\n179932,3623\n179933,179170\n179934,349\n179934,452\n179934,770\n179934,784\n179934,1363\n179935,406\n179936,1608\n179938,60576\n179939,1167\n179941,1132\n179942,781\n179944,179170\n179945,179170\n179946,151\n179947,217\n179947,392\n179948,818\n179949,179950\n179951,179170\n179952,861\n179953,1370\n179954,1452\n179955,1167\n179956,3138\n179957,86\n179958,605\n179959,3193\n179960,1782\n179961,1241\n179962,2191\n179963,1544\n179964,968\n179965,1381\n179966,5718\n179967,720\n179968,2557\n179969,3999\n179970,5662\n179971,2620\n179972,1522\n179973,1231\n179974,3422\n179975,2979\n179976,1564\n179977,1837\n179978,2083\n179979,3218\n179980,1298\n179981,1289\n179982,301\n179983,388\n179984,1359\n179985,907\n179986,3194\n179987,3207\n179988,179170\n179989,718\n179990,1167\n179991,179170\n179992,179170\n179994,1893\n179995,704\n179996,272\n179997,4549\n179998,1551\n179999,622\n180000,309\n180000,310\n180001,55849\n180002,34\n180002,35\n180002,313\n180002,634\n180002,1313\n180002,1718\n180002,1955\n180002,2224\n180002,2646\n180003,302\n180003,687\n180003,861\n180003,2116\n180004,179170\n180005,272\n180006,34\n180006,35\n180006,313\n180006,2646\n180006,5326\n180007,1474\n180008,483\n180010,79\n180010,1135\n180011,704\n180012,179170\n180013,202\n180014,302\n180015,1801\n180015,3182\n180016,272\n180017,180018\n180017,254669\n180019,138686\n180020,5906\n180021,557\n180022,626\n180023,278\n180024,137\n180025,862\n180026,135\n180027,83\n180028,192\n180029,140020\n180030,577\n180031,309\n180031,310\n180033,393\n180034,536\n180035,873\n180036,536\n180036,1881\n180036,2944\n180037,211\n180038,1479\n180039,217\n180040,179170\n180041,179170\n180042,83\n180043,1579\n180044,179170\n180045,222\n180046,1127\n180047,179170\n180048,179170\n180049,179170\n180050,3422\n180051,179170\n180052,7429\n180053,920\n180054,872\n180055,450\n180056,179170\n180057,179170\n180058,779\n180059,179170\n180060,179170\n180061,179170\n180062,10\n180063,30\n180064,180065\n180066,30\n180067,422\n180068,56\n180069,83\n180069,222\n180070,1001\n180071,30\n180072,179170\n180073,563\n180074,179170\n180075,516\n180076,1285\n180077,83\n180078,30\n180079,818\n180080,1821\n180081,55849\n180082,861\n180083,588\n180083,590\n180083,1419\n180084,30\n180085,2750\n180086,310\n180087,2373\n180088,6303\n180089,179170\n180090,179170\n180091,3\n180092,247\n180092,2867\n180092,2868\n180093,217\n180094,179170\n180095,120\n180096,2620\n180097,180098\n180099,83\n180100,784\n180101,1659\n180102,292\n180102,1388\n180103,55849\n180105,704\n180106,285\n180107,250\n180107,1684\n180108,163\n180109,920\n180110,180111\n180112,56\n180113,422\n180114,1556\n180115,167\n180116,30\n180117,240\n180119,179170\n180120,179170\n180121,225\n180121,248\n180122,179170\n180123,1014\n180124,1014\n180125,1014\n180126,1014\n180127,22\n180128,1014\n180129,1634\n180130,179170\n180131,852\n180132,179170\n180133,285\n180134,54\n180135,250\n180135,1684\n180136,668\n180137,1014\n180138,179170\n180139,2697\n180140,5718\n180141,671\n180142,179170\n180143,1132\n180144,107\n180145,1227\n180145,86416\n180146,179170\n180147,179170\n180148,2775\n180149,447\n180150,536\n180151,640\n180152,289\n180152,290\n180152,94134\n180153,269\n180154,179170\n180155,179170\n180156,634\n180157,179170\n180158,179170\n180159,332\n180159,356\n180160,44\n180161,179170\n180162,179170\n180163,179170\n180164,217\n180164,536\n180164,577\n180164,1429\n180164,1608\n180165,179170\n180166,179170\n180167,602\n180168,179170\n180169,179170\n180170,269\n180171,56\n180172,422\n180173,179170\n180174,180175\n180176,304\n180177,65\n180178,180179\n180180,602\n180181,179170\n180182,179170\n180183,862\n180183,2590\n180184,704\n180185,34\n180185,35\n180185,111\n180185,217\n180185,261\n180185,283\n180185,323\n180185,388\n180185,392\n180185,455\n180185,536\n180185,577\n180185,623\n180185,949\n180185,1105\n180185,1201\n180185,1274\n180185,1564\n180185,1608\n180185,1722\n180185,2045\n180185,2266\n180185,2274\n180185,2671\n180185,2784\n180185,4594\n180185,4637\n180185,7092\n180185,13546\n180185,14126\n180186,31977\n180187,147\n180187,158\n180187,175\n180187,1181\n180187,1515\n180188,30\n180189,602\n180190,2367\n180191,1474\n180192,54\n180193,392\n180193,1893\n180194,602\n180195,932\n180196,1414\n180197,255\n180198,304\n180199,151\n180200,1773\n180201,1085\n180202,10\n180203,138686\n180204,175\n180205,366\n180206,581\n180207,366\n180208,366\n180209,180210\n180211,366\n180212,873\n180213,247\n180214,355\n180215,671\n180216,893\n180217,346\n180218,717\n180218,1782\n180219,1556\n180220,872\n180221,868\n180222,442\n180225,2590\n180227,8714\n180228,179170\n180229,127158\n180230,83\n180231,893\n180232,602\n180234,179170\n180235,147\n180236,640\n180237,2116\n180238,247\n180239,718\n180240,775\n180241,167\n180241,240\n180241,301\n180241,592\n180241,1564\n180241,1818\n180241,2083\n180241,2620\n180241,5718\n180242,485\n180243,298\n180244,301\n180244,1293\n180244,127158\n180245,1893\n180246,3804\n180247,292\n180248,344\n180249,647\n180250,146\n180250,92476\n180251,2205\n180251,33424\n180252,5\n180252,94\n180252,114\n180252,117\n180252,1235\n180252,1684\n180252,2089\n180252,2712\n180252,2940\n180252,3794\n180252,13704\n180252,154690\n180253,3260\n180254,424\n180254,491\n180254,90845\n180255,485\n180255,920\n180256,267\n180257,34\n180257,35\n180257,217\n180257,283\n180257,313\n180257,379\n180257,577\n180257,623\n180257,949\n180257,1274\n180257,1429\n180257,1608\n180257,2266\n180257,2274\n180257,2784\n180257,2989\n180257,2991\n180257,3135\n180257,3252\n180257,7092\n180257,13546\n180257,14126\n180258,30\n180259,83\n180260,673\n180261,337\n180262,718\n180263,217\n180264,142433\n180266,58\n180267,994\n180268,46\n180269,2915\n180270,1962\n180271,3\n180272,503\n180273,10\n180274,2146\n180275,1241\n180276,957\n180276,1815\n180277,609\n180277,2775\n180277,3115\n180277,3623\n180278,6556\n180279,179170\n180280,1983\n180282,287\n180282,809\n180283,485\n180284,298\n180285,138686\n180287,3507\n180288,175\n180289,171\n180290,485\n180291,298\n180292,200\n180293,602\n180294,671\n180295,467\n180296,920\n180297,298\n180298,485\n180299,602\n180300,1021\n180301,72811\n180302,1151\n180303,1837\n180304,1888\n180306,1\n180307,1858\n180308,1860\n180310,602\n180311,602\n180312,1858\n180313,1860\n180314,1414\n180315,63\n180316,420\n180316,1653\n180316,1722\n180316,3538\n180316,3830\n180317,179170\n180318,179170\n180319,1616\n180320,1363\n180322,602\n180323,392\n180324,1326\n180325,1858\n180326,1860\n180328,859\n180329,338\n180331,160\n180332,240\n180333,2735\n180334,1326\n180335,160\n180336,1803\n180336,21442\n180337,1860\n180338,1858\n180339,518\n180341,124668\n180342,336\n180342,406\n180343,602\n180343,4866\n180344,611\n180345,151\n180346,120\n180346,1860\n180347,156379\n180349,349\n180349,392\n180350,1749\n180351,602\n180352,2209\n180353,3\n180354,298\n180355,485\n180356,356\n180358,673\n180359,81\n180360,893\n180361,442\n180362,455\n180363,140\n180364,55849\n180365,1167\n180366,1773\n180367,1425\n180368,179170\n180369,994\n180370,179170\n180371,30\n180372,10\n180373,298\n180374,485\n180375,718\n180376,146\n180376,1515\n180376,92476\n180377,1\n180377,1294\n180379,58\n180380,994\n180381,46\n180382,1381\n180383,392\n180384,217\n180385,48\n180386,1388\n180387,893\n180387,3769\n180388,500\n180389,843\n180390,104\n180391,868\n180393,179170\n180394,2923\n180395,779\n180396,2367\n180397,1436\n180397,30623\n180397,181073\n180397,186667\n180397,192018\n180397,192019\n180398,557\n180399,623\n180400,344\n180401,146\n180401,92476\n180402,647\n180403,347\n180404,652\n180405,599\n180406,298\n180407,485\n180408,2506\n180409,83\n180410,1191\n180411,795\n180412,3804\n180413,104\n180414,5405\n180415,180416\n180417,1140\n180418,215\n180419,227\n180420,3695\n180421,2701\n180422,1016\n180423,328\n180424,1722\n180425,1010\n180426,1849\n180427,801\n180428,358\n180429,111\n180430,383\n180431,1052\n180432,2443\n180433,1332\n180434,72\n180435,1939\n180436,3538\n180437,248\n180438,525\n180439,1001\n180440,1564\n180441,3193\n180442,1882\n180443,1955\n180444,1177\n180445,850\n180446,9001\n180447,1282\n180448,714\n180449,136\n180450,9029\n180451,312\n180452,4771\n180453,1572\n180454,1745\n180455,3474\n180456,932\n180457,2205\n180457,33424\n180458,7270\n180459,503\n180460,3612\n180461,225\n180463,602\n180464,1881\n180465,818\n180466,30\n180467,1359\n180468,22\n180469,180470\n180471,83\n180472,1688\n180473,918\n180474,315\n180475,1608\n180476,1132\n180477,707\n180478,179170\n180479,264\n180480,1849\n180481,344\n180482,647\n180483,146\n180483,92476\n180484,179170\n180485,918\n180486,55849\n180487,1\n180487,99\n180487,175\n180487,333\n180487,406\n180487,620\n180487,24835\n180487,87799\n180487,102560\n180487,118336\n180487,118904\n180487,123797\n180487,189839\n180487,199529\n180487,231813\n180488,179170\n180489,973\n180490,1740\n180491,1220\n180491,1222\n180492,516\n180493,252\n180494,515\n180495,120\n180496,283\n180497,859\n180498,592\n180498,1572\n180500,138686\n180501,175\n180502,1467\n180503,406\n180504,602\n180505,179170\n180506,636\n180507,1238\n180508,179170\n180509,1837\n180510,4594\n180511,6955\n180512,919\n180513,602\n180514,55849\n180515,30\n180516,1452\n180517,9098\n180518,7572\n180519,160\n180520,893\n180521,1805\n180522,55849\n180523,30\n180524,1240\n180525,4594\n180526,30\n180527,3804\n180529,144962\n180529,218758\n180530,179170\n180531,73570\n180532,30\n180533,623\n180534,9098\n180535,602\n180536,158\n180537,447\n180538,2775\n180539,151\n180540,30\n180541,309\n180541,310\n180542,30\n180543,2697\n180544,1522\n180545,269\n180546,180547\n180548,179170\n180549,200\n180549,1368\n180550,30\n180551,301\n180551,444\n180551,968\n180552,202\n180553,344\n180554,146\n180554,92476\n180555,647\n180556,571\n180558,3623\n180559,179170\n180560,302\n180561,875\n180562,364\n180563,179170\n180564,179170\n180565,479\n180566,179170\n180567,179170\n180568,179170\n180569,861\n180570,3830\n180571,875\n180572,179170\n180573,179170\n180574,179170\n180575,602\n180576,602\n180577,289\n180577,290\n180577,94134\n180578,3467\n180579,3623\n180580,875\n180581,179170\n180582,179170\n180583,178576\n180584,602\n180585,875\n180586,179170\n180587,179170\n180588,151\n180589,602\n180590,179170\n180591,3623\n180592,875\n180593,58\n180594,994\n180595,46\n180596,2590\n180597,328\n180598,3623\n180599,875\n180600,1860\n180601,1858\n180602,298\n180603,3623\n180604,3623\n180605,872\n180606,2697\n180607,393\n180608,23783\n180609,167\n180609,2372\n180609,2979\n180610,111\n180610,3538\n180611,179170\n180612,72\n180613,1127\n180614,179170\n180615,313\n180616,120\n180617,932\n180618,179170\n180619,1359\n180620,179170\n180621,1241\n180622,179170\n180623,557\n180625,179170\n180626,1612\n180627,3623\n180628,875\n180629,179170\n180630,30\n180631,949\n180632,30\n180633,1353\n180634,179170\n180635,435\n180636,358\n180637,179170\n180638,577\n180639,179170\n180640,1390\n180641,179170\n180642,557\n180643,83\n180644,862\n180645,843\n180646,83\n180647,30\n180648,179170\n180649,4594\n180650,30\n180651,179170\n180652,179170\n180653,48\n180653,1298\n180654,179170\n180655,99\n180656,179170\n180657,3\n180658,30\n180659,366\n180660,2373\n180661,663\n180662,668\n180663,292\n180664,14819\n180665,994\n180666,2697\n180667,179170\n180668,1014\n180669,180670\n180671,180672\n180673,563\n180674,255\n180675,875\n180676,1381\n180677,179170\n180678,1014\n180679,180680\n180681,2116\n180682,1014\n180683,1289\n180684,467\n180684,21442\n180685,1014\n180686,577\n180687,180688\n180689,1849\n180690,1014\n180691,1014\n180692,1849\n180693,179170\n180694,34\n180694,35\n180695,107\n180696,179170\n180697,179170\n180698,179170\n180699,1571\n180700,1474\n180701,1188\n180702,306\n180702,307\n180703,23783\n180704,1305\n180705,294\n180706,483\n180707,347\n180708,285\n180709,5265\n180711,38634\n180712,179170\n180713,179170\n180714,175\n180715,1235\n180715,1335\n180716,1515\n180717,841\n180718,179170\n180719,991\n180720,304\n180721,2697\n180722,184\n180723,1\n180724,179170\n180725,179170\n180726,1511\n180726,3069\n180727,179170\n180728,77\n180729,180730\n180731,151\n180731,663\n180732,8854\n180733,180734\n180735,872\n180736,602\n180737,602\n180738,602\n180739,602\n180740,2590\n180741,2697\n180742,180743\n180744,4237\n180745,44\n180747,30\n180748,179170\n180749,179170\n180750,267\n180751,179170\n180752,151\n180753,179170\n180754,30\n180755,2506\n180756,2697\n180757,179170\n180758,805\n180759,2697\n180760,179170\n180761,179170\n180762,1773\n180763,179170\n180764,207\n180765,180766\n180767,1381\n180768,30\n180769,2697\n180770,180771\n180772,180771\n180773,1001\n180774,861\n180775,312\n180776,217\n180777,217\n180777,1429\n180778,872\n180779,779\n180780,1417\n180781,179170\n180782,179170\n180783,30\n180784,2697\n180785,179170\n180786,2697\n180787,179170\n180788,179170\n180789,900\n180790,30\n180791,872\n180792,23011\n180793,1429\n180794,289\n180794,290\n180794,94134\n180795,2697\n180796,83\n180797,668\n180798,269\n180799,2697\n180800,255\n180801,2697\n180802,424\n180803,304\n180804,87\n180804,392\n180804,1722\n180805,1143\n180806,87\n180806,392\n180806,1722\n180807,30\n180808,392\n180809,2697\n180810,179170\n180811,392\n180812,2697\n180813,37\n180813,390\n180813,35486\n180814,366\n180815,366\n180816,366\n180817,4691\n180818,87\n180818,392\n180818,191860\n180819,87\n180819,392\n180819,1722\n180820,392\n180821,1893\n180822,2312\n180823,145240\n180824,179170\n180825,179170\n180826,180827\n180828,87\n180828,392\n180828,1722\n180829,87\n180829,392\n180829,1722\n180830,20\n180830,222\n180830,1210\n180830,1467\n180830,1564\n180830,142473\n180831,1634\n180832,87\n180832,392\n180832,1722\n180833,87\n180833,392\n180833,1722\n180834,2697\n180835,872\n180836,1238\n180837,1522\n180838,87\n180838,392\n180838,1722\n180839,167\n180840,2260\n180841,2697\n180842,83\n180843,87\n180843,392\n180843,1722\n180844,180845\n180846,2775\n180847,447\n180849,209\n180850,87\n180850,392\n180850,1722\n180851,87\n180851,392\n180851,1722\n180852,2697\n180853,1571\n180855,1452\n180857,422\n180858,422\n180859,422\n180860,422\n180861,422\n180862,422\n180863,422\n180864,422\n180865,87\n180865,392\n180865,1722\n180866,422\n180867,422\n180868,422\n180869,422\n180870,422\n180871,3623\n180872,422\n180873,422\n180874,647\n180875,602\n180876,422\n180877,422\n180878,422\n180879,422\n180880,179170\n180881,422\n180882,422\n180883,30\n180884,422\n180885,422\n180886,87\n180886,392\n180886,1722\n180887,422\n180888,422\n180889,310\n180889,579\n180889,3039\n180890,309\n180890,310\n180891,32\n180891,392\n180891,697\n180892,712\n180893,3623\n180894,87\n180894,392\n180894,1722\n180895,151\n180896,1544\n180897,179170\n180898,87\n180898,392\n180898,595\n180898,1722\n180899,200\n180901,87\n180901,392\n180902,302\n180902,622\n180902,861\n180902,893\n180903,298\n180904,485\n180905,30\n180906,3623\n180907,2697\n180908,217\n180909,298\n180910,485\n180911,872\n180912,87\n180912,392\n180913,1132\n180914,1608\n180915,1274\n180917,1359\n180918,195\n180919,338\n180920,392\n180920,2697\n180921,179170\n180922,442\n180923,861\n180923,2017\n180924,23783\n180925,1858\n180926,1860\n180927,652\n180928,467\n180929,920\n180930,925\n180931,328\n180932,392\n180933,485\n180934,298\n180935,1985\n180936,6068\n180936,75912\n180937,2697\n180938,346\n180938,1294\n180938,190492\n180940,1143\n180941,1718\n180942,138686\n180943,175\n180945,640\n180946,640\n180947,2083\n180948,2671\n180949,640\n180950,37\n180951,1116\n180952,180953\n180954,41\n180954,134\n180954,431\n180954,636\n180954,784\n180954,1001\n180954,1016\n180954,1462\n180954,1608\n180954,8537\n180955,1181\n180957,589\n180957,972\n180957,1326\n180958,55849\n180959,302\n180960,2775\n180962,392\n180962,875\n180962,1363\n180962,1836\n180962,3260\n180963,1860\n180964,1749\n180966,652\n180967,447\n180968,2775\n180970,868\n180970,162599\n180971,115659\n180972,714\n180973,179170\n180974,2697\n180975,2697\n180976,192\n180977,783\n180979,333\n180979,60576\n180980,1252\n180980,1253\n180981,500\n180982,2083\n180983,690\n180984,843\n180985,240\n180986,37\n180986,56\n180986,1116\n180986,1566\n180989,1522\n180990,107\n180991,167\n180991,2083\n180991,73570\n180992,314\n180992,516\n180992,920\n180992,1089\n180992,127158\n180993,571\n180994,10\n180995,2146\n180996,459\n180997,447\n180998,2775\n180999,1204\n180999,1434\n181001,1414\n181002,1659\n181003,1033\n181004,442\n181004,1058\n181004,1140\n181004,1688\n181004,3367\n181004,3804\n181005,72\n181006,344\n181007,285\n181008,2697\n181009,775\n181010,718\n181011,305\n181012,187\n181013,360\n181014,338\n181015,647\n181016,841\n181017,145240\n181018,1300\n181020,818\n181021,73570\n181022,240\n181023,2697\n181024,668\n181024,698\n181024,2744\n181025,360\n181026,10\n181027,694\n181028,301\n181028,937\n181028,1580\n181028,3422\n181028,103860\n181029,217\n181030,240\n181031,73570\n181033,83\n181033,536\n181034,30\n181035,298\n181036,485\n181037,1285\n181038,179170\n181040,868\n181041,83\n181041,1274\n181042,918\n181043,158\n181043,862\n181044,932\n181045,50\n181046,158\n181047,2931\n181048,1985\n181049,1821\n181050,406\n181051,1289\n181052,269\n181053,30\n181055,393\n181056,104\n181057,2697\n181058,2367\n181058,4146\n181059,147\n181059,158\n181060,3623\n181061,4146\n181062,338\n181063,536\n181063,818\n181063,2159\n181063,2944\n181063,3377\n181063,7109\n181063,7698\n181063,7768\n181063,13137\n181063,23287\n181063,28353\n181063,113003\n181063,115474\n181063,182035\n181063,188791\n181063,191966\n181063,195507\n181063,199637\n181063,207659\n181063,212914\n181063,220947\n181065,1359\n181066,179170\n181067,3623\n181068,918\n181069,30\n181070,179170\n181071,92476\n181072,92476\n181074,151\n181075,140\n181075,515\n181075,1052\n181075,1127\n181075,1579\n181075,1639\n181075,1893\n181075,2312\n181076,1267\n181078,704\n181080,179170\n181081,1949\n181081,3182\n181082,147\n181083,631\n181083,862\n181084,2697\n181085,73570\n181086,179170\n181087,330\n181088,809\n181089,442\n181091,2697\n181092,2697\n181093,442\n181094,693\n181097,30\n181098,3474\n181099,179170\n181100,179170\n181101,1722\n181102,179170\n181103,181104\n181105,2697\n181107,9457\n181108,626\n181108,647\n181108,726\n181108,827\n181108,1058\n181108,1309\n181108,1313\n181108,3474\n181109,30\n181110,73570\n181111,3623\n181112,179170\n181113,779\n181114,2697\n181116,3623\n181117,515\n181118,247\n181119,30\n181120,73570\n181121,907\n181122,660\n181123,179170\n181124,181125\n181126,179170\n181127,72\n181128,285\n181129,344\n181130,68\n181130,2620\n181130,4218\n181130,4220\n181130,66297\n181131,2590\n181132,179170\n181133,171\n181134,247\n181135,772\n181136,118\n181136,652\n181136,1266\n181136,25348\n181137,622\n181138,23701\n181139,1326\n181140,102\n181141,408\n181142,1323\n181143,151\n181144,2779\n181145,973\n181145,1298\n181145,1749\n181145,2605\n181146,179170\n181147,179170\n181148,179170\n181149,355\n181150,147\n181151,3585\n181152,30\n181153,2697\n181154,2697\n181155,151\n181156,2697\n181157,179170\n181158,2697\n181159,312\n181160,2697\n181161,83\n181162,158\n181163,149\n181163,406\n181164,179170\n181165,87\n181166,2697\n181167,2697\n181168,1181\n181169,181170\n181171,30\n181172,302\n181173,179170\n181174,151\n181175,2697\n181176,588\n181176,590\n181177,179170\n181178,140\n181179,179170\n181180,179170\n181181,179170\n181182,2697\n181184,3297\n181184,55585\n181185,30\n181186,179170\n181187,104\n181187,75912\n181188,2697\n181189,179170\n181190,3538\n181191,485\n181192,298\n181193,720\n181193,907\n181193,1117\n181193,1715\n181194,1181\n181195,179170\n181196,3182\n181197,304\n181198,179170\n181199,302\n181200,179170\n181201,179170\n181202,151\n181203,1167\n181204,55849\n181205,408\n181206,861\n181207,179170\n181208,1776\n181209,179170\n181210,147\n181211,1432\n181212,179170\n181213,138\n181214,865\n181215,557\n181216,137\n181217,118\n181217,4597\n181218,88820\n181219,179170\n181220,179170\n181221,717\n181222,4172\n181223,1363\n181224,8855\n181225,86\n181226,1749\n181227,160\n181228,302\n181229,949\n181230,809\n181231,868\n181233,861\n181234,1359\n181235,179170\n181236,588\n181236,590\n181236,640\n181236,1285\n181236,1634\n181236,2048\n181236,7360\n181237,30\n181238,134\n181239,179170\n181240,1509\n181241,557\n181242,155481\n181243,179170\n181244,30\n181245,179170\n181246,179170\n181247,1707\n181249,557\n181253,179170\n181254,333\n181254,1893\n181255,557\n181256,179170\n181257,333\n181258,179170\n181259,30\n181260,147\n181260,158\n181261,1313\n181262,577\n181263,55849\n181264,179170\n181265,30\n181266,79\n181267,179170\n181268,515\n181269,179170\n181270,179170\n181271,68\n181271,2590\n181272,932\n181273,179170\n181274,332\n181275,1\n181276,30\n181277,222\n181278,30\n181279,73570\n181280,179170\n181281,269\n181282,1014\n181283,1014\n181284,1014\n181285,788\n181286,483\n181287,1014\n181288,147\n181288,158\n181288,2244\n181289,1014\n181290,167\n181292,72\n181293,328\n181294,138686\n181296,175\n181297,1474\n181298,358\n181299,4237\n181299,182162\n181300,179170\n181301,1177\n181302,179170\n181303,79\n181304,179170\n181305,83\n181306,30\n181307,179170\n181308,179170\n181309,179170\n181311,2697\n181312,1179\n181312,2923\n181312,3695\n181313,181314\n181315,640\n181316,83\n181317,179170\n181318,140269\n181318,206059\n181319,422\n181320,422\n181321,422\n181322,195\n181323,422\n181324,422\n181325,422\n181326,422\n181327,422\n181328,422\n181329,422\n181330,406\n181331,422\n181332,181333\n181334,422\n181335,56\n181336,44\n181338,250\n181338,1684\n181339,285\n181340,1385\n181341,285\n181342,113156\n181343,250\n181343,1684\n181344,13\n181345,83\n181346,1722\n181347,72\n181348,72\n181349,179170\n181350,181351\n181352,147\n181353,30\n181354,2116\n181355,72\n181356,30\n181357,2697\n181358,30\n181359,225\n181360,30\n181361,920\n181362,72\n181364,862\n181365,181366\n181367,8884\n181368,2697\n181369,1085\n181370,181371\n181372,72\n181373,72\n181374,2697\n181375,1551\n181376,2506\n181377,577\n181378,30\n181379,30\n181380,355\n181381,366\n181382,366\n181383,366\n181384,366\n181385,181386\n181387,72\n181388,424\n181389,510\n181391,83\n181392,333\n181393,2697\n181394,1559\n181395,346\n181396,179170\n181397,181398\n181399,1370\n181400,1220\n181400,1222\n181401,516\n181402,252\n181403,179170\n181404,179170\n181405,179170\n181406,179170\n181407,181408\n181409,179170\n181410,3623\n181411,1132\n181412,781\n181413,13\n181414,138686\n181415,175\n181416,192\n181416,435\n181417,264\n181417,994\n181417,1659\n181417,2979\n181418,2590\n181420,72\n181421,310\n181422,181423\n181424,147\n181424,158\n181425,72\n181427,181428\n181429,179170\n181430,207\n181431,167\n181432,181433\n181434,918\n181436,2506\n181437,181438\n181440,158\n181441,1305\n181442,179170\n181443,179170\n181444,1149\n181445,3\n181446,3507\n181447,30\n181448,30\n181449,2701\n181450,483\n181451,178739\n181451,181451\n181452,668\n181453,628\n181454,72\n181455,718\n181457,872\n181459,181460\n181461,8270\n181462,118\n181462,422\n181462,4597\n181462,5405\n181463,138686\n181464,175\n181465,301\n181466,72\n181467,4571\n181468,1429\n181469,640\n181470,3756\n181471,1449\n181472,217\n181473,179170\n181474,179170\n181475,179170\n181477,181478\n181479,179170\n181480,932\n181481,1479\n181482,390\n181483,919\n181484,68\n181485,179170\n181487,181488\n181489,23783\n181490,147191\n181491,181492\n181491,203777\n181493,96284\n181494,179170\n181495,1179\n181496,1143\n181497,137\n181498,195\n181500,179170\n181501,417\n181503,175\n181504,72\n181506,181507\n181508,179170\n181509,181510\n181511,704\n181512,179170\n181513,333\n181514,1326\n181515,72\n181516,15068\n181517,181518\n181519,30\n181520,17228\n181520,23011\n181521,181522\n181523,181524\n181525,179170\n181526,1\n181527,179170\n181528,8270\n181529,179170\n181530,167\n181530,299\n181530,397\n181530,2083\n181531,355\n181532,107\n181533,2416\n181533,2417\n181534,292\n181535,338\n181536,298\n181537,704\n181538,704\n181539,1133\n181540,3538\n181541,255\n181542,207\n181543,181544\n181545,366\n181546,366\n181547,366\n181548,366\n181550,179170\n181551,79\n181552,10\n181553,4545\n181553,56150\n181554,163\n181555,779\n181556,58\n181558,586\n181558,1985\n181559,202\n181560,333\n181560,779\n181561,602\n181562,694\n181563,240\n181564,749\n181564,788\n181566,4192\n181566,4193\n181568,179170\n181569,1927\n181570,181571\n181572,442\n181573,784\n181574,1149\n181575,264\n181576,4691\n181577,4691\n181578,181579\n181580,1572\n181581,240\n181582,30\n181583,30\n181584,433\n181585,440\n181586,2334\n181587,181588\n181589,72\n181591,1608\n181592,3474\n181593,333\n181593,2782\n181593,2931\n181593,3872\n181594,138686\n181595,358\n181596,175\n181597,4571\n181598,65\n181599,439\n181600,181601\n181602,366\n181603,509\n181605,577\n181606,83\n181607,30\n181608,440\n181609,1452\n181610,181611\n181612,372\n181613,30\n181614,30\n181615,309\n181615,310\n181616,440\n181617,1564\n181618,1\n181619,1127\n181620,557\n181621,557\n181622,557\n181623,1014\n181624,1014\n181626,623\n181627,602\n181628,99\n181629,298\n181630,30\n181633,760\n181634,1927\n181635,1014\n181636,1769\n181637,1434\n181638,30\n181639,146\n181639,92476\n181640,647\n181641,344\n181642,30\n181644,181645\n181644,195958\n181644,206941\n181644,223093\n181644,255130\n181646,1014\n181647,1257\n181648,1634\n181649,1962\n181650,179170\n181651,932\n181652,30\n181653,142473\n181654,107\n181655,56\n181655,63\n181655,147\n181655,149\n181655,247\n181656,56\n181657,79\n181658,158\n181658,252\n181659,72\n181660,1220\n181660,1222\n181661,252\n181662,516\n181663,181664\n181665,647\n181666,146\n181666,92476\n181667,344\n181668,2443\n181669,30236\n181670,56\n181671,30\n181672,30\n181673,30\n181674,30\n181675,3\n181675,510\n181677,30\n181678,179170\n181679,179170\n181680,30\n181681,179170\n181682,2506\n181683,179170\n181684,179170\n181685,292\n181686,294\n181687,296\n181688,393\n181689,298\n181690,179170\n181691,1608\n181692,179170\n181693,147\n181694,671\n181695,184\n181696,179170\n181697,1149\n181698,83\n181699,620\n181700,30\n181701,346\n181702,181703\n181704,406\n181705,179170\n181706,179170\n181707,861\n181708,179170\n181709,195\n181709,215874\n181710,306\n181710,307\n181711,179170\n181712,355\n181713,779\n181714,1515\n181715,366\n181716,366\n181717,366\n181718,366\n181719,366\n181720,366\n181721,309\n181721,310\n181722,1634\n181723,595\n181723,1572\n181724,1058\n181725,56\n181726,422\n181727,1381\n181727,1551\n181730,718\n181732,107\n181733,1238\n181735,179170\n181736,146\n181736,92476\n181737,647\n181738,344\n181739,1452\n181740,527\n181741,356\n181742,83\n181743,356\n181744,422\n181745,56\n181746,356\n181747,156379\n181748,181749\n181750,872\n181750,1796\n181751,433\n181752,147\n181752,149\n181752,980\n181753,146\n181753,92476\n181754,647\n181755,344\n181756,1240\n181756,1465\n181757,862\n181758,87\n181758,392\n181758,1722\n181759,192\n181760,647\n181761,146\n181761,92476\n181762,344\n181763,718\n181764,2646\n181764,118336\n181765,615\n181766,718\n181767,872\n181768,127158\n181769,181770\n181772,1033\n181773,119\n181774,1785\n181774,33424\n181775,192\n181775,663\n181776,718\n181777,5375\n181778,136\n181779,1531\n181780,422\n181781,422\n181782,179170\n181783,1858\n181784,1860\n181785,55849\n181786,50\n181786,79\n181786,158\n181787,527\n181787,95152\n181788,694\n181789,518\n181790,192\n181790,1381\n181790,189839\n181791,422\n181792,422\n181793,422\n181794,422\n181795,422\n181796,422\n181797,422\n181798,422\n181799,422\n181803,422\n181804,527\n181805,22\n181806,50\n181806,99\n181807,181808\n181809,2867\n181809,2868\n181810,920\n181811,467\n181812,298\n181813,485\n181814,5405\n181816,138686\n181818,175\n181819,22\n181820,779\n181821,146\n181821,92476\n181822,647\n181823,344\n181824,920\n181825,156379\n181826,83\n181828,81070\n181829,222\n181830,22\n181831,21408\n181832,425\n181832,663\n181833,81070\n181834,433\n181835,968\n181835,2083\n181835,73570\n181837,1745\n181838,440\n181839,179170\n181841,41\n181841,631\n181842,2775\n181843,447\n181844,338\n181846,30\n181847,1204\n181849,302\n181849,893\n181850,179170\n181852,167\n181854,15748\n181855,1014\n181856,328\n181857,2436\n181859,302\n181860,21442\n181861,620\n181862,1132\n181863,30\n181864,2421\n181865,859\n181866,217\n181867,4637\n181868,2266\n181869,1201\n181871,181872\n181871,185786\n181871,250305\n181873,415\n181873,1143\n181873,1454\n181874,694\n181875,972\n181875,1837\n181876,406\n181877,697\n181878,30\n181879,138686\n181880,175\n181881,694\n181882,304\n181883,104\n181883,302\n181883,861\n181884,497\n181885,1147\n181886,30\n181887,843\n181888,4545\n181888,56150\n181889,1531\n181890,862\n181891,178576\n181892,1749\n181893,77\n181894,222\n181895,957\n181895,1815\n181896,21442\n181898,1058\n181899,949\n181900,843\n181901,73570\n181902,30\n181903,733\n181904,149\n181904,184\n181906,167\n181907,671\n181909,485\n181911,872\n181912,306\n181912,307\n181913,240\n181913,818\n181914,179170\n181915,3193\n181916,1515\n181917,779\n181918,503\n181919,415\n181920,1453\n181921,422\n181923,1849\n181924,217\n181925,1458\n181926,181927\n181928,589\n181929,298\n181930,485\n181931,919\n181932,126\n181933,179170\n181934,81\n181934,704\n181934,2995\n181936,298\n181937,485\n181938,843\n181939,30\n181940,2506\n181941,179170\n181943,181944\n181945,240\n181945,372\n181945,127158\n181946,1769\n181947,206\n181948,1284\n181948,148742\n181949,366\n181950,167\n181951,497\n181951,1172\n181951,2310\n181951,3967\n181952,390\n181952,996\n181952,1388\n181953,1276\n181953,2923\n181954,179170\n181955,392\n181957,252\n181958,1220\n181958,1222\n181959,516\n181960,872\n181961,301\n181963,309\n181963,310\n181964,515\n181965,302\n181966,1058\n181967,104\n181967,136\n181967,138\n181967,557\n181967,1368\n181968,181969\n181970,1983\n181971,179170\n181972,358\n181973,1860\n181974,1858\n181975,483\n181976,179170\n181977,104\n181978,1467\n181979,907\n181980,707\n181981,137\n181983,34\n181983,79\n181983,195\n181983,393\n181983,32475\n181984,30\n181984,248\n181985,302\n181985,893\n181986,1033\n181987,22\n181988,179170\n181989,536\n181991,179170\n181992,181993\n181992,182040\n181994,2620\n181995,2620\n181996,181992\n181997,146\n181997,92476\n181998,344\n181999,647\n182000,968\n182002,73570\n182003,1052\n182004,136\n182004,577\n182005,2083\n182006,312\n182007,179170\n182008,1707\n182010,32475\n182011,1544\n182012,4611\n182013,2867\n182013,2868\n182014,743\n182015,167\n182016,179170\n182017,179170\n182018,79\n182019,278\n182020,83\n182021,1\n182024,179170\n182025,179170\n182026,30\n182027,417\n182029,4678\n182030,1326\n182031,102\n182032,1323\n182033,408\n182034,918\n182037,211\n182038,861\n182039,516\n182041,1085\n182041,2083\n182042,181992\n182043,516\n182045,179170\n182046,6556\n182047,1220\n182047,1222\n182048,252\n182049,516\n182050,8798\n182051,801\n182054,269\n182055,872\n182056,302\n182057,704\n182059,179170\n182060,179170\n182061,179170\n182062,182063\n182064,433\n182065,151\n182066,179170\n182067,179170\n182068,179170\n182069,516\n182071,30\n182072,179170\n182073,179170\n182074,509\n182075,179170\n182076,861\n182077,73570\n182078,179170\n182079,179170\n182080,142870\n182081,179170\n182082,179170\n182083,179170\n182084,355\n182085,1188\n182086,2083\n182087,3623\n182088,647\n182089,146\n182089,92476\n182090,344\n182091,1298\n182092,147\n182092,158\n182093,179170\n182094,1220\n182094,1222\n182095,252\n182096,251\n182097,118\n182097,422\n182097,1608\n182097,4597\n182097,5405\n182098,179170\n182099,179170\n182100,707\n182102,182103\n182104,146\n182104,92476\n182105,647\n182106,344\n182107,994\n182108,1722\n182110,113140\n182111,160\n182112,19010\n182113,3507\n182114,71\n182115,30\n182115,200\n182116,182117\n182118,1118\n182119,302\n182120,360\n182121,861\n182122,1722\n182123,255\n182124,215\n182124,1282\n182125,83\n182126,247\n182127,179170\n182128,557\n182129,3623\n182130,1298\n182131,808\n182132,179170\n182133,140\n182134,83\n182134,278\n182135,366\n182136,406\n182137,79\n182138,575\n182139,313\n182140,41\n182141,602\n182142,433\n182143,151\n182144,358\n182145,195\n182145,206\n182145,779\n182146,417\n182147,88820\n182148,2797\n182149,179170\n182150,2006\n182151,707\n182152,1858\n182153,1860\n182154,333\n182154,1033\n182155,55849\n182156,1\n182156,1019\n182156,1313\n182157,179170\n182158,1332\n182159,30\n182160,179170\n182161,8463\n182162,137\n182162,215\n182162,457\n182162,704\n182162,714\n182162,1016\n182162,1172\n182162,1177\n182162,1257\n182162,1282\n182162,1402\n182162,1511\n182162,1572\n182162,1818\n182162,1962\n182162,2775\n182162,3069\n182162,4237\n182162,6556\n182162,19413\n182162,182162\n182162,232709\n182163,179170\n182164,179170\n182166,30\n182166,34\n182166,35\n182166,44\n182166,50\n182166,79\n182166,104\n182166,106\n182166,116\n182166,146\n182166,147\n182166,158\n182166,192\n182166,195\n182166,200\n182166,202\n182166,215\n182166,217\n182166,233\n182166,240\n182166,248\n182166,251\n182166,272\n182166,285\n182166,289\n182166,290\n182166,315\n182166,332\n182166,333\n182166,337\n182166,346\n182166,358\n182166,372\n182166,406\n182166,422\n182166,430\n182166,435\n182166,439\n182166,442\n182166,447\n182166,493\n182166,516\n182166,525\n182166,536\n182166,585\n182166,588\n182166,590\n182166,592\n182166,602\n182166,609\n182166,615\n182166,620\n182166,622\n182166,626\n182166,640\n182166,671\n182166,682\n182166,779\n182166,862\n182166,907\n182166,934\n182166,949\n182166,968\n182166,980\n182166,994\n182166,996\n182166,1001\n182166,1007\n182166,1068\n182166,1085\n182166,1133\n182166,1175\n182166,1220\n182166,1222\n182166,1238\n182166,1240\n182166,1247\n182166,1265\n182166,1266\n182166,1294\n182166,1326\n182166,1368\n182166,1370\n182166,1388\n182166,1454\n182166,1467\n182166,1474\n182166,1512\n182166,1515\n182166,1522\n182166,1531\n182166,1608\n182166,1635\n182166,1782\n182166,1789\n182166,1955\n182166,1963\n182166,1985\n182166,2087\n182166,2379\n182166,2699\n182166,2782\n182166,2931\n182166,3085\n182166,3115\n182166,3148\n182166,3317\n182166,3321\n182166,3804\n182166,4237\n182166,4355\n182166,4455\n182166,4545\n182166,5440\n182166,5992\n182166,7270\n182166,9001\n182166,9007\n182166,15573\n182166,56150\n182166,60576\n182166,72439\n182166,92476\n182166,94134\n182166,182162\n182167,179170\n182168,179170\n182169,179170\n182170,179170\n182171,30\n182172,2506\n182173,285\n182174,483\n182175,179170\n182176,743\n182177,932\n182178,1133\n182179,273\n182180,1644\n182181,179170\n182182,179170\n182183,30\n182184,179170\n182185,179170\n182186,179170\n182187,406\n182188,2116\n182189,2379\n182190,406\n182191,392\n182192,79\n182192,217\n182193,3\n182193,44\n182193,63\n182193,79\n182193,81\n182193,99\n182193,104\n182193,116\n182193,134\n182193,137\n182193,215\n182193,217\n182193,233\n182193,248\n182193,251\n182193,254\n182193,298\n182193,315\n182193,323\n182193,330\n182193,332\n182193,336\n182193,346\n182193,392\n182193,422\n182193,435\n182193,442\n182193,447\n182193,493\n182193,503\n182193,509\n182193,525\n182193,536\n182193,538\n182193,585\n182193,588\n182193,590\n182193,592\n182193,609\n182193,615\n182193,622\n182193,640\n182193,694\n182193,760\n182193,779\n182193,788\n182193,805\n182193,862\n182193,953\n182193,968\n182193,994\n182193,1007\n182193,1010\n182193,1012\n182193,1016\n182193,1119\n182193,1235\n182193,1240\n182193,1247\n182193,1309\n182193,1326\n182193,1335\n182193,1368\n182193,1370\n182193,1392\n182193,1425\n182193,1454\n182193,1465\n182193,1467\n182193,1512\n182193,1551\n182193,1732\n182193,1782\n182193,1789\n182193,1939\n182193,1955\n182193,1985\n182193,2087\n182193,2205\n182193,2244\n182193,2274\n182193,2296\n182193,2567\n182193,2620\n182193,2701\n182193,2793\n182193,3003\n182193,3115\n182193,3804\n182193,4237\n182193,5726\n182193,5992\n182193,6119\n182193,7270\n182193,9007\n182193,16019\n182193,33424\n182193,60576\n182193,164572\n182193,182162\n182193,245910\n182194,247\n182195,563\n182196,563\n182197,577\n182198,255\n182198,2868\n182200,1634\n182201,809\n182201,1085\n182202,138686\n182203,179170\n182204,30\n182205,2367\n182206,179170\n182207,7416\n182208,1474\n182209,3695\n182210,996\n182211,138686\n182212,175\n182213,1983\n182214,179170\n182215,179170\n182216,179170\n182217,104\n182218,447\n182219,2775\n182220,179170\n182221,182222\n182223,1014\n182224,1014\n182225,30\n182226,2620\n182227,818\n182228,3695\n182229,779\n182230,752\n182231,602\n182232,4192\n182232,4193\n182233,179170\n182234,1740\n182235,179170\n182236,323\n182237,81\n182238,2590\n182239,179170\n182240,149\n182241,440\n182242,479\n182243,179170\n182244,179170\n182245,179170\n182246,149\n182247,179170\n182248,2373\n182249,179170\n182250,264\n182251,179170\n182252,179170\n182253,179170\n182254,179170\n182255,179170\n182256,179170\n182257,179170\n182258,179170\n182259,179170\n182260,179170\n182261,179170\n182263,179170\n182264,179170\n182265,392\n182266,179170\n182267,179170\n182268,7652\n182269,44\n182270,657\n182270,843\n182270,1551\n182270,182271\n182270,192792\n182272,179170\n182273,920\n182274,77\n182275,179170\n182276,207\n182277,179170\n182278,920\n182279,285\n182280,179170\n182281,1467\n182282,182283\n182284,388\n182285,862\n182285,2590\n182285,8884\n182286,2424\n182287,182288\n182289,872\n182290,1429\n182291,1143\n182292,668\n182293,1007\n182295,1414\n182296,1370\n182297,24505\n182298,30\n182299,366\n182300,366\n182301,13980\n182302,179170\n182303,72\n182303,75912\n182304,355\n182305,182306\n182307,187\n182308,34\n182308,35\n182308,120\n182308,192\n182308,240\n182308,264\n182308,332\n182308,392\n182308,435\n182308,493\n182308,1531\n182308,1796\n182308,2205\n182308,33424\n182309,349\n182309,392\n182309,595\n182309,697\n182309,1240\n182309,1453\n182309,1454\n182309,2699\n182309,3367\n182309,9098\n182309,24763\n182310,179170\n182311,162599\n182312,1179\n182313,1252\n182313,1253\n182314,1381\n182315,83\n182316,1326\n182317,3218\n182318,206\n182319,640\n182321,3623\n182322,4039\n182323,809\n182326,868\n182327,73570\n182328,693\n182329,192\n182330,493\n182331,349\n182332,657\n182333,3695\n182334,301\n182334,1293\n182334,189303\n182335,2744\n182336,182337\n182338,389\n182339,118336\n182340,932\n182340,991\n182342,422\n182343,422\n182344,1119\n182345,104\n182345,134\n182345,298\n182345,332\n182345,364\n182345,417\n182345,442\n182345,636\n182345,694\n182345,749\n182345,801\n182345,805\n182345,999\n182345,1119\n182345,1368\n182345,2775\n182345,3328\n182345,3474\n182345,27041\n182346,422\n182347,422\n182348,422\n182349,422\n182350,422\n182351,433\n182352,422\n182353,422\n182354,422\n182355,422\n182356,1608\n182357,1132\n182358,21442\n182359,422\n182360,422\n182361,1782\n182362,1688\n182362,2353\n182363,138686\n182364,920\n182365,467\n182366,175\n182367,63\n182367,147\n182367,192\n182367,571\n182367,622\n182367,1370\n182368,1858\n182369,1860\n182370,1983\n182371,1858\n182372,1860\n182373,485\n182374,298\n182376,1893\n182377,1707\n182378,1511\n182378,3069\n182380,206\n182381,1453\n182382,264\n182382,1888\n182383,1453\n182384,338\n182385,298\n182386,485\n182387,1955\n182388,1132\n182389,1608\n182391,27041\n182392,79\n182393,298\n182394,586\n182395,200\n182395,225\n182396,1132\n182397,1608\n182398,2867\n182398,2868\n182399,636\n182400,485\n182401,298\n182402,17309\n182404,433\n182405,2353\n182406,217\n182407,852\n182408,2671\n182409,32\n182410,272\n182411,184\n182415,298\n182416,485\n182417,217\n182418,579\n182419,302\n182420,1509\n182420,1893\n182421,1465\n182423,138686\n182425,175\n182426,179170\n182427,48505\n182428,392\n182429,2775\n182431,440\n182431,1033\n182432,760\n182434,302\n182435,179170\n182436,4260\n182437,2048\n182438,1132\n182439,1608\n182440,8463\n182441,861\n182442,21408\n182443,859\n182444,261\n182445,1127\n182446,1837\n182446,73570\n182447,1893\n182447,49057\n182448,592\n182448,2315\n182449,388\n182450,1608\n182451,1132\n182452,994\n182453,1927\n182454,240\n182455,4237\n182455,182162\n182456,81070\n182457,720\n182458,298\n182459,485\n182460,424\n182461,23011\n182462,1556\n182463,145240\n182464,1089\n182465,911\n182466,752\n182466,1149\n182467,222\n182467,4223\n182467,13137\n182468,30\n182469,83\n182469,356\n182469,379\n182469,2784\n182469,5591\n182470,138686\n182471,175\n182472,731\n182473,217\n182475,818\n182476,4220\n182477,1544\n182478,202\n182479,577\n182480,48\n182480,649\n182481,1467\n182483,142870\n182484,83\n182486,557\n182487,1434\n182488,389\n182490,872\n182492,516\n182493,1132\n182494,1608\n182495,302\n182496,179170\n182497,1284\n182499,179170\n182500,861\n182501,1072\n182502,1127\n182503,563\n182504,1983\n182505,106\n182505,1370\n182505,6119\n182506,818\n182506,872\n182506,127158\n182508,73570\n182509,304\n182509,720\n182509,775\n182509,877\n182509,907\n182509,973\n182509,1001\n182509,1117\n182509,1284\n182509,1522\n182509,1715\n182509,1732\n182509,1837\n182509,2191\n182509,9024\n182510,182511\n182512,182511\n182513,1858\n182514,1860\n182515,4190\n182515,162599\n182515,187176\n182516,1467\n182517,918\n182518,356\n182519,1332\n182521,73570\n182522,48\n182523,1436\n182524,536\n182525,30\n182526,406\n182527,179170\n182528,360\n182529,355\n182531,4218\n182532,515\n182533,893\n182534,9010\n182535,1515\n182536,4594\n182537,1240\n182538,313\n182538,1019\n182539,179170\n182540,949\n182541,30\n182542,1983\n182543,1247\n182543,164572\n182544,179170\n182545,179170\n182546,2512\n182547,179170\n182548,179170\n182549,304\n182550,996\n182551,390\n182552,328\n182553,1370\n182554,73570\n182555,893\n182556,302\n182557,2205\n182557,33424\n182559,202\n182559,3321\n182559,68069\n182560,1388\n182561,179170\n182562,360\n182563,240\n182564,1298\n182565,179170\n182566,392\n182567,406\n182568,151\n182569,179170\n182570,4218\n182571,179170\n182572,251\n182573,1220\n182573,1222\n182574,252\n182575,30\n182575,248\n182576,861\n182577,30\n182578,379\n182579,34\n182579,35\n182580,217\n182581,1983\n182582,1240\n182583,9025\n182584,2989\n182584,2991\n182585,179170\n182586,182587\n182588,406\n182590,156379\n182591,30\n182592,2923\n182593,147123\n182594,302\n182595,1\n182596,179170\n182597,45960\n182598,264\n182598,590\n182599,1102\n182600,435\n182601,298\n182602,485\n182603,1085\n182603,156379\n182604,843\n182605,179170\n182606,4\n182606,5\n182606,104\n182606,138\n182606,714\n182606,885\n182606,1212\n182606,1458\n182606,2008\n182606,3561\n182606,4748\n182606,13704\n182606,167349\n182606,167350\n182607,55849\n182608,1436\n182608,2979\n182610,500\n182611,1962\n182612,1052\n182613,1882\n182614,2775\n182615,54\n182617,145240\n182618,179170\n182619,7360\n182620,73570\n182621,483\n182622,330\n182623,5405\n182624,302\n182625,1983\n182626,179170\n182627,202\n182628,68\n182628,1955\n182629,179170\n182630,179170\n182631,240\n182632,137\n182633,2620\n182634,179170\n182635,278\n182636,34\n182636,35\n182636,217\n182636,261\n182636,422\n182636,760\n182636,779\n182636,949\n182636,1019\n182636,1467\n182636,1515\n182636,1590\n182636,1644\n182637,55849\n182638,4691\n182639,885\n182639,13704\n182640,861\n182641,179170\n182642,861\n182643,485\n182644,298\n182646,136\n182647,1467\n182648,179170\n182650,55849\n182651,6556\n182652,289\n182652,290\n182652,94134\n182653,179170\n182654,72\n182655,72\n182659,55849\n182660,467\n182660,920\n182661,179170\n182662,10\n182663,182664\n182665,1001\n182666,4218\n182667,10\n182668,2779\n182669,1\n182670,182671\n182672,15119\n182673,932\n182674,269\n182675,4260\n182675,142870\n182675,148600\n182676,179170\n182677,136\n182678,83\n182679,111\n182680,50\n182680,192\n182680,240\n182680,809\n182681,422\n182682,56\n182683,1058\n182684,19010\n182685,79\n182686,107\n182687,88820\n182689,536\n182690,83\n182691,278\n182692,142870\n182693,417\n182694,182695\n182696,516\n182697,30\n182698,81\n182700,182701\n182702,1821\n182703,1983\n182704,285\n182705,147\n182706,250\n182706,1684\n182707,44\n182708,424\n182709,1220\n182709,1222\n182710,137\n182711,134\n182712,137\n182713,187\n182714,1425\n182715,179170\n182717,1635\n182718,760\n182719,4637\n182720,23011\n182721,50\n182722,151\n182723,30\n182724,1085\n182725,298\n182726,485\n182727,355\n182729,1238\n182730,1452\n182731,779\n182732,179170\n182734,431\n182734,6059\n182735,215\n182737,731\n182738,171\n182739,179170\n182740,1149\n182741,1146\n182742,467\n182745,106\n182746,179170\n182747,83\n182748,1983\n182749,179170\n182750,79\n182751,151\n182752,179170\n182753,4611\n182754,1544\n182755,179170\n182756,2775\n182757,447\n182758,360\n182759,907\n182760,179170\n182761,73570\n182762,56\n182763,1677\n182764,269\n182765,1983\n182766,422\n182767,5405\n182768,422\n182769,422\n182770,422\n182771,422\n182772,422\n182773,422\n182774,422\n182775,422\n182776,422\n182777,422\n182778,422\n182779,127158\n182780,809\n182782,147\n182782,158\n182784,182785\n182786,1319\n182786,1479\n182786,1522\n182786,3524\n182787,1353\n182788,1113\n182789,309\n182789,310\n182790,26041\n182790,124668\n182791,10\n182792,2146\n182793,1860\n182794,1858\n182795,15807\n182796,920\n182797,467\n182798,83\n182800,21408\n182801,1688\n182804,138686\n182805,859\n182807,179170\n182808,718\n182809,372\n182810,68\n182811,536\n182812,1707\n182813,1608\n182814,1132\n182815,360\n182816,83\n182816,1417\n182818,179170\n182819,315\n182819,518\n182820,647\n182821,146\n182821,92476\n182822,344\n182823,179170\n182824,1220\n182824,1222\n182825,1132\n182826,1608\n182827,179170\n182828,179170\n182829,179170\n182830,30\n182831,1240\n182832,19010\n182833,491\n182834,252\n182834,1220\n182834,1222\n182835,491\n182836,41\n182836,1462\n182836,8537\n182837,182838\n182840,5405\n182841,872\n182842,175\n182843,167\n182843,3207\n182844,346\n182845,3538\n182846,104\n182846,1085\n182848,577\n182849,145240\n182850,200\n182851,1449\n182851,1927\n182853,179170\n182854,349\n182854,392\n182855,147\n182856,81\n182857,717\n182860,536\n182862,447\n182863,2775\n182864,179170\n182865,179170\n182866,302\n182867,179170\n182868,138686\n182869,175\n182870,1882\n182871,179170\n182872,179170\n182873,179170\n182874,179170\n182875,1287\n182876,809\n182877,76096\n182879,344\n182880,510\n182881,1181\n182882,79\n182883,147\n182883,158\n182884,179170\n182885,589\n182885,4355\n182886,1359\n182887,179170\n182888,1220\n182888,1222\n182889,516\n182890,192\n182891,179170\n182892,422\n182893,1707\n182894,3634\n182894,3692\n182894,4427\n182894,13320\n182894,18262\n182894,20069\n182894,20483\n182894,25731\n182894,28218\n182894,28484\n182894,31185\n182894,37103\n182894,38322\n182894,38737\n182894,43404\n182894,49010\n182894,107208\n182894,117811\n182894,126008\n182894,131380\n182894,134528\n182894,134548\n182894,135908\n182894,140329\n182894,150086\n182894,158654\n182894,162275\n182894,165786\n182894,171031\n182894,179373\n182894,183407\n182894,185462\n182894,187214\n182894,188927\n182894,189355\n182894,189870\n182894,193481\n182894,194205\n182894,194493\n182894,194608\n182894,194804\n182894,195425\n182894,195542\n182894,195647\n182894,197897\n182894,205179\n182894,213153\n182894,214065\n182894,214119\n182894,221916\n182894,223175\n182894,223895\n182894,224122\n182894,225355\n182894,229119\n182894,229287\n182894,230985\n182894,234791\n182894,234971\n182894,236991\n182896,991\n182896,992\n182897,240\n182898,252\n182899,349\n182899,697\n182900,392\n182900,1143\n182901,3623\n182902,467\n182902,868\n182902,1345\n182903,106\n182903,760\n182903,8180\n182904,4571\n182906,868\n182906,33611\n182907,195\n182910,455\n182911,326\n182912,301\n182912,615\n182912,968\n182912,1293\n182912,1782\n182913,1309\n182914,217\n182915,1849\n182916,113156\n182918,366\n182919,366\n182920,406\n182921,1745\n182922,3623\n182923,366\n182925,302\n182925,483\n182928,973\n182929,1381\n182930,302\n182931,158\n182932,1117\n182934,179170\n182935,2590\n182936,1\n182937,818\n182938,435\n182939,861\n182941,1265\n182941,1266\n182942,515\n182943,586\n182944,718\n182945,1634\n182946,5213\n182947,3623\n182950,1359\n182951,179170\n182952,41\n182953,843\n182954,3623\n182955,602\n182956,179170\n182957,209\n182958,1805\n182959,275\n182960,179170\n182961,179170\n182962,1474\n182963,104\n182964,179170\n182965,179170\n182966,179170\n182967,1785\n182967,2205\n182967,33424\n182968,202\n182969,2775\n182970,447\n182971,859\n182972,179170\n182973,179170\n182974,509\n182975,752\n182976,784\n182976,1113\n182977,138686\n182978,175\n182979,179170\n182980,1274\n182980,1608\n182980,2266\n182981,179170\n182982,862\n182983,179170\n182984,3507\n182985,626\n182986,1231\n182987,515\n182988,2017\n182989,918\n182990,167\n182991,1893\n182992,217\n182993,1381\n182994,455\n182995,32\n182996,179170\n182997,247\n182998,252\n182999,1220\n182999,1222\n183000,516\n183001,15\n183001,115\n183001,118\n183001,340\n183001,489\n183001,827\n183001,1001\n183001,1058\n183001,1089\n183001,1623\n183001,1707\n183001,3999\n183001,17590\n183001,24763\n183001,122406\n183001,142426\n183002,158\n183002,222\n183002,640\n183002,1572\n183002,3161\n183003,299\n183003,663\n183003,877\n183003,907\n183003,973\n183003,1284\n183003,62204\n183003,124668\n183003,161931\n183003,182932\n183004,682\n183004,72439\n183005,171\n183006,861\n183007,179170\n183008,1240\n183009,349\n183009,5540\n183010,360\n183011,743\n183012,389\n183013,1608\n183014,1132\n183015,179170\n183016,183017\n183018,222\n183019,10\n183020,918\n183021,577\n183022,83\n183023,151\n183024,1749\n183025,179170\n183026,949\n183027,1001\n183028,483\n183029,493\n183030,179170\n183031,1149\n183032,644\n183033,72\n183034,183035\n183036,6955\n183037,309\n183037,310\n183038,8373\n183039,360\n183040,563\n183041,30\n183042,3804\n183043,179170\n183044,4\n183044,5\n183045,247\n183045,2867\n183045,2868\n183046,102\n183047,1326\n183048,408\n183049,1323\n183050,1265\n183050,1266\n183051,515\n183052,1653\n183053,81\n183054,1860\n183055,1858\n183056,577\n183057,8820\n183058,1707\n183059,278\n183060,56\n183061,422\n183062,631\n183063,30\n183064,1\n183064,195\n183064,640\n183064,162372\n183065,2699\n183066,179170\n183067,919\n183068,392\n183069,1\n183070,217\n183071,179170\n183072,3\n183073,644\n183074,346\n183075,111142\n183076,333\n183077,818\n183079,252\n183080,697\n183080,1140\n183081,592\n183082,5440\n183083,1877\n183084,273\n183085,337\n183085,338\n183085,393\n183085,439\n183085,649\n183085,772\n183085,1381\n183085,2367\n183086,3135\n183087,283\n183088,179170\n183090,1775\n183090,171294\n183091,179170\n183092,255\n183093,3\n183094,1089\n183094,1623\n183094,17590\n183094,122406\n183095,179170\n183096,389\n183098,1113\n183099,1707\n183100,179170\n183101,422\n183103,142405\n183103,154408\n183104,1860\n183105,1858\n183106,16019\n183107,5906\n183108,557\n183109,626\n183110,278\n183111,137\n183112,862\n183113,2797\n183114,23783\n183115,179170\n183116,72\n183117,1370\n183119,72\n183120,222\n183120,1019\n183121,72\n183122,72\n183123,106\n183123,8854\n183123,255750\n183124,55849\n183125,10\n183126,1085\n183127,142405\n183128,920\n183129,179170\n183130,179170\n183131,179170\n183132,298\n183133,485\n183134,179170\n183135,292\n183136,1014\n183137,1014\n183138,525\n183139,1014\n183140,1014\n183141,179170\n183142,1014\n183143,1309\n183144,48505\n183145,179170\n183146,179170\n183147,179170\n183148,435\n183149,1285\n183150,1370\n183151,631\n183152,397\n183153,294\n183154,142405\n183155,202\n183156,440\n183157,843\n183158,328\n183158,192296\n183158,194175\n183159,30\n183160,2506\n183161,183162\n183163,179170\n183164,3695\n183165,179170\n183166,179170\n183167,932\n183168,581\n183169,183170\n183171,179170\n183172,54\n183173,1983\n183174,30\n183175,994\n183177,142430\n183178,97\n183178,192\n183178,333\n183178,3623\n183179,54\n183180,179170\n183181,1359\n183182,250\n183182,1684\n183183,285\n183184,994\n183185,893\n183186,222\n183187,872\n183188,285\n183189,107\n183189,326\n183189,340\n183189,459\n183189,994\n183190,264\n183191,557\n183192,179170\n183193,1773\n183194,179170\n183195,269\n183196,358\n183197,1474\n183198,779\n183199,68\n183200,2421\n183201,338\n183202,1983\n183204,179170\n183205,183206\n183205,216883\n183205,217333\n183205,221589\n183205,252916\n183207,44\n183208,640\n183210,1143\n183211,23011\n183212,179170\n183213,577\n183214,862\n183215,30\n183216,2590\n183217,2116\n183218,577\n183219,195\n183220,1962\n183221,500\n183222,1052\n183223,2775\n183224,1882\n183225,54\n183226,1821\n183228,2048\n183229,2590\n183231,179170\n183232,536\n183233,207\n183235,355\n183236,1001\n183237,8270\n183238,4545\n183238,56150\n183239,1238\n183240,872\n183241,1429\n183242,269\n183243,13538\n183244,1452\n183245,1235\n183245,1335\n183246,668\n183247,893\n183248,450\n183248,1707\n183249,577\n183249,1400\n183250,146\n183250,92476\n183251,647\n183252,344\n183253,491\n183253,827\n183254,255\n183255,862\n183256,333\n183257,406\n183258,1608\n183259,83\n183260,151\n183261,1188\n183263,1891\n183265,312\n183266,673\n183267,4165\n183272,222\n183272,389\n183273,16019\n183274,22\n183274,1118\n183275,340\n183276,422\n183277,422\n183278,422\n183279,422\n183280,422\n183281,422\n183282,422\n183283,48505\n183284,422\n183285,422\n183286,422\n183287,422\n183288,273\n183289,422\n183291,422\n183292,422\n183293,1220\n183293,1222\n183294,146\n183294,92476\n183295,647\n183296,344\n183297,422\n183298,30\n183299,135\n183299,137\n183299,138\n183300,186\n183301,171\n183302,557\n183303,620\n183304,171\n183305,444\n183306,192\n183306,406\n183306,1181\n183307,697\n183308,415\n183308,15523\n183309,34\n183309,35\n183309,442\n183309,609\n183309,775\n183309,1466\n183309,2209\n183309,2646\n183310,615\n183311,406\n183313,920\n183314,467\n183315,135\n183315,138\n183317,1001\n183318,1175\n183318,1293\n183320,693\n183320,818\n183320,1010\n183320,1122\n183320,1715\n183320,1849\n183320,127158\n183320,183448\n183320,183737\n183320,185986\n183320,189220\n183320,189230\n183320,191504\n183320,191769\n183321,22\n183321,1210\n183322,179170\n183323,171641\n183324,1453\n183326,1238\n183327,135\n183327,138\n183328,1983\n183328,15119\n183329,138686\n183330,175\n183332,862\n183332,3467\n183332,6068\n183334,306\n183334,307\n183336,1515\n183337,779\n183338,302\n183339,10\n183340,192\n183340,5102\n183341,1858\n183342,1860\n183343,422\n183344,142870\n183345,3623\n183346,809\n183347,158\n183348,5192\n183349,179170\n183350,195\n183351,1274\n183352,1837\n183353,273\n183354,3585\n183355,1390\n183356,1801\n183356,3182\n183356,6424\n183357,1796\n183358,138686\n183359,175\n183360,779\n183361,1663\n183363,697\n183363,5301\n183365,1132\n183366,417\n183366,609\n183366,1188\n183366,1359\n183366,1659\n183366,1888\n183367,349\n183368,2626\n183369,1860\n183370,1858\n183371,217\n183373,1858\n183374,1860\n183375,209\n183375,302\n183375,687\n183375,861\n183375,1556\n183376,3\n183377,158\n183378,179170\n183379,1893\n183380,1247\n183380,164572\n183381,949\n183382,422\n183383,1274\n183384,685\n183385,491\n183385,589\n183385,752\n183385,2105\n183385,4355\n183387,2590\n183389,360\n183391,1607\n183392,134\n183392,636\n183392,1001\n183392,1608\n183393,358\n183394,183394\n183395,1116\n183396,1571\n183397,360\n183398,868\n183399,160\n183400,179170\n183402,1\n183402,58\n183402,79\n183402,86\n183402,106\n183402,120\n183402,130\n183402,158\n183402,160\n183402,192\n183402,217\n183402,259\n183402,299\n183402,301\n183402,326\n183402,328\n183402,336\n183402,358\n183402,387\n183402,403\n183402,415\n183402,455\n183402,483\n183402,485\n183402,567\n183402,581\n183402,586\n183402,644\n183402,657\n183402,666\n183402,707\n183402,718\n183402,726\n183402,749\n183402,784\n183402,795\n183402,809\n183402,843\n183402,852\n183402,893\n183402,918\n183402,980\n183402,1043\n183402,1052\n183402,1082\n183402,1113\n183402,1140\n183402,1147\n183402,1149\n183402,1179\n183402,1188\n183402,1353\n183402,1359\n183402,1363\n183402,1417\n183402,1424\n183402,1466\n183402,1590\n183402,1616\n183402,1634\n183402,1653\n183402,1718\n183402,1773\n183402,1837\n183402,1888\n183402,1891\n183402,1973\n183402,2105\n183402,2607\n183402,2674\n183402,2699\n183402,2923\n183402,3003\n183402,3422\n183402,3967\n183402,3999\n183402,4218\n183402,4220\n183402,4571\n183402,6424\n183402,6824\n183402,18298\n183402,19413\n183402,21442\n183402,25282\n183402,26450\n183402,27057\n183402,30331\n183402,81070\n183402,131675\n183403,360\n183404,1143\n183406,138686\n183407,718\n183408,175\n183409,1749\n183410,3623\n183413,1893\n183414,408\n183415,1\n183416,392\n183417,447\n183418,2775\n183419,873\n183419,874\n183420,23011\n183421,875\n183422,1181\n183423,356\n183423,124668\n183424,467\n183425,273\n183426,217\n183427,72\n183428,30\n183429,302\n183430,636\n183431,20591\n183432,1392\n183433,360\n183434,861\n183435,29380\n183436,248\n183436,1955\n183437,4771\n183438,179170\n183439,1893\n183440,1293\n183441,452\n183442,1247\n183442,164572\n183443,184\n183445,151\n183446,179170\n183447,179170\n183448,171641\n183448,221298\n183449,118336\n183450,346\n183451,179170\n183452,179170\n183453,1740\n183454,360\n183455,179170\n183456,634\n183456,635\n183456,2223\n183456,2784\n183456,2944\n183456,18650\n183456,19286\n183456,28130\n183456,191783\n183456,261536\n183457,920\n183459,775\n183460,1151\n183461,433\n183462,222\n183462,455\n183463,251\n183464,278\n183465,251\n183467,179170\n183469,918\n183470,4611\n183471,1285\n183472,30\n183473,287\n183475,640\n183476,338\n183477,179170\n183478,48\n183478,130\n183478,140\n183478,827\n183478,1007\n183478,1052\n183478,1078\n183478,1132\n183478,1381\n183478,1452\n183478,3695\n183478,5440\n183478,6824\n183478,36819\n183479,8854\n183480,292\n183481,106\n183482,147\n183483,934\n183484,278\n183485,83\n183486,217\n183487,273\n183488,179170\n183489,171\n183490,19010\n183490,22293\n183491,179170\n183492,920\n183493,3695\n183494,1634\n183495,179170\n183496,151\n183497,3695\n183499,179170\n183500,302\n183502,920\n183503,19010\n183504,179170\n183505,30\n183506,3695\n183507,179170\n183508,179170\n183509,179170\n183510,515\n183511,192\n183511,195\n183511,222\n183511,577\n183511,626\n183511,1454\n183512,634\n183513,1326\n183514,102\n183515,1323\n183516,408\n183517,179170\n183518,179170\n183519,179170\n183520,179170\n183521,179170\n183522,850\n183523,179170\n183524,309\n183524,310\n183525,850\n183527,1556\n183528,147\n183529,179170\n183530,885\n183530,13704\n183531,1\n183532,440\n183533,720\n183534,605\n183535,328\n183536,147\n183536,151\n183536,305\n183537,875\n183538,3623\n183539,179170\n183540,980\n183541,2244\n183542,349\n183542,392\n183543,30\n183544,1274\n183545,202\n183546,3623\n183547,272\n183548,30\n183549,179170\n183551,4594\n183552,179170\n183553,973\n183553,148742\n183554,972\n183555,222\n183555,5343\n183556,2646\n183557,233\n183557,298\n183557,818\n183558,240\n183559,313\n183560,918\n183561,179170\n183562,483\n183563,79\n183564,2244\n183565,3623\n183566,435\n183567,2626\n183568,124668\n183569,3623\n183570,875\n183571,2590\n183572,875\n183574,749\n183576,10\n183577,240\n183577,332\n183577,372\n183577,588\n183577,590\n183577,1001\n183577,1285\n183577,1419\n183577,1955\n183577,3331\n183577,9026\n183578,6955\n183579,873\n183580,192\n183581,3623\n183582,179170\n183583,843\n183584,259\n183585,577\n183586,30\n183587,663\n183588,30\n183589,179170\n183590,179170\n183591,3623\n183592,875\n183593,330\n183594,575\n183595,3623\n183596,151\n183597,3623\n183598,2292\n183599,240\n183599,247\n183599,269\n183600,30\n183601,179170\n183602,875\n183603,718\n183604,179170\n183605,179170\n183606,179170\n183607,179170\n183608,179170\n183609,179170\n183610,389\n183611,179170\n183612,179170\n183613,557\n183614,862\n183615,704\n183616,175\n183617,2373\n183618,142870\n183619,179170\n183620,302\n183621,1285\n183622,37\n183622,1231\n183623,1782\n183623,5662\n183624,3623\n183625,10\n183626,330\n183627,875\n183628,875\n183629,3\n183629,32\n183629,50\n183629,63\n183629,81\n183629,99\n183629,137\n183629,146\n183629,147\n183629,178\n183629,192\n183629,233\n183629,248\n183629,252\n183629,254\n183629,261\n183629,289\n183629,301\n183629,323\n183629,330\n183629,332\n183629,336\n183629,358\n183629,392\n183629,393\n183629,406\n183629,430\n183629,442\n183629,447\n183629,493\n183629,503\n183629,509\n183629,516\n183629,586\n183629,615\n183629,663\n183629,682\n183629,760\n183629,788\n183629,805\n183629,925\n183629,994\n183629,996\n183629,1001\n183629,1010\n183629,1016\n183629,1033\n183629,1119\n183629,1133\n183629,1175\n183629,1181\n183629,1231\n183629,1235\n183629,1240\n183629,1265\n183629,1266\n183629,1282\n183629,1294\n183629,1326\n183629,1335\n183629,1370\n183629,1388\n183629,1425\n183629,1454\n183629,1465\n183629,1515\n183629,1531\n183629,1551\n183629,1635\n183629,1722\n183629,1939\n183629,1955\n183629,1963\n183629,2205\n183629,2244\n183629,2274\n183629,2334\n183629,2379\n183629,2620\n183629,2699\n183629,2701\n183629,2782\n183629,2931\n183629,3003\n183629,3085\n183629,3148\n183629,3317\n183629,3321\n183629,4237\n183629,4355\n183629,4455\n183629,4545\n183629,5726\n183629,5874\n183629,6119\n183629,9001\n183629,9007\n183629,16019\n183629,33424\n183629,56150\n183629,72439\n183629,92476\n183629,94134\n183629,182162\n183630,151\n183631,1014\n183632,1014\n183633,1014\n183634,1014\n183635,1014\n183636,179170\n183637,8854\n183638,179170\n183639,183640\n183641,179170\n183642,932\n183643,179170\n183644,179170\n183645,179170\n183646,30\n183647,285\n183648,250\n183648,1684\n183649,179170\n183650,861\n183651,640\n183652,516\n183654,1235\n183654,1335\n183655,179170\n183656,1007\n183657,179170\n183658,577\n183659,1007\n183660,1688\n183661,68069\n183662,179170\n183663,536\n183664,1467\n183665,278\n183666,83\n183667,872\n183668,217\n183669,179170\n183671,267\n183672,44\n183673,183674\n183675,137\n183676,179170\n183677,862\n183679,137\n183680,48\n183681,3538\n183682,1058\n183683,137\n183684,1634\n183685,138686\n183686,175\n183687,81\n183688,72\n183689,366\n183690,366\n183691,366\n183692,366\n183693,366\n183694,366\n183695,366\n183697,366\n183698,366\n183699,366\n183700,422\n183701,1227\n183701,86416\n183702,900\n183703,137\n183703,138\n183704,136\n183704,137\n183704,227\n183705,920\n183706,1860\n183707,22\n183707,83\n183707,467\n183707,861\n183707,872\n183708,6726\n183709,179170\n183710,137\n183711,72\n183713,298\n183714,485\n183715,142426\n183715,145751\n183716,30\n183717,355\n183718,30\n183719,99\n183721,1882\n183723,1881\n183724,1359\n183726,206\n183727,209\n183728,83\n183729,422\n183730,1188\n183731,1238\n183732,50\n183732,79\n183732,147\n183732,158\n183734,707\n183735,183736\n183737,171641\n183738,872\n183739,749\n183740,911\n183741,264\n183741,1033\n183741,1381\n183741,1452\n183741,1551\n183741,1639\n183741,3041\n183741,5440\n183742,389\n183744,2775\n183745,447\n183746,1844\n183747,148742\n183749,366\n183750,875\n183751,366\n183752,366\n183753,366\n183754,447\n183755,2775\n183756,366\n183757,366\n183759,366\n183761,980\n183762,3623\n183763,30331\n183764,41\n183764,760\n183766,171\n183767,872\n183769,256\n183770,818\n183771,640\n183772,149\n183772,118336\n183773,1452\n183774,1639\n183775,1474\n183776,72\n183777,30\n183778,3252\n183779,10\n183780,183781\n183782,48\n183783,1417\n183784,467\n183785,920\n183786,626\n183787,240\n183788,2775\n183789,447\n183790,255\n183791,408\n183792,147\n183793,843\n183794,211\n183794,1096\n183795,843\n183796,392\n183797,843\n183798,138686\n183799,175\n183800,314\n183801,996\n183803,30331\n183804,37\n183806,868\n183807,10\n183808,5405\n183809,3623\n183811,79\n183812,209\n183812,302\n183812,809\n183816,2146\n183817,240\n183817,1085\n183817,1715\n183817,2620\n183818,1140\n183818,2443\n183819,622\n183820,3623\n183821,918\n183822,389\n183822,185877\n183823,431\n183824,743\n183825,623\n183826,183827\n183828,171\n183829,269\n183830,1551\n183830,3999\n183830,191860\n183831,2671\n183832,97\n183833,21442\n183834,215\n183835,1151\n183836,7360\n183837,3474\n183838,302\n183839,104\n183839,200\n183840,809\n183841,137\n183842,455\n183844,1179\n183845,179170\n183846,387\n183847,4455\n183849,2699\n183851,1707\n183852,406\n183852,1181\n183853,3\n183853,510\n183853,2045\n183854,142426\n183856,818\n183857,217\n183858,652\n183860,120\n183863,58\n183864,994\n183865,46\n183866,685\n183867,577\n183867,1033\n183867,7092\n183868,309\n183868,310\n183868,161171\n183869,158\n183870,302\n183872,56\n183873,217\n183873,222\n183873,389\n183873,657\n183873,1466\n183873,32751\n183874,2590\n183875,183876\n183877,1688\n183879,707\n183881,611\n183881,1718\n183882,663\n183883,298\n183884,485\n183885,158\n183885,406\n183885,779\n183885,1181\n183886,73570\n183887,1436\n183888,240\n183889,809\n183890,50\n183891,389\n183892,158\n183893,195\n183894,1285\n183894,1955\n183895,500\n183896,1962\n183897,1882\n183898,1052\n183899,2775\n183900,54\n183901,2168\n183902,1939\n183903,3\n183904,1769\n183905,2557\n183906,8822\n183907,183908\n183911,147\n183911,118336\n183913,138686\n183914,175\n183915,55849\n183916,360\n183917,113156\n183918,718\n183919,344\n183921,179170\n183922,652\n183923,76096\n183925,1544\n183926,72\n183927,615\n183928,206\n183929,893\n183930,1012\n183931,439\n183933,852\n183934,183935\n183934,184361\n183934,187379\n183934,187593\n183936,179170\n183937,516\n183939,1803\n183941,663\n183945,1298\n183953,72\n183954,179170\n183955,366\n183956,994\n183957,136\n183958,1012\n183959,1707\n183960,179170\n183961,179170\n183962,162599\n183963,1955\n183964,2017\n183965,332\n183966,9030\n183967,179170\n183968,298\n183969,179170\n183970,183971\n183972,179170\n183973,4571\n183974,3623\n183975,48\n183976,515\n183977,3695\n183977,142405\n183978,515\n183980,1105\n183981,4895\n183982,138686\n183983,175\n183984,99\n183985,355\n183987,30331\n183988,3623\n183989,3623\n183990,1300\n183991,72\n183992,994\n183993,309\n183993,310\n183994,557\n183995,862\n183996,4146\n183997,151\n183999,2590\n184000,1417\n184001,184002\n184003,1326\n184004,102\n184005,1323\n184006,408\n184007,1019\n184009,184010\n184011,179170\n184012,3623\n184013,302\n184014,81\n184015,179170\n184016,861\n184017,366\n184018,366\n184019,366\n184020,120\n184021,671\n184021,1177\n184021,182162\n184023,422\n184024,422\n184025,422\n184026,422\n184027,390\n184027,1274\n184027,1381\n184027,1579\n184027,2646\n184028,422\n184029,30\n184030,72\n184031,83\n184032,422\n184033,422\n184034,422\n184035,422\n184036,704\n184037,422\n184038,179170\n184039,704\n184040,422\n184042,179170\n184043,1370\n184044,704\n184045,179170\n184046,388\n184047,58\n184048,184049\n184050,72\n184051,3623\n184052,15573\n184053,30\n184054,3623\n184055,417\n184057,972\n184058,217\n184059,809\n184060,179170\n184061,278\n184062,1572\n184063,2590\n184065,704\n184066,704\n184067,875\n184068,3623\n184069,192\n184070,179170\n184071,184072\n184073,1274\n184074,83\n184075,179170\n184076,179170\n184077,83\n184078,179170\n184079,885\n184079,13704\n184080,435\n184081,184082\n184083,179170\n184084,113156\n184085,179170\n184086,3623\n184087,179170\n184088,179170\n184089,585\n184090,843\n184091,1392\n184092,179170\n184093,179170\n184094,179170\n184095,179170\n184096,179170\n184097,366\n184098,366\n184099,366\n184100,366\n184101,30\n184102,366\n184103,179170\n184104,184105\n184106,138\n184107,865\n184108,557\n184109,137\n184110,118\n184110,4597\n184111,88820\n184112,704\n184113,557\n184114,30\n184115,179170\n184116,663\n184116,4545\n184116,6119\n184116,56150\n184117,6027\n184118,704\n184119,30\n184120,179170\n184121,932\n184122,179170\n184123,30\n184124,718\n184124,931\n184125,255\n184126,30\n184127,332\n184128,179170\n184129,179170\n184130,1014\n184131,1014\n184132,179170\n184133,1014\n184134,1014\n184135,1014\n184136,1014\n184137,1014\n184138,179170\n184139,1893\n184140,179170\n184141,179170\n184142,292\n184142,1479\n184142,1858\n184142,6068\n184143,200\n184144,179170\n184145,2373\n184146,179170\n184147,366\n184148,366\n184149,289\n184149,290\n184149,94134\n184150,366\n184151,366\n184152,366\n184153,179170\n184154,184155\n184156,184157\n184158,996\n184159,179170\n184160,179170\n184161,439\n184162,179170\n184164,179170\n184165,179170\n184166,184167\n184168,179170\n184169,184170\n184171,360\n184172,1556\n184174,30\n184175,577\n184176,179170\n184177,83\n184178,179170\n184179,179170\n184180,179170\n184181,179170\n184182,312\n184183,184184\n184183,216152\n184183,218401\n184186,267\n184187,179170\n184188,736\n184190,184191\n184192,843\n184193,285\n184194,192\n184195,250\n184195,1684\n184196,285\n184197,250\n184197,1684\n184198,2590\n184199,225\n184200,179170\n184201,1149\n184202,30\n184203,900\n184204,179170\n184205,30\n184206,843\n184207,8884\n184208,652\n184209,697\n184210,1474\n184211,1085\n184212,179170\n184213,3260\n184214,30\n184214,97\n184214,192\n184214,333\n184214,3623\n184214,5310\n184215,30\n184216,184217\n184218,1893\n184220,994\n184221,179170\n184222,179170\n184223,179170\n184224,355\n184225,366\n184226,366\n184227,602\n184228,366\n184229,366\n184230,366\n184231,393\n184232,30\n184233,184234\n184235,184236\n184237,22580\n184238,22580\n184239,22580\n184240,179170\n184241,83\n184242,184243\n184244,184245\n184244,206658\n184244,217366\n184244,230443\n184246,217\n184247,83\n184248,184248\n184249,184250\n184251,65\n184252,588\n184252,590\n184253,450\n184254,406\n184255,1782\n184256,30\n184257,4192\n184257,4193\n184258,707\n184259,99\n184260,184261\n184263,179170\n184264,875\n184265,1247\n184265,164572\n184266,184267\n184268,97\n184269,184270\n184271,184271\n184272,1235\n184272,1335\n184272,3247\n184272,5375\n184272,9156\n184272,17151\n184272,18158\n184272,83691\n184272,93839\n184272,98083\n184272,111095\n184272,113123\n184272,119402\n184272,125499\n184272,135769\n184272,135770\n184272,184272\n184272,194639\n184272,212644\n184272,228578\n184272,240626\n184273,7652\n184274,467\n184277,184278\n184279,184280\n184281,1858\n184282,1860\n184283,179170\n184285,302\n184285,467\n184285,2116\n184286,1381\n184287,179170\n184288,151\n184289,179170\n184290,918\n184291,179170\n184292,349\n184292,3260\n184293,364\n184294,1522\n184295,41\n184296,200\n184297,179170\n184298,647\n184299,146\n184299,92476\n184300,344\n184301,349\n184301,392\n184302,30\n184303,179170\n184304,147\n184306,392\n184307,2506\n184308,10\n184309,1252\n184309,1253\n184310,875\n184311,3623\n184312,447\n184313,2775\n184314,254\n184316,1276\n184316,85241\n184317,850\n184318,2574\n184319,718\n184320,273\n184322,4\n184322,5\n184323,138686\n184324,175\n184325,10\n184325,1572\n184325,3297\n184326,72\n184327,344\n184328,285\n184329,493\n184329,1132\n184330,602\n184331,599\n184332,346\n184333,184334\n184335,179170\n184336,184337\n184338,179170\n184339,1616\n184340,184341\n184342,366\n184343,366\n184344,366\n184345,1085\n184346,184347\n184348,1368\n184350,179170\n184351,184352\n184353,8868\n184354,918\n184355,147\n184357,301\n184358,72\n184359,184360\n184363,184364\n184365,179170\n184366,179170\n184367,3623\n184368,72\n184369,184370\n184371,1402\n184372,30\n184373,10\n184373,2083\n184373,3218\n184374,1479\n184375,390\n184376,184377\n184378,344\n184379,72\n184380,285\n184381,184382\n184383,179170\n184384,179170\n184385,932\n184386,1235\n184386,1335\n184387,184388\n184389,179170\n184390,184391\n184392,1167\n184392,3392\n184392,3524\n184393,1252\n184393,1253\n184394,30\n184395,192\n184395,406\n184395,8907\n184396,366\n184397,366\n184398,366\n184399,366\n184400,366\n184401,184402\n184403,10\n184403,113156\n184404,179170\n184405,179170\n184406,179170\n184407,30\n184408,30\n184409,179170\n184410,184411\n184412,184413\n184412,216454\n184414,179170\n184415,184416\n184417,861\n184418,179170\n184419,30\n184420,179170\n184421,392\n184422,179170\n184424,30\n184424,328\n184425,2048\n184426,179170\n184427,184428\n184429,184430\n184431,184432\n184434,136\n184436,184437\n184438,50\n184439,184440\n184441,184442\n184443,132418\n184444,142870\n184445,383\n184446,41\n184447,184448\n184449,184450\n184451,240\n184452,184453\n184454,184455\n184456,3830\n184457,1247\n184457,164572\n184458,179170\n184459,355\n184460,872\n184461,107\n184462,2416\n184462,2417\n184463,292\n184464,338\n184465,298\n184466,1133\n184467,3538\n184468,184469\n184470,2073\n184471,30\n184472,516\n184473,252\n184474,1220\n184474,1222\n184475,184476\n184477,184478\n184479,1893\n184480,779\n184481,99\n184482,1102\n184483,1118\n184484,184485\n184486,9007\n184487,346\n184488,30\n184489,142405\n184491,179170\n184492,697\n184492,1769\n184493,68\n184494,184495\n184496,1284\n184497,179170\n184498,305\n184499,1252\n184499,1253\n184500,1001\n184501,184502\n184503,145240\n184504,872\n184505,872\n184506,184507\n184508,392\n184509,893\n184510,485\n184511,184512\n184513,146\n184513,92476\n184514,30\n184515,455\n184516,30\n184517,1102\n184518,240\n184519,10\n184520,1235\n184520,15573\n184521,2334\n184522,3\n184523,30\n184524,179170\n184525,32\n184526,184527\n184528,473\n184529,179170\n184531,668\n184532,184533\n184535,179170\n184536,184537\n184538,269\n184539,184540\n184541,626\n184542,366\n184543,366\n184544,366\n184545,366\n184546,178\n184547,184548\n184549,1623\n184550,184551\n184552,142405\n184553,179170\n184554,22\n184555,72\n184556,167\n184556,240\n184556,347\n184556,372\n184556,605\n184556,615\n184556,720\n184556,907\n184556,968\n184556,1001\n184556,1085\n184556,1122\n184556,1133\n184556,1160\n184556,1167\n184556,1231\n184556,1284\n184556,1298\n184556,1436\n184556,1522\n184556,1564\n184556,1715\n184556,1785\n184556,1837\n184556,2620\n184556,3193\n184556,3194\n184556,3207\n184556,3218\n184556,3422\n184556,5662\n184556,5718\n184557,138686\n184558,175\n184559,273\n184559,30331\n184560,30331\n184561,4691\n184562,179170\n184563,875\n184564,120\n184564,261\n184564,694\n184564,1419\n184565,2506\n184566,30\n184567,872\n184568,872\n184569,179170\n184570,179170\n184571,72\n184572,179170\n184574,179170\n184575,179170\n184576,179170\n184577,179170\n184578,179170\n184579,557\n184580,557\n184581,493\n184581,1127\n184582,557\n184583,83\n184584,179170\n184585,994\n184586,179170\n184587,184588\n184589,1659\n184590,179170\n184591,994\n184592,48\n184593,1432\n184594,94\n184594,2787\n184595,14434\n184596,273\n184597,18726\n184598,179170\n184599,179170\n184600,118\n184600,4597\n184601,179170\n184603,179170\n184604,932\n184607,31977\n184608,151\n184609,1181\n184610,358\n184611,222\n184612,1359\n184613,184614\n184615,1359\n184616,179170\n184617,179170\n184618,422\n184619,184620\n184621,155481\n184622,1118\n184623,252\n184624,516\n184625,1220\n184625,1222\n184626,422\n184627,422\n184628,422\n184629,422\n184630,422\n184631,422\n184632,422\n184633,422\n184634,422\n184635,422\n184636,422\n184637,422\n184638,422\n184639,2775\n184640,447\n184641,222\n184642,142473\n184643,179170\n184644,179170\n184645,366\n184646,1203\n184647,10\n184648,179170\n184649,184650\n184649,196589\n184649,197477\n184649,197755\n184649,214846\n184651,158\n184652,184653\n184654,749\n184654,1146\n184655,179170\n184656,179170\n184657,44\n184658,179170\n184659,602\n184660,602\n184661,10\n184662,30\n184663,184664\n184666,184667\n184668,179170\n184669,179170\n184670,179170\n184671,275\n184672,3623\n184673,3623\n184674,179170\n184675,1877\n184676,137\n184677,179170\n184678,184679\n184678,202920\n184678,217301\n184678,221255\n184678,257016\n184678,264168\n184680,30\n184681,1849\n184682,72\n184683,184684\n184685,184686\n184687,179170\n184688,366\n184689,366\n184690,366\n184691,366\n184692,366\n184693,366\n184694,292\n184695,366\n184696,294\n184697,296\n184698,1402\n184699,298\n184700,83\n184701,138686\n184702,175\n184703,3260\n184704,1572\n184705,30\n184706,2260\n184707,440\n184708,355\n184709,273\n184710,1238\n184711,1452\n184713,184714\n184715,433\n184716,868\n184717,1289\n184718,184719\n184720,160\n184721,2506\n184722,493\n184723,605\n184724,2735\n184725,893\n184727,83\n184728,111\n184729,71\n184730,3218\n184731,640\n184732,640\n184733,640\n184734,640\n184735,640\n184736,192\n184737,994\n184738,287\n184743,287\n184745,968\n184746,184747\n184748,5375\n184749,179170\n184750,206\n184751,179170\n184752,1132\n184753,1085\n184755,5326\n184756,4611\n184757,1479\n184758,4611\n184759,752\n184760,433\n184762,3623\n184763,1132\n184764,781\n184765,3623\n184767,875\n184768,192\n184768,1243\n184769,20\n184770,3623\n184771,3623\n184773,3623\n184775,467\n184776,920\n184777,2782\n184778,433\n184779,3623\n184782,3623\n184783,3623\n184784,485\n184786,138686\n184787,175\n184788,259\n184789,994\n184791,3804\n184792,184793\n184794,184793\n184797,217\n184798,209\n184799,671\n184801,104\n184802,34\n184802,35\n184803,720\n184804,209\n184804,302\n184804,579\n184804,893\n184805,1370\n184806,269\n184807,1220\n184807,1222\n184808,252\n184809,251\n184810,3623\n184811,72\n184812,285\n184813,344\n184814,2083\n184815,1220\n184815,1222\n184816,252\n184817,251\n184818,852\n184819,184820\n184819,184823\n184821,77\n184821,595\n184821,647\n184821,973\n184821,1001\n184821,1010\n184821,1623\n184821,1775\n184821,2607\n184821,171294\n184822,3623\n184824,424\n184824,3148\n184825,187\n184826,779\n184827,457\n184828,1238\n184829,178576\n184830,360\n184831,79\n184832,107\n184833,179170\n184834,302\n184835,2045\n184836,302\n184838,184839\n184840,3623\n184841,972\n184841,6249\n184842,3623\n184843,2244\n184846,925\n184848,171\n184849,1096\n184850,72\n184851,184852\n184853,138686\n184854,175\n184855,202\n184856,485\n184856,805\n184856,1659\n184857,920\n184858,79\n184859,302\n184859,467\n184859,2116\n184861,206\n184862,1655\n184863,676\n184864,1359\n184865,107\n184867,3623\n184868,171\n184869,3623\n184870,515\n184871,620\n184872,1052\n184873,58\n184874,994\n184875,46\n184876,1227\n184876,86416\n184877,251\n184877,483\n184877,505\n184877,838\n184877,1011\n184877,1143\n184877,1368\n184877,1402\n184877,2605\n184877,111142\n184877,207045\n184877,215276\n184877,227669\n184878,34\n184878,35\n184879,3623\n184880,1132\n184881,1608\n184883,72\n184884,302\n184885,103698\n184887,1359\n184888,422\n184889,56\n184890,171\n184891,171\n184892,179170\n184894,240\n184895,1608\n184896,1132\n184897,5591\n184898,83\n184900,1058\n184901,1419\n184902,298\n184903,485\n184904,72\n184905,344\n184906,285\n184907,8149\n184909,179170\n184910,467\n184911,3623\n184912,392\n184913,779\n184913,1181\n184913,23783\n184913,68069\n184913,240174\n184915,1479\n184916,4455\n184917,179170\n184918,179170\n184919,209\n184920,3623\n184921,326\n184922,179170\n184923,2989\n184923,2991\n184924,184925\n184926,4222\n184927,3623\n184928,179170\n184929,124668\n184930,1167\n184931,344\n184932,72\n184933,285\n184934,503\n184935,269\n184936,290\n184936,862\n184936,94134\n184937,217\n184938,3623\n184940,3623\n184941,435\n184942,120\n184943,3623\n184944,1608\n184945,1132\n184946,3623\n184947,2373\n184948,73570\n184949,1014\n184950,1014\n184952,1014\n184953,252\n184954,344\n184955,72\n184956,285\n184957,1014\n184959,3623\n184960,217\n184960,861\n184961,1014\n184962,875\n184963,1014\n184964,278\n184965,83\n184966,1858\n184967,136\n184968,843\n184969,3623\n184970,298\n184971,485\n184972,143287\n184973,155473\n184974,298\n184975,485\n184976,3623\n184979,140\n184979,1893\n184980,3623\n184981,99\n184982,3623\n184983,875\n184984,1274\n184985,3623\n184986,171\n184987,3623\n184988,30\n184989,1644\n184990,3623\n184991,2367\n184992,346\n184993,171\n184994,30\n184995,102\n184996,408\n184997,1326\n184998,1323\n184999,298\n185000,485\n185001,30\n185003,422\n185004,56\n185005,3623\n185006,3623\n185007,447\n185008,2775\n185009,885\n185009,13704\n185010,1298\n185011,151\n185012,30\n185013,30\n185014,1265\n185014,1266\n185014,2931\n185014,164572\n185015,338\n185016,151\n185017,30\n185018,171\n185019,3623\n185020,1436\n185021,3623\n185022,3623\n185024,3623\n185025,515\n185026,171\n185027,227\n185028,3623\n185029,1836\n185031,292\n185032,483\n185034,179170\n185035,3623\n185036,171\n185037,557\n185037,954\n185037,1939\n185038,185039\n185040,287\n185041,113156\n185042,3623\n185043,3623\n185044,179170\n185045,3\n185046,27654\n185047,704\n185048,1326\n185049,185050\n185051,179170\n185052,422\n185053,179170\n185054,179170\n185055,875\n185056,179170\n185057,158\n185057,192\n185057,2244\n185058,171\n185059,3623\n185060,179170\n185061,3623\n185062,179170\n185063,356\n185064,4611\n185065,24505\n185066,875\n185067,1285\n185068,3623\n185069,179170\n185070,179170\n185071,809\n185072,994\n185073,3623\n185074,1467\n185075,652\n185076,179170\n185077,3623\n185078,83\n185079,3623\n185080,179170\n185081,3623\n185082,422\n185083,56\n185084,516\n185084,1175\n185085,3623\n185086,3623\n185087,328\n185088,179170\n185089,24505\n185090,202\n185091,56\n185092,422\n185093,1132\n185094,147\n185094,151\n185094,305\n185095,179170\n185096,250\n185096,1684\n185097,285\n185098,8\n185099,2782\n185100,24505\n185101,160\n185102,1001\n185103,525\n185103,843\n185103,1849\n185104,2989\n185104,2991\n185105,875\n185106,1181\n185106,1572\n185107,779\n185109,30\n185110,1058\n185111,179170\n185112,211\n185113,179170\n185114,179170\n185115,185116\n185117,179170\n185118,179170\n185119,179170\n185120,718\n185121,2704\n185122,435\n185123,56\n185124,422\n185125,704\n185126,56\n185127,1888\n185128,179170\n185129,779\n185130,179170\n185131,843\n185132,704\n185133,589\n185134,852\n185135,298\n185136,485\n185137,185138\n185139,185138\n185140,932\n185141,149\n185142,1449\n185143,158\n185144,309\n185144,310\n185145,563\n185146,779\n185147,179170\n185148,1849\n185149,259\n185150,179170\n185151,240\n185151,372\n185151,1001\n185151,1085\n185152,138686\n185153,175\n185154,179170\n185155,1359\n185156,247\n185157,8822\n185158,30\n185159,179170\n185160,301\n185160,392\n185160,536\n185160,760\n185160,818\n185160,919\n185160,1010\n185160,1033\n185160,1274\n185160,1801\n185162,1631\n185163,775\n185164,142870\n185165,278\n185166,41\n185166,294\n185166,304\n185166,631\n185167,58\n185168,179170\n185170,185171\n185172,179170\n185173,179170\n185174,179170\n185175,185176\n185177,179170\n185178,192\n185179,179170\n185180,179170\n185181,179170\n185182,179170\n185183,30\n185184,179170\n185185,179170\n185186,805\n185187,137\n185188,55849\n185189,179170\n185190,185191\n185192,298\n185193,485\n185194,185195\n185196,209\n185197,422\n185198,44\n185199,422\n185200,422\n185201,422\n185202,422\n185203,422\n185204,422\n185205,422\n185206,422\n185207,422\n185208,422\n185209,422\n185210,422\n185211,422\n185212,185213\n185214,179170\n185215,3623\n185216,142870\n185217,211\n185218,422\n185219,179170\n185220,179170\n185221,179170\n185222,175\n185223,202\n185224,393\n185225,3623\n185226,393\n185227,581\n185227,918\n185228,137\n185229,179170\n185230,862\n185231,179170\n185232,211\n185233,179170\n185234,1285\n185235,30\n185236,1068\n185237,589\n185237,631\n185237,1085\n185237,2590\n185237,44725\n185238,431\n185238,1001\n185238,1474\n185239,138\n185240,30\n185241,269\n185242,30\n185243,179170\n185244,72\n185245,72\n185246,30\n185247,171\n185248,30\n185250,264\n185250,1298\n185250,1749\n185251,843\n185252,355\n185253,269\n185254,179170\n185255,366\n185256,366\n185257,366\n185258,366\n185259,68\n185260,366\n185261,366\n185262,366\n185263,366\n185264,366\n185265,536\n185267,179170\n185269,171\n185270,28107\n185272,415\n185273,171\n185274,1252\n185274,1253\n185276,843\n185277,147\n185279,447\n185280,2775\n185281,1191\n185281,1192\n185281,1345\n185282,1179\n185284,994\n185285,185286\n185288,671\n185289,4611\n185290,1740\n185291,83\n185292,1436\n185293,3623\n185294,640\n185295,640\n185296,640\n185297,640\n185300,4223\n185300,178576\n185302,366\n185303,3623\n185304,1466\n185306,136\n185306,138\n185307,3623\n185308,79\n185310,1608\n185311,1132\n185312,852\n185315,3623\n185316,30\n185317,1132\n185318,781\n185319,10\n185321,2146\n185322,422\n185323,571\n185324,30\n185325,893\n185326,206\n185327,1522\n185328,841\n185329,217\n185330,1882\n185330,142870\n185331,138686\n185332,175\n185333,1001\n185334,781\n185335,1132\n185336,113156\n185338,179170\n185339,3623\n185340,30\n185341,852\n185342,1127\n185343,158\n185344,3623\n185345,75912\n185346,217\n185347,1133\n185348,60576\n185349,4771\n185350,1085\n185351,714\n185353,957\n185355,4611\n185356,185357\n185358,167\n185359,1837\n185360,5250\n185361,151\n185362,151\n185362,192\n185362,309\n185362,310\n185362,577\n185362,1167\n185362,1400\n185363,485\n185364,3623\n185365,248\n185370,1509\n185371,841\n185372,185373\n185374,366\n185375,79\n185376,447\n185377,2775\n185378,186\n185379,225\n185380,1803\n185381,185382\n185383,850\n185384,60576\n185385,179170\n185386,60576\n185387,118336\n185388,781\n185389,1132\n185390,1284\n185391,907\n185392,1769\n185393,1012\n185393,7757\n185394,138686\n185395,175\n185396,41\n185396,68\n185396,240\n185396,294\n185396,390\n185396,431\n185396,631\n185396,760\n185396,805\n185396,818\n185396,1119\n185396,1285\n185396,1309\n185396,1462\n185396,1608\n185396,1631\n185396,1888\n185396,2620\n185396,2995\n185396,3135\n185396,3467\n185396,4220\n185396,7194\n185396,8537\n185396,9021\n185396,66297\n185397,179170\n185399,1801\n185399,3182\n185399,3258\n185399,6424\n185399,13136\n185399,80519\n185399,189266\n185400,79\n185400,626\n185402,309\n185402,310\n185405,875\n185407,557\n185408,60576\n185410,1912\n185412,433\n185414,518\n185414,1326\n185415,406\n185416,185417\n185416,256487\n185418,301\n185419,818\n185421,346\n185423,885\n185423,13704\n185424,1220\n185424,1222\n185425,516\n185426,252\n185427,72\n185428,151\n185429,60576\n185430,315\n185431,10\n185432,60576\n185433,185434\n185435,185434\n185436,1417\n185437,298\n185438,485\n185439,222\n185439,657\n185440,1293\n185441,1860\n185442,1858\n185443,58\n185444,720\n185445,1132\n185446,1608\n185447,563\n185447,911\n185447,991\n185447,1132\n185447,1623\n185448,298\n185449,485\n185450,264\n185451,406\n185452,1949\n185453,1241\n185454,1381\n185454,1805\n185455,185456\n185457,3623\n185458,3623\n185459,595\n185459,4039\n185461,141912\n185462,718\n185462,3555\n185463,58\n185464,30\n185466,142870\n185467,1284\n185468,3623\n185469,3623\n185470,1243\n185471,861\n185472,207\n185472,299\n185472,1417\n185472,2083\n185473,56\n185474,422\n185475,302\n185476,192\n185477,433\n185478,602\n185479,602\n185480,450\n185481,1\n185483,515\n185484,1146\n185485,1454\n185486,146\n185486,973\n185486,92476\n185488,875\n185489,485\n185490,298\n185492,1912\n185493,185494\n185495,918\n185496,1313\n185497,179170\n185498,2923\n185499,704\n185500,179170\n185501,1912\n185502,30\n185503,179170\n185504,58\n185505,2784\n185506,179170\n185507,861\n185508,289\n185508,290\n185508,94134\n185509,30\n185510,171\n185511,171\n185512,179170\n185513,875\n185514,447\n185515,2775\n185516,450\n185518,137\n185519,309\n185519,310\n185519,809\n185520,2620\n185521,138686\n185522,175\n185523,107\n185524,5540\n185525,179170\n185526,875\n185527,179170\n185528,179170\n185529,302\n185530,179170\n185531,30\n185532,703\n185533,233\n185533,301\n185533,525\n185533,1235\n185534,179170\n185535,1179\n185536,48\n185537,510\n185537,1722\n185537,3538\n185538,435\n185539,868\n185540,1893\n185541,450\n185542,55849\n185543,292\n185544,151\n185545,104\n185546,179170\n185547,179170\n185548,179170\n185549,104\n185550,577\n185551,104\n185552,536\n185553,843\n185554,3623\n185555,1231\n185556,142870\n185557,1515\n185558,875\n185559,1893\n185560,455\n185561,179170\n185562,1231\n185563,1381\n185565,217\n185566,1893\n185567,861\n185568,392\n185568,189839\n185569,366\n185570,366\n185571,366\n185572,5101\n185573,6955\n185574,366\n185575,179170\n185576,366\n185577,179170\n185578,1381\n185579,10\n185579,907\n185580,1849\n185581,3623\n185582,602\n185583,2367\n185584,2045\n185585,3623\n185586,179170\n185587,179170\n185588,179170\n185589,179170\n185590,3623\n185591,179170\n185592,392\n185593,179170\n185594,83\n185594,222\n185594,285\n185595,179170\n185597,5101\n185599,81\n185600,30\n185601,779\n185602,179170\n185603,592\n185604,104\n185605,3623\n185606,3623\n185607,631\n185608,30\n185609,30\n185610,292\n185610,462\n185611,179170\n185612,973\n185613,1877\n185614,483\n185615,211\n185616,30\n185617,30\n185618,3623\n185619,179170\n185620,179170\n185621,179170\n185622,4\n185622,5\n185623,113156\n185624,179170\n185625,422\n185626,56\n185628,1707\n185629,3623\n185630,79\n185631,3623\n185632,30\n185633,1370\n185634,30\n185635,3623\n185636,179170\n185637,1133\n185638,640\n185639,422\n185640,56\n185641,3623\n185642,893\n185643,83\n185644,349\n185645,636\n185646,72\n185647,179170\n185648,557\n185649,392\n185649,697\n185650,179170\n185651,264\n185652,179170\n185653,120\n185654,563\n185655,473\n185655,2367\n185656,56\n185657,422\n185658,65\n185659,138686\n185660,1707\n185661,175\n185662,179170\n185663,83\n185664,3623\n185665,179170\n185666,104\n185667,179170\n185668,179170\n185669,467\n185670,920\n185671,72\n185672,179170\n185673,1983\n185674,179170\n185675,179170\n185676,179170\n185677,147\n185678,138\n185678,304\n185678,609\n185678,805\n185678,1212\n185678,1888\n185678,2105\n185679,255\n185680,1052\n185681,3\n185682,179170\n185683,358\n185684,1474\n185685,673\n185686,30\n185687,596\n185688,918\n185689,179170\n185690,332\n185692,179170\n185693,179170\n185694,525\n185695,4545\n185695,56150\n185696,1449\n185697,1309\n185698,179170\n185699,1285\n185700,179170\n185701,788\n185702,30\n185703,185704\n185705,631\n185706,294\n185707,192\n185707,663\n185708,292\n185709,185710\n185711,718\n185713,179170\n185714,147123\n185715,3260\n185716,697\n185717,217\n185718,179170\n185719,95554\n185720,179170\n185721,473\n185722,77\n185723,30\n185724,185725\n185726,179170\n185727,1058\n185728,68\n185729,138686\n185730,175\n185731,779\n185732,527\n185732,1608\n185732,1860\n185732,1893\n185732,1984\n185732,2168\n185732,154408\n185733,30\n185734,450\n185735,2116\n185736,179170\n185737,179170\n185738,435\n185739,179170\n185740,577\n185741,9098\n185743,843\n185744,179170\n185745,536\n185746,932\n185747,422\n185748,422\n185749,422\n185750,422\n185751,72\n185752,422\n185753,422\n185754,422\n185755,422\n185756,422\n185757,422\n185758,422\n185759,861\n185760,422\n185761,1544\n185762,278\n185763,392\n185764,366\n185765,2775\n185766,447\n185767,366\n185768,4260\n185769,602\n185770,267\n185771,1821\n185771,21736\n185772,323\n185773,278\n185774,13980\n185775,215\n185777,1572\n185778,424\n185779,207\n185780,2775\n185781,447\n185782,179170\n185783,30\n185784,30\n185785,10\n185785,1773\n185785,1776\n185787,2590\n185788,30\n185789,1773\n185790,1836\n185791,179170\n185792,65\n185792,586\n185793,392\n185794,83\n185795,30\n185796,179170\n185797,450\n185798,818\n185799,872\n185800,900\n185801,1429\n185802,30\n185803,179170\n185804,179170\n185805,113156\n185806,185807\n185808,1782\n185809,30\n185810,668\n185811,202\n185812,185813\n185814,44\n185816,179170\n185817,185818\n185819,185820\n185821,1143\n185822,179170\n185823,424\n185824,138686\n185825,175\n185826,7124\n185827,179170\n185828,30\n185829,30\n185830,179170\n185831,185832\n185833,211\n185834,355\n185835,179170\n185836,145240\n185837,440\n185838,493\n185839,1634\n185840,250\n185840,1684\n185841,298\n185842,485\n185843,285\n185844,118\n185844,4597\n185847,1893\n185848,298\n185849,485\n185850,4691\n185851,202\n185852,2116\n185853,2048\n185854,137\n185855,1238\n185857,179170\n185858,2146\n185860,390\n185860,1479\n185860,1801\n185861,346\n185862,1058\n185863,71\n185864,292\n185864,1238\n185865,1452\n185867,5034\n185868,433\n185869,577\n185870,215\n185871,22\n185872,422\n185873,56\n185874,298\n185874,304\n185874,589\n185874,765\n185874,783\n185874,1085\n185874,1544\n185874,2572\n185874,2995\n185874,3094\n185874,3623\n185874,4222\n185874,16955\n185874,28832\n185874,44725\n185874,51972\n185874,75912\n185874,121863\n185874,178576\n185874,185877\n185874,221068\n185874,257104\n185875,305\n185876,179170\n185877,41\n185877,104\n185877,298\n185877,356\n185877,589\n185877,632\n185877,685\n185877,784\n185877,862\n185877,911\n185877,1085\n185877,1119\n185877,2204\n185877,2572\n185877,3623\n185877,3715\n185877,4532\n185877,5578\n185877,13637\n185877,25385\n185877,32692\n185877,58617\n185877,75912\n185877,81508\n185877,82703\n185877,93691\n185877,99756\n185877,126881\n185877,173427\n185877,178576\n185877,183822\n185877,185874\n185877,185877\n185877,186065\n185877,186471\n185877,186478\n185877,186511\n185877,186617\n185877,186852\n185877,187009\n185877,187585\n185877,189223\n185877,191113\n185877,191119\n185877,194573\n185877,205877\n185877,206230\n185877,211936\n185877,213937\n185877,217429\n185877,221068\n185877,230344\n185877,231072\n185877,247059\n185877,258065\n185877,258887\n185879,83\n185880,3630\n185881,23783\n185882,22\n185882,233\n185882,252\n185882,602\n185882,1070\n185882,1893\n185882,13361\n185884,356\n185884,1436\n185885,34\n185885,35\n185886,433\n185887,1572\n185888,671\n185889,179170\n185890,788\n185891,640\n185892,179170\n185893,179170\n185896,179170\n185897,179170\n185898,1220\n185898,1222\n185900,252\n185901,251\n185903,1227\n185903,86416\n185905,6661\n185906,151\n185907,5908\n185908,1860\n185909,1858\n185910,104\n185910,135\n185910,138\n185911,1807\n185912,186\n185913,1462\n185913,8537\n185914,202\n185915,1860\n185916,1858\n185917,79\n185918,2244\n185919,135\n185920,356\n185920,1243\n185921,1359\n185922,467\n185923,920\n185924,22\n185925,138686\n185926,1\n185928,175\n185929,30\n185930,483\n185931,30\n185932,30\n185934,259\n185934,457\n185934,2923\n185934,4190\n185935,171\n185936,596\n185937,301\n185938,1860\n185939,1858\n185940,657\n185941,1243\n185942,209\n185943,104\n185944,97\n185944,2209\n185945,1274\n185946,22\n185947,272\n185947,435\n185947,1893\n185948,2590\n185949,179170\n185950,3623\n185951,302\n185952,72\n185953,171\n185954,346\n185955,22\n185956,217\n185957,360\n185957,4571\n185958,30\n185959,2480\n185960,72\n185961,596\n185963,536\n185964,801\n185965,30\n185966,2334\n185967,1284\n185968,3623\n185969,56\n185970,1566\n185971,1566\n185972,87\n185972,1151\n185973,3623\n185974,240\n185975,171\n185976,3623\n185978,138686\n185979,296\n185980,240\n185980,1177\n185981,175\n185982,134\n185983,22\n185984,3623\n185985,3623\n185988,1007\n185989,195\n185990,299\n185990,972\n185990,973\n185990,175903\n185991,356\n185991,124668\n185993,135\n185993,4411\n185994,30\n185995,473\n185996,252\n185997,1220\n185997,1222\n185998,251\n185999,1860\n186000,1858\n186001,1127\n186002,2574\n186003,30\n186004,596\n186005,22\n186007,360\n186008,22\n186009,30\n186010,344\n186011,79\n186013,149\n186014,6059\n186015,72\n186016,146\n186016,92476\n186017,392\n186018,422\n186019,56\n186020,68\n186020,240\n186020,3367\n186020,9005\n186021,192\n186021,333\n186022,30\n186023,911\n186024,392\n186024,1143\n186025,30\n186026,1285\n186027,450\n186028,269\n186029,10\n186029,113156\n186031,1949\n186032,102\n186033,862\n186034,835\n186035,30\n186036,30\n186037,1133\n186038,192\n186038,577\n186038,1400\n186039,781\n186041,30\n186042,149\n186042,406\n186043,1133\n186044,752\n186046,1449\n186047,862\n186048,55849\n186049,55849\n186050,55849\n186051,138686\n186052,138\n186053,175\n186054,1858\n186055,1860\n186057,811\n186058,332\n186058,636\n186059,1010\n186060,289\n186060,290\n186060,94134\n186061,302\n186061,6303\n186062,30\n186063,422\n186064,56\n186065,10\n186065,41\n186065,104\n186065,431\n186065,588\n186065,590\n186065,784\n186065,1608\n186065,4220\n186065,4222\n186065,44725\n186065,66297\n186065,185877\n186065,192522\n186066,1803\n186067,179170\n186068,30\n186069,752\n186069,1133\n186070,30331\n186071,179170\n186072,1068\n186073,406\n186075,1805\n186077,3623\n186078,1118\n186079,3367\n186080,843\n186080,1785\n186081,788\n186082,8822\n186083,3623\n186084,392\n186085,868\n186085,156379\n186086,179170\n186087,68\n186088,10\n186089,83\n186090,3695\n186091,843\n186092,949\n186092,2671\n186093,3623\n186094,1133\n186095,3623\n186096,1858\n186097,1860\n186098,435\n186099,1149\n186100,298\n186101,142426\n186102,179170\n186103,179170\n186104,422\n186105,868\n186106,3623\n186107,1033\n186108,907\n186109,3\n186110,179170\n186111,83\n186112,302\n186113,1309\n186114,843\n186115,918\n186116,8854\n186117,360\n186119,179170\n186120,147\n186121,217\n186121,536\n186122,3623\n186123,968\n186124,30\n186125,301\n186126,366\n186128,366\n186130,366\n186131,515\n186132,3623\n186133,1635\n186134,485\n186135,298\n186136,179170\n186137,3695\n186138,2191\n186139,3623\n186140,3623\n186141,602\n186142,3623\n186143,30\n186144,179170\n186145,104\n186145,225\n186145,254\n186145,503\n186145,704\n186145,4355\n186146,302\n186148,138686\n186149,175\n186150,4771\n186152,918\n186153,179170\n186154,483\n186155,186156\n186155,196372\n186155,220143\n186155,247806\n186155,251785\n186155,257130\n186157,1014\n186158,563\n186159,179170\n186160,3623\n186161,179170\n186162,433\n186163,1541\n186165,179170\n186167,1644\n186168,147\n186169,920\n186171,179170\n186172,83\n186173,77\n186174,192\n186175,252\n186176,1220\n186176,1222\n186177,251\n186178,179170\n186179,179170\n186180,151\n186182,30\n186183,861\n186184,301\n186184,1782\n186185,186186\n186187,1370\n186189,160\n186190,30\n186192,1014\n186193,536\n186194,146\n186194,171\n186194,92476\n186195,1014\n186196,515\n186197,388\n186198,30\n186200,247\n186201,309\n186201,310\n186202,2116\n186203,179170\n186204,30\n186205,107\n186206,30\n186207,302\n186208,3252\n186209,151\n186210,690\n186211,6059\n186212,55849\n186213,7429\n186214,312\n186215,55849\n186216,179170\n186217,1345\n186218,30\n186219,83\n186220,13980\n186221,186222\n186221,229955\n186221,250352\n186221,251474\n186223,5101\n186224,602\n186225,360\n186225,4571\n186226,81\n186226,215\n186226,227\n186226,372\n186226,442\n186226,503\n186226,704\n186226,1149\n186226,1257\n186226,1392\n186226,1608\n186226,2379\n186226,3085\n186226,3507\n186226,9001\n186227,269\n186228,338\n186230,175\n186231,366\n186232,366\n186233,885\n186233,13704\n186234,366\n186235,366\n186236,366\n186237,1707\n186238,19227\n186239,718\n186240,186241\n186242,55849\n186243,577\n186244,663\n186245,20359\n186246,30\n186247,211\n186248,59021\n186249,622\n186250,3367\n186251,186252\n186253,752\n186255,30\n186255,328\n186256,3695\n186257,9025\n186258,1796\n186259,615\n186260,1\n186260,149\n186261,186262\n186264,18298\n186265,278\n186266,6059\n186267,3623\n186268,186269\n186270,30\n186271,179170\n186272,179170\n186273,179170\n186274,406\n186275,304\n186276,3260\n186277,602\n186278,179170\n186279,1368\n186280,5906\n186281,557\n186282,626\n186283,278\n186284,137\n186285,83\n186286,862\n186287,30\n186288,557\n186289,920\n186290,179170\n186291,151\n186292,179170\n186293,310\n186294,358\n186295,433\n186296,673\n186297,247\n186297,2867\n186297,2868\n186298,145240\n186299,862\n186300,179170\n186301,527\n186302,179170\n186303,1466\n186304,179170\n186305,406\n186305,620\n186306,1782\n186307,179170\n186308,147\n186309,179170\n186310,72\n186311,179170\n186312,2367\n186313,179170\n186314,250\n186314,1684\n186315,179170\n186316,179170\n186317,285\n186318,179170\n186319,192\n186319,222\n186319,590\n186319,1177\n186319,8270\n186319,182162\n186320,18726\n186321,328\n186322,179170\n186323,179170\n186324,1474\n186325,704\n186326,179170\n186327,1\n186329,30\n186330,900\n186331,186332\n186333,179170\n186334,179170\n186335,835\n186336,2931\n186337,179170\n186338,179170\n186339,561\n186339,911\n186340,850\n186341,179170\n186342,179170\n186343,179170\n186344,179170\n186345,179170\n186346,2620\n186347,2797\n186348,179170\n186349,186350\n186351,2315\n186352,485\n186353,298\n186354,160\n186355,30\n186356,138686\n186357,175\n186358,179170\n186359,3003\n186360,179170\n186361,179170\n186362,30\n186363,179170\n186364,179170\n186365,3623\n186366,697\n186367,13361\n186368,392\n186369,1149\n186370,30\n186371,483\n186372,179170\n186373,577\n186374,932\n186375,30\n186376,338\n186377,264\n186378,390\n186379,2083\n186380,1544\n186381,2045\n186382,30\n186383,1452\n186384,1551\n186385,3041\n186386,1007\n186387,30\n186388,6726\n186389,1033\n186390,72\n186391,30\n186392,1381\n186393,1639\n186394,588\n186394,590\n186394,1419\n186395,1452\n186396,581\n186397,1359\n186398,200\n186398,240\n186399,2116\n186400,1284\n186401,872\n186402,179170\n186403,1345\n186404,179170\n186405,179170\n186406,179170\n186407,179170\n186408,577\n186409,5440\n186410,179170\n186411,179170\n186412,179170\n186413,289\n186413,290\n186413,94134\n186414,179170\n186415,179170\n186416,1\n186417,186418\n186419,30\n186420,217\n186420,302\n186420,2146\n186420,42419\n186421,137\n186422,30\n186423,862\n186424,179170\n186425,285\n186426,250\n186426,1684\n186427,309\n186427,310\n186427,1052\n186427,2312\n186428,179170\n186429,589\n186429,862\n186429,1001\n186429,1474\n186429,44725\n186430,179170\n186431,301\n186431,861\n186431,893\n186431,2979\n186432,186433\n186434,179170\n186435,202\n186436,137\n186437,602\n186438,973\n186438,1284\n186438,1381\n186438,1419\n186439,186440\n186439,220388\n186441,1432\n186442,2590\n186443,179170\n186444,17309\n186445,179170\n186446,179170\n186448,30\n186449,2590\n186450,304\n186451,179170\n186453,2590\n186454,179170\n186455,94\n186455,2787\n186456,623\n186457,30\n186458,179170\n186459,1707\n186461,186462\n186463,872\n186464,255\n186465,5440\n186466,337\n186466,1749\n186467,179170\n186468,179170\n186469,179170\n186470,6059\n186471,185877\n186472,179170\n186473,577\n186474,1238\n186475,704\n186476,1454\n186477,1452\n186478,185877\n186479,467\n186480,6059\n186481,7155\n186482,694\n186483,366\n186484,485\n186485,298\n186486,366\n186487,366\n186488,366\n186489,366\n186490,87\n186491,366\n186492,366\n186493,366\n186495,1860\n186496,1858\n186497,3630\n186497,5301\n186498,366\n186499,366\n186500,485\n186501,366\n186502,640\n186503,5906\n186504,305\n186505,206\n186506,2979\n186507,1147\n186509,872\n186509,127158\n186510,155473\n186511,185877\n186512,577\n186513,278\n186514,328\n186515,138686\n186517,175\n186518,326\n186519,433\n186520,861\n186521,1147\n186522,693\n186522,19010\n186522,151398\n186522,186522\n186523,79\n186524,596\n186525,1179\n186526,186527\n186528,346\n186529,155473\n186530,1247\n186530,164572\n186531,142426\n186533,440\n186534,433\n186535,1252\n186535,1253\n186536,179170\n186537,433\n186538,1425\n186539,147\n186541,302\n186542,106\n186543,30\n186544,920\n186545,467\n186546,179170\n186547,891\n186548,83\n186549,179170\n186550,179170\n186551,2784\n186553,278\n186554,179170\n186555,868\n186556,1429\n186557,447\n186558,2775\n186559,1274\n186560,920\n186561,433\n186562,536\n186563,1707\n186564,450\n186566,671\n186567,1238\n186568,1220\n186568,1222\n186569,252\n186570,287\n186570,19010\n186571,251\n186572,209\n186573,151\n186574,1465\n186574,76096\n186575,207\n186577,15807\n186579,392\n186580,389\n186581,872\n186582,1707\n186583,422\n186584,422\n186585,599\n186586,433\n186587,186588\n186590,861\n186591,422\n186592,422\n186593,422\n186594,422\n186595,422\n186596,422\n186597,422\n186598,422\n186599,422\n186600,422\n186601,1085\n186602,338\n186604,2775\n186605,447\n186606,1147\n186607,1085\n186607,1179\n186608,34\n186608,35\n186608,1313\n186608,5326\n186610,328\n186611,30\n186613,215\n186615,779\n186616,3367\n186617,185877\n186618,872\n186619,602\n186620,467\n186623,2590\n186624,336\n186626,389\n186628,3094\n186629,668\n186630,147\n186630,406\n186632,2411\n186633,406\n186634,1801\n186635,142430\n186636,6059\n186637,779\n186638,1252\n186638,1253\n186639,30\n186640,1143\n186641,1381\n186642,202\n186644,1118\n186646,217\n186648,1019\n186649,20\n186650,1179\n186652,1010\n186653,1858\n186654,392\n186657,937\n186657,968\n186657,2217\n186657,103860\n186657,173207\n186657,186657\n186657,232802\n186657,235853\n186657,235946\n186657,263974\n186658,9457\n186659,179170\n186660,195\n186661,186662\n186663,1179\n186664,179170\n186665,622\n186665,1033\n186665,1531\n186666,424\n186668,3623\n186670,918\n186671,328\n186673,602\n186674,30\n186675,20\n186675,336\n186675,918\n186675,972\n186675,1147\n186676,3695\n186677,717\n186677,2116\n186678,3653\n186678,230520\n186679,147\n186680,8854\n186681,366\n186681,893\n186683,2784\n186684,996\n186685,186686\n186687,1105\n186688,292\n186689,809\n186690,1284\n186691,2617\n186692,1133\n186693,1012\n186694,2590\n186695,163\n186696,918\n186697,30\n186698,178\n186699,179170\n186700,435\n186701,179170\n186702,30\n186703,146\n186703,158\n186703,192\n186703,202\n186703,285\n186703,620\n186703,1893\n186703,92476\n186704,179170\n186705,179170\n186707,2646\n186708,515\n186710,30\n186711,30\n186712,30\n186713,179170\n186714,192\n186715,179170\n186716,179170\n186717,179170\n186718,30\n186719,843\n186720,298\n186720,2296\n186721,389\n186722,920\n186723,186724\n186725,34\n186725,35\n186726,5213\n186727,186728\n186729,192\n186730,30\n186731,302\n186732,30\n186733,56\n186734,422\n186736,717\n186737,113156\n186738,211\n186739,1544\n186740,4611\n186741,186742\n186743,406\n186744,195\n186745,30\n186747,781\n186748,1132\n186749,179170\n186750,30\n186751,186752\n186753,179170\n186754,30\n186755,179170\n186756,631\n186757,309\n186757,310\n186758,225\n186759,1058\n186760,200\n186761,195\n186762,186763\n186765,151\n186767,179170\n186768,1132\n186769,781\n186770,179170\n186771,980\n186773,83\n186774,932\n186775,179170\n186776,577\n186777,1192\n186778,536\n186780,326\n186781,1\n186782,2045\n186783,1240\n186784,179170\n186786,623\n186788,22\n186789,217\n186789,240\n186789,301\n186789,372\n186789,631\n186789,1001\n186789,1010\n186789,1085\n186789,1522\n186789,1715\n186790,1010\n186791,30\n186792,278\n186793,179170\n186794,1220\n186794,1222\n186795,516\n186796,252\n186797,200\n186798,366\n186799,200\n186800,366\n186801,366\n186802,647\n186803,146\n186803,92476\n186804,344\n186805,179170\n186806,366\n186807,1522\n186808,179170\n186810,179170\n186811,179170\n186812,577\n186813,809\n186814,30\n186815,179170\n186816,1181\n186817,1474\n186818,515\n186819,1572\n186820,1805\n186821,313\n186822,389\n186823,1122\n186824,179170\n186825,179170\n186826,2443\n186827,1359\n186828,179170\n186829,1388\n186830,313\n186830,389\n186832,1785\n186833,589\n186834,1167\n186835,605\n186836,264\n186837,1124\n186838,1241\n186839,1782\n186840,2735\n186841,973\n186842,86\n186843,30\n186844,10\n186845,179170\n186846,186847\n186848,179170\n186849,179170\n186850,192\n186851,3623\n186852,185877\n186852,189788\n186853,932\n186854,179170\n186855,179170\n186856,1893\n186857,179170\n186858,422\n186859,56\n186860,852\n186861,435\n186862,240\n186863,192\n186863,2668\n186864,697\n186865,1474\n186866,1085\n186867,267\n186868,179170\n186869,10\n186870,328\n186871,483\n186872,392\n186873,179170\n186874,843\n186875,596\n186876,141912\n186877,179170\n186878,149\n186878,158\n186879,55849\n186880,179170\n186881,577\n186882,949\n186883,1\n186884,602\n186885,4594\n186886,55849\n186887,179170\n186888,527\n186888,740\n186888,741\n186889,3623\n186890,192\n186891,3623\n186892,3623\n186893,3623\n186894,3623\n186895,179170\n186896,179170\n186897,206\n186898,145240\n186899,179170\n186900,104\n186900,2574\n186900,124668\n186902,577\n186903,179170\n186905,179170\n186906,179170\n186907,179170\n186908,8822\n186909,563\n186910,435\n186911,30\n186912,41\n186913,179170\n186914,862\n186915,3623\n186916,5366\n186917,15748\n186918,843\n186919,358\n186920,30\n186921,179170\n186922,557\n186923,179170\n186924,1235\n186924,1335\n186925,1860\n186926,1858\n186927,86\n186928,179170\n186929,179170\n186930,3695\n186931,299\n186932,30\n186933,19356\n186934,179170\n186935,510\n186936,3\n186937,179170\n186938,179170\n186939,422\n186940,422\n186941,422\n186942,422\n186943,422\n186944,422\n186945,422\n186946,422\n186947,422\n186948,422\n186949,422\n186950,422\n186951,422\n186952,179170\n186953,179170\n186954,179170\n186955,179170\n186956,186957\n186958,179170\n186959,83\n186959,217\n186959,536\n186959,1893\n186959,13575\n186959,20359\n186960,392\n186961,1319\n186962,175\n186963,50\n186964,3297\n186965,179170\n186966,179170\n186967,269\n186968,344\n186969,2868\n186969,7360\n186970,179170\n186971,217\n186972,671\n186973,1132\n186974,83\n186975,179170\n186976,595\n186977,1836\n186978,6303\n186979,30\n186980,424\n186981,179170\n186982,179170\n186983,179170\n186984,30\n186985,179170\n186986,179170\n186987,34\n186987,35\n186988,137\n186991,649\n186992,1414\n186993,1849\n186994,137\n186995,179170\n186996,83\n186997,149\n186998,140\n186999,187000\n187001,2750\n187002,433\n187003,302\n187004,355\n187005,390\n187006,1653\n187007,6303\n187009,185877\n187010,932\n187011,2557\n187012,175\n187013,310\n187013,875\n187013,3039\n187014,2205\n187014,33424\n187015,160\n187016,1566\n187017,980\n187019,146\n187019,92476\n187020,344\n187021,647\n187022,179170\n187023,1572\n187024,3331\n187025,147\n187026,72\n187027,1238\n187028,397\n187030,2048\n187031,49057\n187032,535\n187033,1634\n187034,2607\n187035,455\n187036,968\n187037,392\n187038,360\n187039,697\n187040,1149\n187041,868\n187042,206\n187043,195\n187044,22\n187045,503\n187046,433\n187047,628\n187048,750\n187049,5366\n187050,379\n187051,599\n187052,1782\n187053,302\n187054,1231\n187055,77\n187056,1163\n187057,920\n187058,397\n187059,1085\n187060,65\n187061,1888\n187062,3085\n187063,435\n187064,1849\n187066,255\n187067,422\n187068,3830\n187069,3695\n187070,72764\n187071,602\n187072,240\n187074,588\n187074,590\n187075,861\n187076,622\n187077,1149\n187078,406\n187079,366\n187080,497\n187081,491\n187082,1058\n187083,872\n187084,79\n187085,4\n187085,5\n187086,1973\n187087,10\n187088,269\n187089,438\n187090,2312\n187091,1572\n187093,252\n187094,2674\n187095,1531\n187096,240\n187097,143287\n187098,1284\n187099,259\n187100,479\n187101,1085\n187102,301\n187103,3182\n187104,1132\n187105,781\n187107,1284\n187108,668\n187109,302\n187110,1452\n187111,160\n187112,1631\n187113,397\n187114,256\n187115,248\n187116,1939\n187117,273\n187119,668\n187120,146280\n187121,273\n187122,3135\n187123,192\n187124,1454\n187125,60576\n187126,1452\n187127,1849\n187128,158\n187129,1345\n187130,1663\n187131,397\n187131,671\n187131,4771\n187131,30331\n187132,2253\n187133,6824\n187134,346\n187135,120\n187136,1388\n187137,1033\n187138,1192\n187139,207\n187140,1191\n187141,179170\n187142,1175\n187143,1849\n187144,707\n187145,422\n187146,52232\n187147,673\n187149,1192\n187150,130\n187151,1572\n187152,2253\n187153,397\n187154,79\n187155,187\n187156,20757\n187157,3297\n187158,726\n187159,1001\n187160,287\n187161,147\n187162,287\n187163,4823\n187164,861\n187165,707\n187166,1300\n187167,302\n187168,467\n187169,920\n187170,252\n187171,4571\n187172,1191\n187173,195\n187174,29294\n187175,187176\n187176,167\n187176,457\n187176,937\n187176,972\n187176,973\n187176,1117\n187176,1284\n187176,1298\n187176,1616\n187176,1853\n187176,2557\n187176,3804\n187176,18880\n187176,78882\n187176,82746\n187176,92017\n187176,107616\n187176,114682\n187176,124668\n187176,134111\n187176,137059\n187176,171641\n187176,187176\n187176,188645\n187176,192991\n187176,193646\n187176,205011\n187176,212556\n187176,214113\n187176,218884\n187176,219767\n187176,219796\n187176,222355\n187176,222558\n187176,227341\n187176,228935\n187176,229585\n187176,230427\n187176,231132\n187176,232057\n187176,237320\n187176,238068\n187176,239791\n187176,241057\n187176,244105\n187176,245254\n187176,247245\n187176,247248\n187176,251845\n187176,254826\n187176,256245\n187176,258803\n187176,258806\n187176,259646\n187176,263268\n187176,263727\n187177,652\n187178,66297\n187179,1631\n187180,68\n187181,457\n187182,328\n187183,760\n187184,3135\n187185,240\n187186,55849\n187187,5906\n187188,805\n187189,1309\n187190,577\n187190,623\n187191,1192\n187192,68\n187194,2253\n187196,10\n187197,32\n187198,2671\n187199,557\n187200,310\n187201,557\n187202,5547\n187203,483\n187203,13538\n187204,349\n187205,450\n187207,192\n187208,457\n187209,167\n187209,301\n187209,968\n187209,1522\n187209,2083\n187209,2557\n187209,3422\n187210,1326\n187211,843\n187212,3297\n187213,81070\n187214,718\n187215,217\n187216,4223\n187217,179170\n187218,336\n187219,690\n187220,1844\n187221,1572\n187222,1634\n187223,1319\n187224,2017\n187225,1085\n187226,68\n187227,222\n187228,22\n187229,1167\n187230,81070\n187231,811\n187232,309\n187232,310\n187232,1294\n187233,4637\n187234,1821\n187234,21736\n187235,151\n187236,1844\n187237,255\n187238,1043\n187239,1147\n187240,2083\n187241,252\n187242,5192\n187243,1673\n187244,3\n187245,718\n187246,1140\n187247,516\n187248,505\n187249,1163\n187250,63\n187251,349\n187252,240\n187253,1836\n187254,8149\n187255,1572\n187256,1390\n187257,1425\n187258,397\n187259,1458\n187260,2371\n187261,217\n187262,5101\n187263,390\n187264,1782\n187265,2620\n187266,301\n187267,652\n187268,489\n187269,1016\n187270,736\n187271,211\n187272,86\n187273,1235\n187273,1335\n187274,992\n187275,2017\n187276,5192\n187277,147\n187278,527\n187279,483\n187280,752\n187281,872\n187282,179170\n187283,516\n187284,392\n187284,1572\n187286,647\n187287,146\n187287,92476\n187288,344\n187289,2784\n187290,146\n187290,92476\n187291,647\n187292,344\n187293,149\n187293,406\n187293,1425\n187294,146\n187294,92476\n187295,647\n187296,344\n187297,66297\n187298,1179\n187299,315\n187300,314\n187300,1749\n187301,2931\n187302,1572\n187303,30\n187303,1179\n187303,1939\n187304,130\n187304,1007\n187304,36819\n187305,146\n187305,92476\n187306,344\n187307,647\n187308,179170\n187309,6214\n187310,261\n187310,333\n187311,179170\n187312,1019\n187313,647\n187314,146\n187314,92476\n187315,344\n187316,685\n187317,1001\n187318,6695\n187319,287\n187320,179170\n187321,287\n187322,41\n187323,179170\n187326,138686\n187327,126\n187328,175\n187329,1844\n187330,356\n187331,80266\n187332,287\n187333,60576\n187335,178\n187336,788\n187337,68069\n187338,652\n187339,2315\n187340,1844\n187341,146\n187341,92476\n187342,344\n187343,647\n187344,1014\n187345,1014\n187346,417\n187347,1012\n187348,60576\n187349,146\n187349,92476\n187350,647\n187351,344\n187352,1014\n187353,1014\n187354,1014\n187355,1014\n187356,1014\n187357,1014\n187358,1014\n187359,1014\n187360,1014\n187361,1014\n187362,146\n187362,92476\n187363,647\n187364,344\n187365,1014\n187366,1014\n187367,344\n187368,647\n187369,146\n187369,92476\n187370,1572\n187371,146\n187371,92476\n187372,344\n187373,647\n187374,179170\n187375,516\n187375,8788\n187376,179170\n187377,1769\n187380,2867\n187380,2868\n187381,217\n187382,146\n187382,92476\n187383,647\n187384,344\n187385,151\n187387,344\n187388,146\n187388,92476\n187389,647\n187390,1769\n187392,515\n187393,3623\n187394,146\n187394,92476\n187395,344\n187396,647\n187397,1058\n187398,302\n187399,179170\n187400,192\n187401,647\n187402,344\n187403,146\n187403,92476\n187404,994\n187405,252\n187406,918\n187407,1012\n187408,1801\n187409,877\n187410,248\n187410,596\n187411,852\n187412,146\n187412,92476\n187413,647\n187414,344\n187415,1167\n187417,146\n187417,92476\n187418,647\n187419,344\n187420,872\n187420,127158\n187423,3623\n187424,1140\n187426,1769\n187427,859\n187428,1458\n187429,1769\n187430,440\n187432,285\n187433,184\n187434,146\n187434,92476\n187435,647\n187436,344\n187437,118\n187437,4597\n187438,314\n187438,467\n187438,1844\n187439,158\n187439,406\n187440,30\n187441,835\n187442,2590\n187443,146\n187443,92476\n187444,647\n187445,344\n187446,1118\n187446,1417\n187447,81\n187447,805\n187448,1821\n187448,21736\n187449,72\n187450,187451\n187452,113140\n187453,344\n187454,146\n187454,92476\n187455,647\n187456,1740\n187457,149\n187457,406\n187458,252\n187459,920\n187460,30\n187461,647\n187462,146\n187462,92476\n187463,344\n187465,72\n187466,30\n187467,195\n187467,1904\n187468,187\n187469,2146\n187470,3623\n187471,3507\n187472,106\n187473,179170\n187474,179170\n187475,435\n187476,222\n187476,2051\n187477,422\n187478,1634\n187480,364\n187481,422\n187482,2315\n187483,138686\n187484,980\n187485,138686\n187486,175\n187487,717\n187488,843\n187489,151\n187490,647\n187491,146\n187491,92476\n187492,344\n187493,1749\n187494,30\n187495,72\n187496,179170\n187497,184\n187499,1151\n187500,647\n187501,146\n187501,92476\n187502,344\n187503,752\n187504,340\n187505,30\n187506,269\n187507,515\n187508,146\n187508,92476\n187509,647\n187510,344\n187511,3623\n187512,30\n187513,30\n187514,309\n187514,310\n187514,1294\n187515,1402\n187516,3422\n187517,30\n187518,30\n187519,393\n187520,1085\n187521,72\n187522,30\n187524,179170\n187525,1\n187526,435\n187529,179170\n187530,1531\n187531,63\n187532,3623\n187533,3623\n187534,73570\n187535,843\n187536,30\n187537,138686\n187538,175\n187539,179170\n187540,3695\n187541,285\n187542,3623\n187543,22\n187543,2083\n187543,50321\n187544,72\n187545,862\n187546,81\n187547,1453\n187548,1287\n187549,72\n187550,1085\n187551,250\n187551,1684\n187552,255\n187553,1235\n187553,2209\n187553,8788\n187553,21711\n187553,29294\n187554,179170\n187555,809\n187556,158\n187557,206\n187558,626\n187559,1775\n187559,171294\n187560,179170\n187561,1644\n187562,366\n187563,366\n187564,366\n187565,366\n187566,366\n187567,841\n187568,55849\n187569,55849\n187570,1\n187571,83\n187572,302\n187572,579\n187572,811\n187572,893\n187573,285\n187574,179170\n187575,32\n187575,1151\n187576,179170\n187577,146\n187577,92476\n187578,647\n187579,344\n187580,1381\n187581,215\n187582,211\n187583,1860\n187584,1858\n187585,185877\n187586,207\n187587,1181\n187588,2146\n187589,328\n187589,7124\n187590,179170\n187591,557\n187592,862\n187594,557\n187595,138\n187596,865\n187597,557\n187598,137\n187599,118\n187599,4597\n187600,88820\n187601,68\n187602,104\n187603,187604\n187605,147\n187606,179170\n187607,146\n187607,92476\n187608,647\n187609,344\n187610,158\n187611,1616\n187612,146\n187612,92476\n187613,344\n187614,647\n187615,179170\n187616,379\n187616,760\n187617,2620\n187618,647\n187619,146\n187619,92476\n187620,344\n187621,179170\n187622,179170\n187623,179170\n187624,2784\n187625,179170\n187626,37\n187627,23783\n187628,1983\n187629,179170\n187630,187631\n187632,332\n187633,179170\n187634,250\n187634,1684\n187635,179170\n187636,179170\n187637,179170\n187638,138686\n187639,175\n187640,28203\n187641,179170\n187642,1\n187643,179170\n187644,179170\n187645,1\n187646,179170\n187647,179170\n187648,485\n187649,298\n187650,44\n187651,298\n187652,485\n187653,136\n187653,1019\n187653,2266\n187654,1227\n187654,86416\n187655,179170\n187656,211\n187657,5366\n187658,179170\n187659,171\n187660,171\n187661,298\n187662,485\n187663,179170\n187664,1238\n187665,179170\n187666,83\n187667,179170\n187668,187669\n187670,1267\n187671,250\n187671,1684\n187672,113156\n187673,285\n187674,3507\n187675,10\n187675,273\n187676,2416\n187676,2417\n187677,422\n187678,422\n187679,422\n187680,422\n187681,422\n187682,104\n187683,422\n187684,422\n187685,422\n187686,422\n187687,422\n187688,422\n187689,422\n187690,217\n187691,179170\n187692,179170\n187693,1227\n187693,86416\n187694,184\n187694,2443\n187695,1\n187696,4903\n187697,83\n187698,179170\n187699,718\n187700,390\n187701,151\n187701,663\n187702,1773\n187703,285\n187704,72\n187705,34580\n187706,417\n187707,250\n187707,1684\n187708,557\n187709,187710\n187711,137\n187712,358\n187713,1474\n187714,250\n187714,1684\n187715,589\n187715,1001\n187716,285\n187717,285\n187718,2590\n187719,346\n187720,30\n187721,250\n187721,1684\n187722,285\n187723,225\n187724,187725\n187726,673\n187727,592\n187727,1285\n187727,1572\n187727,1773\n187727,2266\n187727,5265\n187728,392\n187729,30\n187730,366\n187731,366\n187732,346\n187733,8884\n187734,3804\n187735,1085\n187736,4678\n187737,142405\n187738,346\n187739,355\n187740,302\n187741,647\n187742,344\n187743,146\n187743,92476\n187744,2116\n187745,187746\n187747,2367\n187747,4146\n187748,187749\n187750,83\n187751,344\n187752,647\n187753,146\n187753,92476\n187754,483\n187755,424\n187756,932\n187757,577\n187758,15748\n187759,206\n187760,146\n187760,92476\n187761,647\n187762,344\n187764,647\n187765,344\n187766,843\n187767,356\n187768,141912\n187769,146\n187769,92476\n187770,83\n187771,146\n187771,92476\n187772,647\n187773,344\n187774,2315\n187775,4571\n187776,3623\n187777,841\n187778,202\n187779,2048\n187780,206\n187780,7124\n187781,872\n187782,1429\n187783,2590\n187784,1143\n187785,668\n187786,179170\n187787,187788\n187789,6303\n187790,9028\n187791,1955\n187794,3695\n187795,72\n187796,155481\n187797,42574\n187798,1014\n187799,179170\n187800,1014\n187801,1014\n187802,996\n187803,1014\n187804,1014\n187805,127158\n187806,1014\n187807,1014\n187808,1381\n187809,187810\n187811,1014\n187812,1014\n187813,1\n187814,136\n187815,72\n187816,72\n187817,179170\n187819,298\n187820,485\n187821,743\n187821,4823\n187822,602\n187823,179170\n187824,179170\n187825,179170\n187826,19010\n187827,179170\n187828,483\n187829,269\n187831,1590\n187832,30\n187833,344\n187834,647\n187835,146\n187835,92476\n187836,602\n187837,136\n187838,179170\n187839,4545\n187839,56150\n187840,647\n187841,344\n187842,146\n187842,92476\n187843,187844\n187843,248419\n187845,1608\n187846,1132\n187847,179170\n187848,179170\n187849,179170\n187850,179170\n187851,134\n187852,298\n187853,485\n187854,179170\n187855,1298\n187856,298\n187857,485\n187858,187859\n187860,30\n187861,179170\n187862,15807\n187863,179170\n187864,86832\n187865,1707\n187866,252\n187866,516\n187866,1220\n187866,1222\n187867,450\n187868,1479\n187869,30\n187870,390\n187871,2073\n187872,2506\n187873,366\n187874,366\n187875,366\n187876,44\n187877,366\n187879,298\n187880,485\n187881,97\n187882,67640\n187883,52811\n187884,187885\n187886,298\n187887,485\n187888,602\n187889,1773\n187890,588\n187890,590\n187891,1773\n187892,179170\n187893,1014\n187894,1014\n187895,1014\n187896,1014\n187897,1014\n187898,366\n187900,254\n187901,187902\n187903,187904\n187905,1133\n187906,142430\n187907,1058\n187908,1181\n187909,536\n187910,285\n187910,1515\n187911,577\n187913,179170\n187914,179170\n187916,179170\n187917,346\n187918,217\n187919,179170\n187920,932\n187921,179170\n187922,187923\n187924,179170\n187925,346\n187926,346\n187927,179170\n187928,247\n187929,1133\n187929,8992\n187930,355\n187931,179170\n187932,252\n187933,516\n187934,1220\n187934,1222\n187935,217\n187936,8270\n187937,20790\n187938,187939\n187940,107\n187941,2416\n187941,2417\n187942,292\n187943,338\n187944,298\n187945,1133\n187946,3538\n187947,142405\n187948,187949\n187950,127158\n187951,269\n187952,175\n187953,2334\n187954,1769\n187955,714\n187956,137\n187957,179170\n187958,557\n187959,187960\n187961,811\n187962,781\n187963,1132\n187964,874\n187965,485\n187966,298\n187967,30\n187968,1220\n187968,1222\n187969,516\n187970,252\n187971,1983\n187972,30\n187973,393\n187974,1151\n187978,1927\n187979,187980\n187982,76096\n187983,355\n187984,7124\n187987,179170\n187988,179170\n187989,179170\n187990,179170\n187991,179170\n187992,179170\n187993,179170\n187994,179170\n187995,179170\n187996,179170\n187997,179170\n187998,179170\n187999,179170\n188000,179170\n188001,179170\n188002,179170\n188003,179170\n188004,179170\n188005,179170\n188006,179170\n188007,179170\n188008,179170\n188009,179170\n188010,179170\n188011,179170\n188012,179170\n188013,179170\n188014,179170\n188015,179170\n188016,179170\n188017,179170\n188018,179170\n188019,179170\n188020,179170\n188021,179170\n188022,179170\n188023,179170\n188024,179170\n188025,179170\n188026,179170\n188027,179170\n188028,179170\n188029,179170\n188030,179170\n188031,179170\n188032,179170\n188033,179170\n188034,179170\n188035,179170\n188036,30331\n188037,179170\n188038,179170\n188039,179170\n188040,344\n188041,146\n188041,92476\n188042,647\n188043,392\n188043,1769\n188044,30\n188045,138686\n188046,175\n188047,44\n188048,72\n188049,852\n188050,493\n188051,179170\n188052,54\n188053,179170\n188055,19010\n188056,179170\n188057,99\n188058,99\n188059,15807\n188060,483\n188061,1359\n188062,188063\n188064,577\n188065,298\n188066,485\n188068,30\n188069,406\n188070,147123\n188071,30\n188072,1181\n188073,360\n188074,55849\n188075,179170\n188076,2421\n188077,44725\n188078,2367\n188079,76096\n188080,179170\n188082,30\n188083,872\n188084,1707\n188085,30\n188086,1133\n188088,493\n188089,58\n188090,30\n188091,15807\n188092,48\n188093,179170\n188094,99\n188095,1551\n188096,1769\n188097,179170\n188098,142473\n188099,1458\n188100,3695\n188101,99\n188102,602\n188103,99\n188104,179170\n188105,179170\n188106,179170\n188107,179170\n188108,179170\n188109,179170\n188110,99\n188111,179170\n188112,188113\n188114,30\n188115,179170\n188116,179170\n188117,179170\n188118,179170\n188119,137\n188120,137\n188121,179170\n188122,3623\n188123,577\n188124,611\n188125,333\n188125,60576\n188126,1467\n188128,195\n188129,3041\n188130,30\n188131,151\n188132,30\n188133,2590\n188134,932\n188135,809\n188136,500\n188137,972\n188138,4101\n188139,366\n188140,292\n188141,292\n188142,294\n188143,296\n188144,298\n188145,843\n188146,30\n188147,3695\n188148,30\n188149,3182\n188150,2073\n188151,3\n188151,510\n188152,920\n188153,269\n188154,119\n188155,118\n188155,4597\n188156,640\n188157,366\n188158,366\n188159,188160\n188161,44\n188162,298\n188163,1807\n188164,30\n188165,355\n188166,433\n188167,184\n188168,83\n188169,3695\n188170,285\n188171,31977\n188172,636\n188173,179170\n188174,3695\n188175,433\n188176,1276\n188176,27041\n188177,1238\n188178,875\n188179,1452\n188180,875\n188181,872\n188182,872\n188183,151\n188184,1462\n188184,2995\n188185,179170\n188186,872\n188187,179170\n188188,179170\n188189,188190\n188191,179170\n188192,179170\n188193,2646\n188194,179170\n188195,640\n188196,640\n188197,467\n188197,872\n188198,310\n188198,483\n188198,3039\n188199,433\n188200,671\n188201,485\n188202,302\n188203,920\n188204,663\n188205,179170\n188206,467\n188207,344\n188208,647\n188209,146\n188209,92476\n188210,3474\n188211,275\n188212,181992\n188213,447\n188214,2775\n188215,178\n188216,309\n188216,310\n188217,13546\n188218,179170\n188219,3695\n188220,1238\n188221,179170\n188222,41\n188222,294\n188222,631\n188223,83\n188224,217\n188225,2105\n188226,592\n188228,188229\n188230,158\n188230,622\n188231,99\n188232,186\n188232,1326\n188232,1849\n188233,142870\n188234,503\n188235,433\n188236,433\n188237,2315\n188238,298\n188239,485\n188240,147\n188240,158\n188240,406\n188240,1458\n188240,80266\n188240,89035\n188241,32475\n188242,138686\n188243,175\n188244,275\n188246,3949\n188247,682\n188247,72439\n188248,1181\n188249,188250\n188251,162599\n188252,217\n188253,1257\n188253,1454\n188254,346\n188255,179170\n188256,111\n188256,1119\n188257,278\n188258,83\n188259,217\n188262,3623\n188263,455\n188263,657\n188264,1014\n188265,1014\n188266,1014\n188267,179170\n188268,1014\n188269,1014\n188270,1014\n188271,1014\n188272,312\n188273,647\n188274,146\n188274,92476\n188275,344\n188276,312\n188276,2605\n188277,302\n188278,868\n188278,156379\n188279,179170\n188280,433\n188281,1821\n188281,21736\n188283,687\n188284,2244\n188285,2244\n188286,515\n188287,217\n188288,179170\n188289,179170\n188290,202\n188291,30\n188292,6303\n188293,30\n188294,30\n188295,3182\n188296,142405\n188297,588\n188297,590\n188297,1419\n188298,217\n188298,536\n188298,577\n188298,1429\n188298,1608\n188299,1454\n188300,99\n188301,663\n188302,707\n188303,862\n188304,285\n188305,151\n188306,179170\n188307,99\n188309,557\n188310,1085\n188311,435\n188312,1181\n188314,1769\n188315,366\n188316,179170\n188317,1132\n188318,1608\n188319,843\n188320,3623\n188321,179170\n188323,536\n188324,179170\n188325,1616\n188326,859\n188327,1608\n188328,1132\n188329,1634\n188330,30\n188331,179170\n188332,557\n188333,179170\n188334,500\n188335,1962\n188336,54\n188337,1052\n188338,1882\n188339,2775\n188340,30\n188341,179170\n188342,179170\n188343,3623\n188344,994\n188345,179170\n188346,179170\n188347,994\n188348,179170\n188349,1247\n188349,164572\n188350,452\n188351,35\n188351,83\n188352,184\n188353,179170\n188354,179170\n188355,179170\n188356,217\n188357,628\n188358,422\n188359,422\n188360,422\n188361,422\n188362,422\n188363,179170\n188364,422\n188365,422\n188366,422\n188367,422\n188368,422\n188369,422\n188370,422\n188371,1\n188372,179170\n188373,433\n188374,1882\n188375,932\n188376,217\n188377,192\n188378,179170\n188379,1\n188380,1332\n188381,920\n188382,179170\n188383,1844\n188384,30\n188385,175\n188386,179170\n188387,179170\n188388,158\n188388,640\n188388,1572\n188389,179170\n188390,1\n188390,147\n188390,149\n188391,146\n188391,92476\n188392,647\n188393,344\n188394,188395\n188396,179170\n188398,179170\n188399,994\n188400,179170\n188401,994\n188402,7416\n188403,179170\n188404,1\n188405,17309\n188406,868\n188406,162599\n188407,493\n188407,1927\n188408,843\n188409,483\n188410,536\n188411,30\n188412,1769\n188413,30\n188414,179170\n188415,2073\n188416,1\n188417,217\n188418,179170\n188419,179170\n188420,179170\n188421,1821\n188421,21736\n188422,179170\n188423,179170\n188424,179170\n188425,3538\n188426,179170\n188427,179170\n188428,577\n188429,3623\n188430,3623\n188431,493\n188432,179170\n188433,137\n188434,188435\n188436,366\n188437,366\n188438,188439\n188440,510\n188440,3407\n188440,3743\n188440,5043\n188440,34116\n188440,35978\n188440,71184\n188440,232037\n188441,23783\n188442,179170\n188443,312\n188444,872\n188445,949\n188446,273\n188447,56\n188448,422\n188449,77\n188450,563\n188451,462\n188452,1467\n188453,179170\n188454,2105\n188455,179170\n188456,388\n188457,118\n188457,422\n188457,4597\n188457,5405\n188458,195\n188459,2424\n188460,269\n188461,217\n188462,536\n188463,178\n188464,1368\n188465,1381\n188466,1566\n188467,23783\n188468,479\n188469,1052\n188470,179170\n188471,63\n188472,68\n188472,431\n188472,589\n188472,631\n188472,862\n188472,994\n188472,1001\n188472,1085\n188472,1474\n188472,2590\n188472,8884\n188472,44725\n188473,2244\n188474,179170\n188476,13980\n188477,577\n188478,3623\n188479,500\n188480,240\n188482,102\n188483,647\n188484,344\n188485,146\n188485,92476\n188486,3949\n188487,355\n188488,188489\n188490,1769\n188491,647\n188492,344\n188493,146\n188493,92476\n188494,647\n188495,146\n188495,92476\n188496,344\n188497,344\n188498,647\n188499,146\n188499,92476\n188500,171\n188501,433\n188502,433\n188504,142426\n188505,120\n188506,188507\n188510,23701\n188511,2929\n188512,1132\n188513,1608\n188514,455\n188515,149\n188516,156379\n188517,447\n188518,2775\n188519,788\n188520,4237\n188520,182162\n188522,312\n188523,435\n188523,538\n188523,671\n188523,188524\n188525,1860\n188526,1858\n188528,583\n188529,162599\n188531,2867\n188531,2868\n188532,1282\n188533,285\n188534,1801\n188535,285\n188537,640\n188538,640\n188539,640\n188540,1454\n188541,206\n188541,6119\n188543,527\n188543,972\n188544,703\n188545,4611\n188546,1544\n188547,1984\n188547,3949\n188548,287\n188548,19010\n188549,4611\n188550,1544\n188551,1247\n188551,164572\n188552,5375\n188554,1247\n188554,164572\n188555,1119\n188556,147\n188557,1749\n188559,346\n188561,72\n188562,344\n188563,285\n188564,596\n188564,873\n188564,1368\n188564,16153\n188565,30\n188566,304\n188567,1298\n188568,247\n188569,60576\n188570,920\n188571,188572\n188573,104\n188573,134\n188576,652\n188577,467\n188578,188572\n188579,1818\n188579,69440\n188579,188580\n188579,190153\n188579,193043\n188581,48\n188582,652\n188583,515\n188584,595\n188584,1453\n188585,515\n188587,167\n188588,118336\n188589,309\n188589,310\n188590,206\n188592,60576\n188593,911\n188594,586\n188595,292\n188597,422\n188598,344\n188599,60576\n188600,328\n188601,422\n188602,211\n188603,1858\n188604,1860\n188605,907\n188607,179170\n188608,2784\n188609,450\n188611,493\n188612,140\n188613,30\n188613,63\n188613,332\n188613,516\n188613,1085\n188613,1127\n188613,1381\n188613,3467\n188613,5213\n188614,750\n188615,145240\n188616,379\n188617,640\n188618,217\n188619,138686\n188620,175\n188621,179170\n188622,1955\n188622,142870\n188623,2590\n188624,179170\n188625,179170\n188626,2373\n188627,557\n188628,1860\n188629,1858\n188630,503\n188631,3623\n188632,779\n188633,652\n188634,920\n188635,80266\n188636,1556\n188637,872\n188637,1363\n188638,346\n188639,515\n188640,140\n188641,931\n188642,179170\n188643,1070\n188644,907\n188644,973\n188644,1853\n188644,38299\n188644,114682\n188644,187176\n188644,188645\n188644,192991\n188644,193646\n188645,187176\n188646,422\n188647,422\n188648,422\n188649,422\n188650,422\n188651,422\n188652,422\n188653,422\n188654,422\n188655,3695\n188656,1860\n188657,1858\n188659,422\n188660,90845\n188663,147\n188664,37\n188664,968\n188668,147\n188670,586\n188671,1010\n188673,22\n188675,147\n188676,2784\n188677,188678\n188679,440\n188681,1454\n188682,30\n188683,1893\n188684,994\n188685,83\n188685,477\n188685,536\n188685,2784\n188687,217\n188687,872\n188687,1118\n188687,1796\n188687,8811\n188687,16196\n188688,147\n188689,457\n188690,422\n188691,56\n188692,3695\n188693,994\n188694,2353\n188695,179170\n188696,136\n188696,184\n188696,1243\n188696,1821\n188696,2867\n188696,2868\n188696,21736\n188696,255750\n188697,140\n188698,1012\n188699,1181\n188700,397\n188701,3695\n188702,433\n188703,3695\n188704,140\n188705,179170\n188706,387\n188707,302\n188708,179170\n188709,140\n188709,1010\n188709,1298\n188710,179170\n188711,536\n188712,30\n188713,557\n188714,179170\n188716,30\n188718,302\n188719,536\n188721,179170\n188722,1332\n188723,3623\n188724,875\n188725,4220\n188728,861\n188731,140\n188733,217\n188734,106\n188735,431\n188736,30\n188737,30\n188738,994\n188739,1888\n188740,167\n188741,179170\n188742,302\n188743,1556\n188744,138686\n188745,175\n188746,179170\n188747,200\n188747,557\n188748,1257\n188748,1294\n188750,1769\n188750,1893\n188751,440\n188751,872\n188751,1085\n188752,179170\n188753,127158\n188755,430\n188756,79\n188756,985\n188757,392\n188759,179170\n188760,44725\n188761,1\n188762,179170\n188763,30\n188764,30\n188765,30\n188766,749\n188766,1087\n188766,1888\n188767,6424\n188768,503\n188769,1133\n188771,30\n188772,1544\n188773,356\n188774,1\n188775,24500\n188776,615\n188777,340\n188778,720\n188780,515\n188781,22\n188783,30\n188784,179170\n188785,1001\n188786,1452\n188787,447\n188788,941\n188789,744\n188790,30\n188791,240\n188791,294\n188791,338\n188791,631\n188791,635\n188791,775\n188791,1326\n188791,2159\n188791,2646\n188791,2944\n188791,5034\n188791,5326\n188791,5647\n188791,6032\n188791,15109\n188791,19823\n188791,45666\n188791,66297\n188791,72778\n188791,115474\n188791,116543\n188791,118449\n188791,188791\n188791,195054\n188791,216460\n188791,221417\n188791,227286\n188791,228960\n188791,229797\n188791,238228\n188791,249812\n188791,249814\n188791,261992\n188792,783\n188793,30\n188794,973\n188795,30\n188796,433\n188797,1224\n188798,1634\n188800,179170\n188801,852\n188802,435\n188803,647\n188804,146\n188804,92476\n188805,344\n188807,422\n188808,56\n188809,973\n188810,30\n188811,313\n188812,30\n188813,247\n188816,179170\n188820,83\n188821,775\n188821,999\n188822,843\n188823,406\n188825,113878\n188825,148742\n188826,30\n188827,1359\n188828,179170\n188829,3\n188831,30\n188833,3695\n188834,72\n188835,852\n188836,631\n188837,292\n188837,1688\n188839,48\n188841,1644\n188842,179170\n188843,459\n188843,156379\n188844,179170\n188845,179170\n188846,200\n188847,852\n188848,30\n188849,30\n188850,1102\n188851,687\n188852,151\n188853,406\n188854,217\n188855,4637\n188856,2266\n188857,1201\n188858,1072\n188859,455\n188860,34\n188860,35\n188861,2421\n188862,273\n188863,30\n188864,179170\n188865,136\n188866,315\n188867,592\n188868,4260\n188869,30\n188870,179170\n188871,467\n188871,162599\n188872,1551\n188873,1432\n188875,179170\n188876,179170\n188877,179170\n188878,1893\n188879,8992\n188880,179170\n188881,698\n188882,179170\n188883,631\n188884,179170\n188885,859\n188886,179170\n188887,240\n188887,1285\n188888,202\n188889,179170\n188890,1955\n188892,749\n188893,302\n188894,1769\n188895,697\n188895,1240\n188895,1454\n188895,1465\n188895,15523\n188896,500\n188897,179170\n188898,344\n188899,72\n188900,285\n188901,179170\n188902,179170\n188903,852\n188904,1\n188905,179170\n188906,179170\n188907,179170\n188908,179170\n188909,1235\n188909,1335\n188910,994\n188911,1955\n188912,179170\n188913,179170\n188914,1220\n188914,1222\n188915,516\n188916,252\n188917,179170\n188918,483\n188919,1078\n188920,83\n188921,179170\n188922,920\n188922,8854\n188923,1370\n188924,1821\n188924,21736\n188926,113156\n188927,718\n188928,1882\n188929,1274\n188930,2944\n188932,188933\n188934,30\n188935,255\n188935,843\n188936,779\n188937,30\n188938,1294\n188939,34\n188939,35\n188939,83\n188939,217\n188939,278\n188939,536\n188939,660\n188939,852\n188939,1466\n188939,1467\n188939,4637\n188939,7092\n188940,30\n188941,83\n188941,278\n188942,278\n188942,1467\n188942,7572\n188943,805\n188943,932\n188944,310\n188945,994\n188946,30\n188947,3260\n188948,175\n188948,188949\n188948,217558\n188948,251164\n188950,30\n188951,1204\n188952,28130\n188953,30\n188954,30\n188955,179170\n188956,3695\n188957,30\n188958,30\n188959,30\n188960,2083\n188961,302\n188962,447\n188963,2775\n188964,158\n188965,861\n188966,30\n188967,149\n188968,179170\n188969,79\n188969,192\n188969,202\n188969,333\n188969,1181\n188970,2506\n188971,30\n188972,30\n188973,302\n188973,406\n188973,420\n188973,1414\n188973,1466\n188974,8992\n188975,278\n188976,3623\n188977,179170\n188978,8855\n188979,3623\n188980,862\n188981,3623\n188982,631\n188983,3623\n188984,3623\n188985,668\n188986,3623\n188987,192\n188987,406\n188987,493\n188987,516\n188987,620\n188987,779\n188987,1181\n188987,1515\n188988,30\n188988,225\n188988,1282\n188988,1332\n188989,30\n188990,2105\n188991,2173\n188992,994\n188993,179170\n188994,30\n188995,83\n188996,843\n188997,179170\n188998,179170\n189000,285\n189001,30\n189002,179170\n189003,179170\n189004,994\n189005,1363\n189006,949\n189006,4637\n189007,346\n189008,179170\n189009,31977\n189010,255\n189011,994\n189012,893\n189013,189014\n189015,217\n189016,273\n189017,41\n189018,30\n189019,431\n189020,30\n189021,447\n189022,292\n189023,179170\n189024,1821\n189024,21736\n189025,1707\n189026,1289\n189027,179170\n189028,179170\n189029,3507\n189030,1454\n189031,302\n189032,138686\n189033,175\n189034,1289\n189035,179170\n189036,179170\n189037,3623\n189038,622\n189038,1181\n189039,422\n189040,422\n189041,3623\n189042,422\n189043,422\n189044,422\n189045,422\n189046,422\n189047,991\n189048,422\n189049,422\n189050,422\n189051,563\n189052,563\n189053,86\n189053,167\n189053,301\n189053,589\n189053,615\n189053,907\n189053,973\n189053,1001\n189053,1124\n189053,1167\n189053,1241\n189053,1284\n189053,1522\n189053,1782\n189053,1785\n189053,1955\n189053,2083\n189053,2557\n189053,2979\n189053,3193\n189054,3\n189054,50\n189054,58\n189054,59\n189054,63\n189054,79\n189054,81\n189054,99\n189054,116\n189054,136\n189054,147\n189054,149\n189054,192\n189054,195\n189054,206\n189054,215\n189054,217\n189054,225\n189054,233\n189054,240\n189054,248\n189054,251\n189054,298\n189054,301\n189054,323\n189054,336\n189054,372\n189054,392\n189054,406\n189054,422\n189054,442\n189054,493\n189054,503\n189054,516\n189054,518\n189054,536\n189054,588\n189054,590\n189054,602\n189054,622\n189054,636\n189054,694\n189054,704\n189054,714\n189054,760\n189054,779\n189054,801\n189054,805\n189054,932\n189054,1001\n189054,1016\n189054,1140\n189054,1179\n189054,1231\n189054,1235\n189054,1282\n189054,1284\n189054,1309\n189054,1326\n189054,1332\n189054,1335\n189054,1368\n189054,1370\n189054,1392\n189054,1425\n189054,1452\n189054,1512\n189054,1515\n189054,1522\n189054,1639\n189054,1722\n189054,1732\n189054,1789\n189054,1805\n189054,1807\n189054,1939\n189054,2008\n189054,2083\n189054,2087\n189054,2205\n189054,2244\n189054,2286\n189054,2296\n189054,2443\n189054,2528\n189054,2812\n189054,2979\n189054,3115\n189054,3193\n189054,3474\n189054,3538\n189054,3794\n189054,4237\n189054,5726\n189054,5992\n189054,6068\n189054,9537\n189054,16019\n189054,33424\n189054,59021\n189054,182162\n189055,4\n189055,5\n189055,30\n189055,32\n189055,34\n189055,35\n189055,50\n189055,58\n189055,59\n189055,81\n189055,111\n189055,116\n189055,134\n189055,136\n189055,147\n189055,149\n189055,158\n189055,192\n189055,195\n189055,206\n189055,215\n189055,225\n189055,233\n189055,248\n189055,272\n189055,333\n189055,372\n189055,388\n189055,406\n189055,417\n189055,422\n189055,430\n189055,493\n189055,503\n189055,516\n189055,518\n189055,536\n189055,585\n189055,588\n189055,589\n189055,590\n189055,592\n189055,602\n189055,620\n189055,626\n189055,636\n189055,640\n189055,671\n189055,704\n189055,714\n189055,779\n189055,795\n189055,862\n189055,907\n189055,968\n189055,973\n189055,996\n189055,1001\n189055,1007\n189055,1016\n189055,1033\n189055,1068\n189055,1082\n189055,1085\n189055,1133\n189055,1140\n189055,1149\n189055,1179\n189055,1212\n189055,1257\n189055,1282\n189055,1284\n189055,1285\n189055,1332\n189055,1370\n189055,1452\n189055,1512\n189055,1515\n189055,1531\n189055,1544\n189055,1608\n189055,1639\n189055,1722\n189055,1789\n189055,1805\n189055,1882\n189055,1939\n189055,1955\n189055,2083\n189055,2087\n189055,2244\n189055,2286\n189055,2334\n189055,2353\n189055,2379\n189055,2528\n189055,2782\n189055,2979\n189055,2995\n189055,3085\n189055,3193\n189055,3321\n189055,3474\n189055,3538\n189055,3794\n189055,4355\n189055,4748\n189055,5440\n189055,5992\n189055,6068\n189055,7270\n189055,8855\n189055,9537\n189055,59021\n189056,83\n189057,83\n189058,30\n189059,179170\n189060,179170\n189061,843\n189062,137\n189063,2421\n189064,217\n189065,83\n189066,179170\n189067,10\n189068,872\n189069,424\n189070,217\n189070,19986\n189071,1467\n189072,179170\n189073,2244\n189074,179170\n189075,455\n189076,2424\n189077,179170\n189078,189079\n189080,323\n189081,1871\n189082,2421\n189083,83\n189084,13980\n189085,1326\n189086,102\n189087,1323\n189088,408\n189089,179170\n189090,30\n189091,392\n189092,2915\n189093,171\n189094,994\n189095,115659\n189096,179170\n189097,1132\n189098,1608\n189099,393\n189099,980\n189100,30\n189101,30\n189102,355\n189104,130\n189106,843\n189107,1544\n189108,4611\n189109,103860\n189109,189303\n189110,2411\n189111,189112\n189113,1359\n189114,640\n189115,1\n189115,406\n189116,1458\n189117,818\n189118,1238\n189119,752\n189119,1274\n189120,63\n189121,1718\n189121,5034\n189122,1452\n189123,299\n189124,536\n189125,294\n189126,179170\n189127,189128\n189128,20\n189128,97\n189128,315\n189128,439\n189128,447\n189128,671\n189128,1033\n189128,1068\n189128,1474\n189128,1789\n189128,2030\n189128,13467\n189128,14378\n189128,29105\n189128,50855\n189128,62487\n189128,111775\n189128,189128\n189128,190468\n189128,190492\n189128,191369\n189128,195550\n189128,201786\n189128,202568\n189128,207535\n189128,225371\n189128,228938\n189128,234689\n189128,249763\n189128,250701\n189128,252761\n189129,328\n189130,190492\n189131,305\n189132,179170\n189133,185877\n189133,189788\n189133,189794\n189133,223738\n189134,2775\n189135,447\n189136,1381\n189136,1551\n189137,891\n189138,337\n189139,424\n189140,843\n189141,59021\n189142,328\n189143,1544\n189144,835\n189145,107\n189147,1294\n189148,649\n189148,1007\n189148,3999\n189148,36819\n189150,422\n189151,657\n189154,200\n189155,171\n189157,1132\n189158,1608\n189160,1888\n189161,760\n189162,2266\n189163,83\n189164,60576\n189165,1608\n189166,1132\n189167,346\n189168,3507\n189169,1294\n189171,97\n189172,30\n189174,178576\n189175,60576\n189177,60576\n189178,184\n189178,1773\n189179,162599\n189180,301\n189181,1147\n189182,920\n189183,467\n189184,60576\n189186,137\n189187,4548\n189187,189188\n189189,60576\n189190,872\n189191,516\n189193,1882\n189194,4611\n189195,60576\n189196,571\n189196,868\n189196,75912\n189196,162599\n189197,60576\n189198,147\n189198,158\n189198,206\n189199,158\n189199,1458\n189200,1769\n189201,698\n189202,1274\n189203,30\n189205,137\n189206,60576\n189207,3218\n189208,852\n189209,8270\n189210,60576\n189211,698\n189212,623\n189212,1805\n189213,626\n189214,485\n189215,298\n189216,994\n189217,179170\n189218,60576\n189219,7757\n189220,171641\n189221,875\n189222,1522\n189223,185877\n189224,179170\n189225,179170\n189226,994\n189227,467\n189227,571\n189229,994\n189231,781\n189232,1132\n189233,83\n189234,30\n189236,71\n189237,106\n189238,875\n189239,217\n189240,302\n189241,179170\n189242,673\n189243,1749\n189243,256067\n189244,1313\n189245,760\n189246,671\n189246,3462\n189248,202\n189249,251\n189250,217\n189251,178\n189252,1345\n189253,86\n189253,1363\n189254,1849\n189255,852\n189256,1749\n189257,346\n189258,1345\n189259,60576\n189260,60576\n189261,83\n189261,7698\n189262,338\n189263,1707\n189264,72764\n189265,179170\n189266,1696\n189266,2143\n189266,14061\n189266,80519\n189266,189266\n189266,245336\n189267,83\n189267,167\n189267,217\n189267,240\n189267,310\n189267,355\n189267,389\n189267,592\n189267,623\n189267,657\n189267,818\n189267,949\n189267,1010\n189267,1019\n189267,1072\n189267,1085\n189267,1118\n189267,1143\n189267,1388\n189267,1818\n189267,1849\n189267,2775\n189267,9001\n189267,25222\n189267,142409\n189268,179170\n189269,875\n189271,4223\n189272,1837\n189273,179170\n189274,861\n189275,809\n189275,19010\n189276,179170\n189277,2253\n189278,264\n189280,179170\n189281,2083\n189283,30\n189284,3804\n189285,1241\n189286,34\n189286,35\n189286,313\n189286,389\n189286,1417\n189287,179170\n189288,10\n189289,207\n189290,179170\n189291,217\n189291,313\n189291,389\n189292,3623\n189293,972\n189293,6249\n189294,862\n189295,195\n189295,406\n189296,30\n189298,179170\n189300,72\n189301,344\n189302,285\n189303,46\n189303,444\n189303,968\n189303,1293\n189303,1580\n189303,1782\n189303,3422\n189303,22145\n189303,23604\n189303,25036\n189303,33735\n189303,36988\n189303,55683\n189303,57125\n189303,73162\n189303,77473\n189303,87399\n189303,103860\n189303,123785\n189303,126914\n189303,136301\n189303,143982\n189303,160923\n189303,178012\n189303,189109\n189303,189303\n189303,189349\n189303,189833\n189303,192879\n189303,193134\n189303,199734\n189303,203202\n189303,212474\n189303,213969\n189303,213995\n189303,214310\n189303,214391\n189303,214578\n189303,214642\n189303,214912\n189303,226343\n189303,227376\n189303,228440\n189303,230412\n189303,240351\n189303,245408\n189303,257017\n189303,260934\n189303,263992\n189303,263998\n189303,264052\n189303,264366\n189303,264393\n189303,264397\n189303,264399\n189303,264757\n189304,467\n189304,868\n189305,179170\n189306,2923\n189307,252\n189308,1220\n189308,1222\n189309,516\n189310,1019\n189311,179170\n189314,179170\n189315,30\n189316,994\n189317,843\n189318,138686\n189319,175\n189320,1773\n189321,30\n189322,1449\n189322,1927\n189323,269\n189323,1052\n189324,994\n189325,179170\n189326,811\n189327,818\n189327,1181\n189330,158\n189331,2775\n189332,30\n189333,179170\n189334,1363\n189337,109\n189337,366\n189337,500\n189337,4871\n189337,5652\n189337,6614\n189337,6987\n189337,7731\n189337,7908\n189337,20035\n189337,22296\n189337,23771\n189337,24678\n189337,25179\n189337,28851\n189337,29179\n189337,56080\n189337,97413\n189337,104129\n189337,130976\n189337,134182\n189337,142185\n189337,145312\n189337,156526\n189337,159117\n189337,191391\n189337,192466\n189337,193270\n189337,194254\n189337,195057\n189337,195334\n189338,144556\n189339,4611\n189340,536\n189341,4611\n189342,144556\n189343,155481\n189345,30\n189346,536\n189347,179170\n189348,30\n189349,189303\n189350,178\n189350,40566\n189352,1381\n189353,1370\n189354,4611\n189355,718\n189356,8854\n189357,1130\n189358,27041\n189359,1544\n189360,994\n189361,3538\n189362,483\n189364,83\n189365,3695\n189366,179170\n189367,189368\n189369,30\n189370,83\n189371,2572\n189372,779\n189373,1515\n189374,248\n189375,30\n189376,843\n189377,515\n189379,192\n189379,333\n189379,493\n189379,586\n189379,682\n189379,1414\n189379,1985\n189379,2782\n189379,2931\n189379,3872\n189379,6119\n189379,72439\n189380,620\n189381,272\n189382,6638\n189383,760\n189384,30\n189385,2244\n189386,30\n189387,179170\n189388,3218\n189389,313\n189389,1718\n189390,292\n189391,172012\n189392,179170\n189393,63\n189394,640\n189395,5366\n189396,179170\n189397,113156\n189398,5662\n189399,843\n189400,1436\n189401,3258\n189402,1479\n189403,682\n189403,72439\n189404,388\n189405,1001\n189407,620\n189409,5718\n189410,406\n189411,326\n189412,518\n189413,697\n189414,1707\n189415,387\n189416,1010\n189417,247\n189418,179170\n189419,994\n189420,179170\n189421,151\n189422,56\n189423,1326\n189424,6556\n189425,83\n189425,304\n189425,467\n189425,868\n189425,162599\n189426,536\n189427,1241\n189428,694\n189429,1985\n189430,968\n189431,1359\n189432,1151\n189433,7572\n189434,697\n189435,2572\n189436,968\n189437,2979\n189438,106\n189438,841\n189439,435\n189440,994\n189441,389\n189442,8822\n189443,222\n189443,455\n189444,455\n189445,2083\n189446,1623\n189447,473\n189447,1267\n189447,1659\n189447,2367\n189448,306\n189448,307\n189449,1515\n189450,779\n189451,179170\n189452,30\n189453,843\n189454,30\n189455,179170\n189456,1127\n189457,1639\n189458,48\n189459,2373\n189460,424\n189461,862\n189462,818\n189463,387\n189464,175\n189466,1769\n189467,120\n189468,147\n189469,310\n189470,366\n189471,366\n189472,366\n189473,366\n189474,58\n189475,142870\n189476,1227\n189476,86416\n189479,3623\n189480,247\n189481,141912\n189482,841\n189483,273\n189484,179170\n189485,30\n189486,563\n189487,346\n189488,83\n189489,55849\n189490,30\n189491,30\n189492,179170\n189493,1132\n189494,1608\n189495,1419\n189496,278\n189497,588\n189497,590\n189498,2671\n189499,536\n189500,7572\n189501,83\n189502,217\n189503,1132\n189504,781\n189505,5987\n189506,119\n189506,151\n189506,1400\n189506,2073\n189507,217\n189508,346\n189509,179170\n189510,5906\n189511,557\n189512,626\n189513,278\n189514,137\n189515,862\n189516,72\n189517,147\n189518,557\n189519,671\n189520,184\n189521,2797\n189522,516\n189523,994\n189524,994\n189525,392\n189526,179170\n189527,30\n189528,179170\n189529,179170\n189530,2626\n189531,875\n189532,179170\n189533,920\n189534,2073\n189535,30\n189536,179170\n189537,30\n189538,1608\n189539,1132\n189540,179170\n189541,179170\n189542,55849\n189543,30\n189544,1014\n189545,30\n189546,21442\n189546,71303\n189546,152568\n189547,301\n189548,1849\n189549,30\n189550,312\n189551,138686\n189552,175\n189553,55849\n189554,151\n189555,179170\n189556,179170\n189557,179170\n189558,346\n189559,1474\n189561,673\n189562,346\n189563,179170\n189564,1381\n189565,485\n189566,298\n189567,1133\n189568,179170\n189569,50\n189570,189571\n189572,875\n189574,536\n189575,179170\n189577,1\n189578,44\n189579,2735\n189580,752\n189581,217\n189582,1467\n189583,278\n189584,536\n189585,179170\n189586,581\n189587,1\n189588,179170\n189589,179170\n189590,1939\n189591,1179\n189592,179170\n189593,179170\n189594,179170\n189595,65\n189596,179170\n189597,30\n189598,147\n189599,147\n189600,9029\n189601,68069\n189602,752\n189603,179170\n189604,278\n189605,179170\n189606,179170\n189607,292\n189608,179170\n189609,147\n189610,79\n189610,140\n189610,147\n189610,158\n189610,252\n189610,515\n189610,585\n189610,622\n189610,818\n189610,861\n189610,1240\n189610,1639\n189610,1715\n189613,147\n189614,158\n189614,355\n189614,1160\n189614,1353\n189614,7698\n189615,563\n189616,179170\n189617,1146\n189618,503\n189618,1257\n189619,885\n189619,13704\n189620,366\n189621,422\n189622,422\n189623,422\n189624,422\n189625,422\n189626,422\n189627,422\n189628,422\n189629,422\n189630,422\n189631,422\n189632,422\n189633,22\n189634,179170\n189635,179170\n189636,358\n189637,179170\n189638,179170\n189639,58\n189640,994\n189641,46\n189642,179170\n189643,872\n189644,179170\n189645,147\n189646,2421\n189647,718\n189648,22\n189649,179170\n189650,1566\n189651,158\n189652,179170\n189653,83\n189654,111\n189655,1773\n189656,1\n189657,389\n189658,2116\n189659,422\n189660,56\n189661,1\n189662,147\n189663,1326\n189664,102\n189665,1323\n189666,408\n189667,577\n189668,179170\n189669,179170\n189670,189671\n189672,113156\n189673,179170\n189674,1247\n189674,164572\n189675,10\n189675,113156\n189676,255\n189677,620\n189678,171\n189679,968\n189680,406\n189681,1612\n189682,306\n189682,307\n189683,1515\n189684,779\n189685,285\n189686,1707\n189687,355\n189688,5366\n189689,1132\n189690,781\n189691,298\n189692,485\n189693,1235\n189693,1335\n189694,3724\n189697,48505\n189698,142870\n189700,83\n189700,217\n189700,278\n189701,1238\n189702,30331\n189703,406\n189704,872\n189705,1452\n189706,1294\n189707,217\n189708,151\n189710,668\n189713,1707\n189715,1052\n189717,827\n189718,22\n189719,179170\n189720,1132\n189721,1608\n189722,189723\n189726,874\n189727,72\n189728,22\n189729,217\n189729,254\n189730,3804\n189732,298\n189733,485\n189734,60576\n189735,151\n189736,2989\n189736,2991\n189737,60576\n189738,9007\n189739,2443\n189740,1882\n189742,207\n189743,6027\n189744,189745\n189746,140\n189746,1179\n189747,620\n189748,206\n189749,1860\n189750,1858\n189751,179170\n189752,3370\n189752,14453\n189753,149\n189756,1707\n189757,336\n189757,422\n189757,1803\n189757,21442\n189758,50\n189758,79\n189758,147\n189758,158\n189759,515\n189760,1276\n189761,60576\n189763,467\n189764,920\n189765,1608\n189766,1132\n189767,60576\n189769,1240\n189771,10\n189772,60576\n189773,2353\n189774,1608\n189775,1132\n189776,346\n189777,631\n189778,2312\n189779,138686\n189780,248\n189780,142430\n189781,175\n189782,1085\n189782,2083\n189783,30\n189784,16153\n189785,167\n189788,251\n189788,275\n189788,733\n189788,911\n189788,1220\n189788,1222\n189788,1243\n189788,1702\n189788,1973\n189788,4448\n189788,37474\n189788,67693\n189788,93311\n189788,94169\n189788,152502\n189788,155028\n189788,189788\n189788,189794\n189788,189839\n189788,189842\n189788,189906\n189788,189932\n189788,190255\n189788,194585\n189788,198852\n189788,212381\n189788,213249\n189788,215276\n189788,223738\n189788,226460\n189788,232845\n189788,234694\n189788,234695\n189789,843\n189791,1837\n189793,685\n189793,693\n189794,251\n189794,275\n189794,676\n189794,1220\n189794,1222\n189794,1512\n189794,1702\n189794,5992\n189794,16014\n189794,27954\n189794,32924\n189794,94169\n189794,189133\n189794,189788\n189794,189794\n189794,189839\n189794,189842\n189794,189843\n189794,189929\n189794,189932\n189794,190426\n189794,215276\n189794,223738\n189794,226460\n189794,234694\n189794,235822\n189794,236761\n189794,251264\n189794,251307\n189795,5213\n189796,392\n189796,697\n189796,1769\n189797,19010\n189799,2244\n189800,2048\n189801,392\n189802,1212\n189803,994\n189804,770\n189804,1837\n189805,3\n189807,2646\n189808,1151\n189809,872\n189810,179170\n189811,179170\n189812,178\n189814,1294\n189816,875\n189817,72439\n189817,189839\n189818,1345\n189819,682\n189819,72439\n189819,189839\n189820,1955\n189821,994\n189822,58\n189823,46\n189824,467\n189825,397\n189826,1955\n189827,107\n189828,179170\n189829,1220\n189829,1222\n189830,6059\n189830,124668\n189831,83\n189832,403\n189834,128704\n189834,214131\n189835,483\n189836,179170\n189838,536\n189839,252\n189839,493\n189839,682\n189839,733\n189839,1181\n189839,1243\n189839,1464\n189839,1568\n189839,1825\n189839,1973\n189839,2033\n189839,14507\n189839,14511\n189839,19651\n189839,21528\n189839,35672\n189839,50123\n189839,64570\n189839,72439\n189839,87799\n189839,95823\n189839,136042\n189839,179315\n189839,180487\n189839,185568\n189839,189788\n189839,189794\n189839,189839\n189839,189842\n189839,190523\n189839,192005\n189839,193764\n189839,207885\n189839,215276\n189839,219991\n189839,223738\n189839,232043\n189839,238925\n189839,244660\n189839,247757\n189839,252577\n189839,252716\n189839,253192\n189840,2045\n189842,10\n189842,63\n189842,252\n189842,516\n189842,682\n189842,733\n189842,1220\n189842,1222\n189842,1566\n189842,1973\n189842,4388\n189842,18001\n189842,33354\n189842,72439\n189842,92289\n189842,94169\n189842,95823\n189842,112643\n189842,189788\n189842,189794\n189842,189839\n189842,189842\n189842,215276\n189842,219996\n189842,223738\n189842,225068\n189842,226460\n189842,233474\n189842,234713\n189842,253158\n189842,258107\n189843,189794\n189845,455\n189846,485\n189847,298\n189848,485\n189849,397\n189851,485\n189852,298\n189853,30\n189855,387\n189856,620\n189857,189858\n189859,1882\n189860,994\n189861,994\n189863,179170\n189864,1359\n189865,994\n189866,19010\n189867,30\n189868,141912\n189870,718\n189871,207\n189872,217\n189873,83\n189874,179170\n189875,760\n189875,1019\n189878,30\n189880,994\n189881,589\n189881,1001\n189882,422\n189883,56\n189884,113156\n189885,861\n189886,707\n189887,179170\n189888,179170\n189890,189842\n189891,467\n189891,156379\n189892,994\n189893,179170\n189894,1001\n189895,179170\n189896,515\n189899,259\n189900,259\n189901,259\n189904,179170\n189905,805\n189907,1608\n189908,1132\n189909,259\n189910,435\n189912,189913\n189916,179170\n189917,1466\n189918,179170\n189919,179170\n189920,450\n189921,1033\n189922,1608\n189923,1132\n189924,179170\n189925,450\n189927,50\n189927,779\n189927,141912\n189928,179170\n189931,809\n189932,189788\n189932,189794\n189933,179170\n189934,179170\n189935,1133\n189936,4220\n189937,147\n189937,158\n189937,333\n189938,118\n189938,4597\n189939,179170\n189940,138686\n189941,175\n189943,918\n189944,179170\n189946,1707\n189947,760\n189948,1955\n189949,2244\n189950,2775\n189950,242246\n189951,104\n189951,557\n189951,953\n189951,954\n189951,1939\n189951,7124\n189952,179170\n189953,3804\n189954,390\n189955,179170\n189956,179170\n189957,83\n189958,918\n189959,179170\n189961,179170\n189962,872\n189963,179170\n189964,2626\n189965,1132\n189966,1608\n189967,179170\n189968,30\n189969,994\n189970,366\n189970,483\n189970,509\n189970,1118\n189970,1345\n189971,179170\n189972,389\n189973,1860\n189974,1858\n189975,179170\n189976,179170\n189977,877\n189978,1359\n189979,179170\n189981,72\n189982,107\n189982,3538\n189982,4771\n189983,801\n189984,179170\n189985,1707\n189986,179170\n189987,151\n189988,358\n189988,509\n189989,179170\n189990,83\n189991,179170\n189992,247\n189993,392\n189994,30\n189995,30\n189996,179170\n189997,179170\n189998,179170\n189999,30\n190000,179170\n190001,179170\n190002,1556\n190002,6303\n190003,292\n190004,30\n190005,179170\n190006,994\n190007,247\n190007,2867\n190007,2868\n190008,30\n190009,30\n190010,289\n190010,290\n190010,94134\n190011,179170\n190012,179170\n190013,10\n190014,179170\n190015,4691\n190016,718\n190016,1888\n190017,485\n190018,298\n190019,994\n190020,668\n190021,994\n190022,179170\n190023,251\n190023,809\n190023,893\n190023,1033\n190024,2646\n190025,3695\n190026,304\n190026,2572\n190027,56\n190028,422\n190029,179170\n190030,179170\n190031,289\n190031,290\n190031,94134\n190032,179170\n190033,179170\n190034,65\n190035,60576\n190036,346\n190037,190038\n190039,200\n190040,272\n190041,68\n190042,366\n190044,179170\n190045,1143\n190046,179170\n190047,179170\n190048,1285\n190049,875\n190050,127158\n190051,192\n190052,179170\n190053,30\n190054,30\n190055,390\n190056,1235\n190056,1335\n190057,697\n190058,1429\n190059,179170\n190060,179170\n190061,467\n190062,179170\n190063,3115\n190064,390\n190065,485\n190066,298\n190067,179170\n190068,179170\n190069,56\n190070,422\n190071,4220\n190072,1425\n190073,994\n190074,190075\n190076,179170\n190077,179170\n190078,30\n190079,30\n190079,50\n190079,79\n190079,104\n190079,111\n190079,158\n190079,178\n190079,195\n190079,202\n190079,215\n190079,217\n190079,248\n190079,251\n190079,272\n190079,285\n190079,296\n190079,333\n190079,346\n190079,393\n190079,406\n190079,422\n190079,424\n190079,430\n190079,439\n190079,447\n190079,585\n190079,586\n190079,588\n190079,590\n190079,592\n190079,620\n190079,622\n190079,640\n190079,663\n190079,718\n190079,760\n190079,779\n190079,818\n190079,994\n190079,1001\n190079,1007\n190079,1133\n190079,1175\n190079,1231\n190079,1235\n190079,1247\n190079,1265\n190079,1266\n190079,1335\n190079,1370\n190079,1515\n190079,1551\n190079,1608\n190079,1715\n190079,1939\n190079,1963\n190079,2045\n190079,2205\n190079,2416\n190079,2417\n190079,2620\n190079,2701\n190079,2931\n190079,3085\n190079,3331\n190079,5874\n190079,6119\n190079,7270\n190079,33424\n190079,164572\n190080,179170\n190081,298\n190082,485\n190083,179170\n190084,179170\n190085,179170\n190086,557\n190087,862\n190088,1287\n190089,1707\n190090,433\n190090,156379\n190091,179170\n190092,1381\n190092,131675\n190093,179170\n190094,179170\n190095,179170\n190096,2373\n190097,83\n190098,136\n190099,516\n190100,250\n190100,1684\n190101,285\n190102,179170\n190103,435\n190104,1238\n190105,278\n190106,4594\n190107,1707\n190108,54\n190108,283\n190108,455\n190108,660\n190108,2421\n190108,2424\n190108,2646\n190108,2775\n190108,37088\n190109,8270\n190110,179170\n190111,4691\n190112,55849\n190113,704\n190114,2797\n190115,4\n190115,5\n190116,330\n190117,843\n190118,278\n190119,83\n190120,179170\n190121,217\n190122,536\n190123,1467\n190124,485\n190125,298\n190126,55849\n190127,179170\n190128,483\n190129,179170\n190130,250\n190130,1684\n190131,217\n190132,179170\n190133,285\n190134,805\n190135,44\n190135,63\n190135,79\n190135,106\n190135,111\n190135,137\n190135,140\n190135,146\n190135,147\n190135,178\n190135,215\n190135,217\n190135,248\n190135,261\n190135,296\n190135,330\n190135,337\n190135,424\n190135,430\n190135,493\n190135,516\n190135,538\n190135,585\n190135,592\n190135,671\n190135,818\n190135,934\n190135,980\n190135,994\n190135,1001\n190135,1016\n190135,1282\n190135,1294\n190135,1309\n190135,1368\n190135,1370\n190135,1388\n190135,1715\n190135,1939\n190135,1963\n190135,2045\n190135,2205\n190135,2244\n190135,2379\n190135,2416\n190135,2417\n190135,2701\n190135,2793\n190135,3085\n190135,3317\n190135,3331\n190135,4355\n190135,4455\n190135,4545\n190135,5726\n190135,5874\n190135,15573\n190135,16019\n190135,33424\n190135,92476\n190135,245910\n190136,179170\n190137,657\n190137,2421\n190138,179170\n190139,217\n190139,536\n190140,83\n190141,56\n190142,422\n190143,179170\n190144,240\n190145,179170\n190146,1001\n190147,60576\n190148,1551\n190149,301\n190150,301\n190151,190152\n190155,190156\n190157,179170\n190158,179170\n190159,138686\n190160,175\n190161,179170\n190162,1309\n190163,179170\n190164,179170\n190165,222\n190165,622\n190165,932\n190165,972\n190165,973\n190165,1849\n190166,1133\n190167,9029\n190168,179170\n190169,1326\n190170,102\n190171,1323\n190172,408\n190173,179170\n190174,179170\n190175,179170\n190176,255\n190177,190178\n190179,994\n190180,179170\n190181,356\n190182,1294\n190183,602\n190184,602\n190185,602\n190186,850\n190187,328\n190188,83\n190189,422\n190190,422\n190191,422\n190192,422\n190193,422\n190194,422\n190195,422\n190196,422\n190197,422\n190198,422\n190199,422\n190200,422\n190201,422\n190202,1467\n190204,862\n190205,289\n190205,290\n190205,94134\n190206,602\n190207,3623\n190208,179170\n190209,3623\n190210,83\n190211,4237\n190211,182162\n190212,536\n190213,1608\n190214,323\n190215,30\n190216,179170\n190217,104\n190218,179170\n190219,1238\n190220,10\n190220,1773\n190221,190222\n190223,3321\n190224,301\n190225,1177\n190225,182162\n190226,818\n190227,1058\n190228,697\n190229,752\n190230,1284\n190231,3\n190232,1\n190233,255\n190235,346\n190236,179170\n190237,1634\n190238,285\n190240,355\n190242,444\n190242,589\n190242,631\n190242,968\n190242,1010\n190242,1085\n190242,1294\n190242,1522\n190242,1715\n190242,2083\n190242,2557\n190243,493\n190244,424\n190245,10\n190246,4611\n190247,1544\n190248,422\n190249,872\n190251,314\n190253,1955\n190254,149\n190254,868\n190254,1326\n190254,21442\n190255,189788\n190256,1544\n190257,4611\n190258,605\n190260,366\n190261,1252\n190261,1253\n190263,1544\n190264,4611\n190265,1837\n190266,30\n190267,292\n190268,1267\n190269,346\n190270,611\n190270,7757\n190271,259\n190272,6059\n190274,4611\n190275,1544\n190276,104\n190276,136\n190276,137\n190276,138\n190276,200\n190276,248\n190276,364\n190276,557\n190276,636\n190276,943\n190276,953\n190276,1011\n190276,1332\n190276,1368\n190276,1844\n190276,1939\n190276,4276\n190276,5405\n190276,15807\n190278,273\n190280,1544\n190281,4611\n190282,932\n190283,697\n190284,60576\n190286,440\n190287,557\n190289,852\n190290,1544\n190291,1238\n190292,1132\n190293,781\n190294,1707\n190295,60576\n190296,861\n190298,907\n190300,1010\n190302,1582\n190302,190309\n190303,13661\n190304,1231\n190305,1298\n190305,1522\n190305,2979\n190307,206\n190308,875\n190309,602\n190310,1544\n190311,4611\n190312,158\n190313,850\n190314,301\n190316,442\n190317,60576\n190318,852\n190319,1707\n190320,313\n190320,2421\n190321,305\n190322,1452\n190323,811\n190324,179170\n190325,1860\n190326,1858\n190328,55849\n190329,252\n190330,179170\n190331,151\n190332,8270\n190333,138686\n190334,1247\n190334,164572\n190335,175\n190336,781\n190337,1132\n190338,920\n190339,467\n190340,2671\n190341,107\n190342,440\n190342,622\n190343,272\n190346,252\n190346,1220\n190346,1222\n190347,1860\n190348,1858\n190349,1449\n190350,424\n190351,875\n190352,83\n190353,2312\n190355,31073\n190356,1608\n190357,1132\n190358,113156\n190360,160\n190361,48505\n190363,379\n190364,217\n190365,1140\n190366,48\n190367,3623\n190368,81\n190369,200\n190370,1453\n190371,206\n190373,673\n190374,292\n190374,509\n190374,2620\n190374,5718\n190375,309\n190375,310\n190376,158\n190377,83\n190379,4691\n190380,1608\n190381,1132\n190382,179170\n190383,179170\n190384,4672\n190385,1608\n190386,1132\n190387,60576\n190388,626\n190388,1363\n190390,1181\n190391,875\n190392,875\n190393,1309\n190394,120\n190394,694\n190395,1608\n190396,1132\n190397,217\n190398,433\n190399,264\n190399,1132\n190399,1147\n190399,16687\n190401,32\n190401,392\n190401,697\n190401,809\n190403,1\n190404,71\n190405,252\n190406,190407\n190408,1010\n190408,1122\n190408,1241\n190409,1608\n190410,1132\n190411,918\n190412,694\n190414,252\n190415,209\n190416,918\n190417,500\n190418,179170\n190419,179170\n190420,344\n190421,1882\n190422,2590\n190424,142426\n190425,1220\n190425,1222\n190426,189788\n190426,189794\n190426,223738\n190430,37414\n190431,252\n190431,1220\n190431,1222\n190432,179170\n190433,147\n190435,2045\n190436,267\n190437,309\n190437,310\n190438,1181\n190439,2775\n190440,447\n190441,179170\n190442,275\n190442,1619\n190443,1370\n190443,21736\n190445,1132\n190446,1608\n190447,298\n190448,485\n190450,217\n190451,313\n190451,1019\n190451,1881\n190452,707\n190453,179170\n190454,2979\n190455,30\n190458,1572\n190458,2626\n190459,83\n190460,1220\n190460,1222\n190461,516\n190462,252\n190463,328\n190464,179170\n190465,179170\n190466,1849\n190467,30\n190468,189128\n190469,73570\n190470,2590\n190472,302\n190474,5213\n190475,2209\n190476,138686\n190477,175\n190478,1220\n190478,1222\n190479,516\n190480,252\n190481,30\n190482,30\n190483,485\n190484,298\n190485,72\n190486,344\n190487,285\n190488,34\n190488,35\n190488,313\n190488,2784\n190489,861\n190490,515\n190491,278\n190492,106\n190492,315\n190492,346\n190492,439\n190492,447\n190492,996\n190492,1294\n190492,1474\n190492,3718\n190492,4449\n190492,4646\n190492,5728\n190492,8170\n190492,14396\n190492,15355\n190492,24659\n190492,87976\n190492,96718\n190492,113585\n190492,139522\n190492,158289\n190492,180938\n190492,189128\n190492,189130\n190492,189879\n190492,190492\n190492,190493\n190492,193101\n190492,194904\n190492,212914\n190492,213989\n190492,214631\n190492,218053\n190492,218085\n190492,221710\n190492,222036\n190492,224632\n190492,226447\n190492,227030\n190492,229040\n190492,235816\n190492,238978\n190492,248514\n190492,251288\n190492,252074\n190492,253174\n190492,258258\n190492,259709\n190492,264543\n190494,622\n190495,147\n190495,158\n190496,577\n190497,622\n190498,147\n190498,158\n190498,192\n190498,206\n190498,2244\n190498,80266\n190499,577\n190500,872\n190502,179170\n190503,179170\n190505,2605\n190506,160\n190507,893\n190508,151\n190509,676\n190510,1983\n190510,189794\n190511,452\n190512,1655\n190513,671\n190514,190515\n190514,193299\n190514,196559\n190514,257910\n190516,192\n190516,333\n190517,255\n190519,217\n190519,1417\n190520,81\n190522,55849\n190524,225\n190524,1332\n190524,4039\n190525,72764\n190526,298\n190527,167\n190527,2083\n190528,200\n190530,179170\n190531,179170\n190532,179170\n190533,875\n190534,72\n190535,623\n190535,1590\n190535,1644\n190536,1882\n190537,179170\n190538,138\n190539,865\n190540,557\n190541,1392\n190541,176782\n190542,137\n190543,118\n190543,4597\n190544,88820\n190545,147\n190546,179170\n190547,1132\n190548,781\n190549,179170\n190550,142870\n190551,1220\n190551,1222\n190552,1287\n190553,694\n190554,304\n190554,932\n190555,86\n190556,179170\n190557,2779\n190558,459\n190559,442\n190559,749\n190559,3474\n190560,179170\n190561,850\n190562,8270\n190563,919\n190564,179170\n190565,2797\n190566,126\n190566,872\n190567,809\n190568,179170\n190569,435\n190570,1359\n190571,179170\n190572,179170\n190573,333\n190574,179170\n190575,843\n190576,313\n190576,2266\n190577,44\n190578,1133\n190579,179170\n190580,994\n190581,557\n190582,179170\n190583,179170\n190584,209\n190585,30\n190586,179170\n190587,77\n190588,1359\n190589,179170\n190590,1359\n190591,179170\n190592,875\n190593,3623\n190594,179170\n190595,81\n190596,179170\n190597,332\n190598,1718\n190599,250\n190599,1684\n190600,285\n190601,240\n190602,179170\n190603,179170\n190604,179170\n190605,179170\n190606,179170\n190607,179170\n190608,179170\n190609,640\n190610,1359\n190611,250\n190611,1684\n190612,285\n190613,852\n190614,301\n190615,2620\n190616,179170\n190617,179170\n190618,179170\n190619,1326\n190620,102\n190621,1323\n190622,408\n190623,346\n190623,435\n190623,439\n190623,447\n190623,586\n190623,1181\n190623,1294\n190623,6119\n190624,968\n190625,179170\n190626,671\n190627,2775\n190628,30\n190629,81\n190630,179170\n190631,200\n190632,179170\n190633,1707\n190634,179170\n190635,563\n190636,30\n190637,179170\n190638,422\n190639,422\n190640,422\n190641,422\n190642,422\n190643,422\n190644,422\n190645,422\n190646,422\n190647,422\n190648,422\n190649,422\n190650,310\n190652,285\n190653,179170\n190654,179170\n190655,30\n190657,30\n190658,171\n190659,30\n190660,225\n190661,30\n190662,483\n190663,4545\n190663,56150\n190664,8884\n190665,179170\n190666,1085\n190668,179170\n190670,1285\n190671,294\n190672,30\n190673,30\n190674,30\n190675,355\n190676,190677\n190678,781\n190679,1132\n190680,843\n190681,175\n190682,366\n190683,366\n190684,2146\n190685,190686\n190687,190686\n190688,932\n190689,431\n190690,200\n190691,781\n190692,1132\n190693,190694\n190695,852\n190696,841\n190697,83\n190698,179170\n190699,30\n190700,30\n190701,1132\n190702,781\n190703,269\n190704,127158\n190705,8270\n190706,852\n190707,781\n190708,1132\n190709,30\n190710,113156\n190711,190712\n190713,2528\n190714,30\n190715,1132\n190716,781\n190717,30\n190718,72\n190718,312\n190718,509\n190718,1052\n190718,1287\n190718,2605\n190718,3695\n190719,99\n190720,586\n190721,349\n190722,500\n190723,366\n190724,850\n190726,2048\n190727,1016\n190728,30\n190729,118\n190729,4597\n190730,190731\n190730,203707\n190730,226344\n190732,3804\n190733,707\n190734,148742\n190735,1132\n190736,781\n190737,127158\n190738,918\n190739,1882\n190740,2315\n190741,190742\n190743,190744\n190745,190746\n190747,2315\n190748,4355\n190749,1773\n190750,217\n190751,516\n190752,485\n190753,298\n190754,30\n190755,312\n190756,259\n190756,577\n190756,788\n190756,127158\n190757,190758\n190759,273\n190760,1571\n190761,179170\n190762,30\n190763,136\n190764,994\n190765,179170\n190766,285\n190768,4691\n190769,179170\n190770,30\n190771,179170\n190772,179170\n190773,179170\n190774,1132\n190775,781\n190777,4355\n190778,151\n190779,483\n190780,4066\n190781,179170\n190782,1\n190783,743\n190784,179170\n190785,3623\n190786,875\n190787,1707\n190788,44\n190789,138686\n190790,175\n190791,179170\n190792,190793\n190794,240\n190794,588\n190794,590\n190795,190796\n190797,1531\n190798,200\n190799,596\n190800,190801\n190802,190803\n190804,4611\n190805,2979\n190806,875\n190807,875\n190808,179170\n190809,179170\n190810,179170\n190811,30\n190812,310\n190813,805\n190814,10\n190814,1773\n190815,179170\n190816,179170\n190817,179170\n190818,261\n190818,333\n190818,4545\n190818,56150\n190819,179170\n190820,189128\n190821,1014\n190822,179170\n190823,1014\n190824,1014\n190825,1014\n190826,102\n190827,1326\n190828,1323\n190829,179170\n190830,408\n190831,1014\n190832,1014\n190833,1014\n190834,1014\n190835,676\n190835,698\n190835,3260\n190836,2506\n190837,190838\n190839,1776\n190840,179170\n190841,179170\n190842,179170\n190843,827\n190844,179170\n190845,827\n190846,179170\n190847,179170\n190848,190849\n190850,1151\n190851,179170\n190852,179170\n190853,179170\n190855,179170\n190856,179170\n190857,1014\n190858,358\n190859,1821\n190859,21736\n190860,179170\n190861,31977\n190862,171\n190863,949\n190864,190865\n190864,264319\n190866,179170\n190867,179170\n190868,179170\n190869,179170\n190870,179170\n190871,247\n190872,190873\n190874,179170\n190875,179170\n190876,179170\n190877,841\n190878,247\n190879,31977\n190880,190881\n190882,179170\n190883,179170\n190884,179170\n190885,179170\n190886,179170\n190887,179170\n190888,179170\n190889,190890\n190889,218797\n190891,2292\n190892,179170\n190893,179170\n190894,179170\n190895,10\n190896,179170\n190897,179170\n190898,147\n190898,206\n190899,179170\n190900,179170\n190901,301\n190902,179170\n190903,58\n190904,179170\n190905,179170\n190906,179170\n190907,179170\n190908,366\n190909,355\n190910,107\n190911,2416\n190911,2417\n190912,292\n190913,338\n190914,298\n190915,1133\n190916,3538\n190917,7\n190919,30\n190920,285\n190921,485\n190922,298\n190923,179170\n190924,179170\n190925,179170\n190926,781\n190927,1132\n190928,389\n190929,811\n190930,68069\n190931,30\n190932,222\n190933,190934\n190935,30\n190936,781\n190937,1132\n190938,179170\n190939,4\n190939,5\n190939,15609\n190940,2315\n190941,781\n190942,1132\n190943,1132\n190944,781\n190945,447\n190946,2775\n190947,190948\n190949,192\n190950,2701\n190951,1509\n190952,1659\n190953,1688\n190954,1220\n190954,1222\n190955,516\n190956,252\n190957,1082\n190958,190959\n190960,483\n190961,252\n190962,1531\n190964,190963\n190965,1177\n190966,190967\n190968,2944\n190968,6506\n190968,32751\n190969,144962\n190970,179170\n190971,55849\n190972,2244\n190973,1282\n190975,2244\n190976,269\n190977,440\n190978,5101\n190979,563\n190980,179170\n190981,192\n190982,190983\n190984,138686\n190985,175\n190986,179170\n190987,1983\n190988,577\n190989,312\n190990,4220\n190991,557\n190992,328\n190993,44\n190994,175\n190995,592\n190996,55849\n190997,179170\n190998,1019\n190999,179170\n191000,179170\n191001,707\n191002,15\n191003,2506\n191004,557\n191005,557\n191006,269\n191007,872\n191008,872\n191009,55849\n191010,2367\n191011,1837\n191012,366\n191013,3623\n191014,6891\n191015,179170\n191016,1014\n191017,179170\n191018,191019\n191020,149\n191021,179170\n191022,406\n191023,1014\n191024,1014\n191025,1014\n191026,1014\n191027,1014\n191028,1014\n191029,1707\n191030,1014\n191031,1014\n191032,1014\n191033,179170\n191034,3623\n191035,3623\n191036,1556\n191037,3623\n191038,3623\n191039,3623\n191040,179170\n191041,3623\n191042,142473\n191043,191044\n191045,179170\n191048,179170\n191049,406\n191050,179170\n191051,310\n191052,805\n191053,406\n191053,1775\n191053,55849\n191053,171294\n191054,323\n191055,158\n191056,3623\n191057,179170\n191058,179170\n191059,3623\n191060,240\n191061,356\n191062,1515\n191063,4220\n191064,200\n191065,893\n191066,818\n191067,191068\n191069,68\n191070,179170\n191071,1163\n191072,137\n191073,167\n191073,2083\n191074,179170\n191075,102\n191076,1326\n191077,1323\n191078,408\n191079,179170\n191080,1849\n191081,179170\n191082,3623\n191083,179170\n191084,34\n191084,35\n191085,191086\n191087,292\n191088,294\n191089,296\n191090,298\n191091,179170\n191092,3413\n191093,843\n191094,191095\n191096,179170\n191098,179170\n191099,1571\n191100,1821\n191100,21736\n191101,179170\n191102,8270\n191103,179170\n191104,83\n191105,390\n191106,355\n191107,483\n191108,994\n191109,1707\n191110,1773\n191111,191112\n191113,185877\n191114,1132\n191115,781\n191116,760\n191117,1238\n191118,1608\n191119,185877\n191120,1452\n191121,1608\n191122,1132\n191123,340\n191123,1127\n191124,1715\n191125,5375\n191126,1359\n191127,3238\n191128,136\n191129,158\n191129,406\n191129,1796\n191130,673\n191131,83\n191132,5101\n191133,24500\n191134,809\n191136,149\n191136,206\n191136,301\n191136,868\n191136,1326\n191136,21442\n191137,931\n191139,2979\n191141,868\n191142,538\n191143,151\n191143,292\n191144,179170\n191145,868\n191146,1707\n191147,179170\n191148,389\n191149,191150\n191151,5405\n191152,72\n191153,344\n191154,285\n191155,462\n191156,640\n191157,195\n191158,920\n191159,433\n191160,932\n191161,151\n191162,261\n191163,872\n191164,1033\n191166,83\n191167,285\n191168,1564\n191169,781\n191170,1132\n191174,178576\n191176,450\n191177,781\n191178,1132\n191179,435\n191180,30\n191181,1132\n191182,781\n191183,781\n191184,1132\n191185,781\n191186,1132\n191187,142426\n191188,859\n191189,703\n191189,808\n191190,538\n191190,1033\n191191,781\n191192,1132\n191193,435\n191194,435\n191195,435\n191196,1231\n191196,1782\n191197,200\n191199,30\n191200,852\n191201,1033\n191202,309\n191202,310\n191203,19010\n191204,994\n191205,781\n191206,1132\n191208,595\n191209,301\n191209,968\n191209,1370\n191211,920\n191212,4823\n191213,79\n191214,994\n191215,179170\n191216,408\n191216,1113\n191217,920\n191218,994\n191219,19\n191220,994\n191221,142405\n191222,138686\n191223,781\n191224,1132\n191225,652\n191226,175\n191227,596\n191228,467\n191230,215\n191231,1117\n191232,994\n191233,652\n191234,19519\n191235,1882\n191236,158\n191237,184\n191238,140\n191239,269\n191240,19519\n191241,134\n191242,31073\n191243,4260\n191245,30\n191246,17897\n191247,1474\n191248,309\n191248,310\n191249,147\n191249,1515\n191250,179170\n191251,113156\n191252,809\n191253,19519\n191254,422\n191255,3260\n191256,422\n191257,422\n191258,422\n191259,422\n191260,422\n191261,422\n191262,422\n191263,422\n191264,422\n191265,3695\n191267,852\n191270,1359\n191272,515\n191273,19519\n191275,6027\n191276,171\n191277,298\n191278,1807\n191279,779\n191280,972\n191281,19519\n191282,171\n191283,30\n191284,19519\n191285,1132\n191286,781\n191287,31073\n191288,19519\n191289,657\n191290,2979\n191291,752\n191292,248\n191293,640\n191294,1882\n191295,72\n191296,285\n191297,344\n191298,726\n191299,22\n191300,195\n191301,20\n191303,269\n191304,269\n191305,179170\n191306,344\n191307,72\n191308,285\n191309,285\n191310,72\n191311,344\n191312,292\n191314,19519\n191315,22\n191316,344\n191317,72\n191318,285\n191319,344\n191320,285\n191321,72\n191324,211\n191324,1844\n191324,15454\n191324,26860\n191324,31706\n191324,55105\n191324,57222\n191324,59833\n191324,68006\n191324,227979\n191325,285\n191326,344\n191327,72\n191328,138686\n191329,455\n191330,538\n191332,1345\n191334,72\n191335,344\n191336,285\n191340,344\n191341,72\n191342,285\n191343,5405\n191344,104\n191344,136\n191344,248\n191344,557\n191344,1368\n191344,5405\n191345,1608\n191346,1132\n191349,179170\n191350,1531\n191351,467\n191352,671\n191353,191354\n191355,106\n191355,202\n191355,505\n191355,663\n191355,1370\n191355,13572\n191355,16271\n191355,16652\n191355,19413\n191355,22808\n191355,28354\n191355,53726\n191355,144849\n191355,192027\n191355,193066\n191355,200645\n191355,227099\n191355,233718\n191355,251273\n191355,252036\n191355,253699\n191356,200\n191356,328\n191357,22\n191359,697\n191359,1240\n191361,479\n191361,24505\n191362,217\n191363,30\n191363,328\n191364,340\n191366,191367\n191368,714\n191368,74696\n191369,189128\n191370,9457\n191371,1769\n191372,843\n191373,1769\n191374,344\n191375,179170\n191376,34\n191376,35\n191376,694\n191377,346\n191378,222\n191378,23783\n191378,30428\n191379,102\n191379,408\n191381,972\n191382,868\n191383,19519\n191384,852\n191386,22\n191387,240\n191388,8270\n191390,918\n191391,366\n191392,259\n191393,30\n191394,4571\n191396,158\n191397,30\n191399,3260\n191400,179170\n191401,2224\n191402,73570\n191403,2460\n191404,2292\n191406,1939\n191407,142409\n191407,146280\n191408,259\n191409,330\n191410,6059\n191411,309\n191411,310\n191412,3623\n191413,240\n191413,1309\n191414,1985\n191415,346\n191416,179170\n191417,1769\n191418,918\n191419,34\n191419,35\n191420,217\n191421,949\n191422,19519\n191424,60576\n191425,179170\n191426,1465\n191427,3260\n191428,2979\n191430,252\n191431,1659\n191432,1359\n191433,596\n191434,3\n191434,240\n191434,309\n191434,310\n191434,631\n191434,818\n191434,1085\n191434,1749\n191434,1785\n191434,2334\n191434,2620\n191434,5718\n191434,9010\n191435,30\n191436,30\n191437,422\n191438,56\n191439,515\n191440,191441\n191443,1556\n191444,30\n191445,19519\n191446,500\n191447,1052\n191448,2775\n191449,1882\n191450,1962\n191451,54\n191452,1773\n191453,360\n191453,2617\n191454,56\n191455,422\n191457,516\n191458,2353\n191458,3695\n191459,3182\n191460,138686\n191461,175\n191462,850\n191463,1888\n191464,10\n191466,55849\n191467,178576\n191468,1474\n191469,179170\n191470,3623\n191471,30\n191472,30\n191472,3321\n191473,1623\n191474,862\n191475,179170\n191477,299\n191477,510\n191477,920\n191477,1436\n191477,1579\n191478,1227\n191478,86416\n191479,79\n191480,328\n191482,2146\n191484,179170\n191485,179170\n191486,657\n191487,255\n191488,217\n191489,406\n191490,278\n191491,83\n191492,179170\n191493,252\n191494,483\n191495,3623\n191496,179170\n191497,179170\n191498,717\n191499,179170\n191500,467\n191501,30\n191502,151\n191505,179170\n191506,179170\n191507,1860\n191508,1858\n191509,22\n191510,138686\n191511,179170\n191512,175\n191513,179170\n191514,392\n191515,179170\n191516,1556\n191517,1078\n191517,4223\n191518,179170\n191519,155473\n191520,309\n191520,310\n191520,2266\n191520,3039\n191521,406\n191522,467\n191522,1235\n191522,1335\n191522,1368\n191523,302\n191524,5405\n191525,467\n191526,392\n191527,663\n191527,1381\n191527,2889\n191527,5440\n191528,602\n191529,179170\n191530,1467\n191531,147\n191532,4237\n191532,182162\n191533,191534\n191535,156709\n191536,636\n191537,179170\n191538,30\n191539,1181\n191540,179170\n191542,4223\n191543,1893\n191543,4294\n191544,1893\n191544,4294\n191545,191546\n191548,179170\n191549,557\n191550,1544\n191551,30\n191552,302\n191553,3695\n191554,19519\n191555,1515\n191556,179170\n191557,137\n191558,6638\n191559,19519\n191560,179170\n191561,3218\n191562,30\n191563,63\n191564,5662\n191565,19519\n191566,1436\n191567,358\n191568,1479\n191569,1474\n191570,682\n191570,72439\n191571,388\n191572,86\n191572,167\n191572,301\n191572,907\n191572,1284\n191572,1522\n191572,2083\n191572,2191\n191572,2557\n191572,2979\n191572,3138\n191573,1001\n191574,620\n191575,5718\n191576,344\n191577,72\n191578,285\n191579,673\n191580,518\n191581,781\n191582,1132\n191583,433\n191584,56\n191585,1326\n191586,55849\n191587,1241\n191588,146\n191588,92476\n191589,647\n191590,146\n191590,92476\n191591,647\n191592,344\n191593,344\n191594,1985\n191595,516\n191596,631\n191597,72\n191598,344\n191599,285\n191600,83\n191601,1359\n191602,333\n191602,779\n191602,2931\n191603,113156\n191604,179170\n191605,968\n191606,2979\n191607,1181\n191608,312\n191609,2083\n191610,179170\n191611,1368\n191612,19519\n191613,179170\n191614,55849\n191615,72\n191616,344\n191617,285\n191618,55849\n191619,119\n191620,55849\n191621,358\n191622,862\n191623,424\n191623,1085\n191624,72\n191625,344\n191626,285\n191627,179170\n191628,2784\n191629,516\n191630,1220\n191630,1222\n191631,252\n191632,146\n191632,92476\n191633,344\n191634,647\n191635,467\n191636,1882\n191637,2775\n191638,500\n191639,1052\n191640,54\n191641,1962\n191642,146\n191642,92476\n191643,647\n191644,344\n191645,647\n191646,146\n191646,92476\n191647,344\n191648,671\n191649,30\n191650,195\n191651,602\n191652,247\n191653,179170\n191654,147\n191654,158\n191655,142433\n191656,516\n191657,179170\n191658,15179\n191659,179170\n191660,3623\n191661,179170\n191662,68\n191663,647\n191664,146\n191664,92476\n191665,344\n191666,640\n191666,1515\n191667,525\n191668,136\n191669,179170\n191670,3623\n191671,795\n191671,1113\n191672,209\n191672,861\n191673,72\n191674,1368\n191675,602\n191676,577\n191677,273\n191678,1309\n191679,2116\n191680,72\n191681,1285\n191682,179170\n191683,435\n191684,30\n191685,30\n191685,195\n191685,430\n191685,1235\n191685,1335\n191685,1368\n191685,1452\n191685,1639\n191686,631\n191687,179170\n191688,30\n191689,294\n191690,179170\n191691,179170\n191692,422\n191693,56\n191694,138686\n191695,843\n191696,175\n191697,179170\n191698,19519\n191699,1773\n191700,217\n191700,1417\n191701,179170\n191702,179170\n191703,1323\n191704,102\n191705,1326\n191706,408\n191707,95554\n191708,247\n191709,171\n191710,179170\n191711,1188\n191712,422\n191713,346\n191714,422\n191715,422\n191716,422\n191717,422\n191718,422\n191719,422\n191720,422\n191721,422\n191722,422\n191723,422\n191724,422\n191725,805\n191726,862\n191727,30331\n191728,843\n191729,179170\n191730,179170\n191731,44\n191732,647\n191733,285\n191734,179170\n191735,8270\n191736,179170\n191737,10\n191738,2590\n191739,179170\n191740,118\n191740,4597\n191741,3804\n191742,269\n191743,872\n191744,179170\n191745,86\n191745,167\n191745,589\n191745,615\n191745,907\n191745,973\n191745,1124\n191745,1167\n191745,1241\n191745,1522\n191745,1782\n191745,1785\n191745,1955\n191745,3193\n191746,179170\n191747,30\n191748,934\n191749,872\n191750,1429\n191751,366\n191752,179170\n191753,179170\n191754,207\n191755,1469\n191755,189757\n191756,179170\n191757,179170\n191758,179170\n191759,179170\n191760,2367\n191761,668\n191762,83\n191763,1634\n191764,179170\n191765,818\n191766,208442\n191767,1773\n191768,1070\n191769,1300\n191769,171641\n191770,171\n191771,1143\n191772,859\n191773,355\n191774,779\n191775,171\n191776,1007\n191778,217\n191779,179170\n191781,636\n191782,779\n191786,179170\n191787,433\n191788,1400\n191789,60576\n191790,1132\n191791,781\n191792,191793\n191792,212871\n191792,214638\n191792,249280\n191792,249544\n191794,60576\n191795,433\n191796,1012\n191798,1133\n191799,1133\n191800,160\n191801,366\n191802,596\n191802,1146\n191803,60576\n191804,60576\n191805,117163\n191806,333\n191807,151\n191808,4611\n191809,712\n191810,30\n191811,54\n191812,2775\n191813,500\n191814,1052\n191815,1882\n191816,1962\n191817,2116\n191818,273\n191819,151\n191820,264\n191821,1782\n191823,8270\n191824,932\n191825,1\n191826,415\n191827,60576\n191828,859\n191830,1319\n191832,852\n191833,788\n191835,30\n191836,447\n191837,2775\n191838,2775\n191839,447\n191840,1801\n191841,138686\n191842,175\n191843,217\n191844,1147\n191845,1070\n191847,3846\n191848,1551\n191849,6556\n191849,154408\n191850,3623\n191851,872\n191852,1882\n191853,500\n191854,1052\n191855,54\n191856,1962\n191857,2775\n191859,191860\n191860,111\n191860,1579\n191860,191860\n191861,647\n191862,146\n191862,92476\n191863,344\n191865,269\n191866,1359\n191867,3623\n191868,500\n191869,1882\n191870,1052\n191871,54\n191872,2775\n191873,1962\n191874,1033\n191875,949\n191875,1618\n191876,1417\n191877,83\n191881,259\n191882,920\n191883,1466\n191884,30\n191885,147\n191886,8\n191887,3623\n191889,467\n191890,313\n191890,827\n191891,3623\n191892,147\n191894,289\n191894,290\n191894,2205\n191894,33424\n191894,94134\n191895,571\n191896,1132\n191897,781\n191899,104\n191900,843\n191901,631\n191904,179170\n191905,206\n191906,850\n191907,1659\n191908,447\n191909,2775\n191911,1381\n191911,1544\n191912,102560\n191913,388\n191914,1882\n191915,1572\n191916,599\n191917,20\n191917,1276\n191917,5310\n191918,811\n191919,1882\n191920,138686\n191921,175\n191922,602\n191923,285\n191924,3003\n191925,83\n191926,58\n191927,994\n191928,46\n191929,1033\n191930,1801\n191931,1659\n191931,1749\n191932,875\n191933,875\n191934,467\n191934,868\n191935,171\n191938,1204\n191938,1844\n191939,285\n191939,779\n191939,809\n191939,141912\n191940,222\n191941,2605\n191942,875\n191943,477\n191943,536\n191943,781\n191944,278\n191945,30\n191946,9015\n191947,83\n191948,72764\n191949,875\n191950,1033\n191951,30\n191953,360\n191954,126\n191954,872\n191955,1432\n191956,457\n191957,149\n191957,760\n191957,1052\n191958,151\n191959,3623\n191960,65\n191960,71\n191960,272\n191960,611\n191962,424\n191964,118\n191964,4597\n191965,72\n191966,181063\n191967,332\n191968,259\n191970,1147\n191971,115659\n191972,467\n191974,1773\n191975,1955\n191976,1001\n191977,1882\n191978,500\n191979,1052\n191980,54\n191981,2775\n191982,1962\n191983,22\n191984,251\n191985,447\n191988,30\n191989,309\n191989,310\n191989,483\n191990,663\n191991,389\n191992,302\n191993,720\n191994,634\n191995,447\n191996,500\n191997,366\n191998,1052\n191999,1882\n192000,54\n192001,500\n192002,2775\n192003,1962\n192005,189839\n192006,28203\n192007,536\n192008,1385\n192009,467\n192010,149\n192011,1151\n192012,1001\n192013,278\n192014,5405\n192015,1796\n192016,158\n192017,392\n192020,326\n192020,845\n192020,955\n192020,1158\n192020,5937\n192020,7300\n192020,212406\n192020,231614\n192020,237547\n192021,779\n192021,1033\n192022,1634\n192023,707\n192026,22\n192026,71\n192026,247\n192026,14472\n192027,191355\n192028,15807\n192030,918\n192031,515\n192033,843\n192034,179170\n192035,22\n192036,1294\n192037,3297\n192038,8180\n192039,179170\n192042,19519\n192043,682\n192043,72439\n192044,30\n192045,805\n192045,932\n192046,852\n192047,310\n192048,2782\n192049,179170\n192050,192051\n192052,179170\n192053,435\n192055,179170\n192056,179170\n192057,328\n192058,179170\n192059,30\n192060,60576\n192061,179170\n192062,186\n192063,1381\n192064,1149\n192065,179170\n192066,179170\n192067,1860\n192068,1858\n192069,2620\n192070,138686\n192071,843\n192072,175\n192073,333\n192074,179170\n192075,179170\n192078,58\n192079,994\n192080,46\n192081,179170\n192083,309\n192083,310\n192084,994\n192086,30\n192087,48\n192088,151\n192090,179170\n192091,30\n192092,179170\n192094,1298\n192095,1769\n192096,255\n192097,302\n192098,179170\n192099,2617\n192099,192105\n192100,192101\n192102,302\n192103,1844\n192104,1247\n192104,164572\n192106,30\n192107,34\n192107,35\n192108,179170\n192109,994\n192110,79\n192110,516\n192111,179170\n192112,179170\n192113,179170\n192114,2590\n192115,20\n192115,65\n192115,171\n192115,202\n192115,366\n192115,447\n192115,818\n192115,920\n192115,1019\n192115,1285\n192115,1368\n192115,1392\n192115,2244\n192115,31206\n192115,141912\n192118,184\n192119,240\n192119,372\n192119,1085\n192119,1715\n192120,178\n192121,30\n192122,483\n192123,158\n192124,302\n192125,30\n192126,192127\n192128,1572\n192128,1796\n192129,1285\n192130,37\n192131,312\n192132,2421\n192133,1381\n192134,179170\n192135,2626\n192136,1522\n192137,179170\n192138,1289\n192139,3999\n192140,1509\n192141,14366\n192142,7\n192143,2116\n192143,2312\n192143,2617\n192143,3804\n192144,457\n192145,994\n192146,179170\n192147,312\n192147,1882\n192148,30\n192149,918\n192150,3\n192151,861\n192152,392\n192153,179170\n192154,59021\n192155,192156\n192157,179170\n192158,179170\n192159,1608\n192160,1132\n192161,2373\n192162,1882\n192163,179170\n192164,65\n192165,1132\n192166,1608\n192167,557\n192168,328\n192169,1608\n192170,1132\n192171,752\n192172,1132\n192173,781\n192174,2674\n192175,179170\n192176,179170\n192177,30\n192178,179170\n192179,179170\n192180,250\n192180,1684\n192181,285\n192182,1132\n192183,1608\n192184,1298\n192185,1556\n192187,179170\n192188,179170\n192189,217\n192190,179170\n192191,240\n192191,299\n192191,301\n192191,968\n192191,1293\n192191,2557\n192192,30\n192193,179170\n192194,30\n192195,179170\n192196,1454\n192197,577\n192198,192199\n192200,1474\n192201,179170\n192202,30\n192203,1033\n192204,179170\n192205,2209\n192206,179170\n192207,2590\n192207,6068\n192208,1117\n192208,6068\n192209,392\n192210,861\n192211,179170\n192212,2224\n192213,435\n192214,536\n192215,30\n192216,30\n192217,358\n192218,30\n192219,179170\n192220,179170\n192221,843\n192222,673\n192223,312\n192224,392\n192225,250\n192225,1684\n192226,19519\n192227,843\n192228,72\n192229,344\n192230,285\n192231,179170\n192232,151\n192232,663\n192233,994\n192234,5405\n192235,179170\n192236,623\n192237,285\n192238,4222\n192239,1749\n192240,179170\n192241,1882\n192242,1210\n192243,30\n192244,2073\n192245,179170\n192246,179170\n192247,1149\n192248,19519\n192249,313\n192250,44\n192251,179170\n192252,872\n192253,5591\n192254,240\n192255,179170\n192256,278\n192257,1149\n192258,10\n192259,179170\n192260,179170\n192261,179170\n192262,179170\n192263,2116\n192264,179170\n192265,102\n192266,1326\n192267,1323\n192268,408\n192269,83\n192270,577\n192271,30\n192272,179170\n192273,972\n192273,973\n192273,148742\n192274,1132\n192275,192276\n192277,424\n192278,338\n192278,872\n192278,4039\n192279,179170\n192280,1012\n192281,171\n192282,179170\n192283,179170\n192284,179170\n192285,179170\n192286,179170\n192287,179170\n192288,31977\n192289,179170\n192291,577\n192292,563\n192293,147\n192294,179170\n192295,1893\n192295,2617\n192297,30331\n192298,179170\n192299,8270\n192300,1181\n192301,171\n192302,2590\n192303,215\n192304,3\n192305,192306\n192307,1860\n192308,1858\n192309,355\n192310,2443\n192311,79\n192312,1860\n192313,1858\n192314,1001\n192315,788\n192316,217\n192317,207\n192318,1085\n192320,326\n192321,859\n192322,6068\n192323,788\n192324,344\n192325,2750\n192326,872\n192327,392\n192328,48\n192329,1429\n192330,356\n192330,385\n192330,477\n192330,781\n192330,1201\n192330,1571\n192330,1881\n192330,2224\n192330,2553\n192330,7698\n192330,8463\n192331,179170\n192332,1058\n192334,1888\n192335,422\n192336,346\n192337,323\n192338,3467\n192339,3328\n192340,1452\n192341,269\n192342,3538\n192344,310\n192345,15523\n192346,2775\n192347,447\n192348,422\n192349,422\n192350,422\n192351,422\n192352,422\n192353,422\n192354,422\n192355,422\n192356,422\n192357,422\n192358,422\n192359,151\n192360,809\n192361,422\n192363,932\n192364,142405\n192365,4637\n192366,179170\n192369,843\n192372,269\n192373,1860\n192374,1858\n192375,1449\n192376,920\n192377,2146\n192378,872\n192378,127158\n192379,718\n192380,240\n192380,372\n192380,1082\n192380,1285\n192380,1309\n192380,1796\n192380,1807\n192380,1888\n192380,1955\n192380,2775\n192380,3135\n192381,358\n192382,668\n192383,338\n192383,1289\n192385,622\n192386,192387\n192389,1238\n192390,1345\n192391,994\n192392,1118\n192393,366\n192394,868\n192395,2209\n192396,1608\n192397,1132\n192398,1608\n192399,425\n192400,269\n192401,1132\n192402,1821\n192402,21736\n192403,911\n192403,2923\n192403,256311\n192404,158\n192405,972\n192405,1010\n192406,872\n192407,83\n192408,358\n192409,794\n192410,4611\n192411,1096\n192412,259\n192413,920\n192414,467\n192415,1608\n192416,1132\n192417,285\n192418,179170\n192419,972\n192419,4805\n192419,5908\n192420,1608\n192421,1132\n192422,1749\n192423,184\n192424,50\n192424,79\n192425,859\n192426,1285\n192426,4060\n192427,83\n192429,467\n192431,563\n192432,2699\n192433,442\n192433,919\n192434,1551\n192434,191860\n192435,1551\n192436,328\n192437,994\n192438,58\n192439,46\n192440,1220\n192440,1222\n192441,516\n192442,252\n192443,209\n192444,920\n192445,346\n192447,346\n192448,653\n192448,2253\n192448,142426\n192449,147\n192449,118336\n192450,120\n192451,1294\n192452,1844\n192453,158\n192454,1984\n192455,103860\n192456,147\n192456,118336\n192457,994\n192458,994\n192460,392\n192461,435\n192462,994\n192463,138686\n192464,175\n192467,3623\n192468,79\n192468,192\n192468,202\n192468,333\n192468,1181\n192469,3623\n192470,1243\n192471,44725\n192472,811\n192473,850\n192474,58\n192475,1983\n192476,1220\n192476,1222\n192477,252\n192478,251\n192479,30\n192481,3623\n192483,440\n192484,433\n192486,1085\n192487,596\n192487,2006\n192488,483\n192489,217\n192490,155473\n192491,280\n192491,393\n192491,17245\n192492,859\n192493,663\n192494,65\n192494,71\n192494,272\n192494,611\n192495,207\n192495,3612\n192495,3653\n192496,5265\n192497,994\n192498,3507\n192499,3623\n192500,3623\n192501,72764\n192502,273\n192502,644\n192503,3623\n192505,602\n192506,1179\n192507,179170\n192508,2353\n192509,1274\n192510,457\n192511,48\n192513,240\n192514,602\n192515,259\n192516,1474\n192517,1893\n192518,179170\n192519,1551\n192520,73570\n192521,87\n192522,788\n192522,1070\n192522,138686\n192522,186065\n192523,344\n192524,2353\n192525,1454\n192526,4260\n192527,46\n192528,994\n192529,58\n192530,489\n192530,577\n192530,1844\n192531,1707\n192532,30\n192534,1551\n192535,30\n192536,1882\n192537,1052\n192538,54\n192539,2775\n192540,1962\n192541,1220\n192541,1222\n192542,1220\n192542,1222\n192543,252\n192544,251\n192545,1220\n192545,1222\n192546,2867\n192546,2868\n192547,5101\n192547,15119\n192548,4771\n192549,5405\n192550,2073\n192551,493\n192551,682\n192551,72439\n192552,493\n192552,682\n192552,72439\n192553,1058\n192554,269\n192555,1458\n192556,301\n192557,994\n192558,1326\n192559,202\n192560,13661\n192561,195\n192561,1052\n192562,893\n192563,187\n192564,994\n192565,8822\n192566,1465\n192567,687\n192568,10\n192569,1368\n192570,980\n192571,179170\n192572,994\n192573,179170\n192574,346\n192575,918\n192576,515\n192577,994\n192578,192\n192579,843\n192580,422\n192581,34\n192581,35\n192582,138686\n192583,175\n192584,192585\n192586,144962\n192587,1257\n192588,298\n192589,192590\n192591,931\n192593,1298\n192594,1551\n192595,1298\n192596,30\n192597,99\n192598,73570\n192599,485\n192601,30331\n192602,30\n192604,68\n192605,1522\n192606,571\n192608,1893\n192608,117163\n192609,818\n192610,336\n192611,366\n192612,179170\n192613,30\n192615,1363\n192616,1955\n192617,852\n192617,2944\n192617,19443\n192618,788\n192618,2923\n192618,4190\n192619,30\n192620,1882\n192621,22\n192622,893\n192623,179170\n192625,151\n192626,3623\n192627,1284\n192627,148742\n192628,1058\n192629,1284\n192630,179170\n192631,3623\n192632,255\n192633,1860\n192634,1858\n192635,392\n192635,852\n192636,1220\n192636,1222\n192637,3623\n192638,32\n192638,392\n192639,179170\n192640,1085\n192641,179170\n192642,10\n192643,107\n192643,338\n192643,462\n192643,491\n192643,872\n192643,1572\n192643,1659\n192643,1722\n192643,2367\n192643,3538\n192643,4039\n192644,3623\n192645,30\n192646,30\n192647,1052\n192648,54\n192649,1882\n192650,2775\n192651,1962\n192652,222\n192653,1556\n192654,179170\n192655,3623\n192656,406\n192657,5405\n192658,19519\n192659,422\n192660,179170\n192661,1425\n192662,156379\n192663,4771\n192664,3623\n192665,3623\n192668,1284\n192668,148742\n192669,3623\n192670,3623\n192671,663\n192671,1298\n192672,30\n192673,247\n192673,2867\n192673,2868\n192674,1181\n192675,355\n192676,2334\n192677,671\n192679,107\n192680,179170\n192681,435\n192682,994\n192683,179170\n192684,636\n192684,205627\n192685,192686\n192687,3507\n192688,5906\n192689,557\n192690,626\n192691,278\n192692,137\n192693,862\n192695,422\n192696,56\n192697,843\n192698,115\n192698,118\n192699,192700\n192701,1858\n192702,1860\n192703,138\n192704,179170\n192705,179170\n192706,994\n192707,179170\n192708,179170\n192709,247\n192710,83\n192711,994\n192712,179170\n192713,994\n192714,994\n192715,1\n192716,55849\n192717,483\n192718,920\n192719,55849\n192720,179170\n192721,994\n192722,55849\n192723,120\n192724,479\n192724,920\n192725,994\n192726,179170\n192727,1858\n192728,1860\n192729,1882\n192730,932\n192731,2116\n192731,2353\n192732,1282\n192733,261\n192733,694\n192733,760\n192733,994\n192734,104\n192735,56\n192736,422\n192737,313\n192738,179170\n192739,424\n192741,1769\n192742,55849\n192743,1860\n192744,1858\n192745,179170\n192746,994\n192748,3260\n192749,179170\n192750,2620\n192751,1363\n192752,179170\n192753,920\n192754,406\n192755,142433\n192756,56\n192757,422\n192758,179170\n192759,179170\n192760,1133\n192761,72\n192762,1849\n192764,83\n192765,1881\n192766,179170\n192767,167\n192768,577\n192769,577\n192769,1368\n192770,4611\n192771,4611\n192772,30\n192773,3623\n192774,273\n192775,151\n192776,433\n192777,58\n192777,206\n192777,310\n192777,1118\n192777,3039\n192777,9318\n192778,3079\n192780,1882\n192781,811\n192782,138686\n192783,175\n192784,87\n192784,687\n192784,872\n192784,1151\n192784,1454\n192784,1556\n192785,179170\n192786,104\n192786,557\n192786,1368\n192787,1381\n192788,1881\n192789,8270\n192790,697\n192790,2989\n192790,2991\n192791,72\n192793,1782\n192793,57182\n192793,192793\n192794,563\n192795,179170\n192796,447\n192797,58\n192798,994\n192799,46\n192801,1359\n192802,14126\n192803,83\n192804,79\n192805,1359\n192806,278\n192807,1210\n192808,192809\n192810,134\n192811,179170\n192812,83\n192813,1467\n192814,278\n192815,217\n192816,536\n192817,56\n192818,422\n192819,269\n192820,795\n192821,862\n192822,56\n192823,422\n192824,179170\n192825,99\n192826,46\n192827,58\n192828,994\n192829,179170\n192830,818\n192831,285\n192832,250\n192832,1684\n192833,862\n192834,192\n192834,485\n192834,1509\n192834,1659\n192834,1688\n192834,2701\n192834,3370\n192834,14453\n192835,671\n192836,1181\n192837,1132\n192838,1474\n192839,6424\n192840,2590\n192841,356\n192842,2646\n192843,179170\n192844,304\n192845,179170\n192846,1235\n192846,1335\n192847,179170\n192848,56\n192849,422\n192850,1160\n192851,255\n192852,285\n192853,195\n192853,406\n192853,779\n192854,171\n192855,72\n192856,138686\n192857,175\n192858,273\n192859,179170\n192860,58\n192862,1235\n192862,1335\n192863,56\n192864,422\n192865,56\n192866,422\n192867,30\n192867,111\n192867,433\n192867,652\n192867,1102\n192867,5440\n192868,932\n192869,355\n192870,1707\n192871,671\n192872,808\n192874,2867\n192874,2868\n192875,1241\n192876,872\n192877,56\n192878,422\n192881,366\n192882,366\n192883,859\n192885,4223\n192886,1454\n192887,147\n192888,1238\n192889,312\n192891,217\n192893,3085\n192894,1332\n192894,3555\n192895,1801\n192896,1132\n192897,781\n192898,1551\n192899,167\n192899,483\n192899,1117\n192899,73570\n192900,37088\n192901,278\n192902,330\n192903,240\n192903,127158\n192904,151\n192905,1452\n192907,349\n192908,557\n192910,1773\n192911,186\n192911,366\n192911,718\n192911,808\n192911,1118\n192911,1566\n192912,415\n192912,5591\n192913,932\n192914,1434\n192916,567\n192916,784\n192916,1160\n192916,1452\n192917,1608\n192918,1132\n192919,1608\n192920,1608\n192921,1132\n192922,104\n192923,3260\n192927,79\n192928,406\n192929,1381\n192930,557\n192931,467\n192932,920\n192933,2915\n192934,1479\n192935,142426\n192938,344\n192938,3507\n192939,1132\n192940,1608\n192941,2923\n192942,2779\n192943,138\n192944,431\n192946,760\n192947,333\n192948,1381\n192949,217\n192950,1274\n192951,1332\n192952,73570\n192953,1368\n192955,83\n192956,83\n192957,6424\n192958,422\n192959,422\n192960,422\n192961,422\n192962,422\n192963,13538\n192964,647\n192965,422\n192966,422\n192967,422\n192968,422\n192969,422\n192970,140\n192971,138686\n192972,5301\n192973,175\n192974,422\n192975,422\n192976,1677\n192977,137\n192977,138\n192979,505\n192980,4\n192980,5\n192980,355\n192981,34\n192981,35\n192983,83\n192983,1274\n192984,349\n192985,516\n192987,192988\n192990,1227\n192990,86416\n192991,187176\n192992,687\n192992,1556\n192994,811\n192995,781\n192996,1132\n192997,1381\n192998,666\n192999,1370\n193000,925\n193002,493\n193003,390\n193003,586\n193003,636\n193003,28130\n193003,103860\n193004,868\n193005,30\n193006,113156\n193007,30\n193008,60576\n193009,406\n193010,30\n193011,30\n193013,137\n193014,179170\n193015,1983\n193016,1983\n193017,7124\n193018,372\n193019,1466\n193020,310\n193020,3039\n193021,140\n193022,1298\n193022,1436\n193023,140\n193024,1274\n193025,5101\n193026,289\n193026,290\n193026,94134\n193027,2083\n193028,827\n193029,1860\n193030,1858\n193031,1983\n193032,693\n193033,406\n193035,179170\n193036,83\n193037,1673\n193038,4611\n193040,1175\n193040,17772\n193041,3538\n193044,1425\n193045,596\n193046,240\n193047,596\n193048,193049\n193050,328\n193050,636\n193050,5405\n193051,596\n193052,596\n193055,1052\n193056,54\n193057,1882\n193058,2775\n193059,1962\n193060,1608\n193061,19519\n193062,515\n193063,1718\n193064,918\n193065,8822\n193067,142430\n193069,200\n193069,248\n193070,146\n193070,92476\n193071,647\n193072,344\n193073,581\n193074,193075\n193076,79\n193077,1243\n193078,1801\n193078,6068\n193078,214131\n193079,251\n193080,179170\n193081,1544\n193082,179170\n193083,596\n193084,179170\n193085,54\n193086,1882\n193087,1052\n193088,2775\n193089,1962\n193090,408\n193090,581\n193090,589\n193090,647\n193090,1623\n193090,1718\n193091,83\n193091,1274\n193092,251\n193094,72\n193095,483\n193096,1298\n193096,142473\n193097,247\n193097,349\n193097,392\n193098,97\n193099,602\n193100,192\n193101,1001\n193101,181063\n193101,188791\n193101,190492\n193101,212914\n193102,79\n193103,5591\n193104,83\n193105,406\n193106,1368\n193106,1715\n193106,1749\n193109,138686\n193110,175\n193111,255\n193113,312\n193114,2646\n193115,775\n193116,602\n193117,1181\n193119,278\n193120,6027\n193121,827\n193122,5440\n193123,126\n193124,58\n193125,3695\n193126,3623\n193127,179170\n193128,30\n193129,68\n193129,590\n193129,911\n193129,1663\n193129,4220\n193129,5836\n193129,7921\n193129,26087\n193129,47805\n193129,65901\n193129,65911\n193129,84257\n193129,117769\n193129,122905\n193129,193129\n193129,214860\n193129,215222\n193129,263889\n193130,1556\n193131,1551\n193132,622\n193132,1181\n193133,435\n193135,179170\n193136,30\n193137,4192\n193137,4193\n193139,140\n193140,179170\n193141,41\n193141,68\n193141,240\n193141,294\n193141,631\n193141,784\n193141,805\n193141,1119\n193141,1285\n193141,2995\n193141,3135\n193142,179170\n193143,233\n193144,179170\n193145,1368\n193146,3623\n193147,301\n193147,1298\n193148,179170\n193149,843\n193150,32\n193150,349\n193150,392\n193150,433\n193150,644\n193150,697\n193150,720\n193150,907\n193150,1634\n193150,2191\n193150,2699\n193150,3260\n193150,15609\n193151,1181\n193152,179170\n193153,179170\n193154,577\n193154,852\n193157,1224\n193158,146\n193158,92476\n193159,344\n193160,647\n193161,1782\n193162,885\n193162,13704\n193163,2989\n193163,2991\n193164,179170\n193165,179170\n193166,1556\n193167,48\n193168,392\n193169,179170\n193170,158\n193171,340\n193172,120368\n193173,179170\n193174,1454\n193175,50\n193176,30\n193177,994\n193178,56\n193179,422\n193181,918\n193182,30\n193183,1252\n193183,1253\n193184,151\n193185,30\n193186,179170\n193187,179170\n193188,483\n193189,179170\n193190,577\n193190,1429\n193191,795\n193192,207\n193193,72\n193194,2989\n193194,2991\n193196,338\n193197,72\n193198,406\n193199,72\n193200,289\n193200,290\n193200,94134\n193201,6837\n193202,142426\n193203,4594\n193205,111142\n193206,30\n193207,640\n193208,2590\n193209,72\n193210,179170\n193211,72\n193212,1\n193212,2750\n193213,1363\n193214,179170\n193215,30\n193216,622\n193217,147\n193218,406\n193218,779\n193219,30\n193220,30\n193221,30\n193222,193223\n193224,58\n193225,30\n193226,30\n193227,72\n193228,179170\n193229,179170\n193230,179170\n193231,206\n193232,179170\n193233,389\n193234,447\n193235,907\n193235,1010\n193235,1837\n193235,20359\n193236,179170\n193237,872\n193238,1429\n193239,240\n193240,536\n193241,3623\n193242,6424\n193243,1882\n193244,1052\n193245,1962\n193246,54\n193247,1882\n193248,2775\n193249,2699\n193250,10\n193251,435\n193252,557\n193253,862\n193254,841\n193255,252\n193255,1385\n193256,302\n193257,2735\n193258,56\n193259,422\n193260,179170\n193261,285\n193262,843\n193263,1773\n193264,557\n193265,862\n193266,346\n193267,346\n193268,179170\n193269,23783\n193270,366\n193271,1132\n193272,1608\n193273,72\n193274,192\n193274,1509\n193274,3370\n193274,14453\n193275,179170\n193276,138686\n193277,1326\n193278,1\n193279,3\n193280,861\n193281,994\n193283,349\n193284,3507\n193285,3507\n193286,13361\n193287,30\n193288,179170\n193289,72\n193290,179170\n193291,72\n193292,158\n193293,301\n193293,455\n193294,602\n193295,68\n193295,4220\n193296,179170\n193297,179170\n193298,818\n193300,19010\n193301,55849\n193303,160\n193304,209\n193304,861\n193305,424\n193306,8270\n193307,267\n193308,841\n193309,179170\n193310,179170\n193311,81\n193312,138686\n193313,175\n193315,179170\n193316,323\n193317,83\n193318,1188\n193318,142870\n193319,179170\n193320,195\n193320,1052\n193321,1782\n193322,104\n193323,181398\n193324,366\n193325,179170\n193326,179170\n193327,179170\n193328,179170\n193329,179170\n193330,179170\n193331,240\n193332,179170\n193333,134\n193333,372\n193333,2209\n193334,332\n193334,1309\n193335,949\n193336,142870\n193337,994\n193338,2719\n193339,68\n193340,147\n193340,158\n193341,4\n193341,5\n193342,450\n193342,611\n193342,1927\n193343,179170\n193344,193345\n193346,557\n193347,147\n193348,1326\n193349,102\n193350,1323\n193351,408\n193352,179170\n193353,285\n193354,83\n193355,4504\n193356,30\n193357,326\n193358,72\n193359,193360\n193361,179170\n193362,72\n193363,1474\n193364,850\n193365,673\n193366,179170\n193367,4\n193367,5\n193368,179170\n193369,195\n193370,179170\n193371,179170\n193372,818\n193373,1715\n193374,179170\n193375,1001\n193376,1149\n193377,2931\n193378,193379\n193380,193379\n193381,193379\n193382,193379\n193383,175\n193384,137\n193385,455\n193385,1019\n193386,366\n193387,366\n193388,255\n193389,179170\n193390,179170\n193391,179170\n193392,301\n193392,631\n193392,1010\n193392,1133\n193393,2116\n193394,278\n193395,991\n193396,338\n193396,1052\n193396,1381\n193396,3695\n193397,217\n193398,179170\n193399,1551\n193400,2224\n193401,355\n193402,577\n193403,30331\n193404,1860\n193405,1858\n193406,2367\n193407,5366\n193409,193410\n193411,193412\n193413,388\n193413,3193\n193414,479\n193415,1238\n193416,1381\n193417,4039\n193419,137\n193420,113156\n193421,2266\n193422,1715\n193423,360\n193424,30\n193426,1379\n193428,585\n193429,1452\n193430,140\n193432,636\n193433,158\n193435,668\n193436,1143\n193437,994\n193438,58\n193439,46\n193440,2367\n193440,8820\n193441,698\n193442,1707\n193443,358\n193444,333\n193445,1127\n193447,455\n193448,167\n193448,73570\n193449,346\n193450,1370\n193451,360\n193452,596\n193453,779\n193454,349\n193454,875\n193454,3260\n193455,932\n193456,872\n193457,58\n193458,46\n193459,994\n193460,2671\n193461,252\n193462,336\n193463,30\n193464,841\n193465,275\n193466,58\n193467,994\n193468,46\n193469,818\n193470,703\n193472,1551\n193473,346\n193474,920\n193475,467\n193476,1707\n193477,1319\n193478,83\n193479,1858\n193480,1860\n193481,718\n193482,179170\n193483,138686\n193484,175\n193487,179170\n193489,1132\n193490,13137\n193492,356\n193493,192\n193493,1089\n193494,485\n193495,298\n193496,563\n193497,1212\n193499,1147\n193500,179170\n193501,356\n193501,1564\n193502,217\n193503,193504\n193505,298\n193506,485\n193507,1313\n193508,179170\n193509,179170\n193510,862\n193511,179170\n193512,193513\n193514,875\n193515,1052\n193516,1882\n193517,54\n193518,2775\n193519,1962\n193520,192\n193521,356\n193522,1119\n193523,298\n193524,485\n193525,302\n193525,1722\n193525,3258\n193526,298\n193527,485\n193528,875\n193529,179170\n193531,179170\n193532,1238\n193533,86\n193533,972\n193533,1849\n193536,843\n193537,596\n193538,298\n193539,485\n193540,994\n193541,46\n193542,58\n193543,1052\n193544,54\n193545,1882\n193546,2775\n193547,1962\n193548,5714\n193548,72439\n193549,615\n193550,31073\n193551,255\n193552,56\n193553,422\n193554,58\n193555,994\n193556,46\n193557,875\n193560,16953\n193561,1284\n193562,1132\n193563,781\n193565,58\n193566,994\n193567,46\n193568,1860\n193569,1858\n193570,63\n193570,516\n193570,1220\n193570,1222\n193572,818\n193573,298\n193573,704\n193573,911\n193574,636\n193575,1551\n193576,179170\n193577,360\n193578,259\n193578,693\n193578,1070\n193578,4455\n193578,139992\n193578,193578\n193578,237079\n193578,256579\n193579,483\n193580,1962\n193581,636\n193582,509\n193583,1\n193583,79\n193583,163\n193583,192\n193583,275\n193583,340\n193583,571\n193583,620\n193583,703\n193583,788\n193583,827\n193583,1309\n193583,1313\n193583,4597\n193584,422\n193585,647\n193586,422\n193587,422\n193588,422\n193589,422\n193590,422\n193591,775\n193592,422\n193594,422\n193595,30\n193597,309\n193597,310\n193600,1381\n193601,3999\n193603,875\n193604,602\n193604,3218\n193605,1247\n193605,164572\n193606,186\n193606,217\n193606,808\n193606,1417\n193607,137\n193608,248\n193609,30\n193610,30331\n193611,267\n193612,136\n193612,137\n193613,19010\n193613,22293\n193614,344\n193615,707\n193616,1220\n193616,1222\n193619,516\n193620,252\n193621,200\n193622,179170\n193623,1414\n193624,301\n193625,22\n193626,87\n193627,167\n193627,73570\n193628,179170\n193629,193630\n193631,493\n193633,992\n193634,240\n193634,631\n193638,918\n193639,1458\n193640,788\n193643,595\n193644,485\n193645,298\n193646,187176\n193647,72\n193648,4810\n193649,435\n193650,1619\n193651,179170\n193652,433\n193653,336\n193655,104\n193656,743\n193657,138686\n193658,175\n193659,1612\n193659,4455\n193660,149\n193662,801\n193663,636\n193665,79\n193665,140\n193665,158\n193665,585\n193665,818\n193665,861\n193665,1715\n193665,3872\n193665,5440\n193665,6027\n193666,557\n193667,435\n193668,1359\n193669,1085\n193670,179170\n193671,252\n193672,217\n193673,1284\n193674,949\n193674,2620\n193674,17263\n193675,843\n193675,1893\n193675,2312\n193676,636\n193677,440\n193678,515\n193681,843\n193682,140\n193683,193684\n193685,72\n193686,415\n193687,142426\n193688,1983\n193689,252\n193689,1465\n193690,20\n193690,644\n193690,783\n193690,838\n193690,1363\n193690,1572\n193690,2704\n193690,17897\n193691,406\n193692,1127\n193693,179170\n193694,994\n193695,48\n193696,1432\n193697,94\n193697,2787\n193698,289\n193698,290\n193698,94134\n193699,14434\n193700,1773\n193701,2779\n193701,2784\n193702,2779\n193702,2784\n193703,273\n193704,415\n193705,2779\n193705,2784\n193706,2779\n193706,2784\n193707,392\n193709,83\n193710,918\n193711,2775\n193712,447\n193713,193714\n193715,1882\n193716,151\n193717,292\n193718,264\n193718,1127\n193718,1381\n193718,1893\n193719,326\n193719,809\n193719,3260\n193719,22293\n193720,179170\n193721,72\n193722,344\n193723,285\n193724,179170\n193725,23783\n193726,179170\n193727,179170\n193728,932\n193728,991\n193728,9029\n193729,1479\n193730,30\n193731,3623\n193732,179170\n193733,328\n193734,179170\n193735,179170\n193736,911\n193737,34\n193737,35\n193737,2224\n193738,489\n193739,1179\n193741,309\n193741,310\n193742,179170\n193743,2443\n193744,195\n193746,206\n193747,88820\n193748,138\n193749,865\n193750,557\n193751,137\n193752,118\n193752,4597\n193753,88820\n193754,994\n193755,193756\n193757,827\n193757,920\n193758,179170\n193759,994\n193760,138686\n193761,179170\n193762,175\n193764,189839\n193765,148742\n193767,605\n193770,30\n193771,338\n193772,485\n193773,298\n193774,1858\n193775,1860\n193776,87\n193776,392\n193776,1722\n193777,4691\n193778,483\n193779,346\n193780,809\n193781,55849\n193782,2266\n193783,1882\n193784,422\n193785,596\n193786,56\n193787,422\n193788,422\n193789,485\n193790,298\n193791,56\n193792,422\n193793,1181\n193794,1474\n193795,1572\n193796,1805\n193797,313\n193798,193799\n193800,30\n193801,179170\n193802,422\n193803,56\n193804,557\n193805,467\n193806,179170\n193807,602\n193808,72\n193809,179170\n193810,179170\n193811,179170\n193812,298\n193813,485\n193814,79\n193814,97\n193814,178\n193814,192\n193814,406\n193814,493\n193814,586\n193814,779\n193814,1181\n193814,1370\n193815,652\n193816,56\n193817,422\n193818,1345\n193819,138686\n193820,179170\n193821,179170\n193822,56\n193823,422\n193824,179170\n193825,179170\n193826,422\n193827,422\n193828,422\n193829,422\n193830,422\n193831,179170\n193832,422\n193833,422\n193834,255\n193835,422\n193836,422\n193837,422\n193838,179170\n193839,179170\n193840,269\n193842,179170\n193843,104\n193844,175\n193845,179170\n193846,332\n193847,179170\n193848,179170\n193849,179170\n193850,179170\n193851,843\n193852,193853\n193854,179170\n193855,30\n193857,179170\n193858,1381\n193858,1452\n193858,1639\n193859,1893\n193861,179170\n193862,1326\n193863,102\n193864,1323\n193865,408\n193866,72\n193867,2367\n193868,193869\n193870,179170\n193871,68\n193872,179170\n193873,193873\n193874,179170\n193875,179170\n193876,179170\n193877,179170\n193879,1181\n193880,193881\n193882,3623\n193883,875\n193884,83\n193885,269\n193886,83\n193887,1132\n193888,1608\n193889,30\n193890,193891\n193892,30\n193893,2923\n193894,602\n193895,285\n193896,250\n193896,1684\n193897,179170\n193898,431\n193898,631\n193898,2590\n193899,83\n193900,250\n193900,1684\n193901,179170\n193902,3623\n193903,285\n193904,3623\n193905,179170\n193906,225\n193907,2590\n193908,179170\n193909,875\n193910,589\n193910,1001\n193910,1085\n193911,1033\n193912,179170\n193913,9026\n193915,8884\n193916,193917\n193918,193919\n193920,193921\n193922,1085\n193923,171\n193924,366\n193925,366\n193926,366\n193927,422\n193929,206\n193929,2146\n193929,7124\n193930,3623\n193931,72\n193932,355\n193934,392\n193935,31977\n193936,134\n193937,193938\n193939,179170\n193941,1796\n193943,1707\n193944,146\n193944,92476\n193946,1241\n193947,283\n193948,2416\n193948,2417\n193949,127158\n193950,932\n193951,147\n193951,467\n193952,3135\n193953,1414\n193954,298\n193955,485\n193956,3830\n193957,72\n193958,872\n193959,358\n193960,2073\n193961,56\n193962,422\n193963,58\n193964,83\n193965,332\n193965,788\n193965,9007\n193966,872\n193967,872\n193968,273\n193969,202\n193970,485\n193971,298\n193972,872\n193973,392\n193974,179170\n193975,179170\n193976,972\n193976,1293\n193977,127158\n193979,285\n193983,1284\n193984,1287\n193985,1284\n193986,3370\n193986,14453\n193987,2083\n193988,1284\n193989,56\n193990,422\n193991,1284\n193994,1119\n193994,1285\n193996,1882\n193997,193998\n193999,19519\n194000,2867\n194000,2868\n194001,298\n194002,485\n194003,422\n194004,422\n194007,5301\n194008,194009\n194010,1882\n194011,55849\n194012,1893\n194013,1085\n194014,360\n194015,485\n194016,298\n194017,30\n194018,1127\n194019,6323\n194020,1319\n194021,30\n194022,222\n194023,158\n194024,147\n194025,287\n194026,19519\n194027,1085\n194028,138686\n194029,175\n194030,1014\n194031,1014\n194032,1891\n194033,1014\n194034,1014\n194035,1014\n194036,1014\n194037,1014\n194038,1014\n194039,1014\n194040,1014\n194041,1313\n194042,269\n194043,222\n194044,30\n194045,422\n194046,56\n194047,72\n194048,179170\n194049,1385\n194050,72\n194051,179170\n194052,179170\n194053,179170\n194054,142870\n194055,154408\n194056,483\n194057,179170\n194058,861\n194059,1882\n194060,3623\n194061,626\n194062,30\n194063,34\n194063,35\n194064,1479\n194065,390\n194066,32751\n194067,158\n194067,192\n194067,592\n194068,194069\n194070,179170\n194071,422\n194072,56\n194074,1326\n194075,485\n194076,298\n194077,422\n194078,56\n194079,440\n194080,175\n194080,693\n194080,1188\n194081,1882\n194082,346\n194083,240\n194084,179170\n194085,179170\n194086,1326\n194087,1323\n194088,408\n194089,102\n194090,179170\n194091,179170\n194092,1882\n194093,779\n194093,15523\n194094,72\n194094,6323\n194095,206\n194096,30\n194097,187\n194098,72\n194099,1415\n194101,346\n194102,299\n194103,640\n194104,147\n194105,179170\n194106,1707\n194107,179170\n194108,850\n194109,30\n194110,179170\n194111,179170\n194112,179170\n194113,179170\n194114,179170\n194115,179170\n194117,30\n194118,356\n194119,872\n194120,355\n194121,2073\n194121,68069\n194122,179170\n194123,107\n194124,2416\n194124,2417\n194125,292\n194126,338\n194127,298\n194128,1133\n194129,3538\n194130,358\n194131,192\n194131,663\n194132,932\n194133,932\n194134,749\n194135,179170\n194136,30\n194137,30\n194138,2784\n194138,115474\n194139,1072\n194140,1572\n194141,135\n194142,1707\n194143,636\n194144,269\n194145,1707\n194146,1805\n194147,1284\n194148,55849\n194150,1284\n194156,1284\n194157,1284\n194161,718\n194162,346\n194163,640\n194164,994\n194165,30\n194166,1882\n194167,72\n194168,483\n194170,194171\n194172,440\n194173,1707\n194176,30\n194177,71\n194177,485\n194178,707\n194179,1773\n194180,79\n194181,179170\n194182,994\n194183,994\n194184,30\n194185,30\n194186,994\n194187,179170\n194188,994\n194189,615\n194190,346\n194191,179170\n194192,467\n194193,1146\n194194,5908\n194195,179170\n194196,26041\n194197,30\n194199,994\n194200,440\n194201,5908\n194202,1085\n194203,346\n194204,440\n194205,718\n194206,392\n194207,194208\n194207,203691\n194207,235049\n194209,30\n194210,577\n194211,179170\n194212,30\n194214,392\n194215,179170\n194216,147\n194217,138686\n194218,175\n194219,194220\n194221,313\n194222,30\n194223,346\n194224,179170\n194225,240\n194226,714\n194226,2008\n194227,194228\n194229,557\n194230,557\n194231,557\n194232,1359\n194233,30\n194234,392\n194235,30\n194236,1368\n194237,30\n194238,1014\n194239,1014\n194240,1014\n194241,1014\n194242,1014\n194243,1882\n194244,1014\n194245,2105\n194247,1113\n194248,194249\n194250,248\n194251,142473\n194252,54362\n194253,217\n194254,366\n194255,30\n194256,83\n194257,202\n194258,843\n194259,7155\n194260,1580\n194261,1458\n194262,346\n194263,285\n194264,841\n194265,179170\n194266,179170\n194267,312\n194268,294\n194269,611\n194270,620\n194271,30\n194272,406\n194273,30\n194274,179170\n194275,179170\n194276,255\n194277,306\n194277,307\n194278,30\n194279,30\n194280,779\n194281,1515\n194282,72\n194283,366\n194284,366\n194285,68\n194286,292\n194287,294\n194288,296\n194289,298\n194290,1773\n194291,298\n194292,485\n194293,2353\n194294,192\n194295,3999\n194296,355\n194297,211\n194297,779\n194297,1368\n194297,2797\n194298,588\n194298,590\n194298,805\n194299,1888\n194300,1882\n194301,248\n194302,360\n194302,4571\n194303,68\n194304,698\n194305,1238\n194306,22293\n194307,994\n194308,251\n194309,1773\n194310,1452\n194313,620\n194314,30\n194315,115474\n194316,1167\n194317,104\n194318,2775\n194319,447\n194320,162599\n194321,994\n194322,1707\n194323,406\n194324,1551\n194326,1\n194327,2353\n194327,9457\n194328,467\n194328,571\n194329,209\n194329,302\n194330,314\n194330,392\n194330,467\n194330,595\n194330,703\n194330,818\n194330,872\n194330,918\n194330,1151\n194330,1363\n194330,1453\n194331,868\n194334,1132\n194335,1608\n194336,140\n194337,138\n194339,1608\n194340,1132\n194342,932\n194343,1608\n194344,1132\n194345,189794\n194346,83\n194347,306\n194347,307\n194348,516\n194349,252\n194350,1220\n194350,1222\n194351,55849\n194352,1\n194353,77\n194354,1332\n194355,647\n194356,1608\n194357,1132\n194358,868\n194359,518\n194362,671\n194363,515\n194364,1515\n194365,779\n194366,9457\n194367,875\n194368,868\n194370,4571\n194370,88820\n194376,138686\n194377,760\n194378,175\n194379,422\n194380,422\n194381,422\n194382,422\n194383,422\n194384,422\n194385,30\n194387,422\n194389,422\n194390,640\n194391,30\n194392,652\n194393,422\n194394,920\n194395,467\n194396,2775\n194397,447\n194399,1882\n194400,920\n194401,2168\n194402,209\n194402,302\n194403,292\n194403,422\n194403,644\n194403,877\n194403,1012\n194403,2353\n194403,2699\n194403,5469\n194403,75912\n194404,406\n194405,1531\n194406,163\n194407,877\n194407,1284\n194407,148742\n194408,440\n194408,1033\n194409,140\n194410,194411\n194412,1132\n194413,1608\n194415,852\n194418,994\n194419,104\n194420,1715\n194421,850\n194422,59021\n194423,147\n194424,77\n194425,269\n194426,455\n194426,631\n194426,1612\n194428,390\n194429,1220\n194429,1222\n194430,516\n194431,252\n194432,1877\n194433,162599\n194434,138686\n194435,175\n194436,1882\n194437,184\n194438,485\n194439,298\n194440,192\n194443,440\n194444,1247\n194444,164572\n194446,179170\n194447,142870\n194448,1390\n194450,1458\n194451,390\n194452,346\n194456,346\n194457,1294\n194458,179170\n194459,79\n194459,1927\n194460,852\n194461,919\n194462,1\n194462,4\n194462,5\n194462,184\n194463,750\n194463,3115\n194464,3585\n194466,652\n194467,192\n194467,336\n194467,1181\n194467,1623\n194468,3367\n194469,149\n194469,406\n194469,1425\n194470,973\n194471,1608\n194472,1132\n194473,1882\n194474,1285\n194475,346\n194478,179170\n194480,1149\n194481,120\n194481,240\n194481,264\n194481,406\n194481,467\n194481,877\n194481,1462\n194481,33424\n194481,245910\n194482,360\n194485,611\n194486,433\n194487,1556\n194489,1146\n194490,13361\n194492,752\n194492,9024\n194493,718\n194495,217\n194496,22293\n194497,346\n194498,620\n194499,422\n194500,3623\n194501,891\n194503,827\n194504,406\n194505,215\n194506,577\n194507,1707\n194509,163\n194510,306\n194510,307\n194511,1515\n194512,779\n194514,73570\n194515,406\n194519,194520\n194521,176782\n194523,194524\n194525,30\n194526,784\n194526,1052\n194526,5101\n194530,1881\n194531,179170\n194532,1284\n194532,148742\n194533,1284\n194533,148742\n194534,360\n194536,179170\n194538,707\n194540,1284\n194540,148742\n194541,306\n194541,307\n194544,55849\n194546,1284\n194546,148742\n194547,1284\n194548,130\n194549,360\n194550,179170\n194551,1544\n194552,19010\n194552,22293\n194553,30\n194554,107\n194555,309\n194555,310\n194556,2266\n194557,298\n194557,911\n194558,298\n194559,485\n194560,312\n194560,1231\n194561,843\n194562,483\n194563,1509\n194564,577\n194565,843\n194566,5301\n194567,179170\n194568,843\n194569,424\n194570,3\n194571,1707\n194574,1551\n194575,3507\n194576,255\n194579,302\n194580,760\n194581,63471\n194582,252\n194582,516\n194584,179170\n194585,189788\n194586,120\n194587,852\n194589,5591\n194590,852\n194591,435\n194592,179170\n194593,179170\n194594,875\n194596,5301\n194597,179170\n194598,83\n194599,159365\n194601,2296\n194602,356\n194602,801\n194603,73570\n194604,843\n194605,536\n194606,1882\n194607,333\n194609,1849\n194610,179170\n194611,73570\n194612,179170\n194613,918\n194614,387\n194615,1287\n194616,1293\n194617,872\n194618,515\n194619,179170\n194620,301\n194621,1267\n194622,920\n194623,875\n194624,273\n194625,1085\n194626,151\n194627,194628\n194629,1572\n194630,360\n194631,192\n194632,30\n194633,155481\n194634,55849\n194635,493\n194635,1127\n194636,147191\n194637,1556\n194638,217\n194638,1417\n194641,19010\n194642,179170\n194643,447\n194644,2775\n194645,1623\n194645,194645\n194645,261733\n194646,255\n194647,485\n194648,298\n194649,194650\n194651,485\n194652,298\n194654,217\n194655,179170\n194656,622\n194657,852\n194658,360\n194660,83\n194660,278\n194661,392\n194661,415\n194661,1240\n194661,1454\n194661,1465\n194662,1181\n194664,10\n194665,188791\n194666,2421\n194667,147\n194668,179170\n194669,1\n194670,1132\n194671,1608\n194672,158\n194672,640\n194673,179170\n194674,779\n194675,557\n194676,313\n194677,34\n194677,35\n194677,1313\n194677,2646\n194678,885\n194678,13704\n194679,194663\n194680,346\n194681,602\n194682,1133\n194683,273\n194684,346\n194685,194686\n194687,298\n194688,485\n194690,4611\n194691,202\n194691,1332\n194692,2373\n194693,346\n194694,3623\n194695,875\n194696,193878\n194697,194698\n194699,1882\n194700,1323\n194701,408\n194702,102\n194703,1326\n194704,179170\n194705,1474\n194706,179170\n194707,809\n194708,843\n194709,1544\n194710,3695\n194711,134\n194712,179170\n194713,1515\n194714,326\n194715,269\n194716,83\n194716,120\n194716,217\n194716,493\n194716,852\n194716,1133\n194716,1466\n194716,1608\n194717,6638\n194718,360\n194719,3218\n194720,63\n194721,5662\n194722,1436\n194723,1479\n194724,217\n194725,389\n194726,1849\n194727,682\n194727,72439\n194728,388\n194729,1001\n194730,620\n194731,1635\n194732,557\n194733,5718\n194734,518\n194735,30\n194736,73570\n194737,56\n194738,1326\n194739,673\n194740,1241\n194741,346\n194742,749\n194743,1985\n194744,850\n194745,7155\n194746,1359\n194747,447\n194748,2775\n194750,968\n194751,2979\n194752,2083\n194753,269\n194754,278\n194755,247\n194756,1381\n194758,1684\n194760,312\n194761,194762\n194763,142405\n194764,55849\n194765,211\n194765,949\n194765,1655\n194765,1844\n194765,2209\n194765,8270\n194766,179170\n194767,179170\n194769,55849\n194770,994\n194771,72\n194772,557\n194773,179170\n194774,994\n194775,1807\n194776,179170\n194777,304\n194778,406\n194779,640\n194780,2116\n194781,602\n194782,390\n194783,602\n194785,179170\n194786,179170\n194787,179170\n194788,285\n194789,56\n194790,577\n194791,83\n194792,1821\n194792,21736\n194793,2506\n194794,179170\n194795,179170\n194796,346\n194797,179170\n194798,346\n194799,138686\n194800,175\n194801,252\n194802,179170\n194803,563\n194804,718\n194805,3623\n194806,346\n194807,1608\n194808,447\n194809,2775\n194810,2048\n194811,215\n194812,285\n194813,179170\n194814,72\n194815,179170\n194816,179170\n194817,179170\n194818,1769\n194819,83\n194820,175\n194821,179170\n194823,30331\n194824,333\n194825,346\n194826,179170\n194827,346\n194828,179170\n194829,179170\n194830,179170\n194831,2266\n194832,104\n194833,2590\n194834,179170\n194835,215\n194836,179170\n194837,179170\n194838,994\n194839,269\n194840,900\n194841,509\n194842,872\n194843,1429\n194844,366\n194845,1882\n194846,366\n194847,366\n194848,59\n194848,1313\n194848,2646\n194848,3794\n194849,179170\n194850,346\n194851,68\n194851,431\n194851,589\n194851,631\n194851,994\n194851,1001\n194851,1474\n194851,1789\n194851,8884\n194851,44725\n194852,207\n194853,668\n194854,206\n194855,77\n194856,179170\n194857,620\n194858,179170\n194859,179170\n194860,1467\n194861,406\n194862,179170\n194863,179170\n194864,1955\n194865,215\n194866,1564\n194867,227\n194868,714\n194868,2008\n194869,589\n194870,3804\n194872,135\n194873,388\n194874,1515\n194875,779\n194876,2424\n194877,500\n194878,1143\n194879,435\n194880,355\n194881,13137\n194882,50\n194882,195\n194882,406\n194882,620\n194883,1085\n194884,179170\n194885,433\n194886,269\n194887,843\n194888,2292\n194889,58\n194890,46\n194891,994\n194892,349\n194893,3630\n194894,179170\n194895,422\n194897,179170\n194898,56\n194899,422\n194900,179170\n194901,485\n194902,298\n194904,190492\n194904,194905\n194906,292\n194906,852\n194907,1707\n194908,55849\n194911,217\n194911,657\n194912,1332\n194913,644\n194913,3003\n194914,30\n194915,1860\n194916,1858\n194917,779\n194917,19010\n194918,467\n194919,360\n194920,134\n194921,788\n194922,1465\n194924,2205\n194924,33424\n194925,167\n194925,868\n194927,13980\n194928,868\n194929,666\n194931,1132\n194932,1608\n194933,1465\n194934,433\n194935,1608\n194937,1132\n194940,762\n194941,1608\n194942,1132\n194943,138\n194944,79\n194945,118\n194945,4597\n194946,433\n194947,179170\n194948,30\n194949,13980\n194951,1531\n194952,422\n194953,422\n194954,422\n194955,422\n194956,422\n194957,422\n194958,422\n194959,422\n194960,422\n194961,422\n194962,147\n194963,217\n194963,1796\n194964,779\n194965,179170\n194967,301\n194967,2083\n194968,779\n194968,1515\n194970,920\n194971,408\n194971,1326\n194972,160\n194972,736\n194972,3653\n194973,179170\n194974,147\n194975,467\n194976,1052\n194977,1962\n194978,54\n194979,1882\n194980,2775\n194981,1608\n194982,1132\n194983,30\n194985,1801\n194987,1332\n194988,106\n194988,8537\n194989,1070\n194989,1133\n194990,179170\n194991,83\n194993,48\n194994,30\n194995,30\n194997,849\n194998,1458\n194998,149534\n194999,138686\n195000,175\n195001,1224\n195002,15\n195003,30\n195004,644\n195005,3260\n195006,30\n195007,278\n195008,142430\n195008,142473\n195008,142879\n195009,389\n195010,1257\n195011,2590\n195012,1058\n195013,137\n195014,4223\n195016,217\n195017,206\n195021,818\n195022,557\n195025,872\n195026,251\n195027,289\n195027,290\n195027,94134\n195028,148742\n195029,2334\n195030,217\n195031,346\n195032,1172\n195033,23783\n195034,55849\n195035,315\n195036,160\n195037,346\n195038,360\n195039,167\n195040,1860\n195041,1858\n195042,195043\n195044,422\n195045,56\n195046,628\n195047,222\n195048,5718\n195048,127158\n195049,1432\n195049,205627\n195051,179170\n195054,356\n195054,2646\n195054,188791\n195055,3769\n195057,366\n195058,919\n195059,1118\n195060,968\n195062,179170\n195063,142430\n195063,142879\n195064,698\n195065,1860\n195066,1858\n195068,179170\n195069,104\n195069,134\n195069,248\n195069,264\n195069,289\n195069,290\n195069,298\n195069,503\n195069,557\n195069,631\n195069,636\n195069,1016\n195069,1119\n195069,1282\n195069,1631\n195069,1745\n195069,1955\n195069,2209\n195069,94134\n195070,32\n195070,138\n195071,2674\n195071,102560\n195072,179170\n195073,179170\n195074,179170\n195075,707\n195076,999\n195076,1801\n195077,252\n195078,83\n195079,149\n195080,333\n195082,15573\n195083,2116\n195084,179170\n195085,179170\n195086,138\n195087,364\n195088,4611\n195089,144556\n195091,872\n195092,422\n195093,932\n195094,155473\n195095,155473\n195096,663\n195097,71\n195097,272\n195097,611\n195099,1132\n195100,1608\n195101,720\n195103,1837\n195104,136\n195105,1132\n195106,200\n195108,1608\n195109,1241\n195110,1860\n195111,1858\n195112,1294\n195113,138\n195114,390\n195116,872\n195116,1118\n195116,1796\n195118,83\n195120,1707\n195121,1143\n195123,142430\n195124,179170\n195126,1858\n195127,1860\n195128,3367\n195129,138686\n195130,175\n195132,422\n195133,5405\n195134,355\n195135,1860\n195136,1858\n195137,179170\n195138,195139\n195140,104\n195141,515\n195142,83\n195144,991\n195145,124668\n195146,179170\n195148,973\n195150,2146\n195151,179170\n195153,44\n195154,536\n195155,215\n195156,1644\n195157,179170\n195159,1122\n195160,389\n195161,843\n195162,1688\n195163,2668\n195164,1544\n195165,467\n195166,309\n195166,310\n195167,179170\n195168,1284\n195168,148742\n195170,179170\n195171,21442\n195173,1284\n195173,148742\n195174,1293\n195175,30\n195176,1274\n195177,179170\n195178,142870\n195179,1556\n195180,1284\n195180,148742\n195181,195182\n195183,179170\n195185,1882\n195186,151\n195187,994\n195188,1284\n195189,179170\n195190,118\n195190,422\n195190,4597\n195190,5405\n195191,8907\n195192,920\n195193,1564\n195194,3695\n195195,3161\n195196,285\n195197,1284\n195198,255\n195199,3538\n195200,65\n195201,146952\n195202,483\n195203,56\n195204,422\n195205,179170\n195206,195207\n195208,2421\n195209,34\n195209,35\n195210,30\n195211,186\n195211,349\n195212,179170\n195213,179170\n195214,192\n195215,30\n195216,179170\n195217,179170\n195218,83\n195218,283\n195218,949\n195219,563\n195220,30\n195221,1085\n195223,2205\n195223,33424\n195224,3094\n195225,5591\n195226,1001\n195227,179170\n195228,146\n195228,92476\n195229,1707\n195230,179170\n195231,7360\n195232,1860\n195233,1858\n195234,179170\n195235,1\n195236,195237\n195238,179170\n195239,147\n195240,406\n195241,1722\n195242,179170\n195243,4611\n195244,144556\n195245,269\n195246,30\n195247,30\n195249,192\n195249,485\n195249,1509\n195249,1659\n195249,1688\n195249,2701\n195249,3370\n195249,14453\n195250,1274\n195251,151\n195252,217\n195253,346\n195254,113156\n195255,2979\n195256,48\n195257,1010\n195258,346\n195259,1467\n195260,30\n195261,1769\n195262,48\n195263,179170\n195264,467\n195265,103860\n195266,891\n195267,1019\n195268,2371\n195269,1749\n195270,920\n195271,217\n195272,640\n195273,1655\n195274,2373\n195275,3\n195275,538\n195276,202\n195277,818\n195278,179170\n195279,7416\n195280,682\n195280,72439\n195281,636\n195282,1012\n195283,179170\n195284,1118\n195286,431\n195286,775\n195286,188791\n195288,525\n195289,30\n195290,34\n195290,35\n195290,278\n195290,313\n195290,634\n195290,1313\n195290,1467\n195290,1718\n195290,2224\n195290,2646\n195290,5326\n195291,1309\n195292,19010\n195293,2244\n195294,571\n195295,1285\n195296,2073\n195297,72\n195298,1805\n195299,631\n195300,179170\n195301,41\n195302,294\n195303,994\n195304,1326\n195305,1323\n195306,102\n195307,408\n195308,195\n195309,1556\n195310,289\n195310,290\n195310,94134\n195311,346\n195312,647\n195313,146\n195313,92476\n195314,344\n195315,142473\n195316,30\n195317,589\n195318,1167\n195319,1785\n195320,605\n195321,1241\n195322,1124\n195323,1782\n195324,179170\n195325,973\n195326,86\n195327,1033\n195328,179170\n195329,1749\n195330,781\n195331,1132\n195332,179170\n195333,809\n195334,366\n195335,179170\n195336,79\n195337,195338\n195339,647\n195340,146\n195340,92476\n195341,344\n195342,1434\n195342,1844\n195343,7155\n195344,3623\n195345,179170\n195346,818\n195347,30\n195348,10\n195349,179170\n195350,1715\n195351,2646\n195352,313\n195353,179170\n195354,602\n195355,620\n195356,83\n195357,1085\n195358,1860\n195359,1858\n195360,406\n195361,278\n195362,195363\n195364,138686\n195365,175\n195366,622\n195367,269\n195368,267\n195369,30\n195370,30\n195371,1\n195372,1359\n195373,932\n195374,4748\n195375,1515\n195376,779\n195377,195378\n195379,602\n195380,861\n195381,1052\n195382,195383\n195384,433\n195385,3695\n195386,900\n195387,3507\n195388,3041\n195389,424\n195390,333\n195391,179170\n195392,179170\n195393,862\n195393,2590\n195394,264\n195395,1381\n195396,1181\n195397,1007\n195399,1467\n195400,455\n195401,2424\n195402,179170\n195403,1871\n195404,83\n195405,2421\n195406,13980\n195407,119\n195408,195409\n195410,1058\n195411,179170\n195412,704\n195414,195415\n195414,206551\n195416,1634\n195417,8714\n195418,355\n195419,1070\n195420,299\n195421,72\n195422,1608\n195423,1132\n195424,3695\n195425,718\n195426,1858\n195427,1860\n195428,781\n195429,1132\n195430,171\n195431,3695\n195432,195433\n195434,179170\n195435,1247\n195435,164572\n195436,1238\n195437,3331\n195439,1452\n195440,1707\n195441,195442\n195443,58\n195444,994\n195445,46\n195446,1247\n195446,164572\n195447,452\n195448,184\n195449,1860\n195450,1858\n195451,2274\n195452,147\n195453,1082\n195454,50\n195454,2931\n195455,868\n195456,195457\n195458,640\n195459,640\n195460,338\n195461,10\n195462,422\n195463,56\n195464,58\n195465,994\n195466,46\n195467,764\n195469,147\n195470,195471\n195472,1631\n195473,3695\n195474,72\n195475,647\n195476,344\n195477,146\n195477,92476\n195478,1749\n195479,360\n195480,1247\n195480,164572\n195481,1247\n195481,164572\n195483,422\n195484,422\n195486,137\n195487,151\n195489,217\n195490,422\n195491,113156\n195492,422\n195493,422\n195494,422\n195495,422\n195496,422\n195497,195498\n195499,422\n195500,179170\n195501,134\n195502,195503\n195504,23783\n195505,609\n195508,1782\n195509,344\n195510,83\n195511,146\n195511,620\n195511,92476\n195514,907\n195515,60576\n195516,178\n195517,818\n195518,302\n195519,138686\n195520,175\n195521,1033\n195522,406\n195523,968\n195525,60576\n195526,60576\n195527,893\n195528,217\n195528,278\n195528,389\n195529,3182\n195530,1556\n195531,195\n195532,1707\n195534,60576\n195536,1274\n195537,518\n195538,60576\n195539,6824\n195540,4\n195540,5\n195540,107\n195540,483\n195540,891\n195540,932\n195540,1116\n195540,1212\n195540,1359\n195540,2089\n195540,2105\n195540,2224\n195540,2315\n195540,2572\n195540,2940\n195540,3623\n195540,4220\n195540,5405\n195540,66297\n195540,75912\n195540,76096\n195540,124668\n195540,185877\n195541,283\n195542,718\n195543,21442\n195544,48\n195546,818\n195548,60576\n195549,30331\n195550,189128\n195551,818\n195552,994\n195553,5301\n195555,2083\n195556,141912\n195557,795\n195558,515\n195559,973\n195560,907\n195561,179170\n195562,3695\n195563,275\n195565,620\n195566,30\n195567,6119\n195568,588\n195568,590\n195568,693\n195568,3872\n195568,19227\n195569,994\n195570,72\n195571,749\n195573,179170\n195574,406\n195575,124668\n195576,56\n195577,217\n195578,1718\n195579,60576\n195580,6059\n195581,392\n195581,644\n195581,1240\n195583,1718\n195584,2367\n195585,2191\n195586,1298\n195587,809\n195588,30\n195589,811\n195590,145240\n195591,58\n195592,994\n195593,46\n195594,366\n195595,30\n195596,145240\n195597,1436\n195598,145240\n195599,83\n195600,3653\n195601,189788\n195602,1608\n195603,1132\n195604,663\n195605,1072\n195606,1132\n195607,1608\n195608,1608\n195609,1132\n195610,1983\n195611,54\n195611,415\n195611,891\n195611,1300\n195612,1608\n195613,1132\n195614,336\n195615,145240\n195616,1132\n195617,1608\n195619,48\n195620,1132\n195621,1608\n195622,6323\n195623,1010\n195624,1707\n195625,1608\n195626,1132\n195627,1515\n195628,779\n195630,1132\n195631,1608\n195632,1608\n195633,1132\n195634,58\n195635,994\n195636,46\n195637,994\n195638,58\n195639,46\n195641,346\n195642,179170\n195643,1007\n195644,179170\n195645,907\n195645,2191\n195646,13661\n195647,718\n195649,877\n195650,467\n195650,1149\n195651,30\n195652,1105\n195653,660\n195653,1539\n195654,3695\n195655,309\n195655,310\n195656,1732\n195657,1616\n195658,493\n195659,83\n195660,356\n195661,918\n195662,107\n195663,1858\n195665,5265\n195666,1564\n195667,283\n195667,356\n195667,941\n195667,1479\n195667,2266\n195667,5591\n195668,1882\n195669,2373\n195670,615\n195671,314\n195671,599\n195672,5101\n195673,217\n195674,818\n195675,118\n195675,4597\n195676,1983\n195677,63\n195678,818\n195679,408\n195679,1130\n195681,1882\n195682,843\n195684,138686\n195685,175\n195686,179170\n195687,929\n195688,1608\n195689,1740\n195690,162599\n195691,3260\n195692,862\n195693,1132\n195694,818\n195695,809\n195696,333\n195698,1033\n195699,622\n195700,1252\n195700,1253\n195701,179170\n195702,298\n195703,485\n195704,3695\n195705,631\n195706,467\n195706,868\n195706,156379\n195706,162599\n195707,3623\n195708,77\n195708,146\n195708,1105\n195708,92476\n195709,179170\n195710,4611\n195711,178\n195712,4\n195712,5\n195713,1\n195713,58\n195713,262271\n195714,72\n195715,435\n195716,2646\n195717,872\n195718,48\n195719,60576\n195720,5591\n195721,72\n195722,5192\n195723,843\n195724,379\n195724,2784\n195725,907\n195726,1740\n195728,1551\n195728,5440\n195729,346\n195729,467\n195729,1085\n195730,920\n195731,1619\n195732,1265\n195732,1266\n195733,1722\n195734,622\n195735,222\n195735,213089\n195736,151\n195737,1623\n195738,356\n195738,4771\n195739,818\n195740,3623\n195741,406\n195742,1983\n195743,179170\n195744,195745\n195746,3582\n195748,557\n195749,346\n195750,1220\n195750,1222\n195751,809\n195752,467\n195752,156379\n195753,1608\n195754,1132\n195756,392\n195757,3623\n195759,1608\n195760,1132\n195761,302\n195764,72\n195765,1608\n195766,1132\n195767,1058\n195768,302\n195769,217\n195769,1466\n195770,515\n195771,1707\n195772,422\n195773,893\n195774,30\n195775,417\n195776,247\n195776,2867\n195776,2868\n195777,30\n195778,273\n195779,360\n195780,302\n195781,146\n195781,92476\n195782,647\n195783,344\n195784,72\n195785,1452\n195786,30\n195787,3623\n195788,179170\n195789,563\n195790,1220\n195790,1222\n195791,516\n195792,252\n195793,179170\n195794,179170\n195795,861\n195796,1556\n195797,113156\n195798,467\n195799,285\n195800,151\n195801,636\n195802,68069\n195802,141912\n195803,918\n195804,72\n195805,195806\n195807,72\n195808,179170\n195809,4771\n195810,179170\n195811,179170\n195812,893\n195813,72\n195814,557\n195815,920\n195816,179170\n195817,83\n195818,72\n195819,2784\n195820,179170\n195821,72\n195822,703\n195823,179170\n195824,493\n195825,179170\n195826,179170\n195827,272\n195828,891\n195829,179170\n195830,55849\n195831,72\n195832,179170\n195833,55849\n195836,104\n195837,72\n195838,671\n195839,875\n195840,5906\n195841,557\n195842,626\n195843,278\n195844,137\n195845,862\n195846,1474\n195847,1203\n195848,55849\n195849,44\n195850,1085\n195851,179170\n195852,1140\n195853,885\n195853,13704\n195854,1381\n195855,72\n195856,344\n195857,285\n195858,179170\n195859,30\n195860,72\n195861,344\n195862,285\n195863,344\n195864,72\n195865,285\n195866,72\n195867,344\n195868,285\n195869,46\n195870,1983\n195871,247\n195872,72\n195873,344\n195874,285\n195875,1127\n195876,920\n195877,673\n195878,72\n195879,344\n195880,285\n195881,179170\n195882,102\n195883,72\n195884,344\n195885,285\n195886,483\n195887,30\n195888,179170\n195889,179170\n195890,79\n195891,145240\n195892,30\n195893,30\n195894,1608\n195895,1132\n195896,190492\n195897,179170\n195898,88820\n195899,406\n195900,605\n195900,968\n195900,1085\n195900,1210\n195900,2045\n195900,2944\n195900,3182\n195900,3507\n195901,3623\n195902,58\n195903,179170\n195904,179170\n195905,10\n195906,302\n195907,424\n195908,72\n195908,83\n195908,278\n195908,536\n195908,631\n195908,852\n195908,1274\n195908,1881\n195908,2244\n195908,2779\n195908,4903\n195908,9015\n195909,1858\n195910,1623\n195911,4611\n195912,602\n195913,668\n195914,30\n195915,30\n195916,315\n195916,671\n195917,1058\n195918,63\n195919,179170\n195920,4611\n195921,581\n195922,30\n195923,147\n195924,1326\n195925,1323\n195926,102\n195927,408\n195928,2116\n195929,171\n195930,30\n195931,2421\n195932,240\n195933,577\n195934,179170\n195935,179170\n195936,179170\n195937,179170\n195938,30\n195939,34\n195939,35\n195939,72\n195939,83\n195939,158\n195939,217\n195939,278\n195939,536\n195939,631\n195939,660\n195939,852\n195939,949\n195939,1133\n195939,1274\n195939,1466\n195939,1467\n195939,1881\n195939,2244\n195939,2779\n195939,4637\n195939,4903\n195939,7092\n195939,9015\n195940,179170\n195941,2244\n195942,900\n195943,179170\n195944,167\n195945,179170\n195946,179170\n195947,179170\n195948,217\n195948,1417\n195949,202\n195950,1068\n195951,195952\n195953,195952\n195954,302\n195955,255\n195956,919\n195957,67343\n195959,195960\n195961,393\n195962,2590\n195963,195964\n195965,1634\n195965,6424\n195966,1474\n195966,1789\n195967,195968\n195969,30331\n195970,285\n195971,442\n195972,3328\n195973,195974\n195976,602\n195977,56\n195978,422\n195979,179170\n195981,179170\n195982,355\n195983,63\n195984,167\n195984,73570\n195985,366\n195986,366\n195987,366\n195988,366\n195989,1132\n195990,1608\n195991,366\n195992,360\n195993,366\n195994,366\n195995,366\n195996,195997\n195998,3582\n195999,30\n196000,137\n196001,179170\n196002,196003\n196004,30\n196005,58\n196006,994\n196007,46\n196008,2105\n196009,577\n196010,196011\n196012,577\n196013,1238\n196014,1619\n196015,196016\n196017,1179\n196018,893\n196019,422\n196020,56\n196021,1452\n196022,1359\n196023,207\n196024,1359\n196025,196026\n196027,1619\n196027,1623\n196028,179170\n196029,1837\n196030,118\n196030,422\n196030,4597\n196031,440\n196032,1782\n196033,467\n196033,571\n196034,124668\n196035,136\n196036,996\n196037,795\n196038,124668\n196040,422\n196041,422\n196042,422\n196043,422\n196044,422\n196045,422\n196046,1707\n196047,422\n196048,422\n196049,83\n196050,1673\n196052,4545\n196052,56150\n196053,422\n196054,422\n196055,1052\n196055,1968\n196056,920\n196057,932\n196058,179170\n196059,3623\n196060,137\n196061,179170\n196062,3260\n196063,79\n196064,138686\n196065,179170\n196066,175\n196067,2105\n196069,312\n196070,1612\n196071,516\n196072,788\n196072,818\n196073,994\n196074,994\n196075,433\n196076,1359\n196077,25222\n196078,2617\n196079,872\n196080,298\n196081,485\n196082,516\n196083,1429\n196084,217\n196084,536\n196084,1417\n196085,640\n196086,1608\n196087,1132\n196088,640\n196089,3623\n196090,390\n196091,515\n196092,113156\n196093,179170\n196094,1012\n196095,2146\n196096,1566\n196097,2209\n196097,4411\n196097,21711\n196098,58\n196099,269\n196100,360\n196100,4571\n196101,124668\n196102,644\n196103,360\n196104,162599\n196105,124668\n196106,1001\n196108,346\n196109,1882\n196110,668\n196111,843\n196112,179170\n196113,1143\n196114,5358\n196114,14352\n196115,332\n196116,1844\n196117,2017\n196118,179170\n196119,217\n196120,360\n196121,162599\n196122,2073\n196123,628\n196124,2506\n196125,346\n196126,30\n196127,346\n196129,862\n196130,1117\n196131,424\n196132,10\n196133,206\n196133,211\n196134,467\n196135,920\n196136,467\n196138,142426\n196139,179170\n196140,563\n196141,196142\n196143,994\n196144,247\n196145,142870\n196147,3830\n196147,174849\n196148,2567\n196149,422\n196150,1149\n196151,179170\n196153,217\n196154,1132\n196155,1608\n196156,146\n196156,92476\n196157,647\n196158,344\n196159,83\n196160,918\n196161,7360\n196162,179170\n196163,1631\n196164,83\n196165,422\n196166,868\n196167,162599\n196168,298\n196169,179170\n196170,3804\n196171,660\n196171,1539\n196172,302\n196173,1177\n196174,179170\n196175,1608\n196176,1132\n196177,1849\n196178,287\n196179,178\n196180,852\n196181,272\n196182,272\n196184,577\n196185,4545\n196186,1001\n196187,515\n196188,138686\n196189,1132\n196190,1608\n196191,175\n196192,179170\n196193,1298\n196194,7\n196195,390\n196196,179170\n196197,124668\n196198,104\n196199,5405\n196200,179170\n196201,179170\n196202,1016\n196203,215\n196204,383\n196205,1010\n196206,850\n196207,1745\n196208,1231\n196209,136\n196210,248\n196211,388\n196212,1001\n196213,312\n196214,3612\n196215,358\n196216,1579\n196217,1722\n196218,9001\n196219,72\n196220,5662\n196221,968\n196222,9029\n196223,7270\n196224,1572\n196225,111\n196226,1052\n196227,1332\n196228,1882\n196229,503\n196230,2979\n196231,3538\n196232,1939\n196233,227\n196234,3422\n196235,4771\n196236,225\n196237,179170\n196238,1452\n196239,775\n196240,3695\n196241,179170\n196242,1927\n196243,3724\n196244,3804\n196245,302\n196246,1001\n196247,328\n196247,7124\n196248,3538\n196249,1140\n196250,217\n196251,3422\n196252,111\n196253,1274\n196254,1052\n196255,4594\n196256,3193\n196257,4771\n196258,3135\n196259,1151\n196260,589\n196261,1452\n196262,302\n196263,3695\n196264,346\n196265,1010\n196266,5440\n196267,932\n196268,2443\n196269,4637\n196270,6955\n196271,1955\n196272,37\n196273,4545\n196274,422\n196275,1465\n196276,1231\n196277,1849\n196278,2266\n196279,801\n196280,1722\n196281,1201\n196282,120\n196283,1927\n196284,358\n196285,72\n196286,1564\n196287,2421\n196288,83\n196289,1210\n196290,1072\n196291,332\n196292,1133\n196293,1102\n196294,5662\n196295,718\n196296,968\n196297,714\n196298,3999\n196299,1572\n196300,3474\n196301,240\n196302,388\n196303,873\n196304,687\n196305,1531\n196306,2701\n196307,1644\n196308,1789\n196309,328\n196310,1001\n196311,1177\n196312,35\n196313,2045\n196314,1821\n196314,21736\n196315,1429\n196316,312\n196317,919\n196318,3612\n196319,2646\n196320,227\n196321,1579\n196322,141912\n196323,278\n196324,179170\n196325,417\n196326,312\n196326,3260\n196327,83\n196328,602\n196329,602\n196330,1010\n196331,171641\n196332,278\n196333,372\n196334,179170\n196335,252\n196336,179170\n196337,843\n196338,158\n196338,21442\n196338,242826\n196339,392\n196339,1240\n196340,2944\n196340,6506\n196341,179170\n196342,861\n196343,202\n196344,141912\n196345,609\n196346,1001\n196346,3094\n196347,602\n196348,920\n196349,1284\n196350,142426\n196351,104\n196352,83\n196353,19010\n196354,83\n196356,422\n196356,762\n196356,1807\n196356,5961\n196357,868\n196358,151\n196359,145240\n196360,261\n196360,333\n196363,1881\n196364,83\n196365,179170\n196366,272\n196369,1007\n196370,83\n196371,309\n196371,310\n196371,439\n196371,874\n196371,1644\n196371,3804\n196373,302\n196374,4146\n196375,843\n196376,483\n196377,1370\n196378,861\n196379,10\n196379,167\n196379,217\n196379,222\n196379,283\n196379,289\n196379,290\n196379,346\n196379,435\n196379,455\n196379,586\n196379,631\n196379,657\n196379,1019\n196379,1210\n196379,1282\n196379,1294\n196379,1467\n196379,1531\n196379,1871\n196379,2266\n196379,2421\n196379,2979\n196379,5976\n196379,6119\n196379,6424\n196379,6789\n196379,94134\n196380,861\n196381,859\n196382,147\n196382,158\n196383,435\n196384,588\n196384,590\n196385,795\n196386,1132\n196387,1608\n196388,1556\n196389,3695\n196390,227\n196390,433\n196390,1635\n196390,2421\n196390,2750\n196390,8855\n196391,255\n196392,2735\n196393,141912\n196394,179170\n196395,805\n196396,843\n196397,818\n196398,56\n196399,422\n196400,3623\n196401,179170\n196402,422\n196403,56\n196404,602\n196405,1235\n196405,1335\n196406,30\n196407,56\n196408,422\n196409,147\n196410,6424\n196411,1612\n196412,3623\n196413,516\n196414,3623\n196415,179170\n196416,7416\n196417,355\n196418,355\n196418,743\n196419,56\n196420,1132\n196421,1608\n196422,557\n196423,827\n196424,3538\n196425,3182\n196426,934\n196427,1085\n196428,2436\n196429,54\n196430,2775\n196431,1052\n196432,1882\n196433,1962\n196434,1133\n196435,30\n196436,2646\n196437,278\n196438,1274\n196439,30\n196440,1210\n196441,278\n196442,634\n196443,30\n196444,278\n196445,435\n196446,444\n196447,861\n196448,557\n196449,862\n196450,346\n196451,1837\n196452,349\n196452,392\n196452,595\n196452,615\n196452,697\n196452,808\n196452,1240\n196452,1453\n196452,1454\n196452,1782\n196452,2699\n196452,3193\n196452,3367\n196452,9098\n196452,24763\n196453,30\n196454,56\n196455,422\n196456,4594\n196457,2797\n196458,104\n196459,843\n196460,196461\n196462,8854\n196463,406\n196464,1474\n196465,138686\n196466,175\n196467,330\n196468,673\n196469,30\n196470,1381\n196471,113156\n196472,30\n196473,285\n196474,302\n196475,250\n196475,1684\n196476,196477\n196478,1353\n196479,5130\n196480,30\n196481,30\n196482,30331\n196483,240\n196484,1235\n196484,1335\n196485,196486\n196488,3623\n196489,30\n196490,179170\n196491,196492\n196493,861\n196494,702\n196495,107\n196496,30\n196497,30\n196498,563\n196499,330\n196500,697\n196501,2553\n196502,195\n196502,147191\n196503,1474\n196504,83\n196504,217\n196504,388\n196505,179170\n196506,30\n196507,2411\n196508,179170\n196509,179170\n196510,55849\n196511,55849\n196512,818\n196513,179170\n196514,1284\n196515,406\n196516,30\n196517,179170\n196518,1046\n196519,2867\n196519,2868\n196521,1509\n196522,102\n196523,1326\n196524,1323\n196525,408\n196526,2116\n196527,252\n196528,516\n196529,1220\n196529,1222\n196530,179170\n196531,289\n196531,290\n196531,94134\n196532,872\n196533,340\n196534,179170\n196535,196536\n196537,1149\n196538,3623\n196539,2048\n196540,179170\n196541,179170\n196542,179170\n196543,366\n196544,366\n196545,366\n196546,366\n196547,366\n196548,366\n196549,366\n196550,366\n196551,179170\n196552,138686\n196553,179170\n196554,852\n196555,872\n196556,337\n196556,338\n196556,393\n196556,439\n196556,626\n196556,649\n196556,772\n196556,1381\n196556,2367\n196558,493\n196560,557\n196561,30\n196562,179170\n196563,8854\n196564,30\n196565,179170\n196566,602\n196567,1414\n196568,2646\n196569,222\n196570,298\n196571,850\n196572,196573\n196574,196575\n196576,217\n196576,222\n196576,455\n196576,1019\n196576,5343\n196577,196578\n196579,1\n196580,179170\n196581,2923\n196582,179170\n196583,1\n196584,1001\n196585,366\n196586,30331\n196587,450\n196588,323\n196590,255\n196591,577\n196592,196593\n196594,179170\n196595,841\n196596,333\n196597,179170\n196598,1608\n196599,1132\n196600,1381\n196601,2590\n196602,307\n196602,406\n196602,1515\n196603,355\n196604,196605\n196606,196607\n196608,83\n196608,536\n196608,7698\n196609,179170\n196610,5440\n196611,620\n196612,1715\n196612,7363\n196613,138686\n196614,175\n196615,202\n196616,149\n196616,1776\n196617,196618\n196619,1238\n196620,196621\n196622,602\n196623,1359\n196624,178\n196625,113156\n196626,285\n196627,788\n196627,1531\n196627,4611\n196628,196629\n196630,196629\n196631,1359\n196632,1608\n196633,1132\n196634,1452\n196635,68\n196636,447\n196637,2775\n196638,302\n196639,536\n196640,79\n196641,1247\n196641,164572\n196642,1359\n196643,179170\n196644,1132\n196645,1608\n196646,340\n196646,1179\n196647,1608\n196648,1132\n196649,433\n196650,808\n196650,872\n196650,1010\n196651,1860\n196652,1858\n196653,907\n196654,640\n196655,640\n196656,640\n196657,124668\n196658,783\n196659,3623\n196660,179170\n196661,872\n196662,467\n196663,3623\n196664,3623\n196665,30\n196666,196667\n196668,2646\n196669,2735\n196670,118\n196670,4597\n196671,137\n196672,392\n196672,467\n196673,1893\n196674,3623\n196675,422\n196676,261\n196677,422\n196678,422\n196679,422\n196680,422\n196681,422\n196682,422\n196683,87\n196684,137\n196685,422\n196686,422\n196687,422\n196688,422\n196689,422\n196690,668\n196691,493\n196692,518\n196693,518\n196693,1326\n196694,79\n196695,852\n196696,273\n196697,310\n196697,3039\n196698,602\n196699,3252\n196700,2867\n196700,2868\n196701,207\n196702,932\n196703,55849\n196704,360\n196705,196706\n196707,338\n196707,2617\n196708,287\n196708,433\n196709,55849\n196710,1007\n196711,275\n196711,1266\n196712,493\n196712,682\n196712,72439\n196713,338\n196713,462\n196714,1608\n196715,1132\n196716,450\n196717,467\n196718,920\n196719,48\n196720,6303\n196721,707\n196722,55849\n196723,278\n196724,179170\n196725,83\n196726,957\n196727,3582\n196728,433\n196729,298\n196730,485\n196731,302\n196731,344\n196732,779\n196733,1882\n196734,718\n196735,192\n196736,527\n196737,918\n196738,312\n196739,1801\n196740,631\n196741,592\n196742,2812\n196743,298\n196744,485\n196745,304\n196745,356\n196746,3218\n196747,138686\n196748,175\n196749,200\n196750,809\n196751,1707\n196752,5405\n196753,35\n196754,1556\n196755,875\n196756,1294\n196757,31073\n196758,19010\n196759,48\n196760,349\n196761,35\n196762,278\n196763,83\n196764,217\n196765,991\n196766,1085\n196767,1052\n196768,1274\n196769,217\n196770,4637\n196771,372\n196771,1082\n196772,485\n196773,298\n196774,1072\n196775,35\n196776,2421\n196777,1201\n196778,1429\n196779,431\n196781,1453\n196782,493\n196783,1608\n196784,1132\n196785,1052\n196785,1177\n196786,485\n196787,298\n196788,1132\n196789,1608\n196790,1608\n196791,1132\n196792,2671\n196793,1608\n196794,1132\n196795,493\n196796,372\n196797,596\n196798,149\n196798,406\n196799,56\n196800,422\n196801,309\n196801,310\n196801,3039\n196801,232766\n196802,994\n196803,22\n196804,179170\n196805,179170\n196806,217\n196807,875\n196808,872\n196809,1127\n196811,704\n196812,515\n196813,783\n196814,647\n196815,1429\n196816,196817\n196818,127158\n196819,200\n196820,179170\n196821,5310\n196823,994\n196824,647\n196825,358\n196826,994\n196827,55849\n196828,1132\n196829,781\n196830,196831\n196832,1143\n196833,3999\n196833,141912\n196834,994\n196835,760\n196836,1849\n196836,36819\n196837,195383\n196838,73570\n196839,393\n196840,571\n196840,872\n196841,179170\n196842,138686\n196843,175\n196844,2553\n196845,179170\n196846,1608\n196847,1132\n196848,356\n196848,392\n196848,1146\n196848,21982\n196849,179170\n196850,113156\n196851,1132\n196852,1608\n196853,406\n196854,196855\n196856,1454\n196857,3474\n196858,1220\n196858,1222\n196859,1544\n196860,104\n196861,873\n196862,14126\n196863,202\n196864,1179\n196865,714\n196866,406\n196867,509\n196868,752\n196869,1564\n196870,2557\n196871,358\n196872,435\n196873,3695\n196874,328\n196875,980\n196876,1298\n196877,862\n196878,1231\n196879,2701\n196880,1133\n196881,1515\n196882,1893\n196883,390\n196884,455\n196885,3538\n196886,1837\n196887,251\n196888,215\n196889,1749\n196890,1381\n196891,120\n196892,3422\n196893,149\n196894,35\n196895,586\n196896,1715\n196897,1849\n196898,3507\n196899,1522\n196900,4637\n196901,302\n196902,1332\n196903,6638\n196904,3207\n196905,2045\n196906,493\n196907,525\n196908,72\n196909,3182\n196910,6955\n196911,140\n196912,280\n196912,17245\n196913,704\n196914,3999\n196915,1821\n196915,21736\n196916,3218\n196917,1466\n196918,1392\n196919,2989\n196920,3804\n196921,63\n196922,1240\n196923,296\n196924,3138\n196925,3612\n196926,81\n196927,1509\n196928,439\n196929,5662\n196930,422\n196931,1085\n196932,332\n196933,8180\n196934,1479\n196935,1436\n196936,1007\n196937,682\n196937,72439\n196938,388\n196939,1001\n196940,631\n196941,1143\n196942,1012\n196943,577\n196944,5718\n196945,1181\n196946,518\n196947,2699\n196948,1939\n196949,1274\n196950,1175\n196951,158\n196952,6068\n196953,1167\n196954,907\n196955,919\n196956,1722\n196957,2205\n196957,33424\n196958,392\n196959,1326\n196960,111\n196961,14819\n196962,1644\n196963,1072\n196964,192\n196965,1149\n196966,717\n196967,32\n196968,301\n196969,1241\n196970,3094\n196971,736\n196972,196973\n196974,687\n196975,5874\n196976,595\n196977,346\n196978,349\n196979,1210\n196980,225\n196981,1985\n196982,333\n196983,14797\n196984,248\n196985,779\n196986,379\n196987,795\n196988,3194\n196989,2620\n196990,252\n196991,874\n196992,592\n196993,5440\n196994,1359\n196995,217\n196996,1877\n196997,934\n196998,2443\n196999,1282\n197000,3135\n197001,1368\n197002,283\n197003,393\n197004,968\n197005,2979\n197006,1010\n197007,622\n197008,1140\n197009,3041\n197010,326\n197011,1467\n197012,1590\n197013,285\n197014,1732\n197015,383\n197016,1052\n197017,557\n197018,2436\n197019,1955\n197020,1801\n197021,9001\n197022,1309\n197023,178\n197024,240\n197025,2083\n197026,372\n197027,337\n197028,5405\n197029,720\n197030,77\n197031,1177\n197032,444\n197032,459\n197033,1181\n197034,809\n197035,1181\n197036,397\n197037,200\n197038,142433\n197039,671\n197040,179170\n197041,1882\n197042,167\n197043,1718\n197044,1181\n197045,289\n197045,290\n197045,94134\n197046,10\n197046,217\n197046,222\n197046,455\n197046,588\n197046,590\n197046,752\n197046,968\n197046,1419\n197046,1773\n197046,5343\n197047,2266\n197048,147\n197049,151\n197050,795\n197051,1181\n197052,2266\n197053,489\n197054,30\n197055,515\n197056,222\n197057,1805\n197058,1210\n197059,107\n197060,2620\n197061,602\n197062,35\n197063,1571\n197064,1893\n197065,1769\n197066,55849\n197067,55849\n197068,179170\n197069,1274\n197070,1089\n197071,142870\n197072,30\n197073,184\n197074,30\n197075,1844\n197075,2073\n197077,79\n197078,149\n197079,2089\n197079,2940\n197080,841\n197081,38634\n197082,175\n197083,309\n197083,310\n197083,197084\n197085,991\n197086,1287\n197087,356\n197088,1\n197089,179170\n197090,179170\n197091,179170\n197092,1511\n197092,3069\n197093,1188\n197094,294\n197095,179170\n197096,1305\n197097,285\n197098,347\n197099,179170\n197100,81\n197101,3623\n197102,5265\n197103,1515\n197104,179170\n197105,298\n197106,304\n197107,435\n197108,179170\n197109,197110\n197111,315\n197111,457\n197111,221339\n197112,179170\n197113,179170\n197114,250\n197114,1684\n197115,285\n197116,346\n197117,843\n197118,285\n197119,179170\n197120,250\n197120,1684\n197121,346\n197122,809\n197123,557\n197124,298\n197125,358\n197126,1274\n197127,83\n197128,972\n197129,1474\n197130,145751\n197131,146\n197131,92476\n197132,273\n197133,459\n197134,332\n197135,673\n197136,30\n197137,5405\n197138,1252\n197138,1253\n197139,179170\n197140,843\n197141,179170\n197142,179170\n197143,644\n197144,2083\n197145,779\n197146,30\n197147,30\n197148,310\n197148,3039\n197149,4060\n197150,138\n197151,865\n197152,557\n197153,137\n197154,118\n197154,4597\n197155,88820\n197156,557\n197157,3695\n197158,217\n197159,44\n197160,56\n197161,422\n197162,30\n197163,197164\n197165,440\n197166,346\n197167,602\n197168,346\n197169,1252\n197169,1253\n197170,30\n197171,264\n197171,1551\n197172,602\n197173,875\n197174,3623\n197175,2116\n197176,56\n197177,422\n197178,1252\n197178,1253\n197179,272\n197180,1019\n197181,217\n197182,536\n197183,1467\n197184,278\n197185,83\n197186,179170\n197187,30\n197188,346\n197189,179170\n197190,5911\n197191,2244\n197192,179170\n197193,148586\n197194,179170\n197196,996\n197197,577\n197198,151\n197198,663\n197199,83\n197200,1769\n197201,510\n197202,781\n197203,1132\n197204,346\n197205,333\n197206,179170\n197207,227\n197208,138686\n197209,175\n197210,197211\n197213,843\n197214,13919\n197215,2590\n197216,483\n197217,422\n197218,1001\n197219,179170\n197220,179170\n197221,197222\n197223,207\n197224,1509\n197225,179170\n197226,179170\n197227,225\n197228,602\n197229,179170\n197230,7416\n197231,872\n197232,1429\n197233,72\n197234,179170\n197235,179170\n197236,124668\n197237,668\n197238,8884\n197239,179170\n197240,1085\n197241,179170\n197242,179170\n197243,1634\n197244,406\n197244,704\n197245,197246\n197247,197248\n197249,72\n197250,1949\n197251,30\n197252,179170\n197253,179170\n197254,197255\n197256,72\n197257,179170\n197258,179170\n197259,197260\n197261,1143\n197262,1001\n197263,355\n197264,197265\n197266,366\n197267,366\n197268,366\n197269,366\n197270,366\n197271,366\n197272,34\n197272,35\n197273,5440\n197274,179170\n197275,30\n197276,994\n197277,1882\n197278,30\n197279,255\n197280,841\n197281,406\n197282,86\n197283,932\n197284,431\n197285,433\n197286,217\n197287,1707\n197288,6249\n197289,55849\n197290,197291\n197292,994\n197293,55849\n197294,55849\n197295,30\n197296,197297\n197298,83\n197299,1181\n197300,179170\n197301,852\n197301,1070\n197301,1400\n197301,3467\n197302,72\n197303,1608\n197304,1132\n197305,197306\n197307,1181\n197308,602\n197309,602\n197310,197311\n197312,333\n197313,30\n197314,346\n197315,30\n197316,2617\n197317,30\n197318,485\n197319,298\n197320,485\n197321,298\n197322,30\n197323,30\n197325,30\n197326,30\n197327,72\n197328,433\n197329,676\n197330,406\n197331,346\n197332,184\n197333,483\n197334,1181\n197335,255\n197336,459\n197337,30\n197338,503\n197339,1181\n197340,30\n197341,2750\n197342,1181\n197343,54\n197344,349\n197345,179170\n197346,179170\n197347,1707\n197348,179170\n197349,79\n197350,144962\n197351,72\n197352,83\n197353,179170\n197354,197355\n197356,138686\n197357,175\n197358,1132\n197359,781\n197360,197361\n197362,179170\n197363,72\n197364,2266\n197364,7092\n197365,781\n197366,1132\n197367,781\n197368,1132\n197369,285\n197370,626\n197371,135\n197372,2373\n197373,1479\n197374,390\n197375,805\n197376,58\n197377,485\n197378,298\n197379,179170\n197380,30\n197381,197382\n197383,197382\n197384,197382\n197385,197382\n197386,72\n197387,994\n197388,145751\n197389,197390\n197391,10\n197392,179170\n197393,179170\n197394,44\n197395,3\n197396,197397\n197398,179170\n197399,8991\n197400,3582\n197401,179170\n197402,749\n197403,197404\n197405,72\n197406,54\n197406,949\n197407,310\n197408,805\n197410,366\n197411,366\n197412,366\n197413,179170\n197414,113156\n197415,197416\n197417,197418\n197419,147\n197419,1309\n197420,285\n197421,536\n197421,1019\n197422,1571\n197423,197424\n197425,197426\n197427,81\n197427,1962\n197428,197429\n197430,56\n197431,422\n197432,355\n197433,107\n197434,2416\n197434,2417\n197435,292\n197436,338\n197437,298\n197438,1133\n197439,3538\n197440,187\n197441,1181\n197442,31977\n197443,557\n197444,197445\n197444,198488\n197446,197447\n197448,30\n197449,30\n197450,2620\n197451,932\n197452,8270\n197453,647\n197454,146\n197454,92476\n197455,344\n197456,1181\n197457,1181\n197458,79\n197459,1181\n197460,195\n197461,269\n197462,1181\n197463,30\n197464,30\n197465,1509\n197466,197467\n197468,479\n197469,154408\n197470,485\n197471,298\n197472,440\n197472,1033\n197475,7117\n197476,44\n197478,1707\n197479,483\n197480,10\n197481,197482\n197484,1893\n197485,355\n197486,485\n197487,298\n197488,298\n197489,485\n197490,1284\n197491,1274\n197492,302\n197492,595\n197492,1722\n197492,3258\n197492,204093\n197493,197494\n197495,102560\n197496,72\n197497,138686\n197498,175\n197499,485\n197500,298\n197501,1188\n197502,197503\n197505,145751\n197506,145751\n197507,79\n197508,202\n197509,30\n197510,485\n197511,298\n197512,1707\n197512,2367\n197513,344\n197514,647\n197515,146\n197515,92476\n197516,557\n197517,99\n197518,843\n197519,7155\n197520,41\n197521,99\n197522,104\n197523,1132\n197524,781\n197525,2506\n197526,119\n197527,872\n197528,197529\n197530,994\n197531,145751\n197532,779\n197533,994\n197534,393\n197534,980\n197535,557\n197536,1014\n197537,1014\n197538,1014\n197539,1014\n197540,197541\n197542,1014\n197543,142473\n197544,197541\n197545,602\n197546,1014\n197547,602\n197548,197549\n197550,850\n197551,994\n197552,278\n197553,393\n197554,35\n197554,158\n197554,275\n197554,406\n197554,663\n197554,693\n197554,1247\n197554,1572\n197554,3297\n197554,9010\n197554,17588\n197554,20359\n197554,164572\n197555,704\n197556,273\n197556,1116\n197557,872\n197558,338\n197559,1849\n197560,30236\n197561,636\n197562,251\n197563,240\n197564,292\n197565,294\n197566,197567\n197568,296\n197569,298\n197570,8854\n197572,1227\n197572,86416\n197573,197574\n197575,68\n197576,137\n197577,355\n197578,893\n197579,861\n197580,336\n197581,1718\n197582,818\n197583,602\n197584,596\n197585,1539\n197586,1238\n197587,41\n197588,167\n197589,1860\n197590,1858\n197591,1452\n197592,72764\n197593,500\n197594,516\n197595,252\n197596,1220\n197596,1222\n197597,340\n197598,818\n197599,193129\n197600,992\n197601,1436\n197602,406\n197603,251\n197604,302\n197605,515\n197606,167\n197607,422\n197608,56\n197609,147\n197609,149\n197609,21442\n197610,1265\n197610,1266\n197611,557\n197612,83\n197613,994\n197614,1284\n197614,148742\n197615,992\n197616,1240\n197617,56\n197618,422\n197619,760\n197620,1359\n197621,79\n197622,87\n197622,1659\n197623,972\n197624,283\n197625,577\n197626,685\n197626,900\n197627,338\n197628,422\n197629,422\n197630,422\n197631,366\n197632,422\n197633,440\n197634,366\n197635,422\n197636,422\n197637,422\n197638,422\n197639,366\n197640,422\n197641,366\n197642,422\n197643,2784\n197644,269\n197645,1363\n197646,784\n197647,151\n197648,83\n197649,149\n197649,195\n197649,1181\n197649,8798\n197649,102560\n197650,920\n197651,179170\n197652,500\n197653,356\n197654,106\n197655,599\n197656,179170\n197657,356\n197658,467\n197659,2209\n197660,344\n197661,72\n197662,285\n197663,269\n197664,609\n197664,3474\n197665,13661\n197666,344\n197666,2646\n197667,640\n197668,640\n197669,640\n197670,640\n197671,200\n197671,1955\n197672,30\n197673,1608\n197674,1132\n197675,83\n197676,30\n197677,972\n197677,1718\n197677,2750\n197678,1151\n197678,1220\n197678,1222\n197679,7768\n197680,292\n197680,509\n197680,1368\n197680,1688\n197680,16614\n197680,37414\n197681,868\n197682,259\n197683,392\n197684,302\n197685,994\n197686,1284\n197687,818\n197688,222\n197689,687\n197689,1556\n197690,447\n197691,2775\n197692,2553\n197693,302\n197694,932\n197695,83\n197696,3467\n197697,3328\n197698,1070\n197699,179170\n197700,68\n197701,1224\n197702,1210\n197703,41\n197704,13\n197704,1179\n197705,8213\n197706,1052\n197707,932\n197708,485\n197709,145751\n197710,920\n197711,179170\n197712,192\n197713,1860\n197714,1858\n197715,994\n197716,192\n197717,1860\n197718,1858\n197719,72\n197720,192\n197721,493\n197722,7\n197723,41\n197724,2416\n197724,2417\n197725,994\n197726,137\n197727,301\n197728,366\n197729,718\n197730,1359\n197730,60576\n197731,192\n197732,422\n197733,1858\n197734,1860\n197735,473\n197735,2367\n197736,302\n197737,209\n197738,192\n197739,994\n197741,119\n197741,192\n197741,577\n197741,1400\n197742,158\n197743,197744\n197745,32751\n197746,209\n197747,151\n197748,217\n197749,403\n197750,994\n197751,197752\n197753,1634\n197754,852\n197756,1113\n197757,81\n197758,843\n197759,35\n197759,973\n197759,1133\n197760,818\n197761,567\n197762,372\n197762,588\n197762,590\n197763,1043\n197764,602\n197765,302\n197766,1001\n197766,19946\n197767,1285\n197768,1359\n197769,3297\n197770,2590\n197771,861\n197772,3258\n197773,292\n197774,392\n197774,1769\n197775,292\n197776,151\n197777,7\n197777,3538\n197777,3846\n197777,14989\n197778,602\n197779,200\n197780,160\n197781,1181\n197782,346\n197782,1612\n197783,673\n197783,1149\n197784,60576\n197785,285\n197786,2083\n197787,1631\n197788,360\n197789,55849\n197790,795\n197792,192\n197793,1858\n197794,1860\n197795,515\n197796,333\n197797,2416\n197797,2417\n197798,328\n197799,1580\n197799,1837\n197800,1082\n197802,225\n197803,473\n197804,1181\n197805,22\n197805,314\n197805,1210\n197806,179170\n197808,10\n197809,647\n197810,344\n197811,146\n197811,92476\n197812,596\n197813,175\n197814,179170\n197815,13980\n197816,179170\n197817,15\n197817,818\n197817,1837\n197817,4172\n197818,138686\n197819,10\n197819,97\n197819,1252\n197819,1253\n197820,175\n197821,999\n197821,2209\n197822,1858\n197823,197824\n197825,972\n197826,83\n197826,536\n197826,1837\n197827,1181\n197828,197829\n197830,22\n197831,179170\n197832,3846\n197833,1837\n197834,197835\n197836,1782\n197836,5961\n197837,1818\n197838,1117\n197839,516\n197840,1220\n197840,1222\n197841,252\n197842,197843\n197844,240\n197844,503\n197844,557\n197844,592\n197844,818\n197844,1370\n197844,1564\n197844,1608\n197844,1818\n197844,2205\n197844,2296\n197844,2334\n197844,9025\n197844,33424\n197845,179170\n197846,1\n197847,179170\n197848,1058\n197848,1688\n197849,151\n197850,73570\n197851,179170\n197852,6303\n197853,22\n197854,192\n197855,179170\n197856,283\n197857,179170\n197858,156379\n197858,162599\n197859,195\n197860,248\n197861,192\n197863,3\n197864,358\n197865,718\n197866,179170\n197867,179170\n197868,179170\n197869,704\n197869,1052\n197869,1140\n197869,5547\n197870,406\n197871,1419\n197872,1419\n197874,192\n197875,7155\n197876,6119\n197877,1181\n197878,179170\n197879,1370\n197880,1082\n197881,1821\n197881,21736\n197882,179170\n197883,1860\n197884,1858\n197885,1072\n197886,1801\n197887,179170\n197888,1243\n197889,1893\n197890,120\n197891,2750\n197892,760\n197892,1877\n197893,179170\n197894,179170\n197895,179170\n197896,1227\n197896,86416\n197897,718\n197898,2807\n197899,992\n197900,269\n197901,192\n197902,81\n197903,54\n197905,200\n197906,209\n197906,302\n197907,994\n197908,1821\n197908,21736\n197909,269\n197910,179170\n197911,179170\n197912,179170\n197913,557\n197914,79\n197915,875\n197916,1241\n197917,184\n197918,1556\n197919,1860\n197920,1858\n197921,179170\n197922,179170\n197923,179170\n197924,435\n197925,192\n197925,406\n197926,119\n197927,1474\n197928,673\n197929,392\n197930,1631\n197931,1659\n197932,843\n197933,8854\n197934,179170\n197935,673\n197936,483\n197937,2626\n197938,4\n197938,5\n197938,2506\n197939,138686\n197940,175\n197941,1181\n197942,2244\n197943,1284\n197944,592\n197945,200\n197946,2244\n197947,197948\n197949,30\n197950,516\n197951,302\n197952,333\n197953,1769\n197953,1893\n197954,217\n197955,142430\n197956,179170\n197957,861\n197958,5366\n197959,563\n197960,2116\n197961,151\n197962,1014\n197963,344\n197964,647\n197965,146\n197965,92476\n197966,1014\n197967,206\n197968,1837\n197969,206\n197970,1014\n197971,1014\n197972,1511\n197972,3069\n197973,1014\n197974,197975\n197976,2083\n197977,1014\n197978,422\n197979,7092\n197980,72\n197980,2416\n197980,2417\n197981,1014\n197982,30331\n197983,485\n197984,298\n197985,247\n197986,577\n197987,8270\n197988,8822\n197989,99\n197990,2620\n197991,115659\n197992,99\n197993,102\n197994,408\n197995,1326\n197996,1323\n197997,44\n197998,2775\n197999,447\n198000,697\n198000,1769\n198001,10\n198002,217\n198003,818\n198004,30331\n198005,30\n198006,167\n198007,198008\n198009,147\n198010,1749\n198011,602\n198012,179170\n198013,198014\n198015,636\n198016,179170\n198017,2590\n198018,2266\n198019,1\n198020,188791\n198021,1127\n198021,1769\n198022,1016\n198023,198024\n198025,326\n198026,1368\n198027,1\n198028,179170\n198029,83\n198030,1363\n198031,179170\n198032,195\n198033,217\n198034,285\n198035,207\n198036,455\n198036,1019\n198037,99\n198039,861\n198040,99\n198041,179170\n198042,788\n198043,255\n198044,861\n198045,198046\n198049,298\n198050,1807\n198051,358\n198052,872\n198053,1429\n198054,179170\n198055,192\n198057,184\n198057,202\n198057,704\n198058,779\n198059,717\n198060,198061\n198062,23783\n198063,113156\n198064,179170\n198065,179170\n198066,310\n198067,668\n198068,355\n198069,198070\n198071,79\n198072,179170\n198073,4810\n198074,8270\n198075,7360\n198076,4276\n198077,6068\n198077,164572\n198078,94\n198078,991\n198078,1253\n198079,2931\n198079,4193\n198080,992\n198081,179170\n198082,1815\n198083,79\n198084,515\n198085,994\n198086,58\n198087,46\n198088,198089\n198090,179170\n198091,1143\n198092,602\n198093,372\n198094,602\n198095,30\n198096,1\n198097,198098\n198099,893\n198100,30\n198101,1243\n198102,356\n198103,198104\n198105,919\n198106,818\n198107,5405\n198108,147\n198109,447\n198110,2775\n198111,1012\n198112,4260\n198113,640\n198114,640\n198115,366\n198116,640\n198117,640\n198118,640\n198119,640\n198120,13661\n198121,56\n198122,422\n198123,1370\n198124,60576\n198125,422\n198126,422\n198127,577\n198128,366\n198129,1001\n198130,302\n198130,2116\n198131,422\n198132,422\n198133,422\n198134,422\n198135,422\n198136,422\n198137,422\n198138,422\n198139,422\n198140,422\n198141,79\n198142,1188\n198143,72\n198144,344\n198145,285\n198146,1801\n198147,1179\n198148,192\n198148,406\n198149,717\n198150,287\n198151,193129\n198152,344\n198153,192\n198153,406\n198154,4355\n198154,193129\n198155,198156\n198157,71\n198158,388\n198159,1796\n198160,596\n198161,142426\n198162,254\n198163,4066\n198164,852\n198165,577\n198166,1653\n198168,192\n198169,631\n198170,356\n198170,852\n198171,1634\n198172,1453\n198173,3623\n198174,304\n198174,714\n198175,1381\n198176,379\n198176,477\n198176,536\n198176,891\n198176,2168\n198176,2646\n198176,2944\n198176,5326\n198177,602\n198178,932\n198179,83\n198180,3623\n198181,1274\n198182,3623\n198183,3623\n198184,818\n198185,818\n198186,393\n198187,994\n198188,302\n198189,162599\n198190,338\n198191,142430\n198192,1425\n198193,818\n198194,146\n198194,92476\n198195,818\n198196,493\n198197,138686\n198198,175\n198199,222\n198199,5343\n198200,640\n198201,994\n198202,749\n198203,571\n198204,60576\n198205,200\n198206,60576\n198207,3623\n198208,852\n198209,60576\n198210,292\n198211,60576\n198212,217\n198213,1707\n198214,779\n198215,994\n198216,3623\n198217,2105\n198218,302\n198219,3474\n198220,198221\n198222,422\n198223,264\n198224,631\n198225,2083\n198226,994\n198227,872\n198228,994\n198229,422\n198230,56\n198231,1740\n198232,259\n198233,994\n198234,818\n198235,424\n198235,124668\n198236,192\n198237,4571\n198238,1882\n198239,198240\n198241,809\n198242,360\n198243,818\n198244,720\n198244,877\n198244,973\n198244,1117\n198244,1837\n198244,2083\n198244,9024\n198245,179170\n198246,657\n198247,406\n198248,1388\n198249,920\n198250,859\n198251,72\n198252,843\n198253,120\n198255,142430\n198256,53763\n198257,209\n198258,406\n198259,1381\n198260,3094\n198261,435\n198262,626\n198263,1882\n198264,500\n198265,818\n198266,7\n198267,720\n198268,1619\n198269,590\n198269,1419\n198270,141912\n198271,843\n198272,55849\n198273,433\n198274,72\n198275,1566\n198276,483\n198277,1893\n198278,3297\n198279,142426\n198280,302\n198281,925\n198282,336\n198283,4237\n198283,182162\n198285,1332\n198285,5423\n198286,631\n198286,156379\n198287,55849\n198288,5301\n198289,861\n198290,198291\n198292,920\n198293,467\n198294,19010\n198295,275\n198296,1639\n198297,72\n198298,32\n198299,198300\n198301,298\n198302,75912\n198303,852\n198303,2572\n198303,178576\n198304,99\n198305,1220\n198305,1222\n198306,252\n198307,251\n198308,640\n198309,1181\n198310,450\n198311,918\n198312,1210\n198313,1381\n198314,99\n198315,893\n198316,841\n198317,5405\n198318,1181\n198319,99\n198320,2620\n198321,392\n198321,1284\n198322,1160\n198322,1274\n198322,1294\n198322,1298\n198322,1644\n198322,33298\n198322,189303\n198323,467\n198324,179170\n198325,893\n198326,138686\n198327,175\n198328,525\n198329,147\n198330,179170\n198331,269\n198332,158\n198332,406\n198332,575\n198333,1309\n198334,450\n198335,1285\n198336,392\n198337,179170\n198338,682\n198338,1353\n198338,72439\n198339,63\n198339,106\n198339,192\n198339,202\n198339,252\n198339,337\n198339,516\n198339,586\n198339,779\n198339,1220\n198339,1222\n198339,1243\n198339,1635\n198339,6119\n198339,16201\n198340,179170\n198341,30\n198341,63\n198341,81\n198341,140\n198341,147\n198341,149\n198341,158\n198341,192\n198341,200\n198341,202\n198341,215\n198341,302\n198341,312\n198341,406\n198341,422\n198341,503\n198341,588\n198341,590\n198341,620\n198341,622\n198341,779\n198341,1392\n198341,1453\n198341,1515\n198341,1522\n198341,1807\n198342,893\n198343,631\n198344,179170\n198345,760\n198346,3756\n198347,294\n198348,179170\n198349,141912\n198350,861\n198351,2367\n198352,264\n198352,647\n198353,859\n198354,79\n198354,6119\n198355,3555\n198356,893\n198357,312\n198358,918\n198359,179170\n198360,477\n198361,1181\n198362,251\n198362,1512\n198362,5992\n198363,4594\n198365,251\n198366,99\n198367,2620\n198368,179170\n198369,151\n198370,1181\n198371,563\n198372,146\n198372,92476\n198373,1181\n198374,1096\n198375,179170\n198376,292\n198377,467\n198378,991\n198379,392\n198380,301\n198381,503\n198382,392\n198383,652\n198384,179170\n198385,1801\n198385,3182\n198386,302\n198387,104\n198387,657\n198387,2266\n198388,1052\n198389,2775\n198390,54\n198391,1962\n198392,1882\n198393,818\n198394,198395\n198396,392\n198397,7416\n198398,515\n198398,2626\n198399,1858\n198400,1860\n198401,1181\n198402,179170\n198403,994\n198404,48\n198405,1432\n198406,94\n198406,2787\n198407,198408\n198409,14434\n198410,55849\n198411,273\n198412,179170\n198413,48\n198414,358\n198415,1858\n198416,1860\n198417,56\n198418,422\n198419,179170\n198420,278\n198421,83\n198422,1860\n198423,1858\n198424,30\n198425,2116\n198426,1181\n198427,179170\n198428,1181\n198429,1882\n198430,356\n198431,1769\n198432,56\n198432,240174\n198433,81\n198434,179170\n198435,102560\n198436,1860\n198437,1858\n198438,1556\n198439,485\n198440,298\n198441,1927\n198442,818\n198443,1300\n198444,536\n198445,1707\n198445,3507\n198446,179170\n198447,30\n198448,179170\n198449,301\n198449,305\n198449,509\n198449,516\n198449,1298\n198449,1837\n198449,2083\n198450,198451\n198452,179170\n198453,217\n198453,1417\n198454,104\n198454,557\n198454,953\n198454,954\n198455,250\n198455,1684\n198456,10\n198457,1019\n198458,557\n198459,302\n198460,179170\n198461,198462\n198463,179170\n198464,251\n198465,83\n198466,861\n198466,2116\n198467,1265\n198467,1266\n198468,269\n198469,179170\n198470,72\n198471,6556\n198472,1132\n198473,781\n198474,455\n198475,3\n198478,333\n198479,83\n198480,179170\n198481,179170\n198482,3\n198483,15119\n198484,179170\n198485,179170\n198486,179170\n198487,1619\n198489,72\n198490,2379\n198491,179170\n198492,179170\n198494,179170\n198495,781\n198496,1132\n198497,9015\n198497,142870\n198498,485\n198499,298\n198500,949\n198501,1474\n198502,179170\n198503,179170\n198504,673\n198505,577\n198506,179170\n198507,1149\n198508,179170\n198509,8270\n198510,422\n198511,179170\n198512,2620\n198513,198514\n198515,19010\n198516,267\n198517,1085\n198518,72\n198519,179170\n198520,749\n198521,30\n198522,179170\n198523,18726\n198524,179170\n198525,179170\n198526,179170\n198527,2116\n198528,1608\n198529,1132\n198530,1\n198531,2146\n198532,1058\n198533,861\n198534,30\n198535,247\n198536,278\n198537,3623\n198538,198538\n198539,72\n198540,179170\n198541,138686\n198542,175\n198543,1085\n198544,1132\n198545,781\n198546,994\n198547,577\n198548,23783\n198549,577\n198550,393\n198551,30\n198552,13\n198552,874\n198553,250\n198553,1684\n198554,5987\n198555,72\n198556,285\n198557,179170\n198558,179170\n198559,198560\n198561,179170\n198562,30\n198563,138686\n198564,175\n198565,634\n198566,134\n198567,72\n198568,693\n198569,198570\n198571,72\n198572,179170\n198573,671\n198575,900\n198576,1607\n198576,2089\n198576,2940\n198577,179170\n198578,2590\n198579,30\n198580,198581\n198582,424\n198583,72\n198584,258\n198585,628\n198586,207\n198587,198588\n198589,269\n198590,30331\n198592,30331\n198593,179170\n198595,206\n198596,30\n198597,862\n198598,1326\n198599,102\n198600,1323\n198601,408\n198602,2073\n198602,205602\n198603,309\n198603,310\n198604,3804\n198605,15748\n198606,179170\n198607,198608\n198609,668\n198610,19010\n198611,304\n198611,2334\n198612,137\n198613,1241\n198614,179170\n198615,1267\n198616,872\n198618,1429\n198619,4548\n198620,589\n198621,843\n198622,255\n198623,861\n198624,179170\n198625,179170\n198626,1414\n198627,147\n198628,217\n198629,151\n198630,1619\n198631,805\n198632,1782\n198633,71\n198634,179170\n198635,355\n198636,3830\n198637,1132\n198638,1608\n198639,779\n198639,2244\n198640,450\n198641,2135\n198642,1143\n198643,83\n198644,862\n198645,275\n198646,5366\n198647,585\n198648,3846\n198649,8992\n198650,115\n198650,118\n198651,333\n198652,2931\n198653,36985\n198654,5976\n198655,79\n198656,1332\n198657,217\n198658,44\n198659,2668\n198660,225\n198661,1893\n198662,8822\n198663,16196\n198664,1238\n198665,30\n198666,1860\n198667,1858\n198668,240\n198668,179804\n198669,301\n198670,1452\n198671,309\n198671,310\n198672,259\n198672,1983\n198672,3949\n198673,525\n198674,749\n198675,30\n198676,273\n198677,147\n198677,149\n198677,269\n198677,406\n198678,602\n198679,1019\n198680,137\n198681,366\n198682,366\n198683,366\n198684,366\n198685,366\n198686,366\n198687,366\n198688,222\n198688,422\n198689,366\n198690,56\n198691,422\n198692,179170\n198693,1019\n198694,179170\n198695,636\n198696,1608\n198697,60576\n198698,1132\n198699,467\n198699,868\n198700,1284\n198701,640\n198702,640\n198704,287\n198705,1653\n198706,60576\n198707,1224\n198708,179170\n198709,585\n198709,1776\n198710,784\n198711,360\n198711,4571\n198711,88820\n198712,994\n198713,422\n198714,422\n198715,422\n198716,360\n198717,422\n198718,422\n198719,422\n198720,422\n198721,422\n198722,309\n198722,310\n198724,422\n198725,422\n198726,422\n198727,994\n198728,6068\n198729,406\n198730,994\n198731,107\n198732,360\n198733,55849\n198734,433\n198735,442\n198736,197382\n198737,83\n198738,994\n198739,287\n198740,994\n198741,209\n198742,217\n198742,536\n198743,198744\n198745,994\n198746,2867\n198746,2868\n198747,920\n198748,467\n198749,3623\n198750,7572\n198751,932\n198752,2782\n198753,1127\n198754,360\n198755,439\n198756,671\n198757,142426\n198758,79\n198758,1392\n198759,134\n198759,137\n198760,994\n198761,37414\n198762,72\n198763,1381\n198764,1882\n198765,285\n198766,1608\n198767,1132\n198768,55849\n198769,87\n198771,146\n198771,779\n198771,1515\n198771,92476\n198772,1140\n198773,2006\n198774,440\n198775,41\n198777,179170\n198778,301\n198778,22580\n198779,5440\n198780,1415\n198780,1849\n198780,124668\n198780,148742\n198781,179170\n198782,2605\n198783,217\n198784,217\n198784,1417\n198785,994\n198786,994\n198787,1983\n198788,425\n198788,1807\n198789,433\n198790,557\n198791,422\n198792,1860\n198793,1858\n198794,264\n198794,1381\n198795,994\n198796,60576\n198797,994\n198798,198799\n198800,994\n198801,994\n198802,1019\n198804,1033\n198805,934\n198806,425\n198806,1082\n198806,1807\n198807,264\n198807,818\n198807,1381\n198807,2334\n198808,1082\n198809,994\n198810,1181\n198811,366\n198812,3623\n198813,1381\n198814,602\n198815,211\n198816,137\n198817,994\n198818,999\n198819,1096\n198820,72\n198821,211\n198822,211\n198823,1659\n198824,1608\n198825,1132\n198826,259\n198827,4190\n198828,1082\n198829,440\n198830,193129\n198831,435\n198832,292\n198833,994\n198834,6627\n198835,8180\n198836,107\n198836,111\n198837,167\n198838,250\n198838,1684\n198839,1082\n198840,1381\n198841,309\n198841,310\n198842,55849\n198843,1082\n198844,843\n198845,32\n198846,620\n198847,663\n198848,392\n198848,623\n198848,697\n198848,1805\n198848,214734\n198849,1769\n198850,309\n198850,310\n198851,1019\n198852,189788\n198853,1052\n198854,2775\n198855,54\n198856,1962\n198857,1882\n198858,30\n198858,102\n198858,305\n198858,489\n198858,849\n198859,4223\n198860,178\n198861,3260\n198862,949\n198863,809\n198863,861\n198863,893\n198864,6789\n198865,326\n198866,406\n198867,198868\n198867,218267\n198869,1769\n198870,843\n198871,1871\n198873,835\n198874,179170\n198875,7416\n198876,435\n198877,58\n198878,994\n198879,261\n198880,46\n198881,198882\n198883,920\n198884,140\n198885,179170\n198886,762\n198886,1043\n198886,1113\n198886,1801\n198886,2460\n198886,2590\n198886,6059\n198887,147\n198887,149\n198888,1014\n198889,994\n198890,1014\n198891,433\n198892,179170\n198893,1014\n198894,1014\n198895,179170\n198896,1014\n198897,1014\n198898,30\n198899,179170\n198900,843\n198901,868\n198902,202\n198903,252\n198904,1220\n198904,1222\n198905,251\n198906,326\n198907,1860\n198908,1858\n198909,994\n198910,733\n198911,2373\n198912,356\n198913,179170\n198914,358\n198915,119\n198915,577\n198915,1400\n198915,2073\n198916,1769\n198917,179170\n198918,50\n198918,158\n198918,178\n198918,333\n198918,779\n198919,1082\n198920,1608\n198921,1132\n198922,1707\n198923,483\n198924,2379\n198925,358\n198926,247\n198926,2867\n198926,2868\n198927,179170\n198928,1515\n198929,779\n198930,1844\n198931,179170\n198932,255\n198932,818\n198933,1082\n198934,1893\n198934,8855\n198935,2353\n198936,1556\n198937,179170\n198938,1572\n198939,158\n198940,151\n198941,611\n198942,9029\n198943,289\n198943,290\n198943,94134\n198944,179170\n198945,994\n198946,439\n198947,179170\n198948,72\n198949,192\n198950,113156\n198951,60576\n198952,1082\n198953,30\n198954,179170\n198955,994\n198956,179170\n198957,994\n198958,198959\n198960,1807\n198961,138686\n198962,175\n198963,2735\n198964,2224\n198965,72\n198966,994\n198967,1082\n198968,151\n198969,1082\n198970,30\n198971,1\n198971,30428\n198972,19010\n198973,1082\n198974,72\n198975,697\n198975,1769\n198976,198977\n198978,994\n198979,994\n198980,1836\n198981,198982\n198981,246509\n198981,252296\n198981,254464\n198981,264173\n198983,179170\n198984,795\n198985,278\n198986,8501\n198987,72\n198988,1807\n198989,1634\n198990,333\n198991,35687\n198992,179170\n198993,1807\n198994,577\n198995,19010\n198996,640\n198997,918\n198998,278\n198999,179170\n199001,795\n199002,79\n199004,602\n199005,247\n199006,1858\n199007,179170\n199008,760\n199008,1082\n199009,862\n199010,1014\n199011,1082\n199012,179170\n199013,1467\n199014,3623\n199015,5906\n199016,557\n199017,626\n199018,278\n199019,137\n199020,862\n199021,30\n199022,337\n199023,1849\n199024,30\n199025,30\n199026,267\n199027,3623\n199028,467\n199029,671\n199030,30\n199031,30\n199032,440\n199032,1033\n199033,30\n199034,516\n199035,994\n199036,19010\n199037,920\n199038,285\n199039,8270\n199040,179170\n199041,1177\n199041,182162\n199042,30\n199043,55849\n199044,602\n199045,30\n199046,211\n199047,872\n199048,30\n199049,994\n199050,30\n199051,30\n199052,422\n199053,273\n199054,30\n199055,1983\n199056,1014\n199057,328\n199058,1014\n199059,602\n199060,30\n199061,8270\n199062,2750\n199063,1014\n199064,1326\n199065,102\n199066,408\n199067,1323\n199068,577\n199069,360\n199069,4571\n199070,179170\n199071,30\n199072,795\n199073,30\n199074,199075\n199076,1\n199077,406\n199078,1149\n199079,994\n199080,289\n199080,290\n199080,94134\n199081,1773\n199082,264\n199083,179170\n199084,30\n199085,199086\n199087,30\n199088,30\n199089,1623\n199090,900\n199091,30\n199092,30\n199093,4903\n199094,44\n199095,30\n199096,2775\n199097,447\n199098,442\n199099,30\n199100,179170\n199101,30\n199102,30\n199103,30\n199104,30\n199105,285\n199106,151\n199107,30\n199108,250\n199108,1684\n199109,30\n199110,30\n199111,285\n199112,30\n199113,250\n199113,1684\n199114,30\n199115,30\n199116,30\n199117,7092\n199118,671\n199119,30\n199120,1132\n199121,178\n199122,372\n199122,1572\n199122,103153\n199123,30\n199124,30\n199125,30\n199126,2205\n199126,33424\n199127,30\n199128,994\n199129,30\n199130,32\n199130,563\n199130,13910\n199131,30\n199132,1608\n199133,30\n199134,2923\n199135,30\n199136,158\n199136,516\n199137,30\n199138,1085\n199139,30\n199140,30\n199141,406\n199142,29380\n199143,83\n199144,1033\n199145,179170\n199146,199147\n199148,2205\n199148,33424\n199150,30\n199151,30\n199152,199153\n199154,581\n199155,304\n199156,1789\n199157,179170\n199158,179170\n199159,30\n199161,1085\n199162,620\n199164,73570\n199165,30\n199166,1181\n199167,30\n199168,30\n199169,406\n199170,179170\n199171,199172\n199173,179170\n199174,199175\n199176,30\n199177,179170\n199178,71\n199178,104\n199178,1127\n199178,115659\n199179,999\n199180,1458\n199181,30\n199182,179170\n199183,56\n199184,422\n199185,827\n199186,56\n199187,422\n199188,861\n199189,355\n199190,72\n199191,697\n199191,1769\n199192,994\n199193,994\n199194,199195\n199196,1515\n199197,779\n199198,868\n199200,1132\n199201,1608\n199202,718\n199203,485\n199204,298\n199205,30\n199206,328\n199207,199208\n199209,420\n199209,567\n199210,225\n199210,248\n199210,358\n199210,379\n199210,557\n199210,932\n199210,941\n199211,179170\n199212,3582\n199213,86\n199214,30\n199215,30\n199216,60576\n199217,179170\n199218,596\n199219,673\n199221,30\n199222,640\n199223,72\n199224,640\n199225,5101\n199226,406\n199227,1882\n199228,30\n199229,151\n199229,192\n199230,346\n199231,135\n199232,1381\n199233,21442\n199234,56\n199235,422\n199236,30\n199237,6068\n199238,1132\n199239,1608\n199240,3623\n199241,1509\n199242,30\n199243,1785\n199244,83\n199245,175\n199246,422\n199247,192\n199248,179170\n199249,422\n199250,207\n199250,358\n199250,366\n199250,417\n199250,1052\n199250,1253\n199250,1319\n199250,1571\n199250,1634\n199250,2424\n199250,2620\n199250,2868\n199251,1608\n199252,1132\n199254,422\n199255,422\n199256,422\n199257,1608\n199258,1132\n199259,422\n199260,422\n199261,422\n199262,422\n199263,422\n199264,422\n199265,199266\n199267,422\n199268,1082\n199269,137\n199271,333\n199272,949\n199272,4252\n199272,5976\n199273,1284\n199274,809\n199275,179170\n199276,615\n199277,1293\n199278,2590\n199279,104\n199280,147\n199280,158\n199280,1458\n199281,626\n199282,433\n199283,1769\n199284,30\n199285,1608\n199286,1891\n199286,3507\n199287,315\n199288,795\n199289,285\n199290,868\n199291,240\n199292,1381\n199293,22\n199294,1390\n199295,994\n199296,22\n199297,312\n199298,222\n199299,918\n199300,314\n199301,406\n199301,1370\n199301,55849\n199302,932\n199303,994\n199305,1608\n199306,1132\n199307,302\n199307,2116\n199308,269\n199309,994\n199310,179170\n199311,211\n199312,30\n199313,557\n199314,56\n199315,1769\n199316,422\n199317,199318\n199319,217\n199320,8270\n199321,314\n199323,158\n199324,56\n199325,422\n199327,206\n199328,1608\n199329,1132\n199330,202\n199331,344\n199332,30\n199333,30\n199334,309\n199334,310\n199334,809\n199335,233\n199336,88820\n199337,199338\n199339,344\n199340,1707\n199341,1381\n199343,338\n199344,233\n199345,314\n199346,1860\n199347,1858\n199348,687\n199349,1287\n199349,9030\n199350,1566\n199351,31977\n199352,1058\n199353,596\n199354,115659\n199355,41\n199355,344\n199355,455\n199355,1012\n199356,1087\n199357,302\n199358,2929\n199359,30\n199360,1082\n199361,775\n199362,1082\n199363,422\n199364,56\n199365,149\n199365,202\n199365,406\n199366,30\n199367,1238\n199367,1363\n199367,1572\n199368,2574\n199369,19443\n199370,1285\n199371,142870\n199372,3345\n199372,5358\n199372,14352\n199373,1179\n199374,1718\n199375,30\n199376,2168\n199376,7698\n199377,30\n199379,949\n199380,1634\n199382,30\n199383,65\n199384,30\n199385,932\n199386,344\n199387,285\n199388,72\n199389,30\n199390,10\n199392,30\n199393,1381\n199394,252\n199395,30\n199396,56\n199397,422\n199398,30\n199399,30\n199400,1118\n199401,344\n199402,1452\n199403,433\n199404,179170\n199405,4355\n199406,626\n199407,422\n199408,56\n199409,30\n199410,809\n199411,309\n199411,310\n199412,1113\n199413,433\n199414,142426\n199415,56\n199416,422\n199417,179170\n199418,179170\n199419,147\n199419,1385\n199420,138686\n199421,175\n199422,1722\n199423,58\n199424,968\n199425,7652\n199426,56\n199427,422\n199428,30\n199429,387\n199430,97\n199431,366\n199432,1608\n199433,1132\n199434,4545\n199434,56150\n199435,215\n199436,366\n199437,2367\n199438,366\n199439,151\n199440,30\n199441,2775\n199442,467\n199443,2083\n199444,338\n199445,179170\n199446,918\n199447,200\n199448,515\n199449,631\n199450,596\n199451,1179\n199452,83\n199453,30\n199454,1566\n199455,278\n199456,1381\n199457,217\n199458,292\n199459,199460\n199461,1370\n199462,222\n199462,1284\n199463,30\n199464,30\n199465,1688\n199466,315\n199467,30\n199468,647\n199469,483\n199471,1181\n199472,278\n199473,1179\n199474,1769\n199475,199476\n199477,328\n199478,179170\n199479,72\n199481,195\n199482,30\n199483,151\n199484,179170\n199485,1274\n199486,1402\n199487,199488\n199489,179170\n199490,515\n199491,30\n199492,2590\n199493,481\n199494,516\n199494,1220\n199494,1222\n199495,179170\n199496,30\n199497,199498\n199499,179170\n199500,179170\n199501,179170\n199502,30\n199503,30\n199504,146\n199504,92476\n199505,344\n199506,647\n199507,1087\n199508,179170\n199509,1133\n199510,83\n199511,372\n199511,1284\n199511,148742\n199512,1001\n199513,179170\n199514,795\n199515,3804\n199516,1001\n199517,3193\n199518,525\n199519,589\n199519,615\n199519,631\n199519,1181\n199519,1782\n199520,994\n199521,199522\n199521,214549\n199523,1140\n199523,5547\n199524,704\n199525,647\n199526,344\n199527,146\n199527,92476\n199528,192\n199529,180487\n199530,267\n199531,835\n199532,991\n199533,141912\n199534,71\n199534,450\n199534,1400\n199535,366\n199536,1127\n199538,389\n199539,1082\n199540,1359\n199541,557\n199542,862\n199543,5366\n199544,13661\n199545,485\n199546,298\n199547,1807\n199548,206\n199548,2260\n199549,199550\n199551,640\n199552,302\n199553,55849\n199554,333\n199555,8308\n199556,366\n199557,366\n199558,30\n199559,366\n199560,366\n199561,1085\n199562,366\n199563,310\n199563,3039\n199564,366\n199565,30\n199566,9457\n199567,406\n199568,440\n199569,366\n199570,1149\n199571,1326\n199572,102\n199573,1323\n199574,408\n199575,179170\n199576,167\n199577,199578\n199579,1359\n199580,2048\n199581,72\n199582,179170\n199583,30\n199584,30\n199585,72\n199586,30\n199587,72\n199588,30\n199589,30\n199590,30\n199591,6303\n199592,30\n199593,199594\n199595,1014\n199596,1014\n199597,1860\n199598,1858\n199599,285\n199600,66973\n199601,1227\n199601,86416\n199602,137\n199603,192\n199603,779\n199604,1\n199605,841\n199606,795\n199607,932\n199608,30\n199609,30\n199610,30\n199611,1181\n199612,3538\n199613,861\n199614,118\n199614,4597\n199615,269\n199616,850\n199617,1453\n199618,557\n199619,30\n199620,4548\n199621,3872\n199622,179170\n199623,158\n199624,179170\n199625,179170\n199627,3507\n199629,1858\n199630,1860\n199631,179170\n199632,30\n199633,355\n199634,310\n199634,3039\n199635,35\n199635,2671\n199636,872\n199637,181063\n199638,179170\n199639,1631\n199640,199641\n199642,179170\n199643,388\n199644,76096\n199645,694\n199646,1707\n199647,163\n199647,302\n199649,1238\n199650,360\n199650,4571\n199651,72\n199652,1452\n199653,1608\n199654,1132\n199655,113156\n199657,199658\n199659,1882\n199660,2775\n199661,1962\n199662,1052\n199663,54\n199664,3260\n199665,302\n199666,30\n199667,3623\n199669,577\n199670,179170\n199671,1769\n199672,422\n199673,422\n199674,795\n199675,422\n199676,422\n199677,422\n199678,422\n199679,422\n199680,422\n199681,422\n199682,422\n199683,422\n199684,422\n199685,440\n199686,1579\n199687,1381\n199688,272\n199689,287\n199690,30\n199691,4571\n199692,2572\n199693,1132\n199694,1177\n199694,2775\n199695,1127\n199696,640\n199697,83\n199698,5301\n199699,447\n199700,2775\n199701,163\n199702,932\n199703,1860\n199704,1858\n199705,1132\n199706,781\n199707,138686\n199708,175\n199709,21442\n199710,1860\n199711,1858\n199712,193129\n199713,647\n199714,146\n199714,92476\n199715,344\n199716,805\n199717,518\n199718,209\n199719,147\n199719,406\n199720,1644\n199721,209\n199722,1623\n199723,209\n199724,1381\n199725,55849\n199726,736\n199727,2671\n199728,805\n199729,1172\n199730,328\n199731,3094\n199732,712\n199733,1127\n199733,1769\n199734,189303\n199735,994\n199736,103860\n199737,392\n199738,425\n199739,55849\n199740,1860\n199741,1858\n199742,3769\n199743,1807\n199744,30\n199745,1707\n199746,30\n199747,1659\n199748,994\n199749,6068\n199750,30\n199751,30\n199752,3\n199753,97\n199754,217\n199755,1220\n199755,1222\n199756,251\n199757,252\n199758,1688\n199759,994\n199760,99\n199761,994\n199762,1381\n199763,1284\n199763,3207\n199763,148742\n199764,1882\n199765,994\n199766,3\n199767,1608\n199768,1132\n199769,1844\n199769,2460\n199770,422\n199771,56\n199772,48\n199773,1285\n199774,302\n199775,360\n199775,2617\n199776,994\n199777,192\n199778,3623\n199779,994\n199780,192\n199781,868\n199782,489\n199783,2590\n199784,1566\n199785,103860\n199786,199787\n199788,3623\n199789,136\n199789,137\n199789,1276\n199789,1479\n199790,199791\n199792,1531\n199793,1381\n199794,994\n199795,1608\n199796,171641\n199797,1132\n199798,994\n199799,509\n199799,510\n199800,1132\n199801,1608\n199802,809\n199803,712\n199804,991\n199805,192\n199806,3623\n199807,784\n199808,58\n199809,994\n199810,46\n199811,3623\n199812,58\n199813,46\n199814,994\n199815,58\n199816,994\n199817,46\n199818,58\n199819,46\n199820,994\n199821,199822\n199821,205646\n199823,994\n199824,704\n199825,994\n199826,24505\n199827,5102\n199828,1639\n199829,442\n199830,138686\n199831,175\n199832,1417\n199833,3328\n199834,994\n199835,3467\n199836,200\n199837,1381\n199838,893\n199839,1132\n199840,781\n199841,663\n199842,859\n199843,3161\n199844,3623\n199845,805\n199846,30\n199847,920\n199848,3623\n199849,3623\n199850,30\n199851,272\n199852,1436\n199853,1087\n199854,179170\n199855,199856\n199857,3623\n199858,640\n199859,179170\n199860,30\n199861,850\n199862,2443\n199863,861\n199864,199865\n199866,843\n199867,199868\n199869,199868\n199870,994\n199871,30\n199872,37\n199873,843\n199874,483\n199875,217\n199876,1556\n199877,1287\n199878,240\n199879,663\n199880,58\n199881,46\n199882,994\n199883,30\n199884,1860\n199886,515\n199887,35486\n199888,1240\n199889,179170\n199890,175\n199891,199892\n199893,179170\n199894,30\n199895,138686\n199896,2073\n199897,151\n199898,179170\n199899,179170\n199900,179170\n199901,30\n199902,179170\n199903,179170\n199904,1881\n199905,48\n199905,222\n199905,338\n199905,1634\n199905,7155\n199906,19\n199907,252\n199907,516\n199908,697\n199908,1769\n199909,179170\n199910,179170\n199911,179170\n199912,406\n199913,30\n199914,179170\n199915,622\n199916,30\n199917,192\n199918,41\n199918,1608\n199919,179170\n199920,138\n199921,865\n199922,557\n199923,137\n199924,88820\n199925,118\n199925,4597\n199926,30\n199927,42419\n199928,1181\n199929,1474\n199930,1572\n199931,1805\n199932,313\n199933,389\n199934,1122\n199935,30\n199936,30\n199937,994\n199938,406\n199939,994\n199940,1881\n199941,30\n199942,489\n199943,142870\n199944,994\n199945,663\n199946,30\n199947,994\n199948,577\n199949,3623\n199951,240\n199952,179170\n199953,996\n199954,55849\n199955,55849\n199956,55849\n199957,818\n199958,2590\n199959,1132\n199960,781\n199961,199962\n199963,199964\n199965,72\n199966,30\n199967,199968\n199969,875\n199971,1227\n199971,86416\n199972,996\n199973,179170\n199974,179170\n199975,71\n199975,611\n199975,2367\n199976,142433\n199977,557\n199978,179170\n199979,30\n199980,349\n199981,3623\n199982,179170\n199983,255\n199984,179170\n199986,994\n199987,1509\n199988,199989\n199990,3161\n199991,179170\n199992,179170\n199993,809\n199994,16196\n199995,16196\n199996,2590\n199997,994\n199998,2048\n199999,10\n200000,358\n200001,393\n200002,151\n200003,1016\n200004,818\n200005,994\n200006,209\n200007,192\n200007,406\n200008,3507\n200009,1016\n200010,30236\n200011,187\n200012,30\n200013,536\n200014,861\n200015,422\n200016,56\n200017,10\n200017,30\n200017,67343\n200018,640\n200019,1220\n200019,1222\n200020,516\n200021,252\n200022,298\n200023,485\n200024,1773\n200025,994\n200026,1274\n200027,447\n200028,2775\n200029,1773\n200030,1608\n200031,447\n200032,2775\n200033,332\n200034,450\n200035,636\n200036,795\n200037,406\n200038,22\n200038,247\n200039,8990\n200040,58\n200041,994\n200042,46\n200043,332\n200044,366\n200045,366\n200046,366\n200047,366\n200048,366\n200049,366\n200050,366\n200051,447\n200052,2775\n200053,366\n200054,366\n200055,366\n200056,366\n200057,1267\n200058,14366\n200059,861\n200060,225\n200061,356\n200062,743\n200063,8884\n200064,200065\n200066,1085\n200067,72\n200068,827\n200069,179170\n200070,72\n200071,179170\n200072,72\n200073,8270\n200074,200075\n200074,200817\n200074,216831\n200076,151\n200077,355\n200078,79\n200079,184\n200080,779\n200081,1287\n200081,9030\n200082,850\n200083,200084\n200085,493\n200086,10\n200087,5908\n200088,483\n200089,1227\n200089,86416\n200090,932\n200091,994\n200092,994\n200093,83\n200094,200095\n200096,1707\n200097,1893\n200098,841\n200099,138686\n200100,175\n200101,493\n200102,485\n200103,298\n200104,30\n200105,200\n200106,485\n200107,298\n200108,13910\n200109,1181\n200110,298\n200111,485\n200112,44\n200113,1014\n200114,1014\n200115,1014\n200116,366\n200117,179170\n200118,2574\n200119,994\n200120,179170\n200121,179170\n200122,10\n200123,1707\n200124,179170\n200125,179170\n200126,1014\n200127,1019\n200127,4672\n200128,195\n200129,261\n200130,200\n200131,1014\n200132,333\n200133,79\n200134,954\n200134,10318\n200135,918\n200136,79\n200137,179170\n200138,175\n200139,358\n200140,30\n200141,171641\n200142,179170\n200143,440\n200144,255\n200144,843\n200145,255\n200146,179170\n200147,7698\n200148,30331\n200149,30331\n200150,996\n200151,1381\n200152,179170\n200153,1415\n200154,155481\n200155,1227\n200155,86416\n200156,450\n200157,56\n200158,422\n200159,56\n200160,422\n200161,485\n200162,298\n200163,1381\n200164,269\n200165,3623\n200166,179170\n200167,30\n200168,1891\n200169,1014\n200170,1132\n200171,781\n200172,1014\n200173,1381\n200174,179170\n200175,179170\n200176,179170\n200177,577\n200177,859\n200178,30\n200179,30\n200180,179170\n200181,483\n200182,179170\n200183,298\n200184,485\n200185,1381\n200186,1479\n200187,390\n200188,493\n200189,298\n200190,72\n200191,743\n200192,493\n200193,493\n200194,179170\n200195,179170\n200196,179170\n200197,179170\n200198,72\n200199,72\n200200,349\n200201,493\n200202,179170\n200203,179170\n200204,179170\n200205,8270\n200206,72\n200207,72\n200208,137\n200209,8270\n200210,179170\n200211,30\n200212,1882\n200213,30\n200214,200215\n200216,179170\n200217,72\n200218,861\n200219,179170\n200220,3623\n200221,30\n200222,30\n200223,1359\n200224,179170\n200225,118\n200225,4597\n200226,8270\n200227,151\n200228,179170\n200229,269\n200230,179170\n200231,3623\n200232,200233\n200234,285\n200235,626\n200235,3804\n200236,663\n200237,2205\n200237,33424\n200238,179170\n200239,805\n200240,192\n200241,72\n200242,1556\n200243,355\n200244,107\n200245,2416\n200245,2417\n200246,292\n200247,338\n200248,298\n200249,1133\n200250,3538\n200251,366\n200252,366\n200253,366\n200254,72\n200255,438\n200256,8270\n200257,44\n200258,1773\n200259,30\n200260,298\n200261,485\n200262,200263\n200264,14453\n200265,3623\n200266,179170\n200267,3623\n200268,647\n200269,179170\n200270,179170\n200271,30\n200272,332\n200273,65\n200274,240\n200275,30\n200276,68\n200277,1370\n200278,35\n200279,462\n200279,850\n200280,1844\n200281,200282\n200283,25348\n200283,101688\n200284,195\n200285,200286\n200287,179170\n200288,1227\n200288,86416\n200289,3623\n200290,581\n200291,72\n200292,918\n200293,1572\n200294,179170\n200295,179170\n200296,3474\n200297,862\n200298,907\n200299,516\n200300,1220\n200300,1222\n200301,252\n200302,450\n200303,6051\n200305,179170\n200306,1381\n200307,171641\n200308,647\n200309,360\n200309,1127\n200309,1769\n200310,1860\n200311,1858\n200312,1860\n200313,1858\n200314,31977\n200315,697\n200315,1127\n200315,1769\n200316,1400\n200317,179170\n200318,994\n200319,994\n200320,994\n200321,485\n200322,298\n200323,269\n200324,30\n200325,179170\n200326,179170\n200327,485\n200328,298\n200329,179170\n200330,994\n200331,138686\n200332,175\n200333,179170\n200334,1849\n200335,179170\n200336,179170\n200337,259\n200338,2944\n200339,447\n200340,2775\n200341,805\n200342,179170\n200343,676\n200344,671\n200345,79\n200346,450\n200347,805\n200348,310\n200349,1983\n200350,422\n200351,56\n200352,65\n200352,389\n200352,874\n200353,809\n200354,557\n200355,557\n200356,557\n200357,200358\n200359,55849\n200360,179170\n200361,485\n200362,298\n200364,483\n200365,30\n200366,269\n200367,1707\n200368,200369\n200370,994\n200371,1515\n200372,145751\n200373,30\n200374,200375\n200376,179170\n200377,1370\n200378,1370\n200379,422\n200379,862\n200380,142473\n200381,1608\n200382,2944\n200383,179170\n200384,65\n200385,179170\n200386,861\n200387,920\n200388,68\n200389,2572\n200389,7194\n200390,179170\n200391,1072\n200392,200393\n200394,5301\n200395,406\n200396,179170\n200397,4691\n200398,179170\n200399,30\n200400,843\n200401,30\n200402,30\n200403,493\n200404,7155\n200405,179170\n200406,146\n200406,285\n200406,620\n200406,60576\n200406,92476\n200407,227\n200408,299\n200409,1012\n200410,179170\n200411,874\n200412,1381\n200412,1419\n200412,2292\n200413,41\n200414,72\n200415,179170\n200416,310\n200417,83\n200418,1181\n200419,6424\n200420,72\n200421,8270\n200422,338\n200423,179170\n200424,420\n200424,2436\n200425,7092\n200426,422\n200427,292\n200428,184\n200429,640\n200430,179170\n200431,3695\n200432,298\n200433,285\n200434,294\n200435,296\n200436,298\n200437,1807\n200438,179170\n200439,285\n200440,250\n200440,1684\n200441,200442\n200443,179170\n200444,200445\n200446,79\n200447,1821\n200447,21736\n200448,179170\n200449,355\n200450,83\n200451,200452\n200453,1608\n200454,1191\n200454,2253\n200455,298\n200455,911\n200456,440\n200457,2553\n200458,44\n200459,278\n200460,200461\n200462,640\n200463,697\n200463,1769\n200464,788\n200465,1238\n200466,19010\n200467,422\n200468,163\n200469,422\n200470,422\n200471,422\n200472,422\n200473,422\n200474,422\n200475,1452\n200476,422\n200477,422\n200478,422\n200479,422\n200480,422\n200481,1984\n200481,3949\n200482,1122\n200482,3207\n200483,805\n200484,1749\n200485,30\n200486,30\n200487,1769\n200488,1707\n200489,22\n200490,640\n200491,640\n200492,596\n200493,209\n200494,647\n200495,146\n200495,92476\n200496,344\n200497,636\n200498,1118\n200499,200500\n200501,3258\n200502,483\n200503,3623\n200504,209\n200505,671\n200506,602\n200507,872\n200508,1309\n200509,493\n200510,1860\n200511,1858\n200512,1769\n200513,200\n200514,283\n200514,2168\n200514,7698\n200515,1359\n200516,875\n200517,920\n200518,285\n200519,3623\n200520,30\n200520,200\n200520,248\n200520,772\n200521,467\n200522,280\n200522,1243\n200522,2868\n200522,17245\n200522,21736\n200523,225\n200524,200525\n200526,3623\n200527,83\n200528,171\n200528,344\n200528,957\n200528,1815\n200529,932\n200530,3623\n200531,1769\n200532,968\n200533,1289\n200534,527\n200534,1298\n200535,200536\n200537,179170\n200538,225\n200538,425\n200540,179170\n200541,1659\n200542,980\n200544,349\n200544,1769\n200545,1224\n200546,1769\n200547,3623\n200548,10\n200549,333\n200550,138686\n200551,175\n200552,818\n200553,147\n200555,3623\n200556,1132\n200557,1608\n200558,1287\n200559,1608\n200560,1132\n200561,493\n200562,184\n200563,8537\n200564,1132\n200565,1608\n200566,1132\n200568,663\n200569,1847\n200570,1359\n200571,5405\n200572,602\n200572,3218\n200573,1392\n200574,483\n200575,1381\n200576,3474\n200577,1531\n200578,1118\n200579,51006\n200580,862\n200582,1769\n200583,1769\n200586,22\n200587,5405\n200588,4504\n200589,1608\n200590,1132\n200591,731\n200592,79\n200593,733\n200595,2105\n200596,179170\n200597,171641\n200598,2620\n200599,206\n200600,151\n200601,1147\n200602,640\n200604,179170\n200607,417\n200608,60576\n200610,907\n200611,4355\n200612,79\n200613,1326\n200614,868\n200615,60576\n200616,86\n200617,493\n200618,222\n200619,269\n200620,310\n200620,3039\n200621,1276\n200622,273\n200623,1844\n200624,1284\n200625,356\n200625,3507\n200626,179170\n200627,147\n200627,158\n200627,80266\n200628,147\n200628,89035\n200629,179170\n200631,195\n200632,1769\n200633,393\n200634,30\n200635,1837\n200637,2266\n200638,4771\n200639,571\n200639,868\n200640,200641\n200642,217\n200643,151\n200646,301\n200647,3623\n200648,22\n200649,1608\n200650,784\n200651,344\n200652,146\n200652,92476\n200653,647\n200656,30\n200657,326\n200658,30331\n200659,10\n200659,1181\n200661,146\n200661,92476\n200662,647\n200663,344\n200664,2979\n200665,577\n200666,200\n200667,779\n200668,200669\n200670,200669\n200671,200669\n200672,200669\n200673,146\n200673,92476\n200674,344\n200675,647\n200676,146\n200676,92476\n200677,647\n200678,344\n200681,240\n200682,1147\n200683,1973\n200684,10\n200685,60576\n200686,302\n200686,2116\n200687,3182\n200688,425\n200689,115\n200689,118\n200690,1058\n200691,425\n200692,160\n200693,160\n200694,95554\n200694,129534\n200695,1345\n200696,287\n200697,1769\n200698,1465\n200699,188791\n200700,225\n200701,1769\n200702,179170\n200703,1579\n200704,142426\n200705,1014\n200706,146\n200706,92476\n200707,344\n200708,647\n200709,1014\n200710,671\n200711,1579\n200712,1014\n200713,1014\n200714,1122\n200715,179170\n200716,189266\n200717,1769\n200718,1052\n200719,1882\n200720,54\n200721,2775\n200722,1962\n200723,4146\n200724,142426\n200725,503\n200726,107\n200727,83\n200728,392\n200729,1769\n200730,1014\n200731,1458\n200732,269\n200733,1014\n200734,818\n200735,2411\n200736,1085\n200736,1285\n200736,2083\n200737,515\n200738,841\n200739,406\n200740,349\n200741,2411\n200742,1769\n200743,389\n200744,1849\n200745,346\n200746,202\n200747,200748\n200749,186\n200750,1801\n200751,843\n200752,309\n200752,310\n200753,805\n200754,918\n200755,1345\n200756,294\n200757,13661\n200758,200759\n200760,200759\n200761,200759\n200762,200759\n200763,200759\n200764,657\n200765,2784\n200766,200767\n200768,299\n200769,467\n200770,1402\n200771,852\n200771,188791\n200772,718\n200773,1309\n200773,1807\n200773,2775\n200774,179170\n200775,435\n200776,1240\n200776,1465\n200777,309\n200777,310\n200778,5213\n200779,483\n200780,1707\n200781,424\n200782,493\n200783,30\n200784,760\n200785,151\n200786,179170\n200787,843\n200788,179170\n200789,200790\n200791,200790\n200792,200790\n200794,1149\n200794,1631\n200795,647\n200796,485\n200797,298\n200798,647\n200799,3507\n200800,1544\n200801,406\n200802,179170\n200803,1\n200804,2590\n200805,107\n200806,306\n200806,307\n200807,179170\n200808,2266\n200809,697\n200810,30\n200811,493\n200812,1332\n200813,447\n200814,2205\n200814,33424\n200815,1381\n200816,138686\n200818,175\n200819,1289\n200820,433\n200821,3148\n200822,663\n200823,179170\n200824,119\n200825,503\n200826,240\n200826,818\n200827,200828\n200829,179170\n200830,1860\n200831,1858\n200832,577\n200833,1359\n200834,1\n200835,179170\n200836,1381\n200838,30\n200839,179170\n200840,15119\n200841,70631\n200842,344\n200843,30\n200844,179170\n200845,200846\n200847,1556\n200848,1132\n200849,781\n200850,179170\n200851,83\n200852,557\n200853,1241\n200854,179170\n200855,176782\n200856,179170\n200857,179170\n200858,179170\n200859,1326\n200860,102\n200861,408\n200862,1323\n200863,949\n200864,179170\n200865,179170\n200866,252\n200867,179170\n200868,1096\n200869,862\n200870,1474\n200871,673\n200872,30\n200873,195\n200874,250\n200874,1684\n200875,1449\n200876,323\n200877,2292\n200878,298\n200879,179170\n200880,179170\n200881,179170\n200882,179170\n200883,8270\n200884,179170\n200885,179170\n200886,2116\n200887,179170\n200888,179170\n200889,179170\n200890,278\n200891,179170\n200892,240\n200893,1769\n200894,841\n200895,861\n200896,179170\n200897,30\n200898,179170\n200899,1010\n200899,1122\n200899,1241\n200900,15523\n200901,179170\n200902,1659\n200903,6323\n200904,298\n200905,485\n200906,179170\n200907,3297\n200908,1058\n200909,920\n200910,207\n200911,34\n200911,35\n200911,83\n200911,158\n200911,217\n200911,278\n200911,313\n200911,536\n200911,634\n200911,660\n200911,852\n200911,1133\n200911,1274\n200911,1313\n200911,1466\n200911,1467\n200911,1718\n200911,2224\n200911,2646\n200911,2779\n200911,4637\n200911,5326\n200911,7092\n200911,9015\n200913,673\n200914,1313\n200915,142430\n200915,142473\n200916,179170\n200917,179170\n200918,750\n200919,3209\n200920,1882\n200921,135\n200922,919\n200923,682\n200923,72439\n200924,3194\n200925,5358\n200925,14352\n200926,147\n200927,493\n200928,422\n200929,138686\n200930,175\n200931,269\n200932,179170\n200933,24763\n200934,626\n200935,179170\n200936,118\n200936,4597\n200937,1436\n200938,577\n200939,473\n200940,602\n200941,3804\n200942,46\n200943,304\n200944,671\n200945,668\n200946,2367\n200947,30331\n200948,861\n200949,2315\n200950,77\n200951,118\n200951,4597\n200952,269\n200953,1449\n200954,1983\n200955,1319\n200956,2266\n200957,615\n200958,1467\n200959,707\n200960,2590\n200961,1623\n200962,1001\n200963,920\n200964,30\n200965,283\n200966,417\n200967,269\n200968,388\n200969,6682\n200970,207\n200971,2424\n200972,346\n200973,862\n200974,18726\n200975,9457\n200976,200977\n200978,2590\n200979,88820\n200980,861\n200981,859\n200982,3089\n200983,301\n200984,3413\n200985,6387\n200986,1564\n200987,30\n200988,1\n200989,184\n200990,32475\n200991,668\n200992,1227\n200992,86416\n200993,1769\n200994,151\n200995,872\n200996,272\n200997,827\n200998,1429\n200999,736\n201000,4691\n201001,151\n201002,424\n201003,145240\n201004,15748\n201005,115659\n201006,1634\n201007,83\n201008,13980\n201009,1769\n201010,83\n201011,1544\n201012,4611\n201013,640\n201014,1262\n201014,1285\n201015,355\n201017,179170\n201018,2073\n201019,269\n201020,415\n201021,1858\n201022,1860\n201023,3328\n201024,563\n201025,251\n201026,1769\n201027,142473\n201028,251\n201028,1220\n201029,124668\n201030,485\n201031,298\n201032,2620\n201033,124668\n201034,602\n201035,392\n201035,697\n201036,124668\n201037,138686\n201038,1381\n201039,2205\n201039,33424\n201040,1608\n201041,1132\n201042,1143\n201043,1132\n201044,1608\n201045,48\n201046,4549\n201047,1016\n201047,2205\n201047,33424\n201047,245910\n201048,640\n201049,640\n201050,187\n201051,302\n201051,1143\n201051,5301\n201052,48\n201053,1\n201054,702\n201055,254\n201056,968\n201058,3260\n201059,972\n201060,422\n201061,422\n201062,422\n201063,422\n201064,422\n201065,422\n201066,422\n201067,422\n201068,422\n201069,422\n201070,422\n201071,422\n201072,1860\n201073,1858\n201074,124668\n201075,48\n201076,120\n201077,994\n201078,1608\n201079,1132\n201080,485\n201081,298\n201082,147\n201083,72\n201084,1132\n201085,1608\n201086,1298\n201087,48\n201088,5301\n201089,201090\n201091,1769\n201092,994\n201093,1345\n201094,1087\n201095,1132\n201096,1608\n201097,920\n201098,227\n201099,1882\n201100,467\n201101,596\n201102,516\n201103,644\n201104,3623\n201105,302\n201106,1082\n201107,3623\n201108,994\n201109,1402\n201110,1345\n201111,142473\n201112,1381\n201113,2334\n201114,1127\n201115,920\n201115,255750\n201116,269\n201117,1082\n201119,697\n201119,1127\n201119,1769\n201120,1983\n201121,406\n201122,179170\n201123,1082\n201124,48\n201125,557\n201126,1082\n201127,1082\n201128,4190\n201130,83\n201131,1231\n201132,142426\n201133,3623\n201134,697\n201135,206\n201136,314\n201137,415\n201138,179170\n201139,1082\n201140,23783\n201141,3623\n201142,849\n201143,1172\n201144,877\n201145,907\n201146,179170\n201147,355\n201148,1058\n201148,3724\n201149,1688\n201150,143\n201150,17346\n201151,264\n201153,1707\n201154,142426\n201155,843\n201156,1188\n201157,285\n201158,1117\n201159,9030\n201160,1769\n201161,142473\n201162,189788\n201162,189794\n201162,223738\n201163,1659\n201165,1769\n201166,306\n201166,307\n201167,805\n201168,631\n201169,1458\n201170,211\n201170,718\n201170,5718\n201170,6051\n201170,8541\n201171,994\n201172,3623\n201173,388\n201173,2045\n201174,76096\n201175,86416\n201176,994\n201177,1858\n201178,1860\n201179,79\n201180,79\n201181,994\n201182,980\n201183,4548\n201184,3653\n201185,392\n201185,697\n201186,663\n201187,217\n201188,516\n201188,1220\n201188,1222\n201188,1821\n201188,21736\n201189,467\n201190,1309\n201191,1078\n201192,994\n201193,1130\n201194,233\n201195,994\n201196,1860\n201197,1858\n201198,994\n201199,147\n201200,30\n201201,1718\n201202,219\n201203,1769\n201204,811\n201205,309\n201205,310\n201206,326\n201207,1769\n201208,657\n201209,577\n201210,160\n201211,994\n201212,48\n201213,179170\n201214,147\n201214,158\n201215,994\n201216,1769\n201217,1769\n201218,179170\n201219,994\n201220,994\n201221,179170\n201222,1402\n201223,406\n201224,1769\n201225,1769\n201226,22\n201227,1659\n201228,811\n201228,1368\n201228,48505\n201229,2797\n201230,5440\n201231,557\n201232,3623\n201233,3623\n201234,209\n201235,393\n201236,146\n201236,92476\n201237,647\n201238,344\n201239,720\n201240,141912\n201241,209\n201242,781\n201243,1132\n201244,1769\n201246,201247\n201248,209\n201249,3695\n201250,994\n201251,179170\n201252,63\n201252,1010\n201252,1608\n201252,1749\n201252,13136\n201253,919\n201254,2460\n201255,179170\n201256,673\n201257,918\n201258,142426\n201259,781\n201260,1132\n201261,2526\n201262,1381\n201263,209\n201264,1359\n201265,1388\n201266,483\n201267,30\n201268,3623\n201269,179170\n201270,3623\n201271,801\n201272,360\n201273,1181\n201274,193578\n201275,309\n201275,310\n201276,3623\n201278,1888\n201279,179170\n201280,1070\n201281,79\n201282,994\n201283,515\n201284,360\n201284,697\n201284,1769\n201285,252\n201285,809\n201286,1634\n201287,7416\n201288,994\n201289,994\n201290,994\n201291,3623\n201292,360\n201293,3695\n201294,994\n201295,7416\n201296,360\n201297,435\n201298,3\n201298,654\n201298,16499\n201298,23306\n201298,201298\n201298,215158\n201298,216745\n201298,234149\n201299,306\n201299,307\n201299,682\n201299,72439\n201300,206\n201301,1769\n201302,1089\n201302,1623\n201303,302\n201304,4146\n201305,3623\n201306,138686\n201307,175\n201308,1769\n201309,209\n201310,615\n201311,137\n201312,1133\n201313,137\n201314,1707\n201315,1860\n201316,1858\n201317,843\n201318,852\n201319,1381\n201320,749\n201321,83\n201322,298\n201323,994\n201324,179170\n201325,2244\n201327,697\n201327,1769\n201328,1014\n201329,1551\n201330,3695\n201331,1769\n201332,991\n201333,10\n201334,994\n201335,83\n201336,32\n201337,142426\n201338,179170\n201339,779\n201339,1363\n201339,1805\n201340,251\n201341,718\n201342,1265\n201342,1266\n201343,302\n201343,1082\n201344,994\n201345,143\n201346,862\n201347,3623\n201348,151\n201349,3695\n201350,516\n201351,1769\n201352,694\n201353,1052\n201354,1718\n201355,818\n201356,68069\n201357,1769\n201358,491\n201359,171641\n201360,178\n201361,1014\n201362,309\n201362,310\n201363,3695\n201364,536\n201365,179170\n201366,269\n201367,178\n201367,392\n201367,467\n201368,1381\n201369,31073\n201370,493\n201371,302\n201372,13546\n201373,179170\n201374,113156\n201375,258\n201376,179170\n201378,752\n201379,1608\n201380,1132\n201381,467\n201381,1010\n201382,3582\n201383,1769\n201384,287\n201385,1191\n201386,1082\n201387,2620\n201388,455\n201389,34\n201389,35\n201389,222\n201389,283\n201389,332\n201389,389\n201389,406\n201389,536\n201389,657\n201389,694\n201389,720\n201389,781\n201389,788\n201389,877\n201389,907\n201389,949\n201389,1019\n201389,1072\n201389,1284\n201389,1467\n201389,1522\n201389,1718\n201389,1732\n201389,1881\n201389,1955\n201389,2191\n201389,2266\n201389,2671\n201389,2699\n201389,2784\n201389,3115\n201389,3194\n201389,3422\n201389,4594\n201389,5976\n201389,6888\n201389,9007\n201389,29475\n201389,42232\n201390,467\n201391,1425\n201392,35\n201393,83\n201393,217\n201393,278\n201393,536\n201393,660\n201393,852\n201393,1133\n201393,1466\n201393,1467\n201393,4637\n201393,7092\n201394,30331\n201395,142473\n201396,77\n201396,5440\n201397,179170\n201398,192\n201399,1227\n201399,86416\n201400,1769\n201401,2867\n201401,2868\n201402,201403\n201404,35\n201405,179170\n201406,255\n201407,3623\n201408,179170\n201409,1769\n201410,861\n201411,3623\n201412,179170\n201413,1319\n201414,30\n201415,3623\n201416,179170\n201417,217\n201418,1769\n201419,283\n201420,360\n201421,272\n201422,6303\n201423,10\n201424,41\n201425,72\n201426,3507\n201427,875\n201428,3804\n201429,994\n201430,809\n201431,994\n201432,2373\n201433,994\n201434,994\n201435,24505\n201436,278\n201437,994\n201438,994\n201439,3538\n201440,225\n201441,1016\n201442,1332\n201443,503\n201444,1722\n201445,328\n201446,72\n201447,312\n201448,111\n201449,136\n201450,227\n201451,358\n201452,3612\n201453,248\n201454,9029\n201455,4771\n201456,3695\n201457,1052\n201458,1882\n201459,1572\n201460,850\n201462,104\n201463,994\n201464,217\n201464,389\n201465,994\n201466,179170\n201467,1082\n201468,2224\n201469,179170\n201470,179170\n201471,1276\n201472,192\n201472,1089\n201473,557\n201474,1432\n201475,920\n201476,422\n201477,68\n201478,179170\n201479,5987\n201480,273\n201481,201482\n201483,44\n201484,440\n201485,907\n201486,217\n201487,79\n201488,862\n201489,83\n201490,6303\n201491,1474\n201492,1127\n201493,4455\n201494,179170\n201495,2073\n201495,25222\n201496,140\n201497,301\n201498,211\n201499,457\n201500,676\n201501,179170\n201502,179170\n201503,179170\n201504,179170\n201505,994\n201506,994\n201507,7416\n201508,6303\n201509,697\n201509,1769\n201510,2244\n201511,217\n201512,697\n201512,1769\n201513,861\n201514,818\n201515,56\n201516,422\n201517,1289\n201518,3138\n201519,592\n201520,1284\n201521,673\n201522,179170\n201523,818\n201524,179170\n201525,55849\n201526,1363\n201526,1858\n201527,179170\n201528,287\n201528,346\n201528,393\n201528,435\n201528,439\n201528,447\n201528,516\n201528,671\n201528,980\n201528,1294\n201528,1590\n201528,1612\n201528,15573\n201529,1\n201530,179170\n201531,2116\n201532,596\n201533,179170\n201534,179170\n201535,1769\n201536,30\n201537,259\n201538,704\n201538,920\n201539,179170\n201540,1608\n201541,1132\n201542,179170\n201543,1465\n201544,30\n201545,179170\n201546,663\n201547,124668\n201548,179170\n201549,30\n201550,1014\n201551,852\n201552,30\n201553,366\n201554,366\n201555,1014\n201556,2744\n201557,602\n201557,1417\n201558,994\n201559,330\n201560,2006\n201561,1014\n201562,994\n201563,994\n201564,273\n201564,191355\n201565,994\n201566,179170\n201567,179170\n201568,2048\n201569,217\n201570,1608\n201571,179170\n201572,422\n201574,30\n201575,287\n201576,994\n201577,994\n201578,247\n201579,179170\n201580,179170\n201581,994\n201582,179170\n201583,406\n201584,994\n201585,179170\n201586,292\n201587,994\n201588,247\n201589,577\n201590,179170\n201591,30331\n201592,390\n201593,1769\n201594,447\n201595,2775\n201596,19\n201596,360\n201596,602\n201597,2372\n201598,1177\n201598,182162\n201599,179170\n201600,202\n201601,179170\n201603,179170\n201604,280\n201604,17245\n201605,1179\n201605,2923\n201605,3695\n201606,1556\n201607,179170\n201608,201609\n201610,310\n201611,179170\n201612,179170\n201613,310\n201614,439\n201615,267\n201616,285\n201617,3623\n201618,207\n201619,151\n201620,179170\n201621,8270\n201622,3623\n201623,2590\n201624,269\n201625,690\n201626,779\n201627,862\n201628,818\n201629,424\n201630,330\n201630,2260\n201631,113156\n201632,179170\n201633,1773\n201634,872\n201635,1001\n201636,1429\n201637,671\n201638,563\n201639,30\n201640,346\n201641,255\n201642,2590\n201643,850\n201644,900\n201645,137\n201646,861\n201647,668\n201648,201649\n201650,201651\n201652,1227\n201652,86416\n201653,861\n201654,760\n201654,1119\n201655,179170\n201656,455\n201657,1769\n201658,752\n201659,137\n201660,1769\n201661,179170\n201662,355\n201663,30\n201664,30\n201665,1143\n201666,1252\n201666,1253\n201667,137\n201668,483\n201669,179170\n201670,1707\n201671,179170\n201672,179170\n201673,201674\n201675,201676\n201677,358\n201678,201679\n201680,1282\n201681,201682\n201683,1147\n201684,3623\n201685,38158\n201686,264\n201686,1551\n201687,201688\n201689,188791\n201690,16153\n201691,171\n201692,151\n201693,1860\n201694,1858\n201695,994\n201696,163\n201697,1085\n201698,202\n201699,1132\n201700,781\n201701,76096\n201702,76096\n201703,79\n201704,932\n201705,76096\n201706,76096\n201707,994\n201708,1082\n201709,2784\n201710,138\n201711,459\n201712,179170\n201713,201714\n201715,233\n201716,124668\n201717,640\n201718,134\n201719,1769\n201720,179170\n201721,640\n201722,640\n201723,251\n201724,852\n201725,994\n201726,22\n201727,179170\n201728,652\n201729,191860\n201730,875\n201731,48\n201731,340\n201731,473\n201731,649\n201732,1381\n201733,809\n201734,217\n201735,179170\n201736,48\n201737,571\n201738,1631\n201739,48\n201740,1769\n201741,275\n201742,272\n201743,1119\n201744,1769\n201745,1188\n201746,201747\n201748,932\n201749,306\n201749,307\n201750,7760\n201751,717\n201752,306\n201752,307\n201753,287\n201755,344\n201756,179170\n201759,48\n201760,83\n201761,138686\n201762,175\n201763,994\n201764,58\n201765,46\n201766,179170\n201767,592\n201768,1572\n201769,1010\n201770,415\n201771,179170\n201772,1773\n201773,83\n201774,657\n201775,1238\n201776,22\n201777,1449\n201778,752\n201779,874\n201780,6068\n201781,1274\n201782,994\n201783,360\n201784,55849\n201785,1452\n201786,189128\n201787,3094\n201788,137\n201789,1769\n201790,280\n201790,17245\n201791,2923\n201792,575\n201793,1381\n201794,142426\n201795,35486\n201796,151\n201797,505\n201797,602\n201798,1769\n201799,1368\n201800,467\n201801,920\n201802,1132\n201803,781\n201804,850\n201805,1240\n201806,861\n201807,83\n201808,500\n201809,1052\n201810,1882\n201811,2775\n201812,54\n201813,1962\n201814,929\n201815,994\n201816,142473\n201817,302\n201818,13361\n201819,3695\n201820,83\n201821,1191\n201822,994\n201823,2590\n201824,2590\n201826,138686\n201827,54\n201828,175\n201829,217\n201830,422\n201831,278\n201832,422\n201833,422\n201834,422\n201835,422\n201836,994\n201837,422\n201838,422\n201840,422\n201841,1298\n201842,422\n201843,10\n201844,663\n201845,392\n201846,1118\n201847,328\n201848,55849\n201849,1381\n201850,850\n201851,389\n201851,874\n201852,704\n201853,2590\n201854,818\n201855,356\n201856,1001\n201857,304\n201858,55849\n201859,76096\n201860,1276\n201861,994\n201862,201863\n201864,932\n201865,1769\n201866,251\n201867,346\n201868,58\n201869,994\n201870,46\n201871,994\n201872,704\n201873,58\n201874,46\n201875,994\n201876,1769\n201877,1179\n201878,994\n201879,1479\n201880,1284\n201881,1769\n201882,1132\n201883,1608\n201884,1962\n201885,76096\n201887,1608\n201888,1132\n201889,76096\n201890,201891\n201892,392\n201892,697\n201893,200\n201894,76096\n201895,118\n201895,422\n201895,4597\n201895,5405\n201896,7092\n201897,1882\n201898,55849\n201899,1551\n201900,326\n201901,158\n201902,850\n201903,58\n201904,994\n201905,46\n201906,1381\n201907,48\n201907,340\n201907,649\n201908,179170\n201909,850\n201910,764\n201911,30\n201912,201913\n201914,14434\n201915,663\n201916,15609\n201917,392\n201918,994\n201919,46\n201920,58\n201921,366\n201922,63\n201922,252\n201922,516\n201923,850\n201924,252\n201925,673\n201926,200\n201927,850\n201928,1769\n201929,58\n201930,46\n201931,994\n201932,302\n201933,994\n201934,1769\n201935,217\n201936,1983\n201937,850\n201938,1298\n201939,390\n201940,1983\n201941,1983\n201942,406\n201943,850\n201944,843\n201945,557\n201947,287\n201948,615\n201949,455\n201950,415\n201951,142426\n201952,994\n201953,58\n201954,46\n201955,1381\n201956,1860\n201957,1858\n201958,515\n201959,314\n201960,1962\n201961,3999\n201962,83\n201963,2421\n201964,251\n201965,58\n201966,994\n201967,46\n201968,457\n201969,58\n201970,994\n201971,46\n201972,1769\n201973,861\n201974,179170\n201975,1181\n201976,805\n201977,79\n201978,179170\n201979,422\n201980,56\n201981,2373\n201982,179170\n201983,1240\n201984,4594\n201985,1449\n201986,581\n201987,1181\n201988,934\n201988,1449\n201989,1381\n201990,346\n201991,179170\n201992,779\n201993,1769\n201994,435\n201995,179170\n201996,179170\n201997,1769\n201998,328\n201999,68\n202000,151\n202001,147\n202002,56\n202003,422\n202004,179170\n202005,366\n202006,113156\n202007,366\n202008,366\n202009,366\n202010,366\n202011,366\n202012,34\n202012,35\n202012,83\n202013,83\n202014,366\n202015,366\n202016,298\n202017,485\n202018,1837\n202019,843\n202020,4611\n202022,1836\n202023,2572\n202024,918\n202025,1363\n202026,20\n202027,2296\n202028,8537\n202029,1769\n202030,179170\n202031,596\n202032,30\n202033,592\n202034,179170\n202035,179170\n202037,179170\n202038,141912\n202039,994\n202040,55849\n202041,1707\n202042,179170\n202043,779\n202044,217\n202044,536\n202044,1618\n202045,179170\n202046,366\n202047,278\n202048,179170\n202049,179170\n202050,113156\n202052,333\n202052,417\n202052,3041\n202052,15573\n202052,200767\n202053,202054\n202055,994\n202056,3538\n202057,326\n202058,145240\n202059,1769\n202060,1882\n202061,309\n202061,310\n202062,16196\n202063,30\n202064,8854\n202065,55849\n202066,192\n202067,1370\n202068,6119\n202069,3474\n202070,452\n202071,184\n202072,1247\n202072,164572\n202073,106\n202074,179170\n202075,1769\n202076,285\n202077,149534\n202078,250\n202078,1684\n202079,3999\n202080,3474\n202081,1058\n202082,1177\n202083,179170\n202084,1769\n202085,1769\n202086,251\n202087,179170\n202088,30\n202089,167\n202090,142405\n202091,1955\n202091,3135\n202093,784\n202094,30\n202095,179170\n202096,151\n202097,179170\n202098,1860\n202099,179170\n202101,1556\n202102,202103\n202102,249488\n202104,306\n202104,307\n202105,5906\n202106,557\n202107,278\n202108,626\n202109,137\n202110,862\n202111,179170\n202112,1419\n202113,536\n202114,83\n202115,588\n202115,590\n202116,217\n202117,2671\n202118,179170\n202119,3999\n202120,179170\n202121,422\n202122,56\n202123,30\n202124,302\n202124,406\n202124,420\n202124,1414\n202124,1466\n202125,179170\n202126,8270\n202127,179170\n202128,1858\n202129,1860\n202130,861\n202131,3\n202132,1860\n202133,1858\n202134,179170\n202135,2590\n202136,179170\n202137,3623\n202138,805\n202139,920\n202140,146\n202140,92476\n202141,179170\n202142,179170\n202143,1127\n202144,179170\n202145,1414\n202146,179170\n202147,2105\n202148,1531\n202149,1132\n202150,151\n202151,179170\n202152,179170\n202153,356\n202154,179170\n202155,861\n202156,251\n202157,302\n202158,779\n202159,289\n202159,290\n202159,94134\n202160,1257\n202161,8822\n202162,247\n202163,179170\n202164,673\n202165,179170\n202166,269\n202167,640\n202168,118\n202168,4597\n202169,872\n202170,30\n202171,663\n202172,79\n202173,179170\n202174,179170\n202175,313\n202176,179170\n202177,330\n202178,422\n202179,56\n202180,179170\n202181,179170\n202182,134\n202183,2048\n202184,292\n202185,179170\n202186,179170\n202187,151\n202188,920\n202189,663\n202190,202\n202191,179170\n202192,179170\n202193,2775\n202194,447\n202195,179170\n202196,179170\n202197,784\n202198,873\n202198,1243\n202199,973\n202199,1149\n202199,187960\n202200,179170\n202201,147\n202201,158\n202201,240174\n202202,179170\n202203,120\n202204,809\n202205,35\n202206,323\n202207,6638\n202208,285\n202209,179170\n202210,640\n202211,1085\n202212,595\n202213,30\n202214,83\n202214,278\n202215,56\n202215,577\n202216,179170\n202217,1010\n202218,179170\n202219,151\n202220,120\n202221,333\n202221,1893\n202222,179170\n202223,179170\n202224,420\n202225,179170\n202226,1893\n202227,1001\n202228,1467\n202229,455\n202230,2424\n202231,479\n202232,1871\n202233,1773\n202234,1849\n202235,179170\n202236,640\n202237,2421\n202238,83\n202239,13980\n202240,1294\n202241,202242\n202243,1821\n202243,21736\n202244,907\n202245,861\n202246,58\n202247,994\n202248,46\n202249,58\n202250,994\n202251,46\n202252,1769\n202254,202255\n202256,968\n202257,202258\n202259,323\n202260,355\n202261,202262\n202263,179170\n202265,366\n202266,366\n202267,366\n202268,366\n202269,366\n202270,366\n202271,202272\n202273,151\n202274,2590\n202275,1294\n202276,83\n202277,302\n202278,994\n202279,58\n202280,46\n202281,202282\n202283,202282\n202284,298\n202285,485\n202286,138686\n202287,175\n202288,497\n202289,1860\n202290,1858\n202291,1381\n202292,1858\n202293,1619\n202294,783\n202294,968\n202294,1160\n202295,179170\n202296,631\n202297,874\n202298,151\n202299,422\n202300,422\n202301,422\n202302,640\n202303,422\n202304,422\n202305,422\n202306,422\n202307,422\n202308,422\n202309,805\n202310,179170\n202311,422\n202312,536\n202313,1515\n202314,75912\n202315,1247\n202315,164572\n202316,298\n202317,485\n202318,79\n202319,1544\n202319,9457\n202320,8270\n202321,58\n202322,360\n202323,160\n202324,663\n202325,3003\n202326,202327\n202328,3623\n202329,579\n202330,1893\n202331,118\n202331,4597\n202332,500\n202333,1052\n202334,54\n202335,1882\n202336,2775\n202337,1962\n202338,1359\n202339,310\n202340,1381\n202341,87\n202342,83\n202343,217\n202344,298\n202345,485\n202346,1559\n202347,1773\n202348,120\n202349,693\n202350,611\n202351,640\n202352,1132\n202353,1608\n202354,58\n202355,46\n202356,994\n202357,485\n202358,298\n202359,179170\n202360,292\n202361,99\n202362,179170\n202363,240\n202364,30\n202365,875\n202366,44\n202367,60576\n202368,1113\n202369,1707\n202370,58\n202371,994\n202372,46\n202373,202374\n202375,485\n202376,298\n202377,467\n202378,920\n202379,694\n202380,920\n202381,392\n202382,510\n202383,202384\n202385,60576\n202386,1147\n202386,1381\n202387,447\n202388,2775\n202389,516\n202390,1220\n202390,1222\n202391,252\n202392,2266\n202393,609\n202394,3653\n202395,1381\n202396,2775\n202397,447\n202398,60576\n202399,35750\n202399,35751\n202400,872\n202401,467\n202402,255\n202403,22293\n202404,694\n202405,433\n202406,60576\n202407,137\n202408,195\n202409,247\n202409,2867\n202409,2868\n202410,1381\n202411,1381\n202412,178\n202413,1467\n202414,30\n202415,1891\n202416,30\n202417,30331\n202418,3623\n202419,1238\n202420,206\n202421,138686\n202422,175\n202423,15609\n202424,142473\n202425,1452\n202426,30\n202427,202428\n202429,1860\n202430,1858\n202431,1381\n202432,58\n202433,994\n202434,46\n202435,1860\n202436,1858\n202437,3623\n202438,1052\n202439,500\n202440,1962\n202441,54\n202442,1882\n202443,2775\n202444,752\n202445,500\n202446,2775\n202447,1052\n202448,1962\n202449,54\n202450,1882\n202451,433\n202452,287\n202453,60576\n202454,58\n202455,994\n202456,46\n202457,1381\n202458,697\n202458,1769\n202459,46\n202460,58\n202461,994\n202462,120\n202463,433\n202464,83\n202465,577\n202466,299\n202467,149\n202468,387\n202469,366\n202470,366\n202471,3328\n202472,3467\n202473,452\n202474,1247\n202474,164572\n202475,184\n202476,1590\n202477,99\n202478,269\n202479,30\n202480,718\n202481,160\n202483,5718\n202484,151\n202484,602\n202484,6556\n202484,144556\n202484,164572\n202485,1147\n202486,3623\n202487,6303\n202488,467\n202489,202490\n202491,58\n202492,46\n202493,994\n202494,79\n202495,919\n202496,301\n202496,406\n202497,516\n202498,360\n202499,46\n202500,3623\n202501,3623\n202502,1381\n202503,2334\n202504,588\n202504,590\n202505,55849\n202506,875\n202507,338\n202507,1058\n202507,4039\n202508,13980\n202509,442\n202510,189128\n202511,775\n202512,179170\n202513,3623\n202514,2590\n202515,302\n202516,269\n202517,2443\n202518,918\n202519,275\n202520,58\n202521,179170\n202522,861\n202523,179170\n202524,2443\n202525,3623\n202526,179170\n202527,151\n202528,79\n202529,302\n202530,861\n202531,58\n202532,994\n202533,46\n202534,3623\n202535,58\n202536,46\n202537,994\n202538,179170\n202539,2443\n202540,1769\n202540,1893\n202541,473\n202541,2353\n202542,63\n202542,2116\n202543,8270\n202544,142409\n202544,146280\n202544,159365\n202545,79\n202546,79\n202546,1544\n202547,663\n202548,2443\n202549,697\n202550,79\n202551,1773\n202552,1133\n202553,994\n202554,46\n202555,58\n202556,1181\n202557,1381\n202558,784\n202559,1\n202560,3623\n202561,760\n202561,1631\n202562,358\n202563,179170\n202564,1181\n202565,3623\n202566,3623\n202567,1181\n202568,189128\n202569,389\n202570,392\n202571,273\n202572,852\n202573,30\n202575,72\n202576,217\n202576,1118\n202576,1204\n202577,1181\n202578,2443\n202579,30\n202580,1181\n202581,179170\n202582,5987\n202583,179170\n202584,179170\n202585,179170\n202586,1860\n202587,1858\n202588,142426\n202589,433\n202590,302\n202591,179170\n202592,1556\n202593,217\n202594,406\n202594,872\n202594,1033\n202594,1118\n202594,8811\n202595,356\n202596,202\n202597,1010\n202597,1572\n202598,83\n202599,843\n202600,138\n202601,60576\n202602,673\n202603,30\n202604,60576\n202605,179170\n202606,179170\n202607,155481\n202608,217\n202609,1467\n202610,86\n202611,179170\n202612,179170\n202613,240\n202614,151\n202615,366\n202616,314\n202616,392\n202617,663\n202618,1058\n202619,179170\n202620,19010\n202621,1807\n202622,179170\n202623,217\n202623,2421\n202623,2979\n202623,6789\n202624,179170\n202625,515\n202626,179170\n202627,893\n202628,179170\n202629,850\n202630,179170\n202631,7416\n202632,1860\n202633,1858\n202634,179170\n202636,30\n202637,4453\n202638,1551\n202639,4549\n202640,515\n202641,192\n202642,417\n202643,7572\n202644,586\n202645,973\n202646,1590\n202647,8798\n202648,861\n202649,626\n202650,622\n202651,255\n202652,1188\n202653,83\n202654,1381\n202655,179170\n202656,302\n202657,113156\n202658,875\n202659,247\n202660,1707\n202661,240\n202661,8541\n202662,202663\n202664,808\n202665,1556\n202666,179170\n202667,178\n202668,202669\n202670,1227\n202670,86416\n202671,4594\n202672,483\n202673,179170\n202674,147\n202675,1590\n202676,3623\n202677,994\n202678,63\n202679,179170\n202680,1881\n202681,875\n202682,852\n202683,435\n202684,1509\n202685,875\n202686,202687\n202688,389\n202689,138686\n202690,142473\n202691,179170\n202692,30\n202693,1235\n202693,1335\n202694,83\n202695,843\n202696,433\n202697,1274\n202698,264\n202699,994\n202700,994\n202701,179170\n202702,151\n202703,179170\n202704,994\n202705,406\n202705,779\n202706,261\n202707,179170\n202708,3623\n202709,328\n202710,3804\n202711,278\n202712,111\n202712,1181\n202713,273\n202714,179170\n202715,179170\n202716,330\n202717,179170\n202718,1631\n202719,179170\n202720,202721\n202722,202723\n202724,79\n202725,179170\n202726,179170\n202727,86\n202727,301\n202727,615\n202727,907\n202727,973\n202727,1001\n202727,1241\n202727,1284\n202727,1522\n202727,1782\n202727,1955\n202727,2083\n202727,2557\n202727,2979\n202728,179170\n202729,563\n202730,179170\n202731,179170\n202732,1983\n202733,179170\n202734,179170\n202735,179170\n202736,30\n202737,189788\n202738,179170\n202739,795\n202740,179170\n202741,1\n202742,861\n202743,179170\n202744,179170\n202745,1257\n202746,626\n202747,30\n202748,557\n202749,435\n202750,862\n202751,1707\n202752,179170\n202753,179170\n202754,1072\n202755,179170\n202756,179170\n202757,143128\n202758,809\n202759,179170\n202760,79\n202761,1882\n202762,1082\n202763,147\n202764,760\n202765,142430\n202766,346\n202767,1240\n202767,1465\n202768,179170\n202769,72\n202770,1298\n202770,1893\n202771,843\n202772,500\n202773,1052\n202774,1882\n202775,54\n202776,2775\n202777,1962\n202778,179170\n202779,179170\n202780,179170\n202781,30331\n202782,179170\n202783,2735\n202784,422\n202785,56\n202786,873\n202786,1058\n202786,1243\n202787,179170\n202788,859\n202789,1381\n202790,493\n202791,202792\n202793,179170\n202794,56\n202795,422\n202796,146280\n202796,159365\n202797,250\n202797,1684\n202798,285\n202799,179170\n202800,179170\n202801,4604\n202802,179170\n202803,500\n202804,54\n202805,1052\n202806,1882\n202807,2775\n202808,1962\n202809,2923\n202810,56\n202811,422\n202812,360\n202813,406\n202814,179170\n202815,179170\n202816,179170\n202817,179170\n202818,8270\n202819,994\n202820,179170\n202821,179170\n202822,179170\n202823,179170\n202824,1860\n202825,1858\n202826,360\n202827,179170\n202828,179170\n202829,179170\n202830,3623\n202831,179170\n202832,1379\n202833,994\n202834,1381\n202835,179170\n202836,3623\n202838,83\n202839,298\n202840,179170\n202841,3209\n202842,72\n202843,179170\n202844,2373\n202845,273\n202846,179170\n202847,516\n202848,179170\n202849,10\n202850,179170\n202851,179170\n202852,179170\n202853,202854\n202855,65\n202856,663\n202857,563\n202858,557\n202859,269\n202860,406\n202861,50\n202861,99\n202862,83\n202863,527\n202864,179170\n202865,285\n202866,30\n202867,179170\n202868,30\n202869,179170\n202870,179170\n202871,6424\n202872,56\n202873,422\n202874,4548\n202875,56\n202876,422\n202877,79\n202878,779\n202879,179170\n202880,1326\n202881,102\n202882,1323\n202883,408\n202884,267\n202885,83\n202886,202887\n202888,1010\n202889,58\n202890,994\n202891,46\n202892,171\n202893,285\n202894,2620\n202895,202896\n202897,179170\n202898,179170\n202899,30\n202900,1235\n202900,1335\n202901,179170\n202902,202903\n202904,113156\n202905,862\n202905,1001\n202905,1474\n202906,179170\n202907,179170\n202908,424\n202909,118\n202909,4597\n202910,663\n202911,179170\n202912,179170\n202913,900\n202914,3367\n202915,167\n202915,299\n202915,73570\n202916,485\n202917,298\n202918,151\n202919,222\n202919,18831\n202921,179170\n202922,179170\n202923,818\n202924,179170\n202925,1551\n202926,697\n202927,179170\n202928,356\n202929,158\n202930,179170\n202931,2073\n202932,56\n202933,422\n202934,1181\n202934,1381\n202935,366\n202936,366\n202937,1579\n202937,4604\n202938,366\n202939,366\n202940,366\n202941,273\n202942,3003\n202943,333\n202943,337\n202944,179170\n202945,340\n202946,861\n202947,3623\n202948,1247\n202948,164572\n202950,433\n202951,179170\n202952,200\n202952,225\n202954,953\n202955,179170\n202956,872\n202957,1659\n202958,640\n202959,3623\n202961,1707\n202962,2812\n202963,1326\n202964,360\n202964,697\n202964,1769\n202965,179170\n202966,1773\n202967,1411\n202968,44\n202969,179170\n202970,687\n202971,30\n202972,422\n202973,422\n202974,422\n202975,3623\n202976,422\n202977,422\n202978,30\n202979,179170\n202980,422\n202981,124668\n202982,422\n202983,56\n202984,422\n202985,422\n202986,422\n202987,422\n202988,422\n202989,422\n202990,422\n202991,422\n202992,527\n202993,907\n202994,818\n202995,118\n202995,4597\n202996,252\n202996,215276\n202997,657\n202998,7757\n202999,640\n203000,56\n203001,422\n203002,422\n203003,3623\n203004,269\n203005,255\n203006,1556\n203007,203008\n203009,1113\n203010,312\n203010,509\n203010,510\n203011,1381\n203012,158\n203012,663\n203013,447\n203014,179170\n203015,30\n203015,1179\n203016,2775\n203017,447\n203018,179170\n203019,1227\n203019,86416\n203020,1289\n203021,459\n203021,571\n203021,5405\n203022,326\n203023,3623\n203024,179170\n203025,211\n203026,83\n203027,167\n203027,217\n203027,289\n203027,290\n203027,346\n203027,435\n203027,455\n203027,586\n203027,631\n203027,657\n203027,1019\n203027,1210\n203027,1294\n203027,1467\n203027,1531\n203027,1871\n203027,2266\n203027,5976\n203027,6119\n203027,6424\n203027,94134\n203028,81\n203029,1012\n203030,1381\n203031,1033\n203032,1118\n203033,30\n203034,455\n203035,3094\n203036,1274\n203037,48\n203038,425\n203038,1544\n203039,8180\n203040,3623\n203041,704\n203042,200\n203043,328\n203044,1238\n203045,3623\n203046,264\n203047,3623\n203048,3623\n203049,628\n203050,3623\n203051,97\n203051,269\n203052,425\n203053,425\n203054,1452\n203055,1220\n203055,1222\n203056,50\n203057,1860\n203058,1858\n203059,9343\n203060,138686\n203061,175\n203062,2671\n203063,925\n203064,56\n203065,422\n203066,360\n203067,3623\n203068,1132\n203069,781\n203070,273\n203071,1381\n203072,163\n203073,142426\n203074,217\n203075,79\n203076,134\n203077,50\n203078,425\n203079,795\n203080,781\n203081,1132\n203082,1707\n203083,259\n203084,1220\n203084,1222\n203085,134\n203086,3003\n203087,994\n203089,6556\n203090,360\n203091,79\n203092,79\n203093,360\n203094,41\n203095,217\n203095,301\n203095,631\n203095,1010\n203095,1085\n203096,781\n203097,1132\n203098,1608\n203099,1132\n203100,1381\n203101,167\n203101,73570\n203102,3653\n203103,781\n203104,1132\n203105,1\n203106,83\n203107,3207\n203108,4611\n203109,60576\n203110,422\n203111,56\n203112,473\n203113,809\n203114,510\n203114,1436\n203114,1579\n203115,843\n203116,1912\n203117,972\n203117,1559\n203118,891\n203119,850\n203120,3297\n203121,179170\n203122,187\n203123,1132\n203124,1608\n203125,852\n203126,919\n203127,60576\n203128,104\n203129,406\n203130,703\n203131,81070\n203132,557\n203133,206\n203134,85241\n203135,1240\n203136,1117\n203137,805\n203138,581\n203139,805\n203140,149\n203141,3623\n203142,346\n203143,302\n203144,372\n203146,79\n203147,500\n203148,1052\n203149,1882\n203150,54\n203151,2775\n203152,1962\n203153,30\n203154,1118\n203155,515\n203156,1858\n203157,1860\n203158,805\n203159,142433\n203160,179170\n203161,500\n203162,54\n203163,1052\n203164,1882\n203165,2775\n203166,1962\n203167,1579\n203168,1298\n203168,1749\n203168,6556\n203168,232766\n203169,1118\n203169,1566\n203169,6837\n203170,179170\n203171,781\n203172,1132\n203173,1113\n203174,68\n203174,356\n203174,1119\n203175,79\n203176,179170\n203177,72\n203178,934\n203179,3623\n203180,1381\n203181,1381\n203182,500\n203183,1882\n203184,1052\n203185,2775\n203186,1962\n203187,54\n203188,179170\n203189,135\n203190,250\n203190,1684\n203191,356\n203192,142426\n203194,479\n203194,1893\n203195,79\n203197,918\n203201,179170\n203202,189303\n203203,79\n203204,360\n203205,179170\n203206,83\n203207,452\n203208,676\n203209,1655\n203210,255\n203211,151\n203212,457\n203213,366\n203215,1370\n203216,1052\n203217,1962\n203218,1882\n203219,54\n203220,2775\n203221,500\n203222,179170\n203223,179170\n203224,72\n203225,3623\n203226,497\n203227,179170\n203228,163\n203229,5358\n203229,14352\n203230,1262\n203231,3623\n203232,3623\n203233,179170\n203234,920\n203235,467\n203236,1544\n203237,4611\n203238,83\n203239,14483\n203240,179170\n203241,1353\n203242,252\n203243,179170\n203244,83\n203245,179170\n203246,83\n203246,1881\n203247,536\n203248,179170\n203249,1085\n203250,179170\n203251,72\n203252,179170\n203253,1955\n203254,202\n203255,714\n203256,179170\n203257,1381\n203258,424\n203259,366\n203260,366\n203261,55849\n203262,1882\n203263,500\n203264,1052\n203265,2775\n203266,54\n203267,1962\n203268,2617\n203269,425\n203270,203271\n203272,875\n203273,138686\n203274,9457\n203277,179170\n203278,55849\n203279,973\n203280,811\n203281,118\n203281,4597\n203283,17245\n203284,6487\n203285,330\n203285,406\n203285,1001\n203285,1235\n203285,1335\n203285,1381\n203285,1392\n203286,7416\n203287,269\n203288,1227\n203288,86416\n203289,781\n203290,1132\n203291,949\n203292,5101\n203293,203294\n203296,151\n203297,1556\n203298,1227\n203298,86416\n203299,79\n203300,179170\n203301,81\n203302,179170\n203303,2373\n203304,3182\n203305,137\n203306,118\n203306,4597\n203307,138\n203308,865\n203309,557\n203310,137\n203311,118\n203311,4597\n203312,301\n203313,88820\n203314,557\n203315,179170\n203316,843\n203317,779\n203318,417\n203319,515\n203320,8798\n203321,285\n203322,250\n203322,1684\n203323,332\n203324,1087\n203325,1419\n203326,2620\n203327,285\n203328,250\n203328,1684\n203329,424\n203330,285\n203331,250\n203331,1684\n203332,500\n203333,1052\n203334,54\n203335,1882\n203336,2775\n203337,1962\n203338,1467\n203339,278\n203340,83\n203341,151\n203342,1019\n203343,217\n203344,536\n203345,13\n203346,455\n203346,779\n203346,872\n203346,1019\n203346,2671\n203347,179170\n203348,1608\n203349,1132\n203350,8270\n203351,138686\n203352,175\n203353,994\n203354,994\n203355,1078\n203356,179170\n203357,10\n203357,994\n203358,151\n203359,843\n203360,83\n203361,179170\n203363,1381\n203364,32\n203365,203366\n203367,179170\n203368,485\n203369,298\n203370,1323\n203371,408\n203372,1326\n203373,102\n203374,137\n203375,179170\n203376,30\n203377,2367\n203378,2367\n203379,2367\n203380,179170\n203381,30\n203382,179170\n203383,179170\n203384,489\n203385,1007\n203386,1007\n203387,130\n203388,179170\n203389,827\n203390,30\n203391,795\n203392,611\n203393,179170\n203394,406\n203395,179170\n203396,179170\n203397,269\n203398,779\n203399,2312\n203400,704\n203401,247\n203402,483\n203403,179170\n203404,179170\n203405,283\n203407,1033\n203408,203409\n203410,179170\n203411,179170\n203412,225\n203413,203414\n203415,151\n203416,8270\n203417,1639\n203418,968\n203419,644\n203420,3724\n203421,167\n203422,602\n203423,1019\n203424,65809\n203425,647\n203426,1016\n203427,1001\n203428,2088\n203428,154690\n203429,697\n203430,202\n203431,872\n203432,467\n203433,302\n203434,1127\n203435,312\n203436,9010\n203437,3161\n203438,203439\n203440,440\n203441,1590\n203442,1955\n203443,8884\n203444,652\n203445,275\n203446,2528\n203447,355\n203448,203449\n203450,203449\n203451,1807\n203452,862\n203453,1715\n203454,203455\n203456,973\n203457,1796\n203458,1085\n203459,87\n203460,203461\n203462,72\n203463,1140\n203464,1522\n203465,4\n203465,5\n203466,1019\n203467,2557\n203468,740\n203468,741\n203469,203470\n203471,1227\n203471,86416\n203472,861\n203473,704\n203474,1644\n203475,1282\n203476,83\n203477,2421\n203478,835\n203479,326\n203480,408\n203481,3\n203483,58\n203484,203485\n203484,257504\n203486,1454\n203487,192\n203488,1509\n203489,980\n203490,1132\n203491,30\n203492,1836\n203493,355\n203494,366\n203495,37088\n203496,2073\n203497,2567\n203498,447\n203499,535\n203500,422\n203501,56\n203502,83\n203503,5540\n203504,435\n203505,3\n203506,1659\n203507,1623\n203508,393\n203509,179170\n203510,366\n203511,366\n203512,366\n203513,366\n203514,1722\n203515,781\n203516,1132\n203517,8991\n203518,24505\n203519,8270\n203520,872\n203521,120\n203522,2244\n203523,571\n203524,1132\n203525,781\n203526,83\n203527,1007\n203528,1052\n203529,54\n203530,1962\n203531,2775\n203532,1882\n203533,500\n203534,1274\n203535,1345\n203536,1132\n203537,781\n203538,932\n203539,13745\n203540,175\n203541,781\n203542,1132\n203543,203544\n203545,179170\n203546,203547\n203548,1132\n203549,781\n203550,1381\n203551,781\n203552,1132\n203553,918\n203554,179170\n203555,360\n203556,527\n203556,743\n203556,8714\n203557,652\n203558,704\n203559,360\n203560,1381\n203561,516\n203562,252\n203563,1220\n203563,1222\n203564,158\n203565,104\n203566,1284\n203567,141912\n203568,203569\n203570,1769\n203571,366\n203572,179170\n203573,179170\n203574,179170\n203575,4260\n203576,872\n203577,192\n203578,718\n203579,203580\n203581,118\n203581,4597\n203582,1085\n203583,179170\n203584,285\n203585,16153\n203586,536\n203587,30\n203588,500\n203589,1052\n203590,54\n203591,1882\n203592,2775\n203593,1962\n203594,4571\n203596,55077\n203597,483\n203598,1332\n203599,4355\n203600,1479\n203601,390\n203602,779\n203603,30\n203604,1132\n203605,781\n203606,2048\n203607,1235\n203607,1335\n203608,1677\n203609,433\n203610,500\n203611,54\n203612,1052\n203613,1882\n203614,2775\n203615,1962\n203616,1359\n203617,500\n203618,1052\n203619,1962\n203620,54\n203621,1882\n203622,2775\n203623,30\n203624,861\n203625,179170\n203626,137\n203627,179170\n203628,179170\n203629,203630\n203631,203632\n203633,179170\n203634,240\n203635,366\n203636,366\n203637,366\n203638,366\n203639,366\n203640,366\n203641,366\n203642,203643\n203644,861\n203645,433\n203646,203647\n203648,175\n203648,16196\n203649,10\n203650,10\n203651,119\n203652,3623\n203653,850\n203655,779\n203656,143\n203657,422\n203658,1284\n203659,147\n203661,2244\n203662,726\n203663,328\n203664,1773\n203665,355\n203666,285\n203667,107\n203668,2416\n203668,2417\n203669,292\n203670,338\n203671,298\n203672,1133\n203673,3538\n203674,203675\n203676,203675\n203677,203678\n203679,1132\n203680,781\n203681,203682\n203683,203684\n203685,124668\n203686,44\n203687,1087\n203688,622\n203689,21442\n203690,4810\n203692,203693\n203694,35\n203695,968\n203696,932\n203697,203698\n203699,666\n203699,142430\n203700,142473\n203701,516\n203702,252\n203703,1220\n203703,1222\n203704,209\n203704,811\n203704,861\n203705,779\n203706,30\n203708,203709\n203710,203711\n203712,142433\n203713,310\n203714,422\n203715,56\n203716,72\n203717,179170\n203718,447\n203719,2775\n203720,301\n203721,14434\n203722,179170\n203723,179170\n203724,2367\n203725,994\n203726,994\n203727,179170\n203728,2266\n203729,145751\n203730,269\n203731,779\n203732,622\n203733,203734\n203735,175\n203736,203737\n203738,179170\n203740,179170\n203741,179170\n203742,179170\n203743,202\n203744,55849\n203745,483\n203746,1454\n203747,151\n203748,714\n203749,485\n203750,298\n203751,3\n203752,310\n203753,781\n203754,1132\n203755,252\n203756,516\n203757,1220\n203757,1222\n203758,142473\n203759,657\n203760,273\n203761,179170\n203762,818\n203763,179170\n203766,146\n203766,92476\n203767,344\n203768,647\n203769,203770\n203771,138686\n203772,175\n203773,30\n203774,106\n203775,30\n203776,1085\n203778,119\n203779,809\n203780,203781\n203782,1087\n203783,557\n203784,557\n203785,557\n203786,48\n203787,2506\n203788,872\n203789,872\n203790,919\n203791,30\n203792,30\n203793,83\n203793,259\n203794,1227\n203794,86416\n203795,30\n203796,1359\n203797,30\n203798,1607\n203799,200\n203800,126\n203801,298\n203802,1860\n203803,1858\n203804,596\n203805,1359\n203806,145240\n203807,422\n203808,56\n203809,104\n203810,577\n203811,302\n203812,283\n203813,433\n203814,485\n203815,298\n203816,16153\n203817,422\n203818,56\n203819,538\n203820,485\n203821,298\n203822,87\n203822,1465\n203822,2812\n203822,5366\n203822,9098\n203823,3623\n203824,4039\n203825,1603\n203826,142473\n203827,579\n203828,1773\n203829,16153\n203830,1370\n203831,30\n203832,5265\n203833,179170\n203834,779\n203835,179170\n203836,9030\n203837,102\n203838,1326\n203839,1323\n203840,408\n203842,30\n203843,3297\n203844,179170\n203845,10\n203846,3804\n203847,302\n203847,2116\n203848,285\n203849,179170\n203850,2590\n203851,179170\n203852,179170\n203853,340\n203854,1\n203855,203856\n203857,179170\n203858,240\n203859,4222\n203860,841\n203861,10\n203861,54284\n203862,30\n203863,1773\n203864,1453\n203865,292\n203866,247\n203867,294\n203868,296\n203869,298\n203870,203871\n203872,203873\n203874,179170\n203875,861\n203876,455\n203877,885\n203877,13704\n203878,68\n203879,355\n203880,179170\n203881,1836\n203882,179170\n203884,389\n203884,874\n203885,289\n203885,290\n203885,94134\n203886,99\n203887,138686\n203888,175\n203889,731\n203890,217\n203890,1417\n203891,278\n203892,151\n203893,302\n203895,980\n203896,55849\n203897,79\n203898,330\n203899,76096\n203900,1072\n203901,192\n203902,203903\n203904,179170\n203905,83\n203906,222\n203906,13661\n203907,48\n203908,1639\n203909,467\n203910,79\n203911,805\n203912,119\n203913,422\n203914,422\n203915,422\n203916,422\n203917,422\n203918,422\n203919,422\n203920,393\n203921,422\n203922,422\n203923,422\n203924,422\n203925,422\n203926,389\n203927,439\n203928,640\n203929,647\n203930,146\n203930,92476\n203931,344\n203932,640\n203933,640\n203934,640\n203935,142426\n203935,145751\n203936,1224\n203937,2286\n203938,2989\n203938,2991\n203939,299\n203940,3830\n203941,179170\n203942,447\n203943,2775\n203944,1\n203945,433\n203946,1381\n203947,704\n203949,273\n203950,44\n203951,187\n203952,868\n203952,15573\n203953,805\n203954,272\n203954,439\n203954,563\n203954,980\n203954,2367\n203954,15573\n203955,920\n203956,406\n203957,467\n203958,736\n203959,1238\n203960,1551\n203961,83\n203962,1140\n203963,1452\n203964,151\n203965,50\n203966,203967\n203968,1436\n203969,179170\n203970,179170\n203971,56\n203972,179170\n203973,622\n203974,1118\n203975,56\n203976,422\n203977,671\n203978,30\n203978,622\n203979,1240\n203980,240\n203980,631\n203980,714\n203980,760\n203980,2416\n203980,2417\n203981,457\n203983,202\n203985,202\n203986,1284\n203987,1955\n203988,447\n203989,2775\n203990,1749\n203991,137\n203992,200\n203993,500\n203994,2775\n203995,1052\n203996,54\n203997,1962\n203998,1882\n203999,1381\n204000,292\n204001,179170\n204002,1243\n204003,1927\n204004,1882\n204005,179170\n204006,349\n204007,2436\n204008,2775\n204009,1052\n204010,1962\n204011,54\n204012,1882\n204013,500\n204014,104\n204015,920\n204016,2334\n204017,1858\n204018,1860\n204019,301\n204019,2557\n204020,179170\n204021,1127\n204021,49057\n204022,120\n204023,2620\n204024,602\n204024,652\n204025,1132\n204026,781\n204027,179170\n204028,447\n204029,2775\n204030,1363\n204031,424\n204032,805\n204033,1294\n204034,3623\n204035,3623\n204036,3623\n204037,3623\n204038,1007\n204039,206\n204040,1381\n204041,120\n204041,148742\n204042,179170\n204043,58\n204044,994\n204045,46\n204046,333\n204047,1007\n204049,192\n204050,477\n204051,179170\n204053,179170\n204054,510\n204055,781\n204056,1132\n204057,1722\n204058,280\n204058,17245\n204059,602\n204060,1132\n204061,781\n204062,217\n204063,30\n204064,1167\n204065,30\n204066,328\n204067,50\n204068,493\n204068,1266\n204069,577\n204070,4260\n204071,493\n204072,1087\n204073,918\n204074,589\n204075,307\n204075,6068\n204077,424\n204078,3177\n204080,1118\n204081,4611\n204082,1544\n204083,868\n204084,1118\n204085,179170\n204086,10\n204087,264\n204088,192\n204089,1707\n204090,1603\n204091,3474\n204092,204093\n204093,397\n204093,911\n204093,1191\n204093,1204\n204093,21592\n204093,65854\n204093,204092\n204093,204510\n204093,204573\n204093,205230\n204093,205262\n204093,207264\n204093,213029\n204093,213053\n204093,214091\n204093,214096\n204093,214164\n204093,215238\n204093,215741\n204093,216725\n204093,216729\n204093,216775\n204093,239879\n204093,244077\n204093,244248\n204093,244604\n204093,263939\n204094,204095\n204096,1531\n204097,483\n204098,167\n204098,73570\n204099,1085\n204100,204101\n204102,179170\n204103,149\n204103,302\n204103,21442\n204104,83\n204105,1007\n204106,179170\n204107,611\n204108,179170\n204109,7092\n204110,994\n204111,138686\n204112,175\n204113,843\n204114,179170\n204115,602\n204116,1381\n204117,30\n204118,731\n204119,302\n204119,447\n204119,1294\n204119,2116\n204120,577\n204122,83\n204123,269\n204124,56\n204124,146\n204124,175\n204124,192\n204124,195\n204124,333\n204124,422\n204124,841\n204124,1089\n204124,1619\n204124,1623\n204124,2217\n204124,5265\n204124,18997\n204124,22616\n204124,23783\n204124,60576\n204124,92476\n204124,141912\n204124,215231\n204124,215270\n204124,237564\n204124,257042\n204124,262509\n204125,1707\n204126,145240\n204127,485\n204128,298\n204129,272\n204130,968\n204131,179170\n204132,515\n204133,1118\n204134,843\n204135,360\n204136,127158\n204137,775\n204138,179170\n204139,179170\n204140,718\n204141,192\n204142,515\n204143,808\n204144,179170\n204145,2045\n204145,29253\n204146,179170\n204147,175\n204148,1370\n204149,179170\n204150,850\n204151,1544\n204152,4611\n204153,1370\n204154,65\n204155,179170\n204156,179170\n204157,1608\n204158,1132\n204160,195\n204161,1631\n204162,4611\n204163,1544\n204164,55849\n204165,657\n204166,893\n204167,179170\n204168,179170\n204169,718\n204171,1608\n204172,1012\n204173,3623\n204174,179170\n204175,704\n204176,356\n204176,5591\n204177,179170\n204178,1556\n204179,151\n204180,179170\n204181,1127\n204182,1227\n204182,86416\n204183,563\n204184,422\n204185,56\n204186,215\n204187,179170\n204188,920\n204189,179170\n204190,179170\n204191,179170\n204192,179170\n204193,179170\n204194,500\n204195,54\n204196,1052\n204197,1882\n204198,2775\n204199,1962\n204200,179170\n204201,596\n204202,636\n204203,140\n204204,217\n204205,179170\n204206,179170\n204207,682\n204207,72439\n204208,323\n204209,1359\n204210,10\n204211,717\n204212,179170\n204213,204214\n204215,147\n204215,80266\n204216,48\n204217,2750\n204218,875\n204219,875\n204220,158\n204220,192\n204221,179170\n204222,349\n204223,179170\n204224,1132\n204225,781\n204226,1608\n204227,147\n204227,118336\n204228,344\n204229,2373\n204230,30\n204231,179170\n204232,179170\n204233,1458\n204234,215\n204235,141912\n204236,1012\n204237,309\n204237,310\n204238,10\n204238,113156\n204239,611\n204239,801\n204239,1070\n204239,1782\n204240,3623\n204241,2867\n204241,2868\n204242,200\n204243,99\n204244,1844\n204245,500\n204246,54\n204247,1052\n204248,1882\n204249,2775\n204250,1962\n204251,3623\n204252,493\n204252,622\n204253,68\n204254,3260\n204255,72\n204257,30\n204258,247\n204259,34\n204259,35\n204259,657\n204259,13137\n204259,13661\n204260,83\n204261,781\n204262,1132\n204263,750\n204264,994\n204265,1881\n204266,255\n204267,72\n204268,149\n204269,1151\n204269,1572\n204270,422\n204271,179170\n204272,269\n204273,247\n204274,179170\n204275,1220\n204275,1222\n204276,516\n204277,252\n204278,1608\n204279,1132\n204280,34\n204280,35\n204280,37\n204280,44\n204280,50\n204280,58\n204280,59\n204280,79\n204280,104\n204280,106\n204280,111\n204280,116\n204280,135\n204280,147\n204280,178\n204280,195\n204280,202\n204280,217\n204280,264\n204280,278\n204280,289\n204280,290\n204280,301\n204280,333\n204280,337\n204280,372\n204280,393\n204280,406\n204280,479\n204280,493\n204280,516\n204280,577\n204280,585\n204280,588\n204280,590\n204280,592\n204280,620\n204280,622\n204280,628\n204280,631\n204280,640\n204280,720\n204280,779\n204280,872\n204280,877\n204280,907\n204280,949\n204280,994\n204280,1007\n204280,1010\n204280,1033\n204280,1078\n204280,1085\n204280,1132\n204280,1151\n204280,1210\n204280,1212\n204280,1247\n204280,1265\n204280,1266\n204280,1284\n204280,1370\n204280,1381\n204280,1453\n204280,1454\n204280,1509\n204280,1515\n204280,1522\n204280,1531\n204280,1634\n204280,1659\n204280,1732\n204280,1776\n204280,1893\n204280,2051\n204280,2073\n204280,2087\n204280,2191\n204280,2371\n204280,2782\n204280,2931\n204280,3194\n204280,3422\n204280,3695\n204280,3794\n204280,4079\n204280,4192\n204280,4193\n204280,5265\n204280,5310\n204280,5440\n204280,5708\n204280,8180\n204280,8270\n204280,8308\n204280,8598\n204280,8788\n204280,8811\n204280,8822\n204280,8907\n204280,9542\n204280,31237\n204280,44244\n204280,94134\n204280,164572\n204281,1522\n204282,1381\n204283,1608\n204284,179170\n204285,30\n204286,30\n204287,1773\n204288,1132\n204289,1608\n204290,433\n204291,68069\n204292,204293\n204294,366\n204295,1858\n204296,1860\n204297,4237\n204297,182162\n204298,102\n204299,1323\n204300,1326\n204301,408\n204302,1465\n204303,330\n204303,1571\n204304,138686\n204305,175\n204306,20790\n204307,366\n204308,247\n204309,1298\n204310,30\n204311,994\n204312,83\n204312,217\n204312,222\n204312,1274\n204312,2646\n204313,8270\n204314,1\n204315,8854\n204316,189128\n204317,167\n204318,389\n204318,874\n204319,292\n204320,8822\n204321,862\n204322,179170\n204323,2735\n204324,56\n204325,422\n204326,250\n204326,1684\n204327,1511\n204327,3069\n204328,203470\n204329,330\n204330,192\n204330,195\n204331,862\n204332,1474\n204333,2775\n204334,447\n204335,861\n204336,1255\n204336,50943\n204337,217\n204338,577\n204339,1849\n204340,3218\n204341,179170\n204342,179170\n204343,1353\n204344,640\n204345,3297\n204346,269\n204347,7155\n204348,843\n204349,1458\n204350,346\n204351,493\n204352,389\n204353,1572\n204354,7\n204354,861\n204355,202\n204356,3297\n204357,657\n204358,2411\n204359,83\n204360,9026\n204361,294\n204362,217\n204362,1417\n204363,299\n204364,536\n204365,1801\n204366,1179\n204366,1305\n204366,2701\n204367,179170\n204368,424\n204369,920\n204370,179170\n204371,309\n204371,310\n204372,179170\n204373,179170\n204374,32475\n204374,264888\n204375,2266\n204376,1118\n204377,179170\n204378,179170\n204379,7416\n204380,301\n204381,431\n204381,589\n204381,631\n204381,1001\n204381,2590\n204382,179170\n204384,2353\n204385,179170\n204386,30\n204387,179170\n204388,192\n204389,179170\n204390,179170\n204391,179170\n204392,1634\n204393,179170\n204394,179170\n204395,179170\n204396,861\n204397,179170\n204398,4545\n204399,179170\n204400,280\n204400,17245\n204401,953\n204402,285\n204403,328\n204404,1298\n204405,179170\n204406,179170\n204407,10\n204408,2266\n204409,4571\n204410,366\n204411,366\n204412,30331\n204413,107\n204414,760\n204415,333\n204416,3507\n204417,204418\n204419,1544\n204420,309\n204420,310\n204421,577\n204422,328\n204423,240\n204424,3695\n204425,843\n204426,1807\n204427,640\n204428,455\n204429,1773\n204430,179170\n204431,1381\n204432,1188\n204432,1882\n204433,346\n204434,204435\n204436,346\n204437,30\n204438,179170\n204439,7155\n204440,30\n204441,179170\n204442,269\n204443,50\n204444,146\n204444,92476\n204445,1102\n204445,2868\n204446,2995\n204447,1659\n204448,355\n204449,736\n204450,285\n204451,184\n204452,636\n204453,56\n204454,422\n204455,97\n204456,179170\n204457,736\n204458,10\n204459,585\n204460,7363\n204460,8788\n204461,8822\n204462,179170\n204463,179170\n204464,326\n204465,852\n204466,251\n204467,179170\n204468,179170\n204469,1132\n204470,1608\n204471,204472\n204473,1140\n204474,440\n204477,147\n204477,149\n204477,1385\n204478,179170\n204479,179170\n204480,200\n204481,2173\n204482,422\n204483,422\n204484,422\n204485,422\n204486,422\n204487,422\n204488,292\n204489,422\n204490,422\n204491,422\n204492,422\n204493,422\n204494,1132\n204495,1608\n204496,980\n204497,204498\n204499,424\n204500,1181\n204501,1836\n204502,10\n204503,179170\n204504,146\n204504,92476\n204505,647\n204506,344\n204507,1551\n204508,1860\n204509,1858\n204510,204093\n204511,726\n204512,179170\n204513,1381\n204514,179170\n204515,147\n204516,358\n204517,55849\n204518,280\n204518,17245\n204519,204520\n204521,1821\n204521,21736\n204522,55849\n204523,171\n204524,516\n204526,158\n204526,195\n204526,1033\n204526,3297\n204526,3872\n204527,30\n204528,44\n204529,1282\n204530,160\n204531,920\n204532,1608\n204533,1132\n204534,467\n204535,1608\n204536,1132\n204537,2315\n204538,422\n204539,1707\n204540,1132\n204541,1608\n204542,252\n204543,422\n204544,56\n204545,137\n204546,142473\n204547,83\n204548,333\n204549,2979\n204550,248\n204551,577\n204552,1284\n204553,206\n204554,56\n204555,422\n204556,1122\n204557,1782\n204558,138686\n204559,586\n204559,784\n204559,1262\n204559,1332\n204559,1572\n204559,1888\n204559,2701\n204559,30331\n204559,215276\n204560,175\n204561,142473\n204562,158\n204562,5874\n204563,602\n204564,1122\n204565,1608\n204566,206\n204567,292\n204567,338\n204567,509\n204567,1119\n204567,1688\n204568,1511\n204568,1711\n204568,3069\n204569,204570\n204571,204570\n204572,65\n204572,206\n204572,264\n204572,1531\n204572,1572\n204572,1659\n204572,2979\n204573,204093\n204574,932\n204575,1467\n204576,206\n204577,571\n204578,1860\n204579,1858\n204580,994\n204581,287\n204581,162599\n204582,20\n204583,1531\n204584,179170\n204585,2620\n204586,372\n204587,718\n204588,251\n204589,179170\n204590,2915\n204591,736\n204592,217\n204593,179170\n204594,179170\n204595,179170\n204596,179170\n204598,141912\n204599,179170\n204600,179170\n204601,120\n204602,2557\n204603,994\n204604,269\n204605,1608\n204606,1132\n204607,1012\n204608,442\n204609,2421\n204610,149\n204611,302\n204613,704\n204614,736\n204615,179170\n204616,875\n204617,349\n204618,516\n204619,30\n204620,19010\n204621,843\n204622,185877\n204623,15807\n204624,1893\n204625,422\n204626,209\n204627,204628\n204629,3367\n204630,1052\n204630,3695\n204631,623\n204632,1860\n204633,1858\n204634,158\n204635,8907\n204636,15\n204637,138686\n204638,525\n204639,127158\n204640,41\n204640,120\n204640,261\n204640,332\n204640,694\n204640,1119\n204640,1353\n204640,1608\n204640,3115\n204640,6068\n204640,32751\n204641,1309\n204643,1285\n204644,720\n204646,1659\n204647,631\n204648,2775\n204649,447\n204650,784\n204651,500\n204652,1052\n204653,1882\n204654,54\n204655,2775\n204656,1962\n204657,142870\n204658,294\n204659,1118\n204660,192\n204661,483\n204662,10\n204664,493\n204665,422\n204666,1227\n204666,86416\n204667,35\n204668,1132\n204669,781\n204670,222\n204671,408\n204672,2191\n204673,850\n204674,1147\n204675,850\n204676,744\n204677,259\n204677,859\n204678,179170\n204679,1381\n204680,1749\n204681,179170\n204682,433\n204683,60576\n204685,918\n204686,179170\n204687,957\n204688,60576\n204689,1132\n204690,781\n204691,1571\n204692,775\n204693,269\n204694,640\n204695,349\n204695,452\n204695,770\n204695,784\n204696,179170\n204697,30\n204698,195\n204699,195\n204700,179170\n204701,862\n204702,1287\n204703,356\n204704,269\n204705,557\n204706,1293\n204707,2315\n204708,209\n204709,298\n204710,485\n204711,1160\n204712,298\n204713,485\n204714,920\n204715,137\n204716,994\n204717,467\n204718,179170\n204719,83\n204720,2828\n204721,5301\n204722,1274\n204723,5591\n204724,179170\n204725,1860\n204726,1858\n204727,406\n204728,113156\n204729,2590\n204730,171\n204731,179170\n204732,1274\n204733,19010\n204734,393\n204734,999\n204734,1388\n204735,204736\n204737,179170\n204738,1715\n204739,138686\n204740,843\n204741,175\n204742,1274\n204743,1179\n204744,994\n204745,179170\n204746,179170\n204747,994\n204748,217\n204748,301\n204749,142405\n204750,3094\n204751,1983\n204752,1860\n204753,1858\n204754,372\n204754,2812\n204755,136\n204756,2073\n204757,154408\n204758,640\n204759,292\n204760,48\n204761,151\n204762,1983\n204764,195\n204766,264\n204767,251\n204768,920\n204769,652\n204770,7416\n204771,19010\n204772,142473\n204773,30\n204774,20257\n204775,5405\n204776,563\n204777,204778\n204779,4545\n204779,13136\n204779,56150\n204780,356\n204782,179170\n204783,1659\n204784,30\n204785,179170\n204786,3094\n204788,200\n204789,1983\n204790,179170\n204791,299\n204791,459\n204791,932\n204791,972\n204791,973\n204791,1010\n204791,1117\n204791,1298\n204791,1849\n204791,3207\n204791,124668\n204791,187176\n204791,221322\n204791,221329\n204792,1556\n204793,299\n204794,195\n204794,102560\n204795,328\n204796,2315\n204797,149534\n204798,3623\n204799,120\n204800,179170\n204801,124668\n204802,179170\n204803,35\n204804,1572\n204805,752\n204806,1133\n204807,195\n204808,269\n204809,217\n204810,4192\n204810,4193\n204811,622\n204812,120\n204813,222\n204814,179170\n204815,179170\n204816,2923\n204817,1133\n204818,577\n204818,1105\n204819,1858\n204820,1860\n204821,346\n204822,134\n204823,4691\n204824,356\n204824,417\n204824,4220\n204825,485\n204826,298\n204827,151\n204828,269\n204829,536\n204830,37\n204830,3999\n204831,15119\n204832,1118\n204833,298\n204834,485\n204835,417\n204836,994\n204837,2373\n204838,204839\n204840,783\n204841,483\n204842,516\n204843,2979\n204844,298\n204845,485\n204846,366\n204847,179170\n204848,192\n204849,447\n204850,1118\n204851,852\n204852,4672\n204853,1132\n204854,781\n204855,217\n204856,994\n204857,179170\n204858,415\n204859,485\n204860,298\n204861,1860\n204862,1858\n204863,56\n204863,147\n204864,147\n204865,179170\n204866,278\n204867,179170\n204868,179170\n204869,1452\n204870,868\n204871,1707\n204872,1118\n204873,406\n204874,841\n204875,3623\n204876,1400\n204877,19010\n204878,83\n204879,435\n204880,142405\n204881,1001\n204882,346\n204883,843\n204884,146\n204884,92476\n204885,647\n204886,344\n204887,389\n204888,30\n204889,179170\n204890,2315\n204891,346\n204892,861\n204893,346\n204894,30\n204895,16196\n204896,79\n204897,2048\n204898,1452\n204899,536\n204900,1363\n204901,333\n204901,346\n204901,1247\n204901,164572\n204902,1888\n204903,1132\n204904,781\n204905,577\n204906,631\n204907,720\n204907,745\n204907,762\n204907,2590\n204907,3258\n204907,5469\n204907,6789\n204907,249937\n204908,158\n204909,2719\n204911,179170\n204913,179170\n204914,877\n204915,211\n204916,1655\n204917,179170\n204918,1425\n204919,217\n204920,10\n204921,179170\n204922,179170\n204923,255\n204924,1132\n204925,781\n204926,781\n204927,1132\n204928,1118\n204929,56\n204930,422\n204931,31977\n204931,214530\n204932,179170\n204934,861\n204935,264\n204936,30\n204937,142870\n204938,346\n204939,72\n204940,346\n204942,32\n204943,1608\n204944,563\n204945,366\n204946,366\n204947,289\n204947,290\n204947,94134\n204948,179170\n204949,72\n204950,344\n204951,285\n204952,179170\n204953,179170\n204954,137\n204955,346\n204956,424\n204957,179170\n204958,137\n204959,1773\n204960,204961\n204962,2146\n204963,151\n204964,289\n204964,290\n204964,94134\n204965,861\n204966,631\n204967,1363\n204969,893\n204970,752\n204971,179170\n204972,818\n204973,589\n204974,861\n204975,581\n204975,918\n204976,137\n204977,455\n204978,137\n204979,137\n204980,179170\n204981,8373\n204982,1267\n204983,406\n204983,779\n204983,1392\n204983,3148\n204983,6323\n204983,148742\n204984,2315\n204985,204986\n204987,56\n204988,422\n204990,204991\n204990,216424\n204990,228639\n204992,137\n204993,1\n204994,58\n204995,994\n204996,46\n204997,137\n204998,14483\n204999,671\n205000,1132\n205001,536\n205002,389\n205003,205004\n205005,355\n205006,158\n205007,450\n205008,1177\n205008,182162\n205009,1241\n205010,1659\n205011,187176\n205012,675\n205013,142430\n205014,779\n205015,79\n205015,1238\n205016,1085\n205017,364\n205018,1160\n205019,698\n205020,1773\n205021,134\n205022,3623\n205023,160\n205024,151\n205025,640\n205026,640\n205027,485\n205028,298\n205029,479\n205030,192\n205031,1210\n205032,205033\n205034,285\n205035,346\n205036,142426\n205037,189839\n205038,1359\n205039,5310\n205040,248\n205040,557\n205041,200\n205042,577\n205042,1105\n205042,1429\n205043,252\n205044,1381\n205045,113156\n205046,30331\n205047,872\n205048,360\n205049,991\n205050,2443\n205051,138\n205052,485\n205053,298\n205054,360\n205055,1132\n205056,1608\n205057,919\n205058,205059\n205060,209\n205061,278\n205062,666\n205063,671\n205063,5908\n205064,467\n205065,920\n205066,272\n205066,301\n205066,631\n205066,1001\n205066,1326\n205066,1715\n205066,2209\n205066,3804\n205066,8541\n205066,9018\n205067,1882\n205068,366\n205069,467\n205070,138\n205071,73570\n205072,805\n205073,485\n205074,298\n205075,192\n205076,1188\n205077,694\n205078,13661\n205079,920\n205080,83\n205081,516\n205082,515\n205083,3\n205084,809\n205085,1274\n205086,663\n205087,1888\n205087,8675\n205088,422\n205089,422\n205090,422\n205091,663\n205092,422\n205093,422\n205094,479\n205095,1146\n205096,422\n205097,147\n205098,422\n205099,422\n205100,3094\n205101,422\n205102,422\n205103,422\n205104,673\n205105,932\n205106,422\n205107,718\n205108,44\n205109,2989\n205110,1127\n205111,83\n205112,278\n205113,217\n205114,328\n205115,795\n205116,2411\n205117,1238\n205118,269\n205119,911\n205120,160\n205121,1007\n205123,7614\n205124,920\n205125,911\n205126,920\n205127,1452\n205128,920\n205129,920\n205130,58\n205131,994\n205132,46\n205133,447\n205134,2775\n205135,920\n205136,163\n205137,1058\n205139,1132\n205140,781\n205141,138686\n205142,175\n205143,206\n205144,217\n205145,298\n205146,485\n205147,875\n205148,424\n205149,134\n205150,179170\n205151,158\n205151,406\n205153,7572\n205154,6955\n205155,406\n205156,1465\n205156,9457\n205157,1849\n205158,1132\n205159,781\n205160,781\n205161,1132\n205162,920\n205163,68\n205164,781\n205165,1132\n205166,209\n205167,1860\n205168,1858\n205169,433\n205170,781\n205171,1132\n205172,1707\n205174,346\n205175,1363\n205176,920\n205177,1858\n205178,1860\n205179,718\n205180,609\n205181,1608\n205182,1132\n205183,1132\n205184,1608\n205185,264\n205186,920\n205187,1381\n205188,818\n205189,697\n205189,1769\n205190,205191\n205192,557\n205193,781\n205194,1132\n205195,920\n205196,473\n205197,818\n205198,346\n205199,1837\n205200,60576\n205201,3999\n205202,294\n205202,1085\n205202,4222\n205203,500\n205204,54\n205205,1882\n205206,2775\n205207,1962\n205208,1052\n205209,83\n205210,151\n205211,149534\n205212,918\n205213,781\n205214,1132\n205215,63\n205216,775\n205217,433\n205218,179170\n205219,1381\n205220,1133\n205220,164572\n205221,309\n205221,310\n205221,760\n205222,68\n205222,1235\n205222,1335\n205223,30\n205224,292\n205224,1058\n205224,19443\n205225,137\n205227,781\n205228,1132\n205229,6059\n205230,204093\n205231,1235\n205231,1335\n205231,2045\n205231,2209\n205231,3474\n205231,8788\n205231,21711\n205231,29253\n205231,29294\n205232,179170\n205233,302\n205234,55849\n205235,178\n205236,781\n205237,1132\n205238,861\n205239,240\n205240,843\n205241,205242\n205243,1132\n205244,781\n205245,349\n205246,717\n205247,302\n205248,358\n205249,364\n205249,596\n205250,581\n205251,145240\n205252,567\n205253,2699\n205254,911\n205255,269\n205256,37\n205257,762\n205258,663\n205260,145240\n205261,1381\n205262,204093\n205263,79\n205263,8180\n205264,179170\n205265,138686\n205266,175\n205267,206\n205268,179170\n205269,358\n205270,79\n205271,1240\n205272,179170\n205273,186\n205273,1118\n205273,1417\n205273,1796\n205274,289\n205274,290\n205274,94134\n205275,312\n205276,515\n205277,145240\n205278,179170\n205279,515\n205280,273\n205281,314\n205281,433\n205281,1172\n205282,71\n205283,179170\n205284,1556\n205285,179170\n205286,455\n205287,861\n205288,278\n205289,179170\n205290,422\n205291,179170\n205292,278\n205293,500\n205294,1882\n205295,2775\n205296,1052\n205297,1962\n205298,54\n205299,10\n205300,3999\n205301,179170\n205302,179170\n205303,217\n205304,179170\n205305,302\n205306,473\n205307,251\n205308,179170\n205309,579\n205310,1556\n205311,718\n205312,10\n205313,485\n205314,298\n205315,255\n205316,195\n205317,179170\n205318,179170\n205319,503\n205320,179170\n205321,179170\n205322,8270\n205323,366\n205324,179170\n205325,346\n205326,179170\n205327,179170\n205328,563\n205329,179170\n205330,179170\n205331,179170\n205332,179170\n205333,179170\n205334,151\n205335,483\n205336,275\n205337,179170\n205338,179170\n205339,30\n205340,179170\n205341,179170\n205342,273\n205343,54\n205344,500\n205345,1052\n205346,1882\n205347,2775\n205348,1962\n205349,137\n205350,1238\n205351,1\n205352,179170\n205353,9029\n205354,622\n205355,179170\n205356,44\n205357,179170\n205358,79\n205359,1294\n205360,179170\n205361,179170\n205362,4597\n205363,113156\n205364,179170\n205365,179170\n205366,30\n205367,179170\n205368,137\n205369,1436\n205370,179170\n205371,142473\n205372,179170\n205373,994\n205374,459\n205374,862\n205374,907\n205374,1010\n205374,1837\n205374,20359\n205374,188791\n205375,247\n205375,2867\n205375,2868\n205376,179170\n205377,179170\n205378,179170\n205379,179170\n205380,389\n205380,874\n205381,2315\n205382,2224\n205384,30\n205385,801\n205386,222\n205386,1773\n205387,151\n205388,278\n205389,217\n205390,83\n205391,536\n205392,2373\n205393,1467\n205394,485\n205395,298\n205396,179170\n205397,500\n205398,1052\n205399,54\n205400,1882\n205401,2775\n205402,1962\n205403,8270\n205404,733\n205405,83\n205407,1058\n205408,557\n205409,8854\n205410,5906\n205411,557\n205412,626\n205413,278\n205414,137\n205415,862\n205416,818\n205417,3623\n205418,1707\n205419,1773\n205420,360\n205421,720\n205421,877\n205421,973\n205421,1001\n205421,1117\n205421,1284\n205421,1522\n205421,1715\n205421,1837\n205421,2191\n205421,9024\n205422,149\n205422,21442\n205423,861\n205424,179170\n205425,479\n205425,1289\n205425,1381\n205425,1551\n205426,179170\n205427,1474\n205428,2620\n205429,247\n205430,179170\n205431,673\n205432,920\n205433,875\n205434,323\n205435,179170\n205436,1085\n205437,179170\n205438,563\n205439,3653\n205440,1608\n205441,1132\n205442,2979\n205443,255\n205444,481\n205445,1012\n205446,179170\n205447,1262\n205448,2146\n205449,2620\n205450,193129\n205451,278\n205453,255\n205454,179170\n205455,179170\n205456,179170\n205457,1149\n205458,389\n205459,2315\n205460,634\n205461,1012\n205462,841\n205463,3830\n205464,805\n205465,2315\n205466,2315\n205467,2315\n205468,142870\n205469,3507\n205470,4903\n205471,179170\n205472,179170\n205473,23783\n205474,485\n205475,298\n205476,142473\n205477,179170\n205479,179170\n205480,179170\n205481,179170\n205482,179170\n205483,2116\n205484,179170\n205485,179170\n205486,179170\n205487,205488\n205488,22\n205489,179170\n205490,205491\n205492,278\n205493,179170\n205494,205495\n205496,577\n205497,142473\n205498,205478\n205499,1326\n205500,102\n205501,1323\n205502,408\n205503,1773\n205504,577\n205504,1105\n205504,1429\n205505,179170\n205506,406\n205507,179170\n205508,23783\n205509,1140\n205509,1782\n205510,1773\n205511,1181\n205512,179170\n205513,344\n205513,55849\n205514,1033\n205515,179170\n205516,30\n205517,179170\n205518,179170\n205519,179170\n205520,30331\n205521,1227\n205521,86416\n205522,205523\n205522,235273\n205524,1227\n205524,86416\n205525,179170\n205526,581\n205527,179170\n205528,2590\n205529,620\n205530,179170\n205531,1821\n205531,21736\n205532,179170\n205533,406\n205534,200\n205535,179170\n205536,10\n205537,872\n205538,1429\n205539,179170\n205540,179170\n205541,346\n205542,179170\n205543,1515\n205544,779\n205545,258\n205546,1572\n205547,1363\n205548,207\n205549,285\n205550,137\n205551,740\n205551,741\n205552,304\n205553,1769\n205554,366\n205555,333\n205556,668\n205557,406\n205558,1033\n205559,323\n205560,2292\n205561,179170\n205562,205563\n205564,179170\n205565,179170\n205566,179170\n205567,179170\n205568,179170\n205569,179170\n205570,671\n205571,298\n205572,485\n205573,83\n205574,620\n205575,406\n205576,138686\n205577,175\n205578,179170\n205579,994\n205580,1143\n205581,1240\n205582,179170\n205583,355\n205584,1515\n205585,779\n205586,1572\n205587,275\n205590,779\n205591,136\n205592,2590\n205593,179170\n205594,2590\n205595,360\n205596,2421\n205597,333\n205598,147\n205599,440\n205600,366\n205601,54\n205603,1551\n205604,422\n205605,175\n205606,422\n205607,422\n205608,422\n205609,422\n205610,1559\n205611,422\n205612,422\n205613,422\n205614,422\n205615,422\n205616,422\n205617,779\n205618,422\n205619,179170\n205620,179170\n205621,179170\n205622,240\n205622,372\n205623,1381\n205624,179170\n205625,640\n205626,179170\n205627,104\n205627,134\n205627,137\n205627,138\n205627,636\n205627,911\n205627,967\n205627,1432\n205627,4114\n205627,15742\n205627,65864\n205627,73288\n205627,84411\n205627,140773\n205627,170751\n205627,205627\n205627,227188\n205627,243263\n205627,243265\n205627,243266\n205627,243270\n205627,243273\n205628,328\n205629,795\n205630,81\n205631,285\n205632,58\n205633,46\n205634,994\n205635,1033\n205636,252\n205636,516\n205638,900\n205639,726\n205640,841\n205641,1425\n205642,179170\n205643,302\n205644,340\n205645,314\n205645,141912\n205647,217\n205648,79\n205649,1007\n205650,264\n205650,1749\n205650,14550\n205651,338\n205651,827\n205651,1381\n205652,809\n205653,663\n205654,1363\n205654,1858\n205655,340\n205656,83\n205657,137\n205659,1052\n205660,28203\n205660,162599\n205661,340\n205662,1007\n205663,726\n205664,1033\n205665,163\n205665,1556\n205666,3094\n205667,1276\n205668,1274\n205669,920\n205670,467\n205671,304\n205671,2590\n205672,406\n205673,46\n205673,299\n205673,663\n205673,762\n205673,877\n205673,972\n205673,1117\n205673,1192\n205673,1284\n205673,1973\n205673,124668\n205673,148742\n205674,2915\n205676,2979\n205677,809\n205678,336\n205679,44\n205680,179170\n205681,2744\n205682,280\n205682,17245\n205683,269\n205684,124668\n205685,1860\n205686,1858\n205687,193129\n205688,433\n205689,620\n205690,1381\n205691,356\n205691,852\n205691,32751\n205692,932\n205693,1238\n205694,171\n205695,273\n205696,107\n205697,660\n205698,406\n205699,893\n205700,261\n205700,283\n205700,2319\n205700,2646\n205701,167\n205701,73570\n205702,205703\n205704,1452\n205705,2590\n205706,1515\n205707,779\n205708,192\n205709,1\n205710,1465\n205711,5213\n205712,200\n205713,358\n205713,611\n205714,1058\n205715,1402\n205716,1837\n205717,1345\n205718,333\n205719,455\n205720,1019\n205721,1033\n205722,1860\n205723,1858\n205724,447\n205725,2775\n205726,10\n205727,622\n205728,455\n205729,217\n205730,106\n205730,1082\n205731,620\n205732,1368\n205733,5034\n205734,920\n205735,406\n205736,83\n205737,481\n205738,447\n205739,2775\n205740,1515\n205741,779\n205742,447\n205743,2775\n205744,481\n205745,1718\n205746,151\n205746,358\n205746,1058\n205746,144556\n205746,255911\n205748,273\n205748,313\n205749,934\n205749,1033\n205750,3582\n205751,217\n205753,312\n205754,200\n205755,333\n205756,515\n205757,1860\n205758,1858\n205759,179170\n205760,3623\n205761,179170\n205762,1033\n205764,794\n205765,2797\n205766,48\n205767,167\n205767,314\n205768,620\n205769,581\n205770,315\n205770,671\n205771,567\n205772,406\n205773,779\n205774,58\n205775,994\n205776,46\n205777,179170\n205778,179170\n205779,393\n205780,333\n205781,50\n205781,14366\n205782,1515\n205783,269\n205784,179170\n205785,192\n205786,1220\n205786,1222\n205787,252\n205788,251\n205789,269\n205790,309\n205790,310\n205791,1127\n205792,1058\n205793,1118\n205794,106\n205794,149\n205794,406\n205795,483\n205796,1572\n205797,83\n205798,801\n205799,1118\n205800,278\n205801,640\n205802,515\n205803,697\n205804,269\n205805,2315\n205806,138686\n205807,269\n205808,697\n205809,175\n205810,852\n205811,5718\n205812,205813\n205814,918\n205815,201886\n205816,137\n205816,206\n205816,420\n205816,586\n205816,628\n205816,2574\n205816,4039\n205816,5375\n205816,16207\n205816,22727\n205816,99287\n205817,1388\n205818,1359\n205819,13661\n205820,48\n205821,1860\n205822,1858\n205823,805\n205824,2735\n205825,392\n205825,1572\n205825,3769\n205826,2750\n205827,192\n205828,872\n205828,1220\n205828,1222\n205829,4548\n205830,30\n205832,2607\n205833,179170\n205835,1133\n205836,6059\n205837,13661\n205838,83\n205839,83\n205839,2590\n205839,6068\n205840,151\n205841,83\n205842,536\n205842,784\n205842,2553\n205843,1556\n205844,640\n205845,202\n205846,179170\n205847,1881\n205848,455\n205849,179170\n205850,299\n205851,1220\n205851,1222\n205852,252\n205853,251\n205854,697\n205854,1417\n205855,4594\n205856,63\n205856,106\n205856,192\n205856,202\n205856,252\n205856,337\n205856,516\n205856,586\n205856,1220\n205856,1222\n205856,1243\n205856,1635\n205856,6119\n205856,16201\n205857,179170\n205858,4039\n205859,13661\n205860,287\n205861,3252\n205862,10\n205862,1188\n205863,167\n205864,1363\n205865,35\n205866,233\n205867,79\n205867,217\n205867,247\n205867,252\n205867,467\n205867,1181\n205868,623\n205868,1805\n205869,873\n205870,366\n205871,65\n205872,205873\n205874,30\n205875,264\n205876,1381\n205877,185877\n205878,30\n205879,66297\n205880,136\n205880,1332\n205882,640\n205883,1531\n205884,1773\n205885,179170\n205886,366\n205887,217\n205888,298\n205889,34\n205889,35\n205890,644\n205891,179170\n205892,435\n205893,35\n205893,389\n205893,536\n205893,852\n205893,949\n205893,2646\n205894,483\n205895,179170\n205896,885\n205896,13704\n205897,538\n205898,1556\n205899,10\n205900,760\n205901,30\n205902,83\n205903,120\n205904,158\n205904,289\n205904,406\n205904,94134\n205905,563\n205906,843\n205907,694\n205907,1907\n205908,1417\n205909,485\n205910,298\n205911,50\n205911,192\n205912,473\n205913,671\n205914,485\n205915,298\n205916,6424\n205917,577\n205918,30\n205919,1188\n205920,4411\n205921,1955\n205922,302\n205923,861\n205924,188791\n205925,179170\n205926,1220\n205926,1222\n205927,516\n205928,252\n205929,557\n205930,862\n205931,302\n205932,623\n205933,83\n205934,167\n205935,8270\n205936,424\n205937,217\n205938,536\n205939,77\n205940,900\n205941,557\n205942,4571\n205943,682\n205943,72439\n205944,2620\n205945,285\n205946,3804\n205947,2923\n205948,861\n205949,205950\n205951,205950\n205952,485\n205953,298\n205954,346\n205955,673\n205956,1014\n205957,2607\n205958,179170\n205959,4192\n205959,4193\n205960,2073\n205961,1014\n205962,205963\n205964,205963\n205965,205963\n205966,205963\n205967,205963\n205968,205963\n205969,205963\n205970,205963\n205971,205963\n205972,4637\n205973,1014\n205974,179170\n205975,1014\n205976,841\n205977,1014\n205978,179170\n205979,3252\n205980,2735\n205981,179170\n205982,179170\n205983,1860\n205984,1858\n205985,10\n205986,1860\n205987,1858\n205988,192\n205989,1474\n205990,1181\n205991,1235\n205991,1335\n205992,4260\n205993,302\n205993,579\n205994,104\n205994,4355\n205995,30\n205996,285\n205997,250\n205997,1684\n205998,1058\n205999,861\n206000,795\n206001,30\n206002,72\n206003,206004\n206005,158\n206006,179170\n206007,1849\n206008,30\n206009,30\n206010,1515\n206011,30\n206012,1453\n206013,30\n206014,1323\n206015,102\n206016,408\n206017,1326\n206018,2116\n206019,206020\n206019,227848\n206019,241512\n206021,422\n206022,356\n206022,1309\n206023,577\n206024,179170\n206025,30\n206026,563\n206027,1102\n206028,15573\n206029,269\n206030,516\n206031,252\n206032,1220\n206032,1222\n206033,338\n206034,795\n206035,278\n206036,1849\n206037,206038\n206039,338\n206040,206041\n206042,206041\n206043,1\n206043,147\n206043,149\n206044,79\n206045,1085\n206047,179170\n206049,30\n206051,875\n206052,8180\n206053,431\n206053,631\n206053,862\n206053,994\n206053,1474\n206053,44725\n206054,179170\n206055,23783\n206056,850\n206057,2590\n206058,147\n206060,30331\n206061,65\n206062,1429\n206063,640\n206064,142430\n206065,192\n206066,206067\n206068,179170\n206069,10\n206070,72\n206071,207\n206072,668\n206073,179170\n206074,872\n206075,424\n206076,206077\n206078,179170\n206080,422\n206081,56\n206082,313\n206083,222\n206083,455\n206084,5265\n206085,1424\n206086,206087\n206088,485\n206089,298\n206090,1143\n206091,2083\n206092,3\n206093,137\n206094,1707\n206095,137\n206097,862\n206098,392\n206098,676\n206098,849\n206098,3003\n206099,298\n206100,485\n206101,1803\n206102,346\n206103,1381\n206104,66297\n206105,192\n206106,872\n206107,907\n206108,640\n206109,1127\n206110,784\n206111,8537\n206112,2671\n206114,980\n206115,424\n206116,1655\n206117,1531\n206118,43203\n206119,485\n206120,298\n206121,35\n206121,104\n206122,422\n206123,422\n206124,19010\n206125,422\n206126,422\n206127,422\n206128,422\n206129,422\n206130,676\n206131,422\n206132,422\n206133,447\n206134,2775\n206135,422\n206136,422\n206137,179170\n206138,422\n206139,55849\n206140,422\n206141,1381\n206142,442\n206143,21442\n206144,671\n206144,2867\n206144,2868\n206145,142426\n206146,1400\n206147,104\n206148,485\n206149,298\n206150,202\n206151,289\n206151,290\n206151,94134\n206152,255\n206153,852\n206154,1893\n206155,192\n206156,2775\n206157,447\n206158,50\n206158,79\n206158,147\n206158,158\n206159,1769\n206160,259\n206161,41\n206162,206163\n206164,30\n206165,19010\n206166,30\n206167,34\n206167,35\n206168,21442\n206169,467\n206170,920\n206171,83\n206172,272\n206173,697\n206174,66297\n206175,1860\n206176,1858\n206177,206178\n206179,158\n206180,668\n206181,217\n206182,2989\n206183,141912\n206184,138686\n206185,175\n206186,1983\n206187,1968\n206188,1381\n206189,4760\n206190,843\n206191,187176\n206192,571\n206193,1659\n206194,280\n206194,17245\n206195,493\n206196,192\n206196,242826\n206197,485\n206198,298\n206199,206\n206200,868\n206201,920\n206202,23287\n206203,356\n206204,206205\n206206,206207\n206206,219354\n206208,330\n206209,1238\n206210,1285\n206211,1402\n206211,2367\n206212,171\n206213,1282\n206214,536\n206215,3003\n206216,1452\n206217,781\n206218,1132\n206219,1402\n206220,138686\n206221,31073\n206222,175\n206223,483\n206224,932\n206225,44\n206226,2574\n206227,1119\n206228,1033\n206229,355\n206230,41\n206230,431\n206230,784\n206230,1119\n206230,1285\n206230,7194\n206230,185877\n206231,1381\n206232,141912\n206233,3\n206234,3555\n206235,285\n206237,1860\n206238,1858\n206239,1007\n206240,195\n206242,13\n206243,3555\n206244,175\n206245,60576\n206246,7768\n206247,60576\n206248,493\n206249,60576\n206250,60576\n206252,346\n206253,1220\n206253,1222\n206254,516\n206255,252\n206256,10\n206257,60576\n206258,179170\n206259,13361\n206260,736\n206261,163\n206262,278\n206263,99\n206264,500\n206265,1052\n206266,1882\n206267,2775\n206268,54\n206269,1962\n206270,77\n206271,77\n206272,1257\n206273,1220\n206273,1222\n206274,252\n206275,251\n206277,50\n206279,1381\n206280,2620\n206281,595\n206282,596\n206283,3507\n206284,406\n206285,151\n206285,206\n206285,690\n206286,918\n206287,358\n206288,690\n206289,1860\n206290,1858\n206291,63\n206292,187176\n206293,346\n206294,142426\n206295,444\n206296,3209\n206298,2421\n206299,346\n206300,292\n206301,500\n206302,1882\n206303,1052\n206304,2775\n206305,54\n206306,1962\n206307,2646\n206308,179170\n206309,178\n206310,222\n206311,179170\n206312,179170\n206313,485\n206314,298\n206315,179170\n206316,1381\n206317,805\n206318,30\n206319,718\n206320,1284\n206321,252\n206321,1220\n206321,1222\n206321,1512\n206322,222\n206323,3623\n206324,179170\n206325,515\n206326,285\n206327,179170\n206328,805\n206329,620\n206330,1240\n206331,30\n206332,179170\n206333,3367\n206334,206335\n206336,1181\n206337,918\n206338,694\n206339,179170\n206340,206341\n206343,179170\n206344,54\n206345,2784\n206346,422\n206347,422\n206348,179170\n206349,179170\n206350,985\n206351,784\n206352,30\n206353,640\n206354,516\n206355,1019\n206356,149\n206357,179170\n206358,1707\n206359,273\n206360,217\n206361,179170\n206362,179170\n206363,1644\n206364,1381\n206365,1551\n206365,3999\n206366,179170\n206367,299\n206368,309\n206368,310\n206368,3039\n206368,221292\n206369,406\n206370,1\n206371,163\n206372,179170\n206373,3623\n206374,179170\n206375,142426\n206376,179170\n206377,805\n206378,1284\n206379,206380\n206381,206380\n206382,179170\n206383,640\n206384,640\n206385,3623\n206386,142426\n206387,58\n206387,104\n206387,111\n206387,292\n206387,338\n206387,441\n206387,1140\n206387,1238\n206387,8276\n206388,2379\n206389,1368\n206390,1085\n206391,932\n206392,1\n206393,179170\n206394,54\n206395,179170\n206396,179170\n206397,138\n206398,865\n206399,557\n206400,137\n206401,179170\n206402,4597\n206403,88820\n206404,179170\n206405,577\n206406,179170\n206407,179170\n206408,4193\n206408,19227\n206409,138686\n206410,179170\n206411,179170\n206412,2379\n206413,640\n206414,875\n206415,179170\n206416,640\n206417,1452\n206417,1639\n206417,2312\n206417,3507\n206418,392\n206419,3413\n206420,14453\n206421,808\n206422,273\n206423,697\n206424,205627\n206425,1052\n206426,151\n206427,298\n206428,485\n206429,175\n206430,1860\n206431,1858\n206432,179170\n206433,918\n206434,272\n206435,206436\n206437,35\n206438,392\n206438,697\n206438,3260\n206439,671\n206440,30\n206441,3623\n206442,179170\n206443,801\n206443,1140\n206444,83\n206445,1007\n206446,1210\n206446,5366\n206446,5440\n206446,28072\n206447,55849\n206448,222\n206449,1425\n206450,141912\n206451,179170\n206452,1284\n206453,104\n206453,261\n206453,596\n206453,784\n206453,805\n206453,1285\n206453,1368\n206453,1888\n206454,30\n206455,447\n206456,2775\n206457,120\n206457,1419\n206458,34\n206458,35\n206458,634\n206458,973\n206458,5662\n206459,1785\n206460,1167\n206461,589\n206462,605\n206463,1241\n206464,1782\n206465,1124\n206466,973\n206467,86\n206468,2373\n206469,95554\n206470,206471\n206472,179170\n206473,30\n206474,30\n206475,809\n206476,1556\n206477,179170\n206478,179170\n206479,179170\n206480,179170\n206481,179170\n206482,1252\n206482,1253\n206483,920\n206484,179170\n206485,179170\n206486,179170\n206487,179170\n206488,179170\n206489,1132\n206490,1608\n206491,346\n206492,30\n206493,179170\n206494,30\n206495,980\n206496,179170\n206497,179170\n206498,217\n206499,179170\n206500,1227\n206500,86416\n206501,640\n206502,179170\n206503,179170\n206504,3623\n206505,179170\n206506,179170\n206507,518\n206508,179170\n206509,1285\n206510,179170\n206511,949\n206512,1381\n206513,557\n206514,55849\n206515,206516\n206517,3623\n206518,179170\n206519,900\n206519,1559\n206520,355\n206521,2620\n206522,2590\n206523,30\n206524,179170\n206525,1402\n206526,206527\n206528,179170\n206529,179170\n206530,278\n206531,289\n206531,290\n206531,94134\n206532,179170\n206533,179170\n206534,160\n206535,160\n206536,179170\n206537,19010\n206538,338\n206539,302\n206540,217\n206541,179170\n206543,269\n206544,72\n206545,2292\n206546,433\n206547,72\n206548,332\n206549,623\n206549,1805\n206550,34\n206550,35\n206550,72\n206550,158\n206550,217\n206550,278\n206550,313\n206550,536\n206550,631\n206550,634\n206550,660\n206550,852\n206550,949\n206550,1133\n206550,1274\n206550,1313\n206550,1466\n206550,1467\n206550,1718\n206550,1881\n206550,2224\n206550,2244\n206550,2646\n206550,2779\n206550,4637\n206550,4903\n206550,5326\n206550,7092\n206550,9015\n206552,56\n206552,192\n206554,250\n206554,1684\n206555,346\n206556,179170\n206557,179170\n206558,285\n206559,250\n206559,1684\n206560,179170\n206561,285\n206562,424\n206563,285\n206564,83\n206565,138686\n206566,175\n206567,805\n206568,79\n206569,1381\n206570,147\n206570,158\n206570,195\n206570,779\n206570,1179\n206570,5405\n206570,19005\n206571,1326\n206572,1323\n206573,408\n206574,102\n206575,179170\n206576,30\n206577,743\n206578,355\n206579,4691\n206580,1007\n206581,179170\n206582,250\n206582,1684\n206583,389\n206584,338\n206585,1227\n206585,86416\n206586,489\n206587,483\n206588,179170\n206589,142870\n206590,145240\n206591,206592\n206591,239295\n206593,313\n206593,392\n206593,406\n206593,2045\n206595,179170\n206596,10\n206597,83\n206598,1821\n206598,21736\n206599,72\n206600,366\n206601,179170\n206602,424\n206603,30\n206604,302\n206605,179170\n206606,206607\n206608,862\n206608,1001\n206609,640\n206610,128661\n206611,841\n206612,225\n206613,302\n206614,795\n206615,179170\n206616,30\n206617,1381\n206618,8884\n206619,2590\n206620,179170\n206621,30\n206622,302\n206623,1085\n206624,285\n206625,626\n206626,302\n206627,4192\n206627,4193\n206628,217\n206629,615\n206630,1740\n206631,323\n206632,81\n206633,479\n206634,179170\n206635,355\n206636,206637\n206638,30\n206639,2146\n206640,1359\n206641,872\n206642,179170\n206643,179170\n206644,1559\n206645,179170\n206646,206647\n206648,3\n206651,206652\n206653,79\n206654,83\n206655,72\n206656,344\n206657,285\n206659,206\n206659,358\n206659,611\n206660,1220\n206660,1222\n206661,516\n206662,252\n206663,72\n206664,44\n206665,932\n206666,422\n206666,4597\n206666,5405\n206667,10\n206668,179170\n206669,805\n206670,406\n206671,179170\n206672,302\n206673,302\n206674,781\n206675,1132\n206676,315\n206676,671\n206677,1707\n206678,179170\n206679,179170\n206680,167\n206680,1231\n206680,2083\n206681,149\n206682,179170\n206683,5\n206683,827\n206684,589\n206685,302\n206686,302\n206687,302\n206688,302\n206689,422\n206690,850\n206691,843\n206692,302\n206693,179170\n206694,179170\n206695,302\n206696,179170\n206697,13\n206698,179170\n206699,158\n206700,179170\n206701,918\n206702,179170\n206703,302\n206704,850\n206705,850\n206706,1181\n206707,1474\n206708,1572\n206709,1805\n206710,313\n206711,389\n206712,1122\n206713,1381\n206714,483\n206715,179170\n206716,1227\n206716,86416\n206717,850\n206718,2146\n206719,179170\n206720,179170\n206721,35\n206722,1707\n206723,366\n206725,1220\n206725,1222\n206726,516\n206727,252\n206728,179170\n206729,179170\n206730,1220\n206730,1222\n206731,516\n206732,252\n206733,149\n206734,60576\n206735,1179\n206736,113156\n206737,360\n206738,805\n206739,302\n206740,1119\n206741,1479\n206742,390\n206743,302\n206744,302\n206745,10\n206746,406\n206747,206748\n206747,223185\n206747,231818\n206747,264962\n206749,425\n206750,179170\n206751,179170\n206752,302\n206753,8270\n206754,473\n206755,206756\n206755,207985\n206755,216718\n206755,223235\n206755,226967\n206755,229353\n206755,233052\n206755,235460\n206755,237372\n206755,247621\n206757,2779\n206758,10\n206759,179170\n206760,58\n206761,222\n206763,179170\n206764,142405\n206765,206766\n206767,179170\n206768,206769\n206768,219745\n206768,226247\n206768,229761\n206770,1284\n206771,206772\n206773,1265\n206773,1266\n206774,179170\n206775,302\n206776,2411\n206777,206778\n206779,932\n206780,179170\n206781,285\n206782,1012\n206783,7155\n206784,338\n206785,206786\n206787,63\n206788,1368\n206789,302\n206790,805\n206791,275\n206792,179170\n206793,269\n206794,302\n206796,206797\n206798,179170\n206799,41\n206800,657\n206801,294\n206802,302\n206803,206804\n206805,1544\n206806,1544\n206807,843\n206808,206809\n206810,424\n206811,355\n206812,127158\n206813,206814\n206815,107\n206816,2416\n206816,2417\n206817,292\n206818,338\n206819,298\n206820,137\n206820,5101\n206821,1133\n206822,3538\n206823,83\n206824,872\n206825,366\n206826,366\n206828,32\n206828,392\n206829,179170\n206830,406\n206831,932\n206832,206833\n206834,1181\n206835,158\n206836,147\n206837,285\n206838,127158\n206839,779\n206840,206841\n206842,79\n206843,179170\n206844,179170\n206845,2045\n206846,206847\n206848,137\n206849,503\n206851,302\n206852,149534\n206853,138686\n206854,175\n206855,55849\n206856,302\n206857,302\n206858,1096\n206859,137\n206860,192\n206861,422\n206862,4597\n206863,137\n206864,1531\n206865,850\n206866,302\n206867,44\n206868,5101\n206868,55077\n206869,2944\n206870,1298\n206871,302\n206872,302\n206873,994\n206874,1773\n206875,289\n206875,290\n206875,94134\n206876,206772\n206876,219203\n206877,1608\n206878,302\n206879,1359\n206880,760\n206880,1631\n206881,55849\n206882,538\n206883,302\n206884,1821\n206884,21736\n206885,1571\n206886,179170\n206887,1608\n206888,206889\n206890,179170\n206891,146952\n206892,1749\n206893,577\n206894,252\n206895,1220\n206895,1222\n206896,516\n206897,19010\n206898,788\n206899,389\n206900,389\n206901,611\n206902,483\n206903,389\n206904,136\n206905,32\n206905,392\n206905,697\n206905,1363\n206906,302\n206907,37088\n206908,151\n206909,557\n206910,557\n206911,795\n206912,557\n206913,2574\n206914,30\n206915,130\n206916,302\n206917,1707\n206918,586\n206919,1773\n206920,932\n206921,1287\n206922,179170\n206923,280\n206923,17245\n206924,775\n206924,23437\n206925,206926\n206927,179170\n206928,87\n206929,79\n206930,179170\n206932,1149\n206933,994\n206934,142473\n206935,179170\n206936,447\n206937,2775\n206938,2017\n206939,179170\n206940,366\n206942,302\n206943,1220\n206943,1222\n206944,516\n206945,252\n206946,1220\n206946,1222\n206947,516\n206948,252\n206949,179170\n206950,1634\n206951,179170\n206952,137\n206953,206954\n206956,192\n206956,333\n206956,406\n206956,1634\n206956,2931\n206956,8811\n206957,211\n206958,779\n206959,179170\n206960,841\n206961,292\n206962,294\n206963,296\n206964,298\n206965,179170\n206966,4237\n206966,182162\n206967,179170\n206968,285\n206969,179170\n206970,179170\n206971,179170\n206973,68\n206974,206975\n206976,1544\n206977,195\n206978,206979\n206980,206981\n206982,179170\n206983,1381\n206984,130\n206985,83\n206986,355\n206987,525\n206987,636\n206987,1749\n206988,287\n206989,202\n206989,1220\n206989,1222\n206989,1512\n206989,72439\n206990,206991\n206992,206993\n206994,206995\n206996,1773\n206997,81070\n206998,392\n206999,189128\n207000,58\n207000,389\n207000,801\n207000,1653\n207001,1014\n207002,179170\n207003,1222\n207003,1266\n207003,1512\n207003,72439\n207003,78984\n207004,611\n207005,779\n207006,581\n207007,120\n207008,2617\n207009,1707\n207010,590\n207010,1419\n207011,994\n207012,718\n207013,1749\n207014,850\n207016,1381\n207017,862\n207018,422\n207019,422\n207020,422\n207021,422\n207022,422\n207023,422\n207024,422\n207025,422\n207026,422\n207027,422\n207028,422\n207029,55849\n207030,81070\n207031,3\n207032,207033\n207034,314\n207035,571\n207035,868\n207036,3507\n207037,920\n207039,1381\n207040,676\n207041,467\n207042,994\n207043,349\n207044,1707\n207045,167\n207045,299\n207045,459\n207045,1973\n207045,2083\n207045,3630\n207045,9702\n207045,15277\n207045,22808\n207045,72764\n207045,76704\n207045,147883\n207045,160870\n207045,171641\n207045,176876\n207045,227286\n207045,229082\n207045,250681\n207046,1118\n207047,784\n207049,852\n207050,328\n207051,41\n207051,104\n207051,134\n207051,784\n207051,805\n207051,1016\n207051,1119\n207051,1146\n207052,433\n207053,2557\n207054,3623\n207055,147\n207056,1238\n207057,217\n207058,1224\n207059,1452\n207060,392\n207061,657\n207062,302\n207063,1078\n207064,252\n207064,516\n207064,925\n207064,1220\n207065,83\n207066,392\n207067,1\n207068,83\n207069,5101\n207070,3258\n207071,827\n207072,323\n207073,422\n207074,2557\n207075,8270\n207076,1010\n207077,147\n207077,158\n207078,2701\n207079,609\n207079,2205\n207079,20813\n207079,33424\n207080,179170\n207081,179170\n207082,302\n207083,596\n207084,392\n207084,433\n207085,138686\n207086,175\n207088,2620\n207090,1181\n207091,4571\n207092,5718\n207093,493\n207094,179170\n207095,602\n207096,1860\n207097,1858\n207098,2572\n207099,1019\n207100,433\n207102,30\n207103,781\n207104,1132\n207105,60576\n207106,1381\n207107,2411\n207108,2782\n207109,147\n207110,142426\n207111,19010\n207112,447\n207113,2775\n207114,309\n207114,310\n207115,636\n207116,30\n207116,328\n207117,71\n207118,346\n207119,179170\n207120,333\n207120,393\n207120,980\n207120,1388\n207120,1531\n207120,4455\n207120,15573\n207121,179170\n207122,620\n207122,779\n207123,289\n207123,290\n207123,94134\n207124,852\n207125,671\n207126,41\n207126,120\n207126,1353\n207126,1608\n207127,272\n207128,8270\n207129,577\n207131,289\n207131,290\n207131,94134\n207132,346\n207133,623\n207134,3695\n207135,313\n207136,30\n207137,1572\n207138,179170\n207139,1096\n207140,184\n207141,920\n207142,596\n207142,784\n207142,1052\n207142,2416\n207142,2417\n207143,1432\n207143,2674\n207143,4571\n207143,5826\n207144,2784\n207145,179170\n207146,30\n207147,106\n207147,1370\n207148,58\n207148,534\n207149,115659\n207150,515\n207151,30\n207152,994\n207152,1415\n207153,991\n207154,611\n207155,918\n207156,694\n207157,406\n207158,179170\n207159,781\n207160,805\n207161,1132\n207162,141912\n207163,994\n207164,1881\n207166,211\n207167,138686\n207168,175\n207169,30\n207170,289\n207170,290\n207170,94134\n207171,1188\n207171,5310\n207172,30\n207173,179170\n207174,179170\n207175,356\n207175,1284\n207176,1556\n207177,56\n207178,422\n207179,1179\n207180,781\n207181,1132\n207183,536\n207184,252\n207185,252\n207186,179170\n207187,179170\n207188,516\n207189,1052\n207190,1572\n207191,2146\n207192,269\n207193,30\n207195,146\n207195,92476\n207196,647\n207197,344\n207198,207199\n207200,2620\n207201,636\n207202,179170\n207203,781\n207204,1132\n207205,493\n207206,179170\n207207,179170\n207208,1012\n207209,1458\n207210,179170\n207211,35\n207212,483\n207213,179170\n207214,592\n207215,255\n207216,179170\n207217,179170\n207218,500\n207219,1052\n207220,54\n207221,1882\n207222,2775\n207223,1962\n207224,179170\n207225,202\n207225,130897\n207226,1479\n207227,179170\n207228,179170\n207229,207230\n207231,207230\n207232,179170\n207233,80266\n207234,671\n207235,30\n207236,179170\n207237,179170\n207238,3623\n207239,875\n207241,536\n207242,179170\n207243,179170\n207244,622\n207245,536\n207246,56\n207247,422\n207248,852\n207249,272\n207250,7\n207250,3846\n207251,179170\n207252,179170\n207253,192\n207253,640\n207254,992\n207255,151\n207256,179170\n207257,179170\n207258,63\n207259,179170\n207260,113156\n207261,2105\n207262,467\n207262,868\n207263,240\n207263,4504\n207264,204093\n207265,1220\n207265,1222\n207266,516\n207267,252\n207268,207269\n207270,207271\n207272,2105\n207273,179170\n207274,147\n207275,211\n207276,207277\n207278,179170\n207279,2590\n207280,264\n207281,184\n207282,278\n207283,30\n207284,179170\n207285,83\n207286,179170\n207287,55849\n207288,54\n207289,179170\n207290,30\n207291,364\n207292,179170\n207293,1400\n207293,2073\n207294,179170\n207295,107\n207296,102\n207297,1323\n207298,408\n207299,1326\n207300,179170\n207301,1465\n207302,994\n207303,179170\n207304,179170\n207305,179170\n207306,179170\n207307,406\n207308,1718\n207309,179170\n207310,7416\n207311,273\n207312,179170\n207313,179170\n207314,1181\n207315,179170\n207316,179170\n207318,179170\n207319,207320\n207321,406\n207322,120\n207323,250\n207323,1684\n207324,179170\n207325,3630\n207326,1707\n207327,179170\n207328,179170\n207329,179170\n207330,179170\n207331,72\n207332,179170\n207333,3623\n207334,179170\n207335,247\n207336,994\n207337,389\n207338,207339\n207340,72\n207341,179170\n207342,79\n207343,1449\n207344,207345\n207346,285\n207347,250\n207347,1684\n207348,179170\n207349,5440\n207350,333\n207351,264\n207352,1381\n207353,30\n207354,3041\n207355,1452\n207356,1551\n207357,1007\n207358,4192\n207358,4193\n207359,1033\n207360,50\n207361,1381\n207362,6303\n207363,1639\n207364,179170\n207365,6027\n207366,34\n207366,35\n207366,313\n207366,2784\n207366,14126\n207367,577\n207368,179170\n207369,2373\n207370,4355\n207371,269\n207372,3209\n207373,179170\n207374,179170\n207375,179170\n207376,143\n207377,179170\n207378,179170\n207379,179170\n207380,4597\n207381,1556\n207382,285\n207383,2506\n207383,8463\n207383,142870\n207384,179170\n207385,179170\n207386,2266\n207387,179170\n207388,179170\n207389,3135\n207390,137\n207391,56\n207392,422\n207393,142870\n207394,862\n207395,119\n207395,151\n207395,13910\n207396,483\n207397,389\n207398,83\n207399,8463\n207400,215\n207401,72\n207402,406\n207403,200\n207404,179170\n207405,207406\n207407,346\n207408,424\n207409,1544\n207410,3623\n207411,179170\n207412,137\n207413,1544\n207414,4611\n207415,4039\n207416,1085\n207417,588\n207417,590\n207418,779\n207419,207420\n207421,355\n207422,1267\n207423,179170\n207425,1608\n207426,1132\n207427,1294\n207428,179170\n207429,79\n207430,55849\n207431,310\n207431,3039\n207432,179170\n207433,779\n207433,141912\n207434,920\n207435,1238\n207436,310\n207437,1803\n207438,435\n207438,516\n207438,707\n207438,162599\n207440,422\n207441,179170\n207442,3623\n207443,1962\n207444,145751\n207445,500\n207446,1052\n207447,1962\n207448,54\n207449,1882\n207450,2775\n207451,83\n207452,1881\n207453,179170\n207454,134\n207454,137\n207455,185877\n207455,189788\n207456,581\n207457,142426\n207458,6487\n207459,422\n207460,422\n207461,422\n207462,422\n207463,422\n207464,422\n207465,422\n207466,422\n207467,1544\n207468,4611\n207469,422\n207470,422\n207471,138686\n207472,422\n207473,175\n207474,422\n207475,433\n207476,207477\n207478,124668\n207479,21442\n207480,1181\n207481,1893\n207482,179170\n207483,195\n207485,217\n207486,536\n207486,1881\n207486,2944\n207487,147\n207488,1544\n207489,4611\n207490,657\n207491,2017\n207492,30\n207493,920\n207494,467\n207495,1849\n207496,207497\n207498,1425\n207499,1479\n207499,3585\n207500,3148\n207501,192\n207501,3260\n207502,346\n207503,1007\n207504,2572\n207505,1425\n207506,179170\n207507,360\n207508,1238\n207509,972\n207510,779\n207511,206\n207512,6556\n207513,118336\n207514,1452\n207515,179170\n207516,1326\n207517,346\n207518,179170\n207519,620\n207520,932\n207521,346\n207522,251\n207524,83\n207525,1912\n207526,30\n207527,467\n207528,1631\n207528,178576\n207529,1265\n207529,1266\n207530,588\n207530,590\n207531,179170\n207532,20359\n207533,663\n207534,1078\n207534,4223\n207535,189128\n207536,596\n207537,83\n207538,19227\n207539,207540\n207541,207542\n207543,346\n207544,332\n207545,346\n207546,447\n207547,2775\n207548,189788\n207550,192\n207551,406\n207552,622\n207553,285\n207554,1181\n207555,1515\n207556,393\n207557,149\n207558,1181\n207559,44\n207560,346\n207561,455\n207562,30\n207563,141912\n207564,258\n207565,251\n207566,577\n207567,3623\n207568,1284\n207569,805\n207570,141912\n207571,163\n207572,328\n207573,994\n207574,278\n207575,1033\n207576,1381\n207577,309\n207577,310\n207578,301\n207578,932\n207578,1298\n207578,1436\n207579,360\n207580,980\n207581,179170\n207582,8270\n207583,1631\n207584,346\n207585,862\n207586,155481\n207587,264\n207587,1509\n207588,7360\n207590,155481\n207591,58\n207592,55849\n207593,620\n207594,138686\n207595,175\n207596,192\n207596,622\n207596,1298\n207596,2372\n207597,557\n207598,406\n207599,1085\n207600,189794\n207601,142426\n207602,272\n207603,1619\n207604,1001\n207605,272\n207606,4548\n207607,779\n207607,141912\n207608,2411\n207609,3\n207610,217\n207611,781\n207612,1132\n207613,1381\n207614,1515\n207615,779\n207616,217\n207617,72\n207618,104\n207618,136\n207618,225\n207618,557\n207618,953\n207618,1368\n207618,1939\n207618,5405\n207618,7270\n207619,1117\n207620,346\n207621,994\n207622,784\n207624,1474\n207625,346\n207626,30\n207627,673\n207628,781\n207629,1132\n207630,346\n207631,346\n207632,717\n207633,918\n207634,333\n207635,349\n207636,1449\n207637,6027\n207638,3003\n207639,4611\n207640,346\n207641,179170\n207642,649\n207643,1181\n207644,720\n207645,588\n207645,590\n207646,781\n207647,1132\n207648,1474\n207649,1572\n207650,1805\n207651,313\n207652,346\n207653,389\n207654,1122\n207655,346\n207656,134\n207657,8270\n207658,1276\n207659,207\n207659,252\n207659,292\n207659,336\n207659,849\n207659,1293\n207659,1992\n207659,99732\n207659,115474\n207659,139929\n207659,181063\n207660,30\n207661,3960\n207662,30\n207663,88820\n207664,30\n207665,1132\n207666,21442\n207667,781\n207668,1132\n207669,211\n207669,269\n207669,1014\n207669,15609\n207670,147\n207671,1619\n207672,175\n207673,1181\n207674,1381\n207675,1132\n207676,781\n207677,779\n207678,649\n207679,1467\n207680,138686\n207681,175\n207682,48\n207682,1572\n207682,2626\n207683,360\n207684,55849\n207685,852\n207686,515\n207687,179170\n207688,360\n207689,83\n207690,996\n207691,141912\n207692,302\n207693,79\n207694,1479\n207695,149534\n207696,159365\n207697,1181\n207698,195\n207699,179170\n207700,151\n207701,515\n207702,217\n207702,1118\n207703,781\n207704,1132\n207705,2116\n207706,918\n207707,264\n207707,1381\n207707,1893\n207707,2312\n207708,207709\n207710,589\n207711,557\n207712,192\n207713,179170\n207714,1556\n207715,179170\n207716,30\n207717,217\n207718,1181\n207719,994\n207720,151\n207721,346\n207722,79\n207723,37414\n207724,179170\n207725,356\n207726,294\n207727,336\n207728,255\n207729,30\n207730,356\n207731,107\n207732,994\n207733,1381\n207734,83\n207735,640\n207736,179170\n207737,58\n207738,994\n207739,46\n207740,179170\n207741,346\n207742,278\n207743,1284\n207744,577\n207745,2557\n207746,7416\n207747,2590\n207748,147\n207749,179170\n207751,179170\n207752,179170\n207753,393\n207754,850\n207755,207756\n207757,301\n207757,3422\n207758,179170\n207759,4220\n207760,2421\n207761,72\n207762,179170\n207763,46\n207764,58\n207765,994\n207766,23287\n207767,72\n207768,784\n207769,1274\n207769,2646\n207770,1983\n207771,483\n207772,1078\n207773,179170\n207774,663\n207774,1381\n207774,1414\n207774,2073\n207774,3193\n207774,141912\n207775,1983\n207776,179170\n207777,179170\n207778,30\n207779,147\n207780,179170\n207781,217\n207781,660\n207781,852\n207781,1133\n207781,1466\n207781,4637\n207781,7092\n207782,577\n207783,1227\n207783,86416\n207784,179170\n207785,179170\n207786,784\n207787,30\n207788,467\n207789,875\n207790,875\n207791,179170\n207792,30\n207793,179170\n207794,30\n207795,179170\n207796,179170\n207797,179170\n207798,179170\n207799,179170\n207800,666\n207801,30\n207802,309\n207802,310\n207802,1400\n207803,179170\n207804,406\n207805,8822\n207806,179170\n207807,179170\n207808,179170\n207809,720\n207809,877\n207809,907\n207809,973\n207809,1001\n207809,1117\n207809,1284\n207809,1522\n207809,1715\n207809,1732\n207809,1837\n207809,2083\n207809,2191\n207809,9024\n207810,330\n207811,50\n207812,179170\n207813,390\n207814,179170\n207815,247\n207815,2867\n207815,2868\n207816,994\n207817,46\n207818,58\n207819,179170\n207820,248\n207821,30\n207822,179170\n207823,250\n207823,1684\n207824,285\n207825,179170\n207826,179170\n207827,10\n207828,72\n207829,1212\n207829,1282\n207830,179170\n207831,2373\n207832,3538\n207833,30331\n207834,162599\n207835,151\n207836,278\n207837,167\n207837,392\n207837,623\n207837,1143\n207837,1502\n207837,1805\n207837,2470\n207837,6059\n207837,19299\n207837,46271\n207837,90144\n207837,160870\n207837,161636\n207837,199647\n207837,207837\n207837,219743\n207837,231314\n207837,234521\n207837,243026\n207837,243094\n207837,258550\n207837,259020\n207837,259535\n207838,259\n207839,1332\n207840,868\n207841,3260\n207842,1639\n207843,179170\n207844,285\n207845,2048\n207846,222\n207847,179170\n207848,207\n207849,30\n207850,493\n207851,269\n207852,179170\n207853,2923\n207854,179170\n207855,30\n207856,58\n207857,994\n207858,46\n207859,79\n207860,58\n207861,46\n207862,994\n207863,179170\n207864,179170\n207865,312\n207866,179170\n207867,1326\n207868,1323\n207869,102\n207870,408\n207871,2424\n207872,155481\n207873,107\n207874,179170\n207875,179170\n207876,179170\n207877,179170\n207878,179170\n207879,72\n207880,179170\n207881,179170\n207882,179170\n207883,179170\n207884,1363\n207885,1181\n207886,309\n207886,310\n207887,48\n207888,1132\n207889,179170\n207890,872\n207891,179170\n207892,162599\n207893,1429\n207894,207895\n207896,2779\n207897,179170\n207898,179170\n207899,1983\n207900,138686\n207901,175\n207902,1983\n207903,1370\n207904,2590\n207905,1773\n207906,302\n207907,346\n207908,2367\n207909,406\n207909,596\n207910,4548\n207911,19227\n207912,179170\n207913,843\n207914,668\n207916,1983\n207917,179170\n207918,207919\n207920,2315\n207921,390\n207922,346\n207923,269\n207924,184\n207925,99\n207926,179170\n207927,179170\n207928,179170\n207932,2506\n207933,58\n207934,994\n207935,46\n207936,179170\n207937,222\n207938,179170\n207939,991\n207940,752\n207941,991\n207942,652\n207944,1143\n207945,1305\n207946,30\n207947,179170\n207948,968\n207949,2105\n207950,207951\n207952,4571\n207953,147\n207954,424\n207955,285\n207956,179170\n207957,179170\n207958,30\n207959,179170\n207960,285\n207961,4594\n207962,250\n207962,1684\n207963,151\n207963,663\n207964,179170\n207965,179170\n207966,313\n207967,313\n207968,1133\n207969,1467\n207970,30\n207971,13980\n207972,390\n207973,1010\n207974,240\n207975,406\n207975,1181\n207976,346\n207977,179170\n207978,179170\n207979,48\n207980,631\n207981,1715\n207982,179170\n207983,1085\n207984,77\n207986,179170\n207987,1467\n207988,631\n207989,179170\n207990,1452\n207991,13919\n207992,312\n207993,1544\n207994,388\n207995,146\n207995,92476\n207996,2424\n207997,99\n207998,30\n207999,79\n208000,301\n208001,208002\n208003,18790\n208004,58\n208005,994\n208006,46\n208007,355\n208009,8270\n208010,841\n208011,1326\n208012,2315\n208013,2116\n208014,1888\n208014,7194\n208015,1619\n208016,1983\n208017,1634\n208018,273\n208019,561\n208020,1707\n208021,217\n208022,649\n208023,784\n208024,1001\n208025,175\n208026,433\n208027,142870\n208028,13980\n208029,135\n208029,23783\n208030,292\n208030,1688\n208031,447\n208032,2775\n208033,179170\n208034,179170\n208035,171\n208036,120\n208037,1821\n208037,21736\n208038,179170\n208039,2443\n208040,485\n208041,158\n208041,89035\n208042,208043\n208042,209031\n208042,210015\n208044,208045\n208044,208067\n208044,208903\n208046,208047\n208048,208049\n208048,210356\n208050,104\n208050,136\n208050,225\n208050,953\n208050,1368\n208050,1939\n208050,5405\n208050,7270\n208051,208052\n208053,208054\n208053,211534\n208055,208056\n208055,210412\n208057,422\n208058,208059\n208058,209425\n208060,208061\n208060,213141\n208062,208063\n208062,210273\n208064,422\n208065,208066\n208065,211521\n208068,208069\n208068,210161\n208070,422\n208071,208072\n208071,211188\n208073,208074\n208073,210193\n208075,1572\n208076,208077\n208076,211594\n208078,208079\n208078,208785\n208080,208081\n208080,208511\n208080,210928\n208082,422\n208083,208084\n208085,208086\n208085,210944\n208087,208088\n208087,211741\n208089,422\n208090,422\n208091,208092\n208091,211398\n208093,208094\n208095,208096\n208097,208098\n208099,208100\n208101,422\n208102,208103\n208104,422\n208105,208106\n208105,208978\n208107,208108\n208109,208110\n208111,208112\n208111,210332\n208113,208114\n208113,209220\n208115,208116\n208117,208118\n208117,210579\n208119,208120\n208119,208606\n208119,210095\n208121,208122\n208123,208124\n208123,208500\n208125,208126\n208125,209519\n208127,208128\n208129,208130\n208131,208132\n208131,208532\n208133,208134\n208133,209341\n208135,208136\n208135,208601\n208135,209018\n208135,209659\n208137,422\n208138,208139\n208138,209522\n208138,210826\n208140,208141\n208140,211556\n208142,208143\n208144,208145\n208144,209390\n208144,209465\n208146,208147\n208146,208740\n208146,209217\n208148,208149\n208148,211423\n208150,208151\n208152,208153\n208152,209566\n208152,211349\n208154,422\n208155,422\n208156,208157\n208158,208159\n208158,209975\n208158,210512\n208160,208161\n208162,208163\n208164,208165\n208164,208318\n208164,209319\n208166,208167\n208166,209447\n208168,208169\n208168,208867\n208170,1368\n208171,208172\n208173,208174\n208173,209767\n208175,208176\n208175,210169\n208177,208178\n208179,208180\n208181,208182\n208181,208776\n208181,211137\n208183,208184\n208185,208186\n208187,208188\n208189,208190\n208191,208192\n208191,210590\n208191,211229\n208193,208194\n208193,208325\n208195,208196\n208195,208206\n208195,208803\n208197,208198\n208199,208200\n208199,211601\n208201,208202\n208201,208884\n208203,422\n208204,208205\n208204,209378\n208204,211338\n208204,211604\n208207,208208\n208207,208433\n208207,209168\n208209,208210\n208209,210827\n208209,211252\n208211,208212\n208213,208214\n208215,208216\n208215,210829\n208217,208218\n208217,208775\n208219,208220\n208219,211198\n208221,208222\n208223,208224\n208223,209976\n208225,208226\n208227,208228\n208227,208398\n208227,211600\n208229,208230\n208231,179170\n208232,208233\n208234,208235\n208236,208237\n208236,208649\n208236,209468\n208236,210629\n208238,208239\n208238,208656\n208240,208241\n208240,210038\n208242,208243\n208242,210448\n208244,208245\n208246,208247\n208248,208249\n208250,208251\n208252,208253\n208254,208255\n208256,208257\n208256,208952\n208256,210122\n208258,208259\n208260,208261\n208262,208263\n208262,208270\n208264,208265\n208266,208267\n208268,208269\n208271,208272\n208273,208274\n208275,208276\n208277,208278\n208277,208455\n208277,210055\n208277,211228\n208279,208280\n208281,208282\n208283,208284\n208283,210852\n208285,208286\n208285,209685\n208285,209792\n208287,1773\n208288,208289\n208290,208291\n208290,208330\n208290,208747\n208292,208293\n208292,208615\n208292,209579\n208292,211080\n208294,208295\n208296,208297\n208296,209336\n208298,208299\n208298,209239\n208300,208301\n208302,208303\n208302,211187\n208304,208305\n208306,208307\n208308,208309\n208310,208311\n208310,210010\n208312,208313\n208314,208315\n208316,208317\n208316,210798\n208319,208320\n208321,208322\n208323,208324\n208326,208327\n208326,209983\n208328,208329\n208328,210465\n208328,211491\n208328,211728\n208331,208332\n208333,208334\n208333,211358\n208335,208336\n208335,209295\n208337,208338\n208337,209504\n208339,208340\n208341,422\n208342,208343\n208342,208709\n208344,208345\n208346,208347\n208348,208349\n208348,211193\n208350,208351\n208352,208353\n208352,210146\n208352,211055\n208354,208355\n208356,208357\n208356,210927\n208358,208359\n208360,208361\n208362,208363\n208364,208365\n208364,210406\n208366,208367\n208366,208860\n208368,208369\n208370,208371\n208370,208560\n208372,208373\n208374,208375\n208374,211765\n208376,208377\n208378,208379\n208380,208381\n208380,209795\n208382,208383\n208384,208385\n208384,211439\n208386,208387\n208388,208389\n208390,208391\n208390,210660\n208392,208393\n208394,208395\n208396,208397\n208399,208400\n208399,211341\n208401,208402\n208401,210257\n208401,211047\n208401,211429\n208403,208404\n208405,208406\n208407,208408\n208409,208410\n208409,211382\n208411,208412\n208413,208414\n208415,208416\n208417,208418\n208419,208420\n208419,210353\n208421,208422\n208421,208887\n208421,210296\n208423,208424\n208423,209087\n208425,208426\n208425,209379\n208427,208428\n208429,208430\n208431,208432\n208434,208435\n208436,208437\n208436,208460\n208438,208439\n208440,208441\n208443,208444\n208443,210407\n208445,208446\n208447,208448\n208447,210934\n208449,208450\n208451,208452\n208451,211764\n208453,208454\n208453,209274\n208453,211197\n208456,208457\n208456,211142\n208458,208459\n208458,209092\n208458,209943\n208458,210773\n208461,208462\n208461,211722\n208463,208464\n208465,208466\n208465,211385\n208467,208468\n208467,211618\n208469,208470\n208471,208472\n208473,208474\n208475,208476\n208477,208478\n208477,211450\n208479,208480\n208481,208482\n208481,213134\n208483,208484\n208483,210035\n208483,211567\n208483,211800\n208485,1007\n208486,208487\n208486,210761\n208488,208489\n208490,208491\n208490,209085\n208492,208493\n208492,209919\n208494,208495\n208496,208497\n208498,208499\n208498,208680\n208498,209088\n208501,208502\n208501,211570\n208503,208504\n208503,211591\n208505,208506\n208507,208508\n208509,208510\n208512,208513\n208514,208515\n208516,208517\n208518,208519\n208518,210976\n208520,208521\n208522,208523\n208522,211642\n208524,208525\n208526,208527\n208528,208529\n208530,208531\n208533,208534\n208535,208536\n208535,209086\n208537,208538\n208537,210341\n208539,208540\n208539,209838\n208541,208542\n208543,208544\n208545,208546\n208545,208796\n208545,209015\n208547,208548\n208549,208550\n208549,209787\n208552,208553\n208554,208555\n208554,209698\n208556,208557\n208558,208559\n208558,209089\n208561,208562\n208561,209486\n208561,210996\n208563,208564\n208563,210935\n208563,211479\n208565,208566\n208567,208568\n208567,211447\n208569,208570\n208569,211533\n208571,208572\n208571,209572\n208573,208574\n208573,211157\n208575,208576\n208577,208578\n208577,209893\n208579,208580\n208581,208582\n208583,208584\n208583,208999\n208583,209542\n208585,208586\n208587,208588\n208587,210979\n208589,208590\n208589,208918\n208591,208592\n208593,208594\n208593,211693\n208595,208596\n208597,208598\n208599,208600\n208602,208603\n208604,208605\n208604,209496\n208604,210140\n208607,208608\n208609,208610\n208611,208612\n208613,208614\n208616,208617\n208616,210131\n208618,208619\n208618,211059\n208620,208621\n208620,210955\n208622,208623\n208622,210376\n208622,211557\n208624,202\n208625,208626\n208627,208628\n208627,211104\n208629,208630\n208631,208632\n208631,210664\n208633,208634\n208633,208850\n208635,208636\n208635,210436\n208637,208638\n208637,210284\n208639,208640\n208641,208642\n208641,208841\n208643,208644\n208643,211015\n208645,208646\n208647,208648\n208647,208967\n208650,208651\n208650,209695\n208650,211696\n208652,208653\n208654,208655\n208654,208766\n208654,210630\n208657,208658\n208659,208660\n208661,208662\n208661,210342\n208663,208664\n208663,208828\n208663,209864\n208665,208666\n208667,208668\n208670,208671\n208670,210758\n208670,211202\n208672,208673\n208674,208675\n208674,210119\n208674,210172\n208674,211515\n208676,208677\n208678,208679\n208681,208682\n208683,208684\n208685,208686\n208687,208688\n208689,208690\n208691,208692\n208693,208694\n208693,210750\n208695,208696\n208697,208698\n208699,208700\n208699,208855\n208699,210499\n208701,208702\n208701,209251\n208701,209610\n208703,208704\n208703,209053\n208703,209060\n208705,208706\n208707,208708\n208710,208711\n208710,211607\n208712,208713\n208714,208715\n208714,209384\n208716,208717\n208718,208719\n208720,208721\n208720,209704\n208720,211641\n208722,208723\n208724,208725\n208726,208727\n208728,208729\n208730,208731\n208730,208840\n208732,208733\n208732,209171\n208734,208735\n208734,210068\n208734,210755\n208734,211282\n208736,208737\n208736,209875\n208738,208739\n208741,208742\n208743,208744\n208745,208746\n208745,210183\n208748,208749\n208750,208751\n208752,208753\n208752,208890\n208752,210748\n208754,208755\n208754,209036\n208756,208757\n208756,209870\n208758,208759\n208758,208953\n208760,208761\n208762,208763\n208762,209898\n208764,208765\n208764,209703\n208767,208768\n208769,208770\n208769,211790\n208771,208772\n208771,209395\n208771,210667\n208773,208774\n208777,208778\n208777,209636\n208777,211321\n208779,208780\n208779,208960\n208781,208782\n208781,209054\n208781,211309\n208783,208784\n208783,208833\n208783,210270\n208783,210883\n208783,211357\n208783,211560\n208786,208787\n208788,208789\n208790,208791\n208790,209991\n208792,208793\n208794,208795\n208797,208798\n208799,208800\n208799,208939\n208801,208802\n208801,211458\n208804,208805\n208806,208807\n208806,210442\n208808,208809\n208810,208811\n208812,208813\n208814,208815\n208816,208817\n208816,211727\n208818,208819\n208820,208821\n208820,210564\n208822,208823\n208824,208825\n208826,208827\n208829,208830\n208831,208832\n208831,210408\n208831,211730\n208831,211760\n208834,208835\n208834,211523\n208836,208837\n208836,210236\n208838,208839\n208838,210043\n208838,210897\n208842,208843\n208842,209055\n208842,209950\n208844,208845\n208846,208847\n208846,211670\n208848,208849\n208848,210409\n208851,208852\n208851,210846\n208853,208854\n208856,208857\n208858,208859\n208861,208862\n208863,208864\n208863,209884\n208865,208866\n208868,208869\n208870,208871\n208870,209764\n208872,208873\n208872,209299\n208874,208875\n208874,211799\n208876,208877\n208876,211088\n208878,208879\n208880,208881\n208882,208883\n208885,208886\n208888,208889\n208888,209292\n208891,208892\n208893,208894\n208895,208896\n208895,209692\n208895,210511\n208897,208898\n208899,208900\n208899,211328\n208901,208902\n208904,208905\n208904,209824\n208906,208907\n208906,211134\n208908,208909\n208910,208911\n208910,209571\n208912,208913\n208912,209298\n208914,208915\n208914,211561\n208916,208917\n208916,210200\n208919,208920\n208921,208922\n208923,208924\n208925,208926\n208925,210287\n208927,208928\n208929,208930\n208931,208932\n208933,208934\n208935,208936\n208935,209008\n208937,208938\n208937,209328\n208940,208941\n208942,208943\n208944,208945\n208944,209934\n208946,208947\n208948,208949\n208950,208951\n208954,208955\n208956,208957\n208958,208959\n208958,209335\n208958,211732\n208961,208962\n208961,209389\n208963,208964\n208963,209487\n208965,208966\n208968,208969\n208970,208971\n208970,210464\n208972,208973\n208974,208975\n208974,209938\n208976,208977\n208979,208980\n208979,211342\n208981,208982\n208983,208984\n208983,209821\n208985,208986\n208985,210710\n208987,208988\n208987,209454\n208987,211036\n208989,208990\n208989,209545\n208991,208992\n208991,210879\n208993,208994\n208993,211271\n208993,211505\n208995,208996\n208997,208998\n209000,209001\n209002,209003\n209004,209005\n209006,209007\n209009,209010\n209011,209012\n209011,209858\n209013,209014\n209016,209017\n209019,209020\n209021,209022\n209023,209024\n209023,210739\n209025,209026\n209025,209987\n209025,210385\n209027,209028\n209029,209030\n209032,209033\n209034,209035\n209037,209038\n209037,209755\n209039,209040\n209041,209042\n209043,209044\n209045,209046\n209045,209625\n209047,209048\n209049,209050\n209049,211135\n209049,211474\n209051,209052\n209051,211196\n209056,209057\n209056,211778\n209058,209059\n209061,209062\n209063,209064\n209065,209066\n209067,209068\n209069,209070\n209071,209072\n209073,209074\n209075,209076\n209075,209105\n209075,209830\n209077,209078\n209077,209439\n209077,210247\n209079,209080\n209079,209800\n209081,209082\n209083,209084\n209090,209091\n209090,210705\n209093,209094\n209093,209137\n209095,209096\n209097,209098\n209097,211280\n209097,211283\n209097,211352\n209099,209100\n209101,209102\n209103,209104\n209106,209107\n209106,209230\n209106,211281\n209108,58\n209108,1140\n209108,2443\n209109,209110\n209111,209112\n209111,209135\n209113,209114\n209113,211573\n209115,209116\n209117,209118\n209119,209120\n209121,209122\n209121,210252\n209121,210329\n209123,209124\n209123,211150\n209125,209126\n209127,209128\n209129,209130\n209131,209132\n209133,209134\n209136,893\n209138,209139\n209138,209142\n209140,209141\n209140,211364\n209143,209144\n209143,210747\n209145,209146\n209147,209148\n209147,209300\n209147,211453\n209149,179170\n209150,209151\n209152,209153\n209152,209570\n209154,209155\n209154,209569\n209154,209624\n209156,209157\n209158,209159\n209160,209161\n209162,209163\n209164,209165\n209166,209167\n209166,210292\n209169,209170\n209172,209173\n209174,209175\n209176,209177\n209178,209179\n209180,209181\n209182,209183\n209184,209185\n209184,209444\n209186,209187\n209186,210956\n209188,209189\n209190,209191\n209190,209227\n209192,209193\n209194,209195\n209196,209197\n209196,209248\n209196,211660\n209198,209199\n209200,209201\n209202,1381\n209203,209204\n209205,209206\n209207,209208\n209209,209210\n209209,209289\n209211,209212\n209211,210190\n209213,209214\n209215,209216\n209215,209499\n209218,209219\n209221,209222\n209223,209224\n209223,211165\n209225,209226\n209228,209229\n209231,209232\n209233,209234\n209233,211044\n209235,209236\n209235,209613\n209237,209238\n209237,209820\n209240,209241\n209242,209243\n209242,211056\n209244,209245\n209244,211209\n209244,211661\n209246,209247\n209249,209250\n209249,210156\n209249,211166\n209252,209253\n209252,211681\n209254,209255\n209256,209257\n209258,209259\n209260,209261\n209262,209263\n209264,209265\n209264,209398\n209266,209267\n209268,209269\n209270,209271\n209272,209273\n209275,209276\n209277,209278\n209279,209280\n209279,210048\n209281,209282\n209283,209284\n209283,209510\n209283,210825\n209283,211093\n209283,211731\n209285,209286\n209287,209288\n209287,210638\n209290,209291\n209290,210788\n209293,209294\n209293,211659\n209293,211677\n209296,209297\n209301,209302\n209301,209408\n209303,209304\n209305,209306\n209305,210619\n209307,209308\n209307,210795\n209309,209310\n209309,210506\n209311,209312\n209313,209314\n209313,210164\n209313,210828\n209315,209316\n209315,209942\n209317,209318\n209317,210386\n209320,209321\n209322,209323\n209324,209325\n209326,209327\n209329,209330\n209329,209825\n209331,209332\n209331,210109\n209331,211583\n209333,209334\n209333,211687\n209337,209338\n209337,209899\n209337,213118\n209339,209340\n209342,209343\n209342,211522\n209344,209345\n209346,209347\n209348,209349\n209350,209351\n209352,209353\n209354,209355\n209354,209922\n209356,209357\n209358,209359\n209360,209361\n209362,209363\n209362,210075\n209362,210808\n209364,209365\n209366,209367\n209368,209369\n209368,209889\n209370,209371\n209370,210116\n209372,209373\n209374,209375\n209376,209377\n209376,210854\n209380,209381\n209380,209438\n209382,209383\n209385,209386\n209387,209388\n209391,209392\n209393,209394\n209396,209397\n209399,209400\n209399,209817\n209401,217\n209402,209403\n209402,211258\n209404,209405\n209404,210632\n209404,211306\n209406,209407\n209409,209410\n209411,209412\n209413,209414\n209415,209416\n209417,209418\n209417,209890\n209419,209420\n209419,210377\n209421,209422\n209423,209424\n209423,209843\n209426,209427\n209428,209429\n209430,209431\n209432,209433\n209434,209435\n209436,209437\n209436,211752\n209440,209441\n209440,210187\n209442,209443\n209442,211136\n209445,209446\n209448,209449\n209450,209451\n209452,209453\n209452,211199\n209455,209456\n209455,211101\n209457,209458\n209459,209460\n209459,211768\n209461,209462\n209461,211543\n209463,209464\n209463,210980\n209466,209467\n209466,209509\n209466,210912\n209469,209470\n209471,179170\n209472,209473\n209474,209475\n209476,209477\n209478,209479\n209478,210147\n209480,209481\n209482,209483\n209482,210768\n209484,209485\n209484,209782\n209488,209489\n209490,209491\n209490,210737\n209490,211052\n209492,209493\n209492,210652\n209494,209495\n209497,209498\n209500,209501\n209502,209503\n209505,209506\n209507,209508\n209511,209512\n209511,209678\n209513,209514\n209515,209516\n209517,209518\n209520,209521\n209523,209524\n209523,209935\n209523,211434\n209525,209526\n209527,209528\n209529,301\n209530,209531\n209530,210398\n209532,209533\n209534,209535\n209536,209537\n209536,210995\n209538,209539\n209538,209939\n209538,211114\n209540,209541\n209543,209544\n209546,209547\n209546,210920\n209546,210929\n209548,209549\n209548,209990\n209550,209551\n209550,210494\n209550,211037\n209552,209553\n209554,209555\n209554,210853\n209556,209557\n209556,210137\n209556,213142\n209558,209559\n209558,210096\n209560,209561\n209560,210060\n209562,209563\n209564,209565\n209564,210909\n209567,209568\n209573,209574\n209575,209576\n209575,211041\n209577,209578\n209580,209581\n209582,209583\n209584,209585\n209584,210445\n209586,209587\n209586,211490\n209588,209589\n209588,209731\n209590,209591\n209590,210557\n209592,209593\n209594,209595\n209594,211257\n209596,209597\n209598,209599\n209598,210295\n209600,209601\n209602,209603\n209602,209912\n209602,210639\n209602,210647\n209602,210774\n209602,211340\n209604,209605\n209606,209607\n209608,209609\n209608,210476\n209611,209612\n209614,209615\n209614,210764\n209616,209617\n209618,209619\n209620,209621\n209622,209623\n209622,211004\n209622,211433\n209626,209627\n209626,210536\n209628,209629\n209628,210997\n209630,209631\n209630,210646\n209632,209633\n209632,210578\n209634,209635\n209634,211343\n209637,209638\n209639,209640\n209641,209642\n209641,211240\n209643,209644\n209643,210274\n209645,209646\n209647,209648\n209649,209650\n209651,209652\n209653,209654\n209655,209656\n209657,209658\n209657,210824\n209660,209661\n209660,211303\n209662,209663\n209664,209665\n209666,209667\n209666,211426\n209668,209669\n209670,209671\n209670,210938\n209670,211028\n209672,209673\n209674,209675\n209674,211478\n209676,209677\n209679,209680\n209679,211021\n209681,209682\n209683,209684\n209683,210321\n209683,210822\n209686,209687\n209686,211237\n209688,209689\n209690,209691\n209690,209869\n209690,211701\n209693,209694\n209696,209697\n209699,209700\n209701,209702\n209701,211376\n209701,211435\n209705,209706\n209707,209708\n209709,209710\n209711,209712\n209713,209714\n209713,209863\n209715,209716\n209715,210926\n209717,209718\n209717,209777\n209719,209720\n209721,209722\n209723,209724\n209723,210243\n209725,209726\n209725,211553\n209725,211647\n209727,209728\n209729,209730\n209732,209733\n209734,1276\n209734,3698\n209735,209736\n209735,211363\n209737,209738\n209737,210900\n209739,209740\n209739,210369\n209739,211391\n209741,209742\n209743,209744\n209743,211171\n209745,209746\n209747,209748\n209749,209750\n209751,209752\n209751,210380\n209753,209754\n209756,209757\n209756,209923\n209756,210227\n209758,209759\n209758,210088\n209758,213125\n209760,209761\n209760,209984\n209760,211409\n209762,209763\n209762,210657\n209765,209766\n209765,210061\n209765,210674\n209768,209769\n209770,163\n209771,209772\n209771,210434\n209773,209774\n209775,209776\n209778,209779\n209780,209781\n209780,210435\n209783,209784\n209783,210324\n209785,209786\n209788,209789\n209790,209791\n209793,209794\n209796,209797\n209798,209799\n209801,209802\n209801,210389\n209803,209804\n209803,210009\n209805,209806\n209805,211525\n209807,209808\n209807,211083\n209809,209810\n209809,210921\n209809,211022\n209811,209812\n209813,209814\n209815,209816\n209815,210184\n209818,209819\n209818,210663\n209822,209823\n209826,209827\n209826,213096\n209828,209829\n209831,209832\n209833,209834\n209835,302\n209836,209837\n209839,209840\n209839,210614\n209841,209842\n209844,209845\n209846,209847\n209848,209849\n209850,209851\n209852,209853\n209854,209855\n209856,209857\n209859,209860\n209861,209862\n209865,209866\n209867,209868\n209867,211359\n209867,211393\n209871,209872\n209873,209874\n209873,210575\n209876,209877\n209876,210855\n209876,210983\n209878,209879\n209878,210136\n209880,209881\n209880,210237\n209882,209883\n209885,209886\n209885,210807\n209887,209888\n209891,209892\n209891,211301\n209894,209895\n209894,210880\n209896,209897\n209900,209901\n209902,209903\n209904,209905\n209904,210423\n209906,209907\n209906,211566\n209908,209909\n209910,209911\n209913,209914\n209915,209916\n209917,209918\n209920,209921\n209924,209925\n209926,209927\n209926,211700\n209928,209929\n209928,210489\n209930,209931\n209930,211598\n209932,209933\n209936,209937\n209940,209941\n209944,209945\n209944,211322\n209946,209947\n209948,209949\n209951,209952\n209953,209954\n209953,211544\n209953,213113\n209955,209956\n209957,209958\n209959,209960\n209961,209962\n209963,209964\n209965,209966\n209967,209968\n209967,210012\n209969,209970\n209971,209972\n209971,210868\n209973,209974\n209973,210405\n209977,209978\n209977,211302\n209979,209980\n209979,210544\n209979,210712\n209981,209982\n209981,211365\n209985,209986\n209988,209989\n209992,209993\n209994,209995\n209996,179170\n209997,209998\n209999,210000\n210001,210002\n210003,210004\n210005,210006\n210007,210008\n210013,210014\n210013,210626\n210016,210017\n210018,210019\n210018,211587\n210020,210021\n210022,210023\n210024,210025\n210026,210027\n210026,211623\n210029,210030\n210029,210915\n210031,210032\n210031,211532\n210033,210034\n210036,210037\n210036,211471\n210039,210040\n210041,210042\n210044,210045\n210046,210047\n210046,211621\n210049,210050\n210051,210052\n210053,210054\n210056,210057\n210058,210059\n210058,210587\n210062,210063\n210062,211038\n210064,210065\n210064,211308\n210064,213103\n210066,210067\n210069,210070\n210071,210072\n210071,211167\n210073,210074\n210076,210077\n210078,210079\n210078,210931\n210080,210081\n210082,210083\n210084,210085\n210086,210087\n210086,210246\n210089,210090\n210089,210441\n210091,210092\n210093,210094\n210093,211464\n210097,210098\n210099,210100\n210101,210102\n210103,210104\n210105,210106\n210105,210143\n210107,210108\n210107,210783\n210110,210111\n210110,211417\n210112,210113\n210114,210115\n210117,210118\n210117,210277\n210120,210121\n210123,210124\n210125,210126\n210127,210128\n210129,210130\n210132,210133\n210134,210135\n210134,211501\n210138,210139\n210141,210142\n210141,211158\n210144,210145\n210148,210149\n210148,211272\n210150,210151\n210152,210153\n210152,211339\n210154,210155\n210157,210158\n210159,210160\n210159,211168\n210162,210163\n210162,210568\n210162,211489\n210165,210166\n210167,210168\n210170,210171\n210173,210174\n210175,210176\n210175,210240\n210177,210178\n210179,210180\n210181,210182\n210185,210186\n210185,210714\n210185,211649\n210188,210189\n210191,210192\n210191,211298\n210194,210195\n210194,211562\n210196,210197\n210196,211337\n210198,210199\n210201,210202\n210203,210204\n210205,210206\n210207,210208\n210209,210210\n210209,211671\n210211,210212\n210213,210214\n210213,210345\n210215,210216\n210217,210218\n210219,210220\n210221,210222\n210221,210466\n210223,210224\n210225,210226\n210228,210229\n210228,210316\n210230,210231\n210230,210611\n210230,211697\n210232,210233\n210234,210235\n210238,210239\n210241,210242\n210241,210370\n210244,210245\n210248,210249\n210250,210251\n210253,210254\n210253,211190\n210255,210256\n210258,210259\n210260,210261\n210262,210263\n210264,210265\n210266,210267\n210268,210269\n210271,210272\n210275,210276\n210278,210279\n210278,210746\n210280,210281\n210280,210309\n210282,210283\n210282,211589\n210285,210286\n210288,210289\n210290,210291\n210293,210294\n210297,210298\n210299,210300\n210301,210302\n210301,211230\n210303,210304\n210305,210306\n210307,210308\n210310,210311\n210312,210313\n210314,210315\n210314,211795\n210317,210318\n210319,210320\n210322,210323\n210325,210326\n210327,210328\n210327,210350\n210330,210331\n210330,211565\n210333,210334\n210335,210336\n210337,210338\n210337,210504\n210339,210340\n210339,210582\n210339,211375\n210343,210344\n210343,210738\n210343,211494\n210346,210347\n210348,210349\n210351,210352\n210354,210355\n210357,210358\n210359,210360\n210361,210362\n210363,210364\n210365,210366\n210367,210368\n210367,211346\n210371,210372\n210373,210374\n210373,211098\n210375,179170\n210378,210379\n210378,210467\n210381,210382\n210383,210384\n210387,210388\n210390,210391\n210390,211634\n210392,210393\n210394,210395\n210396,210397\n210396,211465\n210399,210400\n210399,210749\n210399,210858\n210399,211686\n210401,210402\n210403,210404\n210410,210411\n210413,210414\n210415,210416\n210417,210418\n210419,210420\n210419,210635\n210421,210422\n210424,210425\n210426,210427\n210428,210429\n210430,210431\n210432,210433\n210432,210947\n210432,211470\n210437,210438\n210437,210813\n210439,210440\n210443,210444\n210446,210447\n210449,210450\n210449,211096\n210451,210452\n210453,210454\n210455,210456\n210457,1085\n210458,210459\n210460,210461\n210462,210463\n210468,210469\n210470,210471\n210472,210473\n210474,210475\n210477,210478\n210477,211388\n210479,210480\n210481,210482\n210481,210543\n210483,210484\n210483,210986\n210485,210486\n210485,211672\n210487,210488\n210487,210966\n210490,210491\n210492,210493\n210495,210496\n210495,211516\n210497,210498\n210500,210501\n210502,210503\n210505,272\n210507,210508\n210509,210510\n210513,210514\n210515,210516\n210515,211366\n210517,210518\n210519,210520\n210521,210522\n210523,210524\n210525,360\n210525,2617\n210526,210527\n210526,210565\n210528,210529\n210530,210531\n210530,211290\n210532,210533\n210532,210930\n210534,210535\n210534,211231\n210537,210538\n210539,210540\n210541,210542\n210545,210546\n210547,210548\n210549,210550\n210549,210851\n210551,210552\n210553,210554\n210555,210556\n210558,210559\n210560,210561\n210562,210563\n210566,210567\n210566,211273\n210569,210570\n210571,210572\n210571,211097\n210573,210574\n210576,210577\n210580,210581\n210583,210584\n210585,210586\n210588,210589\n210588,211241\n210591,210592\n210593,210594\n210595,210596\n210597,210598\n210599,210600\n210601,210602\n210603,210604\n210603,210631\n210603,210711\n210605,210606\n210607,210608\n210609,210610\n210612,210613\n210615,210616\n210617,210618\n210620,210621\n210622,210623\n210622,211035\n210624,210625\n210627,210628\n210633,210634\n210636,210637\n210640,210641\n210642,210643\n210644,210645\n210648,210649\n210650,210651\n210650,210952\n210653,210654\n210655,210656\n210658,210659\n210658,211310\n210661,210662\n210665,210666\n210668,210669\n210670,210671\n210672,210673\n210675,210676\n210677,210678\n210679,210680\n210679,211418\n210681,210682\n210683,210684\n210685,210686\n210687,210688\n210689,210690\n210691,210692\n210691,211761\n210693,210694\n210695,210696\n210697,210698\n210699,210700\n210701,210702\n210703,210704\n210703,211016\n210706,210707\n210706,211147\n210708,210709\n210713,179170\n210715,210716\n210715,211060\n210717,210718\n210717,210823\n210719,210720\n210721,210722\n210723,210724\n210725,210726\n210727,210728\n210729,210730\n210731,210732\n210733,210734\n210733,211678\n210735,210736\n210740,210741\n210740,211420\n210742,210743\n210744,210745\n210751,210752\n210751,210867\n210751,211484\n210751,211547\n210753,210754\n210756,210757\n210759,210760\n210762,210763\n210765,210766\n210767,1381\n210769,210770\n210771,210772\n210775,210776\n210777,210778\n210779,210780\n210781,210782\n210784,210785\n210786,210787\n210789,210790\n210791,210792\n210791,211113\n210793,210794\n210796,210797\n210799,210800\n210801,210802\n210801,211588\n210803,210804\n210805,210806\n210805,211419\n210809,210810\n210811,210812\n210814,210815\n210816,210817\n210818,210819\n210818,211377\n210820,210821\n210820,211119\n210830,210831\n210832,210833\n210834,210835\n210836,210837\n210838,210839\n210838,211172\n210840,210841\n210842,210843\n210842,210939\n210844,210845\n210847,210848\n210849,210850\n210856,210857\n210859,210860\n210859,211749\n210861,210862\n210863,210864\n210865,210866\n210865,211073\n210869,210870\n210871,210872\n210871,211438\n210873,210874\n210875,210876\n210877,210878\n210881,210882\n210884,210885\n210886,210887\n210886,211246\n210888,210889\n210890,210891\n210892,138686\n210893,210894\n210895,210896\n210898,210899\n210901,210902\n210903,210904\n210903,211577\n210905,210906\n210907,210908\n210910,210911\n210910,211685\n210913,210914\n210916,210917\n210918,210919\n210918,211336\n210922,210923\n210924,210925\n210932,210933\n210936,210937\n210940,210941\n210942,210943\n210942,211729\n210945,210946\n210948,210949\n210950,210951\n210953,210954\n210957,210958\n210957,211263\n210959,99\n210960,210961\n210960,211572\n210962,210963\n210964,210965\n210967,210968\n210969,210970\n210971,210972\n210973,344\n210974,210975\n210977,210978\n210981,210982\n210984,210985\n210987,210988\n210989,210990\n210991,210992\n210993,210994\n210998,210999\n211000,211001\n211002,211003\n211005,211006\n211007,211008\n211009,211010\n211011,211012\n211013,211014\n211017,211018\n211019,211020\n211023,211024\n211025,330\n211026,211027\n211029,211030\n211031,211032\n211033,211034\n211039,211040\n211039,211291\n211042,211043\n211045,211046\n211045,211307\n211048,211049\n211050,211051\n211053,211054\n211053,211682\n211057,211058\n211061,211062\n211061,211475\n211063,211064\n211063,211232\n211063,211249\n211065,211066\n211067,211068\n211069,211070\n211071,211072\n211074,211075\n211076,211077\n211078,211079\n211081,211082\n211084,211085\n211086,211087\n211089,211090\n211091,211092\n211094,211095\n211099,211100\n211102,211103\n211105,211106\n211107,211108\n211109,211110\n211111,211112\n211115,211116\n211115,211690\n211117,211118\n211120,211121\n211122,211123\n211124,211125\n211126,211127\n211128,211129\n211130,211131\n211132,211133\n211138,211139\n211140,211141\n211140,211412\n211143,211144\n211145,211146\n211148,211149\n211148,213091\n211151,211152\n211153,211154\n211155,211156\n211159,211160\n211161,211162\n211161,211775\n211163,211164\n211169,211170\n211173,211174\n211175,211176\n211177,211178\n211179,211180\n211179,211614\n211181,211182\n211183,211184\n211185,211186\n211185,211654\n211189,932\n211191,211192\n211194,211195\n211200,211201\n211203,211204\n211205,211206\n211207,211208\n211210,211211\n211212,211213\n211212,211595\n211214,211215\n211216,211217\n211218,211219\n211220,211221\n211222,211223\n211224,211225\n211226,211227\n211233,211234\n211235,211236\n211238,211239\n211242,211243\n211244,211245\n211247,211248\n211250,211251\n211253,211254\n211255,211256\n211255,211432\n211259,211260\n211261,211262\n211264,211265\n211266,211267\n211268,211269\n211270,366\n211274,211275\n211276,211277\n211278,211279\n211284,211285\n211286,211287\n211288,211289\n211292,211293\n211292,211571\n211294,211295\n211296,211297\n211299,211300\n211304,211305\n211311,211312\n211313,211314\n211315,211316\n211317,211318\n211319,211320\n211323,211324\n211325,211326\n211327,1467\n211329,360\n211330,211331\n211332,211333\n211334,211335\n211334,211548\n211344,211345\n211347,211348\n211347,211721\n211350,211351\n211353,211354\n211355,211356\n211360,285\n211361,211362\n211367,211368\n211369,211370\n211371,211372\n211373,211374\n211378,211379\n211380,211381\n211383,211384\n211386,211387\n211389,211390\n211389,211599\n211392,875\n211394,211395\n211394,211617\n211396,211397\n211396,211622\n211399,211400\n211399,213108\n211401,211402\n211403,211404\n211405,211406\n211407,211408\n211410,211411\n211413,211414\n211415,211416\n211421,211422\n211424,211425\n211427,211428\n211430,211431\n211436,211437\n211440,211441\n211442,179170\n211443,211444\n211445,211446\n211448,211449\n211451,211452\n211454,211455\n211456,211457\n211459,211460\n211461,433\n211462,211463\n211466,211467\n211468,211469\n211472,211473\n211476,211477\n211480,211481\n211482,211483\n211485,211486\n211487,211488\n211492,211493\n211495,211496\n211497,211498\n211497,211590\n211499,211500\n211502,211503\n211504,994\n211506,996\n211507,211508\n211507,211648\n211509,211510\n211511,211512\n211513,211514\n211517,211518\n211519,211520\n211524,994\n211526,211527\n211528,211529\n211530,211531\n211535,211536\n211537,211538\n211539,211540\n211541,211542\n211545,211546\n211549,211550\n211551,211552\n211554,211555\n211558,211559\n211563,211564\n211568,211569\n211574,1274\n211575,211576\n211578,211579\n211580,55849\n211581,211582\n211585,211586\n211592,211593\n211596,211597\n211602,211603\n211605,211606\n211608,211609\n211610,211611\n211612,211613\n211615,211616\n211619,211620\n211624,211625\n211626,211627\n211628,211629\n211630,211631\n211630,211763\n211632,211633\n211635,211636\n211637,211638\n211639,211640\n211643,211644\n211645,211646\n211650,211651\n211652,211653\n211655,211656\n211657,211658\n211662,211663\n211664,211665\n211666,211667\n211668,211669\n211673,211674\n211675,211676\n211679,211680\n211683,211684\n211688,211689\n211691,211692\n211694,211695\n211698,211699\n211702,211703\n211704,422\n211705,994\n211706,206\n211708,200\n211709,56\n211710,994\n211712,875\n211713,588\n211713,590\n211714,442\n211715,179170\n211716,44\n211717,171\n211718,346\n211719,1860\n211720,1858\n211723,211724\n211725,211726\n211733,211734\n211735,2867\n211735,2868\n211736,211737\n211738,1452\n211739,211740\n211742,83\n211743,211744\n211746,141912\n211747,211748\n211750,211751\n211753,211754\n211755,211756\n211757,302\n211758,211759\n211762,1085\n211766,211767\n211769,211770\n211771,211772\n211773,211774\n211776,211777\n211779,211780\n211781,360\n211782,211783\n211784,211785\n211786,211787\n211788,211789\n211791,211792\n211793,211794\n211797,366\n211798,347\n211801,211802\n211803,211804\n211805,211806\n211807,211808\n211809,211810\n211811,175\n211812,30\n211813,1983\n211814,55849\n211815,75912\n211817,1019\n211817,1274\n211818,204093\n211819,875\n211820,124668\n211821,346\n211822,406\n211823,3094\n211824,875\n211825,911\n211826,252\n211827,160\n211828,1238\n211829,805\n211830,666\n211831,360\n211832,217\n211833,285\n211834,72\n211835,58\n211836,46\n211837,283\n211838,1718\n211839,179170\n211840,312\n211841,30\n211842,1551\n211843,1465\n211844,37088\n211845,179170\n211846,2626\n211847,1368\n211848,179170\n211849,206\n211851,994\n211852,294\n211853,1983\n211854,163\n211857,55849\n211858,55849\n211859,55849\n211860,55849\n211861,217\n211862,925\n211863,104\n211864,233\n211865,1881\n211866,233\n211867,233\n211868,516\n211869,433\n211870,179170\n211871,1368\n211873,406\n211875,1122\n211876,179170\n211877,406\n211878,660\n211878,1775\n211878,171294\n211879,151\n211880,433\n211881,76096\n211882,1293\n211884,1860\n211885,1858\n211886,1522\n211887,372\n211888,101473\n211889,19\n211889,313\n211889,1571\n211889,1618\n211889,2266\n211889,68173\n211889,211889\n211889,213089\n211889,220928\n211889,221011\n211890,333\n211891,48\n211892,30331\n211893,781\n211894,1132\n211895,1033\n211897,273\n211898,4\n211898,5\n211898,1984\n211899,124668\n211900,781\n211901,1132\n211902,875\n211903,3623\n211905,55849\n211906,714\n211907,2205\n211908,2367\n211909,4260\n211910,30\n211911,162599\n211912,620\n211913,179170\n211914,151\n211915,162599\n211916,3623\n211917,406\n211919,852\n211920,3623\n211921,349\n211921,452\n211921,770\n211921,784\n211923,19010\n211924,1220\n211924,1222\n211925,252\n211926,516\n211927,505\n211927,809\n211928,215\n211929,875\n211930,707\n211931,868\n211932,1235\n211932,1335\n211932,2045\n211932,2209\n211932,3474\n211932,8788\n211932,21711\n211932,29253\n211932,29294\n211933,1127\n211935,28107\n211935,31106\n211935,175486\n211935,196739\n211935,244096\n211937,107\n211938,779\n211939,1515\n211940,433\n211941,1882\n211942,875\n211943,142870\n211944,1294\n211945,3115\n211946,852\n211947,211\n211948,13661\n211949,179170\n211950,2979\n211951,71\n211952,30\n211953,333\n211954,2379\n211955,202\n211956,247\n211957,269\n211958,1033\n211959,2373\n211960,918\n211961,56\n211962,422\n211963,515\n211964,81\n211965,138686\n211966,175\n211967,120\n211968,640\n211969,211970\n211971,663\n211972,1019\n211973,1462\n211973,8537\n211974,233\n211975,920\n211976,149\n211978,1235\n211978,1335\n211978,2045\n211978,2209\n211978,3474\n211978,8788\n211978,21711\n211978,29253\n211978,29294\n211979,255\n211980,784\n211981,356\n211982,620\n211983,1556\n211984,467\n211985,1608\n211986,1132\n211987,1608\n211988,1132\n211990,1612\n211991,861\n211992,1983\n211993,130\n211994,406\n211995,211996\n211997,1140\n211998,302\n211999,151\n212000,843\n212001,920\n212002,6303\n212003,779\n212004,1515\n212005,841\n212006,179170\n212007,179170\n212008,179170\n212009,179170\n212010,1782\n212011,644\n212012,332\n212013,151\n212014,179170\n212015,693\n212015,48955\n212016,179170\n212017,179170\n212018,3474\n212019,1235\n212019,2045\n212019,2209\n212019,3474\n212019,8788\n212019,21711\n212019,29253\n212019,29294\n212020,179170\n212023,911\n212025,248\n212026,333\n212027,19005\n212028,179170\n212029,179170\n212031,1556\n212032,30\n212033,163\n212033,302\n212033,811\n212034,179170\n212035,346\n212036,344\n212037,781\n212038,1132\n212039,859\n212040,212041\n212042,179170\n212043,1608\n212044,102\n212045,1323\n212046,408\n212047,1326\n212049,4571\n212050,1133\n212051,843\n212052,852\n212052,215874\n212053,179170\n212054,179170\n212055,1452\n212056,1458\n212057,1983\n212058,179170\n212059,781\n212060,1132\n212061,1227\n212061,86416\n212062,151\n212063,285\n212064,250\n212064,1684\n212065,261\n212065,212805\n212066,179170\n212067,349\n212068,557\n212069,302\n212071,179170\n212072,358\n212073,72\n212074,83\n212075,179170\n212076,707\n212077,66297\n212078,55849\n212079,212080\n212081,50\n212081,192\n212082,4571\n212084,179170\n212085,861\n212087,179170\n212088,779\n212089,1294\n212090,563\n212091,346\n212093,72\n212094,160\n212095,1474\n212096,212097\n212096,240818\n212098,673\n212099,162599\n212100,668\n212101,30\n212102,72\n212103,344\n212104,285\n212105,54\n212106,663\n212107,596\n212108,873\n212109,179170\n212110,5906\n212111,557\n212112,626\n212113,278\n212114,137\n212115,1298\n212116,309\n212116,310\n212117,862\n212119,54\n212120,509\n212121,3695\n212122,179170\n212123,30\n212124,1707\n212125,1773\n212126,50\n212126,63\n212126,192\n212126,195\n212126,285\n212126,306\n212126,307\n212126,406\n212126,620\n212126,779\n212126,1181\n212126,1515\n212126,5874\n212126,6119\n212127,120\n212128,30\n212129,1001\n212130,58\n212131,994\n212132,46\n212133,34\n212133,35\n212134,328\n212135,920\n212136,179170\n212137,7092\n212138,255\n212139,58\n212140,994\n212141,46\n212142,994\n212143,58\n212144,46\n212145,179170\n212146,104\n212146,557\n212146,885\n212146,1368\n212146,1939\n212146,5405\n212146,13704\n212147,83\n212148,920\n212149,1849\n212150,875\n212151,179170\n212152,179170\n212153,30\n212154,77\n212154,83\n212154,254\n212154,278\n212154,283\n212154,657\n212154,660\n212154,1313\n212154,1363\n212154,1756\n212154,2224\n212154,2421\n212154,2553\n212154,3252\n212154,4039\n212154,6506\n212154,7092\n212155,388\n212156,2116\n212157,179170\n212158,346\n212159,1072\n212160,1707\n212161,179170\n212162,179170\n212163,179170\n212164,379\n212165,289\n212165,290\n212165,94134\n212166,3623\n212167,2045\n212168,83\n212169,179170\n212171,1010\n212172,483\n212173,1844\n212174,577\n212175,1467\n212176,590\n212176,1419\n212180,30\n212181,302\n212182,577\n212183,2373\n212184,179170\n212185,273\n212186,1181\n212187,151\n212188,424\n212189,346\n212190,346\n212191,72\n212192,875\n212193,1033\n212194,179170\n212195,366\n212196,875\n212197,2744\n212198,483\n212199,15807\n212201,142405\n212202,620\n212203,1096\n212204,406\n212206,72\n212207,206059\n212208,779\n212209,1515\n212210,390\n212210,745\n212210,1425\n212210,2590\n212211,30331\n212212,1235\n212212,1335\n212212,2045\n212212,2209\n212212,3474\n212212,8788\n212212,21711\n212212,29253\n212212,29294\n212213,179170\n212214,30\n212215,333\n212216,72\n212217,247\n212218,179170\n212219,269\n212220,1010\n212221,212222\n212223,333\n212224,885\n212224,13704\n212225,287\n212226,581\n212227,179170\n212228,2590\n212229,179170\n212230,179170\n212231,44\n212232,301\n212232,861\n212232,893\n212232,2979\n212233,207\n212235,113156\n212236,240\n212237,30\n212238,240\n212239,83391\n212240,3507\n212241,668\n212242,54\n212243,240\n212244,2620\n212245,240\n212246,340\n212247,340\n212248,1\n212249,1\n212250,1227\n212250,86416\n212251,1227\n212251,86416\n212253,142870\n212254,8180\n212255,179170\n212256,212257\n212258,872\n212259,179170\n212260,1564\n212261,841\n212262,447\n212263,536\n212264,1544\n212265,366\n212266,309\n212266,310\n212267,1453\n212268,138686\n212269,175\n212270,1429\n212271,212272\n212273,212274\n212275,212276\n212277,240\n212278,714\n212279,179170\n212280,1385\n212281,333\n212281,15573\n212282,355\n212283,7358\n212283,7363\n212284,818\n212285,1776\n212286,1133\n212287,433\n212292,1105\n212293,1127\n212294,30\n212294,200\n212295,247\n212296,79\n212296,195\n212296,1904\n212297,1363\n212298,212299\n212300,764\n212301,980\n212302,714\n212302,1962\n212303,1118\n212305,1858\n212306,1860\n212307,4611\n212308,1608\n212309,1132\n212310,779\n212313,663\n212314,4597\n212316,212317\n212318,212319\n212320,147\n212321,1284\n212322,83\n212323,54\n212325,337\n212326,1983\n212327,694\n212328,1556\n212329,1282\n212330,19010\n212331,1531\n212332,392\n212333,206\n212333,1631\n212334,596\n212335,422\n212336,422\n212337,422\n212338,422\n212339,422\n212340,422\n212341,422\n212342,422\n212343,422\n212344,422\n212345,422\n212346,1143\n212347,422\n212348,557\n212349,146952\n212350,179170\n212351,301\n212351,968\n212352,907\n212353,1089\n212353,1566\n212353,16128\n212353,18330\n212353,26976\n212353,29076\n212353,179194\n212353,212353\n212353,212897\n212353,212920\n212353,215416\n212353,226183\n212353,242246\n212354,1359\n212355,212356\n212358,1033\n212359,65\n212361,19010\n212362,841\n212363,4548\n212364,202\n212365,275\n212366,749\n212366,1888\n212367,292\n212367,1177\n212367,1677\n212368,852\n212369,1707\n212370,251\n212371,500\n212372,2775\n212373,1962\n212374,1052\n212375,54\n212376,1882\n212377,406\n212378,41\n212379,911\n212382,920\n212383,346\n212384,4\n212384,5\n212384,107\n212384,1252\n212384,1253\n212384,1381\n212385,178\n212386,2253\n212387,1012\n212389,765\n212389,795\n212389,1001\n212389,16428\n212389,71770\n212389,122692\n212389,178576\n212389,229818\n212389,230289\n212389,232841\n212390,1319\n212391,1132\n212393,312\n212394,781\n212395,1132\n212396,932\n212397,781\n212398,1132\n212399,163\n212400,179170\n212401,283\n212402,743\n212403,781\n212404,1132\n212405,1238\n212406,326\n212407,259\n212408,130\n212409,179170\n212410,2480\n212411,251\n212412,1363\n212412,1590\n212413,44\n212414,3094\n212415,179170\n212416,1274\n212417,1452\n212418,179170\n212419,30\n212420,312\n212421,323\n212422,138686\n212423,2421\n212424,175\n212425,292\n212426,120\n212427,1132\n212428,885\n212428,13704\n212430,259\n212431,1033\n212432,1417\n212433,30\n212434,447\n212435,2775\n212436,179170\n212438,694\n212439,147\n212439,149\n212440,1608\n212441,1132\n212442,30\n212443,602\n212444,387\n212445,251\n212446,1381\n212447,206\n212448,259\n212448,1070\n212449,557\n212450,626\n212452,536\n212453,358\n212454,179170\n212455,849\n212457,30\n212458,509\n212458,723\n212459,83\n212460,1402\n212461,217\n212463,712\n212464,142426\n212466,18618\n212466,20232\n212466,39378\n212466,76038\n212466,145462\n212466,258886\n212467,212468\n212469,304\n212470,304\n212470,1212\n212471,304\n212471,1212\n212472,76096\n212473,200\n212474,301\n212474,968\n212474,189303\n212476,355\n212477,179170\n212478,179170\n212479,1179\n212480,19010\n212481,79\n212482,1132\n212483,1425\n212484,302\n212485,447\n212486,2775\n212489,875\n212490,83\n212491,217\n212492,657\n212493,326\n212494,147\n212494,158\n212495,1782\n212496,179170\n212498,1590\n212498,1805\n212499,740\n212499,741\n212499,232040\n212500,252\n212501,500\n212502,406\n212502,1181\n212504,1381\n212506,503\n212508,483\n212509,500\n212510,2775\n212511,1962\n212512,1052\n212513,54\n212514,1882\n212516,217\n212517,163\n212518,1127\n212518,4190\n212519,811\n212520,649\n212521,760\n212522,179170\n212523,1608\n212524,1132\n212525,104\n212526,179170\n212527,13538\n212528,99\n212528,752\n212529,2867\n212529,2868\n212530,2620\n212531,918\n212532,267\n212534,160\n212535,179170\n212536,1381\n212538,212539\n212543,50\n212544,212545\n212546,3507\n212547,50\n212547,58\n212547,86\n212547,104\n212547,106\n212547,135\n212547,136\n212547,146\n212547,167\n212547,217\n212547,227\n212547,247\n212547,252\n212547,254\n212547,269\n212547,302\n212547,332\n212547,364\n212547,392\n212547,393\n212547,420\n212547,515\n212547,516\n212547,538\n212547,596\n212547,636\n212547,644\n212547,720\n212547,779\n212547,907\n212547,968\n212547,1007\n212547,1085\n212547,1179\n212547,1363\n212547,1381\n212547,1453\n212547,1467\n212547,1522\n212547,1544\n212547,1608\n212547,1715\n212547,1818\n212547,1837\n212547,2083\n212547,2105\n212547,2191\n212547,2620\n212547,2931\n212547,3003\n212547,3367\n212547,4355\n212547,5405\n212547,5718\n212547,6119\n212547,55849\n212547,92476\n212547,141912\n212548,79\n212549,358\n212550,408\n212551,596\n212552,179170\n212553,119\n212553,326\n212553,415\n212553,483\n212553,577\n212553,760\n212553,784\n212553,996\n212553,2116\n212554,1983\n212555,30\n212556,187176\n212557,72\n212558,79\n212559,179170\n212560,1235\n212560,1335\n212561,3209\n212563,179170\n212564,392\n212565,694\n212566,626\n212567,264\n212568,63\n212570,467\n212571,918\n212572,907\n212574,302\n212576,392\n212577,1983\n212578,72\n212579,30\n212580,138686\n212581,175\n212582,1400\n212583,422\n212583,4597\n212583,5405\n212584,212585\n212586,212585\n212587,212585\n212588,77\n212589,252\n212590,158\n212591,1220\n212591,1222\n212592,516\n212593,510\n212594,58\n212595,1363\n212596,392\n212597,1368\n212598,1983\n212599,485\n212599,918\n212599,4678\n212599,227669\n212600,158\n212601,663\n212601,3094\n212602,3115\n212603,1309\n212604,248\n212605,179170\n212607,1749\n212608,2528\n212609,179170\n212610,212611\n212612,222\n212613,285\n212614,179170\n212615,805\n212616,179170\n212617,217\n212618,48\n212619,179170\n212620,275\n212620,760\n212620,1175\n212620,1265\n212620,1266\n212620,1631\n212620,1927\n212620,215276\n212621,918\n212622,99\n212623,920\n212624,179170\n212625,179170\n212626,233\n212627,640\n212628,179170\n212629,697\n212630,973\n212631,1181\n212632,919\n212633,179170\n212634,1572\n212635,1805\n212636,313\n212637,389\n212638,1122\n212639,1474\n212640,151\n212641,516\n212642,1769\n212643,1556\n212645,30\n212646,1033\n212647,4594\n212648,2116\n212649,179170\n212650,211\n212651,247\n212652,1556\n212653,1368\n212654,30\n212655,83\n212657,2572\n212658,179170\n212659,179170\n212660,392\n212661,1220\n212661,1222\n212662,516\n212663,252\n212664,620\n212665,872\n212665,1001\n212666,515\n212667,50\n212668,179170\n212669,406\n212670,991\n212671,1\n212672,179170\n212673,346\n212674,4545\n212674,56150\n212675,72\n212676,389\n212677,875\n212678,255\n212679,202\n212680,1515\n212681,779\n212682,252\n212683,1326\n212684,102\n212685,1323\n212686,408\n212687,973\n212688,179170\n212689,3370\n212690,179170\n212691,7358\n212691,7363\n212692,1085\n212692,58503\n212692,75912\n212692,175903\n212692,212692\n212692,238233\n212692,241707\n212692,261821\n212693,333\n212695,302\n212696,30\n212697,3507\n212699,217\n212700,179170\n212701,179170\n212702,818\n212702,72439\n212703,1149\n212705,225\n212706,483\n212707,861\n212708,212709\n212710,68069\n212712,994\n212713,179170\n212714,6424\n212715,142870\n212716,43203\n212717,649\n212718,179170\n212719,1085\n212720,179170\n212721,179170\n212722,158\n212723,577\n212724,302\n212725,97\n212726,8270\n212727,151\n212728,301\n212729,1985\n212730,861\n212731,1531\n212732,366\n212733,1298\n212734,1616\n212735,557\n212736,34\n212736,1776\n212737,862\n212738,2373\n212739,179170\n212740,1001\n212741,34\n212741,35\n212742,1608\n212743,1132\n212744,330\n212745,137\n212746,247\n212747,330\n212748,949\n212749,83\n212750,107\n212751,1284\n212753,406\n212754,536\n212755,34\n212755,35\n212756,333\n212757,179170\n212758,200\n212759,1033\n212760,179170\n212761,184\n212762,151\n212763,563\n212764,1298\n212765,841\n212766,38634\n212767,54\n212768,991\n212769,175\n212770,179170\n212771,1188\n212772,179170\n212773,1305\n212774,294\n212775,1511\n212775,3069\n212776,347\n212777,5265\n212778,285\n212779,30\n212780,179170\n212781,3\n212782,212783\n212784,1515\n212785,158\n212786,189839\n212787,179170\n212788,179170\n212789,179170\n212790,179170\n212791,304\n212792,516\n212793,72\n212794,179170\n212795,994\n212796,920\n212797,1\n212798,1608\n212799,1132\n212800,134\n212801,179170\n212802,7416\n212803,435\n212804,83\n212806,179170\n212807,30331\n212808,346\n212809,30\n212810,192\n212811,366\n212812,83\n212813,179170\n212814,29380\n212815,932\n212816,287\n212817,107\n212818,843\n212819,1285\n212820,254\n212821,1220\n212821,1222\n212822,516\n212823,252\n212824,2735\n212825,269\n212826,1319\n212827,22\n212828,212829\n212830,3623\n212831,212832\n212833,2750\n212834,138686\n212835,175\n212836,179170\n212837,179170\n212838,1235\n212838,1335\n212839,179170\n212840,3370\n212840,14453\n212841,179170\n212842,140\n212843,392\n212844,19010\n212845,54\n212845,278\n212845,1019\n212845,2424\n212846,623\n212846,1805\n212847,874\n212848,1243\n212849,663\n212850,1631\n212851,83\n212852,1133\n212853,346\n212854,83\n212855,212856\n212857,2744\n212858,142405\n212859,872\n212860,1634\n212861,72\n212862,1181\n212863,862\n212864,631\n212865,285\n212866,250\n212866,1684\n212867,50\n212868,72\n212869,147\n212869,184\n212869,602\n212869,1821\n212869,2528\n212869,4455\n212869,21736\n212870,212871\n212872,1467\n212873,455\n212874,2424\n212875,72\n212876,1871\n212877,83\n212878,13980\n212879,2421\n212880,179170\n212881,649\n212882,269\n212883,2590\n212884,5366\n212885,2590\n212886,1544\n212887,1544\n212889,1465\n212890,5212\n212891,589\n212891,1001\n212891,1474\n212891,44725\n212892,355\n212893,518\n212894,934\n212895,202\n212896,4190\n212898,50\n212899,1285\n212899,1309\n212900,145240\n212901,4190\n212903,76096\n212904,163\n212905,481\n212906,240\n212907,1707\n212908,760\n212908,1149\n212908,1631\n212909,50\n212910,1238\n212911,147\n212911,158\n212914,34\n212914,83\n212914,389\n212914,818\n212914,1069\n212914,3810\n212914,6012\n212914,22808\n212914,32994\n212914,113585\n212914,181063\n212914,188791\n212914,190492\n212914,193101\n212914,215825\n212914,222389\n212914,225294\n212914,225295\n212914,235558\n212914,236788\n212914,245280\n212914,245524\n212914,250730\n212914,258029\n212914,261306\n212915,30\n212917,298\n212918,146\n212918,92476\n212919,1566\n212922,422\n212923,422\n212924,422\n212925,422\n212926,422\n212927,387\n212928,422\n212929,422\n212930,422\n212932,422\n212933,422\n212934,422\n212935,422\n212936,2421\n212937,392\n212938,283\n212939,2416\n212939,2417\n212940,2671\n212941,1381\n212942,1544\n212943,4611\n212944,1118\n212945,872\n212946,179170\n212947,63\n212947,1175\n212947,3218\n212948,1544\n212949,4611\n212950,1544\n212951,4611\n212952,1132\n212953,781\n212954,920\n212956,1544\n212957,4611\n212958,1949\n212959,19443\n212960,2367\n212961,77\n212962,868\n212963,2735\n212964,1544\n212965,4611\n212966,310\n212966,3039\n212967,346\n212968,111142\n212970,1151\n212971,1133\n212972,1860\n212973,1858\n212974,425\n212976,283\n212977,58\n212978,994\n212979,46\n212980,55849\n212981,179170\n212982,179170\n212984,151\n212985,55849\n212986,450\n212987,346\n212988,55849\n212989,179170\n212990,859\n212992,1400\n212993,179170\n212994,3967\n212996,273\n212996,1116\n212998,179170\n212999,68\n213000,920\n213001,58\n213002,994\n213003,46\n213004,179170\n213005,179170\n213007,1509\n213008,4611\n213009,2191\n213011,179170\n213012,302\n213013,781\n213014,1132\n213015,179170\n213016,2867\n213016,2868\n213017,1019\n213018,1381\n213019,285\n213020,179170\n213021,83\n213022,14434\n213023,44\n213024,4355\n213025,179170\n213026,3367\n213027,3623\n213028,179170\n213029,204093\n213031,138686\n213032,175\n213033,72\n213034,179170\n213035,818\n213036,71\n213037,179170\n213038,3623\n213039,6556\n213040,252\n213041,994\n213042,1544\n213043,4611\n213044,179170\n213046,2367\n213047,179170\n213048,104\n213048,1749\n213049,596\n213051,120\n213052,304\n213053,204093\n213054,255\n213055,693\n213056,1984\n213057,596\n213057,1368\n213058,3623\n213059,1096\n213060,302\n213061,344\n213062,346\n213063,489\n213064,1381\n213065,302\n213065,1127\n213066,189303\n213067,179170\n213068,55849\n213069,1284\n213070,151\n213071,179170\n213072,179170\n213073,179170\n213074,179170\n213075,1181\n213076,151\n213077,575\n213078,781\n213079,1132\n213080,694\n213081,818\n213082,505\n213082,1262\n213082,111142\n213085,179170\n213087,1252\n213087,1253\n213088,213089\n213089,19\n213089,278\n213089,313\n213089,455\n213089,657\n213089,2159\n213089,2424\n213089,7768\n213089,16406\n213089,21435\n213089,28511\n213089,101735\n213089,125242\n213089,131216\n213089,145407\n213089,195735\n213089,211889\n213089,213088\n213089,216344\n213089,217650\n213089,217655\n213089,218484\n213089,220290\n213089,220713\n213089,221440\n213089,230075\n213089,235057\n213089,241776\n213089,242260\n213089,242754\n213089,243990\n213089,244001\n213089,247981\n213090,179170\n213092,213093\n213094,213095\n213097,213098\n213099,213100\n213101,213102\n213104,213105\n213106,213107\n213109,213110\n213111,213112\n213114,213115\n213116,213117\n213119,213120\n213121,213122\n213123,213124\n213126,213127\n213128,213129\n213130,213131\n213132,213133\n213135,213136\n213137,213138\n213139,213140\n213143,213144\n213145,1769\n213146,1544\n213147,4611\n213148,1019\n213149,179170\n213150,179170\n213152,389\n213153,718\n213155,1149\n213156,104\n213157,1116\n213158,79\n213159,1085\n213160,1381\n213161,217\n213162,1544\n213163,4611\n213164,213165\n213166,1749\n213167,149\n213168,179170\n213169,217\n213169,222\n213169,1419\n213170,4190\n213172,4190\n213173,1210\n213174,179170\n213176,179170\n213177,158\n213178,1132\n213179,1608\n213180,622\n213181,5212\n213182,388\n213182,510\n213183,179170\n213184,179170\n213185,1531\n213186,179170\n213187,2436\n213188,299\n213189,424\n213190,424\n213191,932\n213192,387\n213193,1801\n213194,447\n213195,2775\n213196,1368\n213197,356\n213198,158\n213199,1252\n213199,1253\n213200,217\n213201,1359\n213202,925\n213203,392\n213204,1801\n213205,1381\n213206,1688\n213207,179170\n213208,4060\n213209,115\n213210,302\n213210,861\n213210,893\n213210,1374\n213211,41\n213212,346\n213213,1181\n213213,1392\n213214,736\n213215,1085\n213216,1531\n213217,83\n213218,179170\n213219,918\n213220,360\n213222,605\n213223,843\n213224,918\n213225,346\n213225,424\n213226,1181\n213227,179170\n213228,779\n213229,138686\n213230,175\n213231,73570\n213232,1181\n213233,349\n213234,179170\n213235,179170\n213236,179170\n213237,86\n213237,167\n213237,301\n213237,783\n213237,968\n213237,973\n213237,1293\n213237,1837\n213237,2083\n213237,3207\n213237,5301\n213239,515\n213240,179170\n213241,140\n213242,179170\n213243,30\n213244,1381\n213245,178\n213246,1359\n213247,251\n213248,140\n213250,195\n213251,179170\n213252,1467\n213253,140\n213255,467\n213256,83\n213256,278\n213257,1359\n213258,151\n213259,328\n213260,136\n213261,30\n213262,1359\n213263,264\n213263,1381\n213264,83\n213265,3623\n213267,760\n213268,392\n213269,2083\n213270,1390\n213271,818\n213272,142870\n213274,179170\n213275,349\n213276,1326\n213277,408\n213278,102\n213279,1323\n213280,179170\n213281,994\n213282,151\n213283,179170\n213284,918\n213285,3\n213285,44\n213285,233\n213286,142433\n213287,808\n213288,269\n213289,875\n213290,50\n213291,72\n213292,1132\n213293,781\n213294,3\n213295,30\n213296,158\n213297,44\n213298,949\n213299,2373\n213300,356\n213301,1309\n213302,252\n213302,333\n213302,406\n213302,602\n213303,809\n213304,79\n213305,980\n213306,332\n213307,179170\n213308,328\n213309,2646\n213310,179170\n213311,278\n213312,179170\n213313,179170\n213314,302\n213315,179170\n213316,79\n213317,158\n213318,1572\n213319,2083\n213320,861\n213321,32475\n213322,1688\n213323,1238\n213324,424\n213325,516\n213326,731\n213327,1452\n213328,1085\n213329,213330\n213331,213330\n213332,179170\n213333,179170\n213334,330\n213335,406\n213336,138\n213337,865\n213338,557\n213339,137\n213340,4597\n213341,179170\n213342,88820\n213343,309\n213343,310\n213344,55849\n213345,10\n213346,213347\n213346,219108\n213346,241756\n213348,781\n213349,1132\n213350,2620\n213351,179170\n213352,179170\n213353,179170\n213354,83\n213355,1773\n213356,663\n213357,179170\n213358,179170\n213359,707\n213360,179170\n213361,516\n213362,255\n213364,179170\n213365,1113\n213366,213367\n213369,179170\n213370,843\n213371,179170\n213372,2782\n213373,179170\n213374,626\n213375,328\n213376,179170\n213377,493\n213378,179170\n213379,2191\n213379,3194\n213380,557\n213381,179170\n213382,1282\n213383,179170\n213384,179170\n213385,179170\n213386,142430\n213387,179170\n213388,5034\n213389,179170\n213390,1860\n213391,1858\n213392,179170\n213393,179170\n213394,179170\n213395,179170\n213396,346\n213397,841\n213399,211\n213400,179170\n213401,138686\n213402,175\n213403,2590\n213404,1718\n213405,179170\n213406,179170\n213408,213409\n213410,850\n213411,155481\n213412,424\n213413,213414\n213415,346\n213416,9025\n213417,285\n213418,387\n213419,225\n213420,1474\n213421,673\n213422,483\n213423,3623\n213424,137\n213425,8884\n213426,1085\n213427,213428\n213429,805\n213430,1544\n213431,8270\n213432,58\n213433,213434\n213435,179170\n213436,151\n213437,355\n213438,2073\n213439,682\n213439,72439\n213440,179170\n213442,1773\n213443,1773\n213446,1414\n213447,420\n213448,213449\n213450,1860\n213451,1858\n213454,83\n213456,211\n213457,1860\n213458,1858\n213459,872\n213460,213461\n213462,302\n213463,1531\n213464,179170\n213465,179170\n213466,179170\n213467,213468\n213469,355\n213470,83\n213471,44\n213472,83\n213473,193486\n213475,3612\n213477,195\n213478,213479\n213480,707\n213481,179170\n213482,1381\n213483,213484\n213485,213484\n213486,213484\n213487,1773\n213488,781\n213489,1132\n213490,640\n213491,772\n213492,34\n213492,20813\n213493,1133\n213494,259\n213495,337\n213496,1014\n213497,1014\n213498,1014\n213499,1014\n213500,30\n213501,1381\n213502,389\n213503,83\n213504,358\n213505,106\n213505,175\n213505,620\n213505,21442\n213505,25531\n213505,27008\n213505,99787\n213505,225147\n213506,1287\n213507,1381\n213508,34\n213508,35\n213509,2373\n213510,142409\n213510,146280\n213511,30\n213512,439\n213513,360\n213514,346\n213515,818\n213516,872\n213517,151\n213518,483\n213519,337\n213520,179170\n213521,97\n213521,15119\n213522,841\n213523,179170\n213525,3321\n213526,1253\n213526,5440\n213527,424\n213528,932\n213529,640\n213530,2572\n213532,1\n213533,1453\n213534,1359\n213535,687\n213537,179170\n213538,179170\n213539,1058\n213540,151\n213542,155481\n213543,179170\n213544,79\n213545,138686\n213546,175\n213547,247\n213548,718\n213549,1220\n213549,1222\n213550,252\n213551,251\n213552,179170\n213553,1634\n213554,994\n213555,516\n213556,2116\n213557,1052\n213558,179170\n213559,273\n213560,240\n213561,4678\n213562,10\n213563,1167\n213564,179170\n213565,1479\n213566,179170\n213567,390\n213568,179170\n213569,2048\n213570,179170\n213571,1381\n213572,179170\n213573,179170\n213574,179170\n213575,179170\n213576,179170\n213577,179170\n213578,179170\n213579,179170\n213580,179170\n213581,213582\n213583,179170\n213584,179170\n213585,179170\n213586,577\n213587,179170\n213588,179170\n213589,213590\n213591,179170\n213592,1381\n213593,213594\n213595,179170\n213596,255\n213598,113156\n213599,179170\n213600,179170\n213601,213602\n213603,179170\n213604,179170\n213605,117\n213605,2712\n213606,179170\n213607,1294\n213608,54\n213610,187\n213611,346\n213612,1313\n213613,2017\n213614,179170\n213615,179170\n213616,179170\n213617,179170\n213618,179170\n213619,213620\n213621,179170\n213622,179170\n213623,972\n213624,213625\n213627,7155\n213628,104\n213629,179170\n213630,1012\n213631,213632\n213633,213634\n213635,22\n213636,179170\n213637,179170\n213638,147\n213639,1773\n213641,213642\n213643,366\n213644,366\n213645,366\n213646,179170\n213647,213648\n213649,213650\n213649,233665\n213651,1\n213652,213653\n213654,213654\n213655,285\n213656,179170\n213657,151\n213658,1544\n213659,4571\n213660,30\n213661,107\n213662,2416\n213662,2417\n213663,292\n213664,338\n213665,298\n213666,1133\n213667,3538\n213669,1119\n213670,22\n213670,417\n213670,577\n213670,1635\n213670,37759\n213671,285\n213672,3846\n213673,275\n213674,2048\n213675,213676\n213677,250\n213677,1684\n213678,213679\n213681,2784\n213682,83\n213683,30331\n213685,213686\n213687,485\n213688,213689\n213690,179170\n213691,406\n213692,703\n213693,179170\n213694,179170\n213695,151\n213696,1531\n213697,179170\n213698,1238\n213699,149534\n213700,179170\n213701,1452\n213702,213703\n213705,41\n213706,179170\n213708,213709\n213710,179170\n213712,179170\n213713,179170\n213714,79\n213715,336\n213716,2590\n213717,275\n213718,1368\n213721,2620\n213723,1282\n213724,83\n213725,120\n213725,1466\n213726,743\n213727,652\n213729,516\n213730,83\n213731,187\n213732,261\n213732,2868\n213733,1133\n213734,19227\n213737,83\n213738,213739\n213740,1227\n213740,86416\n213743,85275\n213744,22\n213745,647\n213746,34\n213746,35\n213746,313\n213747,83\n213749,1985\n213750,167\n213751,1181\n213752,167\n213753,179170\n213754,4597\n213755,167\n213757,83\n213758,1010\n213759,4691\n213759,18726\n213760,581\n213762,1564\n213763,1429\n213764,269\n213765,801\n213766,1117\n213767,142870\n213768,2367\n213769,346\n213770,707\n213771,179170\n213772,148412\n213773,179170\n213774,138686\n213775,175\n213776,72\n213777,312\n213778,4355\n213779,23783\n213780,2867\n213780,2868\n213781,272\n213783,30\n213784,79\n213785,2979\n213786,273\n213787,634\n213788,8855\n213789,107\n213790,503\n213791,147\n213791,158\n213792,200\n213793,179170\n213794,179170\n213795,179170\n213796,167\n213796,3218\n213797,54\n213798,1227\n213798,86416\n213799,302\n213801,668\n213802,30\n213803,557\n213804,557\n213805,1722\n213806,557\n213807,309\n213807,310\n213808,483\n213809,207\n213810,515\n213811,79\n213812,1227\n213812,86416\n213813,493\n213814,202\n213815,158\n213817,843\n213818,875\n213819,83\n213820,140\n213820,515\n213821,707\n213822,932\n213822,972\n213823,298\n213824,485\n213825,707\n213826,707\n213827,32\n213827,392\n213827,509\n213827,644\n213827,697\n213827,809\n213827,1143\n213827,1240\n213827,1363\n213827,1454\n213827,1465\n213827,1858\n213827,1955\n213827,2274\n213827,2697\n213827,2699\n213827,4903\n213827,24763\n213827,76096\n213828,4637\n213829,485\n213830,298\n213831,179170\n213832,1983\n213833,2506\n213834,143287\n213835,179170\n213836,143287\n213837,179170\n213838,872\n213839,872\n213840,143287\n213841,577\n213842,273\n213843,1033\n213844,13\n213845,142473\n213846,312\n213847,179170\n213848,55849\n213849,620\n213850,406\n213851,6027\n213852,358\n213854,366\n213855,366\n213856,779\n213857,1515\n213858,333\n213859,346\n213860,1511\n213860,3069\n213861,1033\n213862,312\n213863,72\n213864,213865\n213866,1821\n213866,21736\n213867,631\n213868,620\n213869,406\n213870,779\n213871,1515\n213872,1140\n213873,23701\n213874,179170\n213875,2868\n213875,19227\n213876,211\n213876,290\n213876,1235\n213876,94134\n213877,1001\n213878,34\n213878,1776\n213879,8330\n213880,1133\n213881,918\n213881,1634\n213882,333\n213883,179170\n213884,213885\n213886,2045\n213887,54\n213888,333\n213889,30\n213890,1294\n213891,213892\n213893,1\n213894,83\n213895,179170\n213897,439\n213897,671\n213898,872\n213899,292\n213900,213901\n213902,294\n213903,296\n213904,298\n213905,184\n213906,1634\n213907,146\n213907,779\n213907,92476\n213908,213909\n213910,213911\n213910,235199\n213912,1544\n213913,21442\n213914,108073\n213915,301\n213916,213917\n213918,424\n213919,4691\n213920,1432\n213921,213922\n213923,283\n213923,455\n213923,536\n213923,1419\n213923,1466\n213923,1467\n213924,145240\n213925,213926\n213927,1634\n213928,83\n213929,360\n213930,2931\n213931,28107\n213932,647\n213933,213934\n213935,213936\n213938,1474\n213940,72\n213943,309\n213943,310\n213944,213945\n213946,1801\n213947,251\n213947,356\n213948,83\n213949,337\n213950,83\n213950,1068\n213951,485\n213952,298\n213953,167\n213953,877\n213953,1045\n213953,213954\n213953,214197\n213953,216627\n213954,805\n213954,1631\n213956,859\n213957,213958\n213959,337\n213959,1085\n213961,213962\n213963,1143\n213964,707\n213967,2944\n213968,2572\n213969,189303\n213970,707\n213971,1238\n213972,273\n213973,19010\n213974,697\n213974,3260\n213975,30\n213976,726\n213977,22\n213978,3\n213979,186\n213980,360\n213980,4571\n213981,209\n213982,707\n213984,1544\n213986,4611\n213987,213988\n213989,190492\n213990,717\n213991,213992\n213993,22\n213994,707\n213995,189303\n213996,707\n213997,140\n213998,63\n213998,107\n213998,137\n213998,415\n213998,473\n213998,483\n213998,649\n213998,932\n213998,1212\n213998,1359\n213998,1509\n213998,2089\n213998,2224\n213998,2315\n213998,2940\n213998,4220\n213998,5405\n213998,44725\n213998,60576\n213998,66297\n213998,75912\n213998,124668\n213998,185877\n214000,13538\n214001,760\n214001,14080\n214001,20301\n214001,32530\n214001,118020\n214001,247781\n214002,868\n214003,179170\n214004,48505\n214005,949\n214007,73570\n214008,1127\n214009,275\n214010,694\n214011,214012\n214013,1043\n214013,42220\n214015,167\n214016,557\n214017,254\n214019,298\n214020,485\n214021,209\n214023,673\n214024,55849\n214025,360\n214026,920\n214027,214028\n214029,83\n214030,192\n214030,240\n214032,214033\n214034,2784\n214035,202\n214036,809\n214037,485\n214038,298\n214039,103860\n214040,1860\n214041,1858\n214042,1294\n214044,861\n214045,1381\n214046,158\n214047,415\n214048,1769\n214049,392\n214049,467\n214050,44\n214051,707\n214053,1983\n214054,1058\n214055,1132\n214056,972\n214057,1082\n214058,1983\n214059,6119\n214060,214060\n214061,3804\n214062,1238\n214063,355\n214064,167\n214065,718\n214066,1452\n214067,83\n214068,217\n214069,167\n214070,1773\n214071,6556\n214072,467\n214073,1210\n214074,4223\n214075,707\n214076,13661\n214077,868\n214078,209\n214079,189303\n214080,994\n214081,1836\n214083,54\n214084,1608\n214085,1191\n214085,1192\n214085,1844\n214086,809\n214087,972\n214088,338\n214089,1191\n214090,1224\n214091,204093\n214093,934\n214095,698\n214096,204093\n214097,1707\n214098,1181\n214099,1132\n214100,1608\n214101,3193\n214102,422\n214104,818\n214106,1033\n214108,707\n214109,206\n214110,14434\n214111,4771\n214112,907\n214113,4190\n214113,187176\n214115,818\n214116,207045\n214117,843\n214118,818\n214119,718\n214120,2353\n214121,19010\n214123,907\n214124,1860\n214125,1858\n214126,83\n214127,707\n214128,252\n214129,781\n214130,1132\n214131,623\n214131,685\n214131,1805\n214131,102695\n214131,128704\n214131,189834\n214131,206189\n214131,215965\n214131,217519\n214131,217846\n214131,218534\n214132,7416\n214133,843\n214136,55849\n214137,620\n214139,920\n214140,10\n214141,406\n214143,3555\n214144,1381\n214145,146\n214145,92476\n214146,647\n214147,344\n214148,647\n214149,344\n214150,146\n214150,92476\n214151,877\n214152,106\n214153,1309\n214155,779\n214156,1515\n214157,1749\n214158,179170\n214159,467\n214161,877\n214163,83\n214164,204093\n214165,138686\n214166,1659\n214167,392\n214168,175\n214169,54\n214170,406\n214170,620\n214171,214172\n214173,179170\n214174,516\n214176,485\n214177,298\n214178,83\n214179,5405\n214180,2105\n214181,1769\n214182,179170\n214183,1551\n214185,302\n214185,893\n214186,1612\n214187,34\n214187,35\n214187,347\n214187,372\n214187,2812\n214187,5718\n214187,9024\n214188,818\n214188,191860\n214189,160\n214191,146\n214191,92476\n214192,647\n214193,344\n214194,55849\n214196,577\n214197,127158\n214197,207045\n214197,213953\n214198,333\n214199,467\n214199,1151\n214200,485\n214201,843\n214202,252\n214202,1220\n214202,1222\n214203,302\n214204,179170\n214205,273\n214206,214207\n214208,707\n214209,707\n214210,1240\n214211,146\n214211,92476\n214212,647\n214213,344\n214214,273\n214215,707\n214216,596\n214217,269\n214218,818\n214219,179170\n214220,707\n214221,1224\n214222,1082\n214223,167\n214224,167\n214225,1860\n214226,1858\n214227,83\n214228,994\n214229,861\n214230,1220\n214230,1222\n214231,252\n214232,251\n214234,515\n214235,2421\n214236,179170\n214237,392\n214237,24763\n214238,422\n214239,56\n214240,6754\n214240,115440\n214241,83\n214242,179170\n214243,30\n214244,422\n214245,56\n214246,1284\n214247,30\n214248,918\n214249,30\n214251,240\n214251,261\n214252,272\n214253,19010\n214254,3447\n214255,422\n214256,422\n214257,68\n214258,422\n214259,269\n214260,6303\n214261,1556\n214262,592\n214263,1220\n214263,1222\n214264,252\n214265,516\n214266,50\n214266,158\n214266,192\n214266,406\n214266,779\n214266,1515\n214268,389\n214269,192\n214270,1551\n214271,179170\n214272,406\n214272,620\n214273,967\n214273,1849\n214273,4114\n214273,4411\n214273,7530\n214273,18490\n214273,18970\n214273,38299\n214273,214277\n214273,216063\n214273,224076\n214273,233463\n214273,234875\n214273,244105\n214274,68\n214275,151\n214276,179170\n214278,179170\n214279,861\n214280,493\n214281,852\n214282,4611\n214283,1544\n214284,392\n214285,422\n214286,422\n214287,202\n214288,422\n214289,422\n214290,422\n214291,179170\n214292,422\n214293,422\n214294,1326\n214295,1323\n214296,102\n214297,408\n214298,919\n214299,422\n214300,179170\n214301,422\n214302,113156\n214303,179170\n214304,8270\n214305,179170\n214306,1181\n214307,852\n214308,273\n214309,3258\n214310,189303\n214311,23783\n214312,148412\n214313,179170\n214314,312\n214315,1220\n214315,1222\n214316,179170\n214317,2436\n214318,248\n214319,179170\n214320,2105\n214321,179170\n214322,356\n214322,852\n214323,3623\n214324,1707\n214325,179170\n214326,811\n214326,980\n214326,1782\n214326,3218\n214327,3623\n214328,179170\n214329,285\n214330,1309\n214331,843\n214332,779\n214333,862\n214334,179170\n214335,240\n214336,592\n214337,179170\n214339,6303\n214340,179170\n214341,1127\n214342,406\n214343,179170\n214344,392\n214345,247\n214346,252\n214347,251\n214348,1220\n214348,1222\n214349,179170\n214350,200\n214351,179170\n214352,179170\n214353,30\n214354,994\n214355,1544\n214356,4611\n214357,694\n214357,1240\n214358,779\n214359,30\n214360,179170\n214361,179170\n214362,8798\n214363,167\n214365,158\n214366,255\n214367,273\n214368,179170\n214369,366\n214370,167\n214371,179170\n214372,167\n214373,167\n214374,147\n214374,1458\n214374,80266\n214375,179170\n214376,707\n214377,189794\n214378,433\n214379,1983\n214380,214381\n214382,179170\n214383,147\n214384,167\n214385,179170\n214386,5405\n214387,179170\n214388,87\n214389,214390\n214391,189303\n214392,781\n214393,1132\n214395,30\n214397,1544\n214398,671\n214399,588\n214399,590\n214400,167\n214401,392\n214401,1240\n214402,30\n214403,852\n214404,167\n214405,3260\n214407,326\n214408,2373\n214409,30\n214410,483\n214411,581\n214412,167\n214413,167\n214414,167\n214415,957\n214415,1815\n214416,247\n214417,1381\n214418,151\n214419,179170\n214420,1749\n214421,240\n214422,179170\n214423,358\n214424,843\n214425,72\n214426,167\n214428,1289\n214429,63\n214429,1634\n214430,1571\n214431,1888\n214432,30331\n214433,707\n214434,859\n214435,179170\n214436,179170\n214437,179170\n214438,179170\n214439,179170\n214440,179170\n214441,179170\n214442,1769\n214443,406\n214445,179170\n214446,707\n214447,596\n214448,596\n214449,596\n214450,179170\n214451,179170\n214452,994\n214453,250\n214453,1684\n214454,179170\n214455,179170\n214456,994\n214457,298\n214458,994\n214459,179170\n214460,2506\n214463,707\n214464,818\n214465,707\n214466,158\n214466,1893\n214466,5547\n214467,179170\n214468,1238\n214469,1509\n214470,179170\n214471,214472\n214473,179170\n214474,179170\n214475,192\n214475,272\n214476,779\n214477,4611\n214478,422\n214479,179170\n214480,179170\n214481,138686\n214482,175\n214483,179170\n214484,275\n214485,302\n214485,344\n214486,310\n214486,3039\n214487,516\n214488,179170\n214489,38634\n214490,179170\n214491,167\n214492,167\n214493,167\n214494,167\n214495,356\n214496,179170\n214497,1227\n214497,86416\n214498,30\n214499,1282\n214500,292\n214500,442\n214500,609\n214501,349\n214502,30236\n214503,397\n214504,1556\n214504,142430\n214505,1241\n214506,214507\n214508,269\n214509,137\n214510,167\n214511,179170\n214512,179170\n214513,179170\n214514,2266\n214515,179170\n214516,137\n214517,1531\n214518,179170\n214519,179170\n214520,179170\n214521,843\n214522,179170\n214523,337\n214523,338\n214523,393\n214523,439\n214523,626\n214523,649\n214523,772\n214523,1381\n214523,2367\n214524,920\n214525,155481\n214526,779\n214527,2073\n214528,192\n214529,862\n214529,2590\n214531,752\n214531,17263\n214532,340\n214533,1\n214534,1305\n214534,2701\n214535,179170\n214536,285\n214537,491\n214538,179170\n214539,588\n214539,590\n214540,1453\n214541,1544\n214542,1590\n214543,30\n214544,113156\n214545,214546\n214545,219566\n214547,636\n214548,83\n214550,1177\n214551,872\n214553,874\n214554,344\n214555,567\n214556,179170\n214557,392\n214558,3830\n214559,13919\n214560,1454\n214561,214562\n214561,226956\n214563,278\n214565,346\n214566,818\n214567,366\n214568,424\n214569,366\n214570,818\n214571,2590\n214572,356\n214574,779\n214575,10\n214576,46\n214576,744\n214577,1130\n214579,781\n214580,1132\n214581,192522\n214582,138686\n214583,175\n214584,818\n214585,179170\n214586,818\n214587,818\n214588,302\n214588,893\n214589,781\n214590,1132\n214591,634\n214592,781\n214593,1132\n214594,179170\n214595,333\n214597,818\n214598,179170\n214599,179170\n214600,781\n214601,1132\n214602,158\n214603,366\n214604,1381\n214605,189303\n214606,3623\n214607,56\n214608,422\n214609,818\n214610,214611\n214612,1608\n214613,1132\n214614,491\n214615,1769\n214616,3623\n214617,1556\n214618,30\n214620,392\n214621,141912\n214622,254\n214623,392\n214624,2944\n214626,1019\n214627,433\n214628,179170\n214629,147\n214631,538\n214631,190492\n214632,214633\n214635,581\n214636,1210\n214637,634\n214637,88820\n214639,178\n214640,779\n214640,141912\n214641,447\n214641,671\n214642,189303\n214644,1608\n214645,1132\n214646,1715\n214647,1556\n214648,1298\n214649,179170\n214651,1381\n214654,179170\n214655,34\n214655,35\n214655,455\n214655,2266\n214656,920\n214657,1749\n214657,2605\n214657,6695\n214658,818\n214659,68\n214659,387\n214659,596\n214659,88820\n214661,1132\n214662,781\n214663,3524\n214663,48505\n214664,657\n214665,932\n214667,206\n214668,83\n214669,23783\n214670,1119\n214670,1462\n214671,214672\n214673,592\n214674,60576\n214675,1132\n214676,781\n214677,60576\n214678,781\n214679,1132\n214681,151\n214682,1722\n214683,1893\n214683,117163\n214684,60576\n214685,760\n214686,50\n214687,2411\n214688,60576\n214689,349\n214690,309\n214690,310\n214691,209\n214692,3623\n214693,818\n214694,44\n214695,390\n214695,1284\n214696,818\n214697,83\n214699,818\n214700,3623\n214701,1381\n214702,30\n214705,818\n214706,2367\n214707,720\n214708,1\n214709,1402\n214710,818\n214711,189303\n214712,818\n214713,1072\n214714,179170\n214715,1238\n214716,1749\n214717,3623\n214719,8270\n214720,83\n214721,179170\n214722,781\n214723,1132\n214724,3623\n214725,875\n214726,1452\n214727,138686\n214728,30\n214729,1001\n214730,175\n214731,1220\n214731,1222\n214732,5034\n214733,911\n214733,1119\n214733,1368\n214733,1807\n214734,126\n214737,1370\n214737,6119\n214737,21736\n214738,366\n214739,211889\n214740,500\n214741,1882\n214742,1052\n214743,2775\n214744,54\n214745,1962\n214746,389\n214746,588\n214746,590\n214746,1531\n214747,390\n214747,6068\n214748,1860\n214749,1858\n214750,2436\n214751,30\n214752,631\n214753,788\n214754,179170\n214755,818\n214756,158\n214757,217\n214758,142870\n214759,1381\n214760,1860\n214761,1858\n214762,273\n214762,1116\n214763,83\n214764,26450\n214765,835\n214766,433\n214767,516\n214768,179170\n214769,195\n214771,31122\n214772,14797\n214773,3193\n214774,518\n214775,2737\n214777,3804\n214778,1639\n214779,852\n214780,149\n214781,1749\n214782,1454\n214783,58\n214784,46\n214785,60576\n214786,994\n214787,3695\n214788,422\n214789,422\n214790,1274\n214791,422\n214792,422\n214793,422\n214794,422\n214795,422\n214796,422\n214797,422\n214798,422\n214799,422\n214800,422\n214801,5405\n214802,138\n214803,392\n214803,3003\n214804,392\n214805,1132\n214806,1608\n214807,1241\n214808,118336\n214809,736\n214810,694\n214811,1608\n214812,1132\n214813,3695\n214815,1556\n214816,142870\n214818,868\n214819,818\n214820,631\n214820,156379\n214821,1381\n214822,493\n214823,994\n214824,893\n214825,406\n214826,278\n214827,217\n214828,179170\n214830,1151\n214831,283\n214832,301\n214832,310\n214833,392\n214834,214835\n214837,467\n214838,649\n214839,302\n214840,809\n214841,994\n214842,360\n214842,1769\n214843,1749\n214844,1220\n214844,1222\n214845,252\n214847,251\n214848,326\n214850,1769\n214851,516\n214853,994\n214854,647\n214855,717\n214856,55849\n214857,360\n214858,392\n214858,644\n214859,406\n214861,1381\n214862,1284\n214864,326\n214866,557\n214867,214868\n214869,3297\n214870,493\n214871,34\n214871,35\n214873,5212\n214874,1381\n214875,356\n214879,615\n214879,968\n214880,515\n214881,214734\n214882,58\n214882,872\n214883,179170\n214884,483\n214885,1556\n214886,1635\n214887,2312\n214888,179170\n214889,1515\n214890,467\n214891,918\n214892,1243\n214893,179170\n214894,1381\n214896,1740\n214897,314\n214898,179170\n214899,1058\n214901,30\n214902,302\n214903,4637\n214903,204093\n214904,151\n214905,87\n214906,41\n214907,179170\n214908,918\n214909,273\n214911,1262\n214912,189303\n214913,298\n214914,485\n214915,3804\n214916,485\n214917,298\n214919,41\n214920,48\n214921,151\n214922,1769\n214924,818\n214925,41\n214926,406\n214927,861\n214928,179170\n214929,408\n214930,102\n214931,1326\n214932,1323\n214933,2373\n214934,1326\n214934,3804\n214935,302\n214936,264\n214937,6695\n214938,781\n214939,1132\n214941,360\n214942,222\n214943,202\n214944,179170\n214945,72\n214946,663\n214946,4545\n214946,56150\n214947,179170\n214948,577\n214949,1284\n214950,68\n214951,247\n214951,2867\n214951,2868\n214952,781\n214953,1132\n214954,781\n214955,1132\n214956,781\n214957,1132\n214958,1715\n214959,179170\n214960,1284\n214961,72\n214962,3623\n214963,179170\n214964,179170\n214965,179170\n214966,1544\n214967,2744\n214968,179170\n214969,142405\n214971,1849\n214972,179170\n214973,214974\n214975,179170\n214976,179170\n214977,34\n214977,35\n214978,2735\n214979,104\n214980,273\n214980,305\n214980,435\n214980,717\n214980,835\n214980,2209\n214981,2083\n214981,5301\n214982,3695\n214984,179170\n214985,149\n214985,968\n214986,179170\n214987,8\n214987,19\n214987,54\n214987,187\n214987,222\n214987,313\n214987,379\n214987,385\n214987,399\n214987,455\n214987,477\n214987,536\n214987,634\n214987,660\n214987,781\n214987,891\n214987,1019\n214987,1201\n214987,1313\n214987,1467\n214987,1539\n214987,1571\n214987,1618\n214987,1718\n214987,1724\n214987,1756\n214987,1871\n214987,2168\n214987,2224\n214987,2421\n214987,2424\n214987,2553\n214987,2646\n214987,2779\n214987,2944\n214987,4223\n214987,5034\n214987,5326\n214987,5906\n214987,6298\n214987,6506\n214987,6789\n214987,6888\n214987,7698\n214987,7768\n214987,8463\n214987,9743\n214987,13137\n214987,13546\n214987,13980\n214987,17346\n214987,19443\n214987,23287\n214987,28130\n214987,55171\n214987,57354\n214987,115474\n214987,181063\n214987,183456\n214987,188791\n214987,211889\n214987,212914\n214987,213089\n214987,214240\n214988,3370\n214989,179170\n214990,1227\n214990,86416\n214991,615\n214992,120\n214993,557\n214994,285\n214995,214996\n214997,37\n214997,301\n214998,179170\n214999,596\n215000,55849\n215001,623\n215001,1805\n215002,179170\n215003,55849\n215004,1133\n215005,248\n215005,301\n215005,1955\n215005,2979\n215005,3804\n215006,179170\n215007,179170\n215008,406\n215009,179170\n215010,4220\n215011,158\n215011,5405\n215012,179170\n215013,30\n215014,2620\n215015,179170\n215016,179170\n215017,136\n215017,252\n215017,272\n215017,301\n215017,333\n215017,435\n215017,516\n215017,596\n215017,1033\n215017,1370\n215017,1893\n215017,2006\n215017,240174\n215018,273\n215019,58\n215020,46\n215021,994\n215022,179170\n215024,58\n215025,994\n215026,46\n215028,278\n215029,179170\n215030,875\n215031,179170\n215033,179170\n215034,179170\n215035,1608\n215036,1132\n215037,83\n215038,255\n215039,7416\n215040,179170\n215041,1058\n215042,179170\n215044,179170\n215045,77\n215046,179170\n215047,1359\n215048,563\n215049,179170\n215050,2146\n215051,707\n215052,19356\n215053,525\n215054,1309\n215055,83\n215056,179170\n215057,1285\n215059,1116\n215059,1332\n215059,1844\n215061,631\n215062,1149\n215063,294\n215064,1707\n215065,215066\n215067,10\n215068,1608\n215069,1132\n215070,1608\n215071,1132\n215072,179170\n215073,1033\n215074,1579\n215075,179170\n215076,138686\n215077,175\n215078,7768\n215079,179170\n215080,179170\n215081,179170\n215082,179170\n215083,251\n215084,179170\n215085,779\n215086,1363\n215087,2590\n215088,217\n215089,250\n215089,1684\n215090,285\n215091,217\n215092,872\n215093,1511\n215093,3069\n215093,240174\n215094,1531\n215095,179170\n215096,179170\n215097,1227\n215097,86416\n215098,179170\n215099,179170\n215100,179170\n215101,596\n215102,10\n215103,179170\n215104,994\n215105,424\n215106,30\n215107,491\n215108,179170\n215109,179170\n215110,1019\n215110,1417\n215111,179170\n215112,652\n215113,155481\n215114,179170\n215115,1294\n215116,179170\n215117,179170\n215118,818\n215119,996\n215120,406\n215121,1368\n215122,2146\n215123,23783\n215124,215125\n215124,218144\n215126,240\n215127,179170\n215128,422\n215129,56\n215130,56\n215131,422\n215132,151\n215133,312\n215133,652\n215134,41\n215134,784\n215134,1119\n215134,1462\n215134,1515\n215134,8537\n215135,215136\n215137,179170\n215138,179170\n215139,137\n215140,179170\n215141,179170\n215142,179170\n215143,179170\n215144,179170\n215145,142870\n215146,1544\n215147,1179\n215148,68\n215148,256549\n215149,358\n215150,392\n215151,215152\n215153,23287\n215154,58\n215155,10\n215157,147\n215159,1544\n215160,14556\n215161,1707\n215162,1238\n215163,781\n215164,1132\n215165,30\n215166,726\n215167,79\n215168,22\n215168,1805\n215169,366\n215170,366\n215171,179170\n215172,1415\n215173,356\n215174,455\n215175,783\n215175,850\n215176,356\n215177,94409\n215178,54\n215179,707\n215180,388\n215181,58\n215182,994\n215183,46\n215184,1381\n215185,22\n215186,1309\n215188,332\n215189,58\n215190,46\n215191,994\n215192,179170\n215193,179170\n215194,690\n215195,302\n215196,215197\n215198,920\n215199,1749\n215200,179170\n215201,10\n215202,596\n215203,60576\n215204,707\n215205,485\n215206,298\n215207,14556\n215208,158\n215209,215209\n215210,425\n215211,3\n215212,392\n215213,102\n215214,1132\n215215,254\n215216,671\n215217,1458\n215218,55849\n215220,179170\n215221,1949\n215222,193129\n215223,97\n215225,2436\n215227,781\n215228,1132\n215229,142430\n215229,142879\n215230,313\n215230,634\n215230,808\n215230,1556\n215232,155473\n215233,392\n215234,1252\n215234,1253\n215235,2460\n215236,1345\n215237,142426\n215238,204093\n215239,599\n215240,2334\n215241,301\n215242,65\n215243,301\n215244,215245\n215246,843\n215247,779\n215248,907\n215249,1381\n215250,136752\n215251,2353\n215252,151\n215252,663\n215252,1058\n215252,1096\n215253,483\n215254,920\n215255,861\n215256,1434\n215256,2073\n215256,2668\n215257,932\n215258,285\n215259,215260\n215261,1631\n215262,1294\n215263,356\n215265,726\n215265,859\n215266,2812\n215267,273\n215268,179170\n215269,536\n215270,204124\n215271,387\n215272,179170\n215273,668\n215274,1837\n215275,1556\n215276,63\n215276,202\n215276,251\n215276,252\n215276,259\n215276,275\n215276,314\n215276,336\n215276,397\n215276,493\n215276,516\n215276,682\n215276,685\n215276,733\n215276,808\n215276,838\n215276,843\n215276,852\n215276,1011\n215276,1014\n215276,1089\n215276,1130\n215276,1175\n215276,1191\n215276,1220\n215276,1222\n215276,1243\n215276,1265\n215276,1266\n215276,1512\n215276,1663\n215276,1927\n215276,1973\n215276,3835\n215276,5992\n215276,6904\n215276,14511\n215276,16014\n215276,19413\n215276,20071\n215276,20419\n215276,25282\n215276,47707\n215276,49179\n215276,72439\n215276,76704\n215276,118336\n215276,166685\n215276,170771\n215276,173053\n215276,182465\n215276,189788\n215276,189794\n215276,189839\n215276,189842\n215276,202996\n215276,207659\n215276,212381\n215276,212620\n215276,215276\n215276,215277\n215276,215310\n215276,215328\n215276,215807\n215276,215842\n215276,215874\n215276,215980\n215276,216548\n215276,216669\n215276,216676\n215276,216678\n215276,216680\n215276,216720\n215276,218887\n215276,222357\n215276,223738\n215276,223786\n215276,225303\n215276,226180\n215276,228172\n215276,237373\n215276,245284\n215276,247366\n215276,248708\n215276,249055\n215276,249746\n215276,251413\n215276,251480\n215276,253135\n215276,253138\n215276,253149\n215276,262351\n215277,215276\n215278,1274\n215279,44\n215280,1509\n215280,1551\n215281,273\n215282,3094\n215283,217\n215284,187176\n215285,73570\n215286,818\n215288,435\n215289,862\n215290,781\n215291,1132\n215292,422\n215293,422\n215294,422\n215295,422\n215296,422\n215297,422\n215298,422\n215299,422\n215300,6556\n215301,422\n215302,422\n215303,372\n215303,1082\n215304,422\n215305,251\n215306,1566\n215307,422\n215308,1132\n215309,781\n215310,215276\n215311,1860\n215312,1858\n215314,217\n215315,636\n215316,83\n215317,1326\n215319,60576\n215320,215321\n215322,5301\n215323,1381\n215324,83\n215325,330\n215326,30\n215327,60576\n215328,215276\n215329,1052\n215330,1962\n215331,500\n215332,2775\n215333,1882\n215334,54\n215335,179170\n215336,147\n215336,158\n215336,184\n215336,697\n215337,215338\n215340,698\n215340,5440\n215341,1608\n215342,1132\n215344,1188\n215345,346\n215346,2671\n215347,991\n215349,647\n215350,146\n215350,92476\n215351,344\n215353,713\n215354,79\n215355,1238\n215356,1608\n215357,1132\n215359,1860\n215360,1858\n215361,450\n215362,3161\n215363,994\n215364,58\n215365,46\n215366,647\n215367,344\n215368,146\n215368,92476\n215369,3474\n215370,60576\n215371,264\n215373,360\n215374,179170\n215375,1452\n215376,467\n215377,1860\n215378,1858\n215379,255\n215380,707\n215381,179170\n215382,389\n215384,192\n215385,138686\n215387,175\n215388,179170\n215389,179170\n215391,2168\n215392,1381\n215393,346\n215394,1282\n215394,1392\n215394,1882\n215395,467\n215395,872\n215395,1381\n215397,309\n215397,310\n215398,14556\n215399,149\n215400,1955\n215401,668\n215402,178\n215403,868\n215404,8270\n215405,248\n215406,1541\n215407,1749\n215409,907\n215410,1608\n215411,1132\n215412,760\n215413,1119\n215414,137\n215414,328\n215414,784\n215414,1016\n215414,1177\n215414,1282\n215414,1511\n215414,3069\n215414,182162\n215415,273\n215417,264\n215418,2944\n215419,811\n215421,406\n215422,1345\n215423,346\n215424,1836\n215425,225\n215425,292\n215426,1381\n215427,1608\n215428,1132\n215430,87\n215430,312\n215430,420\n215430,438\n215430,704\n215431,1836\n215433,592\n215434,151\n215435,76096\n215437,873\n215438,433\n215439,1544\n215440,4611\n215441,292\n215442,264\n215443,707\n215444,217\n215446,577\n215447,301\n215447,1564\n215448,843\n215450,1085\n215451,1220\n215451,1222\n215452,1227\n215452,86416\n215453,360\n215454,3623\n215455,2286\n215456,1881\n215457,215458\n215457,230378\n215459,1836\n215460,30\n215461,179170\n215462,392\n215462,1240\n215463,301\n215465,557\n215466,79\n215467,557\n215468,179170\n215469,312\n215469,652\n215470,1172\n215471,1132\n215472,781\n215473,781\n215474,1132\n215475,1381\n215476,179170\n215477,178\n215478,1010\n215479,1962\n215480,179170\n215481,202\n215482,179170\n215483,422\n215484,1849\n215485,850\n215486,147\n215487,79\n215488,707\n215489,179170\n215490,406\n215491,1608\n215492,1132\n215493,1659\n215494,392\n215494,577\n215494,57143\n215494,127158\n215494,138686\n215494,144231\n215494,160320\n215494,187483\n215494,216168\n215494,223834\n215494,225291\n215495,1381\n215496,515\n215497,309\n215497,310\n215498,83\n215499,179170\n215500,209\n215501,30\n215502,534\n215502,1837\n215503,4771\n215504,435\n215505,1556\n215506,392\n215507,256\n215508,15119\n215510,156379\n215512,1326\n215513,843\n215514,918\n215515,1844\n215516,3804\n215517,179170\n215519,1860\n215520,1858\n215521,6387\n215521,154408\n215523,151\n215524,195\n215524,306\n215524,307\n215524,406\n215524,779\n215524,1181\n215524,1515\n215525,158\n215526,442\n215527,663\n215529,1639\n215530,79\n215531,1983\n215533,379\n215534,3\n215534,1085\n215535,87\n215535,392\n215535,687\n215535,872\n215535,918\n215535,1454\n215536,1151\n215537,145240\n215538,312\n215538,356\n215539,346\n215540,752\n215541,1326\n215542,408\n215543,102\n215544,1323\n215545,483\n215546,1860\n215547,1858\n215548,387\n215549,179170\n215550,491\n215551,179170\n215552,179170\n215553,1181\n215554,579\n215555,994\n215556,83\n215556,278\n215557,1293\n215558,3367\n215559,179170\n215560,994\n215561,1860\n215562,1858\n215563,640\n215564,179170\n215565,1012\n215566,563\n215567,179170\n215568,179170\n215569,1860\n215570,1858\n215571,179170\n215572,1452\n215573,1722\n215574,83\n215575,30\n215576,920\n215577,697\n215578,1474\n215579,179170\n215580,195\n215581,4810\n215582,388\n215583,467\n215584,30\n215585,424\n215586,605\n215587,346\n215588,8822\n215589,640\n215591,103860\n215592,179170\n215593,138686\n215594,175\n215595,273\n215596,251\n215596,1370\n215597,3370\n215597,14453\n215598,994\n215599,30\n215600,2744\n215601,772\n215602,346\n215603,1284\n215604,272\n215605,697\n215605,1769\n215606,841\n215607,34\n215607,35\n215608,209\n215609,647\n215610,2590\n215611,179170\n215612,30\n215613,1\n215614,200\n215615,875\n215616,994\n215617,827\n215618,3999\n215619,1289\n215620,7\n215621,14366\n215622,1509\n215623,1381\n215624,592\n215625,37\n215626,179170\n215627,304\n215628,1608\n215629,1132\n215630,269\n215631,393\n215631,17245\n215632,179170\n215633,1210\n215634,1151\n215635,217\n215635,1417\n215636,346\n215637,30\n215638,779\n215639,5906\n215640,137\n215641,557\n215642,278\n215643,626\n215644,862\n215645,215646\n215647,592\n215648,30\n215649,147\n215650,346\n215651,433\n215652,707\n215653,145240\n215654,1718\n215654,2646\n215655,195\n215656,1058\n215657,86\n215657,167\n215657,301\n215657,589\n215657,605\n215657,615\n215657,907\n215657,973\n215657,1001\n215657,1124\n215657,1167\n215657,1241\n215657,1284\n215657,1522\n215657,1782\n215657,1785\n215657,1955\n215657,2083\n215657,2557\n215657,2979\n215657,3193\n215658,215659\n215660,178\n215661,192\n215661,306\n215661,307\n215661,406\n215661,422\n215661,493\n215661,586\n215661,620\n215661,779\n215661,1515\n215661,1531\n215661,3148\n215661,4192\n215661,4193\n215662,872\n215663,2367\n215664,1531\n215665,1231\n215665,1782\n215666,1608\n215667,1132\n215668,808\n215669,920\n215670,1858\n215671,1860\n215672,179170\n215673,179170\n215674,1462\n215674,8537\n215675,1058\n215676,433\n215678,968\n215679,994\n215680,1688\n215681,433\n215682,151\n215683,1566\n215684,707\n215686,563\n215687,801\n215688,1370\n215689,273\n215690,957\n215691,215692\n215693,86\n215694,818\n215695,1370\n215696,1265\n215696,1266\n215697,493\n215698,138686\n215699,175\n215700,586\n215701,330\n215702,563\n215703,563\n215704,874\n215705,1014\n215706,1014\n215707,1014\n215708,10\n215709,179170\n215710,1014\n215711,1014\n215712,1326\n215713,805\n215714,215715\n215716,1014\n215717,215718\n215719,994\n215720,215721\n215722,1019\n215723,875\n215724,247\n215725,563\n215726,346\n215727,298\n215728,138686\n215729,175\n215730,278\n215731,13980\n215732,83\n215734,536\n215736,346\n215737,1381\n215738,215739\n215740,862\n215741,204093\n215742,215743\n215742,228767\n215744,179170\n215745,795\n215746,179170\n215747,2923\n215748,1381\n215749,113156\n215750,1188\n215750,142870\n215751,392\n215752,179170\n215753,261\n215753,493\n215754,1531\n215755,346\n215756,1012\n215757,217\n215759,34\n215759,35\n215760,202\n215761,179170\n215763,19010\n215764,304\n215765,41\n215766,1012\n215768,261\n215768,493\n215769,289\n215769,290\n215769,94134\n215770,272\n215770,435\n215770,1893\n215771,179170\n215772,671\n215773,179170\n215774,179170\n215775,1544\n215776,3\n215777,1462\n215777,15573\n215778,652\n215778,1235\n215779,292\n215779,1511\n215780,1151\n215781,3041\n215782,179170\n215783,1773\n215784,233\n215785,366\n215786,1860\n215787,1858\n215788,1715\n215789,455\n215790,1177\n215790,182162\n215791,707\n215792,56\n215793,422\n215795,491\n215796,215797\n215798,1688\n215799,762\n215799,1243\n215802,968\n215804,272\n215804,538\n215804,4611\n215805,1085\n215806,707\n215807,215276\n215808,1566\n215809,388\n215810,980\n215811,215812\n215813,1381\n215814,301\n215816,355\n215816,204093\n215817,450\n215818,1381\n215819,1773\n215820,784\n215820,204093\n215821,104\n215821,406\n215822,269\n215822,784\n215822,1556\n215822,1882\n215822,2646\n215822,2775\n215822,13980\n215823,355\n215824,477\n215825,212914\n215826,206\n215827,491\n215828,1893\n215829,33611\n215830,60576\n215831,346\n215831,571\n215832,328\n215833,596\n215834,1381\n215835,22\n215836,781\n215837,1132\n215838,1860\n215839,1858\n215841,781\n215842,215276\n215843,1132\n215844,1425\n215845,115474\n215846,694\n215847,1381\n215849,269\n215850,81\n215850,588\n215850,590\n215851,649\n215852,340\n215852,644\n215852,668\n215853,1858\n215854,1860\n215855,5405\n215856,707\n215857,781\n215858,254\n215859,1132\n215860,356\n215863,647\n215864,215865\n215866,50\n215867,1068\n215868,1381\n215869,3695\n215870,808\n215871,457\n215871,525\n215871,577\n215871,1392\n215871,1531\n215872,579\n215873,346\n215874,11\n215874,20\n215874,22\n215874,167\n215874,186\n215874,195\n215874,207\n215874,209\n215874,240\n215874,264\n215874,301\n215874,302\n215874,314\n215874,420\n215874,441\n215874,479\n215874,505\n215874,510\n215874,536\n215874,697\n215874,712\n215874,843\n215874,852\n215874,872\n215874,911\n215874,918\n215874,968\n215874,972\n215874,980\n215874,1010\n215874,1085\n215874,1089\n215874,1267\n215874,1293\n215874,1326\n215874,1345\n215874,1370\n215874,1381\n215874,1402\n215874,1531\n215874,1566\n215874,1655\n215874,1837\n215874,1844\n215874,1893\n215874,1992\n215874,2334\n215874,2400\n215874,2512\n215874,3392\n215874,3507\n215874,3804\n215874,4276\n215874,5213\n215874,6837\n215874,8276\n215874,21442\n215874,75912\n215874,115474\n215874,118336\n215874,164100\n215874,215276\n215874,215874\n215874,230271\n215874,242246\n215874,255670\n215874,256217\n215874,256945\n215874,258709\n215874,260126\n215874,262531\n215874,263959\n215875,63471\n215876,3999\n215876,191860\n215877,332\n215878,192\n215878,1381\n215879,577\n215879,3367\n215879,138686\n215880,3999\n215882,346\n215883,176935\n215884,3695\n215885,14556\n215886,1381\n215887,1082\n215888,346\n215889,1551\n215889,3999\n215890,1740\n215891,309\n215891,310\n215892,65\n215893,3695\n215894,801\n215895,142426\n215896,162599\n215897,920\n215898,431\n215899,1773\n215900,275\n215901,3999\n215902,36819\n215903,142426\n215904,292\n215904,338\n215904,609\n215904,626\n215904,673\n215904,1688\n215904,4039\n215904,37414\n215905,760\n215905,1149\n215905,1631\n215906,215\n215906,1511\n215906,3069\n215907,179170\n215908,491\n215909,1452\n215910,60576\n215911,22\n215912,3555\n215913,179170\n215915,75912\n215916,818\n215917,450\n215918,252\n215918,1220\n215918,1222\n215919,707\n215920,433\n215921,65\n215921,467\n215921,868\n215922,663\n215923,202\n215924,647\n215925,344\n215926,146\n215926,92476\n215927,850\n215928,48505\n215930,30331\n215931,389\n215932,3094\n215933,217\n215933,1417\n215934,431\n215934,455\n215935,358\n215936,55849\n215938,991\n215939,1241\n215941,422\n215942,809\n215943,195\n215943,493\n215944,422\n215945,422\n215946,142879\n215947,422\n215948,32475\n215949,422\n215950,422\n215951,422\n215952,422\n215953,422\n215954,142473\n215956,1467\n215957,422\n215958,422\n215959,4039\n215960,79\n215962,50\n215963,3999\n215963,191860\n215964,818\n215965,214131\n215966,163\n215967,163\n215968,3\n215969,818\n215970,1132\n215971,1740\n215972,37\n215972,1370\n215973,72\n215974,158\n215975,2421\n215976,217\n215977,2266\n215978,4637\n215979,1201\n215980,215276\n215980,230518\n215981,2779\n215982,6695\n215983,37414\n215984,3003\n215985,1381\n215985,1608\n215986,44\n215988,32475\n215989,636\n215990,163\n215991,163\n215992,491\n215993,868\n215994,563\n215995,13661\n215996,3\n215997,14556\n215998,163\n215998,811\n215998,893\n215999,302\n216000,178\n216001,83\n216003,1707\n216004,818\n216005,2253\n216005,142426\n216006,48\n216007,4548\n216008,56\n216009,422\n216010,158\n216011,285\n216012,290\n216012,714\n216012,1511\n216012,33424\n216012,94134\n216013,1287\n216014,1381\n216015,720\n216016,41\n216016,760\n216017,850\n216018,3695\n216020,1467\n216021,1010\n216022,615\n216023,1544\n216024,781\n216025,1132\n216026,50\n216027,13137\n216028,6955\n216029,1707\n216030,2701\n216031,2620\n216032,356\n216033,1962\n216034,1359\n216035,252\n216036,392\n216037,1381\n216038,406\n216038,628\n216039,647\n216040,146\n216040,92476\n216041,344\n216042,2334\n216043,171\n216045,195\n216046,483\n216046,1298\n216047,752\n216048,30\n216048,72\n216048,592\n216049,3507\n216051,758\n216052,37\n216053,1860\n216054,1858\n216055,3804\n216056,217\n216057,360\n216058,255\n216059,163\n216060,179170\n216061,1\n216062,77\n216064,240\n216065,1715\n216066,631\n216067,217\n216068,178\n216069,178\n216070,216071\n216072,609\n216073,1220\n216073,1222\n216074,516\n216075,252\n216076,106\n216077,596\n216078,503\n216079,1298\n216080,272\n216081,805\n216082,1849\n216083,75912\n216085,301\n216085,972\n216085,1118\n216085,3524\n216086,433\n216087,200\n216088,515\n216089,467\n216090,16196\n216091,1860\n216092,1858\n216093,422\n216094,3209\n216095,301\n216095,615\n216096,781\n216097,1132\n216098,2744\n216099,707\n216100,467\n216101,1769\n216102,178\n216104,1462\n216104,8537\n216105,130\n216107,252\n216108,1326\n216109,390\n216110,1085\n216111,1010\n216112,1381\n216114,27057\n216115,685\n216116,30\n216117,171\n216119,784\n216120,222\n216121,1132\n216122,781\n216123,3804\n216124,1019\n216125,3260\n216127,1454\n216128,3585\n216129,23783\n216131,500\n216132,2775\n216133,1052\n216134,1962\n216135,54\n216136,1882\n216139,1417\n216140,1417\n216141,1227\n216141,86416\n216142,56\n216143,422\n216144,10\n216144,50\n216144,79\n216144,119\n216144,147\n216144,158\n216144,192\n216144,195\n216144,211\n216144,222\n216144,298\n216144,309\n216144,310\n216144,406\n216144,567\n216144,577\n216144,615\n216144,622\n216144,640\n216144,652\n216144,671\n216144,693\n216144,859\n216144,1118\n216144,1188\n216144,1265\n216144,1266\n216144,1572\n216144,1659\n216144,1796\n216144,2073\n216144,2574\n216144,2750\n216144,3161\n216144,3321\n216144,3623\n216144,4865\n216144,4866\n216144,5101\n216144,5987\n216144,8270\n216144,25348\n216144,32914\n216144,101688\n216145,79\n216146,1140\n216146,2443\n216147,255\n216148,1284\n216149,4903\n216150,75912\n216151,1927\n216153,178\n216154,272\n216155,1284\n216156,163\n216157,216157\n216158,805\n216160,779\n216161,72\n216162,344\n216163,285\n216165,202\n216166,1238\n216170,452\n216170,1445\n216171,515\n216173,1452\n216174,1474\n216176,204124\n216177,485\n216178,1381\n216179,682\n216179,72439\n216180,1619\n216182,932\n216183,818\n216184,222\n216186,13538\n216187,310\n216188,179170\n216189,179170\n216190,1436\n216192,77\n216193,179170\n216194,271\n216195,254\n216196,360\n216196,1474\n216196,1544\n216196,9457\n216197,2590\n216198,97\n216199,6424\n216201,14556\n216202,1381\n216203,1007\n216204,120\n216204,1353\n216206,467\n216207,1888\n216208,467\n216209,859\n216210,1722\n216211,579\n216212,3804\n216213,980\n216214,420\n216215,406\n216217,3079\n216218,918\n216219,872\n216220,422\n216221,31122\n216222,3193\n216223,518\n216224,2737\n216225,640\n216226,14797\n216227,216228\n216229,872\n216230,697\n216231,392\n216232,299\n216232,1319\n216233,516\n216238,1151\n216239,1\n216240,1001\n216242,184\n216243,179170\n216244,483\n216245,1860\n216246,1858\n216247,1556\n216248,23287\n216249,171\n216250,1453\n216251,160\n216252,387\n216253,240\n216254,953\n216255,94\n216255,1511\n216255,8180\n216256,37414\n216257,1639\n216258,1590\n216259,18726\n216260,422\n216261,2572\n216262,467\n216263,32\n216263,392\n216264,745\n216264,3999\n216264,5469\n216264,6789\n216265,3804\n216266,31122\n216267,3193\n216268,518\n216269,2737\n216270,14797\n216271,2797\n216272,690\n216274,996\n216276,4594\n216277,503\n216278,179170\n216279,151\n216280,1381\n216281,1858\n216282,1860\n216283,415\n216283,1454\n216284,372\n216285,2735\n216286,179170\n216288,467\n216289,968\n216290,349\n216291,929\n216292,433\n216293,14556\n216294,264\n216295,994\n216296,779\n216298,1722\n216299,1151\n216300,1070\n216301,991\n216302,8992\n216303,1085\n216304,138686\n216305,175\n216306,818\n216307,818\n216308,704\n216309,1220\n216309,1222\n216310,252\n216311,516\n216312,171\n216313,1509\n216313,1551\n216314,1326\n216315,102\n216316,1323\n216317,408\n216318,179170\n216319,179170\n216320,3538\n216321,202\n216322,171\n216323,216324\n216325,216324\n216326,19413\n216327,30\n216328,392\n216329,406\n216330,1033\n216331,216332\n216333,34\n216333,35\n216333,973\n216333,1133\n216334,195\n216335,216336\n216337,294\n216338,2574\n216339,30\n216341,1572\n216343,718\n216344,55849\n216344,213089\n216345,1227\n216345,86416\n216346,149\n216347,155473\n216348,30\n216349,620\n216350,267\n216351,1181\n216352,145240\n216353,141912\n216354,155473\n216355,1181\n216356,302\n216357,406\n216358,301\n216359,818\n216360,30\n216361,422\n216362,1515\n216363,779\n216364,50\n216365,536\n216365,657\n216365,1118\n216366,158\n216367,1133\n216368,332\n216369,23437\n216370,920\n216371,588\n216371,590\n216371,1419\n216372,1419\n216373,885\n216373,13704\n216374,872\n216376,1294\n216377,390\n216378,179170\n216379,577\n216380,31976\n216381,333\n216382,225\n216383,192\n216384,21442\n216385,22\n216386,273\n216387,179170\n216388,4672\n216389,1359\n216390,536\n216391,843\n216392,1522\n216393,599\n216393,1118\n216394,179170\n216395,34\n216395,35\n216396,536\n216397,1769\n216398,2411\n216399,356\n216399,1012\n216400,1\n216400,147\n216401,179170\n216402,162599\n216403,1515\n216404,30\n216405,788\n216406,8884\n216407,862\n216408,1345\n216409,30\n216410,1085\n216411,178\n216412,6424\n216413,216414\n216415,779\n216416,209\n216417,72\n216418,107\n216419,3367\n216420,289\n216420,290\n216420,94134\n216421,2867\n216421,2868\n216422,138686\n216423,175\n216425,34\n216425,35\n216426,130\n216427,577\n216428,155473\n216430,34\n216430,35\n216431,72\n216432,455\n216433,872\n216434,14126\n216436,379\n216437,217\n216438,167\n216438,2083\n216438,73570\n216439,609\n216440,609\n216441,211\n216442,179170\n216443,1801\n216444,346\n216445,113156\n216447,285\n216448,358\n216449,216450\n216451,285\n216452,83\n216453,250\n216453,1684\n216455,1359\n216456,179170\n216458,390\n216459,179170\n216460,188791\n216461,312\n216462,30\n216464,179170\n216465,216466\n216467,179170\n216468,1085\n216469,30\n216470,179170\n216471,179170\n216472,216473\n216474,179170\n216475,179170\n216476,209\n216477,179170\n216478,874\n216478,1210\n216479,179170\n216481,707\n216482,485\n216483,298\n216484,179170\n216485,850\n216486,1821\n216486,21736\n216488,1773\n216489,30\n216490,5213\n216491,323\n216492,216493\n216494,216495\n216496,1544\n216497,1860\n216498,1858\n216499,151\n216500,1359\n216501,179170\n216502,179170\n216503,30\n216504,34580\n216505,5\n216505,1379\n216506,589\n216507,435\n216507,439\n216508,72\n216509,30\n216510,30\n216511,302\n216511,811\n216511,893\n216512,809\n216513,30\n216514,315\n216516,79\n216516,1722\n216516,3182\n216517,30\n216518,106\n216520,620\n216521,509\n216523,2674\n216523,3003\n216523,124668\n216524,158\n216525,240\n216527,151\n216528,1381\n216529,3555\n216530,252\n216531,1240\n216532,7757\n216534,179170\n216535,2116\n216536,30\n216537,2979\n216539,50\n216540,567\n216540,750\n216540,968\n216540,1293\n216541,1722\n216542,31976\n216543,302\n216544,1509\n216546,336\n216547,199199\n216548,215276\n216549,7768\n216550,1782\n216552,1782\n216555,1789\n216557,204093\n216561,252\n216563,366\n216564,31073\n216565,302\n216565,893\n216566,1385\n216567,704\n216568,510\n216569,337\n216571,652\n216573,808\n216573,2266\n216574,10\n216574,178\n216574,195\n216574,222\n216574,1572\n216574,3297\n216575,46\n216576,392\n216577,216578\n216579,467\n216581,536\n216583,302\n216584,663\n216586,34\n216586,536\n216586,127158\n216587,119\n216588,431\n216591,505\n216592,994\n216592,188791\n216593,809\n216594,31206\n216595,907\n216596,142870\n216598,216599\n216600,1801\n216601,1238\n216602,980\n216603,5440\n216604,1175\n216605,312\n216606,636\n216607,392\n216607,1151\n216608,602\n216609,1257\n216610,1452\n216611,1821\n216611,21736\n216612,1133\n216613,163\n216614,3218\n216617,36819\n216618,136\n216618,137\n216618,744\n216618,750\n216618,783\n216619,134\n216620,784\n216620,3258\n216620,28107\n216623,50\n216624,50\n216625,140\n216626,46\n216628,1860\n216629,718\n216629,3830\n216630,217\n216632,349\n216635,1284\n216637,366\n216641,577\n216642,698\n216642,85842\n216642,205173\n216642,222508\n216642,236513\n216642,237234\n216643,111142\n216644,5908\n216645,104\n216645,503\n216645,1353\n216645,3085\n216646,216647\n216648,893\n216648,14556\n216649,273\n216650,493\n216651,202\n216652,1326\n216653,217\n216654,5662\n216655,209\n216656,1368\n216658,1238\n216659,1298\n216660,673\n216661,605\n216662,838\n216664,366\n216665,862\n216667,1359\n216668,783\n216669,2812\n216669,215276\n216670,3135\n216671,422\n216672,6888\n216673,491\n216675,818\n216676,215276\n216677,215276\n216678,215276\n216679,83\n216680,215276\n216681,65\n216682,1454\n216683,424\n216684,217\n216684,222\n216685,1\n216686,707\n216687,491\n216688,240\n216689,273\n216690,3367\n216690,5911\n216691,835\n216693,142430\n216694,1858\n216695,1860\n216696,216697\n216696,254167\n216698,79\n216700,1298\n216701,302\n216704,233\n216705,75912\n216706,1837\n216707,264\n216709,1381\n216710,403\n216712,155473\n216713,162599\n216714,1105\n216715,302\n216715,344\n216717,46631\n216720,215276\n216721,707\n216723,1417\n216725,204093\n216726,302\n216727,79\n216728,1983\n216729,204093\n216730,4545\n216730,56150\n216731,433\n216731,467\n216732,216733\n216734,1893\n216734,7155\n216736,450\n216738,392\n216740,46\n216741,422\n216742,204093\n216743,50\n216745,201298\n216746,141912\n216747,22293\n216748,489\n216749,536\n216749,4672\n216750,1220\n216750,1222\n216751,251\n216752,252\n216753,850\n216756,784\n216759,422\n216760,216761\n216762,140\n216763,233\n216764,209\n216765,179170\n216766,259\n216766,264\n216766,676\n216767,138686\n216768,422\n216769,175\n216770,1033\n216771,179170\n216772,422\n216773,6059\n216774,301\n216775,204093\n216776,515\n216777,1465\n216779,145240\n216780,2334\n216781,1949\n216783,1257\n216784,783\n216784,1160\n216784,103860\n216785,269\n216786,467\n216786,868\n216787,216788\n216790,65\n216791,557\n216792,151\n216793,30\n216794,1241\n216795,22\n216796,1773\n216797,390\n216798,171\n216800,1983\n216801,14556\n216802,30\n216803,148742\n216804,1707\n216806,1849\n216807,1474\n216808,673\n216809,1860\n216810,1858\n216811,301\n216815,292\n216816,5440\n216817,216818\n216819,1007\n216820,2944\n216821,30\n216822,216599\n216823,1379\n216824,146\n216824,92476\n216825,647\n216826,344\n216827,332\n216828,30\n216829,30\n216830,647\n216832,179170\n216833,1262\n216835,1634\n216836,30\n216837,151\n216838,1572\n216839,707\n216840,697\n216841,1282\n216842,1113\n216843,5440\n216844,97\n216845,422\n216847,2995\n216848,8854\n216849,704\n216850,216851\n216852,222\n216852,1019\n216854,1608\n216855,707\n216856,36819\n216857,138686\n216858,175\n216859,171\n216860,805\n216860,818\n216860,1955\n216861,9029\n216862,818\n216863,781\n216864,1132\n216865,422\n216866,491\n216867,994\n216868,240\n216869,137\n216870,2116\n216871,422\n216872,217\n216872,1417\n216873,1551\n216874,422\n216876,577\n216877,994\n216878,718\n216879,809\n216880,577\n216881,1151\n216882,40497\n216884,447\n216885,2775\n216886,422\n216887,216888\n216889,145240\n216891,2146\n216892,1235\n216892,1335\n216893,179170\n216894,491\n216895,252\n216896,491\n216897,392\n216898,1860\n216899,4760\n216900,6059\n216901,312\n216901,397\n216901,4810\n216902,5658\n216903,4252\n216904,623\n216905,697\n216906,6955\n216907,3612\n216908,595\n216909,2274\n216910,187\n216912,147\n216913,216914\n216915,1803\n216916,273\n216917,491\n216918,491\n216920,2590\n216921,1608\n216922,1655\n216923,1132\n216924,433\n216925,275\n216926,5\n216926,2048\n216927,1133\n216927,72439\n216928,872\n216929,83\n216930,1429\n216931,4571\n216932,1227\n216932,86416\n216933,1313\n216934,795\n216935,207\n216936,668\n216937,781\n216938,1132\n216939,1\n216939,252\n216939,302\n216939,333\n216939,489\n216939,749\n216939,1012\n216939,1332\n216939,1590\n216939,1634\n216939,1927\n216941,1849\n216942,275\n216943,30331\n216944,994\n216945,292\n216946,707\n216947,30\n216948,216949\n216950,447\n216951,2775\n216952,1634\n216953,309\n216953,310\n216954,447\n216955,2775\n216956,707\n216957,1659\n216958,479\n216959,717\n216960,2048\n216961,285\n216963,1143\n216964,179170\n216965,1888\n216966,269\n216967,302\n216968,1509\n216969,932\n216970,500\n216971,366\n216972,72\n216973,179170\n216974,285\n216975,250\n216975,1684\n216976,1544\n216977,30\n216978,72\n216979,309\n216979,310\n216980,44\n216981,30\n216982,216983\n216984,30\n216985,216986\n216987,4597\n216988,30\n216989,127158\n216990,707\n216991,298\n216992,1556\n216992,2779\n216992,118336\n216993,216994\n216995,779\n216996,366\n216997,392\n216998,366\n216999,1776\n217000,14556\n217001,707\n217002,707\n217003,1381\n217004,217005\n217006,1326\n217007,102\n217008,1323\n217009,408\n217010,1618\n217010,213089\n217011,707\n217012,615\n217013,163\n217014,563\n217015,83\n217016,483\n217018,30\n217019,3602\n217020,34\n217020,5440\n217021,23010\n217022,980\n217023,743\n217024,19010\n217025,315\n217026,875\n217027,1345\n217028,32\n217028,392\n217028,644\n217028,2699\n217028,3003\n217029,2315\n217030,994\n217031,179170\n217032,179170\n217033,273\n217034,5101\n217035,30\n217036,447\n217037,2775\n217038,273\n217039,481\n217040,818\n217041,217042\n217043,30\n217044,779\n217045,4571\n217046,707\n217047,1359\n217048,217049\n217051,994\n217052,697\n217052,1769\n217052,1893\n217053,30\n217054,30\n217056,509\n217056,510\n217059,217060\n217059,219178\n217059,223236\n217059,234841\n217059,235708\n217059,250297\n217061,30\n217064,217065\n217066,217067\n217068,493\n217068,1265\n217068,1266\n217069,50\n217070,217071\n217072,493\n217073,579\n217073,872\n217074,1381\n217075,30\n217076,250\n217076,872\n217076,1684\n217077,217078\n217079,433\n217080,179170\n217081,4218\n217082,72\n217083,996\n217084,996\n217085,996\n217086,996\n217087,120\n217088,217089\n217090,192\n217090,493\n217090,2205\n217090,33424\n217091,1070\n217092,707\n217093,72\n217094,1227\n217094,86416\n217095,55849\n217096,72\n217097,142870\n217098,206\n217099,142433\n217100,1177\n217101,557\n217102,217103\n217104,557\n217105,30\n217106,707\n217108,30\n217109,1359\n217110,843\n217111,707\n217112,30\n217113,1803\n217114,217115\n217114,252891\n217116,72\n217117,217118\n217119,433\n217120,8270\n217121,330\n217122,179170\n217123,179170\n217124,4545\n217124,56150\n217125,179170\n217126,119\n217127,179170\n217128,3623\n217129,3623\n217130,72\n217131,3623\n217133,179170\n217134,179170\n217135,72\n217136,217137\n217138,72\n217139,273\n217140,483\n217141,843\n217142,310\n217143,1858\n217144,3623\n217145,1773\n217146,1332\n217147,1556\n217148,636\n217149,269\n217150,1807\n217151,298\n217152,3695\n217153,30\n217154,119\n217155,72\n217156,184\n217157,285\n217158,640\n217159,1012\n217161,104\n217163,72\n217164,7155\n217165,72\n217166,41\n217167,72\n217168,217169\n217170,72\n217171,996\n217172,72\n217173,72\n217174,72\n217175,72\n217176,1544\n217177,72\n217178,818\n217179,1608\n217180,72\n217181,217182\n217183,217184\n217185,1227\n217185,86416\n217186,72\n217187,3623\n217188,424\n217189,143\n217190,217191\n217192,107\n217193,2416\n217193,2417\n217194,292\n217195,179170\n217196,179170\n217197,338\n217198,298\n217199,72\n217200,72\n217201,788\n217202,422\n217203,1133\n217204,3538\n217205,19010\n217206,72\n217207,3\n217208,1572\n217209,366\n217210,1417\n217211,467\n217212,2867\n217212,2868\n217213,392\n217214,483\n217215,366\n217217,1749\n217218,72\n217219,217220\n217222,422\n217222,5405\n217223,707\n217224,217225\n217226,1984\n217227,599\n217228,707\n217229,707\n217230,707\n217231,5\n217231,23701\n217231,72439\n217232,479\n217234,1707\n217235,707\n217236,422\n217237,422\n217238,422\n217239,422\n217240,422\n217241,422\n217243,6556\n217245,932\n217246,107\n217247,285\n217248,217249\n217251,44\n217252,422\n217253,3538\n217254,2620\n217255,312\n217256,355\n217257,652\n217258,1381\n217259,3804\n217261,337\n217262,968\n217264,4771\n217265,1522\n217266,179170\n217267,1983\n217269,1544\n217271,1544\n217272,154408\n217273,1544\n217274,72\n217275,217276\n217277,217278\n217279,3\n217280,200\n217282,30\n217283,4237\n217283,182162\n217284,2646\n217285,5101\n217286,859\n217287,1227\n217287,86416\n217288,179170\n217289,996\n217290,179170\n217291,171\n217292,1381\n217293,50\n217294,1058\n217295,217296\n217297,179170\n217298,179170\n217299,217300\n217302,107\n217302,2646\n217303,217304\n217305,72\n217306,225\n217307,72\n217308,111142\n217309,222\n217310,72\n217311,2979\n217312,483\n217314,60576\n217315,3297\n217316,240\n217317,1\n217318,50\n217320,818\n217321,994\n217322,179170\n217323,447\n217324,2775\n217325,1247\n217325,164572\n217326,3804\n217327,72\n217328,72\n217329,1220\n217329,1222\n217330,996\n217331,217332\n217334,72\n217335,167\n217336,557\n217337,557\n217338,1359\n217339,72\n217341,1116\n217342,996\n217343,72\n217344,72\n217345,439\n217346,1608\n217347,2285\n217347,2989\n217347,2991\n217347,14133\n217347,127158\n217347,217348\n217349,1635\n217350,707\n217351,72\n217352,72\n217353,217354\n217355,72\n217356,2607\n217359,72\n217360,142473\n217361,72\n217362,1227\n217362,86416\n217363,72\n217364,72\n217365,72\n217367,72\n217368,477\n217369,72\n217370,72\n217371,217\n217372,72\n217373,72\n217375,269\n217376,107\n217377,58\n217378,72\n217380,285\n217381,15573\n217382,43203\n217384,34\n217384,35\n217385,4597\n217386,3804\n217387,217388\n217390,4672\n217391,72\n217392,72\n217393,918\n217394,217395\n217396,72\n217398,292\n217399,83\n217400,1544\n217401,72\n217402,294\n217403,296\n217404,298\n217405,217406\n217407,217408\n217409,217410\n217411,1151\n217412,217413\n217414,1379\n217415,79\n217416,360\n217416,1769\n217418,72\n217419,171\n217420,1068\n217423,179170\n217424,1467\n217425,736\n217426,217427\n217428,1531\n217430,493\n217431,1707\n217432,72\n217433,875\n217435,217436\n217437,72\n217438,1181\n217439,104\n217439,134\n217439,135\n217439,136\n217439,137\n217439,138\n217439,557\n217439,1368\n217439,2105\n217440,261\n217440,493\n217441,6298\n217445,818\n217446,1462\n217446,8537\n217448,1210\n217451,3555\n217452,146\n217452,92476\n217453,647\n217454,344\n217456,467\n217457,406\n217458,151\n217459,1616\n217459,44725\n217462,2244\n217463,4\n217463,5\n217464,589\n217464,968\n217464,1149\n217464,1715\n217466,3623\n217467,217468\n217467,218737\n217467,219601\n217467,220221\n217467,223769\n217467,226779\n217467,227842\n217467,227882\n217467,231629\n217467,234312\n217467,238614\n217467,238718\n217467,240383\n217467,251098\n217467,251195\n217467,252971\n217467,253633\n217467,254025\n217467,254260\n217467,255226\n217467,257704\n217467,257745\n217467,259091\n217467,261077\n217467,261448\n217467,264760\n217470,217471\n217470,249960\n217472,2260\n217473,736\n217474,4672\n217475,7360\n217476,1238\n217477,707\n217478,278\n217478,666\n217478,718\n217478,1151\n217479,1572\n217481,72\n217482,1452\n217483,314\n217483,483\n217483,852\n217483,1001\n217483,1011\n217484,217436\n217486,781\n217487,1132\n217488,142430\n217489,72\n217490,422\n217491,1860\n217492,438\n217493,422\n217494,422\n217495,422\n217496,422\n217497,422\n217498,422\n217499,422\n217500,743\n217500,1983\n217500,95152\n217501,1132\n217504,72\n217505,44\n217506,6888\n217507,227\n217507,609\n217507,772\n217507,1359\n217507,1882\n217507,1888\n217508,2567\n217509,283\n217510,1133\n217511,1293\n217512,217513\n217514,34\n217514,4594\n217515,10\n217516,179170\n217518,2744\n217520,60576\n217521,1544\n217523,1544\n217525,206\n217527,1544\n217528,493\n217529,462\n217531,13137\n217532,222\n217532,760\n217533,10\n217535,422\n217536,81\n217538,79\n217539,124668\n217540,179170\n217541,406\n217542,577\n217543,3623\n217544,83\n217545,151\n217546,217547\n217549,2674\n217549,3258\n217550,3507\n217553,1400\n217554,1544\n217555,397\n217556,835\n217559,431\n217559,631\n217560,358\n217561,1707\n217562,1531\n217563,1001\n217564,5906\n217565,640\n217566,209\n217567,671\n217568,217569\n217571,1544\n217573,269\n217574,134\n217574,200\n217574,227\n217574,292\n217574,704\n217574,1149\n217574,1238\n217574,1509\n217574,1566\n217574,2205\n217574,4571\n217574,33424\n217575,120\n217575,590\n217576,447\n217576,671\n217578,227\n217580,707\n217582,707\n217583,657\n217583,2699\n217584,1177\n217585,171\n217586,415\n217587,5192\n217588,178\n217588,647\n217588,1644\n217589,516\n217590,5250\n217593,195\n217594,315\n217595,2744\n217596,1381\n217597,72\n217599,1860\n217600,1858\n217601,1608\n217602,2744\n217604,134\n217605,134\n217606,349\n217607,1359\n217608,868\n217609,72\n217610,485\n217611,217612\n217613,1133\n217614,171\n217615,179170\n217618,536\n217619,264\n217620,358\n217621,83\n217622,72\n217623,41\n217625,41\n217627,809\n217628,41\n217630,142426\n217632,852\n217633,195\n217634,58\n217635,994\n217636,46\n217637,30\n217638,536\n217639,79\n217641,868\n217645,838\n217647,557\n217651,72\n217652,920\n217653,217654\n217655,213089\n217657,328\n217658,30\n217660,298\n217661,179170\n217662,781\n217663,1132\n217664,1572\n217665,151\n217666,435\n217668,801\n217669,1556\n217670,516\n217671,58\n217672,994\n217673,46\n217674,58\n217675,994\n217676,46\n217677,843\n217678,217679\n217681,360\n217681,142409\n217681,146280\n217682,707\n217683,252\n217684,80266\n217685,72\n217686,72\n217687,920\n217688,167\n217690,483\n217691,34\n217691,35\n217692,72\n217693,516\n217696,72\n217697,671\n217698,72\n217699,1381\n217700,973\n217701,175\n217703,1608\n217704,72\n217705,217706\n217707,72\n217708,55849\n217709,72\n217710,217711\n217712,72\n217713,1511\n217713,3069\n217714,1644\n217715,602\n217716,1566\n217717,3623\n217718,72\n217719,217720\n217719,222913\n217719,248447\n217719,249619\n217721,209\n217722,72\n217723,58\n217724,994\n217725,46\n217726,1511\n217726,3069\n217727,58\n217728,994\n217729,46\n217730,147\n217731,217732\n217733,779\n217733,2931\n217734,72\n217735,72\n217736,179170\n217737,184\n217738,328\n217740,707\n217741,718\n217742,1782\n217744,72\n217745,72\n217746,298\n217747,485\n217749,72\n217750,72\n217751,2867\n217751,2868\n217752,72\n217753,160\n217754,536\n217755,250\n217755,1684\n217756,285\n217757,179170\n217758,30\n217759,72\n217760,261\n217761,1151\n217762,20359\n217763,5591\n217764,818\n217765,315\n217766,707\n217768,217769\n217770,3623\n217771,72\n217772,406\n217773,79\n217774,217775\n217776,138686\n217777,175\n217778,217779\n217780,707\n217781,72\n217782,707\n217783,113156\n217784,1359\n217785,72\n217786,707\n217787,72\n217788,707\n217789,217790\n217791,86416\n217792,217793\n217794,149\n217796,179170\n217797,4597\n217798,72\n217799,707\n217800,217801\n217802,217803\n217804,272\n217805,72\n217806,1644\n217807,179170\n217808,328\n217808,772\n217808,1175\n217809,577\n217810,113156\n217811,1379\n217812,179170\n217813,179170\n217814,72\n217815,285\n217816,3623\n217817,2744\n217818,179170\n217819,179170\n217820,217821\n217822,217823\n217824,217825\n217826,577\n217826,1284\n217827,1544\n217828,2266\n217829,406\n217830,424\n217831,56\n217832,422\n217833,779\n217834,72\n217835,72\n217837,3804\n217838,217839\n217840,72\n217841,497\n217842,217843\n217845,2312\n217847,289\n217847,290\n217847,94134\n217849,415\n217850,4691\n217851,72\n217852,481\n217855,217856\n217857,809\n217858,60576\n217859,743\n217860,707\n217861,707\n217862,13538\n217863,1616\n217864,366\n217865,366\n217866,72\n217867,479\n217867,1579\n217867,1659\n217869,107\n217871,72\n217872,1\n217873,50\n217874,647\n217875,146\n217875,92476\n217876,344\n217878,254\n217879,151\n217879,1402\n217881,4545\n217881,56150\n217882,949\n217883,704\n217884,28107\n217886,149534\n217887,2421\n217889,379\n217892,1531\n217895,859\n217896,932\n217897,516\n217898,694\n217901,217902\n217903,707\n217904,81\n217905,217\n217905,247\n217905,251\n217906,145751\n217907,406\n217908,422\n217909,422\n217911,707\n217912,422\n217913,422\n217914,9015\n217915,46\n217916,58\n217917,994\n217919,1623\n217920,10\n217920,217\n217920,267\n217920,127158\n217921,163\n217922,142426\n217923,217924\n217925,707\n217926,4276\n217926,16687\n217927,217928\n217929,202\n217930,179170\n217931,707\n217932,707\n217933,30\n217935,1608\n217936,1132\n217937,72\n217938,3003\n217939,1608\n217940,1132\n217941,536\n217942,79\n217943,707\n217944,1132\n217946,707\n217947,841\n217949,707\n217950,1201\n217952,83\n217953,536\n217954,707\n217955,707\n217956,707\n217958,140\n217959,60576\n217960,309\n217960,310\n217961,1769\n217962,536\n217963,178\n217964,1579\n217965,422\n217966,422\n217967,422\n217968,2421\n217969,107\n217970,818\n217971,707\n217972,422\n217973,707\n217975,718\n217976,1058\n217977,422\n217978,422\n217980,217\n217980,1417\n217983,251\n217983,252\n217983,516\n217983,538\n217983,925\n217983,1220\n217983,1222\n217983,2567\n217984,118336\n217985,149\n217986,439\n217987,50\n217988,302\n217989,142473\n217990,843\n217991,707\n217992,167\n217992,73570\n217993,3317\n217994,2626\n217995,142430\n217997,247\n217997,2867\n217997,2868\n217998,2083\n217999,107\n218001,6119\n218002,707\n218004,32475\n218005,3582\n218007,104\n218007,557\n218007,885\n218007,1368\n218007,1939\n218007,5405\n218007,13704\n218010,1608\n218011,179170\n218012,179170\n218013,120\n218014,292\n218014,408\n218014,1844\n218015,301\n218016,192\n218017,707\n218018,718\n218019,422\n218020,1010\n218020,142473\n218021,707\n218022,920\n218023,218024\n218025,918\n218026,707\n218027,422\n218028,707\n218029,217\n218029,493\n218030,707\n218031,76096\n218032,3\n218032,192\n218032,333\n218033,622\n218033,1033\n218033,1388\n218033,1531\n218033,1590\n218033,4455\n218034,447\n218035,2775\n218036,1509\n218037,34\n218037,35\n218038,179170\n218039,389\n218039,1072\n218040,2701\n218041,14483\n218042,179170\n218043,179170\n218044,179170\n218045,179170\n218046,44\n218048,3695\n218050,46\n218050,167\n218050,326\n218050,390\n218050,783\n218050,2572\n218050,4222\n218051,1707\n218052,2443\n218055,179170\n218057,179170\n218058,179170\n218059,2620\n218060,1556\n218061,72\n218062,994\n218063,779\n218065,406\n218066,179170\n218067,179170\n218068,707\n218069,1359\n218070,707\n218072,83\n218073,179170\n218074,22\n218075,479\n218076,5366\n218077,179170\n218078,195\n218079,447\n218080,2775\n218082,179170\n218083,2923\n218084,4903\n218085,190492\n218087,557\n218088,536\n218089,2006\n218091,20\n218096,151\n218098,3260\n218099,83\n218100,83\n218102,1323\n218103,102\n218104,1326\n218105,408\n218106,536\n218106,4672\n218107,536\n218108,3623\n218109,491\n218110,41\n218112,1294\n218113,7416\n218114,818\n218115,218116\n218117,2209\n218118,323\n218119,1052\n218119,9030\n218120,179170\n218121,146\n218121,92476\n218122,97\n218123,1769\n218124,107\n218125,179170\n218126,179170\n218127,81\n218128,2373\n218129,1118\n218130,2782\n218131,35486\n218132,743\n218133,707\n218134,72\n218135,41\n218136,477\n218136,2553\n218137,72\n218138,30\n218139,272\n218140,179170\n218141,707\n218142,179170\n218143,1019\n218145,179170\n218146,30\n218147,885\n218147,13704\n218148,189303\n218149,72\n218150,30\n218151,994\n218152,30\n218153,330\n218154,72\n218155,30\n218156,707\n218157,30\n218158,30\n218159,72\n218160,72\n218161,72\n218162,218163\n218164,1882\n218165,72\n218166,278\n218167,179170\n218168,72\n218169,72\n218170,366\n218171,4455\n218172,72\n218173,72\n218174,147\n218175,72\n218176,707\n218177,707\n218178,485\n218179,298\n218180,406\n218181,3623\n218182,206\n218183,435\n218184,4146\n218185,7\n218186,390\n218187,843\n218188,1227\n218188,86416\n218189,55849\n218190,72\n218191,72\n218192,72\n218194,30\n218195,949\n218196,138686\n218197,175\n218198,1151\n218199,2867\n218199,2868\n218200,1363\n218201,30\n218202,707\n218203,6298\n218204,179170\n218205,184\n218206,250\n218206,1684\n218207,2735\n218208,285\n218209,30\n218210,72\n218211,707\n218212,2209\n218213,72\n218214,72\n218215,30\n218216,30\n218217,3138\n218218,1860\n218219,1858\n218221,1860\n218222,1858\n218223,72\n218224,1860\n218225,1858\n218226,72\n218227,179170\n218228,72\n218229,179170\n218230,1085\n218231,72\n218232,30\n218233,10\n218233,113156\n218234,10\n218234,113156\n218235,10\n218235,113156\n218236,10\n218237,422\n218238,72\n218239,422\n218240,422\n218241,422\n218242,218243\n218244,422\n218245,422\n218246,72\n218247,10\n218248,10\n218249,422\n218250,781\n218251,1132\n218252,72\n218253,72\n218254,218255\n218256,3623\n218257,346\n218258,218259\n218260,72\n218261,10\n218262,10\n218263,10\n218264,10\n218265,10\n218266,10\n218268,72\n218269,10\n218270,10\n218271,10\n218272,10\n218273,10\n218274,10\n218275,483\n218276,10\n218277,10\n218278,10\n218279,10\n218280,10\n218281,10\n218282,5405\n218283,10\n218284,179170\n218285,2867\n218285,2868\n218286,72\n218287,72\n218288,1769\n218289,72\n218290,72\n218291,10\n218292,1414\n218293,422\n218294,422\n218295,1769\n218296,1085\n218297,72\n218298,72\n218299,72\n218300,809\n218301,72\n218302,218303\n218304,142405\n218305,179170\n218306,920\n218307,72\n218308,992\n218309,392\n218310,366\n218311,366\n218312,366\n218313,72\n218314,179170\n218315,179170\n218316,179170\n218317,72\n218318,187\n218319,72\n218320,1509\n218321,218322\n218323,1462\n218323,8537\n218324,269\n218325,192\n218325,663\n218326,179170\n218327,179170\n218328,9457\n218329,707\n218330,72\n218331,1220\n218331,1222\n218332,252\n218333,251\n218334,72\n218335,707\n218336,2590\n218340,1844\n218341,595\n218341,703\n218342,366\n218344,1769\n218345,72\n218346,707\n218347,4611\n218349,72\n218350,3177\n218351,707\n218353,1544\n218355,794\n218358,1544\n218359,1544\n218360,1363\n218363,390\n218365,1544\n218368,83\n218369,9457\n218371,4672\n218373,628\n218374,707\n218375,209\n218376,340\n218378,218379\n218380,649\n218381,707\n218382,1860\n218383,1858\n218384,932\n218385,1381\n218386,510\n218387,843\n218388,255\n218389,920\n218391,1\n218391,149\n218391,89035\n218391,118336\n218392,1238\n218393,16196\n218394,932\n218395,2944\n218396,218397\n218398,985\n218399,1452\n218400,485\n218402,13661\n218403,218404\n218405,920\n218406,120\n218407,589\n218408,1274\n218409,218410\n218411,3094\n218412,1160\n218415,433\n218416,1160\n218417,693\n218418,671\n218419,10\n218420,179170\n218421,389\n218422,1160\n218423,55849\n218424,809\n218425,346\n218426,33298\n218427,3370\n218427,14453\n218428,179170\n218429,1465\n218430,1608\n218431,877\n218432,83\n218433,622\n218434,779\n218435,1181\n218436,852\n218437,431\n218439,87\n218439,392\n218440,1220\n218440,1222\n218441,58\n218442,994\n218443,46\n218444,2315\n218445,104\n218445,557\n218445,953\n218445,954\n218446,518\n218446,1436\n218447,1707\n218448,151\n218449,179170\n218450,179170\n218451,58\n218452,994\n218453,46\n218454,818\n218455,127158\n218457,58\n218458,994\n218459,46\n218460,346\n218462,138686\n218463,175\n218464,217\n218465,707\n218466,147\n218467,54\n218468,120\n218470,30\n218471,422\n218472,218473\n218474,33298\n218476,272\n218477,843\n218478,218479\n218480,671\n218481,104\n218482,336\n218483,202\n218485,44\n218486,3582\n218487,1326\n218488,218489\n218488,219539\n218490,843\n218491,3623\n218492,272\n218493,707\n218494,1381\n218496,994\n218498,818\n218499,202\n218500,1803\n218501,843\n218502,302\n218503,58\n218504,994\n218505,46\n218506,996\n218507,861\n218508,41\n218509,2512\n218510,218511\n218513,843\n218514,422\n218514,5405\n218515,302\n218516,213089\n218517,118336\n218518,41\n218519,333\n218520,994\n218521,360\n218522,55849\n218523,707\n218524,403\n218525,861\n218526,1132\n218527,179170\n218528,3507\n218529,269\n218530,179170\n218531,179170\n218532,218533\n218532,250343\n218532,260000\n218532,261444\n218535,217\n218536,192\n218537,843\n218538,843\n218539,218540\n218541,192\n218542,4220\n218543,702\n218544,1556\n218545,358\n218545,509\n218546,54\n218547,1608\n218548,1132\n218549,657\n218550,435\n218551,3653\n218552,151\n218553,218554\n218555,707\n218556,843\n218557,142426\n218558,179170\n218559,218560\n218561,707\n218562,278\n218563,592\n218564,179170\n218565,515\n218566,485\n218567,106\n218567,1033\n218569,1014\n218570,1014\n218571,1014\n218572,1014\n218573,4237\n218573,182162\n218574,289\n218574,290\n218575,72\n218576,41\n218576,1462\n218576,8537\n218577,179170\n218578,179170\n218579,1014\n218580,179170\n218581,179170\n218582,179170\n218583,994\n218584,211\n218585,994\n218585,1571\n218586,1087\n218588,1160\n218589,240\n218590,3582\n218591,1983\n218592,151\n218593,285\n218594,1227\n218594,86416\n218595,179170\n218596,340\n218597,333\n218598,179170\n218599,1220\n218599,1222\n218600,218601\n218600,224816\n218600,242890\n218600,252251\n218602,179170\n218603,1566\n218604,83\n218605,218606\n218607,1058\n218608,218609\n218610,415\n218611,179170\n218612,149\n218613,179170\n218615,179170\n218616,5906\n218617,626\n218618,557\n218619,278\n218620,137\n218621,1\n218622,862\n218623,1522\n218623,3422\n218624,124668\n218627,406\n218628,30\n218629,30\n218630,483\n218631,72\n218632,1118\n218633,250\n218633,1684\n218634,285\n218635,218636\n218637,949\n218638,151\n218639,179170\n218640,251\n218641,1370\n218641,21736\n218642,1014\n218643,1860\n218644,1858\n218645,218646\n218647,707\n218648,72\n218649,707\n218650,31977\n218650,214530\n218650,221340\n218652,1181\n218653,22\n218654,3260\n218655,360\n218656,72\n218657,1014\n218658,72\n218659,356\n218660,72\n218661,147\n218662,1181\n218663,34\n218664,588\n218664,590\n218665,2750\n218666,516\n218667,1417\n218668,1860\n218669,1858\n218670,634\n218671,1298\n218672,379\n218673,138686\n218674,175\n218675,937\n218675,221828\n218675,224610\n218675,227376\n218676,72\n218677,72\n218679,3999\n218680,1801\n218681,30\n218682,285\n218683,707\n218684,58\n218685,994\n218686,46\n218688,30\n218689,422\n218690,422\n218691,422\n218692,422\n218693,422\n218694,843\n218695,422\n218696,422\n218697,422\n218698,422\n218699,422\n218700,818\n218701,356\n218702,267\n218703,841\n218704,202\n218705,83\n218706,72\n218708,218709\n218710,179170\n218711,872\n218712,72\n218713,72\n218714,86832\n218715,72\n218716,72\n218717,422\n218718,422\n218719,217\n218720,54\n218721,218722\n218723,218724\n218726,206\n218727,72\n218728,996\n218729,843\n218730,179170\n218732,491\n218733,72\n218734,2244\n218735,179170\n218736,72\n218738,179170\n218739,179170\n218741,148885\n218741,200543\n218742,707\n218743,285\n218744,58\n218745,994\n218746,46\n218747,3\n218748,179170\n218749,1544\n218750,4611\n218751,1544\n218752,4611\n218753,50\n218754,1167\n218754,2979\n218755,1572\n218756,663\n218757,1\n218757,218758\n218759,577\n218759,1070\n218760,218761\n218760,220692\n218762,1172\n218764,218765\n218766,179170\n218767,72\n218767,805\n218768,179170\n218769,1381\n218773,72\n218774,292\n218776,3524\n218777,254\n218778,1955\n218780,1551\n218781,218782\n218783,2083\n218784,346\n218786,707\n218787,218788\n218789,83\n218791,704\n218793,968\n218794,333\n218795,577\n218798,872\n218799,1238\n218801,920\n218802,2315\n218803,1452\n218804,932\n218805,577\n218806,5034\n218807,346\n218808,1381\n218809,1220\n218809,1222\n218810,252\n218811,516\n218812,218813\n218814,218813\n218815,218813\n218816,14231\n218817,1769\n218818,392\n218819,2668\n218820,717\n218820,1556\n218821,4597\n218822,218823\n218824,1544\n218825,3507\n218826,179170\n218829,179170\n218830,149\n218831,5908\n218839,1556\n218840,673\n218841,1267\n218842,44\n218843,163\n218844,83\n218845,2421\n218845,37414\n218846,151\n218847,218848\n218849,2224\n218850,1087\n218851,138686\n218852,175\n218853,217\n218855,366\n218855,640\n218856,83\n218857,34\n218857,35\n218857,313\n218857,634\n218857,852\n218857,1313\n218857,1718\n218857,2224\n218857,2646\n218857,5326\n218859,179170\n218861,1243\n218862,252\n218863,54\n218864,55849\n218865,535\n218866,118336\n218867,1284\n218871,31073\n218872,10\n218874,83\n218876,30\n218877,217\n218878,14368\n218879,462\n218880,218881\n218882,30\n218884,167\n218884,240\n218884,247\n218884,301\n218884,390\n218884,657\n218884,818\n218884,968\n218884,1160\n218884,1300\n218884,187176\n218886,1160\n218887,215276\n218888,493\n218889,687\n218890,346\n218891,72\n218892,609\n218893,346\n218894,218895\n218896,1210\n218897,346\n218898,1414\n218899,54\n218900,155473\n218901,20535\n218902,179170\n218903,142426\n218905,577\n218907,218908\n218909,179170\n218910,179170\n218911,1072\n218912,1175\n218913,918\n218914,2421\n218915,179170\n218916,179170\n218917,483\n218918,127158\n218919,1531\n218920,731\n218921,649\n218922,4594\n218923,202\n218923,516\n218924,113156\n218925,1175\n218925,1805\n218926,264\n218927,179170\n218928,843\n218929,138686\n218930,175\n218932,1608\n218933,2923\n218934,259\n218935,1556\n218936,1133\n218937,213089\n218938,179170\n218939,697\n218939,1769\n218940,211\n218941,142870\n218942,1556\n218943,1381\n218944,515\n218945,171\n218946,417\n218946,2296\n218947,151\n218948,179170\n218949,1\n218950,312\n218951,218952\n218953,2373\n218954,1608\n218955,1132\n218956,2073\n218957,41\n218958,118336\n218959,72\n218960,885\n218960,13704\n218961,71\n218962,179170\n218963,1132\n218964,179170\n218965,509\n218966,527\n218967,1016\n218967,2379\n218968,467\n218969,4\n218969,5\n218970,72\n218971,54\n218972,15179\n218973,581\n218974,72\n218975,7360\n218976,515\n218976,3258\n218977,346\n218979,491\n218980,138\n218981,865\n218982,557\n218983,137\n218984,88820\n218985,138\n218986,865\n218987,557\n218988,137\n218989,88820\n218990,1220\n218990,1222\n218991,516\n218992,252\n218993,1381\n218994,346\n218995,72\n218996,707\n218997,138686\n218998,175\n218999,392\n218999,918\n219000,179170\n219001,72\n219002,1556\n219004,510\n219005,2168\n219006,1220\n219006,1222\n219007,516\n219008,252\n219009,192\n219009,1623\n219010,557\n219011,1659\n219012,135\n219013,135\n219014,72\n219016,406\n219017,72\n219018,346\n219019,72\n219020,1381\n219021,704\n219022,138\n219023,865\n219024,557\n219025,137\n219026,88820\n219027,1238\n219029,1227\n219029,86416\n219030,118\n219030,4597\n219031,81070\n219032,151\n219033,72\n219034,240\n219035,818\n219036,349\n219037,1769\n219038,252\n219039,138686\n219040,175\n219041,707\n219042,247\n219043,30331\n219044,1544\n219045,4611\n219046,6424\n219047,72\n219048,179170\n219049,147\n219050,1220\n219050,1222\n219051,516\n219052,252\n219053,147\n219053,158\n219053,240174\n219055,1014\n219056,72\n219057,500\n219058,1962\n219059,1052\n219060,54\n219061,1882\n219062,2775\n219063,631\n219064,72\n219065,72\n219066,872\n219067,54\n219068,332\n219068,1119\n219068,1745\n219068,127158\n219069,15748\n219070,422\n219071,422\n219072,422\n219073,422\n219074,422\n219075,422\n219076,422\n219077,285\n219078,72\n219079,3370\n219079,14453\n219080,179170\n219081,54\n219083,1769\n219084,72\n219085,179170\n219086,918\n219088,72\n219089,72\n219090,179170\n219091,219092\n219093,285\n219094,250\n219094,1684\n219095,422\n219096,72\n219097,72\n219098,72\n219099,422\n219100,422\n219101,422\n219102,179170\n219103,219104\n219105,179170\n219106,219107\n219109,179170\n219110,219111\n219112,179170\n219115,422\n219116,72\n219117,72\n219118,72\n219119,72\n219120,202\n219120,336\n219120,622\n219121,72\n219122,843\n219123,1227\n219123,86416\n219124,56\n219125,422\n219126,72\n219127,918\n219128,366\n219129,72\n219130,219131\n219132,72\n219133,344\n219134,151\n219135,832\n219136,516\n219137,1893\n219137,7155\n219138,72\n219139,852\n219140,392\n219141,134\n219142,219143\n219144,56\n219145,422\n219146,1220\n219146,1222\n219147,516\n219148,252\n219149,2750\n219150,200\n219152,269\n219153,1220\n219153,1222\n219154,516\n219155,252\n219156,219157\n219158,1773\n219159,255\n219161,252\n219161,1220\n219161,1222\n219162,805\n219163,599\n219165,920\n219166,932\n219167,219168\n219169,1623\n219170,1160\n219171,932\n219173,72\n219174,994\n219175,809\n219176,72\n219177,911\n219179,219180\n219181,252\n219182,516\n219183,1220\n219183,1222\n219184,647\n219184,7155\n219185,186\n219185,3804\n219186,874\n219187,305\n219188,1769\n219189,217\n219190,44\n219191,272\n219192,219193\n219195,179170\n219196,991\n219197,736\n219198,58\n219199,994\n219200,46\n219201,5366\n219202,4039\n219204,273\n219205,155473\n219206,178\n219207,640\n219208,83\n219209,1544\n219209,1572\n219210,72\n219211,83\n219212,2528\n219213,58\n219214,994\n219215,46\n219216,8270\n219217,794\n219218,634\n219219,72\n219220,107\n219221,151\n219222,1559\n219223,55849\n219224,1181\n219225,596\n219226,30\n219227,1381\n219228,10\n219229,217\n219229,240\n219230,302\n219232,72\n219233,72\n219234,155473\n219235,875\n219236,3623\n219237,171\n219238,781\n219239,1132\n219240,1572\n219241,179170\n219242,179170\n219243,535\n219243,2944\n219244,219245\n219246,794\n219247,4903\n219248,179170\n219249,13136\n219250,58\n219251,994\n219252,46\n219253,54\n219254,72\n219255,1014\n219256,1014\n219257,843\n219258,1014\n219259,1014\n219260,1014\n219261,1014\n219262,1014\n219263,1014\n219264,1014\n219265,949\n219266,195\n219266,240\n219266,332\n219266,372\n219266,431\n219266,1285\n219266,1309\n219266,2512\n219266,3328\n219266,9015\n219266,27041\n219267,138686\n219268,175\n219269,1240\n219269,1465\n219270,55849\n219271,151\n219272,1715\n219273,3209\n219274,1655\n219275,72\n219276,994\n219277,219278\n219279,1381\n219280,1113\n219283,219284\n219285,30\n219286,8373\n219287,72\n219289,392\n219289,697\n219290,273\n219292,83\n219292,255\n219293,304\n219295,72\n219296,179170\n219297,141912\n219298,805\n219299,3003\n219300,349\n219301,707\n219302,179170\n219303,179170\n219304,1227\n219304,86416\n219305,72\n219306,72\n219307,781\n219308,1132\n219309,72\n219310,707\n219311,1381\n219312,809\n219313,179170\n219314,179170\n219315,1085\n219316,179170\n219317,219318\n219319,72\n219320,179170\n219321,179170\n219322,1014\n219323,179170\n219324,79\n219325,536\n219326,1381\n219327,525\n219328,55849\n219329,72\n219330,7416\n219331,2979\n219332,219333\n219334,219333\n219335,1014\n219336,292\n219337,179170\n219338,219339\n219338,243969\n219338,261213\n219340,72\n219341,179170\n219342,406\n219343,72\n219344,4597\n219345,186\n219346,1381\n219347,72\n219349,72\n219350,179170\n219351,2646\n219352,219353\n219355,72\n219356,147\n219357,179170\n219358,360\n219359,179170\n219360,1072\n219362,58\n219363,1381\n219364,3623\n219365,179170\n219366,179170\n219367,72\n219368,72\n219369,179170\n219370,219371\n219372,1616\n219373,1235\n219373,1335\n219374,302\n219375,179170\n219376,179170\n219377,1381\n219378,142433\n219379,50\n219380,72\n219381,1801\n219382,1188\n219383,158\n219384,219385\n219386,1381\n219387,5405\n219388,483\n219389,3413\n219390,3148\n219391,219392\n219393,918\n219394,366\n219395,366\n219396,366\n219397,634\n219398,1381\n219399,72\n219400,302\n219401,1388\n219402,1773\n219403,269\n219405,2048\n219406,859\n219407,779\n219408,918\n219409,366\n219410,179170\n219413,48\n219413,94\n219413,273\n219413,994\n219413,1432\n219413,2787\n219413,14434\n219414,366\n219416,219415\n219417,219415\n219418,219415\n219419,406\n219420,219415\n219421,219415\n219422,219415\n219423,219415\n219424,219415\n219425,219415\n219426,219415\n219427,1181\n219428,2750\n219429,1181\n219430,1241\n219431,333\n219431,1102\n219431,1257\n219432,663\n219433,227\n219433,2379\n219434,366\n219435,148742\n219436,843\n219437,676\n219438,219439\n219441,3804\n219442,72\n219443,1551\n219443,3041\n219444,1227\n219444,86416\n219445,72\n219446,872\n219447,784\n219448,1289\n219449,219450\n219451,179170\n219452,1677\n219453,455\n219455,219456\n219457,1160\n219458,417\n219459,137\n219460,932\n219461,195\n219462,312\n219463,151\n219464,83\n219465,87\n219465,515\n219465,2646\n219465,2779\n219465,16687\n219465,136072\n219470,219471\n219472,422\n219473,422\n219474,422\n219475,422\n219476,422\n219477,219478\n219477,236230\n219477,246643\n219477,253678\n219479,462\n219480,219481\n219483,219484\n219486,422\n219487,344\n219488,422\n219489,422\n219490,422\n219491,918\n219492,349\n219493,422\n219495,422\n219496,1635\n219497,219498\n219499,7572\n219500,3\n219501,843\n219502,207837\n219503,179170\n219504,219505\n219507,179170\n219508,179170\n219509,4571\n219510,137\n219511,657\n219512,278\n219513,406\n219514,219515\n219516,219517\n219518,893\n219519,647\n219520,344\n219521,219522\n219526,483\n219528,30\n219529,179170\n219530,154408\n219531,158\n219532,1893\n219533,452\n219534,1247\n219534,164572\n219535,184\n219536,146\n219536,92476\n219537,1773\n219538,240\n219538,269\n219540,179170\n219541,80266\n219542,219543\n219544,72\n219545,219546\n219547,273\n219548,9029\n219549,73218\n219550,219551\n219552,179170\n219553,862\n219554,240\n219555,179170\n219556,58\n219557,179170\n219558,209\n219559,10\n219560,179170\n219561,179170\n219562,424\n219563,179170\n219564,872\n219565,179170\n219567,285\n219568,250\n219568,1684\n219569,918\n219571,30\n219572,104\n219573,179170\n219575,918\n219576,72\n219577,72\n219578,585\n219580,72\n219581,219582\n219583,179170\n219584,219585\n219586,179170\n219587,72\n219588,392\n219589,72\n219590,843\n219591,179170\n219592,219593\n219594,107\n219595,2416\n219595,2417\n219596,292\n219597,338\n219598,298\n219599,1133\n219600,3538\n219602,219603\n219604,179170\n219605,219606\n219607,273\n219608,647\n219609,714\n219610,1235\n219610,20813\n219610,92476\n219611,5\n219611,5366\n219612,973\n219612,1284\n219613,219614\n219615,366\n219616,50\n219617,72\n219618,483\n219618,1415\n219619,200\n219620,841\n219621,30\n219622,30\n219623,1160\n219624,10\n219625,217\n219626,631\n219627,7\n219628,30\n219629,30\n219630,219631\n219632,151\n219633,406\n219634,141912\n219635,44\n219636,219637\n219638,149\n219640,406\n219641,1544\n219642,310\n219642,3039\n219644,483\n219645,13546\n219646,187\n219647,9457\n219648,137\n219649,1580\n219650,393\n219651,2979\n219652,72\n219653,652\n219654,195\n219655,697\n219656,72\n219657,527\n219658,2146\n219659,1313\n219660,843\n219661,2048\n219662,8270\n219662,72439\n219663,344\n219664,1151\n219665,79\n219666,292\n219667,479\n219667,2991\n219668,219669\n219670,1467\n219671,1467\n219672,195\n219673,302\n219674,142433\n219675,6661\n219676,918\n219677,219678\n219679,302\n219680,485\n219681,6661\n219682,184\n219683,2434\n219684,179170\n219685,736\n219686,72\n219687,9024\n219688,972\n219689,366\n219690,10\n219691,179170\n219692,918\n219693,219694\n219695,219696\n219697,72\n219698,918\n219699,179170\n219700,179170\n219701,140\n219701,1179\n219702,179170\n219703,195\n219704,72\n219705,72\n219706,195\n219707,219708\n219709,72\n219711,179170\n219712,328\n219713,647\n219715,346\n219716,447\n219717,2775\n219718,557\n219719,6387\n219720,3319\n219721,2315\n219722,346\n219723,346\n219724,1515\n219725,994\n219726,2506\n219727,707\n219728,872\n219729,872\n219730,485\n219732,179170\n219733,142433\n219734,298\n219735,1849\n219736,1849\n219737,219738\n219739,1359\n219740,179170\n219741,179170\n219742,264\n219742,349\n219742,652\n219742,2312\n219744,872\n219746,818\n219747,1425\n219748,240\n219749,8270\n219749,72439\n219750,179170\n219751,347\n219752,147\n219753,292\n219754,142473\n219755,294\n219756,296\n219757,298\n219758,219759\n219760,843\n219761,219762\n219763,392\n219765,516\n219766,50\n219767,187176\n219769,1087\n219771,72\n219772,285\n219773,202\n219774,1241\n219775,1224\n219776,171\n219777,1033\n219778,7358\n219778,7363\n219779,146952\n219780,58\n219781,994\n219782,46\n219783,48\n219784,292\n219785,1893\n219785,7155\n219786,1381\n219787,160\n219789,615\n219790,79\n219791,4611\n219792,1544\n219793,30\n219793,1179\n219794,120\n219795,1359\n219796,187176\n219797,206\n219797,358\n219797,611\n219798,392\n219800,219801\n219802,171\n219804,211\n219805,1359\n219806,171\n219809,310\n219809,3039\n219811,6661\n219812,481\n219813,660\n219814,843\n219816,219817\n219818,736\n219820,1102\n219821,595\n219822,1309\n219823,595\n219824,809\n219825,1707\n219826,1400\n219827,83\n219828,1238\n219829,1012\n219830,6861\n219831,217\n219832,920\n219833,1452\n219835,1893\n219836,171\n219838,222\n219839,1715\n219840,932\n219841,392\n219842,483\n219843,657\n219843,2421\n219844,1274\n219845,14556\n219846,156379\n219848,79\n219850,1531\n219851,219851\n219852,302\n219853,179170\n219854,2083\n219857,1127\n219859,328\n219860,261\n219860,333\n219861,1849\n219861,148742\n219862,707\n219863,801\n219864,557\n219865,192\n219865,406\n219865,602\n219866,557\n219867,171\n219868,1085\n219869,146\n219869,92476\n219871,781\n219872,1132\n219873,818\n219875,868\n219876,217\n219877,83\n219878,2168\n219879,222\n219880,536\n219881,207\n219882,406\n219883,2620\n219884,1282\n219885,149\n219886,1179\n219887,217\n219887,1417\n219888,1381\n219889,1715\n219890,784\n219891,949\n219891,1274\n219891,7698\n219893,30\n219894,516\n219895,195\n219895,393\n219896,3582\n219897,592\n219898,671\n219899,184925\n219900,3769\n219902,1769\n219903,120\n219904,911\n219904,1285\n219904,1663\n219904,44725\n219905,97\n219907,835\n219908,694\n219912,1188\n219913,1127\n219915,707\n219917,141912\n219918,35486\n219919,2367\n219921,707\n219922,264\n219922,1551\n219922,5440\n219923,1860\n219924,392\n219925,4760\n219926,623\n219927,697\n219928,6955\n219929,3612\n219930,48\n219931,5658\n219932,595\n219933,2274\n219934,4252\n219935,6059\n219937,2674\n219938,302\n219939,3695\n219940,874\n219941,779\n219942,147\n219942,158\n219942,333\n219942,406\n219942,586\n219942,663\n219942,779\n219942,841\n219942,980\n219942,1247\n219942,2931\n219942,4192\n219942,4193\n219942,8270\n219942,8822\n219942,31237\n219942,164572\n219943,1381\n219944,1707\n219945,994\n219946,707\n219948,1402\n219949,6068\n219951,994\n219952,44\n219953,707\n219954,219955\n219956,2017\n219957,1860\n219958,1858\n219959,315\n219959,346\n219961,173366\n219962,149\n219963,83\n219964,872\n219965,173366\n219966,2315\n219969,264\n219969,1033\n219969,5440\n219970,1220\n219970,1222\n219971,7416\n219972,179170\n219975,1381\n219976,195\n219977,1238\n219978,179170\n219979,79\n219980,22\n219981,1955\n219981,3260\n219982,994\n219983,173366\n219983,215874\n219984,693\n219984,6695\n219985,1715\n219986,1381\n219987,292\n219988,1130\n219989,79\n219990,818\n219991,189839\n219992,171\n219993,534\n219994,1274\n219995,1238\n219997,1127\n219997,1893\n219997,5547\n219997,49057\n219998,1983\n219999,179170\n220000,1001\n220001,3999\n220002,192\n220002,333\n220002,1149\n220003,835\n220004,173366\n220005,220006\n220007,953\n220008,209\n220008,893\n220008,3769\n220009,875\n220010,192\n220011,10\n220011,326\n220012,173366\n220013,171\n220014,827\n220015,994\n220016,1860\n220017,1858\n220018,179170\n220019,1274\n220020,3695\n220021,422\n220023,422\n220024,422\n220025,422\n220026,209\n220026,302\n220027,422\n220028,422\n220030,301\n220031,179170\n220032,918\n220033,179170\n220034,707\n220035,151\n220036,483\n220037,179170\n220038,27041\n220039,379\n220040,8270\n220041,1844\n220043,1363\n220044,994\n220048,146\n220048,92476\n220049,344\n220050,647\n220051,220052\n220053,6824\n220053,223410\n220054,647\n220055,344\n220056,146\n220056,92476\n220057,563\n220058,151\n220058,1634\n220059,994\n220060,179170\n220061,1634\n220062,179170\n220064,875\n220066,563\n220067,104\n220068,68\n220068,631\n220069,1769\n220070,27041\n220071,220072\n220074,56\n220075,179170\n220076,23287\n220077,20257\n220078,151\n220079,406\n220080,743\n220081,801\n220082,1151\n220084,179170\n220085,344\n220086,179170\n220088,818\n220089,332\n220090,16683\n220091,994\n220092,179170\n220093,1326\n220094,788\n220095,135\n220096,563\n220097,1085\n220098,1265\n220098,1266\n220099,707\n220100,179170\n220101,158\n220102,422\n220103,10\n220104,1368\n220105,994\n220106,1707\n220107,220108\n220109,79\n220110,79\n220111,179170\n220112,179170\n220113,313\n220113,588\n220113,590\n220114,1181\n220114,1515\n220115,2373\n220116,707\n220117,518\n220118,179170\n220119,160\n220119,818\n220119,127158\n220120,994\n220121,83\n220122,707\n220123,179170\n220124,707\n220125,179170\n220126,9166\n220127,301\n220128,179170\n220129,179170\n220130,302\n220130,406\n220130,420\n220130,1414\n220130,1466\n220131,707\n220132,179170\n220133,179170\n220134,179170\n220135,1572\n220136,250\n220136,1684\n220137,179170\n220138,285\n220139,422\n220140,707\n220141,843\n220142,158\n220144,1635\n220145,4\n220145,5\n220145,10\n220145,50\n220145,56\n220145,79\n220145,147\n220145,158\n220145,171\n220145,192\n220145,195\n220145,206\n220145,272\n220145,323\n220145,406\n220145,602\n220145,622\n220145,628\n220145,640\n220145,693\n220145,779\n220145,841\n220145,920\n220145,957\n220145,1149\n220145,1235\n220145,1247\n220145,1335\n220145,1515\n220145,2244\n220145,2719\n220145,2867\n220145,2868\n220145,3370\n220145,3876\n220145,4865\n220145,4866\n220145,5359\n220145,7270\n220145,8180\n220145,8270\n220145,14352\n220145,14453\n220145,24505\n220145,54064\n220145,88018\n220145,125569\n220145,136574\n220145,164572\n220146,179170\n220147,707\n220148,1388\n220148,1531\n220148,4455\n220149,7155\n220150,113156\n220151,158\n220152,264\n220152,652\n220152,2312\n220153,581\n220154,119\n220155,41\n220156,918\n220157,179170\n220158,179170\n220159,422\n220160,179170\n220161,179170\n220162,179170\n220163,805\n220164,179170\n220165,179170\n220166,179170\n220167,147\n220168,707\n220169,179170\n220170,138686\n220171,175\n220172,179170\n220173,4597\n220174,179170\n220175,10\n220177,994\n220178,1639\n220179,72\n220179,323\n220179,479\n220179,991\n220179,1052\n220179,1102\n220179,1267\n220179,1287\n220179,1579\n220179,1707\n220179,2605\n220179,2744\n220179,4771\n220180,389\n220181,994\n220182,875\n220183,247\n220183,252\n220183,925\n220183,1119\n220183,1175\n220183,1179\n220183,1220\n220183,3218\n220183,255750\n220184,707\n220185,179170\n220186,3769\n220187,1191\n220188,801\n220189,467\n220190,179170\n220191,15573\n220192,452\n220193,30\n220193,1462\n220194,7270\n220195,1414\n220195,4193\n220196,447\n220197,2775\n220198,179170\n220199,179170\n220200,179170\n220201,2944\n220202,1509\n220203,72\n220204,179170\n220205,918\n220206,179170\n220207,707\n220208,179170\n220209,269\n220210,171\n220211,179170\n220212,333\n220213,862\n220214,83\n220215,179170\n220216,83\n220217,994\n220218,1133\n220219,285\n220220,250\n220220,1684\n220222,202\n220223,240\n220224,269\n220225,366\n220226,431\n220226,589\n220226,631\n220226,862\n220226,994\n220226,1001\n220226,2590\n220227,2244\n220228,366\n220229,704\n220230,179170\n220231,30\n220232,4101\n220233,179170\n220234,113156\n220235,849\n220236,685\n220237,911\n220238,809\n220238,861\n220239,1849\n220240,1085\n220241,179170\n220242,220243\n220244,149\n220245,991\n220246,1644\n220246,4193\n220247,34\n220247,4039\n220248,1265\n220248,1266\n220249,2701\n220250,179170\n220251,138686\n220252,175\n220253,4597\n220254,179170\n220255,493\n220255,1266\n220256,179170\n220257,72\n220258,843\n220259,1012\n220260,273\n220261,30\n220262,30\n220263,626\n220264,1531\n220265,1085\n220265,2296\n220266,366\n220267,1160\n220268,1085\n220269,72\n220271,1773\n220273,1454\n220274,179170\n220275,516\n220276,72\n220277,10\n220278,1707\n220279,346\n220280,202\n220281,1801\n220281,3182\n220282,142433\n220283,2590\n220285,589\n220285,1085\n220285,1663\n220285,75912\n220285,127158\n220287,2590\n220287,5101\n220288,1801\n220290,213089\n220291,994\n220294,344\n220295,577\n220295,138686\n220296,222\n220296,5343\n220297,147\n220298,6068\n220299,72\n220300,310\n220301,185877\n220302,868\n220303,206\n220304,1564\n220305,269\n220306,1608\n220307,1132\n220308,994\n220309,209\n220310,1014\n220311,920\n220312,1014\n220313,1634\n220314,142426\n220315,666\n220315,783\n220316,151\n220317,1801\n220317,4760\n220317,5591\n220317,6068\n220318,1014\n220319,1151\n220320,1608\n220321,1132\n220322,1608\n220323,1132\n220324,752\n220325,158\n220325,2931\n220325,8822\n220327,3769\n220328,179170\n220329,30\n220330,435\n220331,179170\n220332,1860\n220333,1858\n220334,818\n220335,366\n220336,1860\n220338,994\n220339,1608\n220340,1132\n220342,366\n220343,1564\n220344,994\n220345,138686\n220346,175\n220347,167\n220347,73570\n220348,932\n220349,1146\n220351,1085\n220352,1033\n220353,1663\n220354,1014\n220355,707\n220356,3\n220357,1381\n220358,1127\n220360,312\n220361,1247\n220361,164572\n220362,1274\n220363,852\n220364,752\n220365,214734\n220366,360\n220368,310\n220368,3039\n220369,222\n220370,360\n220372,779\n220373,83\n220374,1274\n220375,1551\n220376,217\n220377,406\n220378,217\n220379,1415\n220380,1014\n220381,1608\n220382,356\n220382,852\n220384,640\n220385,330\n220386,211\n220387,707\n220390,86\n220390,167\n220390,301\n220390,783\n220390,968\n220390,1837\n220391,160\n220392,422\n220393,1381\n220394,994\n220395,596\n220396,162599\n220397,81070\n220398,1837\n220399,147\n220401,158\n220402,707\n220403,503\n220404,422\n220405,22\n220406,205627\n220407,162599\n220407,221299\n220408,186522\n220409,818\n220410,151\n220411,209\n220412,707\n220413,994\n220416,994\n220417,81\n220418,994\n220420,81\n220421,3653\n220423,44\n220425,328\n220426,387\n220427,493\n220427,191860\n220428,707\n220429,1151\n220432,1284\n220433,273\n220434,8180\n220435,422\n220436,676\n220437,422\n220438,422\n220439,422\n220440,422\n220443,875\n220444,349\n220445,10\n220447,22\n220448,79\n220449,1179\n220450,720\n220451,3846\n220452,107\n220453,406\n220454,634\n220456,209\n220457,30\n220458,217\n220458,2580\n220458,5213\n220459,795\n220460,1001\n220461,406\n220461,1181\n220462,220463\n220462,238713\n220464,30\n220465,30\n220466,328\n220467,179170\n220468,2244\n220469,328\n220471,422\n220473,809\n220474,2372\n220475,752\n220476,491\n220477,30\n220478,211\n220479,697\n220480,1479\n220481,1132\n220482,160\n220483,30\n220484,1962\n220485,862\n220486,809\n220486,19010\n220487,179170\n220488,422\n220489,1608\n220491,355\n220493,1132\n220494,252\n220495,179170\n220496,875\n220497,1663\n220498,1381\n220499,1014\n220500,1147\n220500,1559\n220501,435\n220502,1\n220502,147\n220502,149\n220502,158\n220502,406\n220502,622\n220502,1515\n220502,15439\n220502,21442\n220502,55849\n220502,220502\n220503,392\n220503,220502\n220504,707\n220505,918\n220506,2411\n220507,179170\n220508,2944\n220509,302\n220510,72\n220511,1860\n220512,1858\n220513,220502\n220514,302\n220515,422\n220516,422\n220517,30\n220518,211\n220520,179170\n220522,1860\n220523,1858\n220524,30\n220526,707\n220527,1014\n220528,707\n220529,422\n220530,179170\n220531,3695\n220532,843\n220533,142426\n220534,707\n220536,48\n220536,130\n220536,312\n220536,991\n220536,1707\n220536,2605\n220536,3695\n220536,155473\n220538,918\n220539,920\n220540,760\n220541,215\n220542,72\n220543,220544\n220545,850\n220546,79\n220547,179170\n220548,149\n220549,30\n220550,1014\n220551,120\n220552,301\n220553,179170\n220554,179170\n220555,515\n220556,707\n220557,1052\n220558,1962\n220559,54\n220560,500\n220561,2775\n220562,1882\n220563,1608\n220564,1132\n220565,1608\n220566,1132\n220567,392\n220567,3258\n220568,707\n220569,30\n220570,1\n220571,301\n220571,1160\n220572,30\n220573,179170\n220574,269\n220575,567\n220575,666\n220575,2372\n220576,1132\n220577,30\n220578,7360\n220579,994\n220580,146\n220580,994\n220580,4094\n220580,92476\n220581,151\n220582,48\n220584,973\n220585,289\n220585,290\n220585,94134\n220586,140\n220586,1984\n220587,30\n220588,10\n220589,179170\n220590,179170\n220591,264\n220592,1556\n220593,192\n220594,809\n220595,30\n220596,301\n220598,107\n220599,179170\n220600,3623\n220601,752\n220602,1247\n220602,164572\n220603,452\n220604,184\n220605,179170\n220606,179170\n220607,862\n220608,2379\n220609,179170\n220610,563\n220611,1789\n220612,1014\n220613,179170\n220614,835\n220615,1415\n220617,147\n220617,158\n220617,314\n220618,875\n220619,1160\n220620,994\n220621,1085\n220622,1715\n220623,240\n220624,631\n220625,2244\n220626,30\n220627,707\n220629,272\n220630,160\n220631,179170\n220632,885\n220632,13704\n220633,8270\n220634,179170\n220635,1001\n220636,779\n220637,2244\n220638,835\n220639,2373\n220640,707\n220642,2421\n220643,179170\n220644,3623\n220645,557\n220646,4611\n220647,179170\n220649,179170\n220650,179170\n220651,389\n220651,1849\n220652,994\n220654,34580\n220655,2421\n220656,115\n220657,2353\n220658,83\n220659,179170\n220660,264\n220660,36819\n220661,503\n220661,4355\n220662,360\n220663,179170\n220664,147\n220664,1309\n220665,146\n220665,92476\n220666,647\n220667,344\n220668,159365\n220669,179170\n220670,179170\n220671,875\n220672,673\n220673,932\n220674,1474\n220675,1010\n220676,390\n220678,278\n220679,2646\n220680,83\n220681,179170\n220682,994\n220683,2923\n220684,179170\n220685,1133\n220686,179170\n220687,142405\n220688,996\n220689,994\n220690,994\n220691,285\n220693,1326\n220694,217\n220695,30\n220695,32\n220695,50\n220695,58\n220695,106\n220695,111\n220695,134\n220695,146\n220695,158\n220695,178\n220695,192\n220695,200\n220695,202\n220695,206\n220695,215\n220695,225\n220695,233\n220695,252\n220695,261\n220695,272\n220695,285\n220695,333\n220695,337\n220695,346\n220695,393\n220695,406\n220695,422\n220695,439\n220695,516\n220695,525\n220695,536\n220695,538\n220695,585\n220695,586\n220695,589\n220695,592\n220695,602\n220695,609\n220695,620\n220695,626\n220695,640\n220695,671\n220695,714\n220695,760\n220695,779\n220695,862\n220695,907\n220695,925\n220695,934\n220695,968\n220695,973\n220695,980\n220695,996\n220695,1007\n220695,1010\n220695,1033\n220695,1068\n220695,1082\n220695,1133\n220695,1220\n220695,1222\n220695,1231\n220695,1247\n220695,1326\n220695,1370\n220695,1425\n220695,1452\n220695,1515\n220695,1522\n220695,1531\n220695,1544\n220695,1551\n220695,1608\n220695,1782\n220695,1882\n220695,1963\n220695,2205\n220695,2244\n220695,2353\n220695,2567\n220695,2782\n220695,2931\n220695,2995\n220695,3085\n220695,3148\n220695,3193\n220695,3804\n220695,4237\n220695,4355\n220695,4545\n220695,5440\n220695,5874\n220695,6119\n220695,7270\n220695,8855\n220695,9007\n220695,15573\n220695,33424\n220695,56150\n220695,59021\n220695,92476\n220695,164572\n220695,182162\n220696,707\n220697,707\n220698,147191\n220699,818\n220700,973\n220701,994\n220702,994\n220703,302\n220704,994\n220705,146\n220705,92476\n220706,647\n220707,344\n220708,779\n220709,179170\n220710,346\n220711,707\n220712,72\n220714,179170\n220716,330\n220717,1058\n220718,278\n220719,2244\n220720,10\n220721,346\n220722,147\n220723,2244\n220724,516\n220725,179170\n220726,875\n220727,179170\n220730,179170\n220731,1014\n220734,292\n220735,994\n220736,1381\n220737,920\n220738,994\n220739,138686\n220740,707\n220741,175\n220742,72\n220743,220502\n220744,994\n220745,179170\n220746,81\n220746,215\n220746,1016\n220746,1282\n220746,9001\n220747,795\n220748,179170\n220749,1298\n220750,79\n220751,1363\n220752,179170\n220753,994\n220754,15573\n220755,5961\n220756,2116\n220757,1014\n220758,4571\n220759,3623\n220760,147\n220761,818\n220762,179170\n220763,932\n220764,179170\n220765,994\n220766,760\n220766,1631\n220767,577\n220768,483\n220769,707\n220770,255\n220771,302\n220772,158\n220772,192\n220772,206\n220772,285\n220772,406\n220772,422\n220772,424\n220772,493\n220772,779\n220772,2244\n220772,5101\n220772,142433\n220773,179170\n220774,72\n220775,994\n220776,861\n220777,217\n220778,3367\n220779,783\n220780,1467\n220781,1019\n220782,83\n220783,278\n220784,536\n220785,179170\n220786,516\n220787,8270\n220788,179170\n220789,179170\n220790,220791\n220793,298\n220794,485\n220795,918\n220796,333\n220796,23783\n220797,72\n220799,1623\n220800,1309\n220801,72\n220802,220803\n220804,483\n220805,811\n220806,3623\n220807,220808\n220809,424\n220810,30331\n220811,41\n220812,83\n220813,590\n220813,1419\n220814,6955\n220814,17263\n220815,220816\n220816,220817\n220818,1227\n220818,86416\n220819,289\n220819,290\n220819,94134\n220820,968\n220821,142870\n220822,171\n220823,72\n220824,1551\n220825,220826\n220827,220828\n220829,195\n220830,81\n220831,323\n220832,479\n220833,217\n220834,615\n220835,1740\n220836,872\n220837,179170\n220838,1429\n220839,2590\n220840,292\n220841,247\n220842,589\n220842,862\n220842,1001\n220842,1474\n220842,44725\n220843,138686\n220844,175\n220845,247\n220847,4192\n220847,4193\n220848,220849\n220850,207\n220851,97\n220852,72\n220853,1001\n220854,843\n220855,72\n220856,563\n220857,1467\n220858,250\n220858,1684\n220859,285\n220860,455\n220861,220862\n220863,779\n220864,273\n220865,2424\n220866,862\n220866,2590\n220867,1871\n220868,2421\n220869,83\n220870,13980\n220871,72\n220872,285\n220873,31934\n220874,31934\n220875,31934\n220876,159365\n220877,850\n220878,240\n220878,5310\n220879,72\n220880,467\n220881,115659\n220882,1143\n220883,220884\n220885,72\n220885,195\n220886,1821\n220886,21736\n220887,668\n220888,660\n220889,259\n220891,259\n220892,991\n220893,4475\n220894,1608\n220895,1132\n220897,160\n220898,136072\n220899,3830\n220900,120\n220900,2797\n220900,2807\n220900,2812\n220901,1359\n220903,220904\n220905,1370\n220906,1400\n220907,366\n220908,366\n220909,366\n220911,366\n220912,309\n220912,310\n220914,1368\n220915,1118\n220916,557\n220917,1368\n220919,6059\n220920,285\n220920,118336\n220921,1425\n220922,707\n220924,1983\n220925,949\n220925,127158\n220925,194645\n220927,1722\n220929,72\n220930,393\n220931,919\n220932,151\n220933,1\n220935,118336\n220936,536\n220936,1417\n220937,207\n220938,3367\n220939,217\n220939,248\n220939,714\n220939,1016\n220939,1119\n220939,1282\n220939,1417\n220939,2205\n220939,6556\n220939,33424\n220939,245910\n220940,333\n220941,818\n220942,1132\n220943,1608\n220944,4237\n220944,182162\n220945,220502\n220948,392\n220949,516\n220950,252\n220951,1220\n220951,1222\n220952,1220\n220952,1222\n220953,251\n220955,850\n220956,920\n220957,366\n220958,366\n220959,220960\n220962,158\n220963,1010\n220964,111\n220964,290\n220964,309\n220964,310\n220964,94134\n220965,41\n220966,602\n220969,5976\n220971,932\n220972,366\n220973,50\n220974,30\n220975,5213\n220976,422\n220978,195\n220980,217\n220981,3094\n220982,805\n220983,1359\n220984,485\n220985,298\n220986,366\n220987,862\n220987,1253\n220988,83\n220989,4611\n220990,301\n220990,657\n220991,220992\n220993,30\n220996,306\n220996,307\n220996,406\n220996,779\n220996,1181\n220996,4193\n220997,1608\n220998,1132\n220999,422\n221000,422\n221001,217\n221002,491\n221003,422\n221004,980\n221005,422\n221006,676\n221007,652\n221008,422\n221009,422\n221010,171\n221011,211889\n221012,1707\n221013,422\n221014,422\n221015,147\n221015,406\n221016,422\n221017,717\n221018,707\n221019,360\n221020,1087\n221021,1388\n221022,30\n221023,489\n221024,1085\n221025,179170\n221026,221027\n221028,516\n221029,818\n221030,585\n221031,1149\n221032,640\n221033,736\n221034,60576\n221035,356\n221036,657\n221036,2266\n221037,920\n221038,2334\n221039,536\n221040,779\n221041,875\n221042,217\n221043,503\n221044,58\n221045,1238\n221046,392\n221047,1836\n221048,292\n221049,1016\n221050,1452\n221051,805\n221052,392\n221052,644\n221053,1639\n221054,1773\n221057,1033\n221059,1052\n221062,107\n221063,1293\n221064,1417\n221065,518\n221066,220502\n221068,397\n221068,1085\n221068,2572\n221068,2913\n221068,4222\n221068,18221\n221068,99756\n221068,185874\n221068,185877\n221069,442\n221070,707\n221071,21442\n221072,994\n221073,144556\n221074,4611\n221075,2244\n221076,30\n221077,1419\n221080,473\n221081,141912\n221082,994\n221083,5405\n221084,397\n221085,392\n221086,68069\n221088,115\n221091,1860\n221092,1858\n221093,1359\n221094,1294\n221095,344\n221096,3623\n221097,30\n221098,2421\n221100,7124\n221101,178576\n221102,30\n221103,422\n221104,1955\n221106,8270\n221107,220502\n221108,422\n221109,2244\n221110,30\n221111,30\n221112,30\n221113,779\n221114,72\n221115,151\n221116,313\n221117,657\n221118,1014\n221119,138686\n221120,175\n221121,209\n221122,273\n221123,179170\n221124,30\n221125,450\n221126,130\n221127,221128\n221129,302\n221131,861\n221132,179170\n221133,843\n221134,309\n221134,310\n221134,221292\n221135,179170\n221136,83\n221137,1608\n221138,1132\n221139,1132\n221140,1608\n221141,1132\n221142,179170\n221144,19010\n221145,422\n221146,56\n221147,422\n221148,2421\n221149,408\n221149,581\n221149,589\n221149,647\n221149,1623\n221149,1718\n221151,2750\n221152,1052\n221153,1962\n221154,30\n221155,54\n221155,221301\n221156,500\n221157,1882\n221158,2775\n221159,30\n221160,515\n221161,179170\n221162,302\n221163,167\n221163,73570\n221165,120\n221166,179170\n221167,302\n221169,267\n221170,1007\n221171,79\n221171,779\n221172,179170\n221173,221174\n221175,179170\n221176,167\n221176,338\n221176,907\n221176,1085\n221176,1119\n221176,1210\n221176,1284\n221176,2083\n221176,2372\n221176,3218\n221177,220502\n221178,589\n221179,861\n221179,6556\n221180,147191\n221181,220502\n221182,179170\n221183,58\n221184,994\n221185,46\n221186,1001\n221187,994\n221188,1608\n221189,493\n221190,422\n221191,56\n221192,1782\n221193,918\n221194,4237\n221194,182162\n221195,406\n221196,309\n221196,310\n221196,221292\n221197,1556\n221198,179170\n221199,56\n221200,422\n221201,81\n221201,592\n221202,6119\n221203,875\n221204,13661\n221205,179170\n221206,179170\n221207,652\n221208,179170\n221209,349\n221210,483\n221211,1132\n221212,1608\n221213,179170\n221214,126\n221215,179170\n221217,328\n221218,10\n221219,95554\n221220,179170\n221221,6068\n221222,225\n221223,34\n221223,6303\n221224,1133\n221225,4039\n221226,4475\n221227,5440\n221228,1052\n221230,577\n221232,179170\n221233,151\n221235,179170\n221236,179170\n221237,1132\n221238,1608\n221239,179170\n221241,179170\n221243,179170\n221244,188791\n221245,81\n221246,1147\n221248,179170\n221249,220816\n221250,141912\n221251,220816\n221253,179170\n221254,634\n221256,994\n221257,518\n221259,269\n221260,2244\n221262,292\n221263,179170\n221264,50\n221265,220816\n221266,58\n221267,994\n221268,46\n221269,1608\n221270,1\n221271,195\n221272,179170\n221273,1133\n221274,563\n221275,179170\n221276,30\n221277,179170\n221282,1326\n221282,221286\n221283,408\n221283,221287\n221285,102\n221285,221288\n221289,1323\n221289,221325\n221290,179170\n221290,221330\n221295,58\n221296,46\n221296,221284\n221297,994\n221308,309\n221308,310\n221308,221292\n221312,1769\n221316,83\n221316,221317\n221318,217\n221318,221319\n221320,220816\n221320,221321\n221335,862\n221335,221310\n221337,703\n221337,949\n221337,2646\n221337,3182\n221337,3258\n221337,221338\n221342,999\n221343,302\n221344,360\n221345,179170\n221346,178\n221347,137\n221348,1769\n221349,3623\n221350,30\n221351,30\n221352,30\n221353,433\n221354,861\n221355,9010\n221356,30\n221357,779\n221358,957\n221358,1815\n221359,179170\n221360,3830\n221361,83\n221362,56\n221363,422\n221364,179170\n221366,220816\n221367,179170\n221368,4571\n221369,179170\n221370,179170\n221371,220816\n221372,422\n221373,994\n221374,918\n221375,179170\n221376,179170\n221377,220816\n221378,179170\n221379,1220\n221379,1222\n221380,516\n221381,252\n221382,179170\n221383,328\n221383,1801\n221384,60576\n221385,220816\n221387,994\n221388,557\n221389,179170\n221390,278\n221391,509\n221392,250\n221392,1684\n221393,285\n221394,179170\n221395,255\n221396,220816\n221397,220816\n221398,104\n221398,1179\n221398,5405\n221399,142870\n221401,220816\n221403,1\n221404,290\n221404,479\n221404,94134\n221405,6068\n221406,1151\n221407,127158\n221408,255\n221410,220816\n221411,179170\n221412,220816\n221413,158\n221414,179170\n221415,149\n221416,220816\n221418,5101\n221418,15119\n221419,151\n221420,388\n221421,46129\n221421,213931\n221422,1474\n221423,673\n221424,795\n221425,220816\n221426,30\n221427,1608\n221428,179170\n221429,301\n221430,30\n221431,179170\n221432,179170\n221433,220816\n221434,557\n221435,278\n221436,626\n221437,137\n221438,5906\n221439,862\n221441,994\n221442,326\n221443,220816\n221444,220816\n221445,142870\n221447,179170\n221448,1363\n221449,779\n221450,220816\n221451,179170\n221452,179170\n221453,138686\n221454,175\n221455,179170\n221456,586\n221457,179170\n221458,179170\n221459,389\n221460,104\n221460,557\n221460,885\n221460,1368\n221460,1939\n221460,5405\n221460,13704\n221461,707\n221462,179170\n221463,220816\n221464,406\n221467,179170\n221468,406\n221469,79\n221471,30\n221472,919\n221473,1151\n221474,179170\n221476,920\n221477,422\n221478,873\n221478,874\n221478,1210\n221479,179170\n221480,8854\n221481,179170\n221482,179170\n221483,179170\n221484,30\n221485,48\n221486,805\n221488,344\n221489,3331\n221490,1238\n221491,179170\n221492,255\n221493,137\n221494,179170\n221495,2867\n221495,2868\n221496,220816\n221497,147\n221498,994\n221499,535\n221500,220816\n221501,72\n221502,147\n221502,149\n221502,158\n221503,220816\n221504,452\n221504,590\n221505,707\n221506,179170\n221507,220816\n221508,2244\n221509,221510\n221511,138686\n221512,175\n221513,247\n221513,2867\n221513,2868\n221514,220816\n221515,1379\n221516,779\n221517,54\n221518,4237\n221518,182162\n221519,179170\n221520,994\n221521,220816\n221522,994\n221523,479\n221523,9030\n221525,179170\n221526,179170\n221527,220816\n221528,272\n221529,83\n221530,666\n221531,155481\n221532,292\n221534,221535\n221536,3148\n221537,179170\n221538,179170\n221539,994\n221540,179170\n221541,171\n221542,142405\n221543,179170\n221544,79\n221545,206\n221546,1052\n221547,19\n221547,222\n221547,536\n221547,781\n221547,1274\n221547,2553\n221547,14556\n221547,115474\n221548,577\n221549,158\n221550,994\n221551,30\n221552,1368\n221553,221554\n221553,250056\n221555,179170\n221556,1313\n221557,818\n221558,2116\n221559,285\n221560,323\n221561,179170\n221562,37\n221562,264\n221562,1289\n221562,16687\n221563,17772\n221564,1227\n221564,86416\n221565,171\n221566,83\n221567,30\n221568,247\n221570,30\n221571,137\n221572,3182\n221573,467\n221575,309\n221575,310\n221575,6556\n221576,30\n221577,918\n221578,491\n221579,585\n221580,267\n221581,1163\n221582,200\n221583,137\n221584,149\n221585,707\n221587,141912\n221588,337\n221590,9195\n221591,205\n221592,652\n221593,510\n221593,1453\n221594,2416\n221594,2417\n221595,581\n221596,178\n221597,1227\n221597,86416\n221598,2416\n221598,2417\n221599,30331\n221600,42220\n221601,151\n221602,304\n221603,2416\n221603,2417\n221605,42220\n221606,151\n221607,1381\n221608,862\n221609,2590\n221610,30\n221611,1368\n221612,96187\n221613,4597\n221614,2048\n221615,2416\n221615,2417\n221616,5343\n221617,1572\n221618,179170\n221619,1274\n221620,5726\n221621,8180\n221622,221623\n221624,56\n221625,422\n221626,872\n221627,179170\n221628,179170\n221629,79\n221630,310\n221631,1102\n221632,179170\n221634,323\n221635,1332\n221636,211\n221637,615\n221638,178\n221639,221640\n221641,1429\n221642,220502\n221644,4597\n221645,2744\n221646,668\n221647,500\n221648,138686\n221649,175\n221650,697\n221650,1769\n221651,3297\n221652,985\n221653,1132\n221654,3182\n221656,671\n221657,1298\n221658,726\n221659,726\n221660,147\n221660,158\n221664,222\n221665,220502\n221666,1285\n221666,44725\n221667,707\n221668,779\n221669,221670\n221673,387\n221674,991\n221675,60576\n221676,135\n221677,3367\n221678,136\n221679,222\n221680,1644\n221681,1345\n221682,206\n221683,104\n221683,557\n221683,885\n221683,1368\n221683,1939\n221683,5405\n221683,13704\n221684,272\n221685,207\n221686,4165\n221689,4594\n221690,1608\n221691,221692\n221693,397\n221694,1240\n221695,872\n221697,211\n221698,221699\n221698,227902\n221700,1293\n221703,83\n221703,217\n221703,949\n221703,1467\n221704,592\n221705,56\n221706,422\n221707,3367\n221708,1607\n221710,190492\n221711,599\n221713,178\n221714,1639\n221716,1160\n221717,599\n221718,640\n221719,640\n221720,640\n221721,1608\n221722,233\n221722,973\n221722,4146\n221723,179170\n221724,167\n221725,7757\n221726,138686\n221727,175\n221728,179170\n221729,30\n221730,567\n221730,1300\n221730,1580\n221730,103860\n221730,186657\n221731,30\n221732,79\n221733,30\n221734,760\n221734,1436\n221735,818\n221736,221737\n221739,818\n221740,1007\n221741,221742\n221745,1381\n221746,920\n221747,149\n221747,21442\n221748,2979\n221749,366\n221750,366\n221751,366\n221752,366\n221753,1467\n221754,179170\n221756,707\n221757,1836\n221758,1298\n221759,4672\n221760,1359\n221761,707\n221762,221763\n221764,221765\n221766,707\n221767,30\n221768,1274\n221769,509\n221770,1634\n221771,30\n221772,138686\n221773,175\n221774,707\n221775,3094\n221776,273\n221777,83\n221778,707\n221779,1608\n221780,1132\n221781,707\n221782,1634\n221783,515\n221784,273\n221785,8235\n221786,271\n221787,5976\n221788,217\n221789,875\n221791,8270\n221792,991\n221793,220502\n221794,3582\n221795,1776\n221796,450\n221797,7270\n221798,1238\n221799,1634\n221800,158\n221801,1132\n221802,707\n221803,707\n221804,1556\n221804,4453\n221805,217\n221806,479\n221807,479\n221808,1452\n221809,653\n221809,48505\n221811,142870\n221814,1381\n221817,2205\n221817,33424\n221818,145240\n221819,640\n221820,2979\n221821,6323\n221822,60576\n221823,704\n221824,6119\n221825,337\n221826,595\n221827,221828\n221828,301\n221828,446\n221828,615\n221828,685\n221828,937\n221828,1293\n221828,3422\n221828,5662\n221828,134681\n221828,158592\n221828,170729\n221828,218675\n221828,221828\n221828,221920\n221828,221921\n221828,223770\n221828,224790\n221828,227376\n221828,228848\n221829,5547\n221830,220502\n221832,72764\n221833,154408\n221835,292\n221836,1143\n221837,158\n221838,221839\n221841,269\n221842,2205\n221842,33424\n221844,50\n221845,1181\n221846,179170\n221848,652\n221849,2205\n221849,33424\n221850,1381\n221851,1849\n221852,835\n221853,142870\n221854,1458\n221855,1467\n221856,868\n221857,2353\n221858,406\n221859,50\n221861,1132\n221862,1608\n221863,217\n221864,7757\n221865,44\n221866,149\n221867,366\n221868,932\n221869,515\n221870,1381\n221871,145524\n221871,221872\n221873,333\n221874,83\n221875,500\n221876,1052\n221877,1882\n221878,54\n221879,2775\n221880,1962\n221881,1984\n221882,392\n221883,5658\n221884,4252\n221885,1860\n221886,623\n221887,4760\n221888,697\n221889,6059\n221890,6955\n221891,3612\n221892,595\n221893,2274\n221894,149\n221895,1465\n221896,1284\n221896,148742\n221897,30\n221901,760\n221903,273\n221904,1479\n221907,221908\n221909,422\n221910,1436\n221911,422\n221912,1782\n221913,422\n221914,994\n221915,1608\n221916,718\n221917,636\n221917,6880\n221918,422\n221919,302\n221920,301\n221920,1293\n221920,1782\n221920,4270\n221920,6398\n221920,6474\n221920,7222\n221920,13454\n221920,14598\n221920,20550\n221920,21435\n221920,26287\n221920,28317\n221920,34162\n221920,36563\n221920,68131\n221920,77104\n221920,78740\n221920,82739\n221920,83493\n221920,85983\n221920,87287\n221920,87399\n221920,101485\n221920,134681\n221920,137752\n221920,142806\n221920,177568\n221920,189303\n221920,195508\n221920,212351\n221920,218675\n221920,220326\n221920,221828\n221920,221920\n221920,228848\n221920,235950\n221920,243207\n221920,251370\n221920,253100\n221920,255059\n221920,256194\n221920,257987\n221920,260117\n221920,262478\n221920,263964\n221920,264505\n221922,179170\n221923,1608\n221924,1132\n221925,83\n221926,861\n221927,843\n221928,30\n221929,30\n221930,1118\n221931,1238\n221933,406\n221935,835\n221937,171\n221938,349\n221939,211\n221940,179170\n221941,818\n221942,818\n221943,179170\n221944,1608\n221945,1132\n221947,83\n221949,3999\n221950,332\n221952,149\n221953,392\n221954,5658\n221955,4252\n221956,623\n221957,697\n221958,1860\n221959,6955\n221960,4760\n221961,6059\n221962,3612\n221963,595\n221964,2274\n221965,433\n221966,1132\n221967,994\n221968,1608\n221969,875\n221970,312\n221971,179170\n221972,843\n221973,577\n221973,1429\n221974,1287\n221975,1612\n221976,256\n221977,1007\n221978,1860\n221979,1858\n221980,2460\n221982,179170\n221983,1608\n221984,83\n221985,1462\n221985,8537\n221986,256\n221986,483\n221986,827\n221986,3089\n221986,3524\n221987,4260\n221988,406\n221989,323\n221990,779\n221991,138686\n221992,175\n221993,220502\n221994,30\n221994,330\n221995,179170\n221996,3623\n221997,994\n221998,422\n221999,3623\n222000,179170\n222001,302\n222002,206\n222003,302\n222004,1860\n222005,1858\n222006,1465\n222007,349\n222008,171\n222009,142409\n222010,315\n222010,15179\n222011,563\n222012,30\n222013,918\n222014,389\n222015,1151\n222016,179170\n222017,875\n222018,179170\n222019,50\n222020,10\n222021,179170\n222022,30\n222023,1132\n222024,1608\n222025,338\n222026,994\n222027,220816\n222028,179170\n222029,48\n222030,179170\n222031,652\n222033,54\n222033,278\n222033,1019\n222033,2424\n222034,452\n222035,179170\n222037,1227\n222037,86416\n222038,179170\n222039,422\n222040,179170\n222041,179170\n222042,1231\n222042,1782\n222043,83\n222044,918\n222047,516\n222048,422\n222049,1556\n222051,255\n222052,30\n222053,97\n222054,151\n222056,483\n222057,278\n222058,652\n222059,1368\n222060,171\n222061,135\n222062,179170\n222063,1151\n222065,920\n222066,1860\n222067,1858\n222068,372\n222069,179170\n222070,525\n222071,179170\n222072,1590\n222073,8373\n222074,179170\n222075,1133\n222076,1309\n222077,406\n222078,179170\n222079,1285\n222080,179170\n222081,285\n222082,1639\n222083,1210\n222084,422\n222085,72\n222086,79\n222087,179170\n222088,304\n222089,631\n222090,30\n222091,285\n222091,336\n222091,118336\n222092,622\n222093,795\n222094,873\n222096,862\n222097,294\n222098,340\n222099,50\n222100,657\n222100,2421\n222101,3218\n222102,1085\n222103,179170\n222104,333\n222104,1266\n222106,151\n222107,516\n222108,5366\n222109,179170\n222110,2367\n222111,264\n222111,736\n222112,874\n222113,515\n222114,326\n222115,1\n222116,240\n222117,422\n222118,808\n222119,220816\n222120,179170\n222121,141912\n222122,155481\n222123,1522\n222124,179170\n222125,30\n222126,1160\n222128,1241\n222129,467\n222130,1571\n222131,220816\n222132,516\n222133,328\n222134,86\n222134,167\n222134,301\n222134,907\n222134,1284\n222134,1522\n222134,2083\n222134,2191\n222134,2557\n222134,2979\n222134,3138\n222135,220816\n222136,1515\n222137,515\n222138,179170\n222139,918\n222140,179170\n222141,220816\n222142,250\n222142,1684\n222143,420\n222144,83\n222145,104\n222146,83\n222147,422\n222147,5405\n222148,107\n222149,220816\n222150,99287\n222151,872\n222152,251\n222152,252\n222152,1220\n222152,1222\n222153,3148\n222154,1368\n222155,83\n222156,1359\n222157,179170\n222158,179170\n222159,406\n222160,1858\n222161,179170\n222162,179170\n222163,7416\n222164,179170\n222165,4594\n222166,149\n222167,220816\n222168,2373\n222169,220816\n222170,435\n222171,220816\n222172,191860\n222173,1359\n222174,220816\n222175,6424\n222176,56\n222177,422\n222178,841\n222179,30\n222180,1127\n222181,1160\n222182,843\n222183,79\n222184,179170\n222185,220816\n222186,4545\n222186,56150\n222187,81070\n222188,1\n222189,557\n222190,179170\n222191,862\n222192,6059\n222193,1388\n222194,179170\n222195,179170\n222197,328\n222198,200\n222199,179170\n222200,1465\n222201,874\n222202,179170\n222203,179170\n222204,179170\n222205,3138\n222206,850\n222207,151\n222208,179170\n222209,536\n222210,30\n222211,596\n222212,3297\n222213,333\n222214,3413\n222215,217\n222216,30\n222217,1332\n222218,30\n222219,330\n222220,195\n222221,805\n222222,30\n222224,79\n222225,83\n222226,850\n222227,179170\n222228,179170\n222229,273\n222230,5405\n222231,272\n222232,220816\n222233,220816\n222234,479\n222235,2266\n222236,220816\n222237,330\n222238,563\n222240,233\n222241,15119\n222242,309\n222242,310\n222243,220816\n222244,220816\n222245,2735\n222246,167\n222246,2979\n222247,994\n222248,994\n222249,994\n222250,220816\n222251,21442\n222252,344\n222253,220816\n222254,138686\n222255,175\n222256,4597\n222257,222258\n222257,223384\n222259,795\n222260,30\n222261,338\n222262,220816\n222263,536\n222264,2735\n222265,1252\n222265,1253\n222266,220816\n222267,920\n222268,272\n222269,86416\n222270,220816\n222271,147\n222272,752\n222273,63\n222274,222275\n222276,171\n222277,179170\n222278,285\n222279,50\n222280,1235\n222280,1335\n222281,957\n222281,1815\n222282,179170\n222283,179170\n222284,1163\n222285,893\n222285,6303\n222286,179170\n222287,179170\n222288,3161\n222289,179170\n222290,313\n222291,179170\n222292,179170\n222293,179170\n222294,269\n222295,222296\n222297,72\n222298,179170\n222299,1177\n222299,182162\n222300,2048\n222301,2048\n222302,1160\n222303,222304\n222305,2411\n222306,994\n222307,137\n222308,171\n222309,1453\n222310,206059\n222311,586\n222311,1243\n222312,285\n222313,179170\n222314,275\n222315,56\n222316,422\n222317,72\n222318,179170\n222319,240\n222320,1227\n222320,86416\n222321,179170\n222322,240\n222323,338\n222324,1175\n222325,2146\n222326,200\n222327,179170\n222328,222\n222328,1381\n222328,2292\n222329,179170\n222330,151\n222331,918\n222332,179170\n222333,2048\n222334,3\n222335,179170\n222336,387\n222337,174564\n222338,136\n222339,3370\n222339,14453\n222341,151\n222341,663\n222342,222343\n222344,2775\n222344,6837\n222345,818\n222346,364\n222347,1160\n222349,7124\n222350,422\n222351,56\n222352,1181\n222353,579\n222354,264\n222354,538\n222354,1345\n222355,187176\n222357,215276\n222358,79\n222359,3297\n222360,557\n222361,356\n222362,6506\n222363,1181\n222364,1722\n222368,30\n222369,493\n222369,682\n222369,2244\n222369,72439\n222370,79\n222371,649\n222372,640\n222373,640\n222375,640\n222376,640\n222377,640\n222378,41\n222379,900\n222380,179170\n222382,631\n222383,5101\n222385,872\n222386,1147\n222387,50\n222389,212914\n222392,301\n222393,115\n222395,4771\n222396,151\n222398,258\n222399,72\n222400,996\n222401,72\n222403,1436\n222405,9195\n222406,726\n222407,31934\n222408,346\n222409,422\n222410,56\n222411,3999\n222412,1127\n222414,179170\n222416,920\n222418,1860\n222419,1858\n222420,254\n222421,167\n222422,255\n222423,1531\n222424,2168\n222425,697\n222425,1769\n222426,67995\n222429,251\n222429,516\n222430,179170\n222431,142870\n222432,146\n222432,92476\n222433,1359\n222434,1359\n222435,106\n222436,72\n222438,1454\n222439,8270\n222440,1240\n222440,1465\n222440,221828\n222441,16153\n222442,1821\n222442,21736\n222443,72\n222444,932\n222445,179170\n222447,1188\n222447,2017\n222447,46391\n222448,15179\n222449,1235\n222449,1335\n222450,422\n222451,422\n222452,1284\n222453,422\n222454,422\n222455,72\n222456,1220\n222456,1222\n222457,252\n222458,516\n222459,356\n222460,455\n222461,179170\n222462,151\n222465,422\n222466,422\n222467,422\n222468,217\n222468,433\n222469,422\n222470,422\n222471,1860\n222472,422\n222473,2671\n222474,179170\n222475,3260\n222476,3260\n222477,1238\n222478,4066\n222479,640\n222480,217\n222480,1417\n222481,83\n222482,1436\n222484,4597\n222485,222486\n222487,1452\n222488,179170\n222489,48\n222490,179170\n222491,160\n222492,179170\n222493,90845\n222494,671\n222496,160\n222497,1220\n222497,1222\n222498,252\n222499,516\n222500,2626\n222502,179170\n222503,79\n222504,859\n222505,211\n222506,422\n222507,158\n222509,179170\n222510,73570\n222511,179170\n222512,171\n222513,8270\n222514,3582\n222515,178\n222516,30\n222517,1837\n222518,479\n222518,590\n222519,179170\n222520,491\n222520,1801\n222522,1068\n222523,1052\n222523,1801\n222524,162599\n222526,493\n222527,779\n222528,4823\n222529,843\n222530,217\n222531,843\n222532,422\n222533,2310\n222534,579\n222535,160\n222536,5718\n222537,179170\n222538,179170\n222540,1467\n222541,2775\n222542,447\n222543,79\n222545,83\n222546,222547\n222548,2944\n222550,273\n222551,1955\n222552,698\n222553,30\n222554,843\n222555,30\n222556,44\n222557,30\n222559,577\n222559,1429\n222561,179170\n222564,595\n222566,1566\n222568,389\n222569,30\n222570,389\n222571,269\n222572,30\n222573,63\n222573,211\n222574,83\n222576,202\n222577,344\n222579,211\n222579,4078\n222579,7124\n222580,222581\n222584,332\n222585,2334\n222586,307\n222586,2668\n222587,30\n222589,2590\n222591,1276\n222592,137\n222593,151\n222594,179170\n222595,310\n222596,151\n222596,72439\n222597,392\n222598,30\n222599,389\n222600,179170\n222601,9010\n222602,4190\n222603,760\n222604,875\n222605,779\n222606,7124\n222607,17588\n222608,872\n222609,179170\n222610,634\n222611,30\n222612,795\n222614,557\n222615,843\n222616,68069\n222617,440\n222618,843\n222619,1881\n222620,83\n222622,278\n222623,138686\n222624,175\n222625,408\n222626,83\n222627,22293\n222628,179170\n222629,503\n222629,1257\n222630,483\n222631,302\n222632,968\n222633,302\n222634,1220\n222634,1222\n222635,252\n222636,516\n222637,1007\n222638,7416\n222639,179170\n222640,30\n222641,852\n222642,30\n222643,1888\n222644,179170\n222645,179170\n222646,179170\n222647,179170\n222648,671\n222649,5192\n222650,557\n222651,835\n222652,167\n222652,301\n222652,973\n222652,1160\n222652,1293\n222652,1300\n222652,1818\n222652,73570\n222652,103860\n222653,843\n222654,30\n222656,72\n222657,515\n222658,7358\n222658,7363\n222659,835\n222660,918\n222661,302\n222662,1608\n222663,1132\n222664,252\n222665,360\n222666,30\n222667,202\n222668,918\n222669,333\n222670,72\n222671,805\n222673,151\n222675,2979\n222676,83\n222677,72\n222678,333\n222679,3367\n222680,489\n222681,435\n222682,72\n222683,1227\n222683,86416\n222684,30\n222685,179170\n222686,72\n222687,875\n222689,72\n222690,72\n222691,34580\n222693,30\n222694,1257\n222695,179170\n222696,943\n222696,6556\n222697,843\n222698,137\n222699,179170\n222700,72\n222701,179170\n222702,30\n222703,179170\n222704,179170\n222705,7416\n222706,302\n222707,179170\n222708,1388\n222708,1531\n222708,4455\n222709,30\n222710,179170\n222711,72\n222712,179170\n222713,179170\n222714,861\n222715,872\n222716,136\n222717,3\n222718,3331\n222719,30\n222720,83\n222722,4220\n222725,7416\n222726,179170\n222727,179170\n222728,171\n222729,1572\n222730,179170\n222731,4\n222731,5\n222732,83\n222733,1882\n222734,72\n222735,835\n222736,1010\n222737,102\n222738,1326\n222739,1323\n222740,408\n222741,179170\n222742,30\n222743,54284\n222744,72\n222745,138\n222746,865\n222747,557\n222748,137\n222749,179170\n222750,88820\n222751,179170\n222752,222753\n222752,224491\n222752,236340\n222752,249046\n222752,253847\n222754,2782\n222755,65\n222755,222\n222755,417\n222755,1284\n222755,1572\n222755,3148\n222755,3295\n222755,4237\n222755,182162\n222756,72\n222757,35486\n222758,179170\n222759,179170\n222760,222761\n222762,56\n222763,422\n222764,609\n222765,1220\n222765,1222\n222766,516\n222767,252\n222768,30\n222769,2671\n222770,1715\n222771,968\n222772,30\n222773,450\n222774,179170\n222775,220816\n222776,220816\n222777,631\n222777,657\n222777,1001\n222777,1019\n222777,1287\n222777,2266\n222777,2626\n222778,30\n222779,752\n222780,147\n222780,920\n222781,809\n222782,72\n222783,1210\n222784,179170\n222785,918\n222786,1776\n222787,5440\n222788,1133\n222789,3\n222790,41\n222791,1133\n222792,72\n222793,179170\n222794,179170\n222795,179170\n222796,835\n222797,179170\n222798,485\n222799,298\n222800,2867\n222800,2868\n222801,179170\n222802,485\n222803,298\n222804,3582\n222805,220816\n222806,79\n222807,491\n222808,148742\n222809,7092\n222810,72\n222811,2373\n222812,220816\n222813,2244\n222814,72\n222815,3538\n222816,2979\n222817,1001\n222818,72\n222819,557\n222820,179170\n222821,2244\n222822,179170\n222823,1639\n222824,220816\n222825,2995\n222826,72\n222827,72\n222828,72\n222829,72\n222830,220816\n222831,146\n222831,92476\n222832,83\n222833,72\n222834,1298\n222835,310\n222836,278\n222837,195\n222838,3960\n222839,2617\n222840,631\n222841,179170\n222842,118336\n222843,79\n222844,332\n222845,79\n222845,704\n222846,1832\n222847,179170\n222848,298\n222849,485\n222850,1287\n222851,479\n222852,1572\n222853,55849\n222854,4678\n222855,1363\n222856,55849\n222857,3297\n222858,240\n222859,285\n222860,1572\n222861,1474\n222862,1805\n222863,2590\n222864,179170\n222865,250\n222865,1684\n222866,1381\n222867,1623\n222868,179170\n222869,301\n222870,179170\n222871,250\n222871,1684\n222872,285\n222873,179170\n222874,138686\n222875,175\n222876,179170\n222877,5\n222877,1087\n222878,179170\n222879,179170\n222880,147\n222881,179170\n222882,312\n222883,932\n222884,179170\n222885,179170\n222886,920\n222887,65\n222888,179170\n222889,3\n222890,389\n222891,304\n222892,1122\n222893,795\n222894,8270\n222895,83\n222896,1179\n222897,220816\n222898,179170\n222899,1326\n222900,217\n222901,222902\n222903,179170\n222904,2244\n222905,1368\n222906,72\n222907,72\n222908,222909\n222910,1177\n222911,1010\n222912,240\n222914,83\n222915,779\n222916,1181\n222917,1368\n222918,255\n222919,179170\n222920,5366\n222921,4597\n222922,220816\n222923,192\n222923,195\n222923,289\n222923,2296\n222923,94134\n222924,179170\n222925,55849\n222926,240\n222927,862\n222928,994\n222929,779\n222930,222931\n222930,231455\n222930,239720\n222930,245179\n222932,179170\n222933,220816\n222934,631\n222935,1085\n222936,1860\n222937,151\n222938,151\n222939,726\n222940,179170\n222941,1715\n222942,390\n222943,250\n222943,1684\n222944,285\n222945,179170\n222946,4260\n222947,206\n222948,250\n222948,1684\n222949,285\n222950,1522\n222951,179170\n222952,179170\n222953,3447\n222954,2048\n222955,313\n222956,585\n222957,8270\n222958,179170\n222959,275\n222960,142870\n222961,179170\n222962,30\n222963,1773\n222964,225\n222965,328\n222967,30\n222968,142870\n222969,81\n222970,8884\n222971,72\n222972,72\n222973,50\n222973,140\n222973,147\n222973,222\n222974,818\n222975,1085\n222976,1571\n222977,2750\n222978,149\n222979,740\n222979,741\n222980,346\n222981,1266\n222981,5714\n222982,312\n222983,273\n222984,3804\n222985,179170\n222986,151\n222987,179170\n222988,1227\n222988,86416\n222989,222990\n222991,30\n222992,151\n222993,137\n222994,72\n222995,1285\n222996,79\n222997,2048\n222998,3370\n222999,151\n223000,996\n223001,634\n223002,223003\n223004,30\n223005,4597\n223006,42220\n223007,4597\n223008,312\n223009,7360\n223010,2416\n223010,2417\n223011,72\n223012,223013\n223014,779\n223016,179170\n223017,2353\n223018,3447\n223019,273\n223020,149\n223021,2416\n223021,2417\n223022,179170\n223023,1432\n223024,590\n223024,2073\n223024,33424\n223024,125569\n223025,671\n223025,1253\n223026,1181\n223027,179170\n223028,167\n223028,73570\n223029,8270\n223030,366\n223031,223032\n223033,932\n223034,620\n223035,217\n223035,1796\n223036,55849\n223037,2782\n223038,30\n223039,72\n223040,1227\n223040,86416\n223041,1220\n223041,1222\n223042,72\n223043,344\n223044,285\n223045,223046\n223047,3148\n223048,44\n223048,602\n223049,1247\n223049,164572\n223050,72\n223051,5405\n223052,77\n223053,195\n223054,83\n223055,743\n223056,3804\n223057,151\n223058,1227\n223058,86416\n223059,1181\n223060,151\n223061,932\n223062,187960\n223063,72\n223064,72\n223065,312\n223066,149\n223067,72\n223068,1087\n223069,44\n223070,2244\n223071,4597\n223073,1849\n223074,195\n223075,781\n223076,1132\n223077,406\n223078,874\n223079,151\n223080,918\n223081,159516\n223081,223082\n223081,236820\n223083,743\n223085,875\n223086,30\n223087,195\n223088,30\n223089,389\n223090,795\n223091,2244\n223092,206\n223094,483\n223095,192\n223096,479\n223097,991\n223097,1274\n223098,179170\n223099,972\n223100,56\n223101,422\n223102,72\n223103,1572\n223104,72\n223104,206\n223104,34580\n223105,355\n223106,1124\n223107,795\n223108,588\n223108,590\n223108,920\n223108,1419\n223109,8270\n223110,72\n223111,5405\n223112,649\n223112,666\n223113,862\n223114,1227\n223114,86416\n223115,223116\n223117,1707\n223118,34\n223118,19227\n223119,179170\n223120,8270\n223121,30\n223121,137\n223121,225\n223122,184\n223123,219\n223124,158\n223125,4810\n223126,2775\n223127,2424\n223128,6506\n223129,2646\n223130,387\n223132,1571\n223133,1181\n223134,1860\n223135,1858\n223136,1227\n223136,86416\n223137,4504\n223138,485\n223139,298\n223140,1326\n223141,102\n223142,1323\n223143,408\n223144,223145\n223146,6387\n223146,6621\n223146,17140\n223147,179170\n223148,1368\n223149,1227\n223149,86416\n223150,994\n223151,302\n223152,302\n223153,120\n223154,147123\n223155,835\n223156,660\n223157,784\n223158,135\n223159,147123\n223160,1479\n223161,390\n223162,2421\n223163,37088\n223164,1085\n223165,79\n223166,217\n223166,493\n223167,72\n223168,3161\n223169,15119\n223170,30\n223171,30\n223172,179170\n223173,30\n223174,147\n223176,179170\n223177,179170\n223178,7358\n223178,7363\n223180,272\n223181,223182\n223183,1181\n223184,1849\n223186,179170\n223187,3413\n223188,9026\n223189,918\n223190,179170\n223191,179170\n223192,269\n223193,485\n223194,298\n223195,30\n223196,6682\n223197,158\n223198,179170\n223199,346\n223200,30\n223201,179170\n223202,179170\n223203,1572\n223204,179170\n223205,141912\n223206,309\n223206,310\n223207,301\n223207,22580\n223208,7360\n223209,285\n223210,994\n223211,179170\n223212,223213\n223214,1659\n223217,206\n223218,179170\n223219,179170\n223220,1368\n223221,3872\n223222,714\n223223,179170\n223224,179170\n223225,557\n223226,5440\n223227,433\n223228,30\n223229,364\n223230,111\n223231,671\n223232,1102\n223232,1776\n223233,8270\n223234,50\n223237,151\n223238,491\n223239,72\n223240,346\n223241,179170\n223242,805\n223243,491\n223244,272\n223247,589\n223248,255\n223249,1163\n223250,10\n223251,223252\n223253,1085\n223254,3209\n223255,2048\n223256,918\n223257,8270\n223258,1462\n223258,8537\n223259,223260\n223261,406\n223262,1163\n223263,151\n223264,151\n223265,805\n223266,151\n223267,273\n223268,179170\n223269,292\n223270,818\n223271,298\n223272,223273\n223274,805\n223275,5375\n223276,223277\n223278,72\n223279,107\n223280,2416\n223280,2417\n223281,292\n223282,338\n223283,227\n223283,2379\n223284,298\n223285,1133\n223286,3538\n223287,2244\n223288,8788\n223289,862\n223290,827\n223290,2868\n223290,92476\n223291,30\n223292,223293\n223294,223293\n223295,223293\n223296,223293\n223297,223293\n223298,223293\n223299,17772\n223301,72\n223302,31934\n223303,31934\n223304,31934\n223305,31934\n223306,31934\n223307,31934\n223308,31934\n223309,31934\n223310,31934\n223311,31934\n223312,31934\n223313,31934\n223314,31934\n223315,31934\n223316,31934\n223317,31934\n223318,127158\n223319,485\n223320,298\n223321,192\n223322,140\n223323,223324\n223325,77\n223326,79\n223327,3148\n223328,4597\n223330,86416\n223331,932\n223332,50\n223332,406\n223333,72\n223334,160\n223336,222\n223337,4237\n223337,182162\n223338,779\n223340,160\n223341,160\n223342,652\n223343,160\n223344,2797\n223345,994\n223346,1836\n223347,72\n223348,179170\n223349,23010\n223350,795\n223351,485\n223352,298\n223353,485\n223354,298\n223355,1294\n223355,1326\n223356,275\n223357,160\n223358,79\n223359,875\n223360,72\n223361,72\n223362,3413\n223363,1332\n223364,450\n223366,179170\n223367,160\n223368,179170\n223369,1368\n223370,4101\n223371,15748\n223373,50\n223374,55849\n223375,360\n223376,310\n223377,8270\n223378,50\n223379,149\n223380,44\n223381,206\n223382,1019\n223383,1572\n223385,86416\n223386,835\n223387,72\n223388,1102\n223389,1634\n223390,1776\n223391,127158\n223392,485\n223393,298\n223394,223395\n223394,250770\n223396,111\n223397,184\n223398,187\n223399,726\n223401,485\n223402,298\n223403,872\n223404,1860\n223405,1858\n223406,795\n223407,622\n223408,805\n223409,1127\n223410,1718\n223411,72\n223412,3209\n223413,54\n223414,652\n223415,433\n223416,302\n223417,151\n223418,1085\n223419,302\n223420,805\n223421,298\n223422,485\n223423,2048\n223424,10\n223425,1007\n223426,179170\n223427,779\n223428,485\n223429,298\n223430,1773\n223431,3960\n223432,872\n223433,72\n223434,491\n223435,179170\n223436,206\n223437,1201\n223438,1298\n223439,200\n223440,223441\n223440,227495\n223442,45960\n223443,72\n223444,298\n223445,485\n223446,333\n223447,138686\n223448,175\n223449,4\n223449,5\n223450,1227\n223450,86416\n223451,2744\n223452,1016\n223453,6027\n223454,1227\n223454,86416\n223455,788\n223456,5343\n223457,1955\n223458,107\n223459,1135\n223460,3623\n223461,1085\n223462,1707\n223463,1014\n223464,223465\n223466,149\n223467,142870\n223468,1014\n223469,346\n223470,223471\n223472,1983\n223473,50\n223474,151\n223475,223476\n223477,154408\n223478,72\n223479,50\n223480,272\n223481,918\n223482,58\n223483,223484\n223485,795\n223486,179170\n223487,79\n223488,346\n223489,301\n223489,3804\n223490,72\n223491,805\n223492,149\n223493,285\n223494,20\n223495,1085\n223496,9457\n223497,346\n223498,557\n223499,557\n223500,557\n223501,2617\n223503,137\n223504,3135\n223505,58\n223506,994\n223507,46\n223508,346\n223509,179170\n223510,179170\n223511,1149\n223512,46\n223513,994\n223514,58\n223515,1572\n223516,195\n223517,179170\n223518,994\n223519,918\n223520,1572\n223521,328\n223522,586\n223523,805\n223524,72\n223525,72\n223526,479\n223527,875\n223528,240\n223529,893\n223530,358\n223531,72\n223532,346\n223533,8270\n223534,179170\n223535,346\n223536,8270\n223537,272\n223538,795\n223539,346\n223540,527\n223541,874\n223542,140\n223543,72\n223544,119\n223545,272\n223546,346\n223547,1462\n223548,1058\n223549,1058\n223550,141912\n223551,211\n223552,3370\n223553,346\n223554,202\n223555,346\n223556,195\n223557,1227\n223557,86416\n223558,256\n223559,72\n223560,4597\n223561,918\n223562,483\n223563,223564\n223565,151\n223566,79\n223566,104\n223566,111\n223566,134\n223566,192\n223566,200\n223566,215\n223566,227\n223566,240\n223566,248\n223566,264\n223566,289\n223566,290\n223566,298\n223566,309\n223566,310\n223566,392\n223566,503\n223566,516\n223566,588\n223566,590\n223566,631\n223566,636\n223566,714\n223566,805\n223566,1016\n223566,1119\n223566,1149\n223566,1282\n223566,1462\n223566,1631\n223566,1659\n223566,1745\n223566,1818\n223566,1849\n223566,1955\n223566,1962\n223566,2205\n223566,2286\n223566,2443\n223566,4355\n223566,6955\n223566,8180\n223566,8537\n223566,9005\n223566,9010\n223566,33424\n223566,54004\n223566,94134\n223567,223568\n223569,1151\n223569,1363\n223570,45437\n223571,179170\n223572,491\n223573,94\n223573,2787\n223574,2296\n223575,640\n223576,4597\n223577,346\n223578,346\n223579,149\n223580,285\n223581,179170\n223582,2205\n223582,33424\n223583,2048\n223584,41\n223585,726\n223586,142870\n223587,862\n223588,3161\n223589,179170\n223590,42220\n223591,17772\n223592,1313\n223593,42220\n223594,323\n223595,184\n223596,859\n223597,179170\n223598,142473\n223599,292\n223600,301\n223601,42220\n223602,223603\n223604,42220\n223605,294\n223606,296\n223607,298\n223608,42220\n223609,93\n223609,94\n223610,223611\n223612,72\n223613,2416\n223613,2417\n223614,223615\n223616,50\n223617,42220\n223620,42220\n223621,42220\n223622,1345\n223623,430\n223624,42220\n223625,485\n223626,298\n223627,42220\n223628,267\n223629,120\n223629,1235\n223630,147\n223631,1462\n223631,1939\n223632,5405\n223633,223634\n223633,250062\n223635,192\n223636,2416\n223636,2417\n223637,42220\n223638,850\n223639,491\n223640,2416\n223640,2417\n223641,83\n223642,72\n223643,42220\n223644,485\n223645,298\n223646,1634\n223647,1860\n223648,1858\n223649,223650\n223651,79\n223652,3297\n223654,79\n223655,79\n223656,34\n223656,35\n223656,167\n223656,222\n223656,631\n223656,657\n223656,783\n223656,827\n223656,1467\n223656,1571\n223656,2266\n223656,94134\n223657,221737\n223658,736\n223660,79\n223661,58\n223662,994\n223663,46\n223664,577\n223665,485\n223666,298\n223667,483\n223668,602\n223669,83\n223670,127158\n223671,2416\n223671,2417\n223672,248\n223672,954\n223672,1462\n223672,2991\n223672,2995\n223672,31497\n223672,185877\n223673,116\n223673,290\n223673,590\n223673,1235\n223673,1511\n223673,2417\n223673,33424\n223673,94134\n223673,182162\n223673,245910\n223675,784\n223676,932\n223678,298\n223679,485\n223680,50\n223681,805\n223682,104\n223682,588\n223682,590\n223682,1179\n223682,1659\n223683,30\n223684,2421\n223685,489\n223687,431\n223688,2646\n223690,120\n223691,485\n223692,298\n223693,299\n223693,972\n223694,187\n223695,2775\n223696,447\n223697,223698\n223699,640\n223700,640\n223701,640\n223702,1127\n223703,640\n223704,223705\n223706,442\n223709,77\n223710,1265\n223710,1266\n223711,6068\n223712,1644\n223713,278\n223713,491\n223714,1466\n223715,189794\n223716,1188\n223717,3695\n223718,4237\n223718,182162\n223720,136072\n223721,346\n223723,79\n223724,4771\n223725,19413\n223728,994\n223729,58\n223730,46\n223731,314\n223732,994\n223733,58\n223734,46\n223735,868\n223736,850\n223738,189794\n223738,189842\n223738,223738\n223739,273\n223742,149\n223743,392\n223744,640\n223745,640\n223746,3003\n223747,1181\n223748,779\n223749,7124\n223750,1181\n223751,1181\n223752,1149\n223753,42220\n223754,1181\n223755,1368\n223756,1381\n223757,179170\n223759,850\n223761,779\n223762,1368\n223763,491\n223764,920\n223765,301\n223766,1749\n223767,167\n223767,2083\n223767,2191\n223768,7\n223771,932\n223772,1132\n223773,781\n223774,435\n223775,875\n223776,302\n223777,195\n223778,1058\n223780,97\n223780,1118\n223780,1844\n223780,13136\n223782,1132\n223783,781\n223785,211\n223786,215276\n223787,671\n223788,223789\n223788,227851\n223788,246640\n223788,250692\n223790,1402\n223792,42220\n223793,2367\n223795,781\n223796,1132\n223797,30\n223797,328\n223797,1179\n223799,1368\n223800,994\n223801,42220\n223802,50\n223802,1572\n223802,3260\n223803,179170\n223804,42220\n223805,781\n223806,1132\n223807,663\n223807,1119\n223807,1179\n223807,1243\n223808,509\n223809,298\n223810,485\n223811,138686\n223812,175\n223813,1891\n223813,204093\n223814,151\n223815,37088\n223816,781\n223817,1132\n223818,167\n223819,781\n223820,1132\n223823,893\n223825,179170\n223826,217\n223826,1572\n223829,557\n223830,223831\n223832,9457\n223833,179170\n223835,685\n223835,2590\n223836,179170\n223837,223838\n223839,795\n223839,3804\n223840,392\n223841,179170\n223842,1210\n223845,874\n223846,2991\n223846,15573\n223846,182162\n223847,5\n223847,6323\n223849,435\n223850,83\n223851,7363\n223851,42220\n223852,217\n223853,34\n223853,292\n223855,389\n223856,5440\n223857,217\n223858,1238\n223861,442\n223862,389\n223863,215276\n223864,640\n223865,953\n223866,571\n223867,652\n223868,2620\n223869,179170\n223870,1452\n223871,1058\n223872,1860\n223873,1858\n223874,83\n223875,41\n223876,634\n223876,671\n223877,1181\n223878,50\n223879,1007\n223879,1551\n223880,1381\n223881,1818\n223882,447\n223883,994\n223884,2775\n223885,726\n223886,146280\n223887,1858\n223888,1860\n223889,72\n223889,312\n223889,991\n223889,1309\n223889,1893\n223889,2312\n223889,2605\n223889,3695\n223889,238071\n223891,841\n223891,7124\n223892,41\n223893,994\n223894,4691\n223895,718\n223896,1220\n223896,1222\n223897,2989\n223897,2991\n223898,1860\n223899,1858\n223900,1220\n223900,1222\n223901,252\n223902,516\n223903,994\n223904,422\n223905,56\n223906,1220\n223906,1222\n223907,252\n223908,516\n223909,72\n223910,17772\n223911,179170\n223912,278\n223913,149\n223914,217\n223915,779\n223916,140\n223916,1858\n223916,148742\n223917,2073\n223918,781\n223919,1132\n223920,217\n223922,435\n223923,571\n223924,994\n223925,893\n223926,489\n223926,685\n223927,994\n223928,994\n223929,72\n223930,184\n223931,3582\n223932,849\n223933,34\n223933,35\n223934,994\n223935,3209\n223936,818\n223937,72\n223938,285\n223939,312\n223940,640\n223941,44\n223942,783\n223943,72\n223944,30\n223946,7416\n223948,1860\n223949,1858\n223951,1368\n223952,72\n223953,273\n223954,389\n223955,83\n223956,868\n223957,340\n223959,874\n223961,72\n223962,356\n223963,15748\n223964,994\n223965,41\n223966,1118\n223967,1132\n223968,171\n223971,117163\n223972,41\n223973,148742\n223974,1052\n223975,2775\n223976,1962\n223977,1882\n223978,500\n223979,54\n223980,8270\n223981,994\n223982,151\n223983,16153\n223984,3413\n223985,994\n223986,179170\n223987,41\n223988,752\n223989,179170\n223990,1796\n223992,3872\n223993,179170\n223995,50\n223996,302\n223997,179170\n223999,1087\n224000,1882\n224001,1220\n224001,1222\n224002,252\n224003,516\n224004,1608\n224005,1132\n224006,861\n224007,195\n224008,1860\n224009,1858\n224010,733\n224011,58\n224012,1132\n224013,1608\n224014,1608\n224015,1132\n224017,1882\n224018,1345\n224019,14126\n224022,79\n224023,500\n224024,1882\n224025,2775\n224026,54\n224027,1052\n224028,1962\n224029,73570\n224031,589\n224032,500\n224033,1962\n224034,1052\n224035,54\n224036,1882\n224037,2775\n224038,56\n224039,422\n224041,752\n224043,1608\n224044,1132\n224045,136\n224046,283\n224047,147\n224048,406\n224049,83\n224049,1118\n224049,1188\n224049,1722\n224050,138686\n224051,175\n224052,3695\n224053,1608\n224054,1132\n224055,171\n224056,1608\n224057,3695\n224058,55849\n224059,682\n224059,72439\n224060,55849\n224061,843\n224062,55849\n224063,104\n224063,2209\n224064,171\n224065,346\n224066,1973\n224066,3507\n224067,54\n224068,10\n224069,467\n224071,102\n224071,489\n224073,596\n224074,760\n224074,1631\n224075,809\n224077,302\n224078,861\n224079,1274\n224080,72\n224081,596\n224082,79\n224084,167\n224085,424\n224086,48\n224086,1769\n224087,136\n224088,2750\n224089,83\n224090,41\n224091,1332\n224092,515\n224093,973\n224093,1160\n224093,1300\n224093,103860\n224094,16153\n224095,5718\n224096,760\n224097,1844\n224098,283\n224099,663\n224101,875\n224103,450\n224104,586\n224104,1253\n224105,1014\n224106,175\n224106,192\n224106,35357\n224106,39539\n224106,84749\n224106,122532\n224106,202417\n224106,205046\n224107,2373\n224109,1634\n224112,55849\n224113,1571\n224114,483\n224115,151\n224116,346\n224117,918\n224118,50\n224118,147\n224118,158\n224118,192\n224118,406\n224118,2574\n224118,2931\n224118,3260\n224118,4193\n224118,8598\n224118,103153\n224119,663\n224120,805\n224121,200\n224123,3474\n224124,346\n224125,200\n224126,479\n224127,179170\n224128,179170\n224129,581\n224130,1707\n224131,1227\n224131,86416\n224132,137\n224133,346\n224134,2421\n224135,151\n224136,179170\n224137,1149\n224137,3370\n224138,7652\n224138,33424\n224139,862\n224140,83\n224141,179170\n224142,160\n224144,557\n224145,994\n224146,781\n224147,1132\n224148,142426\n224149,2146\n224150,138686\n224151,1298\n224152,175\n224153,220816\n224154,704\n224155,392\n224156,6059\n224157,1860\n224158,5658\n224159,596\n224160,4760\n224161,4252\n224162,623\n224163,697\n224164,6955\n224165,3612\n224166,595\n224167,2274\n224168,596\n224168,1368\n224169,179170\n224170,220816\n224172,1132\n224173,1608\n224174,179170\n224175,179170\n224176,220816\n224177,22\n224178,3872\n224179,953\n224180,4810\n224181,155481\n224182,30\n224184,1644\n224185,30\n224186,48\n224187,217\n224188,30\n224189,30\n224190,179170\n224191,179170\n224192,179170\n224193,179170\n224194,220816\n224196,72\n224197,179170\n224198,72\n224199,994\n224201,795\n224202,994\n224203,54\n224204,72\n224205,682\n224205,72439\n224206,1220\n224207,252\n224208,516\n224209,994\n224210,586\n224210,2073\n224210,3297\n224210,4039\n224210,8270\n224211,30\n224212,179170\n224213,30\n224215,10\n224216,220816\n224217,192\n224218,8270\n224219,588\n224219,590\n224219,1419\n224219,25344\n224220,994\n224221,301\n224222,8270\n224223,224224\n224225,8270\n224226,179170\n224227,158\n224228,220816\n224229,56\n224230,422\n224231,30\n224232,346\n224233,30\n224234,250\n224234,1684\n224235,179170\n224236,179170\n224237,79\n224238,220816\n224239,72\n224240,309\n224240,310\n224240,571\n224241,179170\n224242,1773\n224243,1608\n224244,1132\n224245,1462\n224245,9010\n224245,164572\n224246,255\n224247,7092\n224248,179170\n224249,2048\n224250,202\n224251,994\n224252,994\n224253,994\n224254,224255\n224256,1849\n224257,994\n224258,2048\n224259,72\n224260,1858\n224261,1860\n224262,2367\n224263,138686\n224264,784\n224265,224266\n224267,224268\n224269,72\n224270,211\n224271,179170\n224272,918\n224273,233\n224274,875\n224275,224276\n224277,142870\n224278,179170\n224279,179170\n224280,54\n224282,278\n224283,8854\n224284,1287\n224285,907\n224285,164572\n224286,163\n224287,953\n224287,2991\n224288,72\n224289,261\n224290,310\n224291,135\n224292,1707\n224293,72\n224294,8788\n224295,1252\n224295,1253\n224296,285\n224297,1227\n224297,86416\n224298,2244\n224299,30\n224299,200\n224300,202\n224301,179170\n224302,179170\n224303,179170\n224305,306\n224305,307\n224306,179170\n224307,3447\n224308,1359\n224309,72\n224310,2553\n224311,5933\n224312,179170\n224313,346\n224314,2048\n224315,346\n224316,147\n224317,1058\n224318,1058\n224319,8992\n224320,88820\n224321,58\n224322,666\n224323,179170\n224324,146\n224324,92476\n224325,647\n224326,344\n224327,3\n224327,34\n224327,35\n224327,44\n224327,50\n224327,63\n224327,79\n224327,99\n224327,104\n224327,106\n224327,137\n224327,147\n224327,149\n224327,192\n224327,195\n224327,217\n224327,233\n224327,248\n224327,251\n224327,252\n224327,254\n224327,289\n224327,298\n224327,301\n224327,323\n224327,330\n224327,332\n224327,393\n224327,406\n224327,430\n224327,435\n224327,442\n224327,447\n224327,493\n224327,518\n224327,538\n224327,588\n224327,590\n224327,615\n224327,622\n224327,636\n224327,663\n224327,694\n224327,779\n224327,788\n224327,801\n224327,805\n224327,932\n224327,934\n224327,994\n224327,1001\n224327,1016\n224327,1085\n224327,1175\n224327,1179\n224327,1231\n224327,1235\n224327,1282\n224327,1284\n224327,1294\n224327,1309\n224327,1332\n224327,1335\n224327,1368\n224327,1388\n224327,1392\n224327,1417\n224327,1512\n224327,1515\n224327,1531\n224327,1639\n224327,1722\n224327,1732\n224327,1789\n224327,1939\n224327,1955\n224327,2296\n224327,2334\n224327,2379\n224327,2443\n224327,2528\n224327,2557\n224327,2567\n224327,2620\n224327,2701\n224327,2793\n224327,2812\n224327,2979\n224327,3115\n224327,3321\n224327,3474\n224327,3538\n224327,4455\n224327,5726\n224327,5992\n224327,6119\n224327,9537\n224327,16019\n224327,94134\n224328,83\n224329,138686\n224330,175\n224331,852\n224332,1608\n224333,278\n224334,224335\n224336,83\n224337,1019\n224338,217\n224339,536\n224340,1467\n224341,72\n224342,563\n224343,211\n224344,224345\n224346,20813\n224346,164572\n224347,72\n224348,130\n224349,48\n224350,1796\n224351,72\n224352,179170\n224353,30\n224353,200\n224355,137\n224357,72\n224358,309\n224358,310\n224359,179170\n224360,918\n224361,72\n224362,4192\n224362,4193\n224363,2146\n224364,224365\n224366,72\n224367,224365\n224368,596\n224369,4597\n224370,179170\n224372,68069\n224373,179170\n224374,3138\n224375,72\n224376,3\n224377,151\n224378,278\n224379,31977\n224380,364\n224381,179170\n224382,77\n224383,179170\n224384,247\n224385,2266\n224386,179170\n224387,179170\n224388,346\n224389,515\n224390,1467\n224391,862\n224392,1227\n224392,86416\n224393,285\n224394,142870\n224395,588\n224395,590\n224395,779\n224395,1419\n224396,247\n224397,10\n224398,1227\n224398,86416\n224399,151\n224400,388\n224401,1181\n224402,900\n224403,2424\n224404,1474\n224404,2590\n224405,30\n224406,72\n224407,1326\n224408,2048\n224410,2048\n224411,2048\n224412,2048\n224413,8270\n224414,285\n224415,224416\n224417,78232\n224418,1181\n224419,72\n224420,1227\n224420,86416\n224421,2048\n224422,652\n224423,151\n224424,4597\n224425,151\n224426,1381\n224427,179170\n224428,179170\n224429,2048\n224430,1400\n224431,3182\n224432,179170\n224433,1368\n224434,179170\n224435,83\n224437,30\n224438,13980\n224439,142473\n224439,142879\n224440,209\n224441,1968\n224443,145240\n224444,30\n224445,138686\n224446,175\n224447,1796\n224449,86416\n224450,3297\n224451,968\n224452,3582\n224453,1414\n224454,4597\n224455,557\n224456,647\n224460,192\n224461,278\n224462,287\n224463,158\n224463,1235\n224463,1335\n224464,1203\n224466,13538\n224467,1858\n224468,1860\n224469,527\n224469,95152\n224470,301\n224470,615\n224470,2083\n224471,141912\n224473,72\n224474,360\n224475,55849\n224476,2073\n224477,1785\n224478,30\n224479,366\n224480,6323\n224481,1285\n224482,72\n224482,1253\n224482,182162\n224483,1102\n224483,7363\n224484,94\n224484,1511\n224484,2787\n224485,660\n224486,13661\n224487,310\n224487,224488\n224489,156379\n224490,640\n224492,1118\n224493,1284\n224494,1608\n224497,1293\n224498,874\n224498,3182\n224499,30\n224499,328\n224499,622\n224499,1033\n224503,640\n224504,640\n224505,801\n224506,640\n224507,640\n224508,784\n224509,640\n224510,640\n224511,250\n224511,1684\n224513,775\n224516,151\n224517,332\n224518,72\n224519,20757\n224520,1359\n224521,147\n224523,136\n224524,346\n224525,31977\n224526,58\n224527,994\n224528,46\n224529,775\n224530,200\n224530,1332\n224531,852\n224531,1715\n224532,795\n224533,1309\n224534,328\n224535,920\n224536,179170\n224537,31934\n224538,489\n224539,58\n224540,994\n224541,46\n224542,31934\n224543,179170\n224544,200\n224545,994\n224546,31934\n224548,346\n224549,668\n224549,1132\n224549,6556\n224549,28130\n224549,259187\n224550,366\n224550,500\n224551,200\n224552,994\n224553,510\n224554,1858\n224555,1860\n224556,224557\n224558,206\n224559,980\n224560,30\n224561,41\n224562,79\n224562,439\n224563,83\n224564,932\n224565,200\n224567,120\n224568,118336\n224570,795\n224572,1227\n224572,86416\n224573,3094\n224574,206\n224575,666\n224576,187\n224578,191860\n224579,1052\n224580,224581\n224582,1381\n224582,191860\n224583,503\n224584,1227\n224584,86416\n224585,191860\n224586,3999\n224586,191860\n224587,191860\n224588,1082\n224589,179170\n224590,493\n224591,191860\n224592,191860\n224593,307\n224593,1177\n224594,191860\n224595,1085\n224595,25348\n224596,31934\n224597,596\n224598,1392\n224599,1224\n224600,589\n224601,1238\n224602,447\n224603,2775\n224604,2775\n224605,447\n224606,596\n224608,1968\n224609,1452\n224611,1240\n224611,4637\n224612,1608\n224613,1132\n224614,1127\n224615,861\n224616,313\n224617,1298\n224618,4220\n224619,41\n224620,1608\n224621,1132\n224622,200\n224623,2379\n224625,3582\n224626,3999\n224627,8270\n224628,1058\n224629,240\n224630,346\n224632,1474\n224633,2073\n224634,160\n224635,1132\n224636,1608\n224637,3769\n224638,1014\n224639,994\n224640,79\n224641,2750\n224642,48\n224642,1007\n224644,298\n224644,32751\n224645,861\n224646,392\n224647,647\n224648,79\n224649,557\n224650,366\n224650,141912\n224651,302\n224652,1181\n224654,151\n224655,1462\n224655,8537\n224657,640\n224658,273\n224661,3804\n224662,874\n224664,217\n224668,224669\n224670,141912\n224671,2244\n224672,302\n224673,1014\n224674,4220\n224675,79\n224676,30\n224677,2646\n224678,272\n224679,861\n224680,147\n224681,872\n224681,1140\n224681,1151\n224681,2744\n224681,141912\n224682,2719\n224683,1782\n224685,1132\n224686,1608\n224687,760\n224688,8180\n224689,1133\n224690,1436\n224691,1001\n224692,158\n224696,760\n224698,217\n224699,907\n224705,178\n224706,179170\n224707,4237\n224707,182162\n224709,406\n224712,720\n224714,56\n224715,422\n224717,56\n224718,422\n224719,2296\n224720,779\n224724,994\n224726,302\n224727,752\n224728,694\n224730,861\n224731,83\n224734,596\n224735,1653\n224736,138686\n224737,175\n224739,248\n224739,1515\n224740,818\n224742,1634\n224743,44\n224744,224745\n224746,500\n224747,1052\n224748,54\n224749,2775\n224750,1962\n224751,240\n224753,147\n224753,158\n224756,309\n224756,310\n224759,2775\n224760,447\n224761,2367\n224762,72\n224765,666\n224766,1381\n224768,278\n224769,1052\n224770,500\n224771,2775\n224772,1962\n224773,54\n224775,1590\n224776,72\n224777,657\n224777,2421\n224778,852\n224778,5591\n224780,1359\n224781,346\n224782,1127\n224783,34\n224783,35\n224784,5301\n224785,1858\n224786,179170\n224787,3695\n224789,873\n224791,143\n224792,1467\n224793,338\n224794,392\n224795,302\n224797,994\n224798,58\n224799,46\n224800,179170\n224801,1363\n224802,302\n224803,5976\n224804,179170\n224805,179170\n224806,515\n224807,222\n224808,179170\n224809,918\n224810,3695\n224811,191860\n224812,1058\n224813,191860\n224814,30\n224815,657\n224817,994\n224818,179170\n224819,1474\n224820,179170\n224821,673\n224822,10\n224823,22\n224824,175\n224825,252\n224826,142430\n224827,694\n224828,3695\n224829,58\n224830,994\n224831,46\n224832,6695\n224833,191860\n224834,111\n224834,1266\n224835,72\n224836,55849\n224837,808\n224838,273\n224839,179170\n224840,179170\n224841,918\n224843,4597\n224844,200\n224846,1210\n224847,30\n224850,483\n224851,2590\n224852,179170\n224853,811\n224854,640\n224855,151\n224856,167\n224859,1556\n224860,179170\n224861,1151\n224862,30\n224862,200\n224863,1844\n224864,4545\n224864,56150\n224865,179170\n224866,34\n224866,35\n224867,6424\n224868,843\n224869,200\n224870,202\n224871,949\n224872,5591\n224873,200\n224875,72\n224876,6068\n224877,760\n224878,346\n224879,179170\n224880,1801\n224881,874\n224882,1858\n224883,390\n224884,179170\n224885,75912\n224886,247\n224887,631\n224888,996\n224889,2590\n224890,1220\n224891,516\n224892,252\n224893,179170\n224894,83\n224895,1085\n224896,30\n224897,704\n224898,1511\n224898,3069\n224899,247\n224899,2867\n224899,2868\n224900,240\n224901,179170\n224903,30\n224904,72\n224905,179170\n224906,30\n224908,805\n224909,56\n224910,422\n224911,179170\n224912,1773\n224913,179170\n224914,850\n224915,781\n224916,1132\n224917,389\n224919,217\n224920,83\n224921,861\n224922,994\n224923,264\n224923,301\n224924,272\n224925,83\n224926,102\n224927,1323\n224928,1326\n224929,408\n224930,994\n224931,1414\n224932,417\n224933,151\n224934,179170\n224935,179170\n224936,2782\n224936,3876\n224937,278\n224938,200\n224939,192\n224939,1181\n224940,1332\n224941,1332\n224942,4545\n224942,56150\n224943,4545\n224943,56150\n224944,24505\n224945,652\n224946,422\n224947,28072\n224948,272\n224949,3695\n224950,220816\n224951,83\n224952,94\n224952,2787\n224953,142870\n224954,302\n224955,220816\n224956,220816\n224957,994\n224958,76096\n224959,17334\n224960,179170\n224961,220816\n224962,179170\n224963,13\n224964,171\n224965,220816\n224966,301\n224967,994\n224968,3582\n224969,994\n224970,875\n224971,220816\n224972,220816\n224973,1058\n224974,779\n224974,1294\n224975,220816\n224976,442\n224977,34\n224977,35\n224978,220816\n224979,81\n224980,693\n224981,179170\n224982,220816\n224983,72\n224984,146\n224984,92476\n224985,7092\n224986,344\n224987,647\n224988,72\n224989,285\n224990,220816\n224991,104\n224992,1132\n224993,781\n224994,220816\n224995,220816\n224996,1132\n224997,781\n224998,200\n224999,781\n225000,1132\n225001,46\n225002,58\n225003,994\n225004,58\n225005,46\n225006,994\n225007,58\n225008,994\n225009,46\n225010,272\n225011,220816\n225012,46\n225013,58\n225014,994\n225015,3370\n225015,14453\n225016,485\n225017,1509\n225018,1659\n225019,1688\n225020,220816\n225021,1132\n225022,850\n225023,781\n225024,104\n225025,255\n225026,220816\n225027,220816\n225028,191860\n225029,781\n225030,1132\n225031,1707\n225032,149\n225033,225034\n225035,1893\n225036,220816\n225037,843\n225038,1181\n225039,179170\n225040,220816\n225041,818\n225042,220816\n225043,360\n225044,179170\n225045,179170\n225046,220816\n225047,179170\n225048,536\n225049,220816\n225051,278\n225052,2373\n225053,104\n225054,5405\n225055,760\n225056,220816\n225057,422\n225058,422\n225059,5366\n225060,422\n225061,3804\n225062,779\n225063,422\n225064,422\n225065,422\n225066,422\n225067,422\n225068,189842\n225069,422\n225070,422\n225071,422\n225072,805\n225073,179170\n225074,151\n225075,225076\n225077,406\n225078,220816\n225079,179170\n225081,450\n225082,1571\n225083,138686\n225084,175\n225085,3\n225086,179170\n225087,1227\n225087,86416\n225088,72\n225089,50\n225090,2979\n225091,221737\n225092,217\n225093,255\n225094,795\n225095,179170\n225096,1368\n225097,1010\n225098,515\n225099,2334\n225100,577\n225101,1363\n225102,220816\n225103,2674\n225104,220816\n225105,179170\n225106,147\n225106,158\n225107,179170\n225108,422\n225109,56\n225110,72\n225111,323\n225112,179170\n225113,220816\n225114,21442\n225115,147\n225116,4597\n225117,4355\n225118,220816\n225119,179170\n225120,1285\n225121,6682\n225122,534\n225123,406\n225124,220816\n225125,8270\n225126,2719\n225127,13538\n225128,220816\n225129,1132\n225130,1149\n225131,473\n225132,4597\n225133,220816\n225134,72\n225135,72\n225136,72\n225137,220816\n225138,220816\n225139,72\n225140,21487\n225141,45960\n225142,179170\n225143,563\n225144,30\n225145,220816\n225146,220816\n225148,220816\n225149,179170\n225150,220816\n225151,220816\n225152,479\n225153,220816\n225154,56\n225155,422\n225156,805\n225157,220816\n225158,72\n225159,72\n225160,220816\n225161,111\n225162,200\n225163,344\n225164,264\n225165,6323\n225166,491\n225167,563\n225168,10\n225169,179170\n225170,313\n225171,269\n225172,206\n225173,220816\n225174,179170\n225175,179170\n225176,693\n225176,3370\n225177,285\n225178,158\n225179,179170\n225180,220816\n225181,179170\n225182,179170\n225183,278\n225183,292\n225183,390\n225183,467\n225183,4220\n225183,6059\n225183,6068\n225184,424\n225185,119\n225186,1085\n225187,179170\n225188,220816\n225189,8463\n225189,142870\n225190,422\n225191,56\n225192,220816\n225193,7360\n225194,7360\n225195,390\n225196,179170\n225197,179170\n225198,179170\n225199,24505\n225200,217\n225201,4597\n225201,8235\n225202,874\n225204,1332\n225205,8270\n225206,220816\n225207,4475\n225208,5265\n225209,179170\n225210,6387\n225211,179170\n225212,538\n225213,285\n225214,220816\n225215,72\n225216,8820\n225217,179170\n225218,1140\n225219,151\n225220,285\n225221,171\n225222,8868\n225223,1007\n225224,19\n225224,48\n225224,949\n225224,142870\n225224,226509\n225225,422\n225226,4597\n225227,178\n225228,8180\n225229,179170\n225230,516\n225231,2379\n225232,4237\n225232,182162\n225233,81\n225234,2116\n225235,1531\n225236,225237\n225238,179170\n225239,179170\n225240,6119\n225241,219\n225242,42220\n225243,25344\n225244,1181\n225246,1821\n225246,21736\n225247,4597\n225248,4453\n225249,2416\n225249,2417\n225250,151\n225251,918\n225252,15179\n225253,5469\n225254,1188\n225255,615\n225256,1465\n225257,5469\n225258,9025\n225259,1796\n225260,11147\n225261,261\n225262,6214\n225263,577\n225264,225265\n225264,229048\n225264,252434\n225264,260361\n225264,264495\n225266,42220\n225267,58\n225268,994\n225269,46\n225270,7316\n225271,2244\n225272,179170\n225273,42220\n225274,8270\n225275,850\n225276,918\n225277,179170\n225278,588\n225278,590\n225278,1419\n225279,1300\n225280,666\n225281,455\n225281,1019\n225282,779\n225283,422\n225284,56\n225285,72\n225286,1400\n225287,349\n225287,3846\n225288,5366\n225289,509\n225289,1453\n225289,1454\n225294,212914\n225296,805\n225297,179170\n225298,1082\n225299,179170\n225300,179170\n225301,225301\n225302,1082\n225303,215276\n225304,781\n225305,1132\n225306,146\n225306,92476\n225307,647\n225308,344\n225309,615\n225309,685\n225309,1240\n225309,1531\n225310,366\n225311,366\n225312,366\n225313,272\n225314,1132\n225315,781\n225317,875\n225318,941\n225320,31934\n225321,31934\n225322,8270\n225323,1590\n225324,8270\n225325,516\n225326,1220\n225327,252\n225328,75912\n225330,255\n225331,31934\n225332,31934\n225333,31934\n225334,3367\n225335,31934\n225336,818\n225336,1149\n225336,127158\n225337,346\n225338,1634\n225339,1096\n225339,28294\n225340,1782\n225341,994\n225342,15609\n225343,2416\n225343,2417\n225345,994\n225346,994\n225347,1608\n225348,1132\n225349,272\n225350,200\n225351,1608\n225352,1132\n225353,1608\n225354,1132\n225355,718\n225356,58\n225357,46\n225358,994\n225359,225360\n225361,1181\n225362,79\n225363,640\n225364,640\n225366,3297\n225368,640\n225369,640\n225370,1332\n225372,994\n225373,781\n225374,1132\n225375,72\n225376,2480\n225377,392\n225378,516\n225379,3367\n225380,171\n225381,4220\n225382,31073\n225383,781\n225384,1132\n225385,795\n225386,859\n225387,994\n225388,301\n225388,302\n225388,305\n225388,579\n225388,690\n225388,818\n225388,868\n225388,1659\n225388,1776\n225388,2292\n225388,2617\n225388,2626\n225388,3089\n225388,68069\n225389,301\n225390,920\n225391,1381\n225392,1381\n225393,1634\n225394,134\n225395,1010\n225396,1607\n225396,2116\n225397,252\n225398,158\n225399,1132\n225400,781\n225401,179170\n225402,493\n225402,682\n225402,72439\n225403,440\n225404,256\n225405,2646\n225406,673\n225406,2373\n225407,5102\n225409,1608\n225410,1132\n225411,309\n225411,310\n225413,932\n225414,516\n225416,1860\n225417,1858\n225420,980\n225421,2480\n225423,714\n225424,37414\n225425,694\n225426,344\n225427,647\n225428,146\n225428,92476\n225429,225430\n225431,694\n225432,1274\n225433,200\n225434,160\n225435,3094\n225436,1718\n225438,694\n225439,3260\n225440,138686\n225441,175\n225442,1220\n225443,516\n225444,252\n225445,160\n225446,8270\n225448,160\n225450,160\n225451,4192\n225451,4193\n225452,160\n225453,160\n225454,994\n225455,140\n225455,160\n225456,8270\n225457,160\n225458,694\n225459,160\n225460,949\n225461,781\n225462,1132\n225463,356\n225463,968\n225463,1231\n225463,1801\n225464,340\n225465,467\n225465,156379\n225466,167\n225467,192\n225468,83\n225469,1238\n225471,994\n225472,868\n225473,1509\n225474,90845\n225475,1452\n225476,1132\n225477,72\n225478,160\n225479,994\n225480,124668\n225481,72\n225482,1623\n225483,225484\n225485,647\n225486,344\n225486,1253\n225487,749\n225488,171\n225489,30\n225490,577\n225491,137\n225493,4192\n225493,4193\n225494,447\n225495,2775\n225496,55849\n225497,179170\n225498,596\n225499,1220\n225500,516\n225501,252\n225502,1181\n225503,875\n225504,141912\n225506,1436\n225508,872\n225509,491\n225510,1837\n225511,44\n225512,1220\n225513,516\n225514,252\n225515,1220\n225516,252\n225517,516\n225519,1294\n225520,1220\n225521,252\n225522,516\n225523,167\n225523,1231\n225523,2083\n225524,225525\n225527,775\n225527,3804\n225528,634\n225529,151\n225530,252\n225530,215276\n225531,1220\n225532,516\n225533,252\n225534,1608\n225535,1132\n225536,206\n225536,2073\n225536,16207\n225536,22727\n225537,649\n225538,1220\n225539,252\n225540,516\n225543,389\n225544,179170\n225545,178\n225546,10\n225546,137\n225546,151\n225546,206\n225546,628\n225546,1572\n225546,1722\n225546,1844\n225546,2073\n225546,2274\n225546,2574\n225546,3295\n225546,4039\n225546,5375\n225546,22727\n225546,99287\n225547,23783\n225548,83\n225549,2105\n225550,63\n225551,58\n225552,994\n225553,46\n225554,225555\n225556,71\n225556,1619\n225557,5310\n225558,1858\n225559,1227\n225559,86416\n225560,149\n225561,252\n225561,1220\n225562,76096\n225563,44725\n225564,2421\n225567,1052\n225568,179170\n225569,149\n225570,278\n225571,885\n225571,13704\n225574,200\n225575,1087\n225577,994\n225579,994\n225580,467\n225581,179170\n225582,144556\n225583,4611\n225585,179170\n225586,179170\n225587,994\n225588,5405\n225589,189128\n225593,406\n225594,994\n225595,193578\n225596,30418\n225598,179170\n225600,1955\n225601,1220\n225602,252\n225603,516\n225604,1220\n225605,516\n225606,252\n225607,30\n225608,217\n225609,875\n225610,818\n225611,875\n225612,44\n225614,179170\n225615,179170\n225616,390\n225616,1274\n225616,1381\n225616,1579\n225616,2646\n225617,179170\n225618,875\n225619,2073\n225620,781\n225621,179170\n225622,1132\n225623,179170\n225624,87\n225624,323\n225624,843\n225624,1453\n225624,2697\n225625,224488\n225626,660\n225627,760\n225628,493\n225628,682\n225628,72439\n225629,225630\n225631,516\n225631,663\n225631,4545\n225631,56150\n225632,1893\n225633,302\n225634,861\n225635,1326\n225636,4597\n225637,1359\n225638,781\n225639,1132\n225640,179170\n225642,142473\n225643,179170\n225644,1132\n225645,1608\n225646,781\n225647,179170\n225648,1132\n225649,32\n225649,392\n225649,1363\n225649,2274\n225649,2699\n225650,874\n225651,843\n225652,994\n225653,179170\n225656,104\n225657,403\n225658,5265\n225659,7757\n225660,48\n225661,1151\n225662,8907\n225663,179170\n225664,79\n225665,202\n225666,202\n225667,30\n225668,1147\n225669,875\n225670,179170\n225671,4223\n225672,1776\n225673,8598\n225674,275\n225675,2784\n225675,27041\n225676,179170\n225677,30\n225679,435\n225680,1849\n225681,694\n225682,994\n225683,1785\n225685,30331\n225686,72\n225687,179170\n225688,515\n225689,640\n225691,647\n225692,179170\n225693,72\n225694,1284\n225695,22293\n225696,843\n225697,179170\n225698,255\n225699,179170\n225700,30\n225701,515\n225702,760\n225703,179170\n225704,1151\n225705,1368\n225706,1556\n225707,392\n225709,179170\n225710,1782\n225711,919\n225712,1143\n225713,1572\n225714,875\n225715,372\n225716,1238\n225717,72\n225718,179170\n225720,30\n225721,179170\n225722,2923\n225723,179170\n225724,179170\n225725,179170\n225726,3999\n225727,4597\n225728,179170\n225729,435\n225730,2373\n225731,818\n225732,4455\n225733,179170\n225735,875\n225736,1181\n225737,179170\n225739,3623\n225740,179170\n225742,2590\n225743,779\n225744,151\n225745,1381\n225746,30\n225748,79\n225748,392\n225749,191355\n225750,3297\n225751,3623\n225752,389\n225753,3297\n225754,30\n225755,179170\n225757,72\n225758,577\n225759,220816\n225760,392\n225761,179170\n225762,518\n225762,1010\n225762,1326\n225763,557\n225764,333\n225764,393\n225764,859\n225764,980\n225764,1388\n225764,1531\n225764,4455\n225764,15573\n225765,23783\n225766,48\n225767,72\n225768,137\n225769,220816\n225770,272\n225771,72\n225772,671\n225774,57354\n225775,818\n225776,652\n225777,1052\n225778,652\n225779,515\n225780,42220\n225781,1151\n225783,179170\n225784,225785\n225786,58\n225787,827\n225788,72\n225789,56\n225790,422\n225791,1381\n225792,72\n225793,15807\n225795,1\n225795,118336\n225796,179170\n225797,1782\n225798,1085\n225798,1511\n225798,2205\n225798,3069\n225798,33424\n225798,245910\n225799,1882\n225800,493\n225801,30\n225802,781\n225803,1332\n225804,1058\n225805,994\n225806,640\n225807,3623\n225808,8822\n225809,611\n225810,1381\n225811,356\n225812,994\n225813,7155\n225814,72\n225815,292\n225816,285\n225817,2073\n225818,179170\n225819,994\n225820,2116\n225821,102\n225822,1323\n225823,1326\n225824,408\n225825,179170\n225826,1181\n225827,44\n225828,155481\n225829,8854\n225830,225831\n225832,1220\n225833,516\n225834,252\n225835,285\n225836,483\n225837,250\n225837,1684\n225838,147\n225840,795\n225841,285\n225842,247\n225843,422\n225844,56\n225848,628\n225849,179170\n225850,3209\n225851,5265\n225852,1285\n225853,41\n225854,1227\n225854,86416\n225855,211\n225855,588\n225855,590\n225856,2089\n225856,9536\n225857,626\n225858,184\n225859,83\n225860,269\n225861,2224\n225862,179170\n225863,151\n225864,94134\n225865,2750\n225867,1238\n225868,1238\n225869,1238\n225870,900\n225871,302\n225872,2379\n225873,1163\n225874,1130\n225875,83\n225876,1860\n225877,4597\n225878,808\n225879,1983\n225880,158\n225881,5906\n225882,557\n225883,626\n225884,278\n225885,137\n225886,862\n225887,137\n225888,187\n225889,1983\n225890,247\n225891,424\n225893,2617\n225894,220816\n225895,8373\n225896,220816\n225897,41\n225898,179170\n225899,7092\n225900,220816\n225901,83\n225903,994\n225904,179170\n225905,259\n225906,4597\n225907,179170\n225908,179170\n225909,994\n225910,3804\n225911,1566\n225912,72\n225913,875\n225914,273\n225915,148885\n225916,301\n225916,392\n225917,875\n225918,179170\n225920,179170\n225921,596\n225922,179170\n225923,920\n225925,994\n225926,179170\n225927,151\n225928,483\n225929,179170\n225930,179170\n225931,147\n225932,225933\n225934,1635\n225935,179170\n225936,1130\n225937,862\n225938,34\n225938,35\n225939,30\n225940,1\n225941,278\n225943,72\n225944,30\n225945,225946\n225947,536\n225948,255\n225950,1132\n225951,781\n225952,179170\n225953,79\n225954,72\n225955,779\n225956,795\n225957,30\n225958,628\n225959,743\n225960,220816\n225961,151\n225962,220816\n225963,6506\n225964,179170\n225965,660\n225966,147\n225967,596\n225968,179170\n225969,2750\n225970,5326\n225970,6068\n225971,8270\n225972,30\n225973,72\n225974,602\n225975,994\n225976,72\n225977,422\n225978,72\n225979,907\n225980,30\n225981,220816\n225982,994\n225983,563\n225984,994\n225985,138686\n225986,175\n225987,179170\n225988,72\n225989,72\n225990,217\n225991,179170\n225992,1181\n225993,220816\n225994,137\n225995,72\n225996,179170\n225997,72\n225998,179170\n225999,4597\n226000,83\n226001,179170\n226002,179170\n226003,3297\n226004,179170\n226005,994\n226006,72\n226008,142870\n226009,72\n226010,72\n226011,422\n226012,422\n226013,422\n226014,179170\n226015,72\n226016,179170\n226017,72\n226018,779\n226019,179170\n226020,4597\n226021,226022\n226023,200\n226024,781\n226025,1132\n226026,130\n226027,72\n226028,72\n226029,240\n226030,72\n226031,17588\n226032,422\n226033,422\n226034,422\n226035,422\n226036,422\n226037,422\n226038,422\n226039,422\n226040,422\n226041,137\n226042,918\n226043,827\n226044,179170\n226045,269\n226046,72\n226047,1181\n226048,285\n226049,179170\n226050,1227\n226050,86416\n226051,872\n226052,577\n226053,346\n226054,179170\n226055,285\n226056,206\n226057,328\n226058,179170\n226059,389\n226060,30\n226061,28072\n226062,30\n226063,657\n226064,72\n226065,841\n226066,81\n226066,3370\n226067,94\n226067,1252\n226067,1253\n226068,1033\n226070,1458\n226071,72\n226072,30\n226073,42220\n226074,179170\n226075,2146\n226076,254\n226077,72\n226078,1332\n226079,2416\n226079,2417\n226080,581\n226081,42220\n226082,171\n226083,3507\n226084,179170\n226085,1235\n226085,1335\n226086,137\n226087,72\n226088,1381\n226089,68\n226090,42220\n226091,5366\n226092,1309\n226093,383\n226094,4597\n226095,862\n226095,2590\n226096,42220\n226097,515\n226098,2416\n226098,2417\n226099,30\n226100,179170\n226101,30\n226102,433\n226103,652\n226104,269\n226105,72\n226106,918\n226107,72\n226108,1345\n226109,1227\n226109,86416\n226110,226111\n226112,179170\n226113,2416\n226113,2417\n226114,510\n226114,972\n226114,6424\n226115,179170\n226116,1118\n226117,42220\n226118,1188\n226118,142870\n226119,22\n226120,72\n226121,72\n226122,72\n226123,72\n226124,1133\n226125,1776\n226126,1247\n226126,164572\n226127,72\n226128,20359\n226129,2416\n226129,2417\n226130,42220\n226131,226132\n226133,226134\n226135,2416\n226135,2417\n226136,226137\n226138,179170\n226139,72\n226140,671\n226141,5366\n226142,10\n226143,50\n226143,147\n226144,9026\n226145,6726\n226146,485\n226147,1572\n226149,3260\n226150,2775\n226151,447\n226153,20757\n226154,142870\n226155,366\n226156,366\n226157,366\n226158,366\n226159,366\n226160,366\n226161,366\n226162,366\n226163,366\n226164,140\n226164,147\n226164,222\n226165,1607\n226167,1227\n226167,86416\n226168,340\n226169,1769\n226170,781\n226171,1132\n226172,226173\n226174,30\n226175,72\n226175,330\n226176,750\n226176,3115\n226176,199199\n226176,227061\n226177,447\n226178,2775\n226181,781\n226182,1132\n226184,868\n226185,16153\n226186,781\n226187,1132\n226188,781\n226189,1132\n226190,179170\n226191,781\n226192,1132\n226194,2372\n226195,211\n226195,4078\n226196,640\n226197,640\n226198,4237\n226198,182162\n226199,147\n226200,240\n226201,30\n226202,447\n226203,8541\n226204,92476\n226205,781\n226206,1132\n226207,1718\n226208,5265\n226209,1860\n226210,1858\n226211,994\n226212,4611\n226213,918\n226214,179170\n226215,179170\n226216,129534\n226217,1688\n226218,206\n226219,179170\n226220,179170\n226221,1284\n226222,226223\n226225,781\n226226,1132\n226227,3623\n226229,736\n226230,1058\n226232,138686\n226233,994\n226234,1132\n226235,1363\n226236,781\n226237,1132\n226238,1363\n226239,994\n226240,83\n226241,30\n226242,491\n226243,83\n226244,226245\n226246,516\n226248,179170\n226250,252\n226250,1370\n226250,1877\n226251,179170\n226253,240\n226253,2590\n226255,875\n226256,179170\n226257,994\n226259,875\n226260,23010\n226261,23010\n226262,920\n226263,209\n226264,1860\n226265,1858\n226266,467\n226267,301\n226267,2443\n226268,781\n226269,1132\n226270,615\n226270,968\n226270,1782\n226271,179170\n226272,636\n226273,9560\n226274,179170\n226276,313\n226277,72\n226278,72\n226279,932\n226280,1132\n226281,781\n226282,72\n226283,226284\n226285,3804\n226286,872\n226287,1274\n226289,31073\n226290,179170\n226291,2411\n226293,179170\n226294,138686\n226295,175\n226296,875\n226298,191860\n226299,3370\n226299,4039\n226300,8330\n226301,1363\n226302,392\n226302,4760\n226303,994\n226304,222\n226305,994\n226306,58\n226307,2915\n226308,310\n226308,3039\n226309,795\n226309,4355\n226311,1572\n226312,192\n226313,179170\n226314,251\n226315,299\n226316,7652\n226317,179170\n226318,994\n226319,179170\n226320,631\n226321,46\n226322,58\n226323,994\n226324,2979\n226325,2083\n226326,77\n226327,1238\n226328,83\n226329,206\n226330,77\n226331,392\n226332,4760\n226333,1860\n226334,6059\n226335,697\n226336,6955\n226337,3612\n226338,5658\n226339,2274\n226340,4252\n226341,623\n226342,301\n226343,189303\n226345,1452\n226346,392\n226347,4760\n226348,6059\n226349,1860\n226350,5658\n226351,4252\n226352,623\n226353,697\n226354,6955\n226355,3612\n226356,595\n226357,2274\n226358,187960\n226359,187176\n226360,310\n226361,874\n226362,1\n226363,4177\n226364,636\n226365,8270\n226366,50\n226366,209\n226366,261\n226366,312\n226366,1096\n226366,1118\n226366,1531\n226366,2750\n226366,3079\n226367,1132\n226368,781\n226369,278\n226371,1801\n226371,3182\n226371,6424\n226372,10\n226374,179170\n226375,4548\n226376,1673\n226377,79\n226378,360\n226378,1769\n226378,1893\n226379,994\n226380,422\n226380,5405\n226381,1\n226382,8270\n226383,907\n226384,589\n226384,72439\n226385,2979\n226386,736\n226387,30\n226388,22\n226389,999\n226390,1849\n226391,179170\n226392,179170\n226393,1294\n226394,41767\n226395,5301\n226396,72\n226399,1212\n226400,720\n226401,752\n226402,994\n226403,179170\n226404,30\n226405,1400\n226406,179170\n226407,151\n226408,179170\n226409,328\n226410,1309\n226410,1955\n226411,920\n226412,605\n226412,1119\n226412,1167\n226412,2995\n226412,103860\n226414,4597\n226415,179170\n226417,309\n226417,310\n226418,309\n226418,310\n226419,309\n226419,310\n226422,918\n226423,1509\n226424,827\n226425,309\n226425,310\n226425,1243\n226426,875\n226427,473\n226428,192\n226428,333\n226429,602\n226430,5987\n226431,859\n226432,809\n226433,602\n226434,83\n226435,713\n226436,973\n226437,1132\n226438,516\n226439,417\n226439,1635\n226441,731\n226442,1181\n226443,151\n226448,515\n226449,302\n226451,72\n226452,861\n226453,1132\n226455,217\n226456,1082\n226457,179170\n226458,140\n226459,83\n226460,189788\n226460,189794\n226460,189842\n226461,666\n226463,467\n226465,1467\n226466,142870\n226467,330\n226468,72\n226469,850\n226472,581\n226472,663\n226472,811\n226472,918\n226472,1058\n226472,1556\n226472,13980\n226473,140\n226474,283\n226475,50\n226476,483\n226477,2116\n226478,1663\n226479,72\n226480,435\n226481,366\n226484,179170\n226485,592\n226486,259\n226486,676\n226487,2671\n226487,3252\n226488,779\n226489,4597\n226491,843\n226492,147\n226493,1368\n226494,1167\n226495,72\n226496,563\n226497,23783\n226500,515\n226501,714\n226502,943\n226502,1332\n226503,179170\n226504,1688\n226505,145240\n226506,1370\n226507,226508\n226511,111\n226515,158\n226515,192\n226516,171641\n226517,5911\n226518,622\n226520,818\n226521,151\n226522,4597\n226523,1556\n226524,200\n226525,94\n226525,2787\n226526,918\n226527,861\n226528,1860\n226529,72\n226530,6303\n226532,30\n226533,433\n226534,704\n226535,30\n226536,179170\n226537,479\n226538,115\n226539,500\n226540,1052\n226541,2775\n226542,1962\n226543,54\n226544,875\n226545,138686\n226546,175\n226547,4597\n226548,151\n226549,179170\n226550,179170\n226551,349\n226551,509\n226552,622\n226553,310\n226554,179170\n226555,1359\n226556,56\n226557,422\n226559,269\n226560,145240\n226561,422\n226562,56\n226563,406\n226564,22\n226564,30\n226564,366\n226564,805\n226564,1177\n226564,4237\n226564,6556\n226564,182162\n226565,151\n226566,2867\n226566,2868\n226567,179170\n226568,56\n226569,2146\n226570,422\n226571,134\n226572,422\n226573,56\n226574,422\n226575,56\n226576,4237\n226576,182162\n226577,1177\n226578,6556\n226579,292\n226580,408\n226581,417\n226582,2292\n226583,56\n226584,422\n226585,179170\n226586,264\n226587,1227\n226587,86416\n226588,302\n226589,179170\n226590,1381\n226592,56\n226593,422\n226594,344\n226595,874\n226596,1132\n226597,781\n226598,56\n226599,422\n226600,781\n226601,1132\n226602,885\n226602,13704\n226603,269\n226605,1132\n226606,781\n226607,192\n226608,718\n226609,586\n226610,259\n226611,781\n226612,1132\n226613,30\n226614,113156\n226615,72\n226616,226617\n226618,1\n226619,622\n226620,1132\n226621,781\n226622,220816\n226623,30\n226624,1132\n226625,781\n226626,179170\n226627,220816\n226628,349\n226629,1132\n226630,781\n226631,179170\n226632,30\n226633,145240\n226634,220816\n226635,2168\n226636,1801\n226637,220816\n226638,1181\n226639,1132\n226640,4594\n226641,261\n226642,2989\n226642,2991\n226643,179170\n226644,8270\n226645,422\n226646,220816\n226647,622\n226648,83\n226648,278\n226648,577\n226649,221737\n226650,3370\n226650,14453\n226651,179170\n226653,269\n226654,220816\n226655,417\n226655,1085\n226655,1474\n226655,1789\n226655,2205\n226655,33424\n226655,245910\n226656,220816\n226657,30\n226658,622\n226659,30\n226660,146\n226660,92476\n226661,408\n226662,102\n226663,1323\n226664,577\n226665,1235\n226665,1335\n226666,226667\n226668,2735\n226669,72\n226670,781\n226671,1132\n226672,201298\n226673,65\n226674,435\n226676,875\n226677,226678\n226679,220816\n226680,220816\n226681,875\n226682,1132\n226683,781\n226684,1564\n226685,179170\n226686,4691\n226687,107\n226688,872\n226689,2048\n226690,1014\n226691,781\n226692,1132\n226693,1014\n226694,220816\n226695,760\n226696,1453\n226697,953\n226698,1014\n226699,1014\n226700,1893\n226700,5547\n226701,226702\n226704,779\n226705,8788\n226706,220816\n226707,278\n226708,1014\n226709,1707\n226710,843\n226711,1046\n226712,673\n226713,2915\n226714,9025\n226715,220816\n226716,1429\n226717,2671\n226718,1118\n226718,1663\n226719,9026\n226720,557\n226721,217\n226721,301\n226722,862\n226723,1474\n226724,220816\n226725,7092\n226726,994\n226727,949\n226728,220816\n226729,1608\n226730,179170\n226731,30\n226732,83\n226733,30331\n226734,34\n226734,35\n226734,83\n226735,6424\n226736,220816\n226737,1474\n226737,1789\n226739,151\n226740,920\n226741,1359\n226742,233\n226743,255\n226744,2048\n226745,1238\n226746,220502\n226747,200\n226748,1381\n226749,2048\n226750,841\n226751,28072\n226752,72\n226753,17309\n226754,83\n226755,994\n226756,4597\n226757,220816\n226758,2373\n226759,226760\n226761,136\n226762,77\n226763,134\n226764,4475\n226765,200\n226766,3999\n226767,134\n226768,179170\n226769,4475\n226770,4548\n226771,220816\n226772,1227\n226772,86416\n226773,1462\n226774,278\n226775,179170\n226776,622\n226777,202\n226778,269\n226780,220816\n226781,179170\n226782,226783\n226784,226785\n226786,366\n226787,366\n226788,4771\n226789,65\n226789,200\n226789,252\n226790,3623\n226791,30\n226792,56\n226793,422\n226794,2048\n226795,30\n226796,222\n226796,628\n226797,30\n226798,30\n226799,30\n226800,30\n226801,278\n226802,3582\n226803,273\n226803,2367\n226804,8270\n226805,422\n226806,56\n226807,220816\n226809,366\n226810,818\n226811,220816\n226812,5440\n226813,333\n226814,226815\n226814,227241\n226814,227455\n226814,237244\n226814,245884\n226814,247963\n226814,248382\n226814,249561\n226814,257378\n226814,259772\n226814,262247\n226814,264752\n226816,220816\n226817,115\n226817,2868\n226818,344\n226818,1253\n226819,1773\n226820,1143\n226821,30\n226822,220816\n226823,1368\n226824,226825\n226826,1235\n226826,1335\n226827,147\n226828,682\n226828,72439\n226829,138686\n226830,79\n226831,435\n226832,1359\n226833,56\n226834,422\n226835,1949\n226836,151\n226837,4597\n226838,843\n226839,175\n226840,30331\n226841,179170\n226842,1014\n226843,30\n226844,1235\n226844,1335\n226845,1466\n226846,142870\n226847,151\n226848,72\n226849,422\n226850,422\n226851,422\n226852,422\n226853,422\n226854,422\n226855,422\n226856,422\n226857,422\n226858,422\n226859,422\n226860,422\n226861,563\n226863,557\n226864,1247\n226864,164572\n226865,30\n226866,145240\n226867,3804\n226868,285\n226869,1267\n226870,30\n226871,56\n226872,422\n226873,8822\n226874,5469\n226875,2929\n226876,5714\n226877,226878\n226879,56\n226880,422\n226881,779\n226882,179170\n226883,1474\n226885,1284\n226886,673\n226887,179170\n226888,302\n226889,30\n226890,4980\n226891,671\n226892,1452\n226893,30\n226895,900\n226896,179170\n226897,640\n226898,206\n226898,628\n226898,16207\n226898,22727\n226899,918\n226900,1368\n226901,269\n226903,226904\n226903,261410\n226905,972\n226906,56\n226907,422\n226908,30\n226909,146\n226909,92476\n226910,285\n226911,862\n226912,267\n226913,850\n226914,179170\n226915,2116\n226916,171\n226917,30\n226918,779\n226919,5440\n226920,211\n226921,179170\n226922,179170\n226923,10\n226924,493\n226925,226926\n226927,4597\n226928,58\n226929,491\n226931,1085\n226932,142405\n226934,3447\n226935,4597\n226936,171641\n226937,4597\n226938,4597\n226939,2671\n226940,151\n226941,8270\n226942,195\n226943,8822\n226944,1844\n226945,557\n226945,164572\n226946,918\n226947,1462\n226948,30331\n226949,1955\n226950,261\n226951,1368\n226952,577\n226953,107228\n226954,24505\n226955,932\n226957,250\n226957,1684\n226958,248\n226959,206\n226960,862\n226961,1227\n226961,86416\n226962,801\n226963,151\n226964,2590\n226965,226966\n226968,346\n226969,5405\n226971,2995\n226972,4597\n226974,868\n226975,907\n226977,794\n226978,1082\n226979,35486\n226980,56\n226981,422\n226982,818\n226983,1509\n226984,1359\n226987,852\n226987,1782\n226988,1368\n226989,30\n226990,31934\n226991,31934\n226992,31934\n226993,422\n226994,56\n226995,31934\n226996,30\n226997,31934\n226998,557\n226999,31934\n227000,31934\n227001,31934\n227003,31934\n227004,31934\n227006,171641\n227007,20813\n227008,1608\n227009,1132\n227010,179170\n227011,422\n227012,56\n227013,868\n227014,179170\n227015,31934\n227016,872\n227017,640\n227018,647\n227019,146\n227019,92476\n227020,344\n227021,640\n227022,1429\n227023,138686\n227024,640\n227025,175\n227026,640\n227027,406\n227027,779\n227028,872\n227029,985\n227030,190492\n227032,3260\n227033,1359\n227034,957\n227034,1815\n227034,164572\n227035,273\n227036,179170\n227037,1132\n227038,781\n227039,211\n227040,668\n227041,577\n227042,313\n227043,422\n227044,56\n227045,7358\n227045,7363\n227046,56\n227047,422\n227048,56\n227049,422\n227050,146\n227050,92476\n227051,647\n227052,344\n227053,227054\n227055,1132\n227056,31934\n227057,146\n227057,92476\n227058,647\n227059,344\n227060,200\n227061,10\n227061,425\n227061,693\n227061,1436\n227061,1616\n227061,3392\n227061,6026\n227061,6027\n227061,21207\n227061,26420\n227061,38140\n227061,226176\n227061,227061\n227061,227101\n227061,227359\n227061,228317\n227061,231068\n227061,234212\n227061,236717\n227061,246178\n227061,252502\n227061,252504\n227061,263858\n227062,255\n227063,31934\n227064,1227\n227064,86416\n227065,1132\n227066,781\n227068,698\n227069,191860\n227070,3207\n227071,1240\n227072,781\n227073,1132\n227075,269\n227076,622\n227077,447\n227078,2775\n227079,179170\n227080,179170\n227081,920\n227082,79\n227083,8270\n227084,663\n227084,875\n227084,4722\n227084,5800\n227084,7987\n227084,36720\n227084,47021\n227084,63097\n227084,76704\n227084,88544\n227084,106121\n227084,141853\n227084,148601\n227084,162619\n227084,165787\n227084,201253\n227084,232736\n227084,239805\n227084,245283\n227084,247116\n227084,247131\n227084,247298\n227084,247693\n227084,252237\n227085,179170\n227086,2296\n227087,647\n227088,146\n227088,92476\n227089,344\n227090,781\n227091,1132\n227092,160\n227093,179170\n227094,647\n227095,146\n227095,92476\n227096,344\n227097,622\n227098,179170\n227099,191355\n227100,801\n227101,227061\n227102,160\n227103,1769\n227104,781\n227105,1132\n227106,1769\n227107,932\n227108,160\n227109,160\n227110,160\n227111,160\n227112,160\n227113,160\n227114,781\n227115,1132\n227116,1985\n227117,3209\n227118,2205\n227118,33424\n227119,622\n227120,16196\n227121,3148\n227122,1639\n227123,120\n227124,13\n227125,2292\n227126,217\n227127,2668\n227128,1014\n227129,3\n227130,247\n227131,4604\n227132,333\n227133,8235\n227134,918\n227135,383\n227136,622\n227137,349\n227138,3246\n227139,2506\n227140,588\n227140,590\n227141,250\n227141,1684\n227142,389\n227143,211\n227144,138686\n227145,68\n227146,175\n227147,8868\n227148,589\n227149,67995\n227150,179170\n227151,433\n227152,397\n227153,360\n227154,328\n227155,79\n227156,179170\n227157,344\n227158,647\n227159,146\n227159,92476\n227160,2590\n227161,227162\n227163,622\n227164,657\n227165,2205\n227165,33424\n227165,245910\n227166,1181\n227168,77\n227169,207\n227170,1238\n227171,622\n227172,1294\n227173,781\n227174,1132\n227175,50\n227176,147\n227177,557\n227178,33424\n227178,34580\n227179,1370\n227180,83\n227181,1132\n227182,781\n227183,781\n227184,1132\n227185,682\n227185,72439\n227186,8270\n227187,775\n227189,205627\n227190,330\n227191,1452\n227192,589\n227193,1132\n227194,1608\n227195,200\n227196,781\n227197,1132\n227198,599\n227199,240\n227200,149\n227200,406\n227201,146\n227201,92476\n227202,1143\n227203,1247\n227203,164572\n227204,175\n227205,179170\n227206,30\n227207,148742\n227210,118336\n227211,217\n227212,179170\n227213,1608\n227214,1132\n227215,622\n227216,1058\n227217,1132\n227218,781\n227219,56\n227220,422\n227221,217\n227222,138686\n227223,175\n227225,3804\n227226,622\n227228,745\n227228,1012\n227228,1425\n227228,2528\n227228,249937\n227230,389\n227231,1132\n227232,1608\n227233,73570\n227234,1882\n227235,146\n227235,92476\n227236,647\n227237,344\n227238,3623\n227239,14366\n227240,227241\n227242,179170\n227244,6387\n227245,227246\n227247,179170\n227248,211\n227249,1776\n227250,8991\n227251,5440\n227252,417\n227253,6068\n227254,907\n227255,8330\n227256,2116\n227257,868\n227258,35486\n227259,83\n227260,56\n227261,422\n227262,447\n227263,2775\n227265,34\n227265,35\n227266,1133\n227267,178\n227268,1082\n227269,1608\n227270,1132\n227271,422\n227272,227273\n227274,3467\n227275,2146\n227276,35486\n227277,439\n227277,164572\n227278,142405\n227279,151\n227280,30\n227281,1608\n227282,1132\n227283,118336\n227284,227285\n227287,1368\n227288,862\n227289,372\n227289,1082\n227289,1285\n227289,1796\n227289,1888\n227289,1955\n227290,422\n227291,227292\n227293,77\n227294,611\n227294,1619\n227295,35486\n227296,227297\n227298,134\n227299,3999\n227300,2048\n227301,4475\n227302,1454\n227303,1285\n227304,1132\n227305,1608\n227306,227307\n227308,179170\n227309,1058\n227310,872\n227311,207\n227311,852\n227312,30\n227313,1132\n227314,192\n227314,333\n227315,388\n227316,452\n227317,389\n227318,44\n227319,56\n227320,422\n227321,653\n227321,2045\n227322,167\n227323,994\n227324,2590\n227326,586\n227328,515\n227329,200\n227330,301\n227331,30\n227332,1608\n227334,41\n227335,1608\n227336,918\n227337,389\n227338,1858\n227339,1860\n227340,1132\n227342,179170\n227343,179170\n227344,333\n227345,1132\n227346,107\n227346,1052\n227346,1579\n227347,309\n227347,310\n227348,752\n227349,2480\n227350,3582\n227351,3623\n227352,211\n227353,1893\n227354,227355\n227356,1893\n227358,5102\n227360,65\n227361,34\n227361,35\n227362,389\n227363,301\n227364,312\n227365,406\n227366,968\n227367,389\n227367,949\n227368,151\n227369,994\n227370,1118\n227371,932\n227372,118336\n227373,118336\n227374,918\n227375,302\n227376,37\n227376,301\n227376,446\n227376,615\n227376,685\n227376,911\n227376,937\n227376,968\n227376,1231\n227376,1293\n227376,1623\n227376,1782\n227376,5356\n227376,5662\n227376,7222\n227376,13523\n227376,103860\n227376,142806\n227376,189303\n227376,227376\n227376,248553\n227376,263299\n227378,35486\n227379,151\n227380,179170\n227381,1235\n227381,1335\n227382,5405\n227383,83\n227383,536\n227384,2421\n227385,1370\n227386,3193\n227387,179170\n227388,250\n227388,1684\n227389,1001\n227390,252\n227391,77\n227392,118336\n227393,158\n227393,118336\n227394,146\n227394,92476\n227395,647\n227396,344\n227397,30\n227398,147\n227398,1181\n227399,179170\n227400,118336\n227401,179170\n227402,179170\n227403,179170\n227404,1010\n227405,5405\n227406,697\n227407,1634\n227408,326\n227408,455\n227408,873\n227408,1300\n227408,1479\n227409,220816\n227410,179170\n227411,424\n227412,179170\n227413,72\n227414,805\n227415,220816\n227416,179170\n227417,302\n227418,1390\n227419,227420\n227421,220816\n227422,220816\n227423,118336\n227424,118336\n227425,15068\n227426,151\n227427,861\n227428,220816\n227429,138\n227430,227431\n227432,865\n227433,557\n227434,137\n227435,588\n227435,590\n227435,1419\n227436,88820\n227437,220816\n227438,179170\n227439,35486\n227440,752\n227441,535\n227442,220816\n227443,6682\n227444,179170\n227445,200\n227446,1326\n227447,102\n227448,1323\n227449,408\n227450,72\n227451,179170\n227452,200\n227453,220816\n227454,55849\n227456,200\n227457,809\n227458,118336\n227459,1231\n227459,1782\n227460,972\n227461,142870\n227462,134\n227462,1265\n227462,1266\n227463,179170\n227464,179170\n227465,220816\n227466,118336\n227467,1238\n227468,332\n227469,3623\n227470,179170\n227471,35486\n227472,7092\n227473,1132\n227474,3623\n227476,1132\n227477,1608\n227478,1132\n227479,3623\n227480,622\n227481,220816\n227482,1001\n227483,140\n227484,220816\n227485,622\n227486,827\n227487,968\n227488,622\n227488,779\n227489,489\n227491,874\n227492,227493\n227492,240814\n227492,251716\n227494,811\n227497,72\n227498,72\n227499,220816\n227500,220816\n227501,666\n227502,278\n227503,138686\n227504,175\n227505,10\n227507,596\n227508,149534\n227509,220816\n227510,179170\n227511,918\n227512,146\n227512,92476\n227513,647\n227514,344\n227515,179170\n227516,1085\n227517,2048\n227518,227519\n227520,72\n227522,874\n227523,366\n227524,217\n227525,467\n227526,346\n227527,3447\n227528,1326\n227529,631\n227530,240\n227531,1715\n227532,390\n227533,1010\n227534,38299\n227534,228921\n227534,229718\n227534,232383\n227534,232387\n227534,234157\n227534,234168\n227534,235930\n227534,236447\n227534,241220\n227535,5405\n227536,918\n227537,227538\n227539,147\n227540,179170\n227541,1227\n227541,86416\n227542,301\n227543,142870\n227544,179170\n227545,843\n227546,138686\n227547,175\n227548,298\n227550,1133\n227551,227552\n227553,142870\n227554,1368\n227555,179170\n227556,227557\n227558,179170\n227559,1556\n227560,301\n227561,932\n227562,200\n227563,191860\n227564,179170\n227565,134\n227566,118336\n227567,240\n227568,422\n227569,422\n227570,422\n227571,422\n227572,118336\n227573,422\n227574,1844\n227575,422\n227576,779\n227577,422\n227578,422\n227579,422\n227580,2424\n227581,179170\n227582,179170\n227583,422\n227584,1368\n227585,179170\n227586,192\n227586,200\n227586,217\n227586,222\n227586,240\n227586,269\n227586,455\n227586,779\n227586,1019\n227586,5265\n227586,142870\n227587,179170\n227588,113156\n227589,697\n227590,1133\n227591,10\n227592,179170\n227593,179170\n227594,285\n227595,179170\n227596,250\n227596,1684\n227597,491\n227598,285\n227599,135\n227600,179170\n227601,269\n227602,843\n227603,258\n227604,179170\n227605,5343\n227606,801\n227607,30\n227609,72\n227610,30\n227611,225\n227612,179170\n227613,862\n227613,1001\n227613,1474\n227613,1789\n227614,179170\n227615,5405\n227616,525\n227617,30331\n227618,1309\n227619,1285\n227620,422\n227621,56\n227622,631\n227623,1085\n227624,137\n227625,294\n227626,179170\n227627,8884\n227628,179170\n227629,179170\n227630,179170\n227631,1085\n227632,248\n227632,1639\n227633,483\n227634,111\n227634,1453\n227634,1722\n227634,3538\n227635,227636\n227637,1419\n227637,8822\n227638,30\n227640,422\n227641,56\n227642,227643\n227645,56\n227646,422\n227647,227648\n227649,366\n227650,366\n227651,366\n227652,366\n227653,491\n227654,779\n227656,222\n227657,146\n227657,92476\n227658,179170\n227660,151\n227661,35486\n227662,142870\n227663,283\n227664,2416\n227664,2417\n227665,227666\n227667,227666\n227668,227669\n227669,1284\n227669,38299\n227669,76704\n227669,228921\n227669,234157\n227669,235009\n227669,235930\n227669,236447\n227669,239776\n227669,241639\n227669,246309\n227669,246841\n227669,248244\n227669,250395\n227669,253342\n227669,253508\n227669,253985\n227669,254371\n227670,149\n227671,5250\n227672,1782\n227673,56\n227674,422\n227675,314\n227677,622\n227678,932\n227679,227680\n227679,248395\n227681,272\n227682,227683\n227684,874\n227684,3182\n227685,850\n227686,1132\n227687,310\n227687,841\n227688,151\n227689,1983\n227690,227691\n227692,3447\n227693,58\n227694,1769\n227695,227696\n227697,3582\n227698,50\n227699,22\n227700,1175\n227701,4\n227701,5\n227702,83\n227704,142870\n227705,422\n227706,56\n227707,227708\n227709,417\n227709,1085\n227711,44\n227712,137\n227714,1359\n227715,483\n227716,1381\n227717,179170\n227718,179170\n227719,302\n227720,141912\n227721,1858\n227722,1860\n227723,151\n227724,200\n227726,179170\n227727,666\n227728,48505\n227729,516\n227730,455\n227731,179170\n227732,200\n227733,179170\n227734,240\n227735,179170\n227736,151\n227740,602\n227742,227743\n227745,209\n227747,1368\n227748,1070\n227749,15748\n227750,622\n227751,220816\n227752,220816\n227753,298\n227754,485\n227755,518\n227756,220816\n227757,147\n227757,158\n227758,220816\n227759,179170\n227760,1381\n227761,179170\n227762,56\n227763,422\n227764,5405\n227765,493\n227766,48505\n227767,138686\n227768,175\n227769,805\n227770,1227\n227770,86416\n227771,220816\n227772,179170\n227773,269\n227774,346\n227775,344\n227776,918\n227777,285\n227778,227779\n227780,1479\n227781,390\n227782,340\n227783,346\n227784,179170\n227785,252\n227786,227787\n227788,179170\n227789,2373\n227790,1118\n227792,15119\n227793,220816\n227794,15119\n227795,220816\n227796,179170\n227797,179170\n227798,289\n227798,94134\n227799,58\n227800,3804\n227801,179170\n227802,145240\n227803,1220\n227804,252\n227805,516\n227806,818\n227807,893\n227808,1882\n227809,918\n227810,158\n227811,1181\n227812,227813\n227814,220816\n227817,227818\n227819,41\n227820,222\n227821,41\n227822,227823\n227825,805\n227826,1368\n227827,781\n227828,1132\n227829,88820\n227830,267\n227831,72\n227832,481\n227833,72\n227834,72\n227835,389\n227836,41\n227837,30\n227838,30\n227839,366\n227840,227841\n227843,41\n227844,17772\n227845,269\n227846,227847\n227849,2292\n227850,178\n227853,30331\n227854,1227\n227854,86416\n227855,1181\n227857,872\n227858,227859\n227860,872\n227861,285\n227862,1368\n227863,227864\n227865,179170\n227866,227867\n227868,994\n227869,227870\n227871,30\n227872,107\n227873,2416\n227873,2417\n227874,292\n227875,338\n227876,298\n227877,1133\n227878,3538\n227879,56\n227880,422\n227881,818\n227883,227884\n227885,1175\n227888,491\n227889,72\n227890,1522\n227891,35486\n227892,455\n227894,111\n227894,4193\n227895,932\n227896,999\n227897,72\n227898,8270\n227899,795\n227900,994\n227901,107\n227903,1462\n227903,2697\n227903,164572\n227905,151\n227906,195\n227907,1132\n227908,22\n227909,2244\n227910,34\n227910,35\n227910,313\n227910,634\n227910,1313\n227910,1718\n227910,2224\n227910,2646\n227910,4223\n227910,5326\n227910,188791\n227911,1590\n227912,994\n227913,2244\n227914,2244\n227915,2244\n227917,1381\n227918,2244\n227919,1858\n227921,227922\n227923,56\n227924,422\n227925,179170\n227926,30\n227927,227928\n227929,2750\n227930,310\n227932,44\n227933,485\n227934,298\n227935,389\n227936,4220\n227937,83\n227939,83\n227940,217\n227941,485\n227942,298\n227943,843\n227943,2260\n227945,179170\n227946,179170\n227948,192\n227949,1132\n227950,781\n227951,1882\n227952,1191\n227953,483\n227954,106\n227955,389\n227956,4597\n227957,30\n227959,179170\n227960,1132\n227961,781\n227962,30\n227963,4597\n227964,138686\n227965,175\n227966,2379\n227967,868\n227968,859\n227970,491\n227971,1326\n227972,102\n227973,1323\n227974,408\n227975,999\n227976,1381\n227977,4597\n227978,649\n227980,1132\n227981,781\n227983,994\n227984,491\n227985,491\n227986,227669\n227988,30\n227989,491\n227990,72\n227991,994\n227992,994\n227993,1132\n227994,781\n227995,1844\n227996,1707\n227997,30\n227998,557\n227999,557\n228000,557\n228001,693\n228001,3370\n228002,192\n228003,1509\n228004,179170\n228005,1132\n228006,781\n228007,994\n228008,179170\n228009,784\n228010,1132\n228011,781\n228012,760\n228013,151\n228014,1132\n228015,781\n228016,211\n228017,358\n228018,1220\n228019,1127\n228020,228021\n228022,994\n228023,1608\n228024,8463\n228024,142870\n228025,13661\n228026,1860\n228027,1858\n228028,1132\n228029,781\n228030,994\n228031,1860\n228032,1858\n228033,13538\n228034,994\n228037,228038\n228039,4611\n228040,1181\n228041,228042\n228043,999\n228044,2191\n228045,1326\n228046,2506\n228047,119\n228048,872\n228049,872\n228050,875\n228051,72\n228053,422\n228054,422\n228055,422\n228056,422\n228057,422\n228058,422\n228059,422\n228060,422\n228061,422\n228062,72\n228063,4597\n228064,422\n228065,346\n228066,72\n228067,138686\n228068,175\n228069,97\n228070,240\n228071,500\n228072,2775\n228073,1052\n228074,1962\n228075,54\n228076,228077\n228078,1181\n228079,50\n228081,240\n228081,1285\n228082,99\n228083,1769\n228084,99\n228085,285\n228086,1227\n228086,86416\n228087,179170\n228088,179170\n228089,366\n228090,142870\n228091,228092\n228093,212234\n228094,779\n228095,178\n228096,99\n228097,1381\n228098,99\n228099,99\n228100,142473\n228101,292\n228102,99\n228103,294\n228104,296\n228105,298\n228106,99\n228107,179170\n228109,779\n228110,179170\n228111,179170\n228112,179170\n228113,200\n228114,228115\n228116,179170\n228117,1381\n228119,83\n228120,30\n228122,8868\n228123,1400\n228124,99\n228125,1132\n228126,1608\n228128,2371\n228129,364\n228130,1058\n228131,141912\n228132,228133\n228134,694\n228134,3695\n228135,179170\n228136,158\n228137,4597\n228138,228139\n228140,586\n228141,104\n228142,4611\n228143,228144\n228145,7155\n228146,358\n228147,874\n228148,1012\n228150,1359\n228151,640\n228152,1608\n228153,640\n228154,142430\n228154,147191\n228155,640\n228156,2979\n228157,408\n228158,148742\n228159,240\n228159,818\n228160,228161\n228162,30\n228165,228166\n228167,9457\n228169,1201\n228170,636\n228172,215276\n228177,35486\n228183,1010\n228184,79\n228186,717\n228191,666\n228191,8714\n228193,217\n228197,631\n228199,326\n228201,251\n228209,332\n228210,344\n228210,694\n228210,1419\n228213,671\n228215,15\n228216,1238\n228218,1858\n228219,1860\n228226,408\n228227,228228\n228230,1452\n228231,900\n228232,1132\n228233,781\n228234,1893\n228234,2312\n228235,228236\n228239,1359\n228240,1309\n228240,1807\n228240,1955\n228240,2775\n228241,1860\n228242,1858\n228243,179170\n228244,932\n228245,422\n228246,56\n228247,781\n228248,1132\n228249,228250\n228251,140\n228252,781\n228253,1132\n228254,171\n228255,228256\n228257,760\n228267,1010\n228268,171\n228269,1284\n228270,72\n228271,344\n228272,285\n228276,657\n228277,222\n228277,657\n228279,1224\n228280,3623\n228281,685\n228282,779\n228283,3260\n228284,1769\n228285,835\n228286,146\n228286,92476\n228287,220816\n228288,1300\n228289,366\n228290,500\n228291,349\n228292,718\n228293,1010\n228294,252\n228299,1821\n228299,21736\n228300,536\n228301,65\n228301,120\n228301,285\n228301,438\n228301,599\n228301,660\n228301,795\n228301,818\n228301,1122\n228301,1454\n228301,1849\n228301,2646\n228301,2699\n228302,5961\n228304,195\n228306,9457\n228307,138686\n228308,1227\n228308,86416\n228309,175\n228310,1294\n228311,301\n228312,340\n228313,146\n228313,92476\n228314,14989\n228315,24505\n228317,227061\n228318,200\n228320,171641\n228321,81\n228323,7429\n228324,289\n228324,94134\n228325,3695\n228326,615\n228328,1860\n228329,1858\n228330,415\n228331,30\n228333,13980\n228335,83\n228337,3695\n228339,3695\n228340,1220\n228341,516\n228342,252\n228344,4597\n228347,462\n228348,818\n228348,127158\n228349,227669\n228352,1359\n228354,657\n228356,1240\n228357,344\n228358,2421\n228359,934\n228360,13661\n228361,919\n228362,1284\n228364,1801\n228365,1860\n228366,1858\n228367,264\n228368,2572\n228369,171641\n228370,1749\n228371,2421\n228372,1132\n228373,772\n228373,1722\n228374,467\n228375,2105\n228377,1096\n228378,151\n228379,138686\n228380,175\n228381,1522\n228382,209\n228383,859\n228384,30\n228386,1359\n228387,999\n228388,1608\n228389,228390\n228391,3623\n228392,140\n228393,1132\n228394,781\n228395,1132\n228396,972\n228396,4504\n228399,2979\n228402,30\n228403,192\n228403,406\n228403,4192\n228403,4193\n228404,1858\n228405,1860\n228406,1220\n228407,252\n228408,516\n228409,217\n228411,1452\n228416,228417\n228418,358\n228419,14434\n228420,433\n228425,200\n228426,2073\n228431,1782\n228432,73570\n228433,44\n228436,349\n228436,392\n228437,1132\n228438,781\n228439,1284\n228439,148742\n228440,189303\n228441,179170\n228442,179170\n228443,299\n228443,73570\n228444,1608\n228445,3207\n228446,491\n228447,200\n228451,3612\n228455,13661\n228457,275\n228458,83\n228458,455\n228458,657\n228458,949\n228458,1454\n228459,179170\n228460,740\n228460,741\n228462,79\n228466,1220\n228467,302\n228468,1089\n228469,302\n228470,147\n228473,302\n228474,491\n228475,1293\n228476,397\n228477,200\n228480,55849\n228482,10\n228482,175\n228483,55849\n228484,536\n228485,228486\n228487,389\n228488,30\n228489,424\n228490,228491\n228492,192\n228492,818\n228493,435\n228494,48505\n228495,142473\n228496,138686\n228497,120\n228498,175\n228499,191860\n228500,179170\n228501,1227\n228501,86416\n228502,72\n228503,15119\n228504,200\n228505,515\n228506,228507\n228508,178\n228508,315\n228508,346\n228508,393\n228508,435\n228508,439\n228508,538\n228508,671\n228508,934\n228508,996\n228508,1068\n228508,1294\n228508,1590\n228508,1612\n228508,1644\n228508,1877\n228508,2353\n228508,6661\n228509,7416\n228510,2373\n228511,206\n228512,179170\n228513,118336\n228514,918\n228515,30\n228516,149\n228516,406\n228517,918\n228518,211\n228519,135\n228520,179170\n228521,60576\n228522,19010\n228523,340\n228525,483\n228526,179170\n228527,83\n228528,712\n228529,8308\n228530,179170\n228531,406\n228532,1860\n228533,1858\n228534,779\n228535,30\n228536,435\n228537,179170\n228538,1\n228539,1132\n228540,30\n228540,200\n228541,1849\n228543,56\n228544,422\n228545,151\n228546,200\n228547,83\n228548,356\n228548,611\n228549,1566\n228550,179170\n228551,843\n228552,1118\n228553,408\n228554,30\n228555,577\n228556,179170\n228557,2421\n228558,30\n228559,113156\n228560,634\n228561,228562\n228563,56\n228564,179170\n228565,422\n228566,2735\n228567,56\n228568,422\n228569,115659\n228570,179170\n228571,228572\n228573,467\n228574,228575\n228576,56\n228577,422\n228579,2421\n228580,179170\n228581,1749\n228582,1181\n228583,149\n228583,406\n228584,852\n228587,220816\n228588,1177\n228589,83\n228590,179170\n228591,360\n228592,502\n228592,704\n228592,760\n228592,1459\n228592,5679\n228592,13166\n228592,13207\n228592,22299\n228592,143262\n228592,158817\n228592,199078\n228592,200794\n228593,557\n228594,220816\n228595,4597\n228596,841\n228597,1949\n228598,1188\n228599,220816\n228600,72\n228601,79\n228602,228603\n228604,222\n228604,455\n228605,366\n228605,718\n228605,2606\n228606,220816\n228607,220816\n228608,228609\n228611,179170\n228612,994\n228613,1240\n228613,1949\n228614,1087\n228615,1326\n228616,1323\n228617,102\n228618,408\n228619,220816\n228620,314\n228620,852\n228621,422\n228622,56\n228623,885\n228623,13704\n228624,220816\n228625,188791\n228627,1749\n228628,179170\n228629,68\n228629,66297\n228630,682\n228630,72439\n228631,2244\n228632,1556\n228633,50\n228633,247\n228633,1181\n228634,736\n228635,179170\n228636,179170\n228637,252\n228640,179170\n228641,2367\n228642,30\n228643,179170\n228644,179170\n228645,1644\n228646,278\n228647,450\n228649,87\n228650,30\n228650,248\n228651,1531\n228653,298\n228654,557\n228655,264\n228656,366\n228657,1474\n228658,366\n228659,4\n228659,5\n228660,673\n228661,577\n228662,264\n228663,704\n228664,1449\n228666,179170\n228667,8270\n228668,2590\n228669,179170\n228670,1531\n228671,843\n228672,3695\n228673,891\n228674,8855\n228675,467\n228676,48\n228676,87\n228676,104\n228676,130\n228676,136\n228676,140\n228676,225\n228676,240\n228676,248\n228676,264\n228676,296\n228676,302\n228676,323\n228676,372\n228676,462\n228676,515\n228676,518\n228676,579\n228676,589\n228676,647\n228676,652\n228676,736\n228676,835\n228676,862\n228676,943\n228676,953\n228676,1001\n228676,1007\n228676,1052\n228676,1082\n228676,1085\n228676,1102\n228676,1127\n228676,1179\n228676,1289\n228676,1326\n228676,1332\n228676,1368\n228676,1452\n228676,1509\n228676,1579\n228676,1639\n228676,1893\n228676,2296\n228676,2312\n228676,3041\n228676,3585\n228676,3999\n228676,5405\n228676,5440\n228676,9030\n228676,14945\n228677,179170\n228678,640\n228679,1572\n228680,417\n228680,1368\n228681,72\n228682,920\n228683,1608\n228684,1359\n228685,179170\n228686,179170\n228687,171\n228688,192\n228689,298\n228690,636\n228691,119\n228692,285\n228693,184\n228694,179170\n228695,2116\n228696,220816\n228697,788\n228698,422\n228699,657\n228700,4597\n228701,220816\n228702,3623\n228703,406\n228704,1220\n228705,220816\n228706,179170\n228707,220816\n228708,179170\n228709,107\n228709,2209\n228710,7092\n228711,147\n228712,217\n228713,220816\n228714,491\n228715,491\n228716,1860\n228717,1858\n228718,50\n228719,158\n228721,56\n228722,422\n228723,918\n228724,137\n228725,704\n228726,577\n228727,452\n228728,138686\n228729,175\n228730,1359\n228731,900\n228732,1608\n228733,1132\n228734,1381\n228735,435\n228736,179170\n228737,179170\n228738,1265\n228738,1266\n228740,994\n228741,1417\n228742,30\n228742,200\n228743,843\n228744,179170\n228745,149\n228746,1227\n228746,86416\n228747,1132\n228748,781\n228749,217\n228749,222\n228749,349\n228749,455\n228749,760\n228749,5343\n228750,179170\n228751,278\n228752,3623\n228753,585\n228754,72\n228755,346\n228756,35486\n228758,8270\n228759,228760\n228761,269\n228762,179170\n228763,58\n228764,2266\n228765,113156\n228766,1571\n228768,171641\n228769,179170\n228770,2590\n228771,179170\n228772,2590\n228773,179170\n228774,333\n228774,1388\n228774,1531\n228774,1608\n228774,4455\n228774,15573\n228775,179170\n228776,1429\n228778,872\n228779,207\n228780,366\n228781,366\n228782,1707\n228783,668\n228784,1119\n228785,137\n228786,323\n228787,973\n228788,81\n228789,479\n228790,179170\n228791,228792\n228793,25344\n228794,634\n228795,72\n228796,278\n228797,1467\n228798,1773\n228799,455\n228800,2424\n228801,158\n228801,779\n228802,1871\n228803,663\n228804,228805\n228806,83\n228807,2421\n228808,13980\n228809,179170\n228810,179170\n228811,1143\n228812,228813\n228814,422\n228815,56\n228816,228817\n228818,160\n228818,4571\n228818,88820\n228819,422\n228820,56\n228821,179170\n228823,346\n228824,228825\n228826,179170\n228827,179170\n228828,1452\n228829,72\n228830,1175\n228831,2105\n228832,726\n228833,149\n228835,5469\n228836,206\n228838,4220\n228839,1359\n228841,1085\n228841,75912\n228842,1359\n228843,2371\n228844,240\n228845,72\n228847,179170\n228848,221828\n228849,596\n228850,577\n228851,491\n228851,1782\n228851,48505\n228852,2373\n228853,179170\n228854,240\n228854,592\n228854,1818\n228854,2620\n228855,192\n228855,1631\n228856,1188\n228857,179170\n228858,192\n228858,1623\n228859,1160\n228860,261\n228862,640\n228863,424\n228864,1644\n228865,149\n228865,406\n228866,640\n228870,640\n228873,1359\n228879,140\n228881,179170\n228882,273\n228884,41\n228885,147\n228886,1309\n228888,1033\n228889,636\n228890,35486\n228891,657\n228891,2266\n228893,72\n228895,179170\n228896,200\n228898,1235\n228898,1335\n228899,1983\n228899,111142\n228900,228901\n228902,2979\n228903,309\n228903,310\n228904,206\n228905,179170\n228906,3804\n228907,250\n228907,1684\n228908,147\n228908,118336\n228909,179170\n228910,206\n228910,911\n228911,1608\n228912,1132\n228913,1132\n228914,1608\n228915,994\n228916,907\n228917,358\n228918,292\n228920,1132\n228921,227669\n228922,920\n228923,179170\n228924,146\n228924,92476\n228925,647\n228926,344\n228927,24500\n228928,167\n228928,1149\n228929,6303\n228930,206\n228931,178\n228932,272\n228933,994\n228935,187176\n228936,1117\n228937,861\n228939,4237\n228939,182162\n228940,72\n228941,138686\n228942,175\n228944,994\n228945,775\n228945,1326\n228946,312\n228947,1132\n228948,868\n228949,1844\n228950,868\n228951,422\n228952,2224\n228952,2646\n228952,5326\n228953,422\n228954,422\n228955,2750\n228956,179170\n228957,4218\n228958,83\n228959,1359\n228961,200\n228962,422\n228963,422\n228964,422\n228965,422\n228966,422\n228967,56\n228968,422\n228969,422\n228970,366\n228971,422\n228972,422\n228973,422\n228974,994\n228975,3\n228975,34\n228975,35\n228975,87\n228975,104\n228975,134\n228975,135\n228975,137\n228975,167\n228975,209\n228975,217\n228975,251\n228975,252\n228975,254\n228975,264\n228975,289\n228975,333\n228975,364\n228975,392\n228975,497\n228975,516\n228975,589\n228975,644\n228975,779\n228975,850\n228975,877\n228975,907\n228975,1001\n228975,1010\n228975,1241\n228975,1265\n228975,1266\n228975,1522\n228975,1715\n228975,1818\n228975,1939\n228975,1955\n228975,2083\n228975,2105\n228975,2191\n228975,2620\n228975,2931\n228975,3328\n228975,3367\n228975,94134\n228976,217\n228977,3585\n228978,575\n228979,571\n228979,868\n228980,2224\n228981,79\n228982,147\n228983,605\n228984,56\n228985,422\n228986,8788\n228987,1052\n228988,500\n228989,1962\n228990,54\n228991,2775\n228992,117163\n228993,200\n228994,397\n228995,269\n228997,720\n228998,994\n228999,2480\n229000,2048\n229001,843\n229003,264\n229003,1381\n229003,1893\n229007,229008\n229009,994\n229010,272\n229011,83\n229012,151\n229013,302\n229014,3260\n229015,994\n229016,1359\n229017,781\n229018,1132\n229019,1769\n229019,1893\n229020,994\n229021,1860\n229022,1858\n229023,285\n229024,994\n229025,302\n229025,893\n229027,146\n229027,92476\n229028,1247\n229028,164572\n229029,1860\n229030,1858\n229031,179170\n229032,1860\n229033,1858\n229034,920\n229034,142870\n229035,15748\n229036,4237\n229036,182162\n229037,160\n229039,134\n229041,994\n229042,83\n229043,1858\n229044,1860\n229045,1010\n229046,312\n229049,56\n229050,422\n229051,179170\n229052,622\n229053,1436\n229054,1\n229055,30\n229056,302\n229057,179170\n229058,1644\n229059,1332\n229060,862\n229061,2506\n229062,4237\n229062,182162\n229064,1181\n229065,1181\n229066,1227\n229066,86416\n229067,4571\n229068,162599\n229069,55849\n229071,795\n229071,1133\n229071,1449\n229072,1130\n229073,2083\n229074,422\n229075,56\n229076,366\n229077,356\n229078,178\n229078,406\n229079,406\n229080,893\n229081,571\n229082,167\n229082,1522\n229082,207045\n229083,79\n229084,145240\n229085,55849\n229087,205627\n229088,749\n229089,66297\n229091,1893\n229092,225\n229093,106\n229093,149\n229094,309\n229094,310\n229095,34\n229095,35\n229097,859\n229098,211\n229101,167\n229102,200\n229103,994\n229104,422\n229106,56\n229107,577\n229108,1556\n229109,66297\n229110,663\n229111,3161\n229112,349\n229112,392\n229113,994\n229114,179170\n229115,44\n229116,406\n229117,1359\n229118,1326\n229119,718\n229120,229121\n229122,30\n229123,8270\n229124,202\n229124,925\n229125,1132\n229126,1181\n229127,4193\n229129,775\n229129,1619\n229129,2812\n229129,193129\n229131,179170\n229132,435\n229133,1417\n229134,2083\n229134,118336\n229135,360\n229136,55849\n229137,312\n229138,217\n229139,225\n229140,980\n229140,1429\n229141,994\n229142,179170\n229143,843\n229144,8192\n229145,994\n229146,918\n229147,994\n229148,515\n229149,455\n229150,1285\n229150,1287\n229151,1612\n229152,179170\n229153,138686\n229154,175\n229155,3413\n229156,30\n229156,217\n229157,48\n229158,349\n229159,1955\n229160,309\n229160,310\n229161,200\n229162,302\n229162,6303\n229163,1556\n229164,4597\n229165,389\n229166,83\n229166,217\n229166,536\n229166,13575\n229167,4760\n229168,6068\n229169,694\n229170,994\n229171,30\n229172,155473\n229173,179170\n229174,392\n229175,79\n229176,483\n229178,406\n229179,657\n229180,994\n229181,994\n229182,141912\n229183,179170\n229184,994\n229185,1096\n229186,72\n229187,994\n229188,779\n229189,179170\n229190,1551\n229191,200\n229192,56\n229193,422\n229195,162599\n229196,2590\n229197,620\n229197,4611\n229198,151\n229199,1287\n229200,179170\n229201,179170\n229202,1132\n229204,83\n229205,1419\n229206,588\n229206,590\n229207,220816\n229208,22\n229209,435\n229211,1220\n229212,1732\n229213,179170\n229214,1167\n229215,467\n229216,3246\n229217,7416\n229219,220816\n229220,485\n229221,1132\n229222,781\n229223,202\n229224,30\n229226,179170\n229227,861\n229228,1635\n229229,818\n229229,1631\n229230,167\n229230,1284\n229230,1544\n229231,179170\n229232,843\n229233,30\n229233,200\n229235,83\n229236,4220\n229237,996\n229238,1220\n229239,516\n229240,252\n229241,179170\n229242,273\n229243,779\n229244,179170\n229245,229246\n229247,220816\n229248,72\n229249,1220\n229250,516\n229251,252\n229252,1531\n229253,83\n229254,72\n229255,179170\n229256,30\n229257,536\n229258,72\n229259,35486\n229260,4611\n229261,179170\n229262,1707\n229263,229264\n229263,236272\n229265,179170\n229266,3258\n229267,920\n229268,1220\n229269,252\n229270,251\n229271,81\n229272,72\n229273,1644\n229274,30\n229276,151\n229277,23783\n229278,217\n229279,406\n229281,980\n229282,1326\n229283,102\n229284,1323\n229285,408\n229286,795\n229288,81\n229289,10\n229289,113156\n229290,346\n229291,30\n229292,1515\n229293,200\n229294,220816\n229295,30\n229296,83\n229296,2590\n229296,6068\n229297,179170\n229298,10\n229298,32\n229298,79\n229298,97\n229298,136\n229298,137\n229298,192\n229298,202\n229298,219\n229298,222\n229298,247\n229298,267\n229298,280\n229298,333\n229298,344\n229298,358\n229298,393\n229298,557\n229298,577\n229298,586\n229298,657\n229298,788\n229298,920\n229298,972\n229298,1058\n229298,1188\n229298,1436\n229298,1509\n229298,1531\n229298,1566\n229298,1653\n229298,2209\n229298,2574\n229298,3695\n229298,3846\n229298,4192\n229298,4545\n229298,6323\n229298,14352\n229298,25348\n229298,56150\n229298,101688\n229299,1381\n229300,1132\n229301,781\n229303,30\n229305,30\n229306,779\n229307,1860\n229308,1858\n229309,491\n229310,1082\n229311,1181\n229312,56\n229313,422\n229314,557\n229315,178\n229315,346\n229315,435\n229315,439\n229315,1033\n229315,1294\n229315,5212\n229316,640\n229317,713\n229318,1474\n229319,272\n229320,72\n229321,673\n229322,179170\n229323,7092\n229324,151\n229325,179170\n229326,151\n229327,302\n229328,1332\n229330,77\n229331,861\n229332,23783\n229334,72\n229335,1181\n229336,72\n229337,1132\n229338,147\n229339,72\n229340,83\n229341,217\n229342,1419\n229343,536\n229344,2671\n229345,1955\n229346,588\n229346,590\n229347,272\n229348,65\n229349,72\n229350,1014\n229351,1014\n229352,1014\n229354,1\n229355,72\n229356,1014\n229357,5366\n229358,45022\n229359,1014\n229360,229361\n229363,360\n229364,516\n229365,72\n229366,272\n229368,2744\n229369,278\n229370,5718\n229371,229372\n229373,79\n229374,220816\n229375,4597\n229376,220816\n229377,346\n229378,795\n229378,1118\n229378,1181\n229378,3804\n229378,4193\n229378,17245\n229378,125569\n229379,278\n229380,220816\n229381,330\n229382,450\n229383,536\n229384,1253\n229384,20813\n229385,364\n229385,1511\n229386,285\n229387,626\n229387,25348\n229388,589\n229389,44\n229390,2646\n229391,220816\n229392,2353\n229393,202\n229394,5101\n229395,220816\n229396,2620\n229397,503\n229397,704\n229398,147\n229399,2116\n229400,5265\n229401,220816\n229402,450\n229403,5101\n229404,220816\n229405,179170\n229406,1531\n229407,1014\n229408,202\n229409,217\n229410,389\n229411,1860\n229412,1858\n229413,220816\n229414,220816\n229415,158\n229416,346\n229417,179170\n229418,72\n229419,68509\n229420,4101\n229421,220816\n229422,1238\n229423,179170\n229425,1188\n229425,1267\n229425,1551\n229425,2367\n229425,2605\n229426,147\n229427,2421\n229428,949\n229429,1452\n229430,179170\n229431,779\n229431,1127\n229431,1893\n229432,1179\n229434,72\n229435,17590\n229436,14650\n229437,422\n229438,72\n229439,2590\n229440,72\n229441,2266\n229442,577\n229443,1\n229443,10\n229443,222\n229443,333\n229443,336\n229443,622\n229443,991\n229443,1118\n229443,1572\n229443,1623\n229443,1844\n229443,2073\n229443,5101\n229443,5265\n229443,5310\n229443,9030\n229443,142405\n229444,149\n229445,8270\n229446,8270\n229447,179170\n229448,220816\n229449,220816\n229450,220816\n229451,1363\n229452,450\n229453,179170\n229454,138686\n229455,175\n229456,179170\n229457,179170\n229458,72\n229459,72\n229460,179170\n229461,220816\n229462,179170\n229463,171641\n229464,781\n229465,1132\n229466,657\n229467,4597\n229468,179170\n229469,72\n229470,72\n229471,850\n229472,72\n229473,68\n229473,294\n229473,431\n229473,818\n229473,1462\n229473,1631\n229473,2620\n229473,2995\n229473,3135\n229473,8537\n229473,9015\n229473,9021\n229474,72\n229475,179170\n229476,72\n229477,149\n229478,1353\n229479,158\n229480,1773\n229481,366\n229482,167\n229483,422\n229484,422\n229485,422\n229486,422\n229487,422\n229488,422\n229489,422\n229490,422\n229491,1715\n229492,818\n229493,422\n229494,422\n229495,1007\n229496,422\n229497,422\n229498,30\n229499,1227\n229499,86416\n229500,8270\n229502,577\n229503,309\n229503,310\n229503,1052\n229503,2312\n229504,2590\n229505,1227\n229505,86416\n229506,179170\n229507,424\n229508,179170\n229509,5101\n229510,179170\n229511,179170\n229512,72\n229513,56\n229514,422\n229515,179170\n229516,1429\n229517,8270\n229518,179170\n229519,2590\n229520,4597\n229521,179170\n229522,1\n229523,493\n229523,704\n229524,72\n229525,72\n229526,207\n229527,179170\n229528,818\n229529,668\n229530,41\n229531,179170\n229532,179170\n229533,1181\n229534,179170\n229535,137\n229536,4455\n229537,179170\n229538,2367\n229539,179170\n229540,179170\n229541,269\n229542,1\n229543,920\n229544,179170\n229545,179170\n229546,919\n229547,72\n229548,151\n229549,179170\n229550,179170\n229551,8270\n229552,151\n229553,247\n229554,179170\n229555,179170\n229556,872\n229557,3297\n229558,179170\n229559,1085\n229560,868\n229561,33424\n229561,99287\n229562,2931\n229563,179170\n229564,1414\n229565,366\n229566,179170\n229568,229569\n229570,229569\n229571,229569\n229572,229569\n229573,30\n229574,1414\n229575,697\n229576,221737\n229577,1143\n229578,4597\n229579,1821\n229579,21736\n229581,302\n229582,862\n229584,1332\n229585,187176\n229587,124668\n229588,184\n229588,874\n229590,1326\n229591,192\n229592,760\n229593,167\n229594,1287\n229595,1287\n229597,872\n229598,200\n229599,1635\n229600,4411\n229601,17590\n229602,151\n229603,1132\n229604,781\n229605,872\n229606,1773\n229607,1345\n229608,872\n229609,3695\n229610,192\n229611,872\n229612,1556\n229613,827\n229614,640\n229615,640\n229616,179170\n229617,1556\n229618,79\n229619,72\n229622,35486\n229623,1531\n229624,3804\n229626,473\n229627,5101\n229628,56\n229629,422\n229631,301\n229631,968\n229631,1293\n229631,3809\n229631,80009\n229631,221828\n229631,226270\n229631,229747\n229631,231070\n229633,1677\n229635,1515\n229636,252\n229637,1132\n229638,781\n229639,83\n229640,36819\n229641,83\n229642,200\n229643,1844\n229644,160373\n229645,6682\n229646,200\n229647,138686\n229648,175\n229649,83\n229650,179170\n229651,360\n229652,328\n229653,663\n229654,920\n229655,1608\n229656,1132\n229658,1634\n229659,431\n229659,631\n229660,73570\n229661,10\n229661,994\n229662,179170\n229663,1087\n229664,1181\n229665,615\n229666,179170\n229668,179170\n229669,151\n229670,200\n229671,217\n229672,920\n229673,781\n229674,1132\n229675,63\n229675,97\n229675,516\n229676,41\n229677,3094\n229678,932\n229679,5034\n229681,31977\n229681,229682\n229681,254561\n229683,652\n229684,240\n229685,652\n229686,515\n229687,1893\n229688,1052\n229689,1052\n229691,229692\n229693,200\n229694,3623\n229695,3804\n229696,1132\n229697,781\n229698,328\n229699,994\n229700,79\n229701,994\n229702,668\n229703,1132\n229704,781\n229705,644\n229707,200\n229708,1127\n229709,2105\n229710,1392\n229712,1634\n229713,1381\n229714,222\n229715,781\n229716,1132\n229717,148742\n229719,3507\n229720,200\n229721,1858\n229722,1860\n229723,781\n229724,1132\n229725,41\n229726,781\n229727,1132\n229728,1860\n229729,1858\n229730,1132\n229731,781\n229732,56\n229733,422\n229734,2244\n229735,2244\n229736,217\n229737,1287\n229738,781\n229739,1132\n229740,202\n229741,781\n229742,1132\n229743,1238\n229744,2244\n229745,1590\n229746,911\n229749,781\n229750,1132\n229751,83\n229752,992\n229753,1452\n229754,222\n229754,590\n229754,1419\n229754,5343\n229755,4611\n229756,4611\n229757,781\n229758,1132\n229759,1227\n229759,86416\n229760,6955\n229762,1858\n229763,1860\n229764,2775\n229765,447\n229766,2460\n229767,422\n229768,56\n229769,1644\n229770,366\n229771,481\n229773,34\n229773,35\n229774,1132\n229775,229776\n229777,1132\n229778,781\n229779,1087\n229780,192\n229780,1089\n229781,179170\n229782,682\n229782,72439\n229784,657\n229785,1132\n229786,195\n229787,349\n229788,422\n229789,56\n229790,781\n229791,1132\n229792,138686\n229793,302\n229793,893\n229794,1566\n229796,697\n229798,1608\n229800,872\n229801,1132\n229802,781\n229804,83\n229805,3695\n229806,151\n229808,779\n229809,211\n229810,222\n229811,932\n229813,393\n229814,60576\n229815,1564\n229816,83\n229817,151\n229819,1181\n229820,30\n229821,1220\n229822,491\n229823,261\n229825,1181\n229826,302\n229827,811\n229828,358\n229829,1556\n229830,861\n229831,3695\n229832,5034\n229833,147\n229833,240174\n229834,1858\n229835,1860\n229837,285\n229838,83\n229839,162599\n229841,2775\n229842,447\n229843,862\n229844,3135\n229845,179170\n229846,1052\n229847,33611\n229848,179170\n229849,918\n229850,44\n229851,994\n229852,229853\n229854,310\n229854,3039\n229855,994\n229856,467\n229856,162599\n229857,179170\n229858,162599\n229859,726\n229860,1465\n229861,536\n229861,2784\n229863,138686\n229864,175\n229865,240\n229865,457\n229865,1459\n229865,1572\n229865,3385\n229865,63005\n229865,77808\n229865,84373\n229865,98227\n229865,164632\n229865,182162\n229865,234870\n229865,259601\n229866,843\n229867,875\n229868,35486\n229870,483\n229871,2244\n229872,156379\n229873,994\n229874,1\n229875,32\n229876,1014\n229877,142870\n229878,179170\n229879,994\n229880,142433\n229881,360\n229882,918\n229883,179170\n229884,83\n229885,179170\n229886,179170\n229887,30\n229888,1127\n229889,516\n229890,406\n229891,151\n229892,179170\n229894,13661\n229895,30236\n229896,162599\n229897,6068\n229898,127158\n229899,781\n229900,1132\n229901,179170\n229902,1782\n229903,515\n229904,179170\n229905,1220\n229906,200\n229907,1860\n229908,1858\n229909,872\n229910,622\n229911,862\n229912,179170\n229913,1\n229914,200\n229915,372\n229915,1511\n229915,3069\n229916,302\n229917,1860\n229918,1858\n229919,1556\n229920,179170\n229921,8714\n229922,1773\n229923,861\n229924,1858\n229925,1860\n229926,151\n229927,538\n229928,3623\n229929,302\n229930,1016\n229931,34\n229931,222\n229931,1718\n229931,4594\n229932,3538\n229933,640\n229935,875\n229936,640\n229937,56\n229938,422\n229939,5\n229939,2991\n229939,42220\n229940,1181\n229941,30\n229942,1181\n229943,818\n229944,1087\n229944,25348\n229945,1052\n229946,162599\n229947,707\n229948,56\n229949,422\n229951,1769\n229952,346\n229956,406\n229957,4\n229957,5\n229957,22\n229957,34\n229957,35\n229957,48\n229957,65\n229957,68\n229957,79\n229957,94\n229957,97\n229957,102\n229957,111\n229957,119\n229957,130\n229957,135\n229957,140\n229957,151\n229957,163\n229957,167\n229957,178\n229957,184\n229957,187\n229957,195\n229957,217\n229957,227\n229957,248\n229957,264\n229957,283\n229957,302\n229957,309\n229957,310\n229957,315\n229957,340\n229957,344\n229957,346\n229957,392\n229957,393\n229957,406\n229957,408\n229957,420\n229957,431\n229957,439\n229957,440\n229957,442\n229957,444\n229957,446\n229957,452\n229957,455\n229957,457\n229957,473\n229957,485\n229957,489\n229957,491\n229957,510\n229957,515\n229957,518\n229957,538\n229957,571\n229957,577\n229957,579\n229957,589\n229957,595\n229957,602\n229957,622\n229957,628\n229957,640\n229957,652\n229957,657\n229957,671\n229957,687\n229957,693\n229957,704\n229957,718\n229957,795\n229957,809\n229957,811\n229957,818\n229957,827\n229957,841\n229957,859\n229957,872\n229957,893\n229957,918\n229957,932\n229957,934\n229957,968\n229957,994\n229957,996\n229957,1001\n229957,1019\n229957,1033\n229957,1052\n229957,1058\n229957,1102\n229957,1113\n229957,1118\n229957,1122\n229957,1140\n229957,1177\n229957,1181\n229957,1188\n229957,1267\n229957,1282\n229957,1289\n229957,1294\n229957,1305\n229957,1323\n229957,1370\n229957,1381\n229957,1392\n229957,1400\n229957,1417\n229957,1434\n229957,1462\n229957,1509\n229957,1531\n229957,1556\n229957,1579\n229957,1590\n229957,1612\n229957,1635\n229957,1639\n229957,1644\n229957,1659\n229957,1677\n229957,1707\n229957,1715\n229957,1776\n229957,1796\n229957,1807\n229957,1818\n229957,1871\n229957,1877\n229957,1893\n229957,1962\n229957,1968\n229957,2017\n229957,2146\n229957,2209\n229957,2244\n229957,2260\n229957,2266\n229957,2334\n229957,2353\n229957,2367\n229957,2443\n229957,2574\n229957,2626\n229957,2775\n229957,2787\n229957,2979\n229957,3039\n229957,3041\n229957,3148\n229957,3193\n229957,3295\n229957,3345\n229957,3585\n229957,3695\n229957,3804\n229957,3999\n229957,4039\n229957,4066\n229957,4355\n229957,4411\n229957,4453\n229957,4678\n229957,4823\n229957,5213\n229957,5911\n229957,6119\n229957,6303\n229957,6789\n229957,6955\n229957,7117\n229957,7270\n229957,7768\n229957,8235\n229957,8270\n229957,8537\n229957,8541\n229957,8820\n229957,9018\n229957,9024\n229957,9028\n229957,9029\n229957,13345\n229957,13538\n229957,13910\n229957,14483\n229957,14945\n229957,16196\n229957,19005\n229957,20359\n229957,31122\n229957,31896\n229957,32475\n229957,36985\n229957,49057\n229957,54264\n229957,54272\n229957,54284\n229957,54362\n229957,67343\n229957,72764\n229957,87638\n229957,95642\n229957,127158\n229957,204214\n229958,99\n229959,1467\n229960,861\n229961,30\n229962,2373\n229963,240\n229963,289\n229963,301\n229963,714\n229963,1511\n229963,2205\n229963,2286\n229963,2620\n229963,3069\n229963,20359\n229963,33424\n229963,94134\n229964,113156\n229965,781\n229966,1132\n229967,88820\n229968,338\n229969,1722\n229970,88820\n229971,338\n229972,88820\n229973,179170\n229974,372\n229975,179170\n229976,1893\n229977,1052\n229978,1962\n229979,500\n229980,54\n229981,2775\n229982,1285\n229983,142870\n229984,1132\n229985,781\n229986,1688\n229988,30\n229989,200\n229990,781\n229991,1132\n229992,179170\n229993,450\n229995,222\n229996,179170\n229997,805\n229998,1220\n229999,516\n230000,252\n230001,1265\n230001,1266\n230002,160\n230003,179170\n230004,179170\n230005,743\n230006,2750\n230007,1181\n230008,1082\n230009,1326\n230010,408\n230011,102\n230012,1323\n230013,179170\n230014,179170\n230015,893\n230016,818\n230017,1571\n230018,179170\n230019,30\n230020,68\n230021,336\n230023,640\n230024,294\n230025,500\n230026,1052\n230027,2775\n230028,1962\n230029,54\n230030,567\n230030,1345\n230030,3756\n230031,220816\n230032,704\n230032,15748\n230032,22482\n230033,220816\n230034,346\n230035,220816\n230036,2646\n230037,278\n230038,83\n230039,346\n230040,179170\n230041,50\n230041,406\n230041,1837\n230041,5662\n230042,2923\n230043,220816\n230044,1014\n230045,7092\n230046,346\n230047,247\n230048,220816\n230049,5906\n230050,557\n230051,626\n230052,278\n230053,137\n230054,255\n230055,862\n230056,220816\n230057,106\n230058,179170\n230059,179170\n230060,179170\n230061,179170\n230062,1265\n230062,1266\n230063,179170\n230064,859\n230065,179170\n230066,220816\n230067,220816\n230068,2590\n230069,83\n230070,1551\n230071,6387\n230072,338\n230073,35486\n230074,338\n230075,657\n230075,213089\n230076,920\n230077,264\n230078,30\n230079,6387\n230080,6387\n230081,71\n230082,278\n230083,255\n230084,1089\n230084,1623\n230084,17590\n230084,122406\n230085,171\n230086,111\n230086,4771\n230087,1370\n230088,3115\n230089,230090\n230091,2590\n230092,1266\n230092,2931\n230093,220816\n230094,200\n230095,779\n230096,752\n230097,19010\n230098,360\n230099,230100\n230101,220816\n230103,21442\n230104,657\n230105,640\n230106,333\n230106,973\n230106,124668\n230106,171641\n230107,8854\n230108,332\n230109,2797\n230110,3331\n230111,3319\n230112,3328\n230113,147\n230114,652\n230114,1639\n230115,230116\n230117,489\n230118,83\n230119,30\n230121,1181\n230122,187\n230123,2334\n230124,450\n230125,775\n230125,3804\n230125,9017\n230126,726\n230127,805\n230128,2699\n230129,2048\n230130,138686\n230131,230132\n230133,175\n230134,843\n230135,179170\n230136,72\n230137,406\n230138,25344\n230139,455\n230140,450\n230141,130\n230142,56\n230143,422\n230144,285\n230145,220816\n230146,220816\n230147,14797\n230148,171\n230149,30\n230150,58\n230151,994\n230152,46\n230153,220816\n230154,338\n230155,250\n230155,1684\n230156,273\n230157,577\n230158,1181\n230160,516\n230161,779\n230162,424\n230163,151\n230163,717\n230163,2048\n230164,1227\n230164,86416\n230165,3447\n230166,285\n230167,179170\n230168,422\n230169,422\n230170,422\n230171,422\n230172,422\n230173,422\n230174,422\n230175,422\n230176,422\n230177,422\n230178,422\n230179,422\n230180,124668\n230181,72\n230182,30\n230184,285\n230185,240\n230186,179170\n230187,250\n230187,1684\n230188,285\n230189,1010\n230190,58\n230190,222\n230190,588\n230190,590\n230190,1140\n230190,1177\n230190,1419\n230190,142870\n230191,137\n230192,3297\n230193,30\n230194,179170\n230195,264\n230196,137\n230197,179170\n230198,30\n230199,179170\n230200,179170\n230201,151\n230202,431\n230202,631\n230202,862\n230202,994\n230202,1474\n230202,1789\n230202,44725\n230203,149\n230204,697\n230205,392\n230206,1265\n230206,1266\n230207,179170\n230208,179170\n230209,389\n230210,179170\n230211,83\n230212,179170\n230213,179170\n230214,151\n230215,1414\n230216,304\n230217,581\n230218,1381\n230219,640\n230220,99\n230221,918\n230222,151\n230223,34\n230223,35\n230223,217\n230223,222\n230223,657\n230223,1181\n230223,1210\n230223,2266\n230223,2421\n230223,6424\n230224,99\n230225,302\n230226,179170\n230227,278\n230227,455\n230227,1539\n230230,557\n230231,3769\n230232,366\n230233,2168\n230234,671\n230235,491\n230236,1087\n230236,25348\n230237,907\n230237,3370\n230238,1132\n230239,366\n230240,366\n230242,366\n230244,366\n230245,1\n230246,872\n230247,872\n230248,214734\n230249,1181\n230250,615\n230251,58\n230252,994\n230253,46\n230254,1893\n230254,75912\n230255,162599\n230256,647\n230257,146\n230257,92476\n230258,344\n230259,3999\n230260,179170\n230261,60576\n230262,35486\n230263,179170\n230264,14366\n230265,663\n230267,312\n230269,60576\n230270,8373\n230271,215874\n230272,273\n230273,640\n230274,640\n230275,640\n230276,60576\n230277,640\n230278,640\n230279,147\n230280,640\n230281,179170\n230282,79\n230284,60576\n230285,117\n230285,994\n230285,1116\n230285,2712\n230286,179170\n230288,179170\n230290,179170\n230291,60576\n230292,557\n230293,1368\n230294,79\n230296,972\n230297,422\n230298,56\n230299,106\n230300,420\n230301,35486\n230302,366\n230302,3804\n230303,187\n230304,11\n230305,148742\n230307,192\n230308,538\n230308,934\n230309,200\n230310,1425\n230311,179170\n230312,179170\n230313,230314\n230315,171\n230316,852\n230317,1803\n230318,179170\n230319,179170\n230320,240\n230321,1359\n230322,137\n230323,179170\n230324,179170\n230325,127158\n230326,179170\n230327,309\n230327,310\n230327,818\n230328,195\n230329,68\n230330,676\n230331,1707\n230332,3804\n230334,68\n230335,1359\n230336,146\n230336,92476\n230337,647\n230338,994\n230339,344\n230340,452\n230341,151\n230342,1655\n230343,200\n230345,179170\n230346,406\n230347,1326\n230348,920\n230349,333\n230350,497\n230351,162599\n230352,141912\n230353,652\n230354,1265\n230354,1266\n230355,1052\n230356,500\n230357,1962\n230358,54\n230359,2775\n230360,41\n230361,31073\n230362,875\n230363,447\n230364,2775\n230365,144962\n230366,66297\n230367,516\n230368,1274\n230369,56\n230370,422\n230371,287\n230372,932\n230373,179170\n230374,3094\n230375,79\n230376,9015\n230377,79\n230379,1119\n230379,6695\n230380,102560\n230381,640\n230382,3582\n230383,1556\n230385,72\n230386,240\n230388,1238\n230390,1132\n230391,781\n230392,1452\n230393,1644\n230395,217\n230397,781\n230398,1132\n230399,1805\n230399,2699\n230399,32475\n230400,143287\n230401,1\n230402,79\n230403,1400\n230404,56\n230405,422\n230406,489\n230407,138686\n230408,175\n230409,417\n230409,24926\n230410,647\n230411,1220\n230412,189303\n230413,83\n230414,372\n230415,30\n230415,200\n230418,179170\n230419,9457\n230420,3623\n230423,577\n230423,647\n230424,188791\n230429,179170\n230430,179170\n230431,422\n230432,56\n230433,1220\n230434,302\n230435,668\n230436,120\n230437,230438\n230439,10\n230440,462\n230441,50\n230442,81\n230444,462\n230445,462\n230446,462\n230447,462\n230448,462\n230449,1400\n230450,30\n230451,35486\n230452,2353\n230453,16687\n230454,178\n230454,439\n230456,111\n230456,289\n230456,1368\n230456,2286\n230456,94134\n230457,2750\n230459,3218\n230460,2620\n230461,536\n230463,1052\n230464,1962\n230465,500\n230466,54\n230467,2775\n230468,83\n230469,775\n230470,83\n230472,328\n230473,312\n230474,622\n230475,685\n230476,179170\n230478,852\n230479,852\n230481,3623\n230482,447\n230483,2775\n230484,41\n230485,1608\n230486,1132\n230487,138686\n230488,694\n230489,217\n230489,4637\n230490,302\n230491,852\n230492,3623\n230493,875\n230494,861\n230497,1070\n230498,1282\n230499,179170\n230500,1282\n230501,862\n230502,338\n230503,252\n230504,586\n230505,467\n230505,872\n230506,809\n230507,2168\n230508,668\n230511,230509\n230511,230517\n230521,56\n230522,147\n230523,1167\n230523,1436\n230523,2083\n230524,338\n230525,7360\n230526,973\n230526,1284\n230526,1381\n230526,1419\n230527,206\n230528,50\n230529,1511\n230529,3069\n230530,671\n230531,240\n230532,644\n230533,264\n230534,1860\n230535,1858\n230536,44\n230538,861\n230539,179170\n230540,222\n230542,515\n230543,230544\n230545,2379\n230546,3999\n230547,805\n230548,1033\n230549,289\n230549,94134\n230550,1509\n230550,1551\n230551,1220\n230552,805\n230553,1860\n230554,1858\n230555,1623\n230556,349\n230557,79\n230558,563\n230559,2979\n230560,19010\n230561,571\n230562,1425\n230562,102560\n230563,138686\n230564,202\n230565,175\n230566,179170\n230567,202\n230568,483\n230569,79\n230570,106\n230570,149\n230570,585\n230571,99\n230573,4260\n230574,179170\n230575,50\n230576,516\n230577,179170\n230578,179170\n230579,25348\n230579,101688\n230580,179170\n230581,1556\n230582,406\n230583,338\n230584,200\n230586,264\n230588,20\n230588,1179\n230589,147\n230589,163\n230589,305\n230589,671\n230589,911\n230589,1132\n230589,1201\n230589,1623\n230591,1238\n230591,182162\n230592,775\n230592,852\n230592,3804\n230593,994\n230594,179170\n230595,151\n230596,269\n230597,1132\n230598,781\n230599,44725\n230600,151\n230601,1858\n230602,1860\n230603,179170\n230605,1860\n230606,1858\n230607,389\n230608,179170\n230609,179170\n230610,107\n230611,151\n230612,406\n230613,251\n230614,200\n230615,264\n230615,491\n230615,515\n230616,9010\n230617,1235\n230617,1335\n230618,269\n230619,1132\n230620,781\n230621,563\n230622,302\n230624,206\n230624,1167\n230624,1400\n230624,2073\n230624,2146\n230624,3295\n230624,22727\n230624,99287\n230625,861\n230626,3367\n230627,141912\n230628,1434\n230629,485\n230631,220816\n230632,3\n230633,1132\n230634,781\n230636,269\n230638,302\n230639,344\n230640,179170\n230641,56\n230642,200\n230643,1132\n230644,781\n230645,4594\n230646,255\n230647,179170\n230648,302\n230649,179170\n230650,781\n230651,1132\n230652,179170\n230653,1132\n230654,781\n230655,450\n230656,781\n230657,1132\n230658,240\n230658,289\n230658,301\n230658,714\n230658,1511\n230658,2205\n230658,2286\n230658,2620\n230658,3069\n230658,20359\n230658,33424\n230658,94134\n230659,72\n230660,1326\n230661,408\n230662,102\n230663,1323\n230664,8788\n230665,68069\n230666,220816\n230667,536\n230668,13\n230669,7194\n230670,557\n230671,2867\n230671,2868\n230672,563\n230673,934\n230674,1381\n230675,250\n230675,1684\n230677,323\n230678,179170\n230680,885\n230680,13704\n230682,179170\n230683,41\n230685,179170\n230687,640\n230688,230689\n230690,657\n230690,968\n230691,230692\n230693,795\n230694,233\n230695,151\n230698,1220\n230699,516\n230700,252\n230701,2373\n230702,179170\n230703,1474\n230704,435\n230705,220816\n230706,99\n230707,7092\n230708,673\n230709,220816\n230710,179170\n230711,1220\n230712,252\n230713,516\n230714,30\n230715,179170\n230716,220816\n230717,4771\n230718,230719\n230720,3623\n230721,77\n230722,557\n230723,338\n230724,264\n230725,330\n230726,843\n230727,338\n230728,862\n230729,7416\n230730,192\n230730,1623\n230731,500\n230732,179170\n230733,1612\n230734,2205\n230734,33424\n230735,3804\n230736,694\n230737,141912\n230738,1085\n230739,220816\n230740,278\n230741,1188\n230741,142870\n230742,220816\n230743,2116\n230744,79\n230745,406\n230746,107\n230747,2671\n230748,13\n230748,140\n230748,1179\n230749,55849\n230750,230751\n230750,253044\n230752,1\n230753,179170\n230754,3297\n230755,55849\n230756,230757\n230758,479\n230758,1016\n230759,99\n230760,1359\n230761,247\n230762,1149\n230763,134\n230763,1235\n230764,285\n230765,435\n230766,230767\n230766,244933\n230768,346\n230769,841\n230770,6424\n230771,130\n230771,835\n230771,1007\n230771,1381\n230771,1452\n230771,1509\n230771,1551\n230771,1639\n230771,3041\n230771,5440\n230772,640\n230773,179170\n230774,220816\n230775,843\n230776,147\n230777,1785\n230778,1167\n230779,605\n230780,589\n230781,1782\n230782,1124\n230783,973\n230784,86\n230785,949\n230786,261\n230787,138686\n230788,175\n230789,805\n230790,510\n230791,30\n230792,107\n230793,220816\n230794,83\n230795,34\n230795,35\n230796,640\n230797,184\n230798,220816\n230799,841\n230800,38634\n230801,175\n230802,991\n230803,1368\n230804,1188\n230805,338\n230806,294\n230807,285\n230808,1305\n230809,1515\n230810,577\n230811,347\n230812,304\n230813,1722\n230814,5265\n230815,267\n230816,247\n230817,1\n230818,435\n230819,1511\n230819,3069\n230820,972\n230821,220816\n230822,843\n230823,273\n230823,422\n230824,138\n230825,220816\n230826,58\n230827,220816\n230828,2590\n230829,220816\n230830,1220\n230831,516\n230832,252\n230833,220816\n230834,267\n230835,195\n230836,220816\n230837,240\n230838,7117\n230839,220816\n230840,269\n230841,220816\n230842,200\n230843,137\n230844,850\n230845,795\n230846,5101\n230847,220816\n230848,72\n230849,3447\n230850,422\n230851,422\n230852,422\n230853,422\n230854,422\n230855,422\n230856,422\n230857,422\n230858,422\n230859,422\n230860,422\n230861,422\n230862,220816\n230863,2620\n230864,195\n230865,72\n230866,366\n230867,207\n230868,366\n230869,366\n230870,366\n230871,220816\n230872,179170\n230873,366\n230874,72\n230875,918\n230876,72\n230877,72\n230877,206\n230877,34580\n230878,389\n230879,2421\n230880,72\n230881,6323\n230882,1\n230883,179170\n230884,338\n230885,72\n230886,179170\n230887,72\n230888,72\n230889,72\n230890,1\n230891,72\n230892,872\n230893,1429\n230894,137\n230895,489\n230896,1381\n230897,2931\n230898,455\n230899,137\n230900,668\n230901,1033\n230902,68\n230902,7155\n230903,996\n230904,309\n230904,310\n230905,179170\n230906,22\n230907,497\n230908,2224\n230909,72\n230910,179170\n230911,2646\n230913,1143\n230914,206\n230915,3447\n230917,1087\n230918,497\n230920,230921\n230922,195\n230923,1247\n230923,164572\n230924,536\n230924,1608\n230924,2931\n230926,1612\n230927,781\n230928,1132\n230929,397\n230930,781\n230931,1132\n230932,79\n230933,55849\n230935,149\n230936,557\n230937,171641\n230938,781\n230939,1132\n230940,79\n230941,179170\n230942,6303\n230943,115659\n230944,179170\n230945,3999\n230946,18726\n230947,179170\n230949,3115\n230951,781\n230952,1132\n230953,30\n230954,1181\n230955,200\n230956,366\n230957,83\n230958,35486\n230959,179170\n230960,2668\n230961,200\n230962,577\n230963,138686\n230964,175\n230965,255\n230967,195\n230968,671\n230969,781\n230970,1132\n230971,781\n230972,1132\n230973,230974\n230975,4823\n230976,1559\n230977,269\n230978,1849\n230979,179170\n230980,1181\n230981,781\n230982,1132\n230983,920\n230984,346\n230986,1\n230987,230988\n230989,179170\n230990,179170\n230991,435\n230992,179170\n230993,179170\n230994,2224\n230995,19010\n230996,3623\n230997,536\n230999,1132\n231000,781\n231001,1294\n231002,147191\n231003,50\n231003,63\n231003,147\n231003,158\n231003,178\n231003,192\n231003,195\n231003,269\n231003,272\n231003,393\n231003,406\n231003,435\n231003,516\n231003,586\n231003,620\n231003,779\n231003,980\n231003,1175\n231003,1247\n231003,1294\n231003,1388\n231003,1531\n231003,1541\n231003,1821\n231003,3989\n231003,4192\n231003,4193\n231003,4455\n231003,4545\n231003,6119\n231003,8907\n231003,21736\n231003,56150\n231003,164572\n231004,3135\n231006,292\n231007,442\n231009,4193\n231010,179170\n231011,292\n231012,179170\n231013,3094\n231014,178\n231014,186\n231014,192\n231014,366\n231014,500\n231014,510\n231014,1118\n231014,1181\n231014,2480\n231014,3370\n231015,58\n231016,1274\n231017,932\n231018,3623\n231020,312\n231021,200\n231022,138686\n231023,175\n231024,577\n231024,693\n231024,726\n231024,859\n231024,1070\n231024,1105\n231025,1132\n231026,254\n231026,503\n231026,704\n231027,292\n231028,649\n231028,1132\n231029,862\n231031,1238\n231032,949\n231033,225\n231033,1368\n231033,5591\n231033,6059\n231034,200\n231034,248\n231035,72\n231036,3447\n231038,647\n231039,344\n231040,146\n231040,92476\n231041,1452\n231042,2671\n231043,743\n231044,666\n231044,58135\n231044,219372\n231045,264\n231046,447\n231047,2775\n231048,920\n231049,77\n231050,1118\n231051,217\n231052,79\n231052,337\n231054,563\n231055,179170\n231056,447\n231057,2775\n231059,111\n231060,2105\n231061,3182\n231062,217\n231063,577\n231063,788\n231064,151\n231065,179170\n231066,138686\n231067,175\n231068,227061\n231069,996\n231070,615\n231070,1300\n231070,1454\n231070,3207\n231072,1119\n231072,1775\n231072,4222\n231072,178576\n231072,185877\n231074,809\n231075,30\n231076,473\n231077,333\n231078,781\n231079,1132\n231080,7117\n231081,447\n231082,2775\n231083,79\n231084,2979\n231085,592\n231086,179170\n231087,1849\n231088,1132\n231089,1608\n231090,120\n231091,473\n231092,3695\n231093,3695\n231094,809\n231094,19010\n231095,272\n231096,491\n231097,333\n231097,1181\n231098,160\n231099,30\n231099,99807\n231099,198024\n231100,292\n231101,292\n231102,1893\n231103,3769\n231106,1893\n231107,202\n231108,1707\n231109,179170\n231110,179170\n231112,19010\n231113,589\n231114,2209\n231115,258\n231116,19010\n231117,179170\n231118,491\n231119,1893\n231120,7698\n231121,1266\n231121,5714\n231122,179170\n231123,54\n231124,301\n231124,968\n231124,1782\n231126,8270\n231127,1707\n231129,592\n231130,209\n231130,302\n231132,4455\n231132,187176\n231133,1181\n231134,55849\n231135,592\n231136,592\n231137,55849\n231138,1274\n231138,7698\n231139,775\n231140,592\n231141,592\n231142,312\n231143,292\n231144,366\n231146,932\n231147,3623\n231148,592\n231149,261\n231149,694\n231149,697\n231149,1419\n231149,1769\n231150,179170\n231151,56\n231152,422\n231153,473\n231154,179170\n231155,3804\n231156,918\n231157,119\n231157,364\n231157,372\n231157,417\n231157,455\n231157,626\n231157,805\n231157,972\n231157,1019\n231157,1465\n231157,1801\n231157,2266\n231157,2434\n231157,2590\n231157,4172\n231158,179170\n231159,433\n231160,44\n231161,138686\n231162,515\n231163,175\n231164,264\n231165,622\n231166,179170\n231167,455\n231168,206\n231169,2421\n231170,179170\n231171,760\n231172,32751\n231173,255\n231174,179170\n231175,1085\n231175,3623\n231176,557\n231177,30\n231178,1085\n231180,30\n231181,592\n231182,1608\n231183,1132\n231184,447\n231185,140\n231186,2775\n231187,179170\n231188,179170\n231189,6119\n231190,162599\n231191,1749\n231192,30\n231192,328\n231192,1179\n231193,179170\n231194,264\n231195,1119\n231197,422\n231198,1160\n231199,231200\n231201,231200\n231202,231200\n231203,918\n231204,179170\n231205,179170\n231206,151\n231207,151\n231208,422\n231209,56\n231210,2173\n231212,1274\n231213,34\n231214,2083\n231215,179170\n231216,217\n231217,179170\n231218,1749\n231220,179170\n231221,3724\n231222,932\n231223,179170\n231224,3623\n231225,366\n231226,743\n231227,179170\n231228,231213\n231229,188791\n231230,55849\n231231,1452\n231232,7652\n231233,192\n231233,269\n231234,30\n231235,1860\n231236,1858\n231237,1298\n231238,1927\n231239,264\n231239,2083\n231239,5440\n231240,3148\n231241,1\n231242,1805\n231243,4571\n231244,30\n231245,138\n231246,865\n231247,557\n231248,137\n231249,88820\n231250,50\n231250,79\n231250,147\n231250,158\n231250,333\n231250,336\n231250,406\n231250,620\n231250,779\n231250,1163\n231250,1181\n231250,1425\n231250,1515\n231250,4193\n231250,5726\n231250,8055\n231250,240174\n231251,179170\n231252,920\n231253,179170\n231254,231255\n231256,818\n231257,179170\n231259,304\n231260,83\n231261,1474\n231262,1122\n231263,2590\n231264,389\n231265,1181\n231266,1220\n231267,516\n231268,252\n231269,34\n231269,35\n231270,1572\n231271,3999\n231272,313\n231273,1551\n231274,918\n231275,231276\n231277,231276\n231278,1644\n231279,200\n231280,184\n231281,83\n231282,179170\n231283,179170\n231284,1181\n231285,179170\n231286,557\n231287,1893\n231288,83\n231289,1274\n231290,1132\n231291,1608\n231292,920\n231293,1326\n231294,102\n231295,408\n231296,1323\n231297,111\n231297,4771\n231298,1\n231299,1465\n231300,7092\n231301,8270\n231302,151\n231303,4192\n231303,4193\n231304,8270\n231305,2373\n231306,389\n231307,1181\n231308,2244\n231309,120\n231310,332\n231311,30\n231312,220816\n231313,586\n231313,1243\n231315,220816\n231316,179170\n231317,596\n231318,596\n231319,87\n231320,994\n231321,994\n231322,4597\n231323,994\n231324,278\n231325,809\n231326,231327\n231328,146\n231328,92476\n231329,9026\n231330,250\n231330,1684\n231331,285\n231332,285\n231333,250\n231333,1684\n231334,255\n231335,179170\n231336,1359\n231337,30\n231338,30\n231339,1298\n231340,86832\n231341,2735\n231342,106\n231342,337\n231343,179170\n231344,220816\n231345,640\n231346,872\n231347,1243\n231348,949\n231349,2048\n231350,179170\n231351,79\n231352,179170\n231353,147\n231354,30\n231355,255\n231356,220816\n231357,8270\n231358,22\n231359,202\n231360,2590\n231361,366\n231362,217\n231363,240\n231364,34\n231364,35\n231364,222\n231364,283\n231364,389\n231364,536\n231364,657\n231364,781\n231364,1019\n231364,1072\n231364,1274\n231364,1467\n231364,1539\n231364,1718\n231364,1871\n231364,1881\n231364,2266\n231364,2784\n231364,4594\n231364,5976\n231364,6789\n231364,6888\n231364,13575\n231364,29475\n231365,34\n231365,35\n231365,455\n231365,536\n231365,1072\n231366,422\n231367,422\n231368,422\n231369,422\n231370,422\n231371,422\n231372,422\n231373,422\n231374,422\n231375,72\n231376,77\n231376,269\n231377,151\n231378,231379\n231378,264983\n231380,220816\n231381,4691\n231382,536\n231382,1893\n231382,20359\n231383,220816\n231384,1227\n231384,86416\n231385,231386\n231387,483\n231389,557\n231390,592\n231391,179170\n231392,918\n231393,225\n231394,151\n231395,726\n231396,231397\n231398,1085\n231399,1368\n231400,1544\n231401,179170\n231402,862\n231403,72\n231404,8884\n231405,1634\n231406,220816\n231407,1085\n231408,149\n231409,8270\n231410,179170\n231411,1241\n231412,302\n231412,1836\n231413,953\n231414,640\n231415,72\n231416,366\n231417,72\n231418,366\n231419,366\n231420,366\n231421,366\n231422,366\n231423,366\n231424,366\n231425,366\n231426,366\n231427,366\n231428,859\n231429,179170\n231430,640\n231431,179170\n231432,1313\n231433,663\n231434,231435\n231436,586\n231436,1370\n231436,2782\n231436,127158\n231437,491\n231438,4597\n231439,104\n231441,179170\n231442,35486\n231443,491\n231444,1010\n231445,406\n231446,450\n231448,473\n231449,640\n231450,417\n231450,592\n231450,3260\n231451,994\n231452,1955\n231452,3135\n231452,3328\n231453,72\n231454,7572\n231456,8788\n231457,72\n231458,8991\n231459,485\n231460,298\n231461,2574\n231462,1381\n231463,83\n231464,72\n231465,1381\n231466,151\n231467,13136\n231468,179170\n231469,240\n231469,298\n231469,372\n231469,694\n231469,862\n231469,932\n231469,1001\n231469,1010\n231469,1085\n231469,1309\n231469,1326\n231469,1462\n231469,1522\n231469,1564\n231469,1635\n231469,1837\n231469,1955\n231469,2296\n231469,2512\n231469,2620\n231469,8537\n231470,30\n231472,79\n231473,918\n231474,349\n231475,1402\n231476,535\n231477,179170\n231478,15573\n231479,2371\n231480,1282\n231482,231483\n231484,285\n231485,179170\n231486,795\n231487,4192\n231487,4193\n231489,225\n231490,4611\n231491,30\n231492,1201\n231493,932\n231494,422\n231495,56\n231496,2506\n231497,231498\n231499,3193\n231500,54\n231501,500\n231502,1052\n231503,2775\n231504,1962\n231505,500\n231506,2775\n231507,1052\n231508,54\n231509,1962\n231510,779\n231511,1220\n231512,516\n231513,252\n231514,805\n231515,211\n231515,4193\n231516,255\n231517,56\n231518,422\n231519,17309\n231520,875\n231521,9029\n231522,254\n231523,934\n231524,1\n231525,918\n231526,269\n231527,269\n231528,3345\n231529,875\n231530,485\n231531,298\n231532,179170\n231533,1359\n231534,4597\n231535,56\n231536,422\n231537,949\n231538,21442\n231539,179170\n231540,4597\n231541,920\n231542,86\n231543,485\n231544,298\n231545,1707\n231546,781\n231547,1132\n231549,931\n231550,994\n231551,179170\n231552,83\n231553,994\n231554,1479\n231556,1132\n231557,1608\n231558,390\n231559,179170\n231560,179170\n231561,86416\n231562,994\n231563,179170\n231564,220816\n231565,179170\n231566,994\n231567,220816\n231568,179170\n231569,179170\n231570,220816\n231572,220816\n231573,994\n231574,220816\n231575,220816\n231576,220816\n231577,994\n231578,179170\n231579,220816\n231580,179170\n231581,220816\n231582,485\n231583,298\n231584,220816\n231585,220816\n231586,220816\n231587,220816\n231588,220816\n231589,1381\n231590,3804\n231591,179170\n231592,220816\n231593,220816\n231594,231595\n231596,220816\n231597,273\n231598,220816\n231599,220816\n231600,56\n231601,422\n231602,220816\n231603,1849\n231604,220816\n231605,179170\n231606,231607\n231608,220816\n231609,220816\n231610,8270\n231611,195\n231612,1773\n231613,535\n231614,326\n231615,179170\n231616,483\n231617,179170\n231618,366\n231619,366\n231620,366\n231621,366\n231622,366\n231623,366\n231624,231625\n231626,1181\n231627,179170\n231628,275\n231631,30\n231632,179170\n231633,1241\n231634,113156\n231635,115659\n231636,83\n231637,7416\n231638,1227\n231638,86416\n231639,179170\n231640,179170\n231641,781\n231642,179170\n231643,179170\n231644,179170\n231645,1227\n231645,86416\n231646,2995\n231647,179170\n231648,1010\n231649,107\n231650,2416\n231650,2417\n231651,292\n231652,338\n231653,298\n231654,1133\n231655,3538\n231656,206\n231657,10\n231658,505\n231660,491\n231661,179170\n231663,147\n231664,35486\n231665,567\n231665,1345\n231665,3756\n231666,231667\n231668,298\n231669,485\n231671,310\n231672,200\n231673,328\n231674,231675\n231676,779\n231677,1181\n231678,146280\n231678,159365\n231679,592\n231680,491\n231681,1227\n231681,86416\n231682,231683\n231684,1608\n231685,23437\n231686,355\n231687,151\n231688,1227\n231688,86416\n231689,1531\n231690,994\n231691,111\n231692,4597\n231693,332\n231694,231695\n231696,55849\n231698,136072\n231699,483\n231700,1381\n231701,1531\n231701,3246\n231702,516\n231703,17772\n231704,1381\n231705,179170\n231706,447\n231707,491\n231708,179170\n231709,485\n231710,1634\n231711,328\n231712,589\n231713,932\n231714,298\n231714,534\n231714,694\n231714,2296\n231714,3623\n231714,3695\n231714,7194\n231715,167\n231715,602\n231715,1284\n231715,1544\n231715,2083\n231715,2372\n231715,5301\n231715,6798\n231715,7744\n231715,13252\n231715,124847\n231715,146368\n231715,184373\n231715,221176\n231715,248496\n231715,251289\n231715,258146\n231715,258381\n231715,258388\n231715,264043\n231716,179170\n231717,994\n231718,179170\n231720,2296\n231721,663\n231722,231723\n231724,255\n231725,447\n231726,2775\n231727,420\n231728,1955\n231729,1707\n231730,994\n231731,918\n231732,179170\n231733,360\n231734,55849\n231736,179170\n231737,179170\n231738,3370\n231738,14453\n231739,1655\n231740,1085\n231740,2089\n231740,2940\n231740,178576\n231741,2156\n231741,4571\n231742,994\n231743,497\n231746,79\n231747,676\n231748,151\n231749,452\n231750,179170\n231751,875\n231752,179170\n231753,151\n231755,138686\n231756,175\n231757,994\n231758,4192\n231758,4193\n231759,479\n231760,1181\n231761,994\n231762,1368\n231763,162599\n231764,21944\n231765,4\n231765,5\n231765,59\n231765,60\n231765,114\n231765,115\n231765,116\n231765,117\n231765,250\n231765,430\n231765,885\n231765,994\n231765,1235\n231765,1252\n231765,1253\n231765,1335\n231765,1684\n231765,2087\n231765,2089\n231765,2940\n231765,3561\n231765,3794\n231765,9537\n231765,9539\n231765,13704\n231765,54870\n231766,179170\n231767,30\n231768,179170\n231769,179170\n231770,994\n231771,179170\n231772,179170\n231773,1238\n231774,15748\n231775,179170\n231776,3079\n231778,22293\n231779,30\n231780,631\n231781,179170\n231782,3538\n231783,179170\n231784,179170\n231785,647\n231786,179170\n231787,179170\n231788,479\n231788,682\n231788,72439\n231789,179170\n231790,111\n231790,323\n231790,388\n231790,623\n231790,779\n231790,949\n231790,1072\n231790,1240\n231790,1465\n231790,1927\n231790,2045\n231790,3135\n231790,4549\n231790,14126\n231791,30\n231792,30\n231793,557\n231794,557\n231795,557\n231796,30\n231797,269\n231798,30\n231799,731\n231800,99\n231801,30\n231802,349\n231802,509\n231803,1220\n231804,211\n231805,30\n231806,30\n231807,994\n231808,2699\n231809,30\n231810,30\n231811,1773\n231812,30\n231813,202\n231813,180487\n231815,1181\n231816,30\n231820,231821\n231822,252\n231823,285\n231824,30\n231825,3623\n231826,179170\n231827,862\n231828,818\n231830,231831\n231830,233525\n231832,934\n231834,1773\n231838,441\n231838,1432\n231839,179170\n231840,289\n231840,372\n231840,417\n231840,1085\n231840,2812\n231840,94134\n231840,101935\n231841,179170\n231842,231843\n231844,1882\n231845,596\n231847,4597\n231848,99\n231849,779\n231850,138686\n231851,175\n231852,231853\n231854,273\n231855,918\n231856,2617\n231857,859\n231858,1796\n231859,422\n231860,56\n231861,65\n231862,4220\n231863,269\n231864,577\n231865,255\n231866,179170\n231867,30\n231868,179170\n231869,200\n231870,589\n231871,493\n231872,557\n231873,142870\n231874,231875\n231876,20813\n231877,366\n231878,366\n231879,366\n231880,366\n231881,366\n231882,366\n231883,366\n231884,366\n231885,179170\n231886,366\n231887,366\n231888,366\n231889,366\n231890,1294\n231891,433\n231892,255\n231893,406\n231893,779\n231893,1247\n231893,1515\n231893,164572\n231894,179170\n231895,231896\n231897,142473\n231898,292\n231899,8270\n231900,1655\n231901,294\n231902,452\n231903,296\n231904,298\n231905,676\n231906,497\n231908,1659\n231909,644\n231910,30\n231911,240\n231912,3447\n231913,1227\n231913,86416\n231914,179170\n231915,179170\n231916,179170\n231918,151\n231919,907\n231920,301\n231921,179170\n231922,3413\n231923,1564\n231924,137\n231925,1414\n231925,72439\n231926,94\n231926,536\n231926,92476\n231927,907\n231927,1462\n231928,364\n231929,200\n231930,1844\n231931,433\n231932,179170\n231933,167\n231934,79\n231935,7358\n231935,7363\n231937,2460\n231938,872\n231940,206\n231941,88820\n231942,4805\n231943,440\n231944,640\n231945,302\n231946,640\n231947,640\n231948,640\n231949,269\n231950,135\n231951,640\n231952,640\n231953,184\n231954,332\n231955,893\n231956,885\n231956,13704\n231957,1860\n231959,151\n231960,422\n231962,422\n231963,422\n231964,422\n231965,422\n231966,30\n231967,422\n231968,422\n231969,422\n231970,422\n231971,422\n231972,22\n231973,422\n231974,35486\n231975,422\n231976,1287\n231977,63\n231978,56\n231978,106\n231978,149\n231978,192\n231978,406\n231978,422\n231978,1181\n231978,1425\n231978,1515\n231979,56\n231980,422\n231981,137\n231982,83\n231983,333\n231984,1359\n231985,4672\n231986,920\n231987,115659\n231988,4672\n231989,171641\n231990,920\n231991,200\n231992,3999\n231993,275\n231994,818\n231995,2205\n231995,33424\n231996,2205\n231996,33424\n231997,136\n231998,115\n232000,264\n232001,187176\n232002,5405\n232003,994\n232004,1379\n232005,1860\n232006,1238\n232007,1511\n232007,3069\n232008,500\n232009,1962\n232010,1052\n232011,54\n232012,2775\n232013,1452\n232014,366\n232015,1511\n232015,3069\n232017,292\n232018,932\n232019,179170\n232020,117163\n232021,668\n232022,179170\n232023,408\n232024,818\n232025,1151\n232027,232028\n232029,1\n232030,671\n232031,1282\n232032,148742\n232033,1860\n232034,1858\n232035,5405\n232038,491\n232039,217\n232041,1203\n232042,292\n232044,392\n232044,1019\n232045,1860\n232046,1858\n232047,1381\n232048,994\n232049,30\n232050,285\n232050,516\n232050,843\n232050,1151\n232050,3507\n232051,838\n232052,1359\n232053,784\n232053,1052\n232054,215874\n232055,818\n232056,120\n232057,187176\n232058,83\n232059,467\n232060,640\n232062,1082\n232064,2620\n232068,1082\n232069,535\n232070,1082\n232074,41\n232076,1082\n232077,1085\n232077,1871\n232077,8788\n232077,29253\n232077,211889\n232078,994\n232079,1436\n232080,843\n232081,304\n232082,1151\n232083,392\n232084,6638\n232085,328\n232086,179170\n232087,211\n232088,1860\n232089,1858\n232090,1274\n232091,1858\n232092,1860\n232093,3258\n232094,1181\n232095,264\n232095,149534\n232096,447\n232097,2775\n232098,442\n232098,1140\n232099,1860\n232100,1858\n232101,232102\n232103,1179\n232105,328\n232106,818\n232107,1860\n232108,1858\n232109,255\n232110,232111\n232113,179170\n232115,1849\n232116,151\n232117,994\n232119,481\n232120,500\n232121,54\n232122,1052\n232123,2775\n232124,1962\n232125,211\n232127,1381\n232128,1893\n232129,1860\n232130,1858\n232131,516\n232132,328\n232133,994\n232134,1858\n232135,1860\n232136,392\n232137,7416\n232139,1282\n232139,1882\n232140,302\n232141,30\n232142,200\n232143,301\n232144,577\n232145,15573\n232146,1224\n232147,1458\n232149,195\n232150,7698\n232151,1608\n232153,3161\n232154,179170\n232156,784\n232156,1085\n232156,28832\n232156,75912\n232156,103860\n232156,232872\n232157,267\n232158,1381\n232160,338\n232161,835\n232162,1370\n232163,2590\n232165,1849\n232166,10\n232167,379\n232168,2286\n232169,424\n232170,151\n232171,147\n232172,1789\n232173,207\n232173,358\n232173,366\n232173,1052\n232173,1252\n232173,1253\n232173,1319\n232173,1571\n232173,1634\n232173,2424\n232173,2620\n232173,2868\n232174,179170\n232175,968\n232176,184\n232178,2421\n232179,4260\n232179,143287\n232180,220816\n232181,79\n232182,422\n232183,200\n232184,1509\n232185,366\n232186,2421\n232187,44\n232188,326\n232189,220816\n232190,247\n232191,5265\n232192,147\n232192,149\n232192,158\n232192,406\n232192,1425\n232192,102560\n232193,272\n232194,220816\n232195,2373\n232196,4192\n232196,4193\n232197,671\n232198,918\n232199,24505\n232200,220816\n232201,1082\n232202,207\n232202,264\n232202,1381\n232203,433\n232204,240\n232205,479\n232206,1860\n232207,1858\n232208,433\n232209,217\n232209,1417\n232210,406\n232211,1608\n232212,1132\n232213,557\n232214,605\n232215,217\n232215,1417\n232216,7698\n232217,346\n232217,538\n232217,1298\n232221,875\n232222,518\n232222,1326\n232223,28130\n232224,138686\n232225,175\n232227,875\n232228,4237\n232228,182162\n232231,232232\n232233,515\n232235,1284\n232239,151\n232239,192\n232239,309\n232239,310\n232239,577\n232239,1167\n232239,1400\n232240,30\n232241,392\n232242,1014\n232243,1014\n232244,1014\n232245,2421\n232246,232247\n232248,918\n232249,19010\n232250,1949\n232251,4597\n232252,1118\n232253,30\n232254,918\n232255,4223\n232256,435\n232257,56\n232257,149\n232257,406\n232258,79\n232259,1127\n232260,252\n232261,577\n232262,1151\n232263,2421\n232264,83\n232265,255\n232266,733\n232267,1010\n232268,83\n232268,119\n232268,347\n232268,364\n232268,372\n232268,389\n232268,417\n232268,455\n232268,525\n232268,626\n232268,795\n232268,805\n232268,907\n232268,972\n232268,1019\n232268,1085\n232268,1274\n232268,1363\n232268,1465\n232268,1467\n232268,1718\n232268,1801\n232268,1881\n232268,2266\n232268,2286\n232268,2434\n232268,2553\n232268,2590\n232268,2646\n232268,4172\n232268,13575\n232269,151\n232270,4192\n232270,4193\n232271,433\n232272,30\n232273,187\n232275,255\n232276,1522\n232277,1014\n232278,220816\n232279,1014\n232280,30\n232281,9010\n232282,30\n232283,261\n232283,6506\n232284,707\n232285,301\n232285,459\n232285,862\n232285,907\n232285,968\n232285,1010\n232285,1544\n232285,1837\n232285,1955\n232285,20359\n232285,188791\n232286,289\n232286,94134\n232288,439\n232289,640\n232290,10\n232291,1227\n232291,86416\n232292,4597\n232293,918\n232294,55849\n232295,30\n232296,68\n232297,557\n232298,1769\n232299,30\n232300,134\n232301,1860\n232302,1858\n232303,4192\n232303,4193\n232304,179170\n232305,192\n232305,217\n232305,516\n232305,1181\n232306,3474\n232307,1844\n232308,557\n232309,417\n232310,1860\n232311,1858\n232312,30\n232313,586\n232314,278\n232315,1085\n232316,1556\n232317,179170\n232318,392\n232319,179170\n232320,30\n232321,179170\n232322,527\n232322,743\n232323,179170\n232324,232325\n232326,30\n232327,179170\n232328,30\n232329,179170\n232330,516\n232331,158\n232332,483\n232333,179170\n232334,35486\n232335,250\n232335,1684\n232336,1132\n232337,781\n232338,8854\n232339,113156\n232340,14231\n232341,3\n232342,179170\n232343,179170\n232344,932\n232345,6955\n232346,358\n232347,309\n232347,310\n232348,366\n232349,30\n232350,358\n232351,151\n232353,668\n232354,358\n232355,4504\n232356,877\n232357,179170\n232358,1796\n232359,273\n232360,1860\n232361,1858\n232362,30\n232363,30\n232364,1893\n232364,2626\n232365,19010\n232366,179170\n232367,151\n232368,7092\n232369,1860\n232370,4594\n232371,1608\n232372,1465\n232373,1240\n232374,151\n232375,1220\n232376,6323\n232377,671\n232378,24763\n232379,994\n232380,179170\n232381,20359\n232382,392\n232384,1181\n232385,5101\n232386,994\n232388,30\n232389,179170\n232390,60576\n232391,179170\n232392,278\n232393,994\n232394,994\n232395,179170\n232396,994\n232397,99\n232398,63\n232399,179170\n232400,1368\n232401,113156\n232402,278\n232403,232404\n232405,536\n232406,83\n232407,1860\n232408,1858\n232409,99\n232410,179170\n232411,602\n232412,217\n232413,120\n232414,30\n232415,107\n232416,147\n232417,138686\n232418,175\n232419,5310\n232420,779\n232421,779\n232422,179170\n232423,15\n232424,525\n232425,217\n232426,1309\n232427,179170\n232428,4260\n232429,1285\n232430,151\n232432,179170\n232433,631\n232434,158\n232434,192\n232435,779\n232436,294\n232437,1381\n232438,179170\n232440,1962\n232441,220816\n232442,179170\n232443,179170\n232444,137\n232445,179170\n232446,920\n232447,179170\n232448,179170\n232449,232450\n232451,450\n232452,1390\n232453,424\n232454,179170\n232455,179170\n232456,809\n232457,30\n232458,179170\n232459,30\n232460,226420\n232462,333\n232463,220816\n232464,179170\n232465,920\n232466,30\n232467,1858\n232468,1860\n232469,179170\n232470,220816\n232471,217\n232472,179170\n232473,4192\n232473,4193\n232475,337\n232475,439\n232475,626\n232475,1381\n232475,2367\n232476,1085\n232477,30\n232477,200\n232477,772\n232477,28203\n232477,99807\n232478,202\n232479,1515\n232480,1458\n232481,1740\n232482,220816\n232483,1085\n232484,323\n232485,81\n232486,479\n232487,1227\n232487,86416\n232488,602\n232489,247\n232490,68\n232491,240\n232492,2266\n232493,220816\n232494,843\n232495,179170\n232496,179170\n232497,179170\n232498,220816\n232499,2590\n232500,393\n232501,585\n232502,179170\n232503,240\n232504,179170\n232505,918\n232506,1467\n232507,206\n232508,1001\n232509,220816\n232510,30\n232511,491\n232512,179170\n232513,1655\n232514,676\n232515,452\n232516,4355\n232517,1458\n232518,497\n232519,179170\n232520,1368\n232521,179170\n232522,450\n232523,3999\n232524,54\n232525,171\n232526,843\n232527,158\n232527,779\n232527,4192\n232527,4193\n232528,3804\n232529,220816\n232530,862\n232531,1571\n232532,83\n232532,217\n232532,278\n232532,536\n232532,1467\n232533,273\n232534,179170\n232535,220816\n232536,138686\n232537,175\n232538,151\n232539,302\n232540,1227\n232540,86416\n232541,1551\n232541,3999\n232541,5440\n232542,310\n232543,36819\n232544,179170\n232545,491\n232546,2424\n232547,358\n232548,491\n232550,146\n232550,92476\n232551,289\n232551,94134\n232552,202\n232553,301\n232553,717\n232553,1231\n232553,1740\n232554,50\n232554,140\n232554,147\n232554,202\n232554,622\n232555,743\n232556,15\n232557,2750\n232558,1968\n232559,99\n232560,232561\n232562,3999\n232563,8373\n232564,1188\n232566,483\n232567,366\n232568,366\n232569,366\n232570,366\n232571,366\n232573,366\n232574,137\n232575,366\n232576,232577\n232578,346\n232580,694\n232581,366\n232582,366\n232583,366\n232584,366\n232586,2353\n232591,2353\n232592,366\n232593,232594\n232595,999\n232596,366\n232597,366\n232598,366\n232599,366\n232600,1634\n232601,366\n232602,366\n232603,366\n232604,366\n232606,366\n232610,422\n232611,422\n232612,422\n232613,422\n232614,422\n232615,422\n232616,422\n232617,868\n232618,422\n232619,422\n232620,422\n232621,422\n232623,55849\n232624,640\n232625,146\n232625,92476\n232626,3623\n232627,7270\n232628,30\n232631,644\n232632,83\n232633,3193\n232634,30\n232635,232636\n232637,30\n232638,1608\n232639,1132\n232640,424\n232642,232642\n232643,124668\n232644,1\n232645,3\n232646,15748\n232647,1132\n232648,1608\n232649,163\n232650,283\n232650,1019\n232651,35486\n232653,147\n232656,925\n232656,1381\n232657,439\n232658,2416\n232658,2417\n232659,2421\n232660,126\n232661,1119\n232662,206\n232663,222\n232663,779\n232663,29380\n232664,2353\n232665,269\n232666,301\n232667,55849\n232668,843\n232669,142430\n232669,142879\n232670,920\n232671,3207\n232672,2048\n232673,55849\n232674,2353\n232675,1564\n232676,232677\n232676,242093\n232678,1531\n232680,138686\n232681,175\n232682,171\n232683,1192\n232684,192\n232685,743\n232686,4597\n232687,301\n232687,518\n232687,525\n232687,589\n232687,775\n232687,795\n232687,973\n232687,1235\n232687,1326\n232687,1715\n232687,4146\n232688,1284\n232689,1782\n232690,171\n232691,2668\n232693,1274\n232694,275\n232695,805\n232696,60576\n232697,536\n232699,838\n232700,179170\n232701,83\n232701,292\n232701,795\n232701,3612\n232701,3804\n232701,255911\n232702,994\n232703,46\n232704,58\n232705,994\n232706,994\n232707,227061\n232708,1707\n232710,994\n232711,30\n232712,717\n232713,779\n232714,571\n232716,217\n232719,179170\n232720,1381\n232721,1955\n232722,30\n232723,489\n232725,149\n232726,58\n232727,46\n232728,994\n232729,1368\n232730,3585\n232732,189794\n232733,179170\n232734,97\n232735,1634\n232736,76096\n232737,4223\n232737,13137\n232738,392\n232739,147\n232739,158\n232739,422\n232739,1181\n232740,217\n232740,247\n232740,1181\n232741,202\n232742,1359\n232744,1332\n232745,171641\n232746,968\n232747,1359\n232748,200\n232749,859\n232750,640\n232751,457\n232752,3507\n232753,299\n232754,1436\n232757,6661\n232758,171\n232759,30\n232761,1707\n232762,171\n232763,1882\n232764,346\n232765,142426\n232766,310\n232767,720\n232768,704\n232768,1140\n232769,55849\n232770,171\n232771,762\n232771,877\n232771,972\n232771,124668\n232771,171641\n232771,187176\n232771,227669\n232773,302\n232774,360\n232775,640\n232776,640\n232777,640\n232778,640\n232779,640\n232780,1070\n232782,994\n232783,1163\n232784,179170\n232785,134\n232786,232787\n232788,535\n232789,640\n232790,30\n232791,81\n232792,602\n232793,30\n232794,2353\n232796,199199\n232797,640\n232798,994\n232799,179170\n232800,994\n232801,179170\n232802,3422\n232803,248\n232804,200\n232805,58\n232806,994\n232807,46\n232808,179170\n232809,104\n232810,328\n232812,171641\n232813,142870\n232814,232815\n232817,852\n232818,1132\n232819,58\n232820,994\n232821,46\n232822,171641\n232823,918\n232824,200\n232825,640\n232826,192\n232827,79\n232828,187\n232829,302\n232830,535\n232831,3148\n232832,179170\n232833,285\n232834,146\n232834,92476\n232835,179170\n232836,148885\n232837,4597\n232838,200\n232839,1571\n232840,1381\n232843,994\n232844,1571\n232845,189788\n232846,994\n232847,1151\n232848,994\n232849,232850\n232851,1805\n232852,2421\n232853,55849\n232854,360\n232855,60576\n232856,1127\n232857,192\n232858,179170\n232859,179170\n232860,515\n232861,232862\n232863,749\n232864,868\n232865,79\n232866,138686\n232867,175\n232868,1132\n232869,1\n232870,1188\n232871,406\n232873,55849\n232874,360\n232875,30\n232875,200\n232876,137\n232877,179170\n232878,3623\n232879,3623\n232880,195\n232881,79\n232882,1803\n232883,694\n232884,3623\n232885,493\n232886,269\n232886,1179\n232886,1313\n232886,2372\n232887,240\n232888,232889\n232890,232891\n232892,1058\n232893,240\n232894,336\n232895,2620\n232896,592\n232897,179170\n232898,611\n232899,1556\n232901,1132\n232904,3623\n232905,2775\n232906,447\n232907,48\n232908,3623\n232909,1127\n232911,220816\n232912,192\n232913,875\n232914,1224\n232915,179170\n232916,56\n232917,422\n232918,220816\n232920,179170\n232922,220816\n232923,248\n232924,255\n232925,994\n232926,232927\n232928,102560\n232929,536\n232930,189842\n232931,140\n232932,1608\n232933,994\n232934,151\n232935,483\n232936,220816\n232937,56\n232938,422\n232939,818\n232940,994\n232941,202\n232942,994\n232943,179170\n232944,232945\n232946,220816\n232947,179170\n232949,932\n232950,1332\n232952,220816\n232953,179170\n232954,5405\n232955,5591\n232956,99\n232957,872\n232958,179170\n232960,217\n232961,784\n232962,859\n232963,1515\n232964,111\n232965,875\n232966,809\n232967,356\n232968,220816\n232969,301\n232969,1782\n232970,1181\n232971,1001\n232972,179170\n232973,160\n232974,918\n232975,272\n232976,220816\n232977,994\n232978,37414\n232979,220816\n232980,179170\n232981,171\n232982,179170\n232983,1564\n232984,3695\n232985,389\n232986,1298\n232987,1359\n232988,220816\n232989,1001\n232990,859\n232991,3148\n232992,220816\n232993,220816\n232994,30\n232995,149\n232996,222\n232996,455\n232997,179170\n232998,220816\n232999,135\n232999,137\n233000,54\n233001,233002\n233003,200\n233004,179170\n233005,1319\n233006,179170\n233007,5440\n233008,179170\n233009,247\n233009,2867\n233009,2868\n233010,510\n233011,1085\n233011,3623\n233012,220816\n233013,994\n233014,30\n233015,1359\n233016,1608\n233017,143287\n233018,202\n233019,1140\n233020,15119\n233021,179170\n233022,79\n233023,1235\n233023,1335\n233024,264\n233025,1113\n233026,202\n233027,19443\n233028,1118\n233029,994\n233030,298\n233030,346\n233030,563\n233030,615\n233030,1243\n233030,2367\n233030,7429\n233031,1773\n233032,1893\n233033,760\n233034,994\n233035,56\n233036,422\n233037,83\n233038,179170\n233039,861\n233040,179170\n233041,557\n233042,27041\n233043,1590\n233044,994\n233045,202\n233046,994\n233047,233048\n233049,994\n233050,302\n233051,179170\n233053,852\n233054,861\n233055,179170\n233056,10\n233057,179170\n233058,994\n233059,220816\n233060,233061\n233060,233478\n233060,239659\n233060,242081\n233060,242983\n233060,243018\n233060,253197\n233060,253469\n233060,258808\n233062,83\n233063,83\n233064,2373\n233065,30\n233066,673\n233067,233068\n233069,179170\n233070,873\n233071,1133\n233072,536\n233074,10\n233075,8270\n233076,8270\n233077,136\n233078,215\n233079,874\n233080,1001\n233081,179170\n233082,3623\n233083,875\n233084,220816\n233085,179170\n233086,994\n233087,179170\n233088,179170\n233089,7092\n233090,702\n233091,843\n233092,4597\n233093,278\n233094,920\n233096,151\n233097,3582\n233098,79\n233099,1474\n233100,83\n233101,217\n233101,1417\n233102,994\n233103,2923\n233104,994\n233105,5961\n233106,179170\n233107,179170\n233108,259\n233109,179170\n233110,154408\n233111,179170\n233112,179170\n233113,179170\n233114,179170\n233115,179170\n233116,56\n233117,422\n233118,56\n233119,422\n233120,179170\n233121,179170\n233122,2048\n233123,752\n233124,220816\n233125,179170\n233126,805\n233127,278\n233128,4453\n233129,503\n233130,179170\n233131,1132\n233132,1608\n233133,697\n233133,1769\n233134,663\n233135,79\n233136,489\n233137,994\n233138,179170\n233139,994\n233140,707\n233141,2116\n233142,1858\n233143,536\n233144,1238\n233145,1181\n233146,366\n233147,1452\n233148,622\n233149,1096\n233150,217\n233151,516\n233152,366\n233153,3623\n233154,192\n233154,663\n233155,805\n233156,147\n233157,1432\n233157,14434\n233158,640\n233159,1370\n233159,2782\n233160,1608\n233161,1132\n233162,154408\n233163,30\n233164,56\n233165,1363\n233166,179170\n233167,640\n233168,233169\n233170,171\n233171,179170\n233172,207837\n233173,1860\n233174,1858\n233175,50\n233176,30\n233177,2244\n233178,577\n233179,666\n233180,220816\n233181,3447\n233182,220816\n233183,48\n233184,298\n233184,2411\n233185,267\n233186,850\n233187,138686\n233188,175\n233189,390\n233190,99\n233191,248\n233192,248\n233194,138686\n233195,175\n233196,424\n233197,1531\n233198,99\n233199,1167\n233200,1785\n233201,589\n233202,605\n233203,1782\n233204,1124\n233205,973\n233206,86\n233208,77\n233209,233210\n233211,233212\n233211,240645\n233211,253820\n233213,233214\n233215,640\n233216,154408\n233217,77\n233219,676\n233220,1655\n233221,452\n233222,497\n233223,269\n233224,2590\n233225,1326\n233226,3161\n233227,179170\n233228,388\n233229,54\n233230,779\n233231,640\n233232,2424\n233233,179170\n233234,158\n233235,779\n233236,447\n233237,2775\n233238,207\n233239,179170\n233240,3161\n233241,1634\n233242,772\n233242,1332\n233244,640\n233245,516\n233246,872\n233247,640\n233248,1429\n233249,233250\n233251,2574\n233252,356\n233253,54\n233254,850\n233256,4101\n233257,668\n233258,328\n233259,151\n233260,13980\n233261,10\n233262,861\n233263,99\n233264,1\n233265,269\n233266,1181\n233267,233268\n233269,289\n233269,94134\n233270,179170\n233271,1326\n233271,14797\n233272,179170\n233273,30\n233273,233\n233273,255750\n233274,179170\n233275,255\n233276,366\n233277,366\n233278,366\n233279,366\n233280,366\n233281,366\n233282,366\n233283,366\n233284,366\n233285,366\n233286,366\n233287,366\n233288,179170\n233289,366\n233290,358\n233291,366\n233292,366\n233293,255\n233294,77\n233295,2421\n233296,2421\n233297,233298\n233299,233300\n233301,7124\n233302,859\n233303,1143\n233304,406\n233305,200\n233306,179170\n233308,818\n233309,30\n233310,360\n233310,1127\n233312,261\n233313,171\n233314,1860\n233315,1858\n233316,79\n233317,875\n233318,1860\n233319,1858\n233320,179170\n233321,1860\n233322,1858\n233323,784\n233324,589\n233325,918\n233326,918\n233327,1551\n233329,877\n233329,145502\n233330,56\n233331,422\n233332,424\n233333,4691\n233334,151\n233334,1298\n233337,1531\n233338,1085\n233339,694\n233340,233341\n233342,151\n233344,2244\n233345,2367\n233346,622\n233348,422\n233349,422\n233350,422\n233351,422\n233352,422\n233353,422\n233354,422\n233355,422\n233356,422\n233357,1860\n233358,1858\n233359,422\n233360,422\n233361,422\n233362,422\n233363,422\n233364,640\n233365,640\n233366,640\n233367,640\n233368,248\n233369,640\n233370,640\n233371,3555\n233372,35486\n233373,1860\n233374,1858\n233375,79\n233376,254\n233379,158\n233381,310\n233381,6556\n233382,301\n233383,3623\n233384,83\n233385,301\n233387,1238\n233388,393\n233389,920\n233390,1452\n233391,346\n233392,439\n233393,138686\n233394,175\n233395,179170\n233396,137\n233397,217\n233397,406\n233397,599\n233399,10\n233400,868\n233401,179170\n233402,467\n233403,179170\n233404,1479\n233404,2205\n233404,2296\n233404,33424\n233405,151\n233406,46\n233407,58\n233408,994\n233409,200\n233410,63\n233411,261\n233412,6303\n233413,932\n233414,200\n233415,179170\n233416,217\n233417,1274\n233418,805\n233419,127158\n233420,179170\n233421,934\n233422,1715\n233423,1345\n233424,4771\n233425,835\n233426,3094\n233427,3003\n233428,707\n233429,118336\n233431,1572\n233433,200\n233434,500\n233435,1962\n233436,1052\n233437,54\n233438,2775\n233439,138686\n233440,175\n233441,360\n233441,2617\n233442,388\n233443,258\n233444,2868\n233444,3111\n233445,4637\n233446,118336\n233447,115\n233448,3297\n233449,30\n233450,83\n233451,4771\n233453,148742\n233454,58\n233455,994\n233456,46\n233459,1287\n233460,483\n233464,636\n233465,1192\n233466,422\n233467,285\n233468,717\n233468,1782\n233469,1388\n233471,1085\n233472,1284\n233472,148742\n233473,1368\n233474,189842\n233475,408\n233476,158\n233477,1210\n233479,1284\n233481,1231\n233482,920\n233484,138\n233485,192\n233485,406\n233485,4192\n233486,4193\n233487,83\n233488,1860\n233489,1858\n233490,6789\n233492,202\n233494,360\n233495,1359\n233496,1220\n233497,390\n233498,32751\n233499,535\n233500,805\n233501,31073\n233502,207\n233503,83\n233503,611\n233504,192\n233505,2146\n233506,467\n233508,5718\n233509,58\n233510,994\n233511,1882\n233512,46\n233513,2590\n233514,217\n233515,10\n233516,843\n233517,907\n233518,1326\n233519,233520\n233521,489\n233522,302\n233523,269\n233524,657\n233526,1860\n233527,1858\n233528,861\n233529,10\n233530,843\n233531,28203\n233533,843\n233534,1465\n233535,1132\n233536,781\n233537,99\n233538,3467\n233539,985\n233540,581\n233541,843\n233542,79\n233543,868\n233544,10\n233544,50\n233544,192\n233544,406\n233544,779\n233544,1181\n233544,1572\n233545,147\n233546,783\n233547,272\n233548,2674\n233549,1132\n233550,179170\n233551,1968\n233552,500\n233553,1052\n233554,54\n233555,2775\n233556,1962\n233557,1132\n233558,392\n233559,14989\n233560,3623\n233561,980\n233561,4545\n233561,56150\n233563,827\n233563,2353\n233564,6303\n233565,1082\n233566,422\n233567,56\n233568,918\n233569,179170\n233570,158\n233570,192\n233571,500\n233572,2775\n233573,1962\n233574,1052\n233575,54\n233576,992\n233577,640\n233578,875\n233579,1012\n233580,272\n233580,285\n233581,138686\n233582,175\n233583,148742\n233584,1181\n233585,58\n233586,994\n233587,46\n233588,515\n233589,233590\n233592,292\n233593,918\n233594,360\n233595,55849\n233596,861\n233597,4\n233597,5\n233598,30331\n233599,5961\n233600,179170\n233601,1556\n233602,301\n233604,79\n233605,1414\n233606,841\n233607,707\n233608,393\n233610,179170\n233611,805\n233612,255\n233613,1467\n233614,1298\n233615,557\n233616,189839\n233617,255\n233619,843\n233620,151\n233622,509\n233623,868\n233624,202\n233625,31977\n233626,97\n233626,163\n233626,406\n233626,435\n233626,516\n233626,622\n233627,406\n233628,623\n233629,5310\n233631,536\n233632,240\n233633,142473\n233634,557\n233635,292\n233636,179170\n233637,171069\n233638,3555\n233639,1368\n233640,302\n233641,918\n233642,861\n233643,83\n233644,156379\n233645,118336\n233646,1707\n233647,4237\n233647,182162\n233648,233649\n233651,118336\n233652,179170\n233653,3209\n233654,818\n233655,179170\n233656,3209\n233657,179170\n233658,179170\n233659,1452\n233660,707\n233661,1749\n233662,179170\n233663,779\n233664,1133\n233666,707\n233667,179170\n233668,707\n233669,179170\n233670,301\n233671,179170\n233672,179170\n233673,1531\n233674,264\n233675,35486\n233676,179170\n233677,4101\n233678,179170\n233679,640\n233680,516\n233681,931\n233682,536\n233683,30\n233684,1363\n233685,310\n233685,6556\n233686,179170\n233687,707\n233688,5405\n233689,328\n233690,697\n233692,2191\n233693,179170\n233694,15807\n233695,1893\n233695,117163\n233696,304\n233697,179170\n233698,707\n233699,6303\n233700,120\n233702,142870\n233703,1368\n233704,557\n233705,179170\n233706,8270\n233707,795\n233708,179170\n233710,179170\n233711,179170\n233712,41\n233712,68\n233712,240\n233712,294\n233712,631\n233712,784\n233712,805\n233712,1119\n233712,1285\n233712,2995\n233712,3135\n233713,151\n233714,615\n233715,9025\n233716,1796\n233717,7124\n233718,13136\n233718,191355\n233719,707\n233720,102\n233721,1326\n233722,1323\n233723,408\n233724,233725\n233727,179170\n233728,707\n233729,79\n233730,99\n233731,707\n233732,493\n233733,2205\n233733,33424\n233734,72\n233735,151\n233736,187\n233737,707\n233738,9195\n233739,83\n233741,179170\n233742,1181\n233743,1309\n233744,626\n233745,7092\n233746,920\n233747,200\n233748,483\n233749,336\n233750,147\n233751,366\n233752,79\n233753,192\n233753,1623\n233754,366\n233755,874\n233756,220816\n233757,1474\n233758,179170\n233759,818\n233760,673\n233761,509\n233762,707\n233763,1309\n233764,1359\n233765,200\n233766,406\n233767,255\n233768,5906\n233769,557\n233770,626\n233771,278\n233772,137\n233773,862\n233774,388\n233775,220816\n233776,220816\n233777,179170\n233778,233779\n233780,179170\n233781,200\n233782,255\n233783,151\n233784,220816\n233785,247\n233786,920\n233787,278\n233788,151\n233789,220816\n233790,1983\n233791,707\n233792,1402\n233792,232709\n233793,99\n233794,99\n233795,220816\n233796,158\n233797,2421\n233798,595\n233799,707\n233801,1707\n233802,220816\n233803,179170\n233804,1962\n233805,417\n233806,72\n233807,34580\n233808,104\n233809,557\n233811,179170\n233812,30\n233813,289\n233813,94134\n233814,980\n233815,233816\n233817,179170\n233818,179170\n233819,447\n233820,2775\n233821,179170\n233823,179170\n233824,147\n233825,273\n233826,1363\n233827,179170\n233828,179170\n233829,55849\n233830,581\n233831,577\n233832,2116\n233833,179170\n233834,626\n233835,298\n233835,534\n233835,694\n233835,3623\n233835,3695\n233835,7194\n233836,1449\n233838,179170\n233839,328\n233840,233841\n233842,10\n233843,179170\n233844,287\n233844,1607\n233845,83\n233846,30\n233847,1085\n233847,178576\n233848,1285\n233849,30\n233850,179170\n233851,233852\n233853,179170\n233854,30\n233855,779\n233857,179170\n233858,138686\n233859,175\n233860,994\n233861,220816\n233863,220816\n233864,149\n233865,220816\n233866,138686\n233867,175\n233868,2156\n233869,1284\n233870,179170\n233871,179170\n233872,220816\n233873,142870\n233875,220816\n233877,920\n233878,4\n233878,5\n233878,59\n233878,60\n233878,114\n233878,115\n233878,116\n233878,117\n233878,250\n233878,430\n233878,885\n233878,1235\n233878,1252\n233878,1253\n233878,1335\n233878,1684\n233878,2087\n233878,2089\n233878,2940\n233878,3794\n233878,9537\n233878,9539\n233878,13704\n233878,54870\n233879,1745\n233880,795\n233881,146\n233881,92476\n233882,179170\n233883,220816\n233884,179170\n233885,220816\n233886,179170\n233888,179170\n233889,220816\n233890,179170\n233891,220816\n233892,179170\n233893,1133\n233894,818\n233895,589\n233896,433\n233897,918\n233897,7363\n233898,333\n233899,372\n233900,7124\n233901,220816\n233902,179170\n233903,179170\n233904,179170\n233905,179170\n233906,920\n233907,200\n233908,220816\n233909,179170\n233910,2590\n233911,220816\n233912,179170\n233913,220816\n233914,179170\n233915,179170\n233916,200\n233917,577\n233918,1634\n233919,220816\n233920,272\n233921,2617\n233922,220816\n233923,233924\n233925,220816\n233926,17772\n233927,207\n233928,220816\n233929,200\n233930,179170\n233931,872\n233932,1429\n233933,586\n233934,41\n233935,207\n233936,1179\n233937,3370\n233937,14453\n233938,1313\n233939,657\n233940,179170\n233941,99\n233942,1181\n233943,99\n233944,54\n233945,44\n233946,68\n233947,149\n233948,10\n233949,668\n233950,179170\n233951,5265\n233952,32\n233952,63\n233952,158\n233952,251\n233952,439\n233952,447\n233952,493\n233952,925\n233952,934\n233952,1068\n233952,1220\n233952,1294\n233952,1512\n233952,1531\n233952,1877\n233952,1985\n233952,3148\n233952,5212\n233952,5992\n233953,15748\n233954,779\n233955,179170\n233956,73570\n233957,175\n233958,104\n233959,972\n233960,252\n233961,255\n233962,644\n233963,10\n233965,175\n233966,99\n233967,30\n233968,233969\n233970,4101\n233971,1677\n233972,3653\n233973,1143\n233974,179170\n233975,707\n233976,707\n233977,493\n233978,1962\n233979,117163\n233982,1962\n233983,1474\n233984,1368\n233985,1116\n233986,491\n233987,1052\n233988,500\n233989,54\n233990,2775\n233991,138686\n233992,1962\n233993,175\n233995,309\n233995,310\n233995,1326\n233996,5213\n233997,1639\n234000,994\n234002,1368\n234003,15807\n234004,596\n234005,2045\n234006,10\n234006,8270\n234007,805\n234008,234009\n234010,1417\n234011,6424\n234012,422\n234013,422\n234014,422\n234015,422\n234016,422\n234017,422\n234018,422\n234019,234020\n234021,287\n234022,2674\n234022,3258\n234023,234024\n234025,422\n234026,10\n234026,222\n234026,420\n234026,577\n234026,628\n234026,2574\n234027,234028\n234029,422\n234031,422\n234032,422\n234033,850\n234034,273\n234035,422\n234036,1962\n234037,1962\n234038,234039\n234040,3804\n234041,872\n234042,707\n234043,640\n234045,3085\n234046,118336\n234047,640\n234048,640\n234049,640\n234050,640\n234051,1860\n234052,1858\n234053,1707\n234054,117163\n234055,148742\n234056,640\n234057,35486\n234058,179170\n234059,234060\n234061,1133\n234061,164572\n234062,1381\n234063,1235\n234063,2048\n234064,162599\n234065,115659\n234066,6059\n234067,1368\n234068,467\n234069,15573\n234070,7652\n234070,72439\n234071,805\n234072,240\n234076,491\n234078,13661\n234079,682\n234079,72439\n234080,861\n234081,868\n234083,920\n234086,326\n234088,148742\n234089,179170\n234090,269\n234091,4549\n234092,1238\n234093,693\n234094,179170\n234095,994\n234096,1452\n234097,251\n234098,809\n234100,663\n234101,994\n234103,920\n234104,65\n234105,9010\n234107,920\n234108,809\n234109,240\n234109,1285\n234110,272\n234110,1531\n234111,179170\n234112,932\n234113,1837\n234114,1359\n234115,79\n234116,838\n234117,994\n234118,234119\n234120,179170\n234121,7124\n234122,8907\n234123,142870\n234124,234125\n234126,994\n234127,862\n234128,994\n234129,138686\n234130,491\n234131,175\n234132,694\n234133,868\n234134,83\n234135,1096\n234136,269\n234137,459\n234138,147\n234139,644\n234139,973\n234140,148742\n234142,30\n234143,720\n234144,1858\n234145,1860\n234147,1241\n234149,682\n234149,2045\n234149,72439\n234150,119\n234150,192\n234150,309\n234150,310\n234150,577\n234151,30\n234152,9457\n234153,138686\n234154,175\n234155,30\n234156,30\n234157,227669\n234158,393\n234159,19010\n234160,287\n234161,366\n234162,366\n234163,106\n234163,1370\n234163,6119\n234164,366\n234165,102560\n234166,41\n234167,140\n234169,483\n234170,278\n234171,148742\n234172,2315\n234173,2315\n234174,1113\n234175,657\n234176,493\n234177,467\n234177,1118\n234178,1149\n234179,1235\n234179,6682\n234180,3872\n234181,589\n234181,25348\n234185,356\n234189,217\n234190,252\n234192,941\n234196,234197\n234198,124668\n234199,30\n234202,4611\n234204,1544\n234205,179170\n234206,2626\n234207,1368\n234208,743\n234209,920\n234210,179170\n234211,179170\n234212,227061\n234213,535\n234214,240\n234215,234216\n234217,20790\n234218,200\n234219,240\n234219,631\n234219,714\n234219,760\n234219,1818\n234219,2416\n234219,2417\n234220,234221\n234223,779\n234224,192\n234225,134\n234226,217\n234227,148742\n234228,209\n234229,264\n234230,3623\n234231,28107\n234232,30\n234233,285\n234234,3623\n234235,2292\n234236,5326\n234237,779\n234238,22\n234239,640\n234240,2744\n234241,795\n234242,1531\n234243,264\n234243,1659\n234244,1417\n234245,1796\n234246,9029\n234247,1860\n234248,1858\n234249,7768\n234250,234251\n234252,1001\n234253,234254\n234255,107\n234256,852\n234258,179170\n234259,1688\n234259,1722\n234260,702\n234261,479\n234262,3135\n234263,918\n234265,515\n234267,148742\n234268,918\n234269,189794\n234270,217\n234271,220816\n234272,30\n234273,220816\n234274,861\n234275,252\n234275,1385\n234276,220816\n234277,179170\n234278,3585\n234279,171641\n234280,435\n234281,137\n234282,179170\n234283,83\n234284,278\n234285,1556\n234286,252\n234287,788\n234288,220816\n234289,2923\n234290,292\n234291,1417\n234292,220816\n234293,179170\n234294,843\n234295,83\n234296,209\n234297,179170\n234298,4101\n234299,726\n234300,704\n234301,179170\n234302,1102\n234303,5250\n234304,158\n234305,158\n234305,192\n234306,932\n234307,179170\n234308,2168\n234309,151\n234310,179170\n234311,179170\n234313,360\n234314,55849\n234315,862\n234316,4597\n234317,1544\n234318,179170\n234319,179170\n234320,302\n234320,2116\n234321,2353\n234322,83\n234323,255\n234324,994\n234325,179170\n234326,483\n234327,184\n234328,179170\n234329,79\n234330,500\n234331,1052\n234332,2775\n234333,1962\n234334,54\n234335,8270\n234336,179170\n234337,918\n234338,2512\n234339,30\n234340,179170\n234341,71\n234341,1821\n234341,21736\n234342,179170\n234343,148742\n234344,179170\n234345,179170\n234346,818\n234347,255\n234348,1860\n234349,1858\n234350,30\n234351,149\n234352,234353\n234354,54\n234354,2424\n234355,1912\n234356,30\n234358,920\n234359,1235\n234359,1335\n234360,179170\n234361,536\n234362,1132\n234363,781\n234364,179170\n234365,30\n234366,158\n234366,493\n234366,586\n234366,779\n234366,8907\n234367,189788\n234368,302\n234369,406\n234370,1782\n234371,781\n234372,1132\n234373,147\n234373,671\n234374,920\n234375,312\n234376,1782\n234377,192\n234377,485\n234377,1509\n234377,1659\n234377,1688\n234377,2701\n234377,3370\n234377,14453\n234378,1326\n234379,1323\n234380,102\n234381,408\n234382,118336\n234383,3724\n234384,557\n234385,220816\n234386,267\n234387,1882\n234388,2296\n234389,71\n234390,179170\n234391,234392\n234393,920\n234394,77\n234395,220816\n234396,247\n234397,406\n234398,142870\n234399,135\n234400,141912\n234401,124668\n234402,2626\n234403,220816\n234404,4594\n234405,861\n234406,302\n234407,200\n234408,417\n234409,206\n234410,2557\n234411,72\n234412,58\n234413,805\n234414,304\n234415,5265\n234416,949\n234417,1474\n234418,673\n234419,217\n234420,179170\n234421,7360\n234422,779\n234423,179170\n234424,179170\n234425,2367\n234426,1531\n234427,264\n234428,50\n234428,406\n234429,1509\n234430,8270\n234431,447\n234432,227669\n234433,79\n234434,179170\n234435,179170\n234436,491\n234437,557\n234438,862\n234439,1634\n234440,918\n234441,138686\n234442,175\n234443,435\n234444,179170\n234446,278\n234447,179170\n234448,220816\n234449,179170\n234450,179170\n234451,179170\n234452,179170\n234453,2590\n234454,2373\n234455,234456\n234457,220816\n234458,179170\n234459,312\n234460,179170\n234461,589\n234462,220816\n234463,843\n234464,859\n234465,366\n234466,217\n234467,179170\n234468,179170\n234469,1160\n234470,255\n234471,195\n234471,918\n234471,33424\n234471,164572\n234472,7652\n234473,589\n234474,1414\n234475,23783\n234476,349\n234477,1776\n234478,179170\n234479,179170\n234480,62561\n234481,535\n234482,55849\n234483,217\n234484,2735\n234485,872\n234486,1181\n234487,179170\n234488,493\n234489,312\n234490,557\n234491,179170\n234492,994\n234493,657\n234494,179170\n234495,171\n234496,980\n234497,179170\n234498,6424\n234499,147\n234500,2116\n234501,1235\n234501,1335\n234503,234504\n234505,179170\n234506,179170\n234507,220816\n234508,859\n234509,200\n234510,577\n234511,99\n234512,99\n234513,255\n234514,83\n234515,467\n234516,781\n234517,1132\n234518,422\n234519,56\n234520,220816\n234521,207837\n234522,35486\n234523,142405\n234525,207\n234526,200\n234527,167\n234528,4597\n234529,3367\n234530,134\n234531,1227\n234531,86416\n234532,30\n234533,1014\n234534,1014\n234535,1014\n234536,1014\n234538,151\n234538,663\n234539,493\n234539,1266\n234540,179170\n234541,805\n234542,79\n234543,1220\n234544,516\n234545,252\n234546,1363\n234547,4597\n234549,516\n234550,1220\n234551,252\n234552,4672\n234553,255\n234554,338\n234555,1467\n234556,217\n234557,2590\n234558,83\n234559,1019\n234560,4237\n234560,182162\n234561,536\n234562,278\n234563,250\n234563,1684\n234564,234565\n234566,285\n234567,240\n234568,13\n234568,79\n234568,406\n234568,588\n234568,590\n234568,779\n234568,2244\n234568,4355\n234569,859\n234570,179170\n234571,234572\n234573,179170\n234574,406\n234575,179170\n234576,872\n234577,1429\n234578,269\n234579,179170\n234580,179170\n234581,23701\n234582,479\n234583,179170\n234584,1\n234586,179170\n234587,115659\n234588,3161\n234589,2590\n234590,918\n234591,149\n234592,1052\n234593,994\n234594,207\n234595,668\n234596,3370\n234596,182162\n234597,1\n234598,644\n234599,171\n234600,588\n234600,590\n234600,1419\n234601,1821\n234601,21736\n234602,779\n234603,179170\n234604,267\n234605,1363\n234606,772\n234607,179170\n234608,151\n234609,491\n234610,146\n234610,92476\n234611,273\n234612,179170\n234613,491\n234614,356\n234615,179170\n234616,693\n234618,179170\n234619,704\n234620,3413\n234621,366\n234622,366\n234623,366\n234624,179170\n234625,366\n234626,366\n234627,366\n234628,366\n234629,366\n234630,366\n234631,366\n234632,30\n234633,179170\n234634,179170\n234635,358\n234636,852\n234637,234638\n234639,79\n234640,2979\n234641,1143\n234642,1544\n234643,2073\n234644,267\n234645,366\n234646,626\n234647,179170\n234648,516\n234649,366\n234650,366\n234651,366\n234652,15748\n234654,285\n234656,422\n234657,56\n234658,3\n234659,247\n234660,2605\n234661,234662\n234663,138686\n234664,175\n234665,234666\n234667,392\n234668,234669\n234670,447\n234671,2775\n234672,15573\n234674,516\n234675,668\n234675,911\n234676,4597\n234677,75912\n234678,1509\n234679,872\n234680,151\n234681,1227\n234681,86416\n234682,79\n234684,3\n234684,44\n234684,233\n234685,360\n234685,1893\n234686,1167\n234686,3207\n234686,73570\n234687,2812\n234688,251\n234689,189128\n234690,949\n234691,527\n234692,4252\n234693,118336\n234693,240174\n234694,189794\n234694,223738\n234696,640\n234697,640\n234698,640\n234699,640\n234700,220502\n234701,640\n234702,2671\n234703,640\n234704,640\n234706,56\n234707,422\n234708,360\n234709,55849\n234710,5\n234710,6621\n234711,35486\n234712,1227\n234712,86416\n234713,189842\n234714,455\n234715,422\n234716,422\n234717,422\n234718,422\n234719,422\n234720,3623\n234721,1119\n234722,422\n234723,422\n234724,422\n234725,422\n234726,422\n234727,483\n234728,76096\n234729,55849\n234730,360\n234731,4101\n234732,149\n234733,269\n234734,1204\n234735,178\n234737,784\n234738,2312\n234739,920\n234740,577\n234740,852\n234741,872\n234742,861\n234743,31073\n234744,1133\n234745,1285\n234746,1707\n234747,885\n234747,13704\n234749,312\n234750,30\n234751,148885\n234752,577\n234752,788\n234753,138686\n234755,175\n234756,30\n234757,158\n234757,640\n234757,861\n234757,8811\n234757,8822\n234758,179170\n234760,73570\n234761,178\n234762,932\n234763,3555\n234764,1359\n234765,805\n234766,1010\n234767,422\n234768,2867\n234768,2868\n234769,30\n234770,467\n234771,83\n234772,77\n234773,255\n234774,1238\n234775,811\n234776,1590\n234777,1572\n234778,2931\n234780,1181\n234782,493\n234783,1452\n234784,79\n234785,273\n234786,81070\n234787,217\n234788,142870\n234789,875\n234791,718\n234792,707\n234793,707\n234794,117163\n234795,234796\n234797,50\n234798,4237\n234798,182162\n234799,79\n234800,34\n234800,35\n234800,949\n234800,13980\n234801,392\n234802,707\n234803,148742\n234804,148742\n234805,255\n234806,718\n234807,148742\n234808,255\n234809,313\n234811,358\n234812,1749\n234813,577\n234814,179170\n234816,195\n234817,707\n234818,1858\n234818,148742\n234819,483\n234820,408\n234821,875\n234822,7092\n234823,592\n234824,704\n234826,15573\n234827,996\n234828,258\n234829,3999\n234830,16687\n234830,76096\n234831,920\n234833,682\n234833,72439\n234834,707\n234835,215276\n234836,707\n234837,278\n234838,455\n234838,2424\n234838,4252\n234838,15609\n234839,200\n234840,818\n234842,1745\n234843,4691\n234844,261\n234844,694\n234845,192\n234845,336\n234845,1623\n234846,875\n234847,843\n234848,68\n234849,1522\n234850,535\n234851,726\n234852,1113\n234853,1511\n234853,3069\n234854,422\n234854,5405\n234855,996\n234856,22\n234857,422\n234858,56\n234859,148742\n234860,77\n234861,743\n234863,8270\n234864,285\n234865,344\n234867,805\n234868,636\n234869,861\n234870,41\n234870,1016\n234870,1212\n234870,1572\n234870,2775\n234871,875\n234872,273\n234873,1634\n234874,104\n234874,195\n234876,1359\n234877,827\n234878,1551\n234879,55849\n234880,707\n234881,707\n234882,1860\n234883,1858\n234885,79\n234888,1644\n234889,515\n234890,649\n234891,795\n234892,2296\n234893,30\n234894,179170\n234895,81\n234895,809\n234896,289\n234896,94134\n234897,338\n234898,1608\n234899,1132\n234900,1566\n234901,179170\n234902,2979\n234903,918\n234904,1644\n234905,30\n234906,8180\n234907,34\n234907,35\n234908,366\n234909,1163\n234911,485\n234912,811\n234913,389\n234914,1274\n234915,1\n234916,503\n234917,1782\n234918,312\n234919,217\n234919,302\n234920,1551\n234921,179170\n234922,192\n234923,795\n234924,798\n234925,707\n234926,920\n234927,788\n234928,577\n234929,30\n234930,2116\n234931,1220\n234932,255\n234934,179170\n234935,87\n234935,1151\n234936,344\n234937,285\n234938,932\n234940,273\n234942,217\n234943,30\n234944,918\n234945,37\n234945,1231\n234945,1531\n234946,151\n234947,752\n234948,577\n234950,31073\n234951,4810\n234952,949\n234953,1363\n234954,2671\n234955,1881\n234956,4594\n234957,7768\n234958,220816\n234959,178\n234960,1294\n234961,220816\n234962,192\n234962,333\n234963,138686\n234964,175\n234965,217\n234966,1001\n234967,142433\n234968,220816\n234969,859\n234970,220816\n234971,718\n234972,408\n234974,1\n234975,1381\n234976,148742\n234977,220816\n234978,15573\n234979,489\n234980,99\n234981,159365\n234982,179170\n234983,3209\n234984,1235\n234984,1335\n234985,1118\n234986,4101\n234987,179170\n234988,1247\n234988,164572\n234989,234990\n234991,1572\n234992,99\n234993,1012\n234994,302\n234995,267\n234996,148742\n234997,179170\n234998,356\n234999,2048\n235001,179170\n235002,510\n235002,1267\n235003,1227\n235003,86416\n235004,179170\n235005,217\n235005,222\n235005,455\n235005,5343\n235006,809\n235007,7092\n235008,1227\n235008,86416\n235009,227669\n235010,760\n235011,3295\n235012,994\n235013,590\n235013,1419\n235014,563\n235015,179170\n235016,179170\n235017,557\n235018,30\n235019,278\n235020,255\n235022,1326\n235023,102\n235024,1323\n235025,408\n235026,179170\n235027,138\n235028,865\n235029,557\n235030,137\n235031,88820\n235032,220816\n235033,557\n235034,289\n235034,94134\n235035,235036\n235037,875\n235038,217\n235038,222\n235038,455\n235038,5343\n235039,99\n235040,220816\n235041,1634\n235042,179170\n235043,235044\n235043,252884\n235045,1143\n235046,179170\n235047,50\n235048,30\n235050,179170\n235051,30418\n235052,332\n235053,1474\n235054,673\n235055,1511\n235055,3069\n235056,697\n235058,5908\n235059,142870\n235060,2867\n235060,2868\n235061,235062\n235063,235064\n235065,179170\n235066,1858\n235067,220816\n235068,179170\n235069,1132\n235070,781\n235071,328\n235072,20359\n235073,220816\n235074,4545\n235074,56150\n235075,697\n235076,83\n235076,536\n235076,634\n235076,2266\n235077,147\n235078,179170\n235079,179170\n235080,200\n235081,1363\n235082,179170\n235083,179170\n235084,2590\n235085,99\n235086,171\n235087,117163\n235088,138686\n235089,175\n235090,99\n235091,179170\n235092,3804\n235093,285\n235094,250\n235094,1684\n235095,285\n235096,250\n235096,1684\n235097,309\n235097,310\n235098,58\n235099,46\n235100,994\n235101,309\n235101,310\n235101,3161\n235102,261\n235102,6506\n235103,220816\n235104,1007\n235105,113156\n235106,1181\n235107,1181\n235108,3135\n235109,2373\n235110,704\n235111,179170\n235112,298\n235113,273\n235114,1\n235114,22\n235115,1821\n235115,21736\n235116,235117\n235118,1309\n235119,235120\n235121,1465\n235122,56\n235123,422\n235124,179170\n235125,235126\n235127,235128\n235129,217\n235129,536\n235130,179170\n235131,1181\n235132,179170\n235133,779\n235134,483\n235135,2146\n235136,179170\n235138,479\n235139,577\n235140,358\n235141,2353\n235142,35486\n235143,225\n235144,657\n235145,2116\n235146,235147\n235146,262487\n235148,235147\n235148,262487\n235148,264223\n235149,447\n235150,779\n235151,15748\n235152,994\n235153,8884\n235154,127158\n235155,818\n235156,447\n235157,28072\n235158,104\n235159,8501\n235160,795\n235161,1085\n235162,182162\n235163,179170\n235164,1181\n235165,1181\n235166,273\n235167,1227\n235167,86416\n235168,3447\n235169,1368\n235170,235171\n235172,235173\n235174,179170\n235175,1634\n235176,149\n235177,366\n235178,366\n235179,366\n235180,366\n235181,589\n235182,366\n235183,3\n235184,4597\n235185,366\n235186,2017\n235187,179170\n235188,164572\n235189,179170\n235191,859\n235192,222\n235193,2590\n235194,30\n235195,255\n235196,15573\n235197,151\n235198,1181\n235200,704\n235201,589\n235202,65\n235203,422\n235204,56\n235205,644\n235207,17772\n235208,56\n235209,422\n235210,20813\n235211,207\n235212,302\n235213,137\n235214,151\n235215,35486\n235216,235217\n235218,805\n235219,577\n235220,1860\n235221,392\n235222,6955\n235223,697\n235224,3612\n235225,595\n235226,2274\n235227,4760\n235228,6059\n235229,5658\n235230,4252\n235231,623\n235232,235233\n235234,3804\n235235,1\n235236,346\n235237,994\n235238,872\n235239,1429\n235240,149\n235241,932\n235242,5326\n235243,1014\n235244,1014\n235245,1014\n235246,1458\n235247,1181\n235249,1181\n235250,235251\n235252,973\n235253,309\n235253,310\n235254,5714\n235255,58\n235256,18726\n235257,72\n235258,278\n235259,200\n235260,142870\n235261,4101\n235262,225\n235263,148742\n235264,83\n235265,668\n235266,15573\n235267,422\n235268,422\n235269,422\n235270,422\n235271,422\n235272,422\n235274,73570\n235275,714\n235275,1119\n235277,795\n235278,2146\n235279,137\n235280,30\n235281,235282\n235283,235284\n235285,589\n235286,8270\n235287,535\n235288,1572\n235289,1381\n235290,1151\n235291,1634\n235293,1181\n235295,72\n235296,707\n235297,918\n235298,422\n235299,56\n235300,707\n235301,1181\n235302,1181\n235303,346\n235304,861\n235306,8270\n235307,285\n235308,179170\n235309,1564\n235310,900\n235311,44\n235312,200\n235313,235314\n235315,235316\n235317,779\n235318,516\n235319,1220\n235320,252\n235321,424\n235322,1181\n235323,333\n235324,422\n235325,56\n235326,2292\n235327,3804\n235328,805\n235329,1160\n235330,83\n235332,235333\n235334,483\n235335,255\n235336,151\n235337,235338\n235339,1143\n235340,63\n235340,147\n235340,251\n235340,252\n235340,493\n235340,516\n235340,1243\n235340,1265\n235340,1266\n235340,1927\n235340,17772\n235341,138686\n235342,175\n235343,1634\n235344,45022\n235345,918\n235346,15573\n235347,179170\n235348,1983\n235349,179170\n235350,726\n235351,179170\n235352,179170\n235353,30\n235355,235356\n235357,4597\n235358,111954\n235358,235359\n235358,248680\n235358,250098\n235358,250099\n235358,250159\n235358,256640\n235358,261864\n235358,262576\n235358,262577\n235358,262578\n235361,1227\n235361,86416\n235362,2750\n235363,222\n235363,694\n235363,1201\n235363,1240\n235364,393\n235365,313\n235367,2867\n235367,2868\n235368,2674\n235369,240\n235369,1085\n235369,1580\n235369,2812\n235369,4222\n235370,1677\n235371,1227\n235371,86416\n235372,202\n235373,158\n235374,626\n235376,220816\n235377,179170\n235378,973\n235378,4504\n235378,148742\n235379,179170\n235380,220816\n235381,220816\n235382,1479\n235383,179170\n235384,390\n235385,179170\n235386,220816\n235387,179170\n235388,142870\n235389,1531\n235390,1531\n235391,2373\n235392,1181\n235393,184\n235394,360\n235395,795\n235396,235397\n235398,8270\n235399,220816\n235401,2146\n235401,3297\n235401,5375\n235402,1893\n235402,117163\n235403,704\n235404,147123\n235405,147123\n235406,68069\n235407,235408\n235409,220816\n235410,355\n235412,151\n235413,1227\n235413,86416\n235414,8270\n235415,485\n235416,235417\n235418,179170\n235419,392\n235419,697\n235420,23783\n235421,663\n235422,346\n235423,8270\n235424,65\n235425,269\n235426,8270\n235427,1634\n235428,235429\n235430,1511\n235430,3069\n235431,83\n235432,1363\n235433,859\n235434,235435\n235436,235437\n235438,366\n235439,267\n235440,366\n235441,269\n235442,366\n235443,366\n235444,366\n235445,275\n235446,4597\n235447,3447\n235448,8270\n235449,346\n235450,589\n235451,184\n235452,179170\n235453,310\n235453,224488\n235454,1181\n235455,1181\n235456,1181\n235457,235458\n235461,1181\n235462,25344\n235463,179170\n235464,179170\n235465,179170\n235466,72\n235467,850\n235468,151\n235469,1118\n235470,17772\n235471,479\n235472,589\n235473,235474\n235475,137\n235476,3804\n235477,235478\n235479,235480\n235481,1188\n235482,795\n235483,585\n235484,4597\n235485,179170\n235486,118336\n235487,235488\n235489,3413\n235490,1454\n235491,192\n235492,1163\n235493,8270\n235495,235496\n235495,262217\n235497,235498\n235499,269\n235500,107\n235501,2416\n235501,2417\n235502,292\n235503,338\n235504,179170\n235505,298\n235506,235507\n235508,1133\n235509,3538\n235510,1368\n235511,8270\n235512,200\n235513,273\n235514,30\n235515,1167\n235516,1167\n235518,1167\n235519,206\n235520,859\n235521,85\n235522,15573\n235523,35486\n235524,235525\n235526,3260\n235527,704\n235528,1181\n235529,235530\n235531,142433\n235532,622\n235533,932\n235534,994\n235535,117163\n235536,1043\n235538,1983\n235539,4223\n235540,4237\n235540,182162\n235541,8270\n235542,2048\n235543,2931\n235544,292\n235544,535\n235545,55849\n235546,422\n235547,56\n235548,336\n235549,1181\n235550,346\n235551,285\n235552,1707\n235553,56\n235554,422\n235555,1313\n235556,273\n235557,346\n235559,1082\n235560,217\n235561,535\n235562,56\n235563,422\n235564,346\n235565,1163\n235566,184\n235567,422\n235568,818\n235569,818\n235570,4101\n235571,58\n235572,1033\n235573,1474\n235574,1227\n235574,86416\n235575,1769\n235576,160\n235577,273\n235578,346\n235579,142405\n235580,1370\n235581,255\n235582,179170\n235583,137\n235584,1707\n235586,1177\n235587,206\n235588,56\n235589,422\n235590,8270\n235591,56\n235592,422\n235593,151\n235594,972\n235595,44\n235596,366\n235597,932\n235598,179170\n235599,310\n235599,224488\n235600,235601\n235602,918\n235603,5265\n235604,7652\n235605,1688\n235606,779\n235607,179170\n235608,3447\n235609,10\n235610,138686\n235611,175\n235612,227669\n235613,577\n235614,467\n235615,56\n235616,422\n235617,862\n235618,1149\n235619,111\n235620,707\n235621,50\n235621,1419\n235622,3447\n235624,292\n235625,389\n235626,3804\n235627,483\n235628,200\n235629,6556\n235630,179170\n235631,3209\n235632,179170\n235633,3413\n235634,142405\n235635,151\n235636,8270\n235637,795\n235638,557\n235639,255\n235640,859\n235641,8270\n235642,30\n235643,592\n235645,4597\n235646,697\n235647,30\n235648,557\n235649,557\n235650,328\n235651,557\n235652,1509\n235653,34\n235653,35\n235654,994\n235655,1858\n235656,1860\n235657,106\n235658,1634\n235659,557\n235660,225\n235661,1132\n235662,1381\n235663,491\n235664,142409\n235665,179170\n235666,142473\n235667,235668\n235669,273\n235670,217\n235671,843\n235672,235673\n235674,179170\n235675,743\n235676,179170\n235677,179170\n235678,1118\n235678,1188\n235679,112994\n235679,120510\n235679,138194\n235679,174995\n235679,181028\n235680,138\n235681,179170\n235682,255\n235682,298\n235682,332\n235682,589\n235682,631\n235682,714\n235682,862\n235682,968\n235682,1085\n235682,1122\n235682,1522\n235682,1715\n235682,1962\n235682,2296\n235682,2995\n235682,3623\n235682,6068\n235682,6424\n235684,143287\n235685,179170\n235686,179170\n235687,32\n235688,1181\n235689,179170\n235690,1227\n235690,86416\n235691,588\n235691,590\n235691,1419\n235692,147\n235693,55849\n235694,707\n235695,2506\n235696,406\n235697,872\n235698,872\n235699,235700\n235701,255\n235707,86416\n235709,179170\n235710,8270\n235711,151\n235712,795\n235713,179170\n235714,1590\n235715,179170\n235716,510\n235717,179170\n235718,179170\n235719,3804\n235720,255\n235721,251\n235722,240\n235723,779\n235724,142870\n235725,179170\n235726,22\n235726,240\n235726,372\n235726,390\n235726,392\n235726,510\n235726,562\n235726,567\n235726,571\n235726,602\n235726,657\n235726,784\n235726,809\n235726,868\n235726,1052\n235726,1385\n235726,1893\n235726,1904\n235726,1908\n235726,3538\n235726,6119\n235726,6556\n235726,8332\n235726,81070\n235726,127158\n235727,3447\n235728,1927\n235729,1033\n235730,269\n235731,202\n235732,27356\n235733,45310\n235734,179170\n235735,151\n235736,3695\n235737,235738\n235739,843\n235740,717\n235741,1773\n235742,652\n235743,697\n235744,636\n235745,184\n235746,119\n235747,7155\n235748,795\n235749,179170\n235750,640\n235751,1012\n235752,285\n235753,298\n235754,1608\n235755,151\n235756,1181\n235757,184\n235758,179170\n235759,142473\n235760,366\n235761,292\n235762,179170\n235763,294\n235764,366\n235765,296\n235766,366\n235767,298\n235768,285\n235769,151\n235770,424\n235771,1551\n235772,3297\n235773,298\n235774,235775\n235776,1572\n235777,1644\n235778,1644\n235779,788\n235780,41\n235782,372\n235782,932\n235782,1082\n235782,1241\n235782,1479\n235782,1849\n235783,217\n235784,795\n235785,1181\n235786,148742\n235787,422\n235788,589\n235789,1634\n235791,179170\n235792,795\n235793,235794\n235795,104\n235796,4597\n235797,1749\n235798,1285\n235798,2266\n235799,818\n235800,431\n235800,1252\n235800,1253\n235800,2224\n235801,588\n235801,590\n235802,467\n235803,907\n235803,2191\n235804,143\n235804,415\n235804,6487\n235805,55849\n235807,534\n235808,2784\n235810,113878\n235811,235812\n235813,8270\n235815,509\n235817,136\n235818,843\n235819,406\n235820,1544\n235821,1544\n235822,189794\n235822,223738\n235823,749\n235825,235826\n235828,422\n235830,422\n235833,1544\n235834,1544\n235835,422\n235836,422\n235837,1544\n235838,422\n235841,422\n235842,422\n235843,422\n235844,422\n235845,422\n235846,422\n235847,56\n235848,422\n235849,1252\n235849,1253\n235850,809\n235851,48\n235854,640\n235855,640\n235856,640\n235857,1332\n235858,640\n235859,640\n235860,19010\n235861,640\n235863,171641\n235865,843\n235866,35486\n235867,671\n235868,148742\n235870,1566\n235871,235872\n235873,1220\n235874,117163\n235875,467\n235875,162599\n235876,694\n235876,1151\n235878,148742\n235879,79\n235879,192\n235879,202\n235879,333\n235879,1181\n235880,1113\n235882,179170\n235883,920\n235884,235885\n235886,2979\n235888,83\n235890,151\n235891,272\n235892,872\n235893,179170\n235894,195\n235896,6303\n235899,850\n235900,6068\n235901,79\n235902,1544\n235903,1417\n235905,1564\n235906,1238\n235907,179170\n235908,167\n235909,1722\n235910,1452\n235911,406\n235911,622\n235912,818\n235913,1860\n235914,1858\n235915,932\n235916,1556\n235918,671\n235919,1858\n235920,1860\n235921,1132\n235922,781\n235923,1860\n235924,1858\n235926,862\n235927,211\n235928,148742\n235929,590\n235929,714\n235929,4193\n235930,227669\n235931,1359\n235932,113878\n235934,269\n235935,136\n235936,79\n235937,980\n235939,179170\n235940,227669\n235941,56\n235942,422\n235943,392\n235944,167\n235945,1058\n235947,179170\n235948,179170\n235949,1181\n235954,179170\n235956,120\n235957,390\n235957,2995\n235958,162599\n235960,1572\n235961,2135\n235962,138686\n235963,175\n235964,510\n235965,994\n235966,56\n235967,422\n235968,56\n235969,422\n235970,30\n235972,2620\n235973,83\n235974,217\n235976,15179\n235977,192\n235978,1849\n235979,1010\n235980,1564\n235981,932\n235982,1955\n235983,2205\n235983,33424\n235984,714\n235985,7698\n235986,346\n235987,179170\n235988,485\n235988,717\n235988,861\n235989,148742\n235990,1181\n235991,2989\n235991,2991\n235992,1087\n235993,58\n235994,227669\n235995,1326\n235997,140\n235997,178\n235997,333\n235998,148742\n235999,202\n236001,872\n236002,56\n236003,422\n236004,7698\n236005,3507\n236006,44725\n236007,1238\n236008,493\n236009,148742\n236010,4597\n236011,236012\n236013,406\n236014,148742\n236015,1618\n236017,346\n236018,200\n236018,28203\n236019,2266\n236020,760\n236021,535\n236022,79\n236023,3260\n236024,240\n236024,289\n236024,301\n236024,714\n236024,1511\n236024,2205\n236024,2286\n236024,2620\n236024,3069\n236024,20359\n236024,33424\n236024,94134\n236025,346\n236026,19010\n236027,195\n236028,577\n236029,827\n236030,346\n236032,148742\n236033,596\n236036,252\n236037,83\n236038,1010\n236039,1010\n236040,275\n236041,631\n236042,7698\n236044,309\n236044,310\n236045,148742\n236046,24505\n236047,97\n236048,2590\n236050,275\n236051,536\n236052,622\n236053,433\n236054,1085\n236055,467\n236056,516\n236058,278\n236058,248556\n236059,75912\n236061,178\n236063,596\n236064,1326\n236066,1368\n236067,148742\n236068,309\n236068,310\n236069,179170\n236070,148742\n236071,179170\n236072,355\n236073,7416\n236074,209\n236076,875\n236077,269\n236078,1238\n236080,1363\n236080,1454\n236081,346\n236082,473\n236083,2590\n236084,148742\n236085,211\n236086,269\n236087,849\n236088,843\n236089,179170\n236090,843\n236091,843\n236092,843\n236093,843\n236094,843\n236095,179170\n236096,79\n236097,179170\n236098,179170\n236099,44\n236100,167\n236100,73570\n236101,138686\n236102,175\n236103,515\n236104,236105\n236106,592\n236107,4611\n236108,349\n236108,2372\n236109,236110\n236112,1181\n236113,1181\n236114,148742\n236115,994\n236116,4597\n236117,30\n236118,179170\n236119,99\n236121,875\n236122,19\n236123,309\n236123,310\n236124,142430\n236125,148742\n236128,1085\n236129,577\n236131,918\n236132,932\n236134,694\n236135,111\n236136,179170\n236137,56\n236138,422\n236139,83\n236140,147\n236141,389\n236141,949\n236141,1381\n236141,3260\n236143,179170\n236144,1181\n236145,179170\n236146,148742\n236147,179170\n236148,151\n236149,209\n236150,1284\n236152,148742\n236153,1449\n236153,1927\n236154,211\n236155,179170\n236156,269\n236156,271\n236156,1179\n236156,1313\n236156,2372\n236157,195\n236158,422\n236159,56\n236160,1019\n236161,179170\n236162,142426\n236163,663\n236164,148742\n236165,179170\n236166,278\n236167,217\n236168,83\n236169,148742\n236170,179170\n236171,255\n236172,640\n236174,6556\n236175,2373\n236176,360\n236177,707\n236178,536\n236179,41\n236180,1210\n236180,55552\n236180,143959\n236180,155240\n236180,236180\n236180,239833\n236180,239920\n236180,240005\n236180,240739\n236180,250761\n236180,252668\n236180,261483\n236181,179170\n236182,843\n236183,158\n236184,148742\n236185,179170\n236186,179170\n236187,60576\n236188,179170\n236189,179170\n236190,179170\n236191,694\n236193,435\n236194,1522\n236195,179170\n236197,179170\n236198,2782\n236199,72\n236200,35486\n236201,994\n236202,236203\n236202,251270\n236204,1381\n236205,1749\n236206,56\n236207,422\n236208,236209\n236210,179170\n236211,1983\n236212,843\n236213,179170\n236214,179170\n236216,179170\n236217,217\n236218,179170\n236219,483\n236220,15807\n236221,220816\n236222,179170\n236223,302\n236223,2116\n236224,179170\n236225,179170\n236226,907\n236227,406\n236228,220816\n236229,809\n236231,994\n236232,179170\n236233,1122\n236234,301\n236234,5718\n236235,220816\n236236,994\n236237,179170\n236238,179170\n236239,220816\n236240,784\n236241,179170\n236242,2205\n236242,33424\n236243,1326\n236244,102\n236245,408\n236246,1323\n236247,142870\n236248,220816\n236249,2797\n236250,179170\n236251,258\n236252,861\n236252,1241\n236252,127158\n236253,220816\n236254,179170\n236255,6119\n236256,6880\n236257,590\n236257,714\n236258,8373\n236259,211\n236260,34\n236260,602\n236261,333\n236262,862\n236262,4193\n236263,252\n236264,167\n236265,433\n236266,2989\n236266,2991\n236267,220816\n236268,994\n236270,994\n236273,145751\n236274,55849\n236275,994\n236276,220816\n236277,179170\n236278,4545\n236278,56150\n236279,366\n236280,330\n236281,994\n236282,134\n236283,10\n236284,8270\n236284,72439\n236285,220816\n236286,2421\n236287,13980\n236288,2421\n236289,200\n236290,220816\n236292,7092\n236293,835\n236294,805\n236295,328\n236296,2590\n236297,220816\n236298,346\n236299,128313\n236300,30\n236301,192\n236302,346\n236303,1454\n236304,220816\n236305,220816\n236306,236307\n236309,79\n236309,704\n236310,81\n236311,149\n236312,30\n236313,220816\n236314,179170\n236315,236316\n236317,179170\n236318,220816\n236319,1801\n236320,148742\n236321,148742\n236322,278\n236323,127158\n236324,220816\n236325,273\n236326,217\n236327,994\n236328,178\n236329,220816\n236330,278\n236331,298\n236332,485\n236333,433\n236334,30\n236335,1085\n236336,79\n236337,589\n236338,647\n236339,406\n236341,148742\n236342,117163\n236343,179170\n236344,1181\n236345,147\n236346,179170\n236347,148742\n236348,222\n236348,313\n236349,491\n236350,1326\n236351,3846\n236352,236353\n236354,220816\n236355,55849\n236356,138686\n236357,175\n236358,5405\n236359,179170\n236360,184\n236361,179170\n236362,313\n236363,179170\n236364,298\n236365,1\n236366,54\n236367,1368\n236368,117163\n236369,83\n236370,179170\n236371,179170\n236372,179170\n236373,200\n236374,220816\n236375,179170\n236376,652\n236377,7358\n236377,7363\n236378,278\n236379,417\n236380,577\n236381,220816\n236382,285\n236383,920\n236384,236385\n236386,1179\n236386,1305\n236386,2146\n236386,2701\n236387,2744\n236388,1893\n236388,117163\n236389,7194\n236390,697\n236391,2048\n236392,4597\n236394,1227\n236394,86416\n236395,920\n236396,162599\n236397,818\n236398,236399\n236400,240\n236401,202\n236402,115659\n236403,872\n236404,2266\n236405,309\n236405,310\n236406,236407\n236408,3999\n236409,34\n236409,35\n236409,313\n236409,2784\n236409,14126\n236410,111\n236411,850\n236412,28755\n236413,255\n236414,3\n236415,236416\n236417,179170\n236418,179170\n236419,2867\n236419,2868\n236420,2931\n236421,233\n236422,179170\n236423,236424\n236423,238633\n236425,932\n236426,142870\n236427,247\n236428,273\n236429,596\n236430,269\n236431,4355\n236432,366\n236433,366\n236434,366\n236435,366\n236436,862\n236437,1294\n236438,346\n236439,328\n236440,192\n236441,179170\n236442,179170\n236443,346\n236444,493\n236444,1266\n236445,563\n236446,1181\n236447,227669\n236448,1284\n236448,148742\n236449,3999\n236450,8270\n236451,195\n236452,148742\n236453,346\n236454,236455\n236456,195\n236457,1133\n236458,346\n236460,8854\n236461,179170\n236462,1381\n236463,236464\n236463,257473\n236465,233\n236466,30\n236467,30\n236469,158\n236469,21442\n236469,240174\n236470,15\n236471,1572\n236472,259\n236473,48\n236474,3260\n236475,56\n236476,422\n236477,491\n236478,1860\n236479,1858\n236480,298\n236481,151\n236481,663\n236483,58\n236484,994\n236485,46\n236486,30\n236488,707\n236489,505\n236490,397\n236491,222\n236493,805\n236495,972\n236496,236497\n236498,236497\n236499,236497\n236500,693\n236501,35486\n236502,1220\n236503,252\n236504,346\n236505,251\n236506,115659\n236507,115659\n236508,1363\n236509,491\n236510,644\n236511,424\n236512,1454\n236514,483\n236515,1707\n236516,200\n236517,557\n236518,1368\n236519,707\n236521,875\n236522,1454\n236523,634\n236524,422\n236525,422\n236526,83\n236527,422\n236528,422\n236529,422\n236530,422\n236531,422\n236532,422\n236533,422\n236534,422\n236535,422\n236536,422\n236537,640\n236538,640\n236539,422\n236540,640\n236541,640\n236542,148742\n236543,640\n236544,147\n236545,726\n236546,1805\n236547,292\n236547,462\n236548,302\n236549,148742\n236551,240\n236552,142426\n236553,3260\n236554,346\n236555,298\n236557,35486\n236558,179170\n236559,4545\n236559,56150\n236560,920\n236561,206\n236562,104\n236562,136\n236562,225\n236562,953\n236562,1368\n236562,1939\n236562,5405\n236562,7270\n236563,994\n236564,1274\n236565,994\n236566,872\n236567,2411\n236568,1634\n236569,652\n236570,138686\n236571,148742\n236572,175\n236574,994\n236575,179170\n236576,1294\n236577,1893\n236577,117163\n236578,58\n236579,994\n236580,46\n236581,302\n236582,79\n236583,272\n236584,1274\n236585,302\n236586,217\n236587,406\n236588,6682\n236589,58\n236590,994\n236591,46\n236592,406\n236593,1033\n236594,44725\n236595,178\n236596,622\n236597,640\n236598,1132\n236599,1608\n236600,1644\n236601,1608\n236602,1132\n236603,1151\n236604,328\n236605,687\n236606,147\n236607,302\n236608,355\n236609,491\n236610,491\n236611,1085\n236612,148742\n236613,236614\n236615,7698\n236616,1001\n236617,408\n236618,932\n236620,1544\n236621,104\n236621,136\n236621,225\n236621,953\n236621,1368\n236621,1939\n236621,5405\n236621,7270\n236622,920\n236622,255750\n236622,256703\n236622,258791\n236623,868\n236624,328\n236625,83\n236627,302\n236628,1962\n236629,1274\n236630,2266\n236631,1201\n236632,217\n236633,2421\n236634,4637\n236635,8270\n236636,264\n236637,893\n236638,1782\n236639,136072\n236640,195\n236641,2775\n236642,447\n236643,309\n236643,310\n236644,148742\n236645,2135\n236646,83\n236648,818\n236649,483\n236650,372\n236651,346\n236652,148742\n236653,179170\n236654,406\n236655,225\n236656,151\n236657,236658\n236659,663\n236660,217\n236661,236662\n236663,184\n236664,22\n236665,516\n236666,346\n236667,302\n236668,202\n236669,707\n236671,360\n236671,2617\n236672,500\n236673,1962\n236674,1052\n236675,54\n236676,2775\n236677,707\n236679,8270\n236680,832\n236681,217\n236681,247\n236681,652\n236681,1893\n236683,360\n236684,1\n236685,32\n236686,389\n236686,1019\n236686,1467\n236687,535\n236688,1181\n236689,994\n236691,994\n236692,994\n236693,577\n236693,1400\n236694,535\n236695,668\n236696,657\n236697,3260\n236698,1436\n236699,1370\n236701,2931\n236702,3804\n236703,372\n236704,872\n236705,1224\n236706,875\n236707,872\n236708,54\n236709,2421\n236710,56\n236711,422\n236712,852\n236713,346\n236715,557\n236716,5405\n236717,227061\n236718,261\n236718,3115\n236719,10\n236720,58\n236721,46\n236722,994\n236723,56\n236725,422\n236726,111142\n236727,195\n236727,6323\n236728,874\n236729,179170\n236730,1188\n236731,994\n236732,862\n236733,9457\n236734,302\n236734,893\n236735,264\n236736,346\n236737,273\n236738,1608\n236739,1132\n236740,175\n236740,313\n236740,693\n236740,1313\n236740,2421\n236740,2646\n236740,13980\n236740,115474\n236741,687\n236742,994\n236743,994\n236744,536\n236745,9018\n236746,7358\n236746,7363\n236747,585\n236748,8788\n236749,1266\n236749,7124\n236750,2868\n236750,4355\n236751,994\n236752,406\n236753,211\n236755,179170\n236756,500\n236757,54\n236758,2775\n236759,1962\n236760,1052\n236761,16014\n236761,236761\n236762,145240\n236763,994\n236764,489\n236765,433\n236766,1462\n236766,8537\n236767,1\n236767,1243\n236768,720\n236769,179170\n236770,994\n236771,994\n236772,1837\n236773,994\n236774,433\n236775,148742\n236776,1181\n236777,301\n236778,1241\n236779,907\n236780,179170\n236781,200\n236782,68069\n236783,349\n236784,743\n236786,192\n236787,406\n236787,220502\n236788,212914\n236790,389\n236790,2421\n236791,222\n236792,515\n236793,707\n236794,5213\n236796,1860\n236797,1858\n236798,994\n236799,179170\n236800,147\n236801,220816\n236802,179170\n236803,994\n236804,1659\n236805,435\n236806,1955\n236807,151\n236808,1818\n236809,843\n236810,179170\n236811,179170\n236812,304\n236813,179170\n236815,2421\n236816,220816\n236817,509\n236817,852\n236818,687\n236819,1849\n236821,44725\n236822,179170\n236823,843\n236825,34\n236825,35\n236826,179170\n236827,1927\n236828,179170\n236829,4597\n236830,138686\n236831,175\n236832,1955\n236833,179170\n236834,843\n236835,1556\n236837,55849\n236839,349\n236839,697\n236839,3260\n236840,389\n236841,179170\n236842,255\n236843,1368\n236844,149\n236845,949\n236846,10\n236847,148742\n236848,994\n236849,818\n236849,1151\n236850,6303\n236851,3\n236852,393\n236853,4101\n236854,278\n236855,707\n236856,83\n236856,278\n236856,577\n236857,1052\n236858,65\n236860,83\n236861,151\n236862,179170\n236863,2699\n236865,455\n236867,422\n236868,1181\n236869,392\n236870,752\n236871,2083\n236872,1298\n236873,1210\n236874,390\n236875,1370\n236876,518\n236877,302\n236878,1849\n236879,1231\n236880,6068\n236881,1001\n236882,3193\n236883,63\n236884,1715\n236885,589\n236886,714\n236887,79\n236888,1634\n236889,179170\n236890,622\n236891,406\n236892,56\n236893,179170\n236894,148742\n236895,9098\n236896,7572\n236897,217\n236898,148742\n236899,118336\n236901,179170\n236902,685\n236903,55849\n236904,515\n236905,1551\n236906,8798\n236907,417\n236908,1590\n236909,83\n236910,349\n236911,973\n236912,4453\n236913,302\n236915,694\n236916,392\n236917,179170\n236919,406\n236920,236921\n236922,162599\n236923,1579\n236924,1849\n236925,1381\n236926,3193\n236927,1289\n236928,140\n236929,1955\n236930,3999\n236931,586\n236932,1479\n236933,1010\n236934,932\n236935,1102\n236936,687\n236937,1241\n236938,1821\n236938,21736\n236939,1370\n236940,2620\n236941,148742\n236942,515\n236943,1551\n236944,4453\n236945,1265\n236945,1266\n236946,586\n236947,1531\n236948,483\n236949,162599\n236951,217\n236952,278\n236953,179170\n236954,1467\n236955,536\n236956,83\n236957,1227\n236957,86416\n236958,626\n236959,872\n236959,1659\n236960,195\n236962,236961\n236963,141912\n236964,346\n236965,56\n236966,422\n236967,467\n236969,932\n236970,148742\n236971,158\n236972,5\n236972,8330\n236972,72439\n236973,818\n236974,309\n236974,310\n236975,179170\n236976,50\n236976,146\n236976,92476\n236976,141912\n236977,148742\n236978,79\n236979,233\n236980,151\n236980,192\n236980,309\n236980,310\n236980,577\n236980,1167\n236980,1400\n236981,493\n236983,704\n236984,30\n236985,346\n236987,272\n236988,1893\n236989,406\n236990,179170\n236991,718\n236992,615\n236993,179170\n236994,44\n236995,1058\n236996,346\n236997,252\n236998,1033\n236999,151\n237000,1052\n237001,2775\n237002,54\n237003,1962\n237004,500\n237005,885\n237005,13704\n237006,525\n237007,994\n237008,1309\n237009,56\n237010,422\n237011,179170\n237012,1285\n237013,1515\n237014,247\n237014,2867\n237014,2868\n237015,192\n237016,1474\n237016,1789\n237017,631\n237018,7092\n237019,220816\n237020,294\n237021,1893\n237022,805\n237023,179170\n237024,783\n237025,179170\n237026,115474\n237027,2244\n237028,1001\n237028,72439\n237029,2334\n237030,1\n237031,536\n237032,278\n237033,179170\n237034,143287\n237035,72\n237035,312\n237035,323\n237035,991\n237035,1188\n237035,1309\n237035,1893\n237035,2312\n237035,2605\n237035,3695\n237036,302\n237036,406\n237036,420\n237036,1414\n237036,1466\n237037,473\n237037,1082\n237037,1983\n237037,2353\n237037,2923\n237037,3999\n237038,19010\n237039,1085\n237040,167\n237040,605\n237040,1544\n237040,2083\n237040,5301\n237041,220816\n237042,179170\n237043,500\n237044,2775\n237045,1052\n237046,54\n237047,1962\n237048,7416\n237049,255\n237050,500\n237051,1962\n237052,1052\n237053,54\n237054,2775\n237055,707\n237056,237057\n237059,179170\n237060,179170\n237061,264\n237062,273\n237063,2373\n237064,500\n237065,1052\n237066,2775\n237067,1962\n237068,54\n237069,1181\n237070,179170\n237071,1181\n237072,1132\n237073,1608\n237074,795\n237075,179170\n237076,179170\n237077,179170\n237078,217\n237079,4455\n237079,193578\n237080,58\n237081,83\n237082,1181\n237083,237084\n237085,1238\n237086,422\n237087,56\n237088,220816\n237090,1452\n237091,167\n237091,1133\n237091,2557\n237092,3949\n237093,2617\n237094,72764\n237095,862\n237096,452\n237097,1247\n237097,164572\n237098,184\n237099,406\n237100,179170\n237101,1323\n237101,1512\n237102,862\n237103,179170\n237104,34\n237104,602\n237105,1326\n237106,102\n237107,1323\n237108,408\n237109,179170\n237112,640\n237113,1058\n237115,179170\n237116,179170\n237117,179170\n237119,435\n237119,893\n237122,237123\n237124,179170\n237125,30\n237126,179170\n237127,237128\n237129,237130\n237131,179170\n237132,697\n237133,663\n237134,3138\n237135,147\n237136,577\n237136,788\n237137,4597\n237139,1227\n237139,86416\n237140,136\n237141,138686\n237142,175\n237143,433\n237144,220816\n237145,859\n237146,1564\n237147,81\n237148,323\n237149,1227\n237149,86416\n237150,220816\n237151,264\n237152,83\n237153,479\n237154,83\n237155,292\n237156,307\n237158,272\n237159,1363\n237160,7698\n237161,1163\n237162,237163\n237164,44\n237165,147\n237166,850\n237167,1515\n237168,7117\n237169,278\n237169,313\n237169,1010\n237169,1241\n237169,1368\n237169,1415\n237170,237171\n237172,5265\n237173,23783\n237174,14366\n237175,179170\n237176,237177\n237178,147\n237179,50\n237180,1181\n237181,83\n237181,211\n237181,269\n237181,622\n237181,1014\n237182,179170\n237183,1381\n237184,179170\n237185,179170\n237186,179170\n237187,179170\n237188,2674\n237189,179170\n237190,179170\n237191,179170\n237192,147\n237193,577\n237193,745\n237194,424\n237195,392\n237195,433\n237196,285\n237197,307\n237197,2334\n237198,45960\n237199,237200\n237201,7358\n237201,7363\n237202,289\n237202,94134\n237203,859\n237203,182162\n237204,237205\n237206,872\n237207,147\n237208,179170\n237209,179170\n237210,179170\n237211,179170\n237212,28755\n237213,714\n237213,4193\n237213,8992\n237214,2244\n237215,179170\n237216,493\n237216,704\n237217,1368\n237218,179170\n237219,179170\n237220,252\n237221,151\n237222,818\n237223,138686\n237224,175\n237225,179170\n237227,1363\n237228,267\n237229,179170\n237230,179170\n237231,269\n237232,8270\n237233,920\n237235,7358\n237235,7363\n237236,640\n237237,237238\n237239,179170\n237240,240\n237241,237242\n237243,433\n237245,360\n237245,1893\n237246,489\n237247,1140\n237248,2073\n237249,388\n237250,143287\n237251,491\n237252,1773\n237253,615\n237253,968\n237254,1566\n237255,30\n237256,1773\n237257,237258\n237259,1179\n237260,198024\n237261,3161\n237262,237263\n237264,1052\n237265,1962\n237266,2775\n237267,54\n237268,592\n237269,3769\n237270,577\n237271,397\n237272,8991\n237272,33424\n237273,726\n237273,1235\n237275,1707\n237277,79\n237277,222\n237277,590\n237277,1419\n237277,2719\n237277,23701\n237278,23783\n237279,207\n237279,358\n237279,366\n237279,417\n237279,1052\n237279,1253\n237279,1319\n237279,1571\n237279,1634\n237279,2424\n237279,2620\n237279,2867\n237279,2868\n237280,106\n237281,408\n237282,994\n237283,58\n237284,46\n237285,171\n237287,1146\n237288,6027\n237288,227061\n237289,292\n237290,366\n237292,366\n237293,366\n237294,366\n237295,366\n237296,366\n237297,195\n237297,893\n237297,1247\n237297,3769\n237297,164572\n237298,389\n237299,422\n237300,56\n237301,671\n237303,1266\n237303,5714\n237304,1893\n237305,1893\n237306,1893\n237307,1893\n237308,1893\n237309,1363\n237310,1955\n237311,195\n237312,1363\n237314,211\n237315,1370\n237316,333\n237317,34\n237317,590\n237317,602\n237318,2995\n237321,422\n237323,422\n237324,200\n237325,422\n237326,2480\n237327,422\n237328,1860\n237329,1858\n237330,422\n237331,422\n237332,422\n237333,422\n237334,422\n237335,422\n237336,422\n237337,422\n237338,422\n237339,640\n237340,640\n237341,640\n237342,640\n237343,209\n237344,1893\n237345,1127\n237346,640\n237347,1858\n237348,1860\n237349,577\n237350,346\n237351,195\n237352,640\n237353,35486\n237354,1058\n237355,120\n237355,3252\n237355,13980\n237356,433\n237357,162599\n237358,1181\n237359,1877\n237359,40497\n237360,1181\n237361,31073\n237362,481\n237363,195\n237364,698\n237365,151\n237366,56\n237367,422\n237368,3630\n237369,743\n237370,142426\n237371,195\n237374,1893\n237376,818\n237377,5\n237377,1414\n237377,1462\n237378,195\n237379,920\n237380,644\n237381,859\n237382,779\n237383,808\n237384,314\n237385,422\n237386,56\n237387,179170\n237388,360\n237388,1127\n237388,21408\n237389,195\n237390,179170\n237392,994\n237393,3003\n237394,408\n237394,818\n237395,779\n237396,192\n237397,336\n237398,1127\n237399,994\n237400,222\n237401,8270\n237403,301\n237404,795\n237405,925\n237406,7117\n237407,1253\n237407,1707\n237407,3370\n237407,182162\n237408,151\n237409,195\n237410,1274\n237411,1893\n237412,48\n237413,859\n237414,1893\n237415,772\n237416,1363\n237417,3094\n237418,1011\n237419,1644\n237420,1659\n237421,3474\n237422,994\n237423,408\n237424,996\n237425,408\n237427,932\n237428,1151\n237428,2436\n237429,3999\n237430,980\n237431,657\n237432,2979\n237433,360\n237433,81070\n237434,237435\n237436,5192\n237437,79\n237438,422\n237439,491\n237440,151\n237441,1151\n237442,1282\n237443,211\n237444,1177\n237445,134\n237445,431\n237446,202\n237447,1001\n237449,289\n237449,94134\n237450,83\n237451,1227\n237451,86416\n237452,30\n237453,1238\n237454,1033\n237455,83\n237456,444\n237457,5213\n237458,1452\n237459,718\n237460,1210\n237461,1419\n237461,20535\n237463,707\n237472,1688\n237473,1769\n237475,7\n237476,83\n237477,406\n237477,467\n237478,602\n237479,8270\n237480,237481\n237482,447\n237483,346\n237485,171641\n237486,843\n237487,707\n237488,1769\n237489,1462\n237489,8537\n237490,406\n237491,160\n237492,779\n237493,994\n237494,585\n237495,30\n237496,1564\n237497,222\n237497,455\n237498,1058\n237499,447\n237500,2775\n237501,240\n237501,1082\n237501,1285\n237503,167\n237504,393\n237505,510\n237507,151\n237508,72\n237509,1127\n237510,83\n237511,8270\n237512,151\n237513,1181\n237514,3328\n237515,179170\n237517,237518\n237519,602\n237520,3177\n237521,1564\n237523,994\n237524,35486\n237525,2073\n237527,1058\n237528,1414\n237536,3999\n237537,2590\n237538,1893\n237539,994\n237540,179170\n237541,843\n237542,1113\n237543,323\n237544,649\n237545,577\n237546,1181\n237548,1001\n237549,779\n237549,1181\n237550,37\n237551,269\n237551,872\n237551,1796\n237553,115659\n237554,1449\n237555,775\n237556,217\n237557,37\n237558,151\n237559,1284\n237560,301\n237562,13661\n237563,1893\n237564,204124\n237565,1284\n237565,148742\n237567,113156\n237568,179170\n237569,1127\n237571,1515\n237572,147\n237573,1566\n237573,242246\n237575,175\n237576,55849\n237577,1749\n237578,392\n237579,141912\n237580,141912\n237581,406\n237582,805\n237583,200\n237584,1353\n237585,333\n237586,1551\n237587,138686\n237588,175\n237589,1238\n237590,58\n237590,71\n237590,217\n237590,1449\n237590,1612\n237590,2590\n237590,5718\n237591,640\n237592,536\n237593,781\n237594,1132\n237595,994\n237596,179170\n237597,1238\n237598,779\n237599,1238\n237600,179170\n237601,862\n237602,179170\n237603,1058\n237604,1740\n237605,202\n237606,1132\n237607,781\n237608,179170\n237609,83\n237610,8788\n237611,1556\n237612,7358\n237612,7363\n237613,1160\n237614,137\n237615,7092\n237617,30\n237617,328\n237617,4355\n237618,447\n237619,2775\n237620,179170\n237621,1298\n237622,2424\n237623,50\n237623,146\n237623,285\n237623,779\n237623,809\n237623,1181\n237623,1515\n237623,92476\n237623,141912\n237626,850\n237627,392\n237628,1118\n237629,338\n237630,900\n237631,795\n237633,151\n237634,4237\n237634,182162\n237635,8270\n237636,392\n237637,1893\n237638,179170\n237639,676\n237640,1849\n237641,4611\n237642,151\n237643,538\n237644,3623\n237645,144556\n237648,200\n237649,44\n237650,269\n237651,179170\n237652,301\n237653,1274\n237654,135\n237655,302\n237656,515\n237657,179170\n237658,142870\n237659,289\n237659,94134\n237660,162599\n237661,158\n237663,994\n237664,162599\n237665,292\n237666,251\n237667,179170\n237668,577\n237669,302\n237670,56\n237671,422\n237672,179170\n237673,1007\n237674,19986\n237675,34\n237675,35\n237676,179170\n237677,861\n237678,1282\n237679,240\n237680,932\n237681,179170\n237682,1860\n237683,1858\n237684,15573\n237685,364\n237686,45960\n237688,179170\n237689,220816\n237690,30\n237691,2750\n237692,179170\n237693,9239\n237694,3182\n237695,779\n237696,918\n237697,237698\n237699,237700\n237701,237700\n237702,220816\n237703,237700\n237704,2646\n237705,1572\n237706,289\n237706,94134\n237707,1240\n237708,247\n237709,805\n237710,220816\n237711,3297\n237712,333\n237713,994\n237714,3209\n237715,35486\n237716,626\n237721,220816\n237722,17772\n237723,483\n237724,220816\n237725,481\n237726,1556\n237727,220816\n237728,206\n237729,1240\n237730,167\n237731,200\n237732,333\n237733,220816\n237734,9018\n237735,1119\n237736,77\n237737,233\n237738,9024\n237739,237740\n237741,220816\n237742,148742\n237743,972\n237743,973\n237744,7092\n237745,1181\n237746,788\n237747,1033\n237748,535\n237749,56\n237750,422\n237751,435\n237752,50\n237752,4504\n237753,220816\n237754,142870\n237755,8373\n237756,220816\n237757,4193\n237758,182162\n237759,278\n237760,1893\n237761,516\n237762,5405\n237763,1326\n237764,1323\n237765,408\n237766,102\n237767,4597\n237768,843\n237769,220816\n237770,644\n237771,255\n237772,220816\n237773,3507\n237774,346\n237775,220816\n237776,143287\n237777,179170\n237778,5906\n237779,557\n237780,1707\n237781,626\n237782,278\n237783,220816\n237784,137\n237785,179170\n237786,862\n237787,215276\n237788,447\n237791,220816\n237792,1181\n237793,1181\n237794,179170\n237795,538\n237796,1001\n237796,72439\n237797,220816\n237798,850\n237799,179170\n237800,220816\n237801,220816\n237802,795\n237803,220816\n237804,920\n237805,1452\n237806,179170\n237807,220816\n237808,255\n237809,406\n237810,151\n237811,237812\n237813,707\n237814,220816\n237815,115659\n237816,515\n237817,179170\n237818,2105\n237819,278\n237820,179170\n237821,220816\n237822,179170\n237823,1608\n237824,179170\n237825,30\n237826,211\n237826,366\n237827,30\n237828,73570\n237829,179170\n237830,220816\n237831,2995\n237832,179170\n237833,179170\n237834,179170\n237835,1414\n237836,34\n237836,602\n237837,586\n237838,8822\n237839,1773\n237840,80266\n237841,663\n237842,179170\n237843,220816\n237844,795\n237845,8270\n237846,179170\n237847,8854\n237848,158\n237849,1745\n237850,220816\n237851,9457\n237852,1033\n237853,10\n237854,237855\n237856,264\n237857,1927\n237858,447\n237859,2775\n237860,179170\n237862,302\n237862,893\n237863,220816\n237864,237865\n237866,138686\n237867,175\n237868,48\n237868,217\n237868,302\n237868,333\n237868,872\n237868,1419\n237868,1893\n237868,2668\n237868,4355\n237868,142870\n237869,1860\n237870,1858\n237871,179170\n237872,179170\n237873,333\n237874,220816\n237875,179170\n237876,1566\n237877,179170\n237878,179170\n237879,220816\n237880,220816\n237881,292\n237882,779\n237883,104\n237884,1181\n237885,1007\n237886,220816\n237887,1634\n237888,781\n237889,1132\n237890,2775\n237891,447\n237892,220816\n237893,237894\n237895,237894\n237896,120\n237897,147\n237898,220816\n237900,1893\n237901,192\n237902,346\n237903,142870\n237904,9018\n237905,620\n237905,1181\n237906,1227\n237906,86416\n237907,1181\n237908,1467\n237909,455\n237910,2424\n237911,217\n237912,1274\n237913,1871\n237914,83\n237915,2421\n237916,13980\n237917,1284\n237918,611\n237919,65\n237920,179170\n237921,581\n237922,179170\n237923,179170\n237924,179170\n237925,907\n237925,1419\n237926,19\n237927,179170\n237928,5101\n237930,557\n237931,285\n237932,920\n237933,220816\n237934,309\n237934,310\n237935,30\n237936,779\n237937,179170\n237938,1474\n237939,673\n237940,179170\n237941,211\n237942,30\n237943,5440\n237944,1274\n237945,111\n237946,1400\n237947,179170\n237948,179170\n237949,8270\n237950,151\n237951,795\n237952,179170\n237953,920\n237954,179170\n237955,1181\n237956,1181\n237957,179170\n237958,247\n237959,179170\n237960,310\n237960,224488\n237961,179170\n237962,779\n237963,1\n237964,179170\n237965,3804\n237966,779\n237967,1181\n237968,1181\n237969,304\n237971,269\n237972,2116\n237973,179170\n237974,237975\n237976,179170\n237977,34\n237977,2995\n237978,714\n237978,4193\n237979,1132\n237980,671\n237981,1326\n237981,5301\n237982,1284\n237983,577\n237984,179170\n237985,237986\n237987,366\n237988,1181\n237989,1238\n237990,8270\n237991,8270\n237992,151\n237993,795\n237994,151\n237995,8270\n237996,1474\n237997,1085\n237998,577\n237999,238000\n238001,3507\n238003,707\n238004,779\n238006,1181\n238007,4276\n238008,1359\n238009,581\n238009,918\n238010,130\n238011,209\n238012,238013\n238014,387\n238015,366\n238016,671\n238017,366\n238018,366\n238019,366\n238020,1052\n238021,1962\n238022,54\n238023,2775\n238024,366\n238025,79\n238026,200\n238027,79\n238028,366\n238029,305\n238031,1860\n238032,1858\n238033,366\n238034,20\n238034,32\n238034,102\n238034,106\n238034,262\n238034,283\n238034,649\n238034,663\n238034,861\n238034,893\n238034,1052\n238034,1345\n238034,1368\n238034,1381\n238034,1509\n238034,1673\n238034,1847\n238034,2244\n238034,4903\n238034,9457\n238034,13136\n238035,179170\n238036,179170\n238037,211\n238038,467\n238039,875\n238040,784\n238041,330\n238042,1858\n238043,344\n238044,422\n238045,795\n238046,2116\n238047,422\n238048,422\n238049,422\n238050,422\n238051,422\n238052,422\n238053,264\n238054,142870\n238056,422\n238057,1860\n238058,1858\n238059,179170\n238060,2460\n238061,269\n238062,1359\n238063,30\n238064,238065\n238066,179170\n238067,1359\n238068,187176\n238069,1359\n238070,1359\n238072,35486\n238073,1619\n238075,264\n238076,1623\n238077,1467\n238078,13538\n238080,79\n238081,994\n238082,58\n238083,46\n238084,1085\n238085,301\n238086,1359\n238087,640\n238088,2590\n238090,1238\n238091,71\n238091,1449\n238091,1612\n238091,2590\n238091,5718\n238092,1238\n238093,1782\n238094,949\n238095,920\n238096,60576\n238097,76096\n238098,162599\n238099,1359\n238100,200\n238101,302\n238102,1415\n238103,151\n238104,8270\n238105,795\n238106,200\n238108,275\n238109,8270\n238110,707\n238111,707\n238112,138686\n238113,217\n238114,175\n238115,2674\n238116,3094\n238117,1644\n238118,179170\n238119,1274\n238120,207\n238121,240\n238122,1284\n238123,83\n238125,636\n238126,179170\n238127,278\n238129,707\n238130,217\n238131,872\n238132,932\n238133,1238\n238134,313\n238135,1566\n238136,406\n238137,1893\n238138,1452\n238139,149\n238139,406\n238140,269\n238141,7\n238142,167\n238143,640\n238144,640\n238145,640\n238146,640\n238147,640\n238148,779\n238149,640\n238150,1773\n238152,872\n238153,8270\n238154,703\n238155,1429\n238156,1052\n238157,1962\n238158,54\n238159,2775\n238161,83\n238162,1531\n238163,1531\n238164,1368\n238165,120\n238166,146\n238166,92476\n238168,668\n238169,1240\n238170,422\n238172,134\n238173,536\n238178,79\n238181,6068\n238182,14366\n238184,115474\n238185,1392\n238186,875\n238187,366\n238188,762\n238189,788\n238190,195\n238192,269\n238194,1238\n238195,1983\n238196,158\n238196,192\n238197,1608\n238198,1132\n238199,179170\n238200,1276\n238201,1181\n238202,1033\n238203,179170\n238204,58\n238205,994\n238206,46\n238207,19010\n238208,58\n238209,994\n238210,46\n238211,56\n238212,422\n238213,1707\n238214,779\n238215,56\n238216,422\n238217,22\n238218,358\n238219,6556\n238220,134\n238220,372\n238221,148742\n238222,577\n238222,788\n238223,1284\n238224,852\n238225,72\n238226,44725\n238228,188791\n238229,1707\n238230,195\n238231,491\n238232,83\n238234,422\n238235,56\n238237,1400\n238238,1882\n238239,1068\n238240,179170\n238242,202\n238243,179170\n238244,6059\n238245,1274\n238245,1454\n238248,148742\n238249,1566\n238251,510\n238253,852\n238254,179170\n238255,1058\n238256,483\n238256,232766\n238257,179170\n238258,289\n238258,94134\n238259,1381\n238260,596\n238261,179170\n238262,1368\n238263,920\n238264,919\n238265,805\n238266,1143\n238267,1707\n238268,179170\n238269,8270\n238270,179170\n238271,918\n238271,1160\n238272,358\n238273,179170\n238274,1467\n238275,179170\n238277,148742\n238278,1052\n238279,54\n238280,2775\n238281,1962\n238282,2744\n238283,462\n238283,595\n238283,3695\n238284,994\n238289,1644\n238294,406\n238297,1238\n238298,179170\n238299,315\n238300,515\n238301,714\n238301,1511\n238301,33424\n238301,94134\n238302,179170\n238303,309\n238303,310\n238304,292\n238305,179170\n238306,83\n238307,779\n238308,79\n238308,192\n238308,305\n238308,435\n238308,516\n238308,585\n238308,1400\n238309,657\n238310,56\n238311,422\n238312,238313\n238314,179170\n238315,435\n238316,1238\n238317,149\n238318,179170\n238319,206\n238322,140\n238323,4237\n238323,182162\n238324,179170\n238325,1085\n238326,843\n238327,450\n238329,179170\n238330,68069\n238330,141912\n238331,1556\n238332,462\n238334,918\n238334,1160\n238335,30\n238336,192\n238337,907\n238338,60576\n238339,312\n238340,1370\n238340,21442\n238341,8270\n238342,2590\n238344,130\n238345,707\n238346,44\n238348,1927\n238349,493\n238350,138686\n238351,215\n238352,175\n238353,162599\n238355,1284\n238356,3585\n238357,151\n238358,120\n238358,261\n238359,406\n238360,483\n238361,3695\n238362,130\n238363,136\n238364,200\n238365,1274\n238366,714\n238366,1962\n238366,2965\n238366,111142\n238367,392\n238368,991\n238370,72\n238371,1773\n238372,146\n238372,92476\n238373,151\n238374,309\n238374,310\n238374,1400\n238375,875\n238377,1151\n238378,1844\n238379,994\n238380,255\n238381,1\n238382,859\n238383,179170\n238384,178\n238384,346\n238384,435\n238384,439\n238384,1033\n238384,1789\n238385,1181\n238386,631\n238387,994\n238388,389\n238389,179170\n238390,760\n238391,179170\n238392,200\n238393,2168\n238394,3949\n238395,238396\n238397,179170\n238398,467\n238399,994\n238400,344\n238401,285\n238402,893\n238403,255\n238404,1381\n238405,138686\n238406,175\n238407,4594\n238408,179170\n238409,179170\n238410,586\n238410,3876\n238411,8270\n238412,151\n238413,200\n238414,51006\n238415,636\n238416,1531\n238417,1151\n238418,918\n238419,238420\n238422,1210\n238423,2671\n238424,30\n238425,920\n238426,34\n238426,602\n238427,4192\n238427,4193\n238428,333\n238429,491\n238430,278\n238431,192\n238431,217\n238431,305\n238431,1188\n238431,4101\n238431,13538\n238432,435\n238433,147\n238433,406\n238434,179170\n238435,86416\n238436,179170\n238437,30\n238438,55849\n238439,536\n238440,7092\n238441,1531\n238442,238443\n238444,58\n238445,994\n238446,46\n238447,147\n238447,158\n238448,1220\n238449,302\n238450,238451\n238452,1773\n238453,485\n238454,179170\n238455,843\n238456,238457\n238458,179170\n238459,179170\n238460,81\n238461,919\n238462,557\n238463,2260\n238464,3260\n238465,393\n238466,278\n238467,227\n238468,1509\n238469,907\n238472,2735\n238473,1151\n238474,557\n238475,862\n238476,1235\n238476,1335\n238477,79\n238478,1298\n238479,1579\n238480,285\n238481,1181\n238482,1181\n238483,217\n238484,1133\n238485,577\n238486,238487\n238488,1888\n238489,250\n238489,1684\n238490,1381\n238491,1474\n238492,1326\n238493,102\n238494,408\n238495,1323\n238496,298\n238497,238498\n238497,240487\n238499,673\n238500,330\n238501,931\n238502,1359\n238503,220816\n238504,1644\n238505,1033\n238505,1612\n238506,225\n238507,179170\n238508,1882\n238509,417\n238510,220816\n238511,179170\n238513,278\n238514,1052\n238515,54\n238516,2775\n238517,1962\n238518,220816\n238520,220816\n238521,35486\n238522,142433\n238523,220816\n238524,248\n238525,179170\n238526,142870\n238527,779\n238528,1449\n238529,973\n238529,1284\n238530,220816\n238531,179170\n238532,240\n238532,1564\n238532,1818\n238533,220816\n238534,255\n238535,238536\n238537,220816\n238538,1132\n238539,285\n238540,1359\n238541,949\n238542,250\n238542,1684\n238543,220816\n238544,147\n238545,483\n238546,206\n238547,8180\n238548,220816\n238549,1227\n238549,86416\n238550,8270\n238551,1359\n238552,8270\n238553,795\n238554,278\n238555,2646\n238556,83\n238557,1381\n238558,138686\n238559,175\n238560,6424\n238561,167\n238562,238563\n238564,179170\n238565,68\n238566,1181\n238567,392\n238568,179170\n238569,2116\n238570,366\n238571,56\n238572,1181\n238572,220502\n238573,366\n238574,893\n238575,366\n238576,366\n238577,366\n238578,366\n238579,366\n238580,366\n238581,366\n238582,366\n238583,220816\n238584,366\n238585,179170\n238586,2373\n238587,1\n238588,1149\n238589,179170\n238590,220816\n238591,238592\n238593,7416\n238594,577\n238595,1149\n238596,179170\n238597,2923\n238598,20257\n238599,179170\n238600,179170\n238601,238602\n238603,577\n238604,179170\n238605,285\n238606,1983\n238607,147\n238608,179170\n238609,333\n238610,238611\n238612,240\n238613,2590\n238615,179170\n238616,8884\n238617,23701\n238618,333\n238619,179170\n238620,87\n238620,392\n238620,1453\n238620,1572\n238620,1836\n238620,2697\n238620,14458\n238621,2995\n238622,1807\n238623,872\n238624,920\n238625,10\n238626,1429\n238627,179170\n238628,2205\n238628,33424\n238629,18831\n238630,207\n238631,3370\n238631,45960\n238632,668\n238635,179170\n238636,3392\n238637,238638\n238639,1860\n238640,267\n238641,147\n238642,142870\n238643,238644\n238645,1858\n238646,1860\n238647,875\n238648,8788\n238649,151\n238651,1858\n238652,1860\n238653,872\n238654,1143\n238655,323\n238656,238657\n238658,238657\n238659,6556\n238661,238662\n238663,301\n238663,968\n238663,1293\n238663,1300\n238663,5662\n238663,84719\n238663,221730\n238663,231070\n238663,262493\n238664,6556\n238665,1359\n238666,444\n238667,1019\n238668,4611\n238669,302\n238670,1858\n238671,1860\n238672,1167\n238673,76096\n238674,640\n238675,640\n238676,640\n238677,640\n238679,640\n238680,592\n238681,360\n238682,238683\n238684,1688\n238686,861\n238687,10\n238687,175\n238687,5725\n238688,238689\n238690,1434\n238691,73570\n238692,444\n238692,932\n238692,968\n238692,1010\n238692,1122\n238692,1241\n238692,1522\n238693,1566\n238694,195\n238695,422\n238696,422\n238697,422\n238698,422\n238699,422\n238700,422\n238701,422\n238702,422\n238703,422\n238704,35486\n238705,422\n238706,255\n238707,422\n238708,1052\n238709,1962\n238710,2775\n238711,54\n238712,1151\n238714,6303\n238715,852\n238716,138686\n238717,175\n238720,1860\n238721,1858\n238722,980\n238723,392\n238724,809\n238724,17852\n238724,22293\n238724,142868\n238724,260905\n238725,2671\n238727,1891\n238728,4611\n238729,3769\n238730,1132\n238731,781\n238732,179170\n238733,980\n238734,54\n238735,1052\n238736,2775\n238737,1962\n238738,238739\n238741,907\n238742,422\n238742,602\n238743,140\n238744,932\n238745,707\n238746,611\n238747,60576\n238748,79\n238749,1179\n238750,179170\n238751,130\n238752,83\n238753,333\n238754,179170\n238755,1419\n238756,1238\n238757,217\n238760,1607\n238761,794\n238763,1452\n238764,60576\n238765,278\n238766,358\n238767,663\n238769,1566\n238770,2617\n238771,8270\n238771,72439\n238773,106\n238774,657\n238775,179170\n238776,22\n238777,577\n238778,73570\n238779,2379\n238780,1363\n238781,2989\n238781,2991\n238783,5192\n238784,372\n238785,79\n238786,4611\n238787,1805\n238789,3193\n238790,577\n238790,1070\n238791,238792\n238793,795\n238794,3804\n238795,209\n238796,8270\n238797,30\n238798,671\n238799,179170\n238801,874\n238801,2697\n238802,447\n238803,2775\n238804,447\n238805,2775\n238806,640\n238807,13980\n238808,1007\n238809,1722\n238810,4594\n238811,5440\n238812,37\n238813,873\n238814,42628\n238815,1010\n238816,1985\n238817,6888\n238818,248\n238819,875\n238820,4637\n238821,9001\n238822,1465\n238823,2191\n238824,1231\n238825,5662\n238826,1782\n238827,2266\n238828,2779\n238829,850\n238830,1282\n238831,3194\n238832,1877\n238833,3238\n238834,589\n238835,17346\n238836,13575\n238837,2979\n238838,1522\n238839,536\n238840,264\n238841,312\n238842,717\n238843,1151\n238844,1927\n238845,252\n238846,4172\n238847,207\n238848,1579\n238849,1745\n238850,538\n238851,388\n238852,1509\n238853,215\n238854,3422\n238855,1955\n238856,1016\n238857,328\n238858,5405\n238859,3193\n238860,202\n238861,332\n238862,525\n238863,2421\n238864,3207\n238865,225\n238866,1882\n238867,240\n238868,1805\n238869,9015\n238870,1149\n238871,1818\n238872,7233\n238873,302\n238874,3999\n238875,949\n238876,702\n238877,227\n238878,7270\n238879,859\n238880,9029\n238881,6955\n238882,577\n238883,9018\n238884,2209\n238885,1564\n238886,2443\n238887,1052\n238888,1177\n238889,34\n238889,35\n238890,1436\n238891,2224\n238892,720\n238893,1429\n238894,1274\n238895,1201\n238896,919\n238897,3474\n238898,623\n238899,1019\n238900,1756\n238901,278\n238902,44743\n238903,726\n238904,68\n238905,172621\n238906,615\n238907,1102\n238908,3695\n238909,1939\n238910,1294\n238911,1452\n238912,1849\n238913,2424\n238914,1381\n238915,1608\n238916,1132\n238917,622\n238918,104\n238919,5405\n238921,694\n238922,238923\n238925,189839\n238927,179170\n238929,31073\n238930,292\n238931,493\n238932,439\n238932,1559\n238933,56\n238934,422\n238935,1572\n238936,779\n238937,149\n238939,794\n238940,312\n238941,302\n238942,1385\n238943,333\n238944,1212\n238945,1860\n238946,1858\n238947,130\n238948,83\n238949,467\n238950,1860\n238951,1858\n238952,557\n238953,1298\n238954,435\n238955,151\n238956,4060\n238957,379\n238958,278\n238958,1151\n238960,1181\n238961,87\n238961,217\n238961,312\n238961,509\n238961,510\n238961,595\n238961,697\n238961,1151\n238961,1368\n238961,1453\n238961,3538\n238962,1858\n238963,1860\n238964,200\n238965,179170\n238966,1014\n238967,1014\n238968,179170\n238969,1014\n238970,515\n238971,1014\n238972,1014\n238973,328\n238974,340\n238975,255\n238976,843\n238977,2812\n238979,179170\n238980,138686\n238981,1010\n238982,175\n238983,1801\n238984,296\n238985,179170\n238986,1655\n238986,92476\n238989,179170\n238990,179170\n238991,179170\n238992,843\n238993,179170\n238994,179170\n238996,261\n238996,332\n238996,622\n238996,1240\n238999,255\n239000,893\n239001,215\n239002,671\n239003,151\n239004,240\n239005,920\n239006,4611\n239007,299\n239008,491\n239009,44\n239010,10\n239011,918\n239012,918\n239012,1160\n239013,179170\n239014,179170\n239015,1253\n239015,2995\n239016,772\n239017,1\n239018,179170\n239019,994\n239020,207\n239021,179170\n239025,179170\n239028,493\n239028,1266\n239031,1014\n239032,138686\n239033,175\n239035,557\n239038,252\n239038,1220\n239039,154408\n239041,55849\n239042,55849\n239043,55849\n239044,1882\n239047,631\n239048,2620\n239049,2266\n239050,217\n239051,4637\n239052,2421\n239053,30\n239054,3695\n239055,3538\n239057,179170\n239058,239059\n239060,35486\n239061,22\n239062,179170\n239063,56\n239064,422\n239065,781\n239066,1132\n239067,809\n239068,7092\n239069,30\n239070,1381\n239071,932\n239072,179170\n239073,179170\n239075,862\n239077,278\n239078,1181\n239079,1220\n239080,1220\n239081,252\n239082,251\n239083,2373\n239084,30\n239085,30236\n239086,1370\n239087,179170\n239088,557\n239089,138\n239090,865\n239091,557\n239092,137\n239093,1326\n239094,408\n239095,102\n239096,1323\n239097,88820\n239098,843\n239099,346\n239100,104\n239100,225\n239101,167\n239102,3695\n239103,179170\n239104,239105\n239107,994\n239108,1133\n239109,239110\n239109,242793\n239111,872\n239112,239113\n239114,239115\n239116,1285\n239117,1566\n239118,332\n239119,179170\n239120,1566\n239121,1515\n239122,302\n239123,111\n239124,239125\n239126,239125\n239127,239128\n239129,239130\n239131,861\n239132,392\n239132,1363\n239133,179170\n239134,525\n239135,3507\n239136,1309\n239137,3623\n239138,179170\n239139,1888\n239140,1285\n239141,1298\n239142,179170\n239143,1858\n239144,1860\n239145,1294\n239145,1590\n239146,137\n239147,30\n239148,455\n239149,631\n239150,215\n239151,179170\n239152,1010\n239152,1522\n239154,294\n239155,179170\n239156,239157\n239158,239159\n239160,138686\n239161,175\n239162,179170\n239163,346\n239164,147123\n239165,147123\n239166,1414\n239167,10\n239168,467\n239168,868\n239168,148742\n239169,577\n239170,171\n239171,3582\n239172,220816\n239173,239174\n239175,220816\n239176,138686\n239177,175\n239178,220816\n239179,179170\n239180,15573\n239181,7652\n239182,179170\n239183,4355\n239184,179170\n239185,250\n239185,1684\n239186,285\n239187,285\n239188,250\n239188,1684\n239189,239190\n239191,1181\n239192,220816\n239193,784\n239194,272\n239195,239196\n239197,1608\n239198,220816\n239199,239200\n239201,207\n239202,439\n239202,563\n239202,2367\n239203,220816\n239204,2379\n239205,56\n239206,422\n239207,48\n239208,3467\n239209,720\n239209,877\n239209,907\n239209,1732\n239209,1882\n239209,1955\n239209,2191\n239209,3422\n239209,142870\n239210,862\n239210,1001\n239211,8270\n239212,1531\n239213,1515\n239214,220816\n239215,483\n239217,272\n239217,980\n239217,15573\n239218,267\n239219,225\n239220,220816\n239221,557\n239222,4597\n239223,240\n239224,7358\n239224,7363\n239225,491\n239226,8884\n239228,239229\n239230,2244\n239231,1085\n239232,179170\n239233,2590\n239234,1849\n239235,137\n239236,328\n239237,431\n239237,1252\n239237,1253\n239237,2224\n239238,151\n239239,8270\n239240,30\n239241,717\n239241,784\n239242,151\n239243,1634\n239244,714\n239245,1238\n239246,285\n239247,83\n239248,366\n239249,366\n239250,366\n239251,366\n239252,269\n239253,366\n239254,366\n239255,366\n239256,134\n239257,589\n239258,366\n239259,6682\n239260,239261\n239262,30\n239263,30\n239264,151\n239265,479\n239266,3999\n239267,333\n239268,179170\n239269,333\n239270,239271\n239274,178\n239275,8270\n239275,72439\n239276,8180\n239277,151\n239278,269\n239279,179170\n239280,151\n239281,795\n239283,1298\n239284,5343\n239285,874\n239286,336\n239287,697\n239287,1769\n239288,874\n239289,179170\n239290,1019\n239291,30\n239292,211\n239292,366\n239292,500\n239292,718\n239292,1566\n239292,2668\n239293,35486\n239294,179170\n239296,1102\n239297,30\n239298,179170\n239299,349\n239301,2244\n239302,292\n239303,292\n239305,58\n239306,779\n239307,4192\n239307,4193\n239310,349\n239311,1837\n239312,309\n239312,310\n239313,30\n239314,3\n239315,349\n239316,515\n239317,30\n239318,58\n239319,239320\n239321,455\n239322,422\n239323,422\n239324,422\n239325,422\n239326,422\n239327,422\n239328,422\n239329,422\n239330,1983\n239331,83\n239333,779\n239334,994\n239335,179170\n239336,8180\n239337,200\n239338,239339\n239340,1634\n239342,30\n239343,142870\n239344,1983\n239345,393\n239346,240\n239346,264\n239346,1805\n239346,17309\n239347,424\n239348,1634\n239349,1515\n239350,55849\n239351,83\n239352,1381\n239353,918\n239353,1160\n239354,178\n239355,83\n239356,83\n239357,1181\n239359,4237\n239359,182162\n239360,1284\n239360,148742\n239361,200\n239362,779\n239363,55849\n239364,179170\n239365,805\n239366,1454\n239367,515\n239368,592\n239369,179170\n239370,430\n239371,302\n239372,430\n239373,44\n239374,4597\n239375,239376\n239378,179170\n239379,149\n239380,255\n239381,424\n239382,179170\n239383,30\n239385,918\n239386,1359\n239387,4597\n239388,179170\n239389,595\n239389,1572\n239390,179170\n239391,811\n239392,1359\n239393,795\n239394,430\n239395,158\n239395,301\n239395,615\n239395,779\n239395,8907\n239396,932\n239397,1359\n239398,1151\n239399,179170\n239400,510\n239401,1181\n239402,151\n239403,30\n239404,483\n239405,179170\n239406,1381\n239408,192\n239409,179170\n239410,56\n239411,422\n239412,1359\n239413,2607\n239414,1983\n239415,1238\n239416,1608\n239417,1326\n239418,102\n239419,1323\n239420,408\n239421,422\n239422,56\n239423,1149\n239424,1181\n239425,220816\n239426,275\n239427,6068\n239428,714\n239428,4193\n239429,272\n239429,590\n239430,862\n239431,23701\n239432,211\n239433,333\n239434,220816\n239435,220816\n239436,227669\n239438,220816\n239439,994\n239440,872\n239441,220816\n239442,1479\n239443,2460\n239444,390\n239445,2995\n239446,220816\n239447,1983\n239448,220816\n239449,179170\n239450,220816\n239451,179170\n239452,220816\n239453,8180\n239454,994\n239455,2048\n239456,30\n239457,1227\n239457,86416\n239458,707\n239461,275\n239462,37088\n239463,179170\n239464,179170\n239465,158\n239467,1068\n239468,239469\n239470,1707\n239471,179170\n239472,179170\n239473,285\n239474,344\n239475,107\n239476,1298\n239477,994\n239478,994\n239479,309\n239479,310\n239481,151\n239482,1181\n239483,1181\n239484,366\n239485,366\n239486,366\n239487,366\n239488,366\n239489,366\n239490,151\n239492,1983\n239494,178\n239495,1381\n239496,1796\n239498,285\n239499,406\n239500,795\n239501,83\n239502,1\n239503,8270\n239504,2146\n239505,1531\n239507,273\n239508,151\n239509,1773\n239510,1927\n239511,994\n239512,107\n239513,2416\n239513,2417\n239514,292\n239515,239516\n239517,338\n239518,298\n239519,1133\n239520,3538\n239521,34\n239521,35\n239521,200\n239521,215\n239521,392\n239521,1033\n239521,1715\n239521,1805\n239521,1882\n239521,4192\n239521,4193\n239521,5547\n239521,8822\n239522,366\n239523,994\n239525,20359\n239525,72439\n239526,255\n239527,8992\n239528,239529\n239530,35486\n239531,179170\n239532,590\n239532,2266\n239533,714\n239534,34\n239534,671\n239535,1010\n239536,83\n239537,1983\n239538,1773\n239539,81070\n239540,344\n239541,285\n239542,994\n239543,34\n239543,35\n239544,994\n239545,143287\n239546,1102\n239547,707\n239548,60576\n239549,1381\n239550,994\n239551,1891\n239551,20535\n239552,137\n239553,1515\n239554,346\n239556,795\n239557,406\n239558,994\n239559,233\n239560,875\n239561,30\n239562,151\n239563,171\n239564,1298\n239565,30\n239566,34\n239566,35\n239566,104\n239566,1368\n239567,1132\n239568,781\n239569,200\n239570,349\n239571,104\n239572,366\n239573,32\n239574,795\n239575,8270\n239577,707\n239578,30\n239579,4078\n239580,1634\n239581,1634\n239582,239583\n239584,56\n239585,422\n239586,1119\n239587,657\n239588,2719\n239589,346\n239590,44\n239591,1160\n239592,34\n239592,35\n239593,1181\n239594,239595\n239596,239597\n239598,1181\n239599,349\n239600,346\n239601,149\n239602,255\n239603,30\n239604,30\n239605,483\n239606,918\n239607,841\n239608,19\n239609,159365\n239610,30\n239611,779\n239612,30\n239613,1033\n239614,138686\n239615,175\n239616,1590\n239617,1102\n239618,1102\n239619,10\n239620,994\n239621,58\n239622,46\n239623,58\n239624,46\n239625,994\n239626,1102\n239627,2017\n239627,4193\n239627,94134\n239628,859\n239628,182162\n239629,18726\n239630,1276\n239631,68\n239632,1773\n239633,336\n239634,1983\n239635,138686\n239636,175\n239637,3623\n239638,3623\n239639,366\n239640,62686\n239641,30\n239642,366\n239643,433\n239644,30\n239645,2116\n239646,707\n239647,179170\n239648,30\n239649,179170\n239650,1531\n239651,30\n239652,30\n239653,557\n239654,557\n239655,557\n239656,1983\n239657,818\n239658,30\n239660,1837\n239661,707\n239662,491\n239663,1849\n239664,56\n239665,422\n239666,179170\n239668,779\n239670,56\n239671,422\n239672,30\n239673,433\n239674,861\n239675,994\n239676,5405\n239677,255\n239678,239679\n239680,795\n239681,1016\n239682,1773\n239683,389\n239684,30\n239685,392\n239686,65\n239687,56\n239688,422\n239689,179170\n239690,994\n239691,138686\n239693,175\n239694,17309\n239695,2292\n239696,151\n239697,779\n239698,30\n239699,285\n239700,1608\n239701,1773\n239702,184\n239703,195\n239704,179170\n239705,714\n239706,179170\n239707,239708\n239709,589\n239710,239711\n239712,28755\n239712,72439\n239713,536\n239714,1102\n239715,239716\n239717,179170\n239718,366\n239719,1227\n239719,86416\n239721,142473\n239722,292\n239723,239724\n239725,294\n239726,841\n239727,296\n239728,298\n239729,179170\n239730,8991\n239731,179170\n239732,4475\n239733,3804\n239734,119\n239735,179170\n239736,179170\n239737,707\n239738,30\n239739,1368\n239740,30\n239741,5405\n239742,200\n239743,179170\n239744,1634\n239745,390\n239746,239747\n239748,1181\n239749,31977\n239750,239751\n239752,1707\n239753,920\n239754,994\n239754,1432\n239754,2088\n239754,2674\n239754,4571\n239754,154690\n239755,1127\n239755,1893\n239756,179170\n239757,111\n239757,289\n239757,94134\n239758,1247\n239758,164572\n239759,1247\n239759,164572\n239760,1247\n239760,164572\n239761,1309\n239762,83\n239763,1531\n239764,30\n239765,366\n239766,433\n239767,5343\n239768,577\n239770,60576\n239771,97\n239772,30\n239774,120\n239775,1151\n239775,4193\n239776,762\n239776,124668\n239776,171641\n239776,187176\n239776,227669\n239777,34\n239777,671\n239778,8373\n239779,491\n239780,640\n239781,640\n239782,640\n239783,640\n239784,779\n239785,640\n239786,640\n239787,827\n239788,302\n239788,2116\n239789,779\n239790,179170\n239791,187176\n239792,55849\n239793,346\n239794,171\n239795,2620\n239796,35486\n239797,239798\n239799,158\n239799,1181\n239800,346\n239801,671\n239802,3\n239803,247\n239803,516\n239804,920\n239805,875\n239806,104\n239807,14126\n239808,875\n239809,827\n239811,794\n239812,422\n239813,422\n239814,422\n239815,422\n239816,422\n239817,422\n239818,422\n239819,422\n239820,422\n239821,718\n239822,179170\n239823,422\n239824,138686\n239825,422\n239826,175\n239827,58\n239828,994\n239829,46\n239830,408\n239831,3623\n239832,717\n239833,236180\n239834,1849\n239835,179170\n239836,980\n239838,996\n239839,239840\n239841,1882\n239842,781\n239843,1132\n239844,1359\n239845,392\n239846,1634\n239847,1368\n239848,383\n239849,30\n239851,301\n239851,417\n239851,1010\n239851,1635\n239852,1238\n239853,252\n239854,1220\n239855,251\n239856,179170\n239857,179170\n239858,1452\n239859,1359\n239860,2750\n239861,781\n239862,1132\n239863,148742\n239864,781\n239865,1132\n239867,875\n239868,392\n239869,772\n239870,1326\n239871,392\n239872,278\n239873,781\n239874,1132\n239875,349\n239876,9457\n239877,179170\n239878,818\n239879,204093\n239880,1634\n239881,1238\n239882,83\n239884,1359\n239885,841\n239886,2620\n239887,875\n239888,366\n239889,631\n239890,8270\n239891,1007\n239892,1345\n239893,269\n239894,1983\n239895,1\n239896,577\n239897,146\n239897,92476\n239899,1882\n239900,422\n239901,56\n239902,2244\n239903,15179\n239904,1634\n239906,467\n239907,843\n239908,138686\n239912,843\n239913,535\n239913,663\n239915,167\n239915,301\n239915,1284\n239916,1707\n239917,30\n239918,626\n239919,1359\n239920,236180\n239921,779\n239922,149\n239923,302\n239924,6059\n239925,671\n239926,30\n239927,239928\n239929,272\n239930,8308\n239931,202\n239932,7416\n239933,2244\n239934,1284\n239934,148742\n239935,388\n239937,79\n239939,217\n239940,179170\n239941,3695\n239942,1893\n239943,146\n239943,285\n239943,406\n239943,1655\n239943,92476\n239944,44\n239945,147\n239946,179170\n239949,779\n239949,2931\n239949,8270\n239950,302\n239951,73570\n239952,5265\n239953,1085\n239954,1227\n239954,86416\n239955,439\n239956,1007\n239957,184\n239958,239959\n239960,592\n239961,30\n239962,217\n239963,79\n239964,179170\n239966,805\n239967,146\n239967,158\n239967,92476\n239968,148742\n239969,193661\n239970,19443\n239972,392\n239973,697\n239974,4760\n239975,1860\n239976,6955\n239977,3612\n239978,6059\n239979,595\n239980,5658\n239981,2274\n239982,4252\n239983,623\n239984,577\n239984,859\n239985,1359\n239986,760\n239986,1631\n239987,485\n239988,298\n239989,30\n239990,138686\n239991,175\n239992,103860\n239993,302\n239994,439\n239995,3296\n239996,875\n239997,861\n239998,515\n239999,563\n240000,1181\n240001,1087\n240002,1359\n240004,994\n240005,236180\n240006,14483\n240007,435\n240008,994\n240009,200\n240010,117163\n240011,1417\n240012,1132\n240013,781\n240014,302\n240015,843\n240016,149\n240017,1274\n240019,240020\n240021,3585\n240022,83\n240023,592\n240024,44\n240025,23783\n240026,2373\n240027,138686\n240028,175\n240029,30\n240030,68\n240031,852\n240032,273\n240033,1019\n240034,636\n240035,779\n240036,360\n240037,55849\n240038,259\n240038,272\n240038,4611\n240039,202\n240040,255\n240042,304\n240043,1274\n240043,2646\n240044,148742\n240045,452\n240045,1266\n240046,8180\n240047,873\n240049,918\n240050,2205\n240050,33424\n240050,245910\n240051,918\n240051,1160\n240052,1\n240052,147\n240053,30\n240054,104\n240055,149534\n240056,143287\n240058,996\n240058,1388\n240059,142426\n240060,1837\n240061,179170\n240062,309\n240062,310\n240064,79\n240065,220816\n240066,1181\n240068,83\n240069,302\n240070,994\n240071,179170\n240072,179170\n240073,393\n240073,590\n240074,54\n240075,994\n240076,994\n240077,994\n240078,179170\n240079,994\n240080,491\n240081,775\n240082,333\n240082,980\n240082,15573\n240083,179170\n240085,640\n240086,30\n240087,30\n240088,483\n240089,1458\n240090,146\n240090,92476\n240091,55849\n240092,220816\n240093,202\n240094,697\n240095,1132\n240096,781\n240097,3260\n240098,841\n240099,389\n240100,7155\n240101,179170\n240102,781\n240103,1132\n240104,2411\n240105,30\n240106,220816\n240107,491\n240108,1033\n240110,30\n240111,994\n240112,932\n240113,151\n240114,95554\n240115,220816\n240116,35486\n240117,781\n240118,1132\n240119,795\n240120,220816\n240121,1007\n240122,459\n240123,7092\n240124,1608\n240125,1893\n240126,1801\n240127,220816\n240128,1001\n240129,631\n240130,2782\n240131,72\n240132,35486\n240133,366\n240134,8855\n240135,1188\n240136,366\n240137,8854\n240138,55849\n240139,1326\n240140,102\n240141,1323\n240142,408\n240143,536\n240144,3582\n240145,707\n240146,220816\n240147,30\n240148,636\n240149,278\n240150,1962\n240151,424\n240152,220816\n240153,247\n240154,2205\n240154,33424\n240155,30\n240156,220816\n240157,1192\n240157,4165\n240158,2266\n240159,179170\n240160,309\n240160,310\n240161,142870\n240162,220816\n240163,179170\n240164,485\n240165,298\n240166,4810\n240167,220816\n240168,4192\n240168,4193\n240169,240170\n240171,3507\n240172,220816\n240173,1058\n240173,1796\n240174,99\n240174,158\n240174,3895\n240174,244874\n240175,179170\n240176,220816\n240177,2620\n240178,2244\n240179,179170\n240180,179170\n240181,148742\n240182,220816\n240183,422\n240184,932\n240185,704\n240186,1282\n240187,3\n240188,283\n240189,179170\n240190,6955\n240191,217\n240192,220816\n240193,30\n240194,220816\n240195,2296\n240196,179170\n240197,326\n240198,30\n240199,356\n240200,179170\n240201,220816\n240202,1801\n240203,1955\n240204,1227\n240204,86416\n240205,30\n240206,1544\n240207,760\n240208,30\n240209,994\n240210,220816\n240211,247\n240212,372\n240213,63\n240214,1368\n240215,30\n240216,2744\n240217,151\n240218,1227\n240218,86416\n240219,1132\n240220,781\n240221,220816\n240222,30\n240224,781\n240225,1132\n240226,1844\n240227,220816\n240228,330\n240229,255\n240230,217\n240230,1133\n240230,1522\n240231,994\n240232,138686\n240233,175\n240234,178\n240234,333\n240235,424\n240236,707\n240237,220816\n240238,779\n240239,179170\n240240,179170\n240241,668\n240242,285\n240243,344\n240244,179170\n240245,7416\n240246,516\n240247,920\n240248,704\n240249,179170\n240250,3804\n240251,217\n240252,779\n240253,366\n240254,200\n240255,30\n240256,247\n240257,636\n240258,195\n240258,27217\n240259,179170\n240260,179170\n240261,179170\n240262,179170\n240263,134\n240264,195\n240265,2626\n240266,220816\n240267,255\n240268,269\n240269,900\n240270,147\n240271,220816\n240272,179170\n240273,795\n240274,240275\n240276,151\n240277,138686\n240278,175\n240279,56\n240280,422\n240281,63\n240282,117163\n240283,192\n240284,581\n240285,240286\n240287,1102\n240288,20359\n240289,346\n240290,563\n240291,920\n240292,220816\n240293,366\n240294,417\n240295,285\n240296,298\n240297,8501\n240298,920\n240299,220816\n240301,872\n240302,795\n240303,107\n240304,220816\n240305,2266\n240306,77\n240307,1368\n240308,1181\n240309,1085\n240310,1381\n240311,285\n240312,328\n240313,388\n240314,30\n240316,167\n240317,2424\n240318,220816\n240319,222\n240320,697\n240320,1769\n240321,1572\n240322,7155\n240323,240324\n240323,240857\n240325,4192\n240325,4193\n240326,301\n240327,240328\n240329,240330\n240331,1821\n240331,21736\n240332,596\n240333,333\n240335,13980\n240336,626\n240337,932\n240338,255\n240339,10\n240340,179170\n240341,179170\n240342,240343\n240345,2274\n240346,1151\n240347,1210\n240348,6068\n240349,307\n240349,7124\n240352,178\n240352,15179\n240353,1\n240354,1247\n240354,164572\n240355,15179\n240356,179170\n240357,818\n240358,1860\n240359,1858\n240360,240361\n240362,1210\n240363,6303\n240364,1118\n240365,491\n240366,640\n240367,640\n240368,640\n240369,240\n240370,640\n240371,640\n240372,640\n240373,273\n240373,422\n240373,136072\n240374,644\n240375,346\n240376,2995\n240377,2266\n240378,346\n240379,1014\n240380,349\n240381,344\n240382,285\n240384,2590\n240385,1962\n240386,346\n240387,41\n240388,2315\n240389,809\n240390,360\n240390,1893\n240391,147\n240392,30\n240393,35486\n240395,439\n240396,120\n240397,289\n240397,94134\n240398,1949\n240399,34\n240399,35\n240400,20257\n240401,852\n240402,920\n240403,818\n240404,252\n240405,1220\n240406,251\n240407,1571\n240408,55849\n240409,346\n240410,1132\n240411,781\n240412,835\n240413,10\n240413,113156\n240414,379\n240415,30\n240416,509\n240417,206\n240418,1257\n240419,34\n240419,35\n240420,781\n240421,1132\n240422,1231\n240423,189839\n240424,954\n240424,10318\n240425,217\n240426,1\n240427,124668\n240428,1782\n240429,932\n240430,366\n240431,433\n240432,73570\n240433,5366\n240434,1608\n240435,55849\n240436,500\n240437,366\n240438,843\n240439,151\n240440,83\n240441,781\n240442,1132\n240443,779\n240444,1927\n240445,138\n240446,872\n240447,994\n240448,50\n240448,147\n240448,406\n240448,779\n240449,1001\n240450,179170\n240451,252\n240452,1220\n240453,251\n240454,433\n240455,81\n240456,192\n240457,124668\n240458,179170\n240459,1132\n240460,1454\n240461,138686\n240462,175\n240463,285\n240464,344\n240465,994\n240466,302\n240467,301\n240468,422\n240469,56\n240470,158\n240471,779\n240472,631\n240473,83\n240474,136\n240474,137\n240475,1085\n240476,704\n240476,852\n240477,2312\n240478,333\n240479,994\n240480,3623\n240481,5718\n240482,1400\n240483,3623\n240484,175\n240485,149\n240486,442\n240488,179170\n240489,87\n240490,3623\n240491,240492\n240493,1181\n240494,640\n240495,932\n240495,968\n240495,1010\n240496,3623\n240497,227669\n240498,142870\n240499,3623\n240501,10\n240502,179170\n240503,302\n240504,1014\n240505,1014\n240506,1014\n240508,1014\n240509,179170\n240510,1014\n240511,467\n240512,636\n240513,3623\n240514,720\n240515,509\n240516,442\n240517,7092\n240518,3623\n240519,200\n240520,248\n240521,200\n240522,179170\n240523,179170\n240524,515\n240525,179170\n240526,714\n240526,2205\n240526,33424\n240527,179170\n240528,344\n240529,285\n240530,3623\n240531,6556\n240532,818\n240533,120\n240534,8270\n240535,30\n240537,30\n240538,206\n240539,1832\n240540,48\n240541,30\n240542,30\n240543,30\n240544,56\n240545,422\n240546,200\n240547,138686\n240548,272\n240549,175\n240550,3623\n240551,273\n240552,193129\n240553,801\n240554,3623\n240555,781\n240556,1132\n240557,147\n240558,23783\n240559,811\n240560,79\n240561,179170\n240562,3507\n240563,1893\n240564,875\n240565,142405\n240566,1749\n240567,255\n240568,55849\n240569,1282\n240570,151\n240571,179170\n240572,83\n240573,1608\n240574,206\n240575,179170\n240576,994\n240577,918\n240578,151\n240579,30\n240580,447\n240581,2775\n240582,44\n240583,3623\n240584,1127\n240585,932\n240586,179170\n240587,557\n240588,392\n240589,30\n240591,83\n240592,337\n240592,15573\n240593,179170\n240594,30\n240595,1860\n240596,1858\n240597,30\n240598,278\n240599,220816\n240600,483\n240601,30\n240602,2923\n240603,220816\n240604,30\n240605,30\n240607,222\n240608,179170\n240609,9030\n240610,1287\n240611,818\n240612,179170\n240613,83\n240614,1773\n240614,142870\n240615,697\n240616,13919\n240617,850\n240618,179170\n240619,149\n240620,48\n240621,55849\n240622,55849\n240623,392\n240625,200\n240627,861\n240628,1102\n240629,34\n240629,671\n240630,590\n240630,2995\n240631,4193\n240631,8373\n240632,71\n240633,850\n240634,406\n240635,4\n240635,5\n240635,104\n240635,805\n240635,861\n240635,1212\n240635,2105\n240636,200\n240637,58\n240638,994\n240639,46\n240640,179170\n240641,179170\n240642,179170\n240643,264\n240644,7092\n240646,179170\n240647,309\n240647,310\n240648,142870\n240649,83\n240650,179170\n240651,1243\n240652,179170\n240653,179170\n240654,30\n240655,35486\n240656,179170\n240657,278\n240658,289\n240658,94134\n240659,83\n240660,278\n240661,2646\n240662,5101\n240664,86416\n240665,1014\n240666,1844\n240667,1385\n240668,192\n240669,179170\n240670,515\n240672,83\n240673,30\n240674,179170\n240675,179170\n240676,435\n240677,30\n240678,179170\n240679,179170\n240680,697\n240681,264\n240682,179170\n240683,1707\n240684,406\n240685,4545\n240685,56150\n240686,179170\n240687,30\n240688,179170\n240689,1238\n240690,179170\n240691,707\n240692,843\n240693,72764\n240694,1452\n240695,252\n240695,1385\n240696,154408\n240697,154408\n240698,217\n240699,433\n240700,1252\n240701,1085\n240702,707\n240703,179170\n240704,1796\n240705,615\n240706,9025\n240707,179170\n240708,417\n240709,2367\n240710,240711\n240712,30\n240713,623\n240713,1805\n240714,1877\n240715,179170\n240716,1243\n240717,30\n240718,30\n240719,424\n240720,3623\n240721,707\n240722,179170\n240723,390\n240724,4597\n240725,285\n240726,250\n240726,1684\n240727,99\n240728,994\n240729,707\n240730,151\n240731,1132\n240732,2367\n240733,179170\n240734,1556\n240735,147\n240736,240737\n240738,179170\n240739,236180\n240740,1235\n240740,1335\n240741,179170\n240742,577\n240743,1253\n240743,2617\n240744,424\n240745,2779\n240746,137\n240747,3413\n240748,83\n240749,707\n240750,264\n240751,592\n240752,1363\n240753,63\n240754,2373\n240755,1181\n240756,272\n240757,211\n240758,333\n240759,195\n240760,3623\n240761,240762\n240763,179170\n240764,179170\n240765,179170\n240766,99\n240767,313\n240768,313\n240769,1522\n240769,2083\n240769,5301\n240770,1821\n240770,21736\n240771,663\n240772,179170\n240773,179170\n240774,220816\n240775,220816\n240776,298\n240777,220816\n240778,220816\n240779,179170\n240780,240\n240781,31977\n240782,179170\n240783,220816\n240784,179170\n240785,247\n240785,2867\n240785,2868\n240786,222\n240787,149\n240788,220816\n240789,179170\n240790,772\n240790,2146\n240790,3297\n240791,818\n240792,285\n240793,588\n240793,590\n240793,1419\n240794,2750\n240795,1227\n240795,86416\n240796,220816\n240797,151\n240798,220816\n240799,240\n240800,433\n240800,809\n240801,220816\n240802,137\n240803,30\n240804,220816\n240805,795\n240806,220816\n240807,220816\n240808,818\n240809,4\n240809,5\n240809,355\n240809,704\n240810,1\n240811,818\n240812,202\n240813,14366\n240815,1634\n240816,272\n240817,171\n240819,267\n240820,795\n240821,240822\n240821,242970\n240821,256127\n240821,261387\n240821,264086\n240823,137\n240824,366\n240825,179170\n240826,366\n240827,179170\n240828,366\n240829,8270\n240830,310\n240830,224488\n240831,220816\n240832,44\n240833,240834\n240835,220816\n240836,5265\n240837,615\n240838,63\n240838,202\n240838,247\n240838,516\n240839,714\n240840,34\n240840,1151\n240841,4193\n240841,8373\n240842,160\n240843,240844\n240845,179170\n240846,179170\n240847,179170\n240848,269\n240849,220816\n240850,240851\n240852,138686\n240853,175\n240854,240855\n240858,8270\n240859,1607\n240861,220816\n240862,1096\n240863,805\n240864,233\n240865,1326\n240866,875\n240868,4611\n240871,781\n240872,1132\n240873,220816\n240874,6424\n240875,745\n240877,147\n240878,406\n240879,30\n240880,994\n240881,1224\n240882,179170\n240883,179170\n240884,1085\n240885,340\n240886,1359\n240887,640\n240888,640\n240889,795\n240889,193129\n240890,640\n240891,640\n240892,1181\n240893,104\n240894,640\n240895,657\n240896,8270\n240897,220816\n240898,179170\n240900,356\n240900,2590\n240901,707\n240903,422\n240904,56\n240905,422\n240906,422\n240907,422\n240908,422\n240910,422\n240911,422\n240912,422\n240913,493\n240914,1132\n240915,1608\n240916,422\n240917,422\n240918,422\n240919,422\n240920,1608\n240921,1132\n240922,30\n240923,138686\n240924,175\n240925,3258\n240927,35486\n240928,1608\n240929,1132\n240930,579\n240931,264\n240932,422\n240933,707\n240934,30\n240935,1241\n240937,1132\n240938,1608\n240939,920\n240941,217\n240942,577\n240943,3756\n240944,3623\n240945,1019\n240946,301\n240946,615\n240946,968\n240946,1293\n240946,1300\n240946,1782\n240946,2217\n240946,2595\n240946,3422\n240946,3756\n240946,42598\n240946,83493\n240946,84160\n240946,227376\n240947,1132\n240948,1608\n240950,147\n240951,179170\n240952,1132\n240953,1608\n240954,707\n240955,356\n240956,360\n240957,1132\n240958,1608\n240959,360\n240960,707\n240961,1608\n240962,1132\n240963,1860\n240964,1858\n240965,1608\n240966,1132\n240967,707\n240968,1274\n240969,1608\n240970,1132\n240971,1238\n240972,71\n240973,73570\n240974,2553\n240975,1132\n240976,1608\n240977,7358\n240977,7363\n240978,179170\n240979,179170\n240980,1608\n240981,1132\n240982,1132\n240983,1608\n240984,3094\n240985,179170\n240986,2701\n240987,1608\n240988,1132\n240989,240990\n240991,1452\n240992,60576\n240993,932\n240994,707\n240995,379\n240995,536\n240995,694\n240996,389\n240997,1167\n240998,179170\n240999,1858\n241000,1860\n241001,500\n241002,366\n241003,491\n241004,106\n241004,586\n241004,17772\n241006,707\n241008,2590\n241009,8270\n241010,1359\n241011,179170\n241012,158\n241013,1160\n241014,252\n241015,1220\n241016,707\n241018,179170\n241019,1644\n241020,360\n241021,1805\n241021,8177\n241022,240\n241023,217\n241024,83\n241025,1363\n241026,217\n241027,55849\n241028,217\n241029,707\n241031,60576\n241032,707\n241033,302\n241034,703\n241035,83\n241036,760\n241037,179170\n241038,1188\n241039,233\n241040,22\n241040,211\n241041,707\n241042,269\n241044,2620\n241044,124668\n241045,2590\n241046,875\n241047,56\n241048,422\n241049,1707\n241050,202\n241051,992\n241052,241053\n241054,360\n241055,30\n241056,83\n241057,187176\n241058,1012\n241059,1140\n241061,999\n241062,1983\n241063,3623\n241064,500\n241064,663\n241065,671\n241066,1127\n241067,1888\n241068,875\n241069,79\n241070,704\n241071,3769\n241072,707\n241073,647\n241074,1392\n241075,994\n241076,704\n241078,3623\n241079,315\n241080,447\n241081,2775\n241082,994\n241083,252\n241083,1385\n241084,136\n241085,843\n241087,206\n241088,22580\n241089,875\n241090,388\n241092,179170\n241093,479\n241094,3623\n241095,875\n241096,22580\n241097,215276\n241098,49057\n241100,714\n241101,590\n241101,2266\n241102,8373\n241104,179170\n241105,302\n241106,1707\n241107,462\n241108,102\n241109,779\n241109,141912\n241110,137\n241111,707\n241112,634\n241112,852\n241113,1353\n241114,261\n241114,805\n241115,1608\n241116,1132\n241117,1181\n241118,200\n241119,264\n241120,179170\n241121,264\n241122,1608\n241123,1132\n241124,491\n241125,58\n241126,994\n241127,46\n241128,3623\n241129,171\n241130,7572\n241131,1962\n241132,179170\n241133,138686\n241134,175\n241135,179170\n241136,333\n241137,179170\n241138,809\n241139,179170\n241140,893\n241142,2045\n241143,694\n241144,179170\n241145,1927\n241147,146\n241147,92476\n241148,179170\n241149,222\n241149,536\n241149,657\n241150,3623\n241151,875\n241152,104\n241152,557\n241152,953\n241152,954\n241152,5405\n241153,179170\n241154,179170\n241156,1085\n241157,179170\n241158,3695\n241159,827\n241160,406\n241162,1231\n241164,79\n241165,406\n241166,179170\n241167,818\n241168,146\n241168,92476\n241169,647\n241170,146\n241170,92476\n241171,344\n241172,344\n241173,647\n241174,1085\n241175,83\n241176,4455\n241177,422\n241178,56\n241179,1353\n241180,102\n241181,852\n241182,493\n241183,99\n241184,392\n241185,850\n241186,252\n241187,1220\n241188,251\n241189,149\n241190,1659\n241191,211\n241192,255\n241194,142426\n241195,179170\n241196,252\n241197,1220\n241198,251\n241199,467\n241199,1033\n241199,127158\n241200,2436\n241201,241202\n241204,83\n241205,179170\n241206,312\n241207,779\n241208,934\n241208,1449\n241209,255\n241210,805\n241211,1452\n241212,1893\n241213,1789\n241214,1983\n241215,48\n241216,56\n241217,422\n241218,146\n241218,92476\n241219,1882\n241221,2083\n241222,1001\n241223,1782\n241224,893\n241225,179170\n241226,179170\n241227,406\n241228,104\n241229,1116\n241230,8541\n241231,707\n241232,1132\n241233,3623\n241234,44\n241235,1860\n241236,1858\n241237,160\n241238,200\n241239,179170\n241240,179170\n241241,179170\n241242,220816\n241243,223568\n241244,2168\n241245,179170\n241246,515\n241247,596\n241248,406\n241249,302\n241250,179170\n241251,483\n241252,179170\n241253,22\n241254,2373\n241255,1556\n241256,2620\n241257,146\n241257,92476\n241258,1381\n241259,179170\n241260,220816\n241261,818\n241262,309\n241262,310\n241263,389\n241264,151\n241265,179170\n241266,447\n241266,538\n241266,1294\n241267,349\n241268,3\n241269,3\n241270,1332\n241271,8854\n241272,302\n241272,63471\n241273,3804\n241275,920\n241276,7092\n241277,202\n241278,179170\n241279,179170\n241280,58\n241281,994\n241282,46\n241283,392\n241284,7124\n241285,220816\n241286,932\n241287,248\n241288,366\n241289,184\n241289,1556\n241290,302\n241291,455\n241292,34\n241292,35\n241293,364\n241294,278\n241295,557\n241296,14126\n241297,30\n241298,252\n241299,795\n241300,77\n241301,379\n241302,217\n241303,5906\n241304,557\n241305,626\n241306,278\n241307,137\n241308,862\n241309,1608\n241310,1556\n241311,151\n241312,1181\n241313,1326\n241314,1323\n241315,102\n241316,408\n241317,120\n241317,704\n241317,868\n241317,1140\n241317,73570\n241317,148742\n241318,406\n241319,283\n241320,875\n241321,179170\n241322,179170\n241323,179170\n241324,366\n241325,179170\n241326,605\n241327,760\n241328,241328\n241329,1509\n241330,310\n241330,224488\n241331,861\n241332,9029\n241333,875\n241334,1381\n241335,1332\n241335,1955\n241337,920\n241338,1474\n241339,875\n241340,673\n241341,875\n241342,241343\n241344,217\n241344,779\n241344,872\n241344,1370\n241345,55849\n241346,55849\n241347,55849\n241348,491\n241349,55849\n241350,151\n241351,30\n241352,994\n241354,349\n241354,3260\n241355,55849\n241356,1634\n241357,113156\n241358,779\n241359,227\n241360,179170\n241361,83\n241362,241363\n241364,30\n241365,636\n241366,179170\n241367,2646\n241368,450\n241369,255\n241370,179170\n241371,1968\n241372,563\n241373,563\n241374,220816\n241375,1509\n241376,179170\n241377,1844\n241378,392\n241379,142405\n241379,142870\n241380,147\n241381,220816\n241382,138686\n241383,175\n241384,179170\n241385,220816\n241386,206\n241387,179170\n241388,179170\n241389,138686\n241390,1359\n241391,206\n241393,1849\n241394,241395\n241397,994\n241398,1623\n241399,241400\n241401,151\n241402,994\n241403,54\n241404,1007\n241405,179170\n241406,220816\n241407,220816\n241408,516\n241409,563\n241410,535\n241411,1381\n241412,241413\n241414,151\n241415,8270\n241416,305\n241417,323\n241418,220816\n241419,875\n241420,3623\n241422,220816\n241423,220816\n241424,10\n241425,220816\n241426,285\n241427,250\n241427,1684\n241428,779\n241429,179170\n241430,30\n241431,1181\n241432,86\n241433,179170\n241434,920\n241435,918\n241436,241437\n241438,1\n241439,1849\n241440,577\n241441,406\n241442,241443\n241444,179170\n241445,920\n241446,1127\n241447,994\n241448,3138\n241450,179170\n241451,5662\n241452,3138\n241453,179170\n241454,179170\n241455,220816\n241456,422\n241457,179170\n241458,649\n241460,718\n241461,1368\n241462,179170\n241463,2116\n241464,515\n241465,195\n241465,74719\n241466,366\n241467,366\n241468,366\n241469,285\n241470,366\n241471,671\n241472,220816\n241473,220816\n241474,241475\n241476,220816\n241477,138686\n241478,175\n241479,861\n241480,147\n241481,179170\n241482,37\n241483,5265\n241484,241485\n241486,2590\n241487,408\n241488,431\n241488,589\n241488,631\n241488,1001\n241488,1474\n241488,2590\n241488,8884\n241488,44725\n241489,220816\n241490,34\n241490,35\n241491,392\n241494,784\n241496,1805\n241497,1033\n241498,179170\n241499,302\n241501,1381\n241502,140\n241503,30\n241505,784\n241507,217\n241507,222\n241508,35486\n241509,392\n241510,179170\n241511,1293\n241514,2526\n241515,872\n241516,6661\n241518,1429\n241519,911\n241520,805\n241520,1353\n241522,179170\n241523,1556\n241524,366\n241525,220816\n241526,19010\n241527,387\n241528,4190\n241529,220816\n241530,640\n241531,640\n241532,301\n241533,1235\n241533,1335\n241536,178\n241536,442\n241537,241538\n241539,1707\n241540,628\n241541,422\n241542,422\n241543,422\n241544,422\n241545,422\n241546,422\n241547,422\n241548,302\n241549,422\n241550,422\n241551,333\n241552,422\n241555,35486\n241556,30\n241557,147\n241557,149\n241559,1252\n241559,1253\n241561,1402\n241562,328\n241563,781\n241564,1132\n241565,149\n241566,781\n241567,1132\n241568,422\n241569,1238\n241570,302\n241571,220816\n241572,179170\n241574,1452\n241575,63471\n241576,1707\n241577,220816\n241578,994\n241579,1893\n241580,1181\n241581,668\n241582,301\n241583,344\n241584,285\n241586,843\n241587,1608\n241588,1132\n241589,1326\n241590,207\n241591,493\n241592,994\n241593,843\n241594,167\n241594,289\n241594,309\n241594,310\n241594,577\n241594,590\n241594,1181\n241594,1462\n241594,1509\n241594,2209\n241594,2991\n241594,3804\n241594,56150\n241594,94134\n241595,994\n241596,1882\n241597,3094\n241598,309\n241598,310\n241599,285\n241600,344\n241601,852\n241602,852\n241603,301\n241603,3804\n241604,17309\n241605,707\n241606,143\n241607,312\n241608,994\n241610,781\n241611,1132\n241612,389\n241613,1707\n241614,338\n241614,1707\n241615,241616\n241617,1132\n241618,1608\n241619,220816\n241620,192\n241621,875\n241622,3623\n241623,875\n241624,577\n241625,83\n241626,4\n241626,5\n241627,179170\n241628,30\n241629,994\n241630,151\n241630,202\n241631,259\n241632,781\n241633,1132\n241634,422\n241634,5405\n241636,875\n241638,862\n241639,227669\n241640,694\n241641,264\n241641,5440\n241642,781\n241643,1132\n241644,200\n241645,30\n241646,592\n241647,1326\n241648,366\n241649,781\n241650,1132\n241651,179170\n241652,241653\n241654,657\n241656,994\n241657,1313\n241659,994\n241661,1849\n241662,141912\n241663,1860\n241664,1858\n241665,515\n241666,1052\n241667,1893\n241668,515\n241669,1860\n241670,1858\n241671,1052\n241672,872\n241673,515\n241674,652\n241676,1860\n241677,994\n241679,720\n241681,447\n241682,151\n241683,1132\n241684,781\n241685,516\n241686,781\n241687,1132\n241688,83\n241689,2045\n241691,313\n241692,1893\n241693,217\n241695,2353\n241696,79\n241699,1001\n241700,1818\n241701,4237\n241701,182162\n241702,994\n241703,220816\n241704,1220\n241705,252\n241706,251\n241707,212692\n241708,596\n241709,1132\n241710,781\n241711,1132\n241712,299\n241714,328\n241715,302\n241716,179170\n241717,861\n241718,8270\n241719,118336\n241720,336\n241722,602\n241722,3218\n241724,1860\n241725,1858\n241726,1133\n241727,752\n241728,707\n241729,779\n241730,200\n241731,217\n241732,127158\n241733,137\n241734,868\n241735,118336\n241736,34\n241736,35\n241737,140\n241738,179170\n241739,83\n241741,2135\n241743,1368\n241744,179170\n241745,192\n241746,44725\n241747,68\n241748,179170\n241750,179170\n241751,179170\n241752,2048\n241753,179170\n241754,215276\n241755,491\n241757,83\n241758,138686\n241759,175\n241760,1143\n241761,1359\n241762,184\n241763,285\n241764,1425\n241765,2244\n241766,422\n241767,89035\n241768,779\n241769,149\n241770,192\n241771,1458\n241772,1010\n241773,178\n241774,557\n241775,158\n241775,206\n241775,1001\n241775,1801\n241776,213089\n241777,1323\n241778,493\n241779,1167\n241780,30\n241781,1860\n241782,1858\n241783,515\n241784,2266\n241786,1132\n241787,30\n241788,356\n241789,142870\n241790,30\n241791,1359\n241792,179170\n241793,241794\n241795,406\n241796,241797\n241798,1132\n241799,781\n241800,775\n241801,1381\n241802,30\n241803,255\n241804,1014\n241805,147\n241805,158\n241806,994\n241807,179170\n241808,30\n241809,292\n241810,255\n241811,179170\n241812,1014\n241813,220816\n241814,1466\n241815,1014\n241816,179170\n241817,1014\n241818,151\n241820,1181\n241821,178\n241822,220816\n241823,30\n241824,634\n241825,148742\n241826,1644\n241827,118336\n241828,918\n241828,1160\n241829,241830\n241831,220816\n241832,932\n241833,179170\n241834,861\n241835,1\n241836,30\n241837,179170\n241838,340\n241839,220816\n241840,220816\n241841,301\n241842,392\n241843,918\n241844,442\n241845,120\n241846,30\n241847,179170\n241849,220816\n241850,179170\n241851,483\n241852,220816\n241853,6968\n241854,178\n241854,1235\n241855,1368\n241856,4594\n241857,220816\n241858,30\n241859,2367\n241860,5366\n241861,467\n241861,868\n241862,861\n241863,179170\n241864,171641\n241865,56\n241866,422\n241867,30\n241868,1332\n241869,30\n241870,220816\n241871,875\n241872,30\n241873,217\n241874,222\n241875,220816\n241876,30\n241877,2784\n241878,73570\n241879,30\n241880,1181\n241881,241882\n241881,261894\n241883,220816\n241884,220816\n241885,2146\n241886,289\n241886,94134\n241887,1235\n241887,1335\n241888,3623\n241889,2867\n241889,2868\n241890,30\n241891,220816\n241892,1294\n241893,372\n241893,592\n241894,433\n241895,217\n241896,868\n241897,179170\n241898,30\n241899,2671\n241900,536\n241901,1419\n241902,588\n241902,590\n241903,220816\n241904,30\n241905,2590\n241906,30\n241907,3623\n241908,30\n241909,220816\n241910,30\n241911,79\n241912,406\n241913,241914\n241915,795\n241916,301\n241917,433\n241918,435\n241919,220816\n241920,1363\n241921,220816\n241922,491\n241923,34\n241923,35\n241924,557\n241925,220816\n241926,7092\n241927,179170\n241928,179170\n241929,179170\n241930,30\n241931,1326\n241932,102\n241933,1323\n241934,408\n241935,4237\n241935,182162\n241937,843\n241938,1893\n241939,949\n241942,10\n241942,588\n241942,590\n241942,1419\n241943,3623\n241944,1284\n241945,278\n241946,72\n241947,6303\n241948,241949\n241950,87\n241951,577\n241952,149\n241953,1474\n241954,2915\n241955,640\n241956,673\n241957,811\n241958,622\n241958,1033\n241959,336\n241960,30\n241961,278\n241962,220816\n241963,1033\n241965,252\n241966,1608\n241967,179170\n241968,179170\n241969,1313\n241970,103860\n241971,200\n241972,247\n241973,247\n241974,557\n241975,862\n241976,200\n241977,6424\n241978,925\n241979,875\n241980,781\n241981,1132\n241982,1634\n241983,1381\n241984,220816\n241985,30\n241986,30\n241987,179170\n241988,30\n241989,1132\n241990,781\n241991,220816\n241992,1184\n241993,30\n241994,30\n241995,220816\n241996,179170\n241997,30\n241998,743\n241999,30\n242000,1556\n242001,30\n242002,30\n242003,179170\n242004,30\n242005,179170\n242006,1801\n242007,885\n242007,13704\n242008,1715\n242009,30\n242010,313\n242010,623\n242010,1590\n242010,1644\n242010,2274\n242011,1181\n242011,4192\n242011,4193\n242012,15748\n242013,707\n242014,220816\n242015,920\n242016,179170\n242017,3507\n242018,220816\n242019,179170\n242020,137\n242021,424\n242022,179170\n242023,242024\n242025,137\n242026,240\n242027,179170\n242028,179170\n242029,160\n242030,242031\n242032,158\n242033,146\n242033,92476\n242034,147\n242035,34\n242035,35\n242035,1590\n242035,1644\n242036,1858\n242037,1860\n242038,640\n242039,179170\n242040,640\n242041,179170\n242042,2373\n242043,179170\n242044,1411\n242044,2006\n242045,2116\n242046,1179\n242047,392\n242048,179170\n242049,179170\n242050,155481\n242051,2775\n242052,447\n242053,1449\n242054,179170\n242055,58\n242056,994\n242057,46\n242058,84257\n242059,179170\n242060,179170\n242061,485\n242062,171\n242063,179170\n242064,577\n242065,668\n242066,179170\n242067,516\n242068,671\n242069,1858\n242070,1860\n242071,138686\n242072,175\n242073,805\n242074,1235\n242074,1335\n242075,1858\n242076,1860\n242077,516\n242077,1893\n242078,155481\n242079,23783\n242080,285\n242082,1188\n242084,447\n242085,242086\n242087,875\n242088,1265\n242088,1266\n242089,2775\n242090,447\n242091,58\n242091,1140\n242091,1177\n242092,1370\n242094,294\n242094,2620\n242095,207\n242096,1773\n242097,577\n242099,561\n242100,2590\n242101,298\n242102,269\n242103,215\n242104,1287\n242105,147385\n242106,267\n242107,220816\n242108,1368\n242109,1052\n242110,872\n242112,1429\n242113,862\n242113,2590\n242114,83\n242115,220816\n242116,242117\n242118,2674\n242118,16153\n242119,668\n242120,850\n242121,10\n242122,424\n242123,220816\n242124,63\n242125,862\n242126,23782\n242127,220816\n242128,58\n242129,994\n242130,46\n242131,312\n242132,259\n242133,417\n242134,255\n242135,30\n242136,30\n242137,30\n242138,1608\n242139,1132\n242140,1143\n242141,1608\n242142,1132\n242143,387\n242144,875\n242145,1707\n242146,781\n242147,1132\n242148,875\n242149,875\n242150,1707\n242151,5469\n242152,179170\n242153,220816\n242154,179170\n242155,872\n242156,1252\n242156,1253\n242157,336\n242158,220816\n242159,1860\n242160,1858\n242161,56\n242162,422\n242163,872\n242164,1590\n242165,835\n242166,707\n242167,707\n242168,1058\n242169,1860\n242170,1858\n242171,148742\n242172,1801\n242173,1860\n242174,1858\n242175,302\n242176,704\n242178,644\n242179,146\n242179,92476\n242180,707\n242181,179170\n242182,179170\n242184,1858\n242185,1860\n242186,626\n242187,73570\n242188,644\n242190,2671\n242191,452\n242192,283\n242193,2416\n242193,2417\n242194,874\n242195,10\n242197,447\n242198,2775\n242200,220816\n242201,63\n242203,366\n242204,422\n242205,422\n242206,422\n242207,422\n242208,422\n242209,431\n242210,422\n242211,422\n242212,242213\n242214,422\n242215,366\n242218,366\n242219,366\n242220,422\n242221,422\n242222,35486\n242223,422\n242224,433\n242225,640\n242226,79\n242228,640\n242229,13980\n242230,255\n242231,30\n242232,30\n242233,192\n242234,1363\n242235,3623\n242236,433\n242237,557\n242238,920\n242239,30\n242240,3623\n242241,994\n242242,5906\n242243,220816\n242244,875\n242245,994\n242246,186\n242246,1566\n242246,163728\n242246,189950\n242246,215874\n242246,237573\n242246,243380\n242246,253191\n242246,261515\n242246,261808\n242247,302\n242247,893\n242248,996\n242249,493\n242251,875\n242252,310\n242252,3039\n242253,285\n242255,269\n242255,1265\n242255,1266\n242256,1860\n242257,1858\n242258,302\n242259,932\n242260,213089\n242261,3623\n242263,55849\n242264,192\n242264,422\n242265,435\n242265,538\n242267,1749\n242268,2775\n242269,447\n242270,991\n242271,4252\n242272,875\n242273,301\n242275,493\n242276,187\n242277,2266\n242278,30\n242279,875\n242280,138686\n242281,175\n242282,1238\n242283,217\n242284,868\n242286,1452\n242287,1882\n242288,211\n242288,1001\n242288,18738\n242289,2784\n242291,227\n242292,220816\n242294,518\n242295,2674\n242296,179170\n242297,179170\n242298,1359\n242299,179170\n242300,1659\n242301,179170\n242302,1467\n242303,588\n242303,590\n242304,179170\n242306,1285\n242307,1749\n242307,1882\n242308,994\n242309,240\n242310,994\n242311,1381\n242312,875\n242313,779\n242314,202\n242315,264\n242316,1888\n242317,1151\n242319,994\n242320,179170\n242321,151\n242322,179170\n242323,994\n242324,518\n242325,1085\n242326,1289\n242328,179170\n242329,1132\n242330,1608\n242331,179170\n242332,1608\n242333,1132\n242334,875\n242335,649\n242336,875\n242337,1313\n242338,14366\n242339,179170\n242340,387\n242341,313\n242343,179170\n242344,2979\n242345,118336\n242346,3585\n242347,179170\n242348,611\n242348,794\n242350,34\n242350,35\n242351,240\n242352,242353\n242354,872\n242355,707\n242356,3623\n242358,242359\n242360,30\n242361,346\n242362,30\n242363,22\n242364,179170\n242365,1860\n242366,1858\n242367,3507\n242368,30\n242369,875\n242370,875\n242371,56\n242372,422\n242373,875\n242374,1749\n242375,994\n242377,30\n242378,1984\n242380,30\n242381,557\n242382,120\n242383,147\n242385,493\n242386,1844\n242387,302\n242387,2116\n242388,358\n242389,138686\n242390,175\n242391,179170\n242392,379\n242393,30\n242394,30\n242395,83\n242396,515\n242397,113156\n242401,457\n242402,3623\n242403,783\n242404,1359\n242405,273\n242406,179170\n242407,147\n242408,3999\n242409,83\n242410,83\n242411,83\n242412,167\n242412,73570\n242413,30\n242415,2296\n242416,179170\n242417,179170\n242418,1359\n242419,22\n242420,118336\n242421,358\n242422,6303\n242423,31206\n242424,206\n242425,483\n242427,179170\n242428,255\n242429,217\n242430,366\n242431,55849\n242432,1007\n242433,1298\n242435,1881\n242436,83\n242437,115\n242438,220816\n242439,2979\n242440,2006\n242441,435\n242442,179170\n242443,220816\n242444,918\n242445,809\n242446,1019\n242447,1467\n242448,192\n242449,536\n242450,83\n242451,843\n242452,217\n242453,278\n242454,536\n242455,622\n242456,179170\n242457,148742\n242458,140\n242459,151\n242460,179170\n242461,179170\n242462,200\n242463,179170\n242464,179170\n242465,1882\n242466,220816\n242467,707\n242468,893\n242469,178\n242470,220816\n242471,891\n242472,302\n242473,2617\n242475,220816\n242476,1509\n242477,220816\n242478,657\n242479,417\n242480,7572\n242481,8798\n242484,106\n242484,227\n242484,364\n242484,589\n242484,596\n242484,795\n242484,1241\n242484,1368\n242484,1564\n242484,2083\n242485,3623\n242486,489\n242487,875\n242488,875\n242489,220816\n242490,30\n242491,242492\n242493,158\n242494,217\n242495,1\n242496,220816\n242497,179170\n242498,3623\n242500,1590\n242501,875\n242502,1983\n242503,328\n242504,220816\n242505,179170\n242506,220816\n242507,7092\n242508,252\n242509,179170\n242510,3623\n242511,220816\n242512,179170\n242513,167\n242514,138686\n242515,932\n242516,1241\n242517,1231\n242518,720\n242519,6068\n242520,1955\n242521,1522\n242522,3\n242523,5662\n242524,2620\n242525,1544\n242526,605\n242527,3193\n242528,1052\n242529,1715\n242530,2443\n242531,2205\n242531,33424\n242532,3422\n242533,1167\n242534,968\n242535,10\n242535,113156\n242536,2191\n242537,589\n242538,714\n242539,3207\n242540,1140\n242541,1893\n242542,233\n242543,37\n242544,301\n242545,5718\n242546,752\n242547,1001\n242548,1564\n242549,2083\n242550,1837\n242551,390\n242552,72\n242553,2979\n242554,3194\n242555,907\n242556,2557\n242557,220816\n242558,278\n242559,56\n242560,422\n242561,192\n242562,179170\n242563,220816\n242564,115659\n242565,179170\n242566,83\n242567,30\n242568,406\n242569,2646\n242570,2209\n242571,138\n242572,865\n242573,557\n242574,137\n242575,88820\n242576,557\n242577,242578\n242577,264724\n242579,1326\n242580,1323\n242581,102\n242582,408\n242583,332\n242584,1608\n242585,179170\n242586,220816\n242587,179170\n242588,1132\n242589,2735\n242590,220816\n242591,1353\n242592,35486\n242593,640\n242594,1294\n242595,242596\n242597,220816\n242598,34\n242598,35\n242599,220816\n242600,149\n242601,179170\n242602,179170\n242603,179170\n242604,366\n242605,179170\n242606,220816\n242607,3367\n242608,179170\n242609,220816\n242610,179170\n242611,179170\n242612,1181\n242613,50\n242613,147\n242613,195\n242614,179170\n242615,220816\n242616,220816\n242617,707\n242618,22\n242619,31977\n242620,1147\n242622,179170\n242623,220816\n242624,220816\n242625,250\n242625,1684\n242626,707\n242627,285\n242628,220816\n242629,557\n242630,147\n242631,250\n242631,1684\n242632,285\n242633,30\n242634,285\n242635,179170\n242636,30\n242637,138686\n242638,175\n242639,1132\n242640,250\n242640,1684\n242641,30\n242642,30\n242643,671\n242644,220816\n242645,30\n242646,220816\n242647,525\n242648,717\n242649,1309\n242650,1285\n242651,333\n242652,704\n242653,79\n242654,631\n242655,138686\n242656,175\n242657,294\n242658,1634\n242659,206\n242660,22\n242662,147\n242663,433\n242664,142870\n242665,3474\n242666,801\n242667,1782\n242668,3138\n242669,1359\n242670,3218\n242672,179170\n242674,179170\n242675,1181\n242676,148742\n242677,1359\n242678,242679\n242681,250\n242681,1684\n242682,285\n242683,366\n242684,179170\n242685,862\n242686,179170\n242687,250\n242687,1684\n242688,285\n242689,1132\n242690,1132\n242691,225\n242692,240\n242693,2373\n242694,220816\n242695,1181\n242696,1474\n242696,2590\n242697,30\n242698,220816\n242699,8884\n242700,242701\n242702,242703\n242704,1085\n242705,310\n242705,805\n242706,5547\n242707,192\n242708,242709\n242710,242711\n242712,491\n242713,142870\n242714,406\n242715,242716\n242717,242718\n242719,422\n242720,56\n242721,515\n242722,242723\n242724,151\n242725,1707\n242726,8270\n242727,1949\n242728,242729\n242730,366\n242731,366\n242732,366\n242733,1181\n242734,275\n242735,1227\n242735,86416\n242736,104\n242737,9098\n242738,134\n242739,1465\n242740,217\n242740,222\n242740,406\n242740,417\n242740,455\n242740,1085\n242740,2296\n242740,5343\n242740,73938\n242741,2750\n242742,242743\n242744,1458\n242744,149534\n242745,479\n242746,35486\n242748,200\n242749,242750\n242751,994\n242752,1177\n242752,2367\n242753,1715\n242754,213089\n242755,242756\n242757,366\n242758,73570\n242759,932\n242760,3148\n242761,2626\n242762,3003\n242763,3623\n242764,127158\n242765,557\n242766,22\n242767,83\n242769,994\n242770,408\n242771,2931\n242772,272\n242772,563\n242773,242774\n242775,346\n242776,272\n242776,193129\n242777,242778\n242779,145751\n242780,1058\n242781,875\n242782,875\n242783,1240\n242784,1014\n242785,1014\n242786,1014\n242787,953\n242788,142870\n242789,1014\n242790,1014\n242791,3218\n242792,994\n242794,154408\n242795,2931\n242796,1096\n242797,439\n242799,918\n242800,30\n242801,25348\n242801,101688\n242802,242803\n242804,4\n242804,5\n242805,1132\n242806,781\n242807,217\n242808,113156\n242809,147\n242810,151\n242811,242812\n242813,1188\n242814,30\n242815,179170\n242816,44\n242817,242818\n242819,433\n242820,1294\n242821,422\n242822,56\n242823,179170\n242824,1014\n242825,255\n242826,1\n242826,1515\n242826,21442\n242826,245282\n242826,250192\n242826,250648\n242826,258302\n242827,1014\n242828,1014\n242829,2931\n242830,1014\n242831,918\n242832,145161\n242833,200\n242834,130\n242835,192\n242836,2989\n242836,2991\n242838,179170\n242839,79\n242840,932\n242841,242842\n242843,1449\n242844,30\n242845,1007\n242845,1289\n242846,3260\n242847,138686\n242848,175\n242849,1623\n242850,122853\n242851,652\n242852,602\n242853,56\n242854,422\n242857,302\n242858,1132\n242859,1623\n242860,55849\n242861,861\n242862,994\n242863,28130\n242864,483\n242865,2116\n242866,30\n242867,217\n242867,302\n242868,406\n242869,140\n242870,6323\n242871,11\n242872,1117\n242873,1313\n242874,422\n242875,56\n242876,433\n242877,366\n242878,366\n242880,355\n242881,1078\n242883,179170\n242884,220816\n242885,1181\n242886,301\n242887,83\n242888,305\n242889,220816\n242891,1479\n242892,390\n242893,390\n242894,220816\n242895,30\n242896,242897\n242896,248236\n242898,2931\n242899,22\n242900,56\n242901,422\n242902,220816\n242903,220816\n242904,30\n242905,220816\n242906,433\n242907,151\n242908,1149\n242909,1419\n242909,142870\n242911,571\n242912,1014\n242913,693\n242914,155481\n242915,220816\n242916,179170\n242917,179170\n242918,220816\n242919,220816\n242920,179170\n242921,220816\n242922,179170\n242923,192\n242923,240\n242923,406\n242923,620\n242924,1014\n242925,346\n242926,22\n242927,22\n242928,859\n242929,22\n242930,805\n242931,179170\n242932,242933\n242932,247722\n242934,1010\n242935,242936\n242938,179170\n242939,179170\n242940,269\n242941,13919\n242942,994\n242943,994\n242945,242946\n242948,179170\n242949,1085\n242949,75912\n242951,242952\n242953,107\n242954,2416\n242954,2417\n242955,292\n242957,338\n242958,298\n242959,640\n242960,1133\n242961,3538\n242962,175\n242962,1773\n242963,366\n242964,366\n242965,366\n242966,366\n242967,366\n242968,366\n242972,143\n242973,809\n242974,779\n242976,1623\n242977,242977\n242978,1010\n242979,269\n242980,35486\n242981,4597\n242984,344\n242985,1359\n242986,1474\n242987,932\n242988,1118\n242989,809\n242990,242991\n242990,243903\n242992,4193\n242993,30\n242994,843\n242995,242996\n242997,1805\n242998,994\n242998,103860\n242999,147\n242999,158\n243000,30\n243001,3999\n243002,3623\n243003,243004\n243005,97\n243006,14989\n243007,243008\n243009,1821\n243009,21736\n243010,285\n243012,657\n243012,2266\n243013,346\n243014,63\n243015,243016\n243019,1313\n243020,483\n243021,179170\n243022,1181\n243024,843\n243025,1544\n243027,4\n243027,5\n243029,1132\n243030,28203\n243031,779\n243032,138686\n243033,175\n243034,243035\n243042,1511\n243042,3069\n243045,932\n243046,243047\n243048,994\n243049,243050\n243051,136\n243052,781\n243053,1132\n243055,994\n243056,243057\n243058,346\n243059,994\n243060,30\n243061,994\n243062,781\n243063,1132\n243064,99\n243065,243066\n243067,99\n243068,312\n243069,2266\n243070,389\n243071,557\n243072,557\n243073,557\n243074,1821\n243074,21736\n243075,68\n243076,1300\n243077,536\n243078,273\n243078,2367\n243079,104\n243080,50\n243081,1415\n243082,195\n243083,602\n243085,195\n243085,74719\n243086,202\n243087,151\n243088,243089\n243090,1014\n243091,1014\n243092,243093\n243095,1014\n243096,4823\n243097,1014\n243099,450\n243100,113156\n243101,243102\n243103,1769\n243104,243105\n243106,179170\n243107,697\n243107,1769\n243108,33\n243108,40\n243108,1432\n243108,2674\n243108,2701\n243108,4571\n243108,9343\n243108,9540\n243108,9541\n243109,4611\n243110,179170\n243111,243112\n243111,262916\n243114,2506\n243115,589\n243116,872\n243117,872\n243118,783\n243119,273\n243120,272\n243121,243122\n243123,192\n243123,1509\n243123,1688\n243123,2701\n243123,3370\n243123,14453\n243124,142870\n243125,192\n243126,83\n243126,217\n243126,379\n243126,399\n243126,1467\n243126,2168\n243126,2784\n243126,7698\n243127,83\n243128,285\n243129,192\n243130,1644\n243131,179170\n243132,2668\n243134,240\n243135,179170\n243136,104\n243137,7155\n243138,1012\n243139,43203\n243140,65\n243141,58\n243142,243143\n243144,178\n243144,392\n243146,994\n243147,994\n243148,81\n243149,243150\n243149,250378\n243151,1634\n243152,292\n243153,294\n243154,142473\n243155,296\n243156,298\n243157,2867\n243157,2868\n243158,862\n243159,1544\n243160,1414\n243161,19010\n243162,422\n243163,949\n243163,142870\n243164,1140\n243165,1033\n243166,20\n243166,447\n243167,788\n243168,1749\n243169,202\n243171,2867\n243171,2868\n243172,209\n243172,1010\n243172,1556\n243172,1837\n243172,131675\n243173,1707\n243174,875\n243175,179170\n243176,147\n243177,433\n243179,243180\n243181,179170\n243182,50\n243183,179170\n243186,1572\n243187,1058\n243188,30\n243189,298\n243190,119\n243191,240174\n243192,3695\n243193,248\n243195,30\n243196,83\n243197,285\n243198,636\n243199,22\n243200,3422\n243201,704\n243203,640\n243204,640\n243205,640\n243206,192\n243208,640\n243210,433\n243211,707\n243212,50\n243213,22\n243214,30\n243215,707\n243216,171\n243217,255\n243218,422\n243219,422\n243220,422\n243221,422\n243222,422\n243223,422\n243224,422\n243225,422\n243226,422\n243227,422\n243228,422\n243229,422\n243230,209\n243231,493\n243232,640\n243233,79\n243234,697\n243235,592\n243236,585\n243237,1293\n243238,586\n243239,393\n243240,50\n243241,406\n243242,6661\n243243,749\n243244,55849\n243245,22\n243246,79\n243247,6661\n243248,6661\n243250,1608\n243251,179170\n243252,35486\n243253,2460\n243254,63\n243255,217\n243256,652\n243258,1132\n243259,775\n243260,2224\n243261,999\n243262,1860\n243264,920\n243267,243268\n243271,1370\n243276,3003\n243277,557\n243278,707\n243280,220884\n243281,356\n243282,422\n243284,1132\n243285,497\n243287,657\n243288,50\n243289,217\n243290,298\n243292,862\n243293,56\n243294,422\n243298,179170\n243299,192\n243300,1238\n243301,202\n243303,4411\n243304,30\n243305,217\n243306,1452\n243307,652\n243308,312\n243308,1267\n243309,2989\n243309,2991\n243310,81\n243311,1010\n243313,1132\n243314,781\n243315,6682\n243316,200\n243318,5908\n243319,392\n243320,148742\n243321,647\n243322,146\n243322,92476\n243323,344\n243324,179170\n243325,104\n243326,1773\n243327,2421\n243329,1181\n243330,875\n243331,148742\n243332,2620\n243334,1983\n243335,1052\n243336,54\n243337,2775\n243338,1962\n243339,304\n243342,433\n243343,859\n243345,2424\n243347,192\n243347,422\n243350,589\n243350,1718\n243354,147\n243355,200\n243356,571\n243357,147\n243358,1983\n243359,907\n243360,485\n243361,1515\n243362,200\n243363,483\n243364,1707\n243366,447\n243367,6556\n243368,147\n243368,118336\n243370,83\n243371,452\n243372,809\n243373,518\n243374,240\n243375,875\n243376,240\n243377,749\n243378,217\n243379,292\n243380,242246\n243381,179170\n243382,30\n243383,243384\n243385,2205\n243385,33424\n243386,1149\n243387,179170\n243388,179170\n243390,267\n243392,6556\n243393,179170\n243394,760\n243395,1572\n243396,48955\n243397,111\n243398,949\n243399,439\n243400,124668\n243401,1167\n243402,1805\n243403,714\n243404,1474\n243405,973\n243406,1033\n243407,1707\n243408,5405\n243409,313\n243410,577\n243411,2224\n243412,207\n243413,3769\n243414,415\n243415,779\n243416,3538\n243417,779\n243420,222\n243420,302\n243420,1572\n243420,1836\n243420,4039\n243421,406\n243422,83\n243423,1132\n243425,372\n243425,7194\n243426,907\n243427,1860\n243428,1858\n243429,1118\n243430,7757\n243431,301\n243432,2373\n243434,868\n243435,2373\n243436,827\n243438,30\n243440,138686\n243441,175\n243442,243443\n243445,179170\n243446,189303\n243447,3115\n243448,179170\n243449,34\n243449,35\n243451,3999\n243452,2460\n243453,4039\n243454,179170\n243455,179170\n243456,875\n243457,1707\n243458,2296\n243459,179170\n243461,483\n243462,179170\n243463,5908\n243464,179170\n243465,1160\n243466,179170\n243468,2319\n243468,5326\n243468,19443\n243470,980\n243472,179170\n243473,1801\n243474,1294\n243475,1132\n243476,7416\n243477,379\n243478,148742\n243481,179170\n243483,1085\n243484,1860\n243486,1858\n243487,83\n243488,631\n243489,48505\n243491,134\n243492,1983\n243493,1566\n243494,1001\n243496,99\n243497,1058\n243498,3623\n243499,875\n243500,201298\n243501,292\n243502,712\n243503,179170\n243504,536\n243506,283\n243506,385\n243506,2266\n243506,2421\n243506,2424\n243506,37088\n243507,179170\n243508,243509\n243510,483\n243511,179170\n243512,30\n243513,891\n243514,344\n243515,285\n243516,179170\n243517,179170\n243518,179170\n243519,1332\n243519,1844\n243522,934\n243523,191860\n243524,2373\n243525,179170\n243526,509\n243526,3258\n243527,179170\n243528,515\n243529,595\n243530,179170\n243531,843\n243532,1858\n243533,1860\n243534,1390\n243535,179170\n243536,1224\n243537,179170\n243538,22\n243539,346\n243540,148742\n243541,255\n243542,657\n243543,372\n243544,841\n243545,818\n243546,366\n243547,536\n243548,2411\n243549,44\n243550,366\n243551,366\n243552,366\n243553,366\n243554,1983\n243555,149\n243557,602\n243558,366\n243559,918\n243560,202\n243561,240174\n243562,179170\n243563,140\n243564,592\n243565,273\n243567,1\n243568,151\n243569,1749\n243570,557\n243571,779\n243572,1801\n243573,379\n243574,3507\n243575,148742\n243576,240174\n243577,252\n243579,3623\n243580,875\n243581,73570\n243582,1983\n243583,30\n243584,631\n243585,58\n243586,46\n243587,994\n243588,309\n243588,310\n243589,2590\n243590,179170\n243591,2266\n243592,19010\n243593,77\n243594,220816\n243595,273\n243595,313\n243596,167\n243597,8822\n243598,179170\n243599,34\n243599,35\n243600,1566\n243600,189950\n243600,237573\n243600,243380\n243600,256662\n243600,261515\n243601,3507\n243602,220816\n243603,220816\n243604,1119\n243605,148742\n243606,868\n243607,243608\n243610,697\n243611,668\n243612,3623\n243613,5192\n243614,5405\n243615,195\n243616,220816\n243617,1368\n243618,2073\n243618,2626\n243618,142426\n243619,447\n243620,2775\n243621,932\n243623,220816\n243624,220816\n243625,243626\n243627,120\n243627,1419\n243628,788\n243628,859\n243629,1949\n243630,1858\n243631,1860\n243632,179170\n243633,1294\n243633,1644\n243634,220816\n243635,493\n243636,179170\n243637,349\n243637,586\n243637,3260\n243638,220816\n243639,73570\n243640,1849\n243641,536\n243642,202\n243643,875\n243644,973\n243645,1801\n243645,3182\n243646,220816\n243647,220816\n243648,772\n243649,577\n243650,1722\n243651,250\n243651,1684\n243652,220816\n243653,179170\n243654,1749\n243655,30\n243657,278\n243658,389\n243659,179170\n243660,217\n243661,179170\n243662,30\n243663,220816\n243664,1722\n243665,1326\n243666,102\n243667,1323\n243668,408\n243670,994\n243671,179170\n243672,30\n243673,30\n243674,179170\n243675,7092\n243676,220816\n243677,30\n243678,1298\n243679,149\n243680,30\n243681,220816\n243682,1143\n243683,179170\n243684,278\n243685,1832\n243686,2045\n243687,313\n243688,50\n243689,424\n243690,179170\n243691,455\n243693,330\n243694,30\n243695,30\n243696,107\n243697,179170\n243698,269\n243699,1858\n243700,1860\n243701,179170\n243702,107\n243703,7363\n243703,7652\n243704,8270\n243705,55849\n243706,862\n243706,1235\n243707,1789\n243708,60576\n243709,301\n243709,372\n243709,631\n243709,1001\n243709,1085\n243710,1374\n243711,595\n243712,595\n243713,1860\n243714,1858\n243715,151\n243716,1058\n243717,292\n243718,657\n243718,694\n243718,2266\n243719,760\n243720,179170\n243721,138\n243722,1522\n243723,4223\n243724,1522\n243725,595\n243726,302\n243727,1707\n243728,1603\n243729,313\n243731,272\n243733,1860\n243734,1151\n243735,1267\n243736,1\n243736,94\n243736,184\n243736,2787\n243737,97\n243738,285\n243739,1556\n243740,247\n243741,379\n243742,30\n243743,255\n243744,7117\n243745,30\n243746,217\n243747,2744\n243748,243749\n243750,179170\n243751,626\n243752,179170\n243753,147\n243754,1085\n243755,1773\n243756,704\n243757,79\n243758,179170\n243759,30\n243760,138686\n243761,175\n243762,563\n243763,220816\n243764,83\n243765,1096\n243766,179170\n243767,220816\n243768,557\n243769,22\n243770,179170\n243771,220816\n243772,269\n243773,220816\n243774,95554\n243775,30\n243776,220816\n243777,323\n243778,875\n243779,1227\n243779,86416\n243780,310\n243781,493\n243782,1267\n243783,198977\n243784,243785\n243786,760\n243787,809\n243788,1252\n243788,1253\n243789,875\n243790,2048\n243791,323\n243792,1160\n243793,65\n243794,366\n243795,366\n243796,720\n243796,775\n243796,877\n243796,907\n243796,973\n243796,1001\n243796,1117\n243796,1284\n243796,1522\n243796,1715\n243796,1732\n243796,1837\n243796,2191\n243796,9024\n243797,640\n243798,269\n243799,243800\n243801,41\n243802,149\n243803,424\n243804,920\n243805,932\n243806,179170\n243807,1458\n243808,805\n243809,2266\n243810,1474\n243811,146\n243811,92476\n243812,920\n243813,243814\n243815,79\n243815,5265\n243816,1381\n243817,104\n243819,843\n243820,202\n243821,491\n243822,673\n243823,35687\n243824,269\n243825,843\n243826,298\n243827,243828\n243829,179170\n243830,1571\n243831,893\n243832,149\n243833,137\n243834,179170\n243835,366\n243836,2744\n243837,137\n243838,269\n243839,243840\n243841,312\n243842,243843\n243844,2116\n243845,1544\n243846,217\n243847,179170\n243848,3138\n243848,4355\n243850,1085\n243851,5662\n243852,302\n243853,141912\n243854,179170\n243855,299\n243856,515\n243857,179170\n243858,3623\n243859,83\n243860,561\n243861,179170\n243862,240174\n243863,243864\n243865,592\n243866,862\n243867,862\n243868,41\n243869,1151\n243870,179170\n243871,179170\n243872,269\n243873,117192\n243874,433\n243875,269\n243876,50\n243876,79\n243876,104\n243876,158\n243876,178\n243876,195\n243876,202\n243876,366\n243876,586\n243876,592\n243876,818\n243876,972\n243876,973\n243876,1419\n243876,2244\n243876,4192\n243876,4193\n243876,148742\n243876,240174\n243877,2373\n243878,875\n243879,243880\n243881,243882\n243884,97\n243885,557\n243886,22\n243888,137\n243889,422\n243890,56\n243891,240174\n243892,577\n243893,30\n243893,515\n243894,704\n243895,79\n243896,179170\n243897,644\n243899,243900\n243901,1608\n243902,304\n243904,240174\n243905,459\n243906,6661\n243907,147\n243908,422\n243909,422\n243910,422\n243911,422\n243912,422\n243913,422\n243914,422\n243915,422\n243916,179170\n243917,422\n243918,1132\n243919,422\n243920,422\n243922,493\n243923,640\n243924,640\n243925,640\n243926,640\n243927,788\n243928,640\n243929,171\n243930,781\n243931,148742\n243932,1132\n243933,640\n243936,1417\n243937,240\n243938,781\n243939,1132\n243940,1033\n243941,206\n243942,875\n243943,1132\n243944,35486\n243945,2590\n243946,920\n243947,657\n243948,1082\n243949,206\n243950,744\n243951,48505\n243952,877\n243953,1113\n243954,3756\n243955,388\n243956,762\n243957,202\n243958,243959\n243960,392\n243961,1639\n243962,1749\n243963,393\n243964,252\n243965,179170\n243966,602\n243967,1707\n243970,205627\n243971,1298\n243973,179170\n243974,179170\n243975,2995\n243976,1359\n243978,1801\n243979,985\n243980,781\n243981,1132\n243982,1224\n243983,217\n243984,1860\n243985,1858\n243986,19010\n243987,148742\n243988,312\n243989,861\n243991,179170\n243992,3623\n243993,1893\n243994,73570\n243995,333\n243996,811\n243998,1102\n243998,7363\n243999,1414\n244000,179170\n244002,932\n244003,1749\n244003,1882\n244004,171\n244005,1284\n244006,50\n244006,505\n244006,141912\n244008,4771\n244009,3555\n244010,1313\n244011,285\n244012,1707\n244013,163\n244014,611\n244015,179170\n244016,72764\n244017,388\n244018,850\n244019,302\n244020,784\n244022,364\n244023,200\n244024,195\n244025,493\n244026,171\n244027,83\n244028,720\n244029,195\n244030,493\n244031,179170\n244032,63\n244033,925\n244034,244035\n244036,1381\n244036,1452\n244036,1551\n244037,1231\n244038,1544\n244039,56\n244040,422\n244041,37\n244042,63\n244043,557\n244044,422\n244045,56\n244046,1634\n244047,192\n244049,891\n244050,240\n244051,493\n244051,682\n244051,72439\n244052,1058\n244053,20\n244053,4548\n244055,1634\n244056,4548\n244057,592\n244058,126\n244059,244060\n244061,5\n244061,1102\n244062,2868\n244062,17588\n244063,252\n244064,827\n244065,622\n244067,1844\n244068,862\n244070,120\n244071,493\n244071,586\n244071,1265\n244071,1266\n244071,1370\n244072,3623\n244073,2719\n244074,200\n244075,2590\n244076,392\n244076,918\n244076,1454\n244078,338\n244081,406\n244082,392\n244084,79\n244085,302\n244086,313\n244087,406\n244088,515\n244090,1860\n244091,1858\n244092,72\n244092,358\n244093,861\n244094,179170\n244095,4355\n244096,852\n244096,1801\n244097,202\n244098,1240\n244098,5469\n244099,636\n244100,302\n244101,1659\n244101,1836\n244103,406\n244105,124668\n244105,187176\n244106,312\n244107,875\n244108,240174\n244109,217\n244110,83\n244111,1132\n244112,781\n244113,462\n244114,179170\n244115,4039\n244116,148742\n244117,7092\n244118,178\n244119,192\n244120,663\n244120,1531\n244121,1927\n244122,244123\n244124,1381\n244125,30\n244125,328\n244125,1179\n244125,7124\n244126,994\n244127,217\n244130,403\n244132,115474\n244133,2590\n244134,147\n244134,149\n244134,158\n244134,171\n244134,206\n244136,1119\n244137,48\n244138,1033\n244139,244140\n244141,809\n244142,749\n244142,1235\n244142,2209\n244142,8180\n244142,21711\n244143,148742\n244144,83\n244145,620\n244146,104\n244146,136\n244146,557\n244146,1368\n244147,148742\n244148,83\n244149,406\n244150,83\n244151,141912\n244153,79\n244154,994\n244155,302\n244156,252\n244157,1167\n244158,1785\n244159,589\n244160,605\n244161,1124\n244162,1782\n244163,973\n244164,86\n244165,179170\n244166,1\n244167,338\n244168,595\n244169,626\n244170,779\n244171,1515\n244172,148742\n244173,392\n244174,200\n244175,302\n244175,893\n244176,244177\n244178,148742\n244179,179170\n244180,1010\n244181,333\n244181,4192\n244182,184\n244185,1860\n244186,1858\n244187,893\n244188,333\n244189,1294\n244190,83\n244191,1298\n244191,1749\n244191,6695\n244192,179170\n244193,34\n244193,35\n244194,647\n244196,179170\n244197,167\n244198,447\n244199,994\n244200,2775\n244201,861\n244202,781\n244203,1132\n244204,151\n244205,1631\n244206,406\n244207,156379\n244207,162599\n244208,640\n244209,636\n244211,244212\n244213,148742\n244214,483\n244215,255\n244216,994\n244217,1359\n244218,179170\n244219,179170\n244220,83\n244221,805\n244222,994\n244223,4823\n244224,179170\n244225,640\n244226,244227\n244228,179170\n244230,435\n244231,107\n244232,932\n244233,44\n244234,175\n244235,179170\n244236,34\n244236,35\n244237,148742\n244238,841\n244239,843\n244240,244241\n244242,991\n244243,179170\n244244,179170\n244245,184\n244246,1983\n244247,179170\n244248,204093\n244249,138686\n244250,175\n244251,972\n244252,278\n244253,200\n244254,1531\n244255,240174\n244256,1179\n244257,301\n244258,13361\n244259,244260\n244261,1688\n244262,640\n244263,118336\n244264,220816\n244265,148742\n244266,1452\n244267,1821\n244267,21736\n244268,980\n244269,179170\n244270,605\n244271,7092\n244272,55849\n244273,179170\n244274,1370\n244275,179170\n244276,44\n244277,179170\n244278,179170\n244279,179170\n244280,467\n244281,272\n244282,298\n244282,346\n244282,563\n244282,615\n244282,1243\n244282,2367\n244282,7429\n244283,147\n244284,38634\n244285,5265\n244286,586\n244287,640\n244288,179170\n244289,1359\n244290,179170\n244291,278\n244292,244293\n244294,220816\n244295,1556\n244296,2646\n244297,278\n244298,83\n244299,433\n244300,640\n244301,220816\n244302,179170\n244303,244304\n244305,3623\n244306,1033\n244308,433\n244309,577\n244310,3623\n244311,220816\n244312,3623\n244313,393\n244314,640\n244315,220816\n244316,563\n244317,244318\n244319,503\n244320,620\n244321,220816\n244322,433\n244323,244324\n244325,220816\n244326,406\n244327,179170\n244328,55849\n244329,220816\n244330,207\n244331,179170\n244333,1326\n244334,102\n244335,1323\n244336,408\n244337,220816\n244338,1515\n244339,779\n244340,142426\n244341,83\n244341,278\n244341,577\n244342,220816\n244343,2373\n244344,68509\n244345,285\n244346,217\n244347,1238\n244348,250\n244348,1684\n244349,187\n244350,179170\n244351,1452\n244352,255\n244353,668\n244354,220816\n244355,179170\n244356,220816\n244357,220816\n244358,179170\n244359,417\n244360,752\n244361,312\n244362,3585\n244363,220816\n244364,278\n244365,4597\n244366,179170\n244367,220816\n244368,333\n244369,179170\n244370,875\n244371,179170\n244372,138686\n244373,175\n244374,5265\n244375,1188\n244376,1515\n244377,1511\n244377,3069\n244378,294\n244379,347\n244380,1305\n244381,179170\n244382,179170\n244383,1\n244384,304\n244385,179170\n244386,38634\n244387,275\n244388,652\n244389,285\n244390,5366\n244391,147\n244392,179170\n244393,35486\n244394,179170\n244395,4823\n244396,2421\n244397,949\n244398,34\n244398,35\n244398,158\n244398,217\n244398,536\n244398,660\n244398,1133\n244398,1466\n244398,4637\n244398,7092\n244399,2671\n244400,200\n244401,1432\n244402,179170\n244403,220816\n244404,30\n244405,220816\n244406,872\n244407,179170\n244408,220816\n244409,220816\n244410,1014\n244411,179170\n244412,640\n244413,179170\n244414,220816\n244415,1014\n244416,1014\n244417,1014\n244418,1014\n244419,244420\n244421,220816\n244422,220816\n244423,2923\n244424,1014\n244425,393\n244426,1014\n244427,704\n244428,493\n244429,240174\n244430,179170\n244431,850\n244432,640\n244433,83\n244434,220816\n244435,220816\n244436,640\n244437,220816\n244438,346\n244439,640\n244440,179170\n244441,220816\n244442,179170\n244443,2744\n244445,1429\n244446,220816\n244447,126\n244448,338\n244449,30\n244450,1983\n244451,1058\n244452,424\n244453,149\n244454,46\n244454,720\n244454,745\n244454,1425\n244454,2528\n244454,2590\n244454,3258\n244454,249937\n244455,640\n244456,179170\n244457,640\n244458,192\n244459,244460\n244461,244462\n244463,968\n244464,244465\n244466,424\n244467,640\n244468,1363\n244469,220816\n244470,244471\n244473,1821\n244473,21736\n244474,244475\n244476,30\n244477,13546\n244478,220816\n244479,272\n244479,439\n244479,563\n244479,980\n244479,2367\n244479,15573\n244480,220816\n244481,640\n244482,258\n244483,366\n244484,862\n244484,2590\n244485,147\n244486,30\n244487,179170\n244488,30\n244489,640\n244490,557\n244491,220816\n244492,920\n244493,247\n244494,1608\n244495,240174\n244496,1782\n244497,71\n244498,1467\n244499,885\n244499,13704\n244500,455\n244501,2424\n244502,179170\n244503,1871\n244504,364\n244505,83\n244506,2421\n244507,13980\n244508,7416\n244509,46\n244509,577\n244509,1012\n244509,2528\n244509,2590\n244510,220816\n244511,687\n244512,1381\n244512,2292\n244513,240174\n244514,220816\n244515,220816\n244516,1368\n244518,346\n244519,104\n244520,179170\n244521,2073\n244522,179170\n244523,850\n244525,473\n244526,1544\n244527,220816\n244528,1085\n244529,1368\n244530,179170\n244531,217\n244532,536\n244533,179170\n244534,137\n244535,1782\n244536,994\n244537,30\n244538,392\n244539,138686\n244540,175\n244541,289\n244541,94134\n244542,309\n244542,310\n244543,309\n244543,310\n244544,433\n244545,285\n244546,244547\n244548,244549\n244550,775\n244551,1631\n244552,577\n244553,107\n244553,1146\n244553,1579\n244554,366\n244555,2436\n244556,1326\n244557,179170\n244558,252\n244559,595\n244560,269\n244561,1531\n244562,302\n244563,179170\n244564,920\n244565,433\n244567,640\n244568,640\n244569,640\n244570,668\n244571,422\n244573,1132\n244574,781\n244575,422\n244576,422\n244577,422\n244578,422\n244579,422\n244580,422\n244581,422\n244582,431\n244583,422\n244584,422\n244585,422\n244586,422\n244587,1968\n244587,16196\n244588,326\n244590,126\n244590,918\n244590,1160\n244593,694\n244596,577\n244597,392\n244598,247\n244598,2867\n244598,2868\n244599,313\n244600,147\n244600,149\n244601,241732\n244601,244601\n244602,35486\n244603,3623\n244605,1860\n244606,1858\n244607,328\n244608,920\n244609,31073\n244610,1544\n244611,1955\n244612,73570\n244614,2989\n244614,2991\n244615,1238\n244616,240174\n244617,1452\n244618,344\n244619,10\n244620,920\n244622,179170\n244623,1566\n244624,9457\n244625,1479\n244626,697\n244628,192\n244631,217\n244632,137\n244633,6059\n244634,54\n244635,1274\n244636,1052\n244637,1962\n244638,54\n244639,2775\n244640,1052\n244641,151\n244642,222\n244642,657\n244643,244644\n244643,250529\n244645,3094\n244646,911\n244646,1844\n244646,5213\n244647,422\n244648,56\n244649,493\n244649,640\n244649,2626\n244651,50\n244652,1087\n244653,179170\n244654,244655\n244656,244657\n244658,581\n244659,1385\n244660,189839\n244661,273\n244662,83\n244663,4190\n244664,50\n244665,107\n244665,4771\n244666,2274\n244668,83\n244669,1511\n244669,3069\n244670,5987\n244671,83\n244673,447\n244674,2775\n244675,79\n244677,135\n244678,809\n244679,118336\n244680,22\n244680,2017\n244681,149\n244682,4611\n244683,1566\n244685,500\n244686,83\n244687,83\n244689,586\n244690,781\n244691,1132\n244692,459\n244693,2209\n244694,707\n244695,83\n244696,83\n244697,450\n244698,83\n244700,244701\n244702,2373\n244704,843\n244705,162599\n244706,124668\n244707,9098\n244708,7572\n244709,8798\n244710,925\n244711,244712\n244714,1631\n244715,56\n244716,422\n244718,4771\n244719,126\n244721,1465\n244722,388\n244723,4594\n244724,1634\n244725,1160\n244726,244727\n244728,1860\n244729,1858\n244730,2319\n244731,1274\n244732,222\n244733,73570\n244734,491\n244735,4571\n244736,872\n244736,1151\n244737,3367\n244738,149\n244738,21442\n244739,3297\n244740,55849\n244741,1294\n244742,240174\n244743,5405\n244744,119\n244745,1860\n244746,1858\n244748,393\n244749,489\n244751,1983\n244752,192\n244752,586\n244752,920\n244753,1860\n244754,1858\n244755,652\n244757,1860\n244758,1858\n244759,1070\n244759,4455\n244760,406\n244761,244762\n244764,1782\n244765,2646\n244767,13980\n244768,1860\n244769,1858\n244770,328\n244771,968\n244774,592\n244777,118336\n244778,1082\n244779,1860\n244780,1858\n244781,934\n244782,1860\n244783,1858\n244784,179170\n244785,3623\n244786,138686\n244787,175\n244788,1326\n244790,287\n244790,809\n244791,690\n244792,179170\n244795,972\n244796,968\n244796,1782\n244797,302\n244798,179170\n244799,79\n244800,124668\n244801,861\n244803,55849\n244804,55849\n244805,1566\n244806,313\n244807,682\n244807,72439\n244808,179170\n244809,868\n244810,179170\n244811,452\n244811,457\n244811,497\n244811,535\n244811,794\n244811,918\n244811,1147\n244811,1417\n244811,1673\n244812,179170\n244813,55849\n244815,272\n244816,714\n244817,50\n244818,515\n244819,58\n244820,22\n244821,217\n244822,178\n244823,1220\n244824,2073\n244825,244826\n244827,179170\n244828,356\n244829,875\n244830,483\n244831,1392\n244832,9457\n244833,179170\n244834,192\n244835,1381\n244836,557\n244837,1556\n244839,179170\n244840,2979\n244841,3582\n244842,1531\n244843,56\n244844,422\n244845,151\n244846,366\n244847,2205\n244847,33424\n244848,1860\n244849,1858\n244851,179170\n244852,215\n244853,1688\n244854,79\n244855,707\n244856,994\n244857,58\n244858,46\n244859,22\n244860,9457\n244861,3317\n244861,142870\n244862,1381\n244863,179170\n244864,240174\n244865,4192\n244865,4193\n244866,56\n244867,422\n244868,179170\n244869,1010\n244870,356\n244870,852\n244871,179170\n244872,781\n244873,1132\n244874,240174\n244876,209\n244877,781\n244878,1132\n244879,151\n244880,13661\n244881,996\n244882,200\n244883,244884\n244885,200\n244886,34\n244886,35\n244887,148742\n244888,244889\n244890,1\n244891,563\n244892,852\n244893,1556\n244894,1467\n244895,809\n244896,1860\n244897,1858\n244898,15748\n244900,516\n244901,142433\n244902,467\n244903,1773\n244904,113156\n244905,1151\n244906,1860\n244907,1858\n244908,406\n244909,44\n244910,195\n244911,2735\n244912,77\n244913,932\n244914,28130\n244915,781\n244916,1132\n244917,30\n244918,671\n244919,158\n244920,417\n244921,179170\n244922,138686\n244923,175\n244925,30\n244926,126\n244927,366\n244929,107\n244930,3804\n244931,5405\n244932,563\n244934,35486\n244935,191860\n244936,328\n244937,301\n244937,861\n244937,893\n244937,2979\n244938,107\n244939,179170\n244940,1707\n244941,1160\n244942,149\n244943,179170\n244944,255\n244945,4571\n244946,179170\n244947,244948\n244949,220816\n244950,516\n244951,7092\n244952,151\n244953,30\n244954,220816\n244955,240174\n244956,151\n244957,30\n244958,30\n244959,22\n244960,1623\n244961,220816\n244962,278\n244963,557\n244964,179170\n244965,2421\n244966,4355\n244967,179170\n244968,1309\n244969,406\n244970,220816\n244971,179170\n244972,30\n244973,179170\n244974,595\n244975,206\n244976,220816\n244978,148742\n244979,749\n244980,179170\n244981,220816\n244982,220816\n244983,220816\n244984,1511\n244984,1631\n244984,3069\n244986,147\n244986,149\n244986,21442\n244987,220816\n244988,673\n244989,179170\n244990,217\n244991,138686\n244992,175\n244993,220816\n244994,875\n244995,875\n244996,536\n244997,717\n244998,920\n244999,220816\n245000,179170\n245001,220816\n245002,245003\n245005,3623\n245006,255\n245007,220816\n245008,1544\n245009,245010\n245011,622\n245011,862\n245012,179170\n245013,2421\n245014,795\n245015,973\n245015,1298\n245016,55849\n245017,536\n245018,919\n245019,707\n245020,220816\n245021,120\n245022,1474\n245023,220816\n245024,179170\n245025,1068\n245026,424\n245027,1590\n245028,220816\n245029,217\n245030,179170\n245031,285\n245032,179170\n245033,56\n245034,220816\n245035,179170\n245036,200\n245037,356\n245037,611\n245038,220816\n245039,704\n245040,79\n245041,179170\n245043,179170\n245044,179170\n245045,220816\n245046,862\n245047,536\n245048,179170\n245049,179170\n245050,278\n245051,818\n245052,48\n245053,2116\n245054,1224\n245055,1181\n245056,179170\n245057,179170\n245058,138686\n245059,175\n245060,217\n245061,220816\n245062,179170\n245063,245064\n245065,179170\n245066,220816\n245067,147\n245069,372\n245069,873\n245069,1210\n245070,2421\n245071,179170\n245072,220816\n245073,1860\n245074,1858\n245075,994\n245076,1052\n245077,54\n245078,179170\n245079,2775\n245080,1962\n245081,220816\n245082,3623\n245083,245084\n245085,179170\n245086,707\n245087,179170\n245088,1688\n245089,220816\n245090,179170\n245091,596\n245092,285\n245093,179170\n245094,250\n245094,1684\n245095,179170\n245096,220816\n245097,10\n245097,147\n245097,158\n245097,795\n245097,1572\n245097,3804\n245097,4039\n245098,220816\n245099,1556\n245100,179170\n245101,179170\n245102,30\n245103,220816\n245104,435\n245105,179170\n245106,220816\n245107,179170\n245108,30\n245109,220816\n245110,56\n245111,422\n245112,843\n245113,491\n245114,220816\n245115,220816\n245116,245117\n245118,220816\n245119,220816\n245120,138686\n245121,175\n245122,220816\n245123,6303\n245124,220816\n245125,251\n245125,1531\n245125,2567\n245126,1381\n245127,245128\n245129,34\n245129,35\n245129,217\n245129,283\n245129,313\n245129,379\n245129,577\n245129,623\n245129,1274\n245129,1429\n245129,1467\n245129,1608\n245129,2266\n245129,2274\n245129,2784\n245129,2989\n245129,2991\n245129,3135\n245129,3252\n245129,7092\n245129,13546\n245129,14126\n245130,932\n245131,30\n245132,704\n245133,179170\n245134,493\n245135,179170\n245136,220816\n245137,179170\n245138,577\n245139,392\n245139,697\n245140,220816\n245141,704\n245142,220816\n245143,493\n245144,6556\n245145,179170\n245146,171\n245147,179170\n245148,250\n245148,1684\n245149,285\n245150,285\n245151,250\n245151,1684\n245152,179170\n245154,4411\n245155,1309\n245156,179170\n245157,366\n245158,366\n245159,366\n245160,179170\n245161,920\n245162,138\n245163,1531\n245164,220816\n245165,245166\n245167,422\n245168,56\n245169,245170\n245171,920\n245172,99\n245173,422\n245174,56\n245175,220816\n245176,179170\n245177,577\n245178,2590\n245180,179170\n245181,245182\n245183,304\n245184,220816\n245185,207\n245186,240174\n245187,220816\n245188,2590\n245189,16153\n245190,151\n245191,179170\n245192,1544\n245193,4237\n245193,182162\n245194,872\n245195,1429\n245196,179170\n245197,202\n245198,30\n245199,192\n245200,919\n245202,671\n245203,1132\n245204,668\n245205,1\n245206,217\n245207,1511\n245207,3069\n245208,179170\n245209,349\n245210,779\n245211,1010\n245212,6556\n245213,245214\n245215,327\n245215,434\n245215,435\n245215,621\n245215,622\n245215,1045\n245215,1294\n245215,2710\n245215,3924\n245215,4426\n245215,5678\n245215,18416\n245215,28354\n245215,84634\n245215,92959\n245215,114220\n245215,149028\n245215,149137\n245215,187106\n245217,718\n245218,994\n245219,2168\n245220,360\n245222,1052\n245223,54\n245224,2775\n245225,1962\n245226,299\n245227,220816\n245228,220816\n245229,366\n245230,1241\n245231,264\n245231,649\n245232,366\n245233,366\n245234,179170\n245235,1359\n245236,179170\n245237,640\n245238,595\n245239,126\n245239,918\n245240,338\n245241,2146\n245242,220816\n245243,187\n245244,245245\n245246,1326\n245247,1893\n245248,245249\n245250,222\n245251,485\n245252,298\n245253,1\n245253,58\n245253,130\n245253,304\n245253,649\n245253,660\n245253,743\n245253,1078\n245253,1309\n245253,1326\n245254,187176\n245255,5469\n245256,4218\n245257,994\n245258,1359\n245259,349\n245259,485\n245259,685\n245260,302\n245261,1707\n245262,222\n245263,179170\n245265,344\n245266,422\n245267,422\n245268,994\n245269,422\n245270,422\n245271,422\n245272,422\n245273,422\n245274,422\n245275,422\n245276,422\n245277,179170\n245278,422\n245279,422\n245280,212914\n245281,240\n245282,1776\n245282,242826\n245285,1631\n245286,1359\n245287,1300\n245288,595\n245289,1143\n245291,35486\n245292,1368\n245295,151\n245296,1212\n245296,16153\n245297,920\n245299,16019\n245300,272\n245302,760\n245304,141912\n245305,245306\n245309,285\n245310,138686\n245311,175\n245312,379\n245313,195\n245315,56\n245316,422\n245317,387\n245319,1927\n245320,1359\n245321,3\n245323,4545\n245323,56150\n245324,1238\n245325,179170\n245326,14797\n245327,697\n245328,1001\n245329,1452\n245330,932\n245331,2775\n245332,245333\n245334,245333\n245335,433\n245337,245338\n245339,58\n245339,726\n245339,1432\n245340,1243\n245341,83\n245342,406\n245343,20757\n245344,56\n245345,422\n245346,312\n245347,852\n245348,1052\n245349,54\n245350,2775\n245351,1962\n245352,1085\n245353,781\n245354,1132\n245355,602\n245356,489\n245357,1052\n245358,54\n245359,2775\n245360,1962\n245361,189266\n245362,333\n245362,1033\n245363,872\n245364,217\n245364,1417\n245367,120\n245368,19356\n245369,1603\n245370,991\n245371,1001\n245372,1052\n245373,54\n245374,2775\n245375,1962\n245376,178\n245378,3769\n245379,217\n245381,151\n245381,663\n245382,1509\n245383,2411\n245384,242246\n245385,192\n245386,657\n245386,694\n245387,19\n245387,808\n245389,309\n245389,310\n245390,1284\n245391,1860\n245392,1858\n245393,980\n245394,83\n245395,925\n245396,1634\n245397,135\n245398,518\n245399,1479\n245401,1860\n245402,1858\n245403,179170\n245404,48\n245404,583\n245405,245406\n245407,1113\n245408,189303\n245409,179170\n245411,217\n245412,364\n245412,1227\n245412,86416\n245413,1284\n245414,389\n245415,704\n245416,5213\n245417,1860\n245418,1858\n245419,6556\n245421,372\n245422,147\n245423,79\n245423,1019\n245423,1370\n245424,217\n245425,1133\n245426,1132\n245427,781\n245428,245429\n245432,1\n245432,147\n245432,285\n245432,304\n245432,626\n245432,1425\n245432,1888\n245432,2411\n245432,2424\n245432,6027\n245433,1782\n245434,206\n245435,1132\n245436,781\n245437,557\n245438,245439\n245440,141912\n245441,1888\n245442,1370\n245446,515\n245447,43203\n245448,79\n245449,68\n245450,1631\n245451,1133\n245453,1773\n245454,781\n245455,1132\n245456,1151\n245457,872\n245458,360\n245458,1132\n245460,477\n245461,30\n245464,1052\n245465,179170\n245466,60576\n245467,5405\n245468,720\n245469,1363\n245470,477\n245471,417\n245472,138686\n245473,175\n245474,1181\n245475,707\n245476,179170\n245477,868\n245478,5405\n245479,749\n245481,6387\n245483,179170\n245484,179170\n245485,707\n245486,433\n245489,1769\n245490,179170\n245491,467\n245492,179170\n245493,1688\n245494,16153\n245495,349\n245496,222\n245497,707\n245499,192\n245500,126\n245500,918\n245501,1\n245502,255\n245503,1688\n245504,1556\n245505,179170\n245506,4594\n245507,179170\n245508,430\n245509,996\n245511,179170\n245512,179170\n245513,1\n245514,151\n245515,245516\n245518,179170\n245519,179170\n245520,179170\n245522,1368\n245523,1556\n245524,212914\n245525,142870\n245526,557\n245527,86\n245528,3999\n245528,5440\n245529,179170\n245530,245531\n245532,859\n245533,333\n245534,920\n245535,302\n245536,179170\n245537,406\n245538,483\n245539,179170\n245540,4355\n245541,187\n245542,707\n245543,994\n245544,251\n245545,5906\n245546,557\n245547,626\n245548,278\n245549,137\n245550,862\n245551,179170\n245552,179170\n245553,536\n245554,55849\n245555,44\n245556,215\n245557,862\n245558,97\n245560,515\n245561,1893\n245562,1052\n245563,433\n245564,994\n245565,147\n245566,1132\n245567,781\n245568,781\n245569,1132\n245570,994\n245571,179170\n245572,179170\n245573,83\n245574,841\n245575,1068\n245577,557\n245578,179170\n245583,302\n245585,3623\n245586,781\n245587,1132\n245589,99\n245590,435\n245591,179170\n245592,6323\n245593,179170\n245594,5961\n245596,7092\n245597,217\n245598,179170\n245599,202\n245600,179170\n245602,991\n245603,179170\n245604,1284\n245605,179170\n245606,179170\n245607,264\n245608,179170\n245609,278\n245610,843\n245611,179170\n245612,179170\n245613,406\n245616,809\n245618,178\n245619,83\n245620,102\n245621,1326\n245622,1323\n245623,408\n245624,30\n245625,1294\n245626,781\n245627,1132\n245628,301\n245629,392\n245630,83\n245630,1608\n245633,781\n245634,1132\n245635,149\n245636,1858\n245637,1860\n245638,1220\n245639,516\n245640,252\n245641,245642\n245643,5265\n245644,781\n245645,1132\n245646,83\n245647,893\n245648,1522\n245649,245650\n245651,83\n245652,557\n245653,862\n245654,240174\n245655,215276\n245656,1893\n245656,2617\n245656,2626\n245657,179170\n245658,920\n245659,6424\n245660,179170\n245661,3999\n245662,179170\n245663,179170\n245664,179170\n245665,30\n245666,179170\n245667,358\n245668,179170\n245669,179170\n245670,245671\n245672,179170\n245673,330\n245675,179170\n245676,994\n245677,147\n245678,861\n245679,191860\n245680,179170\n245681,245682\n245683,179170\n245684,6789\n245685,1087\n245686,1453\n245687,179170\n245688,704\n245689,79\n245690,220816\n245691,179170\n245692,1608\n245693,83\n245694,220816\n245695,220816\n245696,245697\n245698,1612\n245700,220816\n245701,179170\n245702,2373\n245703,179170\n245704,220816\n245705,179170\n245706,68\n245706,22071\n245707,707\n245708,245709\n245710,179170\n245711,220816\n245712,2421\n245713,5213\n245714,220816\n245715,138686\n245716,175\n245717,220816\n245718,179170\n245720,220816\n245721,406\n245721,1181\n245722,220816\n245723,220816\n245724,220816\n245725,146\n245725,92476\n245726,647\n245727,344\n245728,167\n245729,220816\n245730,220816\n245731,179170\n245732,1449\n245733,220816\n245734,220816\n245735,35486\n245736,406\n245737,245738\n245739,220816\n245740,302\n245741,220816\n245742,707\n245743,220816\n245744,1252\n245744,1253\n245745,872\n245746,240\n245747,220816\n245748,220816\n245749,220816\n245750,220816\n245751,220816\n245752,116\n245752,1432\n245752,2087\n245752,5871\n245752,13704\n245753,220816\n245754,220816\n245755,220816\n245756,220816\n245757,220816\n245758,220816\n245759,1773\n245760,10\n245761,220816\n245762,220816\n245763,2750\n245764,220816\n245765,1807\n245766,147\n245767,220816\n245768,220816\n245769,220816\n245770,220816\n245771,126\n245771,918\n245772,220816\n245773,179170\n245774,220816\n245775,1402\n245776,220816\n245778,220816\n245780,179170\n245781,818\n245782,1465\n245782,6726\n245783,220816\n245784,220816\n245785,179170\n245786,220816\n245787,240\n245788,220816\n245789,179170\n245790,433\n245791,220816\n245792,579\n245793,179170\n245794,264\n245795,220816\n245796,707\n245797,23783\n245798,220816\n245799,994\n245800,179170\n245801,158\n245802,179170\n245803,179170\n245804,179170\n245805,251\n245806,1353\n245807,3295\n245808,245809\n245810,245809\n245811,195\n245812,147\n245813,1544\n245814,236180\n245815,179170\n245816,245817\n245818,245819\n245820,704\n245821,493\n245822,179170\n245823,491\n245824,179170\n245825,1235\n245825,1335\n245827,211\n245828,30\n245828,1133\n245828,2045\n245829,781\n245830,1132\n245831,1644\n245832,179170\n245833,1572\n245836,366\n245838,366\n245839,366\n245840,333\n245842,1326\n245843,245844\n245846,245847\n245848,1231\n245848,1782\n245848,2083\n245851,209\n245852,994\n245853,760\n245854,994\n245855,245856\n245857,23783\n245858,424\n245859,872\n245860,640\n245861,640\n245862,640\n245863,640\n245864,145240\n245865,852\n245866,179170\n245867,179170\n245868,346\n245869,1287\n245871,2671\n245872,1634\n245873,240\n245874,79\n245876,118336\n245879,868\n245880,245881\n245882,3003\n245883,1151\n245885,1860\n245886,1858\n245887,245888\n245890,2460\n245891,163\n245892,255\n245893,1860\n245894,1858\n245895,447\n245897,138686\n245898,175\n245899,245900\n245901,663\n245901,2205\n245901,33424\n245901,245910\n245903,35486\n245904,1893\n245905,217\n245906,743\n245907,179170\n245908,179170\n245909,1572\n245910,289\n245910,298\n245910,397\n245910,704\n245910,714\n245910,1016\n245910,1192\n245910,1282\n245910,1462\n245910,1818\n245910,2205\n245910,2286\n245910,4218\n245910,8537\n245910,33424\n245910,94134\n245910,245910\n245911,1882\n245912,682\n245912,72439\n245913,1400\n245914,326\n245915,146\n245915,92476\n245916,647\n245917,344\n245918,1188\n245919,179170\n245920,868\n245921,33\n245921,40\n245921,60\n245921,115\n245921,118\n245921,1253\n245921,1432\n245921,2674\n245921,154690\n245921,171294\n245922,920\n245923,743\n245925,179170\n245926,200\n245927,707\n245929,179170\n245930,1132\n245931,3094\n245932,1274\n245933,3252\n245934,2646\n245935,192\n245936,217\n245937,200\n245938,422\n245939,563\n245939,911\n245939,991\n245939,1132\n245939,1623\n245941,83\n245942,1381\n245943,1082\n245944,158\n245945,422\n245946,422\n245947,422\n245948,2775\n245949,447\n245951,422\n245954,422\n245955,852\n245956,87\n245956,1151\n245957,1181\n245958,932\n245959,422\n245960,179170\n245961,422\n245962,422\n245963,994\n245964,1238\n245965,406\n245967,852\n245967,1688\n245968,1618\n245969,1452\n245970,424\n245971,424\n245972,994\n245973,1432\n245974,118336\n245976,309\n245976,310\n245977,779\n245978,179170\n245980,925\n245981,1132\n245983,50\n245984,304\n245985,179170\n245986,4611\n245987,1544\n245988,23783\n245989,312\n245990,118336\n245991,138686\n245992,175\n245993,536\n245994,563\n245995,202\n245996,179170\n245997,179170\n245998,994\n245999,2605\n246000,1707\n246002,875\n246003,843\n246004,592\n246005,843\n246006,843\n246007,315\n246008,843\n246009,1789\n246010,302\n246010,861\n246011,246012\n246013,114\n246014,3585\n246015,3582\n246016,406\n246017,994\n246018,8270\n246019,3585\n246020,2620\n246021,346\n246022,30\n246023,30\n246024,743\n246025,209\n246026,5405\n246027,222\n246028,11\n246029,1370\n246030,861\n246031,179170\n246032,179170\n246033,73570\n246034,859\n246035,1858\n246036,1860\n246037,246038\n246039,73570\n246040,285\n246041,136\n246041,563\n246042,1983\n246043,142430\n246044,30\n246045,248\n246045,1332\n246046,217\n246047,3999\n246048,4611\n246049,1544\n246050,1274\n246051,246052\n246053,30\n246054,1052\n246055,54\n246056,2775\n246057,1962\n246058,302\n246059,1893\n246060,289\n246060,94134\n246061,149\n246062,83\n246063,209\n246064,450\n246065,7360\n246066,30\n246067,151\n246068,30\n246069,328\n246069,141912\n246070,781\n246071,1132\n246072,781\n246073,1132\n246074,179170\n246075,118336\n246076,148742\n246078,30\n246079,1544\n246080,4611\n246081,387\n246082,8270\n246083,491\n246084,1749\n246084,1882\n246085,872\n246086,114\n246086,116\n246086,2087\n246086,13704\n246087,493\n246088,1160\n246089,4060\n246090,2073\n246091,19010\n246092,3392\n246093,158\n246094,1722\n246095,1818\n246096,1167\n246097,1785\n246098,589\n246099,605\n246100,1124\n246101,1782\n246102,973\n246103,86\n246104,660\n246105,994\n246106,240174\n246107,918\n246107,1160\n246108,563\n246109,2979\n246110,515\n246111,30\n246112,2266\n246113,775\n246114,222\n246115,30\n246116,19010\n246117,2105\n246118,19010\n246119,126\n246120,1119\n246121,875\n246122,875\n246123,179170\n246124,106\n246124,195\n246124,586\n246126,30\n246127,1240\n246128,1285\n246129,862\n246129,1085\n246129,2812\n246130,1381\n246130,1612\n246131,30\n246132,255\n246133,1\n246134,30\n246135,1888\n246136,3260\n246137,79\n246138,30\n246139,918\n246140,30\n246141,179170\n246142,246143\n246144,151\n246145,1285\n246146,179170\n246147,138686\n246148,175\n246149,179170\n246150,2017\n246151,1220\n246152,252\n246153,251\n246154,179170\n246155,1\n246156,389\n246156,1072\n246157,179170\n246158,516\n246159,19010\n246161,30\n246162,493\n246163,240\n246164,1882\n246165,179170\n246166,20\n246167,393\n246168,1132\n246169,246170\n246171,557\n246172,135\n246173,179170\n246174,83\n246175,30\n246176,149\n246177,30\n246178,227061\n246179,278\n246180,151\n246181,252\n246182,179170\n246183,1181\n246184,694\n246184,1240\n246185,30\n246186,272\n246186,333\n246186,1531\n246187,34\n246187,35\n246187,37\n246187,44\n246187,50\n246187,58\n246187,59\n246187,79\n246187,104\n246187,106\n246187,111\n246187,116\n246187,135\n246187,147\n246187,178\n246187,195\n246187,202\n246187,264\n246187,278\n246187,289\n246187,333\n246187,337\n246187,372\n246187,393\n246187,479\n246187,516\n246187,577\n246187,585\n246187,588\n246187,590\n246187,592\n246187,620\n246187,622\n246187,640\n246187,720\n246187,779\n246187,877\n246187,907\n246187,949\n246187,1007\n246187,1033\n246187,1085\n246187,1151\n246187,1210\n246187,1212\n246187,1247\n246187,1265\n246187,1266\n246187,1284\n246187,1370\n246187,1381\n246187,1453\n246187,1454\n246187,1509\n246187,1515\n246187,1522\n246187,1531\n246187,1634\n246187,1659\n246187,1732\n246187,1776\n246187,1893\n246187,2051\n246187,2073\n246187,2087\n246187,2191\n246187,2371\n246187,2782\n246187,2931\n246187,3194\n246187,3422\n246187,3695\n246187,3794\n246187,4079\n246187,4192\n246187,4193\n246187,5265\n246187,5310\n246187,5440\n246187,8180\n246187,8270\n246187,8308\n246187,8598\n246187,8788\n246187,8811\n246187,8822\n246187,8907\n246187,9542\n246187,31237\n246187,44244\n246187,94134\n246187,164572\n246187,240174\n246188,217\n246190,14366\n246191,32\n246192,634\n246193,179170\n246194,694\n246194,3115\n246195,30\n246196,406\n246197,406\n246198,179170\n246199,246200\n246201,707\n246202,602\n246203,595\n246204,179170\n246205,179170\n246206,10\n246207,602\n246207,3370\n246208,34\n246208,35\n246209,1368\n246210,535\n246211,3148\n246212,83\n246213,1177\n246214,292\n246215,8270\n246216,146314\n246217,333\n246218,622\n246219,781\n246220,1132\n246221,994\n246222,7092\n246223,15119\n246224,994\n246226,406\n246227,994\n246228,932\n246229,704\n246230,79\n246231,83378\n246232,278\n246233,332\n246234,179170\n246235,1860\n246236,1858\n246237,179170\n246238,179170\n246239,663\n246239,4545\n246239,6119\n246239,56150\n246240,1274\n246241,179170\n246242,83\n246243,246244\n246245,179170\n246246,179170\n246248,179170\n246249,1773\n246250,525\n246250,1893\n246250,3804\n246251,1151\n246252,557\n246253,138\n246254,865\n246255,557\n246256,137\n246257,88820\n246258,10\n246259,179170\n246260,179170\n246261,179170\n246262,179170\n246263,179170\n246264,179170\n246265,179170\n246266,179170\n246267,137\n246268,179170\n246269,179170\n246270,179170\n246271,179170\n246272,182162\n246273,1608\n246274,313\n246274,1590\n246274,1644\n246274,2274\n246275,179170\n246276,333\n246277,179170\n246278,195\n246279,179170\n246281,30\n246282,1718\n246283,179170\n246284,179170\n246285,207\n246286,179170\n246287,217\n246288,366\n246289,179170\n246290,179170\n246291,246292\n246293,179170\n246294,707\n246295,328\n246296,356\n246297,179170\n246298,240\n246298,251\n246298,278\n246298,372\n246298,435\n246298,447\n246298,516\n246298,518\n246298,589\n246298,775\n246298,973\n246298,1001\n246298,1010\n246298,1082\n246298,1085\n246298,1326\n246298,2812\n246298,5961\n246299,240\n246300,450\n246301,138686\n246302,175\n246303,215\n246304,246305\n246306,246307\n246308,179170\n246310,147\n246311,220816\n246312,50\n246313,707\n246314,220816\n246315,220816\n246316,220816\n246317,406\n246318,220816\n246319,220816\n246320,220816\n246321,220816\n246322,2373\n246323,179170\n246324,1224\n246325,24505\n246326,1467\n246327,493\n246328,246329\n246330,250\n246330,1684\n246331,285\n246332,366\n246333,366\n246334,1326\n246335,1323\n246336,102\n246337,408\n246338,179170\n246339,250\n246339,1684\n246340,1085\n246341,294\n246342,4222\n246343,1010\n246344,671\n246346,406\n246347,138686\n246348,175\n246349,1326\n246350,220816\n246352,1087\n246353,106\n246354,246355\n246356,220816\n246357,269\n246358,220816\n246359,920\n246360,1227\n246360,86416\n246361,220816\n246362,246363\n246364,779\n246365,220816\n246366,346\n246367,220816\n246368,220816\n246369,225\n246370,483\n246371,10\n246372,220816\n246373,10\n246374,220816\n246375,220816\n246376,30\n246377,862\n246378,1368\n246379,30\n246380,1274\n246381,246382\n246383,30\n246384,8884\n246385,220816\n246386,1085\n246387,1551\n246388,1769\n246388,2205\n246388,33424\n246388,245910\n246389,220816\n246390,220816\n246391,246392\n246393,86416\n246394,3804\n246395,220816\n246396,179170\n246397,30\n246398,795\n246399,1181\n246400,240\n246401,82603\n246402,82603\n246403,1\n246404,563\n246405,30\n246406,179170\n246407,179170\n246408,220816\n246409,179170\n246410,179170\n246411,179170\n246412,671\n246413,220816\n246414,179170\n246415,30\n246416,30\n246417,15748\n246418,972\n246419,179170\n246420,707\n246421,302\n246422,285\n246423,250\n246423,1684\n246424,366\n246425,285\n246426,366\n246427,250\n246427,1684\n246428,220816\n246429,148742\n246430,707\n246431,809\n246432,366\n246433,707\n246434,58\n246435,220816\n246436,366\n246437,5440\n246438,535\n246439,1634\n246440,707\n246441,220816\n246442,220816\n246443,167\n246444,2205\n246444,33424\n246444,245910\n246445,220816\n246446,68\n246447,179170\n246448,30\n246449,220816\n246450,1140\n246451,35486\n246452,179170\n246453,267\n246454,149\n246455,1458\n246456,1858\n246457,1860\n246458,2744\n246459,1014\n246460,1014\n246461,1014\n246462,179170\n246463,1014\n246464,179170\n246465,246466\n246467,1014\n246468,1014\n246469,1014\n246470,200\n246471,34\n246471,35\n246472,1014\n246473,932\n246474,1818\n246475,1294\n246476,994\n246477,994\n246478,285\n246480,192\n246481,346\n246482,891\n246483,83\n246485,1014\n246486,18726\n246487,136\n246487,137\n246488,1132\n246489,781\n246490,104\n246491,211\n246494,246495\n246496,1466\n246497,13546\n246498,455\n246499,2266\n246500,2443\n246501,2443\n246502,283\n246503,217\n246504,269\n246505,781\n246506,1132\n246507,246508\n246510,346\n246511,30\n246512,1888\n246513,707\n246514,9318\n246515,707\n246516,707\n246517,346\n246519,483\n246520,760\n246521,30\n246522,875\n246523,1381\n246524,1381\n246525,149\n246527,973\n246528,312\n246529,682\n246529,72439\n246530,30\n246531,1381\n246532,949\n246532,4637\n246533,2244\n246534,1893\n246535,30\n246536,30\n246537,246538\n246539,79\n246540,30\n246541,179170\n246542,179170\n246543,30\n246544,932\n246545,707\n246546,72\n246547,30\n246548,2083\n246549,1151\n246549,1287\n246551,640\n246551,1181\n246551,4192\n246551,4193\n246552,697\n246553,346\n246554,1844\n246554,4237\n246554,9024\n246554,182162\n246555,30\n246556,1858\n246557,1860\n246558,246559\n246560,30\n246561,707\n246562,707\n246563,707\n246564,707\n246565,818\n246566,707\n246567,503\n246568,707\n246569,707\n246570,155481\n246571,138686\n246572,175\n246573,473\n246574,2296\n246575,346\n246576,146\n246576,92476\n246577,647\n246578,344\n246579,220816\n246580,113156\n246581,60576\n246582,707\n246583,179170\n246584,220816\n246585,3623\n246586,3623\n246587,30\n246588,2373\n246589,30\n246590,220816\n246591,707\n246592,707\n246593,346\n246594,1479\n246595,390\n246596,707\n246598,30\n246599,346\n246600,246601\n246602,30\n246603,30\n246604,30\n246606,346\n246607,30\n246608,113156\n246609,393\n246610,346\n246611,267\n246612,255\n246613,346\n246614,707\n246615,1132\n246616,781\n246617,346\n246618,433\n246619,346\n246620,19010\n246621,179170\n246622,346\n246624,346\n246625,179170\n246627,707\n246628,233\n246629,875\n246630,81\n246630,1745\n246631,1052\n246632,54\n246633,2775\n246634,1962\n246636,151\n246636,663\n246637,65\n246638,246639\n246641,246642\n246644,220816\n246645,220816\n246646,179170\n246647,220816\n246648,392\n246649,220816\n246650,220816\n246651,220816\n246652,220816\n246653,220816\n246654,220816\n246655,220816\n246656,220816\n246657,13704\n246657,23010\n246658,94\n246658,22663\n246659,42220\n246660,54064\n246661,6068\n246662,1785\n246663,4193\n246663,15573\n246663,182162\n246664,968\n246665,907\n246666,1191\n246666,7363\n246667,1087\n246667,92476\n246668,1203\n246669,953\n246670,115\n246671,1177\n246671,3794\n246671,94134\n246672,220816\n246673,220816\n246674,273\n246675,220816\n246676,179170\n246677,220816\n246679,220816\n246680,195\n246680,27217\n246682,220816\n246683,220816\n246684,220816\n246685,246686\n246687,220816\n246688,30\n246689,220816\n246690,222\n246691,220816\n246692,1849\n246693,220816\n246694,1773\n246695,220816\n246696,220816\n246697,179170\n246698,220816\n246699,220816\n246701,805\n246702,179170\n246703,246704\n246703,252982\n246705,220816\n246706,107\n246707,2416\n246707,2417\n246708,292\n246709,338\n246710,4237\n246710,182162\n246711,298\n246712,1133\n246713,3538\n246714,805\n246715,220816\n246716,220816\n246717,953\n246718,392\n246719,949\n246720,63\n246721,220816\n246722,1634\n246724,707\n246725,83\n246726,220816\n246727,35486\n246728,220816\n246729,240\n246730,83\n246731,158\n246733,83\n246734,154408\n246735,994\n246737,83\n246738,179170\n246739,83\n246740,503\n246740,592\n246740,1688\n246740,1860\n246740,1962\n246740,4237\n246740,182162\n246741,932\n246742,83\n246743,1962\n246744,596\n246745,5265\n246745,164572\n246746,1266\n246746,1414\n246746,72439\n246747,261\n246748,1082\n246748,1253\n246749,298\n246750,1087\n246750,92476\n246751,117\n246751,1203\n246752,15573\n246752,182162\n246753,211\n246753,7363\n246754,83\n246755,1191\n246756,115\n246757,3794\n246757,27550\n246758,8991\n246759,116\n246759,29475\n246760,1192\n246761,2266\n246762,589\n246763,818\n246763,2868\n246764,23010\n246765,160\n246768,344\n246769,83\n246770,707\n246772,83\n246775,1860\n246776,1858\n246777,179170\n246778,387\n246779,149\n246780,143\n246781,433\n246783,994\n246784,147\n246785,179170\n246787,298\n246788,485\n246789,179170\n246790,581\n246791,1381\n246792,1381\n246793,435\n246793,29015\n246793,32929\n246793,248818\n246794,1983\n246795,138686\n246796,175\n246798,179170\n246799,206\n246800,2266\n246800,6424\n246802,1132\n246803,781\n246805,406\n246806,805\n246808,1181\n246809,1181\n246810,179170\n246811,72\n246812,246813\n246814,246815\n246816,179170\n246817,5213\n246820,163\n246821,179170\n246822,179170\n246823,805\n246824,346\n246825,179170\n246826,2995\n246827,30\n246829,1962\n246830,1773\n246831,1181\n246832,346\n246833,6068\n246833,25348\n246833,94134\n246833,164572\n246834,1266\n246834,20813\n246835,932\n246836,255\n246837,7652\n246837,92476\n246838,5\n246838,307\n246839,302\n246840,346\n246842,483\n246844,206\n246845,224488\n246846,157091\n246846,199972\n246846,211506\n246846,217083\n246846,217086\n246847,246848\n246849,1891\n246850,289\n246850,94134\n246851,1010\n246852,206\n246853,707\n246854,392\n246855,1132\n246856,781\n246857,246858\n246859,557\n246860,240174\n246861,907\n246861,25348\n246862,60\n246862,114\n246862,741\n246863,30\n246864,557\n246865,994\n246866,138686\n246867,175\n246868,1893\n246869,994\n246870,707\n246871,1509\n246872,538\n246872,9379\n246873,142870\n246874,8308\n246875,56\n246876,422\n246878,179170\n246880,137\n246881,240174\n246882,707\n246883,707\n246884,346\n246885,30\n246886,206\n246888,994\n246889,346\n246890,1087\n246891,346\n246893,346\n246894,30\n246896,994\n246897,246898\n246899,809\n246899,1085\n246900,366\n246901,188791\n246902,1181\n246903,818\n246903,2991\n246904,2868\n246904,182162\n246905,2073\n246906,1177\n246907,4193\n246907,8373\n246908,452\n246909,1087\n246909,1684\n246910,246911\n246912,302\n246913,179170\n246914,32\n246915,346\n246916,34\n246916,35\n246917,422\n246918,3623\n246919,135\n246920,30\n246921,406\n246921,622\n246922,30\n246923,246924\n246925,30\n246926,346\n246927,246928\n246929,2480\n246930,6068\n246931,255\n246932,3623\n246933,364\n246934,5\n246934,195\n246934,191860\n246935,1266\n246935,2371\n246935,72439\n246936,1785\n246937,1684\n246937,8373\n246938,8788\n246939,8991\n246939,25348\n246940,8270\n246941,307\n246941,452\n246942,7652\n246943,3872\n246944,907\n246945,805\n246946,516\n246947,179170\n246948,138686\n246949,175\n246950,1893\n246951,187\n246952,246953\n246954,246953\n246955,55849\n246956,360\n246957,422\n246958,56\n246959,1227\n246960,2244\n246961,1181\n246962,1181\n246963,1181\n246964,246965\n246966,657\n246967,119\n246968,640\n246969,246970\n246971,104\n246972,2073\n246973,10\n246974,292\n246975,114\n246976,246977\n246978,294\n246979,142473\n246980,296\n246981,298\n246982,15068\n246983,3623\n246984,704\n246985,592\n246986,406\n246987,493\n246988,585\n246989,586\n246990,393\n246991,79\n246992,50\n246993,312\n246994,246995\n246996,246997\n246998,30\n247000,247001\n247002,247001\n247003,247004\n247005,4611\n247006,1544\n247007,328\n247007,25348\n247008,827\n247008,92476\n247008,164572\n247009,818\n247010,1089\n247011,1381\n247012,136\n247013,247014\n247015,83\n247016,907\n247017,2244\n247018,1983\n247019,247020\n247021,8854\n247022,1882\n247023,179170\n247024,1927\n247025,615\n247026,447\n247027,2775\n247028,1132\n247029,781\n247030,994\n247031,707\n247032,5301\n247033,1860\n247034,1858\n247036,346\n247037,56\n247038,422\n247039,211\n247040,1927\n247041,162599\n247042,240\n247042,2334\n247042,3331\n247043,1043\n247044,640\n247045,640\n247046,640\n247047,138686\n247048,175\n247049,104\n247050,83\n247051,1572\n247052,1634\n247053,247054\n247055,433\n247056,106\n247056,586\n247059,389\n247059,185877\n247061,141912\n247062,346\n247063,422\n247064,862\n247065,671\n247067,4193\n247067,6068\n247068,1087\n247068,1684\n247069,34\n247069,272\n247070,195\n247070,7652\n247071,422\n247072,422\n247073,422\n247075,240\n247075,1309\n247075,2512\n247075,4190\n247075,9015\n247075,204698\n247075,219266\n247075,261748\n247076,422\n247077,422\n247078,422\n247079,422\n247080,422\n247081,285\n247082,422\n247083,422\n247085,1381\n247087,1425\n247088,707\n247089,6424\n247090,1707\n247091,346\n247092,1238\n247095,920\n247096,3538\n247097,406\n247099,1452\n247101,35486\n247102,309\n247102,310\n247103,1130\n247104,4193\n247105,415\n247106,1556\n247107,1294\n247108,209\n247108,861\n247109,269\n247110,1707\n247111,137\n247112,269\n247113,8541\n247114,827\n247115,226825\n247116,875\n247117,1001\n247118,415\n247119,920\n247120,179170\n247121,3623\n247122,138686\n247123,175\n247124,1052\n247125,54\n247126,2775\n247127,1962\n247128,264\n247129,179170\n247130,1012\n247132,2244\n247133,309\n247133,310\n247134,301\n247135,1509\n247137,1634\n247138,1655\n247139,809\n247140,1756\n247141,5906\n247142,37088\n247143,1019\n247144,2944\n247145,2553\n247147,868\n247149,192\n247150,30\n247151,932\n247152,6424\n247152,127158\n247153,7768\n247155,493\n247156,406\n247157,247158\n247159,247160\n247161,1359\n247162,422\n247163,2931\n247163,92476\n247163,164572\n247164,843\n247165,184\n247167,1220\n247168,516\n247169,252\n247170,302\n247171,1240\n247172,83\n247173,44\n247174,272\n247175,147\n247176,247177\n247178,167\n247178,2083\n247178,73570\n247179,1458\n247180,841\n247181,5265\n247182,875\n247183,859\n247184,1531\n247185,671\n247186,779\n247186,68069\n247187,694\n247189,3623\n247190,596\n247191,140\n247192,2620\n247193,3623\n247194,577\n247195,2590\n247196,1844\n247197,6119\n247198,56\n247199,422\n247200,640\n247202,31073\n247203,146\n247203,92476\n247204,647\n247205,344\n247206,2260\n247207,1454\n247208,145751\n247209,15\n247210,406\n247210,21442\n247211,1085\n247212,875\n247215,1571\n247216,3177\n247217,118336\n247218,10\n247218,3111\n247219,312\n247220,240174\n247222,893\n247223,73570\n247224,439\n247224,1068\n247225,2646\n247226,459\n247228,346\n247229,1773\n247230,818\n247231,875\n247232,442\n247232,1332\n247233,459\n247234,346\n247235,179170\n247236,179170\n247238,22\n247239,2421\n247240,63\n247241,805\n247243,346\n247246,192\n247247,13704\n247248,187176\n247249,2421\n247250,868\n247251,217\n247252,408\n247253,483\n247254,179170\n247255,3623\n247256,179170\n247259,693\n247261,179170\n247262,1257\n247263,147\n247264,179170\n247265,358\n247266,1181\n247267,1181\n247268,459\n247270,191860\n247271,5440\n247272,1544\n247272,3370\n247273,1266\n247273,1785\n247273,72439\n247274,2073\n247275,22663\n247276,4193\n247276,15573\n247276,182162\n247277,1087\n247277,92476\n247279,34\n247279,94\n247279,42220\n247280,8991\n247281,1715\n247282,54064\n247283,117\n247283,1203\n247284,372\n247284,25348\n247285,809\n247286,907\n247287,953\n247288,5714\n247289,115\n247289,3794\n247290,1177\n247290,94134\n247291,818\n247291,2868\n247292,1253\n247292,5265\n247292,164572\n247293,5\n247293,364\n247294,179170\n247295,1612\n247295,1927\n247296,994\n247297,179170\n247298,875\n247299,179170\n247300,7416\n247301,30\n247302,1590\n247304,707\n247305,147\n247306,536\n247307,5405\n247308,251\n247309,328\n247310,179170\n247311,1860\n247312,1858\n247313,8180\n247314,247\n247315,332\n247316,30\n247317,309\n247317,310\n247318,5405\n247319,515\n247320,179170\n247322,875\n247323,1326\n247324,346\n247326,489\n247327,571\n247329,289\n247329,1149\n247329,1282\n247329,75912\n247329,94134\n247330,1070\n247331,5405\n247332,3\n247333,346\n247334,3623\n247335,557\n247336,1368\n247337,585\n247337,92476\n247338,818\n247339,392\n247339,2699\n247340,138686\n247341,175\n247342,346\n247343,3321\n247344,5343\n247345,179170\n247346,50\n247346,1544\n247347,247348\n247349,3209\n247350,179170\n247351,2266\n247352,2421\n247353,217\n247354,4637\n247356,1201\n247357,1467\n247359,315\n247360,7363\n247360,20813\n247362,179170\n247363,179170\n247364,875\n247365,179170\n247367,875\n247368,875\n247369,247370\n247371,179170\n247372,200\n247373,251\n247373,516\n247374,1224\n247375,1893\n247376,151\n247377,44\n247378,97\n247379,2931\n247380,1379\n247380,92476\n247381,7652\n247382,1231\n247383,1282\n247384,195\n247384,1118\n247385,3209\n247386,143287\n247387,994\n247388,3623\n247389,707\n247390,151\n247392,4611\n247393,146\n247393,92476\n247394,1151\n247395,4672\n247396,433\n247397,179170\n247398,1436\n247399,406\n247399,602\n247400,240174\n247401,195\n247402,255\n247403,5\n247403,94\n247403,7652\n247404,372\n247405,307\n247405,4355\n247406,827\n247406,92476\n247406,164572\n247407,1181\n247408,42220\n247409,34\n247409,115\n247411,328\n247411,25348\n247412,2995\n247413,1133\n247414,7124\n247414,94134\n247415,1414\n247416,8992\n247417,179170\n247418,1381\n247419,179170\n247420,137\n247421,30\n247422,179170\n247423,433\n247424,1882\n247425,932\n247426,563\n247427,179170\n247428,980\n247429,247\n247430,707\n247431,3260\n247432,1368\n247433,247\n247434,1096\n247435,285\n247436,557\n247437,557\n247438,192\n247439,3623\n247440,113156\n247441,2373\n247442,83\n247444,920\n247445,220816\n247446,2646\n247447,663\n247448,147\n247448,158\n247448,178\n247448,202\n247448,406\n247448,622\n247449,781\n247450,1132\n247451,220816\n247452,1590\n247453,220816\n247454,1467\n247455,149534\n247456,179170\n247457,220816\n247459,220816\n247460,220816\n247461,285\n247462,346\n247463,10\n247464,2421\n247465,220816\n247466,30\n247467,289\n247467,94134\n247468,7092\n247469,220816\n247470,137\n247471,179170\n247472,178\n247473,247474\n247475,179170\n247476,994\n247477,79\n247478,220816\n247479,179170\n247480,220816\n247481,247482\n247483,209\n247484,2421\n247485,1707\n247486,10\n247487,220816\n247488,247489\n247490,278\n247491,346\n247492,220816\n247493,217\n247494,220816\n247495,346\n247496,247497\n247498,1556\n247499,124668\n247500,220816\n247501,1888\n247502,5906\n247503,557\n247504,626\n247505,278\n247506,137\n247507,862\n247508,220816\n247509,781\n247510,1132\n247511,1068\n247512,247513\n247514,1608\n247516,220816\n247517,134\n247518,220816\n247519,215\n247520,875\n247521,1368\n247522,220816\n247523,1220\n247524,252\n247525,516\n247526,220816\n247527,10\n247528,220816\n247529,179170\n247530,13980\n247531,2421\n247532,220816\n247533,447\n247534,2775\n247535,220816\n247536,861\n247537,220816\n247538,385\n247539,220816\n247540,26041\n247541,30\n247542,283\n247543,104\n247543,136\n247543,254\n247543,557\n247543,953\n247543,1368\n247543,1939\n247543,7270\n247544,220816\n247545,220816\n247546,220816\n247547,220816\n247548,3148\n247549,994\n247550,1085\n247551,536\n247552,56\n247553,422\n247554,30\n247555,346\n247556,596\n247557,994\n247558,346\n247559,147\n247560,179170\n247561,1294\n247562,994\n247563,179170\n247564,875\n247565,220816\n247566,220816\n247567,220816\n247568,13980\n247569,278\n247570,875\n247571,220816\n247572,240174\n247573,346\n247574,2116\n247575,220816\n247576,37\n247576,1740\n247577,220816\n247578,273\n247580,994\n247581,346\n247582,994\n247583,155481\n247585,19\n247586,220816\n247587,1181\n247588,217\n247589,30\n247590,247591\n247592,247\n247593,309\n247593,310\n247594,205488\n247595,1849\n247596,30\n247597,30\n247598,3507\n247599,269\n247601,41\n247602,294\n247603,2266\n247604,247605\n247606,138686\n247607,175\n247608,58\n247609,994\n247610,46\n247611,634\n247612,1807\n247612,2775\n247613,589\n247613,1001\n247614,10\n247615,195\n247615,344\n247615,1684\n247616,103153\n247617,77\n247618,1467\n247619,640\n247620,1544\n247622,875\n247623,1773\n247624,788\n247625,388\n247626,155481\n247627,247628\n247629,2424\n247630,179170\n247631,781\n247632,1132\n247633,875\n247634,932\n247635,704\n247636,79\n247637,179170\n247638,875\n247639,536\n247640,35486\n247641,1052\n247644,247645\n247646,267\n247647,1539\n247648,54\n247649,660\n247650,2421\n247651,399\n247652,9030\n247653,312\n247655,994\n247656,58\n247657,46\n247658,2146\n247659,1087\n247660,222\n247661,781\n247662,1132\n247665,209\n247666,366\n247667,217\n247668,167\n247669,707\n247670,366\n247671,2373\n247672,366\n247673,366\n247674,707\n247675,366\n247676,781\n247677,1132\n247678,875\n247679,13980\n247680,247681\n247683,302\n247684,1882\n247685,538\n247685,23161\n247685,26785\n247685,106083\n247685,251408\n247685,252670\n247685,253099\n247687,1860\n247688,1858\n247689,179170\n247690,1860\n247691,1858\n247692,72\n247692,192\n247692,222\n247692,267\n247692,305\n247692,306\n247692,307\n247692,383\n247692,489\n247692,605\n247692,704\n247692,1388\n247692,1509\n247692,1579\n247692,1619\n247692,1634\n247692,1707\n247692,2915\n247692,3297\n247692,3999\n247692,8308\n247694,178\n247695,467\n247695,127158\n247696,640\n247697,640\n247698,640\n247699,1212\n247700,247701\n247702,640\n247703,640\n247704,1204\n247706,827\n247707,75912\n247708,422\n247709,422\n247710,422\n247711,422\n247712,422\n247713,422\n247714,422\n247715,422\n247716,422\n247717,439\n247718,422\n247719,422\n247720,422\n247723,1556\n247724,1124\n247725,390\n247726,589\n247727,1414\n247728,671\n247728,7363\n247729,1087\n247731,577\n247732,707\n247733,149\n247733,406\n247735,247736\n247737,179170\n247738,97\n247739,1014\n247740,146\n247740,92476\n247741,392\n247743,44725\n247744,868\n247745,920\n247746,73570\n247747,4252\n247748,200\n247749,1368\n247750,358\n247751,179170\n247752,1860\n247753,1858\n247754,920\n247755,609\n247756,120\n247757,189839\n247758,83\n247758,3507\n247759,247760\n247761,4678\n247762,579\n247763,179170\n247764,40360\n247766,980\n247767,596\n247767,1616\n247769,35486\n247771,215\n247771,278\n247771,328\n247771,694\n247771,1033\n247771,1962\n247772,261\n247773,1240\n247774,4611\n247775,247776\n247777,247778\n247779,192\n247780,1531\n247781,760\n247782,1983\n247782,48505\n247783,272\n247784,240\n247785,1715\n247787,104\n247789,2931\n247790,2979\n247791,1241\n247792,1326\n247793,3\n247794,5130\n247795,1715\n247796,795\n247797,518\n247798,3094\n247799,775\n247800,233\n247801,3804\n247802,4146\n247803,649\n247804,301\n247805,252\n247807,1326\n247808,217\n247809,631\n247810,240\n247812,179170\n247813,138686\n247814,175\n247815,868\n247816,2421\n247817,1001\n247818,493\n247819,861\n247820,973\n247820,1010\n247820,1298\n247820,1849\n247821,1227\n247821,86416\n247822,707\n247823,4611\n247824,1544\n247825,71\n247826,301\n247827,269\n247828,217\n247829,148742\n247830,1381\n247831,968\n247833,1893\n247834,1644\n247835,1544\n247836,4611\n247839,1844\n247840,1370\n247840,6119\n247840,21736\n247841,247842\n247850,4611\n247855,743\n247857,106\n247858,179170\n247861,83\n247862,577\n247865,1677\n247867,252\n247868,332\n247868,2797\n247875,19010\n247877,872\n247878,843\n247879,707\n247880,346\n247881,1130\n247882,107\n247883,1014\n247884,1014\n247885,247886\n247887,171641\n247889,1014\n247890,1014\n247891,707\n247892,209\n247893,22\n247894,875\n247896,707\n247897,252\n247898,79\n247899,4545\n247899,56150\n247900,142409\n247901,707\n247902,615\n247902,968\n247902,1293\n247902,1782\n247905,7652\n247908,107\n247911,192\n247912,1133\n247913,1882\n247915,1284\n247916,518\n247919,1284\n247922,1284\n247924,1818\n247927,1284\n247931,60576\n247932,932\n247933,107\n247934,1608\n247935,269\n247937,23783\n247939,83\n247940,147\n247941,247942\n247943,179170\n247944,179170\n247945,703\n247946,1085\n247947,1010\n247948,861\n247949,1116\n247951,22\n247952,577\n247954,483\n247955,720\n247956,247957\n247958,4218\n247959,278\n247960,179170\n247961,178\n247962,148742\n247964,179170\n247965,179170\n247966,557\n247967,707\n247968,1014\n247970,4237\n247970,182162\n247971,13538\n247972,861\n247973,707\n247975,9457\n247976,179170\n247977,73570\n247978,500\n247979,657\n247980,41\n247982,309\n247982,310\n247983,73570\n247984,1927\n247985,1718\n247986,707\n247987,1363\n247987,1836\n247987,40360\n247988,149\n247989,422\n247989,5405\n247990,302\n247991,251\n247992,932\n247993,118336\n247994,626\n247995,138686\n247996,179170\n247997,175\n247999,179170\n248000,1266\n248000,45960\n248001,5440\n248002,671\n248002,15573\n248003,779\n248004,1590\n248005,760\n248006,2048\n248008,920\n248010,30\n248012,1773\n248015,19010\n248016,31073\n248017,515\n248019,158\n248021,714\n248021,2868\n248021,2991\n248021,182162\n248022,818\n248023,42220\n248024,1177\n248024,1253\n248025,592\n248026,179170\n248027,4193\n248027,8373\n248028,1684\n248028,1955\n248030,479\n248031,7416\n248032,1773\n248033,247\n248034,868\n248035,97\n248036,1402\n248037,663\n248038,406\n248039,2156\n248040,1381\n248041,920\n248042,179170\n248043,179170\n248044,147\n248044,158\n248044,422\n248045,589\n248046,120\n248046,438\n248046,795\n248046,818\n248046,1122\n248046,2699\n248047,179170\n248049,949\n248050,179170\n248051,179170\n248053,1882\n248054,1634\n248055,536\n248056,142426\n248057,1983\n248058,23783\n248059,149\n248060,179170\n248061,179170\n248063,7760\n248065,818\n248066,1133\n248067,636\n248068,179170\n248069,179170\n248070,859\n248071,200\n248072,275\n248073,179170\n248074,179170\n248075,30\n248076,151\n248076,1309\n248077,726\n248078,179170\n248079,179170\n248080,19010\n248081,151\n248082,302\n248083,3252\n248084,2779\n248085,536\n248086,151\n248087,222\n248088,2944\n248089,1363\n248090,2424\n248091,455\n248092,313\n248093,4172\n248094,6298\n248095,949\n248096,147\n248097,589\n248098,179170\n248099,179170\n248100,577\n248101,406\n248102,83\n248103,83\n248104,179170\n248105,366\n248106,1556\n248107,222\n248108,30\n248109,200\n248110,179170\n248111,34\n248111,35\n248111,83\n248112,179170\n248113,179170\n248114,179170\n248115,779\n248116,563\n248117,179170\n248118,72\n248118,278\n248118,631\n248118,660\n248118,852\n248118,949\n248118,1133\n248118,1274\n248118,1467\n248118,1881\n248118,2244\n248118,2779\n248118,4637\n248118,4903\n248118,7092\n248118,9015\n248119,752\n248120,2244\n248121,273\n248122,207\n248123,56\n248124,422\n248125,1210\n248126,2620\n248127,516\n248128,2775\n248129,1858\n248130,1860\n248131,406\n248132,5034\n248133,406\n248134,3846\n248135,31073\n248136,179170\n248137,752\n248138,56\n248139,422\n248140,247\n248141,1572\n248142,1319\n248142,2083\n248143,2083\n248144,1240\n248145,30\n248146,19010\n248147,179170\n248148,1551\n248149,247\n248150,206\n248151,83\n248152,818\n248153,2923\n248154,113156\n248155,220816\n248156,1479\n248157,360\n248158,346\n248159,56\n248160,422\n248161,7092\n248162,1579\n248163,30\n248164,220816\n248165,1644\n248166,220816\n248167,248168\n248169,920\n248170,220816\n248171,278\n248172,301\n248173,247\n248174,30\n248175,875\n248176,217\n248177,861\n248178,220816\n248179,248180\n248181,1782\n248182,179170\n248183,707\n248184,179170\n248185,179170\n248186,179170\n248187,179170\n248188,30\n248189,167\n248189,631\n248189,1010\n248190,179170\n248191,104\n248192,179170\n248193,1551\n248194,30\n248195,179170\n248196,19010\n248197,272\n248198,179170\n248199,932\n248200,781\n248201,1132\n248202,1127\n248203,4548\n248204,179170\n248205,3804\n248206,7572\n248207,8798\n248208,417\n248209,346\n248210,346\n248211,179170\n248212,248213\n248214,3422\n248215,2006\n248216,968\n248217,14797\n248218,5662\n248219,233\n248220,518\n248221,1955\n248222,1001\n248223,1231\n248224,63\n248225,390\n248226,1715\n248227,302\n248228,1564\n248229,3\n248230,179170\n248231,707\n248232,2590\n248233,875\n248234,179170\n248235,19443\n248237,435\n248238,220816\n248239,10\n248240,179170\n248241,220816\n248242,248243\n248244,227669\n248245,220816\n248246,843\n248247,919\n248248,56\n248249,267\n248250,220816\n248251,255\n248252,220816\n248253,518\n248254,138686\n248255,175\n248256,707\n248257,220816\n248258,9457\n248259,1467\n248260,581\n248261,220816\n248262,1359\n248263,220816\n248264,220816\n248265,83\n248267,3623\n248268,63\n248268,527\n248269,220816\n248270,1590\n248271,1181\n248272,220816\n248273,248274\n248273,251924\n248275,30\n248276,136\n248276,137\n248276,657\n248276,2266\n248277,248278\n248277,263522\n248279,278\n248280,525\n248281,248282\n248283,3623\n248284,1309\n248285,248286\n248285,252500\n248287,285\n248288,1285\n248289,636\n248290,3623\n248291,179170\n248292,949\n248292,968\n248293,631\n248294,2424\n248295,294\n248296,8854\n248297,366\n248298,179170\n248299,366\n248300,366\n248301,366\n248302,366\n248303,248304\n248305,366\n248306,151\n248307,366\n248308,366\n248309,147\n248310,366\n248312,179170\n248313,3260\n248314,248315\n248316,179170\n248317,179170\n248319,3623\n248320,994\n248321,1363\n248322,491\n248323,1001\n248324,151\n248325,247\n248326,248327\n248328,850\n248329,30\n248330,44\n248331,272\n248332,5265\n248333,3623\n248334,3623\n248335,248336\n248337,2812\n248338,1634\n248339,346\n248340,206\n248341,179170\n248342,491\n248343,248344\n248345,83\n248346,50\n248346,779\n248347,30\n248348,278\n248349,247\n248350,10\n248351,1849\n248352,30\n248353,920\n248354,389\n248355,33611\n248356,30\n248357,1893\n248358,30\n248359,248360\n248361,179170\n248362,392\n248362,852\n248363,192\n248364,248365\n248366,424\n248367,137\n248368,68\n248368,2590\n248369,171\n248371,30\n248372,30\n248373,248374\n248375,1326\n248376,102\n248377,1323\n248378,408\n248379,267\n248380,390\n248381,850\n248383,1551\n248384,179170\n248385,1\n248385,147\n248385,149\n248386,1381\n248387,862\n248387,2590\n248388,1\n248389,920\n248390,248391\n248392,248393\n248394,15119\n248396,240\n248397,248398\n248400,596\n248401,972\n248402,179170\n248403,15609\n248404,179170\n248405,171\n248406,179170\n248407,1132\n248408,781\n248409,179170\n248410,179170\n248411,179170\n248412,248413\n248414,626\n248415,248416\n248417,30\n248418,30\n248420,1353\n248421,179170\n248422,179170\n248423,179170\n248424,707\n248425,707\n248426,56\n248427,422\n248428,211\n248429,5366\n248430,1266\n248430,7270\n248433,626\n248434,248435\n248434,253772\n248436,707\n248437,366\n248438,781\n248439,1132\n248440,980\n248441,162599\n248442,2045\n248442,201298\n248443,852\n248445,272\n248446,450\n248448,1531\n248450,30\n248451,1368\n248452,994\n248453,30\n248454,640\n248455,640\n248456,1118\n248457,30\n248458,422\n248459,422\n248460,422\n248461,1370\n248462,422\n248463,422\n248464,422\n248465,422\n248466,422\n248467,422\n248468,422\n248469,422\n248470,422\n248471,1294\n248472,640\n248473,227\n248476,269\n248477,207\n248478,179170\n248479,179170\n248480,1821\n248480,21736\n248481,9195\n248482,137\n248483,1033\n248484,510\n248485,30\n248486,794\n248487,37\n248488,200\n248490,79\n248491,15068\n248492,35486\n248493,222\n248493,248556\n248494,19010\n248495,272\n248495,1531\n248498,1294\n248499,346\n248500,859\n248501,202\n248502,346\n248503,991\n248503,1749\n248504,97\n248505,30\n248506,3623\n248507,1326\n248508,346\n248509,920\n248510,192\n248511,1849\n248512,3623\n248513,775\n248513,3804\n248515,1132\n248516,868\n248518,408\n248519,158\n248519,252\n248520,994\n248521,217\n248522,179170\n248524,1132\n248525,1052\n248526,54\n248527,2775\n248528,217\n248529,1132\n248530,346\n248532,1309\n248533,179170\n248534,2617\n248535,687\n248537,3115\n248538,596\n248539,1274\n248540,3094\n248541,1294\n248542,1132\n248543,704\n248544,179170\n248545,1294\n248546,592\n248547,21442\n248548,3115\n248549,83\n248550,30\n248551,200\n248552,115474\n248555,289\n248555,657\n248555,94134\n248556,278\n248556,2207\n248556,7075\n248556,29055\n248556,248493\n248556,260367\n248557,415\n248558,2312\n248559,151\n248559,663\n248560,56\n248561,422\n248562,158\n248563,644\n248564,87\n248565,346\n248566,346\n248567,2315\n248569,200\n248571,1707\n248572,932\n248573,192\n248575,3602\n248576,240\n248577,1010\n248578,21442\n248579,422\n248580,56\n248581,1238\n248582,1313\n248583,493\n248584,843\n248586,56\n248587,422\n248588,685\n248589,8373\n248590,83\n248591,2260\n248592,252\n248592,1385\n248593,694\n248594,21442\n248595,1452\n248596,142426\n248597,1132\n248598,781\n248599,1132\n248600,422\n248601,56\n248602,1544\n248603,4611\n248604,285\n248605,21442\n248606,1983\n248607,3246\n248608,200\n248609,259\n248610,278\n248611,83\n248612,809\n248613,83\n248614,137\n248615,2460\n248616,1181\n248617,760\n248618,843\n248619,211\n248619,4078\n248620,1132\n248621,781\n248622,818\n248623,1118\n248624,994\n248625,252\n248627,248628\n248629,485\n248630,406\n248631,41\n248632,743\n248633,994\n248634,21442\n248635,1983\n248636,346\n248637,994\n248639,240\n248641,707\n248642,226825\n248644,1247\n248644,164572\n248645,22293\n248646,1677\n248647,749\n248648,278\n248649,83\n248651,30\n248652,707\n248653,333\n248654,302\n248655,146\n248655,92476\n248655,141912\n248656,406\n248657,71\n248658,406\n248659,518\n248660,192\n248661,146\n248661,92476\n248662,809\n248663,1019\n248664,248665\n248666,666\n248667,192\n248667,1619\n248668,3602\n248669,248670\n248669,250142\n248669,251176\n248669,251597\n248672,248673\n248675,179170\n248676,994\n248677,589\n248678,344\n248679,2867\n248679,2868\n248681,422\n248682,56\n248684,356\n248684,6068\n248685,707\n248686,310\n248686,224488\n248687,179170\n248688,178\n248689,1860\n248690,1858\n248691,217\n248691,536\n248692,920\n248693,309\n248693,310\n248693,483\n248694,3089\n248695,7416\n248697,994\n248698,220502\n248699,707\n248700,1\n248701,781\n248702,1132\n248703,994\n248704,2646\n248706,707\n248707,994\n248709,138686\n248710,175\n248711,179170\n248712,283\n248713,515\n248716,179170\n248717,346\n248718,1132\n248719,781\n248720,179170\n248721,107\n248722,781\n248723,1132\n248724,996\n248725,83\n248726,349\n248727,179170\n248728,142870\n248730,179170\n248731,736\n248732,179170\n248733,240\n248734,248735\n248736,179170\n248737,3260\n248738,3003\n248739,13661\n248740,87\n248740,1151\n248741,302\n248743,142870\n248744,862\n248745,861\n248746,160\n248747,333\n248748,179170\n248749,184\n248750,179170\n248751,179170\n248752,179170\n248754,147\n248755,267\n248756,1132\n248757,781\n248758,248759\n248760,1782\n248761,1058\n248762,179170\n248763,393\n248763,435\n248763,439\n248764,179170\n248765,255\n248766,483\n248767,1644\n248768,179170\n248769,346\n248770,589\n248771,346\n248772,151\n248773,1515\n248774,3623\n248775,875\n248776,83\n248777,248778\n248779,809\n248780,195\n248781,179170\n248782,1556\n248783,1807\n248784,220816\n248785,393\n248786,1132\n248787,781\n248788,179170\n248789,77\n248790,781\n248791,1132\n248792,220816\n248793,30\n248794,179170\n248795,179170\n248796,1616\n248796,44725\n248797,30\n248798,2116\n248799,220816\n248800,663\n248801,2373\n248802,704\n248803,179170\n248804,704\n248805,79\n248806,79\n248807,586\n248808,50\n248809,393\n248810,406\n248811,220816\n248812,179170\n248813,493\n248814,585\n248815,592\n248816,248817\n248818,435\n248819,220816\n248820,1893\n248821,247\n248822,158\n248822,206\n248822,217\n248822,240\n248822,301\n248822,631\n248822,968\n248822,1001\n248822,1801\n248822,3623\n248823,346\n248824,557\n248825,220816\n248826,220816\n248827,536\n248828,151\n248829,1415\n248830,422\n248831,56\n248832,346\n248833,35486\n248834,179170\n248836,220816\n248837,179170\n248838,240\n248840,56\n248841,422\n248842,781\n248843,1132\n248844,220816\n248845,138686\n248846,175\n248847,346\n248848,920\n248849,1623\n248850,220816\n248851,1623\n248852,1085\n248853,885\n248853,13704\n248854,932\n248855,240\n248855,631\n248855,818\n248855,1749\n248855,1785\n248855,2334\n248855,2620\n248855,5718\n248855,9010\n248857,433\n248858,2620\n248859,1590\n248860,346\n248861,707\n248862,34\n248862,35\n248862,261\n248862,392\n248862,949\n248862,1274\n248862,1454\n248862,1608\n248862,2274\n248863,217\n248864,346\n248865,7092\n248866,346\n248867,1370\n248868,9457\n248869,1821\n248869,21736\n248870,640\n248871,149\n248872,704\n248873,79\n248874,1052\n248875,2775\n248876,54\n248877,56\n248878,422\n248879,302\n248880,179170\n248881,2750\n248882,1631\n248883,278\n248884,179170\n248885,255\n248886,1326\n248887,102\n248888,1323\n248889,408\n248890,251\n248891,247\n248892,707\n248893,34\n248893,35\n248894,994\n248895,707\n248896,83\n248897,6556\n248898,137\n248899,151\n248900,179170\n248901,406\n248902,179170\n248903,179170\n248904,220816\n248905,563\n248906,1132\n248907,781\n248908,220816\n248909,179170\n248910,17309\n248911,179170\n248913,220816\n248914,179170\n248915,179170\n248916,516\n248917,179170\n248918,972\n248919,278\n248920,137\n248921,5906\n248922,557\n248923,626\n248924,220816\n248925,862\n248926,179170\n248928,920\n248929,346\n248931,187176\n248932,346\n248933,1474\n248934,179170\n248937,255\n248938,285\n248939,920\n248940,589\n248941,248942\n248943,30\n248944,154408\n248945,875\n248946,130\n248947,875\n248948,875\n248949,3003\n248950,135\n248951,179170\n248952,30\n248953,843\n248954,179170\n248955,179170\n248956,179170\n248957,536\n248958,392\n248958,433\n248958,1805\n248959,30\n248960,605\n248960,1414\n248961,1452\n248962,1893\n248963,138686\n248964,175\n248965,392\n248966,861\n248967,147\n248968,477\n248969,875\n248970,30\n248971,3623\n248972,220816\n248973,3623\n248974,1715\n248975,179170\n248976,179170\n248977,179170\n248978,211\n248979,171\n248980,875\n248981,1983\n248983,179170\n248984,179170\n248985,2697\n248986,30\n248987,179170\n248988,179170\n248989,1309\n248990,932\n248991,113156\n248992,179170\n248994,179170\n248995,22\n248996,346\n248997,179170\n248998,485\n248999,30\n249000,249001\n249002,179170\n249003,179170\n249004,179170\n249005,179170\n249006,920\n249007,285\n249008,179170\n249009,200\n249010,7698\n249011,30331\n249012,1133\n249013,249014\n249015,920\n249016,56\n249017,422\n249020,119\n249021,493\n249022,30\n249023,392\n249023,697\n249023,1769\n249024,249025\n249026,30\n249027,30\n249029,525\n249030,22293\n249032,781\n249033,1132\n249034,138686\n249035,175\n249036,83\n249037,640\n249038,328\n249039,1782\n249040,179170\n249041,1011\n249041,1172\n249042,179170\n249043,249044\n249043,253013\n249043,260704\n249045,1058\n249047,179170\n249048,120\n249049,65\n249049,195\n249049,868\n249051,252\n249052,179170\n249053,1043\n249054,158\n249056,408\n249057,275\n249058,1309\n249059,868\n249061,1016\n249061,1119\n249062,1309\n249065,422\n249066,422\n249067,217\n249068,640\n249069,422\n249070,422\n249071,422\n249072,422\n249073,422\n249074,422\n249075,422\n249076,422\n249077,130\n249078,1359\n249079,422\n249080,640\n249081,640\n249082,640\n249083,422\n249084,640\n249085,640\n249086,14366\n249087,2048\n249088,809\n249089,278\n249090,366\n249091,366\n249092,1368\n249093,3585\n249094,4\n249094,5\n249094,355\n249094,527\n249094,588\n249094,590\n249094,743\n249094,2674\n249094,4810\n249094,6695\n249095,1359\n249096,366\n249097,13361\n249098,252\n249099,447\n249100,2775\n249101,240\n249101,372\n249101,1082\n249101,1085\n249101,1580\n249101,1807\n249101,2812\n249101,4222\n249101,6068\n249101,212692\n249102,1849\n249103,2168\n249104,920\n249105,1181\n249106,752\n249107,249108\n249111,35486\n249112,2671\n249113,1132\n249114,781\n249115,312\n249116,433\n249118,852\n249119,779\n249120,536\n249121,30\n249122,30331\n249123,179170\n249125,1175\n249126,406\n249127,875\n249129,1052\n249130,83\n249131,179170\n249132,994\n249133,312\n249134,81070\n249135,1556\n249135,6303\n249136,1132\n249137,781\n249140,2083\n249141,111\n249142,994\n249143,6424\n249144,60576\n249145,141912\n249146,356\n249146,420\n249147,932\n249148,372\n249149,179170\n249150,893\n249151,217\n249152,781\n249153,1132\n249154,248\n249155,875\n249156,875\n249157,657\n249158,422\n249159,200\n249160,252\n249160,1220\n249161,1\n249162,1220\n249163,217\n249164,994\n249165,2989\n249165,2991\n249165,182162\n249166,422\n249167,252\n249167,1220\n249168,5\n249168,1379\n249169,307\n249169,15573\n249170,1177\n249170,1253\n249171,60576\n249172,1381\n249173,994\n249174,140\n249175,1287\n249176,379\n249177,346\n249178,60576\n249180,1381\n249182,1284\n249183,875\n249184,875\n249185,994\n249186,83\n249187,138686\n249188,175\n249189,1132\n249190,781\n249191,875\n249192,872\n249193,1415\n249195,289\n249195,94134\n249196,2244\n249197,1241\n249198,252\n249198,1220\n249199,875\n249200,994\n249201,60576\n249202,56\n249203,2626\n249205,872\n249205,2528\n249207,720\n249208,79\n249209,1466\n249209,1608\n249213,240174\n249214,459\n249215,104\n249216,1749\n249217,1300\n249218,972\n249219,349\n249220,1882\n249221,2205\n249221,33424\n249221,245910\n249222,415\n249223,611\n249224,433\n249225,138686\n249226,30\n249227,175\n249228,433\n249229,596\n249230,875\n249231,875\n249232,875\n249233,875\n249234,255\n249235,459\n249236,666\n249237,30\n249238,435\n249240,207\n249241,76096\n249242,875\n249243,149\n249244,2083\n249245,1220\n249246,252\n249247,251\n249248,240\n249248,1085\n249248,2812\n249248,4222\n249249,406\n249250,875\n249251,439\n249252,843\n249253,30\n249254,1151\n249255,390\n249256,1309\n249257,406\n249258,313\n249259,30\n249260,949\n249261,666\n249262,872\n249263,920\n249264,392\n249265,2286\n249266,1085\n249267,2296\n249268,289\n249268,94134\n249269,417\n249271,1181\n249272,248\n249272,1284\n249274,175\n249274,313\n249275,1860\n249276,1858\n249277,1509\n249278,515\n249279,1515\n249281,657\n249282,83\n249283,433\n249284,147\n249284,406\n249284,779\n249284,1458\n249284,1515\n249285,1415\n249286,2646\n249287,422\n249288,302\n249289,1085\n249289,2205\n249289,2296\n249289,33424\n249289,245910\n249290,868\n249291,994\n249292,222\n249292,949\n249292,1881\n249292,3115\n249293,79\n249294,249295\n249294,250715\n249294,252860\n249297,247\n249298,7360\n249299,697\n249299,1240\n249299,1465\n249300,622\n249302,346\n249304,483\n249305,1\n249307,1531\n249308,596\n249310,292\n249311,885\n249311,13704\n249312,48\n249313,278\n249314,83\n249315,1415\n249316,406\n249317,3623\n249319,289\n249319,94134\n249320,1052\n249321,54\n249322,2775\n249323,1052\n249324,54\n249325,2775\n249326,179170\n249327,1001\n249328,3623\n249329,557\n249330,249331\n249332,155481\n249333,1415\n249334,5961\n249335,151\n249336,275\n249337,393\n249338,4594\n249339,1608\n249340,4237\n249340,182162\n249341,435\n249342,249343\n249344,1465\n249345,1556\n249346,586\n249347,3623\n249348,467\n249348,2931\n249349,4549\n249350,1240\n249351,179170\n249352,1454\n249353,179170\n249354,179170\n249355,83\n249356,3623\n249357,2083\n249358,811\n249359,563\n249360,34\n249360,35\n249360,2646\n249361,302\n249362,179170\n249363,4594\n249365,220816\n249366,1132\n249367,58\n249368,46\n249369,994\n249370,278\n249371,30\n249372,255\n249373,220816\n249374,2646\n249375,3623\n249376,932\n249377,1235\n249377,1335\n249378,1167\n249379,35486\n249380,861\n249381,1181\n249382,220816\n249383,247\n249384,247\n249385,220816\n249386,861\n249387,137\n249388,179170\n249389,1359\n249390,6424\n249391,649\n249392,249393\n249394,220816\n249395,32\n249396,10\n249396,147\n249396,158\n249396,795\n249396,1572\n249396,3804\n249396,4039\n249397,220816\n249398,301\n249398,663\n249398,932\n249399,179170\n249400,392\n249401,417\n249402,200\n249403,30\n249404,247\n249405,2286\n249406,1085\n249407,417\n249408,289\n249408,94134\n249409,2296\n249410,179170\n249411,138686\n249412,175\n249413,200\n249414,179170\n249415,557\n249416,344\n249417,7092\n249418,302\n249418,344\n249419,467\n249420,388\n249420,6638\n249422,704\n249423,79\n249424,13980\n249425,278\n249426,3148\n249427,577\n249428,1782\n249429,220816\n249430,1474\n249431,330\n249432,179170\n249433,673\n249434,179170\n249435,220816\n249436,843\n249437,1818\n249438,34\n249438,35\n249439,179170\n249440,1415\n249441,220816\n249442,179170\n249443,1415\n249444,1893\n249445,119\n249445,192\n249445,309\n249445,310\n249445,577\n249445,991\n249445,2480\n249445,3039\n249445,249450\n249445,249475\n249446,30\n249448,83\n249452,505\n249453,7\n249454,267\n249455,1415\n249456,83\n249456,2590\n249456,6068\n249457,179170\n249458,1326\n249459,102\n249460,1323\n249461,408\n249462,557\n249463,862\n249464,8855\n249465,589\n249466,138686\n249467,175\n249468,850\n249469,141912\n249470,1087\n249470,1684\n249471,34\n249471,35\n249472,663\n249473,220816\n249474,1001\n249476,233\n249478,220816\n249479,250\n249479,1684\n249480,1085\n249481,285\n249482,707\n249483,220816\n249484,220816\n249485,2590\n249486,1381\n249487,30\n249489,240\n249489,332\n249489,1082\n249489,1309\n249489,1807\n249489,1888\n249489,1955\n249489,2775\n249490,852\n249491,179170\n249492,167\n249493,149\n249494,249495\n249496,1773\n249497,389\n249498,1579\n249499,179170\n249500,2116\n249501,875\n249502,1285\n249502,1309\n249502,9015\n249503,179170\n249504,340\n249505,151\n249506,1415\n249507,179170\n249508,220816\n249509,875\n249510,577\n249511,179170\n249512,147\n249513,1359\n249514,557\n249515,220816\n249516,249517\n249518,179170\n249519,202\n249520,179170\n249521,179170\n249522,202\n249523,1467\n249524,455\n249525,875\n249526,2424\n249528,217\n249529,366\n249530,1871\n249531,850\n249532,2421\n249533,13980\n249534,83\n249535,1452\n249536,68\n249537,249538\n249539,79\n249540,130\n249541,1\n249542,841\n249543,30\n249545,3367\n249546,179170\n249547,179170\n249548,249549\n249550,841\n249551,1235\n249551,1335\n249552,220816\n249553,179170\n249554,1414\n249555,83\n249557,249558\n249559,249560\n249562,200\n249563,2590\n249564,179170\n249565,179170\n249566,415\n249567,179170\n249568,249569\n249570,179170\n249571,179170\n249572,220816\n249573,2735\n249574,872\n249575,1429\n249576,104\n249576,136\n249577,179170\n249578,249579\n249580,175\n249581,1294\n249582,4691\n249583,1085\n249584,179170\n249585,179170\n249586,30\n249587,207\n249588,1085\n249589,240\n249590,179170\n249591,179170\n249592,179170\n249593,1453\n249594,249595\n249596,217\n249597,366\n249598,668\n249599,178\n249600,83\n249601,366\n249602,366\n249603,366\n249604,366\n249605,2867\n249605,2868\n249606,704\n249607,493\n249608,283\n249609,1143\n249610,179170\n249611,323\n249612,1400\n249613,872\n249614,179170\n249615,1860\n249616,1858\n249617,433\n249618,2574\n249620,1566\n249621,1220\n249622,252\n249623,251\n249624,58\n249625,994\n249626,46\n249627,707\n249628,360\n249628,1127\n249630,872\n249631,586\n249632,1858\n249633,1860\n249634,249635\n249636,1579\n249637,640\n249638,640\n249639,640\n249640,640\n249641,5034\n249642,138686\n249643,175\n249644,663\n249645,1821\n249645,21736\n249646,433\n249647,1224\n249648,3507\n249649,60576\n249650,2646\n249651,1467\n249653,3582\n249654,202\n249655,2574\n249656,278\n249657,60576\n249658,920\n249659,818\n249660,663\n249662,179170\n249663,752\n249664,35486\n249665,142870\n249666,1238\n249668,934\n249668,939\n249668,150001\n249668,171607\n249668,261687\n249668,261689\n249669,179170\n249670,4597\n249671,994\n249672,1452\n249674,1984\n249676,602\n249676,1582\n249676,3218\n249676,99215\n249676,176331\n249676,249676\n249676,249853\n249676,249859\n249676,252053\n249677,991\n249678,60576\n249681,179170\n249682,366\n249683,79\n249684,1252\n249684,1253\n249685,861\n249686,50\n249688,1274\n249689,6695\n249690,209\n249691,1707\n249693,315\n249694,255\n249696,994\n249697,1220\n249698,252\n249699,251\n249700,315\n249701,148742\n249702,1415\n249703,252\n249704,251\n249705,1220\n249706,422\n249707,200\n249708,2421\n249709,422\n249710,422\n249711,422\n249712,422\n249713,1415\n249714,179170\n249715,932\n249716,875\n249717,567\n249717,750\n249717,1293\n249718,315\n249719,179170\n249720,1985\n249721,315\n249722,1282\n249723,422\n249724,422\n249725,30\n249726,422\n249727,433\n249728,1773\n249729,422\n249730,315\n249733,315\n249734,1415\n249735,818\n249735,1014\n249736,4597\n249737,309\n249737,310\n249738,83\n249739,447\n249740,2775\n249741,30\n249742,217\n249743,142870\n249744,1415\n249745,310\n249745,3039\n249747,3804\n249748,1509\n249750,1082\n249751,657\n249752,5310\n249754,179170\n249755,179170\n249756,1644\n249757,21442\n249759,211\n249760,130\n249761,162599\n249762,3\n249764,1132\n249766,1566\n249768,1556\n249769,714\n249770,21442\n249772,146\n249772,92476\n249773,5405\n249774,1515\n249775,994\n249776,1070\n249777,1531\n249779,249780\n249781,406\n249782,45960\n249784,1776\n249785,344\n249786,994\n249788,141912\n249789,338\n249790,1087\n249791,805\n249792,1274\n249793,249794\n249795,875\n249796,138686\n249797,175\n249799,835\n249799,1572\n249801,4823\n249802,135\n249803,388\n249804,179170\n249805,875\n249806,2784\n249807,3474\n249808,491\n249809,58\n249810,994\n249811,46\n249813,179170\n249814,188791\n249815,422\n249816,106\n249816,586\n249817,58\n249818,994\n249819,46\n249821,1556\n249822,503\n249823,515\n249825,171\n249826,179170\n249828,22\n249829,1415\n249830,73570\n249831,1860\n249832,1858\n249833,779\n249833,1515\n249834,179170\n249835,22\n249836,179170\n249837,179170\n249838,222\n249839,557\n249840,1052\n249841,54\n249842,2775\n249843,148742\n249844,83\n249845,687\n249846,21442\n249847,251\n249848,1220\n249849,252\n249850,111\n249851,875\n249852,809\n249854,301\n249855,433\n249856,162599\n249857,920\n249858,433\n249860,240\n249860,1818\n249861,1359\n249862,875\n249863,442\n249864,179170\n249865,1149\n249867,250\n249867,1684\n249868,2367\n249868,252883\n249869,179170\n249870,949\n249871,1400\n249872,179170\n249873,557\n249874,663\n249876,151\n249877,563\n249878,1749\n249879,8373\n249880,704\n249881,255\n249882,509\n249883,422\n249884,596\n249885,73570\n249887,179170\n249888,346\n249889,9457\n249890,4571\n249891,35486\n249892,861\n249893,83\n249894,83\n249895,557\n249896,862\n249897,138\n249898,865\n249899,557\n249900,137\n249901,88820\n249902,135\n249903,249904\n249906,1010\n249907,1773\n249908,422\n249909,56\n249910,647\n249911,146\n249911,92476\n249912,344\n249913,179170\n249914,220816\n249915,179170\n249916,302\n249917,337\n249917,338\n249917,393\n249917,439\n249917,626\n249917,649\n249917,772\n249917,1381\n249917,1634\n249917,2367\n249918,81\n249918,251\n249918,332\n249918,333\n249918,420\n249918,682\n249918,843\n249918,980\n249918,1133\n249918,2083\n249918,2995\n249918,3258\n249918,4039\n249918,9015\n249918,72439\n249918,189303\n249919,435\n249920,220816\n249921,392\n249922,179170\n249923,932\n249924,2867\n249924,2868\n249925,220816\n249926,179170\n249927,392\n249928,217\n249928,240\n249928,1417\n249929,220816\n249930,843\n249931,220816\n249932,707\n249933,704\n249934,1556\n249935,79\n249936,44\n249938,220816\n249939,433\n249940,818\n249941,818\n249942,657\n249943,220816\n249944,586\n249944,1243\n249945,179170\n249946,220816\n249947,3585\n249949,435\n249950,220816\n249951,433\n249952,7092\n249953,179170\n249954,2867\n249954,2868\n249955,920\n249956,220816\n249957,179170\n249958,179170\n249961,179170\n249962,278\n249963,179170\n249964,577\n249964,720\n249964,1425\n249965,272\n249965,467\n249966,179170\n249967,220816\n249968,179170\n249969,809\n249970,179170\n249971,252\n249971,516\n249972,220816\n249973,179170\n249974,247\n249975,179170\n249976,179170\n249977,220816\n249978,179170\n249979,220816\n249980,422\n249981,56\n249982,179170\n249983,267\n249984,557\n249985,1033\n249986,626\n249987,620\n249988,1323\n249989,102\n249990,1326\n249991,408\n249992,406\n249993,805\n249994,1749\n249995,779\n249996,1515\n249997,2735\n249998,1284\n249999,30\n250000,3623\n250001,207\n250002,818\n250004,333\n250005,2373\n250006,179170\n250007,332\n250009,250010\n250011,220816\n250012,422\n250013,56\n250014,147\n250015,2367\n250016,707\n250017,285\n250018,250\n250018,1684\n250019,138686\n250020,175\n250021,250\n250021,1684\n250022,285\n250023,697\n250024,3260\n250025,285\n250026,250\n250026,1684\n250027,48\n250028,707\n250029,333\n250030,179170\n250031,875\n250032,2367\n250033,171\n250034,30\n250034,184\n250034,202\n250034,233\n250034,1381\n250035,3999\n250036,1007\n250037,179170\n250038,179170\n250039,179170\n250040,179170\n250041,179170\n250042,779\n250043,392\n250044,179170\n250045,179170\n250046,2048\n250047,179170\n250048,483\n250049,250050\n250051,179170\n250052,142405\n250052,154408\n250053,1033\n250054,179170\n250055,179170\n250057,366\n250058,366\n250059,366\n250060,366\n250061,99\n250063,620\n250064,1181\n250065,179170\n250066,73570\n250067,225\n250068,406\n250069,250070\n250071,862\n250071,2590\n250072,267\n250073,779\n250074,1515\n250075,179170\n250076,779\n250077,179170\n250078,333\n250079,8884\n250080,151\n250080,577\n250080,1400\n250081,1085\n250082,179170\n250084,179170\n250086,1381\n250087,1893\n250088,1402\n250089,3623\n250090,296\n250091,250092\n250093,250092\n250094,875\n250095,875\n250096,240174\n250097,179170\n250100,240174\n250101,250102\n250103,1033\n250104,35486\n250105,3367\n250106,406\n250107,620\n250108,2266\n250109,406\n250110,206\n250111,366\n250112,588\n250112,590\n250112,4771\n250113,250114\n250115,779\n250116,1515\n250117,56\n250118,422\n250119,145751\n250120,932\n250121,312\n250123,333\n250124,1033\n250125,592\n250126,620\n250127,663\n250128,663\n250129,406\n250130,250131\n250132,83\n250133,149\n250134,250135\n250136,779\n250137,1515\n250138,240174\n250139,1836\n250140,250141\n250143,298\n250144,931\n250145,1014\n250146,333\n250147,1033\n250148,620\n250149,135\n250150,1749\n250151,406\n250152,250153\n250154,30\n250155,1515\n250156,779\n250157,2266\n250158,1381\n250160,818\n250161,1767\n250162,808\n250163,333\n250164,2574\n250165,34\n250165,35\n250166,433\n250167,2017\n250167,17309\n250168,503\n250169,1033\n250170,1014\n250171,1014\n250172,1014\n250173,483\n250174,1014\n250175,1014\n250176,1014\n250177,1014\n250178,1014\n250179,220816\n250180,3079\n250181,138686\n250182,175\n250183,932\n250184,79\n250184,333\n250184,406\n250185,2266\n250186,220816\n250187,620\n250188,220816\n250189,406\n250190,220816\n250191,220816\n250192,1\n250192,242826\n250194,220816\n250195,1014\n250196,220816\n250197,2379\n250198,1515\n250199,779\n250200,1096\n250201,220816\n250202,647\n250203,344\n250204,146\n250204,92476\n250206,1096\n250208,146\n250208,92476\n250209,647\n250210,344\n250211,333\n250212,953\n250212,1266\n250213,663\n250214,94\n250214,6068\n250215,307\n250215,818\n250215,72439\n250216,5440\n250217,15573\n250217,164572\n250218,285\n250219,205627\n250220,147\n250221,1007\n250223,589\n250224,1247\n250224,164572\n250225,1181\n250226,1479\n250227,390\n250228,171\n250229,56\n250230,422\n250231,220816\n250232,250233\n250234,250235\n250236,220816\n250237,393\n250238,707\n250239,707\n250240,213953\n250241,707\n250242,366\n250243,366\n250244,366\n250245,179170\n250246,1566\n250247,179170\n250248,330\n250249,179170\n250250,179170\n250251,596\n250252,250253\n250252,250390\n250254,179170\n250255,718\n250256,447\n250257,149\n250258,200\n250258,772\n250259,130\n250260,2367\n250261,285\n250264,250265\n250266,850\n250267,179170\n250268,366\n250269,366\n250270,175\n250271,250272\n250273,250274\n250275,250276\n250277,54\n250278,333\n250279,17309\n250280,250281\n250282,147\n250282,1572\n250283,107\n250284,2416\n250284,2417\n250285,292\n250286,338\n250287,298\n250288,1133\n250289,3538\n250290,83\n250290,660\n250290,1274\n250290,6506\n250291,179170\n250292,2995\n250293,1087\n250293,4193\n250294,6068\n250294,7363\n250295,602\n250296,3623\n250298,1132\n250299,781\n250300,433\n250301,35486\n250302,250303\n250304,192\n250304,372\n250307,779\n250308,932\n250309,22\n250310,6789\n250311,3623\n250312,250313\n250314,3623\n250315,557\n250316,707\n250317,9121\n250318,58\n250319,1181\n250320,250321\n250322,1359\n250323,179170\n250324,6661\n250325,15\n250325,1179\n250326,127158\n250327,255\n250328,138686\n250329,175\n250330,56\n250331,422\n250332,32\n250333,440\n250333,794\n250334,250335\n250336,1132\n250337,781\n250338,1227\n250339,714\n250341,250342\n250344,647\n250345,994\n250346,287\n250347,2292\n250347,2574\n250347,15748\n250348,994\n250350,211\n250351,1070\n250354,875\n250355,875\n250356,943\n250357,179170\n250358,179170\n250359,994\n250360,1381\n250361,1436\n250362,30\n250363,1773\n250364,213089\n250365,22\n250366,179170\n250367,1181\n250368,3623\n250369,192\n250370,493\n250371,932\n250373,179170\n250374,138686\n250375,175\n250376,818\n250377,217\n250379,8149\n250380,250381\n250382,1309\n250383,781\n250384,1132\n250385,250386\n250387,483\n250389,557\n250391,433\n250392,138686\n250393,1181\n250394,313\n250395,227669\n250396,433\n250397,30\n250398,557\n250399,557\n250400,3623\n250401,2424\n250402,1688\n250404,3623\n250405,1033\n250406,60576\n250407,620\n250409,393\n250410,406\n250411,30\n250413,779\n250414,1515\n250415,4411\n250416,250417\n250418,333\n250419,298\n250420,485\n250421,179170\n250422,250423\n250424,250425\n250426,179170\n250427,179170\n250428,179170\n250429,206\n250429,1796\n250429,3804\n250429,141912\n250431,2506\n250432,179170\n250433,872\n250434,872\n250435,179170\n250436,366\n250437,366\n250438,366\n250439,366\n250440,179170\n250441,366\n250442,493\n250443,1305\n250444,179170\n250445,640\n250446,298\n250447,184\n250448,250449\n250450,671\n250451,250452\n250453,119\n250454,269\n250455,843\n250456,1012\n250457,7155\n250458,4192\n250458,4193\n250459,179170\n250460,285\n250461,636\n250463,158\n250463,202\n250463,8907\n250464,255\n250465,240\n250466,250467\n250468,167\n250469,179170\n250470,285\n250471,104\n250472,30\n250473,179170\n250474,179170\n250475,285\n250476,137\n250478,179170\n250479,179170\n250480,179170\n250481,424\n250482,179170\n250483,292\n250484,294\n250485,296\n250486,298\n250487,250488\n250489,1381\n250490,422\n250491,142473\n250492,309\n250492,310\n250493,788\n250494,467\n250495,1749\n250496,704\n250497,493\n250498,592\n250499,585\n250500,586\n250501,50\n250502,393\n250503,79\n250504,406\n250505,1043\n250506,179170\n250507,1572\n250510,137\n250512,83\n250513,179170\n250514,179170\n250515,179170\n250516,4192\n250516,4193\n250517,19010\n250518,1220\n250522,994\n250523,1058\n250524,240\n250526,138686\n250527,264\n250528,994\n250530,447\n250531,171\n250532,179170\n250533,103860\n250537,1559\n250538,1631\n250539,250539\n250540,9457\n250541,1210\n250542,877\n250545,314\n250546,849\n250547,138686\n250548,175\n250549,415\n250550,1033\n250551,83\n250552,1033\n250553,620\n250554,406\n250555,250556\n250557,179170\n250558,1515\n250559,779\n250560,640\n250561,640\n250562,640\n250563,640\n250564,315\n250565,640\n250566,56\n250567,422\n250568,2867\n250568,2868\n250569,640\n250570,1132\n250571,781\n250572,30\n250574,221872\n250576,117163\n250577,779\n250579,1580\n250580,818\n250581,408\n250582,333\n250583,422\n250584,120\n250585,192\n250587,781\n250588,1132\n250589,63\n250590,652\n250591,217\n250592,1858\n250593,1860\n250594,138686\n250595,175\n250596,1033\n250597,83\n250598,7760\n250599,447\n250600,2775\n250601,1580\n250602,206\n250603,147\n250603,158\n250603,406\n250604,179170\n250606,1381\n250607,142433\n250608,179170\n250609,252\n250609,1220\n250610,35486\n250611,3623\n250612,620\n250613,392\n250614,697\n250615,6955\n250616,1860\n250617,3612\n250618,595\n250619,4760\n250620,2274\n250621,6059\n250622,5658\n250623,4252\n250624,623\n250625,1912\n250627,1860\n250628,1858\n250629,15\n250629,941\n250630,406\n250631,83\n250632,1749\n250633,525\n250634,252\n250635,1551\n250636,1927\n250637,779\n250638,30\n250639,192\n250640,1132\n250641,1132\n250642,1132\n250643,1858\n250644,1860\n250645,256\n250646,1132\n250647,781\n250649,73570\n250650,1132\n250651,1608\n250652,171\n250653,1238\n250654,1231\n250655,346\n250655,255911\n250656,252\n250657,1860\n250658,1858\n250660,1010\n250661,1452\n250662,48505\n250664,1515\n250665,779\n250666,4672\n250667,250668\n250669,1019\n250670,707\n250671,178\n250671,392\n250672,149\n250673,932\n250674,707\n250675,536\n250677,422\n250678,56\n250679,442\n250680,213089\n250682,333\n250683,151\n250684,509\n250685,694\n250686,1247\n250686,164572\n250687,577\n250688,1033\n250689,1033\n250690,149\n250691,707\n250693,22\n250694,252\n250695,2620\n250696,422\n250697,422\n250698,422\n250699,422\n250700,422\n250701,189128\n250702,422\n250703,422\n250704,422\n250705,1274\n250706,406\n250706,60576\n250707,422\n250708,422\n250709,1012\n250710,154408\n250711,1247\n250711,164572\n250712,83\n250713,240\n250713,298\n250714,779\n250716,63\n250717,996\n250718,467\n250718,818\n250719,179170\n250720,30\n250721,779\n250722,6119\n250723,1882\n250724,30\n250725,620\n250726,31073\n250727,250728\n250729,671\n250730,212914\n250731,707\n250732,1707\n250733,192\n250734,406\n250735,217\n250736,36819\n250737,859\n250738,310\n250739,707\n250740,171\n250741,389\n250742,1849\n250744,3585\n250745,704\n250746,392\n250747,707\n250748,21982\n250749,707\n250750,179170\n250751,907\n250752,1515\n250753,779\n250755,252\n250756,171\n250757,179170\n250759,179170\n250760,148742\n250761,236180\n250762,143\n250763,1132\n250764,1132\n250765,252\n250767,749\n250768,269\n250769,179170\n250771,973\n250772,333\n250773,269\n250774,1096\n250775,439\n250777,1\n250778,179170\n250779,179170\n250780,3582\n250781,907\n250782,142870\n250783,536\n250784,1849\n250786,406\n250787,179170\n250789,1454\n250790,215\n250791,79\n250792,179170\n250793,1096\n250794,179170\n250795,56\n250796,422\n250797,301\n250798,7416\n250799,3769\n250800,332\n250801,1151\n250802,179170\n250803,167\n250804,247\n250805,893\n250806,17346\n250807,595\n250808,179170\n250809,422\n250810,557\n250811,1381\n250812,344\n250813,657\n250815,2424\n250816,313\n250817,250818\n250820,264\n250821,760\n250821,1149\n250821,1631\n250822,4455\n250824,1858\n250825,1860\n250826,1033\n250828,179170\n250829,138686\n250830,175\n250831,48505\n250832,107\n250833,54\n250834,515\n250836,179170\n250837,179170\n250839,54\n250840,442\n250841,577\n250842,2750\n250843,45310\n250844,54\n250845,1224\n250846,54\n250847,206\n250849,707\n250850,83\n250851,247\n250852,179170\n250853,83\n250854,155473\n250855,620\n250856,179170\n250857,179170\n250858,2373\n250859,30\n250860,344\n250861,21982\n250862,707\n250863,1381\n250864,920\n250865,179170\n250866,1858\n250867,1860\n250868,179170\n250869,147\n250869,158\n250871,179170\n250872,179170\n250873,103860\n250873,189303\n250874,406\n250875,1962\n250876,457\n250877,30\n250878,250879\n250880,179170\n250881,209\n250882,179170\n250883,1282\n250884,179170\n250885,5405\n250888,1326\n250889,179170\n250890,1132\n250891,577\n250892,4597\n250893,34\n250893,35\n250894,1274\n250895,179170\n250896,179170\n250897,68069\n250898,179170\n250899,862\n250900,805\n250901,255\n250902,179170\n250903,179170\n250905,779\n250906,1515\n250907,220816\n250908,9457\n250909,151\n250910,220816\n250911,832\n250912,483\n250913,179170\n250914,147\n250915,220816\n250916,179170\n250917,406\n250918,406\n250919,220816\n250920,920\n250921,875\n250922,179170\n250923,220816\n250924,818\n250925,106\n250926,73570\n250928,179170\n250929,220816\n250930,179170\n250931,179170\n250932,179170\n250933,1132\n250934,781\n250935,272\n250936,333\n250937,220816\n250938,179170\n250939,179170\n250940,179170\n250941,179170\n250942,932\n250943,315\n250944,1132\n250945,781\n250946,56\n250947,422\n250948,247\n250949,179170\n250950,4355\n250951,179170\n250952,179170\n250953,83\n250953,304\n250953,467\n250953,868\n250953,162599\n250954,663\n250955,920\n250956,467\n250957,704\n250958,79\n250959,467\n250960,11\n250961,179170\n250962,247\n250963,1544\n250964,2557\n250965,2083\n250966,179170\n250967,179170\n250968,278\n250969,707\n250970,920\n250971,707\n250972,147\n250972,158\n250973,491\n250974,4453\n250975,707\n250976,30\n250977,9015\n250978,302\n250979,516\n250980,175\n250981,7092\n250982,113156\n250983,433\n250985,217\n250986,602\n250987,220816\n250988,148742\n250989,1132\n250990,781\n250991,1069\n250991,2784\n250991,188676\n250992,278\n250993,252\n250994,2266\n250995,30\n250996,1181\n250996,9015\n250997,1181\n250997,1745\n250998,179170\n250999,179170\n251000,1181\n251001,422\n251002,56\n251003,2867\n251003,2868\n251004,30\n251005,138686\n251006,175\n251007,1370\n251008,1715\n251009,104\n251010,444\n251011,35486\n251012,1\n251013,30331\n251014,58\n251015,994\n251016,46\n251017,459\n251017,862\n251017,907\n251017,1010\n251017,1837\n251017,20359\n251017,188791\n251018,310\n251018,224488\n251019,1119\n251020,113156\n251021,707\n251022,3447\n251023,179170\n251024,875\n251025,179170\n251026,1181\n251027,516\n251028,179170\n251029,1359\n251030,2367\n251031,392\n251032,697\n251033,2105\n251034,102\n251035,1323\n251036,1326\n251037,408\n251038,19010\n251039,417\n251040,179170\n251041,577\n251042,707\n251043,30\n251044,752\n251045,1276\n251046,68\n251047,135\n251048,536\n251049,2671\n251050,1210\n251051,138686\n251052,175\n251053,56\n251054,422\n251055,30\n251056,631\n251057,217\n251058,1085\n251059,1117\n251060,1659\n251061,220816\n251062,3\n251063,220816\n251064,1014\n251065,485\n251066,298\n251067,220816\n251068,390\n251069,1326\n251070,240\n251071,1715\n251072,1010\n251073,220816\n251074,435\n251075,1033\n251076,707\n251077,356\n251078,1014\n251079,240174\n251080,179170\n251081,217\n251082,54\n251083,707\n251084,54\n251085,179170\n251086,179170\n251087,251088\n251089,1014\n251090,620\n251091,147\n251092,843\n251093,1014\n251094,58\n251095,994\n251096,46\n251097,1001\n251099,1014\n251100,406\n251102,83\n251102,217\n251102,536\n251102,1133\n251103,900\n251104,30\n251105,2797\n251106,41\n251107,2646\n251108,623\n251108,1805\n251109,220816\n251110,79\n251111,563\n251112,120\n251113,850\n251114,652\n251115,220816\n251116,1522\n251117,113156\n251118,346\n251119,54\n251120,2807\n251121,516\n251122,252\n251123,1220\n251124,220816\n251126,779\n251127,1515\n251128,1085\n251129,209\n251130,333\n251131,968\n251132,285\n251133,920\n251134,1181\n251135,171\n251136,920\n251137,285\n251138,269\n251139,215\n251140,301\n251141,179170\n251142,843\n251143,41\n251144,240174\n251145,2266\n251146,30\n251147,1133\n251148,2073\n251149,179170\n251150,247\n251151,920\n251152,2083\n251153,4192\n251153,4193\n251154,640\n251155,251156\n251157,736\n251157,1891\n251157,142405\n251157,154408\n251158,1623\n251159,1522\n251160,355\n251161,1140\n251162,56\n251163,422\n251165,346\n251166,1118\n251167,179170\n251168,179170\n251169,406\n251169,779\n251170,5310\n251171,968\n251172,179170\n251173,1\n251173,4\n251173,5\n251173,184\n251174,356\n251175,843\n251177,893\n251178,1571\n251179,83\n251180,179170\n251181,179170\n251182,179170\n251183,1238\n251184,179170\n251185,179170\n251186,137\n251187,861\n251188,1590\n251189,364\n251189,431\n251189,1227\n251189,1252\n251189,1253\n251189,2089\n251189,2940\n251189,4823\n251189,86416\n251190,10\n251191,536\n251192,179170\n251193,704\n251194,79\n251196,179170\n251197,83\n251198,8854\n251199,589\n251200,3623\n251202,415\n251203,269\n251204,671\n251205,481\n251206,949\n251207,251208\n251210,138686\n251211,175\n251212,714\n251213,202\n251213,372\n251213,720\n251213,877\n251213,907\n251213,1001\n251213,1732\n251213,3422\n251214,83\n251214,1984\n251215,346\n251216,251217\n251218,781\n251219,1132\n251220,433\n251221,189303\n251222,83\n251223,30\n251224,179170\n251225,707\n251226,2205\n251226,33424\n251226,245910\n251227,781\n251228,1132\n251229,58\n251230,994\n251231,46\n251232,1509\n251233,442\n251235,781\n251236,1132\n251237,179170\n251240,147\n251240,171\n251242,493\n251243,179170\n251245,137\n251246,179170\n251248,640\n251249,206\n251250,640\n251251,640\n251252,640\n251253,640\n251254,83\n251256,644\n251257,447\n251258,2775\n251259,30\n251260,707\n251261,58\n251262,994\n251263,46\n251265,58\n251266,994\n251267,46\n251268,1363\n251269,22\n251271,3623\n251274,346\n251275,248\n251276,485\n251277,893\n251279,137\n251281,147\n251283,657\n251284,366\n251285,366\n251286,366\n251287,366\n251288,41\n251288,106\n251291,640\n251292,179170\n251294,2646\n251295,179170\n251296,859\n251297,609\n251297,1688\n251298,206\n251299,147191\n251300,393\n251301,58\n251302,994\n251303,46\n251304,920\n251305,712\n251306,179170\n251308,424\n251309,1821\n251309,21736\n251310,3138\n251311,81\n251312,433\n251313,462\n251314,1001\n251315,589\n251316,557\n251317,743\n251318,148742\n251319,30\n251320,592\n251321,313\n251322,479\n251323,346\n251324,22\n251325,83\n251326,58\n251327,994\n251328,46\n251329,707\n251330,868\n251331,1368\n251332,58\n251333,994\n251334,46\n251335,422\n251336,151\n251337,422\n251338,422\n251339,422\n251340,422\n251341,422\n251342,68069\n251343,2424\n251344,1474\n251345,422\n251346,422\n251347,422\n251348,893\n251349,561\n251350,422\n251351,3094\n251352,536\n251353,422\n251354,344\n251355,35486\n251356,422\n251357,1274\n251358,22\n251359,20\n251360,30\n251362,2750\n251363,83\n251364,58\n251365,994\n251366,46\n251367,58\n251368,994\n251369,46\n251371,1631\n251372,30\n251373,1608\n251374,1132\n251375,138686\n251376,433\n251377,1608\n251378,1132\n251379,433\n251380,240\n251380,818\n251381,1033\n251382,422\n251383,56\n251384,996\n251386,893\n251387,79\n251387,818\n251389,1579\n251390,1132\n251391,83\n251392,278\n251393,1132\n251394,2421\n251395,1608\n251396,1132\n251397,2797\n251398,147\n251400,1707\n251401,2590\n251403,217\n251404,1132\n251405,1608\n251406,248\n251407,1544\n251409,31206\n251410,720\n251411,433\n251412,217\n251414,1132\n251415,106\n251416,1860\n251417,1858\n251418,58\n251419,994\n251420,46\n251421,310\n251421,3039\n251422,77\n251423,1132\n251424,1544\n251425,1132\n251426,1132\n251427,1849\n251428,1849\n251429,818\n251430,1132\n251431,1132\n251432,30\n251433,1132\n251434,30\n251434,1179\n251435,1132\n251436,1132\n251437,1132\n251438,60576\n251439,2626\n251440,179170\n251441,20\n251443,893\n251444,1132\n251445,818\n251446,60576\n251447,3999\n251449,60576\n251450,4548\n251451,657\n251452,1132\n251453,515\n251454,83\n251455,1579\n251456,1860\n251457,1858\n251458,1749\n251460,58\n251461,46\n251462,994\n251463,289\n251463,1085\n251463,33424\n251463,94134\n251463,245910\n251465,211\n251466,30\n251467,536\n251467,590\n251467,2991\n251468,21408\n251469,577\n251471,179170\n251472,4611\n251473,968\n251473,103860\n251475,346\n251476,2006\n251477,1454\n251479,301\n251479,3804\n251481,240\n251481,332\n251482,251483\n251484,920\n251485,406\n251486,1160\n251487,251488\n251489,217\n251490,516\n251490,1220\n251491,5469\n251492,202\n251493,1551\n251494,269\n251495,2460\n251496,1515\n251497,99\n251498,73570\n251499,4672\n251500,138686\n251501,175\n251502,209\n251503,1381\n251504,54\n251505,147\n251505,158\n251506,809\n251508,2590\n251509,1818\n251510,50\n251510,192\n251510,195\n251510,222\n251510,240\n251510,809\n251510,1019\n251510,1085\n251511,167\n251511,973\n251511,1001\n251512,247\n251513,687\n251516,1132\n251517,781\n251518,179170\n251519,2626\n251520,2205\n251520,33424\n251520,245910\n251521,433\n251522,467\n251523,4355\n251524,3182\n251525,1722\n251526,433\n251527,422\n251528,56\n251529,433\n251530,147\n251530,158\n251533,1381\n251534,932\n251535,516\n251536,147\n251536,158\n251536,333\n251537,577\n251538,1284\n251538,148742\n251539,483\n251540,875\n251541,142879\n251542,151\n251543,179170\n251544,31122\n251545,3804\n251546,3193\n251547,2737\n251548,14797\n251549,518\n251550,392\n251551,2989\n251551,2991\n251552,442\n251552,3474\n251553,483\n251554,220816\n251555,72\n251555,87\n251555,206\n251555,209\n251555,240\n251555,323\n251555,358\n251555,516\n251555,586\n251555,736\n251555,1007\n251555,1085\n251555,1210\n251555,1359\n251555,1551\n251555,1785\n251555,2312\n251555,17309\n251555,54243\n251556,225\n251557,255\n251558,220816\n251559,179170\n251560,179170\n251561,1556\n251562,577\n251563,179170\n251564,179170\n251565,220816\n251566,30\n251567,10\n251568,2205\n251568,33424\n251568,245910\n251569,536\n251570,3582\n251571,179170\n251572,30\n251573,30\n251574,179170\n251575,433\n251576,220816\n251577,861\n251578,6303\n251579,2296\n251580,30\n251581,217\n251582,577\n251583,179170\n251584,775\n251585,60576\n251586,220816\n251587,207\n251588,187\n251589,2048\n251590,247\n251591,217\n251592,207\n251592,1684\n251593,179170\n251594,30\n251595,97\n251596,310\n251596,693\n251598,220816\n251599,433\n251601,200\n251602,220816\n251603,3695\n251604,179170\n251605,406\n251606,433\n251611,1732\n251612,433\n251613,1014\n251614,1012\n251616,346\n251617,1014\n251618,1014\n251619,30\n251620,671\n251621,2735\n251622,155481\n251623,920\n251624,1014\n251625,30\n251626,179170\n251627,2135\n251628,285\n251630,7092\n251632,1390\n251633,760\n251634,220816\n251635,30\n251637,220816\n251638,302\n251639,250\n251639,1684\n251640,179170\n251641,305\n251642,278\n251643,1235\n251643,1335\n251643,2209\n251643,8788\n251643,21711\n251643,29253\n251643,29294\n251644,310\n251645,44\n251646,861\n251647,1127\n251648,422\n251649,272\n251650,147\n251651,220816\n251652,30\n251653,5265\n251654,707\n251655,220816\n251656,302\n251657,251658\n251659,30\n251660,285\n251661,30\n251662,3903\n251663,330\n251664,247\n251665,455\n251666,283\n251667,932\n251668,220816\n251669,158\n251670,941\n251671,330\n251672,220816\n251673,7572\n251674,9098\n251675,302\n251676,23783\n251677,220816\n251678,4594\n251679,30\n251680,861\n251681,220816\n251682,333\n251683,138686\n251684,175\n251685,313\n251686,220816\n251688,220816\n251689,392\n251690,1238\n251691,278\n251692,1858\n251693,179170\n251694,1608\n251695,1\n251696,220816\n251697,1452\n251699,251700\n251701,30\n251702,3623\n251703,269\n251704,220816\n251705,2373\n251706,220816\n251707,202\n251709,704\n251710,389\n251711,493\n251712,220816\n251713,104\n251714,179170\n251715,220816\n251717,1085\n251717,2205\n251717,33424\n251717,245910\n251718,589\n251719,704\n251720,220816\n251721,83\n251722,251723\n251724,563\n251725,83\n251726,220816\n251727,557\n251728,1644\n251729,1179\n251729,2923\n251729,3695\n251731,142433\n251732,99\n251733,217\n251734,452\n251735,1247\n251735,164572\n251736,184\n251737,485\n251738,2646\n251739,2646\n251740,2620\n251741,147\n251742,323\n251743,138686\n251744,175\n251745,220816\n251747,784\n251748,6837\n251749,220816\n251750,220816\n251751,8270\n251752,220816\n251753,885\n251753,13704\n251754,220816\n251755,251756\n251757,292\n251758,272\n251759,5440\n251760,220816\n251761,1326\n251762,102\n251763,1323\n251764,408\n251765,22\n251766,264\n251767,3999\n251768,220816\n251769,220816\n251770,1381\n251771,179170\n251772,220816\n251773,251774\n251775,220816\n251776,220816\n251777,1425\n251778,220816\n251779,285\n251780,220816\n251781,147\n251781,158\n251781,779\n251781,1181\n251781,1515\n251782,220816\n251783,779\n251784,707\n251786,1133\n251787,272\n251787,439\n251787,563\n251787,980\n251787,2367\n251787,15573\n251788,179170\n251789,3041\n251790,1551\n251791,1363\n251792,1007\n251793,130\n251794,155481\n251795,1033\n251796,99\n251797,179170\n251798,1381\n251799,83\n251800,179170\n251801,179170\n251802,104\n251803,1639\n251804,1509\n251806,179170\n251807,34\n251807,35\n251808,5440\n251809,48\n251810,247\n251811,151\n251812,1474\n251812,1789\n251812,2590\n251813,179170\n251814,366\n251815,366\n251816,285\n251817,366\n251818,366\n251819,366\n251820,872\n251821,179170\n251822,491\n251823,251824\n251825,35486\n251826,8822\n251827,1803\n251829,424\n251830,179170\n251831,171\n251832,179170\n251833,843\n251834,179170\n251835,313\n251836,852\n251837,875\n251838,179170\n251839,509\n251840,1644\n251841,215276\n251842,103860\n251843,3582\n251844,179170\n251846,179170\n251848,106\n251850,1644\n251851,83\n251852,178\n251854,1381\n251856,872\n251857,1370\n251858,136\n251861,481\n251862,19\n251862,3252\n251863,83\n251864,640\n251865,640\n251866,640\n251867,83\n251868,640\n251869,779\n251870,1132\n251871,1608\n251873,2209\n251874,251875\n251876,309\n251876,310\n251879,56\n251880,422\n251881,189303\n251882,1132\n251883,48505\n251884,1132\n251885,657\n251887,252\n251888,1220\n251889,516\n251890,1522\n251891,309\n251891,310\n251892,328\n251892,704\n251892,1282\n251892,1402\n251892,1882\n251892,2205\n251892,33424\n251892,245910\n251893,1390\n251894,1085\n251895,1132\n251897,1132\n251899,393\n251900,393\n251901,393\n251902,10\n251903,158\n251904,240\n251905,1132\n251906,1132\n251907,6556\n251908,1132\n251909,920\n251910,1132\n251911,1132\n251912,781\n251913,1631\n251914,1579\n251915,932\n251916,24505\n251917,1132\n251918,818\n251919,781\n251920,818\n251921,30\n251922,313\n251923,167\n251925,393\n251926,1033\n251927,406\n251928,2116\n251929,195\n251930,171\n251931,620\n251932,30\n251933,138686\n251934,175\n251935,35486\n251936,714\n251937,179170\n251938,707\n251939,1132\n251940,251941\n251942,1274\n251943,406\n251944,1052\n251945,184\n251946,1181\n251947,3094\n251949,200\n251951,1151\n251951,1572\n251952,179170\n251954,4611\n251955,1231\n251956,2607\n251957,994\n251959,849\n251959,1634\n251959,2460\n251960,301\n251960,305\n251960,479\n251960,611\n251960,647\n251960,920\n251960,1326\n251960,2205\n251960,2867\n251960,2868\n251960,3089\n251960,5440\n251960,6661\n251960,8180\n251960,14556\n251960,19356\n251960,33424\n251960,245910\n251961,17309\n251962,301\n251963,1551\n251964,217\n251964,467\n251965,1515\n251966,779\n251967,179170\n251968,932\n251969,1644\n251970,60576\n251971,1089\n251972,893\n251973,1085\n251974,60576\n251975,752\n251976,328\n251977,83\n251978,56\n251979,422\n251980,1220\n251981,252\n251982,251\n251983,305\n251983,1844\n251984,56\n251985,422\n251987,142870\n251988,179170\n251989,140\n251990,179170\n251992,251993\n251994,251993\n251995,179170\n251996,707\n251997,393\n251997,435\n251997,980\n251997,1033\n251997,1776\n251998,107\n251999,1353\n252000,843\n252001,289\n252001,94134\n252002,19010\n252003,3260\n252004,707\n252005,510\n252007,179170\n252008,422\n252009,252010\n252011,422\n252012,422\n252013,422\n252014,422\n252015,1579\n252016,422\n252017,422\n252018,422\n252019,586\n252020,422\n252021,422\n252022,435\n252023,252024\n252025,252026\n252027,3538\n252028,515\n252029,251\n252030,4611\n252031,1381\n252032,1616\n252033,1572\n252034,14819\n252035,79\n252036,191355\n252037,389\n252038,72\n252038,392\n252038,406\n252039,811\n252040,4223\n252041,602\n252042,1359\n252043,252044\n252045,2334\n252046,779\n252047,267\n252048,302\n252049,1927\n252050,516\n252051,179170\n252052,861\n252054,302\n252055,179170\n252056,387\n252057,2995\n252058,1087\n252058,3370\n252058,4193\n252059,907\n252059,33424\n252059,245910\n252060,6068\n252060,7363\n252060,25348\n252060,94134\n252060,164572\n252061,30\n252062,273\n252063,302\n252064,1564\n252065,333\n252066,240174\n252068,918\n252069,30\n252070,861\n252071,1\n252072,179170\n252073,6184\n252076,1012\n252077,83\n252078,120\n252079,1160\n252080,349\n252081,167\n252082,138686\n252083,175\n252084,217\n252085,4594\n252086,1274\n252087,5591\n252088,1417\n252089,1359\n252090,30\n252091,515\n252092,130\n252095,60576\n252096,30\n252098,142879\n252100,1359\n252101,99\n252102,60576\n252103,1564\n252104,1454\n252105,1634\n252106,41\n252106,217\n252106,314\n252106,417\n252107,1359\n252108,15119\n252109,344\n252109,772\n252110,1955\n252111,406\n252111,620\n252112,509\n252113,179170\n252114,6556\n252115,2073\n252116,1893\n252117,99\n252118,247\n252119,1381\n252120,83\n252121,179170\n252122,1033\n252123,3260\n252124,179170\n252125,6955\n252126,179170\n252127,179170\n252128,1068\n252129,920\n252130,1240\n252131,435\n252132,1151\n252133,620\n252134,4771\n252135,179170\n252136,388\n252137,483\n252138,1143\n252139,1359\n252140,509\n252140,852\n252141,3804\n252142,2699\n252143,2006\n252144,1359\n252145,518\n252146,406\n252147,1939\n252148,1085\n252149,919\n252150,252151\n252152,1544\n252153,1722\n252154,843\n252155,392\n252156,247\n252157,149\n252158,151\n252159,1298\n252160,83\n252161,156379\n252162,248\n252163,252164\n252165,1515\n252166,779\n252167,32\n252168,179170\n252169,2083\n252170,383\n252171,1732\n252172,179170\n252173,179170\n252174,5405\n252175,179170\n252176,781\n252177,1132\n252178,1313\n252179,1096\n252180,2373\n252181,179170\n252182,99\n252183,671\n252184,36819\n252185,147191\n252186,1860\n252187,1858\n252188,1618\n252189,252190\n252191,2931\n252192,781\n252193,1132\n252194,994\n252195,885\n252195,13704\n252196,1227\n252196,86416\n252197,861\n252198,1579\n252199,272\n252200,179170\n252201,247\n252202,920\n252203,179170\n252204,994\n252205,652\n252206,252207\n252208,2424\n252209,424\n252210,994\n252211,99\n252212,333\n252213,151\n252213,663\n252214,5906\n252215,557\n252216,626\n252217,278\n252218,137\n252219,862\n252220,577\n252221,1033\n252222,3260\n252223,557\n252225,30\n252226,358\n252227,261\n252228,1860\n252229,1858\n252230,1522\n252231,111\n252232,30\n252234,994\n252235,589\n252236,620\n252238,30\n252239,4\n252239,5\n252240,704\n252241,79\n252242,179170\n252243,22\n252243,299\n252243,557\n252243,760\n252243,1177\n252243,1309\n252243,1359\n252243,1368\n252243,2416\n252243,2417\n252243,2701\n252243,2775\n252243,3129\n252243,3209\n252243,4237\n252243,182162\n252244,158\n252244,252\n252245,2929\n252245,23701\n252246,8854\n252247,611\n252248,252249\n252250,422\n252252,862\n252253,516\n252254,406\n252255,2923\n252256,179170\n252257,56\n252258,1058\n252259,433\n252260,338\n252262,718\n252263,179170\n252264,779\n252265,1515\n252266,179170\n252267,179170\n252269,255\n252270,932\n252271,179170\n252272,179170\n252273,346\n252274,220816\n252275,179170\n252277,10\n252278,1801\n252279,220816\n252281,179170\n252282,220816\n252283,397\n252284,179170\n252285,179170\n252286,536\n252287,1285\n252288,220816\n252289,179170\n252290,179170\n252291,179170\n252292,179170\n252293,220816\n252294,147\n252295,1058\n252297,83\n252298,333\n252299,252300\n252301,392\n252302,220816\n252303,278\n252304,179170\n252305,83\n252306,222\n252307,220816\n252308,179170\n252309,255\n252310,138686\n252311,175\n252312,179170\n252313,247\n252313,2867\n252313,2868\n252314,151\n252315,220816\n252316,278\n252317,563\n252318,1\n252319,30\n252320,106\n252321,7092\n252322,220816\n252323,994\n252324,179170\n252325,179170\n252326,994\n252327,278\n252328,220816\n252329,179170\n252330,1453\n252331,278\n252332,179170\n252333,220816\n252334,433\n252335,1181\n252336,179170\n252337,2590\n252338,179170\n252339,252340\n252341,7768\n252341,13137\n252342,147\n252342,296\n252342,631\n252342,801\n252342,1068\n252342,1181\n252342,1385\n252342,1452\n252342,1466\n252342,1749\n252342,2116\n252342,2617\n252342,13136\n252342,14352\n252342,54202\n252342,125569\n252343,179170\n252344,920\n252345,99\n252346,179170\n252347,220816\n252348,255\n252349,99\n252350,220816\n252351,3623\n252352,707\n252353,805\n252354,1326\n252355,102\n252356,1323\n252357,408\n252358,220816\n252359,220816\n252360,433\n252361,1556\n252362,179170\n252363,30\n252364,179170\n252365,179170\n252366,30\n252367,179170\n252368,220816\n252369,147\n252370,247\n252371,179170\n252372,30\n252373,707\n252374,149\n252375,220816\n252376,634\n252377,252378\n252379,179170\n252380,1113\n252381,220816\n252382,5366\n252383,217\n252384,30\n252385,30\n252386,179170\n252387,285\n252388,179170\n252389,250\n252389,1684\n252390,30\n252391,536\n252392,1773\n252393,179170\n252394,30\n252395,292\n252396,252397\n252398,220816\n252399,704\n252400,493\n252401,285\n252402,220816\n252403,250\n252403,1684\n252404,4545\n252404,56150\n252405,697\n252406,581\n252407,179170\n252408,406\n252409,58\n252409,1177\n252409,1893\n252409,3474\n252410,285\n252411,422\n252412,422\n252413,422\n252414,422\n252415,422\n252416,422\n252417,422\n252418,422\n252419,422\n252420,422\n252422,179170\n252423,179170\n252424,779\n252425,920\n252426,631\n252426,862\n252427,179170\n252428,252429\n252430,671\n252431,1132\n252432,252433\n252435,920\n252436,179170\n252437,252438\n252439,1001\n252440,1467\n252441,455\n252442,2424\n252443,200\n252444,1871\n252445,83\n252446,13980\n252447,795\n252448,304\n252449,35486\n252450,1556\n252451,217\n252452,536\n252453,8991\n252453,72439\n252454,252455\n252456,179170\n252457,137\n252458,151\n252459,178\n252460,30\n252461,142870\n252462,252463\n252464,192\n252465,192\n252466,1544\n252467,1544\n252468,179170\n252469,1544\n252470,349\n252471,779\n252472,79\n252473,1544\n252474,1544\n252476,1544\n252477,138686\n252478,175\n252479,346\n252480,217\n252481,1147\n252483,366\n252484,366\n252485,366\n252486,179170\n252487,366\n252488,366\n252489,366\n252490,366\n252491,366\n252492,366\n252493,366\n252494,2775\n252495,447\n252496,1544\n252497,392\n252498,145240\n252499,1326\n252501,760\n252503,1414\n252503,72439\n252505,393\n252507,104\n252508,252509\n252510,1135\n252511,392\n252512,1860\n252513,1858\n252514,217\n252515,875\n252516,707\n252517,3623\n252518,781\n252519,1132\n252520,589\n252521,1707\n252522,640\n252523,640\n252524,781\n252525,1132\n252527,1\n252528,1132\n252529,781\n252530,433\n252531,30\n252532,781\n252533,1132\n252534,781\n252535,1132\n252536,2923\n252537,30\n252538,3623\n252539,30\n252540,2266\n252541,1033\n252543,1284\n252544,516\n252545,217\n252546,179170\n252547,79\n252547,192\n252547,202\n252547,333\n252547,1181\n252548,726\n252548,859\n252549,920\n252550,1644\n252551,1345\n252552,222\n252553,620\n252554,162599\n252555,179170\n252558,1058\n252559,252560\n252562,818\n252563,406\n252564,1220\n252566,1326\n252567,79\n252569,3602\n252570,832\n252571,2116\n252573,1544\n252574,779\n252575,1515\n252576,35486\n252578,1509\n252579,217\n252579,2116\n252579,2617\n252579,2626\n252580,1544\n252581,1544\n252582,1544\n252583,1544\n252586,1544\n252587,205488\n252588,1544\n252589,1544\n252591,1544\n252593,179170\n252595,252596\n252601,1544\n252603,1544\n252609,450\n252610,1544\n252611,1544\n252612,1544\n252613,1544\n252615,687\n252616,1544\n252618,1544\n252621,1544\n252622,1544\n252624,1544\n252625,1544\n252626,1544\n252627,1544\n252629,1544\n252630,1544\n252631,1544\n252633,626\n252634,1544\n252635,1544\n252636,1544\n252637,1544\n252638,1544\n252639,1544\n252640,1238\n252641,304\n252642,1452\n252643,192\n252644,68\n252645,1644\n252646,1544\n252647,932\n252648,120\n252649,217\n252650,301\n252650,1293\n252651,118336\n252652,333\n252653,818\n252654,3804\n252655,795\n252656,2979\n252657,99\n252658,2006\n252659,14797\n252660,233\n252661,1001\n252662,63\n252663,1715\n252664,3\n252665,525\n252666,3193\n252667,518\n252668,236180\n252669,269\n252671,1608\n252672,1132\n252673,1544\n252674,911\n252675,1135\n252677,1785\n252678,137\n252679,589\n252680,83\n252681,151\n252682,328\n252683,7768\n252684,269\n252685,4\n252685,5\n252686,30\n252687,1544\n252688,663\n252690,192\n252691,431\n252691,611\n252692,5405\n252693,106\n252694,58\n252695,994\n252696,46\n252697,781\n252698,1132\n252699,920\n252700,1544\n252701,557\n252702,1467\n252703,120\n252704,994\n252705,192\n252706,718\n252707,1265\n252707,1266\n252708,1544\n252709,491\n252710,30\n252711,718\n252712,192\n252713,60576\n252715,801\n252716,189839\n252717,217\n252718,1151\n252719,2646\n252720,1132\n252721,781\n252722,217\n252723,1130\n252724,2048\n252725,1858\n252726,1860\n252727,1860\n252728,1858\n252729,302\n252730,781\n252731,1132\n252732,179170\n252733,843\n252735,146\n252735,92476\n252736,252737\n252738,1544\n252739,137\n252740,861\n252741,1127\n252742,4691\n252743,156379\n252744,2168\n252746,30\n252747,217\n252748,338\n252749,720\n252749,1117\n252750,222\n252750,283\n252751,200\n252753,1419\n252753,2931\n252754,781\n252755,1132\n252756,588\n252756,590\n252757,146\n252757,92476\n252758,151\n252759,3623\n252760,232766\n252761,189128\n252762,1860\n252763,1858\n252764,10\n252765,832\n252766,184\n252767,178\n252768,83\n252769,1235\n252769,1335\n252770,1132\n252771,781\n252772,467\n252773,310\n252773,3039\n252774,134\n252775,919\n252776,48505\n252777,647\n252778,515\n252779,1188\n252780,179170\n252781,261\n252781,333\n252782,179170\n252783,422\n252783,5405\n252784,1381\n252785,83\n252786,389\n252787,1\n252789,252790\n252791,252792\n252793,406\n252794,1454\n252795,179170\n252796,801\n252796,3474\n252797,86\n252798,1151\n252799,1381\n252800,920\n252801,631\n252801,2620\n252802,179170\n252803,433\n252804,252805\n252806,56\n252807,422\n252808,1181\n252809,179170\n252810,158\n252811,179170\n252812,179170\n252813,1\n252814,1\n252815,872\n252817,179170\n252818,932\n252819,422\n252820,56\n252821,1544\n252822,151\n252823,2572\n252824,56\n252825,422\n252826,87\n252827,151\n252828,252829\n252830,192\n252830,333\n252830,422\n252831,179170\n252832,147\n252833,1425\n252834,179170\n252835,179170\n252836,138686\n252837,179170\n252838,175\n252839,179170\n252840,179170\n252841,179170\n252842,406\n252843,406\n252844,424\n252845,179170\n252846,179170\n252847,433\n252848,1085\n252849,179170\n252850,6506\n252851,179170\n252852,900\n252853,775\n252854,4594\n252855,422\n252856,1544\n252857,217\n252858,83\n252859,86\n252861,3148\n252862,2353\n252863,240\n252863,968\n252864,179170\n252865,83\n252866,179170\n252867,6424\n252868,179170\n252869,704\n252870,179170\n252871,861\n252872,79\n252873,707\n252874,247\n252875,590\n252875,1419\n252876,3297\n252877,252878\n252879,1556\n252880,563\n252881,179170\n252882,2334\n252885,1381\n252886,1058\n252887,179170\n252888,247\n252889,704\n252890,932\n252892,433\n252893,217\n252893,467\n252894,390\n252895,120\n252896,302\n252896,720\n252897,220816\n252898,330\n252899,200\n252900,439\n252901,872\n252902,433\n252903,220816\n252904,56\n252905,422\n252906,252907\n252908,220816\n252909,312\n252910,1882\n252911,179170\n252912,247\n252913,217\n252913,536\n252914,7092\n252915,1544\n252917,113156\n252918,220816\n252919,483\n252920,1556\n252921,179170\n252922,220816\n252923,8308\n252924,278\n252925,200\n252926,673\n252927,179170\n252928,200\n252929,179170\n252930,557\n252931,557\n252932,330\n252933,1860\n252934,1858\n252935,19010\n252936,435\n252937,1052\n252938,54\n252939,2775\n252940,179170\n252941,252942\n252943,142473\n252944,455\n252945,220816\n252946,657\n252947,56\n252948,422\n252949,179170\n252950,83\n252951,809\n252952,1882\n252953,220816\n252954,843\n252955,255\n252956,8270\n252957,179170\n252959,202\n252960,158\n252961,557\n252962,862\n252963,1474\n252964,146\n252964,92476\n252965,179170\n252966,1235\n252967,220816\n252968,179170\n252969,1381\n252970,392\n252972,179170\n252973,94134\n252974,202\n252975,1300\n252976,220816\n252977,1294\n252978,2116\n252979,994\n252980,220816\n252983,994\n252984,433\n252985,2373\n252986,2048\n252987,179170\n252988,179170\n252989,252990\n252991,220816\n252992,179170\n252993,147\n252994,138686\n252995,175\n252996,83\n252997,179170\n252998,577\n252999,30\n253000,30\n253001,1556\n253002,3623\n253003,3623\n253004,220816\n253005,83\n253006,220816\n253007,859\n253008,220816\n253009,179170\n253010,1019\n253011,13661\n253012,1353\n253014,3623\n253015,220816\n253016,179170\n253018,220816\n253019,2590\n253021,253022\n253023,253024\n253025,167\n253027,726\n253028,179170\n253030,289\n253030,94134\n253031,1\n253032,179170\n253033,779\n253034,253035\n253036,253037\n253036,261721\n253038,200\n253039,112699\n253039,146134\n253040,88820\n253041,207\n253042,1368\n253043,493\n253045,65\n253045,264\n253045,1659\n253045,2979\n253046,179170\n253047,192\n253048,5961\n253049,491\n253050,872\n253051,1429\n253052,1531\n253053,4545\n253053,56150\n253054,30\n253055,2017\n253055,2775\n253055,17309\n253056,155481\n253057,4545\n253057,56150\n253058,35486\n253059,668\n253060,2590\n253061,54\n253062,54\n253063,240\n253064,862\n253065,253066\n253067,30\n253068,253069\n253070,111\n253071,3623\n253072,253073\n253074,30\n253075,557\n253076,179170\n253077,704\n253078,493\n253079,1143\n253080,1773\n253081,779\n253082,167273\n253083,1773\n253084,1227\n253084,86416\n253085,435\n253086,83\n253087,141077\n253087,255925\n253088,56\n253089,422\n253090,827\n253091,872\n253092,1010\n253092,1298\n253094,19\n253098,2574\n253099,538\n253099,671\n253099,1590\n253099,2353\n253099,6966\n253101,48\n253102,972\n253103,285\n253105,893\n253106,124668\n253107,1417\n253108,252\n253108,516\n253108,1220\n253110,3115\n253111,88820\n253112,88820\n253113,1893\n253114,366\n253115,366\n253116,366\n253117,192\n253117,422\n253118,366\n253119,366\n253120,366\n253121,366\n253122,872\n253123,6424\n253124,366\n253125,366\n253126,743\n253127,433\n253128,433\n253129,390\n253130,640\n253131,433\n253132,536\n253133,433\n253134,136\n253135,215276\n253136,536\n253139,557\n253140,4237\n253140,182162\n253141,3209\n253142,2312\n253143,1177\n253144,1359\n253145,253146\n253147,256187\n253147,256834\n253147,257244\n253147,261750\n253148,433\n253149,215276\n253150,167\n253151,673\n253152,253153\n253154,2073\n253155,178576\n253156,253157\n253158,189842\n253159,13661\n253160,1130\n253161,167\n253162,663\n253163,79\n253164,996\n253165,779\n253166,818\n253167,2671\n253168,253169\n253170,920\n253171,179170\n253172,240\n253172,332\n253172,818\n253172,1014\n253172,2235\n253172,2620\n253172,3879\n253172,4179\n253172,6856\n253172,7344\n253172,26362\n253172,37407\n253172,46316\n253172,51252\n253172,54551\n253172,130357\n253172,144231\n253172,248733\n253172,250524\n253172,250713\n253173,1033\n253175,163\n253175,302\n253176,30\n253177,5034\n253178,5591\n253179,620\n253180,1531\n253181,920\n253182,694\n253183,694\n253184,602\n253185,13661\n253186,148742\n253187,1133\n253188,752\n253190,406\n253191,242246\n253192,189839\n253193,22\n253194,83\n253196,179170\n253198,779\n253199,1515\n253201,135\n253202,1425\n253204,1425\n253205,4223\n253206,253207\n253208,647\n253209,158\n253210,859\n253211,158\n253212,302\n253213,1579\n253214,2209\n253215,1425\n253216,310\n253216,805\n253217,333\n253218,442\n253220,255\n253221,2607\n253222,433\n253223,31073\n253224,408\n253227,251\n253228,1238\n253229,217\n253230,1181\n253231,83\n253232,1452\n253233,3209\n253234,149\n253234,178\n253234,333\n253234,406\n253235,1773\n253236,140\n253237,422\n253238,422\n253239,422\n253240,932\n253241,1860\n253242,1858\n253243,422\n253244,1860\n253245,422\n253246,1858\n253247,1033\n253248,422\n253249,422\n253250,809\n253251,215\n253252,805\n253253,3623\n253254,22293\n253255,1608\n253256,253257\n253258,1132\n253259,1014\n253260,120\n253261,1417\n253262,1014\n253263,422\n253264,447\n253265,2775\n253266,1014\n253267,620\n253268,10\n253269,422\n253270,808\n253271,1014\n253272,779\n253273,406\n253274,1801\n253274,3182\n253275,422\n253276,253277\n253278,6506\n253279,202\n253280,781\n253281,1132\n253282,35486\n253283,13661\n253284,119\n253285,442\n253286,1515\n253287,779\n253288,240\n253289,2626\n253290,1052\n253291,54\n253292,2775\n253293,215276\n253294,2424\n253295,302\n253296,253297\n253298,106\n253300,179170\n253301,422\n253302,1983\n253303,1282\n253304,1181\n253305,1167\n253306,589\n253307,1785\n253308,1124\n253309,1782\n253310,973\n253311,86\n253312,148742\n253313,1381\n253314,1014\n253315,269\n253316,151\n253316,178\n253317,106\n253318,1276\n253320,106\n253321,1579\n253322,333\n253324,200\n253325,1363\n253326,142405\n253326,154408\n253327,195\n253328,106\n253329,1619\n253330,162599\n253332,184\n253333,233\n253334,58\n253335,346\n253336,809\n253337,130\n253338,253339\n253340,577\n253341,29380\n253342,227669\n253343,1608\n253344,850\n253344,3370\n253345,372\n253347,509\n253347,1043\n253348,422\n253349,4545\n253349,56150\n253350,1326\n253351,1132\n253352,313\n253354,1801\n253355,358\n253356,515\n253357,140\n253358,622\n253358,1033\n253358,1590\n253359,2421\n253360,2421\n253361,491\n253362,189834\n253363,447\n253364,2775\n253365,1893\n253366,920\n253367,1188\n253368,179170\n253369,209\n253370,485\n253371,1769\n253372,3623\n253373,30331\n253374,843\n253375,253376\n253377,663\n253378,179170\n253379,179170\n253381,1368\n253382,3623\n253383,138686\n253384,175\n253385,4192\n253385,4193\n253386,179170\n253387,253388\n253389,136\n253390,200\n253391,179170\n253392,392\n253393,30\n253394,996\n253394,1644\n253395,73570\n253396,510\n253396,3182\n253397,73570\n253398,50\n253398,79\n253398,99\n253399,3623\n253400,615\n253401,225\n253402,440\n253403,707\n253404,557\n253405,151\n253406,455\n253407,255\n253408,433\n253413,647\n253415,525\n253417,220816\n253418,1309\n253419,179170\n253420,106\n253421,3960\n253422,1285\n253423,1363\n253424,220816\n253425,586\n253425,1243\n253426,138686\n253427,175\n253428,179170\n253429,631\n253430,294\n253431,35486\n253432,1454\n253433,253434\n253435,1544\n253436,79\n253437,83\n253438,843\n253439,179170\n253440,79\n253442,83\n253443,179170\n253444,179170\n253445,106\n253446,192\n253447,994\n253448,302\n253449,179170\n253450,253451\n253452,179170\n253453,77\n253454,83\n253454,278\n253454,577\n253455,253456\n253457,179170\n253458,536\n253459,269\n253460,862\n253461,179170\n253462,704\n253463,79\n253464,2620\n253465,809\n253466,220816\n253467,885\n253467,13704\n253468,179170\n253470,253471\n253472,7092\n253473,10\n253474,220816\n253475,7416\n253476,83\n253477,207\n253478,536\n253479,217\n253480,516\n253481,779\n253482,694\n253483,278\n253484,155481\n253485,217\n253486,147\n253487,83\n253488,220816\n253489,1274\n253490,10\n253491,220816\n253492,1363\n253493,220816\n253494,220816\n253495,220816\n253496,138\n253497,865\n253498,557\n253499,137\n253500,1893\n253501,88820\n253502,138686\n253503,175\n253504,557\n253505,220816\n253506,932\n253507,179170\n253509,220816\n253510,949\n253511,8855\n253512,4172\n253513,1749\n253514,1363\n253515,86\n253516,222\n253517,77\n253518,818\n253519,179170\n253520,818\n253521,433\n253522,179170\n253523,179170\n253524,202\n253525,1132\n253526,44\n253527,83\n253528,55849\n253529,179170\n253530,253531\n253532,206\n253533,332\n253534,30\n253535,179170\n253536,104\n253537,1860\n253538,179170\n253539,1\n253540,220816\n253541,663\n253542,663\n253543,420\n253544,775\n253545,663\n253546,220816\n253547,220816\n253548,1644\n253549,147\n253550,179170\n253551,577\n253552,30\n253553,179170\n253554,179170\n253555,253556\n253557,138686\n253558,175\n253559,1368\n253560,54\n253561,179170\n253562,253563\n253564,253565\n253567,179170\n253568,287\n253569,818\n253570,179170\n253571,1368\n253572,422\n253573,422\n253574,422\n253575,253576\n253577,1832\n253578,422\n253579,422\n253580,422\n253581,2373\n253582,1860\n253583,1858\n253584,179170\n253585,222\n253586,179170\n253587,179170\n253588,1782\n253589,253590\n253591,1773\n253592,1634\n253593,54\n253594,1181\n253595,179170\n253596,253597\n253598,285\n253599,179170\n253600,30\n253601,30\n253602,179170\n253603,30\n253604,179170\n253605,179170\n253606,179170\n253607,179170\n253608,179170\n253609,179170\n253610,179170\n253611,179170\n253612,30\n253613,1181\n253615,483\n253616,285\n253617,250\n253617,1684\n253618,285\n253619,250\n253619,1684\n253620,225\n253621,253622\n253623,171\n253624,220816\n253625,220816\n253627,220816\n253628,8884\n253629,179170\n253630,1381\n253631,784\n253632,1085\n253634,179170\n253635,179170\n253636,253637\n253638,289\n253638,94134\n253639,422\n253640,56\n253641,493\n253642,1160\n253643,1707\n253644,253645\n253646,240174\n253647,179170\n253648,285\n253649,147\n253650,422\n253651,134\n253652,151\n253653,3804\n253654,1319\n253655,240\n253656,207\n253657,255\n253658,433\n253659,205627\n253660,3507\n253660,3698\n253661,366\n253662,366\n253663,366\n253664,366\n253665,366\n253666,366\n253667,366\n253668,366\n253669,366\n253670,179170\n253671,366\n253672,56\n253673,422\n253674,2528\n253674,2590\n253674,5469\n253675,205488\n253676,179170\n253677,390\n253679,2421\n253680,30\n253681,1544\n253682,253683\n253684,30\n253685,35486\n253686,273\n253687,647\n253688,179170\n253689,1566\n253690,1644\n253691,179170\n253692,142870\n253693,1644\n253694,704\n253695,1181\n253697,1634\n253698,179170\n253699,191355\n253700,932\n253701,3623\n253702,30\n253703,968\n253704,253705\n253704,261254\n253706,422\n253707,56\n253709,179170\n253710,1181\n253711,179170\n253713,179170\n253714,83\n253715,302\n253716,918\n253716,1160\n253717,1400\n253718,30\n253719,333\n253720,333\n253721,968\n253721,2083\n253721,3207\n253721,5301\n253722,1807\n253723,1298\n253724,1544\n253726,253727\n253728,784\n253729,1623\n253730,30\n253731,8270\n253733,647\n253734,44480\n253734,116178\n253734,254662\n253736,179170\n253737,138686\n253738,175\n253739,1381\n253740,1707\n253741,1160\n253742,179170\n253743,179170\n253744,1644\n253745,1\n253746,663\n253747,179170\n253748,835\n253749,2073\n253750,313\n253751,7124\n253752,179170\n253753,433\n253754,1181\n253755,1858\n253756,1860\n253757,932\n253758,147\n253759,24505\n253760,447\n253761,220816\n253762,220816\n253763,44\n253765,220816\n253766,179170\n253767,15179\n253768,220816\n253769,220816\n253770,5961\n253771,220816\n253773,8270\n253774,261\n253775,253776\n253777,1888\n253778,179170\n253779,179170\n253780,179170\n253781,179170\n253782,151\n253783,253784\n253785,3260\n253786,179170\n253787,312\n253788,285\n253789,344\n253790,179170\n253791,1235\n253791,1335\n253792,220816\n253793,1479\n253794,390\n253795,179170\n253796,179170\n253797,179170\n253798,220816\n253799,179170\n253800,227669\n253801,167\n253802,30\n253803,56\n253804,433\n253805,253806\n253807,30\n253808,433\n253809,179170\n253810,179170\n253811,269\n253812,179170\n253813,433\n253814,179170\n253815,4355\n253816,179170\n253817,179170\n253818,422\n253819,56\n253821,406\n253822,179170\n253823,333\n253824,253825\n253826,179170\n253827,179170\n253828,3\n253829,147\n253830,179170\n253831,1181\n253832,179170\n253833,179170\n253834,1085\n253834,1140\n253834,4504\n253835,253836\n253837,422\n253838,56\n253839,30\n253840,179170\n253842,1769\n253843,30\n253844,483\n253845,253846\n253848,179170\n253849,179170\n253850,1634\n253852,179170\n253853,253854\n253855,253856\n253857,253858\n253859,3447\n253860,253861\n253862,222\n253862,588\n253862,590\n253863,349\n253864,179170\n253865,179170\n253866,179170\n253867,253868\n253869,50\n253870,179170\n253871,253872\n253873,58\n253874,30\n253875,366\n253876,366\n253877,366\n253878,366\n253879,179170\n253880,433\n253881,107\n253882,2416\n253882,2417\n253883,292\n253884,338\n253885,179170\n253886,298\n253887,179170\n253888,1133\n253889,3538\n253890,253891\n253892,1220\n253893,253894\n253895,179170\n253896,179170\n253897,179170\n253898,1313\n253899,179170\n253900,179170\n253901,179170\n253902,433\n253903,179170\n253904,179170\n253905,1227\n253905,86416\n253906,1058\n253907,30\n253909,1531\n253910,5405\n253911,253912\n253911,256445\n253913,433\n253914,634\n253915,55849\n253916,302\n253917,439\n253918,35486\n253919,1707\n253920,179170\n253921,285\n253922,217\n253923,1247\n253923,164572\n253924,355\n253925,1052\n253926,1052\n253927,55849\n253928,55849\n253929,97\n253930,491\n253931,355\n253932,55849\n253933,217\n253933,222\n253933,390\n253933,589\n253933,631\n253933,932\n253933,1001\n253933,1085\n253933,1122\n253933,1522\n253934,392\n253935,217\n253936,4218\n253937,145240\n253938,389\n253939,1181\n253939,3876\n253940,179170\n253941,1203\n253942,30\n253942,4355\n253943,422\n253944,56\n253945,5265\n253946,179170\n253947,30\n253947,275\n253948,253949\n253950,1776\n253950,2617\n253951,4611\n253952,1803\n253953,289\n253953,94134\n253954,346\n253955,253956\n253957,1572\n253958,30\n253959,247\n253960,1381\n253961,56\n253962,422\n253963,253964\n253965,1381\n253966,932\n253967,30\n253968,16019\n253969,138686\n253970,175\n253971,151\n253972,491\n253973,179170\n253974,483\n253975,240174\n253976,2989\n253976,2991\n253977,269\n253978,3804\n253979,536\n253980,302\n253981,240174\n253982,2146\n253983,346\n253984,779\n253985,227669\n253986,406\n253987,147\n253988,32\n253989,1417\n253990,518\n253991,1983\n253992,179170\n253993,1707\n253994,179170\n253995,7\n253996,994\n253997,934\n253998,406\n253998,1801\n253998,3474\n253999,179170\n254000,994\n254001,179170\n254002,1515\n254003,254004\n254006,179170\n254007,179170\n254008,6506\n254011,920\n254012,1962\n254013,179170\n254014,179170\n254015,8788\n254016,493\n254017,179170\n254018,179170\n254019,557\n254020,328\n254021,1345\n254022,141912\n254024,5265\n254026,442\n254027,302\n254028,179170\n254029,292\n254030,179170\n254031,179170\n254032,254033\n254034,28130\n254035,158\n254036,1707\n254037,1860\n254038,1858\n254039,144962\n254040,4611\n254041,1274\n254042,54\n254043,247\n254044,536\n254045,1608\n254046,1359\n254047,1082\n254048,972\n254049,179170\n254050,3846\n254051,54\n254052,406\n254053,1224\n254054,1298\n254055,179170\n254056,115659\n254056,142870\n254057,179170\n254058,254059\n254060,179170\n254061,875\n254062,254063\n254064,422\n254065,422\n254066,422\n254067,422\n254068,422\n254069,422\n254070,422\n254071,422\n254072,422\n254073,422\n254074,994\n254075,422\n254076,3623\n254077,875\n254078,3623\n254079,197260\n254080,3623\n254081,179170\n254082,255\n254083,192\n254084,179170\n254085,138686\n254086,175\n254087,424\n254088,269\n254089,843\n254090,41\n254091,147\n254091,192\n254091,406\n254091,439\n254091,779\n254091,1181\n254091,2931\n254092,200\n254093,30\n254093,5310\n254094,1274\n254095,393\n254096,332\n254097,179170\n254098,179170\n254099,179170\n254100,179170\n254101,179170\n254102,3447\n254103,1522\n254104,179170\n254105,50\n254106,1\n254107,1181\n254109,422\n254110,179170\n254111,366\n254112,254113\n254114,366\n254115,292\n254116,294\n254117,296\n254118,403\n254118,668\n254118,2168\n254118,4691\n254119,366\n254120,298\n254121,142473\n254122,179170\n254124,187\n254125,589\n254126,8991\n254126,72439\n254127,6119\n254128,1119\n254130,179170\n254131,636\n254132,636\n254133,4597\n254134,179170\n254135,704\n254136,493\n254137,79\n254138,592\n254139,585\n254140,586\n254141,406\n254142,393\n254143,50\n254144,30\n254145,179170\n254146,30\n254147,30\n254148,135\n254148,355\n254148,227669\n254149,30\n254150,1544\n254151,1243\n254152,477\n254153,217\n254154,259\n254155,179170\n254156,666\n254157,30\n254158,254159\n254160,1419\n254161,179170\n254162,217\n254162,536\n254163,1188\n254164,140\n254165,254166\n254168,55849\n254169,30\n254170,1634\n254171,2460\n254173,433\n254174,148742\n254175,30\n254176,1167\n254177,6837\n254179,285\n254181,1058\n254182,115659\n254183,1707\n254184,2775\n254187,179170\n254188,907\n254189,872\n254190,5405\n254191,1070\n254192,179170\n254193,838\n254194,254195\n254197,1984\n254198,106\n254199,30\n254201,278\n254202,10\n254203,35486\n254204,179170\n254205,30\n254206,1893\n254207,783\n254207,1102\n254207,2646\n254208,1860\n254209,1858\n254210,433\n254213,392\n254213,685\n254214,707\n254216,586\n254217,433\n254218,1096\n254219,707\n254220,179170\n254222,972\n254223,671\n254224,147\n254224,158\n254225,273\n254226,269\n254227,516\n254228,1151\n254229,179170\n254230,179170\n254231,980\n254232,179170\n254233,179170\n254234,1425\n254235,3392\n254236,30\n254238,179170\n254239,254240\n254241,3623\n254242,83\n254243,248\n254244,1608\n254245,1132\n254246,920\n254247,920\n254248,184\n254249,103860\n254250,179170\n254251,1509\n254253,209\n254254,48\n254255,1551\n254255,191860\n254257,151\n254258,1089\n254259,8\n254261,5405\n254262,287\n254263,1370\n254265,4597\n254267,31073\n254268,1087\n254269,35486\n254270,179170\n254271,179170\n254272,5405\n254273,206\n254274,179170\n254275,422\n254276,4193\n254277,1119\n254277,72439\n254278,307\n254278,332\n254278,1684\n254278,182162\n254279,406\n254280,18726\n254281,1238\n254282,994\n254284,5405\n254285,994\n254286,254287\n254288,217\n254289,254290\n254291,1608\n254292,1132\n254293,1452\n254294,1212\n254295,302\n254296,493\n254297,1608\n254298,1132\n254299,389\n254300,22\n254301,117163\n254303,1102\n254306,657\n254306,2266\n254307,140\n254308,1243\n254309,1102\n254310,209\n254311,1102\n254312,356\n254313,287\n254314,663\n254315,1849\n254316,1102\n254317,467\n254318,811\n254319,138\n254320,1453\n254321,254322\n254323,932\n254324,312\n254325,214131\n254326,4549\n254327,7572\n254328,9098\n254330,138686\n254331,175\n254332,592\n254333,302\n254334,640\n254335,1181\n254336,861\n254337,640\n254338,346\n254339,994\n254340,3876\n254341,1522\n254342,1544\n254343,179170\n254344,2620\n254345,1381\n254346,392\n254348,5662\n254349,1381\n254350,5405\n254351,406\n254353,868\n254354,142426\n254355,1465\n254356,388\n254357,1010\n254358,222\n254359,179170\n254360,3695\n254361,83\n254362,292\n254363,179170\n254364,862\n254365,179170\n254366,1368\n254367,200\n254368,27356\n254369,136\n254371,227669\n254372,872\n254373,671\n254374,3623\n254375,1007\n254376,179170\n254377,1132\n254378,1608\n254379,2379\n254380,272\n254382,577\n254383,1096\n254385,589\n254386,346\n254387,81\n254388,527\n254389,390\n254389,752\n254390,557\n254394,1769\n254395,113156\n254396,44\n254397,1722\n254399,147\n254400,147\n254402,5265\n254403,179170\n254404,647\n254405,344\n254406,146\n254406,92476\n254407,1740\n254408,184\n254409,392\n254409,1465\n254410,694\n254413,779\n254414,179170\n254415,278\n254416,996\n254417,647\n254418,30\n254419,1116\n254420,622\n254421,83\n254422,111142\n254423,1087\n254424,615\n254424,1732\n254425,30\n254426,5405\n254427,1220\n254428,516\n254429,252\n254430,1983\n254431,58\n254432,994\n254433,46\n254435,1564\n254436,5405\n254437,54\n254438,138686\n254439,2146\n254440,175\n254441,1955\n254442,1556\n254443,1949\n254444,167\n254446,30\n254447,346\n254448,54\n254452,483\n254453,247\n254454,30\n254455,1052\n254456,54\n254457,2775\n254458,1381\n254459,6387\n254460,9001\n254461,30\n254462,707\n254463,1058\n254465,336\n254466,843\n254467,515\n254468,444\n254469,406\n254470,406\n254472,309\n254472,310\n254474,192\n254475,1608\n254476,1132\n254478,58\n254479,2797\n254480,3331\n254481,332\n254482,3319\n254483,3328\n254484,179170\n254485,360\n254486,55849\n254487,1860\n254488,1858\n254489,406\n254489,779\n254491,493\n254492,254493\n254494,5405\n254495,217\n254496,7416\n254497,217\n254498,55849\n254499,3367\n254500,30\n254501,283\n254502,1078\n254503,694\n254504,1860\n254505,1858\n254506,3623\n254507,278\n254508,30\n254509,107\n254510,2779\n254512,247\n254513,179170\n254514,1172\n254515,668\n254517,134\n254518,60576\n254519,5405\n254520,192\n254521,333\n254522,179170\n254523,179170\n254524,175\n254525,1608\n254526,1132\n254527,138686\n254528,175\n254529,1722\n254530,4597\n254531,192\n254532,918\n254533,179170\n254534,628\n254534,1204\n254535,920\n254536,255\n254537,2146\n254538,1749\n254539,2979\n254540,151\n254541,859\n254542,1\n254543,932\n254544,779\n254545,179170\n254546,1849\n254547,1319\n254548,83\n254549,389\n254550,119\n254551,55849\n254552,577\n254553,516\n254553,189788\n254553,215310\n254553,253135\n254554,254555\n254556,215\n254557,563\n254558,563\n254559,192\n254560,2775\n254562,179170\n254563,3\n254564,2373\n254565,73570\n254566,1860\n254567,179170\n254569,179170\n254570,2421\n254572,30\n254573,179170\n254574,10\n254576,592\n254578,1298\n254579,204093\n254580,1212\n254581,240\n254582,1089\n254583,154408\n254584,106\n254585,252\n254586,3623\n254587,158\n254588,346\n254589,220816\n254590,433\n254591,5405\n254592,403\n254592,693\n254593,217\n254593,1417\n254594,179170\n254595,3804\n254596,252\n254597,220816\n254598,19010\n254599,247\n254600,663\n254601,65\n254601,264\n254601,1659\n254601,2979\n254602,13361\n254603,220816\n254604,1085\n254605,220816\n254606,302\n254606,406\n254606,420\n254606,1414\n254606,1466\n254607,254608\n254609,220816\n254610,1220\n254611,252\n254612,516\n254613,179170\n254614,2048\n254615,536\n254616,149\n254617,220816\n254618,503\n254619,50\n254620,1319\n254622,220816\n254623,220816\n254624,254625\n254626,247\n254627,920\n254628,220816\n254629,275\n254630,516\n254631,227376\n254631,264499\n254631,264502\n254632,485\n254633,298\n254634,220816\n254635,273\n254636,301\n254637,1001\n254637,2443\n254638,1707\n254639,179170\n254640,1\n254641,138686\n254642,175\n254643,440\n254644,220816\n254645,217\n254646,704\n254647,79\n254648,220816\n254649,179170\n254650,1326\n254651,102\n254652,1323\n254653,408\n254654,220816\n254655,733\n254656,673\n254657,142870\n254658,179170\n254659,35486\n254660,1474\n254661,220816\n254663,179170\n254664,3\n254665,254666\n254667,220816\n254668,518\n254670,220816\n254671,54\n254672,536\n254672,1240\n254673,264\n254674,220816\n254675,1579\n254676,1572\n254677,179170\n254678,809\n254679,220816\n254680,220816\n254681,54\n254682,2889\n254683,1359\n254684,220816\n254685,115659\n254686,907\n254686,1955\n254687,220816\n254688,1425\n254689,220816\n254690,707\n254691,968\n254691,1837\n254691,1893\n254691,2083\n254692,340\n254693,220816\n254694,220816\n254695,179170\n254696,158\n254697,366\n254698,220816\n254699,55849\n254700,220816\n254701,1001\n254702,18726\n254703,406\n254704,1313\n254705,891\n254705,131675\n254706,134\n254707,707\n254708,1300\n254709,3623\n254710,179170\n254711,30\n254712,147\n254713,87\n254713,687\n254713,872\n254713,1454\n254714,179170\n254715,14797\n254716,1566\n254717,138686\n254718,175\n254719,54\n254720,179170\n254721,346\n254722,467\n254723,220816\n254724,875\n254725,247\n254726,577\n254727,2590\n254728,3260\n254729,2116\n254730,141912\n254731,900\n254732,179170\n254733,704\n254734,493\n254735,1085\n254736,250\n254736,1684\n254737,285\n254738,1\n254739,577\n254740,179170\n254741,920\n254742,217\n254743,1551\n254743,3041\n254744,4597\n254745,996\n254746,254747\n254748,13980\n254749,10\n254749,1313\n254749,28203\n254750,158\n254751,920\n254752,217\n254752,536\n254752,949\n254752,13575\n254753,144556\n254754,207\n254755,79\n254756,179170\n254757,285\n254758,179170\n254759,2266\n254760,4672\n254761,2590\n254762,1313\n254763,54\n254764,994\n254765,179170\n254766,179170\n254767,179170\n254768,179170\n254769,179170\n254770,240\n254771,179170\n254772,30\n254773,179170\n254774,872\n254775,1429\n254776,1773\n254777,200\n254778,668\n254779,30\n254780,491\n254781,179170\n254782,220816\n254783,269\n254784,220816\n254785,179170\n254786,220816\n254787,83\n254788,179170\n254789,220816\n254790,151\n254791,220816\n254792,707\n254793,220816\n254794,704\n254795,79\n254796,346\n254797,220816\n254798,220816\n254799,179170\n254800,179170\n254801,2073\n254802,220816\n254803,207\n254804,1381\n254806,220816\n254807,818\n254808,1571\n254809,220816\n254811,1143\n254812,220816\n254813,366\n254814,366\n254815,366\n254816,366\n254817,366\n254818,366\n254819,220816\n254820,6556\n254821,994\n254823,346\n254824,179170\n254825,220816\n254826,187176\n254827,179170\n254828,220816\n254829,1860\n254830,179170\n254831,220816\n254832,852\n254833,30\n254834,937\n254835,220816\n254837,1132\n254838,1608\n254839,192\n254840,220816\n254841,220816\n254843,35486\n254844,30\n254845,179170\n254846,289\n254846,94134\n254847,5405\n254848,46\n254852,302\n254853,1722\n254854,1130\n254857,252\n254858,304\n254859,304\n254860,644\n254861,1722\n254863,1556\n254864,3623\n254865,344\n254866,285\n254867,862\n254868,1515\n254869,2260\n254870,240174\n254872,179170\n254873,58\n254874,994\n254875,46\n254876,10\n254877,58\n254878,994\n254879,46\n254880,697\n254880,1893\n254881,179170\n254882,433\n254883,422\n254884,56\n254885,577\n254886,146\n254886,92476\n254887,647\n254888,344\n254889,1566\n254890,424\n254891,104\n254892,222\n254894,240\n254895,1807\n254895,191355\n254896,301\n254896,444\n254896,567\n254896,615\n254896,968\n254896,1124\n254896,1231\n254896,1949\n254896,3422\n254896,3630\n254896,5662\n254897,162599\n254898,920\n254899,595\n254900,163\n254901,30\n254902,1019\n254903,1359\n254904,179170\n254905,151\n254907,179170\n254908,657\n254909,447\n254910,2775\n254911,302\n254912,179170\n254913,179170\n254914,1082\n254915,146\n254915,92476\n254916,344\n254917,328\n254918,171\n254919,3769\n254920,1551\n254921,147\n254921,158\n254921,2244\n254921,259829\n254922,72\n254923,252\n254923,1220\n254924,330\n254925,893\n254926,994\n254927,58\n254928,46\n254931,222\n254932,104\n254934,328\n254935,1608\n254936,1132\n254937,171\n254938,146\n254938,92476\n254939,3094\n254940,1608\n254941,1132\n254942,309\n254942,310\n254943,35486\n254945,1608\n254946,1132\n254947,3321\n254948,1663\n254949,809\n254950,1608\n254951,1132\n254952,1359\n254953,1707\n254954,1132\n254955,1608\n254956,312\n254957,1227\n254957,86416\n254958,366\n254959,1608\n254960,1132\n254961,366\n254964,4823\n254965,1659\n254966,4597\n254967,1284\n254968,422\n254969,1608\n254970,1132\n254971,422\n254972,1608\n254973,1132\n254974,1001\n254975,2224\n254976,1860\n254977,1858\n254978,1052\n254979,422\n254980,422\n254981,302\n254982,422\n254983,422\n254984,422\n254985,422\n254986,422\n254987,217\n254988,422\n254989,784\n254991,356\n254992,720\n254995,1608\n254996,1132\n254997,56\n254998,422\n254999,1224\n255000,200\n255001,749\n255002,138686\n255003,175\n255004,255005\n255007,1608\n255008,1132\n255009,1227\n255009,86416\n255010,932\n255011,1860\n255012,1858\n255013,693\n255014,1631\n255015,255016\n255017,1608\n255018,1132\n255019,1132\n255020,1608\n255021,37\n255021,1370\n255022,8798\n255023,136072\n255024,657\n255025,1860\n255026,1858\n255027,3804\n255028,215\n255028,176782\n255029,83\n255030,10\n255031,527\n255032,360\n255033,1467\n255034,640\n255035,86\n255037,1132\n255038,1608\n255039,1132\n255040,1608\n255041,179170\n255042,356\n255043,1707\n255044,3115\n255046,406\n255046,620\n255046,102560\n255047,2334\n255048,302\n255049,1132\n255050,1608\n255051,516\n255052,1151\n255053,4597\n255054,1608\n255055,1132\n255056,356\n255057,30\n255058,3447\n255060,30\n255061,3161\n255062,1220\n255063,79\n255068,784\n255069,1400\n255070,2750\n255071,994\n255072,19010\n255073,1707\n255074,151\n255075,30\n255076,1132\n255077,1608\n255078,179170\n255080,972\n255081,968\n255082,79\n255083,2944\n255084,302\n255086,5961\n255087,179170\n255088,491\n255089,1181\n255090,602\n255091,1860\n255092,310\n255093,1858\n255094,1167\n255095,1132\n255096,30\n255097,21442\n255098,1722\n255099,215\n255101,6556\n255102,2590\n255103,107\n255104,30\n255106,515\n255107,536\n255108,255109\n255110,255111\n255112,1571\n255114,30\n255115,30\n255116,269\n255117,2784\n255118,58\n255119,1881\n255120,1052\n255121,2775\n255122,54\n255123,5405\n255124,179170\n255125,1181\n255126,911\n255127,30\n255128,2073\n255131,3623\n255132,179170\n255133,1579\n255134,179170\n255136,103860\n255137,73570\n255138,138686\n255139,175\n255140,179170\n255141,179170\n255142,422\n255143,779\n255144,2006\n255145,3623\n255146,117163\n255147,795\n255148,3804\n255149,14797\n255150,63\n255151,2006\n255152,3193\n255153,525\n255154,518\n255155,1001\n255156,1220\n255157,252\n255158,251\n255159,1707\n255160,247\n255161,515\n255162,1590\n255163,752\n255164,557\n255165,3507\n255166,841\n255167,115659\n255168,309\n255168,310\n255169,209\n255170,225\n255171,893\n255172,2266\n255173,932\n255174,7092\n255175,589\n255176,1160\n255177,1644\n255178,3602\n255179,220816\n255180,1564\n255181,1212\n255182,30\n255183,1544\n255184,147\n255185,2146\n255186,1983\n255188,147\n255189,302\n255190,1181\n255191,217\n255192,302\n255193,1220\n255194,1844\n255195,151\n255196,861\n255197,483\n255198,536\n255199,130\n255200,622\n255201,118336\n255202,3623\n255203,932\n255204,179170\n255205,563\n255206,3623\n255207,422\n255208,1556\n255209,217\n255210,467\n255211,192\n255212,1265\n255212,1266\n255213,227\n255214,718\n255215,255216\n255217,3367\n255218,861\n255219,718\n255220,192\n255221,179170\n255222,179170\n255223,479\n255224,30\n255225,179170\n255227,8270\n255228,179170\n255229,179170\n255230,207\n255231,222\n255231,455\n255232,433\n255233,344\n255234,1566\n255235,1522\n255236,179170\n255237,1058\n255238,142433\n255240,66297\n255241,179170\n255244,206\n255245,179170\n255246,179170\n255247,431\n255247,631\n255248,179170\n255250,83\n255250,217\n255250,278\n255250,536\n255250,1467\n255251,1113\n255252,247\n255253,247\n255254,140\n255255,1939\n255256,1313\n255257,146\n255257,92476\n255258,344\n255259,647\n255260,35486\n255261,7092\n255262,2923\n255263,137\n255264,30\n255264,1179\n255265,240174\n255266,2373\n255267,220816\n255268,2674\n255268,5871\n255269,615\n255270,278\n255271,4220\n255272,1181\n255273,503\n255274,220816\n255275,278\n255276,920\n255277,220816\n255278,6424\n255279,467\n255280,220816\n255281,358\n255282,179170\n255283,179170\n255284,220816\n255285,312\n255286,589\n255287,1132\n255288,1608\n255289,2744\n255290,179170\n255291,435\n255292,255293\n255294,302\n255295,179170\n255296,393\n255297,220816\n255298,179170\n255300,220816\n255301,35687\n255302,220816\n255303,1326\n255304,102\n255305,1323\n255306,408\n255307,2828\n255308,56\n255309,422\n255310,1564\n255311,843\n255312,309\n255312,310\n255313,179170\n255314,30\n255315,220816\n255316,2209\n255317,949\n255318,338\n255319,1298\n255320,1298\n255321,179170\n255322,179170\n255323,179170\n255324,179170\n255325,34\n255325,35\n255325,313\n255325,2784\n255325,14126\n255326,1289\n255327,220816\n255328,1238\n255329,220816\n255331,141912\n255332,220816\n255333,2944\n255334,1608\n255335,1132\n255336,30\n255336,1181\n255337,918\n255338,301\n255338,372\n255338,801\n255338,968\n255338,1140\n255338,1241\n255338,1309\n255338,1837\n255338,1893\n255338,1955\n255338,2083\n255339,1452\n255340,302\n255341,220816\n255342,179170\n255343,220816\n255344,30\n255345,417\n255346,220816\n255347,893\n255348,22580\n255349,220816\n255350,736\n255351,220816\n255352,2116\n255353,1634\n255354,220816\n255355,252\n255356,3367\n255356,44725\n255357,220816\n255358,390\n255359,2416\n255359,2417\n255360,138686\n255361,175\n255362,893\n255363,850\n255364,220816\n255365,893\n255366,30\n255367,220816\n255368,3422\n255369,3295\n255370,220816\n255371,3296\n255372,8854\n255373,147\n255374,255\n255375,30\n255376,2590\n255377,220816\n255378,34\n255378,35\n255378,536\n255378,949\n255378,1240\n255378,1274\n255378,1635\n255378,2266\n255378,7092\n255379,626\n255379,1419\n255379,3474\n255380,220816\n255381,220816\n255382,83\n255383,30\n255384,220816\n255385,158\n255386,563\n255387,313\n255388,158\n255388,240\n255389,1363\n255390,220816\n255391,146\n255391,92476\n255392,647\n255393,344\n255394,220816\n255395,1\n255396,167\n255397,30\n255398,217\n255398,1417\n255399,3623\n255400,68069\n255401,1773\n255402,8270\n255403,1773\n255404,30\n255405,285\n255406,179170\n255407,1220\n255408,422\n255409,56\n255410,179170\n255411,1821\n255411,21736\n255412,179170\n255413,1773\n255414,3\n255415,48\n255415,649\n255416,4597\n255417,424\n255418,30\n255419,1844\n255420,142870\n255421,292\n255421,525\n255422,366\n255423,54\n255424,366\n255425,3804\n255426,366\n255427,77\n255428,30\n255429,4597\n255430,264\n255431,1227\n255431,86416\n255432,179170\n255433,1467\n255434,1241\n255436,589\n255437,3138\n255438,179170\n255439,388\n255440,7572\n255441,2424\n255442,1\n255443,1181\n255444,1893\n255445,179170\n255446,424\n255447,255448\n255450,9029\n255451,50\n255451,147\n255451,202\n255451,622\n255453,1127\n255453,1893\n255453,5192\n255454,770\n255455,850\n255456,148742\n255457,779\n255458,366\n255459,200\n255460,781\n255461,1132\n255462,13980\n255463,255464\n255465,366\n255466,138686\n255467,175\n255468,527\n255470,1616\n255472,1773\n255473,163\n255474,179170\n255475,75912\n255476,827\n255477,636\n255478,1608\n255479,1132\n255480,714\n255481,255\n255482,893\n255484,779\n255484,141912\n255485,2006\n255486,433\n255487,1415\n255488,4218\n255489,134\n255490,640\n255491,779\n255491,1515\n255492,640\n255493,433\n255494,467\n255494,1345\n255495,493\n255495,1266\n255496,104\n255496,3555\n255496,127158\n255498,10\n255498,589\n255500,46\n255503,328\n255504,30\n255505,1033\n255506,1860\n255507,1858\n255509,1267\n255510,467\n255511,77\n255512,571\n255514,592\n255516,1326\n255517,518\n255518,3\n255519,233\n255520,4146\n255521,3804\n255522,1715\n255523,795\n255524,775\n255525,3094\n255526,179170\n255527,393\n255528,1544\n255529,1707\n255530,349\n255531,1294\n255532,141912\n255533,17346\n255535,852\n255536,589\n255537,920\n255541,589\n255544,934\n255545,707\n255546,35486\n255547,1983\n255548,1188\n255550,5310\n255551,179170\n255552,1608\n255553,1132\n255554,171\n255555,818\n255556,859\n255557,1860\n255558,1858\n255559,4611\n255560,179170\n255561,1860\n255562,1858\n255563,30\n255566,56\n255567,1368\n255568,422\n255569,138686\n255570,175\n255571,151\n255572,567\n255573,22\n255574,19010\n255575,577\n255576,202\n255577,289\n255577,94134\n255578,217\n255579,392\n255580,147\n255580,192\n255580,195\n255580,307\n255580,406\n255580,779\n255581,1274\n255582,8714\n255583,71\n255584,3623\n255585,356\n255586,3623\n255587,3094\n255588,1227\n255588,86416\n255589,179170\n255590,35486\n255591,3422\n255592,644\n255593,2784\n255594,3623\n255595,1707\n255596,1860\n255597,1858\n255599,56\n255600,422\n255601,264\n255602,1238\n255603,178\n255603,346\n255603,435\n255603,439\n255603,1033\n255603,1789\n255604,781\n255605,1132\n255606,22293\n255607,1\n255608,1082\n255609,422\n255610,1452\n255612,73570\n255614,1631\n255615,422\n255616,422\n255617,422\n255618,422\n255619,422\n255620,422\n255621,422\n255622,422\n255623,455\n255624,422\n255625,422\n255626,422\n255627,657\n255628,932\n255630,920\n255631,615\n255632,56\n255633,422\n255634,255635\n255636,4597\n255637,240174\n255638,27356\n255639,142870\n255640,1659\n255640,4039\n255641,217\n255642,15119\n255643,3623\n255644,83\n255645,392\n255647,772\n255648,3623\n255649,162599\n255650,83\n255651,301\n255652,358\n255653,1133\n255654,1133\n255655,5405\n255656,158\n255656,2244\n255657,459\n255658,485\n255659,314\n255659,1001\n255660,5405\n255661,240\n255662,20\n255663,841\n255664,586\n255665,1265\n255665,1266\n255667,255668\n255669,1368\n255671,1368\n255673,31073\n255674,1132\n255675,781\n255677,95554\n255678,117163\n255679,2006\n255680,518\n255681,1955\n255682,2083\n255683,417\n255684,1564\n255685,8798\n255686,6068\n255687,7572\n255688,589\n255689,714\n255691,3260\n255692,2168\n255693,272\n255694,403\n255694,634\n255695,1238\n255696,920\n255697,37\n255698,13\n255699,255700\n255701,920\n255702,6303\n255703,1014\n255704,5034\n255705,356\n255706,146\n255706,92476\n255707,344\n255708,647\n255709,920\n255710,118336\n255712,1749\n255713,22\n255714,779\n255715,255716\n255717,493\n255718,389\n255719,6119\n255720,179170\n255721,779\n255723,779\n255723,1515\n255724,179170\n255725,805\n255726,158\n255726,1181\n255727,920\n255732,1805\n255733,227\n255734,55849\n255735,1368\n255736,503\n255737,142870\n255738,55849\n255739,83\n255740,2274\n255741,2979\n255742,2006\n255743,4771\n255744,255745\n255746,289\n255746,94134\n255747,1522\n255747,2557\n255748,1127\n255749,255750\n255750,255750\n255751,302\n255752,5405\n255753,515\n255754,195\n255755,1240\n255756,557\n255757,142870\n255759,48505\n255762,217\n255762,19443\n255764,215276\n255765,255\n255767,32\n255768,251\n255769,60576\n255770,483\n255771,2626\n255772,247\n255773,4903\n255774,818\n255775,34\n255775,35\n255775,313\n255775,442\n255775,518\n255775,749\n255775,775\n255775,2209\n255775,2646\n255775,3804\n255776,577\n255777,7358\n255777,7363\n255778,1368\n255779,1132\n255780,1608\n255781,302\n255782,1085\n255783,60576\n255784,2224\n255785,30\n255786,240174\n255787,272\n255788,30\n255789,179170\n255790,652\n255791,893\n255792,83\n255793,179170\n255795,3260\n255796,1608\n255797,4597\n255798,852\n255799,2373\n255800,310\n255800,224488\n255801,392\n255802,1608\n255803,1132\n255804,652\n255805,968\n255806,392\n255806,433\n255807,255808\n255809,68069\n255810,1893\n255811,1368\n255812,704\n255813,179170\n255814,60576\n255815,252\n255816,1220\n255817,251\n255818,1132\n255819,1608\n255820,1\n255821,60576\n255822,138686\n255823,175\n255824,151\n255825,1608\n255826,1132\n255827,179170\n255828,140\n255829,1052\n255830,1608\n255831,1132\n255832,1220\n255833,252\n255834,251\n255835,1298\n255836,255837\n255838,192\n255839,179170\n255840,1858\n255841,1860\n255842,179170\n255843,1860\n255844,1858\n255845,1877\n255846,900\n255847,462\n255848,179170\n255849,179170\n255850,433\n255851,1212\n255852,663\n255853,2367\n255854,252\n255855,1452\n255856,467\n255857,179170\n255858,1298\n255859,255860\n255861,557\n255862,1370\n255863,1432\n255864,179170\n255865,843\n255867,577\n255868,179170\n255869,1715\n255870,1010\n255871,631\n255872,217\n255873,333\n255874,179170\n255875,255876\n255877,220816\n255878,563\n255879,158\n255880,647\n255881,146\n255881,92476\n255882,344\n255883,1118\n255884,1019\n255885,1858\n255886,1860\n255887,1465\n255888,167\n255888,73570\n255889,220816\n255890,179170\n255891,850\n255892,220816\n255893,48\n255894,30\n255895,301\n255896,251\n255896,1512\n255896,5992\n255897,247\n255898,861\n255900,920\n255901,1639\n255902,1381\n255903,2367\n255904,1227\n255904,86416\n255905,784\n255907,920\n255908,179170\n255909,704\n255910,79\n255912,557\n255913,5906\n255914,626\n255915,278\n255916,137\n255917,30\n255918,862\n255919,589\n255920,65\n255920,752\n255920,162599\n255921,1085\n255922,397\n255923,781\n255924,1132\n255926,179170\n255927,1175\n255928,302\n255929,605\n255930,211\n255931,255750\n255932,8854\n255933,589\n255934,932\n255935,1085\n255936,1326\n255937,240\n255938,390\n255940,220816\n255941,155481\n255942,179170\n255943,63\n255944,861\n255945,781\n255946,1132\n255947,1608\n255948,7092\n255949,250\n255949,1684\n255950,285\n255951,142473\n255952,652\n255953,179170\n255954,179170\n255955,179170\n255956,1052\n255957,54\n255959,2775\n255960,3623\n255961,179170\n255962,2334\n255964,278\n255965,1293\n255966,273\n255967,479\n255968,142451\n255968,255969\n255970,147\n255970,158\n255971,151\n255972,179170\n255973,255750\n255974,179170\n255975,784\n255976,158\n255976,209\n255976,252\n255976,622\n255976,1844\n255977,142430\n255978,1127\n255979,255980\n255981,255982\n255983,149\n255984,179170\n255985,1014\n255986,30\n255987,255750\n255988,1014\n255989,1014\n255990,1014\n255991,1014\n255992,1014\n255993,179170\n255994,19010\n255995,1257\n255996,269\n255997,240174\n255998,55849\n255999,1014\n256000,255\n256001,55849\n256002,30\n256003,179170\n256004,255613\n256005,255750\n256006,302\n256007,1381\n256008,1001\n256009,30\n256009,5265\n256010,1326\n256011,102\n256012,1323\n256013,408\n256014,647\n256015,146\n256015,92476\n256016,344\n256017,885\n256017,13704\n256018,2416\n256018,2417\n256019,19010\n256020,1556\n256021,179170\n256022,179170\n256023,827\n256023,92476\n256023,164572\n256024,15573\n256025,818\n256026,34\n256026,115\n256027,41\n256027,1465\n256028,920\n256029,179170\n256030,179170\n256031,79\n256032,83\n256033,779\n256034,255750\n256035,3804\n256036,220816\n256037,8854\n256038,179170\n256039,366\n256040,256041\n256042,366\n256043,1860\n256044,1858\n256045,1133\n256046,366\n256047,179170\n256048,147\n256049,179170\n256050,179170\n256051,920\n256052,3367\n256053,1860\n256054,1858\n256055,30\n256056,35486\n256057,315\n256058,1267\n256059,255613\n256060,1860\n256061,1858\n256062,179170\n256063,1118\n256063,1796\n256064,406\n256065,179170\n256066,30\n256068,72\n256069,138686\n256070,175\n256071,1858\n256072,1860\n256073,220816\n256074,30\n256075,179170\n256076,3538\n256076,7698\n256077,811\n256078,920\n256079,30\n256080,1181\n256081,422\n256082,179170\n256083,1257\n256084,179170\n256085,256085\n256086,1014\n256087,852\n256088,179170\n256089,285\n256090,805\n256090,932\n256091,704\n256092,79\n256093,704\n256094,493\n256095,79\n256096,592\n256097,585\n256098,50\n256099,586\n256100,393\n256101,179170\n256102,4192\n256102,4193\n256103,179170\n256104,217\n256105,615\n256106,589\n256106,6068\n256107,1740\n256108,323\n256109,81\n256110,479\n256111,640\n256112,285\n256113,250\n256113,1684\n256114,179170\n256115,1634\n256116,752\n256117,272\n256118,366\n256119,179170\n256120,179170\n256121,179170\n256122,179170\n256123,179170\n256124,920\n256125,589\n256126,137\n256128,30\n256129,179170\n256130,779\n256131,151\n256132,179170\n256133,179170\n256134,256135\n256136,256137\n256138,255969\n256139,4597\n256140,256141\n256142,44\n256143,179170\n256144,200\n256145,255980\n256145,256146\n256147,5265\n256148,22\n256149,179170\n256150,111\n256150,217\n256151,393\n256152,671\n256153,255982\n256154,3872\n256155,1707\n256156,256157\n256159,147\n256162,5265\n256164,1052\n256165,586\n256166,60576\n256167,48\n256168,536\n256170,801\n256171,32\n256172,3079\n256174,4218\n256176,1631\n256178,75912\n256179,1425\n256180,877\n256181,79\n256182,893\n256184,256185\n256186,256187\n256190,714\n256191,1860\n256192,1858\n256195,179170\n256196,158\n256197,707\n256198,1201\n256199,118336\n256200,1082\n256201,640\n256202,640\n256203,640\n256204,640\n256205,256206\n256207,3623\n256208,255980\n256209,861\n256210,179170\n256211,30\n256212,200\n256213,1\n256214,202\n256214,818\n256215,255969\n256215,255980\n256216,2088\n256216,6621\n256216,154690\n256218,2617\n256219,256220\n256223,1608\n256224,5961\n256225,179170\n256226,4691\n256227,563\n256227,911\n256227,991\n256227,1132\n256227,1623\n256228,2915\n256229,79\n256230,920\n256232,647\n256233,146\n256233,92476\n256234,344\n256235,3623\n256236,875\n256237,2048\n256238,344\n256239,146\n256239,92476\n256240,647\n256241,60576\n256242,179170\n256243,48505\n256244,2274\n256245,187176\n256246,179170\n256247,5301\n256248,3623\n256249,1240\n256250,911\n256251,146\n256251,92476\n256252,647\n256253,344\n256254,146\n256254,92476\n256255,994\n256255,1235\n256255,1335\n256256,647\n256257,344\n256258,3\n256259,1231\n256260,388\n256261,390\n256262,1465\n256263,1167\n256264,302\n256265,4594\n256266,2045\n256267,6955\n256268,919\n256269,2989\n256269,2991\n256270,510\n256271,37\n256272,120\n256273,9457\n256274,240\n256275,1634\n256276,2620\n256277,30428\n256278,849\n256279,3623\n256280,217\n256281,256282\n256283,35486\n256284,3094\n256285,179170\n256286,9098\n256287,515\n256288,1590\n256289,1274\n256290,7572\n256291,8798\n256292,256293\n256294,1749\n256295,13361\n256296,73570\n256297,1893\n256298,893\n256298,1659\n256299,30\n256300,83\n256301,415\n256303,1801\n256304,138686\n256305,175\n256306,179170\n256307,256308\n256309,30\n256310,179170\n256312,127158\n256313,83\n256314,179170\n256315,313\n256316,422\n256317,422\n256318,422\n256319,422\n256320,422\n256321,422\n256322,1132\n256323,781\n256324,422\n256325,422\n256326,422\n256327,217\n256328,422\n256329,422\n256330,1238\n256331,1955\n256332,256187\n256332,256600\n256333,1796\n256334,256293\n256336,1452\n256338,30\n256339,83\n256340,255969\n256341,302\n256342,7768\n256343,932\n256344,312\n256345,811\n256346,1590\n256347,77\n256348,2590\n256349,388\n256350,634\n256351,13661\n256352,972\n256352,1718\n256352,2750\n256353,83\n256354,13980\n256355,217\n256356,1858\n256357,1860\n256358,209\n256359,256360\n256361,22\n256362,4597\n256363,3135\n256364,332\n256365,1132\n256366,781\n256368,2607\n256369,592\n256370,142870\n256372,920\n256373,179170\n256374,615\n256375,22\n256376,240174\n256377,577\n256378,2991\n256379,1449\n256379,256380\n256381,255750\n256382,483\n256383,949\n256385,994\n256386,58\n256387,46\n256388,65\n256389,240\n256390,707\n256391,433\n256393,22\n256394,22\n256398,707\n256399,392\n256400,687\n256402,592\n256403,247\n256403,2867\n256403,2868\n256404,179170\n256405,147\n256405,149\n256406,302\n256407,422\n256409,1973\n256411,192\n256413,79\n256414,179170\n256415,861\n256416,142870\n256417,179170\n256418,302\n256419,392\n256420,707\n256421,60576\n256422,707\n256424,1368\n256425,1224\n256428,1509\n256430,56\n256431,422\n256432,256433\n256434,302\n256435,222\n256437,2168\n256438,22\n256439,393\n256440,179170\n256441,4611\n256443,144556\n256444,515\n256446,256447\n256448,861\n256449,149\n256450,707\n256451,179170\n256452,704\n256453,1220\n256454,251\n256455,252\n256456,1381\n256457,19986\n256458,22\n256459,15748\n256459,255716\n256460,861\n256462,30\n256463,179170\n256464,146\n256464,92476\n256465,647\n256466,344\n256467,809\n256468,30\n256469,302\n256471,289\n256471,94134\n256472,330\n256472,994\n256472,3161\n256472,4597\n256473,30\n256474,875\n256475,107\n256477,179170\n256478,1227\n256478,86416\n256479,4810\n256480,292\n256481,3260\n256482,247\n256483,179170\n256484,79\n256485,179170\n256488,1860\n256489,1858\n256490,1227\n256490,86416\n256491,255911\n256492,256493\n256494,805\n256495,1167\n256496,256497\n256498,179170\n256499,5405\n256500,179170\n256501,1227\n256502,3960\n256503,147\n256503,158\n256504,104\n256505,179170\n256506,255\n256507,875\n256508,483\n256509,30\n256510,200\n256511,1220\n256512,2646\n256513,918\n256514,151\n256515,202\n256516,179170\n256517,22\n256518,30\n256519,56\n256520,422\n256521,1849\n256522,1556\n256523,4594\n256524,68\n256525,23783\n256526,30\n256528,179170\n256529,255\n256530,179170\n256531,563\n256532,138686\n256533,175\n256534,1644\n256535,1515\n256536,1181\n256537,873\n256538,920\n256539,256540\n256541,1175\n256542,389\n256543,455\n256544,932\n256545,34\n256545,35\n256546,3999\n256547,256548\n256550,406\n256551,258\n256552,406\n256553,30\n256555,217\n256556,220816\n256557,222\n256558,1001\n256559,1335\n256560,4545\n256560,56150\n256561,1429\n256562,467\n256563,2372\n256564,392\n256565,220816\n256566,2923\n256567,389\n256568,179170\n256569,217\n256570,283\n256571,22\n256572,760\n256573,1608\n256574,1132\n256575,179170\n256576,220816\n256577,35486\n256578,30\n256580,247\n256581,862\n256582,571\n256583,717\n256584,3623\n256585,647\n256586,1619\n256587,179170\n256588,240\n256588,289\n256588,372\n256588,406\n256588,431\n256588,784\n256588,809\n256588,1085\n256588,1119\n256588,1285\n256588,1467\n256588,1871\n256588,2205\n256588,2421\n256588,2620\n256588,2671\n256588,3135\n256588,5906\n256588,8788\n256588,15609\n256588,33424\n256588,94134\n256588,245910\n256589,30\n256590,148742\n256591,247\n256592,179170\n256593,256594\n256595,179170\n256596,247\n256597,102\n256598,179170\n256599,256600\n256600,255969\n256600,256187\n256601,818\n256602,6424\n256603,192\n256604,255969\n256605,861\n256606,179170\n256607,7092\n256608,2750\n256609,179170\n256610,1927\n256611,107\n256612,83\n256613,179170\n256614,1390\n256615,179170\n256616,885\n256617,179170\n256618,255969\n256619,577\n256619,605\n256620,707\n256621,718\n256622,278\n256623,255969\n256624,30\n256626,192\n256627,30\n256628,1927\n256629,56\n256630,422\n256631,1644\n256632,588\n256632,590\n256633,56\n256634,422\n256635,179170\n256636,256206\n256637,1\n256638,22\n256639,366\n256641,30\n256643,2750\n256644,77\n256646,557\n256647,862\n256648,256649\n256650,83\n256651,256652\n256653,417\n256654,435\n256655,240\n256655,17309\n256656,255613\n256657,1298\n256658,861\n256659,4\n256660,118336\n256661,4101\n256663,30\n256664,2931\n256665,1326\n256666,102\n256667,1323\n256668,408\n256669,2373\n256670,179170\n256671,843\n256672,589\n256673,179170\n256674,1\n256675,707\n256676,422\n256677,255750\n256677,256600\n256678,1392\n256679,628\n256680,256681\n256682,1556\n256683,2367\n256684,1359\n256685,843\n256686,34\n256686,35\n256687,4455\n256688,220816\n256690,256691\n256692,2590\n256693,579\n256693,687\n256693,6303\n256694,2416\n256694,2417\n256695,1877\n256696,1608\n256697,1132\n256698,54284\n256699,147\n256700,138686\n256701,175\n256702,256703\n256704,1773\n256705,256706\n256708,10\n256709,142451\n256709,255969\n256710,17588\n256711,2735\n256712,2929\n256713,220816\n256714,920\n256715,255969\n256716,346\n256717,220816\n256718,872\n256719,220816\n256720,875\n256721,79\n256722,220816\n256723,22\n256724,220816\n256725,949\n256726,256681\n256727,220816\n256728,1345\n256729,256681\n256730,3582\n256731,256732\n256733,1\n256734,256735\n256736,247\n256737,22\n256738,256681\n256739,1860\n256740,255969\n256741,56\n256742,422\n256743,256681\n256744,240174\n256745,256681\n256746,256703\n256747,256748\n256749,1531\n256750,256681\n256751,179170\n256752,1335\n256753,179170\n256754,256681\n256755,179170\n256756,256757\n256758,256681\n256759,256681\n256760,256681\n256761,179170\n256762,256763\n256762,256765\n256764,256681\n256766,256765\n256767,256681\n256768,247\n256769,393\n256770,179170\n256771,1122\n256772,179170\n256773,256703\n256774,2915\n256775,1188\n256776,1140\n256777,5908\n256778,422\n256779,56\n256780,30\n256781,30\n256782,13345\n256782,21084\n256782,122842\n256783,113156\n256785,52270\n256786,704\n256787,493\n256788,1707\n256789,253147\n256789,256187\n256790,163\n256791,256681\n256792,256681\n256793,171\n256794,330\n256796,256681\n256797,1619\n256798,285\n256800,1860\n256801,1858\n256802,1016\n256802,1285\n256803,256681\n256804,422\n256805,1052\n256806,1572\n256807,491\n256808,366\n256809,10\n256810,256681\n256811,360\n256817,171\n256818,1858\n256819,1860\n256820,1133\n256821,1133\n256824,256825\n256826,55849\n256828,809\n256829,55849\n256830,1019\n256832,2116\n256833,209\n256835,707\n256836,256600\n256837,736\n256838,358\n256839,120\n256839,261\n256839,1466\n256839,3115\n256840,315\n256840,439\n256840,538\n256840,671\n256840,934\n256840,1033\n256840,1590\n256840,2353\n256841,55849\n256842,1644\n256843,117163\n256844,872\n256845,55849\n256846,158\n256847,809\n256848,209\n256849,55849\n256850,640\n256851,640\n256853,640\n256855,640\n256856,310\n256856,3039\n256857,256858\n256859,35486\n256860,640\n256861,356\n256862,344\n256863,285\n256864,626\n256864,2995\n256865,2944\n256866,636\n256867,1893\n256869,809\n256870,809\n256871,1644\n256872,707\n256873,13538\n256874,344\n256875,920\n256876,3999\n256877,4571\n256878,2105\n256879,83\n256880,581\n256881,256882\n256883,911\n256884,809\n256885,209\n256886,358\n256887,5310\n256888,707\n256889,707\n256890,302\n256891,30\n256892,106\n256892,1370\n256893,30\n256894,1659\n256895,138686\n256896,175\n256897,1858\n256898,1860\n256899,1531\n256900,809\n256901,356\n256902,1579\n256903,1860\n256904,1858\n256905,781\n256906,1132\n256907,167\n256908,1132\n256910,83\n256911,35486\n256913,179170\n256914,1132\n256915,83\n256916,615\n256917,255\n256918,34\n256918,35\n256919,1837\n256920,344\n256921,256922\n256923,1058\n256924,2480\n256925,557\n256926,422\n256927,422\n256928,622\n256929,422\n256930,422\n256931,422\n256932,422\n256933,422\n256934,255\n256935,422\n256936,189839\n256938,30\n256939,147\n256939,149\n256940,422\n256941,2671\n256942,1238\n256943,422\n256944,422\n256945,215874\n256946,142426\n256947,332\n256948,256949\n256950,422\n256951,56\n256952,1452\n256953,714\n256954,843\n256955,145240\n256956,435\n256957,261\n256958,843\n256962,843\n256965,682\n256965,1353\n256965,72439\n256966,843\n256967,253147\n256967,256600\n256968,843\n256969,843\n256970,217\n256971,1132\n256972,467\n256973,191860\n256974,191860\n256975,191860\n256976,191860\n256978,2135\n256979,191860\n256980,179170\n256983,191860\n256984,191860\n256985,191860\n256987,209\n256988,79\n256989,2260\n256990,3999\n256991,191860\n256992,191860\n256993,264\n256994,5405\n256995,663\n256996,743\n256997,934\n256998,151\n256999,151\n257000,257001\n257002,652\n257003,344\n257004,146\n257004,92476\n257005,647\n257006,489\n257007,248\n257008,6068\n257010,37414\n257011,1707\n257012,1132\n257013,1608\n257014,1238\n257015,5405\n257018,875\n257019,795\n257020,843\n257021,996\n257022,1132\n257023,1608\n257024,1860\n257025,5405\n257026,167\n257026,73570\n257027,1298\n257028,240174\n257029,1238\n257030,1149\n257031,83\n257032,1238\n257033,1608\n257034,5405\n257035,30\n257037,440\n257038,1132\n257039,1608\n257040,393\n257041,991\n257041,2626\n257041,3260\n257042,204124\n257043,4237\n257043,182162\n257044,158\n257045,30\n257046,450\n257047,30\n257048,30\n257049,707\n257050,5405\n257053,1220\n257054,516\n257055,252\n257057,158\n257058,5301\n257059,275\n257060,3695\n257061,2434\n257062,7572\n257063,6068\n257064,2989\n257064,2991\n257065,4678\n257066,255\n257066,164572\n257068,151\n257069,5405\n257070,179170\n257071,30\n257072,30\n257073,30\n257074,23010\n257075,30\n257076,4611\n257079,1860\n257080,1858\n257081,875\n257082,3999\n257083,8270\n257085,1509\n257086,1749\n257086,2605\n257087,163\n257088,179170\n257089,179170\n257090,179170\n257091,2460\n257092,251\n257094,781\n257095,1132\n257096,1132\n257097,781\n257098,255750\n257099,179170\n257100,179170\n257101,1151\n257102,392\n257103,775\n257106,707\n257107,647\n257108,179170\n257109,179170\n257110,515\n257111,269\n257112,30\n257113,66297\n257114,1220\n257115,516\n257116,252\n257117,138686\n257118,175\n257119,111\n257119,595\n257119,1151\n257119,1572\n257119,3538\n257120,312\n257121,4597\n257122,1220\n257123,252\n257124,516\n257125,6068\n257127,158\n257128,179170\n257129,714\n257131,302\n257132,516\n257133,252\n257134,1220\n257135,752\n257136,1133\n257138,256681\n257140,30\n257141,252\n257142,1220\n257143,516\n257144,1644\n257145,15573\n257146,907\n257147,1749\n257148,996\n257149,671\n257150,433\n257151,450\n257152,309\n257152,310\n257153,158\n257154,515\n257155,360\n257156,473\n257157,452\n257158,1247\n257158,164572\n257159,184\n257160,255\n257161,97\n257163,707\n257164,60576\n257165,257166\n257167,257168\n257169,360\n257170,6323\n257170,25348\n257171,10\n257172,179170\n257173,179170\n257174,4101\n257175,516\n257176,1220\n257177,707\n257178,179170\n257179,252\n257180,1466\n257181,1860\n257182,1858\n257183,149\n257184,151\n257185,1220\n257186,516\n257187,252\n257188,932\n257189,918\n257190,179170\n257191,704\n257191,1140\n257192,907\n257193,19010\n257194,1058\n257195,704\n257196,79\n257197,314\n257197,1844\n257198,315\n257199,5405\n257201,97\n257202,447\n257203,2775\n257205,103860\n257206,872\n257207,200\n257208,4597\n257209,142870\n257210,56\n257211,422\n257212,285\n257213,179170\n257214,184\n257215,1181\n257216,35486\n257217,220816\n257218,704\n257219,138\n257220,865\n257221,557\n257222,79\n257223,137\n257224,29380\n257225,220816\n257226,525\n257227,417\n257228,145240\n257229,920\n257230,30\n257231,422\n257232,4101\n257233,184\n257234,220816\n257235,491\n257236,920\n257237,179170\n257238,136\n257238,251\n257238,252\n257238,275\n257238,388\n257238,489\n257238,516\n257238,704\n257238,733\n257238,893\n257238,1220\n257238,1243\n257238,3474\n257238,48505\n257238,189788\n257238,189794\n257238,215276\n257238,223738\n257239,220816\n257240,179170\n257241,30\n257242,179170\n257243,257244\n257244,253147\n257244,256187\n257245,179170\n257246,1707\n257247,3079\n257248,30\n257249,200\n257250,192\n257251,1313\n257252,179170\n257253,356\n257254,809\n257255,179170\n257256,120\n257257,795\n257258,7092\n257259,302\n257260,1220\n257262,861\n257263,179170\n257264,179170\n257265,1715\n257265,2620\n257265,66297\n257266,72\n257267,255750\n257268,179170\n257269,1644\n257270,626\n257271,179170\n257272,278\n257274,179170\n257276,1773\n257277,257278\n257279,2735\n257280,285\n257281,179170\n257282,6119\n257283,1326\n257284,102\n257285,1323\n257286,408\n257288,179170\n257290,557\n257291,29380\n257292,859\n257293,707\n257294,3804\n257296,557\n257297,809\n257298,202\n257299,83\n257300,1019\n257301,217\n257302,220816\n257304,1227\n257305,252\n257306,256187\n257307,278\n257308,2073\n257309,191860\n257310,5908\n257311,179170\n257312,256681\n257313,147\n257314,1167\n257315,63\n257315,202\n257315,247\n257315,349\n257315,366\n257315,516\n257315,697\n257315,1467\n257315,3804\n257316,1860\n257317,1858\n257318,1796\n257319,179170\n257320,217\n257321,366\n257322,179170\n257323,577\n257324,557\n257325,256681\n257326,707\n257327,595\n257328,179170\n257329,179170\n257330,1860\n257331,1858\n257332,257333\n257334,285\n257335,344\n257336,86\n257336,167\n257336,301\n257336,907\n257336,1284\n257336,1522\n257336,2083\n257336,2557\n257336,2979\n257337,285\n257338,779\n257339,332\n257340,220816\n257341,255613\n257342,366\n257343,179170\n257344,255\n257345,257346\n257347,1267\n257348,2373\n257350,147\n257351,138686\n257352,175\n257353,344\n257354,285\n257355,154408\n257356,707\n257357,30\n257358,1608\n257359,704\n257360,1227\n257361,707\n257362,30\n257363,920\n257364,1293\n257365,1262\n257366,104\n257367,491\n257368,151\n257369,1515\n257370,1531\n257371,818\n257372,256681\n257373,953\n257374,256600\n257375,256681\n257376,269\n257379,344\n257380,146\n257380,92476\n257381,647\n257382,366\n257383,483\n257384,422\n257385,422\n257386,422\n257387,422\n257388,422\n257389,422\n257390,422\n257391,422\n257392,1\n257393,257394\n257395,255750\n257396,56\n257397,422\n257398,179170\n257399,589\n257399,862\n257399,2590\n257400,179170\n257401,285\n257402,30\n257403,1284\n257403,148742\n257404,225\n257405,255750\n257406,30\n257407,9560\n257408,30\n257409,784\n257410,1001\n257411,8884\n257412,269\n257413,257414\n257415,1085\n257416,1160\n257417,56\n257418,422\n257419,298\n257420,81\n257421,10\n257422,30\n257423,179170\n257424,179170\n257425,179170\n257426,151\n257427,1571\n257428,707\n257429,257430\n257431,179170\n257432,257433\n257434,257433\n257435,491\n257436,875\n257437,875\n257438,346\n257439,406\n257440,509\n257441,15119\n257442,393\n257443,289\n257443,417\n257443,94134\n257444,301\n257445,1085\n257446,309\n257446,310\n257447,179170\n257449,179170\n257450,707\n257452,707\n257453,707\n257454,707\n257455,707\n257456,1014\n257457,1014\n257458,1014\n257459,1014\n257460,707\n257461,1014\n257462,1014\n257463,30\n257464,1014\n257465,2590\n257466,30\n257467,1803\n257468,2411\n257469,3297\n257470,35486\n257472,1359\n257475,273\n257476,467\n257477,932\n257478,1332\n257479,707\n257480,2750\n257481,1014\n257482,805\n257483,252\n257484,83\n257485,1359\n257487,707\n257488,30\n257489,1858\n257490,1860\n257491,707\n257492,707\n257493,918\n257494,257495\n257496,1511\n257496,3069\n257497,202\n257498,2989\n257498,2991\n257499,707\n257500,707\n257501,226825\n257502,1531\n257503,586\n257505,54\n257506,652\n257507,1227\n257508,57802\n257509,1381\n257510,56\n257511,422\n257512,932\n257513,72764\n257514,422\n257515,56\n257516,54\n257517,179170\n257518,1381\n257519,647\n257520,142451\n257520,255969\n257523,366\n257524,932\n257525,21442\n257526,818\n257527,818\n257528,818\n257529,55849\n257530,30\n257531,202\n257532,255750\n257533,179170\n257534,483\n257536,2312\n257537,2048\n257538,44\n257539,55849\n257541,56\n257542,422\n257543,142870\n257544,697\n257545,3960\n257546,179170\n257547,818\n257548,138686\n257549,175\n257550,184925\n257551,115659\n257552,55849\n257553,360\n257554,1326\n257555,102\n257556,1323\n257557,408\n257558,1359\n257559,1479\n257560,390\n257561,743\n257562,5908\n257563,220816\n257564,220816\n257565,257566\n257568,220816\n257569,220816\n257570,220816\n257571,220816\n257572,707\n257573,220816\n257574,179170\n257575,220816\n257576,220816\n257577,1769\n257578,220816\n257579,195\n257580,151\n257580,206\n257581,220816\n257582,220816\n257583,707\n257584,220816\n257585,179170\n257586,220816\n257587,220816\n257588,256187\n257589,1724\n257590,220816\n257591,220816\n257592,220816\n257593,220816\n257594,220816\n257595,220816\n257596,220816\n257597,707\n257598,5405\n257600,1860\n257601,255750\n257602,1181\n257603,1181\n257604,220816\n257605,179170\n257606,179170\n257607,818\n257607,2443\n257607,2931\n257608,285\n257609,285\n257610,4260\n257611,20\n257612,589\n257613,257614\n257615,592\n257616,850\n257617,704\n257618,257619\n257620,3148\n257620,6323\n257621,255911\n257622,179170\n257623,179170\n257624,872\n257625,366\n257626,366\n257627,1227\n257628,179170\n257629,179170\n257630,2372\n257631,1001\n257631,1085\n257631,6068\n257632,179170\n257633,179170\n257634,179170\n257635,179170\n257636,104\n257637,179170\n257638,1181\n257639,179170\n257640,107\n257641,2416\n257641,2417\n257642,292\n257643,338\n257644,298\n257645,1133\n257646,3538\n257647,167\n257647,1231\n257648,707\n257649,202\n257650,707\n257651,5908\n257652,257653\n257654,707\n257655,4597\n257656,707\n257657,707\n257658,255716\n257660,179170\n257661,9457\n257662,120\n257663,422\n257664,56\n257665,179170\n257666,392\n257667,491\n257668,7652\n257669,452\n257669,4193\n257669,25348\n257670,1414\n257671,707\n257672,2496\n257673,403\n257674,707\n257675,707\n257676,35486\n257677,707\n257678,179170\n257679,707\n257680,3258\n257681,467\n257682,932\n257683,707\n257684,707\n257685,707\n257686,2944\n257687,707\n257688,1326\n257689,179170\n257691,257692\n257694,257695\n257696,1891\n257696,4810\n257697,257698\n257699,257700\n257702,34\n257702,35\n257703,179170\n257705,30\n257706,7124\n257707,179170\n257708,179170\n257709,179170\n257710,309\n257710,310\n257712,1132\n257713,697\n257714,275\n257715,115\n257716,602\n257717,7363\n257718,364\n257718,72439\n257719,3872\n257720,179170\n257722,99\n257723,226825\n257724,2617\n257725,179170\n257726,663\n257727,8854\n257729,1\n257730,54\n257731,179170\n257732,581\n257733,54\n257734,179170\n257735,179170\n257736,3804\n257737,707\n257738,24505\n257739,707\n257740,179170\n257741,707\n257742,932\n257743,707\n257744,5101\n257746,195\n257747,179170\n257748,257749\n257750,167\n257751,200\n257752,433\n257753,81\n257754,179170\n257755,257756\n257757,138686\n257758,175\n257759,2607\n257760,779\n257761,55849\n257762,158\n257762,779\n257762,8907\n257763,1544\n257764,714\n257765,171\n257766,483\n257767,81\n257767,215\n257767,1016\n257767,1212\n257767,1257\n257767,1282\n257767,9001\n257768,1298\n257769,1707\n257770,137\n257771,257771\n257772,48505\n257773,156379\n257774,433\n257775,179170\n257776,55849\n257777,2373\n257779,257780\n257781,596\n257783,256187\n257786,1773\n257788,707\n257789,557\n257790,557\n257791,707\n257792,338\n257793,707\n257794,178\n257795,23783\n257796,5440\n257797,63\n257797,489\n257797,1623\n257798,200\n257799,192\n257799,602\n257800,179170\n257801,760\n257802,1133\n257804,707\n257805,179170\n257806,179170\n257807,106\n257807,615\n257807,1082\n257807,1240\n257808,269\n257809,1773\n257810,42220\n257811,255750\n257812,179170\n257814,142870\n257815,707\n257816,707\n257817,255750\n257818,179170\n257820,422\n257821,422\n257822,310\n257823,257824\n257823,264695\n257825,707\n257826,422\n257827,422\n257828,422\n257829,422\n257830,422\n257831,422\n257832,422\n257833,422\n257834,422\n257835,707\n257836,422\n257837,56\n257838,147\n257839,1860\n257840,79\n257841,422\n257842,56\n257843,5405\n257845,285\n257846,2506\n257847,213089\n257848,872\n257849,872\n257850,179170\n257851,179170\n257853,269\n257855,1462\n257855,3209\n257856,219\n257857,7117\n257858,850\n257859,179170\n257860,45960\n257861,104\n257862,240\n257863,255982\n257864,7155\n257865,257866\n257867,178\n257868,179170\n257869,179170\n257870,179170\n257871,137\n257872,41\n257873,179170\n257874,1019\n257874,1467\n257874,2421\n257875,179170\n257876,58\n257877,65\n257878,707\n257879,179170\n257880,292\n257881,294\n257882,179170\n257883,1181\n257884,296\n257885,298\n257886,142473\n257888,1773\n257889,202\n257890,784\n257891,323\n257892,707\n257893,2146\n257894,4691\n257895,147\n257896,179170\n257897,179170\n257898,424\n257899,704\n257900,493\n257901,585\n257902,586\n257903,79\n257904,393\n257905,50\n257906,406\n257907,592\n257908,30\n257909,30\n257911,34\n257911,35\n257912,422\n257914,392\n257915,19010\n257916,137\n257917,589\n257918,760\n257919,6068\n257920,4771\n257921,104\n257922,518\n257923,850\n257924,1001\n257925,1882\n257926,328\n257927,1722\n257928,14797\n257929,1939\n257930,1893\n257931,111\n257932,1140\n257933,1745\n257934,2701\n257935,215\n257936,9001\n257937,592\n257938,72\n257939,1052\n257940,81\n257941,248\n257942,225\n257943,233\n257944,3474\n257945,557\n257946,503\n257947,3507\n257948,7270\n257949,3\n257950,1715\n257951,801\n257952,1282\n257953,63\n257954,136\n257955,9029\n257956,2443\n257957,227\n257958,1332\n257959,3804\n257960,5405\n257961,104\n257962,417\n257963,7572\n257964,8798\n257965,257966\n257968,1749\n257970,788\n257971,3297\n257972,206\n257973,179170\n257974,273\n257975,1677\n257976,707\n257978,707\n257979,1043\n257980,179170\n257981,577\n257982,1572\n257983,151\n257984,179170\n257985,179170\n257986,493\n257988,366\n257989,760\n257990,652\n257991,178\n257992,344\n257993,179170\n257994,536\n257994,1240\n257994,23287\n257994,102560\n257994,127158\n257994,207045\n257995,171\n257997,1381\n257998,179170\n257999,119\n258000,433\n258002,171\n258003,298\n258004,1452\n258005,652\n258006,285\n258007,1381\n258008,1359\n258009,366\n258010,779\n258011,302\n258012,366\n258013,1452\n258014,366\n258015,366\n258016,467\n258017,505\n258017,1837\n258018,366\n258019,366\n258020,211\n258021,1821\n258021,21736\n258022,184\n258023,79\n258025,636\n258026,1381\n258027,35486\n258028,302\n258031,640\n258032,640\n258033,167\n258034,640\n258035,640\n258036,1860\n258037,1858\n258038,136072\n258039,255750\n258040,444\n258040,972\n258040,3392\n258043,2617\n258044,493\n258045,240\n258045,818\n258046,818\n258047,920\n258048,83\n258049,163\n258049,467\n258049,1566\n258051,1860\n258052,1858\n258053,222\n258053,1019\n258056,1116\n258057,707\n258058,1858\n258059,1860\n258060,258061\n258062,652\n258063,63\n258064,217\n258066,707\n258067,15119\n258068,217\n258069,1033\n258070,147\n258070,158\n258071,3260\n258072,920\n258073,102\n258074,1238\n258075,1860\n258076,1858\n258077,104\n258078,171\n258079,1452\n258080,255\n258081,1522\n258082,652\n258083,151\n258084,32\n258085,433\n258086,422\n258087,1858\n258088,1860\n258090,760\n258092,385\n258093,968\n258094,433\n258095,299\n258096,818\n258098,1400\n258099,217\n258100,50\n258100,1181\n258101,647\n258102,457\n258103,516\n258104,1130\n258105,1381\n258106,35486\n258109,516\n258110,707\n258111,516\n258112,222\n258113,850\n258114,255750\n258114,255911\n258114,256146\n258114,256157\n258115,147\n258115,149\n258115,21442\n258116,292\n258118,2191\n258119,872\n258120,149\n258121,932\n258122,2191\n258123,1927\n258124,3538\n258125,383\n258126,1016\n258127,2006\n258128,707\n258129,918\n258129,1151\n258130,462\n258131,255980\n258132,292\n258134,83\n258136,30\n258138,1544\n258139,5405\n258140,179170\n258141,4039\n258142,868\n258143,707\n258144,6303\n258145,58\n258145,2045\n258146,3218\n258147,202\n258148,215\n258149,2620\n258150,781\n258151,1132\n258152,1132\n258153,781\n258154,872\n258155,17772\n258156,907\n258157,1188\n258158,1634\n258159,781\n258160,1132\n258161,6880\n258162,1118\n258163,1392\n258164,1579\n258166,83\n258167,671\n258168,200\n258169,171\n258170,467\n258171,148742\n258172,2775\n258173,447\n258175,222\n258176,459\n258177,805\n258178,1452\n258180,287\n258181,147\n258182,577\n258183,184\n258184,2775\n258185,333\n258188,718\n258189,781\n258190,1132\n258191,1381\n258192,3630\n258193,179170\n258194,1893\n258194,2617\n258195,649\n258196,356\n258197,30\n258198,179170\n258199,920\n258200,138686\n258201,175\n258202,217\n258203,30\n258204,13\n258204,1381\n258205,302\n258206,21442\n258208,7416\n258209,1619\n258210,328\n258211,1240\n258212,2205\n258212,33424\n258212,245910\n258213,493\n258214,390\n258216,6119\n258217,273\n258218,83\n258219,1192\n258220,1274\n258221,663\n258222,32751\n258223,1818\n258224,142405\n258225,30\n258226,360\n258227,55849\n258228,30\n258230,4865\n258230,4866\n258231,868\n258232,179170\n258233,483\n258234,2989\n258234,2991\n258235,13538\n258236,283\n258237,784\n258238,346\n258239,2779\n258240,779\n258241,346\n258242,269\n258242,1033\n258243,4810\n258244,258245\n258246,431\n258247,459\n258248,1167\n258249,406\n258250,147\n258250,467\n258250,1776\n258251,179170\n258252,328\n258253,2017\n258253,17309\n258254,5405\n258256,83\n258257,256681\n258259,247\n258260,55849\n258261,360\n258262,406\n258263,232766\n258265,628\n258266,1167\n258267,611\n258268,258269\n258270,1559\n258272,85\n258273,515\n258274,868\n258275,3367\n258276,315\n258277,406\n258278,346\n258279,163\n258279,302\n258282,868\n258283,302\n258285,1132\n258286,781\n258287,2797\n258288,141912\n258289,2646\n258290,918\n258291,149\n258292,1068\n258293,861\n258294,149\n258295,1313\n258296,406\n258297,258298\n258299,258300\n258302,242826\n258303,1381\n258305,56\n258306,422\n258307,1224\n258308,179170\n258310,333\n258311,1849\n258312,749\n258313,467\n258314,805\n258316,752\n258317,147\n258317,158\n258318,273\n258320,48\n258321,346\n258322,389\n258324,356\n258326,58\n258327,439\n258328,557\n258329,302\n258330,1955\n258331,563\n258332,781\n258333,1132\n258334,1844\n258334,2073\n258335,30\n258336,13546\n258337,1572\n258338,58\n258339,994\n258340,46\n258341,167\n258343,58\n258344,46\n258345,994\n258346,392\n258347,1415\n258348,247\n258349,179170\n258350,138686\n258351,868\n258352,175\n258353,1556\n258354,968\n258355,571\n258356,30\n258359,179170\n258360,1181\n258362,255613\n258363,918\n258364,932\n258365,151\n258366,366\n258367,248\n258368,301\n258369,2373\n258370,179170\n258371,1181\n258372,657\n258373,73570\n258374,83\n258376,1381\n258377,536\n258378,1479\n258379,1707\n258380,2048\n258381,3218\n258384,435\n258386,435\n258387,179170\n258389,949\n258390,1881\n258391,1052\n258391,1659\n258392,30\n258393,1181\n258394,422\n258394,5405\n258395,256681\n258396,179170\n258397,179170\n258398,2646\n258399,140171\n258400,1118\n258401,179170\n258402,179170\n258403,22\n258404,240\n258405,536\n258406,258407\n258409,179170\n258410,179170\n258411,192\n258411,602\n258412,920\n258413,258414\n258415,179170\n258416,859\n258417,179170\n258418,34\n258418,35\n258418,2646\n258419,1227\n258420,31977\n258421,439\n258422,972\n258423,256187\n258424,267\n258425,179170\n258426,1860\n258427,1515\n258428,1572\n258429,179170\n258430,2646\n258431,784\n258432,247\n258433,179170\n258434,1133\n258435,302\n258436,875\n258437,269\n258438,861\n258439,220816\n258441,247\n258442,256681\n258443,271\n258444,278\n258445,142870\n258446,220816\n258447,1893\n258448,179170\n258449,217\n258450,220816\n258451,875\n258452,704\n258453,779\n258454,79\n258455,179170\n258456,1016\n258457,536\n258458,220816\n258460,179170\n258461,220816\n258462,1983\n258463,972\n258464,467\n258465,179170\n258466,920\n258467,220816\n258468,7092\n258470,1188\n258471,20\n258471,68\n258471,134\n258471,163\n258471,326\n258471,397\n258471,581\n258471,663\n258471,673\n258471,697\n258471,713\n258471,841\n258471,852\n258471,1096\n258471,1474\n258471,1531\n258471,1603\n258471,1634\n258471,1796\n258471,1891\n258471,3582\n258471,3999\n258471,4276\n258471,4455\n258471,20535\n258471,255911\n258472,220816\n258473,30\n258474,142433\n258475,220816\n258476,256681\n258477,707\n258478,278\n258479,1133\n258480,68\n258481,138686\n258482,949\n258483,179170\n258484,707\n258485,408\n258486,102\n258487,1323\n258488,707\n258489,2590\n258489,3999\n258489,5469\n258490,417\n258491,2480\n258491,2557\n258492,179170\n258493,220816\n258494,563\n258495,83\n258496,179170\n258497,179170\n258498,192\n258499,217\n258500,220816\n258501,258502\n258503,30\n258504,220816\n258505,220816\n258506,179170\n258507,179170\n258508,3623\n258509,179170\n258510,220816\n258511,1238\n258512,1326\n258513,179170\n258514,179170\n258515,30\n258516,217\n258517,850\n258518,179170\n258520,255750\n258521,1370\n258522,220816\n258523,220816\n258524,586\n258525,255\n258526,220816\n258528,707\n258529,355\n258530,596\n258531,1001\n258532,179170\n258533,220816\n258534,5961\n258535,220816\n258536,1113\n258537,138686\n258538,175\n258539,707\n258540,55849\n258541,8992\n258542,1579\n258543,179170\n258544,4237\n258544,182162\n258545,220816\n258546,707\n258547,707\n258548,179170\n258549,2416\n258549,2417\n258551,220816\n258552,707\n258553,422\n258554,179170\n258555,240174\n258556,7\n258557,220816\n258558,220816\n258559,83\n258560,1\n258561,217\n258562,30\n258563,147\n258564,222\n258565,850\n258566,5366\n258568,220816\n258569,179170\n258570,179170\n258571,3623\n258572,220816\n258573,1010\n258574,795\n258575,269\n258576,563\n258577,258578\n258579,220816\n258580,220816\n258581,1359\n258582,920\n258583,179170\n258584,220816\n258585,220816\n258586,571\n258586,31896\n258587,907\n258588,255911\n258589,20257\n258590,1955\n258591,920\n258592,151\n258593,9457\n258594,3623\n258595,3623\n258596,663\n258597,1274\n258598,422\n258599,422\n258600,422\n258601,422\n258602,422\n258603,422\n258604,422\n258605,422\n258606,422\n258607,422\n258608,422\n258609,422\n258611,717\n258612,285\n258613,35486\n258614,68069\n258615,8907\n258616,258617\n258618,1769\n258619,1893\n258620,5405\n258621,195\n258622,4672\n258623,843\n258624,920\n258625,577\n258625,859\n258626,269\n258628,60576\n258629,779\n258630,2266\n258632,30\n258633,1531\n258634,1531\n258635,8993\n258636,258637\n258638,255980\n258638,258906\n258639,248\n258640,872\n258640,1118\n258640,1796\n258640,3111\n258641,240\n258642,1462\n258642,8537\n258643,503\n258644,1001\n258645,4355\n258646,111\n258647,1085\n258648,137\n258649,589\n258650,2205\n258650,33424\n258650,245910\n258651,843\n258652,240\n258653,1227\n258653,86416\n258654,1818\n258656,589\n258657,1132\n258658,179170\n258659,256681\n258660,179170\n258661,256681\n258662,536\n258663,872\n258664,179170\n258665,219\n258667,4223\n258668,2617\n258669,256681\n258670,179170\n258671,932\n258672,704\n258673,255750\n258674,256681\n258675,79\n258676,467\n258677,805\n258678,256681\n258679,275\n258679,516\n258680,261\n258681,179170\n258682,1707\n258683,6059\n258684,256681\n258685,390\n258685,1801\n258686,366\n258687,366\n258688,366\n258689,366\n258690,366\n258691,750\n258692,255613\n258693,160\n258694,179170\n258695,6119\n258696,137\n258697,589\n258698,1511\n258698,3069\n258699,258631\n258699,258700\n258701,707\n258702,2979\n258703,179170\n258704,56\n258705,422\n258706,707\n258708,179170\n258711,1313\n258712,179170\n258713,179170\n258714,179170\n258715,707\n258716,634\n258718,258719\n258721,707\n258722,5405\n258724,217\n258724,571\n258725,179170\n258726,179170\n258727,5405\n258728,392\n258729,707\n258730,3582\n258731,1860\n258732,1858\n258733,30\n258734,1149\n258735,1313\n258736,781\n258737,1132\n258739,1192\n258740,640\n258741,875\n258742,1085\n258744,996\n258747,1132\n258748,781\n258749,1955\n258751,631\n258753,707\n258754,179170\n258755,147\n258756,252\n258757,346\n258758,872\n258759,255982\n258760,1707\n258761,356\n258762,1551\n258763,1425\n258764,3695\n258765,467\n258766,4771\n258767,1240\n258767,4594\n258768,2779\n258769,179170\n258770,142409\n258771,22\n258772,861\n258773,258774\n258775,920\n258776,1644\n258777,149\n258779,1119\n258780,257244\n258781,37414\n258782,702\n258783,106\n258784,206\n258785,50\n258786,79\n258787,707\n258788,195\n258789,424\n258790,424\n258792,178\n258793,104\n258794,2784\n258795,707\n258796,149\n258797,147\n258799,424\n258800,60576\n258802,1707\n258803,187176\n258804,3094\n258805,356\n258806,187176\n258809,147\n258810,200\n258811,3623\n258812,875\n258813,491\n258814,149\n258814,21442\n258815,83\n258816,7092\n258817,707\n258818,3623\n258819,781\n258820,1132\n258821,138686\n258822,175\n258823,83\n258824,158\n258825,589\n258826,37414\n258827,83\n258828,202\n258829,1368\n258830,3623\n258831,35486\n258832,258833\n258834,7360\n258835,611\n258835,1718\n258836,875\n258837,707\n258838,4597\n258839,467\n258839,156379\n258840,118336\n258841,257244\n258842,256703\n258843,1227\n258844,818\n258845,640\n258846,772\n258847,1458\n258848,255980\n258849,217\n258850,634\n258851,31122\n258852,2775\n258853,1052\n258854,54\n258855,294\n258856,707\n258857,2411\n258858,1284\n258860,30\n258861,346\n258863,83\n258864,932\n258865,657\n258866,328\n258867,1052\n258868,54\n258869,2775\n258870,179170\n258871,202\n258872,299\n258873,1285\n258873,2590\n258874,1801\n258875,442\n258876,1085\n258879,214734\n258881,424\n258882,1608\n258883,1132\n258884,1132\n258885,1608\n258887,41\n258887,431\n258887,677\n258887,784\n258887,849\n258887,2620\n258887,6800\n258887,185877\n258887,259036\n258887,259078\n258887,259097\n258887,259115\n258887,259460\n258887,259681\n258887,260110\n258887,260152\n258887,260810\n258887,261308\n258887,261675\n258887,261842\n258887,261924\n258887,262440\n258887,262637\n258887,264821\n258888,2266\n258889,390\n258889,459\n258889,1326\n258889,3756\n258890,1345\n258891,1801\n258892,861\n258893,22\n258895,1551\n258896,309\n258896,310\n258897,577\n258898,1955\n258899,1201\n258900,3507\n258901,97\n258902,118336\n258903,1007\n258904,2083\n258905,21442\n258907,195\n258908,406\n258909,1052\n258910,54\n258911,2775\n258912,644\n258913,366\n258914,107\n258915,202\n258916,346\n258917,73570\n258919,6955\n258920,1227\n258921,1368\n258922,668\n258924,2744\n258925,760\n258926,258927\n258928,1132\n258929,781\n258930,1241\n258931,255750\n258932,872\n258933,1132\n258934,781\n258935,1608\n258936,1132\n258937,577\n258938,1619\n258939,240\n258939,332\n258940,2083\n258941,1379\n258943,932\n258944,160\n258945,2116\n258946,149\n258947,406\n258948,1313\n258949,107\n258950,34\n258950,605\n258950,33424\n258950,245910\n258951,302\n258952,1284\n258952,1298\n258953,6506\n258954,179170\n258955,1860\n258956,1858\n258957,781\n258958,1132\n258959,1612\n258960,1419\n258961,818\n258963,2209\n258964,2646\n258965,818\n258966,1608\n258967,1132\n258968,7124\n258969,258970\n258971,2989\n258971,2991\n258972,861\n258974,536\n258975,256681\n258976,663\n258977,312\n258978,1458\n258979,3258\n258980,3623\n258981,1143\n258982,1608\n258983,1132\n258984,707\n258985,136\n258986,179170\n258987,200\n258988,503\n258989,184\n258990,256681\n258991,1801\n258992,1707\n258993,1381\n258994,1133\n258995,920\n258996,861\n258997,22\n258998,1749\n258999,302\n259000,1882\n259001,278\n259002,893\n259003,752\n259004,3623\n259006,1858\n259007,1860\n259008,589\n259009,515\n259010,256681\n259011,1888\n259012,509\n259013,1132\n259014,781\n259015,1616\n259016,256681\n259017,707\n259018,1381\n259019,141263\n259021,256681\n259023,781\n259024,1132\n259025,483\n259026,256681\n259027,1313\n259028,577\n259029,5405\n259030,255750\n259031,1127\n259032,333\n259033,707\n259034,179170\n259035,1087\n259037,200\n259038,563\n259039,217\n259040,179170\n259041,8788\n259042,305\n259043,179170\n259044,2073\n259045,1707\n259046,273\n259047,138686\n259048,175\n259049,1452\n259050,1052\n259051,83\n259051,577\n259051,1085\n259052,346\n259053,2750\n259054,422\n259055,220816\n259056,1381\n259058,151\n259059,634\n259060,155481\n259061,918\n259063,406\n259064,107\n259065,220816\n259066,302\n259067,406\n259068,649\n259069,1007\n259070,292\n259071,220816\n259072,259073\n259074,247\n259074,2867\n259074,2868\n259075,179170\n259077,5405\n259079,1033\n259080,179170\n259081,179170\n259082,3846\n259083,1001\n259084,1274\n259085,1132\n259086,1608\n259087,4691\n259088,179170\n259089,192\n259090,13661\n259092,1381\n259093,179170\n259095,393\n259096,3623\n259097,258887\n259098,2224\n259099,1285\n259100,255613\n259101,179170\n259102,920\n259103,707\n259104,247\n259105,252\n259106,179170\n259107,707\n259108,83\n259109,932\n259110,222\n259111,1313\n259112,256681\n259113,255911\n259114,278\n259115,258887\n259116,1010\n259117,3623\n259118,256703\n259119,3623\n259120,1715\n259121,256681\n259122,151\n259123,4545\n259123,56150\n259124,302\n259125,106\n259126,278\n259127,220816\n259129,247\n259130,4545\n259130,56150\n259131,220816\n259132,255750\n259133,287\n259134,256681\n259135,7092\n259136,1644\n259137,861\n259138,22\n259139,563\n259140,256681\n259141,220816\n259142,628\n259143,179170\n259144,83\n259144,278\n259144,949\n259144,1274\n259144,2779\n259145,220816\n259146,485\n259147,220816\n259148,207\n259149,23783\n259150,1556\n259151,278\n259152,220816\n259153,920\n259154,220816\n259155,1572\n259156,142870\n259157,356\n259158,346\n259159,811\n259160,3507\n259161,278\n259162,220816\n259163,179170\n259164,83\n259165,83\n259166,841\n259167,991\n259168,220816\n259169,1515\n259170,294\n259171,79\n259173,3623\n259174,220816\n259175,175\n259176,1305\n259177,179170\n259178,285\n259179,220816\n259180,272\n259181,68509\n259182,179170\n259183,302\n259184,184\n259185,2620\n259186,259187\n259188,1707\n259189,1452\n259190,1803\n259191,107\n259192,875\n259193,255750\n259194,256681\n259195,6682\n259196,179170\n259197,347\n259198,256681\n259199,304\n259200,5265\n259201,179170\n259202,875\n259203,220816\n259204,1608\n259205,1132\n259206,1\n259207,256681\n259208,1188\n259209,220816\n259210,861\n259211,34\n259211,35\n259212,932\n259213,38634\n259214,259215\n259217,259218\n259219,220816\n259220,326\n259221,256681\n259222,1511\n259222,3069\n259223,179170\n259224,179170\n259225,1688\n259226,1014\n259227,56\n259228,422\n259229,707\n259230,1014\n259231,220816\n259232,179170\n259233,1014\n259234,1014\n259235,885\n259236,1014\n259237,875\n259238,220816\n259239,179170\n259240,192\n259240,920\n259240,1118\n259241,30\n259242,179170\n259243,44\n259244,1082\n259245,220816\n259246,102\n259247,1326\n259248,1323\n259249,408\n259250,467\n259251,104\n259252,55849\n259253,1181\n259254,147\n259255,349\n259255,536\n259255,2424\n259256,220816\n259257,5265\n259259,259260\n259261,179170\n259262,187176\n259263,220816\n259264,35486\n259265,179170\n259266,707\n259267,1238\n259268,179170\n259269,179170\n259270,202\n259271,179170\n259272,255\n259273,15609\n259274,220816\n259275,179170\n259276,54\n259277,1634\n259278,1452\n259279,41\n259280,138\n259281,25453\n259281,258298\n259282,2671\n259283,3135\n259284,138686\n259285,175\n259286,577\n259287,875\n259288,19010\n259289,259290\n259291,255876\n259292,256681\n259293,124668\n259294,83\n259295,2373\n259297,256681\n259298,1749\n259299,220816\n259300,256681\n259301,54\n259302,21442\n259303,259304\n259306,256681\n259307,147\n259308,433\n259309,980\n259310,179170\n259311,2421\n259312,949\n259313,23783\n259314,8373\n259315,671\n259315,4193\n259316,2371\n259316,2991\n259317,1515\n259318,1776\n259319,2266\n259319,2991\n259320,2371\n259321,1893\n259321,191860\n259322,312\n259323,2923\n259324,1\n259325,179170\n259326,220816\n259327,920\n259328,179170\n259329,256681\n259330,330\n259331,256681\n259332,1608\n259333,179170\n259334,589\n259335,493\n259336,179170\n259337,704\n259338,1363\n259339,259340\n259341,179170\n259342,179170\n259343,1335\n259344,256681\n259345,2620\n259346,3538\n259347,54\n259348,151\n259349,256681\n259350,179170\n259351,256681\n259352,250\n259352,1684\n259353,202\n259354,285\n259355,256681\n259356,256681\n259357,83\n259358,167\n259359,285\n259360,250\n259361,602\n259362,29475\n259363,424\n259364,818\n259365,841\n259366,900\n259367,179170\n259368,843\n259369,256681\n259370,779\n259371,269\n259372,179170\n259373,310\n259373,224488\n259375,179170\n259376,256681\n259377,179170\n259378,171\n259379,179170\n259380,179170\n259381,1531\n259382,1871\n259383,259384\n259385,259386\n259387,285\n259388,862\n259388,2590\n259389,179170\n259390,179170\n259391,779\n259392,259393\n259394,2750\n259395,2867\n259395,2868\n259396,54\n259397,88820\n259398,557\n259399,50\n259399,79\n259400,179170\n259401,7698\n259402,56\n259403,422\n259404,433\n259405,259406\n259405,265181\n259407,1631\n259408,179170\n259409,179170\n259410,875\n259411,2205\n259411,33424\n259411,245910\n259412,179170\n259413,393\n259414,1707\n259416,188791\n259417,258887\n259418,366\n259419,1\n259420,366\n259421,1773\n259422,1132\n259423,781\n259424,259425\n259427,516\n259428,179170\n259429,151\n259430,256681\n259431,104\n259434,875\n259435,483\n259436,1052\n259437,54\n259438,2775\n259439,151\n259439,206\n259441,179170\n259442,1821\n259442,21736\n259443,2775\n259444,1052\n259445,54\n259446,595\n259447,781\n259448,1132\n259449,1551\n259450,781\n259451,1052\n259452,1132\n259453,54\n259454,2775\n259455,240174\n259456,136\n259459,149\n259461,1452\n259462,577\n259463,992\n259464,5405\n259465,22\n259466,861\n259467,18298\n259468,247\n259469,996\n259470,278\n259474,5405\n259476,1274\n259477,259187\n259479,211\n259479,304\n259479,1181\n259479,1844\n259479,41396\n259479,48119\n259479,71770\n259479,241749\n259479,259479\n259479,260286\n259480,259481\n259482,1188\n259483,5405\n259484,1014\n259485,256681\n259486,289\n259486,94134\n259487,1014\n259488,1014\n259489,843\n259490,1014\n259491,22\n259492,861\n259493,256681\n259494,151\n259495,1014\n259497,55849\n259498,1608\n259499,1132\n259500,256681\n259502,920\n259504,195\n259506,1012\n259508,30\n259511,2105\n259512,1130\n259513,505\n259515,328\n259516,328\n259517,55849\n259518,76096\n259519,2048\n259520,179170\n259521,134\n259521,1639\n259522,138686\n259523,175\n259524,1837\n259525,2646\n259526,248\n259527,179170\n259528,227669\n259528,258973\n259529,309\n259529,310\n259531,55849\n259532,264\n259533,179170\n259534,1782\n259535,207837\n259536,146\n259536,92476\n259537,1147\n259538,647\n259539,344\n259540,1132\n259542,1274\n259543,1132\n259544,5405\n259545,186\n259545,294\n259545,431\n259545,634\n259545,784\n259546,447\n259547,2775\n259548,3252\n259549,3094\n259550,251\n259550,252\n259550,1220\n259551,1238\n259552,195\n259555,634\n259556,1608\n259557,1132\n259558,1452\n259559,35486\n259562,5405\n259563,588\n259563,590\n259565,3585\n259566,2797\n259567,179170\n259568,142870\n259569,31073\n259570,195\n259571,259572\n259573,1821\n259573,21736\n259574,1188\n259575,256681\n259576,636\n259577,30\n259578,1888\n259579,873\n259580,536\n259581,843\n259582,30\n259583,76096\n259584,83\n259585,422\n259586,422\n259587,422\n259588,422\n259589,422\n259590,217\n259591,422\n259592,269\n259593,422\n259594,422\n259595,422\n259596,422\n259597,1293\n259598,422\n259599,422\n259600,932\n259601,2775\n259602,21442\n259603,30\n259604,195\n259605,179170\n259606,310\n259606,224488\n259608,111142\n259609,872\n259610,278\n259611,515\n259612,5987\n259613,1265\n259613,1266\n259614,149\n259615,179170\n259616,302\n259617,920\n259619,843\n259620,779\n259622,309\n259622,310\n259623,1511\n259623,3069\n259624,1240\n259625,179170\n259626,1707\n259627,5440\n259628,589\n259628,3370\n259629,364\n259629,25348\n259629,72439\n259630,707\n259631,1368\n259632,30\n259633,83\n259634,1149\n259635,30\n259636,6068\n259637,1181\n259639,34\n259639,35\n259639,217\n259639,536\n259641,30\n259643,2557\n259644,30\n259645,1983\n259647,302\n259648,1454\n259649,179170\n259651,179170\n259652,30\n259653,86\n259654,283\n259655,73570\n259656,1688\n259657,1390\n259658,3297\n259659,142409\n259661,406\n259662,861\n259663,222\n259663,283\n259663,356\n259663,455\n259663,536\n259663,852\n259663,1467\n259663,1881\n259663,2266\n259664,179170\n259665,1608\n259666,1132\n259667,4597\n259668,179170\n259669,707\n259670,1370\n259670,21736\n259671,189788\n259672,179170\n259673,462\n259675,30\n259676,240174\n259677,75912\n259678,1220\n259679,252\n259680,251\n259681,258887\n259682,144556\n259683,4611\n259684,1452\n259685,1836\n259686,118336\n259687,30\n259688,1849\n259689,5540\n259690,179170\n259691,30\n259692,1724\n259693,1132\n259694,310\n259694,3039\n259695,707\n259696,179170\n259698,515\n259699,259700\n259701,179170\n259702,30\n259703,379\n259704,30\n259705,872\n259706,83\n259707,256681\n259708,557\n259710,707\n259711,875\n259712,256681\n259713,179170\n259714,195\n259715,309\n259717,195\n259718,707\n259721,55849\n259723,1010\n259724,256600\n259725,30\n259726,1789\n259727,1359\n259728,256681\n259729,2646\n259730,3623\n259731,875\n259733,7124\n259734,283\n259735,872\n259736,138686\n259737,97\n259738,175\n259739,247\n259740,563\n259741,30\n259742,247\n259743,1010\n259744,1\n259744,147\n259744,202\n259744,285\n259744,622\n259744,1559\n259744,118336\n259745,180470\n259746,217\n259747,707\n259748,1452\n259749,1619\n259750,256600\n259751,1467\n259752,455\n259753,2424\n259754,1556\n259755,1871\n259756,256600\n259757,2421\n259758,13980\n259759,83\n259760,1707\n259761,1085\n259762,563\n259763,389\n259764,255\n259765,77\n259766,151\n259767,4260\n259768,247\n259768,141912\n259769,83\n259770,1881\n259771,92133\n259773,1644\n259775,23783\n259776,2572\n259777,885\n259778,885\n259779,1143\n259780,259781\n259782,179170\n259783,932\n259784,2620\n259785,704\n259786,79\n259787,256681\n259788,97\n259789,55849\n259790,256681\n259791,217\n259793,2646\n259794,491\n259795,68\n259796,2373\n259797,257700\n259798,259799\n259800,4066\n259801,563\n259802,247\n259803,179170\n259804,4810\n259805,202\n259806,83\n259807,439\n259808,22\n259809,861\n259811,920\n259812,433\n259813,5213\n259814,8788\n259815,192\n259816,220816\n259817,179170\n259818,44\n259819,920\n259820,2646\n259821,1881\n259822,1860\n259823,1858\n259824,220816\n259825,4260\n259826,602\n259827,433\n259828,220816\n259829,147\n259829,175\n259829,9394\n259829,240174\n259829,261886\n259830,220816\n259831,4545\n259831,56150\n259832,220816\n259833,1572\n259834,220816\n259835,113156\n259836,2646\n259837,220816\n259838,220816\n259839,256681\n259840,220816\n259841,634\n259841,4237\n259841,182162\n259842,269\n259843,32751\n259844,179170\n259845,113156\n259846,690\n259847,2590\n259848,893\n259849,147\n259850,220816\n259851,483\n259852,113156\n259853,256681\n259854,179170\n259855,151\n259856,900\n259857,259858\n259859,220816\n259860,256681\n259861,138686\n259862,175\n259863,220816\n259864,107\n259865,179170\n259866,179170\n259867,5906\n259868,557\n259869,626\n259870,278\n259871,137\n259872,30\n259873,862\n259874,179170\n259875,220816\n259876,433\n259877,15\n259878,111142\n259879,220816\n259880,2617\n259881,1\n259882,83\n259883,1531\n259884,79\n259885,56\n259886,422\n259887,220816\n259888,256681\n259889,248\n259890,220816\n259891,220816\n259892,220816\n259893,1556\n259894,285\n259895,227669\n259896,256681\n259898,200\n259899,3623\n259900,2646\n259901,220816\n259902,250\n259905,81\n259905,1392\n259907,257244\n259908,35486\n259911,30\n259912,1467\n259913,3695\n259913,9021\n259913,35750\n259914,1849\n259915,919\n259916,220816\n259917,179170\n259918,843\n259919,137\n259920,1274\n259922,7092\n259923,2735\n259924,2590\n259925,179170\n259927,220816\n259928,644\n259929,644\n259930,179170\n259931,56\n259932,422\n259933,214734\n259934,406\n259935,920\n259936,56\n259937,422\n259938,56\n259939,422\n259940,220816\n259941,1531\n259942,56\n259943,422\n259945,1132\n259946,781\n259947,179170\n259948,775\n259949,258298\n259950,179170\n259951,1368\n259952,187\n259953,1368\n259954,19356\n259955,907\n259956,1227\n259957,1227\n259958,179170\n259959,278\n259960,259961\n259962,920\n259963,875\n259964,179170\n259965,1849\n259966,259967\n259968,147\n259969,843\n259971,1188\n259972,843\n259973,30\n259974,1749\n259975,220816\n259976,589\n259976,3370\n259977,372\n259977,25348\n259978,3872\n259979,179170\n259980,179170\n259981,255\n259982,1167\n259983,1785\n259984,589\n259985,1782\n259986,1124\n259987,973\n259988,86\n259989,138686\n259990,175\n259991,843\n259992,179170\n259993,3161\n259995,278\n259996,920\n259997,1449\n259998,557\n259999,1359\n260001,467\n260002,179170\n260003,252\n260003,925\n260003,1220\n260003,25453\n260003,255750\n260004,179170\n260005,493\n260006,206\n260007,179170\n260008,704\n260009,1452\n260010,493\n260011,346\n260012,220816\n260013,4611\n260014,220816\n260015,1769\n260016,73570\n260017,222\n260018,147\n260019,589\n260020,843\n260021,422\n260022,422\n260023,422\n260024,422\n260025,422\n260026,1\n260027,422\n260028,422\n260029,422\n260030,422\n260031,256681\n260031,260032\n260031,260039\n260033,422\n260034,422\n260035,422\n260036,256703\n260037,285\n260038,60576\n260040,2931\n260041,30\n260042,6119\n260044,149\n260045,346\n260046,179170\n260047,920\n260048,179170\n260049,179170\n260050,30\n260051,179170\n260052,206\n260053,285\n260054,850\n260055,920\n260056,179170\n260057,671\n260058,187\n260059,206\n260060,304\n260061,862\n260062,2797\n260063,255716\n260064,393\n260065,179170\n260066,1132\n260067,138686\n260068,175\n260069,292\n260070,1893\n260070,191860\n260071,1267\n260072,1522\n260073,256681\n260074,1860\n260075,1858\n260076,256681\n260077,260078\n260079,256681\n260080,179170\n260081,179170\n260082,256600\n260083,179170\n260084,179170\n260085,256681\n260086,1556\n260087,260088\n260089,433\n260091,366\n260092,366\n260093,179170\n260094,1882\n260095,366\n260096,60576\n260097,1274\n260098,256681\n260099,433\n260100,589\n260101,137\n260103,179170\n260104,1210\n260105,2646\n260106,260107\n260108,256681\n260109,779\n260110,258887\n260111,430\n260111,1414\n260112,581\n260113,459\n260114,557\n260115,256681\n260116,187176\n260119,171\n260122,875\n260123,20\n260124,256681\n260125,1893\n260126,215874\n260127,287\n260129,256681\n260130,640\n260131,151\n260132,171\n260133,1132\n260134,1608\n260135,283\n260135,657\n260135,2266\n260136,56\n260137,422\n260138,2590\n260139,179170\n260140,433\n260141,256681\n260142,1849\n260146,309\n260146,310\n260147,2506\n260149,1118\n260150,968\n260154,920\n260156,726\n260157,104\n260158,148742\n260159,138686\n260160,175\n260161,1132\n260162,781\n260163,611\n260164,2105\n260165,179170\n260166,113156\n260167,781\n260168,1132\n260169,312\n260170,657\n260171,2989\n260171,2991\n260172,994\n260173,58\n260174,46\n260175,2296\n260176,1803\n260177,671\n260178,366\n260179,779\n260180,875\n260181,60576\n260182,1436\n260184,258414\n260185,19413\n260186,30\n260187,6424\n260188,104\n260189,2646\n260190,1274\n260191,258887\n260192,59021\n260193,893\n260194,1132\n260195,179170\n260196,595\n260197,1860\n260198,1858\n260199,2590\n260200,255613\n260201,142405\n260201,154408\n260202,1210\n260203,256681\n260204,1309\n260205,1238\n260206,366\n260207,3623\n260208,2646\n260209,595\n260210,1287\n260211,7652\n260212,10\n260212,255980\n260213,118336\n260214,1452\n260215,707\n260216,1359\n260217,35486\n260218,779\n260219,37414\n260221,37414\n260222,1983\n260223,83\n260224,1033\n260225,1149\n260226,1983\n260227,760\n260228,1860\n260229,577\n260230,147\n260230,149\n260231,179170\n260232,932\n260233,779\n260235,142433\n260236,102\n260237,252\n260238,620\n260239,248556\n260240,58\n260241,994\n260242,46\n260243,1452\n260244,447\n260245,707\n260247,195\n260248,406\n260249,260250\n260252,269\n260253,4\n260253,644\n260253,731\n260253,743\n260253,885\n260253,994\n260253,1116\n260253,1172\n260253,1432\n260253,1775\n260253,3079\n260253,4691\n260253,4810\n260253,4903\n260255,107\n260256,2775\n260257,934\n260258,83\n260259,217\n260260,779\n260261,1515\n260262,227669\n260263,809\n260265,707\n260266,356\n260267,536\n260268,192\n260269,1151\n260270,256187\n260271,333\n260272,140\n260273,200\n260274,30\n260275,1353\n260276,1212\n260277,30\n260278,179170\n260279,227669\n260280,1983\n260287,3653\n260288,1052\n260289,2292\n260290,6506\n260292,515\n260293,179170\n260294,1368\n260295,195\n260296,577\n260297,714\n260298,1564\n260299,1511\n260299,3069\n260300,2205\n260300,33424\n260300,245910\n260301,1522\n260302,1849\n260303,1010\n260304,1241\n260305,1479\n260306,932\n260307,1927\n260308,1122\n260309,1715\n260310,1955\n260311,2424\n260312,256681\n260313,1983\n260314,1132\n260315,781\n260316,179170\n260317,1052\n260318,54\n260319,868\n260320,227669\n260321,2784\n260322,179170\n260323,1432\n260324,30\n260326,217\n260327,1618\n260328,179170\n260329,30\n260331,2168\n260332,30\n260333,79\n260334,289\n260334,94134\n260335,389\n260338,31122\n260339,1087\n260340,2782\n260341,849\n260342,631\n260343,760\n260344,162599\n260345,1452\n260346,1326\n260347,1452\n260348,388\n260349,422\n260350,56\n260351,485\n260352,217\n260353,736\n260354,179170\n260355,138686\n260356,175\n260357,332\n260358,707\n260359,2646\n260360,3623\n260362,83\n260364,1805\n260365,202\n260366,657\n260367,278\n260367,248556\n260371,135844\n260372,34\n260372,35\n260372,37\n260372,44\n260372,50\n260372,58\n260372,59\n260372,79\n260372,104\n260372,106\n260372,111\n260372,135\n260372,147\n260372,178\n260372,195\n260372,202\n260372,264\n260372,278\n260372,289\n260372,333\n260372,337\n260372,372\n260372,393\n260372,479\n260372,516\n260372,577\n260372,585\n260372,588\n260372,590\n260372,592\n260372,620\n260372,622\n260372,640\n260372,720\n260372,779\n260372,877\n260372,907\n260372,949\n260372,1007\n260372,1033\n260372,1085\n260372,1151\n260372,1210\n260372,1212\n260372,1247\n260372,1265\n260372,1266\n260372,1284\n260372,1370\n260372,1381\n260372,1453\n260372,1454\n260372,1509\n260372,1515\n260372,1522\n260372,1531\n260372,1634\n260372,1659\n260372,1732\n260372,1776\n260372,1893\n260372,2051\n260372,2073\n260372,2087\n260372,2191\n260372,2371\n260372,2782\n260372,2931\n260372,3194\n260372,3422\n260372,3695\n260372,4079\n260372,4192\n260372,4193\n260372,5265\n260372,5310\n260372,5440\n260372,8180\n260372,8270\n260372,8308\n260372,8598\n260372,8788\n260372,8811\n260372,8822\n260372,8907\n260372,9542\n260372,31237\n260372,94134\n260372,164572\n260372,240174\n260373,346\n260373,1644\n260374,920\n260375,192\n260376,920\n260377,302\n260378,87\n260379,252\n260380,256187\n260381,255\n260382,179170\n260383,1001\n260384,571\n260386,491\n260387,83\n260388,589\n260389,1133\n260390,179170\n260391,3135\n260392,83\n260394,3538\n260395,1381\n260396,1479\n260397,358\n260398,255613\n260399,151\n260400,1556\n260401,259187\n260402,1849\n260403,83\n260404,1010\n260405,1085\n260406,390\n260407,2424\n260408,360\n260409,577\n260410,2991\n260411,1572\n260411,256187\n260412,843\n260413,202\n260414,862\n260415,440\n260416,483\n260417,920\n260418,1454\n260419,932\n260421,1085\n260422,1707\n260423,1888\n260424,3182\n260425,430\n260426,392\n260427,3246\n260429,704\n260430,79\n260431,467\n260432,302\n260433,1294\n260434,247\n260435,104\n260435,1332\n260436,135\n260437,220816\n260438,875\n260439,1133\n260440,3769\n260441,4594\n260442,220816\n260443,260444\n260445,260444\n260446,195\n260447,536\n260448,2735\n260449,1453\n260450,256765\n260451,30\n260452,143287\n260453,968\n260454,247\n260455,142870\n260457,1551\n260458,4597\n260459,179170\n260460,6424\n260461,861\n260462,240\n260463,217\n260464,1715\n260465,346\n260466,301\n260467,1769\n260468,707\n260469,163\n260469,932\n260470,707\n260471,195\n260471,306\n260471,307\n260471,406\n260471,779\n260471,1181\n260471,1515\n260471,4193\n260473,403\n260474,435\n260475,278\n260476,3467\n260477,1796\n260478,1849\n260479,7092\n260480,217\n260481,220816\n260482,260483\n260484,779\n260485,1619\n260486,1608\n260487,179170\n260488,843\n260489,220816\n260490,302\n260491,1414\n260492,918\n260493,113156\n260494,843\n260495,1326\n260496,631\n260497,2244\n260498,278\n260499,220816\n260500,1608\n260501,1132\n260502,179170\n260503,3003\n260504,1298\n260504,1749\n260505,885\n260506,31977\n260507,220816\n260508,1033\n260509,258973\n260510,247\n260511,477\n260512,220816\n260513,1556\n260514,256681\n260515,30\n260516,256681\n260517,2646\n260518,2373\n260519,220816\n260520,10\n260521,83\n260522,861\n260523,330\n260524,256681\n260525,752\n260526,155481\n260527,220816\n260528,2646\n260529,65\n260530,256681\n260531,671\n260532,179170\n260533,220816\n260534,2646\n260535,179170\n260536,1319\n260537,1149\n260538,220816\n260539,841\n260540,275\n260541,557\n260542,862\n260543,256681\n260544,220816\n260545,179170\n260546,1821\n260546,21736\n260547,141912\n260548,179170\n260549,179170\n260551,220816\n260552,714\n260554,220816\n260555,179170\n260556,628\n260556,3260\n260557,200\n260559,707\n260560,7416\n260561,557\n260562,4411\n260563,697\n260564,138686\n260565,175\n260566,179170\n260567,406\n260568,256681\n260569,107\n260570,779\n260571,2379\n260572,255\n260573,707\n260574,1227\n260575,258298\n260576,256681\n260577,255750\n260578,1415\n260579,256681\n260580,255750\n260581,779\n260582,707\n260583,1359\n260584,2646\n260585,179170\n260586,83\n260586,278\n260586,577\n260587,30\n260588,154408\n260589,536\n260590,260591\n260592,179170\n260593,147\n260594,2646\n260597,2646\n260598,1871\n260599,260600\n260601,179170\n260602,872\n260603,278\n260604,483\n260605,2646\n260606,577\n260607,138686\n260608,175\n260609,179170\n260610,592\n260611,6556\n260612,179170\n260613,1544\n260614,2572\n260615,640\n260616,252\n260617,302\n260618,2646\n260619,1871\n260620,217\n260621,147\n260621,158\n260621,1515\n260621,2244\n260622,179170\n260623,179170\n260624,30\n260625,179170\n260626,1871\n260627,179170\n260628,920\n260629,179170\n260630,1181\n260631,2750\n260632,179170\n260633,256681\n260634,240\n260635,285\n260636,2006\n260637,54\n260638,260639\n260640,99367\n260641,422\n260642,422\n260643,256681\n260644,113156\n260645,422\n260646,422\n260647,179170\n260648,179170\n260649,422\n260650,422\n260651,422\n260652,422\n260653,422\n260654,260655\n260656,592\n260657,795\n260658,179170\n260659,179170\n260660,171\n260661,250\n260662,953\n260663,285\n260664,577\n260665,179170\n260666,255911\n260667,56\n260668,422\n260669,267\n260670,285\n260671,2116\n260672,134\n260673,310\n260673,224488\n260674,14366\n260675,171\n260676,256681\n260677,179170\n260678,424\n260679,2105\n260680,179170\n260681,179170\n260682,932\n260683,179170\n260685,179170\n260686,516\n260687,256681\n260688,99\n260689,260690\n260691,256681\n260692,256681\n260693,862\n260695,256681\n260696,23011\n260697,256681\n260698,260699\n260700,99\n260701,422\n260702,256681\n260703,255\n260705,2244\n260706,179170\n260707,640\n260708,30\n260709,2590\n260710,248\n260711,1474\n260711,2590\n260712,704\n260714,179170\n260715,493\n260716,30\n260717,457\n260718,15573\n260719,5375\n260720,7363\n260721,30\n260722,179170\n260723,697\n260723,1893\n260724,972\n260726,252\n260728,1167\n260729,433\n260730,1849\n260731,707\n260732,693\n260733,15\n260734,366\n260735,366\n260736,366\n260737,366\n260738,366\n260739,366\n260740,707\n260742,9457\n260743,179170\n260744,668\n260745,1151\n260746,55849\n260747,707\n260748,872\n260749,136\n260751,1247\n260751,164572\n260752,1425\n260753,1247\n260753,164572\n260754,743\n260755,55849\n260756,4672\n260757,337\n260758,130\n260759,640\n260760,640\n260761,996\n260762,693\n260763,104\n260763,136\n260763,420\n260763,442\n260763,1179\n260764,58\n260765,994\n260766,46\n260767,1116\n260768,247\n260769,5591\n260770,415\n260771,1715\n260773,467\n260775,260591\n260776,179170\n260777,1659\n260778,707\n260779,693\n260780,179170\n260781,2671\n260782,292\n260784,56\n260785,422\n260787,932\n260789,346\n260790,1227\n260791,179170\n260792,179170\n260793,55849\n260794,920\n260795,179170\n260796,1927\n260797,493\n260798,422\n260799,56\n260800,3367\n260801,195\n260803,30\n260804,77\n260804,5440\n260805,707\n260806,162599\n260807,21442\n260808,138686\n260809,175\n260811,162599\n260812,171\n260813,872\n260814,256681\n260815,1782\n260816,1429\n260817,2646\n260818,3623\n260819,333\n260820,30\n260821,1983\n260822,707\n260823,1608\n260824,3623\n260825,2646\n260826,1238\n260827,1400\n260828,1452\n260830,73570\n260831,256681\n260832,79\n260834,1085\n260835,35486\n260836,433\n260837,3474\n260838,158\n260839,1893\n260839,191860\n260840,256681\n260841,2646\n260842,50\n260842,79\n260842,147\n260842,158\n260843,1043\n260843,1424\n260843,3367\n260844,179170\n260845,827\n260846,83\n260847,83\n260848,179170\n260849,1143\n260850,687\n260852,467\n260853,163\n260854,1663\n260858,217\n260859,2646\n260860,163\n260861,2421\n260862,163\n260863,2646\n260864,255750\n260865,1381\n260866,240174\n260867,861\n260868,22\n260869,932\n260870,4597\n260871,3538\n260872,256681\n260874,1293\n260875,344\n260876,285\n260877,7092\n260878,862\n260879,302\n260879,2979\n260879,3422\n260880,589\n260881,179170\n260882,596\n260883,179170\n260885,256681\n260887,163\n260888,1644\n260889,736\n260891,151\n260892,259\n260894,693\n260894,932\n260894,1089\n260895,217\n260895,872\n260895,1118\n260895,1796\n260896,151\n260897,1132\n260898,1608\n260899,707\n260901,596\n260902,1515\n260903,130\n260904,518\n260905,2116\n260906,104\n260907,204093\n260909,1634\n260910,256681\n260911,843\n260912,227669\n260913,2646\n260914,2646\n260915,3623\n260916,852\n260917,200\n260918,259393\n260919,258973\n260920,209\n260921,920\n260922,920\n260923,920\n260924,179170\n260926,301\n260927,119\n260928,151\n260929,73570\n260930,515\n260931,179170\n260932,252\n260933,251\n260934,968\n260935,1220\n260936,516\n260937,252\n260938,73570\n260939,192\n260940,149\n260941,179170\n260942,1167\n260943,6695\n260944,179170\n260945,189788\n260946,179170\n260947,467\n260948,255750\n260949,73570\n260950,5405\n260951,158\n260951,779\n260951,2244\n260953,707\n260954,191860\n260955,179170\n260956,215\n260957,868\n260958,138686\n260959,175\n260960,2646\n260961,3623\n260962,4545\n260962,56150\n260963,1882\n260964,217\n260964,1019\n260965,287\n260965,809\n260965,19010\n260966,4355\n260967,779\n260968,390\n260969,179170\n260970,195\n260971,179170\n260972,58\n260973,46\n260974,994\n260975,179170\n260976,2244\n260977,406\n260977,118336\n260978,179170\n260979,302\n260980,1210\n260981,1749\n260982,255750\n260984,1782\n260985,202\n260986,163\n260987,338\n260988,158\n260990,99\n260991,557\n260992,179170\n260993,1012\n260994,34\n260994,35\n260994,313\n260994,1590\n260994,1644\n260994,2274\n260995,590\n260995,1419\n260996,5405\n260997,83\n260998,179170\n260999,34\n260999,35\n260999,536\n260999,623\n260999,1467\n260999,1590\n260999,1608\n260999,1644\n260999,4637\n261000,338\n261001,447\n261002,3422\n261003,852\n261004,113156\n261005,861\n261006,736\n261007,1608\n261008,1132\n261009,2105\n261010,1644\n261011,104\n261012,179170\n261013,206\n261014,79\n261015,202\n261016,220816\n261017,258578\n261018,261019\n261020,220816\n261021,179170\n261022,151\n261023,179170\n261024,652\n261025,220816\n261026,258973\n261027,220816\n261028,50\n261029,155473\n261030,9015\n261031,138686\n261032,175\n261033,248\n261034,163\n261035,240174\n261036,220816\n261037,920\n261038,338\n261039,179170\n261040,240174\n261041,179170\n261042,1511\n261042,3069\n261043,1033\n261044,264\n261045,179170\n261046,220816\n261047,1531\n261048,77\n261049,704\n261050,220816\n261051,79\n261052,179170\n261053,179170\n261054,1474\n261055,179170\n261056,220816\n261057,388\n261058,255750\n261059,179170\n261060,707\n261061,179170\n261062,220816\n261063,14366\n261063,14989\n261064,255\n261065,41\n261065,1462\n261066,255613\n261067,1860\n261068,1858\n261069,872\n261070,220816\n261071,255\n261072,179170\n261073,920\n261074,147\n261074,158\n261075,13980\n261076,83\n261078,301\n261080,256681\n261081,1085\n261082,307\n261082,620\n261082,1181\n261083,261084\n261085,256681\n261086,338\n261087,2006\n261088,885\n261088,13704\n261089,809\n261090,254\n261091,7092\n261092,83\n261093,179170\n261094,136\n261095,217\n261096,366\n261097,1085\n261098,30\n261098,333\n261098,1181\n261100,256681\n261101,220816\n261102,2646\n261103,3623\n261104,330\n261105,179170\n261106,179170\n261107,206\n261108,278\n261109,220816\n261110,1707\n261111,179170\n261112,2373\n261113,256681\n261114,8373\n261115,207\n261116,220816\n261117,258298\n261118,179170\n261119,220816\n261120,179170\n261121,261122\n261123,220816\n261124,358\n261125,179170\n261126,333\n261126,1893\n261127,491\n261128,366\n261129,422\n261129,5405\n261130,5405\n261131,707\n261132,1289\n261133,843\n261134,261135\n261136,179170\n261137,707\n261138,366\n261139,366\n261140,366\n261141,1773\n261142,138\n261143,865\n261144,557\n261145,137\n261146,1564\n261147,557\n261148,220816\n261149,179170\n261150,179170\n261151,433\n261151,697\n261151,1363\n261151,2699\n261151,3003\n261152,332\n261153,130\n261154,179170\n261155,491\n261156,151\n261157,179170\n261158,179170\n261159,55849\n261160,1\n261161,35486\n261164,179170\n261165,104\n261165,136\n261165,557\n261165,1368\n261166,179170\n261167,525\n261168,2646\n261169,3623\n261170,1309\n261171,136\n261172,1285\n261173,631\n261174,285\n261175,107\n261175,4771\n261176,294\n261177,147\n261178,138686\n261179,175\n261180,483\n261181,577\n261182,32\n261182,77\n261182,202\n261182,261\n261182,313\n261182,323\n261182,358\n261182,392\n261182,406\n261182,455\n261182,509\n261182,536\n261182,623\n261182,859\n261182,862\n261182,873\n261182,874\n261182,919\n261182,949\n261182,1001\n261182,1201\n261182,1240\n261182,1465\n261182,1467\n261182,1572\n261182,1635\n261182,1644\n261182,1722\n261182,2045\n261182,2671\n261182,2931\n261182,2989\n261182,2991\n261182,3135\n261182,3252\n261182,4549\n261182,4594\n261182,6955\n261182,7092\n261182,8180\n261182,13546\n261182,14126\n261183,179170\n261184,707\n261185,707\n261186,179170\n261187,220816\n261188,827\n261189,30\n261190,220816\n261191,60576\n261192,60576\n261193,60576\n261194,2989\n261194,2991\n261195,179170\n261196,5908\n261197,179170\n261198,920\n261199,220816\n261200,267\n261201,4597\n261202,1379\n261203,179170\n261204,2620\n261205,179170\n261206,179170\n261207,563\n261208,1359\n261209,261210\n261211,142405\n261212,285\n261214,104\n261215,30\n261216,285\n261217,250\n261218,195\n261219,261220\n261221,269\n261222,366\n261223,366\n261224,366\n261225,225\n261226,137\n261227,3724\n261228,1151\n261229,4079\n261230,862\n261231,8884\n261232,1085\n261233,151\n261234,121967\n261235,1227\n261236,261237\n261238,179170\n261239,179170\n261240,256681\n261241,9386\n261242,346\n261243,577\n261244,179170\n261245,179170\n261246,179170\n261247,250\n261248,1181\n261249,256681\n261250,179170\n261251,261252\n261253,160\n261255,179170\n261256,179170\n261257,1796\n261258,179170\n261259,1522\n261260,1882\n261261,56\n261262,422\n261263,313\n261264,596\n261265,4355\n261266,256681\n261267,195\n261268,323\n261269,1515\n261270,261271\n261272,260591\n261273,261274\n261275,261274\n261276,261274\n261277,261274\n261278,261274\n261279,261274\n261280,261274\n261281,422\n261282,422\n261283,422\n261284,422\n261285,422\n261286,422\n261287,261274\n261288,261274\n261289,261274\n261290,261274\n261291,346\n261292,35486\n261293,4597\n261294,9343\n261296,8373\n261297,932\n261298,697\n261299,1014\n261300,5708\n261301,1014\n261302,1014\n261303,1014\n261304,269\n261305,255716\n261306,212914\n261307,211\n261308,258887\n261309,83\n261310,333\n261311,179170\n261312,1014\n261313,179170\n261314,538\n261315,1014\n261316,1014\n261318,179170\n261319,179170\n261320,151\n261321,211\n261322,491\n261323,261324\n261325,255716\n261326,1132\n261327,781\n261328,447\n261329,1033\n261330,483\n261331,1\n261332,707\n261333,596\n261334,81\n261334,704\n261335,620\n261336,850\n261337,406\n261338,179170\n261339,707\n261340,1515\n261341,779\n261342,1381\n261343,1381\n261344,333\n261345,932\n261346,1522\n261347,179170\n261348,129085\n261349,261350\n261351,1151\n261353,1893\n261354,2048\n261355,949\n261356,1608\n261357,827\n261359,1707\n261360,30\n261361,220816\n261362,4545\n261362,56150\n261363,220816\n261364,220816\n261365,2646\n261366,3623\n261367,220816\n261368,220816\n261369,179170\n261370,138686\n261371,175\n261372,2646\n261373,3623\n261374,156379\n261375,179170\n261376,743\n261377,179170\n261378,179170\n261379,179170\n261380,192\n261381,179170\n261382,1479\n261383,179170\n261384,390\n261389,142870\n261391,55849\n261392,261393\n261395,19413\n261396,1882\n261397,302\n261398,240174\n261399,124668\n261400,779\n261401,3623\n261402,1458\n261403,136\n261403,1265\n261403,1266\n261403,1381\n261403,1635\n261403,1659\n261403,2867\n261403,2868\n261403,4545\n261403,56150\n261404,72\n261405,179170\n261406,179170\n261407,179170\n261408,179170\n261409,179170\n261411,875\n261412,56\n261413,422\n261416,179170\n261417,179170\n261418,592\n261419,255750\n261420,994\n261421,1181\n261423,179170\n261424,58\n261425,179170\n261426,307\n261426,602\n261426,94134\n261427,7652\n261428,6888\n261429,1087\n261430,818\n261431,255750\n261432,493\n261433,107\n261434,2416\n261434,2417\n261435,292\n261436,338\n261437,298\n261438,1133\n261439,3538\n261440,179170\n261441,10\n261442,392\n261443,135\n261445,151\n261446,366\n261447,366\n261449,1058\n261450,261451\n261452,179170\n261453,1454\n261454,189788\n261455,577\n261456,175\n261457,1181\n261458,56\n261459,422\n261460,261461\n261462,3623\n261463,30\n261464,35486\n261465,30\n261466,1623\n261467,63\n261468,261469\n261470,30\n261471,151\n261472,5405\n261473,932\n261474,55849\n261475,6661\n261476,147\n261476,195\n261477,119\n261478,138686\n261479,175\n261480,227669\n261481,273\n261483,236180\n261485,1707\n261487,79\n261488,1\n261489,154408\n261491,264\n261492,2668\n261493,255750\n261494,261495\n261496,1019\n261497,932\n261498,278\n261498,213089\n261499,44\n261500,1293\n261501,3148\n261502,154408\n261503,1326\n261504,56\n261505,422\n261506,191860\n261507,893\n261508,138686\n261509,175\n261510,56\n261511,422\n261512,15748\n261513,344\n261514,285\n261515,242246\n261516,972\n261518,102\n261519,1326\n261520,1323\n261521,408\n261523,179170\n261524,163\n261525,124668\n261526,261527\n261528,179170\n261529,1247\n261529,164572\n261530,179170\n261531,179170\n261533,179170\n261535,179170\n261536,183456\n261537,179170\n261538,179170\n261539,124668\n261540,1181\n261541,1096\n261542,261543\n261544,285\n261545,344\n261546,344\n261547,285\n261548,178\n261549,30\n261550,2590\n261551,422\n261552,422\n261553,422\n261554,422\n261555,2646\n261556,3623\n261557,422\n261558,179170\n261559,8270\n261560,15119\n261561,718\n261562,422\n261563,422\n261564,422\n261565,422\n261566,422\n261567,718\n261568,557\n261569,557\n261570,179170\n261571,557\n261573,261574\n261575,179170\n261576,227669\n261577,261578\n261579,261580\n261581,206\n261582,255750\n261584,255\n261585,261586\n261587,2379\n261588,1007\n261589,213089\n261590,158\n261591,338\n261592,422\n261593,56\n261594,222\n261594,760\n261595,30\n261596,2646\n261597,3623\n261598,261599\n261600,358\n261601,640\n261602,261603\n261604,4691\n261605,179170\n261606,179170\n261607,483\n261608,1033\n261609,620\n261610,406\n261611,113156\n261612,356\n261613,2889\n261614,843\n261615,30\n261616,779\n261617,1515\n261618,1381\n261619,509\n261620,2379\n261621,333\n261622,142870\n261623,557\n261624,179170\n261625,240174\n261626,285\n261627,179170\n261628,99\n261629,240174\n261630,179170\n261631,179170\n261632,119\n261633,7155\n261634,179170\n261635,179170\n261636,3999\n261637,7358\n261637,7363\n261638,151\n261639,292\n261640,788\n261641,1181\n261642,294\n261643,296\n261644,298\n261645,142473\n261646,1749\n261647,640\n261648,41\n261649,1551\n261650,99\n261651,147\n261652,147\n261653,147\n261654,663\n261655,704\n261656,493\n261657,79\n261658,592\n261659,585\n261660,592\n261661,50\n261662,393\n261663,406\n261664,586\n261665,1381\n261666,151\n261667,200543\n261668,1544\n261669,3585\n261670,179170\n261671,6068\n261672,261673\n261674,1631\n261675,258887\n261676,256703\n261677,473\n261679,278\n261680,30\n261681,83\n261682,784\n261683,1522\n261685,406\n261686,258887\n261688,1381\n261690,1509\n261691,129534\n261692,346\n261695,693\n261696,577\n261697,215\n261698,35486\n261699,179170\n261700,138686\n261701,175\n261702,118336\n261703,30\n261704,4548\n261705,178\n261705,346\n261706,3623\n261707,2646\n261709,313\n261710,79\n261711,1001\n261712,255980\n261713,1836\n261714,191860\n261715,261716\n261717,50\n261718,120\n261719,202\n261720,515\n261722,278\n261722,805\n261723,1381\n261725,2646\n261726,3623\n261727,671\n261728,602\n261729,32\n261729,76096\n261730,1381\n261732,255750\n261733,1204\n261733,194645\n261735,30\n261736,56\n261737,422\n261739,258061\n261740,392\n261741,406\n261742,9457\n261743,920\n261744,682\n261744,72439\n261746,2646\n261747,3623\n261749,21442\n261751,422\n261752,1368\n261755,1400\n261757,1326\n261758,640\n261759,640\n261760,640\n261762,192\n261763,1151\n261764,278\n261764,5326\n261765,171\n261766,179170\n261767,503\n261768,336\n261769,1238\n261770,83\n261771,30\n261772,818\n261773,640\n261774,205627\n261775,156379\n261776,640\n261777,1326\n261778,1452\n261779,79\n261780,433\n261781,2646\n261782,3623\n261783,160\n261783,712\n261784,682\n261784,72439\n261785,2699\n261785,3653\n261786,5908\n261787,217\n261788,1085\n261789,2646\n261790,2480\n261791,406\n261791,1425\n261792,3422\n261793,1556\n261794,35486\n261796,1181\n261797,994\n261798,261799\n261802,179170\n261804,200\n261805,179170\n261806,1949\n261807,3260\n261808,242246\n261809,171\n261810,79\n261811,932\n261812,920\n261813,779\n261814,79\n261815,269\n261816,852\n261817,83\n261818,389\n261820,1564\n261821,212692\n261823,179170\n261825,120\n261826,1033\n261827,843\n261828,179170\n261829,179170\n261831,120\n261832,283\n261834,1429\n261835,211\n261836,187\n261836,536\n261836,1618\n261836,2224\n261836,6298\n261836,13137\n261836,19443\n261837,256681\n261838,4276\n261840,1715\n261841,620\n261843,1631\n261844,852\n261845,406\n261846,256681\n261847,366\n261847,483\n261847,509\n261847,1118\n261847,1345\n261848,179170\n261850,32\n261852,489\n261853,795\n261855,3623\n261856,2646\n261857,151\n261858,2424\n261859,48\n261860,272\n261862,1515\n261863,779\n261865,278\n261865,248556\n261866,333\n261867,671\n261868,431\n261869,433\n261870,259\n261870,676\n261871,2373\n261873,147\n261874,44\n261875,433\n261876,333\n261877,1707\n261878,406\n261879,5265\n261880,184\n261881,795\n261882,55849\n261884,99\n261885,2434\n261887,920\n261888,5405\n261890,6695\n261892,907\n261893,4146\n261895,634\n261898,338\n261899,893\n261901,5405\n261902,138\n261903,136\n261904,73570\n261906,868\n261907,144962\n261908,2617\n261909,3\n261911,5405\n261912,7416\n261913,1293\n261914,55849\n261915,811\n261916,577\n261917,328\n261918,247\n261919,10\n261920,6661\n261921,622\n261923,106\n261924,258887\n261925,808\n261925,1732\n261925,2699\n261926,179170\n261927,1\n261928,5405\n261929,483\n261930,138686\n261931,175\n261932,1579\n261933,264\n261934,338\n261935,1893\n261936,1326\n261937,1860\n261938,1858\n261939,647\n261940,146\n261940,92476\n261941,344\n261942,592\n261943,1707\n261944,1860\n261945,1858\n261946,179170\n261947,83\n261948,206\n261949,179170\n261950,179170\n261951,30\n261952,433\n261953,1243\n261954,861\n261955,515\n261956,179170\n261957,1016\n261959,657\n261960,227669\n261961,41\n261963,875\n261964,10\n261965,56\n261967,3258\n261968,56\n261969,422\n261970,149\n261971,261972\n261973,1466\n261974,158\n261977,932\n261978,577\n261979,179170\n261980,179170\n261981,285\n261982,179170\n261983,251\n261984,5405\n261985,5405\n261986,30\n261988,588\n261988,590\n261989,1\n261990,222\n261991,179170\n261992,188791\n261993,1224\n261994,151\n261996,1\n261997,179170\n261998,179170\n262000,179170\n262001,875\n262002,602\n262003,255980\n262004,640\n262005,5405\n262006,220816\n262007,862\n262008,3623\n262009,2646\n262011,220816\n262012,704\n262013,79\n262014,278\n262015,264\n262016,220816\n262017,1515\n262018,220816\n262020,1160\n262021,179170\n262022,220816\n262023,2373\n262024,1556\n262025,220816\n262026,2590\n262027,220816\n262028,781\n262029,1132\n262030,220816\n262031,536\n262032,30\n262033,220816\n262034,179170\n262035,179170\n262036,220816\n262037,247\n262038,179170\n262039,1220\n262040,455\n262041,30\n262042,592\n262043,818\n262044,220816\n262045,2646\n262046,3623\n262047,217\n262048,875\n262049,118336\n262051,187960\n262052,220816\n262053,2083\n262054,1858\n262055,1860\n262056,450\n262057,56\n262058,422\n262059,179170\n262060,1677\n262061,179170\n262062,220816\n262063,179170\n262064,179170\n262065,179170\n262066,1556\n262067,29380\n262068,255750\n262069,859\n262070,179170\n262071,179170\n262072,220816\n262073,220816\n262074,920\n262075,262076\n262077,179170\n262078,1177\n262079,7092\n262080,994\n262081,920\n262082,247\n262083,717\n262084,3695\n262085,220816\n262086,179170\n262087,179170\n262088,994\n262090,818\n262091,278\n262092,179170\n262093,220816\n262094,980\n262095,467\n262096,71\n262097,179170\n262098,187\n262099,220816\n262100,1326\n262101,1323\n262102,102\n262103,408\n262104,262105\n262106,83\n262107,1274\n262108,220816\n262109,179170\n262110,149\n262111,240174\n262112,257244\n262113,21442\n262114,179170\n262115,704\n262116,179170\n262117,179170\n262118,493\n262119,704\n262120,875\n262121,862\n262122,433\n262123,493\n262124,79\n262125,585\n262126,592\n262127,393\n262128,50\n262129,586\n262130,406\n262131,1014\n262132,1014\n262133,1014\n262134,1849\n262136,179170\n262137,3582\n262138,179170\n262139,1449\n262140,30\n262141,220816\n262142,516\n262143,179170\n262144,220816\n262145,994\n262146,422\n262147,1400\n262147,4805\n262148,220816\n262149,1305\n262150,179170\n262151,875\n262152,30\n262153,422\n262154,56\n262155,18726\n262156,707\n262157,1608\n262158,1132\n262159,5405\n262160,220816\n262161,30\n262162,30\n262164,255\n262165,30\n262166,262167\n262168,707\n262169,1181\n262170,83\n262172,1849\n262173,217\n262174,1836\n262175,147\n262176,211\n262177,220816\n262178,15068\n262179,220816\n262180,1531\n262181,781\n262182,1132\n262183,30\n262184,5405\n262185,30\n262186,72\n262187,220816\n262190,2620\n262191,220816\n262192,920\n262193,220816\n262194,147\n262195,30\n262196,1052\n262197,278\n262198,1773\n262199,60576\n262200,113156\n262201,6059\n262202,467\n262204,56\n262205,422\n262206,138686\n262207,175\n262208,390\n262209,1893\n262211,250\n262212,285\n262213,179170\n262214,255911\n262214,256540\n262215,179170\n262216,179170\n262218,843\n262220,71\n262221,56\n262222,422\n262223,1140\n262224,3474\n262225,49057\n262226,2051\n262227,1579\n262228,292\n262229,1849\n262230,95554\n262231,340\n262232,516\n262233,55849\n262234,360\n262235,920\n262236,3804\n262237,920\n262238,1556\n262239,406\n262240,4220\n262241,262242\n262243,2266\n262244,841\n262245,668\n262246,2367\n262248,30\n262249,106\n262250,200\n262251,68\n262251,2590\n262252,179170\n262253,493\n262254,262255\n262256,4101\n262257,424\n262258,147\n262259,991\n262260,1\n262261,455\n262262,1181\n262263,30\n262264,151\n262265,179170\n262266,261750\n262268,392\n262269,179170\n262270,262271\n262272,285\n262273,262274\n262275,179170\n262276,346\n262277,35486\n262278,262279\n262278,262962\n262280,841\n262281,167\n262281,299\n262281,1319\n262281,1544\n262281,6712\n262281,14615\n262281,170984\n262281,229230\n262282,2073\n262283,4192\n262284,4193\n262285,179170\n262286,2735\n262287,179170\n262288,704\n262289,79\n262290,179170\n262291,179170\n262292,1294\n262293,255980\n262294,179170\n262295,179170\n262296,422\n262297,179170\n262298,2436\n262299,818\n262300,138686\n262301,175\n262302,257244\n262303,192\n262303,333\n262304,256681\n262306,1453\n262308,640\n262309,256681\n262310,358\n262311,79\n262313,73570\n262314,433\n262315,256681\n262316,366\n262317,366\n262318,366\n262319,433\n262320,433\n262321,118336\n262323,397\n262326,1252\n262327,433\n262329,1381\n262330,393\n262331,2292\n262332,3003\n262333,1544\n262334,225\n262335,79\n262336,262337\n262340,1801\n262341,20\n262343,256681\n262344,2116\n262347,1085\n262348,1130\n262350,1143\n262352,2073\n262353,5405\n262354,256681\n262355,356\n262357,202\n262358,640\n262359,640\n262360,2671\n262361,640\n262362,147\n262363,640\n262364,640\n262365,135\n262366,431\n262370,1707\n262372,3\n262374,920\n262376,843\n262377,206\n262378,571\n262379,1551\n262380,79\n262381,1949\n262382,206\n262383,1659\n262385,1400\n262386,206\n262387,356\n262388,3623\n262389,2646\n262390,138686\n262391,175\n262392,1531\n262394,422\n262395,422\n262396,422\n262397,493\n262398,1149\n262400,422\n262401,422\n262402,784\n262403,422\n262404,422\n262405,422\n262406,1849\n262407,422\n262408,356\n262409,422\n262410,253147\n262410,256187\n262411,422\n262413,227669\n262414,149\n262415,634\n262416,158\n262417,850\n262418,206\n262419,6661\n262421,5405\n262422,1188\n262423,179170\n262424,920\n262425,717\n262426,287\n262427,344\n262428,252\n262429,1220\n262430,516\n262431,1181\n262432,356\n262433,1033\n262434,704\n262435,843\n262436,5405\n262437,455\n262439,162599\n262441,1132\n262442,1608\n262443,3653\n262444,1608\n262445,1132\n262446,4039\n262447,106\n262448,1635\n262449,2646\n262450,1\n262450,1888\n262452,589\n262453,893\n262454,893\n262456,1326\n262458,1927\n262459,1220\n262460,252\n262461,516\n262462,217\n262463,1274\n262464,1644\n262465,171\n262466,1130\n262467,55849\n262468,272\n262469,35486\n262470,1659\n262471,972\n262472,200\n262473,30\n262474,309\n262474,310\n262475,149\n262476,5405\n262477,34\n262477,35\n262479,3260\n262480,2646\n262481,73570\n262482,417\n262483,255750\n262484,346\n262486,217\n262488,1298\n262489,60576\n262490,256681\n262491,202\n262492,592\n262493,1300\n262494,592\n262495,467\n262496,1130\n262497,1181\n262498,862\n262499,505\n262500,83\n262501,433\n262502,1133\n262504,657\n262505,21442\n262506,433\n262508,920\n262509,204124\n262510,217\n262511,147\n262511,3895\n262511,9166\n262512,932\n262514,256681\n262515,1566\n262516,179170\n262517,1231\n262518,1181\n262519,179170\n262520,55849\n262522,1381\n262523,257700\n262524,83\n262525,861\n262526,22\n262527,142451\n262528,302\n262529,147\n262530,179170\n262532,179170\n262533,358\n262534,1619\n262535,262536\n262537,1345\n262538,1858\n262539,1860\n262540,720\n262541,262542\n262543,262544\n262545,949\n262546,179170\n262547,240174\n262548,4172\n262549,179170\n262550,179170\n262552,779\n262553,775\n262554,137\n262555,589\n262556,30\n262558,493\n262559,56\n262560,422\n262562,1368\n262563,32751\n262564,1801\n262565,272\n262566,422\n262567,422\n262568,56\n262569,34\n262569,35\n262570,1119\n262571,1033\n262572,518\n262573,349\n262575,267\n262579,79\n262579,192\n262579,1181\n262581,1326\n262582,179170\n262583,503\n262584,1467\n262585,262586\n262587,647\n262588,81070\n262589,515\n262590,262591\n262592,424\n262593,509\n262594,809\n262595,525\n262596,1127\n262597,718\n262598,1265\n262598,1266\n262599,996\n262600,179170\n262601,718\n262602,138686\n262603,175\n262604,622\n262605,818\n262606,179170\n262607,424\n262608,5405\n262609,333\n262611,1559\n262613,1515\n262614,134\n262615,3999\n262616,115\n262617,1238\n262618,7155\n262619,2266\n262620,7270\n262621,7124\n262622,344\n262623,626\n262624,9010\n262625,1844\n262626,1644\n262627,515\n262628,146\n262628,92476\n262629,647\n262630,344\n262631,272\n262632,179170\n262633,1381\n262634,644\n262636,135\n262637,258887\n262638,586\n262640,1381\n262641,406\n262642,1415\n262643,5405\n262644,1381\n262646,1240\n262647,256681\n262648,148742\n262649,30\n262650,187\n262651,207\n262652,195\n262652,5874\n262652,6119\n262652,16767\n262653,92476\n262654,344\n262655,647\n262656,179170\n262658,980\n262659,158\n262660,1452\n262661,3623\n262662,2646\n262663,179170\n262664,225\n262664,248\n262664,1179\n262664,1332\n262664,5405\n262665,577\n262666,1556\n262667,247\n262668,2931\n262670,83\n262671,775\n262672,875\n262673,151\n262674,1085\n262675,1085\n262676,818\n262677,5405\n262678,1381\n262679,155481\n262680,1070\n262681,818\n262682,330\n262683,179170\n262684,179170\n262685,2048\n262687,179170\n262688,255\n262689,55849\n262690,1836\n262691,1210\n262691,1231\n262692,179170\n262693,179170\n262694,56\n262695,422\n262696,1644\n262697,920\n262698,179170\n262699,1033\n262700,179170\n262701,257244\n262702,795\n262703,179170\n262704,111\n262705,302\n262706,156379\n262707,1085\n262709,220816\n262710,563\n262711,269\n262712,5405\n262713,932\n262714,406\n262715,406\n262716,704\n262717,1265\n262717,1266\n262718,718\n262719,718\n262720,1265\n262720,1266\n262721,7652\n262722,195\n262722,452\n262723,1231\n262724,179170\n262725,220816\n262726,592\n262727,1181\n262728,158\n262729,356\n262730,220816\n262731,179170\n262732,179170\n262733,83\n262734,220816\n262735,200\n262736,1612\n262737,167\n262738,220816\n262739,179170\n262740,179170\n262741,8373\n262742,1118\n262743,30\n262744,179170\n262745,179170\n262746,220816\n262747,111\n262748,1821\n262748,21736\n262750,247\n262751,1449\n262752,262753\n262754,247\n262755,2646\n262756,3623\n262757,1001\n262758,179170\n262759,220816\n262760,220816\n262761,269\n262762,18790\n262763,30\n262764,146\n262764,92476\n262765,647\n262766,344\n262767,626\n262768,1453\n262768,3258\n262769,444\n262770,146\n262770,92476\n262771,344\n262772,647\n262773,220816\n262774,226825\n262775,30\n262776,861\n262777,220816\n262778,220816\n262779,920\n262780,1058\n262781,220816\n262782,87\n262782,536\n262782,1274\n262782,1454\n262783,34\n262783,35\n262784,256206\n262785,2923\n262786,278\n262787,875\n262788,306\n262788,307\n262789,1707\n262790,83\n262791,920\n262792,1877\n262794,2775\n262795,447\n262796,7092\n262797,5405\n262798,220816\n262799,920\n262800,142870\n262801,2146\n262802,302\n262803,30\n262804,875\n262805,1179\n262806,278\n262807,220816\n262808,262809\n262810,818\n262811,285\n262812,1238\n262813,179170\n262814,220816\n262815,333\n262816,503\n262817,179170\n262818,493\n262819,179170\n262820,1452\n262821,30\n262822,330\n262824,795\n262825,2620\n262826,500\n262827,875\n262828,179170\n262829,7652\n262830,875\n262831,179170\n262832,4101\n262833,179170\n262834,151\n262835,179170\n262836,1052\n262837,2590\n262838,589\n262839,179170\n262840,179170\n262841,1010\n262842,406\n262843,179170\n262844,3960\n262845,220816\n262846,907\n262847,2995\n262848,1414\n262849,589\n262850,6068\n262851,220816\n262852,861\n262853,200\n262854,2373\n262855,220816\n262856,255980\n262856,256146\n262857,9121\n262858,5405\n262859,220816\n262860,119\n262860,19519\n262861,179170\n262862,179170\n262863,138686\n262864,175\n262865,179170\n262866,179170\n262867,30\n262868,179170\n262869,707\n262870,179170\n262871,211\n262872,5440\n262873,30\n262874,557\n262875,1102\n262876,269\n262877,147\n262878,179170\n262879,390\n262880,179170\n262881,179170\n262882,147\n262883,1893\n262884,1556\n262885,920\n262886,179170\n262887,3872\n262888,179170\n262889,707\n262890,179170\n262891,294\n262891,631\n262892,179170\n262893,8270\n262894,179170\n262895,71\n262896,589\n262897,179170\n262898,220816\n262899,8854\n262899,255750\n262900,920\n262901,220816\n262902,1227\n262903,1363\n262904,179170\n262905,220816\n262906,41\n262907,255\n262908,5212\n262909,15609\n262910,179170\n262911,262912\n262913,179170\n262914,220816\n262915,493\n262917,491\n262918,1227\n262919,179170\n262920,179170\n262921,83\n262922,179170\n262923,179170\n262924,142870\n262925,256681\n262926,179170\n262927,179170\n262928,179170\n262929,179170\n262930,179170\n262931,179170\n262932,179170\n262933,179170\n262934,179170\n262935,179170\n262936,206\n262937,1511\n262937,6214\n262938,120\n262939,179170\n262940,1381\n262941,179170\n262942,179170\n262943,79\n262943,493\n262944,179170\n262945,6068\n262946,137\n262947,179170\n262948,48\n262949,84666\n262950,991\n262951,6068\n262952,292\n262953,31896\n262953,33424\n262953,245910\n262954,25348\n262954,33424\n262954,101688\n262954,245910\n262955,56\n262956,422\n262957,256681\n262958,8884\n262959,477\n262959,23287\n262960,1769\n262961,247\n262963,142870\n262964,77\n262965,493\n262966,996\n262967,179170\n262968,285\n262969,30\n262970,179170\n262971,1467\n262972,932\n262973,15573\n262974,1087\n262974,3370\n262975,179170\n262976,7358\n262976,7363\n262977,388\n262978,2424\n262979,35486\n262980,953\n262980,33424\n262980,245910\n262981,805\n262982,2931\n262983,179170\n262984,48\n262985,179170\n262986,333\n262987,275\n262988,585\n262989,8992\n262990,1149\n262991,5366\n262992,991\n262993,1379\n262994,247\n262995,256681\n262996,536\n262997,4475\n262998,200\n262999,134\n263000,2048\n263001,1285\n263002,7360\n263003,3148\n263004,1359\n263005,567\n263006,158\n263007,2590\n263008,1010\n263009,179170\n263010,146\n263010,92476\n263011,344\n263012,647\n263013,138686\n263014,175\n263015,142870\n263016,1860\n263017,1858\n263018,13980\n263019,135\n263020,104\n263021,1332\n263023,273\n263024,71\n263025,79\n263026,581\n263027,189788\n263028,491\n263029,491\n263030,209\n263031,707\n263032,126\n263033,438\n263034,83\n263035,217\n263036,743\n263037,2671\n263038,1623\n263039,980\n263040,263041\n263042,202\n263043,567\n263043,750\n263043,1293\n263044,1860\n263045,1858\n263046,707\n263047,179170\n263048,104\n263049,875\n263050,818\n263051,63471\n263052,1579\n263053,516\n263054,1436\n263055,179170\n263056,3804\n263057,859\n263058,640\n263059,707\n263060,640\n263061,605\n263062,179170\n263064,263065\n263067,97\n263068,156379\n263069,586\n263070,2434\n263074,192\n263074,406\n263074,4192\n263074,4193\n263075,81070\n263077,278\n263078,835\n263080,707\n263081,1707\n263082,46\n263083,158\n263084,134\n263085,255980\n263086,920\n263087,516\n263088,818\n263089,146\n263089,92476\n263090,647\n263091,344\n263092,179170\n263093,179170\n263094,99\n263095,1608\n263096,1132\n263097,356\n263098,1707\n263099,138686\n263100,175\n263101,1776\n263102,1238\n263103,875\n263104,37\n263105,1274\n263106,56\n263107,920\n263108,1452\n263112,149\n263113,344\n263114,146\n263115,647\n263116,422\n263117,56\n263118,1345\n263119,843\n263120,30\n263121,56\n263122,422\n263123,1313\n263124,263125\n263128,1274\n263129,167\n263130,422\n263131,784\n263132,1132\n263133,1608\n263134,1860\n263135,1858\n263136,3094\n263137,261972\n263138,1400\n263139,175\n263140,256681\n263141,171\n263142,422\n263143,304\n263144,422\n263145,138686\n263146,707\n263147,209\n263148,422\n263149,422\n263150,97\n263151,422\n263152,422\n263153,256681\n263154,55849\n263155,422\n263156,422\n263157,422\n263158,151\n263159,422\n263160,35486\n263161,2266\n263162,422\n263164,422\n263165,240\n263165,372\n263165,1955\n263165,9015\n263166,142870\n263167,1133\n263168,1634\n263169,287\n263170,215\n263171,209\n263172,15179\n263173,491\n263174,209\n263175,875\n263176,2646\n263177,5405\n263179,577\n263180,779\n263181,2646\n263182,3623\n263184,2274\n263185,850\n263186,4548\n263187,932\n263188,217\n263189,2191\n263191,56\n263192,422\n263193,34\n263193,167\n263193,760\n263193,1149\n263193,2416\n263193,2417\n263193,94134\n263194,5405\n263195,263196\n263198,875\n263199,209\n263200,346\n263201,79\n263202,209\n263203,155473\n263204,406\n263205,431\n263206,5405\n263208,2646\n263209,3623\n263210,493\n263211,83\n263212,149\n263213,68\n263213,192\n263213,420\n263213,435\n263213,953\n263213,1085\n263213,1210\n263213,1531\n263213,3872\n263213,7124\n263213,8868\n263214,640\n263215,640\n263216,1465\n263217,7360\n263218,209\n263219,1860\n263220,1858\n263221,5405\n263222,1860\n263223,1858\n263224,269\n263225,518\n263226,640\n263227,8270\n263228,7270\n263229,2646\n263230,3623\n263231,5405\n263232,142870\n263233,58\n263234,46\n263235,994\n263237,7124\n263238,1181\n263239,179170\n263240,5405\n263241,13661\n263242,179170\n263243,151\n263244,1370\n263244,2782\n263245,9010\n263246,1247\n263246,164572\n263247,818\n263248,2224\n263249,56\n263250,422\n263251,256681\n263252,5405\n263253,17588\n263254,1326\n263255,1715\n263257,30\n263258,366\n263259,209\n263260,366\n263261,590\n263262,366\n263263,390\n263264,146\n263264,92476\n263265,1151\n263266,2646\n263267,209\n263268,187176\n263269,366\n263270,366\n263271,366\n263272,1010\n263273,1146\n263274,1390\n263275,5405\n263276,366\n263277,760\n263278,366\n263279,209\n263280,872\n263281,2073\n263283,5405\n263284,302\n263285,1715\n263286,344\n263287,162599\n263288,217\n263289,2646\n263290,3623\n263291,287\n263292,1001\n263293,302\n263294,850\n263295,1130\n263296,861\n263297,179170\n263298,30\n263300,372\n263301,256681\n263302,30\n263303,258887\n263306,263307\n263308,1085\n263309,138686\n263310,175\n263311,5405\n263312,255750\n263313,179170\n263314,861\n263315,5405\n263317,1749\n263318,5405\n263319,563\n263320,1715\n263321,1085\n263322,515\n263323,2105\n263324,5405\n263325,5405\n263326,557\n263327,258631\n263328,179170\n263330,263331\n263332,17588\n263334,158\n263335,5405\n263336,2775\n263337,263338\n263339,332\n263340,1058\n263341,179170\n263343,5405\n263344,585\n263345,467\n263346,991\n263347,1133\n263348,77\n263348,269\n263349,557\n263350,151\n263351,269\n263353,302\n263354,647\n263355,146\n263355,92476\n263356,344\n263357,875\n263358,493\n263359,442\n263360,483\n263361,301\n263362,233\n263363,2244\n263364,2319\n263365,417\n263366,1001\n263367,255\n263368,1556\n263369,417\n263370,142473\n263371,536\n263372,2979\n263373,704\n263374,158\n263375,707\n263376,7360\n263377,7757\n263378,247\n263378,2867\n263378,2868\n263379,263380\n263381,151\n263382,256681\n263383,200\n263384,83\n263384,536\n263384,1571\n263385,392\n263385,1893\n263386,5405\n263387,34\n263388,263389\n263390,330\n263391,5405\n263392,920\n263393,73570\n263394,1\n263395,749\n263396,704\n263397,79\n263398,626\n263399,30\n263400,256206\n263401,932\n263402,136\n263402,151\n263402,167\n263402,171\n263402,202\n263402,225\n263402,252\n263402,422\n263402,626\n263402,779\n263402,1001\n263402,1265\n263402,1266\n263402,1335\n263402,1381\n263402,1467\n263402,1837\n263402,2557\n263402,33082\n263402,255911\n263402,256540\n263403,749\n263404,2590\n263405,1608\n263406,518\n263407,718\n263408,323\n263409,81\n263411,439\n263412,479\n263413,328\n263414,1\n263415,843\n263416,240\n263417,217\n263418,631\n263419,81\n263420,1773\n263421,1\n263422,1623\n263423,179170\n263424,214734\n263425,179170\n263426,920\n263427,179170\n263428,994\n263429,179170\n263430,626\n263431,590\n263431,1368\n263432,1298\n263434,179170\n263435,247\n263436,134\n263437,179170\n263438,220816\n263440,263441\n263442,179170\n263443,220816\n263444,179170\n263445,240174\n263446,179170\n263447,220816\n263448,179170\n263449,179170\n263450,220816\n263451,10\n263452,302\n263453,14366\n263454,289\n263454,94134\n263455,1087\n263456,536\n263457,615\n263458,1740\n263459,220816\n263460,217\n263461,652\n263462,4192\n263462,4193\n263463,220816\n263464,1326\n263465,179170\n263466,1773\n263467,1707\n263468,220816\n263469,1379\n263469,1769\n263469,28755\n263470,220816\n263471,179170\n263472,257244\n263472,263783\n263473,920\n263474,179170\n263475,220816\n263476,397\n263477,179170\n263478,263479\n263480,220816\n263481,885\n263482,179170\n263483,2867\n263483,2868\n263484,301\n263485,557\n263486,392\n263486,1010\n263487,439\n263487,1033\n263488,206\n263489,220816\n263490,9015\n263491,30\n263492,1860\n263493,1858\n263494,1151\n263495,340\n263496,1715\n263497,220816\n263498,2266\n263499,861\n263500,220816\n263501,1309\n263502,102\n263503,1326\n263504,408\n263505,1323\n263506,255750\n263507,718\n263508,220816\n263509,151\n263510,809\n263511,220816\n263512,209\n263513,673\n263514,217\n263515,1474\n263516,875\n263517,7092\n263518,142870\n263519,968\n263520,1773\n263521,220816\n263523,3260\n263524,1274\n263525,263526\n263527,209\n263528,1298\n263529,809\n263530,5906\n263531,557\n263532,626\n263533,278\n263534,137\n263535,862\n263536,278\n263538,4865\n263538,4866\n263539,752\n263540,2411\n263541,179170\n263542,151\n263543,179170\n263544,87\n263545,1085\n263546,493\n263547,179170\n263548,435\n263549,220816\n263550,106\n263551,220816\n263552,42220\n263553,307\n263554,220816\n263555,1014\n263556,179170\n263557,843\n263558,1014\n263559,179170\n263560,151\n263561,920\n263562,179170\n263563,707\n263564,717\n263565,920\n263566,30\n263567,263568\n263570,590\n263570,32475\n263571,875\n263572,138686\n263573,175\n263574,147\n263575,1\n263576,5366\n263577,192\n263578,424\n263579,1801\n263580,30\n263581,179170\n263582,920\n263583,220816\n263584,179170\n263585,861\n263586,22\n263587,385\n263588,179170\n263589,138\n263590,3695\n263591,2116\n263592,179170\n263593,220816\n263594,179170\n263595,179170\n263596,220816\n263597,179170\n263599,589\n263600,179170\n263601,263601\n263602,1659\n263603,577\n263605,920\n263607,1033\n263608,2775\n263609,704\n263610,79\n263611,704\n263612,493\n263613,79\n263614,592\n263615,585\n263616,586\n263617,393\n263618,50\n263619,406\n263620,841\n263621,1227\n263622,1590\n263623,620\n263624,151\n263625,255\n263626,1904\n263627,2367\n263628,406\n263629,779\n263630,1515\n263631,263632\n263633,263634\n263635,151\n263636,240174\n263637,333\n263638,255613\n263639,285\n263640,337\n263640,338\n263640,393\n263640,439\n263640,626\n263640,649\n263640,772\n263640,1381\n263640,1634\n263640,2367\n263640,255750\n263641,269\n263642,255876\n263643,195\n263644,171\n263645,920\n263646,2590\n263647,250\n263648,285\n263649,179170\n263650,269\n263652,973\n263653,2735\n263654,263655\n263656,872\n263657,1429\n263658,920\n263659,3148\n263660,5405\n263661,179170\n263662,255750\n263663,1294\n263664,167\n263664,1544\n263665,179170\n263666,843\n263667,35486\n263669,207\n263670,668\n263671,179170\n263672,2048\n263673,1453\n263674,179170\n263675,83\n263676,179170\n263677,263678\n263679,389\n263680,65\n263680,406\n263681,179170\n263682,862\n263683,707\n263684,30\n263684,248\n263685,7358\n263685,7363\n263686,179170\n263687,1210\n263688,3585\n263689,7270\n263690,9010\n263690,164572\n263691,20359\n263692,34\n263692,1707\n263693,8822\n263694,8598\n263695,225\n263696,332\n263697,252\n263697,749\n263698,1\n263699,179170\n263700,4192\n263700,4193\n263701,843\n263702,263703\n263704,1085\n263705,34\n263705,1707\n263706,1019\n263707,256681\n263709,1143\n263710,1544\n263711,4597\n263712,136\n263713,1133\n263714,15573\n263715,179170\n263716,179170\n263717,179170\n263718,142870\n263719,179170\n263720,138686\n263721,175\n263722,179170\n263723,302\n263724,366\n263725,366\n263726,366\n263728,30\n263729,263730\n263732,3\n263733,609\n263734,262271\n263735,707\n263737,179170\n263738,195\n263739,344\n263741,263742\n263743,1707\n263744,151\n263745,179170\n263746,2671\n263747,5405\n263748,217\n263749,779\n263750,5343\n263751,640\n263752,467\n263753,217\n263754,1515\n263755,1118\n263756,491\n263757,45310\n263758,1860\n263759,1858\n263760,536\n263761,422\n263762,422\n263763,4060\n263764,422\n263765,422\n263766,422\n263767,5405\n263768,60576\n263769,202\n263769,1776\n263770,263771\n263772,422\n263774,422\n263775,589\n263776,422\n263777,312\n263778,422\n263779,422\n263780,422\n263781,422\n263782,1001\n263785,919\n263787,1181\n263788,1465\n263789,3260\n263790,3413\n263792,1284\n263793,9015\n263795,9015\n263796,5405\n263797,720\n263798,160\n263799,875\n263800,5405\n263801,1454\n263802,644\n263803,920\n263804,949\n263805,1623\n263807,50\n263808,433\n263809,156379\n263812,167\n263813,258887\n263814,272\n263814,934\n263815,1860\n263816,1858\n263817,868\n263819,1070\n263820,156379\n263821,1454\n263822,5405\n263823,171\n263824,30\n263825,1531\n263826,138686\n263827,175\n263828,217\n263830,452\n263831,1634\n263832,1238\n263833,272\n263835,1707\n263836,605\n263837,179170\n263838,41\n263839,1052\n263840,1452\n263841,192\n263842,142870\n263843,1241\n263844,1132\n263845,83\n263846,5405\n263847,287\n263849,1860\n263850,1858\n263851,215\n263852,256681\n263853,145240\n263854,907\n263855,193129\n263856,5405\n263857,1368\n263859,2617\n263860,5405\n263861,35486\n263862,704\n263863,515\n263863,590\n263864,263865\n263866,87\n263867,557\n263868,338\n263869,240\n263870,1860\n263871,1858\n263872,115\n263873,83\n263874,1359\n263876,932\n263877,44\n263878,227\n263879,106\n263879,1370\n263879,2782\n263880,1467\n263882,2646\n263883,3623\n263884,467\n263885,3872\n263886,5265\n263887,263888\n263889,193129\n263890,516\n263891,2775\n263892,447\n263893,431\n263894,685\n263895,259\n263895,726\n263896,1052\n263897,920\n263898,3623\n263899,2646\n263900,5405\n263901,2646\n263902,3623\n263903,9457\n263904,743\n263905,875\n263906,875\n263907,1749\n263908,1888\n263909,3094\n263910,2205\n263910,33424\n263910,245910\n263911,248\n263912,1608\n263913,1132\n263914,248\n263915,54\n263916,37414\n263917,79\n263918,1452\n263919,2646\n263920,3623\n263921,3623\n263922,30\n263923,841\n263924,485\n263925,310\n263926,3\n263927,875\n263928,2989\n263928,2991\n263929,179170\n263930,151\n263932,113156\n263933,23783\n263934,256681\n263935,389\n263937,349\n263938,46\n263938,58\n263940,1849\n263941,1425\n263942,1590\n263944,261\n263945,34\n263945,35\n263946,185877\n263947,5405\n263948,258973\n263950,138686\n263951,175\n263960,7\n263960,97\n263961,389\n263962,31934\n263963,868\n263965,5405\n263966,106\n263966,3370\n263966,6119\n263966,14453\n263967,5405\n263968,1769\n263971,859\n263972,1313\n263973,3258\n263975,5405\n263976,292\n263980,3\n263981,515\n263983,2205\n263983,33424\n263983,245910\n263984,34\n263985,1127\n263986,1052\n263987,315\n263988,255\n263989,240174\n263990,30\n263993,1012\n263994,388\n263995,2991\n263996,1058\n263997,34\n263999,247\n264000,264001\n264002,2434\n264003,920\n264004,5405\n264005,2205\n264005,33424\n264005,245910\n264006,571\n264007,1359\n264008,83\n264009,872\n264010,138686\n264011,175\n264012,124668\n264013,6303\n264014,1556\n264015,5192\n264016,5405\n264018,56\n264019,422\n264020,192\n264021,179170\n264022,5405\n264023,515\n264024,4549\n264025,272\n264027,1368\n264028,258973\n264029,595\n264030,22\n264031,6424\n264032,151\n264033,99\n264034,483\n264035,2979\n264036,1001\n264037,388\n264038,328\n264040,968\n264041,151\n264042,302\n264043,3218\n264044,189303\n264045,179170\n264046,704\n264047,34\n264047,158\n264048,79\n264049,450\n264049,4193\n264050,3370\n264050,6027\n264051,932\n264053,179170\n264055,1\n264056,7358\n264056,7363\n264057,179170\n264058,861\n264059,56\n264060,422\n264061,7698\n264062,406\n264063,99\n264064,220816\n264065,557\n264066,1220\n264067,252\n264068,251\n264069,1462\n264069,8537\n264071,30\n264072,302\n264073,424\n264074,2436\n264075,220816\n264076,3115\n264077,179170\n264078,2646\n264079,3623\n264080,536\n264081,220816\n264082,220816\n264083,147\n264083,1181\n264083,1370\n264084,272\n264085,2209\n264087,893\n264088,2646\n264089,3623\n264090,179170\n264091,220816\n264093,179170\n264094,247\n264095,2646\n264096,3623\n264097,596\n264098,1522\n264099,220816\n264100,1284\n264101,704\n264102,3623\n264103,2646\n264104,79\n264105,557\n264106,264107\n264108,4594\n264109,179170\n264110,779\n264111,44\n264112,389\n264113,179170\n264114,920\n264115,179170\n264116,2116\n264117,4597\n264118,439\n264119,147\n264120,2784\n264121,5405\n264122,2646\n264123,264\n264124,217\n264125,55849\n264126,211\n264127,5405\n264129,2379\n264130,30\n264131,875\n264132,1335\n264133,83\n264134,217\n264135,278\n264136,536\n264137,83\n264138,366\n264139,256681\n264140,247\n264141,220816\n264142,179170\n264143,56\n264144,422\n264145,247\n264146,355\n264147,435\n264148,30\n264149,179170\n264150,333\n264151,25453\n264151,256540\n264152,206\n264153,179170\n264154,1467\n264155,875\n264157,861\n264158,154408\n264159,151\n264160,843\n264161,949\n264162,652\n264163,1359\n264164,1326\n264165,102\n264166,408\n264167,1323\n264169,7092\n264171,557\n264172,862\n264174,811\n264175,247\n264176,682\n264176,72439\n264177,827\n264178,30\n264179,264180\n264181,264180\n264182,278\n264183,779\n264184,1888\n264185,264186\n264187,439\n264187,516\n264187,818\n264188,1449\n264189,83\n264190,264191\n264192,1359\n264193,861\n264194,83\n264195,138686\n264196,175\n264197,256380\n264198,1132\n264199,285\n264200,1381\n264201,264202\n264203,136\n264204,843\n264205,19010\n264206,99\n264207,8811\n264208,264209\n264210,217\n264211,5265\n264212,885\n264213,2735\n264214,518\n264215,147\n264216,2048\n264217,99\n264218,147\n264218,240174\n264219,3367\n264220,264221\n264222,346\n264224,220816\n264225,275\n264226,158\n264227,1284\n264228,264229\n264230,179170\n264231,1465\n264232,4594\n264233,264234\n264235,1608\n264236,1240\n264237,264238\n264239,8822\n264240,255750\n264241,225\n264242,332\n264243,1608\n264244,920\n264245,220816\n264246,2590\n264247,4192\n264247,4193\n264248,151\n264249,1782\n264250,45960\n264251,2334\n264252,255750\n264253,179170\n264254,1163\n264255,10\n264256,289\n264256,94134\n264257,13546\n264258,563\n264259,6027\n264260,220816\n264261,227669\n264262,459\n264263,220816\n264264,2367\n264265,220816\n264266,577\n264267,264268\n264269,137\n264270,179170\n264271,179170\n264272,220816\n264273,6661\n264274,2373\n264275,220816\n264276,142451\n264276,255969\n264277,4192\n264277,4193\n264278,206\n264279,264280\n264281,285\n264282,220816\n264283,302\n264284,220816\n264285,206\n264286,256187\n264287,179170\n264288,258298\n264289,145240\n264290,179170\n264291,818\n264292,264293\n264295,60576\n264296,264297\n264298,1769\n264299,60576\n264301,269\n264302,179170\n264303,1572\n264304,256681\n264305,862\n264306,138686\n264307,175\n264308,1659\n264309,256681\n264310,264311\n264312,264313\n264314,264315\n264316,1400\n264317,264318\n264320,256681\n264321,843\n264322,479\n264323,704\n264324,493\n264325,35486\n264326,609\n264327,55849\n264329,58\n264330,994\n264331,46\n264332,58\n264333,46\n264334,994\n264335,875\n264336,5405\n264337,2088\n264338,292\n264339,366\n264340,366\n264341,366\n264342,366\n264343,366\n264344,366\n264345,366\n264346,366\n264347,258973\n264348,55849\n264349,267\n264350,259\n264352,1132\n264353,1608\n264354,668\n264356,872\n264357,875\n264359,2646\n264360,3623\n264361,192\n264362,784\n264363,644\n264364,1335\n264365,7757\n264367,256681\n264368,278\n264370,1323\n264371,136\n264372,422\n264373,30\n264373,248\n264374,285\n264375,5405\n264376,213089\n264377,264378\n264380,138686\n264381,175\n264382,187\n264384,264385\n264387,264388\n264390,919\n264391,1247\n264391,164572\n264394,586\n264395,920\n264396,1860\n264398,256600\n264399,189303\n264400,344\n264401,697\n264402,491\n264403,372\n264404,2605\n264406,3\n264408,3623\n264409,2646\n264411,338\n264412,145240\n264414,209\n264414,1749\n264415,875\n264416,760\n264417,1220\n264418,251\n264419,252\n264420,1551\n264421,58\n264422,994\n264423,46\n264424,2416\n264424,2417\n264425,58\n264426,994\n264427,46\n264428,273\n264431,217\n264432,31073\n264433,467\n264435,264\n264436,682\n264436,72439\n264436,215276\n264438,104\n264439,83\n264440,707\n264441,264442\n264443,35486\n264444,145240\n264445,3209\n264446,90845\n264447,3695\n264448,48\n264450,247\n264452,79\n264453,1294\n264455,422\n264456,422\n264457,422\n264458,422\n264459,422\n264460,422\n264461,422\n264462,422\n264463,422\n264464,422\n264465,422\n264466,422\n264467,3003\n264468,255\n264469,697\n264469,1240\n264469,1465\n264470,1983\n264471,302\n264472,256206\n264473,932\n264474,5440\n264475,1238\n264478,193578\n264479,356\n264480,1452\n264481,849\n264482,179170\n264484,90845\n264485,1400\n264486,1707\n264487,850\n264492,302\n264494,2105\n264496,13136\n264497,875\n264498,142426\n264500,920\n264501,73570\n264506,1132\n264507,1608\n264508,256681\n264511,5405\n264512,1893\n264512,4294\n264513,1309\n264514,1368\n264515,602\n264517,31073\n264520,433\n264521,447\n264522,868\n264523,60576\n264524,9029\n264526,634\n264527,657\n264528,360\n264529,55849\n264530,346\n264531,694\n264533,447\n264534,2775\n264535,217914\n264535,247075\n264536,3999\n264537,138686\n264538,175\n264540,489\n264544,843\n264544,849\n264546,1240\n264547,818\n264548,5405\n264549,1323\n264550,292\n264551,285\n264552,1119\n264553,7757\n264554,805\n264555,392\n264556,264557\n264558,920\n264560,788\n264561,310\n264561,6556\n264562,10\n264563,200543\n264564,1133\n264566,3507\n264567,149\n264568,252\n264569,1058\n264570,189303\n264571,493\n264572,932\n264573,146\n264573,92476\n264574,647\n264575,344\n264576,151\n264577,3135\n264578,1181\n264579,704\n264580,79\n264581,390\n264583,264584\n264585,285\n264586,220816\n264587,83\n264588,563\n264589,55849\n264590,220816\n264591,220816\n264593,435\n264594,138\n264595,865\n264596,557\n264597,1566\n264598,137\n264599,392\n264600,220816\n264601,406\n264602,707\n264603,220816\n264604,2045\n264605,843\n264606,996\n264607,220816\n264608,83\n264609,220816\n264611,862\n264611,3370\n264612,220816\n264613,220816\n264614,220816\n264615,920\n264616,1262\n264617,483\n264618,220816\n264619,220816\n264620,220816\n264621,44\n264622,220816\n264623,3003\n264624,809\n264625,155481\n264626,518\n264627,220816\n264628,809\n264629,220816\n264630,220816\n264631,192\n264632,220816\n264633,220816\n264634,220816\n264635,2620\n264636,557\n264637,256703\n264638,217\n264639,366\n264640,280\n264640,17245\n264641,200\n264642,312\n264643,220816\n264644,200\n264645,7092\n264647,202\n264648,491\n264649,278\n264650,332\n264651,2105\n264652,207\n264653,525\n264654,255750\n264655,1309\n264656,9015\n264657,1285\n264658,2373\n264659,264660\n264661,2979\n264662,631\n264663,1033\n264664,1014\n264665,294\n264666,269\n264667,2244\n264669,707\n264670,147\n264671,2105\n264672,1282\n264673,138686\n264674,175\n264675,1\n264676,113156\n264677,240174\n264678,920\n264679,1\n264680,388\n264681,179170\n264682,516\n264683,285\n264684,250\n264685,285\n264686,171\n264687,179170\n264688,179170\n264689,30\n264690,4771\n264691,264692\n264693,250\n264694,285\n264696,3260\n264697,255716\n264697,259187\n264698,818\n264699,140\n264699,323\n264699,932\n264699,1453\n264699,1572\n264699,2697\n264699,14458\n264700,225\n264701,4237\n264701,182162\n264703,264704\n264705,4810\n264706,269\n264707,8884\n264710,862\n264711,1085\n264712,119\n264713,264714\n264715,1893\n264716,491\n264717,8\n264718,264719\n264720,264721\n264722,264723\n264725,1467\n264727,1707\n264728,1707\n264729,1707\n264730,1\n264730,2750\n264732,252\n264733,516\n264734,1220\n264737,264738\n264739,1014\n264740,1014\n264741,1014\n264742,83\n264743,83\n264744,35486\n264747,875\n264748,264749\n264750,932\n264753,220816\n264754,83\n264755,264756\n264758,189303\n264759,2017\n264761,5405\n264762,83\n264763,450\n264764,30\n264765,6119\n264766,273\n264768,264769\n264771,592\n264772,366\n264774,698\n264775,850\n264776,264777\n264778,264779\n264780,227669\n264781,920\n264782,1381\n264783,16196\n264784,3321\n264786,5192\n264787,932\n264788,256681\n264789,3\n264790,1796\n264791,5405\n264792,5405\n264793,5405\n264794,1132\n264795,781\n264796,251\n264797,2048\n264798,589\n264799,2373\n264800,1033\n264801,2105\n264802,264803\n264804,1132\n264805,781\n264806,781\n264807,1132\n264808,620\n264809,138686\n264810,175\n264811,44\n264812,222\n264813,406\n264814,264815\n264816,779\n264817,1515\n264818,264819\n264821,258887\n264822,1014\n264823,333\n264824,217\n264825,743\n264827,483\n264828,195\n264829,220816\n264830,220816\n264831,220816\n264832,264833\n264834,220816\n264835,1836\n264836,220816\n264837,220816\n264838,156379\n264839,104\n264840,220816\n264841,30\n264842,220816\n264844,220816\n264845,264846\n264847,220816\n264848,1479\n264849,220816\n264850,390\n264851,254\n264852,258700\n264853,264854\n264855,1007\n264856,44725\n264857,4810\n264858,264859\n264860,2105\n264861,264862\n264863,256681\n264864,1462\n264864,5440\n264865,447\n264866,2775\n264867,7358\n264867,7363\n264868,393\n264869,433\n264870,220816\n264871,179170\n264872,179170\n264873,818\n264874,179170\n264876,149534\n264877,179170\n264878,707\n264879,298\n264880,485\n264881,144962\n264882,571\n264883,151\n264884,264885\n264886,54\n264889,2424\n264890,264891\n264892,264893\n264894,1227\n264895,1414\n264896,2697\n264897,15573\n264898,1285\n264899,256187\n264900,1240\n264901,5265\n264902,1608\n264903,6682\n264904,850\n264905,255750\n264906,255750\n264907,206\n264908,259187\n264909,30\n264910,187\n264911,264912\n264913,138686\n264914,175\n264915,1082\n264916,491\n264917,107\n264918,2416\n264918,2417\n264919,292\n264920,338\n264921,298\n264922,179170\n264923,1133\n264924,3538\n264925,417\n264926,179170\n264927,179170\n264928,264929\n264930,707\n264931,9537\n264932,1227\n264933,588\n264933,590\n264933,1419\n264934,264935\n264936,366\n264937,366\n264938,366\n264939,366\n264940,366\n264941,366\n264942,366\n264943,366\n264945,589\n264946,2266\n264948,875\n264949,171\n264950,151\n264951,255750\n264952,159902\n264953,179170\n264954,779\n264955,35486\n264956,760\n264957,647\n264958,264959\n264960,2775\n264961,2073\n264963,875\n264964,304\n264965,304\n264966,1603\n264968,640\n264969,30\n264970,255980\n264971,264972\n264973,1087\n264974,149\n264976,483\n264977,267\n264978,294\n264978,2868\n264979,1201\n264979,33424\n264979,245910\n264980,2424\n264981,749\n264984,264985\n264986,264987\n264988,264989\n264990,589\n264991,589\n264992,137\n264993,285\n264994,240174\n264995,264996\n264997,4545\n264997,56150\n264998,932\n264999,818\n265000,1631\n265002,138686\n265003,175\n265004,784\n265005,179170\n265006,7092\n265007,779\n265008,179170\n265009,2668\n265010,422\n265011,422\n265012,1715\n265013,1085\n265014,422\n265015,422\n265016,422\n265017,422\n265018,422\n265019,422\n265020,422\n265021,422\n265022,422\n265023,422\n265024,422\n265025,44\n265027,1566\n265028,5405\n265029,1860\n265030,1858\n265031,5405\n265032,349\n265032,455\n265032,5343\n265033,493\n265034,366\n265035,366\n265036,366\n265038,255613\n265039,252\n265040,1220\n265041,251\n265042,707\n265043,58\n265044,46\n265045,994\n265046,5405\n265047,5405\n265048,134\n265048,349\n265048,431\n265049,1608\n265050,968\n265051,273\n265052,60576\n265053,1807\n265054,1014\n265055,206\n265055,2105\n265056,5405\n265057,707\n265058,450\n265059,873\n265060,1014\n265061,265062\n265063,973\n265064,1014\n265065,536\n265066,265067\n265068,265069\n265070,265071\n265072,2506\n265073,872\n265074,872\n265075,10\n265076,265077\n265078,589\n265079,137\n265080,265081\n265082,589\n265083,137\n265084,265085\n265086,195\n265087,265088\n265089,240\n265090,265091\n265092,652\n265093,10\n265094,265095\n265096,932\n265097,2105\n265098,3331\n265099,292\n265100,294\n265101,491\n265102,296\n265103,240\n265104,298\n265105,265106\n265107,142473\n265108,3258\n265109,2083\n265110,265111\n265112,1001\n265113,30\n265114,285\n265115,704\n265116,493\n265117,79\n265118,592\n265119,585\n265120,586\n265121,393\n265122,50\n265123,406\n265124,6068\n265125,256681\n265126,256681\n265128,2073\n265129,366\n265130,366\n265131,256681\n265132,265133\n265134,265135\n265136,265137\n265138,256681\n265139,158\n265140,256681\n265141,265142\n265143,83\n265144,151\n265145,137\n265146,589\n265147,265148\n265149,647\n265150,103860\n265151,4597\n265152,256681\n265153,256681\n265154,147\n265155,256681\n265156,6387\n265157,255969\n265158,206\n265160,586\n265161,1531\n265162,256681\n265163,41\n265164,2617\n265165,707\n265166,920\n265167,240174\n265168,171\n265169,137\n265169,200\n265170,491\n265171,707\n265172,30\n265173,256681\n265174,707\n265175,83\n265176,256681\n265177,442\n265178,265179\n265180,256681\n265182,1274\n265183,35486\n265184,256681\n265185,1181\n265186,671\n265187,932\n265188,255\n265189,302\n265190,136\n265191,2116\n265193,68\n265194,2296\n265195,4597\n265196,422\n265197,422\n265198,422\n265199,422\n265200,422\n265201,83\n265202,6387\n265203,422\n265204,422\n265205,422\n265206,422\n265207,422\n265208,422\n265209,422\n265210,422\n265211,192\n265212,875\n265213,255750"
  },
  {
    "path": "examples/dataset/small_data_edge.csv",
    "content": "Source,Target\n1,2048\n"
  },
  {
    "path": "examples/dataset/small_data_edge_raw.csv",
    "content": "Source,Target\n0,451\n0,395\n0,386\n1,3637\n1,3587\n1,3586\n1,3553\n2,3583\n3,4930\n4,88\n5,120\n5,13\n6,8\n7,8\n8,7\n8,6\n8,9\n9,8\n9,208\n9,205\n9,75\n9,61\n9,10\n10,9\n10,50\n11,125\n11,94\n12,13\n13,12\n13,5\n13,83\n13,15\n13,14\n14,13\n14,147\n14,29\n14,17\n14,16\n15,13\n16,14\n17,14\n18,190\n18,19\n19,18\n19,130\n19,20\n20,19\n20,199\n21,176\n21,51\n22,4445\n23,4446\n24,4461\n24,53\n25,136\n25,58\n26,203\n26,139\n26,131\n26,94\n27,166\n27,161\n28,98\n29,14\n29,160\n29,130\n30,140\n30,123\n31,104\n31,62\n32,174\n32,155\n33,34\n34,33\n34,97\n34,35\n35,34\n35,142\n35,141\n35,69\n35,36\n36,35\n36,157\n36,47\n36,39\n36,38\n36,37\n37,36\n38,36\n39,36\n40,202\n40,97\n41,232\n41,218\n41,167\n41,58\n41,42\n42,41\n42,181\n42,98\n43,163\n43,94\n44,47\n45,47\n46,184\n46,47\n47,46\n47,45\n47,44\n47,36\n47,171\n48,106\n48,101\n48,75\n49,4448\n50,10\n50,205\n50,139\n51,21\n51,194\n51,120\n52,172\n52,119\n52,111\n53,24\n53,231\n54,147\n54,109\n55,107\n55,88\n56,198\n56,175\n56,152\n56,149\n56,119\n57,2562\n57,98\n58,41\n58,25\n58,167\n58,59\n59,58\n59,60\n60,59\n60,154\n61,9\n61,209\n61,188\n62,31\n62,154\n63,68\n64,68\n65,68\n66,69\n67,70\n68,65\n68,64\n68,63\n68,4893\n68,979\n68,69\n69,68\n69,66\n69,35\n69,2344\n69,1052\n69,1030\n69,70\n70,69\n70,67\n70,108\n71,224\n71,86\n72,215\n72,112\n72,73\n73,72\n73,231\n73,91\n74,98\n75,48\n75,9\n76,185\n76,110\n76,86\n76,77\n77,76\n77,191\n77,170\n78,109\n78,79\n79,78\n79,80\n80,79\n80,989\n80,199\n80,184\n81,2562\n81,82\n82,81\n82,98\n83,13\n83,221\n83,218\n84,4461\n84,4446\n85,4448\n85,151\n86,76\n86,71\n86,110\n87,89\n87,88\n88,87\n88,55\n88,4\n88,198\n88,195\n88,178\n88,172\n88,90\n89,87\n90,88\n91,73\n91,4446\n91,496\n92,174\n92,123\n92,94\n93,94\n94,93\n94,92\n94,43\n94,26\n94,11\n94,131\n94,95\n95,94\n95,171\n95,129\n96,148\n96,144\n97,40\n97,34\n98,82\n98,74\n98,57\n98,42\n98,28\n98,205\n98,135\n98,125\n98,100\n99,4459\n99,100\n100,99\n100,98\n101,48\n101,210\n101,123\n102,140\n103,190\n103,153\n103,145\n104,31\n104,222\n104,174\n105,1055\n105,1030\n105,184\n106,48\n106,186\n107,55\n107,178\n108,70\n108,4120\n108,207\n108,116\n109,78\n109,54\n110,86\n110,76\n111,52\n111,204\n111,192\n111,148\n112,72\n112,215\n112,113\n113,112\n113,3770\n113,129\n114,115\n115,114\n115,205\n116,108\n116,522\n116,207\n116,118\n116,117\n117,116\n118,116\n119,56\n119,52\n119,175\n119,148\n120,51\n120,5\n121,122\n122,121\n122,123\n123,122\n123,101\n123,92\n123,30\n123,140\n124,232\n124,194\n124,173\n124,153\n125,98\n125,11\n125,208\n126,129\n127,129\n128,129\n129,128\n129,127\n129,126\n129,113\n129,95\n129,4112\n129,235\n129,207\n130,29\n130,19\n131,94\n131,26\n131,139\n132,4461\n133,2562\n134,236\n134,222\n135,98\n135,236\n136,25\n136,146\n137,229\n137,224\n137,223\n138,4882\n138,205\n138,150\n138,143\n138,140\n138,139\n139,138\n139,131\n139,50\n139,26\n139,140\n140,139\n140,138\n140,123\n140,102\n140,30\n140,186\n140,141\n141,140\n141,35\n141,142\n142,141\n142,35\n143,138\n143,234\n143,202\n143,151\n144,96\n144,192\n145,103\n145,196\n145,194\n146,136\n146,153\n147,54\n147,14\n148,119\n148,111\n148,96\n149,56\n149,198\n150,138\n150,191\n150,181\n151,143\n151,85\n152,56\n152,198\n153,146\n153,124\n153,103\n153,158\n153,157\n153,156\n153,154\n154,153\n154,62\n154,60\n154,173\n154,159\n154,157\n154,155\n155,154\n155,32\n156,153\n156,189\n157,154\n157,153\n157,36\n157,193\n158,153\n159,154\n160,29\n161,27\n161,196\n162,165\n162,163\n163,162\n163,43\n163,191\n163,164\n164,163\n165,162\n166,27\n166,176\n167,58\n167,41\n168,229\n168,170\n169,227\n169,187\n169,170\n170,169\n170,168\n170,77\n170,171\n171,170\n171,95\n171,47\n172,88\n172,52\n173,154\n173,124\n174,104\n174,92\n174,32\n174,189\n175,119\n175,56\n176,166\n176,21\n177,180\n177,179\n177,178\n178,177\n178,107\n178,88\n179,177\n179,206\n179,199\n180,177\n181,150\n181,42\n182,184\n183,184\n184,183\n184,182\n184,105\n184,80\n184,46\n184,997\n184,200\n185,76\n185,187\n186,140\n186,106\n187,185\n187,169\n187,230\n187,228\n188,61\n188,205\n189,174\n189,156\n190,103\n190,18\n191,163\n191,150\n191,77\n192,144\n192,111\n192,193\n193,192\n193,157\n194,145\n194,124\n194,51\n195,88\n195,204\n196,161\n196,145\n197,201\n198,152\n198,149\n198,88\n198,56\n198,201\n198,200\n199,179\n199,80\n199,20\n199,201\n200,198\n200,184\n201,199\n201,198\n201,197\n202,143\n202,40\n203,26\n204,195\n204,111\n205,188\n205,138\n205,115\n205,98\n205,50\n205,9\n205,207\n206,179\n206,207\n207,206\n207,205\n207,129\n207,116\n207,108\n208,125\n208,9\n209,61\n210,101\n210,213\n210,212\n210,211\n211,210\n212,210\n213,210\n214,499\n214,215\n215,214\n215,112\n215,72\n216,228\n216,225\n217,218\n218,217\n218,83\n218,41\n219,224\n220,221\n221,220\n221,83\n221,225\n222,134\n222,104\n223,137\n223,227\n224,219\n224,137\n224,71\n225,221\n225,216\n226,230\n226,229\n227,223\n227,169\n228,216\n228,187\n229,226\n229,168\n229,137\n230,226\n230,187\n231,73\n231,53\n232,124\n232,41\n233,234\n234,233\n234,143\n235,129\n236,135\n236,134\n236,237\n237,236\n238,4423\n238,318\n238,252\n239,354\n239,333\n239,240\n240,239\n240,337\n240,327\n240,316\n241,351\n241,242\n242,241\n242,366\n242,365\n242,364\n242,363\n242,284\n243,355\n243,342\n244,361\n244,335\n245,247\n246,378\n246,371\n246,298\n246,257\n246,247\n247,246\n247,245\n247,330\n248,250\n249,360\n249,313\n249,312\n249,305\n249,280\n249,250\n250,249\n250,248\n251,370\n251,367\n251,319\n251,289\n251,252\n252,251\n252,238\n252,376\n252,322\n252,289\n252,253\n253,252\n253,4362\n253,337\n254,329\n254,284\n254,255\n255,254\n255,299\n255,285\n256,259\n257,246\n257,381\n257,368\n257,360\n257,310\n257,259\n258,311\n258,306\n258,299\n259,257\n259,256\n260,382\n260,369\n260,350\n260,287\n260,261\n261,260\n261,334\n261,267\n261,262\n262,261\n262,345\n262,344\n263,4415\n263,321\n264,334\n264,281\n265,308\n266,350\n266,267\n267,266\n267,261\n268,269\n269,268\n269,362\n269,346\n270,274\n271,274\n272,372\n272,274\n273,274\n274,273\n274,272\n274,271\n274,270\n274,362\n274,325\n274,275\n275,274\n276,351\n276,286\n277,342\n277,314\n278,378\n278,335\n278,298\n279,313\n279,302\n279,295\n279,282\n279,280\n280,279\n280,249\n280,360\n280,313\n280,312\n280,305\n281,264\n281,334\n282,279\n282,313\n282,302\n282,295\n282,284\n283,284\n284,283\n284,282\n284,254\n284,242\n284,366\n284,305\n284,296\n284,285\n285,284\n285,255\n285,1178\n285,316\n285,306\n286,276\n287,260\n287,351\n288,290\n289,252\n289,251\n290,288\n290,4435\n290,336\n291,292\n292,291\n292,362\n292,325\n293,298\n294,300\n295,282\n295,279\n295,313\n295,302\n295,296\n296,295\n296,284\n296,365\n297,340\n297,308\n297,300\n298,293\n298,278\n298,246\n298,343\n298,335\n298,299\n299,298\n299,258\n299,255\n299,362\n299,316\n300,297\n300,294\n301,302\n302,301\n302,295\n302,282\n302,279\n302,313\n303,316\n303,307\n304,305\n305,304\n305,284\n305,280\n305,249\n305,313\n305,306\n306,305\n306,285\n306,258\n306,316\n307,303\n308,297\n308,265\n308,340\n308,323\n309,4431\n309,358\n309,353\n310,257\n310,368\n310,311\n311,310\n311,258\n311,345\n311,344\n312,280\n312,249\n312,313\n313,312\n313,305\n313,302\n313,295\n313,282\n313,280\n313,279\n313,249\n314,277\n314,326\n314,315\n315,314\n315,356\n315,316\n316,315\n316,306\n316,303\n316,299\n316,285\n316,240\n316,337\n317,1119\n317,318\n318,317\n318,238\n318,336\n319,251\n319,370\n319,322\n319,320\n320,319\n320,321\n321,320\n321,263\n321,4341\n322,319\n322,252\n323,308\n324,325\n325,324\n325,292\n325,274\n326,314\n326,4428\n327,240\n327,379\n327,328\n328,327\n329,254\n329,330\n330,329\n330,247\n330,357\n331,380\n331,340\n332,355\n332,353\n332,333\n333,332\n333,239\n334,281\n334,264\n334,261\n334,352\n335,298\n335,278\n335,244\n335,373\n336,318\n336,290\n336,338\n336,337\n337,336\n337,316\n337,253\n337,240\n338,336\n338,339\n339,338\n340,331\n340,308\n340,297\n340,341\n341,340\n341,346\n342,277\n342,243\n342,355\n342,343\n343,342\n343,298\n344,311\n344,262\n345,311\n345,262\n346,341\n346,269\n347,352\n348,352\n349,350\n350,349\n350,266\n350,260\n350,369\n351,287\n351,276\n351,241\n351,352\n352,351\n352,348\n352,347\n352,334\n353,332\n353,309\n353,4425\n353,374\n353,355\n353,354\n354,353\n354,239\n354,4426\n355,353\n355,342\n355,332\n355,243\n355,356\n356,355\n356,315\n357,330\n357,377\n358,309\n359,361\n360,280\n360,257\n360,249\n360,381\n361,359\n361,244\n361,362\n362,361\n362,299\n362,292\n362,274\n362,269\n363,242\n364,242\n365,296\n365,242\n366,284\n366,242\n367,251\n367,370\n368,310\n368,257\n369,350\n369,260\n370,367\n370,319\n370,251\n371,246\n371,378\n372,272\n373,335\n374,353\n375,378\n376,252\n377,357\n378,375\n378,371\n378,278\n378,246\n379,327\n380,331\n381,360\n381,257\n382,260\n383,462\n383,455\n383,454\n383,445\n383,429\n383,384\n384,383\n384,447\n384,426\n384,393\n385,386\n386,385\n386,0\n386,2307\n386,446\n386,445\n386,387\n387,386\n388,430\n389,2282\n389,437\n390,391\n391,390\n391,423\n391,409\n391,394\n391,392\n392,391\n392,436\n392,425\n392,406\n392,402\n393,384\n393,2223\n393,447\n393,396\n393,395\n394,391\n394,457\n394,442\n395,393\n395,0\n395,2393\n395,2213\n395,419\n396,393\n396,2283\n396,2231\n396,420\n396,400\n396,399\n396,398\n396,397\n397,396\n398,396\n399,396\n400,396\n401,402\n402,401\n402,392\n402,439\n402,436\n402,435\n402,411\n402,403\n403,402\n404,405\n405,404\n405,460\n405,457\n405,431\n405,406\n406,405\n406,392\n407,408\n408,407\n408,456\n408,451\n408,437\n409,391\n409,431\n410,411\n411,410\n411,402\n411,1216\n412,1248\n412,473\n413,468\n413,464\n413,462\n413,459\n413,452\n413,415\n413,414\n414,413\n414,425\n415,413\n416,469\n416,450\n416,444\n416,430\n416,417\n417,416\n418,421\n419,395\n419,456\n419,421\n420,396\n420,2283\n420,426\n420,421\n421,420\n421,419\n421,418\n422,1784\n422,1424\n422,439\n423,391\n423,430\n424,444\n424,443\n424,425\n425,424\n425,414\n425,392\n425,426\n426,425\n426,420\n426,384\n426,3987\n426,447\n426,427\n427,426\n427,1125\n428,459\n428,452\n429,383\n429,470\n429,446\n430,423\n430,416\n430,388\n430,469\n430,441\n431,409\n431,405\n431,472\n431,433\n431,432\n432,431\n432,436\n433,431\n434,435\n435,434\n435,402\n435,1297\n435,461\n436,432\n436,402\n436,392\n437,408\n437,389\n438,473\n438,472\n438,439\n439,438\n439,422\n439,402\n440,441\n441,440\n441,430\n441,442\n442,441\n442,394\n442,466\n443,424\n443,468\n443,464\n444,424\n444,416\n445,386\n445,383\n446,429\n446,386\n447,426\n447,393\n447,384\n448,449\n449,448\n449,467\n449,465\n450,416\n450,468\n451,408\n451,0\n451,453\n452,428\n452,413\n453,451\n453,463\n454,383\n454,470\n454,455\n455,454\n455,383\n455,459\n456,419\n456,408\n456,465\n457,405\n457,394\n457,460\n458,461\n459,455\n459,428\n459,413\n460,457\n460,405\n461,458\n461,435\n462,413\n462,383\n463,453\n463,467\n464,443\n464,413\n464,469\n465,456\n465,449\n466,442\n467,463\n467,449\n468,450\n468,443\n468,413\n469,464\n469,430\n469,416\n470,454\n470,429\n471,472\n472,471\n472,438\n472,431\n473,438\n473,412\n474,4173\n474,481\n475,4446\n475,4113\n476,477\n477,476\n477,484\n477,480\n478,498\n478,492\n478,479\n479,478\n479,481\n479,480\n480,479\n480,477\n480,493\n481,479\n481,474\n481,4111\n481,491\n482,495\n482,494\n482,489\n482,485\n483,3769\n483,484\n484,483\n484,477\n484,496\n484,493\n484,485\n485,484\n485,482\n485,498\n485,497\n485,489\n485,486\n486,485\n486,494\n487,491\n488,1201\n488,1183\n489,485\n489,482\n490,2949\n490,2836\n490,2835\n490,2834\n490,2832\n490,2799\n490,2680\n490,2548\n490,2543\n490,2542\n490,2426\n491,487\n491,481\n492,478\n492,497\n492,493\n493,492\n493,484\n493,480\n493,4446\n494,486\n494,482\n495,482\n495,496\n496,495\n496,484\n496,91\n496,499\n497,492\n497,485\n498,485\n498,478\n499,496\n499,214\n500,501\n501,500\n501,573\n501,570\n501,549\n502,504\n503,504\n504,503\n504,502\n504,564\n504,556\n504,523\n505,551\n505,548\n506,565\n506,546\n506,539\n507,566\n507,546\n507,539\n508,566\n508,565\n509,572\n509,571\n509,545\n510,561\n511,551\n511,550\n511,538\n511,534\n511,513\n511,512\n512,511\n513,511\n514,4458\n515,519\n516,520\n517,520\n518,3982\n518,520\n519,515\n519,520\n520,519\n520,518\n520,517\n520,516\n520,2312\n521,4458\n521,4448\n521,832\n521,828\n521,522\n522,521\n522,116\n522,4120\n522,570\n523,504\n523,532\n523,525\n523,524\n524,523\n524,528\n525,523\n525,530\n526,4145\n526,532\n526,527\n527,526\n528,524\n528,530\n528,529\n529,528\n530,528\n530,525\n530,531\n531,530\n532,526\n532,523\n532,573\n532,568\n532,564\n532,556\n532,548\n532,533\n533,532\n533,570\n534,511\n534,550\n534,538\n535,574\n535,559\n535,536\n536,535\n536,557\n536,537\n537,536\n538,534\n538,511\n538,551\n539,507\n539,506\n539,544\n539,543\n539,542\n539,541\n539,540\n540,539\n540,569\n541,539\n541,569\n542,539\n542,550\n543,539\n543,565\n543,561\n543,545\n544,539\n544,566\n544,561\n544,545\n545,544\n545,543\n545,509\n546,507\n546,506\n546,559\n546,558\n546,554\n546,553\n547,555\n547,548\n548,547\n548,532\n548,505\n548,568\n548,552\n548,551\n548,549\n549,548\n549,501\n550,542\n550,534\n550,511\n550,551\n551,550\n551,548\n551,538\n551,511\n551,505\n552,548\n552,555\n553,546\n553,555\n554,546\n554,555\n555,554\n555,553\n555,552\n555,547\n556,532\n556,504\n556,563\n557,536\n557,563\n557,558\n558,557\n558,546\n558,562\n559,546\n559,535\n560,561\n561,560\n561,544\n561,543\n561,510\n562,558\n562,563\n563,562\n563,557\n563,556\n564,532\n564,504\n564,4211\n564,1482\n564,1481\n565,543\n565,508\n565,506\n566,544\n566,508\n566,507\n567,568\n568,567\n568,548\n568,532\n569,541\n569,540\n569,4458\n569,570\n570,569\n570,533\n570,522\n570,501\n570,4164\n571,509\n572,509\n573,532\n573,501\n574,535\n575,730\n575,660\n575,659\n575,657\n576,640\n576,625\n576,582\n577,578\n578,577\n578,610\n578,594\n579,702\n579,664\n580,725\n580,720\n581,626\n581,585\n582,576\n582,645\n582,612\n582,584\n582,583\n583,582\n584,582\n584,680\n584,672\n584,667\n584,652\n584,585\n585,584\n585,581\n585,614\n586,587\n587,586\n587,703\n587,679\n587,669\n587,624\n587,618\n588,597\n589,692\n589,594\n589,591\n589,590\n590,589\n591,589\n592,630\n592,597\n592,593\n593,592\n594,589\n594,578\n594,705\n594,628\n594,596\n594,595\n595,594\n596,594\n597,592\n597,588\n597,657\n597,620\n597,602\n597,601\n597,600\n597,599\n597,598\n598,597\n599,597\n600,597\n601,597\n602,597\n603,604\n604,603\n604,691\n604,657\n604,606\n604,605\n605,604\n605,666\n605,658\n606,604\n607,610\n608,609\n609,608\n609,662\n609,657\n609,611\n609,610\n610,609\n610,607\n610,578\n610,722\n611,609\n612,582\n612,700\n612,640\n612,613\n613,612\n613,614\n614,613\n614,585\n614,676\n614,636\n614,619\n615,616\n616,615\n616,725\n616,639\n617,618\n618,617\n618,587\n618,668\n619,614\n619,626\n620,597\n621,622\n622,621\n622,736\n622,653\n623,624\n624,623\n624,587\n624,708\n624,668\n624,655\n625,576\n626,619\n626,581\n627,628\n628,627\n628,594\n628,658\n629,630\n630,629\n630,592\n630,696\n631,632\n632,631\n632,718\n632,689\n632,668\n632,639\n632,634\n633,634\n634,633\n634,632\n634,725\n635,636\n636,635\n636,614\n636,648\n637,728\n637,713\n637,709\n637,671\n638,639\n639,638\n639,632\n639,616\n639,725\n639,685\n639,681\n639,653\n640,612\n640,576\n640,641\n641,640\n642,658\n643,644\n644,643\n644,687\n644,648\n645,582\n645,704\n645,646\n646,645\n647,648\n648,647\n648,644\n648,636\n649,650\n650,649\n650,725\n651,653\n652,584\n652,726\n652,680\n652,653\n653,652\n653,651\n653,639\n653,622\n653,725\n653,685\n654,655\n655,654\n655,624\n655,689\n655,669\n656,658\n657,609\n657,604\n657,597\n657,575\n657,696\n657,658\n658,657\n658,656\n658,642\n658,628\n658,605\n658,738\n658,712\n659,575\n660,575\n661,662\n662,661\n662,609\n662,691\n663,664\n664,663\n664,579\n665,666\n666,665\n666,605\n666,692\n667,584\n667,726\n667,680\n667,668\n668,667\n668,632\n668,624\n668,618\n668,718\n669,655\n669,587\n670,704\n671,637\n671,713\n671,672\n672,671\n672,584\n672,674\n672,673\n673,672\n674,672\n675,702\n675,676\n676,675\n676,614\n677,725\n677,720\n678,679\n679,678\n679,587\n679,681\n680,667\n680,652\n680,584\n680,726\n680,693\n680,683\n680,682\n680,681\n681,680\n681,679\n681,639\n681,708\n681,702\n681,687\n681,685\n682,680\n683,680\n684,685\n685,684\n685,681\n685,653\n685,639\n686,687\n687,686\n687,681\n687,644\n688,689\n689,688\n689,655\n689,632\n689,732\n690,691\n691,690\n691,662\n691,604\n692,666\n692,589\n692,3769\n692,738\n692,726\n692,694\n693,680\n694,692\n694,726\n694,695\n695,694\n696,657\n696,630\n696,697\n697,696\n698,728\n698,699\n699,698\n700,612\n700,702\n701,702\n702,701\n702,700\n702,681\n702,675\n702,579\n702,734\n703,587\n704,670\n704,645\n704,713\n705,594\n706,709\n706,707\n707,706\n708,681\n708,624\n709,706\n709,637\n709,710\n710,709\n711,712\n712,711\n712,658\n712,722\n713,704\n713,671\n713,637\n713,714\n714,713\n715,716\n716,715\n716,720\n717,718\n718,717\n718,668\n718,632\n719,720\n720,719\n720,716\n720,677\n720,580\n720,727\n720,725\n721,722\n722,721\n722,712\n722,610\n722,723\n723,722\n724,725\n725,724\n725,720\n725,677\n725,653\n725,650\n725,639\n725,634\n725,616\n725,580\n725,726\n726,725\n726,694\n726,692\n726,680\n726,667\n726,652\n726,3781\n727,720\n728,698\n728,637\n728,729\n729,728\n730,575\n731,732\n732,731\n732,689\n733,734\n734,733\n734,702\n734,736\n735,736\n736,735\n736,734\n736,622\n737,738\n738,737\n738,692\n738,658\n739,763\n739,749\n739,740\n740,739\n740,815\n740,757\n740,750\n740,748\n741,744\n742,779\n742,762\n742,759\n742,743\n743,742\n743,804\n743,777\n743,760\n743,745\n743,744\n744,743\n744,741\n744,1230\n744,815\n744,802\n744,746\n745,743\n746,744\n747,780\n748,740\n748,805\n748,775\n748,751\n748,750\n749,739\n749,805\n749,752\n750,748\n750,740\n750,776\n750,757\n750,753\n751,748\n752,749\n752,2413\n753,750\n753,2414\n754,803\n754,783\n754,764\n755,757\n756,787\n756,757\n757,756\n757,755\n757,750\n757,740\n757,791\n757,758\n758,757\n758,824\n758,823\n758,813\n758,812\n759,742\n759,778\n759,762\n759,760\n760,759\n760,743\n760,814\n761,762\n762,761\n762,759\n762,742\n762,789\n762,780\n762,778\n763,739\n763,815\n763,814\n763,777\n764,754\n764,820\n764,774\n765,766\n766,765\n766,803\n767,771\n768,772\n769,772\n770,797\n770,785\n770,771\n771,770\n771,767\n771,786\n771,773\n771,772\n772,771\n772,769\n772,768\n772,824\n772,823\n773,771\n774,764\n774,817\n774,781\n775,748\n776,750\n776,4928\n776,786\n777,763\n777,743\n777,2417\n778,762\n778,759\n778,814\n779,742\n779,795\n779,789\n780,762\n780,747\n780,803\n780,799\n780,789\n780,784\n780,783\n780,781\n781,780\n781,774\n782,4934\n782,803\n783,780\n783,754\n783,800\n783,791\n784,780\n785,770\n785,786\n786,785\n786,776\n786,771\n787,756\n787,803\n787,791\n788,789\n789,788\n789,780\n789,779\n789,762\n790,2417\n790,2304\n791,787\n791,783\n791,757\n791,803\n792,793\n793,792\n793,1214\n793,811\n793,794\n794,793\n794,804\n795,779\n795,808\n795,804\n795,796\n796,795\n797,770\n798,799\n799,798\n799,780\n800,783\n800,1257\n800,1230\n800,801\n801,800\n802,744\n802,2207\n803,791\n803,787\n803,782\n803,780\n803,766\n803,754\n803,821\n803,807\n804,795\n804,794\n804,743\n804,1402\n805,749\n805,748\n806,807\n807,806\n807,803\n808,795\n808,809\n809,808\n809,822\n810,811\n811,810\n811,793\n811,1124\n811,822\n812,758\n812,1227\n813,758\n813,1228\n814,778\n814,763\n814,760\n815,763\n815,744\n815,740\n815,816\n816,815\n817,774\n817,818\n818,817\n818,819\n819,818\n819,4940\n819,820\n820,819\n820,764\n821,803\n822,811\n822,809\n822,1124\n823,772\n823,758\n824,772\n824,758\n825,844\n825,826\n826,825\n826,4462\n826,829\n827,877\n827,858\n827,845\n827,828\n828,827\n828,521\n828,837\n829,826\n829,4458\n829,836\n829,834\n830,4444\n831,932\n831,920\n831,919\n831,910\n831,906\n831,905\n831,904\n831,903\n831,895\n831,869\n831,868\n831,867\n831,855\n831,832\n832,831\n832,521\n833,891\n833,874\n833,866\n833,862\n833,854\n833,834\n834,833\n834,829\n835,896\n835,892\n835,836\n836,835\n836,829\n837,828\n837,4458\n837,872\n837,871\n837,853\n838,853\n838,839\n839,838\n839,840\n840,839\n840,2351\n841,842\n842,841\n842,4179\n843,4457\n843,863\n843,862\n843,861\n844,825\n844,865\n844,846\n845,827\n845,903\n845,877\n846,844\n846,912\n846,900\n846,894\n846,884\n846,880\n846,870\n846,860\n846,847\n847,846\n847,911\n847,848\n848,847\n848,889\n848,888\n848,887\n848,886\n848,879\n849,909\n849,908\n849,907\n849,855\n850,898\n850,854\n851,854\n852,902\n852,900\n852,873\n852,865\n852,853\n853,852\n853,838\n853,837\n854,851\n854,850\n854,833\n854,891\n854,864\n854,863\n854,861\n854,859\n854,855\n855,854\n855,849\n855,831\n855,860\n855,856\n856,855\n856,4458\n857,902\n857,893\n857,882\n858,827\n858,885\n859,854\n859,883\n859,881\n859,864\n859,860\n860,859\n860,855\n860,846\n861,854\n861,843\n862,843\n862,833\n863,854\n863,843\n864,859\n864,854\n864,921\n864,883\n865,852\n865,844\n866,833\n867,831\n868,831\n869,831\n869,899\n869,895\n870,846\n871,837\n871,928\n871,885\n872,837\n872,929\n873,852\n873,930\n874,833\n874,901\n874,897\n874,885\n875,893\n875,881\n875,878\n875,876\n876,875\n876,895\n876,894\n877,845\n877,827\n878,875\n878,930\n878,929\n878,928\n878,892\n879,848\n880,846\n880,900\n881,875\n881,859\n881,891\n882,857\n882,931\n882,883\n883,882\n883,864\n883,859\n883,884\n884,883\n884,846\n885,874\n885,871\n885,858\n885,928\n886,848\n887,848\n888,848\n889,848\n890,929\n890,902\n891,881\n891,854\n891,833\n892,878\n892,835\n892,896\n893,875\n893,857\n893,894\n894,893\n894,876\n894,846\n895,876\n895,869\n895,831\n895,897\n895,896\n896,895\n896,892\n896,835\n897,895\n897,874\n898,850\n899,869\n899,930\n900,880\n900,852\n900,846\n901,874\n901,928\n902,890\n902,857\n902,852\n902,931\n902,929\n902,928\n903,845\n903,831\n904,831\n905,831\n906,831\n907,849\n908,849\n909,849\n910,831\n911,847\n912,846\n912,918\n912,917\n913,917\n914,917\n915,918\n916,918\n917,914\n917,913\n917,912\n918,916\n918,915\n918,912\n919,831\n920,831\n921,864\n921,927\n921,926\n922,926\n923,926\n924,927\n925,927\n926,923\n926,922\n926,921\n927,925\n927,924\n927,921\n928,902\n928,901\n928,885\n928,878\n928,871\n928,929\n929,928\n929,902\n929,890\n929,878\n929,872\n930,899\n930,878\n930,873\n931,902\n931,882\n932,831\n933,1053\n933,1014\n934,969\n934,936\n934,935\n935,934\n935,969\n936,934\n936,941\n937,1050\n937,1010\n937,954\n937,938\n938,937\n939,984\n939,961\n939,956\n939,940\n940,939\n940,1051\n940,1036\n940,1016\n941,936\n941,1014\n941,994\n941,942\n942,941\n942,959\n942,946\n943,1028\n943,1005\n943,1003\n943,944\n944,943\n944,1028\n944,995\n944,945\n945,944\n945,1058\n945,1006\n946,942\n946,947\n947,946\n948,1048\n948,1047\n948,964\n948,950\n948,949\n949,948\n949,1043\n949,962\n949,951\n950,948\n950,1034\n950,970\n950,951\n951,950\n951,949\n951,1000\n951,978\n951,971\n952,1056\n952,1024\n952,1023\n952,975\n952,953\n953,952\n953,1052\n953,1030\n953,1011\n953,983\n954,937\n954,1050\n954,973\n955,983\n956,939\n956,1050\n956,1015\n956,957\n957,956\n958,1049\n958,993\n958,959\n959,958\n959,942\n959,1006\n960,987\n960,965\n961,939\n961,1055\n962,949\n962,993\n963,1030\n963,1013\n963,991\n964,948\n964,1025\n965,960\n965,1021\n965,973\n965,966\n966,965\n966,997\n967,1026\n967,968\n968,967\n968,1057\n968,1006\n969,935\n969,934\n969,1021\n969,995\n970,950\n970,996\n970,971\n971,970\n971,951\n971,1037\n971,1026\n972,973\n973,972\n973,965\n973,954\n973,1021\n974,1031\n974,1024\n974,1023\n975,952\n975,1054\n975,1010\n976,1048\n976,1034\n977,1047\n977,992\n978,951\n978,1005\n979,68\n979,1036\n979,980\n980,979\n980,4855\n981,1055\n981,1015\n981,982\n982,981\n983,955\n983,953\n984,939\n984,1050\n984,985\n985,984\n986,1044\n986,1012\n986,1010\n987,960\n987,989\n987,988\n988,987\n989,987\n989,80\n989,997\n990,994\n991,963\n991,1054\n991,1011\n992,977\n992,1047\n992,998\n992,993\n993,992\n993,962\n993,958\n993,1049\n994,990\n994,941\n994,999\n995,969\n995,944\n995,1028\n996,970\n996,1001\n997,989\n997,966\n997,184\n997,1057\n997,1006\n998,992\n998,1034\n999,994\n1000,951\n1000,1026\n1001,996\n1001,1002\n1002,1001\n1002,1005\n1003,943\n1003,1045\n1004,1028\n1004,1021\n1005,1002\n1005,978\n1005,943\n1005,1049\n1005,1037\n1005,1026\n1005,1014\n1005,1009\n1005,1008\n1005,1007\n1005,1006\n1006,1005\n1006,997\n1006,968\n1006,959\n1006,945\n1006,1057\n1007,1005\n1008,1005\n1009,1005\n1010,986\n1010,975\n1010,937\n1010,1056\n1010,1011\n1011,1010\n1011,991\n1011,953\n1012,986\n1012,1044\n1012,1013\n1013,1012\n1013,963\n1014,1005\n1014,941\n1014,933\n1015,981\n1015,956\n1015,1016\n1016,1015\n1016,940\n1016,1017\n1017,1016\n1018,1022\n1018,1019\n1019,1018\n1019,1050\n1019,1046\n1019,1031\n1020,1021\n1021,1020\n1021,1004\n1021,973\n1021,969\n1021,965\n1022,1018\n1022,1059\n1022,1050\n1022,1046\n1023,974\n1023,952\n1023,1059\n1023,1050\n1024,974\n1024,952\n1024,1059\n1024,1050\n1025,964\n1025,1026\n1026,1025\n1026,1005\n1026,1000\n1026,971\n1026,967\n1026,1045\n1026,1043\n1026,1027\n1027,1026\n1028,1004\n1028,995\n1028,944\n1028,943\n1029,1030\n1030,1029\n1030,963\n1030,953\n1030,105\n1030,69\n1030,4894\n1030,1040\n1030,1039\n1030,1038\n1030,1033\n1031,1019\n1031,974\n1031,1046\n1031,1032\n1032,1031\n1032,1052\n1033,1030\n1033,4902\n1034,998\n1034,976\n1034,950\n1034,1035\n1035,1034\n1035,1049\n1036,979\n1036,940\n1037,1005\n1037,971\n1038,1030\n1039,1030\n1040,1030\n1041,1056\n1041,1044\n1041,1042\n1042,1041\n1043,1026\n1043,949\n1044,1041\n1044,1012\n1044,986\n1045,1026\n1045,1003\n1046,1031\n1046,1022\n1046,1019\n1046,1059\n1047,992\n1047,977\n1047,948\n1048,976\n1048,948\n1049,1035\n1049,1005\n1049,993\n1049,958\n1050,1024\n1050,1023\n1050,1022\n1050,1019\n1050,984\n1050,956\n1050,954\n1050,937\n1050,1052\n1050,1051\n1051,1050\n1051,940\n1052,1050\n1052,1032\n1052,953\n1052,69\n1052,1058\n1053,933\n1054,991\n1054,975\n1055,981\n1055,961\n1055,105\n1056,1041\n1056,1010\n1056,952\n1057,1006\n1057,997\n1057,968\n1058,1052\n1058,945\n1059,1046\n1059,1024\n1059,1023\n1059,1022\n1060,2035\n1060,2002\n1060,1542\n1060,1062\n1060,1061\n1061,1060\n1061,1444\n1062,1060\n1062,1444\n1063,1809\n1063,1625\n1063,1331\n1063,1160\n1063,1065\n1064,1176\n1065,1063\n1065,1119\n1065,1091\n1066,2069\n1066,1901\n1066,1852\n1067,1969\n1067,1418\n1067,1068\n1068,1067\n1068,1419\n1069,1566\n1069,1498\n1069,1497\n1069,1300\n1069,1197\n1069,1196\n1069,1070\n1070,1069\n1070,1371\n1070,1269\n1071,2028\n1071,1615\n1071,1553\n1072,1554\n1072,1469\n1072,1314\n1072,1280\n1072,1208\n1072,1191\n1072,1073\n1073,1072\n1073,1313\n1073,1192\n1074,1506\n1074,1159\n1074,1076\n1075,1905\n1075,1217\n1075,1076\n1076,1075\n1076,1074\n1077,1224\n1078,1459\n1078,1313\n1078,1306\n1078,1244\n1078,1079\n1079,1078\n1080,1559\n1080,1334\n1081,1942\n1081,1560\n1081,1154\n1082,1750\n1082,1728\n1082,1510\n1082,1224\n1083,1503\n1083,1446\n1083,1295\n1084,1224\n1084,1098\n1085,1478\n1085,1420\n1085,1367\n1085,1351\n1085,1087\n1085,1086\n1086,1085\n1086,1097\n1086,1091\n1086,1088\n1087,1085\n1087,1624\n1087,1223\n1087,1220\n1087,1090\n1087,1088\n1088,1087\n1088,1086\n1088,1401\n1088,1091\n1089,1556\n1089,1446\n1089,1311\n1090,1087\n1090,2017\n1090,1959\n1090,1630\n1090,1496\n1090,1165\n1090,1108\n1090,1091\n1091,1090\n1091,1088\n1091,1086\n1091,1065\n1091,1525\n1091,1504\n1091,1429\n1091,1353\n1091,1166\n1091,1092\n1092,1091\n1092,1488\n1093,2135\n1093,2096\n1093,1095\n1093,1094\n1094,1093\n1094,1447\n1094,1177\n1095,1093\n1095,2159\n1095,2091\n1095,2071\n1095,1446\n1095,1386\n1096,2109\n1096,1285\n1096,1097\n1097,1096\n1097,1086\n1097,1379\n1097,1343\n1098,1084\n1098,1914\n1098,1731\n1098,1713\n1098,1677\n1098,1490\n1098,1193\n1098,1099\n1099,1098\n1099,1334\n1100,2179\n1100,2176\n1100,2062\n1100,1530\n1100,1276\n1100,1101\n1101,1100\n1101,2139\n1101,1277\n1102,1573\n1102,1422\n1102,1338\n1102,1226\n1102,1103\n1103,1102\n1103,1442\n1103,1143\n1104,2121\n1104,2061\n1104,1753\n1104,1717\n1104,1556\n1104,1460\n1105,1948\n1105,1666\n1105,1179\n1105,1145\n1105,1106\n1106,1105\n1106,1877\n1106,1810\n1106,1323\n1106,1317\n1106,1249\n1106,1180\n1106,1143\n1106,1136\n1106,1107\n1107,1106\n1107,1365\n1107,1267\n1107,1137\n1108,1090\n1108,1496\n1108,1240\n1109,1495\n1109,1471\n1109,1210\n1110,1111\n1111,1110\n1111,1459\n1112,1581\n1112,1579\n1113,1116\n1114,1932\n1114,1837\n1115,1969\n1115,1603\n1115,1543\n1116,1113\n1116,1552\n1116,1499\n1116,1454\n1116,1453\n1117,2195\n1117,1584\n1117,1463\n1117,1461\n1117,1436\n1117,1189\n1118,1825\n1118,1119\n1119,1118\n1119,1065\n1119,317\n1119,4437\n1119,1429\n1119,1176\n1120,1956\n1120,1825\n1121,1122\n1122,1121\n1122,1275\n1122,1163\n1123,1459\n1123,1313\n1123,1243\n1124,822\n1124,811\n1124,2021\n1124,1576\n1125,427\n1125,1476\n1126,1128\n1126,1127\n1127,1126\n1127,1863\n1128,1126\n1128,1401\n1128,1353\n1129,1226\n1129,1187\n1130,1942\n1130,1830\n1131,2557\n1131,1330\n1131,1308\n1131,1243\n1132,1605\n1132,1493\n1132,1135\n1133,1609\n1133,1323\n1133,1242\n1134,1610\n1134,1531\n1134,1416\n1135,1132\n1135,1534\n1135,1451\n1136,1106\n1136,1139\n1136,1138\n1136,1137\n1137,1136\n1137,1107\n1138,1136\n1139,1136\n1140,1620\n1140,1619\n1140,1486\n1140,1458\n1140,1361\n1140,1345\n1140,1332\n1140,1301\n1141,1142\n1142,1141\n1142,1874\n1142,1474\n1143,1106\n1143,1103\n1143,1622\n1143,1434\n1144,1222\n1145,1105\n1145,1955\n1145,1491\n1146,1148\n1147,2064\n1147,2063\n1147,1207\n1147,1166\n1147,1148\n1148,1147\n1148,1146\n1148,1452\n1148,1340\n1148,1167\n1149,1696\n1149,1150\n1150,1149\n1150,1283\n1150,1275\n1151,1530\n1151,1489\n1151,1473\n1151,1356\n1151,1335\n1152,1484\n1152,1357\n1152,1170\n1153,1730\n1153,1405\n1154,1081\n1154,1197\n1155,1971\n1155,1774\n1155,1156\n1156,1155\n1156,1260\n1156,1221\n1156,1161\n1157,1749\n1157,1736\n1157,1326\n1158,1905\n1158,1770\n1158,1684\n1158,1505\n1158,1159\n1159,1158\n1159,1074\n1159,1506\n1159,1416\n1159,1322\n1159,1170\n1159,1166\n1160,1063\n1160,2092\n1160,1956\n1161,1156\n1161,1501\n1161,1260\n1162,1641\n1162,1517\n1162,1241\n1162,1163\n1163,1162\n1163,1122\n1163,1299\n1164,2189\n1164,2184\n1164,1865\n1164,1435\n1165,1090\n1165,2015\n1165,1853\n1165,1777\n1165,1166\n1166,1165\n1166,1159\n1166,1147\n1166,1091\n1166,1646\n1166,1525\n1166,1438\n1166,1413\n1166,1168\n1166,1167\n1167,1166\n1167,1148\n1167,1541\n1167,1244\n1168,1166\n1169,1403\n1169,1170\n1170,1169\n1170,1159\n1170,1152\n1170,1531\n1170,1486\n1170,1484\n1170,1309\n1170,1201\n1170,1175\n1170,1171\n1171,1170\n1171,1403\n1172,2180\n1173,1649\n1173,1531\n1173,1487\n1173,1486\n1173,1484\n1173,1468\n1174,1518\n1174,1184\n1175,1170\n1175,1467\n1175,1201\n1176,1119\n1176,1064\n1176,1504\n1177,1094\n1177,1387\n1177,1265\n1177,1178\n1178,1177\n1178,285\n1178,1340\n1179,1105\n1180,1106\n1181,2164\n1181,1735\n1182,1398\n1182,1190\n1183,488\n1183,1467\n1184,1174\n1184,2447\n1185,1442\n1186,2075\n1186,2050\n1186,1949\n1187,1129\n1187,1469\n1188,1189\n1189,1188\n1189,1117\n1189,1234\n1190,1182\n1190,1845\n1190,1191\n1191,1190\n1191,1072\n1191,1407\n1191,1246\n1191,1192\n1192,1191\n1192,1073\n1192,1330\n1193,1098\n1193,1528\n1194,1678\n1194,1195\n1195,1194\n1195,1521\n1195,1452\n1195,1416\n1196,1069\n1196,1197\n1197,1196\n1197,1154\n1197,1069\n1198,1512\n1198,1349\n1199,1891\n1199,1348\n1199,1200\n1200,1199\n1200,1892\n1201,1175\n1201,1170\n1201,488\n1201,1309\n1202,1204\n1202,1203\n1203,1202\n1203,1364\n1204,1202\n1204,1488\n1204,1253\n1205,2086\n1205,1449\n1205,1290\n1206,2037\n1206,1989\n1206,1866\n1206,1705\n1206,1359\n1206,1207\n1207,1206\n1207,1147\n1208,1072\n1208,1794\n1208,1441\n1209,1679\n1209,1467\n1209,1309\n1210,1109\n1210,2076\n1210,1536\n1210,1211\n1211,1210\n1212,1770\n1212,1213\n1213,1212\n1213,1346\n1214,793\n1214,1774\n1215,1216\n1216,1215\n1216,411\n1216,1512\n1217,1075\n1217,1425\n1218,1687\n1218,1450\n1218,1385\n1218,1247\n1219,1912\n1219,1767\n1219,1689\n1219,1417\n1219,1407\n1220,1087\n1220,1251\n1221,1156\n1221,1292\n1222,1144\n1222,1254\n1223,1087\n1223,1524\n1224,1084\n1224,1082\n1224,1077\n1224,2194\n1224,1799\n1224,1746\n1224,1727\n1224,1647\n1224,1594\n1224,1432\n1224,1262\n1224,1225\n1225,1224\n1225,1326\n1226,1129\n1226,1102\n1226,1709\n1227,812\n1227,1231\n1228,813\n1228,1231\n1229,1524\n1229,1478\n1229,1254\n1230,800\n1230,744\n1230,1402\n1230,1231\n1231,1230\n1231,1228\n1231,1227\n1231,1488\n1232,1246\n1232,1239\n1233,1234\n1234,1233\n1234,1189\n1234,1461\n1235,1902\n1235,1723\n1235,1577\n1235,1236\n1236,1235\n1236,1237\n1237,1236\n1237,1810\n1237,1334\n1238,1532\n1238,1239\n1239,1238\n1239,1232\n1239,1483\n1239,1329\n1240,1108\n1241,1162\n1241,1355\n1242,1133\n1242,1995\n1242,1726\n1242,1725\n1242,1291\n1243,1131\n1243,1123\n1243,1423\n1243,1383\n1243,1308\n1243,1267\n1244,1167\n1244,1078\n1244,1507\n1244,1365\n1244,1306\n1244,1267\n1245,1678\n1245,1505\n1246,1232\n1246,1191\n1247,1218\n1247,1384\n1248,412\n1248,1913\n1249,1106\n1249,1256\n1250,1501\n1250,1289\n1251,1220\n1251,1420\n1251,1389\n1252,1349\n1252,1343\n1252,1297\n1252,1253\n1253,1252\n1253,1204\n1253,1304\n1254,1229\n1254,1222\n1255,1798\n1255,1762\n1255,1570\n1256,1249\n1256,1763\n1256,1326\n1257,800\n1257,1992\n1257,1402\n1257,1353\n1257,1292\n1257,1258\n1258,1257\n1258,1488\n1259,1260\n1260,1259\n1260,1161\n1260,1156\n1261,1263\n1262,1224\n1263,1261\n1263,1432\n1264,1799\n1265,1177\n1266,1267\n1267,1266\n1267,1244\n1267,1243\n1267,1107\n1267,1459\n1267,1313\n1268,2182\n1268,1776\n1268,1472\n1268,1410\n1268,1269\n1269,1268\n1269,1070\n1269,1373\n1270,1271\n1271,1270\n1271,1634\n1272,1928\n1272,1626\n1272,1586\n1272,1569\n1272,1274\n1272,1273\n1273,1272\n1273,1361\n1274,1272\n1274,1450\n1275,1150\n1275,1122\n1275,1307\n1276,1100\n1276,1489\n1276,1466\n1276,1352\n1276,1278\n1276,1277\n1277,1276\n1277,1101\n1277,2203\n1278,1276\n1278,2120\n1278,1489\n1278,1435\n1278,1279\n1279,1278\n1279,1463\n1279,1309\n1280,1072\n1280,1786\n1280,1523\n1280,1281\n1281,1280\n1281,1313\n1282,1701\n1282,1283\n1283,1282\n1283,1150\n1283,1377\n1284,1835\n1284,1684\n1284,1526\n1284,1474\n1285,1096\n1285,2141\n1286,1800\n1286,1535\n1286,1300\n1287,1289\n1288,1801\n1288,1289\n1289,1288\n1289,1287\n1289,1250\n1289,1934\n1289,1353\n1290,1205\n1290,1409\n1291,1242\n1291,1994\n1291,1803\n1292,1257\n1292,1221\n1293,1294\n1294,1293\n1294,1306\n1294,1304\n1295,1083\n1296,1629\n1296,1426\n1296,1350\n1296,1297\n1297,1296\n1297,1252\n1297,435\n1298,2158\n1298,1805\n1298,1562\n1298,1532\n1298,1302\n1298,1299\n1299,1298\n1299,1163\n1299,1805\n1299,1329\n1300,1286\n1300,1069\n1300,1807\n1300,1301\n1301,1300\n1301,1140\n1302,1298\n1302,1398\n1303,1304\n1304,1303\n1304,1294\n1304,1253\n1305,1306\n1306,1305\n1306,1294\n1306,1244\n1306,1078\n1306,1433\n1307,1275\n1307,2060\n1307,1812\n1307,1308\n1308,1307\n1308,1243\n1308,1131\n1308,2594\n1308,1476\n1309,1279\n1309,1209\n1309,1201\n1309,1170\n1309,2185\n1309,2139\n1309,2138\n1309,1814\n1309,1436\n1309,1316\n1309,1310\n1310,1309\n1310,1540\n1311,1089\n1311,2192\n1311,2191\n1311,2036\n1311,1446\n1311,1312\n1312,1311\n1312,1447\n1313,1281\n1313,1267\n1313,1123\n1313,1078\n1313,1073\n1313,1443\n1313,1373\n1314,1072\n1314,1912\n1314,1315\n1315,1314\n1315,1816\n1316,1309\n1316,1817\n1316,1467\n1317,1106\n1317,1819\n1317,1406\n1318,1319\n1319,1318\n1319,1458\n1319,1332\n1320,1527\n1320,1440\n1321,2156\n1321,1522\n1321,1505\n1321,1412\n1322,1159\n1322,1416\n1323,1133\n1323,1106\n1323,2098\n1323,2097\n1323,1374\n1323,1338\n1323,1324\n1324,1323\n1324,1365\n1325,1881\n1325,1822\n1325,1326\n1326,1325\n1326,1256\n1326,1225\n1326,1157\n1326,1821\n1326,1580\n1326,1579\n1326,1424\n1326,1328\n1326,1327\n1327,1326\n1327,1459\n1327,1433\n1328,1326\n1329,1299\n1329,1239\n1329,1483\n1329,1330\n1330,1329\n1330,1192\n1330,1131\n1331,1063\n1331,1634\n1332,1319\n1332,1140\n1332,1345\n1333,2016\n1333,1677\n1333,1631\n1333,1346\n1333,1334\n1334,1333\n1334,1237\n1334,1099\n1334,1080\n1334,1515\n1334,1506\n1334,1502\n1334,1438\n1334,1396\n1334,1391\n1334,1369\n1335,1151\n1335,1558\n1335,1356\n1336,1337\n1337,1336\n1337,1997\n1337,1663\n1338,1323\n1338,1102\n1338,1831\n1339,1462\n1339,1341\n1339,1340\n1340,1339\n1340,1178\n1340,1148\n1340,1540\n1341,1339\n1341,1448\n1342,1860\n1342,1508\n1342,1427\n1342,1364\n1342,1343\n1343,1342\n1343,1252\n1343,1097\n1344,1345\n1345,1344\n1345,1332\n1345,1140\n1345,2180\n1346,1333\n1346,1213\n1346,1761\n1347,1842\n1347,1461\n1347,1447\n1348,1199\n1348,1629\n1348,1449\n1348,1426\n1348,1349\n1349,1348\n1349,1252\n1349,1198\n1350,1296\n1350,1364\n1351,1085\n1351,2017\n1352,1276\n1352,2189\n1352,1466\n1352,1435\n1353,1289\n1353,1257\n1353,1128\n1353,1091\n1353,1859\n1353,1379\n1353,1354\n1354,1353\n1355,1241\n1355,1562\n1356,1335\n1356,1151\n1356,2120\n1356,2007\n1356,1558\n1356,1530\n1356,1489\n1356,1357\n1357,1356\n1357,1152\n1357,2139\n1358,1765\n1358,1735\n1359,1206\n1359,2044\n1359,1867\n1359,1719\n1360,1950\n1360,1929\n1360,1775\n1360,1363\n1360,1361\n1361,1360\n1361,1273\n1361,1140\n1361,1864\n1361,1487\n1361,1450\n1361,1444\n1361,1362\n1362,1361\n1362,1371\n1363,1360\n1363,1919\n1363,1471\n1364,1350\n1364,1342\n1364,1203\n1365,1324\n1365,1244\n1365,1107\n1365,1500\n1365,1373\n1366,1516\n1366,1490\n1367,1085\n1367,1624\n1367,1400\n1367,1388\n1368,1975\n1368,1903\n1368,1369\n1369,1368\n1369,1334\n1369,1552\n1370,1495\n1370,1371\n1371,1370\n1371,1362\n1371,1070\n1371,1539\n1371,1538\n1371,1445\n1371,1403\n1372,1451\n1372,1374\n1372,1373\n1373,1372\n1373,1365\n1373,1313\n1373,1269\n1374,1372\n1374,1323\n1374,1451\n1375,1376\n1376,1375\n1376,1422\n1377,1283\n1377,1406\n1377,1382\n1378,2104\n1378,2021\n1378,1593\n1378,1400\n1378,1379\n1379,1378\n1379,1353\n1379,1097\n1380,1893\n1380,1506\n1380,1502\n1381,1397\n1381,1382\n1382,1381\n1382,1377\n1382,1383\n1383,1382\n1383,1243\n1383,1476\n1384,1247\n1384,1895\n1385,1218\n1385,1895\n1386,1095\n1386,2159\n1386,2096\n1386,1387\n1387,1386\n1387,1177\n1388,1367\n1388,1399\n1389,1251\n1389,1632\n1389,1478\n1390,1439\n1390,1425\n1390,1391\n1391,1390\n1391,1334\n1391,1413\n1392,1426\n1393,1404\n1393,1397\n1394,1515\n1395,1396\n1396,1395\n1396,1334\n1397,1393\n1397,1381\n1398,1302\n1398,1182\n1399,1388\n1399,1400\n1400,1399\n1400,1378\n1400,1367\n1400,1852\n1400,1401\n1401,1400\n1401,1128\n1401,1088\n1402,1257\n1402,1230\n1402,804\n1403,1371\n1403,1171\n1403,1169\n1403,1541\n1403,1540\n1403,1485\n1404,1393\n1405,1153\n1405,1406\n1406,1405\n1406,1377\n1406,1317\n1406,1422\n1407,1219\n1407,1191\n1408,1983\n1408,1980\n1408,1798\n1409,1290\n1409,1470\n1410,1268\n1410,2113\n1410,1498\n1410,1419\n1411,1412\n1412,1411\n1412,1321\n1412,1505\n1413,1391\n1413,1166\n1413,2193\n1414,1416\n1415,1874\n1415,1844\n1415,1522\n1415,1416\n1416,1415\n1416,1414\n1416,1322\n1416,1195\n1416,1159\n1416,1134\n1416,1920\n1417,1219\n1417,1921\n1418,1067\n1418,1828\n1418,1455\n1418,1419\n1419,1418\n1419,1410\n1419,1068\n1419,1963\n1419,1923\n1419,1535\n1419,1454\n1419,1453\n1420,1251\n1420,1085\n1421,1422\n1422,1421\n1422,1406\n1422,1376\n1422,1102\n1422,1423\n1423,1422\n1423,1243\n1424,1326\n1424,422\n1424,1924\n1425,1390\n1425,1217\n1425,2016\n1426,1392\n1426,1348\n1426,1296\n1427,1342\n1427,1449\n1428,2069\n1428,1429\n1429,1428\n1429,1119\n1429,1091\n1430,1974\n1430,1432\n1430,1431\n1431,1430\n1431,1433\n1432,1430\n1432,1263\n1432,1224\n1433,1431\n1433,1327\n1433,1306\n1434,1143\n1434,1930\n1435,1352\n1435,1278\n1435,1164\n1435,2184\n1435,1436\n1436,1435\n1436,1309\n1436,1117\n1436,1462\n1437,1935\n1437,1783\n1438,1334\n1438,1166\n1438,1811\n1439,1390\n1439,1884\n1439,1526\n1439,1516\n1439,1440\n1440,1439\n1440,1320\n1440,1811\n1441,1208\n1441,1794\n1441,1442\n1442,1441\n1442,1185\n1442,1103\n1442,1987\n1442,1548\n1442,1537\n1442,1443\n1443,1442\n1443,1313\n1444,1361\n1444,1062\n1444,1061\n1444,1445\n1445,1444\n1445,1371\n1446,1311\n1446,1095\n1446,1089\n1446,1083\n1446,2077\n1446,1447\n1447,1446\n1447,1347\n1447,1312\n1447,1094\n1447,2195\n1448,1341\n1448,1461\n1449,1427\n1449,1348\n1449,1205\n1450,1361\n1450,1274\n1450,1218\n1451,1374\n1451,1372\n1451,1135\n1451,2119\n1451,2118\n1451,1472\n1452,1195\n1452,1148\n1452,1541\n1453,1419\n1453,1116\n1453,1456\n1454,1419\n1454,1116\n1454,1457\n1455,1418\n1455,1598\n1455,1457\n1455,1456\n1456,1455\n1456,1453\n1457,1455\n1457,1454\n1458,1319\n1458,1140\n1458,1952\n1459,1327\n1459,1267\n1459,1123\n1459,1111\n1459,1078\n1460,1104\n1460,2144\n1460,2123\n1460,2108\n1460,2105\n1460,2095\n1460,2081\n1460,2074\n1460,2072\n1460,1461\n1461,1460\n1461,1448\n1461,1347\n1461,1234\n1461,1117\n1461,2125\n1461,2124\n1462,1436\n1462,1339\n1462,1463\n1463,1462\n1463,1279\n1463,1117\n1463,1953\n1464,1466\n1465,1466\n1466,1465\n1466,1464\n1466,1352\n1466,1276\n1466,1908\n1467,1316\n1467,1209\n1467,1183\n1467,1175\n1467,2138\n1468,1173\n1468,2188\n1468,1954\n1468,1748\n1468,1484\n1469,1187\n1469,1072\n1470,1409\n1470,2112\n1471,1363\n1471,1109\n1471,2188\n1471,2173\n1472,1451\n1472,1268\n1472,2129\n1472,2128\n1472,1497\n1473,1151\n1473,2131\n1473,1530\n1474,1284\n1474,1142\n1474,2042\n1474,1475\n1475,1474\n1476,1383\n1476,1308\n1476,1125\n1477,1478\n1478,1477\n1478,1389\n1478,1229\n1478,1085\n1478,2086\n1478,2050\n1479,1480\n1480,1479\n1480,1535\n1481,564\n1482,564\n1483,1329\n1483,1239\n1484,1468\n1484,1173\n1484,1170\n1484,1152\n1484,2157\n1484,1485\n1485,1484\n1485,1403\n1486,1173\n1486,1170\n1486,1140\n1487,1361\n1487,1173\n1487,1531\n1488,1258\n1488,1231\n1488,1204\n1488,1092\n1489,1356\n1489,1278\n1489,1276\n1489,1151\n1489,2179\n1489,2139\n1489,2138\n1489,2120\n1490,1366\n1490,1098\n1491,1145\n1491,1984\n1491,1760\n1491,1621\n1492,1986\n1492,1710\n1492,1565\n1492,1493\n1493,1492\n1493,1132\n1494,1988\n1494,1537\n1494,1523\n1495,1370\n1495,1109\n1495,1919\n1496,1108\n1496,1090\n1496,2010\n1497,1472\n1497,1069\n1498,1410\n1498,1069\n1499,1116\n1499,1995\n1499,1994\n1499,1877\n1499,1500\n1500,1499\n1500,1365\n1501,1250\n1501,1161\n1502,1380\n1502,1334\n1502,1999\n1503,1083\n1504,1176\n1504,1091\n1505,1412\n1505,1321\n1505,1245\n1505,1158\n1506,1380\n1506,1334\n1506,1159\n1506,1074\n1506,2202\n1506,1818\n1506,1514\n1506,1512\n1506,1507\n1507,1506\n1507,1244\n1507,1541\n1508,1342\n1508,1876\n1509,1510\n1510,1509\n1510,1082\n1510,1980\n1511,2019\n1511,1891\n1511,1594\n1512,1506\n1512,1216\n1512,1198\n1512,2020\n1512,1513\n1513,1512\n1513,2022\n1513,1736\n1514,1506\n1515,1394\n1515,1334\n1515,1818\n1516,1439\n1516,1366\n1516,2027\n1516,1925\n1517,1162\n1517,1518\n1518,1517\n1518,1174\n1519,1521\n1520,1588\n1520,1521\n1521,1520\n1521,1519\n1521,1195\n1522,1415\n1522,1321\n1522,1844\n1523,1494\n1523,1280\n1523,2031\n1523,1979\n1524,1229\n1524,1223\n1524,1949\n1524,1632\n1524,1525\n1525,1524\n1525,1166\n1525,1091\n1526,1439\n1526,1284\n1526,1926\n1527,1320\n1527,2193\n1528,1193\n1528,2126\n1528,1762\n1528,1695\n1528,1694\n1528,1529\n1529,1528\n1529,1559\n1530,1473\n1530,1356\n1530,1151\n1530,1100\n1530,2173\n1530,2076\n1530,1536\n1530,1533\n1530,1531\n1531,1530\n1531,1487\n1531,1173\n1531,1170\n1531,1134\n1532,1298\n1532,1238\n1532,2158\n1533,1530\n1534,1135\n1535,1480\n1535,1419\n1535,1286\n1536,1530\n1536,1210\n1536,2176\n1537,1494\n1537,1442\n1538,1371\n1539,1371\n1540,1403\n1540,1340\n1540,1310\n1541,1507\n1541,1452\n1541,1403\n1541,1167\n1542,1060\n1542,1938\n1542,1644\n1543,1115\n1543,1611\n1544,1832\n1544,1547\n1545,2040\n1545,1575\n1546,1888\n1546,1553\n1547,1544\n1547,1744\n1547,1733\n1547,1708\n1547,1638\n1547,1595\n1547,1548\n1548,1547\n1548,1442\n1549,2110\n1549,1782\n1550,1931\n1550,1622\n1551,1993\n1551,1779\n1552,1369\n1552,1116\n1553,1546\n1553,1071\n1554,1072\n1554,2142\n1554,1957\n1554,1890\n1554,1839\n1554,1740\n1554,1720\n1554,1670\n1554,1653\n1555,1841\n1555,1561\n1556,1104\n1556,1089\n1557,1846\n1557,1712\n1558,1356\n1558,1335\n1559,1529\n1559,1080\n1560,1081\n1560,1781\n1561,1555\n1561,1819\n1562,1355\n1562,1298\n1562,2158\n1563,1857\n1563,1787\n1563,1689\n1564,1950\n1564,1569\n1565,1492\n1565,1745\n1566,1069\n1566,1568\n1566,1567\n1567,1566\n1568,1566\n1569,1564\n1569,1272\n1570,1255\n1570,1618\n1571,1881\n1571,1728\n1572,1740\n1572,1685\n1573,1102\n1573,2053\n1573,1574\n1574,1573\n1574,2115\n1574,2099\n1575,1545\n1575,1946\n1575,1685\n1576,1124\n1576,1593\n1577,1235\n1577,1631\n1578,1985\n1578,1645\n1579,1326\n1579,1112\n1579,1657\n1580,1326\n1580,1987\n1581,1112\n1581,1582\n1582,1581\n1582,1764\n1583,2087\n1583,1918\n1583,1691\n1584,1117\n1584,2012\n1584,2000\n1584,1951\n1584,1856\n1584,1855\n1584,1599\n1585,1745\n1585,1721\n1586,1272\n1586,1928\n1586,1702\n1587,1867\n1587,1588\n1588,1587\n1588,1520\n1589,2150\n1589,2000\n1589,1679\n1589,1599\n1590,1854\n1590,1716\n1591,1930\n1591,1622\n1592,2048\n1592,1701\n1593,1576\n1593,1378\n1594,1511\n1594,1224\n1595,1547\n1596,2038\n1596,1960\n1597,1598\n1598,1597\n1598,1455\n1598,1686\n1599,1589\n1599,1584\n1599,2012\n1600,2098\n1600,2097\n1600,1922\n1600,1601\n1601,1600\n1601,1972\n1601,1838\n1602,2151\n1602,2130\n1602,2001\n1603,1115\n1603,1686\n1604,1823\n1604,1773\n1604,1648\n1605,1132\n1605,2043\n1605,1820\n1605,1699\n1606,1645\n1607,1773\n1607,1674\n1608,1998\n1608,1970\n1609,1133\n1609,2148\n1609,2065\n1609,1725\n1610,1134\n1611,1543\n1611,1760\n1612,1781\n1612,1627\n1612,1613\n1613,1612\n1613,1847\n1614,2157\n1614,1954\n1614,1654\n1615,1071\n1615,1659\n1616,2002\n1616,1834\n1617,1700\n1617,1620\n1618,1570\n1618,1902\n1619,1140\n1619,1882\n1620,1617\n1620,1140\n1620,1700\n1621,1491\n1621,1948\n1622,1591\n1622,1550\n1622,1143\n1622,1692\n1622,1623\n1623,1622\n1623,2115\n1623,2099\n1623,2014\n1623,1662\n1624,1367\n1624,1087\n1625,1063\n1625,2004\n1626,1272\n1626,2003\n1627,1612\n1627,1664\n1628,1809\n1628,1663\n1629,1348\n1629,1296\n1630,1090\n1630,1729\n1631,1577\n1631,1333\n1632,1524\n1632,1389\n1633,1964\n1633,1848\n1633,1813\n1634,1331\n1634,1271\n1635,1703\n1635,1667\n1636,1824\n1636,1738\n1637,1738\n1638,1547\n1638,1930\n1639,2092\n1639,1911\n1640,1804\n1640,1766\n1641,1162\n1642,1804\n1642,1689\n1643,2067\n1643,1699\n1644,1542\n1644,2035\n1644,1909\n1644,1751\n1645,1606\n1645,1578\n1646,1166\n1646,1864\n1647,1224\n1647,1916\n1648,1604\n1648,1807\n1649,1173\n1649,2068\n1649,1954\n1649,1752\n1650,2015\n1650,1788\n1651,1797\n1651,1795\n1652,1879\n1652,1759\n1653,1554\n1653,2039\n1653,2038\n1653,1790\n1653,1742\n1654,1614\n1654,1883\n1654,1752\n1655,1897\n1656,1897\n1657,1579\n1658,1786\n1658,1771\n1659,1615\n1659,1826\n1660,1892\n1660,1827\n1661,1850\n1661,1820\n1661,1662\n1662,1661\n1662,1623\n1662,2067\n1662,1722\n1663,1628\n1663,1337\n1664,1627\n1664,2163\n1665,1915\n1665,1862\n1666,1105\n1666,1667\n1667,1666\n1667,1635\n1668,1890\n1668,1808\n1669,1754\n1669,1670\n1670,1669\n1670,1554\n1670,1685\n1671,2013\n1671,1789\n1672,1816\n1673,1897\n1673,1687\n1674,1607\n1674,1800\n1675,1706\n1676,1906\n1676,1677\n1677,1676\n1677,1333\n1677,1098\n1678,1245\n1678,1194\n1679,1589\n1679,1209\n1680,1803\n1680,1734\n1681,2037\n1681,1875\n1682,1929\n1682,1834\n1683,1778\n1684,1284\n1684,1158\n1685,1670\n1685,1575\n1685,1572\n1685,1915\n1685,1878\n1685,1786\n1686,1603\n1686,1598\n1687,1673\n1687,1218\n1687,2167\n1687,1897\n1687,1688\n1688,1687\n1689,1642\n1689,1563\n1689,1219\n1689,1857\n1689,1714\n1690,2097\n1690,1861\n1690,1691\n1691,1690\n1691,1583\n1691,1918\n1692,1622\n1692,1869\n1693,1907\n1693,1858\n1694,1528\n1694,1731\n1695,1528\n1695,1967\n1696,1149\n1696,1826\n1697,2031\n1698,1982\n1698,1776\n1699,1643\n1699,1605\n1699,1776\n1700,1620\n1700,1617\n1701,1592\n1701,1282\n1702,1586\n1702,2167\n1702,2003\n1703,1635\n1703,1841\n1703,1780\n1704,1976\n1704,1724\n1705,1206\n1705,1853\n1706,1675\n1706,2007\n1707,2019\n1707,1829\n1708,1547\n1708,1795\n1709,1226\n1709,2100\n1709,1870\n1709,1797\n1710,1492\n1710,1830\n1711,1921\n1711,1896\n1712,1557\n1712,1904\n1713,1098\n1713,2194\n1713,1843\n1714,1689\n1714,1739\n1715,2111\n1715,1961\n1716,1590\n1716,1921\n1716,1889\n1717,1104\n1717,2136\n1718,1955\n1719,1359\n1719,1849\n1720,1554\n1721,1585\n1721,1930\n1721,1722\n1722,1721\n1722,1662\n1723,1235\n1723,1975\n1724,1704\n1724,1795\n1725,1609\n1725,1242\n1725,2080\n1725,1945\n1726,1242\n1726,1977\n1726,1755\n1727,1224\n1727,1778\n1728,1571\n1728,1082\n1729,1630\n1729,1997\n1730,1153\n1730,1913\n1731,1694\n1731,1098\n1732,2130\n1732,2117\n1732,2113\n1733,1547\n1733,2052\n1734,1680\n1734,2051\n1734,1802\n1734,1758\n1735,1358\n1735,1181\n1736,1513\n1736,1157\n1737,1738\n1738,1737\n1738,1637\n1738,1636\n1739,1714\n1739,1785\n1740,1572\n1740,1554\n1741,2025\n1741,1793\n1741,1743\n1742,1653\n1742,2162\n1742,1743\n1743,1742\n1743,1741\n1744,1547\n1744,1870\n1745,1585\n1745,1565\n1746,1224\n1747,2183\n1747,2008\n1747,1904\n1747,1748\n1748,1747\n1748,1468\n1749,1157\n1749,1885\n1749,1822\n1750,1082\n1751,1644\n1752,1654\n1752,1649\n1752,2157\n1753,1104\n1753,1865\n1754,1669\n1754,1833\n1754,1790\n1755,1726\n1755,2080\n1755,1756\n1756,1755\n1756,2087\n1757,1909\n1757,1882\n1757,1847\n1758,1734\n1758,1782\n1759,1652\n1759,1782\n1760,1611\n1760,1491\n1760,2088\n1760,1898\n1761,1346\n1761,1999\n1762,1528\n1762,1255\n1763,1256\n1763,1880\n1764,1582\n1765,1358\n1765,2042\n1766,1640\n1766,1767\n1767,1766\n1767,1219\n1768,1840\n1769,2032\n1769,1833\n1770,1212\n1770,1158\n1771,1658\n1771,1899\n1772,2052\n1772,1878\n1773,1607\n1773,1604\n1774,1214\n1774,1155\n1775,1360\n1775,1950\n1776,1699\n1776,1698\n1776,1268\n1776,1962\n1776,1886\n1776,1869\n1777,1165\n1777,1849\n1778,1727\n1778,1683\n1779,1551\n1779,1848\n1780,1703\n1780,1947\n1781,1612\n1781,1560\n1782,1759\n1782,1758\n1782,1549\n1782,2011\n1783,1437\n1783,1900\n1784,422\n1785,1739\n1785,1910\n1786,1685\n1786,1658\n1786,1280\n1786,2041\n1786,1907\n1787,1563\n1787,1896\n1788,1650\n1788,1959\n1789,1671\n1789,1816\n1790,1754\n1790,1653\n1791,1793\n1792,1793\n1793,1792\n1793,1791\n1793,1741\n1793,2025\n1794,1441\n1794,1208\n1794,1796\n1795,1724\n1795,1708\n1795,1651\n1795,1976\n1795,1796\n1796,1795\n1796,1794\n1797,1709\n1797,1651\n1798,1408\n1798,1255\n1799,1264\n1799,1224\n1800,1674\n1800,1286\n1800,1807\n1801,1288\n1801,1996\n1802,1734\n1802,2001\n1803,1680\n1803,1291\n1804,1642\n1804,1640\n1805,1299\n1805,1298\n1806,1847\n1807,1800\n1807,1648\n1807,1300\n1807,2163\n1808,1668\n1808,1839\n1809,1628\n1809,1063\n1810,1237\n1810,1106\n1811,1440\n1811,1438\n1812,1307\n1812,1851\n1813,1633\n1813,2011\n1814,1309\n1814,1920\n1815,2031\n1815,2023\n1816,1789\n1816,1672\n1816,1315\n1817,1316\n1817,2150\n1817,2149\n1818,1515\n1818,1506\n1819,1561\n1819,1317\n1820,1661\n1820,1605\n1820,2043\n1821,1326\n1821,1923\n1822,1749\n1822,1325\n1823,1604\n1823,1964\n1824,1636\n1824,1914\n1825,1120\n1825,1118\n1826,1696\n1826,1659\n1827,1660\n1827,2046\n1827,2020\n1828,1418\n1828,2006\n1829,1707\n1829,2034\n1830,1710\n1830,1130\n1831,1338\n1831,2155\n1831,1838\n1832,1544\n1832,1930\n1833,1769\n1833,1754\n1834,1682\n1834,1616\n1835,1284\n1836,1952\n1837,1114\n1837,2049\n1838,1831\n1838,1601\n1838,2099\n1839,1808\n1839,1554\n1839,1840\n1840,1839\n1840,1768\n1841,1703\n1841,1555\n1842,1347\n1842,2122\n1842,2079\n1842,2070\n1843,1713\n1843,1981\n1844,1522\n1844,1415\n1844,2156\n1845,1190\n1846,1557\n1846,1883\n1847,1806\n1847,1757\n1847,1613\n1848,1779\n1848,1633\n1849,1777\n1849,1719\n1850,1661\n1850,2119\n1850,2118\n1851,1812\n1852,1400\n1852,1066\n1853,1705\n1853,1165\n1854,1590\n1854,1889\n1855,1584\n1855,2000\n1855,1951\n1856,1584\n1856,1951\n1857,1689\n1857,1563\n1858,1693\n1858,2023\n1859,1353\n1859,1992\n1860,1342\n1861,1690\n1861,2098\n1862,1665\n1862,2039\n1863,1127\n1863,1933\n1864,1646\n1864,1361\n1865,1753\n1865,1164\n1866,1206\n1867,1587\n1867,1359\n1868,1999\n1868,1917\n1869,1776\n1869,1692\n1869,2106\n1870,1744\n1870,1709\n1871,2067\n1871,1873\n1871,1872\n1872,1871\n1872,2129\n1873,1871\n1873,2128\n1874,1415\n1874,1142\n1875,1681\n1876,1508\n1876,2141\n1877,1499\n1877,1106\n1878,1772\n1878,1685\n1879,1652\n1879,1993\n1880,1763\n1881,1571\n1881,1325\n1882,1757\n1882,1619\n1883,1846\n1883,1654\n1883,1954\n1884,1439\n1885,1749\n1885,2047\n1885,1924\n1886,1776\n1887,2157\n1887,2145\n1888,1546\n1889,1854\n1889,1716\n1890,1668\n1890,1554\n1891,1511\n1891,1199\n1892,1660\n1892,1200\n1893,1380\n1893,2030\n1893,1917\n1894,1936\n1894,1895\n1895,1894\n1895,1385\n1895,1384\n1896,1787\n1896,1711\n1897,1687\n1897,1673\n1897,1656\n1897,1655\n1897,1950\n1898,1760\n1898,2088\n1899,1771\n1899,1960\n1899,1958\n1900,1783\n1900,1901\n1901,1900\n1901,1066\n1902,1618\n1902,1235\n1903,1368\n1903,1990\n1904,1747\n1904,1712\n1905,1158\n1905,1075\n1906,1676\n1906,1941\n1907,1786\n1907,1693\n1908,1466\n1908,2062\n1909,1757\n1909,1644\n1910,1785\n1910,1978\n1911,1639\n1912,1314\n1912,1219\n1913,1730\n1913,1248\n1914,1824\n1914,1098\n1915,1685\n1915,1665\n1916,1647\n1917,1893\n1917,1868\n1917,1999\n1918,1691\n1918,1583\n1919,1495\n1919,1363\n1920,1814\n1920,1416\n1921,1716\n1921,1711\n1921,1417\n1922,1600\n1922,2151\n1922,2119\n1923,1821\n1923,1419\n1924,1885\n1924,1424\n1925,1516\n1926,1526\n1926,1940\n1927,2080\n1927,1977\n1928,1586\n1928,1272\n1928,2177\n1928,2003\n1929,1682\n1929,1360\n1929,1938\n1930,1832\n1930,1721\n1930,1638\n1930,1591\n1930,1434\n1930,2196\n1931,1550\n1932,1114\n1932,1944\n1933,1863\n1933,2116\n1933,1944\n1933,1935\n1933,1934\n1934,1933\n1934,1289\n1935,1933\n1935,1437\n1936,1894\n1936,1937\n1937,1936\n1938,1929\n1938,1542\n1939,1940\n1940,1939\n1940,1926\n1940,2027\n1941,1906\n1942,1130\n1942,1081\n1943,2030\n1943,1999\n1944,1933\n1944,1932\n1945,1725\n1945,2148\n1945,2114\n1945,2098\n1945,2089\n1946,1575\n1946,2033\n1947,1780\n1948,1621\n1948,1105\n1949,1524\n1949,1186\n1950,1897\n1950,1775\n1950,1564\n1950,1360\n1951,1856\n1951,1855\n1951,1584\n1951,2012\n1952,1836\n1952,1458\n1953,1463\n1953,2187\n1953,2186\n1953,2143\n1953,2140\n1953,2137\n1953,2056\n1954,1883\n1954,1649\n1954,1614\n1954,1468\n1955,1718\n1955,1145\n1956,1160\n1956,1120\n1957,1554\n1958,1899\n1958,2038\n1959,1788\n1959,1090\n1960,1899\n1960,1596\n1961,1715\n1961,2117\n1961,2029\n1962,1776\n1962,2029\n1962,1964\n1962,1963\n1963,1962\n1963,1419\n1964,1962\n1964,1823\n1964,1633\n1965,2034\n1965,2019\n1965,1966\n1966,1965\n1967,1695\n1968,2126\n1968,1983\n1969,1115\n1969,1067\n1969,1970\n1970,1969\n1970,1608\n1971,1155\n1971,1991\n1972,1601\n1972,2133\n1973,2010\n1973,2009\n1974,1430\n1975,1723\n1975,1368\n1976,1795\n1976,1704\n1977,1927\n1977,1726\n1977,2051\n1978,1910\n1978,2175\n1978,1979\n1979,1978\n1979,1523\n1980,1510\n1980,1408\n1981,1843\n1982,1698\n1982,1986\n1983,1968\n1983,1408\n1984,1491\n1985,1578\n1985,2161\n1985,2078\n1986,1982\n1986,1492\n1987,1580\n1987,1442\n1988,1494\n1989,1206\n1990,1903\n1990,2026\n1991,1971\n1992,1859\n1992,1257\n1993,1879\n1993,1551\n1993,1995\n1993,1994\n1994,1993\n1994,1499\n1994,1291\n1995,1993\n1995,1499\n1995,1242\n1996,1801\n1996,2049\n1997,1729\n1997,1337\n1998,1608\n1999,1943\n1999,1917\n1999,1868\n1999,1761\n1999,1502\n1999,2026\n2000,1855\n2000,1589\n2000,1584\n2001,1802\n2001,1602\n2001,2114\n2002,1616\n2002,1060\n2003,1928\n2003,1702\n2003,1626\n2004,1625\n2004,2075\n2005,2010\n2006,1828\n2007,1706\n2007,1356\n2008,1747\n2009,1973\n2010,2005\n2010,1973\n2010,1496\n2011,1813\n2011,1782\n2012,1951\n2012,1599\n2012,1584\n2013,1671\n2014,1623\n2014,2127\n2015,1650\n2015,1165\n2016,1425\n2016,1333\n2017,1351\n2017,1090\n2017,2018\n2018,2017\n2019,1965\n2019,1707\n2019,1511\n2019,2020\n2020,2019\n2020,1827\n2020,1512\n2020,2047\n2020,2046\n2021,1378\n2021,1124\n2022,1513\n2023,1858\n2023,1815\n2024,2025\n2025,2024\n2025,1793\n2025,1741\n2026,1999\n2026,1990\n2027,1940\n2027,1516\n2028,1071\n2028,2060\n2029,1962\n2029,1961\n2030,1943\n2030,1893\n2031,1815\n2031,1697\n2031,1523\n2031,2175\n2032,1769\n2032,2041\n2032,2033\n2033,2032\n2033,1946\n2034,1965\n2034,1829\n2035,1644\n2035,1060\n2036,1311\n2037,1681\n2037,1206\n2038,1958\n2038,1653\n2038,1596\n2038,2078\n2039,1862\n2039,1653\n2039,2040\n2040,2039\n2040,1545\n2041,2032\n2041,1786\n2042,1765\n2042,1474\n2043,1820\n2043,1605\n2044,1359\n2044,2045\n2045,2044\n2046,2020\n2046,1827\n2046,2047\n2047,2046\n2047,2020\n2047,1885\n2048,1592\n2049,1996\n2049,1837\n2050,1478\n2050,1186\n2051,1977\n2051,1734\n2052,1772\n2052,1733\n2053,1573\n2053,2196\n2054,2151\n2054,2119\n2054,2089\n2055,2107\n2055,2081\n2056,1953\n2056,2084\n2057,2060\n2057,2059\n2058,2106\n2059,2057\n2060,2057\n2060,2028\n2060,1307\n2061,1104\n2061,2107\n2062,1908\n2062,1100\n2063,1147\n2063,2124\n2064,1147\n2064,2125\n2065,1609\n2065,2097\n2066,2187\n2066,2186\n2066,2140\n2067,1871\n2067,1662\n2067,1643\n2068,1649\n2069,1428\n2069,1066\n2070,1842\n2070,2101\n2071,1095\n2071,2166\n2071,2165\n2072,1460\n2072,2073\n2073,2072\n2073,2108\n2073,2101\n2074,1460\n2074,2101\n2075,2004\n2075,1186\n2076,1530\n2076,1210\n2077,1446\n2077,2191\n2078,2038\n2078,1985\n2079,1842\n2079,2095\n2080,1927\n2080,1755\n2080,1725\n2081,2055\n2081,1460\n2082,2137\n2082,2085\n2082,2083\n2083,2082\n2083,2094\n2083,2084\n2084,2083\n2084,2056\n2084,2085\n2085,2084\n2085,2082\n2085,2143\n2086,1478\n2086,1205\n2087,1756\n2087,1583\n2088,1898\n2088,1760\n2089,2054\n2089,1945\n2089,2129\n2090,2144\n2090,2134\n2091,1095\n2091,2190\n2092,1639\n2092,1160\n2093,2142\n2094,2083\n2094,2107\n2095,2079\n2095,1460\n2096,1386\n2096,1093\n2096,2190\n2096,2135\n2097,2065\n2097,1690\n2097,1600\n2097,1323\n2098,1945\n2098,1861\n2098,1600\n2098,1323\n2099,1838\n2099,1623\n2099,1574\n2100,1709\n2101,2074\n2101,2073\n2101,2070\n2101,2122\n2102,2155\n2102,2146\n2102,2127\n2103,2157\n2103,2145\n2104,1378\n2104,2109\n2105,1460\n2105,2107\n2106,2058\n2106,1869\n2106,2154\n2107,2105\n2107,2094\n2107,2061\n2107,2055\n2108,2073\n2108,1460\n2109,2104\n2109,1096\n2110,1549\n2110,2113\n2111,1715\n2111,2163\n2112,1470\n2112,2164\n2113,2110\n2113,1732\n2113,1410\n2114,2001\n2114,1945\n2114,2151\n2115,1623\n2115,1574\n2116,1933\n2117,1961\n2117,1732\n2118,1850\n2118,1451\n2118,2151\n2119,2054\n2119,1922\n2119,1850\n2119,1451\n2120,1489\n2120,1356\n2120,1278\n2121,1104\n2121,2137\n2122,2101\n2122,1842\n2123,1460\n2123,2134\n2124,2063\n2124,1461\n2125,2064\n2125,1461\n2126,1968\n2126,1528\n2127,2102\n2127,2014\n2128,1873\n2128,1472\n2128,2153\n2129,2089\n2129,1872\n2129,1472\n2130,1732\n2130,1602\n2130,2153\n2131,1473\n2131,2145\n2132,2145\n2133,1972\n2133,2154\n2133,2146\n2134,2123\n2134,2090\n2135,2096\n2135,1093\n2136,1717\n2136,2156\n2137,2121\n2137,2082\n2137,1953\n2137,2140\n2138,1489\n2138,1467\n2138,1309\n2139,1489\n2139,1357\n2139,1309\n2139,1101\n2140,2137\n2140,2066\n2140,1953\n2141,1876\n2141,1285\n2142,2093\n2142,1554\n2143,2085\n2143,1953\n2144,2090\n2144,1460\n2145,2132\n2145,2131\n2145,2103\n2145,1887\n2146,2133\n2146,2102\n2146,2147\n2147,2146\n2148,1945\n2148,1609\n2149,1817\n2149,2150\n2150,2149\n2150,1817\n2150,1589\n2151,2118\n2151,2114\n2151,2054\n2151,1922\n2151,1602\n2152,2162\n2153,2130\n2153,2128\n2154,2133\n2154,2106\n2155,2102\n2155,1831\n2156,2136\n2156,1844\n2156,1321\n2157,2103\n2157,1887\n2157,1752\n2157,1614\n2157,1484\n2158,1562\n2158,1532\n2158,1298\n2159,1386\n2159,1095\n2159,2170\n2159,2169\n2160,2162\n2160,2161\n2161,2160\n2161,1985\n2162,2160\n2162,2152\n2162,1742\n2163,2111\n2163,1807\n2163,1664\n2164,2112\n2164,1181\n2165,2071\n2166,2071\n2167,1702\n2167,1687\n2168,2190\n2169,2159\n2170,2159\n2171,2192\n2172,2192\n2173,1530\n2173,1471\n2174,2175\n2175,2174\n2175,2031\n2175,1978\n2176,1536\n2176,1100\n2177,1928\n2177,2178\n2178,2177\n2178,2183\n2179,1489\n2179,1100\n2180,1345\n2180,1172\n2180,2181\n2181,2180\n2182,1268\n2182,2197\n2183,2178\n2183,1747\n2184,1435\n2184,1164\n2185,1309\n2185,2198\n2186,2066\n2186,1953\n2187,2066\n2187,1953\n2188,1471\n2188,1468\n2189,1352\n2189,1164\n2190,2168\n2190,2096\n2190,2091\n2191,2077\n2191,1311\n2191,2192\n2192,2191\n2192,2172\n2192,2171\n2192,1311\n2193,1527\n2193,1413\n2194,1713\n2194,1224\n2195,1447\n2195,1117\n2196,2053\n2196,1930\n2197,2182\n2198,2185\n2199,2204\n2199,2200\n2200,2199\n2200,2201\n2201,2200\n2201,2203\n2202,1506\n2202,2204\n2203,2201\n2203,1277\n2204,2202\n2204,2199\n2205,2211\n2205,2210\n2206,2382\n2207,802\n2207,2213\n2208,2390\n2208,2244\n2209,4743\n2209,2412\n2210,2205\n2210,2212\n2211,2205\n2211,2212\n2212,2211\n2212,2210\n2212,2282\n2212,2213\n2213,2212\n2213,2207\n2213,395\n2214,4897\n2214,2396\n2215,2411\n2215,2357\n2216,2387\n2216,2370\n2217,2345\n2217,2288\n2218,2347\n2218,2346\n2219,2397\n2219,2373\n2219,2332\n2219,2244\n2220,2229\n2221,2405\n2221,2403\n2221,2402\n2221,2376\n2221,2295\n2221,2261\n2221,2232\n2221,2223\n2221,2222\n2222,2221\n2222,2418\n2222,2321\n2222,2229\n2222,2224\n2222,2223\n2223,2222\n2223,2221\n2223,393\n2223,2383\n2223,2235\n2223,2229\n2224,2222\n2224,2350\n2224,2321\n2225,2404\n2225,2314\n2226,2228\n2227,2359\n2227,2230\n2228,2226\n2228,2234\n2229,2223\n2229,2222\n2229,2220\n2230,2227\n2230,2263\n2231,396\n2231,2357\n2231,2347\n2231,2317\n2232,2221\n2232,2405\n2233,2409\n2233,2361\n2233,2305\n2234,2228\n2234,2360\n2235,2223\n2235,2383\n2235,2369\n2235,2328\n2235,2312\n2235,2309\n2235,2298\n2235,2262\n2236,2238\n2237,2238\n2238,2237\n2238,2236\n2238,2396\n2238,2368\n2238,2291\n2239,2313\n2239,2285\n2240,2366\n2240,2325\n2241,4631\n2241,4507\n2241,2242\n2242,2241\n2242,2355\n2242,2310\n2242,2249\n2243,2335\n2243,2325\n2244,2219\n2244,2208\n2244,2332\n2245,2421\n2245,2315\n2246,2420\n2246,2388\n2246,2308\n2247,2386\n2247,2256\n2248,4536\n2248,4535\n2248,2250\n2248,2249\n2249,2248\n2249,2242\n2249,4652\n2249,4573\n2249,2412\n2249,2370\n2249,2253\n2249,2252\n2249,2251\n2250,2248\n2251,2249\n2252,2249\n2253,2249\n2253,2311\n2254,2379\n2254,2281\n2255,2327\n2255,2292\n2256,2247\n2256,2303\n2257,2407\n2257,2282\n2258,2262\n2259,2262\n2260,2262\n2261,2221\n2262,2260\n2262,2259\n2262,2258\n2262,2235\n2262,2364\n2262,2298\n2263,2230\n2263,2357\n2263,2306\n2264,2286\n2264,2282\n2265,4854\n2265,2306\n2266,2414\n2266,2272\n2267,2381\n2267,2333\n2267,2270\n2267,2269\n2267,2268\n2268,2267\n2268,2416\n2268,2382\n2268,2271\n2269,2267\n2270,2267\n2271,2268\n2272,2266\n2272,2334\n2273,2275\n2274,2407\n2274,2372\n2274,2275\n2275,2274\n2275,2273\n2276,2389\n2276,2290\n2276,2277\n2277,2276\n2278,2371\n2278,2320\n2279,2414\n2279,2361\n2280,2284\n2281,2254\n2281,2336\n2281,2282\n2282,2281\n2282,2264\n2282,2257\n2282,2212\n2282,389\n2282,2375\n2282,2372\n2282,2304\n2282,2302\n2282,2284\n2282,2283\n2283,2282\n2283,420\n2283,396\n2283,2284\n2284,2283\n2284,2282\n2284,2280\n2285,2239\n2285,2392\n2285,2331\n2285,2286\n2286,2285\n2286,2264\n2287,2387\n2287,2334\n2288,2217\n2288,2316\n2289,2382\n2289,2341\n2290,2276\n2290,2377\n2290,2368\n2290,2292\n2291,2238\n2291,2315\n2292,2290\n2292,2255\n2293,2367\n2293,2348\n2294,2382\n2294,2332\n2295,2221\n2295,2405\n2296,2298\n2297,2298\n2298,2297\n2298,2296\n2298,2262\n2298,2235\n2298,2369\n2298,2343\n2299,2407\n2299,2300\n2300,2299\n2300,2407\n2301,2372\n2302,2282\n2302,2354\n2303,2256\n2303,2408\n2303,2348\n2304,2282\n2304,790\n2304,2354\n2305,2233\n2305,2310\n2306,2265\n2306,2263\n2307,386\n2307,2330\n2308,2246\n2308,2415\n2308,2388\n2309,2235\n2309,2388\n2309,2383\n2310,2305\n2310,2242\n2311,2253\n2311,2346\n2312,2235\n2312,520\n2312,4837\n2312,2364\n2313,2239\n2314,2225\n2314,2359\n2314,2321\n2315,2291\n2315,2245\n2316,2288\n2316,2317\n2317,2316\n2317,2231\n2317,2370\n2318,2332\n2318,2327\n2319,2366\n2319,2321\n2320,2278\n2320,2321\n2321,2320\n2321,2319\n2321,2314\n2321,2224\n2321,2222\n2321,2393\n2321,2324\n2321,2323\n2321,2322\n2322,2321\n2323,2321\n2324,2321\n2325,2243\n2325,2240\n2325,2406\n2325,2358\n2326,2329\n2327,2318\n2327,2255\n2327,2420\n2327,2380\n2327,2352\n2327,2329\n2327,2328\n2328,2327\n2328,2235\n2328,2383\n2328,2329\n2329,2328\n2329,2327\n2329,2326\n2330,2307\n2330,2405\n2331,2285\n2331,2392\n2332,2318\n2332,2294\n2332,2244\n2332,2219\n2332,2389\n2332,2373\n2333,2267\n2333,2381\n2334,2287\n2334,2272\n2335,2243\n2335,2371\n2335,2349\n2336,2281\n2336,2374\n2336,2367\n2336,2338\n2337,2404\n2337,2357\n2338,2336\n2339,2419\n2339,2388\n2340,2401\n2340,2363\n2341,2289\n2341,2382\n2342,4035\n2342,2363\n2343,2298\n2343,2344\n2344,2343\n2344,69\n2345,2217\n2345,2346\n2346,2345\n2346,2311\n2346,2218\n2347,2231\n2347,2218\n2348,2303\n2348,2293\n2349,2335\n2349,2406\n2349,2350\n2350,2349\n2350,2224\n2351,840\n2351,2364\n2352,2327\n2352,2388\n2353,2388\n2353,2382\n2354,2304\n2354,2302\n2354,2372\n2355,2242\n2355,4634\n2355,2411\n2355,2387\n2356,2402\n2356,2376\n2357,2337\n2357,2263\n2357,2231\n2357,2215\n2358,2325\n2358,2371\n2359,2314\n2359,2227\n2360,2234\n2360,2362\n2361,2279\n2361,2233\n2362,2360\n2362,2363\n2363,2362\n2363,2342\n2363,2340\n2363,2365\n2363,2364\n2364,2363\n2364,2351\n2364,2312\n2364,2262\n2365,2363\n2365,4859\n2366,2319\n2366,2240\n2367,2336\n2367,2293\n2368,2290\n2368,2238\n2368,2389\n2368,2377\n2368,2369\n2369,2368\n2369,2298\n2369,2235\n2370,2317\n2370,2249\n2370,2216\n2371,2358\n2371,2335\n2371,2278\n2372,2354\n2372,2301\n2372,2282\n2372,2274\n2373,2332\n2373,2219\n2373,2397\n2374,2336\n2374,2378\n2374,2375\n2375,2374\n2375,2282\n2376,2356\n2376,2221\n2376,2403\n2377,2368\n2377,2290\n2378,2374\n2378,2386\n2378,2379\n2379,2378\n2379,2254\n2380,2327\n2380,2388\n2381,2333\n2381,2267\n2381,2382\n2382,2381\n2382,2353\n2382,2341\n2382,2294\n2382,2289\n2382,2268\n2382,2206\n2382,2419\n2382,2398\n2382,2395\n2382,2385\n2382,2384\n2382,2383\n2383,2382\n2383,2328\n2383,2309\n2383,2235\n2383,2223\n2384,2382\n2384,2418\n2385,2382\n2385,2418\n2386,2378\n2386,2247\n2386,2408\n2387,2355\n2387,2287\n2387,2216\n2387,4660\n2388,2380\n2388,2353\n2388,2352\n2388,2339\n2388,2309\n2388,2308\n2388,2246\n2389,2368\n2389,2332\n2389,2276\n2390,2208\n2390,2395\n2391,2394\n2392,2331\n2392,2285\n2392,2405\n2392,2394\n2392,2393\n2393,2392\n2393,2321\n2393,395\n2393,2394\n2394,2393\n2394,2392\n2394,2391\n2395,2390\n2395,2382\n2396,2238\n2396,2214\n2396,4849\n2397,2373\n2397,2219\n2397,2400\n2397,2399\n2397,2398\n2398,2397\n2398,2382\n2399,2397\n2400,2397\n2401,2340\n2402,2356\n2402,2221\n2403,2376\n2403,2221\n2404,2337\n2404,2225\n2405,2392\n2405,2330\n2405,2295\n2405,2232\n2405,2221\n2406,2349\n2406,2325\n2407,2300\n2407,2299\n2407,2274\n2407,2257\n2408,2386\n2408,2303\n2409,2233\n2409,4753\n2409,4749\n2409,4649\n2409,4632\n2409,4552\n2409,2410\n2410,2409\n2411,2355\n2411,2215\n2412,2249\n2412,2209\n2413,752\n2413,2414\n2414,2413\n2414,2279\n2414,2266\n2414,753\n2414,4695\n2415,2308\n2415,2416\n2416,2415\n2416,2268\n2417,790\n2417,777\n2418,2385\n2418,2384\n2418,2222\n2419,2382\n2419,2339\n2420,2327\n2420,2246\n2421,2245\n2421,2422\n2422,2421\n2423,4563\n2423,4491\n2424,2425\n2425,2424\n2425,2519\n2425,2459\n2426,490\n2426,2655\n2426,2485\n2427,2730\n2427,2729\n2428,2656\n2428,2586\n2428,2489\n2429,2617\n2429,2545\n2430,2595\n2431,2816\n2431,2432\n2432,2431\n2432,2590\n2433,2661\n2433,2578\n2434,2702\n2434,2701\n2434,2698\n2434,2668\n2434,2662\n2434,2624\n2434,2623\n2434,2619\n2434,2588\n2434,2524\n2434,2471\n2434,2436\n2435,2670\n2435,2638\n2435,2490\n2436,2434\n2436,2672\n2436,2586\n2437,2439\n2438,2439\n2439,2438\n2439,2437\n2439,2991\n2439,2885\n2439,2683\n2439,2682\n2439,2639\n2439,2633\n2439,2631\n2439,2596\n2439,2529\n2439,2449\n2440,4458\n2440,4148\n2440,4129\n2441,2443\n2442,2443\n2443,2442\n2443,2441\n2443,2627\n2443,2616\n2443,2521\n2444,3094\n2444,2956\n2444,2707\n2444,2685\n2444,2681\n2445,2708\n2445,2685\n2445,2604\n2446,3206\n2446,2559\n2446,2502\n2447,1184\n2447,2967\n2447,2814\n2447,2793\n2447,2457\n2448,2597\n2448,2545\n2449,2439\n2449,3189\n2449,2687\n2450,3043\n2450,2719\n2450,2717\n2450,2576\n2450,2451\n2451,2450\n2452,2694\n2452,2561\n2452,2551\n2453,2454\n2454,2453\n2454,2697\n2454,2586\n2454,2560\n2455,3228\n2455,3105\n2455,2838\n2455,2709\n2456,2709\n2456,2617\n2456,2458\n2457,2447\n2457,3011\n2457,3004\n2457,2930\n2457,2793\n2457,2458\n2458,2457\n2458,2456\n2458,2703\n2458,2677\n2458,2617\n2458,2593\n2458,2525\n2458,2487\n2458,2459\n2459,2458\n2459,2425\n2459,2599\n2459,2593\n2459,2591\n2459,2558\n2460,2461\n2461,2460\n2461,2590\n2461,2586\n2462,2463\n2463,2462\n2463,2991\n2463,2654\n2464,2713\n2464,2712\n2464,2543\n2464,2486\n2465,3279\n2465,3244\n2465,2939\n2465,2717\n2465,2716\n2466,2717\n2467,2717\n2468,2718\n2468,2561\n2468,2527\n2469,2723\n2469,2639\n2469,2596\n2470,2471\n2471,2470\n2471,2434\n2471,2966\n2472,3216\n2472,2588\n2472,2493\n2473,2645\n2473,2477\n2473,2476\n2474,2642\n2474,2559\n2474,2552\n2474,2483\n2474,2477\n2474,2476\n2474,2475\n2475,2474\n2475,2591\n2475,2558\n2475,2519\n2475,2503\n2476,2474\n2476,2473\n2476,3217\n2477,2474\n2477,2473\n2477,3218\n2478,2864\n2478,2810\n2479,2555\n2479,2481\n2479,2480\n2480,2479\n2480,2591\n2480,2482\n2481,2479\n2482,2480\n2483,2474\n2483,3219\n2483,2559\n2484,3091\n2484,3090\n2484,2736\n2484,2505\n2485,2426\n2485,2958\n2485,2764\n2485,2743\n2485,2741\n2485,2561\n2485,2548\n2485,2496\n2486,2464\n2486,2743\n2486,2543\n2486,2528\n2487,2458\n2487,2632\n2487,2617\n2488,3252\n2488,3214\n2488,2989\n2488,2576\n2488,2489\n2489,2488\n2489,2428\n2489,3115\n2489,3060\n2489,2586\n2489,2583\n2489,2521\n2490,2435\n2490,3017\n2490,2948\n2490,2730\n2490,2498\n2490,2495\n2491,2759\n2492,2646\n2492,2643\n2492,2493\n2493,2492\n2493,2472\n2493,3225\n2493,3224\n2493,3016\n2493,3014\n2493,2627\n2493,2588\n2494,3017\n2494,2760\n2494,2561\n2495,2490\n2495,2763\n2495,2762\n2495,2761\n2496,2485\n2496,3017\n2496,2766\n2497,3172\n2497,2769\n2497,2767\n2497,2595\n2498,2490\n2498,2769\n2498,2729\n2498,2513\n2499,3078\n2499,2544\n2499,2538\n2500,3271\n2500,3113\n2500,2776\n2500,2775\n2500,2579\n2500,2530\n2501,2645\n2501,2643\n2501,2502\n2502,2501\n2502,2446\n2502,3227\n2502,3226\n2502,3016\n2502,2552\n2502,2503\n2503,2502\n2503,2475\n2503,2611\n2504,2782\n2504,2609\n2504,2604\n2505,2484\n2505,3049\n2505,2785\n2505,2783\n2505,2522\n2506,2802\n2506,2777\n2506,2622\n2507,2508\n2508,2507\n2508,2613\n2508,2519\n2509,2627\n2509,2616\n2509,2511\n2509,2510\n2510,2509\n2511,2509\n2512,3229\n2513,2498\n2513,3017\n2513,2795\n2514,2595\n2514,2515\n2515,2514\n2515,3231\n2515,3036\n2515,2810\n2515,2595\n2516,2519\n2516,2518\n2516,2517\n2517,2516\n2518,2516\n2519,2516\n2519,2508\n2519,2475\n2519,2425\n2519,2602\n2519,2599\n2519,2558\n2520,3005\n2520,2595\n2520,2533\n2521,2489\n2521,2443\n2521,3233\n2521,2641\n2521,2559\n2522,2505\n2522,3047\n2522,3045\n2522,2807\n2522,2806\n2522,2617\n2522,2614\n2522,2601\n2523,2611\n2524,2434\n2524,2813\n2524,2586\n2525,2458\n2525,2617\n2526,3234\n2527,2468\n2527,2815\n2527,2804\n2527,2789\n2527,2600\n2527,2561\n2528,2486\n2528,2804\n2528,2612\n2528,2606\n2528,2549\n2528,2543\n2529,2439\n2529,3186\n2529,2917\n2529,2874\n2529,2554\n2530,2500\n2530,3181\n2530,3113\n2530,2918\n2530,2916\n2530,2792\n2530,2579\n2530,2531\n2531,2530\n2531,2726\n2531,2725\n2531,2636\n2532,2612\n2532,2557\n2533,2520\n2533,3179\n2533,3112\n2533,3005\n2533,2823\n2533,2821\n2533,2765\n2533,2595\n2533,2542\n2533,2534\n2534,2533\n2534,3017\n2534,2823\n2534,2821\n2534,2659\n2534,2564\n2535,2536\n2536,2535\n2536,2701\n2536,2629\n2537,3055\n2537,2841\n2537,2548\n2538,2499\n2538,3124\n2538,3123\n2538,2920\n2538,2554\n2538,2551\n2538,2550\n2538,2544\n2538,2539\n2539,2538\n2539,2606\n2539,2549\n2540,2828\n2541,2828\n2541,2583\n2542,2533\n2542,490\n2542,3207\n2542,3174\n2542,3112\n2542,3068\n2542,2997\n2542,2952\n2542,2836\n2542,2835\n2542,2834\n2542,2765\n2542,2728\n2543,2528\n2543,2486\n2543,2464\n2543,490\n2543,4219\n2543,2832\n2544,2538\n2544,2499\n2544,2923\n2544,2920\n2544,2844\n2544,2843\n2544,2791\n2545,2448\n2545,2429\n2545,3154\n2545,2862\n2545,2860\n2545,2858\n2545,2637\n2545,2592\n2545,2554\n2546,2548\n2547,2548\n2548,2547\n2548,2546\n2548,2537\n2548,2485\n2548,490\n2548,3055\n2548,2958\n2548,2848\n2548,2847\n2549,2539\n2549,2528\n2549,2856\n2549,2855\n2549,2551\n2550,2538\n2550,2854\n2550,2853\n2550,2850\n2550,2849\n2550,2561\n2550,2551\n2551,2550\n2551,2549\n2551,2538\n2551,2452\n2551,2852\n2552,2502\n2552,2474\n2552,3292\n2553,3284\n2553,3149\n2553,3141\n2553,3128\n2553,3096\n2553,2999\n2553,2995\n2553,2971\n2553,2922\n2553,2908\n2553,2874\n2553,2872\n2553,2871\n2553,2870\n2553,2845\n2553,2843\n2553,2809\n2553,2801\n2553,2721\n2554,2545\n2554,2538\n2554,2529\n2554,3187\n2554,2872\n2554,2871\n2554,2870\n2554,2608\n2554,2596\n2554,2575\n2555,2479\n2556,4317\n2556,4099\n2556,2621\n2557,2532\n2557,1131\n2557,2558\n2558,2557\n2558,2519\n2558,2475\n2558,2459\n2559,2521\n2559,2483\n2559,2474\n2559,2446\n2559,3243\n2559,3242\n2559,2627\n2560,2454\n2560,2882\n2560,2604\n2561,2550\n2561,2527\n2561,2494\n2561,2485\n2561,2468\n2561,2452\n2561,2900\n2561,2883\n2561,2826\n2562,133\n2562,81\n2562,57\n2562,4461\n2562,4448\n2562,4445\n2562,4129\n2563,3147\n2563,3146\n2563,2790\n2563,2620\n2564,2534\n2564,2892\n2564,2658\n2565,2941\n2565,2894\n2565,2817\n2565,2677\n2566,2567\n2567,2566\n2567,2941\n2567,2593\n2568,2895\n2569,2895\n2569,2666\n2569,2593\n2570,2896\n2571,2898\n2572,2899\n2572,2898\n2572,2593\n2573,2899\n2574,3281\n2574,3097\n2574,2972\n2574,2936\n2574,2906\n2574,2812\n2574,2692\n2574,2575\n2575,2574\n2575,2554\n2575,3154\n2575,2964\n2575,2907\n2575,2905\n2575,2904\n2575,2794\n2575,2733\n2575,2601\n2575,2597\n2575,2592\n2575,2581\n2576,2488\n2576,2450\n2576,3277\n2576,3205\n2576,3043\n2576,2989\n2577,3248\n2577,3247\n2577,3014\n2577,2641\n2577,2588\n2578,2433\n2578,2902\n2578,2586\n2579,2530\n2579,2500\n2579,3113\n2579,2580\n2580,2579\n2581,2575\n2582,2583\n2583,2582\n2583,2541\n2583,2489\n2584,2908\n2584,2608\n2584,2596\n2585,3215\n2585,3199\n2585,3158\n2585,3095\n2585,2911\n2585,2889\n2585,2880\n2585,2722\n2585,2720\n2585,2717\n2585,2710\n2585,2674\n2585,2586\n2586,2585\n2586,2578\n2586,2524\n2586,2489\n2586,2461\n2586,2454\n2586,2436\n2586,2428\n2586,2911\n2586,2604\n2587,2588\n2588,2587\n2588,2577\n2588,2493\n2588,2472\n2588,2434\n2589,3251\n2590,2461\n2590,2432\n2590,2912\n2591,2480\n2591,2475\n2591,2459\n2592,2575\n2592,2545\n2593,2572\n2593,2569\n2593,2567\n2593,2459\n2593,2458\n2593,2909\n2593,2704\n2594,1308\n2594,2909\n2594,2605\n2595,2533\n2595,2520\n2595,2515\n2595,2514\n2595,2497\n2595,2430\n2595,3179\n2595,3157\n2595,3005\n2596,2584\n2596,2554\n2596,2469\n2596,2439\n2596,2934\n2596,2928\n2596,2927\n2596,2918\n2597,2575\n2597,2448\n2597,2917\n2598,2599\n2599,2598\n2599,2519\n2599,2459\n2600,2527\n2600,2933\n2601,2575\n2601,2522\n2601,3049\n2601,2964\n2601,2936\n2602,2519\n2603,3115\n2603,2943\n2603,2608\n2604,2586\n2604,2560\n2604,2504\n2604,2445\n2604,2956\n2604,2955\n2604,2953\n2604,2609\n2605,2594\n2605,2953\n2605,2618\n2605,2606\n2606,2605\n2606,2539\n2606,2528\n2606,2960\n2606,2618\n2606,2612\n2606,2607\n2607,2606\n2607,3188\n2607,2959\n2607,2794\n2607,2733\n2607,2654\n2607,2611\n2607,2608\n2608,2607\n2608,2603\n2608,2584\n2608,2554\n2608,3060\n2608,2960\n2608,2790\n2608,2651\n2608,2624\n2608,2623\n2609,2604\n2609,2504\n2609,2963\n2610,2640\n2611,2607\n2611,2523\n2611,2503\n2611,3289\n2611,3288\n2611,2612\n2612,2611\n2612,2606\n2612,2532\n2612,2528\n2613,2508\n2614,2522\n2614,2970\n2614,2617\n2615,2616\n2616,2615\n2616,2509\n2616,2443\n2616,3266\n2617,2614\n2617,2525\n2617,2522\n2617,2487\n2617,2458\n2617,2456\n2617,2429\n2617,2974\n2617,2973\n2617,2886\n2617,2885\n2617,2637\n2618,2606\n2618,2605\n2618,2974\n2619,2434\n2619,2976\n2619,2966\n2620,2563\n2620,2978\n2620,2789\n2621,2556\n2621,4317\n2621,4265\n2621,4172\n2622,2506\n2622,2993\n2622,2702\n2622,2638\n2623,2608\n2623,2434\n2623,2979\n2624,2608\n2624,2434\n2624,2980\n2625,2627\n2626,2627\n2627,2626\n2627,2625\n2627,2559\n2627,2509\n2627,2493\n2627,2443\n2628,2990\n2628,2982\n2629,2536\n2629,2987\n2629,2986\n2629,2948\n2630,3272\n2631,2439\n2631,3283\n2631,2634\n2632,2487\n2632,3204\n2633,2439\n2633,3187\n2634,2631\n2635,2638\n2636,2531\n2636,2934\n2637,2617\n2637,2545\n2638,2635\n2638,2622\n2638,2435\n2639,2469\n2639,2439\n2640,2610\n2640,2966\n2640,2965\n2641,2577\n2641,2521\n2641,3208\n2642,2474\n2643,2501\n2643,2492\n2643,3212\n2643,2644\n2644,2643\n2644,3237\n2644,3236\n2644,2648\n2645,2501\n2645,2473\n2645,3240\n2645,3239\n2645,2648\n2645,2647\n2646,2492\n2646,3254\n2646,2648\n2647,2645\n2647,3260\n2647,3259\n2647,3258\n2647,3257\n2647,3256\n2647,3255\n2647,2649\n2648,2646\n2648,2645\n2648,2644\n2648,3261\n2648,2649\n2649,2648\n2649,2647\n2649,3274\n2649,3273\n2650,3289\n2650,3288\n2651,2608\n2651,3114\n2652,2795\n2652,2760\n2653,3188\n2653,3040\n2654,2607\n2654,2463\n2654,3019\n2655,2426\n2655,3178\n2655,3176\n2655,2825\n2655,2766\n2655,2740\n2656,2428\n2656,3155\n2656,2669\n2657,3077\n2657,2918\n2657,2916\n2657,2908\n2657,2693\n2658,2564\n2658,2667\n2659,2534\n2659,2759\n2660,3201\n2660,3024\n2661,2433\n2662,2434\n2662,3200\n2662,3104\n2662,2969\n2662,2959\n2662,2944\n2662,2837\n2662,2819\n2662,2813\n2662,2705\n2662,2684\n2662,2668\n2663,2668\n2664,2799\n2665,2799\n2666,2569\n2666,2788\n2667,2658\n2668,2663\n2668,2662\n2668,2434\n2669,2656\n2670,2435\n2670,3221\n2670,3008\n2670,3005\n2670,2795\n2671,3143\n2671,3026\n2671,3004\n2671,3001\n2671,2796\n2671,2780\n2672,2436\n2672,2674\n2672,2673\n2673,2672\n2674,2672\n2674,2585\n2674,3215\n2674,2890\n2674,2710\n2675,2914\n2676,2677\n2677,2676\n2677,2565\n2677,2458\n2678,2942\n2678,2714\n2679,2680\n2680,2679\n2680,490\n2680,2984\n2681,2444\n2682,2439\n2683,2439\n2684,2662\n2684,2813\n2685,2445\n2685,2444\n2685,2686\n2686,2685\n2686,3003\n2686,2778\n2687,2449\n2687,3099\n2687,3098\n2687,3050\n2687,2936\n2687,2846\n2687,2758\n2688,3090\n2689,3091\n2690,2691\n2691,2690\n2691,2942\n2691,2891\n2691,2837\n2692,2574\n2692,3262\n2692,3180\n2692,3145\n2692,2972\n2692,2936\n2693,2657\n2693,3286\n2693,3171\n2693,3077\n2693,2908\n2694,2452\n2694,3029\n2694,3022\n2694,3021\n2694,2921\n2695,2979\n2696,2787\n2696,2703\n2697,2454\n2697,3270\n2697,3190\n2697,3134\n2697,3133\n2697,3093\n2697,2881\n2698,2434\n2698,2699\n2699,2698\n2700,3268\n2700,2709\n2701,2536\n2701,2434\n2702,2622\n2702,2434\n2702,3067\n2703,2696\n2703,2458\n2703,3012\n2703,2787\n2703,2745\n2704,2593\n2704,3103\n2704,2896\n2705,2662\n2706,2840\n2706,2810\n2707,2444\n2708,2445\n2709,2700\n2709,2456\n2709,2455\n2710,2674\n2710,2585\n2710,3215\n2710,3199\n2711,3263\n2711,3220\n2711,3210\n2711,2957\n2712,2464\n2713,2464\n2714,2678\n2714,2942\n2715,3057\n2715,2978\n2715,2971\n2715,2811\n2716,2465\n2716,3279\n2716,3244\n2717,2585\n2717,2467\n2717,2466\n2717,2465\n2717,2450\n2717,4023\n2717,4022\n2717,3158\n2717,2720\n2717,2719\n2718,2468\n2719,2717\n2719,2450\n2720,2717\n2720,2585\n2721,2553\n2721,2723\n2722,2585\n2722,2973\n2722,2889\n2722,2880\n2722,2757\n2723,2721\n2723,2469\n2723,2846\n2724,3105\n2724,2857\n2724,2839\n2724,2838\n2724,2779\n2724,2756\n2724,2755\n2725,2531\n2725,3061\n2725,2726\n2726,2725\n2726,2531\n2726,3061\n2727,3287\n2727,3009\n2727,2781\n2728,2542\n2728,3265\n2728,3207\n2728,3062\n2728,2952\n2729,2498\n2729,2427\n2729,2731\n2730,2490\n2730,2427\n2730,2732\n2731,2729\n2732,2730\n2733,2607\n2733,2575\n2733,3064\n2734,2738\n2735,2827\n2736,2484\n2736,3010\n2736,2806\n2736,2738\n2736,2737\n2737,2736\n2737,3193\n2737,2779\n2737,2738\n2738,2737\n2738,2736\n2738,2734\n2739,2741\n2739,2740\n2740,2739\n2740,2655\n2740,3042\n2740,3041\n2740,2932\n2740,2883\n2740,2766\n2740,2760\n2741,2739\n2741,2485\n2741,2742\n2742,2741\n2743,2486\n2743,2485\n2743,2744\n2744,2743\n2745,2703\n2745,3012\n2746,3081\n2747,3082\n2748,3083\n2749,3084\n2750,3085\n2751,3086\n2752,3087\n2753,3088\n2754,3089\n2755,2724\n2756,2724\n2756,2857\n2757,2722\n2757,2889\n2758,2687\n2758,3099\n2759,2659\n2759,2491\n2760,2740\n2760,2652\n2760,2494\n2760,3041\n2760,2883\n2760,2878\n2760,2840\n2760,2795\n2761,2495\n2762,2495\n2763,2495\n2764,2485\n2764,3017\n2764,2765\n2765,2764\n2765,2542\n2765,2533\n2765,3112\n2766,2740\n2766,2655\n2766,2496\n2766,3100\n2767,2497\n2767,2768\n2768,2767\n2769,2498\n2769,2497\n2769,2770\n2770,2769\n2771,2781\n2771,2780\n2771,2772\n2772,2771\n2773,3002\n2774,3003\n2774,2981\n2775,2500\n2776,2500\n2777,2506\n2778,2686\n2778,2842\n2779,2737\n2779,2724\n2779,2857\n2779,2839\n2779,2838\n2780,2771\n2780,2671\n2780,3011\n2780,3004\n2780,2781\n2781,2780\n2781,2771\n2781,2727\n2781,3009\n2781,3001\n2781,2968\n2781,2967\n2782,2504\n2783,2505\n2783,3076\n2783,2785\n2783,2784\n2784,2783\n2784,2785\n2785,2784\n2785,2783\n2785,2505\n2786,2787\n2787,2786\n2787,2703\n2787,2696\n2787,3267\n2787,2977\n2788,2666\n2789,2620\n2789,2527\n2790,2608\n2790,2563\n2791,2544\n2791,2923\n2791,2792\n2792,2791\n2792,2530\n2792,3286\n2792,2916\n2793,2457\n2793,2447\n2793,3012\n2794,2607\n2794,2575\n2794,3108\n2795,2760\n2795,2670\n2795,2652\n2795,2513\n2796,2671\n2796,3152\n2796,3110\n2796,3026\n2796,2839\n2797,3175\n2797,2800\n2797,2798\n2798,2797\n2798,3253\n2798,3222\n2798,3211\n2798,3150\n2798,2997\n2798,2820\n2798,2800\n2799,2665\n2799,2664\n2799,490\n2799,2947\n2799,2946\n2799,2800\n2800,2799\n2800,2798\n2800,2797\n2800,3253\n2800,3222\n2800,3211\n2800,3151\n2800,3150\n2800,2997\n2800,2820\n2801,2553\n2801,3284\n2801,2995\n2801,2922\n2802,2506\n2803,2982\n2804,2528\n2804,2527\n2804,2805\n2805,2804\n2806,2736\n2806,2522\n2806,3238\n2806,3010\n2807,2522\n2807,3168\n2808,2842\n2809,2553\n2809,2843\n2810,2706\n2810,2515\n2810,2478\n2810,3036\n2810,2986\n2810,2864\n2810,2840\n2811,2715\n2811,2971\n2812,2574\n2813,2684\n2813,2662\n2813,2524\n2813,3116\n2813,3079\n2813,2976\n2813,2903\n2814,2447\n2814,3012\n2814,2983\n2814,2977\n2814,2967\n2815,2527\n2815,3198\n2815,3142\n2815,3106\n2815,2878\n2816,2431\n2817,2565\n2817,2818\n2818,2817\n2819,2662\n2819,3200\n2819,3131\n2819,2959\n2819,2944\n2819,2866\n2819,2837\n2820,2800\n2820,2798\n2820,2952\n2820,2865\n2820,2825\n2821,2534\n2821,2533\n2821,2822\n2822,2821\n2823,2534\n2823,2533\n2823,2824\n2824,2823\n2825,2820\n2825,2655\n2825,3178\n2825,3177\n2825,2952\n2825,2865\n2826,2561\n2826,3017\n2827,2735\n2827,2828\n2828,2827\n2828,2541\n2828,2540\n2829,2834\n2830,2835\n2831,2836\n2832,2543\n2832,490\n2832,2833\n2833,2832\n2834,2829\n2834,2542\n2834,490\n2835,2830\n2835,2542\n2835,490\n2836,2831\n2836,2542\n2836,490\n2837,2819\n2837,2691\n2837,2662\n2837,3131\n2837,3104\n2837,2969\n2837,2944\n2838,2779\n2838,2724\n2838,2455\n2838,3228\n2838,2857\n2838,2839\n2839,2838\n2839,2796\n2839,2779\n2839,2724\n2839,3250\n2839,3152\n2840,2810\n2840,2760\n2840,2706\n2840,3025\n2840,2883\n2840,2878\n2841,2537\n2841,2935\n2841,2932\n2842,2808\n2842,2778\n2842,3195\n2842,2981\n2842,2940\n2843,2809\n2843,2553\n2843,2544\n2843,3096\n2843,2908\n2844,2544\n2845,2553\n2845,2971\n2846,2723\n2846,2687\n2846,3213\n2846,3173\n2846,3018\n2846,2936\n2846,2862\n2846,2860\n2846,2858\n2847,2548\n2847,2932\n2848,2548\n2849,2550\n2849,2851\n2850,2550\n2850,2851\n2851,2850\n2851,2849\n2851,3276\n2851,3156\n2851,3130\n2851,3126\n2851,3038\n2851,2937\n2851,2914\n2851,2852\n2852,2851\n2852,2551\n2852,3278\n2852,3276\n2852,3275\n2852,3156\n2852,3130\n2852,3126\n2853,2550\n2854,2550\n2855,2549\n2856,2549\n2857,2838\n2857,2779\n2857,2756\n2857,2724\n2857,3080\n2858,2846\n2858,2545\n2858,2859\n2859,2858\n2860,2846\n2860,2545\n2860,2861\n2861,2860\n2862,2846\n2862,2545\n2862,2863\n2863,2862\n2864,2810\n2864,2478\n2864,3122\n2864,3120\n2864,3028\n2865,2825\n2865,2820\n2865,2952\n2866,2819\n2866,2959\n2867,2976\n2868,3135\n2869,3136\n2870,2554\n2870,2553\n2870,2876\n2871,2554\n2871,2553\n2871,2877\n2872,2554\n2872,2553\n2872,2873\n2873,2872\n2874,2553\n2874,2529\n2874,3186\n2874,2917\n2874,2875\n2875,2874\n2876,2870\n2877,2871\n2878,2840\n2878,2815\n2878,2760\n2878,3198\n2878,3153\n2878,2986\n2878,2883\n2879,3117\n2879,3111\n2879,2881\n2880,2722\n2880,2585\n2880,3230\n2880,3197\n2880,3095\n2880,2998\n2880,2889\n2880,2882\n2881,2879\n2881,2697\n2881,3190\n2881,3117\n2881,3111\n2881,2882\n2882,2881\n2882,2880\n2882,2560\n2883,2878\n2883,2840\n2883,2760\n2883,2740\n2883,2561\n2883,3153\n2883,3041\n2883,2986\n2883,2900\n2884,3147\n2884,3146\n2884,3058\n2885,2617\n2885,2439\n2885,2887\n2886,2617\n2886,3189\n2886,2888\n2887,2885\n2888,2886\n2889,2880\n2889,2757\n2889,2722\n2889,2585\n2890,2674\n2891,2691\n2891,2942\n2892,2564\n2893,3245\n2893,3000\n2893,2996\n2893,2894\n2894,2893\n2894,2565\n2895,2569\n2895,2568\n2896,2704\n2896,2570\n2896,2897\n2897,2896\n2897,3023\n2898,2572\n2898,2571\n2899,2573\n2899,2572\n2900,2883\n2900,2561\n2900,2901\n2901,2900\n2902,2578\n2903,2813\n2903,2976\n2904,2575\n2905,2575\n2906,2574\n2907,2575\n2908,2843\n2908,2693\n2908,2657\n2908,2584\n2908,2553\n2908,3096\n2908,2918\n2909,2594\n2909,2593\n2909,2910\n2910,2909\n2911,2586\n2911,2585\n2912,2590\n2913,2923\n2914,2851\n2914,2675\n2914,3280\n2914,3276\n2914,3156\n2914,3038\n2915,3138\n2915,2965\n2916,2792\n2916,2657\n2916,2530\n2916,2926\n2916,2918\n2917,2874\n2917,2597\n2917,2529\n2917,3186\n2918,2916\n2918,2908\n2918,2657\n2918,2596\n2918,2530\n2918,3181\n2918,2928\n2918,2927\n2918,2926\n2919,3167\n2920,2544\n2920,2538\n2921,2694\n2922,2801\n2922,2553\n2922,3051\n2923,2913\n2923,2791\n2923,2544\n2924,2938\n2924,2937\n2924,2925\n2925,2924\n2926,2918\n2926,2916\n2926,2929\n2927,2918\n2927,2596\n2927,3163\n2928,2918\n2928,2596\n2928,3164\n2929,2926\n2930,2457\n2931,3047\n2932,2847\n2932,2841\n2932,2740\n2932,3174\n2932,3042\n2932,3041\n2932,3020\n2932,2935\n2933,2600\n2934,2636\n2934,2596\n2935,2932\n2935,2841\n2936,2846\n2936,2692\n2936,2687\n2936,2601\n2936,2574\n2936,3241\n2936,3173\n2936,3034\n2936,3033\n2936,2972\n2937,2924\n2937,2851\n2937,3156\n2937,2938\n2938,2937\n2938,2924\n2938,3140\n2938,2994\n2939,2465\n2939,4024\n2939,3223\n2939,3169\n2940,2842\n2941,2567\n2941,2565\n2941,3170\n2942,2891\n2942,2714\n2942,2691\n2942,2678\n2943,2603\n2943,2980\n2944,2837\n2944,2819\n2944,2662\n2944,3200\n2944,3131\n2944,2945\n2945,2944\n2946,2799\n2947,2799\n2948,2629\n2948,2490\n2949,490\n2949,2950\n2950,2949\n2951,2997\n2952,2865\n2952,2825\n2952,2820\n2952,2728\n2952,2542\n2952,3265\n2952,3035\n2953,2605\n2953,2604\n2953,2954\n2954,2953\n2955,2604\n2955,2957\n2955,2956\n2956,2955\n2956,2604\n2956,2444\n2956,3094\n2957,2955\n2957,2711\n2957,3263\n2958,2548\n2958,2485\n2959,2866\n2959,2819\n2959,2662\n2959,2607\n2959,3161\n2959,3148\n2959,3121\n2959,3109\n2959,3063\n2960,2608\n2960,2606\n2960,2961\n2961,2960\n2962,2963\n2963,2962\n2963,2609\n2964,2601\n2964,2575\n2964,3066\n2965,2915\n2965,2640\n2966,2640\n2966,2619\n2966,2471\n2967,2814\n2967,2781\n2967,2447\n2967,3011\n2967,2968\n2968,2967\n2968,2781\n2969,2837\n2969,2662\n2969,3104\n2970,2614\n2970,3132\n2971,2845\n2971,2811\n2971,2715\n2971,2553\n2971,2978\n2972,2936\n2972,2692\n2972,2574\n2973,2722\n2973,2617\n2973,3052\n2974,2618\n2974,2617\n2974,2975\n2975,2974\n2976,2903\n2976,2867\n2976,2813\n2976,2619\n2977,2814\n2977,2787\n2977,3267\n2977,3203\n2977,2983\n2978,2971\n2978,2715\n2978,2620\n2978,3192\n2978,3191\n2979,2695\n2979,2623\n2979,3054\n2980,2943\n2980,2624\n2981,2842\n2981,2774\n2981,3003\n2982,2803\n2982,2628\n2983,2977\n2983,2814\n2983,3235\n2983,3232\n2984,2680\n2984,2990\n2984,2985\n2985,2984\n2986,2883\n2986,2878\n2986,2810\n2986,2629\n2986,3153\n2986,3107\n2987,2629\n2987,3122\n2988,2990\n2989,2576\n2989,2488\n2990,2988\n2990,2984\n2990,2628\n2991,2463\n2991,2439\n2991,3196\n2992,3197\n2993,2622\n2993,3119\n2993,3118\n2994,2938\n2995,2801\n2995,2553\n2996,2893\n2996,3245\n2997,2951\n2997,2800\n2997,2798\n2997,2542\n2997,3211\n2998,2880\n2998,3230\n2998,3197\n2999,2553\n3000,2893\n3001,2781\n3001,2671\n3001,3143\n3001,3002\n3002,3001\n3002,2773\n3003,2981\n3003,2774\n3003,2686\n3004,2780\n3004,2671\n3004,2457\n3004,3125\n3005,2670\n3005,2595\n3005,2533\n3005,2520\n3005,3221\n3005,3157\n3005,3056\n3005,3008\n3006,3007\n3007,3006\n3007,3247\n3008,3005\n3008,2670\n3008,3269\n3008,3221\n3008,3209\n3009,2781\n3009,2727\n3009,3264\n3009,3165\n3010,2806\n3010,2736\n3010,3238\n3011,2967\n3011,2780\n3011,2457\n3012,2814\n3012,2793\n3012,2745\n3012,2703\n3013,3014\n3014,3013\n3014,2577\n3014,2493\n3015,3016\n3016,3015\n3016,2502\n3016,2493\n3017,2826\n3017,2764\n3017,2534\n3017,2513\n3017,2496\n3017,2494\n3017,2490\n3018,2846\n3018,3213\n3018,3173\n3019,2654\n3020,2932\n3020,3174\n3021,2694\n3022,2694\n3023,2897\n3024,2660\n3024,3071\n3025,2840\n3026,2796\n3026,2671\n3027,3049\n3027,3048\n3028,2864\n3028,3122\n3029,2694\n3030,3284\n3030,3129\n3030,3128\n3031,3101\n3032,3102\n3033,2936\n3033,3034\n3034,3033\n3034,2936\n3035,2952\n3036,2810\n3036,2515\n3037,3041\n3038,2914\n3038,2851\n3038,3276\n3039,3105\n3040,2653\n3041,3037\n3041,2932\n3041,2883\n3041,2760\n3041,2740\n3041,3042\n3042,3041\n3042,2932\n3042,2740\n3043,2576\n3043,2450\n3044,3137\n3044,3075\n3044,3045\n3045,3044\n3045,2522\n3046,3135\n3046,3073\n3046,3047\n3047,3046\n3047,2931\n3047,2522\n3048,3027\n3049,3027\n3049,2601\n3049,2505\n3050,2687\n3050,3098\n3051,2922\n3052,2973\n3053,3197\n3054,2979\n3055,2548\n3055,2537\n3056,3005\n3057,2715\n3058,2884\n3059,3129\n3059,3128\n3060,2608\n3060,2489\n3061,2726\n3061,2725\n3062,2728\n3063,2959\n3063,3148\n3063,3109\n3064,2733\n3065,3202\n3065,3186\n3065,3159\n3066,2964\n3067,2702\n3068,2542\n3069,3167\n3069,3084\n3069,3070\n3070,3069\n3070,3089\n3070,3073\n3071,3024\n3071,3201\n3071,3137\n3071,3086\n3072,3166\n3072,3081\n3072,3073\n3073,3072\n3073,3070\n3073,3046\n3074,3085\n3074,3083\n3074,3075\n3075,3074\n3075,3044\n3075,3088\n3076,2783\n3077,2693\n3077,2657\n3078,2499\n3079,2813\n3079,3116\n3080,2857\n3081,3072\n3081,2746\n3082,2747\n3082,3101\n3083,3074\n3083,2748\n3084,3069\n3084,2749\n3085,3074\n3085,2750\n3086,3071\n3086,2751\n3087,2752\n3087,3102\n3088,3075\n3088,2753\n3089,3070\n3089,2754\n3090,2688\n3090,2484\n3090,3101\n3091,2689\n3091,2484\n3091,3102\n3092,3128\n3092,3127\n3093,2697\n3094,2956\n3094,2444\n3095,2880\n3095,2585\n3096,2908\n3096,2843\n3096,2553\n3097,2574\n3097,3281\n3098,3050\n3098,2687\n3099,2758\n3099,2687\n3100,2766\n3101,3090\n3101,3082\n3101,3031\n3102,3091\n3102,3087\n3102,3032\n3103,2704\n3104,2969\n3104,2837\n3104,2662\n3105,3039\n3105,2724\n3105,2455\n3106,2815\n3107,2986\n3108,2794\n3109,3063\n3109,2959\n3109,3148\n3110,2796\n3111,2881\n3111,2879\n3111,3117\n3112,2765\n3112,2542\n3112,2533\n3113,2579\n3113,2530\n3113,2500\n3114,2651\n3115,2603\n3115,2489\n3116,3079\n3116,2813\n3117,3111\n3117,2881\n3117,2879\n3117,3246\n3117,3144\n3118,2993\n3118,3119\n3119,3118\n3119,2993\n3120,2864\n3121,2959\n3121,3161\n3122,3028\n3122,2987\n3122,2864\n3122,3249\n3123,2538\n3123,3128\n3124,2538\n3124,3128\n3125,3004\n3126,2852\n3126,2851\n3126,3130\n3127,3092\n3127,3129\n3127,3128\n3128,3127\n3128,3124\n3128,3123\n3128,3092\n3128,3059\n3128,3030\n3128,2553\n3128,3284\n3128,3149\n3128,3129\n3129,3128\n3129,3127\n3129,3059\n3129,3030\n3129,3284\n3130,3126\n3130,2852\n3130,2851\n3131,2944\n3131,2837\n3131,2819\n3132,2970\n3133,2697\n3133,3270\n3133,3134\n3134,3133\n3134,2697\n3134,3270\n3135,3046\n3135,2868\n3136,2869\n3136,3137\n3137,3136\n3137,3071\n3137,3044\n3138,2915\n3139,3156\n3140,2938\n3141,2553\n3141,3284\n3142,2815\n3143,3001\n3143,2671\n3144,3117\n3144,3246\n3145,2692\n3145,3180\n3146,2884\n3146,2563\n3147,2884\n3147,2563\n3148,3109\n3148,3063\n3148,2959\n3149,3128\n3149,2553\n3150,2800\n3150,2798\n3151,2800\n3152,2839\n3152,2796\n3152,3250\n3153,2986\n3153,2883\n3153,2878\n3154,2575\n3154,2545\n3155,2656\n3156,3139\n3156,2937\n3156,2914\n3156,2852\n3156,2851\n3157,3005\n3157,2595\n3158,2717\n3158,2585\n3159,3065\n3159,3202\n3159,3186\n3160,3174\n3161,3121\n3161,2959\n3162,3197\n3163,2927\n3164,2928\n3165,3009\n3166,3072\n3167,3069\n3167,2919\n3168,2807\n3169,2939\n3170,2941\n3171,2693\n3171,3286\n3172,2497\n3173,3018\n3173,2936\n3173,2846\n3173,3213\n3174,3160\n3174,3020\n3174,2932\n3174,2542\n3174,3194\n3175,2797\n3176,2655\n3177,2825\n3178,2825\n3178,2655\n3179,2595\n3179,2533\n3180,3145\n3180,2692\n3181,2918\n3181,2530\n3182,3189\n3183,3188\n3184,3187\n3185,3186\n3186,3185\n3186,3159\n3186,3065\n3186,2917\n3186,2874\n3186,2529\n3186,3202\n3187,3184\n3187,2633\n3187,2554\n3188,3183\n3188,2653\n3188,2607\n3188,3283\n3189,3182\n3189,2886\n3189,2449\n3190,2881\n3190,2697\n3191,2978\n3192,2978\n3193,2737\n3194,3174\n3195,2842\n3196,2991\n3197,3162\n3197,3053\n3197,2998\n3197,2992\n3197,2880\n3197,3230\n3198,2878\n3198,2815\n3199,2710\n3199,2585\n3200,2944\n3200,2819\n3200,2662\n3201,3071\n3201,2660\n3202,3186\n3202,3159\n3202,3065\n3203,2977\n3204,2632\n3205,2576\n3205,3277\n3206,2446\n3207,2728\n3207,2542\n3208,2641\n3209,3008\n3209,3269\n3210,2711\n3211,2997\n3211,2800\n3211,2798\n3212,2643\n3213,3173\n3213,3018\n3213,2846\n3214,2488\n3214,3252\n3215,2710\n3215,2674\n3215,2585\n3216,2472\n3217,2476\n3217,3218\n3218,3217\n3218,2477\n3219,2483\n3219,3272\n3220,2711\n3221,3008\n3221,3005\n3221,2670\n3222,2800\n3222,2798\n3223,2939\n3224,2493\n3225,2493\n3226,2502\n3227,2502\n3228,2838\n3228,2455\n3229,2512\n3229,3266\n3230,3197\n3230,2998\n3230,2880\n3231,2515\n3232,2983\n3232,3235\n3233,2521\n3234,2526\n3234,3266\n3234,3251\n3235,3232\n3235,2983\n3236,2644\n3237,2644\n3238,3010\n3238,2806\n3239,2645\n3240,2645\n3241,2936\n3242,2559\n3243,2559\n3244,2716\n3244,2465\n3244,3279\n3245,2996\n3245,2893\n3246,3144\n3246,3117\n3247,3007\n3247,2577\n3248,2577\n3249,3122\n3250,3152\n3250,2839\n3251,3234\n3251,2589\n3251,3266\n3252,3214\n3252,2488\n3253,2800\n3253,2798\n3254,2646\n3255,2647\n3256,2647\n3257,2647\n3258,2647\n3259,2647\n3260,2647\n3261,2648\n3262,2692\n3263,2957\n3263,2711\n3264,3009\n3265,2952\n3265,2728\n3266,3251\n3266,3234\n3266,3229\n3266,2616\n3267,2977\n3267,2787\n3268,2700\n3269,3209\n3269,3008\n3270,3134\n3270,3133\n3270,2697\n3271,2500\n3272,3219\n3272,2630\n3273,2649\n3274,2649\n3275,2852\n3275,3276\n3276,3275\n3276,3038\n3276,2914\n3276,2852\n3276,2851\n3277,3205\n3277,2576\n3278,2852\n3279,3244\n3279,2716\n3279,2465\n3280,2914\n3281,3097\n3281,2574\n3281,3282\n3282,3281\n3283,3188\n3283,2631\n3284,3141\n3284,3129\n3284,3128\n3284,3030\n3284,2801\n3284,2553\n3285,3286\n3286,3285\n3286,3171\n3286,2792\n3286,2693\n3287,2727\n3288,2650\n3288,2611\n3288,3290\n3289,2650\n3289,2611\n3289,3291\n3290,3288\n3291,3289\n3292,2552\n3293,3593\n3293,3488\n3293,3411\n3294,3552\n3294,3388\n3294,3334\n3294,3295\n3295,3294\n3295,4861\n3295,3314\n3296,3568\n3296,3506\n3296,3433\n3296,3325\n3296,3297\n3297,3296\n3297,3333\n3297,3326\n3297,3310\n3298,3538\n3298,3299\n3299,3298\n3299,3558\n3299,3441\n3299,3440\n3299,3329\n3299,3314\n3300,3446\n3301,3708\n3301,3622\n3301,3446\n3302,3672\n3302,3631\n3302,3450\n3303,3468\n3304,3468\n3305,3468\n3306,3467\n3307,3652\n3307,3627\n3307,3540\n3307,3470\n3307,3469\n3307,3420\n3307,3344\n3308,3692\n3308,3654\n3308,3596\n3308,3580\n3308,3474\n3309,3645\n3309,3465\n3309,3464\n3309,3310\n3310,3309\n3310,3297\n3310,3484\n3310,3478\n3310,3477\n3310,3460\n3310,3357\n3310,3333\n3311,3455\n3311,3312\n3312,3311\n3312,3697\n3312,3632\n3312,3593\n3312,3484\n3312,3359\n3312,3351\n3312,3336\n3312,3333\n3312,3321\n3313,3693\n3313,3314\n3314,3313\n3314,3299\n3314,3295\n3314,3435\n3315,3656\n3315,3625\n3315,3610\n3315,3355\n3316,3620\n3316,3557\n3316,3536\n3316,3483\n3316,3366\n3316,3317\n3317,3316\n3317,3724\n3317,3421\n3317,3393\n3317,3392\n3317,3352\n3317,3336\n3318,4864\n3318,3473\n3319,3677\n3319,3574\n3319,3573\n3319,3497\n3319,3418\n3320,3607\n3320,3547\n3320,3546\n3320,3542\n3320,3360\n3321,3312\n3321,3698\n3321,3632\n3321,3471\n3321,3328\n3322,4830\n3322,3668\n3322,3454\n3322,3323\n3323,3322\n3323,3345\n3323,3331\n3324,3564\n3324,3342\n3325,3296\n3325,3572\n3326,3297\n3326,3576\n3327,3740\n3327,3713\n3327,3328\n3328,3327\n3328,3321\n3328,3742\n3328,3561\n3329,3299\n3329,3587\n3329,3586\n3329,3582\n3329,3558\n3329,3498\n3329,3472\n3329,3466\n3329,3365\n3330,3705\n3330,3581\n3330,3580\n3330,3331\n3331,3330\n3331,3323\n3331,4831\n3331,4603\n3331,3697\n3331,3435\n3332,3722\n3332,3616\n3332,3333\n3333,3332\n3333,3312\n3333,3310\n3333,3297\n3333,4876\n3334,3294\n3334,4759\n3334,3629\n3335,3336\n3336,3335\n3336,3317\n3336,3312\n3336,4655\n3336,3351\n3337,4865\n3337,3672\n3337,3628\n3337,3429\n3337,3349\n3338,3634\n3339,3643\n3340,3342\n3341,4875\n3341,3529\n3341,3342\n3342,3341\n3342,3340\n3342,3324\n3342,4876\n3342,3413\n3343,3659\n3343,3648\n3343,3647\n3343,3639\n3343,3638\n3343,3583\n3343,3574\n3343,3573\n3344,3307\n3344,3648\n3344,3647\n3344,3472\n3345,3323\n3345,4888\n3345,3622\n3345,3403\n3346,3709\n3346,3360\n3347,3729\n3347,3678\n3347,3661\n3347,3402\n3347,3349\n3347,3348\n3348,3347\n3348,4883\n3349,3347\n3349,3337\n3349,3663\n3350,3701\n3350,3700\n3350,3688\n3350,3674\n3350,3673\n3351,3336\n3351,3312\n3351,3702\n3351,3689\n3351,3674\n3351,3673\n3351,3671\n3351,3598\n3351,3561\n3352,3317\n3352,4582\n3352,3652\n3352,3612\n3352,3365\n3352,3362\n3352,3361\n3353,3655\n3353,3563\n3353,3486\n3353,3423\n3354,3355\n3355,3354\n3355,3315\n3355,3716\n3355,3715\n3355,3714\n3355,3638\n3355,3601\n3355,3569\n3355,3437\n3355,3432\n3356,3723\n3356,3722\n3356,3683\n3356,3590\n3356,3357\n3357,3356\n3357,3310\n3358,3727\n3358,3726\n3358,3725\n3358,3395\n3358,3359\n3359,3358\n3359,3312\n3359,3725\n3359,3466\n3360,3346\n3360,3320\n3360,4677\n3360,3730\n3360,3361\n3361,3360\n3361,3352\n3361,4678\n3362,3352\n3362,4476\n3363,4509\n3363,3475\n3364,4570\n3364,3579\n3365,3352\n3365,3329\n3365,3716\n3366,3316\n3367,3368\n3368,3367\n3368,3370\n3368,3369\n3369,3368\n3369,4875\n3370,3368\n3370,3523\n3371,3621\n3371,3608\n3371,3567\n3371,3516\n3372,4878\n3373,3431\n3374,3431\n3375,3431\n3376,3432\n3377,3480\n3378,4478\n3378,3380\n3378,3379\n3379,3378\n3380,3378\n3381,4850\n3382,3740\n3383,3562\n3384,3591\n3385,4850\n3386,3445\n3387,4878\n3388,3294\n3389,3580\n3390,3690\n3391,3694\n3392,3317\n3393,3317\n3394,3709\n3395,3358\n3396,3656\n3397,3656\n3398,3625\n3399,3675\n3399,3565\n3400,3609\n3400,3534\n3400,3401\n3401,3400\n3401,3686\n3401,3554\n3401,3402\n3402,3401\n3402,3347\n3403,3345\n3403,3748\n3403,3747\n3404,3682\n3404,3456\n3405,3658\n3406,3410\n3407,3410\n3408,3411\n3409,3411\n3410,3407\n3410,3406\n3410,3712\n3410,3677\n3410,3666\n3410,3411\n3411,3410\n3411,3409\n3411,3408\n3411,3293\n3411,3676\n3411,3519\n3411,3517\n3412,3626\n3412,3468\n3413,3342\n3413,3684\n3414,3551\n3414,3502\n3415,3659\n3415,3468\n3416,3431\n3416,3430\n3416,3417\n3417,3416\n3417,3431\n3418,3319\n3418,3676\n3418,3565\n3419,3627\n3420,3307\n3420,3532\n3421,3317\n3421,3671\n3422,3553\n3422,3528\n3423,3353\n3423,3426\n3423,3425\n3424,3426\n3425,3423\n3426,3424\n3426,3423\n3426,3733\n3426,3600\n3427,3623\n3427,3608\n3428,3429\n3429,3428\n3429,3337\n3429,3619\n3430,3416\n3431,3417\n3431,3416\n3431,3375\n3431,3374\n3431,3373\n3431,3695\n3431,3610\n3432,3376\n3432,3355\n3432,3695\n3433,3296\n3433,3657\n3434,3564\n3434,3529\n3435,3331\n3435,3314\n3436,3567\n3436,3485\n3437,3355\n3437,3665\n3438,3588\n3438,3527\n3439,3590\n3440,3299\n3441,3299\n3442,3614\n3442,3444\n3443,3740\n3444,3442\n3445,3386\n3445,3737\n3445,3448\n3445,3447\n3446,3301\n3446,3300\n3446,3737\n3447,3445\n3448,3445\n3449,3710\n3449,3545\n3450,3302\n3451,3615\n3452,3497\n3453,3646\n3453,3454\n3454,3453\n3454,3322\n3454,4845\n3455,3311\n3455,3621\n3456,3404\n3456,3663\n3456,3458\n3456,3457\n3457,3456\n3458,3456\n3459,3465\n3460,3310\n3461,3462\n3462,3461\n3462,3465\n3462,3463\n3463,3462\n3463,3464\n3464,3463\n3464,3309\n3465,3462\n3465,3459\n3465,3309\n3466,3359\n3466,3329\n3467,3306\n3467,3620\n3467,3527\n3467,3503\n3467,3502\n3467,3468\n3468,3467\n3468,3415\n3468,3412\n3468,3305\n3468,3304\n3468,3303\n3468,3614\n3468,3613\n3468,3592\n3468,3591\n3468,3526\n3468,3479\n3468,3470\n3468,3469\n3469,3468\n3469,3307\n3470,3468\n3470,3307\n3471,3321\n3471,3598\n3472,3344\n3472,3329\n3473,3318\n3473,3544\n3474,3308\n3475,3363\n3476,3710\n3477,3310\n3478,3310\n3479,3468\n3480,3377\n3480,3699\n3480,3481\n3481,3480\n3482,3536\n3483,3316\n3483,3739\n3484,3312\n3484,3310\n3484,3684\n3484,3485\n3485,3484\n3485,3436\n3485,3567\n3485,3486\n3486,3485\n3486,3353\n3486,3733\n3486,3560\n3486,3487\n3487,3486\n3487,3679\n3488,3293\n3488,3498\n3489,3737\n3489,3545\n3490,3491\n3491,3490\n3491,3727\n3491,3675\n3492,3650\n3493,3500\n3493,3499\n3493,3496\n3494,3734\n3494,3501\n3494,3499\n3495,3735\n3495,3501\n3495,3500\n3496,3493\n3497,3452\n3497,3319\n3497,3626\n3497,3525\n3497,3501\n3497,3500\n3497,3499\n3498,3488\n3498,3329\n3498,3627\n3498,3515\n3499,3497\n3499,3494\n3499,3493\n3500,3497\n3500,3495\n3500,3493\n3501,3497\n3501,3495\n3501,3494\n3502,3467\n3502,3414\n3503,3467\n3503,3550\n3504,3732\n3504,3696\n3505,3506\n3506,3505\n3506,3296\n3506,3616\n3507,3510\n3508,3513\n3509,3511\n3510,3507\n3510,3512\n3511,3509\n3511,3738\n3511,3563\n3511,3513\n3511,3512\n3512,3511\n3512,3510\n3512,3564\n3512,3560\n3513,3511\n3513,3508\n3514,3701\n3514,3700\n3514,3551\n3514,3550\n3515,3498\n3515,3742\n3516,3371\n3517,3411\n3517,3584\n3517,3520\n3518,3666\n3519,3411\n3520,3517\n3521,3557\n3522,3739\n3522,3571\n3523,3370\n3523,3623\n3524,3525\n3525,3524\n3525,3497\n3525,3637\n3526,3468\n3526,3665\n3527,3467\n3527,3438\n3528,3422\n3529,3434\n3529,3341\n3530,3703\n3530,3531\n3531,3530\n3532,3420\n3532,3670\n3533,3706\n3534,3400\n3535,3717\n3536,3482\n3536,3316\n3536,3703\n3537,3746\n3537,3538\n3538,3537\n3538,3298\n3538,3741\n3539,3654\n3540,3307\n3540,3724\n3541,3667\n3541,3653\n3541,3604\n3542,3320\n3542,3717\n3542,3562\n3543,4862\n3544,3473\n3544,3556\n3545,3489\n3545,3449\n3545,3618\n3545,3617\n3546,3320\n3547,3320\n3548,3612\n3549,3706\n3550,3514\n3550,3503\n3551,3514\n3551,3414\n3552,3294\n3552,3692\n3553,3422\n3553,1\n3553,3675\n3554,3401\n3554,3651\n3555,3609\n3555,3605\n3556,3544\n3556,3708\n3557,3521\n3557,3316\n3558,3329\n3558,3299\n3559,3579\n3560,3512\n3560,3486\n3561,3351\n3561,3328\n3562,3542\n3562,3383\n3562,3744\n3563,3511\n3563,3353\n3563,3564\n3564,3563\n3564,3512\n3564,3434\n3564,3324\n3564,3655\n3565,3418\n3565,3399\n3565,3675\n3566,3719\n3567,3485\n3567,3436\n3567,3371\n3568,3296\n3568,3731\n3568,3577\n3569,3355\n3569,3588\n3570,3601\n3571,3522\n3571,3601\n3572,3325\n3572,3657\n3572,3589\n3573,3343\n3573,3319\n3574,3343\n3574,3319\n3575,3589\n3576,3326\n3576,3731\n3576,3718\n3576,3578\n3576,3577\n3577,3576\n3577,3568\n3578,3576\n3579,3559\n3579,3364\n3580,3389\n3580,3330\n3580,3308\n3581,3330\n3581,3654\n3582,3329\n3582,3612\n3583,3343\n3583,2\n3583,3625\n3584,3517\n3584,3585\n3585,3584\n3585,3726\n3586,3329\n3586,1\n3587,3329\n3587,1\n3588,3569\n3588,3438\n3589,3575\n3589,3572\n3590,3439\n3590,3356\n3590,3624\n3591,3468\n3591,3384\n3591,3615\n3592,3468\n3592,3662\n3593,3312\n3593,3293\n3594,3726\n3595,3727\n3596,3308\n3596,3597\n3597,3596\n3597,3693\n3598,3471\n3598,3351\n3599,3719\n3599,3628\n3600,3426\n3600,3738\n3601,3571\n3601,3570\n3601,3355\n3602,3719\n3603,3660\n3603,3605\n3604,3541\n3604,3611\n3605,3603\n3605,3555\n3605,3606\n3606,3605\n3607,3320\n3607,3736\n3607,3709\n3608,3427\n3608,3371\n3609,3555\n3609,3400\n3609,3661\n3610,3431\n3610,3315\n3611,3604\n3611,3669\n3612,3582\n3612,3548\n3612,3352\n3613,3468\n3613,3662\n3614,3468\n3614,3442\n3615,3591\n3615,3451\n3616,3506\n3616,3332\n3617,3545\n3618,3545\n3618,3649\n3619,3429\n3619,3705\n3620,3467\n3620,3316\n3621,3455\n3621,3371\n3621,3732\n3622,3345\n3622,3301\n3623,3523\n3623,3427\n3624,3590\n3625,3583\n3625,3398\n3625,3315\n3626,3497\n3626,3412\n3627,3498\n3627,3419\n3627,3307\n3628,3599\n3628,3337\n3629,3334\n3629,3741\n3630,3631\n3631,3630\n3631,3302\n3631,3722\n3632,3321\n3632,3312\n3633,3722\n3633,3683\n3634,3338\n3634,3635\n3635,3634\n3635,3721\n3636,3637\n3637,3636\n3637,3525\n3637,1\n3638,3355\n3638,3343\n3639,3343\n3639,3656\n3640,3641\n3641,3640\n3641,3678\n3642,4885\n3643,3339\n3643,4628\n3644,3645\n3645,3644\n3645,3309\n3645,3722\n3646,3453\n3647,3344\n3647,3343\n3648,3344\n3648,3343\n3649,3618\n3649,4885\n3649,3669\n3650,3492\n3650,3651\n3651,3650\n3651,3554\n3651,3663\n3652,3352\n3652,3307\n3653,3541\n3654,3581\n3654,3539\n3654,3308\n3655,3564\n3655,3353\n3656,3639\n3656,3397\n3656,3396\n3656,3315\n3657,3572\n3657,3433\n3658,3405\n3658,3686\n3659,3415\n3659,3343\n3660,3603\n3661,3609\n3661,3347\n3661,3743\n3661,3682\n3662,3613\n3662,3592\n3663,3651\n3663,3456\n3663,3349\n3664,3726\n3665,3526\n3665,3437\n3666,3518\n3666,3410\n3667,3541\n3667,3745\n3668,3322\n3668,3745\n3669,3649\n3669,3611\n3670,3532\n3670,3702\n3671,3421\n3671,3351\n3672,3337\n3672,3302\n3673,3351\n3673,3350\n3674,3351\n3674,3350\n3675,3565\n3675,3553\n3675,3491\n3675,3399\n3675,3699\n3676,3418\n3676,3411\n3677,3410\n3677,3319\n3678,3641\n3678,3347\n3679,3487\n3679,3681\n3679,3680\n3680,3679\n3681,3679\n3682,3661\n3682,3404\n3683,3633\n3683,3356\n3683,3722\n3683,3685\n3684,3484\n3684,3413\n3685,3683\n3685,3723\n3686,3658\n3686,3401\n3687,3728\n3688,3350\n3689,3351\n3689,3698\n3690,3390\n3690,3691\n3691,3690\n3691,3692\n3692,3691\n3692,3552\n3692,3308\n3693,3597\n3693,3313\n3694,3391\n3694,3695\n3695,3694\n3695,3432\n3695,3431\n3696,3504\n3696,3697\n3697,3696\n3697,3331\n3697,3312\n3698,3689\n3698,3321\n3699,3675\n3699,3480\n3700,3514\n3700,3350\n3701,3514\n3701,3350\n3702,3670\n3702,3351\n3703,3536\n3703,3530\n3704,3705\n3705,3704\n3705,3619\n3705,3330\n3706,3549\n3706,3533\n3706,3707\n3707,3706\n3707,3708\n3708,3707\n3708,3556\n3708,3301\n3709,3607\n3709,3394\n3709,3346\n3710,3476\n3710,3449\n3711,3713\n3711,3712\n3712,3711\n3712,3410\n3713,3711\n3713,3327\n3714,3355\n3715,3355\n3716,3365\n3716,3355\n3717,3542\n3717,3535\n3718,3576\n3719,3602\n3719,3599\n3719,3566\n3720,3737\n3721,3635\n3721,3722\n3722,3721\n3722,3683\n3722,3645\n3722,3633\n3722,3631\n3722,3356\n3722,3332\n3723,3685\n3723,3356\n3724,3540\n3724,3317\n3725,3359\n3725,3358\n3726,3664\n3726,3594\n3726,3585\n3726,3358\n3727,3595\n3727,3491\n3727,3358\n3728,3687\n3728,3729\n3729,3728\n3729,3347\n3730,3360\n3731,3576\n3731,3568\n3732,3621\n3732,3504\n3733,3486\n3733,3426\n3734,3494\n3735,3495\n3736,3607\n3737,3720\n3737,3489\n3737,3446\n3737,3445\n3738,3600\n3738,3511\n3739,3522\n3739,3483\n3740,3443\n3740,3382\n3740,3327\n3741,3629\n3741,3538\n3742,3515\n3742,3328\n3743,3661\n3744,3562\n3745,3668\n3745,3667\n3746,3537\n3747,3403\n3747,3748\n3748,3747\n3748,3403\n3749,3932\n3749,3778\n3750,3793\n3750,3767\n3750,3762\n3751,3793\n3751,3762\n3752,3936\n3752,3804\n3752,3773\n3753,3774\n3753,3755\n3753,3754\n3754,3753\n3754,3784\n3755,3753\n3755,3778\n3756,3757\n3757,3756\n3757,3931\n3757,3930\n3757,3792\n3758,3883\n3758,3792\n3758,3759\n3759,3758\n3760,3761\n3761,3760\n3761,3788\n3761,3784\n3762,3751\n3762,3750\n3762,3935\n3762,3932\n3762,3926\n3762,3788\n3762,3764\n3763,4199\n3763,3946\n3763,3789\n3763,3766\n3763,3765\n3764,3762\n3765,3763\n3766,3763\n3766,3938\n3766,3838\n3766,3801\n3767,3750\n3767,3838\n3768,3943\n3768,3838\n3769,692\n3769,483\n3769,3770\n3770,3769\n3770,113\n3770,3782\n3771,3847\n3771,3825\n3771,3783\n3771,3772\n3772,3771\n3773,3752\n3773,3795\n3774,3753\n3774,3863\n3774,3797\n3775,3922\n3775,3921\n3775,3809\n3775,3792\n3775,3777\n3775,3776\n3776,3775\n3776,3797\n3777,3775\n3777,3797\n3778,3755\n3778,3749\n3778,3943\n3779,3893\n3779,3871\n3779,3855\n3779,3851\n3779,3816\n3779,3781\n3780,3790\n3780,3781\n3781,3780\n3781,3779\n3781,726\n3781,3870\n3781,3801\n3781,3798\n3781,3785\n3782,3770\n3782,3870\n3783,3771\n3783,3879\n3783,3868\n3783,3842\n3783,3841\n3783,3836\n3783,3785\n3783,3784\n3784,3783\n3784,3761\n3784,3754\n3784,3797\n3784,3785\n3785,3784\n3785,3783\n3785,3781\n3785,4199\n3785,3905\n3785,3798\n3785,3787\n3786,3896\n3786,3891\n3786,3886\n3786,3857\n3786,3787\n3787,3786\n3787,3785\n3787,3789\n3788,3762\n3788,3761\n3788,3935\n3788,3895\n3789,3787\n3789,3763\n3789,3895\n3790,3780\n3790,3937\n3791,3792\n3792,3791\n3792,3775\n3792,3758\n3792,3757\n3792,3922\n3792,3822\n3793,3751\n3793,3750\n3793,3904\n3793,3794\n3794,3793\n3794,3795\n3795,3794\n3795,3773\n3795,3802\n3796,3934\n3796,3916\n3796,3887\n3796,3877\n3796,3876\n3796,3854\n3796,3799\n3796,3797\n3797,3796\n3797,3784\n3797,3777\n3797,3776\n3797,3774\n3797,3937\n3797,3800\n3798,3785\n3798,3781\n3798,3941\n3798,3940\n3798,3939\n3799,3796\n3800,3797\n3801,3781\n3801,3766\n3801,3918\n3802,3795\n3802,3944\n3802,3936\n3802,3928\n3802,3804\n3802,3803\n3803,3802\n3803,4199\n3803,3938\n3804,3802\n3804,3752\n3804,3928\n3805,3864\n3805,3863\n3806,3838\n3806,3807\n3807,3806\n3807,3901\n3807,3844\n3808,3894\n3808,3875\n3809,3775\n3809,3945\n3809,3930\n3809,3921\n3809,3857\n3810,3821\n3810,3811\n3811,3810\n3811,3864\n3811,3831\n3812,3898\n3812,3843\n3812,3813\n3813,3812\n3813,3838\n3814,3908\n3814,3831\n3815,3849\n3815,3821\n3815,3819\n3816,3779\n3816,3817\n3817,3816\n3817,3890\n3817,3889\n3818,3880\n3819,3815\n3820,3896\n3821,3815\n3821,3810\n3822,3792\n3822,3881\n3822,3823\n3823,3822\n3823,3913\n3823,3912\n3823,3893\n3824,3842\n3824,3825\n3825,3824\n3825,3771\n3825,3903\n3826,3918\n3826,3908\n3826,3863\n3827,3944\n3827,3856\n3827,3828\n3828,3827\n3829,3900\n3829,3895\n3829,3837\n3829,3830\n3830,3829\n3830,3895\n3830,3832\n3831,3814\n3831,3811\n3831,3849\n3832,3830\n3832,3833\n3833,3832\n3833,3919\n3834,3879\n3834,3863\n3834,3855\n3834,3850\n3834,3835\n3835,3834\n3836,3783\n3836,3918\n3836,3907\n3837,3829\n3837,3895\n3838,3813\n3838,3806\n3838,3768\n3838,3767\n3838,3766\n3838,3906\n3838,3862\n3838,3844\n3838,3840\n3838,3839\n3839,3838\n3839,3923\n3840,3838\n3840,3843\n3841,3783\n3842,3824\n3842,3783\n3843,3840\n3843,3812\n3843,3844\n3844,3843\n3844,3838\n3844,3807\n3845,3873\n3845,3872\n3846,3847\n3847,3846\n3847,3771\n3847,3859\n3848,3927\n3848,3920\n3848,3895\n3849,3831\n3849,3815\n3850,3834\n3850,3851\n3851,3850\n3851,3779\n3851,3863\n3852,3853\n3853,3852\n3853,3861\n3853,3856\n3854,3796\n3854,3888\n3855,3834\n3855,3779\n3855,3912\n3856,3853\n3856,3827\n3857,3809\n3857,3786\n3858,3859\n3859,3858\n3859,3847\n3859,3868\n3860,3903\n3860,3902\n3861,3853\n3861,3914\n3862,3838\n3862,3901\n3863,3851\n3863,3834\n3863,3826\n3863,3805\n3863,3774\n3863,3907\n3863,3864\n3864,3863\n3864,3811\n3864,3805\n3865,3904\n3865,3866\n3866,3865\n3866,3906\n3866,3904\n3867,3895\n3867,3872\n3868,3859\n3868,3783\n3869,3870\n3870,3869\n3870,3782\n3870,3781\n3871,3779\n3871,3916\n3871,3915\n3872,3867\n3872,3845\n3872,3911\n3872,3895\n3873,3845\n3873,3929\n3873,3874\n3874,3873\n3874,3903\n3874,3895\n3875,3808\n3875,3892\n3875,3878\n3876,3796\n3876,3877\n3877,3876\n3877,3796\n3877,3916\n3878,3875\n3878,3904\n3879,3834\n3879,3783\n3880,3818\n3880,3925\n3881,3822\n3881,3916\n3881,3882\n3882,3881\n3882,3917\n3883,3758\n3883,3910\n3884,3904\n3884,3885\n3885,3884\n3885,3914\n3885,3904\n3886,3786\n3887,3796\n3887,3890\n3887,3888\n3888,3887\n3888,3854\n3888,3909\n3889,3817\n3890,3887\n3890,3817\n3890,3909\n3891,3786\n3891,3902\n3892,3875\n3892,3938\n3893,3823\n3893,3779\n3893,3915\n3894,3808\n3894,3904\n3895,3874\n3895,3872\n3895,3867\n3895,3848\n3895,3837\n3895,3830\n3895,3829\n3895,3789\n3895,3788\n3895,3927\n3895,3920\n3895,3919\n3895,3900\n3896,3820\n3896,3786\n3897,3933\n3897,3923\n3897,3898\n3898,3897\n3898,3812\n3898,3918\n3899,3900\n3900,3899\n3900,3895\n3900,3829\n3901,3862\n3901,3807\n3901,3925\n3902,3891\n3902,3860\n3902,3903\n3903,3902\n3903,3874\n3903,3860\n3903,3825\n3903,3927\n3904,3894\n3904,3885\n3904,3884\n3904,3878\n3904,3866\n3904,3865\n3904,3793\n3904,3905\n3905,3904\n3905,3785\n3905,4199\n3906,3866\n3906,3838\n3907,3863\n3907,3836\n3908,3826\n3908,3814\n3908,3925\n3909,3890\n3909,3888\n3910,3883\n3910,3917\n3911,3872\n3911,3918\n3912,3855\n3912,3823\n3913,3823\n3913,3922\n3914,3885\n3914,3861\n3915,3893\n3915,3871\n3916,3881\n3916,3877\n3916,3871\n3916,3796\n3916,3917\n3917,3916\n3917,3910\n3917,3882\n3918,3911\n3918,3898\n3918,3836\n3918,3826\n3918,3801\n3918,3933\n3919,3895\n3919,3833\n3920,3895\n3920,3848\n3921,3809\n3921,3775\n3922,3913\n3922,3792\n3922,3775\n3923,3897\n3923,3839\n3923,3924\n3924,3923\n3925,3908\n3925,3901\n3925,3880\n3926,3762\n3927,3903\n3927,3895\n3927,3848\n3928,3804\n3928,3802\n3929,3873\n3930,3809\n3930,3757\n3930,3931\n3931,3930\n3931,3757\n3932,3762\n3932,3749\n3933,3918\n3933,3897\n3934,3796\n3935,3788\n3935,3762\n3936,3802\n3936,3752\n3937,3797\n3937,3790\n3938,3892\n3938,3803\n3938,3766\n3939,3798\n3940,3798\n3941,3798\n3942,3943\n3943,3942\n3943,3778\n3943,3768\n3944,3827\n3944,3802\n3945,3809\n3946,3763\n3947,3973\n3948,4012\n3948,3978\n3948,3956\n3949,3998\n3949,3950\n3950,3949\n3950,3975\n3951,3980\n3951,3975\n3952,4040\n3953,4000\n3953,3983\n3954,4064\n3954,4062\n3954,3995\n3954,3966\n3955,4056\n3955,4055\n3955,3969\n3956,3948\n3956,3963\n3956,3957\n3957,3956\n3957,4031\n3957,4008\n3957,3989\n3957,3979\n3957,3965\n3958,4016\n3958,3999\n3958,3959\n3959,3958\n3959,4011\n3959,4008\n3959,3997\n3959,3979\n3960,4034\n3960,4023\n3960,3962\n3961,4045\n3961,3962\n3962,3961\n3962,3960\n3962,4047\n3962,4004\n3963,3956\n3963,3999\n3964,3965\n3965,3964\n3965,3957\n3965,4002\n3966,3954\n3966,4064\n3966,4063\n3966,4041\n3966,3985\n3967,3969\n3968,3969\n3969,3968\n3969,3967\n3969,3955\n3969,3971\n3970,3972\n3970,3971\n3971,3970\n3971,3969\n3971,4072\n3971,4029\n3972,3970\n3972,4005\n3972,3992\n3973,3947\n3973,3995\n3973,3984\n3974,4078\n3975,3951\n3975,3950\n3975,3994\n3976,3979\n3977,3979\n3978,3948\n3978,3979\n3979,3978\n3979,3977\n3979,3976\n3979,3959\n3979,3957\n3979,4027\n3979,4020\n3979,3980\n3980,3979\n3980,3951\n3981,4038\n3981,3983\n3982,518\n3982,4067\n3982,4035\n3983,3981\n3983,3953\n3983,4000\n3984,3973\n3984,3985\n3985,3984\n3985,3966\n3985,3987\n3985,3986\n3986,3985\n3986,4078\n3987,3985\n3987,426\n3988,4048\n3988,4006\n3989,3957\n3990,4025\n3990,3991\n3991,3990\n3991,4003\n3992,3972\n3992,4021\n3992,4013\n3992,4012\n3993,4033\n3994,3975\n3994,4068\n3995,3973\n3995,3954\n3995,4065\n3996,4016\n3996,3997\n3997,3996\n3997,3959\n3998,3949\n3998,4050\n3999,3963\n3999,3958\n4000,3983\n4000,3953\n4000,4029\n4000,4020\n4000,4001\n4001,4000\n4001,4030\n4002,3965\n4002,4047\n4002,4020\n4003,3991\n4003,4034\n4004,3962\n4004,4036\n4005,3972\n4005,4028\n4006,3988\n4006,4007\n4007,4006\n4007,4056\n4007,4049\n4008,3959\n4008,3957\n4009,4079\n4009,4046\n4009,4037\n4009,4018\n4010,4047\n4010,4036\n4011,3959\n4011,4017\n4012,3992\n4012,3948\n4012,4028\n4013,3992\n4014,4038\n4014,4029\n4015,4058\n4015,4033\n4015,4025\n4016,3996\n4016,3958\n4017,4011\n4018,4009\n4018,4037\n4019,4020\n4020,4019\n4020,4002\n4020,4000\n4020,3979\n4021,3992\n4022,2717\n4022,4034\n4023,3960\n4023,2717\n4024,2939\n4024,4026\n4025,4015\n4025,3990\n4026,4024\n4026,4033\n4027,3979\n4028,4012\n4028,4005\n4028,4029\n4029,4028\n4029,4014\n4029,4000\n4029,3971\n4029,4080\n4029,4032\n4029,4031\n4030,4001\n4030,4041\n4030,4039\n4030,4031\n4031,4030\n4031,4029\n4031,3957\n4032,4029\n4033,4026\n4033,4015\n4033,3993\n4033,4034\n4034,4033\n4034,4022\n4034,4003\n4034,3960\n4034,4057\n4035,3982\n4035,2342\n4036,4010\n4036,4004\n4036,4080\n4036,4039\n4036,4038\n4037,4018\n4037,4009\n4037,4038\n4038,4037\n4038,4036\n4038,4014\n4038,3981\n4038,4080\n4039,4036\n4039,4030\n4040,3952\n4040,4049\n4040,4041\n4041,4040\n4041,4030\n4041,3966\n4041,4066\n4041,4043\n4041,4042\n4042,4041\n4043,4041\n4044,4045\n4045,4044\n4045,3961\n4045,4046\n4046,4045\n4046,4009\n4047,4010\n4047,4002\n4047,3962\n4047,4080\n4048,3988\n4048,4049\n4049,4048\n4049,4040\n4049,4007\n4050,3998\n4050,4053\n4051,4053\n4051,4052\n4052,4051\n4052,4070\n4052,4069\n4053,4051\n4053,4050\n4054,4055\n4055,4054\n4055,3955\n4056,4007\n4056,3955\n4057,4034\n4057,4058\n4058,4057\n4058,4015\n4059,4061\n4059,4060\n4060,4059\n4060,4071\n4060,4065\n4060,4063\n4061,4059\n4061,4062\n4062,4061\n4062,3954\n4063,4060\n4063,3966\n4064,3966\n4064,3954\n4065,4060\n4065,3995\n4065,4066\n4066,4065\n4066,4041\n4067,3982\n4067,4068\n4068,4067\n4068,3994\n4069,4052\n4069,4105\n4070,4052\n4070,4105\n4071,4060\n4072,3971\n4072,4073\n4073,4072\n4073,4076\n4073,4075\n4073,4074\n4074,4073\n4075,4073\n4076,4073\n4077,4078\n4078,4077\n4078,3986\n4078,3974\n4079,4009\n4079,4080\n4080,4079\n4080,4047\n4080,4038\n4080,4036\n4080,4029\n4081,4086\n4082,4084\n4083,4084\n4084,4083\n4084,4082\n4084,4099\n4084,4090\n4084,4086\n4085,4086\n4086,4085\n4086,4084\n4086,4081\n4086,4162\n4086,4090\n4087,4267\n4087,4218\n4087,4172\n4087,4166\n4088,4299\n4088,4089\n4089,4088\n4089,4188\n4089,4187\n4090,4086\n4090,4084\n4090,4217\n4090,4160\n4090,4121\n4091,4092\n4092,4091\n4092,4208\n4092,4189\n4092,4116\n4093,4285\n4093,4102\n4094,4279\n4094,4152\n4095,4105\n4096,4106\n4097,4246\n4097,4245\n4097,4222\n4097,4200\n4097,4136\n4098,4283\n4098,4282\n4098,4281\n4098,4147\n4099,4084\n4099,2556\n4099,4172\n4099,4110\n4100,4260\n4100,4244\n4100,4241\n4100,4101\n4101,4100\n4101,4317\n4101,4227\n4101,4206\n4102,4093\n4102,4306\n4102,4305\n4102,4151\n4103,4225\n4103,4152\n4103,4104\n4104,4103\n4105,4095\n4105,4070\n4105,4069\n4105,4106\n4106,4105\n4106,4096\n4106,4147\n4106,4144\n4106,4109\n4106,4107\n4107,4106\n4107,4184\n4108,4109\n4109,4108\n4109,4106\n4110,4099\n4110,4243\n4110,4156\n4110,4138\n4110,4121\n4111,481\n4111,4268\n4111,4221\n4111,4201\n4111,4173\n4111,4112\n4112,4111\n4112,129\n4112,4213\n4113,475\n4113,4114\n4114,4113\n4114,4320\n4114,4149\n4114,4148\n4115,4211\n4115,4187\n4115,4172\n4116,4092\n4117,4240\n4117,4239\n4117,4118\n4118,4117\n4118,4159\n4118,4154\n4118,4124\n4119,4458\n4119,4285\n4119,4163\n4119,4120\n4120,4119\n4120,522\n4120,108\n4120,4179\n4120,4164\n4121,4110\n4121,4090\n4121,4202\n4121,4150\n4121,4143\n4122,4124\n4123,4124\n4124,4123\n4124,4122\n4124,4118\n4125,4128\n4126,4128\n4127,4252\n4127,4128\n4128,4127\n4128,4126\n4128,4125\n4128,4317\n4128,4221\n4128,4201\n4128,4186\n4129,2562\n4129,2440\n4129,4324\n4129,4323\n4130,4131\n4131,4130\n4131,4196\n4132,4156\n4132,4133\n4133,4132\n4133,4211\n4134,4158\n4134,4138\n4134,4135\n4135,4134\n4136,4097\n4136,4222\n4137,4259\n4137,4238\n4137,4157\n4137,4138\n4138,4137\n4138,4134\n4138,4110\n4138,4224\n4138,4162\n4138,4154\n4139,4175\n4139,4151\n4140,4143\n4141,4143\n4142,4143\n4143,4142\n4143,4141\n4143,4140\n4143,4121\n4144,4106\n4144,4146\n4145,526\n4145,4146\n4146,4145\n4146,4144\n4147,4106\n4147,4098\n4147,4204\n4147,4171\n4147,4151\n4148,4114\n4148,2440\n4148,4325\n4149,4114\n4149,4326\n4149,4173\n4150,4121\n4150,4202\n4151,4147\n4151,4139\n4151,4102\n4151,4215\n4151,4212\n4151,4209\n4151,4152\n4152,4151\n4152,4103\n4152,4094\n4152,4165\n4152,4163\n4153,4253\n4153,4154\n4154,4153\n4154,4138\n4154,4118\n4154,4193\n4154,4159\n4154,4156\n4155,4258\n4155,4249\n4155,4242\n4155,4156\n4156,4155\n4156,4154\n4156,4132\n4156,4110\n4156,4194\n4157,4137\n4157,4233\n4157,4229\n4157,4228\n4157,4223\n4158,4134\n4158,4232\n4158,4231\n4158,4230\n4158,4162\n4159,4154\n4159,4118\n4160,4090\n4160,4269\n4160,4217\n4160,4206\n4161,4251\n4161,4162\n4162,4161\n4162,4158\n4162,4138\n4162,4086\n4162,4193\n4162,4172\n4163,4152\n4163,4119\n4163,4216\n4163,4164\n4164,4163\n4164,4120\n4164,570\n4164,4219\n4164,4207\n4164,4179\n4164,4174\n4165,4152\n4165,4289\n4165,4288\n4166,4087\n4166,4214\n4166,4208\n4166,4188\n4166,4181\n4167,4196\n4167,4169\n4167,4168\n4168,4167\n4169,4167\n4170,4171\n4171,4170\n4171,4147\n4171,4204\n4172,4162\n4172,4115\n4172,4099\n4172,4087\n4172,2621\n4172,4218\n4172,4194\n4172,4193\n4173,4149\n4173,4111\n4173,474\n4174,4164\n4174,4317\n4174,4207\n4175,4139\n4175,4280\n4175,4176\n4176,4175\n4177,4179\n4178,4179\n4179,4178\n4179,4177\n4179,4164\n4179,4120\n4179,842\n4180,4290\n4180,4196\n4180,4187\n4180,4182\n4181,4166\n4181,4298\n4181,4297\n4181,4296\n4181,4295\n4181,4210\n4182,4180\n4182,4226\n4182,4183\n4183,4182\n4184,4107\n4184,4185\n4185,4184\n4186,4128\n4186,4317\n4186,4300\n4187,4180\n4187,4115\n4187,4089\n4187,4218\n4187,4211\n4187,4203\n4187,4196\n4187,4188\n4188,4187\n4188,4166\n4188,4089\n4188,4284\n4189,4092\n4189,4214\n4190,4193\n4191,4193\n4192,4193\n4193,4192\n4193,4191\n4193,4190\n4193,4172\n4193,4162\n4193,4154\n4193,4234\n4194,4172\n4194,4156\n4194,4218\n4195,4266\n4195,4257\n4195,4254\n4195,4196\n4196,4195\n4196,4187\n4196,4180\n4196,4167\n4196,4131\n4197,4199\n4198,4199\n4199,4198\n4199,4197\n4199,3905\n4199,3803\n4199,3785\n4199,3763\n4199,4227\n4199,4206\n4199,4202\n4200,4097\n4201,4128\n4201,4111\n4201,4221\n4202,4199\n4202,4150\n4202,4121\n4202,4304\n4203,4187\n4203,4262\n4203,4261\n4203,4256\n4203,4236\n4203,4235\n4204,4171\n4204,4147\n4204,4287\n4204,4286\n4205,4218\n4206,4199\n4206,4160\n4206,4101\n4206,4217\n4206,4207\n4207,4206\n4207,4174\n4207,4164\n4207,4213\n4208,4166\n4208,4092\n4209,4151\n4209,4312\n4209,4311\n4209,4310\n4209,4309\n4209,4308\n4210,4181\n4210,4316\n4210,4315\n4210,4314\n4210,4313\n4211,4187\n4211,4133\n4211,4115\n4211,564\n4212,4151\n4212,4305\n4213,4207\n4213,4112\n4214,4189\n4214,4166\n4214,4264\n4215,4151\n4215,4216\n4216,4215\n4216,4163\n4217,4206\n4217,4160\n4217,4090\n4218,4205\n4218,4194\n4218,4187\n4218,4172\n4218,4087\n4218,4301\n4218,4219\n4219,4218\n4219,4164\n4219,2543\n4220,4221\n4221,4220\n4221,4201\n4221,4128\n4221,4111\n4221,4317\n4221,4222\n4222,4221\n4222,4136\n4222,4097\n4223,4157\n4224,4138\n4224,4275\n4224,4274\n4224,4273\n4224,4272\n4224,4271\n4224,4270\n4225,4103\n4226,4182\n4227,4199\n4227,4101\n4228,4157\n4229,4157\n4230,4158\n4231,4158\n4232,4158\n4233,4157\n4234,4193\n4235,4203\n4236,4203\n4237,4243\n4238,4137\n4239,4117\n4240,4117\n4241,4100\n4242,4155\n4243,4237\n4243,4110\n4244,4100\n4245,4097\n4246,4097\n4246,4248\n4246,4247\n4247,4246\n4248,4246\n4249,4155\n4250,4265\n4251,4161\n4252,4127\n4253,4153\n4254,4195\n4255,4264\n4256,4203\n4257,4195\n4258,4155\n4259,4137\n4260,4100\n4261,4203\n4262,4203\n4263,4264\n4264,4263\n4264,4255\n4264,4214\n4265,4250\n4265,2621\n4266,4195\n4267,4087\n4268,4111\n4269,4160\n4270,4224\n4271,4224\n4272,4224\n4273,4224\n4274,4224\n4275,4224\n4276,4279\n4277,4279\n4278,4279\n4279,4278\n4279,4277\n4279,4276\n4279,4094\n4279,4291\n4280,4175\n4281,4098\n4282,4098\n4283,4098\n4284,4188\n4284,4322\n4284,4321\n4285,4119\n4285,4093\n4286,4204\n4287,4204\n4288,4165\n4289,4165\n4290,4180\n4291,4279\n4291,4294\n4291,4293\n4291,4292\n4292,4291\n4293,4291\n4294,4291\n4295,4181\n4296,4181\n4297,4181\n4298,4181\n4299,4088\n4299,4319\n4299,4318\n4300,4186\n4301,4218\n4301,4303\n4301,4302\n4302,4301\n4303,4301\n4304,4202\n4305,4212\n4305,4102\n4305,4307\n4306,4102\n4307,4305\n4308,4209\n4309,4209\n4310,4209\n4311,4209\n4312,4209\n4313,4210\n4314,4210\n4315,4210\n4316,4210\n4317,4221\n4317,4186\n4317,4174\n4317,4128\n4317,4101\n4317,2621\n4317,2556\n4318,4299\n4319,4299\n4320,4114\n4321,4284\n4322,4284\n4323,4129\n4324,4129\n4325,4148\n4326,4149\n4327,4410\n4327,4392\n4327,4387\n4327,4375\n4327,4342\n4328,4346\n4328,4331\n4329,4377\n4329,4331\n4330,4401\n4331,4329\n4331,4328\n4331,4407\n4332,4413\n4332,4402\n4332,4400\n4332,4398\n4332,4391\n4332,4385\n4332,4381\n4332,4347\n4332,4340\n4332,4336\n4332,4335\n4333,4395\n4333,4391\n4333,4383\n4333,4359\n4333,4357\n4333,4355\n4333,4340\n4334,4335\n4335,4334\n4335,4332\n4335,4402\n4335,4398\n4335,4381\n4335,4347\n4336,4332\n4336,4395\n4336,4381\n4336,4373\n4336,4361\n4336,4347\n4336,4346\n4336,4345\n4336,4342\n4337,4402\n4337,4386\n4338,4342\n4339,4340\n4340,4339\n4340,4333\n4340,4332\n4340,4400\n4340,4395\n4340,4357\n4341,321\n4341,4376\n4341,4374\n4342,4338\n4342,4336\n4342,4327\n4342,4411\n4342,4404\n4342,4375\n4342,4368\n4342,4365\n4342,4345\n4343,4399\n4343,4373\n4343,4361\n4343,4345\n4344,4413\n4344,4408\n4344,4401\n4344,4385\n4344,4384\n4344,4352\n4345,4343\n4345,4342\n4345,4336\n4345,4419\n4345,4409\n4345,4406\n4345,4395\n4345,4381\n4345,4373\n4345,4368\n4345,4365\n4345,4361\n4345,4347\n4345,4346\n4346,4345\n4346,4336\n4346,4328\n4346,4418\n4346,4417\n4346,4407\n4346,4381\n4346,4377\n4346,4360\n4346,4357\n4347,4345\n4347,4336\n4347,4335\n4347,4332\n4347,4402\n4347,4398\n4347,4381\n4348,4417\n4349,4402\n4350,4351\n4351,4350\n4351,4416\n4351,4359\n4352,4344\n4352,4413\n4352,4408\n4352,4401\n4352,4398\n4352,4392\n4352,4384\n4352,4381\n4352,4376\n4352,4374\n4352,4363\n4353,4412\n4353,4396\n4353,4377\n4354,4410\n4354,4404\n4355,4333\n4355,4403\n4355,4391\n4356,4357\n4357,4356\n4357,4346\n4357,4340\n4357,4333\n4357,4417\n4357,4407\n4357,4377\n4358,4416\n4358,4364\n4358,4359\n4359,4358\n4359,4351\n4359,4333\n4359,4416\n4359,4388\n4359,4383\n4359,4380\n4359,4372\n4359,4371\n4359,4364\n4360,4346\n4360,4409\n4361,4345\n4361,4343\n4361,4336\n4361,4419\n4361,4418\n4361,4406\n4361,4405\n4361,4395\n4361,4373\n4361,4372\n4362,253\n4362,4363\n4363,4362\n4363,4352\n4363,4370\n4363,4369\n4364,4359\n4364,4358\n4364,4383\n4364,4373\n4364,4372\n4364,4371\n4365,4345\n4365,4342\n4365,4399\n4365,4373\n4365,4372\n4365,4368\n4366,4367\n4367,4366\n4367,4404\n4367,4392\n4367,4376\n4367,4374\n4367,4368\n4368,4367\n4368,4365\n4368,4345\n4368,4342\n4368,4411\n4368,4404\n4368,4375\n4369,4363\n4369,4392\n4369,4374\n4370,4363\n4370,4392\n4370,4374\n4371,4364\n4371,4359\n4371,4416\n4371,4397\n4371,4380\n4371,4372\n4372,4371\n4372,4365\n4372,4364\n4372,4361\n4372,4359\n4372,4395\n4372,4391\n4372,4373\n4373,4372\n4373,4365\n4373,4364\n4373,4361\n4373,4345\n4373,4343\n4373,4336\n4373,4412\n4373,4405\n4373,4396\n4373,4395\n4374,4370\n4374,4369\n4374,4367\n4374,4352\n4374,4341\n4374,4392\n4374,4384\n4374,4376\n4375,4368\n4375,4342\n4375,4327\n4375,4381\n4376,4374\n4376,4367\n4376,4352\n4376,4341\n4376,4392\n4376,4384\n4377,4357\n4377,4353\n4377,4346\n4377,4329\n4378,4415\n4379,4380\n4380,4379\n4380,4371\n4380,4359\n4380,4416\n4381,4375\n4381,4352\n4381,4347\n4381,4346\n4381,4345\n4381,4336\n4381,4335\n4381,4332\n4381,4408\n4381,4402\n4381,4398\n4382,4399\n4382,4397\n4383,4364\n4383,4359\n4383,4333\n4383,4403\n4383,4395\n4383,4391\n4384,4376\n4384,4374\n4384,4352\n4384,4344\n4384,4413\n4384,4408\n4384,4402\n4384,4401\n4384,4392\n4384,4386\n4384,4385\n4385,4384\n4385,4344\n4385,4332\n4385,4413\n4386,4384\n4386,4337\n4386,4415\n4386,4402\n4387,4327\n4388,4359\n4389,4391\n4390,4391\n4391,4390\n4391,4389\n4391,4383\n4391,4372\n4391,4355\n4391,4333\n4391,4332\n4391,4396\n4391,4395\n4392,4384\n4392,4376\n4392,4374\n4392,4370\n4392,4369\n4392,4367\n4392,4352\n4392,4327\n4392,4410\n4392,4401\n4393,4395\n4394,4396\n4395,4393\n4395,4391\n4395,4383\n4395,4373\n4395,4372\n4395,4361\n4395,4345\n4395,4340\n4395,4336\n4395,4333\n4395,4396\n4396,4395\n4396,4394\n4396,4391\n4396,4373\n4396,4353\n4397,4382\n4397,4371\n4398,4381\n4398,4352\n4398,4347\n4398,4335\n4398,4332\n4398,4402\n4399,4382\n4399,4365\n4399,4343\n4400,4340\n4400,4332\n4401,4392\n4401,4384\n4401,4352\n4401,4344\n4401,4330\n4401,4413\n4401,4408\n4401,4402\n4402,4401\n4402,4398\n4402,4386\n4402,4384\n4402,4381\n4402,4349\n4402,4347\n4402,4337\n4402,4335\n4402,4332\n4403,4383\n4403,4355\n4404,4368\n4404,4367\n4404,4354\n4404,4342\n4404,4414\n4404,4410\n4405,4373\n4405,4361\n4406,4361\n4406,4345\n4407,4357\n4407,4346\n4407,4331\n4408,4401\n4408,4384\n4408,4381\n4408,4352\n4408,4344\n4408,4413\n4409,4360\n4409,4345\n4410,4404\n4410,4392\n4410,4354\n4410,4327\n4411,4368\n4411,4342\n4412,4373\n4412,4353\n4413,4408\n4413,4401\n4413,4385\n4413,4384\n4413,4352\n4413,4344\n4413,4332\n4414,4404\n4415,4386\n4415,4378\n4415,263\n4416,4380\n4416,4371\n4416,4359\n4416,4358\n4416,4351\n4417,4357\n4417,4348\n4417,4346\n4418,4361\n4418,4346\n4419,4361\n4419,4345\n4420,4421\n4421,4420\n4421,4442\n4421,4436\n4421,4435\n4422,4432\n4422,4424\n4423,238\n4424,4422\n4425,353\n4426,354\n4426,4430\n4427,4443\n4427,4429\n4428,326\n4429,4427\n4430,4426\n4431,309\n4431,4433\n4432,4422\n4432,4435\n4433,4431\n4434,4435\n4435,4434\n4435,4432\n4435,4421\n4435,290\n4435,4436\n4436,4435\n4436,4421\n4436,4442\n4436,4439\n4437,1119\n4437,4441\n4437,4439\n4438,4439\n4439,4438\n4439,4437\n4439,4436\n4439,4441\n4440,4441\n4441,4440\n4441,4439\n4441,4437\n4441,4442\n4442,4441\n4442,4436\n4442,4421\n4442,4443\n4443,4442\n4443,4427\n4444,830\n4444,4462\n4444,4458\n4445,2562\n4445,22\n4445,4448\n4446,493\n4446,475\n4446,91\n4446,84\n4446,23\n4446,4461\n4447,4448\n4448,4447\n4448,4445\n4448,2562\n4448,521\n4448,85\n4448,49\n4448,4458\n4449,4462\n4450,4462\n4451,4454\n4452,4454\n4453,4455\n4454,4452\n4454,4451\n4454,4458\n4455,4453\n4455,4458\n4455,4456\n4456,4455\n4457,843\n4457,4458\n4458,4457\n4458,4455\n4458,4454\n4458,4448\n4458,4444\n4458,4119\n4458,2440\n4458,856\n4458,837\n4458,829\n4458,569\n4458,521\n4458,514\n4458,4466\n4458,4465\n4458,4464\n4458,4463\n4458,4459\n4459,4458\n4459,99\n4460,4461\n4461,4460\n4461,4446\n4461,2562\n4461,132\n4461,84\n4461,24\n4462,4450\n4462,4449\n4462,4444\n4462,826\n4463,4458\n4464,4458\n4465,4458\n4466,4458\n4467,4553\n4467,4485\n4468,4613\n4468,4485\n4469,4796\n4469,4626\n4469,4602\n4469,4526\n4469,4507\n4470,4766\n4470,4676\n4470,4639\n4471,4590\n4471,4475\n4472,4671\n4473,4646\n4473,4617\n4473,4605\n4473,4508\n4473,4474\n4474,4473\n4474,4867\n4474,4652\n4474,4476\n4475,4471\n4475,4559\n4476,4474\n4476,3362\n4476,4678\n4476,4662\n4476,4628\n4476,4477\n4477,4476\n4477,4832\n4477,4574\n4478,3378\n4478,4485\n4478,4479\n4479,4478\n4479,4655\n4480,4485\n4480,4481\n4481,4480\n4481,4655\n4482,4772\n4482,4590\n4482,4483\n4483,4482\n4483,4876\n4483,4501\n4484,4688\n4484,4540\n4485,4480\n4485,4478\n4485,4468\n4485,4467\n4485,4601\n4485,4530\n4485,4496\n4486,4550\n4486,4533\n4486,4487\n4487,4486\n4487,4703\n4487,4588\n4488,4562\n4488,4529\n4489,4610\n4489,4509\n4490,4648\n4490,4500\n4491,2423\n4491,4669\n4491,4584\n4491,4580\n4491,4492\n4492,4491\n4492,4582\n4492,4543\n4493,4797\n4493,4660\n4493,4616\n4493,4510\n4494,4702\n4494,4596\n4495,4659\n4495,4553\n4496,4485\n4496,4767\n4497,4798\n4497,4606\n4497,4547\n4498,4500\n4498,4499\n4499,4498\n4499,4674\n4500,4498\n4500,4490\n4500,4765\n4500,4764\n4500,4501\n4501,4500\n4501,4483\n4502,4503\n4503,4502\n4503,4617\n4503,4561\n4504,4589\n4504,4522\n4505,4600\n4505,4506\n4506,4505\n4506,4660\n4506,4546\n4507,4469\n4507,2241\n4507,4535\n4508,4473\n4508,4636\n4508,4575\n4508,4542\n4509,4489\n4509,3363\n4509,4664\n4510,4493\n4510,4626\n4511,4702\n4511,4643\n4512,4696\n4512,4613\n4512,4607\n4512,4518\n4513,4598\n4513,4581\n4513,4514\n4514,4513\n4515,4669\n4515,4585\n4516,4614\n4516,4554\n4516,4517\n4517,4516\n4517,4661\n4518,4512\n4518,4782\n4518,4778\n4518,4691\n4519,4597\n4519,4520\n4520,4519\n4520,4802\n4520,4801\n4520,4800\n4520,4699\n4520,4620\n4520,4592\n4520,4521\n4521,4520\n4522,4504\n4522,4768\n4522,4620\n4522,4554\n4523,4654\n4523,4545\n4524,4659\n4524,4579\n4525,4759\n4525,4686\n4526,4469\n4526,4804\n4526,4803\n4527,4528\n4528,4527\n4528,4676\n4528,4545\n4529,4488\n4529,4767\n4530,4485\n4530,4687\n4531,4650\n4531,4611\n4531,4542\n4532,4826\n4532,4651\n4532,4596\n4533,4486\n4533,4547\n4534,4722\n4534,4673\n4534,4618\n4534,4541\n4534,4535\n4535,4534\n4535,4507\n4535,2248\n4536,2248\n4536,4631\n4537,4866\n4537,4861\n4537,4686\n4537,4567\n4538,4807\n4538,4806\n4538,4805\n4538,4771\n4538,4597\n4539,4809\n4539,4808\n4539,4763\n4540,4484\n4540,4789\n4540,4588\n4541,4534\n4541,4816\n4541,4651\n4542,4531\n4542,4508\n4542,4799\n4542,4675\n4543,4492\n4543,4662\n4544,4579\n4545,4528\n4545,4523\n4546,4506\n4546,4700\n4547,4533\n4547,4497\n4547,4606\n4548,4638\n4548,4549\n4549,4548\n4549,4648\n4549,4576\n4550,4486\n4550,4624\n4551,4586\n4551,4584\n4552,2409\n4552,4719\n4552,4652\n4552,4627\n4553,4495\n4553,4467\n4553,4568\n4554,4522\n4554,4516\n4554,4701\n4554,4666\n4555,4592\n4555,4579\n4556,4670\n4556,4648\n4557,4643\n4557,4561\n4558,4700\n4559,4475\n4560,4677\n4560,4622\n4561,4557\n4561,4503\n4561,4811\n4562,4488\n4562,4679\n4562,4622\n4562,4612\n4563,2423\n4563,4684\n4564,4815\n4564,4814\n4564,4813\n4564,4602\n4564,4565\n4565,4564\n4565,4640\n4565,4602\n4566,4763\n4566,4567\n4567,4566\n4567,4537\n4567,4667\n4568,4553\n4568,4679\n4569,4651\n4569,4637\n4570,3364\n4570,4761\n4570,4621\n4570,4614\n4570,4571\n4571,4570\n4571,4628\n4572,4573\n4573,4572\n4573,2249\n4573,4652\n4573,4574\n4574,4573\n4574,4477\n4574,4656\n4574,4595\n4574,4594\n4575,4508\n4575,4820\n4576,4549\n4577,4661\n4577,4621\n4578,4722\n4579,4555\n4579,4544\n4579,4524\n4579,4598\n4580,4491\n4581,4513\n4581,4659\n4581,4582\n4582,4581\n4582,4492\n4582,3352\n4583,4623\n4583,4622\n4584,4551\n4584,4491\n4585,4515\n4585,4589\n4585,4587\n4586,4551\n4586,4589\n4587,4585\n4588,4540\n4588,4487\n4588,4788\n4588,4694\n4589,4586\n4589,4585\n4589,4504\n4590,4482\n4590,4471\n4590,4657\n4591,4723\n4591,4665\n4592,4555\n4592,4520\n4592,4635\n4593,4611\n4594,4574\n4595,4574\n4596,4532\n4596,4494\n4597,4538\n4597,4519\n4598,4579\n4598,4513\n4599,4820\n4600,4505\n4600,4624\n4601,4485\n4601,4654\n4602,4565\n4602,4564\n4602,4469\n4602,4820\n4602,4641\n4602,4611\n4603,3331\n4604,4605\n4605,4604\n4605,4473\n4605,4619\n4606,4547\n4606,4497\n4606,4703\n4607,4512\n4607,4630\n4607,4608\n4608,4607\n4608,4690\n4608,4655\n4608,4644\n4609,4773\n4609,4686\n4610,4489\n4610,4636\n4611,4602\n4611,4593\n4611,4531\n4612,4562\n4613,4512\n4613,4468\n4614,4570\n4614,4516\n4615,4654\n4615,4643\n4616,4493\n4616,4791\n4616,4683\n4617,4503\n4617,4473\n4618,4534\n4619,4605\n4619,4637\n4619,4625\n4620,4522\n4620,4520\n4620,4776\n4621,4577\n4621,4570\n4621,4633\n4622,4583\n4622,4562\n4622,4560\n4623,4583\n4624,4600\n4624,4550\n4625,4619\n4626,4510\n4626,4469\n4626,4786\n4627,4552\n4627,4733\n4627,4649\n4628,4571\n4628,4476\n4628,3643\n4628,4662\n4629,4653\n4630,4607\n4630,4672\n4631,4536\n4631,2241\n4632,2409\n4632,4743\n4633,4621\n4633,4664\n4634,2355\n4634,4683\n4635,4592\n4636,4610\n4636,4508\n4637,4619\n4637,4569\n4637,4642\n4638,4548\n4639,4470\n4639,4689\n4640,4565\n4640,4821\n4640,4641\n4641,4640\n4641,4602\n4641,4645\n4642,4637\n4643,4615\n4643,4557\n4643,4511\n4643,4644\n4644,4643\n4644,4608\n4644,4652\n4645,4641\n4645,4668\n4646,4473\n4646,4675\n4647,4674\n4648,4556\n4648,4549\n4648,4490\n4649,4627\n4649,2409\n4649,4753\n4649,4750\n4649,4739\n4650,4531\n4651,4569\n4651,4541\n4651,4532\n4651,4826\n4651,4723\n4651,4652\n4652,4651\n4652,4644\n4652,4573\n4652,4552\n4652,4474\n4652,2249\n4653,4629\n4653,4654\n4654,4653\n4654,4615\n4654,4601\n4654,4523\n4655,4608\n4655,4481\n4655,4479\n4655,3336\n4655,4656\n4656,4655\n4656,4574\n4657,4590\n4657,4687\n4658,4700\n4658,4660\n4659,4581\n4659,4524\n4659,4495\n4660,4658\n4660,4506\n4660,4493\n4660,2387\n4660,4688\n4661,4577\n4661,4517\n4661,4662\n4662,4661\n4662,4628\n4662,4543\n4662,4476\n4663,4664\n4664,4663\n4664,4633\n4664,4509\n4665,4591\n4666,4554\n4667,4567\n4667,4779\n4667,4686\n4668,4645\n4669,4515\n4669,4491\n4670,4556\n4670,4827\n4670,4689\n4671,4472\n4671,4674\n4672,4630\n4672,4676\n4673,4534\n4673,4823\n4674,4671\n4674,4647\n4674,4499\n4675,4646\n4675,4542\n4675,4799\n4676,4672\n4676,4528\n4676,4470\n4677,4560\n4677,3360\n4677,4684\n4677,4678\n4678,4677\n4678,4476\n4678,3361\n4679,4568\n4679,4562\n4680,4826\n4681,4825\n4681,4771\n4682,4683\n4683,4682\n4683,4634\n4683,4616\n4684,4677\n4684,4563\n4685,4771\n4685,4686\n4686,4685\n4686,4667\n4686,4609\n4686,4537\n4686,4525\n4687,4657\n4687,4530\n4688,4660\n4688,4484\n4689,4670\n4689,4639\n4689,4691\n4689,4690\n4690,4689\n4690,4608\n4691,4689\n4691,4518\n4691,4781\n4692,4694\n4693,4695\n4694,4692\n4694,4588\n4694,4695\n4695,4694\n4695,4693\n4695,2414\n4695,4927\n4696,4512\n4697,4818\n4697,4699\n4698,4699\n4699,4698\n4699,4697\n4699,4520\n4700,4658\n4700,4558\n4700,4546\n4701,4554\n4702,4511\n4702,4494\n4703,4606\n4703,4487\n4703,4793\n4704,4746\n4704,4711\n4705,4745\n4705,4714\n4706,4719\n4706,4716\n4707,4716\n4707,4713\n4708,4752\n4708,4746\n4708,4733\n4708,4729\n4708,4728\n4709,4729\n4709,4728\n4710,4724\n4710,4714\n4711,4704\n4711,4735\n4712,4728\n4712,4727\n4713,4707\n4713,4732\n4714,4710\n4714,4705\n4715,4751\n4715,4727\n4716,4707\n4716,4706\n4717,4728\n4717,4720\n4718,4737\n4718,4731\n4719,4706\n4719,4552\n4719,4732\n4720,4717\n4720,4736\n4721,4755\n4721,4751\n4721,4739\n4722,4578\n4722,4534\n4722,4723\n4723,4722\n4723,4651\n4723,4591\n4724,4710\n4724,4735\n4725,4754\n4725,4727\n4726,4784\n4726,4756\n4726,4749\n4727,4725\n4727,4715\n4727,4712\n4727,4775\n4727,4774\n4727,4736\n4728,4717\n4728,4712\n4728,4709\n4728,4708\n4728,4748\n4729,4709\n4729,4708\n4730,4751\n4730,4748\n4731,4718\n4731,4738\n4732,4719\n4732,4713\n4733,4708\n4733,4627\n4733,4757\n4733,4745\n4733,4740\n4734,4744\n4734,4738\n4735,4724\n4735,4711\n4736,4727\n4736,4720\n4737,4718\n4737,4739\n4738,4734\n4738,4731\n4739,4737\n4739,4721\n4739,4649\n4739,4742\n4740,4733\n4740,4747\n4741,4747\n4741,4742\n4742,4741\n4742,4739\n4743,4632\n4743,2209\n4744,4734\n4744,4751\n4745,4733\n4745,4705\n4746,4708\n4746,4704\n4747,4741\n4747,4740\n4748,4730\n4748,4728\n4749,4726\n4749,2409\n4749,4784\n4749,4754\n4750,4649\n4750,4751\n4751,4750\n4751,4744\n4751,4730\n4751,4721\n4751,4715\n4752,4708\n4753,4649\n4753,2409\n4753,4754\n4754,4753\n4754,4749\n4754,4725\n4755,4721\n4755,4812\n4755,4758\n4756,4726\n4757,4733\n4758,4755\n4759,4525\n4759,3334\n4760,4761\n4761,4760\n4761,4570\n4761,4777\n4762,4768\n4763,4566\n4763,4539\n4764,4500\n4765,4500\n4766,4470\n4767,4529\n4767,4496\n4767,4769\n4768,4762\n4768,4522\n4769,4767\n4769,4770\n4770,4769\n4771,4685\n4771,4681\n4771,4538\n4772,4482\n4773,4609\n4774,4727\n4775,4727\n4776,4620\n4777,4761\n4778,4518\n4779,4667\n4779,4780\n4780,4779\n4780,4824\n4781,4691\n4782,4518\n4782,4827\n4783,4784\n4784,4783\n4784,4749\n4784,4726\n4785,4786\n4786,4785\n4786,4626\n4787,4794\n4788,4588\n4788,4792\n4789,4540\n4790,4791\n4791,4790\n4791,4616\n4792,4788\n4792,4795\n4792,4793\n4793,4792\n4793,4703\n4793,4794\n4794,4793\n4794,4787\n4795,4792\n4796,4469\n4797,4493\n4798,4497\n4798,4822\n4799,4675\n4799,4542\n4800,4520\n4801,4520\n4802,4520\n4803,4526\n4804,4526\n4805,4538\n4806,4538\n4807,4538\n4808,4539\n4809,4539\n4810,4823\n4811,4561\n4812,4755\n4813,4564\n4814,4564\n4815,4564\n4816,4541\n4816,4817\n4817,4816\n4818,4697\n4819,4820\n4820,4819\n4820,4602\n4820,4599\n4820,4575\n4821,4640\n4822,4798\n4823,4810\n4823,4673\n4824,4780\n4825,4681\n4826,4680\n4826,4651\n4826,4532\n4827,4782\n4827,4670\n4828,4897\n4828,4884\n4828,4866\n4829,4874\n4829,4866\n4830,3322\n4830,4845\n4830,4831\n4831,4830\n4831,3331\n4831,4899\n4832,4477\n4832,4889\n4832,4841\n4832,4837\n4833,4898\n4833,4896\n4834,4923\n4834,4916\n4834,4847\n4835,4836\n4836,4835\n4836,4897\n4836,4884\n4836,4849\n4836,4837\n4837,4836\n4837,4832\n4837,2312\n4838,4904\n4838,4890\n4838,4881\n4839,4904\n4839,4903\n4840,4867\n4840,4843\n4840,4842\n4840,4841\n4841,4840\n4841,4832\n4841,4887\n4841,4844\n4842,4840\n4843,4840\n4844,4841\n4845,4830\n4845,3454\n4846,4848\n4847,4834\n4847,4878\n4847,4848\n4848,4847\n4848,4846\n4848,4900\n4848,4883\n4848,4873\n4849,4836\n4849,2396\n4850,3385\n4850,3381\n4850,4922\n4850,4909\n4850,4908\n4851,4892\n4851,4855\n4852,4882\n4852,4860\n4853,4854\n4854,4853\n4854,2265\n4854,4897\n4855,4851\n4855,980\n4856,4871\n4856,4859\n4857,4859\n4858,4860\n4859,4857\n4859,4856\n4859,2365\n4859,4860\n4860,4859\n4860,4858\n4860,4852\n4861,4537\n4861,3295\n4861,4867\n4862,3543\n4862,4878\n4862,4863\n4863,4862\n4863,4877\n4864,3318\n4864,4887\n4864,4879\n4865,3337\n4865,4923\n4866,4829\n4866,4828\n4866,4537\n4866,4867\n4867,4866\n4867,4861\n4867,4840\n4867,4474\n4867,4925\n4867,4869\n4867,4868\n4868,4867\n4869,4867\n4870,4913\n4870,4880\n4871,4856\n4871,4893\n4872,4917\n4872,4905\n4872,4890\n4872,4873\n4873,4872\n4873,4848\n4873,4891\n4874,4829\n4874,4885\n4874,4884\n4875,3369\n4875,3341\n4875,4876\n4876,4875\n4876,4483\n4876,3342\n4876,3333\n4876,4883\n4877,4863\n4877,4885\n4878,4862\n4878,4847\n4878,3387\n4878,3372\n4878,4924\n4878,4920\n4878,4914\n4878,4881\n4878,4879\n4879,4878\n4879,4864\n4879,4902\n4880,4870\n4880,4915\n4880,4900\n4881,4878\n4881,4838\n4882,4852\n4882,138\n4883,4876\n4883,4848\n4883,3348\n4884,4874\n4884,4836\n4884,4828\n4885,4877\n4885,4874\n4885,3649\n4885,3642\n4885,4886\n4886,4885\n4886,4888\n4886,4887\n4887,4886\n4887,4864\n4887,4841\n4887,4889\n4888,4886\n4888,3345\n4888,4900\n4888,4889\n4889,4888\n4889,4887\n4889,4832\n4890,4872\n4890,4838\n4891,4873\n4891,4893\n4892,4851\n4892,4893\n4893,4892\n4893,4891\n4893,4871\n4893,68\n4893,4894\n4894,4893\n4894,1030\n4895,4925\n4896,4833\n4896,4926\n4897,4854\n4897,4836\n4897,4828\n4897,2214\n4898,4833\n4898,4926\n4898,4899\n4899,4898\n4899,4831\n4899,4925\n4900,4888\n4900,4880\n4900,4848\n4901,4921\n4901,4909\n4901,4907\n4901,4902\n4902,4901\n4902,4879\n4902,1033\n4903,4839\n4903,4905\n4904,4839\n4904,4838\n4905,4903\n4905,4872\n4906,4908\n4906,4907\n4907,4906\n4907,4901\n4908,4906\n4908,4850\n4908,4919\n4909,4901\n4909,4850\n4910,4924\n4910,4914\n4911,4921\n4912,4923\n4913,4870\n4913,4918\n4914,4910\n4914,4878\n4915,4880\n4916,4834\n4917,4872\n4917,4922\n4918,4913\n4918,4924\n4919,4908\n4920,4878\n4921,4911\n4921,4901\n4922,4917\n4922,4850\n4923,4912\n4923,4865\n4923,4834\n4924,4918\n4924,4910\n4924,4878\n4925,4899\n4925,4895\n4925,4867\n4926,4898\n4926,4896\n4927,4695\n4927,4928\n4928,4927\n4928,776\n4928,4929\n4929,4928\n4929,4938\n4930,3\n4930,4937\n4930,4931\n4931,4930\n4932,4935\n4932,4934\n4933,4939\n4933,4934\n4934,4933\n4934,4932\n4934,782\n4935,4932\n4935,4937\n4936,4938\n4937,4935\n4937,4930\n4938,4936\n4938,4929\n4939,4933\n4939,4940\n4940,4939\n4940,819"
  },
  {
    "path": "examples/dataset/test_data_edge.csv",
    "content": "source,target,label\n1,20000,node_1"
  },
  {
    "path": "examples/dataset/test_data_edge_single.csv",
    "content": "source\n0\n1\n"
  },
  {
    "path": "examples/dataset/test_data_node.csv",
    "content": "id,size\n0,1.0\n1,2.0\n2,1.5"
  },
  {
    "path": "examples/dataset/test_data_node_very_very_long_name.csv",
    "content": "id,size\na,1.0\nb,2.0\nc,1.5"
  },
  {
    "path": "examples/test_file.rs",
    "content": "use std::path::PathBuf;\n\nuse graphpu::{\n    bootstrap::{start_frame, ConfigBuilder},\n    MainApp, utils::csv_loader::load_data,\n};\n\npub const ROOT: &str = env!(\"CARGO_MANIFEST_DIR\");\n\n#[tokio::main]\nasync fn main() {\n    let dataset_folder =  PathBuf::from(ROOT).join(\"examples\").join(\"dataset\");\n    let test_node_data = dataset_folder.join(\"test_data_node.csv\");\n    let test_edge_data = dataset_folder.join(\"small_data_edge_raw.csv\");\n\n    let config_builder = ConfigBuilder::default().app_creator(Box::new(move |cc| {\n        let mut app = MainApp::new(cc);\n        app.models.setup_data(\n                load_data(\n                test_node_data.to_str().unwrap(),\n                test_edge_data.to_str().unwrap(),\n                0,\n                1,\n            ).unwrap()\n        );\n        Box::new(app)\n    }));\n    start_frame(config_builder.build());\n}\n"
  },
  {
    "path": "lib/naga/.github/workflows/lazy.yml",
    "content": "# Lazy jobs running on master post merges.\nname: lazy\non:\n  push:\n    branches: [master]\n\njobs:\n  coverage:\n    name: Coverage\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          toolchain: stable\n      - name: Generate report\n        uses: actions-rs/tarpaulin@v0.1\n        with:\n          args: '--tests --all-features --workspace'\n      - name: Upload to codecov.io\n        uses: codecov/codecov-action@v1\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n      - name: Archive code coverage results\n        uses: actions/upload-artifact@v1\n        with:\n          name: code-coverage-report\n          path: cobertura.xml\n\n  parse-dota2:\n    name: Parse Dota2 shaders\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n      - run: mkdir data\n      - name: Download shaders\n        run: curl https://user.fm/files/v2-5573e18b9f03f42c6ae53c392083da35/dota2-shaders.zip -o data/all.zip\n      - name: Unpack shaders\n        run: cd data && unzip all.zip\n      - name: Build Naga\n        run: cargo build --release --bin naga\n      - name: Convert shaders\n        run: for file in data/*.spv ; do echo \"Translating\" ${file} && target/release/naga --validate 27 ${file} ${file}.metal; done\n\n  parse-vulkan-tutorial-shaders:\n    name: Parse Sascha Willems Vulkan tutorial shaders\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n      - name: Download shaders\n        run: git clone https://github.com/SaschaWillems/Vulkan.git\n      - name: Build Naga\n        run: cargo build --release --bin naga\n      - name: Convert metal shaders\n        run: |\n          # No needed to stop workflow if we can't validate one file\n          set +e\n          touch counter\n          SUCCESS_RESULT_COUNT=0\n          FILE_COUNT=0\n          mkdir -p out\n          find \"Vulkan/data/shaders/glsl/\" -name '*.spv' | while read fname;\n          do\n              echo \"Convert: $fname\"\n              FILE_COUNT=$((FILE_COUNT+1))\n              target/release/naga --validate 27 $(realpath ${fname}) out/$(basename ${fname}).metal\n              if [[ $? -eq 0 ]]; then\n                  SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1))\n              fi\n              echo \"Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT\" > counter\n          done\n          cat counter\n\n  dneto0_spirv-samples:\n    name: Parse dneto0 spirv-samples\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n      - name: Download shaders\n        run: git clone https://github.com/dneto0/spirv-samples.git\n      - name: Build Naga\n        run: cargo build --release --bin naga\n      - name: Install spirv-tools\n        run: |\n           wget -q https://storage.googleapis.com/spirv-tools/artifacts/prod/graphics_shader_compiler/spirv-tools/linux-clang-release/continuous/1489/20210629-121459/install.tgz\n           tar zxf install.tgz\n           ./install/bin/spirv-as --version\n      - name: Compile spv from spvasm\n        run: |\n           cd spirv-samples\n           mkdir -p spv\n\n           find \"./spvasm\" -name '*.spvasm' | while read fname;\n           do\n               echo \"Convert to spv with spirv-as: $fname\"\n               ../install/bin/spirv-as --target-env spv1.3 $(realpath ${fname}) -o ./spv/$(basename ${fname}).spv\n           done;\n      - name: Validate spv and generate wgsl\n        run: |\n           set +e\n           cd spirv-samples\n           SUCCESS_RESULT_COUNT=0\n           FILE_COUNT=0\n           mkdir -p spv\n           mkdir -p wgsl\n\n           echo \"==== Validate spv and generate wgsl ====\"\n           rm -f counter\n           touch counter\n\n           find \"./spv\" -name '*.spv' | while read fname;\n           do\n               echo \"Convert: $fname\"\n               FILE_COUNT=$((FILE_COUNT+1))\n               ../target/release/naga --validate 27 $(realpath ${fname}) ./wgsl/$(basename ${fname}).wgsl\n               if [[ $? -eq 0 ]]; then\n                   SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1))\n               fi\n               echo \"Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT\" > counter\n           done\n           cat counter\n      - name: Validate output wgsl\n        run: |\n           set +e\n           cd spirv-samples\n           SUCCESS_RESULT_COUNT=0\n           FILE_COUNT=0\n\n           rm -f counter\n           touch counter\n\n           find \"./wgsl\" -name '*.wgsl' | while read fname;\n           do\n               echo \"Validate: $fname\"\n               FILE_COUNT=$((FILE_COUNT+1))\n               ../target/release/naga --validate 27 $(realpath ${fname})\n               if [[ $? -eq 0 ]]; then\n                   SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1))\n               fi\n               echo \"Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT\" > counter\n           done\n           cat counter\n\n  check-snapshots-extra:\n    name: Check snapshots (validated or not)\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n      - uses: actions-rs/cargo@v1\n        name: Test minimal (without span)\n        with:\n          command: test\n          args: --features validate -p naga\n      - uses: actions-rs/cargo@v1\n        name: Test all (without validation)\n        with:\n          command: test\n          args: --features wgsl-in,wgsl-out,glsl-in,glsl-out,spv-in,spv-out,msl-out,hlsl-out,dot-out --workspace\n      - name: Check snapshots (without validation)\n        run: git diff --exit-code -- tests/out\n"
  },
  {
    "path": "lib/naga/.github/workflows/pipeline.yml",
    "content": "# Regular testing.\nname: pipeline\non: [push, pull_request]\n\njobs:\n  test-msrv:\n    name: Test MSRV and dependencies minimal-versions\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: \"1.56.0\"\n          override: true\n      - uses: taiki-e/install-action@cargo-hack\n      - uses: taiki-e/install-action@cargo-minimal-versions\n      # nightly is only used by cargo-minimal-versions to regenerate the lock file\n      - run: rustup toolchain add nightly --no-self-update\n      - name: Test all features\n        run: cargo minimal-versions test --all-features --workspace\n      - name: Check snapshots\n        run: git diff --exit-code -- tests/out\n  test:\n    name: Test Nightly\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: nightly\n          override: true\n      - uses: actions-rs/cargo@v1\n        name: Default test\n        with:\n          # Our intention here is to test `naga` with no features enabled. But\n          # since `cli` is the default package, a plain `cargo test` will build\n          # `naga` with the features requested in `cli/Cargo.toml`. Passing\n          # `--package naga` causes us to use the default features in the\n          # top-level `Cargo.toml` instead.\n          command: test\n          args: --package naga\n      - uses: actions-rs/cargo@v1\n        name: Test all features\n        with:\n          command: test\n          args: --all-features --workspace\n      - name: Check snapshots\n        run: git diff --exit-code -- tests/out\n      - uses: actions-rs/cargo@v1\n        name: Check benchmarks\n        with:\n          command: check\n          args: --benches\n  clippy:\n    name: Clippy\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n          override: true\n      - run: rustup component add clippy\n      - uses: actions-rs/cargo@v1\n        with:\n          command: clippy\n          args: --all-features --workspace -- -D warnings\n  documentation:\n    name: Documentation\n    runs-on: ubuntu-latest\n    env:\n      RUSTDOCFLAGS: -Dwarnings\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n          override: true\n      - uses: actions-rs/cargo@v1\n        with:\n          command: doc\n          args: -p naga --all-features --document-private-items\n  fmt:\n    name: Format\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: stable\n          override: true\n          components: rustfmt\n      - name: run rustfmt\n        run: |\n          cargo fmt -- --check\n"
  },
  {
    "path": "lib/naga/.github/workflows/validation-linux.yml",
    "content": "name: validation-linux\non:\n  pull_request:\n    paths:\n    - 'tests/out/spv/*.spvasm'\n    - 'tests/out/glsl/*.glsl'\n    - 'tests/out/dot/*.dot'\n    - 'tests/out/wgsl/*.wgsl'\n    - 'src/front/wgsl/*'\n\njobs:\n  validate-linux:\n    name: SPIR-V + GLSL\n    runs-on: ubuntu-20.04\n    steps:\n      - uses: actions/checkout@v2\n      - name: Install tools\n        run: sudo apt-get install spirv-tools glslang-tools graphviz\n      - run: make validate-spv\n      - run: make validate-glsl\n      - run: make validate-dot\n      - run: make validate-wgsl\n"
  },
  {
    "path": "lib/naga/.github/workflows/validation-macos.yml",
    "content": "name: validation-macos\non:\n  pull_request:\n    paths:\n    - 'tests/out/msl/*.msl'\n\njobs:\n  validate-macos:\n    name: MSL\n    runs-on: macos-latest\n    steps:\n      - uses: actions/checkout@v2\n      - run: make validate-msl\n"
  },
  {
    "path": "lib/naga/.github/workflows/validation-windows.yml",
    "content": "name: validation-windows\non:\n  pull_request:\n    paths:\n      - 'tests/out/hlsl/*.hlsl'\n\njobs:\n  validate-windows-dxc:\n    name: HLSL via DXC\n    runs-on: windows-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Add DirectXShaderCompiler\n        uses: napokue/setup-dxc@v1.0.0\n      - run: make validate-hlsl-dxc\n        shell: sh\n\n  validate-windows-fxc:\n    name: HLSL via FXC\n    runs-on: windows-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Add fxc bin to PATH\n        run: |\n          Get-Childitem -Path \"C:\\Program Files (x86)\\Windows Kits\\10\\bin\\**\\x64\\fxc.exe\" `\n          | Sort-Object -Property LastWriteTime -Descending `\n          | Select-Object -First 1 `\n          | Split-Path -Parent `\n          | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append\n        shell: powershell\n      - run: make validate-hlsl-fxc\n        shell: sh"
  },
  {
    "path": "lib/naga/.gitignore",
    "content": "/target\n/Debug\n**/*.rs.bk\nCargo.lock\n.DS_Store\n.fuse_hidden*\n.idea\n.vscode\n/*.dot\n/*.metal\n/*.metallib\n/*.ron\n/*.spv\n/*.vert\n/*.frag\n/*.comp\n/*.wgsl\n/*.hlsl\n/*.txt\n"
  },
  {
    "path": "lib/naga/CHANGELOG.md",
    "content": "# Change Log\r\n\r\n## v0.10 (2022-10-05)\r\n\r\n- Make termcolor dependency optional by @AldaronLau in https://github.com/gfx-rs/naga/pull/2014\r\n- Fix clippy lints for 1.63 by @JCapucho in https://github.com/gfx-rs/naga/pull/2026\r\n- Saturate by @evahop in https://github.com/gfx-rs/naga/pull/2025\r\n- Use `Option::as_deref` as appropriate. by @jimblandy in https://github.com/gfx-rs/naga/pull/2040\r\n- Explicitely enable std for indexmap by @maxammann in https://github.com/gfx-rs/naga/pull/2062\r\n- Fix compiler warning by @Gordon-F in https://github.com/gfx-rs/naga/pull/2074\r\n\r\nAPI\r\n- Implement `Clone` for `Module` by @daxpedda in https://github.com/gfx-rs/naga/pull/2013\r\n- Remove the glsl-validate feature by @JCapucho in https://github.com/gfx-rs/naga/pull/2045\r\n\r\nDOCS\r\n- Document arithmetic binary operation type rules. by @jimblandy in https://github.com/gfx-rs/naga/pull/2051\r\n\r\nVALIDATOR\r\n- Add `emit_to_{stderr,string}` helpers to validation error by @nolanderc in https://github.com/gfx-rs/naga/pull/2012\r\n- Check regular functions don't have bindings by @JCapucho in https://github.com/gfx-rs/naga/pull/2050\r\n\r\nWGSL-IN\r\n- Update reserved WGSL keywords by @norepimorphism in https://github.com/gfx-rs/naga/pull/2009\r\n- Implement lexical scopes by @JCapucho in https://github.com/gfx-rs/naga/pull/2024\r\n- Rename `Scope` to `Rule`, since we now have lexical scope. by @jimblandy in https://github.com/gfx-rs/naga/pull/2042\r\n- Splat on compound assignments by @JCapucho in https://github.com/gfx-rs/naga/pull/2049\r\n- Fix bad span in assignment lhs error by @JCapucho in https://github.com/gfx-rs/naga/pull/2054\r\n- Fix inclusion of trivia in spans by @SparkyPotato in https://github.com/gfx-rs/naga/pull/2055\r\n- Improve assignment diagnostics by @SparkyPotato in https://github.com/gfx-rs/naga/pull/2056\r\n- Break up long string, reformat rest of file. by @jimblandy in https://github.com/gfx-rs/naga/pull/2057\r\n- Fix line endings on wgsl reserved words list. by @jimblandy in https://github.com/gfx-rs/naga/pull/2059\r\n\r\nGLSL-IN\r\n- Add support for .length() by @SpaceCat-Chan in https://github.com/gfx-rs/naga/pull/2017\r\n- Fix missing stores for local declarations by @adeline-sparks in https://github.com/gfx-rs/naga/pull/2029\r\n- Migrate to `SymbolTable` by @JCapucho in https://github.com/gfx-rs/naga/pull/2044\r\n- Update initializer list type when parsing by @JCapucho in https://github.com/gfx-rs/naga/pull/2066\r\n\r\nSPV-OUT\r\n- Don't decorate varyings with interpolation modes at pipeline start/end by @nical in https://github.com/gfx-rs/naga/pull/2038\r\n- Decorate integer builtins as Flat in the spirv writer by @nical in https://github.com/gfx-rs/naga/pull/2035\r\n- Properly combine the fixes for #2035 and #2038. by @jimblandy in https://github.com/gfx-rs/naga/pull/2041\r\n- Don't emit no-op `OpBitCast` instructions. by @jimblandy in https://github.com/gfx-rs/naga/pull/2043\r\n\r\nHLSL-OUT\r\n- Use the namer to sanitise entrypoint input/output struct names by @expenses in https://github.com/gfx-rs/naga/pull/2001\r\n- Handle Unpack2x16float in hlsl by @expenses in https://github.com/gfx-rs/naga/pull/2002\r\n- Add support for push constants by @JCapucho in https://github.com/gfx-rs/naga/pull/2005\r\n\r\nDOT-OUT\r\n- Improvements by @JCapucho in https://github.com/gfx-rs/naga/pull/1987\r\n\r\n## v0.9 (2022-06-30)\r\n\r\n- Fix minimal-versions of dependencies ([#1840](https://github.com/gfx-rs/naga/pull/1840)) **@teoxoy**\r\n- Update MSRV to 1.56 ([#1838](https://github.com/gfx-rs/naga/pull/1838)) **@teoxoy**\r\n\r\nAPI\r\n\r\n- Rename `TypeFlags` `INTERFACE`/`HOST_SHARED` to `IO_SHARED`/`HOST_SHAREABLE` ([#1872](https://github.com/gfx-rs/naga/pull/1872)) **@jimblandy**\r\n- Expose more error information ([#1827](https://github.com/gfx-rs/naga/pull/1827), [#1937](https://github.com/gfx-rs/naga/pull/1937)) **@jakobhellermann** **@nical** **@jimblandy**\r\n- Do not unconditionally make error output colorful ([#1707](https://github.com/gfx-rs/naga/pull/1707)) **@rhysd**\r\n- Rename `StorageClass` to `AddressSpace` ([#1699](https://github.com/gfx-rs/naga/pull/1699)) **@kvark**\r\n- Add a way to emit errors to a path ([#1640](https://github.com/gfx-rs/naga/pull/1640)) **@laptou**\r\n\r\nCLI\r\n\r\n- Add `bincode` representation ([#1729](https://github.com/gfx-rs/naga/pull/1729)) **@kvark**\r\n- Include file path in WGSL parse error ([#1708](https://github.com/gfx-rs/naga/pull/1708)) **@rhysd**\r\n- Add `--version` flag ([#1706](https://github.com/gfx-rs/naga/pull/1706)) **@rhysd**\r\n- Support reading input from stdin via `--stdin-file-path` ([#1701](https://github.com/gfx-rs/naga/pull/1701)) **@rhysd**\r\n- Use `panic = \"abort\"` ([#1597](https://github.com/gfx-rs/naga/pull/1597)) **@jrmuizel**\r\n\r\nDOCS\r\n\r\n- Standardize some docs ([#1660](https://github.com/gfx-rs/naga/pull/1660)) **@NoelTautges**\r\n- Document `TypeInner::BindingArray` ([#1859](https://github.com/gfx-rs/naga/pull/1859)) **@jimblandy**\r\n- Clarify accepted types for `Expression::AccessIndex` ([#1862](https://github.com/gfx-rs/naga/pull/1862)) **@NoelTautges**\r\n- Document `proc::layouter` ([#1693](https://github.com/gfx-rs/naga/pull/1693)) **@jimblandy**\r\n- Document Naga's promises around validation and panics ([#1828](https://github.com/gfx-rs/naga/pull/1828)) **@jimblandy**\r\n- `FunctionInfo` doc fixes ([#1726](https://github.com/gfx-rs/naga/pull/1726)) **@jimblandy**\r\n\r\nVALIDATOR\r\n\r\n- Forbid returning pointers and atomics from functions ([#911](https://github.com/gfx-rs/naga/pull/911)) **@jimblandy**\r\n- Let validation check for more unsupported builtins ([#1962](https://github.com/gfx-rs/naga/pull/1962)) **@jimblandy**\r\n- Fix `Capabilities::SAMPLER_NON_UNIFORM_INDEXING` bitflag ([#1915](https://github.com/gfx-rs/naga/pull/1915)) **@cwfitzgerald**\r\n- Properly check that user-defined IO uses IO-shareable types ([#912](https://github.com/gfx-rs/naga/pull/912)) **@jimblandy**\r\n- Validate `ValuePointer` exactly like a `Pointer` to a `Scalar` ([#1875](https://github.com/gfx-rs/naga/pull/1875)) **@jimblandy**\r\n- Reject empty structs ([#1826](https://github.com/gfx-rs/naga/pull/1826)) **@jimblandy**\r\n- Validate uniform address space layout constraints ([#1812](https://github.com/gfx-rs/naga/pull/1812)) **@teoxoy**\r\n- Improve `AddressSpace` related error messages ([#1710](https://github.com/gfx-rs/naga/pull/1710)) **@kvark**\r\n\r\nWGSL-IN\r\n\r\nMain breaking changes\r\n\r\n- Commas to separate struct members (comma after last member is optional)\r\n  - `struct S { a: f32; b: i32; }` -> `struct S { a: f32, b: i32 }`\r\n- Attribute syntax\r\n  - `[[binding(0), group(0)]]` -> `@binding(0) @group(0)`\r\n- Entry point stage attributes\r\n  - `@stage(vertex)` -> `@vertex`\r\n  - `@stage(fragment)` -> `@fragment`\r\n  - `@stage(compute)` -> `@compute`\r\n- Function renames\r\n  - `smoothStep` -> `smoothstep`\r\n  - `findLsb` -> `firstTrailingBit`\r\n  - `findMsb` -> `firstLeadingBit`\r\n\r\nSpecification Changes (relavant changes have also been applied to the WGSL backend)\r\n\r\n- Add support for `break if` ([#1993](https://github.com/gfx-rs/naga/pull/1993)) **@JCapucho**\r\n- Update number literal format ([#1863](https://github.com/gfx-rs/naga/pull/1863)) **@teoxoy**\r\n- Allow non-ascii characters in identifiers ([#1849](https://github.com/gfx-rs/naga/pull/1849)) **@teoxoy**\r\n- Update reserved keywords ([#1847](https://github.com/gfx-rs/naga/pull/1847), [#1870](https://github.com/gfx-rs/naga/pull/1870), [#1905](https://github.com/gfx-rs/naga/pull/1905)) **@teoxoy** **@Gordon-F**\r\n- Update entry point stage attributes ([#1833](https://github.com/gfx-rs/naga/pull/1833)) **@Gordon-F**\r\n- Make colon in case optional ([#1801](https://github.com/gfx-rs/naga/pull/1801)) **@Gordon-F**\r\n- Rename `smoothStep` to `smoothstep` ([#1800](https://github.com/gfx-rs/naga/pull/1800)) **@Gordon-F**\r\n- Make semicolon after struct declaration optional ([#1791](https://github.com/gfx-rs/naga/pull/1791)) **@stshine**\r\n- Use commas to separate struct members instead of semicolons ([#1773](https://github.com/gfx-rs/naga/pull/1773)) **@Gordon-F**\r\n- Rename `findLsb`/`findMsb` to `firstTrailingBit`/`firstLeadingBit` ([#1735](https://github.com/gfx-rs/naga/pull/1735)) **@kvark**\r\n- Make parenthesis optional for `if` and `switch` statements ([#1725](https://github.com/gfx-rs/naga/pull/1725)) **@Gordon-F**\r\n- Declare attribtues with `@attrib` instead of `[[attrib]]` ([#1676](https://github.com/gfx-rs/naga/pull/1676)) **@kvark**\r\n- Allow non-structure buffer types ([#1682](https://github.com/gfx-rs/naga/pull/1682)) **@kvark**\r\n- Remove `stride` attribute ([#1681](https://github.com/gfx-rs/naga/pull/1681)) **@kvark**\r\n\r\nImprovements\r\n\r\n- Implement complete validation for size and align attributes ([#1979](https://github.com/gfx-rs/naga/pull/1979)) **@teoxoy**\r\n- Implement `firstTrailingBit`/`firstLeadingBit` u32 overloads ([#1865](https://github.com/gfx-rs/naga/pull/1865)) **@teoxoy**\r\n- Add error for non-floating-point matrix ([#1917](https://github.com/gfx-rs/naga/pull/1917)) **@grovesNL**\r\n- Implement partial vector & matrix identity constructors ([#1916](https://github.com/gfx-rs/naga/pull/1916)) **@teoxoy**\r\n- Implement phony assignment ([#1866](https://github.com/gfx-rs/naga/pull/1866), [#1869](https://github.com/gfx-rs/naga/pull/1869)) **@teoxoy**\r\n- Fix being able to match `~=` as LogicalOperation ([#1849](https://github.com/gfx-rs/naga/pull/1849)) **@teoxoy**\r\n- Implement Binding Arrays ([#1845](https://github.com/gfx-rs/naga/pull/1845)) **@cwfitzgerald**\r\n- Implement unary vector operators ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy**\r\n- Implement zero value constructors and constructors that infer their type from their parameters ([#1790](https://github.com/gfx-rs/naga/pull/1790)) **@teoxoy**\r\n- Implement invariant attribute ([#1789](https://github.com/gfx-rs/naga/pull/1789), [#1822](https://github.com/gfx-rs/naga/pull/1822)) **@teoxoy** **@jimblandy**\r\n- Implement increment and decrement statements ([#1788](https://github.com/gfx-rs/naga/pull/1788), [#1912](https://github.com/gfx-rs/naga/pull/1912)) **@teoxoy**\r\n- Implement `while` loop ([#1787](https://github.com/gfx-rs/naga/pull/1787)) **@teoxoy**\r\n- Fix array size on globals ([#1717](https://github.com/gfx-rs/naga/pull/1717)) **@jimblandy**\r\n- Implement integer vector overloads for `dot` function ([#1689](https://github.com/gfx-rs/naga/pull/1689)) **@francesco-cattoglio**\r\n- Implement block comments ([#1675](https://github.com/gfx-rs/naga/pull/1675)) **@kocsis1david**\r\n- Implement assignment binary operators ([#1662](https://github.com/gfx-rs/naga/pull/1662)) **@kvark**\r\n- Implement `radians`/`degrees` builtin functions ([#1627](https://github.com/gfx-rs/naga/pull/1627)) **@encounter**\r\n- Implement `findLsb`/`findMsb` builtin functions ([#1473](https://github.com/gfx-rs/naga/pull/1473)) **@fintelia**\r\n- Implement `textureGather`/`textureGatherCompare` builtin functions ([#1596](https://github.com/gfx-rs/naga/pull/1596)) **@kvark**\r\n\r\nSPV-IN\r\n\r\n- Implement `OpBitReverse` and `OpBitCount` ([#1954](https://github.com/gfx-rs/naga/pull/1954)) **@JCapucho**\r\n- Add `MultiView` to `SUPPORTED_CAPABILITIES` ([#1934](https://github.com/gfx-rs/naga/pull/1934)) **@expenses**\r\n- Translate `OpSMod` and `OpFMod` correctly ([#1867](https://github.com/gfx-rs/naga/pull/1867), [#1995](https://github.com/gfx-rs/naga/pull/1995)) **@teoxoy** **@JCapucho**\r\n- Error on unsupported `MatrixStride` ([#1805](https://github.com/gfx-rs/naga/pull/1805)) **@teoxoy**\r\n- Align array stride for undecorated arrays ([#1724](https://github.com/gfx-rs/naga/pull/1724)) **@JCapucho**\r\n\r\nGLSL-IN\r\n\r\n- Don't allow empty last case in switch ([#1981](https://github.com/gfx-rs/naga/pull/1981)) **@JCapucho**\r\n- Fix last case falltrough and empty switch ([#1981](https://github.com/gfx-rs/naga/pull/1981)) **@JCapucho**\r\n- Splat inputs for smoothstep if needed ([#1976](https://github.com/gfx-rs/naga/pull/1976)) **@JCapucho**\r\n- Fix parameter not changing to depth ([#1967](https://github.com/gfx-rs/naga/pull/1967)) **@JCapucho**\r\n- Fix matrix multiplication check ([#1953](https://github.com/gfx-rs/naga/pull/1953)) **@JCapucho**\r\n- Fix panic (stop emitter in conditional) ([#1952](https://github.com/gfx-rs/naga/pull/1952)) **@JCapucho**\r\n- Translate `mod` fn correctly ([#1867](https://github.com/gfx-rs/naga/pull/1867)) **@teoxoy**\r\n- Make the ternary operator behave as an if ([#1877](https://github.com/gfx-rs/naga/pull/1877)) **@JCapucho**\r\n- Add support for `clamp` function ([#1502](https://github.com/gfx-rs/naga/pull/1502)) **@sjinno**\r\n- Better errors for bad constant expression ([#1501](https://github.com/gfx-rs/naga/pull/1501)) **@sjinno**\r\n- Error on a `matCx2` used with the `std140` layout ([#1806](https://github.com/gfx-rs/naga/pull/1806)) **@teoxoy**\r\n- Allow nested accesses in lhs positions ([#1794](https://github.com/gfx-rs/naga/pull/1794)) **@JCapucho**\r\n- Use forced conversions for vector/matrix constructors ([#1796](https://github.com/gfx-rs/naga/pull/1796)) **@JCapucho**\r\n- Add support for `barrier` function ([#1793](https://github.com/gfx-rs/naga/pull/1793)) **@fintelia**\r\n- Fix panic (resume expression emit after `imageStore`) ([#1795](https://github.com/gfx-rs/naga/pull/1795)) **@JCapucho**\r\n- Allow multiple array specifiers ([#1780](https://github.com/gfx-rs/naga/pull/1780)) **@JCapucho**\r\n- Fix memory qualifiers being inverted ([#1779](https://github.com/gfx-rs/naga/pull/1779)) **@JCapucho**\r\n- Support arrays as input/output types ([#1759](https://github.com/gfx-rs/naga/pull/1759)) **@JCapucho**\r\n- Fix freestanding constructor parsing ([#1758](https://github.com/gfx-rs/naga/pull/1758)) **@JCapucho**\r\n- Fix matrix - scalar operations ([#1757](https://github.com/gfx-rs/naga/pull/1757)) **@JCapucho**\r\n- Fix matrix - matrix division ([#1757](https://github.com/gfx-rs/naga/pull/1757)) **@JCapucho**\r\n- Fix matrix comparisons ([#1757](https://github.com/gfx-rs/naga/pull/1757)) **@JCapucho**\r\n- Add support for `texelFetchOffset` ([#1746](https://github.com/gfx-rs/naga/pull/1746)) **@JCapucho**\r\n- Inject `sampler2DMSArray` builtins on use ([#1737](https://github.com/gfx-rs/naga/pull/1737)) **@JCapucho**\r\n- Inject `samplerCubeArray` builtins on use ([#1736](https://github.com/gfx-rs/naga/pull/1736)) **@JCapucho**\r\n- Add support for image builtin functions ([#1723](https://github.com/gfx-rs/naga/pull/1723)) **@JCapucho**\r\n- Add support for image declarations ([#1723](https://github.com/gfx-rs/naga/pull/1723)) **@JCapucho**\r\n- Texture builtins fixes ([#1719](https://github.com/gfx-rs/naga/pull/1719)) **@JCapucho**\r\n- Type qualifiers rework ([#1713](https://github.com/gfx-rs/naga/pull/1713)) **@JCapucho**\r\n- `texelFetch` accept multisampled textures ([#1715](https://github.com/gfx-rs/naga/pull/1715)) **@JCapucho**\r\n- Fix panic when culling nested block ([#1714](https://github.com/gfx-rs/naga/pull/1714)) **@JCapucho**\r\n- Fix composite constructors ([#1631](https://github.com/gfx-rs/naga/pull/1631)) **@JCapucho**\r\n- Fix using swizzle as out arguments ([#1632](https://github.com/gfx-rs/naga/pull/1632)) **@JCapucho**\r\n\r\nSPV-OUT\r\n\r\n- Implement `reverseBits` and `countOneBits` ([#1897](https://github.com/gfx-rs/naga/pull/1897)) **@hasali19**\r\n- Use `OpCopyObject` for matrix identity casts ([#1916](https://github.com/gfx-rs/naga/pull/1916)) **@teoxoy**\r\n- Use `OpCopyObject` for bool - bool conversion due to `OpBitcast` not being feasible for booleans ([#1916](https://github.com/gfx-rs/naga/pull/1916)) **@teoxoy**\r\n- Zero init variables in function and private address spaces ([#1871](https://github.com/gfx-rs/naga/pull/1871)) **@teoxoy**\r\n- Use `SRem` instead of `SMod` ([#1867](https://github.com/gfx-rs/naga/pull/1867)) **@teoxoy**\r\n- Add support for integer vector - scalar multiplication ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy**\r\n- Add support for matrix addition and subtraction ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy**\r\n- Emit required decorations on wrapper struct types ([#1815](https://github.com/gfx-rs/naga/pull/1815)) **@jimblandy**\r\n- Decorate array and struct type layouts unconditionally ([#1815](https://github.com/gfx-rs/naga/pull/1815)) **@jimblandy**\r\n- Fix wrong `MatrixStride` for `matCx2` and `mat2xR` ([#1781](https://github.com/gfx-rs/naga/pull/1781)) **@teoxoy**\r\n- Use `OpImageQuerySize` for MS images ([#1742](https://github.com/gfx-rs/naga/pull/1742)) **@JCapucho**\r\n\r\nMSL-OUT\r\n\r\n- Insert padding initialization for global constants ([#1988](https://github.com/gfx-rs/naga/pull/1988)) **@teoxoy**\r\n- Don't rely on cached expressions ([#1975](https://github.com/gfx-rs/naga/pull/1975)) **@JCapucho**\r\n- Fix pointers to private or workgroup address spaces possibly being read only ([#1901](https://github.com/gfx-rs/naga/pull/1901)) **@teoxoy**\r\n- Zero init variables in function address space ([#1871](https://github.com/gfx-rs/naga/pull/1871)) **@teoxoy**\r\n- Make binding arrays play nice with bounds checks ([#1855](https://github.com/gfx-rs/naga/pull/1855)) **@cwfitzgerald**\r\n- Permit `invariant` qualifier on vertex shader outputs ([#1821](https://github.com/gfx-rs/naga/pull/1821)) **@jimblandy**\r\n- Fix packed `vec3` stores ([#1816](https://github.com/gfx-rs/naga/pull/1816)) **@teoxoy**\r\n- Actually test push constants to be used ([#1767](https://github.com/gfx-rs/naga/pull/1767)) **@kvark**\r\n- Properly rename entry point arguments for struct members ([#1766](https://github.com/gfx-rs/naga/pull/1766)) **@jimblandy**\r\n- Qualify read-only storage with const ([#1763](https://github.com/gfx-rs/naga/pull/1763)) **@kvark**\r\n- Fix not unary operator for integer scalars ([#1760](https://github.com/gfx-rs/naga/pull/1760)) **@vincentisambart**\r\n- Add bounds checks for `ImageLoad` and `ImageStore` ([#1730](https://github.com/gfx-rs/naga/pull/1730)) **@jimblandy**\r\n- Fix resource bindings for non-structures ([#1718](https://github.com/gfx-rs/naga/pull/1718)) **@kvark**\r\n- Always check whether _buffer_sizes arg is needed ([#1717](https://github.com/gfx-rs/naga/pull/1717)) **@jimblandy**\r\n- WGSL storage address space should always correspond to MSL device address space ([#1711](https://github.com/gfx-rs/naga/pull/1711)) **@wtholliday**\r\n- Mitigation for MSL atomic bounds check ([#1703](https://github.com/gfx-rs/naga/pull/1703)) **@glalonde**\r\n\r\nHLSL-OUT\r\n\r\n- More `matCx2` fixes (#1989) ([#1989](https://github.com/gfx-rs/naga/pull/1989)) **@teoxoy**\r\n- Fix fallthrough in switch statements ([#1920](https://github.com/gfx-rs/naga/pull/1920)) **@teoxoy**\r\n- Fix missing break statements ([#1919](https://github.com/gfx-rs/naga/pull/1919)) **@teoxoy**\r\n- Fix `countOneBits` and `reverseBits` for signed integers ([#1928](https://github.com/gfx-rs/naga/pull/1928)) **@hasali19**\r\n- Fix array constructor return type ([#1914](https://github.com/gfx-rs/naga/pull/1914)) **@teoxoy**\r\n- Fix hlsl output for writes to scalar/vector storage buffer ([#1903](https://github.com/gfx-rs/naga/pull/1903)) **@hasali19**\r\n- Use `fmod` instead of `%` ([#1867](https://github.com/gfx-rs/naga/pull/1867)) **@teoxoy**\r\n- Use wrapped constructors when loading from storage address space ([#1893](https://github.com/gfx-rs/naga/pull/1893)) **@teoxoy**\r\n- Zero init struct constructor ([#1890](https://github.com/gfx-rs/naga/pull/1890)) **@teoxoy**\r\n- Flesh out matrix handling documentation ([#1850](https://github.com/gfx-rs/naga/pull/1850)) **@jimblandy**\r\n- Emit `row_major` qualifier on matrix uniform globals ([#1846](https://github.com/gfx-rs/naga/pull/1846)) **@jimblandy**\r\n- Fix bool splat ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy**\r\n- Add more padding when necessary ([#1814](https://github.com/gfx-rs/naga/pull/1814)) **@teoxoy**\r\n- Support multidimensional arrays ([#1814](https://github.com/gfx-rs/naga/pull/1814)) **@teoxoy**\r\n- Don't output interpolation modifier if it's the default ([#1809](https://github.com/gfx-rs/naga/pull/1809)) **@NoelTautges**\r\n- Fix `matCx2` translation for uniform buffers ([#1802](https://github.com/gfx-rs/naga/pull/1802)) **@teoxoy**\r\n- Fix modifiers not being written in the vertex output and fragment input structs ([#1789](https://github.com/gfx-rs/naga/pull/1789)) **@teoxoy**\r\n- Fix matrix not being declared as transposed ([#1784](https://github.com/gfx-rs/naga/pull/1784)) **@teoxoy**\r\n- Insert padding between struct members ([#1786](https://github.com/gfx-rs/naga/pull/1786)) **@teoxoy**\r\n- Fix not unary operator for integer scalars ([#1760](https://github.com/gfx-rs/naga/pull/1760)) **@vincentisambart**\r\n\r\nGLSL-OUT\r\n\r\n- Fix vector bitcasts (#1966) ([#1966](https://github.com/gfx-rs/naga/pull/1966)) **@expenses**\r\n- Perform casts in int only math functions ([#1978](https://github.com/gfx-rs/naga/pull/1978)) **@JCapucho**\r\n- Don't rely on cached expressions ([#1975](https://github.com/gfx-rs/naga/pull/1975)) **@JCapucho**\r\n- Fix type error for `countOneBits` implementation ([#1897](https://github.com/gfx-rs/naga/pull/1897)) **@hasali19**\r\n- Fix storage format for `Rgba8Unorm` ([#1955](https://github.com/gfx-rs/naga/pull/1955)) **@JCapucho**\r\n- Implement bounds checks for `ImageLoad` ([#1889](https://github.com/gfx-rs/naga/pull/1889)) **@JCapucho**\r\n- Fix feature search in expressions ([#1887](https://github.com/gfx-rs/naga/pull/1887)) **@JCapucho**\r\n- Emit globals of any type ([#1823](https://github.com/gfx-rs/naga/pull/1823)) **@jimblandy**\r\n- Add support for boolean vector `~`, `|` and `&` ops ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy**\r\n- Fix array function arguments ([#1814](https://github.com/gfx-rs/naga/pull/1814)) **@teoxoy**\r\n- Write constant sized array type for uniform ([#1768](https://github.com/gfx-rs/naga/pull/1768)) **@hatoo**\r\n- Texture function fixes ([#1742](https://github.com/gfx-rs/naga/pull/1742)) **@JCapucho**\r\n- Push constants use anonymous uniforms ([#1683](https://github.com/gfx-rs/naga/pull/1683)) **@JCapucho**\r\n- Add support for push constant emulation ([#1672](https://github.com/gfx-rs/naga/pull/1672)) **@JCapucho**\r\n- Skip unsized types if unused ([#1649](https://github.com/gfx-rs/naga/pull/1649)) **@kvark**\r\n- Write struct and array initializers ([#1644](https://github.com/gfx-rs/naga/pull/1644)) **@JCapucho**\r\n\r\n\r\n## v0.8.5 (2022-01-25)\r\n\r\nMSL-OUT\r\n\r\n- Make VS-output positions invariant on even more systems ([#1697](https://github.com/gfx-rs/naga/pull/1697)) **@cwfitzgerald**\r\n- Improve support for point primitives ([#1696](https://github.com/gfx-rs/naga/pull/1696)) **@kvark**\r\n\r\n\r\n## v0.8.4 (2022-01-24)\r\n\r\nMSL-OUT\r\n\r\n- Make VS-output positions invariant if possible ([#1687](https://github.com/gfx-rs/naga/pull/1687)) **@kvark**\r\n\r\nGLSL-OUT\r\n\r\n- Fix `floatBitsToUint` spelling ([#1688](https://github.com/gfx-rs/naga/pull/1688)) **@cwfitzgerald**\r\n- Call proper memory barrier functions ([#1680](https://github.com/gfx-rs/naga/pull/1680)) **@francesco-cattoglio**\r\n\r\n\r\n## v0.8.3 (2022-01-20)\r\n\r\n- Don't pin `indexmap` version ([#1666](https://github.com/gfx-rs/naga/pull/1666)) **@a1phyr**\r\n\r\nMSL-OUT\r\n\r\n- Fix support for point primitives ([#1674](https://github.com/gfx-rs/naga/pull/1674)) **@kvark**\r\n\r\nGLSL-OUT\r\n\r\n- Fix sampler association ([#1671](https://github.com/gfx-rs/naga/pull/1671)) **@JCapucho**\r\n\r\n\r\n## v0.8.2 (2022-01-11)\r\n\r\nVALIDATOR\r\n\r\n- Check structure resource types ([#1639](https://github.com/gfx-rs/naga/pull/1639)) **@kvark**\r\n\r\nWGSL-IN\r\n\r\n- Improve type mismatch errors ([#1658](https://github.com/gfx-rs/naga/pull/1658)) **@Gordon-F**\r\n\r\nSPV-IN\r\n\r\n- Implement more sign agnostic operations ([#1651](https://github.com/gfx-rs/naga/pull/1651), [#1650](https://github.com/gfx-rs/naga/pull/1650)) **@JCapucho**\r\n\r\nSPV-OUT\r\n\r\n- Fix modulo operator (use `OpFRem` instead of `OpFMod`) ([#1653](https://github.com/gfx-rs/naga/pull/1653)) **@JCapucho**\r\n\r\nMSL-OUT\r\n\r\n- Fix `texture1d` accesses ([#1647](https://github.com/gfx-rs/naga/pull/1647)) **@jimblandy**\r\n- Fix data packing functions ([#1637](https://github.com/gfx-rs/naga/pull/1637)) **@phoekz**\r\n\r\n\r\n## v0.8.1 (2021-12-29)\r\n\r\nAPI\r\n\r\n- Make `WithSpan` clonable ([#1620](https://github.com/gfx-rs/naga/pull/1620)) **@jakobhellermann**\r\n\r\nMSL-OUT\r\n\r\n- Fix packed vec access ([#1634](https://github.com/gfx-rs/naga/pull/1634)) **@kvark**\r\n- Fix packed float support ([#1630](https://github.com/gfx-rs/naga/pull/1630)) **@kvark**\r\n\r\nHLSL-OUT\r\n\r\n- Support arrays of matrices ([#1629](https://github.com/gfx-rs/naga/pull/1629)) **@kvark**\r\n- Use `mad` instead of `fma` function ([#1580](https://github.com/gfx-rs/naga/pull/1580)) **@parasyte**\r\n\r\nGLSL-OUT\r\n\r\n- Fix conflicting names for globals ([#1616](https://github.com/gfx-rs/naga/pull/1616)) **@Gordon-F**\r\n- Fix `fma` function ([#1580](https://github.com/gfx-rs/naga/pull/1580)) **@parasyte**\r\n\r\n\r\n## v0.8 (2021-12-18)\r\n  - development release for wgpu-0.12\r\n  - lots of fixes in all parts\r\n  - validator:\r\n    - now gated by `validate` feature\r\n    - nicely detailed error messages with spans\r\n  - API:\r\n    - image gather operations\r\n  - WGSL-in:\r\n    - remove `[[block]]` attribute\r\n    - `elseif` is removed in favor of `else if`\r\n  - MSL-out:\r\n    - full out-of-bounds checking\r\n\r\n## v0.7.3 (2021-12-14)\r\n  - API:\r\n    - `view_index` builtin\r\n  - GLSL-out:\r\n    - reflect textures without samplers\r\n  - SPV-out:\r\n    - fix incorrect pack/unpack\r\n\r\n## v0.7.2 (2021-12-01)\r\n  - validator:\r\n    - check stores for proper pointer class\r\n  - HLSL-out:\r\n    - fix stores into `mat3`\r\n    - respect array strides\r\n  - SPV-out:\r\n    - fix multi-word constants\r\n  - WGSL-in:\r\n    - permit names starting with underscores\r\n  - SPV-in:\r\n    - cull unused builtins\r\n    - support empty debug labels\r\n  - GLSL-in:\r\n    - don't panic on invalid integer operations\r\n\r\n## v0.7.1 (2021-10-12)\r\n  - implement casts from and to booleans in the backends\r\n\r\n## v0.7 (2021-10-07)\r\n  - development release for wgpu-0.11\r\n  - API:\r\n    - bit extraction and packing functions\r\n    - hyperbolic trigonometry functions\r\n    - validation is gated by a cargo feature\r\n    - `view_index` builtin\r\n    - separate bounds checking policies for locals/buffers/textures\r\n  - IR:\r\n    - types and constants are guaranteed to be unique\r\n  - WGSL-in:\r\n    - new hex literal parser\r\n    - updated list of reserved words\r\n    - rewritten logic for resolving references and pointers\r\n    - `switch` can use unsigned selectors\r\n  - GLSL-in:\r\n    - better support for texture sampling\r\n    - better logic for auto-splatting scalars\r\n  - GLSL-out:\r\n    - fixed storage buffer layout\r\n    - fix module operator\r\n  - HLSL-out:\r\n    - fixed texture queries\r\n  - SPV-in:\r\n    - control flow handling is rewritten from scratch\r\n  - SPV-out:\r\n    - fully covered out-of-bounds checking\r\n    - option to emit point size\r\n    - option to clamp output depth\r\n\r\n## v0.6.3 (2021-09-08)\r\n  - Reduced heap allocations when generating WGSL, HLSL, and GLSL\r\n  - WGSL-in:\r\n    - support module-scope `let` type inference\r\n  - SPV-in:\r\n    - fix depth sampling with projection\r\n  - HLSL-out:\r\n    - fix local struct construction\r\n  - GLSL-out:\r\n    - fix `select()` order\r\n  - SPV-out:\r\n    - allow working around Adreno issue with `OpName`\r\n\r\n## v0.6.2 (2021-09-01)\r\n  - SPV-out fixes:\r\n    - requested capabilities for 1D and cube images, storage formats\r\n    - handling `break` and `continue` in a `switch` statement\r\n    - avoid generating duplicate `OpTypeImage` types\r\n  - HLSL-out fixes:\r\n    - fix output struct member names\r\n  - MSL-out fixes:\r\n    - fix packing of fields in interface structs\r\n  - GLSL-out fixes:\r\n    - fix non-fallthrough `switch` cases\r\n  - GLSL-in fixes:\r\n    - avoid infinite loop on invalid statements\r\n\r\n## v0.6.1 (2021-08-24)\r\n  - HLSL-out fixes:\r\n    - array arguments\r\n    - pointers to array arguments\r\n    - switch statement\r\n    - rewritten interface matching\r\n  - SPV-in fixes:\r\n    - array storage texture stores\r\n    - tracking sampling across function parameters\r\n    - updated petgraph dependencies\r\n  - MSL-out:\r\n    - gradient sampling\r\n  - GLSL-out:\r\n    - modulo operator on floats\r\n\r\n## v0.6 (2021-08-18)\r\n  - development release for wgpu-0.10\r\n  - API:\r\n    - atomic types and functions\r\n    - storage access is moved from global variables to the storage class and storage texture type\r\n    - new built-ins: `primitive_index` and `num_workgroups`\r\n    - support for multi-sampled depth images\r\n  - WGSL:\r\n    - `select()` order of true/false is swapped\r\n  - HLSL backend is vastly improved and now usable\r\n  - GLSL frontend is heavily reworked\r\n\r\n## v0.5 (2021-06-18)\r\n  - development release for wgpu-0.9\r\n  - API:\r\n    - barriers\r\n    - dynamic indexing of matrices and arrays is only allowed on variables\r\n    - validator now accepts a list of IR capabilities to allow\r\n    - improved documentation\r\n  - Infrastructure:\r\n    - much richer test suite, focused around consuming or emitting WGSL\r\n    - lazy testing on large shader corpuses\r\n    - the binary is moved to a sub-crate \"naga-cli\"\r\n  - Frontends:\r\n    - GLSL frontend:\r\n      - rewritten from scratch and effectively revived, no longer depends on `pomelo`\r\n      - only supports 440/450/460 versions for now\r\n      - has optional support for codespan messages\r\n    - SPIRV frontend has improved CFG resolution (still with issues unresolved)\r\n    - WGSL got better error messages, workgroup memory support\r\n  - Backends:\r\n    - general: better expression naming and emitting\r\n    - new HLSL backend (in progress)\r\n    - MSL:\r\n      - support `ArraySize` expression\r\n      - better texture sampling instructions\r\n    - GLSL:\r\n      - multisampling on GLES\r\n    - WGSL is vastly improved and now usable\r\n\r\n## v0.4.2 (2021-05-28)\r\n  - SPIR-V frontend:\r\n    - fix image stores\r\n    - fix matrix stride check\r\n  - SPIR-V backend:\r\n    - fix auto-deriving the capabilities\r\n  - GLSL backend:\r\n    - support sample interpolation\r\n    - write out swizzled vector accesses\r\n\r\n## v0.4.1 (2021-05-14)\r\n  - numerous additions and improvements to SPIR-V frontend:\r\n    - int8, in16, int64\r\n    - null constant initializers for structs and matrices\r\n    - `OpArrayLength`, `OpCopyMemory`, `OpInBoundsAccessChain`, `OpLogicalXxxEqual`\r\n    - outer product\r\n    - fix struct size alignment\r\n    - initialize built-ins with default values\r\n    - fix read-only decorations on struct members\r\n  - fix struct size alignment in WGSL\r\n  - fix `fwidth` in WGSL\r\n  - fix scalars arrays in GLSL backend\r\n\r\n## v0.4 (2021-04-29)\r\n  - development release for wgpu-0.8\r\n  - API:\r\n    - expressions are explicitly emitted with `Statement::Emit`\r\n    - entry points have inputs in arguments and outputs in the result type\r\n    - `input`/`output` storage classes are gone, but `push_constant` is added\r\n    - `Interpolation` is moved into `Binding::Location` variant\r\n    - real pointer semantics with required `Expression::Load`\r\n    - `TypeInner::ValuePointer` is added\r\n    - image query expressions are added\r\n    - new `Statement::ImageStore`\r\n    - all function calls are `Statement::Call`\r\n    - `GlobalUse` is moved out into processing\r\n    - `Header` is removed\r\n    - entry points are an array instead of a map\r\n    - new `Swizzle` and `Splat` expressions\r\n    - interpolation qualifiers are extended and required\r\n    - struct member layout is based on the byte offsets\r\n  - Infrastructure:\r\n    - control flow uniformity analysis\r\n    - texture-sampler combination gathering\r\n    - `CallGraph` processor is moved out into `glsl` backend\r\n    - `Interface` is removed, instead the analysis produces `ModuleInfo` with all the derived info\r\n    - validation of statement tree, expressions, and constants\r\n    - code linting is more strict for matches\r\n  - new GraphViz `dot` backend for pretty visualization of the IR\r\n  - Metal support for inlined samplers\r\n  - `convert` example is transformed into the default binary target named `naga`\r\n  - lots of frontend and backend fixes\r\n\r\n## v0.3.2 (2021-02-15)\r\n  - fix logical expression types\r\n  - fix _FragDepth_ semantics\r\n  - spv-in:\r\n    - derive block status of structures\r\n  - spv-out:\r\n    - add lots of missing math functions\r\n    - implement discard\r\n\r\n## v0.3.1 (2021-01-31)\r\n  - wgsl:\r\n    - support constant array sizes\r\n  - spv-out:\r\n    - fix block decorations on nested structures\r\n    - fix fixed-size arrays\r\n    - fix matrix decorations inside structures\r\n    - implement read-only decorations\r\n\r\n## v0.3 (2021-01-30)\r\n  - development release for wgpu-0.7\r\n  - API:\r\n    - math functions\r\n    - type casts\r\n    - updated storage classes\r\n    - updated image sub-types\r\n    - image sampling/loading options\r\n    - storage images\r\n    - interpolation qualifiers\r\n    - early and conservative depth\r\n  - Processors:\r\n    - name manager\r\n    - automatic layout\r\n    - termination analysis\r\n    - validation of types, constants, variables, and entry points\r\n\r\n## v0.2 (2020-08-17)\r\n  - development release for wgpu-0.6\r\n\r\n## v0.1 (2020-02-26)\r\n  - initial release\r\n"
  },
  {
    "path": "lib/naga/Cargo.toml",
    "content": "[package]\r\nname = \"naga\"\r\nversion = \"0.10.0\"\r\nauthors = [\"Naga Developers\"]\r\nedition = \"2018\"\r\ndescription = \"Shader translation infrastructure\"\r\nhomepage = \"https://github.com/gfx-rs/naga\"\r\nrepository = \"https://github.com/gfx-rs/naga/tree/v0.9\"\r\nkeywords = [\"shader\", \"SPIR-V\", \"GLSL\", \"MSL\"]\r\nlicense = \"MIT OR Apache-2.0\"\r\nexclude = [\"bin/**/*\", \"tests/**/*\", \"Cargo.lock\", \"target/**/*\"]\r\nresolver = \"2\"\r\nrust-version = \"1.56\"\r\n\r\n[package.metadata.docs.rs]\r\nall-features = true\r\n\r\n[profile.release]\r\npanic = \"abort\"\r\n\r\n[profile.dev]\r\npanic = \"abort\"\r\n\r\n[features]\r\ndefault = []\r\nclone = []\r\ndot-out = []\r\nglsl-in = [\"pp-rs\"]\r\nglsl-out = []\r\nmsl-out = []\r\nserialize = [\"serde\", \"indexmap/serde-1\"]\r\ndeserialize = [\"serde\", \"indexmap/serde-1\"]\r\nspv-in = [\"petgraph\", \"spirv\"]\r\nspv-out = [\"spirv\"]\r\nwgsl-in = [\"codespan-reporting\", \"hexf-parse\", \"termcolor\", \"unicode-xid\"]\r\nwgsl-out = []\r\nhlsl-out = []\r\nspan = [\"codespan-reporting\", \"termcolor\"]\r\nvalidate = []\r\n\r\n[[bench]]\r\nname = \"criterion\"\r\nharness = false\r\n\r\n[dependencies]\r\narbitrary = { version = \"1.0.2\", features = [\"derive\"], optional = true }\r\nbitflags = \"1.0.5\"\r\nbit-set = \"0.5\"\r\ntermcolor = { version = \"1.0.4\", optional = true }\r\n# remove termcolor dep when updating to the next version of codespan-reporting\r\n# termcolor minimum version was wrong and was fixed in\r\n# https://github.com/brendanzab/codespan/commit/e99c867339a877731437e7ee6a903a3d03b5439e\r\ncodespan-reporting = { version = \"0.11.0\", optional = true }\r\nrustc-hash = \"1.1.0\"\r\nindexmap = { version = \"1.6\", features = [\"std\"] }\r\nlog = \"0.4\"\r\nnum-traits = \"0.2\"\r\nspirv = { version = \"0.2\", optional = true }\r\nthiserror = \"1.0.21\"\r\nserde = { version = \"1.0.103\", features = [\"derive\"], optional = true }\r\npetgraph = { version =\"0.6\", optional = true }\r\npp-rs = { version = \"0.2.1\", optional = true }\r\nhexf-parse = { version = \"0.2.1\", optional = true }\r\nunicode-xid = { version = \"0.2.3\", optional = true }\r\n\r\n[dev-dependencies]\r\nbincode = \"1\"\r\ncriterion = { version = \"0.3\", features = [] }\r\ndiff = \"0.1\"\r\n# Require at least version 0.7.1 of ron, this version changed how floating points are\r\n# serialized by forcing them to always have the decimal part, this makes it backwards\r\n# incompatible with our tests because we do a syntatic diff and not a semantic one.\r\nron = \"~0.7.1\"\r\nserde = { version = \"1.0\", features = [\"derive\"] }\r\nspirv = { version = \"0.2\", features = [\"deserialize\"] }\r\nrspirv = \"0.11\"\r\nenv_logger = \"0.9\"\r\n\r\n[workspace]\r\nmembers = [\".\", \"cli\"]\r\n\r\n# Include \"cli\", so that `cargo run` runs the CLI by default. Include \".\", so\r\n# that `cargo test` includes naga's own tests by default (but note, using the\r\n# features that `cli/Cargo.toml` requests).\r\ndefault-members = [\".\", \"cli\"]\r\n"
  },
  {
    "path": "lib/naga/LICENSE-APACHE",
    "content": "                                 Apache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright [yyyy] [name of copyright owner]\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n"
  },
  {
    "path": "lib/naga/LICENSE-MIT",
    "content": "Copyright (c) [yyyy] [name of copyright owner]\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "lib/naga/Makefile",
    "content": ".PHONY: all clean validate-spv validate-msl validate-glsl validate-dot validate-wgsl validate-hlsl-dxc validate-hlsl-fxc\r\n.SECONDARY: boids.metal quad.metal\r\nSNAPSHOTS_BASE_IN=tests/in\r\nSNAPSHOTS_BASE_OUT=tests/out\r\n\r\nall:\r\n\tcargo fmt\r\n\tcargo test --all-features --workspace\r\n\tcargo clippy --all-features --workspace -- -D warnings\r\n\r\nclean:\r\n\trm *.metal *.air *.metallib *.vert *.frag *.comp *.spv\r\n\r\nbench:\r\n\t#rm -Rf target/criterion\r\n\tcargo bench\r\n\r\n%.metal: $(SNAPSHOTS_BASE_IN)/%.wgsl $(wildcard src/*.rs src/**/*.rs examples/*.rs)\r\n\tcargo run --features wgsl-in,msl-out -- $< $@\r\n\r\n%.air: %.metal\r\n\txcrun -sdk macosx metal -c $< -mmacosx-version-min=10.11\r\n\r\n%.metallib: %.air\r\n\txcrun -sdk macosx metallib $< -o $@\r\n\r\n%.dot: $(SNAPSHOTS_BASE_IN)/%.wgsl $(wildcard src/*.rs src/front/wgsl/*.rs src/back/dot/*.rs bin/naga.rs)\r\n\tcargo run --features wgsl-in,dot-out -- $< $@\r\n\r\n%.png: %.dot\r\n\tdot -Tpng $< -o $@\r\n\r\nvalidate-spv: $(SNAPSHOTS_BASE_OUT)/spv/*.spvasm\r\n\t@set -e && for file in $^ ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\t\\\r\n\t\tcat $${file} | spirv-as --target-env vulkan1.0 -o - | spirv-val; \\\r\n\tdone\r\n\r\nvalidate-msl: $(SNAPSHOTS_BASE_OUT)/msl/*.msl\r\n\t@set -e && for file in $^ ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\t\\\r\n\t\theader=$$(head -n1 $${file});\t\\\r\n\t\tcat $${file} | xcrun -sdk macosx metal -mmacosx-version-min=10.11 -std=macos-$${header:13:8} -x metal - -o /dev/null; \\\r\n\tdone\r\n\r\nvalidate-glsl: $(SNAPSHOTS_BASE_OUT)/glsl/*.glsl\r\n\t@set -e && for file in $(SNAPSHOTS_BASE_OUT)/glsl/*.Vertex.glsl ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\\\r\n\t\tcat $${file} | glslangValidator --stdin -S vert; \\\r\n\tdone\r\n\t@set -e && for file in $(SNAPSHOTS_BASE_OUT)/glsl/*.Fragment.glsl ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\\\r\n\t\tcat $${file} | glslangValidator --stdin -S frag; \\\r\n\tdone\r\n\t@set -e && for file in $(SNAPSHOTS_BASE_OUT)/glsl/*.Compute.glsl ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\\\r\n\t\tcat $${file} | glslangValidator --stdin -S comp; \\\r\n\tdone\r\n\r\nvalidate-dot: $(SNAPSHOTS_BASE_OUT)/dot/*.dot\r\n\t@set -e && for file in $^ ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\t\\\r\n\t\tcat $${file} | dot -o /dev/null; \\\r\n\tdone\r\n\r\nvalidate-wgsl: $(SNAPSHOTS_BASE_OUT)/wgsl/*.wgsl\r\n\t@set -e && for file in $^ ; do \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"};\t\\\r\n\t\tcargo run $${file}; \\\r\n\tdone\r\n\r\nvalidate-hlsl-dxc: SHELL:=/usr/bin/env bash # required because config files uses arrays\r\nvalidate-hlsl-dxc: $(SNAPSHOTS_BASE_OUT)/hlsl/*.hlsl\r\n\t@set -e && for file in $^ ; do \\\r\n\t\tDXC_PARAMS=\"-Wno-parentheses-equality -Zi -Qembed_debug -Od\"; \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"}; \\\r\n\t\tconfig=\"$$(dirname $${file})/$$(basename $${file}).config\"; \\\r\n\t\t. $${config}; \\\r\n\t\tfor (( i=0; i<$${#vertex[@]}; i++ )); do \\\r\n\t\t\tname=`echo $${vertex[i]} | cut -d \\: -f 1`; \\\r\n\t\t\tprofile=`echo $${vertex[i]} | cut -d \\: -f 2`; \\\r\n\t\t\t(set -x; dxc $${file} -T $${profile} -E $${name} $${DXC_PARAMS} > /dev/null); \\\r\n\t\tdone; \\\r\n\t\tfor (( i=0; i<$${#fragment[@]}; i++ )); do \\\r\n\t\t\tname=`echo $${fragment[i]} | cut -d \\: -f 1`; \\\r\n\t\t\tprofile=`echo $${fragment[i]} | cut -d \\: -f 2`; \\\r\n\t\t\t(set -x; dxc $${file} -T $${profile} -E $${name} $${DXC_PARAMS} > /dev/null); \\\r\n\t\tdone; \\\r\n\t\tfor (( i=0; i<$${#compute[@]}; i++ )); do \\\r\n\t\t\tname=`echo $${compute[i]} | cut -d \\: -f 1`; \\\r\n\t\t\tprofile=`echo $${compute[i]} | cut -d \\: -f 2`; \\\r\n\t\t\t(set -x; dxc $${file} -T $${profile} -E $${name} $${DXC_PARAMS} > /dev/null); \\\r\n\t\tdone; \\\r\n\t\techo \"======================\"; \\\r\n\tdone\r\n\r\nvalidate-hlsl-fxc: SHELL:=/usr/bin/env bash # required because config files uses arrays\r\nvalidate-hlsl-fxc: $(SNAPSHOTS_BASE_OUT)/hlsl/*.hlsl\r\n\t@set -e && for file in $^ ; do \\\r\n\t\tFXC_PARAMS=\"-Zi -Od\"; \\\r\n\t\techo \"Validating\" $${file#\"$(SNAPSHOTS_BASE_OUT)/\"}; \\\r\n\t\tconfig=\"$$(dirname $${file})/$$(basename $${file}).config\"; \\\r\n\t\t. $${config}; \\\r\n\t\tfor (( i=0; i<$${#vertex[@]}; i++ )); do \\\r\n\t\t\tname=`echo $${vertex[i]} | cut -d \\: -f 1`; \\\r\n\t\t\tprofile=`echo $${vertex[i]} | cut -d \\: -f 2`; \\\r\n\t\t\tsm=`echo $${profile} | cut -d \\_ -f 2`; \\\r\n\t\t\tif (( sm < 6 )); then \\\r\n\t\t\t\t(set -x; fxc $${file} -T $${profile} -E $${name} $${FXC_PARAMS} > /dev/null); \\\r\n\t\t\tfi \\\r\n\t\tdone; \\\r\n\t\tfor (( i=0; i<$${#fragment[@]}; i++ )); do \\\r\n\t\t\tname=`echo $${fragment[i]} | cut -d \\: -f 1`; \\\r\n\t\t\tprofile=`echo $${fragment[i]} | cut -d \\: -f 2`; \\\r\n\t\t\tsm=`echo $${profile} | cut -d \\_ -f 2`; \\\r\n\t\t\tif (( sm < 6 )); then \\\r\n\t\t\t\t(set -x; fxc $${file} -T $${profile} -E $${name} $${FXC_PARAMS} > /dev/null); \\\r\n\t\t\tfi \\\r\n\t\tdone; \\\r\n\t\tfor (( i=0; i<$${#compute[@]}; i++ )); do \\\r\n\t\t\tname=`echo $${compute[i]} | cut -d \\: -f 1`; \\\r\n\t\t\tprofile=`echo $${compute[i]} | cut -d \\: -f 2`; \\\r\n\t\t\tsm=`echo $${profile} | cut -d \\_ -f 2`; \\\r\n\t\t\tif (( sm < 6 )); then \\\r\n\t\t\t\t(set -x; fxc $${file} -T $${profile} -E $${name} $${FXC_PARAMS} > /dev/null); \\\r\n\t\t\tfi \\\r\n\t\tdone; \\\r\n\t\techo \"======================\"; \\\r\n\tdone\r\n"
  },
  {
    "path": "lib/naga/README.md",
    "content": "# Naga\r\n\r\n[![Matrix](https://img.shields.io/badge/Matrix-%23naga%3Amatrix.org-blueviolet.svg)](https://matrix.to/#/#naga:matrix.org)\r\n[![Crates.io](https://img.shields.io/crates/v/naga.svg?label=naga)](https://crates.io/crates/naga)\r\n[![Docs.rs](https://docs.rs/naga/badge.svg)](https://docs.rs/naga)\r\n[![Build Status](https://github.com/gfx-rs/naga/workflows/pipeline/badge.svg)](https://github.com/gfx-rs/naga/actions)\r\n![MSRV](https://img.shields.io/badge/rustc-1.56+-blue.svg)\r\n[![codecov.io](https://codecov.io/gh/gfx-rs/naga/branch/master/graph/badge.svg?token=9VOKYO8BM2)](https://codecov.io/gh/gfx-rs/naga)\r\n\r\nThe shader translation library for the needs of [wgpu](https://github.com/gfx-rs/wgpu).\r\n\r\n## Supported end-points\r\n\r\nFront-end       |       Status       | Feature | Notes |\r\n--------------- | ------------------ | ------- | ----- |\r\nSPIR-V (binary) | :white_check_mark: | spv-in  |       |\r\nWGSL            | :white_check_mark: | wgsl-in | Fully validated |\r\nGLSL            | :ok:               | glsl-in | GLSL 440+ and Vulkan semantics only |\r\n\r\nBack-end        |       Status       | Feature  | Notes |\r\n--------------- | ------------------ | -------- | ----- |\r\nSPIR-V          | :white_check_mark: | spv-out  |       |\r\nWGSL            | :ok:               | wgsl-out |       |\r\nMetal           | :white_check_mark: | msl-out  |       |\r\nHLSL            | :white_check_mark: | hlsl-out | Shader Model 5.0+ (DirectX 11+) |\r\nGLSL            | :ok:               | glsl-out | GLSL 330+ and GLSL ES 300+ |\r\nAIR             |                    |          |       |\r\nDXIL/DXIR       |                    |          |       |\r\nDXBC            |                    |          |       |\r\nDOT (GraphViz)  | :ok:               | dot-out  | Not a shading language |\r\n\r\n:white_check_mark: = Primary support — :ok: = Secondary support — :construction: = Unsupported, but support in progress\r\n\r\n## Conversion tool\r\n\r\nNaga can be used as a CLI, which allows to test the conversion of different code paths.\r\n\r\nFirst, install `naga-cli` from crates.io or directly from GitHub.\r\n\r\n```bash\r\n# release version\r\ncargo install naga-cli\r\n\r\n# development version\r\ncargo install naga-cli --git https://github.com/gfx-rs/naga.git\r\n```\r\n\r\nThen, you can run `naga` command.\r\n\r\n```bash\r\nnaga my_shader.wgsl # validate only\r\nnaga my_shader.spv my_shader.txt # dump the IR module into a file\r\nnaga my_shader.spv my_shader.metal --flow-dir flow-dir # convert the SPV to Metal, also dump the SPIR-V flow graph to `flow-dir`\r\nnaga my_shader.wgsl my_shader.vert --profile es310 # convert the WGSL to GLSL vertex stage under ES 3.20 profile\r\n```\r\n\r\nAs naga includes a default binary target, you can also use `cargo run` without installation. This is useful when you develop naga itself, or investigate the behavior of naga at a specific commit (e.g. [wgpu](https://github.com/gfx-rs/wgpu) might pin a different version of naga than the `HEAD` of this repository).\r\n\r\n```bash\r\ncargo run my_shader.wgsl\r\n```\r\n\r\n## Development workflow\r\n\r\nThe main instrument aiding the development is the good old `cargo test --all-features --workspace`,\r\nwhich will run the unit tests, and also update all the snapshots. You'll see these\r\nchanges in git before committing the code.\r\n\r\nIf working on a particular front-end or back-end, it may be convenient to\r\nenable the relevant features in `Cargo.toml`, e.g.\r\n```toml\r\ndefault = [\"spv-out\"] #TEMP!\r\n```\r\nThis allows IDE basic checks to report errors there, unless your IDE is sufficiently configurable already.\r\n\r\nFinally, when changes to the snapshots are made, we should verify that the produced shaders\r\nare indeed valid for the target platforms they are compiled for. We automate this with `Makefile`:\r\n```bash\r\nmake validate-spv # for Vulkan shaders, requires SPIRV-Tools installed\r\nmake validate-msl # for Metal shaders, requires XCode command-line tools installed\r\nmake validate-glsl # for OpenGL shaders, requires GLSLang installed\r\nmake validate-dot # for dot files, requires GraphViz installed\r\nmake validate-wgsl # for WGSL shaders\r\nmake validate-hlsl-dxc # for HLSL shaders via DXC\r\nmake validate-hlsl-fxc # for HLSL shaders via FXC\r\n# Note: HLSL Make targets make use of the \"sh\" shell. This is not the default shell in Windows.\r\n```\r\n"
  },
  {
    "path": "lib/naga/aa.metal",
    "content": "// language: metal2.0\n#include <metal_stdlib>\n#include <simd/simd.h>\n\nusing metal::uint;\n\nstruct _mslBufferSizes {\n    uint size1;\n    uint size2;\n    uint size3;\n    uint size4;\n    uint size6;\n    uint size7;\n};\n\nstruct Node {\n    metal::float3 position;\n    metal::float3 force;\n    metal::packed_float3 prev_force;\n    metal::atomic_uint mass;\n};\nstruct Uniforms {\n    uint frame_num;\n};\nstruct Bound {\n    metal::float3 bound_min;\n    metal::float3 bound_max;\n};\nstruct BHTree {\n    metal::atomic_uint max_depth;\n    metal::atomic_uint bottom;\n    float radius;\n};\nstruct BHTreeNode {\n    metal::packed_float3 position;\n    int _empty;\n    metal::atomic_int mass;\n    int count;\n    metal::atomic_int start;\n    int sort;\n};\ntypedef Node type_6[1];\ntypedef metal::uint2 type_8[1];\ntypedef metal::atomic_int type_9[1];\ntypedef Bound type_10[1];\ntypedef BHTreeNode type_11[1];\nstruct type_13 {\n    metal::float3 inner[256];\n};\nstruct type_14 {\n    uint inner[8];\n};\nstruct type_15 {\n    int inner[8];\n};\nstruct type_17 {\n    uint inner[48];\n};\nstruct type_18 {\n    float inner[48];\n};\n\nuint hash(\n    uint s_1\n) {\n    uint t = {};\n    t = s_1;\n    uint _e10 = t;\n    t = _e10 ^ 2747636419u;\n    uint _e13 = t;\n    t = _e13 * 2654435769u;\n    uint _e16 = t;\n    uint _e17 = t;\n    t = _e16 ^ (_e17 >> 16u);\n    uint _e21 = t;\n    t = _e21 * 2654435769u;\n    uint _e24 = t;\n    uint _e25 = t;\n    t = _e24 ^ (_e25 >> 16u);\n    uint _e29 = t;\n    t = _e29 * 2654435769u;\n    uint _e32 = t;\n    return _e32;\n}\n\nfloat random(\n    uint seed\n) {\n    uint _e9 = hash(seed);\n    return static_cast<float>(_e9) / 4294967296.0;\n}\n\nfloat random_xy(\n    uint seed_x,\n    uint seed_y\n) {\n    uint _e10 = hash(seed_x);\n    uint _e12 = hash(_e10 + seed_y);\n    return static_cast<float>(_e12) / 4294967296.0;\n}\n\nvoid atomic_add_f32_(\n    uint springIndex,\n    float updateValue,\n    device type_9& springForceSrc,\n    constant _mslBufferSizes& _buffer_sizes\n) {\n    int new_u32_ = {};\n    int assumed = 0;\n    int origin = {};\n    new_u32_ = as_type<int>(updateValue);\n    while(true) {\n        if (true) {\n        } else {\n            break;\n        }\n        int _e17 = assumed;\n        int _e18 = new_u32_;\n        metal::atomic_compare_exchange_weak_explicit(&springForceSrc[springIndex], &_e17, _e18, metal::memory_order_relaxed, metal::memory_order_relaxed);\n        origin = _e17;\n        int _e20 = origin;\n        int _e21 = assumed;\n        if (_e20 == _e21) {\n            break;\n        }\n        int _e23 = origin;\n        assumed = _e23;\n        int _e24 = origin;\n        new_u32_ = as_type<int>(as_type<float>(_e24) + updateValue);\n    }\n    return;\n}\n\nstruct gen_nodeInput {\n};\nkernel void gen_node(\n  metal::uint3 global_invocation_id [[thread_position_in_grid]]\n, constant Uniforms& uniforms [[user(fake0)]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device type_9& springForceSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 vPos = {};\n    uint total = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_5 = global_invocation_id.x;\n    if (index_5 >= total) {\n        return;\n    }\n    metal::float3 _e14 = nodeSrc[index_5].position;\n    vPos = _e14;\n    uint _e20 = uniforms.frame_num;\n    float _e23 = random_xy(index_5, 0u + (3u * _e20));\n    vPos.x = (_e23 * 2.0) - 1.0;\n    uint _e32 = uniforms.frame_num;\n    float _e35 = random_xy(index_5, 1u + (3u * _e32));\n    vPos.y = (_e35 * 2.0) - 1.0;\n    uint _e44 = uniforms.frame_num;\n    float _e47 = random_xy(index_5, 2u + (3u * _e44));\n    vPos.z = (_e47 * 2.0) - 1.0;\n    metal::float3 _e54 = vPos;\n    nodeSrc[index_5].position = _e54;\n    nodeSrc[index_5].force = metal::float3(0.0);\n    nodeSrc[index_5].prev_force = metal::float3(0.0);\n    metal::atomic_store_explicit(&nodeSrc[index_5].mass, 1u, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 0u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 1u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 2u], 0, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct cal_massInput {\n};\nkernel void cal_mass(\n  metal::uint3 global_invocation_id_1 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device type_8 const& edgeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::uint2 edge = {};\n    uint total_1 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8;\n    uint index_6 = global_invocation_id_1.x;\n    if (index_6 >= total_1) {\n        return;\n    }\n    metal::uint2 _e13 = edgeSrc[index_6];\n    edge = _e13;\n    uint source_node = edge.x;\n    uint target_node = edge.y;\n    uint _e24 = metal::atomic_fetch_add_explicit(&nodeSrc[source_node].mass, 1u, metal::memory_order_relaxed);\n    uint _e28 = metal::atomic_fetch_add_explicit(&nodeSrc[target_node].mass, 1u, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct cal_gravity_forceInput {\n};\nkernel void cal_gravity_force(\n  metal::uint3 global_invocation_id_2 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    float gravity_force = {};\n    uint total_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_7 = global_invocation_id_2.x;\n    if (index_7 >= total_2) {\n        return;\n    }\n    metal::float3 pos_3 = nodeSrc[index_7].position;\n    uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_7].mass, metal::memory_order_relaxed);\n    float mass = static_cast<float>(_e19);\n    if (true) {\n        gravity_force = 0.25 * mass;\n    } else {\n        if (((pos_3.x != 0.0) || (pos_3.y != 0.0)) || (pos_3.z != 0.0)) {\n            gravity_force = (0.25 * mass) * metal::rsqrt(metal::dot(pos_3, pos_3));\n        } else {\n            gravity_force = 0.0;\n        }\n    }\n    metal::float3 _e41 = nodeSrc[index_7].force;\n    nodeSrc[index_7].force = _e41 + (-pos_3 * 0.25);\n    return;\n}\n\n\nstruct attractive_forceInput {\n};\nkernel void attractive_force(\n  metal::uint3 global_invocation_id_3 [[thread_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, device type_8 const& edgeSrc [[user(fake0)]]\n, device type_9& springForceSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::uint2 edge_1 = {};\n    metal::float3 dir = {};\n    uint total_3 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8;\n    uint index_8 = global_invocation_id_3.x;\n    if (index_8 >= total_3) {\n        return;\n    }\n    metal::uint2 _e13 = edgeSrc[index_8];\n    edge_1 = _e13;\n    uint source_node_1 = edge_1.x;\n    uint target_node_1 = edge_1.y;\n    metal::float3 _e23 = nodeSrc[target_node_1].position;\n    metal::float3 _e26 = nodeSrc[source_node_1].position;\n    dir = _e23 - _e26;\n    metal::float3 _e29 = dir;\n    dir = _e29 * 0.009999999776482582;\n    float _e37 = dir.x;\n    atomic_add_f32_((source_node_1 * 3u) + 0u, _e37, springForceSrc, _buffer_sizes);\n    float _e43 = dir.y;\n    atomic_add_f32_((source_node_1 * 3u) + 1u, _e43, springForceSrc, _buffer_sizes);\n    float _e49 = dir.z;\n    atomic_add_f32_((source_node_1 * 3u) + 2u, _e49, springForceSrc, _buffer_sizes);\n    float _e55 = dir.x;\n    atomic_add_f32_((target_node_1 * 3u) + 0u, -_e55, springForceSrc, _buffer_sizes);\n    float _e62 = dir.y;\n    atomic_add_f32_((target_node_1 * 3u) + 1u, -_e62, springForceSrc, _buffer_sizes);\n    float _e69 = dir.z;\n    atomic_add_f32_((target_node_1 * 3u) + 2u, -_e69, springForceSrc, _buffer_sizes);\n    return;\n}\n\n\nstruct reduction_boundingInput {\n};\nkernel void reduction_bounding(\n  uint local_index [[thread_index_in_threadgroup]]\n, metal::uint3 global_id [[thread_position_in_grid]]\n, metal::uint3 group_id [[threadgroup_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, device type_10& bounding [[user(fake0)]]\n, threadgroup type_13& smin\n, threadgroup type_13& smax\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index = {};\n    uint s = {};\n    index = global_id.x;\n    uint total_4 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint _e16 = index;\n    if (_e16 >= total_4) {\n        index = total_4 - 1u;\n    }\n    uint _e21 = index;\n    metal::float3 _e24 = nodeSrc[_e21].position;\n    smin.inner[local_index] = _e24;\n    uint _e26 = index;\n    metal::float3 _e29 = nodeSrc[_e26].position;\n    smax.inner[local_index] = _e29;\n    metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n    s = 256u / 2u;\n    bool loop_init = true;\n    while(true) {\n        if (!loop_init) {\n            uint _e37 = s;\n            s = _e37 >> 1u;\n        }\n        loop_init = false;\n        uint _e34 = s;\n        if (_e34 > 0u) {\n        } else {\n            break;\n        }\n        uint _e40 = s;\n        if (local_index < _e40) {\n            uint _e42 = s;\n            uint k = local_index + _e42;\n            metal::float3 _e46 = smin.inner[local_index];\n            metal::float3 _e48 = smin.inner[k];\n            smin.inner[local_index] = metal::min(_e46, _e48);\n            metal::float3 _e52 = smax.inner[local_index];\n            metal::float3 _e54 = smax.inner[k];\n            smax.inner[local_index] = metal::max(_e52, _e54);\n        }\n        metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n    }\n    if (local_index == 0u) {\n        metal::float3 _e63 = smin.inner[0];\n        bounding[group_id.x].bound_min = _e63;\n        metal::float3 _e69 = smax.inner[0];\n        bounding[group_id.x].bound_max = _e69;\n        return;\n    } else {\n        return;\n    }\n}\n\n\nkernel void bounding_box(\n  device type_6 const& nodeSrc [[user(fake0)]]\n, device type_10& bounding [[user(fake0)]]\n, device BHTree& bhTree [[user(fake0)]]\n, device type_11& treeNode [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 bound_min_min = {};\n    metal::float3 bound_max_max = {};\n    uint i = 0u;\n    metal::float3 _e13 = bounding[0].bound_min;\n    bound_min_min = _e13;\n    metal::float3 _e18 = bounding[0].bound_max;\n    bound_max_max = _e18;\n    uint node_group_count = static_cast<uint>(metal::ceil(static_cast<float>(1 + (_buffer_sizes.size1 - 0 - 48) / 48) / 256.0));\n    bool loop_init_1 = true;\n    while(true) {\n        if (!loop_init_1) {\n            uint _e30 = i;\n            i = _e30 + 1u;\n        }\n        loop_init_1 = false;\n        uint _e28 = i;\n        if (_e28 < node_group_count) {\n        } else {\n            break;\n        }\n        metal::float3 _e33 = bound_min_min;\n        uint _e34 = i;\n        metal::float3 _e37 = bounding[_e34].bound_min;\n        bound_min_min = metal::min(_e33, _e37);\n        metal::float3 _e39 = bound_max_max;\n        uint _e40 = i;\n        metal::float3 _e43 = bounding[_e40].bound_max;\n        bound_max_max = metal::max(_e39, _e43);\n    }\n    metal::float3 _e48 = bound_min_min;\n    bounding[0].bound_min = _e48;\n    metal::float3 _e52 = bound_max_max;\n    bounding[0].bound_max = _e52;\n    metal::float3 _e53 = bound_max_max;\n    metal::float3 _e54 = bound_min_min;\n    metal::float3 box = _e53 - _e54;\n    uint tree_node_count = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    bhTree.radius = metal::max(metal::max(box.x, box.y), box.z) * 0.5;\n    metal::atomic_store_explicit(&bhTree.bottom, tree_node_count, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&bhTree.max_depth, 0u, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&treeNode[tree_node_count].mass, -1, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&treeNode[tree_node_count].start, 0, metal::memory_order_relaxed);\n    metal::float3 _e78 = bound_min_min;\n    metal::float3 _e79 = bound_max_max;\n    treeNode[tree_node_count].position = (_e78 + _e79) * 0.5;\n    treeNode[tree_node_count].count = -1;\n    treeNode[tree_node_count].sort = 0;\n    return;\n}\n\n\nstruct clear_1_Input {\n};\nkernel void clear_1_(\n  metal::uint3 global_invocation_id_4 [[thread_position_in_grid]]\n, device type_11 const& treeNode [[user(fake0)]]\n, device type_9& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint i_1 = 0u;\n    uint total_5 = 1 + (_buffer_sizes.size6 - 0 - 32) / 32;\n    uint index_9 = global_invocation_id_4.x;\n    if (index_9 >= total_5) {\n        return;\n    }\n    bool loop_init_2 = true;\n    while(true) {\n        if (!loop_init_2) {\n            uint _e19 = i_1;\n            i_1 = _e19 + 1u;\n        }\n        loop_init_2 = false;\n        uint _e16 = i_1;\n        if (_e16 < 8u) {\n        } else {\n            break;\n        }\n        uint _e24 = i_1;\n        metal::atomic_store_explicit(&treeChild[(index_9 * 8u) + _e24], -1, metal::memory_order_relaxed);\n    }\n    return;\n}\n\n\nstruct tree_buildingInput {\n};\nkernel void tree_building(\n  metal::uint3 global_invocation_id_5 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device BHTree& bhTree [[user(fake0)]]\n, device type_11 const& treeNode [[user(fake0)]]\n, device type_9& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index_1 = {};\n    int skip = 1;\n    metal::float3 pos = {};\n    metal::float3 dp = {};\n    metal::float3 rdp = {};\n    uint n = {};\n    uint depth = 1u;\n    uint local_max_depth = 1u;\n    uint j = 0u;\n    float root_r = {};\n    float r = {};\n    int limit = 10000;\n    int ch = {};\n    int locked_ch = {};\n    int v = {};\n    int v_1 = {};\n    index_1 = global_invocation_id_5.x;\n    uint node_count = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint tree_node_count_1 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    metal::float3 root_pos = treeNode[tree_node_count_1].position;\n    uint inc = metal::min(node_count, 16384u);\n    n = tree_node_count_1;\n    float _e35 = bhTree.radius;\n    root_r = _e35;\n    float _e37 = root_r;\n    r = _e37 * 0.5;\n    while(true) {\n        uint _e43 = index_1;\n        if (_e43 < node_count) {\n        } else {\n            break;\n        }\n        int _e45 = limit;\n        limit = _e45 - 1;\n        int _e48 = limit;\n        if (_e48 < 0) {\n            return;\n        }\n        int _e51 = skip;\n        if (_e51 != 0) {\n            skip = 0;\n            uint _e55 = index_1;\n            metal::float3 _e58 = nodeSrc[_e55].position;\n            pos = _e58;\n            n = tree_node_count_1;\n            float _e59 = root_r;\n            r = _e59 * 0.5;\n            depth = 1u;\n            metal::float3 _e63 = pos;\n            metal::float3 compare = metal::step(root_pos, _e63);\n            j = (static_cast<uint>(compare.x) << 0u) | ((static_cast<uint>(compare.y) << 1u) + (static_cast<uint>(compare.z) << 2u));\n            float _e79 = r;\n            float _e82 = r;\n            dp = metal::float3(-_e79) + (compare * (2.0 * _e82));\n            metal::float3 _e87 = dp;\n            rdp = root_pos + _e87;\n        }\n        uint _e89 = n;\n        uint _e92 = j;\n        int _e95 = metal::atomic_load_explicit(&treeChild[(_e89 * 8u) + _e92], metal::memory_order_relaxed);\n        ch = _e95;\n        while(true) {\n            int _e97 = ch;\n            if (_e97 >= static_cast<int>(node_count)) {\n            } else {\n                break;\n            }\n            int _e100 = ch;\n            n = static_cast<uint>(_e100);\n            uint _e102 = depth;\n            depth = _e102 + 1u;\n            float _e105 = r;\n            r = _e105 * 0.5;\n            metal::float3 _e108 = rdp;\n            metal::float3 _e109 = pos;\n            metal::float3 compare_1 = metal::step(_e108, _e109);\n            j = (static_cast<uint>(compare_1.x) << 0u) | ((static_cast<uint>(compare_1.y) << 1u) + (static_cast<uint>(compare_1.z) << 2u));\n            float _e125 = r;\n            float _e128 = r;\n            dp = metal::float3(-_e125) + (compare_1 * (2.0 * _e128));\n            metal::float3 _e133 = rdp;\n            metal::float3 _e134 = dp;\n            rdp = _e133 + _e134;\n            uint _e136 = n;\n            uint _e139 = j;\n            int _e142 = metal::atomic_load_explicit(&treeChild[(_e136 * 8u) + _e139], metal::memory_order_relaxed);\n            ch = _e142;\n        }\n        uint _e143 = n;\n        uint _e146 = j;\n        uint locked = (_e143 * 8u) + _e146;\n        locked_ch = -1;\n        int _e150 = ch;\n        if (_e150 != -2) {\n            int _e153 = ch;\n            if (_e153 == -1) {\n                v = -1;\n                int _e159 = v;\n                uint _e160 = index_1;\n                metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e159, static_cast<int>(_e160), metal::memory_order_relaxed, metal::memory_order_relaxed);\n                if (_e159 == -1) {\n                    uint _e165 = depth;\n                    uint _e166 = local_max_depth;\n                    local_max_depth = metal::max(_e165, _e166);\n                    uint _e168 = index_1;\n                    index_1 = _e168 + inc;\n                    skip = 1;\n                } else {\n                    skip = 0;\n                }\n            } else {\n                int _e172 = ch;\n                v_1 = _e172;\n                int _e175 = v_1;\n                metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e175, -2, metal::memory_order_relaxed, metal::memory_order_relaxed);\n                int _e178 = ch;\n                if (_e178 == _e175) {\n                    int _e180 = ch;\n                    metal::float3 _e183 = nodeSrc[_e180].position;\n                    metal::float3 _e184 = pos;\n                    if (metal::all(_e183 == _e184)) {\n                        uint _e187 = index_1;\n                        metal::float3 _e190 = nodeSrc[_e187].position;\n                        nodeSrc[_e187].position = _e190 + metal::float3(0.10000000149011612, -0.05000000074505806, 0.10000000149011612);\n                        skip = 0;\n                        int _e198 = ch;\n                        metal::atomic_store_explicit(&treeChild[locked], _e198, metal::memory_order_relaxed);\n                        break;\n                    }\n                    locked_ch = -1;\n                    while(true) {\n                        uint _e202 = metal::atomic_fetch_sub_explicit(&bhTree.bottom, 1u, metal::memory_order_relaxed);\n                        uint cell = _e202 - 1u;\n                        if (cell <= node_count) {\n                            return;\n                        }\n                        int _e206 = locked_ch;\n                        if (_e206 != -1) {\n                            uint _e209 = n;\n                            uint _e212 = j;\n                            metal::atomic_store_explicit(&treeChild[(_e209 * 8u) + _e212], static_cast<int>(cell), metal::memory_order_relaxed);\n                        }\n                        int _e216 = locked_ch;\n                        locked_ch = metal::max(_e216, static_cast<int>(cell));\n                        uint _e219 = depth;\n                        depth = _e219 + 1u;\n                        n = cell;\n                        float _e222 = r;\n                        r = _e222 * 0.5;\n                        metal::float3 _e225 = rdp;\n                        int _e226 = ch;\n                        metal::float3 _e229 = nodeSrc[_e226].position;\n                        metal::float3 compare_2 = metal::step(_e225, _e229);\n                        j = (static_cast<uint>(compare_2.x) << 0u) | ((static_cast<uint>(compare_2.y) << 1u) + (static_cast<uint>(compare_2.z) << 2u));\n                        uint _e247 = j;\n                        int _e250 = ch;\n                        metal::atomic_store_explicit(&treeChild[(cell * 8u) + _e247], _e250, metal::memory_order_relaxed);\n                        metal::float3 _e251 = rdp;\n                        metal::float3 _e252 = pos;\n                        metal::float3 compare_3 = metal::step(_e251, _e252);\n                        j = (static_cast<uint>(compare_3.x) << 0u) | ((static_cast<uint>(compare_3.y) << 1u) + (static_cast<uint>(compare_3.z) << 2u));\n                        float _e268 = r;\n                        float _e271 = r;\n                        dp = metal::float3(-_e268) + (compare_3 * (2.0 * _e271));\n                        metal::float3 _e276 = rdp;\n                        metal::float3 _e277 = dp;\n                        rdp = _e276 + _e277;\n                        uint _e279 = n;\n                        uint _e282 = j;\n                        int _e285 = metal::atomic_load_explicit(&treeChild[(_e279 * 8u) + _e282], metal::memory_order_relaxed);\n                        ch = _e285;\n                        int _e286 = ch;\n                        if (_e286 < 0) {\n                            break;\n                        }\n                    }\n                    uint _e289 = n;\n                    uint _e292 = j;\n                    uint _e295 = index_1;\n                    metal::atomic_store_explicit(&treeChild[(_e289 * 8u) + _e292], static_cast<int>(_e295), metal::memory_order_relaxed);\n                    uint _e297 = depth;\n                    uint _e298 = local_max_depth;\n                    local_max_depth = metal::max(_e297, _e298);\n                    uint _e300 = index_1;\n                    index_1 = _e300 + inc;\n                    skip = 2;\n                }\n            }\n        }\n        metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n        int _e303 = skip;\n        if (_e303 == 2) {\n            int _e307 = locked_ch;\n            metal::atomic_store_explicit(&treeChild[locked], _e307, metal::memory_order_relaxed);\n        }\n    }\n    uint _e309 = local_max_depth;\n    uint _e310 = metal::atomic_fetch_max_explicit(&bhTree.max_depth, _e309, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct clear_2_Input {\n};\nkernel void clear_2_(\n  metal::uint3 global_invocation_id_6 [[thread_position_in_grid]]\n, device type_11& treeNode [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint total_6 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint index_10 = global_invocation_id_6.x;\n    if (index_10 >= total_6) {\n        return;\n    }\n    treeNode[index_10].position = metal::float3(0.0);\n    treeNode[index_10].count = -1;\n    treeNode[index_10].sort = 0;\n    metal::atomic_store_explicit(&treeNode[index_10].start, -1, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&treeNode[index_10].mass, -1, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct summarizationInput {\n};\nkernel void summarization(\n  metal::uint3 global_invocation_id_7 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device BHTree const& bhTree [[user(fake0)]]\n, device type_11& treeNode [[user(fake0)]]\n, device type_9 const& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index_2 = {};\n    int cm = 0;\n    type_14 schild = {};\n    type_15 smass = {};\n    int j_1 = 0;\n    uint ch_1 = {};\n    uint i_2 = {};\n    metal::float3 pos_1 = {};\n    int cnt = {};\n    int j_2 = 0;\n    bool flag = false;\n    uint i_3 = {};\n    uint i_4 = {};\n    metal::float3 pos_2 = {};\n    int cnt_1 = {};\n    uint i_5 = {};\n    uint bottom = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed);\n    uint tree_node_count_2 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint node_count_1 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint inc_1 = metal::min(node_count_1, 16384u);\n    index_2 = static_cast<uint>((static_cast<int>(bottom) & -32) + static_cast<int>(global_invocation_id_7.x));\n    uint _e27 = index_2;\n    if (_e27 < bottom) {\n        uint _e29 = index_2;\n        index_2 = _e29 + inc_1;\n    }\n    uint restart = index_2;\n    bool loop_init_3 = true;\n    while(true) {\n        if (!loop_init_3) {\n            int _e41 = j_1;\n            j_1 = _e41 + 1;\n        }\n        loop_init_3 = false;\n        int _e38 = j_1;\n        if (_e38 < 5) {\n        } else {\n            break;\n        }\n        while(true) {\n            uint _e44 = index_2;\n            if (_e44 <= tree_node_count_2) {\n            } else {\n                break;\n            }\n            uint _e46 = index_2;\n            int _e49 = metal::atomic_load_explicit(&treeNode[_e46].mass, metal::memory_order_relaxed);\n            if (_e49 < 0) {\n                ch_1 = 0u;\n                i_2 = 0u;\n                i_2 = 0u;\n                bool loop_init_4 = true;\n                while(true) {\n                    if (!loop_init_4) {\n                        uint _e60 = i_2;\n                        i_2 = _e60 + 1u;\n                    }\n                    loop_init_4 = false;\n                    uint _e57 = i_2;\n                    if (_e57 < 8u) {\n                    } else {\n                        break;\n                    }\n                    uint _e63 = index_2;\n                    uint _e66 = i_2;\n                    int _e69 = metal::atomic_load_explicit(&treeChild[(_e63 * 8u) + _e66], metal::memory_order_relaxed);\n                    ch_1 = static_cast<uint>(_e69);\n                    uint _e71 = i_2;\n                    uint _e73 = ch_1;\n                    schild.inner[_e71] = _e73;\n                    uint _e74 = i_2;\n                    uint _e76 = ch_1;\n                    int _e79 = metal::atomic_load_explicit(&treeNode[_e76].mass, metal::memory_order_relaxed);\n                    smass.inner[_e74] = _e79;\n                    uint _e80 = ch_1;\n                    uint _e82 = i_2;\n                    int _e84 = smass.inner[_e82];\n                    if ((_e80 >= node_count_1) && (_e84 < 0)) {\n                        break;\n                    }\n                }\n                uint _e88 = i_2;\n                if (_e88 == 8u) {\n                    pos_1 = metal::float3(0.0);\n                    cnt = 0;\n                    i_2 = 0u;\n                    bool loop_init_5 = true;\n                    while(true) {\n                        if (!loop_init_5) {\n                            uint _e100 = i_2;\n                            i_2 = _e100 + 1u;\n                        }\n                        loop_init_5 = false;\n                        uint _e97 = i_2;\n                        if (_e97 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e103 = i_2;\n                        uint _e105 = schild.inner[_e103];\n                        ch_1 = _e105;\n                        uint _e106 = ch_1;\n                        if (_e106 >= node_count_1) {\n                            uint _e108 = i_2;\n                            int m = smass.inner[_e108];\n                            int _e111 = cnt;\n                            uint _e112 = ch_1;\n                            int _e115 = treeNode[_e112].count;\n                            cnt = _e111 + _e115;\n                            metal::float3 _e117 = pos_1;\n                            uint _e118 = ch_1;\n                            metal::float3 _e121 = treeNode[_e118].position;\n                            pos_1 = _e117 + (_e121 * static_cast<float>(m));\n                            int _e125 = cm;\n                            cm = _e125 + m;\n                        } else {\n                            uint _e127 = ch_1;\n                            uint _e130 = metal::atomic_load_explicit(&nodeSrc[_e127].mass, metal::memory_order_relaxed);\n                            int m_1 = static_cast<int>(_e130);\n                            int _e132 = cnt;\n                            cnt = _e132 + 1;\n                            metal::float3 _e135 = pos_1;\n                            uint _e136 = ch_1;\n                            metal::float3 _e139 = nodeSrc[_e136].position;\n                            pos_1 = _e135 + (_e139 * static_cast<float>(m_1));\n                            int _e143 = cm;\n                            cm = _e143 + m_1;\n                        }\n                    }\n                    uint _e145 = index_2;\n                    int _e148 = cnt;\n                    treeNode[_e145].count = _e148;\n                    uint _e149 = index_2;\n                    metal::float3 _e152 = pos_1;\n                    int _e153 = cm;\n                    treeNode[_e149].position = _e152 / metal::float3(static_cast<float>(_e153));\n                    uint _e157 = index_2;\n                    int _e160 = cm;\n                    metal::atomic_store_explicit(&treeNode[_e157].mass, _e160, metal::memory_order_relaxed);\n                }\n            }\n            uint _e161 = index_2;\n            index_2 = _e161 + inc_1;\n        }\n        index_2 = restart;\n    }\n    while(true) {\n        uint _e167 = index_2;\n        if (_e167 <= tree_node_count_2) {\n        } else {\n            break;\n        }\n        uint _e169 = index_2;\n        uint _e173 = index_2;\n        uint _e175 = index_2;\n        int _e178 = metal::atomic_load_explicit(&treeNode[_e175].mass, metal::memory_order_relaxed);\n        if (_e169 < node_count_1) {\n            uint _e171 = index_2;\n            index_2 = _e171 + inc_1;\n        } else {\n            if ((_e173 >= node_count_1) && (_e178 >= 0)) {\n                uint _e182 = index_2;\n                index_2 = _e182 + inc_1;\n            } else {\n                int _e184 = j_2;\n                if (_e184 == 0) {\n                    j_2 = 8;\n                    i_3 = 0u;\n                    bool loop_init_6 = true;\n                    while(true) {\n                        if (!loop_init_6) {\n                            uint _e193 = i_3;\n                            i_3 = _e193 + 1u;\n                        }\n                        loop_init_6 = false;\n                        uint _e190 = i_3;\n                        if (_e190 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e196 = index_2;\n                        uint _e199 = i_3;\n                        int _e202 = metal::atomic_load_explicit(&treeChild[(_e196 * 8u) + _e199], metal::memory_order_relaxed);\n                        uint ch_2 = static_cast<uint>(_e202);\n                        uint _e204 = i_3;\n                        schild.inner[_e204] = ch_2;\n                        uint _e206 = i_3;\n                        int _e210 = metal::atomic_load_explicit(&treeNode[ch_2].mass, metal::memory_order_relaxed);\n                        smass.inner[_e206] = _e210;\n                        uint _e212 = i_3;\n                        int _e214 = smass.inner[_e212];\n                        if ((ch_2 < node_count_1) || (_e214 >= 0)) {\n                            int _e218 = j_2;\n                            j_2 = _e218 - 1;\n                        }\n                    }\n                } else {\n                    j_2 = 8;\n                    i_4 = 0u;\n                    bool loop_init_7 = true;\n                    while(true) {\n                        if (!loop_init_7) {\n                            uint _e227 = i_4;\n                            i_4 = _e227 + 1u;\n                        }\n                        loop_init_7 = false;\n                        uint _e224 = i_4;\n                        if (_e224 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e230 = i_4;\n                        uint ch_3 = schild.inner[_e230];\n                        uint _e233 = i_4;\n                        int old_mass = smass.inner[_e233];\n                        uint _e236 = i_4;\n                        int _e240 = metal::atomic_load_explicit(&treeNode[ch_3].mass, metal::memory_order_relaxed);\n                        smass.inner[_e236] = _e240;\n                        uint _e245 = i_4;\n                        int _e247 = smass.inner[_e245];\n                        if (((ch_3 < node_count_1) || (old_mass >= 0)) || (_e247 >= 0)) {\n                            int _e251 = j_2;\n                            j_2 = _e251 - 1;\n                        }\n                    }\n                }\n                int _e254 = j_2;\n                if (_e254 == 0) {\n                    cm = 0;\n                    pos_2 = metal::float3(0.0);\n                    cnt_1 = 0;\n                    i_5 = 0u;\n                    bool loop_init_8 = true;\n                    while(true) {\n                        if (!loop_init_8) {\n                            uint _e268 = i_5;\n                            i_5 = _e268 + 1u;\n                        }\n                        loop_init_8 = false;\n                        uint _e265 = i_5;\n                        if (_e265 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e271 = i_5;\n                        uint ch_4 = schild.inner[_e271];\n                        if (ch_4 >= node_count_1) {\n                            uint _e275 = i_5;\n                            int m_2 = smass.inner[_e275];\n                            int _e278 = cnt_1;\n                            int _e281 = treeNode[ch_4].count;\n                            cnt_1 = _e278 + _e281;\n                            metal::float3 _e283 = pos_2;\n                            metal::float3 _e286 = treeNode[ch_4].position;\n                            pos_2 = _e283 + (_e286 * static_cast<float>(m_2));\n                            int _e290 = cm;\n                            cm = _e290 + m_2;\n                        } else {\n                            uint _e294 = metal::atomic_load_explicit(&nodeSrc[ch_4].mass, metal::memory_order_relaxed);\n                            int m_3 = static_cast<int>(_e294);\n                            int _e296 = cnt_1;\n                            cnt_1 = _e296 + 1;\n                            metal::float3 _e299 = pos_2;\n                            metal::float3 _e302 = nodeSrc[ch_4].position;\n                            pos_2 = _e299 + (_e302 * static_cast<float>(m_3));\n                            int _e306 = cm;\n                            cm = _e306 + m_3;\n                        }\n                    }\n                    uint _e308 = index_2;\n                    int _e311 = cnt_1;\n                    treeNode[_e308].count = _e311;\n                    uint _e312 = index_2;\n                    metal::float3 _e315 = pos_2;\n                    int _e316 = cm;\n                    treeNode[_e312].position = _e315 / metal::float3(static_cast<float>(_e316));\n                    flag = true;\n                }\n            }\n        }\n        bool _e321 = flag;\n        if (_e321) {\n            uint _e322 = index_2;\n            if (_e322 < node_count_1) {\n                uint _e324 = index_2;\n                int _e327 = cm;\n                metal::atomic_store_explicit(&nodeSrc[_e324].mass, static_cast<uint>(_e327), metal::memory_order_relaxed);\n            } else {\n                uint _e329 = index_2;\n                int _e332 = cm;\n                metal::atomic_store_explicit(&treeNode[_e329].mass, _e332, metal::memory_order_relaxed);\n            }\n            uint _e333 = index_2;\n            index_2 = _e333 + inc_1;\n            flag = false;\n        }\n    }\n    return;\n}\n\n\nstruct sortInput {\n};\nkernel void sort(\n  metal::uint3 global_invocation_id_8 [[thread_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, device BHTree const& bhTree [[user(fake0)]]\n, device type_11& treeNode [[user(fake0)]]\n, device type_9& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index_3 = {};\n    int limit_1 = 1000;\n    int start = {};\n    uint j_3 = {};\n    uint i_6 = {};\n    uint tree_node_count_3 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint bottom_1 = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed);\n    uint node_count_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint inc_2 = metal::min(node_count_2, 16384u);\n    index_3 = ((tree_node_count_3 + 1u) - inc_2) + global_invocation_id_8.x;\n    while(true) {\n        uint _e27 = index_3;\n        if (_e27 >= bottom_1) {\n        } else {\n            break;\n        }\n        int _e29 = limit_1;\n        limit_1 = _e29 - 1;\n        int _e32 = limit_1;\n        if (_e32 < 0) {\n            uint _e35 = index_3;\n            metal::atomic_store_explicit(&treeChild[_e35], 1000, metal::memory_order_relaxed);\n            metal::atomic_store_explicit(&treeChild[0], 1000, metal::memory_order_relaxed);\n            return;\n        }\n        metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n        uint _e41 = index_3;\n        int _e44 = metal::atomic_load_explicit(&treeNode[_e41].start, metal::memory_order_relaxed);\n        start = _e44;\n        int _e46 = start;\n        if (_e46 >= 0) {\n            j_3 = 0u;\n            i_6 = 0u;\n            bool loop_init_9 = true;\n            while(true) {\n                if (!loop_init_9) {\n                    uint _e56 = i_6;\n                    i_6 = _e56 + 1u;\n                }\n                loop_init_9 = false;\n                uint _e53 = i_6;\n                if (_e53 < 8u) {\n                } else {\n                    break;\n                }\n                uint _e59 = index_3;\n                uint _e62 = i_6;\n                int ch_5 = metal::atomic_load_explicit(&treeChild[(_e59 * 8u) + _e62], metal::memory_order_relaxed);\n                if (ch_5 >= 0) {\n                    uint _e68 = i_6;\n                    uint _e69 = j_3;\n                    if (_e68 != _e69) {\n                        uint _e71 = index_3;\n                        uint _e74 = i_6;\n                        metal::atomic_store_explicit(&treeChild[(_e71 * 8u) + _e74], -1, metal::memory_order_relaxed);\n                        uint _e78 = index_3;\n                        uint _e81 = j_3;\n                        metal::atomic_store_explicit(&treeChild[(_e78 * 8u) + _e81], ch_5, metal::memory_order_relaxed);\n                    }\n                    uint _e84 = j_3;\n                    j_3 = _e84 + 1u;\n                    if (ch_5 >= static_cast<int>(node_count_2)) {\n                        int _e91 = start;\n                        metal::atomic_store_explicit(&treeNode[ch_5].start, _e91, metal::memory_order_relaxed);\n                        int _e92 = start;\n                        int _e95 = treeNode[ch_5].count;\n                        start = _e92 + _e95;\n                    } else {\n                        int _e97 = start;\n                        treeNode[_e97].sort = ch_5;\n                        int _e100 = start;\n                        start = _e100 + 1;\n                    }\n                }\n            }\n            uint _e103 = index_3;\n            if (_e103 < inc_2) {\n                break;\n            }\n            uint _e105 = index_3;\n            index_3 = _e105 - inc_2;\n        }\n    }\n    return;\n}\n\n\nstruct electron_forceInput {\n};\nkernel void electron_force(\n  metal::uint3 global_invocation_id_9 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device BHTree const& bhTree [[user(fake0)]]\n, device type_11 const& treeNode [[user(fake0)]]\n, device type_9 const& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    type_17 spos = {};\n    type_17 snode = {};\n    type_18 sdq = {};\n    uint j_4 = 1u;\n    uint index_4 = {};\n    metal::float3 af = {};\n    uint depth_1 = {};\n    uint pd = {};\n    uint nd = {};\n    metal::float3 dp_1 = {};\n    uint tree_node_count_4 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint node_count_3 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint inc_3 = metal::min(node_count_3, 16384u);\n    float epssq = 0.05000000074505806 * 0.05000000074505806;\n    float _e26 = bhTree.radius;\n    float diameter = _e26 * 2.0;\n    uint max_depth = metal::atomic_load_explicit(&bhTree.max_depth, metal::memory_order_relaxed);\n    sdq.inner[0] = (diameter * diameter) * 1.0;\n    bool loop_init_10 = true;\n    while(true) {\n        if (!loop_init_10) {\n            uint _e39 = j_4;\n            j_4 = _e39 + 1u;\n        }\n        loop_init_10 = false;\n        uint _e37 = j_4;\n        if (_e37 < max_depth) {\n        } else {\n            break;\n        }\n        uint _e42 = j_4;\n        uint _e44 = j_4;\n        float _e48 = sdq.inner[_e44 - 1u];\n        sdq.inner[_e42] = _e48 * 0.25;\n        uint _e51 = j_4;\n        float _e55 = sdq.inner[_e51 - 1u];\n        sdq.inner[_e51 - 1u] = _e55 + epssq;\n    }\n    float _e60 = sdq.inner[max_depth - 1u];\n    sdq.inner[max_depth - 1u] = _e60 + epssq;\n    if (max_depth < 48u) {\n        index_4 = global_invocation_id_9.x;\n        bool loop_init_11 = true;\n        while(true) {\n            if (!loop_init_11) {\n                uint _e68 = index_4;\n                index_4 = _e68 + inc_3;\n            }\n            loop_init_11 = false;\n            uint _e66 = index_4;\n            if (_e66 < node_count_3) {\n            } else {\n                break;\n            }\n            uint _e70 = index_4;\n            int order = treeNode[_e70].sort;\n            metal::float3 pos_4 = nodeSrc[order].position;\n            af = metal::float3(0.0);\n            depth_1 = 0u;\n            spos.inner[0] = 0u;\n            snode.inner[0] = tree_node_count_4;\n            while(true) {\n                uint _e87 = depth_1;\n                uint _e89 = spos.inner[_e87];\n                pd = _e89;\n                uint _e91 = depth_1;\n                uint _e93 = snode.inner[_e91];\n                nd = _e93;\n                while(true) {\n                    uint _e95 = pd;\n                    if (_e95 < 8u) {\n                    } else {\n                        break;\n                    }\n                    uint _e98 = nd;\n                    uint _e101 = pd;\n                    int n_i32_ = metal::atomic_load_explicit(&treeChild[(_e98 * 8u) + _e101], metal::memory_order_relaxed);\n                    uint _e105 = pd;\n                    pd = _e105 + 1u;\n                    if (n_i32_ >= 0) {\n                        uint n_1 = static_cast<uint>(n_i32_);\n                        if (n_1 < node_count_3) {\n                            metal::float3 _e115 = nodeSrc[n_1].position;\n                            dp_1 = pos_4 - _e115;\n                        } else {\n                            metal::float3 _e119 = treeNode[n_1].position;\n                            dp_1 = pos_4 - _e119;\n                        }\n                        metal::float3 _e121 = dp_1;\n                        metal::float3 _e122 = dp_1;\n                        float dist2_ = metal::dot(_e121, _e122);\n                        if (n_1 < node_count_3) {\n                            if (dist2_ > 0.0) {\n                                uint _e129 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed);\n                                uint _e134 = metal::atomic_load_explicit(&nodeSrc[n_1].mass, metal::memory_order_relaxed);\n                                float factor = ((0.0003000000142492354 * static_cast<float>(_e129)) * static_cast<float>(_e134)) / dist2_;\n                                metal::float3 _e138 = af;\n                                metal::float3 _e139 = dp_1;\n                                af = _e138 + (_e139 * factor);\n                            }\n                        } else {\n                            uint _e142 = depth_1;\n                            float _e144 = sdq.inner[_e142];\n                            if (dist2_ >= _e144) {\n                                if (dist2_ > 0.0) {\n                                    uint _e150 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed);\n                                    int _e155 = metal::atomic_load_explicit(&treeNode[n_1].mass, metal::memory_order_relaxed);\n                                    float factor_1 = ((0.0003000000142492354 * static_cast<float>(_e150)) * static_cast<float>(_e155)) / dist2_;\n                                    metal::float3 _e159 = af;\n                                    metal::float3 _e160 = dp_1;\n                                    af = _e159 + (_e160 * factor_1);\n                                }\n                            } else {\n                                uint _e163 = depth_1;\n                                uint _e165 = pd;\n                                spos.inner[_e163] = _e165;\n                                uint _e166 = depth_1;\n                                uint _e168 = nd;\n                                snode.inner[_e166] = _e168;\n                                uint _e169 = depth_1;\n                                depth_1 = _e169 + 1u;\n                                pd = 0u;\n                                nd = n_1;\n                            }\n                        }\n                    } else {\n                        pd = 8u;\n                    }\n                }\n                uint _e174 = depth_1;\n                if (_e174 == 0u) {\n                    break;\n                }\n                uint _e177 = depth_1;\n                depth_1 = _e177 - 1u;\n            }\n            metal::float3 _e182 = nodeSrc[order].force;\n            metal::float3 _e183 = af;\n            nodeSrc[order].force = _e182 + (_e183 * 0.10000000149011612);\n        }\n        return;\n    } else {\n        return;\n    }\n}\n\n\nstruct main_Input {\n};\nkernel void main_(\n  metal::uint3 global_invocation_id_10 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device type_9& springForceSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 spring_force = {};\n    uint total_7 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_11 = global_invocation_id_10.x;\n    if (index_11 >= total_7) {\n        return;\n    }\n    metal::float3 vPos_3 = nodeSrc[index_11].position;\n    uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_11].mass, metal::memory_order_relaxed);\n    float mass_1 = static_cast<float>(_e19);\n    spring_force = metal::float3(0.0);\n    int _e31 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 0u], metal::memory_order_relaxed);\n    spring_force.x = as_type<float>(_e31);\n    int _e39 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 1u], metal::memory_order_relaxed);\n    spring_force.y = as_type<float>(_e39);\n    int _e47 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 2u], metal::memory_order_relaxed);\n    spring_force.z = as_type<float>(_e47);\n    metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 0u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 1u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 2u], 0, metal::memory_order_relaxed);\n    metal::float3 _e67 = spring_force;\n    spring_force = _e67 * 100.0;\n    metal::float3 _e72 = nodeSrc[index_11].force;\n    metal::float3 _e73 = spring_force;\n    nodeSrc[index_11].force = _e72 + _e73;\n    return;\n}\n\n\nstruct displacementInput {\n};\nkernel void displacement(\n  metal::uint3 global_invocation_id_11 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint total_8 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_12 = global_invocation_id_11.x;\n    if (index_12 >= total_8) {\n        return;\n    }\n    metal::float3 _e17 = nodeSrc[index_12].force;\n    metal::float3 _e20 = nodeSrc[index_12].prev_force;\n    metal::float3 d_force = _e17 - _e20;\n    float swg = metal::sqrt(metal::dot(d_force, d_force));\n    uint _e31 = metal::atomic_load_explicit(&nodeSrc[index_12].mass, metal::memory_order_relaxed);\n    float factor_2 = (1.0 / (1.0 + metal::sqrt(1.0 * swg))) / static_cast<float>(_e31);\n    metal::float3 force = nodeSrc[index_12].force;\n    nodeSrc[index_12].force = metal::float3(0.0);\n    nodeSrc[index_12].prev_force = force;\n    metal::float3 _e45 = nodeSrc[index_12].position;\n    nodeSrc[index_12].position = _e45 + ((force * factor_2) * 0.009999999776482582);\n    return;\n}\n\n\nstruct randomizeInput {\n};\nkernel void randomize(\n  metal::uint3 global_invocation_id_12 [[thread_position_in_grid]]\n, constant Uniforms& uniforms [[user(fake0)]]\n, device type_6& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 vPos_1 = {};\n    uint total_9 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_13 = global_invocation_id_12.x;\n    if (index_13 >= total_9) {\n        return;\n    }\n    metal::float3 _e16 = nodeSrc[index_13].position;\n    vPos_1 = _e16;\n    uint _e22 = uniforms.frame_num;\n    float _e25 = random_xy(index_13, 0u + (3u * _e22));\n    vPos_1.x = (_e25 * 2.0) - 1.0;\n    uint _e34 = uniforms.frame_num;\n    float _e37 = random_xy(index_13, 1u + (3u * _e34));\n    vPos_1.y = (_e37 * 2.0) - 1.0;\n    uint _e46 = uniforms.frame_num;\n    float _e49 = random_xy(index_13, 2u + (3u * _e46));\n    vPos_1.z = (_e49 * 2.0) - 1.0;\n    metal::float3 _e56 = vPos_1;\n    nodeSrc[index_13].position = _e56;\n    nodeSrc[index_13].force = metal::float3(0.0);\n    nodeSrc[index_13].prev_force = metal::float3(0.0);\n    return;\n}\n\n\nstruct copyInput {\n};\nkernel void copy(\n  metal::uint3 global_invocation_id_13 [[thread_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 vPos_2 = {};\n    uint total_10 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_14 = global_invocation_id_13.x;\n    if (index_14 >= total_10) {\n        return;\n    }\n    metal::float3 _e16 = nodeSrc[index_14].position;\n    vPos_2 = _e16;\n    return;\n}\n"
  },
  {
    "path": "lib/naga/benches/criterion.rs",
    "content": "use criterion::*;\r\nuse std::{fs, path::PathBuf, slice};\r\n\r\nfn gather_inputs(folder: &str, extension: &str) -> Vec<Box<[u8]>> {\r\n    let mut list = Vec::new();\r\n    let read_dir = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"))\r\n        .join(folder)\r\n        .read_dir()\r\n        .unwrap();\r\n    for file_entry in read_dir {\r\n        match file_entry {\r\n            Ok(entry) => match entry.path().extension() {\r\n                Some(ostr) if &*ostr == extension => {\r\n                    let input = fs::read(entry.path()).unwrap_or_default();\r\n                    list.push(input.into_boxed_slice());\r\n                }\r\n                _ => continue,\r\n            },\r\n            Err(e) => {\r\n                log::warn!(\"Skipping file: {:?}\", e);\r\n                continue;\r\n            }\r\n        }\r\n    }\r\n    list\r\n}\r\n\r\nfn parse_glsl(stage: naga::ShaderStage, inputs: &[Box<[u8]>]) {\r\n    let mut parser = naga::front::glsl::Parser::default();\r\n    let options = naga::front::glsl::Options {\r\n        stage,\r\n        defines: Default::default(),\r\n    };\r\n    for input in inputs.iter() {\r\n        let string = std::str::from_utf8(input).unwrap();\r\n        parser.parse(&options, string).unwrap();\r\n    }\r\n}\r\n\r\nfn frontends(c: &mut Criterion) {\r\n    let mut group = c.benchmark_group(\"front\");\r\n    #[cfg(all(feature = \"wgsl-in\", feature = \"serialize\", feature = \"deserialize\"))]\r\n    group.bench_function(\"bin\", |b| {\r\n        let inputs_wgsl = gather_inputs(\"tests/in\", \"wgsl\");\r\n        let mut parser = naga::front::wgsl::Parser::new();\r\n        let inputs_bin = inputs_wgsl\r\n            .iter()\r\n            .map(|input| {\r\n                let string = std::str::from_utf8(input).unwrap();\r\n                let module = parser.parse(string).unwrap();\r\n                bincode::serialize(&module).unwrap()\r\n            })\r\n            .collect::<Vec<_>>();\r\n        b.iter(move || {\r\n            for input in inputs_bin.iter() {\r\n                bincode::deserialize::<naga::Module>(input).unwrap();\r\n            }\r\n        });\r\n    });\r\n    #[cfg(feature = \"wgsl-in\")]\r\n    group.bench_function(\"wgsl\", |b| {\r\n        let inputs_wgsl = gather_inputs(\"tests/in\", \"wgsl\");\r\n        let inputs = inputs_wgsl\r\n            .iter()\r\n            .map(|input| std::str::from_utf8(input).unwrap())\r\n            .collect::<Vec<_>>();\r\n        let mut parser = naga::front::wgsl::Parser::new();\r\n        b.iter(move || {\r\n            for &input in inputs.iter() {\r\n                parser.parse(input).unwrap();\r\n            }\r\n        });\r\n    });\r\n    #[cfg(feature = \"spv-in\")]\r\n    group.bench_function(\"spv\", |b| {\r\n        let inputs = gather_inputs(\"tests/in/spv\", \"spv\");\r\n        b.iter(move || {\r\n            let options = naga::front::spv::Options::default();\r\n            for input in inputs.iter() {\r\n                let spv =\r\n                    unsafe { slice::from_raw_parts(input.as_ptr() as *const u32, input.len() / 4) };\r\n                let parser = naga::front::spv::Parser::new(spv.iter().cloned(), &options);\r\n                parser.parse().unwrap();\r\n            }\r\n        });\r\n    });\r\n    #[cfg(feature = \"glsl-in\")]\r\n    group.bench_function(\"glsl\", |b| {\r\n        let vert = gather_inputs(\"tests/in/glsl\", \"vert\");\r\n        b.iter(move || parse_glsl(naga::ShaderStage::Vertex, &vert));\r\n        let frag = gather_inputs(\"tests/in/glsl\", \"frag\");\r\n        b.iter(move || parse_glsl(naga::ShaderStage::Vertex, &frag));\r\n        //TODO: hangs for some reason!\r\n        //let comp = gather_inputs(\"tests/in/glsl\", \"comp\");\r\n        //b.iter(move || parse_glsl(naga::ShaderStage::Compute, &comp));\r\n    });\r\n}\r\n\r\n#[cfg(feature = \"wgsl-in\")]\r\nfn gather_modules() -> Vec<naga::Module> {\r\n    let inputs = gather_inputs(\"tests/in\", \"wgsl\");\r\n    let mut parser = naga::front::wgsl::Parser::new();\r\n    inputs\r\n        .iter()\r\n        .map(|input| {\r\n            let string = std::str::from_utf8(input).unwrap();\r\n            parser.parse(string).unwrap()\r\n        })\r\n        .collect()\r\n}\r\n#[cfg(not(feature = \"wgsl-in\"))]\r\nfn gather_modules() -> Vec<naga::Module> {\r\n    Vec::new()\r\n}\r\n\r\nfn validation(c: &mut Criterion) {\r\n    let inputs = gather_modules();\r\n    let mut group = c.benchmark_group(\"valid\");\r\n    #[cfg(feature = \"validate\")]\r\n    group.bench_function(\"safe\", |b| {\r\n        let mut validator = naga::valid::Validator::new(\r\n            naga::valid::ValidationFlags::all(),\r\n            naga::valid::Capabilities::all(),\r\n        );\r\n        b.iter(|| {\r\n            for input in inputs.iter() {\r\n                validator.validate(input).unwrap();\r\n            }\r\n        });\r\n    });\r\n    #[cfg(feature = \"validate\")]\r\n    group.bench_function(\"unsafe\", |b| {\r\n        let mut validator = naga::valid::Validator::new(\r\n            naga::valid::ValidationFlags::empty(),\r\n            naga::valid::Capabilities::all(),\r\n        );\r\n        b.iter(|| {\r\n            for input in inputs.iter() {\r\n                validator.validate(input).unwrap();\r\n            }\r\n        });\r\n    });\r\n}\r\n\r\nfn backends(c: &mut Criterion) {\r\n    #[cfg(feature = \"validate\")]\r\n    let inputs = {\r\n        let mut validator = naga::valid::Validator::new(\r\n            naga::valid::ValidationFlags::empty(),\r\n            naga::valid::Capabilities::empty(),\r\n        );\r\n        let input_modules = gather_modules();\r\n        input_modules\r\n            .into_iter()\r\n            .flat_map(|module| validator.validate(&module).ok().map(|info| (module, info)))\r\n            .collect::<Vec<_>>()\r\n    };\r\n    #[cfg(not(feature = \"validate\"))]\r\n    let inputs = Vec::<(naga::Module, naga::valid::ModuleInfo)>::new();\r\n\r\n    let mut group = c.benchmark_group(\"back\");\r\n    #[cfg(feature = \"wgsl-out\")]\r\n    group.bench_function(\"wgsl\", |b| {\r\n        b.iter(|| {\r\n            let mut string = String::new();\r\n            let flags = naga::back::wgsl::WriterFlags::empty();\r\n            for &(ref module, ref info) in inputs.iter() {\r\n                let mut writer = naga::back::wgsl::Writer::new(&mut string, flags);\r\n                writer.write(module, info).unwrap();\r\n                string.clear();\r\n            }\r\n        });\r\n    });\r\n\r\n    #[cfg(feature = \"spv-out\")]\r\n    group.bench_function(\"spv\", |b| {\r\n        b.iter(|| {\r\n            let mut data = Vec::new();\r\n            let options = naga::back::spv::Options::default();\r\n            for &(ref module, ref info) in inputs.iter() {\r\n                let mut writer = naga::back::spv::Writer::new(&options).unwrap();\r\n                writer.write(module, info, None, &mut data).unwrap();\r\n                data.clear();\r\n            }\r\n        });\r\n    });\r\n    #[cfg(feature = \"spv-out\")]\r\n    group.bench_function(\"spv-separate\", |b| {\r\n        b.iter(|| {\r\n            let mut data = Vec::new();\r\n            let options = naga::back::spv::Options::default();\r\n            for &(ref module, ref info) in inputs.iter() {\r\n                let mut writer = naga::back::spv::Writer::new(&options).unwrap();\r\n                for ep in module.entry_points.iter() {\r\n                    let pipeline_options = naga::back::spv::PipelineOptions {\r\n                        shader_stage: ep.stage,\r\n                        entry_point: ep.name.clone(),\r\n                    };\r\n                    writer\r\n                        .write(module, info, Some(&pipeline_options), &mut data)\r\n                        .unwrap();\r\n                    data.clear();\r\n                }\r\n            }\r\n        });\r\n    });\r\n\r\n    #[cfg(feature = \"msl-out\")]\r\n    group.bench_function(\"msl\", |b| {\r\n        b.iter(|| {\r\n            let mut string = String::new();\r\n            let options = naga::back::msl::Options::default();\r\n            for &(ref module, ref info) in inputs.iter() {\r\n                let pipeline_options = naga::back::msl::PipelineOptions::default();\r\n                let mut writer = naga::back::msl::Writer::new(&mut string);\r\n                writer\r\n                    .write(module, info, &options, &pipeline_options)\r\n                    .unwrap();\r\n                string.clear();\r\n            }\r\n        });\r\n    });\r\n\r\n    #[cfg(feature = \"hlsl-out\")]\r\n    group.bench_function(\"hlsl\", |b| {\r\n        b.iter(|| {\r\n            let options = naga::back::hlsl::Options::default();\r\n            let mut string = String::new();\r\n            for &(ref module, ref info) in inputs.iter() {\r\n                let mut writer = naga::back::hlsl::Writer::new(&mut string, &options);\r\n                let _ = writer.write(module, info); // may fail on unimplemented things\r\n                string.clear();\r\n            }\r\n        });\r\n    });\r\n\r\n    #[cfg(feature = \"glsl-out\")]\r\n    group.bench_function(\"glsl-separate\", |b| {\r\n        b.iter(|| {\r\n            let mut string = String::new();\r\n            let options = naga::back::glsl::Options {\r\n                version: naga::back::glsl::Version::new_gles(320),\r\n                writer_flags: naga::back::glsl::WriterFlags::empty(),\r\n                binding_map: Default::default(),\r\n            };\r\n            for &(ref module, ref info) in inputs.iter() {\r\n                for ep in module.entry_points.iter() {\r\n                    let pipeline_options = naga::back::glsl::PipelineOptions {\r\n                        shader_stage: ep.stage,\r\n                        entry_point: ep.name.clone(),\r\n                        multiview: None,\r\n                    };\r\n                    match naga::back::glsl::Writer::new(\r\n                        &mut string,\r\n                        module,\r\n                        info,\r\n                        &options,\r\n                        &pipeline_options,\r\n                        naga::proc::BoundsCheckPolicies::default(),\r\n                    ) {\r\n                        Ok(mut writer) => {\r\n                            let _ = writer.write(); // can error if unsupported\r\n                        }\r\n                        Err(_) => {\r\n                            // missing features\r\n                        }\r\n                    };\r\n                    string.clear();\r\n                }\r\n            }\r\n        });\r\n    });\r\n}\r\n\r\ncriterion_group!(criterion, frontends, validation, backends,);\r\ncriterion_main!(criterion);\r\n"
  },
  {
    "path": "lib/naga/cli/Cargo.toml",
    "content": "[package]\r\nname = \"naga-cli\"\r\nversion = \"0.10.0\"\r\nauthors = [\"Naga Developers\"]\r\nedition = \"2018\"\r\ndescription = \"Shader translation command line tool\"\r\nhomepage = \"https://github.com/gfx-rs/naga\"\r\nrepository = \"https://github.com/gfx-rs/naga\"\r\nkeywords = [\"shader\", \"SPIR-V\", \"GLSL\", \"MSL\"]\r\nlicense = \"MIT OR Apache-2.0\"\r\n\r\n[[bin]]\r\nname = \"naga\"\r\npath = \"src/main.rs\"\r\n\r\n[dependencies]\r\nnaga = { version = \"0.10\", path = \"../\", features = [\"validate\", \"span\", \"wgsl-in\", \"wgsl-out\", \"glsl-in\", \"glsl-out\", \"spv-in\", \"spv-out\", \"msl-out\", \"hlsl-out\", \"dot-out\", \"serialize\", \"deserialize\"] }\r\nbincode = \"1\"\r\nlog = \"0.4\"\r\ncodespan-reporting = \"0.11\"\r\nenv_logger = \"0.9\"\r\nargh = \"0.1.5\"\r\nrspirv = \"0.11.0\"\r\n"
  },
  {
    "path": "lib/naga/cli/src/main.rs",
    "content": "#![allow(clippy::manual_strip)]\r\n#[allow(unused_imports)]\r\nuse std::fs;\r\nuse std::{error::Error, fmt, io::Read, path::Path, str::FromStr};\r\n\r\n/// Translate shaders to different formats.\r\n#[derive(argh::FromArgs, Debug, Clone)]\r\nstruct Args {\r\n    /// bitmask of the ValidationFlags to be used, use 0 to disable validation\r\n    #[argh(option)]\r\n    validate: Option<u8>,\r\n\r\n    /// what policy to use for index bounds checking for arrays, vectors, and\r\n    /// matrices.\r\n    ///\r\n    /// May be `Restrict` (force all indices in-bounds), `ReadZeroSkipWrite`\r\n    /// (out-of-bounds indices read zeros, and don't write at all), or\r\n    /// `Unchecked` (generate the simplest code, and whatever happens, happens)\r\n    ///\r\n    /// `Unchecked` is the default.\r\n    #[argh(option)]\r\n    index_bounds_check_policy: Option<BoundsCheckPolicyArg>,\r\n\r\n    /// what policy to use for index bounds checking for arrays, vectors, and\r\n    /// matrices, when they are stored in globals in the `storage` or `uniform`\r\n    /// storage classes.\r\n    ///\r\n    /// Possible values are the same as for `index-bounds-check-policy`. If\r\n    /// omitted, defaults to the index bounds check policy.\r\n    #[argh(option)]\r\n    buffer_bounds_check_policy: Option<BoundsCheckPolicyArg>,\r\n\r\n    /// what policy to use for texture bounds checking.\r\n    ///\r\n    /// Possible values are the same as for `index-bounds-check-policy`. If\r\n    /// omitted, defaults to the index bounds check policy.\r\n    #[argh(option)]\r\n    image_bounds_check_policy: Option<BoundsCheckPolicyArg>,\r\n\r\n    /// directory to dump the SPIR-V block context dump to\r\n    #[argh(option)]\r\n    block_ctx_dir: Option<String>,\r\n\r\n    /// the shader entrypoint to use when compiling to GLSL\r\n    #[argh(option)]\r\n    entry_point: Option<String>,\r\n\r\n    /// the shader profile to use, for example `es`, `core`, `es330`, if translating to GLSL\r\n    #[argh(option)]\r\n    profile: Option<GlslProfileArg>,\r\n\r\n    /// the shader model to use if targeting HLSL\r\n    ///\r\n    /// May be `50`, 51`, or `60`\r\n    #[argh(option)]\r\n    shader_model: Option<ShaderModelArg>,\r\n\r\n    /// if the selected frontends/backends support coordinate space conversions,\r\n    /// disable them\r\n    #[argh(switch)]\r\n    keep_coordinate_space: bool,\r\n\r\n    /// in dot output, include only the control flow graph\r\n    #[argh(switch)]\r\n    dot_cfg_only: bool,\r\n\r\n    /// specify file path to process STDIN as\r\n    #[argh(option)]\r\n    stdin_file_path: Option<String>,\r\n\r\n    /// show version\r\n    #[argh(switch)]\r\n    version: bool,\r\n\r\n    /// the input and output files.\r\n    ///\r\n    /// First positional argument is the input file. If not specified, the\r\n    /// input will be read from stdin. In the case, --stdin-file-path must also\r\n    /// be specified.\r\n    ///\r\n    /// The rest arguments are the output files. If not specified, only\r\n    /// validation will be performed.\r\n    #[argh(positional)]\r\n    files: Vec<String>,\r\n}\r\n\r\n/// Newtype so we can implement [`FromStr`] for `BoundsCheckPolicy`.\r\n#[derive(Debug, Clone, Copy)]\r\nstruct BoundsCheckPolicyArg(naga::proc::BoundsCheckPolicy);\r\n\r\nimpl FromStr for BoundsCheckPolicyArg {\r\n    type Err = String;\r\n\r\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\r\n        use naga::proc::BoundsCheckPolicy;\r\n        Ok(Self(match s.to_lowercase().as_str() {\r\n            \"restrict\" => BoundsCheckPolicy::Restrict,\r\n            \"readzeroskipwrite\" => BoundsCheckPolicy::ReadZeroSkipWrite,\r\n            \"unchecked\" => BoundsCheckPolicy::Unchecked,\r\n            _ => {\r\n                return Err(format!(\r\n                    \"Invalid value for --index-bounds-check-policy: {}\",\r\n                    s\r\n                ))\r\n            }\r\n        }))\r\n    }\r\n}\r\n\r\n/// Newtype so we can implement [`FromStr`] for `ShaderModel`.\r\n#[derive(Debug, Clone)]\r\nstruct ShaderModelArg(naga::back::hlsl::ShaderModel);\r\n\r\nimpl FromStr for ShaderModelArg {\r\n    type Err = String;\r\n\r\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\r\n        use naga::back::hlsl::ShaderModel;\r\n        Ok(Self(match s.to_lowercase().as_str() {\r\n            \"50\" => ShaderModel::V5_0,\r\n            \"51\" => ShaderModel::V5_1,\r\n            \"60\" => ShaderModel::V6_0,\r\n            _ => return Err(format!(\"Invalid value for --shader-model: {}\", s)),\r\n        }))\r\n    }\r\n}\r\n\r\n/// Newtype so we can implement [`FromStr`] for [`naga::back::glsl::Version`].\r\n#[derive(Clone, Debug)]\r\nstruct GlslProfileArg(naga::back::glsl::Version);\r\n\r\nimpl FromStr for GlslProfileArg {\r\n    type Err = String;\r\n\r\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\r\n        use naga::back::glsl::Version;\r\n        Ok(Self(if s.starts_with(\"core\") {\r\n            Version::Desktop(s[4..].parse().unwrap_or(330))\r\n        } else if s.starts_with(\"es\") {\r\n            Version::new_gles(s[2..].parse().unwrap_or(310))\r\n        } else {\r\n            return Err(format!(\"Unknown profile: {}\", s));\r\n        }))\r\n    }\r\n}\r\n\r\n#[derive(Default)]\r\nstruct Parameters {\r\n    validation_flags: naga::valid::ValidationFlags,\r\n    bounds_check_policies: naga::proc::BoundsCheckPolicies,\r\n    entry_point: Option<String>,\r\n    keep_coordinate_space: bool,\r\n    spv_block_ctx_dump_prefix: Option<String>,\r\n    spv: naga::back::spv::Options,\r\n    msl: naga::back::msl::Options,\r\n    glsl: naga::back::glsl::Options,\r\n    hlsl: naga::back::hlsl::Options,\r\n}\r\n\r\ntrait PrettyResult {\r\n    type Target;\r\n    fn unwrap_pretty(self) -> Self::Target;\r\n}\r\n\r\nfn print_err(error: &dyn Error) {\r\n    eprint!(\"{}\", error);\r\n\r\n    let mut e = error.source();\r\n    if e.is_some() {\r\n        eprintln!(\": \");\r\n    } else {\r\n        eprintln!();\r\n    }\r\n\r\n    while let Some(source) = e {\r\n        eprintln!(\"\\t{}\", source);\r\n        e = source.source();\r\n    }\r\n}\r\n\r\nimpl<T, E: Error> PrettyResult for Result<T, E> {\r\n    type Target = T;\r\n    fn unwrap_pretty(self) -> T {\r\n        match self {\r\n            Result::Ok(value) => value,\r\n            Result::Err(error) => {\r\n                print_err(&error);\r\n                std::process::exit(1);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nfn main() {\r\n    if let Err(e) = run() {\r\n        print_err(e.as_ref());\r\n        std::process::exit(1);\r\n    }\r\n}\r\n\r\n/// Error type for the CLI\r\n#[derive(Debug, Clone)]\r\nstruct CliError(&'static str);\r\nimpl fmt::Display for CliError {\r\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\r\n        write!(f, \"{}\", self.0)\r\n    }\r\n}\r\nimpl std::error::Error for CliError {}\r\n\r\nfn run() -> Result<(), Box<dyn std::error::Error>> {\r\n    env_logger::init();\r\n\r\n    // Initialize default parameters\r\n    //TODO: read the parameters from RON?\r\n    let mut params = Parameters::default();\r\n\r\n    // Parse commandline arguments\r\n    let args: Args = argh::from_env();\r\n    if args.version {\r\n        println!(\"{}\", env!(\"CARGO_PKG_VERSION\"));\r\n        return Ok(());\r\n    }\r\n    let (input_path, input) = if let Some(path) = args.files.first() {\r\n        let path = Path::new(path);\r\n        (path, fs::read(path)?)\r\n    } else if let Some(path) = &args.stdin_file_path {\r\n        let mut input = vec![];\r\n        std::io::stdin().lock().read_to_end(&mut input)?;\r\n        (Path::new(path), input)\r\n    } else {\r\n        return Err(CliError(\"Input file path is not specified\").into());\r\n    };\r\n    let output_paths = if !args.files.is_empty() {\r\n        &args.files[1..]\r\n    } else {\r\n        &[]\r\n    };\r\n\r\n    // Update parameters from commandline arguments\r\n    if let Some(bits) = args.validate {\r\n        params.validation_flags = naga::valid::ValidationFlags::from_bits(bits)\r\n            .ok_or(CliError(\"Invalid validation flags\"))?;\r\n    }\r\n    if let Some(policy) = args.index_bounds_check_policy {\r\n        params.bounds_check_policies.index = policy.0;\r\n    }\r\n    params.bounds_check_policies.buffer = match args.buffer_bounds_check_policy {\r\n        Some(arg) => arg.0,\r\n        None => params.bounds_check_policies.index,\r\n    };\r\n    params.bounds_check_policies.image = match args.image_bounds_check_policy {\r\n        Some(arg) => arg.0,\r\n        None => params.bounds_check_policies.index,\r\n    };\r\n    params.spv_block_ctx_dump_prefix = args.block_ctx_dir;\r\n    params.entry_point = args.entry_point;\r\n    if let Some(version) = args.profile {\r\n        params.glsl.version = version.0;\r\n    }\r\n    if let Some(model) = args.shader_model {\r\n        params.hlsl.shader_model = model.0;\r\n    }\r\n    params.keep_coordinate_space = args.keep_coordinate_space;\r\n\r\n    let (module, input_text) = match Path::new(&input_path)\r\n        .extension()\r\n        .ok_or(CliError(\"Input filename has no extension\"))?\r\n        .to_str()\r\n        .ok_or(CliError(\"Input filename not valid unicode\"))?\r\n    {\r\n        \"bin\" => (bincode::deserialize(&input)?, None),\r\n        \"spv\" => {\r\n            let options = naga::front::spv::Options {\r\n                adjust_coordinate_space: !params.keep_coordinate_space,\r\n                strict_capabilities: false,\r\n                block_ctx_dump_prefix: params\r\n                    .spv_block_ctx_dump_prefix\r\n                    .map(std::path::PathBuf::from),\r\n            };\r\n            naga::front::spv::parse_u8_slice(&input, &options).map(|m| (m, None))?\r\n        }\r\n        \"wgsl\" => {\r\n            let input = String::from_utf8(input)?;\r\n            let result = naga::front::wgsl::parse_str(&input);\r\n            match result {\r\n                Ok(v) => (v, Some(input)),\r\n                Err(ref e) => {\r\n                    let path = input_path.to_string_lossy();\r\n                    e.emit_to_stderr_with_path(&input, &path);\r\n                    return Err(CliError(\"Could not parse WGSL\").into());\r\n                }\r\n            }\r\n        }\r\n        ext @ (\"vert\" | \"frag\" | \"comp\") => {\r\n            let input = String::from_utf8(input)?;\r\n            let mut parser = naga::front::glsl::Parser::default();\r\n\r\n            (\r\n                parser\r\n                    .parse(\r\n                        &naga::front::glsl::Options {\r\n                            stage: match ext {\r\n                                \"vert\" => naga::ShaderStage::Vertex,\r\n                                \"frag\" => naga::ShaderStage::Fragment,\r\n                                \"comp\" => naga::ShaderStage::Compute,\r\n                                _ => unreachable!(),\r\n                            },\r\n                            defines: Default::default(),\r\n                        },\r\n                        &input,\r\n                    )\r\n                    .unwrap_or_else(|errors| {\r\n                        let filename = input_path.file_name().and_then(std::ffi::OsStr::to_str);\r\n                        emit_glsl_parser_error(errors, filename.unwrap_or(\"glsl\"), &input);\r\n                        std::process::exit(1);\r\n                    }),\r\n                Some(input),\r\n            )\r\n        }\r\n        _ => return Err(CliError(\"Unknown input file extension\").into()),\r\n    };\r\n\r\n    // Decide which capabilities our output formats can support.\r\n    let validation_caps =\r\n        output_paths\r\n            .iter()\r\n            .fold(naga::valid::Capabilities::all(), |caps, path| {\r\n                use naga::valid::Capabilities as C;\r\n                let missing = match Path::new(path).extension().and_then(|ex| ex.to_str()) {\r\n                    Some(\"wgsl\") => C::CLIP_DISTANCE | C::CULL_DISTANCE,\r\n                    Some(\"metal\") => C::CULL_DISTANCE,\r\n                    _ => C::empty(),\r\n                };\r\n                caps & !missing\r\n            });\r\n\r\n    // validate the IR\r\n    let info = match naga::valid::Validator::new(params.validation_flags, validation_caps)\r\n        .validate(&module)\r\n    {\r\n        Ok(info) => Some(info),\r\n        Err(error) => {\r\n            if let Some(input) = input_text {\r\n                let filename = input_path.file_name().and_then(std::ffi::OsStr::to_str);\r\n                emit_annotated_error(&error, filename.unwrap_or(\"input\"), &input);\r\n            }\r\n            print_err(&error);\r\n            None\r\n        }\r\n    };\r\n\r\n    if output_paths.is_empty() {\r\n        if info.is_some() {\r\n            println!(\"Validation successful\");\r\n            return Ok(());\r\n        } else {\r\n            std::process::exit(-1);\r\n        }\r\n    }\r\n\r\n    for output_path in output_paths {\r\n        match Path::new(&output_path)\r\n            .extension()\r\n            .ok_or(CliError(\"Output filename has no extension\"))?\r\n            .to_str()\r\n            .ok_or(CliError(\"Output filename not valid unicode\"))?\r\n        {\r\n            \"txt\" => {\r\n                use std::io::Write;\r\n\r\n                let mut file = fs::File::create(output_path)?;\r\n                writeln!(file, \"{:#?}\", module)?;\r\n                if let Some(ref info) = info {\r\n                    writeln!(file)?;\r\n                    writeln!(file, \"{:#?}\", info)?;\r\n                }\r\n            }\r\n            \"bin\" => {\r\n                let file = fs::File::create(output_path)?;\r\n                bincode::serialize_into(file, &module)?;\r\n            }\r\n            \"metal\" => {\r\n                use naga::back::msl;\r\n\r\n                let mut options = params.msl.clone();\r\n                options.bounds_check_policies = params.bounds_check_policies;\r\n\r\n                let pipeline_options = msl::PipelineOptions::default();\r\n                let (msl, _) = msl::write_string(\r\n                    &module,\r\n                    info.as_ref().ok_or(CliError(\r\n                        \"Generating metal output requires validation to \\\r\n                        succeed, and it failed in a previous step\",\r\n                    ))?,\r\n                    &options,\r\n                    &pipeline_options,\r\n                )\r\n                .unwrap_pretty();\r\n                fs::write(output_path, msl)?;\r\n            }\r\n            \"spv\" => {\r\n                use naga::back::spv;\r\n\r\n                let pipeline_options_owned;\r\n                let pipeline_options = match params.entry_point {\r\n                    Some(ref name) => {\r\n                        let ep_index = module\r\n                            .entry_points\r\n                            .iter()\r\n                            .position(|ep| ep.name == *name)\r\n                            .expect(\"Unable to find the entry point\");\r\n                        pipeline_options_owned = spv::PipelineOptions {\r\n                            entry_point: name.clone(),\r\n                            shader_stage: module.entry_points[ep_index].stage,\r\n                        };\r\n                        Some(&pipeline_options_owned)\r\n                    }\r\n                    None => None,\r\n                };\r\n\r\n                params.spv.bounds_check_policies = params.bounds_check_policies;\r\n                params.spv.flags.set(\r\n                    spv::WriterFlags::ADJUST_COORDINATE_SPACE,\r\n                    !params.keep_coordinate_space,\r\n                );\r\n\r\n                let spv = spv::write_vec(\r\n                    &module,\r\n                    info.as_ref().ok_or(CliError(\r\n                        \"Generating SPIR-V output requires validation to \\\r\n                        succeed, and it failed in a previous step\",\r\n                    ))?,\r\n                    &params.spv,\r\n                    pipeline_options,\r\n                )\r\n                .unwrap_pretty();\r\n                let bytes = spv\r\n                    .iter()\r\n                    .fold(Vec::with_capacity(spv.len() * 4), |mut v, w| {\r\n                        v.extend_from_slice(&w.to_le_bytes());\r\n                        v\r\n                    });\r\n\r\n                fs::write(output_path, bytes.as_slice())?;\r\n            },\r\n            \"spvasm\" => {\r\n                use naga::back::spv;\r\n                use rspirv::binary::Disassemble;\r\n\r\n                let pipeline_options_owned;\r\n                let pipeline_options = match params.entry_point {\r\n                    Some(ref name) => {\r\n                        let ep_index = module\r\n                            .entry_points\r\n                            .iter()\r\n                            .position(|ep| ep.name == *name)\r\n                            .expect(\"Unable to find the entry point\");\r\n                        pipeline_options_owned = spv::PipelineOptions {\r\n                            entry_point: name.clone(),\r\n                            shader_stage: module.entry_points[ep_index].stage,\r\n                        };\r\n                        Some(&pipeline_options_owned)\r\n                    }\r\n                    None => None,\r\n                };\r\n\r\n                params.spv.bounds_check_policies = params.bounds_check_policies;\r\n                params.spv.flags.set(\r\n                    spv::WriterFlags::ADJUST_COORDINATE_SPACE,\r\n                    !params.keep_coordinate_space,\r\n                );\r\n\r\n                let spv = spv::write_vec(\r\n                    &module,\r\n                    info.as_ref().ok_or(CliError(\r\n                        \"Generating SPIR-V output requires validation to \\\r\n                        succeed, and it failed in a previous step\",\r\n                    ))?,\r\n                    &params.spv,\r\n                    pipeline_options,\r\n                )\r\n                .unwrap_pretty();\r\n                // let bytes = spv\r\n                //     .iter()\r\n                //     .fold(Vec::with_capacity(spv.len() * 4), |mut v, w| {\r\n                //         v.extend_from_slice(&w.to_le_bytes());\r\n                //         v\r\n                //     });\r\n                let dis = rspirv::dr::load_words(spv)\r\n                    .expect(\"Produced invalid SPIR-V\")\r\n                    .disassemble();\r\n                fs::write(output_path, dis)?;\r\n            }\r\n            stage @ (\"vert\" | \"frag\" | \"comp\") => {\r\n                use naga::back::glsl;\r\n\r\n                let pipeline_options = glsl::PipelineOptions {\r\n                    entry_point: match params.entry_point {\r\n                        Some(ref name) => name.clone(),\r\n                        None => \"main\".to_string(),\r\n                    },\r\n                    shader_stage: match stage {\r\n                        \"vert\" => naga::ShaderStage::Vertex,\r\n                        \"frag\" => naga::ShaderStage::Fragment,\r\n                        \"comp\" => naga::ShaderStage::Compute,\r\n                        _ => unreachable!(),\r\n                    },\r\n                    multiview: None,\r\n                };\r\n\r\n                let mut buffer = String::new();\r\n                let mut writer = glsl::Writer::new(\r\n                    &mut buffer,\r\n                    &module,\r\n                    info.as_ref().ok_or(CliError(\r\n                        \"Generating glsl output requires validation to \\\r\n                        succeed, and it failed in a previous step\",\r\n                    ))?,\r\n                    &params.glsl,\r\n                    &pipeline_options,\r\n                    params.bounds_check_policies,\r\n                )\r\n                .unwrap_pretty();\r\n                writer.write()?;\r\n                fs::write(output_path, buffer)?;\r\n            }\r\n            \"dot\" => {\r\n                use naga::back::dot;\r\n\r\n                let output = dot::write(\r\n                    &module,\r\n                    info.as_ref(),\r\n                    naga::back::dot::Options {\r\n                        cfg_only: args.dot_cfg_only,\r\n                    },\r\n                )?;\r\n                fs::write(output_path, output)?;\r\n            }\r\n            \"hlsl\" => {\r\n                use naga::back::hlsl;\r\n                let mut buffer = String::new();\r\n                let mut writer = hlsl::Writer::new(&mut buffer, &params.hlsl);\r\n                writer\r\n                    .write(\r\n                        &module,\r\n                        info.as_ref().ok_or(CliError(\r\n                            \"Generating hlsl output requires validation to \\\r\n                            succeed, and it failed in a previous step\",\r\n                        ))?,\r\n                    )\r\n                    .unwrap_pretty();\r\n                fs::write(output_path, buffer)?;\r\n            }\r\n            \"wgsl\" => {\r\n                use naga::back::wgsl;\r\n\r\n                let wgsl = wgsl::write_string(\r\n                    &module,\r\n                    info.as_ref().ok_or(CliError(\r\n                        \"Generating wgsl output requires validation to \\\r\n                        succeed, and it failed in a previous step\",\r\n                    ))?,\r\n                    wgsl::WriterFlags::empty(),\r\n                )\r\n                .unwrap_pretty();\r\n                fs::write(output_path, wgsl)?;\r\n            }\r\n            other => {\r\n                println!(\"Unknown output extension: {}\", other);\r\n            }\r\n        }\r\n    }\r\n\r\n    Ok(())\r\n}\r\n\r\nuse codespan_reporting::{\r\n    diagnostic::{Diagnostic, Label},\r\n    files::SimpleFile,\r\n    term::{\r\n        self,\r\n        termcolor::{ColorChoice, StandardStream},\r\n    },\r\n};\r\nuse naga::WithSpan;\r\n\r\npub fn emit_glsl_parser_error(errors: Vec<naga::front::glsl::Error>, filename: &str, source: &str) {\r\n    let files = SimpleFile::new(filename, source);\r\n    let config = codespan_reporting::term::Config::default();\r\n    let writer = StandardStream::stderr(ColorChoice::Auto);\r\n\r\n    for err in errors {\r\n        let mut diagnostic = Diagnostic::error().with_message(err.kind.to_string());\r\n\r\n        if let Some(range) = err.meta.to_range() {\r\n            diagnostic = diagnostic.with_labels(vec![Label::primary((), range)]);\r\n        }\r\n\r\n        term::emit(&mut writer.lock(), &config, &files, &diagnostic).expect(\"cannot write error\");\r\n    }\r\n}\r\n\r\npub fn emit_annotated_error<E: Error>(ann_err: &WithSpan<E>, filename: &str, source: &str) {\r\n    let files = SimpleFile::new(filename, source);\r\n    let config = codespan_reporting::term::Config::default();\r\n    let writer = StandardStream::stderr(ColorChoice::Auto);\r\n\r\n    let diagnostic = Diagnostic::error().with_labels(\r\n        ann_err\r\n            .spans()\r\n            .map(|(span, desc)| {\r\n                Label::primary((), span.to_range().unwrap()).with_message(desc.to_owned())\r\n            })\r\n            .collect(),\r\n    );\r\n\r\n    term::emit(&mut writer.lock(), &config, &files, &diagnostic).expect(\"cannot write error\");\r\n}\r\n"
  },
  {
    "path": "lib/naga/debug/CS_boids.metal",
    "content": "// language: metal2.0\n#include <metal_stdlib>\n#include <simd/simd.h>\n\nusing metal::uint;\n\nstruct _mslBufferSizes {\n    uint size1;\n    uint size2;\n    uint size3;\n    uint size4;\n    uint size6;\n    uint size7;\n};\n\nstruct Node {\n    metal::float3 position;\n    metal::float3 force;\n    metal::packed_float3 prev_force;\n    metal::atomic_uint mass;\n};\nstruct Uniforms {\n    uint frame_num;\n};\nstruct Bound {\n    metal::float3 bound_min;\n    metal::float3 bound_max;\n};\nstruct BHTree {\n    metal::atomic_uint max_depth;\n    metal::atomic_uint bottom;\n    float radius;\n};\nstruct BHTreeNode {\n    metal::packed_float3 position;\n    metal::atomic_int mass;\n    int count;\n    metal::atomic_int start;\n    int sort;\n};\ntypedef Node type_6[1];\ntypedef metal::uint2 type_8[1];\ntypedef metal::atomic_int type_9[1];\ntypedef Bound type_10[1];\ntypedef BHTreeNode type_11[1];\nstruct type_13 {\n    metal::float3 inner[256];\n};\nstruct type_14 {\n    int inner[8];\n};\nstruct type_16 {\n    uint inner[48];\n};\nstruct type_17 {\n    float inner[48];\n};\n\nuint hash(\n    uint s_1\n) {\n    uint t = {};\n    t = s_1;\n    uint _e10 = t;\n    t = _e10 ^ 2747636419u;\n    uint _e13 = t;\n    t = _e13 * 2654435769u;\n    uint _e16 = t;\n    uint _e17 = t;\n    t = _e16 ^ (_e17 >> 16u);\n    uint _e21 = t;\n    t = _e21 * 2654435769u;\n    uint _e24 = t;\n    uint _e25 = t;\n    t = _e24 ^ (_e25 >> 16u);\n    uint _e29 = t;\n    t = _e29 * 2654435769u;\n    uint _e32 = t;\n    return _e32;\n}\n\nfloat random(\n    uint seed\n) {\n    uint _e9 = hash(seed);\n    return static_cast<float>(_e9) / 4294967296.0;\n}\n\nfloat random_xy(\n    uint seed_x,\n    uint seed_y\n) {\n    uint _e10 = hash(seed_x);\n    uint _e12 = hash(_e10 + seed_y);\n    return static_cast<float>(_e12) / 4294967296.0;\n}\n\nvoid atomic_add_f32_(\n    uint springIndex,\n    float updateValue,\n    device type_9& springForceSrc,\n    constant _mslBufferSizes& _buffer_sizes\n) {\n    int new_u32_ = {};\n    int assumed = 0;\n    int origin = {};\n    new_u32_ = as_type<int>(updateValue);\n    while(true) {\n        if (true) {\n        } else {\n            break;\n        }\n        int _e17 = assumed;\n        int _e18 = new_u32_;\n        metal::atomic_compare_exchange_weak_explicit(&springForceSrc[springIndex], &_e17, _e18, metal::memory_order_relaxed, metal::memory_order_relaxed);\n        origin = _e17;\n        int _e20 = origin;\n        int _e21 = assumed;\n        if (_e20 == _e21) {\n            break;\n        }\n        int _e23 = origin;\n        assumed = _e23;\n        int _e24 = origin;\n        new_u32_ = as_type<int>(as_type<float>(_e24) + updateValue);\n    }\n    return;\n}\n\nstruct gen_nodeInput {\n};\nkernel void gen_node(\n  metal::uint3 global_invocation_id [[thread_position_in_grid]]\n, constant Uniforms& uniforms [[user(fake0)]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device type_9& springForceSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 vPos = {};\n    uint total = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_5 = global_invocation_id.x;\n    if (index_5 >= total) {\n        return;\n    }\n    metal::float3 _e14 = nodeSrc[index_5].position;\n    vPos = _e14;\n    uint _e20 = uniforms.frame_num;\n    float _e23 = random_xy(index_5, 0u + (3u * _e20));\n    vPos.x = (_e23 * 2.0) - 1.0;\n    uint _e32 = uniforms.frame_num;\n    float _e35 = random_xy(index_5, 1u + (3u * _e32));\n    vPos.y = (_e35 * 2.0) - 1.0;\n    uint _e44 = uniforms.frame_num;\n    float _e47 = random_xy(index_5, 2u + (3u * _e44));\n    vPos.z = (_e47 * 2.0) - 1.0;\n    metal::float3 _e54 = vPos;\n    nodeSrc[index_5].position = _e54;\n    nodeSrc[index_5].force = metal::float3(0.0);\n    nodeSrc[index_5].prev_force = metal::float3(0.0);\n    metal::atomic_store_explicit(&nodeSrc[index_5].mass, 1u, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 0u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 1u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 2u], 0, metal::memory_order_relaxed);\n    uint target_node = (index_5 * 3u) + 2u;\n    int _e90 = metal::atomic_exchange_explicit(&springForceSrc[target_node], 0, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct cal_massInput {\n};\nkernel void cal_mass(\n  metal::uint3 global_invocation_id_1 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device type_8 const& edgeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::uint2 edge = {};\n    uint total_1 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8;\n    uint index_6 = global_invocation_id_1.x;\n    if (index_6 >= total_1) {\n        return;\n    }\n    metal::uint2 _e13 = edgeSrc[index_6];\n    edge = _e13;\n    uint source_node = edge.x;\n    uint target_node_1 = edge.y;\n    uint _e24 = metal::atomic_fetch_add_explicit(&nodeSrc[source_node].mass, 1u, metal::memory_order_relaxed);\n    uint _e28 = metal::atomic_fetch_add_explicit(&nodeSrc[target_node_1].mass, 1u, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct cal_gravity_forceInput {\n};\nkernel void cal_gravity_force(\n  metal::uint3 global_invocation_id_2 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    float gravity_force = {};\n    uint total_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_7 = global_invocation_id_2.x;\n    if (index_7 >= total_2) {\n        return;\n    }\n    metal::float3 pos_3 = nodeSrc[index_7].position;\n    uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_7].mass, metal::memory_order_relaxed);\n    float mass = static_cast<float>(_e19);\n    if (true) {\n        gravity_force = 1.0 * mass;\n    } else {\n        if (((pos_3.x != 0.0) || (pos_3.y != 0.0)) || (pos_3.z != 0.0)) {\n            gravity_force = (1.0 * mass) * metal::rsqrt(metal::dot(pos_3, pos_3));\n        } else {\n            gravity_force = 0.0;\n        }\n    }\n    metal::float3 _e41 = nodeSrc[index_7].force;\n    float _e43 = gravity_force;\n    nodeSrc[index_7].force = _e41 + (-pos_3 * _e43);\n    return;\n}\n\n\nstruct attractive_forceInput {\n};\nkernel void attractive_force(\n  metal::uint3 global_invocation_id_3 [[thread_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, device type_8 const& edgeSrc [[user(fake0)]]\n, device type_9& springForceSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::uint2 edge_1 = {};\n    metal::float3 dir = {};\n    uint total_3 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8;\n    uint index_8 = global_invocation_id_3.x;\n    if (index_8 >= total_3) {\n        return;\n    }\n    metal::uint2 _e13 = edgeSrc[index_8];\n    edge_1 = _e13;\n    uint source_node_1 = edge_1.x;\n    uint target_node_2 = edge_1.y;\n    metal::float3 _e23 = nodeSrc[target_node_2].position;\n    metal::float3 _e26 = nodeSrc[source_node_1].position;\n    dir = _e23 - _e26;\n    float _e34 = dir.x;\n    atomic_add_f32_((source_node_1 * 3u) + 0u, _e34, springForceSrc, _buffer_sizes);\n    float _e40 = dir.y;\n    atomic_add_f32_((source_node_1 * 3u) + 1u, _e40, springForceSrc, _buffer_sizes);\n    float _e46 = dir.z;\n    atomic_add_f32_((source_node_1 * 3u) + 2u, _e46, springForceSrc, _buffer_sizes);\n    float _e52 = dir.x;\n    atomic_add_f32_((target_node_2 * 3u) + 0u, -_e52, springForceSrc, _buffer_sizes);\n    float _e59 = dir.y;\n    atomic_add_f32_((target_node_2 * 3u) + 1u, -_e59, springForceSrc, _buffer_sizes);\n    float _e66 = dir.z;\n    atomic_add_f32_((target_node_2 * 3u) + 2u, -_e66, springForceSrc, _buffer_sizes);\n    return;\n}\n\n\nstruct reduction_boundingInput {\n};\nkernel void reduction_bounding(\n  uint local_index [[thread_index_in_threadgroup]]\n, metal::uint3 global_id [[thread_position_in_grid]]\n, metal::uint3 group_id [[threadgroup_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, device type_10& bounding [[user(fake0)]]\n, threadgroup type_13& smin\n, threadgroup type_13& smax\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index = {};\n    uint s = {};\n    index = global_id.x;\n    uint total_4 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint _e16 = index;\n    if (_e16 >= total_4) {\n        index = total_4 - 1u;\n    }\n    uint _e21 = index;\n    metal::float3 _e24 = nodeSrc[_e21].position;\n    smin.inner[local_index] = _e24;\n    uint _e26 = index;\n    metal::float3 _e29 = nodeSrc[_e26].position;\n    smax.inner[local_index] = _e29;\n    metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n    s = 256u / 2u;\n    bool loop_init = true;\n    while(true) {\n        if (!loop_init) {\n            uint _e37 = s;\n            s = _e37 >> 1u;\n        }\n        loop_init = false;\n        uint _e34 = s;\n        if (_e34 > 0u) {\n        } else {\n            break;\n        }\n        uint _e40 = s;\n        if (local_index < _e40) {\n            uint _e42 = s;\n            uint k = local_index + _e42;\n            metal::float3 _e46 = smin.inner[local_index];\n            metal::float3 _e48 = smin.inner[k];\n            smin.inner[local_index] = metal::min(_e46, _e48);\n            metal::float3 _e52 = smax.inner[local_index];\n            metal::float3 _e54 = smax.inner[k];\n            smax.inner[local_index] = metal::max(_e52, _e54);\n        }\n        metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n    }\n    if (local_index == 0u) {\n        metal::float3 _e63 = smin.inner[0];\n        bounding[group_id.x].bound_min = _e63;\n        metal::float3 _e69 = smax.inner[0];\n        bounding[group_id.x].bound_max = _e69;\n        return;\n    } else {\n        return;\n    }\n}\n\n\nkernel void bounding_box(\n  device type_6 const& nodeSrc [[user(fake0)]]\n, device type_10& bounding [[user(fake0)]]\n, device BHTree& bhTree [[user(fake0)]]\n, device type_11& treeNode [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 bound_min_min = {};\n    metal::float3 bound_max_max = {};\n    uint i = 0u;\n    metal::float3 _e13 = bounding[0].bound_min;\n    bound_min_min = _e13;\n    metal::float3 _e18 = bounding[0].bound_max;\n    bound_max_max = _e18;\n    uint node_group_count = static_cast<uint>(metal::ceil(static_cast<float>(1 + (_buffer_sizes.size1 - 0 - 48) / 48) / 256.0));\n    bool loop_init_1 = true;\n    while(true) {\n        if (!loop_init_1) {\n            uint _e30 = i;\n            i = _e30 + 1u;\n        }\n        loop_init_1 = false;\n        uint _e28 = i;\n        if (_e28 < node_group_count) {\n        } else {\n            break;\n        }\n        metal::float3 _e33 = bound_min_min;\n        uint _e34 = i;\n        metal::float3 _e37 = bounding[_e34].bound_min;\n        bound_min_min = metal::min(_e33, _e37);\n        metal::float3 _e39 = bound_max_max;\n        uint _e40 = i;\n        metal::float3 _e43 = bounding[_e40].bound_max;\n        bound_max_max = metal::max(_e39, _e43);\n    }\n    metal::float3 _e48 = bound_min_min;\n    bounding[0].bound_min = _e48;\n    metal::float3 _e52 = bound_max_max;\n    bounding[0].bound_max = _e52;\n    metal::float3 _e53 = bound_max_max;\n    metal::float3 _e54 = bound_min_min;\n    metal::float3 box = _e53 - _e54;\n    uint tree_node_count = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    bhTree.radius = metal::max(metal::max(box.x, box.y), box.z) * 0.5;\n    metal::atomic_store_explicit(&bhTree.bottom, tree_node_count, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&bhTree.max_depth, 0u, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&treeNode[tree_node_count].mass, -1, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&treeNode[tree_node_count].start, 0, metal::memory_order_relaxed);\n    metal::float3 _e78 = bound_min_min;\n    metal::float3 _e79 = bound_max_max;\n    treeNode[tree_node_count].position = (_e78 + _e79) * 0.5;\n    treeNode[tree_node_count].count = -1;\n    treeNode[tree_node_count].sort = 0;\n    return;\n}\n\n\nstruct clear_1_Input {\n};\nkernel void clear_1_(\n  metal::uint3 global_invocation_id_4 [[thread_position_in_grid]]\n, device type_11 const& treeNode [[user(fake0)]]\n, device type_9& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint i_1 = 0u;\n    uint total_5 = 1 + (_buffer_sizes.size6 - 0 - 32) / 32;\n    uint index_9 = global_invocation_id_4.x;\n    if (index_9 >= total_5) {\n        return;\n    }\n    bool loop_init_2 = true;\n    while(true) {\n        if (!loop_init_2) {\n            uint _e19 = i_1;\n            i_1 = _e19 + 1u;\n        }\n        loop_init_2 = false;\n        uint _e16 = i_1;\n        if (_e16 < 8u) {\n        } else {\n            break;\n        }\n        uint _e24 = i_1;\n        metal::atomic_store_explicit(&treeChild[(index_9 * 8u) + _e24], -1, metal::memory_order_relaxed);\n    }\n    return;\n}\n\n\nstruct tree_buildingInput {\n};\nkernel void tree_building(\n  metal::uint3 global_invocation_id_5 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device BHTree& bhTree [[user(fake0)]]\n, device type_11 const& treeNode [[user(fake0)]]\n, device type_9& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index_1 = {};\n    int skip = 1;\n    metal::float3 pos = {};\n    metal::float3 dp = {};\n    metal::float3 rdp = {};\n    uint n = {};\n    uint depth = 1u;\n    uint local_max_depth = 1u;\n    uint j = 0u;\n    float root_r = {};\n    float r = {};\n    int limit = 10000;\n    int ch = {};\n    int locked_ch = {};\n    int v = {};\n    int v_1 = {};\n    index_1 = global_invocation_id_5.x;\n    uint node_count = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint tree_node_count_1 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    metal::float3 root_pos = treeNode[tree_node_count_1].position;\n    uint inc = metal::min(node_count, 16384u);\n    n = tree_node_count_1;\n    float _e35 = bhTree.radius;\n    root_r = _e35;\n    float _e37 = root_r;\n    r = _e37 * 0.5;\n    while(true) {\n        uint _e43 = index_1;\n        if (_e43 < node_count) {\n        } else {\n            break;\n        }\n        int _e45 = limit;\n        limit = _e45 - 1;\n        int _e48 = limit;\n        if (_e48 < 0) {\n            return;\n        }\n        int _e51 = skip;\n        if (_e51 != 0) {\n            skip = 0;\n            uint _e55 = index_1;\n            metal::float3 _e58 = nodeSrc[_e55].position;\n            pos = _e58;\n            n = tree_node_count_1;\n            float _e59 = root_r;\n            r = _e59 * 0.5;\n            depth = 1u;\n            metal::float3 _e63 = pos;\n            metal::float3 compare = metal::step(root_pos, _e63);\n            j = (static_cast<uint>(compare.x) << 0u) | ((static_cast<uint>(compare.y) << 1u) + (static_cast<uint>(compare.z) << 2u));\n            float _e79 = r;\n            float _e82 = r;\n            dp = metal::float3(-_e79) + (compare * (2.0 * _e82));\n            metal::float3 _e87 = dp;\n            rdp = root_pos + _e87;\n        }\n        uint _e89 = n;\n        uint _e92 = j;\n        int _e95 = metal::atomic_load_explicit(&treeChild[(_e89 * 8u) + _e92], metal::memory_order_relaxed);\n        ch = _e95;\n        while(true) {\n            int _e97 = ch;\n            if (_e97 >= static_cast<int>(node_count)) {\n            } else {\n                break;\n            }\n            int _e100 = ch;\n            n = static_cast<uint>(_e100);\n            uint _e102 = depth;\n            depth = _e102 + 1u;\n            float _e105 = r;\n            r = _e105 * 0.5;\n            metal::float3 _e108 = rdp;\n            metal::float3 _e109 = pos;\n            metal::float3 compare_1 = metal::step(_e108, _e109);\n            j = (static_cast<uint>(compare_1.x) << 0u) | ((static_cast<uint>(compare_1.y) << 1u) + (static_cast<uint>(compare_1.z) << 2u));\n            float _e125 = r;\n            float _e128 = r;\n            dp = metal::float3(-_e125) + (compare_1 * (2.0 * _e128));\n            metal::float3 _e133 = rdp;\n            metal::float3 _e134 = dp;\n            rdp = _e133 + _e134;\n            uint _e136 = n;\n            uint _e139 = j;\n            int _e142 = metal::atomic_load_explicit(&treeChild[(_e136 * 8u) + _e139], metal::memory_order_relaxed);\n            ch = _e142;\n        }\n        uint _e143 = n;\n        uint _e146 = j;\n        uint locked = (_e143 * 8u) + _e146;\n        locked_ch = -1;\n        int _e150 = ch;\n        if (_e150 != -2) {\n            int _e153 = ch;\n            if (_e153 == -1) {\n                v = -1;\n                int _e159 = v;\n                uint _e160 = index_1;\n                metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e159, static_cast<int>(_e160), metal::memory_order_relaxed, metal::memory_order_relaxed);\n                if (_e159 == -1) {\n                    uint _e165 = depth;\n                    uint _e166 = local_max_depth;\n                    local_max_depth = metal::max(_e165, _e166);\n                    uint _e168 = index_1;\n                    index_1 = _e168 + inc;\n                    skip = 1;\n                } else {\n                    skip = 0;\n                }\n            } else {\n                int _e172 = ch;\n                v_1 = _e172;\n                int _e175 = v_1;\n                metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e175, -2, metal::memory_order_relaxed, metal::memory_order_relaxed);\n                int _e178 = ch;\n                if (_e178 == _e175) {\n                    int _e180 = ch;\n                    metal::float3 _e183 = nodeSrc[_e180].position;\n                    metal::float3 _e184 = pos;\n                    if (metal::all(_e183 == _e184)) {\n                        uint _e187 = index_1;\n                        metal::float3 _e190 = nodeSrc[_e187].position;\n                        nodeSrc[_e187].position = _e190 + metal::float3(0.10000000149011612, -0.05000000074505806, 0.10000000149011612);\n                        skip = 0;\n                        int _e198 = ch;\n                        metal::atomic_store_explicit(&treeChild[locked], _e198, metal::memory_order_relaxed);\n                        break;\n                    }\n                    locked_ch = -1;\n                    while(true) {\n                        uint _e202 = metal::atomic_fetch_sub_explicit(&bhTree.bottom, 1u, metal::memory_order_relaxed);\n                        uint cell = _e202 - 1u;\n                        if (cell <= node_count) {\n                            return;\n                        }\n                        int _e206 = locked_ch;\n                        if (_e206 != -1) {\n                            uint _e209 = n;\n                            uint _e212 = j;\n                            metal::atomic_store_explicit(&treeChild[(_e209 * 8u) + _e212], static_cast<int>(cell), metal::memory_order_relaxed);\n                        }\n                        int _e216 = locked_ch;\n                        locked_ch = metal::max(_e216, static_cast<int>(cell));\n                        uint _e219 = depth;\n                        depth = _e219 + 1u;\n                        n = cell;\n                        float _e222 = r;\n                        r = _e222 * 0.5;\n                        metal::float3 _e225 = rdp;\n                        int _e226 = ch;\n                        metal::float3 _e229 = nodeSrc[_e226].position;\n                        metal::float3 compare_2 = metal::step(_e225, _e229);\n                        j = (static_cast<uint>(compare_2.x) << 0u) | ((static_cast<uint>(compare_2.y) << 1u) + (static_cast<uint>(compare_2.z) << 2u));\n                        uint _e247 = j;\n                        int _e250 = ch;\n                        metal::atomic_store_explicit(&treeChild[(cell * 8u) + _e247], _e250, metal::memory_order_relaxed);\n                        metal::float3 _e251 = rdp;\n                        metal::float3 _e252 = pos;\n                        metal::float3 compare_3 = metal::step(_e251, _e252);\n                        j = (static_cast<uint>(compare_3.x) << 0u) | ((static_cast<uint>(compare_3.y) << 1u) + (static_cast<uint>(compare_3.z) << 2u));\n                        float _e268 = r;\n                        float _e271 = r;\n                        dp = metal::float3(-_e268) + (compare_3 * (2.0 * _e271));\n                        metal::float3 _e276 = rdp;\n                        metal::float3 _e277 = dp;\n                        rdp = _e276 + _e277;\n                        uint _e279 = n;\n                        uint _e282 = j;\n                        int _e285 = metal::atomic_load_explicit(&treeChild[(_e279 * 8u) + _e282], metal::memory_order_relaxed);\n                        ch = _e285;\n                        int _e286 = ch;\n                        if (_e286 < 0) {\n                            break;\n                        }\n                    }\n                    uint _e289 = n;\n                    uint _e292 = j;\n                    uint _e295 = index_1;\n                    metal::atomic_store_explicit(&treeChild[(_e289 * 8u) + _e292], static_cast<int>(_e295), metal::memory_order_relaxed);\n                    uint _e297 = depth;\n                    uint _e298 = local_max_depth;\n                    local_max_depth = metal::max(_e297, _e298);\n                    uint _e300 = index_1;\n                    index_1 = _e300 + inc;\n                    skip = 2;\n                }\n            }\n        }\n        metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\n        int _e303 = skip;\n        if (_e303 == 2) {\n            int _e307 = locked_ch;\n            metal::atomic_store_explicit(&treeChild[locked], _e307, metal::memory_order_relaxed);\n        }\n    }\n    uint _e309 = local_max_depth;\n    uint _e310 = metal::atomic_fetch_max_explicit(&bhTree.max_depth, _e309, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct clear_2_Input {\n};\nkernel void clear_2_(\n  metal::uint3 global_invocation_id_6 [[thread_position_in_grid]]\n, device type_11& treeNode [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint total_6 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint index_10 = global_invocation_id_6.x;\n    if (index_10 >= total_6) {\n        return;\n    }\n    treeNode[index_10].position = metal::float3(0.0);\n    treeNode[index_10].count = -1;\n    treeNode[index_10].sort = 0;\n    metal::atomic_store_explicit(&treeNode[index_10].start, -1, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&treeNode[index_10].mass, -1, metal::memory_order_relaxed);\n    return;\n}\n\n\nstruct summarizationInput {\n};\nkernel void summarization(\n  metal::uint3 global_invocation_id_7 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device BHTree const& bhTree [[user(fake0)]]\n, device type_11& treeNode [[user(fake0)]]\n, device type_9 const& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index_2 = {};\n    type_14 schild = {};\n    type_14 smass = {};\n    int j_1 = 0;\n    uint ch_1 = {};\n    uint i_2 = {};\n    int cm = {};\n    metal::float3 pos_1 = {};\n    int cnt = {};\n    int j_2 = 0;\n    bool flag = false;\n    uint i_3 = {};\n    uint i_4 = {};\n    int cm_1 = {};\n    metal::float3 pos_2 = {};\n    int cnt_1 = {};\n    uint bottom = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed);\n    uint tree_node_count_2 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint node_count_1 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint inc_1 = metal::min(node_count_1, 16384u);\n    index_2 = static_cast<uint>((static_cast<int>(bottom) & -32) + static_cast<int>(global_invocation_id_7.x));\n    uint _e27 = index_2;\n    if (_e27 < bottom) {\n        uint _e29 = index_2;\n        index_2 = _e29 + inc_1;\n    }\n    uint restart = index_2;\n    bool loop_init_3 = true;\n    while(true) {\n        if (!loop_init_3) {\n            int _e39 = j_1;\n            j_1 = _e39 + 1;\n        }\n        loop_init_3 = false;\n        int _e36 = j_1;\n        if (_e36 < 5) {\n        } else {\n            break;\n        }\n        while(true) {\n            uint _e42 = index_2;\n            if (_e42 <= tree_node_count_2) {\n            } else {\n                break;\n            }\n            uint _e44 = index_2;\n            int _e47 = metal::atomic_load_explicit(&treeNode[_e44].mass, metal::memory_order_relaxed);\n            if (_e47 < 0) {\n                ch_1 = 0u;\n                i_2 = 0u;\n                i_2 = 0u;\n                bool loop_init_4 = true;\n                while(true) {\n                    if (!loop_init_4) {\n                        uint _e58 = i_2;\n                        i_2 = _e58 + 1u;\n                    }\n                    loop_init_4 = false;\n                    uint _e55 = i_2;\n                    if (_e55 < 8u) {\n                    } else {\n                        break;\n                    }\n                    uint _e61 = index_2;\n                    uint _e64 = i_2;\n                    int _e67 = metal::atomic_load_explicit(&treeChild[(_e61 * 8u) + _e64], metal::memory_order_relaxed);\n                    ch_1 = static_cast<uint>(_e67);\n                    uint _e69 = i_2;\n                    uint _e71 = ch_1;\n                    schild.inner[_e69] = static_cast<int>(_e71);\n                    uint _e73 = i_2;\n                    uint _e75 = ch_1;\n                    int _e78 = metal::atomic_load_explicit(&treeNode[_e75].mass, metal::memory_order_relaxed);\n                    smass.inner[_e73] = _e78;\n                    uint _e79 = ch_1;\n                    uint _e81 = i_2;\n                    int _e83 = smass.inner[_e81];\n                    if ((_e79 >= node_count_1) && (_e83 < 0)) {\n                        break;\n                    }\n                }\n                uint _e87 = i_2;\n                if (_e87 == 8u) {\n                    cm = 0;\n                    pos_1 = metal::float3(0.0);\n                    cnt = 0;\n                    i_2 = 0u;\n                    bool loop_init_5 = true;\n                    while(true) {\n                        if (!loop_init_5) {\n                            uint _e101 = i_2;\n                            i_2 = _e101 + 1u;\n                        }\n                        loop_init_5 = false;\n                        uint _e98 = i_2;\n                        if (_e98 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e104 = i_2;\n                        int _e106 = schild.inner[_e104];\n                        if (_e106 >= 0) {\n                            uint _e109 = i_2;\n                            int _e111 = schild.inner[_e109];\n                            uint ch_2 = static_cast<uint>(_e111);\n                            if (ch_2 >= node_count_1) {\n                                uint _e114 = i_2;\n                                int m = smass.inner[_e114];\n                                int _e117 = cnt;\n                                int _e120 = treeNode[ch_2].count;\n                                cnt = _e117 + _e120;\n                                metal::float3 _e122 = pos_1;\n                                metal::float3 _e125 = treeNode[ch_2].position;\n                                pos_1 = _e122 + (_e125 * static_cast<float>(m));\n                                int _e129 = cm;\n                                cm = _e129 + m;\n                            } else {\n                                uint _e133 = metal::atomic_load_explicit(&nodeSrc[ch_2].mass, metal::memory_order_relaxed);\n                                int m_1 = static_cast<int>(_e133);\n                                int _e135 = cnt;\n                                cnt = _e135 + 1;\n                                metal::float3 _e138 = pos_1;\n                                metal::float3 _e141 = nodeSrc[ch_2].position;\n                                pos_1 = _e138 + (_e141 * static_cast<float>(m_1));\n                                int _e145 = cm;\n                                cm = _e145 + m_1;\n                            }\n                        }\n                    }\n                    uint _e147 = index_2;\n                    int _e150 = cnt;\n                    treeNode[_e147].count = _e150;\n                    uint _e151 = index_2;\n                    metal::float3 _e154 = pos_1;\n                    int _e155 = cm;\n                    treeNode[_e151].position = _e154 / metal::float3(static_cast<float>(_e155));\n                    uint _e159 = index_2;\n                    int _e162 = cm;\n                    metal::atomic_store_explicit(&treeNode[_e159].mass, _e162, metal::memory_order_relaxed);\n                }\n            }\n            uint _e163 = index_2;\n            index_2 = _e163 + inc_1;\n        }\n        index_2 = restart;\n    }\n    while(true) {\n        uint _e169 = index_2;\n        if (_e169 <= tree_node_count_2) {\n        } else {\n            break;\n        }\n        uint _e171 = index_2;\n        uint _e175 = index_2;\n        uint _e177 = index_2;\n        int _e180 = metal::atomic_load_explicit(&treeNode[_e177].mass, metal::memory_order_relaxed);\n        if (_e171 < node_count_1) {\n            uint _e173 = index_2;\n            index_2 = _e173 + inc_1;\n        } else {\n            if ((_e175 >= node_count_1) && (_e180 >= 0)) {\n                uint _e184 = index_2;\n                index_2 = _e184 + inc_1;\n            } else {\n                int _e186 = j_2;\n                if (_e186 == 0) {\n                    j_2 = 8;\n                    i_3 = 0u;\n                    bool loop_init_6 = true;\n                    while(true) {\n                        if (!loop_init_6) {\n                            uint _e195 = i_3;\n                            i_3 = _e195 + 1u;\n                        }\n                        loop_init_6 = false;\n                        uint _e192 = i_3;\n                        if (_e192 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e198 = index_2;\n                        uint _e201 = i_3;\n                        int ch_3 = metal::atomic_load_explicit(&treeChild[(_e198 * 8u) + _e201], metal::memory_order_relaxed);\n                        uint _e205 = i_3;\n                        schild.inner[_e205] = ch_3;\n                        uint _e207 = i_3;\n                        int _e211 = metal::atomic_load_explicit(&treeNode[ch_3].mass, metal::memory_order_relaxed);\n                        smass.inner[_e207] = _e211;\n                        uint _e214 = i_3;\n                        int _e216 = smass.inner[_e214];\n                        if ((ch_3 < static_cast<int>(node_count_1)) || (_e216 >= 0)) {\n                            int _e220 = j_2;\n                            j_2 = _e220 - 1;\n                        }\n                    }\n                } else {\n                    j_2 = 8;\n                    i_4 = 0u;\n                    bool loop_init_7 = true;\n                    while(true) {\n                        if (!loop_init_7) {\n                            uint _e229 = i_4;\n                            i_4 = _e229 + 1u;\n                        }\n                        loop_init_7 = false;\n                        uint _e226 = i_4;\n                        if (_e226 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e232 = i_4;\n                        int _e234 = schild.inner[_e232];\n                        uint ch_4 = static_cast<uint>(_e234);\n                        uint _e236 = i_4;\n                        int old_mass = smass.inner[_e236];\n                        uint _e239 = i_4;\n                        int _e243 = metal::atomic_load_explicit(&treeNode[ch_4].mass, metal::memory_order_relaxed);\n                        smass.inner[_e239] = _e243;\n                        uint _e248 = i_4;\n                        int _e250 = smass.inner[_e248];\n                        if (((ch_4 < node_count_1) || (old_mass >= 0)) || (_e250 >= 0)) {\n                            int _e254 = j_2;\n                            j_2 = _e254 - 1;\n                        }\n                    }\n                }\n                int _e257 = j_2;\n                if (_e257 == 0) {\n                    cm_1 = 0;\n                    pos_2 = metal::float3(0.0);\n                    cnt_1 = 0;\n                    i_4 = 0u;\n                    bool loop_init_8 = true;\n                    while(true) {\n                        if (!loop_init_8) {\n                            uint _e271 = i_4;\n                            i_4 = _e271 + 1u;\n                        }\n                        loop_init_8 = false;\n                        uint _e268 = i_4;\n                        if (_e268 < 8u) {\n                        } else {\n                            break;\n                        }\n                        uint _e274 = i_4;\n                        int _e276 = schild.inner[_e274];\n                        if (_e276 >= 0) {\n                            uint _e279 = i_4;\n                            int _e281 = schild.inner[_e279];\n                            uint ch_5 = static_cast<uint>(_e281);\n                            if (ch_5 >= node_count_1) {\n                                uint _e284 = i_4;\n                                int m_2 = smass.inner[_e284];\n                                int _e287 = cnt_1;\n                                int _e290 = treeNode[ch_5].count;\n                                cnt_1 = _e287 + _e290;\n                                metal::float3 _e292 = pos_2;\n                                metal::float3 _e295 = treeNode[ch_5].position;\n                                pos_2 = _e292 + (_e295 * static_cast<float>(m_2));\n                                int _e299 = cm_1;\n                                cm_1 = _e299 + m_2;\n                            } else {\n                                uint _e303 = metal::atomic_load_explicit(&nodeSrc[ch_5].mass, metal::memory_order_relaxed);\n                                int m_3 = static_cast<int>(_e303);\n                                int _e305 = cnt_1;\n                                cnt_1 = _e305 + 1;\n                                metal::float3 _e308 = pos_2;\n                                metal::float3 _e311 = nodeSrc[ch_5].position;\n                                pos_2 = _e308 + (_e311 * static_cast<float>(m_3));\n                                int _e315 = cm_1;\n                                cm_1 = _e315 + m_3;\n                            }\n                        }\n                    }\n                    uint _e317 = index_2;\n                    int _e320 = cnt_1;\n                    treeNode[_e317].count = _e320;\n                    uint _e321 = index_2;\n                    metal::float3 _e324 = pos_2;\n                    int _e325 = cm_1;\n                    treeNode[_e321].position = _e324 / metal::float3(static_cast<float>(_e325));\n                    flag = true;\n                }\n            }\n        }\n        bool _e330 = flag;\n        if (_e330) {\n            uint _e331 = index_2;\n            if (_e331 < node_count_1) {\n                uint _e333 = index_2;\n                int _e336 = cm_1;\n                metal::atomic_store_explicit(&nodeSrc[_e333].mass, static_cast<uint>(_e336), metal::memory_order_relaxed);\n            } else {\n                uint _e338 = index_2;\n                int _e341 = cm_1;\n                metal::atomic_store_explicit(&treeNode[_e338].mass, _e341, metal::memory_order_relaxed);\n            }\n            uint _e342 = index_2;\n            index_2 = _e342 + inc_1;\n            flag = false;\n        }\n    }\n    return;\n}\n\n\nstruct sortInput {\n};\nkernel void sort(\n  metal::uint3 global_invocation_id_8 [[thread_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, device BHTree const& bhTree [[user(fake0)]]\n, device type_11& treeNode [[user(fake0)]]\n, device type_9& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint index_3 = {};\n    int start = {};\n    uint j_3 = {};\n    uint i_5 = {};\n    uint tree_node_count_3 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint bottom_1 = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed);\n    uint node_count_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint inc_2 = metal::min(node_count_2, 16384u);\n    index_3 = ((tree_node_count_3 + 1u) - inc_2) + global_invocation_id_8.x;\n    while(true) {\n        uint _e25 = index_3;\n        if (_e25 >= bottom_1) {\n        } else {\n            break;\n        }\n        uint _e27 = index_3;\n        int _e30 = metal::atomic_load_explicit(&treeNode[_e27].start, metal::memory_order_relaxed);\n        start = _e30;\n        int _e32 = start;\n        if (_e32 >= 0) {\n            j_3 = 0u;\n            i_5 = 0u;\n            bool loop_init_9 = true;\n            while(true) {\n                if (!loop_init_9) {\n                    uint _e42 = i_5;\n                    i_5 = _e42 + 1u;\n                }\n                loop_init_9 = false;\n                uint _e39 = i_5;\n                if (_e39 < 8u) {\n                } else {\n                    break;\n                }\n                uint _e45 = index_3;\n                uint _e48 = i_5;\n                int ch_6 = metal::atomic_load_explicit(&treeChild[(_e45 * 8u) + _e48], metal::memory_order_relaxed);\n                if (ch_6 >= 0) {\n                    uint _e54 = i_5;\n                    uint _e55 = j_3;\n                    if (_e54 != _e55) {\n                        uint _e57 = index_3;\n                        uint _e60 = i_5;\n                        metal::atomic_store_explicit(&treeChild[(_e57 * 8u) + _e60], -1, metal::memory_order_relaxed);\n                        uint _e64 = index_3;\n                        uint _e67 = j_3;\n                        metal::atomic_store_explicit(&treeChild[(_e64 * 8u) + _e67], ch_6, metal::memory_order_relaxed);\n                    }\n                    uint _e70 = j_3;\n                    j_3 = _e70 + 1u;\n                    if (ch_6 >= static_cast<int>(node_count_2)) {\n                        int _e77 = start;\n                        metal::atomic_store_explicit(&treeNode[ch_6].start, _e77, metal::memory_order_relaxed);\n                        int _e78 = start;\n                        int _e81 = treeNode[ch_6].count;\n                        start = _e78 + _e81;\n                    } else {\n                        int _e83 = start;\n                        treeNode[_e83].sort = ch_6;\n                        int _e86 = start;\n                        start = _e86 + 1;\n                    }\n                }\n            }\n            uint _e89 = index_3;\n            if (_e89 < inc_2) {\n                break;\n            }\n            uint _e91 = index_3;\n            index_3 = _e91 - inc_2;\n        }\n    }\n    return;\n}\n\n\nstruct electron_forceInput {\n};\nkernel void electron_force(\n  metal::uint3 global_invocation_id_9 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device BHTree const& bhTree [[user(fake0)]]\n, device type_11 const& treeNode [[user(fake0)]]\n, device type_9 const& treeChild [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    type_16 spos = {};\n    type_16 snode = {};\n    type_17 sdq = {};\n    uint j_4 = 1u;\n    uint index_4 = {};\n    metal::float3 af = {};\n    uint depth_1 = {};\n    uint pd = {};\n    uint nd = {};\n    metal::float3 dp_1 = {};\n    uint tree_node_count_4 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u;\n    uint node_count_3 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint inc_3 = metal::min(node_count_3, 16384u);\n    float epssq = 0.05000000074505806 * 0.05000000074505806;\n    float _e26 = bhTree.radius;\n    float diameter = _e26 * 2.0;\n    uint max_depth = metal::atomic_load_explicit(&bhTree.max_depth, metal::memory_order_relaxed);\n    sdq.inner[0] = (diameter * diameter) * 1.0;\n    bool loop_init_10 = true;\n    while(true) {\n        if (!loop_init_10) {\n            uint _e39 = j_4;\n            j_4 = _e39 + 1u;\n        }\n        loop_init_10 = false;\n        uint _e37 = j_4;\n        if (_e37 < max_depth) {\n        } else {\n            break;\n        }\n        uint _e42 = j_4;\n        uint _e44 = j_4;\n        float _e48 = sdq.inner[_e44 - 1u];\n        sdq.inner[_e42] = _e48 * 0.25;\n        uint _e51 = j_4;\n        float _e55 = sdq.inner[_e51 - 1u];\n        sdq.inner[_e51 - 1u] = _e55 + epssq;\n    }\n    float _e60 = sdq.inner[max_depth - 1u];\n    sdq.inner[max_depth - 1u] = _e60 + epssq;\n    if (max_depth < 48u) {\n        index_4 = global_invocation_id_9.x;\n        bool loop_init_11 = true;\n        while(true) {\n            if (!loop_init_11) {\n                uint _e68 = index_4;\n                index_4 = _e68 + inc_3;\n            }\n            loop_init_11 = false;\n            uint _e66 = index_4;\n            if (_e66 < node_count_3) {\n            } else {\n                break;\n            }\n            uint _e70 = index_4;\n            int order = treeNode[_e70].sort;\n            metal::float3 pos_4 = nodeSrc[order].position;\n            af = metal::float3(0.0);\n            depth_1 = 0u;\n            spos.inner[0] = 0u;\n            snode.inner[0] = tree_node_count_4;\n            while(true) {\n                uint _e87 = depth_1;\n                uint _e89 = spos.inner[_e87];\n                pd = _e89;\n                uint _e91 = depth_1;\n                uint _e93 = snode.inner[_e91];\n                nd = _e93;\n                while(true) {\n                    uint _e95 = pd;\n                    if (_e95 < 8u) {\n                    } else {\n                        break;\n                    }\n                    uint _e98 = nd;\n                    uint _e101 = pd;\n                    int n_1 = metal::atomic_load_explicit(&treeChild[(_e98 * 8u) + _e101], metal::memory_order_relaxed);\n                    uint _e105 = pd;\n                    pd = _e105 + 1u;\n                    if (n_1 >= 0) {\n                        uint n_2 = static_cast<uint>(n_1);\n                        if (n_2 < node_count_3) {\n                            metal::float3 _e115 = nodeSrc[n_2].position;\n                            dp_1 = pos_4 - _e115;\n                        } else {\n                            metal::float3 _e119 = treeNode[n_2].position;\n                            dp_1 = pos_4 - _e119;\n                        }\n                        metal::float3 _e121 = dp_1;\n                        metal::float3 _e122 = dp_1;\n                        float dist2_ = metal::dot(_e121, _e122);\n                        if (n_2 < node_count_3) {\n                            if (dist2_ > 0.0) {\n                                uint _e129 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed);\n                                uint _e134 = metal::atomic_load_explicit(&nodeSrc[n_2].mass, metal::memory_order_relaxed);\n                                float factor = ((0.0003000000142492354 * static_cast<float>(_e129)) * static_cast<float>(_e134)) / dist2_;\n                                metal::float3 _e138 = af;\n                                metal::float3 _e139 = dp_1;\n                                af = _e138 + (_e139 * factor);\n                            }\n                        } else {\n                            uint _e142 = depth_1;\n                            float _e144 = sdq.inner[_e142];\n                            if (dist2_ >= _e144) {\n                                if (dist2_ > 0.0) {\n                                    uint _e150 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed);\n                                    int _e155 = metal::atomic_load_explicit(&treeNode[n_2].mass, metal::memory_order_relaxed);\n                                    float factor_1 = ((0.0003000000142492354 * static_cast<float>(_e150)) * static_cast<float>(_e155)) / dist2_;\n                                    metal::float3 _e159 = af;\n                                    metal::float3 _e160 = dp_1;\n                                    af = _e159 + (_e160 * factor_1);\n                                }\n                            } else {\n                                uint _e163 = depth_1;\n                                uint _e165 = pd;\n                                spos.inner[_e163] = _e165;\n                                uint _e166 = depth_1;\n                                uint _e168 = nd;\n                                snode.inner[_e166] = _e168;\n                                uint _e169 = depth_1;\n                                depth_1 = _e169 + 1u;\n                                pd = 0u;\n                                nd = n_2;\n                            }\n                        }\n                    } else {\n                        pd = 8u;\n                    }\n                }\n                uint _e174 = depth_1;\n                if (_e174 == 0u) {\n                    break;\n                }\n                uint _e177 = depth_1;\n                depth_1 = _e177 - 1u;\n            }\n            metal::float3 _e182 = nodeSrc[order].force;\n            metal::float3 _e183 = af;\n            nodeSrc[order].force = _e182 + _e183;\n        }\n        return;\n    } else {\n        return;\n    }\n}\n\n\nstruct main_Input {\n};\nkernel void main_(\n  metal::uint3 global_invocation_id_10 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, device type_9& springForceSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 spring_force = {};\n    uint total_7 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_11 = global_invocation_id_10.x;\n    if (index_11 >= total_7) {\n        return;\n    }\n    metal::float3 vPos_3 = nodeSrc[index_11].position;\n    uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_11].mass, metal::memory_order_relaxed);\n    float mass_1 = static_cast<float>(_e19);\n    spring_force = metal::float3(0.0);\n    int _e31 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 0u], metal::memory_order_relaxed);\n    spring_force.x = as_type<float>(_e31);\n    int _e39 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 1u], metal::memory_order_relaxed);\n    spring_force.y = as_type<float>(_e39);\n    int _e47 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 2u], metal::memory_order_relaxed);\n    spring_force.z = as_type<float>(_e47);\n    metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 0u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 1u], 0, metal::memory_order_relaxed);\n    metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 2u], 0, metal::memory_order_relaxed);\n    metal::float3 _e67 = spring_force;\n    spring_force = _e67 * 100.0;\n    metal::float3 _e72 = nodeSrc[index_11].force;\n    metal::float3 _e73 = spring_force;\n    nodeSrc[index_11].force = _e72 + _e73;\n    return;\n}\n\n\nstruct displacementInput {\n};\nkernel void displacement(\n  metal::uint3 global_invocation_id_11 [[thread_position_in_grid]]\n, device type_6& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    uint total_8 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_12 = global_invocation_id_11.x;\n    if (index_12 >= total_8) {\n        return;\n    }\n    metal::float3 _e17 = nodeSrc[index_12].force;\n    metal::float3 _e20 = nodeSrc[index_12].prev_force;\n    metal::float3 d_force = _e17 - _e20;\n    float swg = metal::sqrt(metal::dot(d_force, d_force));\n    uint _e31 = metal::atomic_load_explicit(&nodeSrc[index_12].mass, metal::memory_order_relaxed);\n    float factor_2 = (1.0 / (1.0 + metal::sqrt(1.0 * swg))) / static_cast<float>(_e31);\n    metal::float3 _e36 = nodeSrc[index_12].position;\n    metal::float3 _e39 = nodeSrc[index_12].force;\n    nodeSrc[index_12].position = _e36 + ((_e39 * factor_2) * 0.009999999776482582);\n    metal::float3 _e48 = nodeSrc[index_12].force;\n    nodeSrc[index_12].prev_force = _e48;\n    nodeSrc[index_12].force = metal::float3(0.0);\n    return;\n}\n\n\nstruct randomizeInput {\n};\nkernel void randomize(\n  metal::uint3 global_invocation_id_12 [[thread_position_in_grid]]\n, constant Uniforms& uniforms [[user(fake0)]]\n, device type_6& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 vPos_1 = {};\n    uint total_9 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_13 = global_invocation_id_12.x;\n    if (index_13 >= total_9) {\n        return;\n    }\n    metal::float3 _e16 = nodeSrc[index_13].position;\n    vPos_1 = _e16;\n    uint _e22 = uniforms.frame_num;\n    float _e25 = random_xy(index_13, 0u + (3u * _e22));\n    vPos_1.x = (_e25 * 2.0) - 1.0;\n    uint _e34 = uniforms.frame_num;\n    float _e37 = random_xy(index_13, 1u + (3u * _e34));\n    vPos_1.y = (_e37 * 2.0) - 1.0;\n    uint _e46 = uniforms.frame_num;\n    float _e49 = random_xy(index_13, 2u + (3u * _e46));\n    vPos_1.z = (_e49 * 2.0) - 1.0;\n    metal::float3 _e56 = vPos_1;\n    nodeSrc[index_13].position = _e56;\n    nodeSrc[index_13].force = metal::float3(0.0);\n    nodeSrc[index_13].prev_force = metal::float3(0.0);\n    return;\n}\n\n\nstruct copyInput {\n};\nkernel void copy(\n  metal::uint3 global_invocation_id_13 [[thread_position_in_grid]]\n, device type_6 const& nodeSrc [[user(fake0)]]\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\n) {\n    metal::float3 vPos_2 = {};\n    uint total_10 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48;\n    uint index_14 = global_invocation_id_13.x;\n    if (index_14 >= total_10) {\n        return;\n    }\n    metal::float3 _e16 = nodeSrc[index_14].position;\n    vPos_2 = _e16;\n    return;\n}\n"
  },
  {
    "path": "lib/naga/debug/CS_boids.wgsl",
    "content": "struct Node {\r\n    position: vec3<f32>,\r\n    force: vec3<f32>,\r\n    prev_force: vec3<f32>,\r\n    mass: atomic<u32>,\r\n};\r\n\r\nstruct Uniforms {\r\n    frame_num: u32,\r\n};\r\n\r\nstruct Bound {\r\n    bound_min: vec3<f32>,\r\n    bound_max: vec3<f32>,\r\n}\r\n\r\nstruct BHTree {\r\n    max_depth: atomic<u32>,\r\n    bottom: atomic<u32>,\r\n    radius: f32,\r\n}\r\n\r\nstruct BHTreeNode {\r\n    position: vec3<f32>,\r\n    mass: atomic<i32>,\r\n    count: i32,\r\n    start: atomic<i32>,\r\n    sort: i32,\r\n}\r\n\r\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\r\n@group(0) @binding(1) var<storage, read_write> nodeSrc: array<Node>;\r\n@group(0) @binding(2) var<storage, read> edgeSrc: array<vec2<u32>>;\r\n@group(0) @binding(3) var<storage, read_write> springForceSrc: array<atomic<i32>>;\r\n@group(0) @binding(4) var<storage, read_write> bounding: array<Bound>;\r\n@group(0) @binding(5) var<storage, read_write> bhTree: BHTree;\r\n@group(0) @binding(6) var<storage, read_write> treeNode: array<BHTreeNode>;\r\n@group(0) @binding(7) var<storage, read_write> treeChild: array<atomic<i32>>;\r\n\r\nfn hash(s: u32) -> u32 {\r\n    var t : u32 = s;\r\n    t ^= 2747636419u;\r\n    t *= 2654435769u;\r\n    t ^= t >> 16u;\r\n    t *= 2654435769u;\r\n    t ^= t >> 16u;\r\n    t *= 2654435769u;\r\n    return t;\r\n}\r\n\r\nfn random(seed: u32) -> f32 {\r\n    return f32(hash(seed)) / 4294967295.0; // 2^32-1\r\n}\r\n\r\nfn random_xy(seed_x: u32, seed_y: u32) -> f32 {\r\n    return f32(hash(hash(seed_x) + seed_y)) / 4294967295.0; // 2^32-1\r\n}\r\n\r\nfn atomic_add_f32(springIndex: u32, updateValue: f32) {\r\n    let atomic_ptr = &springForceSrc[springIndex];\r\n    var new_u32 = bitcast<i32>(updateValue);\r\n    var assumed: i32 = 0;\r\n    var origin: i32;\r\n    while (true) {\r\n        origin = atomicCompareExchangeWeak(atomic_ptr, assumed, new_u32);\r\n        if (origin == assumed) {\r\n            break;\r\n        }\r\n        assumed = origin;\r\n        new_u32 = bitcast<i32>(bitcast<f32>(origin) + updateValue);\r\n    }\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn gen_node(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n\r\n    let total = arrayLength(&nodeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    var vPos : vec3<f32> = nodeSrc[index].position;\r\n\r\n    vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0;\r\n    vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0;\r\n    vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0;\r\n\r\n    // Write back\r\n    nodeSrc[index].position = vPos;\r\n    nodeSrc[index].force = vec3<f32>(0.0);\r\n    nodeSrc[index].prev_force = vec3<f32>(0.0);\r\n    atomicStore(&nodeSrc[index].mass, 1u);\r\n    atomicStore(&springForceSrc[index * 3u + 0u], 0);\r\n    atomicStore(&springForceSrc[index * 3u + 1u], 0);\r\n    atomicStore(&springForceSrc[index * 3u + 2u], 0);\r\n    let target_node: u32 = index * 3u + 2u;\r\n    let aa = atomicExchange(&springForceSrc[target_node], 0);\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn cal_mass(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&edgeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    var edge = edgeSrc[index];\r\n    let source_node: u32 = edge[0];\r\n    let target_node: u32 = edge[1];\r\n\r\n    atomicAdd(&nodeSrc[source_node].mass, 1u);\r\n    atomicAdd(&nodeSrc[target_node].mass, 1u);\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn cal_gravity_force(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&nodeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    // TODO: Global Param\r\n    let strong_gravity = true;\r\n    let k_gravity = 1.0;\r\n\r\n    let pos = nodeSrc[index].position;\r\n    let mass = f32(atomicLoad(&nodeSrc[index].mass));\r\n    var gravity_force: f32;\r\n    if (strong_gravity) {\r\n        gravity_force =  k_gravity * mass;\r\n    } else {\r\n        if (pos.x != 0.0 || pos.y != 0.0 || pos.z != 0.0) {\r\n            gravity_force = k_gravity * mass * inverseSqrt(dot(pos, pos));\r\n        }\r\n        else {\r\n            gravity_force = 0.0;\r\n        }\r\n    }\r\n    nodeSrc[index].force +=  -pos * gravity_force;\r\n//    nodeSrc[index].force +=  -pos * 2.;\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn attractive_force(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&edgeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    var edge = edgeSrc[index];\r\n    let source_node: u32 = edge[0];\r\n    let target_node: u32 = edge[1];\r\n\r\n    var dir = nodeSrc[target_node].position - nodeSrc[source_node].position;\r\n\r\n    atomic_add_f32(source_node * 3u + 0u, dir.x);\r\n    atomic_add_f32(source_node * 3u + 1u, dir.y);\r\n    atomic_add_f32(source_node * 3u + 2u, dir.z);\r\n    atomic_add_f32(target_node * 3u + 0u, -dir.x);\r\n    atomic_add_f32(target_node * 3u + 1u, -dir.y);\r\n    atomic_add_f32(target_node * 3u + 2u, -dir.z);\r\n}\r\n\r\nvar<workgroup> smin: array<vec3<f32>, 256>;\r\nvar<workgroup> smax: array<vec3<f32>, 256>;\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn reduction_bounding(\r\n    @builtin(local_invocation_index) local_index: u32,\r\n    @builtin(global_invocation_id) global_id: vec3<u32>,\r\n    @builtin(workgroup_id) group_id: vec3<u32>,\r\n) {\r\n\r\n    var index = global_id.x;\r\n    let total = arrayLength(&nodeSrc);\r\n    if (index >= total) {\r\n        index = total - 1u;\r\n    }\r\n\r\n    smin[local_index] = nodeSrc[index].position;\r\n    smax[local_index] = nodeSrc[index].position;\r\n    workgroupBarrier();\r\n\r\n    for (var s = 256u / 2u; s > 0u; s >>= 1u) {\r\n        if (local_index < s) {\r\n            let k = local_index + s;\r\n            smin[local_index] = min(smin[local_index], smin[k]);\r\n            smax[local_index] = max(smax[local_index], smax[k]);\r\n        }\r\n        workgroupBarrier();\r\n    }\r\n\r\n    if (local_index == 0u) {\r\n        bounding[group_id.x].bound_min = smin[0];\r\n        bounding[group_id.x].bound_max = smax[0];\r\n    }\r\n}\r\n\r\n@compute\r\n@workgroup_size(1)\r\nfn bounding_box() {\r\n    var bound_min_min = bounding[0].bound_min;\r\n    var bound_max_max = bounding[0].bound_max;\r\n    let node_group_count = u32(ceil(f32(arrayLength(&nodeSrc)) / 256.0));\r\n    for (var i = 0u; i < node_group_count; i++) {\r\n        bound_min_min = min(bound_min_min, bounding[i].bound_min);\r\n        bound_max_max = max(bound_max_max, bounding[i].bound_max);\r\n    }\r\n\r\n    bounding[0].bound_min = bound_min_min;\r\n    bounding[0].bound_max = bound_max_max;\r\n\r\n    let box = bound_max_max - bound_min_min;\r\n    let tree_node_count = arrayLength(&treeNode) - 1u;\r\n    bhTree.radius = max(max(box.x, box.y), box.z) * 0.5;\r\n    atomicStore(&bhTree.bottom, tree_node_count);\r\n    atomicStore(&bhTree.max_depth, 0u);\r\n    atomicStore(&treeNode[tree_node_count].mass, -1);\r\n    atomicStore(&treeNode[tree_node_count].start, 0);\r\n    treeNode[tree_node_count].position = (bound_min_min + bound_max_max) * 0.5;\r\n    treeNode[tree_node_count].count = -1;\r\n    treeNode[tree_node_count].sort = 0;\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn clear_1(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&treeNode);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    for (var i = 0u; i < 8u; i++) {\r\n        atomicStore(&treeChild[index * 8u + i], -1);\r\n    }\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn tree_building(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    var index = global_invocation_id.x;\r\n    let node_count = arrayLength(&nodeSrc);\r\n    let tree_node_count = arrayLength(&treeNode) - 1u;\r\n    let root_pos = treeNode[tree_node_count].position;\r\n    let inc = min(node_count, 16384u); // should change\r\n\r\n    var skip = 1;\r\n    var pos: vec3<f32>;\r\n    var dp: vec3<f32>;\r\n    var rdp: vec3<f32>;\r\n    var n = tree_node_count;\r\n    var depth = 1u;\r\n    var local_max_depth = 1u;\r\n    var j = 0u;\r\n    var root_r = bhTree.radius;\r\n    var r = root_r * 0.5;\r\n\r\n    var limit = 10000;\r\n\r\n    while (index < node_count) {\r\n\r\n        limit--;\r\n        if (limit < 0) {\r\n            return;\r\n        }\r\n\r\n        if (skip != 0) {\r\n            skip = 0;\r\n            pos = nodeSrc[index].position;\r\n\r\n            n = tree_node_count;\r\n            r = root_r * 0.5;\r\n            depth = 1u;\r\n            \r\n            let compare = step(root_pos, pos);\r\n            j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); // 八个象限\r\n            dp = -r + compare * (2.0 * r);\r\n            rdp = root_pos + dp; // 所在象限的原点\r\n        }\r\n\r\n        // atomicAdd(&treeChild[n * 8u + j], 0); // ...\r\n        var ch = atomicLoad(&treeChild[n * 8u + j]);\r\n\r\n        // 迭代至叶节点\r\n        while (ch >= i32(node_count)) { \r\n            n = u32(ch);\r\n            depth++;\r\n            r *= 0.5;\r\n\r\n            let compare = step(rdp, pos);\r\n            j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u);\r\n            dp = -r + compare * (2.0 * r);\r\n\r\n            rdp += dp;\r\n            ch = atomicLoad(&treeChild[n * 8u + j]);\r\n        }\r\n\r\n        let locked = n * 8u + j;\r\n        var locked_ch = -1;\r\n\r\n        // 非 lock 状态\r\n        if (ch != -2) {\r\n            if (ch == -1) {\r\n                var v = -1;\r\n                let origin = atomicCompareExchangeWeak(&treeChild[locked], v, i32(index));\r\n                if (origin == -1) {\r\n                    local_max_depth = max(depth, local_max_depth);\r\n                    index += inc;\r\n                    skip = 1;\r\n                } else {\r\n                     skip = 0;\r\n                 }\r\n            } else {\r\n                // 格子已被占用，将其设置为 lock 状态\r\n                var v = ch;\r\n                let origin = atomicCompareExchangeWeak(&treeChild[locked], v, -2);\r\n                if (ch == origin) {\r\n                    // lock 成功，如果两个点的位置相同，做一点微小偏移就行了\r\n                    if (all(nodeSrc[ch].position == pos)) {\r\n                        nodeSrc[index].position += vec3<f32>(0.1, -0.05, 0.1);\r\n                        skip = 0;\r\n                        atomicStore(&treeChild[locked], ch);\r\n                        break;\r\n                    }\r\n\r\n                    // 两个点位置不同，则开始分裂\r\n                    locked_ch = -1;\r\n                    loop {\r\n\r\n                        // 1. create new cell\r\n                        let cell = atomicSub(&bhTree.bottom, 1u) - 1u;\r\n                        if (cell <= node_count) {\r\n                            return;\r\n                        }\r\n                        \r\n                        if (locked_ch != -1) {\r\n                            atomicStore(&treeChild[n * 8u + j], i32(cell));\r\n                        }\r\n                        locked_ch = max(locked_ch, i32(cell));\r\n\r\n                        // 2. make newly created cell current\r\n                        depth++;\r\n                        n = cell;\r\n                        r *= 0.5;\r\n\r\n                        // 3. insert old body into current quadrant\r\n                        let compare = step(rdp, nodeSrc[ch].position);\r\n                        j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u);\r\n\r\n                        atomicStore(&treeChild[cell * 8u + j], ch);\r\n\r\n                        // 4. determin center + quadrant for cell of new body\r\n                        let compare = step(rdp, pos);\r\n                        j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u);\r\n                        dp = -r + compare * (2.0 * r);\r\n\r\n                        rdp += dp;\r\n\r\n                        // 5. visit this cell/chec if in use (possibly by old body)\r\n                        ch = atomicLoad(&treeChild[n * 8u + j]);\r\n\r\n                        if (ch < 0) {\r\n                            break;\r\n                        }\r\n\r\n                    };\r\n                    atomicStore(&treeChild[n * 8u + j], i32(index));\r\n                    local_max_depth = max(depth, local_max_depth);\r\n                    index += inc;\r\n                    skip = 2;\r\n                }\r\n            }\r\n        }\r\n        workgroupBarrier();\r\n        if (skip == 2) {\r\n            atomicStore(&treeChild[locked], locked_ch);\r\n        }\r\n    }\r\n    atomicMax(&bhTree.max_depth, local_max_depth);\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn clear_2(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&treeNode) - 1u;\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n    treeNode[index].position = vec3<f32>(0.0);\r\n    treeNode[index].count = -1;\r\n    treeNode[index].sort = 0;\r\n    atomicStore(&treeNode[index].start, -1);\r\n    atomicStore(&treeNode[index].mass, -1);\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn summarization(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let bottom = atomicLoad(&bhTree.bottom);\r\n    let tree_node_count = arrayLength(&treeNode) - 1u;\r\n    let node_count = arrayLength(&nodeSrc);\r\n    let inc = min(node_count, 16384u);\r\n    var index = u32((i32(bottom) & -32) + i32(global_invocation_id.x));\r\n    if (index < bottom) {\r\n        index += inc;\r\n    }\r\n\r\n    // TODO: ch bounds check\r\n    var schild: array<i32, 8>;\r\n    var smass: array<i32, 8>;\r\n    let restart = index;\r\n    for (var j = 0; j < 5; j++) {\r\n        while (index <= tree_node_count) {\r\n            if (atomicLoad(&treeNode[index].mass) < 0) {\r\n                var ch = 0u;\r\n                var i = 0u;\r\n                for (i = 0u; i < 8u; i++) {\r\n                    ch = u32(atomicLoad(&treeChild[index * 8u + i]));\r\n                    schild[i] = i32(ch);\r\n                    // atomicAdd(&treeNode[ch].mass, 0);\r\n                    smass[i] = atomicLoad(&treeNode[ch].mass);\r\n                    if (ch >= node_count && smass[i] < 0) {\r\n                        break;\r\n                    }\r\n                }\r\n                if (i == 8u) {\r\n                    var cm = 0;\r\n                    var pos = vec3<f32>(0.0);\r\n                    var cnt = 0;\r\n                    for (i = 0u; i < 8u; i++) {\r\n                        if (schild[i] >= 0) {\r\n                            let ch = u32(schild[i]);\r\n                            if (ch >= node_count) {\r\n                                let m = smass[i];\r\n                                cnt += treeNode[ch].count;\r\n                                pos += treeNode[ch].position * f32(m);\r\n                                cm += m;\r\n                            } else {\r\n                                let m = i32(atomicLoad(&nodeSrc[ch].mass));\r\n                                cnt += 1;\r\n                                pos += nodeSrc[ch].position * f32(m);\r\n                                cm += m;\r\n                            }\r\n                        }\r\n                    }\r\n                    treeNode[index].count = cnt;\r\n                    treeNode[index].position = pos / f32(cm);\r\n                    // workgroupBarrier();\r\n                    atomicStore(&treeNode[index].mass, cm);\r\n                }\r\n            }\r\n            index += inc;\r\n        }\r\n        index = restart;\r\n    }\r\n\r\n    var j = 0;\r\n    var flag = false;\r\n    while (index <= tree_node_count) {\r\n        if (index < node_count) {\r\n            index += inc;\r\n        } else if (index >= node_count && atomicLoad(&treeNode[index].mass) >= 0) {\r\n            index += inc;\r\n        } else {\r\n            if (j == 0) {\r\n                j = 8;\r\n                for (var i = 0u; i < 8u; i++) {\r\n                    let ch = atomicLoad(&treeChild[index * 8u + i]);\r\n                    schild[i] = ch;\r\n                    smass[i] = atomicLoad(&treeNode[ch].mass);\r\n                    if (ch < i32(node_count) || smass[i] >= 0) {\r\n                        j--;\r\n                    }\r\n                }\r\n            } else {\r\n                j = 8;\r\n                for (var i = 0u; i < 8u; i++) {\r\n                    let ch = u32(schild[i]);\r\n                    let old_mass = smass[i];\r\n                    smass[i] = atomicLoad(&treeNode[ch].mass);\r\n                    if (ch < node_count || old_mass >= 0 || smass[i] >= 0) {\r\n                        j--;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (j == 0) {\r\n                var cm = 0;\r\n                var pos = vec3<f32>(0.0);\r\n                var cnt = 0;\r\n                for (i = 0u; i < 8u; i++) {\r\n                    if (schild[i] >= 0) {\r\n                        let ch = u32(schild[i]);\r\n                        if (ch >= node_count) {\r\n                            let m = smass[i];\r\n                            cnt += treeNode[ch].count;\r\n                            pos += treeNode[ch].position * f32(m);\r\n                            cm += m;\r\n                        } else {\r\n                            let m = i32(atomicLoad(&nodeSrc[ch].mass));\r\n                            cnt += 1;\r\n                            pos += nodeSrc[ch].position * f32(m);\r\n                            cm += m;\r\n                        }\r\n                    }\r\n                }\r\n                treeNode[index].count = cnt;\r\n                treeNode[index].position = pos / f32(cm);\r\n                flag = true;\r\n            }\r\n        }\r\n        // workgroupBarrier();\r\n        if (flag) {\r\n            if (index < node_count) {\r\n                atomicStore(&nodeSrc[index].mass, u32(cm));\r\n            } else {\r\n                atomicStore(&treeNode[index].mass, cm);\r\n            }\r\n            index += inc;\r\n            flag = false;\r\n        }\r\n    }\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn sort(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let tree_node_count = arrayLength(&treeNode) - 1u;\r\n    let bottom = atomicLoad(&bhTree.bottom);\r\n    let node_count = arrayLength(&nodeSrc);\r\n    let inc = min(node_count, 16384u);\r\n    var index = tree_node_count + 1u - inc + global_invocation_id.x;\r\n\r\n    while (index >= bottom) {\r\n        var start = atomicLoad(&treeNode[index].start);\r\n        if (start >= 0) {\r\n            var j = 0u;\r\n            for (var i = 0u; i < 8u; i++) {\r\n                let ch = atomicLoad(&treeChild[index * 8u + i]);\r\n                if (ch >= 0) {\r\n                    // 把子节点集中到开头\r\n                    if (i != j) {\r\n                        atomicStore(&treeChild[index * 8u + i], -1);\r\n                        atomicStore(&treeChild[index * 8u + j], ch);\r\n                    }\r\n                    j++;\r\n                    if (ch >= i32(node_count)) {\r\n                        atomicStore(&treeNode[ch].start, start);\r\n                        start += treeNode[ch].count;\r\n                    } else {\r\n                        treeNode[start].sort = ch;\r\n                        start++;\r\n                    }\r\n                }\r\n            }\r\n            if (index < inc) {\r\n                break;\r\n            }\r\n            index -= inc;\r\n        }\r\n    }\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn electron_force(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let tree_node_count = arrayLength(&treeNode) - 1u;\r\n    let node_count = arrayLength(&nodeSrc);\r\n    let inc = min(node_count, 16384u);\r\n\r\n    // TODO: Global Param\r\n    let scale = 0.0003;\r\n\r\n    var spos: array<u32, 48>;\r\n    var snode: array<u32, 48>;\r\n    var sdq: array<f32, 48>;\r\n\r\n    let itolsq = 1.0;\r\n    let epssq = 0.05 * 0.05;\r\n    let diameter = bhTree.radius * 2.0;\r\n    let max_depth = atomicLoad(&bhTree.max_depth);\r\n    sdq[0] = diameter * diameter * itolsq;\r\n    for (var j = 1u; j < max_depth; j++) {\r\n        sdq[j] = sdq[j - 1u] * 0.25;\r\n        sdq[j - 1u] += epssq;\r\n    }\r\n    sdq[max_depth - 1u] += epssq;\r\n\r\n    if (max_depth < 48u) {\r\n        for (var index = global_invocation_id.x; index < node_count; index += inc) {\r\n            let order = treeNode[index].sort;\r\n            let pos = nodeSrc[order].position;\r\n            var af = vec3<f32>(0.0);\r\n\r\n            var depth = 0u;\r\n            spos[0] = 0u;\r\n            snode[0] = tree_node_count;\r\n\r\n            loop {\r\n                var pd = spos[depth];\r\n                var nd = snode[depth];\r\n                while (pd < 8u) {\r\n                    let n = atomicLoad(&treeChild[nd * 8u + pd]);\r\n                    pd++;\r\n\r\n                    if (n >= 0) {\r\n                        let n = u32(n);\r\n                        var dp: vec3<f32>;\r\n                        if (n < node_count) {\r\n                            dp = pos - nodeSrc[n].position;\r\n                        } else {\r\n                            dp = pos - treeNode[n].position;\r\n                        }\r\n                        let dist2 = dot(dp, dp);\r\n\r\n                        if (n < node_count) {\r\n                            if (dist2 > 0.0) {\r\n                                let factor = scale * f32(atomicLoad(&nodeSrc[order].mass)) * f32(atomicLoad(&nodeSrc[n].mass)) / dist2;\r\n                                af += dp * factor;\r\n                            }\r\n                        } else if (dist2 >= sdq[depth]) {\r\n                            if (dist2 > 0.0) {\r\n                                let factor = scale * f32(atomicLoad(&nodeSrc[order].mass)) * f32(atomicLoad(&treeNode[n].mass)) / dist2;\r\n                                af += dp * factor; \r\n                            }\r\n                        } else {\r\n                            spos[depth] = pd;\r\n                            snode[depth] = nd;\r\n                            depth++;\r\n                            pd = 0u;\r\n                            nd = n;\r\n                        }\r\n                    } else {\r\n                        pd = 8u;\r\n                    }\r\n                }\r\n                if (depth == 0u) {\r\n                    break;\r\n                }\r\n                depth--;\r\n            }\r\n            nodeSrc[order].force += af;\r\n        }\r\n    }\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&nodeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    let vPos: vec3<f32> = nodeSrc[index].position;\r\n    let mass = f32(atomicLoad(&nodeSrc[index].mass));\r\n\r\n    // TODO: Global Param\r\n    let scaling_ratio = 0.0002;\r\n\r\n    var spring_force = vec3<f32>(0.0);\r\n    spring_force.x = bitcast<f32>(atomicLoad(&springForceSrc[index * 3u + 0u]));\r\n    spring_force.y = bitcast<f32>(atomicLoad(&springForceSrc[index * 3u + 1u]));\r\n    spring_force.z = bitcast<f32>(atomicLoad(&springForceSrc[index * 3u + 2u]));\r\n\r\n    atomicStore(&springForceSrc[index * 3u + 0u], 0);\r\n    atomicStore(&springForceSrc[index * 3u + 1u], 0);\r\n    atomicStore(&springForceSrc[index * 3u + 2u], 0);\r\n    spring_force *= 100.0;\r\n\r\n    nodeSrc[index].force += spring_force;\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn displacement(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&nodeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    // TODO: Global Param\r\n    let global_speed = 1.0;\r\n\r\n    let d_force = nodeSrc[index].force - nodeSrc[index].prev_force;\r\n    let swg = sqrt(dot(d_force, d_force));\r\n    let factor = global_speed / (1.0 + sqrt(global_speed * swg)) / f32(nodeSrc[index].mass);\r\n    \r\n    nodeSrc[index].position += nodeSrc[index].force * factor * 0.01;\r\n    nodeSrc[index].prev_force = nodeSrc[index].force;\r\n    nodeSrc[index].force = vec3<f32>(0.0);\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn randomize(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&nodeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    var vPos : vec3<f32> = nodeSrc[index].position;\r\n\r\n    vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0;\r\n    vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0;\r\n    vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0;\r\n\r\n    // Write back\r\n    nodeSrc[index].position = vPos;\r\n    nodeSrc[index].force = vec3<f32>(0.0);\r\n    nodeSrc[index].prev_force = vec3<f32>(0.0);\r\n}\r\n\r\n@compute\r\n@workgroup_size(256)\r\nfn copy(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    let total = arrayLength(&nodeSrc);\r\n    let index = global_invocation_id.x;\r\n    if (index >= total) {\r\n        return;\r\n    }\r\n\r\n    var vPos : vec3<f32> = nodeSrc[index].position;\r\n    // var vVel : vec3<f32> = nodeSrc[index].velocity;\r\n\r\n  // Write back\r\n    //  nodeSrc[index] = Node(vPos, vVel);\r\n}"
  },
  {
    "path": "lib/naga/debug/atomic.metal",
    "content": "// language: metal2.0\n#include <metal_stdlib>\n#include <simd/simd.h>\n\nusing metal::uint;\n\nstruct _mslBufferSizes {\n    uint size0;\n};\n\ntypedef metal::atomic_int type_1[1];\n\nvoid atomic_add_f32_(\n    uint springIndex,\n    float updateValue,\n    device type_1& arr,\n    constant _mslBufferSizes& _buffer_sizes\n) {\n    int new_u32_ = {};\n    int assumed = 0;\n    int origin = {};\n    new_u32_ = as_type<int>(updateValue);\n    while(true) {\n        if (true) {\n        } else {\n            break;\n        }\n        int _e10 = assumed;\n        int _e11 = new_u32_;\n        metal::atomic_compare_exchange_weak_explicit(&arr[springIndex], &_e10, _e11, metal::memory_order_relaxed, metal::memory_order_relaxed);\n        origin = _e10;\n        int _e13 = origin;\n        int _e14 = assumed;\n        if (_e13 == _e14) {\n            break;\n        }\n        int _e16 = origin;\n        assumed = _e16;\n        int _e17 = origin;\n        new_u32_ = as_type<int>(as_type<float>(_e17) + updateValue);\n    }\n    return;\n}\n\nvoid cas(\n    device type_1& arr,\n    constant _mslBufferSizes& _buffer_sizes\n) {\n    int v = -1;\n    metal::atomic_compare_exchange_weak_explicit(&arr[0], &-1, 1, metal::memory_order_relaxed, metal::memory_order_relaxed);\n    int _e10 = v;\n    metal::atomic_compare_exchange_weak_explicit(&arr[0], &_e10, 1, metal::memory_order_relaxed, metal::memory_order_relaxed);\n    return;\n}\n"
  },
  {
    "path": "lib/naga/debug/atomic.spvasm",
    "content": "; SPIR-V\n; Version: 1.0\n; Generator: rspirv\n; Bound: 11\nOpCapability Shader\nOpCapability Linkage\n%1 = OpExtInstImport \"GLSL.std.450\"\nOpMemoryModel Logical GLSL450\nOpSource GLSL 450\nOpName %7 \"f\"\n%2 = OpTypeVoid\n%4 = OpTypeFloat 32\n%3 = OpConstant  %4  1.0\n%5 = OpConstant  %4  2.0\n%8 = OpTypeFunction %2\n%7 = OpFunction  %2  None %8\n%6 = OpLabel\nOpBranch %9\n%9 = OpLabel\n%10 = OpExtInst  %4  %1 Step %3 %5\nOpReturn\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/debug/atomic.wgsl",
    "content": "fn f() {\r\n    let x = 1.0;\r\n    let y = 2.0;\r\n    let z = step(x, y);\r\n}"
  },
  {
    "path": "lib/naga/fuzz/.gitignore",
    "content": "target\r\ncorpus\r\nartifacts\r\n"
  },
  {
    "path": "lib/naga/fuzz/Cargo.toml",
    "content": "[package]\r\nname = \"naga-fuzz\"\r\nversion = \"0.0.0\"\r\nauthors = [\"Automatically generated\"]\r\npublish = false\r\nedition = \"2018\"\r\n\r\n[package.metadata]\r\ncargo-fuzz = true\r\n\r\n[dependencies]\r\narbitrary = { version = \"1.0.2\", features = [\"derive\"] }\r\nlibfuzzer-sys = \"0.4\"\r\n\r\n[dependencies.naga]\r\npath = \"..\"\r\nfeatures = [\"arbitrary\", \"spv-in\", \"wgsl-in\", \"glsl-in\", \"validate\"]\r\n\r\n# Prevent this from interfering with workspaces\r\n[workspace]\r\nmembers = [\".\"]\r\n\r\n[[bin]]\r\nname = \"spv_parser\"\r\npath = \"fuzz_targets/spv_parser.rs\"\r\ntest = false\r\ndoc = false\r\n\r\n[[bin]]\r\nname = \"wgsl_parser\"\r\npath = \"fuzz_targets/wgsl_parser.rs\"\r\ntest = false\r\ndoc = false\r\n\r\n[[bin]]\r\nname = \"glsl_parser\"\r\npath = \"fuzz_targets/glsl_parser.rs\"\r\ntest = false\r\ndoc = false\r\n\r\n[[bin]]\r\nname = \"ir\"\r\npath = \"fuzz_targets/ir.rs\"\r\ntest = false\r\ndoc = false\r\n"
  },
  {
    "path": "lib/naga/fuzz/fuzz_targets/glsl_parser.rs",
    "content": "#![no_main]\r\nuse arbitrary::Arbitrary;\r\nuse libfuzzer_sys::fuzz_target;\r\nuse naga::{\r\n    front::glsl::{Options, Parser},\r\n    FastHashMap, ShaderStage,\r\n};\r\n\r\n#[derive(Debug, Arbitrary)]\r\nenum ShaderStageProxy {\r\n    Vertex,\r\n    Fragment,\r\n    Compute,\r\n}\r\n\r\nimpl From<ShaderStageProxy> for ShaderStage {\r\n    fn from(proxy: ShaderStageProxy) -> Self {\r\n        match proxy {\r\n            ShaderStageProxy::Vertex => ShaderStage::Vertex,\r\n            ShaderStageProxy::Fragment => ShaderStage::Fragment,\r\n            ShaderStageProxy::Compute => ShaderStage::Compute,\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug, Arbitrary)]\r\nstruct OptionsProxy {\r\n    pub stage: ShaderStageProxy,\r\n    pub defines: FastHashMap<String, String>,\r\n}\r\n\r\nimpl From<OptionsProxy> for Options {\r\n    fn from(proxy: OptionsProxy) -> Self {\r\n        Options {\r\n            stage: proxy.stage.into(),\r\n            defines: proxy.defines,\r\n        }\r\n    }\r\n}\r\n\r\nfuzz_target!(|data: (OptionsProxy, String)| {\r\n    let (options, source) = data;\r\n    // Ensure the parser can handle potentially malformed strings without crashing.\r\n    let mut parser = Parser::default();\r\n    let _result = parser.parse(&options.into(), &source);\r\n});\r\n"
  },
  {
    "path": "lib/naga/fuzz/fuzz_targets/ir.rs",
    "content": "#![no_main]\r\nuse libfuzzer_sys::fuzz_target;\r\n\r\nfuzz_target!(|module: naga::Module| {\r\n    use naga::valid as v;\r\n    // Check if the module validates without errors.\r\n    //TODO: may also fuzz the flags and capabilities\r\n    let mut validator = v::Validator::new(v::ValidationFlags::all(), v::Capabilities::empty());\r\n    let _result = validator.validate(&module);\r\n});\r\n"
  },
  {
    "path": "lib/naga/fuzz/fuzz_targets/spv_parser.rs",
    "content": "#![no_main]\r\nuse libfuzzer_sys::fuzz_target;\r\nuse naga::front::spv::{Options, Parser};\r\n\r\nfuzz_target!(|data: Vec<u32>| {\r\n    // Ensure the parser can handle potentially malformed data without crashing.\r\n    let options = Options::default();\r\n    let _result = Parser::new(data.into_iter(), &options).parse();\r\n});\r\n"
  },
  {
    "path": "lib/naga/fuzz/fuzz_targets/wgsl_parser.rs",
    "content": "#![no_main]\r\nuse libfuzzer_sys::fuzz_target;\r\nuse naga::front::wgsl::Parser;\r\n\r\nfuzz_target!(|data: String| {\r\n    // Ensure the parser can handle potentially malformed strings without crashing.\r\n    let _result = Parser::new().parse(&data);\r\n});\r\n"
  },
  {
    "path": "lib/naga/src/arena.rs",
    "content": "use std::{cmp::Ordering, fmt, hash, marker::PhantomData, num::NonZeroU32, ops};\r\n\r\n/// An unique index in the arena array that a handle points to.\r\n/// The \"non-zero\" part ensures that an `Option<Handle<T>>` has\r\n/// the same size and representation as `Handle<T>`.\r\ntype Index = NonZeroU32;\r\n\r\nuse crate::Span;\r\nuse indexmap::set::IndexSet;\r\n\r\n#[derive(Clone, Copy, Debug, thiserror::Error, PartialEq)]\r\n#[error(\"Handle {index} of {kind} is either not present, or inaccessible yet\")]\r\npub struct BadHandle {\r\n    pub kind: &'static str,\r\n    pub index: usize,\r\n}\r\n\r\n/// A strongly typed reference to an arena item.\r\n///\r\n/// A `Handle` value can be used as an index into an [`Arena`] or [`UniqueArena`].\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n#[cfg_attr(\r\n    any(feature = \"serialize\", feature = \"deserialize\"),\r\n    serde(transparent)\r\n)]\r\n#[cfg_attr(feature = \"arbitrary\", derive(arbitrary::Arbitrary))]\r\npub struct Handle<T> {\r\n    index: Index,\r\n    #[cfg_attr(any(feature = \"serialize\", feature = \"deserialize\"), serde(skip))]\r\n    marker: PhantomData<T>,\r\n}\r\n\r\nimpl<T> Clone for Handle<T> {\r\n    fn clone(&self) -> Self {\r\n        Handle {\r\n            index: self.index,\r\n            marker: self.marker,\r\n        }\r\n    }\r\n}\r\n\r\nimpl<T> Copy for Handle<T> {}\r\n\r\nimpl<T> PartialEq for Handle<T> {\r\n    fn eq(&self, other: &Self) -> bool {\r\n        self.index == other.index\r\n    }\r\n}\r\n\r\nimpl<T> Eq for Handle<T> {}\r\n\r\nimpl<T> PartialOrd for Handle<T> {\r\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\r\n        self.index.partial_cmp(&other.index)\r\n    }\r\n}\r\n\r\nimpl<T> Ord for Handle<T> {\r\n    fn cmp(&self, other: &Self) -> Ordering {\r\n        self.index.cmp(&other.index)\r\n    }\r\n}\r\n\r\nimpl<T> fmt::Debug for Handle<T> {\r\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\r\n        write!(formatter, \"[{}]\", self.index)\r\n    }\r\n}\r\n\r\nimpl<T> hash::Hash for Handle<T> {\r\n    fn hash<H: hash::Hasher>(&self, hasher: &mut H) {\r\n        self.index.hash(hasher)\r\n    }\r\n}\r\n\r\nimpl<T> Handle<T> {\r\n    #[cfg(test)]\r\n    pub const DUMMY: Self = Handle {\r\n        index: unsafe { NonZeroU32::new_unchecked(u32::MAX) },\r\n        marker: PhantomData,\r\n    };\r\n\r\n    pub(crate) const fn new(index: Index) -> Self {\r\n        Handle {\r\n            index,\r\n            marker: PhantomData,\r\n        }\r\n    }\r\n\r\n    /// Returns the zero-based index of this handle.\r\n    pub const fn index(self) -> usize {\r\n        let index = self.index.get() - 1;\r\n        index as usize\r\n    }\r\n\r\n    /// Convert a `usize` index into a `Handle<T>`.\r\n    fn from_usize(index: usize) -> Self {\r\n        use std::convert::TryFrom;\r\n\r\n        let handle_index = u32::try_from(index + 1)\r\n            .ok()\r\n            .and_then(Index::new)\r\n            .expect(\"Failed to insert into arena. Handle overflows\");\r\n        Handle::new(handle_index)\r\n    }\r\n\r\n    /// Convert a `usize` index into a `Handle<T>`, without range checks.\r\n    const unsafe fn from_usize_unchecked(index: usize) -> Self {\r\n        Handle::new(Index::new_unchecked((index + 1) as u32))\r\n    }\r\n}\r\n\r\n/// A strongly typed range of handles.\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n#[cfg_attr(\r\n    any(feature = \"serialize\", feature = \"deserialize\"),\r\n    serde(transparent)\r\n)]\r\n#[cfg_attr(feature = \"arbitrary\", derive(arbitrary::Arbitrary))]\r\npub struct Range<T> {\r\n    inner: ops::Range<u32>,\r\n    #[cfg_attr(any(feature = \"serialize\", feature = \"deserialize\"), serde(skip))]\r\n    marker: PhantomData<T>,\r\n}\r\n\r\nimpl<T> Clone for Range<T> {\r\n    fn clone(&self) -> Self {\r\n        Range {\r\n            inner: self.inner.clone(),\r\n            marker: self.marker,\r\n        }\r\n    }\r\n}\r\n\r\nimpl<T> fmt::Debug for Range<T> {\r\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\r\n        write!(formatter, \"[{}..{}]\", self.inner.start + 1, self.inner.end)\r\n    }\r\n}\r\n\r\nimpl<T> Iterator for Range<T> {\r\n    type Item = Handle<T>;\r\n    fn next(&mut self) -> Option<Self::Item> {\r\n        if self.inner.start < self.inner.end {\r\n            self.inner.start += 1;\r\n            Some(Handle {\r\n                index: NonZeroU32::new(self.inner.start).unwrap(),\r\n                marker: self.marker,\r\n            })\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n}\r\n\r\n/// An arena holding some kind of component (e.g., type, constant,\r\n/// instruction, etc.) that can be referenced.\r\n///\r\n/// Adding new items to the arena produces a strongly-typed [`Handle`].\r\n/// The arena can be indexed using the given handle to obtain\r\n/// a reference to the stored item.\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"serialize\", serde(transparent))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(arbitrary::Arbitrary))]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub struct Arena<T> {\r\n    /// Values of this arena.\r\n    data: Vec<T>,\r\n    #[cfg(feature = \"span\")]\r\n    #[cfg_attr(feature = \"serialize\", serde(skip))]\r\n    span_info: Vec<Span>,\r\n}\r\n\r\nimpl<T> Default for Arena<T> {\r\n    fn default() -> Self {\r\n        Self::new()\r\n    }\r\n}\r\n\r\nimpl<T: fmt::Debug> fmt::Debug for Arena<T> {\r\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\r\n        f.debug_map().entries(self.iter()).finish()\r\n    }\r\n}\r\n\r\nimpl<T> Arena<T> {\r\n    /// Create a new arena with no initial capacity allocated.\r\n    pub const fn new() -> Self {\r\n        Arena {\r\n            data: Vec::new(),\r\n            #[cfg(feature = \"span\")]\r\n            span_info: Vec::new(),\r\n        }\r\n    }\r\n\r\n    /// Extracts the inner vector.\r\n    #[allow(clippy::missing_const_for_fn)] // ignore due to requirement of #![feature(const_precise_live_drops)]\r\n    pub fn into_inner(self) -> Vec<T> {\r\n        self.data\r\n    }\r\n\r\n    /// Returns the current number of items stored in this arena.\r\n    pub fn len(&self) -> usize {\r\n        self.data.len()\r\n    }\r\n\r\n    /// Returns `true` if the arena contains no elements.\r\n    pub fn is_empty(&self) -> bool {\r\n        self.data.is_empty()\r\n    }\r\n\r\n    /// Returns an iterator over the items stored in this arena, returning both\r\n    /// the item's handle and a reference to it.\r\n    pub fn iter(&self) -> impl DoubleEndedIterator<Item = (Handle<T>, &T)> {\r\n        self.data\r\n            .iter()\r\n            .enumerate()\r\n            .map(|(i, v)| unsafe { (Handle::from_usize_unchecked(i), v) })\r\n    }\r\n\r\n    /// Returns a iterator over the items stored in this arena,\r\n    /// returning both the item's handle and a mutable reference to it.\r\n    pub fn iter_mut(&mut self) -> impl DoubleEndedIterator<Item = (Handle<T>, &mut T)> {\r\n        self.data\r\n            .iter_mut()\r\n            .enumerate()\r\n            .map(|(i, v)| unsafe { (Handle::from_usize_unchecked(i), v) })\r\n    }\r\n\r\n    /// Adds a new value to the arena, returning a typed handle.\r\n    pub fn append(&mut self, value: T, span: Span) -> Handle<T> {\r\n        #[cfg(not(feature = \"span\"))]\r\n        let _ = span;\r\n        let index = self.data.len();\r\n        self.data.push(value);\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info.push(span);\r\n        Handle::from_usize(index)\r\n    }\r\n\r\n    /// Fetch a handle to an existing type.\r\n    pub fn fetch_if<F: Fn(&T) -> bool>(&self, fun: F) -> Option<Handle<T>> {\r\n        self.data\r\n            .iter()\r\n            .position(fun)\r\n            .map(|index| unsafe { Handle::from_usize_unchecked(index) })\r\n    }\r\n\r\n    /// Adds a value with a custom check for uniqueness:\r\n    /// returns a handle pointing to\r\n    /// an existing element if the check succeeds, or adds a new\r\n    /// element otherwise.\r\n    pub fn fetch_if_or_append<F: Fn(&T, &T) -> bool>(\r\n        &mut self,\r\n        value: T,\r\n        span: Span,\r\n        fun: F,\r\n    ) -> Handle<T> {\r\n        if let Some(index) = self.data.iter().position(|d| fun(d, &value)) {\r\n            unsafe { Handle::from_usize_unchecked(index) }\r\n        } else {\r\n            self.append(value, span)\r\n        }\r\n    }\r\n\r\n    /// Adds a value with a check for uniqueness, where the check is plain comparison.\r\n    pub fn fetch_or_append(&mut self, value: T, span: Span) -> Handle<T>\r\n    where\r\n        T: PartialEq,\r\n    {\r\n        self.fetch_if_or_append(value, span, T::eq)\r\n    }\r\n\r\n    pub fn try_get(&self, handle: Handle<T>) -> Result<&T, BadHandle> {\r\n        self.data.get(handle.index()).ok_or_else(|| BadHandle {\r\n            kind: std::any::type_name::<T>(),\r\n            index: handle.index(),\r\n        })\r\n    }\r\n\r\n    /// Get a mutable reference to an element in the arena.\r\n    pub fn get_mut(&mut self, handle: Handle<T>) -> &mut T {\r\n        self.data.get_mut(handle.index()).unwrap()\r\n    }\r\n\r\n    /// Get the range of handles from a particular number of elements to the end.\r\n    pub fn range_from(&self, old_length: usize) -> Range<T> {\r\n        Range {\r\n            inner: old_length as u32..self.data.len() as u32,\r\n            marker: PhantomData,\r\n        }\r\n    }\r\n\r\n    /// Clears the arena keeping all allocations\r\n    pub fn clear(&mut self) {\r\n        self.data.clear()\r\n    }\r\n\r\n    pub fn get_span(&self, handle: Handle<T>) -> Span {\r\n        #[cfg(feature = \"span\")]\r\n        {\r\n            *self\r\n                .span_info\r\n                .get(handle.index())\r\n                .unwrap_or(&Span::default())\r\n        }\r\n        #[cfg(not(feature = \"span\"))]\r\n        {\r\n            let _ = handle;\r\n            Span::default()\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"deserialize\")]\r\nimpl<'de, T> serde::Deserialize<'de> for Arena<T>\r\nwhere\r\n    T: serde::Deserialize<'de>,\r\n{\r\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\r\n    where\r\n        D: serde::Deserializer<'de>,\r\n    {\r\n        let data = Vec::deserialize(deserializer)?;\r\n        #[cfg(feature = \"span\")]\r\n        let span_info = std::iter::repeat(Span::default())\r\n            .take(data.len())\r\n            .collect();\r\n\r\n        Ok(Self {\r\n            data,\r\n            #[cfg(feature = \"span\")]\r\n            span_info,\r\n        })\r\n    }\r\n}\r\n\r\nimpl<T> ops::Index<Handle<T>> for Arena<T> {\r\n    type Output = T;\r\n    fn index(&self, handle: Handle<T>) -> &T {\r\n        &self.data[handle.index()]\r\n    }\r\n}\r\n\r\nimpl<T> ops::IndexMut<Handle<T>> for Arena<T> {\r\n    fn index_mut(&mut self, handle: Handle<T>) -> &mut T {\r\n        &mut self.data[handle.index()]\r\n    }\r\n}\r\n\r\nimpl<T> ops::Index<Range<T>> for Arena<T> {\r\n    type Output = [T];\r\n    fn index(&self, range: Range<T>) -> &[T] {\r\n        &self.data[range.inner.start as usize..range.inner.end as usize]\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    #[test]\r\n    fn append_non_unique() {\r\n        let mut arena: Arena<u8> = Arena::new();\r\n        let t1 = arena.append(0, Default::default());\r\n        let t2 = arena.append(0, Default::default());\r\n        assert!(t1 != t2);\r\n        assert!(arena[t1] == arena[t2]);\r\n    }\r\n\r\n    #[test]\r\n    fn append_unique() {\r\n        let mut arena: Arena<u8> = Arena::new();\r\n        let t1 = arena.append(0, Default::default());\r\n        let t2 = arena.append(1, Default::default());\r\n        assert!(t1 != t2);\r\n        assert!(arena[t1] != arena[t2]);\r\n    }\r\n\r\n    #[test]\r\n    fn fetch_or_append_non_unique() {\r\n        let mut arena: Arena<u8> = Arena::new();\r\n        let t1 = arena.fetch_or_append(0, Default::default());\r\n        let t2 = arena.fetch_or_append(0, Default::default());\r\n        assert!(t1 == t2);\r\n        assert!(arena[t1] == arena[t2])\r\n    }\r\n\r\n    #[test]\r\n    fn fetch_or_append_unique() {\r\n        let mut arena: Arena<u8> = Arena::new();\r\n        let t1 = arena.fetch_or_append(0, Default::default());\r\n        let t2 = arena.fetch_or_append(1, Default::default());\r\n        assert!(t1 != t2);\r\n        assert!(arena[t1] != arena[t2]);\r\n    }\r\n}\r\n\r\n/// An arena whose elements are guaranteed to be unique.\r\n///\r\n/// A `UniqueArena` holds a set of unique values of type `T`, each with an\r\n/// associated [`Span`]. Inserting a value returns a `Handle<T>`, which can be\r\n/// used to index the `UniqueArena` and obtain shared access to the `T` element.\r\n/// Access via a `Handle` is an array lookup - no hash lookup is necessary.\r\n///\r\n/// The element type must implement `Eq` and `Hash`. Insertions of equivalent\r\n/// elements, according to `Eq`, all return the same `Handle`.\r\n///\r\n/// Once inserted, elements may not be mutated.\r\n///\r\n/// `UniqueArena` is similar to [`Arena`]: If `Arena` is vector-like,\r\n/// `UniqueArena` is `HashSet`-like.\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\npub struct UniqueArena<T> {\r\n    set: IndexSet<T>,\r\n\r\n    /// Spans for the elements, indexed by handle.\r\n    ///\r\n    /// The length of this vector is always equal to `set.len()`. `IndexSet`\r\n    /// promises that its elements \"are indexed in a compact range, without\r\n    /// holes in the range 0..set.len()\", so we can always use the indices\r\n    /// returned by insertion as indices into this vector.\r\n    #[cfg(feature = \"span\")]\r\n    span_info: Vec<Span>,\r\n}\r\n\r\nimpl<T> UniqueArena<T> {\r\n    /// Create a new arena with no initial capacity allocated.\r\n    pub fn new() -> Self {\r\n        UniqueArena {\r\n            set: IndexSet::new(),\r\n            #[cfg(feature = \"span\")]\r\n            span_info: Vec::new(),\r\n        }\r\n    }\r\n\r\n    /// Return the current number of items stored in this arena.\r\n    pub fn len(&self) -> usize {\r\n        self.set.len()\r\n    }\r\n\r\n    /// Return `true` if the arena contains no elements.\r\n    pub fn is_empty(&self) -> bool {\r\n        self.set.is_empty()\r\n    }\r\n\r\n    /// Clears the arena, keeping all allocations.\r\n    pub fn clear(&mut self) {\r\n        self.set.clear();\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info.clear();\r\n    }\r\n\r\n    /// Return the span associated with `handle`.\r\n    ///\r\n    /// If a value has been inserted multiple times, the span returned is the\r\n    /// one provided with the first insertion.\r\n    ///\r\n    /// If the `span` feature is not enabled, always return `Span::default`.\r\n    /// This can be detected with [`Span::is_defined`].\r\n    pub fn get_span(&self, handle: Handle<T>) -> Span {\r\n        #[cfg(feature = \"span\")]\r\n        {\r\n            *self\r\n                .span_info\r\n                .get(handle.index())\r\n                .unwrap_or(&Span::default())\r\n        }\r\n        #[cfg(not(feature = \"span\"))]\r\n        {\r\n            let _ = handle;\r\n            Span::default()\r\n        }\r\n    }\r\n}\r\n\r\nimpl<T: Eq + hash::Hash> UniqueArena<T> {\r\n    /// Returns an iterator over the items stored in this arena, returning both\r\n    /// the item's handle and a reference to it.\r\n    pub fn iter(&self) -> impl DoubleEndedIterator<Item = (Handle<T>, &T)> {\r\n        self.set.iter().enumerate().map(|(i, v)| {\r\n            let position = i + 1;\r\n            let index = unsafe { Index::new_unchecked(position as u32) };\r\n            (Handle::new(index), v)\r\n        })\r\n    }\r\n\r\n    /// Insert a new value into the arena.\r\n    ///\r\n    /// Return a [`Handle<T>`], which can be used to index this arena to get a\r\n    /// shared reference to the element.\r\n    ///\r\n    /// If this arena already contains an element that is `Eq` to `value`,\r\n    /// return a `Handle` to the existing element, and drop `value`.\r\n    ///\r\n    /// When the `span` feature is enabled, if `value` is inserted into the\r\n    /// arena, associate `span` with it. An element's span can be retrieved with\r\n    /// the [`get_span`] method.\r\n    ///\r\n    /// [`Handle<T>`]: Handle\r\n    /// [`get_span`]: UniqueArena::get_span\r\n    pub fn insert(&mut self, value: T, span: Span) -> Handle<T> {\r\n        let (index, added) = self.set.insert_full(value);\r\n\r\n        #[cfg(feature = \"span\")]\r\n        {\r\n            if added {\r\n                debug_assert!(index == self.span_info.len());\r\n                self.span_info.push(span);\r\n            }\r\n\r\n            debug_assert!(self.set.len() == self.span_info.len());\r\n        }\r\n\r\n        #[cfg(not(feature = \"span\"))]\r\n        let _ = (span, added);\r\n\r\n        Handle::from_usize(index)\r\n    }\r\n\r\n    /// Return this arena's handle for `value`, if present.\r\n    ///\r\n    /// If this arena already contains an element equal to `value`,\r\n    /// return its handle. Otherwise, return `None`.\r\n    pub fn get(&self, value: &T) -> Option<Handle<T>> {\r\n        self.set\r\n            .get_index_of(value)\r\n            .map(|index| unsafe { Handle::from_usize_unchecked(index) })\r\n    }\r\n\r\n    /// Return this arena's value at `handle`, if that is a valid handle.\r\n    pub fn get_handle(&self, handle: Handle<T>) -> Result<&T, BadHandle> {\r\n        self.set.get_index(handle.index()).ok_or_else(|| BadHandle {\r\n            kind: std::any::type_name::<T>(),\r\n            index: handle.index(),\r\n        })\r\n    }\r\n}\r\n\r\nimpl<T> Default for UniqueArena<T> {\r\n    fn default() -> Self {\r\n        Self::new()\r\n    }\r\n}\r\n\r\nimpl<T: fmt::Debug + Eq + hash::Hash> fmt::Debug for UniqueArena<T> {\r\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\r\n        f.debug_map().entries(self.iter()).finish()\r\n    }\r\n}\r\n\r\nimpl<T> ops::Index<Handle<T>> for UniqueArena<T> {\r\n    type Output = T;\r\n    fn index(&self, handle: Handle<T>) -> &T {\r\n        &self.set[handle.index()]\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"serialize\")]\r\nimpl<T> serde::Serialize for UniqueArena<T>\r\nwhere\r\n    T: Eq + hash::Hash + serde::Serialize,\r\n{\r\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\r\n    where\r\n        S: serde::Serializer,\r\n    {\r\n        self.set.serialize(serializer)\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"deserialize\")]\r\nimpl<'de, T> serde::Deserialize<'de> for UniqueArena<T>\r\nwhere\r\n    T: Eq + hash::Hash + serde::Deserialize<'de>,\r\n{\r\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\r\n    where\r\n        D: serde::Deserializer<'de>,\r\n    {\r\n        let set = IndexSet::deserialize(deserializer)?;\r\n        #[cfg(feature = \"span\")]\r\n        let span_info = std::iter::repeat(Span::default()).take(set.len()).collect();\r\n\r\n        Ok(Self {\r\n            set,\r\n            #[cfg(feature = \"span\")]\r\n            span_info,\r\n        })\r\n    }\r\n}\r\n\r\n//Note: largely borrowed from `HashSet` implementation\r\n#[cfg(feature = \"arbitrary\")]\r\nimpl<'a, T> arbitrary::Arbitrary<'a> for UniqueArena<T>\r\nwhere\r\n    T: Eq + hash::Hash + arbitrary::Arbitrary<'a>,\r\n{\r\n    fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {\r\n        let mut arena = Self::default();\r\n        for elem in u.arbitrary_iter()? {\r\n            arena.set.insert(elem?);\r\n            #[cfg(feature = \"span\")]\r\n            arena.span_info.push(Span::UNDEFINED);\r\n        }\r\n        Ok(arena)\r\n    }\r\n\r\n    fn arbitrary_take_rest(u: arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {\r\n        let mut arena = Self::default();\r\n        for elem in u.arbitrary_take_rest_iter()? {\r\n            arena.set.insert(elem?);\r\n            #[cfg(feature = \"span\")]\r\n            arena.span_info.push(Span::UNDEFINED);\r\n        }\r\n        Ok(arena)\r\n    }\r\n\r\n    #[inline]\r\n    fn size_hint(depth: usize) -> (usize, Option<usize>) {\r\n        let depth_hint = <usize as arbitrary::Arbitrary>::size_hint(depth);\r\n        arbitrary::size_hint::and(depth_hint, (0, None))\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/dot/mod.rs",
    "content": "/*!\r\nBackend for [DOT][dot] (Graphviz).\r\n\r\nThis backend writes a graph in the DOT language, for the ease\r\nof IR inspection and debugging.\r\n\r\n[dot]: https://graphviz.org/doc/info/lang.html\r\n*/\r\n\r\nuse crate::{\r\n    arena::Handle,\r\n    valid::{FunctionInfo, ModuleInfo},\r\n};\r\n\r\nuse std::{\r\n    borrow::Cow,\r\n    fmt::{Error as FmtError, Write as _},\r\n};\r\n\r\n/// Configuration options for the dot backend\r\n#[derive(Default)]\r\npub struct Options {\r\n    /// Only emit function bodies\r\n    pub cfg_only: bool,\r\n}\r\n\r\n/// Identifier used to address a graph node\r\ntype NodeId = usize;\r\n\r\n/// Stores the target nodes for control flow statements\r\n#[derive(Default, Clone, Copy)]\r\nstruct Targets {\r\n    /// The node, if some, where continue operations will land\r\n    continue_target: Option<usize>,\r\n    /// The node, if some, where break operations will land\r\n    break_target: Option<usize>,\r\n}\r\n\r\n/// Stores information about the graph of statements\r\n#[derive(Default)]\r\nstruct StatementGraph {\r\n    /// List of node names\r\n    nodes: Vec<&'static str>,\r\n    /// List of edges of the control flow, the items are defined as\r\n    /// (from, to, label)\r\n    flow: Vec<(NodeId, NodeId, &'static str)>,\r\n    /// List of implicit edges of the control flow, used for jump\r\n    /// operations such as continue or break, the items are defined as\r\n    /// (from, to, label, color_id)\r\n    jumps: Vec<(NodeId, NodeId, &'static str, usize)>,\r\n    /// List of dependency relationships between a statement node and\r\n    /// expressions\r\n    dependencies: Vec<(NodeId, Handle<crate::Expression>, &'static str)>,\r\n    /// List of expression emitted by statement node\r\n    emits: Vec<(NodeId, Handle<crate::Expression>)>,\r\n    /// List of function call by statement node\r\n    calls: Vec<(NodeId, Handle<crate::Function>)>,\r\n}\r\n\r\nimpl StatementGraph {\r\n    /// Adds a new block to the statement graph, returning the first and last node, respectively\r\n    fn add(&mut self, block: &[crate::Statement], targets: Targets) -> (NodeId, NodeId) {\r\n        use crate::Statement as S;\r\n\r\n        // The first node of the block isn't a statement but a virtual node\r\n        let root = self.nodes.len();\r\n        self.nodes.push(if root == 0 { \"Root\" } else { \"Node\" });\r\n        // Track the last placed node, this will be returned to the caller and\r\n        // will also be used to generate the control flow edges\r\n        let mut last_node = root;\r\n        for statement in block {\r\n            // Reserve a new node for the current statement and link it to the\r\n            // node of the previous statement\r\n            let id = self.nodes.len();\r\n            self.flow.push((last_node, id, \"\"));\r\n            self.nodes.push(\"\"); // reserve space\r\n\r\n            // Track the node identifier for the merge node, the merge node is\r\n            // the last node of a statement, normally this is the node itself,\r\n            // but for control flow statements such as `if`s and `switch`s this\r\n            // is a virtual node where all branches merge back.\r\n            let mut merge_id = id;\r\n\r\n            self.nodes[id] = match *statement {\r\n                S::Emit(ref range) => {\r\n                    for handle in range.clone() {\r\n                        self.emits.push((id, handle));\r\n                    }\r\n                    \"Emit\"\r\n                }\r\n                S::Kill => \"Kill\", //TODO: link to the beginning\r\n                S::Break => {\r\n                    // Try to link to the break target, otherwise produce\r\n                    // a broken connection\r\n                    if let Some(target) = targets.break_target {\r\n                        self.jumps.push((id, target, \"Break\", 5))\r\n                    } else {\r\n                        self.jumps.push((id, root, \"Broken\", 7))\r\n                    }\r\n                    \"Break\"\r\n                }\r\n                S::Continue => {\r\n                    // Try to link to the continue target, otherwise produce\r\n                    // a broken connection\r\n                    if let Some(target) = targets.continue_target {\r\n                        self.jumps.push((id, target, \"Continue\", 5))\r\n                    } else {\r\n                        self.jumps.push((id, root, \"Broken\", 7))\r\n                    }\r\n                    \"Continue\"\r\n                }\r\n                S::Barrier(_flags) => \"Barrier\",\r\n                S::Block(ref b) => {\r\n                    let (other, last) = self.add(b, targets);\r\n                    self.flow.push((id, other, \"\"));\r\n                    // All following nodes should connect to the end of the block\r\n                    // statement so change the merge id to it.\r\n                    merge_id = last;\r\n                    \"Block\"\r\n                }\r\n                S::If {\r\n                    condition,\r\n                    ref accept,\r\n                    ref reject,\r\n                } => {\r\n                    self.dependencies.push((id, condition, \"condition\"));\r\n                    let (accept_id, accept_last) = self.add(accept, targets);\r\n                    self.flow.push((id, accept_id, \"accept\"));\r\n                    let (reject_id, reject_last) = self.add(reject, targets);\r\n                    self.flow.push((id, reject_id, \"reject\"));\r\n\r\n                    // Create a merge node, link the branches to it and set it\r\n                    // as the merge node to make the next statement node link to it\r\n                    merge_id = self.nodes.len();\r\n                    self.nodes.push(\"Merge\");\r\n                    self.flow.push((accept_last, merge_id, \"\"));\r\n                    self.flow.push((reject_last, merge_id, \"\"));\r\n\r\n                    \"If\"\r\n                }\r\n                S::Switch {\r\n                    selector,\r\n                    ref cases,\r\n                } => {\r\n                    self.dependencies.push((id, selector, \"selector\"));\r\n\r\n                    // Create a merge node and set it as the merge node to make\r\n                    // the next statement node link to it\r\n                    merge_id = self.nodes.len();\r\n                    self.nodes.push(\"Merge\");\r\n\r\n                    // Create a new targets structure and set the break target\r\n                    // to the merge node\r\n                    let mut targets = targets;\r\n                    targets.break_target = Some(merge_id);\r\n\r\n                    for case in cases {\r\n                        let (case_id, case_last) = self.add(&case.body, targets);\r\n                        let label = match case.value {\r\n                            crate::SwitchValue::Integer(_) => \"case\",\r\n                            crate::SwitchValue::Default => \"default\",\r\n                        };\r\n                        self.flow.push((id, case_id, label));\r\n                        // Link the last node of the branch to the merge node\r\n                        self.flow.push((case_last, merge_id, \"\"));\r\n                    }\r\n                    \"Switch\"\r\n                }\r\n                S::Loop {\r\n                    ref body,\r\n                    ref continuing,\r\n                    break_if,\r\n                } => {\r\n                    // Create a new targets structure and set the break target\r\n                    // to the merge node, this must happen before generating the\r\n                    // continuing block since it can break.\r\n                    let mut targets = targets;\r\n                    targets.break_target = Some(id);\r\n\r\n                    let (continuing_id, continuing_last) = self.add(continuing, targets);\r\n\r\n                    // Set the the continue target to the beginning\r\n                    // of the newly generated continuing block\r\n                    targets.continue_target = Some(continuing_id);\r\n\r\n                    let (body_id, body_last) = self.add(body, targets);\r\n\r\n                    self.flow.push((id, body_id, \"body\"));\r\n\r\n                    // Link the last node of the body to the continuing block\r\n                    self.flow.push((body_last, continuing_id, \"continuing\"));\r\n                    // Link the last node of the continuing block back to the\r\n                    // beginning of the loop body\r\n                    self.flow.push((continuing_last, body_id, \"continuing\"));\r\n\r\n                    if let Some(expr) = break_if {\r\n                        self.dependencies.push((continuing_id, expr, \"break if\"));\r\n                    }\r\n\r\n                    \"Loop\"\r\n                }\r\n                S::Return { value } => {\r\n                    if let Some(expr) = value {\r\n                        self.dependencies.push((id, expr, \"value\"));\r\n                    }\r\n                    \"Return\"\r\n                }\r\n                S::Store { pointer, value } => {\r\n                    self.dependencies.push((id, value, \"value\"));\r\n                    self.emits.push((id, pointer));\r\n                    \"Store\"\r\n                }\r\n                S::ImageStore {\r\n                    image,\r\n                    coordinate,\r\n                    array_index,\r\n                    value,\r\n                } => {\r\n                    self.dependencies.push((id, image, \"image\"));\r\n                    self.dependencies.push((id, coordinate, \"coordinate\"));\r\n                    if let Some(expr) = array_index {\r\n                        self.dependencies.push((id, expr, \"array_index\"));\r\n                    }\r\n                    self.dependencies.push((id, value, \"value\"));\r\n                    \"ImageStore\"\r\n                }\r\n                S::Call {\r\n                    function,\r\n                    ref arguments,\r\n                    result,\r\n                } => {\r\n                    for &arg in arguments {\r\n                        self.dependencies.push((id, arg, \"arg\"));\r\n                    }\r\n                    if let Some(expr) = result {\r\n                        self.emits.push((id, expr));\r\n                    }\r\n                    self.calls.push((id, function));\r\n                    \"Call\"\r\n                }\r\n                S::Atomic {\r\n                    pointer,\r\n                    ref fun,\r\n                    value,\r\n                    result,\r\n                } => {\r\n                    self.emits.push((id, result));\r\n                    self.dependencies.push((id, pointer, \"pointer\"));\r\n                    self.dependencies.push((id, value, \"value\"));\r\n                    if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun {\r\n                        self.dependencies.push((id, cmp, \"cmp\"));\r\n                    }\r\n                    \"Atomic\"\r\n                }\r\n            };\r\n            // Set the last node to the merge node\r\n            last_node = merge_id;\r\n        }\r\n        (root, last_node)\r\n    }\r\n}\r\n\r\n#[allow(clippy::manual_unwrap_or)]\r\nfn name(option: &Option<String>) -> &str {\r\n    match *option {\r\n        Some(ref name) => name,\r\n        None => \"\",\r\n    }\r\n}\r\n\r\n/// set39 color scheme from <https://graphviz.org/doc/info/colors.html>\r\nconst COLORS: &[&str] = &[\r\n    \"white\", // pattern starts at 1\r\n    \"#8dd3c7\", \"#ffffb3\", \"#bebada\", \"#fb8072\", \"#80b1d3\", \"#fdb462\", \"#b3de69\", \"#fccde5\",\r\n    \"#d9d9d9\",\r\n];\r\n\r\nfn write_fun(\r\n    output: &mut String,\r\n    prefix: String,\r\n    fun: &crate::Function,\r\n    info: Option<&FunctionInfo>,\r\n    options: &Options,\r\n) -> Result<(), FmtError> {\r\n    writeln!(output, \"\\t\\tnode [ style=filled ]\")?;\r\n\r\n    if !options.cfg_only {\r\n        for (handle, var) in fun.local_variables.iter() {\r\n            writeln!(\r\n                output,\r\n                \"\\t\\t{}_l{} [ shape=hexagon label=\\\"{:?} '{}'\\\" ]\",\r\n                prefix,\r\n                handle.index(),\r\n                handle,\r\n                name(&var.name),\r\n            )?;\r\n        }\r\n\r\n        write_function_expressions(output, &prefix, fun, info)?;\r\n    }\r\n\r\n    let mut sg = StatementGraph::default();\r\n    sg.add(&fun.body, Targets::default());\r\n    for (index, label) in sg.nodes.into_iter().enumerate() {\r\n        writeln!(\r\n            output,\r\n            \"\\t\\t{}_s{} [ shape=square label=\\\"{}\\\" ]\",\r\n            prefix, index, label,\r\n        )?;\r\n    }\r\n    for (from, to, label) in sg.flow {\r\n        writeln!(\r\n            output,\r\n            \"\\t\\t{}_s{} -> {}_s{} [ arrowhead=tee label=\\\"{}\\\" ]\",\r\n            prefix, from, prefix, to, label,\r\n        )?;\r\n    }\r\n    for (from, to, label, color_id) in sg.jumps {\r\n        writeln!(\r\n            output,\r\n            \"\\t\\t{}_s{} -> {}_s{} [ arrowhead=tee style=dashed color=\\\"{}\\\" label=\\\"{}\\\" ]\",\r\n            prefix, from, prefix, to, COLORS[color_id], label,\r\n        )?;\r\n    }\r\n\r\n    if !options.cfg_only {\r\n        for (to, expr, label) in sg.dependencies {\r\n            writeln!(\r\n                output,\r\n                \"\\t\\t{}_e{} -> {}_s{} [ label=\\\"{}\\\" ]\",\r\n                prefix,\r\n                expr.index(),\r\n                prefix,\r\n                to,\r\n                label,\r\n            )?;\r\n        }\r\n        for (from, to) in sg.emits {\r\n            writeln!(\r\n                output,\r\n                \"\\t\\t{}_s{} -> {}_e{} [ style=dotted ]\",\r\n                prefix,\r\n                from,\r\n                prefix,\r\n                to.index(),\r\n            )?;\r\n        }\r\n    }\r\n\r\n    for (from, function) in sg.calls {\r\n        writeln!(\r\n            output,\r\n            \"\\t\\t{}_s{} -> f{}_s0\",\r\n            prefix,\r\n            from,\r\n            function.index(),\r\n        )?;\r\n    }\r\n\r\n    Ok(())\r\n}\r\n\r\nfn write_function_expressions(\r\n    output: &mut String,\r\n    prefix: &str,\r\n    fun: &crate::Function,\r\n    info: Option<&FunctionInfo>,\r\n) -> Result<(), FmtError> {\r\n    enum Payload<'a> {\r\n        Arguments(&'a [Handle<crate::Expression>]),\r\n        Local(Handle<crate::LocalVariable>),\r\n        Global(Handle<crate::GlobalVariable>),\r\n    }\r\n\r\n    let mut edges = crate::FastHashMap::<&str, _>::default();\r\n    let mut payload = None;\r\n    for (handle, expression) in fun.expressions.iter() {\r\n        use crate::Expression as E;\r\n        let (label, color_id) = match *expression {\r\n            E::Access { base, index } => {\r\n                edges.insert(\"base\", base);\r\n                edges.insert(\"index\", index);\r\n                (\"Access\".into(), 1)\r\n            }\r\n            E::AccessIndex { base, index } => {\r\n                edges.insert(\"base\", base);\r\n                (format!(\"AccessIndex[{}]\", index).into(), 1)\r\n            }\r\n            E::Constant(_) => (\"Constant\".into(), 2),\r\n            E::Splat { size, value } => {\r\n                edges.insert(\"value\", value);\r\n                (format!(\"Splat{:?}\", size).into(), 3)\r\n            }\r\n            E::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                edges.insert(\"vector\", vector);\r\n                (format!(\"Swizzle{:?}\", &pattern[..size as usize]).into(), 3)\r\n            }\r\n            E::Compose { ref components, .. } => {\r\n                payload = Some(Payload::Arguments(components));\r\n                (\"Compose\".into(), 3)\r\n            }\r\n            E::FunctionArgument(index) => (format!(\"Argument[{}]\", index).into(), 1),\r\n            E::GlobalVariable(h) => {\r\n                payload = Some(Payload::Global(h));\r\n                (\"Global\".into(), 2)\r\n            }\r\n            E::LocalVariable(h) => {\r\n                payload = Some(Payload::Local(h));\r\n                (\"Local\".into(), 1)\r\n            }\r\n            E::Load { pointer } => {\r\n                edges.insert(\"pointer\", pointer);\r\n                (\"Load\".into(), 4)\r\n            }\r\n            E::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset: _,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                edges.insert(\"image\", image);\r\n                edges.insert(\"sampler\", sampler);\r\n                edges.insert(\"coordinate\", coordinate);\r\n                if let Some(expr) = array_index {\r\n                    edges.insert(\"array_index\", expr);\r\n                }\r\n                match level {\r\n                    crate::SampleLevel::Auto => {}\r\n                    crate::SampleLevel::Zero => {}\r\n                    crate::SampleLevel::Exact(expr) => {\r\n                        edges.insert(\"level\", expr);\r\n                    }\r\n                    crate::SampleLevel::Bias(expr) => {\r\n                        edges.insert(\"bias\", expr);\r\n                    }\r\n                    crate::SampleLevel::Gradient { x, y } => {\r\n                        edges.insert(\"grad_x\", x);\r\n                        edges.insert(\"grad_y\", y);\r\n                    }\r\n                }\r\n                if let Some(expr) = depth_ref {\r\n                    edges.insert(\"depth_ref\", expr);\r\n                }\r\n                let string = match gather {\r\n                    Some(component) => Cow::Owned(format!(\"ImageGather{:?}\", component)),\r\n                    _ => Cow::Borrowed(\"ImageSample\"),\r\n                };\r\n                (string, 5)\r\n            }\r\n            E::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => {\r\n                edges.insert(\"image\", image);\r\n                edges.insert(\"coordinate\", coordinate);\r\n                if let Some(expr) = array_index {\r\n                    edges.insert(\"array_index\", expr);\r\n                }\r\n                if let Some(sample) = sample {\r\n                    edges.insert(\"sample\", sample);\r\n                }\r\n                if let Some(level) = level {\r\n                    edges.insert(\"level\", level);\r\n                }\r\n                (\"ImageLoad\".into(), 5)\r\n            }\r\n            E::ImageQuery { image, query } => {\r\n                edges.insert(\"image\", image);\r\n                let args = match query {\r\n                    crate::ImageQuery::Size { level } => {\r\n                        if let Some(expr) = level {\r\n                            edges.insert(\"level\", expr);\r\n                        }\r\n                        Cow::from(\"ImageSize\")\r\n                    }\r\n                    _ => Cow::Owned(format!(\"{:?}\", query)),\r\n                };\r\n                (args, 7)\r\n            }\r\n            E::Unary { op, expr } => {\r\n                edges.insert(\"expr\", expr);\r\n                (format!(\"{:?}\", op).into(), 6)\r\n            }\r\n            E::Binary { op, left, right } => {\r\n                edges.insert(\"left\", left);\r\n                edges.insert(\"right\", right);\r\n                (format!(\"{:?}\", op).into(), 6)\r\n            }\r\n            E::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => {\r\n                edges.insert(\"condition\", condition);\r\n                edges.insert(\"accept\", accept);\r\n                edges.insert(\"reject\", reject);\r\n                (\"Select\".into(), 3)\r\n            }\r\n            E::Derivative { axis, expr } => {\r\n                edges.insert(\"\", expr);\r\n                (format!(\"d{:?}\", axis).into(), 8)\r\n            }\r\n            E::Relational { fun, argument } => {\r\n                edges.insert(\"arg\", argument);\r\n                (format!(\"{:?}\", fun).into(), 6)\r\n            }\r\n            E::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                edges.insert(\"arg\", arg);\r\n                if let Some(expr) = arg1 {\r\n                    edges.insert(\"arg1\", expr);\r\n                }\r\n                if let Some(expr) = arg2 {\r\n                    edges.insert(\"arg2\", expr);\r\n                }\r\n                if let Some(expr) = arg3 {\r\n                    edges.insert(\"arg3\", expr);\r\n                }\r\n                (format!(\"{:?}\", fun).into(), 7)\r\n            }\r\n            E::As {\r\n                kind,\r\n                expr,\r\n                convert,\r\n            } => {\r\n                edges.insert(\"\", expr);\r\n                let string = match convert {\r\n                    Some(width) => format!(\"Convert<{:?},{}>\", kind, width),\r\n                    None => format!(\"Bitcast<{:?}>\", kind),\r\n                };\r\n                (string.into(), 3)\r\n            }\r\n            E::CallResult(_function) => (\"CallResult\".into(), 4),\r\n            E::AtomicResult { .. } => (\"AtomicResult\".into(), 4),\r\n            E::ArrayLength(expr) => {\r\n                edges.insert(\"\", expr);\r\n                (\"ArrayLength\".into(), 7)\r\n            }\r\n        };\r\n\r\n        // give uniform expressions an outline\r\n        let color_attr = match info {\r\n            Some(info) if info[handle].uniformity.non_uniform_result.is_none() => \"fillcolor\",\r\n            _ => \"color\",\r\n        };\r\n        writeln!(\r\n            output,\r\n            \"\\t\\t{}_e{} [ {}=\\\"{}\\\" label=\\\"{:?} {}\\\" ]\",\r\n            prefix,\r\n            handle.index(),\r\n            color_attr,\r\n            COLORS[color_id],\r\n            handle,\r\n            label,\r\n        )?;\r\n\r\n        for (key, edge) in edges.drain() {\r\n            writeln!(\r\n                output,\r\n                \"\\t\\t{}_e{} -> {}_e{} [ label=\\\"{}\\\" ]\",\r\n                prefix,\r\n                edge.index(),\r\n                prefix,\r\n                handle.index(),\r\n                key,\r\n            )?;\r\n        }\r\n        match payload.take() {\r\n            Some(Payload::Arguments(list)) => {\r\n                write!(output, \"\\t\\t{{\")?;\r\n                for &comp in list {\r\n                    write!(output, \" {}_e{}\", prefix, comp.index())?;\r\n                }\r\n                writeln!(output, \" }} -> {}_e{}\", prefix, handle.index())?;\r\n            }\r\n            Some(Payload::Local(h)) => {\r\n                writeln!(\r\n                    output,\r\n                    \"\\t\\t{}_l{} -> {}_e{}\",\r\n                    prefix,\r\n                    h.index(),\r\n                    prefix,\r\n                    handle.index(),\r\n                )?;\r\n            }\r\n            Some(Payload::Global(h)) => {\r\n                writeln!(\r\n                    output,\r\n                    \"\\t\\tg{} -> {}_e{} [fillcolor=gray]\",\r\n                    h.index(),\r\n                    prefix,\r\n                    handle.index(),\r\n                )?;\r\n            }\r\n            None => {}\r\n        }\r\n    }\r\n\r\n    Ok(())\r\n}\r\n\r\n/// Write shader module to a [`String`].\r\npub fn write(\r\n    module: &crate::Module,\r\n    mod_info: Option<&ModuleInfo>,\r\n    options: Options,\r\n) -> Result<String, FmtError> {\r\n    use std::fmt::Write as _;\r\n\r\n    let mut output = String::new();\r\n    output += \"digraph Module {\\n\";\r\n\r\n    if !options.cfg_only {\r\n        writeln!(output, \"\\tsubgraph cluster_globals {{\")?;\r\n        writeln!(output, \"\\t\\tlabel=\\\"Globals\\\"\")?;\r\n        for (handle, var) in module.global_variables.iter() {\r\n            writeln!(\r\n                output,\r\n                \"\\t\\tg{} [ shape=hexagon label=\\\"{:?} {:?}/'{}'\\\" ]\",\r\n                handle.index(),\r\n                handle,\r\n                var.space,\r\n                name(&var.name),\r\n            )?;\r\n        }\r\n        writeln!(output, \"\\t}}\")?;\r\n    }\r\n\r\n    for (handle, fun) in module.functions.iter() {\r\n        let prefix = format!(\"f{}\", handle.index());\r\n        writeln!(output, \"\\tsubgraph cluster_{} {{\", prefix)?;\r\n        writeln!(\r\n            output,\r\n            \"\\t\\tlabel=\\\"Function{:?}/'{}'\\\"\",\r\n            handle,\r\n            name(&fun.name)\r\n        )?;\r\n        let info = mod_info.map(|a| &a[handle]);\r\n        write_fun(&mut output, prefix, fun, info, &options)?;\r\n        writeln!(output, \"\\t}}\")?;\r\n    }\r\n    for (ep_index, ep) in module.entry_points.iter().enumerate() {\r\n        let prefix = format!(\"ep{}\", ep_index);\r\n        writeln!(output, \"\\tsubgraph cluster_{} {{\", prefix)?;\r\n        writeln!(output, \"\\t\\tlabel=\\\"{:?}/'{}'\\\"\", ep.stage, ep.name)?;\r\n        let info = mod_info.map(|a| a.get_entry_point(ep_index));\r\n        write_fun(&mut output, prefix, &ep.function, info, &options)?;\r\n        writeln!(output, \"\\t}}\")?;\r\n    }\r\n\r\n    output += \"}\\n\";\r\n    Ok(output)\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/glsl/features.rs",
    "content": "use super::{BackendResult, Error, Version, Writer};\r\nuse crate::{\r\n    AddressSpace, Binding, Bytes, Expression, Handle, ImageClass, ImageDimension, Interpolation,\r\n    MathFunction, Sampling, ScalarKind, ShaderStage, StorageFormat, Type, TypeInner,\r\n};\r\nuse std::fmt::Write;\r\n\r\nbitflags::bitflags! {\r\n    /// Structure used to encode additions to GLSL that aren't supported by all versions.\r\n    pub struct Features: u32 {\r\n        /// Buffer address space support.\r\n        const BUFFER_STORAGE = 1;\r\n        const ARRAY_OF_ARRAYS = 1 << 1;\r\n        /// 8 byte floats.\r\n        const DOUBLE_TYPE = 1 << 2;\r\n        /// More image formats.\r\n        const FULL_IMAGE_FORMATS = 1 << 3;\r\n        const MULTISAMPLED_TEXTURES = 1 << 4;\r\n        const MULTISAMPLED_TEXTURE_ARRAYS = 1 << 5;\r\n        const CUBE_TEXTURES_ARRAY = 1 << 6;\r\n        const COMPUTE_SHADER = 1 << 7;\r\n        /// Image load and early depth tests.\r\n        const IMAGE_LOAD_STORE = 1 << 8;\r\n        const CONSERVATIVE_DEPTH = 1 << 9;\r\n        /// Interpolation and auxiliary qualifiers.\r\n        ///\r\n        /// Perspective, Flat, and Centroid are available in all GLSL versions we support.\r\n        const NOPERSPECTIVE_QUALIFIER = 1 << 11;\r\n        const SAMPLE_QUALIFIER = 1 << 12;\r\n        const CLIP_DISTANCE = 1 << 13;\r\n        const CULL_DISTANCE = 1 << 14;\r\n        /// Sample ID.\r\n        const SAMPLE_VARIABLES = 1 << 15;\r\n        /// Arrays with a dynamic length.\r\n        const DYNAMIC_ARRAY_SIZE = 1 << 16;\r\n        const MULTI_VIEW = 1 << 17;\r\n        /// Fused multiply-add.\r\n        const FMA = 1 << 18;\r\n        /// Texture samples query\r\n        const TEXTURE_SAMPLES = 1 << 19;\r\n        /// Texture levels query\r\n        const TEXTURE_LEVELS = 1 << 20;\r\n        /// Image size query\r\n        const IMAGE_SIZE = 1 << 21;\r\n    }\r\n}\r\n\r\n/// Helper structure used to store the required [`Features`] needed to output a\r\n/// [`Module`](crate::Module)\r\n///\r\n/// Provides helper methods to check for availability and writing required extensions\r\npub struct FeaturesManager(Features);\r\n\r\nimpl FeaturesManager {\r\n    /// Creates a new [`FeaturesManager`] instance\r\n    pub const fn new() -> Self {\r\n        Self(Features::empty())\r\n    }\r\n\r\n    /// Adds to the list of required [`Features`]\r\n    pub fn request(&mut self, features: Features) {\r\n        self.0 |= features\r\n    }\r\n\r\n    /// Checks that all required [`Features`] are available for the specified\r\n    /// [`Version`](super::Version) otherwise returns an\r\n    /// [`Error::MissingFeatures`](super::Error::MissingFeatures)\r\n    pub fn check_availability(&self, version: Version) -> BackendResult {\r\n        // Will store all the features that are unavailable\r\n        let mut missing = Features::empty();\r\n\r\n        // Helper macro to check for feature availability\r\n        macro_rules! check_feature {\r\n            // Used when only core glsl supports the feature\r\n            ($feature:ident, $core:literal) => {\r\n                if self.0.contains(Features::$feature)\r\n                    && (version < Version::Desktop($core) || version.is_es())\r\n                {\r\n                    missing |= Features::$feature;\r\n                }\r\n            };\r\n            // Used when both core and es support the feature\r\n            ($feature:ident, $core:literal, $es:literal) => {\r\n                if self.0.contains(Features::$feature)\r\n                    && (version < Version::Desktop($core) || version < Version::new_gles($es))\r\n                {\r\n                    missing |= Features::$feature;\r\n                }\r\n            };\r\n        }\r\n\r\n        check_feature!(COMPUTE_SHADER, 420, 310);\r\n        check_feature!(BUFFER_STORAGE, 400, 310);\r\n        check_feature!(DOUBLE_TYPE, 150);\r\n        check_feature!(CUBE_TEXTURES_ARRAY, 130, 310);\r\n        check_feature!(MULTISAMPLED_TEXTURES, 150, 300);\r\n        check_feature!(MULTISAMPLED_TEXTURE_ARRAYS, 150, 310);\r\n        check_feature!(ARRAY_OF_ARRAYS, 120, 310);\r\n        check_feature!(IMAGE_LOAD_STORE, 130, 310);\r\n        check_feature!(CONSERVATIVE_DEPTH, 130, 300);\r\n        check_feature!(CONSERVATIVE_DEPTH, 130, 300);\r\n        check_feature!(NOPERSPECTIVE_QUALIFIER, 130);\r\n        check_feature!(SAMPLE_QUALIFIER, 400, 320);\r\n        // gl_ClipDistance is supported by core versions > 1.3 and aren't supported by an es versions without extensions\r\n        check_feature!(CLIP_DISTANCE, 130, 300);\r\n        check_feature!(CULL_DISTANCE, 450, 300);\r\n        check_feature!(SAMPLE_VARIABLES, 400, 300);\r\n        check_feature!(DYNAMIC_ARRAY_SIZE, 430, 310);\r\n        match version {\r\n            Version::Embedded { is_webgl: true, .. } => check_feature!(MULTI_VIEW, 140, 300),\r\n            _ => check_feature!(MULTI_VIEW, 140, 310),\r\n        };\r\n        // Only available on glsl core, this means that opengl es can't query the number\r\n        // of samples nor levels in a image and neither do bound checks on the sample nor\r\n        // the level argument of texelFecth\r\n        check_feature!(TEXTURE_SAMPLES, 150);\r\n        check_feature!(TEXTURE_LEVELS, 130);\r\n        check_feature!(IMAGE_SIZE, 430, 310);\r\n\r\n        // Return an error if there are missing features\r\n        if missing.is_empty() {\r\n            Ok(())\r\n        } else {\r\n            Err(Error::MissingFeatures(missing))\r\n        }\r\n    }\r\n\r\n    /// Helper method used to write all needed extensions\r\n    ///\r\n    /// # Notes\r\n    /// This won't check for feature availability so it might output extensions that aren't even\r\n    /// supported.[`check_availability`](Self::check_availability) will check feature availability\r\n    pub fn write(&self, version: Version, mut out: impl Write) -> BackendResult {\r\n        if self.0.contains(Features::COMPUTE_SHADER) && !version.is_es() {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_compute_shader.txt\r\n            writeln!(out, \"#extension GL_ARB_compute_shader : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::BUFFER_STORAGE) && !version.is_es() {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_storage_buffer_object.txt\r\n            writeln!(\r\n                out,\r\n                \"#extension GL_ARB_shader_storage_buffer_object : require\"\r\n            )?;\r\n        }\r\n\r\n        if self.0.contains(Features::DOUBLE_TYPE) && version < Version::Desktop(400) {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_gpu_shader_fp64.txt\r\n            writeln!(out, \"#extension GL_ARB_gpu_shader_fp64 : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::CUBE_TEXTURES_ARRAY) {\r\n            if version.is_es() {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_cube_map_array.txt\r\n                writeln!(out, \"#extension GL_EXT_texture_cube_map_array : require\")?;\r\n            } else if version < Version::Desktop(400) {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_cube_map_array.txt\r\n                writeln!(out, \"#extension GL_ARB_texture_cube_map_array : require\")?;\r\n            }\r\n        }\r\n\r\n        if self.0.contains(Features::MULTISAMPLED_TEXTURE_ARRAYS) && version.is_es() {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/OES/OES_texture_storage_multisample_2d_array.txt\r\n            writeln!(\r\n                out,\r\n                \"#extension GL_OES_texture_storage_multisample_2d_array : require\"\r\n            )?;\r\n        }\r\n\r\n        if self.0.contains(Features::ARRAY_OF_ARRAYS) && version < Version::Desktop(430) {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_arrays_of_arrays.txt\r\n            writeln!(out, \"#extension ARB_arrays_of_arrays : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::IMAGE_LOAD_STORE) {\r\n            if self.0.contains(Features::FULL_IMAGE_FORMATS) && version.is_es() {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/NV/NV_image_formats.txt\r\n                writeln!(out, \"#extension GL_NV_image_formats : require\")?;\r\n            }\r\n\r\n            if version < Version::Desktop(420) {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_image_load_store.txt\r\n                writeln!(out, \"#extension GL_ARB_shader_image_load_store : require\")?;\r\n            }\r\n        }\r\n\r\n        if self.0.contains(Features::CONSERVATIVE_DEPTH) {\r\n            if version.is_es() {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_conservative_depth.txt\r\n                writeln!(out, \"#extension GL_EXT_conservative_depth : require\")?;\r\n            }\r\n\r\n            if version < Version::Desktop(420) {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_conservative_depth.txt\r\n                writeln!(out, \"#extension GL_ARB_conservative_depth : require\")?;\r\n            }\r\n        }\r\n\r\n        if (self.0.contains(Features::CLIP_DISTANCE) || self.0.contains(Features::CULL_DISTANCE))\r\n            && version.is_es()\r\n        {\r\n            // TODO: handle gl_ClipDistance and gl_CullDistance usage in better way\r\n            // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_cull_distance.txt\r\n            // writeln!(out, \"#extension GL_EXT_clip_cull_distance : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::SAMPLE_VARIABLES) && version.is_es() {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt\r\n            writeln!(out, \"#extension GL_OES_sample_variables : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::SAMPLE_VARIABLES) && version.is_es() {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt\r\n            writeln!(out, \"#extension GL_OES_sample_variables : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::MULTI_VIEW) {\r\n            if let Version::Embedded { is_webgl: true, .. } = version {\r\n                // https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt\r\n                writeln!(out, \"#extension GL_OVR_multiview2 : require\")?;\r\n            } else {\r\n                // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_multiview.txt\r\n                writeln!(out, \"#extension GL_EXT_multiview : require\")?;\r\n            }\r\n        }\r\n\r\n        if self.0.contains(Features::FMA) && version >= Version::new_gles(310) {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_gpu_shader5.txt\r\n            writeln!(out, \"#extension GL_EXT_gpu_shader5 : require\")?;\r\n        }\r\n\r\n        if self.0.contains(Features::TEXTURE_SAMPLES) {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_texture_image_samples.txt\r\n            writeln!(\r\n                out,\r\n                \"#extension GL_ARB_shader_texture_image_samples : require\"\r\n            )?;\r\n        }\r\n\r\n        if self.0.contains(Features::TEXTURE_LEVELS) && version < Version::Desktop(430) {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_query_levels.txt\r\n            writeln!(out, \"#extension GL_ARB_texture_query_levels : require\")?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n}\r\n\r\nimpl<'a, W> Writer<'a, W> {\r\n    /// Helper method that searches the module for all the needed [`Features`]\r\n    ///\r\n    /// # Errors\r\n    /// If the version doesn't support any of the needed [`Features`] a\r\n    /// [`Error::MissingFeatures`](super::Error::MissingFeatures) will be returned\r\n    pub(super) fn collect_required_features(&mut self) -> BackendResult {\r\n        let ep_info = self.info.get_entry_point(self.entry_point_idx as usize);\r\n\r\n        if let Some(depth_test) = self.entry_point.early_depth_test {\r\n            // If IMAGE_LOAD_STORE is supported for this version of GLSL\r\n            if self.options.version.supports_early_depth_test() {\r\n                self.features.request(Features::IMAGE_LOAD_STORE);\r\n            }\r\n\r\n            if depth_test.conservative.is_some() {\r\n                self.features.request(Features::CONSERVATIVE_DEPTH);\r\n            }\r\n        }\r\n\r\n        for arg in self.entry_point.function.arguments.iter() {\r\n            self.varying_required_features(arg.binding.as_ref(), arg.ty);\r\n        }\r\n        if let Some(ref result) = self.entry_point.function.result {\r\n            self.varying_required_features(result.binding.as_ref(), result.ty);\r\n        }\r\n\r\n        if let ShaderStage::Compute = self.entry_point.stage {\r\n            self.features.request(Features::COMPUTE_SHADER)\r\n        }\r\n\r\n        if self.multiview.is_some() {\r\n            self.features.request(Features::MULTI_VIEW);\r\n        }\r\n\r\n        for (ty_handle, ty) in self.module.types.iter() {\r\n            match ty.inner {\r\n                TypeInner::Scalar { kind, width } => self.scalar_required_features(kind, width),\r\n                TypeInner::Vector { kind, width, .. } => self.scalar_required_features(kind, width),\r\n                TypeInner::Matrix { width, .. } => {\r\n                    self.scalar_required_features(ScalarKind::Float, width)\r\n                }\r\n                TypeInner::Array { base, size, .. } => {\r\n                    if let TypeInner::Array { .. } = self.module.types[base].inner {\r\n                        self.features.request(Features::ARRAY_OF_ARRAYS)\r\n                    }\r\n\r\n                    // If the array is dynamically sized\r\n                    if size == crate::ArraySize::Dynamic {\r\n                        let mut is_used = false;\r\n\r\n                        // Check if this type is used in a global that is needed by the current entrypoint\r\n                        for (global_handle, global) in self.module.global_variables.iter() {\r\n                            // Skip unused globals\r\n                            if ep_info[global_handle].is_empty() {\r\n                                continue;\r\n                            }\r\n\r\n                            // If this array is the type of a global, then this array is used\r\n                            if global.ty == ty_handle {\r\n                                is_used = true;\r\n                                break;\r\n                            }\r\n\r\n                            // If the type of this global is a struct\r\n                            if let crate::TypeInner::Struct { ref members, .. } =\r\n                                self.module.types[global.ty].inner\r\n                            {\r\n                                // Check the last element of the struct to see if it's type uses\r\n                                // this array\r\n                                if let Some(last) = members.last() {\r\n                                    if last.ty == ty_handle {\r\n                                        is_used = true;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // If this dynamically size array is used, we need dynamic array size support\r\n                        if is_used {\r\n                            self.features.request(Features::DYNAMIC_ARRAY_SIZE);\r\n                        }\r\n                    }\r\n                }\r\n                TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class,\r\n                } => {\r\n                    if arrayed && dim == ImageDimension::Cube {\r\n                        self.features.request(Features::CUBE_TEXTURES_ARRAY)\r\n                    }\r\n\r\n                    match class {\r\n                        ImageClass::Sampled { multi: true, .. }\r\n                        | ImageClass::Depth { multi: true } => {\r\n                            self.features.request(Features::MULTISAMPLED_TEXTURES);\r\n                            if arrayed {\r\n                                self.features.request(Features::MULTISAMPLED_TEXTURE_ARRAYS);\r\n                            }\r\n                        }\r\n                        ImageClass::Storage { format, .. } => match format {\r\n                            StorageFormat::R8Unorm\r\n                            | StorageFormat::R8Snorm\r\n                            | StorageFormat::R8Uint\r\n                            | StorageFormat::R8Sint\r\n                            | StorageFormat::R16Uint\r\n                            | StorageFormat::R16Sint\r\n                            | StorageFormat::R16Float\r\n                            | StorageFormat::Rg8Unorm\r\n                            | StorageFormat::Rg8Snorm\r\n                            | StorageFormat::Rg8Uint\r\n                            | StorageFormat::Rg8Sint\r\n                            | StorageFormat::Rg16Uint\r\n                            | StorageFormat::Rg16Sint\r\n                            | StorageFormat::Rg16Float\r\n                            | StorageFormat::Rgb10a2Unorm\r\n                            | StorageFormat::Rg11b10Float\r\n                            | StorageFormat::Rg32Uint\r\n                            | StorageFormat::Rg32Sint\r\n                            | StorageFormat::Rg32Float => {\r\n                                self.features.request(Features::FULL_IMAGE_FORMATS)\r\n                            }\r\n                            _ => {}\r\n                        },\r\n                        ImageClass::Sampled { multi: false, .. }\r\n                        | ImageClass::Depth { multi: false } => {}\r\n                    }\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n\r\n        let mut push_constant_used = false;\r\n\r\n        for (handle, global) in self.module.global_variables.iter() {\r\n            if ep_info[handle].is_empty() {\r\n                continue;\r\n            }\r\n            match global.space {\r\n                AddressSpace::WorkGroup => self.features.request(Features::COMPUTE_SHADER),\r\n                AddressSpace::Storage { .. } => self.features.request(Features::BUFFER_STORAGE),\r\n                AddressSpace::PushConstant => {\r\n                    if push_constant_used {\r\n                        return Err(Error::MultiplePushConstants);\r\n                    }\r\n                    push_constant_used = true;\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n\r\n        // We will need to pass some of the members to a closure, so we need\r\n        // to separate them otherwise the borrow checker will complain, this\r\n        // shouldn't be needed in rust 2021\r\n        let &mut Self {\r\n            module,\r\n            info,\r\n            ref mut features,\r\n            entry_point,\r\n            entry_point_idx,\r\n            ref policies,\r\n            ..\r\n        } = self;\r\n\r\n        // Loop trough all expressions in both functions and the entry point\r\n        // to check for needed features\r\n        for (expressions, info) in module\r\n            .functions\r\n            .iter()\r\n            .map(|(h, f)| (&f.expressions, &info[h]))\r\n            .chain(std::iter::once((\r\n                &entry_point.function.expressions,\r\n                info.get_entry_point(entry_point_idx as usize),\r\n            )))\r\n        {\r\n            for (_, expr) in expressions.iter() {\r\n                match *expr {\r\n                // Check for fused multiply add use\r\n                Expression::Math { fun, .. } if fun == MathFunction::Fma => {\r\n                    features.request(Features::FMA)\r\n                }\r\n                // Check for queries that neeed aditonal features\r\n                Expression::ImageQuery {\r\n                    image,\r\n                    query,\r\n                    ..\r\n                } => match query {\r\n                    // Storage images use `imageSize` which is only available\r\n                    // in glsl > 420\r\n                    //\r\n                    // layers queries are also implemented as size queries\r\n                    crate::ImageQuery::Size { .. } | crate::ImageQuery::NumLayers => {\r\n                        if let TypeInner::Image {\r\n                            class: crate::ImageClass::Storage { .. }, ..\r\n                        } = *info[image].ty.inner_with(&module.types) {\r\n                            features.request(Features::IMAGE_SIZE)\r\n                        }\r\n                    },\r\n                    crate::ImageQuery::NumLevels => features.request(Features::TEXTURE_LEVELS),\r\n                    crate::ImageQuery::NumSamples => features.request(Features::TEXTURE_SAMPLES),\r\n                }\r\n                ,\r\n                // Check for image loads that needs bound checking on the sample\r\n                // or level argument since this requires a feature\r\n                Expression::ImageLoad {\r\n                    sample, level, ..\r\n                } => {\r\n                    if policies.image != crate::proc::BoundsCheckPolicy::Unchecked {\r\n                        if sample.is_some() {\r\n                            features.request(Features::TEXTURE_SAMPLES)\r\n                        }\r\n\r\n                        if level.is_some() {\r\n                            features.request(Features::TEXTURE_LEVELS)\r\n                        }\r\n                    }\r\n                }\r\n                _ => {}\r\n            }\r\n            }\r\n        }\r\n\r\n        self.features.check_availability(self.options.version)\r\n    }\r\n\r\n    /// Helper method that checks the [`Features`] needed by a scalar\r\n    fn scalar_required_features(&mut self, kind: ScalarKind, width: Bytes) {\r\n        if kind == ScalarKind::Float && width == 8 {\r\n            self.features.request(Features::DOUBLE_TYPE);\r\n        }\r\n    }\r\n\r\n    fn varying_required_features(&mut self, binding: Option<&Binding>, ty: Handle<Type>) {\r\n        match self.module.types[ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                for member in members {\r\n                    self.varying_required_features(member.binding.as_ref(), member.ty);\r\n                }\r\n            }\r\n            _ => {\r\n                if let Some(binding) = binding {\r\n                    match *binding {\r\n                        Binding::BuiltIn(built_in) => match built_in {\r\n                            crate::BuiltIn::ClipDistance => {\r\n                                self.features.request(Features::CLIP_DISTANCE)\r\n                            }\r\n                            crate::BuiltIn::CullDistance => {\r\n                                self.features.request(Features::CULL_DISTANCE)\r\n                            }\r\n                            crate::BuiltIn::SampleIndex => {\r\n                                self.features.request(Features::SAMPLE_VARIABLES)\r\n                            }\r\n                            crate::BuiltIn::ViewIndex => {\r\n                                self.features.request(Features::MULTI_VIEW)\r\n                            }\r\n                            _ => {}\r\n                        },\r\n                        Binding::Location {\r\n                            location: _,\r\n                            interpolation,\r\n                            sampling,\r\n                        } => {\r\n                            if interpolation == Some(Interpolation::Linear) {\r\n                                self.features.request(Features::NOPERSPECTIVE_QUALIFIER);\r\n                            }\r\n                            if sampling == Some(Sampling::Sample) {\r\n                                self.features.request(Features::SAMPLE_QUALIFIER);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/glsl/keywords.rs",
    "content": "pub const RESERVED_KEYWORDS: &[&str] = &[\r\n    \"attribute\",\r\n    \"const\",\r\n    \"uniform\",\r\n    \"varying\",\r\n    \"buffer\",\r\n    \"shared\",\r\n    \"coherent\",\r\n    \"volatile\",\r\n    \"restrict\",\r\n    \"readonly\",\r\n    \"writeonly\",\r\n    \"atomic_uint\",\r\n    \"layout\",\r\n    \"centroid\",\r\n    \"flat\",\r\n    \"smooth\",\r\n    \"noperspective\",\r\n    \"patch\",\r\n    \"sample\",\r\n    \"break\",\r\n    \"continue\",\r\n    \"do\",\r\n    \"for\",\r\n    \"while\",\r\n    \"switch\",\r\n    \"case\",\r\n    \"default\",\r\n    \"if\",\r\n    \"else\",\r\n    \"subroutine\",\r\n    \"in\",\r\n    \"out\",\r\n    \"inout\",\r\n    \"float\",\r\n    \"double\",\r\n    \"int\",\r\n    \"void\",\r\n    \"bool\",\r\n    \"true\",\r\n    \"false\",\r\n    \"invariant\",\r\n    \"precise\",\r\n    \"discard\",\r\n    \"return\",\r\n    \"mat2\",\r\n    \"mat3\",\r\n    \"mat4\",\r\n    \"dmat2\",\r\n    \"dmat3\",\r\n    \"dmat4\",\r\n    \"mat2x2\",\r\n    \"mat2x3\",\r\n    \"mat2x4\",\r\n    \"dmat2x2\",\r\n    \"dmat2x3\",\r\n    \"dmat2x4\",\r\n    \"mat3x2\",\r\n    \"mat3x3\",\r\n    \"mat3x4\",\r\n    \"dmat3x2\",\r\n    \"dmat3x3\",\r\n    \"dmat3x4\",\r\n    \"mat4x2\",\r\n    \"mat4x3\",\r\n    \"mat4x4\",\r\n    \"dmat4x2\",\r\n    \"dmat4x3\",\r\n    \"dmat4x4\",\r\n    \"vec2\",\r\n    \"vec3\",\r\n    \"vec4\",\r\n    \"ivec2\",\r\n    \"ivec3\",\r\n    \"ivec4\",\r\n    \"bvec2\",\r\n    \"bvec3\",\r\n    \"bvec4\",\r\n    \"dvec2\",\r\n    \"dvec3\",\r\n    \"dvec4\",\r\n    \"uint\",\r\n    \"uvec2\",\r\n    \"uvec3\",\r\n    \"uvec4\",\r\n    \"lowp\",\r\n    \"mediump\",\r\n    \"highp\",\r\n    \"precision\",\r\n    \"sampler1D\",\r\n    \"sampler2D\",\r\n    \"sampler3D\",\r\n    \"samplerCube\",\r\n    \"sampler1DShadow\",\r\n    \"sampler2DShadow\",\r\n    \"samplerCubeShadow\",\r\n    \"sampler1DArray\",\r\n    \"sampler2DArray\",\r\n    \"sampler1DArrayShadow\",\r\n    \"sampler2DArrayShadow\",\r\n    \"isampler1D\",\r\n    \"isampler2D\",\r\n    \"isampler3D\",\r\n    \"isamplerCube\",\r\n    \"isampler1DArray\",\r\n    \"isampler2DArray\",\r\n    \"usampler1D\",\r\n    \"usampler2D\",\r\n    \"usampler3D\",\r\n    \"usamplerCube\",\r\n    \"usampler1DArray\",\r\n    \"usampler2DArray\",\r\n    \"sampler2DRect\",\r\n    \"sampler2DRectShadow\",\r\n    \"isampler2D\",\r\n    \"Rect\",\r\n    \"usampler2DRect\",\r\n    \"samplerBuffer\",\r\n    \"isamplerBuffer\",\r\n    \"usamplerBuffer\",\r\n    \"sampler2DMS\",\r\n    \"isampler2DMS\",\r\n    \"usampler2DMS\",\r\n    \"sampler2DMSArray\",\r\n    \"isampler2DMSArray\",\r\n    \"usampler2DMSArray\",\r\n    \"samplerCubeArray\",\r\n    \"samplerCubeArrayShadow\",\r\n    \"isamplerCubeArray\",\r\n    \"usamplerCubeArray\",\r\n    \"image1D\",\r\n    \"iimage1D\",\r\n    \"uimage1D\",\r\n    \"image2D\",\r\n    \"iimage2D\",\r\n    \"uimage2D\",\r\n    \"image3D\",\r\n    \"iimage3D\",\r\n    \"uimage3D\",\r\n    \"image2DRect\",\r\n    \"iimage2DRect\",\r\n    \"uimage2DRect\",\r\n    \"imageCube\",\r\n    \"iimageCube\",\r\n    \"uimageCube\",\r\n    \"imageBuffer\",\r\n    \"iimageBuffer\",\r\n    \"uimageBuffer\",\r\n    \"image1DArray\",\r\n    \"iimage1DArray\",\r\n    \"uimage1DArray\",\r\n    \"image2DArray\",\r\n    \"iimage2DArray\",\r\n    \"uimage2DArray\",\r\n    \"imageCubeArray\",\r\n    \"iimageCubeArray\",\r\n    \"uimageCubeArray\",\r\n    \"image2DMS\",\r\n    \"iimage2DMS\",\r\n    \"uimage2DMS\",\r\n    \"image2DMSArray\",\r\n    \"iimage2DMSArray\",\r\n    \"uimage2DMSArraystruct\",\r\n    \"common\",\r\n    \"partition\",\r\n    \"active\",\r\n    \"asm\",\r\n    \"class\",\r\n    \"union\",\r\n    \"enum\",\r\n    \"typedef\",\r\n    \"template\",\r\n    \"this\",\r\n    \"resource\",\r\n    \"goto\",\r\n    \"inline\",\r\n    \"noinline\",\r\n    \"public\",\r\n    \"static\",\r\n    \"extern\",\r\n    \"external\",\r\n    \"interface\",\r\n    \"long\",\r\n    \"short\",\r\n    \"half\",\r\n    \"fixed\",\r\n    \"unsigned\",\r\n    \"superp\",\r\n    \"input\",\r\n    \"output\",\r\n    \"hvec2\",\r\n    \"hvec3\",\r\n    \"hvec4\",\r\n    \"fvec2\",\r\n    \"fvec3\",\r\n    \"fvec4\",\r\n    \"sampler3DRect\",\r\n    \"filter\",\r\n    \"sizeof\",\r\n    \"cast\",\r\n    \"namespace\",\r\n    \"using\",\r\n    \"main\",\r\n];\r\n"
  },
  {
    "path": "lib/naga/src/back/glsl/mod.rs",
    "content": "/*!\r\nBackend for [GLSL][glsl] (OpenGL Shading Language).\r\n\r\nThe main structure is [`Writer`], it maintains internal state that is used\r\nto output a [`Module`](crate::Module) into glsl\r\n\r\n# Supported versions\r\n### Core\r\n- 330\r\n- 400\r\n- 410\r\n- 420\r\n- 430\r\n- 450\r\n\r\n### ES\r\n- 300\r\n- 310\r\n\r\n[glsl]: https://www.khronos.org/registry/OpenGL/index_gl.php\r\n*/\r\n\r\n// GLSL is mostly a superset of C but it also removes some parts of it this is a list of relevant\r\n// aspects for this backend.\r\n//\r\n// The most notable change is the introduction of the version preprocessor directive that must\r\n// always be the first line of a glsl file and is written as\r\n// `#version number profile`\r\n// `number` is the version itself (i.e. 300) and `profile` is the\r\n// shader profile we only support \"core\" and \"es\", the former is used in desktop applications and\r\n// the later is used in embedded contexts, mobile devices and browsers. Each one as it's own\r\n// versions (at the time of writing this the latest version for \"core\" is 460 and for \"es\" is 320)\r\n//\r\n// Other important preprocessor addition is the extension directive which is written as\r\n// `#extension name: behaviour`\r\n// Extensions provide increased features in a plugin fashion but they aren't required to be\r\n// supported hence why they are called extensions, that's why `behaviour` is used it specifies\r\n// whether the extension is strictly required or if it should only be enabled if needed. In our case\r\n// when we use extensions we set behaviour to `require` always.\r\n//\r\n// The only thing that glsl removes that makes a difference are pointers.\r\n//\r\n// Additions that are relevant for the backend are the discard keyword, the introduction of\r\n// vector, matrices, samplers, image types and functions that provide common shader operations\r\n\r\npub use features::Features;\r\n\r\nuse crate::{\r\n    back,\r\n    proc::{self, NameKey},\r\n    valid, Handle, ShaderStage, TypeInner,\r\n};\r\nuse features::FeaturesManager;\r\nuse std::{\r\n    cmp::Ordering,\r\n    fmt,\r\n    fmt::{Error as FmtError, Write},\r\n};\r\nuse thiserror::Error;\r\n\r\n/// Contains the features related code and the features querying method\r\nmod features;\r\n/// Contains a constant with a slice of all the reserved keywords RESERVED_KEYWORDS\r\nmod keywords;\r\n\r\n/// List of supported `core` GLSL versions.\r\npub const SUPPORTED_CORE_VERSIONS: &[u16] = &[330, 400, 410, 420, 430, 440, 450];\r\n/// List of supported `es` GLSL versions.\r\npub const SUPPORTED_ES_VERSIONS: &[u16] = &[300, 310, 320];\r\n\r\n/// The suffix of the variable that will hold the calculated clamped level\r\n/// of detail for bounds checking in `ImageLoad`\r\nconst CLAMPED_LOD_SUFFIX: &str = \"_clamped_lod\";\r\n\r\n/// Mapping between resources and bindings.\r\npub type BindingMap = std::collections::BTreeMap<crate::ResourceBinding, u8>;\r\n\r\nimpl crate::AtomicFunction {\r\n    const fn to_glsl(self) -> &'static str {\r\n        match self {\r\n            Self::Add | Self::Subtract => \"Add\",\r\n            Self::And => \"And\",\r\n            Self::InclusiveOr => \"Or\",\r\n            Self::ExclusiveOr => \"Xor\",\r\n            Self::Min => \"Min\",\r\n            Self::Max => \"Max\",\r\n            Self::Exchange { compare: None } => \"Exchange\",\r\n            Self::Exchange { compare: Some(_) } => \"\", //TODO\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::AddressSpace {\r\n    const fn is_buffer(&self) -> bool {\r\n        match *self {\r\n            crate::AddressSpace::Uniform | crate::AddressSpace::Storage { .. } => true,\r\n            _ => false,\r\n        }\r\n    }\r\n\r\n    /// Whether a variable with this address space can be initialized\r\n    const fn initializable(&self) -> bool {\r\n        match *self {\r\n            crate::AddressSpace::Function | crate::AddressSpace::Private => true,\r\n            crate::AddressSpace::WorkGroup\r\n            | crate::AddressSpace::Uniform\r\n            | crate::AddressSpace::Storage { .. }\r\n            | crate::AddressSpace::Handle\r\n            | crate::AddressSpace::PushConstant => false,\r\n        }\r\n    }\r\n}\r\n\r\n/// A GLSL version.\r\n#[derive(Debug, Copy, Clone, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum Version {\r\n    /// `core` GLSL.\r\n    Desktop(u16),\r\n    /// `es` GLSL.\r\n    Embedded { version: u16, is_webgl: bool },\r\n}\r\n\r\nimpl Version {\r\n    /// Create a new gles version\r\n    pub const fn new_gles(version: u16) -> Self {\r\n        Self::Embedded {\r\n            version,\r\n            is_webgl: false,\r\n        }\r\n    }\r\n\r\n    /// Returns true if self is `Version::Embedded` (i.e. is a es version)\r\n    const fn is_es(&self) -> bool {\r\n        match *self {\r\n            Version::Desktop(_) => false,\r\n            Version::Embedded { .. } => true,\r\n        }\r\n    }\r\n\r\n    /// Returns true if targetting WebGL\r\n    const fn is_webgl(&self) -> bool {\r\n        match *self {\r\n            Version::Desktop(_) => false,\r\n            Version::Embedded { is_webgl, .. } => is_webgl,\r\n        }\r\n    }\r\n\r\n    /// Checks the list of currently supported versions and returns true if it contains the\r\n    /// specified version\r\n    ///\r\n    /// # Notes\r\n    /// As an invalid version number will never be added to the supported version list\r\n    /// so this also checks for version validity\r\n    fn is_supported(&self) -> bool {\r\n        match *self {\r\n            Version::Desktop(v) => SUPPORTED_CORE_VERSIONS.contains(&v),\r\n            Version::Embedded { version: v, .. } => SUPPORTED_ES_VERSIONS.contains(&v),\r\n        }\r\n    }\r\n\r\n    /// Checks if the version supports all of the explicit layouts:\r\n    /// - `location=` qualifiers for bindings\r\n    /// - `binding=` qualifiers for resources\r\n    ///\r\n    /// Note: `location=` for vertex inputs and fragment outputs is supported\r\n    /// unconditionally for GLES 300.\r\n    fn supports_explicit_locations(&self) -> bool {\r\n        *self >= Version::Desktop(410) || *self >= Version::new_gles(310)\r\n    }\r\n\r\n    fn supports_early_depth_test(&self) -> bool {\r\n        *self >= Version::Desktop(130) || *self >= Version::new_gles(310)\r\n    }\r\n\r\n    fn supports_std430_layout(&self) -> bool {\r\n        *self >= Version::Desktop(430) || *self >= Version::new_gles(310)\r\n    }\r\n\r\n    fn supports_fma_function(&self) -> bool {\r\n        *self >= Version::Desktop(400) || *self >= Version::new_gles(310)\r\n    }\r\n}\r\n\r\nimpl PartialOrd for Version {\r\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\r\n        match (*self, *other) {\r\n            (Version::Desktop(x), Version::Desktop(y)) => Some(x.cmp(&y)),\r\n            (Version::Embedded { version: x, .. }, Version::Embedded { version: y, .. }) => {\r\n                Some(x.cmp(&y))\r\n            }\r\n            _ => None,\r\n        }\r\n    }\r\n}\r\n\r\nimpl fmt::Display for Version {\r\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\r\n        match *self {\r\n            Version::Desktop(v) => write!(f, \"{} core\", v),\r\n            Version::Embedded { version: v, .. } => write!(f, \"{} es\", v),\r\n        }\r\n    }\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Configuration flags for the [`Writer`].\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct WriterFlags: u32 {\r\n        /// Flip output Y and extend Z from (0, 1) to (-1, 1).\r\n        const ADJUST_COORDINATE_SPACE = 0x1;\r\n        /// Supports GL_EXT_texture_shadow_lod on the host, which provides\r\n        /// additional functions on shadows and arrays of shadows.\r\n        const TEXTURE_SHADOW_LOD = 0x2;\r\n    }\r\n}\r\n\r\n/// Configuration used in the [`Writer`].\r\n#[derive(Debug, Clone)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct Options {\r\n    /// The GLSL version to be used.\r\n    pub version: Version,\r\n    /// Configuration flags for the [`Writer`].\r\n    pub writer_flags: WriterFlags,\r\n    /// Map of resources association to binding locations.\r\n    pub binding_map: BindingMap,\r\n}\r\n\r\nimpl Default for Options {\r\n    fn default() -> Self {\r\n        Options {\r\n            version: Version::new_gles(310),\r\n            writer_flags: WriterFlags::ADJUST_COORDINATE_SPACE,\r\n            binding_map: BindingMap::default(),\r\n        }\r\n    }\r\n}\r\n\r\n/// A subset of options meant to be changed per pipeline.\r\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct PipelineOptions {\r\n    /// The stage of the entry point.\r\n    pub shader_stage: ShaderStage,\r\n    /// The name of the entry point.\r\n    ///\r\n    /// If no entry point that matches is found while creating a [`Writer`], a error will be thrown.\r\n    pub entry_point: String,\r\n    /// How many views to render to, if doing multiview rendering.\r\n    pub multiview: Option<std::num::NonZeroU32>,\r\n}\r\n\r\n/// Reflection info for texture mappings and uniforms.\r\npub struct ReflectionInfo {\r\n    /// Mapping between texture names and variables/samplers.\r\n    pub texture_mapping: crate::FastHashMap<String, TextureMapping>,\r\n    /// Mapping between uniform variables and names.\r\n    pub uniforms: crate::FastHashMap<Handle<crate::GlobalVariable>, String>,\r\n}\r\n\r\n/// Mapping between a texture and its sampler, if it exists.\r\n///\r\n/// GLSL pre-Vulkan has no concept of separate textures and samplers. Instead, everything is a\r\n/// `gsamplerN` where `g` is the scalar type and `N` is the dimension. But naga uses separate textures\r\n/// and samplers in the IR, so the backend produces a [`FastHashMap`](crate::FastHashMap) with the texture name\r\n/// as a key and a [`TextureMapping`] as a value. This way, the user knows where to bind.\r\n///\r\n/// [`Storage`](crate::ImageClass::Storage) images produce `gimageN` and don't have an associated sampler,\r\n/// so the [`sampler`](Self::sampler) field will be [`None`].\r\n#[derive(Debug, Clone)]\r\npub struct TextureMapping {\r\n    /// Handle to the image global variable.\r\n    pub texture: Handle<crate::GlobalVariable>,\r\n    /// Handle to the associated sampler global variable, if it exists.\r\n    pub sampler: Option<Handle<crate::GlobalVariable>>,\r\n}\r\n\r\n/// Helper structure that generates a number\r\n#[derive(Default)]\r\nstruct IdGenerator(u32);\r\n\r\nimpl IdGenerator {\r\n    /// Generates a number that's guaranteed to be unique for this `IdGenerator`\r\n    fn generate(&mut self) -> u32 {\r\n        // It's just an increasing number but it does the job\r\n        let ret = self.0;\r\n        self.0 += 1;\r\n        ret\r\n    }\r\n}\r\n\r\n/// Helper wrapper used to get a name for a varying\r\n///\r\n/// Varying have different naming schemes depending on their binding:\r\n/// - Varyings with builtin bindings get the from [`glsl_built_in`](glsl_built_in).\r\n/// - Varyings with location bindings are named `_S_location_X` where `S` is a\r\n///   prefix identifying which pipeline stage the varying connects, and `X` is\r\n///   the location.\r\nstruct VaryingName<'a> {\r\n    binding: &'a crate::Binding,\r\n    stage: ShaderStage,\r\n    output: bool,\r\n    targetting_webgl: bool,\r\n}\r\nimpl fmt::Display for VaryingName<'_> {\r\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\r\n        match *self.binding {\r\n            crate::Binding::Location { location, .. } => {\r\n                let prefix = match (self.stage, self.output) {\r\n                    (ShaderStage::Compute, _) => unreachable!(),\r\n                    // pipeline to vertex\r\n                    (ShaderStage::Vertex, false) => \"p2vs\",\r\n                    // vertex to fragment\r\n                    (ShaderStage::Vertex, true) | (ShaderStage::Fragment, false) => \"vs2fs\",\r\n                    // fragment to pipeline\r\n                    (ShaderStage::Fragment, true) => \"fs2p\",\r\n                };\r\n                write!(f, \"_{}_location{}\", prefix, location,)\r\n            }\r\n            crate::Binding::BuiltIn(built_in) => {\r\n                write!(\r\n                    f,\r\n                    \"{}\",\r\n                    glsl_built_in(built_in, self.output, self.targetting_webgl)\r\n                )\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nimpl ShaderStage {\r\n    const fn to_str(self) -> &'static str {\r\n        match self {\r\n            ShaderStage::Compute => \"cs\",\r\n            ShaderStage::Fragment => \"fs\",\r\n            ShaderStage::Vertex => \"vs\",\r\n        }\r\n    }\r\n}\r\n\r\n/// Shorthand result used internally by the backend\r\ntype BackendResult<T = ()> = Result<T, Error>;\r\n\r\n/// A GLSL compilation error.\r\n#[derive(Debug, Error)]\r\npub enum Error {\r\n    /// A error occurred while writing to the output.\r\n    #[error(\"Format error\")]\r\n    FmtError(#[from] FmtError),\r\n    /// The specified [`Version`] doesn't have all required [`Features`].\r\n    ///\r\n    /// Contains the missing [`Features`].\r\n    #[error(\"The selected version doesn't support {0:?}\")]\r\n    MissingFeatures(Features),\r\n    /// [`AddressSpace::PushConstant`](crate::AddressSpace::PushConstant) was used more than\r\n    /// once in the entry point, which isn't supported.\r\n    #[error(\"Multiple push constants aren't supported\")]\r\n    MultiplePushConstants,\r\n    /// The specified [`Version`] isn't supported.\r\n    #[error(\"The specified version isn't supported\")]\r\n    VersionNotSupported,\r\n    /// The entry point couldn't be found.\r\n    #[error(\"The requested entry point couldn't be found\")]\r\n    EntryPointNotFound,\r\n    /// A call was made to an unsupported external.\r\n    #[error(\"A call was made to an unsupported external: {0}\")]\r\n    UnsupportedExternal(String),\r\n    /// A scalar with an unsupported width was requested.\r\n    #[error(\"A scalar with an unsupported width was requested: {0:?} {1:?}\")]\r\n    UnsupportedScalar(crate::ScalarKind, crate::Bytes),\r\n    /// A image was used with multiple samplers, which isn't supported.\r\n    #[error(\"A image was used with multiple samplers\")]\r\n    ImageMultipleSamplers,\r\n    #[error(\"{0}\")]\r\n    Custom(String),\r\n}\r\n\r\n/// Binary operation with a different logic on the GLSL side.\r\nenum BinaryOperation {\r\n    /// Vector comparison should use the function like `greaterThan()`, etc.\r\n    VectorCompare,\r\n    /// Vector component wise operation; used to polyfill unsupported ops like `|` and `&` for `bvecN`'s\r\n    VectorComponentWise,\r\n    /// GLSL `%` is SPIR-V `OpUMod/OpSMod` and `mod()` is `OpFMod`, but [`BinaryOperator::Modulo`](crate::BinaryOperator::Modulo) is `OpFRem`.\r\n    Modulo,\r\n    /// Any plain operation. No additional logic required.\r\n    Other,\r\n}\r\n\r\n/// Writer responsible for all code generation.\r\npub struct Writer<'a, W> {\r\n    // Inputs\r\n    /// The module being written.\r\n    module: &'a crate::Module,\r\n    /// The module analysis.\r\n    info: &'a valid::ModuleInfo,\r\n    /// The output writer.\r\n    out: W,\r\n    /// User defined configuration to be used.\r\n    options: &'a Options,\r\n    /// The bound checking policies to be used\r\n    policies: proc::BoundsCheckPolicies,\r\n\r\n    // Internal State\r\n    /// Features manager used to store all the needed features and write them.\r\n    features: FeaturesManager,\r\n    namer: proc::Namer,\r\n    /// A map with all the names needed for writing the module\r\n    /// (generated by a [`Namer`](crate::proc::Namer)).\r\n    names: crate::FastHashMap<NameKey, String>,\r\n    /// A map with the names of global variables needed for reflections.\r\n    reflection_names_globals: crate::FastHashMap<Handle<crate::GlobalVariable>, String>,\r\n    /// The selected entry point.\r\n    entry_point: &'a crate::EntryPoint,\r\n    /// The index of the selected entry point.\r\n    entry_point_idx: proc::EntryPointIndex,\r\n    /// A generator for unique block numbers.\r\n    block_id: IdGenerator,\r\n    /// Set of expressions that have associated temporary variables.\r\n    named_expressions: crate::NamedExpressions,\r\n    /// Set of expressions that need to be baked to avoid unnecessary repetition in output\r\n    need_bake_expressions: back::NeedBakeExpressions,\r\n    /// How many views to render to, if doing multiview rendering.\r\n    multiview: Option<std::num::NonZeroU32>,\r\n}\r\n\r\nimpl<'a, W: Write> Writer<'a, W> {\r\n    /// Creates a new [`Writer`] instance.\r\n    ///\r\n    /// # Errors\r\n    /// - If the version specified is invalid or supported.\r\n    /// - If the entry point couldn't be found in the module.\r\n    /// - If the version specified doesn't support some used features.\r\n    pub fn new(\r\n        out: W,\r\n        module: &'a crate::Module,\r\n        info: &'a valid::ModuleInfo,\r\n        options: &'a Options,\r\n        pipeline_options: &'a PipelineOptions,\r\n        policies: proc::BoundsCheckPolicies,\r\n    ) -> Result<Self, Error> {\r\n        // Check if the requested version is supported\r\n        if !options.version.is_supported() {\r\n            log::error!(\"Version {}\", options.version);\r\n            return Err(Error::VersionNotSupported);\r\n        }\r\n\r\n        // Try to find the entry point and corresponding index\r\n        let ep_idx = module\r\n            .entry_points\r\n            .iter()\r\n            .position(|ep| {\r\n                pipeline_options.shader_stage == ep.stage && pipeline_options.entry_point == ep.name\r\n            })\r\n            .ok_or(Error::EntryPointNotFound)?;\r\n\r\n        // Generate a map with names required to write the module\r\n        let mut names = crate::FastHashMap::default();\r\n        let mut namer = proc::Namer::default();\r\n        namer.reset(module, keywords::RESERVED_KEYWORDS, &[\"gl_\"], &mut names);\r\n\r\n        // Build the instance\r\n        let mut this = Self {\r\n            module,\r\n            info,\r\n            out,\r\n            options,\r\n            policies,\r\n\r\n            namer,\r\n            features: FeaturesManager::new(),\r\n            names,\r\n            reflection_names_globals: crate::FastHashMap::default(),\r\n            entry_point: &module.entry_points[ep_idx],\r\n            entry_point_idx: ep_idx as u16,\r\n            multiview: pipeline_options.multiview,\r\n            block_id: IdGenerator::default(),\r\n            named_expressions: Default::default(),\r\n            need_bake_expressions: Default::default(),\r\n        };\r\n\r\n        // Find all features required to print this module\r\n        this.collect_required_features()?;\r\n\r\n        Ok(this)\r\n    }\r\n\r\n    /// Writes the [`Module`](crate::Module) as glsl to the output\r\n    ///\r\n    /// # Notes\r\n    /// If an error occurs while writing, the output might have been written partially\r\n    ///\r\n    /// # Panics\r\n    /// Might panic if the module is invalid\r\n    pub fn write(&mut self) -> Result<ReflectionInfo, Error> {\r\n        // We use `writeln!(self.out)` throughout the write to add newlines\r\n        // to make the output more readable\r\n\r\n        let es = self.options.version.is_es();\r\n\r\n        // Write the version (It must be the first thing or it isn't a valid glsl output)\r\n        writeln!(self.out, \"#version {}\", self.options.version)?;\r\n        // Write all the needed extensions\r\n        //\r\n        // This used to be the last thing being written as it allowed to search for features while\r\n        // writing the module saving some loops but some older versions (420 or less) required the\r\n        // extensions to appear before being used, even though extensions are part of the\r\n        // preprocessor not the processor ¯\\_(ツ)_/¯\r\n        self.features.write(self.options.version, &mut self.out)?;\r\n\r\n        // Write the additional extensions\r\n        if self\r\n            .options\r\n            .writer_flags\r\n            .contains(WriterFlags::TEXTURE_SHADOW_LOD)\r\n        {\r\n            // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_shadow_lod.txt\r\n            writeln!(self.out, \"#extension GL_EXT_texture_shadow_lod : require\")?;\r\n        }\r\n\r\n        // glsl es requires a precision to be specified for floats and ints\r\n        // TODO: Should this be user configurable?\r\n        if es {\r\n            writeln!(self.out)?;\r\n            writeln!(self.out, \"precision highp float;\")?;\r\n            writeln!(self.out, \"precision highp int;\")?;\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        if self.entry_point.stage == ShaderStage::Compute {\r\n            let workgroup_size = self.entry_point.workgroup_size;\r\n            writeln!(\r\n                self.out,\r\n                \"layout(local_size_x = {}, local_size_y = {}, local_size_z = {}) in;\",\r\n                workgroup_size[0], workgroup_size[1], workgroup_size[2]\r\n            )?;\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // Enable early depth tests if needed\r\n        if let Some(depth_test) = self.entry_point.early_depth_test {\r\n            // If early depth test is supported for this version of GLSL\r\n            if self.options.version.supports_early_depth_test() {\r\n                writeln!(self.out, \"layout(early_fragment_tests) in;\")?;\r\n\r\n                if let Some(conservative) = depth_test.conservative {\r\n                    use crate::ConservativeDepth as Cd;\r\n\r\n                    let depth = match conservative {\r\n                        Cd::GreaterEqual => \"greater\",\r\n                        Cd::LessEqual => \"less\",\r\n                        Cd::Unchanged => \"unchanged\",\r\n                    };\r\n                    writeln!(self.out, \"layout (depth_{}) out float gl_FragDepth;\", depth)?;\r\n                }\r\n                writeln!(self.out)?;\r\n            } else {\r\n                log::warn!(\r\n                    \"Early depth testing is not supported for this version of GLSL: {}\",\r\n                    self.options.version\r\n                );\r\n            }\r\n        }\r\n\r\n        if self.entry_point.stage == ShaderStage::Vertex && self.options.version.is_webgl() {\r\n            if let Some(multiview) = self.multiview.as_ref() {\r\n                writeln!(self.out, \"layout(num_views = {}) in;\", multiview)?;\r\n                writeln!(self.out)?;\r\n            }\r\n        }\r\n\r\n        let ep_info = self.info.get_entry_point(self.entry_point_idx as usize);\r\n\r\n        // Write struct types.\r\n        //\r\n        // This are always ordered because the IR is structured in a way that\r\n        // you can't make a struct without adding all of its members first.\r\n        for (handle, ty) in self.module.types.iter() {\r\n            if let TypeInner::Struct { ref members, .. } = ty.inner {\r\n                // Structures ending with runtime-sized arrays can only be\r\n                // rendered as shader storage blocks in GLSL, not stand-alone\r\n                // struct types.\r\n                if !self.module.types[members.last().unwrap().ty]\r\n                    .inner\r\n                    .is_dynamically_sized(&self.module.types)\r\n                {\r\n                    let name = &self.names[&NameKey::Type(handle)];\r\n                    write!(self.out, \"struct {} \", name)?;\r\n                    self.write_struct_body(handle, members)?;\r\n                    writeln!(self.out, \";\")?;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Write the globals\r\n        //\r\n        // We filter all globals that aren't used by the selected entry point as they might be\r\n        // interfere with each other (i.e. two globals with the same location but different with\r\n        // different classes)\r\n        for (handle, global) in self.module.global_variables.iter() {\r\n            if ep_info[handle].is_empty() {\r\n                continue;\r\n            }\r\n\r\n            match self.module.types[global.ty].inner {\r\n                // We treat images separately because they might require\r\n                // writing the storage format\r\n                TypeInner::Image {\r\n                    mut dim,\r\n                    arrayed,\r\n                    class,\r\n                } => {\r\n                    // Gather the storage format if needed\r\n                    let storage_format_access = match self.module.types[global.ty].inner {\r\n                        TypeInner::Image {\r\n                            class: crate::ImageClass::Storage { format, access },\r\n                            ..\r\n                        } => Some((format, access)),\r\n                        _ => None,\r\n                    };\r\n\r\n                    if dim == crate::ImageDimension::D1 && es {\r\n                        dim = crate::ImageDimension::D2\r\n                    }\r\n\r\n                    // Gether the location if needed\r\n                    let layout_binding = if self.options.version.supports_explicit_locations() {\r\n                        let br = global.binding.as_ref().unwrap();\r\n                        self.options.binding_map.get(br).cloned()\r\n                    } else {\r\n                        None\r\n                    };\r\n\r\n                    // Write all the layout qualifiers\r\n                    if layout_binding.is_some() || storage_format_access.is_some() {\r\n                        write!(self.out, \"layout(\")?;\r\n                        if let Some(binding) = layout_binding {\r\n                            write!(self.out, \"binding = {}\", binding)?;\r\n                        }\r\n                        if let Some((format, _)) = storage_format_access {\r\n                            let format_str = glsl_storage_format(format);\r\n                            let separator = match layout_binding {\r\n                                Some(_) => \",\",\r\n                                None => \"\",\r\n                            };\r\n                            write!(self.out, \"{}{}\", separator, format_str)?;\r\n                        }\r\n                        write!(self.out, \") \")?;\r\n                    }\r\n\r\n                    if let Some((_, access)) = storage_format_access {\r\n                        self.write_storage_access(access)?;\r\n                    }\r\n\r\n                    // All images in glsl are `uniform`\r\n                    // The trailing space is important\r\n                    write!(self.out, \"uniform \")?;\r\n\r\n                    // write the type\r\n                    //\r\n                    // This is way we need the leading space because `write_image_type` doesn't add\r\n                    // any spaces at the beginning or end\r\n                    self.write_image_type(dim, arrayed, class)?;\r\n\r\n                    // Finally write the name and end the global with a `;`\r\n                    // The leading space is important\r\n                    let global_name = self.get_global_name(handle, global);\r\n                    writeln!(self.out, \" {};\", global_name)?;\r\n                    writeln!(self.out)?;\r\n\r\n                    self.reflection_names_globals.insert(handle, global_name);\r\n                }\r\n                // glsl has no concept of samplers so we just ignore it\r\n                TypeInner::Sampler { .. } => continue,\r\n                // All other globals are written by `write_global`\r\n                _ => {\r\n                    if !ep_info[handle].is_empty() {\r\n                        self.write_global(handle, global)?;\r\n                        // Add a newline (only for readability)\r\n                        writeln!(self.out)?;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        for arg in self.entry_point.function.arguments.iter() {\r\n            self.write_varying(arg.binding.as_ref(), arg.ty, false)?;\r\n        }\r\n        if let Some(ref result) = self.entry_point.function.result {\r\n            self.write_varying(result.binding.as_ref(), result.ty, true)?;\r\n        }\r\n        writeln!(self.out)?;\r\n\r\n        // Write all regular functions\r\n        for (handle, function) in self.module.functions.iter() {\r\n            // Check that the function doesn't use globals that aren't supported\r\n            // by the current entry point\r\n            if !ep_info.dominates_global_use(&self.info[handle]) {\r\n                continue;\r\n            }\r\n\r\n            let fun_info = &self.info[handle];\r\n\r\n            // Write the function\r\n            self.write_function(back::FunctionType::Function(handle), function, fun_info)?;\r\n\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        self.write_function(\r\n            back::FunctionType::EntryPoint(self.entry_point_idx),\r\n            &self.entry_point.function,\r\n            ep_info,\r\n        )?;\r\n\r\n        // Add newline at the end of file\r\n        writeln!(self.out)?;\r\n\r\n        // Collect all reflection info and return it to the user\r\n        self.collect_reflection_info()\r\n    }\r\n\r\n    fn write_array_size(\r\n        &mut self,\r\n        base: Handle<crate::Type>,\r\n        size: crate::ArraySize,\r\n    ) -> BackendResult {\r\n        write!(self.out, \"[\")?;\r\n\r\n        // Write the array size\r\n        // Writes nothing if `ArraySize::Dynamic`\r\n        // Panics if `ArraySize::Constant` has a constant that isn't an sint or uint\r\n        match size {\r\n            crate::ArraySize::Constant(const_handle) => {\r\n                match self.module.constants[const_handle].inner {\r\n                    crate::ConstantInner::Scalar {\r\n                        width: _,\r\n                        value: crate::ScalarValue::Uint(size),\r\n                    } => write!(self.out, \"{}\", size)?,\r\n                    crate::ConstantInner::Scalar {\r\n                        width: _,\r\n                        value: crate::ScalarValue::Sint(size),\r\n                    } => write!(self.out, \"{}\", size)?,\r\n                    _ => unreachable!(),\r\n                }\r\n            }\r\n            crate::ArraySize::Dynamic => (),\r\n        }\r\n\r\n        write!(self.out, \"]\")?;\r\n\r\n        if let TypeInner::Array {\r\n            base: next_base,\r\n            size: next_size,\r\n            ..\r\n        } = self.module.types[base].inner\r\n        {\r\n            self.write_array_size(next_base, next_size)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write value types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    ///\r\n    /// # Panics\r\n    /// - If type is either a image, a sampler, a pointer, or a struct\r\n    /// - If it's an Array with a [`ArraySize::Constant`](crate::ArraySize::Constant) with a\r\n    /// constant that isn't a [`Scalar`](crate::ConstantInner::Scalar) or if the\r\n    /// scalar value isn't an [`Sint`](crate::ScalarValue::Sint) or [`Uint`](crate::ScalarValue::Uint)\r\n    fn write_value_type(&mut self, inner: &TypeInner) -> BackendResult {\r\n        match *inner {\r\n            // Scalars are simple we just get the full name from `glsl_scalar`\r\n            TypeInner::Scalar { kind, width }\r\n            | TypeInner::Atomic { kind, width }\r\n            | TypeInner::ValuePointer {\r\n                size: None,\r\n                kind,\r\n                width,\r\n                space: _,\r\n            } => write!(self.out, \"{}\", glsl_scalar(kind, width)?.full)?,\r\n            // Vectors are just `gvecN` where `g` is the scalar prefix and `N` is the vector size\r\n            TypeInner::Vector { size, kind, width }\r\n            | TypeInner::ValuePointer {\r\n                size: Some(size),\r\n                kind,\r\n                width,\r\n                space: _,\r\n            } => write!(\r\n                self.out,\r\n                \"{}vec{}\",\r\n                glsl_scalar(kind, width)?.prefix,\r\n                size as u8\r\n            )?,\r\n            // Matrices are written with `gmatMxN` where `g` is the scalar prefix (only floats and\r\n            // doubles are allowed), `M` is the columns count and `N` is the rows count\r\n            //\r\n            // glsl supports a matrix shorthand `gmatN` where `N` = `M` but it doesn't justify the\r\n            // extra branch to write matrices this way\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => write!(\r\n                self.out,\r\n                \"{}mat{}x{}\",\r\n                glsl_scalar(crate::ScalarKind::Float, width)?.prefix,\r\n                columns as u8,\r\n                rows as u8\r\n            )?,\r\n            // GLSL arrays are written as `type name[size]`\r\n            // Current code is written arrays only as `[size]`\r\n            // Base `type` and `name` should be written outside\r\n            TypeInner::Array { base, size, .. } => self.write_array_size(base, size)?,\r\n            // Panic if either Image, Sampler, Pointer, or a Struct is being written\r\n            //\r\n            // Write all variants instead of `_` so that if new variants are added a\r\n            // no exhaustiveness error is thrown\r\n            TypeInner::Pointer { .. }\r\n            | TypeInner::Struct { .. }\r\n            | TypeInner::Image { .. }\r\n            | TypeInner::Sampler { .. }\r\n            | TypeInner::BindingArray { .. } => {\r\n                return Err(Error::Custom(format!(\"Unable to write type {:?}\", inner)))\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write non image/sampler types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    ///\r\n    /// # Panics\r\n    /// - If type is either a image or sampler\r\n    /// - If it's an Array with a [`ArraySize::Constant`](crate::ArraySize::Constant) with a\r\n    /// constant that isn't a [`Scalar`](crate::ConstantInner::Scalar) or if the\r\n    /// scalar value isn't an [`Sint`](crate::ScalarValue::Sint) or [`Uint`](crate::ScalarValue::Uint)\r\n    fn write_type(&mut self, ty: Handle<crate::Type>) -> BackendResult {\r\n        match self.module.types[ty].inner {\r\n            // glsl has no pointer types so just write types as normal and loads are skipped\r\n            TypeInner::Pointer { base, .. } => self.write_type(base),\r\n            // glsl structs are written as just the struct name\r\n            TypeInner::Struct { .. } => {\r\n                // Get the struct name\r\n                let name = &self.names[&NameKey::Type(ty)];\r\n                write!(self.out, \"{}\", name)?;\r\n                Ok(())\r\n            }\r\n            // glsl array has the size separated from the base type\r\n            TypeInner::Array { base, .. } => self.write_type(base),\r\n            ref other => self.write_value_type(other),\r\n        }\r\n    }\r\n\r\n    /// Helper method to write a image type\r\n    ///\r\n    /// # Notes\r\n    /// Adds no leading or trailing whitespace\r\n    fn write_image_type(\r\n        &mut self,\r\n        dim: crate::ImageDimension,\r\n        arrayed: bool,\r\n        class: crate::ImageClass,\r\n    ) -> BackendResult {\r\n        // glsl images consist of four parts the scalar prefix, the image \"type\", the dimensions\r\n        // and modifiers\r\n        //\r\n        // There exists two image types\r\n        // - sampler - for sampled images\r\n        // - image - for storage images\r\n        //\r\n        // There are three possible modifiers that can be used together and must be written in\r\n        // this order to be valid\r\n        // - MS - used if it's a multisampled image\r\n        // - Array - used if it's an image array\r\n        // - Shadow - used if it's a depth image\r\n        use crate::ImageClass as Ic;\r\n\r\n        let (base, kind, ms, comparison) = match class {\r\n            Ic::Sampled { kind, multi: true } => (\"sampler\", kind, \"MS\", \"\"),\r\n            Ic::Sampled { kind, multi: false } => (\"sampler\", kind, \"\", \"\"),\r\n            Ic::Depth { multi: true } => (\"sampler\", crate::ScalarKind::Float, \"MS\", \"\"),\r\n            Ic::Depth { multi: false } => (\"sampler\", crate::ScalarKind::Float, \"\", \"Shadow\"),\r\n            Ic::Storage { format, .. } => (\"image\", format.into(), \"\", \"\"),\r\n        };\r\n\r\n        write!(\r\n            self.out,\r\n            \"highp {}{}{}{}{}{}\",\r\n            glsl_scalar(kind, 4)?.prefix,\r\n            base,\r\n            glsl_dimension(dim),\r\n            ms,\r\n            if arrayed { \"Array\" } else { \"\" },\r\n            comparison\r\n        )?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write non images/sampler globals\r\n    ///\r\n    /// # Notes\r\n    /// Adds a newline\r\n    ///\r\n    /// # Panics\r\n    /// If the global has type sampler\r\n    fn write_global(\r\n        &mut self,\r\n        handle: Handle<crate::GlobalVariable>,\r\n        global: &crate::GlobalVariable,\r\n    ) -> BackendResult {\r\n        if self.options.version.supports_explicit_locations() {\r\n            if let Some(ref br) = global.binding {\r\n                match self.options.binding_map.get(br) {\r\n                    Some(binding) => {\r\n                        let layout = match global.space {\r\n                            crate::AddressSpace::Storage { .. } => {\r\n                                if self.options.version.supports_std430_layout() {\r\n                                    \"std430, \"\r\n                                } else {\r\n                                    \"std140, \"\r\n                                }\r\n                            }\r\n                            crate::AddressSpace::Uniform => \"std140, \",\r\n                            _ => \"\",\r\n                        };\r\n                        write!(self.out, \"layout({}binding = {}) \", layout, binding)?\r\n                    }\r\n                    None => {\r\n                        log::debug!(\"unassigned binding for {:?}\", global.name);\r\n                        if let crate::AddressSpace::Storage { .. } = global.space {\r\n                            if self.options.version.supports_std430_layout() {\r\n                                write!(self.out, \"layout(std430) \")?\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if let crate::AddressSpace::Storage { access } = global.space {\r\n            self.write_storage_access(access)?;\r\n        }\r\n\r\n        if let Some(storage_qualifier) = glsl_storage_qualifier(global.space) {\r\n            write!(self.out, \"{} \", storage_qualifier)?;\r\n        }\r\n\r\n        match global.space {\r\n            crate::AddressSpace::Private => {\r\n                self.write_simple_global(handle, global)?;\r\n            }\r\n            crate::AddressSpace::WorkGroup => {\r\n                self.write_simple_global(handle, global)?;\r\n            }\r\n            crate::AddressSpace::PushConstant => {\r\n                self.write_simple_global(handle, global)?;\r\n            }\r\n            crate::AddressSpace::Uniform => {\r\n                self.write_interface_block(handle, global)?;\r\n            }\r\n            crate::AddressSpace::Storage { .. } => {\r\n                self.write_interface_block(handle, global)?;\r\n            }\r\n            // A global variable in the `Function` address space is a\r\n            // contradiction in terms.\r\n            crate::AddressSpace::Function => unreachable!(),\r\n            // Textures and samplers are handled directly in `Writer::write`.\r\n            crate::AddressSpace::Handle => unreachable!(),\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn write_simple_global(\r\n        &mut self,\r\n        handle: Handle<crate::GlobalVariable>,\r\n        global: &crate::GlobalVariable,\r\n    ) -> BackendResult {\r\n        self.write_type(global.ty)?;\r\n        write!(self.out, \" \")?;\r\n        self.write_global_name(handle, global)?;\r\n\r\n        if let TypeInner::Array { base, size, .. } = self.module.types[global.ty].inner {\r\n            self.write_array_size(base, size)?;\r\n        }\r\n\r\n        if global.space.initializable() && is_value_init_supported(self.module, global.ty) {\r\n            write!(self.out, \" = \")?;\r\n            if let Some(init) = global.init {\r\n                self.write_constant(init)?;\r\n            } else {\r\n                self.write_zero_init_value(global.ty)?;\r\n            }\r\n        }\r\n\r\n        writeln!(self.out, \";\")?;\r\n\r\n        if let crate::AddressSpace::PushConstant = global.space {\r\n            let global_name = self.get_global_name(handle, global);\r\n            self.reflection_names_globals.insert(handle, global_name);\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Write an interface block for a single Naga global.\r\n    ///\r\n    /// Write `block_name { members }`. Since `block_name` must be unique\r\n    /// between blocks and structs, we add `_block_ID` where `ID` is a\r\n    /// `IdGenerator` generated number. Write `members` in the same way we write\r\n    /// a struct's members.\r\n    fn write_interface_block(\r\n        &mut self,\r\n        handle: Handle<crate::GlobalVariable>,\r\n        global: &crate::GlobalVariable,\r\n    ) -> BackendResult {\r\n        // Write the block name, it's just the struct name appended with `_block_ID`\r\n        let ty_name = &self.names[&NameKey::Type(global.ty)];\r\n        let block_name = format!(\r\n            \"{}_block_{}{:?}\",\r\n            ty_name,\r\n            self.block_id.generate(),\r\n            self.entry_point.stage,\r\n        );\r\n        write!(self.out, \"{} \", block_name)?;\r\n        self.reflection_names_globals.insert(handle, block_name);\r\n\r\n        match self.module.types[global.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. }\r\n                if self.module.types[members.last().unwrap().ty]\r\n                    .inner\r\n                    .is_dynamically_sized(&self.module.types) =>\r\n            {\r\n                // Structs with dynamically sized arrays must have their\r\n                // members lifted up as members of the interface block. GLSL\r\n                // can't write such struct types anyway.\r\n                self.write_struct_body(global.ty, members)?;\r\n                write!(self.out, \" \")?;\r\n                self.write_global_name(handle, global)?;\r\n            }\r\n            _ => {\r\n                // A global of any other type is written as the sole member\r\n                // of the interface block. Since the interface block is\r\n                // anonymous, this becomes visible in the global scope.\r\n                write!(self.out, \"{{ \")?;\r\n                self.write_type(global.ty)?;\r\n                write!(self.out, \" \")?;\r\n                self.write_global_name(handle, global)?;\r\n                if let TypeInner::Array { base, size, .. } = self.module.types[global.ty].inner {\r\n                    self.write_array_size(base, size)?;\r\n                }\r\n                write!(self.out, \"; }}\")?;\r\n            }\r\n        }\r\n\r\n        writeln!(self.out, \";\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to find which expressions of a given function require baking\r\n    ///\r\n    /// # Notes\r\n    /// Clears `need_bake_expressions` set before adding to it\r\n    fn update_expressions_to_bake(&mut self, func: &crate::Function, info: &valid::FunctionInfo) {\r\n        use crate::Expression;\r\n        self.need_bake_expressions.clear();\r\n        for expr in func.expressions.iter() {\r\n            let expr_info = &info[expr.0];\r\n            let min_ref_count = func.expressions[expr.0].bake_ref_count();\r\n            if min_ref_count <= expr_info.ref_count {\r\n                self.need_bake_expressions.insert(expr.0);\r\n            }\r\n            // if the expression is a Dot product with integer arguments,\r\n            // then the args needs baking as well\r\n            if let (\r\n                fun_handle,\r\n                &Expression::Math {\r\n                    fun: crate::MathFunction::Dot,\r\n                    arg,\r\n                    arg1,\r\n                    ..\r\n                },\r\n            ) = expr\r\n            {\r\n                let inner = info[fun_handle].ty.inner_with(&self.module.types);\r\n                if let TypeInner::Scalar { kind, .. } = *inner {\r\n                    match kind {\r\n                        crate::ScalarKind::Sint | crate::ScalarKind::Uint => {\r\n                            self.need_bake_expressions.insert(arg);\r\n                            self.need_bake_expressions.insert(arg1.unwrap());\r\n                        }\r\n                        _ => {}\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Helper method used to get a name for a global\r\n    ///\r\n    /// Globals have different naming schemes depending on their binding:\r\n    /// - Globals without bindings use the name from the [`Namer`](crate::proc::Namer)\r\n    /// - Globals with resource binding are named `_group_X_binding_Y` where `X`\r\n    ///   is the group and `Y` is the binding\r\n    fn get_global_name(\r\n        &self,\r\n        handle: Handle<crate::GlobalVariable>,\r\n        global: &crate::GlobalVariable,\r\n    ) -> String {\r\n        match global.binding {\r\n            Some(ref br) => {\r\n                format!(\r\n                    \"_group_{}_binding_{}_{}\",\r\n                    br.group,\r\n                    br.binding,\r\n                    self.entry_point.stage.to_str()\r\n                )\r\n            }\r\n            None => self.names[&NameKey::GlobalVariable(handle)].clone(),\r\n        }\r\n    }\r\n\r\n    /// Helper method used to write a name for a global without additional heap allocation\r\n    fn write_global_name(\r\n        &mut self,\r\n        handle: Handle<crate::GlobalVariable>,\r\n        global: &crate::GlobalVariable,\r\n    ) -> BackendResult {\r\n        match global.binding {\r\n            Some(ref br) => write!(\r\n                self.out,\r\n                \"_group_{}_binding_{}_{}\",\r\n                br.group,\r\n                br.binding,\r\n                self.entry_point.stage.to_str()\r\n            )?,\r\n            None => write!(\r\n                self.out,\r\n                \"{}\",\r\n                &self.names[&NameKey::GlobalVariable(handle)]\r\n            )?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Write a GLSL global that will carry a Naga entry point's argument or return value.\r\n    ///\r\n    /// A Naga entry point's arguments and return value are rendered in GLSL as\r\n    /// variables at global scope with the `in` and `out` storage qualifiers.\r\n    /// The code we generate for `main` loads from all the `in` globals into\r\n    /// appropriately named locals. Before it returns, `main` assigns the\r\n    /// components of its return value into all the `out` globals.\r\n    ///\r\n    /// This function writes a declaration for one such GLSL global,\r\n    /// representing a value passed into or returned from [`self.entry_point`]\r\n    /// that has a [`Location`] binding. The global's name is generated based on\r\n    /// the location index and the shader stages being connected; see\r\n    /// [`VaryingName`]. This means we don't need to know the names of\r\n    /// arguments, just their types and bindings.\r\n    ///\r\n    /// Emit nothing for entry point arguments or return values with [`BuiltIn`]\r\n    /// bindings; `main` will read from or assign to the appropriate GLSL\r\n    /// special variable; these are pre-declared. As an exception, we do declare\r\n    /// `gl_Position` or `gl_FragCoord` with the `invariant` qualifier if\r\n    /// needed.\r\n    ///\r\n    /// Use `output` together with [`self.entry_point.stage`] to determine which\r\n    /// shader stages are being connected, and choose the `in` or `out` storage\r\n    /// qualifier.\r\n    ///\r\n    /// [`self.entry_point`]: Writer::entry_point\r\n    /// [`self.entry_point.stage`]: crate::EntryPoint::stage\r\n    /// [`Location`]: crate::Binding::Location\r\n    /// [`BuiltIn`]: crate::Binding::BuiltIn\r\n    fn write_varying(\r\n        &mut self,\r\n        binding: Option<&crate::Binding>,\r\n        ty: Handle<crate::Type>,\r\n        output: bool,\r\n    ) -> Result<(), Error> {\r\n        // For a struct, emit a separate global for each member with a binding.\r\n        if let crate::TypeInner::Struct { ref members, .. } = self.module.types[ty].inner {\r\n            for member in members {\r\n                self.write_varying(member.binding.as_ref(), member.ty, output)?;\r\n            }\r\n            return Ok(());\r\n        }\r\n\r\n        let binding = match binding {\r\n            None => return Ok(()),\r\n            Some(binding) => binding,\r\n        };\r\n\r\n        let (location, interpolation, sampling) = match *binding {\r\n            crate::Binding::Location {\r\n                location,\r\n                interpolation,\r\n                sampling,\r\n            } => (location, interpolation, sampling),\r\n            crate::Binding::BuiltIn(built_in) => {\r\n                if let crate::BuiltIn::Position { invariant: true } = built_in {\r\n                    writeln!(\r\n                        self.out,\r\n                        \"invariant {};\",\r\n                        glsl_built_in(built_in, output, self.options.version.is_webgl())\r\n                    )?;\r\n                }\r\n                return Ok(());\r\n            }\r\n        };\r\n\r\n        // Write the interpolation modifier if needed\r\n        //\r\n        // We ignore all interpolation and auxiliary modifiers that aren't used in fragment\r\n        // shaders' input globals or vertex shaders' output globals.\r\n        let emit_interpolation_and_auxiliary = match self.entry_point.stage {\r\n            ShaderStage::Vertex => output,\r\n            ShaderStage::Fragment => !output,\r\n            _ => false,\r\n        };\r\n\r\n        // Write the I/O locations, if allowed\r\n        if self.options.version.supports_explicit_locations() || !emit_interpolation_and_auxiliary {\r\n            write!(self.out, \"layout(location = {}) \", location)?;\r\n        }\r\n\r\n        // Write the interpolation qualifier.\r\n        if let Some(interp) = interpolation {\r\n            if emit_interpolation_and_auxiliary {\r\n                write!(self.out, \"{} \", glsl_interpolation(interp))?;\r\n            }\r\n        }\r\n\r\n        // Write the sampling auxiliary qualifier.\r\n        //\r\n        // Before GLSL 4.2, the `centroid` and `sample` qualifiers were required to appear\r\n        // immediately before the `in` / `out` qualifier, so we'll just follow that rule\r\n        // here, regardless of the version.\r\n        if let Some(sampling) = sampling {\r\n            if emit_interpolation_and_auxiliary {\r\n                if let Some(qualifier) = glsl_sampling(sampling) {\r\n                    write!(self.out, \"{} \", qualifier)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Write the input/output qualifier.\r\n        write!(self.out, \"{} \", if output { \"out\" } else { \"in\" })?;\r\n\r\n        // Write the type\r\n        // `write_type` adds no leading or trailing spaces\r\n        self.write_type(ty)?;\r\n\r\n        // Finally write the global name and end the global with a `;` and a newline\r\n        // Leading space is important\r\n        let vname = VaryingName {\r\n            binding: &crate::Binding::Location {\r\n                location,\r\n                interpolation: None,\r\n                sampling: None,\r\n            },\r\n            stage: self.entry_point.stage,\r\n            output,\r\n            targetting_webgl: self.options.version.is_webgl(),\r\n        };\r\n        writeln!(self.out, \" {};\", vname)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write functions (both entry points and regular functions)\r\n    ///\r\n    /// # Notes\r\n    /// Adds a newline\r\n    fn write_function(\r\n        &mut self,\r\n        ty: back::FunctionType,\r\n        func: &crate::Function,\r\n        info: &valid::FunctionInfo,\r\n    ) -> BackendResult {\r\n        // Create a function context for the function being written\r\n        let ctx = back::FunctionCtx {\r\n            ty,\r\n            info,\r\n            expressions: &func.expressions,\r\n            named_expressions: &func.named_expressions,\r\n        };\r\n\r\n        self.named_expressions.clear();\r\n        self.update_expressions_to_bake(func, info);\r\n\r\n        // Write the function header\r\n        //\r\n        // glsl headers are the same as in c:\r\n        // `ret_type name(args)`\r\n        // `ret_type` is the return type\r\n        // `name` is the function name\r\n        // `args` is a comma separated list of `type name`\r\n        //  | - `type` is the argument type\r\n        //  | - `name` is the argument name\r\n\r\n        // Start by writing the return type if any otherwise write void\r\n        // This is the only place where `void` is a valid type\r\n        // (though it's more a keyword than a type)\r\n        if let back::FunctionType::EntryPoint(_) = ctx.ty {\r\n            write!(self.out, \"void\")?;\r\n        } else if let Some(ref result) = func.result {\r\n            self.write_type(result.ty)?;\r\n        } else {\r\n            write!(self.out, \"void\")?;\r\n        }\r\n\r\n        // Write the function name and open parentheses for the argument list\r\n        let function_name = match ctx.ty {\r\n            back::FunctionType::Function(handle) => &self.names[&NameKey::Function(handle)],\r\n            back::FunctionType::EntryPoint(_) => \"main\",\r\n        };\r\n        write!(self.out, \" {}(\", function_name)?;\r\n\r\n        // Write the comma separated argument list\r\n        //\r\n        // We need access to `Self` here so we use the reference passed to the closure as an\r\n        // argument instead of capturing as that would cause a borrow checker error\r\n        let arguments = match ctx.ty {\r\n            back::FunctionType::EntryPoint(_) => &[][..],\r\n            back::FunctionType::Function(_) => &func.arguments,\r\n        };\r\n        let arguments: Vec<_> = arguments\r\n            .iter()\r\n            .enumerate()\r\n            .filter(|&(_, arg)| match self.module.types[arg.ty].inner {\r\n                TypeInner::Sampler { .. } => false,\r\n                _ => true,\r\n            })\r\n            .collect();\r\n        self.write_slice(&arguments, |this, _, &(i, arg)| {\r\n            // Write the argument type\r\n            match this.module.types[arg.ty].inner {\r\n                // We treat images separately because they might require\r\n                // writing the storage format\r\n                TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class,\r\n                } => {\r\n                    // Write the storage format if needed\r\n                    if let TypeInner::Image {\r\n                        class: crate::ImageClass::Storage { format, .. },\r\n                        ..\r\n                    } = this.module.types[arg.ty].inner\r\n                    {\r\n                        write!(this.out, \"layout({}) \", glsl_storage_format(format))?;\r\n                    }\r\n\r\n                    // write the type\r\n                    //\r\n                    // This is way we need the leading space because `write_image_type` doesn't add\r\n                    // any spaces at the beginning or end\r\n                    this.write_image_type(dim, arrayed, class)?;\r\n                }\r\n                TypeInner::Pointer { base, .. } => {\r\n                    // write parameter qualifiers\r\n                    write!(this.out, \"inout \")?;\r\n                    this.write_type(base)?;\r\n                }\r\n                // All other types are written by `write_type`\r\n                _ => {\r\n                    this.write_type(arg.ty)?;\r\n                }\r\n            }\r\n\r\n            // Write the argument name\r\n            // The leading space is important\r\n            write!(this.out, \" {}\", &this.names[&ctx.argument_key(i as u32)])?;\r\n\r\n            // Write array size\r\n            if let TypeInner::Array { base, size, .. } = this.module.types[arg.ty].inner {\r\n                this.write_array_size(base, size)?;\r\n            }\r\n\r\n            Ok(())\r\n        })?;\r\n\r\n        // Close the parentheses and open braces to start the function body\r\n        writeln!(self.out, \") {{\")?;\r\n\r\n        // Compose the function arguments from globals, in case of an entry point.\r\n        if let back::FunctionType::EntryPoint(ep_index) = ctx.ty {\r\n            let stage = self.module.entry_points[ep_index as usize].stage;\r\n            for (index, arg) in func.arguments.iter().enumerate() {\r\n                write!(self.out, \"{}\", back::INDENT)?;\r\n                self.write_type(arg.ty)?;\r\n                let name = &self.names[&NameKey::EntryPointArgument(ep_index, index as u32)];\r\n                write!(self.out, \" {}\", name)?;\r\n                write!(self.out, \" = \")?;\r\n                match self.module.types[arg.ty].inner {\r\n                    crate::TypeInner::Struct { ref members, .. } => {\r\n                        self.write_type(arg.ty)?;\r\n                        write!(self.out, \"(\")?;\r\n                        for (index, member) in members.iter().enumerate() {\r\n                            let varying_name = VaryingName {\r\n                                binding: member.binding.as_ref().unwrap(),\r\n                                stage,\r\n                                output: false,\r\n                                targetting_webgl: self.options.version.is_webgl(),\r\n                            };\r\n                            if index != 0 {\r\n                                write!(self.out, \", \")?;\r\n                            }\r\n                            write!(self.out, \"{}\", varying_name)?;\r\n                        }\r\n                        writeln!(self.out, \");\")?;\r\n                    }\r\n                    _ => {\r\n                        let varying_name = VaryingName {\r\n                            binding: arg.binding.as_ref().unwrap(),\r\n                            stage,\r\n                            output: false,\r\n                            targetting_webgl: self.options.version.is_webgl(),\r\n                        };\r\n                        writeln!(self.out, \"{};\", varying_name)?;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Write all function locals\r\n        // Locals are `type name (= init)?;` where the init part (including the =) are optional\r\n        //\r\n        // Always adds a newline\r\n        for (handle, local) in func.local_variables.iter() {\r\n            // Write indentation (only for readability) and the type\r\n            // `write_type` adds no trailing space\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n            self.write_type(local.ty)?;\r\n\r\n            // Write the local name\r\n            // The leading space is important\r\n            write!(self.out, \" {}\", self.names[&ctx.name_key(handle)])?;\r\n            // Write size for array type\r\n            if let TypeInner::Array { base, size, .. } = self.module.types[local.ty].inner {\r\n                self.write_array_size(base, size)?;\r\n            }\r\n            // Write the local initializer if needed\r\n            if let Some(init) = local.init {\r\n                // Put the equal signal only if there's a initializer\r\n                // The leading and trailing spaces aren't needed but help with readability\r\n                write!(self.out, \" = \")?;\r\n\r\n                // Write the constant\r\n                // `write_constant` adds no trailing or leading space/newline\r\n                self.write_constant(init)?;\r\n            } else if is_value_init_supported(self.module, local.ty) {\r\n                write!(self.out, \" = \")?;\r\n                self.write_zero_init_value(local.ty)?;\r\n            }\r\n\r\n            // Finish the local with `;` and add a newline (only for readability)\r\n            writeln!(self.out, \";\")?\r\n        }\r\n\r\n        // Write the function body (statement list)\r\n        for sta in func.body.iter() {\r\n            // Write a statement, the indentation should always be 1 when writing the function body\r\n            // `write_stmt` adds a newline\r\n            self.write_stmt(sta, &ctx, back::Level(1))?;\r\n        }\r\n\r\n        // Close braces and add a newline\r\n        writeln!(self.out, \"}}\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method that writes a list of comma separated `T` with a writer function `F`\r\n    ///\r\n    /// The writer function `F` receives a mutable reference to `self` that if needed won't cause\r\n    /// borrow checker issues (using for example a closure with `self` will cause issues), the\r\n    /// second argument is the 0 based index of the element on the list, and the last element is\r\n    /// a reference to the element `T` being written\r\n    ///\r\n    /// # Notes\r\n    /// - Adds no newlines or leading/trailing whitespace\r\n    /// - The last element won't have a trailing `,`\r\n    fn write_slice<T, F: FnMut(&mut Self, u32, &T) -> BackendResult>(\r\n        &mut self,\r\n        data: &[T],\r\n        mut f: F,\r\n    ) -> BackendResult {\r\n        // Loop trough `data` invoking `f` for each element\r\n        for (i, item) in data.iter().enumerate() {\r\n            f(self, i as u32, item)?;\r\n\r\n            // Only write a comma if isn't the last element\r\n            if i != data.len().saturating_sub(1) {\r\n                // The leading space is for readability only\r\n                write!(self.out, \", \")?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write constants\r\n    ///\r\n    /// # Notes\r\n    /// Adds no newlines or leading/trailing whitespace\r\n    fn write_constant(&mut self, handle: Handle<crate::Constant>) -> BackendResult {\r\n        use crate::ScalarValue as Sv;\r\n\r\n        match self.module.constants[handle].inner {\r\n            crate::ConstantInner::Scalar {\r\n                width: _,\r\n                ref value,\r\n            } => match *value {\r\n                // Signed integers don't need anything special\r\n                Sv::Sint(int) => write!(self.out, \"{}\", int)?,\r\n                // Unsigned integers need a `u` at the end\r\n                //\r\n                // While `core` doesn't necessarily need it, it's allowed and since `es` needs it we\r\n                // always write it as the extra branch wouldn't have any benefit in readability\r\n                Sv::Uint(int) => write!(self.out, \"{}u\", int)?,\r\n                // Floats are written using `Debug` instead of `Display` because it always appends the\r\n                // decimal part even it's zero which is needed for a valid glsl float constant\r\n                Sv::Float(float) => write!(self.out, \"{:?}\", float)?,\r\n                // Booleans are either `true` or `false` so nothing special needs to be done\r\n                Sv::Bool(boolean) => write!(self.out, \"{}\", boolean)?,\r\n            },\r\n            // Composite constant are created using the same syntax as compose\r\n            // `type(components)` where `components` is a comma separated list of constants\r\n            crate::ConstantInner::Composite { ty, ref components } => {\r\n                self.write_type(ty)?;\r\n                if let TypeInner::Array { base, size, .. } = self.module.types[ty].inner {\r\n                    self.write_array_size(base, size)?;\r\n                }\r\n                write!(self.out, \"(\")?;\r\n\r\n                // Write the comma separated constants\r\n                self.write_slice(components, |this, _, arg| this.write_constant(*arg))?;\r\n\r\n                write!(self.out, \")\")?\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to output a dot product as an arithmetic expression\r\n    ///\r\n    fn write_dot_product(\r\n        &mut self,\r\n        arg: Handle<crate::Expression>,\r\n        arg1: Handle<crate::Expression>,\r\n        size: usize,\r\n        ctx: &back::FunctionCtx<'_>,\r\n    ) -> BackendResult {\r\n        // Write parantheses around the dot product expression to prevent operators\r\n        // with different precedences from applying earlier.\r\n        write!(self.out, \"(\")?;\r\n\r\n        // Cycle trough all the components of the vector\r\n        for index in 0..size {\r\n            let component = back::COMPONENTS[index];\r\n            // Write the addition to the previous product\r\n            // This will print an extra '+' at the beginning but that is fine in glsl\r\n            write!(self.out, \" + \")?;\r\n            // Write the first vector expression, this expression is marked to be\r\n            // cached so unless it can't be cached (for example, it's a Constant)\r\n            // it shouldn't produce large expressions.\r\n            self.write_expr(arg, ctx)?;\r\n            // Access the current component on the first vector\r\n            write!(self.out, \".{} * \", component)?;\r\n            // Write the second vector expression, this expression is marked to be\r\n            // cached so unless it can't be cached (for example, it's a Constant)\r\n            // it shouldn't produce large expressions.\r\n            self.write_expr(arg1, ctx)?;\r\n            // Access the current component on the second vector\r\n            write!(self.out, \".{}\", component)?;\r\n        }\r\n\r\n        write!(self.out, \")\")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write structs\r\n    ///\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_struct_body(\r\n        &mut self,\r\n        handle: Handle<crate::Type>,\r\n        members: &[crate::StructMember],\r\n    ) -> BackendResult {\r\n        // glsl structs are written as in C\r\n        // `struct name() { members };`\r\n        //  | `struct` is a keyword\r\n        //  | `name` is the struct name\r\n        //  | `members` is a semicolon separated list of `type name`\r\n        //      | `type` is the member type\r\n        //      | `name` is the member name\r\n        writeln!(self.out, \"{{\")?;\r\n\r\n        for (idx, member) in members.iter().enumerate() {\r\n            // The indentation is only for readability\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n\r\n            match self.module.types[member.ty].inner {\r\n                TypeInner::Array {\r\n                    base,\r\n                    size,\r\n                    stride: _,\r\n                } => {\r\n                    self.write_type(base)?;\r\n                    write!(\r\n                        self.out,\r\n                        \" {}\",\r\n                        &self.names[&NameKey::StructMember(handle, idx as u32)]\r\n                    )?;\r\n                    // Write [size]\r\n                    self.write_array_size(base, size)?;\r\n                    // Newline is important\r\n                    writeln!(self.out, \";\")?;\r\n                }\r\n                _ => {\r\n                    // Write the member type\r\n                    // Adds no trailing space\r\n                    self.write_type(member.ty)?;\r\n\r\n                    // Write the member name and put a semicolon\r\n                    // The leading space is important\r\n                    // All members must have a semicolon even the last one\r\n                    writeln!(\r\n                        self.out,\r\n                        \" {};\",\r\n                        &self.names[&NameKey::StructMember(handle, idx as u32)]\r\n                    )?;\r\n                }\r\n            }\r\n        }\r\n\r\n        write!(self.out, \"}}\")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write statements\r\n    ///\r\n    /// # Notes\r\n    /// Always adds a newline\r\n    fn write_stmt(\r\n        &mut self,\r\n        sta: &crate::Statement,\r\n        ctx: &back::FunctionCtx,\r\n        level: back::Level,\r\n    ) -> BackendResult {\r\n        use crate::Statement;\r\n\r\n        match *sta {\r\n            // This is where we can generate intermediate constants for some expression types.\r\n            Statement::Emit(ref range) => {\r\n                for handle in range.clone() {\r\n                    let info = &ctx.info[handle];\r\n                    let ptr_class = info.ty.inner_with(&self.module.types).pointer_space();\r\n                    let expr_name = if ptr_class.is_some() {\r\n                        // GLSL can't save a pointer-valued expression in a variable,\r\n                        // but we shouldn't ever need to: they should never be named expressions,\r\n                        // and none of the expression types flagged by bake_ref_count can be pointer-valued.\r\n                        None\r\n                    } else if let Some(name) = ctx.named_expressions.get(&handle) {\r\n                        // Front end provides names for all variables at the start of writing.\r\n                        // But we write them to step by step. We need to recache them\r\n                        // Otherwise, we could accidentally write variable name instead of full expression.\r\n                        // Also, we use sanitized names! It defense backend from generating variable with name from reserved keywords.\r\n                        Some(self.namer.call(name))\r\n                    } else if self.need_bake_expressions.contains(&handle) {\r\n                        Some(format!(\"{}{}\", back::BAKE_PREFIX, handle.index()))\r\n                    } else if info.ref_count == 0 {\r\n                        Some(self.namer.call(\"\"))\r\n                    } else {\r\n                        None\r\n                    };\r\n\r\n                    // If we are going to write an `ImageLoad` next and the target image\r\n                    // is sampled and we are using the `Restrict` policy for bounds\r\n                    // checking images we need to write a local holding the clamped lod.\r\n                    if let crate::Expression::ImageLoad {\r\n                        image,\r\n                        level: Some(level_expr),\r\n                        ..\r\n                    } = ctx.expressions[handle]\r\n                    {\r\n                        if let TypeInner::Image {\r\n                            class: crate::ImageClass::Sampled { .. },\r\n                            ..\r\n                        } = *ctx.info[image].ty.inner_with(&self.module.types)\r\n                        {\r\n                            if let proc::BoundsCheckPolicy::Restrict = self.policies.image {\r\n                                write!(self.out, \"{}\", level)?;\r\n                                self.write_clamped_lod(ctx, handle, image, level_expr)?\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if let Some(name) = expr_name {\r\n                        write!(self.out, \"{}\", level)?;\r\n                        self.write_named_expr(handle, name, ctx)?;\r\n                    }\r\n                }\r\n            }\r\n            // Blocks are simple we just need to write the block statements between braces\r\n            // We could also just print the statements but this is more readable and maps more\r\n            // closely to the IR\r\n            Statement::Block(ref block) => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"{{\")?;\r\n                for sta in block.iter() {\r\n                    // Increase the indentation to help with readability\r\n                    self.write_stmt(sta, ctx, level.next())?\r\n                }\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            // Ifs are written as in C:\r\n            // ```\r\n            // if(condition) {\r\n            //  accept\r\n            // } else {\r\n            //  reject\r\n            // }\r\n            // ```\r\n            Statement::If {\r\n                condition,\r\n                ref accept,\r\n                ref reject,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"if (\")?;\r\n                self.write_expr(condition, ctx)?;\r\n                writeln!(self.out, \") {{\")?;\r\n\r\n                for sta in accept {\r\n                    // Increase indentation to help with readability\r\n                    self.write_stmt(sta, ctx, level.next())?;\r\n                }\r\n\r\n                // If there are no statements in the reject block we skip writing it\r\n                // This is only for readability\r\n                if !reject.is_empty() {\r\n                    writeln!(self.out, \"{}}} else {{\", level)?;\r\n\r\n                    for sta in reject {\r\n                        // Increase indentation to help with readability\r\n                        self.write_stmt(sta, ctx, level.next())?;\r\n                    }\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            // Switch are written as in C:\r\n            // ```\r\n            // switch (selector) {\r\n            //      // Fallthrough\r\n            //      case label:\r\n            //          block\r\n            //      // Non fallthrough\r\n            //      case label:\r\n            //          block\r\n            //          break;\r\n            //      default:\r\n            //          block\r\n            //  }\r\n            //  ```\r\n            //  Where the `default` case happens isn't important but we put it last\r\n            //  so that we don't need to print a `break` for it\r\n            Statement::Switch {\r\n                selector,\r\n                ref cases,\r\n            } => {\r\n                // Start the switch\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"switch(\")?;\r\n                self.write_expr(selector, ctx)?;\r\n                writeln!(self.out, \") {{\")?;\r\n                let type_postfix = match *ctx.info[selector].ty.inner_with(&self.module.types) {\r\n                    crate::TypeInner::Scalar {\r\n                        kind: crate::ScalarKind::Uint,\r\n                        ..\r\n                    } => \"u\",\r\n                    _ => \"\",\r\n                };\r\n\r\n                // Write all cases\r\n                let l2 = level.next();\r\n                for case in cases {\r\n                    match case.value {\r\n                        crate::SwitchValue::Integer(value) => {\r\n                            writeln!(self.out, \"{}case {}{}:\", l2, value, type_postfix)?\r\n                        }\r\n                        crate::SwitchValue::Default => writeln!(self.out, \"{}default:\", l2)?,\r\n                    }\r\n\r\n                    for sta in case.body.iter() {\r\n                        self.write_stmt(sta, ctx, l2.next())?;\r\n                    }\r\n\r\n                    // Write fallthrough comment if the case is fallthrough,\r\n                    // otherwise write a break, if the case is not already\r\n                    // broken out of at the end of its body.\r\n                    if case.fall_through {\r\n                        writeln!(self.out, \"{}/* fallthrough */\", l2.next())?;\r\n                    } else if case.body.last().map_or(true, |s| !s.is_terminator()) {\r\n                        writeln!(self.out, \"{}break;\", l2.next())?;\r\n                    }\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            // Loops in naga IR are based on wgsl loops, glsl can emulate the behaviour by using a\r\n            // while true loop and appending the continuing block to the body resulting on:\r\n            // ```\r\n            // bool loop_init = true;\r\n            // while(true) {\r\n            //  if (!loop_init) { <continuing> }\r\n            //  loop_init = false;\r\n            //  <body>\r\n            // }\r\n            // ```\r\n            Statement::Loop {\r\n                ref body,\r\n                ref continuing,\r\n                break_if,\r\n            } => {\r\n                if !continuing.is_empty() || break_if.is_some() {\r\n                    let gate_name = self.namer.call(\"loop_init\");\r\n                    writeln!(self.out, \"{}bool {} = true;\", level, gate_name)?;\r\n                    writeln!(self.out, \"{}while(true) {{\", level)?;\r\n                    let l2 = level.next();\r\n                    let l3 = l2.next();\r\n                    writeln!(self.out, \"{}if (!{}) {{\", l2, gate_name)?;\r\n                    for sta in continuing {\r\n                        self.write_stmt(sta, ctx, l3)?;\r\n                    }\r\n                    if let Some(condition) = break_if {\r\n                        write!(self.out, \"{}if (\", l3)?;\r\n                        self.write_expr(condition, ctx)?;\r\n                        writeln!(self.out, \") {{\")?;\r\n                        writeln!(self.out, \"{}break;\", l3.next())?;\r\n                        writeln!(self.out, \"{}}}\", l3)?;\r\n                    }\r\n                    writeln!(self.out, \"{}}}\", l2)?;\r\n                    writeln!(self.out, \"{}{} = false;\", level.next(), gate_name)?;\r\n                } else {\r\n                    writeln!(self.out, \"{}while(true) {{\", level)?;\r\n                }\r\n                for sta in body {\r\n                    self.write_stmt(sta, ctx, level.next())?;\r\n                }\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            // Break, continue and return as written as in C\r\n            // `break;`\r\n            Statement::Break => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"break;\")?\r\n            }\r\n            // `continue;`\r\n            Statement::Continue => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"continue;\")?\r\n            }\r\n            // `return expr;`, `expr` is optional\r\n            Statement::Return { value } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                match ctx.ty {\r\n                    back::FunctionType::Function(_) => {\r\n                        write!(self.out, \"return\")?;\r\n                        // Write the expression to be returned if needed\r\n                        if let Some(expr) = value {\r\n                            write!(self.out, \" \")?;\r\n                            self.write_expr(expr, ctx)?;\r\n                        }\r\n                        writeln!(self.out, \";\")?;\r\n                    }\r\n                    back::FunctionType::EntryPoint(ep_index) => {\r\n                        let ep = &self.module.entry_points[ep_index as usize];\r\n                        if let Some(ref result) = ep.function.result {\r\n                            let value = value.unwrap();\r\n                            match self.module.types[result.ty].inner {\r\n                                crate::TypeInner::Struct { ref members, .. } => {\r\n                                    let temp_struct_name = match ctx.expressions[value] {\r\n                                        crate::Expression::Compose { .. } => {\r\n                                            let return_struct = \"_tmp_return\";\r\n                                            write!(\r\n                                                self.out,\r\n                                                \"{} {} = \",\r\n                                                &self.names[&NameKey::Type(result.ty)],\r\n                                                return_struct\r\n                                            )?;\r\n                                            self.write_expr(value, ctx)?;\r\n                                            writeln!(self.out, \";\")?;\r\n                                            write!(self.out, \"{}\", level)?;\r\n                                            Some(return_struct)\r\n                                        }\r\n                                        _ => None,\r\n                                    };\r\n\r\n                                    for (index, member) in members.iter().enumerate() {\r\n                                        // TODO: handle builtin in better way\r\n                                        if let Some(crate::Binding::BuiltIn(builtin)) =\r\n                                            member.binding\r\n                                        {\r\n                                            match builtin {\r\n                                                crate::BuiltIn::ClipDistance\r\n                                                | crate::BuiltIn::CullDistance\r\n                                                | crate::BuiltIn::PointSize => {\r\n                                                    if self.options.version.is_es() {\r\n                                                        continue;\r\n                                                    }\r\n                                                }\r\n                                                _ => {}\r\n                                            }\r\n                                        }\r\n\r\n                                        let varying_name = VaryingName {\r\n                                            binding: member.binding.as_ref().unwrap(),\r\n                                            stage: ep.stage,\r\n                                            output: true,\r\n                                            targetting_webgl: self.options.version.is_webgl(),\r\n                                        };\r\n                                        write!(self.out, \"{} = \", varying_name)?;\r\n\r\n                                        if let Some(struct_name) = temp_struct_name {\r\n                                            write!(self.out, \"{}\", struct_name)?;\r\n                                        } else {\r\n                                            self.write_expr(value, ctx)?;\r\n                                        }\r\n\r\n                                        // Write field name\r\n                                        writeln!(\r\n                                            self.out,\r\n                                            \".{};\",\r\n                                            &self.names\r\n                                                [&NameKey::StructMember(result.ty, index as u32)]\r\n                                        )?;\r\n                                        write!(self.out, \"{}\", level)?;\r\n                                    }\r\n                                }\r\n                                _ => {\r\n                                    let name = VaryingName {\r\n                                        binding: result.binding.as_ref().unwrap(),\r\n                                        stage: ep.stage,\r\n                                        output: true,\r\n                                        targetting_webgl: self.options.version.is_webgl(),\r\n                                    };\r\n                                    write!(self.out, \"{} = \", name)?;\r\n                                    self.write_expr(value, ctx)?;\r\n                                    writeln!(self.out, \";\")?;\r\n                                    write!(self.out, \"{}\", level)?;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if let back::FunctionType::EntryPoint(ep_index) = ctx.ty {\r\n                            if self.module.entry_points[ep_index as usize].stage\r\n                                == crate::ShaderStage::Vertex\r\n                                && self\r\n                                    .options\r\n                                    .writer_flags\r\n                                    .contains(WriterFlags::ADJUST_COORDINATE_SPACE)\r\n                            {\r\n                                writeln!(\r\n                                    self.out,\r\n                                    \"gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\",\r\n                                )?;\r\n                                write!(self.out, \"{}\", level)?;\r\n                            }\r\n                        }\r\n                        writeln!(self.out, \"return;\")?;\r\n                    }\r\n                }\r\n            }\r\n            // This is one of the places were glsl adds to the syntax of C in this case the discard\r\n            // keyword which ceases all further processing in a fragment shader, it's called OpKill\r\n            // in spir-v that's why it's called `Statement::Kill`\r\n            Statement::Kill => writeln!(self.out, \"{}discard;\", level)?,\r\n            // Issue a memory barrier. Please note that to ensure visibility,\r\n            // OpenGL always requires a call to the `barrier()` function after a `memoryBarrier*()`\r\n            Statement::Barrier(flags) => {\r\n                if flags.contains(crate::Barrier::STORAGE) {\r\n                    writeln!(self.out, \"{}memoryBarrierBuffer();\", level)?;\r\n                }\r\n\r\n                if flags.contains(crate::Barrier::WORK_GROUP) {\r\n                    writeln!(self.out, \"{}memoryBarrierShared();\", level)?;\r\n                }\r\n\r\n                writeln!(self.out, \"{}barrier();\", level)?;\r\n            }\r\n            // Stores in glsl are just variable assignments written as `pointer = value;`\r\n            Statement::Store { pointer, value } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                self.write_expr(pointer, ctx)?;\r\n                write!(self.out, \" = \")?;\r\n                self.write_expr(value, ctx)?;\r\n                writeln!(self.out, \";\")?\r\n            }\r\n            // Stores a value into an image.\r\n            Statement::ImageStore {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                value,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                self.write_image_store(ctx, image, coordinate, array_index, value)?\r\n            }\r\n            // A `Call` is written `name(arguments)` where `arguments` is a comma separated expressions list\r\n            Statement::Call {\r\n                function,\r\n                ref arguments,\r\n                result,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                if let Some(expr) = result {\r\n                    let name = format!(\"{}{}\", back::BAKE_PREFIX, expr.index());\r\n                    let result = self.module.functions[function].result.as_ref().unwrap();\r\n                    self.write_type(result.ty)?;\r\n                    write!(self.out, \" {} = \", name)?;\r\n                    self.named_expressions.insert(expr, name);\r\n                }\r\n                write!(self.out, \"{}(\", &self.names[&NameKey::Function(function)])?;\r\n                let arguments: Vec<_> = arguments\r\n                    .iter()\r\n                    .enumerate()\r\n                    .filter_map(|(i, arg)| {\r\n                        let arg_ty = self.module.functions[function].arguments[i].ty;\r\n                        match self.module.types[arg_ty].inner {\r\n                            TypeInner::Sampler { .. } => None,\r\n                            _ => Some(*arg),\r\n                        }\r\n                    })\r\n                    .collect();\r\n                self.write_slice(&arguments, |this, _, arg| this.write_expr(*arg, ctx))?;\r\n                writeln!(self.out, \");\")?\r\n            }\r\n            Statement::Atomic {\r\n                pointer,\r\n                ref fun,\r\n                value,\r\n                result,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                let res_name = format!(\"{}{}\", back::BAKE_PREFIX, result.index());\r\n                let res_ty = ctx.info[result].ty.inner_with(&self.module.types);\r\n                self.write_value_type(res_ty)?;\r\n                write!(self.out, \" {} = \", res_name)?;\r\n                self.named_expressions.insert(result, res_name);\r\n\r\n                let fun_str = fun.to_glsl();\r\n                write!(self.out, \"atomic{}(\", fun_str)?;\r\n                self.write_expr(pointer, ctx)?;\r\n                write!(self.out, \", \")?;\r\n                // handle the special cases\r\n                match *fun {\r\n                    crate::AtomicFunction::Subtract => {\r\n                        // we just wrote `InterlockedAdd`, so negate the argument\r\n                        write!(self.out, \"-\")?;\r\n                    }\r\n                    crate::AtomicFunction::Exchange { compare: Some(_) } => {\r\n                        return Err(Error::Custom(\r\n                            \"atomic CompareExchange is not implemented\".to_string(),\r\n                        ));\r\n                    }\r\n                    _ => {}\r\n                }\r\n                self.write_expr(value, ctx)?;\r\n                writeln!(self.out, \");\")?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method to write expressions\r\n    ///\r\n    /// # Notes\r\n    /// Doesn't add any newlines or leading/trailing spaces\r\n    fn write_expr(\r\n        &mut self,\r\n        expr: Handle<crate::Expression>,\r\n        ctx: &back::FunctionCtx<'_>,\r\n    ) -> BackendResult {\r\n        use crate::Expression;\r\n\r\n        if let Some(name) = self.named_expressions.get(&expr) {\r\n            write!(self.out, \"{}\", name)?;\r\n            return Ok(());\r\n        }\r\n\r\n        match ctx.expressions[expr] {\r\n            // `Access` is applied to arrays, vectors and matrices and is written as indexing\r\n            Expression::Access { base, index } => {\r\n                self.write_expr(base, ctx)?;\r\n                write!(self.out, \"[\")?;\r\n                self.write_expr(index, ctx)?;\r\n                write!(self.out, \"]\")?\r\n            }\r\n            // `AccessIndex` is the same as `Access` except that the index is a constant and it can\r\n            // be applied to structs, in this case we need to find the name of the field at that\r\n            // index and write `base.field_name`\r\n            Expression::AccessIndex { base, index } => {\r\n                self.write_expr(base, ctx)?;\r\n\r\n                let base_ty_res = &ctx.info[base].ty;\r\n                let mut resolved = base_ty_res.inner_with(&self.module.types);\r\n                let base_ty_handle = match *resolved {\r\n                    TypeInner::Pointer { base, space: _ } => {\r\n                        resolved = &self.module.types[base].inner;\r\n                        Some(base)\r\n                    }\r\n                    _ => base_ty_res.handle(),\r\n                };\r\n\r\n                match *resolved {\r\n                    TypeInner::Vector { .. } => {\r\n                        // Write vector access as a swizzle\r\n                        write!(self.out, \".{}\", back::COMPONENTS[index as usize])?\r\n                    }\r\n                    TypeInner::Matrix { .. }\r\n                    | TypeInner::Array { .. }\r\n                    | TypeInner::ValuePointer { .. } => write!(self.out, \"[{}]\", index)?,\r\n                    TypeInner::Struct { .. } => {\r\n                        // This will never panic in case the type is a `Struct`, this is not true\r\n                        // for other types so we can only check while inside this match arm\r\n                        let ty = base_ty_handle.unwrap();\r\n\r\n                        write!(\r\n                            self.out,\r\n                            \".{}\",\r\n                            &self.names[&NameKey::StructMember(ty, index)]\r\n                        )?\r\n                    }\r\n                    ref other => return Err(Error::Custom(format!(\"Cannot index {:?}\", other))),\r\n                }\r\n            }\r\n            // Constants are delegated to `write_constant`\r\n            Expression::Constant(constant) => self.write_constant(constant)?,\r\n            // `Splat` needs to actually write down a vector, it's not always inferred in GLSL.\r\n            Expression::Splat { size: _, value } => {\r\n                let resolved = ctx.info[expr].ty.inner_with(&self.module.types);\r\n                self.write_value_type(resolved)?;\r\n                write!(self.out, \"(\")?;\r\n                self.write_expr(value, ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            // `Swizzle` adds a few letters behind the dot.\r\n            Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                self.write_expr(vector, ctx)?;\r\n                write!(self.out, \".\")?;\r\n                for &sc in pattern[..size as usize].iter() {\r\n                    self.out.write_char(back::COMPONENTS[sc as usize])?;\r\n                }\r\n            }\r\n            // `Compose` is pretty simple we just write `type(components)` where `components` is a\r\n            // comma separated list of expressions\r\n            Expression::Compose { ty, ref components } => {\r\n                self.write_type(ty)?;\r\n\r\n                let resolved = ctx.info[expr].ty.inner_with(&self.module.types);\r\n                if let TypeInner::Array { base, size, .. } = *resolved {\r\n                    self.write_array_size(base, size)?;\r\n                }\r\n\r\n                write!(self.out, \"(\")?;\r\n                self.write_slice(components, |this, _, arg| this.write_expr(*arg, ctx))?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            // Function arguments are written as the argument name\r\n            Expression::FunctionArgument(pos) => {\r\n                write!(self.out, \"{}\", &self.names[&ctx.argument_key(pos)])?\r\n            }\r\n            // Global variables need some special work for their name but\r\n            // `get_global_name` does the work for us\r\n            Expression::GlobalVariable(handle) => {\r\n                let global = &self.module.global_variables[handle];\r\n                self.write_global_name(handle, global)?\r\n            }\r\n            // A local is written as it's name\r\n            Expression::LocalVariable(handle) => {\r\n                write!(self.out, \"{}\", self.names[&ctx.name_key(handle)])?\r\n            }\r\n            // glsl has no pointers so there's no load operation, just write the pointer expression\r\n            Expression::Load { pointer } => self.write_expr(pointer, ctx)?,\r\n            // `ImageSample` is a bit complicated compared to the rest of the IR.\r\n            //\r\n            // First there are three variations depending whether the sample level is explicitly set,\r\n            // if it's automatic or it it's bias:\r\n            // `texture(image, coordinate)` - Automatic sample level\r\n            // `texture(image, coordinate, bias)` - Bias sample level\r\n            // `textureLod(image, coordinate, level)` - Zero or Exact sample level\r\n            //\r\n            // Furthermore if `depth_ref` is some we need to append it to the coordinate vector\r\n            Expression::ImageSample {\r\n                image,\r\n                sampler: _, //TODO?\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                let dim = match *ctx.info[image].ty.inner_with(&self.module.types) {\r\n                    TypeInner::Image { dim, .. } => dim,\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                if dim == crate::ImageDimension::Cube\r\n                    && array_index.is_some()\r\n                    && depth_ref.is_some()\r\n                {\r\n                    match level {\r\n                        crate::SampleLevel::Zero\r\n                        | crate::SampleLevel::Exact(_)\r\n                        | crate::SampleLevel::Gradient { .. }\r\n                        | crate::SampleLevel::Bias(_) => {\r\n                            return Err(Error::Custom(String::from(\r\n                                \"gsamplerCubeArrayShadow isn't supported in textureGrad, \\\r\n                                 textureLod or texture with bias\",\r\n                            )))\r\n                        }\r\n                        crate::SampleLevel::Auto => {}\r\n                    }\r\n                }\r\n\r\n                // textureLod on sampler2DArrayShadow and samplerCubeShadow does not exist in GLSL.\r\n                // To emulate this, we will have to use textureGrad with a constant gradient of 0.\r\n                let workaround_lod_array_shadow_as_grad = (array_index.is_some()\r\n                    || dim == crate::ImageDimension::Cube)\r\n                    && depth_ref.is_some()\r\n                    && gather.is_none()\r\n                    && !self\r\n                        .options\r\n                        .writer_flags\r\n                        .contains(WriterFlags::TEXTURE_SHADOW_LOD);\r\n\r\n                //Write the function to be used depending on the sample level\r\n                let fun_name = match level {\r\n                    crate::SampleLevel::Zero if gather.is_some() => \"textureGather\",\r\n                    crate::SampleLevel::Auto | crate::SampleLevel::Bias(_) => \"texture\",\r\n                    crate::SampleLevel::Zero | crate::SampleLevel::Exact(_) => {\r\n                        if workaround_lod_array_shadow_as_grad {\r\n                            \"textureGrad\"\r\n                        } else {\r\n                            \"textureLod\"\r\n                        }\r\n                    }\r\n                    crate::SampleLevel::Gradient { .. } => \"textureGrad\",\r\n                };\r\n                let offset_name = match offset {\r\n                    Some(_) => \"Offset\",\r\n                    None => \"\",\r\n                };\r\n\r\n                write!(self.out, \"{}{}(\", fun_name, offset_name)?;\r\n\r\n                // Write the image that will be used\r\n                self.write_expr(image, ctx)?;\r\n                // The space here isn't required but it helps with readability\r\n                write!(self.out, \", \")?;\r\n\r\n                // We need to get the coordinates vector size to later build a vector that's `size + 1`\r\n                // if `depth_ref` is some, if it isn't a vector we panic as that's not a valid expression\r\n                let mut coord_dim = match *ctx.info[coordinate].ty.inner_with(&self.module.types) {\r\n                    TypeInner::Vector { size, .. } => size as u8,\r\n                    TypeInner::Scalar { .. } => 1,\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                if array_index.is_some() {\r\n                    coord_dim += 1;\r\n                }\r\n                let merge_depth_ref = depth_ref.is_some() && gather.is_none() && coord_dim < 4;\r\n                if merge_depth_ref {\r\n                    coord_dim += 1;\r\n                }\r\n\r\n                let tex_1d_hack = dim == crate::ImageDimension::D1 && self.options.version.is_es();\r\n                let is_vec = tex_1d_hack || coord_dim != 1;\r\n                // Compose a new texture coordinates vector\r\n                if is_vec {\r\n                    write!(self.out, \"vec{}(\", coord_dim + tex_1d_hack as u8)?;\r\n                }\r\n                self.write_expr(coordinate, ctx)?;\r\n                if tex_1d_hack {\r\n                    write!(self.out, \", 0.0\")?;\r\n                }\r\n                if let Some(expr) = array_index {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(expr, ctx)?;\r\n                }\r\n                if merge_depth_ref {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(depth_ref.unwrap(), ctx)?;\r\n                }\r\n                if is_vec {\r\n                    write!(self.out, \")\")?;\r\n                }\r\n\r\n                if let (Some(expr), false) = (depth_ref, merge_depth_ref) {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(expr, ctx)?;\r\n                }\r\n\r\n                match level {\r\n                    // Auto needs no more arguments\r\n                    crate::SampleLevel::Auto => (),\r\n                    // Zero needs level set to 0\r\n                    crate::SampleLevel::Zero => {\r\n                        if workaround_lod_array_shadow_as_grad {\r\n                            let vec_dim = match dim {\r\n                                crate::ImageDimension::Cube => 3,\r\n                                _ => 2,\r\n                            };\r\n                            write!(self.out, \", vec{}(0.0), vec{}(0.0)\", vec_dim, vec_dim)?;\r\n                        } else if gather.is_none() {\r\n                            write!(self.out, \", 0.0\")?;\r\n                        }\r\n                    }\r\n                    // Exact and bias require another argument\r\n                    crate::SampleLevel::Exact(expr) => {\r\n                        if workaround_lod_array_shadow_as_grad {\r\n                            log::warn!(\"Unable to `textureLod` a shadow array, ignoring the LOD\");\r\n                            write!(self.out, \", vec2(0,0), vec2(0,0)\")?;\r\n                        } else {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(expr, ctx)?;\r\n                        }\r\n                    }\r\n                    crate::SampleLevel::Bias(_) => {\r\n                        // This needs to be done after the offset writing\r\n                    }\r\n                    crate::SampleLevel::Gradient { x, y } => {\r\n                        // If we are using sampler2D to replace sampler1D, we also\r\n                        // need to make sure to use vec2 gradients\r\n                        if tex_1d_hack {\r\n                            write!(self.out, \", vec2(\")?;\r\n                            self.write_expr(x, ctx)?;\r\n                            write!(self.out, \", 0.0)\")?;\r\n                            write!(self.out, \", vec2(\")?;\r\n                            self.write_expr(y, ctx)?;\r\n                            write!(self.out, \", 0.0)\")?;\r\n                        } else {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(x, ctx)?;\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(y, ctx)?;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if let Some(constant) = offset {\r\n                    write!(self.out, \", \")?;\r\n                    if tex_1d_hack {\r\n                        write!(self.out, \"ivec2(\")?;\r\n                    }\r\n                    self.write_constant(constant)?;\r\n                    if tex_1d_hack {\r\n                        write!(self.out, \", 0)\")?;\r\n                    }\r\n                }\r\n\r\n                // Bias is always the last argument\r\n                if let crate::SampleLevel::Bias(expr) = level {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(expr, ctx)?;\r\n                }\r\n\r\n                if let (Some(component), None) = (gather, depth_ref) {\r\n                    write!(self.out, \", {}\", component as usize)?;\r\n                }\r\n\r\n                // End the function\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => self.write_image_load(expr, ctx, image, coordinate, array_index, sample, level)?,\r\n            // Query translates into one of the:\r\n            // - textureSize/imageSize\r\n            // - textureQueryLevels\r\n            // - textureSamples/imageSamples\r\n            Expression::ImageQuery { image, query } => {\r\n                use crate::ImageClass;\r\n\r\n                // This will only panic if the module is invalid\r\n                let (dim, class) = match *ctx.info[image].ty.inner_with(&self.module.types) {\r\n                    TypeInner::Image {\r\n                        dim,\r\n                        arrayed: _,\r\n                        class,\r\n                    } => (dim, class),\r\n                    _ => unreachable!(),\r\n                };\r\n                let components = match dim {\r\n                    crate::ImageDimension::D1 => 1,\r\n                    crate::ImageDimension::D2 => 2,\r\n                    crate::ImageDimension::D3 => 3,\r\n                    crate::ImageDimension::Cube => 2,\r\n                };\r\n                match query {\r\n                    crate::ImageQuery::Size { level } => {\r\n                        match class {\r\n                            ImageClass::Sampled { multi, .. } | ImageClass::Depth { multi } => {\r\n                                write!(self.out, \"textureSize(\")?;\r\n                                self.write_expr(image, ctx)?;\r\n                                if let Some(expr) = level {\r\n                                    write!(self.out, \", \")?;\r\n                                    self.write_expr(expr, ctx)?;\r\n                                } else if !multi {\r\n                                    // All textureSize calls requires an lod argument\r\n                                    // except for multisampled samplers\r\n                                    write!(self.out, \", 0\")?;\r\n                                }\r\n                            }\r\n                            ImageClass::Storage { .. } => {\r\n                                write!(self.out, \"imageSize(\")?;\r\n                                self.write_expr(image, ctx)?;\r\n                            }\r\n                        }\r\n                        write!(self.out, \")\")?;\r\n                        if components != 1 || self.options.version.is_es() {\r\n                            write!(self.out, \".{}\", &\"xyz\"[..components])?;\r\n                        }\r\n                    }\r\n                    crate::ImageQuery::NumLevels => {\r\n                        write!(self.out, \"textureQueryLevels(\",)?;\r\n                        self.write_expr(image, ctx)?;\r\n                        write!(self.out, \")\",)?;\r\n                    }\r\n                    crate::ImageQuery::NumLayers => {\r\n                        let fun_name = match class {\r\n                            ImageClass::Sampled { .. } | ImageClass::Depth { .. } => \"textureSize\",\r\n                            ImageClass::Storage { .. } => \"imageSize\",\r\n                        };\r\n                        write!(self.out, \"{}(\", fun_name)?;\r\n                        self.write_expr(image, ctx)?;\r\n                        // All textureSize calls requires an lod argument\r\n                        // except for multisampled samplers\r\n                        if class.is_multisampled() {\r\n                            write!(self.out, \", 0\")?;\r\n                        }\r\n                        write!(self.out, \")\")?;\r\n                        if components != 1 || self.options.version.is_es() {\r\n                            write!(self.out, \".{}\", back::COMPONENTS[components])?;\r\n                        }\r\n                    }\r\n                    crate::ImageQuery::NumSamples => {\r\n                        let fun_name = match class {\r\n                            ImageClass::Sampled { .. } | ImageClass::Depth { .. } => {\r\n                                \"textureSamples\"\r\n                            }\r\n                            ImageClass::Storage { .. } => \"imageSamples\",\r\n                        };\r\n                        write!(self.out, \"{}(\", fun_name)?;\r\n                        self.write_expr(image, ctx)?;\r\n                        write!(self.out, \")\",)?;\r\n                    }\r\n                }\r\n            }\r\n            // `Unary` is pretty straightforward\r\n            // \"-\" - for `Negate`\r\n            // \"~\" - for `Not` if it's an integer\r\n            // \"!\" - for `Not` if it's a boolean\r\n            //\r\n            // We also wrap the everything in parentheses to avoid precedence issues\r\n            Expression::Unary { op, expr } => {\r\n                use crate::{ScalarKind as Sk, UnaryOperator as Uo};\r\n\r\n                let ty = ctx.info[expr].ty.inner_with(&self.module.types);\r\n\r\n                match *ty {\r\n                    TypeInner::Vector { kind: Sk::Bool, .. } => {\r\n                        write!(self.out, \"not(\")?;\r\n                    }\r\n                    _ => {\r\n                        let operator = match op {\r\n                            Uo::Negate => \"-\",\r\n                            Uo::Not => match ty.scalar_kind() {\r\n                                Some(Sk::Sint) | Some(Sk::Uint) => \"~\",\r\n                                Some(Sk::Bool) => \"!\",\r\n                                ref other => {\r\n                                    return Err(Error::Custom(format!(\r\n                                        \"Cannot apply not to type {:?}\",\r\n                                        other\r\n                                    )))\r\n                                }\r\n                            },\r\n                        };\r\n\r\n                        write!(self.out, \"({}\", operator)?;\r\n                    }\r\n                }\r\n\r\n                self.write_expr(expr, ctx)?;\r\n\r\n                write!(self.out, \")\")?\r\n            }\r\n            // `Binary` we just write `left op right`, except when dealing with\r\n            // comparison operations on vectors as they are implemented with\r\n            // builtin functions.\r\n            // Once again we wrap everything in parentheses to avoid precedence issues\r\n            Expression::Binary {\r\n                mut op,\r\n                left,\r\n                right,\r\n            } => {\r\n                // Holds `Some(function_name)` if the binary operation is\r\n                // implemented as a function call\r\n                use crate::{BinaryOperator as Bo, ScalarKind as Sk, TypeInner as Ti};\r\n\r\n                let left_inner = ctx.info[left].ty.inner_with(&self.module.types);\r\n                let right_inner = ctx.info[right].ty.inner_with(&self.module.types);\r\n\r\n                let function = match (left_inner, right_inner) {\r\n                    (&Ti::Vector { kind, .. }, &Ti::Vector { .. }) => match op {\r\n                        Bo::Less\r\n                        | Bo::LessEqual\r\n                        | Bo::Greater\r\n                        | Bo::GreaterEqual\r\n                        | Bo::Equal\r\n                        | Bo::NotEqual => BinaryOperation::VectorCompare,\r\n                        Bo::Modulo if kind == Sk::Float => BinaryOperation::Modulo,\r\n                        Bo::And if kind == Sk::Bool => {\r\n                            op = crate::BinaryOperator::LogicalAnd;\r\n                            BinaryOperation::VectorComponentWise\r\n                        }\r\n                        Bo::InclusiveOr if kind == Sk::Bool => {\r\n                            op = crate::BinaryOperator::LogicalOr;\r\n                            BinaryOperation::VectorComponentWise\r\n                        }\r\n                        _ => BinaryOperation::Other,\r\n                    },\r\n                    _ => match (left_inner.scalar_kind(), right_inner.scalar_kind()) {\r\n                        (Some(Sk::Float), _) | (_, Some(Sk::Float)) => match op {\r\n                            Bo::Modulo => BinaryOperation::Modulo,\r\n                            _ => BinaryOperation::Other,\r\n                        },\r\n                        (Some(Sk::Bool), Some(Sk::Bool)) => match op {\r\n                            Bo::InclusiveOr => {\r\n                                op = crate::BinaryOperator::LogicalOr;\r\n                                BinaryOperation::Other\r\n                            }\r\n                            Bo::And => {\r\n                                op = crate::BinaryOperator::LogicalAnd;\r\n                                BinaryOperation::Other\r\n                            }\r\n                            _ => BinaryOperation::Other,\r\n                        },\r\n                        _ => BinaryOperation::Other,\r\n                    },\r\n                };\r\n\r\n                match function {\r\n                    BinaryOperation::VectorCompare => {\r\n                        let op_str = match op {\r\n                            Bo::Less => \"lessThan(\",\r\n                            Bo::LessEqual => \"lessThanEqual(\",\r\n                            Bo::Greater => \"greaterThan(\",\r\n                            Bo::GreaterEqual => \"greaterThanEqual(\",\r\n                            Bo::Equal => \"equal(\",\r\n                            Bo::NotEqual => \"notEqual(\",\r\n                            _ => unreachable!(),\r\n                        };\r\n                        write!(self.out, \"{}\", op_str)?;\r\n                        self.write_expr(left, ctx)?;\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(right, ctx)?;\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                    BinaryOperation::VectorComponentWise => {\r\n                        self.write_value_type(left_inner)?;\r\n                        write!(self.out, \"(\")?;\r\n\r\n                        let size = match *left_inner {\r\n                            Ti::Vector { size, .. } => size,\r\n                            _ => unreachable!(),\r\n                        };\r\n\r\n                        for i in 0..size as usize {\r\n                            if i != 0 {\r\n                                write!(self.out, \", \")?;\r\n                            }\r\n\r\n                            self.write_expr(left, ctx)?;\r\n                            write!(self.out, \".{}\", back::COMPONENTS[i])?;\r\n\r\n                            write!(self.out, \" {} \", back::binary_operation_str(op))?;\r\n\r\n                            self.write_expr(right, ctx)?;\r\n                            write!(self.out, \".{}\", back::COMPONENTS[i])?;\r\n                        }\r\n\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                    // TODO: handle undefined behavior of BinaryOperator::Modulo\r\n                    //\r\n                    // sint:\r\n                    // if right == 0 return 0\r\n                    // if left == min(type_of(left)) && right == -1 return 0\r\n                    // if sign(left) == -1 || sign(right) == -1 return result as defined by WGSL\r\n                    //\r\n                    // uint:\r\n                    // if right == 0 return 0\r\n                    //\r\n                    // float:\r\n                    // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798\r\n                    BinaryOperation::Modulo => {\r\n                        write!(self.out, \"(\")?;\r\n\r\n                        // write `e1 - e2 * trunc(e1 / e2)`\r\n                        self.write_expr(left, ctx)?;\r\n                        write!(self.out, \" - \")?;\r\n                        self.write_expr(right, ctx)?;\r\n                        write!(self.out, \" * \")?;\r\n                        write!(self.out, \"trunc(\")?;\r\n                        self.write_expr(left, ctx)?;\r\n                        write!(self.out, \" / \")?;\r\n                        self.write_expr(right, ctx)?;\r\n                        write!(self.out, \")\")?;\r\n\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                    BinaryOperation::Other => {\r\n                        write!(self.out, \"(\")?;\r\n\r\n                        self.write_expr(left, ctx)?;\r\n                        write!(self.out, \" {} \", back::binary_operation_str(op))?;\r\n                        self.write_expr(right, ctx)?;\r\n\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                }\r\n            }\r\n            // `Select` is written as `condition ? accept : reject`\r\n            // We wrap everything in parentheses to avoid precedence issues\r\n            Expression::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => {\r\n                let cond_ty = ctx.info[condition].ty.inner_with(&self.module.types);\r\n                let vec_select = if let TypeInner::Vector { .. } = *cond_ty {\r\n                    true\r\n                } else {\r\n                    false\r\n                };\r\n\r\n                // TODO: Boolean mix on desktop required GL_EXT_shader_integer_mix\r\n                if vec_select {\r\n                    // Glsl defines that for mix when the condition is a boolean the first element\r\n                    // is picked if condition is false and the second if condition is true\r\n                    write!(self.out, \"mix(\")?;\r\n                    self.write_expr(reject, ctx)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(accept, ctx)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(condition, ctx)?;\r\n                } else {\r\n                    write!(self.out, \"(\")?;\r\n                    self.write_expr(condition, ctx)?;\r\n                    write!(self.out, \" ? \")?;\r\n                    self.write_expr(accept, ctx)?;\r\n                    write!(self.out, \" : \")?;\r\n                    self.write_expr(reject, ctx)?;\r\n                }\r\n\r\n                write!(self.out, \")\")?\r\n            }\r\n            // `Derivative` is a function call to a glsl provided function\r\n            Expression::Derivative { axis, expr } => {\r\n                use crate::DerivativeAxis as Da;\r\n\r\n                write!(\r\n                    self.out,\r\n                    \"{}(\",\r\n                    match axis {\r\n                        Da::X => \"dFdx\",\r\n                        Da::Y => \"dFdy\",\r\n                        Da::Width => \"fwidth\",\r\n                    }\r\n                )?;\r\n                self.write_expr(expr, ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            // `Relational` is a normal function call to some glsl provided functions\r\n            Expression::Relational { fun, argument } => {\r\n                use crate::RelationalFunction as Rf;\r\n\r\n                let fun_name = match fun {\r\n                    // There's no specific function for this but we can invert the result of `isinf`\r\n                    Rf::IsFinite => \"!isinf\",\r\n                    Rf::IsInf => \"isinf\",\r\n                    Rf::IsNan => \"isnan\",\r\n                    // There's also no function for this but we can invert `isnan`\r\n                    Rf::IsNormal => \"!isnan\",\r\n                    Rf::All => \"all\",\r\n                    Rf::Any => \"any\",\r\n                };\r\n                write!(self.out, \"{}(\", fun_name)?;\r\n\r\n                self.write_expr(argument, ctx)?;\r\n\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n\r\n                let fun_name = match fun {\r\n                    // comparison\r\n                    Mf::Abs => \"abs\",\r\n                    Mf::Min => \"min\",\r\n                    Mf::Max => \"max\",\r\n                    Mf::Clamp => \"clamp\",\r\n                    Mf::Saturate => {\r\n                        write!(self.out, \"clamp(\")?;\r\n\r\n                        self.write_expr(arg, ctx)?;\r\n\r\n                        match *ctx.info[arg].ty.inner_with(&self.module.types) {\r\n                            crate::TypeInner::Vector { size, .. } => write!(\r\n                                self.out,\r\n                                \", vec{}(0.0), vec{0}(1.0)\",\r\n                                back::vector_size_str(size)\r\n                            )?,\r\n                            _ => write!(self.out, \", 0.0, 1.0\")?,\r\n                        }\r\n\r\n                        write!(self.out, \")\")?;\r\n\r\n                        return Ok(());\r\n                    }\r\n                    // trigonometry\r\n                    Mf::Cos => \"cos\",\r\n                    Mf::Cosh => \"cosh\",\r\n                    Mf::Sin => \"sin\",\r\n                    Mf::Sinh => \"sinh\",\r\n                    Mf::Tan => \"tan\",\r\n                    Mf::Tanh => \"tanh\",\r\n                    Mf::Acos => \"acos\",\r\n                    Mf::Asin => \"asin\",\r\n                    Mf::Atan => \"atan\",\r\n                    Mf::Asinh => \"asinh\",\r\n                    Mf::Acosh => \"acosh\",\r\n                    Mf::Atanh => \"atanh\",\r\n                    Mf::Radians => \"radians\",\r\n                    Mf::Degrees => \"degrees\",\r\n                    // glsl doesn't have atan2 function\r\n                    // use two-argument variation of the atan function\r\n                    Mf::Atan2 => \"atan\",\r\n                    // decomposition\r\n                    Mf::Ceil => \"ceil\",\r\n                    Mf::Floor => \"floor\",\r\n                    Mf::Round => \"roundEven\",\r\n                    Mf::Fract => \"fract\",\r\n                    Mf::Trunc => \"trunc\",\r\n                    Mf::Modf => \"modf\",\r\n                    Mf::Frexp => \"frexp\",\r\n                    Mf::Ldexp => \"ldexp\",\r\n                    // exponent\r\n                    Mf::Exp => \"exp\",\r\n                    Mf::Exp2 => \"exp2\",\r\n                    Mf::Log => \"log\",\r\n                    Mf::Log2 => \"log2\",\r\n                    Mf::Pow => \"pow\",\r\n                    // geometry\r\n                    Mf::Dot => match *ctx.info[arg].ty.inner_with(&self.module.types) {\r\n                        crate::TypeInner::Vector {\r\n                            kind: crate::ScalarKind::Float,\r\n                            ..\r\n                        } => \"dot\",\r\n                        crate::TypeInner::Vector { size, .. } => {\r\n                            return self.write_dot_product(arg, arg1.unwrap(), size as usize, ctx)\r\n                        }\r\n                        _ => unreachable!(\r\n                            \"Correct TypeInner for dot product should be already validated\"\r\n                        ),\r\n                    },\r\n                    Mf::Outer => \"outerProduct\",\r\n                    Mf::Cross => \"cross\",\r\n                    Mf::Distance => \"distance\",\r\n                    Mf::Length => \"length\",\r\n                    Mf::Normalize => \"normalize\",\r\n                    Mf::FaceForward => \"faceforward\",\r\n                    Mf::Reflect => \"reflect\",\r\n                    Mf::Refract => \"refract\",\r\n                    // computational\r\n                    Mf::Sign => \"sign\",\r\n                    Mf::Fma => {\r\n                        if self.options.version.supports_fma_function() {\r\n                            // Use the fma function when available\r\n                            \"fma\"\r\n                        } else {\r\n                            // No fma support. Transform the function call into an arithmetic expression\r\n                            write!(self.out, \"(\")?;\r\n\r\n                            self.write_expr(arg, ctx)?;\r\n                            write!(self.out, \" * \")?;\r\n\r\n                            let arg1 =\r\n                                arg1.ok_or_else(|| Error::Custom(\"Missing fma arg1\".to_owned()))?;\r\n                            self.write_expr(arg1, ctx)?;\r\n                            write!(self.out, \" + \")?;\r\n\r\n                            let arg2 =\r\n                                arg2.ok_or_else(|| Error::Custom(\"Missing fma arg2\".to_owned()))?;\r\n                            self.write_expr(arg2, ctx)?;\r\n                            write!(self.out, \")\")?;\r\n\r\n                            return Ok(());\r\n                        }\r\n                    }\r\n                    Mf::Mix => \"mix\",\r\n                    Mf::Step => \"step\",\r\n                    Mf::SmoothStep => \"smoothstep\",\r\n                    Mf::Sqrt => \"sqrt\",\r\n                    Mf::InverseSqrt => \"inversesqrt\",\r\n                    Mf::Inverse => \"inverse\",\r\n                    Mf::Transpose => \"transpose\",\r\n                    Mf::Determinant => \"determinant\",\r\n                    // bits\r\n                    Mf::CountOneBits => \"bitCount\",\r\n                    Mf::ReverseBits => \"bitfieldReverse\",\r\n                    Mf::ExtractBits => \"bitfieldExtract\",\r\n                    Mf::InsertBits => \"bitfieldInsert\",\r\n                    Mf::FindLsb => \"findLSB\",\r\n                    Mf::FindMsb => \"findMSB\",\r\n                    // data packing\r\n                    Mf::Pack4x8snorm => \"packSnorm4x8\",\r\n                    Mf::Pack4x8unorm => \"packUnorm4x8\",\r\n                    Mf::Pack2x16snorm => \"packSnorm2x16\",\r\n                    Mf::Pack2x16unorm => \"packUnorm2x16\",\r\n                    Mf::Pack2x16float => \"packHalf2x16\",\r\n                    // data unpacking\r\n                    Mf::Unpack4x8snorm => \"unpackSnorm4x8\",\r\n                    Mf::Unpack4x8unorm => \"unpackUnorm4x8\",\r\n                    Mf::Unpack2x16snorm => \"unpackSnorm2x16\",\r\n                    Mf::Unpack2x16unorm => \"unpackUnorm2x16\",\r\n                    Mf::Unpack2x16float => \"unpackHalf2x16\",\r\n                };\r\n\r\n                let extract_bits = fun == Mf::ExtractBits;\r\n                let insert_bits = fun == Mf::InsertBits;\r\n\r\n                // Some GLSL functions always return signed integers (like findMSB),\r\n                // so they need to be cast to uint if the argument is also an uint.\r\n                let ret_might_need_int_to_uint =\r\n                    matches!(fun, Mf::FindLsb | Mf::FindMsb | Mf::CountOneBits | Mf::Abs);\r\n\r\n                // Some GLSL functions only accept signed integers (like abs),\r\n                // so they need their argument cast from uint to int.\r\n                let arg_might_need_uint_to_int = matches!(fun, Mf::Abs);\r\n\r\n                // Check if the argument is an unsigned integer and return the vector size\r\n                // in case it's a vector\r\n                let maybe_uint_size = match *ctx.info[arg].ty.inner_with(&self.module.types) {\r\n                    crate::TypeInner::Scalar {\r\n                        kind: crate::ScalarKind::Uint,\r\n                        ..\r\n                    } => Some(None),\r\n                    crate::TypeInner::Vector {\r\n                        kind: crate::ScalarKind::Uint,\r\n                        size,\r\n                        ..\r\n                    } => Some(Some(size)),\r\n                    _ => None,\r\n                };\r\n\r\n                // Cast to uint if the function needs it\r\n                if ret_might_need_int_to_uint {\r\n                    if let Some(maybe_size) = maybe_uint_size {\r\n                        match maybe_size {\r\n                            Some(size) => write!(self.out, \"uvec{}(\", size as u8)?,\r\n                            None => write!(self.out, \"uint(\")?,\r\n                        }\r\n                    }\r\n                }\r\n\r\n                write!(self.out, \"{}(\", fun_name)?;\r\n\r\n                // Cast to int if the function needs it\r\n                if arg_might_need_uint_to_int {\r\n                    if let Some(maybe_size) = maybe_uint_size {\r\n                        match maybe_size {\r\n                            Some(size) => write!(self.out, \"ivec{}(\", size as u8)?,\r\n                            None => write!(self.out, \"int(\")?,\r\n                        }\r\n                    }\r\n                }\r\n\r\n                self.write_expr(arg, ctx)?;\r\n\r\n                // Close the cast from uint to int\r\n                if arg_might_need_uint_to_int && maybe_uint_size.is_some() {\r\n                    write!(self.out, \")\")?\r\n                }\r\n\r\n                if let Some(arg) = arg1 {\r\n                    write!(self.out, \", \")?;\r\n                    if extract_bits {\r\n                        write!(self.out, \"int(\")?;\r\n                        self.write_expr(arg, ctx)?;\r\n                        write!(self.out, \")\")?;\r\n                    } else {\r\n                        self.write_expr(arg, ctx)?;\r\n                    }\r\n                }\r\n                if let Some(arg) = arg2 {\r\n                    write!(self.out, \", \")?;\r\n                    if extract_bits || insert_bits {\r\n                        write!(self.out, \"int(\")?;\r\n                        self.write_expr(arg, ctx)?;\r\n                        write!(self.out, \")\")?;\r\n                    } else {\r\n                        self.write_expr(arg, ctx)?;\r\n                    }\r\n                }\r\n                if let Some(arg) = arg3 {\r\n                    write!(self.out, \", \")?;\r\n                    if insert_bits {\r\n                        write!(self.out, \"int(\")?;\r\n                        self.write_expr(arg, ctx)?;\r\n                        write!(self.out, \")\")?;\r\n                    } else {\r\n                        self.write_expr(arg, ctx)?;\r\n                    }\r\n                }\r\n                write!(self.out, \")\")?;\r\n\r\n                // Close the cast from int to uint\r\n                if ret_might_need_int_to_uint && maybe_uint_size.is_some() {\r\n                    write!(self.out, \")\")?\r\n                }\r\n            }\r\n            // `As` is always a call.\r\n            // If `convert` is true the function name is the type\r\n            // Else the function name is one of the glsl provided bitcast functions\r\n            Expression::As {\r\n                expr,\r\n                kind: target_kind,\r\n                convert,\r\n            } => {\r\n                let inner = ctx.info[expr].ty.inner_with(&self.module.types);\r\n                match convert {\r\n                    Some(width) => {\r\n                        // this is similar to `write_type`, but with the target kind\r\n                        let scalar = glsl_scalar(target_kind, width)?;\r\n                        match *inner {\r\n                            TypeInner::Matrix { columns, rows, .. } => write!(\r\n                                self.out,\r\n                                \"{}mat{}x{}\",\r\n                                scalar.prefix, columns as u8, rows as u8\r\n                            )?,\r\n                            TypeInner::Vector { size, .. } => {\r\n                                write!(self.out, \"{}vec{}\", scalar.prefix, size as u8)?\r\n                            }\r\n                            _ => write!(self.out, \"{}\", scalar.full)?,\r\n                        }\r\n\r\n                        write!(self.out, \"(\")?;\r\n                        self.write_expr(expr, ctx)?;\r\n                        write!(self.out, \")\")?\r\n                    }\r\n                    None => {\r\n                        use crate::ScalarKind as Sk;\r\n\r\n                        let target_vector_type = match *inner {\r\n                            TypeInner::Vector { size, width, .. } => Some(TypeInner::Vector {\r\n                                size,\r\n                                width,\r\n                                kind: target_kind,\r\n                            }),\r\n                            _ => None,\r\n                        };\r\n\r\n                        let source_kind = inner.scalar_kind().unwrap();\r\n\r\n                        match (source_kind, target_kind, target_vector_type) {\r\n                            // No conversion needed\r\n                            (Sk::Sint, Sk::Sint, _)\r\n                            | (Sk::Uint, Sk::Uint, _)\r\n                            | (Sk::Float, Sk::Float, _)\r\n                            | (Sk::Bool, Sk::Bool, _) => {\r\n                                self.write_expr(expr, ctx)?;\r\n                                return Ok(());\r\n                            }\r\n\r\n                            // Cast to/from floats\r\n                            (Sk::Float, Sk::Sint, _) => write!(self.out, \"floatBitsToInt\")?,\r\n                            (Sk::Float, Sk::Uint, _) => write!(self.out, \"floatBitsToUint\")?,\r\n                            (Sk::Sint, Sk::Float, _) => write!(self.out, \"intBitsToFloat\")?,\r\n                            (Sk::Uint, Sk::Float, _) => write!(self.out, \"uintBitsToFloat\")?,\r\n\r\n                            // Cast between vector types\r\n                            (_, _, Some(vector)) => {\r\n                                self.write_value_type(&vector)?;\r\n                            }\r\n\r\n                            // There is no way to bitcast between Uint/Sint in glsl. Use constructor conversion\r\n                            (Sk::Uint | Sk::Bool, Sk::Sint, None) => write!(self.out, \"int\")?,\r\n                            (Sk::Sint | Sk::Bool, Sk::Uint, None) => write!(self.out, \"uint\")?,\r\n                            (Sk::Bool, Sk::Float, None) => write!(self.out, \"float\")?,\r\n                            (Sk::Sint | Sk::Uint | Sk::Float, Sk::Bool, None) => {\r\n                                write!(self.out, \"bool\")?\r\n                            }\r\n                        };\r\n\r\n                        write!(self.out, \"(\")?;\r\n                        self.write_expr(expr, ctx)?;\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                }\r\n            }\r\n            // These expressions never show up in `Emit`.\r\n            Expression::CallResult(_) | Expression::AtomicResult { .. } => unreachable!(),\r\n            // `ArrayLength` is written as `expr.length()` and we convert it to a uint\r\n            Expression::ArrayLength(expr) => {\r\n                write!(self.out, \"uint(\")?;\r\n                self.write_expr(expr, ctx)?;\r\n                write!(self.out, \".length())\")?\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function to write the local holding the clamped lod\r\n    fn write_clamped_lod(\r\n        &mut self,\r\n        ctx: &back::FunctionCtx,\r\n        expr: Handle<crate::Expression>,\r\n        image: Handle<crate::Expression>,\r\n        level_expr: Handle<crate::Expression>,\r\n    ) -> Result<(), Error> {\r\n        // Define our local and start a call to `clamp`\r\n        write!(\r\n            self.out,\r\n            \"int {}{}{} = clamp(\",\r\n            back::BAKE_PREFIX,\r\n            expr.index(),\r\n            CLAMPED_LOD_SUFFIX\r\n        )?;\r\n        // Write the lod that will be clamped\r\n        self.write_expr(level_expr, ctx)?;\r\n        // Set the min value to 0 and start a call to `textureQueryLevels` to get\r\n        // the maximum value\r\n        write!(self.out, \", 0, textureQueryLevels(\")?;\r\n        // Write the target image as an argument to `textureQueryLevels`\r\n        self.write_expr(image, ctx)?;\r\n        // Close the call to `textureQueryLevels` subtract 1 from it since\r\n        // the lod argument is 0 based, close the `clamp` call and end the\r\n        // local declaration statement.\r\n        writeln!(self.out, \") - 1);\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    // Helper method used to retrieve how many elements a coordinate vector\r\n    // for the images operations need.\r\n    fn get_coordinate_vector_size(&self, dim: crate::ImageDimension, arrayed: bool) -> u8 {\r\n        // openGL es doesn't have 1D images so we need workaround it\r\n        let tex_1d_hack = dim == crate::ImageDimension::D1 && self.options.version.is_es();\r\n        // Get how many components the coordinate vector needs for the dimensions only\r\n        let tex_coord_size = match dim {\r\n            crate::ImageDimension::D1 => 1,\r\n            crate::ImageDimension::D2 => 2,\r\n            crate::ImageDimension::D3 => 3,\r\n            crate::ImageDimension::Cube => 2,\r\n        };\r\n        // Calculate the true size of the coordinate vector by adding 1 for arrayed images\r\n        // and another 1 if we need to workaround 1D images by making them 2D\r\n        tex_coord_size + tex_1d_hack as u8 + arrayed as u8\r\n    }\r\n\r\n    /// Helper method to write the coordinate vector for image operations\r\n    fn write_texture_coord(\r\n        &mut self,\r\n        ctx: &back::FunctionCtx,\r\n        vector_size: u8,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        // Emulate 1D images as 2D for profiles that don't support it (glsl es)\r\n        tex_1d_hack: bool,\r\n    ) -> Result<(), Error> {\r\n        match array_index {\r\n            // If the image needs an array indice we need to add it to the end of our\r\n            // coordinate vector, to do so we will use the `ivec(ivec, scalar)`\r\n            // constructor notation (NOTE: the inner `ivec` can also be a scalar, this\r\n            // is important for 1D arrayed images).\r\n            Some(layer_expr) => {\r\n                write!(self.out, \"ivec{}(\", vector_size)?;\r\n                self.write_expr(coordinate, ctx)?;\r\n                write!(self.out, \", \")?;\r\n                // If we are replacing sampler1D with sampler2D we also need\r\n                // to add another zero to the coordinates vector for the y component\r\n                if tex_1d_hack {\r\n                    write!(self.out, \"0, \")?;\r\n                }\r\n                self.write_expr(layer_expr, ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            // Otherwise write just the expression (and the 1D hack if needed)\r\n            None => {\r\n                if tex_1d_hack {\r\n                    write!(self.out, \"ivec2(\")?;\r\n                }\r\n                self.write_expr(coordinate, ctx)?;\r\n                if tex_1d_hack {\r\n                    write!(self.out, \", 0)\")?;\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method to write the `ImageStore` statement\r\n    fn write_image_store(\r\n        &mut self,\r\n        ctx: &back::FunctionCtx,\r\n        image: Handle<crate::Expression>,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        value: Handle<crate::Expression>,\r\n    ) -> Result<(), Error> {\r\n        use crate::ImageDimension as IDim;\r\n\r\n        // NOTE: openGL requires that `imageStore`s have no effets when the texel is invalid\r\n        // so we don't need to generate bounds checks (OpenGL 4.2 Core §3.9.20)\r\n\r\n        // This will only panic if the module is invalid\r\n        let dim = match *ctx.info[image].ty.inner_with(&self.module.types) {\r\n            TypeInner::Image { dim, .. } => dim,\r\n            _ => unreachable!(),\r\n        };\r\n\r\n        // Begin our call to `imageStore`\r\n        write!(self.out, \"imageStore(\")?;\r\n        self.write_expr(image, ctx)?;\r\n        // Separate the image argument from the coordinates\r\n        write!(self.out, \", \")?;\r\n\r\n        // openGL es doesn't have 1D images so we need workaround it\r\n        let tex_1d_hack = dim == IDim::D1 && self.options.version.is_es();\r\n        // Write the coordinate vector\r\n        self.write_texture_coord(\r\n            ctx,\r\n            // Get the size of the coordinate vector\r\n            self.get_coordinate_vector_size(dim, array_index.is_some()),\r\n            coordinate,\r\n            array_index,\r\n            tex_1d_hack,\r\n        )?;\r\n\r\n        // Separate the coordinate from the value to write and write the expression\r\n        // of the value to write.\r\n        write!(self.out, \", \")?;\r\n        self.write_expr(value, ctx)?;\r\n        // End the call to `imageStore` and the statement.\r\n        writeln!(self.out, \");\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method for writing an `ImageLoad` expression.\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn write_image_load(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n        ctx: &back::FunctionCtx,\r\n        image: Handle<crate::Expression>,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        sample: Option<Handle<crate::Expression>>,\r\n        level: Option<Handle<crate::Expression>>,\r\n    ) -> Result<(), Error> {\r\n        use crate::ImageDimension as IDim;\r\n\r\n        // `ImageLoad` is a bit complicated.\r\n        // There are two functions one for sampled\r\n        // images another for storage images, the former uses `texelFetch` and the\r\n        // latter uses `imageLoad`.\r\n        //\r\n        // Furthermore we have `level` which is always `Some` for sampled images\r\n        // and `None` for storage images, so we end up with two functions:\r\n        // - `texelFetch(image, coordinate, level)` for sampled images\r\n        // - `imageLoad(image, coordinate)` for storage images\r\n        //\r\n        // Finally we also have to consider bounds checking, for storage images\r\n        // this is easy since openGL requires that invalid texels always return\r\n        // 0, for sampled images we need to either verify that all arguments are\r\n        // in bounds (`ReadZeroSkipWrite`) or make them a valid texel (`Restrict`).\r\n\r\n        // This will only panic if the module is invalid\r\n        let (dim, class) = match *ctx.info[image].ty.inner_with(&self.module.types) {\r\n            TypeInner::Image {\r\n                dim,\r\n                arrayed: _,\r\n                class,\r\n            } => (dim, class),\r\n            _ => unreachable!(),\r\n        };\r\n\r\n        // Get the name of the function to be used for the load operation\r\n        // and the policy to be used with it.\r\n        let (fun_name, policy) = match class {\r\n            // Sampled images inherit the policy from the user passed policies\r\n            crate::ImageClass::Sampled { .. } => (\"texelFetch\", self.policies.image),\r\n            crate::ImageClass::Storage { .. } => {\r\n                // OpenGL 4.2 Core §3.9.20 defines that out of bounds texels in `imageLoad`s\r\n                // always return zero values so we don't need to generate bounds checks\r\n                (\"imageLoad\", proc::BoundsCheckPolicy::Unchecked)\r\n            }\r\n            // TODO: Is there even a function for this?\r\n            crate::ImageClass::Depth { multi: _ } => {\r\n                return Err(Error::Custom(\r\n                    \"WGSL `textureLoad` from depth textures is not supported in GLSL\".to_string(),\r\n                ))\r\n            }\r\n        };\r\n\r\n        // openGL es doesn't have 1D images so we need workaround it\r\n        let tex_1d_hack = dim == IDim::D1 && self.options.version.is_es();\r\n        // Get the size of the coordinate vector\r\n        let vector_size = self.get_coordinate_vector_size(dim, array_index.is_some());\r\n\r\n        if let proc::BoundsCheckPolicy::ReadZeroSkipWrite = policy {\r\n            // To write the bounds checks for `ReadZeroSkipWrite` we will use a\r\n            // ternary operator since we are in the middle of an expression and\r\n            // need to return a value.\r\n            //\r\n            // NOTE: glsl does short circuit when evaluating logical\r\n            // expressions so we can be sure that after we test a\r\n            // condition it will be true for the next ones\r\n\r\n            // Write parantheses around the ternary operator to prevent problems with\r\n            // expressions emitted before or after it having more precedence\r\n            write!(self.out, \"(\",)?;\r\n\r\n            // The lod check needs to precede the size check since we need\r\n            // to use the lod to get the size of the image at that level.\r\n            if let Some(level_expr) = level {\r\n                self.write_expr(level_expr, ctx)?;\r\n                write!(self.out, \" < textureQueryLevels(\",)?;\r\n                self.write_expr(image, ctx)?;\r\n                // Chain the next check\r\n                write!(self.out, \") && \")?;\r\n            }\r\n\r\n            // Check that the sample arguments doesn't exceed the number of samples\r\n            if let Some(sample_expr) = sample {\r\n                self.write_expr(sample_expr, ctx)?;\r\n                write!(self.out, \" < textureSamples(\",)?;\r\n                self.write_expr(image, ctx)?;\r\n                // Chain the next check\r\n                write!(self.out, \") && \")?;\r\n            }\r\n\r\n            // We now need to write the size checks for the coordinates and array index\r\n            // first we write the comparation function in case the image is 1D non arrayed\r\n            // (and no 1D to 2D hack was needed) we are comparing scalars so the less than\r\n            // operator will suffice, but otherwise we'll be comparing two vectors so we'll\r\n            // need to use the `lessThan` function but it returns a vector of booleans (one\r\n            // for each comparison) so we need to fold it all in one scalar boolean, since\r\n            // we want all comparisons to pass we use the `all` function which will only\r\n            // return `true` if all the elements of the boolean vector are also `true`.\r\n            //\r\n            // So we'll end with one of the following forms\r\n            // - `coord < textureSize(image, lod)` for 1D images\r\n            // - `all(lessThan(coord, textureSize(image, lod)))` for normal images\r\n            // - `all(lessThan(ivec(coord, array_index), textureSize(image, lod)))`\r\n            //    for arrayed images\r\n            // - `all(lessThan(coord, textureSize(image)))` for multi sampled images\r\n\r\n            if vector_size != 1 {\r\n                write!(self.out, \"all(lessThan(\")?;\r\n            }\r\n\r\n            // Write the coordinate vector\r\n            self.write_texture_coord(ctx, vector_size, coordinate, array_index, tex_1d_hack)?;\r\n\r\n            if vector_size != 1 {\r\n                // If we used the `lessThan` function we need to separate the\r\n                // coordinates from the image size.\r\n                write!(self.out, \", \")?;\r\n            } else {\r\n                // If we didn't use it (ie. 1D images) we perform the comparsion\r\n                // using the less than operator.\r\n                write!(self.out, \" < \")?;\r\n            }\r\n\r\n            // Call `textureSize` to get our image size\r\n            write!(self.out, \"textureSize(\")?;\r\n            self.write_expr(image, ctx)?;\r\n            // `textureSize` uses the lod as a second argument for mipmapped images\r\n            if let Some(level_expr) = level {\r\n                // Separate the image from the lod\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(level_expr, ctx)?;\r\n            }\r\n            // Close the `textureSize` call\r\n            write!(self.out, \")\")?;\r\n\r\n            if vector_size != 1 {\r\n                // Close the `all` and `lessThan` calls\r\n                write!(self.out, \"))\")?;\r\n            }\r\n\r\n            // Finally end the condition part of the ternary operator\r\n            write!(self.out, \" ? \")?;\r\n        }\r\n\r\n        // Begin the call to the function used to load the texel\r\n        write!(self.out, \"{}(\", fun_name)?;\r\n        self.write_expr(image, ctx)?;\r\n        write!(self.out, \", \")?;\r\n\r\n        // If we are using `Restrict` bounds checking we need to pass valid texel\r\n        // coordinates, to do so we use the `clamp` function to get a value between\r\n        // 0 and the image size - 1 (indexing begins at 0)\r\n        if let proc::BoundsCheckPolicy::Restrict = policy {\r\n            write!(self.out, \"clamp(\")?;\r\n        }\r\n\r\n        // Write the coordinate vector\r\n        self.write_texture_coord(ctx, vector_size, coordinate, array_index, tex_1d_hack)?;\r\n\r\n        // If we are using `Restrict` bounds checking we need to write the rest of the\r\n        // clamp we initiated before writing the coordinates.\r\n        if let proc::BoundsCheckPolicy::Restrict = policy {\r\n            // Write the min value 0\r\n            if vector_size == 1 {\r\n                write!(self.out, \", 0\")?;\r\n            } else {\r\n                write!(self.out, \", ivec{}(0)\", vector_size)?;\r\n            }\r\n            // Start the `textureSize` call to use as the max value.\r\n            write!(self.out, \", textureSize(\")?;\r\n            self.write_expr(image, ctx)?;\r\n            // If the image is mipmapped we need to add the lod argument to the\r\n            // `textureSize` call, but this needs to be the clamped lod, this should\r\n            // have been generated earlier and put in a local.\r\n            if class.is_mipmapped() {\r\n                write!(\r\n                    self.out,\r\n                    \", {}{}{}\",\r\n                    back::BAKE_PREFIX,\r\n                    handle.index(),\r\n                    CLAMPED_LOD_SUFFIX\r\n                )?;\r\n            }\r\n            // Close the `textureSize` call\r\n            write!(self.out, \")\")?;\r\n\r\n            // Subtract 1 from the `textureSize` call since the coordinates are zero based.\r\n            if vector_size == 1 {\r\n                write!(self.out, \" - 1\")?;\r\n            } else {\r\n                write!(self.out, \" - ivec{}(1)\", vector_size)?;\r\n            }\r\n\r\n            // Close the `clamp` call\r\n            write!(self.out, \")\")?;\r\n\r\n            // Add the clamped lod (if present) as the second argument to the\r\n            // image load function.\r\n            if level.is_some() {\r\n                write!(\r\n                    self.out,\r\n                    \", {}{}{}\",\r\n                    back::BAKE_PREFIX,\r\n                    handle.index(),\r\n                    CLAMPED_LOD_SUFFIX\r\n                )?;\r\n            }\r\n\r\n            // If a sample argument is needed we need to clamp it between 0 and\r\n            // the number of samples the image has.\r\n            if let Some(sample_expr) = sample {\r\n                write!(self.out, \", clamp(\")?;\r\n                self.write_expr(sample_expr, ctx)?;\r\n                // Set the min value to 0 and start the call to `textureSamples`\r\n                write!(self.out, \", 0, textureSamples(\")?;\r\n                self.write_expr(image, ctx)?;\r\n                // Close the `textureSamples` call, subtract 1 from it since the sample\r\n                // argument is zero based, and close the `clamp` call\r\n                writeln!(self.out, \") - 1)\")?;\r\n            }\r\n        } else if let Some(sample_or_level) = sample.or(level) {\r\n            // If no bounds checking is need just add the sample or level argument\r\n            // after the coordinates\r\n            write!(self.out, \", \")?;\r\n            self.write_expr(sample_or_level, ctx)?;\r\n        }\r\n\r\n        // Close the image load function.\r\n        write!(self.out, \")\")?;\r\n\r\n        // If we were using the `ReadZeroSkipWrite` policy we need to end the first branch\r\n        // (which is taken if the condition is `true`) with a colon (`:`) and write the\r\n        // second branch which is just a 0 value.\r\n        if let proc::BoundsCheckPolicy::ReadZeroSkipWrite = policy {\r\n            // Get the kind of the output value.\r\n            let kind = match class {\r\n                // Only sampled images can reach here since storage images\r\n                // don't need bounds checks and depth images aren't implmented\r\n                crate::ImageClass::Sampled { kind, .. } => kind,\r\n                _ => unreachable!(),\r\n            };\r\n\r\n            // End the first branch\r\n            write!(self.out, \" : \")?;\r\n            // Write the 0 value\r\n            write!(self.out, \"{}vec4(\", glsl_scalar(kind, 4)?.prefix,)?;\r\n            self.write_zero_init_scalar(kind)?;\r\n            // Close the zero value constructor\r\n            write!(self.out, \")\")?;\r\n            // Close the parantheses surrounding our ternary\r\n            write!(self.out, \")\")?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn write_named_expr(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n        name: String,\r\n        ctx: &back::FunctionCtx,\r\n    ) -> BackendResult {\r\n        match ctx.info[handle].ty {\r\n            proc::TypeResolution::Handle(ty_handle) => match self.module.types[ty_handle].inner {\r\n                TypeInner::Struct { .. } => {\r\n                    let ty_name = &self.names[&NameKey::Type(ty_handle)];\r\n                    write!(self.out, \"{}\", ty_name)?;\r\n                }\r\n                _ => {\r\n                    self.write_type(ty_handle)?;\r\n                }\r\n            },\r\n            proc::TypeResolution::Value(ref inner) => {\r\n                self.write_value_type(inner)?;\r\n            }\r\n        }\r\n\r\n        let base_ty_res = &ctx.info[handle].ty;\r\n        let resolved = base_ty_res.inner_with(&self.module.types);\r\n\r\n        write!(self.out, \" {}\", name)?;\r\n        if let TypeInner::Array { base, size, .. } = *resolved {\r\n            self.write_array_size(base, size)?;\r\n        }\r\n        write!(self.out, \" = \")?;\r\n        self.write_expr(handle, ctx)?;\r\n        writeln!(self.out, \";\")?;\r\n        self.named_expressions.insert(handle, name);\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write string with default zero initialization for supported types\r\n    fn write_zero_init_value(&mut self, ty: Handle<crate::Type>) -> BackendResult {\r\n        let inner = &self.module.types[ty].inner;\r\n        match *inner {\r\n            TypeInner::Scalar { kind, .. } => {\r\n                self.write_zero_init_scalar(kind)?;\r\n            }\r\n            TypeInner::Vector { kind, .. } => {\r\n                self.write_value_type(inner)?;\r\n                write!(self.out, \"(\")?;\r\n                self.write_zero_init_scalar(kind)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            TypeInner::Matrix { .. } => {\r\n                self.write_value_type(inner)?;\r\n                write!(self.out, \"(\")?;\r\n                self.write_zero_init_scalar(crate::ScalarKind::Float)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            TypeInner::Array { base, size, .. } => {\r\n                let count = match size\r\n                    .to_indexable_length(self.module)\r\n                    .expect(\"Bad array size\")\r\n                {\r\n                    proc::IndexableLength::Known(count) => count,\r\n                    proc::IndexableLength::Dynamic => return Ok(()),\r\n                };\r\n                self.write_type(base)?;\r\n                self.write_array_size(base, size)?;\r\n                write!(self.out, \"(\")?;\r\n                for _ in 1..count {\r\n                    self.write_zero_init_value(base)?;\r\n                    write!(self.out, \", \")?;\r\n                }\r\n                // write last parameter without comma and space\r\n                self.write_zero_init_value(base)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            TypeInner::Struct { ref members, .. } => {\r\n                let name = &self.names[&NameKey::Type(ty)];\r\n                write!(self.out, \"{}(\", name)?;\r\n                for (i, member) in members.iter().enumerate() {\r\n                    self.write_zero_init_value(member.ty)?;\r\n                    if i != members.len().saturating_sub(1) {\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                }\r\n                write!(self.out, \")\")?;\r\n            }\r\n            _ => {} // TODO:\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write string with zero initialization for scalar\r\n    fn write_zero_init_scalar(&mut self, kind: crate::ScalarKind) -> BackendResult {\r\n        match kind {\r\n            crate::ScalarKind::Bool => write!(self.out, \"false\")?,\r\n            crate::ScalarKind::Uint => write!(self.out, \"0u\")?,\r\n            crate::ScalarKind::Float => write!(self.out, \"0.0\")?,\r\n            crate::ScalarKind::Sint => write!(self.out, \"0\")?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that return the glsl storage access string of [`StorageAccess`](crate::StorageAccess)\r\n    ///\r\n    /// glsl allows adding both `readonly` and `writeonly` but this means that\r\n    /// they can only be used to query information about the resource which isn't what\r\n    /// we want here so when storage access is both `LOAD` and `STORE` add no modifiers\r\n    fn write_storage_access(&mut self, storage_access: crate::StorageAccess) -> BackendResult {\r\n        if !storage_access.contains(crate::StorageAccess::STORE) {\r\n            write!(self.out, \"readonly \")?;\r\n        }\r\n        if !storage_access.contains(crate::StorageAccess::LOAD) {\r\n            write!(self.out, \"writeonly \")?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to produce the reflection info that's returned to the user\r\n    fn collect_reflection_info(&self) -> Result<ReflectionInfo, Error> {\r\n        use std::collections::hash_map::Entry;\r\n        let info = self.info.get_entry_point(self.entry_point_idx as usize);\r\n        let mut texture_mapping = crate::FastHashMap::default();\r\n        let mut uniforms = crate::FastHashMap::default();\r\n\r\n        for sampling in info.sampling_set.iter() {\r\n            let tex_name = self.reflection_names_globals[&sampling.image].clone();\r\n\r\n            match texture_mapping.entry(tex_name) {\r\n                Entry::Vacant(v) => {\r\n                    v.insert(TextureMapping {\r\n                        texture: sampling.image,\r\n                        sampler: Some(sampling.sampler),\r\n                    });\r\n                }\r\n                Entry::Occupied(e) => {\r\n                    if e.get().sampler != Some(sampling.sampler) {\r\n                        log::error!(\"Conflicting samplers for {}\", e.key());\r\n                        return Err(Error::ImageMultipleSamplers);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        for (handle, var) in self.module.global_variables.iter() {\r\n            if info[handle].is_empty() {\r\n                continue;\r\n            }\r\n            match self.module.types[var.ty].inner {\r\n                crate::TypeInner::Struct { .. } => match var.space {\r\n                    crate::AddressSpace::Uniform | crate::AddressSpace::Storage { .. } => {\r\n                        let name = self.reflection_names_globals[&handle].clone();\r\n                        uniforms.insert(handle, name);\r\n                    }\r\n                    _ => (),\r\n                },\r\n                crate::TypeInner::Image { .. } => {\r\n                    let tex_name = self.reflection_names_globals[&handle].clone();\r\n                    match texture_mapping.entry(tex_name) {\r\n                        Entry::Vacant(v) => {\r\n                            v.insert(TextureMapping {\r\n                                texture: handle,\r\n                                sampler: None,\r\n                            });\r\n                        }\r\n                        Entry::Occupied(_) => {\r\n                            // already used with a sampler, do nothing\r\n                        }\r\n                    }\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n\r\n        Ok(ReflectionInfo {\r\n            texture_mapping,\r\n            uniforms,\r\n        })\r\n    }\r\n}\r\n\r\n/// Structure returned by [`glsl_scalar`](glsl_scalar)\r\n///\r\n/// It contains both a prefix used in other types and the full type name\r\nstruct ScalarString<'a> {\r\n    /// The prefix used to compose other types\r\n    prefix: &'a str,\r\n    /// The name of the scalar type\r\n    full: &'a str,\r\n}\r\n\r\n/// Helper function that returns scalar related strings\r\n///\r\n/// Check [`ScalarString`](ScalarString) for the information provided\r\n///\r\n/// # Errors\r\n/// If a [`Float`](crate::ScalarKind::Float) with an width that isn't 4 or 8\r\nconst fn glsl_scalar(\r\n    kind: crate::ScalarKind,\r\n    width: crate::Bytes,\r\n) -> Result<ScalarString<'static>, Error> {\r\n    use crate::ScalarKind as Sk;\r\n\r\n    Ok(match kind {\r\n        Sk::Sint => ScalarString {\r\n            prefix: \"i\",\r\n            full: \"int\",\r\n        },\r\n        Sk::Uint => ScalarString {\r\n            prefix: \"u\",\r\n            full: \"uint\",\r\n        },\r\n        Sk::Float => match width {\r\n            4 => ScalarString {\r\n                prefix: \"\",\r\n                full: \"float\",\r\n            },\r\n            8 => ScalarString {\r\n                prefix: \"d\",\r\n                full: \"double\",\r\n            },\r\n            _ => return Err(Error::UnsupportedScalar(kind, width)),\r\n        },\r\n        Sk::Bool => ScalarString {\r\n            prefix: \"b\",\r\n            full: \"bool\",\r\n        },\r\n    })\r\n}\r\n\r\n/// Helper function that returns the glsl variable name for a builtin\r\nconst fn glsl_built_in(\r\n    built_in: crate::BuiltIn,\r\n    output: bool,\r\n    targetting_webgl: bool,\r\n) -> &'static str {\r\n    use crate::BuiltIn as Bi;\r\n\r\n    match built_in {\r\n        Bi::Position { .. } => {\r\n            if output {\r\n                \"gl_Position\"\r\n            } else {\r\n                \"gl_FragCoord\"\r\n            }\r\n        }\r\n        Bi::ViewIndex if targetting_webgl => \"int(gl_ViewID_OVR)\",\r\n        Bi::ViewIndex => \"gl_ViewIndex\",\r\n        // vertex\r\n        Bi::BaseInstance => \"uint(gl_BaseInstance)\",\r\n        Bi::BaseVertex => \"uint(gl_BaseVertex)\",\r\n        Bi::ClipDistance => \"gl_ClipDistance\",\r\n        Bi::CullDistance => \"gl_CullDistance\",\r\n        Bi::InstanceIndex => \"uint(gl_InstanceID)\",\r\n        Bi::PointSize => \"gl_PointSize\",\r\n        Bi::VertexIndex => \"uint(gl_VertexID)\",\r\n        // fragment\r\n        Bi::FragDepth => \"gl_FragDepth\",\r\n        Bi::FrontFacing => \"gl_FrontFacing\",\r\n        Bi::PrimitiveIndex => \"uint(gl_PrimitiveID)\",\r\n        Bi::SampleIndex => \"gl_SampleID\",\r\n        Bi::SampleMask => {\r\n            if output {\r\n                \"gl_SampleMask\"\r\n            } else {\r\n                \"gl_SampleMaskIn\"\r\n            }\r\n        }\r\n        // compute\r\n        Bi::GlobalInvocationId => \"gl_GlobalInvocationID\",\r\n        Bi::LocalInvocationId => \"gl_LocalInvocationID\",\r\n        Bi::LocalInvocationIndex => \"gl_LocalInvocationIndex\",\r\n        Bi::WorkGroupId => \"gl_WorkGroupID\",\r\n        Bi::WorkGroupSize => \"gl_WorkGroupSize\",\r\n        Bi::NumWorkGroups => \"gl_NumWorkGroups\",\r\n    }\r\n}\r\n\r\n/// Helper function that returns the string corresponding to the address space\r\nconst fn glsl_storage_qualifier(space: crate::AddressSpace) -> Option<&'static str> {\r\n    use crate::AddressSpace as As;\r\n\r\n    match space {\r\n        As::Function => None,\r\n        As::Private => None,\r\n        As::Storage { .. } => Some(\"buffer\"),\r\n        As::Uniform => Some(\"uniform\"),\r\n        As::Handle => Some(\"uniform\"),\r\n        As::WorkGroup => Some(\"shared\"),\r\n        As::PushConstant => Some(\"uniform\"),\r\n    }\r\n}\r\n\r\n/// Helper function that returns the string corresponding to the glsl interpolation qualifier\r\nconst fn glsl_interpolation(interpolation: crate::Interpolation) -> &'static str {\r\n    use crate::Interpolation as I;\r\n\r\n    match interpolation {\r\n        I::Perspective => \"smooth\",\r\n        I::Linear => \"noperspective\",\r\n        I::Flat => \"flat\",\r\n    }\r\n}\r\n\r\n/// Return the GLSL auxiliary qualifier for the given sampling value.\r\nconst fn glsl_sampling(sampling: crate::Sampling) -> Option<&'static str> {\r\n    use crate::Sampling as S;\r\n\r\n    match sampling {\r\n        S::Center => None,\r\n        S::Centroid => Some(\"centroid\"),\r\n        S::Sample => Some(\"sample\"),\r\n    }\r\n}\r\n\r\n/// Helper function that returns the glsl dimension string of [`ImageDimension`](crate::ImageDimension)\r\nconst fn glsl_dimension(dim: crate::ImageDimension) -> &'static str {\r\n    use crate::ImageDimension as IDim;\r\n\r\n    match dim {\r\n        IDim::D1 => \"1D\",\r\n        IDim::D2 => \"2D\",\r\n        IDim::D3 => \"3D\",\r\n        IDim::Cube => \"Cube\",\r\n    }\r\n}\r\n\r\n/// Helper function that returns the glsl storage format string of [`StorageFormat`](crate::StorageFormat)\r\nconst fn glsl_storage_format(format: crate::StorageFormat) -> &'static str {\r\n    use crate::StorageFormat as Sf;\r\n\r\n    match format {\r\n        Sf::R8Unorm => \"r8\",\r\n        Sf::R8Snorm => \"r8_snorm\",\r\n        Sf::R8Uint => \"r8ui\",\r\n        Sf::R8Sint => \"r8i\",\r\n        Sf::R16Uint => \"r16ui\",\r\n        Sf::R16Sint => \"r16i\",\r\n        Sf::R16Float => \"r16f\",\r\n        Sf::Rg8Unorm => \"rg8\",\r\n        Sf::Rg8Snorm => \"rg8_snorm\",\r\n        Sf::Rg8Uint => \"rg8ui\",\r\n        Sf::Rg8Sint => \"rg8i\",\r\n        Sf::R32Uint => \"r32ui\",\r\n        Sf::R32Sint => \"r32i\",\r\n        Sf::R32Float => \"r32f\",\r\n        Sf::Rg16Uint => \"rg16ui\",\r\n        Sf::Rg16Sint => \"rg16i\",\r\n        Sf::Rg16Float => \"rg16f\",\r\n        Sf::Rgba8Unorm => \"rgba8\",\r\n        Sf::Rgba8Snorm => \"rgba8_snorm\",\r\n        Sf::Rgba8Uint => \"rgba8ui\",\r\n        Sf::Rgba8Sint => \"rgba8i\",\r\n        Sf::Rgb10a2Unorm => \"rgb10_a2ui\",\r\n        Sf::Rg11b10Float => \"r11f_g11f_b10f\",\r\n        Sf::Rg32Uint => \"rg32ui\",\r\n        Sf::Rg32Sint => \"rg32i\",\r\n        Sf::Rg32Float => \"rg32f\",\r\n        Sf::Rgba16Uint => \"rgba16ui\",\r\n        Sf::Rgba16Sint => \"rgba16i\",\r\n        Sf::Rgba16Float => \"rgba16f\",\r\n        Sf::Rgba32Uint => \"rgba32ui\",\r\n        Sf::Rgba32Sint => \"rgba32i\",\r\n        Sf::Rgba32Float => \"rgba32f\",\r\n    }\r\n}\r\n\r\nfn is_value_init_supported(module: &crate::Module, ty: Handle<crate::Type>) -> bool {\r\n    match module.types[ty].inner {\r\n        TypeInner::Scalar { .. } | TypeInner::Vector { .. } | TypeInner::Matrix { .. } => true,\r\n        TypeInner::Array { base, size, .. } => {\r\n            size != crate::ArraySize::Dynamic && is_value_init_supported(module, base)\r\n        }\r\n        TypeInner::Struct { ref members, .. } => members\r\n            .iter()\r\n            .all(|member| is_value_init_supported(module, member.ty)),\r\n        _ => false,\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/hlsl/conv.rs",
    "content": "use std::borrow::Cow;\r\n\r\nuse crate::proc::Alignment;\r\n\r\nuse super::Error;\r\n\r\nimpl crate::ScalarKind {\r\n    pub(super) fn to_hlsl_cast(self) -> &'static str {\r\n        match self {\r\n            Self::Float => \"asfloat\",\r\n            Self::Sint => \"asint\",\r\n            Self::Uint => \"asuint\",\r\n            Self::Bool => unreachable!(),\r\n        }\r\n    }\r\n\r\n    /// Helper function that returns scalar related strings\r\n    ///\r\n    /// <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-scalar>\r\n    pub(super) const fn to_hlsl_str(self, width: crate::Bytes) -> Result<&'static str, Error> {\r\n        match self {\r\n            Self::Sint => Ok(\"int\"),\r\n            Self::Uint => Ok(\"uint\"),\r\n            Self::Float => match width {\r\n                2 => Ok(\"half\"),\r\n                4 => Ok(\"float\"),\r\n                8 => Ok(\"double\"),\r\n                _ => Err(Error::UnsupportedScalar(self, width)),\r\n            },\r\n            Self::Bool => Ok(\"bool\"),\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::TypeInner {\r\n    pub(super) const fn is_matrix(&self) -> bool {\r\n        match *self {\r\n            Self::Matrix { .. } => true,\r\n            _ => false,\r\n        }\r\n    }\r\n\r\n    pub(super) fn try_size_hlsl(\r\n        &self,\r\n        types: &crate::UniqueArena<crate::Type>,\r\n        constants: &crate::Arena<crate::Constant>,\r\n    ) -> Result<u32, crate::arena::BadHandle> {\r\n        Ok(match *self {\r\n            Self::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                let stride = Alignment::from(rows) * width as u32;\r\n                let last_row_size = rows as u32 * width as u32;\r\n                ((columns as u32 - 1) * stride) + last_row_size\r\n            }\r\n            Self::Array { base, size, stride } => {\r\n                let count = match size {\r\n                    crate::ArraySize::Constant(handle) => {\r\n                        let constant = constants.try_get(handle)?;\r\n                        constant.to_array_length().unwrap_or(1)\r\n                    }\r\n                    // A dynamically-sized array has to have at least one element\r\n                    crate::ArraySize::Dynamic => 1,\r\n                };\r\n                let last_el_size = types[base].inner.try_size_hlsl(types, constants)?;\r\n                ((count - 1) * stride) + last_el_size\r\n            }\r\n            _ => self.try_size(constants)?,\r\n        })\r\n    }\r\n\r\n    /// Used to generate the name of the wrapped type constructor\r\n    pub(super) fn hlsl_type_id<'a>(\r\n        &self,\r\n        base: crate::Handle<crate::Type>,\r\n        types: &crate::UniqueArena<crate::Type>,\r\n        constants: &crate::Arena<crate::Constant>,\r\n        names: &'a crate::FastHashMap<crate::proc::NameKey, String>,\r\n    ) -> Result<Cow<'a, str>, Error> {\r\n        Ok(match types[base].inner {\r\n            crate::TypeInner::Scalar { kind, width } => Cow::Borrowed(kind.to_hlsl_str(width)?),\r\n            crate::TypeInner::Vector { size, kind, width } => Cow::Owned(format!(\r\n                \"{}{}\",\r\n                kind.to_hlsl_str(width)?,\r\n                crate::back::vector_size_str(size)\r\n            )),\r\n            crate::TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => Cow::Owned(format!(\r\n                \"{}{}x{}\",\r\n                crate::ScalarKind::Float.to_hlsl_str(width)?,\r\n                crate::back::vector_size_str(columns),\r\n                crate::back::vector_size_str(rows),\r\n            )),\r\n            crate::TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(size),\r\n                ..\r\n            } => Cow::Owned(format!(\r\n                \"array{}_{}_\",\r\n                constants[size].to_array_length().unwrap(),\r\n                self.hlsl_type_id(base, types, constants, names)?\r\n            )),\r\n            crate::TypeInner::Struct { .. } => {\r\n                Cow::Borrowed(&names[&crate::proc::NameKey::Type(base)])\r\n            }\r\n            _ => unreachable!(),\r\n        })\r\n    }\r\n}\r\n\r\nimpl crate::StorageFormat {\r\n    pub(super) const fn to_hlsl_str(self) -> &'static str {\r\n        match self {\r\n            Self::R16Float => \"float\",\r\n            Self::R8Unorm => \"unorm float\",\r\n            Self::R8Snorm => \"snorm float\",\r\n            Self::R8Uint | Self::R16Uint => \"uint\",\r\n            Self::R8Sint | Self::R16Sint => \"int\",\r\n\r\n            Self::Rg16Float => \"float2\",\r\n            Self::Rg8Unorm => \"unorm float2\",\r\n            Self::Rg8Snorm => \"snorm float2\",\r\n\r\n            Self::Rg8Sint | Self::Rg16Sint => \"int2\",\r\n            Self::Rg8Uint | Self::Rg16Uint => \"uint2\",\r\n\r\n            Self::Rg11b10Float => \"float3\",\r\n\r\n            Self::Rgba16Float | Self::R32Float | Self::Rg32Float | Self::Rgba32Float => \"float4\",\r\n            Self::Rgba8Unorm | Self::Rgb10a2Unorm => \"unorm float4\",\r\n            Self::Rgba8Snorm => \"snorm float4\",\r\n\r\n            Self::Rgba8Uint\r\n            | Self::Rgba16Uint\r\n            | Self::R32Uint\r\n            | Self::Rg32Uint\r\n            | Self::Rgba32Uint => \"uint4\",\r\n            Self::Rgba8Sint\r\n            | Self::Rgba16Sint\r\n            | Self::R32Sint\r\n            | Self::Rg32Sint\r\n            | Self::Rgba32Sint => \"int4\",\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::BuiltIn {\r\n    pub(super) fn to_hlsl_str(self) -> Result<&'static str, Error> {\r\n        Ok(match self {\r\n            Self::Position { .. } => \"SV_Position\",\r\n            // vertex\r\n            Self::ClipDistance => \"SV_ClipDistance\",\r\n            Self::CullDistance => \"SV_CullDistance\",\r\n            Self::InstanceIndex => \"SV_InstanceID\",\r\n            // based on this page https://docs.microsoft.com/en-us/windows/uwp/gaming/glsl-to-hlsl-reference#comparing-opengl-es-20-with-direct3d-11\r\n            // No meaning unless you target Direct3D 9\r\n            Self::PointSize => \"PSIZE\",\r\n            Self::VertexIndex => \"SV_VertexID\",\r\n            // fragment\r\n            Self::FragDepth => \"SV_Depth\",\r\n            Self::FrontFacing => \"SV_IsFrontFace\",\r\n            Self::PrimitiveIndex => \"SV_PrimitiveID\",\r\n            Self::SampleIndex => \"SV_SampleIndex\",\r\n            Self::SampleMask => \"SV_Coverage\",\r\n            // compute\r\n            Self::GlobalInvocationId => \"SV_DispatchThreadID\",\r\n            Self::LocalInvocationId => \"SV_GroupThreadID\",\r\n            Self::LocalInvocationIndex => \"SV_GroupIndex\",\r\n            Self::WorkGroupId => \"SV_GroupID\",\r\n            // The specific semantic we use here doesn't matter, because references\r\n            // to this field will get replaced with references to `SPECIAL_CBUF_VAR`\r\n            // in `Writer::write_expr`.\r\n            Self::NumWorkGroups => \"SV_GroupID\",\r\n            Self::BaseInstance | Self::BaseVertex | Self::WorkGroupSize => {\r\n                return Err(Error::Unimplemented(format!(\"builtin {:?}\", self)))\r\n            }\r\n            Self::ViewIndex => {\r\n                return Err(Error::Custom(format!(\"Unsupported builtin {:?}\", self)))\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nimpl crate::Interpolation {\r\n    /// Return the string corresponding to the HLSL interpolation qualifier.\r\n    pub(super) const fn to_hlsl_str(self) -> Option<&'static str> {\r\n        match self {\r\n            // Would be \"linear\", but it's the default interpolation in SM4 and up\r\n            // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-struct#interpolation-modifiers-introduced-in-shader-model-4\r\n            Self::Perspective => None,\r\n            Self::Linear => Some(\"noperspective\"),\r\n            Self::Flat => Some(\"nointerpolation\"),\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Sampling {\r\n    /// Return the HLSL auxiliary qualifier for the given sampling value.\r\n    pub(super) const fn to_hlsl_str(self) -> Option<&'static str> {\r\n        match self {\r\n            Self::Center => None,\r\n            Self::Centroid => Some(\"centroid\"),\r\n            Self::Sample => Some(\"sample\"),\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::AtomicFunction {\r\n    /// Return the HLSL suffix for the `InterlockedXxx` method.\r\n    pub(super) const fn to_hlsl_suffix(self) -> &'static str {\r\n        match self {\r\n            Self::Add | Self::Subtract => \"Add\",\r\n            Self::And => \"And\",\r\n            Self::InclusiveOr => \"Or\",\r\n            Self::ExclusiveOr => \"Xor\",\r\n            Self::Min => \"Min\",\r\n            Self::Max => \"Max\",\r\n            Self::Exchange { compare: None } => \"Exchange\",\r\n            Self::Exchange { .. } => \"\", //TODO\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/hlsl/help.rs",
    "content": "/*!\r\nHelpers for the hlsl backend\r\n\r\nImportant note about `Expression::ImageQuery`/`Expression::ArrayLength` and hlsl backend:\r\n\r\nDue to implementation of `GetDimensions` function in hlsl (<https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-getdimensions>)\r\nbackend can't work with it as an expression.\r\nInstead, it generates a unique wrapped function per `Expression::ImageQuery`, based on texture info and query function.\r\nSee `WrappedImageQuery` struct that represents a unique function and will be generated before writing all statements and expressions.\r\nThis allowed to works with `Expression::ImageQuery` as expression and write wrapped function.\r\n\r\nFor example:\r\n```wgsl\r\nlet dim_1d = textureDimensions(image_1d);\r\n```\r\n\r\n```hlsl\r\nint NagaDimensions1D(Texture1D<float4>)\r\n{\r\n   uint4 ret;\r\n   image_1d.GetDimensions(ret.x);\r\n   return ret.x;\r\n}\r\n\r\nint dim_1d = NagaDimensions1D(image_1d);\r\n```\r\n*/\r\n\r\nuse super::{super::FunctionCtx, BackendResult};\r\nuse crate::{arena::Handle, proc::NameKey};\r\nuse std::fmt::Write;\r\n\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\npub(super) struct WrappedArrayLength {\r\n    pub(super) writable: bool,\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\npub(super) struct WrappedImageQuery {\r\n    pub(super) dim: crate::ImageDimension,\r\n    pub(super) arrayed: bool,\r\n    pub(super) class: crate::ImageClass,\r\n    pub(super) query: ImageQuery,\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\npub(super) struct WrappedConstructor {\r\n    pub(super) ty: Handle<crate::Type>,\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\npub(super) struct WrappedStructMatrixAccess {\r\n    pub(super) ty: Handle<crate::Type>,\r\n    pub(super) index: u32,\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\npub(super) struct WrappedMatCx2 {\r\n    pub(super) columns: crate::VectorSize,\r\n}\r\n\r\n/// HLSL backend requires its own `ImageQuery` enum.\r\n///\r\n/// It is used inside `WrappedImageQuery` and should be unique per ImageQuery function.\r\n/// IR version can't be unique per function, because it's store mipmap level as an expression.\r\n///\r\n/// For example:\r\n/// ```wgsl\r\n/// let dim_cube_array_lod = textureDimensions(image_cube_array, 1);\r\n/// let dim_cube_array_lod2 = textureDimensions(image_cube_array, 1);\r\n/// ```\r\n///\r\n/// ```ir\r\n/// ImageQuery {\r\n///  image: [1],\r\n///  query: Size {\r\n///      level: Some(\r\n///          [1],\r\n///      ),\r\n///  },\r\n/// },\r\n/// ImageQuery {\r\n///  image: [1],\r\n///  query: Size {\r\n///      level: Some(\r\n///          [2],\r\n///      ),\r\n///  },\r\n/// },\r\n/// ```\r\n///\r\n/// HLSL should generate only 1 function for this case.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\npub(super) enum ImageQuery {\r\n    Size,\r\n    SizeLevel,\r\n    NumLevels,\r\n    NumLayers,\r\n    NumSamples,\r\n}\r\n\r\nimpl From<crate::ImageQuery> for ImageQuery {\r\n    fn from(q: crate::ImageQuery) -> Self {\r\n        use crate::ImageQuery as Iq;\r\n        match q {\r\n            Iq::Size { level: Some(_) } => ImageQuery::SizeLevel,\r\n            Iq::Size { level: None } => ImageQuery::Size,\r\n            Iq::NumLevels => ImageQuery::NumLevels,\r\n            Iq::NumLayers => ImageQuery::NumLayers,\r\n            Iq::NumSamples => ImageQuery::NumSamples,\r\n        }\r\n    }\r\n}\r\n\r\nimpl<'a, W: Write> super::Writer<'a, W> {\r\n    pub(super) fn write_image_type(\r\n        &mut self,\r\n        dim: crate::ImageDimension,\r\n        arrayed: bool,\r\n        class: crate::ImageClass,\r\n    ) -> BackendResult {\r\n        let access_str = match class {\r\n            crate::ImageClass::Storage { .. } => \"RW\",\r\n            _ => \"\",\r\n        };\r\n        let dim_str = dim.to_hlsl_str();\r\n        let arrayed_str = if arrayed { \"Array\" } else { \"\" };\r\n        write!(self.out, \"{}Texture{}{}\", access_str, dim_str, arrayed_str)?;\r\n        match class {\r\n            crate::ImageClass::Depth { multi } => {\r\n                let multi_str = if multi { \"MS\" } else { \"\" };\r\n                write!(self.out, \"{}<float>\", multi_str)?\r\n            }\r\n            crate::ImageClass::Sampled { kind, multi } => {\r\n                let multi_str = if multi { \"MS\" } else { \"\" };\r\n                let scalar_kind_str = kind.to_hlsl_str(4)?;\r\n                write!(self.out, \"{}<{}4>\", multi_str, scalar_kind_str)?\r\n            }\r\n            crate::ImageClass::Storage { format, .. } => {\r\n                let storage_format_str = format.to_hlsl_str();\r\n                write!(self.out, \"<{}>\", storage_format_str)?\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_array_length_function_name(\r\n        &mut self,\r\n        query: WrappedArrayLength,\r\n    ) -> BackendResult {\r\n        let access_str = if query.writable { \"RW\" } else { \"\" };\r\n        write!(self.out, \"NagaBufferLength{}\", access_str,)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write wrapped function for `Expression::ArrayLength`\r\n    ///\r\n    /// <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sm5-object-rwbyteaddressbuffer-getdimensions>\r\n    pub(super) fn write_wrapped_array_length_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        wal: WrappedArrayLength,\r\n        expr_handle: Handle<crate::Expression>,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        const ARGUMENT_VARIABLE_NAME: &str = \"buffer\";\r\n        const RETURN_VARIABLE_NAME: &str = \"ret\";\r\n\r\n        // Write function return type and name\r\n        let ret_ty = func_ctx.info[expr_handle].ty.inner_with(&module.types);\r\n        self.write_value_type(module, ret_ty)?;\r\n        write!(self.out, \" \")?;\r\n        self.write_wrapped_array_length_function_name(wal)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n        let access_str = if wal.writable { \"RW\" } else { \"\" };\r\n        writeln!(\r\n            self.out,\r\n            \"{}ByteAddressBuffer {})\",\r\n            access_str, ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n        // Write function body\r\n        writeln!(self.out, \"{{\")?;\r\n\r\n        // Write `GetDimensions` function.\r\n        writeln!(self.out, \"{}uint {};\", INDENT, RETURN_VARIABLE_NAME)?;\r\n        writeln!(\r\n            self.out,\r\n            \"{}{}.GetDimensions({});\",\r\n            INDENT, ARGUMENT_VARIABLE_NAME, RETURN_VARIABLE_NAME\r\n        )?;\r\n\r\n        // Write return value\r\n        writeln!(self.out, \"{}return {};\", INDENT, RETURN_VARIABLE_NAME)?;\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_image_query_function_name(\r\n        &mut self,\r\n        query: WrappedImageQuery,\r\n    ) -> BackendResult {\r\n        let dim_str = query.dim.to_hlsl_str();\r\n        let class_str = match query.class {\r\n            crate::ImageClass::Sampled { multi: true, .. } => \"MS\",\r\n            crate::ImageClass::Depth { multi: true } => \"DepthMS\",\r\n            crate::ImageClass::Depth { multi: false } => \"Depth\",\r\n            crate::ImageClass::Sampled { multi: false, .. } => \"\",\r\n            crate::ImageClass::Storage { .. } => \"RW\",\r\n        };\r\n        let arrayed_str = if query.arrayed { \"Array\" } else { \"\" };\r\n        let query_str = match query.query {\r\n            ImageQuery::Size => \"Dimensions\",\r\n            ImageQuery::SizeLevel => \"MipDimensions\",\r\n            ImageQuery::NumLevels => \"NumLevels\",\r\n            ImageQuery::NumLayers => \"NumLayers\",\r\n            ImageQuery::NumSamples => \"NumSamples\",\r\n        };\r\n\r\n        write!(\r\n            self.out,\r\n            \"Naga{}{}{}{}\",\r\n            class_str, query_str, dim_str, arrayed_str\r\n        )?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write wrapped function for `Expression::ImageQuery`\r\n    ///\r\n    /// <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-getdimensions>\r\n    pub(super) fn write_wrapped_image_query_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        wiq: WrappedImageQuery,\r\n        expr_handle: Handle<crate::Expression>,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        use crate::{\r\n            back::{COMPONENTS, INDENT},\r\n            ImageDimension as IDim,\r\n        };\r\n\r\n        const ARGUMENT_VARIABLE_NAME: &str = \"tex\";\r\n        const RETURN_VARIABLE_NAME: &str = \"ret\";\r\n        const MIP_LEVEL_PARAM: &str = \"mip_level\";\r\n\r\n        // Write function return type and name\r\n        let ret_ty = func_ctx.info[expr_handle].ty.inner_with(&module.types);\r\n        self.write_value_type(module, ret_ty)?;\r\n        write!(self.out, \" \")?;\r\n        self.write_wrapped_image_query_function_name(wiq)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n        // Texture always first parameter\r\n        self.write_image_type(wiq.dim, wiq.arrayed, wiq.class)?;\r\n        write!(self.out, \" {}\", ARGUMENT_VARIABLE_NAME)?;\r\n        // Mipmap is a second parameter if exists\r\n        if let ImageQuery::SizeLevel = wiq.query {\r\n            write!(self.out, \", uint {}\", MIP_LEVEL_PARAM)?;\r\n        }\r\n        writeln!(self.out, \")\")?;\r\n\r\n        // Write function body\r\n        writeln!(self.out, \"{{\")?;\r\n\r\n        let array_coords = if wiq.arrayed { 1 } else { 0 };\r\n        // extra parameter is the mip level count or the sample count\r\n        let extra_coords = match wiq.class {\r\n            crate::ImageClass::Storage { .. } => 0,\r\n            crate::ImageClass::Sampled { .. } | crate::ImageClass::Depth { .. } => 1,\r\n        };\r\n\r\n        // GetDimensions Overloaded Methods\r\n        // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-getdimensions#overloaded-methods\r\n        let (ret_swizzle, number_of_params) = match wiq.query {\r\n            ImageQuery::Size | ImageQuery::SizeLevel => {\r\n                let ret = match wiq.dim {\r\n                    IDim::D1 => \"x\",\r\n                    IDim::D2 => \"xy\",\r\n                    IDim::D3 => \"xyz\",\r\n                    IDim::Cube => \"xy\",\r\n                };\r\n                (ret, ret.len() + array_coords + extra_coords)\r\n            }\r\n            ImageQuery::NumLevels | ImageQuery::NumSamples | ImageQuery::NumLayers => {\r\n                if wiq.arrayed || wiq.dim == IDim::D3 {\r\n                    (\"w\", 4)\r\n                } else {\r\n                    (\"z\", 3)\r\n                }\r\n            }\r\n        };\r\n\r\n        // Write `GetDimensions` function.\r\n        writeln!(self.out, \"{}uint4 {};\", INDENT, RETURN_VARIABLE_NAME)?;\r\n        write!(\r\n            self.out,\r\n            \"{}{}.GetDimensions(\",\r\n            INDENT, ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n        match wiq.query {\r\n            ImageQuery::SizeLevel => {\r\n                write!(self.out, \"{}, \", MIP_LEVEL_PARAM)?;\r\n            }\r\n            _ => match wiq.class {\r\n                crate::ImageClass::Sampled { multi: true, .. }\r\n                | crate::ImageClass::Depth { multi: true }\r\n                | crate::ImageClass::Storage { .. } => {}\r\n                _ => {\r\n                    // Write zero mipmap level for supported types\r\n                    write!(self.out, \"0, \")?;\r\n                }\r\n            },\r\n        }\r\n\r\n        for component in COMPONENTS[..number_of_params - 1].iter() {\r\n            write!(self.out, \"{}.{}, \", RETURN_VARIABLE_NAME, component)?;\r\n        }\r\n\r\n        // write last parameter without comma and space for last parameter\r\n        write!(\r\n            self.out,\r\n            \"{}.{}\",\r\n            RETURN_VARIABLE_NAME,\r\n            COMPONENTS[number_of_params - 1]\r\n        )?;\r\n\r\n        writeln!(self.out, \");\")?;\r\n\r\n        // Write return value\r\n        writeln!(\r\n            self.out,\r\n            \"{}return {}.{};\",\r\n            INDENT, RETURN_VARIABLE_NAME, ret_swizzle\r\n        )?;\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_constructor_function_name(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        constructor: WrappedConstructor,\r\n    ) -> BackendResult {\r\n        let name = module.types[constructor.ty].inner.hlsl_type_id(\r\n            constructor.ty,\r\n            &module.types,\r\n            &module.constants,\r\n            &self.names,\r\n        )?;\r\n        write!(self.out, \"Construct{}\", name)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write wrapped function for `Expression::Compose` for structures.\r\n    pub(super) fn write_wrapped_constructor_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        constructor: WrappedConstructor,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        const ARGUMENT_VARIABLE_NAME: &str = \"arg\";\r\n        const RETURN_VARIABLE_NAME: &str = \"ret\";\r\n\r\n        // Write function return type and name\r\n        if let crate::TypeInner::Array { base, size, .. } = module.types[constructor.ty].inner {\r\n            write!(self.out, \"typedef \")?;\r\n            self.write_type(module, constructor.ty)?;\r\n            write!(self.out, \" ret_\")?;\r\n            self.write_wrapped_constructor_function_name(module, constructor)?;\r\n            self.write_array_size(module, base, size)?;\r\n            writeln!(self.out, \";\")?;\r\n\r\n            write!(self.out, \"ret_\")?;\r\n            self.write_wrapped_constructor_function_name(module, constructor)?;\r\n        } else {\r\n            self.write_type(module, constructor.ty)?;\r\n        }\r\n        write!(self.out, \" \")?;\r\n        self.write_wrapped_constructor_function_name(module, constructor)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n\r\n        let mut write_arg = |i, ty| -> BackendResult {\r\n            if i != 0 {\r\n                write!(self.out, \", \")?;\r\n            }\r\n            self.write_type(module, ty)?;\r\n            write!(self.out, \" {}{}\", ARGUMENT_VARIABLE_NAME, i)?;\r\n            if let crate::TypeInner::Array { base, size, .. } = module.types[ty].inner {\r\n                self.write_array_size(module, base, size)?;\r\n            }\r\n            Ok(())\r\n        };\r\n\r\n        match module.types[constructor.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                for (i, member) in members.iter().enumerate() {\r\n                    write_arg(i, member.ty)?;\r\n                }\r\n            }\r\n            crate::TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(size),\r\n                ..\r\n            } => {\r\n                let count = module.constants[size].to_array_length().unwrap();\r\n                for i in 0..count as usize {\r\n                    write_arg(i, base)?;\r\n                }\r\n            }\r\n            _ => unreachable!(),\r\n        };\r\n\r\n        write!(self.out, \")\")?;\r\n\r\n        // Write function body\r\n        writeln!(self.out, \" {{\")?;\r\n\r\n        match module.types[constructor.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                let struct_name = &self.names[&NameKey::Type(constructor.ty)];\r\n                writeln!(\r\n                    self.out,\r\n                    \"{}{} {} = ({})0;\",\r\n                    INDENT, struct_name, RETURN_VARIABLE_NAME, struct_name\r\n                )?;\r\n                for (i, member) in members.iter().enumerate() {\r\n                    let field_name = &self.names[&NameKey::StructMember(constructor.ty, i as u32)];\r\n\r\n                    match module.types[member.ty].inner {\r\n                        crate::TypeInner::Matrix {\r\n                            columns,\r\n                            rows: crate::VectorSize::Bi,\r\n                            ..\r\n                        } if member.binding.is_none() => {\r\n                            for j in 0..columns as u8 {\r\n                                writeln!(\r\n                                    self.out,\r\n                                    \"{}{}.{}_{} = {}{}[{}];\",\r\n                                    INDENT,\r\n                                    RETURN_VARIABLE_NAME,\r\n                                    field_name,\r\n                                    j,\r\n                                    ARGUMENT_VARIABLE_NAME,\r\n                                    i,\r\n                                    j\r\n                                )?;\r\n                            }\r\n                        }\r\n                        ref other => {\r\n                            // We cast arrays of native HLSL `floatCx2`s to arrays of `matCx2`s\r\n                            // (where the inner matrix is represented by a struct with C `float2` members).\r\n                            // See the module-level block comment in mod.rs for details.\r\n                            if let Some(super::writer::MatrixType {\r\n                                columns,\r\n                                rows: crate::VectorSize::Bi,\r\n                                width: 4,\r\n                            }) = super::writer::get_inner_matrix_data(module, member.ty)\r\n                            {\r\n                                write!(\r\n                                    self.out,\r\n                                    \"{}{}.{} = (__mat{}x2\",\r\n                                    INDENT, RETURN_VARIABLE_NAME, field_name, columns as u8\r\n                                )?;\r\n                                if let crate::TypeInner::Array { base, size, .. } = *other {\r\n                                    self.write_array_size(module, base, size)?;\r\n                                }\r\n                                writeln!(self.out, \"){}{};\", ARGUMENT_VARIABLE_NAME, i,)?;\r\n                            } else {\r\n                                writeln!(\r\n                                    self.out,\r\n                                    \"{}{}.{} = {}{};\",\r\n                                    INDENT,\r\n                                    RETURN_VARIABLE_NAME,\r\n                                    field_name,\r\n                                    ARGUMENT_VARIABLE_NAME,\r\n                                    i,\r\n                                )?;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            crate::TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(size),\r\n                ..\r\n            } => {\r\n                write!(self.out, \"{}\", INDENT)?;\r\n                self.write_type(module, base)?;\r\n                write!(self.out, \" {}\", RETURN_VARIABLE_NAME)?;\r\n                self.write_array_size(module, base, crate::ArraySize::Constant(size))?;\r\n                write!(self.out, \" = {{ \")?;\r\n                let count = module.constants[size].to_array_length().unwrap();\r\n                for i in 0..count {\r\n                    if i != 0 {\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                    write!(self.out, \"{}{}\", ARGUMENT_VARIABLE_NAME, i)?;\r\n                }\r\n                writeln!(self.out, \" }};\",)?;\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n\r\n        // Write return value\r\n        writeln!(self.out, \"{}return {};\", INDENT, RETURN_VARIABLE_NAME)?;\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_struct_matrix_get_function_name(\r\n        &mut self,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        let name = &self.names[&NameKey::Type(access.ty)];\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n        write!(self.out, \"GetMat{}On{}\", field_name, name)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Writes a function used to get a matCx2 from within a structure.\r\n    pub(super) fn write_wrapped_struct_matrix_get_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        const STRUCT_ARGUMENT_VARIABLE_NAME: &str = \"obj\";\r\n\r\n        // Write function return type and name\r\n        let member = match module.types[access.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize],\r\n            _ => unreachable!(),\r\n        };\r\n        let ret_ty = &module.types[member.ty].inner;\r\n        self.write_value_type(module, ret_ty)?;\r\n        write!(self.out, \" \")?;\r\n        self.write_wrapped_struct_matrix_get_function_name(access)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n        let struct_name = &self.names[&NameKey::Type(access.ty)];\r\n        write!(\r\n            self.out,\r\n            \"{} {}\",\r\n            struct_name, STRUCT_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n\r\n        // Write function body\r\n        writeln!(self.out, \") {{\")?;\r\n\r\n        // Write return value\r\n        write!(self.out, \"{}return \", INDENT)?;\r\n        self.write_value_type(module, ret_ty)?;\r\n        write!(self.out, \"(\")?;\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n        match module.types[member.ty].inner {\r\n            crate::TypeInner::Matrix { columns, .. } => {\r\n                for i in 0..columns as u8 {\r\n                    if i != 0 {\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                    write!(\r\n                        self.out,\r\n                        \"{}.{}_{}\",\r\n                        STRUCT_ARGUMENT_VARIABLE_NAME, field_name, i\r\n                    )?;\r\n                }\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n        writeln!(self.out, \");\")?;\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_struct_matrix_set_function_name(\r\n        &mut self,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        let name = &self.names[&NameKey::Type(access.ty)];\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n        write!(self.out, \"SetMat{}On{}\", field_name, name)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Writes a function used to set a matCx2 from within a structure.\r\n    pub(super) fn write_wrapped_struct_matrix_set_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        const STRUCT_ARGUMENT_VARIABLE_NAME: &str = \"obj\";\r\n        const MATRIX_ARGUMENT_VARIABLE_NAME: &str = \"mat\";\r\n\r\n        // Write function return type and name\r\n        write!(self.out, \"void \")?;\r\n        self.write_wrapped_struct_matrix_set_function_name(access)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n        let struct_name = &self.names[&NameKey::Type(access.ty)];\r\n        write!(\r\n            self.out,\r\n            \"{} {}, \",\r\n            struct_name, STRUCT_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n        let member = match module.types[access.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize],\r\n            _ => unreachable!(),\r\n        };\r\n        self.write_type(module, member.ty)?;\r\n        write!(self.out, \" {}\", MATRIX_ARGUMENT_VARIABLE_NAME)?;\r\n        // Write function body\r\n        writeln!(self.out, \") {{\")?;\r\n\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n\r\n        match module.types[member.ty].inner {\r\n            crate::TypeInner::Matrix { columns, .. } => {\r\n                for i in 0..columns as u8 {\r\n                    writeln!(\r\n                        self.out,\r\n                        \"{}{}.{}_{} = {}[{}];\",\r\n                        INDENT,\r\n                        STRUCT_ARGUMENT_VARIABLE_NAME,\r\n                        field_name,\r\n                        i,\r\n                        MATRIX_ARGUMENT_VARIABLE_NAME,\r\n                        i\r\n                    )?;\r\n                }\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_struct_matrix_set_vec_function_name(\r\n        &mut self,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        let name = &self.names[&NameKey::Type(access.ty)];\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n        write!(self.out, \"SetMatVec{}On{}\", field_name, name)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Writes a function used to set a vec2 on a matCx2 from within a structure.\r\n    pub(super) fn write_wrapped_struct_matrix_set_vec_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        const STRUCT_ARGUMENT_VARIABLE_NAME: &str = \"obj\";\r\n        const VECTOR_ARGUMENT_VARIABLE_NAME: &str = \"vec\";\r\n        const MATRIX_INDEX_ARGUMENT_VARIABLE_NAME: &str = \"mat_idx\";\r\n\r\n        // Write function return type and name\r\n        write!(self.out, \"void \")?;\r\n        self.write_wrapped_struct_matrix_set_vec_function_name(access)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n        let struct_name = &self.names[&NameKey::Type(access.ty)];\r\n        write!(\r\n            self.out,\r\n            \"{} {}, \",\r\n            struct_name, STRUCT_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n        let member = match module.types[access.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize],\r\n            _ => unreachable!(),\r\n        };\r\n        let vec_ty = match module.types[member.ty].inner {\r\n            crate::TypeInner::Matrix { rows, width, .. } => crate::TypeInner::Vector {\r\n                size: rows,\r\n                kind: crate::ScalarKind::Float,\r\n                width,\r\n            },\r\n            _ => unreachable!(),\r\n        };\r\n        self.write_value_type(module, &vec_ty)?;\r\n        write!(\r\n            self.out,\r\n            \" {}, uint {}\",\r\n            VECTOR_ARGUMENT_VARIABLE_NAME, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n\r\n        // Write function body\r\n        writeln!(self.out, \") {{\")?;\r\n\r\n        writeln!(\r\n            self.out,\r\n            \"{}switch({}) {{\",\r\n            INDENT, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n\r\n        match module.types[member.ty].inner {\r\n            crate::TypeInner::Matrix { columns, .. } => {\r\n                for i in 0..columns as u8 {\r\n                    writeln!(\r\n                        self.out,\r\n                        \"{}case {}: {{ {}.{}_{} = {}; break; }}\",\r\n                        INDENT,\r\n                        i,\r\n                        STRUCT_ARGUMENT_VARIABLE_NAME,\r\n                        field_name,\r\n                        i,\r\n                        VECTOR_ARGUMENT_VARIABLE_NAME\r\n                    )?;\r\n                }\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n\r\n        writeln!(self.out, \"{}}}\", INDENT)?;\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_struct_matrix_set_scalar_function_name(\r\n        &mut self,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        let name = &self.names[&NameKey::Type(access.ty)];\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n        write!(self.out, \"SetMatScalar{}On{}\", field_name, name)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Writes a function used to set a float on a matCx2 from within a structure.\r\n    pub(super) fn write_wrapped_struct_matrix_set_scalar_function(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        access: WrappedStructMatrixAccess,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        const STRUCT_ARGUMENT_VARIABLE_NAME: &str = \"obj\";\r\n        const SCALAR_ARGUMENT_VARIABLE_NAME: &str = \"scalar\";\r\n        const MATRIX_INDEX_ARGUMENT_VARIABLE_NAME: &str = \"mat_idx\";\r\n        const VECTOR_INDEX_ARGUMENT_VARIABLE_NAME: &str = \"vec_idx\";\r\n\r\n        // Write function return type and name\r\n        write!(self.out, \"void \")?;\r\n        self.write_wrapped_struct_matrix_set_scalar_function_name(access)?;\r\n\r\n        // Write function parameters\r\n        write!(self.out, \"(\")?;\r\n        let struct_name = &self.names[&NameKey::Type(access.ty)];\r\n        write!(\r\n            self.out,\r\n            \"{} {}, \",\r\n            struct_name, STRUCT_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n        let member = match module.types[access.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize],\r\n            _ => unreachable!(),\r\n        };\r\n        let scalar_ty = match module.types[member.ty].inner {\r\n            crate::TypeInner::Matrix { width, .. } => crate::TypeInner::Scalar {\r\n                kind: crate::ScalarKind::Float,\r\n                width,\r\n            },\r\n            _ => unreachable!(),\r\n        };\r\n        self.write_value_type(module, &scalar_ty)?;\r\n        write!(\r\n            self.out,\r\n            \" {}, uint {}, uint {}\",\r\n            SCALAR_ARGUMENT_VARIABLE_NAME,\r\n            MATRIX_INDEX_ARGUMENT_VARIABLE_NAME,\r\n            VECTOR_INDEX_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n\r\n        // Write function body\r\n        writeln!(self.out, \") {{\")?;\r\n\r\n        writeln!(\r\n            self.out,\r\n            \"{}switch({}) {{\",\r\n            INDENT, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME\r\n        )?;\r\n\r\n        let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)];\r\n\r\n        match module.types[member.ty].inner {\r\n            crate::TypeInner::Matrix { columns, .. } => {\r\n                for i in 0..columns as u8 {\r\n                    writeln!(\r\n                        self.out,\r\n                        \"{}case {}: {{ {}.{}_{}[{}] = {}; break; }}\",\r\n                        INDENT,\r\n                        i,\r\n                        STRUCT_ARGUMENT_VARIABLE_NAME,\r\n                        field_name,\r\n                        i,\r\n                        VECTOR_INDEX_ARGUMENT_VARIABLE_NAME,\r\n                        SCALAR_ARGUMENT_VARIABLE_NAME\r\n                    )?;\r\n                }\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n\r\n        writeln!(self.out, \"{}}}\", INDENT)?;\r\n\r\n        // End of function body\r\n        writeln!(self.out, \"}}\")?;\r\n        // Write extra new line\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write wrapped function for `Expression::ImageQuery` and `Expression::ArrayLength`\r\n    ///\r\n    /// <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-getdimensions>\r\n    pub(super) fn write_wrapped_functions(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        for (handle, _) in func_ctx.expressions.iter() {\r\n            match func_ctx.expressions[handle] {\r\n                crate::Expression::ArrayLength(expr) => {\r\n                    let global_expr = match func_ctx.expressions[expr] {\r\n                        crate::Expression::GlobalVariable(_) => expr,\r\n                        crate::Expression::AccessIndex { base, index: _ } => base,\r\n                        ref other => unreachable!(\"Array length of {:?}\", other),\r\n                    };\r\n                    let global_var = match func_ctx.expressions[global_expr] {\r\n                        crate::Expression::GlobalVariable(var_handle) => {\r\n                            &module.global_variables[var_handle]\r\n                        }\r\n                        ref other => unreachable!(\"Array length of base {:?}\", other),\r\n                    };\r\n                    let storage_access = match global_var.space {\r\n                        crate::AddressSpace::Storage { access } => access,\r\n                        _ => crate::StorageAccess::default(),\r\n                    };\r\n                    let wal = WrappedArrayLength {\r\n                        writable: storage_access.contains(crate::StorageAccess::STORE),\r\n                    };\r\n\r\n                    if !self.wrapped.array_lengths.contains(&wal) {\r\n                        self.write_wrapped_array_length_function(module, wal, handle, func_ctx)?;\r\n                        self.wrapped.array_lengths.insert(wal);\r\n                    }\r\n                }\r\n                crate::Expression::ImageQuery { image, query } => {\r\n                    let wiq = match *func_ctx.info[image].ty.inner_with(&module.types) {\r\n                        crate::TypeInner::Image {\r\n                            dim,\r\n                            arrayed,\r\n                            class,\r\n                        } => WrappedImageQuery {\r\n                            dim,\r\n                            arrayed,\r\n                            class,\r\n                            query: query.into(),\r\n                        },\r\n                        _ => unreachable!(\"we only query images\"),\r\n                    };\r\n\r\n                    if !self.wrapped.image_queries.contains(&wiq) {\r\n                        self.write_wrapped_image_query_function(module, wiq, handle, func_ctx)?;\r\n                        self.wrapped.image_queries.insert(wiq);\r\n                    }\r\n                }\r\n                // Write `WrappedConstructor` for structs that are loaded from `AddressSpace::Storage`\r\n                // since they will later be used by the fn `write_storage_load`\r\n                crate::Expression::Load { pointer } => {\r\n                    let pointer_space = func_ctx.info[pointer]\r\n                        .ty\r\n                        .inner_with(&module.types)\r\n                        .pointer_space();\r\n\r\n                    if let Some(crate::AddressSpace::Storage { .. }) = pointer_space {\r\n                        if let Some(ty) = func_ctx.info[handle].ty.handle() {\r\n                            write_wrapped_constructor(self, ty, module, func_ctx)?;\r\n                        }\r\n                    }\r\n\r\n                    fn write_wrapped_constructor<W: Write>(\r\n                        writer: &mut super::Writer<'_, W>,\r\n                        ty: Handle<crate::Type>,\r\n                        module: &crate::Module,\r\n                        func_ctx: &FunctionCtx,\r\n                    ) -> BackendResult {\r\n                        match module.types[ty].inner {\r\n                            crate::TypeInner::Struct { ref members, .. } => {\r\n                                for member in members {\r\n                                    write_wrapped_constructor(writer, member.ty, module, func_ctx)?;\r\n                                }\r\n\r\n                                let constructor = WrappedConstructor { ty };\r\n                                if !writer.wrapped.constructors.contains(&constructor) {\r\n                                    writer\r\n                                        .write_wrapped_constructor_function(module, constructor)?;\r\n                                    writer.wrapped.constructors.insert(constructor);\r\n                                }\r\n                            }\r\n                            crate::TypeInner::Array { base, .. } => {\r\n                                write_wrapped_constructor(writer, base, module, func_ctx)?;\r\n                            }\r\n                            _ => {}\r\n                        };\r\n\r\n                        Ok(())\r\n                    }\r\n                }\r\n                crate::Expression::Compose { ty, components: _ } => {\r\n                    let constructor = match module.types[ty].inner {\r\n                        crate::TypeInner::Struct { .. } | crate::TypeInner::Array { .. } => {\r\n                            WrappedConstructor { ty }\r\n                        }\r\n                        _ => continue,\r\n                    };\r\n                    if !self.wrapped.constructors.contains(&constructor) {\r\n                        self.write_wrapped_constructor_function(module, constructor)?;\r\n                        self.wrapped.constructors.insert(constructor);\r\n                    }\r\n                }\r\n                // We treat matrices of the form `matCx2` as a sequence of C `vec2`s\r\n                // (see top level module docs for details).\r\n                //\r\n                // The functions injected here are required to get the matrix accesses working.\r\n                crate::Expression::AccessIndex { base, index } => {\r\n                    let base_ty_res = &func_ctx.info[base].ty;\r\n                    let mut resolved = base_ty_res.inner_with(&module.types);\r\n                    let base_ty_handle = match *resolved {\r\n                        crate::TypeInner::Pointer { base, .. } => {\r\n                            resolved = &module.types[base].inner;\r\n                            Some(base)\r\n                        }\r\n                        _ => base_ty_res.handle(),\r\n                    };\r\n                    if let crate::TypeInner::Struct { ref members, .. } = *resolved {\r\n                        let member = &members[index as usize];\r\n\r\n                        match module.types[member.ty].inner {\r\n                            crate::TypeInner::Matrix {\r\n                                rows: crate::VectorSize::Bi,\r\n                                ..\r\n                            } if member.binding.is_none() => {\r\n                                let ty = base_ty_handle.unwrap();\r\n                                let access = WrappedStructMatrixAccess { ty, index };\r\n\r\n                                if !self.wrapped.struct_matrix_access.contains(&access) {\r\n                                    self.write_wrapped_struct_matrix_get_function(module, access)?;\r\n                                    self.write_wrapped_struct_matrix_set_function(module, access)?;\r\n                                    self.write_wrapped_struct_matrix_set_vec_function(\r\n                                        module, access,\r\n                                    )?;\r\n                                    self.write_wrapped_struct_matrix_set_scalar_function(\r\n                                        module, access,\r\n                                    )?;\r\n                                    self.wrapped.struct_matrix_access.insert(access);\r\n                                }\r\n                            }\r\n                            _ => {}\r\n                        }\r\n                    }\r\n                }\r\n                _ => {}\r\n            };\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_wrapped_constructor_function_for_constant(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        constant: &crate::Constant,\r\n    ) -> BackendResult {\r\n        if let crate::ConstantInner::Composite { ty, ref components } = constant.inner {\r\n            match module.types[ty].inner {\r\n                crate::TypeInner::Struct { .. } | crate::TypeInner::Array { .. } => {\r\n                    let constructor = WrappedConstructor { ty };\r\n                    if !self.wrapped.constructors.contains(&constructor) {\r\n                        self.write_wrapped_constructor_function(module, constructor)?;\r\n                        self.wrapped.constructors.insert(constructor);\r\n                    }\r\n                }\r\n                _ => {}\r\n            }\r\n            for constant in components {\r\n                self.write_wrapped_constructor_function_for_constant(\r\n                    module,\r\n                    &module.constants[*constant],\r\n                )?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_texture_coordinates(\r\n        &mut self,\r\n        kind: &str,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        mip_level: Option<Handle<crate::Expression>>,\r\n        module: &crate::Module,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        // HLSL expects the array index to be merged with the coordinate\r\n        let extra = array_index.is_some() as usize + (mip_level.is_some()) as usize;\r\n        if extra == 0 {\r\n            self.write_expr(module, coordinate, func_ctx)?;\r\n        } else {\r\n            let num_coords = match *func_ctx.info[coordinate].ty.inner_with(&module.types) {\r\n                crate::TypeInner::Scalar { .. } => 1,\r\n                crate::TypeInner::Vector { size, .. } => size as usize,\r\n                _ => unreachable!(),\r\n            };\r\n            write!(self.out, \"{}{}(\", kind, num_coords + extra)?;\r\n            self.write_expr(module, coordinate, func_ctx)?;\r\n            if let Some(expr) = array_index {\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n            }\r\n            if let Some(expr) = mip_level {\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n            }\r\n            write!(self.out, \")\")?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_mat_cx2_typedef_and_functions(\r\n        &mut self,\r\n        WrappedMatCx2 { columns }: WrappedMatCx2,\r\n    ) -> BackendResult {\r\n        use crate::back::INDENT;\r\n\r\n        // typedef\r\n        write!(self.out, \"typedef struct {{ \")?;\r\n        for i in 0..columns as u8 {\r\n            write!(self.out, \"float2 _{}; \", i)?;\r\n        }\r\n        writeln!(self.out, \"}} __mat{}x2;\", columns as u8)?;\r\n\r\n        // __get_col_of_mat\r\n        writeln!(\r\n            self.out,\r\n            \"float2 __get_col_of_mat{}x2(__mat{}x2 mat, uint idx) {{\",\r\n            columns as u8, columns as u8\r\n        )?;\r\n        writeln!(self.out, \"{}switch(idx) {{\", INDENT)?;\r\n        for i in 0..columns as u8 {\r\n            writeln!(self.out, \"{}case {}: {{ return mat._{}; }}\", INDENT, i, i)?;\r\n        }\r\n        writeln!(self.out, \"{}default: {{ return (float2)0; }}\", INDENT)?;\r\n        writeln!(self.out, \"{}}}\", INDENT)?;\r\n        writeln!(self.out, \"}}\")?;\r\n\r\n        // __set_col_of_mat\r\n        writeln!(\r\n            self.out,\r\n            \"void __set_col_of_mat{}x2(__mat{}x2 mat, uint idx, float2 value) {{\",\r\n            columns as u8, columns as u8\r\n        )?;\r\n        writeln!(self.out, \"{}switch(idx) {{\", INDENT)?;\r\n        for i in 0..columns as u8 {\r\n            writeln!(\r\n                self.out,\r\n                \"{}case {}: {{ mat._{} = value; break; }}\",\r\n                INDENT, i, i\r\n            )?;\r\n        }\r\n        writeln!(self.out, \"{}}}\", INDENT)?;\r\n        writeln!(self.out, \"}}\")?;\r\n\r\n        // __set_el_of_mat\r\n        writeln!(\r\n            self.out,\r\n            \"void __set_el_of_mat{}x2(__mat{}x2 mat, uint idx, uint vec_idx, float value) {{\",\r\n            columns as u8, columns as u8\r\n        )?;\r\n        writeln!(self.out, \"{}switch(idx) {{\", INDENT)?;\r\n        for i in 0..columns as u8 {\r\n            writeln!(\r\n                self.out,\r\n                \"{}case {}: {{ mat._{}[vec_idx] = value; break; }}\",\r\n                INDENT, i, i\r\n            )?;\r\n        }\r\n        writeln!(self.out, \"{}}}\", INDENT)?;\r\n        writeln!(self.out, \"}}\")?;\r\n\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_all_mat_cx2_typedefs_and_functions(\r\n        &mut self,\r\n        module: &crate::Module,\r\n    ) -> BackendResult {\r\n        for (handle, _) in module.global_variables.iter() {\r\n            let global = &module.global_variables[handle];\r\n\r\n            if global.space == crate::AddressSpace::Uniform {\r\n                if let Some(super::writer::MatrixType {\r\n                    columns,\r\n                    rows: crate::VectorSize::Bi,\r\n                    width: 4,\r\n                }) = super::writer::get_inner_matrix_data(module, global.ty)\r\n                {\r\n                    let entry = WrappedMatCx2 { columns };\r\n                    if !self.wrapped.mat_cx2s.contains(&entry) {\r\n                        self.write_mat_cx2_typedef_and_functions(entry)?;\r\n                        self.wrapped.mat_cx2s.insert(entry);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        for (_, ty) in module.types.iter() {\r\n            if let crate::TypeInner::Struct { ref members, .. } = ty.inner {\r\n                for member in members.iter() {\r\n                    if let crate::TypeInner::Array { .. } = module.types[member.ty].inner {\r\n                        if let Some(super::writer::MatrixType {\r\n                            columns,\r\n                            rows: crate::VectorSize::Bi,\r\n                            width: 4,\r\n                        }) = super::writer::get_inner_matrix_data(module, member.ty)\r\n                        {\r\n                            let entry = WrappedMatCx2 { columns };\r\n                            if !self.wrapped.mat_cx2s.contains(&entry) {\r\n                                self.write_mat_cx2_typedef_and_functions(entry)?;\r\n                                self.wrapped.mat_cx2s.insert(entry);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/hlsl/keywords.rs",
    "content": "/*!\r\nHLSL Reserved Words\r\n- <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords>\r\n- <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-reserved-words>\r\n*/\r\n\r\npub const RESERVED: &[&str] = &[\r\n    \"AppendStructuredBuffer\",\r\n    \"asm\",\r\n    \"asm_fragment\",\r\n    \"BlendState\",\r\n    \"bool\",\r\n    \"break\",\r\n    \"Buffer\",\r\n    \"ByteAddressBuffer\",\r\n    \"case\",\r\n    \"cbuffer\",\r\n    \"centroid\",\r\n    \"class\",\r\n    \"column_major\",\r\n    \"compile\",\r\n    \"compile_fragment\",\r\n    \"CompileShader\",\r\n    \"const\",\r\n    \"continue\",\r\n    \"ComputeShader\",\r\n    \"ConsumeStructuredBuffer\",\r\n    \"default\",\r\n    \"DepthStencilState\",\r\n    \"DepthStencilView\",\r\n    \"discard\",\r\n    \"do\",\r\n    \"double\",\r\n    \"DomainShader\",\r\n    \"dword\",\r\n    \"else\",\r\n    \"export\",\r\n    \"extern\",\r\n    \"false\",\r\n    \"float\",\r\n    \"for\",\r\n    \"fxgroup\",\r\n    \"GeometryShader\",\r\n    \"groupshared\",\r\n    \"half\",\r\n    \"Hullshader\",\r\n    \"if\",\r\n    \"in\",\r\n    \"inline\",\r\n    \"inout\",\r\n    \"InputPatch\",\r\n    \"int\",\r\n    \"interface\",\r\n    \"line\",\r\n    \"lineadj\",\r\n    \"linear\",\r\n    \"LineStream\",\r\n    \"matrix\",\r\n    \"min16float\",\r\n    \"min10float\",\r\n    \"min16int\",\r\n    \"min12int\",\r\n    \"min16uint\",\r\n    \"namespace\",\r\n    \"nointerpolation\",\r\n    \"noperspective\",\r\n    \"NULL\",\r\n    \"out\",\r\n    \"OutputPatch\",\r\n    \"packoffset\",\r\n    \"pass\",\r\n    \"pixelfragment\",\r\n    \"PixelShader\",\r\n    \"point\",\r\n    \"PointStream\",\r\n    \"precise\",\r\n    \"RasterizerState\",\r\n    \"RenderTargetView\",\r\n    \"return\",\r\n    \"register\",\r\n    \"row_major\",\r\n    \"RWBuffer\",\r\n    \"RWByteAddressBuffer\",\r\n    \"RWStructuredBuffer\",\r\n    \"RWTexture1D\",\r\n    \"RWTexture1DArray\",\r\n    \"RWTexture2D\",\r\n    \"RWTexture2DArray\",\r\n    \"RWTexture3D\",\r\n    \"sample\",\r\n    \"sampler\",\r\n    \"SamplerState\",\r\n    \"SamplerComparisonState\",\r\n    \"shared\",\r\n    \"snorm\",\r\n    \"stateblock\",\r\n    \"stateblock_state\",\r\n    \"static\",\r\n    \"string\",\r\n    \"struct\",\r\n    \"switch\",\r\n    \"StructuredBuffer\",\r\n    \"tbuffer\",\r\n    \"technique\",\r\n    \"technique10\",\r\n    \"technique11\",\r\n    \"texture\",\r\n    \"Texture1D\",\r\n    \"Texture1DArray\",\r\n    \"Texture2D\",\r\n    \"Texture2DArray\",\r\n    \"Texture2DMS\",\r\n    \"Texture2DMSArray\",\r\n    \"Texture3D\",\r\n    \"TextureCube\",\r\n    \"TextureCubeArray\",\r\n    \"true\",\r\n    \"typedef\",\r\n    \"triangle\",\r\n    \"triangleadj\",\r\n    \"TriangleStream\",\r\n    \"uint\",\r\n    \"uniform\",\r\n    \"unorm\",\r\n    \"unsigned\",\r\n    \"vector\",\r\n    \"vertexfragment\",\r\n    \"VertexShader\",\r\n    \"void\",\r\n    \"volatile\",\r\n    \"while\",\r\n    \"auto\",\r\n    \"case\",\r\n    \"catch\",\r\n    \"char\",\r\n    \"class\",\r\n    \"const_cast\",\r\n    \"default\",\r\n    \"delete\",\r\n    \"dynamic_cast\",\r\n    \"enum\",\r\n    \"explicit\",\r\n    \"friend\",\r\n    \"goto\",\r\n    \"long\",\r\n    \"mutable\",\r\n    \"new\",\r\n    \"operator\",\r\n    \"private\",\r\n    \"protected\",\r\n    \"public\",\r\n    \"reinterpret_cast\",\r\n    \"short\",\r\n    \"signed\",\r\n    \"sizeof\",\r\n    \"static_cast\",\r\n    \"template\",\r\n    \"this\",\r\n    \"throw\",\r\n    \"try\",\r\n    \"typename\",\r\n    \"union\",\r\n    \"unsigned\",\r\n    \"using\",\r\n    \"virtual\",\r\n];\r\n"
  },
  {
    "path": "lib/naga/src/back/hlsl/mod.rs",
    "content": "/*!\r\nBackend for [HLSL][hlsl] (High-Level Shading Language).\r\n\r\n# Supported shader model versions:\r\n- 5.0\r\n- 5.1\r\n- 6.0\r\n\r\n# Layout of values in `uniform` buffers\r\n\r\nWGSL's [\"Internal Layout of Values\"][ilov] rules specify how each WGSL\r\ntype should be stored in `uniform` and `storage` buffers. The HLSL we\r\ngenerate must access values in that form, even when it is not what\r\nHLSL would use normally.\r\n\r\nThe rules described here only apply to WGSL `uniform` variables. WGSL\r\n`storage` buffers are translated as HLSL `ByteAddressBuffers`, for\r\nwhich we generate `Load` and `Store` method calls with explicit byte\r\noffsets. WGSL pipeline inputs must be scalars or vectors; they cannot\r\nbe matrices, which is where the interesting problems arise.\r\n\r\n## Row- and column-major ordering for matrices\r\n\r\nWGSL specifies that matrices in uniform buffers are stored in\r\ncolumn-major order. This matches HLSL's default, so one might expect\r\nthings to be straightforward. Unfortunately, WGSL and HLSL disagree on\r\nwhat indexing a matrix means: in WGSL, `m[i]` retrieves the `i`'th\r\n*column* of `m`, whereas in HLSL it retrieves the `i`'th *row*. We\r\nwant to avoid translating `m[i]` into some complicated reassembly of a\r\nvector from individually fetched components, so this is a problem.\r\n\r\nHowever, with a bit of trickery, it is possible to use HLSL's `m[i]`\r\nas the translation of WGSL's `m[i]`:\r\n\r\n- We declare all matrices in uniform buffers in HLSL with the\r\n  `row_major` qualifier, and transpose the row and column counts: a\r\n  WGSL `mat3x4<f32>`, say, becomes an HLSL `row_major float3x4`. (Note\r\n  that WGSL and HLSL type names put the row and column in reverse\r\n  order.) Since the HLSL type is the transpose of how WebGPU directs\r\n  the user to store the data, HLSL will load all matrices transposed.\r\n\r\n- Since matrices are transposed, an HLSL indexing expression retrieves\r\n  the \"columns\" of the intended WGSL value, as desired.\r\n\r\n- For vector-matrix multiplication, since `mul(transpose(m), v)` is\r\n  equivalent to `mul(v, m)` (note the reversal of the arguments), and\r\n  `mul(v, transpose(m))` is equivalent to `mul(m, v)`, we can\r\n  translate WGSL `m * v` and `v * m` to HLSL by simply reversing the\r\n  arguments to `mul`.\r\n\r\n## Padding in two-row matrices\r\n\r\nAn HLSL `row_major floatKx2` matrix has padding between its rows that\r\nthe WGSL `matKx2<f32>` matrix it represents does not. HLSL stores all\r\nmatrix rows [aligned on 16-byte boundaries][16bb], whereas WGSL says\r\nthat the columns of a `matKx2<f32>` need only be [aligned as required\r\nfor `vec2<f32>`][ilov], which is [eight-byte alignment][8bb].\r\n\r\nTo compensate for this, any time a `matKx2<f32>` appears in a WGSL\r\n`uniform` variable, whether directly as the variable's type or as part\r\nof a struct/array, we actually emit `K` separate `float2` members, and\r\nassemble/disassemble the matrix from its columns (in WGSL; rows in\r\nHLSL) upon load and store.\r\n\r\nFor example, the following WGSL struct type:\r\n\r\n```ignore\r\nstruct Baz {\r\n        m: mat3x2<f32>,\r\n}\r\n```\r\n\r\nis rendered as the HLSL struct type:\r\n\r\n```ignore\r\nstruct Baz {\r\n    float2 m_0; float2 m_1; float2 m_2;\r\n};\r\n```\r\n\r\nThe `wrapped_struct_matrix` functions in `help.rs` generate HLSL\r\nhelper functions to access such members, converting between the stored\r\nform and the HLSL matrix types appropriately. For example, for reading\r\nthe member `m` of the `Baz` struct above, we emit:\r\n\r\n```ignore\r\nfloat3x2 GetMatmOnBaz(Baz obj) {\r\n    return float3x2(obj.m_0, obj.m_1, obj.m_2);\r\n}\r\n```\r\n\r\nWe also emit an analogous `Set` function, as well as functions for\r\naccessing individual columns by dynamic index.\r\n\r\n[hlsl]: https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl\r\n[ilov]: https://gpuweb.github.io/gpuweb/wgsl/#internal-value-layout\r\n[16bb]: https://github.com/microsoft/DirectXShaderCompiler/wiki/Buffer-Packing#constant-buffer-packing\r\n[8bb]: https://gpuweb.github.io/gpuweb/wgsl/#alignment-and-size\r\n*/\r\n\r\nmod conv;\r\nmod help;\r\nmod keywords;\r\nmod storage;\r\nmod writer;\r\n\r\nuse std::fmt::Error as FmtError;\r\nuse thiserror::Error;\r\n\r\nuse crate::proc;\r\n\r\n#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct BindTarget {\r\n    pub space: u8,\r\n    pub register: u32,\r\n    /// If the binding is an unsized binding array, this overrides the size.\r\n    pub binding_array_size: Option<u32>,\r\n}\r\n\r\n// Using `BTreeMap` instead of `HashMap` so that we can hash itself.\r\npub type BindingMap = std::collections::BTreeMap<crate::ResourceBinding, BindTarget>;\r\n\r\n/// A HLSL shader model version.\r\n#[allow(non_snake_case, non_camel_case_types)]\r\n#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum ShaderModel {\r\n    V5_0,\r\n    V5_1,\r\n    V6_0,\r\n}\r\n\r\nimpl ShaderModel {\r\n    pub const fn to_str(self) -> &'static str {\r\n        match self {\r\n            Self::V5_0 => \"5_0\",\r\n            Self::V5_1 => \"5_1\",\r\n            Self::V6_0 => \"6_0\",\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::ShaderStage {\r\n    pub const fn to_hlsl_str(self) -> &'static str {\r\n        match self {\r\n            Self::Vertex => \"vs\",\r\n            Self::Fragment => \"ps\",\r\n            Self::Compute => \"cs\",\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::ImageDimension {\r\n    const fn to_hlsl_str(self) -> &'static str {\r\n        match self {\r\n            Self::D1 => \"1D\",\r\n            Self::D2 => \"2D\",\r\n            Self::D3 => \"3D\",\r\n            Self::Cube => \"Cube\",\r\n        }\r\n    }\r\n}\r\n\r\n/// Shorthand result used internally by the backend\r\ntype BackendResult = Result<(), Error>;\r\n\r\n#[derive(Clone, Debug, PartialEq, thiserror::Error)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum EntryPointError {\r\n    #[error(\"mapping of {0:?} is missing\")]\r\n    MissingBinding(crate::ResourceBinding),\r\n}\r\n\r\n/// Configuration used in the [`Writer`].\r\n#[derive(Clone, Debug, Hash, PartialEq, Eq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct Options {\r\n    /// The hlsl shader model to be used\r\n    pub shader_model: ShaderModel,\r\n    /// Map of resources association to binding locations.\r\n    pub binding_map: BindingMap,\r\n    /// Don't panic on missing bindings, instead generate any HLSL.\r\n    pub fake_missing_bindings: bool,\r\n    /// Add special constants to `SV_VertexIndex` and `SV_InstanceIndex`,\r\n    /// to make them work like in Vulkan/Metal, with help of the host.\r\n    pub special_constants_binding: Option<BindTarget>,\r\n    /// Bind target of the push constant buffer\r\n    pub push_constants_target: Option<BindTarget>,\r\n}\r\n\r\nimpl Default for Options {\r\n    fn default() -> Self {\r\n        Options {\r\n            shader_model: ShaderModel::V5_1,\r\n            binding_map: BindingMap::default(),\r\n            fake_missing_bindings: true,\r\n            special_constants_binding: None,\r\n            push_constants_target: None,\r\n        }\r\n    }\r\n}\r\n\r\nimpl Options {\r\n    fn resolve_resource_binding(\r\n        &self,\r\n        res_binding: &crate::ResourceBinding,\r\n    ) -> Result<BindTarget, EntryPointError> {\r\n        match self.binding_map.get(res_binding) {\r\n            Some(target) => Ok(target.clone()),\r\n            None if self.fake_missing_bindings => Ok(BindTarget {\r\n                space: res_binding.group as u8,\r\n                register: res_binding.binding,\r\n                binding_array_size: None,\r\n            }),\r\n            None => Err(EntryPointError::MissingBinding(res_binding.clone())),\r\n        }\r\n    }\r\n}\r\n\r\n/// Reflection info for entry point names.\r\n#[derive(Default)]\r\npub struct ReflectionInfo {\r\n    /// Mapping of the entry point names.\r\n    ///\r\n    /// Each item in the array corresponds to an entry point index. The real entry point name may be different if one of the\r\n    /// reserved words are used.\r\n    ///\r\n    /// Note: Some entry points may fail translation because of missing bindings.\r\n    pub entry_point_names: Vec<Result<String, EntryPointError>>,\r\n}\r\n\r\n#[derive(Error, Debug)]\r\npub enum Error {\r\n    #[error(transparent)]\r\n    IoError(#[from] FmtError),\r\n    #[error(\"A scalar with an unsupported width was requested: {0:?} {1:?}\")]\r\n    UnsupportedScalar(crate::ScalarKind, crate::Bytes),\r\n    #[error(\"{0}\")]\r\n    Unimplemented(String), // TODO: Error used only during development\r\n    #[error(\"{0}\")]\r\n    Custom(String),\r\n}\r\n\r\n#[derive(Default)]\r\nstruct Wrapped {\r\n    array_lengths: crate::FastHashSet<help::WrappedArrayLength>,\r\n    image_queries: crate::FastHashSet<help::WrappedImageQuery>,\r\n    constructors: crate::FastHashSet<help::WrappedConstructor>,\r\n    struct_matrix_access: crate::FastHashSet<help::WrappedStructMatrixAccess>,\r\n    mat_cx2s: crate::FastHashSet<help::WrappedMatCx2>,\r\n}\r\n\r\nimpl Wrapped {\r\n    fn clear(&mut self) {\r\n        self.array_lengths.clear();\r\n        self.image_queries.clear();\r\n        self.constructors.clear();\r\n        self.struct_matrix_access.clear();\r\n        self.mat_cx2s.clear();\r\n    }\r\n}\r\n\r\npub struct Writer<'a, W> {\r\n    out: W,\r\n    names: crate::FastHashMap<proc::NameKey, String>,\r\n    namer: proc::Namer,\r\n    /// HLSL backend options\r\n    options: &'a Options,\r\n    /// Information about entry point arguments and result types.\r\n    entry_point_io: Vec<writer::EntryPointInterface>,\r\n    /// Set of expressions that have associated temporary variables\r\n    named_expressions: crate::NamedExpressions,\r\n    wrapped: Wrapped,\r\n    temp_access_chain: Vec<storage::SubAccess>,\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/hlsl/storage.rs",
    "content": "/*!\r\nLogic related to `ByteAddressBuffer` operations.\r\n\r\nHLSL backend uses byte address buffers for all storage buffers in IR.\r\n*/\r\n\r\nuse super::{super::FunctionCtx, BackendResult, Error};\r\nuse crate::{\r\n    proc::{Alignment, NameKey, TypeResolution},\r\n    Handle,\r\n};\r\n\r\nuse std::{fmt, mem};\r\n\r\nconst STORE_TEMP_NAME: &str = \"_value\";\r\n\r\n#[derive(Debug)]\r\npub(super) enum SubAccess {\r\n    Offset(u32),\r\n    Index {\r\n        value: Handle<crate::Expression>,\r\n        stride: u32,\r\n    },\r\n}\r\n\r\npub(super) enum StoreValue {\r\n    Expression(Handle<crate::Expression>),\r\n    TempIndex {\r\n        depth: usize,\r\n        index: u32,\r\n        ty: TypeResolution,\r\n    },\r\n    TempAccess {\r\n        depth: usize,\r\n        base: Handle<crate::Type>,\r\n        member_index: u32,\r\n    },\r\n}\r\n\r\nimpl<W: fmt::Write> super::Writer<'_, W> {\r\n    pub(super) fn write_storage_address(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        chain: &[SubAccess],\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        if chain.is_empty() {\r\n            write!(self.out, \"0\")?;\r\n        }\r\n        for (i, access) in chain.iter().enumerate() {\r\n            if i != 0 {\r\n                write!(self.out, \"+\")?;\r\n            }\r\n            match *access {\r\n                SubAccess::Offset(offset) => {\r\n                    write!(self.out, \"{}\", offset)?;\r\n                }\r\n                SubAccess::Index { value, stride } => {\r\n                    self.write_expr(module, value, func_ctx)?;\r\n                    write!(self.out, \"*{}\", stride)?;\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn write_storage_load_sequence<I: Iterator<Item = (TypeResolution, u32)>>(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        var_handle: Handle<crate::GlobalVariable>,\r\n        sequence: I,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        for (i, (ty_resolution, offset)) in sequence.enumerate() {\r\n            // add the index temporarily\r\n            self.temp_access_chain.push(SubAccess::Offset(offset));\r\n            if i != 0 {\r\n                write!(self.out, \", \")?;\r\n            };\r\n            self.write_storage_load(module, var_handle, ty_resolution, func_ctx)?;\r\n            self.temp_access_chain.pop();\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function to write down the Load operation on a `ByteAddressBuffer`.\r\n    pub(super) fn write_storage_load(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        var_handle: Handle<crate::GlobalVariable>,\r\n        result_ty: TypeResolution,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        match *result_ty.inner_with(&module.types) {\r\n            crate::TypeInner::Scalar { kind, width: _ } => {\r\n                // working around the borrow checker in `self.write_expr`\r\n                let chain = mem::take(&mut self.temp_access_chain);\r\n                let var_name = &self.names[&NameKey::GlobalVariable(var_handle)];\r\n                let cast = kind.to_hlsl_cast();\r\n                write!(self.out, \"{}({}.Load(\", cast, var_name)?;\r\n                self.write_storage_address(module, &chain, func_ctx)?;\r\n                write!(self.out, \"))\")?;\r\n                self.temp_access_chain = chain;\r\n            }\r\n            crate::TypeInner::Vector {\r\n                size,\r\n                kind,\r\n                width: _,\r\n            } => {\r\n                // working around the borrow checker in `self.write_expr`\r\n                let chain = mem::take(&mut self.temp_access_chain);\r\n                let var_name = &self.names[&NameKey::GlobalVariable(var_handle)];\r\n                let cast = kind.to_hlsl_cast();\r\n                write!(self.out, \"{}({}.Load{}(\", cast, var_name, size as u8)?;\r\n                self.write_storage_address(module, &chain, func_ctx)?;\r\n                write!(self.out, \"))\")?;\r\n                self.temp_access_chain = chain;\r\n            }\r\n            crate::TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                write!(\r\n                    self.out,\r\n                    \"{}{}x{}(\",\r\n                    crate::ScalarKind::Float.to_hlsl_str(width)?,\r\n                    columns as u8,\r\n                    rows as u8,\r\n                )?;\r\n\r\n                // Note: Matrices containing vec3s, due to padding, act like they contain vec4s.\r\n                let row_stride = Alignment::from(rows) * width as u32;\r\n                let iter = (0..columns as u32).map(|i| {\r\n                    let ty_inner = crate::TypeInner::Vector {\r\n                        size: rows,\r\n                        kind: crate::ScalarKind::Float,\r\n                        width,\r\n                    };\r\n                    (TypeResolution::Value(ty_inner), i * row_stride)\r\n                });\r\n                self.write_storage_load_sequence(module, var_handle, iter, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(const_handle),\r\n                ..\r\n            } => {\r\n                write!(self.out, \"{{\")?;\r\n                let count = module.constants[const_handle].to_array_length().unwrap();\r\n                let stride = module.types[base].inner.size(&module.constants);\r\n                let iter = (0..count).map(|i| (TypeResolution::Handle(base), stride * i));\r\n                self.write_storage_load_sequence(module, var_handle, iter, func_ctx)?;\r\n                write!(self.out, \"}}\")?;\r\n            }\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                let constructor = super::help::WrappedConstructor {\r\n                    ty: result_ty.handle().unwrap(),\r\n                };\r\n                self.write_wrapped_constructor_function_name(module, constructor)?;\r\n                write!(self.out, \"(\")?;\r\n                let iter = members\r\n                    .iter()\r\n                    .map(|m| (TypeResolution::Handle(m.ty), m.offset));\r\n                self.write_storage_load_sequence(module, var_handle, iter, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn write_store_value(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        value: &StoreValue,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> BackendResult {\r\n        match *value {\r\n            StoreValue::Expression(expr) => self.write_expr(module, expr, func_ctx)?,\r\n            StoreValue::TempIndex {\r\n                depth,\r\n                index,\r\n                ty: _,\r\n            } => write!(self.out, \"{}{}[{}]\", STORE_TEMP_NAME, depth, index)?,\r\n            StoreValue::TempAccess {\r\n                depth,\r\n                base,\r\n                member_index,\r\n            } => {\r\n                let name = &self.names[&NameKey::StructMember(base, member_index)];\r\n                write!(self.out, \"{}{}.{}\", STORE_TEMP_NAME, depth, name)?\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function to write down the Store operation on a `ByteAddressBuffer`.\r\n    pub(super) fn write_storage_store(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        var_handle: Handle<crate::GlobalVariable>,\r\n        value: StoreValue,\r\n        func_ctx: &FunctionCtx,\r\n        level: crate::back::Level,\r\n    ) -> BackendResult {\r\n        let temp_resolution;\r\n        let ty_resolution = match value {\r\n            StoreValue::Expression(expr) => &func_ctx.info[expr].ty,\r\n            StoreValue::TempIndex {\r\n                depth: _,\r\n                index: _,\r\n                ref ty,\r\n            } => ty,\r\n            StoreValue::TempAccess {\r\n                depth: _,\r\n                base,\r\n                member_index,\r\n            } => {\r\n                let ty_handle = match module.types[base].inner {\r\n                    crate::TypeInner::Struct { ref members, .. } => {\r\n                        members[member_index as usize].ty\r\n                    }\r\n                    _ => unreachable!(),\r\n                };\r\n                temp_resolution = TypeResolution::Handle(ty_handle);\r\n                &temp_resolution\r\n            }\r\n        };\r\n        match *ty_resolution.inner_with(&module.types) {\r\n            crate::TypeInner::Scalar { .. } => {\r\n                // working around the borrow checker in `self.write_expr`\r\n                let chain = mem::take(&mut self.temp_access_chain);\r\n                let var_name = &self.names[&NameKey::GlobalVariable(var_handle)];\r\n                write!(self.out, \"{}{}.Store(\", level, var_name)?;\r\n                self.write_storage_address(module, &chain, func_ctx)?;\r\n                write!(self.out, \", asuint(\")?;\r\n                self.write_store_value(module, &value, func_ctx)?;\r\n                writeln!(self.out, \"));\")?;\r\n                self.temp_access_chain = chain;\r\n            }\r\n            crate::TypeInner::Vector { size, .. } => {\r\n                // working around the borrow checker in `self.write_expr`\r\n                let chain = mem::take(&mut self.temp_access_chain);\r\n                let var_name = &self.names[&NameKey::GlobalVariable(var_handle)];\r\n                write!(self.out, \"{}{}.Store{}(\", level, var_name, size as u8)?;\r\n                self.write_storage_address(module, &chain, func_ctx)?;\r\n                write!(self.out, \", asuint(\")?;\r\n                self.write_store_value(module, &value, func_ctx)?;\r\n                writeln!(self.out, \"));\")?;\r\n                self.temp_access_chain = chain;\r\n            }\r\n            crate::TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                // first, assign the value to a temporary\r\n                writeln!(self.out, \"{}{{\", level)?;\r\n                let depth = level.0 + 1;\r\n                write!(\r\n                    self.out,\r\n                    \"{}{}{}x{} {}{} = \",\r\n                    level.next(),\r\n                    crate::ScalarKind::Float.to_hlsl_str(width)?,\r\n                    columns as u8,\r\n                    rows as u8,\r\n                    STORE_TEMP_NAME,\r\n                    depth,\r\n                )?;\r\n                self.write_store_value(module, &value, func_ctx)?;\r\n                writeln!(self.out, \";\")?;\r\n\r\n                // Note: Matrices containing vec3s, due to padding, act like they contain vec4s.\r\n                let row_stride = Alignment::from(rows) * width as u32;\r\n\r\n                // then iterate the stores\r\n                for i in 0..columns as u32 {\r\n                    self.temp_access_chain\r\n                        .push(SubAccess::Offset(i * row_stride));\r\n                    let ty_inner = crate::TypeInner::Vector {\r\n                        size: rows,\r\n                        kind: crate::ScalarKind::Float,\r\n                        width,\r\n                    };\r\n                    let sv = StoreValue::TempIndex {\r\n                        depth,\r\n                        index: i,\r\n                        ty: TypeResolution::Value(ty_inner),\r\n                    };\r\n                    self.write_storage_store(module, var_handle, sv, func_ctx, level.next())?;\r\n                    self.temp_access_chain.pop();\r\n                }\r\n                // done\r\n                writeln!(self.out, \"{}}}\", level)?;\r\n            }\r\n            crate::TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(const_handle),\r\n                ..\r\n            } => {\r\n                // first, assign the value to a temporary\r\n                writeln!(self.out, \"{}{{\", level)?;\r\n                write!(self.out, \"{}\", level.next())?;\r\n                self.write_value_type(module, &module.types[base].inner)?;\r\n                let depth = level.next().0;\r\n                write!(self.out, \" {}{}\", STORE_TEMP_NAME, depth)?;\r\n                self.write_array_size(module, base, crate::ArraySize::Constant(const_handle))?;\r\n                write!(self.out, \" = \")?;\r\n                self.write_store_value(module, &value, func_ctx)?;\r\n                writeln!(self.out, \";\")?;\r\n                // then iterate the stores\r\n                let count = module.constants[const_handle].to_array_length().unwrap();\r\n                let stride = module.types[base].inner.size(&module.constants);\r\n                for i in 0..count {\r\n                    self.temp_access_chain.push(SubAccess::Offset(i * stride));\r\n                    let sv = StoreValue::TempIndex {\r\n                        depth,\r\n                        index: i,\r\n                        ty: TypeResolution::Handle(base),\r\n                    };\r\n                    self.write_storage_store(module, var_handle, sv, func_ctx, level.next())?;\r\n                    self.temp_access_chain.pop();\r\n                }\r\n                // done\r\n                writeln!(self.out, \"{}}}\", level)?;\r\n            }\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                // first, assign the value to a temporary\r\n                writeln!(self.out, \"{}{{\", level)?;\r\n                let depth = level.next().0;\r\n                let struct_ty = ty_resolution.handle().unwrap();\r\n                let struct_name = &self.names[&NameKey::Type(struct_ty)];\r\n                write!(\r\n                    self.out,\r\n                    \"{}{} {}{} = \",\r\n                    level.next(),\r\n                    struct_name,\r\n                    STORE_TEMP_NAME,\r\n                    depth\r\n                )?;\r\n                self.write_store_value(module, &value, func_ctx)?;\r\n                writeln!(self.out, \";\")?;\r\n                // then iterate the stores\r\n                for (i, member) in members.iter().enumerate() {\r\n                    self.temp_access_chain\r\n                        .push(SubAccess::Offset(member.offset));\r\n                    let sv = StoreValue::TempAccess {\r\n                        depth,\r\n                        base: struct_ty,\r\n                        member_index: i as u32,\r\n                    };\r\n                    self.write_storage_store(module, var_handle, sv, func_ctx, level.next())?;\r\n                    self.temp_access_chain.pop();\r\n                }\r\n                // done\r\n                writeln!(self.out, \"{}}}\", level)?;\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn fill_access_chain(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        mut cur_expr: Handle<crate::Expression>,\r\n        func_ctx: &FunctionCtx,\r\n    ) -> Result<Handle<crate::GlobalVariable>, Error> {\r\n        enum AccessIndex {\r\n            Expression(Handle<crate::Expression>),\r\n            Constant(u32),\r\n        }\r\n        enum Parent<'a> {\r\n            Array { stride: u32 },\r\n            Struct(&'a [crate::StructMember]),\r\n        }\r\n        self.temp_access_chain.clear();\r\n\r\n        loop {\r\n            let (next_expr, access_index) = match func_ctx.expressions[cur_expr] {\r\n                crate::Expression::GlobalVariable(handle) => return Ok(handle),\r\n                crate::Expression::Access { base, index } => (base, AccessIndex::Expression(index)),\r\n                crate::Expression::AccessIndex { base, index } => {\r\n                    (base, AccessIndex::Constant(index))\r\n                }\r\n                ref other => {\r\n                    return Err(Error::Unimplemented(format!(\r\n                        \"Pointer access of {:?}\",\r\n                        other\r\n                    )))\r\n                }\r\n            };\r\n\r\n            let parent = match *func_ctx.info[next_expr].ty.inner_with(&module.types) {\r\n                crate::TypeInner::Pointer { base, .. } => match module.types[base].inner {\r\n                    crate::TypeInner::Struct { ref members, .. } => Parent::Struct(members),\r\n                    crate::TypeInner::Array { stride, .. } => Parent::Array { stride },\r\n                    crate::TypeInner::Vector { width, .. } => Parent::Array {\r\n                        stride: width as u32,\r\n                    },\r\n                    crate::TypeInner::Matrix { columns, width, .. } => Parent::Array {\r\n                        stride: Alignment::from(columns) * width as u32,\r\n                    },\r\n                    _ => unreachable!(),\r\n                },\r\n                crate::TypeInner::ValuePointer { width, .. } => Parent::Array {\r\n                    stride: width as u32,\r\n                },\r\n                _ => unreachable!(),\r\n            };\r\n\r\n            let sub = match (parent, access_index) {\r\n                (Parent::Array { stride }, AccessIndex::Expression(value)) => {\r\n                    SubAccess::Index { value, stride }\r\n                }\r\n                (Parent::Array { stride }, AccessIndex::Constant(index)) => {\r\n                    SubAccess::Offset(stride * index)\r\n                }\r\n                (Parent::Struct(members), AccessIndex::Constant(index)) => {\r\n                    SubAccess::Offset(members[index as usize].offset)\r\n                }\r\n                (Parent::Struct(_), AccessIndex::Expression(_)) => unreachable!(),\r\n            };\r\n\r\n            self.temp_access_chain.push(sub);\r\n            cur_expr = next_expr;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/hlsl/writer.rs",
    "content": "use super::{\r\n    help::{WrappedArrayLength, WrappedConstructor, WrappedImageQuery, WrappedStructMatrixAccess},\r\n    storage::StoreValue,\r\n    BackendResult, Error, Options,\r\n};\r\nuse crate::{\r\n    back,\r\n    proc::{self, NameKey},\r\n    valid, Handle, Module, ScalarKind, ShaderStage, TypeInner,\r\n};\r\nuse std::{fmt, mem};\r\n\r\nconst LOCATION_SEMANTIC: &str = \"LOC\";\r\nconst SPECIAL_CBUF_TYPE: &str = \"NagaConstants\";\r\nconst SPECIAL_CBUF_VAR: &str = \"_NagaConstants\";\r\nconst SPECIAL_BASE_VERTEX: &str = \"base_vertex\";\r\nconst SPECIAL_BASE_INSTANCE: &str = \"base_instance\";\r\nconst SPECIAL_OTHER: &str = \"other\";\r\n\r\nstruct EpStructMember {\r\n    name: String,\r\n    ty: Handle<crate::Type>,\r\n    // technically, this should always be `Some`\r\n    binding: Option<crate::Binding>,\r\n    index: u32,\r\n}\r\n\r\n/// Structure contains information required for generating\r\n/// wrapped structure of all entry points arguments\r\nstruct EntryPointBinding {\r\n    /// Name of the fake EP argument that contains the struct\r\n    /// with all the flattened input data.\r\n    arg_name: String,\r\n    /// Generated structure name\r\n    ty_name: String,\r\n    /// Members of generated structure\r\n    members: Vec<EpStructMember>,\r\n}\r\n\r\npub(super) struct EntryPointInterface {\r\n    /// If `Some`, the input of an entry point is gathered in a special\r\n    /// struct with members sorted by binding.\r\n    /// The `EntryPointBinding::members` array is sorted by index,\r\n    /// so that we can walk it in `write_ep_arguments_initialization`.\r\n    input: Option<EntryPointBinding>,\r\n    /// If `Some`, the output of an entry point is flattened.\r\n    /// The `EntryPointBinding::members` array is sorted by binding,\r\n    /// So that we can walk it in `Statement::Return` handler.\r\n    output: Option<EntryPointBinding>,\r\n}\r\n\r\n#[derive(Clone, Eq, PartialEq, PartialOrd, Ord)]\r\nenum InterfaceKey {\r\n    Location(u32),\r\n    BuiltIn(crate::BuiltIn),\r\n    Other,\r\n}\r\n\r\nimpl InterfaceKey {\r\n    const fn new(binding: Option<&crate::Binding>) -> Self {\r\n        match binding {\r\n            Some(&crate::Binding::Location { location, .. }) => Self::Location(location),\r\n            Some(&crate::Binding::BuiltIn(built_in)) => Self::BuiltIn(built_in),\r\n            None => Self::Other,\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Copy, Clone, PartialEq)]\r\nenum Io {\r\n    Input,\r\n    Output,\r\n}\r\n\r\nimpl<'a, W: fmt::Write> super::Writer<'a, W> {\r\n    pub fn new(out: W, options: &'a Options) -> Self {\r\n        Self {\r\n            out,\r\n            names: crate::FastHashMap::default(),\r\n            namer: proc::Namer::default(),\r\n            options,\r\n            entry_point_io: Vec::new(),\r\n            named_expressions: crate::NamedExpressions::default(),\r\n            wrapped: super::Wrapped::default(),\r\n            temp_access_chain: Vec::new(),\r\n        }\r\n    }\r\n\r\n    fn reset(&mut self, module: &Module) {\r\n        self.names.clear();\r\n        self.namer\r\n            .reset(module, super::keywords::RESERVED, &[], &mut self.names);\r\n        self.entry_point_io.clear();\r\n        self.named_expressions.clear();\r\n        self.wrapped.clear();\r\n    }\r\n\r\n    pub fn write(\r\n        &mut self,\r\n        module: &Module,\r\n        module_info: &valid::ModuleInfo,\r\n    ) -> Result<super::ReflectionInfo, Error> {\r\n        self.reset(module);\r\n\r\n        // Write special constants, if needed\r\n        if let Some(ref bt) = self.options.special_constants_binding {\r\n            writeln!(self.out, \"struct {} {{\", SPECIAL_CBUF_TYPE)?;\r\n            writeln!(self.out, \"{}int {};\", back::INDENT, SPECIAL_BASE_VERTEX)?;\r\n            writeln!(self.out, \"{}int {};\", back::INDENT, SPECIAL_BASE_INSTANCE)?;\r\n            writeln!(self.out, \"{}uint {};\", back::INDENT, SPECIAL_OTHER)?;\r\n            writeln!(self.out, \"}};\")?;\r\n            write!(\r\n                self.out,\r\n                \"ConstantBuffer<{}> {}: register(b{}\",\r\n                SPECIAL_CBUF_TYPE, SPECIAL_CBUF_VAR, bt.register\r\n            )?;\r\n            if bt.space != 0 {\r\n                write!(self.out, \", space{}\", bt.space)?;\r\n            }\r\n            writeln!(self.out, \");\")?;\r\n        }\r\n\r\n        // Write all constants\r\n        // For example, input wgsl shader:\r\n        // ```wgsl\r\n        // let c_scale: f32 = 1.2;\r\n        // return VertexOutput(uv, vec4<f32>(c_scale * pos, 0.0, 1.0));\r\n        // ```\r\n        //\r\n        // Output shader:\r\n        // ```hlsl\r\n        // static const float c_scale = 1.2;\r\n        // const VertexOutput vertexoutput1 = { vertexinput.uv3, float4((c_scale * vertexinput.pos1), 0.0, 1.0) };\r\n        // ```\r\n        //\r\n        // If we remove `write_global_constant` `c_scale` will be inlined.\r\n        for (handle, constant) in module.constants.iter() {\r\n            if constant.name.is_some() {\r\n                self.write_global_constant(module, &constant.inner, handle)?;\r\n            }\r\n        }\r\n\r\n        // Extra newline for readability\r\n        writeln!(self.out)?;\r\n\r\n        // Save all entry point output types\r\n        let ep_results = module\r\n            .entry_points\r\n            .iter()\r\n            .map(|ep| (ep.stage, ep.function.result.clone()))\r\n            .collect::<Vec<(ShaderStage, Option<crate::FunctionResult>)>>();\r\n\r\n        self.write_all_mat_cx2_typedefs_and_functions(module)?;\r\n\r\n        // Write all structs\r\n        for (handle, ty) in module.types.iter() {\r\n            if let TypeInner::Struct { ref members, span } = ty.inner {\r\n                if module.types[members.last().unwrap().ty]\r\n                    .inner\r\n                    .is_dynamically_sized(&module.types)\r\n                {\r\n                    // unsized arrays can only be in storage buffers,\r\n                    // for which we use `ByteAddressBuffer` anyway.\r\n                    continue;\r\n                }\r\n\r\n                let ep_result = ep_results.iter().find(|e| {\r\n                    if let Some(ref result) = e.1 {\r\n                        result.ty == handle\r\n                    } else {\r\n                        false\r\n                    }\r\n                });\r\n\r\n                self.write_struct(\r\n                    module,\r\n                    handle,\r\n                    members,\r\n                    span,\r\n                    ep_result.map(|r| (r.0, Io::Output)),\r\n                )?;\r\n                writeln!(self.out)?;\r\n            }\r\n        }\r\n\r\n        // Write wrapped constructor functions used in constants\r\n        for (_, constant) in module.constants.iter() {\r\n            self.write_wrapped_constructor_function_for_constant(module, constant)?;\r\n        }\r\n\r\n        // Write all globals\r\n        for (ty, _) in module.global_variables.iter() {\r\n            self.write_global(module, ty)?;\r\n        }\r\n\r\n        if !module.global_variables.is_empty() {\r\n            // Add extra newline for readability\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // Write all entry points wrapped structs\r\n        for (index, ep) in module.entry_points.iter().enumerate() {\r\n            let ep_name = self.names[&NameKey::EntryPoint(index as u16)].clone();\r\n            let ep_io = self.write_ep_interface(module, &ep.function, ep.stage, &ep_name)?;\r\n            self.entry_point_io.push(ep_io);\r\n        }\r\n\r\n        // Write all regular functions\r\n        for (handle, function) in module.functions.iter() {\r\n            let info = &module_info[handle];\r\n\r\n            // Check if all of the globals are accessible\r\n            if !self.options.fake_missing_bindings {\r\n                if let Some((var_handle, _)) =\r\n                    module\r\n                        .global_variables\r\n                        .iter()\r\n                        .find(|&(var_handle, var)| match var.binding {\r\n                            Some(ref binding) if !info[var_handle].is_empty() => {\r\n                                self.options.resolve_resource_binding(binding).is_err()\r\n                            }\r\n                            _ => false,\r\n                        })\r\n                {\r\n                    log::info!(\r\n                        \"Skipping function {:?} (name {:?}) because global {:?} is inaccessible\",\r\n                        handle,\r\n                        function.name,\r\n                        var_handle\r\n                    );\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            let ctx = back::FunctionCtx {\r\n                ty: back::FunctionType::Function(handle),\r\n                info,\r\n                expressions: &function.expressions,\r\n                named_expressions: &function.named_expressions,\r\n            };\r\n            let name = self.names[&NameKey::Function(handle)].clone();\r\n\r\n            // Write wrapped function for `Expression::ImageQuery` and `Expressions::ArrayLength`\r\n            // before writing all statements and expressions.\r\n            self.write_wrapped_functions(module, &ctx)?;\r\n\r\n            self.write_function(module, name.as_str(), function, &ctx)?;\r\n\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        let mut entry_point_names = Vec::with_capacity(module.entry_points.len());\r\n\r\n        // Write all entry points\r\n        for (index, ep) in module.entry_points.iter().enumerate() {\r\n            let info = module_info.get_entry_point(index);\r\n\r\n            if !self.options.fake_missing_bindings {\r\n                let mut ep_error = None;\r\n                for (var_handle, var) in module.global_variables.iter() {\r\n                    match var.binding {\r\n                        Some(ref binding) if !info[var_handle].is_empty() => {\r\n                            if let Err(err) = self.options.resolve_resource_binding(binding) {\r\n                                ep_error = Some(err);\r\n                                break;\r\n                            }\r\n                        }\r\n                        _ => {}\r\n                    }\r\n                }\r\n                if let Some(err) = ep_error {\r\n                    entry_point_names.push(Err(err));\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            let ctx = back::FunctionCtx {\r\n                ty: back::FunctionType::EntryPoint(index as u16),\r\n                info,\r\n                expressions: &ep.function.expressions,\r\n                named_expressions: &ep.function.named_expressions,\r\n            };\r\n\r\n            // Write wrapped function for `Expression::ImageQuery` and `Expressions::ArrayLength`\r\n            // before writing all statements and expressions.\r\n            self.write_wrapped_functions(module, &ctx)?;\r\n\r\n            if ep.stage == ShaderStage::Compute {\r\n                // HLSL is calling workgroup size \"num threads\"\r\n                let num_threads = ep.workgroup_size;\r\n                writeln!(\r\n                    self.out,\r\n                    \"[numthreads({}, {}, {})]\",\r\n                    num_threads[0], num_threads[1], num_threads[2]\r\n                )?;\r\n            }\r\n\r\n            let name = self.names[&NameKey::EntryPoint(index as u16)].clone();\r\n            self.write_function(module, &name, &ep.function, &ctx)?;\r\n\r\n            if index < module.entry_points.len() - 1 {\r\n                writeln!(self.out)?;\r\n            }\r\n\r\n            entry_point_names.push(Ok(name));\r\n        }\r\n\r\n        Ok(super::ReflectionInfo { entry_point_names })\r\n    }\r\n\r\n    fn write_modifier(&mut self, binding: &crate::Binding) -> BackendResult {\r\n        match *binding {\r\n            crate::Binding::BuiltIn(crate::BuiltIn::Position { invariant: true }) => {\r\n                write!(self.out, \"precise \")?;\r\n            }\r\n            crate::Binding::Location {\r\n                interpolation,\r\n                sampling,\r\n                ..\r\n            } => {\r\n                if let Some(interpolation) = interpolation {\r\n                    if let Some(string) = interpolation.to_hlsl_str() {\r\n                        write!(self.out, \"{} \", string)?\r\n                    }\r\n                }\r\n\r\n                if let Some(sampling) = sampling {\r\n                    if let Some(string) = sampling.to_hlsl_str() {\r\n                        write!(self.out, \"{} \", string)?\r\n                    }\r\n                }\r\n            }\r\n            _ => {}\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    //TODO: we could force fragment outputs to always go through `entry_point_io.output` path\r\n    // if they are struct, so that the `stage` argument here could be omitted.\r\n    fn write_semantic(\r\n        &mut self,\r\n        binding: &crate::Binding,\r\n        stage: Option<(ShaderStage, Io)>,\r\n    ) -> BackendResult {\r\n        match *binding {\r\n            crate::Binding::BuiltIn(builtin) => {\r\n                let builtin_str = builtin.to_hlsl_str()?;\r\n                write!(self.out, \" : {}\", builtin_str)?;\r\n            }\r\n            crate::Binding::Location { location, .. } => {\r\n                if stage == Some((crate::ShaderStage::Fragment, Io::Output)) {\r\n                    write!(self.out, \" : SV_Target{}\", location)?;\r\n                } else {\r\n                    write!(self.out, \" : {}{}\", LOCATION_SEMANTIC, location)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn write_interface_struct(\r\n        &mut self,\r\n        module: &Module,\r\n        shader_stage: (ShaderStage, Io),\r\n        struct_name: String,\r\n        mut members: Vec<EpStructMember>,\r\n    ) -> Result<EntryPointBinding, Error> {\r\n        // Sort the members so that first come the user-defined varyings\r\n        // in ascending locations, and then built-ins. This allows VS and FS\r\n        // interfaces to match with regards to order.\r\n        members.sort_by_key(|m| InterfaceKey::new(m.binding.as_ref()));\r\n\r\n        write!(self.out, \"struct {}\", struct_name)?;\r\n        writeln!(self.out, \" {{\")?;\r\n        for m in members.iter() {\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n            if let Some(ref binding) = m.binding {\r\n                self.write_modifier(binding)?;\r\n            }\r\n            self.write_type(module, m.ty)?;\r\n            write!(self.out, \" {}\", &m.name)?;\r\n            if let Some(ref binding) = m.binding {\r\n                self.write_semantic(binding, Some(shader_stage))?;\r\n            }\r\n            writeln!(self.out, \";\")?;\r\n        }\r\n        writeln!(self.out, \"}};\")?;\r\n        writeln!(self.out)?;\r\n\r\n        match shader_stage.1 {\r\n            Io::Input => {\r\n                // bring back the original order\r\n                members.sort_by_key(|m| m.index);\r\n            }\r\n            Io::Output => {\r\n                // keep it sorted by binding\r\n            }\r\n        }\r\n\r\n        Ok(EntryPointBinding {\r\n            arg_name: self.namer.call(struct_name.to_lowercase().as_str()),\r\n            ty_name: struct_name,\r\n            members,\r\n        })\r\n    }\r\n\r\n    /// Flatten all entry point arguments into a single struct.\r\n    /// This is needed since we need to re-order them: first placing user locations,\r\n    /// then built-ins.\r\n    fn write_ep_input_struct(\r\n        &mut self,\r\n        module: &Module,\r\n        func: &crate::Function,\r\n        stage: ShaderStage,\r\n        entry_point_name: &str,\r\n    ) -> Result<EntryPointBinding, Error> {\r\n        let struct_name = format!(\"{:?}Input_{}\", stage, entry_point_name);\r\n\r\n        let mut fake_members = Vec::new();\r\n        for arg in func.arguments.iter() {\r\n            match module.types[arg.ty].inner {\r\n                TypeInner::Struct { ref members, .. } => {\r\n                    for member in members.iter() {\r\n                        let name = self.namer.call_or(&member.name, \"member\");\r\n                        let index = fake_members.len() as u32;\r\n                        fake_members.push(EpStructMember {\r\n                            name,\r\n                            ty: member.ty,\r\n                            binding: member.binding.clone(),\r\n                            index,\r\n                        });\r\n                    }\r\n                }\r\n                _ => {\r\n                    let member_name = self.namer.call_or(&arg.name, \"member\");\r\n                    let index = fake_members.len() as u32;\r\n                    fake_members.push(EpStructMember {\r\n                        name: member_name,\r\n                        ty: arg.ty,\r\n                        binding: arg.binding.clone(),\r\n                        index,\r\n                    });\r\n                }\r\n            }\r\n        }\r\n\r\n        self.write_interface_struct(module, (stage, Io::Input), struct_name, fake_members)\r\n    }\r\n\r\n    /// Flatten all entry point results into a single struct.\r\n    /// This is needed since we need to re-order them: first placing user locations,\r\n    /// then built-ins.\r\n    fn write_ep_output_struct(\r\n        &mut self,\r\n        module: &Module,\r\n        result: &crate::FunctionResult,\r\n        stage: ShaderStage,\r\n        entry_point_name: &str,\r\n    ) -> Result<EntryPointBinding, Error> {\r\n        let struct_name = format!(\"{:?}Output_{}\", stage, entry_point_name);\r\n\r\n        let mut fake_members = Vec::new();\r\n        let empty = [];\r\n        let members = match module.types[result.ty].inner {\r\n            TypeInner::Struct { ref members, .. } => members,\r\n            ref other => {\r\n                log::error!(\"Unexpected {:?} output type without a binding\", other);\r\n                &empty[..]\r\n            }\r\n        };\r\n\r\n        for member in members.iter() {\r\n            let member_name = self.namer.call_or(&member.name, \"member\");\r\n            let index = fake_members.len() as u32;\r\n            fake_members.push(EpStructMember {\r\n                name: member_name,\r\n                ty: member.ty,\r\n                binding: member.binding.clone(),\r\n                index,\r\n            });\r\n        }\r\n\r\n        self.write_interface_struct(module, (stage, Io::Output), struct_name, fake_members)\r\n    }\r\n\r\n    /// Writes special interface structures for an entry point. The special structures have\r\n    /// all the fields flattened into them and sorted by binding. They are only needed for\r\n    /// VS outputs and FS inputs, so that these interfaces match.\r\n    fn write_ep_interface(\r\n        &mut self,\r\n        module: &Module,\r\n        func: &crate::Function,\r\n        stage: ShaderStage,\r\n        ep_name: &str,\r\n    ) -> Result<EntryPointInterface, Error> {\r\n        Ok(EntryPointInterface {\r\n            input: if !func.arguments.is_empty() && stage == ShaderStage::Fragment {\r\n                Some(self.write_ep_input_struct(module, func, stage, ep_name)?)\r\n            } else {\r\n                None\r\n            },\r\n            output: match func.result {\r\n                Some(ref fr) if fr.binding.is_none() && stage == ShaderStage::Vertex => {\r\n                    Some(self.write_ep_output_struct(module, fr, stage, ep_name)?)\r\n                }\r\n                _ => None,\r\n            },\r\n        })\r\n    }\r\n\r\n    /// Write an entry point preface that initializes the arguments as specified in IR.\r\n    fn write_ep_arguments_initialization(\r\n        &mut self,\r\n        module: &Module,\r\n        func: &crate::Function,\r\n        ep_index: u16,\r\n    ) -> BackendResult {\r\n        let ep_input = match self.entry_point_io[ep_index as usize].input.take() {\r\n            Some(ep_input) => ep_input,\r\n            None => return Ok(()),\r\n        };\r\n        let mut fake_iter = ep_input.members.iter();\r\n        for (arg_index, arg) in func.arguments.iter().enumerate() {\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n            self.write_type(module, arg.ty)?;\r\n            let arg_name = &self.names[&NameKey::EntryPointArgument(ep_index, arg_index as u32)];\r\n            write!(self.out, \" {}\", arg_name)?;\r\n            match module.types[arg.ty].inner {\r\n                TypeInner::Array { base, size, .. } => {\r\n                    self.write_array_size(module, base, size)?;\r\n                    let fake_member = fake_iter.next().unwrap();\r\n                    writeln!(self.out, \" = {}.{};\", ep_input.arg_name, fake_member.name)?;\r\n                }\r\n                TypeInner::Struct { ref members, .. } => {\r\n                    write!(self.out, \" = {{ \")?;\r\n                    for index in 0..members.len() {\r\n                        if index != 0 {\r\n                            write!(self.out, \", \")?;\r\n                        }\r\n                        let fake_member = fake_iter.next().unwrap();\r\n                        write!(self.out, \"{}.{}\", ep_input.arg_name, fake_member.name)?;\r\n                    }\r\n                    writeln!(self.out, \" }};\")?;\r\n                }\r\n                _ => {\r\n                    let fake_member = fake_iter.next().unwrap();\r\n                    writeln!(self.out, \" = {}.{};\", ep_input.arg_name, fake_member.name)?;\r\n                }\r\n            }\r\n        }\r\n        assert!(fake_iter.next().is_none());\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write global variables\r\n    /// # Notes\r\n    /// Always adds a newline\r\n    fn write_global(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::GlobalVariable>,\r\n    ) -> BackendResult {\r\n        let global = &module.global_variables[handle];\r\n        let inner = &module.types[global.ty].inner;\r\n\r\n        if let Some(ref binding) = global.binding {\r\n            if let Err(err) = self.options.resolve_resource_binding(binding) {\r\n                log::info!(\r\n                    \"Skipping global {:?} (name {:?}) for being inaccessible: {}\",\r\n                    handle,\r\n                    global.name,\r\n                    err,\r\n                );\r\n                return Ok(());\r\n            }\r\n        }\r\n\r\n        // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-variable-register\r\n        let register_ty = match global.space {\r\n            crate::AddressSpace::Function => unreachable!(\"Function address space\"),\r\n            crate::AddressSpace::Private => {\r\n                write!(self.out, \"static \")?;\r\n                self.write_type(module, global.ty)?;\r\n                \"\"\r\n            }\r\n            crate::AddressSpace::WorkGroup => {\r\n                write!(self.out, \"groupshared \")?;\r\n                self.write_type(module, global.ty)?;\r\n                \"\"\r\n            }\r\n            crate::AddressSpace::Uniform => {\r\n                // constant buffer declarations are expected to be inlined, e.g.\r\n                // `cbuffer foo: register(b0) { field1: type1; }`\r\n                write!(self.out, \"cbuffer\")?;\r\n                \"b\"\r\n            }\r\n            crate::AddressSpace::Storage { access } => {\r\n                let (prefix, register) = if access.contains(crate::StorageAccess::STORE) {\r\n                    (\"RW\", \"u\")\r\n                } else {\r\n                    (\"\", \"t\")\r\n                };\r\n                write!(self.out, \"{}ByteAddressBuffer\", prefix)?;\r\n                register\r\n            }\r\n            crate::AddressSpace::Handle => {\r\n                let handle_ty = match *inner {\r\n                    TypeInner::BindingArray { ref base, .. } => &module.types[*base].inner,\r\n                    _ => inner,\r\n                };\r\n\r\n                let register = match *handle_ty {\r\n                    TypeInner::Sampler { .. } => \"s\",\r\n                    // all storage textures are UAV, unconditionally\r\n                    TypeInner::Image {\r\n                        class: crate::ImageClass::Storage { .. },\r\n                        ..\r\n                    } => \"u\",\r\n                    _ => \"t\",\r\n                };\r\n                self.write_type(module, global.ty)?;\r\n                register\r\n            }\r\n            crate::AddressSpace::PushConstant => {\r\n                // The type of the push constants will be wrapped in `ConstantBuffer`\r\n                write!(self.out, \"ConstantBuffer<\")?;\r\n                \"b\"\r\n            }\r\n        };\r\n\r\n        // If the global is a push constant write the type now because it will be a\r\n        // generic argument to `ConstantBuffer`\r\n        if global.space == crate::AddressSpace::PushConstant {\r\n            self.write_global_type(module, global.ty)?;\r\n\r\n            // need to write the array size if the type was emitted with `write_type`\r\n            if let TypeInner::Array { base, size, .. } = module.types[global.ty].inner {\r\n                self.write_array_size(module, base, size)?;\r\n            }\r\n\r\n            // Close the angled brackets for the generic argument\r\n            write!(self.out, \">\")?;\r\n        }\r\n\r\n        let name = &self.names[&NameKey::GlobalVariable(handle)];\r\n        write!(self.out, \" {}\", name)?;\r\n\r\n        // Push constants need to be assigned a binding explicitly by the consumer\r\n        // since naga has no way to know the binding from the shader alone\r\n        if global.space == crate::AddressSpace::PushConstant {\r\n            let target = self\r\n                .options\r\n                .push_constants_target\r\n                .as_ref()\r\n                .expect(\"No bind target was defined for the push constants block\");\r\n            write!(self.out, \": register(b{}\", target.register)?;\r\n            if target.space != 0 {\r\n                write!(self.out, \", space{}\", target.space)?;\r\n            }\r\n            write!(self.out, \")\")?;\r\n        }\r\n\r\n        if let Some(ref binding) = global.binding {\r\n            // this was already resolved earlier when we started evaluating an entry point.\r\n            let bt = self.options.resolve_resource_binding(binding).unwrap();\r\n\r\n            // need to write the binding array size if the type was emitted with `write_type`\r\n            if let TypeInner::BindingArray { base, size, .. } = module.types[global.ty].inner {\r\n                if let Some(overridden_size) = bt.binding_array_size {\r\n                    write!(self.out, \"[{}]\", overridden_size)?;\r\n                } else {\r\n                    self.write_array_size(module, base, size)?;\r\n                }\r\n            }\r\n\r\n            write!(self.out, \" : register({}{}\", register_ty, bt.register)?;\r\n            if bt.space != 0 {\r\n                write!(self.out, \", space{}\", bt.space)?;\r\n            }\r\n            write!(self.out, \")\")?;\r\n        } else {\r\n            // need to write the array size if the type was emitted with `write_type`\r\n            if let TypeInner::Array { base, size, .. } = module.types[global.ty].inner {\r\n                self.write_array_size(module, base, size)?;\r\n            }\r\n            if global.space == crate::AddressSpace::Private {\r\n                write!(self.out, \" = \")?;\r\n                if let Some(init) = global.init {\r\n                    self.write_constant(module, init)?;\r\n                } else {\r\n                    self.write_default_init(module, global.ty)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        if global.space == crate::AddressSpace::Uniform {\r\n            write!(self.out, \" {{ \")?;\r\n\r\n            self.write_global_type(module, global.ty)?;\r\n\r\n            write!(\r\n                self.out,\r\n                \" {}\",\r\n                &self.names[&NameKey::GlobalVariable(handle)]\r\n            )?;\r\n\r\n            // need to write the array size if the type was emitted with `write_type`\r\n            if let TypeInner::Array { base, size, .. } = module.types[global.ty].inner {\r\n                self.write_array_size(module, base, size)?;\r\n            }\r\n\r\n            writeln!(self.out, \"; }}\")?;\r\n        } else {\r\n            writeln!(self.out, \";\")?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write global constants\r\n    ///\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_global_constant(\r\n        &mut self,\r\n        module: &Module,\r\n        inner: &crate::ConstantInner,\r\n        handle: Handle<crate::Constant>,\r\n    ) -> BackendResult {\r\n        write!(self.out, \"static const \")?;\r\n        match *inner {\r\n            crate::ConstantInner::Scalar {\r\n                width: _,\r\n                ref value,\r\n            } => {\r\n                // Write type\r\n                let ty_str = match *value {\r\n                    crate::ScalarValue::Sint(_) => \"int\",\r\n                    crate::ScalarValue::Uint(_) => \"uint\",\r\n                    crate::ScalarValue::Float(_) => \"float\",\r\n                    crate::ScalarValue::Bool(_) => \"bool\",\r\n                };\r\n                let name = &self.names[&NameKey::Constant(handle)];\r\n                write!(self.out, \"{} {} = \", ty_str, name)?;\r\n\r\n                // Second match required to avoid heap allocation by `format!()`\r\n                match *value {\r\n                    crate::ScalarValue::Sint(value) => write!(self.out, \"{}\", value)?,\r\n                    crate::ScalarValue::Uint(value) => write!(self.out, \"{}\", value)?,\r\n                    crate::ScalarValue::Float(value) => {\r\n                        // Floats are written using `Debug` instead of `Display` because it always appends the\r\n                        // decimal part even it's zero\r\n                        write!(self.out, \"{:?}\", value)?\r\n                    }\r\n                    crate::ScalarValue::Bool(value) => write!(self.out, \"{}\", value)?,\r\n                };\r\n            }\r\n            crate::ConstantInner::Composite { ty, ref components } => {\r\n                self.write_type(module, ty)?;\r\n                let name = &self.names[&NameKey::Constant(handle)];\r\n                write!(self.out, \" {} = \", name)?;\r\n                self.write_composite_constant(module, ty, components)?;\r\n            }\r\n        }\r\n        writeln!(self.out, \";\")?;\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_array_size(\r\n        &mut self,\r\n        module: &Module,\r\n        base: Handle<crate::Type>,\r\n        size: crate::ArraySize,\r\n    ) -> BackendResult {\r\n        write!(self.out, \"[\")?;\r\n\r\n        // Write the array size\r\n        // Writes nothing if `ArraySize::Dynamic`\r\n        // Panics if `ArraySize::Constant` has a constant that isn't an sint or uint\r\n        match size {\r\n            crate::ArraySize::Constant(const_handle) => {\r\n                let size = module.constants[const_handle].to_array_length().unwrap();\r\n                write!(self.out, \"{}\", size)?;\r\n            }\r\n            crate::ArraySize::Dynamic => {}\r\n        }\r\n\r\n        write!(self.out, \"]\")?;\r\n\r\n        if let TypeInner::Array {\r\n            base: next_base,\r\n            size: next_size,\r\n            ..\r\n        } = module.types[base].inner\r\n        {\r\n            self.write_array_size(module, next_base, next_size)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write structs\r\n    ///\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_struct(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::Type>,\r\n        members: &[crate::StructMember],\r\n        span: u32,\r\n        shader_stage: Option<(ShaderStage, Io)>,\r\n    ) -> BackendResult {\r\n        // Write struct name\r\n        let struct_name = &self.names[&NameKey::Type(handle)];\r\n        writeln!(self.out, \"struct {} {{\", struct_name)?;\r\n\r\n        let mut last_offset = 0;\r\n        for (index, member) in members.iter().enumerate() {\r\n            if member.binding.is_none() && member.offset > last_offset {\r\n                // using int as padding should work as long as the backend\r\n                // doesn't support a type that's less than 4 bytes in size\r\n                // (Error::UnsupportedScalar catches this)\r\n                let padding = (member.offset - last_offset) / 4;\r\n                for i in 0..padding {\r\n                    writeln!(self.out, \"{}int _pad{}_{};\", back::INDENT, index, i)?;\r\n                }\r\n            }\r\n            let ty_inner = &module.types[member.ty].inner;\r\n            last_offset = member.offset\r\n                + ty_inner\r\n                    .try_size_hlsl(&module.types, &module.constants)\r\n                    .unwrap();\r\n\r\n            // The indentation is only for readability\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n\r\n            match module.types[member.ty].inner {\r\n                TypeInner::Array { base, size, .. } => {\r\n                    // HLSL arrays are written as `type name[size]`\r\n\r\n                    self.write_global_type(module, member.ty)?;\r\n\r\n                    // Write `name`\r\n                    write!(\r\n                        self.out,\r\n                        \" {}\",\r\n                        &self.names[&NameKey::StructMember(handle, index as u32)]\r\n                    )?;\r\n                    // Write [size]\r\n                    self.write_array_size(module, base, size)?;\r\n                }\r\n                // We treat matrices of the form `matCx2` as a sequence of C `vec2`s.\r\n                // See the module-level block comment in mod.rs for details.\r\n                TypeInner::Matrix {\r\n                    rows,\r\n                    columns,\r\n                    width,\r\n                } if member.binding.is_none() && rows == crate::VectorSize::Bi => {\r\n                    let vec_ty = crate::TypeInner::Vector {\r\n                        size: rows,\r\n                        kind: crate::ScalarKind::Float,\r\n                        width,\r\n                    };\r\n                    let field_name_key = NameKey::StructMember(handle, index as u32);\r\n\r\n                    for i in 0..columns as u8 {\r\n                        if i != 0 {\r\n                            write!(self.out, \"; \")?;\r\n                        }\r\n                        self.write_value_type(module, &vec_ty)?;\r\n                        write!(self.out, \" {}_{}\", &self.names[&field_name_key], i)?;\r\n                    }\r\n                }\r\n                _ => {\r\n                    // Write modifier before type\r\n                    if let Some(ref binding) = member.binding {\r\n                        self.write_modifier(binding)?;\r\n                    }\r\n\r\n                    // Even though Naga IR matrices are column-major, we must describe\r\n                    // matrices passed from the CPU as being in row-major order.\r\n                    // See the module-level block comment in mod.rs for details.\r\n                    if let TypeInner::Matrix { .. } = module.types[member.ty].inner {\r\n                        write!(self.out, \"row_major \")?;\r\n                    }\r\n\r\n                    // Write the member type and name\r\n                    self.write_type(module, member.ty)?;\r\n                    write!(\r\n                        self.out,\r\n                        \" {}\",\r\n                        &self.names[&NameKey::StructMember(handle, index as u32)]\r\n                    )?;\r\n                }\r\n            }\r\n\r\n            if let Some(ref binding) = member.binding {\r\n                self.write_semantic(binding, shader_stage)?;\r\n            };\r\n            writeln!(self.out, \";\")?;\r\n        }\r\n\r\n        // add padding at the end since sizes of types don't get rounded up to their alignment in HLSL\r\n        if members.last().unwrap().binding.is_none() && span > last_offset {\r\n            let padding = (span - last_offset) / 4;\r\n            for i in 0..padding {\r\n                writeln!(self.out, \"{}int _end_pad_{};\", back::INDENT, i)?;\r\n            }\r\n        }\r\n\r\n        writeln!(self.out, \"}};\")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write global/structs non image/sampler types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    pub(super) fn write_global_type(\r\n        &mut self,\r\n        module: &Module,\r\n        ty: Handle<crate::Type>,\r\n    ) -> BackendResult {\r\n        let matrix_data = get_inner_matrix_data(module, ty);\r\n\r\n        // We treat matrices of the form `matCx2` as a sequence of C `vec2`s.\r\n        // See the module-level block comment in mod.rs for details.\r\n        if let Some(MatrixType {\r\n            columns,\r\n            rows: crate::VectorSize::Bi,\r\n            width: 4,\r\n        }) = matrix_data\r\n        {\r\n            write!(self.out, \"__mat{}x2\", columns as u8)?;\r\n        } else {\r\n            // Even though Naga IR matrices are column-major, we must describe\r\n            // matrices passed from the CPU as being in row-major order.\r\n            // See the module-level block comment in mod.rs for details.\r\n            if matrix_data.is_some() {\r\n                write!(self.out, \"row_major \")?;\r\n            }\r\n\r\n            self.write_type(module, ty)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write non image/sampler types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    pub(super) fn write_type(&mut self, module: &Module, ty: Handle<crate::Type>) -> BackendResult {\r\n        let inner = &module.types[ty].inner;\r\n        match *inner {\r\n            TypeInner::Struct { .. } => write!(self.out, \"{}\", self.names[&NameKey::Type(ty)])?,\r\n            // hlsl array has the size separated from the base type\r\n            TypeInner::Array { base, .. } | TypeInner::BindingArray { base, .. } => {\r\n                self.write_type(module, base)?\r\n            }\r\n            ref other => self.write_value_type(module, other)?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write value types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    pub(super) fn write_value_type(&mut self, module: &Module, inner: &TypeInner) -> BackendResult {\r\n        match *inner {\r\n            TypeInner::Scalar { kind, width } | TypeInner::Atomic { kind, width } => {\r\n                write!(self.out, \"{}\", kind.to_hlsl_str(width)?)?;\r\n            }\r\n            TypeInner::Vector { size, kind, width } => {\r\n                write!(\r\n                    self.out,\r\n                    \"{}{}\",\r\n                    kind.to_hlsl_str(width)?,\r\n                    back::vector_size_str(size)\r\n                )?;\r\n            }\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                // The IR supports only float matrix\r\n                // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-matrix\r\n\r\n                // Because of the implicit transpose all matrices have in HLSL, we need to transpose the size as well.\r\n                write!(\r\n                    self.out,\r\n                    \"{}{}x{}\",\r\n                    crate::ScalarKind::Float.to_hlsl_str(width)?,\r\n                    back::vector_size_str(columns),\r\n                    back::vector_size_str(rows),\r\n                )?;\r\n            }\r\n            TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class,\r\n            } => {\r\n                self.write_image_type(dim, arrayed, class)?;\r\n            }\r\n            TypeInner::Sampler { comparison } => {\r\n                let sampler = if comparison {\r\n                    \"SamplerComparisonState\"\r\n                } else {\r\n                    \"SamplerState\"\r\n                };\r\n                write!(self.out, \"{}\", sampler)?;\r\n            }\r\n            // HLSL arrays are written as `type name[size]`\r\n            // Current code is written arrays only as `[size]`\r\n            // Base `type` and `name` should be written outside\r\n            TypeInner::Array { base, size, .. } | TypeInner::BindingArray { base, size } => {\r\n                self.write_array_size(module, base, size)?;\r\n            }\r\n            _ => {\r\n                return Err(Error::Unimplemented(format!(\r\n                    \"write_value_type {:?}\",\r\n                    inner\r\n                )))\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write functions\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_function(\r\n        &mut self,\r\n        module: &Module,\r\n        name: &str,\r\n        func: &crate::Function,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n    ) -> BackendResult {\r\n        // Function Declaration Syntax - https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-function-syntax\r\n\r\n        // Write modifier\r\n        if let Some(crate::FunctionResult {\r\n            binding:\r\n                Some(\r\n                    ref binding @ crate::Binding::BuiltIn(crate::BuiltIn::Position {\r\n                        invariant: true,\r\n                    }),\r\n                ),\r\n            ..\r\n        }) = func.result\r\n        {\r\n            self.write_modifier(binding)?;\r\n        }\r\n\r\n        // Write return type\r\n        if let Some(ref result) = func.result {\r\n            match func_ctx.ty {\r\n                back::FunctionType::Function(_) => {\r\n                    self.write_type(module, result.ty)?;\r\n                }\r\n                back::FunctionType::EntryPoint(index) => {\r\n                    if let Some(ref ep_output) = self.entry_point_io[index as usize].output {\r\n                        write!(self.out, \"{}\", ep_output.ty_name)?;\r\n                    } else {\r\n                        self.write_type(module, result.ty)?;\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            write!(self.out, \"void\")?;\r\n        }\r\n\r\n        // Write function name\r\n        write!(self.out, \" {}(\", name)?;\r\n\r\n        // Write function arguments for non entry point functions\r\n        match func_ctx.ty {\r\n            back::FunctionType::Function(handle) => {\r\n                for (index, arg) in func.arguments.iter().enumerate() {\r\n                    if index != 0 {\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                    // Write argument type\r\n                    let arg_ty = match module.types[arg.ty].inner {\r\n                        // pointers in function arguments are expected and resolve to `inout`\r\n                        TypeInner::Pointer { base, .. } => {\r\n                            //TODO: can we narrow this down to just `in` when possible?\r\n                            write!(self.out, \"inout \")?;\r\n                            base\r\n                        }\r\n                        _ => arg.ty,\r\n                    };\r\n                    self.write_type(module, arg_ty)?;\r\n\r\n                    let argument_name =\r\n                        &self.names[&NameKey::FunctionArgument(handle, index as u32)];\r\n\r\n                    // Write argument name. Space is important.\r\n                    write!(self.out, \" {}\", argument_name)?;\r\n                    if let TypeInner::Array { base, size, .. } = module.types[arg.ty].inner {\r\n                        self.write_array_size(module, base, size)?;\r\n                    }\r\n                }\r\n            }\r\n            back::FunctionType::EntryPoint(ep_index) => {\r\n                if let Some(ref ep_input) = self.entry_point_io[ep_index as usize].input {\r\n                    write!(self.out, \"{} {}\", ep_input.ty_name, ep_input.arg_name,)?;\r\n                } else {\r\n                    let stage = module.entry_points[ep_index as usize].stage;\r\n                    for (index, arg) in func.arguments.iter().enumerate() {\r\n                        if index != 0 {\r\n                            write!(self.out, \", \")?;\r\n                        }\r\n                        self.write_type(module, arg.ty)?;\r\n\r\n                        let argument_name =\r\n                            &self.names[&NameKey::EntryPointArgument(ep_index, index as u32)];\r\n\r\n                        write!(self.out, \" {}\", argument_name)?;\r\n                        if let TypeInner::Array { base, size, .. } = module.types[arg.ty].inner {\r\n                            self.write_array_size(module, base, size)?;\r\n                        }\r\n\r\n                        if let Some(ref binding) = arg.binding {\r\n                            self.write_semantic(binding, Some((stage, Io::Input)))?;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // Ends of arguments\r\n        write!(self.out, \")\")?;\r\n\r\n        // Write semantic if it present\r\n        if let back::FunctionType::EntryPoint(index) = func_ctx.ty {\r\n            let stage = module.entry_points[index as usize].stage;\r\n            if let Some(crate::FunctionResult {\r\n                binding: Some(ref binding),\r\n                ..\r\n            }) = func.result\r\n            {\r\n                self.write_semantic(binding, Some((stage, Io::Output)))?;\r\n            }\r\n        }\r\n\r\n        // Function body start\r\n        writeln!(self.out)?;\r\n        writeln!(self.out, \"{{\")?;\r\n\r\n        if let back::FunctionType::EntryPoint(index) = func_ctx.ty {\r\n            self.write_ep_arguments_initialization(module, func, index)?;\r\n        }\r\n\r\n        // Write function local variables\r\n        for (handle, local) in func.local_variables.iter() {\r\n            // Write indentation (only for readability)\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n\r\n            // Write the local name\r\n            // The leading space is important\r\n            self.write_type(module, local.ty)?;\r\n            write!(self.out, \" {}\", self.names[&func_ctx.name_key(handle)])?;\r\n            // Write size for array type\r\n            if let TypeInner::Array { base, size, .. } = module.types[local.ty].inner {\r\n                self.write_array_size(module, base, size)?;\r\n            }\r\n\r\n            write!(self.out, \" = \")?;\r\n            // Write the local initializer if needed\r\n            if let Some(init) = local.init {\r\n                // Put the equal signal only if there's a initializer\r\n                // The leading and trailing spaces aren't needed but help with readability\r\n\r\n                // Write the constant\r\n                // `write_constant` adds no trailing or leading space/newline\r\n                self.write_constant(module, init)?;\r\n            } else {\r\n                // Zero initialize local variables\r\n                self.write_default_init(module, local.ty)?;\r\n            }\r\n\r\n            // Finish the local with `;` and add a newline (only for readability)\r\n            writeln!(self.out, \";\")?\r\n        }\r\n\r\n        if !func.local_variables.is_empty() {\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // Write the function body (statement list)\r\n        for sta in func.body.iter() {\r\n            // The indentation should always be 1 when writing the function body\r\n            self.write_stmt(module, sta, func_ctx, back::Level(1))?;\r\n        }\r\n\r\n        writeln!(self.out, \"}}\")?;\r\n\r\n        self.named_expressions.clear();\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write statements\r\n    ///\r\n    /// # Notes\r\n    /// Always adds a newline\r\n    fn write_stmt(\r\n        &mut self,\r\n        module: &Module,\r\n        stmt: &crate::Statement,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n        level: back::Level,\r\n    ) -> BackendResult {\r\n        use crate::Statement;\r\n\r\n        match *stmt {\r\n            Statement::Emit(ref range) => {\r\n                for handle in range.clone() {\r\n                    let info = &func_ctx.info[handle];\r\n                    let ptr_class = info.ty.inner_with(&module.types).pointer_space();\r\n                    let expr_name = if ptr_class.is_some() {\r\n                        // HLSL can't save a pointer-valued expression in a variable,\r\n                        // but we shouldn't ever need to: they should never be named expressions,\r\n                        // and none of the expression types flagged by bake_ref_count can be pointer-valued.\r\n                        None\r\n                    } else if let Some(name) = func_ctx.named_expressions.get(&handle) {\r\n                        // Front end provides names for all variables at the start of writing.\r\n                        // But we write them to step by step. We need to recache them\r\n                        // Otherwise, we could accidentally write variable name instead of full expression.\r\n                        // Also, we use sanitized names! It defense backend from generating variable with name from reserved keywords.\r\n                        Some(self.namer.call(name))\r\n                    } else if info.ref_count == 0 {\r\n                        Some(self.namer.call(\"\"))\r\n                    } else {\r\n                        let min_ref_count = func_ctx.expressions[handle].bake_ref_count();\r\n                        if min_ref_count <= info.ref_count {\r\n                            Some(format!(\"_expr{}\", handle.index()))\r\n                        } else {\r\n                            None\r\n                        }\r\n                    };\r\n\r\n                    if let Some(name) = expr_name {\r\n                        write!(self.out, \"{}\", level)?;\r\n                        self.write_named_expr(module, handle, name, func_ctx)?;\r\n                    }\r\n                }\r\n            }\r\n            // TODO: copy-paste from glsl-out\r\n            Statement::Block(ref block) => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"{{\")?;\r\n                for sta in block.iter() {\r\n                    // Increase the indentation to help with readability\r\n                    self.write_stmt(module, sta, func_ctx, level.next())?\r\n                }\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            // TODO: copy-paste from glsl-out\r\n            Statement::If {\r\n                condition,\r\n                ref accept,\r\n                ref reject,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"if (\")?;\r\n                self.write_expr(module, condition, func_ctx)?;\r\n                writeln!(self.out, \") {{\")?;\r\n\r\n                let l2 = level.next();\r\n                for sta in accept {\r\n                    // Increase indentation to help with readability\r\n                    self.write_stmt(module, sta, func_ctx, l2)?;\r\n                }\r\n\r\n                // If there are no statements in the reject block we skip writing it\r\n                // This is only for readability\r\n                if !reject.is_empty() {\r\n                    writeln!(self.out, \"{}}} else {{\", level)?;\r\n\r\n                    for sta in reject {\r\n                        // Increase indentation to help with readability\r\n                        self.write_stmt(module, sta, func_ctx, l2)?;\r\n                    }\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            // TODO: copy-paste from glsl-out\r\n            Statement::Kill => writeln!(self.out, \"{}discard;\", level)?,\r\n            Statement::Return { value: None } => {\r\n                writeln!(self.out, \"{}return;\", level)?;\r\n            }\r\n            Statement::Return { value: Some(expr) } => {\r\n                let base_ty_res = &func_ctx.info[expr].ty;\r\n                let mut resolved = base_ty_res.inner_with(&module.types);\r\n                if let TypeInner::Pointer { base, space: _ } = *resolved {\r\n                    resolved = &module.types[base].inner;\r\n                }\r\n\r\n                if let TypeInner::Struct { .. } = *resolved {\r\n                    // We can safely unwrap here, since we now we working with struct\r\n                    let ty = base_ty_res.handle().unwrap();\r\n                    let struct_name = &self.names[&NameKey::Type(ty)];\r\n                    let variable_name = self.namer.call(&struct_name.to_lowercase());\r\n                    write!(\r\n                        self.out,\r\n                        \"{}const {} {} = \",\r\n                        level, struct_name, variable_name,\r\n                    )?;\r\n                    self.write_expr(module, expr, func_ctx)?;\r\n                    writeln!(self.out, \";\")?;\r\n\r\n                    // for entry point returns, we may need to reshuffle the outputs into a different struct\r\n                    let ep_output = match func_ctx.ty {\r\n                        back::FunctionType::Function(_) => None,\r\n                        back::FunctionType::EntryPoint(index) => {\r\n                            self.entry_point_io[index as usize].output.as_ref()\r\n                        }\r\n                    };\r\n                    let final_name = match ep_output {\r\n                        Some(ep_output) => {\r\n                            let final_name = self.namer.call(&variable_name);\r\n                            write!(\r\n                                self.out,\r\n                                \"{}const {} {} = {{ \",\r\n                                level, ep_output.ty_name, final_name,\r\n                            )?;\r\n                            for (index, m) in ep_output.members.iter().enumerate() {\r\n                                if index != 0 {\r\n                                    write!(self.out, \", \")?;\r\n                                }\r\n                                let member_name = &self.names[&NameKey::StructMember(ty, m.index)];\r\n                                write!(self.out, \"{}.{}\", variable_name, member_name)?;\r\n                            }\r\n                            writeln!(self.out, \" }};\")?;\r\n                            final_name\r\n                        }\r\n                        None => variable_name,\r\n                    };\r\n                    writeln!(self.out, \"{}return {};\", level, final_name)?;\r\n                } else {\r\n                    write!(self.out, \"{}return \", level)?;\r\n                    self.write_expr(module, expr, func_ctx)?;\r\n                    writeln!(self.out, \";\")?\r\n                }\r\n            }\r\n            Statement::Store { pointer, value } => {\r\n                let ty_inner = func_ctx.info[pointer].ty.inner_with(&module.types);\r\n                if let Some(crate::AddressSpace::Storage { .. }) = ty_inner.pointer_space() {\r\n                    let var_handle = self.fill_access_chain(module, pointer, func_ctx)?;\r\n                    self.write_storage_store(\r\n                        module,\r\n                        var_handle,\r\n                        StoreValue::Expression(value),\r\n                        func_ctx,\r\n                        level,\r\n                    )?;\r\n                } else {\r\n                    // We treat matrices of the form `matCx2` as a sequence of C `vec2`s.\r\n                    // See the module-level block comment in mod.rs for details.\r\n                    //\r\n                    // We handle matrix Stores here directly (including sub accesses for Vectors and Scalars).\r\n                    // Loads are handled by `Expression::AccessIndex` (since sub accesses work fine for Loads).\r\n                    struct MatrixAccess {\r\n                        base: Handle<crate::Expression>,\r\n                        index: u32,\r\n                    }\r\n                    enum Index {\r\n                        Expression(Handle<crate::Expression>),\r\n                        Static(u32),\r\n                    }\r\n\r\n                    let get_members = |expr: Handle<crate::Expression>| {\r\n                        let base_ty_res = &func_ctx.info[expr].ty;\r\n                        let resolved = base_ty_res.inner_with(&module.types);\r\n                        match *resolved {\r\n                            TypeInner::Pointer { base, .. } => match module.types[base].inner {\r\n                                TypeInner::Struct { ref members, .. } => Some(members),\r\n                                _ => None,\r\n                            },\r\n                            _ => None,\r\n                        }\r\n                    };\r\n\r\n                    let mut matrix = None;\r\n                    let mut vector = None;\r\n                    let mut scalar = None;\r\n\r\n                    let mut current_expr = pointer;\r\n                    for _ in 0..3 {\r\n                        let resolved = func_ctx.info[current_expr].ty.inner_with(&module.types);\r\n\r\n                        match (resolved, &func_ctx.expressions[current_expr]) {\r\n                            (\r\n                                &TypeInner::Pointer { base: ty, .. },\r\n                                &crate::Expression::AccessIndex { base, index },\r\n                            ) if matches!(\r\n                                module.types[ty].inner,\r\n                                TypeInner::Matrix {\r\n                                    rows: crate::VectorSize::Bi,\r\n                                    ..\r\n                                }\r\n                            ) && get_members(base)\r\n                                .map(|members| members[index as usize].binding.is_none())\r\n                                == Some(true) =>\r\n                            {\r\n                                matrix = Some(MatrixAccess { base, index });\r\n                                break;\r\n                            }\r\n                            (\r\n                                &TypeInner::ValuePointer {\r\n                                    size: Some(crate::VectorSize::Bi),\r\n                                    ..\r\n                                },\r\n                                &crate::Expression::Access { base, index },\r\n                            ) => {\r\n                                vector = Some(Index::Expression(index));\r\n                                current_expr = base;\r\n                            }\r\n                            (\r\n                                &TypeInner::ValuePointer {\r\n                                    size: Some(crate::VectorSize::Bi),\r\n                                    ..\r\n                                },\r\n                                &crate::Expression::AccessIndex { base, index },\r\n                            ) => {\r\n                                vector = Some(Index::Static(index));\r\n                                current_expr = base;\r\n                            }\r\n                            (\r\n                                &TypeInner::ValuePointer { size: None, .. },\r\n                                &crate::Expression::Access { base, index },\r\n                            ) => {\r\n                                scalar = Some(Index::Expression(index));\r\n                                current_expr = base;\r\n                            }\r\n                            (\r\n                                &TypeInner::ValuePointer { size: None, .. },\r\n                                &crate::Expression::AccessIndex { base, index },\r\n                            ) => {\r\n                                scalar = Some(Index::Static(index));\r\n                                current_expr = base;\r\n                            }\r\n                            _ => break,\r\n                        }\r\n                    }\r\n\r\n                    write!(self.out, \"{}\", level)?;\r\n\r\n                    if let Some(MatrixAccess { index, base }) = matrix {\r\n                        let base_ty_res = &func_ctx.info[base].ty;\r\n                        let resolved = base_ty_res.inner_with(&module.types);\r\n                        let ty = match *resolved {\r\n                            TypeInner::Pointer { base, .. } => base,\r\n                            _ => base_ty_res.handle().unwrap(),\r\n                        };\r\n\r\n                        if let Some(Index::Static(vec_index)) = vector {\r\n                            self.write_expr(module, base, func_ctx)?;\r\n                            write!(\r\n                                self.out,\r\n                                \".{}_{}\",\r\n                                &self.names[&NameKey::StructMember(ty, index)],\r\n                                vec_index\r\n                            )?;\r\n\r\n                            if let Some(scalar_index) = scalar {\r\n                                write!(self.out, \"[\")?;\r\n                                match scalar_index {\r\n                                    Index::Static(index) => {\r\n                                        write!(self.out, \"{}\", index)?;\r\n                                    }\r\n                                    Index::Expression(index) => {\r\n                                        self.write_expr(module, index, func_ctx)?;\r\n                                    }\r\n                                }\r\n                                write!(self.out, \"]\")?;\r\n                            }\r\n\r\n                            write!(self.out, \" = \")?;\r\n                            self.write_expr(module, value, func_ctx)?;\r\n                            writeln!(self.out, \";\")?;\r\n                        } else {\r\n                            let access = WrappedStructMatrixAccess { ty, index };\r\n                            match (&vector, &scalar) {\r\n                                (&Some(_), &Some(_)) => {\r\n                                    self.write_wrapped_struct_matrix_set_scalar_function_name(\r\n                                        access,\r\n                                    )?;\r\n                                }\r\n                                (&Some(_), &None) => {\r\n                                    self.write_wrapped_struct_matrix_set_vec_function_name(access)?;\r\n                                }\r\n                                (&None, _) => {\r\n                                    self.write_wrapped_struct_matrix_set_function_name(access)?;\r\n                                }\r\n                            }\r\n\r\n                            write!(self.out, \"(\")?;\r\n                            self.write_expr(module, base, func_ctx)?;\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, value, func_ctx)?;\r\n\r\n                            if let Some(Index::Expression(vec_index)) = vector {\r\n                                write!(self.out, \", \")?;\r\n                                self.write_expr(module, vec_index, func_ctx)?;\r\n\r\n                                if let Some(scalar_index) = scalar {\r\n                                    write!(self.out, \", \")?;\r\n                                    match scalar_index {\r\n                                        Index::Static(index) => {\r\n                                            write!(self.out, \"{}\", index)?;\r\n                                        }\r\n                                        Index::Expression(index) => {\r\n                                            self.write_expr(module, index, func_ctx)?;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            writeln!(self.out, \");\")?;\r\n                        }\r\n                    } else {\r\n                        // We handle `Store`s to __matCx2 column vectors and scalar elements via\r\n                        // the previously injected functions __set_col_of_matCx2 / __set_el_of_matCx2.\r\n                        struct MatrixData {\r\n                            columns: crate::VectorSize,\r\n                            base: Handle<crate::Expression>,\r\n                        }\r\n\r\n                        enum Index {\r\n                            Expression(Handle<crate::Expression>),\r\n                            Static(u32),\r\n                        }\r\n\r\n                        let mut matrix = None;\r\n                        let mut vector = None;\r\n                        let mut scalar = None;\r\n\r\n                        let mut current_expr = pointer;\r\n                        for _ in 0..3 {\r\n                            let resolved = func_ctx.info[current_expr].ty.inner_with(&module.types);\r\n                            match (resolved, &func_ctx.expressions[current_expr]) {\r\n                                (\r\n                                    &TypeInner::ValuePointer {\r\n                                        size: Some(crate::VectorSize::Bi),\r\n                                        ..\r\n                                    },\r\n                                    &crate::Expression::Access { base, index },\r\n                                ) => {\r\n                                    vector = Some(index);\r\n                                    current_expr = base;\r\n                                }\r\n                                (\r\n                                    &TypeInner::ValuePointer { size: None, .. },\r\n                                    &crate::Expression::Access { base, index },\r\n                                ) => {\r\n                                    scalar = Some(Index::Expression(index));\r\n                                    current_expr = base;\r\n                                }\r\n                                (\r\n                                    &TypeInner::ValuePointer { size: None, .. },\r\n                                    &crate::Expression::AccessIndex { base, index },\r\n                                ) => {\r\n                                    scalar = Some(Index::Static(index));\r\n                                    current_expr = base;\r\n                                }\r\n                                _ => {\r\n                                    if let Some(MatrixType {\r\n                                        columns,\r\n                                        rows: crate::VectorSize::Bi,\r\n                                        width: 4,\r\n                                    }) = get_inner_matrix_of_struct_array_member(\r\n                                        module,\r\n                                        current_expr,\r\n                                        func_ctx,\r\n                                        true,\r\n                                    ) {\r\n                                        matrix = Some(MatrixData {\r\n                                            columns,\r\n                                            base: current_expr,\r\n                                        });\r\n                                    }\r\n\r\n                                    break;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if let (Some(MatrixData { columns, base }), Some(vec_index)) =\r\n                            (matrix, vector)\r\n                        {\r\n                            if scalar.is_some() {\r\n                                write!(self.out, \"__set_el_of_mat{}x2\", columns as u8)?;\r\n                            } else {\r\n                                write!(self.out, \"__set_col_of_mat{}x2\", columns as u8)?;\r\n                            }\r\n                            write!(self.out, \"(\")?;\r\n                            self.write_expr(module, base, func_ctx)?;\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, vec_index, func_ctx)?;\r\n\r\n                            if let Some(scalar_index) = scalar {\r\n                                write!(self.out, \", \")?;\r\n                                match scalar_index {\r\n                                    Index::Static(index) => {\r\n                                        write!(self.out, \"{}\", index)?;\r\n                                    }\r\n                                    Index::Expression(index) => {\r\n                                        self.write_expr(module, index, func_ctx)?;\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, value, func_ctx)?;\r\n\r\n                            writeln!(self.out, \");\")?;\r\n                        } else {\r\n                            self.write_expr(module, pointer, func_ctx)?;\r\n                            write!(self.out, \" = \")?;\r\n\r\n                            // We cast the RHS of this store in cases where the LHS\r\n                            // is a struct member with type:\r\n                            //  - matCx2 or\r\n                            //  - a (possibly nested) array of matCx2's\r\n                            if let Some(MatrixType {\r\n                                columns,\r\n                                rows: crate::VectorSize::Bi,\r\n                                width: 4,\r\n                            }) = get_inner_matrix_of_struct_array_member(\r\n                                module, pointer, func_ctx, false,\r\n                            ) {\r\n                                let mut resolved =\r\n                                    func_ctx.info[pointer].ty.inner_with(&module.types);\r\n                                if let TypeInner::Pointer { base, .. } = *resolved {\r\n                                    resolved = &module.types[base].inner;\r\n                                }\r\n\r\n                                write!(self.out, \"(__mat{}x2\", columns as u8)?;\r\n                                if let TypeInner::Array { base, size, .. } = *resolved {\r\n                                    self.write_array_size(module, base, size)?;\r\n                                }\r\n                                write!(self.out, \")\")?;\r\n                            }\r\n\r\n                            self.write_expr(module, value, func_ctx)?;\r\n                            writeln!(self.out, \";\")?\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            Statement::Loop {\r\n                ref body,\r\n                ref continuing,\r\n                break_if,\r\n            } => {\r\n                let l2 = level.next();\r\n                if !continuing.is_empty() || break_if.is_some() {\r\n                    let gate_name = self.namer.call(\"loop_init\");\r\n                    writeln!(self.out, \"{}bool {} = true;\", level, gate_name)?;\r\n                    writeln!(self.out, \"{}while(true) {{\", level)?;\r\n                    writeln!(self.out, \"{}if (!{}) {{\", l2, gate_name)?;\r\n                    let l3 = l2.next();\r\n                    for sta in continuing.iter() {\r\n                        self.write_stmt(module, sta, func_ctx, l3)?;\r\n                    }\r\n                    if let Some(condition) = break_if {\r\n                        write!(self.out, \"{}if (\", l3)?;\r\n                        self.write_expr(module, condition, func_ctx)?;\r\n                        writeln!(self.out, \") {{\")?;\r\n                        writeln!(self.out, \"{}break;\", l3.next())?;\r\n                        writeln!(self.out, \"{}}}\", l3)?;\r\n                    }\r\n                    writeln!(self.out, \"{}}}\", l2)?;\r\n                    writeln!(self.out, \"{}{} = false;\", l2, gate_name)?;\r\n                } else {\r\n                    writeln!(self.out, \"{}while(true) {{\", level)?;\r\n                }\r\n\r\n                for sta in body.iter() {\r\n                    self.write_stmt(module, sta, func_ctx, l2)?;\r\n                }\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            Statement::Break => writeln!(self.out, \"{}break;\", level)?,\r\n            Statement::Continue => writeln!(self.out, \"{}continue;\", level)?,\r\n            Statement::Barrier(barrier) => {\r\n                if barrier.contains(crate::Barrier::STORAGE) {\r\n                    writeln!(self.out, \"{}DeviceMemoryBarrierWithGroupSync();\", level)?;\r\n                }\r\n\r\n                if barrier.contains(crate::Barrier::WORK_GROUP) {\r\n                    writeln!(self.out, \"{}GroupMemoryBarrierWithGroupSync();\", level)?;\r\n                }\r\n            }\r\n            Statement::ImageStore {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                value,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                self.write_expr(module, image, func_ctx)?;\r\n\r\n                write!(self.out, \"[\")?;\r\n                if let Some(index) = array_index {\r\n                    // Array index accepted only for texture_storage_2d_array, so we can safety use int3(coordinate, array_index) here\r\n                    write!(self.out, \"int3(\")?;\r\n                    self.write_expr(module, coordinate, func_ctx)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, index, func_ctx)?;\r\n                    write!(self.out, \")\")?;\r\n                } else {\r\n                    self.write_expr(module, coordinate, func_ctx)?;\r\n                }\r\n                write!(self.out, \"]\")?;\r\n\r\n                write!(self.out, \" = \")?;\r\n                self.write_expr(module, value, func_ctx)?;\r\n                writeln!(self.out, \";\")?;\r\n            }\r\n            Statement::Call {\r\n                function,\r\n                ref arguments,\r\n                result,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                if let Some(expr) = result {\r\n                    write!(self.out, \"const \")?;\r\n                    let name = format!(\"{}{}\", back::BAKE_PREFIX, expr.index());\r\n                    let expr_ty = &func_ctx.info[expr].ty;\r\n                    match *expr_ty {\r\n                        proc::TypeResolution::Handle(handle) => self.write_type(module, handle)?,\r\n                        proc::TypeResolution::Value(ref value) => {\r\n                            self.write_value_type(module, value)?\r\n                        }\r\n                    };\r\n                    write!(self.out, \" {} = \", name)?;\r\n                    self.named_expressions.insert(expr, name);\r\n                }\r\n                let func_name = &self.names[&NameKey::Function(function)];\r\n                write!(self.out, \"{}(\", func_name)?;\r\n                for (index, argument) in arguments.iter().enumerate() {\r\n                    self.write_expr(module, *argument, func_ctx)?;\r\n                    // Only write a comma if isn't the last element\r\n                    if index != arguments.len().saturating_sub(1) {\r\n                        // The leading space is for readability only\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                }\r\n                writeln!(self.out, \");\")?\r\n            }\r\n            Statement::Atomic {\r\n                pointer,\r\n                ref fun,\r\n                value,\r\n                result,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                let res_name = format!(\"{}{}\", back::BAKE_PREFIX, result.index());\r\n                match func_ctx.info[result].ty {\r\n                    proc::TypeResolution::Handle(handle) => self.write_type(module, handle)?,\r\n                    proc::TypeResolution::Value(ref value) => {\r\n                        self.write_value_type(module, value)?\r\n                    }\r\n                };\r\n\r\n                let var_handle = self.fill_access_chain(module, pointer, func_ctx)?;\r\n                // working around the borrow checker in `self.write_expr`\r\n                let chain = mem::take(&mut self.temp_access_chain);\r\n                let var_name = &self.names[&NameKey::GlobalVariable(var_handle)];\r\n\r\n                let fun_str = fun.to_hlsl_suffix();\r\n                write!(\r\n                    self.out,\r\n                    \" {}; {}.Interlocked{}(\",\r\n                    res_name, var_name, fun_str\r\n                )?;\r\n                self.write_storage_address(module, &chain, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                // handle the special cases\r\n                match *fun {\r\n                    crate::AtomicFunction::Subtract => {\r\n                        // we just wrote `InterlockedAdd`, so negate the argument\r\n                        write!(self.out, \"-\")?;\r\n                    }\r\n                    crate::AtomicFunction::Exchange { compare: Some(_) } => {\r\n                        return Err(Error::Unimplemented(\"atomic CompareExchange\".to_string()));\r\n                    }\r\n                    _ => {}\r\n                }\r\n                self.write_expr(module, value, func_ctx)?;\r\n                writeln!(self.out, \", {});\", res_name)?;\r\n                self.temp_access_chain = chain;\r\n                self.named_expressions.insert(result, res_name);\r\n            }\r\n            Statement::Switch {\r\n                selector,\r\n                ref cases,\r\n            } => {\r\n                // Start the switch\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"switch(\")?;\r\n                self.write_expr(module, selector, func_ctx)?;\r\n                writeln!(self.out, \") {{\")?;\r\n                let type_postfix = match *func_ctx.info[selector].ty.inner_with(&module.types) {\r\n                    crate::TypeInner::Scalar {\r\n                        kind: crate::ScalarKind::Uint,\r\n                        ..\r\n                    } => \"u\",\r\n                    _ => \"\",\r\n                };\r\n\r\n                // Write all cases\r\n                let indent_level_1 = level.next();\r\n                let indent_level_2 = indent_level_1.next();\r\n\r\n                for (i, case) in cases.iter().enumerate() {\r\n                    match case.value {\r\n                        crate::SwitchValue::Integer(value) => writeln!(\r\n                            self.out,\r\n                            \"{}case {}{}: {{\",\r\n                            indent_level_1, value, type_postfix\r\n                        )?,\r\n                        crate::SwitchValue::Default => {\r\n                            writeln!(self.out, \"{}default: {{\", indent_level_1)?\r\n                        }\r\n                    }\r\n\r\n                    // FXC doesn't support fallthrough so we duplicate the body of the following case blocks\r\n                    if case.fall_through {\r\n                        let curr_len = i + 1;\r\n                        let end_case_idx = curr_len\r\n                            + cases\r\n                                .iter()\r\n                                .skip(curr_len)\r\n                                .position(|case| !case.fall_through)\r\n                                .unwrap();\r\n                        let indent_level_3 = indent_level_2.next();\r\n                        for case in &cases[i..=end_case_idx] {\r\n                            writeln!(self.out, \"{}{{\", indent_level_2)?;\r\n                            for sta in case.body.iter() {\r\n                                self.write_stmt(module, sta, func_ctx, indent_level_3)?;\r\n                            }\r\n                            writeln!(self.out, \"{}}}\", indent_level_2)?;\r\n                        }\r\n\r\n                        let last_case = &cases[end_case_idx];\r\n                        if last_case.body.last().map_or(true, |s| !s.is_terminator()) {\r\n                            writeln!(self.out, \"{}break;\", indent_level_2)?;\r\n                        }\r\n                    } else {\r\n                        for sta in case.body.iter() {\r\n                            self.write_stmt(module, sta, func_ctx, indent_level_2)?;\r\n                        }\r\n                        if case.body.last().map_or(true, |s| !s.is_terminator()) {\r\n                            writeln!(self.out, \"{}break;\", indent_level_2)?;\r\n                        }\r\n                    }\r\n\r\n                    writeln!(self.out, \"{}}}\", indent_level_1)?;\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method to write expressions\r\n    ///\r\n    /// # Notes\r\n    /// Doesn't add any newlines or leading/trailing spaces\r\n    pub(super) fn write_expr(\r\n        &mut self,\r\n        module: &Module,\r\n        expr: Handle<crate::Expression>,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n    ) -> BackendResult {\r\n        use crate::Expression;\r\n\r\n        // Handle the special semantics for base vertex/instance\r\n        let ff_input = if self.options.special_constants_binding.is_some() {\r\n            func_ctx.is_fixed_function_input(expr, module)\r\n        } else {\r\n            None\r\n        };\r\n        let closing_bracket = match ff_input {\r\n            Some(crate::BuiltIn::VertexIndex) => {\r\n                write!(self.out, \"({}.{} + \", SPECIAL_CBUF_VAR, SPECIAL_BASE_VERTEX)?;\r\n                \")\"\r\n            }\r\n            Some(crate::BuiltIn::InstanceIndex) => {\r\n                write!(\r\n                    self.out,\r\n                    \"({}.{} + \",\r\n                    SPECIAL_CBUF_VAR, SPECIAL_BASE_INSTANCE,\r\n                )?;\r\n                \")\"\r\n            }\r\n            Some(crate::BuiltIn::NumWorkGroups) => {\r\n                //Note: despite their names (`BASE_VERTEX` and `BASE_INSTANCE`),\r\n                // in compute shaders the special constants contain the number\r\n                // of workgroups, which we are using here.\r\n                write!(\r\n                    self.out,\r\n                    \"uint3({}.{}, {}.{}, {}.{})\",\r\n                    SPECIAL_CBUF_VAR,\r\n                    SPECIAL_BASE_VERTEX,\r\n                    SPECIAL_CBUF_VAR,\r\n                    SPECIAL_BASE_INSTANCE,\r\n                    SPECIAL_CBUF_VAR,\r\n                    SPECIAL_OTHER,\r\n                )?;\r\n                return Ok(());\r\n            }\r\n            _ => \"\",\r\n        };\r\n\r\n        if let Some(name) = self.named_expressions.get(&expr) {\r\n            write!(self.out, \"{}{}\", name, closing_bracket)?;\r\n            return Ok(());\r\n        }\r\n\r\n        let expression = &func_ctx.expressions[expr];\r\n\r\n        match *expression {\r\n            Expression::Constant(constant) => self.write_constant(module, constant)?,\r\n            Expression::Compose { ty, ref components } => {\r\n                match module.types[ty].inner {\r\n                    TypeInner::Struct { .. } | TypeInner::Array { .. } => {\r\n                        self.write_wrapped_constructor_function_name(\r\n                            module,\r\n                            WrappedConstructor { ty },\r\n                        )?;\r\n                    }\r\n                    _ => {\r\n                        self.write_type(module, ty)?;\r\n                    }\r\n                };\r\n\r\n                write!(self.out, \"(\")?;\r\n\r\n                for (index, &component) in components.iter().enumerate() {\r\n                    if index != 0 {\r\n                        // The leading space is for readability only\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                    self.write_expr(module, component, func_ctx)?;\r\n                }\r\n\r\n                write!(self.out, \")\")?;\r\n            }\r\n            // All of the multiplication can be expressed as `mul`,\r\n            // except vector * vector, which needs to use the \"*\" operator.\r\n            Expression::Binary {\r\n                op: crate::BinaryOperator::Multiply,\r\n                left,\r\n                right,\r\n            } if func_ctx.info[left].ty.inner_with(&module.types).is_matrix()\r\n                || func_ctx.info[right]\r\n                    .ty\r\n                    .inner_with(&module.types)\r\n                    .is_matrix() =>\r\n            {\r\n                // We intentionally flip the order of multiplication as our matrices are implicitly transposed.\r\n                write!(self.out, \"mul(\")?;\r\n                self.write_expr(module, right, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, left, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n\r\n            // TODO: handle undefined behavior of BinaryOperator::Modulo\r\n            //\r\n            // sint:\r\n            // if right == 0 return 0\r\n            // if left == min(type_of(left)) && right == -1 return 0\r\n            // if sign(left) != sign(right) return result as defined by WGSL\r\n            //\r\n            // uint:\r\n            // if right == 0 return 0\r\n            //\r\n            // float:\r\n            // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798\r\n\r\n            // While HLSL supports float operands with the % operator it is only\r\n            // defined in cases where both sides are either positive or negative.\r\n            Expression::Binary {\r\n                op: crate::BinaryOperator::Modulo,\r\n                left,\r\n                right,\r\n            } if func_ctx.info[left]\r\n                .ty\r\n                .inner_with(&module.types)\r\n                .scalar_kind()\r\n                == Some(crate::ScalarKind::Float) =>\r\n            {\r\n                write!(self.out, \"fmod(\")?;\r\n                self.write_expr(module, left, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, right, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Binary { op, left, right } => {\r\n                write!(self.out, \"(\")?;\r\n                self.write_expr(module, left, func_ctx)?;\r\n                write!(self.out, \" {} \", crate::back::binary_operation_str(op))?;\r\n                self.write_expr(module, right, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Access { base, index } => {\r\n                if let Some(crate::AddressSpace::Storage { .. }) = func_ctx.info[expr]\r\n                    .ty\r\n                    .inner_with(&module.types)\r\n                    .pointer_space()\r\n                {\r\n                    // do nothing, the chain is written on `Load`/`Store`\r\n                } else {\r\n                    // We use the function __get_col_of_matCx2 here in cases\r\n                    // where `base`s type resolves to a matCx2 and is part of a\r\n                    // struct member with type of (possibly nested) array of matCx2's.\r\n                    //\r\n                    // Note that this only works for `Load`s and we handle\r\n                    // `Store`s differently in `Statement::Store`.\r\n                    if let Some(MatrixType {\r\n                        columns,\r\n                        rows: crate::VectorSize::Bi,\r\n                        width: 4,\r\n                    }) = get_inner_matrix_of_struct_array_member(module, base, func_ctx, true)\r\n                    {\r\n                        write!(self.out, \"__get_col_of_mat{}x2(\", columns as u8)?;\r\n                        self.write_expr(module, base, func_ctx)?;\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, index, func_ctx)?;\r\n                        write!(self.out, \")\")?;\r\n                        return Ok(());\r\n                    }\r\n\r\n                    let base_ty_res = &func_ctx.info[base].ty;\r\n                    let resolved = base_ty_res.inner_with(&module.types);\r\n\r\n                    let non_uniform_qualifier = match *resolved {\r\n                        TypeInner::BindingArray { .. } => {\r\n                            let uniformity = &func_ctx.info[index].uniformity;\r\n\r\n                            uniformity.non_uniform_result.is_some()\r\n                        }\r\n                        _ => false,\r\n                    };\r\n\r\n                    self.write_expr(module, base, func_ctx)?;\r\n                    write!(self.out, \"[\")?;\r\n                    if non_uniform_qualifier {\r\n                        write!(self.out, \"NonUniformResourceIndex(\")?;\r\n                    }\r\n                    self.write_expr(module, index, func_ctx)?;\r\n                    if non_uniform_qualifier {\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                    write!(self.out, \"]\")?;\r\n                }\r\n            }\r\n            Expression::AccessIndex { base, index } => {\r\n                if let Some(crate::AddressSpace::Storage { .. }) = func_ctx.info[expr]\r\n                    .ty\r\n                    .inner_with(&module.types)\r\n                    .pointer_space()\r\n                {\r\n                    // do nothing, the chain is written on `Load`/`Store`\r\n                } else {\r\n                    fn write_access<W: fmt::Write>(\r\n                        writer: &mut super::Writer<'_, W>,\r\n                        resolved: &TypeInner,\r\n                        base_ty_handle: Option<Handle<crate::Type>>,\r\n                        index: u32,\r\n                    ) -> BackendResult {\r\n                        match *resolved {\r\n                            TypeInner::Vector { .. } => {\r\n                                // Write vector access as a swizzle\r\n                                write!(writer.out, \".{}\", back::COMPONENTS[index as usize])?\r\n                            }\r\n                            TypeInner::Matrix { .. }\r\n                            | TypeInner::Array { .. }\r\n                            | TypeInner::BindingArray { .. }\r\n                            | TypeInner::ValuePointer { .. } => write!(writer.out, \"[{}]\", index)?,\r\n                            TypeInner::Struct { .. } => {\r\n                                // This will never panic in case the type is a `Struct`, this is not true\r\n                                // for other types so we can only check while inside this match arm\r\n                                let ty = base_ty_handle.unwrap();\r\n\r\n                                write!(\r\n                                    writer.out,\r\n                                    \".{}\",\r\n                                    &writer.names[&NameKey::StructMember(ty, index)]\r\n                                )?\r\n                            }\r\n                            ref other => {\r\n                                return Err(Error::Custom(format!(\"Cannot index {:?}\", other)))\r\n                            }\r\n                        }\r\n                        Ok(())\r\n                    }\r\n\r\n                    // We write the matrix column access in a special way since\r\n                    // the type of `base` is our special __matCx2 struct.\r\n                    if let Some(MatrixType {\r\n                        rows: crate::VectorSize::Bi,\r\n                        width: 4,\r\n                        ..\r\n                    }) = get_inner_matrix_of_struct_array_member(module, base, func_ctx, true)\r\n                    {\r\n                        self.write_expr(module, base, func_ctx)?;\r\n                        write!(self.out, \"._{}\", index)?;\r\n                        return Ok(());\r\n                    }\r\n\r\n                    let base_ty_res = &func_ctx.info[base].ty;\r\n                    let mut resolved = base_ty_res.inner_with(&module.types);\r\n                    let base_ty_handle = match *resolved {\r\n                        TypeInner::Pointer { base, .. } => {\r\n                            resolved = &module.types[base].inner;\r\n                            Some(base)\r\n                        }\r\n                        _ => base_ty_res.handle(),\r\n                    };\r\n\r\n                    // We treat matrices of the form `matCx2` as a sequence of C `vec2`s.\r\n                    // See the module-level block comment in mod.rs for details.\r\n                    //\r\n                    // We handle matrix reconstruction here for Loads.\r\n                    // Stores are handled directly by `Statement::Store`.\r\n                    if let TypeInner::Struct { ref members, .. } = *resolved {\r\n                        let member = &members[index as usize];\r\n\r\n                        match module.types[member.ty].inner {\r\n                            TypeInner::Matrix {\r\n                                rows: crate::VectorSize::Bi,\r\n                                ..\r\n                            } if member.binding.is_none() => {\r\n                                let ty = base_ty_handle.unwrap();\r\n                                self.write_wrapped_struct_matrix_get_function_name(\r\n                                    WrappedStructMatrixAccess { ty, index },\r\n                                )?;\r\n                                write!(self.out, \"(\")?;\r\n                                self.write_expr(module, base, func_ctx)?;\r\n                                write!(self.out, \")\")?;\r\n                                return Ok(());\r\n                            }\r\n                            _ => {}\r\n                        }\r\n                    }\r\n\r\n                    self.write_expr(module, base, func_ctx)?;\r\n                    write_access(self, resolved, base_ty_handle, index)?;\r\n                }\r\n            }\r\n            Expression::FunctionArgument(pos) => {\r\n                let key = match func_ctx.ty {\r\n                    back::FunctionType::Function(handle) => NameKey::FunctionArgument(handle, pos),\r\n                    back::FunctionType::EntryPoint(index) => {\r\n                        NameKey::EntryPointArgument(index, pos)\r\n                    }\r\n                };\r\n                let name = &self.names[&key];\r\n                write!(self.out, \"{}\", name)?;\r\n            }\r\n            Expression::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                use crate::SampleLevel as Sl;\r\n                const COMPONENTS: [&str; 4] = [\"\", \"Green\", \"Blue\", \"Alpha\"];\r\n\r\n                let (base_str, component_str) = match gather {\r\n                    Some(component) => (\"Gather\", COMPONENTS[component as usize]),\r\n                    None => (\"Sample\", \"\"),\r\n                };\r\n                let cmp_str = match depth_ref {\r\n                    Some(_) => \"Cmp\",\r\n                    None => \"\",\r\n                };\r\n                let level_str = match level {\r\n                    Sl::Zero if gather.is_none() => \"LevelZero\",\r\n                    Sl::Auto | Sl::Zero => \"\",\r\n                    Sl::Exact(_) => \"Level\",\r\n                    Sl::Bias(_) => \"Bias\",\r\n                    Sl::Gradient { .. } => \"Grad\",\r\n                };\r\n\r\n                self.write_expr(module, image, func_ctx)?;\r\n                write!(\r\n                    self.out,\r\n                    \".{}{}{}{}(\",\r\n                    base_str, cmp_str, component_str, level_str\r\n                )?;\r\n                self.write_expr(module, sampler, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_texture_coordinates(\r\n                    \"float\",\r\n                    coordinate,\r\n                    array_index,\r\n                    None,\r\n                    module,\r\n                    func_ctx,\r\n                )?;\r\n\r\n                if let Some(depth_ref) = depth_ref {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, depth_ref, func_ctx)?;\r\n                }\r\n\r\n                match level {\r\n                    Sl::Auto | Sl::Zero => {}\r\n                    Sl::Exact(expr) => {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, expr, func_ctx)?;\r\n                    }\r\n                    Sl::Bias(expr) => {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, expr, func_ctx)?;\r\n                    }\r\n                    Sl::Gradient { x, y } => {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, x, func_ctx)?;\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, y, func_ctx)?;\r\n                    }\r\n                }\r\n\r\n                if let Some(offset) = offset {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_constant(module, offset)?;\r\n                }\r\n\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::ImageQuery { image, query } => {\r\n                // use wrapped image query function\r\n                if let TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class,\r\n                } = *func_ctx.info[image].ty.inner_with(&module.types)\r\n                {\r\n                    let wrapped_image_query = WrappedImageQuery {\r\n                        dim,\r\n                        arrayed,\r\n                        class,\r\n                        query: query.into(),\r\n                    };\r\n\r\n                    self.write_wrapped_image_query_function_name(wrapped_image_query)?;\r\n                    write!(self.out, \"(\")?;\r\n                    // Image always first param\r\n                    self.write_expr(module, image, func_ctx)?;\r\n                    if let crate::ImageQuery::Size { level: Some(level) } = query {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, level, func_ctx)?;\r\n                    }\r\n                    write!(self.out, \")\")?;\r\n                }\r\n            }\r\n            Expression::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => {\r\n                // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-load\r\n                self.write_expr(module, image, func_ctx)?;\r\n                write!(self.out, \".Load(\")?;\r\n\r\n                self.write_texture_coordinates(\r\n                    \"int\",\r\n                    coordinate,\r\n                    array_index,\r\n                    level,\r\n                    module,\r\n                    func_ctx,\r\n                )?;\r\n\r\n                if let Some(sample) = sample {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, sample, func_ctx)?;\r\n                }\r\n\r\n                // close bracket for Load function\r\n                write!(self.out, \")\")?;\r\n\r\n                // return x component if return type is scalar\r\n                if let TypeInner::Scalar { .. } = *func_ctx.info[expr].ty.inner_with(&module.types)\r\n                {\r\n                    write!(self.out, \".x\")?;\r\n                }\r\n            }\r\n            Expression::GlobalVariable(handle) => match module.global_variables[handle].space {\r\n                crate::AddressSpace::Storage { .. } => {}\r\n                _ => {\r\n                    let name = &self.names[&NameKey::GlobalVariable(handle)];\r\n                    write!(self.out, \"{}\", name)?;\r\n                }\r\n            },\r\n            Expression::LocalVariable(handle) => {\r\n                write!(self.out, \"{}\", self.names[&func_ctx.name_key(handle)])?\r\n            }\r\n            Expression::Load { pointer } => {\r\n                match func_ctx.info[pointer]\r\n                    .ty\r\n                    .inner_with(&module.types)\r\n                    .pointer_space()\r\n                {\r\n                    Some(crate::AddressSpace::Storage { .. }) => {\r\n                        let var_handle = self.fill_access_chain(module, pointer, func_ctx)?;\r\n                        let result_ty = func_ctx.info[expr].ty.clone();\r\n                        self.write_storage_load(module, var_handle, result_ty, func_ctx)?;\r\n                    }\r\n                    _ => {\r\n                        let mut close_paren = false;\r\n\r\n                        // We cast the value loaded to a native HLSL floatCx2\r\n                        // in cases where it is of type:\r\n                        //  - __matCx2 or\r\n                        //  - a (possibly nested) array of __matCx2's\r\n                        if let Some(MatrixType {\r\n                            rows: crate::VectorSize::Bi,\r\n                            width: 4,\r\n                            ..\r\n                        }) = get_inner_matrix_of_struct_array_member(\r\n                            module, pointer, func_ctx, false,\r\n                        )\r\n                        .or_else(|| get_inner_matrix_of_global_uniform(module, pointer, func_ctx))\r\n                        {\r\n                            let mut resolved = func_ctx.info[pointer].ty.inner_with(&module.types);\r\n                            if let TypeInner::Pointer { base, .. } = *resolved {\r\n                                resolved = &module.types[base].inner;\r\n                            }\r\n\r\n                            write!(self.out, \"((\")?;\r\n                            if let TypeInner::Array { base, size, .. } = *resolved {\r\n                                self.write_type(module, base)?;\r\n                                self.write_array_size(module, base, size)?;\r\n                            } else {\r\n                                self.write_value_type(module, resolved)?;\r\n                            }\r\n                            write!(self.out, \")\")?;\r\n                            close_paren = true;\r\n                        }\r\n\r\n                        self.write_expr(module, pointer, func_ctx)?;\r\n\r\n                        if close_paren {\r\n                            write!(self.out, \")\")?;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            Expression::Unary { op, expr } => {\r\n                use crate::{ScalarKind as Sk, UnaryOperator as Uo};\r\n                // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-operators#unary-operators\r\n                let op_str = match op {\r\n                    Uo::Negate => \"-\",\r\n                    Uo::Not => match func_ctx.info[expr]\r\n                        .ty\r\n                        .inner_with(&module.types)\r\n                        .scalar_kind()\r\n                    {\r\n                        Some(Sk::Sint) | Some(Sk::Uint) => \"~\",\r\n                        Some(Sk::Bool) => \"!\",\r\n                        ref other => {\r\n                            return Err(Error::Custom(format!(\r\n                                \"Cannot apply not to type {:?}\",\r\n                                other\r\n                            )))\r\n                        }\r\n                    },\r\n                };\r\n                write!(self.out, \"{}\", op_str)?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n            }\r\n            Expression::As {\r\n                expr,\r\n                kind,\r\n                convert,\r\n            } => {\r\n                let inner = func_ctx.info[expr].ty.inner_with(&module.types);\r\n                let get_width = |src_width| kind.to_hlsl_str(convert.unwrap_or(src_width));\r\n                match *inner {\r\n                    TypeInner::Vector { size, width, .. } => {\r\n                        write!(\r\n                            self.out,\r\n                            \"{}{}(\",\r\n                            get_width(width)?,\r\n                            back::vector_size_str(size)\r\n                        )?;\r\n                    }\r\n                    TypeInner::Scalar { width, .. } => {\r\n                        write!(self.out, \"{}(\", get_width(width)?,)?;\r\n                    }\r\n                    TypeInner::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width,\r\n                    } => {\r\n                        write!(\r\n                            self.out,\r\n                            \"{}{}x{}(\",\r\n                            get_width(width)?,\r\n                            back::vector_size_str(columns),\r\n                            back::vector_size_str(rows)\r\n                        )?;\r\n                    }\r\n                    _ => {\r\n                        return Err(Error::Unimplemented(format!(\r\n                            \"write_expr expression::as {:?}\",\r\n                            inner\r\n                        )));\r\n                    }\r\n                };\r\n                self.write_expr(module, expr, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n\r\n                enum Function {\r\n                    Asincosh { is_sin: bool },\r\n                    Atanh,\r\n                    Unpack2x16float,\r\n                    Regular(&'static str),\r\n                    MissingIntOverload(&'static str),\r\n                }\r\n\r\n                let fun = match fun {\r\n                    // comparison\r\n                    Mf::Abs => Function::Regular(\"abs\"),\r\n                    Mf::Min => Function::Regular(\"min\"),\r\n                    Mf::Max => Function::Regular(\"max\"),\r\n                    Mf::Clamp => Function::Regular(\"clamp\"),\r\n                    Mf::Saturate => Function::Regular(\"saturate\"),\r\n                    // trigonometry\r\n                    Mf::Cos => Function::Regular(\"cos\"),\r\n                    Mf::Cosh => Function::Regular(\"cosh\"),\r\n                    Mf::Sin => Function::Regular(\"sin\"),\r\n                    Mf::Sinh => Function::Regular(\"sinh\"),\r\n                    Mf::Tan => Function::Regular(\"tan\"),\r\n                    Mf::Tanh => Function::Regular(\"tanh\"),\r\n                    Mf::Acos => Function::Regular(\"acos\"),\r\n                    Mf::Asin => Function::Regular(\"asin\"),\r\n                    Mf::Atan => Function::Regular(\"atan\"),\r\n                    Mf::Atan2 => Function::Regular(\"atan2\"),\r\n                    Mf::Asinh => Function::Asincosh { is_sin: true },\r\n                    Mf::Acosh => Function::Asincosh { is_sin: false },\r\n                    Mf::Atanh => Function::Atanh,\r\n                    Mf::Radians => Function::Regular(\"radians\"),\r\n                    Mf::Degrees => Function::Regular(\"degrees\"),\r\n                    // decomposition\r\n                    Mf::Ceil => Function::Regular(\"ceil\"),\r\n                    Mf::Floor => Function::Regular(\"floor\"),\r\n                    Mf::Round => Function::Regular(\"round\"),\r\n                    Mf::Fract => Function::Regular(\"frac\"),\r\n                    Mf::Trunc => Function::Regular(\"trunc\"),\r\n                    Mf::Modf => Function::Regular(\"modf\"),\r\n                    Mf::Frexp => Function::Regular(\"frexp\"),\r\n                    Mf::Ldexp => Function::Regular(\"ldexp\"),\r\n                    // exponent\r\n                    Mf::Exp => Function::Regular(\"exp\"),\r\n                    Mf::Exp2 => Function::Regular(\"exp2\"),\r\n                    Mf::Log => Function::Regular(\"log\"),\r\n                    Mf::Log2 => Function::Regular(\"log2\"),\r\n                    Mf::Pow => Function::Regular(\"pow\"),\r\n                    // geometry\r\n                    Mf::Dot => Function::Regular(\"dot\"),\r\n                    //Mf::Outer => ,\r\n                    Mf::Cross => Function::Regular(\"cross\"),\r\n                    Mf::Distance => Function::Regular(\"distance\"),\r\n                    Mf::Length => Function::Regular(\"length\"),\r\n                    Mf::Normalize => Function::Regular(\"normalize\"),\r\n                    Mf::FaceForward => Function::Regular(\"faceforward\"),\r\n                    Mf::Reflect => Function::Regular(\"reflect\"),\r\n                    Mf::Refract => Function::Regular(\"refract\"),\r\n                    // computational\r\n                    Mf::Sign => Function::Regular(\"sign\"),\r\n                    Mf::Fma => Function::Regular(\"mad\"),\r\n                    Mf::Mix => Function::Regular(\"lerp\"),\r\n                    Mf::Step => Function::Regular(\"step\"),\r\n                    Mf::SmoothStep => Function::Regular(\"smoothstep\"),\r\n                    Mf::Sqrt => Function::Regular(\"sqrt\"),\r\n                    Mf::InverseSqrt => Function::Regular(\"rsqrt\"),\r\n                    //Mf::Inverse =>,\r\n                    Mf::Transpose => Function::Regular(\"transpose\"),\r\n                    Mf::Determinant => Function::Regular(\"determinant\"),\r\n                    // bits\r\n                    Mf::CountOneBits => Function::MissingIntOverload(\"countbits\"),\r\n                    Mf::ReverseBits => Function::MissingIntOverload(\"reversebits\"),\r\n                    Mf::FindLsb => Function::Regular(\"firstbitlow\"),\r\n                    Mf::FindMsb => Function::Regular(\"firstbithigh\"),\r\n                    Mf::Unpack2x16float => Function::Unpack2x16float,\r\n                    _ => return Err(Error::Unimplemented(format!(\"write_expr_math {:?}\", fun))),\r\n                };\r\n\r\n                match fun {\r\n                    Function::Asincosh { is_sin } => {\r\n                        write!(self.out, \"log(\")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \" + sqrt(\")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \" * \")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        match is_sin {\r\n                            true => write!(self.out, \" + 1.0))\")?,\r\n                            false => write!(self.out, \" - 1.0))\")?,\r\n                        }\r\n                    }\r\n                    Function::Atanh => {\r\n                        write!(self.out, \"0.5 * log((1.0 + \")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \") / (1.0 - \")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \"))\")?;\r\n                    }\r\n                    Function::Unpack2x16float => {\r\n                        write!(self.out, \"float2(f16tof32(\")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \"), f16tof32((\")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \") >> 16))\")?;\r\n                    }\r\n                    Function::Regular(fun_name) => {\r\n                        write!(self.out, \"{}(\", fun_name)?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        if let Some(arg) = arg1 {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                        }\r\n                        if let Some(arg) = arg2 {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                        }\r\n                        if let Some(arg) = arg3 {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                        }\r\n                        write!(self.out, \")\")?\r\n                    }\r\n                    Function::MissingIntOverload(fun_name) => {\r\n                        let scalar_kind = &func_ctx.info[arg]\r\n                            .ty\r\n                            .inner_with(&module.types)\r\n                            .scalar_kind();\r\n                        if let Some(ScalarKind::Sint) = *scalar_kind {\r\n                            write!(self.out, \"asint({}(asuint(\", fun_name)?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                            write!(self.out, \")))\")?;\r\n                        } else {\r\n                            write!(self.out, \"{}(\", fun_name)?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                            write!(self.out, \")\")?;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                self.write_expr(module, vector, func_ctx)?;\r\n                write!(self.out, \".\")?;\r\n                for &sc in pattern[..size as usize].iter() {\r\n                    self.out.write_char(back::COMPONENTS[sc as usize])?;\r\n                }\r\n            }\r\n            Expression::ArrayLength(expr) => {\r\n                let var_handle = match func_ctx.expressions[expr] {\r\n                    Expression::AccessIndex { base, index: _ } => {\r\n                        match func_ctx.expressions[base] {\r\n                            Expression::GlobalVariable(handle) => handle,\r\n                            _ => unreachable!(),\r\n                        }\r\n                    }\r\n                    Expression::GlobalVariable(handle) => handle,\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                let var = &module.global_variables[var_handle];\r\n                let (offset, stride) = match module.types[var.ty].inner {\r\n                    TypeInner::Array { stride, .. } => (0, stride),\r\n                    TypeInner::Struct { ref members, .. } => {\r\n                        let last = members.last().unwrap();\r\n                        let stride = match module.types[last.ty].inner {\r\n                            TypeInner::Array { stride, .. } => stride,\r\n                            _ => unreachable!(),\r\n                        };\r\n                        (last.offset, stride)\r\n                    }\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                let storage_access = match var.space {\r\n                    crate::AddressSpace::Storage { access } => access,\r\n                    _ => crate::StorageAccess::default(),\r\n                };\r\n                let wrapped_array_length = WrappedArrayLength {\r\n                    writable: storage_access.contains(crate::StorageAccess::STORE),\r\n                };\r\n\r\n                write!(self.out, \"((\")?;\r\n                self.write_wrapped_array_length_function_name(wrapped_array_length)?;\r\n                let var_name = &self.names[&NameKey::GlobalVariable(var_handle)];\r\n                write!(self.out, \"({}) - {}) / {})\", var_name, offset, stride)?\r\n            }\r\n            Expression::Derivative { axis, expr } => {\r\n                use crate::DerivativeAxis as Da;\r\n\r\n                let fun_str = match axis {\r\n                    Da::X => \"ddx\",\r\n                    Da::Y => \"ddy\",\r\n                    Da::Width => \"fwidth\",\r\n                };\r\n                write!(self.out, \"{}(\", fun_str)?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::Relational { fun, argument } => {\r\n                use crate::RelationalFunction as Rf;\r\n\r\n                let fun_str = match fun {\r\n                    Rf::All => \"all\",\r\n                    Rf::Any => \"any\",\r\n                    Rf::IsNan => \"isnan\",\r\n                    Rf::IsInf => \"isinf\",\r\n                    Rf::IsFinite => \"isfinite\",\r\n                    Rf::IsNormal => \"isnormal\",\r\n                };\r\n                write!(self.out, \"{}(\", fun_str)?;\r\n                self.write_expr(module, argument, func_ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::Splat { size, value } => {\r\n                // hlsl is not supported one value constructor\r\n                // if we write, for example, int4(0), dxc returns error:\r\n                // error: too few elements in vector initialization (expected 4 elements, have 1)\r\n                let number_of_components = match size {\r\n                    crate::VectorSize::Bi => \"xx\",\r\n                    crate::VectorSize::Tri => \"xxx\",\r\n                    crate::VectorSize::Quad => \"xxxx\",\r\n                };\r\n                write!(self.out, \"(\")?;\r\n                self.write_expr(module, value, func_ctx)?;\r\n                write!(self.out, \").{}\", number_of_components)?\r\n            }\r\n            Expression::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => {\r\n                write!(self.out, \"(\")?;\r\n                self.write_expr(module, condition, func_ctx)?;\r\n                write!(self.out, \" ? \")?;\r\n                self.write_expr(module, accept, func_ctx)?;\r\n                write!(self.out, \" : \")?;\r\n                self.write_expr(module, reject, func_ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            // Nothing to do here, since call expression already cached\r\n            Expression::CallResult(_) | Expression::AtomicResult { .. } => {}\r\n        }\r\n\r\n        if !closing_bracket.is_empty() {\r\n            write!(self.out, \"{}\", closing_bracket)?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write constants\r\n    ///\r\n    /// # Notes\r\n    /// Doesn't add any newlines or leading/trailing spaces\r\n    fn write_constant(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::Constant>,\r\n    ) -> BackendResult {\r\n        let constant = &module.constants[handle];\r\n        match constant.inner {\r\n            crate::ConstantInner::Scalar {\r\n                width: _,\r\n                ref value,\r\n            } => {\r\n                if constant.name.is_some() {\r\n                    write!(self.out, \"{}\", &self.names[&NameKey::Constant(handle)])?;\r\n                } else {\r\n                    self.write_scalar_value(*value)?;\r\n                }\r\n            }\r\n            crate::ConstantInner::Composite { ty, ref components } => {\r\n                self.write_composite_constant(module, ty, components)?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn write_composite_constant(\r\n        &mut self,\r\n        module: &Module,\r\n        ty: Handle<crate::Type>,\r\n        components: &[Handle<crate::Constant>],\r\n    ) -> BackendResult {\r\n        match module.types[ty].inner {\r\n            TypeInner::Struct { .. } | TypeInner::Array { .. } => {\r\n                self.write_wrapped_constructor_function_name(module, WrappedConstructor { ty })?;\r\n            }\r\n            _ => {\r\n                self.write_type(module, ty)?;\r\n            }\r\n        };\r\n        write!(self.out, \"(\")?;\r\n        for (index, constant) in components.iter().enumerate() {\r\n            self.write_constant(module, *constant)?;\r\n            // Only write a comma if isn't the last element\r\n            if index != components.len().saturating_sub(1) {\r\n                // The leading space is for readability only\r\n                write!(self.out, \", \")?;\r\n            }\r\n        }\r\n        write!(self.out, \")\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write [`ScalarValue`](crate::ScalarValue)\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    fn write_scalar_value(&mut self, value: crate::ScalarValue) -> BackendResult {\r\n        use crate::ScalarValue as Sv;\r\n\r\n        match value {\r\n            Sv::Sint(value) => write!(self.out, \"{}\", value)?,\r\n            Sv::Uint(value) => write!(self.out, \"{}u\", value)?,\r\n            // Floats are written using `Debug` instead of `Display` because it always appends the\r\n            // decimal part even it's zero\r\n            Sv::Float(value) => write!(self.out, \"{:?}\", value)?,\r\n            Sv::Bool(value) => write!(self.out, \"{}\", value)?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn write_named_expr(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::Expression>,\r\n        name: String,\r\n        ctx: &back::FunctionCtx,\r\n    ) -> BackendResult {\r\n        match ctx.info[handle].ty {\r\n            proc::TypeResolution::Handle(ty_handle) => match module.types[ty_handle].inner {\r\n                TypeInner::Struct { .. } => {\r\n                    let ty_name = &self.names[&NameKey::Type(ty_handle)];\r\n                    write!(self.out, \"{}\", ty_name)?;\r\n                }\r\n                _ => {\r\n                    self.write_type(module, ty_handle)?;\r\n                }\r\n            },\r\n            proc::TypeResolution::Value(ref inner) => {\r\n                self.write_value_type(module, inner)?;\r\n            }\r\n        }\r\n\r\n        let base_ty_res = &ctx.info[handle].ty;\r\n        let resolved = base_ty_res.inner_with(&module.types);\r\n\r\n        write!(self.out, \" {}\", name)?;\r\n        // If rhs is a array type, we should write array size\r\n        if let TypeInner::Array { base, size, .. } = *resolved {\r\n            self.write_array_size(module, base, size)?;\r\n        }\r\n        write!(self.out, \" = \")?;\r\n        self.write_expr(module, handle, ctx)?;\r\n        writeln!(self.out, \";\")?;\r\n        self.named_expressions.insert(handle, name);\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper function that write default zero initialization\r\n    fn write_default_init(&mut self, module: &Module, ty: Handle<crate::Type>) -> BackendResult {\r\n        match module.types[ty].inner {\r\n            TypeInner::Array {\r\n                size: crate::ArraySize::Constant(const_handle),\r\n                base,\r\n                ..\r\n            } => {\r\n                write!(self.out, \"{{\")?;\r\n                let count = module.constants[const_handle].to_array_length().unwrap();\r\n                for i in 0..count {\r\n                    if i != 0 {\r\n                        write!(self.out, \",\")?;\r\n                    }\r\n                    self.write_default_init(module, base)?;\r\n                }\r\n                write!(self.out, \"}}\")?;\r\n            }\r\n            _ => {\r\n                write!(self.out, \"(\")?;\r\n                self.write_type(module, ty)?;\r\n                write!(self.out, \")0\")?;\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n\r\npub(super) struct MatrixType {\r\n    pub(super) columns: crate::VectorSize,\r\n    pub(super) rows: crate::VectorSize,\r\n    pub(super) width: crate::Bytes,\r\n}\r\n\r\npub(super) fn get_inner_matrix_data(\r\n    module: &Module,\r\n    handle: Handle<crate::Type>,\r\n) -> Option<MatrixType> {\r\n    match module.types[handle].inner {\r\n        TypeInner::Matrix {\r\n            columns,\r\n            rows,\r\n            width,\r\n        } => Some(MatrixType {\r\n            columns,\r\n            rows,\r\n            width,\r\n        }),\r\n        TypeInner::Array { base, .. } => get_inner_matrix_data(module, base),\r\n        _ => None,\r\n    }\r\n}\r\n\r\n/// Returns the matrix data if the access chain starting at `base`:\r\n/// - starts with an expression with resolved type of [`TypeInner::Matrix`] if `direct = true`\r\n/// - contains one or more expressions with resolved type of [`TypeInner::Array`] of [`TypeInner::Matrix`]\r\n/// - ends at an expression with resolved type of [`TypeInner::Struct`]\r\npub(super) fn get_inner_matrix_of_struct_array_member(\r\n    module: &Module,\r\n    base: Handle<crate::Expression>,\r\n    func_ctx: &back::FunctionCtx<'_>,\r\n    direct: bool,\r\n) -> Option<MatrixType> {\r\n    let mut mat_data = None;\r\n    let mut array_base = None;\r\n\r\n    let mut current_base = base;\r\n    loop {\r\n        let mut resolved = func_ctx.info[current_base].ty.inner_with(&module.types);\r\n        if let TypeInner::Pointer { base, .. } = *resolved {\r\n            resolved = &module.types[base].inner;\r\n        };\r\n\r\n        match *resolved {\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                mat_data = Some(MatrixType {\r\n                    columns,\r\n                    rows,\r\n                    width,\r\n                })\r\n            }\r\n            TypeInner::Array { base, .. } => {\r\n                array_base = Some(base);\r\n            }\r\n            TypeInner::Struct { .. } => {\r\n                if let Some(array_base) = array_base {\r\n                    if direct {\r\n                        return mat_data;\r\n                    } else {\r\n                        return get_inner_matrix_data(module, array_base);\r\n                    }\r\n                }\r\n\r\n                break;\r\n            }\r\n            _ => break,\r\n        }\r\n\r\n        current_base = match func_ctx.expressions[current_base] {\r\n            crate::Expression::Access { base, .. } => base,\r\n            crate::Expression::AccessIndex { base, .. } => base,\r\n            _ => break,\r\n        };\r\n    }\r\n    None\r\n}\r\n\r\n/// Returns the matrix data if the access chain starting at `base`:\r\n/// - starts with an expression with resolved type of [`TypeInner::Matrix`]\r\n/// - contains zero or more expressions with resolved type of [`TypeInner::Array`] of [`TypeInner::Matrix`]\r\n/// - ends with an [`Expression::GlobalVariable`](crate::Expression::GlobalVariable) in [`AddressSpace::Uniform`](crate::AddressSpace::Uniform)\r\nfn get_inner_matrix_of_global_uniform(\r\n    module: &Module,\r\n    base: Handle<crate::Expression>,\r\n    func_ctx: &back::FunctionCtx<'_>,\r\n) -> Option<MatrixType> {\r\n    let mut mat_data = None;\r\n    let mut array_base = None;\r\n\r\n    let mut current_base = base;\r\n    loop {\r\n        let mut resolved = func_ctx.info[current_base].ty.inner_with(&module.types);\r\n        if let TypeInner::Pointer { base, .. } = *resolved {\r\n            resolved = &module.types[base].inner;\r\n        };\r\n\r\n        match *resolved {\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                mat_data = Some(MatrixType {\r\n                    columns,\r\n                    rows,\r\n                    width,\r\n                })\r\n            }\r\n            TypeInner::Array { base, .. } => {\r\n                array_base = Some(base);\r\n            }\r\n            _ => break,\r\n        }\r\n\r\n        current_base = match func_ctx.expressions[current_base] {\r\n            crate::Expression::Access { base, .. } => base,\r\n            crate::Expression::AccessIndex { base, .. } => base,\r\n            crate::Expression::GlobalVariable(handle)\r\n                if module.global_variables[handle].space == crate::AddressSpace::Uniform =>\r\n            {\r\n                return mat_data.or_else(|| {\r\n                    array_base.and_then(|array_base| get_inner_matrix_data(module, array_base))\r\n                })\r\n            }\r\n            _ => break,\r\n        };\r\n    }\r\n    None\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/mod.rs",
    "content": "/*!\r\nBackend functions that export shader [`Module`](super::Module)s into binary and text formats.\r\n*/\r\n#![allow(dead_code)] // can be dead if none of the enabled backends need it\r\n\r\n#[cfg(feature = \"dot-out\")]\r\npub mod dot;\r\n#[cfg(feature = \"glsl-out\")]\r\npub mod glsl;\r\n#[cfg(feature = \"hlsl-out\")]\r\npub mod hlsl;\r\n#[cfg(feature = \"msl-out\")]\r\npub mod msl;\r\n#[cfg(feature = \"spv-out\")]\r\npub mod spv;\r\n#[cfg(feature = \"wgsl-out\")]\r\npub mod wgsl;\r\n\r\nconst COMPONENTS: &[char] = &['x', 'y', 'z', 'w'];\r\nconst INDENT: &str = \"    \";\r\nconst BAKE_PREFIX: &str = \"_e\";\r\n\r\ntype NeedBakeExpressions = crate::FastHashSet<crate::Handle<crate::Expression>>;\r\n\r\n#[derive(Clone, Copy)]\r\nstruct Level(usize);\r\n\r\nimpl Level {\r\n    const fn next(&self) -> Self {\r\n        Level(self.0 + 1)\r\n    }\r\n}\r\n\r\nimpl std::fmt::Display for Level {\r\n    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\r\n        (0..self.0).try_for_each(|_| formatter.write_str(INDENT))\r\n    }\r\n}\r\n\r\n/// Stores the current function type (either a regular function or an entry point)\r\n///\r\n/// Also stores data needed to identify it (handle for a regular function or index for an entry point)\r\nenum FunctionType {\r\n    /// A regular function and it's handle\r\n    Function(crate::Handle<crate::Function>),\r\n    /// A entry point and it's index\r\n    EntryPoint(crate::proc::EntryPointIndex),\r\n}\r\n\r\n/// Helper structure that stores data needed when writing the function\r\nstruct FunctionCtx<'a> {\r\n    /// The current function being written\r\n    ty: FunctionType,\r\n    /// Analysis about the function\r\n    info: &'a crate::valid::FunctionInfo,\r\n    /// The expression arena of the current function being written\r\n    expressions: &'a crate::Arena<crate::Expression>,\r\n    /// Map of expressions that have associated variable names\r\n    named_expressions: &'a crate::NamedExpressions,\r\n}\r\n\r\nimpl FunctionCtx<'_> {\r\n    /// Helper method that generates a [`NameKey`](crate::proc::NameKey) for a local in the current function\r\n    const fn name_key(&self, local: crate::Handle<crate::LocalVariable>) -> crate::proc::NameKey {\r\n        match self.ty {\r\n            FunctionType::Function(handle) => crate::proc::NameKey::FunctionLocal(handle, local),\r\n            FunctionType::EntryPoint(idx) => crate::proc::NameKey::EntryPointLocal(idx, local),\r\n        }\r\n    }\r\n\r\n    /// Helper method that generates a [`NameKey`](crate::proc::NameKey) for a function argument.\r\n    ///\r\n    /// # Panics\r\n    /// - If the function arguments are less or equal to `arg`\r\n    const fn argument_key(&self, arg: u32) -> crate::proc::NameKey {\r\n        match self.ty {\r\n            FunctionType::Function(handle) => crate::proc::NameKey::FunctionArgument(handle, arg),\r\n            FunctionType::EntryPoint(ep_index) => {\r\n                crate::proc::NameKey::EntryPointArgument(ep_index, arg)\r\n            }\r\n        }\r\n    }\r\n\r\n    // Returns true if the given expression points to a fixed-function pipeline input.\r\n    fn is_fixed_function_input(\r\n        &self,\r\n        mut expression: crate::Handle<crate::Expression>,\r\n        module: &crate::Module,\r\n    ) -> Option<crate::BuiltIn> {\r\n        let ep_function = match self.ty {\r\n            FunctionType::Function(_) => return None,\r\n            FunctionType::EntryPoint(ep_index) => &module.entry_points[ep_index as usize].function,\r\n        };\r\n        let mut built_in = None;\r\n        loop {\r\n            match self.expressions[expression] {\r\n                crate::Expression::FunctionArgument(arg_index) => {\r\n                    return match ep_function.arguments[arg_index as usize].binding {\r\n                        Some(crate::Binding::BuiltIn(bi)) => Some(bi),\r\n                        _ => built_in,\r\n                    };\r\n                }\r\n                crate::Expression::AccessIndex { base, index } => {\r\n                    match *self.info[base].ty.inner_with(&module.types) {\r\n                        crate::TypeInner::Struct { ref members, .. } => {\r\n                            if let Some(crate::Binding::BuiltIn(bi)) =\r\n                                members[index as usize].binding\r\n                            {\r\n                                built_in = Some(bi);\r\n                            }\r\n                        }\r\n                        _ => return None,\r\n                    }\r\n                    expression = base;\r\n                }\r\n                _ => return None,\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Expression {\r\n    /// Returns the ref count, upon reaching which this expression\r\n    /// should be considered for baking.\r\n    ///\r\n    /// Note: we have to cache any expressions that depend on the control flow,\r\n    /// or otherwise they may be moved into a non-uniform control flow, accidentally.\r\n    /// See the [module-level documentation][emit] for details.\r\n    ///\r\n    /// [emit]: index.html#expression-evaluation-time\r\n    const fn bake_ref_count(&self) -> usize {\r\n        match *self {\r\n            // accesses are never cached, only loads are\r\n            crate::Expression::Access { .. } | crate::Expression::AccessIndex { .. } => usize::MAX,\r\n            // sampling may use the control flow, and image ops look better by themselves\r\n            crate::Expression::ImageSample { .. } | crate::Expression::ImageLoad { .. } => 1,\r\n            // derivatives use the control flow\r\n            crate::Expression::Derivative { .. } => 1,\r\n            // TODO: We need a better fix for named `Load` expressions\r\n            // More info - https://github.com/gfx-rs/naga/pull/914\r\n            // And https://github.com/gfx-rs/naga/issues/910\r\n            crate::Expression::Load { .. } => 1,\r\n            // cache expressions that are referenced multiple times\r\n            _ => 2,\r\n        }\r\n    }\r\n}\r\n\r\n/// Helper function that returns the string corresponding to the [`BinaryOperator`](crate::BinaryOperator)\r\n/// # Notes\r\n/// Used by `glsl-out`, `msl-out`, `wgsl-out`, `hlsl-out`.\r\nconst fn binary_operation_str(op: crate::BinaryOperator) -> &'static str {\r\n    use crate::BinaryOperator as Bo;\r\n    match op {\r\n        Bo::Add => \"+\",\r\n        Bo::Subtract => \"-\",\r\n        Bo::Multiply => \"*\",\r\n        Bo::Divide => \"/\",\r\n        Bo::Modulo => \"%\",\r\n        Bo::Equal => \"==\",\r\n        Bo::NotEqual => \"!=\",\r\n        Bo::Less => \"<\",\r\n        Bo::LessEqual => \"<=\",\r\n        Bo::Greater => \">\",\r\n        Bo::GreaterEqual => \">=\",\r\n        Bo::And => \"&\",\r\n        Bo::ExclusiveOr => \"^\",\r\n        Bo::InclusiveOr => \"|\",\r\n        Bo::LogicalAnd => \"&&\",\r\n        Bo::LogicalOr => \"||\",\r\n        Bo::ShiftLeft => \"<<\",\r\n        Bo::ShiftRight => \">>\",\r\n    }\r\n}\r\n\r\n/// Helper function that returns the string corresponding to the [`VectorSize`](crate::VectorSize)\r\n/// # Notes\r\n/// Used by `msl-out`, `wgsl-out`, `hlsl-out`.\r\nconst fn vector_size_str(size: crate::VectorSize) -> &'static str {\r\n    match size {\r\n        crate::VectorSize::Bi => \"2\",\r\n        crate::VectorSize::Tri => \"3\",\r\n        crate::VectorSize::Quad => \"4\",\r\n    }\r\n}\r\n\r\nimpl crate::TypeInner {\r\n    const fn is_handle(&self) -> bool {\r\n        match *self {\r\n            crate::TypeInner::Image { .. } | crate::TypeInner::Sampler { .. } => true,\r\n            _ => false,\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Statement {\r\n    /// Returns true if the statement directly terminates the current block.\r\n    ///\r\n    /// Used to decide whether case blocks require a explicit `break`.\r\n    pub const fn is_terminator(&self) -> bool {\r\n        match *self {\r\n            crate::Statement::Break\r\n            | crate::Statement::Continue\r\n            | crate::Statement::Return { .. }\r\n            | crate::Statement::Kill => true,\r\n            _ => false,\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/msl/keywords.rs",
    "content": "//TODO: find a complete list\r\npub const RESERVED: &[&str] = &[\r\n    // control flow\r\n    \"break\",\r\n    \"if\",\r\n    \"else\",\r\n    \"continue\",\r\n    \"goto\",\r\n    \"do\",\r\n    \"while\",\r\n    \"for\",\r\n    \"switch\",\r\n    \"case\",\r\n    // types and values\r\n    \"void\",\r\n    \"unsigned\",\r\n    \"signed\",\r\n    \"bool\",\r\n    \"char\",\r\n    \"int\",\r\n    \"uint\",\r\n    \"long\",\r\n    \"float\",\r\n    \"double\",\r\n    \"char8_t\",\r\n    \"wchar_t\",\r\n    \"true\",\r\n    \"false\",\r\n    \"nullptr\",\r\n    \"union\",\r\n    \"class\",\r\n    \"struct\",\r\n    \"enum\",\r\n    // other\r\n    \"main\",\r\n    \"using\",\r\n    \"decltype\",\r\n    \"sizeof\",\r\n    \"typeof\",\r\n    \"typedef\",\r\n    \"explicit\",\r\n    \"export\",\r\n    \"friend\",\r\n    \"namespace\",\r\n    \"operator\",\r\n    \"public\",\r\n    \"template\",\r\n    \"typename\",\r\n    \"typeid\",\r\n    \"co_await\",\r\n    \"co_return\",\r\n    \"co_yield\",\r\n    \"module\",\r\n    \"import\",\r\n    \"ray_data\",\r\n    \"vec_step\",\r\n    \"visible\",\r\n    \"as_type\",\r\n    \"this\",\r\n    // qualifiers\r\n    \"mutable\",\r\n    \"static\",\r\n    \"volatile\",\r\n    \"restrict\",\r\n    \"const\",\r\n    \"non-temporal\",\r\n    \"dereferenceable\",\r\n    \"invariant\",\r\n    // exceptions\r\n    \"throw\",\r\n    \"try\",\r\n    \"catch\",\r\n    // operators\r\n    \"const_cast\",\r\n    \"dynamic_cast\",\r\n    \"reinterpret_cast\",\r\n    \"static_cast\",\r\n    \"new\",\r\n    \"delete\",\r\n    \"and\",\r\n    \"and_eq\",\r\n    \"bitand\",\r\n    \"bitor\",\r\n    \"compl\",\r\n    \"not\",\r\n    \"not_eq\",\r\n    \"or\",\r\n    \"or_eq\",\r\n    \"xor\",\r\n    \"xor_eq\",\r\n    \"compl\",\r\n    // Metal-specific\r\n    \"constant\",\r\n    \"device\",\r\n    \"threadgroup\",\r\n    \"threadgroup_imageblock\",\r\n    \"kernel\",\r\n    \"compute\",\r\n    \"vertex\",\r\n    \"fragment\",\r\n    \"read_only\",\r\n    \"write_only\",\r\n    \"read_write\",\r\n    \"auto\",\r\n    // Metal reserved types\r\n    \"llong\",\r\n    \"ullong\",\r\n    \"quad\",\r\n    \"complex\",\r\n    \"imaginary\",\r\n    // Metal constants\r\n    \"CHAR_BIT\",\r\n    \"SCHAR_MAX\",\r\n    \"SCHAR_MIN\",\r\n    \"UCHAR_MAX\",\r\n    \"CHAR_MAX\",\r\n    \"CHAR_MIN\",\r\n    \"USHRT_MAX\",\r\n    \"SHRT_MAX\",\r\n    \"SHRT_MIN\",\r\n    \"UINT_MAX\",\r\n    \"INT_MAX\",\r\n    \"INT_MIN\",\r\n    \"ULONG_MAX\",\r\n    \"LONG_MAX\",\r\n    \"LONG_MIN\",\r\n    \"ULLONG_MAX\",\r\n    \"LLONG_MAX\",\r\n    \"LLONG_MIN\",\r\n    \"FLT_DIG\",\r\n    \"FLT_MANT_DIG\",\r\n    \"FLT_MAX_10_EXP\",\r\n    \"FLT_MAX_EXP\",\r\n    \"FLT_MIN_10_EXP\",\r\n    \"FLT_MIN_EXP\",\r\n    \"FLT_RADIX\",\r\n    \"FLT_MAX\",\r\n    \"FLT_MIN\",\r\n    \"FLT_EPSILON\",\r\n    \"FLT_DECIMAL_DIG\",\r\n    \"FP_ILOGB0\",\r\n    \"FP_ILOGB0\",\r\n    \"FP_ILOGBNAN\",\r\n    \"FP_ILOGBNAN\",\r\n    \"MAXFLOAT\",\r\n    \"HUGE_VALF\",\r\n    \"INFINITY\",\r\n    \"NAN\",\r\n    \"M_E_F\",\r\n    \"M_LOG2E_F\",\r\n    \"M_LOG10E_F\",\r\n    \"M_LN2_F\",\r\n    \"M_LN10_F\",\r\n    \"M_PI_F\",\r\n    \"M_PI_2_F\",\r\n    \"M_PI_4_F\",\r\n    \"M_1_PI_F\",\r\n    \"M_2_PI_F\",\r\n    \"M_2_SQRTPI_F\",\r\n    \"M_SQRT2_F\",\r\n    \"M_SQRT1_2_F\",\r\n    \"HALF_DIG\",\r\n    \"HALF_MANT_DIG\",\r\n    \"HALF_MAX_10_EXP\",\r\n    \"HALF_MAX_EXP\",\r\n    \"HALF_MIN_10_EXP\",\r\n    \"HALF_MIN_EXP\",\r\n    \"HALF_RADIX\",\r\n    \"HALF_MAX\",\r\n    \"HALF_MIN\",\r\n    \"HALF_EPSILON\",\r\n    \"HALF_DECIMAL_DIG\",\r\n    \"MAXHALF\",\r\n    \"HUGE_VALH\",\r\n    \"M_E_H\",\r\n    \"M_LOG2E_H\",\r\n    \"M_LOG10E_H\",\r\n    \"M_LN2_H\",\r\n    \"M_LN10_H\",\r\n    \"M_PI_H\",\r\n    \"M_PI_2_H\",\r\n    \"M_PI_4_H\",\r\n    \"M_1_PI_H\",\r\n    \"M_2_PI_H\",\r\n    \"M_2_SQRTPI_H\",\r\n    \"M_SQRT2_H\",\r\n    \"M_SQRT1_2_H\",\r\n    \"DBL_DIG\",\r\n    \"DBL_MANT_DIG\",\r\n    \"DBL_MAX_10_EXP\",\r\n    \"DBL_MAX_EXP\",\r\n    \"DBL_MIN_10_EXP\",\r\n    \"DBL_MIN_EXP\",\r\n    \"DBL_RADIX\",\r\n    \"DBL_MAX\",\r\n    \"DBL_MIN\",\r\n    \"DBL_EPSILON\",\r\n    \"DBL_DECIMAL_DIG\",\r\n    \"MAXDOUBLE\",\r\n    \"HUGE_VAL\",\r\n    \"M_E\",\r\n    \"M_LOG2E\",\r\n    \"M_LOG10E\",\r\n    \"M_LN2\",\r\n    \"M_LN10\",\r\n    \"M_PI\",\r\n    \"M_PI_2\",\r\n    \"M_PI_4\",\r\n    \"M_1_PI\",\r\n    \"M_2_PI\",\r\n    \"M_2_SQRTPI\",\r\n    \"M_SQRT2\",\r\n    \"M_SQRT1_2\",\r\n    // Naga utilities\r\n    \"DefaultConstructible\",\r\n    \"clamped_lod_e\",\r\n];\r\n"
  },
  {
    "path": "lib/naga/src/back/msl/mod.rs",
    "content": "/*!\r\nBackend for [MSL][msl] (Metal Shading Language).\r\n\r\n## Binding model\r\n\r\nMetal's bindings are flat per resource. Since there isn't an obvious mapping\r\nfrom SPIR-V's descriptor sets, we require a separate mapping provided in the options.\r\nThis mapping may have one or more resource end points for each descriptor set + index\r\npair.\r\n\r\n## Entry points\r\n\r\nEven though MSL and our IR appear to be similar in that the entry points in both can\r\naccept arguments and return values, the restrictions are different.\r\nMSL allows the varyings to be either in separate arguments, or inside a single\r\n`[[stage_in]]` struct. We gather input varyings and form this artificial structure.\r\nWe also add all the (non-Private) globals into the arguments.\r\n\r\nAt the beginning of the entry point, we assign the local constants and re-compose\r\nthe arguments as they are declared on IR side, so that the rest of the logic can\r\npretend that MSL doesn't have all the restrictions it has.\r\n\r\nFor the result type, if it's a structure, we re-compose it with a temporary value\r\nholding the result.\r\n\r\n[msl]: https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf\r\n*/\r\n\r\nuse crate::{arena::Handle, proc::index, valid::ModuleInfo};\r\nuse std::{\r\n    fmt::{Error as FmtError, Write},\r\n    ops,\r\n};\r\n\r\nmod keywords;\r\npub mod sampler;\r\nmod writer;\r\n\r\npub use writer::Writer;\r\n\r\npub type Slot = u8;\r\npub type InlineSamplerIndex = u8;\r\n\r\n#[derive(Clone, Debug, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum BindSamplerTarget {\r\n    Resource(Slot),\r\n    Inline(InlineSamplerIndex),\r\n}\r\n\r\n#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n#[cfg_attr(any(feature = \"serialize\", feature = \"deserialize\"), serde(default))]\r\npub struct BindTarget {\r\n    pub buffer: Option<Slot>,\r\n    pub texture: Option<Slot>,\r\n    pub sampler: Option<BindSamplerTarget>,\r\n    /// If the binding is an unsized binding array, this overrides the size.\r\n    pub binding_array_size: Option<u32>,\r\n    pub mutable: bool,\r\n}\r\n\r\n// Using `BTreeMap` instead of `HashMap` so that we can hash itself.\r\npub type BindingMap = std::collections::BTreeMap<crate::ResourceBinding, BindTarget>;\r\n\r\n#[derive(Clone, Debug, Default, Hash, Eq, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n#[cfg_attr(any(feature = \"serialize\", feature = \"deserialize\"), serde(default))]\r\npub struct PerStageResources {\r\n    pub resources: BindingMap,\r\n\r\n    pub push_constant_buffer: Option<Slot>,\r\n\r\n    /// The slot of a buffer that contains an array of `u32`,\r\n    /// one for the size of each bound buffer that contains a runtime array,\r\n    /// in order of [`crate::GlobalVariable`] declarations.\r\n    pub sizes_buffer: Option<Slot>,\r\n}\r\n\r\n#[derive(Clone, Debug, Default, Hash, Eq, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n#[cfg_attr(any(feature = \"serialize\", feature = \"deserialize\"), serde(default))]\r\npub struct PerStageMap {\r\n    pub vs: PerStageResources,\r\n    pub fs: PerStageResources,\r\n    pub cs: PerStageResources,\r\n}\r\n\r\nimpl ops::Index<crate::ShaderStage> for PerStageMap {\r\n    type Output = PerStageResources;\r\n    fn index(&self, stage: crate::ShaderStage) -> &PerStageResources {\r\n        match stage {\r\n            crate::ShaderStage::Vertex => &self.vs,\r\n            crate::ShaderStage::Fragment => &self.fs,\r\n            crate::ShaderStage::Compute => &self.cs,\r\n        }\r\n    }\r\n}\r\n\r\nenum ResolvedBinding {\r\n    BuiltIn(crate::BuiltIn),\r\n    Attribute(u32),\r\n    Color(u32),\r\n    User {\r\n        prefix: &'static str,\r\n        index: u32,\r\n        interpolation: Option<ResolvedInterpolation>,\r\n    },\r\n    Resource(BindTarget),\r\n}\r\n\r\n#[derive(Copy, Clone)]\r\nenum ResolvedInterpolation {\r\n    CenterPerspective,\r\n    CenterNoPerspective,\r\n    CentroidPerspective,\r\n    CentroidNoPerspective,\r\n    SamplePerspective,\r\n    SampleNoPerspective,\r\n    Flat,\r\n}\r\n\r\n// Note: some of these should be removed in favor of proper IR validation.\r\n\r\n#[derive(Debug, thiserror::Error)]\r\npub enum Error {\r\n    #[error(transparent)]\r\n    Format(#[from] FmtError),\r\n    #[error(\"bind target {0:?} is empty\")]\r\n    UnimplementedBindTarget(BindTarget),\r\n    #[error(\"composing of {0:?} is not implemented yet\")]\r\n    UnsupportedCompose(Handle<crate::Type>),\r\n    #[error(\"operation {0:?} is not implemented yet\")]\r\n    UnsupportedBinaryOp(crate::BinaryOperator),\r\n    #[error(\"standard function '{0}' is not implemented yet\")]\r\n    UnsupportedCall(String),\r\n    #[error(\"feature '{0}' is not implemented yet\")]\r\n    FeatureNotImplemented(String),\r\n    #[error(\"module is not valid\")]\r\n    Validation,\r\n    #[error(\"BuiltIn {0:?} is not supported\")]\r\n    UnsupportedBuiltIn(crate::BuiltIn),\r\n    #[error(\"capability {0:?} is not supported\")]\r\n    CapabilityNotSupported(crate::valid::Capabilities),\r\n    #[error(\"address space {0:?} is not supported for target MSL version\")]\r\n    UnsupportedAddressSpace(crate::AddressSpace),\r\n    #[error(\"attribute '{0}' is not supported for target MSL version\")]\r\n    UnsupportedAttribute(String),\r\n}\r\n\r\n#[derive(Clone, Debug, PartialEq, thiserror::Error)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum EntryPointError {\r\n    #[error(\"mapping of {0:?} is missing\")]\r\n    MissingBinding(crate::ResourceBinding),\r\n    #[error(\"mapping for push constants is missing\")]\r\n    MissingPushConstants,\r\n    #[error(\"mapping for sizes buffer is missing\")]\r\n    MissingSizesBuffer,\r\n}\r\n\r\n/// Points in the MSL code where we might emit a pipeline input or output.\r\n///\r\n/// Note that, even though vertex shaders' outputs are always fragment\r\n/// shaders' inputs, we still need to distinguish `VertexOutput` and\r\n/// `FragmentInput`, since there are certain differences in the way\r\n/// [`ResolvedBinding`s] are represented on either side.\r\n///\r\n/// [`ResolvedBinding`s]: ResolvedBinding\r\n#[derive(Clone, Copy, Debug)]\r\nenum LocationMode {\r\n    /// Input to the vertex shader.\r\n    VertexInput,\r\n\r\n    /// Output from the vertex shader.\r\n    VertexOutput,\r\n\r\n    /// Input to the fragment shader.\r\n    FragmentInput,\r\n\r\n    /// Output from the fragment shader.\r\n    FragmentOutput,\r\n\r\n    /// Compute shader input or output.\r\n    Uniform,\r\n}\r\n\r\n#[derive(Clone, Debug, Hash, PartialEq, Eq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct Options {\r\n    /// (Major, Minor) target version of the Metal Shading Language.\r\n    pub lang_version: (u8, u8),\r\n    /// Map of per-stage resources to slots.\r\n    pub per_stage_map: PerStageMap,\r\n    /// Samplers to be inlined into the code.\r\n    pub inline_samplers: Vec<sampler::InlineSampler>,\r\n    /// Make it possible to link different stages via SPIRV-Cross.\r\n    pub spirv_cross_compatibility: bool,\r\n    /// Don't panic on missing bindings, instead generate invalid MSL.\r\n    pub fake_missing_bindings: bool,\r\n    /// Bounds checking policies.\r\n    #[cfg_attr(feature = \"deserialize\", serde(default))]\r\n    pub bounds_check_policies: index::BoundsCheckPolicies,\r\n}\r\n\r\nimpl Default for Options {\r\n    fn default() -> Self {\r\n        Options {\r\n            lang_version: (2, 0),\r\n            per_stage_map: PerStageMap::default(),\r\n            inline_samplers: Vec::new(),\r\n            spirv_cross_compatibility: false,\r\n            fake_missing_bindings: true,\r\n            bounds_check_policies: index::BoundsCheckPolicies::default(),\r\n        }\r\n    }\r\n}\r\n\r\n/// A subset of options that are meant to be changed per pipeline.\r\n#[derive(Debug, Default, Clone, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct PipelineOptions {\r\n    /// Allow `BuiltIn::PointSize` in the vertex shader.\r\n    ///\r\n    /// Metal doesn't like this for non-point primitive topologies.\r\n    pub allow_point_size: bool,\r\n}\r\n\r\nimpl Options {\r\n    fn resolve_local_binding(\r\n        &self,\r\n        binding: &crate::Binding,\r\n        mode: LocationMode,\r\n    ) -> Result<ResolvedBinding, Error> {\r\n        match *binding {\r\n            crate::Binding::BuiltIn(mut built_in) => {\r\n                if let crate::BuiltIn::Position { ref mut invariant } = built_in {\r\n                    if *invariant && self.lang_version < (2, 1) {\r\n                        return Err(Error::UnsupportedAttribute(\"invariant\".to_string()));\r\n                    }\r\n\r\n                    // The 'invariant' attribute may only appear on vertex\r\n                    // shader outputs, not fragment shader inputs.\r\n                    if !matches!(mode, LocationMode::VertexOutput) {\r\n                        *invariant = false;\r\n                    }\r\n                }\r\n\r\n                Ok(ResolvedBinding::BuiltIn(built_in))\r\n            }\r\n            crate::Binding::Location {\r\n                location,\r\n                interpolation,\r\n                sampling,\r\n            } => match mode {\r\n                LocationMode::VertexInput => Ok(ResolvedBinding::Attribute(location)),\r\n                LocationMode::FragmentOutput => Ok(ResolvedBinding::Color(location)),\r\n                LocationMode::VertexOutput | LocationMode::FragmentInput => {\r\n                    Ok(ResolvedBinding::User {\r\n                        prefix: if self.spirv_cross_compatibility {\r\n                            \"locn\"\r\n                        } else {\r\n                            \"loc\"\r\n                        },\r\n                        index: location,\r\n                        interpolation: {\r\n                            // unwrap: The verifier ensures that vertex shader outputs and fragment\r\n                            // shader inputs always have fully specified interpolation, and that\r\n                            // sampling is `None` only for Flat interpolation.\r\n                            let interpolation = interpolation.unwrap();\r\n                            let sampling = sampling.unwrap_or(crate::Sampling::Center);\r\n                            Some(ResolvedInterpolation::from_binding(interpolation, sampling))\r\n                        },\r\n                    })\r\n                }\r\n                LocationMode::Uniform => {\r\n                    log::error!(\r\n                        \"Unexpected Binding::Location({}) for the Uniform mode\",\r\n                        location\r\n                    );\r\n                    Err(Error::Validation)\r\n                }\r\n            },\r\n        }\r\n    }\r\n\r\n    fn resolve_resource_binding(\r\n        &self,\r\n        stage: crate::ShaderStage,\r\n        res_binding: &crate::ResourceBinding,\r\n    ) -> Result<ResolvedBinding, EntryPointError> {\r\n        match self.per_stage_map[stage].resources.get(res_binding) {\r\n            Some(target) => Ok(ResolvedBinding::Resource(target.clone())),\r\n            None if self.fake_missing_bindings => Ok(ResolvedBinding::User {\r\n                prefix: \"fake\",\r\n                index: 0,\r\n                interpolation: None,\r\n            }),\r\n            None => Err(EntryPointError::MissingBinding(res_binding.clone())),\r\n        }\r\n    }\r\n\r\n    const fn resolve_push_constants(\r\n        &self,\r\n        stage: crate::ShaderStage,\r\n    ) -> Result<ResolvedBinding, EntryPointError> {\r\n        let slot = match stage {\r\n            crate::ShaderStage::Vertex => self.per_stage_map.vs.push_constant_buffer,\r\n            crate::ShaderStage::Fragment => self.per_stage_map.fs.push_constant_buffer,\r\n            crate::ShaderStage::Compute => self.per_stage_map.cs.push_constant_buffer,\r\n        };\r\n        match slot {\r\n            Some(slot) => Ok(ResolvedBinding::Resource(BindTarget {\r\n                buffer: Some(slot),\r\n                texture: None,\r\n                sampler: None,\r\n                binding_array_size: None,\r\n                mutable: false,\r\n            })),\r\n            None if self.fake_missing_bindings => Ok(ResolvedBinding::User {\r\n                prefix: \"fake\",\r\n                index: 0,\r\n                interpolation: None,\r\n            }),\r\n            None => Err(EntryPointError::MissingPushConstants),\r\n        }\r\n    }\r\n\r\n    fn resolve_sizes_buffer(\r\n        &self,\r\n        stage: crate::ShaderStage,\r\n    ) -> Result<ResolvedBinding, EntryPointError> {\r\n        let slot = self.per_stage_map[stage].sizes_buffer;\r\n        match slot {\r\n            Some(slot) => Ok(ResolvedBinding::Resource(BindTarget {\r\n                buffer: Some(slot),\r\n                texture: None,\r\n                sampler: None,\r\n                binding_array_size: None,\r\n                mutable: false,\r\n            })),\r\n            None if self.fake_missing_bindings => Ok(ResolvedBinding::User {\r\n                prefix: \"fake\",\r\n                index: 0,\r\n                interpolation: None,\r\n            }),\r\n            None => Err(EntryPointError::MissingSizesBuffer),\r\n        }\r\n    }\r\n}\r\n\r\nimpl ResolvedBinding {\r\n    fn as_inline_sampler<'a>(&self, options: &'a Options) -> Option<&'a sampler::InlineSampler> {\r\n        match *self {\r\n            Self::Resource(BindTarget {\r\n                sampler: Some(BindSamplerTarget::Inline(index)),\r\n                ..\r\n            }) => Some(&options.inline_samplers[index as usize]),\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    const fn as_bind_target(&self) -> Option<&BindTarget> {\r\n        match *self {\r\n            Self::Resource(ref target) => Some(target),\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    fn try_fmt<W: Write>(&self, out: &mut W) -> Result<(), Error> {\r\n        write!(out, \" [[\")?;\r\n        match *self {\r\n            Self::BuiltIn(built_in) => {\r\n                use crate::BuiltIn as Bi;\r\n                let name = match built_in {\r\n                    Bi::Position { invariant: false } => \"position\",\r\n                    Bi::Position { invariant: true } => \"position, invariant\",\r\n                    // vertex\r\n                    Bi::BaseInstance => \"base_instance\",\r\n                    Bi::BaseVertex => \"base_vertex\",\r\n                    Bi::ClipDistance => \"clip_distance\",\r\n                    Bi::InstanceIndex => \"instance_id\",\r\n                    Bi::PointSize => \"point_size\",\r\n                    Bi::VertexIndex => \"vertex_id\",\r\n                    // fragment\r\n                    Bi::FragDepth => \"depth(any)\",\r\n                    Bi::FrontFacing => \"front_facing\",\r\n                    Bi::PrimitiveIndex => \"primitive_id\",\r\n                    Bi::SampleIndex => \"sample_id\",\r\n                    Bi::SampleMask => \"sample_mask\",\r\n                    // compute\r\n                    Bi::GlobalInvocationId => \"thread_position_in_grid\",\r\n                    Bi::LocalInvocationId => \"thread_position_in_threadgroup\",\r\n                    Bi::LocalInvocationIndex => \"thread_index_in_threadgroup\",\r\n                    Bi::WorkGroupId => \"threadgroup_position_in_grid\",\r\n                    Bi::WorkGroupSize => \"dispatch_threads_per_threadgroup\",\r\n                    Bi::NumWorkGroups => \"threadgroups_per_grid\",\r\n                    Bi::CullDistance | Bi::ViewIndex => {\r\n                        return Err(Error::UnsupportedBuiltIn(built_in))\r\n                    }\r\n                };\r\n                write!(out, \"{}\", name)?;\r\n            }\r\n            Self::Attribute(index) => write!(out, \"attribute({})\", index)?,\r\n            Self::Color(index) => write!(out, \"color({})\", index)?,\r\n            Self::User {\r\n                prefix,\r\n                index,\r\n                interpolation,\r\n            } => {\r\n                write!(out, \"user({}{})\", prefix, index)?;\r\n                if let Some(interpolation) = interpolation {\r\n                    write!(out, \", \")?;\r\n                    interpolation.try_fmt(out)?;\r\n                }\r\n            }\r\n            Self::Resource(ref target) => {\r\n                if let Some(id) = target.buffer {\r\n                    write!(out, \"buffer({})\", id)?;\r\n                } else if let Some(id) = target.texture {\r\n                    write!(out, \"texture({})\", id)?;\r\n                } else if let Some(BindSamplerTarget::Resource(id)) = target.sampler {\r\n                    write!(out, \"sampler({})\", id)?;\r\n                } else {\r\n                    return Err(Error::UnimplementedBindTarget(target.clone()));\r\n                }\r\n            }\r\n        }\r\n        write!(out, \"]]\")?;\r\n        Ok(())\r\n    }\r\n}\r\n\r\nimpl ResolvedInterpolation {\r\n    const fn from_binding(interpolation: crate::Interpolation, sampling: crate::Sampling) -> Self {\r\n        use crate::Interpolation as I;\r\n        use crate::Sampling as S;\r\n\r\n        match (interpolation, sampling) {\r\n            (I::Perspective, S::Center) => Self::CenterPerspective,\r\n            (I::Perspective, S::Centroid) => Self::CentroidPerspective,\r\n            (I::Perspective, S::Sample) => Self::SamplePerspective,\r\n            (I::Linear, S::Center) => Self::CenterNoPerspective,\r\n            (I::Linear, S::Centroid) => Self::CentroidNoPerspective,\r\n            (I::Linear, S::Sample) => Self::SampleNoPerspective,\r\n            (I::Flat, _) => Self::Flat,\r\n        }\r\n    }\r\n\r\n    fn try_fmt<W: Write>(self, out: &mut W) -> Result<(), Error> {\r\n        let identifier = match self {\r\n            Self::CenterPerspective => \"center_perspective\",\r\n            Self::CenterNoPerspective => \"center_no_perspective\",\r\n            Self::CentroidPerspective => \"centroid_perspective\",\r\n            Self::CentroidNoPerspective => \"centroid_no_perspective\",\r\n            Self::SamplePerspective => \"sample_perspective\",\r\n            Self::SampleNoPerspective => \"sample_no_perspective\",\r\n            Self::Flat => \"flat\",\r\n        };\r\n        out.write_str(identifier)?;\r\n        Ok(())\r\n    }\r\n}\r\n\r\n/// Information about a translated module that is required\r\n/// for the use of the result.\r\npub struct TranslationInfo {\r\n    /// Mapping of the entry point names. Each item in the array\r\n    /// corresponds to an entry point index.\r\n    ///\r\n    ///Note: Some entry points may fail translation because of missing bindings.\r\n    pub entry_point_names: Vec<Result<String, EntryPointError>>,\r\n}\r\n\r\npub fn write_string(\r\n    module: &crate::Module,\r\n    info: &ModuleInfo,\r\n    options: &Options,\r\n    pipeline_options: &PipelineOptions,\r\n) -> Result<(String, TranslationInfo), Error> {\r\n    let mut w = writer::Writer::new(String::new());\r\n    let info = w.write(module, info, options, pipeline_options)?;\r\n    Ok((w.finish(), info))\r\n}\r\n\r\n#[test]\r\nfn test_error_size() {\r\n    use std::mem::size_of;\r\n    assert_eq!(size_of::<Error>(), 32);\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/msl/sampler.rs",
    "content": "#[cfg(feature = \"deserialize\")]\r\nuse serde::Deserialize;\r\n#[cfg(feature = \"serialize\")]\r\nuse serde::Serialize;\r\nuse std::{num::NonZeroU32, ops::Range};\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\npub enum Coord {\r\n    Normalized,\r\n    Pixel,\r\n}\r\n\r\nimpl Default for Coord {\r\n    fn default() -> Self {\r\n        Self::Normalized\r\n    }\r\n}\r\n\r\nimpl Coord {\r\n    pub const fn as_str(&self) -> &'static str {\r\n        match *self {\r\n            Self::Normalized => \"normalized\",\r\n            Self::Pixel => \"pixel\",\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\npub enum Address {\r\n    Repeat,\r\n    MirroredRepeat,\r\n    ClampToEdge,\r\n    ClampToZero,\r\n    ClampToBorder,\r\n}\r\n\r\nimpl Default for Address {\r\n    fn default() -> Self {\r\n        Self::ClampToEdge\r\n    }\r\n}\r\n\r\nimpl Address {\r\n    pub const fn as_str(&self) -> &'static str {\r\n        match *self {\r\n            Self::Repeat => \"repeat\",\r\n            Self::MirroredRepeat => \"mirrored_repeat\",\r\n            Self::ClampToEdge => \"clamp_to_edge\",\r\n            Self::ClampToZero => \"clamp_to_zero\",\r\n            Self::ClampToBorder => \"clamp_to_border\",\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\npub enum BorderColor {\r\n    TransparentBlack,\r\n    OpaqueBlack,\r\n    OpaqueWhite,\r\n}\r\n\r\nimpl Default for BorderColor {\r\n    fn default() -> Self {\r\n        Self::TransparentBlack\r\n    }\r\n}\r\n\r\nimpl BorderColor {\r\n    pub const fn as_str(&self) -> &'static str {\r\n        match *self {\r\n            Self::TransparentBlack => \"transparent_black\",\r\n            Self::OpaqueBlack => \"opaque_black\",\r\n            Self::OpaqueWhite => \"opaque_white\",\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\npub enum Filter {\r\n    Nearest,\r\n    Linear,\r\n}\r\n\r\nimpl Filter {\r\n    pub const fn as_str(&self) -> &'static str {\r\n        match *self {\r\n            Self::Nearest => \"nearest\",\r\n            Self::Linear => \"linear\",\r\n        }\r\n    }\r\n}\r\n\r\nimpl Default for Filter {\r\n    fn default() -> Self {\r\n        Self::Nearest\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\npub enum CompareFunc {\r\n    Never,\r\n    Less,\r\n    LessEqual,\r\n    Greater,\r\n    GreaterEqual,\r\n    Equal,\r\n    NotEqual,\r\n    Always,\r\n}\r\n\r\nimpl Default for CompareFunc {\r\n    fn default() -> Self {\r\n        Self::Never\r\n    }\r\n}\r\n\r\nimpl CompareFunc {\r\n    pub const fn as_str(&self) -> &'static str {\r\n        match *self {\r\n            Self::Never => \"never\",\r\n            Self::Less => \"less\",\r\n            Self::LessEqual => \"less_equal\",\r\n            Self::Greater => \"greater\",\r\n            Self::GreaterEqual => \"greater_equal\",\r\n            Self::Equal => \"equal\",\r\n            Self::NotEqual => \"not_equal\",\r\n            Self::Always => \"always\",\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Debug, Default, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\npub struct InlineSampler {\r\n    pub coord: Coord,\r\n    pub address: [Address; 3],\r\n    pub border_color: BorderColor,\r\n    pub mag_filter: Filter,\r\n    pub min_filter: Filter,\r\n    pub mip_filter: Option<Filter>,\r\n    pub lod_clamp: Option<Range<f32>>,\r\n    pub max_anisotropy: Option<NonZeroU32>,\r\n    pub compare_func: CompareFunc,\r\n}\r\n\r\nimpl Eq for InlineSampler {}\r\n\r\n#[allow(clippy::derive_hash_xor_eq)]\r\nimpl std::hash::Hash for InlineSampler {\r\n    fn hash<H: std::hash::Hasher>(&self, hasher: &mut H) {\r\n        self.coord.hash(hasher);\r\n        self.address.hash(hasher);\r\n        self.border_color.hash(hasher);\r\n        self.mag_filter.hash(hasher);\r\n        self.min_filter.hash(hasher);\r\n        self.mip_filter.hash(hasher);\r\n        self.lod_clamp\r\n            .as_ref()\r\n            .map(|range| (range.start.to_bits(), range.end.to_bits()))\r\n            .hash(hasher);\r\n        self.max_anisotropy.hash(hasher);\r\n        self.compare_func.hash(hasher);\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/msl/writer.rs",
    "content": "use super::{sampler as sm, Error, LocationMode, Options, PipelineOptions, TranslationInfo};\r\nuse crate::{\r\n    arena::Handle,\r\n    back,\r\n    proc::index,\r\n    proc::{self, NameKey, TypeResolution},\r\n    valid, FastHashMap, FastHashSet,\r\n};\r\nuse bit_set::BitSet;\r\nuse std::{\r\n    fmt::{Display, Error as FmtError, Formatter, Write},\r\n    iter,\r\n};\r\n\r\n/// Shorthand result used internally by the backend\r\ntype BackendResult = Result<(), Error>;\r\n\r\nconst NAMESPACE: &str = \"metal\";\r\n// The name of the array member of the Metal struct types we generate to\r\n// represent Naga `Array` types. See the comments in `Writer::write_type_defs`\r\n// for details.\r\nconst WRAPPED_ARRAY_FIELD: &str = \"inner\";\r\n// This is a hack: we need to pass a pointer to an atomic,\r\n// but generally the backend isn't putting \"&\" in front of every pointer.\r\n// Some more general handling of pointers is needed to be implemented here.\r\nconst ATOMIC_REFERENCE: &str = \"&\";\r\n\r\n/// Write the Metal name for a Naga numeric type: scalar, vector, or matrix.\r\n///\r\n/// The `sizes` slice determines whether this function writes a\r\n/// scalar, vector, or matrix type:\r\n///\r\n/// - An empty slice produces a scalar type.\r\n/// - A one-element slice produces a vector type.\r\n/// - A two element slice `[ROWS COLUMNS]` produces a matrix of the given size.\r\nfn put_numeric_type(\r\n    out: &mut impl Write,\r\n    kind: crate::ScalarKind,\r\n    sizes: &[crate::VectorSize],\r\n) -> Result<(), FmtError> {\r\n    match (kind, sizes) {\r\n        (kind, &[]) => {\r\n            write!(out, \"{}\", kind.to_msl_name())\r\n        }\r\n        (kind, &[rows]) => {\r\n            write!(\r\n                out,\r\n                \"{}::{}{}\",\r\n                NAMESPACE,\r\n                kind.to_msl_name(),\r\n                back::vector_size_str(rows)\r\n            )\r\n        }\r\n        (kind, &[rows, columns]) => {\r\n            write!(\r\n                out,\r\n                \"{}::{}{}x{}\",\r\n                NAMESPACE,\r\n                kind.to_msl_name(),\r\n                back::vector_size_str(columns),\r\n                back::vector_size_str(rows)\r\n            )\r\n        }\r\n        (_, _) => Ok(()), // not meaningful\r\n    }\r\n}\r\n\r\n/// Prefix for cached clamped level-of-detail values for `ImageLoad` expressions.\r\nconst CLAMPED_LOD_LOAD_PREFIX: &str = \"clamped_lod_e\";\r\n\r\nstruct TypeContext<'a> {\r\n    handle: Handle<crate::Type>,\r\n    module: &'a crate::Module,\r\n    names: &'a FastHashMap<NameKey, String>,\r\n    access: crate::StorageAccess,\r\n    binding: Option<&'a super::ResolvedBinding>,\r\n    first_time: bool,\r\n}\r\n\r\nimpl<'a> Display for TypeContext<'a> {\r\n    fn fmt(&self, out: &mut Formatter<'_>) -> Result<(), FmtError> {\r\n        let ty = &self.module.types[self.handle];\r\n        if ty.needs_alias() && !self.first_time {\r\n            let name = &self.names[&NameKey::Type(self.handle)];\r\n            return write!(out, \"{}\", name);\r\n        }\r\n\r\n        match ty.inner {\r\n            crate::TypeInner::Scalar { kind, .. } => put_numeric_type(out, kind, &[]),\r\n            crate::TypeInner::Atomic { kind, .. } => {\r\n                write!(out, \"{}::atomic_{}\", NAMESPACE, kind.to_msl_name())\r\n            }\r\n            crate::TypeInner::Vector { size, kind, .. } => put_numeric_type(out, kind, &[size]),\r\n            crate::TypeInner::Matrix { columns, rows, .. } => {\r\n                put_numeric_type(out, crate::ScalarKind::Float, &[rows, columns])\r\n            }\r\n            crate::TypeInner::Pointer { base, space } => {\r\n                let sub = Self {\r\n                    handle: base,\r\n                    first_time: false,\r\n                    ..*self\r\n                };\r\n                let space_name = match space.to_msl_name() {\r\n                    Some(name) => name,\r\n                    None => return Ok(()),\r\n                };\r\n                write!(out, \"{} {}&\", space_name, sub)\r\n            }\r\n            crate::TypeInner::ValuePointer {\r\n                size,\r\n                kind,\r\n                width: _,\r\n                space,\r\n            } => {\r\n                match space.to_msl_name() {\r\n                    Some(name) => write!(out, \"{} \", name)?,\r\n                    None => return Ok(()),\r\n                };\r\n                match size {\r\n                    Some(rows) => put_numeric_type(out, kind, &[rows])?,\r\n                    None => put_numeric_type(out, kind, &[])?,\r\n                };\r\n\r\n                write!(out, \"&\")\r\n            }\r\n            crate::TypeInner::Array { base, .. } => {\r\n                let sub = Self {\r\n                    handle: base,\r\n                    first_time: false,\r\n                    ..*self\r\n                };\r\n                // Array lengths go at the end of the type definition,\r\n                // so just print the element type here.\r\n                write!(out, \"{}\", sub)\r\n            }\r\n            crate::TypeInner::Struct { .. } => unreachable!(),\r\n            crate::TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class,\r\n            } => {\r\n                let dim_str = match dim {\r\n                    crate::ImageDimension::D1 => \"1d\",\r\n                    crate::ImageDimension::D2 => \"2d\",\r\n                    crate::ImageDimension::D3 => \"3d\",\r\n                    crate::ImageDimension::Cube => \"cube\",\r\n                };\r\n                let (texture_str, msaa_str, kind, access) = match class {\r\n                    crate::ImageClass::Sampled { kind, multi } => {\r\n                        let (msaa_str, access) = if multi {\r\n                            (\"_ms\", \"read\")\r\n                        } else {\r\n                            (\"\", \"sample\")\r\n                        };\r\n                        (\"texture\", msaa_str, kind, access)\r\n                    }\r\n                    crate::ImageClass::Depth { multi } => {\r\n                        let (msaa_str, access) = if multi {\r\n                            (\"_ms\", \"read\")\r\n                        } else {\r\n                            (\"\", \"sample\")\r\n                        };\r\n                        (\"depth\", msaa_str, crate::ScalarKind::Float, access)\r\n                    }\r\n                    crate::ImageClass::Storage { format, .. } => {\r\n                        let access = if self\r\n                            .access\r\n                            .contains(crate::StorageAccess::LOAD | crate::StorageAccess::STORE)\r\n                        {\r\n                            \"read_write\"\r\n                        } else if self.access.contains(crate::StorageAccess::STORE) {\r\n                            \"write\"\r\n                        } else if self.access.contains(crate::StorageAccess::LOAD) {\r\n                            \"read\"\r\n                        } else {\r\n                            log::warn!(\r\n                                \"Storage access for {:?} (name '{}'): {:?}\",\r\n                                self.handle,\r\n                                ty.name.as_deref().unwrap_or_default(),\r\n                                self.access\r\n                            );\r\n                            unreachable!(\"module is not valid\");\r\n                        };\r\n                        (\"texture\", \"\", format.into(), access)\r\n                    }\r\n                };\r\n                let base_name = kind.to_msl_name();\r\n                let array_str = if arrayed { \"_array\" } else { \"\" };\r\n                write!(\r\n                    out,\r\n                    \"{}::{}{}{}{}<{}, {}::access::{}>\",\r\n                    NAMESPACE,\r\n                    texture_str,\r\n                    dim_str,\r\n                    msaa_str,\r\n                    array_str,\r\n                    base_name,\r\n                    NAMESPACE,\r\n                    access,\r\n                )\r\n            }\r\n            crate::TypeInner::Sampler { comparison: _ } => {\r\n                write!(out, \"{}::sampler\", NAMESPACE)\r\n            }\r\n            crate::TypeInner::BindingArray { base, size } => {\r\n                let base_tyname = Self {\r\n                    handle: base,\r\n                    first_time: false,\r\n                    ..*self\r\n                };\r\n\r\n                if let Some(&super::ResolvedBinding::Resource(super::BindTarget {\r\n                    binding_array_size: Some(override_size),\r\n                    ..\r\n                })) = self.binding\r\n                {\r\n                    write!(\r\n                        out,\r\n                        \"{}::array<{}, {}>\",\r\n                        NAMESPACE, base_tyname, override_size\r\n                    )\r\n                } else if let crate::ArraySize::Constant(size) = size {\r\n                    let constant_ctx = ConstantContext {\r\n                        handle: size,\r\n                        arena: &self.module.constants,\r\n                        names: self.names,\r\n                        first_time: false,\r\n                    };\r\n                    write!(\r\n                        out,\r\n                        \"{}::array<{}, {}>\",\r\n                        NAMESPACE, base_tyname, constant_ctx\r\n                    )\r\n                } else {\r\n                    unreachable!(\"metal requires all arrays be constant sized\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nstruct TypedGlobalVariable<'a> {\r\n    module: &'a crate::Module,\r\n    names: &'a FastHashMap<NameKey, String>,\r\n    handle: Handle<crate::GlobalVariable>,\r\n    usage: valid::GlobalUse,\r\n    binding: Option<&'a super::ResolvedBinding>,\r\n    reference: bool,\r\n}\r\n\r\nimpl<'a> TypedGlobalVariable<'a> {\r\n    fn try_fmt<W: Write>(&self, out: &mut W) -> BackendResult {\r\n        let var = &self.module.global_variables[self.handle];\r\n        let name = &self.names[&NameKey::GlobalVariable(self.handle)];\r\n\r\n        let storage_access = match var.space {\r\n            crate::AddressSpace::Storage { access } => access,\r\n            _ => match self.module.types[var.ty].inner {\r\n                crate::TypeInner::Image {\r\n                    class: crate::ImageClass::Storage { access, .. },\r\n                    ..\r\n                } => access,\r\n                crate::TypeInner::BindingArray { base, .. } => {\r\n                    match self.module.types[base].inner {\r\n                        crate::TypeInner::Image {\r\n                            class: crate::ImageClass::Storage { access, .. },\r\n                            ..\r\n                        } => access,\r\n                        _ => crate::StorageAccess::default(),\r\n                    }\r\n                }\r\n                _ => crate::StorageAccess::default(),\r\n            },\r\n        };\r\n        let ty_name = TypeContext {\r\n            handle: var.ty,\r\n            module: self.module,\r\n            names: self.names,\r\n            access: storage_access,\r\n            binding: self.binding,\r\n            first_time: false,\r\n        };\r\n\r\n        let (space, access, reference) = match var.space.to_msl_name() {\r\n            Some(space) if self.reference => {\r\n                let access = if var.space.needs_access_qualifier()\r\n                    && !self.usage.contains(valid::GlobalUse::WRITE)\r\n                {\r\n                    \"const\"\r\n                } else {\r\n                    \"\"\r\n                };\r\n                (space, access, \"&\")\r\n            }\r\n            _ => (\"\", \"\", \"\"),\r\n        };\r\n\r\n        Ok(write!(\r\n            out,\r\n            \"{}{}{}{}{}{} {}\",\r\n            space,\r\n            if space.is_empty() { \"\" } else { \" \" },\r\n            ty_name,\r\n            if access.is_empty() { \"\" } else { \" \" },\r\n            access,\r\n            reference,\r\n            name,\r\n        )?)\r\n    }\r\n}\r\n\r\nstruct ConstantContext<'a> {\r\n    handle: Handle<crate::Constant>,\r\n    arena: &'a crate::Arena<crate::Constant>,\r\n    names: &'a FastHashMap<NameKey, String>,\r\n    first_time: bool,\r\n}\r\n\r\nimpl<'a> Display for ConstantContext<'a> {\r\n    fn fmt(&self, out: &mut Formatter<'_>) -> Result<(), FmtError> {\r\n        let con = &self.arena[self.handle];\r\n        if con.needs_alias() && !self.first_time {\r\n            let name = &self.names[&NameKey::Constant(self.handle)];\r\n            return write!(out, \"{}\", name);\r\n        }\r\n\r\n        match con.inner {\r\n            crate::ConstantInner::Scalar { value, width: _ } => match value {\r\n                crate::ScalarValue::Sint(value) => {\r\n                    write!(out, \"{}\", value)\r\n                }\r\n                crate::ScalarValue::Uint(value) => {\r\n                    write!(out, \"{}u\", value)\r\n                }\r\n                crate::ScalarValue::Float(value) => {\r\n                    if value.is_infinite() {\r\n                        let sign = if value.is_sign_negative() { \"-\" } else { \"\" };\r\n                        write!(out, \"{}INFINITY\", sign)\r\n                    } else if value.is_nan() {\r\n                        write!(out, \"NAN\")\r\n                    } else {\r\n                        let suffix = if value.fract() == 0.0 { \".0\" } else { \"\" };\r\n\r\n                        write!(out, \"{}{}\", value, suffix)\r\n                    }\r\n                }\r\n                crate::ScalarValue::Bool(value) => {\r\n                    write!(out, \"{}\", value)\r\n                }\r\n            },\r\n            crate::ConstantInner::Composite { .. } => unreachable!(\"should be aliased\"),\r\n        }\r\n    }\r\n}\r\n\r\npub struct Writer<W> {\r\n    out: W,\r\n    names: FastHashMap<NameKey, String>,\r\n    named_expressions: crate::NamedExpressions,\r\n    /// Set of expressions that need to be baked to avoid unnecessary repetition in output\r\n    need_bake_expressions: back::NeedBakeExpressions,\r\n    namer: proc::Namer,\r\n    #[cfg(test)]\r\n    put_expression_stack_pointers: FastHashSet<*const ()>,\r\n    #[cfg(test)]\r\n    put_block_stack_pointers: FastHashSet<*const ()>,\r\n    /// Set of (struct type, struct field index) denoting which fields require\r\n    /// padding inserted **before** them (i.e. between fields at index - 1 and index)\r\n    struct_member_pads: FastHashSet<(Handle<crate::Type>, u32)>,\r\n}\r\n\r\nimpl crate::ScalarKind {\r\n    const fn to_msl_name(self) -> &'static str {\r\n        match self {\r\n            Self::Float => \"float\",\r\n            Self::Sint => \"int\",\r\n            Self::Uint => \"uint\",\r\n            Self::Bool => \"bool\",\r\n        }\r\n    }\r\n}\r\n\r\nconst fn separate(need_separator: bool) -> &'static str {\r\n    if need_separator {\r\n        \",\"\r\n    } else {\r\n        \"\"\r\n    }\r\n}\r\n\r\nfn should_pack_struct_member(\r\n    members: &[crate::StructMember],\r\n    span: u32,\r\n    index: usize,\r\n    module: &crate::Module,\r\n) -> Option<crate::ScalarKind> {\r\n    let member = &members[index];\r\n    //Note: this is imperfect - the same structure can be used for host-shared\r\n    // things, where packed float would matter.\r\n    if member.binding.is_some() {\r\n        return None;\r\n    }\r\n\r\n    let ty_inner = &module.types[member.ty].inner;\r\n    let last_offset = member.offset + ty_inner.size(&module.constants);\r\n    let next_offset = match members.get(index + 1) {\r\n        Some(next) => next.offset,\r\n        None => span,\r\n    };\r\n    let is_tight = next_offset == last_offset;\r\n\r\n    match *ty_inner {\r\n        crate::TypeInner::Vector {\r\n            size: crate::VectorSize::Tri,\r\n            width: 4,\r\n            kind,\r\n        } if member.offset & 0xF != 0 || is_tight => Some(kind),\r\n        _ => None,\r\n    }\r\n}\r\n\r\nfn needs_array_length(ty: Handle<crate::Type>, arena: &crate::UniqueArena<crate::Type>) -> bool {\r\n    match arena[ty].inner {\r\n        crate::TypeInner::Struct { ref members, .. } => {\r\n            if let Some(member) = members.last() {\r\n                if let crate::TypeInner::Array {\r\n                    size: crate::ArraySize::Dynamic,\r\n                    ..\r\n                } = arena[member.ty].inner\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n            false\r\n        }\r\n        crate::TypeInner::Array {\r\n            size: crate::ArraySize::Dynamic,\r\n            ..\r\n        } => true,\r\n        _ => false,\r\n    }\r\n}\r\n\r\nimpl crate::AddressSpace {\r\n    /// Returns true if global variables in this address space are\r\n    /// passed in function arguments. These arguments need to be\r\n    /// passed through any functions called from the entry point.\r\n    const fn needs_pass_through(&self) -> bool {\r\n        match *self {\r\n            Self::Uniform\r\n            | Self::Storage { .. }\r\n            | Self::Private\r\n            | Self::WorkGroup\r\n            | Self::PushConstant\r\n            | Self::Handle => true,\r\n            Self::Function => false,\r\n        }\r\n    }\r\n\r\n    /// Returns true if the address space may need a \"const\" qualifier.\r\n    const fn needs_access_qualifier(&self) -> bool {\r\n        match *self {\r\n            //Note: we are ignoring the storage access here, and instead\r\n            // rely on the actual use of a global by functions. This means we\r\n            // may end up with \"const\" even if the binding is read-write,\r\n            // and that should be OK.\r\n            Self::Storage { .. } => true,\r\n            // These should always be read-write.\r\n            Self::Private | Self::WorkGroup => false,\r\n            // These translate to `constant` address space, no need for qualifiers.\r\n            Self::Uniform | Self::PushConstant => false,\r\n            // Not applicable.\r\n            Self::Handle | Self::Function => false,\r\n        }\r\n    }\r\n\r\n    const fn to_msl_name(self) -> Option<&'static str> {\r\n        match self {\r\n            Self::Handle => None,\r\n            Self::Uniform | Self::PushConstant => Some(\"constant\"),\r\n            Self::Storage { .. } => Some(\"device\"),\r\n            Self::Private | Self::Function => Some(\"thread\"),\r\n            Self::WorkGroup => Some(\"threadgroup\"),\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Type {\r\n    // Returns `true` if we need to emit an alias for this type.\r\n    const fn needs_alias(&self) -> bool {\r\n        use crate::TypeInner as Ti;\r\n\r\n        match self.inner {\r\n            // value types are concise enough, we only alias them if they are named\r\n            Ti::Scalar { .. }\r\n            | Ti::Vector { .. }\r\n            | Ti::Matrix { .. }\r\n            | Ti::Atomic { .. }\r\n            | Ti::Pointer { .. }\r\n            | Ti::ValuePointer { .. } => self.name.is_some(),\r\n            // composite types are better to be aliased, regardless of the name\r\n            Ti::Struct { .. } | Ti::Array { .. } => true,\r\n            // handle types may be different, depending on the global var access, so we always inline them\r\n            Ti::Image { .. } | Ti::Sampler { .. } | Ti::BindingArray { .. } => false,\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Constant {\r\n    // Returns `true` if we need to emit an alias for this constant.\r\n    const fn needs_alias(&self) -> bool {\r\n        match self.inner {\r\n            crate::ConstantInner::Scalar { .. } => self.name.is_some(),\r\n            crate::ConstantInner::Composite { .. } => true,\r\n        }\r\n    }\r\n}\r\n\r\nenum FunctionOrigin {\r\n    Handle(Handle<crate::Function>),\r\n    EntryPoint(proc::EntryPointIndex),\r\n}\r\n\r\n/// A level of detail argument.\r\n///\r\n/// When [`BoundsCheckPolicy::Restrict`] applies to an [`ImageLoad`] access, we\r\n/// save the clamped level of detail in a temporary variable whose name is based\r\n/// on the handle of the `ImageLoad` expression. But for other policies, we just\r\n/// use the expression directly.\r\n///\r\n/// [`BoundsCheckPolicy::Restrict`]: index::BoundsCheckPolicy::Restrict\r\n/// [`ImageLoad`]: crate::Expression::ImageLoad\r\n#[derive(Clone, Copy)]\r\nenum LevelOfDetail {\r\n    Direct(Handle<crate::Expression>),\r\n    Restricted(Handle<crate::Expression>),\r\n}\r\n\r\n/// Values needed to select a particular texel for [`ImageLoad`] and [`ImageStore`].\r\n///\r\n/// When this is used in code paths unconcerned with the `Restrict` bounds check\r\n/// policy, the `LevelOfDetail` enum introduces an unneeded match, since `level`\r\n/// will always be either `None` or `Some(Direct(_))`. But this turns out not to\r\n/// be too awkward. If that changes, we can revisit.\r\n///\r\n/// [`ImageLoad`]: crate::Expression::ImageLoad\r\n/// [`ImageStore`]: crate::Statement::ImageStore\r\nstruct TexelAddress {\r\n    coordinate: Handle<crate::Expression>,\r\n    array_index: Option<Handle<crate::Expression>>,\r\n    sample: Option<Handle<crate::Expression>>,\r\n    level: Option<LevelOfDetail>,\r\n}\r\n\r\nstruct ExpressionContext<'a> {\r\n    function: &'a crate::Function,\r\n    origin: FunctionOrigin,\r\n    info: &'a valid::FunctionInfo,\r\n    module: &'a crate::Module,\r\n    pipeline_options: &'a PipelineOptions,\r\n    policies: index::BoundsCheckPolicies,\r\n\r\n    /// A bitset containing the `Expression` handle indexes of expressions used\r\n    /// as indices in `ReadZeroSkipWrite`-policy accesses. These may need to be\r\n    /// cached in temporary variables. See `index::find_checked_indexes` for\r\n    /// details.\r\n    guarded_indices: BitSet,\r\n}\r\n\r\nimpl<'a> ExpressionContext<'a> {\r\n    fn resolve_type(&self, handle: Handle<crate::Expression>) -> &'a crate::TypeInner {\r\n        self.info[handle].ty.inner_with(&self.module.types)\r\n    }\r\n\r\n    /// Return true if calls to `image`'s `read` and `write` methods should supply a level of detail.\r\n    ///\r\n    /// Only mipmapped images need to specify a level of detail. Since 1D\r\n    /// textures cannot have mipmaps, MSL requires that the level argument to\r\n    /// texture1d queries and accesses must be a constexpr 0. It's easiest\r\n    /// just to omit the level entirely for 1D textures.\r\n    fn image_needs_lod(&self, image: Handle<crate::Expression>) -> bool {\r\n        let image_ty = self.resolve_type(image);\r\n        if let crate::TypeInner::Image { dim, class, .. } = *image_ty {\r\n            class.is_mipmapped() && dim != crate::ImageDimension::D1\r\n        } else {\r\n            false\r\n        }\r\n    }\r\n\r\n    fn choose_bounds_check_policy(\r\n        &self,\r\n        pointer: Handle<crate::Expression>,\r\n    ) -> index::BoundsCheckPolicy {\r\n        self.policies\r\n            .choose_policy(pointer, &self.module.types, self.info)\r\n    }\r\n\r\n    fn access_needs_check(\r\n        &self,\r\n        base: Handle<crate::Expression>,\r\n        index: index::GuardedIndex,\r\n    ) -> Option<index::IndexableLength> {\r\n        index::access_needs_check(base, index, self.module, self.function, self.info)\r\n    }\r\n\r\n    fn get_packed_vec_kind(\r\n        &self,\r\n        expr_handle: Handle<crate::Expression>,\r\n    ) -> Option<crate::ScalarKind> {\r\n        match self.function.expressions[expr_handle] {\r\n            crate::Expression::AccessIndex { base, index } => {\r\n                let ty = match *self.resolve_type(base) {\r\n                    crate::TypeInner::Pointer { base, .. } => &self.module.types[base].inner,\r\n                    ref ty => ty,\r\n                };\r\n                match *ty {\r\n                    crate::TypeInner::Struct {\r\n                        ref members, span, ..\r\n                    } => should_pack_struct_member(members, span, index as usize, self.module),\r\n                    _ => None,\r\n                }\r\n            }\r\n            _ => None,\r\n        }\r\n    }\r\n}\r\n\r\nstruct StatementContext<'a> {\r\n    expression: ExpressionContext<'a>,\r\n    mod_info: &'a valid::ModuleInfo,\r\n    result_struct: Option<&'a str>,\r\n}\r\n\r\nimpl<W: Write> Writer<W> {\r\n    /// Creates a new `Writer` instance.\r\n    pub fn new(out: W) -> Self {\r\n        Writer {\r\n            out,\r\n            names: FastHashMap::default(),\r\n            named_expressions: Default::default(),\r\n            need_bake_expressions: Default::default(),\r\n            namer: proc::Namer::default(),\r\n            #[cfg(test)]\r\n            put_expression_stack_pointers: Default::default(),\r\n            #[cfg(test)]\r\n            put_block_stack_pointers: Default::default(),\r\n            struct_member_pads: FastHashSet::default(),\r\n        }\r\n    }\r\n\r\n    /// Finishes writing and returns the output.\r\n    // See https://github.com/rust-lang/rust-clippy/issues/4979.\r\n    #[allow(clippy::missing_const_for_fn)]\r\n    pub fn finish(self) -> W {\r\n        self.out\r\n    }\r\n\r\n    fn put_call_parameters(\r\n        &mut self,\r\n        parameters: impl Iterator<Item = Handle<crate::Expression>>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        write!(self.out, \"(\")?;\r\n        for (i, handle) in parameters.enumerate() {\r\n            if i != 0 {\r\n                write!(self.out, \", \")?;\r\n            }\r\n            self.put_expression(handle, context, true)?;\r\n        }\r\n        write!(self.out, \")\")?;\r\n        Ok(())\r\n    }\r\n\r\n    fn put_level_of_detail(\r\n        &mut self,\r\n        level: LevelOfDetail,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        match level {\r\n            LevelOfDetail::Direct(expr) => self.put_expression(expr, context, true)?,\r\n            LevelOfDetail::Restricted(load) => {\r\n                write!(self.out, \"{}{}\", CLAMPED_LOD_LOAD_PREFIX, load.index())?\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn put_image_query(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        query: &str,\r\n        level: Option<LevelOfDetail>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        self.put_expression(image, context, false)?;\r\n        write!(self.out, \".get_{}(\", query)?;\r\n        if let Some(level) = level {\r\n            self.put_level_of_detail(level, context)?;\r\n        }\r\n        write!(self.out, \")\")?;\r\n        Ok(())\r\n    }\r\n\r\n    fn put_image_size_query(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        level: Option<LevelOfDetail>,\r\n        kind: crate::ScalarKind,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        //Note: MSL only has separate width/height/depth queries,\r\n        // so compose the result of them.\r\n        let dim = match *context.resolve_type(image) {\r\n            crate::TypeInner::Image { dim, .. } => dim,\r\n            ref other => unreachable!(\"Unexpected type {:?}\", other),\r\n        };\r\n        let coordinate_type = kind.to_msl_name();\r\n        match dim {\r\n            crate::ImageDimension::D1 => {\r\n                // Since 1D textures never have mipmaps, MSL requires that the\r\n                // `level` argument be a constexpr 0. It's simplest for us just\r\n                // to pass `None` and omit the level entirely.\r\n                if kind == crate::ScalarKind::Uint {\r\n                    // No need to construct a vector. No cast needed.\r\n                    self.put_image_query(image, \"width\", None, context)?;\r\n                } else {\r\n                    // There's no definition for `int` in the `metal` namespace.\r\n                    write!(self.out, \"int(\")?;\r\n                    self.put_image_query(image, \"width\", None, context)?;\r\n                    write!(self.out, \")\")?;\r\n                }\r\n            }\r\n            crate::ImageDimension::D2 => {\r\n                write!(self.out, \"{}::{}2(\", NAMESPACE, coordinate_type)?;\r\n                self.put_image_query(image, \"width\", level, context)?;\r\n                write!(self.out, \", \")?;\r\n                self.put_image_query(image, \"height\", level, context)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::ImageDimension::D3 => {\r\n                write!(self.out, \"{}::{}3(\", NAMESPACE, coordinate_type)?;\r\n                self.put_image_query(image, \"width\", level, context)?;\r\n                write!(self.out, \", \")?;\r\n                self.put_image_query(image, \"height\", level, context)?;\r\n                write!(self.out, \", \")?;\r\n                self.put_image_query(image, \"depth\", level, context)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::ImageDimension::Cube => {\r\n                write!(self.out, \"{}::{}2(\", NAMESPACE, coordinate_type)?;\r\n                self.put_image_query(image, \"width\", level, context)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn put_cast_to_uint_scalar_or_vector(\r\n        &mut self,\r\n        expr: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        // coordinates in IR are int, but Metal expects uint\r\n        match *context.resolve_type(expr) {\r\n            crate::TypeInner::Scalar { .. } => {\r\n                put_numeric_type(&mut self.out, crate::ScalarKind::Uint, &[])?\r\n            }\r\n            crate::TypeInner::Vector { size, .. } => {\r\n                put_numeric_type(&mut self.out, crate::ScalarKind::Uint, &[size])?\r\n            }\r\n            _ => return Err(Error::Validation),\r\n        };\r\n\r\n        write!(self.out, \"(\")?;\r\n        self.put_expression(expr, context, true)?;\r\n        write!(self.out, \")\")?;\r\n        Ok(())\r\n    }\r\n\r\n    fn put_image_sample_level(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        level: crate::SampleLevel,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        let has_levels = context.image_needs_lod(image);\r\n        match level {\r\n            crate::SampleLevel::Auto => {}\r\n            crate::SampleLevel::Zero => {\r\n                //TODO: do we support Zero on `Sampled` image classes?\r\n            }\r\n            _ if !has_levels => {\r\n                log::warn!(\"1D image can't be sampled with level {:?}\", level);\r\n            }\r\n            crate::SampleLevel::Exact(h) => {\r\n                write!(self.out, \", {}::level(\", NAMESPACE)?;\r\n                self.put_expression(h, context, true)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::SampleLevel::Bias(h) => {\r\n                write!(self.out, \", {}::bias(\", NAMESPACE)?;\r\n                self.put_expression(h, context, true)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::SampleLevel::Gradient { x, y } => {\r\n                write!(self.out, \", {}::gradient2d(\", NAMESPACE)?;\r\n                self.put_expression(x, context, true)?;\r\n                write!(self.out, \", \")?;\r\n                self.put_expression(y, context, true)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn put_image_coordinate_limits(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        level: Option<LevelOfDetail>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        self.put_image_size_query(image, level, crate::ScalarKind::Uint, context)?;\r\n        write!(self.out, \" - 1\")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// General function for writing restricted image indexes.\r\n    ///\r\n    /// This is used to produce restricted mip levels, array indices, and sample\r\n    /// indices for [`ImageLoad`] and [`ImageStore`] accesses under the\r\n    /// [`Restrict`] bounds check policy.\r\n    ///\r\n    /// This function writes an expression of the form:\r\n    ///\r\n    /// ```ignore\r\n    ///\r\n    ///     metal::min(uint(INDEX), IMAGE.LIMIT_METHOD() - 1)\r\n    ///\r\n    /// ```\r\n    ///\r\n    /// [`ImageLoad`]: crate::Expression::ImageLoad\r\n    /// [`ImageStore`]: crate::Statement::ImageStore\r\n    /// [`Restrict`]: index::BoundsCheckPolicy::Restrict\r\n    fn put_restricted_scalar_image_index(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        index: Handle<crate::Expression>,\r\n        limit_method: &str,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        write!(self.out, \"{}::min(uint(\", NAMESPACE)?;\r\n        self.put_expression(index, context, true)?;\r\n        write!(self.out, \"), \")?;\r\n        self.put_expression(image, context, false)?;\r\n        write!(self.out, \".{}() - 1)\", limit_method)?;\r\n        Ok(())\r\n    }\r\n\r\n    fn put_restricted_texel_address(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        address: &TexelAddress,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        // Write the coordinate.\r\n        write!(self.out, \"{}::min(\", NAMESPACE)?;\r\n        self.put_cast_to_uint_scalar_or_vector(address.coordinate, context)?;\r\n        write!(self.out, \", \")?;\r\n        self.put_image_coordinate_limits(image, address.level, context)?;\r\n        write!(self.out, \")\")?;\r\n\r\n        // Write the array index, if present.\r\n        if let Some(array_index) = address.array_index {\r\n            write!(self.out, \", \")?;\r\n            self.put_restricted_scalar_image_index(image, array_index, \"get_array_size\", context)?;\r\n        }\r\n\r\n        // Write the sample index, if present.\r\n        if let Some(sample) = address.sample {\r\n            write!(self.out, \", \")?;\r\n            self.put_restricted_scalar_image_index(image, sample, \"get_num_samples\", context)?;\r\n        }\r\n\r\n        // The level of detail should be clamped and cached by\r\n        // `put_cache_restricted_level`, so we don't need to clamp it here.\r\n        if let Some(level) = address.level {\r\n            write!(self.out, \", \")?;\r\n            self.put_level_of_detail(level, context)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Write an expression that is true if the given image access is in bounds.\r\n    fn put_image_access_bounds_check(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        address: &TexelAddress,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        let mut conjunction = \"\";\r\n\r\n        // First, check the level of detail. Only if that is in bounds can we\r\n        // use it to find the appropriate bounds for the coordinates.\r\n        let level = if let Some(level) = address.level {\r\n            write!(self.out, \"uint(\")?;\r\n            self.put_level_of_detail(level, context)?;\r\n            write!(self.out, \") < \")?;\r\n            self.put_expression(image, context, true)?;\r\n            write!(self.out, \".get_num_mip_levels()\")?;\r\n            conjunction = \" && \";\r\n            Some(level)\r\n        } else {\r\n            None\r\n        };\r\n\r\n        // Check sample index, if present.\r\n        if let Some(sample) = address.sample {\r\n            write!(self.out, \"uint(\")?;\r\n            self.put_expression(sample, context, true)?;\r\n            write!(self.out, \") < \")?;\r\n            self.put_expression(image, context, true)?;\r\n            write!(self.out, \".get_num_samples()\")?;\r\n            conjunction = \" && \";\r\n        }\r\n\r\n        // Check array index, if present.\r\n        if let Some(array_index) = address.array_index {\r\n            write!(self.out, \"{}uint(\", conjunction)?;\r\n            self.put_expression(array_index, context, true)?;\r\n            write!(self.out, \") < \")?;\r\n            self.put_expression(image, context, true)?;\r\n            write!(self.out, \".get_array_size()\")?;\r\n            conjunction = \" && \";\r\n        }\r\n\r\n        // Finally, check if the coordinates are within bounds.\r\n        let coord_is_vector = match *context.resolve_type(address.coordinate) {\r\n            crate::TypeInner::Vector { .. } => true,\r\n            _ => false,\r\n        };\r\n        write!(self.out, \"{}\", conjunction)?;\r\n        if coord_is_vector {\r\n            write!(self.out, \"{}::all(\", NAMESPACE)?;\r\n        }\r\n        self.put_cast_to_uint_scalar_or_vector(address.coordinate, context)?;\r\n        write!(self.out, \" < \")?;\r\n        self.put_image_size_query(image, level, crate::ScalarKind::Uint, context)?;\r\n        if coord_is_vector {\r\n            write!(self.out, \")\")?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_image_load(\r\n        &mut self,\r\n        load: Handle<crate::Expression>,\r\n        image: Handle<crate::Expression>,\r\n        mut address: TexelAddress,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        match context.policies.image {\r\n            proc::BoundsCheckPolicy::Restrict => {\r\n                // Use the cached restricted level of detail, if any. Omit the\r\n                // level altogether for 1D textures.\r\n                if address.level.is_some() {\r\n                    address.level = if context.image_needs_lod(image) {\r\n                        Some(LevelOfDetail::Restricted(load))\r\n                    } else {\r\n                        None\r\n                    }\r\n                }\r\n\r\n                self.put_expression(image, context, false)?;\r\n                write!(self.out, \".read(\")?;\r\n                self.put_restricted_texel_address(image, &address, context)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            proc::BoundsCheckPolicy::ReadZeroSkipWrite => {\r\n                write!(self.out, \"(\")?;\r\n                self.put_image_access_bounds_check(image, &address, context)?;\r\n                write!(self.out, \" ? \")?;\r\n                self.put_unchecked_image_load(image, &address, context)?;\r\n                write!(self.out, \": DefaultConstructible())\")?;\r\n            }\r\n            proc::BoundsCheckPolicy::Unchecked => {\r\n                self.put_unchecked_image_load(image, &address, context)?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_unchecked_image_load(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        address: &TexelAddress,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        self.put_expression(image, context, false)?;\r\n        write!(self.out, \".read(\")?;\r\n        // coordinates in IR are int, but Metal expects uint\r\n        self.put_cast_to_uint_scalar_or_vector(address.coordinate, context)?;\r\n        if let Some(expr) = address.array_index {\r\n            write!(self.out, \", \")?;\r\n            self.put_expression(expr, context, true)?;\r\n        }\r\n        if let Some(sample) = address.sample {\r\n            write!(self.out, \", \")?;\r\n            self.put_expression(sample, context, true)?;\r\n        }\r\n        if let Some(level) = address.level {\r\n            if context.image_needs_lod(image) {\r\n                write!(self.out, \", \")?;\r\n                self.put_level_of_detail(level, context)?;\r\n            }\r\n        }\r\n        write!(self.out, \")\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_image_store(\r\n        &mut self,\r\n        level: back::Level,\r\n        image: Handle<crate::Expression>,\r\n        address: &TexelAddress,\r\n        value: Handle<crate::Expression>,\r\n        context: &StatementContext,\r\n    ) -> BackendResult {\r\n        match context.expression.policies.image {\r\n            proc::BoundsCheckPolicy::Restrict => {\r\n                // We don't have a restricted level value, because we don't\r\n                // support writes to mipmapped textures.\r\n                debug_assert!(address.level.is_none());\r\n\r\n                write!(self.out, \"{}\", level)?;\r\n                self.put_expression(image, &context.expression, false)?;\r\n                write!(self.out, \".write(\")?;\r\n                self.put_expression(value, &context.expression, true)?;\r\n                write!(self.out, \", \")?;\r\n                self.put_restricted_texel_address(image, address, &context.expression)?;\r\n                writeln!(self.out, \");\")?;\r\n            }\r\n            proc::BoundsCheckPolicy::ReadZeroSkipWrite => {\r\n                write!(self.out, \"{}if (\", level)?;\r\n                self.put_image_access_bounds_check(image, address, &context.expression)?;\r\n                writeln!(self.out, \") {{\")?;\r\n                self.put_unchecked_image_store(level.next(), image, address, value, context)?;\r\n                writeln!(self.out, \"{}}}\", level)?;\r\n            }\r\n            proc::BoundsCheckPolicy::Unchecked => {\r\n                self.put_unchecked_image_store(level, image, address, value, context)?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_unchecked_image_store(\r\n        &mut self,\r\n        level: back::Level,\r\n        image: Handle<crate::Expression>,\r\n        address: &TexelAddress,\r\n        value: Handle<crate::Expression>,\r\n        context: &StatementContext,\r\n    ) -> BackendResult {\r\n        write!(self.out, \"{}\", level)?;\r\n        self.put_expression(image, &context.expression, false)?;\r\n        write!(self.out, \".write(\")?;\r\n        self.put_expression(value, &context.expression, true)?;\r\n        write!(self.out, \", \")?;\r\n        // coordinates in IR are int, but Metal expects uint\r\n        self.put_cast_to_uint_scalar_or_vector(address.coordinate, &context.expression)?;\r\n        if let Some(expr) = address.array_index {\r\n            write!(self.out, \", \")?;\r\n            self.put_expression(expr, &context.expression, true)?;\r\n        }\r\n        writeln!(self.out, \");\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_compose(\r\n        &mut self,\r\n        ty: Handle<crate::Type>,\r\n        components: &[Handle<crate::Expression>],\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        match context.module.types[ty].inner {\r\n            crate::TypeInner::Scalar { width: 4, kind } if components.len() == 1 => {\r\n                write!(self.out, \"{}\", kind.to_msl_name())?;\r\n                self.put_call_parameters(components.iter().cloned(), context)?;\r\n            }\r\n            crate::TypeInner::Vector { size, kind, .. } => {\r\n                put_numeric_type(&mut self.out, kind, &[size])?;\r\n                self.put_call_parameters(components.iter().cloned(), context)?;\r\n            }\r\n            crate::TypeInner::Matrix { columns, rows, .. } => {\r\n                put_numeric_type(&mut self.out, crate::ScalarKind::Float, &[rows, columns])?;\r\n                self.put_call_parameters(components.iter().cloned(), context)?;\r\n            }\r\n            crate::TypeInner::Array { .. } | crate::TypeInner::Struct { .. } => {\r\n                write!(self.out, \"{} {{\", &self.names[&NameKey::Type(ty)])?;\r\n                for (index, &component) in components.iter().enumerate() {\r\n                    if index != 0 {\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                    // insert padding initialization, if needed\r\n                    if self.struct_member_pads.contains(&(ty, index as u32)) {\r\n                        write!(self.out, \"{{}}, \")?;\r\n                    }\r\n                    self.put_expression(component, context, true)?;\r\n                }\r\n                write!(self.out, \"}}\")?;\r\n            }\r\n            _ => return Err(Error::UnsupportedCompose(ty)),\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Write the maximum valid index of the dynamically sized array at the end of `handle`.\r\n    ///\r\n    /// The 'maximum valid index' is simply one less than the array's length.\r\n    ///\r\n    /// This emits an expression of the form `a / b`, so the caller must\r\n    /// parenthesize its output if it will be applying operators of higher\r\n    /// precedence.\r\n    ///\r\n    /// `handle` must be the handle of a global variable whose final member is a\r\n    /// dynamically sized array.\r\n    fn put_dynamic_array_max_index(\r\n        &mut self,\r\n        handle: Handle<crate::GlobalVariable>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        let global = &context.module.global_variables[handle];\r\n        let (offset, array_ty) = match context.module.types[global.ty].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => match members.last() {\r\n                Some(&crate::StructMember { offset, ty, .. }) => (offset, ty),\r\n                None => return Err(Error::Validation),\r\n            },\r\n            crate::TypeInner::Array {\r\n                size: crate::ArraySize::Dynamic,\r\n                ..\r\n            } => (0, global.ty),\r\n            _ => return Err(Error::Validation),\r\n        };\r\n\r\n        let (size, stride) = match context.module.types[array_ty].inner {\r\n            crate::TypeInner::Array { base, stride, .. } => (\r\n                context.module.types[base]\r\n                    .inner\r\n                    .size(&context.module.constants),\r\n                stride,\r\n            ),\r\n            _ => return Err(Error::Validation),\r\n        };\r\n\r\n        // When the stride length is larger than the size, the final element's stride of\r\n        // bytes would have padding following the value. But the buffer size in\r\n        // `buffer_sizes.sizeN` may not include this padding - it only needs to be large\r\n        // enough to hold the actual values' bytes.\r\n        //\r\n        // So subtract off the size to get a byte size that falls at the start or within\r\n        // the final element. Then divide by the stride size, to get one less than the\r\n        // length, and then add one. This works even if the buffer size does include the\r\n        // stride padding, since division rounds towards zero (MSL 2.4 §6.1). It will fail\r\n        // if there are zero elements in the array, but the WebGPU `validating shader binding`\r\n        // rules, together with draw-time validation when `minBindingSize` is zero,\r\n        // prevent that.\r\n        write!(\r\n            self.out,\r\n            \"(_buffer_sizes.size{idx} - {offset} - {size}) / {stride}\",\r\n            idx = handle.index(),\r\n            offset = offset,\r\n            size = size,\r\n            stride = stride,\r\n        )?;\r\n        Ok(())\r\n    }\r\n\r\n    fn put_atomic_fetch(\r\n        &mut self,\r\n        pointer: Handle<crate::Expression>,\r\n        key: &str,\r\n        value: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        // If the pointer we're passing to the atomic operation needs to be conditional\r\n        // for `ReadZeroSkipWrite`, the condition needs to *surround* the atomic op, and\r\n        // the pointer operand should be unchecked.\r\n        let policy = context.choose_bounds_check_policy(pointer);\r\n        let checked = policy == index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n            && self.put_bounds_checks(pointer, context, back::Level(0), \"\")?;\r\n\r\n        // If requested and successfully put bounds checks, continue the ternary expression.\r\n        if checked {\r\n            write!(self.out, \" ? \")?;\r\n        }\r\n\r\n        write!(\r\n            self.out,\r\n            \"{}::atomic_fetch_{}_explicit({}\",\r\n            NAMESPACE, key, ATOMIC_REFERENCE\r\n        )?;\r\n        self.put_access_chain(pointer, policy, context)?;\r\n        write!(self.out, \", \")?;\r\n        self.put_expression(value, context, true)?;\r\n        write!(self.out, \", {}::memory_order_relaxed)\", NAMESPACE)?;\r\n\r\n        // Finish the ternary expression.\r\n        if checked {\r\n            write!(self.out, \" : DefaultConstructible()\")?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Emit code for the arithmetic expression of the dot product.\r\n    ///\r\n    fn put_dot_product(\r\n        &mut self,\r\n        arg: Handle<crate::Expression>,\r\n        arg1: Handle<crate::Expression>,\r\n        size: usize,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        // Write parantheses around the dot product expression to prevent operators\r\n        // with different precedences from applying earlier.\r\n        write!(self.out, \"(\")?;\r\n\r\n        // Cycle trough all the components of the vector\r\n        for index in 0..size {\r\n            let component = back::COMPONENTS[index];\r\n            // Write the addition to the previous product\r\n            // This will print an extra '+' at the beginning but that is fine in msl\r\n            write!(self.out, \" + \")?;\r\n            // Write the first vector expression, this expression is marked to be\r\n            // cached so unless it can't be cached (for example, it's a Constant)\r\n            // it shouldn't produce large expressions.\r\n            self.put_expression(arg, context, true)?;\r\n            // Access the current component on the first vector\r\n            write!(self.out, \".{} * \", component)?;\r\n            // Write the second vector expression, this expression is marked to be\r\n            // cached so unless it can't be cached (for example, it's a Constant)\r\n            // it shouldn't produce large expressions.\r\n            self.put_expression(arg1, context, true)?;\r\n            // Access the current component on the second vector\r\n            write!(self.out, \".{}\", component)?;\r\n        }\r\n\r\n        write!(self.out, \")\")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Emit code for the expression `expr_handle`.\r\n    ///\r\n    /// The `is_scoped` argument is true if the surrounding operators have the\r\n    /// precedence of the comma operator, or lower. So, for example:\r\n    ///\r\n    /// - Pass `true` for `is_scoped` when writing function arguments, an\r\n    ///   expression statement, an initializer expression, or anything already\r\n    ///   wrapped in parenthesis.\r\n    ///\r\n    /// - Pass `false` if it is an operand of a `?:` operator, a `[]`, or really\r\n    ///   almost anything else.\r\n    fn put_expression(\r\n        &mut self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n        is_scoped: bool,\r\n    ) -> BackendResult {\r\n        // Add to the set in order to track the stack size.\r\n        #[cfg(test)]\r\n        #[allow(trivial_casts)]\r\n        self.put_expression_stack_pointers\r\n            .insert(&expr_handle as *const _ as *const ());\r\n\r\n        if let Some(name) = self.named_expressions.get(&expr_handle) {\r\n            write!(self.out, \"{}\", name)?;\r\n            return Ok(());\r\n        }\r\n\r\n        let expression = &context.function.expressions[expr_handle];\r\n        log::trace!(\"expression {:?} = {:?}\", expr_handle, expression);\r\n        match *expression {\r\n            crate::Expression::Access { base, .. }\r\n            | crate::Expression::AccessIndex { base, .. } => {\r\n                // This is an acceptable place to generate a `ReadZeroSkipWrite` check.\r\n                // Since `put_bounds_checks` and `put_access_chain` handle an entire\r\n                // access chain at a time, recursing back through `put_expression` only\r\n                // for index expressions and the base object, we will never see intermediate\r\n                // `Access` or `AccessIndex` expressions here.\r\n                let policy = context.choose_bounds_check_policy(base);\r\n                if policy == index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n                    && self.put_bounds_checks(\r\n                        expr_handle,\r\n                        context,\r\n                        back::Level(0),\r\n                        if is_scoped { \"\" } else { \"(\" },\r\n                    )?\r\n                {\r\n                    write!(self.out, \" ? \")?;\r\n                    self.put_access_chain(expr_handle, policy, context)?;\r\n                    write!(self.out, \" : DefaultConstructible()\")?;\r\n\r\n                    if !is_scoped {\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                } else {\r\n                    self.put_access_chain(expr_handle, policy, context)?;\r\n                }\r\n            }\r\n            crate::Expression::Constant(handle) => {\r\n                let coco = ConstantContext {\r\n                    handle,\r\n                    arena: &context.module.constants,\r\n                    names: &self.names,\r\n                    first_time: false,\r\n                };\r\n                write!(self.out, \"{}\", coco)?;\r\n            }\r\n            crate::Expression::Splat { size, value } => {\r\n                let scalar_kind = match *context.resolve_type(value) {\r\n                    crate::TypeInner::Scalar { kind, .. } => kind,\r\n                    _ => return Err(Error::Validation),\r\n                };\r\n                put_numeric_type(&mut self.out, scalar_kind, &[size])?;\r\n                write!(self.out, \"(\")?;\r\n                self.put_expression(value, context, true)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                self.put_wrapped_expression_for_packed_vec3_access(vector, context, false)?;\r\n                write!(self.out, \".\")?;\r\n                for &sc in pattern[..size as usize].iter() {\r\n                    write!(self.out, \"{}\", back::COMPONENTS[sc as usize])?;\r\n                }\r\n            }\r\n            crate::Expression::Compose { ty, ref components } => {\r\n                self.put_compose(ty, components, context)?;\r\n            }\r\n            crate::Expression::FunctionArgument(index) => {\r\n                let name_key = match context.origin {\r\n                    FunctionOrigin::Handle(handle) => NameKey::FunctionArgument(handle, index),\r\n                    FunctionOrigin::EntryPoint(ep_index) => {\r\n                        NameKey::EntryPointArgument(ep_index, index)\r\n                    }\r\n                };\r\n                let name = &self.names[&name_key];\r\n                write!(self.out, \"{}\", name)?;\r\n            }\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                let name = &self.names[&NameKey::GlobalVariable(handle)];\r\n                write!(self.out, \"{}\", name)?;\r\n            }\r\n            crate::Expression::LocalVariable(handle) => {\r\n                let name_key = match context.origin {\r\n                    FunctionOrigin::Handle(fun_handle) => {\r\n                        NameKey::FunctionLocal(fun_handle, handle)\r\n                    }\r\n                    FunctionOrigin::EntryPoint(ep_index) => {\r\n                        NameKey::EntryPointLocal(ep_index, handle)\r\n                    }\r\n                };\r\n                let name = &self.names[&name_key];\r\n                write!(self.out, \"{}\", name)?;\r\n            }\r\n            crate::Expression::Load { pointer } => self.put_load(pointer, context, is_scoped)?,\r\n            crate::Expression::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                let main_op = match gather {\r\n                    Some(_) => \"gather\",\r\n                    None => \"sample\",\r\n                };\r\n                let comparison_op = match depth_ref {\r\n                    Some(_) => \"_compare\",\r\n                    None => \"\",\r\n                };\r\n                self.put_expression(image, context, false)?;\r\n                write!(self.out, \".{}{}(\", main_op, comparison_op)?;\r\n                self.put_expression(sampler, context, true)?;\r\n                write!(self.out, \", \")?;\r\n                self.put_expression(coordinate, context, true)?;\r\n                if let Some(expr) = array_index {\r\n                    write!(self.out, \", \")?;\r\n                    self.put_expression(expr, context, true)?;\r\n                }\r\n                if let Some(dref) = depth_ref {\r\n                    write!(self.out, \", \")?;\r\n                    self.put_expression(dref, context, true)?;\r\n                }\r\n\r\n                self.put_image_sample_level(image, level, context)?;\r\n\r\n                if let Some(constant) = offset {\r\n                    let coco = ConstantContext {\r\n                        handle: constant,\r\n                        arena: &context.module.constants,\r\n                        names: &self.names,\r\n                        first_time: false,\r\n                    };\r\n                    write!(self.out, \", {}\", coco)?;\r\n                }\r\n                match gather {\r\n                    None | Some(crate::SwizzleComponent::X) => {}\r\n                    Some(component) => {\r\n                        let is_cube_map = match *context.resolve_type(image) {\r\n                            crate::TypeInner::Image {\r\n                                dim: crate::ImageDimension::Cube,\r\n                                ..\r\n                            } => true,\r\n                            _ => false,\r\n                        };\r\n                        // Offset always comes before the gather, except\r\n                        // in cube maps where it's not applicable\r\n                        if offset.is_none() && !is_cube_map {\r\n                            write!(self.out, \", int2(0)\")?;\r\n                        }\r\n                        let letter = ['x', 'y', 'z', 'w'][component as usize];\r\n                        write!(self.out, \", {}::component::{}\", NAMESPACE, letter)?;\r\n                    }\r\n                }\r\n                write!(self.out, \")\")?;\r\n            }\r\n            crate::Expression::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => {\r\n                let address = TexelAddress {\r\n                    coordinate,\r\n                    array_index,\r\n                    sample,\r\n                    level: level.map(LevelOfDetail::Direct),\r\n                };\r\n                self.put_image_load(expr_handle, image, address, context)?;\r\n            }\r\n            //Note: for all the queries, the signed integers are expected,\r\n            // so a conversion is needed.\r\n            crate::Expression::ImageQuery { image, query } => match query {\r\n                crate::ImageQuery::Size { level } => {\r\n                    self.put_image_size_query(\r\n                        image,\r\n                        level.map(LevelOfDetail::Direct),\r\n                        crate::ScalarKind::Sint,\r\n                        context,\r\n                    )?;\r\n                }\r\n                crate::ImageQuery::NumLevels => {\r\n                    write!(self.out, \"int(\")?;\r\n                    self.put_expression(image, context, false)?;\r\n                    write!(self.out, \".get_num_mip_levels())\")?;\r\n                }\r\n                crate::ImageQuery::NumLayers => {\r\n                    write!(self.out, \"int(\")?;\r\n                    self.put_expression(image, context, false)?;\r\n                    write!(self.out, \".get_array_size())\")?;\r\n                }\r\n                crate::ImageQuery::NumSamples => {\r\n                    write!(self.out, \"int(\")?;\r\n                    self.put_expression(image, context, false)?;\r\n                    write!(self.out, \".get_num_samples())\")?;\r\n                }\r\n            },\r\n            crate::Expression::Unary { op, expr } => {\r\n                use crate::{ScalarKind as Sk, UnaryOperator as Uo};\r\n                let op_str = match op {\r\n                    Uo::Negate => \"-\",\r\n                    Uo::Not => match context.resolve_type(expr).scalar_kind() {\r\n                        Some(Sk::Sint) | Some(Sk::Uint) => \"~\",\r\n                        Some(Sk::Bool) => \"!\",\r\n                        _ => return Err(Error::Validation),\r\n                    },\r\n                };\r\n                write!(self.out, \"{}\", op_str)?;\r\n                self.put_expression(expr, context, false)?;\r\n            }\r\n            crate::Expression::Binary { op, left, right } => {\r\n                let op_str = crate::back::binary_operation_str(op);\r\n                let kind = context\r\n                    .resolve_type(left)\r\n                    .scalar_kind()\r\n                    .ok_or(Error::UnsupportedBinaryOp(op))?;\r\n\r\n                // TODO: handle undefined behavior of BinaryOperator::Modulo\r\n                //\r\n                // sint:\r\n                // if right == 0 return 0\r\n                // if left == min(type_of(left)) && right == -1 return 0\r\n                // if sign(left) == -1 || sign(right) == -1 return result as defined by WGSL\r\n                //\r\n                // uint:\r\n                // if right == 0 return 0\r\n                //\r\n                // float:\r\n                // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798\r\n\r\n                if op == crate::BinaryOperator::Modulo && kind == crate::ScalarKind::Float {\r\n                    write!(self.out, \"{}::fmod(\", NAMESPACE)?;\r\n                    self.put_expression(left, context, true)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.put_expression(right, context, true)?;\r\n                    write!(self.out, \")\")?;\r\n                } else {\r\n                    if !is_scoped {\r\n                        write!(self.out, \"(\")?;\r\n                    }\r\n\r\n                    // Cast packed vector if necessary\r\n                    // Packed vector - matrix multiplications are not supported in MSL\r\n                    if op == crate::BinaryOperator::Multiply\r\n                        && matches!(\r\n                            context.resolve_type(right),\r\n                            &crate::TypeInner::Matrix { .. }\r\n                        )\r\n                    {\r\n                        self.put_wrapped_expression_for_packed_vec3_access(left, context, false)?;\r\n                    } else {\r\n                        self.put_expression(left, context, false)?;\r\n                    }\r\n\r\n                    write!(self.out, \" {} \", op_str)?;\r\n\r\n                    // See comment above\r\n                    if op == crate::BinaryOperator::Multiply\r\n                        && matches!(context.resolve_type(left), &crate::TypeInner::Matrix { .. })\r\n                    {\r\n                        self.put_wrapped_expression_for_packed_vec3_access(right, context, false)?;\r\n                    } else {\r\n                        self.put_expression(right, context, false)?;\r\n                    }\r\n\r\n                    if !is_scoped {\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                }\r\n            }\r\n            crate::Expression::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => match *context.resolve_type(condition) {\r\n                crate::TypeInner::Scalar {\r\n                    kind: crate::ScalarKind::Bool,\r\n                    ..\r\n                } => {\r\n                    if !is_scoped {\r\n                        write!(self.out, \"(\")?;\r\n                    }\r\n                    self.put_expression(condition, context, false)?;\r\n                    write!(self.out, \" ? \")?;\r\n                    self.put_expression(accept, context, false)?;\r\n                    write!(self.out, \" : \")?;\r\n                    self.put_expression(reject, context, false)?;\r\n                    if !is_scoped {\r\n                        write!(self.out, \")\")?;\r\n                    }\r\n                }\r\n                crate::TypeInner::Vector {\r\n                    kind: crate::ScalarKind::Bool,\r\n                    ..\r\n                } => {\r\n                    write!(self.out, \"{}::select(\", NAMESPACE)?;\r\n                    self.put_expression(reject, context, true)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.put_expression(accept, context, true)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.put_expression(condition, context, true)?;\r\n                    write!(self.out, \")\")?;\r\n                }\r\n                _ => return Err(Error::Validation),\r\n            },\r\n            crate::Expression::Derivative { axis, expr } => {\r\n                let op = match axis {\r\n                    crate::DerivativeAxis::X => \"dfdx\",\r\n                    crate::DerivativeAxis::Y => \"dfdy\",\r\n                    crate::DerivativeAxis::Width => \"fwidth\",\r\n                };\r\n                write!(self.out, \"{}::{}\", NAMESPACE, op)?;\r\n                self.put_call_parameters(iter::once(expr), context)?;\r\n            }\r\n            crate::Expression::Relational { fun, argument } => {\r\n                let op = match fun {\r\n                    crate::RelationalFunction::Any => \"any\",\r\n                    crate::RelationalFunction::All => \"all\",\r\n                    crate::RelationalFunction::IsNan => \"isnan\",\r\n                    crate::RelationalFunction::IsInf => \"isinf\",\r\n                    crate::RelationalFunction::IsFinite => \"isfinite\",\r\n                    crate::RelationalFunction::IsNormal => \"isnormal\",\r\n                };\r\n                write!(self.out, \"{}::{}\", NAMESPACE, op)?;\r\n                self.put_call_parameters(iter::once(argument), context)?;\r\n            }\r\n            crate::Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n\r\n                let scalar_argument = match *context.resolve_type(arg) {\r\n                    crate::TypeInner::Scalar { .. } => true,\r\n                    _ => false,\r\n                };\r\n\r\n                let fun_name = match fun {\r\n                    // comparison\r\n                    Mf::Abs => \"abs\",\r\n                    Mf::Min => \"min\",\r\n                    Mf::Max => \"max\",\r\n                    Mf::Clamp => \"clamp\",\r\n                    Mf::Saturate => \"saturate\",\r\n                    // trigonometry\r\n                    Mf::Cos => \"cos\",\r\n                    Mf::Cosh => \"cosh\",\r\n                    Mf::Sin => \"sin\",\r\n                    Mf::Sinh => \"sinh\",\r\n                    Mf::Tan => \"tan\",\r\n                    Mf::Tanh => \"tanh\",\r\n                    Mf::Acos => \"acos\",\r\n                    Mf::Asin => \"asin\",\r\n                    Mf::Atan => \"atan\",\r\n                    Mf::Atan2 => \"atan2\",\r\n                    Mf::Asinh => \"asinh\",\r\n                    Mf::Acosh => \"acosh\",\r\n                    Mf::Atanh => \"atanh\",\r\n                    Mf::Radians => \"\",\r\n                    Mf::Degrees => \"\",\r\n                    // decomposition\r\n                    Mf::Ceil => \"ceil\",\r\n                    Mf::Floor => \"floor\",\r\n                    Mf::Round => \"rint\",\r\n                    Mf::Fract => \"fract\",\r\n                    Mf::Trunc => \"trunc\",\r\n                    Mf::Modf => \"modf\",\r\n                    Mf::Frexp => \"frexp\",\r\n                    Mf::Ldexp => \"ldexp\",\r\n                    // exponent\r\n                    Mf::Exp => \"exp\",\r\n                    Mf::Exp2 => \"exp2\",\r\n                    Mf::Log => \"log\",\r\n                    Mf::Log2 => \"log2\",\r\n                    Mf::Pow => \"pow\",\r\n                    // geometry\r\n                    Mf::Dot => match *context.resolve_type(arg) {\r\n                        crate::TypeInner::Vector {\r\n                            kind: crate::ScalarKind::Float,\r\n                            ..\r\n                        } => \"dot\",\r\n                        crate::TypeInner::Vector { size, .. } => {\r\n                            return self.put_dot_product(arg, arg1.unwrap(), size as usize, context)\r\n                        }\r\n                        _ => unreachable!(\r\n                            \"Correct TypeInner for dot product should be already validated\"\r\n                        ),\r\n                    },\r\n                    Mf::Outer => return Err(Error::UnsupportedCall(format!(\"{:?}\", fun))),\r\n                    Mf::Cross => \"cross\",\r\n                    Mf::Distance => \"distance\",\r\n                    Mf::Length if scalar_argument => \"abs\",\r\n                    Mf::Length => \"length\",\r\n                    Mf::Normalize => \"normalize\",\r\n                    Mf::FaceForward => \"faceforward\",\r\n                    Mf::Reflect => \"reflect\",\r\n                    Mf::Refract => \"refract\",\r\n                    // computational\r\n                    Mf::Sign => \"sign\",\r\n                    Mf::Fma => \"fma\",\r\n                    Mf::Mix => \"mix\",\r\n                    Mf::Step => \"step\",\r\n                    Mf::SmoothStep => \"smoothstep\",\r\n                    Mf::Sqrt => \"sqrt\",\r\n                    Mf::InverseSqrt => \"rsqrt\",\r\n                    Mf::Inverse => return Err(Error::UnsupportedCall(format!(\"{:?}\", fun))),\r\n                    Mf::Transpose => \"transpose\",\r\n                    Mf::Determinant => \"determinant\",\r\n                    // bits\r\n                    Mf::CountOneBits => \"popcount\",\r\n                    Mf::ReverseBits => \"reverse_bits\",\r\n                    Mf::ExtractBits => \"extract_bits\",\r\n                    Mf::InsertBits => \"insert_bits\",\r\n                    Mf::FindLsb => \"\",\r\n                    Mf::FindMsb => \"\",\r\n                    // data packing\r\n                    Mf::Pack4x8snorm => \"pack_float_to_snorm4x8\",\r\n                    Mf::Pack4x8unorm => \"pack_float_to_unorm4x8\",\r\n                    Mf::Pack2x16snorm => \"pack_float_to_snorm2x16\",\r\n                    Mf::Pack2x16unorm => \"pack_float_to_unorm2x16\",\r\n                    Mf::Pack2x16float => \"\",\r\n                    // data unpacking\r\n                    Mf::Unpack4x8snorm => \"unpack_snorm4x8_to_float\",\r\n                    Mf::Unpack4x8unorm => \"unpack_unorm4x8_to_float\",\r\n                    Mf::Unpack2x16snorm => \"unpack_snorm2x16_to_float\",\r\n                    Mf::Unpack2x16unorm => \"unpack_unorm2x16_to_float\",\r\n                    Mf::Unpack2x16float => \"\",\r\n                };\r\n\r\n                if fun == Mf::Distance && scalar_argument {\r\n                    write!(self.out, \"{}::abs(\", NAMESPACE)?;\r\n                    self.put_expression(arg, context, false)?;\r\n                    write!(self.out, \" - \")?;\r\n                    self.put_expression(arg1.unwrap(), context, false)?;\r\n                    write!(self.out, \")\")?;\r\n                } else if fun == Mf::FindLsb {\r\n                    write!(self.out, \"((({}::ctz(\", NAMESPACE)?;\r\n                    self.put_expression(arg, context, true)?;\r\n                    write!(self.out, \") + 1) % 33) - 1)\")?;\r\n                } else if fun == Mf::FindMsb {\r\n                    write!(self.out, \"((({}::clz(\", NAMESPACE)?;\r\n                    self.put_expression(arg, context, true)?;\r\n                    write!(self.out, \") + 1) % 33) - 1)\")?\r\n                } else if fun == Mf::Unpack2x16float {\r\n                    write!(self.out, \"float2(as_type<half2>(\")?;\r\n                    self.put_expression(arg, context, false)?;\r\n                    write!(self.out, \"))\")?;\r\n                } else if fun == Mf::Pack2x16float {\r\n                    write!(self.out, \"as_type<uint>(half2(\")?;\r\n                    self.put_expression(arg, context, false)?;\r\n                    write!(self.out, \"))\")?;\r\n                } else if fun == Mf::Radians {\r\n                    write!(self.out, \"((\")?;\r\n                    self.put_expression(arg, context, false)?;\r\n                    write!(self.out, \") * 0.017453292519943295474)\")?;\r\n                } else if fun == Mf::Degrees {\r\n                    write!(self.out, \"((\")?;\r\n                    self.put_expression(arg, context, false)?;\r\n                    write!(self.out, \") * 57.295779513082322865)\")?;\r\n                } else {\r\n                    write!(self.out, \"{}::{}\", NAMESPACE, fun_name)?;\r\n                    self.put_call_parameters(\r\n                        iter::once(arg).chain(arg1).chain(arg2).chain(arg3),\r\n                        context,\r\n                    )?;\r\n                }\r\n            }\r\n            crate::Expression::As {\r\n                expr,\r\n                kind,\r\n                convert,\r\n            } => match *context.resolve_type(expr) {\r\n                crate::TypeInner::Scalar {\r\n                    kind: src_kind,\r\n                    width: src_width,\r\n                }\r\n                | crate::TypeInner::Vector {\r\n                    kind: src_kind,\r\n                    width: src_width,\r\n                    ..\r\n                } => {\r\n                    let is_bool_cast =\r\n                        kind == crate::ScalarKind::Bool || src_kind == crate::ScalarKind::Bool;\r\n                    let op = match convert {\r\n                        Some(w) if w == src_width || is_bool_cast => \"static_cast\",\r\n                        Some(8) if kind == crate::ScalarKind::Float => {\r\n                            return Err(Error::CapabilityNotSupported(valid::Capabilities::FLOAT64))\r\n                        }\r\n                        Some(_) => return Err(Error::Validation),\r\n                        None => \"as_type\",\r\n                    };\r\n                    write!(self.out, \"{}<\", op)?;\r\n                    match *context.resolve_type(expr) {\r\n                        crate::TypeInner::Vector { size, .. } => {\r\n                            put_numeric_type(&mut self.out, kind, &[size])?\r\n                        }\r\n                        _ => put_numeric_type(&mut self.out, kind, &[])?,\r\n                    };\r\n                    write!(self.out, \">(\")?;\r\n                    self.put_expression(expr, context, true)?;\r\n                    write!(self.out, \")\")?;\r\n                }\r\n                crate::TypeInner::Matrix { columns, rows, .. } => {\r\n                    put_numeric_type(&mut self.out, kind, &[rows, columns])?;\r\n                    write!(self.out, \"(\")?;\r\n                    self.put_expression(expr, context, true)?;\r\n                    write!(self.out, \")\")?;\r\n                }\r\n                _ => return Err(Error::Validation),\r\n            },\r\n            // has to be a named expression\r\n            crate::Expression::CallResult(_) | crate::Expression::AtomicResult { .. } => {\r\n                unreachable!()\r\n            }\r\n            crate::Expression::ArrayLength(expr) => {\r\n                // Find the global to which the array belongs.\r\n                let global = match context.function.expressions[expr] {\r\n                    crate::Expression::AccessIndex { base, .. } => {\r\n                        match context.function.expressions[base] {\r\n                            crate::Expression::GlobalVariable(handle) => handle,\r\n                            _ => return Err(Error::Validation),\r\n                        }\r\n                    }\r\n                    crate::Expression::GlobalVariable(handle) => handle,\r\n                    _ => return Err(Error::Validation),\r\n                };\r\n\r\n                if !is_scoped {\r\n                    write!(self.out, \"(\")?;\r\n                }\r\n                write!(self.out, \"1 + \")?;\r\n                self.put_dynamic_array_max_index(global, context)?;\r\n                if !is_scoped {\r\n                    write!(self.out, \")\")?;\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Used by expressions like Swizzle and Binary since they need packed_vec3's to be casted to a vec3\r\n    fn put_wrapped_expression_for_packed_vec3_access(\r\n        &mut self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n        is_scoped: bool,\r\n    ) -> BackendResult {\r\n        if let Some(scalar_kind) = context.get_packed_vec_kind(expr_handle) {\r\n            write!(self.out, \"{}::{}3(\", NAMESPACE, scalar_kind.to_msl_name())?;\r\n            self.put_expression(expr_handle, context, is_scoped)?;\r\n            write!(self.out, \")\")?;\r\n        } else {\r\n            self.put_expression(expr_handle, context, is_scoped)?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Write a `GuardedIndex` as a Metal expression.\r\n    fn put_index(\r\n        &mut self,\r\n        index: index::GuardedIndex,\r\n        context: &ExpressionContext,\r\n        is_scoped: bool,\r\n    ) -> BackendResult {\r\n        match index {\r\n            index::GuardedIndex::Expression(expr) => {\r\n                self.put_expression(expr, context, is_scoped)?\r\n            }\r\n            index::GuardedIndex::Known(value) => write!(self.out, \"{}\", value)?,\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Emit an index bounds check condition for `chain`, if required.\r\n    ///\r\n    /// `chain` is a subtree of `Access` and `AccessIndex` expressions,\r\n    /// operating either on a pointer to a value, or on a value directly. If we cannot\r\n    /// statically determine that all indexing operations in `chain` are within\r\n    /// bounds, then write a conditional expression to check them dynamically,\r\n    /// and return true. All accesses in the chain are checked by the generated\r\n    /// expression.\r\n    ///\r\n    /// This assumes that the [`BoundsCheckPolicy`] for `chain` is [`ReadZeroSkipWrite`].\r\n    ///\r\n    /// The text written is of the form:\r\n    ///\r\n    /// ```ignore\r\n    /// {level}{prefix}uint(i) < 4 && uint(j) < 10\r\n    /// ```\r\n    ///\r\n    /// where `{level}` and `{prefix}` are the arguments to this function. For [`Store`]\r\n    /// statements, presumably these arguments start an indented `if` statement; for\r\n    /// [`Load`] expressions, the caller is probably building up a ternary `?:`\r\n    /// expression. In either case, what is written is not a complete syntactic structure\r\n    /// in its own right, and the caller will have to finish it off if we return `true`.\r\n    ///\r\n    /// If no expression is written, return false.\r\n    ///\r\n    /// [`BoundsCheckPolicy`]: index::BoundsCheckPolicy\r\n    /// [`ReadZeroSkipWrite`]: index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n    /// [`Store`]: crate::Statement::Store\r\n    /// [`Load`]: crate::Expression::Load\r\n    #[allow(unused_variables)]\r\n    fn put_bounds_checks(\r\n        &mut self,\r\n        mut chain: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n        level: back::Level,\r\n        prefix: &'static str,\r\n    ) -> Result<bool, Error> {\r\n        let mut check_written = false;\r\n\r\n        // Iterate over the access chain, handling each expression.\r\n        loop {\r\n            // Produce a `GuardedIndex`, so we can shared code between the\r\n            // `Access` and `AccessIndex` cases.\r\n            let (base, guarded_index) = match context.function.expressions[chain] {\r\n                crate::Expression::Access { base, index } => {\r\n                    (base, Some(index::GuardedIndex::Expression(index)))\r\n                }\r\n                crate::Expression::AccessIndex { base, index } => {\r\n                    // Don't try to check indices into structs. Validation already took\r\n                    // care of them, and index::needs_guard doesn't handle that case.\r\n                    let mut base_inner = context.resolve_type(base);\r\n                    if let crate::TypeInner::Pointer { base, .. } = *base_inner {\r\n                        base_inner = &context.module.types[base].inner;\r\n                    }\r\n                    match *base_inner {\r\n                        crate::TypeInner::Struct { .. } => (base, None),\r\n                        _ => (base, Some(index::GuardedIndex::Known(index))),\r\n                    }\r\n                }\r\n                _ => break,\r\n            };\r\n\r\n            if let Some(index) = guarded_index {\r\n                if let Some(length) = context.access_needs_check(base, index) {\r\n                    if check_written {\r\n                        write!(self.out, \" && \")?;\r\n                    } else {\r\n                        write!(self.out, \"{}{}\", level, prefix)?;\r\n                        check_written = true;\r\n                    }\r\n\r\n                    // Check that the index falls within bounds. Do this with a single\r\n                    // comparison, by casting the index to `uint` first, so that negative\r\n                    // indices become large positive values.\r\n                    write!(self.out, \"uint(\")?;\r\n                    self.put_index(index, context, true)?;\r\n                    self.out.write_str(\") < \")?;\r\n                    match length {\r\n                        index::IndexableLength::Known(value) => write!(self.out, \"{}\", value)?,\r\n                        index::IndexableLength::Dynamic => {\r\n                            let global = context\r\n                                .function\r\n                                .originating_global(base)\r\n                                .ok_or(Error::Validation)?;\r\n                            write!(self.out, \"1 + \")?;\r\n                            self.put_dynamic_array_max_index(global, context)?\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            chain = base\r\n        }\r\n\r\n        Ok(check_written)\r\n    }\r\n\r\n    /// Write the access chain `chain`.\r\n    ///\r\n    /// `chain` is a subtree of [`Access`] and [`AccessIndex`] expressions,\r\n    /// operating either on a pointer to a value, or on a value directly.\r\n    ///\r\n    /// Generate bounds checks code only if `policy` is [`Restrict`]. The\r\n    /// [`ReadZeroSkipWrite`] policy requires checks before any accesses take place, so\r\n    /// that must be handled in the caller.\r\n    ///\r\n    /// Handle the entire chain, recursing back into `put_expression` only for index\r\n    /// expressions and the base expression that originates the pointer or composite value\r\n    /// being accessed. This allows `put_expression` to assume that any `Access` or\r\n    /// `AccessIndex` expressions it sees are the top of a chain, so it can emit\r\n    /// `ReadZeroSkipWrite` checks.\r\n    ///\r\n    /// [`Access`]: crate::Expression::Access\r\n    /// [`AccessIndex`]: crate::Expression::AccessIndex\r\n    /// [`Restrict`]: crate::proc::index::BoundsCheckPolicy::Restrict\r\n    /// [`ReadZeroSkipWrite`]: crate::proc::index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n    fn put_access_chain(\r\n        &mut self,\r\n        chain: Handle<crate::Expression>,\r\n        policy: index::BoundsCheckPolicy,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        match context.function.expressions[chain] {\r\n            crate::Expression::Access { base, index } => {\r\n                let mut base_ty = context.resolve_type(base);\r\n\r\n                // Look through any pointers to see what we're really indexing.\r\n                if let crate::TypeInner::Pointer { base, space: _ } = *base_ty {\r\n                    base_ty = &context.module.types[base].inner;\r\n                }\r\n\r\n                self.put_subscripted_access_chain(\r\n                    base,\r\n                    base_ty,\r\n                    index::GuardedIndex::Expression(index),\r\n                    policy,\r\n                    context,\r\n                )?;\r\n            }\r\n            crate::Expression::AccessIndex { base, index } => {\r\n                let base_resolution = &context.info[base].ty;\r\n                let mut base_ty = base_resolution.inner_with(&context.module.types);\r\n                let mut base_ty_handle = base_resolution.handle();\r\n\r\n                // Look through any pointers to see what we're really indexing.\r\n                if let crate::TypeInner::Pointer { base, space: _ } = *base_ty {\r\n                    base_ty = &context.module.types[base].inner;\r\n                    base_ty_handle = Some(base);\r\n                }\r\n\r\n                // Handle structs and anything else that can use `.x` syntax here, so\r\n                // `put_subscripted_access_chain` won't have to handle the absurd case of\r\n                // indexing a struct with an expression.\r\n                match *base_ty {\r\n                    crate::TypeInner::Struct { .. } => {\r\n                        let base_ty = base_ty_handle.unwrap();\r\n                        self.put_access_chain(base, policy, context)?;\r\n                        let name = &self.names[&NameKey::StructMember(base_ty, index)];\r\n                        write!(self.out, \".{}\", name)?;\r\n                    }\r\n                    crate::TypeInner::ValuePointer { .. } | crate::TypeInner::Vector { .. } => {\r\n                        self.put_access_chain(base, policy, context)?;\r\n                        // Prior to Metal v2.1 component access for packed vectors wasn't available\r\n                        // however array indexing is\r\n                        if context.get_packed_vec_kind(base).is_some() {\r\n                            write!(self.out, \"[{}]\", index)?;\r\n                        } else {\r\n                            write!(self.out, \".{}\", back::COMPONENTS[index as usize])?;\r\n                        }\r\n                    }\r\n                    _ => {\r\n                        self.put_subscripted_access_chain(\r\n                            base,\r\n                            base_ty,\r\n                            index::GuardedIndex::Known(index),\r\n                            policy,\r\n                            context,\r\n                        )?;\r\n                    }\r\n                }\r\n            }\r\n            _ => self.put_expression(chain, context, false)?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Write a `[]`-style access of `base` by `index`.\r\n    ///\r\n    /// If `policy` is [`Restrict`], then generate code as needed to force all index\r\n    /// values within bounds.\r\n    ///\r\n    /// The `base_ty` argument must be the type we are actually indexing, like [`Array`] or\r\n    /// [`Vector`]. In other words, it's `base`'s type with any surrounding [`Pointer`]\r\n    /// removed. Our callers often already have this handy.\r\n    ///\r\n    /// This only emits `[]` expressions; it doesn't handle struct member accesses or\r\n    /// referencing vector components by name.\r\n    ///\r\n    /// [`Restrict`]: crate::proc::index::BoundsCheckPolicy::Restrict\r\n    /// [`Array`]: crate::TypeInner::Array\r\n    /// [`Vector`]: crate::TypeInner::Vector\r\n    /// [`Pointer`]: crate::TypeInner::Pointer\r\n    fn put_subscripted_access_chain(\r\n        &mut self,\r\n        base: Handle<crate::Expression>,\r\n        base_ty: &crate::TypeInner,\r\n        index: index::GuardedIndex,\r\n        policy: index::BoundsCheckPolicy,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        let accessing_wrapped_array = match *base_ty {\r\n            crate::TypeInner::Array {\r\n                size: crate::ArraySize::Constant(_),\r\n                ..\r\n            } => true,\r\n            _ => false,\r\n        };\r\n\r\n        self.put_access_chain(base, policy, context)?;\r\n        if accessing_wrapped_array {\r\n            write!(self.out, \".{}\", WRAPPED_ARRAY_FIELD)?;\r\n        }\r\n        write!(self.out, \"[\")?;\r\n\r\n        // Decide whether this index needs to be clamped to fall within range.\r\n        let restriction_needed = if policy == index::BoundsCheckPolicy::Restrict {\r\n            context.access_needs_check(base, index)\r\n        } else {\r\n            None\r\n        };\r\n        if let Some(limit) = restriction_needed {\r\n            write!(self.out, \"{}::min(unsigned(\", NAMESPACE)?;\r\n            self.put_index(index, context, true)?;\r\n            write!(self.out, \"), \")?;\r\n            match limit {\r\n                index::IndexableLength::Known(limit) => {\r\n                    write!(self.out, \"{}u\", limit - 1)?;\r\n                }\r\n                index::IndexableLength::Dynamic => {\r\n                    let global = context\r\n                        .function\r\n                        .originating_global(base)\r\n                        .ok_or(Error::Validation)?;\r\n                    self.put_dynamic_array_max_index(global, context)?;\r\n                }\r\n            }\r\n            write!(self.out, \")\")?;\r\n        } else {\r\n            self.put_index(index, context, true)?;\r\n        }\r\n\r\n        write!(self.out, \"]\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_load(\r\n        &mut self,\r\n        pointer: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n        is_scoped: bool,\r\n    ) -> BackendResult {\r\n        // Since access chains never cross between address spaces, we can just\r\n        // check the index bounds check policy once at the top.\r\n        let policy = context.choose_bounds_check_policy(pointer);\r\n        if policy == index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n            && self.put_bounds_checks(\r\n                pointer,\r\n                context,\r\n                back::Level(0),\r\n                if is_scoped { \"\" } else { \"(\" },\r\n            )?\r\n        {\r\n            write!(self.out, \" ? \")?;\r\n            self.put_unchecked_load(pointer, policy, context)?;\r\n            write!(self.out, \" : DefaultConstructible()\")?;\r\n\r\n            if !is_scoped {\r\n                write!(self.out, \")\")?;\r\n            }\r\n        } else {\r\n            self.put_unchecked_load(pointer, policy, context)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_unchecked_load(\r\n        &mut self,\r\n        pointer: Handle<crate::Expression>,\r\n        policy: index::BoundsCheckPolicy,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        let is_atomic = match *context.resolve_type(pointer) {\r\n            crate::TypeInner::Pointer { base, .. } => match context.module.types[base].inner {\r\n                crate::TypeInner::Atomic { .. } => true,\r\n                _ => false,\r\n            },\r\n            _ => false,\r\n        };\r\n\r\n        if is_atomic {\r\n            write!(\r\n                self.out,\r\n                \"{}::atomic_load_explicit({}\",\r\n                NAMESPACE, ATOMIC_REFERENCE\r\n            )?;\r\n            self.put_access_chain(pointer, policy, context)?;\r\n            write!(self.out, \", {}::memory_order_relaxed)\", NAMESPACE)?;\r\n        } else {\r\n            // We don't do any dereferencing with `*` here as pointer arguments to functions\r\n            // are done by `&` references and not `*` pointers. These do not need to be\r\n            // dereferenced.\r\n            self.put_access_chain(pointer, policy, context)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_return_value(\r\n        &mut self,\r\n        level: back::Level,\r\n        expr_handle: Handle<crate::Expression>,\r\n        result_struct: Option<&str>,\r\n        context: &ExpressionContext,\r\n    ) -> BackendResult {\r\n        match result_struct {\r\n            Some(struct_name) => {\r\n                let mut has_point_size = false;\r\n                let result_ty = context.function.result.as_ref().unwrap().ty;\r\n                match context.module.types[result_ty].inner {\r\n                    crate::TypeInner::Struct { ref members, .. } => {\r\n                        let tmp = \"_tmp\";\r\n                        write!(self.out, \"{}const auto {} = \", level, tmp)?;\r\n                        self.put_expression(expr_handle, context, true)?;\r\n                        writeln!(self.out, \";\")?;\r\n                        write!(self.out, \"{}return {} {{\", level, struct_name)?;\r\n\r\n                        let mut is_first = true;\r\n\r\n                        for (index, member) in members.iter().enumerate() {\r\n                            match member.binding {\r\n                                Some(crate::Binding::BuiltIn(crate::BuiltIn::PointSize)) => {\r\n                                    has_point_size = true;\r\n                                    if !context.pipeline_options.allow_point_size {\r\n                                        continue;\r\n                                    }\r\n                                }\r\n                                Some(crate::Binding::BuiltIn(crate::BuiltIn::CullDistance)) => {\r\n                                    log::warn!(\"Ignoring CullDistance built-in\");\r\n                                    continue;\r\n                                }\r\n                                _ => {}\r\n                            }\r\n\r\n                            let comma = if is_first { \"\" } else { \",\" };\r\n                            is_first = false;\r\n                            let name = &self.names[&NameKey::StructMember(result_ty, index as u32)];\r\n                            // HACK: we are forcefully deduplicating the expression here\r\n                            // to convert from a wrapped struct to a raw array, e.g.\r\n                            // `float gl_ClipDistance1 [[clip_distance]] [1];`.\r\n                            if let crate::TypeInner::Array {\r\n                                size: crate::ArraySize::Constant(const_handle),\r\n                                ..\r\n                            } = context.module.types[member.ty].inner\r\n                            {\r\n                                let size = context.module.constants[const_handle]\r\n                                    .to_array_length()\r\n                                    .unwrap();\r\n                                write!(self.out, \"{} {{\", comma)?;\r\n                                for j in 0..size {\r\n                                    if j != 0 {\r\n                                        write!(self.out, \",\")?;\r\n                                    }\r\n                                    write!(\r\n                                        self.out,\r\n                                        \"{}.{}.{}[{}]\",\r\n                                        tmp, name, WRAPPED_ARRAY_FIELD, j\r\n                                    )?;\r\n                                }\r\n                                write!(self.out, \"}}\")?;\r\n                            } else {\r\n                                write!(self.out, \"{} {}.{}\", comma, tmp, name)?;\r\n                            }\r\n                        }\r\n                    }\r\n                    _ => {\r\n                        write!(self.out, \"{}return {} {{ \", level, struct_name)?;\r\n                        self.put_expression(expr_handle, context, true)?;\r\n                    }\r\n                }\r\n\r\n                if let FunctionOrigin::EntryPoint(ep_index) = context.origin {\r\n                    let stage = context.module.entry_points[ep_index as usize].stage;\r\n                    if context.pipeline_options.allow_point_size\r\n                        && stage == crate::ShaderStage::Vertex\r\n                        && !has_point_size\r\n                    {\r\n                        // point size was injected and comes last\r\n                        write!(self.out, \", 1.0\")?;\r\n                    }\r\n                }\r\n                write!(self.out, \" }}\")?;\r\n            }\r\n            None => {\r\n                write!(self.out, \"{}return \", level)?;\r\n                self.put_expression(expr_handle, context, true)?;\r\n            }\r\n        }\r\n        writeln!(self.out, \";\")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to find which expressions of a given function require baking\r\n    ///\r\n    /// # Notes\r\n    /// This function overwrites the contents of `self.need_bake_expressions`\r\n    fn update_expressions_to_bake(\r\n        &mut self,\r\n        func: &crate::Function,\r\n        info: &valid::FunctionInfo,\r\n        context: &ExpressionContext,\r\n    ) {\r\n        use crate::Expression;\r\n        self.need_bake_expressions.clear();\r\n        for expr in func.expressions.iter() {\r\n            // Expressions whose reference count is above the\r\n            // threshold should always be stored in temporaries.\r\n            let expr_info = &info[expr.0];\r\n            let min_ref_count = func.expressions[expr.0].bake_ref_count();\r\n            if min_ref_count <= expr_info.ref_count {\r\n                self.need_bake_expressions.insert(expr.0);\r\n            }\r\n\r\n            // WGSL's `dot` function works on any `vecN` type, but Metal's only\r\n            // works on floating-point vectors, so we emit inline code for\r\n            // integer vector `dot` calls. But that code uses each argument `N`\r\n            // times, once for each component (see `put_dot_product`), so to\r\n            // avoid duplicated evaluation, we must bake integer operands.\r\n            if let (\r\n                fun_handle,\r\n                &Expression::Math {\r\n                    fun: crate::MathFunction::Dot,\r\n                    arg,\r\n                    arg1,\r\n                    ..\r\n                },\r\n            ) = expr\r\n            {\r\n                use crate::TypeInner;\r\n                // check what kind of product this is depending\r\n                // on the resolve type of the Dot function itself\r\n                let inner = context.resolve_type(fun_handle);\r\n                if let TypeInner::Scalar { kind, .. } = *inner {\r\n                    match kind {\r\n                        crate::ScalarKind::Sint | crate::ScalarKind::Uint => {\r\n                            self.need_bake_expressions.insert(arg);\r\n                            self.need_bake_expressions.insert(arg1.unwrap());\r\n                        }\r\n                        _ => {}\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    fn start_baking_expression(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n        context: &ExpressionContext,\r\n        name: &str,\r\n    ) -> BackendResult {\r\n        match context.info[handle].ty {\r\n            TypeResolution::Handle(ty_handle) => {\r\n                let ty_name = TypeContext {\r\n                    handle: ty_handle,\r\n                    module: context.module,\r\n                    names: &self.names,\r\n                    access: crate::StorageAccess::empty(),\r\n                    binding: None,\r\n                    first_time: false,\r\n                };\r\n                write!(self.out, \"{}\", ty_name)?;\r\n            }\r\n            TypeResolution::Value(crate::TypeInner::Scalar { kind, .. }) => {\r\n                put_numeric_type(&mut self.out, kind, &[])?;\r\n            }\r\n            TypeResolution::Value(crate::TypeInner::Vector { size, kind, .. }) => {\r\n                put_numeric_type(&mut self.out, kind, &[size])?;\r\n            }\r\n            TypeResolution::Value(crate::TypeInner::Matrix { columns, rows, .. }) => {\r\n                put_numeric_type(&mut self.out, crate::ScalarKind::Float, &[rows, columns])?;\r\n            }\r\n            TypeResolution::Value(ref other) => {\r\n                log::warn!(\"Type {:?} isn't a known local\", other); //TEMP!\r\n                return Err(Error::FeatureNotImplemented(\"weird local type\".to_string()));\r\n            }\r\n        }\r\n\r\n        //TODO: figure out the naming scheme that wouldn't collide with user names.\r\n        write!(self.out, \" {} = \", name)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Cache a clamped level of detail value, if necessary.\r\n    ///\r\n    /// [`ImageLoad`] accesses covered by [`BoundsCheckPolicy::Restrict`] use a\r\n    /// properly clamped level of detail value both in the access itself, and\r\n    /// for fetching the size of the requested MIP level, needed to clamp the\r\n    /// coordinates. To avoid recomputing this clamped level of detail, we cache\r\n    /// it in a temporary variable, as part of the [`Emit`] statement covering\r\n    /// the [`ImageLoad`] expression.\r\n    ///\r\n    /// [`ImageLoad`]: crate::Expression::ImageLoad\r\n    /// [`BoundsCheckPolicy::Restrict`]: index::BoundsCheckPolicy::Restrict\r\n    /// [`Emit`]: crate::Statement::Emit\r\n    fn put_cache_restricted_level(\r\n        &mut self,\r\n        load: Handle<crate::Expression>,\r\n        image: Handle<crate::Expression>,\r\n        mip_level: Option<Handle<crate::Expression>>,\r\n        indent: back::Level,\r\n        context: &StatementContext,\r\n    ) -> BackendResult {\r\n        // Does this image access actually require (or even permit) a\r\n        // level-of-detail, and does the policy require us to restrict it?\r\n        let level_of_detail = match mip_level {\r\n            Some(level) => level,\r\n            None => return Ok(()),\r\n        };\r\n\r\n        if context.expression.policies.image != index::BoundsCheckPolicy::Restrict\r\n            || !context.expression.image_needs_lod(image)\r\n        {\r\n            return Ok(());\r\n        }\r\n\r\n        write!(\r\n            self.out,\r\n            \"{}uint {}{} = \",\r\n            indent,\r\n            CLAMPED_LOD_LOAD_PREFIX,\r\n            load.index(),\r\n        )?;\r\n        self.put_restricted_scalar_image_index(\r\n            image,\r\n            level_of_detail,\r\n            \"get_num_mip_levels\",\r\n            &context.expression,\r\n        )?;\r\n        writeln!(self.out, \";\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_block(\r\n        &mut self,\r\n        level: back::Level,\r\n        statements: &[crate::Statement],\r\n        context: &StatementContext,\r\n    ) -> BackendResult {\r\n        // Add to the set in order to track the stack size.\r\n        #[cfg(test)]\r\n        #[allow(trivial_casts)]\r\n        self.put_block_stack_pointers\r\n            .insert(&level as *const _ as *const ());\r\n\r\n        for statement in statements {\r\n            log::trace!(\"statement[{}] {:?}\", level.0, statement);\r\n            match *statement {\r\n                crate::Statement::Emit(ref range) => {\r\n                    for handle in range.clone() {\r\n                        // `ImageLoad` expressions covered by the `Restrict` bounds check policy\r\n                        // may need to cache a clamped version of their level-of-detail argument.\r\n                        if let crate::Expression::ImageLoad {\r\n                            image,\r\n                            level: mip_level,\r\n                            ..\r\n                        } = context.expression.function.expressions[handle]\r\n                        {\r\n                            self.put_cache_restricted_level(\r\n                                handle, image, mip_level, level, context,\r\n                            )?;\r\n                        }\r\n\r\n                        let info = &context.expression.info[handle];\r\n                        let ptr_class = info\r\n                            .ty\r\n                            .inner_with(&context.expression.module.types)\r\n                            .pointer_space();\r\n                        let expr_name = if ptr_class.is_some() {\r\n                            None // don't bake pointer expressions (just yet)\r\n                        } else if let Some(name) =\r\n                            context.expression.function.named_expressions.get(&handle)\r\n                        {\r\n                            // The `crate::Function::named_expressions` table holds\r\n                            // expressions that should be saved in temporaries once they\r\n                            // are `Emit`ted. We only add them to `self.named_expressions`\r\n                            // when we reach the `Emit` that covers them, so that we don't\r\n                            // try to use their names before we've actually initialized\r\n                            // the temporary that holds them.\r\n                            //\r\n                            // Don't assume the names in `named_expressions` are unique,\r\n                            // or even valid. Use the `Namer`.\r\n                            Some(self.namer.call(name))\r\n                        } else if info.ref_count == 0 {\r\n                            Some(self.namer.call(\"\"))\r\n                        } else {\r\n                            // If this expression is an index that we're going to first compare\r\n                            // against a limit, and then actually use as an index, then we may\r\n                            // want to cache it in a temporary, to avoid evaluating it twice.\r\n                            let bake =\r\n                                if context.expression.guarded_indices.contains(handle.index()) {\r\n                                    true\r\n                                } else {\r\n                                    self.need_bake_expressions.contains(&handle)\r\n                                };\r\n\r\n                            if bake {\r\n                                Some(format!(\"{}{}\", back::BAKE_PREFIX, handle.index()))\r\n                            } else {\r\n                                None\r\n                            }\r\n                        };\r\n\r\n                        if let Some(name) = expr_name {\r\n                            write!(self.out, \"{}\", level)?;\r\n                            self.start_baking_expression(handle, &context.expression, &name)?;\r\n                            self.put_expression(handle, &context.expression, true)?;\r\n                            self.named_expressions.insert(handle, name);\r\n                            writeln!(self.out, \";\")?;\r\n                        }\r\n                    }\r\n                }\r\n                crate::Statement::Block(ref block) => {\r\n                    if !block.is_empty() {\r\n                        writeln!(self.out, \"{}{{\", level)?;\r\n                        self.put_block(level.next(), block, context)?;\r\n                        writeln!(self.out, \"{}}}\", level)?;\r\n                    }\r\n                }\r\n                crate::Statement::If {\r\n                    condition,\r\n                    ref accept,\r\n                    ref reject,\r\n                } => {\r\n                    write!(self.out, \"{}if (\", level)?;\r\n                    self.put_expression(condition, &context.expression, true)?;\r\n                    writeln!(self.out, \") {{\")?;\r\n                    self.put_block(level.next(), accept, context)?;\r\n                    if !reject.is_empty() {\r\n                        writeln!(self.out, \"{}}} else {{\", level)?;\r\n                        self.put_block(level.next(), reject, context)?;\r\n                    }\r\n                    writeln!(self.out, \"{}}}\", level)?;\r\n                }\r\n                crate::Statement::Switch {\r\n                    selector,\r\n                    ref cases,\r\n                } => {\r\n                    write!(self.out, \"{}switch(\", level)?;\r\n                    self.put_expression(selector, &context.expression, true)?;\r\n                    let type_postfix = match *context.expression.resolve_type(selector) {\r\n                        crate::TypeInner::Scalar {\r\n                            kind: crate::ScalarKind::Uint,\r\n                            ..\r\n                        } => \"u\",\r\n                        _ => \"\",\r\n                    };\r\n                    writeln!(self.out, \") {{\")?;\r\n                    let lcase = level.next();\r\n                    for case in cases.iter() {\r\n                        match case.value {\r\n                            crate::SwitchValue::Integer(value) => {\r\n                                writeln!(self.out, \"{}case {}{}: {{\", lcase, value, type_postfix)?;\r\n                            }\r\n                            crate::SwitchValue::Default => {\r\n                                writeln!(self.out, \"{}default: {{\", lcase)?;\r\n                            }\r\n                        }\r\n                        self.put_block(lcase.next(), &case.body, context)?;\r\n                        if !case.fall_through\r\n                            && case.body.last().map_or(true, |s| !s.is_terminator())\r\n                        {\r\n                            writeln!(self.out, \"{}break;\", lcase.next())?;\r\n                        }\r\n                        writeln!(self.out, \"{}}}\", lcase)?;\r\n                    }\r\n                    writeln!(self.out, \"{}}}\", level)?;\r\n                }\r\n                crate::Statement::Loop {\r\n                    ref body,\r\n                    ref continuing,\r\n                    break_if,\r\n                } => {\r\n                    if !continuing.is_empty() || break_if.is_some() {\r\n                        let gate_name = self.namer.call(\"loop_init\");\r\n                        writeln!(self.out, \"{}bool {} = true;\", level, gate_name)?;\r\n                        writeln!(self.out, \"{}while(true) {{\", level)?;\r\n                        let lif = level.next();\r\n                        let lcontinuing = lif.next();\r\n                        writeln!(self.out, \"{}if (!{}) {{\", lif, gate_name)?;\r\n                        self.put_block(lcontinuing, continuing, context)?;\r\n                        if let Some(condition) = break_if {\r\n                            write!(self.out, \"{}if (\", lcontinuing)?;\r\n                            self.put_expression(condition, &context.expression, true)?;\r\n                            writeln!(self.out, \") {{\")?;\r\n                            writeln!(self.out, \"{}break;\", lcontinuing.next())?;\r\n                            writeln!(self.out, \"{}}}\", lcontinuing)?;\r\n                        }\r\n                        writeln!(self.out, \"{}}}\", lif)?;\r\n                        writeln!(self.out, \"{}{} = false;\", lif, gate_name)?;\r\n                    } else {\r\n                        writeln!(self.out, \"{}while(true) {{\", level)?;\r\n                    }\r\n                    self.put_block(level.next(), body, context)?;\r\n                    writeln!(self.out, \"{}}}\", level)?;\r\n                }\r\n                crate::Statement::Break => {\r\n                    writeln!(self.out, \"{}break;\", level)?;\r\n                }\r\n                crate::Statement::Continue => {\r\n                    writeln!(self.out, \"{}continue;\", level)?;\r\n                }\r\n                crate::Statement::Return {\r\n                    value: Some(expr_handle),\r\n                } => {\r\n                    self.put_return_value(\r\n                        level,\r\n                        expr_handle,\r\n                        context.result_struct,\r\n                        &context.expression,\r\n                    )?;\r\n                }\r\n                crate::Statement::Return { value: None } => {\r\n                    writeln!(self.out, \"{}return;\", level)?;\r\n                }\r\n                crate::Statement::Kill => {\r\n                    writeln!(self.out, \"{}{}::discard_fragment();\", level, NAMESPACE)?;\r\n                }\r\n                crate::Statement::Barrier(flags) => {\r\n                    //Note: OR-ring bitflags requires `__HAVE_MEMFLAG_OPERATORS__`,\r\n                    // so we try to avoid it here.\r\n                    if flags.is_empty() {\r\n                        writeln!(\r\n                            self.out,\r\n                            \"{}{}::threadgroup_barrier({}::mem_flags::mem_none);\",\r\n                            level, NAMESPACE, NAMESPACE,\r\n                        )?;\r\n                    }\r\n                    if flags.contains(crate::Barrier::STORAGE) {\r\n                        writeln!(\r\n                            self.out,\r\n                            \"{}{}::threadgroup_barrier({}::mem_flags::mem_device);\",\r\n                            level, NAMESPACE, NAMESPACE,\r\n                        )?;\r\n                    }\r\n                    if flags.contains(crate::Barrier::WORK_GROUP) {\r\n                        writeln!(\r\n                            self.out,\r\n                            \"{}{}::threadgroup_barrier({}::mem_flags::mem_threadgroup);\",\r\n                            level, NAMESPACE, NAMESPACE,\r\n                        )?;\r\n                    }\r\n                }\r\n                crate::Statement::Store { pointer, value } => {\r\n                    self.put_store(pointer, value, level, context)?\r\n                }\r\n                crate::Statement::ImageStore {\r\n                    image,\r\n                    coordinate,\r\n                    array_index,\r\n                    value,\r\n                } => {\r\n                    let address = TexelAddress {\r\n                        coordinate,\r\n                        array_index,\r\n                        sample: None,\r\n                        level: None,\r\n                    };\r\n                    self.put_image_store(level, image, &address, value, context)?\r\n                }\r\n                crate::Statement::Call {\r\n                    function,\r\n                    ref arguments,\r\n                    result,\r\n                } => {\r\n                    write!(self.out, \"{}\", level)?;\r\n                    if let Some(expr) = result {\r\n                        let name = format!(\"{}{}\", back::BAKE_PREFIX, expr.index());\r\n                        self.start_baking_expression(expr, &context.expression, &name)?;\r\n                        self.named_expressions.insert(expr, name);\r\n                    }\r\n                    let fun_name = &self.names[&NameKey::Function(function)];\r\n                    write!(self.out, \"{}(\", fun_name)?;\r\n                    // first, write down the actual arguments\r\n                    for (i, &handle) in arguments.iter().enumerate() {\r\n                        if i != 0 {\r\n                            write!(self.out, \", \")?;\r\n                        }\r\n                        self.put_expression(handle, &context.expression, true)?;\r\n                    }\r\n                    // follow-up with any global resources used\r\n                    let mut separate = !arguments.is_empty();\r\n                    let fun_info = &context.mod_info[function];\r\n                    let mut supports_array_length = false;\r\n                    for (handle, var) in context.expression.module.global_variables.iter() {\r\n                        if fun_info[handle].is_empty() {\r\n                            continue;\r\n                        }\r\n                        if var.space.needs_pass_through() {\r\n                            let name = &self.names[&NameKey::GlobalVariable(handle)];\r\n                            if separate {\r\n                                write!(self.out, \", \")?;\r\n                            } else {\r\n                                separate = true;\r\n                            }\r\n                            write!(self.out, \"{}\", name)?;\r\n                        }\r\n                        supports_array_length |=\r\n                            needs_array_length(var.ty, &context.expression.module.types);\r\n                    }\r\n                    if supports_array_length {\r\n                        if separate {\r\n                            write!(self.out, \", \")?;\r\n                        }\r\n                        write!(self.out, \"_buffer_sizes\")?;\r\n                    }\r\n\r\n                    // done\r\n                    writeln!(self.out, \");\")?;\r\n                }\r\n                crate::Statement::Atomic {\r\n                    pointer,\r\n                    ref fun,\r\n                    value,\r\n                    result,\r\n                } => {\r\n                    write!(self.out, \"{}\", level)?;\r\n\r\n                    if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun {\r\n                        let res_name = format!(\"{}{}\", back::BAKE_PREFIX, cmp.index());\r\n                        self.named_expressions.insert(result, res_name);\r\n\r\n                        // returned bool is useless\r\n                        let context = &context.expression;\r\n                        let policy = context.choose_bounds_check_policy(pointer);\r\n                        let checked = policy == index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n                            && self.put_bounds_checks(pointer, context, back::Level(0), \"\")?;\r\n                \r\n                        if checked {\r\n                            write!(self.out, \" ? \")?;\r\n                        }\r\n                        \r\n                        write!(self.out, \"{}::atomic_compare_exchange_weak_explicit({}\", NAMESPACE, ATOMIC_REFERENCE)?;\r\n                        self.put_access_chain(pointer, policy, context)?;\r\n                        write!(self.out, \", \")?;\r\n                        write!(self.out, \"{}\", ATOMIC_REFERENCE)?;\r\n                        self.put_access_chain(cmp, policy, context)?;\r\n                        write!(self.out, \", \")?;\r\n                        self.put_expression(value, context, true)?;\r\n                        write!(self.out, \", {}::memory_order_relaxed\", NAMESPACE)?;\r\n                        write!(self.out, \", {}::memory_order_relaxed)\", NAMESPACE)?;\r\n                        \r\n                        if checked {\r\n                            write!(self.out, \" : DefaultConstructible()\")?;\r\n                        }\r\n                        writeln!(self.out, \";\")?;\r\n                        continue;\r\n                    }\r\n\r\n                    let res_name = format!(\"{}{}\", back::BAKE_PREFIX, result.index());\r\n                    self.start_baking_expression(result, &context.expression, &res_name)?;\r\n                    self.named_expressions.insert(result, res_name);\r\n                    match *fun {\r\n                        crate::AtomicFunction::Add => {\r\n                            self.put_atomic_fetch(pointer, \"add\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::Subtract => {\r\n                            self.put_atomic_fetch(pointer, \"sub\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::And => {\r\n                            self.put_atomic_fetch(pointer, \"and\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::InclusiveOr => {\r\n                            self.put_atomic_fetch(pointer, \"or\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::ExclusiveOr => {\r\n                            self.put_atomic_fetch(pointer, \"xor\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::Min => {\r\n                            self.put_atomic_fetch(pointer, \"min\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::Max => {\r\n                            self.put_atomic_fetch(pointer, \"max\", value, &context.expression)?;\r\n                        }\r\n                        crate::AtomicFunction::Exchange { compare: None } => {\r\n                            write!(\r\n                                self.out,\r\n                                \"{}::atomic_exchange_explicit({}\",\r\n                                NAMESPACE, ATOMIC_REFERENCE,\r\n                            )?;\r\n                            self.put_expression(pointer, &context.expression, true)?;\r\n                            write!(self.out, \", \")?;\r\n                            self.put_expression(value, &context.expression, true)?;\r\n                            write!(self.out, \", {}::memory_order_relaxed)\", NAMESPACE)?;\r\n                        }\r\n                        _ => {},\r\n                    }\r\n                    // done\r\n                    writeln!(self.out, \";\")?;\r\n                }\r\n            }\r\n        }\r\n\r\n        // un-emit expressions\r\n        //TODO: take care of loop/continuing?\r\n        for statement in statements {\r\n            if let crate::Statement::Emit(ref range) = *statement {\r\n                for handle in range.clone() {\r\n                    self.named_expressions.remove(&handle);\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn put_store(\r\n        &mut self,\r\n        pointer: Handle<crate::Expression>,\r\n        value: Handle<crate::Expression>,\r\n        level: back::Level,\r\n        context: &StatementContext,\r\n    ) -> BackendResult {\r\n        let policy = context.expression.choose_bounds_check_policy(pointer);\r\n        if policy == index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n            && self.put_bounds_checks(pointer, &context.expression, level, \"if (\")?\r\n        {\r\n            writeln!(self.out, \") {{\")?;\r\n            self.put_unchecked_store(pointer, value, policy, level.next(), context)?;\r\n            writeln!(self.out, \"{}}}\", level)?;\r\n        } else {\r\n            self.put_unchecked_store(pointer, value, policy, level, context)?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn put_unchecked_store(\r\n        &mut self,\r\n        pointer: Handle<crate::Expression>,\r\n        value: Handle<crate::Expression>,\r\n        policy: index::BoundsCheckPolicy,\r\n        level: back::Level,\r\n        context: &StatementContext,\r\n    ) -> BackendResult {\r\n        let pointer_inner = context.expression.resolve_type(pointer);\r\n        let (array_size, is_atomic) = match *pointer_inner {\r\n            crate::TypeInner::Pointer { base, .. } => {\r\n                match context.expression.module.types[base].inner {\r\n                    crate::TypeInner::Array {\r\n                        size: crate::ArraySize::Constant(ch),\r\n                        ..\r\n                    } => (Some(ch), false),\r\n                    crate::TypeInner::Atomic { .. } => (None, true),\r\n                    _ => (None, false),\r\n                }\r\n            }\r\n            _ => (None, false),\r\n        };\r\n\r\n        // we can't assign fixed-size arrays\r\n        if let Some(const_handle) = array_size {\r\n            let size = context.expression.module.constants[const_handle]\r\n                .to_array_length()\r\n                .unwrap();\r\n            write!(self.out, \"{}for(int _i=0; _i<{}; ++_i) \", level, size)?;\r\n            self.put_access_chain(pointer, policy, &context.expression)?;\r\n            write!(self.out, \".{}[_i] = \", WRAPPED_ARRAY_FIELD)?;\r\n            self.put_expression(value, &context.expression, true)?;\r\n            writeln!(self.out, \".{}[_i];\", WRAPPED_ARRAY_FIELD)?;\r\n        } else if is_atomic {\r\n            write!(\r\n                self.out,\r\n                \"{}{}::atomic_store_explicit({}\",\r\n                level, NAMESPACE, ATOMIC_REFERENCE\r\n            )?;\r\n            self.put_access_chain(pointer, policy, &context.expression)?;\r\n            write!(self.out, \", \")?;\r\n            self.put_expression(value, &context.expression, true)?;\r\n            writeln!(self.out, \", {}::memory_order_relaxed);\", NAMESPACE)?;\r\n        } else {\r\n            write!(self.out, \"{}\", level)?;\r\n            self.put_access_chain(pointer, policy, &context.expression)?;\r\n            write!(self.out, \" = \")?;\r\n            self.put_expression(value, &context.expression, true)?;\r\n            writeln!(self.out, \";\")?;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn write(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        info: &valid::ModuleInfo,\r\n        options: &Options,\r\n        pipeline_options: &PipelineOptions,\r\n    ) -> Result<TranslationInfo, Error> {\r\n        self.names.clear();\r\n        self.namer\r\n            .reset(module, super::keywords::RESERVED, &[], &mut self.names);\r\n        self.struct_member_pads.clear();\r\n\r\n        writeln!(\r\n            self.out,\r\n            \"// language: metal{}.{}\",\r\n            options.lang_version.0, options.lang_version.1\r\n        )?;\r\n        writeln!(self.out, \"#include <metal_stdlib>\")?;\r\n        writeln!(self.out, \"#include <simd/simd.h>\")?;\r\n        writeln!(self.out)?;\r\n        // Work around Metal bug where `uint` is not available by default\r\n        writeln!(self.out, \"using {}::uint;\", NAMESPACE)?;\r\n        writeln!(self.out)?;\r\n\r\n        if options\r\n            .bounds_check_policies\r\n            .contains(index::BoundsCheckPolicy::ReadZeroSkipWrite)\r\n        {\r\n            self.put_default_constructible()?;\r\n        }\r\n\r\n        {\r\n            let mut indices = vec![];\r\n            for (handle, var) in module.global_variables.iter() {\r\n                if needs_array_length(var.ty, &module.types) {\r\n                    let idx = handle.index();\r\n                    indices.push(idx);\r\n                }\r\n            }\r\n\r\n            if !indices.is_empty() {\r\n                writeln!(self.out, \"struct _mslBufferSizes {{\")?;\r\n\r\n                for idx in indices {\r\n                    writeln!(self.out, \"{}uint size{};\", back::INDENT, idx)?;\r\n                }\r\n\r\n                writeln!(self.out, \"}};\")?;\r\n                writeln!(self.out)?;\r\n            }\r\n        };\r\n\r\n        self.write_scalar_constants(module)?;\r\n        self.write_type_defs(module)?;\r\n        self.write_composite_constants(module)?;\r\n        self.write_functions(module, info, options, pipeline_options)\r\n    }\r\n\r\n    /// Write the definition for the `DefaultConstructible` class.\r\n    ///\r\n    /// The [`ReadZeroSkipWrite`] bounds check policy requires us to be able to\r\n    /// produce 'zero' values for any type, including structs, arrays, and so\r\n    /// on. We could do this by emitting default constructor applications, but\r\n    /// that would entail printing the name of the type, which is more trouble\r\n    /// than you'd think. Instead, we just construct this magic C++14 class that\r\n    /// can be converted to any type that can be default constructed, using\r\n    /// template parameter inference to detect which type is needed, so we don't\r\n    /// have to figure out the name.\r\n    ///\r\n    /// [`ReadZeroSkipWrite`]: index::BoundsCheckPolicy::ReadZeroSkipWrite\r\n    fn put_default_constructible(&mut self) -> BackendResult {\r\n        writeln!(self.out, \"struct DefaultConstructible {{\")?;\r\n        writeln!(self.out, \"    template<typename T>\")?;\r\n        writeln!(self.out, \"    operator T() && {{\")?;\r\n        writeln!(self.out, \"        return T {{}};\")?;\r\n        writeln!(self.out, \"    }}\")?;\r\n        writeln!(self.out, \"}};\")?;\r\n        Ok(())\r\n    }\r\n\r\n    fn write_type_defs(&mut self, module: &crate::Module) -> BackendResult {\r\n        for (handle, ty) in module.types.iter() {\r\n            if !ty.needs_alias() {\r\n                continue;\r\n            }\r\n            let name = &self.names[&NameKey::Type(handle)];\r\n            match ty.inner {\r\n                // Naga IR can pass around arrays by value, but Metal, following\r\n                // C++, performs an array-to-pointer conversion (C++ [conv.array])\r\n                // on expressions of array type, so assigning the array by value\r\n                // isn't possible. However, Metal *does* assign structs by\r\n                // value. So in our Metal output, we wrap all array types in\r\n                // synthetic struct types:\r\n                //\r\n                //     struct type1 {\r\n                //         float inner[10]\r\n                //     };\r\n                //\r\n                // Then we carefully include `.inner` (`WRAPPED_ARRAY_FIELD`) in\r\n                // any expression that actually wants access to the array.\r\n                crate::TypeInner::Array {\r\n                    base,\r\n                    size,\r\n                    stride: _,\r\n                } => {\r\n                    let base_name = TypeContext {\r\n                        handle: base,\r\n                        module,\r\n                        names: &self.names,\r\n                        access: crate::StorageAccess::empty(),\r\n                        binding: None,\r\n                        first_time: false,\r\n                    };\r\n\r\n                    match size {\r\n                        crate::ArraySize::Constant(const_handle) => {\r\n                            let coco = ConstantContext {\r\n                                handle: const_handle,\r\n                                arena: &module.constants,\r\n                                names: &self.names,\r\n                                first_time: false,\r\n                            };\r\n\r\n                            writeln!(self.out, \"struct {} {{\", name)?;\r\n                            writeln!(\r\n                                self.out,\r\n                                \"{}{} {}[{}];\",\r\n                                back::INDENT,\r\n                                base_name,\r\n                                WRAPPED_ARRAY_FIELD,\r\n                                coco\r\n                            )?;\r\n                            writeln!(self.out, \"}};\")?;\r\n                        }\r\n                        crate::ArraySize::Dynamic => {\r\n                            writeln!(self.out, \"typedef {} {}[1];\", base_name, name)?;\r\n                        }\r\n                    }\r\n                }\r\n                crate::TypeInner::Struct {\r\n                    ref members, span, ..\r\n                } => {\r\n                    writeln!(self.out, \"struct {} {{\", name)?;\r\n                    let mut last_offset = 0;\r\n                    for (index, member) in members.iter().enumerate() {\r\n                        // quick and dirty way to figure out if we need this...\r\n                        if member.binding.is_none() && member.offset > last_offset {\r\n                            self.struct_member_pads.insert((handle, index as u32));\r\n                            let pad = member.offset - last_offset;\r\n                            writeln!(self.out, \"{}char _pad{}[{}];\", back::INDENT, index, pad)?;\r\n                        }\r\n                        let ty_inner = &module.types[member.ty].inner;\r\n                        last_offset = member.offset + ty_inner.size(&module.constants);\r\n\r\n                        let member_name = &self.names[&NameKey::StructMember(handle, index as u32)];\r\n\r\n                        // If the member should be packed (as is the case for a misaligned vec3) issue a packed vector\r\n                        match should_pack_struct_member(members, span, index, module) {\r\n                            Some(kind) => {\r\n                                writeln!(\r\n                                    self.out,\r\n                                    \"{}{}::packed_{}3 {};\",\r\n                                    back::INDENT,\r\n                                    NAMESPACE,\r\n                                    kind.to_msl_name(),\r\n                                    member_name\r\n                                )?;\r\n                            }\r\n                            None => {\r\n                                let base_name = TypeContext {\r\n                                    handle: member.ty,\r\n                                    module,\r\n                                    names: &self.names,\r\n                                    access: crate::StorageAccess::empty(),\r\n                                    binding: None,\r\n                                    first_time: false,\r\n                                };\r\n                                writeln!(\r\n                                    self.out,\r\n                                    \"{}{} {};\",\r\n                                    back::INDENT,\r\n                                    base_name,\r\n                                    member_name\r\n                                )?;\r\n\r\n                                // for 3-component vectors, add one component\r\n                                if let crate::TypeInner::Vector {\r\n                                    size: crate::VectorSize::Tri,\r\n                                    kind: _,\r\n                                    width,\r\n                                } = *ty_inner\r\n                                {\r\n                                    last_offset += width as u32;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    writeln!(self.out, \"}};\")?;\r\n                }\r\n                _ => {\r\n                    let ty_name = TypeContext {\r\n                        handle,\r\n                        module,\r\n                        names: &self.names,\r\n                        access: crate::StorageAccess::empty(),\r\n                        binding: None,\r\n                        first_time: true,\r\n                    };\r\n                    writeln!(self.out, \"typedef {} {};\", ty_name, name)?;\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn write_scalar_constants(&mut self, module: &crate::Module) -> BackendResult {\r\n        for (handle, constant) in module.constants.iter() {\r\n            match constant.inner {\r\n                crate::ConstantInner::Scalar {\r\n                    width: _,\r\n                    ref value,\r\n                } if constant.name.is_some() => {\r\n                    debug_assert!(constant.needs_alias());\r\n                    write!(self.out, \"constexpr constant \")?;\r\n                    match *value {\r\n                        crate::ScalarValue::Sint(_) => {\r\n                            write!(self.out, \"int\")?;\r\n                        }\r\n                        crate::ScalarValue::Uint(_) => {\r\n                            write!(self.out, \"unsigned\")?;\r\n                        }\r\n                        crate::ScalarValue::Float(_) => {\r\n                            write!(self.out, \"float\")?;\r\n                        }\r\n                        crate::ScalarValue::Bool(_) => {\r\n                            write!(self.out, \"bool\")?;\r\n                        }\r\n                    }\r\n                    let name = &self.names[&NameKey::Constant(handle)];\r\n                    let coco = ConstantContext {\r\n                        handle,\r\n                        arena: &module.constants,\r\n                        names: &self.names,\r\n                        first_time: true,\r\n                    };\r\n                    writeln!(self.out, \" {} = {};\", name, coco)?;\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn write_composite_constants(&mut self, module: &crate::Module) -> BackendResult {\r\n        for (handle, constant) in module.constants.iter() {\r\n            match constant.inner {\r\n                crate::ConstantInner::Scalar { .. } => {}\r\n                crate::ConstantInner::Composite { ty, ref components } => {\r\n                    debug_assert!(constant.needs_alias());\r\n                    let name = &self.names[&NameKey::Constant(handle)];\r\n                    let ty_name = TypeContext {\r\n                        handle: ty,\r\n                        module,\r\n                        names: &self.names,\r\n                        access: crate::StorageAccess::empty(),\r\n                        binding: None,\r\n                        first_time: false,\r\n                    };\r\n                    write!(self.out, \"constant {} {} = {{\", ty_name, name,)?;\r\n                    for (i, &sub_handle) in components.iter().enumerate() {\r\n                        // insert padding initialization, if needed\r\n                        if self.struct_member_pads.contains(&(ty, i as u32)) {\r\n                            write!(self.out, \", {{}}\")?;\r\n                        }\r\n                        let separator = if i != 0 { \", \" } else { \"\" };\r\n                        let coco = ConstantContext {\r\n                            handle: sub_handle,\r\n                            arena: &module.constants,\r\n                            names: &self.names,\r\n                            first_time: false,\r\n                        };\r\n                        write!(self.out, \"{}{}\", separator, coco)?;\r\n                    }\r\n                    writeln!(self.out, \"}};\")?;\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn put_inline_sampler_properties(\r\n        &mut self,\r\n        level: back::Level,\r\n        sampler: &sm::InlineSampler,\r\n    ) -> BackendResult {\r\n        for (&letter, address) in ['s', 't', 'r'].iter().zip(sampler.address.iter()) {\r\n            writeln!(\r\n                self.out,\r\n                \"{}{}::{}_address::{},\",\r\n                level,\r\n                NAMESPACE,\r\n                letter,\r\n                address.as_str(),\r\n            )?;\r\n        }\r\n        writeln!(\r\n            self.out,\r\n            \"{}{}::mag_filter::{},\",\r\n            level,\r\n            NAMESPACE,\r\n            sampler.mag_filter.as_str(),\r\n        )?;\r\n        writeln!(\r\n            self.out,\r\n            \"{}{}::min_filter::{},\",\r\n            level,\r\n            NAMESPACE,\r\n            sampler.min_filter.as_str(),\r\n        )?;\r\n        if let Some(filter) = sampler.mip_filter {\r\n            writeln!(\r\n                self.out,\r\n                \"{}{}::mip_filter::{},\",\r\n                level,\r\n                NAMESPACE,\r\n                filter.as_str(),\r\n            )?;\r\n        }\r\n        // avoid setting it on platforms that don't support it\r\n        if sampler.border_color != sm::BorderColor::TransparentBlack {\r\n            writeln!(\r\n                self.out,\r\n                \"{}{}::border_color::{},\",\r\n                level,\r\n                NAMESPACE,\r\n                sampler.border_color.as_str(),\r\n            )?;\r\n        }\r\n        //TODO: I'm not able to feed this in a way that MSL likes:\r\n        //>error: use of undeclared identifier 'lod_clamp'\r\n        //>error: no member named 'max_anisotropy' in namespace 'metal'\r\n        if false {\r\n            if let Some(ref lod) = sampler.lod_clamp {\r\n                writeln!(self.out, \"{}lod_clamp({},{}),\", level, lod.start, lod.end,)?;\r\n            }\r\n            if let Some(aniso) = sampler.max_anisotropy {\r\n                writeln!(self.out, \"{}max_anisotropy({}),\", level, aniso.get(),)?;\r\n            }\r\n        }\r\n        if sampler.compare_func != sm::CompareFunc::Never {\r\n            writeln!(\r\n                self.out,\r\n                \"{}{}::compare_func::{},\",\r\n                level,\r\n                NAMESPACE,\r\n                sampler.compare_func.as_str(),\r\n            )?;\r\n        }\r\n        writeln!(\r\n            self.out,\r\n            \"{}{}::coord::{}\",\r\n            level,\r\n            NAMESPACE,\r\n            sampler.coord.as_str()\r\n        )?;\r\n        Ok(())\r\n    }\r\n\r\n    // Returns the array of mapped entry point names.\r\n    fn write_functions(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        mod_info: &valid::ModuleInfo,\r\n        options: &Options,\r\n        pipeline_options: &PipelineOptions,\r\n    ) -> Result<TranslationInfo, Error> {\r\n        let mut pass_through_globals = Vec::new();\r\n        for (fun_handle, fun) in module.functions.iter() {\r\n            log::trace!(\r\n                \"function {:?}, handle {:?}\",\r\n                fun.name.as_deref().unwrap_or(\"(anonymous)\"),\r\n                fun_handle\r\n            );\r\n\r\n            let fun_info = &mod_info[fun_handle];\r\n            pass_through_globals.clear();\r\n            let mut supports_array_length = false;\r\n            for (handle, var) in module.global_variables.iter() {\r\n                if !fun_info[handle].is_empty() {\r\n                    if var.space.needs_pass_through() {\r\n                        pass_through_globals.push(handle);\r\n                    }\r\n                    supports_array_length |= needs_array_length(var.ty, &module.types);\r\n                }\r\n            }\r\n\r\n            writeln!(self.out)?;\r\n            let fun_name = &self.names[&NameKey::Function(fun_handle)];\r\n            match fun.result {\r\n                Some(ref result) => {\r\n                    let ty_name = TypeContext {\r\n                        handle: result.ty,\r\n                        module,\r\n                        names: &self.names,\r\n                        access: crate::StorageAccess::empty(),\r\n                        binding: None,\r\n                        first_time: false,\r\n                    };\r\n                    write!(self.out, \"{}\", ty_name)?;\r\n                }\r\n                None => {\r\n                    write!(self.out, \"void\")?;\r\n                }\r\n            }\r\n            writeln!(self.out, \" {}(\", fun_name)?;\r\n\r\n            for (index, arg) in fun.arguments.iter().enumerate() {\r\n                let name = &self.names[&NameKey::FunctionArgument(fun_handle, index as u32)];\r\n                let param_type_name = TypeContext {\r\n                    handle: arg.ty,\r\n                    module,\r\n                    names: &self.names,\r\n                    access: crate::StorageAccess::empty(),\r\n                    binding: None,\r\n                    first_time: false,\r\n                };\r\n                let separator = separate(\r\n                    !pass_through_globals.is_empty()\r\n                        || index + 1 != fun.arguments.len()\r\n                        || supports_array_length,\r\n                );\r\n                writeln!(\r\n                    self.out,\r\n                    \"{}{} {}{}\",\r\n                    back::INDENT,\r\n                    param_type_name,\r\n                    name,\r\n                    separator\r\n                )?;\r\n            }\r\n            for (index, &handle) in pass_through_globals.iter().enumerate() {\r\n                let tyvar = TypedGlobalVariable {\r\n                    module,\r\n                    names: &self.names,\r\n                    handle,\r\n                    usage: fun_info[handle],\r\n                    binding: None,\r\n                    reference: true,\r\n                };\r\n                let separator =\r\n                    separate(index + 1 != pass_through_globals.len() || supports_array_length);\r\n                write!(self.out, \"{}\", back::INDENT)?;\r\n                tyvar.try_fmt(&mut self.out)?;\r\n                writeln!(self.out, \"{}\", separator)?;\r\n            }\r\n\r\n            if supports_array_length {\r\n                writeln!(\r\n                    self.out,\r\n                    \"{}constant _mslBufferSizes& _buffer_sizes\",\r\n                    back::INDENT\r\n                )?;\r\n            }\r\n\r\n            writeln!(self.out, \") {{\")?;\r\n\r\n            for (local_handle, local) in fun.local_variables.iter() {\r\n                let ty_name = TypeContext {\r\n                    handle: local.ty,\r\n                    module,\r\n                    names: &self.names,\r\n                    access: crate::StorageAccess::empty(),\r\n                    binding: None,\r\n                    first_time: false,\r\n                };\r\n                let local_name = &self.names[&NameKey::FunctionLocal(fun_handle, local_handle)];\r\n                write!(self.out, \"{}{} {}\", back::INDENT, ty_name, local_name)?;\r\n                match local.init {\r\n                    Some(value) => {\r\n                        let coco = ConstantContext {\r\n                            handle: value,\r\n                            arena: &module.constants,\r\n                            names: &self.names,\r\n                            first_time: false,\r\n                        };\r\n                        write!(self.out, \" = {}\", coco)?;\r\n                    }\r\n                    None => {\r\n                        write!(self.out, \" = {{}}\")?;\r\n                    }\r\n                };\r\n                writeln!(self.out, \";\")?;\r\n            }\r\n\r\n            let guarded_indices =\r\n                index::find_checked_indexes(module, fun, fun_info, options.bounds_check_policies);\r\n\r\n            let context = StatementContext {\r\n                expression: ExpressionContext {\r\n                    function: fun,\r\n                    origin: FunctionOrigin::Handle(fun_handle),\r\n                    info: fun_info,\r\n                    policies: options.bounds_check_policies,\r\n                    guarded_indices,\r\n                    module,\r\n                    pipeline_options,\r\n                },\r\n                mod_info,\r\n                result_struct: None,\r\n            };\r\n            self.named_expressions.clear();\r\n            self.update_expressions_to_bake(fun, fun_info, &context.expression);\r\n            self.put_block(back::Level(1), &fun.body, &context)?;\r\n            writeln!(self.out, \"}}\")?;\r\n        }\r\n\r\n        let mut info = TranslationInfo {\r\n            entry_point_names: Vec::with_capacity(module.entry_points.len()),\r\n        };\r\n        for (ep_index, ep) in module.entry_points.iter().enumerate() {\r\n            let fun = &ep.function;\r\n            let fun_info = mod_info.get_entry_point(ep_index);\r\n            let mut ep_error = None;\r\n\r\n            log::trace!(\r\n                \"entry point {:?}, index {:?}\",\r\n                fun.name.as_deref().unwrap_or(\"(anonymous)\"),\r\n                ep_index\r\n            );\r\n\r\n            // Is any global variable used by this entry point dynamically sized?\r\n            let supports_array_length = module\r\n                .global_variables\r\n                .iter()\r\n                .filter(|&(handle, _)| !fun_info[handle].is_empty())\r\n                .any(|(_, var)| needs_array_length(var.ty, &module.types));\r\n\r\n            // skip this entry point if any global bindings are missing,\r\n            // or their types are incompatible.\r\n            if !options.fake_missing_bindings {\r\n                for (var_handle, var) in module.global_variables.iter() {\r\n                    if fun_info[var_handle].is_empty() {\r\n                        continue;\r\n                    }\r\n                    if let Some(ref br) = var.binding {\r\n                        let good = match options.per_stage_map[ep.stage].resources.get(br) {\r\n                            Some(target) => {\r\n                                let binding_ty = match module.types[var.ty].inner {\r\n                                    crate::TypeInner::BindingArray { base, .. } => {\r\n                                        &module.types[base].inner\r\n                                    }\r\n                                    ref ty => ty,\r\n                                };\r\n                                match *binding_ty {\r\n                                    crate::TypeInner::Image { .. } => target.texture.is_some(),\r\n                                    crate::TypeInner::Sampler { .. } => target.sampler.is_some(),\r\n                                    _ => target.buffer.is_some(),\r\n                                }\r\n                            }\r\n                            None => false,\r\n                        };\r\n                        if !good {\r\n                            ep_error = Some(super::EntryPointError::MissingBinding(br.clone()));\r\n                            break;\r\n                        }\r\n                    }\r\n                    if var.space == crate::AddressSpace::PushConstant {\r\n                        if let Err(e) = options.resolve_push_constants(ep.stage) {\r\n                            ep_error = Some(e);\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                if supports_array_length {\r\n                    if let Err(err) = options.resolve_sizes_buffer(ep.stage) {\r\n                        ep_error = Some(err);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if let Some(err) = ep_error {\r\n                info.entry_point_names.push(Err(err));\r\n                continue;\r\n            }\r\n            let fun_name = &self.names[&NameKey::EntryPoint(ep_index as _)];\r\n            info.entry_point_names.push(Ok(fun_name.clone()));\r\n\r\n            writeln!(self.out)?;\r\n\r\n            let (em_str, in_mode, out_mode) = match ep.stage {\r\n                crate::ShaderStage::Vertex => (\r\n                    \"vertex\",\r\n                    LocationMode::VertexInput,\r\n                    LocationMode::VertexOutput,\r\n                ),\r\n                crate::ShaderStage::Fragment { .. } => (\r\n                    \"fragment\",\r\n                    LocationMode::FragmentInput,\r\n                    LocationMode::FragmentOutput,\r\n                ),\r\n                crate::ShaderStage::Compute { .. } => {\r\n                    (\"kernel\", LocationMode::Uniform, LocationMode::Uniform)\r\n                }\r\n            };\r\n\r\n            // List all the Naga `EntryPoint`'s `Function`'s arguments,\r\n            // flattening structs into their members. In Metal, we will pass\r\n            // each of these values to the entry point as a separate argument—\r\n            // except for the varyings, handled next.\r\n            let mut flattened_arguments = Vec::new();\r\n            for (arg_index, arg) in fun.arguments.iter().enumerate() {\r\n                match module.types[arg.ty].inner {\r\n                    crate::TypeInner::Struct { ref members, .. } => {\r\n                        for (member_index, member) in members.iter().enumerate() {\r\n                            let member_index = member_index as u32;\r\n                            flattened_arguments.push((\r\n                                NameKey::StructMember(arg.ty, member_index),\r\n                                member.ty,\r\n                                member.binding.as_ref(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    _ => flattened_arguments.push((\r\n                        NameKey::EntryPointArgument(ep_index as _, arg_index as u32),\r\n                        arg.ty,\r\n                        arg.binding.as_ref(),\r\n                    )),\r\n                }\r\n            }\r\n\r\n            // Identify the varyings among the argument values, and emit a\r\n            // struct type named `<fun>Input` to hold them.\r\n            let stage_in_name = format!(\"{}Input\", fun_name);\r\n            let varyings_member_name = self.namer.call(\"varyings\");\r\n            let mut has_varyings = false;\r\n            if !flattened_arguments.is_empty() {\r\n                writeln!(self.out, \"struct {} {{\", stage_in_name)?;\r\n                for &(ref name_key, ty, binding) in flattened_arguments.iter() {\r\n                    let binding = match binding {\r\n                        Some(ref binding @ &crate::Binding::Location { .. }) => binding,\r\n                        _ => continue,\r\n                    };\r\n                    has_varyings = true;\r\n                    let name = &self.names[name_key];\r\n                    let ty_name = TypeContext {\r\n                        handle: ty,\r\n                        module,\r\n                        names: &self.names,\r\n                        access: crate::StorageAccess::empty(),\r\n                        binding: None,\r\n                        first_time: false,\r\n                    };\r\n                    let resolved = options.resolve_local_binding(binding, in_mode)?;\r\n                    write!(self.out, \"{}{} {}\", back::INDENT, ty_name, name)?;\r\n                    resolved.try_fmt(&mut self.out)?;\r\n                    writeln!(self.out, \";\")?;\r\n                }\r\n                writeln!(self.out, \"}};\")?;\r\n            }\r\n\r\n            // Define a struct type named for the return value, if any, named\r\n            // `<fun>Output`.\r\n            let stage_out_name = format!(\"{}Output\", fun_name);\r\n            let result_member_name = self.namer.call(\"member\");\r\n            let result_type_name = match fun.result {\r\n                Some(ref result) => {\r\n                    let mut result_members = Vec::new();\r\n                    if let crate::TypeInner::Struct { ref members, .. } =\r\n                        module.types[result.ty].inner\r\n                    {\r\n                        for (member_index, member) in members.iter().enumerate() {\r\n                            result_members.push((\r\n                                &self.names[&NameKey::StructMember(result.ty, member_index as u32)],\r\n                                member.ty,\r\n                                member.binding.as_ref(),\r\n                            ));\r\n                        }\r\n                    } else {\r\n                        result_members.push((\r\n                            &result_member_name,\r\n                            result.ty,\r\n                            result.binding.as_ref(),\r\n                        ));\r\n                    }\r\n\r\n                    writeln!(self.out, \"struct {} {{\", stage_out_name)?;\r\n                    let mut has_point_size = false;\r\n                    for (name, ty, binding) in result_members {\r\n                        let ty_name = TypeContext {\r\n                            handle: ty,\r\n                            module,\r\n                            names: &self.names,\r\n                            access: crate::StorageAccess::empty(),\r\n                            binding: None,\r\n                            first_time: true,\r\n                        };\r\n                        let binding = binding.ok_or(Error::Validation)?;\r\n\r\n                        match *binding {\r\n                            // Point size is only supported in VS of pipelines with\r\n                            // point primitive topology.\r\n                            crate::Binding::BuiltIn(crate::BuiltIn::PointSize) => {\r\n                                has_point_size = true;\r\n                                if !pipeline_options.allow_point_size {\r\n                                    continue;\r\n                                }\r\n                            }\r\n                            // Cull Distance is not supported in Metal.\r\n                            // But we can't return UnsupportedBuiltIn error to user.\r\n                            // Because otherwise we can't generate msl shader from any glslang SPIR-V shaders.\r\n                            // glslang generates gl_PerVertex struct with gl_CullDistance builtin inside by default.\r\n                            crate::Binding::BuiltIn(crate::BuiltIn::CullDistance) => {\r\n                                log::warn!(\"Ignoring CullDistance BuiltIn\");\r\n                                continue;\r\n                            }\r\n                            _ => {}\r\n                        }\r\n\r\n                        let array_len = match module.types[ty].inner {\r\n                            crate::TypeInner::Array {\r\n                                size: crate::ArraySize::Constant(handle),\r\n                                ..\r\n                            } => module.constants[handle].to_array_length(),\r\n                            _ => None,\r\n                        };\r\n                        let resolved = options.resolve_local_binding(binding, out_mode)?;\r\n                        write!(self.out, \"{}{} {}\", back::INDENT, ty_name, name)?;\r\n                        if let Some(array_len) = array_len {\r\n                            write!(self.out, \" [{}]\", array_len)?;\r\n                        }\r\n                        resolved.try_fmt(&mut self.out)?;\r\n                        writeln!(self.out, \";\")?;\r\n                    }\r\n\r\n                    if pipeline_options.allow_point_size\r\n                        && ep.stage == crate::ShaderStage::Vertex\r\n                        && !has_point_size\r\n                    {\r\n                        // inject the point size output last\r\n                        writeln!(\r\n                            self.out,\r\n                            \"{}float _point_size [[point_size]];\",\r\n                            back::INDENT\r\n                        )?;\r\n                    }\r\n                    writeln!(self.out, \"}};\")?;\r\n                    &stage_out_name\r\n                }\r\n                None => \"void\",\r\n            };\r\n\r\n            // Write the entry point function's name, and begin its argument list.\r\n            writeln!(self.out, \"{} {} {}(\", em_str, result_type_name, fun_name)?;\r\n            let mut is_first_argument = true;\r\n\r\n            // If we have produced a struct holding the `EntryPoint`'s\r\n            // `Function`'s arguments' varyings, pass that struct first.\r\n            if has_varyings {\r\n                writeln!(\r\n                    self.out,\r\n                    \"  {} {} [[stage_in]]\",\r\n                    stage_in_name, varyings_member_name\r\n                )?;\r\n                is_first_argument = false;\r\n            }\r\n\r\n            // Then pass the remaining arguments not included in the varyings\r\n            // struct.\r\n            //\r\n            // Since `Namer.reset` wasn't expecting struct members to be\r\n            // suddenly injected into the normal namespace like this,\r\n            // `self.names` doesn't keep them distinct from other variables.\r\n            // Generate fresh names for these arguments, and remember the\r\n            // mapping.\r\n            let mut flattened_member_names = FastHashMap::default();\r\n            for &(ref name_key, ty, binding) in flattened_arguments.iter() {\r\n                let binding = match binding {\r\n                    Some(ref binding @ &crate::Binding::BuiltIn { .. }) => binding,\r\n                    _ => continue,\r\n                };\r\n                let name = if let NameKey::StructMember(ty, index) = *name_key {\r\n                    // We should always insert a fresh entry here, but use\r\n                    // `or_insert` to get a reference to the `String` we just\r\n                    // inserted.\r\n                    flattened_member_names\r\n                        .entry(NameKey::StructMember(ty, index))\r\n                        .or_insert_with(|| self.namer.call(&self.names[name_key]))\r\n                } else {\r\n                    &self.names[name_key]\r\n                };\r\n                let ty_name = TypeContext {\r\n                    handle: ty,\r\n                    module,\r\n                    names: &self.names,\r\n                    access: crate::StorageAccess::empty(),\r\n                    binding: None,\r\n                    first_time: false,\r\n                };\r\n                let resolved = options.resolve_local_binding(binding, in_mode)?;\r\n                let separator = if is_first_argument {\r\n                    is_first_argument = false;\r\n                    ' '\r\n                } else {\r\n                    ','\r\n                };\r\n                write!(self.out, \"{} {} {}\", separator, ty_name, name)?;\r\n                resolved.try_fmt(&mut self.out)?;\r\n                writeln!(self.out)?;\r\n            }\r\n\r\n            // Those global variables used by this entry point and its callees\r\n            // get passed as arguments. `Private` globals are an exception, they\r\n            // don't outlive this invocation, so we declare them below as locals\r\n            // within the entry point.\r\n            for (handle, var) in module.global_variables.iter() {\r\n                let usage = fun_info[handle];\r\n                if usage.is_empty() || var.space == crate::AddressSpace::Private {\r\n                    continue;\r\n                }\r\n                // the resolves have already been checked for `!fake_missing_bindings` case\r\n                let resolved = match var.space {\r\n                    crate::AddressSpace::PushConstant => {\r\n                        options.resolve_push_constants(ep.stage).ok()\r\n                    }\r\n                    crate::AddressSpace::WorkGroup => None,\r\n                    crate::AddressSpace::Storage { .. } if options.lang_version < (2, 0) => {\r\n                        return Err(Error::UnsupportedAddressSpace(var.space))\r\n                    }\r\n                    _ => options\r\n                        .resolve_resource_binding(ep.stage, var.binding.as_ref().unwrap())\r\n                        .ok(),\r\n                };\r\n                if let Some(ref resolved) = resolved {\r\n                    // Inline samplers are be defined in the EP body\r\n                    if resolved.as_inline_sampler(options).is_some() {\r\n                        continue;\r\n                    }\r\n                }\r\n\r\n                let tyvar = TypedGlobalVariable {\r\n                    module,\r\n                    names: &self.names,\r\n                    handle,\r\n                    usage,\r\n                    binding: resolved.as_ref(),\r\n                    reference: true,\r\n                };\r\n                let separator = if is_first_argument {\r\n                    is_first_argument = false;\r\n                    ' '\r\n                } else {\r\n                    ','\r\n                };\r\n                write!(self.out, \"{} \", separator)?;\r\n                tyvar.try_fmt(&mut self.out)?;\r\n                if let Some(resolved) = resolved {\r\n                    resolved.try_fmt(&mut self.out)?;\r\n                }\r\n                if let Some(value) = var.init {\r\n                    let coco = ConstantContext {\r\n                        handle: value,\r\n                        arena: &module.constants,\r\n                        names: &self.names,\r\n                        first_time: false,\r\n                    };\r\n                    write!(self.out, \" = {}\", coco)?;\r\n                }\r\n                writeln!(self.out)?;\r\n            }\r\n\r\n            // If this entry uses any variable-length arrays, their sizes are\r\n            // passed as a final struct-typed argument.\r\n            if supports_array_length {\r\n                // this is checked earlier\r\n                let resolved = options.resolve_sizes_buffer(ep.stage).unwrap();\r\n                let separator = if module.global_variables.is_empty() {\r\n                    ' '\r\n                } else {\r\n                    ','\r\n                };\r\n                write!(\r\n                    self.out,\r\n                    \"{} constant _mslBufferSizes& _buffer_sizes\",\r\n                    separator,\r\n                )?;\r\n                resolved.try_fmt(&mut self.out)?;\r\n                writeln!(self.out)?;\r\n            }\r\n\r\n            // end of the entry point argument list\r\n            writeln!(self.out, \") {{\")?;\r\n\r\n            // Metal doesn't support private mutable variables outside of functions,\r\n            // so we put them here, just like the locals.\r\n            for (handle, var) in module.global_variables.iter() {\r\n                let usage = fun_info[handle];\r\n                if usage.is_empty() {\r\n                    continue;\r\n                }\r\n                if var.space == crate::AddressSpace::Private {\r\n                    let tyvar = TypedGlobalVariable {\r\n                        module,\r\n                        names: &self.names,\r\n                        handle,\r\n                        usage,\r\n                        binding: None,\r\n                        reference: false,\r\n                    };\r\n                    write!(self.out, \"{}\", back::INDENT)?;\r\n                    tyvar.try_fmt(&mut self.out)?;\r\n                    match var.init {\r\n                        Some(value) => {\r\n                            let coco = ConstantContext {\r\n                                handle: value,\r\n                                arena: &module.constants,\r\n                                names: &self.names,\r\n                                first_time: false,\r\n                            };\r\n                            writeln!(self.out, \" = {};\", coco)?;\r\n                        }\r\n                        None => {\r\n                            writeln!(self.out, \" = {{}};\")?;\r\n                        }\r\n                    };\r\n                } else if let Some(ref binding) = var.binding {\r\n                    // write an inline sampler\r\n                    let resolved = options.resolve_resource_binding(ep.stage, binding).unwrap();\r\n                    if let Some(sampler) = resolved.as_inline_sampler(options) {\r\n                        let name = &self.names[&NameKey::GlobalVariable(handle)];\r\n                        writeln!(\r\n                            self.out,\r\n                            \"{}constexpr {}::sampler {}(\",\r\n                            back::INDENT,\r\n                            NAMESPACE,\r\n                            name\r\n                        )?;\r\n                        self.put_inline_sampler_properties(back::Level(2), sampler)?;\r\n                        writeln!(self.out, \"{});\", back::INDENT)?;\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Now take the arguments that we gathered into structs, and the\r\n            // structs that we flattened into arguments, and emit local\r\n            // variables with initializers that put everything back the way the\r\n            // body code expects.\r\n            //\r\n            // If we had to generate fresh names for struct members passed as\r\n            // arguments, be sure to use those names when rebuilding the struct.\r\n            //\r\n            // \"Each day, I change some zeros to ones, and some ones to zeros.\r\n            // The rest, I leave alone.\"\r\n            for (arg_index, arg) in fun.arguments.iter().enumerate() {\r\n                let arg_name =\r\n                    &self.names[&NameKey::EntryPointArgument(ep_index as _, arg_index as u32)];\r\n                match module.types[arg.ty].inner {\r\n                    crate::TypeInner::Struct { ref members, .. } => {\r\n                        let struct_name = &self.names[&NameKey::Type(arg.ty)];\r\n                        write!(\r\n                            self.out,\r\n                            \"{}const {} {} = {{ \",\r\n                            back::INDENT,\r\n                            struct_name,\r\n                            arg_name\r\n                        )?;\r\n                        for (member_index, member) in members.iter().enumerate() {\r\n                            let key = NameKey::StructMember(arg.ty, member_index as u32);\r\n                            // If it's not in the varying struct, then we should\r\n                            // have passed it as its own argument and assigned\r\n                            // it a new name.\r\n                            let name = match member.binding {\r\n                                Some(crate::Binding::BuiltIn { .. }) => {\r\n                                    &flattened_member_names[&key]\r\n                                }\r\n                                _ => &self.names[&key],\r\n                            };\r\n                            if member_index != 0 {\r\n                                write!(self.out, \", \")?;\r\n                            }\r\n                            if let Some(crate::Binding::Location { .. }) = member.binding {\r\n                                write!(self.out, \"{}.\", varyings_member_name)?;\r\n                            }\r\n                            write!(self.out, \"{}\", name)?;\r\n                        }\r\n                        writeln!(self.out, \" }};\")?;\r\n                    }\r\n                    _ => {\r\n                        if let Some(crate::Binding::Location { .. }) = arg.binding {\r\n                            writeln!(\r\n                                self.out,\r\n                                \"{}const auto {} = {}.{};\",\r\n                                back::INDENT,\r\n                                arg_name,\r\n                                varyings_member_name,\r\n                                arg_name\r\n                            )?;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Finally, declare all the local variables that we need\r\n            //TODO: we can postpone this till the relevant expressions are emitted\r\n            for (local_handle, local) in fun.local_variables.iter() {\r\n                let name = &self.names[&NameKey::EntryPointLocal(ep_index as _, local_handle)];\r\n                let ty_name = TypeContext {\r\n                    handle: local.ty,\r\n                    module,\r\n                    names: &self.names,\r\n                    access: crate::StorageAccess::empty(),\r\n                    binding: None,\r\n                    first_time: false,\r\n                };\r\n                write!(self.out, \"{}{} {}\", back::INDENT, ty_name, name)?;\r\n                match local.init {\r\n                    Some(value) => {\r\n                        let coco = ConstantContext {\r\n                            handle: value,\r\n                            arena: &module.constants,\r\n                            names: &self.names,\r\n                            first_time: false,\r\n                        };\r\n                        write!(self.out, \" = {}\", coco)?;\r\n                    }\r\n                    None => {\r\n                        write!(self.out, \" = {{}}\")?;\r\n                    }\r\n                };\r\n                writeln!(self.out, \";\")?;\r\n            }\r\n\r\n            let guarded_indices =\r\n                index::find_checked_indexes(module, fun, fun_info, options.bounds_check_policies);\r\n\r\n            let context = StatementContext {\r\n                expression: ExpressionContext {\r\n                    function: fun,\r\n                    origin: FunctionOrigin::EntryPoint(ep_index as _),\r\n                    info: fun_info,\r\n                    policies: options.bounds_check_policies,\r\n                    guarded_indices,\r\n                    module,\r\n                    pipeline_options,\r\n                },\r\n                mod_info,\r\n                result_struct: Some(&stage_out_name),\r\n            };\r\n            self.named_expressions.clear();\r\n            self.update_expressions_to_bake(fun, fun_info, &context.expression);\r\n            self.put_block(back::Level(1), &fun.body, &context)?;\r\n            writeln!(self.out, \"}}\")?;\r\n            if ep_index + 1 != module.entry_points.len() {\r\n                writeln!(self.out)?;\r\n            }\r\n        }\r\n\r\n        Ok(info)\r\n    }\r\n}\r\n\r\n#[test]\r\nfn test_stack_size() {\r\n    use crate::valid::{Capabilities, ValidationFlags};\r\n    // create a module with at least one expression nested\r\n    let mut module = crate::Module::default();\r\n    let constant = module.constants.append(\r\n        crate::Constant {\r\n            name: None,\r\n            specialization: None,\r\n            inner: crate::ConstantInner::Scalar {\r\n                value: crate::ScalarValue::Float(1.0),\r\n                width: 4,\r\n            },\r\n        },\r\n        Default::default(),\r\n    );\r\n    let mut fun = crate::Function::default();\r\n    let const_expr = fun\r\n        .expressions\r\n        .append(crate::Expression::Constant(constant), Default::default());\r\n    let nested_expr = fun.expressions.append(\r\n        crate::Expression::Unary {\r\n            op: crate::UnaryOperator::Negate,\r\n            expr: const_expr,\r\n        },\r\n        Default::default(),\r\n    );\r\n    fun.body.push(\r\n        crate::Statement::Emit(fun.expressions.range_from(1)),\r\n        Default::default(),\r\n    );\r\n    fun.body.push(\r\n        crate::Statement::If {\r\n            condition: nested_expr,\r\n            accept: crate::Block::new(),\r\n            reject: crate::Block::new(),\r\n        },\r\n        Default::default(),\r\n    );\r\n    let _ = module.functions.append(fun, Default::default());\r\n    // analyse the module\r\n    let info = crate::valid::Validator::new(ValidationFlags::empty(), Capabilities::empty())\r\n        .validate(&module)\r\n        .unwrap();\r\n    // process the module\r\n    let mut writer = Writer::new(String::new());\r\n    writer\r\n        .write(&module, &info, &Default::default(), &Default::default())\r\n        .unwrap();\r\n\r\n    {\r\n        // check expression stack\r\n        let mut addresses = usize::MAX..0usize;\r\n        for pointer in writer.put_expression_stack_pointers {\r\n            addresses.start = addresses.start.min(pointer as usize);\r\n            addresses.end = addresses.end.max(pointer as usize);\r\n        }\r\n        let stack_size = addresses.end - addresses.start;\r\n        // check the size (in debug only)\r\n        // last observed macOS value: 20528 (CI)\r\n        if !(11000..=25000).contains(&stack_size) {\r\n            panic!(\"`put_expression` stack size {} has changed!\", stack_size);\r\n        }\r\n    }\r\n\r\n    {\r\n        // check block stack\r\n        let mut addresses = usize::MAX..0usize;\r\n        for pointer in writer.put_block_stack_pointers {\r\n            addresses.start = addresses.start.min(pointer as usize);\r\n            addresses.end = addresses.end.max(pointer as usize);\r\n        }\r\n        let stack_size = addresses.end - addresses.start;\r\n        // check the size (in debug only)\r\n        // last observed macOS value: 19152 (CI)\r\n        if !(9500..=20000).contains(&stack_size) {\r\n            panic!(\"`put_block` stack size {} has changed!\", stack_size);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/block.rs",
    "content": "/*!\r\nImplementations for `BlockContext` methods.\r\n*/\r\n\r\nuse super::{\r\n    index::BoundsCheckResult, make_local, selection::Selection, Block, BlockContext, Dimension,\r\n    Error, Instruction, LocalType, LookupType, LoopContext, ResultMember, Writer, WriterFlags,\r\n};\r\nuse crate::{arena::Handle, proc::TypeResolution};\r\nuse spirv::Word;\r\n\r\nfn get_dimension(type_inner: &crate::TypeInner) -> Dimension {\r\n    match *type_inner {\r\n        crate::TypeInner::Scalar { .. } => Dimension::Scalar,\r\n        crate::TypeInner::Vector { .. } => Dimension::Vector,\r\n        crate::TypeInner::Matrix { .. } => Dimension::Matrix,\r\n        _ => unreachable!(),\r\n    }\r\n}\r\n\r\n/// The results of emitting code for a left-hand-side expression.\r\n///\r\n/// On success, `write_expression_pointer` returns one of these.\r\nenum ExpressionPointer {\r\n    /// The pointer to the expression's value is available, as the value of the\r\n    /// expression with the given id.\r\n    Ready { pointer_id: Word },\r\n\r\n    /// The access expression must be conditional on the value of `condition`, a boolean\r\n    /// expression that is true if all indices are in bounds. If `condition` is true, then\r\n    /// `access` is an `OpAccessChain` instruction that will compute a pointer to the\r\n    /// expression's value. If `condition` is false, then executing `access` would be\r\n    /// undefined behavior.\r\n    Conditional {\r\n        condition: Word,\r\n        access: Instruction,\r\n    },\r\n}\r\n\r\n/// The termination statement to be added to the end of the block\r\npub enum BlockExit {\r\n    /// Generates an OpReturn (void return)\r\n    Return,\r\n    /// Generates an OpBranch to the specified block\r\n    Branch {\r\n        /// The branch target block\r\n        target: Word,\r\n    },\r\n    /// Translates a loop `break if` into an `OpBranchConditional` to the\r\n    /// merge block if true (the merge block is passed through [`LoopContext::break_id`]\r\n    /// or else to the loop header (passed through [`preamble_id`])\r\n    ///\r\n    /// [`preamble_id`]: Self::BreakIf::preamble_id\r\n    BreakIf {\r\n        /// The condition of the `break if`\r\n        condition: Handle<crate::Expression>,\r\n        /// The loop header block id\r\n        preamble_id: Word,\r\n    },\r\n}\r\n\r\nimpl Writer {\r\n    // Flip Y coordinate to adjust for coordinate space difference\r\n    // between SPIR-V and our IR.\r\n    // The `position_id` argument is a pointer to a `vecN<f32>`,\r\n    // whose `y` component we will negate.\r\n    fn write_epilogue_position_y_flip(\r\n        &mut self,\r\n        position_id: Word,\r\n        body: &mut Vec<Instruction>,\r\n    ) -> Result<(), Error> {\r\n        let float_ptr_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Float,\r\n            width: 4,\r\n            pointer_space: Some(spirv::StorageClass::Output),\r\n        }));\r\n        let index_y_id = self.get_index_constant(1);\r\n        let access_id = self.id_gen.next();\r\n        body.push(Instruction::access_chain(\r\n            float_ptr_type_id,\r\n            access_id,\r\n            position_id,\r\n            &[index_y_id],\r\n        ));\r\n\r\n        let float_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Float,\r\n            width: 4,\r\n            pointer_space: None,\r\n        }));\r\n        let load_id = self.id_gen.next();\r\n        body.push(Instruction::load(float_type_id, load_id, access_id, None));\r\n\r\n        let neg_id = self.id_gen.next();\r\n        body.push(Instruction::unary(\r\n            spirv::Op::FNegate,\r\n            float_type_id,\r\n            neg_id,\r\n            load_id,\r\n        ));\r\n\r\n        body.push(Instruction::store(access_id, neg_id, None));\r\n        Ok(())\r\n    }\r\n\r\n    // Clamp fragment depth between 0 and 1.\r\n    fn write_epilogue_frag_depth_clamp(\r\n        &mut self,\r\n        frag_depth_id: Word,\r\n        body: &mut Vec<Instruction>,\r\n    ) -> Result<(), Error> {\r\n        let float_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Float,\r\n            width: 4,\r\n            pointer_space: None,\r\n        }));\r\n        let value0_id = self.get_constant_scalar(crate::ScalarValue::Float(0.0), 4);\r\n        let value1_id = self.get_constant_scalar(crate::ScalarValue::Float(1.0), 4);\r\n\r\n        let original_id = self.id_gen.next();\r\n        body.push(Instruction::load(\r\n            float_type_id,\r\n            original_id,\r\n            frag_depth_id,\r\n            None,\r\n        ));\r\n\r\n        let clamp_id = self.id_gen.next();\r\n        body.push(Instruction::ext_inst(\r\n            self.gl450_ext_inst_id,\r\n            spirv::GLOp::FClamp,\r\n            float_type_id,\r\n            clamp_id,\r\n            &[original_id, value0_id, value1_id],\r\n        ));\r\n\r\n        body.push(Instruction::store(frag_depth_id, clamp_id, None));\r\n        Ok(())\r\n    }\r\n\r\n    fn write_entry_point_return(\r\n        &mut self,\r\n        value_id: Word,\r\n        ir_result: &crate::FunctionResult,\r\n        result_members: &[ResultMember],\r\n        body: &mut Vec<Instruction>,\r\n    ) -> Result<(), Error> {\r\n        for (index, res_member) in result_members.iter().enumerate() {\r\n            let member_value_id = match ir_result.binding {\r\n                Some(_) => value_id,\r\n                None => {\r\n                    let member_value_id = self.id_gen.next();\r\n                    body.push(Instruction::composite_extract(\r\n                        res_member.type_id,\r\n                        member_value_id,\r\n                        value_id,\r\n                        &[index as u32],\r\n                    ));\r\n                    member_value_id\r\n                }\r\n            };\r\n\r\n            body.push(Instruction::store(res_member.id, member_value_id, None));\r\n\r\n            match res_member.built_in {\r\n                Some(crate::BuiltIn::Position { .. })\r\n                    if self.flags.contains(WriterFlags::ADJUST_COORDINATE_SPACE) =>\r\n                {\r\n                    self.write_epilogue_position_y_flip(res_member.id, body)?;\r\n                }\r\n                Some(crate::BuiltIn::FragDepth)\r\n                    if self.flags.contains(WriterFlags::CLAMP_FRAG_DEPTH) =>\r\n                {\r\n                    self.write_epilogue_frag_depth_clamp(res_member.id, body)?;\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n\r\nimpl<'w> BlockContext<'w> {\r\n    /// Decide whether to put off emitting instructions for `expr_handle`.\r\n    ///\r\n    /// We would like to gather together chains of `Access` and `AccessIndex`\r\n    /// Naga expressions into a single `OpAccessChain` SPIR-V instruction. To do\r\n    /// this, we don't generate instructions for these exprs when we first\r\n    /// encounter them. Their ids in `self.writer.cached.ids` are left as zero. Then,\r\n    /// once we encounter a `Load` or `Store` expression that actually needs the\r\n    /// chain's value, we call `write_expression_pointer` to handle the whole\r\n    /// thing in one fell swoop.\r\n    fn is_intermediate(&self, expr_handle: Handle<crate::Expression>) -> bool {\r\n        match self.ir_function.expressions[expr_handle] {\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                let ty = self.ir_module.global_variables[handle].ty;\r\n                match self.ir_module.types[ty].inner {\r\n                    crate::TypeInner::BindingArray { .. } => false,\r\n                    _ => true,\r\n                }\r\n            }\r\n            crate::Expression::LocalVariable(_) => true,\r\n            crate::Expression::FunctionArgument(index) => {\r\n                let arg = &self.ir_function.arguments[index as usize];\r\n                self.ir_module.types[arg.ty].inner.pointer_space().is_some()\r\n            }\r\n\r\n            // The chain rule: if this `Access...`'s `base` operand was\r\n            // previously omitted, then omit this one, too.\r\n            _ => self.cached.ids[expr_handle.index()] == 0,\r\n        }\r\n    }\r\n\r\n    /// Cache an expression for a value.\r\n    pub(super) fn cache_expression_value(\r\n        &mut self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<(), Error> {\r\n        let result_type_id = self.get_expression_type_id(&self.fun_info[expr_handle].ty);\r\n\r\n        let id = match self.ir_function.expressions[expr_handle] {\r\n            crate::Expression::Access { base, index: _ } if self.is_intermediate(base) => {\r\n                // See `is_intermediate`; we'll handle this later in\r\n                // `write_expression_pointer`.\r\n                0\r\n            }\r\n            crate::Expression::Access { base, index } => {\r\n                let base_ty_inner = self.fun_info[base].ty.inner_with(&self.ir_module.types);\r\n                match *base_ty_inner {\r\n                    crate::TypeInner::Vector { .. } => {\r\n                        self.write_vector_access(expr_handle, base, index, block)?\r\n                    }\r\n                    crate::TypeInner::BindingArray {\r\n                        base: binding_type, ..\r\n                    } => {\r\n                        let binding_array_false_pointer = LookupType::Local(LocalType::Pointer {\r\n                            base: binding_type,\r\n                            class: spirv::StorageClass::UniformConstant,\r\n                        });\r\n\r\n                        let result_id = match self.write_expression_pointer(\r\n                            expr_handle,\r\n                            block,\r\n                            Some(binding_array_false_pointer),\r\n                        )? {\r\n                            ExpressionPointer::Ready { pointer_id } => pointer_id,\r\n                            ExpressionPointer::Conditional { .. } => {\r\n                                return Err(Error::FeatureNotImplemented(\r\n                                    \"Texture array out-of-bounds handling\",\r\n                                ));\r\n                            }\r\n                        };\r\n\r\n                        let binding_type_id = self.get_type_id(LookupType::Handle(binding_type));\r\n\r\n                        let load_id = self.gen_id();\r\n                        block.body.push(Instruction::load(\r\n                            binding_type_id,\r\n                            load_id,\r\n                            result_id,\r\n                            None,\r\n                        ));\r\n\r\n                        if self.fun_info[index].uniformity.non_uniform_result.is_some() {\r\n                            self.writer.require_any(\r\n                                \"NonUniformEXT\",\r\n                                &[spirv::Capability::ShaderNonUniform],\r\n                            )?;\r\n                            self.writer.use_extension(\"SPV_EXT_descriptor_indexing\");\r\n                            self.writer\r\n                                .decorate(load_id, spirv::Decoration::NonUniform, &[]);\r\n                        }\r\n                        load_id\r\n                    }\r\n                    ref other => {\r\n                        log::error!(\r\n                            \"Unable to access base {:?} of type {:?}\",\r\n                            self.ir_function.expressions[base],\r\n                            other\r\n                        );\r\n                        return Err(Error::Validation(\r\n                            \"only vectors may be dynamically indexed by value\",\r\n                        ));\r\n                    }\r\n                }\r\n            }\r\n            crate::Expression::AccessIndex { base, index: _ } if self.is_intermediate(base) => {\r\n                // See `is_intermediate`; we'll handle this later in\r\n                // `write_expression_pointer`.\r\n                0\r\n            }\r\n            crate::Expression::AccessIndex { base, index } => {\r\n                match *self.fun_info[base].ty.inner_with(&self.ir_module.types) {\r\n                    crate::TypeInner::Vector { .. }\r\n                    | crate::TypeInner::Matrix { .. }\r\n                    | crate::TypeInner::Array { .. }\r\n                    | crate::TypeInner::Struct { .. } => {\r\n                        // We never need bounds checks here: dynamically sized arrays can\r\n                        // only appear behind pointers, and are thus handled by the\r\n                        // `is_intermediate` case above. Everything else's size is\r\n                        // statically known and checked in validation.\r\n                        let id = self.gen_id();\r\n                        let base_id = self.cached[base];\r\n                        block.body.push(Instruction::composite_extract(\r\n                            result_type_id,\r\n                            id,\r\n                            base_id,\r\n                            &[index],\r\n                        ));\r\n                        id\r\n                    }\r\n                    crate::TypeInner::BindingArray {\r\n                        base: binding_type, ..\r\n                    } => {\r\n                        let binding_array_false_pointer = LookupType::Local(LocalType::Pointer {\r\n                            base: binding_type,\r\n                            class: spirv::StorageClass::UniformConstant,\r\n                        });\r\n\r\n                        let result_id = match self.write_expression_pointer(\r\n                            expr_handle,\r\n                            block,\r\n                            Some(binding_array_false_pointer),\r\n                        )? {\r\n                            ExpressionPointer::Ready { pointer_id } => pointer_id,\r\n                            ExpressionPointer::Conditional { .. } => {\r\n                                return Err(Error::FeatureNotImplemented(\r\n                                    \"Texture array out-of-bounds handling\",\r\n                                ));\r\n                            }\r\n                        };\r\n\r\n                        let binding_type_id = self.get_type_id(LookupType::Handle(binding_type));\r\n\r\n                        let load_id = self.gen_id();\r\n                        block.body.push(Instruction::load(\r\n                            binding_type_id,\r\n                            load_id,\r\n                            result_id,\r\n                            None,\r\n                        ));\r\n\r\n                        load_id\r\n                    }\r\n                    ref other => {\r\n                        log::error!(\"Unable to access index of {:?}\", other);\r\n                        return Err(Error::FeatureNotImplemented(\"access index for type\"));\r\n                    }\r\n                }\r\n            }\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                self.writer.global_variables[handle.index()].access_id\r\n            }\r\n            crate::Expression::Constant(handle) => self.writer.constant_ids[handle.index()],\r\n            crate::Expression::Splat { size, value } => {\r\n                let value_id = self.cached[value];\r\n                let components = [value_id; 4];\r\n                let id = self.gen_id();\r\n                block.body.push(Instruction::composite_construct(\r\n                    result_type_id,\r\n                    id,\r\n                    &components[..size as usize],\r\n                ));\r\n                id\r\n            }\r\n            crate::Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                let vector_id = self.cached[vector];\r\n                self.temp_list.clear();\r\n                for &sc in pattern[..size as usize].iter() {\r\n                    self.temp_list.push(sc as Word);\r\n                }\r\n                let id = self.gen_id();\r\n                block.body.push(Instruction::vector_shuffle(\r\n                    result_type_id,\r\n                    id,\r\n                    vector_id,\r\n                    vector_id,\r\n                    &self.temp_list,\r\n                ));\r\n                id\r\n            }\r\n            crate::Expression::Compose {\r\n                ty: _,\r\n                ref components,\r\n            } => {\r\n                self.temp_list.clear();\r\n                for &component in components {\r\n                    self.temp_list.push(self.cached[component]);\r\n                }\r\n\r\n                let id = self.gen_id();\r\n                block.body.push(Instruction::composite_construct(\r\n                    result_type_id,\r\n                    id,\r\n                    &self.temp_list,\r\n                ));\r\n                id\r\n            }\r\n            crate::Expression::Unary { op, expr } => {\r\n                let id = self.gen_id();\r\n                let expr_id = self.cached[expr];\r\n                let expr_ty_inner = self.fun_info[expr].ty.inner_with(&self.ir_module.types);\r\n\r\n                let spirv_op = match op {\r\n                    crate::UnaryOperator::Negate => match expr_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FNegate,\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SNegate,\r\n                        Some(crate::ScalarKind::Bool) => spirv::Op::LogicalNot,\r\n                        Some(crate::ScalarKind::Uint) | None => {\r\n                            log::error!(\"Unable to negate {:?}\", expr_ty_inner);\r\n                            return Err(Error::FeatureNotImplemented(\"negation\"));\r\n                        }\r\n                    },\r\n                    crate::UnaryOperator::Not => match expr_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Bool) => spirv::Op::LogicalNot,\r\n                        _ => spirv::Op::Not,\r\n                    },\r\n                };\r\n\r\n                block\r\n                    .body\r\n                    .push(Instruction::unary(spirv_op, result_type_id, id, expr_id));\r\n                id\r\n            }\r\n            crate::Expression::Binary { op, left, right } => {\r\n                let id = self.gen_id();\r\n                let left_id = self.cached[left];\r\n                let right_id = self.cached[right];\r\n\r\n                let left_ty_inner = self.fun_info[left].ty.inner_with(&self.ir_module.types);\r\n                let right_ty_inner = self.fun_info[right].ty.inner_with(&self.ir_module.types);\r\n\r\n                let left_dimension = get_dimension(left_ty_inner);\r\n                let right_dimension = get_dimension(right_ty_inner);\r\n\r\n                let mut reverse_operands = false;\r\n\r\n                let spirv_op = match op {\r\n                    crate::BinaryOperator::Add => match *left_ty_inner {\r\n                        crate::TypeInner::Scalar { kind, .. }\r\n                        | crate::TypeInner::Vector { kind, .. } => match kind {\r\n                            crate::ScalarKind::Float => spirv::Op::FAdd,\r\n                            _ => spirv::Op::IAdd,\r\n                        },\r\n                        crate::TypeInner::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        } => {\r\n                            self.write_matrix_matrix_column_op(\r\n                                block,\r\n                                id,\r\n                                result_type_id,\r\n                                left_id,\r\n                                right_id,\r\n                                columns,\r\n                                rows,\r\n                                width,\r\n                                spirv::Op::FAdd,\r\n                            );\r\n\r\n                            self.cached[expr_handle] = id;\r\n                            return Ok(());\r\n                        }\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::Subtract => match *left_ty_inner {\r\n                        crate::TypeInner::Scalar { kind, .. }\r\n                        | crate::TypeInner::Vector { kind, .. } => match kind {\r\n                            crate::ScalarKind::Float => spirv::Op::FSub,\r\n                            _ => spirv::Op::ISub,\r\n                        },\r\n                        crate::TypeInner::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        } => {\r\n                            self.write_matrix_matrix_column_op(\r\n                                block,\r\n                                id,\r\n                                result_type_id,\r\n                                left_id,\r\n                                right_id,\r\n                                columns,\r\n                                rows,\r\n                                width,\r\n                                spirv::Op::FSub,\r\n                            );\r\n\r\n                            self.cached[expr_handle] = id;\r\n                            return Ok(());\r\n                        }\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::Multiply => match (left_dimension, right_dimension) {\r\n                        (Dimension::Scalar, Dimension::Vector) => {\r\n                            self.write_vector_scalar_mult(\r\n                                block,\r\n                                id,\r\n                                result_type_id,\r\n                                right_id,\r\n                                left_id,\r\n                                right_ty_inner,\r\n                            );\r\n\r\n                            self.cached[expr_handle] = id;\r\n                            return Ok(());\r\n                        }\r\n                        (Dimension::Vector, Dimension::Scalar) => {\r\n                            self.write_vector_scalar_mult(\r\n                                block,\r\n                                id,\r\n                                result_type_id,\r\n                                left_id,\r\n                                right_id,\r\n                                left_ty_inner,\r\n                            );\r\n\r\n                            self.cached[expr_handle] = id;\r\n                            return Ok(());\r\n                        }\r\n                        (Dimension::Vector, Dimension::Matrix) => spirv::Op::VectorTimesMatrix,\r\n                        (Dimension::Matrix, Dimension::Scalar) => spirv::Op::MatrixTimesScalar,\r\n                        (Dimension::Scalar, Dimension::Matrix) => {\r\n                            reverse_operands = true;\r\n                            spirv::Op::MatrixTimesScalar\r\n                        }\r\n                        (Dimension::Matrix, Dimension::Vector) => spirv::Op::MatrixTimesVector,\r\n                        (Dimension::Matrix, Dimension::Matrix) => spirv::Op::MatrixTimesMatrix,\r\n                        (Dimension::Vector, Dimension::Vector)\r\n                        | (Dimension::Scalar, Dimension::Scalar)\r\n                            if left_ty_inner.scalar_kind() == Some(crate::ScalarKind::Float) =>\r\n                        {\r\n                            spirv::Op::FMul\r\n                        }\r\n                        (Dimension::Vector, Dimension::Vector)\r\n                        | (Dimension::Scalar, Dimension::Scalar) => spirv::Op::IMul,\r\n                    },\r\n                    crate::BinaryOperator::Divide => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SDiv,\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::UDiv,\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FDiv,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::Modulo => match left_ty_inner.scalar_kind() {\r\n                        // TODO: handle undefined behavior\r\n                        // if right == 0 return 0\r\n                        // if left == min(type_of(left)) && right == -1 return 0\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SRem,\r\n                        // TODO: handle undefined behavior\r\n                        // if right == 0 return 0\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::UMod,\r\n                        // TODO: handle undefined behavior\r\n                        // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FRem,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::Equal => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint | crate::ScalarKind::Uint) => {\r\n                            spirv::Op::IEqual\r\n                        }\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FOrdEqual,\r\n                        Some(crate::ScalarKind::Bool) => spirv::Op::LogicalEqual,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::NotEqual => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint | crate::ScalarKind::Uint) => {\r\n                            spirv::Op::INotEqual\r\n                        }\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FOrdNotEqual,\r\n                        Some(crate::ScalarKind::Bool) => spirv::Op::LogicalNotEqual,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::Less => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SLessThan,\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::ULessThan,\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FOrdLessThan,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::LessEqual => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SLessThanEqual,\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::ULessThanEqual,\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FOrdLessThanEqual,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::Greater => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SGreaterThan,\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::UGreaterThan,\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FOrdGreaterThan,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::GreaterEqual => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::SGreaterThanEqual,\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::UGreaterThanEqual,\r\n                        Some(crate::ScalarKind::Float) => spirv::Op::FOrdGreaterThanEqual,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                    crate::BinaryOperator::And => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Bool) => spirv::Op::LogicalAnd,\r\n                        _ => spirv::Op::BitwiseAnd,\r\n                    },\r\n                    crate::BinaryOperator::ExclusiveOr => spirv::Op::BitwiseXor,\r\n                    crate::BinaryOperator::InclusiveOr => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Bool) => spirv::Op::LogicalOr,\r\n                        _ => spirv::Op::BitwiseOr,\r\n                    },\r\n                    crate::BinaryOperator::LogicalAnd => spirv::Op::LogicalAnd,\r\n                    crate::BinaryOperator::LogicalOr => spirv::Op::LogicalOr,\r\n                    crate::BinaryOperator::ShiftLeft => spirv::Op::ShiftLeftLogical,\r\n                    crate::BinaryOperator::ShiftRight => match left_ty_inner.scalar_kind() {\r\n                        Some(crate::ScalarKind::Sint) => spirv::Op::ShiftRightArithmetic,\r\n                        Some(crate::ScalarKind::Uint) => spirv::Op::ShiftRightLogical,\r\n                        _ => unimplemented!(),\r\n                    },\r\n                };\r\n\r\n                block.body.push(Instruction::binary(\r\n                    spirv_op,\r\n                    result_type_id,\r\n                    id,\r\n                    if reverse_operands { right_id } else { left_id },\r\n                    if reverse_operands { left_id } else { right_id },\r\n                ));\r\n                id\r\n            }\r\n            crate::Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n                enum MathOp {\r\n                    Ext(spirv::GLOp),\r\n                    Custom(Instruction),\r\n                }\r\n\r\n                let arg0_id = self.cached[arg];\r\n                let arg_ty = self.fun_info[arg].ty.inner_with(&self.ir_module.types);\r\n                let arg_scalar_kind = arg_ty.scalar_kind();\r\n                let arg1_id = match arg1 {\r\n                    Some(handle) => self.cached[handle],\r\n                    None => 0,\r\n                };\r\n                let arg2_id = match arg2 {\r\n                    Some(handle) => self.cached[handle],\r\n                    None => 0,\r\n                };\r\n                let arg3_id = match arg3 {\r\n                    Some(handle) => self.cached[handle],\r\n                    None => 0,\r\n                };\r\n\r\n                let id = self.gen_id();\r\n                let math_op = match fun {\r\n                    // comparison\r\n                    Mf::Abs => {\r\n                        match arg_scalar_kind {\r\n                            Some(crate::ScalarKind::Float) => MathOp::Ext(spirv::GLOp::FAbs),\r\n                            Some(crate::ScalarKind::Sint) => MathOp::Ext(spirv::GLOp::SAbs),\r\n                            Some(crate::ScalarKind::Uint) => {\r\n                                MathOp::Custom(Instruction::unary(\r\n                                    spirv::Op::CopyObject, // do nothing\r\n                                    result_type_id,\r\n                                    id,\r\n                                    arg0_id,\r\n                                ))\r\n                            }\r\n                            other => unimplemented!(\"Unexpected abs({:?})\", other),\r\n                        }\r\n                    }\r\n                    Mf::Min => MathOp::Ext(match arg_scalar_kind {\r\n                        Some(crate::ScalarKind::Float) => spirv::GLOp::FMin,\r\n                        Some(crate::ScalarKind::Sint) => spirv::GLOp::SMin,\r\n                        Some(crate::ScalarKind::Uint) => spirv::GLOp::UMin,\r\n                        other => unimplemented!(\"Unexpected min({:?})\", other),\r\n                    }),\r\n                    Mf::Max => MathOp::Ext(match arg_scalar_kind {\r\n                        Some(crate::ScalarKind::Float) => spirv::GLOp::FMax,\r\n                        Some(crate::ScalarKind::Sint) => spirv::GLOp::SMax,\r\n                        Some(crate::ScalarKind::Uint) => spirv::GLOp::UMax,\r\n                        other => unimplemented!(\"Unexpected max({:?})\", other),\r\n                    }),\r\n                    Mf::Clamp => MathOp::Ext(match arg_scalar_kind {\r\n                        Some(crate::ScalarKind::Float) => spirv::GLOp::FClamp,\r\n                        Some(crate::ScalarKind::Sint) => spirv::GLOp::SClamp,\r\n                        Some(crate::ScalarKind::Uint) => spirv::GLOp::UClamp,\r\n                        other => unimplemented!(\"Unexpected max({:?})\", other),\r\n                    }),\r\n                    Mf::Saturate => {\r\n                        let (maybe_size, width) = match *arg_ty {\r\n                            crate::TypeInner::Vector { size, width, .. } => (Some(size), width),\r\n                            crate::TypeInner::Scalar { width, .. } => (None, width),\r\n                            ref other => unimplemented!(\"Unexpected saturate({:?})\", other),\r\n                        };\r\n\r\n                        let mut arg1_id = self\r\n                            .writer\r\n                            .get_constant_scalar(crate::ScalarValue::Float(0.0), width);\r\n                        let mut arg2_id = self\r\n                            .writer\r\n                            .get_constant_scalar(crate::ScalarValue::Float(1.0), width);\r\n\r\n                        if let Some(size) = maybe_size {\r\n                            let value = LocalType::Value {\r\n                                vector_size: Some(size),\r\n                                kind: crate::ScalarKind::Float,\r\n                                width,\r\n                                pointer_space: None,\r\n                            };\r\n\r\n                            let result_type_id = self.get_type_id(LookupType::Local(value));\r\n\r\n                            self.temp_list.clear();\r\n                            self.temp_list.resize(size as _, arg1_id);\r\n\r\n                            let id = self.gen_id();\r\n                            block.body.push(Instruction::composite_construct(\r\n                                result_type_id,\r\n                                id,\r\n                                &self.temp_list,\r\n                            ));\r\n                            arg1_id = id;\r\n\r\n                            self.temp_list.clear();\r\n                            self.temp_list.resize(size as _, arg2_id);\r\n\r\n                            let id = self.gen_id();\r\n                            block.body.push(Instruction::composite_construct(\r\n                                result_type_id,\r\n                                id,\r\n                                &self.temp_list,\r\n                            ));\r\n                            arg2_id = id;\r\n                        }\r\n\r\n                        MathOp::Custom(Instruction::ext_inst(\r\n                            self.writer.gl450_ext_inst_id,\r\n                            spirv::GLOp::FClamp,\r\n                            result_type_id,\r\n                            id,\r\n                            &[arg0_id, arg1_id, arg2_id],\r\n                        ))\r\n                    }\r\n                    // trigonometry\r\n                    Mf::Sin => MathOp::Ext(spirv::GLOp::Sin),\r\n                    Mf::Sinh => MathOp::Ext(spirv::GLOp::Sinh),\r\n                    Mf::Asin => MathOp::Ext(spirv::GLOp::Asin),\r\n                    Mf::Cos => MathOp::Ext(spirv::GLOp::Cos),\r\n                    Mf::Cosh => MathOp::Ext(spirv::GLOp::Cosh),\r\n                    Mf::Acos => MathOp::Ext(spirv::GLOp::Acos),\r\n                    Mf::Tan => MathOp::Ext(spirv::GLOp::Tan),\r\n                    Mf::Tanh => MathOp::Ext(spirv::GLOp::Tanh),\r\n                    Mf::Atan => MathOp::Ext(spirv::GLOp::Atan),\r\n                    Mf::Atan2 => MathOp::Ext(spirv::GLOp::Atan2),\r\n                    Mf::Asinh => MathOp::Ext(spirv::GLOp::Asinh),\r\n                    Mf::Acosh => MathOp::Ext(spirv::GLOp::Acosh),\r\n                    Mf::Atanh => MathOp::Ext(spirv::GLOp::Atanh),\r\n                    Mf::Radians => MathOp::Ext(spirv::GLOp::Radians),\r\n                    Mf::Degrees => MathOp::Ext(spirv::GLOp::Degrees),\r\n                    // decomposition\r\n                    Mf::Ceil => MathOp::Ext(spirv::GLOp::Ceil),\r\n                    Mf::Round => MathOp::Ext(spirv::GLOp::RoundEven),\r\n                    Mf::Floor => MathOp::Ext(spirv::GLOp::Floor),\r\n                    Mf::Fract => MathOp::Ext(spirv::GLOp::Fract),\r\n                    Mf::Trunc => MathOp::Ext(spirv::GLOp::Trunc),\r\n                    Mf::Modf => MathOp::Ext(spirv::GLOp::Modf),\r\n                    Mf::Frexp => MathOp::Ext(spirv::GLOp::Frexp),\r\n                    Mf::Ldexp => MathOp::Ext(spirv::GLOp::Ldexp),\r\n                    // geometry\r\n                    Mf::Dot => match *self.fun_info[arg].ty.inner_with(&self.ir_module.types) {\r\n                        crate::TypeInner::Vector {\r\n                            kind: crate::ScalarKind::Float,\r\n                            ..\r\n                        } => MathOp::Custom(Instruction::binary(\r\n                            spirv::Op::Dot,\r\n                            result_type_id,\r\n                            id,\r\n                            arg0_id,\r\n                            arg1_id,\r\n                        )),\r\n                        // TODO: consider using integer dot product if VK_KHR_shader_integer_dot_product is available\r\n                        crate::TypeInner::Vector { size, .. } => {\r\n                            self.write_dot_product(\r\n                                id,\r\n                                result_type_id,\r\n                                arg0_id,\r\n                                arg1_id,\r\n                                size as u32,\r\n                                block,\r\n                            );\r\n                            self.cached[expr_handle] = id;\r\n                            return Ok(());\r\n                        }\r\n                        _ => unreachable!(\r\n                            \"Correct TypeInner for dot product should be already validated\"\r\n                        ),\r\n                    },\r\n                    Mf::Outer => MathOp::Custom(Instruction::binary(\r\n                        spirv::Op::OuterProduct,\r\n                        result_type_id,\r\n                        id,\r\n                        arg0_id,\r\n                        arg1_id,\r\n                    )),\r\n                    Mf::Cross => MathOp::Ext(spirv::GLOp::Cross),\r\n                    Mf::Distance => MathOp::Ext(spirv::GLOp::Distance),\r\n                    Mf::Length => MathOp::Ext(spirv::GLOp::Length),\r\n                    Mf::Normalize => MathOp::Ext(spirv::GLOp::Normalize),\r\n                    Mf::FaceForward => MathOp::Ext(spirv::GLOp::FaceForward),\r\n                    Mf::Reflect => MathOp::Ext(spirv::GLOp::Reflect),\r\n                    Mf::Refract => MathOp::Ext(spirv::GLOp::Refract),\r\n                    // exponent\r\n                    Mf::Exp => MathOp::Ext(spirv::GLOp::Exp),\r\n                    Mf::Exp2 => MathOp::Ext(spirv::GLOp::Exp2),\r\n                    Mf::Log => MathOp::Ext(spirv::GLOp::Log),\r\n                    Mf::Log2 => MathOp::Ext(spirv::GLOp::Log2),\r\n                    Mf::Pow => MathOp::Ext(spirv::GLOp::Pow),\r\n                    // computational\r\n                    Mf::Sign => MathOp::Ext(match arg_scalar_kind {\r\n                        Some(crate::ScalarKind::Float) => spirv::GLOp::FSign,\r\n                        Some(crate::ScalarKind::Sint) => spirv::GLOp::SSign,\r\n                        other => unimplemented!(\"Unexpected sign({:?})\", other),\r\n                    }),\r\n                    Mf::Fma => MathOp::Ext(spirv::GLOp::Fma),\r\n                    Mf::Mix => {\r\n                        let selector = arg2.unwrap();\r\n                        let selector_ty =\r\n                            self.fun_info[selector].ty.inner_with(&self.ir_module.types);\r\n                        match (arg_ty, selector_ty) {\r\n                            // if the selector is a scalar, we need to splat it\r\n                            (\r\n                                &crate::TypeInner::Vector { size, .. },\r\n                                &crate::TypeInner::Scalar { kind, width },\r\n                            ) => {\r\n                                let selector_type_id =\r\n                                    self.get_type_id(LookupType::Local(LocalType::Value {\r\n                                        vector_size: Some(size),\r\n                                        kind,\r\n                                        width,\r\n                                        pointer_space: None,\r\n                                    }));\r\n                                self.temp_list.clear();\r\n                                self.temp_list.resize(size as usize, arg2_id);\r\n\r\n                                let selector_id = self.gen_id();\r\n                                block.body.push(Instruction::composite_construct(\r\n                                    selector_type_id,\r\n                                    selector_id,\r\n                                    &self.temp_list,\r\n                                ));\r\n\r\n                                MathOp::Custom(Instruction::ext_inst(\r\n                                    self.writer.gl450_ext_inst_id,\r\n                                    spirv::GLOp::FMix,\r\n                                    result_type_id,\r\n                                    id,\r\n                                    &[arg0_id, arg1_id, selector_id],\r\n                                ))\r\n                            }\r\n                            _ => MathOp::Ext(spirv::GLOp::FMix),\r\n                        }\r\n                    }\r\n                    Mf::Step => MathOp::Ext(spirv::GLOp::Step),\r\n                    Mf::SmoothStep => MathOp::Ext(spirv::GLOp::SmoothStep),\r\n                    Mf::Sqrt => MathOp::Ext(spirv::GLOp::Sqrt),\r\n                    Mf::InverseSqrt => MathOp::Ext(spirv::GLOp::InverseSqrt),\r\n                    Mf::Inverse => MathOp::Ext(spirv::GLOp::MatrixInverse),\r\n                    Mf::Transpose => MathOp::Custom(Instruction::unary(\r\n                        spirv::Op::Transpose,\r\n                        result_type_id,\r\n                        id,\r\n                        arg0_id,\r\n                    )),\r\n                    Mf::Determinant => MathOp::Ext(spirv::GLOp::Determinant),\r\n                    Mf::ReverseBits => MathOp::Custom(Instruction::unary(\r\n                        spirv::Op::BitReverse,\r\n                        result_type_id,\r\n                        id,\r\n                        arg0_id,\r\n                    )),\r\n                    Mf::CountOneBits => MathOp::Custom(Instruction::unary(\r\n                        spirv::Op::BitCount,\r\n                        result_type_id,\r\n                        id,\r\n                        arg0_id,\r\n                    )),\r\n                    Mf::ExtractBits => {\r\n                        let op = match arg_scalar_kind {\r\n                            Some(crate::ScalarKind::Uint) => spirv::Op::BitFieldUExtract,\r\n                            Some(crate::ScalarKind::Sint) => spirv::Op::BitFieldSExtract,\r\n                            other => unimplemented!(\"Unexpected sign({:?})\", other),\r\n                        };\r\n                        MathOp::Custom(Instruction::ternary(\r\n                            op,\r\n                            result_type_id,\r\n                            id,\r\n                            arg0_id,\r\n                            arg1_id,\r\n                            arg2_id,\r\n                        ))\r\n                    }\r\n                    Mf::InsertBits => MathOp::Custom(Instruction::quaternary(\r\n                        spirv::Op::BitFieldInsert,\r\n                        result_type_id,\r\n                        id,\r\n                        arg0_id,\r\n                        arg1_id,\r\n                        arg2_id,\r\n                        arg3_id,\r\n                    )),\r\n                    Mf::FindLsb => MathOp::Ext(spirv::GLOp::FindILsb),\r\n                    Mf::FindMsb => MathOp::Ext(match arg_scalar_kind {\r\n                        Some(crate::ScalarKind::Uint) => spirv::GLOp::FindUMsb,\r\n                        Some(crate::ScalarKind::Sint) => spirv::GLOp::FindSMsb,\r\n                        other => unimplemented!(\"Unexpected findMSB({:?})\", other),\r\n                    }),\r\n                    Mf::Pack4x8unorm => MathOp::Ext(spirv::GLOp::PackUnorm4x8),\r\n                    Mf::Pack4x8snorm => MathOp::Ext(spirv::GLOp::PackSnorm4x8),\r\n                    Mf::Pack2x16float => MathOp::Ext(spirv::GLOp::PackHalf2x16),\r\n                    Mf::Pack2x16unorm => MathOp::Ext(spirv::GLOp::PackUnorm2x16),\r\n                    Mf::Pack2x16snorm => MathOp::Ext(spirv::GLOp::PackSnorm2x16),\r\n                    Mf::Unpack4x8unorm => MathOp::Ext(spirv::GLOp::UnpackUnorm4x8),\r\n                    Mf::Unpack4x8snorm => MathOp::Ext(spirv::GLOp::UnpackSnorm4x8),\r\n                    Mf::Unpack2x16float => MathOp::Ext(spirv::GLOp::UnpackHalf2x16),\r\n                    Mf::Unpack2x16unorm => MathOp::Ext(spirv::GLOp::UnpackUnorm2x16),\r\n                    Mf::Unpack2x16snorm => MathOp::Ext(spirv::GLOp::UnpackSnorm2x16),\r\n                };\r\n\r\n                block.body.push(match math_op {\r\n                    MathOp::Ext(op) => Instruction::ext_inst(\r\n                        self.writer.gl450_ext_inst_id,\r\n                        op,\r\n                        result_type_id,\r\n                        id,\r\n                        &[arg0_id, arg1_id, arg2_id, arg3_id][..fun.argument_count()],\r\n                    ),\r\n                    MathOp::Custom(inst) => inst,\r\n                });\r\n                id\r\n            }\r\n            crate::Expression::LocalVariable(variable) => self.function.variables[&variable].id,\r\n            crate::Expression::Load { pointer } => {\r\n                match self.write_expression_pointer(pointer, block, None)? {\r\n                    ExpressionPointer::Ready { pointer_id } => {\r\n                        let id = self.gen_id();\r\n                        let atomic_space =\r\n                            match *self.fun_info[pointer].ty.inner_with(&self.ir_module.types) {\r\n                                crate::TypeInner::Pointer { base, space } => {\r\n                                    match self.ir_module.types[base].inner {\r\n                                        crate::TypeInner::Atomic { .. } => Some(space),\r\n                                        _ => None,\r\n                                    }\r\n                                }\r\n                                _ => None,\r\n                            };\r\n                        let instruction = if let Some(space) = atomic_space {\r\n                            let (semantics, scope) = space.to_spirv_semantics_and_scope();\r\n                            let scope_constant_id = self.get_scope_constant(scope as u32);\r\n                            let semantics_id = self.get_index_constant(semantics.bits());\r\n                            Instruction::atomic_load(\r\n                                result_type_id,\r\n                                id,\r\n                                pointer_id,\r\n                                scope_constant_id,\r\n                                semantics_id,\r\n                            )\r\n                        } else {\r\n                            Instruction::load(result_type_id, id, pointer_id, None)\r\n                        };\r\n                        block.body.push(instruction);\r\n                        id\r\n                    }\r\n                    ExpressionPointer::Conditional { condition, access } => {\r\n                        //TODO: support atomics?\r\n                        self.write_conditional_indexed_load(\r\n                            result_type_id,\r\n                            condition,\r\n                            block,\r\n                            move |id_gen, block| {\r\n                                // The in-bounds path. Perform the access and the load.\r\n                                let pointer_id = access.result_id.unwrap();\r\n                                let value_id = id_gen.next();\r\n                                block.body.push(access);\r\n                                block.body.push(Instruction::load(\r\n                                    result_type_id,\r\n                                    value_id,\r\n                                    pointer_id,\r\n                                    None,\r\n                                ));\r\n                                value_id\r\n                            },\r\n                        )\r\n                    }\r\n                }\r\n            }\r\n            crate::Expression::FunctionArgument(index) => self.function.parameter_id(index),\r\n            crate::Expression::CallResult(_) | crate::Expression::AtomicResult { .. } => {\r\n                self.cached[expr_handle]\r\n            }\r\n            crate::Expression::As {\r\n                expr,\r\n                kind,\r\n                convert,\r\n            } => {\r\n                use crate::ScalarKind as Sk;\r\n\r\n                let expr_id = self.cached[expr];\r\n                let (src_kind, src_size, src_width, is_matrix) =\r\n                    match *self.fun_info[expr].ty.inner_with(&self.ir_module.types) {\r\n                        crate::TypeInner::Scalar { kind, width } => (kind, None, width, false),\r\n                        crate::TypeInner::Vector { kind, width, size } => {\r\n                            (kind, Some(size), width, false)\r\n                        }\r\n                        crate::TypeInner::Matrix { width, .. } => (kind, None, width, true),\r\n                        ref other => {\r\n                            log::error!(\"As source {:?}\", other);\r\n                            return Err(Error::Validation(\"Unexpected Expression::As source\"));\r\n                        }\r\n                    };\r\n\r\n                enum Cast {\r\n                    Identity,\r\n                    Unary(spirv::Op),\r\n                    Binary(spirv::Op, Word),\r\n                    Ternary(spirv::Op, Word, Word),\r\n                }\r\n\r\n                let cast = if is_matrix {\r\n                    // we only support identity casts for matrices\r\n                    Cast::Unary(spirv::Op::CopyObject)\r\n                } else {\r\n                    match (src_kind, kind, convert) {\r\n                        // Filter out identity casts. Some Adreno drivers are\r\n                        // confused by no-op OpBitCast instructions.\r\n                        (src_kind, kind, convert)\r\n                            if src_kind == kind && convert.unwrap_or(src_width) == src_width =>\r\n                        {\r\n                            Cast::Identity\r\n                        }\r\n                        (Sk::Bool, Sk::Bool, _) => Cast::Unary(spirv::Op::CopyObject),\r\n                        (_, _, None) => Cast::Unary(spirv::Op::Bitcast),\r\n                        // casting to a bool - generate `OpXxxNotEqual`\r\n                        (_, Sk::Bool, Some(_)) => {\r\n                            let (op, value) = match src_kind {\r\n                                Sk::Sint => (spirv::Op::INotEqual, crate::ScalarValue::Sint(0)),\r\n                                Sk::Uint => (spirv::Op::INotEqual, crate::ScalarValue::Uint(0)),\r\n                                Sk::Float => {\r\n                                    (spirv::Op::FUnordNotEqual, crate::ScalarValue::Float(0.0))\r\n                                }\r\n                                Sk::Bool => unreachable!(),\r\n                            };\r\n                            let zero_scalar_id = self.writer.get_constant_scalar(value, src_width);\r\n                            let zero_id = match src_size {\r\n                                Some(size) => {\r\n                                    let vector_type_id =\r\n                                        self.get_type_id(LookupType::Local(LocalType::Value {\r\n                                            vector_size: Some(size),\r\n                                            kind: src_kind,\r\n                                            width: src_width,\r\n                                            pointer_space: None,\r\n                                        }));\r\n                                    let components = [zero_scalar_id; 4];\r\n\r\n                                    let zero_id = self.gen_id();\r\n                                    block.body.push(Instruction::composite_construct(\r\n                                        vector_type_id,\r\n                                        zero_id,\r\n                                        &components[..size as usize],\r\n                                    ));\r\n                                    zero_id\r\n                                }\r\n                                None => zero_scalar_id,\r\n                            };\r\n\r\n                            Cast::Binary(op, zero_id)\r\n                        }\r\n                        // casting from a bool - generate `OpSelect`\r\n                        (Sk::Bool, _, Some(dst_width)) => {\r\n                            let (val0, val1) = match kind {\r\n                                Sk::Sint => {\r\n                                    (crate::ScalarValue::Sint(0), crate::ScalarValue::Sint(1))\r\n                                }\r\n                                Sk::Uint => {\r\n                                    (crate::ScalarValue::Uint(0), crate::ScalarValue::Uint(1))\r\n                                }\r\n                                Sk::Float => (\r\n                                    crate::ScalarValue::Float(0.0),\r\n                                    crate::ScalarValue::Float(1.0),\r\n                                ),\r\n                                Sk::Bool => unreachable!(),\r\n                            };\r\n                            let scalar0_id = self.writer.get_constant_scalar(val0, dst_width);\r\n                            let scalar1_id = self.writer.get_constant_scalar(val1, dst_width);\r\n                            let (accept_id, reject_id) = match src_size {\r\n                                Some(size) => {\r\n                                    let vector_type_id =\r\n                                        self.get_type_id(LookupType::Local(LocalType::Value {\r\n                                            vector_size: Some(size),\r\n                                            kind,\r\n                                            width: dst_width,\r\n                                            pointer_space: None,\r\n                                        }));\r\n                                    let components0 = [scalar0_id; 4];\r\n                                    let components1 = [scalar1_id; 4];\r\n\r\n                                    let vec0_id = self.gen_id();\r\n                                    block.body.push(Instruction::composite_construct(\r\n                                        vector_type_id,\r\n                                        vec0_id,\r\n                                        &components0[..size as usize],\r\n                                    ));\r\n                                    let vec1_id = self.gen_id();\r\n                                    block.body.push(Instruction::composite_construct(\r\n                                        vector_type_id,\r\n                                        vec1_id,\r\n                                        &components1[..size as usize],\r\n                                    ));\r\n                                    (vec1_id, vec0_id)\r\n                                }\r\n                                None => (scalar1_id, scalar0_id),\r\n                            };\r\n\r\n                            Cast::Ternary(spirv::Op::Select, accept_id, reject_id)\r\n                        }\r\n                        (Sk::Float, Sk::Uint, Some(_)) => Cast::Unary(spirv::Op::ConvertFToU),\r\n                        (Sk::Float, Sk::Sint, Some(_)) => Cast::Unary(spirv::Op::ConvertFToS),\r\n                        (Sk::Float, Sk::Float, Some(dst_width)) if src_width != dst_width => {\r\n                            Cast::Unary(spirv::Op::FConvert)\r\n                        }\r\n                        (Sk::Sint, Sk::Float, Some(_)) => Cast::Unary(spirv::Op::ConvertSToF),\r\n                        (Sk::Sint, Sk::Sint, Some(dst_width)) if src_width != dst_width => {\r\n                            Cast::Unary(spirv::Op::SConvert)\r\n                        }\r\n                        (Sk::Uint, Sk::Float, Some(_)) => Cast::Unary(spirv::Op::ConvertUToF),\r\n                        (Sk::Uint, Sk::Uint, Some(dst_width)) if src_width != dst_width => {\r\n                            Cast::Unary(spirv::Op::UConvert)\r\n                        }\r\n                        // We assume it's either an identity cast, or int-uint.\r\n                        _ => Cast::Unary(spirv::Op::Bitcast),\r\n                    }\r\n                };\r\n\r\n                let id = self.gen_id();\r\n                let instruction = match cast {\r\n                    Cast::Identity => None,\r\n                    Cast::Unary(op) => Some(Instruction::unary(op, result_type_id, id, expr_id)),\r\n                    Cast::Binary(op, operand) => Some(Instruction::binary(\r\n                        op,\r\n                        result_type_id,\r\n                        id,\r\n                        expr_id,\r\n                        operand,\r\n                    )),\r\n                    Cast::Ternary(op, op1, op2) => Some(Instruction::ternary(\r\n                        op,\r\n                        result_type_id,\r\n                        id,\r\n                        expr_id,\r\n                        op1,\r\n                        op2,\r\n                    )),\r\n                };\r\n                if let Some(instruction) = instruction {\r\n                    block.body.push(instruction);\r\n                    id\r\n                } else {\r\n                    expr_id\r\n                }\r\n            }\r\n            crate::Expression::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => self.write_image_load(\r\n                result_type_id,\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                level,\r\n                sample,\r\n                block,\r\n            )?,\r\n            crate::Expression::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n            } => self.write_image_sample(\r\n                result_type_id,\r\n                image,\r\n                sampler,\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n                block,\r\n            )?,\r\n            crate::Expression::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => {\r\n                let id = self.gen_id();\r\n                let mut condition_id = self.cached[condition];\r\n                let accept_id = self.cached[accept];\r\n                let reject_id = self.cached[reject];\r\n\r\n                let condition_ty = self.fun_info[condition]\r\n                    .ty\r\n                    .inner_with(&self.ir_module.types);\r\n                let object_ty = self.fun_info[accept].ty.inner_with(&self.ir_module.types);\r\n\r\n                if let (\r\n                    &crate::TypeInner::Scalar {\r\n                        kind: crate::ScalarKind::Bool,\r\n                        width,\r\n                    },\r\n                    &crate::TypeInner::Vector { size, .. },\r\n                ) = (condition_ty, object_ty)\r\n                {\r\n                    self.temp_list.clear();\r\n                    self.temp_list.resize(size as usize, condition_id);\r\n\r\n                    let bool_vector_type_id =\r\n                        self.get_type_id(LookupType::Local(LocalType::Value {\r\n                            vector_size: Some(size),\r\n                            kind: crate::ScalarKind::Bool,\r\n                            width,\r\n                            pointer_space: None,\r\n                        }));\r\n\r\n                    let id = self.gen_id();\r\n                    block.body.push(Instruction::composite_construct(\r\n                        bool_vector_type_id,\r\n                        id,\r\n                        &self.temp_list,\r\n                    ));\r\n                    condition_id = id\r\n                }\r\n\r\n                let instruction =\r\n                    Instruction::select(result_type_id, id, condition_id, accept_id, reject_id);\r\n                block.body.push(instruction);\r\n                id\r\n            }\r\n            crate::Expression::Derivative { axis, expr } => {\r\n                use crate::DerivativeAxis as Da;\r\n\r\n                let id = self.gen_id();\r\n                let expr_id = self.cached[expr];\r\n                let op = match axis {\r\n                    Da::X => spirv::Op::DPdx,\r\n                    Da::Y => spirv::Op::DPdy,\r\n                    Da::Width => spirv::Op::Fwidth,\r\n                };\r\n                block\r\n                    .body\r\n                    .push(Instruction::derivative(op, result_type_id, id, expr_id));\r\n                id\r\n            }\r\n            crate::Expression::ImageQuery { image, query } => {\r\n                self.write_image_query(result_type_id, image, query, block)?\r\n            }\r\n            crate::Expression::Relational { fun, argument } => {\r\n                use crate::RelationalFunction as Rf;\r\n                let arg_id = self.cached[argument];\r\n                let op = match fun {\r\n                    Rf::All => spirv::Op::All,\r\n                    Rf::Any => spirv::Op::Any,\r\n                    Rf::IsNan => spirv::Op::IsNan,\r\n                    Rf::IsInf => spirv::Op::IsInf,\r\n                    //TODO: these require Kernel capability\r\n                    Rf::IsFinite | Rf::IsNormal => {\r\n                        return Err(Error::FeatureNotImplemented(\"is finite/normal\"))\r\n                    }\r\n                };\r\n                let id = self.gen_id();\r\n                block\r\n                    .body\r\n                    .push(Instruction::relational(op, result_type_id, id, arg_id));\r\n                id\r\n            }\r\n            crate::Expression::ArrayLength(expr) => self.write_runtime_array_length(expr, block)?,\r\n        };\r\n\r\n        self.cached[expr_handle] = id;\r\n        Ok(())\r\n    }\r\n\r\n    /// Build an `OpAccessChain` instruction.\r\n    ///\r\n    /// Emit any needed bounds-checking expressions to `block`.\r\n    ///\r\n    /// Some cases we need to generate a different return type than what the IR gives us.\r\n    /// This is because pointers to binding arrays don't exist in the IR, but we need to\r\n    /// create them to create an access chain in SPIRV.\r\n    ///\r\n    /// On success, the return value is an [`ExpressionPointer`] value; see the\r\n    /// documentation for that type.\r\n    fn write_expression_pointer(\r\n        &mut self,\r\n        mut expr_handle: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n        return_type_override: Option<LookupType>,\r\n    ) -> Result<ExpressionPointer, Error> {\r\n        let result_lookup_ty = match self.fun_info[expr_handle].ty {\r\n            TypeResolution::Handle(ty_handle) => match return_type_override {\r\n                // We use the return type override as a special case for binding arrays as the OpAccessChain\r\n                // needs to return a pointer, but indexing into a binding array just gives you the type of\r\n                // the binding in the IR.\r\n                Some(ty) => ty,\r\n                None => LookupType::Handle(ty_handle),\r\n            },\r\n            TypeResolution::Value(ref inner) => LookupType::Local(make_local(inner).unwrap()),\r\n        };\r\n        let result_type_id = self.get_type_id(result_lookup_ty);\r\n\r\n        // The id of the boolean `and` of all dynamic bounds checks up to this point. If\r\n        // `None`, then we haven't done any dynamic bounds checks yet.\r\n        //\r\n        // When we have a chain of bounds checks, we combine them with `OpLogicalAnd`, not\r\n        // a short-circuit branch. This means we might do comparisons we don't need to,\r\n        // but we expect these checks to almost always succeed, and keeping branches to a\r\n        // minimum is essential.\r\n        let mut accumulated_checks = None;\r\n\r\n        self.temp_list.clear();\r\n        let root_id = loop {\r\n            expr_handle = match self.ir_function.expressions[expr_handle] {\r\n                crate::Expression::Access { base, index } => {\r\n                    let index_id = match self.write_bounds_check(base, index, block)? {\r\n                        BoundsCheckResult::KnownInBounds(known_index) => {\r\n                            // Even if the index is known, `OpAccessIndex`\r\n                            // requires expression operands, not literals.\r\n                            let scalar = crate::ScalarValue::Uint(known_index as u64);\r\n                            self.writer.get_constant_scalar(scalar, 4)\r\n                        }\r\n                        BoundsCheckResult::Computed(computed_index_id) => computed_index_id,\r\n                        BoundsCheckResult::Conditional(comparison_id) => {\r\n                            match accumulated_checks {\r\n                                Some(prior_checks) => {\r\n                                    let combined = self.gen_id();\r\n                                    block.body.push(Instruction::binary(\r\n                                        spirv::Op::LogicalAnd,\r\n                                        self.writer.get_bool_type_id(),\r\n                                        combined,\r\n                                        prior_checks,\r\n                                        comparison_id,\r\n                                    ));\r\n                                    accumulated_checks = Some(combined);\r\n                                }\r\n                                None => {\r\n                                    // Start a fresh chain of checks.\r\n                                    accumulated_checks = Some(comparison_id);\r\n                                }\r\n                            }\r\n\r\n                            // Either way, the index to use is unchanged.\r\n                            self.cached[index]\r\n                        }\r\n                    };\r\n                    self.temp_list.push(index_id);\r\n\r\n                    base\r\n                }\r\n                crate::Expression::AccessIndex { base, index } => {\r\n                    let const_id = self.get_index_constant(index);\r\n                    self.temp_list.push(const_id);\r\n                    base\r\n                }\r\n                crate::Expression::GlobalVariable(handle) => {\r\n                    let gv = &self.writer.global_variables[handle.index()];\r\n                    break gv.access_id;\r\n                }\r\n                crate::Expression::LocalVariable(variable) => {\r\n                    let local_var = &self.function.variables[&variable];\r\n                    break local_var.id;\r\n                }\r\n                crate::Expression::FunctionArgument(index) => {\r\n                    break self.function.parameter_id(index);\r\n                }\r\n                ref other => unimplemented!(\"Unexpected pointer expression {:?}\", other),\r\n            }\r\n        };\r\n\r\n        let pointer = if self.temp_list.is_empty() {\r\n            ExpressionPointer::Ready {\r\n                pointer_id: root_id,\r\n            }\r\n        } else {\r\n            self.temp_list.reverse();\r\n            let pointer_id = self.gen_id();\r\n            let access =\r\n                Instruction::access_chain(result_type_id, pointer_id, root_id, &self.temp_list);\r\n\r\n            // If we generated some bounds checks, we need to leave it to our\r\n            // caller to generate the branch, the access, the load or store, and\r\n            // the zero value (for loads). Otherwise, we can emit the access\r\n            // ourselves, and just hand them the id of the pointer.\r\n            match accumulated_checks {\r\n                Some(condition) => ExpressionPointer::Conditional { condition, access },\r\n                None => {\r\n                    block.body.push(access);\r\n                    ExpressionPointer::Ready { pointer_id }\r\n                }\r\n            }\r\n        };\r\n\r\n        Ok(pointer)\r\n    }\r\n\r\n    /// Build the instructions for matrix - matrix column operations\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn write_matrix_matrix_column_op(\r\n        &mut self,\r\n        block: &mut Block,\r\n        result_id: Word,\r\n        result_type_id: Word,\r\n        left_id: Word,\r\n        right_id: Word,\r\n        columns: crate::VectorSize,\r\n        rows: crate::VectorSize,\r\n        width: u8,\r\n        op: spirv::Op,\r\n    ) {\r\n        self.temp_list.clear();\r\n\r\n        let vector_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: Some(rows),\r\n            kind: crate::ScalarKind::Float,\r\n            width,\r\n            pointer_space: None,\r\n        }));\r\n\r\n        for index in 0..columns as u32 {\r\n            let column_id_left = self.gen_id();\r\n            let column_id_right = self.gen_id();\r\n            let column_id_res = self.gen_id();\r\n\r\n            block.body.push(Instruction::composite_extract(\r\n                vector_type_id,\r\n                column_id_left,\r\n                left_id,\r\n                &[index],\r\n            ));\r\n            block.body.push(Instruction::composite_extract(\r\n                vector_type_id,\r\n                column_id_right,\r\n                right_id,\r\n                &[index],\r\n            ));\r\n            block.body.push(Instruction::binary(\r\n                op,\r\n                vector_type_id,\r\n                column_id_res,\r\n                column_id_left,\r\n                column_id_right,\r\n            ));\r\n\r\n            self.temp_list.push(column_id_res);\r\n        }\r\n\r\n        block.body.push(Instruction::composite_construct(\r\n            result_type_id,\r\n            result_id,\r\n            &self.temp_list,\r\n        ));\r\n    }\r\n\r\n    /// Build the instructions for vector - scalar multiplication\r\n    fn write_vector_scalar_mult(\r\n        &mut self,\r\n        block: &mut Block,\r\n        result_id: Word,\r\n        result_type_id: Word,\r\n        vector_id: Word,\r\n        scalar_id: Word,\r\n        vector: &crate::TypeInner,\r\n    ) {\r\n        let (size, kind) = match *vector {\r\n            crate::TypeInner::Vector { size, kind, .. } => (size, kind),\r\n            _ => unreachable!(),\r\n        };\r\n\r\n        let (op, operand_id) = match kind {\r\n            crate::ScalarKind::Float => (spirv::Op::VectorTimesScalar, scalar_id),\r\n            _ => {\r\n                let operand_id = self.gen_id();\r\n                self.temp_list.clear();\r\n                self.temp_list.resize(size as usize, scalar_id);\r\n                block.body.push(Instruction::composite_construct(\r\n                    result_type_id,\r\n                    operand_id,\r\n                    &self.temp_list,\r\n                ));\r\n                (spirv::Op::IMul, operand_id)\r\n            }\r\n        };\r\n\r\n        block.body.push(Instruction::binary(\r\n            op,\r\n            result_type_id,\r\n            result_id,\r\n            vector_id,\r\n            operand_id,\r\n        ));\r\n    }\r\n\r\n    /// Build the instructions for the arithmetic expression of a dot product\r\n    fn write_dot_product(\r\n        &mut self,\r\n        result_id: Word,\r\n        result_type_id: Word,\r\n        arg0_id: Word,\r\n        arg1_id: Word,\r\n        size: u32,\r\n        block: &mut Block,\r\n    ) {\r\n        let const_null = self.gen_id();\r\n        block\r\n            .body\r\n            .push(Instruction::constant_null(result_type_id, const_null));\r\n\r\n        let mut partial_sum = const_null;\r\n        let last_component = size - 1;\r\n        for index in 0..=last_component {\r\n            // compute the product of the current components\r\n            let a_id = self.gen_id();\r\n            block.body.push(Instruction::composite_extract(\r\n                result_type_id,\r\n                a_id,\r\n                arg0_id,\r\n                &[index],\r\n            ));\r\n            let b_id = self.gen_id();\r\n            block.body.push(Instruction::composite_extract(\r\n                result_type_id,\r\n                b_id,\r\n                arg1_id,\r\n                &[index],\r\n            ));\r\n            let prod_id = self.gen_id();\r\n            block.body.push(Instruction::binary(\r\n                spirv::Op::IMul,\r\n                result_type_id,\r\n                prod_id,\r\n                a_id,\r\n                b_id,\r\n            ));\r\n\r\n            // choose the id for the next sum, depending on current index\r\n            let id = if index == last_component {\r\n                result_id\r\n            } else {\r\n                self.gen_id()\r\n            };\r\n\r\n            // sum the computed product with the partial sum\r\n            block.body.push(Instruction::binary(\r\n                spirv::Op::IAdd,\r\n                result_type_id,\r\n                id,\r\n                partial_sum,\r\n                prod_id,\r\n            ));\r\n            // set the id of the result as the previous partial sum\r\n            partial_sum = id;\r\n        }\r\n    }\r\n\r\n    pub(super) fn write_block(\r\n        &mut self,\r\n        label_id: Word,\r\n        statements: &[crate::Statement],\r\n        exit: BlockExit,\r\n        loop_context: LoopContext,\r\n    ) -> Result<(), Error> {\r\n        let mut block = Block::new(label_id);\r\n\r\n        for statement in statements {\r\n            match *statement {\r\n                crate::Statement::Emit(ref range) => {\r\n                    for handle in range.clone() {\r\n                        self.cache_expression_value(handle, &mut block)?;\r\n                    }\r\n                }\r\n                crate::Statement::Block(ref block_statements) => {\r\n                    let scope_id = self.gen_id();\r\n                    self.function.consume(block, Instruction::branch(scope_id));\r\n\r\n                    let merge_id = self.gen_id();\r\n                    self.write_block(\r\n                        scope_id,\r\n                        block_statements,\r\n                        BlockExit::Branch { target: merge_id },\r\n                        loop_context,\r\n                    )?;\r\n\r\n                    block = Block::new(merge_id);\r\n                }\r\n                crate::Statement::If {\r\n                    condition,\r\n                    ref accept,\r\n                    ref reject,\r\n                } => {\r\n                    let condition_id = self.cached[condition];\r\n\r\n                    let merge_id = self.gen_id();\r\n                    block.body.push(Instruction::selection_merge(\r\n                        merge_id,\r\n                        spirv::SelectionControl::NONE,\r\n                    ));\r\n\r\n                    let accept_id = if accept.is_empty() {\r\n                        None\r\n                    } else {\r\n                        Some(self.gen_id())\r\n                    };\r\n                    let reject_id = if reject.is_empty() {\r\n                        None\r\n                    } else {\r\n                        Some(self.gen_id())\r\n                    };\r\n\r\n                    self.function.consume(\r\n                        block,\r\n                        Instruction::branch_conditional(\r\n                            condition_id,\r\n                            accept_id.unwrap_or(merge_id),\r\n                            reject_id.unwrap_or(merge_id),\r\n                        ),\r\n                    );\r\n\r\n                    if let Some(block_id) = accept_id {\r\n                        self.write_block(\r\n                            block_id,\r\n                            accept,\r\n                            BlockExit::Branch { target: merge_id },\r\n                            loop_context,\r\n                        )?;\r\n                    }\r\n                    if let Some(block_id) = reject_id {\r\n                        self.write_block(\r\n                            block_id,\r\n                            reject,\r\n                            BlockExit::Branch { target: merge_id },\r\n                            loop_context,\r\n                        )?;\r\n                    }\r\n\r\n                    block = Block::new(merge_id);\r\n                }\r\n                crate::Statement::Switch {\r\n                    selector,\r\n                    ref cases,\r\n                } => {\r\n                    let selector_id = self.cached[selector];\r\n\r\n                    let merge_id = self.gen_id();\r\n                    block.body.push(Instruction::selection_merge(\r\n                        merge_id,\r\n                        spirv::SelectionControl::NONE,\r\n                    ));\r\n\r\n                    let default_id = self.gen_id();\r\n\r\n                    let mut reached_default = false;\r\n                    let mut raw_cases = Vec::with_capacity(cases.len());\r\n                    let mut case_ids = Vec::with_capacity(cases.len());\r\n                    for case in cases.iter() {\r\n                        match case.value {\r\n                            crate::SwitchValue::Integer(value) => {\r\n                                let label_id = self.gen_id();\r\n                                // No cases should be added after the default case is encountered\r\n                                // since the default case catches all\r\n                                if !reached_default {\r\n                                    raw_cases.push(super::instructions::Case {\r\n                                        value: value as Word,\r\n                                        label_id,\r\n                                    });\r\n                                }\r\n                                case_ids.push(label_id);\r\n                            }\r\n                            crate::SwitchValue::Default => {\r\n                                case_ids.push(default_id);\r\n                                reached_default = true;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    self.function.consume(\r\n                        block,\r\n                        Instruction::switch(selector_id, default_id, &raw_cases),\r\n                    );\r\n\r\n                    let inner_context = LoopContext {\r\n                        break_id: Some(merge_id),\r\n                        ..loop_context\r\n                    };\r\n\r\n                    for (i, (case, label_id)) in cases.iter().zip(case_ids.iter()).enumerate() {\r\n                        let case_finish_id = if case.fall_through {\r\n                            case_ids[i + 1]\r\n                        } else {\r\n                            merge_id\r\n                        };\r\n                        self.write_block(\r\n                            *label_id,\r\n                            &case.body,\r\n                            BlockExit::Branch {\r\n                                target: case_finish_id,\r\n                            },\r\n                            inner_context,\r\n                        )?;\r\n                    }\r\n\r\n                    // If no default was encountered write a empty block to satisfy the presence of\r\n                    // a block the default label\r\n                    if !reached_default {\r\n                        self.write_block(\r\n                            default_id,\r\n                            &[],\r\n                            BlockExit::Branch { target: merge_id },\r\n                            inner_context,\r\n                        )?;\r\n                    }\r\n\r\n                    block = Block::new(merge_id);\r\n                }\r\n                crate::Statement::Loop {\r\n                    ref body,\r\n                    ref continuing,\r\n                    break_if,\r\n                } => {\r\n                    let preamble_id = self.gen_id();\r\n                    self.function\r\n                        .consume(block, Instruction::branch(preamble_id));\r\n\r\n                    let merge_id = self.gen_id();\r\n                    let body_id = self.gen_id();\r\n                    let continuing_id = self.gen_id();\r\n\r\n                    // SPIR-V requires the continuing to the `OpLoopMerge`,\r\n                    // so we have to start a new block with it.\r\n                    block = Block::new(preamble_id);\r\n                    block.body.push(Instruction::loop_merge(\r\n                        merge_id,\r\n                        continuing_id,\r\n                        spirv::SelectionControl::NONE,\r\n                    ));\r\n                    self.function.consume(block, Instruction::branch(body_id));\r\n\r\n                    self.write_block(\r\n                        body_id,\r\n                        body,\r\n                        BlockExit::Branch {\r\n                            target: continuing_id,\r\n                        },\r\n                        LoopContext {\r\n                            continuing_id: Some(continuing_id),\r\n                            break_id: Some(merge_id),\r\n                        },\r\n                    )?;\r\n\r\n                    let exit = match break_if {\r\n                        Some(condition) => BlockExit::BreakIf {\r\n                            condition,\r\n                            preamble_id,\r\n                        },\r\n                        None => BlockExit::Branch {\r\n                            target: preamble_id,\r\n                        },\r\n                    };\r\n\r\n                    self.write_block(\r\n                        continuing_id,\r\n                        continuing,\r\n                        exit,\r\n                        LoopContext {\r\n                            continuing_id: None,\r\n                            break_id: Some(merge_id),\r\n                        },\r\n                    )?;\r\n\r\n                    block = Block::new(merge_id);\r\n                }\r\n                crate::Statement::Break => {\r\n                    self.function\r\n                        .consume(block, Instruction::branch(loop_context.break_id.unwrap()));\r\n                    return Ok(());\r\n                }\r\n                crate::Statement::Continue => {\r\n                    self.function.consume(\r\n                        block,\r\n                        Instruction::branch(loop_context.continuing_id.unwrap()),\r\n                    );\r\n                    return Ok(());\r\n                }\r\n                crate::Statement::Return { value: Some(value) } => {\r\n                    let value_id = self.cached[value];\r\n                    let instruction = match self.function.entry_point_context {\r\n                        // If this is an entry point, and we need to return anything,\r\n                        // let's instead store the output variables and return `void`.\r\n                        Some(ref context) => {\r\n                            self.writer.write_entry_point_return(\r\n                                value_id,\r\n                                self.ir_function.result.as_ref().unwrap(),\r\n                                &context.results,\r\n                                &mut block.body,\r\n                            )?;\r\n                            Instruction::return_void()\r\n                        }\r\n                        None => Instruction::return_value(value_id),\r\n                    };\r\n                    self.function.consume(block, instruction);\r\n                    return Ok(());\r\n                }\r\n                crate::Statement::Return { value: None } => {\r\n                    self.function.consume(block, Instruction::return_void());\r\n                    return Ok(());\r\n                }\r\n                crate::Statement::Kill => {\r\n                    self.function.consume(block, Instruction::kill());\r\n                    return Ok(());\r\n                }\r\n                crate::Statement::Barrier(flags) => {\r\n                    let memory_scope = if flags.contains(crate::Barrier::STORAGE) {\r\n                        spirv::Scope::Device\r\n                    } else {\r\n                        spirv::Scope::Workgroup\r\n                    };\r\n                    let mut semantics = spirv::MemorySemantics::ACQUIRE_RELEASE;\r\n                    semantics.set(\r\n                        spirv::MemorySemantics::UNIFORM_MEMORY,\r\n                        flags.contains(crate::Barrier::STORAGE),\r\n                    );\r\n                    semantics.set(\r\n                        spirv::MemorySemantics::WORKGROUP_MEMORY,\r\n                        flags.contains(crate::Barrier::WORK_GROUP),\r\n                    );\r\n                    let exec_scope_id = self.get_index_constant(spirv::Scope::Workgroup as u32);\r\n                    let mem_scope_id = self.get_index_constant(memory_scope as u32);\r\n                    let semantics_id = self.get_index_constant(semantics.bits());\r\n                    block.body.push(Instruction::control_barrier(\r\n                        exec_scope_id,\r\n                        mem_scope_id,\r\n                        semantics_id,\r\n                    ));\r\n                }\r\n                crate::Statement::Store { pointer, value } => {\r\n                    let value_id = self.cached[value];\r\n                    match self.write_expression_pointer(pointer, &mut block, None)? {\r\n                        ExpressionPointer::Ready { pointer_id } => {\r\n                            let atomic_space = match *self.fun_info[pointer]\r\n                                .ty\r\n                                .inner_with(&self.ir_module.types)\r\n                            {\r\n                                crate::TypeInner::Pointer { base, space } => {\r\n                                    match self.ir_module.types[base].inner {\r\n                                        crate::TypeInner::Atomic { .. } => Some(space),\r\n                                        _ => None,\r\n                                    }\r\n                                }\r\n                                _ => None,\r\n                            };\r\n                            let instruction = if let Some(space) = atomic_space {\r\n                                let (semantics, scope) = space.to_spirv_semantics_and_scope();\r\n                                let scope_constant_id = self.get_scope_constant(scope as u32);\r\n                                let semantics_id = self.get_index_constant(semantics.bits());\r\n                                Instruction::atomic_store(\r\n                                    pointer_id,\r\n                                    scope_constant_id,\r\n                                    semantics_id,\r\n                                    value_id,\r\n                                )\r\n                            } else {\r\n                                Instruction::store(pointer_id, value_id, None)\r\n                            };\r\n                            block.body.push(instruction);\r\n                        }\r\n                        ExpressionPointer::Conditional { condition, access } => {\r\n                            let mut selection = Selection::start(&mut block, ());\r\n                            selection.if_true(self, condition, ());\r\n\r\n                            // The in-bounds path. Perform the access and the store.\r\n                            let pointer_id = access.result_id.unwrap();\r\n                            selection.block().body.push(access);\r\n                            selection\r\n                                .block()\r\n                                .body\r\n                                .push(Instruction::store(pointer_id, value_id, None));\r\n\r\n                            // Finish the in-bounds block and start the merge block. This\r\n                            // is the block we'll leave current on return.\r\n                            selection.finish(self, ());\r\n                        }\r\n                    };\r\n                }\r\n                crate::Statement::ImageStore {\r\n                    image,\r\n                    coordinate,\r\n                    array_index,\r\n                    value,\r\n                } => self.write_image_store(image, coordinate, array_index, value, &mut block)?,\r\n                crate::Statement::Call {\r\n                    function: local_function,\r\n                    ref arguments,\r\n                    result,\r\n                } => {\r\n                    let id = self.gen_id();\r\n                    self.temp_list.clear();\r\n                    for &argument in arguments {\r\n                        self.temp_list.push(self.cached[argument]);\r\n                    }\r\n\r\n                    let type_id = match result {\r\n                        Some(expr) => {\r\n                            self.cached[expr] = id;\r\n                            self.get_expression_type_id(&self.fun_info[expr].ty)\r\n                        }\r\n                        None => self.writer.void_type,\r\n                    };\r\n\r\n                    block.body.push(Instruction::function_call(\r\n                        type_id,\r\n                        id,\r\n                        self.writer.lookup_function[&local_function],\r\n                        &self.temp_list,\r\n                    ));\r\n                }\r\n                crate::Statement::Atomic {\r\n                    pointer,\r\n                    ref fun,\r\n                    value,\r\n                    result,\r\n                } => {\r\n                    let id = self.gen_id();\r\n                    let result_type_id = self.get_expression_type_id(&self.fun_info[result].ty);\r\n\r\n                    self.cached[result] = id;\r\n\r\n                    let pointer_id =\r\n                        match self.write_expression_pointer(pointer, &mut block, None)? {\r\n                            ExpressionPointer::Ready { pointer_id } => pointer_id,\r\n                            ExpressionPointer::Conditional { .. } => {\r\n                                return Err(Error::FeatureNotImplemented(\r\n                                    \"Atomics out-of-bounds handling\",\r\n                                ));\r\n                            }\r\n                        };\r\n\r\n                    let space = self.fun_info[pointer]\r\n                        .ty\r\n                        .inner_with(&self.ir_module.types)\r\n                        .pointer_space()\r\n                        .unwrap();\r\n                    let (semantics, scope) = space.to_spirv_semantics_and_scope();\r\n                    let scope_constant_id = self.get_scope_constant(scope as u32);\r\n                    let semantics_id = self.get_index_constant(semantics.bits());\r\n                    let value_id = self.cached[value];\r\n                    let value_inner = self.fun_info[value].ty.inner_with(&self.ir_module.types);\r\n\r\n                    let instruction = match *fun {\r\n                        crate::AtomicFunction::Add => Instruction::atomic_binary(\r\n                            spirv::Op::AtomicIAdd,\r\n                            result_type_id,\r\n                            id,\r\n                            pointer_id,\r\n                            scope_constant_id,\r\n                            semantics_id,\r\n                            value_id,\r\n                        ),\r\n                        crate::AtomicFunction::Subtract => Instruction::atomic_binary(\r\n                            spirv::Op::AtomicISub,\r\n                            result_type_id,\r\n                            id,\r\n                            pointer_id,\r\n                            scope_constant_id,\r\n                            semantics_id,\r\n                            value_id,\r\n                        ),\r\n                        crate::AtomicFunction::And => Instruction::atomic_binary(\r\n                            spirv::Op::AtomicAnd,\r\n                            result_type_id,\r\n                            id,\r\n                            pointer_id,\r\n                            scope_constant_id,\r\n                            semantics_id,\r\n                            value_id,\r\n                        ),\r\n                        crate::AtomicFunction::InclusiveOr => Instruction::atomic_binary(\r\n                            spirv::Op::AtomicOr,\r\n                            result_type_id,\r\n                            id,\r\n                            pointer_id,\r\n                            scope_constant_id,\r\n                            semantics_id,\r\n                            value_id,\r\n                        ),\r\n                        crate::AtomicFunction::ExclusiveOr => Instruction::atomic_binary(\r\n                            spirv::Op::AtomicXor,\r\n                            result_type_id,\r\n                            id,\r\n                            pointer_id,\r\n                            scope_constant_id,\r\n                            semantics_id,\r\n                            value_id,\r\n                        ),\r\n                        crate::AtomicFunction::Min => {\r\n                            let spirv_op = match *value_inner {\r\n                                crate::TypeInner::Scalar {\r\n                                    kind: crate::ScalarKind::Sint,\r\n                                    width: _,\r\n                                } => spirv::Op::AtomicSMin,\r\n                                crate::TypeInner::Scalar {\r\n                                    kind: crate::ScalarKind::Uint,\r\n                                    width: _,\r\n                                } => spirv::Op::AtomicUMin,\r\n                                _ => unimplemented!(),\r\n                            };\r\n                            Instruction::atomic_binary(\r\n                                spirv_op,\r\n                                result_type_id,\r\n                                id,\r\n                                pointer_id,\r\n                                scope_constant_id,\r\n                                semantics_id,\r\n                                value_id,\r\n                            )\r\n                        }\r\n                        crate::AtomicFunction::Max => {\r\n                            let spirv_op = match *value_inner {\r\n                                crate::TypeInner::Scalar {\r\n                                    kind: crate::ScalarKind::Sint,\r\n                                    width: _,\r\n                                } => spirv::Op::AtomicSMax,\r\n                                crate::TypeInner::Scalar {\r\n                                    kind: crate::ScalarKind::Uint,\r\n                                    width: _,\r\n                                } => spirv::Op::AtomicUMax,\r\n                                _ => unimplemented!(),\r\n                            };\r\n                            Instruction::atomic_binary(\r\n                                spirv_op,\r\n                                result_type_id,\r\n                                id,\r\n                                pointer_id,\r\n                                scope_constant_id,\r\n                                semantics_id,\r\n                                value_id,\r\n                            )\r\n                        }\r\n                        crate::AtomicFunction::Exchange { compare: None } => {\r\n                            Instruction::atomic_binary(\r\n                                spirv::Op::AtomicExchange,\r\n                                result_type_id,\r\n                                id,\r\n                                pointer_id,\r\n                                scope_constant_id,\r\n                                semantics_id,\r\n                                value_id,\r\n                            )\r\n                        }\r\n                        crate::AtomicFunction::Exchange { compare: Some(cmp) } => {\r\n                            let comparator_id = self.cached[cmp];\r\n                            Instruction::atomic_compare_exchange(\r\n                                result_type_id, \r\n                                id,\r\n                                pointer_id,\r\n                                scope_constant_id, \r\n                                semantics_id, \r\n                                semantics_id, \r\n                                value_id,\r\n                                comparator_id\r\n                            )\r\n                        }\r\n                    };\r\n\r\n                    block.body.push(instruction);\r\n                }\r\n            }\r\n        }\r\n\r\n        let termination = match exit {\r\n            // We're generating code for the top-level Block of the function, so we\r\n            // need to end it with some kind of return instruction.\r\n            BlockExit::Return => match self.ir_function.result {\r\n                Some(ref result) if self.function.entry_point_context.is_none() => {\r\n                    let type_id = self.get_type_id(LookupType::Handle(result.ty));\r\n                    let null_id = self.writer.write_constant_null(type_id);\r\n                    Instruction::return_value(null_id)\r\n                }\r\n                _ => Instruction::return_void(),\r\n            },\r\n            BlockExit::Branch { target } => Instruction::branch(target),\r\n            BlockExit::BreakIf {\r\n                condition,\r\n                preamble_id,\r\n            } => {\r\n                let condition_id = self.cached[condition];\r\n\r\n                Instruction::branch_conditional(\r\n                    condition_id,\r\n                    loop_context.break_id.unwrap(),\r\n                    preamble_id,\r\n                )\r\n            }\r\n        };\r\n\r\n        self.function.consume(block, termination);\r\n        Ok(())\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/helpers.rs",
    "content": "use crate::{Handle, UniqueArena};\r\nuse spirv::Word;\r\n\r\npub(super) fn bytes_to_words(bytes: &[u8]) -> Vec<Word> {\r\n    bytes\r\n        .chunks(4)\r\n        .map(|chars| chars.iter().rev().fold(0u32, |u, c| (u << 8) | *c as u32))\r\n        .collect()\r\n}\r\n\r\npub(super) fn string_to_words(input: &str) -> Vec<Word> {\r\n    let bytes = input.as_bytes();\r\n    let mut words = bytes_to_words(bytes);\r\n\r\n    if bytes.len() % 4 == 0 {\r\n        // nul-termination\r\n        words.push(0x0u32);\r\n    }\r\n\r\n    words\r\n}\r\n\r\npub(super) const fn map_storage_class(space: crate::AddressSpace) -> spirv::StorageClass {\r\n    match space {\r\n        crate::AddressSpace::Handle => spirv::StorageClass::UniformConstant,\r\n        crate::AddressSpace::Function => spirv::StorageClass::Function,\r\n        crate::AddressSpace::Private => spirv::StorageClass::Private,\r\n        crate::AddressSpace::Storage { .. } => spirv::StorageClass::StorageBuffer,\r\n        crate::AddressSpace::Uniform => spirv::StorageClass::Uniform,\r\n        crate::AddressSpace::WorkGroup => spirv::StorageClass::Workgroup,\r\n        crate::AddressSpace::PushConstant => spirv::StorageClass::PushConstant,\r\n    }\r\n}\r\n\r\npub(super) fn contains_builtin(\r\n    binding: Option<&crate::Binding>,\r\n    ty: Handle<crate::Type>,\r\n    arena: &UniqueArena<crate::Type>,\r\n    built_in: crate::BuiltIn,\r\n) -> bool {\r\n    if let Some(&crate::Binding::BuiltIn(bi)) = binding {\r\n        bi == built_in\r\n    } else if let crate::TypeInner::Struct { ref members, .. } = arena[ty].inner {\r\n        members\r\n            .iter()\r\n            .any(|member| contains_builtin(member.binding.as_ref(), member.ty, arena, built_in))\r\n    } else {\r\n        false // unreachable\r\n    }\r\n}\r\n\r\nimpl crate::AddressSpace {\r\n    pub(super) const fn to_spirv_semantics_and_scope(\r\n        self,\r\n    ) -> (spirv::MemorySemantics, spirv::Scope) {\r\n        match self {\r\n            Self::Storage { .. } => (spirv::MemorySemantics::UNIFORM_MEMORY, spirv::Scope::Device),\r\n            Self::WorkGroup => (\r\n                spirv::MemorySemantics::WORKGROUP_MEMORY,\r\n                spirv::Scope::Workgroup,\r\n            ),\r\n            _ => (spirv::MemorySemantics::empty(), spirv::Scope::Invocation),\r\n        }\r\n    }\r\n}\r\n\r\n/// Return true if the global requires a type decorated with `Block`.\r\n///\r\n/// Vulkan spec v1.3 §15.6.2, \"Descriptor Set Interface\", says:\r\n///\r\n/// > Variables identified with the `Uniform` storage class are used to\r\n/// > access transparent buffer backed resources. Such variables must\r\n/// > be:\r\n/// >\r\n/// > -   typed as `OpTypeStruct`, or an array of this type,\r\n/// >\r\n/// > -   identified with a `Block` or `BufferBlock` decoration, and\r\n/// >\r\n/// > -   laid out explicitly using the `Offset`, `ArrayStride`, and\r\n/// >     `MatrixStride` decorations as specified in §15.6.4, \"Offset\r\n/// >     and Stride Assignment.\"\r\n// See `back::spv::GlobalVariable::access_id` for details.\r\npub fn global_needs_wrapper(ir_module: &crate::Module, var: &crate::GlobalVariable) -> bool {\r\n    match var.space {\r\n        crate::AddressSpace::Uniform\r\n        | crate::AddressSpace::Storage { .. }\r\n        | crate::AddressSpace::PushConstant => {}\r\n        _ => return false,\r\n    };\r\n    match ir_module.types[var.ty].inner {\r\n        crate::TypeInner::Struct {\r\n            ref members,\r\n            span: _,\r\n        } => match members.last() {\r\n            Some(member) => match ir_module.types[member.ty].inner {\r\n                // Structs with dynamically sized arrays can't be copied and can't be wrapped.\r\n                crate::TypeInner::Array {\r\n                    size: crate::ArraySize::Dynamic,\r\n                    ..\r\n                } => false,\r\n                _ => true,\r\n            },\r\n            None => false,\r\n        },\r\n        // if it's not a structure, let's wrap it to be able to put \"Block\"\r\n        _ => true,\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/image.rs",
    "content": "/*!\r\nGenerating SPIR-V for image operations.\r\n*/\r\n\r\nuse super::{\r\n    selection::{MergeTuple, Selection},\r\n    Block, BlockContext, Error, IdGenerator, Instruction, LocalType, LookupType,\r\n};\r\nuse crate::arena::Handle;\r\nuse spirv::Word;\r\n\r\n/// Information about a vector of coordinates.\r\n///\r\n/// The coordinate vectors expected by SPIR-V `OpImageRead` and `OpImageFetch`\r\n/// supply the array index for arrayed images as an additional component at\r\n/// the end, whereas Naga's `ImageLoad`, `ImageStore`, and `ImageSample` carry\r\n/// the array index as a separate field.\r\n///\r\n/// In the process of generating code to compute the combined vector, we also\r\n/// produce SPIR-V types and vector lengths that are useful elsewhere. This\r\n/// struct gathers that information into one place, with standard names.\r\nstruct ImageCoordinates {\r\n    /// The SPIR-V id of the combined coordinate/index vector value.\r\n    ///\r\n    /// Note: when indexing a non-arrayed 1D image, this will be a scalar.\r\n    value_id: Word,\r\n\r\n    /// The SPIR-V id of the type of `value`.\r\n    type_id: Word,\r\n\r\n    /// The number of components in `value`, if it is a vector, or `None` if it\r\n    /// is a scalar.\r\n    size: Option<crate::VectorSize>,\r\n}\r\n\r\n/// A trait for image access (load or store) code generators.\r\n///\r\n/// Types implementing this trait hold information about an `ImageStore` or\r\n/// `ImageLoad` operation that is not affected by the bounds check policy. The\r\n/// `generate` method emits code for the access, given the results of bounds\r\n/// checking.\r\n///\r\n/// The [`image`] bounds checks policy affects access coordinates, level of\r\n/// detail, and sample index, but never the image id, result type (if any), or\r\n/// the specific SPIR-V instruction used. Types that implement this trait gather\r\n/// together the latter category, so we don't have to plumb them through the\r\n/// bounds-checking code.\r\n///\r\n/// [`image`]: crate::proc::BoundsCheckPolicies::index\r\ntrait Access {\r\n    /// The Rust type that represents SPIR-V values and types for this access.\r\n    ///\r\n    /// For operations like loads, this is `Word`. For operations like stores,\r\n    /// this is `()`.\r\n    ///\r\n    /// For `ReadZeroSkipWrite`, this will be the type of the selection\r\n    /// construct that performs the bounds checks, so it must implement\r\n    /// `MergeTuple`.\r\n    type Output: MergeTuple + Copy + Clone;\r\n\r\n    /// Write an image access to `block`.\r\n    ///\r\n    /// Access the texel at `coordinates_id`. The optional `level_id` indicates\r\n    /// the level of detail, and `sample_id` is the index of the sample to\r\n    /// access in a multisampled texel.\r\n    ///\r\n    /// Ths method assumes that `coordinates_id` has already had the image array\r\n    /// index, if any, folded in, as done by `write_image_coordinates`.\r\n    ///\r\n    /// Return the value id produced by the instruction, if any.\r\n    ///\r\n    /// Use `id_gen` to generate SPIR-V ids as necessary.\r\n    fn generate(\r\n        &self,\r\n        id_gen: &mut IdGenerator,\r\n        coordinates_id: Word,\r\n        level_id: Option<Word>,\r\n        sample_id: Option<Word>,\r\n        block: &mut Block,\r\n    ) -> Self::Output;\r\n\r\n    /// Return the SPIR-V type of the value produced by the code written by\r\n    /// `generate`. If the access does not produce a value, `Self::Output`\r\n    /// should be `()`.\r\n    fn result_type(&self) -> Self::Output;\r\n\r\n    /// Construct the SPIR-V 'zero' value to be returned for an out-of-bounds\r\n    /// access under the `ReadZeroSkipWrite` policy. If the access does not\r\n    /// produce a value, `Self::Output` should be `()`.\r\n    fn out_of_bounds_value(&self, ctx: &mut BlockContext<'_>) -> Self::Output;\r\n}\r\n\r\n/// Texel access information for an [`ImageLoad`] expression.\r\n///\r\n/// [`ImageLoad`]: crate::Expression::ImageLoad\r\nstruct Load {\r\n    /// The specific opcode we'll use to perform the fetch. Storage images\r\n    /// require `OpImageRead`, while sampled images require `OpImageFetch`.\r\n    opcode: spirv::Op,\r\n\r\n    /// The type id produced by the actual image access instruction.\r\n    type_id: Word,\r\n\r\n    /// The id of the image being accessed.\r\n    image_id: Word,\r\n}\r\n\r\nimpl Load {\r\n    fn from_image_expr(\r\n        ctx: &mut BlockContext<'_>,\r\n        image_id: Word,\r\n        image_class: crate::ImageClass,\r\n        result_type_id: Word,\r\n    ) -> Result<Load, Error> {\r\n        let opcode = match image_class {\r\n            crate::ImageClass::Storage { .. } => spirv::Op::ImageRead,\r\n            crate::ImageClass::Depth { .. } | crate::ImageClass::Sampled { .. } => {\r\n                spirv::Op::ImageFetch\r\n            }\r\n        };\r\n\r\n        // `OpImageRead` and `OpImageFetch` instructions produce vec4<f32>\r\n        // values. Most of the time, we can just use `result_type_id` for\r\n        // this. The exception is that `Expression::ImageLoad` from a depth\r\n        // image produces a scalar `f32`, so in that case we need to find\r\n        // the right SPIR-V type for the access instruction here.\r\n        let type_id = match image_class {\r\n            crate::ImageClass::Depth { .. } => {\r\n                ctx.get_type_id(LookupType::Local(LocalType::Value {\r\n                    vector_size: Some(crate::VectorSize::Quad),\r\n                    kind: crate::ScalarKind::Float,\r\n                    width: 4,\r\n                    pointer_space: None,\r\n                }))\r\n            }\r\n            _ => result_type_id,\r\n        };\r\n\r\n        Ok(Load {\r\n            opcode,\r\n            type_id,\r\n            image_id,\r\n        })\r\n    }\r\n}\r\n\r\nimpl Access for Load {\r\n    type Output = Word;\r\n\r\n    /// Write an instruction to access a given texel of this image.\r\n    fn generate(\r\n        &self,\r\n        id_gen: &mut IdGenerator,\r\n        coordinates_id: Word,\r\n        level_id: Option<Word>,\r\n        sample_id: Option<Word>,\r\n        block: &mut Block,\r\n    ) -> Word {\r\n        let texel_id = id_gen.next();\r\n        let mut instruction = Instruction::image_fetch_or_read(\r\n            self.opcode,\r\n            self.type_id,\r\n            texel_id,\r\n            self.image_id,\r\n            coordinates_id,\r\n        );\r\n\r\n        match (level_id, sample_id) {\r\n            (None, None) => {}\r\n            (Some(level_id), None) => {\r\n                instruction.add_operand(spirv::ImageOperands::LOD.bits());\r\n                instruction.add_operand(level_id);\r\n            }\r\n            (None, Some(sample_id)) => {\r\n                instruction.add_operand(spirv::ImageOperands::SAMPLE.bits());\r\n                instruction.add_operand(sample_id);\r\n            }\r\n            // There's no such thing as a multi-sampled mipmap.\r\n            (Some(_), Some(_)) => unreachable!(),\r\n        }\r\n\r\n        block.body.push(instruction);\r\n\r\n        texel_id\r\n    }\r\n\r\n    fn result_type(&self) -> Word {\r\n        self.type_id\r\n    }\r\n\r\n    fn out_of_bounds_value(&self, ctx: &mut BlockContext<'_>) -> Word {\r\n        ctx.writer.write_constant_null(self.type_id)\r\n    }\r\n}\r\n\r\n/// Texel access information for a [`Store`] statement.\r\n///\r\n/// [`Store`]: crate::Statement::Store\r\nstruct Store {\r\n    /// The id of the image being written to.\r\n    image_id: Word,\r\n\r\n    /// The value we're going to write to the texel.\r\n    value_id: Word,\r\n}\r\n\r\nimpl Access for Store {\r\n    /// Stores don't generate any value.\r\n    type Output = ();\r\n\r\n    fn generate(\r\n        &self,\r\n        _id_gen: &mut IdGenerator,\r\n        coordinates_id: Word,\r\n        _level_id: Option<Word>,\r\n        _sample_id: Option<Word>,\r\n        block: &mut Block,\r\n    ) {\r\n        block.body.push(Instruction::image_write(\r\n            self.image_id,\r\n            coordinates_id,\r\n            self.value_id,\r\n        ));\r\n    }\r\n\r\n    /// Stores don't generate any value, so this just returns `()`.\r\n    fn result_type(&self) {}\r\n\r\n    /// Stores don't generate any value, so this just returns `()`.\r\n    fn out_of_bounds_value(&self, _ctx: &mut BlockContext<'_>) {}\r\n}\r\n\r\nimpl<'w> BlockContext<'w> {\r\n    /// Extend image coordinates with an array index, if necessary.\r\n    ///\r\n    /// Whereas [`Expression::ImageLoad`] and [`ImageSample`] treat the array\r\n    /// index as a separate operand from the coordinates, SPIR-V image access\r\n    /// instructions include the array index in the `coordinates` operand. This\r\n    /// function builds a SPIR-V coordinate vector from a Naga coordinate vector\r\n    /// and array index, if one is supplied, and returns a `ImageCoordinates`\r\n    /// struct describing what it built.\r\n    ///\r\n    /// If `array_index` is `Some(expr)`, then this function constructs a new\r\n    /// vector that is `coordinates` with `array_index` concatenated onto the\r\n    /// end: a `vec2` becomes a `vec3`, a scalar becomes a `vec2`, and so on.\r\n    ///\r\n    /// If `array_index` is `None`, then the return value uses `coordinates`\r\n    /// unchanged. Note that, when indexing a non-arrayed 1D image, this will be\r\n    /// a scalar value.\r\n    ///\r\n    /// If needed, this function generates code to convert the array index,\r\n    /// always an integer scalar, to match the component type of `coordinates`.\r\n    /// Naga's `ImageLoad` and SPIR-V's `OpImageRead`, `OpImageFetch`, and\r\n    /// `OpImageWrite` all use integer coordinates, while Naga's `ImageSample`\r\n    /// and SPIR-V's `OpImageSample...` instructions all take floating-point\r\n    /// coordinate vectors.\r\n    ///\r\n    /// [`Expression::ImageLoad`]: crate::Expression::ImageLoad\r\n    /// [`ImageSample`]: crate::Expression::ImageSample\r\n    fn write_image_coordinates(\r\n        &mut self,\r\n        coordinates: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        block: &mut Block,\r\n    ) -> Result<ImageCoordinates, Error> {\r\n        use crate::TypeInner as Ti;\r\n        use crate::VectorSize as Vs;\r\n\r\n        let coordinates_id = self.cached[coordinates];\r\n        let ty = &self.fun_info[coordinates].ty;\r\n        let inner_ty = ty.inner_with(&self.ir_module.types);\r\n\r\n        // If there's no array index, the image coordinates are exactly the\r\n        // `coordinate` field of the `Expression::ImageLoad`. No work is needed.\r\n        let array_index = match array_index {\r\n            None => {\r\n                let value_id = coordinates_id;\r\n                let type_id = self.get_expression_type_id(ty);\r\n                let size = match *inner_ty {\r\n                    Ti::Scalar { .. } => None,\r\n                    Ti::Vector { size, .. } => Some(size),\r\n                    _ => return Err(Error::Validation(\"coordinate type\")),\r\n                };\r\n                return Ok(ImageCoordinates {\r\n                    value_id,\r\n                    type_id,\r\n                    size,\r\n                });\r\n            }\r\n            Some(ix) => ix,\r\n        };\r\n\r\n        // Find the component type of `coordinates`, and figure out the size the\r\n        // combined coordinate vector will have.\r\n        let (component_kind, size) = match *inner_ty {\r\n            Ti::Scalar { kind, width: 4 } => (kind, Some(Vs::Bi)),\r\n            Ti::Vector {\r\n                kind,\r\n                width: 4,\r\n                size: Vs::Bi,\r\n            } => (kind, Some(Vs::Tri)),\r\n            Ti::Vector {\r\n                kind,\r\n                width: 4,\r\n                size: Vs::Tri,\r\n            } => (kind, Some(Vs::Quad)),\r\n            Ti::Vector { size: Vs::Quad, .. } => {\r\n                return Err(Error::Validation(\"extending vec4 coordinate\"));\r\n            }\r\n            ref other => {\r\n                log::error!(\"wrong coordinate type {:?}\", other);\r\n                return Err(Error::Validation(\"coordinate type\"));\r\n            }\r\n        };\r\n\r\n        // Convert the index to the coordinate component type, if necessary.\r\n        let array_index_i32_id = self.cached[array_index];\r\n        let reconciled_array_index_id = if component_kind == crate::ScalarKind::Sint {\r\n            array_index_i32_id\r\n        } else {\r\n            let component_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n                vector_size: None,\r\n                kind: component_kind,\r\n                width: 4,\r\n                pointer_space: None,\r\n            }));\r\n\r\n            let reconciled_id = self.gen_id();\r\n            block.body.push(Instruction::unary(\r\n                spirv::Op::ConvertUToF,\r\n                component_type_id,\r\n                reconciled_id,\r\n                array_index_i32_id,\r\n            ));\r\n            reconciled_id\r\n        };\r\n\r\n        // Find the SPIR-V type for the combined coordinates/index vector.\r\n        let type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: size,\r\n            kind: component_kind,\r\n            width: 4,\r\n            pointer_space: None,\r\n        }));\r\n\r\n        // Schmear the coordinates and index together.\r\n        let value_id = self.gen_id();\r\n        block.body.push(Instruction::composite_construct(\r\n            type_id,\r\n            value_id,\r\n            &[coordinates_id, reconciled_array_index_id],\r\n        ));\r\n        Ok(ImageCoordinates {\r\n            value_id,\r\n            type_id,\r\n            size,\r\n        })\r\n    }\r\n\r\n    fn get_image_id(&mut self, expr_handle: Handle<crate::Expression>) -> Word {\r\n        let id = match self.ir_function.expressions[expr_handle] {\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                self.writer.global_variables[handle.index()].handle_id\r\n            }\r\n            crate::Expression::FunctionArgument(i) => {\r\n                self.function.parameters[i as usize].handle_id\r\n            }\r\n            crate::Expression::Access { .. } | crate::Expression::AccessIndex { .. } => {\r\n                self.cached[expr_handle]\r\n            }\r\n            ref other => unreachable!(\"Unexpected image expression {:?}\", other),\r\n        };\r\n\r\n        if id == 0 {\r\n            unreachable!(\r\n                \"Image expression {:?} doesn't have a handle ID\",\r\n                expr_handle\r\n            );\r\n        }\r\n\r\n        id\r\n    }\r\n\r\n    /// Generate a vector or scalar 'one' for arithmetic on `coordinates`.\r\n    ///\r\n    /// If `coordinates` is a scalar, return a scalar one. Otherwise, return\r\n    /// a vector of ones.\r\n    fn write_coordinate_one(&mut self, coordinates: &ImageCoordinates) -> Result<Word, Error> {\r\n        let one = self.get_scope_constant(1);\r\n        match coordinates.size {\r\n            None => Ok(one),\r\n            Some(vector_size) => {\r\n                let ones = [one; 4];\r\n                let id = self.gen_id();\r\n                Instruction::constant_composite(\r\n                    coordinates.type_id,\r\n                    id,\r\n                    &ones[..vector_size as usize],\r\n                )\r\n                .to_words(&mut self.writer.logical_layout.declarations);\r\n                Ok(id)\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Generate code to restrict `input` to fall between zero and one less than\r\n    /// `size_id`.\r\n    ///\r\n    /// Both must be 32-bit scalar integer values, whose type is given by\r\n    /// `type_id`. The computed value is also of type `type_id`.\r\n    fn restrict_scalar(\r\n        &mut self,\r\n        type_id: Word,\r\n        input_id: Word,\r\n        size_id: Word,\r\n        block: &mut Block,\r\n    ) -> Result<Word, Error> {\r\n        let i32_one_id = self.get_scope_constant(1);\r\n\r\n        // Subtract one from `size` to get the largest valid value.\r\n        let limit_id = self.gen_id();\r\n        block.body.push(Instruction::binary(\r\n            spirv::Op::ISub,\r\n            type_id,\r\n            limit_id,\r\n            size_id,\r\n            i32_one_id,\r\n        ));\r\n\r\n        // Use an unsigned minimum, to handle both positive out-of-range values\r\n        // and negative values in a single instruction: negative values of\r\n        // `input_id` get treated as very large positive values.\r\n        let restricted_id = self.gen_id();\r\n        block.body.push(Instruction::ext_inst(\r\n            self.writer.gl450_ext_inst_id,\r\n            spirv::GLOp::UMin,\r\n            type_id,\r\n            restricted_id,\r\n            &[input_id, limit_id],\r\n        ));\r\n\r\n        Ok(restricted_id)\r\n    }\r\n\r\n    /// Write instructions to query the size of an image.\r\n    ///\r\n    /// This takes care of selecting the right instruction depending on whether\r\n    /// a level of detail parameter is present.\r\n    fn write_coordinate_bounds(\r\n        &mut self,\r\n        type_id: Word,\r\n        image_id: Word,\r\n        level_id: Option<Word>,\r\n        block: &mut Block,\r\n    ) -> Word {\r\n        let coordinate_bounds_id = self.gen_id();\r\n        match level_id {\r\n            Some(level_id) => {\r\n                // A level of detail was provided, so fetch the image size for\r\n                // that level.\r\n                let mut inst = Instruction::image_query(\r\n                    spirv::Op::ImageQuerySizeLod,\r\n                    type_id,\r\n                    coordinate_bounds_id,\r\n                    image_id,\r\n                );\r\n                inst.add_operand(level_id);\r\n                block.body.push(inst);\r\n            }\r\n            _ => {\r\n                // No level of detail was given.\r\n                block.body.push(Instruction::image_query(\r\n                    spirv::Op::ImageQuerySize,\r\n                    type_id,\r\n                    coordinate_bounds_id,\r\n                    image_id,\r\n                ));\r\n            }\r\n        }\r\n\r\n        coordinate_bounds_id\r\n    }\r\n\r\n    /// Write code to restrict coordinates for an image reference.\r\n    ///\r\n    /// First, clamp the level of detail or sample index to fall within bounds.\r\n    /// Then, obtain the image size, possibly using the clamped level of detail.\r\n    /// Finally, use an unsigned minimum instruction to force all coordinates\r\n    /// into range.\r\n    ///\r\n    /// Return a triple `(COORDS, LEVEL, SAMPLE)`, where `COORDS` is a coordinate\r\n    /// vector (including the array index, if any), `LEVEL` is an optional level\r\n    /// of detail, and `SAMPLE` is an optional sample index, all guaranteed to\r\n    /// be in-bounds for `image_id`.\r\n    ///\r\n    /// The result is usually a vector, but it is a scalar when indexing\r\n    /// non-arrayed 1D images.\r\n    fn write_restricted_coordinates(\r\n        &mut self,\r\n        image_id: Word,\r\n        coordinates: ImageCoordinates,\r\n        level_id: Option<Word>,\r\n        sample_id: Option<Word>,\r\n        block: &mut Block,\r\n    ) -> Result<(Word, Option<Word>, Option<Word>), Error> {\r\n        self.writer.require_any(\r\n            \"the `Restrict` image bounds check policy\",\r\n            &[spirv::Capability::ImageQuery],\r\n        )?;\r\n\r\n        let i32_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Sint,\r\n            width: 4,\r\n            pointer_space: None,\r\n        }));\r\n\r\n        // If `level` is `Some`, clamp it to fall within bounds. This must\r\n        // happen first, because we'll use it to query the image size for\r\n        // clamping the actual coordinates.\r\n        let level_id = level_id\r\n            .map(|level_id| {\r\n                // Find the number of mipmap levels in this image.\r\n                let num_levels_id = self.gen_id();\r\n                block.body.push(Instruction::image_query(\r\n                    spirv::Op::ImageQueryLevels,\r\n                    i32_type_id,\r\n                    num_levels_id,\r\n                    image_id,\r\n                ));\r\n\r\n                self.restrict_scalar(i32_type_id, level_id, num_levels_id, block)\r\n            })\r\n            .transpose()?;\r\n\r\n        // If `sample_id` is `Some`, clamp it to fall within bounds.\r\n        let sample_id = sample_id\r\n            .map(|sample_id| {\r\n                // Find the number of samples per texel.\r\n                let num_samples_id = self.gen_id();\r\n                block.body.push(Instruction::image_query(\r\n                    spirv::Op::ImageQuerySamples,\r\n                    i32_type_id,\r\n                    num_samples_id,\r\n                    image_id,\r\n                ));\r\n\r\n                self.restrict_scalar(i32_type_id, sample_id, num_samples_id, block)\r\n            })\r\n            .transpose()?;\r\n\r\n        // Obtain the image bounds, including the array element count.\r\n        let coordinate_bounds_id =\r\n            self.write_coordinate_bounds(coordinates.type_id, image_id, level_id, block);\r\n\r\n        // Compute maximum valid values from the bounds.\r\n        let ones = self.write_coordinate_one(&coordinates)?;\r\n        let coordinate_limit_id = self.gen_id();\r\n        block.body.push(Instruction::binary(\r\n            spirv::Op::ISub,\r\n            coordinates.type_id,\r\n            coordinate_limit_id,\r\n            coordinate_bounds_id,\r\n            ones,\r\n        ));\r\n\r\n        // Restrict the coordinates to fall within those bounds.\r\n        //\r\n        // Use an unsigned minimum, to handle both positive out-of-range values\r\n        // and negative values in a single instruction: negative values of\r\n        // `coordinates` get treated as very large positive values.\r\n        let restricted_coordinates_id = self.gen_id();\r\n        block.body.push(Instruction::ext_inst(\r\n            self.writer.gl450_ext_inst_id,\r\n            spirv::GLOp::UMin,\r\n            coordinates.type_id,\r\n            restricted_coordinates_id,\r\n            &[coordinates.value_id, coordinate_limit_id],\r\n        ));\r\n\r\n        Ok((restricted_coordinates_id, level_id, sample_id))\r\n    }\r\n\r\n    fn write_conditional_image_access<A: Access>(\r\n        &mut self,\r\n        image_id: Word,\r\n        coordinates: ImageCoordinates,\r\n        level_id: Option<Word>,\r\n        sample_id: Option<Word>,\r\n        block: &mut Block,\r\n        access: &A,\r\n    ) -> Result<A::Output, Error> {\r\n        self.writer.require_any(\r\n            \"the `ReadZeroSkipWrite` image bounds check policy\",\r\n            &[spirv::Capability::ImageQuery],\r\n        )?;\r\n\r\n        let bool_type_id = self.writer.get_bool_type_id();\r\n        let i32_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Sint,\r\n            width: 4,\r\n            pointer_space: None,\r\n        }));\r\n\r\n        let null_id = access.out_of_bounds_value(self);\r\n\r\n        let mut selection = Selection::start(block, access.result_type());\r\n\r\n        // If `level_id` is `Some`, check whether it is within bounds. This must\r\n        // happen first, because we'll be supplying this as an argument when we\r\n        // query the image size.\r\n        if let Some(level_id) = level_id {\r\n            // Find the number of mipmap levels in this image.\r\n            let num_levels_id = self.gen_id();\r\n            selection.block().body.push(Instruction::image_query(\r\n                spirv::Op::ImageQueryLevels,\r\n                i32_type_id,\r\n                num_levels_id,\r\n                image_id,\r\n            ));\r\n\r\n            let lod_cond_id = self.gen_id();\r\n            selection.block().body.push(Instruction::binary(\r\n                spirv::Op::ULessThan,\r\n                bool_type_id,\r\n                lod_cond_id,\r\n                level_id,\r\n                num_levels_id,\r\n            ));\r\n\r\n            selection.if_true(self, lod_cond_id, null_id);\r\n        }\r\n\r\n        // If `sample_id` is `Some`, check whether it is in bounds.\r\n        if let Some(sample_id) = sample_id {\r\n            // Find the number of samples per texel.\r\n            let num_samples_id = self.gen_id();\r\n            selection.block().body.push(Instruction::image_query(\r\n                spirv::Op::ImageQuerySamples,\r\n                i32_type_id,\r\n                num_samples_id,\r\n                image_id,\r\n            ));\r\n\r\n            let samples_cond_id = self.gen_id();\r\n            selection.block().body.push(Instruction::binary(\r\n                spirv::Op::ULessThan,\r\n                bool_type_id,\r\n                samples_cond_id,\r\n                sample_id,\r\n                num_samples_id,\r\n            ));\r\n\r\n            selection.if_true(self, samples_cond_id, null_id);\r\n        }\r\n\r\n        // Obtain the image bounds, including any array element count.\r\n        let coordinate_bounds_id = self.write_coordinate_bounds(\r\n            coordinates.type_id,\r\n            image_id,\r\n            level_id,\r\n            selection.block(),\r\n        );\r\n\r\n        // Compare the coordinates against the bounds.\r\n        let coords_bool_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: coordinates.size,\r\n            kind: crate::ScalarKind::Bool,\r\n            width: 1,\r\n            pointer_space: None,\r\n        }));\r\n        let coords_conds_id = self.gen_id();\r\n        selection.block().body.push(Instruction::binary(\r\n            spirv::Op::ULessThan,\r\n            coords_bool_type_id,\r\n            coords_conds_id,\r\n            coordinates.value_id,\r\n            coordinate_bounds_id,\r\n        ));\r\n\r\n        // If the comparison above was a vector comparison, then we need to\r\n        // check that all components of the comparison are true.\r\n        let coords_cond_id = if coords_bool_type_id != bool_type_id {\r\n            let id = self.gen_id();\r\n            selection.block().body.push(Instruction::relational(\r\n                spirv::Op::All,\r\n                bool_type_id,\r\n                id,\r\n                coords_conds_id,\r\n            ));\r\n            id\r\n        } else {\r\n            coords_conds_id\r\n        };\r\n\r\n        selection.if_true(self, coords_cond_id, null_id);\r\n\r\n        // All conditions are met. We can carry out the access.\r\n        let texel_id = access.generate(\r\n            &mut self.writer.id_gen,\r\n            coordinates.value_id,\r\n            level_id,\r\n            sample_id,\r\n            selection.block(),\r\n        );\r\n\r\n        // This, then, is the value of the 'true' branch.\r\n        Ok(selection.finish(self, texel_id))\r\n    }\r\n\r\n    /// Generate code for an `ImageLoad` expression.\r\n    ///\r\n    /// The arguments are the components of an `Expression::ImageLoad` variant.\r\n    #[allow(clippy::too_many_arguments)]\r\n    pub(super) fn write_image_load(\r\n        &mut self,\r\n        result_type_id: Word,\r\n        image: Handle<crate::Expression>,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        level: Option<Handle<crate::Expression>>,\r\n        sample: Option<Handle<crate::Expression>>,\r\n        block: &mut Block,\r\n    ) -> Result<Word, Error> {\r\n        let image_id = self.get_image_id(image);\r\n        let image_type = self.fun_info[image].ty.inner_with(&self.ir_module.types);\r\n        let image_class = match *image_type {\r\n            crate::TypeInner::Image { class, .. } => class,\r\n            _ => return Err(Error::Validation(\"image type\")),\r\n        };\r\n\r\n        let access = Load::from_image_expr(self, image_id, image_class, result_type_id)?;\r\n        let coordinates = self.write_image_coordinates(coordinate, array_index, block)?;\r\n\r\n        let level_id = level.map(|expr| self.cached[expr]);\r\n        let sample_id = sample.map(|expr| self.cached[expr]);\r\n\r\n        // Perform the access, according to the bounds check policy.\r\n        let access_id = match self.writer.bounds_check_policies.image {\r\n            crate::proc::BoundsCheckPolicy::Restrict => {\r\n                let (coords, level_id, sample_id) = self.write_restricted_coordinates(\r\n                    image_id,\r\n                    coordinates,\r\n                    level_id,\r\n                    sample_id,\r\n                    block,\r\n                )?;\r\n                access.generate(&mut self.writer.id_gen, coords, level_id, sample_id, block)\r\n            }\r\n            crate::proc::BoundsCheckPolicy::ReadZeroSkipWrite => self\r\n                .write_conditional_image_access(\r\n                    image_id,\r\n                    coordinates,\r\n                    level_id,\r\n                    sample_id,\r\n                    block,\r\n                    &access,\r\n                )?,\r\n            crate::proc::BoundsCheckPolicy::Unchecked => access.generate(\r\n                &mut self.writer.id_gen,\r\n                coordinates.value_id,\r\n                level_id,\r\n                sample_id,\r\n                block,\r\n            ),\r\n        };\r\n\r\n        // For depth images, `ImageLoad` expressions produce a single f32,\r\n        // whereas the SPIR-V instructions always produce a vec4. So we may have\r\n        // to pull out the component we need.\r\n        let result_id = if result_type_id == access.result_type() {\r\n            // The instruction produced the type we expected. We can use\r\n            // its result as-is.\r\n            access_id\r\n        } else {\r\n            // For `ImageClass::Depth` images, SPIR-V gave us four components,\r\n            // but we only want the first one.\r\n            let component_id = self.gen_id();\r\n            block.body.push(Instruction::composite_extract(\r\n                result_type_id,\r\n                component_id,\r\n                access_id,\r\n                &[0],\r\n            ));\r\n            component_id\r\n        };\r\n\r\n        Ok(result_id)\r\n    }\r\n\r\n    /// Generate code for an `ImageSample` expression.\r\n    ///\r\n    /// The arguments are the components of an `Expression::ImageSample` variant.\r\n    #[allow(clippy::too_many_arguments)]\r\n    pub(super) fn write_image_sample(\r\n        &mut self,\r\n        result_type_id: Word,\r\n        image: Handle<crate::Expression>,\r\n        sampler: Handle<crate::Expression>,\r\n        gather: Option<crate::SwizzleComponent>,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        offset: Option<Handle<crate::Constant>>,\r\n        level: crate::SampleLevel,\r\n        depth_ref: Option<Handle<crate::Expression>>,\r\n        block: &mut Block,\r\n    ) -> Result<Word, Error> {\r\n        use super::instructions::SampleLod;\r\n        // image\r\n        let image_id = self.get_image_id(image);\r\n        let image_type = self.fun_info[image].ty.handle().unwrap();\r\n        // SPIR-V doesn't know about our `Depth` class, and it returns\r\n        // `vec4<f32>`, so we need to grab the first component out of it.\r\n        let needs_sub_access = match self.ir_module.types[image_type].inner {\r\n            crate::TypeInner::Image {\r\n                class: crate::ImageClass::Depth { .. },\r\n                ..\r\n            } => depth_ref.is_none() && gather.is_none(),\r\n            _ => false,\r\n        };\r\n        let sample_result_type_id = if needs_sub_access {\r\n            self.get_type_id(LookupType::Local(LocalType::Value {\r\n                vector_size: Some(crate::VectorSize::Quad),\r\n                kind: crate::ScalarKind::Float,\r\n                width: 4,\r\n                pointer_space: None,\r\n            }))\r\n        } else {\r\n            result_type_id\r\n        };\r\n\r\n        // OpTypeSampledImage\r\n        let image_type_id = self.get_type_id(LookupType::Handle(image_type));\r\n        let sampled_image_type_id =\r\n            self.get_type_id(LookupType::Local(LocalType::SampledImage { image_type_id }));\r\n\r\n        let sampler_id = self.get_image_id(sampler);\r\n        let coordinates_id = self\r\n            .write_image_coordinates(coordinate, array_index, block)?\r\n            .value_id;\r\n\r\n        let sampled_image_id = self.gen_id();\r\n        block.body.push(Instruction::sampled_image(\r\n            sampled_image_type_id,\r\n            sampled_image_id,\r\n            image_id,\r\n            sampler_id,\r\n        ));\r\n        let id = self.gen_id();\r\n\r\n        let depth_id = depth_ref.map(|handle| self.cached[handle]);\r\n        let mut mask = spirv::ImageOperands::empty();\r\n        mask.set(spirv::ImageOperands::CONST_OFFSET, offset.is_some());\r\n\r\n        let mut main_instruction = match (level, gather) {\r\n            (_, Some(component)) => {\r\n                let component_id = self.get_index_constant(component as u32);\r\n                let mut inst = Instruction::image_gather(\r\n                    sample_result_type_id,\r\n                    id,\r\n                    sampled_image_id,\r\n                    coordinates_id,\r\n                    component_id,\r\n                    depth_id,\r\n                );\r\n                if !mask.is_empty() {\r\n                    inst.add_operand(mask.bits());\r\n                }\r\n                inst\r\n            }\r\n            (crate::SampleLevel::Zero, None) => {\r\n                let mut inst = Instruction::image_sample(\r\n                    sample_result_type_id,\r\n                    id,\r\n                    SampleLod::Explicit,\r\n                    sampled_image_id,\r\n                    coordinates_id,\r\n                    depth_id,\r\n                );\r\n\r\n                let zero_id = self\r\n                    .writer\r\n                    .get_constant_scalar(crate::ScalarValue::Float(0.0), 4);\r\n\r\n                mask |= spirv::ImageOperands::LOD;\r\n                inst.add_operand(mask.bits());\r\n                inst.add_operand(zero_id);\r\n\r\n                inst\r\n            }\r\n            (crate::SampleLevel::Auto, None) => {\r\n                let mut inst = Instruction::image_sample(\r\n                    sample_result_type_id,\r\n                    id,\r\n                    SampleLod::Implicit,\r\n                    sampled_image_id,\r\n                    coordinates_id,\r\n                    depth_id,\r\n                );\r\n                if !mask.is_empty() {\r\n                    inst.add_operand(mask.bits());\r\n                }\r\n                inst\r\n            }\r\n            (crate::SampleLevel::Exact(lod_handle), None) => {\r\n                let mut inst = Instruction::image_sample(\r\n                    sample_result_type_id,\r\n                    id,\r\n                    SampleLod::Explicit,\r\n                    sampled_image_id,\r\n                    coordinates_id,\r\n                    depth_id,\r\n                );\r\n\r\n                let lod_id = self.cached[lod_handle];\r\n                mask |= spirv::ImageOperands::LOD;\r\n                inst.add_operand(mask.bits());\r\n                inst.add_operand(lod_id);\r\n\r\n                inst\r\n            }\r\n            (crate::SampleLevel::Bias(bias_handle), None) => {\r\n                let mut inst = Instruction::image_sample(\r\n                    sample_result_type_id,\r\n                    id,\r\n                    SampleLod::Implicit,\r\n                    sampled_image_id,\r\n                    coordinates_id,\r\n                    depth_id,\r\n                );\r\n\r\n                let bias_id = self.cached[bias_handle];\r\n                mask |= spirv::ImageOperands::BIAS;\r\n                inst.add_operand(mask.bits());\r\n                inst.add_operand(bias_id);\r\n\r\n                inst\r\n            }\r\n            (crate::SampleLevel::Gradient { x, y }, None) => {\r\n                let mut inst = Instruction::image_sample(\r\n                    sample_result_type_id,\r\n                    id,\r\n                    SampleLod::Explicit,\r\n                    sampled_image_id,\r\n                    coordinates_id,\r\n                    depth_id,\r\n                );\r\n\r\n                let x_id = self.cached[x];\r\n                let y_id = self.cached[y];\r\n                mask |= spirv::ImageOperands::GRAD;\r\n                inst.add_operand(mask.bits());\r\n                inst.add_operand(x_id);\r\n                inst.add_operand(y_id);\r\n\r\n                inst\r\n            }\r\n        };\r\n\r\n        if let Some(offset_const) = offset {\r\n            let offset_id = self.writer.constant_ids[offset_const.index()];\r\n            main_instruction.add_operand(offset_id);\r\n        }\r\n\r\n        block.body.push(main_instruction);\r\n\r\n        let id = if needs_sub_access {\r\n            let sub_id = self.gen_id();\r\n            block.body.push(Instruction::composite_extract(\r\n                result_type_id,\r\n                sub_id,\r\n                id,\r\n                &[0],\r\n            ));\r\n            sub_id\r\n        } else {\r\n            id\r\n        };\r\n\r\n        Ok(id)\r\n    }\r\n\r\n    /// Generate code for an `ImageQuery` expression.\r\n    ///\r\n    /// The arguments are the components of an `Expression::ImageQuery` variant.\r\n    pub(super) fn write_image_query(\r\n        &mut self,\r\n        result_type_id: Word,\r\n        image: Handle<crate::Expression>,\r\n        query: crate::ImageQuery,\r\n        block: &mut Block,\r\n    ) -> Result<Word, Error> {\r\n        use crate::{ImageClass as Ic, ImageDimension as Id, ImageQuery as Iq};\r\n\r\n        let image_id = self.get_image_id(image);\r\n        let image_type = self.fun_info[image].ty.handle().unwrap();\r\n        let (dim, arrayed, class) = match self.ir_module.types[image_type].inner {\r\n            crate::TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class,\r\n            } => (dim, arrayed, class),\r\n            _ => {\r\n                return Err(Error::Validation(\"image type\"));\r\n            }\r\n        };\r\n\r\n        self.writer\r\n            .require_any(\"image queries\", &[spirv::Capability::ImageQuery])?;\r\n\r\n        let id = match query {\r\n            Iq::Size { level } => {\r\n                let dim_coords = match dim {\r\n                    Id::D1 => 1,\r\n                    Id::D2 | Id::Cube => 2,\r\n                    Id::D3 => 3,\r\n                };\r\n                let extended_size_type_id = {\r\n                    let array_coords = if arrayed { 1 } else { 0 };\r\n                    let vector_size = match dim_coords + array_coords {\r\n                        2 => Some(crate::VectorSize::Bi),\r\n                        3 => Some(crate::VectorSize::Tri),\r\n                        4 => Some(crate::VectorSize::Quad),\r\n                        _ => None,\r\n                    };\r\n                    self.get_type_id(LookupType::Local(LocalType::Value {\r\n                        vector_size,\r\n                        kind: crate::ScalarKind::Sint,\r\n                        width: 4,\r\n                        pointer_space: None,\r\n                    }))\r\n                };\r\n\r\n                let (query_op, level_id) = match class {\r\n                    Ic::Sampled { multi: true, .. }\r\n                    | Ic::Depth { multi: true }\r\n                    | Ic::Storage { .. } => (spirv::Op::ImageQuerySize, None),\r\n                    _ => {\r\n                        let level_id = match level {\r\n                            Some(expr) => self.cached[expr],\r\n                            None => self.get_index_constant(0),\r\n                        };\r\n                        (spirv::Op::ImageQuerySizeLod, Some(level_id))\r\n                    }\r\n                };\r\n\r\n                // The ID of the vector returned by SPIR-V, which contains the dimensions\r\n                // as well as the layer count.\r\n                let id_extended = self.gen_id();\r\n                let mut inst = Instruction::image_query(\r\n                    query_op,\r\n                    extended_size_type_id,\r\n                    id_extended,\r\n                    image_id,\r\n                );\r\n                if let Some(expr_id) = level_id {\r\n                    inst.add_operand(expr_id);\r\n                }\r\n                block.body.push(inst);\r\n\r\n                if result_type_id != extended_size_type_id {\r\n                    let id = self.gen_id();\r\n                    let components = match dim {\r\n                        // always pick the first component, and duplicate it for all 3 dimensions\r\n                        Id::Cube => &[0u32, 0][..],\r\n                        _ => &[0u32, 1, 2, 3][..dim_coords],\r\n                    };\r\n                    block.body.push(Instruction::vector_shuffle(\r\n                        result_type_id,\r\n                        id,\r\n                        id_extended,\r\n                        id_extended,\r\n                        components,\r\n                    ));\r\n                    id\r\n                } else {\r\n                    id_extended\r\n                }\r\n            }\r\n            Iq::NumLevels => {\r\n                let id = self.gen_id();\r\n                block.body.push(Instruction::image_query(\r\n                    spirv::Op::ImageQueryLevels,\r\n                    result_type_id,\r\n                    id,\r\n                    image_id,\r\n                ));\r\n                id\r\n            }\r\n            Iq::NumLayers => {\r\n                let vec_size = match dim {\r\n                    Id::D1 => crate::VectorSize::Bi,\r\n                    Id::D2 | Id::Cube => crate::VectorSize::Tri,\r\n                    Id::D3 => crate::VectorSize::Quad,\r\n                };\r\n                let extended_size_type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n                    vector_size: Some(vec_size),\r\n                    kind: crate::ScalarKind::Sint,\r\n                    width: 4,\r\n                    pointer_space: None,\r\n                }));\r\n                let id_extended = self.gen_id();\r\n                let mut inst = Instruction::image_query(\r\n                    spirv::Op::ImageQuerySizeLod,\r\n                    extended_size_type_id,\r\n                    id_extended,\r\n                    image_id,\r\n                );\r\n                inst.add_operand(self.get_index_constant(0));\r\n                block.body.push(inst);\r\n                let id = self.gen_id();\r\n                block.body.push(Instruction::composite_extract(\r\n                    result_type_id,\r\n                    id,\r\n                    id_extended,\r\n                    &[vec_size as u32 - 1],\r\n                ));\r\n                id\r\n            }\r\n            Iq::NumSamples => {\r\n                let id = self.gen_id();\r\n                block.body.push(Instruction::image_query(\r\n                    spirv::Op::ImageQuerySamples,\r\n                    result_type_id,\r\n                    id,\r\n                    image_id,\r\n                ));\r\n                id\r\n            }\r\n        };\r\n\r\n        Ok(id)\r\n    }\r\n\r\n    pub(super) fn write_image_store(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        coordinate: Handle<crate::Expression>,\r\n        array_index: Option<Handle<crate::Expression>>,\r\n        value: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<(), Error> {\r\n        let image_id = self.get_image_id(image);\r\n        let coordinates = self.write_image_coordinates(coordinate, array_index, block)?;\r\n        let value_id = self.cached[value];\r\n\r\n        let write = Store { image_id, value_id };\r\n\r\n        match self.writer.bounds_check_policies.image {\r\n            crate::proc::BoundsCheckPolicy::Restrict => {\r\n                let (coords, _, _) =\r\n                    self.write_restricted_coordinates(image_id, coordinates, None, None, block)?;\r\n                write.generate(&mut self.writer.id_gen, coords, None, None, block);\r\n            }\r\n            crate::proc::BoundsCheckPolicy::ReadZeroSkipWrite => {\r\n                self.write_conditional_image_access(\r\n                    image_id,\r\n                    coordinates,\r\n                    None,\r\n                    None,\r\n                    block,\r\n                    &write,\r\n                )?;\r\n            }\r\n            crate::proc::BoundsCheckPolicy::Unchecked => {\r\n                write.generate(\r\n                    &mut self.writer.id_gen,\r\n                    coordinates.value_id,\r\n                    None,\r\n                    None,\r\n                    block,\r\n                );\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/index.rs",
    "content": "/*!\r\nBounds-checking for SPIR-V output.\r\n*/\r\n\r\nuse super::{\r\n    helpers::global_needs_wrapper, selection::Selection, Block, BlockContext, Error, IdGenerator,\r\n    Instruction, Word,\r\n};\r\nuse crate::{arena::Handle, proc::BoundsCheckPolicy};\r\n\r\n/// The results of performing a bounds check.\r\n///\r\n/// On success, `write_bounds_check` returns a value of this type.\r\npub(super) enum BoundsCheckResult {\r\n    /// The index is statically known and in bounds, with the given value.\r\n    KnownInBounds(u32),\r\n\r\n    /// The given instruction computes the index to be used.\r\n    Computed(Word),\r\n\r\n    /// The given instruction computes a boolean condition which is true\r\n    /// if the index is in bounds.\r\n    Conditional(Word),\r\n}\r\n\r\n/// A value that we either know at translation time, or need to compute at runtime.\r\npub(super) enum MaybeKnown<T> {\r\n    /// The value is known at shader translation time.\r\n    Known(T),\r\n\r\n    /// The value is computed by the instruction with the given id.\r\n    Computed(Word),\r\n}\r\n\r\nimpl<'w> BlockContext<'w> {\r\n    /// Emit code to compute the length of a run-time array.\r\n    ///\r\n    /// Given `array`, an expression referring a runtime-sized array, return the\r\n    /// instruction id for the array's length.\r\n    pub(super) fn write_runtime_array_length(\r\n        &mut self,\r\n        array: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<Word, Error> {\r\n        // Naga IR permits runtime-sized arrays as global variables or as the\r\n        // final member of a struct that is a global variable. SPIR-V permits\r\n        // only the latter, so this back end wraps bare runtime-sized arrays\r\n        // in a made-up struct; see `helpers::global_needs_wrapper` and its uses.\r\n        // This code must handle both cases.\r\n        let (structure_id, last_member_index) = match self.ir_function.expressions[array] {\r\n            crate::Expression::AccessIndex { base, index } => {\r\n                match self.ir_function.expressions[base] {\r\n                    crate::Expression::GlobalVariable(handle) => (\r\n                        self.writer.global_variables[handle.index()].access_id,\r\n                        index,\r\n                    ),\r\n                    _ => return Err(Error::Validation(\"array length expression\")),\r\n                }\r\n            }\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                let global = &self.ir_module.global_variables[handle];\r\n                if !global_needs_wrapper(self.ir_module, global) {\r\n                    return Err(Error::Validation(\"array length expression\"));\r\n                }\r\n\r\n                (self.writer.global_variables[handle.index()].var_id, 0)\r\n            }\r\n            _ => return Err(Error::Validation(\"array length expression\")),\r\n        };\r\n\r\n        let length_id = self.gen_id();\r\n        block.body.push(Instruction::array_length(\r\n            self.writer.get_uint_type_id(),\r\n            length_id,\r\n            structure_id,\r\n            last_member_index,\r\n        ));\r\n\r\n        Ok(length_id)\r\n    }\r\n\r\n    /// Compute the length of a subscriptable value.\r\n    ///\r\n    /// Given `sequence`, an expression referring to some indexable type, return\r\n    /// its length. The result may either be computed by SPIR-V instructions, or\r\n    /// known at shader translation time.\r\n    ///\r\n    /// `sequence` may be a `Vector`, `Matrix`, or `Array`, a `Pointer` to any\r\n    /// of those, or a `ValuePointer`. An array may be fixed-size, dynamically\r\n    /// sized, or use a specializable constant as its length.\r\n    fn write_sequence_length(\r\n        &mut self,\r\n        sequence: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<MaybeKnown<u32>, Error> {\r\n        let sequence_ty = self.fun_info[sequence].ty.inner_with(&self.ir_module.types);\r\n        match sequence_ty.indexable_length(self.ir_module) {\r\n            Ok(crate::proc::IndexableLength::Known(known_length)) => {\r\n                Ok(MaybeKnown::Known(known_length))\r\n            }\r\n            Ok(crate::proc::IndexableLength::Dynamic) => {\r\n                let length_id = self.write_runtime_array_length(sequence, block)?;\r\n                Ok(MaybeKnown::Computed(length_id))\r\n            }\r\n            Err(err) => {\r\n                log::error!(\"Sequence length for {:?} failed: {}\", sequence, err);\r\n                Err(Error::Validation(\"indexable length\"))\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Compute the maximum valid index of a subscriptable value.\r\n    ///\r\n    /// Given `sequence`, an expression referring to some indexable type, return\r\n    /// its maximum valid index - one less than its length. The result may\r\n    /// either be computed, or known at shader translation time.\r\n    ///\r\n    /// `sequence` may be a `Vector`, `Matrix`, or `Array`, a `Pointer` to any\r\n    /// of those, or a `ValuePointer`. An array may be fixed-size, dynamically\r\n    /// sized, or use a specializable constant as its length.\r\n    fn write_sequence_max_index(\r\n        &mut self,\r\n        sequence: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<MaybeKnown<u32>, Error> {\r\n        match self.write_sequence_length(sequence, block)? {\r\n            MaybeKnown::Known(known_length) => {\r\n                // We should have thrown out all attempts to subscript zero-length\r\n                // sequences during validation, so the following subtraction should never\r\n                // underflow.\r\n                assert!(known_length > 0);\r\n                // Compute the max index from the length now.\r\n                Ok(MaybeKnown::Known(known_length - 1))\r\n            }\r\n            MaybeKnown::Computed(length_id) => {\r\n                // Emit code to compute the max index from the length.\r\n                let const_one_id = self.get_index_constant(1);\r\n                let max_index_id = self.gen_id();\r\n                block.body.push(Instruction::binary(\r\n                    spirv::Op::ISub,\r\n                    self.writer.get_uint_type_id(),\r\n                    max_index_id,\r\n                    length_id,\r\n                    const_one_id,\r\n                ));\r\n                Ok(MaybeKnown::Computed(max_index_id))\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Restrict an index to be in range for a vector, matrix, or array.\r\n    ///\r\n    /// This is used to implement `BoundsCheckPolicy::Restrict`. An in-bounds\r\n    /// index is left unchanged. An out-of-bounds index is replaced with some\r\n    /// arbitrary in-bounds index. Note,this is not necessarily clamping; for\r\n    /// example, negative indices might be changed to refer to the last element\r\n    /// of the sequence, not the first, as clamping would do.\r\n    ///\r\n    /// Either return the restricted index value, if known, or add instructions\r\n    /// to `block` to compute it, and return the id of the result. See the\r\n    /// documentation for `BoundsCheckResult` for details.\r\n    ///\r\n    /// The `sequence` expression may be a `Vector`, `Matrix`, or `Array`, a\r\n    /// `Pointer` to any of those, or a `ValuePointer`. An array may be\r\n    /// fixed-size, dynamically sized, or use a specializable constant as its\r\n    /// length.\r\n    pub(super) fn write_restricted_index(\r\n        &mut self,\r\n        sequence: Handle<crate::Expression>,\r\n        index: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<BoundsCheckResult, Error> {\r\n        let index_id = self.cached[index];\r\n\r\n        // Get the sequence's maximum valid index. Return early if we've already\r\n        // done the bounds check.\r\n        let max_index_id = match self.write_sequence_max_index(sequence, block)? {\r\n            MaybeKnown::Known(known_max_index) => {\r\n                if let crate::Expression::Constant(index_k) = self.ir_function.expressions[index] {\r\n                    if let Some(known_index) = self.ir_module.constants[index_k].to_array_length() {\r\n                        // Both the index and length are known at compile time.\r\n                        //\r\n                        // In strict WGSL compliance mode, out-of-bounds indices cannot be\r\n                        // reported at shader translation time, and must be replaced with\r\n                        // in-bounds indices at run time. So we cannot assume that\r\n                        // validation ensured the index was in bounds. Restrict now.\r\n                        let restricted = std::cmp::min(known_index, known_max_index);\r\n                        return Ok(BoundsCheckResult::KnownInBounds(restricted));\r\n                    }\r\n                }\r\n\r\n                self.get_index_constant(known_max_index)\r\n            }\r\n            MaybeKnown::Computed(max_index_id) => max_index_id,\r\n        };\r\n\r\n        // One or the other of the index or length is dynamic, so emit code for\r\n        // BoundsCheckPolicy::Restrict.\r\n        let restricted_index_id = self.gen_id();\r\n        block.body.push(Instruction::ext_inst(\r\n            self.writer.gl450_ext_inst_id,\r\n            spirv::GLOp::UMin,\r\n            self.writer.get_uint_type_id(),\r\n            restricted_index_id,\r\n            &[index_id, max_index_id],\r\n        ));\r\n        Ok(BoundsCheckResult::Computed(restricted_index_id))\r\n    }\r\n\r\n    /// Write an index bounds comparison to `block`, if needed.\r\n    ///\r\n    /// If we're able to determine statically that `index` is in bounds for\r\n    /// `sequence`, return `KnownInBounds(value)`, where `value` is the actual\r\n    /// value of the index. (In principle, one could know that the index is in\r\n    /// bounds without knowing its specific value, but in our simple-minded\r\n    /// situation, we always know it.)\r\n    ///\r\n    /// If instead we must generate code to perform the comparison at run time,\r\n    /// return `Conditional(comparison_id)`, where `comparison_id` is an\r\n    /// instruction producing a boolean value that is true if `index` is in\r\n    /// bounds for `sequence`.\r\n    ///\r\n    /// The `sequence` expression may be a `Vector`, `Matrix`, or `Array`, a\r\n    /// `Pointer` to any of those, or a `ValuePointer`. An array may be\r\n    /// fixed-size, dynamically sized, or use a specializable constant as its\r\n    /// length.\r\n    fn write_index_comparison(\r\n        &mut self,\r\n        sequence: Handle<crate::Expression>,\r\n        index: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<BoundsCheckResult, Error> {\r\n        let index_id = self.cached[index];\r\n\r\n        // Get the sequence's length. Return early if we've already done the\r\n        // bounds check.\r\n        let length_id = match self.write_sequence_length(sequence, block)? {\r\n            MaybeKnown::Known(known_length) => {\r\n                if let crate::Expression::Constant(index_k) = self.ir_function.expressions[index] {\r\n                    if let Some(known_index) = self.ir_module.constants[index_k].to_array_length() {\r\n                        // Both the index and length are known at compile time.\r\n                        //\r\n                        // It would be nice to assume that, since we are using the\r\n                        // `ReadZeroSkipWrite` policy, we are not in strict WGSL\r\n                        // compliance mode, and thus we can count on the validator to have\r\n                        // rejected any programs with known out-of-bounds indices, and\r\n                        // thus just return `KnownInBounds` here without actually\r\n                        // checking.\r\n                        //\r\n                        // But it's also reasonable to expect that bounds check policies\r\n                        // and error reporting policies should be able to vary\r\n                        // independently without introducing security holes. So, we should\r\n                        // support the case where bad indices do not cause validation\r\n                        // errors, and are handled via `ReadZeroSkipWrite`.\r\n                        //\r\n                        // In theory, when `known_index` is bad, we could return a new\r\n                        // `KnownOutOfBounds` variant here. But it's simpler just to fall\r\n                        // through and let the bounds check take place. The shader is\r\n                        // broken anyway, so it doesn't make sense to invest in emitting\r\n                        // the ideal code for it.\r\n                        if known_index < known_length {\r\n                            return Ok(BoundsCheckResult::KnownInBounds(known_index));\r\n                        }\r\n                    }\r\n                }\r\n\r\n                self.get_index_constant(known_length)\r\n            }\r\n            MaybeKnown::Computed(length_id) => length_id,\r\n        };\r\n\r\n        // Compare the index against the length.\r\n        let condition_id = self.gen_id();\r\n        block.body.push(Instruction::binary(\r\n            spirv::Op::ULessThan,\r\n            self.writer.get_bool_type_id(),\r\n            condition_id,\r\n            index_id,\r\n            length_id,\r\n        ));\r\n\r\n        // Indicate that we did generate the check.\r\n        Ok(BoundsCheckResult::Conditional(condition_id))\r\n    }\r\n\r\n    /// Emit a conditional load for `BoundsCheckPolicy::ReadZeroSkipWrite`.\r\n    ///\r\n    /// Generate code to load a value of `result_type` if `condition` is true,\r\n    /// and generate a null value of that type if it is false. Call `emit_load`\r\n    /// to emit the instructions to perform the load. Return the id of the\r\n    /// merged value of the two branches.\r\n    pub(super) fn write_conditional_indexed_load<F>(\r\n        &mut self,\r\n        result_type: Word,\r\n        condition: Word,\r\n        block: &mut Block,\r\n        emit_load: F,\r\n    ) -> Word\r\n    where\r\n        F: FnOnce(&mut IdGenerator, &mut Block) -> Word,\r\n    {\r\n        // For the out-of-bounds case, we produce a zero value.\r\n        let null_id = self.writer.write_constant_null(result_type);\r\n\r\n        let mut selection = Selection::start(block, result_type);\r\n\r\n        // As it turns out, we don't actually need a full 'if-then-else'\r\n        // structure for this: SPIR-V constants are declared up front, so the\r\n        // 'else' block would have no instructions. Instead we emit something\r\n        // like this:\r\n        //\r\n        //     result = zero;\r\n        //     if in_bounds {\r\n        //         result = do the load;\r\n        //     }\r\n        //     use result;\r\n\r\n        // Continue only if the index was in bounds. Otherwise, branch to the\r\n        // merge block.\r\n        selection.if_true(self, condition, null_id);\r\n\r\n        // The in-bounds path. Perform the access and the load.\r\n        let loaded_value = emit_load(&mut self.writer.id_gen, selection.block());\r\n\r\n        selection.finish(self, loaded_value)\r\n    }\r\n\r\n    /// Emit code for bounds checks for an array, vector, or matrix access.\r\n    ///\r\n    /// This implements either `index_bounds_check_policy` or\r\n    /// `buffer_bounds_check_policy`, depending on the address space of the\r\n    /// pointer being accessed.\r\n    ///\r\n    /// Return a `BoundsCheckResult` indicating how the index should be\r\n    /// consumed. See that type's documentation for details.\r\n    pub(super) fn write_bounds_check(\r\n        &mut self,\r\n        base: Handle<crate::Expression>,\r\n        index: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<BoundsCheckResult, Error> {\r\n        let policy = self.writer.bounds_check_policies.choose_policy(\r\n            base,\r\n            &self.ir_module.types,\r\n            self.fun_info,\r\n        );\r\n\r\n        Ok(match policy {\r\n            BoundsCheckPolicy::Restrict => self.write_restricted_index(base, index, block)?,\r\n            BoundsCheckPolicy::ReadZeroSkipWrite => {\r\n                self.write_index_comparison(base, index, block)?\r\n            }\r\n            BoundsCheckPolicy::Unchecked => BoundsCheckResult::Computed(self.cached[index]),\r\n        })\r\n    }\r\n\r\n    /// Emit code to subscript a vector by value with a computed index.\r\n    ///\r\n    /// Return the id of the element value.\r\n    pub(super) fn write_vector_access(\r\n        &mut self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        base: Handle<crate::Expression>,\r\n        index: Handle<crate::Expression>,\r\n        block: &mut Block,\r\n    ) -> Result<Word, Error> {\r\n        let result_type_id = self.get_expression_type_id(&self.fun_info[expr_handle].ty);\r\n\r\n        let base_id = self.cached[base];\r\n        let index_id = self.cached[index];\r\n\r\n        let result_id = match self.write_bounds_check(base, index, block)? {\r\n            BoundsCheckResult::KnownInBounds(known_index) => {\r\n                let result_id = self.gen_id();\r\n                block.body.push(Instruction::composite_extract(\r\n                    result_type_id,\r\n                    result_id,\r\n                    base_id,\r\n                    &[known_index],\r\n                ));\r\n                result_id\r\n            }\r\n            BoundsCheckResult::Computed(computed_index_id) => {\r\n                let result_id = self.gen_id();\r\n                block.body.push(Instruction::vector_extract_dynamic(\r\n                    result_type_id,\r\n                    result_id,\r\n                    base_id,\r\n                    computed_index_id,\r\n                ));\r\n                result_id\r\n            }\r\n            BoundsCheckResult::Conditional(comparison_id) => {\r\n                // Run-time bounds checks were required. Emit\r\n                // conditional load.\r\n                self.write_conditional_indexed_load(\r\n                    result_type_id,\r\n                    comparison_id,\r\n                    block,\r\n                    |id_gen, block| {\r\n                        // The in-bounds path. Generate the access.\r\n                        let element_id = id_gen.next();\r\n                        block.body.push(Instruction::vector_extract_dynamic(\r\n                            result_type_id,\r\n                            element_id,\r\n                            base_id,\r\n                            index_id,\r\n                        ));\r\n                        element_id\r\n                    },\r\n                )\r\n            }\r\n        };\r\n\r\n        Ok(result_id)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/instructions.rs",
    "content": "use super::helpers;\r\nuse spirv::{Op, Word};\r\n\r\npub(super) enum Signedness {\r\n    Unsigned = 0,\r\n    Signed = 1,\r\n}\r\n\r\npub(super) enum SampleLod {\r\n    Explicit,\r\n    Implicit,\r\n}\r\n\r\npub(super) struct Case {\r\n    pub value: Word,\r\n    pub label_id: Word,\r\n}\r\n\r\nimpl super::Instruction {\r\n    //\r\n    //  Debug Instructions\r\n    //\r\n\r\n    pub(super) fn source(source_language: spirv::SourceLanguage, version: u32) -> Self {\r\n        let mut instruction = Self::new(Op::Source);\r\n        instruction.add_operand(source_language as u32);\r\n        instruction.add_operands(helpers::bytes_to_words(&version.to_le_bytes()));\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn name(target_id: Word, name: &str) -> Self {\r\n        let mut instruction = Self::new(Op::Name);\r\n        instruction.add_operand(target_id);\r\n        instruction.add_operands(helpers::string_to_words(name));\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn member_name(target_id: Word, member: Word, name: &str) -> Self {\r\n        let mut instruction = Self::new(Op::MemberName);\r\n        instruction.add_operand(target_id);\r\n        instruction.add_operand(member);\r\n        instruction.add_operands(helpers::string_to_words(name));\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Annotation Instructions\r\n    //\r\n\r\n    pub(super) fn decorate(\r\n        target_id: Word,\r\n        decoration: spirv::Decoration,\r\n        operands: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Decorate);\r\n        instruction.add_operand(target_id);\r\n        instruction.add_operand(decoration as u32);\r\n        for operand in operands {\r\n            instruction.add_operand(*operand)\r\n        }\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn member_decorate(\r\n        target_id: Word,\r\n        member_index: Word,\r\n        decoration: spirv::Decoration,\r\n        operands: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::MemberDecorate);\r\n        instruction.add_operand(target_id);\r\n        instruction.add_operand(member_index);\r\n        instruction.add_operand(decoration as u32);\r\n        for operand in operands {\r\n            instruction.add_operand(*operand)\r\n        }\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Extension Instructions\r\n    //\r\n\r\n    pub(super) fn extension(name: &str) -> Self {\r\n        let mut instruction = Self::new(Op::Extension);\r\n        instruction.add_operands(helpers::string_to_words(name));\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn ext_inst_import(id: Word, name: &str) -> Self {\r\n        let mut instruction = Self::new(Op::ExtInstImport);\r\n        instruction.set_result(id);\r\n        instruction.add_operands(helpers::string_to_words(name));\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn ext_inst(\r\n        set_id: Word,\r\n        op: spirv::GLOp,\r\n        result_type_id: Word,\r\n        id: Word,\r\n        operands: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::ExtInst);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(set_id);\r\n        instruction.add_operand(op as u32);\r\n        for operand in operands {\r\n            instruction.add_operand(*operand)\r\n        }\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Mode-Setting Instructions\r\n    //\r\n\r\n    pub(super) fn memory_model(\r\n        addressing_model: spirv::AddressingModel,\r\n        memory_model: spirv::MemoryModel,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::MemoryModel);\r\n        instruction.add_operand(addressing_model as u32);\r\n        instruction.add_operand(memory_model as u32);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn entry_point(\r\n        execution_model: spirv::ExecutionModel,\r\n        entry_point_id: Word,\r\n        name: &str,\r\n        interface_ids: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::EntryPoint);\r\n        instruction.add_operand(execution_model as u32);\r\n        instruction.add_operand(entry_point_id);\r\n        instruction.add_operands(helpers::string_to_words(name));\r\n\r\n        for interface_id in interface_ids {\r\n            instruction.add_operand(*interface_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn execution_mode(\r\n        entry_point_id: Word,\r\n        execution_mode: spirv::ExecutionMode,\r\n        args: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::ExecutionMode);\r\n        instruction.add_operand(entry_point_id);\r\n        instruction.add_operand(execution_mode as u32);\r\n        for arg in args {\r\n            instruction.add_operand(*arg);\r\n        }\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn capability(capability: spirv::Capability) -> Self {\r\n        let mut instruction = Self::new(Op::Capability);\r\n        instruction.add_operand(capability as u32);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Type-Declaration Instructions\r\n    //\r\n\r\n    pub(super) fn type_void(id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeVoid);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_bool(id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeBool);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_int(id: Word, width: Word, signedness: Signedness) -> Self {\r\n        let mut instruction = Self::new(Op::TypeInt);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(width);\r\n        instruction.add_operand(signedness as u32);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_float(id: Word, width: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeFloat);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(width);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_vector(\r\n        id: Word,\r\n        component_type_id: Word,\r\n        component_count: crate::VectorSize,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::TypeVector);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(component_type_id);\r\n        instruction.add_operand(component_count as u32);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_matrix(\r\n        id: Word,\r\n        column_type_id: Word,\r\n        column_count: crate::VectorSize,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::TypeMatrix);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(column_type_id);\r\n        instruction.add_operand(column_count as u32);\r\n        instruction\r\n    }\r\n\r\n    #[allow(clippy::too_many_arguments)]\r\n    pub(super) fn type_image(\r\n        id: Word,\r\n        sampled_type_id: Word,\r\n        dim: spirv::Dim,\r\n        flags: super::ImageTypeFlags,\r\n        image_format: spirv::ImageFormat,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::TypeImage);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(sampled_type_id);\r\n        instruction.add_operand(dim as u32);\r\n        instruction.add_operand(flags.contains(super::ImageTypeFlags::DEPTH) as u32);\r\n        instruction.add_operand(flags.contains(super::ImageTypeFlags::ARRAYED) as u32);\r\n        instruction.add_operand(flags.contains(super::ImageTypeFlags::MULTISAMPLED) as u32);\r\n        instruction.add_operand(if flags.contains(super::ImageTypeFlags::SAMPLED) {\r\n            1\r\n        } else {\r\n            2\r\n        });\r\n        instruction.add_operand(image_format as u32);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_sampler(id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeSampler);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_sampled_image(id: Word, image_type_id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeSampledImage);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(image_type_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_array(id: Word, element_type_id: Word, length_id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeArray);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(element_type_id);\r\n        instruction.add_operand(length_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_runtime_array(id: Word, element_type_id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::TypeRuntimeArray);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(element_type_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_struct(id: Word, member_ids: &[Word]) -> Self {\r\n        let mut instruction = Self::new(Op::TypeStruct);\r\n        instruction.set_result(id);\r\n\r\n        for member_id in member_ids {\r\n            instruction.add_operand(*member_id)\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_pointer(\r\n        id: Word,\r\n        storage_class: spirv::StorageClass,\r\n        type_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::TypePointer);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(storage_class as u32);\r\n        instruction.add_operand(type_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn type_function(id: Word, return_type_id: Word, parameter_ids: &[Word]) -> Self {\r\n        let mut instruction = Self::new(Op::TypeFunction);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(return_type_id);\r\n\r\n        for parameter_id in parameter_ids {\r\n            instruction.add_operand(*parameter_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Constant-Creation Instructions\r\n    //\r\n\r\n    pub(super) fn constant_null(result_type_id: Word, id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::ConstantNull);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn constant_true(result_type_id: Word, id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::ConstantTrue);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn constant_false(result_type_id: Word, id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::ConstantFalse);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn constant(result_type_id: Word, id: Word, values: &[Word]) -> Self {\r\n        let mut instruction = Self::new(Op::Constant);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n\r\n        for value in values {\r\n            instruction.add_operand(*value);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn constant_composite(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        constituent_ids: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::ConstantComposite);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n\r\n        for constituent_id in constituent_ids {\r\n            instruction.add_operand(*constituent_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Memory Instructions\r\n    //\r\n\r\n    pub(super) fn variable(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        storage_class: spirv::StorageClass,\r\n        initializer_id: Option<Word>,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Variable);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(storage_class as u32);\r\n\r\n        if let Some(initializer_id) = initializer_id {\r\n            instruction.add_operand(initializer_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn load(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        pointer_id: Word,\r\n        memory_access: Option<spirv::MemoryAccess>,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Load);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(pointer_id);\r\n\r\n        if let Some(memory_access) = memory_access {\r\n            instruction.add_operand(memory_access.bits());\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn atomic_load(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        pointer_id: Word,\r\n        scope_id: Word,\r\n        semantics_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::AtomicLoad);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(pointer_id);\r\n        instruction.add_operand(scope_id);\r\n        instruction.add_operand(semantics_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn store(\r\n        pointer_id: Word,\r\n        value_id: Word,\r\n        memory_access: Option<spirv::MemoryAccess>,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Store);\r\n        instruction.add_operand(pointer_id);\r\n        instruction.add_operand(value_id);\r\n\r\n        if let Some(memory_access) = memory_access {\r\n            instruction.add_operand(memory_access.bits());\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn atomic_store(\r\n        pointer_id: Word,\r\n        scope_id: Word,\r\n        semantics_id: Word,\r\n        value_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::AtomicStore);\r\n        instruction.add_operand(pointer_id);\r\n        instruction.add_operand(scope_id);\r\n        instruction.add_operand(semantics_id);\r\n        instruction.add_operand(value_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn access_chain(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        base_id: Word,\r\n        index_ids: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::AccessChain);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(base_id);\r\n\r\n        for index_id in index_ids {\r\n            instruction.add_operand(*index_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn array_length(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        structure_id: Word,\r\n        array_member: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::ArrayLength);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(structure_id);\r\n        instruction.add_operand(array_member);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Function Instructions\r\n    //\r\n\r\n    pub(super) fn function(\r\n        return_type_id: Word,\r\n        id: Word,\r\n        function_control: spirv::FunctionControl,\r\n        function_type_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Function);\r\n        instruction.set_type(return_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(function_control.bits());\r\n        instruction.add_operand(function_type_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn function_parameter(result_type_id: Word, id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::FunctionParameter);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) const fn function_end() -> Self {\r\n        Self::new(Op::FunctionEnd)\r\n    }\r\n\r\n    pub(super) fn function_call(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        function_id: Word,\r\n        argument_ids: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::FunctionCall);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(function_id);\r\n\r\n        for argument_id in argument_ids {\r\n            instruction.add_operand(*argument_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Image Instructions\r\n    //\r\n\r\n    pub(super) fn sampled_image(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        image: Word,\r\n        sampler: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::SampledImage);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(image);\r\n        instruction.add_operand(sampler);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn image_sample(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        lod: SampleLod,\r\n        sampled_image: Word,\r\n        coordinates: Word,\r\n        depth_ref: Option<Word>,\r\n    ) -> Self {\r\n        let op = match (lod, depth_ref) {\r\n            (SampleLod::Explicit, None) => Op::ImageSampleExplicitLod,\r\n            (SampleLod::Implicit, None) => Op::ImageSampleImplicitLod,\r\n            (SampleLod::Explicit, Some(_)) => Op::ImageSampleDrefExplicitLod,\r\n            (SampleLod::Implicit, Some(_)) => Op::ImageSampleDrefImplicitLod,\r\n        };\r\n\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(sampled_image);\r\n        instruction.add_operand(coordinates);\r\n        if let Some(dref) = depth_ref {\r\n            instruction.add_operand(dref);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn image_gather(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        sampled_image: Word,\r\n        coordinates: Word,\r\n        component_id: Word,\r\n        depth_ref: Option<Word>,\r\n    ) -> Self {\r\n        let op = match depth_ref {\r\n            None => Op::ImageGather,\r\n            Some(_) => Op::ImageDrefGather,\r\n        };\r\n\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(sampled_image);\r\n        instruction.add_operand(coordinates);\r\n        if let Some(dref) = depth_ref {\r\n            instruction.add_operand(dref);\r\n        } else {\r\n            instruction.add_operand(component_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn image_fetch_or_read(\r\n        op: Op,\r\n        result_type_id: Word,\r\n        id: Word,\r\n        image: Word,\r\n        coordinates: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(image);\r\n        instruction.add_operand(coordinates);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn image_write(image: Word, coordinates: Word, value: Word) -> Self {\r\n        let mut instruction = Self::new(Op::ImageWrite);\r\n        instruction.add_operand(image);\r\n        instruction.add_operand(coordinates);\r\n        instruction.add_operand(value);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn image_query(op: Op, result_type_id: Word, id: Word, image: Word) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(image);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Conversion Instructions\r\n    //\r\n    pub(super) fn unary(op: Op, result_type_id: Word, id: Word, value: Word) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(value);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Composite Instructions\r\n    //\r\n\r\n    pub(super) fn composite_construct(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        constituent_ids: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::CompositeConstruct);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n\r\n        for constituent_id in constituent_ids {\r\n            instruction.add_operand(*constituent_id);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn composite_extract(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        composite_id: Word,\r\n        indices: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::CompositeExtract);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n\r\n        instruction.add_operand(composite_id);\r\n        for index in indices {\r\n            instruction.add_operand(*index);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn vector_extract_dynamic(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        vector_id: Word,\r\n        index_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::VectorExtractDynamic);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n\r\n        instruction.add_operand(vector_id);\r\n        instruction.add_operand(index_id);\r\n\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn vector_shuffle(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        v1_id: Word,\r\n        v2_id: Word,\r\n        components: &[Word],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::VectorShuffle);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(v1_id);\r\n        instruction.add_operand(v2_id);\r\n\r\n        for &component in components {\r\n            instruction.add_operand(component);\r\n        }\r\n\r\n        instruction\r\n    }\r\n\r\n    //\r\n    // Arithmetic Instructions\r\n    //\r\n    pub(super) fn binary(\r\n        op: Op,\r\n        result_type_id: Word,\r\n        id: Word,\r\n        operand_1: Word,\r\n        operand_2: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(operand_1);\r\n        instruction.add_operand(operand_2);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn ternary(\r\n        op: Op,\r\n        result_type_id: Word,\r\n        id: Word,\r\n        operand_1: Word,\r\n        operand_2: Word,\r\n        operand_3: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(operand_1);\r\n        instruction.add_operand(operand_2);\r\n        instruction.add_operand(operand_3);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn quaternary(\r\n        op: Op,\r\n        result_type_id: Word,\r\n        id: Word,\r\n        operand_1: Word,\r\n        operand_2: Word,\r\n        operand_3: Word,\r\n        operand_4: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(operand_1);\r\n        instruction.add_operand(operand_2);\r\n        instruction.add_operand(operand_3);\r\n        instruction.add_operand(operand_4);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn relational(op: Op, result_type_id: Word, id: Word, expr_id: Word) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(expr_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn atomic_binary(\r\n        op: Op,\r\n        result_type_id: Word,\r\n        id: Word,\r\n        pointer: Word,\r\n        scope_id: Word,\r\n        semantics_id: Word,\r\n        value: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(pointer);\r\n        instruction.add_operand(scope_id);\r\n        instruction.add_operand(semantics_id);\r\n        instruction.add_operand(value);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn atomic_compare_exchange(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        pointer: Word,\r\n        scope_id: Word,\r\n        equal: Word,\r\n        unequal: Word,\r\n        value: Word,\r\n        comparator: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::AtomicCompareExchange);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(pointer);\r\n        instruction.add_operand(scope_id);\r\n        instruction.add_operand(equal);\r\n        instruction.add_operand(unequal);\r\n        instruction.add_operand(value);\r\n        instruction.add_operand(comparator);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    // Bit Instructions\r\n    //\r\n\r\n    //\r\n    // Relational and Logical Instructions\r\n    //\r\n\r\n    //\r\n    // Derivative Instructions\r\n    //\r\n\r\n    pub(super) fn derivative(op: Op, result_type_id: Word, id: Word, expr_id: Word) -> Self {\r\n        let mut instruction = Self::new(op);\r\n        instruction.set_type(result_type_id);\r\n        instruction.set_result(id);\r\n        instruction.add_operand(expr_id);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    // Control-Flow Instructions\r\n    //\r\n\r\n    pub(super) fn phi(\r\n        result_type_id: Word,\r\n        result_id: Word,\r\n        var_parent_pairs: &[(Word, Word)],\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Phi);\r\n        instruction.add_operand(result_type_id);\r\n        instruction.add_operand(result_id);\r\n        for &(variable, parent) in var_parent_pairs {\r\n            instruction.add_operand(variable);\r\n            instruction.add_operand(parent);\r\n        }\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn selection_merge(\r\n        merge_id: Word,\r\n        selection_control: spirv::SelectionControl,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::SelectionMerge);\r\n        instruction.add_operand(merge_id);\r\n        instruction.add_operand(selection_control.bits());\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn loop_merge(\r\n        merge_id: Word,\r\n        continuing_id: Word,\r\n        selection_control: spirv::SelectionControl,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::LoopMerge);\r\n        instruction.add_operand(merge_id);\r\n        instruction.add_operand(continuing_id);\r\n        instruction.add_operand(selection_control.bits());\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn label(id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::Label);\r\n        instruction.set_result(id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn branch(id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::Branch);\r\n        instruction.add_operand(id);\r\n        instruction\r\n    }\r\n\r\n    // TODO Branch Weights not implemented.\r\n    pub(super) fn branch_conditional(\r\n        condition_id: Word,\r\n        true_label: Word,\r\n        false_label: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::BranchConditional);\r\n        instruction.add_operand(condition_id);\r\n        instruction.add_operand(true_label);\r\n        instruction.add_operand(false_label);\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn switch(selector_id: Word, default_id: Word, cases: &[Case]) -> Self {\r\n        let mut instruction = Self::new(Op::Switch);\r\n        instruction.add_operand(selector_id);\r\n        instruction.add_operand(default_id);\r\n        for case in cases {\r\n            instruction.add_operand(case.value);\r\n            instruction.add_operand(case.label_id);\r\n        }\r\n        instruction\r\n    }\r\n\r\n    pub(super) fn select(\r\n        result_type_id: Word,\r\n        id: Word,\r\n        condition_id: Word,\r\n        accept_id: Word,\r\n        reject_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::Select);\r\n        instruction.add_operand(result_type_id);\r\n        instruction.add_operand(id);\r\n        instruction.add_operand(condition_id);\r\n        instruction.add_operand(accept_id);\r\n        instruction.add_operand(reject_id);\r\n        instruction\r\n    }\r\n\r\n    pub(super) const fn kill() -> Self {\r\n        Self::new(Op::Kill)\r\n    }\r\n\r\n    pub(super) const fn return_void() -> Self {\r\n        Self::new(Op::Return)\r\n    }\r\n\r\n    pub(super) fn return_value(value_id: Word) -> Self {\r\n        let mut instruction = Self::new(Op::ReturnValue);\r\n        instruction.add_operand(value_id);\r\n        instruction\r\n    }\r\n\r\n    //\r\n    //  Atomic Instructions\r\n    //\r\n\r\n    //\r\n    //  Primitive Instructions\r\n    //\r\n\r\n    // Barriers\r\n\r\n    pub(super) fn control_barrier(\r\n        exec_scope_id: Word,\r\n        mem_scope_id: Word,\r\n        semantics_id: Word,\r\n    ) -> Self {\r\n        let mut instruction = Self::new(Op::ControlBarrier);\r\n        instruction.add_operand(exec_scope_id);\r\n        instruction.add_operand(mem_scope_id);\r\n        instruction.add_operand(semantics_id);\r\n        instruction\r\n    }\r\n}\r\n\r\nimpl From<crate::StorageFormat> for spirv::ImageFormat {\r\n    fn from(format: crate::StorageFormat) -> Self {\r\n        use crate::StorageFormat as Sf;\r\n        match format {\r\n            Sf::R8Unorm => Self::R8,\r\n            Sf::R8Snorm => Self::R8Snorm,\r\n            Sf::R8Uint => Self::R8ui,\r\n            Sf::R8Sint => Self::R8i,\r\n            Sf::R16Uint => Self::R16ui,\r\n            Sf::R16Sint => Self::R16i,\r\n            Sf::R16Float => Self::R16f,\r\n            Sf::Rg8Unorm => Self::Rg8,\r\n            Sf::Rg8Snorm => Self::Rg8Snorm,\r\n            Sf::Rg8Uint => Self::Rg8ui,\r\n            Sf::Rg8Sint => Self::Rg8i,\r\n            Sf::R32Uint => Self::R32ui,\r\n            Sf::R32Sint => Self::R32i,\r\n            Sf::R32Float => Self::R32f,\r\n            Sf::Rg16Uint => Self::Rg16ui,\r\n            Sf::Rg16Sint => Self::Rg16i,\r\n            Sf::Rg16Float => Self::Rg16f,\r\n            Sf::Rgba8Unorm => Self::Rgba8,\r\n            Sf::Rgba8Snorm => Self::Rgba8Snorm,\r\n            Sf::Rgba8Uint => Self::Rgba8ui,\r\n            Sf::Rgba8Sint => Self::Rgba8i,\r\n            Sf::Rgb10a2Unorm => Self::Rgb10a2ui,\r\n            Sf::Rg11b10Float => Self::R11fG11fB10f,\r\n            Sf::Rg32Uint => Self::Rg32ui,\r\n            Sf::Rg32Sint => Self::Rg32i,\r\n            Sf::Rg32Float => Self::Rg32f,\r\n            Sf::Rgba16Uint => Self::Rgba16ui,\r\n            Sf::Rgba16Sint => Self::Rgba16i,\r\n            Sf::Rgba16Float => Self::Rgba16f,\r\n            Sf::Rgba32Uint => Self::Rgba32ui,\r\n            Sf::Rgba32Sint => Self::Rgba32i,\r\n            Sf::Rgba32Float => Self::Rgba32f,\r\n        }\r\n    }\r\n}\r\n\r\nimpl From<crate::ImageDimension> for spirv::Dim {\r\n    fn from(dim: crate::ImageDimension) -> Self {\r\n        use crate::ImageDimension as Id;\r\n        match dim {\r\n            Id::D1 => Self::Dim1D,\r\n            Id::D2 => Self::Dim2D,\r\n            Id::D3 => Self::Dim3D,\r\n            Id::Cube => Self::DimCube,\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/layout.rs",
    "content": "use super::{Instruction, LogicalLayout, PhysicalLayout};\r\nuse spirv::{Op, Word, MAGIC_NUMBER};\r\nuse std::iter;\r\n\r\n// https://github.com/KhronosGroup/SPIRV-Headers/pull/195\r\nconst GENERATOR: Word = 28;\r\n\r\nimpl PhysicalLayout {\r\n    pub(super) const fn new(version: Word) -> Self {\r\n        PhysicalLayout {\r\n            magic_number: MAGIC_NUMBER,\r\n            version,\r\n            generator: GENERATOR,\r\n            bound: 0,\r\n            instruction_schema: 0x0u32,\r\n        }\r\n    }\r\n\r\n    pub(super) fn in_words(&self, sink: &mut impl Extend<Word>) {\r\n        sink.extend(iter::once(self.magic_number));\r\n        sink.extend(iter::once(self.version));\r\n        sink.extend(iter::once(self.generator));\r\n        sink.extend(iter::once(self.bound));\r\n        sink.extend(iter::once(self.instruction_schema));\r\n    }\r\n}\r\n\r\nimpl super::recyclable::Recyclable for PhysicalLayout {\r\n    fn recycle(self) -> Self {\r\n        PhysicalLayout {\r\n            magic_number: self.magic_number,\r\n            version: self.version,\r\n            generator: self.generator,\r\n            instruction_schema: self.instruction_schema,\r\n            bound: 0,\r\n        }\r\n    }\r\n}\r\n\r\nimpl LogicalLayout {\r\n    pub(super) fn in_words(&self, sink: &mut impl Extend<Word>) {\r\n        sink.extend(self.capabilities.iter().cloned());\r\n        sink.extend(self.extensions.iter().cloned());\r\n        sink.extend(self.ext_inst_imports.iter().cloned());\r\n        sink.extend(self.memory_model.iter().cloned());\r\n        sink.extend(self.entry_points.iter().cloned());\r\n        sink.extend(self.execution_modes.iter().cloned());\r\n        sink.extend(self.debugs.iter().cloned());\r\n        sink.extend(self.annotations.iter().cloned());\r\n        sink.extend(self.declarations.iter().cloned());\r\n        sink.extend(self.function_declarations.iter().cloned());\r\n        sink.extend(self.function_definitions.iter().cloned());\r\n    }\r\n}\r\n\r\nimpl super::recyclable::Recyclable for LogicalLayout {\r\n    fn recycle(self) -> Self {\r\n        Self {\r\n            capabilities: self.capabilities.recycle(),\r\n            extensions: self.extensions.recycle(),\r\n            ext_inst_imports: self.ext_inst_imports.recycle(),\r\n            memory_model: self.memory_model.recycle(),\r\n            entry_points: self.entry_points.recycle(),\r\n            execution_modes: self.execution_modes.recycle(),\r\n            debugs: self.debugs.recycle(),\r\n            annotations: self.annotations.recycle(),\r\n            declarations: self.declarations.recycle(),\r\n            function_declarations: self.function_declarations.recycle(),\r\n            function_definitions: self.function_definitions.recycle(),\r\n        }\r\n    }\r\n}\r\n\r\nimpl Instruction {\r\n    pub(super) const fn new(op: Op) -> Self {\r\n        Instruction {\r\n            op,\r\n            wc: 1, // Always start at 1 for the first word (OP + WC),\r\n            type_id: None,\r\n            result_id: None,\r\n            operands: vec![],\r\n        }\r\n    }\r\n\r\n    #[allow(clippy::panic)]\r\n    pub(super) fn set_type(&mut self, id: Word) {\r\n        assert!(self.type_id.is_none(), \"Type can only be set once\");\r\n        self.type_id = Some(id);\r\n        self.wc += 1;\r\n    }\r\n\r\n    #[allow(clippy::panic)]\r\n    pub(super) fn set_result(&mut self, id: Word) {\r\n        assert!(self.result_id.is_none(), \"Result can only be set once\");\r\n        self.result_id = Some(id);\r\n        self.wc += 1;\r\n    }\r\n\r\n    pub(super) fn add_operand(&mut self, operand: Word) {\r\n        self.operands.push(operand);\r\n        self.wc += 1;\r\n    }\r\n\r\n    pub(super) fn add_operands(&mut self, operands: Vec<Word>) {\r\n        for operand in operands.into_iter() {\r\n            self.add_operand(operand)\r\n        }\r\n    }\r\n\r\n    pub(super) fn to_words(&self, sink: &mut impl Extend<Word>) {\r\n        sink.extend(Some(self.wc << 16 | self.op as u32));\r\n        sink.extend(self.type_id);\r\n        sink.extend(self.result_id);\r\n        sink.extend(self.operands.iter().cloned());\r\n    }\r\n}\r\n\r\nimpl Instruction {\r\n    #[cfg(test)]\r\n    fn validate(&self, words: &[Word]) {\r\n        let mut inst_index = 0;\r\n        let (wc, op) = ((words[inst_index] >> 16) as u16, words[inst_index] as u16);\r\n        inst_index += 1;\r\n\r\n        assert_eq!(wc, words.len() as u16);\r\n        assert_eq!(op, self.op as u16);\r\n\r\n        if self.type_id.is_some() {\r\n            assert_eq!(words[inst_index], self.type_id.unwrap());\r\n            inst_index += 1;\r\n        }\r\n\r\n        if self.result_id.is_some() {\r\n            assert_eq!(words[inst_index], self.result_id.unwrap());\r\n            inst_index += 1;\r\n        }\r\n\r\n        for (op_index, i) in (inst_index..wc as usize).enumerate() {\r\n            assert_eq!(words[i], self.operands[op_index]);\r\n        }\r\n    }\r\n}\r\n\r\n#[test]\r\nfn test_physical_layout_in_words() {\r\n    let bound = 5;\r\n    let version = 0x10203;\r\n\r\n    let mut output = vec![];\r\n    let mut layout = PhysicalLayout::new(version);\r\n    layout.bound = bound;\r\n\r\n    layout.in_words(&mut output);\r\n\r\n    assert_eq!(&output, &[MAGIC_NUMBER, version, GENERATOR, bound, 0,]);\r\n}\r\n\r\n#[test]\r\nfn test_logical_layout_in_words() {\r\n    let mut output = vec![];\r\n    let mut layout = LogicalLayout::default();\r\n    let layout_vectors = 11;\r\n    let mut instructions = Vec::with_capacity(layout_vectors);\r\n\r\n    let vector_names = &[\r\n        \"Capabilities\",\r\n        \"Extensions\",\r\n        \"External Instruction Imports\",\r\n        \"Memory Model\",\r\n        \"Entry Points\",\r\n        \"Execution Modes\",\r\n        \"Debugs\",\r\n        \"Annotations\",\r\n        \"Declarations\",\r\n        \"Function Declarations\",\r\n        \"Function Definitions\",\r\n    ];\r\n\r\n    for (i, _) in vector_names.iter().enumerate().take(layout_vectors) {\r\n        let mut dummy_instruction = Instruction::new(Op::Constant);\r\n        dummy_instruction.set_type((i + 1) as u32);\r\n        dummy_instruction.set_result((i + 2) as u32);\r\n        dummy_instruction.add_operand((i + 3) as u32);\r\n        dummy_instruction.add_operands(super::helpers::string_to_words(\r\n            format!(\"This is the vector: {}\", vector_names[i]).as_str(),\r\n        ));\r\n        instructions.push(dummy_instruction);\r\n    }\r\n\r\n    instructions[0].to_words(&mut layout.capabilities);\r\n    instructions[1].to_words(&mut layout.extensions);\r\n    instructions[2].to_words(&mut layout.ext_inst_imports);\r\n    instructions[3].to_words(&mut layout.memory_model);\r\n    instructions[4].to_words(&mut layout.entry_points);\r\n    instructions[5].to_words(&mut layout.execution_modes);\r\n    instructions[6].to_words(&mut layout.debugs);\r\n    instructions[7].to_words(&mut layout.annotations);\r\n    instructions[8].to_words(&mut layout.declarations);\r\n    instructions[9].to_words(&mut layout.function_declarations);\r\n    instructions[10].to_words(&mut layout.function_definitions);\r\n\r\n    layout.in_words(&mut output);\r\n\r\n    let mut index: usize = 0;\r\n    for instruction in instructions {\r\n        let wc = instruction.wc as usize;\r\n        instruction.validate(&output[index..index + wc]);\r\n        index += wc;\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/mod.rs",
    "content": "/*!\r\nBackend for [SPIR-V][spv] (Standard Portable Intermediate Representation).\r\n\r\n[spv]: https://www.khronos.org/registry/SPIR-V/\r\n*/\r\n\r\nmod block;\r\nmod helpers;\r\nmod image;\r\nmod index;\r\nmod instructions;\r\nmod layout;\r\nmod recyclable;\r\nmod selection;\r\nmod writer;\r\n\r\npub use spirv::Capability;\r\n\r\nuse crate::arena::Handle;\r\nuse crate::proc::{BoundsCheckPolicies, TypeResolution};\r\n\r\nuse spirv::Word;\r\nuse std::ops;\r\nuse thiserror::Error;\r\n\r\n#[derive(Clone)]\r\nstruct PhysicalLayout {\r\n    magic_number: Word,\r\n    version: Word,\r\n    generator: Word,\r\n    bound: Word,\r\n    instruction_schema: Word,\r\n}\r\n\r\n#[derive(Default)]\r\nstruct LogicalLayout {\r\n    capabilities: Vec<Word>,\r\n    extensions: Vec<Word>,\r\n    ext_inst_imports: Vec<Word>,\r\n    memory_model: Vec<Word>,\r\n    entry_points: Vec<Word>,\r\n    execution_modes: Vec<Word>,\r\n    debugs: Vec<Word>,\r\n    annotations: Vec<Word>,\r\n    declarations: Vec<Word>,\r\n    function_declarations: Vec<Word>,\r\n    function_definitions: Vec<Word>,\r\n}\r\n\r\nstruct Instruction {\r\n    op: spirv::Op,\r\n    wc: u32,\r\n    type_id: Option<Word>,\r\n    result_id: Option<Word>,\r\n    operands: Vec<Word>,\r\n}\r\n\r\nconst BITS_PER_BYTE: crate::Bytes = 8;\r\n\r\n#[derive(Clone, Debug, Error)]\r\npub enum Error {\r\n    #[error(\"The requested entry point couldn't be found\")]\r\n    EntryPointNotFound,\r\n    #[error(\"target SPIRV-{0}.{1} is not supported\")]\r\n    UnsupportedVersion(u8, u8),\r\n    #[error(\"using {0} requires at least one of the capabilities {1:?}, but none are available\")]\r\n    MissingCapabilities(&'static str, Vec<Capability>),\r\n    #[error(\"unimplemented {0}\")]\r\n    FeatureNotImplemented(&'static str),\r\n    #[error(\"module is not validated properly: {0}\")]\r\n    Validation(&'static str),\r\n}\r\n\r\n#[derive(Default)]\r\nstruct IdGenerator(Word);\r\n\r\nimpl IdGenerator {\r\n    fn next(&mut self) -> Word {\r\n        self.0 += 1;\r\n        self.0\r\n    }\r\n}\r\n\r\n/// A SPIR-V block to which we are still adding instructions.\r\n///\r\n/// A `Block` represents a SPIR-V block that does not yet have a termination\r\n/// instruction like `OpBranch` or `OpReturn`.\r\n///\r\n/// The `OpLabel` that starts the block is implicit. It will be emitted based on\r\n/// `label_id` when we write the block to a `LogicalLayout`.\r\n///\r\n/// To terminate a `Block`, pass the block and the termination instruction to\r\n/// `Function::consume`. This takes ownership of the `Block` and transforms it\r\n/// into a `TerminatedBlock`.\r\nstruct Block {\r\n    label_id: Word,\r\n    body: Vec<Instruction>,\r\n}\r\n\r\n/// A SPIR-V block that ends with a termination instruction.\r\nstruct TerminatedBlock {\r\n    label_id: Word,\r\n    body: Vec<Instruction>,\r\n}\r\n\r\nimpl Block {\r\n    const fn new(label_id: Word) -> Self {\r\n        Block {\r\n            label_id,\r\n            body: Vec::new(),\r\n        }\r\n    }\r\n}\r\n\r\nstruct LocalVariable {\r\n    id: Word,\r\n    instruction: Instruction,\r\n}\r\n\r\nstruct ResultMember {\r\n    id: Word,\r\n    type_id: Word,\r\n    built_in: Option<crate::BuiltIn>,\r\n}\r\n\r\nstruct EntryPointContext {\r\n    argument_ids: Vec<Word>,\r\n    results: Vec<ResultMember>,\r\n}\r\n\r\n#[derive(Default)]\r\nstruct Function {\r\n    signature: Option<Instruction>,\r\n    parameters: Vec<FunctionArgument>,\r\n    variables: crate::FastHashMap<Handle<crate::LocalVariable>, LocalVariable>,\r\n    blocks: Vec<TerminatedBlock>,\r\n    entry_point_context: Option<EntryPointContext>,\r\n}\r\n\r\nimpl Function {\r\n    fn consume(&mut self, mut block: Block, termination: Instruction) {\r\n        block.body.push(termination);\r\n        self.blocks.push(TerminatedBlock {\r\n            label_id: block.label_id,\r\n            body: block.body,\r\n        })\r\n    }\r\n\r\n    fn parameter_id(&self, index: u32) -> Word {\r\n        match self.entry_point_context {\r\n            Some(ref context) => context.argument_ids[index as usize],\r\n            None => self.parameters[index as usize]\r\n                .instruction\r\n                .result_id\r\n                .unwrap(),\r\n        }\r\n    }\r\n}\r\n\r\n/// Characteristics of a SPIR-V `OpTypeImage` type.\r\n///\r\n/// SPIR-V requires non-composite types to be unique, including images. Since we\r\n/// use `LocalType` for this deduplication, it's essential that `LocalImageType`\r\n/// be equal whenever the corresponding `OpTypeImage`s would be. To reduce the\r\n/// likelihood of mistakes, we use fields that correspond exactly to the\r\n/// operands of an `OpTypeImage` instruction, using the actual SPIR-V types\r\n/// where practical.\r\n#[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)]\r\nstruct LocalImageType {\r\n    sampled_type: crate::ScalarKind,\r\n    dim: spirv::Dim,\r\n    flags: ImageTypeFlags,\r\n    image_format: spirv::ImageFormat,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Flags corresponding to the boolean(-ish) parameters to OpTypeImage.\r\n    pub struct ImageTypeFlags: u8 {\r\n        const DEPTH = 0x1;\r\n        const ARRAYED = 0x2;\r\n        const MULTISAMPLED = 0x4;\r\n        const SAMPLED = 0x8;\r\n    }\r\n}\r\n\r\nimpl LocalImageType {\r\n    /// Construct a `LocalImageType` from the fields of a `TypeInner::Image`.\r\n    fn from_inner(dim: crate::ImageDimension, arrayed: bool, class: crate::ImageClass) -> Self {\r\n        let make_flags = |multi: bool, other: ImageTypeFlags| -> ImageTypeFlags {\r\n            let mut flags = other;\r\n            flags.set(ImageTypeFlags::ARRAYED, arrayed);\r\n            flags.set(ImageTypeFlags::MULTISAMPLED, multi);\r\n            flags\r\n        };\r\n\r\n        let dim = spirv::Dim::from(dim);\r\n\r\n        match class {\r\n            crate::ImageClass::Sampled { kind, multi } => LocalImageType {\r\n                sampled_type: kind,\r\n                dim,\r\n                flags: make_flags(multi, ImageTypeFlags::SAMPLED),\r\n                image_format: spirv::ImageFormat::Unknown,\r\n            },\r\n            crate::ImageClass::Depth { multi } => LocalImageType {\r\n                sampled_type: crate::ScalarKind::Float,\r\n                dim,\r\n                flags: make_flags(multi, ImageTypeFlags::DEPTH | ImageTypeFlags::SAMPLED),\r\n                image_format: spirv::ImageFormat::Unknown,\r\n            },\r\n            crate::ImageClass::Storage { format, access: _ } => LocalImageType {\r\n                sampled_type: crate::ScalarKind::from(format),\r\n                dim,\r\n                flags: make_flags(false, ImageTypeFlags::empty()),\r\n                image_format: format.into(),\r\n            },\r\n        }\r\n    }\r\n}\r\n\r\n/// A SPIR-V type constructed during code generation.\r\n///\r\n/// This is the variant of [`LookupType`] used to represent types that might not\r\n/// be available in the arena. Variants are present here for one of two reasons:\r\n///\r\n/// -   They represent types synthesized during code generation, as explained\r\n///     in the documentation for [`LookupType`].\r\n///\r\n/// -   They represent types for which SPIR-V forbids duplicate `OpType...`\r\n///     instructions, requiring deduplication.\r\n///\r\n/// This is not a complete copy of [`TypeInner`]: for example, SPIR-V generation\r\n/// never synthesizes new struct types, so `LocalType` has nothing for that.\r\n///\r\n/// Each `LocalType` variant should be handled identically to its analogous\r\n/// `TypeInner` variant. You can use the [`make_local`] function to help with\r\n/// this, by converting everything possible to a `LocalType` before inspecting\r\n/// it.\r\n///\r\n/// ## `Localtype` equality and SPIR-V `OpType` uniqueness\r\n///\r\n/// The definition of `Eq` on `LocalType` is carefully chosen to help us follow\r\n/// certain SPIR-V rules. SPIR-V §2.8 requires some classes of `OpType...`\r\n/// instructions to be unique; for example, you can't have two `OpTypeInt 32 1`\r\n/// instructions in the same module. All 32-bit signed integers must use the\r\n/// same type id.\r\n///\r\n/// All SPIR-V types that must be unique can be represented as a `LocalType`,\r\n/// and two `LocalType`s are always `Eq` if SPIR-V would require them to use the\r\n/// same `OpType...` instruction. This lets us avoid duplicates by recording the\r\n/// ids of the type instructions we've already generated in a hash table,\r\n/// [`Writer::lookup_type`], keyed by `LocalType`.\r\n///\r\n/// As another example, [`LocalImageType`], stored in the `LocalType::Image`\r\n/// variant, is designed to help us deduplicate `OpTypeImage` instructions. See\r\n/// its documentation for details.\r\n///\r\n/// `LocalType` also includes variants like `Pointer` that do not need to be\r\n/// unique - but it is harmless to avoid the duplication.\r\n///\r\n/// As it always must, the `Hash` implementation respects the `Eq` relation.\r\n///\r\n/// [`TypeInner`]: crate::TypeInner\r\n#[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)]\r\nenum LocalType {\r\n    /// A scalar, vector, or pointer to one of those.\r\n    Value {\r\n        /// If `None`, this represents a scalar type. If `Some`, this represents\r\n        /// a vector type of the given size.\r\n        vector_size: Option<crate::VectorSize>,\r\n        kind: crate::ScalarKind,\r\n        width: crate::Bytes,\r\n        pointer_space: Option<spirv::StorageClass>,\r\n    },\r\n    /// A matrix of floating-point values.\r\n    Matrix {\r\n        columns: crate::VectorSize,\r\n        rows: crate::VectorSize,\r\n        width: crate::Bytes,\r\n    },\r\n    Pointer {\r\n        base: Handle<crate::Type>,\r\n        class: spirv::StorageClass,\r\n    },\r\n    Image(LocalImageType),\r\n    SampledImage {\r\n        image_type_id: Word,\r\n    },\r\n    Sampler,\r\n    PointerToBindingArray {\r\n        base: Handle<crate::Type>,\r\n        size: u64,\r\n    },\r\n    BindingArray {\r\n        base: Handle<crate::Type>,\r\n        size: u64,\r\n    },\r\n}\r\n\r\n/// A type encountered during SPIR-V generation.\r\n///\r\n/// In the process of writing SPIR-V, we need to synthesize various types for\r\n/// intermediate results and such: pointer types, vector/matrix component types,\r\n/// or even booleans, which usually appear in SPIR-V code even when they're not\r\n/// used by the module source.\r\n///\r\n/// However, we can't use `crate::Type` or `crate::TypeInner` for these, as the\r\n/// type arena may not contain what we need (it only contains types used\r\n/// directly by other parts of the IR), and the IR module is immutable, so we\r\n/// can't add anything to it.\r\n///\r\n/// So for local use in the SPIR-V writer, we use this type, which holds either\r\n/// a handle into the arena, or a [`LocalType`] containing something synthesized\r\n/// locally.\r\n///\r\n/// This is very similar to the [`proc::TypeResolution`] enum, with `LocalType`\r\n/// playing the role of `TypeInner`. However, `LocalType` also has other\r\n/// properties needed for SPIR-V generation; see the description of\r\n/// [`LocalType`] for details.\r\n///\r\n/// [`proc::TypeResolution`]: crate::proc::TypeResolution\r\n#[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)]\r\nenum LookupType {\r\n    Handle(Handle<crate::Type>),\r\n    Local(LocalType),\r\n}\r\n\r\nimpl From<LocalType> for LookupType {\r\n    fn from(local: LocalType) -> Self {\r\n        Self::Local(local)\r\n    }\r\n}\r\n\r\n#[derive(Debug, PartialEq, Clone, Hash, Eq)]\r\nstruct LookupFunctionType {\r\n    parameter_type_ids: Vec<Word>,\r\n    return_type_id: Word,\r\n}\r\n\r\nfn make_local(inner: &crate::TypeInner) -> Option<LocalType> {\r\n    Some(match *inner {\r\n        crate::TypeInner::Scalar { kind, width } | crate::TypeInner::Atomic { kind, width } => {\r\n            LocalType::Value {\r\n                vector_size: None,\r\n                kind,\r\n                width,\r\n                pointer_space: None,\r\n            }\r\n        }\r\n        crate::TypeInner::Vector { size, kind, width } => LocalType::Value {\r\n            vector_size: Some(size),\r\n            kind,\r\n            width,\r\n            pointer_space: None,\r\n        },\r\n        crate::TypeInner::Matrix {\r\n            columns,\r\n            rows,\r\n            width,\r\n        } => LocalType::Matrix {\r\n            columns,\r\n            rows,\r\n            width,\r\n        },\r\n        crate::TypeInner::Pointer { base, space } => LocalType::Pointer {\r\n            base,\r\n            class: helpers::map_storage_class(space),\r\n        },\r\n        crate::TypeInner::ValuePointer {\r\n            size,\r\n            kind,\r\n            width,\r\n            space,\r\n        } => LocalType::Value {\r\n            vector_size: size,\r\n            kind,\r\n            width,\r\n            pointer_space: Some(helpers::map_storage_class(space)),\r\n        },\r\n        crate::TypeInner::Image {\r\n            dim,\r\n            arrayed,\r\n            class,\r\n        } => LocalType::Image(LocalImageType::from_inner(dim, arrayed, class)),\r\n        crate::TypeInner::Sampler { comparison: _ } => LocalType::Sampler,\r\n        _ => return None,\r\n    })\r\n}\r\n\r\n#[derive(Debug)]\r\nenum Dimension {\r\n    Scalar,\r\n    Vector,\r\n    Matrix,\r\n}\r\n\r\n/// A map from evaluated [`Expression`](crate::Expression)s to their SPIR-V ids.\r\n///\r\n/// When we emit code to evaluate a given `Expression`, we record the\r\n/// SPIR-V id of its value here, under its `Handle<Expression>` index.\r\n///\r\n/// A `CachedExpressions` value can be indexed by a `Handle<Expression>` value.\r\n///\r\n/// [emit]: index.html#expression-evaluation-time-and-scope\r\n#[derive(Default)]\r\nstruct CachedExpressions {\r\n    ids: Vec<Word>,\r\n}\r\nimpl CachedExpressions {\r\n    fn reset(&mut self, length: usize) {\r\n        self.ids.clear();\r\n        self.ids.resize(length, 0);\r\n    }\r\n}\r\nimpl ops::Index<Handle<crate::Expression>> for CachedExpressions {\r\n    type Output = Word;\r\n    fn index(&self, h: Handle<crate::Expression>) -> &Word {\r\n        let id = &self.ids[h.index()];\r\n        if *id == 0 {\r\n            unreachable!(\"Expression {:?} is not cached!\", h);\r\n        }\r\n        id\r\n    }\r\n}\r\nimpl ops::IndexMut<Handle<crate::Expression>> for CachedExpressions {\r\n    fn index_mut(&mut self, h: Handle<crate::Expression>) -> &mut Word {\r\n        let id = &mut self.ids[h.index()];\r\n        if *id != 0 {\r\n            unreachable!(\"Expression {:?} is already cached!\", h);\r\n        }\r\n        id\r\n    }\r\n}\r\nimpl recyclable::Recyclable for CachedExpressions {\r\n    fn recycle(self) -> Self {\r\n        CachedExpressions {\r\n            ids: self.ids.recycle(),\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone)]\r\nstruct GlobalVariable {\r\n    /// ID of the OpVariable that declares the global.\r\n    ///\r\n    /// If you need the variable's value, use [`access_id`] instead of this\r\n    /// field. If we wrapped the Naga IR `GlobalVariable`'s type in a struct to\r\n    /// comply with Vulkan's requirements, then this points to the `OpVariable`\r\n    /// with the synthesized struct type, whereas `access_id` points to the\r\n    /// field of said struct that holds the variable's actual value.\r\n    ///\r\n    /// This is used to compute the `access_id` pointer in function prologues,\r\n    /// and used for `ArrayLength` expressions, which do need the struct.\r\n    ///\r\n    /// [`access_id`]: GlobalVariable::access_id\r\n    var_id: Word,\r\n\r\n    /// For `AddressSpace::Handle` variables, this ID is recorded in the function\r\n    /// prelude block (and reset before every function) as `OpLoad` of the variable.\r\n    /// It is then used for all the global ops, such as `OpImageSample`.\r\n    handle_id: Word,\r\n\r\n    /// Actual ID used to access this variable.\r\n    /// For wrapped buffer variables, this ID is `OpAccessChain` into the\r\n    /// wrapper. Otherwise, the same as `var_id`.\r\n    ///\r\n    /// Vulkan requires that globals in the `StorageBuffer` and `Uniform` storage\r\n    /// classes must be structs with the `Block` decoration, but WGSL and Naga IR\r\n    /// make no such requirement. So for such variables, we generate a wrapper struct\r\n    /// type with a single element of the type given by Naga, generate an\r\n    /// `OpAccessChain` for that member in the function prelude, and use that pointer\r\n    /// to refer to the global in the function body. This is the id of that access,\r\n    /// updated for each function in `write_function`.\r\n    access_id: Word,\r\n}\r\n\r\nimpl GlobalVariable {\r\n    const fn dummy() -> Self {\r\n        Self {\r\n            var_id: 0,\r\n            handle_id: 0,\r\n            access_id: 0,\r\n        }\r\n    }\r\n\r\n    const fn new(id: Word) -> Self {\r\n        Self {\r\n            var_id: id,\r\n            handle_id: 0,\r\n            access_id: 0,\r\n        }\r\n    }\r\n\r\n    /// Prepare `self` for use within a single function.\r\n    fn reset_for_function(&mut self) {\r\n        self.handle_id = 0;\r\n        self.access_id = 0;\r\n    }\r\n}\r\n\r\nstruct FunctionArgument {\r\n    /// Actual instruction of the argument.\r\n    instruction: Instruction,\r\n    handle_id: Word,\r\n}\r\n\r\n/// General information needed to emit SPIR-V for Naga statements.\r\nstruct BlockContext<'w> {\r\n    /// The writer handling the module to which this code belongs.\r\n    writer: &'w mut Writer,\r\n\r\n    /// The [`Module`](crate::Module) for which we're generating code.\r\n    ir_module: &'w crate::Module,\r\n\r\n    /// The [`Function`](crate::Function) for which we're generating code.\r\n    ir_function: &'w crate::Function,\r\n\r\n    /// Information module validation produced about\r\n    /// [`ir_function`](BlockContext::ir_function).\r\n    fun_info: &'w crate::valid::FunctionInfo,\r\n\r\n    /// The [`spv::Function`](Function) to which we are contributing SPIR-V instructions.\r\n    function: &'w mut Function,\r\n\r\n    /// SPIR-V ids for expressions we've evaluated.\r\n    cached: CachedExpressions,\r\n\r\n    /// The `Writer`'s temporary vector, for convenience.\r\n    temp_list: Vec<Word>,\r\n}\r\n\r\nimpl BlockContext<'_> {\r\n    fn gen_id(&mut self) -> Word {\r\n        self.writer.id_gen.next()\r\n    }\r\n\r\n    fn get_type_id(&mut self, lookup_type: LookupType) -> Word {\r\n        self.writer.get_type_id(lookup_type)\r\n    }\r\n\r\n    fn get_expression_type_id(&mut self, tr: &TypeResolution) -> Word {\r\n        self.writer.get_expression_type_id(tr)\r\n    }\r\n\r\n    fn get_index_constant(&mut self, index: Word) -> Word {\r\n        self.writer\r\n            .get_constant_scalar(crate::ScalarValue::Uint(index as _), 4)\r\n    }\r\n\r\n    fn get_scope_constant(&mut self, scope: Word) -> Word {\r\n        self.writer\r\n            .get_constant_scalar(crate::ScalarValue::Sint(scope as _), 4)\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Default)]\r\nstruct LoopContext {\r\n    continuing_id: Option<Word>,\r\n    break_id: Option<Word>,\r\n}\r\n\r\npub struct Writer {\r\n    physical_layout: PhysicalLayout,\r\n    logical_layout: LogicalLayout,\r\n    id_gen: IdGenerator,\r\n\r\n    /// The set of capabilities modules are permitted to use.\r\n    ///\r\n    /// This is initialized from `Options::capabilities`.\r\n    capabilities_available: Option<crate::FastHashSet<Capability>>,\r\n\r\n    /// The set of capabilities used by this module.\r\n    ///\r\n    /// If `capabilities_available` is `Some`, then this is always a subset of\r\n    /// that.\r\n    capabilities_used: crate::FastHashSet<Capability>,\r\n\r\n    /// The set of spirv extensions used.\r\n    extensions_used: crate::FastHashSet<&'static str>,\r\n\r\n    debugs: Vec<Instruction>,\r\n    annotations: Vec<Instruction>,\r\n    flags: WriterFlags,\r\n    bounds_check_policies: BoundsCheckPolicies,\r\n    void_type: Word,\r\n    //TODO: convert most of these into vectors, addressable by handle indices\r\n    lookup_type: crate::FastHashMap<LookupType, Word>,\r\n    lookup_function: crate::FastHashMap<Handle<crate::Function>, Word>,\r\n    lookup_function_type: crate::FastHashMap<LookupFunctionType, Word>,\r\n    constant_ids: Vec<Word>,\r\n    cached_constants: crate::FastHashMap<(crate::ScalarValue, crate::Bytes), Word>,\r\n    global_variables: Vec<GlobalVariable>,\r\n    binding_map: BindingMap,\r\n\r\n    // Cached expressions are only meaningful within a BlockContext, but we\r\n    // retain the table here between functions to save heap allocations.\r\n    saved_cached: CachedExpressions,\r\n\r\n    gl450_ext_inst_id: Word,\r\n    // Just a temporary list of SPIR-V ids\r\n    temp_list: Vec<Word>,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    pub struct WriterFlags: u32 {\r\n        /// Include debug labels for everything.\r\n        const DEBUG = 0x1;\r\n        /// Flip Y coordinate of `BuiltIn::Position` output.\r\n        const ADJUST_COORDINATE_SPACE = 0x2;\r\n        /// Emit `OpName` for input/output locations.\r\n        /// Contrary to spec, some drivers treat it as semantic, not allowing\r\n        /// any conflicts.\r\n        const LABEL_VARYINGS = 0x4;\r\n        /// Emit `PointSize` output builtin to vertex shaders, which is\r\n        /// required for drawing with `PointList` topology.\r\n        const FORCE_POINT_SIZE = 0x8;\r\n        /// Clamp `BuiltIn::FragDepth` output between 0 and 1.\r\n        const CLAMP_FRAG_DEPTH = 0x10;\r\n    }\r\n}\r\n\r\n#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct BindingInfo {\r\n    /// If the binding is an unsized binding array, this overrides the size.\r\n    pub binding_array_size: Option<u32>,\r\n}\r\n\r\n// Using `BTreeMap` instead of `HashMap` so that we can hash itself.\r\npub type BindingMap = std::collections::BTreeMap<crate::ResourceBinding, BindingInfo>;\r\n\r\n#[derive(Debug, Clone)]\r\npub struct Options {\r\n    /// (Major, Minor) target version of the SPIR-V.\r\n    pub lang_version: (u8, u8),\r\n\r\n    /// Configuration flags for the writer.\r\n    pub flags: WriterFlags,\r\n\r\n    /// Map of resources to information about the binding.\r\n    pub binding_map: BindingMap,\r\n\r\n    /// If given, the set of capabilities modules are allowed to use. Code that\r\n    /// requires capabilities beyond these is rejected with an error.\r\n    ///\r\n    /// If this is `None`, all capabilities are permitted.\r\n    pub capabilities: Option<crate::FastHashSet<Capability>>,\r\n\r\n    /// How should generate code handle array, vector, matrix, or image texel\r\n    /// indices that are out of range?\r\n    pub bounds_check_policies: BoundsCheckPolicies,\r\n}\r\n\r\nimpl Default for Options {\r\n    fn default() -> Self {\r\n        let mut flags = WriterFlags::ADJUST_COORDINATE_SPACE\r\n            | WriterFlags::LABEL_VARYINGS\r\n            | WriterFlags::CLAMP_FRAG_DEPTH;\r\n        if cfg!(debug_assertions) {\r\n            flags |= WriterFlags::DEBUG;\r\n        }\r\n        Options {\r\n            lang_version: (1, 0),\r\n            flags,\r\n            binding_map: BindingMap::default(),\r\n            capabilities: None,\r\n            bounds_check_policies: crate::proc::BoundsCheckPolicies::default(),\r\n        }\r\n    }\r\n}\r\n\r\n// A subset of options meant to be changed per pipeline.\r\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct PipelineOptions {\r\n    /// The stage of the entry point.\r\n    pub shader_stage: crate::ShaderStage,\r\n    /// The name of the entry point.\r\n    ///\r\n    /// If no entry point that matches is found while creating a [`Writer`], a error will be thrown.\r\n    pub entry_point: String,\r\n}\r\n\r\npub fn write_vec(\r\n    module: &crate::Module,\r\n    info: &crate::valid::ModuleInfo,\r\n    options: &Options,\r\n    pipeline_options: Option<&PipelineOptions>,\r\n) -> Result<Vec<u32>, Error> {\r\n    let mut words = Vec::new();\r\n    let mut w = Writer::new(options)?;\r\n    w.write(module, info, pipeline_options, &mut words)?;\r\n    Ok(words)\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/recyclable.rs",
    "content": "/*!\r\nReusing collections' previous allocations.\r\n*/\r\n\r\n/// A value that can be reset to its initial state, retaining its current allocations.\r\n///\r\n/// Naga attempts to lower the cost of SPIR-V generation by allowing clients to\r\n/// reuse the same `Writer` for multiple Module translations. Reusing a `Writer`\r\n/// means that the `Vec`s, `HashMap`s, and other heap-allocated structures the\r\n/// `Writer` uses internally begin the translation with heap-allocated buffers\r\n/// ready to use.\r\n///\r\n/// But this approach introduces the risk of `Writer` state leaking from one\r\n/// module to the next. When a developer adds fields to `Writer` or its internal\r\n/// types, they must remember to reset their contents between modules.\r\n///\r\n/// One trick to ensure that every field has been accounted for is to use Rust's\r\n/// struct literal syntax to construct a new, reset value. If a developer adds a\r\n/// field, but neglects to update the reset code, the compiler will complain\r\n/// that a field is missing from the literal. This trait's `recycle` method\r\n/// takes `self` by value, and returns `Self` by value, encouraging the use of\r\n/// struct literal expressions in its implementation.\r\npub trait Recyclable {\r\n    /// Clear `self`, retaining its current memory allocations.\r\n    ///\r\n    /// Shrink the buffer if it's currently much larger than was actually used.\r\n    /// This prevents a module with exceptionally large allocations from causing\r\n    /// the `Writer` to retain more memory than it needs indefinitely.\r\n    fn recycle(self) -> Self;\r\n}\r\n\r\n// Stock values for various collections.\r\n\r\nimpl<T> Recyclable for Vec<T> {\r\n    fn recycle(mut self) -> Self {\r\n        self.clear();\r\n        self\r\n    }\r\n}\r\n\r\nimpl<K, V, S: Clone> Recyclable for std::collections::HashMap<K, V, S> {\r\n    fn recycle(mut self) -> Self {\r\n        self.clear();\r\n        self\r\n    }\r\n}\r\n\r\nimpl<K, S: Clone> Recyclable for std::collections::HashSet<K, S> {\r\n    fn recycle(mut self) -> Self {\r\n        self.clear();\r\n        self\r\n    }\r\n}\r\n\r\nimpl<K: Ord, V> Recyclable for std::collections::BTreeMap<K, V> {\r\n    fn recycle(mut self) -> Self {\r\n        self.clear();\r\n        self\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/selection.rs",
    "content": "/*!\r\nGenerate SPIR-V conditional structures.\r\n\r\nBuilders for `if` structures with `and`s.\r\n\r\nThe types in this module track the information needed to emit SPIR-V code\r\nfor complex conditional structures, like those whose conditions involve\r\nshort-circuiting 'and' and 'or' structures. These track labels and can emit\r\n`OpPhi` instructions to merge values produced along different paths.\r\n\r\nThis currently only supports exactly the forms Naga uses, so it doesn't\r\nsupport `or` or `else`, and only supports zero or one merged values.\r\n\r\nNaga needs to emit code roughly like this:\r\n\r\n```ignore\r\n\r\n    value = DEFAULT;\r\n    if COND1 && COND2 {\r\n        value = THEN_VALUE;\r\n    }\r\n    // use value\r\n\r\n```\r\n\r\nAssuming `ctx` and `block` are a mutable references to a [`BlockContext`]\r\nand the current [`Block`], and `merge_type` is the SPIR-V type for the\r\nmerged value `value`, we can build SPIR-V for the code above like so:\r\n\r\n```ignore\r\n\r\n    let cond = Selection::start(block, merge_type);\r\n        // ... compute `cond1` ...\r\n    cond.if_true(ctx, cond1, DEFAULT);\r\n        // ... compute `cond2` ...\r\n    cond.if_true(ctx, cond2, DEFAULT);\r\n        // ... compute THEN_VALUE\r\n    let merged_value = cond.finish(ctx, THEN_VALUE);\r\n\r\n```\r\n\r\nAfter this, `merged_value` is either `DEFAULT` or `THEN_VALUE`, depending on\r\nthe path by which the merged block was reached.\r\n\r\nThis takes care of writing all branch instructions, including an\r\n`OpSelectionMerge` annotation in the header block; starting new blocks and\r\nassigning them labels; and emitting the `OpPhi` that gathers together the\r\nright sources for the merged values, for every path through the selection\r\nconstruct.\r\n\r\nWhen there is no merged value to produce, you can pass `()` for `merge_type`\r\nand the merge values. In this case no `OpPhi` instructions are produced, and\r\nthe `finish` method returns `()`.\r\n\r\nTo enforce proper nesting, a `Selection` takes ownership of the `&mut Block`\r\npointer for the duration of its lifetime. To obtain the block for generating\r\ncode in the selection's body, call the `Selection::block` method.\r\n*/\r\n\r\nuse super::{Block, BlockContext, Instruction};\r\nuse spirv::Word;\r\n\r\n/// A private struct recording what we know about the selection construct so far.\r\npub(super) struct Selection<'b, M: MergeTuple> {\r\n    /// The block pointer we're emitting code into.\r\n    block: &'b mut Block,\r\n\r\n    /// The label of the selection construct's merge block, or `None` if we\r\n    /// haven't yet written the `OpSelectionMerge` merge instruction.\r\n    merge_label: Option<Word>,\r\n\r\n    /// A set of `(VALUES, PARENT)` pairs, used to build `OpPhi` instructions in\r\n    /// the merge block. Each `PARENT` is the label of a predecessor block of\r\n    /// the merge block. The corresponding `VALUES` holds the ids of the values\r\n    /// that `PARENT` contributes to the merged values.\r\n    ///\r\n    /// We emit all branches to the merge block, so we know all its\r\n    /// predecessors. And we refuse to emit a branch unless we're given the\r\n    /// values the branching block contributes to the merge, so we always have\r\n    /// everything we need to emit the correct phis, by construction.\r\n    values: Vec<(M, Word)>,\r\n\r\n    /// The types of the values in each element of `values`.\r\n    merge_types: M,\r\n}\r\n\r\nimpl<'b, M: MergeTuple> Selection<'b, M> {\r\n    /// Start a new selection construct.\r\n    ///\r\n    /// The `block` argument indicates the selection's header block.\r\n    ///\r\n    /// The `merge_types` argument should be a `Word` or tuple of `Word`s, each\r\n    /// value being the SPIR-V result type id of an `OpPhi` instruction that\r\n    /// will be written to the selection's merge block when this selection's\r\n    /// [`finish`] method is called. This argument may also be `()`, for\r\n    /// selections that produce no values.\r\n    ///\r\n    /// (This function writes no code to `block` itself; it simply constructs a\r\n    /// fresh `Selection`.)\r\n    ///\r\n    /// [`finish`]: Selection::finish\r\n    pub(super) fn start(block: &'b mut Block, merge_types: M) -> Self {\r\n        Selection {\r\n            block,\r\n            merge_label: None,\r\n            values: vec![],\r\n            merge_types,\r\n        }\r\n    }\r\n\r\n    pub(super) fn block(&mut self) -> &mut Block {\r\n        self.block\r\n    }\r\n\r\n    /// Branch to a successor block if `cond` is true, otherwise merge.\r\n    ///\r\n    /// If `cond` is false, branch to the merge block, using `values` as the\r\n    /// merged values. Otherwise, proceed to a new block.\r\n    ///\r\n    /// The `values` argument must be the same shape as the `merge_types`\r\n    /// argument passed to `Selection::start`.\r\n    pub(super) fn if_true(&mut self, ctx: &mut BlockContext, cond: Word, values: M) {\r\n        self.values.push((values, self.block.label_id));\r\n\r\n        let merge_label = self.make_merge_label(ctx);\r\n        let next_label = ctx.gen_id();\r\n        ctx.function.consume(\r\n            std::mem::replace(self.block, Block::new(next_label)),\r\n            Instruction::branch_conditional(cond, next_label, merge_label),\r\n        );\r\n    }\r\n\r\n    /// Emit an unconditional branch to the merge block, and compute merged\r\n    /// values.\r\n    ///\r\n    /// Use `final_values` as the merged values contributed by the current\r\n    /// block, and transition to the merge block, emitting `OpPhi` instructions\r\n    /// to produce the merged values. This must be the same shape as the\r\n    /// `merge_types` argument passed to [`Selection::start`].\r\n    ///\r\n    /// Return the SPIR-V ids of the merged values. This value has the same\r\n    /// shape as the `merge_types` argument passed to `Selection::start`.\r\n    pub(super) fn finish(self, ctx: &mut BlockContext, final_values: M) -> M {\r\n        match self {\r\n            Selection {\r\n                merge_label: None, ..\r\n            } => {\r\n                // We didn't actually emit any branches, so `self.values` must\r\n                // be empty, and `final_values` are the only sources we have for\r\n                // the merged values. Easy peasy.\r\n                final_values\r\n            }\r\n\r\n            Selection {\r\n                block,\r\n                merge_label: Some(merge_label),\r\n                mut values,\r\n                merge_types,\r\n            } => {\r\n                // Emit the final branch and transition to the merge block.\r\n                values.push((final_values, block.label_id));\r\n                ctx.function.consume(\r\n                    std::mem::replace(block, Block::new(merge_label)),\r\n                    Instruction::branch(merge_label),\r\n                );\r\n\r\n                // Now that we're in the merge block, build the phi instructions.\r\n                merge_types.write_phis(ctx, block, &values)\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Return the id of the merge block, writing a merge instruction if needed.\r\n    fn make_merge_label(&mut self, ctx: &mut BlockContext) -> Word {\r\n        match self.merge_label {\r\n            None => {\r\n                let merge_label = ctx.gen_id();\r\n                self.block.body.push(Instruction::selection_merge(\r\n                    merge_label,\r\n                    spirv::SelectionControl::NONE,\r\n                ));\r\n                self.merge_label = Some(merge_label);\r\n                merge_label\r\n            }\r\n            Some(merge_label) => merge_label,\r\n        }\r\n    }\r\n}\r\n\r\n/// A trait to help `Selection` manage any number of merged values.\r\n///\r\n/// Some selection constructs, like a `ReadZeroSkipWrite` bounds check on a\r\n/// [`Load`] expression, produce a single merged value. Others produce no merged\r\n/// value, like a bounds check on a [`Store`] statement.\r\n///\r\n/// To let `Selection` work nicely with both cases, we let the merge type\r\n/// argument passed to [`Selection::start`] be any type that implements this\r\n/// `MergeTuple` trait. `MergeTuple` is then implemented for `()`, `Word`,\r\n/// `(Word, Word)`, and so on.\r\n///\r\n/// A `MergeTuple` type can represent either a bunch of SPIR-V types or values;\r\n/// the `merge_types` argument to `Selection::start` are type ids, whereas the\r\n/// `values` arguments to the [`if_true`] and [`finish`] methods are value ids.\r\n/// The set of merged value returned by `finish` is a tuple of value ids.\r\n///\r\n/// In fact, since Naga only uses zero- and single-valued selection constructs\r\n/// at present, we only implement `MergeTuple` for `()` and `Word`. But if you\r\n/// add more cases, feel free to add more implementations. Once const generics\r\n/// are available, we could have a single implementation of `MergeTuple` for all\r\n/// lengths of arrays, and be done with it.\r\n///\r\n/// [`Load`]: crate::Expression::Load\r\n/// [`Store`]: crate::Statement::Store\r\n/// [`if_true`]: Selection::if_true\r\n/// [`finish`]: Selection::finish\r\npub(super) trait MergeTuple: Sized {\r\n    /// Write OpPhi instructions for the given set of predecessors.\r\n    ///\r\n    /// The `predecessors` vector should be a vector of `(LABEL, VALUES)` pairs,\r\n    /// where each `VALUES` holds the values contributed by the branch from\r\n    /// `LABEL`, which should be one of the current block's predecessors.\r\n    fn write_phis(\r\n        self,\r\n        ctx: &mut BlockContext,\r\n        block: &mut Block,\r\n        predecessors: &[(Self, Word)],\r\n    ) -> Self;\r\n}\r\n\r\n/// Selections that produce a single merged value.\r\n///\r\n/// For example, `ImageLoad` with `BoundsCheckPolicy::ReadZeroSkipWrite` either\r\n/// returns a texel value or zeros.\r\nimpl MergeTuple for Word {\r\n    fn write_phis(\r\n        self,\r\n        ctx: &mut BlockContext,\r\n        block: &mut Block,\r\n        predecessors: &[(Word, Word)],\r\n    ) -> Word {\r\n        let merged_value = ctx.gen_id();\r\n        block\r\n            .body\r\n            .push(Instruction::phi(self, merged_value, predecessors));\r\n        merged_value\r\n    }\r\n}\r\n\r\n/// Selections that produce no merged values.\r\n///\r\n/// For example, `ImageStore` under `BoundsCheckPolicy::ReadZeroSkipWrite`\r\n/// either does the store or skips it, but in neither case does it produce a\r\n/// value.\r\nimpl MergeTuple for () {\r\n    /// No phis need to be generated.\r\n    fn write_phis(self, _: &mut BlockContext, _: &mut Block, _: &[((), Word)]) {}\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/spv/writer.rs",
    "content": "use super::{\r\n    helpers::{contains_builtin, global_needs_wrapper, map_storage_class},\r\n    make_local, Block, BlockContext, CachedExpressions, EntryPointContext, Error, Function,\r\n    FunctionArgument, GlobalVariable, IdGenerator, Instruction, LocalType, LocalVariable,\r\n    LogicalLayout, LookupFunctionType, LookupType, LoopContext, Options, PhysicalLayout,\r\n    PipelineOptions, ResultMember, Writer, WriterFlags, BITS_PER_BYTE,\r\n};\r\nuse crate::{\r\n    arena::{Handle, UniqueArena},\r\n    back::spv::BindingInfo,\r\n    proc::{Alignment, TypeResolution},\r\n    valid::{FunctionInfo, ModuleInfo},\r\n};\r\nuse spirv::Word;\r\nuse std::collections::hash_map::Entry;\r\n\r\nstruct FunctionInterface<'a> {\r\n    varying_ids: &'a mut Vec<Word>,\r\n    stage: crate::ShaderStage,\r\n}\r\n\r\nimpl Function {\r\n    fn to_words(&self, sink: &mut impl Extend<Word>) {\r\n        self.signature.as_ref().unwrap().to_words(sink);\r\n        for argument in self.parameters.iter() {\r\n            argument.instruction.to_words(sink);\r\n        }\r\n        for (index, block) in self.blocks.iter().enumerate() {\r\n            Instruction::label(block.label_id).to_words(sink);\r\n            if index == 0 {\r\n                for local_var in self.variables.values() {\r\n                    local_var.instruction.to_words(sink);\r\n                }\r\n            }\r\n            for instruction in block.body.iter() {\r\n                instruction.to_words(sink);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nimpl Writer {\r\n    pub fn new(options: &Options) -> Result<Self, Error> {\r\n        let (major, minor) = options.lang_version;\r\n        if major != 1 {\r\n            return Err(Error::UnsupportedVersion(major, minor));\r\n        }\r\n        let raw_version = ((major as u32) << 16) | ((minor as u32) << 8);\r\n\r\n        let mut capabilities_used = crate::FastHashSet::default();\r\n        capabilities_used.insert(spirv::Capability::Shader);\r\n\r\n        let mut id_gen = IdGenerator::default();\r\n        let gl450_ext_inst_id = id_gen.next();\r\n        let void_type = id_gen.next();\r\n\r\n        Ok(Writer {\r\n            physical_layout: PhysicalLayout::new(raw_version),\r\n            logical_layout: LogicalLayout::default(),\r\n            id_gen,\r\n            capabilities_available: options.capabilities.clone(),\r\n            capabilities_used,\r\n            extensions_used: crate::FastHashSet::default(),\r\n            debugs: vec![],\r\n            annotations: vec![],\r\n            flags: options.flags,\r\n            bounds_check_policies: options.bounds_check_policies,\r\n            void_type,\r\n            lookup_type: crate::FastHashMap::default(),\r\n            lookup_function: crate::FastHashMap::default(),\r\n            lookup_function_type: crate::FastHashMap::default(),\r\n            constant_ids: Vec::new(),\r\n            cached_constants: crate::FastHashMap::default(),\r\n            global_variables: Vec::new(),\r\n            binding_map: options.binding_map.clone(),\r\n            saved_cached: CachedExpressions::default(),\r\n            gl450_ext_inst_id,\r\n            temp_list: Vec::new(),\r\n        })\r\n    }\r\n\r\n    /// Reset `Writer` to its initial state, retaining any allocations.\r\n    ///\r\n    /// Why not just implement `Recyclable` for `Writer`? By design,\r\n    /// `Recyclable::recycle` requires ownership of the value, not just\r\n    /// `&mut`; see the trait documentation. But we need to use this method\r\n    /// from functions like `Writer::write`, which only have `&mut Writer`.\r\n    /// Workarounds include unsafe code (`std::ptr::read`, then `write`, ugh)\r\n    /// or something like a `Default` impl that returns an oddly-initialized\r\n    /// `Writer`, which is worse.\r\n    fn reset(&mut self) {\r\n        use super::recyclable::Recyclable;\r\n        use std::mem::take;\r\n\r\n        let mut id_gen = IdGenerator::default();\r\n        let gl450_ext_inst_id = id_gen.next();\r\n        let void_type = id_gen.next();\r\n\r\n        // Every field of the old writer that is not determined by the `Options`\r\n        // passed to `Writer::new` should be reset somehow.\r\n        let fresh = Writer {\r\n            // Copied from the old Writer:\r\n            flags: self.flags,\r\n            bounds_check_policies: self.bounds_check_policies,\r\n            capabilities_available: take(&mut self.capabilities_available),\r\n            binding_map: take(&mut self.binding_map),\r\n\r\n            // Initialized afresh:\r\n            id_gen,\r\n            void_type,\r\n            gl450_ext_inst_id,\r\n\r\n            // Recycled:\r\n            capabilities_used: take(&mut self.capabilities_used).recycle(),\r\n            extensions_used: take(&mut self.extensions_used).recycle(),\r\n            physical_layout: self.physical_layout.clone().recycle(),\r\n            logical_layout: take(&mut self.logical_layout).recycle(),\r\n            debugs: take(&mut self.debugs).recycle(),\r\n            annotations: take(&mut self.annotations).recycle(),\r\n            lookup_type: take(&mut self.lookup_type).recycle(),\r\n            lookup_function: take(&mut self.lookup_function).recycle(),\r\n            lookup_function_type: take(&mut self.lookup_function_type).recycle(),\r\n            constant_ids: take(&mut self.constant_ids).recycle(),\r\n            cached_constants: take(&mut self.cached_constants).recycle(),\r\n            global_variables: take(&mut self.global_variables).recycle(),\r\n            saved_cached: take(&mut self.saved_cached).recycle(),\r\n            temp_list: take(&mut self.temp_list).recycle(),\r\n        };\r\n\r\n        *self = fresh;\r\n\r\n        self.capabilities_used.insert(spirv::Capability::Shader);\r\n    }\r\n\r\n    /// Indicate that the code requires any one of the listed capabilities.\r\n    ///\r\n    /// If nothing in `capabilities` appears in the available capabilities\r\n    /// specified in the [`Options`] from which this `Writer` was created,\r\n    /// return an error. The `what` string is used in the error message to\r\n    /// explain what provoked the requirement. (If no available capabilities were\r\n    /// given, assume everything is available.)\r\n    ///\r\n    /// The first acceptable capability will be added to this `Writer`'s\r\n    /// [`capabilities_used`] table, and an `OpCapability` emitted for it in the\r\n    /// result. For this reason, more specific capabilities should be listed\r\n    /// before more general.\r\n    ///\r\n    /// [`capabilities_used`]: Writer::capabilities_used\r\n    pub(super) fn require_any(\r\n        &mut self,\r\n        what: &'static str,\r\n        capabilities: &[spirv::Capability],\r\n    ) -> Result<(), Error> {\r\n        match *capabilities {\r\n            [] => Ok(()),\r\n            [first, ..] => {\r\n                // Find the first acceptable capability, or return an error if\r\n                // there is none.\r\n                let selected = match self.capabilities_available {\r\n                    None => first,\r\n                    Some(ref available) => {\r\n                        match capabilities.iter().find(|cap| available.contains(cap)) {\r\n                            Some(&cap) => cap,\r\n                            None => {\r\n                                return Err(Error::MissingCapabilities(what, capabilities.to_vec()))\r\n                            }\r\n                        }\r\n                    }\r\n                };\r\n                self.capabilities_used.insert(selected);\r\n                Ok(())\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Indicate that the code uses the given extension.\r\n    pub(super) fn use_extension(&mut self, extension: &'static str) {\r\n        self.extensions_used.insert(extension);\r\n    }\r\n\r\n    pub(super) fn get_type_id(&mut self, lookup_ty: LookupType) -> Word {\r\n        match self.lookup_type.entry(lookup_ty) {\r\n            Entry::Occupied(e) => *e.get(),\r\n            Entry::Vacant(e) => {\r\n                let local = match lookup_ty {\r\n                    LookupType::Handle(_handle) => unreachable!(\"Handles are populated at start\"),\r\n                    LookupType::Local(local) => local,\r\n                };\r\n\r\n                let id = self.id_gen.next();\r\n                e.insert(id);\r\n                self.write_type_declaration_local(id, local);\r\n                id\r\n            }\r\n        }\r\n    }\r\n\r\n    pub(super) fn get_expression_type_id(&mut self, tr: &TypeResolution) -> Word {\r\n        let lookup_ty = match *tr {\r\n            TypeResolution::Handle(ty_handle) => LookupType::Handle(ty_handle),\r\n            TypeResolution::Value(ref inner) => LookupType::Local(make_local(inner).unwrap()),\r\n        };\r\n        self.get_type_id(lookup_ty)\r\n    }\r\n\r\n    pub(super) fn get_pointer_id(\r\n        &mut self,\r\n        arena: &UniqueArena<crate::Type>,\r\n        handle: Handle<crate::Type>,\r\n        class: spirv::StorageClass,\r\n    ) -> Result<Word, Error> {\r\n        let ty_id = self.get_type_id(LookupType::Handle(handle));\r\n        if let crate::TypeInner::Pointer { .. } = arena[handle].inner {\r\n            return Ok(ty_id);\r\n        }\r\n        let lookup_type = LookupType::Local(LocalType::Pointer {\r\n            base: handle,\r\n            class,\r\n        });\r\n        Ok(if let Some(&id) = self.lookup_type.get(&lookup_type) {\r\n            id\r\n        } else {\r\n            let id = self.id_gen.next();\r\n            let instruction = Instruction::type_pointer(id, class, ty_id);\r\n            instruction.to_words(&mut self.logical_layout.declarations);\r\n            self.lookup_type.insert(lookup_type, id);\r\n            id\r\n        })\r\n    }\r\n\r\n    pub(super) fn get_uint_type_id(&mut self) -> Word {\r\n        let local_type = LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Uint,\r\n            width: 4,\r\n            pointer_space: None,\r\n        };\r\n        self.get_type_id(local_type.into())\r\n    }\r\n\r\n    pub(super) fn get_float_type_id(&mut self) -> Word {\r\n        let local_type = LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Float,\r\n            width: 4,\r\n            pointer_space: None,\r\n        };\r\n        self.get_type_id(local_type.into())\r\n    }\r\n\r\n    pub(super) fn get_float_pointer_type_id(&mut self, class: spirv::StorageClass) -> Word {\r\n        let lookup_type = LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Float,\r\n            width: 4,\r\n            pointer_space: Some(class),\r\n        });\r\n        if let Some(&id) = self.lookup_type.get(&lookup_type) {\r\n            id\r\n        } else {\r\n            let id = self.id_gen.next();\r\n            let ty_id = self.get_float_type_id();\r\n            let instruction = Instruction::type_pointer(id, class, ty_id);\r\n            instruction.to_words(&mut self.logical_layout.declarations);\r\n            self.lookup_type.insert(lookup_type, id);\r\n            id\r\n        }\r\n    }\r\n\r\n    pub(super) fn get_bool_type_id(&mut self) -> Word {\r\n        let local_type = LocalType::Value {\r\n            vector_size: None,\r\n            kind: crate::ScalarKind::Bool,\r\n            width: 1,\r\n            pointer_space: None,\r\n        };\r\n        self.get_type_id(local_type.into())\r\n    }\r\n\r\n    pub(super) fn decorate(&mut self, id: Word, decoration: spirv::Decoration, operands: &[Word]) {\r\n        self.annotations\r\n            .push(Instruction::decorate(id, decoration, operands));\r\n    }\r\n\r\n    fn write_function(\r\n        &mut self,\r\n        ir_function: &crate::Function,\r\n        info: &FunctionInfo,\r\n        ir_module: &crate::Module,\r\n        mut interface: Option<FunctionInterface>,\r\n    ) -> Result<Word, Error> {\r\n        let mut function = Function::default();\r\n\r\n        for (handle, variable) in ir_function.local_variables.iter() {\r\n            let id = self.id_gen.next();\r\n\r\n            if self.flags.contains(WriterFlags::DEBUG) {\r\n                if let Some(ref name) = variable.name {\r\n                    self.debugs.push(Instruction::name(id, name));\r\n                }\r\n            }\r\n\r\n            let init_word = variable\r\n                .init\r\n                .map(|constant| self.constant_ids[constant.index()]);\r\n            let pointer_type_id =\r\n                self.get_pointer_id(&ir_module.types, variable.ty, spirv::StorageClass::Function)?;\r\n            let instruction = Instruction::variable(\r\n                pointer_type_id,\r\n                id,\r\n                spirv::StorageClass::Function,\r\n                init_word.or_else(|| {\r\n                    let type_id = self.get_type_id(LookupType::Handle(variable.ty));\r\n                    Some(self.write_constant_null(type_id))\r\n                }),\r\n            );\r\n            function\r\n                .variables\r\n                .insert(handle, LocalVariable { id, instruction });\r\n        }\r\n\r\n        let prelude_id = self.id_gen.next();\r\n        let mut prelude = Block::new(prelude_id);\r\n        let mut ep_context = EntryPointContext {\r\n            argument_ids: Vec::new(),\r\n            results: Vec::new(),\r\n        };\r\n\r\n        let mut parameter_type_ids = Vec::with_capacity(ir_function.arguments.len());\r\n        for argument in ir_function.arguments.iter() {\r\n            let class = spirv::StorageClass::Input;\r\n            let handle_ty = ir_module.types[argument.ty].inner.is_handle();\r\n            let argument_type_id = match handle_ty {\r\n                true => self.get_pointer_id(\r\n                    &ir_module.types,\r\n                    argument.ty,\r\n                    spirv::StorageClass::UniformConstant,\r\n                )?,\r\n                false => self.get_type_id(LookupType::Handle(argument.ty)),\r\n            };\r\n\r\n            if let Some(ref mut iface) = interface {\r\n                let id = if let Some(ref binding) = argument.binding {\r\n                    let name = argument.name.as_deref();\r\n\r\n                    let varying_id = self.write_varying(\r\n                        ir_module,\r\n                        iface.stage,\r\n                        class,\r\n                        name,\r\n                        argument.ty,\r\n                        binding,\r\n                    )?;\r\n                    iface.varying_ids.push(varying_id);\r\n                    let id = self.id_gen.next();\r\n                    prelude\r\n                        .body\r\n                        .push(Instruction::load(argument_type_id, id, varying_id, None));\r\n                    id\r\n                } else if let crate::TypeInner::Struct { ref members, .. } =\r\n                    ir_module.types[argument.ty].inner\r\n                {\r\n                    let struct_id = self.id_gen.next();\r\n                    let mut constituent_ids = Vec::with_capacity(members.len());\r\n                    for member in members {\r\n                        let type_id = self.get_type_id(LookupType::Handle(member.ty));\r\n                        let name = member.name.as_deref();\r\n                        let binding = member.binding.as_ref().unwrap();\r\n                        let varying_id = self.write_varying(\r\n                            ir_module,\r\n                            iface.stage,\r\n                            class,\r\n                            name,\r\n                            member.ty,\r\n                            binding,\r\n                        )?;\r\n                        iface.varying_ids.push(varying_id);\r\n                        let id = self.id_gen.next();\r\n                        prelude\r\n                            .body\r\n                            .push(Instruction::load(type_id, id, varying_id, None));\r\n                        constituent_ids.push(id);\r\n                    }\r\n                    prelude.body.push(Instruction::composite_construct(\r\n                        argument_type_id,\r\n                        struct_id,\r\n                        &constituent_ids,\r\n                    ));\r\n                    struct_id\r\n                } else {\r\n                    unreachable!(\"Missing argument binding on an entry point\");\r\n                };\r\n                ep_context.argument_ids.push(id);\r\n            } else {\r\n                let argument_id = self.id_gen.next();\r\n                let instruction = Instruction::function_parameter(argument_type_id, argument_id);\r\n                if self.flags.contains(WriterFlags::DEBUG) {\r\n                    if let Some(ref name) = argument.name {\r\n                        self.debugs.push(Instruction::name(argument_id, name));\r\n                    }\r\n                }\r\n                function.parameters.push(FunctionArgument {\r\n                    instruction,\r\n                    handle_id: if handle_ty {\r\n                        let id = self.id_gen.next();\r\n                        prelude.body.push(Instruction::load(\r\n                            self.get_type_id(LookupType::Handle(argument.ty)),\r\n                            id,\r\n                            argument_id,\r\n                            None,\r\n                        ));\r\n                        id\r\n                    } else {\r\n                        0\r\n                    },\r\n                });\r\n                parameter_type_ids.push(argument_type_id);\r\n            };\r\n        }\r\n\r\n        let return_type_id = match ir_function.result {\r\n            Some(ref result) => {\r\n                if let Some(ref mut iface) = interface {\r\n                    let mut has_point_size = false;\r\n                    let class = spirv::StorageClass::Output;\r\n                    if let Some(ref binding) = result.binding {\r\n                        has_point_size |=\r\n                            *binding == crate::Binding::BuiltIn(crate::BuiltIn::PointSize);\r\n                        let type_id = self.get_type_id(LookupType::Handle(result.ty));\r\n                        let varying_id = self.write_varying(\r\n                            ir_module,\r\n                            iface.stage,\r\n                            class,\r\n                            None,\r\n                            result.ty,\r\n                            binding,\r\n                        )?;\r\n                        iface.varying_ids.push(varying_id);\r\n                        ep_context.results.push(ResultMember {\r\n                            id: varying_id,\r\n                            type_id,\r\n                            built_in: binding.to_built_in(),\r\n                        });\r\n                    } else if let crate::TypeInner::Struct { ref members, .. } =\r\n                        ir_module.types[result.ty].inner\r\n                    {\r\n                        for member in members {\r\n                            let type_id = self.get_type_id(LookupType::Handle(member.ty));\r\n                            let name = member.name.as_deref();\r\n                            let binding = member.binding.as_ref().unwrap();\r\n                            has_point_size |=\r\n                                *binding == crate::Binding::BuiltIn(crate::BuiltIn::PointSize);\r\n                            let varying_id = self.write_varying(\r\n                                ir_module,\r\n                                iface.stage,\r\n                                class,\r\n                                name,\r\n                                member.ty,\r\n                                binding,\r\n                            )?;\r\n                            iface.varying_ids.push(varying_id);\r\n                            ep_context.results.push(ResultMember {\r\n                                id: varying_id,\r\n                                type_id,\r\n                                built_in: binding.to_built_in(),\r\n                            });\r\n                        }\r\n                    } else {\r\n                        unreachable!(\"Missing result binding on an entry point\");\r\n                    }\r\n\r\n                    if self.flags.contains(WriterFlags::FORCE_POINT_SIZE)\r\n                        && iface.stage == crate::ShaderStage::Vertex\r\n                        && !has_point_size\r\n                    {\r\n                        // add point size artificially\r\n                        let varying_id = self.id_gen.next();\r\n                        let pointer_type_id = self.get_float_pointer_type_id(class);\r\n                        Instruction::variable(pointer_type_id, varying_id, class, None)\r\n                            .to_words(&mut self.logical_layout.declarations);\r\n                        self.decorate(\r\n                            varying_id,\r\n                            spirv::Decoration::BuiltIn,\r\n                            &[spirv::BuiltIn::PointSize as u32],\r\n                        );\r\n                        iface.varying_ids.push(varying_id);\r\n\r\n                        let default_value_id =\r\n                            self.get_constant_scalar(crate::ScalarValue::Float(1.0), 4);\r\n                        prelude\r\n                            .body\r\n                            .push(Instruction::store(varying_id, default_value_id, None));\r\n                    }\r\n                    self.void_type\r\n                } else {\r\n                    self.get_type_id(LookupType::Handle(result.ty))\r\n                }\r\n            }\r\n            None => self.void_type,\r\n        };\r\n\r\n        let lookup_function_type = LookupFunctionType {\r\n            parameter_type_ids,\r\n            return_type_id,\r\n        };\r\n\r\n        let function_id = self.id_gen.next();\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            if let Some(ref name) = ir_function.name {\r\n                self.debugs.push(Instruction::name(function_id, name));\r\n            }\r\n        }\r\n\r\n        let function_type = self.get_function_type(lookup_function_type);\r\n        function.signature = Some(Instruction::function(\r\n            return_type_id,\r\n            function_id,\r\n            spirv::FunctionControl::empty(),\r\n            function_type,\r\n        ));\r\n\r\n        if interface.is_some() {\r\n            function.entry_point_context = Some(ep_context);\r\n        }\r\n\r\n        // fill up the `GlobalVariable::access_id`\r\n        for gv in self.global_variables.iter_mut() {\r\n            gv.reset_for_function();\r\n        }\r\n        for (handle, var) in ir_module.global_variables.iter() {\r\n            if info[handle].is_empty() {\r\n                continue;\r\n            }\r\n\r\n            let mut gv = self.global_variables[handle.index()].clone();\r\n\r\n            // Handle globals are pre-emitted and should be loaded automatically.\r\n            //\r\n            // Any that are binding arrays we skip as we cannot load the array, we must load the result after indexing.\r\n            let is_binding_array = match ir_module.types[var.ty].inner {\r\n                crate::TypeInner::BindingArray { .. } => true,\r\n                _ => false,\r\n            };\r\n\r\n            if var.space == crate::AddressSpace::Handle && !is_binding_array {\r\n                let var_type_id = self.get_type_id(LookupType::Handle(var.ty));\r\n                let id = self.id_gen.next();\r\n                prelude\r\n                    .body\r\n                    .push(Instruction::load(var_type_id, id, gv.var_id, None));\r\n                gv.access_id = gv.var_id;\r\n                gv.handle_id = id;\r\n            } else if global_needs_wrapper(ir_module, var) {\r\n                let class = map_storage_class(var.space);\r\n                let pointer_type_id = self.get_pointer_id(&ir_module.types, var.ty, class)?;\r\n                let index_id = self.get_index_constant(0);\r\n\r\n                let id = self.id_gen.next();\r\n                prelude.body.push(Instruction::access_chain(\r\n                    pointer_type_id,\r\n                    id,\r\n                    gv.var_id,\r\n                    &[index_id],\r\n                ));\r\n                gv.access_id = id;\r\n            } else {\r\n                // by default, the variable ID is accessed as is\r\n                gv.access_id = gv.var_id;\r\n            };\r\n\r\n            // work around borrow checking in the presence of `self.xxx()` calls\r\n            self.global_variables[handle.index()] = gv;\r\n        }\r\n\r\n        // Create a `BlockContext` for generating SPIR-V for the function's\r\n        // body.\r\n        let mut context = BlockContext {\r\n            ir_module,\r\n            ir_function,\r\n            fun_info: info,\r\n            function: &mut function,\r\n            // Re-use the cached expression table from prior functions.\r\n            cached: std::mem::take(&mut self.saved_cached),\r\n\r\n            // Steal the Writer's temp list for a bit.\r\n            temp_list: std::mem::take(&mut self.temp_list),\r\n            writer: self,\r\n        };\r\n\r\n        // fill up the pre-emitted expressions\r\n        context.cached.reset(ir_function.expressions.len());\r\n        for (handle, expr) in ir_function.expressions.iter() {\r\n            if expr.needs_pre_emit() {\r\n                context.cache_expression_value(handle, &mut prelude)?;\r\n            }\r\n        }\r\n\r\n        let main_id = context.gen_id();\r\n        context\r\n            .function\r\n            .consume(prelude, Instruction::branch(main_id));\r\n        context.write_block(\r\n            main_id,\r\n            &ir_function.body,\r\n            super::block::BlockExit::Return,\r\n            LoopContext::default(),\r\n        )?;\r\n\r\n        // Consume the `BlockContext`, ending its borrows and letting the\r\n        // `Writer` steal back its cached expression table and temp_list.\r\n        let BlockContext {\r\n            cached, temp_list, ..\r\n        } = context;\r\n        self.saved_cached = cached;\r\n        self.temp_list = temp_list;\r\n\r\n        function.to_words(&mut self.logical_layout.function_definitions);\r\n        Instruction::function_end().to_words(&mut self.logical_layout.function_definitions);\r\n\r\n        Ok(function_id)\r\n    }\r\n\r\n    fn write_execution_mode(\r\n        &mut self,\r\n        function_id: Word,\r\n        mode: spirv::ExecutionMode,\r\n    ) -> Result<(), Error> {\r\n        //self.check(mode.required_capabilities())?;\r\n        Instruction::execution_mode(function_id, mode, &[])\r\n            .to_words(&mut self.logical_layout.execution_modes);\r\n        Ok(())\r\n    }\r\n\r\n    // TODO Move to instructions module\r\n    fn write_entry_point(\r\n        &mut self,\r\n        entry_point: &crate::EntryPoint,\r\n        info: &FunctionInfo,\r\n        ir_module: &crate::Module,\r\n    ) -> Result<Instruction, Error> {\r\n        let mut interface_ids = Vec::new();\r\n        let function_id = self.write_function(\r\n            &entry_point.function,\r\n            info,\r\n            ir_module,\r\n            Some(FunctionInterface {\r\n                varying_ids: &mut interface_ids,\r\n                stage: entry_point.stage,\r\n            }),\r\n        )?;\r\n\r\n        let exec_model = match entry_point.stage {\r\n            crate::ShaderStage::Vertex => spirv::ExecutionModel::Vertex,\r\n            crate::ShaderStage::Fragment => {\r\n                self.write_execution_mode(function_id, spirv::ExecutionMode::OriginUpperLeft)?;\r\n                if let Some(ref result) = entry_point.function.result {\r\n                    if contains_builtin(\r\n                        result.binding.as_ref(),\r\n                        result.ty,\r\n                        &ir_module.types,\r\n                        crate::BuiltIn::FragDepth,\r\n                    ) {\r\n                        self.write_execution_mode(\r\n                            function_id,\r\n                            spirv::ExecutionMode::DepthReplacing,\r\n                        )?;\r\n                    }\r\n                }\r\n                spirv::ExecutionModel::Fragment\r\n            }\r\n            crate::ShaderStage::Compute => {\r\n                let execution_mode = spirv::ExecutionMode::LocalSize;\r\n                //self.check(execution_mode.required_capabilities())?;\r\n                Instruction::execution_mode(\r\n                    function_id,\r\n                    execution_mode,\r\n                    &entry_point.workgroup_size,\r\n                )\r\n                .to_words(&mut self.logical_layout.execution_modes);\r\n                spirv::ExecutionModel::GLCompute\r\n            }\r\n        };\r\n        //self.check(exec_model.required_capabilities())?;\r\n\r\n        Ok(Instruction::entry_point(\r\n            exec_model,\r\n            function_id,\r\n            &entry_point.name,\r\n            interface_ids.as_slice(),\r\n        ))\r\n    }\r\n\r\n    fn make_scalar(\r\n        &mut self,\r\n        id: Word,\r\n        kind: crate::ScalarKind,\r\n        width: crate::Bytes,\r\n    ) -> Instruction {\r\n        use crate::ScalarKind as Sk;\r\n\r\n        let bits = (width * BITS_PER_BYTE) as u32;\r\n        match kind {\r\n            Sk::Sint | Sk::Uint => {\r\n                let signedness = if kind == Sk::Sint {\r\n                    super::instructions::Signedness::Signed\r\n                } else {\r\n                    super::instructions::Signedness::Unsigned\r\n                };\r\n                let cap = match bits {\r\n                    8 => Some(spirv::Capability::Int8),\r\n                    16 => Some(spirv::Capability::Int16),\r\n                    64 => Some(spirv::Capability::Int64),\r\n                    _ => None,\r\n                };\r\n                if let Some(cap) = cap {\r\n                    self.capabilities_used.insert(cap);\r\n                }\r\n                Instruction::type_int(id, bits, signedness)\r\n            }\r\n            Sk::Float => {\r\n                if bits == 64 {\r\n                    self.capabilities_used.insert(spirv::Capability::Float64);\r\n                }\r\n                Instruction::type_float(id, bits)\r\n            }\r\n            Sk::Bool => Instruction::type_bool(id),\r\n        }\r\n    }\r\n\r\n    fn request_image_capabilities(&mut self, inner: &crate::TypeInner) -> Result<(), Error> {\r\n        if let crate::TypeInner::Image {\r\n            dim,\r\n            arrayed,\r\n            class,\r\n        } = *inner\r\n        {\r\n            let sampled = match class {\r\n                crate::ImageClass::Sampled { .. } => true,\r\n                crate::ImageClass::Depth { .. } => true,\r\n                crate::ImageClass::Storage { format, .. } => {\r\n                    self.request_image_format_capabilities(format.into())?;\r\n                    false\r\n                }\r\n            };\r\n\r\n            match dim {\r\n                crate::ImageDimension::D1 => {\r\n                    if sampled {\r\n                        self.require_any(\"sampled 1D images\", &[spirv::Capability::Sampled1D])?;\r\n                    } else {\r\n                        self.require_any(\"1D storage images\", &[spirv::Capability::Image1D])?;\r\n                    }\r\n                }\r\n                crate::ImageDimension::Cube if arrayed => {\r\n                    if sampled {\r\n                        self.require_any(\r\n                            \"sampled cube array images\",\r\n                            &[spirv::Capability::SampledCubeArray],\r\n                        )?;\r\n                    } else {\r\n                        self.require_any(\r\n                            \"cube array storage images\",\r\n                            &[spirv::Capability::ImageCubeArray],\r\n                        )?;\r\n                    }\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn write_type_declaration_local(&mut self, id: Word, local_ty: LocalType) {\r\n        let instruction = match local_ty {\r\n            LocalType::Value {\r\n                vector_size: None,\r\n                kind,\r\n                width,\r\n                pointer_space: None,\r\n            } => self.make_scalar(id, kind, width),\r\n            LocalType::Value {\r\n                vector_size: Some(size),\r\n                kind,\r\n                width,\r\n                pointer_space: None,\r\n            } => {\r\n                let scalar_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n                    vector_size: None,\r\n                    kind,\r\n                    width,\r\n                    pointer_space: None,\r\n                }));\r\n                Instruction::type_vector(id, scalar_id, size)\r\n            }\r\n            LocalType::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                let vector_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n                    vector_size: Some(rows),\r\n                    kind: crate::ScalarKind::Float,\r\n                    width,\r\n                    pointer_space: None,\r\n                }));\r\n                Instruction::type_matrix(id, vector_id, columns)\r\n            }\r\n            LocalType::Pointer { base, class } => {\r\n                let type_id = self.get_type_id(LookupType::Handle(base));\r\n                Instruction::type_pointer(id, class, type_id)\r\n            }\r\n            LocalType::Value {\r\n                vector_size,\r\n                kind,\r\n                width,\r\n                pointer_space: Some(class),\r\n            } => {\r\n                let type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n                    vector_size,\r\n                    kind,\r\n                    width,\r\n                    pointer_space: None,\r\n                }));\r\n                Instruction::type_pointer(id, class, type_id)\r\n            }\r\n            LocalType::Image(image) => {\r\n                let local_type = LocalType::Value {\r\n                    vector_size: None,\r\n                    kind: image.sampled_type,\r\n                    width: 4,\r\n                    pointer_space: None,\r\n                };\r\n                let type_id = self.get_type_id(LookupType::Local(local_type));\r\n                Instruction::type_image(id, type_id, image.dim, image.flags, image.image_format)\r\n            }\r\n            LocalType::Sampler => Instruction::type_sampler(id),\r\n            LocalType::SampledImage { image_type_id } => {\r\n                Instruction::type_sampled_image(id, image_type_id)\r\n            }\r\n            LocalType::BindingArray { base, size } => {\r\n                let inner_ty = self.get_type_id(LookupType::Handle(base));\r\n                let scalar_id = self.get_constant_scalar(crate::ScalarValue::Uint(size), 4);\r\n                Instruction::type_array(id, inner_ty, scalar_id)\r\n            }\r\n            LocalType::PointerToBindingArray { base, size } => {\r\n                let inner_ty =\r\n                    self.get_type_id(LookupType::Local(LocalType::BindingArray { base, size }));\r\n                Instruction::type_pointer(id, spirv::StorageClass::UniformConstant, inner_ty)\r\n            }\r\n        };\r\n\r\n        instruction.to_words(&mut self.logical_layout.declarations);\r\n    }\r\n\r\n    fn write_type_declaration_arena(\r\n        &mut self,\r\n        arena: &UniqueArena<crate::Type>,\r\n        handle: Handle<crate::Type>,\r\n    ) -> Result<Word, Error> {\r\n        let ty = &arena[handle];\r\n        let id = if let Some(local) = make_local(&ty.inner) {\r\n            // This type can be represented as a `LocalType`, so check if we've\r\n            // already written an instruction for it. If not, do so now, with\r\n            // `write_type_declaration_local`.\r\n            match self.lookup_type.entry(LookupType::Local(local)) {\r\n                // We already have an id for this `LocalType`.\r\n                Entry::Occupied(e) => *e.get(),\r\n\r\n                // It's a type we haven't seen before.\r\n                Entry::Vacant(e) => {\r\n                    let id = self.id_gen.next();\r\n                    e.insert(id);\r\n\r\n                    self.write_type_declaration_local(id, local);\r\n\r\n                    // If it's an image type, request SPIR-V capabilities here, so\r\n                    // write_type_declaration_local can stay infallible.\r\n                    self.request_image_capabilities(&ty.inner)?;\r\n\r\n                    id\r\n                }\r\n            }\r\n        } else {\r\n            use spirv::Decoration;\r\n\r\n            let id = self.id_gen.next();\r\n            let instruction = match ty.inner {\r\n                crate::TypeInner::Array { base, size, stride } => {\r\n                    self.decorate(id, Decoration::ArrayStride, &[stride]);\r\n\r\n                    let type_id = self.get_type_id(LookupType::Handle(base));\r\n                    match size {\r\n                        crate::ArraySize::Constant(const_handle) => {\r\n                            let length_id = self.constant_ids[const_handle.index()];\r\n                            Instruction::type_array(id, type_id, length_id)\r\n                        }\r\n                        crate::ArraySize::Dynamic => Instruction::type_runtime_array(id, type_id),\r\n                    }\r\n                }\r\n                crate::TypeInner::BindingArray { base, size } => {\r\n                    let type_id = self.get_type_id(LookupType::Handle(base));\r\n                    match size {\r\n                        crate::ArraySize::Constant(const_handle) => {\r\n                            let length_id = self.constant_ids[const_handle.index()];\r\n                            Instruction::type_array(id, type_id, length_id)\r\n                        }\r\n                        crate::ArraySize::Dynamic => Instruction::type_runtime_array(id, type_id),\r\n                    }\r\n                }\r\n                crate::TypeInner::Struct {\r\n                    ref members,\r\n                    span: _,\r\n                } => {\r\n                    let mut member_ids = Vec::with_capacity(members.len());\r\n                    for (index, member) in members.iter().enumerate() {\r\n                        self.decorate_struct_member(id, index, member, arena)?;\r\n                        let member_id = self.get_type_id(LookupType::Handle(member.ty));\r\n                        member_ids.push(member_id);\r\n                    }\r\n                    Instruction::type_struct(id, member_ids.as_slice())\r\n                }\r\n\r\n                // These all have TypeLocal representations, so they should have been\r\n                // handled by `write_type_declaration_local` above.\r\n                crate::TypeInner::Scalar { .. }\r\n                | crate::TypeInner::Atomic { .. }\r\n                | crate::TypeInner::Vector { .. }\r\n                | crate::TypeInner::Matrix { .. }\r\n                | crate::TypeInner::Pointer { .. }\r\n                | crate::TypeInner::ValuePointer { .. }\r\n                | crate::TypeInner::Image { .. }\r\n                | crate::TypeInner::Sampler { .. } => unreachable!(),\r\n            };\r\n\r\n            instruction.to_words(&mut self.logical_layout.declarations);\r\n            id\r\n        };\r\n\r\n        // Add this handle as a new alias for that type.\r\n        self.lookup_type.insert(LookupType::Handle(handle), id);\r\n\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            if let Some(ref name) = ty.name {\r\n                self.debugs.push(Instruction::name(id, name));\r\n            }\r\n        }\r\n\r\n        Ok(id)\r\n    }\r\n\r\n    fn request_image_format_capabilities(\r\n        &mut self,\r\n        format: spirv::ImageFormat,\r\n    ) -> Result<(), Error> {\r\n        use spirv::ImageFormat as If;\r\n        match format {\r\n            If::Rg32f\r\n            | If::Rg16f\r\n            | If::R11fG11fB10f\r\n            | If::R16f\r\n            | If::Rgba16\r\n            | If::Rgb10A2\r\n            | If::Rg16\r\n            | If::Rg8\r\n            | If::R16\r\n            | If::R8\r\n            | If::Rgba16Snorm\r\n            | If::Rg16Snorm\r\n            | If::Rg8Snorm\r\n            | If::R16Snorm\r\n            | If::R8Snorm\r\n            | If::Rg32i\r\n            | If::Rg16i\r\n            | If::Rg8i\r\n            | If::R16i\r\n            | If::R8i\r\n            | If::Rgb10a2ui\r\n            | If::Rg32ui\r\n            | If::Rg16ui\r\n            | If::Rg8ui\r\n            | If::R16ui\r\n            | If::R8ui => self.require_any(\r\n                \"storage image format\",\r\n                &[spirv::Capability::StorageImageExtendedFormats],\r\n            ),\r\n            If::R64ui | If::R64i => self.require_any(\r\n                \"64-bit integer storage image format\",\r\n                &[spirv::Capability::Int64ImageEXT],\r\n            ),\r\n            If::Unknown\r\n            | If::Rgba32f\r\n            | If::Rgba16f\r\n            | If::R32f\r\n            | If::Rgba8\r\n            | If::Rgba8Snorm\r\n            | If::Rgba32i\r\n            | If::Rgba16i\r\n            | If::Rgba8i\r\n            | If::R32i\r\n            | If::Rgba32ui\r\n            | If::Rgba16ui\r\n            | If::Rgba8ui\r\n            | If::R32ui => Ok(()),\r\n        }\r\n    }\r\n\r\n    pub(super) fn get_index_constant(&mut self, index: Word) -> Word {\r\n        self.get_constant_scalar(crate::ScalarValue::Uint(index as _), 4)\r\n    }\r\n\r\n    pub(super) fn get_constant_scalar(\r\n        &mut self,\r\n        value: crate::ScalarValue,\r\n        width: crate::Bytes,\r\n    ) -> Word {\r\n        if let Some(&id) = self.cached_constants.get(&(value, width)) {\r\n            return id;\r\n        }\r\n        let id = self.id_gen.next();\r\n        self.write_constant_scalar(id, &value, width, None);\r\n        self.cached_constants.insert((value, width), id);\r\n        id\r\n    }\r\n\r\n    fn write_constant_scalar(\r\n        &mut self,\r\n        id: Word,\r\n        value: &crate::ScalarValue,\r\n        width: crate::Bytes,\r\n        debug_name: Option<&String>,\r\n    ) {\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            if let Some(name) = debug_name {\r\n                self.debugs.push(Instruction::name(id, name));\r\n            }\r\n        }\r\n        let type_id = self.get_type_id(LookupType::Local(LocalType::Value {\r\n            vector_size: None,\r\n            kind: value.scalar_kind(),\r\n            width,\r\n            pointer_space: None,\r\n        }));\r\n        let (solo, pair);\r\n        let instruction = match *value {\r\n            crate::ScalarValue::Sint(val) => {\r\n                let words = match width {\r\n                    4 => {\r\n                        solo = [val as u32];\r\n                        &solo[..]\r\n                    }\r\n                    8 => {\r\n                        pair = [val as u32, (val >> 32) as u32];\r\n                        &pair\r\n                    }\r\n                    _ => unreachable!(),\r\n                };\r\n                Instruction::constant(type_id, id, words)\r\n            }\r\n            crate::ScalarValue::Uint(val) => {\r\n                let words = match width {\r\n                    4 => {\r\n                        solo = [val as u32];\r\n                        &solo[..]\r\n                    }\r\n                    8 => {\r\n                        pair = [val as u32, (val >> 32) as u32];\r\n                        &pair\r\n                    }\r\n                    _ => unreachable!(),\r\n                };\r\n                Instruction::constant(type_id, id, words)\r\n            }\r\n            crate::ScalarValue::Float(val) => {\r\n                let words = match width {\r\n                    4 => {\r\n                        solo = [(val as f32).to_bits()];\r\n                        &solo[..]\r\n                    }\r\n                    8 => {\r\n                        let bits = f64::to_bits(val);\r\n                        pair = [bits as u32, (bits >> 32) as u32];\r\n                        &pair\r\n                    }\r\n                    _ => unreachable!(),\r\n                };\r\n                Instruction::constant(type_id, id, words)\r\n            }\r\n            crate::ScalarValue::Bool(true) => Instruction::constant_true(type_id, id),\r\n            crate::ScalarValue::Bool(false) => Instruction::constant_false(type_id, id),\r\n        };\r\n\r\n        instruction.to_words(&mut self.logical_layout.declarations);\r\n    }\r\n\r\n    fn write_constant_composite(\r\n        &mut self,\r\n        id: Word,\r\n        ty: Handle<crate::Type>,\r\n        components: &[Handle<crate::Constant>],\r\n    ) -> Result<(), Error> {\r\n        let mut constituent_ids = Vec::with_capacity(components.len());\r\n        for constituent in components.iter() {\r\n            let constituent_id = self.constant_ids[constituent.index()];\r\n            constituent_ids.push(constituent_id);\r\n        }\r\n\r\n        let type_id = self.get_type_id(LookupType::Handle(ty));\r\n        Instruction::constant_composite(type_id, id, constituent_ids.as_slice())\r\n            .to_words(&mut self.logical_layout.declarations);\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn write_constant_null(&mut self, type_id: Word) -> Word {\r\n        let null_id = self.id_gen.next();\r\n        Instruction::constant_null(type_id, null_id)\r\n            .to_words(&mut self.logical_layout.declarations);\r\n        null_id\r\n    }\r\n\r\n    /// Generate an `OpVariable` for one value in an [`EntryPoint`]'s IO interface.\r\n    ///\r\n    /// The [`Binding`]s of the arguments and result of an [`EntryPoint`]'s\r\n    /// [`Function`] describe a SPIR-V shader interface. In SPIR-V, the\r\n    /// interface is represented by global variables in the `Input` and `Output`\r\n    /// storage classes, with decorations indicating which builtin or location\r\n    /// each variable corresponds to.\r\n    ///\r\n    /// This function emits a single global `OpVariable` for a single value from\r\n    /// the interface, and adds appropriate decorations to indicate which\r\n    /// builtin or location it represents, how it should be interpolated, and so\r\n    /// on. The `class` argument gives the variable's SPIR-V storage class,\r\n    /// which should be either [`Input`] or [`Output`].\r\n    ///\r\n    /// [`Binding`]: crate::Binding\r\n    /// [`Function`]: crate::Function\r\n    /// [`EntryPoint`]: crate::EntryPoint\r\n    /// [`Input`]: spirv::StorageClass::Input\r\n    /// [`Output`]: spirv::StorageClass::Output\r\n    fn write_varying(\r\n        &mut self,\r\n        ir_module: &crate::Module,\r\n        stage: crate::ShaderStage,\r\n        class: spirv::StorageClass,\r\n        debug_name: Option<&str>,\r\n        ty: Handle<crate::Type>,\r\n        binding: &crate::Binding,\r\n    ) -> Result<Word, Error> {\r\n        let id = self.id_gen.next();\r\n        let pointer_type_id = self.get_pointer_id(&ir_module.types, ty, class)?;\r\n        Instruction::variable(pointer_type_id, id, class, None)\r\n            .to_words(&mut self.logical_layout.declarations);\r\n\r\n        if self\r\n            .flags\r\n            .contains(WriterFlags::DEBUG | WriterFlags::LABEL_VARYINGS)\r\n        {\r\n            if let Some(name) = debug_name {\r\n                self.debugs.push(Instruction::name(id, name));\r\n            }\r\n        }\r\n\r\n        use spirv::{BuiltIn, Decoration};\r\n\r\n        match *binding {\r\n            crate::Binding::Location {\r\n                location,\r\n                interpolation,\r\n                sampling,\r\n            } => {\r\n                self.decorate(id, Decoration::Location, &[location]);\r\n\r\n                // The Vulkan spec says: VUID-StandaloneSpirv-Flat-06202\r\n                //\r\n                // > The Flat, NoPerspective, Sample, and Centroid decorations\r\n                // > must not be used on variables with the Input storage class in\r\n                // > a vertex shader\r\n                if class != spirv::StorageClass::Input || stage != crate::ShaderStage::Vertex {\r\n                    match interpolation {\r\n                        // Perspective-correct interpolation is the default in SPIR-V.\r\n                        None | Some(crate::Interpolation::Perspective) => (),\r\n                        Some(crate::Interpolation::Flat) => {\r\n                            self.decorate(id, Decoration::Flat, &[]);\r\n                        }\r\n                        Some(crate::Interpolation::Linear) => {\r\n                            self.decorate(id, Decoration::NoPerspective, &[]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                match sampling {\r\n                    // Center sampling is the default in SPIR-V.\r\n                    None | Some(crate::Sampling::Center) => (),\r\n                    Some(crate::Sampling::Centroid) => {\r\n                        self.decorate(id, Decoration::Centroid, &[]);\r\n                    }\r\n                    Some(crate::Sampling::Sample) => {\r\n                        self.require_any(\r\n                            \"per-sample interpolation\",\r\n                            &[spirv::Capability::SampleRateShading],\r\n                        )?;\r\n                        self.decorate(id, Decoration::Sample, &[]);\r\n                    }\r\n                }\r\n            }\r\n            crate::Binding::BuiltIn(built_in) => {\r\n                use crate::BuiltIn as Bi;\r\n                let built_in = match built_in {\r\n                    Bi::Position { invariant } => {\r\n                        if invariant {\r\n                            self.decorate(id, Decoration::Invariant, &[]);\r\n                        }\r\n\r\n                        if class == spirv::StorageClass::Output {\r\n                            BuiltIn::Position\r\n                        } else {\r\n                            BuiltIn::FragCoord\r\n                        }\r\n                    }\r\n                    Bi::ViewIndex => {\r\n                        self.require_any(\"`view_index` built-in\", &[spirv::Capability::MultiView])?;\r\n                        BuiltIn::ViewIndex\r\n                    }\r\n                    // vertex\r\n                    Bi::BaseInstance => BuiltIn::BaseInstance,\r\n                    Bi::BaseVertex => BuiltIn::BaseVertex,\r\n                    Bi::ClipDistance => BuiltIn::ClipDistance,\r\n                    Bi::CullDistance => BuiltIn::CullDistance,\r\n                    Bi::InstanceIndex => BuiltIn::InstanceIndex,\r\n                    Bi::PointSize => BuiltIn::PointSize,\r\n                    Bi::VertexIndex => BuiltIn::VertexIndex,\r\n                    // fragment\r\n                    Bi::FragDepth => BuiltIn::FragDepth,\r\n                    Bi::FrontFacing => BuiltIn::FrontFacing,\r\n                    Bi::PrimitiveIndex => {\r\n                        self.require_any(\r\n                            \"`primitive_index` built-in\",\r\n                            &[spirv::Capability::Geometry],\r\n                        )?;\r\n                        BuiltIn::PrimitiveId\r\n                    }\r\n                    Bi::SampleIndex => {\r\n                        self.require_any(\r\n                            \"`sample_index` built-in\",\r\n                            &[spirv::Capability::SampleRateShading],\r\n                        )?;\r\n\r\n                        BuiltIn::SampleId\r\n                    }\r\n                    Bi::SampleMask => BuiltIn::SampleMask,\r\n                    // compute\r\n                    Bi::GlobalInvocationId => BuiltIn::GlobalInvocationId,\r\n                    Bi::LocalInvocationId => BuiltIn::LocalInvocationId,\r\n                    Bi::LocalInvocationIndex => BuiltIn::LocalInvocationIndex,\r\n                    Bi::WorkGroupId => BuiltIn::WorkgroupId,\r\n                    Bi::WorkGroupSize => BuiltIn::WorkgroupSize,\r\n                    Bi::NumWorkGroups => BuiltIn::NumWorkgroups,\r\n                };\r\n\r\n                self.decorate(id, Decoration::BuiltIn, &[built_in as u32]);\r\n\r\n                use crate::ScalarKind as Sk;\r\n\r\n                // Per the Vulkan spec, `VUID-StandaloneSpirv-Flat-04744`:\r\n                //\r\n                // > Any variable with integer or double-precision floating-\r\n                // > point type and with Input storage class in a fragment\r\n                // > shader, must be decorated Flat\r\n                if class == spirv::StorageClass::Input && stage == crate::ShaderStage::Fragment {\r\n                    let is_flat = match ir_module.types[ty].inner {\r\n                        crate::TypeInner::Scalar { kind, .. }\r\n                        | crate::TypeInner::Vector { kind, .. } => match kind {\r\n                            Sk::Uint | Sk::Sint | Sk::Bool => true,\r\n                            Sk::Float => false,\r\n                        },\r\n                        _ => false,\r\n                    };\r\n\r\n                    if is_flat {\r\n                        self.decorate(id, Decoration::Flat, &[]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(id)\r\n    }\r\n\r\n    fn write_global_variable(\r\n        &mut self,\r\n        ir_module: &crate::Module,\r\n        global_variable: &crate::GlobalVariable,\r\n    ) -> Result<Word, Error> {\r\n        use spirv::Decoration;\r\n\r\n        let id = self.id_gen.next();\r\n        let class = map_storage_class(global_variable.space);\r\n\r\n        //self.check(class.required_capabilities())?;\r\n\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            if let Some(ref name) = global_variable.name {\r\n                self.debugs.push(Instruction::name(id, name));\r\n            }\r\n        }\r\n\r\n        let storage_access = match global_variable.space {\r\n            crate::AddressSpace::Storage { access } => Some(access),\r\n            _ => match ir_module.types[global_variable.ty].inner {\r\n                crate::TypeInner::Image {\r\n                    class: crate::ImageClass::Storage { access, .. },\r\n                    ..\r\n                } => Some(access),\r\n                _ => None,\r\n            },\r\n        };\r\n        if let Some(storage_access) = storage_access {\r\n            if !storage_access.contains(crate::StorageAccess::LOAD) {\r\n                self.decorate(id, Decoration::NonReadable, &[]);\r\n            }\r\n            if !storage_access.contains(crate::StorageAccess::STORE) {\r\n                self.decorate(id, Decoration::NonWritable, &[]);\r\n            }\r\n        }\r\n\r\n        let mut substitute_inner_type_lookup = None;\r\n        if let Some(ref res_binding) = global_variable.binding {\r\n            self.decorate(id, Decoration::DescriptorSet, &[res_binding.group]);\r\n            self.decorate(id, Decoration::Binding, &[res_binding.binding]);\r\n\r\n            if let Some(&BindingInfo {\r\n                binding_array_size: Some(remapped_binding_array_size),\r\n            }) = self.binding_map.get(res_binding)\r\n            {\r\n                if let crate::TypeInner::BindingArray { base, .. } =\r\n                    ir_module.types[global_variable.ty].inner\r\n                {\r\n                    substitute_inner_type_lookup =\r\n                        Some(LookupType::Local(LocalType::PointerToBindingArray {\r\n                            base,\r\n                            size: remapped_binding_array_size as u64,\r\n                        }))\r\n                }\r\n            } else {\r\n            }\r\n        };\r\n\r\n        let init_word = global_variable\r\n            .init\r\n            .map(|constant| self.constant_ids[constant.index()]);\r\n        let inner_type_id = self.get_type_id(\r\n            substitute_inner_type_lookup.unwrap_or(LookupType::Handle(global_variable.ty)),\r\n        );\r\n\r\n        // generate the wrapping structure if needed\r\n        let pointer_type_id = if global_needs_wrapper(ir_module, global_variable) {\r\n            let wrapper_type_id = self.id_gen.next();\r\n\r\n            self.decorate(wrapper_type_id, Decoration::Block, &[]);\r\n            let member = crate::StructMember {\r\n                name: None,\r\n                ty: global_variable.ty,\r\n                binding: None,\r\n                offset: 0,\r\n            };\r\n            self.decorate_struct_member(wrapper_type_id, 0, &member, &ir_module.types)?;\r\n\r\n            Instruction::type_struct(wrapper_type_id, &[inner_type_id])\r\n                .to_words(&mut self.logical_layout.declarations);\r\n\r\n            let pointer_type_id = self.id_gen.next();\r\n            Instruction::type_pointer(pointer_type_id, class, wrapper_type_id)\r\n                .to_words(&mut self.logical_layout.declarations);\r\n\r\n            pointer_type_id\r\n        } else {\r\n            // This is a global variable in the Storage address space. The only\r\n            // way it could have `global_needs_wrapper() == false` is if it has\r\n            // a runtime-sized array. In this case, we need to decorate it with\r\n            // Block.\r\n            if let crate::AddressSpace::Storage { .. } = global_variable.space {\r\n                self.decorate(inner_type_id, Decoration::Block, &[]);\r\n            }\r\n            if substitute_inner_type_lookup.is_some() {\r\n                inner_type_id\r\n            } else {\r\n                self.get_pointer_id(&ir_module.types, global_variable.ty, class)?\r\n            }\r\n        };\r\n\r\n        let init_word = match global_variable.space {\r\n            crate::AddressSpace::Private => {\r\n                init_word.or_else(|| Some(self.write_constant_null(inner_type_id)))\r\n            }\r\n            _ => init_word,\r\n        };\r\n\r\n        Instruction::variable(pointer_type_id, id, class, init_word)\r\n            .to_words(&mut self.logical_layout.declarations);\r\n        Ok(id)\r\n    }\r\n\r\n    /// Write the necessary decorations for a struct member.\r\n    ///\r\n    /// Emit decorations for the `index`'th member of the struct type\r\n    /// designated by `struct_id`, described by `member`.\r\n    fn decorate_struct_member(\r\n        &mut self,\r\n        struct_id: Word,\r\n        index: usize,\r\n        member: &crate::StructMember,\r\n        arena: &UniqueArena<crate::Type>,\r\n    ) -> Result<(), Error> {\r\n        use spirv::Decoration;\r\n\r\n        self.annotations.push(Instruction::member_decorate(\r\n            struct_id,\r\n            index as u32,\r\n            Decoration::Offset,\r\n            &[member.offset],\r\n        ));\r\n\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            if let Some(ref name) = member.name {\r\n                self.debugs\r\n                    .push(Instruction::member_name(struct_id, index as u32, name));\r\n            }\r\n        }\r\n\r\n        // Matrices and arrays of matrices both require decorations,\r\n        // so \"see through\" an array to determine if they're needed.\r\n        let member_array_subty_inner = match arena[member.ty].inner {\r\n            crate::TypeInner::Array { base, .. } => &arena[base].inner,\r\n            ref other => other,\r\n        };\r\n        if let crate::TypeInner::Matrix {\r\n            columns: _,\r\n            rows,\r\n            width,\r\n        } = *member_array_subty_inner\r\n        {\r\n            let byte_stride = Alignment::from(rows) * width as u32;\r\n            self.annotations.push(Instruction::member_decorate(\r\n                struct_id,\r\n                index as u32,\r\n                Decoration::ColMajor,\r\n                &[],\r\n            ));\r\n            self.annotations.push(Instruction::member_decorate(\r\n                struct_id,\r\n                index as u32,\r\n                Decoration::MatrixStride,\r\n                &[byte_stride],\r\n            ));\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn get_function_type(&mut self, lookup_function_type: LookupFunctionType) -> Word {\r\n        match self\r\n            .lookup_function_type\r\n            .entry(lookup_function_type.clone())\r\n        {\r\n            Entry::Occupied(e) => *e.get(),\r\n            _ => {\r\n                let id = self.id_gen.next();\r\n                let instruction = Instruction::type_function(\r\n                    id,\r\n                    lookup_function_type.return_type_id,\r\n                    &lookup_function_type.parameter_type_ids,\r\n                );\r\n                instruction.to_words(&mut self.logical_layout.declarations);\r\n                self.lookup_function_type.insert(lookup_function_type, id);\r\n                id\r\n            }\r\n        }\r\n    }\r\n\r\n    fn write_physical_layout(&mut self) {\r\n        self.physical_layout.bound = self.id_gen.0 + 1;\r\n    }\r\n\r\n    fn write_logical_layout(\r\n        &mut self,\r\n        ir_module: &crate::Module,\r\n        mod_info: &ModuleInfo,\r\n        ep_index: Option<usize>,\r\n    ) -> Result<(), Error> {\r\n        fn has_view_index_check(\r\n            ir_module: &crate::Module,\r\n            binding: Option<&crate::Binding>,\r\n            ty: Handle<crate::Type>,\r\n        ) -> bool {\r\n            match ir_module.types[ty].inner {\r\n                crate::TypeInner::Struct { ref members, .. } => members.iter().any(|member| {\r\n                    has_view_index_check(ir_module, member.binding.as_ref(), member.ty)\r\n                }),\r\n                _ => binding == Some(&crate::Binding::BuiltIn(crate::BuiltIn::ViewIndex)),\r\n            }\r\n        }\r\n\r\n        let has_storage_buffers =\r\n            ir_module\r\n                .global_variables\r\n                .iter()\r\n                .any(|(_, var)| match var.space {\r\n                    crate::AddressSpace::Storage { .. } => true,\r\n                    _ => false,\r\n                });\r\n        let has_view_index = ir_module\r\n            .entry_points\r\n            .iter()\r\n            .flat_map(|entry| entry.function.arguments.iter())\r\n            .any(|arg| has_view_index_check(ir_module, arg.binding.as_ref(), arg.ty));\r\n\r\n        if self.physical_layout.version < 0x10300 && has_storage_buffers {\r\n            // enable the storage buffer class on < SPV-1.3\r\n            Instruction::extension(\"SPV_KHR_storage_buffer_storage_class\")\r\n                .to_words(&mut self.logical_layout.extensions);\r\n        }\r\n        if has_view_index {\r\n            Instruction::extension(\"SPV_KHR_multiview\")\r\n                .to_words(&mut self.logical_layout.extensions)\r\n        }\r\n        Instruction::type_void(self.void_type).to_words(&mut self.logical_layout.declarations);\r\n        Instruction::ext_inst_import(self.gl450_ext_inst_id, \"GLSL.std.450\")\r\n            .to_words(&mut self.logical_layout.ext_inst_imports);\r\n\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            self.debugs\r\n                .push(Instruction::source(spirv::SourceLanguage::GLSL, 450));\r\n        }\r\n\r\n        self.constant_ids.resize(ir_module.constants.len(), 0);\r\n        // first, output all the scalar constants\r\n        for (handle, constant) in ir_module.constants.iter() {\r\n            match constant.inner {\r\n                crate::ConstantInner::Composite { .. } => continue,\r\n                crate::ConstantInner::Scalar { width, ref value } => {\r\n                    self.constant_ids[handle.index()] = match constant.name {\r\n                        Some(ref name) => {\r\n                            let id = self.id_gen.next();\r\n                            self.write_constant_scalar(id, value, width, Some(name));\r\n                            id\r\n                        }\r\n                        None => self.get_constant_scalar(*value, width),\r\n                    };\r\n                }\r\n            }\r\n        }\r\n\r\n        // then all types, some of them may rely on constants and struct type set\r\n        for (handle, _) in ir_module.types.iter() {\r\n            self.write_type_declaration_arena(&ir_module.types, handle)?;\r\n        }\r\n\r\n        // the all the composite constants, they rely on types\r\n        for (handle, constant) in ir_module.constants.iter() {\r\n            match constant.inner {\r\n                crate::ConstantInner::Scalar { .. } => continue,\r\n                crate::ConstantInner::Composite { ty, ref components } => {\r\n                    let id = self.id_gen.next();\r\n                    self.constant_ids[handle.index()] = id;\r\n                    if self.flags.contains(WriterFlags::DEBUG) {\r\n                        if let Some(ref name) = constant.name {\r\n                            self.debugs.push(Instruction::name(id, name));\r\n                        }\r\n                    }\r\n                    self.write_constant_composite(id, ty, components)?;\r\n                }\r\n            }\r\n        }\r\n        debug_assert_eq!(self.constant_ids.iter().position(|&id| id == 0), None);\r\n\r\n        // now write all globals\r\n        for (handle, var) in ir_module.global_variables.iter() {\r\n            // If a single entry point was specified, only write `OpVariable` instructions\r\n            // for the globals it actually uses. Emit dummies for the others,\r\n            // to preserve the indices in `global_variables`.\r\n            let gvar = match ep_index {\r\n                Some(index) if mod_info.get_entry_point(index)[handle].is_empty() => {\r\n                    GlobalVariable::dummy()\r\n                }\r\n                _ => {\r\n                    let id = self.write_global_variable(ir_module, var)?;\r\n                    GlobalVariable::new(id)\r\n                }\r\n            };\r\n            self.global_variables.push(gvar);\r\n        }\r\n\r\n        // all functions\r\n        for (handle, ir_function) in ir_module.functions.iter() {\r\n            let info = &mod_info[handle];\r\n            if let Some(index) = ep_index {\r\n                let ep_info = mod_info.get_entry_point(index);\r\n                // If this function uses globals that we omitted from the SPIR-V\r\n                // because the entry point and its callees didn't use them,\r\n                // then we must skip it.\r\n                if !ep_info.dominates_global_use(info) {\r\n                    log::info!(\"Skip function {:?}\", ir_function.name);\r\n                    continue;\r\n                }\r\n            }\r\n            let id = self.write_function(ir_function, info, ir_module, None)?;\r\n            self.lookup_function.insert(handle, id);\r\n        }\r\n\r\n        // and entry points\r\n        for (index, ir_ep) in ir_module.entry_points.iter().enumerate() {\r\n            if ep_index.is_some() && ep_index != Some(index) {\r\n                continue;\r\n            }\r\n            let info = mod_info.get_entry_point(index);\r\n            let ep_instruction = self.write_entry_point(ir_ep, info, ir_module)?;\r\n            ep_instruction.to_words(&mut self.logical_layout.entry_points);\r\n        }\r\n\r\n        for capability in self.capabilities_used.iter() {\r\n            Instruction::capability(*capability).to_words(&mut self.logical_layout.capabilities);\r\n        }\r\n        for extension in self.extensions_used.iter() {\r\n            Instruction::extension(extension).to_words(&mut self.logical_layout.extensions);\r\n        }\r\n        if ir_module.entry_points.is_empty() {\r\n            // SPIR-V doesn't like modules without entry points\r\n            Instruction::capability(spirv::Capability::Linkage)\r\n                .to_words(&mut self.logical_layout.capabilities);\r\n        }\r\n\r\n        let addressing_model = spirv::AddressingModel::Logical;\r\n        let memory_model = spirv::MemoryModel::GLSL450;\r\n        //self.check(addressing_model.required_capabilities())?;\r\n        //self.check(memory_model.required_capabilities())?;\r\n\r\n        Instruction::memory_model(addressing_model, memory_model)\r\n            .to_words(&mut self.logical_layout.memory_model);\r\n\r\n        if self.flags.contains(WriterFlags::DEBUG) {\r\n            for debug in self.debugs.iter() {\r\n                debug.to_words(&mut self.logical_layout.debugs);\r\n            }\r\n        }\r\n\r\n        for annotation in self.annotations.iter() {\r\n            annotation.to_words(&mut self.logical_layout.annotations);\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn write(\r\n        &mut self,\r\n        ir_module: &crate::Module,\r\n        info: &ModuleInfo,\r\n        pipeline_options: Option<&PipelineOptions>,\r\n        words: &mut Vec<Word>,\r\n    ) -> Result<(), Error> {\r\n        self.reset();\r\n\r\n        // Try to find the entry point and corresponding index\r\n        let ep_index = match pipeline_options {\r\n            Some(po) => {\r\n                let index = ir_module\r\n                    .entry_points\r\n                    .iter()\r\n                    .position(|ep| po.shader_stage == ep.stage && po.entry_point == ep.name)\r\n                    .ok_or(Error::EntryPointNotFound)?;\r\n                Some(index)\r\n            }\r\n            None => None,\r\n        };\r\n\r\n        self.write_logical_layout(ir_module, info, ep_index)?;\r\n        self.write_physical_layout();\r\n\r\n        self.physical_layout.in_words(words);\r\n        self.logical_layout.in_words(words);\r\n        Ok(())\r\n    }\r\n\r\n    /// Return the set of capabilities the last module written used.\r\n    pub const fn get_capabilities_used(&self) -> &crate::FastHashSet<spirv::Capability> {\r\n        &self.capabilities_used\r\n    }\r\n}\r\n\r\n#[test]\r\nfn test_write_physical_layout() {\r\n    let mut writer = Writer::new(&Options::default()).unwrap();\r\n    assert_eq!(writer.physical_layout.bound, 0);\r\n    writer.write_physical_layout();\r\n    assert_eq!(writer.physical_layout.bound, 3);\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/wgsl/mod.rs",
    "content": "/*!\r\nBackend for [WGSL][wgsl] (WebGPU Shading Language).\r\n\r\n[wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html\r\n*/\r\n\r\nmod writer;\r\n\r\nuse thiserror::Error;\r\n\r\npub use writer::{Writer, WriterFlags};\r\n\r\n#[derive(Error, Debug)]\r\npub enum Error {\r\n    #[error(transparent)]\r\n    FmtError(#[from] std::fmt::Error),\r\n    #[error(\"{0}\")]\r\n    Custom(String),\r\n    #[error(\"{0}\")]\r\n    Unimplemented(String), // TODO: Error used only during development\r\n    #[error(\"Unsupported math function: {0:?}\")]\r\n    UnsupportedMathFunction(crate::MathFunction),\r\n    #[error(\"Unsupported relational function: {0:?}\")]\r\n    UnsupportedRelationalFunction(crate::RelationalFunction),\r\n}\r\n\r\npub fn write_string(\r\n    module: &crate::Module,\r\n    info: &crate::valid::ModuleInfo,\r\n    flags: WriterFlags,\r\n) -> Result<String, Error> {\r\n    let mut w = Writer::new(String::new(), flags);\r\n    w.write(module, info)?;\r\n    let output = w.finish();\r\n    Ok(output)\r\n}\r\n\r\nimpl crate::AtomicFunction {\r\n    const fn to_wgsl(self) -> &'static str {\r\n        match self {\r\n            Self::Add => \"Add\",\r\n            Self::Subtract => \"Sub\",\r\n            Self::And => \"And\",\r\n            Self::InclusiveOr => \"Or\",\r\n            Self::ExclusiveOr => \"Xor\",\r\n            Self::Min => \"Min\",\r\n            Self::Max => \"Max\",\r\n            Self::Exchange { compare: None } => \"Exchange\",\r\n            Self::Exchange { .. } => \"CompareExchangeWeak\",\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/back/wgsl/writer.rs",
    "content": "use super::Error;\r\nuse crate::{\r\n    back,\r\n    proc::{self, NameKey},\r\n    valid, Handle, Module, ShaderStage, TypeInner,\r\n};\r\nuse std::fmt::Write;\r\n\r\n/// Shorthand result used internally by the backend\r\ntype BackendResult = Result<(), Error>;\r\n\r\n/// WGSL [attribute](https://gpuweb.github.io/gpuweb/wgsl/#attributes)\r\nenum Attribute {\r\n    Binding(u32),\r\n    BuiltIn(crate::BuiltIn),\r\n    Group(u32),\r\n    Invariant,\r\n    Interpolate(Option<crate::Interpolation>, Option<crate::Sampling>),\r\n    Location(u32),\r\n    Stage(ShaderStage),\r\n    WorkGroupSize([u32; 3]),\r\n}\r\n\r\n/// The WGSL form that `write_expr_with_indirection` should use to render a Naga\r\n/// expression.\r\n///\r\n/// Sometimes a Naga `Expression` alone doesn't provide enough information to\r\n/// choose the right rendering for it in WGSL. For example, one natural WGSL\r\n/// rendering of a Naga `LocalVariable(x)` expression might be `&x`, since\r\n/// `LocalVariable` produces a pointer to the local variable's storage. But when\r\n/// rendering a `Store` statement, the `pointer` operand must be the left hand\r\n/// side of a WGSL assignment, so the proper rendering is `x`.\r\n///\r\n/// The caller of `write_expr_with_indirection` must provide an `Expected` value\r\n/// to indicate how ambiguous expressions should be rendered.\r\n#[derive(Clone, Copy, Debug)]\r\nenum Indirection {\r\n    /// Render pointer-construction expressions as WGSL `ptr`-typed expressions.\r\n    ///\r\n    /// This is the right choice for most cases. Whenever a Naga pointer\r\n    /// expression is not the `pointer` operand of a `Load` or `Store`, it\r\n    /// must be a WGSL pointer expression.\r\n    Ordinary,\r\n\r\n    /// Render pointer-construction expressions as WGSL reference-typed\r\n    /// expressions.\r\n    ///\r\n    /// For example, this is the right choice for the `pointer` operand when\r\n    /// rendering a `Store` statement as a WGSL assignment.\r\n    Reference,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct WriterFlags: u32 {\r\n        /// Always annotate the type information instead of inferring.\r\n        const EXPLICIT_TYPES = 0x1;\r\n    }\r\n}\r\n\r\npub struct Writer<W> {\r\n    out: W,\r\n    flags: WriterFlags,\r\n    names: crate::FastHashMap<NameKey, String>,\r\n    namer: proc::Namer,\r\n    named_expressions: crate::NamedExpressions,\r\n    ep_results: Vec<(ShaderStage, Handle<crate::Type>)>,\r\n}\r\n\r\nimpl<W: Write> Writer<W> {\r\n    pub fn new(out: W, flags: WriterFlags) -> Self {\r\n        Writer {\r\n            out,\r\n            flags,\r\n            names: crate::FastHashMap::default(),\r\n            namer: proc::Namer::default(),\r\n            named_expressions: crate::NamedExpressions::default(),\r\n            ep_results: vec![],\r\n        }\r\n    }\r\n\r\n    fn reset(&mut self, module: &Module) {\r\n        self.names.clear();\r\n        self.namer.reset(\r\n            module,\r\n            crate::keywords::wgsl::RESERVED,\r\n            // an identifier must not start with two underscore\r\n            &[\"__\"],\r\n            &mut self.names,\r\n        );\r\n        self.named_expressions.clear();\r\n        self.ep_results.clear();\r\n    }\r\n\r\n    pub fn write(&mut self, module: &Module, info: &valid::ModuleInfo) -> BackendResult {\r\n        self.reset(module);\r\n\r\n        // Save all ep result types\r\n        for (_, ep) in module.entry_points.iter().enumerate() {\r\n            if let Some(ref result) = ep.function.result {\r\n                self.ep_results.push((ep.stage, result.ty));\r\n            }\r\n        }\r\n\r\n        // Write all structs\r\n        for (handle, ty) in module.types.iter() {\r\n            if let TypeInner::Struct {\r\n                ref members,\r\n                span: _,\r\n            } = ty.inner\r\n            {\r\n                self.write_struct(module, handle, members)?;\r\n                writeln!(self.out)?;\r\n            }\r\n        }\r\n\r\n        // Write all constants\r\n        for (handle, constant) in module.constants.iter() {\r\n            if constant.name.is_some() {\r\n                self.write_global_constant(module, &constant.inner, handle)?;\r\n            }\r\n        }\r\n\r\n        // Write all globals\r\n        for (ty, global) in module.global_variables.iter() {\r\n            self.write_global(module, global, ty)?;\r\n        }\r\n\r\n        if !module.global_variables.is_empty() {\r\n            // Add extra newline for readability\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // Write all regular functions\r\n        for (handle, function) in module.functions.iter() {\r\n            let fun_info = &info[handle];\r\n\r\n            let func_ctx = back::FunctionCtx {\r\n                ty: back::FunctionType::Function(handle),\r\n                info: fun_info,\r\n                expressions: &function.expressions,\r\n                named_expressions: &function.named_expressions,\r\n            };\r\n\r\n            // Write the function\r\n            self.write_function(module, function, &func_ctx)?;\r\n\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // Write all entry points\r\n        for (index, ep) in module.entry_points.iter().enumerate() {\r\n            let attributes = match ep.stage {\r\n                ShaderStage::Vertex | ShaderStage::Fragment => vec![Attribute::Stage(ep.stage)],\r\n                ShaderStage::Compute => vec![\r\n                    Attribute::Stage(ShaderStage::Compute),\r\n                    Attribute::WorkGroupSize(ep.workgroup_size),\r\n                ],\r\n            };\r\n\r\n            self.write_attributes(&attributes)?;\r\n            // Add a newline after attribute\r\n            writeln!(self.out)?;\r\n\r\n            let func_ctx = back::FunctionCtx {\r\n                ty: back::FunctionType::EntryPoint(index as u16),\r\n                info: info.get_entry_point(index),\r\n                expressions: &ep.function.expressions,\r\n                named_expressions: &ep.function.named_expressions,\r\n            };\r\n            self.write_function(module, &ep.function, &func_ctx)?;\r\n\r\n            if index < module.entry_points.len() - 1 {\r\n                writeln!(self.out)?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write [`ScalarValue`](crate::ScalarValue)\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    fn write_scalar_value(&mut self, value: crate::ScalarValue) -> BackendResult {\r\n        use crate::ScalarValue as Sv;\r\n\r\n        match value {\r\n            Sv::Sint(value) => write!(self.out, \"{}\", value)?,\r\n            Sv::Uint(value) => write!(self.out, \"{}u\", value)?,\r\n            // Floats are written using `Debug` instead of `Display` because it always appends the\r\n            // decimal part even it's zero\r\n            Sv::Float(value) => write!(self.out, \"{:?}\", value)?,\r\n            Sv::Bool(value) => write!(self.out, \"{}\", value)?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write struct name\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    fn write_struct_name(&mut self, module: &Module, handle: Handle<crate::Type>) -> BackendResult {\r\n        if module.types[handle].name.is_none() {\r\n            if let Some(&(stage, _)) = self.ep_results.iter().find(|&&(_, ty)| ty == handle) {\r\n                let name = match stage {\r\n                    ShaderStage::Compute => \"ComputeOutput\",\r\n                    ShaderStage::Fragment => \"FragmentOutput\",\r\n                    ShaderStage::Vertex => \"VertexOutput\",\r\n                };\r\n\r\n                write!(self.out, \"{}\", name)?;\r\n                return Ok(());\r\n            }\r\n        }\r\n\r\n        write!(self.out, \"{}\", self.names[&NameKey::Type(handle)])?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write\r\n    /// [functions](https://gpuweb.github.io/gpuweb/wgsl/#functions)\r\n    ///\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_function(\r\n        &mut self,\r\n        module: &Module,\r\n        func: &crate::Function,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n    ) -> BackendResult {\r\n        let func_name = match func_ctx.ty {\r\n            back::FunctionType::EntryPoint(index) => &self.names[&NameKey::EntryPoint(index)],\r\n            back::FunctionType::Function(handle) => &self.names[&NameKey::Function(handle)],\r\n        };\r\n\r\n        // Write function name\r\n        write!(self.out, \"fn {}(\", func_name)?;\r\n\r\n        // Write function arguments\r\n        for (index, arg) in func.arguments.iter().enumerate() {\r\n            // Write argument attribute if a binding is present\r\n            if let Some(ref binding) = arg.binding {\r\n                self.write_attributes(&map_binding_to_attribute(\r\n                    binding,\r\n                    module.types[arg.ty].inner.scalar_kind(),\r\n                ))?;\r\n            }\r\n            // Write argument name\r\n            let argument_name = match func_ctx.ty {\r\n                back::FunctionType::Function(handle) => {\r\n                    &self.names[&NameKey::FunctionArgument(handle, index as u32)]\r\n                }\r\n                back::FunctionType::EntryPoint(ep_index) => {\r\n                    &self.names[&NameKey::EntryPointArgument(ep_index, index as u32)]\r\n                }\r\n            };\r\n\r\n            write!(self.out, \"{}: \", argument_name)?;\r\n            // Write argument type\r\n            self.write_type(module, arg.ty)?;\r\n            if index < func.arguments.len() - 1 {\r\n                // Add a separator between args\r\n                write!(self.out, \", \")?;\r\n            }\r\n        }\r\n\r\n        write!(self.out, \")\")?;\r\n\r\n        // Write function return type\r\n        if let Some(ref result) = func.result {\r\n            write!(self.out, \" -> \")?;\r\n            if let Some(ref binding) = result.binding {\r\n                self.write_attributes(&map_binding_to_attribute(\r\n                    binding,\r\n                    module.types[result.ty].inner.scalar_kind(),\r\n                ))?;\r\n            }\r\n            self.write_type(module, result.ty)?;\r\n        }\r\n\r\n        write!(self.out, \" {{\")?;\r\n        writeln!(self.out)?;\r\n\r\n        // Write function local variables\r\n        for (handle, local) in func.local_variables.iter() {\r\n            // Write indentation (only for readability)\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n\r\n            // Write the local name\r\n            // The leading space is important\r\n            write!(self.out, \"var {}: \", self.names[&func_ctx.name_key(handle)])?;\r\n\r\n            // Write the local type\r\n            self.write_type(module, local.ty)?;\r\n\r\n            // Write the local initializer if needed\r\n            if let Some(init) = local.init {\r\n                // Put the equal signal only if there's a initializer\r\n                // The leading and trailing spaces aren't needed but help with readability\r\n                write!(self.out, \" = \")?;\r\n\r\n                // Write the constant\r\n                // `write_constant` adds no trailing or leading space/newline\r\n                self.write_constant(module, init)?;\r\n            }\r\n\r\n            // Finish the local with `;` and add a newline (only for readability)\r\n            writeln!(self.out, \";\")?\r\n        }\r\n\r\n        if !func.local_variables.is_empty() {\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // Write the function body (statement list)\r\n        for sta in func.body.iter() {\r\n            // The indentation should always be 1 when writing the function body\r\n            self.write_stmt(module, sta, func_ctx, back::Level(1))?;\r\n        }\r\n\r\n        writeln!(self.out, \"}}\")?;\r\n\r\n        self.named_expressions.clear();\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method to write a attribute\r\n    fn write_attributes(&mut self, attributes: &[Attribute]) -> BackendResult {\r\n        for attribute in attributes {\r\n            match *attribute {\r\n                Attribute::Location(id) => write!(self.out, \"@location({}) \", id)?,\r\n                Attribute::BuiltIn(builtin_attrib) => {\r\n                    if let Some(builtin) = builtin_str(builtin_attrib) {\r\n                        write!(self.out, \"@builtin({}) \", builtin)?;\r\n                    } else {\r\n                        log::warn!(\"Unsupported builtin attribute: {:?}\", builtin_attrib);\r\n                    }\r\n                }\r\n                Attribute::Stage(shader_stage) => {\r\n                    let stage_str = match shader_stage {\r\n                        ShaderStage::Vertex => \"vertex\",\r\n                        ShaderStage::Fragment => \"fragment\",\r\n                        ShaderStage::Compute => \"compute\",\r\n                    };\r\n                    write!(self.out, \"@{} \", stage_str)?;\r\n                }\r\n                Attribute::WorkGroupSize(size) => {\r\n                    write!(\r\n                        self.out,\r\n                        \"@workgroup_size({}, {}, {}) \",\r\n                        size[0], size[1], size[2]\r\n                    )?;\r\n                }\r\n                Attribute::Binding(id) => write!(self.out, \"@binding({}) \", id)?,\r\n                Attribute::Group(id) => write!(self.out, \"@group({}) \", id)?,\r\n                Attribute::Invariant => write!(self.out, \"@invariant \")?,\r\n                Attribute::Interpolate(interpolation, sampling) => {\r\n                    if sampling.is_some() && sampling != Some(crate::Sampling::Center) {\r\n                        write!(\r\n                            self.out,\r\n                            \"@interpolate({}, {}) \",\r\n                            interpolation_str(\r\n                                interpolation.unwrap_or(crate::Interpolation::Perspective)\r\n                            ),\r\n                            sampling_str(sampling.unwrap_or(crate::Sampling::Center))\r\n                        )?;\r\n                    } else if interpolation.is_some()\r\n                        && interpolation != Some(crate::Interpolation::Perspective)\r\n                    {\r\n                        write!(\r\n                            self.out,\r\n                            \"@interpolate({}) \",\r\n                            interpolation_str(\r\n                                interpolation.unwrap_or(crate::Interpolation::Perspective)\r\n                            )\r\n                        )?;\r\n                    }\r\n                }\r\n            };\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write structs\r\n    ///\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_struct(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::Type>,\r\n        members: &[crate::StructMember],\r\n    ) -> BackendResult {\r\n        write!(self.out, \"struct \")?;\r\n        self.write_struct_name(module, handle)?;\r\n        write!(self.out, \" {{\")?;\r\n        writeln!(self.out)?;\r\n        for (index, member) in members.iter().enumerate() {\r\n            // Skip struct member with unsupported built in\r\n            if let Some(crate::Binding::BuiltIn(built_in)) = member.binding {\r\n                if builtin_str(built_in).is_none() {\r\n                    log::warn!(\"Skip member with unsupported builtin {:?}\", built_in);\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            // The indentation is only for readability\r\n            write!(self.out, \"{}\", back::INDENT)?;\r\n            if let Some(ref binding) = member.binding {\r\n                self.write_attributes(&map_binding_to_attribute(\r\n                    binding,\r\n                    module.types[member.ty].inner.scalar_kind(),\r\n                ))?;\r\n            }\r\n            // Write struct member name and type\r\n            let member_name = &self.names[&NameKey::StructMember(handle, index as u32)];\r\n            write!(self.out, \"{}: \", member_name)?;\r\n            self.write_type(module, member.ty)?;\r\n            write!(self.out, \",\")?;\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        write!(self.out, \"}}\")?;\r\n\r\n        writeln!(self.out)?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write non image/sampler types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    fn write_type(&mut self, module: &Module, ty: Handle<crate::Type>) -> BackendResult {\r\n        let inner = &module.types[ty].inner;\r\n        match *inner {\r\n            TypeInner::Struct { .. } => self.write_struct_name(module, ty)?,\r\n            ref other => self.write_value_type(module, other)?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write value types\r\n    ///\r\n    /// # Notes\r\n    /// Adds no trailing or leading whitespace\r\n    fn write_value_type(&mut self, module: &Module, inner: &TypeInner) -> BackendResult {\r\n        match *inner {\r\n            TypeInner::Vector { size, kind, .. } => write!(\r\n                self.out,\r\n                \"vec{}<{}>\",\r\n                back::vector_size_str(size),\r\n                scalar_kind_str(kind),\r\n            )?,\r\n            TypeInner::Sampler { comparison: false } => {\r\n                write!(self.out, \"sampler\")?;\r\n            }\r\n            TypeInner::Sampler { comparison: true } => {\r\n                write!(self.out, \"sampler_comparison\")?;\r\n            }\r\n            TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class,\r\n            } => {\r\n                // More about texture types: https://gpuweb.github.io/gpuweb/wgsl/#sampled-texture-type\r\n                use crate::ImageClass as Ic;\r\n\r\n                let dim_str = image_dimension_str(dim);\r\n                let arrayed_str = if arrayed { \"_array\" } else { \"\" };\r\n                let (class_str, multisampled_str, format_str, storage_str) = match class {\r\n                    Ic::Sampled { kind, multi } => (\r\n                        \"\",\r\n                        if multi { \"multisampled_\" } else { \"\" },\r\n                        scalar_kind_str(kind),\r\n                        \"\",\r\n                    ),\r\n                    Ic::Depth { multi } => {\r\n                        (\"depth_\", if multi { \"multisampled_\" } else { \"\" }, \"\", \"\")\r\n                    }\r\n                    Ic::Storage { format, access } => (\r\n                        \"storage_\",\r\n                        \"\",\r\n                        storage_format_str(format),\r\n                        if access.contains(crate::StorageAccess::LOAD | crate::StorageAccess::STORE)\r\n                        {\r\n                            \",read_write\"\r\n                        } else if access.contains(crate::StorageAccess::LOAD) {\r\n                            \",read\"\r\n                        } else {\r\n                            \",write\"\r\n                        },\r\n                    ),\r\n                };\r\n                write!(\r\n                    self.out,\r\n                    \"texture_{}{}{}{}\",\r\n                    class_str, multisampled_str, dim_str, arrayed_str\r\n                )?;\r\n\r\n                if !format_str.is_empty() {\r\n                    write!(self.out, \"<{}{}>\", format_str, storage_str)?;\r\n                }\r\n            }\r\n            TypeInner::Scalar { kind, .. } => {\r\n                write!(self.out, \"{}\", scalar_kind_str(kind))?;\r\n            }\r\n            TypeInner::Atomic { kind, .. } => {\r\n                write!(self.out, \"atomic<{}>\", scalar_kind_str(kind))?;\r\n            }\r\n            TypeInner::Array {\r\n                base,\r\n                size,\r\n                stride: _,\r\n            } => {\r\n                // More info https://gpuweb.github.io/gpuweb/wgsl/#array-types\r\n                // array<A, 3> -- Constant array\r\n                // array<A> -- Dynamic array\r\n                write!(self.out, \"array<\")?;\r\n                match size {\r\n                    crate::ArraySize::Constant(handle) => {\r\n                        self.write_type(module, base)?;\r\n                        write!(self.out, \",\")?;\r\n                        self.write_constant(module, handle)?;\r\n                    }\r\n                    crate::ArraySize::Dynamic => {\r\n                        self.write_type(module, base)?;\r\n                    }\r\n                }\r\n                write!(self.out, \">\")?;\r\n            }\r\n            TypeInner::BindingArray { base, size } => {\r\n                // More info https://github.com/gpuweb/gpuweb/issues/2105\r\n                write!(self.out, \"binding_array<\")?;\r\n                match size {\r\n                    crate::ArraySize::Constant(handle) => {\r\n                        self.write_type(module, base)?;\r\n                        write!(self.out, \",\")?;\r\n                        self.write_constant(module, handle)?;\r\n                    }\r\n                    crate::ArraySize::Dynamic => {\r\n                        self.write_type(module, base)?;\r\n                    }\r\n                }\r\n                write!(self.out, \">\")?;\r\n            }\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width: _,\r\n            } => {\r\n                write!(\r\n                    self.out,\r\n                    //TODO: Can matrix be other than f32?\r\n                    \"mat{}x{}<f32>\",\r\n                    back::vector_size_str(columns),\r\n                    back::vector_size_str(rows),\r\n                )?;\r\n            }\r\n            TypeInner::Pointer { base, space } => {\r\n                let (address, maybe_access) = address_space_str(space);\r\n                // Everything but `AddressSpace::Handle` gives us a `address` name, but\r\n                // Naga IR never produces pointers to handles, so it doesn't matter much\r\n                // how we write such a type. Just write it as the base type alone.\r\n                if let Some(space) = address {\r\n                    write!(self.out, \"ptr<{}, \", space)?;\r\n                }\r\n                self.write_type(module, base)?;\r\n                if address.is_some() {\r\n                    if let Some(access) = maybe_access {\r\n                        write!(self.out, \", {}\", access)?;\r\n                    }\r\n                    write!(self.out, \">\")?;\r\n                }\r\n            }\r\n            TypeInner::ValuePointer {\r\n                size: None,\r\n                kind,\r\n                width: _,\r\n                space,\r\n            } => {\r\n                let (address, maybe_access) = address_space_str(space);\r\n                if let Some(space) = address {\r\n                    write!(self.out, \"ptr<{}, {}\", space, scalar_kind_str(kind))?;\r\n                    if let Some(access) = maybe_access {\r\n                        write!(self.out, \", {}\", access)?;\r\n                    }\r\n                    write!(self.out, \">\")?;\r\n                } else {\r\n                    return Err(Error::Unimplemented(format!(\r\n                        \"ValuePointer to AddressSpace::Handle {:?}\",\r\n                        inner\r\n                    )));\r\n                }\r\n            }\r\n            TypeInner::ValuePointer {\r\n                size: Some(size),\r\n                kind,\r\n                width: _,\r\n                space,\r\n            } => {\r\n                let (address, maybe_access) = address_space_str(space);\r\n                if let Some(space) = address {\r\n                    write!(\r\n                        self.out,\r\n                        \"ptr<{}, vec{}<{}>\",\r\n                        space,\r\n                        back::vector_size_str(size),\r\n                        scalar_kind_str(kind)\r\n                    )?;\r\n                    if let Some(access) = maybe_access {\r\n                        write!(self.out, \", {}\", access)?;\r\n                    }\r\n                    write!(self.out, \">\")?;\r\n                } else {\r\n                    return Err(Error::Unimplemented(format!(\r\n                        \"ValuePointer to AddressSpace::Handle {:?}\",\r\n                        inner\r\n                    )));\r\n                }\r\n                write!(self.out, \">\")?;\r\n            }\r\n            _ => {\r\n                return Err(Error::Unimplemented(format!(\r\n                    \"write_value_type {:?}\",\r\n                    inner\r\n                )));\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n    /// Helper method used to write statements\r\n    ///\r\n    /// # Notes\r\n    /// Always adds a newline\r\n    fn write_stmt(\r\n        &mut self,\r\n        module: &Module,\r\n        stmt: &crate::Statement,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n        level: back::Level,\r\n    ) -> BackendResult {\r\n        use crate::{Expression, Statement};\r\n\r\n        match *stmt {\r\n            Statement::Emit(ref range) => {\r\n                for handle in range.clone() {\r\n                    let info = &func_ctx.info[handle];\r\n                    let expr_name = if let Some(name) = func_ctx.named_expressions.get(&handle) {\r\n                        // Front end provides names for all variables at the start of writing.\r\n                        // But we write them to step by step. We need to recache them\r\n                        // Otherwise, we could accidentally write variable name instead of full expression.\r\n                        // Also, we use sanitized names! It defense backend from generating variable with name from reserved keywords.\r\n                        Some(self.namer.call(name))\r\n                    } else if info.ref_count == 0 {\r\n                        write!(self.out, \"{}_ = \", level)?;\r\n                        self.write_expr(module, handle, func_ctx)?;\r\n                        writeln!(self.out, \";\")?;\r\n                        continue;\r\n                    } else {\r\n                        let expr = &func_ctx.expressions[handle];\r\n                        let min_ref_count = expr.bake_ref_count();\r\n                        // Forcefully creating baking expressions in some cases to help with readability\r\n                        let required_baking_expr = match *expr {\r\n                            Expression::ImageLoad { .. }\r\n                            | Expression::ImageQuery { .. }\r\n                            | Expression::ImageSample { .. } => true,\r\n                            _ => false,\r\n                        };\r\n                        if min_ref_count <= info.ref_count || required_baking_expr {\r\n                            // If expression contains unsupported builtin we should skip it\r\n                            if let Expression::Load { pointer } = func_ctx.expressions[handle] {\r\n                                if let Expression::AccessIndex { base, index } =\r\n                                    func_ctx.expressions[pointer]\r\n                                {\r\n                                    if access_to_unsupported_builtin(\r\n                                        base,\r\n                                        index,\r\n                                        module,\r\n                                        func_ctx.info,\r\n                                    ) {\r\n                                        return Ok(());\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            Some(format!(\"{}{}\", back::BAKE_PREFIX, handle.index()))\r\n                        } else {\r\n                            None\r\n                        }\r\n                    };\r\n\r\n                    if let Some(name) = expr_name {\r\n                        write!(self.out, \"{}\", level)?;\r\n                        self.start_named_expr(module, handle, func_ctx, &name)?;\r\n                        self.write_expr(module, handle, func_ctx)?;\r\n                        self.named_expressions.insert(handle, name);\r\n                        writeln!(self.out, \";\")?;\r\n                    }\r\n                }\r\n            }\r\n            // TODO: copy-paste from glsl-out\r\n            Statement::If {\r\n                condition,\r\n                ref accept,\r\n                ref reject,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"if \")?;\r\n                self.write_expr(module, condition, func_ctx)?;\r\n                writeln!(self.out, \" {{\")?;\r\n\r\n                let l2 = level.next();\r\n                for sta in accept {\r\n                    // Increase indentation to help with readability\r\n                    self.write_stmt(module, sta, func_ctx, l2)?;\r\n                }\r\n\r\n                // If there are no statements in the reject block we skip writing it\r\n                // This is only for readability\r\n                if !reject.is_empty() {\r\n                    writeln!(self.out, \"{}}} else {{\", level)?;\r\n\r\n                    for sta in reject {\r\n                        // Increase indentation to help with readability\r\n                        self.write_stmt(module, sta, func_ctx, l2)?;\r\n                    }\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            Statement::Return { value } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"return\")?;\r\n                if let Some(return_value) = value {\r\n                    // The leading space is important\r\n                    write!(self.out, \" \")?;\r\n                    self.write_expr(module, return_value, func_ctx)?;\r\n                }\r\n                writeln!(self.out, \";\")?;\r\n            }\r\n            // TODO: copy-paste from glsl-out\r\n            Statement::Kill => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"discard;\")?\r\n            }\r\n            Statement::Store { pointer, value } => {\r\n                // WGSL does not support all SPIR-V builtins and we should skip it in generated shaders.\r\n                // We already skip them when we generate struct type.\r\n                // Now we need to find expression that used struct with ignored builtins\r\n                if let Expression::AccessIndex { base, index } = func_ctx.expressions[pointer] {\r\n                    if access_to_unsupported_builtin(base, index, module, func_ctx.info) {\r\n                        return Ok(());\r\n                    }\r\n                }\r\n                write!(self.out, \"{}\", level)?;\r\n\r\n                let is_atomic = match *func_ctx.info[pointer].ty.inner_with(&module.types) {\r\n                    crate::TypeInner::Pointer { base, .. } => match module.types[base].inner {\r\n                        crate::TypeInner::Atomic { .. } => true,\r\n                        _ => false,\r\n                    },\r\n                    _ => false,\r\n                };\r\n                if is_atomic {\r\n                    write!(self.out, \"atomicStore(\")?;\r\n                    self.write_expr(module, pointer, func_ctx)?;\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, value, func_ctx)?;\r\n                    write!(self.out, \")\")?;\r\n                } else {\r\n                    self.write_expr_with_indirection(\r\n                        module,\r\n                        pointer,\r\n                        func_ctx,\r\n                        Indirection::Reference,\r\n                    )?;\r\n                    write!(self.out, \" = \")?;\r\n                    self.write_expr(module, value, func_ctx)?;\r\n                }\r\n                writeln!(self.out, \";\")?\r\n            }\r\n            Statement::Call {\r\n                function,\r\n                ref arguments,\r\n                result,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                if let Some(expr) = result {\r\n                    let name = format!(\"{}{}\", back::BAKE_PREFIX, expr.index());\r\n                    self.start_named_expr(module, expr, func_ctx, &name)?;\r\n                    self.named_expressions.insert(expr, name);\r\n                }\r\n                let func_name = &self.names[&NameKey::Function(function)];\r\n                write!(self.out, \"{}(\", func_name)?;\r\n                for (index, &argument) in arguments.iter().enumerate() {\r\n                    self.write_expr(module, argument, func_ctx)?;\r\n                    // Only write a comma if isn't the last element\r\n                    if index != arguments.len().saturating_sub(1) {\r\n                        // The leading space is for readability only\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                }\r\n                writeln!(self.out, \");\")?\r\n            }\r\n            Statement::Atomic {\r\n                pointer,\r\n                ref fun,\r\n                value,\r\n                result,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                let res_name = format!(\"{}{}\", back::BAKE_PREFIX, result.index());\r\n                self.start_named_expr(module, result, func_ctx, &res_name)?;\r\n                self.named_expressions.insert(result, res_name);\r\n\r\n                let fun_str = fun.to_wgsl();\r\n                write!(self.out, \"atomic{}(\", fun_str)?;\r\n                self.write_expr(module, pointer, func_ctx)?;\r\n                if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, cmp, func_ctx)?;\r\n                }\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, value, func_ctx)?;\r\n                writeln!(self.out, \");\")?\r\n            }\r\n            Statement::ImageStore {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                value,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"textureStore(\")?;\r\n                self.write_expr(module, image, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, coordinate, func_ctx)?;\r\n                if let Some(array_index_expr) = array_index {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, array_index_expr, func_ctx)?;\r\n                }\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, value, func_ctx)?;\r\n                writeln!(self.out, \");\")?;\r\n            }\r\n            // TODO: copy-paste from glsl-out\r\n            Statement::Block(ref block) => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"{{\")?;\r\n                for sta in block.iter() {\r\n                    // Increase the indentation to help with readability\r\n                    self.write_stmt(module, sta, func_ctx, level.next())?\r\n                }\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            Statement::Switch {\r\n                selector,\r\n                ref cases,\r\n            } => {\r\n                // Start the switch\r\n                write!(self.out, \"{}\", level)?;\r\n                write!(self.out, \"switch \")?;\r\n                self.write_expr(module, selector, func_ctx)?;\r\n                writeln!(self.out, \" {{\")?;\r\n\r\n                let type_postfix = match *func_ctx.info[selector].ty.inner_with(&module.types) {\r\n                    crate::TypeInner::Scalar {\r\n                        kind: crate::ScalarKind::Uint,\r\n                        ..\r\n                    } => \"u\",\r\n                    _ => \"\",\r\n                };\r\n\r\n                let l2 = level.next();\r\n                if !cases.is_empty() {\r\n                    for case in cases {\r\n                        match case.value {\r\n                            crate::SwitchValue::Integer(value) => {\r\n                                writeln!(self.out, \"{}case {}{}: {{\", l2, value, type_postfix)?;\r\n                            }\r\n                            crate::SwitchValue::Default => {\r\n                                writeln!(self.out, \"{}default: {{\", l2)?;\r\n                            }\r\n                        }\r\n\r\n                        for sta in case.body.iter() {\r\n                            self.write_stmt(module, sta, func_ctx, l2.next())?;\r\n                        }\r\n\r\n                        if case.fall_through {\r\n                            writeln!(self.out, \"{}fallthrough;\", l2.next())?;\r\n                        }\r\n\r\n                        writeln!(self.out, \"{}}}\", l2)?;\r\n                    }\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            Statement::Loop {\r\n                ref body,\r\n                ref continuing,\r\n                break_if,\r\n            } => {\r\n                write!(self.out, \"{}\", level)?;\r\n                writeln!(self.out, \"loop {{\")?;\r\n\r\n                let l2 = level.next();\r\n                for sta in body.iter() {\r\n                    self.write_stmt(module, sta, func_ctx, l2)?;\r\n                }\r\n\r\n                // The continuing is optional so we don't need to write it if\r\n                // it is empty, but the `break if` counts as a continuing statement\r\n                // so even if `continuing` is empty we must generate it if a\r\n                // `break if` exists\r\n                if !continuing.is_empty() || break_if.is_some() {\r\n                    writeln!(self.out, \"{}continuing {{\", l2)?;\r\n                    for sta in continuing.iter() {\r\n                        self.write_stmt(module, sta, func_ctx, l2.next())?;\r\n                    }\r\n\r\n                    // The `break if` is always the last\r\n                    // statement of the `continuing` block\r\n                    if let Some(condition) = break_if {\r\n                        // The trailing space is important\r\n                        write!(self.out, \"{}break if \", l2.next())?;\r\n                        self.write_expr(module, condition, func_ctx)?;\r\n                        // Close the `break if` statement\r\n                        writeln!(self.out, \";\")?;\r\n                    }\r\n\r\n                    writeln!(self.out, \"{}}}\", l2)?;\r\n                }\r\n\r\n                writeln!(self.out, \"{}}}\", level)?\r\n            }\r\n            Statement::Break => {\r\n                writeln!(self.out, \"{}break;\", level)?;\r\n            }\r\n            Statement::Continue => {\r\n                writeln!(self.out, \"{}continue;\", level)?;\r\n            }\r\n            Statement::Barrier(barrier) => {\r\n                if barrier.contains(crate::Barrier::STORAGE) {\r\n                    writeln!(self.out, \"{}storageBarrier();\", level)?;\r\n                }\r\n\r\n                if barrier.contains(crate::Barrier::WORK_GROUP) {\r\n                    writeln!(self.out, \"{}workgroupBarrier();\", level)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Return the sort of indirection that `expr`'s plain form evaluates to.\r\n    ///\r\n    /// An expression's 'plain form' is the most general rendition of that\r\n    /// expression into WGSL, lacking `&` or `*` operators:\r\n    ///\r\n    /// - The plain form of `LocalVariable(x)` is simply `x`, which is a reference\r\n    ///   to the local variable's storage.\r\n    ///\r\n    /// - The plain form of `GlobalVariable(g)` is simply `g`, which is usually a\r\n    ///   reference to the global variable's storage. However, globals in the\r\n    ///   `Handle` address space are immutable, and `GlobalVariable` expressions for\r\n    ///   those produce the value directly, not a pointer to it. Such\r\n    ///   `GlobalVariable` expressions are `Ordinary`.\r\n    ///\r\n    /// - `Access` and `AccessIndex` are `Reference` when their `base` operand is a\r\n    ///   pointer. If they are applied directly to a composite value, they are\r\n    ///   `Ordinary`.\r\n    ///\r\n    /// Note that `FunctionArgument` expressions are never `Reference`, even when\r\n    /// the argument's type is `Pointer`. `FunctionArgument` always evaluates to the\r\n    /// argument's value directly, so any pointer it produces is merely the value\r\n    /// passed by the caller.\r\n    fn plain_form_indirection(\r\n        &self,\r\n        expr: Handle<crate::Expression>,\r\n        module: &Module,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n    ) -> Indirection {\r\n        use crate::Expression as Ex;\r\n\r\n        // Named expressions are `let` expressions, which apply the Load Rule,\r\n        // so if their type is a Naga pointer, then that must be a WGSL pointer\r\n        // as well.\r\n        if self.named_expressions.contains_key(&expr) {\r\n            return Indirection::Ordinary;\r\n        }\r\n\r\n        match func_ctx.expressions[expr] {\r\n            Ex::LocalVariable(_) => Indirection::Reference,\r\n            Ex::GlobalVariable(handle) => {\r\n                let global = &module.global_variables[handle];\r\n                match global.space {\r\n                    crate::AddressSpace::Handle => Indirection::Ordinary,\r\n                    _ => Indirection::Reference,\r\n                }\r\n            }\r\n            Ex::Access { base, .. } | Ex::AccessIndex { base, .. } => {\r\n                let base_ty = func_ctx.info[base].ty.inner_with(&module.types);\r\n                match *base_ty {\r\n                    crate::TypeInner::Pointer { .. } | crate::TypeInner::ValuePointer { .. } => {\r\n                        Indirection::Reference\r\n                    }\r\n                    _ => Indirection::Ordinary,\r\n                }\r\n            }\r\n            _ => Indirection::Ordinary,\r\n        }\r\n    }\r\n\r\n    fn start_named_expr(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::Expression>,\r\n        func_ctx: &back::FunctionCtx,\r\n        name: &str,\r\n    ) -> BackendResult {\r\n        // Write variable name\r\n        write!(self.out, \"let {}\", name)?;\r\n        if self.flags.contains(WriterFlags::EXPLICIT_TYPES) {\r\n            write!(self.out, \": \")?;\r\n            let ty = &func_ctx.info[handle].ty;\r\n            // Write variable type\r\n            match *ty {\r\n                proc::TypeResolution::Handle(handle) => {\r\n                    self.write_type(module, handle)?;\r\n                }\r\n                proc::TypeResolution::Value(ref inner) => {\r\n                    self.write_value_type(module, inner)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        write!(self.out, \" = \")?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Write the ordinary WGSL form of `expr`.\r\n    ///\r\n    /// See `write_expr_with_indirection` for details.\r\n    fn write_expr(\r\n        &mut self,\r\n        module: &Module,\r\n        expr: Handle<crate::Expression>,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n    ) -> BackendResult {\r\n        self.write_expr_with_indirection(module, expr, func_ctx, Indirection::Ordinary)\r\n    }\r\n\r\n    /// Write `expr` as a WGSL expression with the requested indirection.\r\n    ///\r\n    /// In terms of the WGSL grammar, the resulting expression is a\r\n    /// `singular_expression`. It may be parenthesized. This makes it suitable\r\n    /// for use as the operand of a unary or binary operator without worrying\r\n    /// about precedence.\r\n    ///\r\n    /// This does not produce newlines or indentation.\r\n    ///\r\n    /// The `requested` argument indicates (roughly) whether Naga\r\n    /// `Pointer`-valued expressions represent WGSL references or pointers. See\r\n    /// `Indirection` for details.\r\n    fn write_expr_with_indirection(\r\n        &mut self,\r\n        module: &Module,\r\n        expr: Handle<crate::Expression>,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n        requested: Indirection,\r\n    ) -> BackendResult {\r\n        // If the plain form of the expression is not what we need, emit the\r\n        // operator necessary to correct that.\r\n        let plain = self.plain_form_indirection(expr, module, func_ctx);\r\n        match (requested, plain) {\r\n            (Indirection::Ordinary, Indirection::Reference) => {\r\n                write!(self.out, \"(&\")?;\r\n                self.write_expr_plain_form(module, expr, func_ctx, plain)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            (Indirection::Reference, Indirection::Ordinary) => {\r\n                write!(self.out, \"(*\")?;\r\n                self.write_expr_plain_form(module, expr, func_ctx, plain)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            (_, _) => self.write_expr_plain_form(module, expr, func_ctx, plain)?,\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Write the 'plain form' of `expr`.\r\n    ///\r\n    /// An expression's 'plain form' is the most general rendition of that\r\n    /// expression into WGSL, lacking `&` or `*` operators. The plain forms of\r\n    /// `LocalVariable(x)` and `GlobalVariable(g)` are simply `x` and `g`. Such\r\n    /// Naga expressions represent both WGSL pointers and references; it's the\r\n    /// caller's responsibility to distinguish those cases appropriately.\r\n    fn write_expr_plain_form(\r\n        &mut self,\r\n        module: &Module,\r\n        expr: Handle<crate::Expression>,\r\n        func_ctx: &back::FunctionCtx<'_>,\r\n        indirection: Indirection,\r\n    ) -> BackendResult {\r\n        use crate::Expression;\r\n\r\n        if let Some(name) = self.named_expressions.get(&expr) {\r\n            write!(self.out, \"{}\", name)?;\r\n            return Ok(());\r\n        }\r\n\r\n        let expression = &func_ctx.expressions[expr];\r\n\r\n        // Write the plain WGSL form of a Naga expression.\r\n        //\r\n        // The plain form of `LocalVariable` and `GlobalVariable` expressions is\r\n        // simply the variable name; `*` and `&` operators are never emitted.\r\n        //\r\n        // The plain form of `Access` and `AccessIndex` expressions are WGSL\r\n        // `postfix_expression` forms for member/component access and\r\n        // subscripting.\r\n        match *expression {\r\n            Expression::Constant(constant) => self.write_constant(module, constant)?,\r\n            Expression::Compose { ty, ref components } => {\r\n                self.write_type(module, ty)?;\r\n                write!(self.out, \"(\")?;\r\n                // !spv-in specific notes!\r\n                // WGSL does not support all SPIR-V builtins and we should skip it in generated shaders.\r\n                // We already skip them when we generate struct type.\r\n                // Now we need to find components that used struct with ignored builtins.\r\n\r\n                // So, why we can't just return the error to a user?\r\n                // We can, but otherwise, we can't generate WGSL shader from any glslang SPIR-V shaders.\r\n                // glslang generates gl_PerVertex struct with gl_CullDistance, gl_ClipDistance and gl_PointSize builtin inside by default.\r\n                // All of them are not supported by WGSL.\r\n\r\n                // We need to copy components to another vec because we don't know which of them we should write.\r\n                let mut components_to_write = Vec::with_capacity(components.len());\r\n                for component in components {\r\n                    let mut skip_component = false;\r\n                    if let Expression::Load { pointer } = func_ctx.expressions[*component] {\r\n                        if let Expression::AccessIndex { base, index } =\r\n                            func_ctx.expressions[pointer]\r\n                        {\r\n                            if access_to_unsupported_builtin(base, index, module, func_ctx.info) {\r\n                                skip_component = true;\r\n                            }\r\n                        }\r\n                    }\r\n                    if skip_component {\r\n                        continue;\r\n                    } else {\r\n                        components_to_write.push(*component);\r\n                    }\r\n                }\r\n\r\n                // non spv-in specific notes!\r\n                // Real `Expression::Compose` logic generates here.\r\n                for (index, component) in components_to_write.iter().enumerate() {\r\n                    self.write_expr(module, *component, func_ctx)?;\r\n                    // Only write a comma if isn't the last element\r\n                    if index != components_to_write.len().saturating_sub(1) {\r\n                        // The leading space is for readability only\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                }\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::FunctionArgument(pos) => {\r\n                let name_key = func_ctx.argument_key(pos);\r\n                let name = &self.names[&name_key];\r\n                write!(self.out, \"{}\", name)?;\r\n            }\r\n            Expression::Binary { op, left, right } => {\r\n                write!(self.out, \"(\")?;\r\n                self.write_expr(module, left, func_ctx)?;\r\n                write!(self.out, \" {} \", back::binary_operation_str(op))?;\r\n                self.write_expr(module, right, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Access { base, index } => {\r\n                self.write_expr_with_indirection(module, base, func_ctx, indirection)?;\r\n                write!(self.out, \"[\")?;\r\n                self.write_expr(module, index, func_ctx)?;\r\n                write!(self.out, \"]\")?\r\n            }\r\n            Expression::AccessIndex { base, index } => {\r\n                let base_ty_res = &func_ctx.info[base].ty;\r\n                let mut resolved = base_ty_res.inner_with(&module.types);\r\n\r\n                self.write_expr_with_indirection(module, base, func_ctx, indirection)?;\r\n\r\n                let base_ty_handle = match *resolved {\r\n                    TypeInner::Pointer { base, space: _ } => {\r\n                        resolved = &module.types[base].inner;\r\n                        Some(base)\r\n                    }\r\n                    _ => base_ty_res.handle(),\r\n                };\r\n\r\n                match *resolved {\r\n                    TypeInner::Vector { .. } => {\r\n                        // Write vector access as a swizzle\r\n                        write!(self.out, \".{}\", back::COMPONENTS[index as usize])?\r\n                    }\r\n                    TypeInner::Matrix { .. }\r\n                    | TypeInner::Array { .. }\r\n                    | TypeInner::BindingArray { .. }\r\n                    | TypeInner::ValuePointer { .. } => write!(self.out, \"[{}]\", index)?,\r\n                    TypeInner::Struct { .. } => {\r\n                        // This will never panic in case the type is a `Struct`, this is not true\r\n                        // for other types so we can only check while inside this match arm\r\n                        let ty = base_ty_handle.unwrap();\r\n\r\n                        write!(\r\n                            self.out,\r\n                            \".{}\",\r\n                            &self.names[&NameKey::StructMember(ty, index)]\r\n                        )?\r\n                    }\r\n                    ref other => return Err(Error::Custom(format!(\"Cannot index {:?}\", other))),\r\n                }\r\n            }\r\n            Expression::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather: None,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                use crate::SampleLevel as Sl;\r\n\r\n                let suffix_cmp = match depth_ref {\r\n                    Some(_) => \"Compare\",\r\n                    None => \"\",\r\n                };\r\n                let suffix_level = match level {\r\n                    Sl::Auto => \"\",\r\n                    Sl::Zero | Sl::Exact(_) => \"Level\",\r\n                    Sl::Bias(_) => \"Bias\",\r\n                    Sl::Gradient { .. } => \"Grad\",\r\n                };\r\n\r\n                write!(self.out, \"textureSample{}{}(\", suffix_cmp, suffix_level)?;\r\n                self.write_expr(module, image, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, sampler, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, coordinate, func_ctx)?;\r\n\r\n                if let Some(array_index) = array_index {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, array_index, func_ctx)?;\r\n                }\r\n\r\n                if let Some(depth_ref) = depth_ref {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, depth_ref, func_ctx)?;\r\n                }\r\n\r\n                match level {\r\n                    Sl::Auto => {}\r\n                    Sl::Zero => {\r\n                        // Level 0 is implied for depth comparison\r\n                        if depth_ref.is_none() {\r\n                            write!(self.out, \", 0.0\")?;\r\n                        }\r\n                    }\r\n                    Sl::Exact(expr) => {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, expr, func_ctx)?;\r\n                    }\r\n                    Sl::Bias(expr) => {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, expr, func_ctx)?;\r\n                    }\r\n                    Sl::Gradient { x, y } => {\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, x, func_ctx)?;\r\n                        write!(self.out, \", \")?;\r\n                        self.write_expr(module, y, func_ctx)?;\r\n                    }\r\n                }\r\n\r\n                if let Some(offset) = offset {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_constant(module, offset)?;\r\n                }\r\n\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather: Some(component),\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level: _,\r\n                depth_ref,\r\n            } => {\r\n                let suffix_cmp = match depth_ref {\r\n                    Some(_) => \"Compare\",\r\n                    None => \"\",\r\n                };\r\n\r\n                write!(self.out, \"textureGather{}(\", suffix_cmp)?;\r\n                match *func_ctx.info[image].ty.inner_with(&module.types) {\r\n                    TypeInner::Image {\r\n                        class: crate::ImageClass::Depth { multi: _ },\r\n                        ..\r\n                    } => {}\r\n                    _ => {\r\n                        write!(self.out, \"{}, \", component as u8)?;\r\n                    }\r\n                }\r\n                self.write_expr(module, image, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, sampler, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, coordinate, func_ctx)?;\r\n\r\n                if let Some(array_index) = array_index {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, array_index, func_ctx)?;\r\n                }\r\n\r\n                if let Some(depth_ref) = depth_ref {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, depth_ref, func_ctx)?;\r\n                }\r\n\r\n                if let Some(offset) = offset {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_constant(module, offset)?;\r\n                }\r\n\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::ImageQuery { image, query } => {\r\n                use crate::ImageQuery as Iq;\r\n\r\n                let texture_function = match query {\r\n                    Iq::Size { .. } => \"textureDimensions\",\r\n                    Iq::NumLevels => \"textureNumLevels\",\r\n                    Iq::NumLayers => \"textureNumLayers\",\r\n                    Iq::NumSamples => \"textureNumSamples\",\r\n                };\r\n\r\n                write!(self.out, \"{}(\", texture_function)?;\r\n                self.write_expr(module, image, func_ctx)?;\r\n                if let Iq::Size { level: Some(level) } = query {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, level, func_ctx)?;\r\n                };\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => {\r\n                write!(self.out, \"textureLoad(\")?;\r\n                self.write_expr(module, image, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, coordinate, func_ctx)?;\r\n                if let Some(array_index) = array_index {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, array_index, func_ctx)?;\r\n                }\r\n                if let Some(index) = sample.or(level) {\r\n                    write!(self.out, \", \")?;\r\n                    self.write_expr(module, index, func_ctx)?;\r\n                }\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::GlobalVariable(handle) => {\r\n                let name = &self.names[&NameKey::GlobalVariable(handle)];\r\n                write!(self.out, \"{}\", name)?;\r\n            }\r\n            Expression::As {\r\n                expr,\r\n                kind,\r\n                convert,\r\n            } => {\r\n                let inner = func_ctx.info[expr].ty.inner_with(&module.types);\r\n                match *inner {\r\n                    TypeInner::Matrix { columns, rows, .. } => {\r\n                        write!(\r\n                            self.out,\r\n                            \"mat{}x{}<f32>\",\r\n                            back::vector_size_str(columns),\r\n                            back::vector_size_str(rows)\r\n                        )?;\r\n                    }\r\n                    TypeInner::Vector { size, .. } => {\r\n                        let vector_size_str = back::vector_size_str(size);\r\n                        let scalar_kind_str = scalar_kind_str(kind);\r\n                        if convert.is_some() {\r\n                            write!(self.out, \"vec{}<{}>\", vector_size_str, scalar_kind_str)?;\r\n                        } else {\r\n                            write!(\r\n                                self.out,\r\n                                \"bitcast<vec{}<{}>>\",\r\n                                vector_size_str, scalar_kind_str\r\n                            )?;\r\n                        }\r\n                    }\r\n                    TypeInner::Scalar { .. } => {\r\n                        if convert.is_some() {\r\n                            write!(self.out, \"{}\", scalar_kind_str(kind))?\r\n                        } else {\r\n                            write!(self.out, \"bitcast<{}>\", scalar_kind_str(kind))?\r\n                        }\r\n                    }\r\n                    _ => {\r\n                        return Err(Error::Unimplemented(format!(\r\n                            \"write_expr expression::as {:?}\",\r\n                            inner\r\n                        )));\r\n                    }\r\n                };\r\n                write!(self.out, \"(\")?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Splat { size, value } => {\r\n                let inner = func_ctx.info[value].ty.inner_with(&module.types);\r\n                let scalar_kind = match *inner {\r\n                    crate::TypeInner::Scalar { kind, .. } => kind,\r\n                    _ => {\r\n                        return Err(Error::Unimplemented(format!(\r\n                            \"write_expr expression::splat {:?}\",\r\n                            inner\r\n                        )));\r\n                    }\r\n                };\r\n                let scalar = scalar_kind_str(scalar_kind);\r\n                let size = back::vector_size_str(size);\r\n\r\n                write!(self.out, \"vec{}<{}>(\", size, scalar)?;\r\n                self.write_expr(module, value, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Load { pointer } => {\r\n                let is_atomic = match *func_ctx.info[pointer].ty.inner_with(&module.types) {\r\n                    crate::TypeInner::Pointer { base, .. } => match module.types[base].inner {\r\n                        crate::TypeInner::Atomic { .. } => true,\r\n                        _ => false,\r\n                    },\r\n                    _ => false,\r\n                };\r\n\r\n                if is_atomic {\r\n                    write!(self.out, \"atomicLoad(\")?;\r\n                    self.write_expr(module, pointer, func_ctx)?;\r\n                    write!(self.out, \")\")?;\r\n                } else {\r\n                    self.write_expr_with_indirection(\r\n                        module,\r\n                        pointer,\r\n                        func_ctx,\r\n                        Indirection::Reference,\r\n                    )?;\r\n                }\r\n            }\r\n            Expression::LocalVariable(handle) => {\r\n                write!(self.out, \"{}\", self.names[&func_ctx.name_key(handle)])?\r\n            }\r\n            Expression::ArrayLength(expr) => {\r\n                write!(self.out, \"arrayLength(\")?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n                write!(self.out, \")\")?;\r\n            }\r\n            Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n\r\n                enum Function {\r\n                    Asincosh { is_sin: bool },\r\n                    Atanh,\r\n                    Regular(&'static str),\r\n                }\r\n\r\n                // NOTE: If https://github.com/gpuweb/gpuweb/issues/1622 ever is\r\n                // accepted, replace this with the builtin functions\r\n                let function = match fun {\r\n                    Mf::Abs => Function::Regular(\"abs\"),\r\n                    Mf::Min => Function::Regular(\"min\"),\r\n                    Mf::Max => Function::Regular(\"max\"),\r\n                    Mf::Clamp => Function::Regular(\"clamp\"),\r\n                    Mf::Saturate => Function::Regular(\"saturate\"),\r\n                    // trigonometry\r\n                    Mf::Cos => Function::Regular(\"cos\"),\r\n                    Mf::Cosh => Function::Regular(\"cosh\"),\r\n                    Mf::Sin => Function::Regular(\"sin\"),\r\n                    Mf::Sinh => Function::Regular(\"sinh\"),\r\n                    Mf::Tan => Function::Regular(\"tan\"),\r\n                    Mf::Tanh => Function::Regular(\"tanh\"),\r\n                    Mf::Acos => Function::Regular(\"acos\"),\r\n                    Mf::Asin => Function::Regular(\"asin\"),\r\n                    Mf::Atan => Function::Regular(\"atan\"),\r\n                    Mf::Atan2 => Function::Regular(\"atan2\"),\r\n                    Mf::Asinh => Function::Asincosh { is_sin: true },\r\n                    Mf::Acosh => Function::Asincosh { is_sin: false },\r\n                    Mf::Atanh => Function::Atanh,\r\n                    Mf::Radians => Function::Regular(\"radians\"),\r\n                    Mf::Degrees => Function::Regular(\"degrees\"),\r\n                    // decomposition\r\n                    Mf::Ceil => Function::Regular(\"ceil\"),\r\n                    Mf::Floor => Function::Regular(\"floor\"),\r\n                    Mf::Round => Function::Regular(\"round\"),\r\n                    Mf::Fract => Function::Regular(\"fract\"),\r\n                    Mf::Trunc => Function::Regular(\"trunc\"),\r\n                    Mf::Modf => Function::Regular(\"modf\"),\r\n                    Mf::Frexp => Function::Regular(\"frexp\"),\r\n                    Mf::Ldexp => Function::Regular(\"ldexp\"),\r\n                    // exponent\r\n                    Mf::Exp => Function::Regular(\"exp\"),\r\n                    Mf::Exp2 => Function::Regular(\"exp2\"),\r\n                    Mf::Log => Function::Regular(\"log\"),\r\n                    Mf::Log2 => Function::Regular(\"log2\"),\r\n                    Mf::Pow => Function::Regular(\"pow\"),\r\n                    // geometry\r\n                    Mf::Dot => Function::Regular(\"dot\"),\r\n                    Mf::Outer => Function::Regular(\"outerProduct\"),\r\n                    Mf::Cross => Function::Regular(\"cross\"),\r\n                    Mf::Distance => Function::Regular(\"distance\"),\r\n                    Mf::Length => Function::Regular(\"length\"),\r\n                    Mf::Normalize => Function::Regular(\"normalize\"),\r\n                    Mf::FaceForward => Function::Regular(\"faceForward\"),\r\n                    Mf::Reflect => Function::Regular(\"reflect\"),\r\n                    // computational\r\n                    Mf::Sign => Function::Regular(\"sign\"),\r\n                    Mf::Fma => Function::Regular(\"fma\"),\r\n                    Mf::Mix => Function::Regular(\"mix\"),\r\n                    Mf::Step => Function::Regular(\"step\"),\r\n                    Mf::SmoothStep => Function::Regular(\"smoothstep\"),\r\n                    Mf::Sqrt => Function::Regular(\"sqrt\"),\r\n                    Mf::InverseSqrt => Function::Regular(\"inverseSqrt\"),\r\n                    Mf::Transpose => Function::Regular(\"transpose\"),\r\n                    Mf::Determinant => Function::Regular(\"determinant\"),\r\n                    // bits\r\n                    Mf::CountOneBits => Function::Regular(\"countOneBits\"),\r\n                    Mf::ReverseBits => Function::Regular(\"reverseBits\"),\r\n                    Mf::ExtractBits => Function::Regular(\"extractBits\"),\r\n                    Mf::InsertBits => Function::Regular(\"insertBits\"),\r\n                    Mf::FindLsb => Function::Regular(\"firstTrailingBit\"),\r\n                    Mf::FindMsb => Function::Regular(\"firstLeadingBit\"),\r\n                    // data packing\r\n                    Mf::Pack4x8snorm => Function::Regular(\"pack4x8snorm\"),\r\n                    Mf::Pack4x8unorm => Function::Regular(\"pack4x8unorm\"),\r\n                    Mf::Pack2x16snorm => Function::Regular(\"pack2x16snorm\"),\r\n                    Mf::Pack2x16unorm => Function::Regular(\"pack2x16unorm\"),\r\n                    Mf::Pack2x16float => Function::Regular(\"pack2x16float\"),\r\n                    // data unpacking\r\n                    Mf::Unpack4x8snorm => Function::Regular(\"unpack4x8snorm\"),\r\n                    Mf::Unpack4x8unorm => Function::Regular(\"unpack4x8unorm\"),\r\n                    Mf::Unpack2x16snorm => Function::Regular(\"unpack2x16snorm\"),\r\n                    Mf::Unpack2x16unorm => Function::Regular(\"unpack2x16unorm\"),\r\n                    Mf::Unpack2x16float => Function::Regular(\"unpack2x16float\"),\r\n                    _ => {\r\n                        return Err(Error::UnsupportedMathFunction(fun));\r\n                    }\r\n                };\r\n\r\n                match function {\r\n                    Function::Asincosh { is_sin } => {\r\n                        write!(self.out, \"log(\")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \" + sqrt(\")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \" * \")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        match is_sin {\r\n                            true => write!(self.out, \" + 1.0))\")?,\r\n                            false => write!(self.out, \" - 1.0))\")?,\r\n                        }\r\n                    }\r\n                    Function::Atanh => {\r\n                        write!(self.out, \"0.5 * log((1.0 + \")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \") / (1.0 - \")?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        write!(self.out, \"))\")?;\r\n                    }\r\n                    Function::Regular(fun_name) => {\r\n                        write!(self.out, \"{}(\", fun_name)?;\r\n                        self.write_expr(module, arg, func_ctx)?;\r\n                        if let Some(arg) = arg1 {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                        }\r\n                        if let Some(arg) = arg2 {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                        }\r\n                        if let Some(arg) = arg3 {\r\n                            write!(self.out, \", \")?;\r\n                            self.write_expr(module, arg, func_ctx)?;\r\n                        }\r\n                        write!(self.out, \")\")?\r\n                    }\r\n                }\r\n            }\r\n            Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                self.write_expr(module, vector, func_ctx)?;\r\n                write!(self.out, \".\")?;\r\n                for &sc in pattern[..size as usize].iter() {\r\n                    self.out.write_char(back::COMPONENTS[sc as usize])?;\r\n                }\r\n            }\r\n            Expression::Unary { op, expr } => {\r\n                let unary = match op {\r\n                    crate::UnaryOperator::Negate => \"-\",\r\n                    crate::UnaryOperator::Not => {\r\n                        match *func_ctx.info[expr].ty.inner_with(&module.types) {\r\n                            TypeInner::Scalar {\r\n                                kind: crate::ScalarKind::Bool,\r\n                                ..\r\n                            }\r\n                            | TypeInner::Vector { .. } => \"!\",\r\n                            _ => \"~\",\r\n                        }\r\n                    }\r\n                };\r\n\r\n                write!(self.out, \"{}(\", unary)?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => {\r\n                write!(self.out, \"select(\")?;\r\n                self.write_expr(module, reject, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, accept, func_ctx)?;\r\n                write!(self.out, \", \")?;\r\n                self.write_expr(module, condition, func_ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::Derivative { axis, expr } => {\r\n                use crate::DerivativeAxis as Da;\r\n\r\n                let op = match axis {\r\n                    Da::X => \"dpdx\",\r\n                    Da::Y => \"dpdy\",\r\n                    Da::Width => \"fwidth\",\r\n                };\r\n                write!(self.out, \"{}(\", op)?;\r\n                self.write_expr(module, expr, func_ctx)?;\r\n                write!(self.out, \")\")?\r\n            }\r\n            Expression::Relational { fun, argument } => {\r\n                use crate::RelationalFunction as Rf;\r\n\r\n                let fun_name = match fun {\r\n                    Rf::IsFinite => \"isFinite\",\r\n                    Rf::IsNormal => \"isNormal\",\r\n                    Rf::All => \"all\",\r\n                    Rf::Any => \"any\",\r\n                    _ => return Err(Error::UnsupportedRelationalFunction(fun)),\r\n                };\r\n                write!(self.out, \"{}(\", fun_name)?;\r\n\r\n                self.write_expr(module, argument, func_ctx)?;\r\n\r\n                write!(self.out, \")\")?\r\n            }\r\n            // Nothing to do here, since call expression already cached\r\n            Expression::CallResult(_) | Expression::AtomicResult { .. } => {}\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write global variables\r\n    /// # Notes\r\n    /// Always adds a newline\r\n    fn write_global(\r\n        &mut self,\r\n        module: &Module,\r\n        global: &crate::GlobalVariable,\r\n        handle: Handle<crate::GlobalVariable>,\r\n    ) -> BackendResult {\r\n        // Write group and binding attributes if present\r\n        if let Some(ref binding) = global.binding {\r\n            self.write_attributes(&[\r\n                Attribute::Group(binding.group),\r\n                Attribute::Binding(binding.binding),\r\n            ])?;\r\n            writeln!(self.out)?;\r\n        }\r\n\r\n        // First write global name and address space if supported\r\n        write!(self.out, \"var\")?;\r\n        let (address, maybe_access) = address_space_str(global.space);\r\n        if let Some(space) = address {\r\n            write!(self.out, \"<{}\", space)?;\r\n            if let Some(access) = maybe_access {\r\n                write!(self.out, \", {}\", access)?;\r\n            }\r\n            write!(self.out, \">\")?;\r\n        }\r\n        write!(\r\n            self.out,\r\n            \" {}: \",\r\n            &self.names[&NameKey::GlobalVariable(handle)]\r\n        )?;\r\n\r\n        // Write global type\r\n        self.write_type(module, global.ty)?;\r\n\r\n        // Write initializer\r\n        if let Some(init) = global.init {\r\n            write!(self.out, \" = \")?;\r\n            self.write_constant(module, init)?;\r\n        }\r\n\r\n        // End with semicolon\r\n        writeln!(self.out, \";\")?;\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write constants\r\n    ///\r\n    /// # Notes\r\n    /// Doesn't add any newlines or leading/trailing spaces\r\n    fn write_constant(\r\n        &mut self,\r\n        module: &Module,\r\n        handle: Handle<crate::Constant>,\r\n    ) -> BackendResult {\r\n        let constant = &module.constants[handle];\r\n        match constant.inner {\r\n            crate::ConstantInner::Scalar {\r\n                width: _,\r\n                ref value,\r\n            } => {\r\n                if constant.name.is_some() {\r\n                    write!(self.out, \"{}\", self.names[&NameKey::Constant(handle)])?;\r\n                } else {\r\n                    self.write_scalar_value(*value)?;\r\n                }\r\n            }\r\n            crate::ConstantInner::Composite { ty, ref components } => {\r\n                self.write_type(module, ty)?;\r\n                write!(self.out, \"(\")?;\r\n\r\n                let members = match module.types[ty].inner {\r\n                    TypeInner::Struct { ref members, .. } => Some(members),\r\n                    _ => None,\r\n                };\r\n\r\n                // Write the comma separated constants\r\n                for (index, constant) in components.iter().enumerate() {\r\n                    if let Some(&crate::Binding::BuiltIn(built_in)) =\r\n                        members.and_then(|members| members.get(index)?.binding.as_ref())\r\n                    {\r\n                        if builtin_str(built_in).is_none() {\r\n                            log::warn!(\r\n                                \"Skip constant for struct member with unsupported builtin {:?}\",\r\n                                built_in\r\n                            );\r\n                            continue;\r\n                        }\r\n                    }\r\n\r\n                    self.write_constant(module, *constant)?;\r\n                    // Only write a comma if isn't the last element\r\n                    if index != components.len().saturating_sub(1) {\r\n                        // The leading space is for readability only\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                }\r\n                write!(self.out, \")\")?\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Helper method used to write global constants\r\n    ///\r\n    /// # Notes\r\n    /// Ends in a newline\r\n    fn write_global_constant(\r\n        &mut self,\r\n        module: &Module,\r\n        inner: &crate::ConstantInner,\r\n        handle: Handle<crate::Constant>,\r\n    ) -> BackendResult {\r\n        match *inner {\r\n            crate::ConstantInner::Scalar {\r\n                width: _,\r\n                ref value,\r\n            } => {\r\n                let name = &self.names[&NameKey::Constant(handle)];\r\n                // First write only constant name\r\n                write!(self.out, \"let {}: \", name)?;\r\n                // Next write constant type and value\r\n                match *value {\r\n                    crate::ScalarValue::Sint(value) => {\r\n                        write!(self.out, \"i32 = {}\", value)?;\r\n                    }\r\n                    crate::ScalarValue::Uint(value) => {\r\n                        write!(self.out, \"u32 = {}u\", value)?;\r\n                    }\r\n                    crate::ScalarValue::Float(value) => {\r\n                        // Floats are written using `Debug` instead of `Display` because it always appends the\r\n                        // decimal part even it's zero\r\n                        write!(self.out, \"f32 = {:?}\", value)?;\r\n                    }\r\n                    crate::ScalarValue::Bool(value) => {\r\n                        write!(self.out, \"bool = {}\", value)?;\r\n                    }\r\n                };\r\n                // End with semicolon\r\n                writeln!(self.out, \";\")?;\r\n            }\r\n            crate::ConstantInner::Composite { ty, ref components } => {\r\n                let name = &self.names[&NameKey::Constant(handle)];\r\n                // First write only constant name\r\n                write!(self.out, \"let {}: \", name)?;\r\n                // Next write constant type\r\n                self.write_type(module, ty)?;\r\n\r\n                write!(self.out, \" = \")?;\r\n                self.write_type(module, ty)?;\r\n\r\n                write!(self.out, \"(\")?;\r\n                for (index, constant) in components.iter().enumerate() {\r\n                    self.write_constant(module, *constant)?;\r\n                    // Only write a comma if isn't the last element\r\n                    if index != components.len().saturating_sub(1) {\r\n                        // The leading space is for readability only\r\n                        write!(self.out, \", \")?;\r\n                    }\r\n                }\r\n                write!(self.out, \");\")?;\r\n            }\r\n        }\r\n        // End with extra newline for readability\r\n        writeln!(self.out)?;\r\n        Ok(())\r\n    }\r\n\r\n    // See https://github.com/rust-lang/rust-clippy/issues/4979.\r\n    #[allow(clippy::missing_const_for_fn)]\r\n    pub fn finish(self) -> W {\r\n        self.out\r\n    }\r\n}\r\n\r\nconst fn builtin_str(built_in: crate::BuiltIn) -> Option<&'static str> {\r\n    use crate::BuiltIn as Bi;\r\n\r\n    match built_in {\r\n        Bi::VertexIndex => Some(\"vertex_index\"),\r\n        Bi::InstanceIndex => Some(\"instance_index\"),\r\n        Bi::Position { .. } => Some(\"position\"),\r\n        Bi::FrontFacing => Some(\"front_facing\"),\r\n        Bi::FragDepth => Some(\"frag_depth\"),\r\n        Bi::LocalInvocationId => Some(\"local_invocation_id\"),\r\n        Bi::LocalInvocationIndex => Some(\"local_invocation_index\"),\r\n        Bi::GlobalInvocationId => Some(\"global_invocation_id\"),\r\n        Bi::WorkGroupId => Some(\"workgroup_id\"),\r\n        Bi::WorkGroupSize => Some(\"workgroup_size\"),\r\n        Bi::NumWorkGroups => Some(\"num_workgroups\"),\r\n        Bi::SampleIndex => Some(\"sample_index\"),\r\n        Bi::SampleMask => Some(\"sample_mask\"),\r\n        Bi::PrimitiveIndex => Some(\"primitive_index\"),\r\n        Bi::ViewIndex => Some(\"view_index\"),\r\n        _ => None,\r\n    }\r\n}\r\n\r\nconst fn image_dimension_str(dim: crate::ImageDimension) -> &'static str {\r\n    use crate::ImageDimension as IDim;\r\n\r\n    match dim {\r\n        IDim::D1 => \"1d\",\r\n        IDim::D2 => \"2d\",\r\n        IDim::D3 => \"3d\",\r\n        IDim::Cube => \"cube\",\r\n    }\r\n}\r\n\r\nconst fn scalar_kind_str(kind: crate::ScalarKind) -> &'static str {\r\n    use crate::ScalarKind as Sk;\r\n\r\n    match kind {\r\n        Sk::Float => \"f32\",\r\n        Sk::Sint => \"i32\",\r\n        Sk::Uint => \"u32\",\r\n        Sk::Bool => \"bool\",\r\n    }\r\n}\r\n\r\nconst fn storage_format_str(format: crate::StorageFormat) -> &'static str {\r\n    use crate::StorageFormat as Sf;\r\n\r\n    match format {\r\n        Sf::R8Unorm => \"r8unorm\",\r\n        Sf::R8Snorm => \"r8snorm\",\r\n        Sf::R8Uint => \"r8uint\",\r\n        Sf::R8Sint => \"r8sint\",\r\n        Sf::R16Uint => \"r16uint\",\r\n        Sf::R16Sint => \"r16sint\",\r\n        Sf::R16Float => \"r16float\",\r\n        Sf::Rg8Unorm => \"rg8unorm\",\r\n        Sf::Rg8Snorm => \"rg8snorm\",\r\n        Sf::Rg8Uint => \"rg8uint\",\r\n        Sf::Rg8Sint => \"rg8sint\",\r\n        Sf::R32Uint => \"r32uint\",\r\n        Sf::R32Sint => \"r32sint\",\r\n        Sf::R32Float => \"r32float\",\r\n        Sf::Rg16Uint => \"rg16uint\",\r\n        Sf::Rg16Sint => \"rg16sint\",\r\n        Sf::Rg16Float => \"rg16float\",\r\n        Sf::Rgba8Unorm => \"rgba8unorm\",\r\n        Sf::Rgba8Snorm => \"rgba8snorm\",\r\n        Sf::Rgba8Uint => \"rgba8uint\",\r\n        Sf::Rgba8Sint => \"rgba8sint\",\r\n        Sf::Rgb10a2Unorm => \"rgb10a2unorm\",\r\n        Sf::Rg11b10Float => \"rg11b10float\",\r\n        Sf::Rg32Uint => \"rg32uint\",\r\n        Sf::Rg32Sint => \"rg32sint\",\r\n        Sf::Rg32Float => \"rg32float\",\r\n        Sf::Rgba16Uint => \"rgba16uint\",\r\n        Sf::Rgba16Sint => \"rgba16sint\",\r\n        Sf::Rgba16Float => \"rgba16float\",\r\n        Sf::Rgba32Uint => \"rgba32uint\",\r\n        Sf::Rgba32Sint => \"rgba32sint\",\r\n        Sf::Rgba32Float => \"rgba32float\",\r\n    }\r\n}\r\n\r\n/// Helper function that returns the string corresponding to the WGSL interpolation qualifier\r\nconst fn interpolation_str(interpolation: crate::Interpolation) -> &'static str {\r\n    use crate::Interpolation as I;\r\n\r\n    match interpolation {\r\n        I::Perspective => \"perspective\",\r\n        I::Linear => \"linear\",\r\n        I::Flat => \"flat\",\r\n    }\r\n}\r\n\r\n/// Return the WGSL auxiliary qualifier for the given sampling value.\r\nconst fn sampling_str(sampling: crate::Sampling) -> &'static str {\r\n    use crate::Sampling as S;\r\n\r\n    match sampling {\r\n        S::Center => \"\",\r\n        S::Centroid => \"centroid\",\r\n        S::Sample => \"sample\",\r\n    }\r\n}\r\n\r\nconst fn address_space_str(\r\n    space: crate::AddressSpace,\r\n) -> (Option<&'static str>, Option<&'static str>) {\r\n    use crate::AddressSpace as As;\r\n\r\n    (\r\n        Some(match space {\r\n            As::Private => \"private\",\r\n            As::Uniform => \"uniform\",\r\n            As::Storage { access } => {\r\n                if access.contains(crate::StorageAccess::STORE) {\r\n                    return (Some(\"storage\"), Some(\"read_write\"));\r\n                } else {\r\n                    \"storage\"\r\n                }\r\n            }\r\n            As::PushConstant => \"push_constant\",\r\n            As::WorkGroup => \"workgroup\",\r\n            As::Handle => return (None, None),\r\n            As::Function => \"function\",\r\n        }),\r\n        None,\r\n    )\r\n}\r\n\r\nfn map_binding_to_attribute(\r\n    binding: &crate::Binding,\r\n    scalar_kind: Option<crate::ScalarKind>,\r\n) -> Vec<Attribute> {\r\n    match *binding {\r\n        crate::Binding::BuiltIn(built_in) => {\r\n            if let crate::BuiltIn::Position { invariant: true } = built_in {\r\n                vec![Attribute::BuiltIn(built_in), Attribute::Invariant]\r\n            } else {\r\n                vec![Attribute::BuiltIn(built_in)]\r\n            }\r\n        }\r\n        crate::Binding::Location {\r\n            location,\r\n            interpolation,\r\n            sampling,\r\n        } => match scalar_kind {\r\n            Some(crate::ScalarKind::Float) => vec![\r\n                Attribute::Location(location),\r\n                Attribute::Interpolate(interpolation, sampling),\r\n            ],\r\n            _ => vec![Attribute::Location(location)],\r\n        },\r\n    }\r\n}\r\n\r\n/// Helper function that check that expression don't access to structure member with unsupported builtin.\r\nfn access_to_unsupported_builtin(\r\n    expr: Handle<crate::Expression>,\r\n    index: u32,\r\n    module: &Module,\r\n    info: &valid::FunctionInfo,\r\n) -> bool {\r\n    let base_ty_res = &info[expr].ty;\r\n    let resolved = base_ty_res.inner_with(&module.types);\r\n    if let TypeInner::Pointer {\r\n        base: pointer_base_handle,\r\n        ..\r\n    } = *resolved\r\n    {\r\n        // Let's check that we try to access a struct member with unsupported built-in and skip it.\r\n        if let TypeInner::Struct { ref members, .. } = module.types[pointer_base_handle].inner {\r\n            if let Some(crate::Binding::BuiltIn(built_in)) = members[index as usize].binding {\r\n                if builtin_str(built_in).is_none() {\r\n                    log::warn!(\"Skip component with unsupported builtin {:?}\", built_in);\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    false\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/block.rs",
    "content": "use crate::{Span, Statement};\r\nuse std::ops::{Deref, DerefMut, RangeBounds};\r\n\r\n/// A code block is a vector of statements, with maybe a vector of spans.\r\n#[derive(Debug, Clone, Default)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"serialize\", serde(transparent))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(arbitrary::Arbitrary))]\r\npub struct Block {\r\n    body: Vec<Statement>,\r\n    #[cfg(feature = \"span\")]\r\n    #[cfg_attr(feature = \"serialize\", serde(skip))]\r\n    span_info: Vec<Span>,\r\n}\r\n\r\nimpl Block {\r\n    pub const fn new() -> Self {\r\n        Self {\r\n            body: Vec::new(),\r\n            #[cfg(feature = \"span\")]\r\n            span_info: Vec::new(),\r\n        }\r\n    }\r\n\r\n    pub fn from_vec(body: Vec<Statement>) -> Self {\r\n        #[cfg(feature = \"span\")]\r\n        let span_info = std::iter::repeat(Span::default())\r\n            .take(body.len())\r\n            .collect();\r\n        Self {\r\n            body,\r\n            #[cfg(feature = \"span\")]\r\n            span_info,\r\n        }\r\n    }\r\n\r\n    pub fn with_capacity(capacity: usize) -> Self {\r\n        Self {\r\n            body: Vec::with_capacity(capacity),\r\n            #[cfg(feature = \"span\")]\r\n            span_info: Vec::with_capacity(capacity),\r\n        }\r\n    }\r\n\r\n    #[allow(unused_variables)]\r\n    pub fn push(&mut self, end: Statement, span: Span) {\r\n        self.body.push(end);\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info.push(span);\r\n    }\r\n\r\n    pub fn extend(&mut self, item: Option<(Statement, Span)>) {\r\n        if let Some((end, span)) = item {\r\n            self.push(end, span)\r\n        }\r\n    }\r\n\r\n    pub fn extend_block(&mut self, other: Self) {\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info.extend(other.span_info);\r\n        self.body.extend(other.body);\r\n    }\r\n\r\n    pub fn append(&mut self, other: &mut Self) {\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info.append(&mut other.span_info);\r\n        self.body.append(&mut other.body);\r\n    }\r\n\r\n    pub fn cull<R: RangeBounds<usize> + Clone>(&mut self, range: R) {\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info.drain(range.clone());\r\n        self.body.drain(range);\r\n    }\r\n\r\n    pub fn splice<R: RangeBounds<usize> + Clone>(&mut self, range: R, other: Self) {\r\n        #[cfg(feature = \"span\")]\r\n        self.span_info\r\n            .splice(range.clone(), other.span_info.into_iter());\r\n        self.body.splice(range, other.body.into_iter());\r\n    }\r\n    pub fn span_iter(&self) -> impl Iterator<Item = (&Statement, &Span)> {\r\n        #[cfg(feature = \"span\")]\r\n        let span_iter = self.span_info.iter();\r\n        #[cfg(not(feature = \"span\"))]\r\n        let span_iter = std::iter::repeat_with(|| &Span::UNDEFINED);\r\n\r\n        self.body.iter().zip(span_iter)\r\n    }\r\n\r\n    pub fn span_iter_mut(&mut self) -> impl Iterator<Item = (&mut Statement, Option<&mut Span>)> {\r\n        #[cfg(feature = \"span\")]\r\n        let span_iter = self.span_info.iter_mut().map(Some);\r\n        #[cfg(not(feature = \"span\"))]\r\n        let span_iter = std::iter::repeat_with(|| None);\r\n\r\n        self.body.iter_mut().zip(span_iter)\r\n    }\r\n\r\n    pub fn is_empty(&self) -> bool {\r\n        self.body.is_empty()\r\n    }\r\n\r\n    pub fn len(&self) -> usize {\r\n        self.body.len()\r\n    }\r\n}\r\n\r\nimpl Deref for Block {\r\n    type Target = [Statement];\r\n    fn deref(&self) -> &[Statement] {\r\n        &self.body\r\n    }\r\n}\r\n\r\nimpl DerefMut for Block {\r\n    fn deref_mut(&mut self) -> &mut [Statement] {\r\n        &mut self.body\r\n    }\r\n}\r\n\r\nimpl<'a> IntoIterator for &'a Block {\r\n    type Item = &'a Statement;\r\n    type IntoIter = std::slice::Iter<'a, Statement>;\r\n\r\n    fn into_iter(self) -> std::slice::Iter<'a, Statement> {\r\n        self.iter()\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"deserialize\")]\r\nimpl<'de> serde::Deserialize<'de> for Block {\r\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\r\n    where\r\n        D: serde::Deserializer<'de>,\r\n    {\r\n        Ok(Self::from_vec(Vec::deserialize(deserializer)?))\r\n    }\r\n}\r\n\r\nimpl From<Vec<Statement>> for Block {\r\n    fn from(body: Vec<Statement>) -> Self {\r\n        Self::from_vec(body)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/ast.rs",
    "content": "use std::{borrow::Cow, fmt};\r\n\r\nuse super::{builtins::MacroCall, context::ExprPos, Span};\r\nuse crate::{\r\n    AddressSpace, BinaryOperator, Binding, Constant, Expression, Function, GlobalVariable, Handle,\r\n    Interpolation, Sampling, StorageAccess, Type, UnaryOperator,\r\n};\r\n\r\n#[derive(Debug, Clone, Copy)]\r\npub enum GlobalLookupKind {\r\n    Variable(Handle<GlobalVariable>),\r\n    Constant(Handle<Constant>, Handle<Type>),\r\n    BlockSelect(Handle<GlobalVariable>, u32),\r\n}\r\n\r\n#[derive(Debug, Clone, Copy)]\r\npub struct GlobalLookup {\r\n    pub kind: GlobalLookupKind,\r\n    pub entry_arg: Option<usize>,\r\n    pub mutable: bool,\r\n}\r\n\r\n#[derive(Debug, Clone)]\r\npub struct ParameterInfo {\r\n    pub qualifier: ParameterQualifier,\r\n    /// Whether the parameter should be treated as a depth image instead of a\r\n    /// sampled image.\r\n    pub depth: bool,\r\n}\r\n\r\n/// How the function is implemented\r\n#[derive(Clone, Copy)]\r\npub enum FunctionKind {\r\n    /// The function is user defined\r\n    Call(Handle<Function>),\r\n    /// The function is a builtin\r\n    Macro(MacroCall),\r\n}\r\n\r\nimpl fmt::Debug for FunctionKind {\r\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\r\n        match *self {\r\n            Self::Call(_) => write!(f, \"Call\"),\r\n            Self::Macro(_) => write!(f, \"Macro\"),\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\npub struct Overload {\r\n    /// Normalized function parameters, modifiers are not applied\r\n    pub parameters: Vec<Handle<Type>>,\r\n    pub parameters_info: Vec<ParameterInfo>,\r\n    /// How the function is implemented\r\n    pub kind: FunctionKind,\r\n    /// Whether this function was already defined or is just a prototype\r\n    pub defined: bool,\r\n    /// Whether this overload is the one provided by the language or has\r\n    /// been redeclared by the user (builtins only)\r\n    pub internal: bool,\r\n    /// Whether or not this function returns void (nothing)\r\n    pub void: bool,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Tracks the variations of the builtin already generated, this is needed because some\r\n    /// builtins overloads can't be generated unless explicitly used, since they might cause\r\n    /// unneeded capabilities to be requested\r\n    #[derive(Default)]\r\n    pub struct BuiltinVariations: u32 {\r\n        /// Request the standard overloads\r\n        const STANDARD = 1 << 0;\r\n        /// Request overloads that use the double type\r\n        const DOUBLE = 1 << 1;\r\n        /// Request overloads that use samplerCubeArray(Shadow)\r\n        const CUBE_TEXTURES_ARRAY = 1 << 2;\r\n        /// Request overloads that use sampler2DMSArray\r\n        const D2_MULTI_TEXTURES_ARRAY = 1 << 3;\r\n    }\r\n}\r\n\r\n#[derive(Debug, Default)]\r\npub struct FunctionDeclaration {\r\n    pub overloads: Vec<Overload>,\r\n    /// Tracks the builtin overload variations that were already generated\r\n    pub variations: BuiltinVariations,\r\n}\r\n\r\n#[derive(Debug)]\r\npub struct EntryArg {\r\n    pub name: Option<String>,\r\n    pub binding: Binding,\r\n    pub handle: Handle<GlobalVariable>,\r\n    pub storage: StorageQualifier,\r\n}\r\n\r\n#[derive(Debug, Clone)]\r\npub struct VariableReference {\r\n    pub expr: Handle<Expression>,\r\n    /// Wether the variable is of a pointer type (and needs loading) or not\r\n    pub load: bool,\r\n    /// Wether the value of the variable can be changed or not\r\n    pub mutable: bool,\r\n    pub constant: Option<(Handle<Constant>, Handle<Type>)>,\r\n    pub entry_arg: Option<usize>,\r\n}\r\n\r\n#[derive(Debug, Clone)]\r\npub struct HirExpr {\r\n    pub kind: HirExprKind,\r\n    pub meta: Span,\r\n}\r\n\r\n#[derive(Debug, Clone)]\r\npub enum HirExprKind {\r\n    Access {\r\n        base: Handle<HirExpr>,\r\n        index: Handle<HirExpr>,\r\n    },\r\n    Select {\r\n        base: Handle<HirExpr>,\r\n        field: String,\r\n    },\r\n    Constant(Handle<Constant>),\r\n    Binary {\r\n        left: Handle<HirExpr>,\r\n        op: BinaryOperator,\r\n        right: Handle<HirExpr>,\r\n    },\r\n    Unary {\r\n        op: UnaryOperator,\r\n        expr: Handle<HirExpr>,\r\n    },\r\n    Variable(VariableReference),\r\n    Call(FunctionCall),\r\n    /// Represents the ternary operator in glsl (`:?`)\r\n    Conditional {\r\n        /// The expression that will decide which branch to take, must evaluate to a boolean\r\n        condition: Handle<HirExpr>,\r\n        /// The expression that will be evaluated if [`condition`] returns `true`\r\n        ///\r\n        /// [`condition`]: Self::Conditional::condition\r\n        accept: Handle<HirExpr>,\r\n        /// The expression that will be evaluated if [`condition`] returns `false`\r\n        ///\r\n        /// [`condition`]: Self::Conditional::condition\r\n        reject: Handle<HirExpr>,\r\n    },\r\n    Assign {\r\n        tgt: Handle<HirExpr>,\r\n        value: Handle<HirExpr>,\r\n    },\r\n    /// A prefix/postfix operator like `++`\r\n    PrePostfix {\r\n        /// The operation to be performed\r\n        op: BinaryOperator,\r\n        /// Whether this is a postfix or a prefix\r\n        postfix: bool,\r\n        /// The target expression\r\n        expr: Handle<HirExpr>,\r\n    },\r\n    /// A method call like `what.something(a, b, c)`\r\n    Method {\r\n        /// expression the method call applies to (`what` in the example)\r\n        expr: Handle<HirExpr>,\r\n        /// the method name (`something` in the example)\r\n        name: String,\r\n        /// the arguments to the method (`a`, `b`, and `c` in the example)\r\n        args: Vec<Handle<HirExpr>>,\r\n    },\r\n}\r\n\r\n#[derive(Debug, Hash, PartialEq, Eq)]\r\npub enum QualifierKey<'a> {\r\n    String(Cow<'a, str>),\r\n    /// Used for `std140` and `std430` layout qualifiers\r\n    Layout,\r\n    /// Used for image formats\r\n    Format,\r\n}\r\n\r\n#[derive(Debug)]\r\npub enum QualifierValue {\r\n    None,\r\n    Uint(u32),\r\n    Layout(StructLayout),\r\n    Format(crate::StorageFormat),\r\n}\r\n\r\n#[derive(Debug, Default)]\r\npub struct TypeQualifiers<'a> {\r\n    pub span: Span,\r\n    pub storage: (StorageQualifier, Span),\r\n    pub invariant: Option<Span>,\r\n    pub interpolation: Option<(Interpolation, Span)>,\r\n    pub precision: Option<(Precision, Span)>,\r\n    pub sampling: Option<(Sampling, Span)>,\r\n    /// Memory qualifiers used in the declaration to set the storage access to be used\r\n    /// in declarations that support it (storage images and buffers)\r\n    pub storage_access: Option<(StorageAccess, Span)>,\r\n    pub layout_qualifiers: crate::FastHashMap<QualifierKey<'a>, (QualifierValue, Span)>,\r\n}\r\n\r\nimpl<'a> TypeQualifiers<'a> {\r\n    /// Appends `errors` with errors for all unused qualifiers\r\n    pub fn unused_errors(&self, errors: &mut Vec<super::Error>) {\r\n        if let Some(meta) = self.invariant {\r\n            errors.push(super::Error {\r\n                kind: super::ErrorKind::SemanticError(\r\n                    \"Invariant qualifier can only be used in in/out variables\".into(),\r\n                ),\r\n                meta,\r\n            });\r\n        }\r\n\r\n        if let Some((_, meta)) = self.interpolation {\r\n            errors.push(super::Error {\r\n                kind: super::ErrorKind::SemanticError(\r\n                    \"Interpolation qualifiers can only be used in in/out variables\".into(),\r\n                ),\r\n                meta,\r\n            });\r\n        }\r\n\r\n        if let Some((_, meta)) = self.sampling {\r\n            errors.push(super::Error {\r\n                kind: super::ErrorKind::SemanticError(\r\n                    \"Sampling qualifiers can only be used in in/out variables\".into(),\r\n                ),\r\n                meta,\r\n            });\r\n        }\r\n\r\n        if let Some((_, meta)) = self.storage_access {\r\n            errors.push(super::Error {\r\n                kind: super::ErrorKind::SemanticError(\r\n                    \"Memory qualifiers can only be used in storage variables\".into(),\r\n                ),\r\n                meta,\r\n            });\r\n        }\r\n\r\n        for &(_, meta) in self.layout_qualifiers.values() {\r\n            errors.push(super::Error {\r\n                kind: super::ErrorKind::SemanticError(\"Unexpected qualifier\".into()),\r\n                meta,\r\n            });\r\n        }\r\n    }\r\n\r\n    /// Removes the layout qualifier with `name`, if it exists and adds an error if it isn't\r\n    /// a [`QualifierValue::Uint`]\r\n    pub fn uint_layout_qualifier(\r\n        &mut self,\r\n        name: &'a str,\r\n        errors: &mut Vec<super::Error>,\r\n    ) -> Option<u32> {\r\n        match self\r\n            .layout_qualifiers\r\n            .remove(&QualifierKey::String(name.into()))\r\n        {\r\n            Some((QualifierValue::Uint(v), _)) => Some(v),\r\n            Some((_, meta)) => {\r\n                errors.push(super::Error {\r\n                    kind: super::ErrorKind::SemanticError(\"Qualifier expects a uint value\".into()),\r\n                    meta,\r\n                });\r\n                // Return a dummy value instead of `None` to differentiate from\r\n                // the qualifier not existing, since some parts might require the\r\n                // qualifier to exist and throwing another error that it doesn't\r\n                // exist would be unhelpful\r\n                Some(0)\r\n            }\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    /// Removes the layout qualifier with `name`, if it exists and adds an error if it isn't\r\n    /// a [`QualifierValue::None`]\r\n    pub fn none_layout_qualifier(&mut self, name: &'a str, errors: &mut Vec<super::Error>) -> bool {\r\n        match self\r\n            .layout_qualifiers\r\n            .remove(&QualifierKey::String(name.into()))\r\n        {\r\n            Some((QualifierValue::None, _)) => true,\r\n            Some((_, meta)) => {\r\n                errors.push(super::Error {\r\n                    kind: super::ErrorKind::SemanticError(\r\n                        \"Qualifier doesn't expect a value\".into(),\r\n                    ),\r\n                    meta,\r\n                });\r\n                // Return a `true` to since the qualifier is defined and adding\r\n                // another error for it not being defined would be unhelpful\r\n                true\r\n            }\r\n            _ => false,\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug, Clone)]\r\npub enum FunctionCallKind {\r\n    TypeConstructor(Handle<Type>),\r\n    Function(String),\r\n}\r\n\r\n#[derive(Debug, Clone)]\r\npub struct FunctionCall {\r\n    pub kind: FunctionCallKind,\r\n    pub args: Vec<Handle<HirExpr>>,\r\n}\r\n\r\n#[derive(Debug, Clone, Copy, PartialEq)]\r\npub enum StorageQualifier {\r\n    AddressSpace(AddressSpace),\r\n    Input,\r\n    Output,\r\n    Const,\r\n}\r\n\r\nimpl Default for StorageQualifier {\r\n    fn default() -> Self {\r\n        StorageQualifier::AddressSpace(AddressSpace::Function)\r\n    }\r\n}\r\n\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\npub enum StructLayout {\r\n    Std140,\r\n    Std430,\r\n}\r\n\r\n// TODO: Encode precision hints in the IR\r\n/// A precision hint used in GLSL declarations.\r\n///\r\n/// Precision hints can be used to either speed up shader execution or control\r\n/// the precision of arithmetic operations.\r\n///\r\n/// To use a precision hint simply add it before the type in the declaration.\r\n/// ```glsl\r\n/// mediump float a;\r\n/// ```\r\n///\r\n/// The default when no precision is declared is `highp` which means that all\r\n/// operations operate with the type defined width.\r\n///\r\n/// For `mediump` and `lowp` operations follow the spir-v\r\n/// [`RelaxedPrecision`][RelaxedPrecision] decoration semantics.\r\n///\r\n/// [RelaxedPrecision]: https://www.khronos.org/registry/SPIR-V/specs/unified1/SPIRV.html#_a_id_relaxedprecisionsection_a_relaxed_precision\r\n#[derive(Debug, Clone, PartialEq, Copy)]\r\npub enum Precision {\r\n    /// `lowp` precision\r\n    Low,\r\n    /// `mediump` precision\r\n    Medium,\r\n    /// `highp` precision\r\n    High,\r\n}\r\n\r\n#[derive(Debug, Clone, PartialEq, Copy)]\r\npub enum ParameterQualifier {\r\n    In,\r\n    Out,\r\n    InOut,\r\n    Const,\r\n}\r\n\r\nimpl ParameterQualifier {\r\n    /// Returns true if the argument should be passed as a lhs expression\r\n    pub const fn is_lhs(&self) -> bool {\r\n        match *self {\r\n            ParameterQualifier::Out | ParameterQualifier::InOut => true,\r\n            _ => false,\r\n        }\r\n    }\r\n\r\n    /// Converts from a parameter qualifier into a [`ExprPos`](ExprPos)\r\n    pub const fn as_pos(&self) -> ExprPos {\r\n        match *self {\r\n            ParameterQualifier::Out | ParameterQualifier::InOut => ExprPos::Lhs,\r\n            _ => ExprPos::Rhs,\r\n        }\r\n    }\r\n}\r\n\r\n/// The GLSL profile used by a shader.\r\n#[derive(Debug, Clone, Copy, PartialEq)]\r\npub enum Profile {\r\n    /// The `core` profile, default when no profile is specified.\r\n    Core,\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/builtins.rs",
    "content": "use super::{\r\n    ast::{\r\n        BuiltinVariations, FunctionDeclaration, FunctionKind, Overload, ParameterInfo,\r\n        ParameterQualifier,\r\n    },\r\n    context::Context,\r\n    Error, ErrorKind, Parser, Result,\r\n};\r\nuse crate::{\r\n    BinaryOperator, Block, Constant, DerivativeAxis, Expression, Handle, ImageClass,\r\n    ImageDimension as Dim, ImageQuery, MathFunction, Module, RelationalFunction, SampleLevel,\r\n    ScalarKind as Sk, Span, Type, TypeInner, VectorSize,\r\n};\r\n\r\nimpl crate::ScalarKind {\r\n    const fn dummy_storage_format(&self) -> crate::StorageFormat {\r\n        match *self {\r\n            Sk::Sint => crate::StorageFormat::R16Sint,\r\n            Sk::Uint => crate::StorageFormat::R16Uint,\r\n            _ => crate::StorageFormat::R16Float,\r\n        }\r\n    }\r\n}\r\n\r\nimpl Module {\r\n    /// Helper function, to create a function prototype for a builtin\r\n    fn add_builtin(&mut self, args: Vec<TypeInner>, builtin: MacroCall) -> Overload {\r\n        let mut parameters = Vec::with_capacity(args.len());\r\n        let mut parameters_info = Vec::with_capacity(args.len());\r\n\r\n        for arg in args {\r\n            parameters.push(self.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: arg,\r\n                },\r\n                Span::default(),\r\n            ));\r\n            parameters_info.push(ParameterInfo {\r\n                qualifier: ParameterQualifier::In,\r\n                depth: false,\r\n            });\r\n        }\r\n\r\n        Overload {\r\n            parameters,\r\n            parameters_info,\r\n            kind: FunctionKind::Macro(builtin),\r\n            defined: false,\r\n            internal: true,\r\n            void: false,\r\n        }\r\n    }\r\n}\r\n\r\nconst fn make_coords_arg(number_of_components: usize, kind: Sk) -> TypeInner {\r\n    let width = 4;\r\n\r\n    match number_of_components {\r\n        1 => TypeInner::Scalar { kind, width },\r\n        _ => TypeInner::Vector {\r\n            size: match number_of_components {\r\n                2 => VectorSize::Bi,\r\n                3 => VectorSize::Tri,\r\n                _ => VectorSize::Quad,\r\n            },\r\n            kind,\r\n            width,\r\n        },\r\n    }\r\n}\r\n\r\n/// Inject builtins into the declaration\r\n///\r\n/// This is done to not add a large startup cost and not increase memory\r\n/// usage if it isn't needed.\r\npub fn inject_builtin(\r\n    declaration: &mut FunctionDeclaration,\r\n    module: &mut Module,\r\n    name: &str,\r\n    mut variations: BuiltinVariations,\r\n) {\r\n    log::trace!(\r\n        \"{} variations: {:?} {:?}\",\r\n        name,\r\n        variations,\r\n        declaration.variations\r\n    );\r\n    // Don't regeneate variations\r\n    variations.remove(declaration.variations);\r\n    declaration.variations |= variations;\r\n\r\n    if variations.contains(BuiltinVariations::STANDARD) {\r\n        inject_standard_builtins(declaration, module, name)\r\n    }\r\n\r\n    if variations.contains(BuiltinVariations::DOUBLE) {\r\n        inject_double_builtin(declaration, module, name)\r\n    }\r\n\r\n    let width = 4;\r\n    match name {\r\n        \"texture\"\r\n        | \"textureGrad\"\r\n        | \"textureGradOffset\"\r\n        | \"textureLod\"\r\n        | \"textureLodOffset\"\r\n        | \"textureOffset\"\r\n        | \"textureProj\"\r\n        | \"textureProjGrad\"\r\n        | \"textureProjGradOffset\"\r\n        | \"textureProjLod\"\r\n        | \"textureProjLodOffset\"\r\n        | \"textureProjOffset\" => {\r\n            let f = |kind, dim, arrayed, multi, shadow| {\r\n                for bits in 0..=0b11 {\r\n                    let variant = bits & 0b1 != 0;\r\n                    let bias = bits & 0b10 != 0;\r\n\r\n                    let (proj, offset, level_type) = match name {\r\n                        // texture(gsampler, gvec P, [float bias]);\r\n                        \"texture\" => (false, false, TextureLevelType::None),\r\n                        // textureGrad(gsampler, gvec P, gvec dPdx, gvec dPdy);\r\n                        \"textureGrad\" => (false, false, TextureLevelType::Grad),\r\n                        // textureGradOffset(gsampler, gvec P, gvec dPdx, gvec dPdy, ivec offset);\r\n                        \"textureGradOffset\" => (false, true, TextureLevelType::Grad),\r\n                        // textureLod(gsampler, gvec P, float lod);\r\n                        \"textureLod\" => (false, false, TextureLevelType::Lod),\r\n                        // textureLodOffset(gsampler, gvec P, float lod, ivec offset);\r\n                        \"textureLodOffset\" => (false, true, TextureLevelType::Lod),\r\n                        // textureOffset(gsampler, gvec+1 P, ivec offset, [float bias]);\r\n                        \"textureOffset\" => (false, true, TextureLevelType::None),\r\n                        // textureProj(gsampler, gvec+1 P, [float bias]);\r\n                        \"textureProj\" => (true, false, TextureLevelType::None),\r\n                        // textureProjGrad(gsampler, gvec+1 P, gvec dPdx, gvec dPdy);\r\n                        \"textureProjGrad\" => (true, false, TextureLevelType::Grad),\r\n                        // textureProjGradOffset(gsampler, gvec+1 P, gvec dPdx, gvec dPdy, ivec offset);\r\n                        \"textureProjGradOffset\" => (true, true, TextureLevelType::Grad),\r\n                        // textureProjLod(gsampler, gvec+1 P, float lod);\r\n                        \"textureProjLod\" => (true, false, TextureLevelType::Lod),\r\n                        // textureProjLodOffset(gsampler, gvec+1 P, gvec dPdx, gvec dPdy, ivec offset);\r\n                        \"textureProjLodOffset\" => (true, true, TextureLevelType::Lod),\r\n                        // textureProjOffset(gsampler, gvec+1 P, ivec offset, [float bias]);\r\n                        \"textureProjOffset\" => (true, true, TextureLevelType::None),\r\n                        _ => unreachable!(),\r\n                    };\r\n\r\n                    let builtin = MacroCall::Texture {\r\n                        proj,\r\n                        offset,\r\n                        shadow,\r\n                        level_type,\r\n                    };\r\n\r\n                    // Parse out the variant settings.\r\n                    let grad = level_type == TextureLevelType::Grad;\r\n                    let lod = level_type == TextureLevelType::Lod;\r\n\r\n                    let supports_variant = proj && !shadow;\r\n                    if variant && !supports_variant {\r\n                        continue;\r\n                    }\r\n\r\n                    if bias && !matches!(level_type, TextureLevelType::None) {\r\n                        continue;\r\n                    }\r\n\r\n                    // Proj doesn't work with arrayed or Cube\r\n                    if proj && (arrayed || dim == Dim::Cube) {\r\n                        continue;\r\n                    }\r\n\r\n                    // texture operations with offset are not supported for cube maps\r\n                    if dim == Dim::Cube && offset {\r\n                        continue;\r\n                    }\r\n\r\n                    // sampler2DArrayShadow can't be used in textureLod or in texture with bias\r\n                    if (lod || bias) && arrayed && shadow && dim == Dim::D2 {\r\n                        continue;\r\n                    }\r\n\r\n                    // TODO: glsl supports using bias with depth samplers but naga doesn't\r\n                    if bias && shadow {\r\n                        continue;\r\n                    }\r\n\r\n                    let class = match shadow {\r\n                        true => ImageClass::Depth { multi },\r\n                        false => ImageClass::Sampled { kind, multi },\r\n                    };\r\n\r\n                    let image = TypeInner::Image {\r\n                        dim,\r\n                        arrayed,\r\n                        class,\r\n                    };\r\n\r\n                    let num_coords_from_dim = image_dims_to_coords_size(dim).min(3);\r\n                    let mut num_coords = num_coords_from_dim;\r\n\r\n                    if shadow && proj {\r\n                        num_coords = 4;\r\n                    } else if dim == Dim::D1 && shadow {\r\n                        num_coords = 3;\r\n                    } else if shadow {\r\n                        num_coords += 1;\r\n                    } else if proj {\r\n                        if variant && num_coords == 4 {\r\n                            // Normal form already has 4 components, no need to have a variant form.\r\n                            continue;\r\n                        } else if variant {\r\n                            num_coords = 4;\r\n                        } else {\r\n                            num_coords += 1;\r\n                        }\r\n                    }\r\n\r\n                    if !(dim == Dim::D1 && shadow) {\r\n                        num_coords += arrayed as usize;\r\n                    }\r\n\r\n                    // Special case: texture(gsamplerCubeArrayShadow) kicks the shadow compare ref to a separate argument,\r\n                    // since it would otherwise take five arguments. It also can't take a bias, nor can it be proj/grad/lod/offset\r\n                    // (presumably because nobody asked for it, and implementation complexity?)\r\n                    if num_coords >= 5 {\r\n                        if lod || grad || offset || proj || bias {\r\n                            continue;\r\n                        }\r\n                        debug_assert!(dim == Dim::Cube && shadow && arrayed);\r\n                    }\r\n                    debug_assert!(num_coords <= 5);\r\n\r\n                    let vector = make_coords_arg(num_coords, Sk::Float);\r\n                    let mut args = vec![image, vector];\r\n\r\n                    if num_coords == 5 {\r\n                        args.push(TypeInner::Scalar {\r\n                            kind: Sk::Float,\r\n                            width,\r\n                        });\r\n                    }\r\n\r\n                    match level_type {\r\n                        TextureLevelType::Lod => {\r\n                            args.push(TypeInner::Scalar {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            });\r\n                        }\r\n                        TextureLevelType::Grad => {\r\n                            args.push(make_coords_arg(num_coords_from_dim, Sk::Float));\r\n                            args.push(make_coords_arg(num_coords_from_dim, Sk::Float));\r\n                        }\r\n                        _ => {}\r\n                    };\r\n\r\n                    if offset {\r\n                        args.push(make_coords_arg(num_coords_from_dim, Sk::Sint));\r\n                    }\r\n\r\n                    if bias {\r\n                        args.push(TypeInner::Scalar {\r\n                            kind: Sk::Float,\r\n                            width,\r\n                        });\r\n                    }\r\n\r\n                    declaration\r\n                        .overloads\r\n                        .push(module.add_builtin(args, builtin));\r\n                }\r\n            };\r\n\r\n            texture_args_generator(TextureArgsOptions::SHADOW | variations.into(), f)\r\n        }\r\n        \"textureSize\" => {\r\n            let f = |kind, dim, arrayed, multi, shadow| {\r\n                let class = match shadow {\r\n                    true => ImageClass::Depth { multi },\r\n                    false => ImageClass::Sampled { kind, multi },\r\n                };\r\n\r\n                let image = TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class,\r\n                };\r\n\r\n                let mut args = vec![image];\r\n\r\n                if !multi {\r\n                    args.push(TypeInner::Scalar {\r\n                        kind: Sk::Sint,\r\n                        width,\r\n                    })\r\n                }\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::TextureSize { arrayed }))\r\n            };\r\n\r\n            texture_args_generator(\r\n                TextureArgsOptions::SHADOW | TextureArgsOptions::MULTI | variations.into(),\r\n                f,\r\n            )\r\n        }\r\n        \"texelFetch\" | \"texelFetchOffset\" => {\r\n            let offset = \"texelFetchOffset\" == name;\r\n            let f = |kind, dim, arrayed, multi, _shadow| {\r\n                // Cube images aren't supported\r\n                if let Dim::Cube = dim {\r\n                    return;\r\n                }\r\n\r\n                let image = TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class: ImageClass::Sampled { kind, multi },\r\n                };\r\n\r\n                let dim_value = image_dims_to_coords_size(dim);\r\n                let coordinates = make_coords_arg(dim_value + arrayed as usize, Sk::Sint);\r\n\r\n                let mut args = vec![\r\n                    image,\r\n                    coordinates,\r\n                    TypeInner::Scalar {\r\n                        kind: Sk::Sint,\r\n                        width,\r\n                    },\r\n                ];\r\n\r\n                if offset {\r\n                    args.push(make_coords_arg(dim_value, Sk::Sint));\r\n                }\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::ImageLoad { multi }))\r\n            };\r\n\r\n            // Don't generate shadow images since they aren't supported\r\n            texture_args_generator(TextureArgsOptions::MULTI | variations.into(), f)\r\n        }\r\n        \"imageSize\" => {\r\n            let f = |kind: Sk, dim, arrayed, _, _| {\r\n                // Naga doesn't support cube images and it's usefulness\r\n                // is questionable, so they won't be supported for now\r\n                if dim == Dim::Cube {\r\n                    return;\r\n                }\r\n\r\n                let image = TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class: ImageClass::Storage {\r\n                        format: kind.dummy_storage_format(),\r\n                        access: crate::StorageAccess::empty(),\r\n                    },\r\n                };\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(vec![image], MacroCall::TextureSize { arrayed }))\r\n            };\r\n\r\n            texture_args_generator(variations.into(), f)\r\n        }\r\n        \"imageLoad\" => {\r\n            let f = |kind: Sk, dim, arrayed, _, _| {\r\n                // Naga doesn't support cube images and it's usefulness\r\n                // is questionable, so they won't be supported for now\r\n                if dim == Dim::Cube {\r\n                    return;\r\n                }\r\n\r\n                let image = TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class: ImageClass::Storage {\r\n                        format: kind.dummy_storage_format(),\r\n                        access: crate::StorageAccess::LOAD,\r\n                    },\r\n                };\r\n\r\n                let dim_value = image_dims_to_coords_size(dim);\r\n                let mut coord_size = dim_value + arrayed as usize;\r\n                // > Every OpenGL API call that operates on cubemap array\r\n                // > textures takes layer-faces, not array layers\r\n                //\r\n                // So this means that imageCubeArray only takes a three component\r\n                // vector coordinate and the third component is a layer index.\r\n                if Dim::Cube == dim && arrayed {\r\n                    coord_size = 3\r\n                }\r\n                let coordinates = make_coords_arg(coord_size, Sk::Sint);\r\n\r\n                let args = vec![image, coordinates];\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::ImageLoad { multi: false }))\r\n            };\r\n\r\n            // Don't generate shadow nor multisampled images since they aren't supported\r\n            texture_args_generator(variations.into(), f)\r\n        }\r\n        \"imageStore\" => {\r\n            let f = |kind: Sk, dim, arrayed, _, _| {\r\n                // Naga doesn't support cube images and it's usefulness\r\n                // is questionable, so they won't be supported for now\r\n                if dim == Dim::Cube {\r\n                    return;\r\n                }\r\n\r\n                let image = TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class: ImageClass::Storage {\r\n                        format: kind.dummy_storage_format(),\r\n                        access: crate::StorageAccess::STORE,\r\n                    },\r\n                };\r\n\r\n                let dim_value = image_dims_to_coords_size(dim);\r\n                let mut coord_size = dim_value + arrayed as usize;\r\n                // > Every OpenGL API call that operates on cubemap array\r\n                // > textures takes layer-faces, not array layers\r\n                //\r\n                // So this means that imageCubeArray only takes a three component\r\n                // vector coordinate and the third component is a layer index.\r\n                if Dim::Cube == dim && arrayed {\r\n                    coord_size = 3\r\n                }\r\n                let coordinates = make_coords_arg(coord_size, Sk::Sint);\r\n\r\n                let args = vec![\r\n                    image,\r\n                    coordinates,\r\n                    TypeInner::Vector {\r\n                        size: VectorSize::Quad,\r\n                        kind,\r\n                        width,\r\n                    },\r\n                ];\r\n\r\n                let mut overload = module.add_builtin(args, MacroCall::ImageStore);\r\n                overload.void = true;\r\n                declaration.overloads.push(overload)\r\n            };\r\n\r\n            // Don't generate shadow nor multisampled images since they aren't supported\r\n            texture_args_generator(variations.into(), f)\r\n        }\r\n        _ => {}\r\n    }\r\n}\r\n\r\n/// Injects the builtins into declaration that don't need any special variations\r\nfn inject_standard_builtins(\r\n    declaration: &mut FunctionDeclaration,\r\n    module: &mut Module,\r\n    name: &str,\r\n) {\r\n    let width = 4;\r\n    match name {\r\n        \"sampler1D\" | \"sampler1DArray\" | \"sampler2D\" | \"sampler2DArray\" | \"sampler2DMS\"\r\n        | \"sampler2DMSArray\" | \"sampler3D\" | \"samplerCube\" | \"samplerCubeArray\" => {\r\n            declaration.overloads.push(module.add_builtin(\r\n                vec![\r\n                    TypeInner::Image {\r\n                        dim: match name {\r\n                            \"sampler1D\" | \"sampler1DArray\" => Dim::D1,\r\n                            \"sampler2D\" | \"sampler2DArray\" | \"sampler2DMS\" | \"sampler2DMSArray\" => {\r\n                                Dim::D2\r\n                            }\r\n                            \"sampler3D\" => Dim::D3,\r\n                            _ => Dim::Cube,\r\n                        },\r\n                        arrayed: matches!(\r\n                            name,\r\n                            \"sampler1DArray\"\r\n                                | \"sampler2DArray\"\r\n                                | \"sampler2DMSArray\"\r\n                                | \"samplerCubeArray\"\r\n                        ),\r\n                        class: ImageClass::Sampled {\r\n                            kind: Sk::Float,\r\n                            multi: matches!(name, \"sampler2DMS\" | \"sampler2DMSArray\"),\r\n                        },\r\n                    },\r\n                    TypeInner::Sampler { comparison: false },\r\n                ],\r\n                MacroCall::Sampler,\r\n            ))\r\n        }\r\n        \"sampler1DShadow\"\r\n        | \"sampler1DArrayShadow\"\r\n        | \"sampler2DShadow\"\r\n        | \"sampler2DArrayShadow\"\r\n        | \"samplerCubeShadow\"\r\n        | \"samplerCubeArrayShadow\" => {\r\n            let dim = match name {\r\n                \"sampler1DShadow\" | \"sampler1DArrayShadow\" => Dim::D1,\r\n                \"sampler2DShadow\" | \"sampler2DArrayShadow\" => Dim::D2,\r\n                _ => Dim::Cube,\r\n            };\r\n            let arrayed = matches!(\r\n                name,\r\n                \"sampler1DArrayShadow\" | \"sampler2DArrayShadow\" | \"samplerCubeArrayShadow\"\r\n            );\r\n\r\n            for i in 0..2 {\r\n                let ty = TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class: match i {\r\n                        0 => ImageClass::Sampled {\r\n                            kind: Sk::Float,\r\n                            multi: false,\r\n                        },\r\n                        _ => ImageClass::Depth { multi: false },\r\n                    },\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    vec![ty, TypeInner::Sampler { comparison: true }],\r\n                    MacroCall::SamplerShadow,\r\n                ))\r\n            }\r\n        }\r\n        \"sin\" | \"exp\" | \"exp2\" | \"sinh\" | \"cos\" | \"cosh\" | \"tan\" | \"tanh\" | \"acos\" | \"asin\"\r\n        | \"log\" | \"log2\" | \"radians\" | \"degrees\" | \"asinh\" | \"acosh\" | \"atanh\"\r\n        | \"floatBitsToInt\" | \"floatBitsToUint\" | \"dFdx\" | \"dFdxFine\" | \"dFdxCoarse\" | \"dFdy\"\r\n        | \"dFdyFine\" | \"dFdyCoarse\" | \"fwidth\" | \"fwidthFine\" | \"fwidthCoarse\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let kind = Sk::Float;\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    vec![match size {\r\n                        Some(size) => TypeInner::Vector { size, kind, width },\r\n                        None => TypeInner::Scalar { kind, width },\r\n                    }],\r\n                    match name {\r\n                        \"sin\" => MacroCall::MathFunction(MathFunction::Sin),\r\n                        \"exp\" => MacroCall::MathFunction(MathFunction::Exp),\r\n                        \"exp2\" => MacroCall::MathFunction(MathFunction::Exp2),\r\n                        \"sinh\" => MacroCall::MathFunction(MathFunction::Sinh),\r\n                        \"cos\" => MacroCall::MathFunction(MathFunction::Cos),\r\n                        \"cosh\" => MacroCall::MathFunction(MathFunction::Cosh),\r\n                        \"tan\" => MacroCall::MathFunction(MathFunction::Tan),\r\n                        \"tanh\" => MacroCall::MathFunction(MathFunction::Tanh),\r\n                        \"acos\" => MacroCall::MathFunction(MathFunction::Acos),\r\n                        \"asin\" => MacroCall::MathFunction(MathFunction::Asin),\r\n                        \"log\" => MacroCall::MathFunction(MathFunction::Log),\r\n                        \"log2\" => MacroCall::MathFunction(MathFunction::Log2),\r\n                        \"asinh\" => MacroCall::MathFunction(MathFunction::Asinh),\r\n                        \"acosh\" => MacroCall::MathFunction(MathFunction::Acosh),\r\n                        \"atanh\" => MacroCall::MathFunction(MathFunction::Atanh),\r\n                        \"radians\" => MacroCall::MathFunction(MathFunction::Radians),\r\n                        \"degrees\" => MacroCall::MathFunction(MathFunction::Degrees),\r\n                        \"floatBitsToInt\" => MacroCall::BitCast(Sk::Sint),\r\n                        \"floatBitsToUint\" => MacroCall::BitCast(Sk::Uint),\r\n                        \"dFdx\" | \"dFdxFine\" | \"dFdxCoarse\" => {\r\n                            MacroCall::Derivate(DerivativeAxis::X)\r\n                        }\r\n                        \"dFdy\" | \"dFdyFine\" | \"dFdyCoarse\" => {\r\n                            MacroCall::Derivate(DerivativeAxis::Y)\r\n                        }\r\n                        \"fwidth\" | \"fwidthFine\" | \"fwidthCoarse\" => {\r\n                            MacroCall::Derivate(DerivativeAxis::Width)\r\n                        }\r\n                        _ => unreachable!(),\r\n                    },\r\n                ))\r\n            }\r\n        }\r\n        \"intBitsToFloat\" | \"uintBitsToFloat\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let kind = match name {\r\n                    \"intBitsToFloat\" => Sk::Sint,\r\n                    _ => Sk::Uint,\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    vec![match size {\r\n                        Some(size) => TypeInner::Vector { size, kind, width },\r\n                        None => TypeInner::Scalar { kind, width },\r\n                    }],\r\n                    MacroCall::BitCast(Sk::Float),\r\n                ))\r\n            }\r\n        }\r\n        \"pow\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let kind = Sk::Float;\r\n                let ty = || match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n\r\n                declaration.overloads.push(\r\n                    module\r\n                        .add_builtin(vec![ty(), ty()], MacroCall::MathFunction(MathFunction::Pow)),\r\n                )\r\n            }\r\n        }\r\n        \"abs\" | \"sign\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            // bit 2 - float/sint\r\n            for bits in 0..0b1000 {\r\n                let size = match bits & 0b11 {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let kind = match bits >> 2 {\r\n                    0b0 => Sk::Float,\r\n                    _ => Sk::Sint,\r\n                };\r\n\r\n                let args = vec![match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                }];\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    args,\r\n                    MacroCall::MathFunction(match name {\r\n                        \"abs\" => MathFunction::Abs,\r\n                        \"sign\" => MathFunction::Sign,\r\n                        _ => unreachable!(),\r\n                    }),\r\n                ))\r\n            }\r\n        }\r\n        \"bitCount\" | \"bitfieldReverse\" | \"bitfieldExtract\" | \"bitfieldInsert\" | \"findLSB\"\r\n        | \"findMSB\" => {\r\n            let fun = match name {\r\n                \"bitCount\" => MathFunction::CountOneBits,\r\n                \"bitfieldReverse\" => MathFunction::ReverseBits,\r\n                \"bitfieldExtract\" => MathFunction::ExtractBits,\r\n                \"bitfieldInsert\" => MathFunction::InsertBits,\r\n                \"findLSB\" => MathFunction::FindLsb,\r\n                \"findMSB\" => MathFunction::FindMsb,\r\n                _ => unreachable!(),\r\n            };\r\n\r\n            let mc = match fun {\r\n                MathFunction::ExtractBits => MacroCall::BitfieldExtract,\r\n                MathFunction::InsertBits => MacroCall::BitfieldInsert,\r\n                _ => MacroCall::MathFunction(fun),\r\n            };\r\n\r\n            // bits layout\r\n            // bit 0 - int/uint\r\n            // bit 1 trough 2 - dims\r\n            for bits in 0..0b1000 {\r\n                let kind = match bits & 0b1 {\r\n                    0b0 => Sk::Sint,\r\n                    _ => Sk::Uint,\r\n                };\r\n                let size = match bits >> 1 {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n\r\n                let ty = || match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n\r\n                let mut args = vec![ty()];\r\n\r\n                match fun {\r\n                    MathFunction::ExtractBits => {\r\n                        args.push(TypeInner::Scalar {\r\n                            kind: Sk::Sint,\r\n                            width: 4,\r\n                        });\r\n                        args.push(TypeInner::Scalar {\r\n                            kind: Sk::Sint,\r\n                            width: 4,\r\n                        });\r\n                    }\r\n                    MathFunction::InsertBits => {\r\n                        args.push(ty());\r\n                        args.push(TypeInner::Scalar {\r\n                            kind: Sk::Sint,\r\n                            width: 4,\r\n                        });\r\n                        args.push(TypeInner::Scalar {\r\n                            kind: Sk::Sint,\r\n                            width: 4,\r\n                        });\r\n                    }\r\n                    _ => {}\r\n                }\r\n\r\n                // we need to cast the return type of findLsb / findMsb\r\n                let mc = if kind == Sk::Uint {\r\n                    match mc {\r\n                        MacroCall::MathFunction(MathFunction::FindLsb) => MacroCall::FindLsbUint,\r\n                        MacroCall::MathFunction(MathFunction::FindMsb) => MacroCall::FindMsbUint,\r\n                        mc => mc,\r\n                    }\r\n                } else {\r\n                    mc\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(args, mc))\r\n            }\r\n        }\r\n        \"packSnorm4x8\" | \"packUnorm4x8\" | \"packSnorm2x16\" | \"packUnorm2x16\" | \"packHalf2x16\" => {\r\n            let fun = match name {\r\n                \"packSnorm4x8\" => MathFunction::Pack4x8snorm,\r\n                \"packUnorm4x8\" => MathFunction::Pack4x8unorm,\r\n                \"packSnorm2x16\" => MathFunction::Pack2x16unorm,\r\n                \"packUnorm2x16\" => MathFunction::Pack2x16snorm,\r\n                \"packHalf2x16\" => MathFunction::Pack2x16float,\r\n                _ => unreachable!(),\r\n            };\r\n\r\n            let ty = match fun {\r\n                MathFunction::Pack4x8snorm | MathFunction::Pack4x8unorm => TypeInner::Vector {\r\n                    size: crate::VectorSize::Quad,\r\n                    kind: Sk::Float,\r\n                    width: 4,\r\n                },\r\n                MathFunction::Pack2x16unorm\r\n                | MathFunction::Pack2x16snorm\r\n                | MathFunction::Pack2x16float => TypeInner::Vector {\r\n                    size: crate::VectorSize::Bi,\r\n                    kind: Sk::Float,\r\n                    width: 4,\r\n                },\r\n                _ => unreachable!(),\r\n            };\r\n\r\n            let args = vec![ty];\r\n\r\n            declaration\r\n                .overloads\r\n                .push(module.add_builtin(args, MacroCall::MathFunction(fun)));\r\n        }\r\n        \"unpackSnorm4x8\" | \"unpackUnorm4x8\" | \"unpackSnorm2x16\" | \"unpackUnorm2x16\"\r\n        | \"unpackHalf2x16\" => {\r\n            let fun = match name {\r\n                \"unpackSnorm4x8\" => MathFunction::Unpack4x8snorm,\r\n                \"unpackUnorm4x8\" => MathFunction::Unpack4x8unorm,\r\n                \"unpackSnorm2x16\" => MathFunction::Unpack2x16snorm,\r\n                \"unpackUnorm2x16\" => MathFunction::Unpack2x16unorm,\r\n                \"unpackHalf2x16\" => MathFunction::Unpack2x16float,\r\n                _ => unreachable!(),\r\n            };\r\n\r\n            let args = vec![TypeInner::Scalar {\r\n                kind: Sk::Uint,\r\n                width: 4,\r\n            }];\r\n\r\n            declaration\r\n                .overloads\r\n                .push(module.add_builtin(args, MacroCall::MathFunction(fun)));\r\n        }\r\n        \"atan\" => {\r\n            // bits layout\r\n            // bit 0 - atan/atan2\r\n            // bit 1 trough 2 - dims\r\n            for bits in 0..0b1000 {\r\n                let fun = match bits & 0b1 {\r\n                    0b0 => MathFunction::Atan,\r\n                    _ => MathFunction::Atan2,\r\n                };\r\n                let size = match bits >> 1 {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let kind = Sk::Float;\r\n                let ty = || match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n\r\n                let mut args = vec![ty()];\r\n\r\n                if fun == MathFunction::Atan2 {\r\n                    args.push(ty())\r\n                }\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::MathFunction(fun)))\r\n            }\r\n        }\r\n        \"all\" | \"any\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b11 {\r\n                let size = match bits {\r\n                    0b00 => VectorSize::Bi,\r\n                    0b01 => VectorSize::Tri,\r\n                    _ => VectorSize::Quad,\r\n                };\r\n\r\n                let args = vec![TypeInner::Vector {\r\n                    size,\r\n                    kind: Sk::Bool,\r\n                    width: crate::BOOL_WIDTH,\r\n                }];\r\n\r\n                let fun = MacroCall::Relational(match name {\r\n                    \"all\" => RelationalFunction::All,\r\n                    \"any\" => RelationalFunction::Any,\r\n                    _ => unreachable!(),\r\n                });\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"lessThan\" | \"greaterThan\" | \"lessThanEqual\" | \"greaterThanEqual\" | \"equal\"\r\n        | \"notEqual\" => {\r\n            for bits in 0..0b1001 {\r\n                let (size, kind) = match bits {\r\n                    0b0000 => (VectorSize::Bi, Sk::Float),\r\n                    0b0001 => (VectorSize::Tri, Sk::Float),\r\n                    0b0010 => (VectorSize::Quad, Sk::Float),\r\n                    0b0011 => (VectorSize::Bi, Sk::Sint),\r\n                    0b0100 => (VectorSize::Tri, Sk::Sint),\r\n                    0b0101 => (VectorSize::Quad, Sk::Sint),\r\n                    0b0110 => (VectorSize::Bi, Sk::Uint),\r\n                    0b0111 => (VectorSize::Tri, Sk::Uint),\r\n                    _ => (VectorSize::Quad, Sk::Uint),\r\n                };\r\n\r\n                let ty = || TypeInner::Vector { size, kind, width };\r\n                let args = vec![ty(), ty()];\r\n\r\n                let fun = MacroCall::Binary(match name {\r\n                    \"lessThan\" => BinaryOperator::Less,\r\n                    \"greaterThan\" => BinaryOperator::Greater,\r\n                    \"lessThanEqual\" => BinaryOperator::LessEqual,\r\n                    \"greaterThanEqual\" => BinaryOperator::GreaterEqual,\r\n                    \"equal\" => BinaryOperator::Equal,\r\n                    \"notEqual\" => BinaryOperator::NotEqual,\r\n                    _ => unreachable!(),\r\n                });\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"min\" | \"max\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - scalar kind\r\n            // bit 2 trough 4 - dims\r\n            for bits in 0..0b11100 {\r\n                let kind = match bits & 0b11 {\r\n                    0b00 => Sk::Float,\r\n                    0b01 => Sk::Sint,\r\n                    0b10 => Sk::Uint,\r\n                    _ => continue,\r\n                };\r\n                let (size, second_size) = match bits >> 2 {\r\n                    0b000 => (None, None),\r\n                    0b001 => (Some(VectorSize::Bi), None),\r\n                    0b010 => (Some(VectorSize::Tri), None),\r\n                    0b011 => (Some(VectorSize::Quad), None),\r\n                    0b100 => (Some(VectorSize::Bi), Some(VectorSize::Bi)),\r\n                    0b101 => (Some(VectorSize::Tri), Some(VectorSize::Tri)),\r\n                    _ => (Some(VectorSize::Quad), Some(VectorSize::Quad)),\r\n                };\r\n\r\n                let args = vec![\r\n                    match size {\r\n                        Some(size) => TypeInner::Vector { size, kind, width },\r\n                        None => TypeInner::Scalar { kind, width },\r\n                    },\r\n                    match second_size {\r\n                        Some(size) => TypeInner::Vector { size, kind, width },\r\n                        None => TypeInner::Scalar { kind, width },\r\n                    },\r\n                ];\r\n\r\n                let fun = match name {\r\n                    \"max\" => MacroCall::Splatted(MathFunction::Max, size, 1),\r\n                    \"min\" => MacroCall::Splatted(MathFunction::Min, size, 1),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"mix\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            // bit 2 trough 4 - types\r\n            //\r\n            // 0b10011 is the last element since splatted single elements\r\n            // were already added\r\n            for bits in 0..0b10011 {\r\n                let size = match bits & 0b11 {\r\n                    0b00 => Some(VectorSize::Bi),\r\n                    0b01 => Some(VectorSize::Tri),\r\n                    0b10 => Some(VectorSize::Quad),\r\n                    _ => None,\r\n                };\r\n                let (kind, splatted, boolean) = match bits >> 2 {\r\n                    0b000 => (Sk::Sint, false, true),\r\n                    0b001 => (Sk::Uint, false, true),\r\n                    0b010 => (Sk::Float, false, true),\r\n                    0b011 => (Sk::Float, false, false),\r\n                    _ => (Sk::Float, true, false),\r\n                };\r\n\r\n                let ty = |kind, width| match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n                let args = vec![\r\n                    ty(kind, width),\r\n                    ty(kind, width),\r\n                    match (boolean, splatted) {\r\n                        (true, _) => ty(Sk::Bool, crate::BOOL_WIDTH),\r\n                        (_, false) => TypeInner::Scalar { kind, width },\r\n                        _ => ty(kind, width),\r\n                    },\r\n                ];\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    args,\r\n                    match boolean {\r\n                        true => MacroCall::MixBoolean,\r\n                        false => MacroCall::Splatted(MathFunction::Mix, size, 2),\r\n                    },\r\n                ))\r\n            }\r\n        }\r\n        \"clamp\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - float/int/uint\r\n            // bit 2 trough 3 - dims\r\n            // bit 4 - splatted\r\n            //\r\n            // 0b11010 is the last element since splatted single elements\r\n            // were already added\r\n            for bits in 0..0b11011 {\r\n                let kind = match bits & 0b11 {\r\n                    0b00 => Sk::Float,\r\n                    0b01 => Sk::Sint,\r\n                    0b10 => Sk::Uint,\r\n                    _ => continue,\r\n                };\r\n                let size = match (bits >> 2) & 0b11 {\r\n                    0b00 => Some(VectorSize::Bi),\r\n                    0b01 => Some(VectorSize::Tri),\r\n                    0b10 => Some(VectorSize::Quad),\r\n                    _ => None,\r\n                };\r\n                let splatted = bits & 0b10000 == 0b10000;\r\n\r\n                let base_ty = || match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n                let limit_ty = || match splatted {\r\n                    true => TypeInner::Scalar { kind, width },\r\n                    false => base_ty(),\r\n                };\r\n\r\n                let args = vec![base_ty(), limit_ty(), limit_ty()];\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::Clamp(size)))\r\n            }\r\n        }\r\n        \"barrier\" => declaration\r\n            .overloads\r\n            .push(module.add_builtin(Vec::new(), MacroCall::Barrier)),\r\n        // Add common builtins with floats\r\n        _ => inject_common_builtin(declaration, module, name, 4),\r\n    }\r\n}\r\n\r\n/// Injects the builtins into declaration that need doubles\r\nfn inject_double_builtin(declaration: &mut FunctionDeclaration, module: &mut Module, name: &str) {\r\n    let width = 8;\r\n    match name {\r\n        \"abs\" | \"sign\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let kind = Sk::Float;\r\n\r\n                let args = vec![match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                }];\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    args,\r\n                    MacroCall::MathFunction(match name {\r\n                        \"abs\" => MathFunction::Abs,\r\n                        \"sign\" => MathFunction::Sign,\r\n                        _ => unreachable!(),\r\n                    }),\r\n                ))\r\n            }\r\n        }\r\n        \"min\" | \"max\" => {\r\n            // bits layout\r\n            // bit 0 trough 2 - dims\r\n            for bits in 0..0b111 {\r\n                let (size, second_size) = match bits {\r\n                    0b000 => (None, None),\r\n                    0b001 => (Some(VectorSize::Bi), None),\r\n                    0b010 => (Some(VectorSize::Tri), None),\r\n                    0b011 => (Some(VectorSize::Quad), None),\r\n                    0b100 => (Some(VectorSize::Bi), Some(VectorSize::Bi)),\r\n                    0b101 => (Some(VectorSize::Tri), Some(VectorSize::Tri)),\r\n                    _ => (Some(VectorSize::Quad), Some(VectorSize::Quad)),\r\n                };\r\n                let kind = Sk::Float;\r\n\r\n                let args = vec![\r\n                    match size {\r\n                        Some(size) => TypeInner::Vector { size, kind, width },\r\n                        None => TypeInner::Scalar { kind, width },\r\n                    },\r\n                    match second_size {\r\n                        Some(size) => TypeInner::Vector { size, kind, width },\r\n                        None => TypeInner::Scalar { kind, width },\r\n                    },\r\n                ];\r\n\r\n                let fun = match name {\r\n                    \"max\" => MacroCall::Splatted(MathFunction::Max, size, 1),\r\n                    \"min\" => MacroCall::Splatted(MathFunction::Min, size, 1),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"mix\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            // bit 2 trough 3 - splatted/boolean\r\n            //\r\n            // 0b1010 is the last element since splatted with single elements\r\n            // is equal to normal single elements\r\n            for bits in 0..0b1011 {\r\n                let size = match bits & 0b11 {\r\n                    0b00 => Some(VectorSize::Quad),\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => None,\r\n                };\r\n                let kind = Sk::Float;\r\n                let (splatted, boolean) = match bits >> 2 {\r\n                    0b00 => (false, false),\r\n                    0b01 => (false, true),\r\n                    _ => (true, false),\r\n                };\r\n\r\n                let ty = |kind, width| match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n                let args = vec![\r\n                    ty(kind, width),\r\n                    ty(kind, width),\r\n                    match (boolean, splatted) {\r\n                        (true, _) => ty(Sk::Bool, crate::BOOL_WIDTH),\r\n                        (_, false) => TypeInner::Scalar { kind, width },\r\n                        _ => ty(kind, width),\r\n                    },\r\n                ];\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    args,\r\n                    match boolean {\r\n                        true => MacroCall::MixBoolean,\r\n                        false => MacroCall::Splatted(MathFunction::Mix, size, 2),\r\n                    },\r\n                ))\r\n            }\r\n        }\r\n        \"clamp\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            // bit 2 - splatted\r\n            //\r\n            // 0b110 is the last element since splatted with single elements\r\n            // is equal to normal single elements\r\n            for bits in 0..0b111 {\r\n                let kind = Sk::Float;\r\n                let size = match bits & 0b11 {\r\n                    0b00 => Some(VectorSize::Bi),\r\n                    0b01 => Some(VectorSize::Tri),\r\n                    0b10 => Some(VectorSize::Quad),\r\n                    _ => None,\r\n                };\r\n                let splatted = bits & 0b100 == 0b100;\r\n\r\n                let base_ty = || match size {\r\n                    Some(size) => TypeInner::Vector { size, kind, width },\r\n                    None => TypeInner::Scalar { kind, width },\r\n                };\r\n                let limit_ty = || match splatted {\r\n                    true => TypeInner::Scalar { kind, width },\r\n                    false => base_ty(),\r\n                };\r\n\r\n                let args = vec![base_ty(), limit_ty(), limit_ty()];\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::Clamp(size)))\r\n            }\r\n        }\r\n        // Add common builtins with doubles\r\n        _ => inject_common_builtin(declaration, module, name, 8),\r\n    }\r\n}\r\n\r\n/// Injects the builtins into declaration that can used either float or doubles\r\nfn inject_common_builtin(\r\n    declaration: &mut FunctionDeclaration,\r\n    module: &mut Module,\r\n    name: &str,\r\n    float_width: crate::Bytes,\r\n) {\r\n    match name {\r\n        \"ceil\" | \"round\" | \"roundEven\" | \"floor\" | \"fract\" | \"trunc\" | \"sqrt\" | \"inversesqrt\"\r\n        | \"normalize\" | \"length\" | \"isinf\" | \"isnan\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n\r\n                let args = vec![match size {\r\n                    Some(size) => TypeInner::Vector {\r\n                        size,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    None => TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                }];\r\n\r\n                let fun = match name {\r\n                    \"ceil\" => MacroCall::MathFunction(MathFunction::Ceil),\r\n                    \"round\" | \"roundEven\" => MacroCall::MathFunction(MathFunction::Round),\r\n                    \"floor\" => MacroCall::MathFunction(MathFunction::Floor),\r\n                    \"fract\" => MacroCall::MathFunction(MathFunction::Fract),\r\n                    \"trunc\" => MacroCall::MathFunction(MathFunction::Trunc),\r\n                    \"sqrt\" => MacroCall::MathFunction(MathFunction::Sqrt),\r\n                    \"inversesqrt\" => MacroCall::MathFunction(MathFunction::InverseSqrt),\r\n                    \"normalize\" => MacroCall::MathFunction(MathFunction::Normalize),\r\n                    \"length\" => MacroCall::MathFunction(MathFunction::Length),\r\n                    \"isinf\" => MacroCall::Relational(RelationalFunction::IsInf),\r\n                    \"isnan\" => MacroCall::Relational(RelationalFunction::IsNan),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"dot\" | \"reflect\" | \"distance\" | \"ldexp\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n                let ty = || match size {\r\n                    Some(size) => TypeInner::Vector {\r\n                        size,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    None => TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                };\r\n\r\n                let fun = match name {\r\n                    \"dot\" => MacroCall::MathFunction(MathFunction::Dot),\r\n                    \"reflect\" => MacroCall::MathFunction(MathFunction::Reflect),\r\n                    \"distance\" => MacroCall::MathFunction(MathFunction::Distance),\r\n                    \"ldexp\" => MacroCall::MathFunction(MathFunction::Ldexp),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(vec![ty(), ty()], fun))\r\n            }\r\n        }\r\n        \"transpose\" => {\r\n            // bits layout\r\n            // bit 0 trough 3 - dims\r\n            for bits in 0..0b1001 {\r\n                let (rows, columns) = match bits {\r\n                    0b0000 => (VectorSize::Bi, VectorSize::Bi),\r\n                    0b0001 => (VectorSize::Bi, VectorSize::Tri),\r\n                    0b0010 => (VectorSize::Bi, VectorSize::Quad),\r\n                    0b0011 => (VectorSize::Tri, VectorSize::Bi),\r\n                    0b0100 => (VectorSize::Tri, VectorSize::Tri),\r\n                    0b0101 => (VectorSize::Tri, VectorSize::Quad),\r\n                    0b0110 => (VectorSize::Quad, VectorSize::Bi),\r\n                    0b0111 => (VectorSize::Quad, VectorSize::Tri),\r\n                    _ => (VectorSize::Quad, VectorSize::Quad),\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    vec![TypeInner::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width: float_width,\r\n                    }],\r\n                    MacroCall::MathFunction(MathFunction::Transpose),\r\n                ))\r\n            }\r\n        }\r\n        \"inverse\" | \"determinant\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b11 {\r\n                let (rows, columns) = match bits {\r\n                    0b00 => (VectorSize::Bi, VectorSize::Bi),\r\n                    0b01 => (VectorSize::Tri, VectorSize::Tri),\r\n                    _ => (VectorSize::Quad, VectorSize::Quad),\r\n                };\r\n\r\n                let args = vec![TypeInner::Matrix {\r\n                    columns,\r\n                    rows,\r\n                    width: float_width,\r\n                }];\r\n\r\n                declaration.overloads.push(module.add_builtin(\r\n                    args,\r\n                    MacroCall::MathFunction(match name {\r\n                        \"inverse\" => MathFunction::Inverse,\r\n                        \"determinant\" => MathFunction::Determinant,\r\n                        _ => unreachable!(),\r\n                    }),\r\n                ))\r\n            }\r\n        }\r\n        \"mod\" | \"step\" => {\r\n            // bits layout\r\n            // bit 0 trough 2 - dims\r\n            for bits in 0..0b111 {\r\n                let (size, second_size) = match bits {\r\n                    0b000 => (None, None),\r\n                    0b001 => (Some(VectorSize::Bi), None),\r\n                    0b010 => (Some(VectorSize::Tri), None),\r\n                    0b011 => (Some(VectorSize::Quad), None),\r\n                    0b100 => (Some(VectorSize::Bi), Some(VectorSize::Bi)),\r\n                    0b101 => (Some(VectorSize::Tri), Some(VectorSize::Tri)),\r\n                    _ => (Some(VectorSize::Quad), Some(VectorSize::Quad)),\r\n                };\r\n\r\n                let mut args = Vec::with_capacity(2);\r\n                let step = name == \"step\";\r\n\r\n                for i in 0..2 {\r\n                    let maybe_size = match i == step as u32 {\r\n                        true => size,\r\n                        false => second_size,\r\n                    };\r\n\r\n                    args.push(match maybe_size {\r\n                        Some(size) => TypeInner::Vector {\r\n                            size,\r\n                            kind: Sk::Float,\r\n                            width: float_width,\r\n                        },\r\n                        None => TypeInner::Scalar {\r\n                            kind: Sk::Float,\r\n                            width: float_width,\r\n                        },\r\n                    })\r\n                }\r\n\r\n                let fun = match name {\r\n                    \"mod\" => MacroCall::Mod(size),\r\n                    \"step\" => MacroCall::Splatted(MathFunction::Step, size, 0),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"modf\" | \"frexp\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n\r\n                let ty = module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: match size {\r\n                            Some(size) => TypeInner::Vector {\r\n                                size,\r\n                                kind: Sk::Float,\r\n                                width: float_width,\r\n                            },\r\n                            None => TypeInner::Scalar {\r\n                                kind: Sk::Float,\r\n                                width: float_width,\r\n                            },\r\n                        },\r\n                    },\r\n                    Span::default(),\r\n                );\r\n\r\n                let parameters = vec![ty, ty];\r\n\r\n                let fun = match name {\r\n                    \"modf\" => MacroCall::MathFunction(MathFunction::Modf),\r\n                    \"frexp\" => MacroCall::MathFunction(MathFunction::Frexp),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration.overloads.push(Overload {\r\n                    parameters,\r\n                    parameters_info: vec![\r\n                        ParameterInfo {\r\n                            qualifier: ParameterQualifier::In,\r\n                            depth: false,\r\n                        },\r\n                        ParameterInfo {\r\n                            qualifier: ParameterQualifier::Out,\r\n                            depth: false,\r\n                        },\r\n                    ],\r\n                    kind: FunctionKind::Macro(fun),\r\n                    defined: false,\r\n                    internal: true,\r\n                    void: false,\r\n                })\r\n            }\r\n        }\r\n        \"cross\" => {\r\n            let args = vec![\r\n                TypeInner::Vector {\r\n                    size: VectorSize::Tri,\r\n                    kind: Sk::Float,\r\n                    width: float_width,\r\n                },\r\n                TypeInner::Vector {\r\n                    size: VectorSize::Tri,\r\n                    kind: Sk::Float,\r\n                    width: float_width,\r\n                },\r\n            ];\r\n\r\n            declaration\r\n                .overloads\r\n                .push(module.add_builtin(args, MacroCall::MathFunction(MathFunction::Cross)))\r\n        }\r\n        \"outerProduct\" => {\r\n            // bits layout\r\n            // bit 0 trough 3 - dims\r\n            for bits in 0..0b1001 {\r\n                let (size1, size2) = match bits {\r\n                    0b0000 => (VectorSize::Bi, VectorSize::Bi),\r\n                    0b0001 => (VectorSize::Bi, VectorSize::Tri),\r\n                    0b0010 => (VectorSize::Bi, VectorSize::Quad),\r\n                    0b0011 => (VectorSize::Tri, VectorSize::Bi),\r\n                    0b0100 => (VectorSize::Tri, VectorSize::Tri),\r\n                    0b0101 => (VectorSize::Tri, VectorSize::Quad),\r\n                    0b0110 => (VectorSize::Quad, VectorSize::Bi),\r\n                    0b0111 => (VectorSize::Quad, VectorSize::Tri),\r\n                    _ => (VectorSize::Quad, VectorSize::Quad),\r\n                };\r\n\r\n                let args = vec![\r\n                    TypeInner::Vector {\r\n                        size: size1,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    TypeInner::Vector {\r\n                        size: size2,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                ];\r\n\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::MathFunction(MathFunction::Outer)))\r\n            }\r\n        }\r\n        \"faceforward\" | \"fma\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n\r\n                let ty = || match size {\r\n                    Some(size) => TypeInner::Vector {\r\n                        size,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    None => TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                };\r\n                let args = vec![ty(), ty(), ty()];\r\n\r\n                let fun = match name {\r\n                    \"faceforward\" => MacroCall::MathFunction(MathFunction::FaceForward),\r\n                    \"fma\" => MacroCall::MathFunction(MathFunction::Fma),\r\n                    _ => unreachable!(),\r\n                };\r\n\r\n                declaration.overloads.push(module.add_builtin(args, fun))\r\n            }\r\n        }\r\n        \"refract\" => {\r\n            // bits layout\r\n            // bit 0 trough 1 - dims\r\n            for bits in 0..0b100 {\r\n                let size = match bits {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n\r\n                let ty = || match size {\r\n                    Some(size) => TypeInner::Vector {\r\n                        size,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    None => TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                };\r\n                let args = vec![\r\n                    ty(),\r\n                    ty(),\r\n                    TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: 4,\r\n                    },\r\n                ];\r\n                declaration\r\n                    .overloads\r\n                    .push(module.add_builtin(args, MacroCall::MathFunction(MathFunction::Refract)))\r\n            }\r\n        }\r\n        \"smoothstep\" => {\r\n            // bit 0 - splatted\r\n            // bit 1 trough 2 - dims\r\n            for bits in 0..0b1000 {\r\n                let splatted = bits & 0b1 == 0b1;\r\n                let size = match bits >> 1 {\r\n                    0b00 => None,\r\n                    0b01 => Some(VectorSize::Bi),\r\n                    0b10 => Some(VectorSize::Tri),\r\n                    _ => Some(VectorSize::Quad),\r\n                };\r\n\r\n                if splatted && size.is_none() {\r\n                    continue;\r\n                }\r\n\r\n                let base_ty = || match size {\r\n                    Some(size) => TypeInner::Vector {\r\n                        size,\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    None => TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                };\r\n                let ty = || match splatted {\r\n                    true => TypeInner::Scalar {\r\n                        kind: Sk::Float,\r\n                        width: float_width,\r\n                    },\r\n                    false => base_ty(),\r\n                };\r\n                declaration.overloads.push(module.add_builtin(\r\n                    vec![ty(), ty(), base_ty()],\r\n                    MacroCall::SmoothStep { splatted: size },\r\n                ))\r\n            }\r\n        }\r\n        // The function isn't a builtin or we don't yet support it\r\n        _ => {}\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, PartialEq, Debug)]\r\npub enum TextureLevelType {\r\n    None,\r\n    Lod,\r\n    Grad,\r\n}\r\n\r\n/// A compiler defined builtin function\r\n#[derive(Clone, Copy, PartialEq, Debug)]\r\npub enum MacroCall {\r\n    Sampler,\r\n    SamplerShadow,\r\n    Texture {\r\n        proj: bool,\r\n        offset: bool,\r\n        shadow: bool,\r\n        level_type: TextureLevelType,\r\n    },\r\n    TextureSize {\r\n        arrayed: bool,\r\n    },\r\n    ImageLoad {\r\n        multi: bool,\r\n    },\r\n    ImageStore,\r\n    MathFunction(MathFunction),\r\n    FindLsbUint,\r\n    FindMsbUint,\r\n    BitfieldExtract,\r\n    BitfieldInsert,\r\n    Relational(RelationalFunction),\r\n    Binary(BinaryOperator),\r\n    Mod(Option<VectorSize>),\r\n    Splatted(MathFunction, Option<VectorSize>, usize),\r\n    MixBoolean,\r\n    Clamp(Option<VectorSize>),\r\n    BitCast(Sk),\r\n    Derivate(DerivativeAxis),\r\n    Barrier,\r\n    /// SmoothStep needs a separate variant because it might need it's inputs\r\n    /// to be splatted depending on the overload\r\n    SmoothStep {\r\n        /// The size of the splat operation if some\r\n        splatted: Option<VectorSize>,\r\n    },\r\n}\r\n\r\nimpl MacroCall {\r\n    /// Adds the necessary expressions and statements to the passed body and\r\n    /// finally returns the final expression with the correct result\r\n    pub fn call(\r\n        &self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        args: &mut [Handle<Expression>],\r\n        meta: Span,\r\n    ) -> Result<Option<Handle<Expression>>> {\r\n        Ok(Some(match *self {\r\n            MacroCall::Sampler => {\r\n                ctx.samplers.insert(args[0], args[1]);\r\n                args[0]\r\n            }\r\n            MacroCall::SamplerShadow => {\r\n                sampled_to_depth(&mut parser.module, ctx, args[0], meta, &mut parser.errors);\r\n                parser.invalidate_expression(ctx, args[0], meta)?;\r\n                ctx.samplers.insert(args[0], args[1]);\r\n                args[0]\r\n            }\r\n            MacroCall::Texture {\r\n                proj,\r\n                offset,\r\n                shadow,\r\n                level_type,\r\n            } => {\r\n                let mut coords = args[1];\r\n\r\n                if proj {\r\n                    let size = match *parser.resolve_type(ctx, coords, meta)? {\r\n                        TypeInner::Vector { size, .. } => size,\r\n                        _ => unreachable!(),\r\n                    };\r\n                    let mut right = ctx.add_expression(\r\n                        Expression::AccessIndex {\r\n                            base: coords,\r\n                            index: size as u32 - 1,\r\n                        },\r\n                        Span::default(),\r\n                        body,\r\n                    );\r\n                    let left = if let VectorSize::Bi = size {\r\n                        ctx.add_expression(\r\n                            Expression::AccessIndex {\r\n                                base: coords,\r\n                                index: 0,\r\n                            },\r\n                            Span::default(),\r\n                            body,\r\n                        )\r\n                    } else {\r\n                        let size = match size {\r\n                            VectorSize::Tri => VectorSize::Bi,\r\n                            _ => VectorSize::Tri,\r\n                        };\r\n                        right = ctx.add_expression(\r\n                            Expression::Splat { size, value: right },\r\n                            Span::default(),\r\n                            body,\r\n                        );\r\n                        ctx.vector_resize(size, coords, Span::default(), body)\r\n                    };\r\n                    coords = ctx.add_expression(\r\n                        Expression::Binary {\r\n                            op: BinaryOperator::Divide,\r\n                            left,\r\n                            right,\r\n                        },\r\n                        Span::default(),\r\n                        body,\r\n                    );\r\n                }\r\n\r\n                let extra = args.get(2).copied();\r\n                let comps =\r\n                    parser.coordinate_components(ctx, args[0], coords, extra, meta, body)?;\r\n\r\n                let mut num_args = 2;\r\n\r\n                if comps.used_extra {\r\n                    num_args += 1;\r\n                };\r\n\r\n                // Parse out explicit texture level.\r\n                let mut level = match level_type {\r\n                    TextureLevelType::None => SampleLevel::Auto,\r\n\r\n                    TextureLevelType::Lod => {\r\n                        num_args += 1;\r\n\r\n                        if shadow {\r\n                            log::warn!(\"Assuming LOD {:?} is zero\", args[2],);\r\n\r\n                            SampleLevel::Zero\r\n                        } else {\r\n                            SampleLevel::Exact(args[2])\r\n                        }\r\n                    }\r\n\r\n                    TextureLevelType::Grad => {\r\n                        num_args += 2;\r\n\r\n                        if shadow {\r\n                            log::warn!(\r\n                                \"Assuming gradients {:?} and {:?} are not greater than 1\",\r\n                                args[2],\r\n                                args[3],\r\n                            );\r\n                            SampleLevel::Zero\r\n                        } else {\r\n                            SampleLevel::Gradient {\r\n                                x: args[2],\r\n                                y: args[3],\r\n                            }\r\n                        }\r\n                    }\r\n                };\r\n\r\n                let texture_offset = match offset {\r\n                    true => {\r\n                        let offset_arg = args[num_args];\r\n                        num_args += 1;\r\n                        match parser.solve_constant(ctx, offset_arg, meta) {\r\n                            Ok(v) => Some(v),\r\n                            Err(e) => {\r\n                                parser.errors.push(e);\r\n                                None\r\n                            }\r\n                        }\r\n                    }\r\n                    false => None,\r\n                };\r\n\r\n                // Now go back and look for optional bias arg (if available)\r\n                if let TextureLevelType::None = level_type {\r\n                    level = args\r\n                        .get(num_args)\r\n                        .copied()\r\n                        .map_or(SampleLevel::Auto, SampleLevel::Bias);\r\n                }\r\n\r\n                texture_call(ctx, args[0], level, comps, texture_offset, body, meta)?\r\n            }\r\n\r\n            MacroCall::TextureSize { arrayed } => {\r\n                let mut expr = ctx.add_expression(\r\n                    Expression::ImageQuery {\r\n                        image: args[0],\r\n                        query: ImageQuery::Size {\r\n                            level: args.get(1).copied(),\r\n                        },\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n\r\n                if arrayed {\r\n                    let mut components = Vec::with_capacity(4);\r\n\r\n                    let size = match *parser.resolve_type(ctx, expr, meta)? {\r\n                        TypeInner::Vector { size: ori_size, .. } => {\r\n                            for index in 0..(ori_size as u32) {\r\n                                components.push(ctx.add_expression(\r\n                                    Expression::AccessIndex { base: expr, index },\r\n                                    Span::default(),\r\n                                    body,\r\n                                ))\r\n                            }\r\n\r\n                            match ori_size {\r\n                                VectorSize::Bi => VectorSize::Tri,\r\n                                _ => VectorSize::Quad,\r\n                            }\r\n                        }\r\n                        _ => {\r\n                            components.push(expr);\r\n                            VectorSize::Bi\r\n                        }\r\n                    };\r\n\r\n                    components.push(ctx.add_expression(\r\n                        Expression::ImageQuery {\r\n                            image: args[0],\r\n                            query: ImageQuery::NumLayers,\r\n                        },\r\n                        Span::default(),\r\n                        body,\r\n                    ));\r\n\r\n                    let ty = parser.module.types.insert(\r\n                        Type {\r\n                            name: None,\r\n                            inner: TypeInner::Vector {\r\n                                size,\r\n                                kind: crate::ScalarKind::Sint,\r\n                                width: 4,\r\n                            },\r\n                        },\r\n                        Span::default(),\r\n                    );\r\n\r\n                    expr = ctx.add_expression(Expression::Compose { components, ty }, meta, body)\r\n                }\r\n\r\n                expr\r\n            }\r\n            MacroCall::ImageLoad { multi } => {\r\n                let comps =\r\n                    parser.coordinate_components(ctx, args[0], args[1], None, meta, body)?;\r\n                let (sample, level) = match (multi, args.get(2)) {\r\n                    (_, None) => (None, None),\r\n                    (true, Some(&arg)) => (Some(arg), None),\r\n                    (false, Some(&arg)) => (None, Some(arg)),\r\n                };\r\n                ctx.add_expression(\r\n                    Expression::ImageLoad {\r\n                        image: args[0],\r\n                        coordinate: comps.coordinate,\r\n                        array_index: comps.array_index,\r\n                        sample,\r\n                        level,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::ImageStore => {\r\n                let comps =\r\n                    parser.coordinate_components(ctx, args[0], args[1], None, meta, body)?;\r\n                ctx.emit_restart(body);\r\n                body.push(\r\n                    crate::Statement::ImageStore {\r\n                        image: args[0],\r\n                        coordinate: comps.coordinate,\r\n                        array_index: comps.array_index,\r\n                        value: args[2],\r\n                    },\r\n                    meta,\r\n                );\r\n                return Ok(None);\r\n            }\r\n            MacroCall::MathFunction(fun) => ctx.add_expression(\r\n                Expression::Math {\r\n                    fun,\r\n                    arg: args[0],\r\n                    arg1: args.get(1).copied(),\r\n                    arg2: args.get(2).copied(),\r\n                    arg3: args.get(3).copied(),\r\n                },\r\n                Span::default(),\r\n                body,\r\n            ),\r\n            mc @ (MacroCall::FindLsbUint | MacroCall::FindMsbUint) => {\r\n                let fun = match mc {\r\n                    MacroCall::FindLsbUint => MathFunction::FindLsb,\r\n                    MacroCall::FindMsbUint => MathFunction::FindMsb,\r\n                    _ => unreachable!(),\r\n                };\r\n                let res = ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun,\r\n                        arg: args[0],\r\n                        arg1: None,\r\n                        arg2: None,\r\n                        arg3: None,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                ctx.add_expression(\r\n                    Expression::As {\r\n                        expr: res,\r\n                        kind: Sk::Sint,\r\n                        convert: Some(4),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::BitfieldInsert => {\r\n                let conv_arg_2 = ctx.add_expression(\r\n                    Expression::As {\r\n                        expr: args[2],\r\n                        kind: Sk::Uint,\r\n                        convert: Some(4),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                let conv_arg_3 = ctx.add_expression(\r\n                    Expression::As {\r\n                        expr: args[3],\r\n                        kind: Sk::Uint,\r\n                        convert: Some(4),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun: MathFunction::InsertBits,\r\n                        arg: args[0],\r\n                        arg1: Some(args[1]),\r\n                        arg2: Some(conv_arg_2),\r\n                        arg3: Some(conv_arg_3),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::BitfieldExtract => {\r\n                let conv_arg_1 = ctx.add_expression(\r\n                    Expression::As {\r\n                        expr: args[1],\r\n                        kind: Sk::Uint,\r\n                        convert: Some(4),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                let conv_arg_2 = ctx.add_expression(\r\n                    Expression::As {\r\n                        expr: args[2],\r\n                        kind: Sk::Uint,\r\n                        convert: Some(4),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun: MathFunction::ExtractBits,\r\n                        arg: args[0],\r\n                        arg1: Some(conv_arg_1),\r\n                        arg2: Some(conv_arg_2),\r\n                        arg3: None,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::Relational(fun) => ctx.add_expression(\r\n                Expression::Relational {\r\n                    fun,\r\n                    argument: args[0],\r\n                },\r\n                Span::default(),\r\n                body,\r\n            ),\r\n            MacroCall::Binary(op) => ctx.add_expression(\r\n                Expression::Binary {\r\n                    op,\r\n                    left: args[0],\r\n                    right: args[1],\r\n                },\r\n                Span::default(),\r\n                body,\r\n            ),\r\n            MacroCall::Mod(size) => {\r\n                ctx.implicit_splat(parser, &mut args[1], meta, size)?;\r\n\r\n                // x - y * floor(x / y)\r\n\r\n                let div = ctx.add_expression(\r\n                    Expression::Binary {\r\n                        op: BinaryOperator::Divide,\r\n                        left: args[0],\r\n                        right: args[1],\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                let floor = ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun: MathFunction::Floor,\r\n                        arg: div,\r\n                        arg1: None,\r\n                        arg2: None,\r\n                        arg3: None,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                let mult = ctx.add_expression(\r\n                    Expression::Binary {\r\n                        op: BinaryOperator::Multiply,\r\n                        left: floor,\r\n                        right: args[1],\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                );\r\n                ctx.add_expression(\r\n                    Expression::Binary {\r\n                        op: BinaryOperator::Subtract,\r\n                        left: args[0],\r\n                        right: mult,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::Splatted(fun, size, i) => {\r\n                ctx.implicit_splat(parser, &mut args[i], meta, size)?;\r\n\r\n                ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun,\r\n                        arg: args[0],\r\n                        arg1: args.get(1).copied(),\r\n                        arg2: args.get(2).copied(),\r\n                        arg3: args.get(3).copied(),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::MixBoolean => ctx.add_expression(\r\n                Expression::Select {\r\n                    condition: args[2],\r\n                    accept: args[1],\r\n                    reject: args[0],\r\n                },\r\n                Span::default(),\r\n                body,\r\n            ),\r\n            MacroCall::Clamp(size) => {\r\n                ctx.implicit_splat(parser, &mut args[1], meta, size)?;\r\n                ctx.implicit_splat(parser, &mut args[2], meta, size)?;\r\n\r\n                ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun: MathFunction::Clamp,\r\n                        arg: args[0],\r\n                        arg1: args.get(1).copied(),\r\n                        arg2: args.get(2).copied(),\r\n                        arg3: args.get(3).copied(),\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n            MacroCall::BitCast(kind) => ctx.add_expression(\r\n                Expression::As {\r\n                    expr: args[0],\r\n                    kind,\r\n                    convert: None,\r\n                },\r\n                Span::default(),\r\n                body,\r\n            ),\r\n            MacroCall::Derivate(axis) => ctx.add_expression(\r\n                Expression::Derivative {\r\n                    axis,\r\n                    expr: args[0],\r\n                },\r\n                Span::default(),\r\n                body,\r\n            ),\r\n            MacroCall::Barrier => {\r\n                ctx.emit_restart(body);\r\n                body.push(crate::Statement::Barrier(crate::Barrier::all()), meta);\r\n                return Ok(None);\r\n            }\r\n            MacroCall::SmoothStep { splatted } => {\r\n                ctx.implicit_splat(parser, &mut args[0], meta, splatted)?;\r\n                ctx.implicit_splat(parser, &mut args[1], meta, splatted)?;\r\n\r\n                ctx.add_expression(\r\n                    Expression::Math {\r\n                        fun: MathFunction::SmoothStep,\r\n                        arg: args[0],\r\n                        arg1: args.get(1).copied(),\r\n                        arg2: args.get(2).copied(),\r\n                        arg3: None,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                )\r\n            }\r\n        }))\r\n    }\r\n}\r\n\r\nfn texture_call(\r\n    ctx: &mut Context,\r\n    image: Handle<Expression>,\r\n    level: SampleLevel,\r\n    comps: CoordComponents,\r\n    offset: Option<Handle<Constant>>,\r\n    body: &mut Block,\r\n    meta: Span,\r\n) -> Result<Handle<Expression>> {\r\n    if let Some(sampler) = ctx.samplers.get(&image).copied() {\r\n        let mut array_index = comps.array_index;\r\n\r\n        if let Some(ref mut array_index_expr) = array_index {\r\n            ctx.conversion(array_index_expr, meta, Sk::Sint, 4)?;\r\n        }\r\n\r\n        Ok(ctx.add_expression(\r\n            Expression::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather: None, //TODO\r\n                coordinate: comps.coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref: comps.depth_ref,\r\n            },\r\n            meta,\r\n            body,\r\n        ))\r\n    } else {\r\n        Err(Error {\r\n            kind: ErrorKind::SemanticError(\"Bad call\".into()),\r\n            meta,\r\n        })\r\n    }\r\n}\r\n\r\n/// Helper struct for texture calls with the separate components from the vector argument\r\n///\r\n/// Obtained by calling [`coordinate_components`](Parser::coordinate_components)\r\n#[derive(Debug)]\r\nstruct CoordComponents {\r\n    coordinate: Handle<Expression>,\r\n    depth_ref: Option<Handle<Expression>>,\r\n    array_index: Option<Handle<Expression>>,\r\n    used_extra: bool,\r\n}\r\n\r\nimpl Parser {\r\n    /// Helper function for texture calls, splits the vector argument into it's components\r\n    fn coordinate_components(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        image: Handle<Expression>,\r\n        coord: Handle<Expression>,\r\n        extra: Option<Handle<Expression>>,\r\n        meta: Span,\r\n        body: &mut Block,\r\n    ) -> Result<CoordComponents> {\r\n        if let TypeInner::Image {\r\n            dim,\r\n            arrayed,\r\n            class,\r\n        } = *self.resolve_type(ctx, image, meta)?\r\n        {\r\n            let image_size = match dim {\r\n                Dim::D1 => None,\r\n                Dim::D2 => Some(VectorSize::Bi),\r\n                Dim::D3 => Some(VectorSize::Tri),\r\n                Dim::Cube => Some(VectorSize::Tri),\r\n            };\r\n            let coord_size = match *self.resolve_type(ctx, coord, meta)? {\r\n                TypeInner::Vector { size, .. } => Some(size),\r\n                _ => None,\r\n            };\r\n            let (shadow, storage) = match class {\r\n                ImageClass::Depth { .. } => (true, false),\r\n                ImageClass::Storage { .. } => (false, true),\r\n                _ => (false, false),\r\n            };\r\n\r\n            let coordinate = match (image_size, coord_size) {\r\n                (Some(size), Some(coord_s)) if size != coord_s => {\r\n                    ctx.vector_resize(size, coord, Span::default(), body)\r\n                }\r\n                (None, Some(_)) => ctx.add_expression(\r\n                    Expression::AccessIndex {\r\n                        base: coord,\r\n                        index: 0,\r\n                    },\r\n                    Span::default(),\r\n                    body,\r\n                ),\r\n                _ => coord,\r\n            };\r\n\r\n            let mut coord_index = image_size.map_or(1, |s| s as u32);\r\n\r\n            let array_index = if arrayed && !(storage && dim == Dim::Cube) {\r\n                let index = coord_index;\r\n                coord_index += 1;\r\n\r\n                Some(ctx.add_expression(\r\n                    Expression::AccessIndex { base: coord, index },\r\n                    Span::default(),\r\n                    body,\r\n                ))\r\n            } else {\r\n                None\r\n            };\r\n            let mut used_extra = false;\r\n            let depth_ref = match shadow {\r\n                true => {\r\n                    let index = coord_index;\r\n\r\n                    if index == 4 {\r\n                        used_extra = true;\r\n                        extra\r\n                    } else {\r\n                        Some(ctx.add_expression(\r\n                            Expression::AccessIndex { base: coord, index },\r\n                            Span::default(),\r\n                            body,\r\n                        ))\r\n                    }\r\n                }\r\n                false => None,\r\n            };\r\n\r\n            Ok(CoordComponents {\r\n                coordinate,\r\n                depth_ref,\r\n                array_index,\r\n                used_extra,\r\n            })\r\n        } else {\r\n            self.errors.push(Error {\r\n                kind: ErrorKind::SemanticError(\"Type is not an image\".into()),\r\n                meta,\r\n            });\r\n\r\n            Ok(CoordComponents {\r\n                coordinate: coord,\r\n                depth_ref: None,\r\n                array_index: None,\r\n                used_extra: false,\r\n            })\r\n        }\r\n    }\r\n}\r\n\r\n/// Helper function to cast a expression holding a sampled image to a\r\n/// depth image.\r\npub fn sampled_to_depth(\r\n    module: &mut Module,\r\n    ctx: &mut Context,\r\n    image: Handle<Expression>,\r\n    meta: Span,\r\n    errors: &mut Vec<Error>,\r\n) {\r\n    // Get the a mutable type handle of the underlying image storage\r\n    let ty = match ctx[image] {\r\n        Expression::GlobalVariable(handle) => &mut module.global_variables.get_mut(handle).ty,\r\n        Expression::FunctionArgument(i) => {\r\n            // Mark the function argument as carrying a depth texture\r\n            ctx.parameters_info[i as usize].depth = true;\r\n            // NOTE: We need to later also change the parameter type\r\n            &mut ctx.arguments[i as usize].ty\r\n        }\r\n        _ => {\r\n            // Only globals and function arguments are allowed to carry an image\r\n            return errors.push(Error {\r\n                kind: ErrorKind::SemanticError(\"Not a valid texture expression\".into()),\r\n                meta,\r\n            });\r\n        }\r\n    };\r\n\r\n    match module.types[*ty].inner {\r\n        // Update the image class to depth in case it already isn't\r\n        TypeInner::Image {\r\n            class,\r\n            dim,\r\n            arrayed,\r\n        } => match class {\r\n            ImageClass::Sampled { multi, .. } => {\r\n                *ty = module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: TypeInner::Image {\r\n                            dim,\r\n                            arrayed,\r\n                            class: ImageClass::Depth { multi },\r\n                        },\r\n                    },\r\n                    Span::default(),\r\n                )\r\n            }\r\n            ImageClass::Depth { .. } => {}\r\n            // Other image classes aren't allowed to be transformed to depth\r\n            _ => errors.push(Error {\r\n                kind: ErrorKind::SemanticError(\"Not a texture\".into()),\r\n                meta,\r\n            }),\r\n        },\r\n        _ => errors.push(Error {\r\n            kind: ErrorKind::SemanticError(\"Not a texture\".into()),\r\n            meta,\r\n        }),\r\n    };\r\n\r\n    // Copy the handle to allow borrowing the `ctx` again\r\n    let ty = *ty;\r\n\r\n    // If the image was passed trough a function argument we also need to change\r\n    // the corresponding parameter\r\n    if let Expression::FunctionArgument(i) = ctx[image] {\r\n        ctx.parameters[i as usize] = ty;\r\n    }\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Influences the operation `texture_args_generator`\r\n    struct TextureArgsOptions: u32 {\r\n        /// Generates multisampled variants of images\r\n        const MULTI = 1 << 0;\r\n        /// Generates shadow variants of images\r\n        const SHADOW = 1 << 1;\r\n        /// Generates standard images\r\n        const STANDARD = 1 << 2;\r\n        /// Generates cube arrayed images\r\n        const CUBE_ARRAY = 1 << 3;\r\n        /// Generates cube arrayed images\r\n        const D2_MULTI_ARRAY = 1 << 4;\r\n    }\r\n}\r\n\r\nimpl From<BuiltinVariations> for TextureArgsOptions {\r\n    fn from(variations: BuiltinVariations) -> Self {\r\n        let mut options = TextureArgsOptions::empty();\r\n        if variations.contains(BuiltinVariations::STANDARD) {\r\n            options |= TextureArgsOptions::STANDARD\r\n        }\r\n        if variations.contains(BuiltinVariations::CUBE_TEXTURES_ARRAY) {\r\n            options |= TextureArgsOptions::CUBE_ARRAY\r\n        }\r\n        if variations.contains(BuiltinVariations::D2_MULTI_TEXTURES_ARRAY) {\r\n            options |= TextureArgsOptions::D2_MULTI_ARRAY\r\n        }\r\n        options\r\n    }\r\n}\r\n\r\n/// Helper function to generate the image components for texture/image builtins\r\n///\r\n/// Calls the passed function `f` with:\r\n/// ```text\r\n/// f(ScalarKind, ImageDimension, arrayed, multi, shadow)\r\n/// ```\r\n///\r\n/// `options` controls extra image variants generation like multisampling and depth,\r\n/// see the struct documentation\r\nfn texture_args_generator(\r\n    options: TextureArgsOptions,\r\n    mut f: impl FnMut(crate::ScalarKind, Dim, bool, bool, bool),\r\n) {\r\n    for kind in [Sk::Float, Sk::Uint, Sk::Sint].iter().copied() {\r\n        for dim in [Dim::D1, Dim::D2, Dim::D3, Dim::Cube].iter().copied() {\r\n            for arrayed in [false, true].iter().copied() {\r\n                if dim == Dim::Cube && arrayed {\r\n                    if !options.contains(TextureArgsOptions::CUBE_ARRAY) {\r\n                        continue;\r\n                    }\r\n                } else if Dim::D2 == dim\r\n                    && options.contains(TextureArgsOptions::MULTI)\r\n                    && arrayed\r\n                    && options.contains(TextureArgsOptions::D2_MULTI_ARRAY)\r\n                {\r\n                    // multisampling for sampler2DMSArray\r\n                    f(kind, dim, arrayed, true, false);\r\n                } else if !options.contains(TextureArgsOptions::STANDARD) {\r\n                    continue;\r\n                }\r\n\r\n                f(kind, dim, arrayed, false, false);\r\n\r\n                // 3D images can't be neither arrayed nor shadow\r\n                // so we break out early, this way arrayed will always\r\n                // be false and we won't hit the shadow branch\r\n                if let Dim::D3 = dim {\r\n                    break;\r\n                }\r\n\r\n                if Dim::D2 == dim && options.contains(TextureArgsOptions::MULTI) && !arrayed {\r\n                    // multisampling\r\n                    f(kind, dim, arrayed, true, false);\r\n                }\r\n\r\n                if Sk::Float == kind && options.contains(TextureArgsOptions::SHADOW) {\r\n                    // shadow\r\n                    f(kind, dim, arrayed, false, true);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/// Helper functions used to convert from a image dimension into a integer representing the\r\n/// number of components needed for the coordinates vector (1 means scalar instead of vector)\r\nconst fn image_dims_to_coords_size(dim: Dim) -> usize {\r\n    match dim {\r\n        Dim::D1 => 1,\r\n        Dim::D2 => 2,\r\n        _ => 3,\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/constants.rs",
    "content": "use crate::{\r\n    arena::{Arena, Handle, UniqueArena},\r\n    BinaryOperator, Constant, ConstantInner, Expression, ScalarKind, ScalarValue, Type, TypeInner,\r\n    UnaryOperator,\r\n};\r\n\r\n#[derive(Debug)]\r\npub struct ConstantSolver<'a> {\r\n    pub types: &'a mut UniqueArena<Type>,\r\n    pub expressions: &'a Arena<Expression>,\r\n    pub constants: &'a mut Arena<Constant>,\r\n}\r\n\r\n#[derive(Clone, Debug, PartialEq, thiserror::Error)]\r\npub enum ConstantSolvingError {\r\n    #[error(\"Constants cannot access function arguments\")]\r\n    FunctionArg,\r\n    #[error(\"Constants cannot access global variables\")]\r\n    GlobalVariable,\r\n    #[error(\"Constants cannot access local variables\")]\r\n    LocalVariable,\r\n    #[error(\"Cannot get the array length of a non array type\")]\r\n    InvalidArrayLengthArg,\r\n    #[error(\"Constants cannot get the array length of a dynamically sized array\")]\r\n    ArrayLengthDynamic,\r\n    #[error(\"Constants cannot call functions\")]\r\n    Call,\r\n    #[error(\"Constants don't support atomic functions\")]\r\n    Atomic,\r\n    #[error(\"Constants don't support relational functions\")]\r\n    Relational,\r\n    #[error(\"Constants don't support derivative functions\")]\r\n    Derivative,\r\n    #[error(\"Constants don't support select expressions\")]\r\n    Select,\r\n    #[error(\"Constants don't support load expressions\")]\r\n    Load,\r\n    #[error(\"Constants don't support image expressions\")]\r\n    ImageExpression,\r\n    #[error(\"Cannot access the type\")]\r\n    InvalidAccessBase,\r\n    #[error(\"Cannot access at the index\")]\r\n    InvalidAccessIndex,\r\n    #[error(\"Cannot access with index of type\")]\r\n    InvalidAccessIndexTy,\r\n    #[error(\"Constants don't support bitcasts\")]\r\n    Bitcast,\r\n    #[error(\"Cannot cast type\")]\r\n    InvalidCastArg,\r\n    #[error(\"Cannot apply the unary op to the argument\")]\r\n    InvalidUnaryOpArg,\r\n    #[error(\"Cannot apply the binary op to the arguments\")]\r\n    InvalidBinaryOpArgs,\r\n    #[error(\"Cannot apply math function to type\")]\r\n    InvalidMathArg,\r\n    #[error(\"Splat is defined only on scalar values\")]\r\n    SplatScalarOnly,\r\n    #[error(\"Can only swizzle vector constants\")]\r\n    SwizzleVectorOnly,\r\n    #[error(\"Not implemented as constant expression: {0}\")]\r\n    NotImplemented(String),\r\n}\r\n\r\nimpl<'a> ConstantSolver<'a> {\r\n    pub fn solve(\r\n        &mut self,\r\n        expr: Handle<Expression>,\r\n    ) -> Result<Handle<Constant>, ConstantSolvingError> {\r\n        let span = self.expressions.get_span(expr);\r\n        match self.expressions[expr] {\r\n            Expression::Constant(constant) => Ok(constant),\r\n            Expression::AccessIndex { base, index } => self.access(base, index as usize),\r\n            Expression::Access { base, index } => {\r\n                let index = self.solve(index)?;\r\n\r\n                self.access(base, self.constant_index(index)?)\r\n            }\r\n            Expression::Splat {\r\n                size,\r\n                value: splat_value,\r\n            } => {\r\n                let value_constant = self.solve(splat_value)?;\r\n                let ty = match self.constants[value_constant].inner {\r\n                    ConstantInner::Scalar { ref value, width } => {\r\n                        let kind = value.scalar_kind();\r\n                        self.types.insert(\r\n                            Type {\r\n                                name: None,\r\n                                inner: TypeInner::Vector { size, kind, width },\r\n                            },\r\n                            span,\r\n                        )\r\n                    }\r\n                    ConstantInner::Composite { .. } => {\r\n                        return Err(ConstantSolvingError::SplatScalarOnly);\r\n                    }\r\n                };\r\n\r\n                let inner = ConstantInner::Composite {\r\n                    ty,\r\n                    components: vec![value_constant; size as usize],\r\n                };\r\n                Ok(self.register_constant(inner, span))\r\n            }\r\n            Expression::Swizzle {\r\n                size,\r\n                vector: src_vector,\r\n                pattern,\r\n            } => {\r\n                let src_constant = self.solve(src_vector)?;\r\n                let (ty, src_components) = match self.constants[src_constant].inner {\r\n                    ConstantInner::Scalar { .. } => {\r\n                        return Err(ConstantSolvingError::SwizzleVectorOnly);\r\n                    }\r\n                    ConstantInner::Composite {\r\n                        ty,\r\n                        components: ref src_components,\r\n                    } => match self.types[ty].inner {\r\n                        crate::TypeInner::Vector {\r\n                            size: _,\r\n                            kind,\r\n                            width,\r\n                        } => {\r\n                            let dst_ty = self.types.insert(\r\n                                Type {\r\n                                    name: None,\r\n                                    inner: crate::TypeInner::Vector { size, kind, width },\r\n                                },\r\n                                span,\r\n                            );\r\n                            (dst_ty, &src_components[..])\r\n                        }\r\n                        _ => {\r\n                            return Err(ConstantSolvingError::SwizzleVectorOnly);\r\n                        }\r\n                    },\r\n                };\r\n\r\n                let components = pattern\r\n                    .iter()\r\n                    .map(|&sc| src_components[sc as usize])\r\n                    .collect();\r\n                let inner = ConstantInner::Composite { ty, components };\r\n\r\n                Ok(self.register_constant(inner, span))\r\n            }\r\n            Expression::Compose { ty, ref components } => {\r\n                let components = components\r\n                    .iter()\r\n                    .map(|c| self.solve(*c))\r\n                    .collect::<Result<_, _>>()?;\r\n                let inner = ConstantInner::Composite { ty, components };\r\n\r\n                Ok(self.register_constant(inner, span))\r\n            }\r\n            Expression::Unary { expr, op } => {\r\n                let expr_constant = self.solve(expr)?;\r\n\r\n                self.unary_op(op, expr_constant, span)\r\n            }\r\n            Expression::Binary { left, right, op } => {\r\n                let left_constant = self.solve(left)?;\r\n                let right_constant = self.solve(right)?;\r\n\r\n                self.binary_op(op, left_constant, right_constant, span)\r\n            }\r\n            Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                ..\r\n            } => {\r\n                let arg = self.solve(arg)?;\r\n                let arg1 = arg1.map(|arg| self.solve(arg)).transpose()?;\r\n                let arg2 = arg2.map(|arg| self.solve(arg)).transpose()?;\r\n\r\n                let const0 = &self.constants[arg].inner;\r\n                let const1 = arg1.map(|arg| &self.constants[arg].inner);\r\n                let const2 = arg2.map(|arg| &self.constants[arg].inner);\r\n\r\n                match fun {\r\n                    crate::MathFunction::Pow => {\r\n                        let (value, width) = match (const0, const1.unwrap()) {\r\n                            (\r\n                                &ConstantInner::Scalar {\r\n                                    width,\r\n                                    value: value0,\r\n                                },\r\n                                &ConstantInner::Scalar { value: value1, .. },\r\n                            ) => (\r\n                                match (value0, value1) {\r\n                                    (ScalarValue::Sint(a), ScalarValue::Sint(b)) => {\r\n                                        ScalarValue::Sint(a.pow(b as u32))\r\n                                    }\r\n                                    (ScalarValue::Uint(a), ScalarValue::Uint(b)) => {\r\n                                        ScalarValue::Uint(a.pow(b as u32))\r\n                                    }\r\n                                    (ScalarValue::Float(a), ScalarValue::Float(b)) => {\r\n                                        ScalarValue::Float(a.powf(b))\r\n                                    }\r\n                                    _ => return Err(ConstantSolvingError::InvalidMathArg),\r\n                                },\r\n                                width,\r\n                            ),\r\n                            _ => return Err(ConstantSolvingError::InvalidMathArg),\r\n                        };\r\n\r\n                        let inner = ConstantInner::Scalar { width, value };\r\n                        Ok(self.register_constant(inner, span))\r\n                    }\r\n                    crate::MathFunction::Clamp => {\r\n                        let (value, width) = match (const0, const1.unwrap(), const2.unwrap()) {\r\n                            (\r\n                                &ConstantInner::Scalar {\r\n                                    width,\r\n                                    value: value0,\r\n                                },\r\n                                &ConstantInner::Scalar { value: value1, .. },\r\n                                &ConstantInner::Scalar { value: value2, .. },\r\n                            ) => (\r\n                                match (value0, value1, value2) {\r\n                                    (\r\n                                        ScalarValue::Sint(a),\r\n                                        ScalarValue::Sint(b),\r\n                                        ScalarValue::Sint(c),\r\n                                    ) => ScalarValue::Sint(a.max(b).min(c)),\r\n                                    (\r\n                                        ScalarValue::Uint(a),\r\n                                        ScalarValue::Uint(b),\r\n                                        ScalarValue::Uint(c),\r\n                                    ) => ScalarValue::Uint(a.max(b).min(c)),\r\n                                    (\r\n                                        ScalarValue::Float(a),\r\n                                        ScalarValue::Float(b),\r\n                                        ScalarValue::Float(c),\r\n                                    ) => ScalarValue::Float(glsl_float_clamp(a, b, c)),\r\n                                    _ => return Err(ConstantSolvingError::InvalidMathArg),\r\n                                },\r\n                                width,\r\n                            ),\r\n                            _ => {\r\n                                return Err(ConstantSolvingError::NotImplemented(format!(\r\n                                    \"{:?} applied to vector values\",\r\n                                    fun\r\n                                )))\r\n                            }\r\n                        };\r\n\r\n                        let inner = ConstantInner::Scalar { width, value };\r\n                        Ok(self.register_constant(inner, span))\r\n                    }\r\n                    _ => Err(ConstantSolvingError::NotImplemented(format!(\"{:?}\", fun))),\r\n                }\r\n            }\r\n            Expression::As {\r\n                convert,\r\n                expr,\r\n                kind,\r\n            } => {\r\n                let expr_constant = self.solve(expr)?;\r\n\r\n                match convert {\r\n                    Some(width) => self.cast(expr_constant, kind, width, span),\r\n                    None => Err(ConstantSolvingError::Bitcast),\r\n                }\r\n            }\r\n            Expression::ArrayLength(expr) => {\r\n                let array = self.solve(expr)?;\r\n\r\n                match self.constants[array].inner {\r\n                    ConstantInner::Scalar { .. } => {\r\n                        Err(ConstantSolvingError::InvalidArrayLengthArg)\r\n                    }\r\n                    ConstantInner::Composite { ty, .. } => match self.types[ty].inner {\r\n                        TypeInner::Array { size, .. } => match size {\r\n                            crate::ArraySize::Constant(constant) => Ok(constant),\r\n                            crate::ArraySize::Dynamic => {\r\n                                Err(ConstantSolvingError::ArrayLengthDynamic)\r\n                            }\r\n                        },\r\n                        _ => Err(ConstantSolvingError::InvalidArrayLengthArg),\r\n                    },\r\n                }\r\n            }\r\n\r\n            Expression::Load { .. } => Err(ConstantSolvingError::Load),\r\n            Expression::Select { .. } => Err(ConstantSolvingError::Select),\r\n            Expression::LocalVariable(_) => Err(ConstantSolvingError::LocalVariable),\r\n            Expression::Derivative { .. } => Err(ConstantSolvingError::Derivative),\r\n            Expression::Relational { .. } => Err(ConstantSolvingError::Relational),\r\n            Expression::CallResult { .. } => Err(ConstantSolvingError::Call),\r\n            Expression::AtomicResult { .. } => Err(ConstantSolvingError::Atomic),\r\n            Expression::FunctionArgument(_) => Err(ConstantSolvingError::FunctionArg),\r\n            Expression::GlobalVariable(_) => Err(ConstantSolvingError::GlobalVariable),\r\n            Expression::ImageSample { .. }\r\n            | Expression::ImageLoad { .. }\r\n            | Expression::ImageQuery { .. } => Err(ConstantSolvingError::ImageExpression),\r\n        }\r\n    }\r\n\r\n    fn access(\r\n        &mut self,\r\n        base: Handle<Expression>,\r\n        index: usize,\r\n    ) -> Result<Handle<Constant>, ConstantSolvingError> {\r\n        let base = self.solve(base)?;\r\n\r\n        match self.constants[base].inner {\r\n            ConstantInner::Scalar { .. } => Err(ConstantSolvingError::InvalidAccessBase),\r\n            ConstantInner::Composite { ty, ref components } => {\r\n                match self.types[ty].inner {\r\n                    TypeInner::Vector { .. }\r\n                    | TypeInner::Matrix { .. }\r\n                    | TypeInner::Array { .. }\r\n                    | TypeInner::Struct { .. } => (),\r\n                    _ => return Err(ConstantSolvingError::InvalidAccessBase),\r\n                }\r\n\r\n                components\r\n                    .get(index)\r\n                    .copied()\r\n                    .ok_or(ConstantSolvingError::InvalidAccessIndex)\r\n            }\r\n        }\r\n    }\r\n\r\n    fn constant_index(&self, constant: Handle<Constant>) -> Result<usize, ConstantSolvingError> {\r\n        match self.constants[constant].inner {\r\n            ConstantInner::Scalar {\r\n                value: ScalarValue::Uint(index),\r\n                ..\r\n            } => Ok(index as usize),\r\n            _ => Err(ConstantSolvingError::InvalidAccessIndexTy),\r\n        }\r\n    }\r\n\r\n    fn cast(\r\n        &mut self,\r\n        constant: Handle<Constant>,\r\n        kind: ScalarKind,\r\n        target_width: crate::Bytes,\r\n        span: crate::Span,\r\n    ) -> Result<Handle<Constant>, ConstantSolvingError> {\r\n        let mut inner = self.constants[constant].inner.clone();\r\n\r\n        match inner {\r\n            ConstantInner::Scalar {\r\n                ref mut value,\r\n                ref mut width,\r\n            } => {\r\n                *width = target_width;\r\n                *value = match kind {\r\n                    ScalarKind::Sint => ScalarValue::Sint(match *value {\r\n                        ScalarValue::Sint(v) => v,\r\n                        ScalarValue::Uint(v) => v as i64,\r\n                        ScalarValue::Float(v) => v as i64,\r\n                        ScalarValue::Bool(v) => v as i64,\r\n                    }),\r\n                    ScalarKind::Uint => ScalarValue::Uint(match *value {\r\n                        ScalarValue::Sint(v) => v as u64,\r\n                        ScalarValue::Uint(v) => v,\r\n                        ScalarValue::Float(v) => v as u64,\r\n                        ScalarValue::Bool(v) => v as u64,\r\n                    }),\r\n                    ScalarKind::Float => ScalarValue::Float(match *value {\r\n                        ScalarValue::Sint(v) => v as f64,\r\n                        ScalarValue::Uint(v) => v as f64,\r\n                        ScalarValue::Float(v) => v,\r\n                        ScalarValue::Bool(v) => v as u64 as f64,\r\n                    }),\r\n                    ScalarKind::Bool => ScalarValue::Bool(match *value {\r\n                        ScalarValue::Sint(v) => v != 0,\r\n                        ScalarValue::Uint(v) => v != 0,\r\n                        ScalarValue::Float(v) => v != 0.0,\r\n                        ScalarValue::Bool(v) => v,\r\n                    }),\r\n                }\r\n            }\r\n            ConstantInner::Composite {\r\n                ty,\r\n                ref mut components,\r\n            } => {\r\n                match self.types[ty].inner {\r\n                    TypeInner::Vector { .. } | TypeInner::Matrix { .. } => (),\r\n                    _ => return Err(ConstantSolvingError::InvalidCastArg),\r\n                }\r\n\r\n                for component in components {\r\n                    *component = self.cast(*component, kind, target_width, span)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(self.register_constant(inner, span))\r\n    }\r\n\r\n    fn unary_op(\r\n        &mut self,\r\n        op: UnaryOperator,\r\n        constant: Handle<Constant>,\r\n        span: crate::Span,\r\n    ) -> Result<Handle<Constant>, ConstantSolvingError> {\r\n        let mut inner = self.constants[constant].inner.clone();\r\n\r\n        match inner {\r\n            ConstantInner::Scalar { ref mut value, .. } => match op {\r\n                UnaryOperator::Negate => match *value {\r\n                    ScalarValue::Sint(ref mut v) => *v = -*v,\r\n                    ScalarValue::Float(ref mut v) => *v = -*v,\r\n                    _ => return Err(ConstantSolvingError::InvalidUnaryOpArg),\r\n                },\r\n                UnaryOperator::Not => match *value {\r\n                    ScalarValue::Sint(ref mut v) => *v = !*v,\r\n                    ScalarValue::Uint(ref mut v) => *v = !*v,\r\n                    ScalarValue::Bool(ref mut v) => *v = !*v,\r\n                    _ => return Err(ConstantSolvingError::InvalidUnaryOpArg),\r\n                },\r\n            },\r\n            ConstantInner::Composite {\r\n                ty,\r\n                ref mut components,\r\n            } => {\r\n                match self.types[ty].inner {\r\n                    TypeInner::Vector { .. } | TypeInner::Matrix { .. } => (),\r\n                    _ => return Err(ConstantSolvingError::InvalidCastArg),\r\n                }\r\n\r\n                for component in components {\r\n                    *component = self.unary_op(op, *component, span)?\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(self.register_constant(inner, span))\r\n    }\r\n\r\n    fn binary_op(\r\n        &mut self,\r\n        op: BinaryOperator,\r\n        left: Handle<Constant>,\r\n        right: Handle<Constant>,\r\n        span: crate::Span,\r\n    ) -> Result<Handle<Constant>, ConstantSolvingError> {\r\n        let left_inner = &self.constants[left].inner;\r\n        let right_inner = &self.constants[right].inner;\r\n\r\n        let inner = match (left_inner, right_inner) {\r\n            (\r\n                &ConstantInner::Scalar {\r\n                    value: left_value,\r\n                    width,\r\n                },\r\n                &ConstantInner::Scalar {\r\n                    value: right_value,\r\n                    width: _,\r\n                },\r\n            ) => {\r\n                let value = match op {\r\n                    BinaryOperator::Equal => ScalarValue::Bool(left_value == right_value),\r\n                    BinaryOperator::NotEqual => ScalarValue::Bool(left_value != right_value),\r\n                    BinaryOperator::Less => ScalarValue::Bool(left_value < right_value),\r\n                    BinaryOperator::LessEqual => ScalarValue::Bool(left_value <= right_value),\r\n                    BinaryOperator::Greater => ScalarValue::Bool(left_value > right_value),\r\n                    BinaryOperator::GreaterEqual => ScalarValue::Bool(left_value >= right_value),\r\n\r\n                    _ => match (left_value, right_value) {\r\n                        (ScalarValue::Sint(a), ScalarValue::Sint(b)) => {\r\n                            ScalarValue::Sint(match op {\r\n                                BinaryOperator::Add => a.wrapping_add(b),\r\n                                BinaryOperator::Subtract => a.wrapping_sub(b),\r\n                                BinaryOperator::Multiply => a.wrapping_mul(b),\r\n                                BinaryOperator::Divide => a.checked_div(b).unwrap_or(0),\r\n                                BinaryOperator::Modulo => a.checked_rem(b).unwrap_or(0),\r\n                                BinaryOperator::And => a & b,\r\n                                BinaryOperator::ExclusiveOr => a ^ b,\r\n                                BinaryOperator::InclusiveOr => a | b,\r\n                                _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n                            })\r\n                        }\r\n                        (ScalarValue::Sint(a), ScalarValue::Uint(b)) => {\r\n                            ScalarValue::Sint(match op {\r\n                                BinaryOperator::ShiftLeft => a.wrapping_shl(b as u32),\r\n                                BinaryOperator::ShiftRight => a.wrapping_shr(b as u32),\r\n                                _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n                            })\r\n                        }\r\n                        (ScalarValue::Uint(a), ScalarValue::Uint(b)) => {\r\n                            ScalarValue::Uint(match op {\r\n                                BinaryOperator::Add => a.wrapping_add(b),\r\n                                BinaryOperator::Subtract => a.wrapping_sub(b),\r\n                                BinaryOperator::Multiply => a.wrapping_mul(b),\r\n                                BinaryOperator::Divide => a.checked_div(b).unwrap_or(0),\r\n                                BinaryOperator::Modulo => a.checked_rem(b).unwrap_or(0),\r\n                                BinaryOperator::And => a & b,\r\n                                BinaryOperator::ExclusiveOr => a ^ b,\r\n                                BinaryOperator::InclusiveOr => a | b,\r\n                                BinaryOperator::ShiftLeft => a.wrapping_shl(b as u32),\r\n                                BinaryOperator::ShiftRight => a.wrapping_shr(b as u32),\r\n                                _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n                            })\r\n                        }\r\n                        (ScalarValue::Float(a), ScalarValue::Float(b)) => {\r\n                            ScalarValue::Float(match op {\r\n                                BinaryOperator::Add => a + b,\r\n                                BinaryOperator::Subtract => a - b,\r\n                                BinaryOperator::Multiply => a * b,\r\n                                BinaryOperator::Divide => a / b,\r\n                                BinaryOperator::Modulo => a - b * (a / b).floor(),\r\n                                _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n                            })\r\n                        }\r\n                        (ScalarValue::Bool(a), ScalarValue::Bool(b)) => {\r\n                            ScalarValue::Bool(match op {\r\n                                BinaryOperator::LogicalAnd => a && b,\r\n                                BinaryOperator::LogicalOr => a || b,\r\n                                _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n                            })\r\n                        }\r\n                        _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n                    },\r\n                };\r\n\r\n                ConstantInner::Scalar { value, width }\r\n            }\r\n            (&ConstantInner::Composite { ref components, ty }, &ConstantInner::Scalar { .. }) => {\r\n                let mut components = components.clone();\r\n                for comp in components.iter_mut() {\r\n                    *comp = self.binary_op(op, *comp, right, span)?;\r\n                }\r\n                ConstantInner::Composite { ty, components }\r\n            }\r\n            (&ConstantInner::Scalar { .. }, &ConstantInner::Composite { ref components, ty }) => {\r\n                let mut components = components.clone();\r\n                for comp in components.iter_mut() {\r\n                    *comp = self.binary_op(op, left, *comp, span)?;\r\n                }\r\n                ConstantInner::Composite { ty, components }\r\n            }\r\n            _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs),\r\n        };\r\n\r\n        Ok(self.register_constant(inner, span))\r\n    }\r\n\r\n    fn register_constant(&mut self, inner: ConstantInner, span: crate::Span) -> Handle<Constant> {\r\n        self.constants.fetch_or_append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner,\r\n            },\r\n            span,\r\n        )\r\n    }\r\n}\r\n\r\n/// Helper function to implement the GLSL `max` function for floats.\r\n///\r\n/// While Rust does provide a `f64::max` method, it has a different behavior than the\r\n/// GLSL `max` for NaNs. In Rust, if any of the arguments is a NaN, then the other\r\n/// is returned.\r\n///\r\n/// This leads to different results in the following example\r\n/// ```\r\n/// use std::cmp::max;\r\n/// std::f64::NAN.max(1.0);\r\n/// ```\r\n///\r\n/// Rust will return `1.0` while GLSL should return NaN.\r\nfn glsl_float_max(x: f64, y: f64) -> f64 {\r\n    if x < y {\r\n        y\r\n    } else {\r\n        x\r\n    }\r\n}\r\n\r\n/// Helper function to implement the GLSL `min` function for floats.\r\n///\r\n/// While Rust does provide a `f64::min` method, it has a different behavior than the\r\n/// GLSL `min` for NaNs. In Rust, if any of the arguments is a NaN, then the other\r\n/// is returned.\r\n///\r\n/// This leads to different results in the following example\r\n/// ```\r\n/// use std::cmp::min;\r\n/// std::f64::NAN.min(1.0);\r\n/// ```\r\n///\r\n/// Rust will return `1.0` while GLSL should return NaN.\r\nfn glsl_float_min(x: f64, y: f64) -> f64 {\r\n    if y < x {\r\n        y\r\n    } else {\r\n        x\r\n    }\r\n}\r\n\r\n/// Helper function to implement the GLSL `clamp` function for floats.\r\n///\r\n/// While Rust does provide a `f64::clamp` method, it panics if either\r\n/// `min` or `max` are `NaN`s which is not the behavior specified by\r\n/// the glsl specification.\r\nfn glsl_float_clamp(value: f64, min: f64, max: f64) -> f64 {\r\n    glsl_float_min(glsl_float_max(value, min), max)\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use std::vec;\r\n\r\n    use crate::{\r\n        Arena, Constant, ConstantInner, Expression, ScalarKind, ScalarValue, Type, TypeInner,\r\n        UnaryOperator, UniqueArena, VectorSize,\r\n    };\r\n\r\n    use super::ConstantSolver;\r\n\r\n    #[test]\r\n    fn nan_handling() {\r\n        assert!(super::glsl_float_max(f64::NAN, 2.0).is_nan());\r\n        assert!(!super::glsl_float_max(2.0, f64::NAN).is_nan());\r\n\r\n        assert!(super::glsl_float_min(f64::NAN, 2.0).is_nan());\r\n        assert!(!super::glsl_float_min(2.0, f64::NAN).is_nan());\r\n\r\n        assert!(super::glsl_float_clamp(f64::NAN, 1.0, 2.0).is_nan());\r\n        assert!(!super::glsl_float_clamp(1.0, f64::NAN, 2.0).is_nan());\r\n        assert!(!super::glsl_float_clamp(1.0, 2.0, f64::NAN).is_nan());\r\n    }\r\n\r\n    #[test]\r\n    fn unary_op() {\r\n        let mut types = UniqueArena::new();\r\n        let mut expressions = Arena::new();\r\n        let mut constants = Arena::new();\r\n\r\n        let vec_ty = types.insert(\r\n            Type {\r\n                name: None,\r\n                inner: TypeInner::Vector {\r\n                    size: VectorSize::Bi,\r\n                    kind: ScalarKind::Sint,\r\n                    width: 4,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let h = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Scalar {\r\n                    width: 4,\r\n                    value: ScalarValue::Sint(4),\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let h1 = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Scalar {\r\n                    width: 4,\r\n                    value: ScalarValue::Sint(8),\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let vec_h = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Composite {\r\n                    ty: vec_ty,\r\n                    components: vec![h, h1],\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let expr = expressions.append(Expression::Constant(h), Default::default());\r\n        let expr1 = expressions.append(Expression::Constant(vec_h), Default::default());\r\n\r\n        let root1 = expressions.append(\r\n            Expression::Unary {\r\n                op: UnaryOperator::Negate,\r\n                expr,\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let root2 = expressions.append(\r\n            Expression::Unary {\r\n                op: UnaryOperator::Not,\r\n                expr,\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let root3 = expressions.append(\r\n            Expression::Unary {\r\n                op: UnaryOperator::Not,\r\n                expr: expr1,\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let mut solver = ConstantSolver {\r\n            types: &mut types,\r\n            expressions: &expressions,\r\n            constants: &mut constants,\r\n        };\r\n\r\n        let res1 = solver.solve(root1).unwrap();\r\n        let res2 = solver.solve(root2).unwrap();\r\n        let res3 = solver.solve(root3).unwrap();\r\n\r\n        assert_eq!(\r\n            constants[res1].inner,\r\n            ConstantInner::Scalar {\r\n                width: 4,\r\n                value: ScalarValue::Sint(-4),\r\n            },\r\n        );\r\n\r\n        assert_eq!(\r\n            constants[res2].inner,\r\n            ConstantInner::Scalar {\r\n                width: 4,\r\n                value: ScalarValue::Sint(!4),\r\n            },\r\n        );\r\n\r\n        let res3_inner = &constants[res3].inner;\r\n\r\n        match res3_inner {\r\n            ConstantInner::Composite { ty, components } => {\r\n                assert_eq!(*ty, vec_ty);\r\n                let mut components_iter = components.iter().copied();\r\n                assert_eq!(\r\n                    constants[components_iter.next().unwrap()].inner,\r\n                    ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Sint(!4),\r\n                    },\r\n                );\r\n                assert_eq!(\r\n                    constants[components_iter.next().unwrap()].inner,\r\n                    ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Sint(!8),\r\n                    },\r\n                );\r\n                assert!(components_iter.next().is_none());\r\n            }\r\n            _ => panic!(\"Expected vector\"),\r\n        }\r\n    }\r\n\r\n    #[test]\r\n    fn cast() {\r\n        let mut expressions = Arena::new();\r\n        let mut constants = Arena::new();\r\n\r\n        let h = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Scalar {\r\n                    width: 4,\r\n                    value: ScalarValue::Sint(4),\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let expr = expressions.append(Expression::Constant(h), Default::default());\r\n\r\n        let root = expressions.append(\r\n            Expression::As {\r\n                expr,\r\n                kind: ScalarKind::Bool,\r\n                convert: Some(crate::BOOL_WIDTH),\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let mut solver = ConstantSolver {\r\n            types: &mut UniqueArena::new(),\r\n            expressions: &expressions,\r\n            constants: &mut constants,\r\n        };\r\n\r\n        let res = solver.solve(root).unwrap();\r\n\r\n        assert_eq!(\r\n            constants[res].inner,\r\n            ConstantInner::Scalar {\r\n                width: crate::BOOL_WIDTH,\r\n                value: ScalarValue::Bool(true),\r\n            },\r\n        );\r\n    }\r\n\r\n    #[test]\r\n    fn access() {\r\n        let mut types = UniqueArena::new();\r\n        let mut expressions = Arena::new();\r\n        let mut constants = Arena::new();\r\n\r\n        let matrix_ty = types.insert(\r\n            Type {\r\n                name: None,\r\n                inner: TypeInner::Matrix {\r\n                    columns: VectorSize::Bi,\r\n                    rows: VectorSize::Tri,\r\n                    width: 4,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let vec_ty = types.insert(\r\n            Type {\r\n                name: None,\r\n                inner: TypeInner::Vector {\r\n                    size: VectorSize::Tri,\r\n                    kind: ScalarKind::Float,\r\n                    width: 4,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let mut vec1_components = Vec::with_capacity(3);\r\n        let mut vec2_components = Vec::with_capacity(3);\r\n\r\n        for i in 0..3 {\r\n            let h = constants.append(\r\n                Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner: ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Float(i as f64),\r\n                    },\r\n                },\r\n                Default::default(),\r\n            );\r\n\r\n            vec1_components.push(h)\r\n        }\r\n\r\n        for i in 3..6 {\r\n            let h = constants.append(\r\n                Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner: ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Float(i as f64),\r\n                    },\r\n                },\r\n                Default::default(),\r\n            );\r\n\r\n            vec2_components.push(h)\r\n        }\r\n\r\n        let vec1 = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Composite {\r\n                    ty: vec_ty,\r\n                    components: vec1_components,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let vec2 = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Composite {\r\n                    ty: vec_ty,\r\n                    components: vec2_components,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let h = constants.append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Composite {\r\n                    ty: matrix_ty,\r\n                    components: vec![vec1, vec2],\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let base = expressions.append(Expression::Constant(h), Default::default());\r\n        let root1 = expressions.append(\r\n            Expression::AccessIndex { base, index: 1 },\r\n            Default::default(),\r\n        );\r\n        let root2 = expressions.append(\r\n            Expression::AccessIndex {\r\n                base: root1,\r\n                index: 2,\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let mut solver = ConstantSolver {\r\n            types: &mut types,\r\n            expressions: &expressions,\r\n            constants: &mut constants,\r\n        };\r\n\r\n        let res1 = solver.solve(root1).unwrap();\r\n        let res2 = solver.solve(root2).unwrap();\r\n\r\n        let res1_inner = &constants[res1].inner;\r\n\r\n        match res1_inner {\r\n            ConstantInner::Composite { ty, components } => {\r\n                assert_eq!(*ty, vec_ty);\r\n                let mut components_iter = components.iter().copied();\r\n                assert_eq!(\r\n                    constants[components_iter.next().unwrap()].inner,\r\n                    ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Float(3.),\r\n                    },\r\n                );\r\n                assert_eq!(\r\n                    constants[components_iter.next().unwrap()].inner,\r\n                    ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Float(4.),\r\n                    },\r\n                );\r\n                assert_eq!(\r\n                    constants[components_iter.next().unwrap()].inner,\r\n                    ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: ScalarValue::Float(5.),\r\n                    },\r\n                );\r\n                assert!(components_iter.next().is_none());\r\n            }\r\n            _ => panic!(\"Expected vector\"),\r\n        }\r\n\r\n        assert_eq!(\r\n            constants[res2].inner,\r\n            ConstantInner::Scalar {\r\n                width: 4,\r\n                value: ScalarValue::Float(5.),\r\n            },\r\n        );\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/context.rs",
    "content": "use super::{\r\n    ast::{\r\n        GlobalLookup, GlobalLookupKind, HirExpr, HirExprKind, ParameterInfo, ParameterQualifier,\r\n        VariableReference,\r\n    },\r\n    error::{Error, ErrorKind},\r\n    types::{scalar_components, type_power},\r\n    Parser, Result,\r\n};\r\nuse crate::{\r\n    front::{Emitter, Typifier},\r\n    AddressSpace, Arena, BinaryOperator, Block, Constant, Expression, FastHashMap,\r\n    FunctionArgument, Handle, LocalVariable, RelationalFunction, ScalarKind, ScalarValue, Span,\r\n    Statement, Type, TypeInner, VectorSize,\r\n};\r\nuse std::{convert::TryFrom, ops::Index};\r\n\r\n/// The position at which an expression is, used while lowering\r\n#[derive(Clone, Copy, PartialEq, Eq, Debug)]\r\npub enum ExprPos {\r\n    /// The expression is in the left hand side of an assignment\r\n    Lhs,\r\n    /// The expression is in the right hand side of an assignment\r\n    Rhs,\r\n    /// The expression is an array being indexed, needed to allow constant\r\n    /// arrays to be dynamically indexed\r\n    AccessBase {\r\n        /// The index is a constant\r\n        constant_index: bool,\r\n    },\r\n}\r\n\r\nimpl ExprPos {\r\n    /// Returns an lhs position if the current position is lhs otherwise AccessBase\r\n    const fn maybe_access_base(&self, constant_index: bool) -> Self {\r\n        match *self {\r\n            ExprPos::Lhs => *self,\r\n            _ => ExprPos::AccessBase { constant_index },\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\npub struct Context {\r\n    pub expressions: Arena<Expression>,\r\n    pub locals: Arena<LocalVariable>,\r\n    pub arguments: Vec<FunctionArgument>,\r\n\r\n    pub parameters: Vec<Handle<Type>>,\r\n    pub parameters_info: Vec<ParameterInfo>,\r\n\r\n    pub symbol_table: crate::front::SymbolTable<String, VariableReference>,\r\n    pub samplers: FastHashMap<Handle<Expression>, Handle<Expression>>,\r\n\r\n    pub typifier: Typifier,\r\n    emitter: Emitter,\r\n    stmt_ctx: Option<StmtContext>,\r\n}\r\n\r\nimpl Context {\r\n    pub fn new(parser: &Parser, body: &mut Block) -> Self {\r\n        let mut this = Context {\r\n            expressions: Arena::new(),\r\n            locals: Arena::new(),\r\n            arguments: Vec::new(),\r\n\r\n            parameters: Vec::new(),\r\n            parameters_info: Vec::new(),\r\n\r\n            symbol_table: crate::front::SymbolTable::default(),\r\n            samplers: FastHashMap::default(),\r\n\r\n            typifier: Typifier::new(),\r\n            emitter: Emitter::default(),\r\n            stmt_ctx: Some(StmtContext::new()),\r\n        };\r\n\r\n        this.emit_start();\r\n\r\n        for &(ref name, lookup) in parser.global_variables.iter() {\r\n            this.add_global(parser, name, lookup, body)\r\n        }\r\n\r\n        this\r\n    }\r\n\r\n    pub fn add_global(\r\n        &mut self,\r\n        parser: &Parser,\r\n        name: &str,\r\n        GlobalLookup {\r\n            kind,\r\n            entry_arg,\r\n            mutable,\r\n        }: GlobalLookup,\r\n        body: &mut Block,\r\n    ) {\r\n        self.emit_end(body);\r\n        let (expr, load, constant) = match kind {\r\n            GlobalLookupKind::Variable(v) => {\r\n                let span = parser.module.global_variables.get_span(v);\r\n                let res = (\r\n                    self.expressions.append(Expression::GlobalVariable(v), span),\r\n                    parser.module.global_variables[v].space != AddressSpace::Handle,\r\n                    None,\r\n                );\r\n                self.emit_start();\r\n\r\n                res\r\n            }\r\n            GlobalLookupKind::BlockSelect(handle, index) => {\r\n                let span = parser.module.global_variables.get_span(handle);\r\n                let base = self\r\n                    .expressions\r\n                    .append(Expression::GlobalVariable(handle), span);\r\n                self.emit_start();\r\n                let expr = self\r\n                    .expressions\r\n                    .append(Expression::AccessIndex { base, index }, span);\r\n\r\n                (\r\n                    expr,\r\n                    {\r\n                        let ty = parser.module.global_variables[handle].ty;\r\n\r\n                        match parser.module.types[ty].inner {\r\n                            TypeInner::Struct { ref members, .. } => {\r\n                                if let TypeInner::Array {\r\n                                    size: crate::ArraySize::Dynamic,\r\n                                    ..\r\n                                } = parser.module.types[members[index as usize].ty].inner\r\n                                {\r\n                                    false\r\n                                } else {\r\n                                    true\r\n                                }\r\n                            }\r\n                            _ => true,\r\n                        }\r\n                    },\r\n                    None,\r\n                )\r\n            }\r\n            GlobalLookupKind::Constant(v, ty) => {\r\n                let span = parser.module.constants.get_span(v);\r\n                let res = (\r\n                    self.expressions.append(Expression::Constant(v), span),\r\n                    false,\r\n                    Some((v, ty)),\r\n                );\r\n                self.emit_start();\r\n                res\r\n            }\r\n        };\r\n\r\n        let var = VariableReference {\r\n            expr,\r\n            load,\r\n            mutable,\r\n            constant,\r\n            entry_arg,\r\n        };\r\n\r\n        self.symbol_table.add(name.into(), var);\r\n    }\r\n\r\n    /// Starts the expression emitter\r\n    ///\r\n    /// # Panics\r\n    ///\r\n    /// - If called twice in a row without calling [`emit_end`][Self::emit_end].\r\n    #[inline]\r\n    pub fn emit_start(&mut self) {\r\n        self.emitter.start(&self.expressions)\r\n    }\r\n\r\n    /// Emits all the expressions captured by the emitter to the passed `body`\r\n    ///\r\n    /// # Panics\r\n    ///\r\n    /// - If called before calling [`emit_start`].\r\n    /// - If called twice in a row without calling [`emit_start`].\r\n    ///\r\n    /// [`emit_start`]: Self::emit_start\r\n    pub fn emit_end(&mut self, body: &mut Block) {\r\n        body.extend(self.emitter.finish(&self.expressions))\r\n    }\r\n\r\n    /// Emits all the expressions captured by the emitter to the passed `body`\r\n    /// and starts the emitter again\r\n    ///\r\n    /// # Panics\r\n    ///\r\n    /// - If called before calling [`emit_start`][Self::emit_start].\r\n    pub fn emit_restart(&mut self, body: &mut Block) {\r\n        self.emit_end(body);\r\n        self.emit_start()\r\n    }\r\n\r\n    pub fn add_expression(\r\n        &mut self,\r\n        expr: Expression,\r\n        meta: Span,\r\n        body: &mut Block,\r\n    ) -> Handle<Expression> {\r\n        let needs_pre_emit = expr.needs_pre_emit();\r\n        if needs_pre_emit {\r\n            self.emit_end(body);\r\n        }\r\n        let handle = self.expressions.append(expr, meta);\r\n        if needs_pre_emit {\r\n            self.emit_start();\r\n        }\r\n        handle\r\n    }\r\n\r\n    /// Add variable to current scope\r\n    ///\r\n    /// Returns a variable if a variable with the same name was already defined,\r\n    /// otherwise returns `None`\r\n    pub fn add_local_var(\r\n        &mut self,\r\n        name: String,\r\n        expr: Handle<Expression>,\r\n        mutable: bool,\r\n    ) -> Option<VariableReference> {\r\n        let var = VariableReference {\r\n            expr,\r\n            load: true,\r\n            mutable,\r\n            constant: None,\r\n            entry_arg: None,\r\n        };\r\n\r\n        self.symbol_table.add(name, var)\r\n    }\r\n\r\n    /// Add function argument to current scope\r\n    pub fn add_function_arg(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        body: &mut Block,\r\n        name_meta: Option<(String, Span)>,\r\n        ty: Handle<Type>,\r\n        qualifier: ParameterQualifier,\r\n    ) {\r\n        let index = self.arguments.len();\r\n        let mut arg = FunctionArgument {\r\n            name: name_meta.as_ref().map(|&(ref name, _)| name.clone()),\r\n            ty,\r\n            binding: None,\r\n        };\r\n        self.parameters.push(ty);\r\n\r\n        let opaque = match parser.module.types[ty].inner {\r\n            TypeInner::Image { .. } | TypeInner::Sampler { .. } => true,\r\n            _ => false,\r\n        };\r\n\r\n        if qualifier.is_lhs() {\r\n            let span = parser.module.types.get_span(arg.ty);\r\n            arg.ty = parser.module.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Pointer {\r\n                        base: arg.ty,\r\n                        space: AddressSpace::Function,\r\n                    },\r\n                },\r\n                span,\r\n            )\r\n        }\r\n\r\n        self.arguments.push(arg);\r\n\r\n        self.parameters_info.push(ParameterInfo {\r\n            qualifier,\r\n            depth: false,\r\n        });\r\n\r\n        if let Some((name, meta)) = name_meta {\r\n            let expr = self.add_expression(Expression::FunctionArgument(index as u32), meta, body);\r\n            let mutable = qualifier != ParameterQualifier::Const && !opaque;\r\n            let load = qualifier.is_lhs();\r\n\r\n            let var = if mutable && !load {\r\n                let handle = self.locals.append(\r\n                    LocalVariable {\r\n                        name: Some(name.clone()),\r\n                        ty,\r\n                        init: None,\r\n                    },\r\n                    meta,\r\n                );\r\n                let local_expr = self.add_expression(Expression::LocalVariable(handle), meta, body);\r\n\r\n                self.emit_restart(body);\r\n\r\n                body.push(\r\n                    Statement::Store {\r\n                        pointer: local_expr,\r\n                        value: expr,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                VariableReference {\r\n                    expr: local_expr,\r\n                    load: true,\r\n                    mutable,\r\n                    constant: None,\r\n                    entry_arg: None,\r\n                }\r\n            } else {\r\n                VariableReference {\r\n                    expr,\r\n                    load,\r\n                    mutable,\r\n                    constant: None,\r\n                    entry_arg: None,\r\n                }\r\n            };\r\n\r\n            self.symbol_table.add(name, var);\r\n        }\r\n    }\r\n\r\n    /// Returns a [`StmtContext`](StmtContext) to be used in parsing and lowering\r\n    ///\r\n    /// # Panics\r\n    /// - If more than one [`StmtContext`](StmtContext) are active at the same\r\n    /// time or if the previous call didn't use it in lowering.\r\n    #[must_use]\r\n    pub fn stmt_ctx(&mut self) -> StmtContext {\r\n        self.stmt_ctx.take().unwrap()\r\n    }\r\n\r\n    /// Lowers a [`HirExpr`](HirExpr) which might produce a [`Expression`](Expression).\r\n    ///\r\n    /// consumes a [`StmtContext`](StmtContext) returning it to the context so\r\n    /// that it can be used again later.\r\n    pub fn lower(\r\n        &mut self,\r\n        mut stmt: StmtContext,\r\n        parser: &mut Parser,\r\n        expr: Handle<HirExpr>,\r\n        pos: ExprPos,\r\n        body: &mut Block,\r\n    ) -> Result<(Option<Handle<Expression>>, Span)> {\r\n        let res = self.lower_inner(&stmt, parser, expr, pos, body);\r\n\r\n        stmt.hir_exprs.clear();\r\n        self.stmt_ctx = Some(stmt);\r\n\r\n        res\r\n    }\r\n\r\n    /// Similar to [`lower`](Self::lower) but returns an error if the expression\r\n    /// returns void (ie. doesn't produce a [`Expression`](Expression)).\r\n    ///\r\n    /// consumes a [`StmtContext`](StmtContext) returning it to the context so\r\n    /// that it can be used again later.\r\n    pub fn lower_expect(\r\n        &mut self,\r\n        mut stmt: StmtContext,\r\n        parser: &mut Parser,\r\n        expr: Handle<HirExpr>,\r\n        pos: ExprPos,\r\n        body: &mut Block,\r\n    ) -> Result<(Handle<Expression>, Span)> {\r\n        let res = self.lower_expect_inner(&stmt, parser, expr, pos, body);\r\n\r\n        stmt.hir_exprs.clear();\r\n        self.stmt_ctx = Some(stmt);\r\n\r\n        res\r\n    }\r\n\r\n    /// internal implementation of [`lower_expect`](Self::lower_expect)\r\n    ///\r\n    /// this method is only public because it's used in\r\n    /// [`function_call`](Parser::function_call), unless you know what\r\n    /// you're doing use [`lower_expect`](Self::lower_expect)\r\n    pub fn lower_expect_inner(\r\n        &mut self,\r\n        stmt: &StmtContext,\r\n        parser: &mut Parser,\r\n        expr: Handle<HirExpr>,\r\n        pos: ExprPos,\r\n        body: &mut Block,\r\n    ) -> Result<(Handle<Expression>, Span)> {\r\n        let (maybe_expr, meta) = self.lower_inner(stmt, parser, expr, pos, body)?;\r\n\r\n        let expr = match maybe_expr {\r\n            Some(e) => e,\r\n            None => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::SemanticError(\"Expression returns void\".into()),\r\n                    meta,\r\n                })\r\n            }\r\n        };\r\n\r\n        Ok((expr, meta))\r\n    }\r\n\r\n    fn lower_store(\r\n        &mut self,\r\n        pointer: Handle<Expression>,\r\n        value: Handle<Expression>,\r\n        meta: Span,\r\n        body: &mut Block,\r\n    ) {\r\n        if let Expression::Swizzle {\r\n            size,\r\n            mut vector,\r\n            pattern,\r\n        } = self.expressions[pointer]\r\n        {\r\n            // Stores to swizzled values are not directly supported,\r\n            // lower them as series of per-component stores.\r\n            let size = match size {\r\n                VectorSize::Bi => 2,\r\n                VectorSize::Tri => 3,\r\n                VectorSize::Quad => 4,\r\n            };\r\n\r\n            if let Expression::Load { pointer } = self.expressions[vector] {\r\n                vector = pointer;\r\n            }\r\n\r\n            #[allow(clippy::needless_range_loop)]\r\n            for index in 0..size {\r\n                let dst = self.add_expression(\r\n                    Expression::AccessIndex {\r\n                        base: vector,\r\n                        index: pattern[index].index(),\r\n                    },\r\n                    meta,\r\n                    body,\r\n                );\r\n                let src = self.add_expression(\r\n                    Expression::AccessIndex {\r\n                        base: value,\r\n                        index: index as u32,\r\n                    },\r\n                    meta,\r\n                    body,\r\n                );\r\n\r\n                self.emit_restart(body);\r\n\r\n                body.push(\r\n                    Statement::Store {\r\n                        pointer: dst,\r\n                        value: src,\r\n                    },\r\n                    meta,\r\n                );\r\n            }\r\n        } else {\r\n            self.emit_restart(body);\r\n\r\n            body.push(Statement::Store { pointer, value }, meta);\r\n        }\r\n    }\r\n\r\n    /// Internal implementation of [`lower`](Self::lower)\r\n    fn lower_inner(\r\n        &mut self,\r\n        stmt: &StmtContext,\r\n        parser: &mut Parser,\r\n        expr: Handle<HirExpr>,\r\n        pos: ExprPos,\r\n        body: &mut Block,\r\n    ) -> Result<(Option<Handle<Expression>>, Span)> {\r\n        let HirExpr { ref kind, meta } = stmt.hir_exprs[expr];\r\n\r\n        log::debug!(\"Lowering {:?}\", expr);\r\n\r\n        let handle = match *kind {\r\n            HirExprKind::Access { base, index } => {\r\n                let (index, index_meta) =\r\n                    self.lower_expect_inner(stmt, parser, index, ExprPos::Rhs, body)?;\r\n                let maybe_constant_index = match pos {\r\n                    // Don't try to generate `AccessIndex` if in a LHS position, since it\r\n                    // wouldn't produce a pointer.\r\n                    ExprPos::Lhs => None,\r\n                    _ => parser.solve_constant(self, index, index_meta).ok(),\r\n                };\r\n\r\n                let base = self\r\n                    .lower_expect_inner(\r\n                        stmt,\r\n                        parser,\r\n                        base,\r\n                        pos.maybe_access_base(maybe_constant_index.is_some()),\r\n                        body,\r\n                    )?\r\n                    .0;\r\n\r\n                let pointer = maybe_constant_index\r\n                    .and_then(|constant| {\r\n                        Some(self.add_expression(\r\n                            Expression::AccessIndex {\r\n                                base,\r\n                                index: match parser.module.constants[constant].inner {\r\n                                    crate::ConstantInner::Scalar {\r\n                                        value: ScalarValue::Uint(i),\r\n                                        ..\r\n                                    } => u32::try_from(i).ok()?,\r\n                                    crate::ConstantInner::Scalar {\r\n                                        value: ScalarValue::Sint(i),\r\n                                        ..\r\n                                    } => u32::try_from(i).ok()?,\r\n                                    _ => return None,\r\n                                },\r\n                            },\r\n                            meta,\r\n                            body,\r\n                        ))\r\n                    })\r\n                    .unwrap_or_else(|| {\r\n                        self.add_expression(Expression::Access { base, index }, meta, body)\r\n                    });\r\n\r\n                if ExprPos::Rhs == pos {\r\n                    let resolved = parser.resolve_type(self, pointer, meta)?;\r\n                    if resolved.pointer_space().is_some() {\r\n                        return Ok((\r\n                            Some(self.add_expression(Expression::Load { pointer }, meta, body)),\r\n                            meta,\r\n                        ));\r\n                    }\r\n                }\r\n\r\n                pointer\r\n            }\r\n            HirExprKind::Select { base, ref field } => {\r\n                let base = self\r\n                    .lower_expect_inner(stmt, parser, base, pos.maybe_access_base(true), body)?\r\n                    .0;\r\n\r\n                parser.field_selection(self, pos, body, base, field, meta)?\r\n            }\r\n            HirExprKind::Constant(constant) if pos != ExprPos::Lhs => {\r\n                self.add_expression(Expression::Constant(constant), meta, body)\r\n            }\r\n            HirExprKind::Binary { left, op, right } if pos != ExprPos::Lhs => {\r\n                let (mut left, left_meta) =\r\n                    self.lower_expect_inner(stmt, parser, left, ExprPos::Rhs, body)?;\r\n                let (mut right, right_meta) =\r\n                    self.lower_expect_inner(stmt, parser, right, ExprPos::Rhs, body)?;\r\n\r\n                match op {\r\n                    BinaryOperator::ShiftLeft | BinaryOperator::ShiftRight => self\r\n                        .implicit_conversion(parser, &mut right, right_meta, ScalarKind::Uint, 4)?,\r\n                    _ => self.binary_implicit_conversion(\r\n                        parser, &mut left, left_meta, &mut right, right_meta,\r\n                    )?,\r\n                }\r\n\r\n                parser.typifier_grow(self, left, left_meta)?;\r\n                parser.typifier_grow(self, right, right_meta)?;\r\n\r\n                let left_inner = self.typifier.get(left, &parser.module.types);\r\n                let right_inner = self.typifier.get(right, &parser.module.types);\r\n\r\n                match (left_inner, right_inner) {\r\n                    (\r\n                        &TypeInner::Matrix {\r\n                            columns: left_columns,\r\n                            rows: left_rows,\r\n                            width: left_width,\r\n                        },\r\n                        &TypeInner::Matrix {\r\n                            columns: right_columns,\r\n                            rows: right_rows,\r\n                            width: right_width,\r\n                        },\r\n                    ) => {\r\n                        let dimensions_ok = if op == BinaryOperator::Multiply {\r\n                            left_columns == right_rows\r\n                        } else {\r\n                            left_columns == right_columns && left_rows == right_rows\r\n                        };\r\n\r\n                        // Check that the two arguments have the same dimensions\r\n                        if !dimensions_ok || left_width != right_width {\r\n                            parser.errors.push(Error {\r\n                                kind: ErrorKind::SemanticError(\r\n                                    format!(\r\n                                        \"Cannot apply operation to {:?} and {:?}\",\r\n                                        left_inner, right_inner\r\n                                    )\r\n                                    .into(),\r\n                                ),\r\n                                meta,\r\n                            })\r\n                        }\r\n\r\n                        match op {\r\n                            BinaryOperator::Divide => {\r\n                                // Naga IR doesn't support matrix division so we need to\r\n                                // divide the columns individually and reassemble the matrix\r\n                                let mut components = Vec::with_capacity(left_columns as usize);\r\n\r\n                                for index in 0..left_columns as u32 {\r\n                                    // Get the column vectors\r\n                                    let left_vector = self.add_expression(\r\n                                        Expression::AccessIndex { base: left, index },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n                                    let right_vector = self.add_expression(\r\n                                        Expression::AccessIndex { base: right, index },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n\r\n                                    // Divide the vectors\r\n                                    let column = self.expressions.append(\r\n                                        Expression::Binary {\r\n                                            op,\r\n                                            left: left_vector,\r\n                                            right: right_vector,\r\n                                        },\r\n                                        meta,\r\n                                    );\r\n\r\n                                    components.push(column)\r\n                                }\r\n\r\n                                // Rebuild the matrix from the divided vectors\r\n                                self.expressions.append(\r\n                                    Expression::Compose {\r\n                                        ty: parser.module.types.insert(\r\n                                            Type {\r\n                                                name: None,\r\n                                                inner: TypeInner::Matrix {\r\n                                                    columns: left_columns,\r\n                                                    rows: left_rows,\r\n                                                    width: left_width,\r\n                                                },\r\n                                            },\r\n                                            Span::default(),\r\n                                        ),\r\n                                        components,\r\n                                    },\r\n                                    meta,\r\n                                )\r\n                            }\r\n                            BinaryOperator::Equal | BinaryOperator::NotEqual => {\r\n                                // Naga IR doesn't support matrix comparisons so we need to\r\n                                // compare the columns individually and then fold them together\r\n                                //\r\n                                // The folding is done using a logical and for equality and\r\n                                // a logical or for inequality\r\n                                let equals = op == BinaryOperator::Equal;\r\n\r\n                                let (op, combine, fun) = match equals {\r\n                                    true => (\r\n                                        BinaryOperator::Equal,\r\n                                        BinaryOperator::LogicalAnd,\r\n                                        RelationalFunction::All,\r\n                                    ),\r\n                                    false => (\r\n                                        BinaryOperator::NotEqual,\r\n                                        BinaryOperator::LogicalOr,\r\n                                        RelationalFunction::Any,\r\n                                    ),\r\n                                };\r\n\r\n                                let mut root = None;\r\n\r\n                                for index in 0..left_columns as u32 {\r\n                                    // Get the column vectors\r\n                                    let left_vector = self.add_expression(\r\n                                        Expression::AccessIndex { base: left, index },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n                                    let right_vector = self.add_expression(\r\n                                        Expression::AccessIndex { base: right, index },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n\r\n                                    let argument = self.expressions.append(\r\n                                        Expression::Binary {\r\n                                            op,\r\n                                            left: left_vector,\r\n                                            right: right_vector,\r\n                                        },\r\n                                        meta,\r\n                                    );\r\n\r\n                                    // The result of comparing two vectors is a boolean vector\r\n                                    // so use a relational function like all to get a single\r\n                                    // boolean value\r\n                                    let compare = self.add_expression(\r\n                                        Expression::Relational { fun, argument },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n\r\n                                    // Fold the result\r\n                                    root = Some(match root {\r\n                                        Some(right) => self.add_expression(\r\n                                            Expression::Binary {\r\n                                                op: combine,\r\n                                                left: compare,\r\n                                                right,\r\n                                            },\r\n                                            meta,\r\n                                            body,\r\n                                        ),\r\n                                        None => compare,\r\n                                    });\r\n                                }\r\n\r\n                                root.unwrap()\r\n                            }\r\n                            _ => self.add_expression(\r\n                                Expression::Binary { left, op, right },\r\n                                meta,\r\n                                body,\r\n                            ),\r\n                        }\r\n                    }\r\n                    (&TypeInner::Vector { .. }, &TypeInner::Vector { .. }) => match op {\r\n                        BinaryOperator::Equal | BinaryOperator::NotEqual => {\r\n                            let equals = op == BinaryOperator::Equal;\r\n\r\n                            let (op, fun) = match equals {\r\n                                true => (BinaryOperator::Equal, RelationalFunction::All),\r\n                                false => (BinaryOperator::NotEqual, RelationalFunction::Any),\r\n                            };\r\n\r\n                            let argument = self\r\n                                .expressions\r\n                                .append(Expression::Binary { op, left, right }, meta);\r\n\r\n                            self.add_expression(\r\n                                Expression::Relational { fun, argument },\r\n                                meta,\r\n                                body,\r\n                            )\r\n                        }\r\n                        _ => {\r\n                            self.add_expression(Expression::Binary { left, op, right }, meta, body)\r\n                        }\r\n                    },\r\n                    (&TypeInner::Vector { size, .. }, &TypeInner::Scalar { .. }) => match op {\r\n                        BinaryOperator::Add\r\n                        | BinaryOperator::Subtract\r\n                        | BinaryOperator::Divide\r\n                        | BinaryOperator::And\r\n                        | BinaryOperator::ExclusiveOr\r\n                        | BinaryOperator::InclusiveOr\r\n                        | BinaryOperator::ShiftLeft\r\n                        | BinaryOperator::ShiftRight => {\r\n                            let scalar_vector = self.add_expression(\r\n                                Expression::Splat { size, value: right },\r\n                                meta,\r\n                                body,\r\n                            );\r\n\r\n                            self.add_expression(\r\n                                Expression::Binary {\r\n                                    op,\r\n                                    left,\r\n                                    right: scalar_vector,\r\n                                },\r\n                                meta,\r\n                                body,\r\n                            )\r\n                        }\r\n                        _ => {\r\n                            self.add_expression(Expression::Binary { left, op, right }, meta, body)\r\n                        }\r\n                    },\r\n                    (&TypeInner::Scalar { .. }, &TypeInner::Vector { size, .. }) => match op {\r\n                        BinaryOperator::Add\r\n                        | BinaryOperator::Subtract\r\n                        | BinaryOperator::Divide\r\n                        | BinaryOperator::And\r\n                        | BinaryOperator::ExclusiveOr\r\n                        | BinaryOperator::InclusiveOr => {\r\n                            let scalar_vector = self.add_expression(\r\n                                Expression::Splat { size, value: left },\r\n                                meta,\r\n                                body,\r\n                            );\r\n\r\n                            self.add_expression(\r\n                                Expression::Binary {\r\n                                    op,\r\n                                    left: scalar_vector,\r\n                                    right,\r\n                                },\r\n                                meta,\r\n                                body,\r\n                            )\r\n                        }\r\n                        _ => {\r\n                            self.add_expression(Expression::Binary { left, op, right }, meta, body)\r\n                        }\r\n                    },\r\n                    (\r\n                        &TypeInner::Scalar {\r\n                            width: left_width, ..\r\n                        },\r\n                        &TypeInner::Matrix {\r\n                            rows,\r\n                            columns,\r\n                            width: right_width,\r\n                        },\r\n                    ) => {\r\n                        // Check that the two arguments have the same width\r\n                        if left_width != right_width {\r\n                            parser.errors.push(Error {\r\n                                kind: ErrorKind::SemanticError(\r\n                                    format!(\r\n                                        \"Cannot apply operation to {:?} and {:?}\",\r\n                                        left_inner, right_inner\r\n                                    )\r\n                                    .into(),\r\n                                ),\r\n                                meta,\r\n                            })\r\n                        }\r\n\r\n                        match op {\r\n                            BinaryOperator::Divide\r\n                            | BinaryOperator::Add\r\n                            | BinaryOperator::Subtract => {\r\n                                // Naga IR doesn't support all matrix by scalar operations so\r\n                                // we need for some to turn the scalar into a vector by\r\n                                // splatting it and then for each column vector apply the\r\n                                // operation and finally reconstruct the matrix\r\n                                let scalar_vector = self.add_expression(\r\n                                    Expression::Splat {\r\n                                        size: rows,\r\n                                        value: left,\r\n                                    },\r\n                                    meta,\r\n                                    body,\r\n                                );\r\n\r\n                                let mut components = Vec::with_capacity(columns as usize);\r\n\r\n                                for index in 0..columns as u32 {\r\n                                    // Get the column vector\r\n                                    let matrix_column = self.add_expression(\r\n                                        Expression::AccessIndex { base: right, index },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n\r\n                                    // Apply the operation to the splatted vector and\r\n                                    // the column vector\r\n                                    let column = self.expressions.append(\r\n                                        Expression::Binary {\r\n                                            op,\r\n                                            left: scalar_vector,\r\n                                            right: matrix_column,\r\n                                        },\r\n                                        meta,\r\n                                    );\r\n\r\n                                    components.push(column)\r\n                                }\r\n\r\n                                // Rebuild the matrix from the operation result vectors\r\n                                self.expressions.append(\r\n                                    Expression::Compose {\r\n                                        ty: parser.module.types.insert(\r\n                                            Type {\r\n                                                name: None,\r\n                                                inner: TypeInner::Matrix {\r\n                                                    columns,\r\n                                                    rows,\r\n                                                    width: left_width,\r\n                                                },\r\n                                            },\r\n                                            Span::default(),\r\n                                        ),\r\n                                        components,\r\n                                    },\r\n                                    meta,\r\n                                )\r\n                            }\r\n                            _ => self.add_expression(\r\n                                Expression::Binary { left, op, right },\r\n                                meta,\r\n                                body,\r\n                            ),\r\n                        }\r\n                    }\r\n                    (\r\n                        &TypeInner::Matrix {\r\n                            rows,\r\n                            columns,\r\n                            width: left_width,\r\n                        },\r\n                        &TypeInner::Scalar {\r\n                            width: right_width, ..\r\n                        },\r\n                    ) => {\r\n                        // Check that the two arguments have the same width\r\n                        if left_width != right_width {\r\n                            parser.errors.push(Error {\r\n                                kind: ErrorKind::SemanticError(\r\n                                    format!(\r\n                                        \"Cannot apply operation to {:?} and {:?}\",\r\n                                        left_inner, right_inner\r\n                                    )\r\n                                    .into(),\r\n                                ),\r\n                                meta,\r\n                            })\r\n                        }\r\n\r\n                        match op {\r\n                            BinaryOperator::Divide\r\n                            | BinaryOperator::Add\r\n                            | BinaryOperator::Subtract => {\r\n                                // Naga IR doesn't support all matrix by scalar operations so\r\n                                // we need for some to turn the scalar into a vector by\r\n                                // splatting it and then for each column vector apply the\r\n                                // operation and finally reconstruct the matrix\r\n\r\n                                let scalar_vector = self.add_expression(\r\n                                    Expression::Splat {\r\n                                        size: rows,\r\n                                        value: right,\r\n                                    },\r\n                                    meta,\r\n                                    body,\r\n                                );\r\n\r\n                                let mut components = Vec::with_capacity(columns as usize);\r\n\r\n                                for index in 0..columns as u32 {\r\n                                    // Get the column vector\r\n                                    let matrix_column = self.add_expression(\r\n                                        Expression::AccessIndex { base: left, index },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n\r\n                                    // Apply the operation to the splatted vector and\r\n                                    // the column vector\r\n                                    let column = self.expressions.append(\r\n                                        Expression::Binary {\r\n                                            op,\r\n                                            left: matrix_column,\r\n                                            right: scalar_vector,\r\n                                        },\r\n                                        meta,\r\n                                    );\r\n\r\n                                    components.push(column)\r\n                                }\r\n\r\n                                // Rebuild the matrix from the operation result vectors\r\n                                self.expressions.append(\r\n                                    Expression::Compose {\r\n                                        ty: parser.module.types.insert(\r\n                                            Type {\r\n                                                name: None,\r\n                                                inner: TypeInner::Matrix {\r\n                                                    columns,\r\n                                                    rows,\r\n                                                    width: left_width,\r\n                                                },\r\n                                            },\r\n                                            Span::default(),\r\n                                        ),\r\n                                        components,\r\n                                    },\r\n                                    meta,\r\n                                )\r\n                            }\r\n                            _ => self.add_expression(\r\n                                Expression::Binary { left, op, right },\r\n                                meta,\r\n                                body,\r\n                            ),\r\n                        }\r\n                    }\r\n                    _ => self.add_expression(Expression::Binary { left, op, right }, meta, body),\r\n                }\r\n            }\r\n            HirExprKind::Unary { op, expr } if pos != ExprPos::Lhs => {\r\n                let expr = self\r\n                    .lower_expect_inner(stmt, parser, expr, ExprPos::Rhs, body)?\r\n                    .0;\r\n\r\n                self.add_expression(Expression::Unary { op, expr }, meta, body)\r\n            }\r\n            HirExprKind::Variable(ref var) => match pos {\r\n                ExprPos::Lhs => {\r\n                    if !var.mutable {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Variable cannot be used in LHS position\".into(),\r\n                            ),\r\n                            meta,\r\n                        })\r\n                    }\r\n\r\n                    var.expr\r\n                }\r\n                ExprPos::AccessBase { constant_index } => {\r\n                    // If the index isn't constant all accesses backed by a constant base need\r\n                    // to be done trough a proxy local variable, since constants have a non\r\n                    // pointer type which is required for dynamic indexing\r\n                    if !constant_index {\r\n                        if let Some((constant, ty)) = var.constant {\r\n                            let local = self.locals.append(\r\n                                LocalVariable {\r\n                                    name: None,\r\n                                    ty,\r\n                                    init: Some(constant),\r\n                                },\r\n                                Span::default(),\r\n                            );\r\n\r\n                            self.add_expression(\r\n                                Expression::LocalVariable(local),\r\n                                Span::default(),\r\n                                body,\r\n                            )\r\n                        } else {\r\n                            var.expr\r\n                        }\r\n                    } else {\r\n                        var.expr\r\n                    }\r\n                }\r\n                _ if var.load => {\r\n                    self.add_expression(Expression::Load { pointer: var.expr }, meta, body)\r\n                }\r\n                _ => var.expr,\r\n            },\r\n            HirExprKind::Call(ref call) if pos != ExprPos::Lhs => {\r\n                let maybe_expr = parser.function_or_constructor_call(\r\n                    self,\r\n                    stmt,\r\n                    body,\r\n                    call.kind.clone(),\r\n                    &call.args,\r\n                    meta,\r\n                )?;\r\n                return Ok((maybe_expr, meta));\r\n            }\r\n            // `HirExprKind::Conditional` represents the ternary operator in glsl (`:?`)\r\n            //\r\n            // The ternary operator is defined to only evaluate one of the two possible\r\n            // expressions which means that it's behavior is that of an `if` statement,\r\n            // and it's merely syntatic sugar for it.\r\n            HirExprKind::Conditional {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } if ExprPos::Lhs != pos => {\r\n                // Given an expression `a ? b : c`, we need to produce a Naga\r\n                // statement roughly like:\r\n                //\r\n                //     var temp;\r\n                //     if a {\r\n                //         temp = convert(b);\r\n                //     } else  {\r\n                //         temp = convert(c);\r\n                //     }\r\n                //\r\n                // where `convert` stands for type conversions to bring `b` and `c` to\r\n                // the same type, and then use `temp` to represent the value of the whole\r\n                // conditional expression in subsequent code.\r\n\r\n                // Lower the condition first to the current bodyy\r\n                let condition = self\r\n                    .lower_expect_inner(stmt, parser, condition, ExprPos::Rhs, body)?\r\n                    .0;\r\n\r\n                // Emit all expressions since we will be adding statements to\r\n                // other bodies next\r\n                self.emit_restart(body);\r\n\r\n                // Create the bodies for the two cases\r\n                let mut accept_body = Block::new();\r\n                let mut reject_body = Block::new();\r\n\r\n                // Lower the `true` branch\r\n                let (mut accept, accept_meta) =\r\n                    self.lower_expect_inner(stmt, parser, accept, pos, &mut accept_body)?;\r\n\r\n                // Flush the body of the `true` branch, to start emitting on the\r\n                // `false` branch\r\n                self.emit_restart(&mut accept_body);\r\n\r\n                // Lower the `false` branch\r\n                let (mut reject, reject_meta) =\r\n                    self.lower_expect_inner(stmt, parser, reject, pos, &mut reject_body)?;\r\n\r\n                // Flush the body of the `false` branch\r\n                self.emit_restart(&mut reject_body);\r\n\r\n                // We need to do some custom implicit conversions since the two target expressions\r\n                // are in different bodies\r\n                if let (\r\n                    Some((accept_power, accept_width, accept_kind)),\r\n                    Some((reject_power, reject_width, reject_kind)),\r\n                ) = (\r\n                    // Get the components of both branches and calculate the type power\r\n                    self.expr_scalar_components(parser, accept, accept_meta)?\r\n                        .and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))),\r\n                    self.expr_scalar_components(parser, reject, reject_meta)?\r\n                        .and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))),\r\n                ) {\r\n                    match accept_power.cmp(&reject_power) {\r\n                        std::cmp::Ordering::Less => {\r\n                            self.conversion(&mut accept, accept_meta, reject_kind, reject_width)?;\r\n                            // The expression belongs to the `true` branch so we need to flush to\r\n                            // the respective body\r\n                            self.emit_end(&mut accept_body);\r\n                        }\r\n                        // Technically there's nothing to flush but later we will need to\r\n                        // add some expressions that must not be emitted so instead\r\n                        // of flushing, starting and flushing again, just make sure\r\n                        // everything is flushed.\r\n                        std::cmp::Ordering::Equal => self.emit_end(body),\r\n                        std::cmp::Ordering::Greater => {\r\n                            self.conversion(&mut reject, reject_meta, accept_kind, accept_width)?;\r\n                            // The expression belongs to the `false` branch so we need to flush to\r\n                            // the respective body\r\n                            self.emit_end(&mut reject_body);\r\n                        }\r\n                    }\r\n                } else {\r\n                    // Technically there's nothing to flush but later we will need to\r\n                    // add some expressions that must not be emitted.\r\n                    self.emit_end(body)\r\n                }\r\n\r\n                // We need to get the type of the resulting expression to create the local,\r\n                // this must be done after implicit conversions to ensure both branches have\r\n                // the same type.\r\n                let ty = parser.resolve_type_handle(self, accept, accept_meta)?;\r\n\r\n                // Add the local that will hold the result of our conditional\r\n                let local = self.locals.append(\r\n                    LocalVariable {\r\n                        name: None,\r\n                        ty,\r\n                        init: None,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                // Note: `Expression::LocalVariable` must not be emited so it's important\r\n                // that at this point the emitter is flushed but not started.\r\n                let local_expr = self\r\n                    .expressions\r\n                    .append(Expression::LocalVariable(local), meta);\r\n\r\n                // Add to each body the store to the result variable\r\n                accept_body.push(\r\n                    Statement::Store {\r\n                        pointer: local_expr,\r\n                        value: accept,\r\n                    },\r\n                    accept_meta,\r\n                );\r\n                reject_body.push(\r\n                    Statement::Store {\r\n                        pointer: local_expr,\r\n                        value: reject,\r\n                    },\r\n                    reject_meta,\r\n                );\r\n\r\n                // Finally add the `If` to the main body with the `condition` we lowered\r\n                // earlier and the branches we prepared.\r\n                body.push(\r\n                    Statement::If {\r\n                        condition,\r\n                        accept: accept_body,\r\n                        reject: reject_body,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                // Restart the emitter\r\n                self.emit_start();\r\n\r\n                // Note: `Expression::Load` must be emited before it's used so make\r\n                // sure the emitter is active here.\r\n                self.expressions.append(\r\n                    Expression::Load {\r\n                        pointer: local_expr,\r\n                    },\r\n                    meta,\r\n                )\r\n            }\r\n            HirExprKind::Assign { tgt, value } if ExprPos::Lhs != pos => {\r\n                let (pointer, ptr_meta) =\r\n                    self.lower_expect_inner(stmt, parser, tgt, ExprPos::Lhs, body)?;\r\n                let (mut value, value_meta) =\r\n                    self.lower_expect_inner(stmt, parser, value, ExprPos::Rhs, body)?;\r\n\r\n                let ty = match *parser.resolve_type(self, pointer, ptr_meta)? {\r\n                    TypeInner::Pointer { base, .. } => &parser.module.types[base].inner,\r\n                    ref ty => ty,\r\n                };\r\n\r\n                if let Some((kind, width)) = scalar_components(ty) {\r\n                    self.implicit_conversion(parser, &mut value, value_meta, kind, width)?;\r\n                }\r\n\r\n                self.lower_store(pointer, value, meta, body);\r\n\r\n                value\r\n            }\r\n            HirExprKind::PrePostfix { op, postfix, expr } if ExprPos::Lhs != pos => {\r\n                let (pointer, _) =\r\n                    self.lower_expect_inner(stmt, parser, expr, ExprPos::Lhs, body)?;\r\n                let left = if let Expression::Swizzle { .. } = self.expressions[pointer] {\r\n                    pointer\r\n                } else {\r\n                    self.add_expression(Expression::Load { pointer }, meta, body)\r\n                };\r\n\r\n                let make_constant_inner = |kind, width| {\r\n                    let value = match kind {\r\n                        ScalarKind::Sint => crate::ScalarValue::Sint(1),\r\n                        ScalarKind::Uint => crate::ScalarValue::Uint(1),\r\n                        ScalarKind::Float => crate::ScalarValue::Float(1.0),\r\n                        ScalarKind::Bool => return None,\r\n                    };\r\n\r\n                    Some(crate::ConstantInner::Scalar { width, value })\r\n                };\r\n                let res = match *parser.resolve_type(self, left, meta)? {\r\n                    TypeInner::Scalar { kind, width } => {\r\n                        let ty = TypeInner::Scalar { kind, width };\r\n                        make_constant_inner(kind, width).map(|i| (ty, i, None, None))\r\n                    }\r\n                    TypeInner::Vector { size, kind, width } => {\r\n                        let ty = TypeInner::Vector { size, kind, width };\r\n                        make_constant_inner(kind, width).map(|i| (ty, i, Some(size), None))\r\n                    }\r\n                    TypeInner::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width,\r\n                    } => {\r\n                        let ty = TypeInner::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        };\r\n                        make_constant_inner(ScalarKind::Float, width)\r\n                            .map(|i| (ty, i, Some(rows), Some(columns)))\r\n                    }\r\n                    _ => None,\r\n                };\r\n                let (ty_inner, inner, rows, columns) = match res {\r\n                    Some(res) => res,\r\n                    None => {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Increment/decrement only works on scalar/vector/matrix\".into(),\r\n                            ),\r\n                            meta,\r\n                        });\r\n                        return Ok((Some(left), meta));\r\n                    }\r\n                };\r\n\r\n                let constant_1 = parser.module.constants.append(\r\n                    Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner,\r\n                    },\r\n                    Default::default(),\r\n                );\r\n                let mut right = self.add_expression(Expression::Constant(constant_1), meta, body);\r\n\r\n                // Glsl allows pre/postfixes operations on vectors and matrices, so if the\r\n                // target is either of them change the right side of the addition to be splatted\r\n                // to the same size as the target, furthermore if the target is a matrix\r\n                // use a composed matrix using the splatted value.\r\n                if let Some(size) = rows {\r\n                    right =\r\n                        self.add_expression(Expression::Splat { size, value: right }, meta, body);\r\n\r\n                    if let Some(cols) = columns {\r\n                        let ty = parser.module.types.insert(\r\n                            Type {\r\n                                name: None,\r\n                                inner: ty_inner,\r\n                            },\r\n                            meta,\r\n                        );\r\n\r\n                        right = self.add_expression(\r\n                            Expression::Compose {\r\n                                ty,\r\n                                components: std::iter::repeat(right).take(cols as usize).collect(),\r\n                            },\r\n                            meta,\r\n                            body,\r\n                        );\r\n                    }\r\n                }\r\n\r\n                let value = self.add_expression(Expression::Binary { op, left, right }, meta, body);\r\n\r\n                self.lower_store(pointer, value, meta, body);\r\n\r\n                if postfix {\r\n                    left\r\n                } else {\r\n                    value\r\n                }\r\n            }\r\n            HirExprKind::Method {\r\n                expr: object,\r\n                ref name,\r\n                ref args,\r\n            } if ExprPos::Lhs != pos => {\r\n                let args = args\r\n                    .iter()\r\n                    .map(|e| self.lower_expect_inner(stmt, parser, *e, ExprPos::Rhs, body))\r\n                    .collect::<Result<Vec<_>>>()?;\r\n                match name.as_ref() {\r\n                    \"length\" => {\r\n                        if !args.is_empty() {\r\n                            parser.errors.push(Error {\r\n                                kind: ErrorKind::SemanticError(\r\n                                    \".length() doesn't take any arguments\".into(),\r\n                                ),\r\n                                meta,\r\n                            });\r\n                        }\r\n                        let lowered_array =\r\n                            self.lower_expect_inner(stmt, parser, object, pos, body)?.0;\r\n                        let array_type = parser.resolve_type(self, lowered_array, meta)?;\r\n\r\n                        match *array_type {\r\n                            TypeInner::Array {\r\n                                size: crate::ArraySize::Constant(size),\r\n                                ..\r\n                            } => {\r\n                                let mut array_length =\r\n                                    self.add_expression(Expression::Constant(size), meta, body);\r\n                                self.forced_conversion(\r\n                                    parser,\r\n                                    &mut array_length,\r\n                                    meta,\r\n                                    ScalarKind::Sint,\r\n                                    4,\r\n                                )?;\r\n                                array_length\r\n                            }\r\n                            // let the error be handled in type checking if it's not a dynamic array\r\n                            _ => {\r\n                                let mut array_length = self.add_expression(\r\n                                    Expression::ArrayLength(lowered_array),\r\n                                    meta,\r\n                                    body,\r\n                                );\r\n                                self.conversion(&mut array_length, meta, ScalarKind::Sint, 4)?;\r\n                                array_length\r\n                            }\r\n                        }\r\n                    }\r\n                    _ => {\r\n                        return Err(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                format!(\"unknown method '{}'\", name).into(),\r\n                            ),\r\n                            meta,\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n            _ => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::SemanticError(\r\n                        format!(\"{:?} cannot be in the left hand side\", stmt.hir_exprs[expr])\r\n                            .into(),\r\n                    ),\r\n                    meta,\r\n                })\r\n            }\r\n        };\r\n\r\n        log::trace!(\r\n            \"Lowered {:?}\\n\\tKind = {:?}\\n\\tPos = {:?}\\n\\tResult = {:?}\",\r\n            expr,\r\n            kind,\r\n            pos,\r\n            handle\r\n        );\r\n\r\n        Ok((Some(handle), meta))\r\n    }\r\n\r\n    pub fn expr_scalar_components(\r\n        &mut self,\r\n        parser: &Parser,\r\n        expr: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<Option<(ScalarKind, crate::Bytes)>> {\r\n        let ty = parser.resolve_type(self, expr, meta)?;\r\n        Ok(scalar_components(ty))\r\n    }\r\n\r\n    pub fn expr_power(\r\n        &mut self,\r\n        parser: &Parser,\r\n        expr: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<Option<u32>> {\r\n        Ok(self\r\n            .expr_scalar_components(parser, expr, meta)?\r\n            .and_then(|(kind, width)| type_power(kind, width)))\r\n    }\r\n\r\n    pub fn conversion(\r\n        &mut self,\r\n        expr: &mut Handle<Expression>,\r\n        meta: Span,\r\n        kind: ScalarKind,\r\n        width: crate::Bytes,\r\n    ) -> Result<()> {\r\n        *expr = self.expressions.append(\r\n            Expression::As {\r\n                expr: *expr,\r\n                kind,\r\n                convert: Some(width),\r\n            },\r\n            meta,\r\n        );\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn implicit_conversion(\r\n        &mut self,\r\n        parser: &Parser,\r\n        expr: &mut Handle<Expression>,\r\n        meta: Span,\r\n        kind: ScalarKind,\r\n        width: crate::Bytes,\r\n    ) -> Result<()> {\r\n        if let (Some(tgt_power), Some(expr_power)) = (\r\n            type_power(kind, width),\r\n            self.expr_power(parser, *expr, meta)?,\r\n        ) {\r\n            if tgt_power > expr_power {\r\n                self.conversion(expr, meta, kind, width)?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn forced_conversion(\r\n        &mut self,\r\n        parser: &Parser,\r\n        expr: &mut Handle<Expression>,\r\n        meta: Span,\r\n        kind: ScalarKind,\r\n        width: crate::Bytes,\r\n    ) -> Result<()> {\r\n        if let Some((expr_scalar_kind, expr_width)) =\r\n            self.expr_scalar_components(parser, *expr, meta)?\r\n        {\r\n            if expr_scalar_kind != kind || expr_width != width {\r\n                self.conversion(expr, meta, kind, width)?;\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn binary_implicit_conversion(\r\n        &mut self,\r\n        parser: &Parser,\r\n        left: &mut Handle<Expression>,\r\n        left_meta: Span,\r\n        right: &mut Handle<Expression>,\r\n        right_meta: Span,\r\n    ) -> Result<()> {\r\n        let left_components = self.expr_scalar_components(parser, *left, left_meta)?;\r\n        let right_components = self.expr_scalar_components(parser, *right, right_meta)?;\r\n\r\n        if let (\r\n            Some((left_power, left_width, left_kind)),\r\n            Some((right_power, right_width, right_kind)),\r\n        ) = (\r\n            left_components.and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))),\r\n            right_components\r\n                .and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))),\r\n        ) {\r\n            match left_power.cmp(&right_power) {\r\n                std::cmp::Ordering::Less => {\r\n                    self.conversion(left, left_meta, right_kind, right_width)?;\r\n                }\r\n                std::cmp::Ordering::Equal => {}\r\n                std::cmp::Ordering::Greater => {\r\n                    self.conversion(right, right_meta, left_kind, left_width)?;\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn implicit_splat(\r\n        &mut self,\r\n        parser: &Parser,\r\n        expr: &mut Handle<Expression>,\r\n        meta: Span,\r\n        vector_size: Option<VectorSize>,\r\n    ) -> Result<()> {\r\n        let expr_type = parser.resolve_type(self, *expr, meta)?;\r\n\r\n        if let (&TypeInner::Scalar { .. }, Some(size)) = (expr_type, vector_size) {\r\n            *expr = self\r\n                .expressions\r\n                .append(Expression::Splat { size, value: *expr }, meta)\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn vector_resize(\r\n        &mut self,\r\n        size: VectorSize,\r\n        vector: Handle<Expression>,\r\n        meta: Span,\r\n        body: &mut Block,\r\n    ) -> Handle<Expression> {\r\n        self.add_expression(\r\n            Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern: crate::SwizzleComponent::XYZW,\r\n            },\r\n            meta,\r\n            body,\r\n        )\r\n    }\r\n}\r\n\r\nimpl Index<Handle<Expression>> for Context {\r\n    type Output = Expression;\r\n\r\n    fn index(&self, index: Handle<Expression>) -> &Self::Output {\r\n        &self.expressions[index]\r\n    }\r\n}\r\n\r\n/// Helper struct passed when parsing expressions\r\n///\r\n/// This struct should only be obtained trough [`stmt_ctx`](Context::stmt_ctx)\r\n/// and only one of these may be active at any time per context.\r\n#[derive(Debug)]\r\npub struct StmtContext {\r\n    /// A arena of high level expressions which can be lowered trough a\r\n    /// [`Context`](Context) to naga's [`Expression`](crate::Expression)s\r\n    pub hir_exprs: Arena<HirExpr>,\r\n}\r\n\r\nimpl StmtContext {\r\n    const fn new() -> Self {\r\n        StmtContext {\r\n            hir_exprs: Arena::new(),\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/error.rs",
    "content": "use super::{constants::ConstantSolvingError, token::TokenValue};\r\nuse crate::Span;\r\nuse pp_rs::token::PreprocessorError;\r\nuse std::borrow::Cow;\r\nuse thiserror::Error;\r\n\r\nfn join_with_comma(list: &[ExpectedToken]) -> String {\r\n    let mut string = \"\".to_string();\r\n    for (i, val) in list.iter().enumerate() {\r\n        string.push_str(&val.to_string());\r\n        match i {\r\n            i if i == list.len() - 1 => {}\r\n            i if i == list.len() - 2 => string.push_str(\" or \"),\r\n            _ => string.push_str(\", \"),\r\n        }\r\n    }\r\n    string\r\n}\r\n\r\n/// One of the expected tokens returned in [`InvalidToken`](ErrorKind::InvalidToken).\r\n#[derive(Debug, PartialEq)]\r\npub enum ExpectedToken {\r\n    /// A specific token was expected.\r\n    Token(TokenValue),\r\n    /// A type was expected.\r\n    TypeName,\r\n    /// An identifier was expected.\r\n    Identifier,\r\n    /// An integer literal was expected.\r\n    IntLiteral,\r\n    /// A float literal was expected.\r\n    FloatLiteral,\r\n    /// A boolean literal was expected.\r\n    BoolLiteral,\r\n    /// The end of file was expected.\r\n    Eof,\r\n}\r\nimpl From<TokenValue> for ExpectedToken {\r\n    fn from(token: TokenValue) -> Self {\r\n        ExpectedToken::Token(token)\r\n    }\r\n}\r\nimpl std::fmt::Display for ExpectedToken {\r\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\r\n        match *self {\r\n            ExpectedToken::Token(ref token) => write!(f, \"{:?}\", token),\r\n            ExpectedToken::TypeName => write!(f, \"a type\"),\r\n            ExpectedToken::Identifier => write!(f, \"identifier\"),\r\n            ExpectedToken::IntLiteral => write!(f, \"integer literal\"),\r\n            ExpectedToken::FloatLiteral => write!(f, \"float literal\"),\r\n            ExpectedToken::BoolLiteral => write!(f, \"bool literal\"),\r\n            ExpectedToken::Eof => write!(f, \"end of file\"),\r\n        }\r\n    }\r\n}\r\n\r\n/// Information about the cause of an error.\r\n#[derive(Debug, Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum ErrorKind {\r\n    /// Whilst parsing as encountered an unexpected EOF.\r\n    #[error(\"Unexpected end of file\")]\r\n    EndOfFile,\r\n    /// The shader specified an unsupported or invalid profile.\r\n    #[error(\"Invalid profile: {0}\")]\r\n    InvalidProfile(String),\r\n    /// The shader requested an unsupported or invalid version.\r\n    #[error(\"Invalid version: {0}\")]\r\n    InvalidVersion(u64),\r\n    /// Whilst parsing an unexpected token was encountered.\r\n    ///\r\n    /// A list of expected tokens is also returned.\r\n    #[error(\"Expected {}, found {0:?}\", join_with_comma(.1))]\r\n    InvalidToken(TokenValue, Vec<ExpectedToken>),\r\n    /// A specific feature is not yet implemented.\r\n    ///\r\n    /// To help prioritize work please open an issue in the github issue tracker\r\n    /// if none exist already or react to the already existing one.\r\n    #[error(\"Not implemented: {0}\")]\r\n    NotImplemented(&'static str),\r\n    /// A reference to a variable that wasn't declared was used.\r\n    #[error(\"Unknown variable: {0}\")]\r\n    UnknownVariable(String),\r\n    /// A reference to a type that wasn't declared was used.\r\n    #[error(\"Unknown type: {0}\")]\r\n    UnknownType(String),\r\n    /// A reference to a non existent member of a type was made.\r\n    #[error(\"Unknown field: {0}\")]\r\n    UnknownField(String),\r\n    /// An unknown layout qualifier was used.\r\n    ///\r\n    /// If the qualifier does exist please open an issue in the github issue tracker\r\n    /// if none exist already or react to the already existing one to help\r\n    /// prioritize work.\r\n    #[error(\"Unknown layout qualifier: {0}\")]\r\n    UnknownLayoutQualifier(String),\r\n    /// Unsupported matrix of the form matCx2\r\n    ///\r\n    /// Our IR expects matrices of the form matCx2 to have a stride of 8 however\r\n    /// matrices in the std140 layout have a stride of at least 16\r\n    #[error(\"unsupported matrix of the form matCx2 in std140 block layout\")]\r\n    UnsupportedMatrixTypeInStd140,\r\n    /// A variable with the same name already exists in the current scope.\r\n    #[error(\"Variable already declared: {0}\")]\r\n    VariableAlreadyDeclared(String),\r\n    /// A semantic error was detected in the shader.\r\n    #[error(\"{0}\")]\r\n    SemanticError(Cow<'static, str>),\r\n    /// An error was returned by the preprocessor.\r\n    #[error(\"{0:?}\")]\r\n    PreprocessorError(PreprocessorError),\r\n    /// The parser entered an illegal state and exited\r\n    ///\r\n    /// This obviously is a bug and as such should be reported in the github issue tracker\r\n    #[error(\"Internal error: {0}\")]\r\n    InternalError(&'static str),\r\n}\r\n\r\nimpl From<ConstantSolvingError> for ErrorKind {\r\n    fn from(err: ConstantSolvingError) -> Self {\r\n        ErrorKind::SemanticError(err.to_string().into())\r\n    }\r\n}\r\n\r\n/// Error returned during shader parsing.\r\n#[derive(Debug, Error)]\r\n#[error(\"{kind}\")]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub struct Error {\r\n    /// Holds the information about the error itself.\r\n    pub kind: ErrorKind,\r\n    /// Holds information about the range of the source code where the error happened.\r\n    pub meta: Span,\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/functions.rs",
    "content": "use super::{\r\n    ast::*,\r\n    builtins::{inject_builtin, sampled_to_depth},\r\n    context::{Context, ExprPos, StmtContext},\r\n    error::{Error, ErrorKind},\r\n    types::scalar_components,\r\n    Parser, Result,\r\n};\r\nuse crate::{\r\n    front::glsl::types::type_power, proc::ensure_block_returns, AddressSpace, Arena, Block,\r\n    Constant, ConstantInner, EntryPoint, Expression, FastHashMap, Function, FunctionArgument,\r\n    FunctionResult, Handle, LocalVariable, ScalarKind, ScalarValue, Span, Statement, StructMember,\r\n    Type, TypeInner,\r\n};\r\nuse std::iter;\r\n\r\nimpl Parser {\r\n    fn add_constant_value(\r\n        &mut self,\r\n        scalar_kind: ScalarKind,\r\n        value: u64,\r\n        meta: Span,\r\n    ) -> Handle<Constant> {\r\n        let value = match scalar_kind {\r\n            ScalarKind::Uint => ScalarValue::Uint(value),\r\n            ScalarKind::Sint => ScalarValue::Sint(value as i64),\r\n            ScalarKind::Float => ScalarValue::Float(value as f64),\r\n            _ => unreachable!(),\r\n        };\r\n\r\n        self.module.constants.fetch_or_append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Scalar { width: 4, value },\r\n            },\r\n            meta,\r\n        )\r\n    }\r\n\r\n    pub(crate) fn function_or_constructor_call(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        stmt: &StmtContext,\r\n        body: &mut Block,\r\n        fc: FunctionCallKind,\r\n        raw_args: &[Handle<HirExpr>],\r\n        meta: Span,\r\n    ) -> Result<Option<Handle<Expression>>> {\r\n        let args: Vec<_> = raw_args\r\n            .iter()\r\n            .map(|e| ctx.lower_expect_inner(stmt, self, *e, ExprPos::Rhs, body))\r\n            .collect::<Result<_>>()?;\r\n\r\n        match fc {\r\n            FunctionCallKind::TypeConstructor(ty) => {\r\n                if args.len() == 1 {\r\n                    self.constructor_single(ctx, body, ty, args[0], meta)\r\n                        .map(Some)\r\n                } else {\r\n                    self.constructor_many(ctx, body, ty, args, meta).map(Some)\r\n                }\r\n            }\r\n            FunctionCallKind::Function(name) => {\r\n                self.function_call(ctx, stmt, body, name, args, raw_args, meta)\r\n            }\r\n        }\r\n    }\r\n\r\n    fn constructor_single(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        ty: Handle<Type>,\r\n        (mut value, expr_meta): (Handle<Expression>, Span),\r\n        meta: Span,\r\n    ) -> Result<Handle<Expression>> {\r\n        let expr_type = self.resolve_type(ctx, value, expr_meta)?;\r\n\r\n        let vector_size = match *expr_type {\r\n            TypeInner::Vector { size, .. } => Some(size),\r\n            _ => None,\r\n        };\r\n\r\n        // Special case: if casting from a bool, we need to use Select and not As.\r\n        match self.module.types[ty].inner.scalar_kind() {\r\n            Some(result_scalar_kind)\r\n                if expr_type.scalar_kind() == Some(ScalarKind::Bool)\r\n                    && result_scalar_kind != ScalarKind::Bool =>\r\n            {\r\n                let c0 = self.add_constant_value(result_scalar_kind, 0u64, meta);\r\n                let c1 = self.add_constant_value(result_scalar_kind, 1u64, meta);\r\n                let mut reject = ctx.add_expression(Expression::Constant(c0), expr_meta, body);\r\n                let mut accept = ctx.add_expression(Expression::Constant(c1), expr_meta, body);\r\n\r\n                ctx.implicit_splat(self, &mut reject, meta, vector_size)?;\r\n                ctx.implicit_splat(self, &mut accept, meta, vector_size)?;\r\n\r\n                let h = ctx.add_expression(\r\n                    Expression::Select {\r\n                        accept,\r\n                        reject,\r\n                        condition: value,\r\n                    },\r\n                    expr_meta,\r\n                    body,\r\n                );\r\n\r\n                return Ok(h);\r\n            }\r\n            _ => {}\r\n        }\r\n\r\n        Ok(match self.module.types[ty].inner {\r\n            TypeInner::Vector { size, kind, width } if vector_size.is_none() => {\r\n                ctx.forced_conversion(self, &mut value, expr_meta, kind, width)?;\r\n\r\n                if let TypeInner::Scalar { .. } = *self.resolve_type(ctx, value, expr_meta)? {\r\n                    ctx.add_expression(Expression::Splat { size, value }, meta, body)\r\n                } else {\r\n                    self.vector_constructor(\r\n                        ctx,\r\n                        body,\r\n                        ty,\r\n                        size,\r\n                        kind,\r\n                        width,\r\n                        &[(value, expr_meta)],\r\n                        meta,\r\n                    )?\r\n                }\r\n            }\r\n            TypeInner::Scalar { kind, width } => {\r\n                let mut expr = value;\r\n                if let TypeInner::Vector { .. } | TypeInner::Matrix { .. } =\r\n                    *self.resolve_type(ctx, value, expr_meta)?\r\n                {\r\n                    expr = ctx.add_expression(\r\n                        Expression::AccessIndex {\r\n                            base: expr,\r\n                            index: 0,\r\n                        },\r\n                        meta,\r\n                        body,\r\n                    );\r\n                }\r\n\r\n                if let TypeInner::Matrix { .. } = *self.resolve_type(ctx, value, expr_meta)? {\r\n                    expr = ctx.add_expression(\r\n                        Expression::AccessIndex {\r\n                            base: expr,\r\n                            index: 0,\r\n                        },\r\n                        meta,\r\n                        body,\r\n                    );\r\n                }\r\n\r\n                ctx.add_expression(\r\n                    Expression::As {\r\n                        kind,\r\n                        expr,\r\n                        convert: Some(width),\r\n                    },\r\n                    meta,\r\n                    body,\r\n                )\r\n            }\r\n            TypeInner::Vector { size, kind, width } => {\r\n                if vector_size.map_or(true, |s| s != size) {\r\n                    value = ctx.vector_resize(size, value, expr_meta, body);\r\n                }\r\n\r\n                ctx.add_expression(\r\n                    Expression::As {\r\n                        kind,\r\n                        expr: value,\r\n                        convert: Some(width),\r\n                    },\r\n                    meta,\r\n                    body,\r\n                )\r\n            }\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => self.matrix_one_arg(\r\n                ctx,\r\n                body,\r\n                ty,\r\n                columns,\r\n                rows,\r\n                width,\r\n                (value, expr_meta),\r\n                meta,\r\n            )?,\r\n            TypeInner::Struct { ref members, .. } => {\r\n                let scalar_components = members\r\n                    .get(0)\r\n                    .and_then(|member| scalar_components(&self.module.types[member.ty].inner));\r\n                if let Some((kind, width)) = scalar_components {\r\n                    ctx.implicit_conversion(self, &mut value, expr_meta, kind, width)?;\r\n                }\r\n\r\n                ctx.add_expression(\r\n                    Expression::Compose {\r\n                        ty,\r\n                        components: vec![value],\r\n                    },\r\n                    meta,\r\n                    body,\r\n                )\r\n            }\r\n\r\n            TypeInner::Array { base, .. } => {\r\n                let scalar_components = scalar_components(&self.module.types[base].inner);\r\n                if let Some((kind, width)) = scalar_components {\r\n                    ctx.implicit_conversion(self, &mut value, expr_meta, kind, width)?;\r\n                }\r\n\r\n                ctx.add_expression(\r\n                    Expression::Compose {\r\n                        ty,\r\n                        components: vec![value],\r\n                    },\r\n                    meta,\r\n                    body,\r\n                )\r\n            }\r\n            _ => {\r\n                self.errors.push(Error {\r\n                    kind: ErrorKind::SemanticError(\"Bad type constructor\".into()),\r\n                    meta,\r\n                });\r\n\r\n                value\r\n            }\r\n        })\r\n    }\r\n\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn matrix_one_arg(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        ty: Handle<Type>,\r\n        columns: crate::VectorSize,\r\n        rows: crate::VectorSize,\r\n        width: crate::Bytes,\r\n        (mut value, expr_meta): (Handle<Expression>, Span),\r\n        meta: Span,\r\n    ) -> Result<Handle<Expression>> {\r\n        let mut components = Vec::with_capacity(columns as usize);\r\n        // TODO: casts\r\n        // `Expression::As` doesn't support matrix width\r\n        // casts so we need to do some extra work for casts\r\n\r\n        ctx.forced_conversion(self, &mut value, expr_meta, ScalarKind::Float, width)?;\r\n        match *self.resolve_type(ctx, value, expr_meta)? {\r\n            TypeInner::Scalar { .. } => {\r\n                // If a matrix is constructed with a single scalar value, then that\r\n                // value is used to initialize all the values along the diagonal of\r\n                // the matrix; the rest are given zeros.\r\n                let vector_ty = self.module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: TypeInner::Vector {\r\n                            size: rows,\r\n                            kind: ScalarKind::Float,\r\n                            width,\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n                let zero_constant = self.module.constants.fetch_or_append(\r\n                    Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner: ConstantInner::Scalar {\r\n                            width,\r\n                            value: ScalarValue::Float(0.0),\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n                let zero = ctx.add_expression(Expression::Constant(zero_constant), meta, body);\r\n\r\n                for i in 0..columns as u32 {\r\n                    components.push(\r\n                        ctx.add_expression(\r\n                            Expression::Compose {\r\n                                ty: vector_ty,\r\n                                components: (0..rows as u32)\r\n                                    .into_iter()\r\n                                    .map(|r| match r == i {\r\n                                        true => value,\r\n                                        false => zero,\r\n                                    })\r\n                                    .collect(),\r\n                            },\r\n                            meta,\r\n                            body,\r\n                        ),\r\n                    )\r\n                }\r\n            }\r\n            TypeInner::Matrix {\r\n                rows: ori_rows,\r\n                columns: ori_cols,\r\n                ..\r\n            } => {\r\n                // If a matrix is constructed from a matrix, then each component\r\n                // (column i, row j) in the result that has a corresponding component\r\n                // (column i, row j) in the argument will be initialized from there. All\r\n                // other components will be initialized to the identity matrix.\r\n\r\n                let zero_constant = self.module.constants.fetch_or_append(\r\n                    Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner: ConstantInner::Scalar {\r\n                            width,\r\n                            value: ScalarValue::Float(0.0),\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n                let zero = ctx.add_expression(Expression::Constant(zero_constant), meta, body);\r\n                let one_constant = self.module.constants.fetch_or_append(\r\n                    Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner: ConstantInner::Scalar {\r\n                            width,\r\n                            value: ScalarValue::Float(1.0),\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n                let one = ctx.add_expression(Expression::Constant(one_constant), meta, body);\r\n                let vector_ty = self.module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: TypeInner::Vector {\r\n                            size: rows,\r\n                            kind: ScalarKind::Float,\r\n                            width,\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                for i in 0..columns as u32 {\r\n                    if i < ori_cols as u32 {\r\n                        use std::cmp::Ordering;\r\n\r\n                        let vector = ctx.add_expression(\r\n                            Expression::AccessIndex {\r\n                                base: value,\r\n                                index: i,\r\n                            },\r\n                            meta,\r\n                            body,\r\n                        );\r\n\r\n                        components.push(match ori_rows.cmp(&rows) {\r\n                            Ordering::Less => {\r\n                                let components = (0..rows as u32)\r\n                                    .into_iter()\r\n                                    .map(|r| {\r\n                                        if r < ori_rows as u32 {\r\n                                            ctx.add_expression(\r\n                                                Expression::AccessIndex {\r\n                                                    base: vector,\r\n                                                    index: r,\r\n                                                },\r\n                                                meta,\r\n                                                body,\r\n                                            )\r\n                                        } else if r == i {\r\n                                            one\r\n                                        } else {\r\n                                            zero\r\n                                        }\r\n                                    })\r\n                                    .collect();\r\n\r\n                                ctx.add_expression(\r\n                                    Expression::Compose {\r\n                                        ty: vector_ty,\r\n                                        components,\r\n                                    },\r\n                                    meta,\r\n                                    body,\r\n                                )\r\n                            }\r\n                            Ordering::Equal => vector,\r\n                            Ordering::Greater => ctx.vector_resize(rows, vector, meta, body),\r\n                        })\r\n                    } else {\r\n                        let vec_constant = self.module.constants.fetch_or_append(\r\n                            Constant {\r\n                                name: None,\r\n                                specialization: None,\r\n                                inner: ConstantInner::Composite {\r\n                                    ty: vector_ty,\r\n                                    components: (0..rows as u32)\r\n                                        .into_iter()\r\n                                        .map(|r| match r == i {\r\n                                            true => one_constant,\r\n                                            false => zero_constant,\r\n                                        })\r\n                                        .collect(),\r\n                                },\r\n                            },\r\n                            meta,\r\n                        );\r\n                        let vec =\r\n                            ctx.add_expression(Expression::Constant(vec_constant), meta, body);\r\n\r\n                        components.push(vec)\r\n                    }\r\n                }\r\n            }\r\n            _ => {\r\n                components = iter::repeat(value).take(columns as usize).collect();\r\n            }\r\n        }\r\n\r\n        Ok(ctx.add_expression(Expression::Compose { ty, components }, meta, body))\r\n    }\r\n\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn vector_constructor(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        ty: Handle<Type>,\r\n        size: crate::VectorSize,\r\n        kind: ScalarKind,\r\n        width: crate::Bytes,\r\n        args: &[(Handle<Expression>, Span)],\r\n        meta: Span,\r\n    ) -> Result<Handle<Expression>> {\r\n        let mut components = Vec::with_capacity(size as usize);\r\n\r\n        for (mut arg, expr_meta) in args.iter().copied() {\r\n            ctx.forced_conversion(self, &mut arg, expr_meta, kind, width)?;\r\n\r\n            if components.len() >= size as usize {\r\n                break;\r\n            }\r\n\r\n            match *self.resolve_type(ctx, arg, expr_meta)? {\r\n                TypeInner::Scalar { .. } => components.push(arg),\r\n                TypeInner::Matrix { rows, columns, .. } => {\r\n                    components.reserve(rows as usize * columns as usize);\r\n                    for c in 0..(columns as u32) {\r\n                        let base = ctx.add_expression(\r\n                            Expression::AccessIndex {\r\n                                base: arg,\r\n                                index: c,\r\n                            },\r\n                            expr_meta,\r\n                            body,\r\n                        );\r\n                        for r in 0..(rows as u32) {\r\n                            components.push(ctx.add_expression(\r\n                                Expression::AccessIndex { base, index: r },\r\n                                expr_meta,\r\n                                body,\r\n                            ))\r\n                        }\r\n                    }\r\n                }\r\n                TypeInner::Vector { size: ori_size, .. } => {\r\n                    components.reserve(ori_size as usize);\r\n                    for index in 0..(ori_size as u32) {\r\n                        components.push(ctx.add_expression(\r\n                            Expression::AccessIndex { base: arg, index },\r\n                            expr_meta,\r\n                            body,\r\n                        ))\r\n                    }\r\n                }\r\n                _ => components.push(arg),\r\n            }\r\n        }\r\n\r\n        components.truncate(size as usize);\r\n\r\n        Ok(ctx.add_expression(Expression::Compose { ty, components }, meta, body))\r\n    }\r\n\r\n    fn constructor_many(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        ty: Handle<Type>,\r\n        args: Vec<(Handle<Expression>, Span)>,\r\n        meta: Span,\r\n    ) -> Result<Handle<Expression>> {\r\n        let mut components = Vec::with_capacity(args.len());\r\n\r\n        match self.module.types[ty].inner {\r\n            TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                let mut flattened = Vec::with_capacity(columns as usize * rows as usize);\r\n\r\n                for (mut arg, meta) in args.iter().copied() {\r\n                    ctx.forced_conversion(self, &mut arg, meta, ScalarKind::Float, width)?;\r\n\r\n                    match *self.resolve_type(ctx, arg, meta)? {\r\n                        TypeInner::Vector { size, .. } => {\r\n                            for i in 0..(size as u32) {\r\n                                flattened.push(ctx.add_expression(\r\n                                    Expression::AccessIndex {\r\n                                        base: arg,\r\n                                        index: i,\r\n                                    },\r\n                                    meta,\r\n                                    body,\r\n                                ))\r\n                            }\r\n                        }\r\n                        _ => flattened.push(arg),\r\n                    }\r\n                }\r\n\r\n                let ty = self.module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: TypeInner::Vector {\r\n                            size: rows,\r\n                            kind: ScalarKind::Float,\r\n                            width,\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                for chunk in flattened.chunks(rows as usize) {\r\n                    components.push(ctx.add_expression(\r\n                        Expression::Compose {\r\n                            ty,\r\n                            components: Vec::from(chunk),\r\n                        },\r\n                        meta,\r\n                        body,\r\n                    ))\r\n                }\r\n            }\r\n            TypeInner::Vector { size, kind, width } => {\r\n                return self.vector_constructor(ctx, body, ty, size, kind, width, &args, meta)\r\n            }\r\n            TypeInner::Array { base, .. } => {\r\n                for (mut arg, meta) in args.iter().copied() {\r\n                    let scalar_components = scalar_components(&self.module.types[base].inner);\r\n                    if let Some((kind, width)) = scalar_components {\r\n                        ctx.implicit_conversion(self, &mut arg, meta, kind, width)?;\r\n                    }\r\n\r\n                    components.push(arg)\r\n                }\r\n            }\r\n            TypeInner::Struct { ref members, .. } => {\r\n                for ((mut arg, meta), member) in args.iter().copied().zip(members.iter()) {\r\n                    let scalar_components = scalar_components(&self.module.types[member.ty].inner);\r\n                    if let Some((kind, width)) = scalar_components {\r\n                        ctx.implicit_conversion(self, &mut arg, meta, kind, width)?;\r\n                    }\r\n\r\n                    components.push(arg)\r\n                }\r\n            }\r\n            _ => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::SemanticError(\"Constructor: Too many arguments\".into()),\r\n                    meta,\r\n                })\r\n            }\r\n        }\r\n\r\n        Ok(ctx.add_expression(Expression::Compose { ty, components }, meta, body))\r\n    }\r\n\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn function_call(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        stmt: &StmtContext,\r\n        body: &mut Block,\r\n        name: String,\r\n        args: Vec<(Handle<Expression>, Span)>,\r\n        raw_args: &[Handle<HirExpr>],\r\n        meta: Span,\r\n    ) -> Result<Option<Handle<Expression>>> {\r\n        // Grow the typifier to be able to index it later without needing\r\n        // to hold the context mutably\r\n        for &(expr, span) in args.iter() {\r\n            self.typifier_grow(ctx, expr, span)?;\r\n        }\r\n\r\n        // Check if the passed arguments require any special variations\r\n        let mut variations = builtin_required_variations(\r\n            args.iter()\r\n                .map(|&(expr, _)| ctx.typifier.get(expr, &self.module.types)),\r\n        );\r\n\r\n        // Initiate the declaration if it wasn't previously initialized and inject builtins\r\n        let declaration = self.lookup_function.entry(name.clone()).or_insert_with(|| {\r\n            variations |= BuiltinVariations::STANDARD;\r\n            Default::default()\r\n        });\r\n        inject_builtin(declaration, &mut self.module, &name, variations);\r\n\r\n        // Borrow again but without mutability, at this point a declaration is guaranteed\r\n        let declaration = self.lookup_function.get(&name).unwrap();\r\n\r\n        // Possibly contains the overload to be used in the call\r\n        let mut maybe_overload = None;\r\n        // The conversions needed for the best analyzed overload, this is initialized all to\r\n        // `NONE` to make sure that conversions always pass the first time without ambiguity\r\n        let mut old_conversions = vec![Conversion::None; args.len()];\r\n        // Tracks whether the comparison between overloads lead to an ambiguity\r\n        let mut ambiguous = false;\r\n\r\n        // Iterate over all the available overloads to select either an exact match or a\r\n        // overload which has suitable implicit conversions\r\n        'outer: for overload in declaration.overloads.iter() {\r\n            // If the overload and the function call don't have the same number of arguments\r\n            // continue to the next overload\r\n            if args.len() != overload.parameters.len() {\r\n                continue;\r\n            }\r\n\r\n            // Stores whether the current overload matches exactly the function call\r\n            let mut exact = true;\r\n            // State of the selection\r\n            // If None we still don't know what is the best overload\r\n            // If Some(true) the new overload is better\r\n            // If Some(false) the old overload is better\r\n            let mut superior = None;\r\n            // Store the conversions for the current overload so that later they can replace the\r\n            // conversions used for querying the best overload\r\n            let mut new_conversions = vec![Conversion::None; args.len()];\r\n\r\n            // Loop trough the overload parameters and check if the current overload is better\r\n            // compared to the previous best overload.\r\n            for (i, overload_parameter) in overload.parameters.iter().enumerate() {\r\n                let call_argument = &args[i];\r\n                let parameter_info = &overload.parameters_info[i];\r\n\r\n                // If the image is used in the overload as a depth texture convert it\r\n                // before comparing, otherwise exact matches wouldn't be reported\r\n                if parameter_info.depth {\r\n                    sampled_to_depth(\r\n                        &mut self.module,\r\n                        ctx,\r\n                        call_argument.0,\r\n                        call_argument.1,\r\n                        &mut self.errors,\r\n                    );\r\n                    self.invalidate_expression(ctx, call_argument.0, call_argument.1)?\r\n                }\r\n\r\n                let overload_param_ty = &self.module.types[*overload_parameter].inner;\r\n                let call_arg_ty = self.resolve_type(ctx, call_argument.0, call_argument.1)?;\r\n\r\n                log::trace!(\r\n                    \"Testing parameter {}\\n\\tOverload = {:?}\\n\\tCall = {:?}\",\r\n                    i,\r\n                    overload_param_ty,\r\n                    call_arg_ty\r\n                );\r\n\r\n                // Storage images cannot be directly compared since while the access is part of the\r\n                // type in naga's IR, in glsl they are a qualifier and don't enter in the match as\r\n                // long as the access needed is satisfied.\r\n                if let (\r\n                    &TypeInner::Image {\r\n                        class:\r\n                            crate::ImageClass::Storage {\r\n                                format: overload_format,\r\n                                access: overload_access,\r\n                            },\r\n                        dim: overload_dim,\r\n                        arrayed: overload_arrayed,\r\n                    },\r\n                    &TypeInner::Image {\r\n                        class:\r\n                            crate::ImageClass::Storage {\r\n                                format: call_format,\r\n                                access: call_access,\r\n                            },\r\n                        dim: call_dim,\r\n                        arrayed: call_arrayed,\r\n                    },\r\n                ) = (overload_param_ty, call_arg_ty)\r\n                {\r\n                    // Images size must match otherwise the overload isn't what we want\r\n                    let good_size = call_dim == overload_dim && call_arrayed == overload_arrayed;\r\n                    // Glsl requires the formats to strictly match unless you are builtin\r\n                    // function overload and have not been replaced, in which case we only\r\n                    // check that the format scalar kind matches\r\n                    let good_format = overload_format == call_format\r\n                        || (overload.internal\r\n                            && ScalarKind::from(overload_format) == ScalarKind::from(call_format));\r\n                    if !(good_size && good_format) {\r\n                        continue 'outer;\r\n                    }\r\n\r\n                    // While storage access mismatch is an error it isn't one that causes\r\n                    // the overload matching to fail so we defer the error and consider\r\n                    // that the images match exactly\r\n                    if !call_access.contains(overload_access) {\r\n                        self.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                format!(\r\n                                    \"'{}': image needs {:?} access but only {:?} was provided\",\r\n                                    name, overload_access, call_access\r\n                                )\r\n                                .into(),\r\n                            ),\r\n                            meta,\r\n                        });\r\n                    }\r\n\r\n                    // The images satisfy the conditions to be considered as an exact match\r\n                    new_conversions[i] = Conversion::Exact;\r\n                    continue;\r\n                } else if overload_param_ty == call_arg_ty {\r\n                    // If the types match there's no need to check for conversions so continue\r\n                    new_conversions[i] = Conversion::Exact;\r\n                    continue;\r\n                }\r\n\r\n                // If the argument is to be passed as a pointer (i.e. either `out` or\r\n                // `inout` where used as qualifiers) no conversion shall be performed\r\n                if parameter_info.qualifier.is_lhs() {\r\n                    continue 'outer;\r\n                }\r\n\r\n                // Try to get the type of conversion needed otherwise this overload can't be used\r\n                // since no conversion makes it possible so skip it\r\n                let conversion = match conversion(overload_param_ty, call_arg_ty) {\r\n                    Some(info) => info,\r\n                    None => continue 'outer,\r\n                };\r\n\r\n                // At this point a conversion will be needed so the overload no longer\r\n                // exactly matches the call arguments\r\n                exact = false;\r\n\r\n                // Compare the conversions needed for this overload parameter to that of the\r\n                // last overload analyzed respective parameter, the value is:\r\n                // - `true` when the new overload argument has a better conversion\r\n                // - `false` when the old overload argument has a better conversion\r\n                let best_arg = match (conversion, old_conversions[i]) {\r\n                    // An exact match is always better, we don't need to check this for the\r\n                    // current overload since it was checked earlier\r\n                    (_, Conversion::Exact) => false,\r\n                    // No overload was yet analyzed so this one is the best yet\r\n                    (_, Conversion::None) => true,\r\n                    // A conversion from a float to a double is the best possible conversion\r\n                    (Conversion::FloatToDouble, _) => true,\r\n                    (_, Conversion::FloatToDouble) => false,\r\n                    // A conversion from a float to an integer is preferred than one\r\n                    // from double to an integer\r\n                    (Conversion::IntToFloat, Conversion::IntToDouble) => true,\r\n                    (Conversion::IntToDouble, Conversion::IntToFloat) => false,\r\n                    // This case handles things like no conversion and exact which were already\r\n                    // treated and other cases which no conversion is better than the other\r\n                    _ => continue,\r\n                };\r\n\r\n                // Check if the best parameter corresponds to the current selected overload\r\n                // to pass to the next comparison, if this isn't true mark it as ambiguous\r\n                match best_arg {\r\n                    true => match superior {\r\n                        Some(false) => ambiguous = true,\r\n                        _ => {\r\n                            superior = Some(true);\r\n                            new_conversions[i] = conversion\r\n                        }\r\n                    },\r\n                    false => match superior {\r\n                        Some(true) => ambiguous = true,\r\n                        _ => superior = Some(false),\r\n                    },\r\n                }\r\n            }\r\n\r\n            // The overload matches exactly the function call so there's no ambiguity (since\r\n            // repeated overload aren't allowed) and the current overload is selected, no\r\n            // further querying is needed.\r\n            if exact {\r\n                maybe_overload = Some(overload);\r\n                ambiguous = false;\r\n                break;\r\n            }\r\n\r\n            match superior {\r\n                // New overload is better keep it\r\n                Some(true) => {\r\n                    maybe_overload = Some(overload);\r\n                    // Replace the conversions\r\n                    old_conversions = new_conversions;\r\n                }\r\n                // Old overload is better do nothing\r\n                Some(false) => {}\r\n                // No overload was better than the other this can be caused\r\n                // when all conversions are ambiguous in which the overloads themselves are\r\n                // ambiguous.\r\n                None => {\r\n                    ambiguous = true;\r\n                    // Assign the new overload, this helps ensures that in this case of\r\n                    // ambiguity the parsing won't end immediately and allow for further\r\n                    // collection of errors.\r\n                    maybe_overload = Some(overload);\r\n                }\r\n            }\r\n        }\r\n\r\n        if ambiguous {\r\n            self.errors.push(Error {\r\n                kind: ErrorKind::SemanticError(\r\n                    format!(\"Ambiguous best function for '{}'\", name).into(),\r\n                ),\r\n                meta,\r\n            })\r\n        }\r\n\r\n        let overload = maybe_overload.ok_or_else(|| Error {\r\n            kind: ErrorKind::SemanticError(format!(\"Unknown function '{}'\", name).into()),\r\n            meta,\r\n        })?;\r\n\r\n        let parameters_info = overload.parameters_info.clone();\r\n        let parameters = overload.parameters.clone();\r\n        let is_void = overload.void;\r\n        let kind = overload.kind;\r\n\r\n        let mut arguments = Vec::with_capacity(args.len());\r\n        let mut proxy_writes = Vec::new();\r\n        // Iterate trough the function call arguments applying transformations as needed\r\n        for (parameter_info, (expr, parameter)) in parameters_info\r\n            .iter()\r\n            .zip(raw_args.iter().zip(parameters.iter()))\r\n        {\r\n            let (mut handle, meta) =\r\n                ctx.lower_expect_inner(stmt, self, *expr, parameter_info.qualifier.as_pos(), body)?;\r\n\r\n            if parameter_info.qualifier.is_lhs() {\r\n                let (ty, value) = match *self.resolve_type(ctx, handle, meta)? {\r\n                    // If the argument is to be passed as a pointer but the type of the\r\n                    // expression returns a vector it must mean that it was for example\r\n                    // swizzled and it must be spilled into a local before calling\r\n                    TypeInner::Vector { size, kind, width } => (\r\n                        self.module.types.insert(\r\n                            Type {\r\n                                name: None,\r\n                                inner: TypeInner::Vector { size, kind, width },\r\n                            },\r\n                            Span::default(),\r\n                        ),\r\n                        handle,\r\n                    ),\r\n                    // If the argument is a pointer whose address space isn't `Function`, an\r\n                    // indirection through a local variable is needed to align the address\r\n                    // spaces of the call argument and the overload parameter.\r\n                    TypeInner::Pointer { base, space } if space != AddressSpace::Function => (\r\n                        base,\r\n                        ctx.add_expression(\r\n                            Expression::Load { pointer: handle },\r\n                            Span::default(),\r\n                            body,\r\n                        ),\r\n                    ),\r\n                    TypeInner::ValuePointer {\r\n                        size,\r\n                        kind,\r\n                        width,\r\n                        space,\r\n                    } if space != AddressSpace::Function => {\r\n                        let inner = match size {\r\n                            Some(size) => TypeInner::Vector { size, kind, width },\r\n                            None => TypeInner::Scalar { kind, width },\r\n                        };\r\n\r\n                        (\r\n                            self.module\r\n                                .types\r\n                                .insert(Type { name: None, inner }, Span::default()),\r\n                            ctx.add_expression(\r\n                                Expression::Load { pointer: handle },\r\n                                Span::default(),\r\n                                body,\r\n                            ),\r\n                        )\r\n                    }\r\n                    _ => {\r\n                        arguments.push(handle);\r\n                        continue;\r\n                    }\r\n                };\r\n\r\n                let temp_var = ctx.locals.append(\r\n                    LocalVariable {\r\n                        name: None,\r\n                        ty,\r\n                        init: None,\r\n                    },\r\n                    Span::default(),\r\n                );\r\n                let temp_expr =\r\n                    ctx.add_expression(Expression::LocalVariable(temp_var), Span::default(), body);\r\n\r\n                body.push(\r\n                    Statement::Store {\r\n                        pointer: temp_expr,\r\n                        value,\r\n                    },\r\n                    Span::default(),\r\n                );\r\n\r\n                arguments.push(temp_expr);\r\n                // Register the temporary local to be written back to it's original\r\n                // place after the function call\r\n                if let Expression::Swizzle {\r\n                    size,\r\n                    mut vector,\r\n                    pattern,\r\n                } = ctx.expressions[value]\r\n                {\r\n                    if let Expression::Load { pointer } = ctx.expressions[vector] {\r\n                        vector = pointer;\r\n                    }\r\n\r\n                    for (i, component) in pattern.iter().take(size as usize).enumerate() {\r\n                        let original = ctx.add_expression(\r\n                            Expression::AccessIndex {\r\n                                base: vector,\r\n                                index: *component as u32,\r\n                            },\r\n                            Span::default(),\r\n                            body,\r\n                        );\r\n\r\n                        let temp = ctx.add_expression(\r\n                            Expression::AccessIndex {\r\n                                base: temp_expr,\r\n                                index: i as u32,\r\n                            },\r\n                            Span::default(),\r\n                            body,\r\n                        );\r\n\r\n                        proxy_writes.push((original, temp));\r\n                    }\r\n                } else {\r\n                    proxy_writes.push((handle, temp_expr));\r\n                }\r\n                continue;\r\n            }\r\n\r\n            // Apply implicit conversions as needed\r\n            let scalar_components = scalar_components(&self.module.types[*parameter].inner);\r\n            if let Some((kind, width)) = scalar_components {\r\n                ctx.implicit_conversion(self, &mut handle, meta, kind, width)?;\r\n            }\r\n\r\n            arguments.push(handle)\r\n        }\r\n\r\n        match kind {\r\n            FunctionKind::Call(function) => {\r\n                ctx.emit_end(body);\r\n\r\n                let result = if !is_void {\r\n                    Some(ctx.add_expression(Expression::CallResult(function), meta, body))\r\n                } else {\r\n                    None\r\n                };\r\n\r\n                body.push(\r\n                    crate::Statement::Call {\r\n                        function,\r\n                        arguments,\r\n                        result,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                ctx.emit_start();\r\n\r\n                // Write back all the variables that were scheduled to their original place\r\n                for (original, pointer) in proxy_writes {\r\n                    let value = ctx.add_expression(Expression::Load { pointer }, meta, body);\r\n\r\n                    ctx.emit_restart(body);\r\n\r\n                    body.push(\r\n                        Statement::Store {\r\n                            pointer: original,\r\n                            value,\r\n                        },\r\n                        meta,\r\n                    );\r\n                }\r\n\r\n                Ok(result)\r\n            }\r\n            FunctionKind::Macro(builtin) => {\r\n                builtin.call(self, ctx, body, arguments.as_mut_slice(), meta)\r\n            }\r\n        }\r\n    }\r\n\r\n    pub(crate) fn add_function(\r\n        &mut self,\r\n        ctx: Context,\r\n        name: String,\r\n        result: Option<FunctionResult>,\r\n        mut body: Block,\r\n        meta: Span,\r\n    ) {\r\n        ensure_block_returns(&mut body);\r\n\r\n        let void = result.is_none();\r\n\r\n        let &mut Parser {\r\n            ref mut lookup_function,\r\n            ref mut module,\r\n            ..\r\n        } = self;\r\n\r\n        // Check if the passed arguments require any special variations\r\n        let mut variations =\r\n            builtin_required_variations(ctx.parameters.iter().map(|&arg| &module.types[arg].inner));\r\n\r\n        // Initiate the declaration if it wasn't previously initialized and inject builtins\r\n        let declaration = lookup_function.entry(name.clone()).or_insert_with(|| {\r\n            variations |= BuiltinVariations::STANDARD;\r\n            Default::default()\r\n        });\r\n        inject_builtin(declaration, module, &name, variations);\r\n\r\n        let Context {\r\n            expressions,\r\n            locals,\r\n            arguments,\r\n            parameters,\r\n            parameters_info,\r\n            ..\r\n        } = ctx;\r\n\r\n        let function = Function {\r\n            name: Some(name),\r\n            arguments,\r\n            result,\r\n            local_variables: locals,\r\n            expressions,\r\n            named_expressions: FastHashMap::default(),\r\n            body,\r\n        };\r\n\r\n        'outer: for decl in declaration.overloads.iter_mut() {\r\n            if parameters.len() != decl.parameters.len() {\r\n                continue;\r\n            }\r\n\r\n            for (new_parameter, old_parameter) in parameters.iter().zip(decl.parameters.iter()) {\r\n                let new_inner = &module.types[*new_parameter].inner;\r\n                let old_inner = &module.types[*old_parameter].inner;\r\n\r\n                if new_inner != old_inner {\r\n                    continue 'outer;\r\n                }\r\n            }\r\n\r\n            if decl.defined {\r\n                return self.errors.push(Error {\r\n                    kind: ErrorKind::SemanticError(\"Function already defined\".into()),\r\n                    meta,\r\n                });\r\n            }\r\n\r\n            decl.defined = true;\r\n            decl.parameters_info = parameters_info;\r\n            match decl.kind {\r\n                FunctionKind::Call(handle) => *self.module.functions.get_mut(handle) = function,\r\n                FunctionKind::Macro(_) => {\r\n                    let handle = module.functions.append(function, meta);\r\n                    decl.kind = FunctionKind::Call(handle)\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let handle = module.functions.append(function, meta);\r\n        declaration.overloads.push(Overload {\r\n            parameters,\r\n            parameters_info,\r\n            kind: FunctionKind::Call(handle),\r\n            defined: true,\r\n            internal: false,\r\n            void,\r\n        });\r\n    }\r\n\r\n    pub(crate) fn add_prototype(\r\n        &mut self,\r\n        ctx: Context,\r\n        name: String,\r\n        result: Option<FunctionResult>,\r\n        meta: Span,\r\n    ) {\r\n        let void = result.is_none();\r\n\r\n        let &mut Parser {\r\n            ref mut lookup_function,\r\n            ref mut module,\r\n            ..\r\n        } = self;\r\n\r\n        // Check if the passed arguments require any special variations\r\n        let mut variations =\r\n            builtin_required_variations(ctx.parameters.iter().map(|&arg| &module.types[arg].inner));\r\n\r\n        // Initiate the declaration if it wasn't previously initialized and inject builtins\r\n        let declaration = lookup_function.entry(name.clone()).or_insert_with(|| {\r\n            variations |= BuiltinVariations::STANDARD;\r\n            Default::default()\r\n        });\r\n        inject_builtin(declaration, module, &name, variations);\r\n\r\n        let Context {\r\n            arguments,\r\n            parameters,\r\n            parameters_info,\r\n            ..\r\n        } = ctx;\r\n\r\n        let function = Function {\r\n            name: Some(name),\r\n            arguments,\r\n            result,\r\n            ..Default::default()\r\n        };\r\n\r\n        'outer: for decl in declaration.overloads.iter() {\r\n            if parameters.len() != decl.parameters.len() {\r\n                continue;\r\n            }\r\n\r\n            for (new_parameter, old_parameter) in parameters.iter().zip(decl.parameters.iter()) {\r\n                let new_inner = &module.types[*new_parameter].inner;\r\n                let old_inner = &module.types[*old_parameter].inner;\r\n\r\n                if new_inner != old_inner {\r\n                    continue 'outer;\r\n                }\r\n            }\r\n\r\n            return self.errors.push(Error {\r\n                kind: ErrorKind::SemanticError(\"Prototype already defined\".into()),\r\n                meta,\r\n            });\r\n        }\r\n\r\n        let handle = module.functions.append(function, meta);\r\n        declaration.overloads.push(Overload {\r\n            parameters,\r\n            parameters_info,\r\n            kind: FunctionKind::Call(handle),\r\n            defined: false,\r\n            internal: false,\r\n            void,\r\n        });\r\n    }\r\n\r\n    /// Helper function for building the input/output interface of the entry point\r\n    ///\r\n    /// Calls `f` with the data of the entry point argument, flattening composite types\r\n    /// recursively\r\n    ///\r\n    /// The passed arguments to the callback are:\r\n    /// - The name\r\n    /// - The pointer expression to the global storage\r\n    /// - The handle to the type of the entry point argument\r\n    /// - The binding of the entry point argument\r\n    /// - The expression arena\r\n    fn arg_type_walker(\r\n        &self,\r\n        name: Option<String>,\r\n        binding: crate::Binding,\r\n        pointer: Handle<Expression>,\r\n        ty: Handle<Type>,\r\n        expressions: &mut Arena<Expression>,\r\n        f: &mut impl FnMut(\r\n            Option<String>,\r\n            Handle<Expression>,\r\n            Handle<Type>,\r\n            crate::Binding,\r\n            &mut Arena<Expression>,\r\n        ),\r\n    ) {\r\n        match self.module.types[ty].inner {\r\n            TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(constant),\r\n                ..\r\n            } => {\r\n                let mut location = match binding {\r\n                    crate::Binding::Location { location, .. } => location,\r\n                    _ => return,\r\n                };\r\n\r\n                // TODO: Better error reporting\r\n                // right now we just don't walk the array if the size isn't known at\r\n                // compile time and let validation catch it\r\n                let size = match self.module.constants[constant].to_array_length() {\r\n                    Some(val) => val,\r\n                    None => return f(name, pointer, ty, binding, expressions),\r\n                };\r\n\r\n                let interpolation =\r\n                    self.module.types[base]\r\n                        .inner\r\n                        .scalar_kind()\r\n                        .map(|kind| match kind {\r\n                            ScalarKind::Float => crate::Interpolation::Perspective,\r\n                            _ => crate::Interpolation::Flat,\r\n                        });\r\n\r\n                for index in 0..size {\r\n                    let member_pointer = expressions.append(\r\n                        Expression::AccessIndex {\r\n                            base: pointer,\r\n                            index,\r\n                        },\r\n                        crate::Span::default(),\r\n                    );\r\n\r\n                    let binding = crate::Binding::Location {\r\n                        location,\r\n                        interpolation,\r\n                        sampling: None,\r\n                    };\r\n                    location += 1;\r\n\r\n                    self.arg_type_walker(\r\n                        name.clone(),\r\n                        binding,\r\n                        member_pointer,\r\n                        base,\r\n                        expressions,\r\n                        f,\r\n                    )\r\n                }\r\n            }\r\n            TypeInner::Struct { ref members, .. } => {\r\n                let mut location = match binding {\r\n                    crate::Binding::Location { location, .. } => location,\r\n                    _ => return,\r\n                };\r\n\r\n                for (i, member) in members.iter().enumerate() {\r\n                    let member_pointer = expressions.append(\r\n                        Expression::AccessIndex {\r\n                            base: pointer,\r\n                            index: i as u32,\r\n                        },\r\n                        crate::Span::default(),\r\n                    );\r\n\r\n                    let binding = match member.binding.clone() {\r\n                        Some(binding) => binding,\r\n                        None => {\r\n                            let interpolation = self.module.types[member.ty]\r\n                                .inner\r\n                                .scalar_kind()\r\n                                .map(|kind| match kind {\r\n                                    ScalarKind::Float => crate::Interpolation::Perspective,\r\n                                    _ => crate::Interpolation::Flat,\r\n                                });\r\n                            let binding = crate::Binding::Location {\r\n                                location,\r\n                                interpolation,\r\n                                sampling: None,\r\n                            };\r\n                            location += 1;\r\n                            binding\r\n                        }\r\n                    };\r\n\r\n                    self.arg_type_walker(\r\n                        member.name.clone(),\r\n                        binding,\r\n                        member_pointer,\r\n                        member.ty,\r\n                        expressions,\r\n                        f,\r\n                    )\r\n                }\r\n            }\r\n            _ => f(name, pointer, ty, binding, expressions),\r\n        }\r\n    }\r\n\r\n    pub(crate) fn add_entry_point(\r\n        &mut self,\r\n        function: Handle<Function>,\r\n        global_init_body: Block,\r\n        mut expressions: Arena<Expression>,\r\n    ) {\r\n        let mut arguments = Vec::new();\r\n        let mut body = Block::with_capacity(\r\n            // global init body\r\n            global_init_body.len() +\r\n                        // prologue and epilogue\r\n                        self.entry_args.len() * 2\r\n                        // Call, Emit for composing struct and return\r\n                        + 3,\r\n        );\r\n\r\n        for arg in self.entry_args.iter() {\r\n            if arg.storage != StorageQualifier::Input {\r\n                continue;\r\n            }\r\n\r\n            let pointer =\r\n                expressions.append(Expression::GlobalVariable(arg.handle), Default::default());\r\n\r\n            self.arg_type_walker(\r\n                arg.name.clone(),\r\n                arg.binding.clone(),\r\n                pointer,\r\n                self.module.global_variables[arg.handle].ty,\r\n                &mut expressions,\r\n                &mut |name, pointer, ty, binding, expressions| {\r\n                    let idx = arguments.len() as u32;\r\n\r\n                    arguments.push(FunctionArgument {\r\n                        name,\r\n                        ty,\r\n                        binding: Some(binding),\r\n                    });\r\n\r\n                    let value =\r\n                        expressions.append(Expression::FunctionArgument(idx), Default::default());\r\n                    body.push(Statement::Store { pointer, value }, Default::default());\r\n                },\r\n            )\r\n        }\r\n\r\n        body.extend_block(global_init_body);\r\n\r\n        body.push(\r\n            Statement::Call {\r\n                function,\r\n                arguments: Vec::new(),\r\n                result: None,\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let mut span = 0;\r\n        let mut members = Vec::new();\r\n        let mut components = Vec::new();\r\n\r\n        for arg in self.entry_args.iter() {\r\n            if arg.storage != StorageQualifier::Output {\r\n                continue;\r\n            }\r\n\r\n            let pointer =\r\n                expressions.append(Expression::GlobalVariable(arg.handle), Default::default());\r\n\r\n            self.arg_type_walker(\r\n                arg.name.clone(),\r\n                arg.binding.clone(),\r\n                pointer,\r\n                self.module.global_variables[arg.handle].ty,\r\n                &mut expressions,\r\n                &mut |name, pointer, ty, binding, expressions| {\r\n                    members.push(StructMember {\r\n                        name,\r\n                        ty,\r\n                        binding: Some(binding),\r\n                        offset: span,\r\n                    });\r\n\r\n                    span += self.module.types[ty].inner.size(&self.module.constants);\r\n\r\n                    let len = expressions.len();\r\n                    let load = expressions.append(Expression::Load { pointer }, Default::default());\r\n                    body.push(\r\n                        Statement::Emit(expressions.range_from(len)),\r\n                        Default::default(),\r\n                    );\r\n                    components.push(load)\r\n                },\r\n            )\r\n        }\r\n\r\n        let (ty, value) = if !components.is_empty() {\r\n            let ty = self.module.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Struct { members, span },\r\n                },\r\n                Default::default(),\r\n            );\r\n\r\n            let len = expressions.len();\r\n            let res =\r\n                expressions.append(Expression::Compose { ty, components }, Default::default());\r\n            body.push(\r\n                Statement::Emit(expressions.range_from(len)),\r\n                Default::default(),\r\n            );\r\n\r\n            (Some(ty), Some(res))\r\n        } else {\r\n            (None, None)\r\n        };\r\n\r\n        body.push(Statement::Return { value }, Default::default());\r\n\r\n        self.module.entry_points.push(EntryPoint {\r\n            name: \"main\".to_string(),\r\n            stage: self.meta.stage,\r\n            early_depth_test: Some(crate::EarlyDepthTest { conservative: None })\r\n                .filter(|_| self.meta.early_fragment_tests),\r\n            workgroup_size: self.meta.workgroup_size,\r\n            function: Function {\r\n                arguments,\r\n                expressions,\r\n                body,\r\n                result: ty.map(|ty| FunctionResult { ty, binding: None }),\r\n                ..Default::default()\r\n            },\r\n        });\r\n    }\r\n}\r\n\r\n/// Helper enum containing the type of conversion need for a call\r\n#[derive(PartialEq, Eq, Clone, Copy, Debug)]\r\nenum Conversion {\r\n    /// No conversion needed\r\n    Exact,\r\n    /// Float to double conversion needed\r\n    FloatToDouble,\r\n    /// Int or uint to float conversion needed\r\n    IntToFloat,\r\n    /// Int or uint to double conversion needed\r\n    IntToDouble,\r\n    /// Other type of conversion needed\r\n    Other,\r\n    /// No conversion was yet registered\r\n    None,\r\n}\r\n\r\n/// Helper function, returns the type of conversion from `source` to `target`, if a\r\n/// conversion is not possible returns None.\r\nfn conversion(target: &TypeInner, source: &TypeInner) -> Option<Conversion> {\r\n    use ScalarKind::*;\r\n\r\n    // Gather the `ScalarKind` and scalar width from both the target and the source\r\n    let (target_kind, target_width, source_kind, source_width) = match (target, source) {\r\n        // Conversions between scalars are allowed\r\n        (\r\n            &TypeInner::Scalar {\r\n                kind: tgt_kind,\r\n                width: tgt_width,\r\n            },\r\n            &TypeInner::Scalar {\r\n                kind: src_kind,\r\n                width: src_width,\r\n            },\r\n        ) => (tgt_kind, tgt_width, src_kind, src_width),\r\n        // Conversions between vectors of the same size are allowed\r\n        (\r\n            &TypeInner::Vector {\r\n                kind: tgt_kind,\r\n                size: tgt_size,\r\n                width: tgt_width,\r\n            },\r\n            &TypeInner::Vector {\r\n                kind: src_kind,\r\n                size: src_size,\r\n                width: src_width,\r\n            },\r\n        ) if tgt_size == src_size => (tgt_kind, tgt_width, src_kind, src_width),\r\n        // Conversions between matrices of the same size are allowed\r\n        (\r\n            &TypeInner::Matrix {\r\n                rows: tgt_rows,\r\n                columns: tgt_cols,\r\n                width: tgt_width,\r\n            },\r\n            &TypeInner::Matrix {\r\n                rows: src_rows,\r\n                columns: src_cols,\r\n                width: src_width,\r\n            },\r\n        ) if tgt_cols == src_cols && tgt_rows == src_rows => (Float, tgt_width, Float, src_width),\r\n        _ => return None,\r\n    };\r\n\r\n    // Check if source can be converted into target, if this is the case then the type\r\n    // power of target must be higher than that of source\r\n    let target_power = type_power(target_kind, target_width);\r\n    let source_power = type_power(source_kind, source_width);\r\n    if target_power < source_power {\r\n        return None;\r\n    }\r\n\r\n    Some(\r\n        match ((target_kind, target_width), (source_kind, source_width)) {\r\n            // A conversion from a float to a double is special\r\n            ((Float, 8), (Float, 4)) => Conversion::FloatToDouble,\r\n            // A conversion from an integer to a float is special\r\n            ((Float, 4), (Sint | Uint, _)) => Conversion::IntToFloat,\r\n            // A conversion from an integer to a double is special\r\n            ((Float, 8), (Sint | Uint, _)) => Conversion::IntToDouble,\r\n            _ => Conversion::Other,\r\n        },\r\n    )\r\n}\r\n\r\n/// Helper method returning all the non standard builtin variations needed\r\n/// to process the function call with the passed arguments\r\nfn builtin_required_variations<'a>(args: impl Iterator<Item = &'a TypeInner>) -> BuiltinVariations {\r\n    let mut variations = BuiltinVariations::empty();\r\n\r\n    for ty in args {\r\n        match *ty {\r\n            TypeInner::ValuePointer { kind, width, .. }\r\n            | TypeInner::Scalar { kind, width }\r\n            | TypeInner::Vector { kind, width, .. } => {\r\n                if kind == ScalarKind::Float && width == 8 {\r\n                    variations |= BuiltinVariations::DOUBLE\r\n                }\r\n            }\r\n            TypeInner::Matrix { width, .. } => {\r\n                if width == 8 {\r\n                    variations |= BuiltinVariations::DOUBLE\r\n                }\r\n            }\r\n            TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class,\r\n            } => {\r\n                if dim == crate::ImageDimension::Cube && arrayed {\r\n                    variations |= BuiltinVariations::CUBE_TEXTURES_ARRAY\r\n                }\r\n\r\n                if dim == crate::ImageDimension::D2 && arrayed && class.is_multisampled() {\r\n                    variations |= BuiltinVariations::D2_MULTI_TEXTURES_ARRAY\r\n                }\r\n            }\r\n            _ => {}\r\n        }\r\n    }\r\n\r\n    variations\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/lex.rs",
    "content": "use super::{\r\n    ast::Precision,\r\n    token::{Directive, DirectiveKind, Token, TokenValue},\r\n    types::parse_type,\r\n};\r\nuse crate::{FastHashMap, Span, StorageAccess};\r\nuse pp_rs::{\r\n    pp::Preprocessor,\r\n    token::{PreprocessorError, Punct, TokenValue as PPTokenValue},\r\n};\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub struct LexerResult {\r\n    pub kind: LexerResultKind,\r\n    pub meta: Span,\r\n}\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum LexerResultKind {\r\n    Token(Token),\r\n    Directive(Directive),\r\n    Error(PreprocessorError),\r\n}\r\n\r\npub struct Lexer<'a> {\r\n    pp: Preprocessor<'a>,\r\n}\r\n\r\nimpl<'a> Lexer<'a> {\r\n    pub fn new(input: &'a str, defines: &'a FastHashMap<String, String>) -> Self {\r\n        let mut pp = Preprocessor::new(input);\r\n        for (define, value) in defines {\r\n            pp.add_define(define, value).unwrap(); //TODO: handle error\r\n        }\r\n        Lexer { pp }\r\n    }\r\n}\r\n\r\nimpl<'a> Iterator for Lexer<'a> {\r\n    type Item = LexerResult;\r\n    fn next(&mut self) -> Option<Self::Item> {\r\n        let pp_token = match self.pp.next()? {\r\n            Ok(t) => t,\r\n            Err((err, loc)) => {\r\n                return Some(LexerResult {\r\n                    kind: LexerResultKind::Error(err),\r\n                    meta: loc.into(),\r\n                });\r\n            }\r\n        };\r\n\r\n        let meta = pp_token.location.into();\r\n        let value = match pp_token.value {\r\n            PPTokenValue::Extension(extension) => {\r\n                return Some(LexerResult {\r\n                    kind: LexerResultKind::Directive(Directive {\r\n                        kind: DirectiveKind::Extension,\r\n                        tokens: extension.tokens,\r\n                    }),\r\n                    meta,\r\n                })\r\n            }\r\n            PPTokenValue::Float(float) => TokenValue::FloatConstant(float),\r\n            PPTokenValue::Ident(ident) => {\r\n                match ident.as_str() {\r\n                    // Qualifiers\r\n                    \"layout\" => TokenValue::Layout,\r\n                    \"in\" => TokenValue::In,\r\n                    \"out\" => TokenValue::Out,\r\n                    \"uniform\" => TokenValue::Uniform,\r\n                    \"buffer\" => TokenValue::Buffer,\r\n                    \"shared\" => TokenValue::Shared,\r\n                    \"invariant\" => TokenValue::Invariant,\r\n                    \"flat\" => TokenValue::Interpolation(crate::Interpolation::Flat),\r\n                    \"noperspective\" => TokenValue::Interpolation(crate::Interpolation::Linear),\r\n                    \"smooth\" => TokenValue::Interpolation(crate::Interpolation::Perspective),\r\n                    \"centroid\" => TokenValue::Sampling(crate::Sampling::Centroid),\r\n                    \"sample\" => TokenValue::Sampling(crate::Sampling::Sample),\r\n                    \"const\" => TokenValue::Const,\r\n                    \"inout\" => TokenValue::InOut,\r\n                    \"precision\" => TokenValue::Precision,\r\n                    \"highp\" => TokenValue::PrecisionQualifier(Precision::High),\r\n                    \"mediump\" => TokenValue::PrecisionQualifier(Precision::Medium),\r\n                    \"lowp\" => TokenValue::PrecisionQualifier(Precision::Low),\r\n                    \"restrict\" => TokenValue::Restrict,\r\n                    \"readonly\" => TokenValue::MemoryQualifier(StorageAccess::LOAD),\r\n                    \"writeonly\" => TokenValue::MemoryQualifier(StorageAccess::STORE),\r\n                    // values\r\n                    \"true\" => TokenValue::BoolConstant(true),\r\n                    \"false\" => TokenValue::BoolConstant(false),\r\n                    // jump statements\r\n                    \"continue\" => TokenValue::Continue,\r\n                    \"break\" => TokenValue::Break,\r\n                    \"return\" => TokenValue::Return,\r\n                    \"discard\" => TokenValue::Discard,\r\n                    // selection statements\r\n                    \"if\" => TokenValue::If,\r\n                    \"else\" => TokenValue::Else,\r\n                    \"switch\" => TokenValue::Switch,\r\n                    \"case\" => TokenValue::Case,\r\n                    \"default\" => TokenValue::Default,\r\n                    // iteration statements\r\n                    \"while\" => TokenValue::While,\r\n                    \"do\" => TokenValue::Do,\r\n                    \"for\" => TokenValue::For,\r\n                    // types\r\n                    \"void\" => TokenValue::Void,\r\n                    \"struct\" => TokenValue::Struct,\r\n                    word => match parse_type(word) {\r\n                        Some(t) => TokenValue::TypeName(t),\r\n                        None => TokenValue::Identifier(String::from(word)),\r\n                    },\r\n                }\r\n            }\r\n            PPTokenValue::Integer(integer) => TokenValue::IntConstant(integer),\r\n            PPTokenValue::Punct(punct) => match punct {\r\n                // Compound assignments\r\n                Punct::AddAssign => TokenValue::AddAssign,\r\n                Punct::SubAssign => TokenValue::SubAssign,\r\n                Punct::MulAssign => TokenValue::MulAssign,\r\n                Punct::DivAssign => TokenValue::DivAssign,\r\n                Punct::ModAssign => TokenValue::ModAssign,\r\n                Punct::LeftShiftAssign => TokenValue::LeftShiftAssign,\r\n                Punct::RightShiftAssign => TokenValue::RightShiftAssign,\r\n                Punct::AndAssign => TokenValue::AndAssign,\r\n                Punct::XorAssign => TokenValue::XorAssign,\r\n                Punct::OrAssign => TokenValue::OrAssign,\r\n\r\n                // Two character punctuation\r\n                Punct::Increment => TokenValue::Increment,\r\n                Punct::Decrement => TokenValue::Decrement,\r\n                Punct::LogicalAnd => TokenValue::LogicalAnd,\r\n                Punct::LogicalOr => TokenValue::LogicalOr,\r\n                Punct::LogicalXor => TokenValue::LogicalXor,\r\n                Punct::LessEqual => TokenValue::LessEqual,\r\n                Punct::GreaterEqual => TokenValue::GreaterEqual,\r\n                Punct::EqualEqual => TokenValue::Equal,\r\n                Punct::NotEqual => TokenValue::NotEqual,\r\n                Punct::LeftShift => TokenValue::LeftShift,\r\n                Punct::RightShift => TokenValue::RightShift,\r\n\r\n                // Parenthesis or similar\r\n                Punct::LeftBrace => TokenValue::LeftBrace,\r\n                Punct::RightBrace => TokenValue::RightBrace,\r\n                Punct::LeftParen => TokenValue::LeftParen,\r\n                Punct::RightParen => TokenValue::RightParen,\r\n                Punct::LeftBracket => TokenValue::LeftBracket,\r\n                Punct::RightBracket => TokenValue::RightBracket,\r\n\r\n                // Other one character punctuation\r\n                Punct::LeftAngle => TokenValue::LeftAngle,\r\n                Punct::RightAngle => TokenValue::RightAngle,\r\n                Punct::Semicolon => TokenValue::Semicolon,\r\n                Punct::Comma => TokenValue::Comma,\r\n                Punct::Colon => TokenValue::Colon,\r\n                Punct::Dot => TokenValue::Dot,\r\n                Punct::Equal => TokenValue::Assign,\r\n                Punct::Bang => TokenValue::Bang,\r\n                Punct::Minus => TokenValue::Dash,\r\n                Punct::Tilde => TokenValue::Tilde,\r\n                Punct::Plus => TokenValue::Plus,\r\n                Punct::Star => TokenValue::Star,\r\n                Punct::Slash => TokenValue::Slash,\r\n                Punct::Percent => TokenValue::Percent,\r\n                Punct::Pipe => TokenValue::VerticalBar,\r\n                Punct::Caret => TokenValue::Caret,\r\n                Punct::Ampersand => TokenValue::Ampersand,\r\n                Punct::Question => TokenValue::Question,\r\n            },\r\n            PPTokenValue::Pragma(pragma) => {\r\n                return Some(LexerResult {\r\n                    kind: LexerResultKind::Directive(Directive {\r\n                        kind: DirectiveKind::Pragma,\r\n                        tokens: pragma.tokens,\r\n                    }),\r\n                    meta,\r\n                })\r\n            }\r\n            PPTokenValue::Version(version) => {\r\n                return Some(LexerResult {\r\n                    kind: LexerResultKind::Directive(Directive {\r\n                        kind: DirectiveKind::Version {\r\n                            is_first_directive: version.is_first_directive,\r\n                        },\r\n                        tokens: version.tokens,\r\n                    }),\r\n                    meta,\r\n                })\r\n            }\r\n        };\r\n\r\n        Some(LexerResult {\r\n            kind: LexerResultKind::Token(Token { value, meta }),\r\n            meta,\r\n        })\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use pp_rs::token::{Integer, Location, Token as PPToken, TokenValue as PPTokenValue};\r\n\r\n    use super::{\r\n        super::token::{Directive, DirectiveKind, Token, TokenValue},\r\n        Lexer, LexerResult, LexerResultKind,\r\n    };\r\n    use crate::Span;\r\n\r\n    #[test]\r\n    fn lex_tokens() {\r\n        let defines = crate::FastHashMap::default();\r\n\r\n        // line comments\r\n        let mut lex = Lexer::new(\"#version 450\\nvoid main () {}\", &defines);\r\n        let mut location = Location::default();\r\n        location.start = 9;\r\n        location.end = 12;\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Directive(Directive {\r\n                    kind: DirectiveKind::Version {\r\n                        is_first_directive: true\r\n                    },\r\n                    tokens: vec![PPToken {\r\n                        value: PPTokenValue::Integer(Integer {\r\n                            signed: true,\r\n                            value: 450,\r\n                            width: 32\r\n                        }),\r\n                        location\r\n                    }]\r\n                }),\r\n                meta: Span::new(1, 8)\r\n            }\r\n        );\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Token(Token {\r\n                    value: TokenValue::Void,\r\n                    meta: Span::new(13, 17)\r\n                }),\r\n                meta: Span::new(13, 17)\r\n            }\r\n        );\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Token(Token {\r\n                    value: TokenValue::Identifier(\"main\".into()),\r\n                    meta: Span::new(18, 22)\r\n                }),\r\n                meta: Span::new(18, 22)\r\n            }\r\n        );\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Token(Token {\r\n                    value: TokenValue::LeftParen,\r\n                    meta: Span::new(23, 24)\r\n                }),\r\n                meta: Span::new(23, 24)\r\n            }\r\n        );\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Token(Token {\r\n                    value: TokenValue::RightParen,\r\n                    meta: Span::new(24, 25)\r\n                }),\r\n                meta: Span::new(24, 25)\r\n            }\r\n        );\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Token(Token {\r\n                    value: TokenValue::LeftBrace,\r\n                    meta: Span::new(26, 27)\r\n                }),\r\n                meta: Span::new(26, 27)\r\n            }\r\n        );\r\n        assert_eq!(\r\n            lex.next().unwrap(),\r\n            LexerResult {\r\n                kind: LexerResultKind::Token(Token {\r\n                    value: TokenValue::RightBrace,\r\n                    meta: Span::new(27, 28)\r\n                }),\r\n                meta: Span::new(27, 28)\r\n            }\r\n        );\r\n        assert_eq!(lex.next(), None);\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/mod.rs",
    "content": "/*!\r\nFrontend for [GLSL][glsl] (OpenGL Shading Language).\r\n\r\nTo begin, take a look at the documentation for the [`Parser`](Parser).\r\n\r\n# Supported versions\r\n## Vulkan\r\n- 440 (partial)\r\n- 450\r\n- 460\r\n\r\n[glsl]: https://www.khronos.org/registry/OpenGL/index_gl.php\r\n*/\r\n\r\npub use ast::{Precision, Profile};\r\npub use error::{Error, ErrorKind, ExpectedToken};\r\npub use token::TokenValue;\r\n\r\nuse crate::{proc::Layouter, FastHashMap, FastHashSet, Handle, Module, ShaderStage, Span, Type};\r\nuse ast::{EntryArg, FunctionDeclaration, GlobalLookup};\r\nuse parser::ParsingContext;\r\n\r\nmod ast;\r\nmod builtins;\r\nmod constants;\r\nmod context;\r\nmod error;\r\nmod functions;\r\nmod lex;\r\nmod offset;\r\nmod parser;\r\n#[cfg(test)]\r\nmod parser_tests;\r\nmod token;\r\nmod types;\r\nmod variables;\r\n\r\ntype Result<T> = std::result::Result<T, Error>;\r\n\r\n/// Per-shader options passed to [`parse`](Parser::parse).\r\n///\r\n/// The [`From`](From) trait is implemented for [`ShaderStage`](ShaderStage) to\r\n/// provide a quick way to create a Options instance.\r\n/// ```rust\r\n/// # use naga::ShaderStage;\r\n/// # use naga::front::glsl::Options;\r\n/// Options::from(ShaderStage::Vertex);\r\n/// ```\r\n#[derive(Debug)]\r\npub struct Options {\r\n    /// The shader stage in the pipeline.\r\n    pub stage: ShaderStage,\r\n    /// Preprocesor definitions to be used, akin to having\r\n    /// ```glsl\r\n    /// #define key value\r\n    /// ```\r\n    /// for each key value pair in the map.\r\n    pub defines: FastHashMap<String, String>,\r\n}\r\n\r\nimpl From<ShaderStage> for Options {\r\n    fn from(stage: ShaderStage) -> Self {\r\n        Options {\r\n            stage,\r\n            defines: FastHashMap::default(),\r\n        }\r\n    }\r\n}\r\n\r\n/// Additional information about the GLSL shader.\r\n///\r\n/// Stores additional information about the GLSL shader which might not be\r\n/// stored in the shader [`Module`](Module).\r\n#[derive(Debug)]\r\npub struct ShaderMetadata {\r\n    /// The GLSL version specified in the shader trough the use of the\r\n    /// `#version` preprocessor directive.\r\n    pub version: u16,\r\n    /// The GLSL profile specified in the shader trough the use of the\r\n    /// `#version` preprocessor directive.\r\n    pub profile: Profile,\r\n    /// The shader stage in the pipeline, passed to the [`parse`](Parser::parse)\r\n    /// method via the [`Options`](Options) struct.\r\n    pub stage: ShaderStage,\r\n\r\n    /// The workgroup size for compute shaders, defaults to `[1; 3]` for\r\n    /// compute shaders and `[0; 3]` for non compute shaders.\r\n    pub workgroup_size: [u32; 3],\r\n    /// Whether or not early fragment tests where requested by the shader.\r\n    /// Defaults to `false`.\r\n    pub early_fragment_tests: bool,\r\n\r\n    /// The shader can request extensions via the\r\n    /// `#extension` preprocessor directive, in the directive a behavior\r\n    /// parameter is used to control whether the extension should be disabled,\r\n    /// warn on usage, enabled if possible or required.\r\n    ///\r\n    /// This field only stores extensions which were required or requested to\r\n    /// be enabled if possible and they are supported.\r\n    pub extensions: FastHashSet<String>,\r\n}\r\n\r\nimpl ShaderMetadata {\r\n    fn reset(&mut self, stage: ShaderStage) {\r\n        self.version = 0;\r\n        self.profile = Profile::Core;\r\n        self.stage = stage;\r\n        self.workgroup_size = [if stage == ShaderStage::Compute { 1 } else { 0 }; 3];\r\n        self.early_fragment_tests = false;\r\n        self.extensions.clear();\r\n    }\r\n}\r\n\r\nimpl Default for ShaderMetadata {\r\n    fn default() -> Self {\r\n        ShaderMetadata {\r\n            version: 0,\r\n            profile: Profile::Core,\r\n            stage: ShaderStage::Vertex,\r\n            workgroup_size: [0; 3],\r\n            early_fragment_tests: false,\r\n            extensions: FastHashSet::default(),\r\n        }\r\n    }\r\n}\r\n\r\n/// The `Parser` is the central structure of the GLSL frontend.\r\n///\r\n/// To instantiate a new `Parser` the [`Default`](Default) trait is used, so a\r\n/// call to the associated function [`Parser::default`](Parser::default) will\r\n/// return a new `Parser` instance.\r\n///\r\n/// To parse a shader simply call the [`parse`](Parser::parse) method with a\r\n/// [`Options`](Options) struct and a [`&str`](str) holding the glsl code.\r\n///\r\n/// The `Parser` also provides the [`metadata`](Parser::metadata) to get some\r\n/// further information about the previously parsed shader, like version and\r\n/// extensions used (see the documentation for\r\n/// [`ShaderMetadata`](ShaderMetadata) to see all the returned information)\r\n///\r\n/// # Example usage\r\n/// ```rust\r\n/// use naga::ShaderStage;\r\n/// use naga::front::glsl::{Parser, Options};\r\n///\r\n/// let glsl = r#\"\r\n///     #version 450 core\r\n///\r\n///     void main() {}\r\n/// \"#;\r\n///\r\n/// let mut parser = Parser::default();\r\n/// let options = Options::from(ShaderStage::Vertex);\r\n/// parser.parse(&options, glsl);\r\n/// ```\r\n///\r\n/// # Reusability\r\n///\r\n/// If there's a need to parse more than one shader reusing the same `Parser`\r\n/// instance may be beneficial since internal allocations will be reused.\r\n///\r\n/// Calling the [`parse`](Parser::parse) method multiple times will reset the\r\n/// `Parser` so no extra care is needed when reusing.\r\n#[derive(Debug, Default)]\r\npub struct Parser {\r\n    meta: ShaderMetadata,\r\n\r\n    lookup_function: FastHashMap<String, FunctionDeclaration>,\r\n    lookup_type: FastHashMap<String, Handle<Type>>,\r\n\r\n    global_variables: Vec<(String, GlobalLookup)>,\r\n\r\n    entry_args: Vec<EntryArg>,\r\n\r\n    layouter: Layouter,\r\n\r\n    errors: Vec<Error>,\r\n\r\n    module: Module,\r\n}\r\n\r\nimpl Parser {\r\n    fn reset(&mut self, stage: ShaderStage) {\r\n        self.meta.reset(stage);\r\n\r\n        self.lookup_function.clear();\r\n        self.lookup_type.clear();\r\n        self.global_variables.clear();\r\n        self.entry_args.clear();\r\n        self.layouter.clear();\r\n\r\n        // This is necessary because if the last parsing errored out, the module\r\n        // wouldn't have been taken\r\n        self.module = Module::default();\r\n    }\r\n\r\n    /// Parses a shader either outputting a shader [`Module`](Module) or a list\r\n    /// of [`Error`](Error)s.\r\n    ///\r\n    /// Multiple calls using the same `Parser` and different shaders are supported.\r\n    pub fn parse(\r\n        &mut self,\r\n        options: &Options,\r\n        source: &str,\r\n    ) -> std::result::Result<Module, Vec<Error>> {\r\n        self.reset(options.stage);\r\n\r\n        let lexer = lex::Lexer::new(source, &options.defines);\r\n        let mut ctx = ParsingContext::new(lexer);\r\n\r\n        if let Err(e) = ctx.parse(self) {\r\n            self.errors.push(e);\r\n        }\r\n\r\n        if self.errors.is_empty() {\r\n            Ok(std::mem::take(&mut self.module))\r\n        } else {\r\n            Err(std::mem::take(&mut self.errors))\r\n        }\r\n    }\r\n\r\n    /// Returns additional information about the parsed shader which might not be\r\n    /// stored in the [`Module`](Module), see the documentation for\r\n    /// [`ShaderMetadata`](ShaderMetadata) for more information about the\r\n    /// returned data.\r\n    ///\r\n    /// # Notes\r\n    ///\r\n    /// Following an unsuccessful parsing the state of the returned information\r\n    /// is undefined, it might contain only partial information about the\r\n    /// current shader, the previous shader or both.\r\n    pub const fn metadata(&self) -> &ShaderMetadata {\r\n        &self.meta\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/offset.rs",
    "content": "/*!\r\nModule responsible for calculating the offset and span for types.\r\n\r\nThere exists two types of layouts std140 and std430 (there's technically\r\ntwo more layouts, shared and packed. Shared is not supported by spirv. Packed is\r\nimplementation dependent and for now it's just implemented as an alias to\r\nstd140).\r\n\r\nThe OpenGl spec (the layout rules are defined by the OpenGl spec in section\r\n7.6.2.2 as opposed to the GLSL spec) uses the term basic machine units which are\r\nequivalent to bytes.\r\n*/\r\n\r\nuse super::{\r\n    ast::StructLayout,\r\n    error::{Error, ErrorKind},\r\n    Span,\r\n};\r\nuse crate::{proc::Alignment, Arena, Constant, Handle, Type, TypeInner, UniqueArena};\r\n\r\n/// Struct with information needed for defining a struct member.\r\n///\r\n/// Returned by [`calculate_offset`](calculate_offset)\r\n#[derive(Debug)]\r\npub struct TypeAlignSpan {\r\n    /// The handle to the type, this might be the same handle passed to\r\n    /// [`calculate_offset`](calculate_offset) or a new such a new array type\r\n    /// with a different stride set.\r\n    pub ty: Handle<Type>,\r\n    /// The alignment required by the type.\r\n    pub align: Alignment,\r\n    /// The size of the type.\r\n    pub span: u32,\r\n}\r\n\r\n/// Returns the type, alignment and span of a struct member according to a [`StructLayout`](StructLayout).\r\n///\r\n/// The functions returns a [`TypeAlignSpan`](TypeAlignSpan) which has a `ty` member\r\n/// this should be used as the struct member type because for example arrays may have to\r\n/// change the stride and as such need to have a different type.\r\npub fn calculate_offset(\r\n    mut ty: Handle<Type>,\r\n    meta: Span,\r\n    layout: StructLayout,\r\n    types: &mut UniqueArena<Type>,\r\n    constants: &Arena<Constant>,\r\n    errors: &mut Vec<Error>,\r\n) -> TypeAlignSpan {\r\n    // When using the std430 storage layout, shader storage blocks will be laid out in buffer storage\r\n    // identically to uniform and shader storage blocks using the std140 layout, except\r\n    // that the base alignment and stride of arrays of scalars and vectors in rule 4 and of\r\n    // structures in rule 9 are not rounded up a multiple of the base alignment of a vec4.\r\n\r\n    let (align, span) = match types[ty].inner {\r\n        // 1. If the member is a scalar consuming N basic machine units,\r\n        // the base alignment is N.\r\n        TypeInner::Scalar { width, .. } => (Alignment::from_width(width), width as u32),\r\n        // 2. If the member is a two- or four-component vector with components\r\n        // consuming N basic machine units, the base alignment is 2N or 4N, respectively.\r\n        // 3. If the member is a three-component vector with components consuming N\r\n        // basic machine units, the base alignment is 4N.\r\n        TypeInner::Vector { size, width, .. } => (\r\n            Alignment::from(size) * Alignment::from_width(width),\r\n            size as u32 * width as u32,\r\n        ),\r\n        // 4. If the member is an array of scalars or vectors, the base alignment and array\r\n        // stride are set to match the base alignment of a single array element, according\r\n        // to rules (1), (2), and (3), and rounded up to the base alignment of a vec4.\r\n        // TODO: Matrices array\r\n        TypeInner::Array { base, size, .. } => {\r\n            let info = calculate_offset(base, meta, layout, types, constants, errors);\r\n\r\n            let name = types[ty].name.clone();\r\n\r\n            // See comment at the beginning of the function\r\n            let (align, stride) = if StructLayout::Std430 == layout {\r\n                (info.align, info.align.round_up(info.span))\r\n            } else {\r\n                let align = info.align.max(Alignment::MIN_UNIFORM);\r\n                (align, align.round_up(info.span))\r\n            };\r\n\r\n            let span = match size {\r\n                crate::ArraySize::Constant(s) => {\r\n                    constants[s].to_array_length().unwrap_or(1) * stride\r\n                }\r\n                crate::ArraySize::Dynamic => stride,\r\n            };\r\n\r\n            let ty_span = types.get_span(ty);\r\n            ty = types.insert(\r\n                Type {\r\n                    name,\r\n                    inner: TypeInner::Array {\r\n                        base: info.ty,\r\n                        size,\r\n                        stride,\r\n                    },\r\n                },\r\n                ty_span,\r\n            );\r\n\r\n            (align, span)\r\n        }\r\n        // 5. If the member is a column-major matrix with C columns and R rows, the\r\n        // matrix is stored identically to an array of C column vectors with R\r\n        // components each, according to rule (4)\r\n        // TODO: Row major matrices\r\n        TypeInner::Matrix {\r\n            columns,\r\n            rows,\r\n            width,\r\n        } => {\r\n            let mut align = Alignment::from(rows) * Alignment::from_width(width);\r\n\r\n            // See comment at the beginning of the function\r\n            if StructLayout::Std430 != layout {\r\n                align = align.max(Alignment::MIN_UNIFORM);\r\n            }\r\n\r\n            // See comment on the error kind\r\n            if StructLayout::Std140 == layout && rows == crate::VectorSize::Bi {\r\n                errors.push(Error {\r\n                    kind: ErrorKind::UnsupportedMatrixTypeInStd140,\r\n                    meta,\r\n                });\r\n            }\r\n\r\n            (align, align * columns as u32)\r\n        }\r\n        TypeInner::Struct { ref members, .. } => {\r\n            let mut span = 0;\r\n            let mut align = Alignment::ONE;\r\n            let mut members = members.clone();\r\n            let name = types[ty].name.clone();\r\n\r\n            for member in members.iter_mut() {\r\n                let info = calculate_offset(member.ty, meta, layout, types, constants, errors);\r\n\r\n                let member_alignment = info.align;\r\n                span = member_alignment.round_up(span);\r\n                align = member_alignment.max(align);\r\n\r\n                member.ty = info.ty;\r\n                member.offset = span;\r\n\r\n                span += info.span;\r\n            }\r\n\r\n            span = align.round_up(span);\r\n\r\n            let ty_span = types.get_span(ty);\r\n            ty = types.insert(\r\n                Type {\r\n                    name,\r\n                    inner: TypeInner::Struct { members, span },\r\n                },\r\n                ty_span,\r\n            );\r\n\r\n            (align, span)\r\n        }\r\n        _ => {\r\n            errors.push(Error {\r\n                kind: ErrorKind::SemanticError(\"Invalid struct member type\".into()),\r\n                meta,\r\n            });\r\n            (Alignment::ONE, 0)\r\n        }\r\n    };\r\n\r\n    TypeAlignSpan { ty, align, span }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/parser/declarations.rs",
    "content": "use crate::{\r\n    front::glsl::{\r\n        ast::{\r\n            GlobalLookup, GlobalLookupKind, Precision, QualifierKey, QualifierValue,\r\n            StorageQualifier, StructLayout, TypeQualifiers,\r\n        },\r\n        context::{Context, ExprPos},\r\n        error::ExpectedToken,\r\n        offset,\r\n        token::{Token, TokenValue},\r\n        types::scalar_components,\r\n        variables::{GlobalOrConstant, VarDeclaration},\r\n        Error, ErrorKind, Parser, Span,\r\n    },\r\n    proc::Alignment,\r\n    AddressSpace, Block, Expression, FunctionResult, Handle, ScalarKind, Statement, StructMember,\r\n    Type, TypeInner,\r\n};\r\n\r\nuse super::{DeclarationContext, ParsingContext, Result};\r\n\r\n/// Helper method used to retrieve the child type of `ty` at\r\n/// index `i`.\r\n///\r\n/// # Note\r\n///\r\n/// Does not check if the index is valid and returns the same type\r\n/// when indexing out-of-bounds a struct or indexing a non indexable\r\n/// type.\r\nfn element_or_member_type(\r\n    ty: Handle<Type>,\r\n    i: usize,\r\n    types: &mut crate::UniqueArena<Type>,\r\n) -> Handle<Type> {\r\n    match types[ty].inner {\r\n        // The child type of a vector is a scalar of the same kind and width\r\n        TypeInner::Vector { kind, width, .. } => types.insert(\r\n            Type {\r\n                name: None,\r\n                inner: TypeInner::Scalar { kind, width },\r\n            },\r\n            Default::default(),\r\n        ),\r\n        // The child type of a matrix is a vector of floats with the same\r\n        // width and the size of the matrix rows.\r\n        TypeInner::Matrix { rows, width, .. } => types.insert(\r\n            Type {\r\n                name: None,\r\n                inner: TypeInner::Vector {\r\n                    size: rows,\r\n                    kind: ScalarKind::Float,\r\n                    width,\r\n                },\r\n            },\r\n            Default::default(),\r\n        ),\r\n        // The child type of an array is the base type of the array\r\n        TypeInner::Array { base, .. } => base,\r\n        // The child type of a struct at index `i` is the type of it's\r\n        // member at that same index.\r\n        //\r\n        // In case the index is out of bounds the same type is returned\r\n        TypeInner::Struct { ref members, .. } => {\r\n            members.get(i).map(|member| member.ty).unwrap_or(ty)\r\n        }\r\n        // The type isn't indexable, the same type is returned\r\n        _ => ty,\r\n    }\r\n}\r\n\r\nimpl<'source> ParsingContext<'source> {\r\n    pub fn parse_external_declaration(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        global_ctx: &mut Context,\r\n        global_body: &mut Block,\r\n    ) -> Result<()> {\r\n        if self\r\n            .parse_declaration(parser, global_ctx, global_body, true)?\r\n            .is_none()\r\n        {\r\n            let token = self.bump(parser)?;\r\n            match token.value {\r\n                TokenValue::Semicolon if parser.meta.version == 460 => Ok(()),\r\n                _ => {\r\n                    let expected = match parser.meta.version {\r\n                        460 => vec![TokenValue::Semicolon.into(), ExpectedToken::Eof],\r\n                        _ => vec![ExpectedToken::Eof],\r\n                    };\r\n                    Err(Error {\r\n                        kind: ErrorKind::InvalidToken(token.value, expected),\r\n                        meta: token.meta,\r\n                    })\r\n                }\r\n            }\r\n        } else {\r\n            Ok(())\r\n        }\r\n    }\r\n\r\n    pub fn parse_initializer(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ty: Handle<Type>,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n    ) -> Result<(Handle<Expression>, Span)> {\r\n        // initializer:\r\n        //     assignment_expression\r\n        //     LEFT_BRACE initializer_list RIGHT_BRACE\r\n        //     LEFT_BRACE initializer_list COMMA RIGHT_BRACE\r\n        //\r\n        // initializer_list:\r\n        //     initializer\r\n        //     initializer_list COMMA initializer\r\n        if let Some(Token { mut meta, .. }) = self.bump_if(parser, TokenValue::LeftBrace) {\r\n            // initializer_list\r\n            let mut components = Vec::new();\r\n            loop {\r\n                // The type expected to be parsed inside the initializer list\r\n                let new_ty = element_or_member_type(ty, components.len(), &mut parser.module.types);\r\n\r\n                components.push(self.parse_initializer(parser, new_ty, ctx, body)?.0);\r\n\r\n                let token = self.bump(parser)?;\r\n                match token.value {\r\n                    TokenValue::Comma => {\r\n                        if let Some(Token { meta: end_meta, .. }) =\r\n                            self.bump_if(parser, TokenValue::RightBrace)\r\n                        {\r\n                            meta.subsume(end_meta);\r\n                            break;\r\n                        }\r\n                    }\r\n                    TokenValue::RightBrace => {\r\n                        meta.subsume(token.meta);\r\n                        break;\r\n                    }\r\n                    _ => {\r\n                        return Err(Error {\r\n                            kind: ErrorKind::InvalidToken(\r\n                                token.value,\r\n                                vec![TokenValue::Comma.into(), TokenValue::RightBrace.into()],\r\n                            ),\r\n                            meta: token.meta,\r\n                        })\r\n                    }\r\n                }\r\n            }\r\n\r\n            Ok((\r\n                ctx.add_expression(Expression::Compose { ty, components }, meta, body),\r\n                meta,\r\n            ))\r\n        } else {\r\n            let mut stmt = ctx.stmt_ctx();\r\n            let expr = self.parse_assignment(parser, ctx, &mut stmt, body)?;\r\n            let (mut init, init_meta) = ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?;\r\n\r\n            let scalar_components = scalar_components(&parser.module.types[ty].inner);\r\n            if let Some((kind, width)) = scalar_components {\r\n                ctx.implicit_conversion(parser, &mut init, init_meta, kind, width)?;\r\n            }\r\n\r\n            Ok((init, init_meta))\r\n        }\r\n    }\r\n\r\n    // Note: caller preparsed the type and qualifiers\r\n    // Note: caller skips this if the fallthrough token is not expected to be consumed here so this\r\n    // produced Error::InvalidToken if it isn't consumed\r\n    pub fn parse_init_declarator_list(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        mut ty: Handle<Type>,\r\n        ctx: &mut DeclarationContext,\r\n    ) -> Result<()> {\r\n        // init_declarator_list:\r\n        //     single_declaration\r\n        //     init_declarator_list COMMA IDENTIFIER\r\n        //     init_declarator_list COMMA IDENTIFIER array_specifier\r\n        //     init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer\r\n        //     init_declarator_list COMMA IDENTIFIER EQUAL initializer\r\n        //\r\n        // single_declaration:\r\n        //     fully_specified_type\r\n        //     fully_specified_type IDENTIFIER\r\n        //     fully_specified_type IDENTIFIER array_specifier\r\n        //     fully_specified_type IDENTIFIER array_specifier EQUAL initializer\r\n        //     fully_specified_type IDENTIFIER EQUAL initializer\r\n\r\n        // Consume any leading comma, e.g. this is valid: `float, a=1;`\r\n        if self\r\n            .peek(parser)\r\n            .map_or(false, |t| t.value == TokenValue::Comma)\r\n        {\r\n            self.next(parser);\r\n        }\r\n\r\n        loop {\r\n            let token = self.bump(parser)?;\r\n            let name = match token.value {\r\n                TokenValue::Semicolon => break,\r\n                TokenValue::Identifier(name) => name,\r\n                _ => {\r\n                    return Err(Error {\r\n                        kind: ErrorKind::InvalidToken(\r\n                            token.value,\r\n                            vec![ExpectedToken::Identifier, TokenValue::Semicolon.into()],\r\n                        ),\r\n                        meta: token.meta,\r\n                    })\r\n                }\r\n            };\r\n            let mut meta = token.meta;\r\n\r\n            // array_specifier\r\n            // array_specifier EQUAL initializer\r\n            // EQUAL initializer\r\n\r\n            // parse an array specifier if it exists\r\n            // NOTE: unlike other parse methods this one doesn't expect an array specifier and\r\n            // returns Ok(None) rather than an error if there is not one\r\n            self.parse_array_specifier(parser, &mut meta, &mut ty)?;\r\n\r\n            let init = self\r\n                .bump_if(parser, TokenValue::Assign)\r\n                .map::<Result<_>, _>(|_| {\r\n                    let (mut expr, init_meta) =\r\n                        self.parse_initializer(parser, ty, ctx.ctx, ctx.body)?;\r\n\r\n                    let scalar_components = scalar_components(&parser.module.types[ty].inner);\r\n                    if let Some((kind, width)) = scalar_components {\r\n                        ctx.ctx\r\n                            .implicit_conversion(parser, &mut expr, init_meta, kind, width)?;\r\n                    }\r\n\r\n                    meta.subsume(init_meta);\r\n\r\n                    Ok((expr, init_meta))\r\n                })\r\n                .transpose()?;\r\n\r\n            let is_const = ctx.qualifiers.storage.0 == StorageQualifier::Const;\r\n            let maybe_constant = if ctx.external {\r\n                if let Some((root, meta)) = init {\r\n                    match parser.solve_constant(ctx.ctx, root, meta) {\r\n                        Ok(res) => Some(res),\r\n                        // If the declaration is external (global scope) and is constant qualified\r\n                        // then the initializer must be a constant expression\r\n                        Err(err) if is_const => return Err(err),\r\n                        _ => None,\r\n                    }\r\n                } else {\r\n                    None\r\n                }\r\n            } else {\r\n                None\r\n            };\r\n\r\n            let pointer = ctx.add_var(parser, ty, name, maybe_constant, meta)?;\r\n\r\n            if let Some((value, _)) = init.filter(|_| maybe_constant.is_none()) {\r\n                ctx.flush_expressions();\r\n                ctx.body.push(Statement::Store { pointer, value }, meta);\r\n            }\r\n\r\n            let token = self.bump(parser)?;\r\n            match token.value {\r\n                TokenValue::Semicolon => break,\r\n                TokenValue::Comma => {}\r\n                _ => {\r\n                    return Err(Error {\r\n                        kind: ErrorKind::InvalidToken(\r\n                            token.value,\r\n                            vec![TokenValue::Comma.into(), TokenValue::Semicolon.into()],\r\n                        ),\r\n                        meta: token.meta,\r\n                    })\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// `external` whether or not we are in a global or local context\r\n    pub fn parse_declaration(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        external: bool,\r\n    ) -> Result<Option<Span>> {\r\n        //declaration:\r\n        //    function_prototype  SEMICOLON\r\n        //\r\n        //    init_declarator_list SEMICOLON\r\n        //    PRECISION precision_qualifier type_specifier SEMICOLON\r\n        //\r\n        //    type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON\r\n        //    type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON\r\n        //    type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER array_specifier SEMICOLON\r\n        //    type_qualifier SEMICOLON type_qualifier IDENTIFIER SEMICOLON\r\n        //    type_qualifier IDENTIFIER identifier_list SEMICOLON\r\n\r\n        if self.peek_type_qualifier(parser) || self.peek_type_name(parser) {\r\n            let mut qualifiers = self.parse_type_qualifiers(parser)?;\r\n\r\n            if self.peek_type_name(parser) {\r\n                // This branch handles variables and function prototypes and if\r\n                // external is true also function definitions\r\n                let (ty, mut meta) = self.parse_type(parser)?;\r\n\r\n                let token = self.bump(parser)?;\r\n                let token_fallthrough = match token.value {\r\n                    TokenValue::Identifier(name) => match self.expect_peek(parser)?.value {\r\n                        TokenValue::LeftParen => {\r\n                            // This branch handles function definition and prototypes\r\n                            self.bump(parser)?;\r\n\r\n                            let result = ty.map(|ty| FunctionResult { ty, binding: None });\r\n                            let mut body = Block::new();\r\n\r\n                            let mut context = Context::new(parser, &mut body);\r\n\r\n                            self.parse_function_args(parser, &mut context, &mut body)?;\r\n\r\n                            let end_meta = self.expect(parser, TokenValue::RightParen)?.meta;\r\n                            meta.subsume(end_meta);\r\n\r\n                            let token = self.bump(parser)?;\r\n                            return match token.value {\r\n                                TokenValue::Semicolon => {\r\n                                    // This branch handles function prototypes\r\n                                    parser.add_prototype(context, name, result, meta);\r\n\r\n                                    Ok(Some(meta))\r\n                                }\r\n                                TokenValue::LeftBrace if external => {\r\n                                    // This branch handles function definitions\r\n                                    // as you can see by the guard this branch\r\n                                    // only happens if external is also true\r\n\r\n                                    // parse the body\r\n                                    self.parse_compound_statement(\r\n                                        token.meta,\r\n                                        parser,\r\n                                        &mut context,\r\n                                        &mut body,\r\n                                        &mut None,\r\n                                    )?;\r\n\r\n                                    parser.add_function(context, name, result, body, meta);\r\n\r\n                                    Ok(Some(meta))\r\n                                }\r\n                                _ if external => Err(Error {\r\n                                    kind: ErrorKind::InvalidToken(\r\n                                        token.value,\r\n                                        vec![\r\n                                            TokenValue::LeftBrace.into(),\r\n                                            TokenValue::Semicolon.into(),\r\n                                        ],\r\n                                    ),\r\n                                    meta: token.meta,\r\n                                }),\r\n                                _ => Err(Error {\r\n                                    kind: ErrorKind::InvalidToken(\r\n                                        token.value,\r\n                                        vec![TokenValue::Semicolon.into()],\r\n                                    ),\r\n                                    meta: token.meta,\r\n                                }),\r\n                            };\r\n                        }\r\n                        // Pass the token to the init_declarator_list parser\r\n                        _ => Token {\r\n                            value: TokenValue::Identifier(name),\r\n                            meta: token.meta,\r\n                        },\r\n                    },\r\n                    // Pass the token to the init_declarator_list parser\r\n                    _ => token,\r\n                };\r\n\r\n                // If program execution has reached here then this will be a\r\n                // init_declarator_list\r\n                // token_falltrough will have a token that was already bumped\r\n                if let Some(ty) = ty {\r\n                    let mut ctx = DeclarationContext {\r\n                        qualifiers,\r\n                        external,\r\n                        ctx,\r\n                        body,\r\n                    };\r\n\r\n                    self.backtrack(token_fallthrough)?;\r\n                    self.parse_init_declarator_list(parser, ty, &mut ctx)?;\r\n                } else {\r\n                    parser.errors.push(Error {\r\n                        kind: ErrorKind::SemanticError(\"Declaration cannot have void type\".into()),\r\n                        meta,\r\n                    })\r\n                }\r\n\r\n                Ok(Some(meta))\r\n            } else {\r\n                // This branch handles struct definitions and modifiers like\r\n                // ```glsl\r\n                // layout(early_fragment_tests);\r\n                // ```\r\n                let token = self.bump(parser)?;\r\n                match token.value {\r\n                    TokenValue::Identifier(ty_name) => {\r\n                        if self.bump_if(parser, TokenValue::LeftBrace).is_some() {\r\n                            self.parse_block_declaration(\r\n                                parser,\r\n                                ctx,\r\n                                body,\r\n                                &mut qualifiers,\r\n                                ty_name,\r\n                                token.meta,\r\n                            )\r\n                            .map(Some)\r\n                        } else {\r\n                            if qualifiers.invariant.take().is_some() {\r\n                                parser.make_variable_invariant(ctx, body, &ty_name, token.meta);\r\n\r\n                                qualifiers.unused_errors(&mut parser.errors);\r\n                                self.expect(parser, TokenValue::Semicolon)?;\r\n                                return Ok(Some(qualifiers.span));\r\n                            }\r\n\r\n                            //TODO: declaration\r\n                            // type_qualifier IDENTIFIER SEMICOLON\r\n                            // type_qualifier IDENTIFIER identifier_list SEMICOLON\r\n                            Err(Error {\r\n                                kind: ErrorKind::NotImplemented(\"variable qualifier\"),\r\n                                meta: token.meta,\r\n                            })\r\n                        }\r\n                    }\r\n                    TokenValue::Semicolon => {\r\n                        if let Some(value) =\r\n                            qualifiers.uint_layout_qualifier(\"local_size_x\", &mut parser.errors)\r\n                        {\r\n                            parser.meta.workgroup_size[0] = value;\r\n                        }\r\n                        if let Some(value) =\r\n                            qualifiers.uint_layout_qualifier(\"local_size_y\", &mut parser.errors)\r\n                        {\r\n                            parser.meta.workgroup_size[1] = value;\r\n                        }\r\n                        if let Some(value) =\r\n                            qualifiers.uint_layout_qualifier(\"local_size_z\", &mut parser.errors)\r\n                        {\r\n                            parser.meta.workgroup_size[2] = value;\r\n                        }\r\n\r\n                        parser.meta.early_fragment_tests |= qualifiers\r\n                            .none_layout_qualifier(\"early_fragment_tests\", &mut parser.errors);\r\n\r\n                        qualifiers.unused_errors(&mut parser.errors);\r\n\r\n                        Ok(Some(qualifiers.span))\r\n                    }\r\n                    _ => Err(Error {\r\n                        kind: ErrorKind::InvalidToken(\r\n                            token.value,\r\n                            vec![ExpectedToken::Identifier, TokenValue::Semicolon.into()],\r\n                        ),\r\n                        meta: token.meta,\r\n                    }),\r\n                }\r\n            }\r\n        } else {\r\n            match self.peek(parser).map(|t| &t.value) {\r\n                Some(&TokenValue::Precision) => {\r\n                    // PRECISION precision_qualifier type_specifier SEMICOLON\r\n                    self.bump(parser)?;\r\n\r\n                    let token = self.bump(parser)?;\r\n                    let _ = match token.value {\r\n                        TokenValue::PrecisionQualifier(p) => p,\r\n                        _ => {\r\n                            return Err(Error {\r\n                                kind: ErrorKind::InvalidToken(\r\n                                    token.value,\r\n                                    vec![\r\n                                        TokenValue::PrecisionQualifier(Precision::High).into(),\r\n                                        TokenValue::PrecisionQualifier(Precision::Medium).into(),\r\n                                        TokenValue::PrecisionQualifier(Precision::Low).into(),\r\n                                    ],\r\n                                ),\r\n                                meta: token.meta,\r\n                            })\r\n                        }\r\n                    };\r\n\r\n                    let (ty, meta) = self.parse_type_non_void(parser)?;\r\n\r\n                    match parser.module.types[ty].inner {\r\n                        TypeInner::Scalar {\r\n                            kind: ScalarKind::Float | ScalarKind::Sint,\r\n                            ..\r\n                        } => {}\r\n                        _ => parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Precision statement can only work on floats and ints\".into(),\r\n                            ),\r\n                            meta,\r\n                        }),\r\n                    }\r\n\r\n                    self.expect(parser, TokenValue::Semicolon)?;\r\n\r\n                    Ok(Some(meta))\r\n                }\r\n                _ => Ok(None),\r\n            }\r\n        }\r\n    }\r\n\r\n    pub fn parse_block_declaration(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        qualifiers: &mut TypeQualifiers,\r\n        ty_name: String,\r\n        mut meta: Span,\r\n    ) -> Result<Span> {\r\n        let layout = match qualifiers.layout_qualifiers.remove(&QualifierKey::Layout) {\r\n            Some((QualifierValue::Layout(l), _)) => l,\r\n            None => {\r\n                if let StorageQualifier::AddressSpace(AddressSpace::Storage { .. }) =\r\n                    qualifiers.storage.0\r\n                {\r\n                    StructLayout::Std430\r\n                } else {\r\n                    StructLayout::Std140\r\n                }\r\n            }\r\n            _ => unreachable!(),\r\n        };\r\n\r\n        let mut members = Vec::new();\r\n        let span = self.parse_struct_declaration_list(parser, &mut members, layout)?;\r\n        self.expect(parser, TokenValue::RightBrace)?;\r\n\r\n        let mut ty = parser.module.types.insert(\r\n            Type {\r\n                name: Some(ty_name),\r\n                inner: TypeInner::Struct {\r\n                    members: members.clone(),\r\n                    span,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let token = self.bump(parser)?;\r\n        let name = match token.value {\r\n            TokenValue::Semicolon => None,\r\n            TokenValue::Identifier(name) => {\r\n                self.parse_array_specifier(parser, &mut meta, &mut ty)?;\r\n\r\n                self.expect(parser, TokenValue::Semicolon)?;\r\n\r\n                Some(name)\r\n            }\r\n            _ => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::InvalidToken(\r\n                        token.value,\r\n                        vec![ExpectedToken::Identifier, TokenValue::Semicolon.into()],\r\n                    ),\r\n                    meta: token.meta,\r\n                })\r\n            }\r\n        };\r\n\r\n        let global = parser.add_global_var(\r\n            ctx,\r\n            body,\r\n            VarDeclaration {\r\n                qualifiers,\r\n                ty,\r\n                name,\r\n                init: None,\r\n                meta,\r\n            },\r\n        )?;\r\n\r\n        for (i, k, ty) in members.into_iter().enumerate().filter_map(|(i, m)| {\r\n            let ty = m.ty;\r\n            m.name.map(|s| (i as u32, s, ty))\r\n        }) {\r\n            let lookup = GlobalLookup {\r\n                kind: match global {\r\n                    GlobalOrConstant::Global(handle) => GlobalLookupKind::BlockSelect(handle, i),\r\n                    GlobalOrConstant::Constant(handle) => GlobalLookupKind::Constant(handle, ty),\r\n                },\r\n                entry_arg: None,\r\n                mutable: true,\r\n            };\r\n            ctx.add_global(parser, &k, lookup, body);\r\n\r\n            parser.global_variables.push((k, lookup));\r\n        }\r\n\r\n        Ok(meta)\r\n    }\r\n\r\n    // TODO: Accept layout arguments\r\n    pub fn parse_struct_declaration_list(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        members: &mut Vec<StructMember>,\r\n        layout: StructLayout,\r\n    ) -> Result<u32> {\r\n        let mut span = 0;\r\n        let mut align = Alignment::ONE;\r\n\r\n        loop {\r\n            // TODO: type_qualifier\r\n\r\n            let (mut ty, mut meta) = self.parse_type_non_void(parser)?;\r\n            let (name, end_meta) = self.expect_ident(parser)?;\r\n\r\n            meta.subsume(end_meta);\r\n\r\n            self.parse_array_specifier(parser, &mut meta, &mut ty)?;\r\n\r\n            self.expect(parser, TokenValue::Semicolon)?;\r\n\r\n            let info = offset::calculate_offset(\r\n                ty,\r\n                meta,\r\n                layout,\r\n                &mut parser.module.types,\r\n                &parser.module.constants,\r\n                &mut parser.errors,\r\n            );\r\n\r\n            let member_alignment = info.align;\r\n            span = member_alignment.round_up(span);\r\n            align = member_alignment.max(align);\r\n\r\n            members.push(StructMember {\r\n                name: Some(name),\r\n                ty: info.ty,\r\n                binding: None,\r\n                offset: span,\r\n            });\r\n\r\n            span += info.span;\r\n\r\n            if let TokenValue::RightBrace = self.expect_peek(parser)?.value {\r\n                break;\r\n            }\r\n        }\r\n\r\n        span = align.round_up(span);\r\n\r\n        Ok(span)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/parser/expressions.rs",
    "content": "use crate::{\r\n    front::glsl::{\r\n        ast::{FunctionCall, FunctionCallKind, HirExpr, HirExprKind},\r\n        context::{Context, StmtContext},\r\n        error::{ErrorKind, ExpectedToken},\r\n        parser::ParsingContext,\r\n        token::{Token, TokenValue},\r\n        Error, Parser, Result, Span,\r\n    },\r\n    ArraySize, BinaryOperator, Block, Constant, ConstantInner, Handle, ScalarValue, Type,\r\n    TypeInner, UnaryOperator,\r\n};\r\n\r\nimpl<'source> ParsingContext<'source> {\r\n    pub fn parse_primary(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        let mut token = self.bump(parser)?;\r\n\r\n        let (width, value) = match token.value {\r\n            TokenValue::IntConstant(int) => (\r\n                (int.width / 8) as u8,\r\n                if int.signed {\r\n                    ScalarValue::Sint(int.value as i64)\r\n                } else {\r\n                    ScalarValue::Uint(int.value)\r\n                },\r\n            ),\r\n            TokenValue::FloatConstant(float) => (\r\n                (float.width / 8) as u8,\r\n                ScalarValue::Float(float.value as f64),\r\n            ),\r\n            TokenValue::BoolConstant(value) => (1, ScalarValue::Bool(value)),\r\n            TokenValue::LeftParen => {\r\n                let expr = self.parse_expression(parser, ctx, stmt, body)?;\r\n                let meta = self.expect(parser, TokenValue::RightParen)?.meta;\r\n\r\n                token.meta.subsume(meta);\r\n\r\n                return Ok(expr);\r\n            }\r\n            _ => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::InvalidToken(\r\n                        token.value,\r\n                        vec![\r\n                            TokenValue::LeftParen.into(),\r\n                            ExpectedToken::IntLiteral,\r\n                            ExpectedToken::FloatLiteral,\r\n                            ExpectedToken::BoolLiteral,\r\n                        ],\r\n                    ),\r\n                    meta: token.meta,\r\n                });\r\n            }\r\n        };\r\n\r\n        let handle = parser.module.constants.fetch_or_append(\r\n            Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Scalar { width, value },\r\n            },\r\n            token.meta,\r\n        );\r\n\r\n        Ok(stmt.hir_exprs.append(\r\n            HirExpr {\r\n                kind: HirExprKind::Constant(handle),\r\n                meta: token.meta,\r\n            },\r\n            Default::default(),\r\n        ))\r\n    }\r\n\r\n    pub fn parse_function_call_args(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n        meta: &mut Span,\r\n    ) -> Result<Vec<Handle<HirExpr>>> {\r\n        let mut args = Vec::new();\r\n        if let Some(token) = self.bump_if(parser, TokenValue::RightParen) {\r\n            meta.subsume(token.meta);\r\n        } else {\r\n            loop {\r\n                args.push(self.parse_assignment(parser, ctx, stmt, body)?);\r\n\r\n                let token = self.bump(parser)?;\r\n                match token.value {\r\n                    TokenValue::Comma => {}\r\n                    TokenValue::RightParen => {\r\n                        meta.subsume(token.meta);\r\n                        break;\r\n                    }\r\n                    _ => {\r\n                        return Err(Error {\r\n                            kind: ErrorKind::InvalidToken(\r\n                                token.value,\r\n                                vec![TokenValue::Comma.into(), TokenValue::RightParen.into()],\r\n                            ),\r\n                            meta: token.meta,\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(args)\r\n    }\r\n\r\n    pub fn parse_postfix(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        let mut base = if self.peek_type_name(parser) {\r\n            let (mut handle, mut meta) = self.parse_type_non_void(parser)?;\r\n\r\n            self.expect(parser, TokenValue::LeftParen)?;\r\n            let args = self.parse_function_call_args(parser, ctx, stmt, body, &mut meta)?;\r\n\r\n            if let TypeInner::Array {\r\n                size: ArraySize::Dynamic,\r\n                stride,\r\n                base,\r\n            } = parser.module.types[handle].inner\r\n            {\r\n                let span = parser.module.types.get_span(handle);\r\n\r\n                let constant = parser.module.constants.fetch_or_append(\r\n                    Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner: ConstantInner::Scalar {\r\n                            width: 4,\r\n                            value: ScalarValue::Uint(args.len() as u64),\r\n                        },\r\n                    },\r\n                    Span::default(),\r\n                );\r\n                handle = parser.module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: TypeInner::Array {\r\n                            stride,\r\n                            base,\r\n                            size: ArraySize::Constant(constant),\r\n                        },\r\n                    },\r\n                    span,\r\n                )\r\n            }\r\n\r\n            stmt.hir_exprs.append(\r\n                HirExpr {\r\n                    kind: HirExprKind::Call(FunctionCall {\r\n                        kind: FunctionCallKind::TypeConstructor(handle),\r\n                        args,\r\n                    }),\r\n                    meta,\r\n                },\r\n                Default::default(),\r\n            )\r\n        } else if let TokenValue::Identifier(_) = self.expect_peek(parser)?.value {\r\n            let (name, mut meta) = self.expect_ident(parser)?;\r\n\r\n            let expr = if self.bump_if(parser, TokenValue::LeftParen).is_some() {\r\n                let args = self.parse_function_call_args(parser, ctx, stmt, body, &mut meta)?;\r\n\r\n                let kind = match parser.lookup_type.get(&name) {\r\n                    Some(ty) => FunctionCallKind::TypeConstructor(*ty),\r\n                    None => FunctionCallKind::Function(name),\r\n                };\r\n\r\n                HirExpr {\r\n                    kind: HirExprKind::Call(FunctionCall { kind, args }),\r\n                    meta,\r\n                }\r\n            } else {\r\n                let var = match parser.lookup_variable(ctx, body, &name, meta) {\r\n                    Some(var) => var,\r\n                    None => {\r\n                        return Err(Error {\r\n                            kind: ErrorKind::UnknownVariable(name),\r\n                            meta,\r\n                        })\r\n                    }\r\n                };\r\n\r\n                HirExpr {\r\n                    kind: HirExprKind::Variable(var),\r\n                    meta,\r\n                }\r\n            };\r\n\r\n            stmt.hir_exprs.append(expr, Default::default())\r\n        } else {\r\n            self.parse_primary(parser, ctx, stmt, body)?\r\n        };\r\n\r\n        while let TokenValue::LeftBracket\r\n        | TokenValue::Dot\r\n        | TokenValue::Increment\r\n        | TokenValue::Decrement = self.expect_peek(parser)?.value\r\n        {\r\n            let Token { value, mut meta } = self.bump(parser)?;\r\n\r\n            match value {\r\n                TokenValue::LeftBracket => {\r\n                    let index = self.parse_expression(parser, ctx, stmt, body)?;\r\n                    let end_meta = self.expect(parser, TokenValue::RightBracket)?.meta;\r\n\r\n                    meta.subsume(end_meta);\r\n                    base = stmt.hir_exprs.append(\r\n                        HirExpr {\r\n                            kind: HirExprKind::Access { base, index },\r\n                            meta,\r\n                        },\r\n                        Default::default(),\r\n                    )\r\n                }\r\n                TokenValue::Dot => {\r\n                    let (field, end_meta) = self.expect_ident(parser)?;\r\n\r\n                    if self.bump_if(parser, TokenValue::LeftParen).is_some() {\r\n                        let args =\r\n                            self.parse_function_call_args(parser, ctx, stmt, body, &mut meta)?;\r\n\r\n                        base = stmt.hir_exprs.append(\r\n                            HirExpr {\r\n                                kind: HirExprKind::Method {\r\n                                    expr: base,\r\n                                    name: field,\r\n                                    args,\r\n                                },\r\n                                meta,\r\n                            },\r\n                            Default::default(),\r\n                        );\r\n                        continue;\r\n                    }\r\n\r\n                    meta.subsume(end_meta);\r\n                    base = stmt.hir_exprs.append(\r\n                        HirExpr {\r\n                            kind: HirExprKind::Select { base, field },\r\n                            meta,\r\n                        },\r\n                        Default::default(),\r\n                    )\r\n                }\r\n                TokenValue::Increment | TokenValue::Decrement => {\r\n                    base = stmt.hir_exprs.append(\r\n                        HirExpr {\r\n                            kind: HirExprKind::PrePostfix {\r\n                                op: match value {\r\n                                    TokenValue::Increment => crate::BinaryOperator::Add,\r\n                                    _ => crate::BinaryOperator::Subtract,\r\n                                },\r\n                                postfix: true,\r\n                                expr: base,\r\n                            },\r\n                            meta,\r\n                        },\r\n                        Default::default(),\r\n                    )\r\n                }\r\n                _ => unreachable!(),\r\n            }\r\n        }\r\n\r\n        Ok(base)\r\n    }\r\n\r\n    pub fn parse_unary(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        Ok(match self.expect_peek(parser)?.value {\r\n            TokenValue::Plus | TokenValue::Dash | TokenValue::Bang | TokenValue::Tilde => {\r\n                let Token { value, mut meta } = self.bump(parser)?;\r\n\r\n                let expr = self.parse_unary(parser, ctx, stmt, body)?;\r\n                let end_meta = stmt.hir_exprs[expr].meta;\r\n\r\n                let kind = match value {\r\n                    TokenValue::Dash => HirExprKind::Unary {\r\n                        op: UnaryOperator::Negate,\r\n                        expr,\r\n                    },\r\n                    TokenValue::Bang | TokenValue::Tilde => HirExprKind::Unary {\r\n                        op: UnaryOperator::Not,\r\n                        expr,\r\n                    },\r\n                    _ => return Ok(expr),\r\n                };\r\n\r\n                meta.subsume(end_meta);\r\n                stmt.hir_exprs\r\n                    .append(HirExpr { kind, meta }, Default::default())\r\n            }\r\n            TokenValue::Increment | TokenValue::Decrement => {\r\n                let Token { value, meta } = self.bump(parser)?;\r\n\r\n                let expr = self.parse_unary(parser, ctx, stmt, body)?;\r\n\r\n                stmt.hir_exprs.append(\r\n                    HirExpr {\r\n                        kind: HirExprKind::PrePostfix {\r\n                            op: match value {\r\n                                TokenValue::Increment => crate::BinaryOperator::Add,\r\n                                _ => crate::BinaryOperator::Subtract,\r\n                            },\r\n                            postfix: false,\r\n                            expr,\r\n                        },\r\n                        meta,\r\n                    },\r\n                    Default::default(),\r\n                )\r\n            }\r\n            _ => self.parse_postfix(parser, ctx, stmt, body)?,\r\n        })\r\n    }\r\n\r\n    pub fn parse_binary(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n        passtrough: Option<Handle<HirExpr>>,\r\n        min_bp: u8,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        let mut left = passtrough\r\n            .ok_or(ErrorKind::EndOfFile /* Dummy error */)\r\n            .or_else(|_| self.parse_unary(parser, ctx, stmt, body))?;\r\n        let mut meta = stmt.hir_exprs[left].meta;\r\n\r\n        while let Some((l_bp, r_bp)) = binding_power(&self.expect_peek(parser)?.value) {\r\n            if l_bp < min_bp {\r\n                break;\r\n            }\r\n\r\n            let Token { value, .. } = self.bump(parser)?;\r\n\r\n            let right = self.parse_binary(parser, ctx, stmt, body, None, r_bp)?;\r\n            let end_meta = stmt.hir_exprs[right].meta;\r\n\r\n            meta.subsume(end_meta);\r\n            left = stmt.hir_exprs.append(\r\n                HirExpr {\r\n                    kind: HirExprKind::Binary {\r\n                        left,\r\n                        op: match value {\r\n                            TokenValue::LogicalOr => BinaryOperator::LogicalOr,\r\n                            TokenValue::LogicalXor => BinaryOperator::NotEqual,\r\n                            TokenValue::LogicalAnd => BinaryOperator::LogicalAnd,\r\n                            TokenValue::VerticalBar => BinaryOperator::InclusiveOr,\r\n                            TokenValue::Caret => BinaryOperator::ExclusiveOr,\r\n                            TokenValue::Ampersand => BinaryOperator::And,\r\n                            TokenValue::Equal => BinaryOperator::Equal,\r\n                            TokenValue::NotEqual => BinaryOperator::NotEqual,\r\n                            TokenValue::GreaterEqual => BinaryOperator::GreaterEqual,\r\n                            TokenValue::LessEqual => BinaryOperator::LessEqual,\r\n                            TokenValue::LeftAngle => BinaryOperator::Less,\r\n                            TokenValue::RightAngle => BinaryOperator::Greater,\r\n                            TokenValue::LeftShift => BinaryOperator::ShiftLeft,\r\n                            TokenValue::RightShift => BinaryOperator::ShiftRight,\r\n                            TokenValue::Plus => BinaryOperator::Add,\r\n                            TokenValue::Dash => BinaryOperator::Subtract,\r\n                            TokenValue::Star => BinaryOperator::Multiply,\r\n                            TokenValue::Slash => BinaryOperator::Divide,\r\n                            TokenValue::Percent => BinaryOperator::Modulo,\r\n                            _ => unreachable!(),\r\n                        },\r\n                        right,\r\n                    },\r\n                    meta,\r\n                },\r\n                Default::default(),\r\n            )\r\n        }\r\n\r\n        Ok(left)\r\n    }\r\n\r\n    pub fn parse_conditional(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n        passtrough: Option<Handle<HirExpr>>,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        let mut condition = self.parse_binary(parser, ctx, stmt, body, passtrough, 0)?;\r\n        let mut meta = stmt.hir_exprs[condition].meta;\r\n\r\n        if self.bump_if(parser, TokenValue::Question).is_some() {\r\n            let accept = self.parse_expression(parser, ctx, stmt, body)?;\r\n            self.expect(parser, TokenValue::Colon)?;\r\n            let reject = self.parse_assignment(parser, ctx, stmt, body)?;\r\n            let end_meta = stmt.hir_exprs[reject].meta;\r\n\r\n            meta.subsume(end_meta);\r\n            condition = stmt.hir_exprs.append(\r\n                HirExpr {\r\n                    kind: HirExprKind::Conditional {\r\n                        condition,\r\n                        accept,\r\n                        reject,\r\n                    },\r\n                    meta,\r\n                },\r\n                Default::default(),\r\n            )\r\n        }\r\n\r\n        Ok(condition)\r\n    }\r\n\r\n    pub fn parse_assignment(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        let tgt = self.parse_unary(parser, ctx, stmt, body)?;\r\n        let mut meta = stmt.hir_exprs[tgt].meta;\r\n\r\n        Ok(match self.expect_peek(parser)?.value {\r\n            TokenValue::Assign => {\r\n                self.bump(parser)?;\r\n                let value = self.parse_assignment(parser, ctx, stmt, body)?;\r\n                let end_meta = stmt.hir_exprs[value].meta;\r\n\r\n                meta.subsume(end_meta);\r\n                stmt.hir_exprs.append(\r\n                    HirExpr {\r\n                        kind: HirExprKind::Assign { tgt, value },\r\n                        meta,\r\n                    },\r\n                    Default::default(),\r\n                )\r\n            }\r\n            TokenValue::OrAssign\r\n            | TokenValue::AndAssign\r\n            | TokenValue::AddAssign\r\n            | TokenValue::DivAssign\r\n            | TokenValue::ModAssign\r\n            | TokenValue::SubAssign\r\n            | TokenValue::MulAssign\r\n            | TokenValue::LeftShiftAssign\r\n            | TokenValue::RightShiftAssign\r\n            | TokenValue::XorAssign => {\r\n                let token = self.bump(parser)?;\r\n                let right = self.parse_assignment(parser, ctx, stmt, body)?;\r\n                let end_meta = stmt.hir_exprs[right].meta;\r\n\r\n                meta.subsume(end_meta);\r\n                let value = stmt.hir_exprs.append(\r\n                    HirExpr {\r\n                        meta,\r\n                        kind: HirExprKind::Binary {\r\n                            left: tgt,\r\n                            op: match token.value {\r\n                                TokenValue::OrAssign => BinaryOperator::InclusiveOr,\r\n                                TokenValue::AndAssign => BinaryOperator::And,\r\n                                TokenValue::AddAssign => BinaryOperator::Add,\r\n                                TokenValue::DivAssign => BinaryOperator::Divide,\r\n                                TokenValue::ModAssign => BinaryOperator::Modulo,\r\n                                TokenValue::SubAssign => BinaryOperator::Subtract,\r\n                                TokenValue::MulAssign => BinaryOperator::Multiply,\r\n                                TokenValue::LeftShiftAssign => BinaryOperator::ShiftLeft,\r\n                                TokenValue::RightShiftAssign => BinaryOperator::ShiftRight,\r\n                                TokenValue::XorAssign => BinaryOperator::ExclusiveOr,\r\n                                _ => unreachable!(),\r\n                            },\r\n                            right,\r\n                        },\r\n                    },\r\n                    Default::default(),\r\n                );\r\n\r\n                stmt.hir_exprs.append(\r\n                    HirExpr {\r\n                        kind: HirExprKind::Assign { tgt, value },\r\n                        meta,\r\n                    },\r\n                    Default::default(),\r\n                )\r\n            }\r\n            _ => self.parse_conditional(parser, ctx, stmt, body, Some(tgt))?,\r\n        })\r\n    }\r\n\r\n    pub fn parse_expression(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        stmt: &mut StmtContext,\r\n        body: &mut Block,\r\n    ) -> Result<Handle<HirExpr>> {\r\n        let mut expr = self.parse_assignment(parser, ctx, stmt, body)?;\r\n\r\n        while let TokenValue::Comma = self.expect_peek(parser)?.value {\r\n            self.bump(parser)?;\r\n            expr = self.parse_assignment(parser, ctx, stmt, body)?;\r\n        }\r\n\r\n        Ok(expr)\r\n    }\r\n}\r\n\r\nconst fn binding_power(value: &TokenValue) -> Option<(u8, u8)> {\r\n    Some(match *value {\r\n        TokenValue::LogicalOr => (1, 2),\r\n        TokenValue::LogicalXor => (3, 4),\r\n        TokenValue::LogicalAnd => (5, 6),\r\n        TokenValue::VerticalBar => (7, 8),\r\n        TokenValue::Caret => (9, 10),\r\n        TokenValue::Ampersand => (11, 12),\r\n        TokenValue::Equal | TokenValue::NotEqual => (13, 14),\r\n        TokenValue::GreaterEqual\r\n        | TokenValue::LessEqual\r\n        | TokenValue::LeftAngle\r\n        | TokenValue::RightAngle => (15, 16),\r\n        TokenValue::LeftShift | TokenValue::RightShift => (17, 18),\r\n        TokenValue::Plus | TokenValue::Dash => (19, 20),\r\n        TokenValue::Star | TokenValue::Slash | TokenValue::Percent => (21, 22),\r\n        _ => return None,\r\n    })\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/parser/functions.rs",
    "content": "use crate::front::glsl::context::ExprPos;\r\nuse crate::front::glsl::Span;\r\nuse crate::{\r\n    front::glsl::{\r\n        ast::ParameterQualifier,\r\n        context::Context,\r\n        parser::ParsingContext,\r\n        token::{Token, TokenValue},\r\n        variables::VarDeclaration,\r\n        Error, ErrorKind, Parser, Result,\r\n    },\r\n    Block, ConstantInner, Expression, ScalarValue, Statement, SwitchCase, UnaryOperator,\r\n};\r\n\r\nimpl<'source> ParsingContext<'source> {\r\n    pub fn peek_parameter_qualifier(&mut self, parser: &mut Parser) -> bool {\r\n        self.peek(parser).map_or(false, |t| match t.value {\r\n            TokenValue::In | TokenValue::Out | TokenValue::InOut | TokenValue::Const => true,\r\n            _ => false,\r\n        })\r\n    }\r\n\r\n    /// Returns the parsed `ParameterQualifier` or `ParameterQualifier::In`\r\n    pub fn parse_parameter_qualifier(&mut self, parser: &mut Parser) -> ParameterQualifier {\r\n        if self.peek_parameter_qualifier(parser) {\r\n            match self.bump(parser).unwrap().value {\r\n                TokenValue::In => ParameterQualifier::In,\r\n                TokenValue::Out => ParameterQualifier::Out,\r\n                TokenValue::InOut => ParameterQualifier::InOut,\r\n                TokenValue::Const => ParameterQualifier::Const,\r\n                _ => unreachable!(),\r\n            }\r\n        } else {\r\n            ParameterQualifier::In\r\n        }\r\n    }\r\n\r\n    pub fn parse_statement(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        terminator: &mut Option<usize>,\r\n    ) -> Result<Option<Span>> {\r\n        // Type qualifiers always identify a declaration statement\r\n        if self.peek_type_qualifier(parser) {\r\n            return self.parse_declaration(parser, ctx, body, false);\r\n        }\r\n\r\n        // Type names can identify either declaration statements or type constructors\r\n        // depending on wether the token following the type name is a `(` (LeftParen)\r\n        if self.peek_type_name(parser) {\r\n            // Start by consuming the type name so that we can peek the token after it\r\n            let token = self.bump(parser)?;\r\n            // Peek the next token and check if it's a `(` (LeftParen) if so the statement\r\n            // is a constructor, otherwise it's a declaration. We need to do the check\r\n            // beforehand and not in the if since we will backtrack before the if\r\n            let declaration = TokenValue::LeftParen != self.expect_peek(parser)?.value;\r\n\r\n            self.backtrack(token)?;\r\n\r\n            if declaration {\r\n                return self.parse_declaration(parser, ctx, body, false);\r\n            }\r\n        }\r\n\r\n        let new_break = || {\r\n            let mut block = Block::new();\r\n            block.push(Statement::Break, crate::Span::default());\r\n            block\r\n        };\r\n\r\n        let &Token {\r\n            ref value,\r\n            mut meta,\r\n        } = self.expect_peek(parser)?;\r\n\r\n        let meta_rest = match *value {\r\n            TokenValue::Continue => {\r\n                let meta = self.bump(parser)?.meta;\r\n                body.push(Statement::Continue, meta);\r\n                terminator.get_or_insert(body.len());\r\n                self.expect(parser, TokenValue::Semicolon)?.meta\r\n            }\r\n            TokenValue::Break => {\r\n                let meta = self.bump(parser)?.meta;\r\n                body.push(Statement::Break, meta);\r\n                terminator.get_or_insert(body.len());\r\n                self.expect(parser, TokenValue::Semicolon)?.meta\r\n            }\r\n            TokenValue::Return => {\r\n                self.bump(parser)?;\r\n                let (value, meta) = match self.expect_peek(parser)?.value {\r\n                    TokenValue::Semicolon => (None, self.bump(parser)?.meta),\r\n                    _ => {\r\n                        // TODO: Implicit conversions\r\n                        let mut stmt = ctx.stmt_ctx();\r\n                        let expr = self.parse_expression(parser, ctx, &mut stmt, body)?;\r\n                        self.expect(parser, TokenValue::Semicolon)?;\r\n                        let (handle, meta) =\r\n                            ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?;\r\n                        (Some(handle), meta)\r\n                    }\r\n                };\r\n\r\n                ctx.emit_restart(body);\r\n\r\n                body.push(Statement::Return { value }, meta);\r\n                terminator.get_or_insert(body.len());\r\n\r\n                meta\r\n            }\r\n            TokenValue::Discard => {\r\n                let meta = self.bump(parser)?.meta;\r\n                body.push(Statement::Kill, meta);\r\n                terminator.get_or_insert(body.len());\r\n\r\n                self.expect(parser, TokenValue::Semicolon)?.meta\r\n            }\r\n            TokenValue::If => {\r\n                let mut meta = self.bump(parser)?.meta;\r\n\r\n                self.expect(parser, TokenValue::LeftParen)?;\r\n                let condition = {\r\n                    let mut stmt = ctx.stmt_ctx();\r\n                    let expr = self.parse_expression(parser, ctx, &mut stmt, body)?;\r\n                    let (handle, more_meta) =\r\n                        ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?;\r\n                    meta.subsume(more_meta);\r\n                    handle\r\n                };\r\n                self.expect(parser, TokenValue::RightParen)?;\r\n\r\n                ctx.emit_restart(body);\r\n\r\n                let mut accept = Block::new();\r\n                if let Some(more_meta) =\r\n                    self.parse_statement(parser, ctx, &mut accept, &mut None)?\r\n                {\r\n                    meta.subsume(more_meta)\r\n                }\r\n\r\n                let mut reject = Block::new();\r\n                if self.bump_if(parser, TokenValue::Else).is_some() {\r\n                    if let Some(more_meta) =\r\n                        self.parse_statement(parser, ctx, &mut reject, &mut None)?\r\n                    {\r\n                        meta.subsume(more_meta);\r\n                    }\r\n                }\r\n\r\n                body.push(\r\n                    Statement::If {\r\n                        condition,\r\n                        accept,\r\n                        reject,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                meta\r\n            }\r\n            TokenValue::Switch => {\r\n                let mut meta = self.bump(parser)?.meta;\r\n                let end_meta;\r\n\r\n                self.expect(parser, TokenValue::LeftParen)?;\r\n\r\n                let selector = {\r\n                    let mut stmt = ctx.stmt_ctx();\r\n                    let expr = self.parse_expression(parser, ctx, &mut stmt, body)?;\r\n                    ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?.0\r\n                };\r\n\r\n                self.expect(parser, TokenValue::RightParen)?;\r\n\r\n                ctx.emit_restart(body);\r\n\r\n                let mut cases = Vec::new();\r\n                // Track if any default case is present in the switch statement.\r\n                let mut default_present = false;\r\n\r\n                self.expect(parser, TokenValue::LeftBrace)?;\r\n                loop {\r\n                    let value = match self.expect_peek(parser)?.value {\r\n                        TokenValue::Case => {\r\n                            self.bump(parser)?;\r\n                            let value = {\r\n                                let mut stmt = ctx.stmt_ctx();\r\n                                let expr = self.parse_expression(parser, ctx, &mut stmt, body)?;\r\n                                let (root, meta) =\r\n                                    ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?;\r\n                                let constant = parser.solve_constant(ctx, root, meta)?;\r\n\r\n                                match parser.module.constants[constant].inner {\r\n                                    ConstantInner::Scalar {\r\n                                        value: ScalarValue::Sint(int),\r\n                                        ..\r\n                                    } => int as i32,\r\n                                    ConstantInner::Scalar {\r\n                                        value: ScalarValue::Uint(int),\r\n                                        ..\r\n                                    } => int as i32,\r\n                                    _ => {\r\n                                        parser.errors.push(Error {\r\n                                            kind: ErrorKind::SemanticError(\r\n                                                \"Case values can only be integers\".into(),\r\n                                            ),\r\n                                            meta,\r\n                                        });\r\n\r\n                                        0\r\n                                    }\r\n                                }\r\n                            };\r\n                            crate::SwitchValue::Integer(value)\r\n                        }\r\n                        TokenValue::Default => {\r\n                            self.bump(parser)?;\r\n                            default_present = true;\r\n                            crate::SwitchValue::Default\r\n                        }\r\n                        TokenValue::RightBrace => {\r\n                            end_meta = self.bump(parser)?.meta;\r\n                            break;\r\n                        }\r\n                        _ => {\r\n                            let Token { value, meta } = self.bump(parser)?;\r\n                            return Err(Error {\r\n                                kind: ErrorKind::InvalidToken(\r\n                                    value,\r\n                                    vec![\r\n                                        TokenValue::Case.into(),\r\n                                        TokenValue::Default.into(),\r\n                                        TokenValue::RightBrace.into(),\r\n                                    ],\r\n                                ),\r\n                                meta,\r\n                            });\r\n                        }\r\n                    };\r\n\r\n                    self.expect(parser, TokenValue::Colon)?;\r\n\r\n                    let mut body = Block::new();\r\n\r\n                    let mut case_terminator = None;\r\n                    loop {\r\n                        match self.expect_peek(parser)?.value {\r\n                            TokenValue::Case | TokenValue::Default | TokenValue::RightBrace => {\r\n                                break\r\n                            }\r\n                            _ => {\r\n                                self.parse_statement(parser, ctx, &mut body, &mut case_terminator)?;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    let mut fall_through = true;\r\n\r\n                    if let Some(mut idx) = case_terminator {\r\n                        if let Statement::Break = body[idx - 1] {\r\n                            fall_through = false;\r\n                            idx -= 1;\r\n                        }\r\n\r\n                        body.cull(idx..)\r\n                    }\r\n\r\n                    cases.push(SwitchCase {\r\n                        value,\r\n                        body,\r\n                        fall_through,\r\n                    })\r\n                }\r\n\r\n                meta.subsume(end_meta);\r\n\r\n                // NOTE: do not unwrap here since a switch statement isn't required\r\n                // to have any cases.\r\n                if let Some(case) = cases.last_mut() {\r\n                    // GLSL requires that the last case not be empty, so we check\r\n                    // that here and produce an error otherwise (fall_trough must\r\n                    // also be checked because `break`s count as statements but\r\n                    // they aren't added to the body)\r\n                    if case.body.is_empty() && case.fall_through {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"last case/default label must be followed by statements\".into(),\r\n                            ),\r\n                            meta,\r\n                        })\r\n                    }\r\n\r\n                    // GLSL allows the last case to not have any `break` statement,\r\n                    // this would mark it as fall trough but naga's IR requires that\r\n                    // the last case must not be fall trough, so we mark need to mark\r\n                    // the last case as not fall trough always.\r\n                    case.fall_through = false;\r\n                }\r\n\r\n                // Add an empty default case in case non was present, this is needed because\r\n                // naga's IR requires that all switch statements must have a default case but\r\n                // GLSL doesn't require that, so we might need to add an empty default case.\r\n                if !default_present {\r\n                    cases.push(SwitchCase {\r\n                        value: crate::SwitchValue::Default,\r\n                        body: Block::new(),\r\n                        fall_through: false,\r\n                    })\r\n                }\r\n\r\n                body.push(Statement::Switch { selector, cases }, meta);\r\n\r\n                meta\r\n            }\r\n            TokenValue::While => {\r\n                let mut meta = self.bump(parser)?.meta;\r\n\r\n                let mut loop_body = Block::new();\r\n\r\n                let mut stmt = ctx.stmt_ctx();\r\n                self.expect(parser, TokenValue::LeftParen)?;\r\n                let root = self.parse_expression(parser, ctx, &mut stmt, &mut loop_body)?;\r\n                meta.subsume(self.expect(parser, TokenValue::RightParen)?.meta);\r\n\r\n                let (expr, expr_meta) =\r\n                    ctx.lower_expect(stmt, parser, root, ExprPos::Rhs, &mut loop_body)?;\r\n                let condition = ctx.add_expression(\r\n                    Expression::Unary {\r\n                        op: UnaryOperator::Not,\r\n                        expr,\r\n                    },\r\n                    expr_meta,\r\n                    &mut loop_body,\r\n                );\r\n\r\n                ctx.emit_restart(&mut loop_body);\r\n\r\n                loop_body.push(\r\n                    Statement::If {\r\n                        condition,\r\n                        accept: new_break(),\r\n                        reject: Block::new(),\r\n                    },\r\n                    crate::Span::default(),\r\n                );\r\n\r\n                meta.subsume(expr_meta);\r\n\r\n                if let Some(body_meta) =\r\n                    self.parse_statement(parser, ctx, &mut loop_body, &mut None)?\r\n                {\r\n                    meta.subsume(body_meta);\r\n                }\r\n\r\n                body.push(\r\n                    Statement::Loop {\r\n                        body: loop_body,\r\n                        continuing: Block::new(),\r\n                        break_if: None,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                meta\r\n            }\r\n            TokenValue::Do => {\r\n                let mut meta = self.bump(parser)?.meta;\r\n\r\n                let mut loop_body = Block::new();\r\n\r\n                let mut terminator = None;\r\n                self.parse_statement(parser, ctx, &mut loop_body, &mut terminator)?;\r\n\r\n                let mut stmt = ctx.stmt_ctx();\r\n\r\n                self.expect(parser, TokenValue::While)?;\r\n                self.expect(parser, TokenValue::LeftParen)?;\r\n                let root = self.parse_expression(parser, ctx, &mut stmt, &mut loop_body)?;\r\n                let end_meta = self.expect(parser, TokenValue::RightParen)?.meta;\r\n\r\n                meta.subsume(end_meta);\r\n\r\n                let (expr, expr_meta) =\r\n                    ctx.lower_expect(stmt, parser, root, ExprPos::Rhs, &mut loop_body)?;\r\n                let condition = ctx.add_expression(\r\n                    Expression::Unary {\r\n                        op: UnaryOperator::Not,\r\n                        expr,\r\n                    },\r\n                    expr_meta,\r\n                    &mut loop_body,\r\n                );\r\n\r\n                ctx.emit_restart(&mut loop_body);\r\n\r\n                loop_body.push(\r\n                    Statement::If {\r\n                        condition,\r\n                        accept: new_break(),\r\n                        reject: Block::new(),\r\n                    },\r\n                    crate::Span::default(),\r\n                );\r\n\r\n                if let Some(idx) = terminator {\r\n                    loop_body.cull(idx..)\r\n                }\r\n\r\n                body.push(\r\n                    Statement::Loop {\r\n                        body: loop_body,\r\n                        continuing: Block::new(),\r\n                        break_if: None,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                meta\r\n            }\r\n            TokenValue::For => {\r\n                let mut meta = self.bump(parser)?.meta;\r\n\r\n                ctx.symbol_table.push_scope();\r\n                self.expect(parser, TokenValue::LeftParen)?;\r\n\r\n                if self.bump_if(parser, TokenValue::Semicolon).is_none() {\r\n                    if self.peek_type_name(parser) || self.peek_type_qualifier(parser) {\r\n                        self.parse_declaration(parser, ctx, body, false)?;\r\n                    } else {\r\n                        let mut stmt = ctx.stmt_ctx();\r\n                        let expr = self.parse_expression(parser, ctx, &mut stmt, body)?;\r\n                        ctx.lower(stmt, parser, expr, ExprPos::Rhs, body)?;\r\n                        self.expect(parser, TokenValue::Semicolon)?;\r\n                    }\r\n                }\r\n\r\n                let (mut block, mut continuing) = (Block::new(), Block::new());\r\n\r\n                if self.bump_if(parser, TokenValue::Semicolon).is_none() {\r\n                    let (expr, expr_meta) =\r\n                        if self.peek_type_name(parser) || self.peek_type_qualifier(parser) {\r\n                            let mut qualifiers = self.parse_type_qualifiers(parser)?;\r\n                            let (ty, mut meta) = self.parse_type_non_void(parser)?;\r\n                            let name = self.expect_ident(parser)?.0;\r\n\r\n                            self.expect(parser, TokenValue::Assign)?;\r\n\r\n                            let (value, end_meta) =\r\n                                self.parse_initializer(parser, ty, ctx, &mut block)?;\r\n                            meta.subsume(end_meta);\r\n\r\n                            let decl = VarDeclaration {\r\n                                qualifiers: &mut qualifiers,\r\n                                ty,\r\n                                name: Some(name),\r\n                                init: None,\r\n                                meta,\r\n                            };\r\n\r\n                            let pointer = parser.add_local_var(ctx, &mut block, decl)?;\r\n\r\n                            ctx.emit_restart(&mut block);\r\n\r\n                            block.push(Statement::Store { pointer, value }, meta);\r\n\r\n                            (value, end_meta)\r\n                        } else {\r\n                            let mut stmt = ctx.stmt_ctx();\r\n                            let root = self.parse_expression(parser, ctx, &mut stmt, &mut block)?;\r\n                            ctx.lower_expect(stmt, parser, root, ExprPos::Rhs, &mut block)?\r\n                        };\r\n\r\n                    let condition = ctx.add_expression(\r\n                        Expression::Unary {\r\n                            op: UnaryOperator::Not,\r\n                            expr,\r\n                        },\r\n                        expr_meta,\r\n                        &mut block,\r\n                    );\r\n\r\n                    ctx.emit_restart(&mut block);\r\n\r\n                    block.push(\r\n                        Statement::If {\r\n                            condition,\r\n                            accept: new_break(),\r\n                            reject: Block::new(),\r\n                        },\r\n                        crate::Span::default(),\r\n                    );\r\n\r\n                    self.expect(parser, TokenValue::Semicolon)?;\r\n                }\r\n\r\n                match self.expect_peek(parser)?.value {\r\n                    TokenValue::RightParen => {}\r\n                    _ => {\r\n                        let mut stmt = ctx.stmt_ctx();\r\n                        let rest =\r\n                            self.parse_expression(parser, ctx, &mut stmt, &mut continuing)?;\r\n                        ctx.lower(stmt, parser, rest, ExprPos::Rhs, &mut continuing)?;\r\n                    }\r\n                }\r\n\r\n                meta.subsume(self.expect(parser, TokenValue::RightParen)?.meta);\r\n\r\n                if let Some(stmt_meta) = self.parse_statement(parser, ctx, &mut block, &mut None)? {\r\n                    meta.subsume(stmt_meta);\r\n                }\r\n\r\n                body.push(\r\n                    Statement::Loop {\r\n                        body: block,\r\n                        continuing,\r\n                        break_if: None,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                ctx.symbol_table.pop_scope();\r\n\r\n                meta\r\n            }\r\n            TokenValue::LeftBrace => {\r\n                let meta = self.bump(parser)?.meta;\r\n\r\n                let mut block = Block::new();\r\n\r\n                let mut block_terminator = None;\r\n                let meta = self.parse_compound_statement(\r\n                    meta,\r\n                    parser,\r\n                    ctx,\r\n                    &mut block,\r\n                    &mut block_terminator,\r\n                )?;\r\n\r\n                body.push(Statement::Block(block), meta);\r\n                if block_terminator.is_some() {\r\n                    terminator.get_or_insert(body.len());\r\n                }\r\n\r\n                meta\r\n            }\r\n            TokenValue::Semicolon => self.bump(parser)?.meta,\r\n            _ => {\r\n                // Attempt to force expression parsing for remainder of the\r\n                // tokens. Unknown or invalid tokens will be caught there and\r\n                // turned into an error.\r\n                let mut stmt = ctx.stmt_ctx();\r\n                let expr = self.parse_expression(parser, ctx, &mut stmt, body)?;\r\n                ctx.lower(stmt, parser, expr, ExprPos::Rhs, body)?;\r\n                self.expect(parser, TokenValue::Semicolon)?.meta\r\n            }\r\n        };\r\n\r\n        meta.subsume(meta_rest);\r\n        Ok(Some(meta))\r\n    }\r\n\r\n    pub fn parse_compound_statement(\r\n        &mut self,\r\n        mut meta: Span,\r\n        parser: &mut Parser,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        terminator: &mut Option<usize>,\r\n    ) -> Result<Span> {\r\n        ctx.symbol_table.push_scope();\r\n\r\n        loop {\r\n            if let Some(Token {\r\n                meta: brace_meta, ..\r\n            }) = self.bump_if(parser, TokenValue::RightBrace)\r\n            {\r\n                meta.subsume(brace_meta);\r\n                break;\r\n            }\r\n\r\n            let stmt = self.parse_statement(parser, ctx, body, terminator)?;\r\n\r\n            if let Some(stmt_meta) = stmt {\r\n                meta.subsume(stmt_meta);\r\n            }\r\n        }\r\n\r\n        if let Some(idx) = *terminator {\r\n            body.cull(idx..)\r\n        }\r\n\r\n        ctx.symbol_table.pop_scope();\r\n\r\n        Ok(meta)\r\n    }\r\n\r\n    pub fn parse_function_args(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        context: &mut Context,\r\n        body: &mut Block,\r\n    ) -> Result<()> {\r\n        if self.bump_if(parser, TokenValue::Void).is_some() {\r\n            return Ok(());\r\n        }\r\n\r\n        loop {\r\n            if self.peek_type_name(parser) || self.peek_parameter_qualifier(parser) {\r\n                let qualifier = self.parse_parameter_qualifier(parser);\r\n                let mut ty = self.parse_type_non_void(parser)?.0;\r\n\r\n                match self.expect_peek(parser)?.value {\r\n                    TokenValue::Comma => {\r\n                        self.bump(parser)?;\r\n                        context.add_function_arg(parser, body, None, ty, qualifier);\r\n                        continue;\r\n                    }\r\n                    TokenValue::Identifier(_) => {\r\n                        let mut name = self.expect_ident(parser)?;\r\n                        self.parse_array_specifier(parser, &mut name.1, &mut ty)?;\r\n\r\n                        context.add_function_arg(parser, body, Some(name), ty, qualifier);\r\n\r\n                        if self.bump_if(parser, TokenValue::Comma).is_some() {\r\n                            continue;\r\n                        }\r\n\r\n                        break;\r\n                    }\r\n                    _ => break,\r\n                }\r\n            }\r\n\r\n            break;\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/parser/types.rs",
    "content": "use crate::{\r\n    front::glsl::{\r\n        ast::{QualifierKey, QualifierValue, StorageQualifier, StructLayout, TypeQualifiers},\r\n        error::ExpectedToken,\r\n        parser::ParsingContext,\r\n        token::{Token, TokenValue},\r\n        Error, ErrorKind, Parser, Result,\r\n    },\r\n    AddressSpace, ArraySize, Handle, Span, Type, TypeInner,\r\n};\r\n\r\nimpl<'source> ParsingContext<'source> {\r\n    /// Parses an optional array_specifier returning wether or not it's present\r\n    /// and modifying the type handle if it exists\r\n    pub fn parse_array_specifier(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        span: &mut Span,\r\n        ty: &mut Handle<Type>,\r\n    ) -> Result<()> {\r\n        while self.parse_array_specifier_single(parser, span, ty)? {}\r\n        Ok(())\r\n    }\r\n\r\n    /// Implementation of [`Self::parse_array_specifier`] for a single array_specifier\r\n    fn parse_array_specifier_single(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        span: &mut Span,\r\n        ty: &mut Handle<Type>,\r\n    ) -> Result<bool> {\r\n        if self.bump_if(parser, TokenValue::LeftBracket).is_some() {\r\n            let size =\r\n                if let Some(Token { meta, .. }) = self.bump_if(parser, TokenValue::RightBracket) {\r\n                    span.subsume(meta);\r\n                    ArraySize::Dynamic\r\n                } else {\r\n                    let (value, constant_span) = self.parse_uint_constant(parser)?;\r\n                    let constant = parser.module.constants.fetch_or_append(\r\n                        crate::Constant {\r\n                            name: None,\r\n                            specialization: None,\r\n                            inner: crate::ConstantInner::Scalar {\r\n                                width: 4,\r\n                                value: crate::ScalarValue::Uint(value as u64),\r\n                            },\r\n                        },\r\n                        constant_span,\r\n                    );\r\n                    let end_span = self.expect(parser, TokenValue::RightBracket)?.meta;\r\n                    span.subsume(end_span);\r\n                    ArraySize::Constant(constant)\r\n                };\r\n\r\n            parser\r\n                .layouter\r\n                .update(&parser.module.types, &parser.module.constants)\r\n                .unwrap();\r\n            let stride = parser.layouter[*ty].to_stride();\r\n            *ty = parser.module.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Array {\r\n                        base: *ty,\r\n                        size,\r\n                        stride,\r\n                    },\r\n                },\r\n                *span,\r\n            );\r\n\r\n            Ok(true)\r\n        } else {\r\n            Ok(false)\r\n        }\r\n    }\r\n\r\n    pub fn parse_type(&mut self, parser: &mut Parser) -> Result<(Option<Handle<Type>>, Span)> {\r\n        let token = self.bump(parser)?;\r\n        let mut handle = match token.value {\r\n            TokenValue::Void => return Ok((None, token.meta)),\r\n            TokenValue::TypeName(ty) => parser.module.types.insert(ty, token.meta),\r\n            TokenValue::Struct => {\r\n                let mut meta = token.meta;\r\n                let ty_name = self.expect_ident(parser)?.0;\r\n                self.expect(parser, TokenValue::LeftBrace)?;\r\n                let mut members = Vec::new();\r\n                let span =\r\n                    self.parse_struct_declaration_list(parser, &mut members, StructLayout::Std140)?;\r\n                let end_meta = self.expect(parser, TokenValue::RightBrace)?.meta;\r\n                meta.subsume(end_meta);\r\n                let ty = parser.module.types.insert(\r\n                    Type {\r\n                        name: Some(ty_name.clone()),\r\n                        inner: TypeInner::Struct { members, span },\r\n                    },\r\n                    meta,\r\n                );\r\n                parser.lookup_type.insert(ty_name, ty);\r\n                ty\r\n            }\r\n            TokenValue::Identifier(ident) => match parser.lookup_type.get(&ident) {\r\n                Some(ty) => *ty,\r\n                None => {\r\n                    return Err(Error {\r\n                        kind: ErrorKind::UnknownType(ident),\r\n                        meta: token.meta,\r\n                    })\r\n                }\r\n            },\r\n            _ => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::InvalidToken(\r\n                        token.value,\r\n                        vec![\r\n                            TokenValue::Void.into(),\r\n                            TokenValue::Struct.into(),\r\n                            ExpectedToken::TypeName,\r\n                        ],\r\n                    ),\r\n                    meta: token.meta,\r\n                });\r\n            }\r\n        };\r\n\r\n        let mut span = token.meta;\r\n        self.parse_array_specifier(parser, &mut span, &mut handle)?;\r\n        Ok((Some(handle), span))\r\n    }\r\n\r\n    pub fn parse_type_non_void(&mut self, parser: &mut Parser) -> Result<(Handle<Type>, Span)> {\r\n        let (maybe_ty, meta) = self.parse_type(parser)?;\r\n        let ty = maybe_ty.ok_or_else(|| Error {\r\n            kind: ErrorKind::SemanticError(\"Type can't be void\".into()),\r\n            meta,\r\n        })?;\r\n\r\n        Ok((ty, meta))\r\n    }\r\n\r\n    pub fn peek_type_qualifier(&mut self, parser: &mut Parser) -> bool {\r\n        self.peek(parser).map_or(false, |t| match t.value {\r\n            TokenValue::Invariant\r\n            | TokenValue::Interpolation(_)\r\n            | TokenValue::Sampling(_)\r\n            | TokenValue::PrecisionQualifier(_)\r\n            | TokenValue::Const\r\n            | TokenValue::In\r\n            | TokenValue::Out\r\n            | TokenValue::Uniform\r\n            | TokenValue::Shared\r\n            | TokenValue::Buffer\r\n            | TokenValue::Restrict\r\n            | TokenValue::MemoryQualifier(_)\r\n            | TokenValue::Layout => true,\r\n            _ => false,\r\n        })\r\n    }\r\n\r\n    pub fn parse_type_qualifiers<'a>(&mut self, parser: &mut Parser) -> Result<TypeQualifiers<'a>> {\r\n        let mut qualifiers = TypeQualifiers::default();\r\n\r\n        while self.peek_type_qualifier(parser) {\r\n            let token = self.bump(parser)?;\r\n\r\n            // Handle layout qualifiers outside the match since this can push multiple values\r\n            if token.value == TokenValue::Layout {\r\n                self.parse_layout_qualifier_id_list(parser, &mut qualifiers)?;\r\n                continue;\r\n            }\r\n\r\n            qualifiers.span.subsume(token.meta);\r\n\r\n            match token.value {\r\n                TokenValue::Invariant => {\r\n                    if qualifiers.invariant.is_some() {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Cannot use more than one invariant qualifier per declaration\"\r\n                                    .into(),\r\n                            ),\r\n                            meta: token.meta,\r\n                        })\r\n                    }\r\n\r\n                    qualifiers.invariant = Some(token.meta);\r\n                }\r\n                TokenValue::Interpolation(i) => {\r\n                    if qualifiers.interpolation.is_some() {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Cannot use more than one interpolation qualifier per declaration\"\r\n                                    .into(),\r\n                            ),\r\n                            meta: token.meta,\r\n                        })\r\n                    }\r\n\r\n                    qualifiers.interpolation = Some((i, token.meta));\r\n                }\r\n                TokenValue::Const\r\n                | TokenValue::In\r\n                | TokenValue::Out\r\n                | TokenValue::Uniform\r\n                | TokenValue::Shared\r\n                | TokenValue::Buffer => {\r\n                    let storage = match token.value {\r\n                        TokenValue::Const => StorageQualifier::Const,\r\n                        TokenValue::In => StorageQualifier::Input,\r\n                        TokenValue::Out => StorageQualifier::Output,\r\n                        TokenValue::Uniform => {\r\n                            StorageQualifier::AddressSpace(AddressSpace::Uniform)\r\n                        }\r\n                        TokenValue::Shared => {\r\n                            StorageQualifier::AddressSpace(AddressSpace::WorkGroup)\r\n                        }\r\n                        TokenValue::Buffer => {\r\n                            StorageQualifier::AddressSpace(AddressSpace::Storage {\r\n                                access: crate::StorageAccess::all(),\r\n                            })\r\n                        }\r\n                        _ => unreachable!(),\r\n                    };\r\n\r\n                    if StorageQualifier::AddressSpace(AddressSpace::Function)\r\n                        != qualifiers.storage.0\r\n                    {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Cannot use more than one storage qualifier per declaration\".into(),\r\n                            ),\r\n                            meta: token.meta,\r\n                        });\r\n                    }\r\n\r\n                    qualifiers.storage = (storage, token.meta);\r\n                }\r\n                TokenValue::Sampling(s) => {\r\n                    if qualifiers.sampling.is_some() {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Cannot use more than one sampling qualifier per declaration\"\r\n                                    .into(),\r\n                            ),\r\n                            meta: token.meta,\r\n                        })\r\n                    }\r\n\r\n                    qualifiers.sampling = Some((s, token.meta));\r\n                }\r\n                TokenValue::PrecisionQualifier(p) => {\r\n                    if qualifiers.precision.is_some() {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"Cannot use more than one precision qualifier per declaration\"\r\n                                    .into(),\r\n                            ),\r\n                            meta: token.meta,\r\n                        })\r\n                    }\r\n\r\n                    qualifiers.precision = Some((p, token.meta));\r\n                }\r\n                TokenValue::MemoryQualifier(access) => {\r\n                    let storage_access = qualifiers\r\n                        .storage_access\r\n                        .get_or_insert((crate::StorageAccess::all(), Span::default()));\r\n                    if !storage_access.0.contains(!access) {\r\n                        parser.errors.push(Error {\r\n                            kind: ErrorKind::SemanticError(\r\n                                \"The same memory qualifier can only be used once\".into(),\r\n                            ),\r\n                            meta: token.meta,\r\n                        })\r\n                    }\r\n\r\n                    storage_access.0 &= access;\r\n                    storage_access.1.subsume(token.meta);\r\n                }\r\n                TokenValue::Restrict => continue,\r\n                _ => unreachable!(),\r\n            };\r\n        }\r\n\r\n        Ok(qualifiers)\r\n    }\r\n\r\n    pub fn parse_layout_qualifier_id_list(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        qualifiers: &mut TypeQualifiers,\r\n    ) -> Result<()> {\r\n        self.expect(parser, TokenValue::LeftParen)?;\r\n        loop {\r\n            self.parse_layout_qualifier_id(parser, &mut qualifiers.layout_qualifiers)?;\r\n\r\n            if self.bump_if(parser, TokenValue::Comma).is_some() {\r\n                continue;\r\n            }\r\n\r\n            break;\r\n        }\r\n        let token = self.expect(parser, TokenValue::RightParen)?;\r\n        qualifiers.span.subsume(token.meta);\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn parse_layout_qualifier_id(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        qualifiers: &mut crate::FastHashMap<QualifierKey, (QualifierValue, Span)>,\r\n    ) -> Result<()> {\r\n        // layout_qualifier_id:\r\n        //     IDENTIFIER\r\n        //     IDENTIFIER EQUAL constant_expression\r\n        //     SHARED\r\n        let mut token = self.bump(parser)?;\r\n        match token.value {\r\n            TokenValue::Identifier(name) => {\r\n                let (key, value) = match name.as_str() {\r\n                    \"std140\" => (\r\n                        QualifierKey::Layout,\r\n                        QualifierValue::Layout(StructLayout::Std140),\r\n                    ),\r\n                    \"std430\" => (\r\n                        QualifierKey::Layout,\r\n                        QualifierValue::Layout(StructLayout::Std430),\r\n                    ),\r\n                    word => {\r\n                        if let Some(format) = map_image_format(word) {\r\n                            (QualifierKey::Format, QualifierValue::Format(format))\r\n                        } else {\r\n                            let key = QualifierKey::String(name.into());\r\n                            let value = if self.bump_if(parser, TokenValue::Assign).is_some() {\r\n                                let (value, end_meta) = match self.parse_uint_constant(parser) {\r\n                                    Ok(v) => v,\r\n                                    Err(e) => {\r\n                                        parser.errors.push(e);\r\n                                        (0, Span::default())\r\n                                    }\r\n                                };\r\n                                token.meta.subsume(end_meta);\r\n\r\n                                QualifierValue::Uint(value)\r\n                            } else {\r\n                                QualifierValue::None\r\n                            };\r\n\r\n                            (key, value)\r\n                        }\r\n                    }\r\n                };\r\n\r\n                qualifiers.insert(key, (value, token.meta));\r\n            }\r\n            _ => parser.errors.push(Error {\r\n                kind: ErrorKind::InvalidToken(token.value, vec![ExpectedToken::Identifier]),\r\n                meta: token.meta,\r\n            }),\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn peek_type_name(&mut self, parser: &mut Parser) -> bool {\r\n        self.peek(parser).map_or(false, |t| match t.value {\r\n            TokenValue::TypeName(_) | TokenValue::Void => true,\r\n            TokenValue::Struct => true,\r\n            TokenValue::Identifier(ref ident) => parser.lookup_type.contains_key(ident),\r\n            _ => false,\r\n        })\r\n    }\r\n}\r\n\r\nfn map_image_format(word: &str) -> Option<crate::StorageFormat> {\r\n    use crate::StorageFormat as Sf;\r\n\r\n    let format = match word {\r\n        // float-image-format-qualifier:\r\n        \"rgba32f\" => Sf::Rgba32Float,\r\n        \"rgba16f\" => Sf::Rgba16Float,\r\n        \"rg32f\" => Sf::Rg32Float,\r\n        \"rg16f\" => Sf::Rg16Float,\r\n        \"r11f_g11f_b10f\" => Sf::Rg11b10Float,\r\n        \"r32f\" => Sf::R32Float,\r\n        \"r16f\" => Sf::R16Float,\r\n        \"rgba16\" => Sf::Rgba16Float,\r\n        \"rgb10_a2\" => Sf::Rgb10a2Unorm,\r\n        \"rgba8\" => Sf::Rgba8Unorm,\r\n        \"rg16\" => Sf::Rg16Float,\r\n        \"rg8\" => Sf::Rg8Unorm,\r\n        \"r16\" => Sf::R16Float,\r\n        \"r8\" => Sf::R8Unorm,\r\n        \"rgba8_snorm\" => Sf::Rgba8Snorm,\r\n        \"rg8_snorm\" => Sf::Rg8Snorm,\r\n        \"r8_snorm\" => Sf::R8Snorm,\r\n        // int-image-format-qualifier:\r\n        \"rgba32i\" => Sf::Rgba32Sint,\r\n        \"rgba16i\" => Sf::Rgba16Sint,\r\n        \"rgba8i\" => Sf::Rgba8Sint,\r\n        \"rg32i\" => Sf::Rg32Sint,\r\n        \"rg16i\" => Sf::Rg16Sint,\r\n        \"rg8i\" => Sf::Rg8Sint,\r\n        \"r32i\" => Sf::R32Sint,\r\n        \"r16i\" => Sf::R16Sint,\r\n        \"r8i\" => Sf::R8Sint,\r\n        // uint-image-format-qualifier:\r\n        \"rgba32ui\" => Sf::Rgba32Uint,\r\n        \"rgba16ui\" => Sf::Rgba16Uint,\r\n        \"rgba8ui\" => Sf::Rgba8Uint,\r\n        \"rg32ui\" => Sf::Rg32Uint,\r\n        \"rg16ui\" => Sf::Rg16Uint,\r\n        \"rg8ui\" => Sf::Rg8Uint,\r\n        \"r32ui\" => Sf::R32Uint,\r\n        \"r16ui\" => Sf::R16Uint,\r\n        \"r8ui\" => Sf::R8Uint,\r\n        // TODO: These next ones seem incorrect to me\r\n        // \"rgba16_snorm\" => Sf::Rgba16Float,\r\n        // \"rg16_snorm\" => Sf::Rg16Float,\r\n        // \"r16_snorm\" => Sf::R16Float,\r\n        // \"rgb10_a2ui\" => Sf::Rgb10a2Unorm,\r\n        _ => return None,\r\n    };\r\n\r\n    Some(format)\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/parser.rs",
    "content": "use super::{\r\n    ast::{FunctionKind, Profile, TypeQualifiers},\r\n    context::{Context, ExprPos},\r\n    error::ExpectedToken,\r\n    error::{Error, ErrorKind},\r\n    lex::{Lexer, LexerResultKind},\r\n    token::{Directive, DirectiveKind},\r\n    token::{Token, TokenValue},\r\n    variables::{GlobalOrConstant, VarDeclaration},\r\n    Parser, Result,\r\n};\r\nuse crate::{arena::Handle, Block, Constant, ConstantInner, Expression, ScalarValue, Span, Type};\r\nuse core::convert::TryFrom;\r\nuse pp_rs::token::{PreprocessorError, Token as PPToken, TokenValue as PPTokenValue};\r\nuse std::iter::Peekable;\r\n\r\nmod declarations;\r\nmod expressions;\r\nmod functions;\r\nmod types;\r\n\r\npub struct ParsingContext<'source> {\r\n    lexer: Peekable<Lexer<'source>>,\r\n    /// Used to store tokens already consumed by the parser but that need to be backtracked\r\n    backtracked_token: Option<Token>,\r\n    last_meta: Span,\r\n}\r\n\r\nimpl<'source> ParsingContext<'source> {\r\n    pub fn new(lexer: Lexer<'source>) -> Self {\r\n        ParsingContext {\r\n            lexer: lexer.peekable(),\r\n            backtracked_token: None,\r\n            last_meta: Span::default(),\r\n        }\r\n    }\r\n\r\n    /// Helper method for backtracking from a consumed token\r\n    ///\r\n    /// This method should always be used instead of assigning to `backtracked_token` since\r\n    /// it validates that backtracking hasn't occurred more than one time in a row\r\n    ///\r\n    /// # Panics\r\n    /// - If the parser already backtracked without bumping in between\r\n    pub fn backtrack(&mut self, token: Token) -> Result<()> {\r\n        // This should never happen\r\n        if let Some(ref prev_token) = self.backtracked_token {\r\n            return Err(Error {\r\n                kind: ErrorKind::InternalError(\"The parser tried to backtrack twice in a row\"),\r\n                meta: prev_token.meta,\r\n            });\r\n        }\r\n\r\n        self.backtracked_token = Some(token);\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub fn expect_ident(&mut self, parser: &mut Parser) -> Result<(String, Span)> {\r\n        let token = self.bump(parser)?;\r\n\r\n        match token.value {\r\n            TokenValue::Identifier(name) => Ok((name, token.meta)),\r\n            _ => Err(Error {\r\n                kind: ErrorKind::InvalidToken(token.value, vec![ExpectedToken::Identifier]),\r\n                meta: token.meta,\r\n            }),\r\n        }\r\n    }\r\n\r\n    pub fn expect(&mut self, parser: &mut Parser, value: TokenValue) -> Result<Token> {\r\n        let token = self.bump(parser)?;\r\n\r\n        if token.value != value {\r\n            Err(Error {\r\n                kind: ErrorKind::InvalidToken(token.value, vec![value.into()]),\r\n                meta: token.meta,\r\n            })\r\n        } else {\r\n            Ok(token)\r\n        }\r\n    }\r\n\r\n    pub fn next(&mut self, parser: &mut Parser) -> Option<Token> {\r\n        loop {\r\n            if let Some(token) = self.backtracked_token.take() {\r\n                self.last_meta = token.meta;\r\n                break Some(token);\r\n            }\r\n\r\n            let res = self.lexer.next()?;\r\n\r\n            match res.kind {\r\n                LexerResultKind::Token(token) => {\r\n                    self.last_meta = token.meta;\r\n                    break Some(token);\r\n                }\r\n                LexerResultKind::Directive(directive) => {\r\n                    parser.handle_directive(directive, res.meta)\r\n                }\r\n                LexerResultKind::Error(error) => parser.errors.push(Error {\r\n                    kind: ErrorKind::PreprocessorError(error),\r\n                    meta: res.meta,\r\n                }),\r\n            }\r\n        }\r\n    }\r\n\r\n    pub fn bump(&mut self, parser: &mut Parser) -> Result<Token> {\r\n        self.next(parser).ok_or(Error {\r\n            kind: ErrorKind::EndOfFile,\r\n            meta: self.last_meta,\r\n        })\r\n    }\r\n\r\n    /// Returns None on the end of the file rather than an error like other methods\r\n    pub fn bump_if(&mut self, parser: &mut Parser, value: TokenValue) -> Option<Token> {\r\n        if self.peek(parser).filter(|t| t.value == value).is_some() {\r\n            self.bump(parser).ok()\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n\r\n    pub fn peek(&mut self, parser: &mut Parser) -> Option<&Token> {\r\n        loop {\r\n            if let Some(ref token) = self.backtracked_token {\r\n                break Some(token);\r\n            }\r\n\r\n            match self.lexer.peek()?.kind {\r\n                LexerResultKind::Token(_) => {\r\n                    let res = self.lexer.peek()?;\r\n\r\n                    match res.kind {\r\n                        LexerResultKind::Token(ref token) => break Some(token),\r\n                        _ => unreachable!(),\r\n                    }\r\n                }\r\n                LexerResultKind::Error(_) | LexerResultKind::Directive(_) => {\r\n                    let res = self.lexer.next()?;\r\n\r\n                    match res.kind {\r\n                        LexerResultKind::Directive(directive) => {\r\n                            parser.handle_directive(directive, res.meta)\r\n                        }\r\n                        LexerResultKind::Error(error) => parser.errors.push(Error {\r\n                            kind: ErrorKind::PreprocessorError(error),\r\n                            meta: res.meta,\r\n                        }),\r\n                        _ => unreachable!(),\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    pub fn expect_peek(&mut self, parser: &mut Parser) -> Result<&Token> {\r\n        let meta = self.last_meta;\r\n        self.peek(parser).ok_or(Error {\r\n            kind: ErrorKind::EndOfFile,\r\n            meta,\r\n        })\r\n    }\r\n\r\n    pub fn parse(&mut self, parser: &mut Parser) -> Result<()> {\r\n        // Body and expression arena for global initialization\r\n        let mut body = Block::new();\r\n        let mut ctx = Context::new(parser, &mut body);\r\n\r\n        while self.peek(parser).is_some() {\r\n            self.parse_external_declaration(parser, &mut ctx, &mut body)?;\r\n        }\r\n\r\n        // Add an `EntryPoint` to `parser.module` for `main`, if a\r\n        // suitable overload exists. Error out if we can't find one.\r\n        if let Some(declaration) = parser.lookup_function.get(\"main\") {\r\n            for decl in declaration.overloads.iter() {\r\n                if let FunctionKind::Call(handle) = decl.kind {\r\n                    if decl.defined && decl.parameters.is_empty() {\r\n                        parser.add_entry_point(handle, body, ctx.expressions);\r\n                        return Ok(());\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        Err(Error {\r\n            kind: ErrorKind::SemanticError(\"Missing entry point\".into()),\r\n            meta: Span::default(),\r\n        })\r\n    }\r\n\r\n    fn parse_uint_constant(&mut self, parser: &mut Parser) -> Result<(u32, Span)> {\r\n        let (value, meta) = self.parse_constant_expression(parser)?;\r\n\r\n        let int = match parser.module.constants[value].inner {\r\n            ConstantInner::Scalar {\r\n                value: ScalarValue::Uint(int),\r\n                ..\r\n            } => u32::try_from(int).map_err(|_| Error {\r\n                kind: ErrorKind::SemanticError(\"int constant overflows\".into()),\r\n                meta,\r\n            })?,\r\n            ConstantInner::Scalar {\r\n                value: ScalarValue::Sint(int),\r\n                ..\r\n            } => u32::try_from(int).map_err(|_| Error {\r\n                kind: ErrorKind::SemanticError(\"int constant overflows\".into()),\r\n                meta,\r\n            })?,\r\n            _ => {\r\n                return Err(Error {\r\n                    kind: ErrorKind::SemanticError(\"Expected a uint constant\".into()),\r\n                    meta,\r\n                })\r\n            }\r\n        };\r\n\r\n        Ok((int, meta))\r\n    }\r\n\r\n    fn parse_constant_expression(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n    ) -> Result<(Handle<Constant>, Span)> {\r\n        let mut block = Block::new();\r\n\r\n        let mut ctx = Context::new(parser, &mut block);\r\n\r\n        let mut stmt_ctx = ctx.stmt_ctx();\r\n        let expr = self.parse_conditional(parser, &mut ctx, &mut stmt_ctx, &mut block, None)?;\r\n        let (root, meta) = ctx.lower_expect(stmt_ctx, parser, expr, ExprPos::Rhs, &mut block)?;\r\n\r\n        Ok((parser.solve_constant(&ctx, root, meta)?, meta))\r\n    }\r\n}\r\n\r\nimpl Parser {\r\n    fn handle_directive(&mut self, directive: Directive, meta: Span) {\r\n        let mut tokens = directive.tokens.into_iter();\r\n\r\n        match directive.kind {\r\n            DirectiveKind::Version { is_first_directive } => {\r\n                if !is_first_directive {\r\n                    self.errors.push(Error {\r\n                        kind: ErrorKind::SemanticError(\r\n                            \"#version must occur first in shader\".into(),\r\n                        ),\r\n                        meta,\r\n                    })\r\n                }\r\n\r\n                match tokens.next() {\r\n                    Some(PPToken {\r\n                        value: PPTokenValue::Integer(int),\r\n                        location,\r\n                    }) => match int.value {\r\n                        440 | 450 | 460 => self.meta.version = int.value as u16,\r\n                        _ => self.errors.push(Error {\r\n                            kind: ErrorKind::InvalidVersion(int.value),\r\n                            meta: location.into(),\r\n                        }),\r\n                    },\r\n                    Some(PPToken { value, location }) => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                            value,\r\n                        )),\r\n                        meta: location.into(),\r\n                    }),\r\n                    None => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedNewLine),\r\n                        meta,\r\n                    }),\r\n                };\r\n\r\n                match tokens.next() {\r\n                    Some(PPToken {\r\n                        value: PPTokenValue::Ident(name),\r\n                        location,\r\n                    }) => match name.as_str() {\r\n                        \"core\" => self.meta.profile = Profile::Core,\r\n                        _ => self.errors.push(Error {\r\n                            kind: ErrorKind::InvalidProfile(name),\r\n                            meta: location.into(),\r\n                        }),\r\n                    },\r\n                    Some(PPToken { value, location }) => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                            value,\r\n                        )),\r\n                        meta: location.into(),\r\n                    }),\r\n                    None => {}\r\n                };\r\n\r\n                if let Some(PPToken { value, location }) = tokens.next() {\r\n                    self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                            value,\r\n                        )),\r\n                        meta: location.into(),\r\n                    })\r\n                }\r\n            }\r\n            DirectiveKind::Extension => {\r\n                // TODO: Proper extension handling\r\n                // - Checking for extension support in the compiler\r\n                // - Handle behaviors such as warn\r\n                // - Handle the all extension\r\n                let name = match tokens.next() {\r\n                    Some(PPToken {\r\n                        value: PPTokenValue::Ident(name),\r\n                        ..\r\n                    }) => Some(name),\r\n                    Some(PPToken { value, location }) => {\r\n                        self.errors.push(Error {\r\n                            kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                                value,\r\n                            )),\r\n                            meta: location.into(),\r\n                        });\r\n\r\n                        None\r\n                    }\r\n                    None => {\r\n                        self.errors.push(Error {\r\n                            kind: ErrorKind::PreprocessorError(\r\n                                PreprocessorError::UnexpectedNewLine,\r\n                            ),\r\n                            meta,\r\n                        });\r\n\r\n                        None\r\n                    }\r\n                };\r\n\r\n                match tokens.next() {\r\n                    Some(PPToken {\r\n                        value: PPTokenValue::Punct(pp_rs::token::Punct::Colon),\r\n                        ..\r\n                    }) => {}\r\n                    Some(PPToken { value, location }) => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                            value,\r\n                        )),\r\n                        meta: location.into(),\r\n                    }),\r\n                    None => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedNewLine),\r\n                        meta,\r\n                    }),\r\n                };\r\n\r\n                match tokens.next() {\r\n                    Some(PPToken {\r\n                        value: PPTokenValue::Ident(behavior),\r\n                        location,\r\n                    }) => match behavior.as_str() {\r\n                        \"require\" | \"enable\" | \"warn\" | \"disable\" => {\r\n                            if let Some(name) = name {\r\n                                self.meta.extensions.insert(name);\r\n                            }\r\n                        }\r\n                        _ => self.errors.push(Error {\r\n                            kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                                PPTokenValue::Ident(behavior),\r\n                            )),\r\n                            meta: location.into(),\r\n                        }),\r\n                    },\r\n                    Some(PPToken { value, location }) => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                            value,\r\n                        )),\r\n                        meta: location.into(),\r\n                    }),\r\n                    None => self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedNewLine),\r\n                        meta,\r\n                    }),\r\n                }\r\n\r\n                if let Some(PPToken { value, location }) = tokens.next() {\r\n                    self.errors.push(Error {\r\n                        kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken(\r\n                            value,\r\n                        )),\r\n                        meta: location.into(),\r\n                    })\r\n                }\r\n            }\r\n            DirectiveKind::Pragma => {\r\n                // TODO: handle some common pragmas?\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\npub struct DeclarationContext<'ctx, 'qualifiers> {\r\n    qualifiers: TypeQualifiers<'qualifiers>,\r\n    /// Indicates a global declaration\r\n    external: bool,\r\n\r\n    ctx: &'ctx mut Context,\r\n    body: &'ctx mut Block,\r\n}\r\n\r\nimpl<'ctx, 'qualifiers> DeclarationContext<'ctx, 'qualifiers> {\r\n    fn add_var(\r\n        &mut self,\r\n        parser: &mut Parser,\r\n        ty: Handle<Type>,\r\n        name: String,\r\n        init: Option<Handle<Constant>>,\r\n        meta: Span,\r\n    ) -> Result<Handle<Expression>> {\r\n        let decl = VarDeclaration {\r\n            qualifiers: &mut self.qualifiers,\r\n            ty,\r\n            name: Some(name),\r\n            init,\r\n            meta,\r\n        };\r\n\r\n        match self.external {\r\n            true => {\r\n                let global = parser.add_global_var(self.ctx, self.body, decl)?;\r\n                let expr = match global {\r\n                    GlobalOrConstant::Global(handle) => Expression::GlobalVariable(handle),\r\n                    GlobalOrConstant::Constant(handle) => Expression::Constant(handle),\r\n                };\r\n                Ok(self.ctx.add_expression(expr, meta, self.body))\r\n            }\r\n            false => parser.add_local_var(self.ctx, self.body, decl),\r\n        }\r\n    }\r\n\r\n    /// Emits all the expressions captured by the emitter and starts the emitter again\r\n    ///\r\n    /// Alias to [`emit_restart`] with the declaration body\r\n    ///\r\n    /// [`emit_restart`]: Context::emit_restart\r\n    #[inline]\r\n    fn flush_expressions(&mut self) {\r\n        self.ctx.emit_restart(self.body);\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/parser_tests.rs",
    "content": "use super::{\r\n    ast::Profile,\r\n    error::ExpectedToken,\r\n    error::{Error, ErrorKind},\r\n    token::TokenValue,\r\n    Options, Parser, Span,\r\n};\r\nuse crate::ShaderStage;\r\nuse pp_rs::token::PreprocessorError;\r\n\r\n#[test]\r\nfn version() {\r\n    let mut parser = Parser::default();\r\n\r\n    // invalid versions\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                \"#version 99000\\n void main(){}\",\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![Error {\r\n            kind: ErrorKind::InvalidVersion(99000),\r\n            meta: Span::new(9, 14)\r\n        }],\r\n    );\r\n\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                \"#version 449\\n void main(){}\",\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![Error {\r\n            kind: ErrorKind::InvalidVersion(449),\r\n            meta: Span::new(9, 12)\r\n        }]\r\n    );\r\n\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                \"#version 450 smart\\n void main(){}\",\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![Error {\r\n            kind: ErrorKind::InvalidProfile(\"smart\".into()),\r\n            meta: Span::new(13, 18),\r\n        }]\r\n    );\r\n\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                \"#version 450\\nvoid main(){} #version 450\",\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![\r\n            Error {\r\n                kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedHash,),\r\n                meta: Span::new(27, 28),\r\n            },\r\n            Error {\r\n                kind: ErrorKind::InvalidToken(\r\n                    TokenValue::Identifier(\"version\".into()),\r\n                    vec![ExpectedToken::Eof]\r\n                ),\r\n                meta: Span::new(28, 35)\r\n            }\r\n        ]\r\n    );\r\n\r\n    // valid versions\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            \"  #  version 450\\nvoid main() {}\",\r\n        )\r\n        .unwrap();\r\n    assert_eq!(\r\n        (parser.metadata().version, parser.metadata().profile),\r\n        (450, Profile::Core)\r\n    );\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            \"#version 450\\nvoid main() {}\",\r\n        )\r\n        .unwrap();\r\n    assert_eq!(\r\n        (parser.metadata().version, parser.metadata().profile),\r\n        (450, Profile::Core)\r\n    );\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            \"#version 450 core\\nvoid main(void) {}\",\r\n        )\r\n        .unwrap();\r\n    assert_eq!(\r\n        (parser.metadata().version, parser.metadata().profile),\r\n        (450, Profile::Core)\r\n    );\r\n}\r\n\r\n#[test]\r\nfn control_flow() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            if (true) {\r\n                return 1;\r\n            } else {\r\n                return 2;\r\n            }\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            if (true) {\r\n                return 1;\r\n            }\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            int x;\r\n            int y = 3;\r\n            switch (5) {\r\n                case 2:\r\n                    x = 2;\r\n                case 5:\r\n                    x = 5;\r\n                    y = 2;\r\n                    break;\r\n                default:\r\n                    x = 0;\r\n            }\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            int x = 0;\r\n            while(x < 5) {\r\n                x = x + 1;\r\n            }\r\n            do {\r\n                x = x - 1;\r\n            } while(x >= 4)\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            int x = 0;\r\n            for(int i = 0; i < 10;) {\r\n                x = x + 2;\r\n            }\r\n            for(;;);\r\n            return x;\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n}\r\n\r\n#[test]\r\nfn declarations() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        layout(location = 0) in vec2 v_uv;\r\n        layout(location = 0) out vec4 o_color;\r\n        layout(set = 1, binding = 1) uniform texture2D tex;\r\n        layout(set = 1, binding = 2) uniform sampler tex_sampler;\r\n\r\n        layout(early_fragment_tests) in;\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        layout(std140, set = 2, binding = 0)\r\n        uniform u_locals {\r\n            vec3 model_offs;\r\n            float load_time;\r\n            ivec4 atlas_offs;\r\n        };\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        layout(push_constant)\r\n        uniform u_locals {\r\n            vec3 model_offs;\r\n            float load_time;\r\n            ivec4 atlas_offs;\r\n        };\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        layout(std430, set = 2, binding = 0)\r\n        uniform u_locals {\r\n            vec3 model_offs;\r\n            float load_time;\r\n            ivec4 atlas_offs;\r\n        };\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        layout(std140, set = 2, binding = 0)\r\n        uniform u_locals {\r\n            vec3 model_offs;\r\n            float load_time;\r\n        } block_var;\r\n\r\n        void main() {\r\n            load_time * model_offs;\r\n            block_var.load_time * block_var.model_offs;\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        float vector = vec4(1.0 / 17.0,  9.0 / 17.0,  3.0 / 17.0, 11.0 / 17.0);\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        precision highp float;\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n}\r\n\r\n#[test]\r\nfn textures() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #version 450\r\n        layout(location = 0) in vec2 v_uv;\r\n        layout(location = 0) out vec4 o_color;\r\n        layout(set = 1, binding = 1) uniform texture2D tex;\r\n        layout(set = 1, binding = 2) uniform sampler tex_sampler;\r\n        void main() {\r\n            o_color = texture(sampler2D(tex, tex_sampler), v_uv);\r\n            o_color.a = texture(sampler2D(tex, tex_sampler), v_uv, 2.0).a;\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n}\r\n\r\n#[test]\r\nfn functions() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void test1(float);\r\n        void test1(float) {}\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void test2(float a) {}\r\n        void test3(float a, float b) {}\r\n        void test4(float, float) {}\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        float test(float a) { return a; }\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        float test(vec4 p) {\r\n            return p.x;\r\n        }\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    // Function overloading\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        float test(vec2 p);\r\n        float test(vec3 p);\r\n        float test(vec4 p);\r\n\r\n        float test(vec2 p) {\r\n            return p.x;\r\n        }\r\n\r\n        float test(vec3 p) {\r\n            return p.x;\r\n        }\r\n\r\n        float test(vec4 p) {\r\n            return p.x;\r\n        }\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                r#\"\r\n                #  version 450\r\n                int test(vec4 p) {\r\n                    return p.x;\r\n                }\r\n\r\n                float test(vec4 p) {\r\n                    return p.x;\r\n                }\r\n\r\n                void main() {}\r\n                \"#,\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![Error {\r\n            kind: ErrorKind::SemanticError(\"Function already defined\".into()),\r\n            meta: Span::new(134, 152),\r\n        }]\r\n    );\r\n\r\n    println!();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        float callee(uint q) {\r\n            return float(q);\r\n        }\r\n\r\n        float caller() {\r\n            callee(1u);\r\n        }\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    // Nested function call\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n            #  version 450\r\n            layout(set = 0, binding = 1) uniform texture2D t_noise;\r\n            layout(set = 0, binding = 2) uniform sampler s_noise;\r\n\r\n            void main() {\r\n                textureLod(sampler2D(t_noise, s_noise), vec2(1.0), 0);\r\n            }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void fun(vec2 in_parameter, out float out_parameter) {\r\n            ivec2 _ = ivec2(in_parameter);\r\n        }\r\n\r\n        void main() {\r\n            float a;\r\n            fun(vec2(1.0), a);\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n}\r\n\r\n#[test]\r\nfn constants() {\r\n    use crate::{Constant, ConstantInner, ScalarValue};\r\n    let mut parser = Parser::default();\r\n\r\n    let module = parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        const float a = 1.0;\r\n        float global = a;\r\n        const float b = a;\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    let mut constants = module.constants.iter();\r\n\r\n    assert_eq!(\r\n        constants.next().unwrap().1,\r\n        &Constant {\r\n            name: None,\r\n            specialization: None,\r\n            inner: ConstantInner::Scalar {\r\n                width: 4,\r\n                value: ScalarValue::Float(1.0)\r\n            }\r\n        }\r\n    );\r\n\r\n    assert!(constants.next().is_none());\r\n}\r\n\r\n#[test]\r\nfn function_overloading() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n\r\n        float saturate(float v) { return clamp(v, 0.0, 1.0); }\r\n        vec2 saturate(vec2 v) { return clamp(v, vec2(0.0), vec2(1.0)); }\r\n        vec3 saturate(vec3 v) { return clamp(v, vec3(0.0), vec3(1.0)); }\r\n        vec4 saturate(vec4 v) { return clamp(v, vec4(0.0), vec4(1.0)); }\r\n\r\n        void main() {\r\n            float v1 = saturate(1.5);\r\n            vec2 v2 = saturate(vec2(0.5, 1.5));\r\n            vec3 v3 = saturate(vec3(0.5, 1.5, 2.5));\r\n            vec3 v4 = saturate(vec4(0.5, 1.5, 2.5, 3.5));\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n}\r\n\r\n#[test]\r\nfn implicit_conversions() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            mat4 a = mat4(1);\r\n            float b = 1u;\r\n            float c = 1 + 2.0;\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                r#\"\r\n                #  version 450\r\n                void test(int a) {}\r\n                void test(uint a) {}\r\n\r\n                void main() {\r\n                    test(1.0);\r\n                }\r\n                \"#,\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![Error {\r\n            kind: ErrorKind::SemanticError(\"Unknown function \\'test\\'\".into()),\r\n            meta: Span::new(156, 165),\r\n        }]\r\n    );\r\n\r\n    assert_eq!(\r\n        parser\r\n            .parse(\r\n                &Options::from(ShaderStage::Vertex),\r\n                r#\"\r\n                #  version 450\r\n                void test(float a) {}\r\n                void test(uint a) {}\r\n\r\n                void main() {\r\n                    test(1);\r\n                }\r\n                \"#,\r\n            )\r\n            .err()\r\n            .unwrap(),\r\n        vec![Error {\r\n            kind: ErrorKind::SemanticError(\"Ambiguous best function for \\'test\\'\".into()),\r\n            meta: Span::new(158, 165),\r\n        }]\r\n    );\r\n}\r\n\r\n#[test]\r\nfn structs() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        Test {\r\n            vec4 pos;\r\n          } xx;\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap_err();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        struct Test {\r\n            vec4 pos;\r\n        };\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        const int NUM_VECS = 42;\r\n        struct Test {\r\n            vec4 vecs[NUM_VECS];\r\n        };\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        struct Hello {\r\n            vec4 test;\r\n        } test() {\r\n            return Hello( vec4(1.0) );\r\n        }\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        struct Test {};\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap_err();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        inout struct Test {\r\n            vec4 x;\r\n        };\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap_err();\r\n}\r\n\r\n#[test]\r\nfn swizzles() {\r\n    let mut parser = Parser::default();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            vec4 v = vec4(1);\r\n            v.xyz = vec3(2);\r\n            v.x = 5.0;\r\n            v.xyz.zxy.yx.xy = vec2(5.0, 1.0);\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            vec4 v = vec4(1);\r\n            v.xx = vec2(5.0);\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap_err();\r\n\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            vec3 v = vec3(1);\r\n            v.w = 2.0;\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap_err();\r\n}\r\n\r\n#[test]\r\nfn expressions() {\r\n    let mut parser = Parser::default();\r\n\r\n    // Vector indexing\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        float test(int index) {\r\n            vec4 v = vec4(1.0, 2.0, 3.0, 4.0);\r\n            return v[index] + 1.0;\r\n        }\r\n\r\n        void main() {}\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    // Prefix increment/decrement\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            uint index = 0;\r\n            \r\n            --index;\r\n            ++index;\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n\r\n    // Dynamic indexing of array\r\n    parser\r\n        .parse(\r\n            &Options::from(ShaderStage::Vertex),\r\n            r#\"\r\n        #  version 450\r\n        void main() {\r\n            const vec4 positions[1] = { vec4(0) };\r\n\r\n            gl_Position = positions[gl_VertexIndex];\r\n        }\r\n        \"#,\r\n        )\r\n        .unwrap();\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/token.rs",
    "content": "pub use pp_rs::token::{Float, Integer, Location, PreprocessorError, Token as PPToken};\r\n\r\nuse super::ast::Precision;\r\nuse crate::{Interpolation, Sampling, Span, Type};\r\n\r\nimpl From<Location> for Span {\r\n    fn from(loc: Location) -> Self {\r\n        Span::new(loc.start, loc.end)\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub struct Token {\r\n    pub value: TokenValue,\r\n    pub meta: Span,\r\n}\r\n\r\n/// A token passed from the lexing used in the parsing.\r\n///\r\n/// This type is exported since it's returned in the\r\n/// [`InvalidToken`](super::ErrorKind::InvalidToken) error.\r\n#[derive(Debug, PartialEq)]\r\npub enum TokenValue {\r\n    Identifier(String),\r\n\r\n    FloatConstant(Float),\r\n    IntConstant(Integer),\r\n    BoolConstant(bool),\r\n\r\n    Layout,\r\n    In,\r\n    Out,\r\n    InOut,\r\n    Uniform,\r\n    Buffer,\r\n    Const,\r\n    Shared,\r\n\r\n    Restrict,\r\n    /// A `glsl` memory qualifier such as `writeonly`\r\n    ///\r\n    /// The associated [`crate::StorageAccess`] is the access being allowed\r\n    /// (for example `writeonly` has an associated value of [`crate::StorageAccess::STORE`])\r\n    MemoryQualifier(crate::StorageAccess),\r\n\r\n    Invariant,\r\n    Interpolation(Interpolation),\r\n    Sampling(Sampling),\r\n    Precision,\r\n    PrecisionQualifier(Precision),\r\n\r\n    Continue,\r\n    Break,\r\n    Return,\r\n    Discard,\r\n\r\n    If,\r\n    Else,\r\n    Switch,\r\n    Case,\r\n    Default,\r\n    While,\r\n    Do,\r\n    For,\r\n\r\n    Void,\r\n    Struct,\r\n    TypeName(Type),\r\n\r\n    Assign,\r\n    AddAssign,\r\n    SubAssign,\r\n    MulAssign,\r\n    DivAssign,\r\n    ModAssign,\r\n    LeftShiftAssign,\r\n    RightShiftAssign,\r\n    AndAssign,\r\n    XorAssign,\r\n    OrAssign,\r\n\r\n    Increment,\r\n    Decrement,\r\n\r\n    LogicalOr,\r\n    LogicalAnd,\r\n    LogicalXor,\r\n\r\n    LessEqual,\r\n    GreaterEqual,\r\n    Equal,\r\n    NotEqual,\r\n\r\n    LeftShift,\r\n    RightShift,\r\n\r\n    LeftBrace,\r\n    RightBrace,\r\n    LeftParen,\r\n    RightParen,\r\n    LeftBracket,\r\n    RightBracket,\r\n    LeftAngle,\r\n    RightAngle,\r\n\r\n    Comma,\r\n    Semicolon,\r\n    Colon,\r\n    Dot,\r\n    Bang,\r\n    Dash,\r\n    Tilde,\r\n    Plus,\r\n    Star,\r\n    Slash,\r\n    Percent,\r\n    VerticalBar,\r\n    Caret,\r\n    Ampersand,\r\n    Question,\r\n}\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub struct Directive {\r\n    pub kind: DirectiveKind,\r\n    pub tokens: Vec<PPToken>,\r\n}\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum DirectiveKind {\r\n    Version { is_first_directive: bool },\r\n    Extension,\r\n    Pragma,\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/types.rs",
    "content": "use super::{constants::ConstantSolver, context::Context, Error, ErrorKind, Parser, Result, Span};\r\nuse crate::{\r\n    proc::ResolveContext, Bytes, Constant, Expression, Handle, ImageClass, ImageDimension,\r\n    ScalarKind, Type, TypeInner, VectorSize,\r\n};\r\n\r\npub fn parse_type(type_name: &str) -> Option<Type> {\r\n    match type_name {\r\n        \"bool\" => Some(Type {\r\n            name: None,\r\n            inner: TypeInner::Scalar {\r\n                kind: ScalarKind::Bool,\r\n                width: crate::BOOL_WIDTH,\r\n            },\r\n        }),\r\n        \"float\" => Some(Type {\r\n            name: None,\r\n            inner: TypeInner::Scalar {\r\n                kind: ScalarKind::Float,\r\n                width: 4,\r\n            },\r\n        }),\r\n        \"double\" => Some(Type {\r\n            name: None,\r\n            inner: TypeInner::Scalar {\r\n                kind: ScalarKind::Float,\r\n                width: 8,\r\n            },\r\n        }),\r\n        \"int\" => Some(Type {\r\n            name: None,\r\n            inner: TypeInner::Scalar {\r\n                kind: ScalarKind::Sint,\r\n                width: 4,\r\n            },\r\n        }),\r\n        \"uint\" => Some(Type {\r\n            name: None,\r\n            inner: TypeInner::Scalar {\r\n                kind: ScalarKind::Uint,\r\n                width: 4,\r\n            },\r\n        }),\r\n        \"sampler\" | \"samplerShadow\" => Some(Type {\r\n            name: None,\r\n            inner: TypeInner::Sampler {\r\n                comparison: type_name == \"samplerShadow\",\r\n            },\r\n        }),\r\n        word => {\r\n            fn kind_width_parse(ty: &str) -> Option<(ScalarKind, u8)> {\r\n                Some(match ty {\r\n                    \"\" => (ScalarKind::Float, 4),\r\n                    \"b\" => (ScalarKind::Bool, crate::BOOL_WIDTH),\r\n                    \"i\" => (ScalarKind::Sint, 4),\r\n                    \"u\" => (ScalarKind::Uint, 4),\r\n                    \"d\" => (ScalarKind::Float, 8),\r\n                    _ => return None,\r\n                })\r\n            }\r\n\r\n            fn size_parse(n: &str) -> Option<VectorSize> {\r\n                Some(match n {\r\n                    \"2\" => VectorSize::Bi,\r\n                    \"3\" => VectorSize::Tri,\r\n                    \"4\" => VectorSize::Quad,\r\n                    _ => return None,\r\n                })\r\n            }\r\n\r\n            let vec_parse = |word: &str| {\r\n                let mut iter = word.split(\"vec\");\r\n\r\n                let kind = iter.next()?;\r\n                let size = iter.next()?;\r\n                let (kind, width) = kind_width_parse(kind)?;\r\n                let size = size_parse(size)?;\r\n\r\n                Some(Type {\r\n                    name: None,\r\n                    inner: TypeInner::Vector { size, kind, width },\r\n                })\r\n            };\r\n\r\n            let mat_parse = |word: &str| {\r\n                let mut iter = word.split(\"mat\");\r\n\r\n                let kind = iter.next()?;\r\n                let size = iter.next()?;\r\n                let (_, width) = kind_width_parse(kind)?;\r\n\r\n                let (columns, rows) = if let Some(size) = size_parse(size) {\r\n                    (size, size)\r\n                } else {\r\n                    let mut iter = size.split('x');\r\n                    match (iter.next()?, iter.next()?, iter.next()) {\r\n                        (col, row, None) => (size_parse(col)?, size_parse(row)?),\r\n                        _ => return None,\r\n                    }\r\n                };\r\n\r\n                Some(Type {\r\n                    name: None,\r\n                    inner: TypeInner::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width,\r\n                    },\r\n                })\r\n            };\r\n\r\n            let texture_parse = |word: &str| {\r\n                let mut iter = word.split(\"texture\");\r\n\r\n                let texture_kind = |ty| {\r\n                    Some(match ty {\r\n                        \"\" => ScalarKind::Float,\r\n                        \"i\" => ScalarKind::Sint,\r\n                        \"u\" => ScalarKind::Uint,\r\n                        _ => return None,\r\n                    })\r\n                };\r\n\r\n                let kind = iter.next()?;\r\n                let size = iter.next()?;\r\n                let kind = texture_kind(kind)?;\r\n\r\n                let sampled = |multi| ImageClass::Sampled { kind, multi };\r\n\r\n                let (dim, arrayed, class) = match size {\r\n                    \"1D\" => (ImageDimension::D1, false, sampled(false)),\r\n                    \"1DArray\" => (ImageDimension::D1, true, sampled(false)),\r\n                    \"2D\" => (ImageDimension::D2, false, sampled(false)),\r\n                    \"2DArray\" => (ImageDimension::D2, true, sampled(false)),\r\n                    \"2DMS\" => (ImageDimension::D2, false, sampled(true)),\r\n                    \"2DMSArray\" => (ImageDimension::D2, true, sampled(true)),\r\n                    \"3D\" => (ImageDimension::D3, false, sampled(false)),\r\n                    \"Cube\" => (ImageDimension::Cube, false, sampled(false)),\r\n                    \"CubeArray\" => (ImageDimension::Cube, true, sampled(false)),\r\n                    _ => return None,\r\n                };\r\n\r\n                Some(Type {\r\n                    name: None,\r\n                    inner: TypeInner::Image {\r\n                        dim,\r\n                        arrayed,\r\n                        class,\r\n                    },\r\n                })\r\n            };\r\n\r\n            let image_parse = |word: &str| {\r\n                let mut iter = word.split(\"image\");\r\n\r\n                let texture_kind = |ty| {\r\n                    Some(match ty {\r\n                        \"\" => ScalarKind::Float,\r\n                        \"i\" => ScalarKind::Sint,\r\n                        \"u\" => ScalarKind::Uint,\r\n                        _ => return None,\r\n                    })\r\n                };\r\n\r\n                let kind = iter.next()?;\r\n                let size = iter.next()?;\r\n                // TODO: Check that the texture format and the kind match\r\n                let _ = texture_kind(kind)?;\r\n\r\n                let class = ImageClass::Storage {\r\n                    format: crate::StorageFormat::R8Uint,\r\n                    access: crate::StorageAccess::all(),\r\n                };\r\n\r\n                // TODO: glsl support multisampled storage images, naga doesn't\r\n                let (dim, arrayed) = match size {\r\n                    \"1D\" => (ImageDimension::D1, false),\r\n                    \"1DArray\" => (ImageDimension::D1, true),\r\n                    \"2D\" => (ImageDimension::D2, false),\r\n                    \"2DArray\" => (ImageDimension::D2, true),\r\n                    \"3D\" => (ImageDimension::D3, false),\r\n                    // Naga doesn't support cube images and it's usefulness\r\n                    // is questionable, so they won't be supported for now\r\n                    // \"Cube\" => (ImageDimension::Cube, false),\r\n                    // \"CubeArray\" => (ImageDimension::Cube, true),\r\n                    _ => return None,\r\n                };\r\n\r\n                Some(Type {\r\n                    name: None,\r\n                    inner: TypeInner::Image {\r\n                        dim,\r\n                        arrayed,\r\n                        class,\r\n                    },\r\n                })\r\n            };\r\n\r\n            vec_parse(word)\r\n                .or_else(|| mat_parse(word))\r\n                .or_else(|| texture_parse(word))\r\n                .or_else(|| image_parse(word))\r\n        }\r\n    }\r\n}\r\n\r\npub const fn scalar_components(ty: &TypeInner) -> Option<(ScalarKind, Bytes)> {\r\n    match *ty {\r\n        TypeInner::Scalar { kind, width } => Some((kind, width)),\r\n        TypeInner::Vector { kind, width, .. } => Some((kind, width)),\r\n        TypeInner::Matrix { width, .. } => Some((ScalarKind::Float, width)),\r\n        TypeInner::ValuePointer { kind, width, .. } => Some((kind, width)),\r\n        _ => None,\r\n    }\r\n}\r\n\r\npub const fn type_power(kind: ScalarKind, width: Bytes) -> Option<u32> {\r\n    Some(match kind {\r\n        ScalarKind::Sint => 0,\r\n        ScalarKind::Uint => 1,\r\n        ScalarKind::Float if width == 4 => 2,\r\n        ScalarKind::Float => 3,\r\n        ScalarKind::Bool => return None,\r\n    })\r\n}\r\n\r\nimpl Parser {\r\n    /// Resolves the types of the expressions until `expr` (inclusive)\r\n    ///\r\n    /// This needs to be done before the [`typifier`] can be queried for\r\n    /// the types of the expressions in the range between the last grow and `expr`.\r\n    ///\r\n    /// # Note\r\n    ///\r\n    /// The `resolve_type*` methods (like [`resolve_type`]) automatically\r\n    /// grow the [`typifier`] so calling this method is not necessary when using\r\n    /// them.\r\n    ///\r\n    /// [`typifier`]: Context::typifier\r\n    /// [`resolve_type`]: Self::resolve_type\r\n    pub(crate) fn typifier_grow(\r\n        &self,\r\n        ctx: &mut Context,\r\n        expr: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<()> {\r\n        let resolve_ctx = ResolveContext {\r\n            constants: &self.module.constants,\r\n            types: &self.module.types,\r\n            global_vars: &self.module.global_variables,\r\n            local_vars: &ctx.locals,\r\n            functions: &self.module.functions,\r\n            arguments: &ctx.arguments,\r\n        };\r\n\r\n        ctx.typifier\r\n            .grow(expr, &ctx.expressions, &resolve_ctx)\r\n            .map_err(|error| Error {\r\n                kind: ErrorKind::SemanticError(format!(\"Can't resolve type: {:?}\", error).into()),\r\n                meta,\r\n            })\r\n    }\r\n\r\n    /// Gets the type for the result of the `expr` expression\r\n    ///\r\n    /// Automatically grows the [`typifier`] to `expr` so calling\r\n    /// [`typifier_grow`] is not necessary\r\n    ///\r\n    /// [`typifier`]: Context::typifier\r\n    /// [`typifier_grow`]: Self::typifier_grow\r\n    pub(crate) fn resolve_type<'b>(\r\n        &'b self,\r\n        ctx: &'b mut Context,\r\n        expr: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<&'b TypeInner> {\r\n        self.typifier_grow(ctx, expr, meta)?;\r\n        Ok(ctx.typifier.get(expr, &self.module.types))\r\n    }\r\n\r\n    /// Gets the type handle for the result of the `expr` expression\r\n    ///\r\n    /// Automatically grows the [`typifier`] to `expr` so calling\r\n    /// [`typifier_grow`] is not necessary\r\n    ///\r\n    /// # Note\r\n    ///\r\n    /// Consider using [`resolve_type`] whenever possible\r\n    /// since it doesn't require adding each type to the [`types`] arena\r\n    /// and it doesn't need to mutably borrow the [`Parser`][Self]\r\n    ///\r\n    /// [`types`]: crate::Module::types\r\n    /// [`typifier`]: Context::typifier\r\n    /// [`typifier_grow`]: Self::typifier_grow\r\n    /// [`resolve_type`]: Self::resolve_type\r\n    pub(crate) fn resolve_type_handle(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        expr: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<Handle<Type>> {\r\n        self.typifier_grow(ctx, expr, meta)?;\r\n        let resolution = &ctx.typifier[expr];\r\n        Ok(match *resolution {\r\n            // If the resolution is already a handle return early\r\n            crate::proc::TypeResolution::Handle(ty) => ty,\r\n            // If it's a value we need to clone it\r\n            crate::proc::TypeResolution::Value(_) => match resolution.clone() {\r\n                // This is unreachable\r\n                crate::proc::TypeResolution::Handle(ty) => ty,\r\n                // Add the value to the type arena and return the handle\r\n                crate::proc::TypeResolution::Value(inner) => {\r\n                    self.module.types.insert(Type { name: None, inner }, meta)\r\n                }\r\n            },\r\n        })\r\n    }\r\n\r\n    /// Invalidates the cached type resolution for `expr` forcing a recomputation\r\n    pub(crate) fn invalidate_expression<'b>(\r\n        &'b self,\r\n        ctx: &'b mut Context,\r\n        expr: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<()> {\r\n        let resolve_ctx = ResolveContext {\r\n            constants: &self.module.constants,\r\n            types: &self.module.types,\r\n            global_vars: &self.module.global_variables,\r\n            local_vars: &ctx.locals,\r\n            functions: &self.module.functions,\r\n            arguments: &ctx.arguments,\r\n        };\r\n\r\n        ctx.typifier\r\n            .invalidate(expr, &ctx.expressions, &resolve_ctx)\r\n            .map_err(|error| Error {\r\n                kind: ErrorKind::SemanticError(format!(\"Can't resolve type: {:?}\", error).into()),\r\n                meta,\r\n            })\r\n    }\r\n\r\n    pub(crate) fn solve_constant(\r\n        &mut self,\r\n        ctx: &Context,\r\n        root: Handle<Expression>,\r\n        meta: Span,\r\n    ) -> Result<Handle<Constant>> {\r\n        let mut solver = ConstantSolver {\r\n            types: &mut self.module.types,\r\n            expressions: &ctx.expressions,\r\n            constants: &mut self.module.constants,\r\n        };\r\n\r\n        solver.solve(root).map_err(|e| Error {\r\n            kind: e.into(),\r\n            meta,\r\n        })\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/glsl/variables.rs",
    "content": "use super::{\r\n    ast::*,\r\n    context::{Context, ExprPos},\r\n    error::{Error, ErrorKind},\r\n    Parser, Result, Span,\r\n};\r\nuse crate::{\r\n    AddressSpace, Binding, Block, BuiltIn, Constant, Expression, GlobalVariable, Handle,\r\n    Interpolation, LocalVariable, ResourceBinding, ScalarKind, ShaderStage, SwizzleComponent, Type,\r\n    TypeInner, VectorSize,\r\n};\r\n\r\npub struct VarDeclaration<'a, 'key> {\r\n    pub qualifiers: &'a mut TypeQualifiers<'key>,\r\n    pub ty: Handle<Type>,\r\n    pub name: Option<String>,\r\n    pub init: Option<Handle<Constant>>,\r\n    pub meta: Span,\r\n}\r\n\r\n/// Information about a builtin used in [`add_builtin`](Parser::add_builtin).\r\nstruct BuiltInData {\r\n    /// The type of the builtin.\r\n    inner: TypeInner,\r\n    /// The associated builtin class.\r\n    builtin: BuiltIn,\r\n    /// Whether the builtin can be written to or not.\r\n    mutable: bool,\r\n    /// The storage used for the builtin.\r\n    storage: StorageQualifier,\r\n}\r\n\r\npub enum GlobalOrConstant {\r\n    Global(Handle<GlobalVariable>),\r\n    Constant(Handle<Constant>),\r\n}\r\n\r\nimpl Parser {\r\n    /// Adds a builtin and returns a variable reference to it\r\n    fn add_builtin(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        name: &str,\r\n        data: BuiltInData,\r\n        meta: Span,\r\n    ) -> Option<VariableReference> {\r\n        let ty = self.module.types.insert(\r\n            Type {\r\n                name: None,\r\n                inner: data.inner,\r\n            },\r\n            meta,\r\n        );\r\n\r\n        let handle = self.module.global_variables.append(\r\n            GlobalVariable {\r\n                name: Some(name.into()),\r\n                space: AddressSpace::Private,\r\n                binding: None,\r\n                ty,\r\n                init: None,\r\n            },\r\n            meta,\r\n        );\r\n\r\n        let idx = self.entry_args.len();\r\n        self.entry_args.push(EntryArg {\r\n            name: None,\r\n            binding: Binding::BuiltIn(data.builtin),\r\n            handle,\r\n            storage: data.storage,\r\n        });\r\n\r\n        self.global_variables.push((\r\n            name.into(),\r\n            GlobalLookup {\r\n                kind: GlobalLookupKind::Variable(handle),\r\n                entry_arg: Some(idx),\r\n                mutable: data.mutable,\r\n            },\r\n        ));\r\n\r\n        let expr = ctx.add_expression(Expression::GlobalVariable(handle), meta, body);\r\n\r\n        let var = VariableReference {\r\n            expr,\r\n            load: true,\r\n            mutable: data.mutable,\r\n            constant: None,\r\n            entry_arg: Some(idx),\r\n        };\r\n\r\n        ctx.symbol_table.add_root(name.into(), var.clone());\r\n\r\n        Some(var)\r\n    }\r\n\r\n    pub(crate) fn lookup_variable(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        name: &str,\r\n        meta: Span,\r\n    ) -> Option<VariableReference> {\r\n        if let Some(var) = ctx.symbol_table.lookup(name).cloned() {\r\n            return Some(var);\r\n        }\r\n\r\n        let data = match name {\r\n            \"gl_Position\" => BuiltInData {\r\n                inner: TypeInner::Vector {\r\n                    size: VectorSize::Quad,\r\n                    kind: ScalarKind::Float,\r\n                    width: 4,\r\n                },\r\n                builtin: BuiltIn::Position { invariant: false },\r\n                mutable: true,\r\n                storage: StorageQualifier::Output,\r\n            },\r\n            \"gl_FragCoord\" => BuiltInData {\r\n                inner: TypeInner::Vector {\r\n                    size: VectorSize::Quad,\r\n                    kind: ScalarKind::Float,\r\n                    width: 4,\r\n                },\r\n                builtin: BuiltIn::Position { invariant: false },\r\n                mutable: false,\r\n                storage: StorageQualifier::Input,\r\n            },\r\n            \"gl_GlobalInvocationID\"\r\n            | \"gl_NumWorkGroups\"\r\n            | \"gl_WorkGroupSize\"\r\n            | \"gl_WorkGroupID\"\r\n            | \"gl_LocalInvocationID\" => BuiltInData {\r\n                inner: TypeInner::Vector {\r\n                    size: VectorSize::Tri,\r\n                    kind: ScalarKind::Uint,\r\n                    width: 4,\r\n                },\r\n                builtin: match name {\r\n                    \"gl_GlobalInvocationID\" => BuiltIn::GlobalInvocationId,\r\n                    \"gl_NumWorkGroups\" => BuiltIn::NumWorkGroups,\r\n                    \"gl_WorkGroupSize\" => BuiltIn::WorkGroupSize,\r\n                    \"gl_WorkGroupID\" => BuiltIn::WorkGroupId,\r\n                    \"gl_LocalInvocationID\" => BuiltIn::LocalInvocationId,\r\n                    _ => unreachable!(),\r\n                },\r\n                mutable: false,\r\n                storage: StorageQualifier::Input,\r\n            },\r\n            \"gl_FrontFacing\" => BuiltInData {\r\n                inner: TypeInner::Scalar {\r\n                    kind: ScalarKind::Bool,\r\n                    width: crate::BOOL_WIDTH,\r\n                },\r\n                builtin: BuiltIn::FrontFacing,\r\n                mutable: false,\r\n                storage: StorageQualifier::Input,\r\n            },\r\n            \"gl_PointSize\" | \"gl_FragDepth\" => BuiltInData {\r\n                inner: TypeInner::Scalar {\r\n                    kind: ScalarKind::Float,\r\n                    width: 4,\r\n                },\r\n                builtin: match name {\r\n                    \"gl_PointSize\" => BuiltIn::PointSize,\r\n                    \"gl_FragDepth\" => BuiltIn::FragDepth,\r\n                    _ => unreachable!(),\r\n                },\r\n                mutable: true,\r\n                storage: StorageQualifier::Output,\r\n            },\r\n            \"gl_ClipDistance\" | \"gl_CullDistance\" => {\r\n                let base = self.module.types.insert(\r\n                    Type {\r\n                        name: None,\r\n                        inner: TypeInner::Scalar {\r\n                            kind: ScalarKind::Float,\r\n                            width: 4,\r\n                        },\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                BuiltInData {\r\n                    inner: TypeInner::Array {\r\n                        base,\r\n                        size: crate::ArraySize::Dynamic,\r\n                        stride: 4,\r\n                    },\r\n                    builtin: match name {\r\n                        \"gl_ClipDistance\" => BuiltIn::PointSize,\r\n                        \"gl_CullDistance\" => BuiltIn::FragDepth,\r\n                        _ => unreachable!(),\r\n                    },\r\n                    mutable: self.meta.stage == ShaderStage::Vertex,\r\n                    storage: StorageQualifier::Output,\r\n                }\r\n            }\r\n            _ => {\r\n                let builtin = match name {\r\n                    \"gl_BaseVertex\" => BuiltIn::BaseVertex,\r\n                    \"gl_BaseInstance\" => BuiltIn::BaseInstance,\r\n                    \"gl_PrimitiveID\" => BuiltIn::PrimitiveIndex,\r\n                    \"gl_InstanceIndex\" => BuiltIn::InstanceIndex,\r\n                    \"gl_VertexIndex\" => BuiltIn::VertexIndex,\r\n                    \"gl_SampleID\" => BuiltIn::SampleIndex,\r\n                    \"gl_LocalInvocationIndex\" => BuiltIn::LocalInvocationIndex,\r\n                    _ => return None,\r\n                };\r\n\r\n                BuiltInData {\r\n                    inner: TypeInner::Scalar {\r\n                        kind: ScalarKind::Uint,\r\n                        width: 4,\r\n                    },\r\n                    builtin,\r\n                    mutable: false,\r\n                    storage: StorageQualifier::Input,\r\n                }\r\n            }\r\n        };\r\n\r\n        self.add_builtin(ctx, body, name, data, meta)\r\n    }\r\n\r\n    pub(crate) fn make_variable_invariant(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        name: &str,\r\n        meta: Span,\r\n    ) {\r\n        if let Some(var) = self.lookup_variable(ctx, body, name, meta) {\r\n            if let Some(index) = var.entry_arg {\r\n                if let Binding::BuiltIn(BuiltIn::Position { ref mut invariant }) =\r\n                    self.entry_args[index].binding\r\n                {\r\n                    *invariant = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    pub(crate) fn field_selection(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        pos: ExprPos,\r\n        body: &mut Block,\r\n        expression: Handle<Expression>,\r\n        name: &str,\r\n        meta: Span,\r\n    ) -> Result<Handle<Expression>> {\r\n        let (ty, is_pointer) = match *self.resolve_type(ctx, expression, meta)? {\r\n            TypeInner::Pointer { base, .. } => (&self.module.types[base].inner, true),\r\n            ref ty => (ty, false),\r\n        };\r\n        match *ty {\r\n            TypeInner::Struct { ref members, .. } => {\r\n                let index = members\r\n                    .iter()\r\n                    .position(|m| m.name == Some(name.into()))\r\n                    .ok_or_else(|| Error {\r\n                        kind: ErrorKind::UnknownField(name.into()),\r\n                        meta,\r\n                    })?;\r\n                let pointer = ctx.add_expression(\r\n                    Expression::AccessIndex {\r\n                        base: expression,\r\n                        index: index as u32,\r\n                    },\r\n                    meta,\r\n                    body,\r\n                );\r\n\r\n                Ok(match pos {\r\n                    ExprPos::Rhs if is_pointer => {\r\n                        ctx.add_expression(Expression::Load { pointer }, meta, body)\r\n                    }\r\n                    _ => pointer,\r\n                })\r\n            }\r\n            // swizzles (xyzw, rgba, stpq)\r\n            TypeInner::Vector { size, .. } => {\r\n                let check_swizzle_components = |comps: &str| {\r\n                    name.chars()\r\n                        .map(|c| {\r\n                            comps\r\n                                .find(c)\r\n                                .filter(|i| *i < size as usize)\r\n                                .map(|i| SwizzleComponent::from_index(i as u32))\r\n                        })\r\n                        .collect::<Option<Vec<SwizzleComponent>>>()\r\n                };\r\n\r\n                let components = check_swizzle_components(\"xyzw\")\r\n                    .or_else(|| check_swizzle_components(\"rgba\"))\r\n                    .or_else(|| check_swizzle_components(\"stpq\"));\r\n\r\n                if let Some(components) = components {\r\n                    if let ExprPos::Lhs = pos {\r\n                        let not_unique = (1..components.len())\r\n                            .any(|i| components[i..].contains(&components[i - 1]));\r\n                        if not_unique {\r\n                            self.errors.push(Error {\r\n                                kind:\r\n                                ErrorKind::SemanticError(\r\n                                format!(\r\n                                    \"swizzle cannot have duplicate components in left-hand-side expression for \\\"{:?}\\\"\",\r\n                                    name\r\n                                )\r\n                                .into(),\r\n                            ),\r\n                                meta ,\r\n                            })\r\n                        }\r\n                    }\r\n\r\n                    let mut pattern = [SwizzleComponent::X; 4];\r\n                    for (pat, component) in pattern.iter_mut().zip(&components) {\r\n                        *pat = *component;\r\n                    }\r\n\r\n                    // flatten nested swizzles (vec.zyx.xy.x => vec.z)\r\n                    let mut expression = expression;\r\n                    if let Expression::Swizzle {\r\n                        size: _,\r\n                        vector,\r\n                        pattern: ref src_pattern,\r\n                    } = ctx[expression]\r\n                    {\r\n                        expression = vector;\r\n                        for pat in &mut pattern {\r\n                            *pat = src_pattern[pat.index() as usize];\r\n                        }\r\n                    }\r\n\r\n                    let size = match components.len() {\r\n                        // Swizzles with just one component are accesses and not swizzles\r\n                        1 => {\r\n                            match pos {\r\n                                // If the position is in the right hand side and the base\r\n                                // vector is a pointer, load it, otherwise the swizzle would\r\n                                // produce a pointer\r\n                                ExprPos::Rhs if is_pointer => {\r\n                                    expression = ctx.add_expression(\r\n                                        Expression::Load {\r\n                                            pointer: expression,\r\n                                        },\r\n                                        meta,\r\n                                        body,\r\n                                    );\r\n                                }\r\n                                _ => {}\r\n                            };\r\n                            return Ok(ctx.add_expression(\r\n                                Expression::AccessIndex {\r\n                                    base: expression,\r\n                                    index: pattern[0].index(),\r\n                                },\r\n                                meta,\r\n                                body,\r\n                            ));\r\n                        }\r\n                        2 => VectorSize::Bi,\r\n                        3 => VectorSize::Tri,\r\n                        4 => VectorSize::Quad,\r\n                        _ => {\r\n                            self.errors.push(Error {\r\n                                kind: ErrorKind::SemanticError(\r\n                                    format!(\"Bad swizzle size for \\\"{:?}\\\"\", name).into(),\r\n                                ),\r\n                                meta,\r\n                            });\r\n\r\n                            VectorSize::Quad\r\n                        }\r\n                    };\r\n\r\n                    if is_pointer {\r\n                        // NOTE: for lhs expression, this extra load ends up as an unused expr, because the\r\n                        // assignment will extract the pointer and use it directly anyway. Unfortunately we\r\n                        // need it for validation to pass, as swizzles cannot operate on pointer values.\r\n                        expression = ctx.add_expression(\r\n                            Expression::Load {\r\n                                pointer: expression,\r\n                            },\r\n                            meta,\r\n                            body,\r\n                        );\r\n                    }\r\n\r\n                    Ok(ctx.add_expression(\r\n                        Expression::Swizzle {\r\n                            size,\r\n                            vector: expression,\r\n                            pattern,\r\n                        },\r\n                        meta,\r\n                        body,\r\n                    ))\r\n                } else {\r\n                    Err(Error {\r\n                        kind: ErrorKind::SemanticError(\r\n                            format!(\"Invalid swizzle for vector \\\"{}\\\"\", name).into(),\r\n                        ),\r\n                        meta,\r\n                    })\r\n                }\r\n            }\r\n            _ => Err(Error {\r\n                kind: ErrorKind::SemanticError(\r\n                    format!(\"Can't lookup field on this type \\\"{}\\\"\", name).into(),\r\n                ),\r\n                meta,\r\n            }),\r\n        }\r\n    }\r\n\r\n    pub(crate) fn add_global_var(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        VarDeclaration {\r\n            qualifiers,\r\n            mut ty,\r\n            name,\r\n            init,\r\n            meta,\r\n        }: VarDeclaration,\r\n    ) -> Result<GlobalOrConstant> {\r\n        let storage = qualifiers.storage.0;\r\n        let (ret, lookup) = match storage {\r\n            StorageQualifier::Input | StorageQualifier::Output => {\r\n                let input = storage == StorageQualifier::Input;\r\n                // TODO: glslang seems to use a counter for variables without\r\n                // explicit location (even if that causes collisions)\r\n                let location = qualifiers\r\n                    .uint_layout_qualifier(\"location\", &mut self.errors)\r\n                    .unwrap_or(0);\r\n                let interpolation = qualifiers.interpolation.take().map(|(i, _)| i).or_else(|| {\r\n                    let kind = self.module.types[ty].inner.scalar_kind()?;\r\n                    Some(match kind {\r\n                        ScalarKind::Float => Interpolation::Perspective,\r\n                        _ => Interpolation::Flat,\r\n                    })\r\n                });\r\n                let sampling = qualifiers.sampling.take().map(|(s, _)| s);\r\n\r\n                let handle = self.module.global_variables.append(\r\n                    GlobalVariable {\r\n                        name: name.clone(),\r\n                        space: AddressSpace::Private,\r\n                        binding: None,\r\n                        ty,\r\n                        init,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                let idx = self.entry_args.len();\r\n                self.entry_args.push(EntryArg {\r\n                    name: name.clone(),\r\n                    binding: Binding::Location {\r\n                        location,\r\n                        interpolation,\r\n                        sampling,\r\n                    },\r\n                    handle,\r\n                    storage,\r\n                });\r\n\r\n                let lookup = GlobalLookup {\r\n                    kind: GlobalLookupKind::Variable(handle),\r\n                    entry_arg: Some(idx),\r\n                    mutable: !input,\r\n                };\r\n\r\n                (GlobalOrConstant::Global(handle), lookup)\r\n            }\r\n            StorageQualifier::Const => {\r\n                let init = init.ok_or_else(|| Error {\r\n                    kind: ErrorKind::SemanticError(\"const values must have an initializer\".into()),\r\n                    meta,\r\n                })?;\r\n\r\n                let lookup = GlobalLookup {\r\n                    kind: GlobalLookupKind::Constant(init, ty),\r\n                    entry_arg: None,\r\n                    mutable: false,\r\n                };\r\n\r\n                (GlobalOrConstant::Constant(init), lookup)\r\n            }\r\n            StorageQualifier::AddressSpace(mut space) => {\r\n                match space {\r\n                    AddressSpace::Storage { ref mut access } => {\r\n                        if let Some((allowed_access, _)) = qualifiers.storage_access.take() {\r\n                            *access = allowed_access;\r\n                        }\r\n                    }\r\n                    AddressSpace::Uniform => match self.module.types[ty].inner {\r\n                        TypeInner::Image {\r\n                            class,\r\n                            dim,\r\n                            arrayed,\r\n                        } => {\r\n                            if let crate::ImageClass::Storage {\r\n                                mut access,\r\n                                mut format,\r\n                            } = class\r\n                            {\r\n                                if let Some((allowed_access, _)) = qualifiers.storage_access.take()\r\n                                {\r\n                                    access = allowed_access;\r\n                                }\r\n\r\n                                match qualifiers.layout_qualifiers.remove(&QualifierKey::Format) {\r\n                                    Some((QualifierValue::Format(f), _)) => format = f,\r\n                                    // TODO: glsl supports images without format qualifier\r\n                                    // if they are `writeonly`\r\n                                    None => self.errors.push(Error {\r\n                                        kind: ErrorKind::SemanticError(\r\n                                            \"image types require a format layout qualifier\".into(),\r\n                                        ),\r\n                                        meta,\r\n                                    }),\r\n                                    _ => unreachable!(),\r\n                                }\r\n\r\n                                ty = self.module.types.insert(\r\n                                    Type {\r\n                                        name: None,\r\n                                        inner: TypeInner::Image {\r\n                                            dim,\r\n                                            arrayed,\r\n                                            class: crate::ImageClass::Storage { format, access },\r\n                                        },\r\n                                    },\r\n                                    meta,\r\n                                );\r\n                            }\r\n\r\n                            space = AddressSpace::Handle\r\n                        }\r\n                        TypeInner::Sampler { .. } => space = AddressSpace::Handle,\r\n                        _ => {\r\n                            if qualifiers.none_layout_qualifier(\"push_constant\", &mut self.errors) {\r\n                                space = AddressSpace::PushConstant\r\n                            }\r\n                        }\r\n                    },\r\n                    AddressSpace::Function => space = AddressSpace::Private,\r\n                    _ => {}\r\n                };\r\n\r\n                let binding = match space {\r\n                    AddressSpace::Uniform | AddressSpace::Storage { .. } | AddressSpace::Handle => {\r\n                        let binding = qualifiers.uint_layout_qualifier(\"binding\", &mut self.errors);\r\n                        if binding.is_none() {\r\n                            self.errors.push(Error {\r\n                                kind: ErrorKind::SemanticError(\r\n                                    \"uniform/buffer blocks require layout(binding=X)\".into(),\r\n                                ),\r\n                                meta,\r\n                            });\r\n                        }\r\n                        let set = qualifiers.uint_layout_qualifier(\"set\", &mut self.errors);\r\n                        binding.map(|binding| ResourceBinding {\r\n                            group: set.unwrap_or(0),\r\n                            binding,\r\n                        })\r\n                    }\r\n                    _ => None,\r\n                };\r\n\r\n                let handle = self.module.global_variables.append(\r\n                    GlobalVariable {\r\n                        name: name.clone(),\r\n                        space,\r\n                        binding,\r\n                        ty,\r\n                        init,\r\n                    },\r\n                    meta,\r\n                );\r\n\r\n                let lookup = GlobalLookup {\r\n                    kind: GlobalLookupKind::Variable(handle),\r\n                    entry_arg: None,\r\n                    mutable: true,\r\n                };\r\n\r\n                (GlobalOrConstant::Global(handle), lookup)\r\n            }\r\n        };\r\n\r\n        if let Some(name) = name {\r\n            ctx.add_global(self, &name, lookup, body);\r\n\r\n            self.global_variables.push((name, lookup));\r\n        }\r\n\r\n        qualifiers.unused_errors(&mut self.errors);\r\n\r\n        Ok(ret)\r\n    }\r\n\r\n    pub(crate) fn add_local_var(\r\n        &mut self,\r\n        ctx: &mut Context,\r\n        body: &mut Block,\r\n        decl: VarDeclaration,\r\n    ) -> Result<Handle<Expression>> {\r\n        let storage = decl.qualifiers.storage;\r\n        let mutable = match storage.0 {\r\n            StorageQualifier::AddressSpace(AddressSpace::Function) => true,\r\n            StorageQualifier::Const => false,\r\n            _ => {\r\n                self.errors.push(Error {\r\n                    kind: ErrorKind::SemanticError(\"Locals cannot have a storage qualifier\".into()),\r\n                    meta: storage.1,\r\n                });\r\n                true\r\n            }\r\n        };\r\n\r\n        let handle = ctx.locals.append(\r\n            LocalVariable {\r\n                name: decl.name.clone(),\r\n                ty: decl.ty,\r\n                init: None,\r\n            },\r\n            decl.meta,\r\n        );\r\n        let expr = ctx.add_expression(Expression::LocalVariable(handle), decl.meta, body);\r\n\r\n        if let Some(name) = decl.name {\r\n            let maybe_var = ctx.add_local_var(name.clone(), expr, mutable);\r\n\r\n            if maybe_var.is_some() {\r\n                self.errors.push(Error {\r\n                    kind: ErrorKind::VariableAlreadyDeclared(name),\r\n                    meta: decl.meta,\r\n                })\r\n            }\r\n        }\r\n\r\n        decl.qualifiers.unused_errors(&mut self.errors);\r\n\r\n        Ok(expr)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/interpolator.rs",
    "content": "/*!\r\nInterpolation defaults.\r\n*/\r\n\r\nimpl crate::Binding {\r\n    /// Apply the usual default interpolation for `ty` to `binding`.\r\n    ///\r\n    /// This function is a utility front ends may use to satisfy the Naga IR's\r\n    /// requirement, meant to ensure that input languages' policies have been\r\n    /// applied appropriately, that all I/O `Binding`s from the vertex shader to the\r\n    /// fragment shader must have non-`None` `interpolation` values.\r\n    ///\r\n    /// All the shader languages Naga supports have similar rules:\r\n    /// perspective-correct, center-sampled interpolation is the default for any\r\n    /// binding that can vary, and everything else either defaults to flat, or\r\n    /// requires an explicit flat qualifier/attribute/what-have-you.\r\n    ///\r\n    /// If `binding` is not a [`Location`] binding, or if its [`interpolation`] is\r\n    /// already set, then make no changes. Otherwise, set `binding`'s interpolation\r\n    /// and sampling to reasonable defaults depending on `ty`, the type of the value\r\n    /// being interpolated:\r\n    ///\r\n    /// - If `ty` is a floating-point scalar, vector, or matrix type, then\r\n    ///   default to [`Perspective`] interpolation and [`Center`] sampling.\r\n    ///\r\n    /// - If `ty` is an integral scalar or vector, then default to [`Flat`]\r\n    ///   interpolation, which has no associated sampling.\r\n    ///\r\n    /// - For any other types, make no change. Such types are not permitted as\r\n    ///   user-defined IO values, and will probably be flagged by the verifier\r\n    ///\r\n    /// When structs appear in input or output types, each member ought to have its\r\n    /// own [`Binding`], so structs are simply covered by the third case.\r\n    ///\r\n    /// [`Binding`]: crate::Binding\r\n    /// [`Location`]: crate::Binding::Location\r\n    /// [`interpolation`]: crate::Binding::Location::interpolation\r\n    /// [`Perspective`]: crate::Interpolation::Perspective\r\n    /// [`Flat`]: crate::Interpolation::Flat\r\n    /// [`Center`]: crate::Sampling::Center\r\n    pub fn apply_default_interpolation(&mut self, ty: &crate::TypeInner) {\r\n        if let crate::Binding::Location {\r\n            location: _,\r\n            interpolation: ref mut interpolation @ None,\r\n            ref mut sampling,\r\n        } = *self\r\n        {\r\n            match ty.scalar_kind() {\r\n                Some(crate::ScalarKind::Float) => {\r\n                    *interpolation = Some(crate::Interpolation::Perspective);\r\n                    *sampling = Some(crate::Sampling::Center);\r\n                }\r\n                Some(crate::ScalarKind::Sint | crate::ScalarKind::Uint) => {\r\n                    *interpolation = Some(crate::Interpolation::Flat);\r\n                    *sampling = None;\r\n                }\r\n                Some(_) | None => {}\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/mod.rs",
    "content": "/*!\r\nFrontend parsers that consume binary and text shaders and load them into [`Module`](super::Module)s.\r\n*/\r\n\r\nmod interpolator;\r\n\r\n#[cfg(feature = \"glsl-in\")]\r\npub mod glsl;\r\n#[cfg(feature = \"spv-in\")]\r\npub mod spv;\r\n#[cfg(feature = \"wgsl-in\")]\r\npub mod wgsl;\r\n\r\nuse crate::{\r\n    arena::{Arena, Handle, UniqueArena},\r\n    proc::{ResolveContext, ResolveError, TypeResolution},\r\n    FastHashMap,\r\n};\r\nuse std::ops;\r\n\r\n/// Helper class to emit expressions\r\n#[allow(dead_code)]\r\n#[derive(Default, Debug)]\r\nstruct Emitter {\r\n    start_len: Option<usize>,\r\n}\r\n\r\n#[allow(dead_code)]\r\nimpl Emitter {\r\n    fn start(&mut self, arena: &Arena<crate::Expression>) {\r\n        if self.start_len.is_some() {\r\n            unreachable!(\"Emitting has already started!\");\r\n        }\r\n        self.start_len = Some(arena.len());\r\n    }\r\n    #[must_use]\r\n    fn finish(\r\n        &mut self,\r\n        arena: &Arena<crate::Expression>,\r\n    ) -> Option<(crate::Statement, crate::span::Span)> {\r\n        let start_len = self.start_len.take().unwrap();\r\n        if start_len != arena.len() {\r\n            #[allow(unused_mut)]\r\n            let mut span = crate::span::Span::default();\r\n            let range = arena.range_from(start_len);\r\n            #[cfg(feature = \"span\")]\r\n            for handle in range.clone() {\r\n                span.subsume(arena.get_span(handle))\r\n            }\r\n            Some((crate::Statement::Emit(range), span))\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n}\r\n\r\n#[allow(dead_code)]\r\nimpl super::ConstantInner {\r\n    const fn boolean(value: bool) -> Self {\r\n        Self::Scalar {\r\n            width: super::BOOL_WIDTH,\r\n            value: super::ScalarValue::Bool(value),\r\n        }\r\n    }\r\n}\r\n\r\n/// Helper processor that derives the types of all expressions.\r\n#[derive(Debug, Default)]\r\npub struct Typifier {\r\n    resolutions: Vec<TypeResolution>,\r\n}\r\n\r\nimpl Typifier {\r\n    pub const fn new() -> Self {\r\n        Typifier {\r\n            resolutions: Vec::new(),\r\n        }\r\n    }\r\n\r\n    pub fn reset(&mut self) {\r\n        self.resolutions.clear()\r\n    }\r\n\r\n    pub fn get<'a>(\r\n        &'a self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        types: &'a UniqueArena<crate::Type>,\r\n    ) -> &'a crate::TypeInner {\r\n        self.resolutions[expr_handle.index()].inner_with(types)\r\n    }\r\n\r\n    pub fn grow(\r\n        &mut self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        expressions: &Arena<crate::Expression>,\r\n        ctx: &ResolveContext,\r\n    ) -> Result<(), ResolveError> {\r\n        if self.resolutions.len() <= expr_handle.index() {\r\n            for (eh, expr) in expressions.iter().skip(self.resolutions.len()) {\r\n                //Note: the closure can't `Err` by construction\r\n                let resolution = ctx.resolve(expr, |h| Ok(&self.resolutions[h.index()]))?;\r\n                log::debug!(\"Resolving {:?} = {:?} : {:?}\", eh, expr, resolution);\r\n                self.resolutions.push(resolution);\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Invalidates the cached type resolution for `expr_handle` forcing a recomputation\r\n    ///\r\n    /// If the type of the expression hasn't yet been calculated a\r\n    /// [`grow`](Self::grow) is performed instead\r\n    pub fn invalidate(\r\n        &mut self,\r\n        expr_handle: Handle<crate::Expression>,\r\n        expressions: &Arena<crate::Expression>,\r\n        ctx: &ResolveContext,\r\n    ) -> Result<(), ResolveError> {\r\n        if self.resolutions.len() <= expr_handle.index() {\r\n            self.grow(expr_handle, expressions, ctx)\r\n        } else {\r\n            let expr = &expressions[expr_handle];\r\n            //Note: the closure can't `Err` by construction\r\n            let resolution = ctx.resolve(expr, |h| Ok(&self.resolutions[h.index()]))?;\r\n            self.resolutions[expr_handle.index()] = resolution;\r\n            Ok(())\r\n        }\r\n    }\r\n}\r\n\r\nimpl ops::Index<Handle<crate::Expression>> for Typifier {\r\n    type Output = TypeResolution;\r\n    fn index(&self, handle: Handle<crate::Expression>) -> &Self::Output {\r\n        &self.resolutions[handle.index()]\r\n    }\r\n}\r\n\r\n/// Type representing a lexical scope, associating a name to a single variable\r\n///\r\n/// The scope is generic over the variable representation and name representaion\r\n/// in order to allow larger flexibility on the frontends on how they might\r\n/// represent them.\r\ntype Scope<Name, Var> = FastHashMap<Name, Var>;\r\n\r\n/// Structure responsible for managing variable lookups and keeping track of\r\n/// lexical scopes\r\n///\r\n/// The symbol table is generic over the variable representation and its name\r\n/// to allow larger flexibility on the frontends on how they might represent them.\r\n///\r\n/// ```\r\n/// use naga::front::SymbolTable;\r\n///\r\n/// // Create a new symbol table with `u32`s representing the variable\r\n/// let mut symbol_table: SymbolTable<&str, u32> = SymbolTable::default();\r\n///\r\n/// // Add two variables named `var1` and `var2` with 0 and 2 respectively\r\n/// symbol_table.add(\"var1\", 0);\r\n/// symbol_table.add(\"var2\", 2);\r\n///\r\n/// // Check that `var1` exists and is `0`\r\n/// assert_eq!(symbol_table.lookup(\"var1\"), Some(&0));\r\n///\r\n/// // Push a new scope and add a variable to it named `var1` shadowing the\r\n/// // variable of our previous scope\r\n/// symbol_table.push_scope();\r\n/// symbol_table.add(\"var1\", 1);\r\n///\r\n/// // Check that `var1` now points to the new value of `1` and `var2` still\r\n/// // exists with its value of `2`\r\n/// assert_eq!(symbol_table.lookup(\"var1\"), Some(&1));\r\n/// assert_eq!(symbol_table.lookup(\"var2\"), Some(&2));\r\n///\r\n/// // Pop the scope\r\n/// symbol_table.pop_scope();\r\n///\r\n/// // Check that `var1` now refers to our initial variable with value `0`\r\n/// assert_eq!(symbol_table.lookup(\"var1\"), Some(&0));\r\n/// ```\r\n///\r\n/// Scopes are ordered as a LIFO stack so a variable defined in a later scope\r\n/// with the same name as another variable defined in a earlier scope will take\r\n/// precedence in the lookup. Scopes can be added with [`push_scope`] and\r\n/// removed with [`pop_scope`].\r\n///\r\n/// A root scope is added when the symbol table is created and must always be\r\n/// present. Trying to pop it will result in a panic.\r\n///\r\n/// Variables can be added with [`add`] and looked up with [`lookup`]. Adding a\r\n/// variable will do so in the currently active scope and as mentioned\r\n/// previously a lookup will search from the current scope to the root scope.\r\n///\r\n/// [`push_scope`]: Self::push_scope\r\n/// [`pop_scope`]: Self::push_scope\r\n/// [`add`]: Self::add\r\n/// [`lookup`]: Self::lookup\r\npub struct SymbolTable<Name, Var> {\r\n    /// Stack of lexical scopes. Not all scopes are active; see [`cursor`].\r\n    ///\r\n    /// [`cursor`]: Self::cursor\r\n    scopes: Vec<Scope<Name, Var>>,\r\n    /// Limit of the [`scopes`] stack (exclusive). By using a separate value for\r\n    /// the stack length instead of `Vec`'s own internal length, the scopes can\r\n    /// be reused to cache memory allocations.\r\n    ///\r\n    /// [`scopes`]: Self::scopes\r\n    cursor: usize,\r\n}\r\n\r\nimpl<Name, Var> SymbolTable<Name, Var> {\r\n    /// Adds a new lexical scope.\r\n    ///\r\n    /// All variables declared after this point will be added to this scope\r\n    /// until another scope is pushed or [`pop_scope`] is called, causing this\r\n    /// scope to be removed along with all variables added to it.\r\n    ///\r\n    /// [`pop_scope`]: Self::pop_scope\r\n    pub fn push_scope(&mut self) {\r\n        // If the cursor is equal to the scope's stack length then we need to\r\n        // push another empty scope. Otherwise we can reuse the already existing\r\n        // scope.\r\n        if self.scopes.len() == self.cursor {\r\n            self.scopes.push(FastHashMap::default())\r\n        } else {\r\n            self.scopes[self.cursor].clear();\r\n        }\r\n\r\n        self.cursor += 1;\r\n    }\r\n\r\n    /// Removes the current lexical scope and all its variables\r\n    ///\r\n    /// # PANICS\r\n    /// - If the current lexical scope is the root scope\r\n    pub fn pop_scope(&mut self) {\r\n        // Despite the method title, the variables are only deleted when the\r\n        // scope is reused. This is because while a clear is inevitable if the\r\n        // scope needs to be reused, there are cases where the scope might be\r\n        // popped and not reused, i.e. if another scope with the same nesting\r\n        // level is never pushed again.\r\n        assert!(self.cursor != 1, \"Tried to pop the root scope\");\r\n\r\n        self.cursor -= 1;\r\n    }\r\n}\r\n\r\nimpl<Name, Var> SymbolTable<Name, Var>\r\nwhere\r\n    Name: std::hash::Hash + Eq,\r\n{\r\n    /// Perform a lookup for a variable named `name`.\r\n    ///\r\n    /// As stated in the struct level documentation the lookup will proceed from\r\n    /// the current scope to the root scope, returning `Some` when a variable is\r\n    /// found or `None` if there doesn't exist a variable with `name` in any\r\n    /// scope.\r\n    pub fn lookup<Q: ?Sized>(&self, name: &Q) -> Option<&Var>\r\n    where\r\n        Name: std::borrow::Borrow<Q>,\r\n        Q: std::hash::Hash + Eq,\r\n    {\r\n        // Iterate backwards trough the scopes and try to find the variable\r\n        for scope in self.scopes[..self.cursor].iter().rev() {\r\n            if let Some(var) = scope.get(name) {\r\n                return Some(var);\r\n            }\r\n        }\r\n\r\n        None\r\n    }\r\n\r\n    /// Adds a new variable to the current scope.\r\n    ///\r\n    /// Returns the previous variable with the same name in this scope if it\r\n    /// exists, so that the frontend might handle it in case variable shadowing\r\n    /// is disallowed.\r\n    pub fn add(&mut self, name: Name, var: Var) -> Option<Var> {\r\n        self.scopes[self.cursor - 1].insert(name, var)\r\n    }\r\n\r\n    /// Adds a new variable to the root scope.\r\n    ///\r\n    /// This is used in GLSL for builtins which aren't known in advance and only\r\n    /// when used for the first time, so there must be a way to add those\r\n    /// declarations to the root unconditionally from the current scope.\r\n    ///\r\n    /// Returns the previous variable with the same name in the root scope if it\r\n    /// exists, so that the frontend might handle it in case variable shadowing\r\n    /// is disallowed.\r\n    pub fn add_root(&mut self, name: Name, var: Var) -> Option<Var> {\r\n        self.scopes[0].insert(name, var)\r\n    }\r\n}\r\n\r\nimpl<Name, Var> Default for SymbolTable<Name, Var> {\r\n    /// Constructs a new symbol table with a root scope\r\n    fn default() -> Self {\r\n        Self {\r\n            scopes: vec![FastHashMap::default()],\r\n            cursor: 1,\r\n        }\r\n    }\r\n}\r\n\r\nuse std::fmt;\r\n\r\nimpl<Name: fmt::Debug, Var: fmt::Debug> fmt::Debug for SymbolTable<Name, Var> {\r\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\r\n        f.write_str(\"SymbolTable \")?;\r\n        f.debug_list()\r\n            .entries(self.scopes[..self.cursor].iter())\r\n            .finish()\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/spv/convert.rs",
    "content": "use super::error::Error;\r\nuse num_traits::cast::FromPrimitive;\r\nuse std::convert::TryInto;\r\n\r\npub(super) const fn map_binary_operator(word: spirv::Op) -> Result<crate::BinaryOperator, Error> {\r\n    use crate::BinaryOperator;\r\n    use spirv::Op;\r\n\r\n    match word {\r\n        // Arithmetic Instructions +, -, *, /, %\r\n        Op::IAdd | Op::FAdd => Ok(BinaryOperator::Add),\r\n        Op::ISub | Op::FSub => Ok(BinaryOperator::Subtract),\r\n        Op::IMul | Op::FMul => Ok(BinaryOperator::Multiply),\r\n        Op::UDiv | Op::SDiv | Op::FDiv => Ok(BinaryOperator::Divide),\r\n        Op::SRem => Ok(BinaryOperator::Modulo),\r\n        // Relational and Logical Instructions\r\n        Op::IEqual | Op::FOrdEqual | Op::FUnordEqual | Op::LogicalEqual => {\r\n            Ok(BinaryOperator::Equal)\r\n        }\r\n        Op::INotEqual | Op::FOrdNotEqual | Op::FUnordNotEqual | Op::LogicalNotEqual => {\r\n            Ok(BinaryOperator::NotEqual)\r\n        }\r\n        Op::ULessThan | Op::SLessThan | Op::FOrdLessThan | Op::FUnordLessThan => {\r\n            Ok(BinaryOperator::Less)\r\n        }\r\n        Op::ULessThanEqual\r\n        | Op::SLessThanEqual\r\n        | Op::FOrdLessThanEqual\r\n        | Op::FUnordLessThanEqual => Ok(BinaryOperator::LessEqual),\r\n        Op::UGreaterThan | Op::SGreaterThan | Op::FOrdGreaterThan | Op::FUnordGreaterThan => {\r\n            Ok(BinaryOperator::Greater)\r\n        }\r\n        Op::UGreaterThanEqual\r\n        | Op::SGreaterThanEqual\r\n        | Op::FOrdGreaterThanEqual\r\n        | Op::FUnordGreaterThanEqual => Ok(BinaryOperator::GreaterEqual),\r\n        Op::BitwiseOr => Ok(BinaryOperator::InclusiveOr),\r\n        Op::BitwiseXor => Ok(BinaryOperator::ExclusiveOr),\r\n        Op::BitwiseAnd => Ok(BinaryOperator::And),\r\n        _ => Err(Error::UnknownBinaryOperator(word)),\r\n    }\r\n}\r\n\r\npub(super) const fn map_relational_fun(\r\n    word: spirv::Op,\r\n) -> Result<crate::RelationalFunction, Error> {\r\n    use crate::RelationalFunction as Rf;\r\n    use spirv::Op;\r\n\r\n    match word {\r\n        Op::All => Ok(Rf::All),\r\n        Op::Any => Ok(Rf::Any),\r\n        Op::IsNan => Ok(Rf::IsNan),\r\n        Op::IsInf => Ok(Rf::IsInf),\r\n        Op::IsFinite => Ok(Rf::IsFinite),\r\n        Op::IsNormal => Ok(Rf::IsNormal),\r\n        _ => Err(Error::UnknownRelationalFunction(word)),\r\n    }\r\n}\r\n\r\npub(super) const fn map_vector_size(word: spirv::Word) -> Result<crate::VectorSize, Error> {\r\n    match word {\r\n        2 => Ok(crate::VectorSize::Bi),\r\n        3 => Ok(crate::VectorSize::Tri),\r\n        4 => Ok(crate::VectorSize::Quad),\r\n        _ => Err(Error::InvalidVectorSize(word)),\r\n    }\r\n}\r\n\r\npub(super) fn map_image_dim(word: spirv::Word) -> Result<crate::ImageDimension, Error> {\r\n    use spirv::Dim as D;\r\n    match D::from_u32(word) {\r\n        Some(D::Dim1D) => Ok(crate::ImageDimension::D1),\r\n        Some(D::Dim2D) => Ok(crate::ImageDimension::D2),\r\n        Some(D::Dim3D) => Ok(crate::ImageDimension::D3),\r\n        Some(D::DimCube) => Ok(crate::ImageDimension::Cube),\r\n        _ => Err(Error::UnsupportedImageDim(word)),\r\n    }\r\n}\r\n\r\npub(super) fn map_image_format(word: spirv::Word) -> Result<crate::StorageFormat, Error> {\r\n    match spirv::ImageFormat::from_u32(word) {\r\n        Some(spirv::ImageFormat::R8) => Ok(crate::StorageFormat::R8Unorm),\r\n        Some(spirv::ImageFormat::R8Snorm) => Ok(crate::StorageFormat::R8Snorm),\r\n        Some(spirv::ImageFormat::R8ui) => Ok(crate::StorageFormat::R8Uint),\r\n        Some(spirv::ImageFormat::R8i) => Ok(crate::StorageFormat::R8Sint),\r\n        Some(spirv::ImageFormat::R16ui) => Ok(crate::StorageFormat::R16Uint),\r\n        Some(spirv::ImageFormat::R16i) => Ok(crate::StorageFormat::R16Sint),\r\n        Some(spirv::ImageFormat::R16f) => Ok(crate::StorageFormat::R16Float),\r\n        Some(spirv::ImageFormat::Rg8) => Ok(crate::StorageFormat::Rg8Unorm),\r\n        Some(spirv::ImageFormat::Rg8Snorm) => Ok(crate::StorageFormat::Rg8Snorm),\r\n        Some(spirv::ImageFormat::Rg8ui) => Ok(crate::StorageFormat::Rg8Uint),\r\n        Some(spirv::ImageFormat::Rg8i) => Ok(crate::StorageFormat::Rg8Sint),\r\n        Some(spirv::ImageFormat::R32ui) => Ok(crate::StorageFormat::R32Uint),\r\n        Some(spirv::ImageFormat::R32i) => Ok(crate::StorageFormat::R32Sint),\r\n        Some(spirv::ImageFormat::R32f) => Ok(crate::StorageFormat::R32Float),\r\n        Some(spirv::ImageFormat::Rg16ui) => Ok(crate::StorageFormat::Rg16Uint),\r\n        Some(spirv::ImageFormat::Rg16i) => Ok(crate::StorageFormat::Rg16Sint),\r\n        Some(spirv::ImageFormat::Rg16f) => Ok(crate::StorageFormat::Rg16Float),\r\n        Some(spirv::ImageFormat::Rgba8) => Ok(crate::StorageFormat::Rgba8Unorm),\r\n        Some(spirv::ImageFormat::Rgba8Snorm) => Ok(crate::StorageFormat::Rgba8Snorm),\r\n        Some(spirv::ImageFormat::Rgba8ui) => Ok(crate::StorageFormat::Rgba8Uint),\r\n        Some(spirv::ImageFormat::Rgba8i) => Ok(crate::StorageFormat::Rgba8Sint),\r\n        Some(spirv::ImageFormat::Rgb10a2ui) => Ok(crate::StorageFormat::Rgb10a2Unorm),\r\n        Some(spirv::ImageFormat::R11fG11fB10f) => Ok(crate::StorageFormat::Rg11b10Float),\r\n        Some(spirv::ImageFormat::Rg32ui) => Ok(crate::StorageFormat::Rg32Uint),\r\n        Some(spirv::ImageFormat::Rg32i) => Ok(crate::StorageFormat::Rg32Sint),\r\n        Some(spirv::ImageFormat::Rg32f) => Ok(crate::StorageFormat::Rg32Float),\r\n        Some(spirv::ImageFormat::Rgba16ui) => Ok(crate::StorageFormat::Rgba16Uint),\r\n        Some(spirv::ImageFormat::Rgba16i) => Ok(crate::StorageFormat::Rgba16Sint),\r\n        Some(spirv::ImageFormat::Rgba16f) => Ok(crate::StorageFormat::Rgba16Float),\r\n        Some(spirv::ImageFormat::Rgba32ui) => Ok(crate::StorageFormat::Rgba32Uint),\r\n        Some(spirv::ImageFormat::Rgba32i) => Ok(crate::StorageFormat::Rgba32Sint),\r\n        Some(spirv::ImageFormat::Rgba32f) => Ok(crate::StorageFormat::Rgba32Float),\r\n        _ => Err(Error::UnsupportedImageFormat(word)),\r\n    }\r\n}\r\n\r\npub(super) fn map_width(word: spirv::Word) -> Result<crate::Bytes, Error> {\r\n    (word >> 3) // bits to bytes\r\n        .try_into()\r\n        .map_err(|_| Error::InvalidTypeWidth(word))\r\n}\r\n\r\npub(super) fn map_builtin(word: spirv::Word, invariant: bool) -> Result<crate::BuiltIn, Error> {\r\n    use spirv::BuiltIn as Bi;\r\n    Ok(match spirv::BuiltIn::from_u32(word) {\r\n        Some(Bi::Position | Bi::FragCoord) => crate::BuiltIn::Position { invariant },\r\n        Some(Bi::ViewIndex) => crate::BuiltIn::ViewIndex,\r\n        // vertex\r\n        Some(Bi::BaseInstance) => crate::BuiltIn::BaseInstance,\r\n        Some(Bi::BaseVertex) => crate::BuiltIn::BaseVertex,\r\n        Some(Bi::ClipDistance) => crate::BuiltIn::ClipDistance,\r\n        Some(Bi::CullDistance) => crate::BuiltIn::CullDistance,\r\n        Some(Bi::InstanceIndex) => crate::BuiltIn::InstanceIndex,\r\n        Some(Bi::PointSize) => crate::BuiltIn::PointSize,\r\n        Some(Bi::VertexIndex) => crate::BuiltIn::VertexIndex,\r\n        // fragment\r\n        Some(Bi::FragDepth) => crate::BuiltIn::FragDepth,\r\n        Some(Bi::FrontFacing) => crate::BuiltIn::FrontFacing,\r\n        Some(Bi::PrimitiveId) => crate::BuiltIn::PrimitiveIndex,\r\n        Some(Bi::SampleId) => crate::BuiltIn::SampleIndex,\r\n        Some(Bi::SampleMask) => crate::BuiltIn::SampleMask,\r\n        // compute\r\n        Some(Bi::GlobalInvocationId) => crate::BuiltIn::GlobalInvocationId,\r\n        Some(Bi::LocalInvocationId) => crate::BuiltIn::LocalInvocationId,\r\n        Some(Bi::LocalInvocationIndex) => crate::BuiltIn::LocalInvocationIndex,\r\n        Some(Bi::WorkgroupId) => crate::BuiltIn::WorkGroupId,\r\n        Some(Bi::WorkgroupSize) => crate::BuiltIn::WorkGroupSize,\r\n        Some(Bi::NumWorkgroups) => crate::BuiltIn::NumWorkGroups,\r\n        _ => return Err(Error::UnsupportedBuiltIn(word)),\r\n    })\r\n}\r\n\r\npub(super) fn map_storage_class(word: spirv::Word) -> Result<super::ExtendedClass, Error> {\r\n    use super::ExtendedClass as Ec;\r\n    use spirv::StorageClass as Sc;\r\n    Ok(match Sc::from_u32(word) {\r\n        Some(Sc::Function) => Ec::Global(crate::AddressSpace::Function),\r\n        Some(Sc::Input) => Ec::Input,\r\n        Some(Sc::Output) => Ec::Output,\r\n        Some(Sc::Private) => Ec::Global(crate::AddressSpace::Private),\r\n        Some(Sc::UniformConstant) => Ec::Global(crate::AddressSpace::Handle),\r\n        Some(Sc::StorageBuffer) => Ec::Global(crate::AddressSpace::Storage {\r\n            //Note: this is restricted by decorations later\r\n            access: crate::StorageAccess::all(),\r\n        }),\r\n        // we expect the `Storage` case to be filtered out before calling this function.\r\n        Some(Sc::Uniform) => Ec::Global(crate::AddressSpace::Uniform),\r\n        Some(Sc::Workgroup) => Ec::Global(crate::AddressSpace::WorkGroup),\r\n        Some(Sc::PushConstant) => Ec::Global(crate::AddressSpace::PushConstant),\r\n        _ => return Err(Error::UnsupportedStorageClass(word)),\r\n    })\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/spv/error.rs",
    "content": "use super::ModuleState;\r\nuse crate::arena::Handle;\r\n\r\n#[derive(Debug, thiserror::Error)]\r\npub enum Error {\r\n    #[error(\"invalid header\")]\r\n    InvalidHeader,\r\n    #[error(\"invalid word count\")]\r\n    InvalidWordCount,\r\n    #[error(\"unknown instruction {0}\")]\r\n    UnknownInstruction(u16),\r\n    #[error(\"unknown capability %{0}\")]\r\n    UnknownCapability(spirv::Word),\r\n    #[error(\"unsupported instruction {1:?} at {0:?}\")]\r\n    UnsupportedInstruction(ModuleState, spirv::Op),\r\n    #[error(\"unsupported capability {0:?}\")]\r\n    UnsupportedCapability(spirv::Capability),\r\n    #[error(\"unsupported extension {0}\")]\r\n    UnsupportedExtension(String),\r\n    #[error(\"unsupported extension set {0}\")]\r\n    UnsupportedExtSet(String),\r\n    #[error(\"unsupported extension instantiation set %{0}\")]\r\n    UnsupportedExtInstSet(spirv::Word),\r\n    #[error(\"unsupported extension instantiation %{0}\")]\r\n    UnsupportedExtInst(spirv::Word),\r\n    #[error(\"unsupported type {0:?}\")]\r\n    UnsupportedType(Handle<crate::Type>),\r\n    #[error(\"unsupported execution model %{0}\")]\r\n    UnsupportedExecutionModel(spirv::Word),\r\n    #[error(\"unsupported execution mode %{0}\")]\r\n    UnsupportedExecutionMode(spirv::Word),\r\n    #[error(\"unsupported storage class %{0}\")]\r\n    UnsupportedStorageClass(spirv::Word),\r\n    #[error(\"unsupported image dimension %{0}\")]\r\n    UnsupportedImageDim(spirv::Word),\r\n    #[error(\"unsupported image format %{0}\")]\r\n    UnsupportedImageFormat(spirv::Word),\r\n    #[error(\"unsupported builtin %{0}\")]\r\n    UnsupportedBuiltIn(spirv::Word),\r\n    #[error(\"unsupported control flow %{0}\")]\r\n    UnsupportedControlFlow(spirv::Word),\r\n    #[error(\"unsupported binary operator %{0}\")]\r\n    UnsupportedBinaryOperator(spirv::Word),\r\n    #[error(\"Naga supports OpTypeRuntimeArray in the StorageBuffer storage class only\")]\r\n    UnsupportedRuntimeArrayStorageClass,\r\n    #[error(\"unsupported matrix stride {stride} for a {columns}x{rows} matrix with scalar width={width}\")]\r\n    UnsupportedMatrixStride {\r\n        stride: u32,\r\n        columns: u8,\r\n        rows: u8,\r\n        width: u8,\r\n    },\r\n    #[error(\"unknown binary operator {0:?}\")]\r\n    UnknownBinaryOperator(spirv::Op),\r\n    #[error(\"unknown relational function {0:?}\")]\r\n    UnknownRelationalFunction(spirv::Op),\r\n    #[error(\"invalid parameter {0:?}\")]\r\n    InvalidParameter(spirv::Op),\r\n    #[error(\"invalid operand count {1} for {0:?}\")]\r\n    InvalidOperandCount(spirv::Op, u16),\r\n    #[error(\"invalid operand\")]\r\n    InvalidOperand,\r\n    #[error(\"invalid id %{0}\")]\r\n    InvalidId(spirv::Word),\r\n    #[error(\"invalid decoration %{0}\")]\r\n    InvalidDecoration(spirv::Word),\r\n    #[error(\"invalid type width %{0}\")]\r\n    InvalidTypeWidth(spirv::Word),\r\n    #[error(\"invalid sign %{0}\")]\r\n    InvalidSign(spirv::Word),\r\n    #[error(\"invalid inner type %{0}\")]\r\n    InvalidInnerType(spirv::Word),\r\n    #[error(\"invalid vector size %{0}\")]\r\n    InvalidVectorSize(spirv::Word),\r\n    #[error(\"invalid access type %{0}\")]\r\n    InvalidAccessType(spirv::Word),\r\n    #[error(\"invalid access {0:?}\")]\r\n    InvalidAccess(crate::Expression),\r\n    #[error(\"invalid access index %{0}\")]\r\n    InvalidAccessIndex(spirv::Word),\r\n    #[error(\"invalid binding %{0}\")]\r\n    InvalidBinding(spirv::Word),\r\n    #[error(\"invalid global var {0:?}\")]\r\n    InvalidGlobalVar(crate::Expression),\r\n    #[error(\"invalid image/sampler expression {0:?}\")]\r\n    InvalidImageExpression(crate::Expression),\r\n    #[error(\"invalid image base type {0:?}\")]\r\n    InvalidImageBaseType(Handle<crate::Type>),\r\n    #[error(\"invalid image {0:?}\")]\r\n    InvalidImage(Handle<crate::Type>),\r\n    #[error(\"invalid as type {0:?}\")]\r\n    InvalidAsType(Handle<crate::Type>),\r\n    #[error(\"invalid vector type {0:?}\")]\r\n    InvalidVectorType(Handle<crate::Type>),\r\n    #[error(\"inconsistent comparison sampling {0:?}\")]\r\n    InconsistentComparisonSampling(Handle<crate::GlobalVariable>),\r\n    #[error(\"wrong function result type %{0}\")]\r\n    WrongFunctionResultType(spirv::Word),\r\n    #[error(\"wrong function argument type %{0}\")]\r\n    WrongFunctionArgumentType(spirv::Word),\r\n    #[error(\"missing decoration {0:?}\")]\r\n    MissingDecoration(spirv::Decoration),\r\n    #[error(\"bad string\")]\r\n    BadString,\r\n    #[error(\"incomplete data\")]\r\n    IncompleteData,\r\n    #[error(\"invalid terminator\")]\r\n    InvalidTerminator,\r\n    #[error(\"invalid edge classification\")]\r\n    InvalidEdgeClassification,\r\n    #[error(\"cycle detected in the CFG during traversal at {0}\")]\r\n    ControlFlowGraphCycle(crate::front::spv::BlockId),\r\n    #[error(\"recursive function call %{0}\")]\r\n    FunctionCallCycle(spirv::Word),\r\n    #[error(\"invalid array size {0:?}\")]\r\n    InvalidArraySize(Handle<crate::Constant>),\r\n    #[error(\"invalid barrier scope %{0}\")]\r\n    InvalidBarrierScope(spirv::Word),\r\n    #[error(\"invalid barrier memory semantics %{0}\")]\r\n    InvalidBarrierMemorySemantics(spirv::Word),\r\n    // incomplete implementation errors\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/spv/function.rs",
    "content": "use crate::{\r\n    arena::{Arena, Handle},\r\n    front::spv::{BlockContext, BodyIndex},\r\n};\r\n\r\nuse super::{Error, Instruction, LookupExpression, LookupHelper as _};\r\nuse crate::front::Emitter;\r\n\r\npub type BlockId = u32;\r\n\r\n#[derive(Copy, Clone, Debug)]\r\npub struct MergeInstruction {\r\n    pub merge_block_id: BlockId,\r\n    pub continue_block_id: Option<BlockId>,\r\n}\r\n\r\nimpl<I: Iterator<Item = u32>> super::Parser<I> {\r\n    // Registers a function call. It will generate a dummy handle to call, which\r\n    // gets resolved after all the functions are processed.\r\n    pub(super) fn add_call(\r\n        &mut self,\r\n        from: spirv::Word,\r\n        to: spirv::Word,\r\n    ) -> Handle<crate::Function> {\r\n        let dummy_handle = self\r\n            .dummy_functions\r\n            .append(crate::Function::default(), Default::default());\r\n        self.deferred_function_calls.push(to);\r\n        self.function_call_graph.add_edge(from, to, ());\r\n        dummy_handle\r\n    }\r\n\r\n    pub(super) fn parse_function(&mut self, module: &mut crate::Module) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.lookup_expression.clear();\r\n        self.lookup_load_override.clear();\r\n        self.lookup_sampled_image.clear();\r\n\r\n        let result_type_id = self.next()?;\r\n        let fun_id = self.next()?;\r\n        let _fun_control = self.next()?;\r\n        let fun_type_id = self.next()?;\r\n\r\n        let mut fun = {\r\n            let ft = self.lookup_function_type.lookup(fun_type_id)?;\r\n            if ft.return_type_id != result_type_id {\r\n                return Err(Error::WrongFunctionResultType(result_type_id));\r\n            }\r\n            crate::Function {\r\n                name: self.future_decor.remove(&fun_id).and_then(|dec| dec.name),\r\n                arguments: Vec::with_capacity(ft.parameter_type_ids.len()),\r\n                result: if self.lookup_void_type == Some(result_type_id) {\r\n                    None\r\n                } else {\r\n                    let lookup_result_ty = self.lookup_type.lookup(result_type_id)?;\r\n                    Some(crate::FunctionResult {\r\n                        ty: lookup_result_ty.handle,\r\n                        binding: None,\r\n                    })\r\n                },\r\n                local_variables: Arena::new(),\r\n                expressions: self\r\n                    .make_expression_storage(&module.global_variables, &module.constants),\r\n                named_expressions: crate::FastHashMap::default(),\r\n                body: crate::Block::new(),\r\n            }\r\n        };\r\n\r\n        // read parameters\r\n        for i in 0..fun.arguments.capacity() {\r\n            let start = self.data_offset;\r\n            match self.next_inst()? {\r\n                Instruction {\r\n                    op: spirv::Op::FunctionParameter,\r\n                    wc: 3,\r\n                } => {\r\n                    let type_id = self.next()?;\r\n                    let id = self.next()?;\r\n                    let handle = fun.expressions.append(\r\n                        crate::Expression::FunctionArgument(i as u32),\r\n                        self.span_from(start),\r\n                    );\r\n                    self.lookup_expression.insert(\r\n                        id,\r\n                        LookupExpression {\r\n                            handle,\r\n                            type_id,\r\n                            // Setting this to an invalid id will cause get_expr_handle\r\n                            // to default to the main body making sure no load/stores\r\n                            // are added.\r\n                            block_id: 0,\r\n                        },\r\n                    );\r\n                    //Note: we redo the lookup in order to work around `self` borrowing\r\n\r\n                    if type_id\r\n                        != self\r\n                            .lookup_function_type\r\n                            .lookup(fun_type_id)?\r\n                            .parameter_type_ids[i]\r\n                    {\r\n                        return Err(Error::WrongFunctionArgumentType(type_id));\r\n                    }\r\n                    let ty = self.lookup_type.lookup(type_id)?.handle;\r\n                    let decor = self.future_decor.remove(&id).unwrap_or_default();\r\n                    fun.arguments.push(crate::FunctionArgument {\r\n                        name: decor.name,\r\n                        ty,\r\n                        binding: None,\r\n                    });\r\n                }\r\n                Instruction { op, .. } => return Err(Error::InvalidParameter(op)),\r\n            }\r\n        }\r\n\r\n        // Read body\r\n        self.function_call_graph.add_node(fun_id);\r\n        let mut parameters_sampling =\r\n            vec![super::image::SamplingFlags::empty(); fun.arguments.len()];\r\n\r\n        let mut block_ctx = BlockContext {\r\n            phis: Default::default(),\r\n            blocks: Default::default(),\r\n            body_for_label: Default::default(),\r\n            mergers: Default::default(),\r\n            bodies: Default::default(),\r\n            function_id: fun_id,\r\n            expressions: &mut fun.expressions,\r\n            local_arena: &mut fun.local_variables,\r\n            const_arena: &mut module.constants,\r\n            type_arena: &module.types,\r\n            global_arena: &module.global_variables,\r\n            arguments: &fun.arguments,\r\n            parameter_sampling: &mut parameters_sampling,\r\n        };\r\n        // Insert the main body whose parent is also himself\r\n        block_ctx.bodies.push(super::Body::with_parent(0));\r\n\r\n        // Scan the blocks and add them as nodes\r\n        loop {\r\n            let fun_inst = self.next_inst()?;\r\n            log::debug!(\"{:?}\", fun_inst.op);\r\n            match fun_inst.op {\r\n                spirv::Op::Line => {\r\n                    fun_inst.expect(4)?;\r\n                    let _file_id = self.next()?;\r\n                    let _row_id = self.next()?;\r\n                    let _col_id = self.next()?;\r\n                }\r\n                spirv::Op::Label => {\r\n                    // Read the label ID\r\n                    fun_inst.expect(2)?;\r\n                    let block_id = self.next()?;\r\n\r\n                    self.next_block(block_id, &mut block_ctx)?;\r\n                }\r\n                spirv::Op::FunctionEnd => {\r\n                    fun_inst.expect(1)?;\r\n                    break;\r\n                }\r\n                _ => {\r\n                    return Err(Error::UnsupportedInstruction(self.state, fun_inst.op));\r\n                }\r\n            }\r\n        }\r\n\r\n        if let Some(ref prefix) = self.options.block_ctx_dump_prefix {\r\n            let dump_suffix = match self.lookup_entry_point.get(&fun_id) {\r\n                Some(ep) => format!(\"block_ctx.{:?}-{}.txt\", ep.stage, ep.name),\r\n                None => format!(\"block_ctx.Fun-{}.txt\", module.functions.len()),\r\n            };\r\n            let dest = prefix.join(dump_suffix);\r\n            let dump = format!(\"{:#?}\", block_ctx);\r\n            if let Err(e) = std::fs::write(&dest, dump) {\r\n                log::error!(\"Unable to dump the block context into {:?}: {}\", dest, e);\r\n            }\r\n        }\r\n\r\n        // Emit `Store` statements to properly initialize all the local variables we\r\n        // created for `phi` expressions.\r\n        //\r\n        // Note that get_expr_handle also contributes slightly odd entries to this table,\r\n        // to get the spill.\r\n        for phi in block_ctx.phis.iter() {\r\n            // Get a pointer to the local variable for the phi's value.\r\n            let phi_pointer = block_ctx.expressions.append(\r\n                crate::Expression::LocalVariable(phi.local),\r\n                crate::Span::default(),\r\n            );\r\n\r\n            // At the end of each of `phi`'s predecessor blocks, store the corresponding\r\n            // source value in the phi's local variable.\r\n            for &(source, predecessor) in phi.expressions.iter() {\r\n                let source_lexp = &self.lookup_expression[&source];\r\n                let predecessor_body_idx = block_ctx.body_for_label[&predecessor];\r\n                // If the expression is a global/argument it will have a 0 block\r\n                // id so we must use a default value instead of panicking\r\n                let source_body_idx = block_ctx\r\n                    .body_for_label\r\n                    .get(&source_lexp.block_id)\r\n                    .copied()\r\n                    .unwrap_or(0);\r\n\r\n                // If the Naga `Expression` generated for `source` is in scope, then we\r\n                // can simply store that in the phi's local variable.\r\n                //\r\n                // Otherwise, spill the source value to a local variable in the block that\r\n                // defines it. (We know this store dominates the predecessor; otherwise,\r\n                // the phi wouldn't have been able to refer to that source expression in\r\n                // the first place.) Then, the predecessor block can count on finding the\r\n                // source's value in that local variable.\r\n                let value = if super::is_parent(predecessor_body_idx, source_body_idx, &block_ctx) {\r\n                    source_lexp.handle\r\n                } else {\r\n                    // The source SPIR-V expression is not defined in the phi's\r\n                    // predecessor block, nor is it a globally available expression. So it\r\n                    // must be defined off in some other block that merely dominates the\r\n                    // predecessor. This means that the corresponding Naga `Expression`\r\n                    // may not be in scope in the predecessor block.\r\n                    //\r\n                    // In the block that defines `source`, spill it to a fresh local\r\n                    // variable, to ensure we can still use it at the end of the\r\n                    // predecessor.\r\n                    let ty = self.lookup_type[&source_lexp.type_id].handle;\r\n                    let local = block_ctx.local_arena.append(\r\n                        crate::LocalVariable {\r\n                            name: None,\r\n                            ty,\r\n                            init: None,\r\n                        },\r\n                        crate::Span::default(),\r\n                    );\r\n\r\n                    let pointer = block_ctx.expressions.append(\r\n                        crate::Expression::LocalVariable(local),\r\n                        crate::Span::default(),\r\n                    );\r\n\r\n                    // Get the spilled value of the source expression.\r\n                    let start = block_ctx.expressions.len();\r\n                    let expr = block_ctx\r\n                        .expressions\r\n                        .append(crate::Expression::Load { pointer }, crate::Span::default());\r\n                    let range = block_ctx.expressions.range_from(start);\r\n\r\n                    block_ctx\r\n                        .blocks\r\n                        .get_mut(&predecessor)\r\n                        .unwrap()\r\n                        .push(crate::Statement::Emit(range), crate::Span::default());\r\n\r\n                    // At the end of the block that defines it, spill the source\r\n                    // expression's value.\r\n                    block_ctx\r\n                        .blocks\r\n                        .get_mut(&source_lexp.block_id)\r\n                        .unwrap()\r\n                        .push(\r\n                            crate::Statement::Store {\r\n                                pointer,\r\n                                value: source_lexp.handle,\r\n                            },\r\n                            crate::Span::default(),\r\n                        );\r\n\r\n                    expr\r\n                };\r\n\r\n                // At the end of the phi predecessor block, store the source\r\n                // value in the phi's value.\r\n                block_ctx.blocks.get_mut(&predecessor).unwrap().push(\r\n                    crate::Statement::Store {\r\n                        pointer: phi_pointer,\r\n                        value,\r\n                    },\r\n                    crate::Span::default(),\r\n                )\r\n            }\r\n        }\r\n\r\n        fun.body = block_ctx.lower();\r\n\r\n        // done\r\n        let fun_handle = module.functions.append(fun, self.span_from_with_op(start));\r\n        self.lookup_function.insert(\r\n            fun_id,\r\n            super::LookupFunction {\r\n                handle: fun_handle,\r\n                parameters_sampling,\r\n            },\r\n        );\r\n\r\n        if let Some(ep) = self.lookup_entry_point.remove(&fun_id) {\r\n            // create a wrapping function\r\n            let mut function = crate::Function {\r\n                name: Some(format!(\"{}_wrap\", ep.name)),\r\n                arguments: Vec::new(),\r\n                result: None,\r\n                local_variables: Arena::new(),\r\n                expressions: Arena::new(),\r\n                named_expressions: crate::FastHashMap::default(),\r\n                body: crate::Block::new(),\r\n            };\r\n\r\n            // 1. copy the inputs from arguments to privates\r\n            for &v_id in ep.variable_ids.iter() {\r\n                let lvar = self.lookup_variable.lookup(v_id)?;\r\n                if let super::Variable::Input(ref arg) = lvar.inner {\r\n                    let span = module.global_variables.get_span(lvar.handle);\r\n                    let arg_expr = function.expressions.append(\r\n                        crate::Expression::FunctionArgument(function.arguments.len() as u32),\r\n                        span,\r\n                    );\r\n                    let load_expr = if arg.ty == module.global_variables[lvar.handle].ty {\r\n                        arg_expr\r\n                    } else {\r\n                        // The only case where the type is different is if we need to treat\r\n                        // unsigned integer as signed.\r\n                        let mut emitter = Emitter::default();\r\n                        emitter.start(&function.expressions);\r\n                        let handle = function.expressions.append(\r\n                            crate::Expression::As {\r\n                                expr: arg_expr,\r\n                                kind: crate::ScalarKind::Sint,\r\n                                convert: Some(4),\r\n                            },\r\n                            span,\r\n                        );\r\n                        function.body.extend(emitter.finish(&function.expressions));\r\n                        handle\r\n                    };\r\n                    function.body.push(\r\n                        crate::Statement::Store {\r\n                            pointer: function\r\n                                .expressions\r\n                                .append(crate::Expression::GlobalVariable(lvar.handle), span),\r\n                            value: load_expr,\r\n                        },\r\n                        span,\r\n                    );\r\n\r\n                    let mut arg = arg.clone();\r\n                    if ep.stage == crate::ShaderStage::Fragment {\r\n                        if let Some(ref mut binding) = arg.binding {\r\n                            binding.apply_default_interpolation(&module.types[arg.ty].inner);\r\n                        }\r\n                    }\r\n                    function.arguments.push(arg);\r\n                }\r\n            }\r\n            // 2. call the wrapped function\r\n            let fake_id = !(module.entry_points.len() as u32); // doesn't matter, as long as it's not a collision\r\n            let dummy_handle = self.add_call(fake_id, fun_id);\r\n            function.body.push(\r\n                crate::Statement::Call {\r\n                    function: dummy_handle,\r\n                    arguments: Vec::new(),\r\n                    result: None,\r\n                },\r\n                crate::Span::default(),\r\n            );\r\n\r\n            // 3. copy the outputs from privates to the result\r\n            let mut members = Vec::new();\r\n            let mut components = Vec::new();\r\n            for &v_id in ep.variable_ids.iter() {\r\n                let lvar = self.lookup_variable.lookup(v_id)?;\r\n                if let super::Variable::Output(ref result) = lvar.inner {\r\n                    let span = module.global_variables.get_span(lvar.handle);\r\n                    let expr_handle = function\r\n                        .expressions\r\n                        .append(crate::Expression::GlobalVariable(lvar.handle), span);\r\n                    match module.types[result.ty].inner {\r\n                        crate::TypeInner::Struct {\r\n                            members: ref sub_members,\r\n                            ..\r\n                        } => {\r\n                            for (index, sm) in sub_members.iter().enumerate() {\r\n                                match sm.binding {\r\n                                    Some(crate::Binding::BuiltIn(built_in)) => {\r\n                                        // Cull unused builtins to preserve performances\r\n                                        if !self.builtin_usage.contains(&built_in) {\r\n                                            continue;\r\n                                        }\r\n                                    }\r\n                                    // unrecognized binding, skip\r\n                                    None => continue,\r\n                                    _ => {}\r\n                                }\r\n                                members.push(sm.clone());\r\n                                components.push(function.expressions.append(\r\n                                    crate::Expression::AccessIndex {\r\n                                        base: expr_handle,\r\n                                        index: index as u32,\r\n                                    },\r\n                                    span,\r\n                                ));\r\n                            }\r\n                        }\r\n                        _ => {\r\n                            members.push(crate::StructMember {\r\n                                name: None,\r\n                                ty: result.ty,\r\n                                binding: result.binding.clone(),\r\n                                offset: 0,\r\n                            });\r\n                            // populate just the globals first, then do `Load` in a\r\n                            // separate step, so that we can get a range.\r\n                            components.push(expr_handle);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (member_index, member) in members.iter().enumerate() {\r\n                match member.binding {\r\n                    Some(crate::Binding::BuiltIn(crate::BuiltIn::Position { .. }))\r\n                        if self.options.adjust_coordinate_space =>\r\n                    {\r\n                        let mut emitter = Emitter::default();\r\n                        emitter.start(&function.expressions);\r\n                        let global_expr = components[member_index];\r\n                        let span = function.expressions.get_span(global_expr);\r\n                        let access_expr = function.expressions.append(\r\n                            crate::Expression::AccessIndex {\r\n                                base: global_expr,\r\n                                index: 1,\r\n                            },\r\n                            span,\r\n                        );\r\n                        let load_expr = function.expressions.append(\r\n                            crate::Expression::Load {\r\n                                pointer: access_expr,\r\n                            },\r\n                            span,\r\n                        );\r\n                        let neg_expr = function.expressions.append(\r\n                            crate::Expression::Unary {\r\n                                op: crate::UnaryOperator::Negate,\r\n                                expr: load_expr,\r\n                            },\r\n                            span,\r\n                        );\r\n                        function.body.extend(emitter.finish(&function.expressions));\r\n                        function.body.push(\r\n                            crate::Statement::Store {\r\n                                pointer: access_expr,\r\n                                value: neg_expr,\r\n                            },\r\n                            span,\r\n                        );\r\n                    }\r\n                    _ => {}\r\n                }\r\n            }\r\n\r\n            let mut emitter = Emitter::default();\r\n            emitter.start(&function.expressions);\r\n            for component in components.iter_mut() {\r\n                let load_expr = crate::Expression::Load {\r\n                    pointer: *component,\r\n                };\r\n                let span = function.expressions.get_span(*component);\r\n                *component = function.expressions.append(load_expr, span);\r\n            }\r\n\r\n            match members[..] {\r\n                [] => {}\r\n                [ref member] => {\r\n                    function.body.extend(emitter.finish(&function.expressions));\r\n                    let span = function.expressions.get_span(components[0]);\r\n                    function.body.push(\r\n                        crate::Statement::Return {\r\n                            value: components.first().cloned(),\r\n                        },\r\n                        span,\r\n                    );\r\n                    function.result = Some(crate::FunctionResult {\r\n                        ty: member.ty,\r\n                        binding: member.binding.clone(),\r\n                    });\r\n                }\r\n                _ => {\r\n                    let span = crate::Span::total_span(\r\n                        components.iter().map(|h| function.expressions.get_span(*h)),\r\n                    );\r\n                    let ty = module.types.insert(\r\n                        crate::Type {\r\n                            name: None,\r\n                            inner: crate::TypeInner::Struct {\r\n                                members,\r\n                                span: 0xFFFF, // shouldn't matter\r\n                            },\r\n                        },\r\n                        span,\r\n                    );\r\n                    let result_expr = function\r\n                        .expressions\r\n                        .append(crate::Expression::Compose { ty, components }, span);\r\n                    function.body.extend(emitter.finish(&function.expressions));\r\n                    function.body.push(\r\n                        crate::Statement::Return {\r\n                            value: Some(result_expr),\r\n                        },\r\n                        span,\r\n                    );\r\n                    function.result = Some(crate::FunctionResult { ty, binding: None });\r\n                }\r\n            }\r\n\r\n            module.entry_points.push(crate::EntryPoint {\r\n                name: ep.name,\r\n                stage: ep.stage,\r\n                early_depth_test: ep.early_depth_test,\r\n                workgroup_size: ep.workgroup_size,\r\n                function,\r\n            });\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n}\r\n\r\nimpl<'function> BlockContext<'function> {\r\n    /// Consumes the `BlockContext` producing a Ir [`Block`](crate::Block)\r\n    fn lower(mut self) -> crate::Block {\r\n        fn lower_impl(\r\n            blocks: &mut crate::FastHashMap<spirv::Word, crate::Block>,\r\n            bodies: &[super::Body],\r\n            body_idx: BodyIndex,\r\n        ) -> crate::Block {\r\n            let mut block = crate::Block::new();\r\n\r\n            for item in bodies[body_idx].data.iter() {\r\n                match *item {\r\n                    super::BodyFragment::BlockId(id) => block.append(blocks.get_mut(&id).unwrap()),\r\n                    super::BodyFragment::If {\r\n                        condition,\r\n                        accept,\r\n                        reject,\r\n                    } => {\r\n                        let accept = lower_impl(blocks, bodies, accept);\r\n                        let reject = lower_impl(blocks, bodies, reject);\r\n\r\n                        block.push(\r\n                            crate::Statement::If {\r\n                                condition,\r\n                                accept,\r\n                                reject,\r\n                            },\r\n                            crate::Span::default(),\r\n                        )\r\n                    }\r\n                    super::BodyFragment::Loop { body, continuing } => {\r\n                        let body = lower_impl(blocks, bodies, body);\r\n                        let continuing = lower_impl(blocks, bodies, continuing);\r\n\r\n                        block.push(\r\n                            crate::Statement::Loop {\r\n                                body,\r\n                                continuing,\r\n                                break_if: None,\r\n                            },\r\n                            crate::Span::default(),\r\n                        )\r\n                    }\r\n                    super::BodyFragment::Switch {\r\n                        selector,\r\n                        ref cases,\r\n                        default,\r\n                    } => {\r\n                        let mut ir_cases: Vec<_> = cases\r\n                            .iter()\r\n                            .map(|&(value, body_idx)| {\r\n                                let body = lower_impl(blocks, bodies, body_idx);\r\n\r\n                                // Handle simple cases that would make a fallthrough statement unreachable code\r\n                                let fall_through = body.last().map_or(true, |s| !s.is_terminator());\r\n\r\n                                crate::SwitchCase {\r\n                                    value: crate::SwitchValue::Integer(value),\r\n                                    body,\r\n                                    fall_through,\r\n                                }\r\n                            })\r\n                            .collect();\r\n                        ir_cases.push(crate::SwitchCase {\r\n                            value: crate::SwitchValue::Default,\r\n                            body: lower_impl(blocks, bodies, default),\r\n                            fall_through: false,\r\n                        });\r\n\r\n                        block.push(\r\n                            crate::Statement::Switch {\r\n                                selector,\r\n                                cases: ir_cases,\r\n                            },\r\n                            crate::Span::default(),\r\n                        )\r\n                    }\r\n                    super::BodyFragment::Break => {\r\n                        block.push(crate::Statement::Break, crate::Span::default())\r\n                    }\r\n                    super::BodyFragment::Continue => {\r\n                        block.push(crate::Statement::Continue, crate::Span::default())\r\n                    }\r\n                }\r\n            }\r\n\r\n            block\r\n        }\r\n\r\n        lower_impl(&mut self.blocks, &self.bodies, 0)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/spv/image.rs",
    "content": "use crate::arena::{Arena, Handle, UniqueArena};\r\n\r\nuse super::{Error, LookupExpression, LookupHelper as _};\r\n\r\n#[derive(Clone, Debug)]\r\npub(super) struct LookupSampledImage {\r\n    image: Handle<crate::Expression>,\r\n    sampler: Handle<crate::Expression>,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Flags describing sampling method.\r\n    pub struct SamplingFlags: u32 {\r\n        /// Regular sampling.\r\n        const REGULAR = 0x1;\r\n        /// Comparison sampling.\r\n        const COMPARISON = 0x2;\r\n    }\r\n}\r\n\r\nimpl<'function> super::BlockContext<'function> {\r\n    fn get_image_expr_ty(\r\n        &self,\r\n        handle: Handle<crate::Expression>,\r\n    ) -> Result<Handle<crate::Type>, Error> {\r\n        match self.expressions[handle] {\r\n            crate::Expression::GlobalVariable(handle) => Ok(self.global_arena[handle].ty),\r\n            crate::Expression::FunctionArgument(i) => Ok(self.arguments[i as usize].ty),\r\n            ref other => Err(Error::InvalidImageExpression(other.clone())),\r\n        }\r\n    }\r\n}\r\n\r\n/// Options of a sampling operation.\r\n#[derive(Debug)]\r\npub struct SamplingOptions {\r\n    /// Projection sampling: the division by W is expected to happen\r\n    /// in the texture unit.\r\n    pub project: bool,\r\n    /// Depth comparison sampling with a reference value.\r\n    pub compare: bool,\r\n}\r\n\r\nenum ExtraCoordinate {\r\n    ArrayLayer,\r\n    Projection,\r\n    Garbage,\r\n}\r\n\r\n/// Return the texture coordinates separated from the array layer,\r\n/// and/or divided by the projection term.\r\n///\r\n/// The Proj sampling ops expect an extra coordinate for the W.\r\n/// The arrayed (can't be Proj!) images expect an extra coordinate for the layer.\r\nfn extract_image_coordinates(\r\n    image_dim: crate::ImageDimension,\r\n    extra_coordinate: ExtraCoordinate,\r\n    base: Handle<crate::Expression>,\r\n    coordinate_ty: Handle<crate::Type>,\r\n    ctx: &mut super::BlockContext,\r\n) -> (Handle<crate::Expression>, Option<Handle<crate::Expression>>) {\r\n    let (given_size, kind) = match ctx.type_arena[coordinate_ty].inner {\r\n        crate::TypeInner::Scalar { kind, .. } => (None, kind),\r\n        crate::TypeInner::Vector { size, kind, .. } => (Some(size), kind),\r\n        ref other => unreachable!(\"Unexpected texture coordinate {:?}\", other),\r\n    };\r\n\r\n    let required_size = image_dim.required_coordinate_size();\r\n    let required_ty = required_size.map(|size| {\r\n        ctx.type_arena\r\n            .get(&crate::Type {\r\n                name: None,\r\n                inner: crate::TypeInner::Vector {\r\n                    size,\r\n                    kind,\r\n                    width: 4,\r\n                },\r\n            })\r\n            .expect(\"Required coordinate type should have been set up by `parse_type_image`!\")\r\n    });\r\n    let extra_expr = crate::Expression::AccessIndex {\r\n        base,\r\n        index: required_size.map_or(1, |size| size as u32),\r\n    };\r\n\r\n    let base_span = ctx.expressions.get_span(base);\r\n\r\n    match extra_coordinate {\r\n        ExtraCoordinate::ArrayLayer => {\r\n            let extracted = match required_size {\r\n                None => ctx\r\n                    .expressions\r\n                    .append(crate::Expression::AccessIndex { base, index: 0 }, base_span),\r\n                Some(size) => {\r\n                    let mut components = Vec::with_capacity(size as usize);\r\n                    for index in 0..size as u32 {\r\n                        let comp = ctx\r\n                            .expressions\r\n                            .append(crate::Expression::AccessIndex { base, index }, base_span);\r\n                        components.push(comp);\r\n                    }\r\n                    ctx.expressions.append(\r\n                        crate::Expression::Compose {\r\n                            ty: required_ty.unwrap(),\r\n                            components,\r\n                        },\r\n                        base_span,\r\n                    )\r\n                }\r\n            };\r\n            let array_index_f32 = ctx.expressions.append(extra_expr, base_span);\r\n            let array_index = ctx.expressions.append(\r\n                crate::Expression::As {\r\n                    kind: crate::ScalarKind::Sint,\r\n                    expr: array_index_f32,\r\n                    convert: Some(4),\r\n                },\r\n                base_span,\r\n            );\r\n            (extracted, Some(array_index))\r\n        }\r\n        ExtraCoordinate::Projection => {\r\n            let projection = ctx.expressions.append(extra_expr, base_span);\r\n            let divided = match required_size {\r\n                None => {\r\n                    let temp = ctx\r\n                        .expressions\r\n                        .append(crate::Expression::AccessIndex { base, index: 0 }, base_span);\r\n                    ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Divide,\r\n                            left: temp,\r\n                            right: projection,\r\n                        },\r\n                        base_span,\r\n                    )\r\n                }\r\n                Some(size) => {\r\n                    let mut components = Vec::with_capacity(size as usize);\r\n                    for index in 0..size as u32 {\r\n                        let temp = ctx\r\n                            .expressions\r\n                            .append(crate::Expression::AccessIndex { base, index }, base_span);\r\n                        let comp = ctx.expressions.append(\r\n                            crate::Expression::Binary {\r\n                                op: crate::BinaryOperator::Divide,\r\n                                left: temp,\r\n                                right: projection,\r\n                            },\r\n                            base_span,\r\n                        );\r\n                        components.push(comp);\r\n                    }\r\n                    ctx.expressions.append(\r\n                        crate::Expression::Compose {\r\n                            ty: required_ty.unwrap(),\r\n                            components,\r\n                        },\r\n                        base_span,\r\n                    )\r\n                }\r\n            };\r\n            (divided, None)\r\n        }\r\n        ExtraCoordinate::Garbage if given_size == required_size => (base, None),\r\n        ExtraCoordinate::Garbage => {\r\n            use crate::SwizzleComponent as Sc;\r\n            let cut_expr = match required_size {\r\n                None => crate::Expression::AccessIndex { base, index: 0 },\r\n                Some(size) => crate::Expression::Swizzle {\r\n                    size,\r\n                    vector: base,\r\n                    pattern: [Sc::X, Sc::Y, Sc::Z, Sc::W],\r\n                },\r\n            };\r\n            (ctx.expressions.append(cut_expr, base_span), None)\r\n        }\r\n    }\r\n}\r\n\r\npub(super) fn patch_comparison_type(\r\n    flags: SamplingFlags,\r\n    var: &mut crate::GlobalVariable,\r\n    arena: &mut UniqueArena<crate::Type>,\r\n) -> bool {\r\n    if !flags.contains(SamplingFlags::COMPARISON) {\r\n        return true;\r\n    }\r\n    if flags == SamplingFlags::all() {\r\n        return false;\r\n    }\r\n\r\n    log::debug!(\"Flipping comparison for {:?}\", var);\r\n    let original_ty = &arena[var.ty];\r\n    let original_ty_span = arena.get_span(var.ty);\r\n    let ty_inner = match original_ty.inner {\r\n        crate::TypeInner::Image {\r\n            class: crate::ImageClass::Sampled { multi, .. },\r\n            dim,\r\n            arrayed,\r\n        } => crate::TypeInner::Image {\r\n            class: crate::ImageClass::Depth { multi },\r\n            dim,\r\n            arrayed,\r\n        },\r\n        crate::TypeInner::Sampler { .. } => crate::TypeInner::Sampler { comparison: true },\r\n        ref other => unreachable!(\"Unexpected type for comparison mutation: {:?}\", other),\r\n    };\r\n\r\n    let name = original_ty.name.clone();\r\n    var.ty = arena.insert(\r\n        crate::Type {\r\n            name,\r\n            inner: ty_inner,\r\n        },\r\n        original_ty_span,\r\n    );\r\n    true\r\n}\r\n\r\nimpl<I: Iterator<Item = u32>> super::Parser<I> {\r\n    pub(super) fn parse_image_couple(&mut self) -> Result<(), Error> {\r\n        let _result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let image_id = self.next()?;\r\n        let sampler_id = self.next()?;\r\n        let image_lexp = self.lookup_expression.lookup(image_id)?;\r\n        let sampler_lexp = self.lookup_expression.lookup(sampler_id)?;\r\n        self.lookup_sampled_image.insert(\r\n            result_id,\r\n            LookupSampledImage {\r\n                image: image_lexp.handle,\r\n                sampler: sampler_lexp.handle,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn parse_image_uncouple(&mut self, block_id: spirv::Word) -> Result<(), Error> {\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let sampled_image_id = self.next()?;\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: self.lookup_sampled_image.lookup(sampled_image_id)?.image,\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn parse_image_write(\r\n        &mut self,\r\n        words_left: u16,\r\n        ctx: &mut super::BlockContext,\r\n        emitter: &mut crate::front::Emitter,\r\n        block: &mut crate::Block,\r\n        body_idx: usize,\r\n    ) -> Result<crate::Statement, Error> {\r\n        let image_id = self.next()?;\r\n        let coordinate_id = self.next()?;\r\n        let value_id = self.next()?;\r\n\r\n        let image_ops = if words_left != 0 { self.next()? } else { 0 };\r\n\r\n        if image_ops != 0 {\r\n            let other = spirv::ImageOperands::from_bits_truncate(image_ops);\r\n            log::warn!(\"Unknown image write ops {:?}\", other);\r\n            for _ in 1..words_left {\r\n                self.next()?;\r\n            }\r\n        }\r\n\r\n        let image_lexp = self.lookup_expression.lookup(image_id)?;\r\n        let image_ty = ctx.get_image_expr_ty(image_lexp.handle)?;\r\n\r\n        let coord_lexp = self.lookup_expression.lookup(coordinate_id)?;\r\n        let coord_handle =\r\n            self.get_expr_handle(coordinate_id, coord_lexp, ctx, emitter, block, body_idx);\r\n        let coord_type_handle = self.lookup_type.lookup(coord_lexp.type_id)?.handle;\r\n        let (coordinate, array_index) = match ctx.type_arena[image_ty].inner {\r\n            crate::TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class: _,\r\n            } => extract_image_coordinates(\r\n                dim,\r\n                if arrayed {\r\n                    ExtraCoordinate::ArrayLayer\r\n                } else {\r\n                    ExtraCoordinate::Garbage\r\n                },\r\n                coord_handle,\r\n                coord_type_handle,\r\n                ctx,\r\n            ),\r\n            _ => return Err(Error::InvalidImage(image_ty)),\r\n        };\r\n\r\n        let value_lexp = self.lookup_expression.lookup(value_id)?;\r\n        let value = self.get_expr_handle(value_id, value_lexp, ctx, emitter, block, body_idx);\r\n\r\n        Ok(crate::Statement::ImageStore {\r\n            image: image_lexp.handle,\r\n            coordinate,\r\n            array_index,\r\n            value,\r\n        })\r\n    }\r\n\r\n    pub(super) fn parse_image_load(\r\n        &mut self,\r\n        mut words_left: u16,\r\n        ctx: &mut super::BlockContext,\r\n        emitter: &mut crate::front::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let image_id = self.next()?;\r\n        let coordinate_id = self.next()?;\r\n\r\n        let mut image_ops = if words_left != 0 {\r\n            words_left -= 1;\r\n            self.next()?\r\n        } else {\r\n            0\r\n        };\r\n\r\n        let mut sample = None;\r\n        let mut level = None;\r\n        while image_ops != 0 {\r\n            let bit = 1 << image_ops.trailing_zeros();\r\n            match spirv::ImageOperands::from_bits_truncate(bit) {\r\n                spirv::ImageOperands::LOD => {\r\n                    let lod_expr = self.next()?;\r\n                    let lod_lexp = self.lookup_expression.lookup(lod_expr)?;\r\n                    let lod_handle =\r\n                        self.get_expr_handle(lod_expr, lod_lexp, ctx, emitter, block, body_idx);\r\n                    level = Some(lod_handle);\r\n                    words_left -= 1;\r\n                }\r\n                spirv::ImageOperands::SAMPLE => {\r\n                    let sample_expr = self.next()?;\r\n                    let sample_handle = self.lookup_expression.lookup(sample_expr)?.handle;\r\n                    sample = Some(sample_handle);\r\n                    words_left -= 1;\r\n                }\r\n                other => {\r\n                    log::warn!(\"Unknown image load op {:?}\", other);\r\n                    for _ in 0..words_left {\r\n                        self.next()?;\r\n                    }\r\n                    break;\r\n                }\r\n            }\r\n            image_ops ^= bit;\r\n        }\r\n\r\n        // No need to call get_expr_handle here since only globals/arguments are\r\n        // allowed as images and they are always in the root scope\r\n        let image_lexp = self.lookup_expression.lookup(image_id)?;\r\n        let image_ty = ctx.get_image_expr_ty(image_lexp.handle)?;\r\n\r\n        let coord_lexp = self.lookup_expression.lookup(coordinate_id)?;\r\n        let coord_handle =\r\n            self.get_expr_handle(coordinate_id, coord_lexp, ctx, emitter, block, body_idx);\r\n        let coord_type_handle = self.lookup_type.lookup(coord_lexp.type_id)?.handle;\r\n        let (coordinate, array_index) = match ctx.type_arena[image_ty].inner {\r\n            crate::TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class: _,\r\n            } => extract_image_coordinates(\r\n                dim,\r\n                if arrayed {\r\n                    ExtraCoordinate::ArrayLayer\r\n                } else {\r\n                    ExtraCoordinate::Garbage\r\n                },\r\n                coord_handle,\r\n                coord_type_handle,\r\n                ctx,\r\n            ),\r\n            _ => return Err(Error::InvalidImage(image_ty)),\r\n        };\r\n\r\n        let expr = crate::Expression::ImageLoad {\r\n            image: image_lexp.handle,\r\n            coordinate,\r\n            array_index,\r\n            sample,\r\n            level,\r\n        };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    #[allow(clippy::too_many_arguments)]\r\n    pub(super) fn parse_image_sample(\r\n        &mut self,\r\n        mut words_left: u16,\r\n        options: SamplingOptions,\r\n        ctx: &mut super::BlockContext,\r\n        emitter: &mut crate::front::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let sampled_image_id = self.next()?;\r\n        let coordinate_id = self.next()?;\r\n        let dref_id = if options.compare {\r\n            Some(self.next()?)\r\n        } else {\r\n            None\r\n        };\r\n\r\n        let mut image_ops = if words_left != 0 {\r\n            words_left -= 1;\r\n            self.next()?\r\n        } else {\r\n            0\r\n        };\r\n\r\n        let mut level = crate::SampleLevel::Auto;\r\n        let mut offset = None;\r\n        while image_ops != 0 {\r\n            let bit = 1 << image_ops.trailing_zeros();\r\n            match spirv::ImageOperands::from_bits_truncate(bit) {\r\n                spirv::ImageOperands::BIAS => {\r\n                    let bias_expr = self.next()?;\r\n                    let bias_lexp = self.lookup_expression.lookup(bias_expr)?;\r\n                    let bias_handle =\r\n                        self.get_expr_handle(bias_expr, bias_lexp, ctx, emitter, block, body_idx);\r\n                    level = crate::SampleLevel::Bias(bias_handle);\r\n                    words_left -= 1;\r\n                }\r\n                spirv::ImageOperands::LOD => {\r\n                    let lod_expr = self.next()?;\r\n                    let lod_lexp = self.lookup_expression.lookup(lod_expr)?;\r\n                    let lod_handle =\r\n                        self.get_expr_handle(lod_expr, lod_lexp, ctx, emitter, block, body_idx);\r\n                    level = if options.compare {\r\n                        log::debug!(\"Assuming {:?} is zero\", lod_handle);\r\n                        crate::SampleLevel::Zero\r\n                    } else {\r\n                        crate::SampleLevel::Exact(lod_handle)\r\n                    };\r\n                    words_left -= 1;\r\n                }\r\n                spirv::ImageOperands::GRAD => {\r\n                    let grad_x_expr = self.next()?;\r\n                    let grad_x_lexp = self.lookup_expression.lookup(grad_x_expr)?;\r\n                    let grad_x_handle = self.get_expr_handle(\r\n                        grad_x_expr,\r\n                        grad_x_lexp,\r\n                        ctx,\r\n                        emitter,\r\n                        block,\r\n                        body_idx,\r\n                    );\r\n                    let grad_y_expr = self.next()?;\r\n                    let grad_y_lexp = self.lookup_expression.lookup(grad_y_expr)?;\r\n                    let grad_y_handle = self.get_expr_handle(\r\n                        grad_y_expr,\r\n                        grad_y_lexp,\r\n                        ctx,\r\n                        emitter,\r\n                        block,\r\n                        body_idx,\r\n                    );\r\n                    level = if options.compare {\r\n                        log::debug!(\r\n                            \"Assuming gradients {:?} and {:?} are not greater than 1\",\r\n                            grad_x_handle,\r\n                            grad_y_handle\r\n                        );\r\n                        crate::SampleLevel::Zero\r\n                    } else {\r\n                        crate::SampleLevel::Gradient {\r\n                            x: grad_x_handle,\r\n                            y: grad_y_handle,\r\n                        }\r\n                    };\r\n                    words_left -= 2;\r\n                }\r\n                spirv::ImageOperands::CONST_OFFSET => {\r\n                    let offset_constant = self.next()?;\r\n                    let offset_handle = self.lookup_constant.lookup(offset_constant)?.handle;\r\n                    offset = Some(offset_handle);\r\n                    words_left -= 1;\r\n                }\r\n                other => {\r\n                    log::warn!(\"Unknown image sample operand {:?}\", other);\r\n                    for _ in 0..words_left {\r\n                        self.next()?;\r\n                    }\r\n                    break;\r\n                }\r\n            }\r\n            image_ops ^= bit;\r\n        }\r\n\r\n        let si_lexp = self.lookup_sampled_image.lookup(sampled_image_id)?;\r\n        let coord_lexp = self.lookup_expression.lookup(coordinate_id)?;\r\n        let coord_handle =\r\n            self.get_expr_handle(coordinate_id, coord_lexp, ctx, emitter, block, body_idx);\r\n        let coord_type_handle = self.lookup_type.lookup(coord_lexp.type_id)?.handle;\r\n\r\n        let sampling_bit = if options.compare {\r\n            SamplingFlags::COMPARISON\r\n        } else {\r\n            SamplingFlags::REGULAR\r\n        };\r\n\r\n        let image_ty = match ctx.expressions[si_lexp.image] {\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                if let Some(flags) = self.handle_sampling.get_mut(&handle) {\r\n                    *flags |= sampling_bit;\r\n                }\r\n\r\n                ctx.global_arena[handle].ty\r\n            }\r\n            crate::Expression::FunctionArgument(i) => {\r\n                ctx.parameter_sampling[i as usize] |= sampling_bit;\r\n                ctx.arguments[i as usize].ty\r\n            }\r\n            ref other => return Err(Error::InvalidGlobalVar(other.clone())),\r\n        };\r\n        match ctx.expressions[si_lexp.sampler] {\r\n            crate::Expression::GlobalVariable(handle) => {\r\n                *self.handle_sampling.get_mut(&handle).unwrap() |= sampling_bit\r\n            }\r\n            crate::Expression::FunctionArgument(i) => {\r\n                ctx.parameter_sampling[i as usize] |= sampling_bit;\r\n            }\r\n            ref other => return Err(Error::InvalidGlobalVar(other.clone())),\r\n        }\r\n\r\n        let ((coordinate, array_index), depth_ref) = match ctx.type_arena[image_ty].inner {\r\n            crate::TypeInner::Image {\r\n                dim,\r\n                arrayed,\r\n                class: _,\r\n            } => (\r\n                extract_image_coordinates(\r\n                    dim,\r\n                    if options.project {\r\n                        ExtraCoordinate::Projection\r\n                    } else if arrayed {\r\n                        ExtraCoordinate::ArrayLayer\r\n                    } else {\r\n                        ExtraCoordinate::Garbage\r\n                    },\r\n                    coord_handle,\r\n                    coord_type_handle,\r\n                    ctx,\r\n                ),\r\n                {\r\n                    match dref_id {\r\n                        Some(id) => {\r\n                            let expr_lexp = self.lookup_expression.lookup(id)?;\r\n                            let mut expr =\r\n                                self.get_expr_handle(id, expr_lexp, ctx, emitter, block, body_idx);\r\n\r\n                            if options.project {\r\n                                let required_size = dim.required_coordinate_size();\r\n                                let right = ctx.expressions.append(\r\n                                    crate::Expression::AccessIndex {\r\n                                        base: coord_handle,\r\n                                        index: required_size.map_or(1, |size| size as u32),\r\n                                    },\r\n                                    crate::Span::default(),\r\n                                );\r\n                                expr = ctx.expressions.append(\r\n                                    crate::Expression::Binary {\r\n                                        op: crate::BinaryOperator::Divide,\r\n                                        left: expr,\r\n                                        right,\r\n                                    },\r\n                                    crate::Span::default(),\r\n                                )\r\n                            };\r\n                            Some(expr)\r\n                        }\r\n                        None => None,\r\n                    }\r\n                },\r\n            ),\r\n            _ => return Err(Error::InvalidImage(image_ty)),\r\n        };\r\n\r\n        let expr = crate::Expression::ImageSample {\r\n            image: si_lexp.image,\r\n            sampler: si_lexp.sampler,\r\n            gather: None, //TODO\r\n            coordinate,\r\n            array_index,\r\n            offset,\r\n            level,\r\n            depth_ref,\r\n        };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn parse_image_query_size(\r\n        &mut self,\r\n        at_level: bool,\r\n        ctx: &mut super::BlockContext,\r\n        emitter: &mut crate::front::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let image_id = self.next()?;\r\n        let level = if at_level {\r\n            let level_id = self.next()?;\r\n            let level_lexp = self.lookup_expression.lookup(level_id)?;\r\n            Some(self.get_expr_handle(level_id, level_lexp, ctx, emitter, block, body_idx))\r\n        } else {\r\n            None\r\n        };\r\n\r\n        // No need to call get_expr_handle here since only globals/arguments are\r\n        // allowed as images and they are always in the root scope\r\n        //TODO: handle arrays and cubes\r\n        let image_lexp = self.lookup_expression.lookup(image_id)?;\r\n\r\n        let expr = crate::Expression::ImageQuery {\r\n            image: image_lexp.handle,\r\n            query: crate::ImageQuery::Size { level },\r\n        };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn parse_image_query_other(\r\n        &mut self,\r\n        query: crate::ImageQuery,\r\n        expressions: &mut Arena<crate::Expression>,\r\n        block_id: spirv::Word,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let image_id = self.next()?;\r\n\r\n        // No need to call get_expr_handle here since only globals/arguments are\r\n        // allowed as images and they are always in the root scope\r\n        let image_lexp = self.lookup_expression.lookup(image_id)?.clone();\r\n\r\n        let expr = crate::Expression::ImageQuery {\r\n            image: image_lexp.handle,\r\n            query,\r\n        };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/spv/mod.rs",
    "content": "/*!\r\nFrontend for [SPIR-V][spv] (Standard Portable Intermediate Representation).\r\n\r\n## ID lookups\r\n\r\nOur IR links to everything with `Handle`, while SPIR-V uses IDs.\r\nIn order to keep track of the associations, the parser has many lookup tables.\r\nThere map `spv::Word` into a specific IR handle, plus potentially a bit of\r\nextra info, such as the related SPIR-V type ID.\r\nTODO: would be nice to find ways that avoid looking up as much\r\n\r\n## Inputs/Outputs\r\n\r\nWe create a private variable for each input/output. The relevant inputs are\r\npopulated at the start of an entry point. The outputs are saved at the end.\r\n\r\nThe function associated with an entry point is wrapped in another function,\r\nsuch that we can handle any `Return` statements without problems.\r\n\r\n## Row-major matrices\r\n\r\nWe don't handle them natively, since the IR only expects column majority.\r\nInstead, we detect when such matrix is accessed in the `OpAccessChain`,\r\nand we generate a parallel expression that loads the value, but transposed.\r\nThis value then gets used instead of `OpLoad` result later on.\r\n\r\n[spv]: https://www.khronos.org/registry/SPIR-V/\r\n*/\r\n\r\nmod convert;\r\nmod error;\r\nmod function;\r\nmod image;\r\nmod null;\r\n\r\nuse convert::*;\r\npub use error::Error;\r\nuse function::*;\r\n\r\nuse crate::{\r\n    arena::{Arena, Handle, UniqueArena},\r\n    proc::{Alignment, Layouter},\r\n    FastHashMap, FastHashSet,\r\n};\r\n\r\nuse num_traits::cast::FromPrimitive;\r\nuse petgraph::graphmap::GraphMap;\r\nuse std::{convert::TryInto, mem, num::NonZeroU32, path::PathBuf};\r\n\r\npub const SUPPORTED_CAPABILITIES: &[spirv::Capability] = &[\r\n    spirv::Capability::Shader,\r\n    spirv::Capability::VulkanMemoryModel,\r\n    spirv::Capability::ClipDistance,\r\n    spirv::Capability::CullDistance,\r\n    spirv::Capability::SampleRateShading,\r\n    spirv::Capability::DerivativeControl,\r\n    spirv::Capability::InterpolationFunction,\r\n    spirv::Capability::Matrix,\r\n    spirv::Capability::ImageQuery,\r\n    spirv::Capability::Sampled1D,\r\n    spirv::Capability::Image1D,\r\n    spirv::Capability::SampledCubeArray,\r\n    spirv::Capability::ImageCubeArray,\r\n    spirv::Capability::ImageMSArray,\r\n    spirv::Capability::StorageImageExtendedFormats,\r\n    spirv::Capability::Sampled1D,\r\n    spirv::Capability::SampledCubeArray,\r\n    spirv::Capability::Int8,\r\n    spirv::Capability::Int16,\r\n    spirv::Capability::Int64,\r\n    spirv::Capability::Float16,\r\n    spirv::Capability::Float64,\r\n    spirv::Capability::Geometry,\r\n    spirv::Capability::MultiView,\r\n    // tricky ones\r\n    spirv::Capability::UniformBufferArrayDynamicIndexing,\r\n    spirv::Capability::StorageBufferArrayDynamicIndexing,\r\n];\r\npub const SUPPORTED_EXTENSIONS: &[&str] = &[\r\n    \"SPV_KHR_storage_buffer_storage_class\",\r\n    \"SPV_KHR_vulkan_memory_model\",\r\n    \"SPV_KHR_multiview\",\r\n];\r\npub const SUPPORTED_EXT_SETS: &[&str] = &[\"GLSL.std.450\"];\r\n\r\n#[derive(Copy, Clone)]\r\npub struct Instruction {\r\n    op: spirv::Op,\r\n    wc: u16,\r\n}\r\n\r\nimpl Instruction {\r\n    const fn expect(self, count: u16) -> Result<(), Error> {\r\n        if self.wc == count {\r\n            Ok(())\r\n        } else {\r\n            Err(Error::InvalidOperandCount(self.op, self.wc))\r\n        }\r\n    }\r\n\r\n    fn expect_at_least(self, count: u16) -> Result<u16, Error> {\r\n        self.wc\r\n            .checked_sub(count)\r\n            .ok_or(Error::InvalidOperandCount(self.op, self.wc))\r\n    }\r\n}\r\n\r\nimpl crate::TypeInner {\r\n    const fn can_comparison_sample(&self) -> bool {\r\n        match *self {\r\n            crate::TypeInner::Image {\r\n                class:\r\n                    crate::ImageClass::Sampled {\r\n                        kind: crate::ScalarKind::Float,\r\n                        multi: false,\r\n                    },\r\n                ..\r\n            } => true,\r\n            crate::TypeInner::Sampler { .. } => true,\r\n            _ => false,\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]\r\npub enum ModuleState {\r\n    Empty,\r\n    Capability,\r\n    Extension,\r\n    ExtInstImport,\r\n    MemoryModel,\r\n    EntryPoint,\r\n    ExecutionMode,\r\n    Source,\r\n    Name,\r\n    ModuleProcessed,\r\n    Annotation,\r\n    Type,\r\n    Function,\r\n}\r\n\r\ntrait LookupHelper {\r\n    type Target;\r\n    fn lookup(&self, key: spirv::Word) -> Result<&Self::Target, Error>;\r\n}\r\n\r\nimpl<T> LookupHelper for FastHashMap<spirv::Word, T> {\r\n    type Target = T;\r\n    fn lookup(&self, key: spirv::Word) -> Result<&T, Error> {\r\n        self.get(&key).ok_or(Error::InvalidId(key))\r\n    }\r\n}\r\n\r\nimpl crate::ImageDimension {\r\n    const fn required_coordinate_size(&self) -> Option<crate::VectorSize> {\r\n        match *self {\r\n            crate::ImageDimension::D1 => None,\r\n            crate::ImageDimension::D2 => Some(crate::VectorSize::Bi),\r\n            crate::ImageDimension::D3 => Some(crate::VectorSize::Tri),\r\n            crate::ImageDimension::Cube => Some(crate::VectorSize::Tri),\r\n        }\r\n    }\r\n}\r\n\r\ntype MemberIndex = u32;\r\n\r\nbitflags::bitflags! {\r\n    #[derive(Default)]\r\n    struct DecorationFlags: u32 {\r\n        const NON_READABLE = 0x1;\r\n        const NON_WRITABLE = 0x2;\r\n    }\r\n}\r\n\r\nimpl DecorationFlags {\r\n    fn to_storage_access(self) -> crate::StorageAccess {\r\n        let mut access = crate::StorageAccess::all();\r\n        if self.contains(DecorationFlags::NON_READABLE) {\r\n            access &= !crate::StorageAccess::LOAD;\r\n        }\r\n        if self.contains(DecorationFlags::NON_WRITABLE) {\r\n            access &= !crate::StorageAccess::STORE;\r\n        }\r\n        access\r\n    }\r\n}\r\n\r\n#[derive(Debug, PartialEq)]\r\nenum Majority {\r\n    Column,\r\n    Row,\r\n}\r\n\r\n#[derive(Debug, Default)]\r\nstruct Decoration {\r\n    name: Option<String>,\r\n    built_in: Option<spirv::Word>,\r\n    location: Option<spirv::Word>,\r\n    desc_set: Option<spirv::Word>,\r\n    desc_index: Option<spirv::Word>,\r\n    specialization: Option<spirv::Word>,\r\n    storage_buffer: bool,\r\n    offset: Option<spirv::Word>,\r\n    array_stride: Option<NonZeroU32>,\r\n    matrix_stride: Option<NonZeroU32>,\r\n    matrix_major: Option<Majority>,\r\n    invariant: bool,\r\n    interpolation: Option<crate::Interpolation>,\r\n    sampling: Option<crate::Sampling>,\r\n    flags: DecorationFlags,\r\n}\r\n\r\nimpl Decoration {\r\n    fn debug_name(&self) -> &str {\r\n        match self.name {\r\n            Some(ref name) => name.as_str(),\r\n            None => \"?\",\r\n        }\r\n    }\r\n\r\n    const fn resource_binding(&self) -> Option<crate::ResourceBinding> {\r\n        match *self {\r\n            Decoration {\r\n                desc_set: Some(group),\r\n                desc_index: Some(binding),\r\n                ..\r\n            } => Some(crate::ResourceBinding { group, binding }),\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    fn io_binding(&self) -> Result<crate::Binding, Error> {\r\n        match *self {\r\n            Decoration {\r\n                built_in: Some(built_in),\r\n                location: None,\r\n                invariant,\r\n                ..\r\n            } => Ok(crate::Binding::BuiltIn(map_builtin(built_in, invariant)?)),\r\n            Decoration {\r\n                built_in: None,\r\n                location: Some(location),\r\n                interpolation,\r\n                sampling,\r\n                ..\r\n            } => Ok(crate::Binding::Location {\r\n                location,\r\n                interpolation,\r\n                sampling,\r\n            }),\r\n            _ => Err(Error::MissingDecoration(spirv::Decoration::Location)),\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\nstruct LookupFunctionType {\r\n    parameter_type_ids: Vec<spirv::Word>,\r\n    return_type_id: spirv::Word,\r\n}\r\n\r\nstruct LookupFunction {\r\n    handle: Handle<crate::Function>,\r\n    parameters_sampling: Vec<image::SamplingFlags>,\r\n}\r\n\r\n#[derive(Debug)]\r\nstruct EntryPoint {\r\n    stage: crate::ShaderStage,\r\n    name: String,\r\n    early_depth_test: Option<crate::EarlyDepthTest>,\r\n    workgroup_size: [u32; 3],\r\n    variable_ids: Vec<spirv::Word>,\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\nstruct LookupType {\r\n    handle: Handle<crate::Type>,\r\n    base_id: Option<spirv::Word>,\r\n}\r\n\r\n#[derive(Debug)]\r\nstruct LookupConstant {\r\n    handle: Handle<crate::Constant>,\r\n    type_id: spirv::Word,\r\n}\r\n\r\n#[derive(Debug)]\r\nenum Variable {\r\n    Global,\r\n    Input(crate::FunctionArgument),\r\n    Output(crate::FunctionResult),\r\n}\r\n\r\n#[derive(Debug)]\r\nstruct LookupVariable {\r\n    inner: Variable,\r\n    handle: Handle<crate::GlobalVariable>,\r\n    type_id: spirv::Word,\r\n}\r\n\r\n/// Information about SPIR-V result ids, stored in `Parser::lookup_expression`.\r\n#[derive(Clone, Debug)]\r\nstruct LookupExpression {\r\n    /// The `Expression` constructed for this result.\r\n    ///\r\n    /// Note that, while a SPIR-V result id can be used in any block dominated\r\n    /// by its definition, a Naga `Expression` is only in scope for the rest of\r\n    /// its subtree. `Parser::get_expr_handle` takes care of spilling the result\r\n    /// to a `LocalVariable` which can then be used anywhere.\r\n    handle: Handle<crate::Expression>,\r\n\r\n    /// The SPIR-V type of this result.\r\n    type_id: spirv::Word,\r\n\r\n    /// The label id of the block that defines this expression.\r\n    ///\r\n    /// This is zero for globals, constants, and function parameters, since they\r\n    /// originate outside any function's block.\r\n    block_id: spirv::Word,\r\n}\r\n\r\n#[derive(Debug)]\r\nstruct LookupMember {\r\n    type_id: spirv::Word,\r\n    // This is true for either matrices, or arrays of matrices (yikes).\r\n    row_major: bool,\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\nenum LookupLoadOverride {\r\n    /// For arrays of matrices, we track them but not loading yet.\r\n    Pending,\r\n    /// For matrices, vectors, and scalars, we pre-load the data.\r\n    Loaded(Handle<crate::Expression>),\r\n}\r\n\r\n#[derive(PartialEq)]\r\nenum ExtendedClass {\r\n    Global(crate::AddressSpace),\r\n    Input,\r\n    Output,\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\npub struct Options {\r\n    /// The IR coordinate space matches all the APIs except SPIR-V,\r\n    /// so by default we flip the Y coordinate of the `BuiltIn::Position`.\r\n    /// This flag can be used to avoid this.\r\n    pub adjust_coordinate_space: bool,\r\n    /// Only allow shaders with the known set of capabilities.\r\n    pub strict_capabilities: bool,\r\n    pub block_ctx_dump_prefix: Option<PathBuf>,\r\n}\r\n\r\nimpl Default for Options {\r\n    fn default() -> Self {\r\n        Options {\r\n            adjust_coordinate_space: true,\r\n            strict_capabilities: false,\r\n            block_ctx_dump_prefix: None,\r\n        }\r\n    }\r\n}\r\n\r\n/// An index into the `BlockContext::bodies` table.\r\ntype BodyIndex = usize;\r\n\r\n/// An intermediate representation of a Naga [`Statement`].\r\n///\r\n/// `Body` and `BodyFragment` values form a tree: the `BodyIndex` fields of the\r\n/// variants are indices of the child `Body` values in [`BlockContext::bodies`].\r\n/// The `lower` function assembles the final `Statement` tree from this `Body`\r\n/// tree. See [`BlockContext`] for details.\r\n///\r\n/// [`Statement`]: crate::Statement\r\n#[derive(Debug)]\r\nenum BodyFragment {\r\n    BlockId(spirv::Word),\r\n    If {\r\n        condition: Handle<crate::Expression>,\r\n        accept: BodyIndex,\r\n        reject: BodyIndex,\r\n    },\r\n    Loop {\r\n        body: BodyIndex,\r\n        continuing: BodyIndex,\r\n    },\r\n    Switch {\r\n        selector: Handle<crate::Expression>,\r\n        cases: Vec<(i32, BodyIndex)>,\r\n        default: BodyIndex,\r\n    },\r\n    Break,\r\n    Continue,\r\n}\r\n\r\n/// An intermediate representation of a Naga [`Block`].\r\n///\r\n/// This will be assembled into a `Block` once we've added spills for phi nodes\r\n/// and out-of-scope expressions. See [`BlockContext`] for details.\r\n///\r\n/// [`Block`]: crate::Block\r\n#[derive(Debug)]\r\nstruct Body {\r\n    /// The index of the direct parent of this body\r\n    parent: usize,\r\n    data: Vec<BodyFragment>,\r\n}\r\n\r\nimpl Body {\r\n    /// Creates a new empty `Body` with the specified `parent`\r\n    pub const fn with_parent(parent: usize) -> Self {\r\n        Body {\r\n            parent,\r\n            data: Vec::new(),\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\nstruct PhiExpression {\r\n    /// The local variable used for the phi node\r\n    local: Handle<crate::LocalVariable>,\r\n    /// List of (expression, block)\r\n    expressions: Vec<(spirv::Word, spirv::Word)>,\r\n}\r\n\r\n#[derive(Debug)]\r\nenum MergeBlockInformation {\r\n    LoopMerge,\r\n    LoopContinue,\r\n    SelectionMerge,\r\n    SwitchMerge,\r\n}\r\n\r\n/// Fragments of Naga IR, to be assembled into `Statements` once data flow is\r\n/// resolved.\r\n///\r\n/// We can't build a Naga `Statement` tree directly from SPIR-V blocks for two\r\n/// main reasons:\r\n///\r\n/// - A SPIR-V expression can be used in any SPIR-V block dominated by its\r\n///   definition, whereas Naga expressions are scoped to the rest of their\r\n///   subtree. This means that discovering an expression use later in the\r\n///   function retroactively requires us to have spilled that expression into a\r\n///   local variable back before we left its scope.\r\n///\r\n/// - We translate SPIR-V OpPhi expressions as Naga local variables in which we\r\n///   store the appropriate value before jumping to the OpPhi's block.\r\n///\r\n/// Both cases require us to go back and amend previously generated Naga IR\r\n/// based on things we discover later. But modifying old blocks in arbitrary\r\n/// spots in a `Statement` tree is awkward.\r\n///\r\n/// Instead, as we iterate through the function's body, we accumulate\r\n/// control-flow-free fragments of Naga IR in the [`blocks`] table, while\r\n/// building a skeleton of the Naga `Statement` tree in [`bodies`]. We note any\r\n/// spills and temporaries we must introduce in [`phis`].\r\n///\r\n/// Finally, once we've processed the entire function, we add temporaries and\r\n/// spills to the fragmentary `Blocks` as directed by `phis`, and assemble them\r\n/// into the final Naga `Statement` tree as directed by `bodies`.\r\n///\r\n/// [`blocks`]: BlockContext::blocks\r\n/// [`bodies`]: BlockContext::bodies\r\n/// [`phis`]: BlockContext::phis\r\n/// [`lower`]: function::lower\r\n#[derive(Debug)]\r\nstruct BlockContext<'function> {\r\n    /// Phi nodes encountered when parsing the function, used to generate spills\r\n    /// to local variables.\r\n    phis: Vec<PhiExpression>,\r\n\r\n    /// Fragments of control-flow-free Naga IR.\r\n    ///\r\n    /// These will be stitched together into a proper `Statement` tree according\r\n    /// to `bodies`, once parsing is complete.\r\n    blocks: FastHashMap<spirv::Word, crate::Block>,\r\n\r\n    /// Map from block label ids to the index of the corresponding `Body` in\r\n    /// `bodies`.\r\n    body_for_label: FastHashMap<spirv::Word, BodyIndex>,\r\n\r\n    /// SPIR-V metadata about merge/continue blocks.\r\n    mergers: FastHashMap<spirv::Word, MergeBlockInformation>,\r\n\r\n    /// A table of `Body` values, each representing a block in the final IR.\r\n    bodies: Vec<Body>,\r\n\r\n    /// Id of the function currently being processed\r\n    function_id: spirv::Word,\r\n    /// Expression arena of the function currently being processed\r\n    expressions: &'function mut Arena<crate::Expression>,\r\n    /// Local variables arena of the function currently being processed\r\n    local_arena: &'function mut Arena<crate::LocalVariable>,\r\n    /// Constants arena of the module being processed\r\n    const_arena: &'function mut Arena<crate::Constant>,\r\n    /// Type arena of the module being processed\r\n    type_arena: &'function UniqueArena<crate::Type>,\r\n    /// Global arena of the module being processed\r\n    global_arena: &'function Arena<crate::GlobalVariable>,\r\n    /// Arguments of the function currently being processed\r\n    arguments: &'function [crate::FunctionArgument],\r\n    /// Metadata about the usage of function parameters as sampling objects\r\n    parameter_sampling: &'function mut [image::SamplingFlags],\r\n}\r\n\r\nenum SignAnchor {\r\n    Result,\r\n    Operand,\r\n}\r\n\r\npub struct Parser<I> {\r\n    data: I,\r\n    data_offset: usize,\r\n    state: ModuleState,\r\n    layouter: Layouter,\r\n    temp_bytes: Vec<u8>,\r\n    ext_glsl_id: Option<spirv::Word>,\r\n    future_decor: FastHashMap<spirv::Word, Decoration>,\r\n    future_member_decor: FastHashMap<(spirv::Word, MemberIndex), Decoration>,\r\n    lookup_member: FastHashMap<(Handle<crate::Type>, MemberIndex), LookupMember>,\r\n    handle_sampling: FastHashMap<Handle<crate::GlobalVariable>, image::SamplingFlags>,\r\n    lookup_type: FastHashMap<spirv::Word, LookupType>,\r\n    lookup_void_type: Option<spirv::Word>,\r\n    lookup_storage_buffer_types: FastHashMap<Handle<crate::Type>, crate::StorageAccess>,\r\n    // Lookup for samplers and sampled images, storing flags on how they are used.\r\n    lookup_constant: FastHashMap<spirv::Word, LookupConstant>,\r\n    lookup_variable: FastHashMap<spirv::Word, LookupVariable>,\r\n    lookup_expression: FastHashMap<spirv::Word, LookupExpression>,\r\n    // Load overrides are used to work around row-major matrices\r\n    lookup_load_override: FastHashMap<spirv::Word, LookupLoadOverride>,\r\n    lookup_sampled_image: FastHashMap<spirv::Word, image::LookupSampledImage>,\r\n    lookup_function_type: FastHashMap<spirv::Word, LookupFunctionType>,\r\n    lookup_function: FastHashMap<spirv::Word, LookupFunction>,\r\n    lookup_entry_point: FastHashMap<spirv::Word, EntryPoint>,\r\n    //Note: each `OpFunctionCall` gets a single entry here, indexed by the\r\n    // dummy `Handle<crate::Function>` of the call site.\r\n    deferred_function_calls: Vec<spirv::Word>,\r\n    dummy_functions: Arena<crate::Function>,\r\n    // Graph of all function calls through the module.\r\n    // It's used to sort the functions (as nodes) topologically,\r\n    // so that in the IR any called function is already known.\r\n    function_call_graph: GraphMap<spirv::Word, (), petgraph::Directed>,\r\n    options: Options,\r\n    index_constants: Vec<Handle<crate::Constant>>,\r\n    index_constant_expressions: Vec<Handle<crate::Expression>>,\r\n\r\n    /// Maps for a switch from a case target to the respective body and associated literals that\r\n    /// use that target block id.\r\n    ///\r\n    /// Used to preserve allocations between instruction parsing.\r\n    switch_cases: indexmap::IndexMap<\r\n        spirv::Word,\r\n        (BodyIndex, Vec<i32>),\r\n        std::hash::BuildHasherDefault<rustc_hash::FxHasher>,\r\n    >,\r\n\r\n    /// Tracks usage of builtins, used to cull unused builtins since they can\r\n    /// have serious performance implications.\r\n    builtin_usage: FastHashSet<crate::BuiltIn>,\r\n}\r\n\r\nimpl<I: Iterator<Item = u32>> Parser<I> {\r\n    pub fn new(data: I, options: &Options) -> Self {\r\n        Parser {\r\n            data,\r\n            data_offset: 0,\r\n            state: ModuleState::Empty,\r\n            layouter: Layouter::default(),\r\n            temp_bytes: Vec::new(),\r\n            ext_glsl_id: None,\r\n            future_decor: FastHashMap::default(),\r\n            future_member_decor: FastHashMap::default(),\r\n            handle_sampling: FastHashMap::default(),\r\n            lookup_member: FastHashMap::default(),\r\n            lookup_type: FastHashMap::default(),\r\n            lookup_void_type: None,\r\n            lookup_storage_buffer_types: FastHashMap::default(),\r\n            lookup_constant: FastHashMap::default(),\r\n            lookup_variable: FastHashMap::default(),\r\n            lookup_expression: FastHashMap::default(),\r\n            lookup_load_override: FastHashMap::default(),\r\n            lookup_sampled_image: FastHashMap::default(),\r\n            lookup_function_type: FastHashMap::default(),\r\n            lookup_function: FastHashMap::default(),\r\n            lookup_entry_point: FastHashMap::default(),\r\n            deferred_function_calls: Vec::default(),\r\n            dummy_functions: Arena::new(),\r\n            function_call_graph: GraphMap::new(),\r\n            options: options.clone(),\r\n            index_constants: Vec::new(),\r\n            index_constant_expressions: Vec::new(),\r\n            switch_cases: indexmap::IndexMap::default(),\r\n            builtin_usage: FastHashSet::default(),\r\n        }\r\n    }\r\n\r\n    fn span_from(&self, from: usize) -> crate::Span {\r\n        crate::Span::from(from..self.data_offset)\r\n    }\r\n\r\n    fn span_from_with_op(&self, from: usize) -> crate::Span {\r\n        crate::Span::from((from - 4)..self.data_offset)\r\n    }\r\n\r\n    fn next(&mut self) -> Result<u32, Error> {\r\n        if let Some(res) = self.data.next() {\r\n            self.data_offset += 4;\r\n            Ok(res)\r\n        } else {\r\n            Err(Error::IncompleteData)\r\n        }\r\n    }\r\n\r\n    fn next_inst(&mut self) -> Result<Instruction, Error> {\r\n        let word = self.next()?;\r\n        let (wc, opcode) = ((word >> 16) as u16, (word & 0xffff) as u16);\r\n        if wc == 0 {\r\n            return Err(Error::InvalidWordCount);\r\n        }\r\n        let op = spirv::Op::from_u16(opcode).ok_or(Error::UnknownInstruction(opcode))?;\r\n\r\n        Ok(Instruction { op, wc })\r\n    }\r\n\r\n    fn next_string(&mut self, mut count: u16) -> Result<(String, u16), Error> {\r\n        self.temp_bytes.clear();\r\n        loop {\r\n            if count == 0 {\r\n                return Err(Error::BadString);\r\n            }\r\n            count -= 1;\r\n            let chars = self.next()?.to_le_bytes();\r\n            let pos = chars.iter().position(|&c| c == 0).unwrap_or(4);\r\n            self.temp_bytes.extend_from_slice(&chars[..pos]);\r\n            if pos < 4 {\r\n                break;\r\n            }\r\n        }\r\n        std::str::from_utf8(&self.temp_bytes)\r\n            .map(|s| (s.to_owned(), count))\r\n            .map_err(|_| Error::BadString)\r\n    }\r\n\r\n    fn next_decoration(\r\n        &mut self,\r\n        inst: Instruction,\r\n        base_words: u16,\r\n        dec: &mut Decoration,\r\n    ) -> Result<(), Error> {\r\n        let raw = self.next()?;\r\n        let dec_typed = spirv::Decoration::from_u32(raw).ok_or(Error::InvalidDecoration(raw))?;\r\n        log::trace!(\"\\t\\t{}: {:?}\", dec.debug_name(), dec_typed);\r\n        match dec_typed {\r\n            spirv::Decoration::BuiltIn => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.built_in = Some(self.next()?);\r\n            }\r\n            spirv::Decoration::Location => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.location = Some(self.next()?);\r\n            }\r\n            spirv::Decoration::DescriptorSet => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.desc_set = Some(self.next()?);\r\n            }\r\n            spirv::Decoration::Binding => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.desc_index = Some(self.next()?);\r\n            }\r\n            spirv::Decoration::BufferBlock => {\r\n                dec.storage_buffer = true;\r\n            }\r\n            spirv::Decoration::Offset => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.offset = Some(self.next()?);\r\n            }\r\n            spirv::Decoration::ArrayStride => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.array_stride = NonZeroU32::new(self.next()?);\r\n            }\r\n            spirv::Decoration::MatrixStride => {\r\n                inst.expect(base_words + 2)?;\r\n                dec.matrix_stride = NonZeroU32::new(self.next()?);\r\n            }\r\n            spirv::Decoration::Invariant => {\r\n                dec.invariant = true;\r\n            }\r\n            spirv::Decoration::NoPerspective => {\r\n                dec.interpolation = Some(crate::Interpolation::Linear);\r\n            }\r\n            spirv::Decoration::Flat => {\r\n                dec.interpolation = Some(crate::Interpolation::Flat);\r\n            }\r\n            spirv::Decoration::Centroid => {\r\n                dec.sampling = Some(crate::Sampling::Centroid);\r\n            }\r\n            spirv::Decoration::Sample => {\r\n                dec.sampling = Some(crate::Sampling::Sample);\r\n            }\r\n            spirv::Decoration::NonReadable => {\r\n                dec.flags |= DecorationFlags::NON_READABLE;\r\n            }\r\n            spirv::Decoration::NonWritable => {\r\n                dec.flags |= DecorationFlags::NON_WRITABLE;\r\n            }\r\n            spirv::Decoration::ColMajor => {\r\n                dec.matrix_major = Some(Majority::Column);\r\n            }\r\n            spirv::Decoration::RowMajor => {\r\n                dec.matrix_major = Some(Majority::Row);\r\n            }\r\n            spirv::Decoration::SpecId => {\r\n                dec.specialization = Some(self.next()?);\r\n            }\r\n            other => {\r\n                log::warn!(\"Unknown decoration {:?}\", other);\r\n                for _ in base_words + 1..inst.wc {\r\n                    let _var = self.next()?;\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Return the Naga `Expression` for a given SPIR-V result `id`.\r\n    ///\r\n    /// `lookup` must be the `LookupExpression` for `id`.\r\n    ///\r\n    /// SPIR-V result ids can be used by any block dominated by the id's\r\n    /// definition, but Naga `Expressions` are only in scope for the remainder\r\n    /// of their `Statement` subtree. This means that the `Expression` generated\r\n    /// for `id` may no longer be in scope. In such cases, this function takes\r\n    /// care of spilling the value of `id` to a `LocalVariable` which can then\r\n    /// be used anywhere. The SPIR-V domination rule ensures that the\r\n    /// `LocalVariable` has been initialized before it is used.\r\n    ///\r\n    /// The `body_idx` argument should be the index of the `Body` that hopes to\r\n    /// use `id`'s `Expression`.\r\n    fn get_expr_handle(\r\n        &self,\r\n        id: spirv::Word,\r\n        lookup: &LookupExpression,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        body_idx: BodyIndex,\r\n    ) -> Handle<crate::Expression> {\r\n        // What `Body` was `id` defined in?\r\n        let expr_body_idx = ctx\r\n            .body_for_label\r\n            .get(&lookup.block_id)\r\n            .copied()\r\n            .unwrap_or(0);\r\n\r\n        // Don't need to do a load/store if the expression is in the main body\r\n        // or if the expression is in the same body as where the query was\r\n        // requested. The body_idx might actually not be the final one if a loop\r\n        // or conditional occurs but in those cases we know that the new body\r\n        // will be a subscope of the body that was passed so we can still reuse\r\n        // the handle and not issue a load/store.\r\n        if is_parent(body_idx, expr_body_idx, ctx) {\r\n            lookup.handle\r\n        } else {\r\n            // Add a temporary variable of the same type which will be used to\r\n            // store the original expression and used in the current block\r\n            let ty = self.lookup_type[&lookup.type_id].handle;\r\n            let local = ctx.local_arena.append(\r\n                crate::LocalVariable {\r\n                    name: None,\r\n                    ty,\r\n                    init: None,\r\n                },\r\n                crate::Span::default(),\r\n            );\r\n\r\n            block.extend(emitter.finish(ctx.expressions));\r\n            let pointer = ctx.expressions.append(\r\n                crate::Expression::LocalVariable(local),\r\n                crate::Span::default(),\r\n            );\r\n            emitter.start(ctx.expressions);\r\n            let expr = ctx\r\n                .expressions\r\n                .append(crate::Expression::Load { pointer }, crate::Span::default());\r\n\r\n            // Add a slightly odd entry to the phi table, so that while `id`'s\r\n            // `Expression` is still in scope, the usual phi processing will\r\n            // spill its value to `local`, where we can find it later.\r\n            //\r\n            // This pretends that the block in which `id` is defined is the\r\n            // predecessor of some other block with a phi in it that cites id as\r\n            // one of its sources, and uses `local` as its variable. There is no\r\n            // such phi, but nobody needs to know that.\r\n            ctx.phis.push(PhiExpression {\r\n                local,\r\n                expressions: vec![(id, lookup.block_id)],\r\n            });\r\n\r\n            expr\r\n        }\r\n    }\r\n\r\n    fn parse_expr_unary_op(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        op: crate::UnaryOperator,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let p_id = self.next()?;\r\n\r\n        let p_lexp = self.lookup_expression.lookup(p_id)?;\r\n        let handle = self.get_expr_handle(p_id, p_lexp, ctx, emitter, block, body_idx);\r\n\r\n        let expr = crate::Expression::Unary { op, expr: handle };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_expr_binary_op(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        op: crate::BinaryOperator,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let p1_id = self.next()?;\r\n        let p2_id = self.next()?;\r\n\r\n        let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n        let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx);\r\n        let p2_lexp = self.lookup_expression.lookup(p2_id)?;\r\n        let right = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx);\r\n\r\n        let expr = crate::Expression::Binary { op, left, right };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    /// A more complicated version of the unary op,\r\n    /// where we force the operand to have the same type as the result.\r\n    fn parse_expr_unary_op_sign_adjusted(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        op: crate::UnaryOperator,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let p1_id = self.next()?;\r\n        let span = self.span_from_with_op(start);\r\n\r\n        let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n        let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx);\r\n\r\n        let result_lookup_ty = self.lookup_type.lookup(result_type_id)?;\r\n        let kind = ctx.type_arena[result_lookup_ty.handle]\r\n            .inner\r\n            .scalar_kind()\r\n            .unwrap();\r\n\r\n        let expr = crate::Expression::Unary {\r\n            op,\r\n            expr: if p1_lexp.type_id == result_type_id {\r\n                left\r\n            } else {\r\n                ctx.expressions.append(\r\n                    crate::Expression::As {\r\n                        expr: left,\r\n                        kind,\r\n                        convert: None,\r\n                    },\r\n                    span,\r\n                )\r\n            },\r\n        };\r\n\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, span),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    /// A more complicated version of the binary op,\r\n    /// where we force the operand to have the same type as the result.\r\n    /// This is mostly needed for \"i++\" and \"i--\" coming from GLSL.\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn parse_expr_binary_op_sign_adjusted(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        op: crate::BinaryOperator,\r\n        // For arithmetic operations, we need the sign of operands to match the result.\r\n        // For boolean operations, however, the operands need to match the signs, but\r\n        // result is always different - a boolean.\r\n        anchor: SignAnchor,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let p1_id = self.next()?;\r\n        let p2_id = self.next()?;\r\n        let span = self.span_from_with_op(start);\r\n\r\n        let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n        let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx);\r\n        let p2_lexp = self.lookup_expression.lookup(p2_id)?;\r\n        let right = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx);\r\n\r\n        let expected_type_id = match anchor {\r\n            SignAnchor::Result => result_type_id,\r\n            SignAnchor::Operand => p1_lexp.type_id,\r\n        };\r\n        let expected_lookup_ty = self.lookup_type.lookup(expected_type_id)?;\r\n        let kind = ctx.type_arena[expected_lookup_ty.handle]\r\n            .inner\r\n            .scalar_kind()\r\n            .unwrap();\r\n\r\n        let expr = crate::Expression::Binary {\r\n            op,\r\n            left: if p1_lexp.type_id == expected_type_id {\r\n                left\r\n            } else {\r\n                ctx.expressions.append(\r\n                    crate::Expression::As {\r\n                        expr: left,\r\n                        kind,\r\n                        convert: None,\r\n                    },\r\n                    span,\r\n                )\r\n            },\r\n            right: if p2_lexp.type_id == expected_type_id {\r\n                right\r\n            } else {\r\n                ctx.expressions.append(\r\n                    crate::Expression::As {\r\n                        expr: right,\r\n                        kind,\r\n                        convert: None,\r\n                    },\r\n                    span,\r\n                )\r\n            },\r\n        };\r\n\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, span),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    /// A version of the binary op where one or both of the arguments might need to be casted to a\r\n    /// specific integer kind (unsigned or signed), used for operations like OpINotEqual or\r\n    /// OpUGreaterThan.\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn parse_expr_int_comparison(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        op: crate::BinaryOperator,\r\n        kind: crate::ScalarKind,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let p1_id = self.next()?;\r\n        let p2_id = self.next()?;\r\n        let span = self.span_from_with_op(start);\r\n\r\n        let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n        let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx);\r\n        let p1_lookup_ty = self.lookup_type.lookup(p1_lexp.type_id)?;\r\n        let p1_kind = ctx.type_arena[p1_lookup_ty.handle]\r\n            .inner\r\n            .scalar_kind()\r\n            .unwrap();\r\n        let p2_lexp = self.lookup_expression.lookup(p2_id)?;\r\n        let right = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx);\r\n        let p2_lookup_ty = self.lookup_type.lookup(p2_lexp.type_id)?;\r\n        let p2_kind = ctx.type_arena[p2_lookup_ty.handle]\r\n            .inner\r\n            .scalar_kind()\r\n            .unwrap();\r\n\r\n        let expr = crate::Expression::Binary {\r\n            op,\r\n            left: if p1_kind == kind {\r\n                left\r\n            } else {\r\n                ctx.expressions.append(\r\n                    crate::Expression::As {\r\n                        expr: left,\r\n                        kind,\r\n                        convert: None,\r\n                    },\r\n                    span,\r\n                )\r\n            },\r\n            right: if p2_kind == kind {\r\n                right\r\n            } else {\r\n                ctx.expressions.append(\r\n                    crate::Expression::As {\r\n                        expr: right,\r\n                        kind,\r\n                        convert: None,\r\n                    },\r\n                    span,\r\n                )\r\n            },\r\n        };\r\n\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, span),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_expr_shift_op(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        op: crate::BinaryOperator,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let p1_id = self.next()?;\r\n        let p2_id = self.next()?;\r\n\r\n        let span = self.span_from_with_op(start);\r\n\r\n        let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n        let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx);\r\n        let p2_lexp = self.lookup_expression.lookup(p2_id)?;\r\n        let p2_handle = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx);\r\n        // convert the shift to Uint\r\n        let right = ctx.expressions.append(\r\n            crate::Expression::As {\r\n                expr: p2_handle,\r\n                kind: crate::ScalarKind::Uint,\r\n                convert: None,\r\n            },\r\n            span,\r\n        );\r\n\r\n        let expr = crate::Expression::Binary { op, left, right };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, span),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_expr_derivative(\r\n        &mut self,\r\n        ctx: &mut BlockContext,\r\n        emitter: &mut super::Emitter,\r\n        block: &mut crate::Block,\r\n        block_id: spirv::Word,\r\n        body_idx: usize,\r\n        axis: crate::DerivativeAxis,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        let result_type_id = self.next()?;\r\n        let result_id = self.next()?;\r\n        let arg_id = self.next()?;\r\n\r\n        let arg_lexp = self.lookup_expression.lookup(arg_id)?;\r\n        let arg_handle = self.get_expr_handle(arg_id, arg_lexp, ctx, emitter, block, body_idx);\r\n\r\n        let expr = crate::Expression::Derivative {\r\n            axis,\r\n            expr: arg_handle,\r\n        };\r\n        self.lookup_expression.insert(\r\n            result_id,\r\n            LookupExpression {\r\n                handle: ctx.expressions.append(expr, self.span_from_with_op(start)),\r\n                type_id: result_type_id,\r\n                block_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn insert_composite(\r\n        &self,\r\n        root_expr: Handle<crate::Expression>,\r\n        root_type_id: spirv::Word,\r\n        object_expr: Handle<crate::Expression>,\r\n        selections: &[spirv::Word],\r\n        type_arena: &UniqueArena<crate::Type>,\r\n        expressions: &mut Arena<crate::Expression>,\r\n        constants: &Arena<crate::Constant>,\r\n        span: crate::Span,\r\n    ) -> Result<Handle<crate::Expression>, Error> {\r\n        let selection = match selections.first() {\r\n            Some(&index) => index,\r\n            None => return Ok(object_expr),\r\n        };\r\n        let root_span = expressions.get_span(root_expr);\r\n        let root_lookup = self.lookup_type.lookup(root_type_id)?;\r\n        let (count, child_type_id) = match type_arena[root_lookup.handle].inner {\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                let child_member = self\r\n                    .lookup_member\r\n                    .get(&(root_lookup.handle, selection))\r\n                    .ok_or(Error::InvalidAccessType(root_type_id))?;\r\n                (members.len(), child_member.type_id)\r\n            }\r\n            crate::TypeInner::Array { size, .. } => {\r\n                let size = match size {\r\n                    crate::ArraySize::Constant(handle) => match constants[handle] {\r\n                        crate::Constant {\r\n                            specialization: Some(_),\r\n                            ..\r\n                        } => return Err(Error::UnsupportedType(root_lookup.handle)),\r\n                        ref unspecialized => unspecialized\r\n                            .to_array_length()\r\n                            .ok_or(Error::InvalidArraySize(handle))?,\r\n                    },\r\n                    // A runtime sized array is not a composite type\r\n                    crate::ArraySize::Dynamic => {\r\n                        return Err(Error::InvalidAccessType(root_type_id))\r\n                    }\r\n                };\r\n\r\n                let child_type_id = root_lookup\r\n                    .base_id\r\n                    .ok_or(Error::InvalidAccessType(root_type_id))?;\r\n\r\n                (size as usize, child_type_id)\r\n            }\r\n            crate::TypeInner::Vector { size, .. }\r\n            | crate::TypeInner::Matrix { columns: size, .. } => {\r\n                let child_type_id = root_lookup\r\n                    .base_id\r\n                    .ok_or(Error::InvalidAccessType(root_type_id))?;\r\n                (size as usize, child_type_id)\r\n            }\r\n            _ => return Err(Error::InvalidAccessType(root_type_id)),\r\n        };\r\n\r\n        let mut components = Vec::with_capacity(count);\r\n        for index in 0..count as u32 {\r\n            let expr = expressions.append(\r\n                crate::Expression::AccessIndex {\r\n                    base: root_expr,\r\n                    index,\r\n                },\r\n                if index == selection { span } else { root_span },\r\n            );\r\n            components.push(expr);\r\n        }\r\n        components[selection as usize] = self.insert_composite(\r\n            components[selection as usize],\r\n            child_type_id,\r\n            object_expr,\r\n            &selections[1..],\r\n            type_arena,\r\n            expressions,\r\n            constants,\r\n            span,\r\n        )?;\r\n\r\n        Ok(expressions.append(\r\n            crate::Expression::Compose {\r\n                ty: root_lookup.handle,\r\n                components,\r\n            },\r\n            span,\r\n        ))\r\n    }\r\n\r\n    /// Add the next SPIR-V block's contents to `block_ctx`.\r\n    ///\r\n    /// Except for the function's entry block, `block_id` should be the label of\r\n    /// a block we've seen mentioned before, with an entry in\r\n    /// `block_ctx.body_for_label` to tell us which `Body` it contributes to.\r\n    fn next_block(&mut self, block_id: spirv::Word, ctx: &mut BlockContext) -> Result<(), Error> {\r\n        // Extend `body` with the correct form for a branch to `target`.\r\n        fn merger(body: &mut Body, target: &MergeBlockInformation) {\r\n            body.data.push(match *target {\r\n                MergeBlockInformation::LoopContinue => BodyFragment::Continue,\r\n                MergeBlockInformation::LoopMerge | MergeBlockInformation::SwitchMerge => {\r\n                    BodyFragment::Break\r\n                }\r\n\r\n                // Finishing a selection merge means just falling off the end of\r\n                // the `accept` or `reject` block of the `If` statement.\r\n                MergeBlockInformation::SelectionMerge => return,\r\n            })\r\n        }\r\n\r\n        let mut emitter = super::Emitter::default();\r\n        emitter.start(ctx.expressions);\r\n\r\n        // Find the `Body` that this block belongs to. Index zero is the\r\n        // function's root `Body`, corresponding to `Function::body`.\r\n        let mut body_idx = *ctx.body_for_label.entry(block_id).or_default();\r\n        let mut block = crate::Block::new();\r\n        // Stores the merge block as defined by a `OpSelectionMerge` otherwise is `None`\r\n        //\r\n        // This is used in `OpSwitch` to promote the `MergeBlockInformation` from\r\n        // `SelectionMerge` to `SwitchMerge` to allow `Break`s this isn't desirable for\r\n        // `LoopMerge`s because otherwise `Continue`s wouldn't be allowed\r\n        let mut selection_merge_block = None;\r\n\r\n        macro_rules! get_expr_handle {\r\n            ($id:expr, $lexp:expr) => {\r\n                self.get_expr_handle($id, $lexp, ctx, &mut emitter, &mut block, body_idx)\r\n            };\r\n        }\r\n        macro_rules! parse_expr_op {\r\n            ($op:expr, BINARY) => {\r\n                self.parse_expr_binary_op(ctx, &mut emitter, &mut block, block_id, body_idx, $op)\r\n            };\r\n\r\n            ($op:expr, SHIFT) => {\r\n                self.parse_expr_shift_op(ctx, &mut emitter, &mut block, block_id, body_idx, $op)\r\n            };\r\n            ($op:expr, UNARY) => {\r\n                self.parse_expr_unary_op(ctx, &mut emitter, &mut block, block_id, body_idx, $op)\r\n            };\r\n            ($axis:expr, DERIVATIVE) => {\r\n                self.parse_expr_derivative(ctx, &mut emitter, &mut block, block_id, body_idx, $axis)\r\n            };\r\n        }\r\n\r\n        let terminator = loop {\r\n            use spirv::Op;\r\n            let start = self.data_offset;\r\n            let inst = self.next_inst()?;\r\n            let span = crate::Span::from(start..(start + 4 * (inst.wc as usize)));\r\n            log::debug!(\"\\t\\t{:?} [{}]\", inst.op, inst.wc);\r\n\r\n            match inst.op {\r\n                Op::Line => {\r\n                    inst.expect(4)?;\r\n                    let _file_id = self.next()?;\r\n                    let _row_id = self.next()?;\r\n                    let _col_id = self.next()?;\r\n                }\r\n                Op::NoLine => inst.expect(1)?,\r\n                Op::Undef => {\r\n                    inst.expect(3)?;\r\n                    let (type_id, id, handle) =\r\n                        self.parse_null_constant(inst, ctx.type_arena, ctx.const_arena)?;\r\n                    self.lookup_expression.insert(\r\n                        id,\r\n                        LookupExpression {\r\n                            handle: ctx\r\n                                .expressions\r\n                                .append(crate::Expression::Constant(handle), span),\r\n                            type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::Variable => {\r\n                    inst.expect_at_least(4)?;\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let _storage_class = self.next()?;\r\n                    let init = if inst.wc > 4 {\r\n                        inst.expect(5)?;\r\n                        let init_id = self.next()?;\r\n                        let lconst = self.lookup_constant.lookup(init_id)?;\r\n                        Some(lconst.handle)\r\n                    } else {\r\n                        None\r\n                    };\r\n\r\n                    let name = self\r\n                        .future_decor\r\n                        .remove(&result_id)\r\n                        .and_then(|decor| decor.name);\r\n                    if let Some(ref name) = name {\r\n                        log::debug!(\"\\t\\t\\tid={} name={}\", result_id, name);\r\n                    }\r\n                    let lookup_ty = self.lookup_type.lookup(result_type_id)?;\r\n                    let var_handle = ctx.local_arena.append(\r\n                        crate::LocalVariable {\r\n                            name,\r\n                            ty: match ctx.type_arena[lookup_ty.handle].inner {\r\n                                crate::TypeInner::Pointer { base, .. } => base,\r\n                                _ => lookup_ty.handle,\r\n                            },\r\n                            init,\r\n                        },\r\n                        span,\r\n                    );\r\n\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx\r\n                                .expressions\r\n                                .append(crate::Expression::LocalVariable(var_handle), span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                    emitter.start(ctx.expressions);\r\n                }\r\n                Op::Phi => {\r\n                    inst.expect_at_least(3)?;\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n\r\n                    let name = format!(\"phi_{}\", result_id);\r\n                    let local = ctx.local_arena.append(\r\n                        crate::LocalVariable {\r\n                            name: Some(name),\r\n                            ty: self.lookup_type.lookup(result_type_id)?.handle,\r\n                            init: None,\r\n                        },\r\n                        self.span_from(start),\r\n                    );\r\n                    let pointer = ctx\r\n                        .expressions\r\n                        .append(crate::Expression::LocalVariable(local), span);\r\n\r\n                    let in_count = (inst.wc - 3) / 2;\r\n                    let mut phi = PhiExpression {\r\n                        local,\r\n                        expressions: Vec::with_capacity(in_count as usize),\r\n                    };\r\n                    for _ in 0..in_count {\r\n                        let expr = self.next()?;\r\n                        let block = self.next()?;\r\n                        phi.expressions.push((expr, block));\r\n                    }\r\n\r\n                    ctx.phis.push(phi);\r\n                    emitter.start(ctx.expressions);\r\n\r\n                    // Associate the lookup with an actual value, which is emitted\r\n                    // into the current block.\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx\r\n                                .expressions\r\n                                .append(crate::Expression::Load { pointer }, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::AccessChain | Op::InBoundsAccessChain => {\r\n                    struct AccessExpression {\r\n                        base_handle: Handle<crate::Expression>,\r\n                        type_id: spirv::Word,\r\n                        load_override: Option<LookupLoadOverride>,\r\n                    }\r\n\r\n                    inst.expect_at_least(4)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let base_id = self.next()?;\r\n                    log::trace!(\"\\t\\t\\tlooking up expr {:?}\", base_id);\r\n                    let mut acex = {\r\n                        // the base type has to be a pointer,\r\n                        // so we dereference it here for the traversal\r\n                        let lexp = self.lookup_expression.lookup(base_id)?;\r\n                        let lty = self.lookup_type.lookup(lexp.type_id)?;\r\n                        AccessExpression {\r\n                            base_handle: get_expr_handle!(base_id, lexp),\r\n                            type_id: lty.base_id.ok_or(Error::InvalidAccessType(lexp.type_id))?,\r\n                            load_override: self.lookup_load_override.get(&base_id).cloned(),\r\n                        }\r\n                    };\r\n                    for _ in 4..inst.wc {\r\n                        let access_id = self.next()?;\r\n                        log::trace!(\"\\t\\t\\tlooking up index expr {:?}\", access_id);\r\n                        let index_expr = self.lookup_expression.lookup(access_id)?.clone();\r\n                        let index_expr_handle = get_expr_handle!(access_id, &index_expr);\r\n                        let index_expr_data = &ctx.expressions[index_expr.handle];\r\n                        let index_maybe = match *index_expr_data {\r\n                            crate::Expression::Constant(const_handle) => {\r\n                                Some(ctx.const_arena[const_handle].to_array_length().ok_or(\r\n                                    Error::InvalidAccess(crate::Expression::Constant(const_handle)),\r\n                                )?)\r\n                            }\r\n                            _ => None,\r\n                        };\r\n\r\n                        log::trace!(\"\\t\\t\\tlooking up type {:?}\", acex.type_id);\r\n                        let type_lookup = self.lookup_type.lookup(acex.type_id)?;\r\n                        acex = match ctx.type_arena[type_lookup.handle].inner {\r\n                            // can only index a struct with a constant\r\n                            crate::TypeInner::Struct { ref members, .. } => {\r\n                                let index = index_maybe\r\n                                    .ok_or_else(|| Error::InvalidAccess(index_expr_data.clone()))?;\r\n\r\n                                let lookup_member = self\r\n                                    .lookup_member\r\n                                    .get(&(type_lookup.handle, index))\r\n                                    .ok_or(Error::InvalidAccessType(acex.type_id))?;\r\n                                let base_handle = ctx.expressions.append(\r\n                                    crate::Expression::AccessIndex {\r\n                                        base: acex.base_handle,\r\n                                        index,\r\n                                    },\r\n                                    span,\r\n                                );\r\n\r\n                                if let Some(crate::Binding::BuiltIn(built_in)) =\r\n                                    members[index as usize].binding\r\n                                {\r\n                                    self.builtin_usage.insert(built_in);\r\n                                }\r\n\r\n                                AccessExpression {\r\n                                    base_handle,\r\n                                    type_id: lookup_member.type_id,\r\n                                    load_override: if lookup_member.row_major {\r\n                                        debug_assert!(acex.load_override.is_none());\r\n                                        let sub_type_lookup =\r\n                                            self.lookup_type.lookup(lookup_member.type_id)?;\r\n                                        Some(match ctx.type_arena[sub_type_lookup.handle].inner {\r\n                                            // load it transposed, to match column major expectations\r\n                                            crate::TypeInner::Matrix { .. } => {\r\n                                                let loaded = ctx.expressions.append(\r\n                                                    crate::Expression::Load {\r\n                                                        pointer: base_handle,\r\n                                                    },\r\n                                                    span,\r\n                                                );\r\n                                                let transposed = ctx.expressions.append(\r\n                                                    crate::Expression::Math {\r\n                                                        fun: crate::MathFunction::Transpose,\r\n                                                        arg: loaded,\r\n                                                        arg1: None,\r\n                                                        arg2: None,\r\n                                                        arg3: None,\r\n                                                    },\r\n                                                    span,\r\n                                                );\r\n                                                LookupLoadOverride::Loaded(transposed)\r\n                                            }\r\n                                            _ => LookupLoadOverride::Pending,\r\n                                        })\r\n                                    } else {\r\n                                        None\r\n                                    },\r\n                                }\r\n                            }\r\n                            crate::TypeInner::Matrix { .. } => {\r\n                                let load_override = match acex.load_override {\r\n                                    // We are indexing inside a row-major matrix\r\n                                    Some(LookupLoadOverride::Loaded(load_expr)) => {\r\n                                        let index = index_maybe.ok_or_else(|| {\r\n                                            Error::InvalidAccess(index_expr_data.clone())\r\n                                        })?;\r\n                                        let sub_handle = ctx.expressions.append(\r\n                                            crate::Expression::AccessIndex {\r\n                                                base: load_expr,\r\n                                                index,\r\n                                            },\r\n                                            span,\r\n                                        );\r\n                                        Some(LookupLoadOverride::Loaded(sub_handle))\r\n                                    }\r\n                                    _ => None,\r\n                                };\r\n                                let sub_expr = match index_maybe {\r\n                                    Some(index) => crate::Expression::AccessIndex {\r\n                                        base: acex.base_handle,\r\n                                        index,\r\n                                    },\r\n                                    None => crate::Expression::Access {\r\n                                        base: acex.base_handle,\r\n                                        index: index_expr_handle,\r\n                                    },\r\n                                };\r\n                                AccessExpression {\r\n                                    base_handle: ctx.expressions.append(sub_expr, span),\r\n                                    type_id: type_lookup\r\n                                        .base_id\r\n                                        .ok_or(Error::InvalidAccessType(acex.type_id))?,\r\n                                    load_override,\r\n                                }\r\n                            }\r\n                            // This must be a vector or an array.\r\n                            _ => {\r\n                                let base_handle = ctx.expressions.append(\r\n                                    crate::Expression::Access {\r\n                                        base: acex.base_handle,\r\n                                        index: index_expr_handle,\r\n                                    },\r\n                                    span,\r\n                                );\r\n                                let load_override = match acex.load_override {\r\n                                    // If there is a load override in place, then we always end up\r\n                                    // with a side-loaded value here.\r\n                                    Some(lookup_load_override) => {\r\n                                        let sub_expr = match lookup_load_override {\r\n                                            // We must be indexing into the array of row-major matrices.\r\n                                            // Let's load the result of indexing and transpose it.\r\n                                            LookupLoadOverride::Pending => {\r\n                                                let loaded = ctx.expressions.append(\r\n                                                    crate::Expression::Load {\r\n                                                        pointer: base_handle,\r\n                                                    },\r\n                                                    span,\r\n                                                );\r\n                                                ctx.expressions.append(\r\n                                                    crate::Expression::Math {\r\n                                                        fun: crate::MathFunction::Transpose,\r\n                                                        arg: loaded,\r\n                                                        arg1: None,\r\n                                                        arg2: None,\r\n                                                        arg3: None,\r\n                                                    },\r\n                                                    span,\r\n                                                )\r\n                                            }\r\n                                            // We are indexing inside a row-major matrix.\r\n                                            LookupLoadOverride::Loaded(load_expr) => {\r\n                                                ctx.expressions.append(\r\n                                                    crate::Expression::Access {\r\n                                                        base: load_expr,\r\n                                                        index: index_expr_handle,\r\n                                                    },\r\n                                                    span,\r\n                                                )\r\n                                            }\r\n                                        };\r\n                                        Some(LookupLoadOverride::Loaded(sub_expr))\r\n                                    }\r\n                                    None => None,\r\n                                };\r\n                                AccessExpression {\r\n                                    base_handle,\r\n                                    type_id: type_lookup\r\n                                        .base_id\r\n                                        .ok_or(Error::InvalidAccessType(acex.type_id))?,\r\n                                    load_override,\r\n                                }\r\n                            }\r\n                        };\r\n                    }\r\n\r\n                    if let Some(load_expr) = acex.load_override {\r\n                        self.lookup_load_override.insert(result_id, load_expr);\r\n                    }\r\n                    let lookup_expression = LookupExpression {\r\n                        handle: acex.base_handle,\r\n                        type_id: result_type_id,\r\n                        block_id,\r\n                    };\r\n                    self.lookup_expression.insert(result_id, lookup_expression);\r\n                }\r\n                Op::VectorExtractDynamic => {\r\n                    inst.expect(5)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let id = self.next()?;\r\n                    let composite_id = self.next()?;\r\n                    let index_id = self.next()?;\r\n\r\n                    let root_lexp = self.lookup_expression.lookup(composite_id)?;\r\n                    let root_handle = get_expr_handle!(composite_id, root_lexp);\r\n                    let root_type_lookup = self.lookup_type.lookup(root_lexp.type_id)?;\r\n                    let index_lexp = self.lookup_expression.lookup(index_id)?;\r\n                    let index_handle = get_expr_handle!(index_id, index_lexp);\r\n\r\n                    let num_components = match ctx.type_arena[root_type_lookup.handle].inner {\r\n                        crate::TypeInner::Vector { size, .. } => size as usize,\r\n                        _ => return Err(Error::InvalidVectorType(root_type_lookup.handle)),\r\n                    };\r\n\r\n                    let mut handle = ctx.expressions.append(\r\n                        crate::Expression::Access {\r\n                            base: root_handle,\r\n                            index: self.index_constant_expressions[0],\r\n                        },\r\n                        span,\r\n                    );\r\n                    for &index_expr in self.index_constant_expressions[1..num_components].iter() {\r\n                        let access_expr = ctx.expressions.append(\r\n                            crate::Expression::Access {\r\n                                base: root_handle,\r\n                                index: index_expr,\r\n                            },\r\n                            span,\r\n                        );\r\n                        let cond = ctx.expressions.append(\r\n                            crate::Expression::Binary {\r\n                                op: crate::BinaryOperator::Equal,\r\n                                left: index_expr,\r\n                                right: index_handle,\r\n                            },\r\n                            span,\r\n                        );\r\n                        handle = ctx.expressions.append(\r\n                            crate::Expression::Select {\r\n                                condition: cond,\r\n                                accept: access_expr,\r\n                                reject: handle,\r\n                            },\r\n                            span,\r\n                        );\r\n                    }\r\n\r\n                    self.lookup_expression.insert(\r\n                        id,\r\n                        LookupExpression {\r\n                            handle,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::VectorInsertDynamic => {\r\n                    inst.expect(6)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let id = self.next()?;\r\n                    let composite_id = self.next()?;\r\n                    let object_id = self.next()?;\r\n                    let index_id = self.next()?;\r\n\r\n                    let object_lexp = self.lookup_expression.lookup(object_id)?;\r\n                    let object_handle = get_expr_handle!(object_id, object_lexp);\r\n                    let root_lexp = self.lookup_expression.lookup(composite_id)?;\r\n                    let root_handle = get_expr_handle!(composite_id, root_lexp);\r\n                    let root_type_lookup = self.lookup_type.lookup(root_lexp.type_id)?;\r\n                    let index_lexp = self.lookup_expression.lookup(index_id)?;\r\n                    let mut index_handle = get_expr_handle!(index_id, index_lexp);\r\n                    let index_type = self.lookup_type.lookup(index_lexp.type_id)?.handle;\r\n\r\n                    // SPIR-V allows signed and unsigned indices but naga's is strict about\r\n                    // types and since the `index_constants` are all signed integers, we need\r\n                    // to cast the index to a signed integer if it's unsigned.\r\n                    if let Some(crate::ScalarKind::Uint) =\r\n                        ctx.type_arena[index_type].inner.scalar_kind()\r\n                    {\r\n                        index_handle = ctx.expressions.append(\r\n                            crate::Expression::As {\r\n                                expr: index_handle,\r\n                                kind: crate::ScalarKind::Sint,\r\n                                convert: None,\r\n                            },\r\n                            span,\r\n                        )\r\n                    }\r\n\r\n                    let num_components = match ctx.type_arena[root_type_lookup.handle].inner {\r\n                        crate::TypeInner::Vector { size, .. } => size as usize,\r\n                        _ => return Err(Error::InvalidVectorType(root_type_lookup.handle)),\r\n                    };\r\n                    let mut components = Vec::with_capacity(num_components);\r\n                    for &index_expr in self.index_constant_expressions[..num_components].iter() {\r\n                        let access_expr = ctx.expressions.append(\r\n                            crate::Expression::Access {\r\n                                base: root_handle,\r\n                                index: index_expr,\r\n                            },\r\n                            span,\r\n                        );\r\n                        let cond = ctx.expressions.append(\r\n                            crate::Expression::Binary {\r\n                                op: crate::BinaryOperator::Equal,\r\n                                left: index_expr,\r\n                                right: index_handle,\r\n                            },\r\n                            span,\r\n                        );\r\n                        let handle = ctx.expressions.append(\r\n                            crate::Expression::Select {\r\n                                condition: cond,\r\n                                accept: object_handle,\r\n                                reject: access_expr,\r\n                            },\r\n                            span,\r\n                        );\r\n                        components.push(handle);\r\n                    }\r\n                    let handle = ctx.expressions.append(\r\n                        crate::Expression::Compose {\r\n                            ty: root_type_lookup.handle,\r\n                            components,\r\n                        },\r\n                        span,\r\n                    );\r\n\r\n                    self.lookup_expression.insert(\r\n                        id,\r\n                        LookupExpression {\r\n                            handle,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::CompositeExtract => {\r\n                    inst.expect_at_least(4)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let base_id = self.next()?;\r\n                    log::trace!(\"\\t\\t\\tlooking up expr {:?}\", base_id);\r\n                    let mut lexp = self.lookup_expression.lookup(base_id)?.clone();\r\n                    lexp.handle = get_expr_handle!(base_id, &lexp);\r\n                    for _ in 4..inst.wc {\r\n                        let index = self.next()?;\r\n                        log::trace!(\"\\t\\t\\tlooking up type {:?}\", lexp.type_id);\r\n                        let type_lookup = self.lookup_type.lookup(lexp.type_id)?;\r\n                        let type_id = match ctx.type_arena[type_lookup.handle].inner {\r\n                            crate::TypeInner::Struct { .. } => {\r\n                                self.lookup_member\r\n                                    .get(&(type_lookup.handle, index))\r\n                                    .ok_or(Error::InvalidAccessType(lexp.type_id))?\r\n                                    .type_id\r\n                            }\r\n                            crate::TypeInner::Array { .. }\r\n                            | crate::TypeInner::Vector { .. }\r\n                            | crate::TypeInner::Matrix { .. } => type_lookup\r\n                                .base_id\r\n                                .ok_or(Error::InvalidAccessType(lexp.type_id))?,\r\n                            ref other => {\r\n                                log::warn!(\"composite type {:?}\", other);\r\n                                return Err(Error::UnsupportedType(type_lookup.handle));\r\n                            }\r\n                        };\r\n                        lexp = LookupExpression {\r\n                            handle: ctx.expressions.append(\r\n                                crate::Expression::AccessIndex {\r\n                                    base: lexp.handle,\r\n                                    index,\r\n                                },\r\n                                span,\r\n                            ),\r\n                            type_id,\r\n                            block_id,\r\n                        };\r\n                    }\r\n\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: lexp.handle,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::CompositeInsert => {\r\n                    inst.expect_at_least(5)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let id = self.next()?;\r\n                    let object_id = self.next()?;\r\n                    let composite_id = self.next()?;\r\n                    let mut selections = Vec::with_capacity(inst.wc as usize - 5);\r\n                    for _ in 5..inst.wc {\r\n                        selections.push(self.next()?);\r\n                    }\r\n\r\n                    let object_lexp = self.lookup_expression.lookup(object_id)?.clone();\r\n                    let object_handle = get_expr_handle!(object_id, &object_lexp);\r\n                    let root_lexp = self.lookup_expression.lookup(composite_id)?.clone();\r\n                    let root_handle = get_expr_handle!(composite_id, &root_lexp);\r\n                    let handle = self.insert_composite(\r\n                        root_handle,\r\n                        result_type_id,\r\n                        object_handle,\r\n                        &selections,\r\n                        ctx.type_arena,\r\n                        ctx.expressions,\r\n                        ctx.const_arena,\r\n                        span,\r\n                    )?;\r\n\r\n                    self.lookup_expression.insert(\r\n                        id,\r\n                        LookupExpression {\r\n                            handle,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::CompositeConstruct => {\r\n                    inst.expect_at_least(3)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let id = self.next()?;\r\n                    let mut components = Vec::with_capacity(inst.wc as usize - 2);\r\n                    for _ in 3..inst.wc {\r\n                        let comp_id = self.next()?;\r\n                        log::trace!(\"\\t\\t\\tlooking up expr {:?}\", comp_id);\r\n                        let lexp = self.lookup_expression.lookup(comp_id)?;\r\n                        let handle = get_expr_handle!(comp_id, lexp);\r\n                        components.push(handle);\r\n                    }\r\n                    let ty = self.lookup_type.lookup(result_type_id)?.handle;\r\n                    let first = components[0];\r\n                    let expr = match ctx.type_arena[ty].inner {\r\n                        // this is an optimization to detect the splat\r\n                        crate::TypeInner::Vector { size, .. }\r\n                            if components.len() == size as usize\r\n                                && components[1..].iter().all(|&c| c == first) =>\r\n                        {\r\n                            crate::Expression::Splat { size, value: first }\r\n                        }\r\n                        _ => crate::Expression::Compose { ty, components },\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::Load => {\r\n                    inst.expect_at_least(4)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let pointer_id = self.next()?;\r\n                    if inst.wc != 4 {\r\n                        inst.expect(5)?;\r\n                        let _memory_access = self.next()?;\r\n                    }\r\n\r\n                    let base_lexp = self.lookup_expression.lookup(pointer_id)?;\r\n                    let base_handle = get_expr_handle!(pointer_id, base_lexp);\r\n                    let type_lookup = self.lookup_type.lookup(base_lexp.type_id)?;\r\n                    let handle = match ctx.type_arena[type_lookup.handle].inner {\r\n                        crate::TypeInner::Image { .. } | crate::TypeInner::Sampler { .. } => {\r\n                            base_handle\r\n                        }\r\n                        _ => match self.lookup_load_override.get(&pointer_id) {\r\n                            Some(&LookupLoadOverride::Loaded(handle)) => handle,\r\n                            //Note: we aren't handling `LookupLoadOverride::Pending` properly here\r\n                            _ => ctx.expressions.append(\r\n                                crate::Expression::Load {\r\n                                    pointer: base_handle,\r\n                                },\r\n                                span,\r\n                            ),\r\n                        },\r\n                    };\r\n\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::Store => {\r\n                    inst.expect_at_least(3)?;\r\n\r\n                    let pointer_id = self.next()?;\r\n                    let value_id = self.next()?;\r\n                    if inst.wc != 3 {\r\n                        inst.expect(4)?;\r\n                        let _memory_access = self.next()?;\r\n                    }\r\n                    let base_expr = self.lookup_expression.lookup(pointer_id)?;\r\n                    let base_handle = get_expr_handle!(pointer_id, base_expr);\r\n                    let value_expr = self.lookup_expression.lookup(value_id)?;\r\n                    let value_handle = get_expr_handle!(value_id, value_expr);\r\n\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n                    block.push(\r\n                        crate::Statement::Store {\r\n                            pointer: base_handle,\r\n                            value: value_handle,\r\n                        },\r\n                        span,\r\n                    );\r\n                    emitter.start(ctx.expressions);\r\n                }\r\n                // Arithmetic Instructions +, -, *, /, %\r\n                Op::SNegate | Op::FNegate => {\r\n                    inst.expect(4)?;\r\n                    self.parse_expr_unary_op_sign_adjusted(\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                        crate::UnaryOperator::Negate,\r\n                    )?;\r\n                }\r\n                Op::IAdd\r\n                | Op::ISub\r\n                | Op::IMul\r\n                | Op::BitwiseOr\r\n                | Op::BitwiseXor\r\n                | Op::BitwiseAnd\r\n                | Op::SDiv\r\n                | Op::SRem => {\r\n                    inst.expect(5)?;\r\n                    let operator = map_binary_operator(inst.op)?;\r\n                    self.parse_expr_binary_op_sign_adjusted(\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                        operator,\r\n                        SignAnchor::Result,\r\n                    )?;\r\n                }\r\n                Op::IEqual | Op::INotEqual => {\r\n                    inst.expect(5)?;\r\n                    let operator = map_binary_operator(inst.op)?;\r\n                    self.parse_expr_binary_op_sign_adjusted(\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                        operator,\r\n                        SignAnchor::Operand,\r\n                    )?;\r\n                }\r\n                Op::FAdd => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::Add, BINARY)?;\r\n                }\r\n                Op::FSub => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::Subtract, BINARY)?;\r\n                }\r\n                Op::FMul => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::Multiply, BINARY)?;\r\n                }\r\n                Op::UDiv | Op::FDiv => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::Divide, BINARY)?;\r\n                }\r\n                Op::UMod | Op::FRem => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::Modulo, BINARY)?;\r\n                }\r\n                Op::SMod => {\r\n                    inst.expect(5)?;\r\n\r\n                    // x - y * int(floor(float(x) / float(y)))\r\n\r\n                    let start = self.data_offset;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let p1_id = self.next()?;\r\n                    let p2_id = self.next()?;\r\n                    let span = self.span_from_with_op(start);\r\n\r\n                    let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n                    let left = self.get_expr_handle(\r\n                        p1_id,\r\n                        p1_lexp,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        body_idx,\r\n                    );\r\n                    let p2_lexp = self.lookup_expression.lookup(p2_id)?;\r\n                    let right = self.get_expr_handle(\r\n                        p2_id,\r\n                        p2_lexp,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        body_idx,\r\n                    );\r\n\r\n                    let result_ty = self.lookup_type.lookup(result_type_id)?;\r\n                    let inner = &ctx.type_arena[result_ty.handle].inner;\r\n                    let kind = inner.scalar_kind().unwrap();\r\n                    let size = inner.size(ctx.const_arena) as u8;\r\n\r\n                    let left_cast = ctx.expressions.append(\r\n                        crate::Expression::As {\r\n                            expr: left,\r\n                            kind: crate::ScalarKind::Float,\r\n                            convert: Some(size),\r\n                        },\r\n                        span,\r\n                    );\r\n                    let right_cast = ctx.expressions.append(\r\n                        crate::Expression::As {\r\n                            expr: right,\r\n                            kind: crate::ScalarKind::Float,\r\n                            convert: Some(size),\r\n                        },\r\n                        span,\r\n                    );\r\n                    let div = ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Divide,\r\n                            left: left_cast,\r\n                            right: right_cast,\r\n                        },\r\n                        span,\r\n                    );\r\n                    let floor = ctx.expressions.append(\r\n                        crate::Expression::Math {\r\n                            fun: crate::MathFunction::Floor,\r\n                            arg: div,\r\n                            arg1: None,\r\n                            arg2: None,\r\n                            arg3: None,\r\n                        },\r\n                        span,\r\n                    );\r\n                    let cast = ctx.expressions.append(\r\n                        crate::Expression::As {\r\n                            expr: floor,\r\n                            kind,\r\n                            convert: Some(size),\r\n                        },\r\n                        span,\r\n                    );\r\n                    let mult = ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Multiply,\r\n                            left: cast,\r\n                            right,\r\n                        },\r\n                        span,\r\n                    );\r\n                    let sub = ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Subtract,\r\n                            left,\r\n                            right: mult,\r\n                        },\r\n                        span,\r\n                    );\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: sub,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::FMod => {\r\n                    inst.expect(5)?;\r\n\r\n                    // x - y * floor(x / y)\r\n\r\n                    let start = self.data_offset;\r\n                    let span = self.span_from_with_op(start);\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let p1_id = self.next()?;\r\n                    let p2_id = self.next()?;\r\n\r\n                    let p1_lexp = self.lookup_expression.lookup(p1_id)?;\r\n                    let left = self.get_expr_handle(\r\n                        p1_id,\r\n                        p1_lexp,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        body_idx,\r\n                    );\r\n                    let p2_lexp = self.lookup_expression.lookup(p2_id)?;\r\n                    let right = self.get_expr_handle(\r\n                        p2_id,\r\n                        p2_lexp,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        body_idx,\r\n                    );\r\n\r\n                    let div = ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Divide,\r\n                            left,\r\n                            right,\r\n                        },\r\n                        span,\r\n                    );\r\n                    let floor = ctx.expressions.append(\r\n                        crate::Expression::Math {\r\n                            fun: crate::MathFunction::Floor,\r\n                            arg: div,\r\n                            arg1: None,\r\n                            arg2: None,\r\n                            arg3: None,\r\n                        },\r\n                        span,\r\n                    );\r\n                    let mult = ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Multiply,\r\n                            left: floor,\r\n                            right,\r\n                        },\r\n                        span,\r\n                    );\r\n                    let sub = ctx.expressions.append(\r\n                        crate::Expression::Binary {\r\n                            op: crate::BinaryOperator::Subtract,\r\n                            left,\r\n                            right: mult,\r\n                        },\r\n                        span,\r\n                    );\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: sub,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::VectorTimesScalar\r\n                | Op::VectorTimesMatrix\r\n                | Op::MatrixTimesScalar\r\n                | Op::MatrixTimesVector\r\n                | Op::MatrixTimesMatrix => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::Multiply, BINARY)?;\r\n                }\r\n                Op::Transpose => {\r\n                    inst.expect(4)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let matrix_id = self.next()?;\r\n                    let matrix_lexp = self.lookup_expression.lookup(matrix_id)?;\r\n                    let matrix_handle = get_expr_handle!(matrix_id, matrix_lexp);\r\n                    let expr = crate::Expression::Math {\r\n                        fun: crate::MathFunction::Transpose,\r\n                        arg: matrix_handle,\r\n                        arg1: None,\r\n                        arg2: None,\r\n                        arg3: None,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::Dot => {\r\n                    inst.expect(5)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let left_id = self.next()?;\r\n                    let right_id = self.next()?;\r\n                    let left_lexp = self.lookup_expression.lookup(left_id)?;\r\n                    let left_handle = get_expr_handle!(left_id, left_lexp);\r\n                    let right_lexp = self.lookup_expression.lookup(right_id)?;\r\n                    let right_handle = get_expr_handle!(right_id, right_lexp);\r\n                    let expr = crate::Expression::Math {\r\n                        fun: crate::MathFunction::Dot,\r\n                        arg: left_handle,\r\n                        arg1: Some(right_handle),\r\n                        arg2: None,\r\n                        arg3: None,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::BitFieldInsert => {\r\n                    inst.expect(7)?;\r\n\r\n                    let start = self.data_offset;\r\n                    let span = self.span_from_with_op(start);\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let base_id = self.next()?;\r\n                    let insert_id = self.next()?;\r\n                    let offset_id = self.next()?;\r\n                    let count_id = self.next()?;\r\n                    let base_lexp = self.lookup_expression.lookup(base_id)?;\r\n                    let base_handle = get_expr_handle!(base_id, base_lexp);\r\n                    let insert_lexp = self.lookup_expression.lookup(insert_id)?;\r\n                    let insert_handle = get_expr_handle!(insert_id, insert_lexp);\r\n                    let offset_lexp = self.lookup_expression.lookup(offset_id)?;\r\n                    let offset_handle = get_expr_handle!(offset_id, offset_lexp);\r\n                    let offset_lookup_ty = self.lookup_type.lookup(offset_lexp.type_id)?;\r\n                    let count_lexp = self.lookup_expression.lookup(count_id)?;\r\n                    let count_handle = get_expr_handle!(count_id, count_lexp);\r\n                    let count_lookup_ty = self.lookup_type.lookup(count_lexp.type_id)?;\r\n\r\n                    let offset_kind = ctx.type_arena[offset_lookup_ty.handle]\r\n                        .inner\r\n                        .scalar_kind()\r\n                        .unwrap();\r\n                    let count_kind = ctx.type_arena[count_lookup_ty.handle]\r\n                        .inner\r\n                        .scalar_kind()\r\n                        .unwrap();\r\n\r\n                    let offset_cast_handle = if offset_kind != crate::ScalarKind::Uint {\r\n                        ctx.expressions.append(\r\n                            crate::Expression::As {\r\n                                expr: offset_handle,\r\n                                kind: crate::ScalarKind::Uint,\r\n                                convert: None,\r\n                            },\r\n                            span,\r\n                        )\r\n                    } else {\r\n                        offset_handle\r\n                    };\r\n\r\n                    let count_cast_handle = if count_kind != crate::ScalarKind::Uint {\r\n                        ctx.expressions.append(\r\n                            crate::Expression::As {\r\n                                expr: count_handle,\r\n                                kind: crate::ScalarKind::Uint,\r\n                                convert: None,\r\n                            },\r\n                            span,\r\n                        )\r\n                    } else {\r\n                        count_handle\r\n                    };\r\n\r\n                    let expr = crate::Expression::Math {\r\n                        fun: crate::MathFunction::InsertBits,\r\n                        arg: base_handle,\r\n                        arg1: Some(insert_handle),\r\n                        arg2: Some(offset_cast_handle),\r\n                        arg3: Some(count_cast_handle),\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::BitFieldSExtract | Op::BitFieldUExtract => {\r\n                    inst.expect(6)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let base_id = self.next()?;\r\n                    let offset_id = self.next()?;\r\n                    let count_id = self.next()?;\r\n                    let base_lexp = self.lookup_expression.lookup(base_id)?;\r\n                    let base_handle = get_expr_handle!(base_id, base_lexp);\r\n                    let offset_lexp = self.lookup_expression.lookup(offset_id)?;\r\n                    let offset_handle = get_expr_handle!(offset_id, offset_lexp);\r\n                    let offset_lookup_ty = self.lookup_type.lookup(offset_lexp.type_id)?;\r\n                    let count_lexp = self.lookup_expression.lookup(count_id)?;\r\n                    let count_handle = get_expr_handle!(count_id, count_lexp);\r\n                    let count_lookup_ty = self.lookup_type.lookup(count_lexp.type_id)?;\r\n\r\n                    let offset_kind = ctx.type_arena[offset_lookup_ty.handle]\r\n                        .inner\r\n                        .scalar_kind()\r\n                        .unwrap();\r\n                    let count_kind = ctx.type_arena[count_lookup_ty.handle]\r\n                        .inner\r\n                        .scalar_kind()\r\n                        .unwrap();\r\n\r\n                    let offset_cast_handle = if offset_kind != crate::ScalarKind::Uint {\r\n                        ctx.expressions.append(\r\n                            crate::Expression::As {\r\n                                expr: offset_handle,\r\n                                kind: crate::ScalarKind::Uint,\r\n                                convert: None,\r\n                            },\r\n                            span,\r\n                        )\r\n                    } else {\r\n                        offset_handle\r\n                    };\r\n\r\n                    let count_cast_handle = if count_kind != crate::ScalarKind::Uint {\r\n                        ctx.expressions.append(\r\n                            crate::Expression::As {\r\n                                expr: count_handle,\r\n                                kind: crate::ScalarKind::Uint,\r\n                                convert: None,\r\n                            },\r\n                            span,\r\n                        )\r\n                    } else {\r\n                        count_handle\r\n                    };\r\n\r\n                    let expr = crate::Expression::Math {\r\n                        fun: crate::MathFunction::ExtractBits,\r\n                        arg: base_handle,\r\n                        arg1: Some(offset_cast_handle),\r\n                        arg2: Some(count_cast_handle),\r\n                        arg3: None,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::BitReverse | Op::BitCount => {\r\n                    inst.expect(4)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let base_id = self.next()?;\r\n                    let base_lexp = self.lookup_expression.lookup(base_id)?;\r\n                    let base_handle = get_expr_handle!(base_id, base_lexp);\r\n                    let expr = crate::Expression::Math {\r\n                        fun: match inst.op {\r\n                            Op::BitReverse => crate::MathFunction::ReverseBits,\r\n                            Op::BitCount => crate::MathFunction::CountOneBits,\r\n                            _ => unreachable!(),\r\n                        },\r\n                        arg: base_handle,\r\n                        arg1: None,\r\n                        arg2: None,\r\n                        arg3: None,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::OuterProduct => {\r\n                    inst.expect(5)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let left_id = self.next()?;\r\n                    let right_id = self.next()?;\r\n                    let left_lexp = self.lookup_expression.lookup(left_id)?;\r\n                    let left_handle = get_expr_handle!(left_id, left_lexp);\r\n                    let right_lexp = self.lookup_expression.lookup(right_id)?;\r\n                    let right_handle = get_expr_handle!(right_id, right_lexp);\r\n                    let expr = crate::Expression::Math {\r\n                        fun: crate::MathFunction::Outer,\r\n                        arg: left_handle,\r\n                        arg1: Some(right_handle),\r\n                        arg2: None,\r\n                        arg3: None,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                // Bitwise instructions\r\n                Op::Not => {\r\n                    inst.expect(4)?;\r\n                    self.parse_expr_unary_op_sign_adjusted(\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                        crate::UnaryOperator::Not,\r\n                    )?;\r\n                }\r\n                Op::ShiftRightLogical => {\r\n                    inst.expect(5)?;\r\n                    //TODO: convert input and result to usigned\r\n                    parse_expr_op!(crate::BinaryOperator::ShiftRight, SHIFT)?;\r\n                }\r\n                Op::ShiftRightArithmetic => {\r\n                    inst.expect(5)?;\r\n                    //TODO: convert input and result to signed\r\n                    parse_expr_op!(crate::BinaryOperator::ShiftRight, SHIFT)?;\r\n                }\r\n                Op::ShiftLeftLogical => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::ShiftLeft, SHIFT)?;\r\n                }\r\n                // Sampling\r\n                Op::Image => {\r\n                    inst.expect(4)?;\r\n                    self.parse_image_uncouple(block_id)?;\r\n                }\r\n                Op::SampledImage => {\r\n                    inst.expect(5)?;\r\n                    self.parse_image_couple()?;\r\n                }\r\n                Op::ImageWrite => {\r\n                    let extra = inst.expect_at_least(4)?;\r\n                    let stmt =\r\n                        self.parse_image_write(extra, ctx, &mut emitter, &mut block, body_idx)?;\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n                    block.push(stmt, span);\r\n                    emitter.start(ctx.expressions);\r\n                }\r\n                Op::ImageFetch | Op::ImageRead => {\r\n                    let extra = inst.expect_at_least(5)?;\r\n                    self.parse_image_load(\r\n                        extra,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageSampleImplicitLod | Op::ImageSampleExplicitLod => {\r\n                    let extra = inst.expect_at_least(5)?;\r\n                    let options = image::SamplingOptions {\r\n                        compare: false,\r\n                        project: false,\r\n                    };\r\n                    self.parse_image_sample(\r\n                        extra,\r\n                        options,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageSampleProjImplicitLod | Op::ImageSampleProjExplicitLod => {\r\n                    let extra = inst.expect_at_least(5)?;\r\n                    let options = image::SamplingOptions {\r\n                        compare: false,\r\n                        project: true,\r\n                    };\r\n                    self.parse_image_sample(\r\n                        extra,\r\n                        options,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageSampleDrefImplicitLod | Op::ImageSampleDrefExplicitLod => {\r\n                    let extra = inst.expect_at_least(6)?;\r\n                    let options = image::SamplingOptions {\r\n                        compare: true,\r\n                        project: false,\r\n                    };\r\n                    self.parse_image_sample(\r\n                        extra,\r\n                        options,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageSampleProjDrefImplicitLod | Op::ImageSampleProjDrefExplicitLod => {\r\n                    let extra = inst.expect_at_least(6)?;\r\n                    let options = image::SamplingOptions {\r\n                        compare: true,\r\n                        project: true,\r\n                    };\r\n                    self.parse_image_sample(\r\n                        extra,\r\n                        options,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageQuerySize => {\r\n                    inst.expect(4)?;\r\n                    self.parse_image_query_size(\r\n                        false,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageQuerySizeLod => {\r\n                    inst.expect(5)?;\r\n                    self.parse_image_query_size(\r\n                        true,\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                    )?;\r\n                }\r\n                Op::ImageQueryLevels => {\r\n                    inst.expect(4)?;\r\n                    self.parse_image_query_other(\r\n                        crate::ImageQuery::NumLevels,\r\n                        ctx.expressions,\r\n                        block_id,\r\n                    )?;\r\n                }\r\n                Op::ImageQuerySamples => {\r\n                    inst.expect(4)?;\r\n                    self.parse_image_query_other(\r\n                        crate::ImageQuery::NumSamples,\r\n                        ctx.expressions,\r\n                        block_id,\r\n                    )?;\r\n                }\r\n                // other ops\r\n                Op::Select => {\r\n                    inst.expect(6)?;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let condition = self.next()?;\r\n                    let o1_id = self.next()?;\r\n                    let o2_id = self.next()?;\r\n\r\n                    let cond_lexp = self.lookup_expression.lookup(condition)?;\r\n                    let cond_handle = get_expr_handle!(condition, cond_lexp);\r\n                    let o1_lexp = self.lookup_expression.lookup(o1_id)?;\r\n                    let o1_handle = get_expr_handle!(o1_id, o1_lexp);\r\n                    let o2_lexp = self.lookup_expression.lookup(o2_id)?;\r\n                    let o2_handle = get_expr_handle!(o2_id, o2_lexp);\r\n\r\n                    let expr = crate::Expression::Select {\r\n                        condition: cond_handle,\r\n                        accept: o1_handle,\r\n                        reject: o2_handle,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::VectorShuffle => {\r\n                    inst.expect_at_least(5)?;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let v1_id = self.next()?;\r\n                    let v2_id = self.next()?;\r\n\r\n                    let v1_lexp = self.lookup_expression.lookup(v1_id)?;\r\n                    let v1_lty = self.lookup_type.lookup(v1_lexp.type_id)?;\r\n                    let v1_handle = get_expr_handle!(v1_id, v1_lexp);\r\n                    let n1 = match ctx.type_arena[v1_lty.handle].inner {\r\n                        crate::TypeInner::Vector { size, .. } => size as u32,\r\n                        _ => return Err(Error::InvalidInnerType(v1_lexp.type_id)),\r\n                    };\r\n                    let v2_lexp = self.lookup_expression.lookup(v2_id)?;\r\n                    let v2_lty = self.lookup_type.lookup(v2_lexp.type_id)?;\r\n                    let v2_handle = get_expr_handle!(v2_id, v2_lexp);\r\n                    let n2 = match ctx.type_arena[v2_lty.handle].inner {\r\n                        crate::TypeInner::Vector { size, .. } => size as u32,\r\n                        _ => return Err(Error::InvalidInnerType(v2_lexp.type_id)),\r\n                    };\r\n\r\n                    self.temp_bytes.clear();\r\n                    let mut max_component = 0;\r\n                    for _ in 5..inst.wc as usize {\r\n                        let mut index = self.next()?;\r\n                        if index == u32::MAX {\r\n                            // treat Undefined as X\r\n                            index = 0;\r\n                        }\r\n                        max_component = max_component.max(index);\r\n                        self.temp_bytes.push(index as u8);\r\n                    }\r\n\r\n                    // Check for swizzle first.\r\n                    let expr = if max_component < n1 {\r\n                        use crate::SwizzleComponent as Sc;\r\n                        let size = match self.temp_bytes.len() {\r\n                            2 => crate::VectorSize::Bi,\r\n                            3 => crate::VectorSize::Tri,\r\n                            _ => crate::VectorSize::Quad,\r\n                        };\r\n                        let mut pattern = [Sc::X; 4];\r\n                        for (pat, index) in pattern.iter_mut().zip(self.temp_bytes.drain(..)) {\r\n                            *pat = match index {\r\n                                0 => Sc::X,\r\n                                1 => Sc::Y,\r\n                                2 => Sc::Z,\r\n                                _ => Sc::W,\r\n                            };\r\n                        }\r\n                        crate::Expression::Swizzle {\r\n                            size,\r\n                            vector: v1_handle,\r\n                            pattern,\r\n                        }\r\n                    } else {\r\n                        // Fall back to access + compose\r\n                        let mut components = Vec::with_capacity(self.temp_bytes.len());\r\n                        for index in self.temp_bytes.drain(..).map(|i| i as u32) {\r\n                            let expr = if index < n1 {\r\n                                crate::Expression::AccessIndex {\r\n                                    base: v1_handle,\r\n                                    index,\r\n                                }\r\n                            } else if index < n1 + n2 {\r\n                                crate::Expression::AccessIndex {\r\n                                    base: v2_handle,\r\n                                    index: index - n1,\r\n                                }\r\n                            } else {\r\n                                return Err(Error::InvalidAccessIndex(index));\r\n                            };\r\n                            components.push(ctx.expressions.append(expr, span));\r\n                        }\r\n                        crate::Expression::Compose {\r\n                            ty: self.lookup_type.lookup(result_type_id)?.handle,\r\n                            components,\r\n                        }\r\n                    };\r\n\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::Bitcast\r\n                | Op::ConvertSToF\r\n                | Op::ConvertUToF\r\n                | Op::ConvertFToU\r\n                | Op::ConvertFToS\r\n                | Op::FConvert\r\n                | Op::UConvert\r\n                | Op::SConvert => {\r\n                    inst.expect(4)?;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let value_id = self.next()?;\r\n\r\n                    let value_lexp = self.lookup_expression.lookup(value_id)?;\r\n                    let ty_lookup = self.lookup_type.lookup(result_type_id)?;\r\n                    let (kind, width) = match ctx.type_arena[ty_lookup.handle].inner {\r\n                        crate::TypeInner::Scalar { kind, width }\r\n                        | crate::TypeInner::Vector { kind, width, .. } => (kind, width),\r\n                        crate::TypeInner::Matrix { width, .. } => (crate::ScalarKind::Float, width),\r\n                        _ => return Err(Error::InvalidAsType(ty_lookup.handle)),\r\n                    };\r\n\r\n                    let expr = crate::Expression::As {\r\n                        expr: get_expr_handle!(value_id, value_lexp),\r\n                        kind,\r\n                        convert: if kind == crate::ScalarKind::Bool {\r\n                            Some(crate::BOOL_WIDTH)\r\n                        } else if inst.op == Op::Bitcast {\r\n                            None\r\n                        } else {\r\n                            Some(width)\r\n                        },\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::FunctionCall => {\r\n                    inst.expect_at_least(4)?;\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let func_id = self.next()?;\r\n\r\n                    let mut arguments = Vec::with_capacity(inst.wc as usize - 4);\r\n                    for _ in 0..arguments.capacity() {\r\n                        let arg_id = self.next()?;\r\n                        let lexp = self.lookup_expression.lookup(arg_id)?;\r\n                        arguments.push(get_expr_handle!(arg_id, lexp));\r\n                    }\r\n\r\n                    // We just need an unique handle here, nothing more.\r\n                    let function = self.add_call(ctx.function_id, func_id);\r\n\r\n                    let result = if self.lookup_void_type == Some(result_type_id) {\r\n                        None\r\n                    } else {\r\n                        let expr_handle = ctx\r\n                            .expressions\r\n                            .append(crate::Expression::CallResult(function), span);\r\n                        self.lookup_expression.insert(\r\n                            result_id,\r\n                            LookupExpression {\r\n                                handle: expr_handle,\r\n                                type_id: result_type_id,\r\n                                block_id,\r\n                            },\r\n                        );\r\n                        Some(expr_handle)\r\n                    };\r\n                    block.push(\r\n                        crate::Statement::Call {\r\n                            function,\r\n                            arguments,\r\n                            result,\r\n                        },\r\n                        span,\r\n                    );\r\n                    emitter.start(ctx.expressions);\r\n                }\r\n                Op::ExtInst => {\r\n                    use crate::MathFunction as Mf;\r\n                    use spirv::GLOp as Glo;\r\n\r\n                    let base_wc = 5;\r\n                    inst.expect_at_least(base_wc)?;\r\n\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let set_id = self.next()?;\r\n                    if Some(set_id) != self.ext_glsl_id {\r\n                        return Err(Error::UnsupportedExtInstSet(set_id));\r\n                    }\r\n                    let inst_id = self.next()?;\r\n                    let gl_op = Glo::from_u32(inst_id).ok_or(Error::UnsupportedExtInst(inst_id))?;\r\n\r\n                    let fun = match gl_op {\r\n                        Glo::Round => Mf::Round,\r\n                        Glo::RoundEven => Mf::Round,\r\n                        Glo::Trunc => Mf::Trunc,\r\n                        Glo::FAbs | Glo::SAbs => Mf::Abs,\r\n                        Glo::FSign | Glo::SSign => Mf::Sign,\r\n                        Glo::Floor => Mf::Floor,\r\n                        Glo::Ceil => Mf::Ceil,\r\n                        Glo::Fract => Mf::Fract,\r\n                        Glo::Sin => Mf::Sin,\r\n                        Glo::Cos => Mf::Cos,\r\n                        Glo::Tan => Mf::Tan,\r\n                        Glo::Asin => Mf::Asin,\r\n                        Glo::Acos => Mf::Acos,\r\n                        Glo::Atan => Mf::Atan,\r\n                        Glo::Sinh => Mf::Sinh,\r\n                        Glo::Cosh => Mf::Cosh,\r\n                        Glo::Tanh => Mf::Tanh,\r\n                        Glo::Atan2 => Mf::Atan2,\r\n                        Glo::Asinh => Mf::Asinh,\r\n                        Glo::Acosh => Mf::Acosh,\r\n                        Glo::Atanh => Mf::Atanh,\r\n                        Glo::Radians => Mf::Radians,\r\n                        Glo::Degrees => Mf::Degrees,\r\n                        Glo::Pow => Mf::Pow,\r\n                        Glo::Exp => Mf::Exp,\r\n                        Glo::Log => Mf::Log,\r\n                        Glo::Exp2 => Mf::Exp2,\r\n                        Glo::Log2 => Mf::Log2,\r\n                        Glo::Sqrt => Mf::Sqrt,\r\n                        Glo::InverseSqrt => Mf::InverseSqrt,\r\n                        Glo::MatrixInverse => Mf::Inverse,\r\n                        Glo::Determinant => Mf::Determinant,\r\n                        Glo::Modf => Mf::Modf,\r\n                        Glo::FMin | Glo::UMin | Glo::SMin | Glo::NMin => Mf::Min,\r\n                        Glo::FMax | Glo::UMax | Glo::SMax | Glo::NMax => Mf::Max,\r\n                        Glo::FClamp | Glo::UClamp | Glo::SClamp | Glo::NClamp => Mf::Clamp,\r\n                        Glo::FMix => Mf::Mix,\r\n                        Glo::Step => Mf::Step,\r\n                        Glo::SmoothStep => Mf::SmoothStep,\r\n                        Glo::Fma => Mf::Fma,\r\n                        Glo::Frexp => Mf::Frexp, //TODO: FrexpStruct?\r\n                        Glo::Ldexp => Mf::Ldexp,\r\n                        Glo::Length => Mf::Length,\r\n                        Glo::Distance => Mf::Distance,\r\n                        Glo::Cross => Mf::Cross,\r\n                        Glo::Normalize => Mf::Normalize,\r\n                        Glo::FaceForward => Mf::FaceForward,\r\n                        Glo::Reflect => Mf::Reflect,\r\n                        Glo::Refract => Mf::Refract,\r\n                        Glo::PackUnorm4x8 => Mf::Pack4x8unorm,\r\n                        Glo::PackSnorm4x8 => Mf::Pack4x8snorm,\r\n                        Glo::PackHalf2x16 => Mf::Pack2x16float,\r\n                        Glo::PackUnorm2x16 => Mf::Pack2x16unorm,\r\n                        Glo::PackSnorm2x16 => Mf::Pack2x16snorm,\r\n                        Glo::UnpackUnorm4x8 => Mf::Unpack4x8unorm,\r\n                        Glo::UnpackSnorm4x8 => Mf::Unpack4x8snorm,\r\n                        Glo::UnpackHalf2x16 => Mf::Unpack2x16float,\r\n                        Glo::UnpackUnorm2x16 => Mf::Unpack2x16unorm,\r\n                        Glo::UnpackSnorm2x16 => Mf::Unpack2x16snorm,\r\n                        Glo::FindILsb => Mf::FindLsb,\r\n                        Glo::FindUMsb | Glo::FindSMsb => Mf::FindMsb,\r\n                        _ => return Err(Error::UnsupportedExtInst(inst_id)),\r\n                    };\r\n\r\n                    let arg_count = fun.argument_count();\r\n                    inst.expect(base_wc + arg_count as u16)?;\r\n                    let arg = {\r\n                        let arg_id = self.next()?;\r\n                        let lexp = self.lookup_expression.lookup(arg_id)?;\r\n                        get_expr_handle!(arg_id, lexp)\r\n                    };\r\n                    let arg1 = if arg_count > 1 {\r\n                        let arg_id = self.next()?;\r\n                        let lexp = self.lookup_expression.lookup(arg_id)?;\r\n                        Some(get_expr_handle!(arg_id, lexp))\r\n                    } else {\r\n                        None\r\n                    };\r\n                    let arg2 = if arg_count > 2 {\r\n                        let arg_id = self.next()?;\r\n                        let lexp = self.lookup_expression.lookup(arg_id)?;\r\n                        Some(get_expr_handle!(arg_id, lexp))\r\n                    } else {\r\n                        None\r\n                    };\r\n                    let arg3 = if arg_count > 3 {\r\n                        let arg_id = self.next()?;\r\n                        let lexp = self.lookup_expression.lookup(arg_id)?;\r\n                        Some(get_expr_handle!(arg_id, lexp))\r\n                    } else {\r\n                        None\r\n                    };\r\n\r\n                    let expr = crate::Expression::Math {\r\n                        fun,\r\n                        arg,\r\n                        arg1,\r\n                        arg2,\r\n                        arg3,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                // Relational and Logical Instructions\r\n                Op::LogicalNot => {\r\n                    inst.expect(4)?;\r\n                    parse_expr_op!(crate::UnaryOperator::Not, UNARY)?;\r\n                }\r\n                Op::LogicalOr => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::LogicalOr, BINARY)?;\r\n                }\r\n                Op::LogicalAnd => {\r\n                    inst.expect(5)?;\r\n                    parse_expr_op!(crate::BinaryOperator::LogicalAnd, BINARY)?;\r\n                }\r\n                Op::SGreaterThan | Op::SGreaterThanEqual | Op::SLessThan | Op::SLessThanEqual => {\r\n                    inst.expect(5)?;\r\n                    self.parse_expr_int_comparison(\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                        map_binary_operator(inst.op)?,\r\n                        crate::ScalarKind::Sint,\r\n                    )?;\r\n                }\r\n                Op::UGreaterThan | Op::UGreaterThanEqual | Op::ULessThan | Op::ULessThanEqual => {\r\n                    inst.expect(5)?;\r\n                    self.parse_expr_int_comparison(\r\n                        ctx,\r\n                        &mut emitter,\r\n                        &mut block,\r\n                        block_id,\r\n                        body_idx,\r\n                        map_binary_operator(inst.op)?,\r\n                        crate::ScalarKind::Uint,\r\n                    )?;\r\n                }\r\n                Op::FOrdEqual\r\n                | Op::FUnordEqual\r\n                | Op::FOrdNotEqual\r\n                | Op::FUnordNotEqual\r\n                | Op::FOrdLessThan\r\n                | Op::FUnordLessThan\r\n                | Op::FOrdGreaterThan\r\n                | Op::FUnordGreaterThan\r\n                | Op::FOrdLessThanEqual\r\n                | Op::FUnordLessThanEqual\r\n                | Op::FOrdGreaterThanEqual\r\n                | Op::FUnordGreaterThanEqual\r\n                | Op::LogicalEqual\r\n                | Op::LogicalNotEqual => {\r\n                    inst.expect(5)?;\r\n                    let operator = map_binary_operator(inst.op)?;\r\n                    parse_expr_op!(operator, BINARY)?;\r\n                }\r\n                Op::Any | Op::All | Op::IsNan | Op::IsInf | Op::IsFinite | Op::IsNormal => {\r\n                    inst.expect(4)?;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let arg_id = self.next()?;\r\n\r\n                    let arg_lexp = self.lookup_expression.lookup(arg_id)?;\r\n                    let arg_handle = get_expr_handle!(arg_id, arg_lexp);\r\n\r\n                    let expr = crate::Expression::Relational {\r\n                        fun: map_relational_fun(inst.op)?,\r\n                        argument: arg_handle,\r\n                    };\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: ctx.expressions.append(expr, span),\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::Kill => {\r\n                    inst.expect(1)?;\r\n                    break Some(crate::Statement::Kill);\r\n                }\r\n                Op::Unreachable => {\r\n                    inst.expect(1)?;\r\n                    break None;\r\n                }\r\n                Op::Return => {\r\n                    inst.expect(1)?;\r\n                    break Some(crate::Statement::Return { value: None });\r\n                }\r\n                Op::ReturnValue => {\r\n                    inst.expect(2)?;\r\n                    let value_id = self.next()?;\r\n                    let value_lexp = self.lookup_expression.lookup(value_id)?;\r\n                    let value_handle = get_expr_handle!(value_id, value_lexp);\r\n                    break Some(crate::Statement::Return {\r\n                        value: Some(value_handle),\r\n                    });\r\n                }\r\n                Op::Branch => {\r\n                    inst.expect(2)?;\r\n                    let target_id = self.next()?;\r\n\r\n                    // If this is a branch to a merge or continue block,\r\n                    // then that ends the current body.\r\n                    if let Some(info) = ctx.mergers.get(&target_id) {\r\n                        block.extend(emitter.finish(ctx.expressions));\r\n                        ctx.blocks.insert(block_id, block);\r\n                        let body = &mut ctx.bodies[body_idx];\r\n                        body.data.push(BodyFragment::BlockId(block_id));\r\n\r\n                        merger(body, info);\r\n\r\n                        return Ok(());\r\n                    }\r\n\r\n                    // Since the target of the branch has no merge information,\r\n                    // this must be the only branch to that block. This means\r\n                    // we can treat it as an extension of the current `Body`.\r\n                    //\r\n                    // NOTE: it's possible that another branch was already made to this block\r\n                    // setting the body index in which case it SHOULD NOT be overridden.\r\n                    // For example a switch with falltrough, the OpSwitch will set the body to\r\n                    // the respective case and the case may branch to another case in which case\r\n                    // the body index shouldn't be changed\r\n                    ctx.body_for_label.entry(target_id).or_insert(body_idx);\r\n\r\n                    break None;\r\n                }\r\n                Op::BranchConditional => {\r\n                    inst.expect_at_least(4)?;\r\n\r\n                    let condition = {\r\n                        let condition_id = self.next()?;\r\n                        let lexp = self.lookup_expression.lookup(condition_id)?;\r\n                        get_expr_handle!(condition_id, lexp)\r\n                    };\r\n\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n                    ctx.blocks.insert(block_id, block);\r\n                    let body = &mut ctx.bodies[body_idx];\r\n                    body.data.push(BodyFragment::BlockId(block_id));\r\n\r\n                    let true_id = self.next()?;\r\n                    let false_id = self.next()?;\r\n\r\n                    let same_target = true_id == false_id;\r\n\r\n                    // Start a body block for the `accept` branch.\r\n                    let accept = ctx.bodies.len();\r\n                    let mut accept_block = Body::with_parent(body_idx);\r\n\r\n                    // If the `OpBranchConditional`target is somebody else's\r\n                    // merge or continue block, then put a `Break` or `Continue`\r\n                    // statement in this new body block.\r\n                    if let Some(info) = ctx.mergers.get(&true_id) {\r\n                        merger(\r\n                            match same_target {\r\n                                true => &mut ctx.bodies[body_idx],\r\n                                false => &mut accept_block,\r\n                            },\r\n                            info,\r\n                        )\r\n                    } else {\r\n                        // Note the body index for the block we're branching to.\r\n                        let prev = ctx.body_for_label.insert(\r\n                            true_id,\r\n                            match same_target {\r\n                                true => body_idx,\r\n                                false => accept,\r\n                            },\r\n                        );\r\n                        debug_assert!(prev.is_none());\r\n                    }\r\n\r\n                    if same_target {\r\n                        return Ok(());\r\n                    }\r\n\r\n                    ctx.bodies.push(accept_block);\r\n\r\n                    // Handle the `reject` branch just like the `accept` block.\r\n                    let reject = ctx.bodies.len();\r\n                    let mut reject_block = Body::with_parent(body_idx);\r\n\r\n                    if let Some(info) = ctx.mergers.get(&false_id) {\r\n                        merger(&mut reject_block, info)\r\n                    } else {\r\n                        let prev = ctx.body_for_label.insert(false_id, reject);\r\n                        debug_assert!(prev.is_none());\r\n                    }\r\n\r\n                    ctx.bodies.push(reject_block);\r\n\r\n                    let body = &mut ctx.bodies[body_idx];\r\n                    body.data.push(BodyFragment::If {\r\n                        condition,\r\n                        accept,\r\n                        reject,\r\n                    });\r\n\r\n                    // Consume branch weights\r\n                    for _ in 4..inst.wc {\r\n                        let _ = self.next()?;\r\n                    }\r\n\r\n                    return Ok(());\r\n                }\r\n                Op::Switch => {\r\n                    inst.expect_at_least(3)?;\r\n                    let selector = self.next()?;\r\n                    let default_id = self.next()?;\r\n\r\n                    // If the previous instruction was a `OpSelectionMerge` then we must\r\n                    // promote the `MergeBlockInformation` to a `SwitchMerge`\r\n                    if let Some(merge) = selection_merge_block {\r\n                        ctx.mergers\r\n                            .insert(merge, MergeBlockInformation::SwitchMerge);\r\n                    }\r\n\r\n                    let default = ctx.bodies.len();\r\n                    ctx.bodies.push(Body::with_parent(body_idx));\r\n                    ctx.body_for_label.entry(default_id).or_insert(default);\r\n\r\n                    let selector_lexp = &self.lookup_expression[&selector];\r\n                    let selector_lty = self.lookup_type.lookup(selector_lexp.type_id)?;\r\n                    let selector_handle = get_expr_handle!(selector, selector_lexp);\r\n                    let selector = match ctx.type_arena[selector_lty.handle].inner {\r\n                        crate::TypeInner::Scalar {\r\n                            kind: crate::ScalarKind::Uint,\r\n                            width: _,\r\n                        } => {\r\n                            // IR expects a signed integer, so do a bitcast\r\n                            ctx.expressions.append(\r\n                                crate::Expression::As {\r\n                                    kind: crate::ScalarKind::Sint,\r\n                                    expr: selector_handle,\r\n                                    convert: None,\r\n                                },\r\n                                span,\r\n                            )\r\n                        }\r\n                        crate::TypeInner::Scalar {\r\n                            kind: crate::ScalarKind::Sint,\r\n                            width: _,\r\n                        } => selector_handle,\r\n                        ref other => unimplemented!(\"Unexpected selector {:?}\", other),\r\n                    };\r\n\r\n                    // Clear past switch cases to prevent them from entering this one\r\n                    self.switch_cases.clear();\r\n\r\n                    for _ in 0..(inst.wc - 3) / 2 {\r\n                        let literal = self.next()?;\r\n                        let target = self.next()?;\r\n\r\n                        let case_body_idx = ctx.bodies.len();\r\n\r\n                        // Check if any previous case already used this target block id, if so\r\n                        // group them together to reorder them later so that no weird\r\n                        // falltrough cases happen.\r\n                        if let Some(&mut (_, ref mut literals)) = self.switch_cases.get_mut(&target)\r\n                        {\r\n                            literals.push(literal as i32);\r\n                            continue;\r\n                        }\r\n\r\n                        let mut body = Body::with_parent(body_idx);\r\n\r\n                        if let Some(info) = ctx.mergers.get(&target) {\r\n                            merger(&mut body, info);\r\n                        }\r\n\r\n                        ctx.bodies.push(body);\r\n                        ctx.body_for_label.entry(target).or_insert(case_body_idx);\r\n\r\n                        // Register this target block id as already having been processed and\r\n                        // the respective body index assigned and the first case value\r\n                        self.switch_cases\r\n                            .insert(target, (case_body_idx, vec![literal as i32]));\r\n                    }\r\n\r\n                    // Loop trough the collected target blocks creating a new case for each\r\n                    // literal pointing to it, only one case will have the true body and all the\r\n                    // others will be empty falltrough so that they all execute the same body\r\n                    // without duplicating code.\r\n                    //\r\n                    // Since `switch_cases` is an indexmap the order of insertion is preserved\r\n                    // this is needed because spir-v defines falltrough order in the switch\r\n                    // instruction.\r\n                    let mut cases = Vec::with_capacity((inst.wc as usize - 3) / 2);\r\n                    for &(case_body_idx, ref literals) in self.switch_cases.values() {\r\n                        let value = literals[0];\r\n\r\n                        for &literal in literals.iter().skip(1) {\r\n                            let empty_body_idx = ctx.bodies.len();\r\n                            let body = Body::with_parent(body_idx);\r\n\r\n                            ctx.bodies.push(body);\r\n\r\n                            cases.push((literal, empty_body_idx));\r\n                        }\r\n\r\n                        cases.push((value, case_body_idx));\r\n                    }\r\n\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n\r\n                    let body = &mut ctx.bodies[body_idx];\r\n                    ctx.blocks.insert(block_id, block);\r\n                    // Make sure the vector has space for at least two more allocations\r\n                    body.data.reserve(2);\r\n                    body.data.push(BodyFragment::BlockId(block_id));\r\n                    body.data.push(BodyFragment::Switch {\r\n                        selector,\r\n                        cases,\r\n                        default,\r\n                    });\r\n\r\n                    return Ok(());\r\n                }\r\n                Op::SelectionMerge => {\r\n                    inst.expect(3)?;\r\n                    let merge_block_id = self.next()?;\r\n                    // TODO: Selection Control Mask\r\n                    let _selection_control = self.next()?;\r\n\r\n                    // Indicate that the merge block is a continuation of the\r\n                    // current `Body`.\r\n                    ctx.body_for_label.entry(merge_block_id).or_insert(body_idx);\r\n\r\n                    // Let subsequent branches to the merge block know that\r\n                    // they've reached the end of the selection construct.\r\n                    ctx.mergers\r\n                        .insert(merge_block_id, MergeBlockInformation::SelectionMerge);\r\n\r\n                    selection_merge_block = Some(merge_block_id);\r\n                }\r\n                Op::LoopMerge => {\r\n                    inst.expect_at_least(4)?;\r\n                    let merge_block_id = self.next()?;\r\n                    let continuing = self.next()?;\r\n\r\n                    // TODO: Loop Control Parameters\r\n                    for _ in 0..inst.wc - 3 {\r\n                        self.next()?;\r\n                    }\r\n\r\n                    // Indicate that the merge block is a continuation of the\r\n                    // current `Body`.\r\n                    ctx.body_for_label.entry(merge_block_id).or_insert(body_idx);\r\n                    // Let subsequent branches to the merge block know that\r\n                    // they're `Break` statements.\r\n                    ctx.mergers\r\n                        .insert(merge_block_id, MergeBlockInformation::LoopMerge);\r\n\r\n                    let loop_body_idx = ctx.bodies.len();\r\n                    ctx.bodies.push(Body::with_parent(body_idx));\r\n\r\n                    let continue_idx = ctx.bodies.len();\r\n                    // The continue block inherits the scope of the loop body\r\n                    ctx.bodies.push(Body::with_parent(loop_body_idx));\r\n                    ctx.body_for_label.entry(continuing).or_insert(continue_idx);\r\n                    // Let subsequent branches to the continue block know that\r\n                    // they're `Continue` statements.\r\n                    ctx.mergers\r\n                        .insert(continuing, MergeBlockInformation::LoopContinue);\r\n\r\n                    // The loop header always belongs to the loop body\r\n                    ctx.body_for_label.insert(block_id, loop_body_idx);\r\n\r\n                    let parent_body = &mut ctx.bodies[body_idx];\r\n                    parent_body.data.push(BodyFragment::Loop {\r\n                        body: loop_body_idx,\r\n                        continuing: continue_idx,\r\n                    });\r\n                    body_idx = loop_body_idx;\r\n                }\r\n                Op::DPdx | Op::DPdxFine | Op::DPdxCoarse => {\r\n                    parse_expr_op!(crate::DerivativeAxis::X, DERIVATIVE)?;\r\n                }\r\n                Op::DPdy | Op::DPdyFine | Op::DPdyCoarse => {\r\n                    parse_expr_op!(crate::DerivativeAxis::Y, DERIVATIVE)?;\r\n                }\r\n                Op::Fwidth | Op::FwidthFine | Op::FwidthCoarse => {\r\n                    parse_expr_op!(crate::DerivativeAxis::Width, DERIVATIVE)?;\r\n                }\r\n                Op::ArrayLength => {\r\n                    inst.expect(5)?;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let structure_id = self.next()?;\r\n                    let member_index = self.next()?;\r\n\r\n                    // We're assuming that the validation pass, if it's run, will catch if the\r\n                    // wrong types or parameters are supplied here.\r\n\r\n                    let structure_ptr = self.lookup_expression.lookup(structure_id)?;\r\n                    let structure_handle = get_expr_handle!(structure_id, structure_ptr);\r\n\r\n                    let member_ptr = ctx.expressions.append(\r\n                        crate::Expression::AccessIndex {\r\n                            base: structure_handle,\r\n                            index: member_index,\r\n                        },\r\n                        span,\r\n                    );\r\n\r\n                    let length = ctx\r\n                        .expressions\r\n                        .append(crate::Expression::ArrayLength(member_ptr), span);\r\n\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle: length,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                Op::CopyMemory => {\r\n                    inst.expect_at_least(3)?;\r\n                    let target_id = self.next()?;\r\n                    let source_id = self.next()?;\r\n                    let _memory_access = if inst.wc != 3 {\r\n                        inst.expect(4)?;\r\n                        spirv::MemoryAccess::from_bits(self.next()?)\r\n                            .ok_or(Error::InvalidParameter(Op::CopyMemory))?\r\n                    } else {\r\n                        spirv::MemoryAccess::NONE\r\n                    };\r\n\r\n                    // TODO: check if the source and target types are the same?\r\n                    let target = self.lookup_expression.lookup(target_id)?;\r\n                    let target_handle = get_expr_handle!(target_id, target);\r\n                    let source = self.lookup_expression.lookup(source_id)?;\r\n                    let source_handle = get_expr_handle!(source_id, source);\r\n\r\n                    // This operation is practically the same as loading and then storing, I think.\r\n                    let value_expr = ctx.expressions.append(\r\n                        crate::Expression::Load {\r\n                            pointer: source_handle,\r\n                        },\r\n                        span,\r\n                    );\r\n\r\n                    block.extend(emitter.finish(ctx.expressions));\r\n                    block.push(\r\n                        crate::Statement::Store {\r\n                            pointer: target_handle,\r\n                            value: value_expr,\r\n                        },\r\n                        span,\r\n                    );\r\n\r\n                    emitter.start(ctx.expressions);\r\n                }\r\n                Op::ControlBarrier => {\r\n                    inst.expect(4)?;\r\n                    let exec_scope_id = self.next()?;\r\n                    let _mem_scope_raw = self.next()?;\r\n                    let semantics_id = self.next()?;\r\n                    let exec_scope_const = self.lookup_constant.lookup(exec_scope_id)?;\r\n                    let semantics_const = self.lookup_constant.lookup(semantics_id)?;\r\n                    let exec_scope = match ctx.const_arena[exec_scope_const.handle].inner {\r\n                        crate::ConstantInner::Scalar {\r\n                            value: crate::ScalarValue::Uint(raw),\r\n                            width: _,\r\n                        } => raw as u32,\r\n                        _ => return Err(Error::InvalidBarrierScope(exec_scope_id)),\r\n                    };\r\n                    let semantics = match ctx.const_arena[semantics_const.handle].inner {\r\n                        crate::ConstantInner::Scalar {\r\n                            value: crate::ScalarValue::Uint(raw),\r\n                            width: _,\r\n                        } => raw as u32,\r\n                        _ => return Err(Error::InvalidBarrierMemorySemantics(semantics_id)),\r\n                    };\r\n                    if exec_scope == spirv::Scope::Workgroup as u32 {\r\n                        let mut flags = crate::Barrier::empty();\r\n                        flags.set(\r\n                            crate::Barrier::STORAGE,\r\n                            semantics & spirv::MemorySemantics::UNIFORM_MEMORY.bits() != 0,\r\n                        );\r\n                        flags.set(\r\n                            crate::Barrier::WORK_GROUP,\r\n                            semantics\r\n                                & (spirv::MemorySemantics::SUBGROUP_MEMORY\r\n                                    | spirv::MemorySemantics::WORKGROUP_MEMORY)\r\n                                    .bits()\r\n                                != 0,\r\n                        );\r\n                        block.push(crate::Statement::Barrier(flags), span);\r\n                    } else {\r\n                        log::warn!(\"Unsupported barrier execution scope: {}\", exec_scope);\r\n                    }\r\n                }\r\n                Op::CopyObject => {\r\n                    inst.expect(4)?;\r\n                    let result_type_id = self.next()?;\r\n                    let result_id = self.next()?;\r\n                    let operand_id = self.next()?;\r\n\r\n                    let lookup = self.lookup_expression.lookup(operand_id)?;\r\n                    let handle = get_expr_handle!(operand_id, lookup);\r\n\r\n                    self.lookup_expression.insert(\r\n                        result_id,\r\n                        LookupExpression {\r\n                            handle,\r\n                            type_id: result_type_id,\r\n                            block_id,\r\n                        },\r\n                    );\r\n                }\r\n                _ => return Err(Error::UnsupportedInstruction(self.state, inst.op)),\r\n            }\r\n        };\r\n\r\n        block.extend(emitter.finish(ctx.expressions));\r\n        if let Some(stmt) = terminator {\r\n            block.push(stmt, crate::Span::default());\r\n        }\r\n\r\n        // Save this block fragment in `block_ctx.blocks`, and mark it to be\r\n        // incorporated into the current body at `Statement` assembly time.\r\n        ctx.blocks.insert(block_id, block);\r\n        let body = &mut ctx.bodies[body_idx];\r\n        body.data.push(BodyFragment::BlockId(block_id));\r\n        Ok(())\r\n    }\r\n\r\n    fn make_expression_storage(\r\n        &mut self,\r\n        globals: &Arena<crate::GlobalVariable>,\r\n        constants: &Arena<crate::Constant>,\r\n    ) -> Arena<crate::Expression> {\r\n        let mut expressions = Arena::new();\r\n        #[allow(clippy::panic)]\r\n        {\r\n            assert!(self.lookup_expression.is_empty());\r\n        }\r\n        // register global variables\r\n        for (&id, var) in self.lookup_variable.iter() {\r\n            let span = globals.get_span(var.handle);\r\n            let handle = expressions.append(crate::Expression::GlobalVariable(var.handle), span);\r\n            self.lookup_expression.insert(\r\n                id,\r\n                LookupExpression {\r\n                    type_id: var.type_id,\r\n                    handle,\r\n                    // Setting this to an invalid id will cause get_expr_handle\r\n                    // to default to the main body making sure no load/stores\r\n                    // are added.\r\n                    block_id: 0,\r\n                },\r\n            );\r\n        }\r\n        // register special constants\r\n        self.index_constant_expressions.clear();\r\n        for &con_handle in self.index_constants.iter() {\r\n            let span = constants.get_span(con_handle);\r\n            let handle = expressions.append(crate::Expression::Constant(con_handle), span);\r\n            self.index_constant_expressions.push(handle);\r\n        }\r\n        // register constants\r\n        for (&id, con) in self.lookup_constant.iter() {\r\n            let span = constants.get_span(con.handle);\r\n            let handle = expressions.append(crate::Expression::Constant(con.handle), span);\r\n            self.lookup_expression.insert(\r\n                id,\r\n                LookupExpression {\r\n                    type_id: con.type_id,\r\n                    handle,\r\n                    // Setting this to an invalid id will cause get_expr_handle\r\n                    // to default to the main body making sure no load/stores\r\n                    // are added.\r\n                    block_id: 0,\r\n                },\r\n            );\r\n        }\r\n        // done\r\n        expressions\r\n    }\r\n\r\n    fn switch(&mut self, state: ModuleState, op: spirv::Op) -> Result<(), Error> {\r\n        if state < self.state {\r\n            Err(Error::UnsupportedInstruction(self.state, op))\r\n        } else {\r\n            self.state = state;\r\n            Ok(())\r\n        }\r\n    }\r\n\r\n    /// Walk the statement tree and patch it in the following cases:\r\n    /// 1. Function call targets are replaced by `deferred_function_calls` map\r\n    fn patch_statements(\r\n        &mut self,\r\n        statements: &mut crate::Block,\r\n        expressions: &mut Arena<crate::Expression>,\r\n        fun_parameter_sampling: &mut [image::SamplingFlags],\r\n    ) -> Result<(), Error> {\r\n        use crate::Statement as S;\r\n        let mut i = 0usize;\r\n        while i < statements.len() {\r\n            match statements[i] {\r\n                S::Emit(_) => {}\r\n                S::Block(ref mut block) => {\r\n                    self.patch_statements(block, expressions, fun_parameter_sampling)?;\r\n                }\r\n                S::If {\r\n                    condition: _,\r\n                    ref mut accept,\r\n                    ref mut reject,\r\n                } => {\r\n                    self.patch_statements(reject, expressions, fun_parameter_sampling)?;\r\n                    self.patch_statements(accept, expressions, fun_parameter_sampling)?;\r\n                }\r\n                S::Switch {\r\n                    selector: _,\r\n                    ref mut cases,\r\n                } => {\r\n                    for case in cases.iter_mut() {\r\n                        self.patch_statements(&mut case.body, expressions, fun_parameter_sampling)?;\r\n                    }\r\n                }\r\n                S::Loop {\r\n                    ref mut body,\r\n                    ref mut continuing,\r\n                    break_if: _,\r\n                } => {\r\n                    self.patch_statements(body, expressions, fun_parameter_sampling)?;\r\n                    self.patch_statements(continuing, expressions, fun_parameter_sampling)?;\r\n                }\r\n                S::Break\r\n                | S::Continue\r\n                | S::Return { .. }\r\n                | S::Kill\r\n                | S::Barrier(_)\r\n                | S::Store { .. }\r\n                | S::ImageStore { .. }\r\n                | S::Atomic { .. } => {}\r\n                S::Call {\r\n                    function: ref mut callee,\r\n                    ref arguments,\r\n                    ..\r\n                } => {\r\n                    let fun_id = self.deferred_function_calls[callee.index()];\r\n                    let fun_lookup = self.lookup_function.lookup(fun_id)?;\r\n                    *callee = fun_lookup.handle;\r\n\r\n                    // Patch sampling flags\r\n                    for (arg_index, arg) in arguments.iter().enumerate() {\r\n                        let flags = match fun_lookup.parameters_sampling.get(arg_index) {\r\n                            Some(&flags) if !flags.is_empty() => flags,\r\n                            _ => continue,\r\n                        };\r\n\r\n                        match expressions[*arg] {\r\n                            crate::Expression::GlobalVariable(handle) => {\r\n                                if let Some(sampling) = self.handle_sampling.get_mut(&handle) {\r\n                                    *sampling |= flags\r\n                                }\r\n                            }\r\n                            crate::Expression::FunctionArgument(i) => {\r\n                                fun_parameter_sampling[i as usize] |= flags;\r\n                            }\r\n                            ref other => return Err(Error::InvalidGlobalVar(other.clone())),\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            i += 1;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn patch_function(\r\n        &mut self,\r\n        handle: Option<Handle<crate::Function>>,\r\n        fun: &mut crate::Function,\r\n    ) -> Result<(), Error> {\r\n        // Note: this search is a bit unfortunate\r\n        let (fun_id, mut parameters_sampling) = match handle {\r\n            Some(h) => {\r\n                let (&fun_id, lookup) = self\r\n                    .lookup_function\r\n                    .iter_mut()\r\n                    .find(|&(_, ref lookup)| lookup.handle == h)\r\n                    .unwrap();\r\n                (fun_id, mem::take(&mut lookup.parameters_sampling))\r\n            }\r\n            None => (0, Vec::new()),\r\n        };\r\n\r\n        for (_, expr) in fun.expressions.iter_mut() {\r\n            if let crate::Expression::CallResult(ref mut function) = *expr {\r\n                let fun_id = self.deferred_function_calls[function.index()];\r\n                *function = self.lookup_function.lookup(fun_id)?.handle;\r\n            }\r\n        }\r\n\r\n        self.patch_statements(\r\n            &mut fun.body,\r\n            &mut fun.expressions,\r\n            &mut parameters_sampling,\r\n        )?;\r\n\r\n        if let Some(lookup) = self.lookup_function.get_mut(&fun_id) {\r\n            lookup.parameters_sampling = parameters_sampling;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    pub fn parse(mut self) -> Result<crate::Module, Error> {\r\n        let mut module = {\r\n            if self.next()? != spirv::MAGIC_NUMBER {\r\n                return Err(Error::InvalidHeader);\r\n            }\r\n            let version_raw = self.next()?;\r\n            let generator = self.next()?;\r\n            let _bound = self.next()?;\r\n            let _schema = self.next()?;\r\n            log::info!(\"Generated by {} version {:x}\", generator, version_raw);\r\n            crate::Module::default()\r\n        };\r\n\r\n        // register indexing constants\r\n        self.index_constants.clear();\r\n        for i in 0..4 {\r\n            let handle = module.constants.append(\r\n                crate::Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner: crate::ConstantInner::Scalar {\r\n                        width: 4,\r\n                        value: crate::ScalarValue::Sint(i),\r\n                    },\r\n                },\r\n                Default::default(),\r\n            );\r\n            self.index_constants.push(handle);\r\n        }\r\n\r\n        self.layouter.clear();\r\n        self.dummy_functions = Arena::new();\r\n        self.lookup_function.clear();\r\n        self.function_call_graph.clear();\r\n\r\n        loop {\r\n            use spirv::Op;\r\n\r\n            let inst = match self.next_inst() {\r\n                Ok(inst) => inst,\r\n                Err(Error::IncompleteData) => break,\r\n                Err(other) => return Err(other),\r\n            };\r\n            log::debug!(\"\\t{:?} [{}]\", inst.op, inst.wc);\r\n\r\n            match inst.op {\r\n                Op::Capability => self.parse_capability(inst),\r\n                Op::Extension => self.parse_extension(inst),\r\n                Op::ExtInstImport => self.parse_ext_inst_import(inst),\r\n                Op::MemoryModel => self.parse_memory_model(inst),\r\n                Op::EntryPoint => self.parse_entry_point(inst),\r\n                Op::ExecutionMode => self.parse_execution_mode(inst),\r\n                Op::String => self.parse_string(inst),\r\n                Op::Source => self.parse_source(inst),\r\n                Op::SourceExtension => self.parse_source_extension(inst),\r\n                Op::Name => self.parse_name(inst),\r\n                Op::MemberName => self.parse_member_name(inst),\r\n                Op::ModuleProcessed => self.parse_module_processed(inst),\r\n                Op::Decorate => self.parse_decorate(inst),\r\n                Op::MemberDecorate => self.parse_member_decorate(inst),\r\n                Op::TypeVoid => self.parse_type_void(inst),\r\n                Op::TypeBool => self.parse_type_bool(inst, &mut module),\r\n                Op::TypeInt => self.parse_type_int(inst, &mut module),\r\n                Op::TypeFloat => self.parse_type_float(inst, &mut module),\r\n                Op::TypeVector => self.parse_type_vector(inst, &mut module),\r\n                Op::TypeMatrix => self.parse_type_matrix(inst, &mut module),\r\n                Op::TypeFunction => self.parse_type_function(inst),\r\n                Op::TypePointer => self.parse_type_pointer(inst, &mut module),\r\n                Op::TypeArray => self.parse_type_array(inst, &mut module),\r\n                Op::TypeRuntimeArray => self.parse_type_runtime_array(inst, &mut module),\r\n                Op::TypeStruct => self.parse_type_struct(inst, &mut module),\r\n                Op::TypeImage => self.parse_type_image(inst, &mut module),\r\n                Op::TypeSampledImage => self.parse_type_sampled_image(inst),\r\n                Op::TypeSampler => self.parse_type_sampler(inst, &mut module),\r\n                Op::Constant | Op::SpecConstant => self.parse_constant(inst, &mut module),\r\n                Op::ConstantComposite => self.parse_composite_constant(inst, &mut module),\r\n                Op::ConstantNull | Op::Undef => self\r\n                    .parse_null_constant(inst, &module.types, &mut module.constants)\r\n                    .map(|_| ()),\r\n                Op::ConstantTrue => self.parse_bool_constant(inst, true, &mut module),\r\n                Op::ConstantFalse => self.parse_bool_constant(inst, false, &mut module),\r\n                Op::Variable => self.parse_global_variable(inst, &mut module),\r\n                Op::Function => {\r\n                    self.switch(ModuleState::Function, inst.op)?;\r\n                    inst.expect(5)?;\r\n                    self.parse_function(&mut module)\r\n                }\r\n                _ => Err(Error::UnsupportedInstruction(self.state, inst.op)), //TODO\r\n            }?;\r\n        }\r\n\r\n        log::info!(\"Patching...\");\r\n        {\r\n            let mut nodes = petgraph::algo::toposort(&self.function_call_graph, None)\r\n                .map_err(|cycle| Error::FunctionCallCycle(cycle.node_id()))?;\r\n            nodes.reverse(); // we need dominated first\r\n            let mut functions = mem::take(&mut module.functions);\r\n            for fun_id in nodes {\r\n                if fun_id > !(functions.len() as u32) {\r\n                    // skip all the fake IDs registered for the entry points\r\n                    continue;\r\n                }\r\n                let lookup = self.lookup_function.get_mut(&fun_id).unwrap();\r\n                // take out the function from the old array\r\n                let fun = mem::take(&mut functions[lookup.handle]);\r\n                // add it to the newly formed arena, and adjust the lookup\r\n                lookup.handle = module\r\n                    .functions\r\n                    .append(fun, functions.get_span(lookup.handle));\r\n            }\r\n        }\r\n        // patch all the functions\r\n        for (handle, fun) in module.functions.iter_mut() {\r\n            self.patch_function(Some(handle), fun)?;\r\n        }\r\n        for ep in module.entry_points.iter_mut() {\r\n            self.patch_function(None, &mut ep.function)?;\r\n        }\r\n\r\n        // Check all the images and samplers to have consistent comparison property.\r\n        for (handle, flags) in self.handle_sampling.drain() {\r\n            if !image::patch_comparison_type(\r\n                flags,\r\n                module.global_variables.get_mut(handle),\r\n                &mut module.types,\r\n            ) {\r\n                return Err(Error::InconsistentComparisonSampling(handle));\r\n            }\r\n        }\r\n\r\n        if !self.future_decor.is_empty() {\r\n            log::warn!(\"Unused item decorations: {:?}\", self.future_decor);\r\n            self.future_decor.clear();\r\n        }\r\n        if !self.future_member_decor.is_empty() {\r\n            log::warn!(\"Unused member decorations: {:?}\", self.future_member_decor);\r\n            self.future_member_decor.clear();\r\n        }\r\n\r\n        Ok(module)\r\n    }\r\n\r\n    fn parse_capability(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Capability, inst.op)?;\r\n        inst.expect(2)?;\r\n        let capability = self.next()?;\r\n        let cap =\r\n            spirv::Capability::from_u32(capability).ok_or(Error::UnknownCapability(capability))?;\r\n        if !SUPPORTED_CAPABILITIES.contains(&cap) {\r\n            if self.options.strict_capabilities {\r\n                return Err(Error::UnsupportedCapability(cap));\r\n            } else {\r\n                log::warn!(\"Unknown capability {:?}\", cap);\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_extension(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Extension, inst.op)?;\r\n        inst.expect_at_least(2)?;\r\n        let (name, left) = self.next_string(inst.wc - 1)?;\r\n        if left != 0 {\r\n            return Err(Error::InvalidOperand);\r\n        }\r\n        if !SUPPORTED_EXTENSIONS.contains(&name.as_str()) {\r\n            return Err(Error::UnsupportedExtension(name));\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_ext_inst_import(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Extension, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n        let result_id = self.next()?;\r\n        let (name, left) = self.next_string(inst.wc - 2)?;\r\n        if left != 0 {\r\n            return Err(Error::InvalidOperand);\r\n        }\r\n        if !SUPPORTED_EXT_SETS.contains(&name.as_str()) {\r\n            return Err(Error::UnsupportedExtSet(name));\r\n        }\r\n        self.ext_glsl_id = Some(result_id);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_memory_model(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::MemoryModel, inst.op)?;\r\n        inst.expect(3)?;\r\n        let _addressing_model = self.next()?;\r\n        let _memory_model = self.next()?;\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_entry_point(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::EntryPoint, inst.op)?;\r\n        inst.expect_at_least(4)?;\r\n        let exec_model = self.next()?;\r\n        let exec_model = spirv::ExecutionModel::from_u32(exec_model)\r\n            .ok_or(Error::UnsupportedExecutionModel(exec_model))?;\r\n        let function_id = self.next()?;\r\n        let (name, left) = self.next_string(inst.wc - 3)?;\r\n        let ep = EntryPoint {\r\n            stage: match exec_model {\r\n                spirv::ExecutionModel::Vertex => crate::ShaderStage::Vertex,\r\n                spirv::ExecutionModel::Fragment => crate::ShaderStage::Fragment,\r\n                spirv::ExecutionModel::GLCompute => crate::ShaderStage::Compute,\r\n                _ => return Err(Error::UnsupportedExecutionModel(exec_model as u32)),\r\n            },\r\n            name,\r\n            early_depth_test: None,\r\n            workgroup_size: [0; 3],\r\n            variable_ids: self.data.by_ref().take(left as usize).collect(),\r\n        };\r\n        self.lookup_entry_point.insert(function_id, ep);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_execution_mode(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        use spirv::ExecutionMode;\r\n\r\n        self.switch(ModuleState::ExecutionMode, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n\r\n        let ep_id = self.next()?;\r\n        let mode_id = self.next()?;\r\n        let args: Vec<spirv::Word> = self.data.by_ref().take(inst.wc as usize - 3).collect();\r\n\r\n        let ep = self\r\n            .lookup_entry_point\r\n            .get_mut(&ep_id)\r\n            .ok_or(Error::InvalidId(ep_id))?;\r\n        let mode = spirv::ExecutionMode::from_u32(mode_id)\r\n            .ok_or(Error::UnsupportedExecutionMode(mode_id))?;\r\n\r\n        match mode {\r\n            ExecutionMode::EarlyFragmentTests => {\r\n                if ep.early_depth_test.is_none() {\r\n                    ep.early_depth_test = Some(crate::EarlyDepthTest { conservative: None });\r\n                }\r\n            }\r\n            ExecutionMode::DepthUnchanged => {\r\n                ep.early_depth_test = Some(crate::EarlyDepthTest {\r\n                    conservative: Some(crate::ConservativeDepth::Unchanged),\r\n                });\r\n            }\r\n            ExecutionMode::DepthGreater => {\r\n                ep.early_depth_test = Some(crate::EarlyDepthTest {\r\n                    conservative: Some(crate::ConservativeDepth::GreaterEqual),\r\n                });\r\n            }\r\n            ExecutionMode::DepthLess => {\r\n                ep.early_depth_test = Some(crate::EarlyDepthTest {\r\n                    conservative: Some(crate::ConservativeDepth::LessEqual),\r\n                });\r\n            }\r\n            ExecutionMode::DepthReplacing => {\r\n                // Ignored because it can be deduced from the IR.\r\n            }\r\n            ExecutionMode::OriginUpperLeft => {\r\n                // Ignored because the other option (OriginLowerLeft) is not valid in Vulkan mode.\r\n            }\r\n            ExecutionMode::LocalSize => {\r\n                ep.workgroup_size = [args[0], args[1], args[2]];\r\n            }\r\n            _ => {\r\n                return Err(Error::UnsupportedExecutionMode(mode_id));\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_string(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Source, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n        let _id = self.next()?;\r\n        let (_name, _) = self.next_string(inst.wc - 2)?;\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_source(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Source, inst.op)?;\r\n        for _ in 1..inst.wc {\r\n            let _ = self.next()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_source_extension(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Source, inst.op)?;\r\n        inst.expect_at_least(2)?;\r\n        let (_name, _) = self.next_string(inst.wc - 1)?;\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_name(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Name, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n        let id = self.next()?;\r\n        let (name, left) = self.next_string(inst.wc - 2)?;\r\n        if left != 0 {\r\n            return Err(Error::InvalidOperand);\r\n        }\r\n        self.future_decor.entry(id).or_default().name = Some(name);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_member_name(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Name, inst.op)?;\r\n        inst.expect_at_least(4)?;\r\n        let id = self.next()?;\r\n        let member = self.next()?;\r\n        let (name, left) = self.next_string(inst.wc - 3)?;\r\n        if left != 0 {\r\n            return Err(Error::InvalidOperand);\r\n        }\r\n\r\n        self.future_member_decor\r\n            .entry((id, member))\r\n            .or_default()\r\n            .name = Some(name);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_module_processed(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Name, inst.op)?;\r\n        inst.expect_at_least(2)?;\r\n        let (_info, left) = self.next_string(inst.wc - 1)?;\r\n        //Note: string is ignored\r\n        if left != 0 {\r\n            return Err(Error::InvalidOperand);\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_decorate(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Annotation, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n        let id = self.next()?;\r\n        let mut dec = self.future_decor.remove(&id).unwrap_or_default();\r\n        self.next_decoration(inst, 2, &mut dec)?;\r\n        self.future_decor.insert(id, dec);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_member_decorate(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Annotation, inst.op)?;\r\n        inst.expect_at_least(4)?;\r\n        let id = self.next()?;\r\n        let member = self.next()?;\r\n\r\n        let mut dec = self\r\n            .future_member_decor\r\n            .remove(&(id, member))\r\n            .unwrap_or_default();\r\n        self.next_decoration(inst, 3, &mut dec)?;\r\n        self.future_member_decor.insert((id, member), dec);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_void(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(2)?;\r\n        let id = self.next()?;\r\n        self.lookup_void_type = Some(id);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_bool(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(2)?;\r\n        let id = self.next()?;\r\n        let inner = crate::TypeInner::Scalar {\r\n            kind: crate::ScalarKind::Bool,\r\n            width: crate::BOOL_WIDTH,\r\n        };\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: None,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_int(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(4)?;\r\n        let id = self.next()?;\r\n        let width = self.next()?;\r\n        let sign = self.next()?;\r\n        let inner = crate::TypeInner::Scalar {\r\n            kind: match sign {\r\n                0 => crate::ScalarKind::Uint,\r\n                1 => crate::ScalarKind::Sint,\r\n                _ => return Err(Error::InvalidSign(sign)),\r\n            },\r\n            width: map_width(width)?,\r\n        };\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: None,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_float(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(3)?;\r\n        let id = self.next()?;\r\n        let width = self.next()?;\r\n        let inner = crate::TypeInner::Scalar {\r\n            kind: crate::ScalarKind::Float,\r\n            width: map_width(width)?,\r\n        };\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: None,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_vector(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(4)?;\r\n        let id = self.next()?;\r\n        let type_id = self.next()?;\r\n        let type_lookup = self.lookup_type.lookup(type_id)?;\r\n        let (kind, width) = match module.types[type_lookup.handle].inner {\r\n            crate::TypeInner::Scalar { kind, width } => (kind, width),\r\n            _ => return Err(Error::InvalidInnerType(type_id)),\r\n        };\r\n        let component_count = self.next()?;\r\n        let inner = crate::TypeInner::Vector {\r\n            size: map_vector_size(component_count)?,\r\n            kind,\r\n            width,\r\n        };\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: Some(type_id),\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_matrix(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(4)?;\r\n        let id = self.next()?;\r\n        let vector_type_id = self.next()?;\r\n        let num_columns = self.next()?;\r\n        let decor = self.future_decor.remove(&id);\r\n\r\n        let vector_type_lookup = self.lookup_type.lookup(vector_type_id)?;\r\n        let inner = match module.types[vector_type_lookup.handle].inner {\r\n            crate::TypeInner::Vector { size, width, .. } => crate::TypeInner::Matrix {\r\n                columns: map_vector_size(num_columns)?,\r\n                rows: size,\r\n                width,\r\n            },\r\n            _ => return Err(Error::InvalidInnerType(vector_type_id)),\r\n        };\r\n\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: decor.and_then(|dec| dec.name),\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: Some(vector_type_id),\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_function(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n        let id = self.next()?;\r\n        let return_type_id = self.next()?;\r\n        let parameter_type_ids = self.data.by_ref().take(inst.wc as usize - 3).collect();\r\n        self.lookup_function_type.insert(\r\n            id,\r\n            LookupFunctionType {\r\n                parameter_type_ids,\r\n                return_type_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_pointer(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(4)?;\r\n        let id = self.next()?;\r\n        let storage_class = self.next()?;\r\n        let type_id = self.next()?;\r\n\r\n        let decor = self.future_decor.remove(&id);\r\n        let base_lookup_ty = self.lookup_type.lookup(type_id)?;\r\n        let base_inner = &module.types[base_lookup_ty.handle].inner;\r\n        let space = if let Some(space) = base_inner.pointer_space() {\r\n            space\r\n        } else if self\r\n            .lookup_storage_buffer_types\r\n            .contains_key(&base_lookup_ty.handle)\r\n        {\r\n            crate::AddressSpace::Storage {\r\n                access: crate::StorageAccess::default(),\r\n            }\r\n        } else {\r\n            match map_storage_class(storage_class)? {\r\n                ExtendedClass::Global(space) => space,\r\n                ExtendedClass::Input | ExtendedClass::Output => crate::AddressSpace::Private,\r\n            }\r\n        };\r\n\r\n        // We don't support pointers to runtime-sized arrays in the `Uniform`\r\n        // storage class with the `BufferBlock` decoration. Runtime-sized arrays\r\n        // should be in the StorageBuffer class.\r\n        if let crate::TypeInner::Array {\r\n            size: crate::ArraySize::Dynamic,\r\n            ..\r\n        } = *base_inner\r\n        {\r\n            match space {\r\n                crate::AddressSpace::Storage { .. } => {}\r\n                _ => {\r\n                    return Err(Error::UnsupportedRuntimeArrayStorageClass);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Don't bother with pointer stuff for `Handle` types.\r\n        let lookup_ty = if space == crate::AddressSpace::Handle {\r\n            base_lookup_ty.clone()\r\n        } else {\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: decor.and_then(|dec| dec.name),\r\n                        inner: crate::TypeInner::Pointer {\r\n                            base: base_lookup_ty.handle,\r\n                            space,\r\n                        },\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: Some(type_id),\r\n            }\r\n        };\r\n        self.lookup_type.insert(id, lookup_ty);\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_array(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(4)?;\r\n        let id = self.next()?;\r\n        let type_id = self.next()?;\r\n        let length_id = self.next()?;\r\n        let length_const = self.lookup_constant.lookup(length_id)?;\r\n\r\n        let decor = self.future_decor.remove(&id).unwrap_or_default();\r\n        let base = self.lookup_type.lookup(type_id)?.handle;\r\n        self.layouter\r\n            .update(&module.types, &module.constants)\r\n            .unwrap();\r\n        let inner = crate::TypeInner::Array {\r\n            base,\r\n            size: crate::ArraySize::Constant(length_const.handle),\r\n            stride: match decor.array_stride {\r\n                Some(stride) => stride.get(),\r\n                None => self.layouter[base].to_stride(),\r\n            },\r\n        };\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: decor.name,\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: Some(type_id),\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_runtime_array(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(3)?;\r\n        let id = self.next()?;\r\n        let type_id = self.next()?;\r\n\r\n        let decor = self.future_decor.remove(&id).unwrap_or_default();\r\n        let base = self.lookup_type.lookup(type_id)?.handle;\r\n        self.layouter\r\n            .update(&module.types, &module.constants)\r\n            .unwrap();\r\n        let inner = crate::TypeInner::Array {\r\n            base: self.lookup_type.lookup(type_id)?.handle,\r\n            size: crate::ArraySize::Dynamic,\r\n            stride: match decor.array_stride {\r\n                Some(stride) => stride.get(),\r\n                None => self.layouter[base].to_stride(),\r\n            },\r\n        };\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: module.types.insert(\r\n                    crate::Type {\r\n                        name: decor.name,\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                base_id: Some(type_id),\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_struct(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect_at_least(2)?;\r\n        let id = self.next()?;\r\n        let parent_decor = self.future_decor.remove(&id);\r\n        let is_storage_buffer = parent_decor\r\n            .as_ref()\r\n            .map_or(false, |decor| decor.storage_buffer);\r\n\r\n        self.layouter\r\n            .update(&module.types, &module.constants)\r\n            .unwrap();\r\n\r\n        let mut members = Vec::<crate::StructMember>::with_capacity(inst.wc as usize - 2);\r\n        let mut member_lookups = Vec::with_capacity(members.capacity());\r\n        let mut storage_access = crate::StorageAccess::empty();\r\n        let mut span = 0;\r\n        let mut alignment = Alignment::ONE;\r\n        for i in 0..u32::from(inst.wc) - 2 {\r\n            let type_id = self.next()?;\r\n            let ty = self.lookup_type.lookup(type_id)?.handle;\r\n            let decor = self\r\n                .future_member_decor\r\n                .remove(&(id, i))\r\n                .unwrap_or_default();\r\n\r\n            storage_access |= decor.flags.to_storage_access();\r\n\r\n            member_lookups.push(LookupMember {\r\n                type_id,\r\n                row_major: decor.matrix_major == Some(Majority::Row),\r\n            });\r\n\r\n            let member_alignment = self.layouter[ty].alignment;\r\n            span = member_alignment.round_up(span);\r\n            alignment = member_alignment.max(alignment);\r\n\r\n            let mut binding = decor.io_binding().ok();\r\n            if let Some(offset) = decor.offset {\r\n                span = offset;\r\n            }\r\n            let offset = span;\r\n\r\n            span += self.layouter[ty].size;\r\n\r\n            let inner = &module.types[ty].inner;\r\n            if let crate::TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } = *inner\r\n            {\r\n                if let Some(stride) = decor.matrix_stride {\r\n                    let expected_stride = Alignment::from(rows) * width as u32;\r\n                    if stride.get() != expected_stride {\r\n                        return Err(Error::UnsupportedMatrixStride {\r\n                            stride: stride.get(),\r\n                            columns: columns as u8,\r\n                            rows: rows as u8,\r\n                            width,\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n\r\n            if let Some(ref mut binding) = binding {\r\n                binding.apply_default_interpolation(inner);\r\n            }\r\n            members.push(crate::StructMember {\r\n                name: decor.name,\r\n                ty,\r\n                binding,\r\n                offset,\r\n            });\r\n        }\r\n\r\n        span = alignment.round_up(span);\r\n\r\n        let inner = crate::TypeInner::Struct { span, members };\r\n\r\n        let ty_handle = module.types.insert(\r\n            crate::Type {\r\n                name: parent_decor.and_then(|dec| dec.name),\r\n                inner,\r\n            },\r\n            self.span_from_with_op(start),\r\n        );\r\n\r\n        if is_storage_buffer {\r\n            self.lookup_storage_buffer_types\r\n                .insert(ty_handle, storage_access);\r\n        }\r\n        for (i, member_lookup) in member_lookups.into_iter().enumerate() {\r\n            self.lookup_member\r\n                .insert((ty_handle, i as u32), member_lookup);\r\n        }\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: ty_handle,\r\n                base_id: None,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_image(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(9)?;\r\n\r\n        let id = self.next()?;\r\n        let sample_type_id = self.next()?;\r\n        let dim = self.next()?;\r\n        let _is_depth = self.next()?;\r\n        let is_array = self.next()? != 0;\r\n        let is_msaa = self.next()? != 0;\r\n        let _is_sampled = self.next()?;\r\n        let format = self.next()?;\r\n\r\n        let dim = map_image_dim(dim)?;\r\n        let decor = self.future_decor.remove(&id).unwrap_or_default();\r\n\r\n        // ensure there is a type for texture coordinate without extra components\r\n        module.types.insert(\r\n            crate::Type {\r\n                name: None,\r\n                inner: {\r\n                    let kind = crate::ScalarKind::Float;\r\n                    let width = 4;\r\n                    match dim.required_coordinate_size() {\r\n                        None => crate::TypeInner::Scalar { kind, width },\r\n                        Some(size) => crate::TypeInner::Vector { size, kind, width },\r\n                    }\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let base_handle = self.lookup_type.lookup(sample_type_id)?.handle;\r\n        let kind = module.types[base_handle]\r\n            .inner\r\n            .scalar_kind()\r\n            .ok_or(Error::InvalidImageBaseType(base_handle))?;\r\n\r\n        let inner = crate::TypeInner::Image {\r\n            class: if format != 0 {\r\n                crate::ImageClass::Storage {\r\n                    format: map_image_format(format)?,\r\n                    access: crate::StorageAccess::default(),\r\n                }\r\n            } else {\r\n                crate::ImageClass::Sampled {\r\n                    kind,\r\n                    multi: is_msaa,\r\n                }\r\n            },\r\n            dim,\r\n            arrayed: is_array,\r\n        };\r\n\r\n        let handle = module.types.insert(\r\n            crate::Type {\r\n                name: decor.name,\r\n                inner,\r\n            },\r\n            self.span_from_with_op(start),\r\n        );\r\n\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle,\r\n                base_id: Some(sample_type_id),\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_sampled_image(&mut self, inst: Instruction) -> Result<(), Error> {\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(3)?;\r\n        let id = self.next()?;\r\n        let image_id = self.next()?;\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle: self.lookup_type.lookup(image_id)?.handle,\r\n                base_id: Some(image_id),\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_type_sampler(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(2)?;\r\n        let id = self.next()?;\r\n        let decor = self.future_decor.remove(&id).unwrap_or_default();\r\n        let handle = module.types.insert(\r\n            crate::Type {\r\n                name: decor.name,\r\n                inner: crate::TypeInner::Sampler { comparison: false },\r\n            },\r\n            self.span_from_with_op(start),\r\n        );\r\n        self.lookup_type.insert(\r\n            id,\r\n            LookupType {\r\n                handle,\r\n                base_id: None,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_constant(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect_at_least(4)?;\r\n        let type_id = self.next()?;\r\n        let id = self.next()?;\r\n        let type_lookup = self.lookup_type.lookup(type_id)?;\r\n        let ty = type_lookup.handle;\r\n\r\n        let inner = match module.types[ty].inner {\r\n            crate::TypeInner::Scalar {\r\n                kind: crate::ScalarKind::Uint,\r\n                width,\r\n            } => {\r\n                let low = self.next()?;\r\n                let high = if width > 4 {\r\n                    inst.expect(5)?;\r\n                    self.next()?\r\n                } else {\r\n                    0\r\n                };\r\n                crate::ConstantInner::Scalar {\r\n                    width,\r\n                    value: crate::ScalarValue::Uint((u64::from(high) << 32) | u64::from(low)),\r\n                }\r\n            }\r\n            crate::TypeInner::Scalar {\r\n                kind: crate::ScalarKind::Sint,\r\n                width,\r\n            } => {\r\n                let low = self.next()?;\r\n                let high = if width > 4 {\r\n                    inst.expect(5)?;\r\n                    self.next()?\r\n                } else {\r\n                    0\r\n                };\r\n                crate::ConstantInner::Scalar {\r\n                    width,\r\n                    value: crate::ScalarValue::Sint(\r\n                        (i64::from(high as i32) << 32) | ((i64::from(low as i32) << 32) >> 32),\r\n                    ),\r\n                }\r\n            }\r\n            crate::TypeInner::Scalar {\r\n                kind: crate::ScalarKind::Float,\r\n                width,\r\n            } => {\r\n                let low = self.next()?;\r\n                let extended = match width {\r\n                    4 => f64::from(f32::from_bits(low)),\r\n                    8 => {\r\n                        inst.expect(5)?;\r\n                        let high = self.next()?;\r\n                        f64::from_bits((u64::from(high) << 32) | u64::from(low))\r\n                    }\r\n                    _ => return Err(Error::InvalidTypeWidth(width as u32)),\r\n                };\r\n                crate::ConstantInner::Scalar {\r\n                    width,\r\n                    value: crate::ScalarValue::Float(extended),\r\n                }\r\n            }\r\n            _ => return Err(Error::UnsupportedType(type_lookup.handle)),\r\n        };\r\n\r\n        let decor = self.future_decor.remove(&id).unwrap_or_default();\r\n\r\n        self.lookup_constant.insert(\r\n            id,\r\n            LookupConstant {\r\n                handle: module.constants.append(\r\n                    crate::Constant {\r\n                        specialization: decor.specialization,\r\n                        name: decor.name,\r\n                        inner,\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                type_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_composite_constant(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect_at_least(3)?;\r\n        let type_id = self.next()?;\r\n        let type_lookup = self.lookup_type.lookup(type_id)?;\r\n        let ty = type_lookup.handle;\r\n        let id = self.next()?;\r\n\r\n        let mut components = Vec::with_capacity(inst.wc as usize - 3);\r\n        for _ in 0..components.capacity() {\r\n            let component_id = self.next()?;\r\n            let constant = self.lookup_constant.lookup(component_id)?;\r\n            components.push(constant.handle);\r\n        }\r\n\r\n        self.lookup_constant.insert(\r\n            id,\r\n            LookupConstant {\r\n                handle: module.constants.append(\r\n                    crate::Constant {\r\n                        name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                        specialization: None,\r\n                        inner: crate::ConstantInner::Composite { ty, components },\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                type_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_null_constant(\r\n        &mut self,\r\n        inst: Instruction,\r\n        types: &UniqueArena<crate::Type>,\r\n        constants: &mut Arena<crate::Constant>,\r\n    ) -> Result<(u32, u32, Handle<crate::Constant>), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(3)?;\r\n        let type_id = self.next()?;\r\n        let id = self.next()?;\r\n        let span = self.span_from_with_op(start);\r\n        let type_lookup = self.lookup_type.lookup(type_id)?;\r\n        let ty = type_lookup.handle;\r\n\r\n        let inner = null::generate_null_constant(ty, types, constants, span)?;\r\n        let handle = constants.append(\r\n            crate::Constant {\r\n                name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                specialization: None, //TODO\r\n                inner,\r\n            },\r\n            span,\r\n        );\r\n        self.lookup_constant\r\n            .insert(id, LookupConstant { handle, type_id });\r\n        Ok((type_id, id, handle))\r\n    }\r\n\r\n    fn parse_bool_constant(\r\n        &mut self,\r\n        inst: Instruction,\r\n        value: bool,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect(3)?;\r\n        let type_id = self.next()?;\r\n        let id = self.next()?;\r\n\r\n        self.lookup_constant.insert(\r\n            id,\r\n            LookupConstant {\r\n                handle: module.constants.append(\r\n                    crate::Constant {\r\n                        name: self.future_decor.remove(&id).and_then(|dec| dec.name),\r\n                        specialization: None, //TODO\r\n                        inner: crate::ConstantInner::boolean(value),\r\n                    },\r\n                    self.span_from_with_op(start),\r\n                ),\r\n                type_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_global_variable(\r\n        &mut self,\r\n        inst: Instruction,\r\n        module: &mut crate::Module,\r\n    ) -> Result<(), Error> {\r\n        let start = self.data_offset;\r\n        self.switch(ModuleState::Type, inst.op)?;\r\n        inst.expect_at_least(4)?;\r\n        let type_id = self.next()?;\r\n        let id = self.next()?;\r\n        let storage_class = self.next()?;\r\n        let init = if inst.wc > 4 {\r\n            inst.expect(5)?;\r\n            let init_id = self.next()?;\r\n            let lconst = self.lookup_constant.lookup(init_id)?;\r\n            Some(lconst.handle)\r\n        } else {\r\n            None\r\n        };\r\n        let span = self.span_from_with_op(start);\r\n        let mut dec = self.future_decor.remove(&id).unwrap_or_default();\r\n\r\n        let original_ty = self.lookup_type.lookup(type_id)?.handle;\r\n        let mut effective_ty = original_ty;\r\n        if let crate::TypeInner::Pointer { base, space: _ } = module.types[original_ty].inner {\r\n            effective_ty = base;\r\n        };\r\n        if let crate::TypeInner::Image {\r\n            dim,\r\n            arrayed,\r\n            class: crate::ImageClass::Storage { format, access: _ },\r\n        } = module.types[effective_ty].inner\r\n        {\r\n            // Storage image types in IR have to contain the access, but not in the SPIR-V.\r\n            // The same image type in SPIR-V can be used (and has to be used) for multiple images.\r\n            // So we copy the type out and apply the variable access decorations.\r\n            let access = dec.flags.to_storage_access();\r\n            let ty = crate::Type {\r\n                name: None,\r\n                inner: crate::TypeInner::Image {\r\n                    dim,\r\n                    arrayed,\r\n                    class: crate::ImageClass::Storage { format, access },\r\n                },\r\n            };\r\n            effective_ty = module.types.insert(ty, Default::default());\r\n        }\r\n\r\n        let ext_class = match self.lookup_storage_buffer_types.get(&effective_ty) {\r\n            Some(&access) => ExtendedClass::Global(crate::AddressSpace::Storage { access }),\r\n            None => map_storage_class(storage_class)?,\r\n        };\r\n\r\n        // Fix empty name for gl_PerVertex struct generated by glslang\r\n        if let crate::TypeInner::Pointer { .. } = module.types[original_ty].inner {\r\n            if ext_class == ExtendedClass::Input || ext_class == ExtendedClass::Output {\r\n                if let Some(ref dec_name) = dec.name {\r\n                    if dec_name.is_empty() {\r\n                        dec.name = Some(\"perVertexStruct\".to_string())\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let (inner, var) = match ext_class {\r\n            ExtendedClass::Global(mut space) => {\r\n                if let crate::AddressSpace::Storage { ref mut access } = space {\r\n                    *access &= dec.flags.to_storage_access();\r\n                }\r\n                let var = crate::GlobalVariable {\r\n                    binding: dec.resource_binding(),\r\n                    name: dec.name,\r\n                    space,\r\n                    ty: effective_ty,\r\n                    init,\r\n                };\r\n                (Variable::Global, var)\r\n            }\r\n            ExtendedClass::Input => {\r\n                let mut binding = dec.io_binding()?;\r\n                let mut unsigned_ty = effective_ty;\r\n                if let crate::Binding::BuiltIn(built_in) = binding {\r\n                    let needs_inner_uint = match built_in {\r\n                        crate::BuiltIn::BaseInstance\r\n                        | crate::BuiltIn::BaseVertex\r\n                        | crate::BuiltIn::InstanceIndex\r\n                        | crate::BuiltIn::SampleIndex\r\n                        | crate::BuiltIn::VertexIndex\r\n                        | crate::BuiltIn::PrimitiveIndex\r\n                        | crate::BuiltIn::LocalInvocationIndex => Some(crate::TypeInner::Scalar {\r\n                            kind: crate::ScalarKind::Uint,\r\n                            width: 4,\r\n                        }),\r\n                        crate::BuiltIn::GlobalInvocationId\r\n                        | crate::BuiltIn::LocalInvocationId\r\n                        | crate::BuiltIn::WorkGroupId\r\n                        | crate::BuiltIn::WorkGroupSize => Some(crate::TypeInner::Vector {\r\n                            size: crate::VectorSize::Tri,\r\n                            kind: crate::ScalarKind::Uint,\r\n                            width: 4,\r\n                        }),\r\n                        _ => None,\r\n                    };\r\n                    if let (Some(inner), Some(crate::ScalarKind::Sint)) = (\r\n                        needs_inner_uint,\r\n                        module.types[effective_ty].inner.scalar_kind(),\r\n                    ) {\r\n                        unsigned_ty = module\r\n                            .types\r\n                            .insert(crate::Type { name: None, inner }, Default::default());\r\n                    }\r\n                }\r\n\r\n                let var = crate::GlobalVariable {\r\n                    name: dec.name.clone(),\r\n                    space: crate::AddressSpace::Private,\r\n                    binding: None,\r\n                    ty: effective_ty,\r\n                    init: None,\r\n                };\r\n\r\n                binding.apply_default_interpolation(&module.types[unsigned_ty].inner);\r\n\r\n                let inner = Variable::Input(crate::FunctionArgument {\r\n                    name: dec.name,\r\n                    ty: unsigned_ty,\r\n                    binding: Some(binding),\r\n                });\r\n                (inner, var)\r\n            }\r\n            ExtendedClass::Output => {\r\n                // For output interface blocks, this would be a structure.\r\n                let mut binding = dec.io_binding().ok();\r\n                let init = match binding {\r\n                    Some(crate::Binding::BuiltIn(built_in)) => {\r\n                        match null::generate_default_built_in(\r\n                            Some(built_in),\r\n                            effective_ty,\r\n                            &module.types,\r\n                            &mut module.constants,\r\n                            span,\r\n                        ) {\r\n                            Ok(handle) => Some(handle),\r\n                            Err(e) => {\r\n                                log::warn!(\"Failed to initialize output built-in: {}\", e);\r\n                                None\r\n                            }\r\n                        }\r\n                    }\r\n                    Some(crate::Binding::Location { .. }) => None,\r\n                    None => match module.types[effective_ty].inner {\r\n                        crate::TypeInner::Struct { ref members, .. } => {\r\n                            // A temporary to avoid borrowing `module.types`\r\n                            let pairs = members\r\n                                .iter()\r\n                                .map(|member| {\r\n                                    let built_in = match member.binding {\r\n                                        Some(crate::Binding::BuiltIn(built_in)) => Some(built_in),\r\n                                        _ => None,\r\n                                    };\r\n                                    (built_in, member.ty)\r\n                                })\r\n                                .collect::<Vec<_>>();\r\n\r\n                            let mut components = Vec::with_capacity(members.len());\r\n                            for (built_in, member_ty) in pairs {\r\n                                let handle = null::generate_default_built_in(\r\n                                    built_in,\r\n                                    member_ty,\r\n                                    &module.types,\r\n                                    &mut module.constants,\r\n                                    span,\r\n                                )?;\r\n                                components.push(handle);\r\n                            }\r\n                            Some(module.constants.append(\r\n                                crate::Constant {\r\n                                    name: None,\r\n                                    specialization: None,\r\n                                    inner: crate::ConstantInner::Composite {\r\n                                        ty: effective_ty,\r\n                                        components,\r\n                                    },\r\n                                },\r\n                                span,\r\n                            ))\r\n                        }\r\n                        _ => None,\r\n                    },\r\n                };\r\n\r\n                let var = crate::GlobalVariable {\r\n                    name: dec.name,\r\n                    space: crate::AddressSpace::Private,\r\n                    binding: None,\r\n                    ty: effective_ty,\r\n                    init,\r\n                };\r\n                if let Some(ref mut binding) = binding {\r\n                    binding.apply_default_interpolation(&module.types[effective_ty].inner);\r\n                }\r\n                let inner = Variable::Output(crate::FunctionResult {\r\n                    ty: effective_ty,\r\n                    binding,\r\n                });\r\n                (inner, var)\r\n            }\r\n        };\r\n\r\n        let handle = module.global_variables.append(var, span);\r\n        if module.types[effective_ty].inner.can_comparison_sample() {\r\n            log::debug!(\"\\t\\ttracking {:?} for sampling properties\", handle);\r\n            self.handle_sampling\r\n                .insert(handle, image::SamplingFlags::empty());\r\n        }\r\n\r\n        self.lookup_variable.insert(\r\n            id,\r\n            LookupVariable {\r\n                inner,\r\n                handle,\r\n                type_id,\r\n            },\r\n        );\r\n        Ok(())\r\n    }\r\n}\r\n\r\npub fn parse_u8_slice(data: &[u8], options: &Options) -> Result<crate::Module, Error> {\r\n    if data.len() % 4 != 0 {\r\n        return Err(Error::IncompleteData);\r\n    }\r\n\r\n    let words = data\r\n        .chunks(4)\r\n        .map(|c| u32::from_le_bytes(c.try_into().unwrap()));\r\n    Parser::new(words, options).parse()\r\n}\r\n\r\n#[cfg(test)]\r\nmod test {\r\n    #[test]\r\n    fn parse() {\r\n        let bin = vec![\r\n            // Magic number.           Version number: 1.0.\r\n            0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00,\r\n            // Generator number: 0.    Bound: 0.\r\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reserved word: 0.\r\n            0x00, 0x00, 0x00, 0x00, // OpMemoryModel.          Logical.\r\n            0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // GLSL450.\r\n            0x01, 0x00, 0x00, 0x00,\r\n        ];\r\n        let _ = super::parse_u8_slice(&bin, &Default::default()).unwrap();\r\n    }\r\n}\r\n\r\n/// Helper function to check if `child` is in the scope of `parent`\r\nfn is_parent(mut child: usize, parent: usize, block_ctx: &BlockContext) -> bool {\r\n    loop {\r\n        if child == parent {\r\n            // The child is in the scope parent\r\n            break true;\r\n        } else if child == 0 {\r\n            // Searched finished at the root the child isn't in the parent's body\r\n            break false;\r\n        }\r\n\r\n        child = block_ctx.bodies[child].parent;\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/spv/null.rs",
    "content": "use super::Error;\r\nuse crate::arena::{Arena, Handle, UniqueArena};\r\n\r\nconst fn make_scalar_inner(kind: crate::ScalarKind, width: crate::Bytes) -> crate::ConstantInner {\r\n    crate::ConstantInner::Scalar {\r\n        width,\r\n        value: match kind {\r\n            crate::ScalarKind::Uint => crate::ScalarValue::Uint(0),\r\n            crate::ScalarKind::Sint => crate::ScalarValue::Sint(0),\r\n            crate::ScalarKind::Float => crate::ScalarValue::Float(0.0),\r\n            crate::ScalarKind::Bool => crate::ScalarValue::Bool(false),\r\n        },\r\n    }\r\n}\r\n\r\npub fn generate_null_constant(\r\n    ty: Handle<crate::Type>,\r\n    type_arena: &UniqueArena<crate::Type>,\r\n    constant_arena: &mut Arena<crate::Constant>,\r\n    span: crate::Span,\r\n) -> Result<crate::ConstantInner, Error> {\r\n    let inner = match type_arena[ty].inner {\r\n        crate::TypeInner::Scalar { kind, width } => make_scalar_inner(kind, width),\r\n        crate::TypeInner::Vector { size, kind, width } => {\r\n            let mut components = Vec::with_capacity(size as usize);\r\n            for _ in 0..size as usize {\r\n                components.push(constant_arena.fetch_or_append(\r\n                    crate::Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner: make_scalar_inner(kind, width),\r\n                    },\r\n                    span,\r\n                ));\r\n            }\r\n            crate::ConstantInner::Composite { ty, components }\r\n        }\r\n        crate::TypeInner::Matrix {\r\n            columns,\r\n            rows,\r\n            width,\r\n        } => {\r\n            // If we successfully declared a matrix type, we have declared a vector type for it too.\r\n            let vector_ty = type_arena\r\n                .get(&crate::Type {\r\n                    name: None,\r\n                    inner: crate::TypeInner::Vector {\r\n                        kind: crate::ScalarKind::Float,\r\n                        size: rows,\r\n                        width,\r\n                    },\r\n                })\r\n                .unwrap();\r\n            let vector_inner = generate_null_constant(vector_ty, type_arena, constant_arena, span)?;\r\n            let vector_handle = constant_arena.fetch_or_append(\r\n                crate::Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner: vector_inner,\r\n                },\r\n                span,\r\n            );\r\n            crate::ConstantInner::Composite {\r\n                ty,\r\n                components: vec![vector_handle; columns as usize],\r\n            }\r\n        }\r\n        crate::TypeInner::Struct { ref members, .. } => {\r\n            let mut components = Vec::with_capacity(members.len());\r\n            // copy out the types to avoid borrowing `members`\r\n            let member_tys = members.iter().map(|member| member.ty).collect::<Vec<_>>();\r\n            for member_ty in member_tys {\r\n                let inner = generate_null_constant(member_ty, type_arena, constant_arena, span)?;\r\n                components.push(constant_arena.fetch_or_append(\r\n                    crate::Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner,\r\n                    },\r\n                    span,\r\n                ));\r\n            }\r\n            crate::ConstantInner::Composite { ty, components }\r\n        }\r\n        crate::TypeInner::Array {\r\n            base,\r\n            size: crate::ArraySize::Constant(handle),\r\n            ..\r\n        } => {\r\n            let size = constant_arena[handle]\r\n                .to_array_length()\r\n                .ok_or(Error::InvalidArraySize(handle))?;\r\n            let inner = generate_null_constant(base, type_arena, constant_arena, span)?;\r\n            let value = constant_arena.fetch_or_append(\r\n                crate::Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner,\r\n                },\r\n                span,\r\n            );\r\n            crate::ConstantInner::Composite {\r\n                ty,\r\n                components: vec![value; size as usize],\r\n            }\r\n        }\r\n        ref other => {\r\n            log::warn!(\"null constant type {:?}\", other);\r\n            return Err(Error::UnsupportedType(ty));\r\n        }\r\n    };\r\n    Ok(inner)\r\n}\r\n\r\n/// Create a default value for an output built-in.\r\npub fn generate_default_built_in(\r\n    built_in: Option<crate::BuiltIn>,\r\n    ty: Handle<crate::Type>,\r\n    type_arena: &UniqueArena<crate::Type>,\r\n    constant_arena: &mut Arena<crate::Constant>,\r\n    span: crate::Span,\r\n) -> Result<Handle<crate::Constant>, Error> {\r\n    let inner = match built_in {\r\n        Some(crate::BuiltIn::Position { .. }) => {\r\n            let zero = constant_arena.fetch_or_append(\r\n                crate::Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner: crate::ConstantInner::Scalar {\r\n                        value: crate::ScalarValue::Float(0.0),\r\n                        width: 4,\r\n                    },\r\n                },\r\n                span,\r\n            );\r\n            let one = constant_arena.fetch_or_append(\r\n                crate::Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner: crate::ConstantInner::Scalar {\r\n                        value: crate::ScalarValue::Float(1.0),\r\n                        width: 4,\r\n                    },\r\n                },\r\n                span,\r\n            );\r\n            crate::ConstantInner::Composite {\r\n                ty,\r\n                components: vec![zero, zero, zero, one],\r\n            }\r\n        }\r\n        Some(crate::BuiltIn::PointSize) => crate::ConstantInner::Scalar {\r\n            value: crate::ScalarValue::Float(1.0),\r\n            width: 4,\r\n        },\r\n        Some(crate::BuiltIn::FragDepth) => crate::ConstantInner::Scalar {\r\n            value: crate::ScalarValue::Float(0.0),\r\n            width: 4,\r\n        },\r\n        Some(crate::BuiltIn::SampleMask) => crate::ConstantInner::Scalar {\r\n            value: crate::ScalarValue::Uint(u64::MAX),\r\n            width: 4,\r\n        },\r\n        //Note: `crate::BuiltIn::ClipDistance` is intentionally left for the default path\r\n        _ => generate_null_constant(ty, type_arena, constant_arena, span)?,\r\n    };\r\n    Ok(constant_arena.fetch_or_append(\r\n        crate::Constant {\r\n            name: None,\r\n            specialization: None,\r\n            inner,\r\n        },\r\n        span,\r\n    ))\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/wgsl/construction.rs",
    "content": "use crate::{\r\n    proc::TypeResolution, Arena, ArraySize, Bytes, Constant, ConstantInner, Expression, Handle,\r\n    ScalarKind, ScalarValue, Span as NagaSpan, Type, TypeInner, UniqueArena, VectorSize,\r\n};\r\n\r\nuse super::{Error, ExpressionContext, Lexer, Parser, Rule, Span, Token};\r\n\r\n/// Represents the type of the constructor\r\n///\r\n/// Vectors, Matrices and Arrays can have partial type information\r\n/// which later gets inferred from the constructor parameters\r\nenum ConstructorType {\r\n    Scalar {\r\n        kind: ScalarKind,\r\n        width: Bytes,\r\n    },\r\n    PartialVector {\r\n        size: VectorSize,\r\n    },\r\n    Vector {\r\n        size: VectorSize,\r\n        kind: ScalarKind,\r\n        width: Bytes,\r\n    },\r\n    PartialMatrix {\r\n        columns: VectorSize,\r\n        rows: VectorSize,\r\n    },\r\n    Matrix {\r\n        columns: VectorSize,\r\n        rows: VectorSize,\r\n        width: Bytes,\r\n    },\r\n    PartialArray,\r\n    Array {\r\n        base: Handle<Type>,\r\n        size: ArraySize,\r\n        stride: u32,\r\n    },\r\n    Struct(Handle<Type>),\r\n}\r\n\r\nimpl ConstructorType {\r\n    const fn to_type_resolution(&self) -> Option<TypeResolution> {\r\n        Some(match *self {\r\n            ConstructorType::Scalar { kind, width } => {\r\n                TypeResolution::Value(TypeInner::Scalar { kind, width })\r\n            }\r\n            ConstructorType::Vector { size, kind, width } => {\r\n                TypeResolution::Value(TypeInner::Vector { size, kind, width })\r\n            }\r\n            ConstructorType::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => TypeResolution::Value(TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            }),\r\n            ConstructorType::Array { base, size, stride } => {\r\n                TypeResolution::Value(TypeInner::Array { base, size, stride })\r\n            }\r\n            ConstructorType::Struct(handle) => TypeResolution::Handle(handle),\r\n            _ => return None,\r\n        })\r\n    }\r\n}\r\n\r\nimpl ConstructorType {\r\n    fn to_error_string(&self, types: &UniqueArena<Type>, constants: &Arena<Constant>) -> String {\r\n        match *self {\r\n            ConstructorType::Scalar { kind, width } => kind.to_wgsl(width),\r\n            ConstructorType::PartialVector { size } => {\r\n                format!(\"vec{}<?>\", size as u32,)\r\n            }\r\n            ConstructorType::Vector { size, kind, width } => {\r\n                format!(\"vec{}<{}>\", size as u32, kind.to_wgsl(width))\r\n            }\r\n            ConstructorType::PartialMatrix { columns, rows } => {\r\n                format!(\"mat{}x{}<?>\", columns as u32, rows as u32,)\r\n            }\r\n            ConstructorType::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                format!(\r\n                    \"mat{}x{}<{}>\",\r\n                    columns as u32,\r\n                    rows as u32,\r\n                    ScalarKind::Float.to_wgsl(width)\r\n                )\r\n            }\r\n            ConstructorType::PartialArray => \"array<?, ?>\".to_string(),\r\n            ConstructorType::Array { base, size, .. } => {\r\n                format!(\r\n                    \"array<{}, {}>\",\r\n                    types[base].name.as_deref().unwrap_or(\"?\"),\r\n                    match size {\r\n                        ArraySize::Constant(size) => {\r\n                            constants[size]\r\n                                .to_array_length()\r\n                                .map(|len| len.to_string())\r\n                                .unwrap_or_else(|| \"?\".to_string())\r\n                        }\r\n                        _ => unreachable!(),\r\n                    }\r\n                )\r\n            }\r\n            ConstructorType::Struct(handle) => types[handle]\r\n                .name\r\n                .clone()\r\n                .unwrap_or_else(|| \"?\".to_string()),\r\n        }\r\n    }\r\n}\r\n\r\nfn parse_constructor_type<'a>(\r\n    parser: &mut Parser,\r\n    lexer: &mut Lexer<'a>,\r\n    word: &'a str,\r\n    type_arena: &mut UniqueArena<Type>,\r\n    const_arena: &mut Arena<Constant>,\r\n) -> Result<Option<ConstructorType>, Error<'a>> {\r\n    if let Some((kind, width)) = super::conv::get_scalar_type(word) {\r\n        return Ok(Some(ConstructorType::Scalar { kind, width }));\r\n    }\r\n\r\n    let partial = match word {\r\n        \"vec2\" => ConstructorType::PartialVector {\r\n            size: VectorSize::Bi,\r\n        },\r\n        \"vec3\" => ConstructorType::PartialVector {\r\n            size: VectorSize::Tri,\r\n        },\r\n        \"vec4\" => ConstructorType::PartialVector {\r\n            size: VectorSize::Quad,\r\n        },\r\n        \"mat2x2\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Bi,\r\n            rows: VectorSize::Bi,\r\n        },\r\n        \"mat2x3\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Bi,\r\n            rows: VectorSize::Tri,\r\n        },\r\n        \"mat2x4\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Bi,\r\n            rows: VectorSize::Quad,\r\n        },\r\n        \"mat3x2\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Tri,\r\n            rows: VectorSize::Bi,\r\n        },\r\n        \"mat3x3\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Tri,\r\n            rows: VectorSize::Tri,\r\n        },\r\n        \"mat3x4\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Tri,\r\n            rows: VectorSize::Quad,\r\n        },\r\n        \"mat4x2\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Quad,\r\n            rows: VectorSize::Bi,\r\n        },\r\n        \"mat4x3\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Quad,\r\n            rows: VectorSize::Tri,\r\n        },\r\n        \"mat4x4\" => ConstructorType::PartialMatrix {\r\n            columns: VectorSize::Quad,\r\n            rows: VectorSize::Quad,\r\n        },\r\n        \"array\" => ConstructorType::PartialArray,\r\n        _ => return Ok(None),\r\n    };\r\n\r\n    // parse component type if present\r\n    match (lexer.peek().0, partial) {\r\n        (Token::Paren('<'), ConstructorType::PartialVector { size }) => {\r\n            let (kind, width) = lexer.next_scalar_generic()?;\r\n            Ok(Some(ConstructorType::Vector { size, kind, width }))\r\n        }\r\n        (Token::Paren('<'), ConstructorType::PartialMatrix { columns, rows }) => {\r\n            let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n            match kind {\r\n                ScalarKind::Float => Ok(Some(ConstructorType::Matrix {\r\n                    columns,\r\n                    rows,\r\n                    width,\r\n                })),\r\n                _ => Err(Error::BadMatrixScalarKind(span, kind, width)),\r\n            }\r\n        }\r\n        (Token::Paren('<'), ConstructorType::PartialArray) => {\r\n            lexer.expect_generic_paren('<')?;\r\n            let base = parser.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n            let size = if lexer.skip(Token::Separator(',')) {\r\n                let const_handle = parser.parse_const_expression(lexer, type_arena, const_arena)?;\r\n                ArraySize::Constant(const_handle)\r\n            } else {\r\n                ArraySize::Dynamic\r\n            };\r\n            lexer.expect_generic_paren('>')?;\r\n\r\n            let stride = {\r\n                parser.layouter.update(type_arena, const_arena).unwrap();\r\n                parser.layouter[base].to_stride()\r\n            };\r\n\r\n            Ok(Some(ConstructorType::Array { base, size, stride }))\r\n        }\r\n        (_, partial) => Ok(Some(partial)),\r\n    }\r\n}\r\n\r\n/// Expects [`Rule::PrimaryExpr`] on top of rule stack; if returning Some(_), pops it.\r\npub(super) fn parse_construction<'a>(\r\n    parser: &mut Parser,\r\n    lexer: &mut Lexer<'a>,\r\n    type_name: &'a str,\r\n    type_span: Span,\r\n    mut ctx: ExpressionContext<'a, '_, '_>,\r\n) -> Result<Option<Handle<Expression>>, Error<'a>> {\r\n    assert_eq!(\r\n        parser.rules.last().map(|&(ref rule, _)| rule.clone()),\r\n        Some(Rule::PrimaryExpr)\r\n    );\r\n    let dst_ty = match parser.lookup_type.get(type_name) {\r\n        Some(&handle) => ConstructorType::Struct(handle),\r\n        None => match parse_constructor_type(parser, lexer, type_name, ctx.types, ctx.constants)? {\r\n            Some(inner) => inner,\r\n            None => {\r\n                match parser.parse_type_decl_impl(\r\n                    lexer,\r\n                    super::TypeAttributes::default(),\r\n                    type_name,\r\n                    ctx.types,\r\n                    ctx.constants,\r\n                )? {\r\n                    Some(_) => {\r\n                        return Err(Error::TypeNotConstructible(type_span));\r\n                    }\r\n                    None => return Ok(None),\r\n                }\r\n            }\r\n        },\r\n    };\r\n\r\n    lexer.open_arguments()?;\r\n\r\n    let mut components = Vec::new();\r\n    let mut spans = Vec::new();\r\n\r\n    if lexer.peek().0 == Token::Paren(')') {\r\n        let _ = lexer.next();\r\n    } else {\r\n        while components.is_empty() || lexer.next_argument()? {\r\n            let (component, span) = lexer\r\n                .capture_span(|lexer| parser.parse_general_expression(lexer, ctx.reborrow()))?;\r\n            components.push(component);\r\n            spans.push(span);\r\n        }\r\n    }\r\n\r\n    enum Components<'a> {\r\n        None,\r\n        One {\r\n            component: Handle<Expression>,\r\n            span: Span,\r\n            ty: &'a TypeInner,\r\n        },\r\n        Many {\r\n            components: Vec<Handle<Expression>>,\r\n            spans: Vec<Span>,\r\n            first_component_ty: &'a TypeInner,\r\n        },\r\n    }\r\n\r\n    impl<'a> Components<'a> {\r\n        fn into_components_vec(self) -> Vec<Handle<Expression>> {\r\n            match self {\r\n                Components::None => vec![],\r\n                Components::One { component, .. } => vec![component],\r\n                Components::Many { components, .. } => components,\r\n            }\r\n        }\r\n    }\r\n\r\n    let components = match *components.as_slice() {\r\n        [] => Components::None,\r\n        [component] => {\r\n            ctx.resolve_type(component)?;\r\n            Components::One {\r\n                component,\r\n                span: spans[0].clone(),\r\n                ty: ctx.typifier.get(component, ctx.types),\r\n            }\r\n        }\r\n        [component, ..] => {\r\n            ctx.resolve_type(component)?;\r\n            Components::Many {\r\n                components,\r\n                spans,\r\n                first_component_ty: ctx.typifier.get(component, ctx.types),\r\n            }\r\n        }\r\n    };\r\n\r\n    let expr = match (components, dst_ty) {\r\n        // Empty constructor\r\n        (Components::None, dst_ty) => {\r\n            let ty = match dst_ty.to_type_resolution() {\r\n                Some(TypeResolution::Handle(handle)) => handle,\r\n                Some(TypeResolution::Value(inner)) => ctx\r\n                    .types\r\n                    .insert(Type { name: None, inner }, Default::default()),\r\n                None => return Err(Error::TypeNotInferrable(type_span)),\r\n            };\r\n\r\n            return match ctx.create_zero_value_constant(ty) {\r\n                Some(constant) => {\r\n                    let span = parser.pop_rule_span(lexer);\r\n                    Ok(Some(ctx.interrupt_emitter(\r\n                        Expression::Constant(constant),\r\n                        span.into(),\r\n                    )))\r\n                }\r\n                None => Err(Error::TypeNotConstructible(type_span)),\r\n            };\r\n        }\r\n\r\n        // Scalar constructor & conversion (scalar -> scalar)\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty: &TypeInner::Scalar { .. },\r\n                ..\r\n            },\r\n            ConstructorType::Scalar { kind, width },\r\n        ) => Expression::As {\r\n            expr: component,\r\n            kind,\r\n            convert: Some(width),\r\n        },\r\n\r\n        // Vector conversion (vector -> vector)\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty: &TypeInner::Vector { size: src_size, .. },\r\n                ..\r\n            },\r\n            ConstructorType::Vector {\r\n                size: dst_size,\r\n                kind: dst_kind,\r\n                width: dst_width,\r\n            },\r\n        ) if dst_size == src_size => Expression::As {\r\n            expr: component,\r\n            kind: dst_kind,\r\n            convert: Some(dst_width),\r\n        },\r\n\r\n        // Vector conversion (vector -> vector) - partial\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty:\r\n                    &TypeInner::Vector {\r\n                        size: src_size,\r\n                        kind: src_kind,\r\n                        ..\r\n                    },\r\n                ..\r\n            },\r\n            ConstructorType::PartialVector { size: dst_size },\r\n        ) if dst_size == src_size => Expression::As {\r\n            expr: component,\r\n            kind: src_kind,\r\n            convert: None,\r\n        },\r\n\r\n        // Matrix conversion (matrix -> matrix)\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty:\r\n                    &TypeInner::Matrix {\r\n                        columns: src_columns,\r\n                        rows: src_rows,\r\n                        ..\r\n                    },\r\n                ..\r\n            },\r\n            ConstructorType::Matrix {\r\n                columns: dst_columns,\r\n                rows: dst_rows,\r\n                width: dst_width,\r\n            },\r\n        ) if dst_columns == src_columns && dst_rows == src_rows => Expression::As {\r\n            expr: component,\r\n            kind: ScalarKind::Float,\r\n            convert: Some(dst_width),\r\n        },\r\n\r\n        // Matrix conversion (matrix -> matrix) - partial\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty:\r\n                    &TypeInner::Matrix {\r\n                        columns: src_columns,\r\n                        rows: src_rows,\r\n                        ..\r\n                    },\r\n                ..\r\n            },\r\n            ConstructorType::PartialMatrix {\r\n                columns: dst_columns,\r\n                rows: dst_rows,\r\n            },\r\n        ) if dst_columns == src_columns && dst_rows == src_rows => Expression::As {\r\n            expr: component,\r\n            kind: ScalarKind::Float,\r\n            convert: None,\r\n        },\r\n\r\n        // Vector constructor (splat) - infer type\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty: &TypeInner::Scalar { .. },\r\n                ..\r\n            },\r\n            ConstructorType::PartialVector { size },\r\n        ) => Expression::Splat {\r\n            size,\r\n            value: component,\r\n        },\r\n\r\n        // Vector constructor (splat)\r\n        (\r\n            Components::One {\r\n                component,\r\n                ty:\r\n                    &TypeInner::Scalar {\r\n                        kind: src_kind,\r\n                        width: src_width,\r\n                        ..\r\n                    },\r\n                ..\r\n            },\r\n            ConstructorType::Vector {\r\n                size,\r\n                kind: dst_kind,\r\n                width: dst_width,\r\n            },\r\n        ) if dst_kind == src_kind || dst_width == src_width => Expression::Splat {\r\n            size,\r\n            value: component,\r\n        },\r\n\r\n        // Vector constructor (by elements)\r\n        (\r\n            Components::Many {\r\n                components,\r\n                first_component_ty:\r\n                    &TypeInner::Scalar { kind, width } | &TypeInner::Vector { kind, width, .. },\r\n                ..\r\n            },\r\n            ConstructorType::PartialVector { size },\r\n        )\r\n        | (\r\n            Components::Many {\r\n                components,\r\n                first_component_ty: &TypeInner::Scalar { .. } | &TypeInner::Vector { .. },\r\n                ..\r\n            },\r\n            ConstructorType::Vector { size, width, kind },\r\n        ) => {\r\n            let ty = ctx.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Vector { size, kind, width },\r\n                },\r\n                Default::default(),\r\n            );\r\n            Expression::Compose { ty, components }\r\n        }\r\n\r\n        // Matrix constructor (by elements)\r\n        (\r\n            Components::Many {\r\n                components,\r\n                first_component_ty: &TypeInner::Scalar { width, .. },\r\n                ..\r\n            },\r\n            ConstructorType::PartialMatrix { columns, rows },\r\n        )\r\n        | (\r\n            Components::Many {\r\n                components,\r\n                first_component_ty: &TypeInner::Scalar { .. },\r\n                ..\r\n            },\r\n            ConstructorType::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            },\r\n        ) => {\r\n            let vec_ty = ctx.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Vector {\r\n                        width,\r\n                        kind: ScalarKind::Float,\r\n                        size: rows,\r\n                    },\r\n                },\r\n                Default::default(),\r\n            );\r\n\r\n            let components = components\r\n                .chunks(rows as usize)\r\n                .map(|vec_components| {\r\n                    ctx.expressions.append(\r\n                        Expression::Compose {\r\n                            ty: vec_ty,\r\n                            components: Vec::from(vec_components),\r\n                        },\r\n                        Default::default(),\r\n                    )\r\n                })\r\n                .collect();\r\n\r\n            let ty = ctx.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width,\r\n                    },\r\n                },\r\n                Default::default(),\r\n            );\r\n            Expression::Compose { ty, components }\r\n        }\r\n\r\n        // Matrix constructor (by columns)\r\n        (\r\n            Components::Many {\r\n                components,\r\n                first_component_ty: &TypeInner::Vector { width, .. },\r\n                ..\r\n            },\r\n            ConstructorType::PartialMatrix { columns, rows },\r\n        )\r\n        | (\r\n            Components::Many {\r\n                components,\r\n                first_component_ty: &TypeInner::Vector { .. },\r\n                ..\r\n            },\r\n            ConstructorType::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            },\r\n        ) => {\r\n            let ty = ctx.types.insert(\r\n                Type {\r\n                    name: None,\r\n                    inner: TypeInner::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width,\r\n                    },\r\n                },\r\n                Default::default(),\r\n            );\r\n            Expression::Compose { ty, components }\r\n        }\r\n\r\n        // Array constructor - infer type\r\n        (components, ConstructorType::PartialArray) => {\r\n            let components = components.into_components_vec();\r\n\r\n            let base = match ctx.typifier[components[0]].clone() {\r\n                TypeResolution::Handle(ty) => ty,\r\n                TypeResolution::Value(inner) => ctx\r\n                    .types\r\n                    .insert(Type { name: None, inner }, Default::default()),\r\n            };\r\n\r\n            let size = Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner: ConstantInner::Scalar {\r\n                    width: 4,\r\n                    value: ScalarValue::Uint(components.len() as u64),\r\n                },\r\n            };\r\n\r\n            let inner = TypeInner::Array {\r\n                base,\r\n                size: ArraySize::Constant(ctx.constants.append(size, Default::default())),\r\n                stride: {\r\n                    parser.layouter.update(ctx.types, ctx.constants).unwrap();\r\n                    parser.layouter[base].to_stride()\r\n                },\r\n            };\r\n\r\n            let ty = ctx\r\n                .types\r\n                .insert(Type { name: None, inner }, Default::default());\r\n\r\n            Expression::Compose { ty, components }\r\n        }\r\n\r\n        // Array constructor\r\n        (components, ConstructorType::Array { base, size, stride }) => {\r\n            let components = components.into_components_vec();\r\n            let inner = TypeInner::Array { base, size, stride };\r\n            let ty = ctx\r\n                .types\r\n                .insert(Type { name: None, inner }, Default::default());\r\n            Expression::Compose { ty, components }\r\n        }\r\n\r\n        // Struct constructor\r\n        (components, ConstructorType::Struct(ty)) => Expression::Compose {\r\n            ty,\r\n            components: components.into_components_vec(),\r\n        },\r\n\r\n        // ERRORS\r\n\r\n        // Bad conversion (type cast)\r\n        (\r\n            Components::One {\r\n                span, ty: src_ty, ..\r\n            },\r\n            dst_ty,\r\n        ) => {\r\n            return Err(Error::BadTypeCast {\r\n                span,\r\n                from_type: src_ty.to_wgsl(ctx.types, ctx.constants),\r\n                to_type: dst_ty.to_error_string(ctx.types, ctx.constants),\r\n            });\r\n        }\r\n\r\n        // Too many parameters for scalar constructor\r\n        (Components::Many { spans, .. }, ConstructorType::Scalar { .. }) => {\r\n            return Err(Error::UnexpectedComponents(Span {\r\n                start: spans[1].start,\r\n                end: spans.last().unwrap().end,\r\n            }));\r\n        }\r\n\r\n        // Parameters are of the wrong type for vector or matrix constructor\r\n        (\r\n            Components::Many { spans, .. },\r\n            ConstructorType::Vector { .. }\r\n            | ConstructorType::Matrix { .. }\r\n            | ConstructorType::PartialVector { .. }\r\n            | ConstructorType::PartialMatrix { .. },\r\n        ) => {\r\n            return Err(Error::InvalidConstructorComponentType(spans[0].clone(), 0));\r\n        }\r\n    };\r\n\r\n    let span = NagaSpan::from(parser.pop_rule_span(lexer));\r\n    Ok(Some(ctx.expressions.append(expr, span)))\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/wgsl/conv.rs",
    "content": "use super::{Error, Span};\r\n\r\npub fn map_address_space(word: &str, span: Span) -> Result<crate::AddressSpace, Error<'_>> {\r\n    match word {\r\n        \"private\" => Ok(crate::AddressSpace::Private),\r\n        \"workgroup\" => Ok(crate::AddressSpace::WorkGroup),\r\n        \"uniform\" => Ok(crate::AddressSpace::Uniform),\r\n        \"storage\" => Ok(crate::AddressSpace::Storage {\r\n            access: crate::StorageAccess::default(),\r\n        }),\r\n        \"push_constant\" => Ok(crate::AddressSpace::PushConstant),\r\n        \"function\" => Ok(crate::AddressSpace::Function),\r\n        _ => Err(Error::UnknownAddressSpace(span)),\r\n    }\r\n}\r\n\r\npub fn map_built_in(word: &str, span: Span) -> Result<crate::BuiltIn, Error<'_>> {\r\n    Ok(match word {\r\n        \"position\" => crate::BuiltIn::Position { invariant: false },\r\n        // vertex\r\n        \"vertex_index\" => crate::BuiltIn::VertexIndex,\r\n        \"instance_index\" => crate::BuiltIn::InstanceIndex,\r\n        \"view_index\" => crate::BuiltIn::ViewIndex,\r\n        // fragment\r\n        \"front_facing\" => crate::BuiltIn::FrontFacing,\r\n        \"frag_depth\" => crate::BuiltIn::FragDepth,\r\n        \"primitive_index\" => crate::BuiltIn::PrimitiveIndex,\r\n        \"sample_index\" => crate::BuiltIn::SampleIndex,\r\n        \"sample_mask\" => crate::BuiltIn::SampleMask,\r\n        // compute\r\n        \"global_invocation_id\" => crate::BuiltIn::GlobalInvocationId,\r\n        \"local_invocation_id\" => crate::BuiltIn::LocalInvocationId,\r\n        \"local_invocation_index\" => crate::BuiltIn::LocalInvocationIndex,\r\n        \"workgroup_id\" => crate::BuiltIn::WorkGroupId,\r\n        \"workgroup_size\" => crate::BuiltIn::WorkGroupSize,\r\n        \"num_workgroups\" => crate::BuiltIn::NumWorkGroups,\r\n        _ => return Err(Error::UnknownBuiltin(span)),\r\n    })\r\n}\r\n\r\npub fn map_interpolation(word: &str, span: Span) -> Result<crate::Interpolation, Error<'_>> {\r\n    match word {\r\n        \"linear\" => Ok(crate::Interpolation::Linear),\r\n        \"flat\" => Ok(crate::Interpolation::Flat),\r\n        \"perspective\" => Ok(crate::Interpolation::Perspective),\r\n        _ => Err(Error::UnknownAttribute(span)),\r\n    }\r\n}\r\n\r\npub fn map_sampling(word: &str, span: Span) -> Result<crate::Sampling, Error<'_>> {\r\n    match word {\r\n        \"center\" => Ok(crate::Sampling::Center),\r\n        \"centroid\" => Ok(crate::Sampling::Centroid),\r\n        \"sample\" => Ok(crate::Sampling::Sample),\r\n        _ => Err(Error::UnknownAttribute(span)),\r\n    }\r\n}\r\n\r\npub fn map_storage_format(word: &str, span: Span) -> Result<crate::StorageFormat, Error<'_>> {\r\n    use crate::StorageFormat as Sf;\r\n    Ok(match word {\r\n        \"r8unorm\" => Sf::R8Unorm,\r\n        \"r8snorm\" => Sf::R8Snorm,\r\n        \"r8uint\" => Sf::R8Uint,\r\n        \"r8sint\" => Sf::R8Sint,\r\n        \"r16uint\" => Sf::R16Uint,\r\n        \"r16sint\" => Sf::R16Sint,\r\n        \"r16float\" => Sf::R16Float,\r\n        \"rg8unorm\" => Sf::Rg8Unorm,\r\n        \"rg8snorm\" => Sf::Rg8Snorm,\r\n        \"rg8uint\" => Sf::Rg8Uint,\r\n        \"rg8sint\" => Sf::Rg8Sint,\r\n        \"r32uint\" => Sf::R32Uint,\r\n        \"r32sint\" => Sf::R32Sint,\r\n        \"r32float\" => Sf::R32Float,\r\n        \"rg16uint\" => Sf::Rg16Uint,\r\n        \"rg16sint\" => Sf::Rg16Sint,\r\n        \"rg16float\" => Sf::Rg16Float,\r\n        \"rgba8unorm\" => Sf::Rgba8Unorm,\r\n        \"rgba8snorm\" => Sf::Rgba8Snorm,\r\n        \"rgba8uint\" => Sf::Rgba8Uint,\r\n        \"rgba8sint\" => Sf::Rgba8Sint,\r\n        \"rgb10a2unorm\" => Sf::Rgb10a2Unorm,\r\n        \"rg11b10float\" => Sf::Rg11b10Float,\r\n        \"rg32uint\" => Sf::Rg32Uint,\r\n        \"rg32sint\" => Sf::Rg32Sint,\r\n        \"rg32float\" => Sf::Rg32Float,\r\n        \"rgba16uint\" => Sf::Rgba16Uint,\r\n        \"rgba16sint\" => Sf::Rgba16Sint,\r\n        \"rgba16float\" => Sf::Rgba16Float,\r\n        \"rgba32uint\" => Sf::Rgba32Uint,\r\n        \"rgba32sint\" => Sf::Rgba32Sint,\r\n        \"rgba32float\" => Sf::Rgba32Float,\r\n        _ => return Err(Error::UnknownStorageFormat(span)),\r\n    })\r\n}\r\n\r\npub fn get_scalar_type(word: &str) -> Option<(crate::ScalarKind, crate::Bytes)> {\r\n    match word {\r\n        \"f16\" => Some((crate::ScalarKind::Float, 2)),\r\n        \"f32\" => Some((crate::ScalarKind::Float, 4)),\r\n        \"f64\" => Some((crate::ScalarKind::Float, 8)),\r\n        \"i8\" => Some((crate::ScalarKind::Sint, 1)),\r\n        \"i16\" => Some((crate::ScalarKind::Sint, 2)),\r\n        \"i32\" => Some((crate::ScalarKind::Sint, 4)),\r\n        \"i64\" => Some((crate::ScalarKind::Sint, 8)),\r\n        \"u8\" => Some((crate::ScalarKind::Uint, 1)),\r\n        \"u16\" => Some((crate::ScalarKind::Uint, 2)),\r\n        \"u32\" => Some((crate::ScalarKind::Uint, 4)),\r\n        \"u64\" => Some((crate::ScalarKind::Uint, 8)),\r\n        \"bool\" => Some((crate::ScalarKind::Bool, crate::BOOL_WIDTH)),\r\n        _ => None,\r\n    }\r\n}\r\n\r\npub fn map_derivative_axis(word: &str) -> Option<crate::DerivativeAxis> {\r\n    match word {\r\n        \"dpdx\" => Some(crate::DerivativeAxis::X),\r\n        \"dpdy\" => Some(crate::DerivativeAxis::Y),\r\n        \"fwidth\" => Some(crate::DerivativeAxis::Width),\r\n        _ => None,\r\n    }\r\n}\r\n\r\npub fn map_relational_fun(word: &str) -> Option<crate::RelationalFunction> {\r\n    match word {\r\n        \"any\" => Some(crate::RelationalFunction::Any),\r\n        \"all\" => Some(crate::RelationalFunction::All),\r\n        \"isFinite\" => Some(crate::RelationalFunction::IsFinite),\r\n        \"isNormal\" => Some(crate::RelationalFunction::IsNormal),\r\n        _ => None,\r\n    }\r\n}\r\n\r\npub fn map_standard_fun(word: &str) -> Option<crate::MathFunction> {\r\n    use crate::MathFunction as Mf;\r\n    Some(match word {\r\n        // comparison\r\n        \"abs\" => Mf::Abs,\r\n        \"min\" => Mf::Min,\r\n        \"max\" => Mf::Max,\r\n        \"clamp\" => Mf::Clamp,\r\n        \"saturate\" => Mf::Saturate,\r\n        // trigonometry\r\n        \"cos\" => Mf::Cos,\r\n        \"cosh\" => Mf::Cosh,\r\n        \"sin\" => Mf::Sin,\r\n        \"sinh\" => Mf::Sinh,\r\n        \"tan\" => Mf::Tan,\r\n        \"tanh\" => Mf::Tanh,\r\n        \"acos\" => Mf::Acos,\r\n        \"asin\" => Mf::Asin,\r\n        \"atan\" => Mf::Atan,\r\n        \"atan2\" => Mf::Atan2,\r\n        \"radians\" => Mf::Radians,\r\n        \"degrees\" => Mf::Degrees,\r\n        // decomposition\r\n        \"ceil\" => Mf::Ceil,\r\n        \"floor\" => Mf::Floor,\r\n        \"round\" => Mf::Round,\r\n        \"fract\" => Mf::Fract,\r\n        \"trunc\" => Mf::Trunc,\r\n        \"modf\" => Mf::Modf,\r\n        \"frexp\" => Mf::Frexp,\r\n        \"ldexp\" => Mf::Ldexp,\r\n        // exponent\r\n        \"exp\" => Mf::Exp,\r\n        \"exp2\" => Mf::Exp2,\r\n        \"log\" => Mf::Log,\r\n        \"log2\" => Mf::Log2,\r\n        \"pow\" => Mf::Pow,\r\n        // geometry\r\n        \"dot\" => Mf::Dot,\r\n        \"outerProduct\" => Mf::Outer,\r\n        \"cross\" => Mf::Cross,\r\n        \"distance\" => Mf::Distance,\r\n        \"length\" => Mf::Length,\r\n        \"normalize\" => Mf::Normalize,\r\n        \"faceForward\" => Mf::FaceForward,\r\n        \"reflect\" => Mf::Reflect,\r\n        // computational\r\n        \"sign\" => Mf::Sign,\r\n        \"fma\" => Mf::Fma,\r\n        \"mix\" => Mf::Mix,\r\n        \"step\" => Mf::Step,\r\n        \"smoothstep\" => Mf::SmoothStep,\r\n        \"sqrt\" => Mf::Sqrt,\r\n        \"inverseSqrt\" => Mf::InverseSqrt,\r\n        \"transpose\" => Mf::Transpose,\r\n        \"determinant\" => Mf::Determinant,\r\n        // bits\r\n        \"countOneBits\" => Mf::CountOneBits,\r\n        \"reverseBits\" => Mf::ReverseBits,\r\n        \"extractBits\" => Mf::ExtractBits,\r\n        \"insertBits\" => Mf::InsertBits,\r\n        \"firstTrailingBit\" => Mf::FindLsb,\r\n        \"firstLeadingBit\" => Mf::FindMsb,\r\n        // data packing\r\n        \"pack4x8snorm\" => Mf::Pack4x8snorm,\r\n        \"pack4x8unorm\" => Mf::Pack4x8unorm,\r\n        \"pack2x16snorm\" => Mf::Pack2x16snorm,\r\n        \"pack2x16unorm\" => Mf::Pack2x16unorm,\r\n        \"pack2x16float\" => Mf::Pack2x16float,\r\n        // data unpacking\r\n        \"unpack4x8snorm\" => Mf::Unpack4x8snorm,\r\n        \"unpack4x8unorm\" => Mf::Unpack4x8unorm,\r\n        \"unpack2x16snorm\" => Mf::Unpack2x16snorm,\r\n        \"unpack2x16unorm\" => Mf::Unpack2x16unorm,\r\n        \"unpack2x16float\" => Mf::Unpack2x16float,\r\n        _ => return None,\r\n    })\r\n}\r\n\r\npub fn map_conservative_depth(\r\n    word: &str,\r\n    span: Span,\r\n) -> Result<crate::ConservativeDepth, Error<'_>> {\r\n    use crate::ConservativeDepth as Cd;\r\n    match word {\r\n        \"greater_equal\" => Ok(Cd::GreaterEqual),\r\n        \"less_equal\" => Ok(Cd::LessEqual),\r\n        \"unchanged\" => Ok(Cd::Unchanged),\r\n        _ => Err(Error::UnknownConservativeDepth(span)),\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/wgsl/lexer.rs",
    "content": "use super::{conv, number::consume_number, Error, ExpectedToken, Span, Token, TokenSpan};\r\n\r\nfn consume_any(input: &str, what: impl Fn(char) -> bool) -> (&str, &str) {\r\n    let pos = input.find(|c| !what(c)).unwrap_or(input.len());\r\n    input.split_at(pos)\r\n}\r\n\r\nfn consume_token(input: &str, generic: bool) -> (Token<'_>, &str) {\r\n    let mut chars = input.chars();\r\n    let cur = match chars.next() {\r\n        Some(c) => c,\r\n        None => return (Token::End, \"\"),\r\n    };\r\n    match cur {\r\n        ':' | ';' | ',' => (Token::Separator(cur), chars.as_str()),\r\n        '.' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('0'..='9') => consume_number(input),\r\n                _ => (Token::Separator(cur), og_chars),\r\n            }\r\n        }\r\n        '@' => (Token::Attribute, chars.as_str()),\r\n        '(' | ')' | '{' | '}' | '[' | ']' => (Token::Paren(cur), chars.as_str()),\r\n        '<' | '>' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('=') if !generic => (Token::LogicalOperation(cur), chars.as_str()),\r\n                Some(c) if c == cur && !generic => {\r\n                    let og_chars = chars.as_str();\r\n                    match chars.next() {\r\n                        Some('=') => (Token::AssignmentOperation(cur), chars.as_str()),\r\n                        _ => (Token::ShiftOperation(cur), og_chars),\r\n                    }\r\n                }\r\n                _ => (Token::Paren(cur), og_chars),\r\n            }\r\n        }\r\n        '0'..='9' => consume_number(input),\r\n        '/' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('/') => {\r\n                    let _ = chars.position(is_comment_end);\r\n                    (Token::Trivia, chars.as_str())\r\n                }\r\n                Some('*') => {\r\n                    let mut depth = 1;\r\n                    let mut prev = None;\r\n\r\n                    for c in &mut chars {\r\n                        match (prev, c) {\r\n                            (Some('*'), '/') => {\r\n                                prev = None;\r\n                                depth -= 1;\r\n                                if depth == 0 {\r\n                                    return (Token::Trivia, chars.as_str());\r\n                                }\r\n                            }\r\n                            (Some('/'), '*') => {\r\n                                prev = None;\r\n                                depth += 1;\r\n                            }\r\n                            _ => {\r\n                                prev = Some(c);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    (Token::End, \"\")\r\n                }\r\n                Some('=') => (Token::AssignmentOperation(cur), chars.as_str()),\r\n                _ => (Token::Operation(cur), og_chars),\r\n            }\r\n        }\r\n        '-' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('>') => (Token::Arrow, chars.as_str()),\r\n                Some('0'..='9' | '.') => consume_number(input),\r\n                Some('-') => (Token::DecrementOperation, chars.as_str()),\r\n                Some('=') => (Token::AssignmentOperation(cur), chars.as_str()),\r\n                _ => (Token::Operation(cur), og_chars),\r\n            }\r\n        }\r\n        '+' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('+') => (Token::IncrementOperation, chars.as_str()),\r\n                Some('=') => (Token::AssignmentOperation(cur), chars.as_str()),\r\n                _ => (Token::Operation(cur), og_chars),\r\n            }\r\n        }\r\n        '*' | '%' | '^' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('=') => (Token::AssignmentOperation(cur), chars.as_str()),\r\n                _ => (Token::Operation(cur), og_chars),\r\n            }\r\n        }\r\n        '~' => (Token::Operation(cur), chars.as_str()),\r\n        '=' | '!' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some('=') => (Token::LogicalOperation(cur), chars.as_str()),\r\n                _ => (Token::Operation(cur), og_chars),\r\n            }\r\n        }\r\n        '&' | '|' => {\r\n            let og_chars = chars.as_str();\r\n            match chars.next() {\r\n                Some(c) if c == cur => (Token::LogicalOperation(cur), chars.as_str()),\r\n                Some('=') => (Token::AssignmentOperation(cur), chars.as_str()),\r\n                _ => (Token::Operation(cur), og_chars),\r\n            }\r\n        }\r\n        _ if is_blankspace(cur) => {\r\n            let (_, rest) = consume_any(input, is_blankspace);\r\n            (Token::Trivia, rest)\r\n        }\r\n        _ if is_word_start(cur) => {\r\n            let (word, rest) = consume_any(input, is_word_part);\r\n            (Token::Word(word), rest)\r\n        }\r\n        _ => (Token::Unknown(cur), chars.as_str()),\r\n    }\r\n}\r\n\r\n/// Returns whether or not a char is a comment end\r\n/// (Unicode Pattern_White_Space excluding U+0020, U+0009, U+200E and U+200F)\r\nconst fn is_comment_end(c: char) -> bool {\r\n    match c {\r\n        '\\u{000a}'..='\\u{000d}' | '\\u{0085}' | '\\u{2028}' | '\\u{2029}' => true,\r\n        _ => false,\r\n    }\r\n}\r\n\r\n/// Returns whether or not a char is a blankspace (Unicode Pattern_White_Space)\r\nconst fn is_blankspace(c: char) -> bool {\r\n    match c {\r\n        '\\u{0020}'\r\n        | '\\u{0009}'..='\\u{000d}'\r\n        | '\\u{0085}'\r\n        | '\\u{200e}'\r\n        | '\\u{200f}'\r\n        | '\\u{2028}'\r\n        | '\\u{2029}' => true,\r\n        _ => false,\r\n    }\r\n}\r\n\r\n/// Returns whether or not a char is a word start (Unicode XID_Start + '_')\r\nfn is_word_start(c: char) -> bool {\r\n    c == '_' || unicode_xid::UnicodeXID::is_xid_start(c)\r\n}\r\n\r\n/// Returns whether or not a char is a word part (Unicode XID_Continue)\r\nfn is_word_part(c: char) -> bool {\r\n    unicode_xid::UnicodeXID::is_xid_continue(c)\r\n}\r\n\r\n#[derive(Clone)]\r\npub(super) struct Lexer<'a> {\r\n    input: &'a str,\r\n    pub(super) source: &'a str,\r\n    // The byte offset of the end of the last non-trivia token.\r\n    last_end_offset: usize,\r\n}\r\n\r\nimpl<'a> Lexer<'a> {\r\n    pub(super) const fn new(input: &'a str) -> Self {\r\n        Lexer {\r\n            input,\r\n            source: input,\r\n            last_end_offset: 0,\r\n        }\r\n    }\r\n\r\n    pub(super) const fn _leftover_span(&self) -> Span {\r\n        self.source.len() - self.input.len()..self.source.len()\r\n    }\r\n\r\n    /// Calls the function with a lexer and returns the result of the function as well as the span for everything the function parsed\r\n    ///\r\n    /// # Examples\r\n    /// ```ignore\r\n    /// let lexer = Lexer::new(\"5\");\r\n    /// let (value, span) = lexer.capture_span(Lexer::next_uint_literal);\r\n    /// assert_eq!(value, 5);\r\n    /// ```\r\n    #[inline]\r\n    pub fn capture_span<T, E>(\r\n        &mut self,\r\n        inner: impl FnOnce(&mut Self) -> Result<T, E>,\r\n    ) -> Result<(T, Span), E> {\r\n        let start = self.current_byte_offset();\r\n        let res = inner(self)?;\r\n        let end = self.current_byte_offset();\r\n        Ok((res, start..end))\r\n    }\r\n\r\n    pub(super) fn start_byte_offset(&mut self) -> usize {\r\n        loop {\r\n            // Eat all trivia because `next` doesn't eat trailing trivia.\r\n            let (token, rest) = consume_token(self.input, false);\r\n            if let Token::Trivia = token {\r\n                self.input = rest;\r\n            } else {\r\n                return self.current_byte_offset();\r\n            }\r\n        }\r\n    }\r\n\r\n    pub(super) const fn end_byte_offset(&self) -> usize {\r\n        self.last_end_offset\r\n    }\r\n\r\n    fn peek_token_and_rest(&mut self) -> (TokenSpan<'a>, &'a str) {\r\n        let mut cloned = self.clone();\r\n        let token = cloned.next();\r\n        let rest = cloned.input;\r\n        (token, rest)\r\n    }\r\n\r\n    const fn current_byte_offset(&self) -> usize {\r\n        self.source.len() - self.input.len()\r\n    }\r\n\r\n    pub(super) const fn span_from(&self, offset: usize) -> Span {\r\n        offset..self.end_byte_offset()\r\n    }\r\n\r\n    #[must_use]\r\n    pub(super) fn next(&mut self) -> TokenSpan<'a> {\r\n        let mut start_byte_offset = self.current_byte_offset();\r\n        loop {\r\n            let (token, rest) = consume_token(self.input, false);\r\n            self.input = rest;\r\n            match token {\r\n                Token::Trivia => start_byte_offset = self.current_byte_offset(),\r\n                _ => {\r\n                    self.last_end_offset = self.current_byte_offset();\r\n                    return (token, start_byte_offset..self.last_end_offset);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    #[must_use]\r\n    pub(super) fn next_generic(&mut self) -> TokenSpan<'a> {\r\n        let mut start_byte_offset = self.current_byte_offset();\r\n        loop {\r\n            let (token, rest) = consume_token(self.input, true);\r\n            self.input = rest;\r\n            match token {\r\n                Token::Trivia => start_byte_offset = self.current_byte_offset(),\r\n                _ => return (token, start_byte_offset..self.current_byte_offset()),\r\n            }\r\n        }\r\n    }\r\n\r\n    #[must_use]\r\n    pub(super) fn peek(&mut self) -> TokenSpan<'a> {\r\n        let (token, _) = self.peek_token_and_rest();\r\n        token\r\n    }\r\n\r\n    pub(super) fn expect_span(\r\n        &mut self,\r\n        expected: Token<'a>,\r\n    ) -> Result<std::ops::Range<usize>, Error<'a>> {\r\n        let next = self.next();\r\n        if next.0 == expected {\r\n            Ok(next.1)\r\n        } else {\r\n            Err(Error::Unexpected(next.1, ExpectedToken::Token(expected)))\r\n        }\r\n    }\r\n\r\n    pub(super) fn expect(&mut self, expected: Token<'a>) -> Result<(), Error<'a>> {\r\n        self.expect_span(expected)?;\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn expect_generic_paren(&mut self, expected: char) -> Result<(), Error<'a>> {\r\n        let next = self.next_generic();\r\n        if next.0 == Token::Paren(expected) {\r\n            Ok(())\r\n        } else {\r\n            Err(Error::Unexpected(\r\n                next.1,\r\n                ExpectedToken::Token(Token::Paren(expected)),\r\n            ))\r\n        }\r\n    }\r\n\r\n    /// If the next token matches it is skipped and true is returned\r\n    pub(super) fn skip(&mut self, what: Token<'_>) -> bool {\r\n        let (peeked_token, rest) = self.peek_token_and_rest();\r\n        if peeked_token.0 == what {\r\n            self.input = rest;\r\n            true\r\n        } else {\r\n            false\r\n        }\r\n    }\r\n\r\n    pub(super) fn next_ident_with_span(&mut self) -> Result<(&'a str, Span), Error<'a>> {\r\n        match self.next() {\r\n            (Token::Word(word), span) if word == \"_\" => {\r\n                Err(Error::InvalidIdentifierUnderscore(span))\r\n            }\r\n            (Token::Word(word), span) if word.starts_with(\"__\") => {\r\n                Err(Error::ReservedIdentifierPrefix(span))\r\n            }\r\n            (Token::Word(word), span) => Ok((word, span)),\r\n            other => Err(Error::Unexpected(other.1, ExpectedToken::Identifier)),\r\n        }\r\n    }\r\n\r\n    pub(super) fn next_ident(&mut self) -> Result<&'a str, Error<'a>> {\r\n        self.next_ident_with_span().map(|(word, _)| word)\r\n    }\r\n\r\n    /// Parses a generic scalar type, for example `<f32>`.\r\n    pub(super) fn next_scalar_generic(\r\n        &mut self,\r\n    ) -> Result<(crate::ScalarKind, crate::Bytes), Error<'a>> {\r\n        self.expect_generic_paren('<')?;\r\n        let pair = match self.next() {\r\n            (Token::Word(word), span) => {\r\n                conv::get_scalar_type(word).ok_or(Error::UnknownScalarType(span))\r\n            }\r\n            (_, span) => Err(Error::UnknownScalarType(span)),\r\n        }?;\r\n        self.expect_generic_paren('>')?;\r\n        Ok(pair)\r\n    }\r\n\r\n    /// Parses a generic scalar type, for example `<f32>`.\r\n    ///\r\n    /// Returns the span covering the inner type, excluding the brackets.\r\n    pub(super) fn next_scalar_generic_with_span(\r\n        &mut self,\r\n    ) -> Result<(crate::ScalarKind, crate::Bytes, Span), Error<'a>> {\r\n        self.expect_generic_paren('<')?;\r\n        let pair = match self.next() {\r\n            (Token::Word(word), span) => conv::get_scalar_type(word)\r\n                .map(|(a, b)| (a, b, span.clone()))\r\n                .ok_or(Error::UnknownScalarType(span)),\r\n            (_, span) => Err(Error::UnknownScalarType(span)),\r\n        }?;\r\n        self.expect_generic_paren('>')?;\r\n        Ok(pair)\r\n    }\r\n\r\n    pub(super) fn next_storage_access(&mut self) -> Result<crate::StorageAccess, Error<'a>> {\r\n        let (ident, span) = self.next_ident_with_span()?;\r\n        match ident {\r\n            \"read\" => Ok(crate::StorageAccess::LOAD),\r\n            \"write\" => Ok(crate::StorageAccess::STORE),\r\n            \"read_write\" => Ok(crate::StorageAccess::LOAD | crate::StorageAccess::STORE),\r\n            _ => Err(Error::UnknownAccess(span)),\r\n        }\r\n    }\r\n\r\n    pub(super) fn next_format_generic(\r\n        &mut self,\r\n    ) -> Result<(crate::StorageFormat, crate::StorageAccess), Error<'a>> {\r\n        self.expect(Token::Paren('<'))?;\r\n        let (ident, ident_span) = self.next_ident_with_span()?;\r\n        let format = conv::map_storage_format(ident, ident_span)?;\r\n        self.expect(Token::Separator(','))?;\r\n        let access = self.next_storage_access()?;\r\n        self.expect(Token::Paren('>'))?;\r\n        Ok((format, access))\r\n    }\r\n\r\n    pub(super) fn open_arguments(&mut self) -> Result<(), Error<'a>> {\r\n        self.expect(Token::Paren('('))\r\n    }\r\n\r\n    pub(super) fn close_arguments(&mut self) -> Result<(), Error<'a>> {\r\n        let _ = self.skip(Token::Separator(','));\r\n        self.expect(Token::Paren(')'))\r\n    }\r\n\r\n    pub(super) fn next_argument(&mut self) -> Result<bool, Error<'a>> {\r\n        let paren = Token::Paren(')');\r\n        if self.skip(Token::Separator(',')) {\r\n            Ok(!self.skip(paren))\r\n        } else {\r\n            self.expect(paren).map(|()| false)\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nuse super::{number::Number, NumberError};\r\n\r\n#[cfg(test)]\r\nfn sub_test(source: &str, expected_tokens: &[Token]) {\r\n    let mut lex = Lexer::new(source);\r\n    for &token in expected_tokens {\r\n        assert_eq!(lex.next().0, token);\r\n    }\r\n    assert_eq!(lex.next().0, Token::End);\r\n}\r\n\r\n#[test]\r\nfn test_numbers() {\r\n    // WGSL spec examples //\r\n\r\n    // decimal integer\r\n    sub_test(\r\n        \"0x123 0X123u 1u 123 0 0i 0x3f\",\r\n        &[\r\n            Token::Number(Ok(Number::I32(291))),\r\n            Token::Number(Ok(Number::U32(291))),\r\n            Token::Number(Ok(Number::U32(1))),\r\n            Token::Number(Ok(Number::I32(123))),\r\n            Token::Number(Ok(Number::I32(0))),\r\n            Token::Number(Ok(Number::I32(0))),\r\n            Token::Number(Ok(Number::I32(63))),\r\n        ],\r\n    );\r\n    // decimal floating point\r\n    sub_test(\r\n        \"0.e+4f 01. .01 12.34 .0f 0h 1e-3 0xa.fp+2 0x1P+4f 0X.3 0x3p+2h 0X1.fp-4 0x3.2p+2h\",\r\n        &[\r\n            Token::Number(Ok(Number::F32(0.))),\r\n            Token::Number(Ok(Number::F32(1.))),\r\n            Token::Number(Ok(Number::F32(0.01))),\r\n            Token::Number(Ok(Number::F32(12.34))),\r\n            Token::Number(Ok(Number::F32(0.))),\r\n            Token::Number(Err(NumberError::UnimplementedF16)),\r\n            Token::Number(Ok(Number::F32(0.001))),\r\n            Token::Number(Ok(Number::F32(43.75))),\r\n            Token::Number(Ok(Number::F32(16.))),\r\n            Token::Number(Ok(Number::F32(0.1875))),\r\n            Token::Number(Err(NumberError::UnimplementedF16)),\r\n            Token::Number(Ok(Number::F32(0.12109375))),\r\n            Token::Number(Err(NumberError::UnimplementedF16)),\r\n        ],\r\n    );\r\n\r\n    // MIN / MAX //\r\n\r\n    // min / max decimal signed integer\r\n    sub_test(\r\n        \"-2147483648i 2147483647i -2147483649i 2147483648i\",\r\n        &[\r\n            Token::Number(Ok(Number::I32(i32::MIN))),\r\n            Token::Number(Ok(Number::I32(i32::MAX))),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n        ],\r\n    );\r\n    // min / max decimal unsigned integer\r\n    sub_test(\r\n        \"0u 4294967295u -1u 4294967296u\",\r\n        &[\r\n            Token::Number(Ok(Number::U32(u32::MIN))),\r\n            Token::Number(Ok(Number::U32(u32::MAX))),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n        ],\r\n    );\r\n\r\n    // min / max hexadecimal signed integer\r\n    sub_test(\r\n        \"-0x80000000i 0x7FFFFFFFi -0x80000001i 0x80000000i\",\r\n        &[\r\n            Token::Number(Ok(Number::I32(i32::MIN))),\r\n            Token::Number(Ok(Number::I32(i32::MAX))),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n        ],\r\n    );\r\n    // min / max hexadecimal unsigned integer\r\n    sub_test(\r\n        \"0x0u 0xFFFFFFFFu -0x1u 0x100000000u\",\r\n        &[\r\n            Token::Number(Ok(Number::U32(u32::MIN))),\r\n            Token::Number(Ok(Number::U32(u32::MAX))),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n        ],\r\n    );\r\n\r\n    /// ≈ 2^-126 * 2^−23 (= 2^−149)\r\n    const SMALLEST_POSITIVE_SUBNORMAL_F32: f32 = 1e-45;\r\n    /// ≈ 2^-126 * (1 − 2^−23)\r\n    const LARGEST_SUBNORMAL_F32: f32 = 1.1754942e-38;\r\n    /// ≈ 2^-126\r\n    const SMALLEST_POSITIVE_NORMAL_F32: f32 = f32::MIN_POSITIVE;\r\n    /// ≈ 1 − 2^−24\r\n    const LARGEST_F32_LESS_THAN_ONE: f32 = 0.99999994;\r\n    /// ≈ 1 + 2^−23\r\n    const SMALLEST_F32_LARGER_THAN_ONE: f32 = 1.0000001;\r\n    /// ≈ -(2^127 * (2 − 2^−23))\r\n    const SMALLEST_NORMAL_F32: f32 = f32::MIN;\r\n    /// ≈ 2^127 * (2 − 2^−23)\r\n    const LARGEST_NORMAL_F32: f32 = f32::MAX;\r\n\r\n    // decimal floating point\r\n    sub_test(\r\n        \"1e-45f 1.1754942e-38f 1.17549435e-38f 0.99999994f 1.0000001f -3.40282347e+38f 3.40282347e+38f\",\r\n        &[\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_POSITIVE_SUBNORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                LARGEST_SUBNORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_POSITIVE_NORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                LARGEST_F32_LESS_THAN_ONE,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_F32_LARGER_THAN_ONE,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_NORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                LARGEST_NORMAL_F32,\r\n            ))),\r\n        ],\r\n    );\r\n    sub_test(\r\n        \"-3.40282367e+38f 3.40282367e+38f\",\r\n        &[\r\n            Token::Number(Err(NumberError::NotRepresentable)), // ≈ -2^128\r\n            Token::Number(Err(NumberError::NotRepresentable)), // ≈ 2^128\r\n        ],\r\n    );\r\n\r\n    // hexadecimal floating point\r\n    sub_test(\r\n        \"0x1p-149f 0x7FFFFFp-149f 0x1p-126f 0xFFFFFFp-24f 0x800001p-23f -0xFFFFFFp+104f 0xFFFFFFp+104f\",\r\n        &[\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_POSITIVE_SUBNORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                LARGEST_SUBNORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_POSITIVE_NORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                LARGEST_F32_LESS_THAN_ONE,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_F32_LARGER_THAN_ONE,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                SMALLEST_NORMAL_F32,\r\n            ))),\r\n            Token::Number(Ok(Number::F32(\r\n                LARGEST_NORMAL_F32,\r\n            ))),\r\n        ],\r\n    );\r\n    sub_test(\r\n        \"-0x1p128f 0x1p128f 0x1.000001p0f\",\r\n        &[\r\n            Token::Number(Err(NumberError::NotRepresentable)), // = -2^128\r\n            Token::Number(Err(NumberError::NotRepresentable)), // = 2^128\r\n            Token::Number(Err(NumberError::NotRepresentable)),\r\n        ],\r\n    );\r\n}\r\n\r\n#[test]\r\nfn test_tokens() {\r\n    sub_test(\"id123_OK\", &[Token::Word(\"id123_OK\")]);\r\n    sub_test(\r\n        \"92No\",\r\n        &[Token::Number(Ok(Number::I32(92))), Token::Word(\"No\")],\r\n    );\r\n    sub_test(\r\n        \"2u3o\",\r\n        &[\r\n            Token::Number(Ok(Number::U32(2))),\r\n            Token::Number(Ok(Number::I32(3))),\r\n            Token::Word(\"o\"),\r\n        ],\r\n    );\r\n    sub_test(\r\n        \"2.4f44po\",\r\n        &[\r\n            Token::Number(Ok(Number::F32(2.4))),\r\n            Token::Number(Ok(Number::I32(44))),\r\n            Token::Word(\"po\"),\r\n        ],\r\n    );\r\n    sub_test(\r\n        \"Δέλτα réflexion Кызыл 𐰓𐰏𐰇 朝焼け سلام 검정 שָׁלוֹם गुलाबी փիրուզ\",\r\n        &[\r\n            Token::Word(\"Δέλτα\"),\r\n            Token::Word(\"réflexion\"),\r\n            Token::Word(\"Кызыл\"),\r\n            Token::Word(\"𐰓𐰏𐰇\"),\r\n            Token::Word(\"朝焼け\"),\r\n            Token::Word(\"سلام\"),\r\n            Token::Word(\"검정\"),\r\n            Token::Word(\"שָׁלוֹם\"),\r\n            Token::Word(\"गुलाबी\"),\r\n            Token::Word(\"փիրուզ\"),\r\n        ],\r\n    );\r\n    sub_test(\"æNoø\", &[Token::Word(\"æNoø\")]);\r\n    sub_test(\"No¾\", &[Token::Word(\"No\"), Token::Unknown('¾')]);\r\n    sub_test(\"No好\", &[Token::Word(\"No好\")]);\r\n    sub_test(\"_No\", &[Token::Word(\"_No\")]);\r\n    sub_test(\r\n        \"*/*/***/*//=/*****//\",\r\n        &[\r\n            Token::Operation('*'),\r\n            Token::AssignmentOperation('/'),\r\n            Token::Operation('/'),\r\n        ],\r\n    );\r\n}\r\n\r\n#[test]\r\nfn test_variable_decl() {\r\n    sub_test(\r\n        \"@group(0 ) var< uniform> texture:   texture_multisampled_2d <f32 >;\",\r\n        &[\r\n            Token::Attribute,\r\n            Token::Word(\"group\"),\r\n            Token::Paren('('),\r\n            Token::Number(Ok(Number::I32(0))),\r\n            Token::Paren(')'),\r\n            Token::Word(\"var\"),\r\n            Token::Paren('<'),\r\n            Token::Word(\"uniform\"),\r\n            Token::Paren('>'),\r\n            Token::Word(\"texture\"),\r\n            Token::Separator(':'),\r\n            Token::Word(\"texture_multisampled_2d\"),\r\n            Token::Paren('<'),\r\n            Token::Word(\"f32\"),\r\n            Token::Paren('>'),\r\n            Token::Separator(';'),\r\n        ],\r\n    );\r\n    sub_test(\r\n        \"var<storage,read_write> buffer: array<u32>;\",\r\n        &[\r\n            Token::Word(\"var\"),\r\n            Token::Paren('<'),\r\n            Token::Word(\"storage\"),\r\n            Token::Separator(','),\r\n            Token::Word(\"read_write\"),\r\n            Token::Paren('>'),\r\n            Token::Word(\"buffer\"),\r\n            Token::Separator(':'),\r\n            Token::Word(\"array\"),\r\n            Token::Paren('<'),\r\n            Token::Word(\"u32\"),\r\n            Token::Paren('>'),\r\n            Token::Separator(';'),\r\n        ],\r\n    );\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/wgsl/mod.rs",
    "content": "/*!\r\nFrontend for [WGSL][wgsl] (WebGPU Shading Language).\r\n\r\n[wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html\r\n*/\r\n\r\nmod construction;\r\nmod conv;\r\nmod lexer;\r\nmod number;\r\n#[cfg(test)]\r\nmod tests;\r\n\r\nuse crate::{\r\n    arena::{Arena, Handle, UniqueArena},\r\n    proc::{\r\n        ensure_block_returns, Alignment, Layouter, ResolveContext, ResolveError, TypeResolution,\r\n    },\r\n    span::SourceLocation,\r\n    span::Span as NagaSpan,\r\n    ConstantInner, FastHashMap, ScalarValue,\r\n};\r\n\r\nuse self::{lexer::Lexer, number::Number};\r\nuse codespan_reporting::{\r\n    diagnostic::{Diagnostic, Label},\r\n    files::SimpleFile,\r\n    term::{\r\n        self,\r\n        termcolor::{ColorChoice, NoColor, StandardStream},\r\n    },\r\n};\r\nuse std::{borrow::Cow, convert::TryFrom, ops};\r\nuse thiserror::Error;\r\n\r\ntype Span = ops::Range<usize>;\r\ntype TokenSpan<'a> = (Token<'a>, Span);\r\n\r\n#[derive(Copy, Clone, Debug, PartialEq)]\r\npub enum Token<'a> {\r\n    Separator(char),\r\n    Paren(char),\r\n    Attribute,\r\n    Number(Result<Number, NumberError>),\r\n    Word(&'a str),\r\n    Operation(char),\r\n    LogicalOperation(char),\r\n    ShiftOperation(char),\r\n    AssignmentOperation(char),\r\n    IncrementOperation,\r\n    DecrementOperation,\r\n    Arrow,\r\n    Unknown(char),\r\n    Trivia,\r\n    End,\r\n}\r\n\r\n#[derive(Copy, Clone, Debug, PartialEq)]\r\npub enum NumberType {\r\n    I32,\r\n    U32,\r\n    F32,\r\n}\r\n\r\n#[derive(Copy, Clone, Debug, PartialEq)]\r\npub enum ExpectedToken<'a> {\r\n    Token(Token<'a>),\r\n    Identifier,\r\n    Number(NumberType),\r\n    Integer,\r\n    Constant,\r\n    /// Expected: constant, parenthesized expression, identifier\r\n    PrimaryExpression,\r\n    /// Expected: assignment, increment/decrement expression\r\n    Assignment,\r\n    /// Expected: '}', identifier\r\n    FieldName,\r\n    /// Expected: attribute for a type\r\n    TypeAttribute,\r\n    /// Expected: ';', '{', word\r\n    Statement,\r\n    /// Expected: 'case', 'default', '}'\r\n    SwitchItem,\r\n    /// Expected: ',', ')'\r\n    WorkgroupSizeSeparator,\r\n    /// Expected: 'struct', 'let', 'var', 'type', ';', 'fn', eof\r\n    GlobalItem,\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, Error, PartialEq)]\r\npub enum NumberError {\r\n    #[error(\"invalid numeric literal format\")]\r\n    Invalid,\r\n    #[error(\"numeric literal not representable by target type\")]\r\n    NotRepresentable,\r\n    #[error(\"unimplemented f16 type\")]\r\n    UnimplementedF16,\r\n}\r\n\r\n#[derive(Copy, Clone, Debug, PartialEq)]\r\npub enum InvalidAssignmentType {\r\n    Other,\r\n    Swizzle,\r\n    ImmutableBinding,\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\npub enum Error<'a> {\r\n    Unexpected(Span, ExpectedToken<'a>),\r\n    UnexpectedComponents(Span),\r\n    BadNumber(Span, NumberError),\r\n    /// A negative signed integer literal where both signed and unsigned,\r\n    /// but only non-negative literals are allowed.\r\n    NegativeInt(Span),\r\n    BadU32Constant(Span),\r\n    BadMatrixScalarKind(Span, crate::ScalarKind, u8),\r\n    BadAccessor(Span),\r\n    BadTexture(Span),\r\n    BadTypeCast {\r\n        span: Span,\r\n        from_type: String,\r\n        to_type: String,\r\n    },\r\n    BadTextureSampleType {\r\n        span: Span,\r\n        kind: crate::ScalarKind,\r\n        width: u8,\r\n    },\r\n    BadIncrDecrReferenceType(Span),\r\n    InvalidResolve(ResolveError),\r\n    InvalidForInitializer(Span),\r\n    /// A break if appeared outside of a continuing block\r\n    InvalidBreakIf(Span),\r\n    InvalidGatherComponent(Span, u32),\r\n    InvalidConstructorComponentType(Span, i32),\r\n    InvalidIdentifierUnderscore(Span),\r\n    ReservedIdentifierPrefix(Span),\r\n    UnknownAddressSpace(Span),\r\n    UnknownAttribute(Span),\r\n    UnknownBuiltin(Span),\r\n    UnknownAccess(Span),\r\n    UnknownShaderStage(Span),\r\n    UnknownIdent(Span, &'a str),\r\n    UnknownScalarType(Span),\r\n    UnknownType(Span),\r\n    UnknownStorageFormat(Span),\r\n    UnknownConservativeDepth(Span),\r\n    SizeAttributeTooLow(Span, u32),\r\n    AlignAttributeTooLow(Span, Alignment),\r\n    NonPowerOfTwoAlignAttribute(Span),\r\n    InconsistentBinding(Span),\r\n    UnknownLocalFunction(Span),\r\n    TypeNotConstructible(Span),\r\n    TypeNotInferrable(Span),\r\n    InitializationTypeMismatch(Span, String),\r\n    MissingType(Span),\r\n    MissingAttribute(&'static str, Span),\r\n    InvalidAtomicPointer(Span),\r\n    InvalidAtomicOperandType(Span),\r\n    Pointer(&'static str, Span),\r\n    NotPointer(Span),\r\n    NotReference(&'static str, Span),\r\n    InvalidAssignment {\r\n        span: Span,\r\n        ty: InvalidAssignmentType,\r\n    },\r\n    ReservedKeyword(Span),\r\n    Redefinition {\r\n        previous: Span,\r\n        current: Span,\r\n    },\r\n    Other,\r\n}\r\n\r\nimpl<'a> Error<'a> {\r\n    fn as_parse_error(&self, source: &'a str) -> ParseError {\r\n        match *self {\r\n            Error::Unexpected(ref unexpected_span, expected) => {\r\n                let expected_str = match expected {\r\n                        ExpectedToken::Token(token) => {\r\n                            match token {\r\n                                Token::Separator(c) => format!(\"'{}'\", c),\r\n                                Token::Paren(c) => format!(\"'{}'\", c),\r\n                                Token::Attribute => \"@\".to_string(),\r\n                                Token::Number(_) => \"number\".to_string(),\r\n                                Token::Word(s) => s.to_string(),\r\n                                Token::Operation(c) => format!(\"operation ('{}')\", c),\r\n                                Token::LogicalOperation(c) => format!(\"logical operation ('{}')\", c),\r\n                                Token::ShiftOperation(c) => format!(\"bitshift ('{}{}')\", c, c),\r\n                                Token::AssignmentOperation(c) if c=='<' || c=='>' => format!(\"bitshift ('{}{}=')\", c, c),\r\n                                Token::AssignmentOperation(c) => format!(\"operation ('{}=')\", c),\r\n                                Token::IncrementOperation => \"increment operation\".to_string(),\r\n                                Token::DecrementOperation => \"decrement operation\".to_string(),\r\n                                Token::Arrow => \"->\".to_string(),\r\n                                Token::Unknown(c) => format!(\"unknown ('{}')\", c),\r\n                                Token::Trivia => \"trivia\".to_string(),\r\n                                Token::End => \"end\".to_string(),\r\n                            }\r\n                        }\r\n                        ExpectedToken::Identifier => \"identifier\".to_string(),\r\n                        ExpectedToken::Number(ty) => {\r\n                            match ty {\r\n                                NumberType::I32 => \"32-bit signed integer literal\",\r\n                                NumberType::U32 => \"32-bit unsigned integer literal\",\r\n                                NumberType::F32 => \"32-bit floating-point literal\",\r\n                            }.to_string()\r\n                        },\r\n                        ExpectedToken::Integer => \"unsigned/signed integer literal\".to_string(),\r\n                        ExpectedToken::Constant => \"constant\".to_string(),\r\n                        ExpectedToken::PrimaryExpression => \"expression\".to_string(),\r\n                        ExpectedToken::Assignment => \"assignment or increment/decrement\".to_string(),\r\n                        ExpectedToken::FieldName => \"field name or a closing curly bracket to signify the end of the struct\".to_string(),\r\n                        ExpectedToken::TypeAttribute => \"type attribute\".to_string(),\r\n                        ExpectedToken::Statement => \"statement\".to_string(),\r\n                        ExpectedToken::SwitchItem => \"switch item ('case' or 'default') or a closing curly bracket to signify the end of the switch statement ('}')\".to_string(),\r\n                        ExpectedToken::WorkgroupSizeSeparator => \"workgroup size separator (',') or a closing parenthesis\".to_string(),\r\n                        ExpectedToken::GlobalItem => \"global item ('struct', 'let', 'var', 'type', ';', 'fn') or the end of the file\".to_string(),\r\n                    };\r\n                ParseError {\r\n                    message: format!(\r\n                        \"expected {}, found '{}'\",\r\n                        expected_str,\r\n                        &source[unexpected_span.clone()],\r\n                    ),\r\n                    labels: vec![(\r\n                        unexpected_span.clone(),\r\n                        format!(\"expected {}\", expected_str).into(),\r\n                    )],\r\n                    notes: vec![],\r\n                }\r\n            }\r\n            Error::UnexpectedComponents(ref bad_span) => ParseError {\r\n                message: \"unexpected components\".to_string(),\r\n                labels: vec![(bad_span.clone(), \"unexpected components\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::BadNumber(ref bad_span, ref err) => ParseError {\r\n                message: format!(\"{}: `{}`\", err, &source[bad_span.clone()],),\r\n                labels: vec![(bad_span.clone(), err.to_string().into())],\r\n                notes: vec![],\r\n            },\r\n            Error::NegativeInt(ref bad_span) => ParseError {\r\n                message: format!(\r\n                    \"expected non-negative integer literal, found `{}`\",\r\n                    &source[bad_span.clone()],\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"expected non-negative integer\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::BadU32Constant(ref bad_span) => ParseError {\r\n                message: format!(\r\n                    \"expected unsigned integer constant expression, found `{}`\",\r\n                    &source[bad_span.clone()],\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"expected unsigned integer\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::BadMatrixScalarKind(ref span, kind, width) => ParseError {\r\n                message: format!(\r\n                    \"matrix scalar type must be floating-point, but found `{}`\",\r\n                    kind.to_wgsl(width)\r\n                ),\r\n                labels: vec![(span.clone(), \"must be floating-point (e.g. `f32`)\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::BadAccessor(ref accessor_span) => ParseError {\r\n                message: format!(\r\n                    \"invalid field accessor `{}`\",\r\n                    &source[accessor_span.clone()],\r\n                ),\r\n                labels: vec![(accessor_span.clone(), \"invalid accessor\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownIdent(ref ident_span, ident) => ParseError {\r\n                message: format!(\"no definition in scope for identifier: '{}'\", ident),\r\n                labels: vec![(ident_span.clone(), \"unknown identifier\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownScalarType(ref bad_span) => ParseError {\r\n                message: format!(\"unknown scalar type: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown scalar type\".into())],\r\n                notes: vec![\"Valid scalar types are f16, f32, f64, \\\r\n                             i8, i16, i32, i64, \\\r\n                             u8, u16, u32, u64, bool\"\r\n                    .into()],\r\n            },\r\n            Error::BadTextureSampleType {\r\n                ref span,\r\n                kind,\r\n                width,\r\n            } => ParseError {\r\n                message: format!(\r\n                    \"texture sample type must be one of f32, i32 or u32, but found {}\",\r\n                    kind.to_wgsl(width)\r\n                ),\r\n                labels: vec![(span.clone(), \"must be one of f32, i32 or u32\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::BadIncrDecrReferenceType(ref span) => ParseError {\r\n                message:\r\n                    \"increment/decrement operation requires reference type to be one of i32 or u32\"\r\n                        .to_string(),\r\n                labels: vec![(\r\n                    span.clone(),\r\n                    \"must be a reference type of i32 or u32\".into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::BadTexture(ref bad_span) => ParseError {\r\n                message: format!(\r\n                    \"expected an image, but found '{}' which is not an image\",\r\n                    &source[bad_span.clone()]\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"not an image\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::BadTypeCast {\r\n                ref span,\r\n                ref from_type,\r\n                ref to_type,\r\n            } => {\r\n                let msg = format!(\"cannot cast a {} to a {}\", from_type, to_type);\r\n                ParseError {\r\n                    message: msg.clone(),\r\n                    labels: vec![(span.clone(), msg.into())],\r\n                    notes: vec![],\r\n                }\r\n            }\r\n            Error::InvalidResolve(ref resolve_error) => ParseError {\r\n                message: resolve_error.to_string(),\r\n                labels: vec![],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidForInitializer(ref bad_span) => ParseError {\r\n                message: format!(\r\n                    \"for(;;) initializer is not an assignment or a function call: '{}'\",\r\n                    &source[bad_span.clone()]\r\n                ),\r\n                labels: vec![(\r\n                    bad_span.clone(),\r\n                    \"not an assignment or function call\".into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidBreakIf(ref bad_span) => ParseError {\r\n                message: \"A break if is only allowed in a continuing block\".to_string(),\r\n                labels: vec![(bad_span.clone(), \"not in a continuing block\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidGatherComponent(ref bad_span, component) => ParseError {\r\n                message: format!(\r\n                    \"textureGather component {} doesn't exist, must be 0, 1, 2, or 3\",\r\n                    component\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"invalid component\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidConstructorComponentType(ref bad_span, component) => ParseError {\r\n                message: format!(\r\n                    \"invalid type for constructor component at index [{}]\",\r\n                    component\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"invalid component type\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidIdentifierUnderscore(ref bad_span) => ParseError {\r\n                message: \"Identifier can't be '_'\".to_string(),\r\n                labels: vec![(bad_span.clone(), \"invalid identifier\".into())],\r\n                notes: vec![\r\n                    \"Use phony assignment instead ('_ =' notice the absence of 'let' or 'var')\"\r\n                        .to_string(),\r\n                ],\r\n            },\r\n            Error::ReservedIdentifierPrefix(ref bad_span) => ParseError {\r\n                message: format!(\r\n                    \"Identifier starts with a reserved prefix: '{}'\",\r\n                    &source[bad_span.clone()]\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"invalid identifier\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownAddressSpace(ref bad_span) => ParseError {\r\n                message: format!(\"unknown address space: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown address space\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownAttribute(ref bad_span) => ParseError {\r\n                message: format!(\"unknown attribute: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown attribute\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownBuiltin(ref bad_span) => ParseError {\r\n                message: format!(\"unknown builtin: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown builtin\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownAccess(ref bad_span) => ParseError {\r\n                message: format!(\"unknown access: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown access\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownShaderStage(ref bad_span) => ParseError {\r\n                message: format!(\"unknown shader stage: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown shader stage\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownStorageFormat(ref bad_span) => ParseError {\r\n                message: format!(\"unknown storage format: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown storage format\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownConservativeDepth(ref bad_span) => ParseError {\r\n                message: format!(\r\n                    \"unknown conservative depth: '{}'\",\r\n                    &source[bad_span.clone()]\r\n                ),\r\n                labels: vec![(bad_span.clone(), \"unknown conservative depth\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownType(ref bad_span) => ParseError {\r\n                message: format!(\"unknown type: '{}'\", &source[bad_span.clone()]),\r\n                labels: vec![(bad_span.clone(), \"unknown type\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::SizeAttributeTooLow(ref bad_span, min_size) => ParseError {\r\n                message: format!(\"struct member size must be at least {}\", min_size),\r\n                labels: vec![(\r\n                    bad_span.clone(),\r\n                    format!(\"must be at least {}\", min_size).into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::AlignAttributeTooLow(ref bad_span, min_align) => ParseError {\r\n                message: format!(\"struct member alignment must be at least {}\", min_align),\r\n                labels: vec![(\r\n                    bad_span.clone(),\r\n                    format!(\"must be at least {}\", min_align).into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::NonPowerOfTwoAlignAttribute(ref bad_span) => ParseError {\r\n                message: \"struct member alignment must be a power of 2\".to_string(),\r\n                labels: vec![(bad_span.clone(), \"must be a power of 2\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InconsistentBinding(ref span) => ParseError {\r\n                message: \"input/output binding is not consistent\".to_string(),\r\n                labels: vec![(\r\n                    span.clone(),\r\n                    \"input/output binding is not consistent\".into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::UnknownLocalFunction(ref span) => ParseError {\r\n                message: format!(\"unknown local function `{}`\", &source[span.clone()]),\r\n                labels: vec![(span.clone(), \"unknown local function\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::TypeNotConstructible(ref span) => ParseError {\r\n                message: format!(\"type `{}` is not constructible\", &source[span.clone()]),\r\n                labels: vec![(span.clone(), \"type is not constructible\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::TypeNotInferrable(ref span) => ParseError {\r\n                message: \"type can't be inferred\".to_string(),\r\n                labels: vec![(span.clone(), \"type can't be inferred\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InitializationTypeMismatch(ref name_span, ref expected_ty) => ParseError {\r\n                message: format!(\r\n                    \"the type of `{}` is expected to be `{}`\",\r\n                    &source[name_span.clone()],\r\n                    expected_ty\r\n                ),\r\n                labels: vec![(\r\n                    name_span.clone(),\r\n                    format!(\"definition of `{}`\", &source[name_span.clone()]).into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::MissingType(ref name_span) => ParseError {\r\n                message: format!(\"variable `{}` needs a type\", &source[name_span.clone()]),\r\n                labels: vec![(\r\n                    name_span.clone(),\r\n                    format!(\"definition of `{}`\", &source[name_span.clone()]).into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::MissingAttribute(name, ref name_span) => ParseError {\r\n                message: format!(\r\n                    \"variable `{}` needs a '{}' attribute\",\r\n                    &source[name_span.clone()],\r\n                    name\r\n                ),\r\n                labels: vec![(\r\n                    name_span.clone(),\r\n                    format!(\"definition of `{}`\", &source[name_span.clone()]).into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidAtomicPointer(ref span) => ParseError {\r\n                message: \"atomic operation is done on a pointer to a non-atomic\".to_string(),\r\n                labels: vec![(span.clone(), \"atomic pointer is invalid\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidAtomicOperandType(ref span) => ParseError {\r\n                message: \"atomic operand type is inconsistent with the operation\".to_string(),\r\n                labels: vec![(span.clone(), \"atomic operand type is invalid\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::NotPointer(ref span) => ParseError {\r\n                message: \"the operand of the `*` operator must be a pointer\".to_string(),\r\n                labels: vec![(span.clone(), \"expression is not a pointer\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::NotReference(what, ref span) => ParseError {\r\n                message: format!(\"{} must be a reference\", what),\r\n                labels: vec![(span.clone(), \"expression is not a reference\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::InvalidAssignment { ref span, ty } => ParseError {\r\n                message: \"invalid left-hand side of assignment\".into(),\r\n                labels: vec![(span.clone(), \"cannot assign to this expression\".into())],\r\n                notes: match ty {\r\n                    InvalidAssignmentType::Swizzle => vec![\r\n                        \"WGSL does not support assignments to swizzles\".into(),\r\n                        \"consider assigning each component individually\".into(),\r\n                    ],\r\n                    InvalidAssignmentType::ImmutableBinding => vec![\r\n                        format!(\"'{}' is an immutable binding\", &source[span.clone()]),\r\n                        \"consider declaring it with `var` instead of `let`\".into(),\r\n                    ],\r\n                    InvalidAssignmentType::Other => vec![],\r\n                },\r\n            },\r\n            Error::Pointer(what, ref span) => ParseError {\r\n                message: format!(\"{} must not be a pointer\", what),\r\n                labels: vec![(span.clone(), \"expression is a pointer\".into())],\r\n                notes: vec![],\r\n            },\r\n            Error::ReservedKeyword(ref name_span) => ParseError {\r\n                message: format!(\r\n                    \"name `{}` is a reserved keyword\",\r\n                    &source[name_span.clone()]\r\n                ),\r\n                labels: vec![(\r\n                    name_span.clone(),\r\n                    format!(\"definition of `{}`\", &source[name_span.clone()]).into(),\r\n                )],\r\n                notes: vec![],\r\n            },\r\n            Error::Redefinition {\r\n                ref previous,\r\n                ref current,\r\n            } => ParseError {\r\n                message: format!(\"redefinition of `{}`\", &source[current.clone()]),\r\n                labels: vec![\r\n                    (\r\n                        current.clone(),\r\n                        format!(\"redefinition of `{}`\", &source[current.clone()]).into(),\r\n                    ),\r\n                    (\r\n                        previous.clone(),\r\n                        format!(\"previous definition of `{}`\", &source[previous.clone()]).into(),\r\n                    ),\r\n                ],\r\n                notes: vec![],\r\n            },\r\n            Error::Other => ParseError {\r\n                message: \"other error\".to_string(),\r\n                labels: vec![],\r\n                notes: vec![],\r\n            },\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::StorageFormat {\r\n    const fn to_wgsl(self) -> &'static str {\r\n        use crate::StorageFormat as Sf;\r\n        match self {\r\n            Sf::R8Unorm => \"r8unorm\",\r\n            Sf::R8Snorm => \"r8snorm\",\r\n            Sf::R8Uint => \"r8uint\",\r\n            Sf::R8Sint => \"r8sint\",\r\n            Sf::R16Uint => \"r16uint\",\r\n            Sf::R16Sint => \"r16sint\",\r\n            Sf::R16Float => \"r16float\",\r\n            Sf::Rg8Unorm => \"rg8unorm\",\r\n            Sf::Rg8Snorm => \"rg8snorm\",\r\n            Sf::Rg8Uint => \"rg8uint\",\r\n            Sf::Rg8Sint => \"rg8sint\",\r\n            Sf::R32Uint => \"r32uint\",\r\n            Sf::R32Sint => \"r32sint\",\r\n            Sf::R32Float => \"r32float\",\r\n            Sf::Rg16Uint => \"rg16uint\",\r\n            Sf::Rg16Sint => \"rg16sint\",\r\n            Sf::Rg16Float => \"rg16float\",\r\n            Sf::Rgba8Unorm => \"rgba8unorm\",\r\n            Sf::Rgba8Snorm => \"rgba8snorm\",\r\n            Sf::Rgba8Uint => \"rgba8uint\",\r\n            Sf::Rgba8Sint => \"rgba8sint\",\r\n            Sf::Rgb10a2Unorm => \"rgb10a2unorm\",\r\n            Sf::Rg11b10Float => \"rg11b10float\",\r\n            Sf::Rg32Uint => \"rg32uint\",\r\n            Sf::Rg32Sint => \"rg32sint\",\r\n            Sf::Rg32Float => \"rg32float\",\r\n            Sf::Rgba16Uint => \"rgba16uint\",\r\n            Sf::Rgba16Sint => \"rgba16sint\",\r\n            Sf::Rgba16Float => \"rgba16float\",\r\n            Sf::Rgba32Uint => \"rgba32uint\",\r\n            Sf::Rgba32Sint => \"rgba32sint\",\r\n            Sf::Rgba32Float => \"rgba32float\",\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::TypeInner {\r\n    /// Formats the type as it is written in wgsl.\r\n    ///\r\n    /// For example `vec3<f32>`.\r\n    ///\r\n    /// Note: The names of a `TypeInner::Struct` is not known. Therefore this method will simply return \"struct\" for them.\r\n    fn to_wgsl(\r\n        &self,\r\n        types: &UniqueArena<crate::Type>,\r\n        constants: &Arena<crate::Constant>,\r\n    ) -> String {\r\n        use crate::TypeInner as Ti;\r\n\r\n        match *self {\r\n            Ti::Scalar { kind, width } => kind.to_wgsl(width),\r\n            Ti::Vector { size, kind, width } => {\r\n                format!(\"vec{}<{}>\", size as u32, kind.to_wgsl(width))\r\n            }\r\n            Ti::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                format!(\r\n                    \"mat{}x{}<{}>\",\r\n                    columns as u32,\r\n                    rows as u32,\r\n                    crate::ScalarKind::Float.to_wgsl(width),\r\n                )\r\n            }\r\n            Ti::Atomic { kind, width } => {\r\n                format!(\"atomic<{}>\", kind.to_wgsl(width))\r\n            }\r\n            Ti::Pointer { base, .. } => {\r\n                let base = &types[base];\r\n                let name = base.name.as_deref().unwrap_or(\"unknown\");\r\n                format!(\"ptr<{}>\", name)\r\n            }\r\n            Ti::ValuePointer { kind, width, .. } => {\r\n                format!(\"ptr<{}>\", kind.to_wgsl(width))\r\n            }\r\n            Ti::Array { base, size, .. } => {\r\n                let member_type = &types[base];\r\n                let base = member_type.name.as_deref().unwrap_or(\"unknown\");\r\n                match size {\r\n                    crate::ArraySize::Constant(size) => {\r\n                        let size = constants[size].name.as_deref().unwrap_or(\"unknown\");\r\n                        format!(\"array<{}, {}>\", base, size)\r\n                    }\r\n                    crate::ArraySize::Dynamic => format!(\"array<{}>\", base),\r\n                }\r\n            }\r\n            Ti::Struct { .. } => {\r\n                // TODO: Actually output the struct?\r\n                \"struct\".to_string()\r\n            }\r\n            Ti::Image {\r\n                dim,\r\n                arrayed,\r\n                class,\r\n            } => {\r\n                let dim_suffix = match dim {\r\n                    crate::ImageDimension::D1 => \"_1d\",\r\n                    crate::ImageDimension::D2 => \"_2d\",\r\n                    crate::ImageDimension::D3 => \"_3d\",\r\n                    crate::ImageDimension::Cube => \"_cube\",\r\n                };\r\n                let array_suffix = if arrayed { \"_array\" } else { \"\" };\r\n\r\n                let class_suffix = match class {\r\n                    crate::ImageClass::Sampled { multi: true, .. } => \"_multisampled\",\r\n                    crate::ImageClass::Depth { multi: false } => \"_depth\",\r\n                    crate::ImageClass::Depth { multi: true } => \"_depth_multisampled\",\r\n                    crate::ImageClass::Sampled { multi: false, .. }\r\n                    | crate::ImageClass::Storage { .. } => \"\",\r\n                };\r\n\r\n                let type_in_brackets = match class {\r\n                    crate::ImageClass::Sampled { kind, .. } => {\r\n                        // Note: The only valid widths are 4 bytes wide.\r\n                        // The lexer has already verified this, so we can safely assume it here.\r\n                        // https://gpuweb.github.io/gpuweb/wgsl/#sampled-texture-type\r\n                        let element_type = kind.to_wgsl(4);\r\n                        format!(\"<{}>\", element_type)\r\n                    }\r\n                    crate::ImageClass::Depth { multi: _ } => String::new(),\r\n                    crate::ImageClass::Storage { format, access } => {\r\n                        if access.contains(crate::StorageAccess::STORE) {\r\n                            format!(\"<{},write>\", format.to_wgsl())\r\n                        } else {\r\n                            format!(\"<{}>\", format.to_wgsl())\r\n                        }\r\n                    }\r\n                };\r\n\r\n                format!(\r\n                    \"texture{}{}{}{}\",\r\n                    class_suffix, dim_suffix, array_suffix, type_in_brackets\r\n                )\r\n            }\r\n            Ti::Sampler { .. } => \"sampler\".to_string(),\r\n            Ti::BindingArray { base, size, .. } => {\r\n                let member_type = &types[base];\r\n                let base = member_type.name.as_deref().unwrap_or(\"unknown\");\r\n                match size {\r\n                    crate::ArraySize::Constant(size) => {\r\n                        let size = constants[size].name.as_deref().unwrap_or(\"unknown\");\r\n                        format!(\"binding_array<{}, {}>\", base, size)\r\n                    }\r\n                    crate::ArraySize::Dynamic => format!(\"binding_array<{}>\", base),\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nmod type_inner_tests {\r\n    #[test]\r\n    fn to_wgsl() {\r\n        let mut types = crate::UniqueArena::new();\r\n        let mut constants = crate::Arena::new();\r\n        let c = constants.append(\r\n            crate::Constant {\r\n                name: Some(\"C\".to_string()),\r\n                specialization: None,\r\n                inner: crate::ConstantInner::Scalar {\r\n                    width: 4,\r\n                    value: crate::ScalarValue::Uint(32),\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let mytype1 = types.insert(\r\n            crate::Type {\r\n                name: Some(\"MyType1\".to_string()),\r\n                inner: crate::TypeInner::Struct {\r\n                    members: vec![],\r\n                    span: 0,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n        let mytype2 = types.insert(\r\n            crate::Type {\r\n                name: Some(\"MyType2\".to_string()),\r\n                inner: crate::TypeInner::Struct {\r\n                    members: vec![],\r\n                    span: 0,\r\n                },\r\n            },\r\n            Default::default(),\r\n        );\r\n\r\n        let array = crate::TypeInner::Array {\r\n            base: mytype1,\r\n            stride: 4,\r\n            size: crate::ArraySize::Constant(c),\r\n        };\r\n        assert_eq!(array.to_wgsl(&types, &constants), \"array<MyType1, C>\");\r\n\r\n        let mat = crate::TypeInner::Matrix {\r\n            rows: crate::VectorSize::Quad,\r\n            columns: crate::VectorSize::Bi,\r\n            width: 8,\r\n        };\r\n        assert_eq!(mat.to_wgsl(&types, &constants), \"mat2x4<f64>\");\r\n\r\n        let ptr = crate::TypeInner::Pointer {\r\n            base: mytype2,\r\n            space: crate::AddressSpace::Storage {\r\n                access: crate::StorageAccess::default(),\r\n            },\r\n        };\r\n        assert_eq!(ptr.to_wgsl(&types, &constants), \"ptr<MyType2>\");\r\n\r\n        let img1 = crate::TypeInner::Image {\r\n            dim: crate::ImageDimension::D2,\r\n            arrayed: false,\r\n            class: crate::ImageClass::Sampled {\r\n                kind: crate::ScalarKind::Float,\r\n                multi: true,\r\n            },\r\n        };\r\n        assert_eq!(\r\n            img1.to_wgsl(&types, &constants),\r\n            \"texture_multisampled_2d<f32>\"\r\n        );\r\n\r\n        let img2 = crate::TypeInner::Image {\r\n            dim: crate::ImageDimension::Cube,\r\n            arrayed: true,\r\n            class: crate::ImageClass::Depth { multi: false },\r\n        };\r\n        assert_eq!(img2.to_wgsl(&types, &constants), \"texture_depth_cube_array\");\r\n\r\n        let img3 = crate::TypeInner::Image {\r\n            dim: crate::ImageDimension::D2,\r\n            arrayed: false,\r\n            class: crate::ImageClass::Depth { multi: true },\r\n        };\r\n        assert_eq!(\r\n            img3.to_wgsl(&types, &constants),\r\n            \"texture_depth_multisampled_2d\"\r\n        );\r\n\r\n        let array = crate::TypeInner::BindingArray {\r\n            base: mytype1,\r\n            size: crate::ArraySize::Constant(c),\r\n        };\r\n        assert_eq!(\r\n            array.to_wgsl(&types, &constants),\r\n            \"binding_array<MyType1, C>\"\r\n        );\r\n    }\r\n}\r\n\r\nimpl crate::ScalarKind {\r\n    /// Format a scalar kind+width as a type is written in wgsl.\r\n    ///\r\n    /// Examples: `f32`, `u64`, `bool`.\r\n    fn to_wgsl(self, width: u8) -> String {\r\n        let prefix = match self {\r\n            crate::ScalarKind::Sint => \"i\",\r\n            crate::ScalarKind::Uint => \"u\",\r\n            crate::ScalarKind::Float => \"f\",\r\n            crate::ScalarKind::Bool => return \"bool\".to_string(),\r\n        };\r\n        format!(\"{}{}\", prefix, width * 8)\r\n    }\r\n}\r\n\r\ntrait StringValueLookup<'a> {\r\n    type Value;\r\n    fn lookup(&self, key: &'a str, span: Span) -> Result<Self::Value, Error<'a>>;\r\n}\r\nimpl<'a> StringValueLookup<'a> for FastHashMap<&'a str, TypedExpression> {\r\n    type Value = TypedExpression;\r\n    fn lookup(&self, key: &'a str, span: Span) -> Result<Self::Value, Error<'a>> {\r\n        self.get(key).cloned().ok_or(Error::UnknownIdent(span, key))\r\n    }\r\n}\r\n\r\nstruct StatementContext<'input, 'temp, 'out> {\r\n    symbol_table: &'temp mut super::SymbolTable<&'input str, TypedExpression>,\r\n    typifier: &'temp mut super::Typifier,\r\n    variables: &'out mut Arena<crate::LocalVariable>,\r\n    expressions: &'out mut Arena<crate::Expression>,\r\n    named_expressions: &'out mut FastHashMap<Handle<crate::Expression>, String>,\r\n    types: &'out mut UniqueArena<crate::Type>,\r\n    constants: &'out mut Arena<crate::Constant>,\r\n    global_vars: &'out Arena<crate::GlobalVariable>,\r\n    functions: &'out Arena<crate::Function>,\r\n    arguments: &'out [crate::FunctionArgument],\r\n}\r\n\r\nimpl<'a, 'temp> StatementContext<'a, 'temp, '_> {\r\n    fn reborrow(&mut self) -> StatementContext<'a, '_, '_> {\r\n        StatementContext {\r\n            symbol_table: self.symbol_table,\r\n            typifier: self.typifier,\r\n            variables: self.variables,\r\n            expressions: self.expressions,\r\n            named_expressions: self.named_expressions,\r\n            types: self.types,\r\n            constants: self.constants,\r\n            global_vars: self.global_vars,\r\n            functions: self.functions,\r\n            arguments: self.arguments,\r\n        }\r\n    }\r\n\r\n    fn as_expression<'t>(\r\n        &'t mut self,\r\n        block: &'t mut crate::Block,\r\n        emitter: &'t mut super::Emitter,\r\n    ) -> ExpressionContext<'a, 't, '_>\r\n    where\r\n        'temp: 't,\r\n    {\r\n        ExpressionContext {\r\n            symbol_table: self.symbol_table,\r\n            typifier: self.typifier,\r\n            expressions: self.expressions,\r\n            types: self.types,\r\n            constants: self.constants,\r\n            global_vars: self.global_vars,\r\n            local_vars: self.variables,\r\n            functions: self.functions,\r\n            arguments: self.arguments,\r\n            block,\r\n            emitter,\r\n        }\r\n    }\r\n}\r\n\r\nstruct SamplingContext {\r\n    image: Handle<crate::Expression>,\r\n    arrayed: bool,\r\n}\r\n\r\nstruct ExpressionContext<'input, 'temp, 'out> {\r\n    symbol_table: &'temp mut super::SymbolTable<&'input str, TypedExpression>,\r\n    typifier: &'temp mut super::Typifier,\r\n    expressions: &'out mut Arena<crate::Expression>,\r\n    types: &'out mut UniqueArena<crate::Type>,\r\n    constants: &'out mut Arena<crate::Constant>,\r\n    global_vars: &'out Arena<crate::GlobalVariable>,\r\n    local_vars: &'out Arena<crate::LocalVariable>,\r\n    arguments: &'out [crate::FunctionArgument],\r\n    functions: &'out Arena<crate::Function>,\r\n    block: &'temp mut crate::Block,\r\n    emitter: &'temp mut super::Emitter,\r\n}\r\n\r\nimpl<'a> ExpressionContext<'a, '_, '_> {\r\n    fn reborrow(&mut self) -> ExpressionContext<'a, '_, '_> {\r\n        ExpressionContext {\r\n            symbol_table: self.symbol_table,\r\n            typifier: self.typifier,\r\n            expressions: self.expressions,\r\n            types: self.types,\r\n            constants: self.constants,\r\n            global_vars: self.global_vars,\r\n            local_vars: self.local_vars,\r\n            functions: self.functions,\r\n            arguments: self.arguments,\r\n            block: self.block,\r\n            emitter: self.emitter,\r\n        }\r\n    }\r\n\r\n    fn resolve_type(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n    ) -> Result<&crate::TypeInner, Error<'a>> {\r\n        let resolve_ctx = ResolveContext {\r\n            constants: self.constants,\r\n            types: self.types,\r\n            global_vars: self.global_vars,\r\n            local_vars: self.local_vars,\r\n            functions: self.functions,\r\n            arguments: self.arguments,\r\n        };\r\n        match self.typifier.grow(handle, self.expressions, &resolve_ctx) {\r\n            Err(e) => Err(Error::InvalidResolve(e)),\r\n            Ok(()) => Ok(self.typifier.get(handle, self.types)),\r\n        }\r\n    }\r\n\r\n    fn prepare_sampling(\r\n        &mut self,\r\n        image: Handle<crate::Expression>,\r\n        span: Span,\r\n    ) -> Result<SamplingContext, Error<'a>> {\r\n        Ok(SamplingContext {\r\n            image,\r\n            arrayed: match *self.resolve_type(image)? {\r\n                crate::TypeInner::Image { arrayed, .. } => arrayed,\r\n                _ => return Err(Error::BadTexture(span)),\r\n            },\r\n        })\r\n    }\r\n\r\n    fn parse_binary_op(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        classifier: impl Fn(Token<'a>) -> Option<crate::BinaryOperator>,\r\n        mut parser: impl FnMut(\r\n            &mut Lexer<'a>,\r\n            ExpressionContext<'a, '_, '_>,\r\n        ) -> Result<TypedExpression, Error<'a>>,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        let start = lexer.start_byte_offset() as u32;\r\n        let mut accumulator = parser(lexer, self.reborrow())?;\r\n        while let Some(op) = classifier(lexer.peek().0) {\r\n            let _ = lexer.next();\r\n            // Binary expressions always apply the load rule to their operands.\r\n            let mut left = self.apply_load_rule(accumulator);\r\n            let unloaded_right = parser(lexer, self.reborrow())?;\r\n            let right = self.apply_load_rule(unloaded_right);\r\n            let end = lexer.end_byte_offset() as u32;\r\n            left = self.expressions.append(\r\n                crate::Expression::Binary { op, left, right },\r\n                NagaSpan::new(start, end),\r\n            );\r\n            // Binary expressions never produce references.\r\n            accumulator = TypedExpression::non_reference(left);\r\n        }\r\n        Ok(accumulator)\r\n    }\r\n\r\n    fn parse_binary_splat_op(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        classifier: impl Fn(Token<'a>) -> Option<crate::BinaryOperator>,\r\n        mut parser: impl FnMut(\r\n            &mut Lexer<'a>,\r\n            ExpressionContext<'a, '_, '_>,\r\n        ) -> Result<TypedExpression, Error<'a>>,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        let start = lexer.start_byte_offset() as u32;\r\n        let mut accumulator = parser(lexer, self.reborrow())?;\r\n        while let Some(op) = classifier(lexer.peek().0) {\r\n            let _ = lexer.next();\r\n            // Binary expressions always apply the load rule to their operands.\r\n            let mut left = self.apply_load_rule(accumulator);\r\n            let unloaded_right = parser(lexer, self.reborrow())?;\r\n            let mut right = self.apply_load_rule(unloaded_right);\r\n            let end = lexer.end_byte_offset() as u32;\r\n\r\n            self.binary_op_splat(op, &mut left, &mut right)?;\r\n\r\n            accumulator = TypedExpression::non_reference(self.expressions.append(\r\n                crate::Expression::Binary { op, left, right },\r\n                NagaSpan::new(start, end),\r\n            ));\r\n        }\r\n        Ok(accumulator)\r\n    }\r\n\r\n    /// Insert splats, if needed by the non-'*' operations.\r\n    fn binary_op_splat(\r\n        &mut self,\r\n        op: crate::BinaryOperator,\r\n        left: &mut Handle<crate::Expression>,\r\n        right: &mut Handle<crate::Expression>,\r\n    ) -> Result<(), Error<'a>> {\r\n        if op != crate::BinaryOperator::Multiply {\r\n            let left_size = match *self.resolve_type(*left)? {\r\n                crate::TypeInner::Vector { size, .. } => Some(size),\r\n                _ => None,\r\n            };\r\n            match (left_size, self.resolve_type(*right)?) {\r\n                (Some(size), &crate::TypeInner::Scalar { .. }) => {\r\n                    *right = self.expressions.append(\r\n                        crate::Expression::Splat {\r\n                            size,\r\n                            value: *right,\r\n                        },\r\n                        self.expressions.get_span(*right),\r\n                    );\r\n                }\r\n                (None, &crate::TypeInner::Vector { size, .. }) => {\r\n                    *left = self.expressions.append(\r\n                        crate::Expression::Splat { size, value: *left },\r\n                        self.expressions.get_span(*left),\r\n                    );\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    /// Add a single expression to the expression table that is not covered by `self.emitter`.\r\n    ///\r\n    /// This is useful for `CallResult` and `AtomicResult` expressions, which should not be covered by\r\n    /// `Emit` statements.\r\n    fn interrupt_emitter(\r\n        &mut self,\r\n        expression: crate::Expression,\r\n        span: NagaSpan,\r\n    ) -> Handle<crate::Expression> {\r\n        self.block.extend(self.emitter.finish(self.expressions));\r\n        let result = self.expressions.append(expression, span);\r\n        self.emitter.start(self.expressions);\r\n        result\r\n    }\r\n\r\n    /// Apply the WGSL Load Rule to `expr`.\r\n    ///\r\n    /// If `expr` is has type `ref<SC, T, A>`, perform a load to produce a value of type\r\n    /// `T`. Otherwise, return `expr` unchanged.\r\n    fn apply_load_rule(&mut self, expr: TypedExpression) -> Handle<crate::Expression> {\r\n        if expr.is_reference {\r\n            let load = crate::Expression::Load {\r\n                pointer: expr.handle,\r\n            };\r\n            let span = self.expressions.get_span(expr.handle);\r\n            self.expressions.append(load, span)\r\n        } else {\r\n            expr.handle\r\n        }\r\n    }\r\n\r\n    /// Creates a zero value constant of type `ty`\r\n    ///\r\n    /// Returns `None` if the given `ty` is not a constructible type\r\n    fn create_zero_value_constant(\r\n        &mut self,\r\n        ty: Handle<crate::Type>,\r\n    ) -> Option<Handle<crate::Constant>> {\r\n        let inner = match self.types[ty].inner {\r\n            crate::TypeInner::Scalar { kind, width } => {\r\n                let value = match kind {\r\n                    crate::ScalarKind::Sint => crate::ScalarValue::Sint(0),\r\n                    crate::ScalarKind::Uint => crate::ScalarValue::Uint(0),\r\n                    crate::ScalarKind::Float => crate::ScalarValue::Float(0.),\r\n                    crate::ScalarKind::Bool => crate::ScalarValue::Bool(false),\r\n                };\r\n                crate::ConstantInner::Scalar { width, value }\r\n            }\r\n            crate::TypeInner::Vector { size, kind, width } => {\r\n                let scalar_ty = self.types.insert(\r\n                    crate::Type {\r\n                        name: None,\r\n                        inner: crate::TypeInner::Scalar { width, kind },\r\n                    },\r\n                    Default::default(),\r\n                );\r\n                let component = self.create_zero_value_constant(scalar_ty);\r\n                crate::ConstantInner::Composite {\r\n                    ty,\r\n                    components: (0..size as u8).map(|_| component).collect::<Option<_>>()?,\r\n                }\r\n            }\r\n            crate::TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => {\r\n                let vec_ty = self.types.insert(\r\n                    crate::Type {\r\n                        name: None,\r\n                        inner: crate::TypeInner::Vector {\r\n                            width,\r\n                            kind: crate::ScalarKind::Float,\r\n                            size: rows,\r\n                        },\r\n                    },\r\n                    Default::default(),\r\n                );\r\n                let component = self.create_zero_value_constant(vec_ty);\r\n                crate::ConstantInner::Composite {\r\n                    ty,\r\n                    components: (0..columns as u8)\r\n                        .map(|_| component)\r\n                        .collect::<Option<_>>()?,\r\n                }\r\n            }\r\n            crate::TypeInner::Array {\r\n                base,\r\n                size: crate::ArraySize::Constant(size),\r\n                ..\r\n            } => {\r\n                let component = self.create_zero_value_constant(base);\r\n                crate::ConstantInner::Composite {\r\n                    ty,\r\n                    components: (0..self.constants[size].to_array_length().unwrap())\r\n                        .map(|_| component)\r\n                        .collect::<Option<_>>()?,\r\n                }\r\n            }\r\n            crate::TypeInner::Struct { ref members, .. } => {\r\n                let members = members.clone();\r\n                crate::ConstantInner::Composite {\r\n                    ty,\r\n                    components: members\r\n                        .iter()\r\n                        .map(|member| self.create_zero_value_constant(member.ty))\r\n                        .collect::<Option<_>>()?,\r\n                }\r\n            }\r\n            _ => return None,\r\n        };\r\n\r\n        let constant = self.constants.fetch_or_append(\r\n            crate::Constant {\r\n                name: None,\r\n                specialization: None,\r\n                inner,\r\n            },\r\n            crate::Span::default(),\r\n        );\r\n        Some(constant)\r\n    }\r\n}\r\n\r\n/// A Naga [`Expression`] handle, with WGSL type information.\r\n///\r\n/// Naga and WGSL types are very close, but Naga lacks WGSL's 'reference' types,\r\n/// which we need to know to apply the Load Rule. This struct carries a Naga\r\n/// `Handle<Expression>` along with enough information to determine its WGSL type.\r\n///\r\n/// [`Expression`]: crate::Expression\r\n#[derive(Debug, Copy, Clone)]\r\nstruct TypedExpression {\r\n    /// The handle of the Naga expression.\r\n    handle: Handle<crate::Expression>,\r\n\r\n    /// True if this expression's WGSL type is a reference.\r\n    ///\r\n    /// When this is true, `handle` must be a pointer.\r\n    is_reference: bool,\r\n}\r\n\r\nimpl TypedExpression {\r\n    const fn non_reference(handle: Handle<crate::Expression>) -> TypedExpression {\r\n        TypedExpression {\r\n            handle,\r\n            is_reference: false,\r\n        }\r\n    }\r\n}\r\n\r\nenum Composition {\r\n    Single(u32),\r\n    Multi(crate::VectorSize, [crate::SwizzleComponent; 4]),\r\n}\r\n\r\nimpl Composition {\r\n    const fn letter_component(letter: char) -> Option<crate::SwizzleComponent> {\r\n        use crate::SwizzleComponent as Sc;\r\n        match letter {\r\n            'x' | 'r' => Some(Sc::X),\r\n            'y' | 'g' => Some(Sc::Y),\r\n            'z' | 'b' => Some(Sc::Z),\r\n            'w' | 'a' => Some(Sc::W),\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    fn extract_impl(name: &str, name_span: Span) -> Result<u32, Error> {\r\n        let ch = name\r\n            .chars()\r\n            .next()\r\n            .ok_or_else(|| Error::BadAccessor(name_span.clone()))?;\r\n        match Self::letter_component(ch) {\r\n            Some(sc) => Ok(sc as u32),\r\n            None => Err(Error::BadAccessor(name_span)),\r\n        }\r\n    }\r\n\r\n    fn make(name: &str, name_span: Span) -> Result<Self, Error> {\r\n        if name.len() > 1 {\r\n            let mut components = [crate::SwizzleComponent::X; 4];\r\n            for (comp, ch) in components.iter_mut().zip(name.chars()) {\r\n                *comp = Self::letter_component(ch)\r\n                    .ok_or_else(|| Error::BadAccessor(name_span.clone()))?;\r\n            }\r\n\r\n            let size = match name.len() {\r\n                2 => crate::VectorSize::Bi,\r\n                3 => crate::VectorSize::Tri,\r\n                4 => crate::VectorSize::Quad,\r\n                _ => return Err(Error::BadAccessor(name_span)),\r\n            };\r\n            Ok(Composition::Multi(size, components))\r\n        } else {\r\n            Self::extract_impl(name, name_span).map(Composition::Single)\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Default)]\r\nstruct TypeAttributes {\r\n    // Although WGSL nas no type attributes at the moment, it had them in the past\r\n    // (`[[stride]]`) and may as well acquire some again in the future.\r\n    // Therefore, we are leaving the plumbing in for now.\r\n}\r\n\r\n/// Which grammar rule we are in the midst of parsing.\r\n///\r\n/// This is used for error checking. `Parser` maintains a stack of\r\n/// these and (occasionally) checks that it is being pushed and popped\r\n/// as expected.\r\n#[derive(Clone, Debug, PartialEq)]\r\nenum Rule {\r\n    Attribute,\r\n    VariableDecl,\r\n    TypeDecl,\r\n    FunctionDecl,\r\n    Block,\r\n    Statement,\r\n    ConstantExpr,\r\n    PrimaryExpr,\r\n    SingularExpr,\r\n    UnaryExpr,\r\n    GeneralExpr,\r\n}\r\n\r\ntype LocalFunctionCall = (Handle<crate::Function>, Vec<Handle<crate::Expression>>);\r\n\r\n#[derive(Default)]\r\nstruct BindingParser {\r\n    location: Option<u32>,\r\n    built_in: Option<crate::BuiltIn>,\r\n    interpolation: Option<crate::Interpolation>,\r\n    sampling: Option<crate::Sampling>,\r\n    invariant: bool,\r\n}\r\n\r\nimpl BindingParser {\r\n    fn parse<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        name: &'a str,\r\n        name_span: Span,\r\n    ) -> Result<(), Error<'a>> {\r\n        match name {\r\n            \"location\" => {\r\n                lexer.expect(Token::Paren('('))?;\r\n                self.location = Some(Parser::parse_non_negative_i32_literal(lexer)?);\r\n                lexer.expect(Token::Paren(')'))?;\r\n            }\r\n            \"builtin\" => {\r\n                lexer.expect(Token::Paren('('))?;\r\n                let (raw, span) = lexer.next_ident_with_span()?;\r\n                self.built_in = Some(conv::map_built_in(raw, span)?);\r\n                lexer.expect(Token::Paren(')'))?;\r\n            }\r\n            \"interpolate\" => {\r\n                lexer.expect(Token::Paren('('))?;\r\n                let (raw, span) = lexer.next_ident_with_span()?;\r\n                self.interpolation = Some(conv::map_interpolation(raw, span)?);\r\n                if lexer.skip(Token::Separator(',')) {\r\n                    let (raw, span) = lexer.next_ident_with_span()?;\r\n                    self.sampling = Some(conv::map_sampling(raw, span)?);\r\n                }\r\n                lexer.expect(Token::Paren(')'))?;\r\n            }\r\n            \"invariant\" => self.invariant = true,\r\n            _ => return Err(Error::UnknownAttribute(name_span)),\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    const fn finish<'a>(self, span: Span) -> Result<Option<crate::Binding>, Error<'a>> {\r\n        match (\r\n            self.location,\r\n            self.built_in,\r\n            self.interpolation,\r\n            self.sampling,\r\n            self.invariant,\r\n        ) {\r\n            (None, None, None, None, false) => Ok(None),\r\n            (Some(location), None, interpolation, sampling, false) => {\r\n                // Before handing over the completed `Module`, we call\r\n                // `apply_default_interpolation` to ensure that the interpolation and\r\n                // sampling have been explicitly specified on all vertex shader output and fragment\r\n                // shader input user bindings, so leaving them potentially `None` here is fine.\r\n                Ok(Some(crate::Binding::Location {\r\n                    location,\r\n                    interpolation,\r\n                    sampling,\r\n                }))\r\n            }\r\n            (None, Some(crate::BuiltIn::Position { .. }), None, None, invariant) => {\r\n                Ok(Some(crate::Binding::BuiltIn(crate::BuiltIn::Position {\r\n                    invariant,\r\n                })))\r\n            }\r\n            (None, Some(built_in), None, None, false) => {\r\n                Ok(Some(crate::Binding::BuiltIn(built_in)))\r\n            }\r\n            (_, _, _, _, _) => Err(Error::InconsistentBinding(span)),\r\n        }\r\n    }\r\n}\r\n\r\nstruct ParsedVariable<'a> {\r\n    name: &'a str,\r\n    name_span: Span,\r\n    space: Option<crate::AddressSpace>,\r\n    ty: Handle<crate::Type>,\r\n    init: Option<Handle<crate::Constant>>,\r\n}\r\n\r\nstruct CalledFunction {\r\n    result: Option<Handle<crate::Expression>>,\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\npub struct ParseError {\r\n    message: String,\r\n    labels: Vec<(Span, Cow<'static, str>)>,\r\n    notes: Vec<String>,\r\n}\r\n\r\nimpl ParseError {\r\n    pub fn labels(&self) -> impl Iterator<Item = (Span, &str)> + ExactSizeIterator + '_ {\r\n        self.labels\r\n            .iter()\r\n            .map(|&(ref span, ref msg)| (span.clone(), msg.as_ref()))\r\n    }\r\n\r\n    pub fn message(&self) -> &str {\r\n        &self.message\r\n    }\r\n\r\n    fn diagnostic(&self) -> Diagnostic<()> {\r\n        let diagnostic = Diagnostic::error()\r\n            .with_message(self.message.to_string())\r\n            .with_labels(\r\n                self.labels\r\n                    .iter()\r\n                    .map(|label| {\r\n                        Label::primary((), label.0.clone()).with_message(label.1.to_string())\r\n                    })\r\n                    .collect(),\r\n            )\r\n            .with_notes(\r\n                self.notes\r\n                    .iter()\r\n                    .map(|note| format!(\"note: {}\", note))\r\n                    .collect(),\r\n            );\r\n        diagnostic\r\n    }\r\n\r\n    /// Emits a summary of the error to standard error stream.\r\n    pub fn emit_to_stderr(&self, source: &str) {\r\n        self.emit_to_stderr_with_path(source, \"wgsl\")\r\n    }\r\n\r\n    /// Emits a summary of the error to standard error stream.\r\n    pub fn emit_to_stderr_with_path(&self, source: &str, path: &str) {\r\n        let files = SimpleFile::new(path, source);\r\n        let config = codespan_reporting::term::Config::default();\r\n        let writer = StandardStream::stderr(ColorChoice::Auto);\r\n        term::emit(&mut writer.lock(), &config, &files, &self.diagnostic())\r\n            .expect(\"cannot write error\");\r\n    }\r\n\r\n    /// Emits a summary of the error to a string.\r\n    pub fn emit_to_string(&self, source: &str) -> String {\r\n        self.emit_to_string_with_path(source, \"wgsl\")\r\n    }\r\n\r\n    /// Emits a summary of the error to a string.\r\n    pub fn emit_to_string_with_path(&self, source: &str, path: &str) -> String {\r\n        let files = SimpleFile::new(path, source);\r\n        let config = codespan_reporting::term::Config::default();\r\n        let mut writer = NoColor::new(Vec::new());\r\n        term::emit(&mut writer, &config, &files, &self.diagnostic()).expect(\"cannot write error\");\r\n        String::from_utf8(writer.into_inner()).unwrap()\r\n    }\r\n\r\n    /// Returns a [`SourceLocation`] for the first label in the error message.\r\n    pub fn location(&self, source: &str) -> Option<SourceLocation> {\r\n        self.labels\r\n            .get(0)\r\n            .map(|label| NagaSpan::new(label.0.start as u32, label.0.end as u32).location(source))\r\n    }\r\n}\r\n\r\nimpl std::fmt::Display for ParseError {\r\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\r\n        write!(f, \"{}\", self.message)\r\n    }\r\n}\r\n\r\nimpl std::error::Error for ParseError {\r\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\r\n        None\r\n    }\r\n}\r\n\r\npub struct Parser {\r\n    rules: Vec<(Rule, usize)>,\r\n    module_scope_identifiers: FastHashMap<String, Span>,\r\n    lookup_type: FastHashMap<String, Handle<crate::Type>>,\r\n    layouter: Layouter,\r\n}\r\n\r\nimpl Parser {\r\n    pub fn new() -> Self {\r\n        Parser {\r\n            rules: Vec::new(),\r\n            module_scope_identifiers: FastHashMap::default(),\r\n            lookup_type: FastHashMap::default(),\r\n            layouter: Default::default(),\r\n        }\r\n    }\r\n\r\n    fn reset(&mut self) {\r\n        self.rules.clear();\r\n        self.module_scope_identifiers.clear();\r\n        self.lookup_type.clear();\r\n        self.layouter.clear();\r\n    }\r\n\r\n    fn push_rule_span(&mut self, rule: Rule, lexer: &mut Lexer<'_>) {\r\n        self.rules.push((rule, lexer.start_byte_offset()));\r\n    }\r\n\r\n    fn pop_rule_span(&mut self, lexer: &Lexer<'_>) -> Span {\r\n        let (_, initial) = self.rules.pop().unwrap();\r\n        lexer.span_from(initial)\r\n    }\r\n\r\n    fn peek_rule_span(&mut self, lexer: &Lexer<'_>) -> Span {\r\n        let &(_, initial) = self.rules.last().unwrap();\r\n        lexer.span_from(initial)\r\n    }\r\n\r\n    fn parse_switch_value<'a>(lexer: &mut Lexer<'a>, uint: bool) -> Result<i32, Error<'a>> {\r\n        let token_span = lexer.next();\r\n        match token_span.0 {\r\n            Token::Number(Ok(Number::U32(num))) if uint => Ok(num as i32),\r\n            Token::Number(Ok(Number::I32(num))) if !uint => Ok(num),\r\n            Token::Number(Err(e)) => Err(Error::BadNumber(token_span.1, e)),\r\n            _ => Err(Error::Unexpected(token_span.1, ExpectedToken::Integer)),\r\n        }\r\n    }\r\n\r\n    /// Parse a non-negative signed integer literal.\r\n    /// This is for attributes like `size`, `location` and others.\r\n    fn parse_non_negative_i32_literal<'a>(lexer: &mut Lexer<'a>) -> Result<u32, Error<'a>> {\r\n        match lexer.next() {\r\n            (Token::Number(Ok(Number::I32(num))), span) => {\r\n                u32::try_from(num).map_err(|_| Error::NegativeInt(span))\r\n            }\r\n            (Token::Number(Err(e)), span) => Err(Error::BadNumber(span, e)),\r\n            other => Err(Error::Unexpected(\r\n                other.1,\r\n                ExpectedToken::Number(NumberType::I32),\r\n            )),\r\n        }\r\n    }\r\n\r\n    /// Parse a non-negative integer literal that may be either signed or unsigned.\r\n    /// This is for the `workgroup_size` attribute and array lengths.\r\n    /// Note: these values should be no larger than [`i32::MAX`], but this is not checked here.\r\n    fn parse_generic_non_negative_int_literal<'a>(lexer: &mut Lexer<'a>) -> Result<u32, Error<'a>> {\r\n        match lexer.next() {\r\n            (Token::Number(Ok(Number::I32(num))), span) => {\r\n                u32::try_from(num).map_err(|_| Error::NegativeInt(span))\r\n            }\r\n            (Token::Number(Ok(Number::U32(num))), _) => Ok(num),\r\n            (Token::Number(Err(e)), span) => Err(Error::BadNumber(span, e)),\r\n            other => Err(Error::Unexpected(\r\n                other.1,\r\n                ExpectedToken::Number(NumberType::I32),\r\n            )),\r\n        }\r\n    }\r\n\r\n    fn parse_atomic_pointer<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<Handle<crate::Expression>, Error<'a>> {\r\n        let (pointer, pointer_span) =\r\n            lexer.capture_span(|lexer| self.parse_general_expression(lexer, ctx.reborrow()))?;\r\n        // Check if the pointer expression is to an atomic.\r\n        // The IR uses regular `Expression::Load` and `Statement::Store` for atomic load/stores,\r\n        // and it will not catch the use of a non-atomic variable here.\r\n        match *ctx.resolve_type(pointer)? {\r\n            crate::TypeInner::Pointer { base, .. } => match ctx.types[base].inner {\r\n                crate::TypeInner::Atomic { .. } => Ok(pointer),\r\n                ref other => {\r\n                    log::error!(\"Pointer type to {:?} passed to atomic op\", other);\r\n                    Err(Error::InvalidAtomicPointer(pointer_span))\r\n                }\r\n            },\r\n            ref other => {\r\n                log::error!(\"Type {:?} passed to atomic op\", other);\r\n                Err(Error::InvalidAtomicPointer(pointer_span))\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Expects name to be peeked from lexer, does not consume if returns None.\r\n    fn parse_local_function_call<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        name: &'a str,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<Option<LocalFunctionCall>, Error<'a>> {\r\n        let fun_handle = match ctx.functions.iter().find(|&(_, fun)| match fun.name {\r\n            Some(ref string) => string == name,\r\n            None => false,\r\n        }) {\r\n            Some((fun_handle, _)) => fun_handle,\r\n            None => return Ok(None),\r\n        };\r\n\r\n        let count = ctx.functions[fun_handle].arguments.len();\r\n        let mut arguments = Vec::with_capacity(count);\r\n        let _ = lexer.next();\r\n        lexer.open_arguments()?;\r\n        while arguments.len() != count {\r\n            if !arguments.is_empty() {\r\n                lexer.expect(Token::Separator(','))?;\r\n            }\r\n            let arg = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n            arguments.push(arg);\r\n        }\r\n        lexer.close_arguments()?;\r\n        Ok(Some((fun_handle, arguments)))\r\n    }\r\n\r\n    fn parse_atomic_helper<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        fun: crate::AtomicFunction,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<Handle<crate::Expression>, Error<'a>> {\r\n        lexer.open_arguments()?;\r\n        let pointer = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n        lexer.expect(Token::Separator(','))?;\r\n        let ctx_span = ctx.reborrow();\r\n        let (value, value_span) =\r\n            lexer.capture_span(|lexer| self.parse_general_expression(lexer, ctx_span))?;\r\n        lexer.close_arguments()?;\r\n\r\n        let expression = match *ctx.resolve_type(value)? {\r\n            crate::TypeInner::Scalar { kind, width } => crate::Expression::AtomicResult {\r\n                kind,\r\n                width,\r\n                comparison: false,\r\n            },\r\n            _ => return Err(Error::InvalidAtomicOperandType(value_span)),\r\n        };\r\n\r\n        let span = NagaSpan::from(value_span);\r\n        let result = ctx.interrupt_emitter(expression, span);\r\n        ctx.block.push(\r\n            crate::Statement::Atomic {\r\n                pointer,\r\n                fun,\r\n                value,\r\n                result,\r\n            },\r\n            span,\r\n        );\r\n        Ok(result)\r\n    }\r\n\r\n    /// Expects [`Rule::PrimaryExpr`] or [`Rule::SingularExpr`] on top; does not pop it.\r\n    /// Expects `word` to be peeked (still in lexer), doesn't consume if returning None.\r\n    fn parse_function_call_inner<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        name: &'a str,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<Option<CalledFunction>, Error<'a>> {\r\n        assert!(self.rules.last().is_some());\r\n        let expr = if let Some(fun) = conv::map_relational_fun(name) {\r\n            let _ = lexer.next();\r\n            lexer.open_arguments()?;\r\n            let argument = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n            lexer.close_arguments()?;\r\n            crate::Expression::Relational { fun, argument }\r\n        } else if let Some(axis) = conv::map_derivative_axis(name) {\r\n            let _ = lexer.next();\r\n            lexer.open_arguments()?;\r\n            let expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n            lexer.close_arguments()?;\r\n            crate::Expression::Derivative { axis, expr }\r\n        } else if let Some(fun) = conv::map_standard_fun(name) {\r\n            let _ = lexer.next();\r\n            lexer.open_arguments()?;\r\n            let arg_count = fun.argument_count();\r\n            let arg = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n            let arg1 = if arg_count > 1 {\r\n                lexer.expect(Token::Separator(','))?;\r\n                Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n            } else {\r\n                None\r\n            };\r\n            let arg2 = if arg_count > 2 {\r\n                lexer.expect(Token::Separator(','))?;\r\n                Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n            } else {\r\n                None\r\n            };\r\n            let arg3 = if arg_count > 3 {\r\n                lexer.expect(Token::Separator(','))?;\r\n                Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n            } else {\r\n                None\r\n            };\r\n            lexer.close_arguments()?;\r\n            crate::Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            }\r\n        } else {\r\n            match name {\r\n                \"bitcast\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.expect_generic_paren('<')?;\r\n                    let (ty, type_span) = lexer.capture_span(|lexer| {\r\n                        self.parse_type_decl(lexer, None, ctx.types, ctx.constants)\r\n                    })?;\r\n                    lexer.expect_generic_paren('>')?;\r\n\r\n                    lexer.open_arguments()?;\r\n                    let expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n\r\n                    let kind = match ctx.types[ty].inner {\r\n                        crate::TypeInner::Scalar { kind, .. } => kind,\r\n                        crate::TypeInner::Vector { kind, .. } => kind,\r\n                        _ => {\r\n                            return Err(Error::BadTypeCast {\r\n                                from_type: format!(\"{:?}\", ctx.resolve_type(expr)?),\r\n                                span: type_span,\r\n                                to_type: format!(\"{:?}\", ctx.types[ty].inner),\r\n                            })\r\n                        }\r\n                    };\r\n\r\n                    crate::Expression::As {\r\n                        expr,\r\n                        kind,\r\n                        convert: None,\r\n                    }\r\n                }\r\n                \"select\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let reject = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let accept = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let condition = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::Select {\r\n                        condition,\r\n                        accept,\r\n                        reject,\r\n                    }\r\n                }\r\n                \"arrayLength\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let array = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ArrayLength(array)\r\n                }\r\n                // atomics\r\n                \"atomicLoad\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let pointer = self.parse_atomic_pointer(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::Load { pointer }\r\n                }\r\n                \"atomicAdd\" => {\r\n                    let _ = lexer.next();\r\n                    let handle = self.parse_atomic_helper(\r\n                        lexer,\r\n                        crate::AtomicFunction::Add,\r\n                        ctx.reborrow(),\r\n                    )?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicSub\" => {\r\n                    let _ = lexer.next();\r\n                    let handle = self.parse_atomic_helper(\r\n                        lexer,\r\n                        crate::AtomicFunction::Subtract,\r\n                        ctx.reborrow(),\r\n                    )?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicAnd\" => {\r\n                    let _ = lexer.next();\r\n                    let handle = self.parse_atomic_helper(\r\n                        lexer,\r\n                        crate::AtomicFunction::And,\r\n                        ctx.reborrow(),\r\n                    )?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicOr\" => {\r\n                    let _ = lexer.next();\r\n                    let handle = self.parse_atomic_helper(\r\n                        lexer,\r\n                        crate::AtomicFunction::InclusiveOr,\r\n                        ctx.reborrow(),\r\n                    )?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicXor\" => {\r\n                    let _ = lexer.next();\r\n                    let handle = self.parse_atomic_helper(\r\n                        lexer,\r\n                        crate::AtomicFunction::ExclusiveOr,\r\n                        ctx.reborrow(),\r\n                    )?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicMin\" => {\r\n                    let _ = lexer.next();\r\n                    let handle =\r\n                        self.parse_atomic_helper(lexer, crate::AtomicFunction::Min, ctx)?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicMax\" => {\r\n                    let _ = lexer.next();\r\n                    let handle =\r\n                        self.parse_atomic_helper(lexer, crate::AtomicFunction::Max, ctx)?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicExchange\" => {\r\n                    let _ = lexer.next();\r\n                    let handle = self.parse_atomic_helper(\r\n                        lexer,\r\n                        crate::AtomicFunction::Exchange { compare: None },\r\n                        ctx,\r\n                    )?;\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(handle),\r\n                    }));\r\n                }\r\n                \"atomicCompareExchangeWeak\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let pointer = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let cmp = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let (value, value_span) = lexer.capture_span(|lexer| {\r\n                        self.parse_general_expression(lexer, ctx.reborrow())\r\n                    })?;\r\n                    lexer.close_arguments()?;\r\n\r\n                    let expression = match *ctx.resolve_type(value)? {\r\n                        crate::TypeInner::Scalar { kind, width } => {\r\n                            crate::Expression::AtomicResult {\r\n                                kind,\r\n                                width,\r\n                                comparison: true,\r\n                            }\r\n                        }\r\n                        _ => return Err(Error::InvalidAtomicOperandType(value_span)),\r\n                    };\r\n\r\n                    let span = NagaSpan::from(self.peek_rule_span(lexer));\r\n                    let result = ctx.interrupt_emitter(expression, span);\r\n                    ctx.block.push(\r\n                        crate::Statement::Atomic {\r\n                            pointer,\r\n                            fun: crate::AtomicFunction::Exchange { compare: Some(cmp) },\r\n                            value,\r\n                            result,\r\n                        },\r\n                        span,\r\n                    );\r\n                    return Ok(Some(CalledFunction {\r\n                        result: Some(result),\r\n                    }));\r\n                }\r\n                // texture sampling\r\n                \"textureSample\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: None,\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Auto,\r\n                        depth_ref: None,\r\n                    }\r\n                }\r\n                \"textureSampleLevel\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let level = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: None,\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Exact(level),\r\n                        depth_ref: None,\r\n                    }\r\n                }\r\n                \"textureSampleBias\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let bias = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: None,\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Bias(bias),\r\n                        depth_ref: None,\r\n                    }\r\n                }\r\n                \"textureSampleGrad\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let x = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let y = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: None,\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Gradient { x, y },\r\n                        depth_ref: None,\r\n                    }\r\n                }\r\n                \"textureSampleCompare\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let reference = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: None,\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Auto,\r\n                        depth_ref: Some(reference),\r\n                    }\r\n                }\r\n                \"textureSampleCompareLevel\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let reference = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: None,\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Zero,\r\n                        depth_ref: Some(reference),\r\n                    }\r\n                }\r\n                \"textureGather\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let component = if let (Token::Number(..), span) = lexer.peek() {\r\n                        let index = Self::parse_non_negative_i32_literal(lexer)?;\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        *crate::SwizzleComponent::XYZW\r\n                            .get(index as usize)\r\n                            .ok_or(Error::InvalidGatherComponent(span, index))?\r\n                    } else {\r\n                        crate::SwizzleComponent::X\r\n                    };\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: Some(component),\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Zero,\r\n                        depth_ref: None,\r\n                    }\r\n                }\r\n                \"textureGatherCompare\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let sc = ctx.prepare_sampling(image, image_span)?;\r\n                    let array_index = if sc.arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let reference = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let offset = if lexer.skip(Token::Separator(',')) {\r\n                        Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageSample {\r\n                        image: sc.image,\r\n                        sampler: sampler_expr,\r\n                        gather: Some(crate::SwizzleComponent::X),\r\n                        coordinate,\r\n                        array_index,\r\n                        offset,\r\n                        level: crate::SampleLevel::Zero,\r\n                        depth_ref: Some(reference),\r\n                    }\r\n                }\r\n                \"textureLoad\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let (image, image_span) =\r\n                        self.parse_general_expression_with_span(lexer, ctx.reborrow())?;\r\n                    lexer.expect(Token::Separator(','))?;\r\n                    let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let (class, arrayed) = match *ctx.resolve_type(image)? {\r\n                        crate::TypeInner::Image { class, arrayed, .. } => (class, arrayed),\r\n                        _ => return Err(Error::BadTexture(image_span)),\r\n                    };\r\n                    let array_index = if arrayed {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    let level = if class.is_mipmapped() {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    let sample = if class.is_multisampled() {\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        Some(self.parse_general_expression(lexer, ctx.reborrow())?)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageLoad {\r\n                        image,\r\n                        coordinate,\r\n                        array_index,\r\n                        sample,\r\n                        level,\r\n                    }\r\n                }\r\n                \"textureDimensions\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let image = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let level = if lexer.skip(Token::Separator(',')) {\r\n                        let expr = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                        Some(expr)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageQuery {\r\n                        image,\r\n                        query: crate::ImageQuery::Size { level },\r\n                    }\r\n                }\r\n                \"textureNumLevels\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let image = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageQuery {\r\n                        image,\r\n                        query: crate::ImageQuery::NumLevels,\r\n                    }\r\n                }\r\n                \"textureNumLayers\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let image = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageQuery {\r\n                        image,\r\n                        query: crate::ImageQuery::NumLayers,\r\n                    }\r\n                }\r\n                \"textureNumSamples\" => {\r\n                    let _ = lexer.next();\r\n                    lexer.open_arguments()?;\r\n                    let image = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    lexer.close_arguments()?;\r\n                    crate::Expression::ImageQuery {\r\n                        image,\r\n                        query: crate::ImageQuery::NumSamples,\r\n                    }\r\n                }\r\n                // other\r\n                _ => {\r\n                    let result =\r\n                        match self.parse_local_function_call(lexer, name, ctx.reborrow())? {\r\n                            Some((function, arguments)) => {\r\n                                let span = NagaSpan::from(self.peek_rule_span(lexer));\r\n                                ctx.block.extend(ctx.emitter.finish(ctx.expressions));\r\n                                let result = ctx.functions[function].result.as_ref().map(|_| {\r\n                                    ctx.expressions\r\n                                        .append(crate::Expression::CallResult(function), span)\r\n                                });\r\n                                ctx.emitter.start(ctx.expressions);\r\n                                ctx.block.push(\r\n                                    crate::Statement::Call {\r\n                                        function,\r\n                                        arguments,\r\n                                        result,\r\n                                    },\r\n                                    span,\r\n                                );\r\n                                result\r\n                            }\r\n                            None => return Ok(None),\r\n                        };\r\n                    return Ok(Some(CalledFunction { result }));\r\n                }\r\n            }\r\n        };\r\n        let span = NagaSpan::from(self.peek_rule_span(lexer));\r\n        let handle = ctx.expressions.append(expr, span);\r\n        Ok(Some(CalledFunction {\r\n            result: Some(handle),\r\n        }))\r\n    }\r\n\r\n    fn parse_const_expression_impl<'a>(\r\n        &mut self,\r\n        first_token_span: TokenSpan<'a>,\r\n        lexer: &mut Lexer<'a>,\r\n        register_name: Option<&'a str>,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<Handle<crate::Constant>, Error<'a>> {\r\n        self.push_rule_span(Rule::ConstantExpr, lexer);\r\n        let inner = match first_token_span {\r\n            (Token::Word(\"true\"), _) => crate::ConstantInner::boolean(true),\r\n            (Token::Word(\"false\"), _) => crate::ConstantInner::boolean(false),\r\n            (Token::Number(num), _) => match num {\r\n                Ok(Number::I32(num)) => crate::ConstantInner::Scalar {\r\n                    value: crate::ScalarValue::Sint(num as i64),\r\n                    width: 4,\r\n                },\r\n                Ok(Number::U32(num)) => crate::ConstantInner::Scalar {\r\n                    value: crate::ScalarValue::Uint(num as u64),\r\n                    width: 4,\r\n                },\r\n                Ok(Number::F32(num)) => crate::ConstantInner::Scalar {\r\n                    value: crate::ScalarValue::Float(num as f64),\r\n                    width: 4,\r\n                },\r\n                Ok(Number::AbstractInt(_) | Number::AbstractFloat(_)) => unreachable!(),\r\n                Err(e) => return Err(Error::BadNumber(first_token_span.1, e)),\r\n            },\r\n            (Token::Word(name), name_span) => {\r\n                // look for an existing constant first\r\n                for (handle, var) in const_arena.iter() {\r\n                    match var.name {\r\n                        Some(ref string) if string == name => {\r\n                            self.pop_rule_span(lexer);\r\n                            return Ok(handle);\r\n                        }\r\n                        _ => {}\r\n                    }\r\n                }\r\n                let composite_ty = self.parse_type_decl_name(\r\n                    lexer,\r\n                    name,\r\n                    name_span,\r\n                    None,\r\n                    TypeAttributes::default(),\r\n                    type_arena,\r\n                    const_arena,\r\n                )?;\r\n\r\n                lexer.open_arguments()?;\r\n                //Note: this expects at least one argument\r\n                let mut components = Vec::new();\r\n                while components.is_empty() || lexer.next_argument()? {\r\n                    let component = self.parse_const_expression(lexer, type_arena, const_arena)?;\r\n                    components.push(component);\r\n                }\r\n                crate::ConstantInner::Composite {\r\n                    ty: composite_ty,\r\n                    components,\r\n                }\r\n            }\r\n            other => return Err(Error::Unexpected(other.1, ExpectedToken::Constant)),\r\n        };\r\n\r\n        // Only set span if it's a named constant. Otherwise, the enclosing Expression should have\r\n        // the span.\r\n        let span = self.pop_rule_span(lexer);\r\n        let handle = if let Some(name) = register_name {\r\n            if crate::keywords::wgsl::RESERVED.contains(&name) {\r\n                return Err(Error::ReservedKeyword(span));\r\n            }\r\n            const_arena.append(\r\n                crate::Constant {\r\n                    name: Some(name.to_string()),\r\n                    specialization: None,\r\n                    inner,\r\n                },\r\n                NagaSpan::from(span),\r\n            )\r\n        } else {\r\n            const_arena.fetch_or_append(\r\n                crate::Constant {\r\n                    name: None,\r\n                    specialization: None,\r\n                    inner,\r\n                },\r\n                Default::default(),\r\n            )\r\n        };\r\n\r\n        Ok(handle)\r\n    }\r\n\r\n    fn parse_const_expression<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<Handle<crate::Constant>, Error<'a>> {\r\n        self.parse_const_expression_impl(lexer.next(), lexer, None, type_arena, const_arena)\r\n    }\r\n\r\n    fn parse_primary_expression<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        // Will be popped inside match, possibly inside parse_function_call_inner or parse_construction\r\n        self.push_rule_span(Rule::PrimaryExpr, lexer);\r\n        let expr = match lexer.peek() {\r\n            (Token::Paren('('), _) => {\r\n                let _ = lexer.next();\r\n                let (expr, _span) =\r\n                    self.parse_general_expression_for_reference(lexer, ctx.reborrow())?;\r\n                lexer.expect(Token::Paren(')'))?;\r\n                self.pop_rule_span(lexer);\r\n                expr\r\n            }\r\n            (Token::Word(\"true\" | \"false\") | Token::Number(..), _) => {\r\n                let const_handle = self.parse_const_expression(lexer, ctx.types, ctx.constants)?;\r\n                let span = NagaSpan::from(self.pop_rule_span(lexer));\r\n                TypedExpression::non_reference(\r\n                    ctx.interrupt_emitter(crate::Expression::Constant(const_handle), span),\r\n                )\r\n            }\r\n            (Token::Word(word), span) => {\r\n                if let Some(definition) = ctx.symbol_table.lookup(word) {\r\n                    let _ = lexer.next();\r\n                    self.pop_rule_span(lexer);\r\n\r\n                    *definition\r\n                } else if let Some(CalledFunction { result: Some(expr) }) =\r\n                    self.parse_function_call_inner(lexer, word, ctx.reborrow())?\r\n                {\r\n                    //TODO: resolve the duplicate call in `parse_singular_expression`\r\n                    self.pop_rule_span(lexer);\r\n                    TypedExpression::non_reference(expr)\r\n                } else {\r\n                    let _ = lexer.next();\r\n                    if let Some(expr) = construction::parse_construction(\r\n                        self,\r\n                        lexer,\r\n                        word,\r\n                        span.clone(),\r\n                        ctx.reborrow(),\r\n                    )? {\r\n                        TypedExpression::non_reference(expr)\r\n                    } else {\r\n                        return Err(Error::UnknownIdent(span, word));\r\n                    }\r\n                }\r\n            }\r\n            other => return Err(Error::Unexpected(other.1, ExpectedToken::PrimaryExpression)),\r\n        };\r\n        Ok(expr)\r\n    }\r\n\r\n    fn parse_postfix<'a>(\r\n        &mut self,\r\n        span_start: usize,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n        expr: TypedExpression,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        // Parse postfix expressions, adjusting `handle` and `is_reference` along the way.\r\n        //\r\n        // Most postfix expressions don't affect `is_reference`: for example, `s.x` is a\r\n        // reference whenever `s` is a reference. But swizzles (WGSL spec: \"multiple\r\n        // component selection\") apply the load rule, converting references to values, so\r\n        // those affect `is_reference` as well as `handle`.\r\n        let TypedExpression {\r\n            mut handle,\r\n            mut is_reference,\r\n        } = expr;\r\n        let mut prefix_span = lexer.span_from(span_start);\r\n\r\n        loop {\r\n            // Step lightly around `resolve_type`'s mutable borrow.\r\n            ctx.resolve_type(handle)?;\r\n\r\n            // Find the type of the composite whose elements, components or members we're\r\n            // accessing, skipping through references: except for swizzles, the `Access`\r\n            // or `AccessIndex` expressions we'd generate are the same either way.\r\n            //\r\n            // Pointers, however, are not permitted. For error checks below, note whether\r\n            // the base expression is a WGSL pointer.\r\n            let temp_inner;\r\n            let (composite, wgsl_pointer) = match *ctx.typifier.get(handle, ctx.types) {\r\n                crate::TypeInner::Pointer { base, .. } => (&ctx.types[base].inner, !is_reference),\r\n                crate::TypeInner::ValuePointer {\r\n                    size: None,\r\n                    kind,\r\n                    width,\r\n                    ..\r\n                } => {\r\n                    temp_inner = crate::TypeInner::Scalar { kind, width };\r\n                    (&temp_inner, !is_reference)\r\n                }\r\n                crate::TypeInner::ValuePointer {\r\n                    size: Some(size),\r\n                    kind,\r\n                    width,\r\n                    ..\r\n                } => {\r\n                    temp_inner = crate::TypeInner::Vector { size, kind, width };\r\n                    (&temp_inner, !is_reference)\r\n                }\r\n                ref other => (other, false),\r\n            };\r\n\r\n            let expression = match lexer.peek().0 {\r\n                Token::Separator('.') => {\r\n                    let _ = lexer.next();\r\n                    let (name, name_span) = lexer.next_ident_with_span()?;\r\n\r\n                    // WGSL doesn't allow accessing members on pointers, or swizzling\r\n                    // them. But Naga IR doesn't distinguish pointers and references, so\r\n                    // we must check here.\r\n                    if wgsl_pointer {\r\n                        return Err(Error::Pointer(\r\n                            \"the value accessed by a `.member` expression\",\r\n                            prefix_span,\r\n                        ));\r\n                    }\r\n\r\n                    let access = match *composite {\r\n                        crate::TypeInner::Struct { ref members, .. } => {\r\n                            let index = members\r\n                                .iter()\r\n                                .position(|m| m.name.as_deref() == Some(name))\r\n                                .ok_or(Error::BadAccessor(name_span))?\r\n                                as u32;\r\n                            crate::Expression::AccessIndex {\r\n                                base: handle,\r\n                                index,\r\n                            }\r\n                        }\r\n                        crate::TypeInner::Vector { .. } | crate::TypeInner::Matrix { .. } => {\r\n                            match Composition::make(name, name_span)? {\r\n                                Composition::Multi(size, pattern) => {\r\n                                    // Once you apply the load rule, the expression is no\r\n                                    // longer a reference.\r\n                                    let current_expr = TypedExpression {\r\n                                        handle,\r\n                                        is_reference,\r\n                                    };\r\n                                    let vector = ctx.apply_load_rule(current_expr);\r\n                                    is_reference = false;\r\n\r\n                                    crate::Expression::Swizzle {\r\n                                        size,\r\n                                        vector,\r\n                                        pattern,\r\n                                    }\r\n                                }\r\n                                Composition::Single(index) => crate::Expression::AccessIndex {\r\n                                    base: handle,\r\n                                    index,\r\n                                },\r\n                            }\r\n                        }\r\n                        _ => return Err(Error::BadAccessor(name_span)),\r\n                    };\r\n\r\n                    access\r\n                }\r\n                Token::Paren('[') => {\r\n                    let (_, open_brace_span) = lexer.next();\r\n                    let index = self.parse_general_expression(lexer, ctx.reborrow())?;\r\n                    let close_brace_span = lexer.expect_span(Token::Paren(']'))?;\r\n\r\n                    // WGSL doesn't allow pointers to be subscripted. But Naga IR doesn't\r\n                    // distinguish pointers and references, so we must check here.\r\n                    if wgsl_pointer {\r\n                        return Err(Error::Pointer(\r\n                            \"the value indexed by a `[]` subscripting expression\",\r\n                            prefix_span,\r\n                        ));\r\n                    }\r\n\r\n                    if let crate::Expression::Constant(constant) = ctx.expressions[index] {\r\n                        let expr_span = open_brace_span.end..close_brace_span.start;\r\n\r\n                        let index = match ctx.constants[constant].inner {\r\n                            ConstantInner::Scalar {\r\n                                value: ScalarValue::Uint(int),\r\n                                ..\r\n                            } => u32::try_from(int).map_err(|_| Error::BadU32Constant(expr_span)),\r\n                            ConstantInner::Scalar {\r\n                                value: ScalarValue::Sint(int),\r\n                                ..\r\n                            } => u32::try_from(int).map_err(|_| Error::BadU32Constant(expr_span)),\r\n                            _ => Err(Error::BadU32Constant(expr_span)),\r\n                        }?;\r\n\r\n                        crate::Expression::AccessIndex {\r\n                            base: handle,\r\n                            index,\r\n                        }\r\n                    } else {\r\n                        crate::Expression::Access {\r\n                            base: handle,\r\n                            index,\r\n                        }\r\n                    }\r\n                }\r\n                _ => break,\r\n            };\r\n\r\n            prefix_span = lexer.span_from(span_start);\r\n            handle = ctx\r\n                .expressions\r\n                .append(expression, NagaSpan::from(prefix_span.clone()));\r\n        }\r\n\r\n        Ok(TypedExpression {\r\n            handle,\r\n            is_reference,\r\n        })\r\n    }\r\n\r\n    /// Parse a `unary_expression`.\r\n    fn parse_unary_expression<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        self.push_rule_span(Rule::UnaryExpr, lexer);\r\n        //TODO: refactor this to avoid backing up\r\n        let expr = match lexer.peek().0 {\r\n            Token::Operation('-') => {\r\n                let _ = lexer.next();\r\n                let unloaded_expr = self.parse_unary_expression(lexer, ctx.reborrow())?;\r\n                let expr = ctx.apply_load_rule(unloaded_expr);\r\n                let expr = crate::Expression::Unary {\r\n                    op: crate::UnaryOperator::Negate,\r\n                    expr,\r\n                };\r\n                let span = NagaSpan::from(self.peek_rule_span(lexer));\r\n                TypedExpression::non_reference(ctx.expressions.append(expr, span))\r\n            }\r\n            Token::Operation('!' | '~') => {\r\n                let _ = lexer.next();\r\n                let unloaded_expr = self.parse_unary_expression(lexer, ctx.reborrow())?;\r\n                let expr = ctx.apply_load_rule(unloaded_expr);\r\n                let expr = crate::Expression::Unary {\r\n                    op: crate::UnaryOperator::Not,\r\n                    expr,\r\n                };\r\n                let span = NagaSpan::from(self.peek_rule_span(lexer));\r\n                TypedExpression::non_reference(ctx.expressions.append(expr, span))\r\n            }\r\n            Token::Operation('*') => {\r\n                let _ = lexer.next();\r\n                // The `*` operator does not accept a reference, so we must apply the Load\r\n                // Rule here. But the operator itself simply changes the type from\r\n                // `ptr<SC, T, A>` to `ref<SC, T, A>`, so we generate no code for the\r\n                // operator itself. We simply return a `TypedExpression` with\r\n                // `is_reference` set to true.\r\n                let unloaded_pointer = self.parse_unary_expression(lexer, ctx.reborrow())?;\r\n                let pointer = ctx.apply_load_rule(unloaded_pointer);\r\n\r\n                // An expression like `&*ptr` may generate no Naga IR at all, but WGSL requires\r\n                // an error if `ptr` is not a pointer. So we have to type-check this ourselves.\r\n                if ctx.resolve_type(pointer)?.pointer_space().is_none() {\r\n                    let span = ctx\r\n                        .expressions\r\n                        .get_span(pointer)\r\n                        .to_range()\r\n                        .unwrap_or_else(|| self.peek_rule_span(lexer));\r\n                    return Err(Error::NotPointer(span));\r\n                }\r\n\r\n                TypedExpression {\r\n                    handle: pointer,\r\n                    is_reference: true,\r\n                }\r\n            }\r\n            Token::Operation('&') => {\r\n                let _ = lexer.next();\r\n                // The `&` operator simply converts a reference to a pointer. And since a\r\n                // reference is required, the Load Rule is not applied.\r\n                let operand = self.parse_unary_expression(lexer, ctx.reborrow())?;\r\n                if !operand.is_reference {\r\n                    let span = ctx\r\n                        .expressions\r\n                        .get_span(operand.handle)\r\n                        .to_range()\r\n                        .unwrap_or_else(|| self.peek_rule_span(lexer));\r\n                    return Err(Error::NotReference(\"the operand of the `&` operator\", span));\r\n                }\r\n\r\n                // No code is generated. We just declare the pointer a reference now.\r\n                TypedExpression {\r\n                    is_reference: false,\r\n                    ..operand\r\n                }\r\n            }\r\n            _ => self.parse_singular_expression(lexer, ctx.reborrow())?,\r\n        };\r\n\r\n        self.pop_rule_span(lexer);\r\n        Ok(expr)\r\n    }\r\n\r\n    /// Parse a `singular_expression`.\r\n    fn parse_singular_expression<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        let start = lexer.start_byte_offset();\r\n        self.push_rule_span(Rule::SingularExpr, lexer);\r\n        let primary_expr = self.parse_primary_expression(lexer, ctx.reborrow())?;\r\n        let singular_expr = self.parse_postfix(start, lexer, ctx.reborrow(), primary_expr)?;\r\n        self.pop_rule_span(lexer);\r\n\r\n        Ok(singular_expr)\r\n    }\r\n\r\n    fn parse_equality_expression<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<TypedExpression, Error<'a>> {\r\n        // equality_expression\r\n        context.parse_binary_op(\r\n            lexer,\r\n            |token| match token {\r\n                Token::LogicalOperation('=') => Some(crate::BinaryOperator::Equal),\r\n                Token::LogicalOperation('!') => Some(crate::BinaryOperator::NotEqual),\r\n                _ => None,\r\n            },\r\n            // relational_expression\r\n            |lexer, mut context| {\r\n                context.parse_binary_op(\r\n                    lexer,\r\n                    |token| match token {\r\n                        Token::Paren('<') => Some(crate::BinaryOperator::Less),\r\n                        Token::Paren('>') => Some(crate::BinaryOperator::Greater),\r\n                        Token::LogicalOperation('<') => Some(crate::BinaryOperator::LessEqual),\r\n                        Token::LogicalOperation('>') => Some(crate::BinaryOperator::GreaterEqual),\r\n                        _ => None,\r\n                    },\r\n                    // shift_expression\r\n                    |lexer, mut context| {\r\n                        context.parse_binary_op(\r\n                            lexer,\r\n                            |token| match token {\r\n                                Token::ShiftOperation('<') => {\r\n                                    Some(crate::BinaryOperator::ShiftLeft)\r\n                                }\r\n                                Token::ShiftOperation('>') => {\r\n                                    Some(crate::BinaryOperator::ShiftRight)\r\n                                }\r\n                                _ => None,\r\n                            },\r\n                            // additive_expression\r\n                            |lexer, mut context| {\r\n                                context.parse_binary_splat_op(\r\n                                    lexer,\r\n                                    |token| match token {\r\n                                        Token::Operation('+') => Some(crate::BinaryOperator::Add),\r\n                                        Token::Operation('-') => {\r\n                                            Some(crate::BinaryOperator::Subtract)\r\n                                        }\r\n                                        _ => None,\r\n                                    },\r\n                                    // multiplicative_expression\r\n                                    |lexer, mut context| {\r\n                                        context.parse_binary_splat_op(\r\n                                            lexer,\r\n                                            |token| match token {\r\n                                                Token::Operation('*') => {\r\n                                                    Some(crate::BinaryOperator::Multiply)\r\n                                                }\r\n                                                Token::Operation('/') => {\r\n                                                    Some(crate::BinaryOperator::Divide)\r\n                                                }\r\n                                                Token::Operation('%') => {\r\n                                                    Some(crate::BinaryOperator::Modulo)\r\n                                                }\r\n                                                _ => None,\r\n                                            },\r\n                                            |lexer, context| {\r\n                                                self.parse_unary_expression(lexer, context)\r\n                                            },\r\n                                        )\r\n                                    },\r\n                                )\r\n                            },\r\n                        )\r\n                    },\r\n                )\r\n            },\r\n        )\r\n    }\r\n\r\n    fn parse_general_expression_with_span<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<(Handle<crate::Expression>, Span), Error<'a>> {\r\n        let (expr, span) = self.parse_general_expression_for_reference(lexer, ctx.reborrow())?;\r\n        Ok((ctx.apply_load_rule(expr), span))\r\n    }\r\n\r\n    fn parse_general_expression<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut ctx: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<Handle<crate::Expression>, Error<'a>> {\r\n        let (expr, _span) = self.parse_general_expression_for_reference(lexer, ctx.reborrow())?;\r\n        Ok(ctx.apply_load_rule(expr))\r\n    }\r\n\r\n    fn parse_general_expression_for_reference<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: ExpressionContext<'a, '_, '_>,\r\n    ) -> Result<(TypedExpression, Span), Error<'a>> {\r\n        self.push_rule_span(Rule::GeneralExpr, lexer);\r\n        // logical_or_expression\r\n        let handle = context.parse_binary_op(\r\n            lexer,\r\n            |token| match token {\r\n                Token::LogicalOperation('|') => Some(crate::BinaryOperator::LogicalOr),\r\n                _ => None,\r\n            },\r\n            // logical_and_expression\r\n            |lexer, mut context| {\r\n                context.parse_binary_op(\r\n                    lexer,\r\n                    |token| match token {\r\n                        Token::LogicalOperation('&') => Some(crate::BinaryOperator::LogicalAnd),\r\n                        _ => None,\r\n                    },\r\n                    // inclusive_or_expression\r\n                    |lexer, mut context| {\r\n                        context.parse_binary_op(\r\n                            lexer,\r\n                            |token| match token {\r\n                                Token::Operation('|') => Some(crate::BinaryOperator::InclusiveOr),\r\n                                _ => None,\r\n                            },\r\n                            // exclusive_or_expression\r\n                            |lexer, mut context| {\r\n                                context.parse_binary_op(\r\n                                    lexer,\r\n                                    |token| match token {\r\n                                        Token::Operation('^') => {\r\n                                            Some(crate::BinaryOperator::ExclusiveOr)\r\n                                        }\r\n                                        _ => None,\r\n                                    },\r\n                                    // and_expression\r\n                                    |lexer, mut context| {\r\n                                        context.parse_binary_op(\r\n                                            lexer,\r\n                                            |token| match token {\r\n                                                Token::Operation('&') => {\r\n                                                    Some(crate::BinaryOperator::And)\r\n                                                }\r\n                                                _ => None,\r\n                                            },\r\n                                            |lexer, context| {\r\n                                                self.parse_equality_expression(lexer, context)\r\n                                            },\r\n                                        )\r\n                                    },\r\n                                )\r\n                            },\r\n                        )\r\n                    },\r\n                )\r\n            },\r\n        )?;\r\n        Ok((handle, self.pop_rule_span(lexer)))\r\n    }\r\n\r\n    fn parse_variable_ident_decl<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<(&'a str, Span, Handle<crate::Type>), Error<'a>> {\r\n        let (name, name_span) = lexer.next_ident_with_span()?;\r\n        lexer.expect(Token::Separator(':'))?;\r\n        let ty = self.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n        Ok((name, name_span, ty))\r\n    }\r\n\r\n    fn parse_variable_decl<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<ParsedVariable<'a>, Error<'a>> {\r\n        self.push_rule_span(Rule::VariableDecl, lexer);\r\n        let mut space = None;\r\n\r\n        if lexer.skip(Token::Paren('<')) {\r\n            let (class_str, span) = lexer.next_ident_with_span()?;\r\n            space = Some(match class_str {\r\n                \"storage\" => {\r\n                    let access = if lexer.skip(Token::Separator(',')) {\r\n                        lexer.next_storage_access()?\r\n                    } else {\r\n                        // defaulting to `read`\r\n                        crate::StorageAccess::LOAD\r\n                    };\r\n                    crate::AddressSpace::Storage { access }\r\n                }\r\n                _ => conv::map_address_space(class_str, span)?,\r\n            });\r\n            lexer.expect(Token::Paren('>'))?;\r\n        }\r\n        let name = lexer.next_ident()?;\r\n        lexer.expect(Token::Separator(':'))?;\r\n        let ty = self.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n\r\n        let init = if lexer.skip(Token::Operation('=')) {\r\n            let handle = self.parse_const_expression(lexer, type_arena, const_arena)?;\r\n            Some(handle)\r\n        } else {\r\n            None\r\n        };\r\n        lexer.expect(Token::Separator(';'))?;\r\n        let name_span = self.pop_rule_span(lexer);\r\n        Ok(ParsedVariable {\r\n            name,\r\n            name_span,\r\n            space,\r\n            ty,\r\n            init,\r\n        })\r\n    }\r\n\r\n    fn parse_struct_body<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<(Vec<crate::StructMember>, u32), Error<'a>> {\r\n        let mut offset = 0;\r\n        let mut struct_alignment = Alignment::ONE;\r\n        let mut members = Vec::new();\r\n\r\n        lexer.expect(Token::Paren('{'))?;\r\n        let mut ready = true;\r\n        while !lexer.skip(Token::Paren('}')) {\r\n            if !ready {\r\n                return Err(Error::Unexpected(\r\n                    lexer.next().1,\r\n                    ExpectedToken::Token(Token::Separator(',')),\r\n                ));\r\n            }\r\n            let (mut size_attr, mut align_attr) = (None, None);\r\n            self.push_rule_span(Rule::Attribute, lexer);\r\n            let mut bind_parser = BindingParser::default();\r\n            while lexer.skip(Token::Attribute) {\r\n                match lexer.next_ident_with_span()? {\r\n                    (\"size\", _) => {\r\n                        lexer.expect(Token::Paren('('))?;\r\n                        let (value, span) =\r\n                            lexer.capture_span(Self::parse_non_negative_i32_literal)?;\r\n                        lexer.expect(Token::Paren(')'))?;\r\n                        size_attr = Some((value, span));\r\n                    }\r\n                    (\"align\", _) => {\r\n                        lexer.expect(Token::Paren('('))?;\r\n                        let (value, span) =\r\n                            lexer.capture_span(Self::parse_non_negative_i32_literal)?;\r\n                        lexer.expect(Token::Paren(')'))?;\r\n                        align_attr = Some((value, span));\r\n                    }\r\n                    (word, word_span) => bind_parser.parse(lexer, word, word_span)?,\r\n                }\r\n            }\r\n\r\n            let bind_span = self.pop_rule_span(lexer);\r\n            let mut binding = bind_parser.finish(bind_span)?;\r\n\r\n            let (name, span) = match lexer.next() {\r\n                (Token::Word(word), span) => (word, span),\r\n                other => return Err(Error::Unexpected(other.1, ExpectedToken::FieldName)),\r\n            };\r\n            if crate::keywords::wgsl::RESERVED.contains(&name) {\r\n                return Err(Error::ReservedKeyword(span));\r\n            }\r\n            lexer.expect(Token::Separator(':'))?;\r\n            let ty = self.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n            ready = lexer.skip(Token::Separator(','));\r\n\r\n            self.layouter.update(type_arena, const_arena).unwrap();\r\n\r\n            let member_min_size = self.layouter[ty].size;\r\n            let member_min_alignment = self.layouter[ty].alignment;\r\n\r\n            let member_size = if let Some((size, span)) = size_attr {\r\n                if size < member_min_size {\r\n                    return Err(Error::SizeAttributeTooLow(span, member_min_size));\r\n                } else {\r\n                    size\r\n                }\r\n            } else {\r\n                member_min_size\r\n            };\r\n\r\n            let member_alignment = if let Some((align, span)) = align_attr {\r\n                if let Some(alignment) = Alignment::new(align) {\r\n                    if alignment < member_min_alignment {\r\n                        return Err(Error::AlignAttributeTooLow(span, member_min_alignment));\r\n                    } else {\r\n                        alignment\r\n                    }\r\n                } else {\r\n                    return Err(Error::NonPowerOfTwoAlignAttribute(span));\r\n                }\r\n            } else {\r\n                member_min_alignment\r\n            };\r\n\r\n            offset = member_alignment.round_up(offset);\r\n            struct_alignment = struct_alignment.max(member_alignment);\r\n\r\n            if let Some(ref mut binding) = binding {\r\n                binding.apply_default_interpolation(&type_arena[ty].inner);\r\n            }\r\n\r\n            members.push(crate::StructMember {\r\n                name: Some(name.to_owned()),\r\n                ty,\r\n                binding,\r\n                offset,\r\n            });\r\n\r\n            offset += member_size;\r\n        }\r\n\r\n        let struct_size = struct_alignment.round_up(offset);\r\n        Ok((members, struct_size))\r\n    }\r\n\r\n    fn parse_matrix_scalar_type<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        columns: crate::VectorSize,\r\n        rows: crate::VectorSize,\r\n    ) -> Result<crate::TypeInner, Error<'a>> {\r\n        let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n        match kind {\r\n            crate::ScalarKind::Float => Ok(crate::TypeInner::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            }),\r\n            _ => Err(Error::BadMatrixScalarKind(span, kind, width)),\r\n        }\r\n    }\r\n\r\n    fn parse_type_decl_impl<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        _attribute: TypeAttributes,\r\n        word: &'a str,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<Option<crate::TypeInner>, Error<'a>> {\r\n        if let Some((kind, width)) = conv::get_scalar_type(word) {\r\n            return Ok(Some(crate::TypeInner::Scalar { kind, width }));\r\n        }\r\n\r\n        Ok(Some(match word {\r\n            \"vec2\" => {\r\n                let (kind, width) = lexer.next_scalar_generic()?;\r\n                crate::TypeInner::Vector {\r\n                    size: crate::VectorSize::Bi,\r\n                    kind,\r\n                    width,\r\n                }\r\n            }\r\n            \"vec3\" => {\r\n                let (kind, width) = lexer.next_scalar_generic()?;\r\n                crate::TypeInner::Vector {\r\n                    size: crate::VectorSize::Tri,\r\n                    kind,\r\n                    width,\r\n                }\r\n            }\r\n            \"vec4\" => {\r\n                let (kind, width) = lexer.next_scalar_generic()?;\r\n                crate::TypeInner::Vector {\r\n                    size: crate::VectorSize::Quad,\r\n                    kind,\r\n                    width,\r\n                }\r\n            }\r\n            \"mat2x2\" => {\r\n                self.parse_matrix_scalar_type(lexer, crate::VectorSize::Bi, crate::VectorSize::Bi)?\r\n            }\r\n            \"mat2x3\" => {\r\n                self.parse_matrix_scalar_type(lexer, crate::VectorSize::Bi, crate::VectorSize::Tri)?\r\n            }\r\n            \"mat2x4\" => self.parse_matrix_scalar_type(\r\n                lexer,\r\n                crate::VectorSize::Bi,\r\n                crate::VectorSize::Quad,\r\n            )?,\r\n            \"mat3x2\" => {\r\n                self.parse_matrix_scalar_type(lexer, crate::VectorSize::Tri, crate::VectorSize::Bi)?\r\n            }\r\n            \"mat3x3\" => self.parse_matrix_scalar_type(\r\n                lexer,\r\n                crate::VectorSize::Tri,\r\n                crate::VectorSize::Tri,\r\n            )?,\r\n            \"mat3x4\" => self.parse_matrix_scalar_type(\r\n                lexer,\r\n                crate::VectorSize::Tri,\r\n                crate::VectorSize::Quad,\r\n            )?,\r\n            \"mat4x2\" => self.parse_matrix_scalar_type(\r\n                lexer,\r\n                crate::VectorSize::Quad,\r\n                crate::VectorSize::Bi,\r\n            )?,\r\n            \"mat4x3\" => self.parse_matrix_scalar_type(\r\n                lexer,\r\n                crate::VectorSize::Quad,\r\n                crate::VectorSize::Tri,\r\n            )?,\r\n            \"mat4x4\" => self.parse_matrix_scalar_type(\r\n                lexer,\r\n                crate::VectorSize::Quad,\r\n                crate::VectorSize::Quad,\r\n            )?,\r\n            \"atomic\" => {\r\n                let (kind, width) = lexer.next_scalar_generic()?;\r\n                crate::TypeInner::Atomic { kind, width }\r\n            }\r\n            \"ptr\" => {\r\n                lexer.expect_generic_paren('<')?;\r\n                let (ident, span) = lexer.next_ident_with_span()?;\r\n                let mut space = conv::map_address_space(ident, span)?;\r\n                lexer.expect(Token::Separator(','))?;\r\n                let base = self.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n                if let crate::AddressSpace::Storage { ref mut access } = space {\r\n                    *access = if lexer.skip(Token::Separator(',')) {\r\n                        lexer.next_storage_access()?\r\n                    } else {\r\n                        crate::StorageAccess::LOAD\r\n                    };\r\n                }\r\n                lexer.expect_generic_paren('>')?;\r\n                crate::TypeInner::Pointer { base, space }\r\n            }\r\n            \"array\" => {\r\n                lexer.expect_generic_paren('<')?;\r\n                let base = self.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n                let size = if lexer.skip(Token::Separator(',')) {\r\n                    let const_handle =\r\n                        self.parse_const_expression(lexer, type_arena, const_arena)?;\r\n                    crate::ArraySize::Constant(const_handle)\r\n                } else {\r\n                    crate::ArraySize::Dynamic\r\n                };\r\n                lexer.expect_generic_paren('>')?;\r\n\r\n                let stride = {\r\n                    self.layouter.update(type_arena, const_arena).unwrap();\r\n                    self.layouter[base].to_stride()\r\n                };\r\n                crate::TypeInner::Array { base, size, stride }\r\n            }\r\n            \"binding_array\" => {\r\n                lexer.expect_generic_paren('<')?;\r\n                let base = self.parse_type_decl(lexer, None, type_arena, const_arena)?;\r\n                let size = if lexer.skip(Token::Separator(',')) {\r\n                    let const_handle =\r\n                        self.parse_const_expression(lexer, type_arena, const_arena)?;\r\n                    crate::ArraySize::Constant(const_handle)\r\n                } else {\r\n                    crate::ArraySize::Dynamic\r\n                };\r\n                lexer.expect_generic_paren('>')?;\r\n\r\n                crate::TypeInner::BindingArray { base, size }\r\n            }\r\n            \"sampler\" => crate::TypeInner::Sampler { comparison: false },\r\n            \"sampler_comparison\" => crate::TypeInner::Sampler { comparison: true },\r\n            \"texture_1d\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D1,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_1d_array\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D1,\r\n                    arrayed: true,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_2d\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D2,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_2d_array\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D2,\r\n                    arrayed: true,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_3d\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D3,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_cube\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::Cube,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_cube_array\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::Cube,\r\n                    arrayed: true,\r\n                    class: crate::ImageClass::Sampled { kind, multi: false },\r\n                }\r\n            }\r\n            \"texture_multisampled_2d\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D2,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Sampled { kind, multi: true },\r\n                }\r\n            }\r\n            \"texture_multisampled_2d_array\" => {\r\n                let (kind, width, span) = lexer.next_scalar_generic_with_span()?;\r\n                Self::check_texture_sample_type(kind, width, span)?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D2,\r\n                    arrayed: true,\r\n                    class: crate::ImageClass::Sampled { kind, multi: true },\r\n                }\r\n            }\r\n            \"texture_depth_2d\" => crate::TypeInner::Image {\r\n                dim: crate::ImageDimension::D2,\r\n                arrayed: false,\r\n                class: crate::ImageClass::Depth { multi: false },\r\n            },\r\n            \"texture_depth_2d_array\" => crate::TypeInner::Image {\r\n                dim: crate::ImageDimension::D2,\r\n                arrayed: true,\r\n                class: crate::ImageClass::Depth { multi: false },\r\n            },\r\n            \"texture_depth_cube\" => crate::TypeInner::Image {\r\n                dim: crate::ImageDimension::Cube,\r\n                arrayed: false,\r\n                class: crate::ImageClass::Depth { multi: false },\r\n            },\r\n            \"texture_depth_cube_array\" => crate::TypeInner::Image {\r\n                dim: crate::ImageDimension::Cube,\r\n                arrayed: true,\r\n                class: crate::ImageClass::Depth { multi: false },\r\n            },\r\n            \"texture_depth_multisampled_2d\" => crate::TypeInner::Image {\r\n                dim: crate::ImageDimension::D2,\r\n                arrayed: false,\r\n                class: crate::ImageClass::Depth { multi: true },\r\n            },\r\n            \"texture_storage_1d\" => {\r\n                let (format, access) = lexer.next_format_generic()?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D1,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Storage { format, access },\r\n                }\r\n            }\r\n            \"texture_storage_1d_array\" => {\r\n                let (format, access) = lexer.next_format_generic()?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D1,\r\n                    arrayed: true,\r\n                    class: crate::ImageClass::Storage { format, access },\r\n                }\r\n            }\r\n            \"texture_storage_2d\" => {\r\n                let (format, access) = lexer.next_format_generic()?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D2,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Storage { format, access },\r\n                }\r\n            }\r\n            \"texture_storage_2d_array\" => {\r\n                let (format, access) = lexer.next_format_generic()?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D2,\r\n                    arrayed: true,\r\n                    class: crate::ImageClass::Storage { format, access },\r\n                }\r\n            }\r\n            \"texture_storage_3d\" => {\r\n                let (format, access) = lexer.next_format_generic()?;\r\n                crate::TypeInner::Image {\r\n                    dim: crate::ImageDimension::D3,\r\n                    arrayed: false,\r\n                    class: crate::ImageClass::Storage { format, access },\r\n                }\r\n            }\r\n            _ => return Ok(None),\r\n        }))\r\n    }\r\n\r\n    const fn check_texture_sample_type(\r\n        kind: crate::ScalarKind,\r\n        width: u8,\r\n        span: Span,\r\n    ) -> Result<(), Error<'static>> {\r\n        use crate::ScalarKind::*;\r\n        // Validate according to https://gpuweb.github.io/gpuweb/wgsl/#sampled-texture-type\r\n        match (kind, width) {\r\n            (Float | Sint | Uint, 4) => Ok(()),\r\n            _ => Err(Error::BadTextureSampleType { span, kind, width }),\r\n        }\r\n    }\r\n\r\n    /// Parse type declaration of a given name and attribute.\r\n    #[allow(clippy::too_many_arguments)]\r\n    fn parse_type_decl_name<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        name: &'a str,\r\n        name_span: Span,\r\n        debug_name: Option<&'a str>,\r\n        attribute: TypeAttributes,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<Handle<crate::Type>, Error<'a>> {\r\n        Ok(match self.lookup_type.get(name) {\r\n            Some(&handle) => handle,\r\n            None => {\r\n                match self.parse_type_decl_impl(lexer, attribute, name, type_arena, const_arena)? {\r\n                    Some(inner) => {\r\n                        let span = name_span.start..lexer.end_byte_offset();\r\n                        type_arena.insert(\r\n                            crate::Type {\r\n                                name: debug_name.map(|s| s.to_string()),\r\n                                inner,\r\n                            },\r\n                            NagaSpan::from(span),\r\n                        )\r\n                    }\r\n                    None => return Err(Error::UnknownType(name_span)),\r\n                }\r\n            }\r\n        })\r\n    }\r\n\r\n    fn parse_type_decl<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        debug_name: Option<&'a str>,\r\n        type_arena: &mut UniqueArena<crate::Type>,\r\n        const_arena: &mut Arena<crate::Constant>,\r\n    ) -> Result<Handle<crate::Type>, Error<'a>> {\r\n        self.push_rule_span(Rule::TypeDecl, lexer);\r\n        let attribute = TypeAttributes::default();\r\n\r\n        if lexer.skip(Token::Attribute) {\r\n            let other = lexer.next();\r\n            return Err(Error::Unexpected(other.1, ExpectedToken::TypeAttribute));\r\n        }\r\n\r\n        let (name, name_span) = lexer.next_ident_with_span()?;\r\n        let handle = self.parse_type_decl_name(\r\n            lexer,\r\n            name,\r\n            name_span,\r\n            debug_name,\r\n            attribute,\r\n            type_arena,\r\n            const_arena,\r\n        )?;\r\n        self.pop_rule_span(lexer);\r\n        // Only set span if it's the first occurrence of the type.\r\n        // Type spans therefore should only be used for errors in type declarations;\r\n        // use variable spans/expression spans/etc. otherwise\r\n        Ok(handle)\r\n    }\r\n\r\n    /// Parse an assignment statement (will also parse increment and decrement statements)\r\n    fn parse_assignment_statement<'a, 'out>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: StatementContext<'a, '_, 'out>,\r\n        block: &mut crate::Block,\r\n        emitter: &mut super::Emitter,\r\n    ) -> Result<(), Error<'a>> {\r\n        use crate::BinaryOperator as Bo;\r\n\r\n        let span_start = lexer.start_byte_offset();\r\n        emitter.start(context.expressions);\r\n        let (reference, lhs_span) = self\r\n            .parse_general_expression_for_reference(lexer, context.as_expression(block, emitter))?;\r\n        let op = lexer.next();\r\n        // The left hand side of an assignment must be a reference.\r\n        if !matches!(\r\n            op.0,\r\n            Token::Operation('=')\r\n                | Token::AssignmentOperation(_)\r\n                | Token::IncrementOperation\r\n                | Token::DecrementOperation\r\n        ) {\r\n            return Err(Error::Unexpected(lhs_span, ExpectedToken::Assignment));\r\n        } else if !reference.is_reference {\r\n            let ty = if context.named_expressions.contains_key(&reference.handle) {\r\n                InvalidAssignmentType::ImmutableBinding\r\n            } else {\r\n                match *context.expressions.get_mut(reference.handle) {\r\n                    crate::Expression::Swizzle { .. } => InvalidAssignmentType::Swizzle,\r\n                    _ => InvalidAssignmentType::Other,\r\n                }\r\n            };\r\n\r\n            return Err(Error::InvalidAssignment { span: lhs_span, ty });\r\n        }\r\n\r\n        let mut context = context.as_expression(block, emitter);\r\n\r\n        let value = match op {\r\n            (Token::Operation('='), _) => {\r\n                self.parse_general_expression(lexer, context.reborrow())?\r\n            }\r\n            (Token::AssignmentOperation(c), span) => {\r\n                let op = match c {\r\n                    '<' => Bo::ShiftLeft,\r\n                    '>' => Bo::ShiftRight,\r\n                    '+' => Bo::Add,\r\n                    '-' => Bo::Subtract,\r\n                    '*' => Bo::Multiply,\r\n                    '/' => Bo::Divide,\r\n                    '%' => Bo::Modulo,\r\n                    '&' => Bo::And,\r\n                    '|' => Bo::InclusiveOr,\r\n                    '^' => Bo::ExclusiveOr,\r\n                    //Note: `consume_token` shouldn't produce any other assignment ops\r\n                    _ => unreachable!(),\r\n                };\r\n                let mut left = context.expressions.append(\r\n                    crate::Expression::Load {\r\n                        pointer: reference.handle,\r\n                    },\r\n                    lhs_span.into(),\r\n                );\r\n                let mut right = self.parse_general_expression(lexer, context.reborrow())?;\r\n\r\n                context.binary_op_splat(op, &mut left, &mut right)?;\r\n\r\n                context\r\n                    .expressions\r\n                    .append(crate::Expression::Binary { op, left, right }, span.into())\r\n            }\r\n            token @ (Token::IncrementOperation | Token::DecrementOperation, _) => {\r\n                let op = match token.0 {\r\n                    Token::IncrementOperation => Bo::Add,\r\n                    Token::DecrementOperation => Bo::Subtract,\r\n                    _ => unreachable!(),\r\n                };\r\n                let op_span = token.1;\r\n\r\n                // prepare the typifier, but work around mutable borrowing...\r\n                let _ = context.resolve_type(reference.handle)?;\r\n\r\n                let ty = context.typifier.get(reference.handle, context.types);\r\n                let (kind, width) = match *ty {\r\n                    crate::TypeInner::ValuePointer {\r\n                        size: None,\r\n                        kind,\r\n                        width,\r\n                        ..\r\n                    } => (kind, width),\r\n                    crate::TypeInner::Pointer { base, .. } => match context.types[base].inner {\r\n                        crate::TypeInner::Scalar { kind, width } => (kind, width),\r\n                        _ => return Err(Error::BadIncrDecrReferenceType(lhs_span)),\r\n                    },\r\n                    _ => return Err(Error::BadIncrDecrReferenceType(lhs_span)),\r\n                };\r\n                let constant_inner = crate::ConstantInner::Scalar {\r\n                    width,\r\n                    value: match kind {\r\n                        crate::ScalarKind::Sint => crate::ScalarValue::Sint(1),\r\n                        crate::ScalarKind::Uint => crate::ScalarValue::Uint(1),\r\n                        _ => return Err(Error::BadIncrDecrReferenceType(lhs_span)),\r\n                    },\r\n                };\r\n                let constant = context.constants.append(\r\n                    crate::Constant {\r\n                        name: None,\r\n                        specialization: None,\r\n                        inner: constant_inner,\r\n                    },\r\n                    crate::Span::default(),\r\n                );\r\n\r\n                let left = context.expressions.append(\r\n                    crate::Expression::Load {\r\n                        pointer: reference.handle,\r\n                    },\r\n                    lhs_span.into(),\r\n                );\r\n                let right = context.interrupt_emitter(\r\n                    crate::Expression::Constant(constant),\r\n                    crate::Span::default(),\r\n                );\r\n                context.expressions.append(\r\n                    crate::Expression::Binary { op, left, right },\r\n                    op_span.into(),\r\n                )\r\n            }\r\n            other => return Err(Error::Unexpected(other.1, ExpectedToken::SwitchItem)),\r\n        };\r\n\r\n        let span_end = lexer.end_byte_offset();\r\n        context\r\n            .block\r\n            .extend(context.emitter.finish(context.expressions));\r\n        context.block.push(\r\n            crate::Statement::Store {\r\n                pointer: reference.handle,\r\n                value,\r\n            },\r\n            NagaSpan::from(span_start..span_end),\r\n        );\r\n        Ok(())\r\n    }\r\n\r\n    /// Parse a function call statement.\r\n    fn parse_function_statement<'a, 'out>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        ident: &'a str,\r\n        mut context: ExpressionContext<'a, '_, 'out>,\r\n    ) -> Result<(), Error<'a>> {\r\n        self.push_rule_span(Rule::SingularExpr, lexer);\r\n        context.emitter.start(context.expressions);\r\n        if self\r\n            .parse_function_call_inner(lexer, ident, context.reborrow())?\r\n            .is_none()\r\n        {\r\n            let span = lexer.next().1;\r\n            return Err(Error::UnknownLocalFunction(span));\r\n        }\r\n        context\r\n            .block\r\n            .extend(context.emitter.finish(context.expressions));\r\n        self.pop_rule_span(lexer);\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_switch_case_body<'a, 'out>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: StatementContext<'a, '_, 'out>,\r\n    ) -> Result<(bool, crate::Block), Error<'a>> {\r\n        let mut body = crate::Block::new();\r\n        // Push a new lexical scope for the switch case body\r\n        context.symbol_table.push_scope();\r\n\r\n        lexer.expect(Token::Paren('{'))?;\r\n        let fall_through = loop {\r\n            // default statements\r\n            if lexer.skip(Token::Word(\"fallthrough\")) {\r\n                lexer.expect(Token::Separator(';'))?;\r\n                lexer.expect(Token::Paren('}'))?;\r\n                break true;\r\n            }\r\n            if lexer.skip(Token::Paren('}')) {\r\n                break false;\r\n            }\r\n            self.parse_statement(lexer, context.reborrow(), &mut body, false)?;\r\n        };\r\n        // Pop the switch case body lexical scope\r\n        context.symbol_table.pop_scope();\r\n\r\n        Ok((fall_through, body))\r\n    }\r\n\r\n    fn parse_statement<'a, 'out>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: StatementContext<'a, '_, 'out>,\r\n        block: &'out mut crate::Block,\r\n        is_uniform_control_flow: bool,\r\n    ) -> Result<(), Error<'a>> {\r\n        self.push_rule_span(Rule::Statement, lexer);\r\n        match lexer.peek() {\r\n            (Token::Separator(';'), _) => {\r\n                let _ = lexer.next();\r\n                self.pop_rule_span(lexer);\r\n                return Ok(());\r\n            }\r\n            (Token::Paren('{'), _) => {\r\n                self.push_rule_span(Rule::Block, lexer);\r\n                // Push a new lexical scope for the block statement\r\n                context.symbol_table.push_scope();\r\n\r\n                let _ = lexer.next();\r\n                let mut statements = crate::Block::new();\r\n                while !lexer.skip(Token::Paren('}')) {\r\n                    self.parse_statement(\r\n                        lexer,\r\n                        context.reborrow(),\r\n                        &mut statements,\r\n                        is_uniform_control_flow,\r\n                    )?;\r\n                }\r\n                // Pop the block statement lexical scope\r\n                context.symbol_table.pop_scope();\r\n\r\n                self.pop_rule_span(lexer);\r\n                let span = NagaSpan::from(self.pop_rule_span(lexer));\r\n                block.push(crate::Statement::Block(statements), span);\r\n                return Ok(());\r\n            }\r\n            (Token::Word(word), _) => {\r\n                let mut emitter = super::Emitter::default();\r\n                let statement = match word {\r\n                    \"_\" => {\r\n                        let _ = lexer.next();\r\n                        emitter.start(context.expressions);\r\n                        lexer.expect(Token::Operation('='))?;\r\n                        self.parse_general_expression(\r\n                            lexer,\r\n                            context.as_expression(block, &mut emitter),\r\n                        )?;\r\n                        lexer.expect(Token::Separator(';'))?;\r\n                        block.extend(emitter.finish(context.expressions));\r\n                        None\r\n                    }\r\n                    \"let\" => {\r\n                        let _ = lexer.next();\r\n                        emitter.start(context.expressions);\r\n                        let (name, name_span) = lexer.next_ident_with_span()?;\r\n                        if crate::keywords::wgsl::RESERVED.contains(&name) {\r\n                            return Err(Error::ReservedKeyword(name_span));\r\n                        }\r\n                        let given_ty = if lexer.skip(Token::Separator(':')) {\r\n                            let ty = self.parse_type_decl(\r\n                                lexer,\r\n                                None,\r\n                                context.types,\r\n                                context.constants,\r\n                            )?;\r\n                            Some(ty)\r\n                        } else {\r\n                            None\r\n                        };\r\n                        lexer.expect(Token::Operation('='))?;\r\n                        let expr_id = self.parse_general_expression(\r\n                            lexer,\r\n                            context.as_expression(block, &mut emitter),\r\n                        )?;\r\n                        lexer.expect(Token::Separator(';'))?;\r\n                        if let Some(ty) = given_ty {\r\n                            // prepare the typifier, but work around mutable borrowing...\r\n                            let _ = context\r\n                                .as_expression(block, &mut emitter)\r\n                                .resolve_type(expr_id)?;\r\n                            let expr_inner = context.typifier.get(expr_id, context.types);\r\n                            let given_inner = &context.types[ty].inner;\r\n                            if !given_inner.equivalent(expr_inner, context.types) {\r\n                                log::error!(\r\n                                    \"Given type {:?} doesn't match expected {:?}\",\r\n                                    given_inner,\r\n                                    expr_inner\r\n                                );\r\n                                return Err(Error::InitializationTypeMismatch(\r\n                                    name_span,\r\n                                    expr_inner.to_wgsl(context.types, context.constants),\r\n                                ));\r\n                            }\r\n                        }\r\n                        block.extend(emitter.finish(context.expressions));\r\n                        context.symbol_table.add(\r\n                            name,\r\n                            TypedExpression {\r\n                                handle: expr_id,\r\n                                is_reference: false,\r\n                            },\r\n                        );\r\n                        context\r\n                            .named_expressions\r\n                            .insert(expr_id, String::from(name));\r\n                        None\r\n                    }\r\n                    \"var\" => {\r\n                        let _ = lexer.next();\r\n                        enum Init {\r\n                            Empty,\r\n                            Constant(Handle<crate::Constant>),\r\n                            Variable(Handle<crate::Expression>),\r\n                        }\r\n\r\n                        let (name, name_span) = lexer.next_ident_with_span()?;\r\n                        if crate::keywords::wgsl::RESERVED.contains(&name) {\r\n                            return Err(Error::ReservedKeyword(name_span));\r\n                        }\r\n                        let given_ty = if lexer.skip(Token::Separator(':')) {\r\n                            let ty = self.parse_type_decl(\r\n                                lexer,\r\n                                None,\r\n                                context.types,\r\n                                context.constants,\r\n                            )?;\r\n                            Some(ty)\r\n                        } else {\r\n                            None\r\n                        };\r\n\r\n                        let (init, ty) = if lexer.skip(Token::Operation('=')) {\r\n                            emitter.start(context.expressions);\r\n                            let value = self.parse_general_expression(\r\n                                lexer,\r\n                                context.as_expression(block, &mut emitter),\r\n                            )?;\r\n                            block.extend(emitter.finish(context.expressions));\r\n\r\n                            // prepare the typifier, but work around mutable borrowing...\r\n                            let _ = context\r\n                                .as_expression(block, &mut emitter)\r\n                                .resolve_type(value)?;\r\n\r\n                            //TODO: share more of this code with `let` arm\r\n                            let ty = match given_ty {\r\n                                Some(ty) => {\r\n                                    let expr_inner = context.typifier.get(value, context.types);\r\n                                    let given_inner = &context.types[ty].inner;\r\n                                    if !given_inner.equivalent(expr_inner, context.types) {\r\n                                        log::error!(\r\n                                            \"Given type {:?} doesn't match expected {:?}\",\r\n                                            given_inner,\r\n                                            expr_inner\r\n                                        );\r\n                                        return Err(Error::InitializationTypeMismatch(\r\n                                            name_span,\r\n                                            expr_inner.to_wgsl(context.types, context.constants),\r\n                                        ));\r\n                                    }\r\n                                    ty\r\n                                }\r\n                                None => {\r\n                                    // register the type, if needed\r\n                                    match context.typifier[value].clone() {\r\n                                        TypeResolution::Handle(ty) => ty,\r\n                                        TypeResolution::Value(inner) => context.types.insert(\r\n                                            crate::Type { name: None, inner },\r\n                                            Default::default(),\r\n                                        ),\r\n                                    }\r\n                                }\r\n                            };\r\n\r\n                            let init = match context.expressions[value] {\r\n                                crate::Expression::Constant(handle) if is_uniform_control_flow => {\r\n                                    Init::Constant(handle)\r\n                                }\r\n                                _ => Init::Variable(value),\r\n                            };\r\n                            (init, ty)\r\n                        } else {\r\n                            match given_ty {\r\n                                Some(ty) => (Init::Empty, ty),\r\n                                None => {\r\n                                    log::error!(\r\n                                        \"Variable '{}' without an initializer needs a type\",\r\n                                        name\r\n                                    );\r\n                                    return Err(Error::MissingType(name_span));\r\n                                }\r\n                            }\r\n                        };\r\n\r\n                        lexer.expect(Token::Separator(';'))?;\r\n                        let var_id = context.variables.append(\r\n                            crate::LocalVariable {\r\n                                name: Some(name.to_owned()),\r\n                                ty,\r\n                                init: match init {\r\n                                    Init::Constant(value) => Some(value),\r\n                                    _ => None,\r\n                                },\r\n                            },\r\n                            NagaSpan::from(name_span),\r\n                        );\r\n\r\n                        // Doesn't make sense to assign a span to cached lookup\r\n                        let expr_id = context\r\n                            .expressions\r\n                            .append(crate::Expression::LocalVariable(var_id), Default::default());\r\n                        context.symbol_table.add(\r\n                            name,\r\n                            TypedExpression {\r\n                                handle: expr_id,\r\n                                is_reference: true,\r\n                            },\r\n                        );\r\n\r\n                        if let Init::Variable(value) = init {\r\n                            Some(crate::Statement::Store {\r\n                                pointer: expr_id,\r\n                                value,\r\n                            })\r\n                        } else {\r\n                            None\r\n                        }\r\n                    }\r\n                    \"return\" => {\r\n                        let _ = lexer.next();\r\n                        let value = if lexer.peek().0 != Token::Separator(';') {\r\n                            emitter.start(context.expressions);\r\n                            let handle = self.parse_general_expression(\r\n                                lexer,\r\n                                context.as_expression(block, &mut emitter),\r\n                            )?;\r\n                            block.extend(emitter.finish(context.expressions));\r\n                            Some(handle)\r\n                        } else {\r\n                            None\r\n                        };\r\n                        lexer.expect(Token::Separator(';'))?;\r\n                        Some(crate::Statement::Return { value })\r\n                    }\r\n                    \"if\" => {\r\n                        let _ = lexer.next();\r\n                        emitter.start(context.expressions);\r\n                        let condition = self.parse_general_expression(\r\n                            lexer,\r\n                            context.as_expression(block, &mut emitter),\r\n                        )?;\r\n                        block.extend(emitter.finish(context.expressions));\r\n\r\n                        let accept = self.parse_block(lexer, context.reborrow(), false)?;\r\n\r\n                        let mut elsif_stack = Vec::new();\r\n                        let mut elseif_span_start = lexer.start_byte_offset();\r\n                        let mut reject = loop {\r\n                            if !lexer.skip(Token::Word(\"else\")) {\r\n                                break crate::Block::new();\r\n                            }\r\n\r\n                            if !lexer.skip(Token::Word(\"if\")) {\r\n                                // ... else { ... }\r\n                                break self.parse_block(lexer, context.reborrow(), false)?;\r\n                            }\r\n\r\n                            // ... else if (...) { ... }\r\n                            let mut sub_emitter = super::Emitter::default();\r\n\r\n                            sub_emitter.start(context.expressions);\r\n                            let other_condition = self.parse_general_expression(\r\n                                lexer,\r\n                                context.as_expression(block, &mut sub_emitter),\r\n                            )?;\r\n                            let other_emit = sub_emitter.finish(context.expressions);\r\n                            let other_block = self.parse_block(lexer, context.reborrow(), false)?;\r\n                            elsif_stack.push((\r\n                                elseif_span_start,\r\n                                other_condition,\r\n                                other_emit,\r\n                                other_block,\r\n                            ));\r\n                            elseif_span_start = lexer.start_byte_offset();\r\n                        };\r\n\r\n                        let span_end = lexer.end_byte_offset();\r\n                        // reverse-fold the else-if blocks\r\n                        //Note: we may consider uplifting this to the IR\r\n                        for (other_span_start, other_cond, other_emit, other_block) in\r\n                            elsif_stack.into_iter().rev()\r\n                        {\r\n                            let sub_stmt = crate::Statement::If {\r\n                                condition: other_cond,\r\n                                accept: other_block,\r\n                                reject,\r\n                            };\r\n                            reject = crate::Block::new();\r\n                            reject.extend(other_emit);\r\n                            reject.push(sub_stmt, NagaSpan::from(other_span_start..span_end))\r\n                        }\r\n\r\n                        Some(crate::Statement::If {\r\n                            condition,\r\n                            accept,\r\n                            reject,\r\n                        })\r\n                    }\r\n                    \"switch\" => {\r\n                        let _ = lexer.next();\r\n                        emitter.start(context.expressions);\r\n                        let selector = self.parse_general_expression(\r\n                            lexer,\r\n                            context.as_expression(block, &mut emitter),\r\n                        )?;\r\n                        let uint = Some(crate::ScalarKind::Uint)\r\n                            == context\r\n                                .as_expression(block, &mut emitter)\r\n                                .resolve_type(selector)?\r\n                                .scalar_kind();\r\n                        block.extend(emitter.finish(context.expressions));\r\n                        lexer.expect(Token::Paren('{'))?;\r\n                        let mut cases = Vec::new();\r\n\r\n                        loop {\r\n                            // cases + default\r\n                            match lexer.next() {\r\n                                (Token::Word(\"case\"), _) => {\r\n                                    // parse a list of values\r\n                                    let value = loop {\r\n                                        let value = Self::parse_switch_value(lexer, uint)?;\r\n                                        if lexer.skip(Token::Separator(',')) {\r\n                                            if lexer.skip(Token::Separator(':')) {\r\n                                                break value;\r\n                                            }\r\n                                        } else {\r\n                                            lexer.skip(Token::Separator(':'));\r\n                                            break value;\r\n                                        }\r\n                                        cases.push(crate::SwitchCase {\r\n                                            value: crate::SwitchValue::Integer(value),\r\n                                            body: crate::Block::new(),\r\n                                            fall_through: true,\r\n                                        });\r\n                                    };\r\n\r\n                                    let (fall_through, body) =\r\n                                        self.parse_switch_case_body(lexer, context.reborrow())?;\r\n\r\n                                    cases.push(crate::SwitchCase {\r\n                                        value: crate::SwitchValue::Integer(value),\r\n                                        body,\r\n                                        fall_through,\r\n                                    });\r\n                                }\r\n                                (Token::Word(\"default\"), _) => {\r\n                                    lexer.skip(Token::Separator(':'));\r\n                                    let (fall_through, body) =\r\n                                        self.parse_switch_case_body(lexer, context.reborrow())?;\r\n                                    cases.push(crate::SwitchCase {\r\n                                        value: crate::SwitchValue::Default,\r\n                                        body,\r\n                                        fall_through,\r\n                                    });\r\n                                }\r\n                                (Token::Paren('}'), _) => break,\r\n                                other => {\r\n                                    return Err(Error::Unexpected(\r\n                                        other.1,\r\n                                        ExpectedToken::SwitchItem,\r\n                                    ))\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        Some(crate::Statement::Switch { selector, cases })\r\n                    }\r\n                    \"loop\" => Some(self.parse_loop(lexer, context.reborrow(), &mut emitter)?),\r\n                    \"while\" => {\r\n                        let _ = lexer.next();\r\n                        let mut body = crate::Block::new();\r\n\r\n                        let (condition, span) = lexer.capture_span(|lexer| {\r\n                            emitter.start(context.expressions);\r\n                            let condition = self.parse_general_expression(\r\n                                lexer,\r\n                                context.as_expression(&mut body, &mut emitter),\r\n                            )?;\r\n                            lexer.expect(Token::Paren('{'))?;\r\n                            body.extend(emitter.finish(context.expressions));\r\n                            Ok(condition)\r\n                        })?;\r\n                        let mut reject = crate::Block::new();\r\n                        reject.push(crate::Statement::Break, NagaSpan::default());\r\n                        body.push(\r\n                            crate::Statement::If {\r\n                                condition,\r\n                                accept: crate::Block::new(),\r\n                                reject,\r\n                            },\r\n                            NagaSpan::from(span),\r\n                        );\r\n                        // Push a lexical scope for the while loop body\r\n                        context.symbol_table.push_scope();\r\n\r\n                        while !lexer.skip(Token::Paren('}')) {\r\n                            self.parse_statement(lexer, context.reborrow(), &mut body, false)?;\r\n                        }\r\n                        // Pop the while loop body lexical scope\r\n                        context.symbol_table.pop_scope();\r\n\r\n                        Some(crate::Statement::Loop {\r\n                            body,\r\n                            continuing: crate::Block::new(),\r\n                            break_if: None,\r\n                        })\r\n                    }\r\n                    \"for\" => {\r\n                        let _ = lexer.next();\r\n                        lexer.expect(Token::Paren('('))?;\r\n                        // Push a lexical scope for the for loop\r\n                        context.symbol_table.push_scope();\r\n\r\n                        if !lexer.skip(Token::Separator(';')) {\r\n                            let num_statements = block.len();\r\n                            let (_, span) = lexer.capture_span(|lexer| {\r\n                                self.parse_statement(\r\n                                    lexer,\r\n                                    context.reborrow(),\r\n                                    block,\r\n                                    is_uniform_control_flow,\r\n                                )\r\n                            })?;\r\n\r\n                            if block.len() != num_statements {\r\n                                match *block.last().unwrap() {\r\n                                    crate::Statement::Store { .. }\r\n                                    | crate::Statement::Call { .. } => {}\r\n                                    _ => return Err(Error::InvalidForInitializer(span)),\r\n                                }\r\n                            }\r\n                        };\r\n\r\n                        let mut body = crate::Block::new();\r\n                        if !lexer.skip(Token::Separator(';')) {\r\n                            let (condition, span) = lexer.capture_span(|lexer| {\r\n                                emitter.start(context.expressions);\r\n                                let condition = self.parse_general_expression(\r\n                                    lexer,\r\n                                    context.as_expression(&mut body, &mut emitter),\r\n                                )?;\r\n                                lexer.expect(Token::Separator(';'))?;\r\n                                body.extend(emitter.finish(context.expressions));\r\n                                Ok(condition)\r\n                            })?;\r\n                            let mut reject = crate::Block::new();\r\n                            reject.push(crate::Statement::Break, NagaSpan::default());\r\n                            body.push(\r\n                                crate::Statement::If {\r\n                                    condition,\r\n                                    accept: crate::Block::new(),\r\n                                    reject,\r\n                                },\r\n                                NagaSpan::from(span),\r\n                            );\r\n                        };\r\n\r\n                        let mut continuing = crate::Block::new();\r\n                        if !lexer.skip(Token::Paren(')')) {\r\n                            match lexer.peek().0 {\r\n                                Token::Word(ident)\r\n                                    if context.symbol_table.lookup(ident).is_none() =>\r\n                                {\r\n                                    self.parse_function_statement(\r\n                                        lexer,\r\n                                        ident,\r\n                                        context.as_expression(&mut continuing, &mut emitter),\r\n                                    )?\r\n                                }\r\n                                _ => self.parse_assignment_statement(\r\n                                    lexer,\r\n                                    context.reborrow(),\r\n                                    &mut continuing,\r\n                                    &mut emitter,\r\n                                )?,\r\n                            }\r\n                            lexer.expect(Token::Paren(')'))?;\r\n                        }\r\n                        lexer.expect(Token::Paren('{'))?;\r\n\r\n                        while !lexer.skip(Token::Paren('}')) {\r\n                            self.parse_statement(lexer, context.reborrow(), &mut body, false)?;\r\n                        }\r\n                        // Pop the for loop lexical scope\r\n                        context.symbol_table.pop_scope();\r\n\r\n                        Some(crate::Statement::Loop {\r\n                            body,\r\n                            continuing,\r\n                            break_if: None,\r\n                        })\r\n                    }\r\n                    \"break\" => {\r\n                        let (_, mut span) = lexer.next();\r\n                        // Check if the next token is an `if`, this indicates\r\n                        // that the user tried to type out a `break if` which\r\n                        // is illegal in this position.\r\n                        let (peeked_token, peeked_span) = lexer.peek();\r\n                        if let Token::Word(\"if\") = peeked_token {\r\n                            span.end = peeked_span.end;\r\n                            return Err(Error::InvalidBreakIf(span));\r\n                        }\r\n                        Some(crate::Statement::Break)\r\n                    }\r\n                    \"continue\" => {\r\n                        let _ = lexer.next();\r\n                        Some(crate::Statement::Continue)\r\n                    }\r\n                    \"discard\" => {\r\n                        let _ = lexer.next();\r\n                        Some(crate::Statement::Kill)\r\n                    }\r\n                    \"storageBarrier\" => {\r\n                        let _ = lexer.next();\r\n                        lexer.expect(Token::Paren('('))?;\r\n                        lexer.expect(Token::Paren(')'))?;\r\n                        Some(crate::Statement::Barrier(crate::Barrier::STORAGE))\r\n                    }\r\n                    \"workgroupBarrier\" => {\r\n                        let _ = lexer.next();\r\n                        lexer.expect(Token::Paren('('))?;\r\n                        lexer.expect(Token::Paren(')'))?;\r\n                        Some(crate::Statement::Barrier(crate::Barrier::WORK_GROUP))\r\n                    }\r\n                    \"atomicStore\" => {\r\n                        let _ = lexer.next();\r\n                        emitter.start(context.expressions);\r\n                        lexer.open_arguments()?;\r\n                        let mut expression_ctx = context.as_expression(block, &mut emitter);\r\n                        let pointer =\r\n                            self.parse_atomic_pointer(lexer, expression_ctx.reborrow())?;\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        let value = self.parse_general_expression(lexer, expression_ctx)?;\r\n                        lexer.close_arguments()?;\r\n                        block.extend(emitter.finish(context.expressions));\r\n                        Some(crate::Statement::Store { pointer, value })\r\n                    }\r\n                    \"textureStore\" => {\r\n                        let _ = lexer.next();\r\n                        emitter.start(context.expressions);\r\n                        lexer.open_arguments()?;\r\n                        let mut expr_context = context.as_expression(block, &mut emitter);\r\n                        let (image, image_span) = self\r\n                            .parse_general_expression_with_span(lexer, expr_context.reborrow())?;\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        let arrayed = match *expr_context.resolve_type(image)? {\r\n                            crate::TypeInner::Image { arrayed, .. } => arrayed,\r\n                            _ => return Err(Error::BadTexture(image_span)),\r\n                        };\r\n                        let coordinate = self.parse_general_expression(lexer, expr_context)?;\r\n                        let array_index = if arrayed {\r\n                            lexer.expect(Token::Separator(','))?;\r\n                            Some(self.parse_general_expression(\r\n                                lexer,\r\n                                context.as_expression(block, &mut emitter),\r\n                            )?)\r\n                        } else {\r\n                            None\r\n                        };\r\n                        lexer.expect(Token::Separator(','))?;\r\n                        let value = self.parse_general_expression(\r\n                            lexer,\r\n                            context.as_expression(block, &mut emitter),\r\n                        )?;\r\n                        lexer.close_arguments()?;\r\n                        block.extend(emitter.finish(context.expressions));\r\n                        Some(crate::Statement::ImageStore {\r\n                            image,\r\n                            coordinate,\r\n                            array_index,\r\n                            value,\r\n                        })\r\n                    }\r\n                    // assignment or a function call\r\n                    ident => {\r\n                        match context.symbol_table.lookup(ident) {\r\n                            Some(_) => self.parse_assignment_statement(\r\n                                lexer,\r\n                                context,\r\n                                block,\r\n                                &mut emitter,\r\n                            )?,\r\n                            None => self.parse_function_statement(\r\n                                lexer,\r\n                                ident,\r\n                                context.as_expression(block, &mut emitter),\r\n                            )?,\r\n                        }\r\n                        lexer.expect(Token::Separator(';'))?;\r\n                        None\r\n                    }\r\n                };\r\n                let span = NagaSpan::from(self.pop_rule_span(lexer));\r\n                if let Some(statement) = statement {\r\n                    block.push(statement, span);\r\n                }\r\n            }\r\n            _ => {\r\n                let mut emitter = super::Emitter::default();\r\n                self.parse_assignment_statement(lexer, context, block, &mut emitter)?;\r\n                self.pop_rule_span(lexer);\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    fn parse_loop<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: StatementContext<'a, '_, '_>,\r\n        emitter: &mut super::Emitter,\r\n    ) -> Result<crate::Statement, Error<'a>> {\r\n        let _ = lexer.next();\r\n        let mut body = crate::Block::new();\r\n        let mut continuing = crate::Block::new();\r\n        let mut break_if = None;\r\n\r\n        // Push a lexical scope for the loop body\r\n        context.symbol_table.push_scope();\r\n\r\n        lexer.expect(Token::Paren('{'))?;\r\n\r\n        loop {\r\n            if lexer.skip(Token::Word(\"continuing\")) {\r\n                // Branch for the `continuing` block, this must be\r\n                // the last thing in the loop body\r\n\r\n                // Expect a opening brace to start the continuing block\r\n                lexer.expect(Token::Paren('{'))?;\r\n                loop {\r\n                    if lexer.skip(Token::Word(\"break\")) {\r\n                        // Branch for the `break if` statement, this statement\r\n                        // has the form `break if <expr>;` and must be the last\r\n                        // statement in a continuing block\r\n\r\n                        // The break must be followed by an `if` to form\r\n                        // the break if\r\n                        lexer.expect(Token::Word(\"if\"))?;\r\n\r\n                        // Start the emitter to begin parsing an expression\r\n                        emitter.start(context.expressions);\r\n                        let condition = self.parse_general_expression(\r\n                            lexer,\r\n                            context.as_expression(&mut body, emitter),\r\n                        )?;\r\n                        // Add all emits to the continuing body\r\n                        continuing.extend(emitter.finish(context.expressions));\r\n                        // Set the condition of the break if to the newly parsed\r\n                        // expression\r\n                        break_if = Some(condition);\r\n\r\n                        // Expext a semicolon to close the statement\r\n                        lexer.expect(Token::Separator(';'))?;\r\n                        // Expect a closing brace to close the continuing block,\r\n                        // since the break if must be the last statement\r\n                        lexer.expect(Token::Paren('}'))?;\r\n                        // Stop parsing the continuing block\r\n                        break;\r\n                    } else if lexer.skip(Token::Paren('}')) {\r\n                        // If we encounter a closing brace it means we have reached\r\n                        // the end of the continuing block and should stop processing\r\n                        break;\r\n                    } else {\r\n                        // Otherwise try to parse a statement\r\n                        self.parse_statement(lexer, context.reborrow(), &mut continuing, false)?;\r\n                    }\r\n                }\r\n                // Since the continuing block must be the last part of the loop body,\r\n                // we expect to see a closing brace to end the loop body\r\n                lexer.expect(Token::Paren('}'))?;\r\n                break;\r\n            }\r\n            if lexer.skip(Token::Paren('}')) {\r\n                // If we encounter a closing brace it means we have reached\r\n                // the end of the loop body and should stop processing\r\n                break;\r\n            }\r\n            // Otherwise try to parse a statement\r\n            self.parse_statement(lexer, context.reborrow(), &mut body, false)?;\r\n        }\r\n\r\n        // Pop the loop body lexical scope\r\n        context.symbol_table.pop_scope();\r\n\r\n        Ok(crate::Statement::Loop {\r\n            body,\r\n            continuing,\r\n            break_if,\r\n        })\r\n    }\r\n\r\n    fn parse_block<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        mut context: StatementContext<'a, '_, '_>,\r\n        is_uniform_control_flow: bool,\r\n    ) -> Result<crate::Block, Error<'a>> {\r\n        self.push_rule_span(Rule::Block, lexer);\r\n        // Push a lexical scope for the block\r\n        context.symbol_table.push_scope();\r\n\r\n        lexer.expect(Token::Paren('{'))?;\r\n        let mut block = crate::Block::new();\r\n        while !lexer.skip(Token::Paren('}')) {\r\n            self.parse_statement(\r\n                lexer,\r\n                context.reborrow(),\r\n                &mut block,\r\n                is_uniform_control_flow,\r\n            )?;\r\n        }\r\n        //Pop the block lexical scope\r\n        context.symbol_table.pop_scope();\r\n\r\n        self.pop_rule_span(lexer);\r\n        Ok(block)\r\n    }\r\n\r\n    fn parse_varying_binding<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n    ) -> Result<Option<crate::Binding>, Error<'a>> {\r\n        let mut bind_parser = BindingParser::default();\r\n        self.push_rule_span(Rule::Attribute, lexer);\r\n\r\n        while lexer.skip(Token::Attribute) {\r\n            let (word, span) = lexer.next_ident_with_span()?;\r\n            bind_parser.parse(lexer, word, span)?;\r\n        }\r\n\r\n        let span = self.pop_rule_span(lexer);\r\n        bind_parser.finish(span)\r\n    }\r\n\r\n    fn parse_function_decl<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        module: &mut crate::Module,\r\n        lookup_global_expression: &FastHashMap<&'a str, crate::Expression>,\r\n    ) -> Result<(crate::Function, &'a str), Error<'a>> {\r\n        self.push_rule_span(Rule::FunctionDecl, lexer);\r\n        // read function name\r\n        let mut symbol_table = super::SymbolTable::default();\r\n        let (fun_name, span) = lexer.next_ident_with_span()?;\r\n        if crate::keywords::wgsl::RESERVED.contains(&fun_name) {\r\n            return Err(Error::ReservedKeyword(span));\r\n        }\r\n        if let Some(entry) = self\r\n            .module_scope_identifiers\r\n            .insert(String::from(fun_name), span.clone())\r\n        {\r\n            return Err(Error::Redefinition {\r\n                previous: entry,\r\n                current: span,\r\n            });\r\n        }\r\n        // populate initial expressions\r\n        let mut expressions = Arena::new();\r\n        for (&name, expression) in lookup_global_expression.iter() {\r\n            let (span, is_reference) = match *expression {\r\n                crate::Expression::GlobalVariable(handle) => (\r\n                    module.global_variables.get_span(handle),\r\n                    module.global_variables[handle].space != crate::AddressSpace::Handle,\r\n                ),\r\n                crate::Expression::Constant(handle) => (module.constants.get_span(handle), false),\r\n                _ => unreachable!(),\r\n            };\r\n            let expression = expressions.append(expression.clone(), span);\r\n            symbol_table.add(\r\n                name,\r\n                TypedExpression {\r\n                    handle: expression,\r\n                    is_reference,\r\n                },\r\n            );\r\n        }\r\n        // read parameter list\r\n        let mut arguments = Vec::new();\r\n        lexer.expect(Token::Paren('('))?;\r\n        let mut ready = true;\r\n        while !lexer.skip(Token::Paren(')')) {\r\n            if !ready {\r\n                return Err(Error::Unexpected(\r\n                    lexer.next().1,\r\n                    ExpectedToken::Token(Token::Separator(',')),\r\n                ));\r\n            }\r\n            let mut binding = self.parse_varying_binding(lexer)?;\r\n            let (param_name, param_name_span, param_type) =\r\n                self.parse_variable_ident_decl(lexer, &mut module.types, &mut module.constants)?;\r\n            if crate::keywords::wgsl::RESERVED.contains(&param_name) {\r\n                return Err(Error::ReservedKeyword(param_name_span));\r\n            }\r\n            let param_index = arguments.len() as u32;\r\n            let expression = expressions.append(\r\n                crate::Expression::FunctionArgument(param_index),\r\n                NagaSpan::from(param_name_span),\r\n            );\r\n            symbol_table.add(\r\n                param_name,\r\n                TypedExpression {\r\n                    handle: expression,\r\n                    is_reference: false,\r\n                },\r\n            );\r\n            if let Some(ref mut binding) = binding {\r\n                binding.apply_default_interpolation(&module.types[param_type].inner);\r\n            }\r\n            arguments.push(crate::FunctionArgument {\r\n                name: Some(param_name.to_string()),\r\n                ty: param_type,\r\n                binding,\r\n            });\r\n            ready = lexer.skip(Token::Separator(','));\r\n        }\r\n        // read return type\r\n        let result = if lexer.skip(Token::Arrow) && !lexer.skip(Token::Word(\"void\")) {\r\n            let mut binding = self.parse_varying_binding(lexer)?;\r\n            let ty = self.parse_type_decl(lexer, None, &mut module.types, &mut module.constants)?;\r\n            if let Some(ref mut binding) = binding {\r\n                binding.apply_default_interpolation(&module.types[ty].inner);\r\n            }\r\n            Some(crate::FunctionResult { ty, binding })\r\n        } else {\r\n            None\r\n        };\r\n\r\n        let mut fun = crate::Function {\r\n            name: Some(fun_name.to_string()),\r\n            arguments,\r\n            result,\r\n            local_variables: Arena::new(),\r\n            expressions,\r\n            named_expressions: crate::NamedExpressions::default(),\r\n            body: crate::Block::new(),\r\n        };\r\n\r\n        // read body\r\n        let mut typifier = super::Typifier::new();\r\n        let mut named_expressions = crate::FastHashMap::default();\r\n        fun.body = self.parse_block(\r\n            lexer,\r\n            StatementContext {\r\n                symbol_table: &mut symbol_table,\r\n                typifier: &mut typifier,\r\n                variables: &mut fun.local_variables,\r\n                expressions: &mut fun.expressions,\r\n                named_expressions: &mut named_expressions,\r\n                types: &mut module.types,\r\n                constants: &mut module.constants,\r\n                global_vars: &module.global_variables,\r\n                functions: &module.functions,\r\n                arguments: &fun.arguments,\r\n            },\r\n            true,\r\n        )?;\r\n        // fixup the IR\r\n        ensure_block_returns(&mut fun.body);\r\n        // done\r\n        self.pop_rule_span(lexer);\r\n\r\n        // Set named expressions after block parsing ends\r\n        fun.named_expressions = named_expressions;\r\n\r\n        Ok((fun, fun_name))\r\n    }\r\n\r\n    fn parse_global_decl<'a>(\r\n        &mut self,\r\n        lexer: &mut Lexer<'a>,\r\n        module: &mut crate::Module,\r\n        lookup_global_expression: &mut FastHashMap<&'a str, crate::Expression>,\r\n    ) -> Result<bool, Error<'a>> {\r\n        // read attributes\r\n        let mut binding = None;\r\n        let mut stage = None;\r\n        let mut workgroup_size = [0u32; 3];\r\n        let mut early_depth_test = None;\r\n        let (mut bind_index, mut bind_group) = (None, None);\r\n\r\n        self.push_rule_span(Rule::Attribute, lexer);\r\n        while lexer.skip(Token::Attribute) {\r\n            match lexer.next_ident_with_span()? {\r\n                (\"binding\", _) => {\r\n                    lexer.expect(Token::Paren('('))?;\r\n                    bind_index = Some(Self::parse_non_negative_i32_literal(lexer)?);\r\n                    lexer.expect(Token::Paren(')'))?;\r\n                }\r\n                (\"group\", _) => {\r\n                    lexer.expect(Token::Paren('('))?;\r\n                    bind_group = Some(Self::parse_non_negative_i32_literal(lexer)?);\r\n                    lexer.expect(Token::Paren(')'))?;\r\n                }\r\n                (\"vertex\", _) => {\r\n                    stage = Some(crate::ShaderStage::Vertex);\r\n                }\r\n                (\"fragment\", _) => {\r\n                    stage = Some(crate::ShaderStage::Fragment);\r\n                }\r\n                (\"compute\", _) => {\r\n                    stage = Some(crate::ShaderStage::Compute);\r\n                }\r\n                (\"workgroup_size\", _) => {\r\n                    lexer.expect(Token::Paren('('))?;\r\n                    workgroup_size = [1u32; 3];\r\n                    for (i, size) in workgroup_size.iter_mut().enumerate() {\r\n                        *size = Self::parse_generic_non_negative_int_literal(lexer)?;\r\n                        match lexer.next() {\r\n                            (Token::Paren(')'), _) => break,\r\n                            (Token::Separator(','), _) if i != 2 => (),\r\n                            other => {\r\n                                return Err(Error::Unexpected(\r\n                                    other.1,\r\n                                    ExpectedToken::WorkgroupSizeSeparator,\r\n                                ))\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                (\"early_depth_test\", _) => {\r\n                    let conservative = if lexer.skip(Token::Paren('(')) {\r\n                        let (ident, ident_span) = lexer.next_ident_with_span()?;\r\n                        let value = conv::map_conservative_depth(ident, ident_span)?;\r\n                        lexer.expect(Token::Paren(')'))?;\r\n                        Some(value)\r\n                    } else {\r\n                        None\r\n                    };\r\n                    early_depth_test = Some(crate::EarlyDepthTest { conservative });\r\n                }\r\n                (_, word_span) => return Err(Error::UnknownAttribute(word_span)),\r\n            }\r\n        }\r\n\r\n        let attrib_span = self.pop_rule_span(lexer);\r\n        match (bind_group, bind_index) {\r\n            (Some(group), Some(index)) => {\r\n                binding = Some(crate::ResourceBinding {\r\n                    group,\r\n                    binding: index,\r\n                });\r\n            }\r\n            (Some(_), None) => return Err(Error::MissingAttribute(\"binding\", attrib_span)),\r\n            (None, Some(_)) => return Err(Error::MissingAttribute(\"group\", attrib_span)),\r\n            (None, None) => {}\r\n        }\r\n\r\n        // read items\r\n        let start = lexer.start_byte_offset();\r\n        match lexer.next() {\r\n            (Token::Separator(';'), _) => {}\r\n            (Token::Word(\"struct\"), _) => {\r\n                let (name, span) = lexer.next_ident_with_span()?;\r\n                if crate::keywords::wgsl::RESERVED.contains(&name) {\r\n                    return Err(Error::ReservedKeyword(span));\r\n                }\r\n                let (members, span) =\r\n                    self.parse_struct_body(lexer, &mut module.types, &mut module.constants)?;\r\n                let type_span = NagaSpan::from(lexer.span_from(start));\r\n                let ty = module.types.insert(\r\n                    crate::Type {\r\n                        name: Some(name.to_string()),\r\n                        inner: crate::TypeInner::Struct { members, span },\r\n                    },\r\n                    type_span,\r\n                );\r\n                self.lookup_type.insert(name.to_owned(), ty);\r\n            }\r\n            (Token::Word(\"type\"), _) => {\r\n                let name = lexer.next_ident()?;\r\n                lexer.expect(Token::Operation('='))?;\r\n                let ty = self.parse_type_decl(\r\n                    lexer,\r\n                    Some(name),\r\n                    &mut module.types,\r\n                    &mut module.constants,\r\n                )?;\r\n                self.lookup_type.insert(name.to_owned(), ty);\r\n                lexer.expect(Token::Separator(';'))?;\r\n            }\r\n            (Token::Word(\"let\"), _) => {\r\n                let (name, name_span) = lexer.next_ident_with_span()?;\r\n                if crate::keywords::wgsl::RESERVED.contains(&name) {\r\n                    return Err(Error::ReservedKeyword(name_span));\r\n                }\r\n                if let Some(entry) = self\r\n                    .module_scope_identifiers\r\n                    .insert(String::from(name), name_span.clone())\r\n                {\r\n                    return Err(Error::Redefinition {\r\n                        previous: entry,\r\n                        current: name_span,\r\n                    });\r\n                }\r\n                let given_ty = if lexer.skip(Token::Separator(':')) {\r\n                    let ty = self.parse_type_decl(\r\n                        lexer,\r\n                        None,\r\n                        &mut module.types,\r\n                        &mut module.constants,\r\n                    )?;\r\n                    Some(ty)\r\n                } else {\r\n                    None\r\n                };\r\n\r\n                lexer.expect(Token::Operation('='))?;\r\n                let first_token_span = lexer.next();\r\n                let const_handle = self.parse_const_expression_impl(\r\n                    first_token_span,\r\n                    lexer,\r\n                    Some(name),\r\n                    &mut module.types,\r\n                    &mut module.constants,\r\n                )?;\r\n\r\n                if let Some(explicit_ty) = given_ty {\r\n                    let con = &module.constants[const_handle];\r\n                    let type_match = match con.inner {\r\n                        crate::ConstantInner::Scalar { width, value } => {\r\n                            module.types[explicit_ty].inner\r\n                                == crate::TypeInner::Scalar {\r\n                                    kind: value.scalar_kind(),\r\n                                    width,\r\n                                }\r\n                        }\r\n                        crate::ConstantInner::Composite { ty, components: _ } => ty == explicit_ty,\r\n                    };\r\n                    if !type_match {\r\n                        let expected_inner_str = match con.inner {\r\n                            crate::ConstantInner::Scalar { width, value } => {\r\n                                crate::TypeInner::Scalar {\r\n                                    kind: value.scalar_kind(),\r\n                                    width,\r\n                                }\r\n                                .to_wgsl(&module.types, &module.constants)\r\n                            }\r\n                            crate::ConstantInner::Composite { .. } => module.types[explicit_ty]\r\n                                .inner\r\n                                .to_wgsl(&module.types, &module.constants),\r\n                        };\r\n                        return Err(Error::InitializationTypeMismatch(\r\n                            name_span,\r\n                            expected_inner_str,\r\n                        ));\r\n                    }\r\n                }\r\n\r\n                lexer.expect(Token::Separator(';'))?;\r\n                lookup_global_expression.insert(name, crate::Expression::Constant(const_handle));\r\n            }\r\n            (Token::Word(\"var\"), _) => {\r\n                let pvar =\r\n                    self.parse_variable_decl(lexer, &mut module.types, &mut module.constants)?;\r\n                if crate::keywords::wgsl::RESERVED.contains(&pvar.name) {\r\n                    return Err(Error::ReservedKeyword(pvar.name_span));\r\n                }\r\n                if let Some(entry) = self\r\n                    .module_scope_identifiers\r\n                    .insert(String::from(pvar.name), pvar.name_span.clone())\r\n                {\r\n                    return Err(Error::Redefinition {\r\n                        previous: entry,\r\n                        current: pvar.name_span,\r\n                    });\r\n                }\r\n                let var_handle = module.global_variables.append(\r\n                    crate::GlobalVariable {\r\n                        name: Some(pvar.name.to_owned()),\r\n                        space: pvar.space.unwrap_or(crate::AddressSpace::Handle),\r\n                        binding: binding.take(),\r\n                        ty: pvar.ty,\r\n                        init: pvar.init,\r\n                    },\r\n                    NagaSpan::from(pvar.name_span),\r\n                );\r\n                lookup_global_expression\r\n                    .insert(pvar.name, crate::Expression::GlobalVariable(var_handle));\r\n            }\r\n            (Token::Word(\"fn\"), _) => {\r\n                let (function, name) =\r\n                    self.parse_function_decl(lexer, module, lookup_global_expression)?;\r\n                match stage {\r\n                    Some(stage) => module.entry_points.push(crate::EntryPoint {\r\n                        name: name.to_string(),\r\n                        stage,\r\n                        early_depth_test,\r\n                        workgroup_size,\r\n                        function,\r\n                    }),\r\n                    None => {\r\n                        module\r\n                            .functions\r\n                            .append(function, NagaSpan::from(lexer.span_from(start)));\r\n                    }\r\n                }\r\n            }\r\n            (Token::End, _) => return Ok(false),\r\n            other => return Err(Error::Unexpected(other.1, ExpectedToken::GlobalItem)),\r\n        }\r\n\r\n        match binding {\r\n            None => Ok(true),\r\n            // we had the attribute but no var?\r\n            Some(_) => Err(Error::Other),\r\n        }\r\n    }\r\n\r\n    pub fn parse(&mut self, source: &str) -> Result<crate::Module, ParseError> {\r\n        self.reset();\r\n\r\n        let mut module = crate::Module::default();\r\n        let mut lexer = Lexer::new(source);\r\n        let mut lookup_global_expression = FastHashMap::default();\r\n        loop {\r\n            match self.parse_global_decl(&mut lexer, &mut module, &mut lookup_global_expression) {\r\n                Err(error) => return Err(error.as_parse_error(lexer.source)),\r\n                Ok(true) => {}\r\n                Ok(false) => {\r\n                    if !self.rules.is_empty() {\r\n                        log::error!(\"Reached the end of file, but rule stack is not empty\");\r\n                        return Err(Error::Other.as_parse_error(lexer.source));\r\n                    };\r\n                    return Ok(module);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\npub fn parse_str(source: &str) -> Result<crate::Module, ParseError> {\r\n    Parser::new().parse(source)\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/wgsl/number.rs",
    "content": "use std::borrow::Cow;\r\n\r\nuse super::{NumberError, Token};\r\n\r\n/// When using this type assume no Abstract Int/Float for now\r\n#[derive(Copy, Clone, Debug, PartialEq)]\r\npub enum Number {\r\n    /// Abstract Int (-2^63 ≤ i < 2^63)\r\n    AbstractInt(i64),\r\n    /// Abstract Float (IEEE-754 binary64)\r\n    AbstractFloat(f64),\r\n    /// Concrete i32\r\n    I32(i32),\r\n    /// Concrete u32\r\n    U32(u32),\r\n    /// Concrete f32\r\n    F32(f32),\r\n}\r\n\r\nimpl Number {\r\n    /// Convert abstract numbers to a plausible concrete counterpart.\r\n    ///\r\n    /// Return concrete numbers unchanged. If the conversion would be\r\n    /// lossy, return an error.\r\n    fn abstract_to_concrete(self) -> Result<Number, NumberError> {\r\n        match self {\r\n            Number::AbstractInt(num) => {\r\n                use std::convert::TryFrom;\r\n                i32::try_from(num)\r\n                    .map(Number::I32)\r\n                    .map_err(|_| NumberError::NotRepresentable)\r\n            }\r\n            Number::AbstractFloat(num) => {\r\n                let num = num as f32;\r\n                if num.is_finite() {\r\n                    Ok(Number::F32(num))\r\n                } else {\r\n                    Err(NumberError::NotRepresentable)\r\n                }\r\n            }\r\n            num => Ok(num),\r\n        }\r\n    }\r\n}\r\n\r\n// TODO: when implementing Creation-Time Expressions, remove the ability to match the minus sign\r\n\r\npub(super) fn consume_number(input: &str) -> (Token<'_>, &str) {\r\n    let (result, rest) = parse(input);\r\n    (\r\n        Token::Number(result.and_then(Number::abstract_to_concrete)),\r\n        rest,\r\n    )\r\n}\r\n\r\nenum Kind {\r\n    Int(IntKind),\r\n    Float(FloatKind),\r\n}\r\n\r\nenum IntKind {\r\n    I32,\r\n    U32,\r\n}\r\n\r\nenum FloatKind {\r\n    F32,\r\n    F16,\r\n}\r\n\r\n// The following regexes (from the WGSL spec) will be matched:\r\n\r\n// int_literal:\r\n// | / 0                                                                [iu]?   /\r\n// | / [1-9][0-9]*                                                      [iu]?   /\r\n// | / 0[xX][0-9a-fA-F]+                                                [iu]?   /\r\n\r\n// decimal_float_literal:\r\n// | / 0                                                                [fh]    /\r\n// | / [1-9][0-9]*                                                      [fh]    /\r\n// | / [0-9]*               \\.[0-9]+            ([eE][+-]?[0-9]+)?      [fh]?   /\r\n// | / [0-9]+               \\.[0-9]*            ([eE][+-]?[0-9]+)?      [fh]?   /\r\n// | / [0-9]+                                    [eE][+-]?[0-9]+        [fh]?   /\r\n\r\n// hex_float_literal:\r\n// | / 0[xX][0-9a-fA-F]*    \\.[0-9a-fA-F]+      ([pP][+-]?[0-9]+        [fh]?)? /\r\n// | / 0[xX][0-9a-fA-F]+    \\.[0-9a-fA-F]*      ([pP][+-]?[0-9]+        [fh]?)? /\r\n// | / 0[xX][0-9a-fA-F]+                         [pP][+-]?[0-9]+        [fh]?   /\r\n\r\n// You could visualize the regex below via https://debuggex.com to get a rough idea what `parse` is doing\r\n// -?(?:0[xX](?:([0-9a-fA-F]+\\.[0-9a-fA-F]*|[0-9a-fA-F]*\\.[0-9a-fA-F]+)(?:([pP][+-]?[0-9]+)([fh]?))?|([0-9a-fA-F]+)([pP][+-]?[0-9]+)([fh]?)|([0-9a-fA-F]+)([iu]?))|((?:[0-9]+[eE][+-]?[0-9]+|(?:[0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?))([fh]?)|((?:[0-9]|[1-9][0-9]+))([iufh]?))\r\n\r\nfn parse(input: &str) -> (Result<Number, NumberError>, &str) {\r\n    /// returns `true` and consumes `X` bytes from the given byte buffer\r\n    /// if the given `X` nr of patterns are found at the start of the buffer\r\n    macro_rules! consume {\r\n        ($bytes:ident, $($($pattern:pat)|*),*) => {\r\n            match $bytes {\r\n                &[$($($pattern)|*),*, ref rest @ ..] => { $bytes = rest; true },\r\n                _ => false,\r\n            }\r\n        };\r\n    }\r\n\r\n    /// consumes one byte from the given byte buffer\r\n    /// if one of the given patterns are found at the start of the buffer\r\n    /// returning the corresponding expr for the matched pattern\r\n    macro_rules! consume_map {\r\n        ($bytes:ident, [$($($pattern:pat)|* => $to:expr),*]) => {\r\n            match $bytes {\r\n                $( &[$($pattern)|*, ref rest @ ..] => { $bytes = rest; Some($to) }, )*\r\n                _ => None,\r\n            }\r\n        };\r\n    }\r\n\r\n    /// consumes all consecutive bytes matched by the `0-9` pattern from the given byte buffer\r\n    /// returning the number of consumed bytes\r\n    macro_rules! consume_dec_digits {\r\n        ($bytes:ident) => {{\r\n            let start_len = $bytes.len();\r\n            while let &[b'0'..=b'9', ref rest @ ..] = $bytes {\r\n                $bytes = rest;\r\n            }\r\n            start_len - $bytes.len()\r\n        }};\r\n    }\r\n\r\n    /// consumes all consecutive bytes matched by the `0-9 | a-f | A-F` pattern from the given byte buffer\r\n    /// returning the number of consumed bytes\r\n    macro_rules! consume_hex_digits {\r\n        ($bytes:ident) => {{\r\n            let start_len = $bytes.len();\r\n            while let &[b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F', ref rest @ ..] = $bytes {\r\n                $bytes = rest;\r\n            }\r\n            start_len - $bytes.len()\r\n        }};\r\n    }\r\n\r\n    /// maps the given `&[u8]` (tail of the initial `input: &str`) to a `&str`\r\n    macro_rules! rest_to_str {\r\n        ($bytes:ident) => {\r\n            &input[input.len() - $bytes.len()..]\r\n        };\r\n    }\r\n\r\n    struct ExtractSubStr<'a>(&'a str);\r\n\r\n    impl<'a> ExtractSubStr<'a> {\r\n        /// given an `input` and a `start` (tail of the `input`)\r\n        /// creates a new [ExtractSubStr]\r\n        fn start(input: &'a str, start: &'a [u8]) -> Self {\r\n            let start = input.len() - start.len();\r\n            Self(&input[start..])\r\n        }\r\n        /// given an `end` (tail of the initial `input`)\r\n        /// returns a substring of `input`\r\n        fn end(&self, end: &'a [u8]) -> &'a str {\r\n            let end = self.0.len() - end.len();\r\n            &self.0[..end]\r\n        }\r\n    }\r\n\r\n    let mut bytes = input.as_bytes();\r\n\r\n    let general_extract = ExtractSubStr::start(input, bytes);\r\n\r\n    let is_negative = consume!(bytes, b'-');\r\n\r\n    if consume!(bytes, b'0', b'x' | b'X') {\r\n        let digits_extract = ExtractSubStr::start(input, bytes);\r\n\r\n        let consumed = consume_hex_digits!(bytes);\r\n\r\n        if consume!(bytes, b'.') {\r\n            let consumed_after_period = consume_hex_digits!(bytes);\r\n\r\n            if consumed + consumed_after_period == 0 {\r\n                return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n            }\r\n\r\n            let significand = general_extract.end(bytes);\r\n\r\n            if consume!(bytes, b'p' | b'P') {\r\n                consume!(bytes, b'+' | b'-');\r\n                let consumed = consume_dec_digits!(bytes);\r\n\r\n                if consumed == 0 {\r\n                    return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n                }\r\n\r\n                let number = general_extract.end(bytes);\r\n\r\n                let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]);\r\n\r\n                (parse_hex_float(number, kind), rest_to_str!(bytes))\r\n            } else {\r\n                (\r\n                    parse_hex_float_missing_exponent(significand, None),\r\n                    rest_to_str!(bytes),\r\n                )\r\n            }\r\n        } else {\r\n            if consumed == 0 {\r\n                return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n            }\r\n\r\n            let significand = general_extract.end(bytes);\r\n            let digits = digits_extract.end(bytes);\r\n\r\n            let exp_extract = ExtractSubStr::start(input, bytes);\r\n\r\n            if consume!(bytes, b'p' | b'P') {\r\n                consume!(bytes, b'+' | b'-');\r\n                let consumed = consume_dec_digits!(bytes);\r\n\r\n                if consumed == 0 {\r\n                    return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n                }\r\n\r\n                let exponent = exp_extract.end(bytes);\r\n\r\n                let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]);\r\n\r\n                (\r\n                    parse_hex_float_missing_period(significand, exponent, kind),\r\n                    rest_to_str!(bytes),\r\n                )\r\n            } else {\r\n                let kind = consume_map!(bytes, [b'i' => IntKind::I32, b'u' => IntKind::U32]);\r\n\r\n                (\r\n                    parse_hex_int(is_negative, digits, kind),\r\n                    rest_to_str!(bytes),\r\n                )\r\n            }\r\n        }\r\n    } else {\r\n        let is_first_zero = bytes.first() == Some(&b'0');\r\n\r\n        let consumed = consume_dec_digits!(bytes);\r\n\r\n        if consume!(bytes, b'.') {\r\n            let consumed_after_period = consume_dec_digits!(bytes);\r\n\r\n            if consumed + consumed_after_period == 0 {\r\n                return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n            }\r\n\r\n            if consume!(bytes, b'e' | b'E') {\r\n                consume!(bytes, b'+' | b'-');\r\n                let consumed = consume_dec_digits!(bytes);\r\n\r\n                if consumed == 0 {\r\n                    return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n                }\r\n            }\r\n\r\n            let number = general_extract.end(bytes);\r\n\r\n            let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]);\r\n\r\n            (parse_dec_float(number, kind), rest_to_str!(bytes))\r\n        } else {\r\n            if consumed == 0 {\r\n                return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n            }\r\n\r\n            if consume!(bytes, b'e' | b'E') {\r\n                consume!(bytes, b'+' | b'-');\r\n                let consumed = consume_dec_digits!(bytes);\r\n\r\n                if consumed == 0 {\r\n                    return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n                }\r\n\r\n                let number = general_extract.end(bytes);\r\n\r\n                let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]);\r\n\r\n                (parse_dec_float(number, kind), rest_to_str!(bytes))\r\n            } else {\r\n                // make sure the multi-digit numbers don't start with zero\r\n                if consumed > 1 && is_first_zero {\r\n                    return (Err(NumberError::Invalid), rest_to_str!(bytes));\r\n                }\r\n\r\n                let digits_with_sign = general_extract.end(bytes);\r\n\r\n                let kind = consume_map!(bytes, [\r\n                    b'i' => Kind::Int(IntKind::I32),\r\n                    b'u' => Kind::Int(IntKind::U32),\r\n                    b'f' => Kind::Float(FloatKind::F32),\r\n                    b'h' => Kind::Float(FloatKind::F16)\r\n                ]);\r\n\r\n                (\r\n                    parse_dec(is_negative, digits_with_sign, kind),\r\n                    rest_to_str!(bytes),\r\n                )\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nfn parse_hex_float_missing_exponent(\r\n    // format: -?0[xX] ( [0-9a-fA-F]+\\.[0-9a-fA-F]* | [0-9a-fA-F]*\\.[0-9a-fA-F]+ )\r\n    significand: &str,\r\n    kind: Option<FloatKind>,\r\n) -> Result<Number, NumberError> {\r\n    let hexf_input = format!(\"{}{}\", significand, \"p0\");\r\n    parse_hex_float(&hexf_input, kind)\r\n}\r\n\r\nfn parse_hex_float_missing_period(\r\n    // format: -?0[xX] [0-9a-fA-F]+\r\n    significand: &str,\r\n    // format: [pP][+-]?[0-9]+\r\n    exponent: &str,\r\n    kind: Option<FloatKind>,\r\n) -> Result<Number, NumberError> {\r\n    let hexf_input = format!(\"{}.{}\", significand, exponent);\r\n    parse_hex_float(&hexf_input, kind)\r\n}\r\n\r\nfn parse_hex_int(\r\n    is_negative: bool,\r\n    // format: [0-9a-fA-F]+\r\n    digits: &str,\r\n    kind: Option<IntKind>,\r\n) -> Result<Number, NumberError> {\r\n    let digits_with_sign = if is_negative {\r\n        Cow::Owned(format!(\"-{}\", digits))\r\n    } else {\r\n        Cow::Borrowed(digits)\r\n    };\r\n    parse_int(&digits_with_sign, kind, 16, is_negative)\r\n}\r\n\r\nfn parse_dec(\r\n    is_negative: bool,\r\n    // format: -? ( [0-9] | [1-9][0-9]+ )\r\n    digits_with_sign: &str,\r\n    kind: Option<Kind>,\r\n) -> Result<Number, NumberError> {\r\n    match kind {\r\n        None => parse_int(digits_with_sign, None, 10, is_negative),\r\n        Some(Kind::Int(kind)) => parse_int(digits_with_sign, Some(kind), 10, is_negative),\r\n        Some(Kind::Float(kind)) => parse_dec_float(digits_with_sign, Some(kind)),\r\n    }\r\n}\r\n\r\n// Float parsing notes\r\n\r\n// The following chapters of IEEE 754-2019 are relevant:\r\n//\r\n// 7.4 Overflow (largest finite number is exceeded by what would have been\r\n//     the rounded floating-point result were the exponent range unbounded)\r\n//\r\n// 7.5 Underflow (tiny non-zero result is detected;\r\n//     for decimal formats tininess is detected before rounding when a non-zero result\r\n//     computed as though both the exponent range and the precision were unbounded\r\n//     would lie strictly between 2^−126)\r\n//\r\n// 7.6 Inexact (rounded result differs from what would have been computed\r\n//     were both exponent range and precision unbounded)\r\n\r\n// The WGSL spec requires us to error:\r\n//   on overflow for decimal floating point literals\r\n//   on overflow and inexact for hexadecimal floating point literals\r\n// (underflow is not mentioned)\r\n\r\n// hexf_parse errors on overflow, underflow, inexact\r\n// rust std lib float from str handles overflow, underflow, inexact transparently (rounds and will not error)\r\n\r\n// Therefore we only check for overflow manually for decimal floating point literals\r\n\r\n// input format: -?0[xX] ( [0-9a-fA-F]+\\.[0-9a-fA-F]* | [0-9a-fA-F]*\\.[0-9a-fA-F]+ ) [pP][+-]?[0-9]+\r\nfn parse_hex_float(input: &str, kind: Option<FloatKind>) -> Result<Number, NumberError> {\r\n    match kind {\r\n        None => match hexf_parse::parse_hexf64(input, false) {\r\n            Ok(num) => Ok(Number::AbstractFloat(num)),\r\n            // can only be ParseHexfErrorKind::Inexact but we can't check since it's private\r\n            _ => Err(NumberError::NotRepresentable),\r\n        },\r\n        Some(FloatKind::F32) => match hexf_parse::parse_hexf32(input, false) {\r\n            Ok(num) => Ok(Number::F32(num)),\r\n            // can only be ParseHexfErrorKind::Inexact but we can't check since it's private\r\n            _ => Err(NumberError::NotRepresentable),\r\n        },\r\n        Some(FloatKind::F16) => Err(NumberError::UnimplementedF16),\r\n    }\r\n}\r\n\r\n// input format: -? ( [0-9]+\\.[0-9]* | [0-9]*\\.[0-9]+ ) ([eE][+-]?[0-9]+)?\r\n//             | -? [0-9]+ [eE][+-]?[0-9]+\r\nfn parse_dec_float(input: &str, kind: Option<FloatKind>) -> Result<Number, NumberError> {\r\n    match kind {\r\n        None => {\r\n            let num = input.parse::<f64>().unwrap(); // will never fail\r\n            num.is_finite()\r\n                .then(|| Number::AbstractFloat(num))\r\n                .ok_or(NumberError::NotRepresentable)\r\n        }\r\n        Some(FloatKind::F32) => {\r\n            let num = input.parse::<f32>().unwrap(); // will never fail\r\n            num.is_finite()\r\n                .then(|| Number::F32(num))\r\n                .ok_or(NumberError::NotRepresentable)\r\n        }\r\n        Some(FloatKind::F16) => Err(NumberError::UnimplementedF16),\r\n    }\r\n}\r\n\r\nfn parse_int(\r\n    input: &str,\r\n    kind: Option<IntKind>,\r\n    radix: u32,\r\n    is_negative: bool,\r\n) -> Result<Number, NumberError> {\r\n    fn map_err(e: core::num::ParseIntError) -> NumberError {\r\n        match *e.kind() {\r\n            core::num::IntErrorKind::PosOverflow | core::num::IntErrorKind::NegOverflow => {\r\n                NumberError::NotRepresentable\r\n            }\r\n            _ => unreachable!(),\r\n        }\r\n    }\r\n    match kind {\r\n        None => match i64::from_str_radix(input, radix) {\r\n            Ok(num) => Ok(Number::AbstractInt(num)),\r\n            Err(e) => Err(map_err(e)),\r\n        },\r\n        Some(IntKind::I32) => match i32::from_str_radix(input, radix) {\r\n            Ok(num) => Ok(Number::I32(num)),\r\n            Err(e) => Err(map_err(e)),\r\n        },\r\n        Some(IntKind::U32) if is_negative => Err(NumberError::NotRepresentable),\r\n        Some(IntKind::U32) => match u32::from_str_radix(input, radix) {\r\n            Ok(num) => Ok(Number::U32(num)),\r\n            Err(e) => Err(map_err(e)),\r\n        },\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/front/wgsl/tests.rs",
    "content": "use super::parse_str;\r\n\r\n#[test]\r\nfn parse_comment() {\r\n    parse_str(\r\n        \"//\r\n        ////\r\n        ///////////////////////////////////////////////////////// asda\r\n        //////////////////// dad ////////// /\r\n        /////////////////////////////////////////////////////////////////////////////////////////////////////\r\n        //\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_types() {\r\n    parse_str(\"let a : i32 = 2;\").unwrap();\r\n    assert!(parse_str(\"let a : x32 = 2;\").is_err());\r\n    parse_str(\"var t: texture_2d<f32>;\").unwrap();\r\n    parse_str(\"var t: texture_cube_array<i32>;\").unwrap();\r\n    parse_str(\"var t: texture_multisampled_2d<u32>;\").unwrap();\r\n    parse_str(\"var t: texture_storage_1d<rgba8uint,write>;\").unwrap();\r\n    parse_str(\"var t: texture_storage_3d<r32float,read>;\").unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_type_inference() {\r\n    parse_str(\r\n        \"\r\n        fn foo() {\r\n            let a = 2u;\r\n            let b: u32 = a;\r\n            var x = 3.;\r\n            var y = vec2<f32>(1, 2);\r\n        }\",\r\n    )\r\n    .unwrap();\r\n    assert!(parse_str(\r\n        \"\r\n        fn foo() { let c : i32 = 2.0; }\",\r\n    )\r\n    .is_err());\r\n}\r\n\r\n#[test]\r\nfn parse_type_cast() {\r\n    parse_str(\r\n        \"\r\n        let a : i32 = 2;\r\n        fn main() {\r\n            var x: f32 = f32(a);\r\n            x = f32(i32(a + 1) / 2);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            let x: vec2<f32> = vec2<f32>(1.0, 2.0);\r\n            let y: vec2<u32> = vec2<u32>(x);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            let x: vec2<f32> = vec2<f32>(0.0);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    assert!(parse_str(\r\n        \"\r\n        fn main() {\r\n            let x: vec2<f32> = vec2<f32>(0);\r\n        }\r\n    \",\r\n    )\r\n    .is_err());\r\n}\r\n\r\n#[test]\r\nfn parse_struct() {\r\n    parse_str(\r\n        \"\r\n        struct Foo { x: i32 }\r\n        struct Bar {\r\n            @size(16) x: vec2<i32>,\r\n            @align(16) y: f32,\r\n            @size(32) @align(128) z: vec3<f32>,\r\n        };\r\n        struct Empty {}\r\n        var<storage,read_write> s: Foo;\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_standard_fun() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var x: i32 = min(max(1, 2), 3);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_statement() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            ;\r\n            {}\r\n            {;}\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n\r\n    parse_str(\r\n        \"\r\n        fn foo() {}\r\n        fn bar() { foo(); }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_if() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            if true {\r\n                discard;\r\n            } else {}\r\n            if 0 != 1 {}\r\n            if false {\r\n                return;\r\n            } else if true {\r\n                return;\r\n            } else {}\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_parentheses_if() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            if (true) {\r\n                discard;\r\n            } else {}\r\n            if (0 != 1) {}\r\n            if (false) {\r\n                return;\r\n            } else if (true) {\r\n                return;\r\n            } else {}\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_loop() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var i: i32 = 0;\r\n            loop {\r\n                if i == 1 { break; }\r\n                continuing { i = 1; }\r\n            }\r\n            loop {\r\n                if i == 0 { continue; }\r\n                break;\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var found: bool = false;\r\n            var i: i32 = 0;\r\n            while !found {\r\n                if i == 10 {\r\n                    found = true;\r\n                }\r\n\r\n                i = i + 1;\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            while true {\r\n                break;\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var a: i32 = 0;\r\n            for(var i: i32 = 0; i < 4; i = i + 1) {\r\n                a = a + 2;\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            for(;;) {\r\n                break;\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_switch() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var pos: f32;\r\n            switch (3) {\r\n                case 0, 1: { pos = 0.0; }\r\n                case 2: { pos = 1.0; fallthrough; }\r\n                case 3: {}\r\n                default: { pos = 3.0; }\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_switch_optional_colon_in_case() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var pos: f32;\r\n            switch (3) {\r\n                case 0, 1 { pos = 0.0; }\r\n                case 2 { pos = 1.0; fallthrough; }\r\n                case 3 {}\r\n                default { pos = 3.0; }\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_parentheses_switch() {\r\n    parse_str(\r\n        \"\r\n        fn main() {\r\n            var pos: f32;\r\n            switch pos > 1.0 {\r\n                default: { pos = 3.0; }\r\n            }\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_texture_load() {\r\n    parse_str(\r\n        \"\r\n        var t: texture_3d<u32>;\r\n        fn foo() {\r\n            let r: vec4<u32> = textureLoad(t, vec3<u32>(0.0, 1.0, 2.0), 1);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        var t: texture_multisampled_2d_array<i32>;\r\n        fn foo() {\r\n            let r: vec4<i32> = textureLoad(t, vec2<i32>(10, 20), 2, 3);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        var t: texture_storage_1d_array<r32float,read>;\r\n        fn foo() {\r\n            let r: vec4<f32> = textureLoad(t, 10, 2);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_texture_store() {\r\n    parse_str(\r\n        \"\r\n        var t: texture_storage_2d<rgba8unorm,write>;\r\n        fn foo() {\r\n            textureStore(t, vec2<i32>(10, 20), vec4<f32>(0.0, 1.0, 2.0, 3.0));\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_texture_query() {\r\n    parse_str(\r\n        \"\r\n        var t: texture_multisampled_2d_array<f32>;\r\n        fn foo() {\r\n            var dim: vec2<i32> = textureDimensions(t);\r\n            dim = textureDimensions(t, 0);\r\n            let layers: i32 = textureNumLayers(t);\r\n            let samples: i32 = textureNumSamples(t);\r\n        }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_postfix() {\r\n    parse_str(\r\n        \"fn foo() {\r\n        let x: f32 = vec4<f32>(1.0, 2.0, 3.0, 4.0).xyz.rgbr.aaaa.wz.g;\r\n        let y: f32 = fract(vec2<f32>(0.5, x)).x;\r\n    }\",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_expressions() {\r\n    parse_str(\"fn foo() {\r\n        let x: f32 = select(0.0, 1.0, true);\r\n        let y: vec2<f32> = select(vec2<f32>(1.0, 1.0), vec2<f32>(x, x), vec2<bool>(x < 0.5, x > 0.5));\r\n        let z: bool = !(0.0 == 1.0);\r\n    }\").unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_pointers() {\r\n    parse_str(\r\n        \"fn foo() {\r\n        var x: f32 = 1.0;\r\n        let px = &x;\r\n        let py = frexp(0.5, px);\r\n    }\",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_struct_instantiation() {\r\n    parse_str(\r\n        \"\r\n    struct Foo {\r\n        a: f32,\r\n        b: vec3<f32>,\r\n    }\r\n\r\n    @fragment\r\n    fn fs_main() {\r\n        var foo: Foo = Foo(0.0, vec3<f32>(0.0, 1.0, 42.0));\r\n    }\r\n    \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_array_length() {\r\n    parse_str(\r\n        \"\r\n        struct Foo {\r\n            data: array<u32>\r\n        } // this is used as both input and output for convenience\r\n\r\n        @group(0) @binding(0)\r\n        var<storage> foo: Foo;\r\n\r\n        @group(0) @binding(1)\r\n        var<storage> bar: array<u32>;\r\n\r\n        fn baz() {\r\n            var x: u32 = arrayLength(foo.data);\r\n            var y: u32 = arrayLength(bar);\r\n        }\r\n        \",\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[test]\r\nfn parse_storage_buffers() {\r\n    parse_str(\r\n        \"\r\n        @group(0) @binding(0)\r\n        var<storage> foo: array<u32>;\r\n        \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        @group(0) @binding(0)\r\n        var<storage,read> foo: array<u32>;\r\n        \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        @group(0) @binding(0)\r\n        var<storage,write> foo: array<u32>;\r\n        \",\r\n    )\r\n    .unwrap();\r\n    parse_str(\r\n        \"\r\n        @group(0) @binding(0)\r\n        var<storage,read_write> foo: array<u32>;\r\n        \",\r\n    )\r\n    .unwrap();\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/keywords/mod.rs",
    "content": "/*!\r\nLists of reserved keywords for each shading language with a [frontend][crate::front] or [backend][crate::back].\r\n*/\r\n\r\n#[cfg(any(feature = \"wgsl-in\", feature = \"wgsl-out\"))]\r\npub mod wgsl;\r\n"
  },
  {
    "path": "lib/naga/src/keywords/wgsl.rs",
    "content": "/*!\r\nKeywords for [WGSL][wgsl] (WebGPU Shading Language).\r\n\r\n[wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html\r\n*/\r\n\r\n// https://gpuweb.github.io/gpuweb/wgsl/#keyword-summary\r\npub const RESERVED: &[&str] = &[\r\n    // type-defining\r\n    \"array\",\r\n    \"atomic\",\r\n    \"bool\",\r\n    \"f32\",\r\n    \"f16\",\r\n    \"i32\",\r\n    \"mat2x2\",\r\n    \"mat2x3\",\r\n    \"mat2x4\",\r\n    \"mat3x2\",\r\n    \"mat3x3\",\r\n    \"mat3x4\",\r\n    \"mat4x2\",\r\n    \"mat4x3\",\r\n    \"mat4x4\",\r\n    \"override\",\r\n    \"ptr\",\r\n    \"sampler\",\r\n    \"sampler_comparison\",\r\n    \"struct\",\r\n    \"texture_1d\",\r\n    \"texture_2d\",\r\n    \"texture_2d_array\",\r\n    \"texture_3d\",\r\n    \"texture_cube\",\r\n    \"texture_cube_array\",\r\n    \"texture_multisampled_2d\",\r\n    \"texture_storage_1d\",\r\n    \"texture_storage_2d\",\r\n    \"texture_storage_2d_array\",\r\n    \"texture_storage_3d\",\r\n    \"texture_depth_2d\",\r\n    \"texture_depth_2d_array\",\r\n    \"texture_depth_cube\",\r\n    \"texture_depth_cube_array\",\r\n    \"texture_depth_multisampled_2d\",\r\n    \"u32\",\r\n    \"vec2\",\r\n    \"vec3\",\r\n    \"vec4\",\r\n    // other\r\n    \"bitcast\",\r\n    \"break\",\r\n    \"case\",\r\n    \"const\",\r\n    \"continue\",\r\n    \"continuing\",\r\n    \"default\",\r\n    \"discard\",\r\n    \"else\",\r\n    \"enable\",\r\n    \"fallthrough\",\r\n    \"false\",\r\n    \"fn\",\r\n    \"for\",\r\n    \"function\",\r\n    \"if\",\r\n    \"let\",\r\n    \"loop\",\r\n    \"private\",\r\n    \"return\",\r\n    \"storage\",\r\n    \"switch\",\r\n    \"true\",\r\n    \"type\",\r\n    \"uniform\",\r\n    \"var\",\r\n    \"while\",\r\n    \"workgroup\",\r\n    // reserved\r\n    \"AppendStructuredBuffer\",\r\n    \"BlendState\",\r\n    \"Buffer\",\r\n    \"ByteAddressBuffer\",\r\n    \"CompileShader\",\r\n    \"ComputeShader\",\r\n    \"ConsumeStructuredBuffer\",\r\n    \"DepthStencilState\",\r\n    \"DepthStencilView\",\r\n    \"DomainShader\",\r\n    \"GeometryShader\",\r\n    \"Hullshader\",\r\n    \"InputPatch\",\r\n    \"LineStream\",\r\n    \"NULL\",\r\n    \"OutputPatch\",\r\n    \"PixelShader\",\r\n    \"PointStream\",\r\n    \"RWBuffer\",\r\n    \"RWByteAddressBuffer\",\r\n    \"RWStructuredBuffer\",\r\n    \"RWTexture1D\",\r\n    \"RWTexture1DArray\",\r\n    \"RWTexture2D\",\r\n    \"RWTexture2DArray\",\r\n    \"RWTexture3D\",\r\n    \"RasterizerState\",\r\n    \"RenderTargetView\",\r\n    \"SamplerComparisonState\",\r\n    \"SamplerState\",\r\n    \"Self\",\r\n    \"StructuredBuffer\",\r\n    \"Texture1D\",\r\n    \"Texture1DArray\",\r\n    \"Texture2D\",\r\n    \"Texture2DArray\",\r\n    \"Texture2DMS\",\r\n    \"Texture2DMSArray\",\r\n    \"Texture3D\",\r\n    \"TextureCube\",\r\n    \"TextureCubeArray\",\r\n    \"TriangleStream\",\r\n    \"VertexShader\",\r\n    \"abstract\",\r\n    \"active\",\r\n    \"alignas\",\r\n    \"alignof\",\r\n    \"as\",\r\n    \"asm\",\r\n    \"asm_fragment\",\r\n    \"async\",\r\n    \"atomic_uint\",\r\n    \"attribute\",\r\n    \"auto\",\r\n    \"await\",\r\n    \"become\",\r\n    \"bf16\",\r\n    \"binding_array\",\r\n    \"cast\",\r\n    \"catch\",\r\n    \"cbuffer\",\r\n    \"char\",\r\n    \"class\",\r\n    \"co_await\",\r\n    \"co_return\",\r\n    \"co_yield\",\r\n    \"coherent\",\r\n    \"column_major\",\r\n    \"common\",\r\n    \"compile\",\r\n    \"compile_fragment\",\r\n    \"concept\",\r\n    \"const_cast\",\r\n    \"consteval\",\r\n    \"constexpr\",\r\n    \"constinit\",\r\n    \"crate\",\r\n    \"debugger\",\r\n    \"decltype\",\r\n    \"delete\",\r\n    \"demote\",\r\n    \"demote_to_helper\",\r\n    \"do\",\r\n    \"dword\",\r\n    \"dynamic_cast\",\r\n    \"enum\",\r\n    \"explicit\",\r\n    \"export\",\r\n    \"extends\",\r\n    \"extern\",\r\n    \"external\",\r\n    \"f64\",\r\n    \"filter\",\r\n    \"final\",\r\n    \"finally\",\r\n    \"fixed\",\r\n    \"friend\",\r\n    \"from\",\r\n    \"fvec2\",\r\n    \"fvec3\",\r\n    \"fvec4\",\r\n    \"fxgroup\",\r\n    \"get\",\r\n    \"goto\",\r\n    \"groupshared\",\r\n    \"handle\",\r\n    \"highp\",\r\n    \"hvec2\",\r\n    \"hvec3\",\r\n    \"hvec4\",\r\n    \"i16\",\r\n    \"i64\",\r\n    \"i8\",\r\n    \"iimage1D\",\r\n    \"iimage1DArray\",\r\n    \"iimage2D\",\r\n    \"iimage2DArray\",\r\n    \"iimage2DMS\",\r\n    \"iimage2DMSArray\",\r\n    \"iimage2DRect\",\r\n    \"iimage3D\",\r\n    \"iimageBuffer\",\r\n    \"iimageCube\",\r\n    \"iimageCubeArray\",\r\n    \"image1D\",\r\n    \"image1DArray\",\r\n    \"image2D\",\r\n    \"image2DArray\",\r\n    \"image2DMS\",\r\n    \"image2DMSArray\",\r\n    \"image2DRect\",\r\n    \"image3D\",\r\n    \"imageBuffer\",\r\n    \"imageCube\",\r\n    \"imageCubeArray\",\r\n    \"impl\",\r\n    \"implements\",\r\n    \"import\",\r\n    \"inline\",\r\n    \"inout\",\r\n    \"instanceof\",\r\n    \"interface\",\r\n    \"invariant\",\r\n    \"isampler1D\",\r\n    \"isampler1DArray\",\r\n    \"isampler2D\",\r\n    \"isampler2DArray\",\r\n    \"isampler2DMS\",\r\n    \"isampler2DMSArray\",\r\n    \"isampler2DRect\",\r\n    \"isampler3D\",\r\n    \"isamplerBuffer\",\r\n    \"isamplerCube\",\r\n    \"isamplerCubeArray\",\r\n    \"isubpassInput\",\r\n    \"isubpassInputMS\",\r\n    \"itexture1D\",\r\n    \"itexture1DArray\",\r\n    \"itexture2D\",\r\n    \"itexture2DArray\",\r\n    \"itexture2DMS\",\r\n    \"itexture2DMSArray\",\r\n    \"itexture2DRect\",\r\n    \"itexture3D\",\r\n    \"itextureBuffer\",\r\n    \"itextureCube\",\r\n    \"itextureCubeArray\",\r\n    \"layout\",\r\n    \"line\",\r\n    \"lineadj\",\r\n    \"lowp\",\r\n    \"macro\",\r\n    \"macro_rules\",\r\n    \"mat\",\r\n    \"match\",\r\n    \"matrix\",\r\n    \"mediump\",\r\n    \"meta\",\r\n    \"mod\",\r\n    \"module\",\r\n    \"move\",\r\n    \"mut\",\r\n    \"mutable\",\r\n    \"namespace\",\r\n    \"new\",\r\n    \"nil\",\r\n    \"noexcept\",\r\n    \"noinline\",\r\n    \"nointerpolation\",\r\n    \"noperspective\",\r\n    \"null\",\r\n    \"nullptr\",\r\n    \"of\",\r\n    \"operator\",\r\n    \"package\",\r\n    \"packoffset\",\r\n    \"partition\",\r\n    \"pass\",\r\n    \"patch\",\r\n    \"pixelfragment\",\r\n    \"point\",\r\n    \"precise\",\r\n    \"precision\",\r\n    \"premerge\",\r\n    \"priv\",\r\n    \"protected\",\r\n    \"pub\",\r\n    \"public\",\r\n    \"readonly\",\r\n    \"ref\",\r\n    \"regardless\",\r\n    \"register\",\r\n    \"reinterpret_cast\",\r\n    \"requires\",\r\n    \"resource\",\r\n    \"restrict\",\r\n    \"row_major\",\r\n    \"samper\",\r\n    \"sampler1D\",\r\n    \"sampler1DArray\",\r\n    \"sampler1DArrayShadow\",\r\n    \"sampler1DShadow\",\r\n    \"sampler2D\",\r\n    \"sampler2DArray\",\r\n    \"sampler2DArrayShadow\",\r\n    \"sampler2DMS\",\r\n    \"sampler2DMSArray\",\r\n    \"sampler2DRect\",\r\n    \"sampler2DRectShadow\",\r\n    \"sampler2DShadow\",\r\n    \"sampler3D\",\r\n    \"sampler3DRect\",\r\n    \"samplerBuffer\",\r\n    \"samplerCube\",\r\n    \"samplerCubeArray\",\r\n    \"samplerCubeArrayShadow\",\r\n    \"samplerCubeShadow\",\r\n    \"samplerShadow\",\r\n    \"self\",\r\n    \"set\",\r\n    \"shared\",\r\n    \"signed\",\r\n    \"sizeof\",\r\n    \"smooth\",\r\n    \"snorm\",\r\n    \"stateblock\",\r\n    \"stateblock_state\",\r\n    \"static\",\r\n    \"static_assert\",\r\n    \"static_cast\",\r\n    \"std\",\r\n    \"string\",\r\n    \"subpassInput\",\r\n    \"subpassInputMS\",\r\n    \"subroutine\",\r\n    \"super\",\r\n    \"superp\",\r\n    \"target\",\r\n    \"tbuffer\",\r\n    \"technique\",\r\n    \"technique10\",\r\n    \"technique11\",\r\n    \"template\",\r\n    \"texture1D\",\r\n    \"texture1DArray\",\r\n    \"texture2D\",\r\n    \"texture2DArray\",\r\n    \"texture2DMS\",\r\n    \"texture2DMSArray\",\r\n    \"texture2DRect\",\r\n    \"texture3D\",\r\n    \"textureBuffer\",\r\n    \"textureCube\",\r\n    \"textureCubeArray\",\r\n    \"this\",\r\n    \"thread_local\",\r\n    \"throw\",\r\n    \"trait\",\r\n    \"triangle\",\r\n    \"triangleadj\",\r\n    \"try\",\r\n    \"typedef\",\r\n    \"typeid\",\r\n    \"typename\",\r\n    \"typeof\",\r\n    \"u16\",\r\n    \"u64\",\r\n    \"u8\",\r\n    \"uimage1D\",\r\n    \"uimage1DArray\",\r\n    \"uimage2D\",\r\n    \"uimage2DArray\",\r\n    \"uimage2DMS\",\r\n    \"uimage2DMSArray\",\r\n    \"uimage2DRect\",\r\n    \"uimage3D\",\r\n    \"uimageBuffer\",\r\n    \"uimageCube\",\r\n    \"uimageCubeArray\",\r\n    \"union\",\r\n    \"unless\",\r\n    \"unorm\",\r\n    \"unsafe\",\r\n    \"unsigned\",\r\n    \"unsized\",\r\n    \"usampler1D\",\r\n    \"usampler1DArray\",\r\n    \"usampler2D\",\r\n    \"usampler2DArray\",\r\n    \"usampler2DMS\",\r\n    \"usampler2DMSArray\",\r\n    \"usampler2DRect\",\r\n    \"usampler3D\",\r\n    \"usamplerBuffer\",\r\n    \"usamplerCube\",\r\n    \"usamplerCubeArray\",\r\n    \"use\",\r\n    \"using\",\r\n    \"usubpassInput\",\r\n    \"usubpassInputMS\",\r\n    \"utexture1D\",\r\n    \"utexture1DArray\",\r\n    \"utexture2D\",\r\n    \"utexture2DArray\",\r\n    \"utexture2DMS\",\r\n    \"utexture2DMSArray\",\r\n    \"utexture2DRect\",\r\n    \"utexture3D\",\r\n    \"utextureBuffer\",\r\n    \"utextureCube\",\r\n    \"utextureCubeArray\",\r\n    \"varying\",\r\n    \"vec\",\r\n    \"vector\",\r\n    \"vertexfragment\",\r\n    \"virtual\",\r\n    \"void\",\r\n    \"volatile\",\r\n    \"wchar_t\",\r\n    \"wgsl\",\r\n    \"where\",\r\n    \"with\",\r\n    \"writeonly\",\r\n    \"yield\",\r\n];\r\n"
  },
  {
    "path": "lib/naga/src/lib.rs",
    "content": "/*! Universal shader translator.\r\n\r\nThe central structure of the crate is [`Module`]. A `Module` contains:\r\n\r\n- [`Function`]s, which have arguments, a return type, local variables, and a body,\r\n\r\n- [`EntryPoint`]s, which are specialized functions that can serve as the entry\r\n  point for pipeline stages like vertex shading or fragment shading,\r\n\r\n- [`Constant`]s and [`GlobalVariable`]s used by `EntryPoint`s and `Function`s, and\r\n\r\n- [`Type`]s used by the above.\r\n\r\nThe body of an `EntryPoint` or `Function` is represented using two types:\r\n\r\n- An [`Expression`] produces a value, but has no side effects or control flow.\r\n  `Expressions` include variable references, unary and binary operators, and so\r\n  on.\r\n\r\n- A [`Statement`] can have side effects and structured control flow.\r\n  `Statement`s do not produce a value, other than by storing one in some\r\n  designated place. `Statements` include blocks, conditionals, and loops, but also\r\n  operations that have side effects, like stores and function calls.\r\n\r\n`Statement`s form a tree, with pointers into the DAG of `Expression`s.\r\n\r\nRestricting side effects to statements simplifies analysis and code generation.\r\nA Naga backend can generate code to evaluate an `Expression` however and\r\nwhenever it pleases, as long as it is certain to observe the side effects of all\r\npreviously executed `Statement`s.\r\n\r\nMany `Statement` variants use the [`Block`] type, which is `Vec<Statement>`,\r\nwith optional span info, representing a series of statements executed in order. The body of an\r\n`EntryPoint`s or `Function` is a `Block`, and `Statement` has a\r\n[`Block`][Statement::Block] variant.\r\n\r\nIf the `clone` feature is enabled, [`Arena`], [`UniqueArena`], [`Type`], [`TypeInner`],\r\n[`Constant`], [`Function`], [`EntryPoint`] and [`Module`] can be cloned.\r\n\r\n## Arenas\r\n\r\nTo improve translator performance and reduce memory usage, most structures are\r\nstored in an [`Arena`]. An `Arena<T>` stores a series of `T` values, indexed by\r\n[`Handle<T>`](Handle) values, which are just wrappers around integer indexes.\r\nFor example, a `Function`'s expressions are stored in an `Arena<Expression>`,\r\nand compound expressions refer to their sub-expressions via `Handle<Expression>`\r\nvalues. (When examining the serialized form of a `Module`, note that the first\r\nelement of an `Arena` has an index of 1, not 0.)\r\n\r\nA [`UniqueArena`] is just like an `Arena`, except that it stores only a single\r\ninstance of each value. The value type must implement `Eq` and `Hash`. Like an\r\n`Arena`, inserting a value into a `UniqueArena` returns a `Handle` which can be\r\nused to efficiently access the value, without a hash lookup. Inserting a value\r\nmultiple times returns the same `Handle`.\r\n\r\nIf the `span` feature is enabled, both `Arena` and `UniqueArena` can associate a\r\nsource code span with each element.\r\n\r\n## Function Calls\r\n\r\nNaga's representation of function calls is unusual. Most languages treat\r\nfunction calls as expressions, but because calls may have side effects, Naga\r\nrepresents them as a kind of statement, [`Statement::Call`]. If the function\r\nreturns a value, a call statement designates a particular [`Expression::CallResult`]\r\nexpression to represent its return value, for use by subsequent statements and\r\nexpressions.\r\n\r\n## `Expression` evaluation time\r\n\r\nIt is essential to know when an [`Expression`] should be evaluated, because its\r\nvalue may depend on previous [`Statement`]s' effects. But whereas the order of\r\nexecution for a tree of `Statement`s is apparent from its structure, it is not\r\nso clear for `Expressions`, since an expression may be referred to by any number\r\nof `Statement`s and other `Expression`s.\r\n\r\nNaga's rules for when `Expression`s are evaluated are as follows:\r\n\r\n-   [`Constant`](Expression::Constant) expressions are considered to be\r\n    implicitly evaluated before execution begins.\r\n\r\n-   [`FunctionArgument`] and [`LocalVariable`] expressions are considered\r\n    implicitly evaluated upon entry to the function to which they belong.\r\n    Function arguments cannot be assigned to, and `LocalVariable` expressions\r\n    produce a *pointer to* the variable's value (for use with [`Load`] and\r\n    [`Store`]). Neither varies while the function executes, so it suffices to\r\n    consider these expressions evaluated once on entry.\r\n\r\n-   Similarly, [`GlobalVariable`] expressions are considered implicitly\r\n    evaluated before execution begins, since their value does not change while\r\n    code executes, for one of two reasons:\r\n\r\n    -   Most `GlobalVariable` expressions produce a pointer to the variable's\r\n        value, for use with [`Load`] and [`Store`], as `LocalVariable`\r\n        expressions do. Although the variable's value may change, its address\r\n        does not.\r\n\r\n    -   A `GlobalVariable` expression referring to a global in the\r\n        [`AddressSpace::Handle`] address space produces the value directly, not\r\n        a pointer. Such global variables hold opaque types like shaders or\r\n        images, and cannot be assigned to.\r\n\r\n-   A [`CallResult`] expression that is the `result` of a [`Statement::Call`],\r\n    representing the call's return value, is evaluated when the `Call` statement\r\n    is executed.\r\n\r\n-   Similarly, an [`AtomicResult`] expression that is the `result` of an\r\n    [`Atomic`] statement, representing the result of the atomic operation, is\r\n    evaluated when the `Atomic` statement is executed.\r\n\r\n-   All other expressions are evaluated when the (unique) [`Statement::Emit`]\r\n    statement that covers them is executed. The [`Expression::needs_pre_emit`]\r\n    method returns `true` if the given expression is one of those variants that\r\n    does *not* need to be covered by an `Emit` statement.\r\n\r\nNow, strictly speaking, not all `Expression` variants actually care when they're\r\nevaluated. For example, you can evaluate a [`BinaryOperator::Add`] expression\r\nany time you like, as long as you give it the right operands. It's really only a\r\nvery small set of expressions that are affected by timing:\r\n\r\n-   [`Load`], [`ImageSample`], and [`ImageLoad`] expressions are influenced by\r\n    stores to the variables or images they access, and must execute at the\r\n    proper time relative to them.\r\n\r\n-   [`Derivative`] expressions are sensitive to control flow uniformity: they\r\n    must not be moved out of an area of uniform control flow into a non-uniform\r\n    area.\r\n\r\n-   More generally, any expression that's used by more than one other expression\r\n    or statement should probably be evaluated only once, and then stored in a\r\n    variable to be cited at each point of use.\r\n\r\nNaga tries to help back ends handle all these cases correctly in a somewhat\r\ncircuitous way. The [`ModuleInfo`] structure returned by [`Validator::validate`]\r\nprovides a reference count for each expression in each function in the module.\r\nNaturally, any expression with a reference count of two or more deserves to be\r\nevaluated and stored in a temporary variable at the point that the `Emit`\r\nstatement covering it is executed. But if we selectively lower the reference\r\ncount threshold to _one_ for the sensitive expression types listed above, so\r\nthat we _always_ generate a temporary variable and save their value, then the\r\nsame code that manages multiply referenced expressions will take care of\r\nintroducing temporaries for time-sensitive expressions as well. The\r\n`Expression::bake_ref_count` method (private to the back ends) is meant to help\r\nwith this.\r\n\r\n## `Expression` scope\r\n\r\nEach `Expression` has a *scope*, which is the region of the function within\r\nwhich it can be used by `Statement`s and other `Expression`s. It is a validation\r\nerror to use an `Expression` outside its scope.\r\n\r\nAn expression's scope is defined as follows:\r\n\r\n-   The scope of a [`Constant`], [`GlobalVariable`], [`FunctionArgument`] or\r\n    [`LocalVariable`] expression covers the entire `Function` in which it\r\n    occurs.\r\n\r\n-   The scope of an expression evaluated by an [`Emit`] statement covers the\r\n    subsequent expressions in that `Emit`, the subsequent statements in the `Block`\r\n    to which that `Emit` belongs (if any) and their sub-statements (if any).\r\n\r\n-   The `result` expression of a [`Call`] or [`Atomic`] statement has a scope\r\n    covering the subsequent statements in the `Block` in which the statement\r\n    occurs (if any) and their sub-statements (if any).\r\n\r\nFor example, this implies that an expression evaluated by some statement in a\r\nnested `Block` is not available in the `Block`'s parents. Such a value would\r\nneed to be stored in a local variable to be carried upwards in the statement\r\ntree.\r\n\r\n[`AtomicResult`]: Expression::AtomicResult\r\n[`CallResult`]: Expression::CallResult\r\n[`Constant`]: Expression::Constant\r\n[`Derivative`]: Expression::Derivative\r\n[`FunctionArgument`]: Expression::FunctionArgument\r\n[`GlobalVariable`]: Expression::GlobalVariable\r\n[`ImageLoad`]: Expression::ImageLoad\r\n[`ImageSample`]: Expression::ImageSample\r\n[`Load`]: Expression::Load\r\n[`LocalVariable`]: Expression::LocalVariable\r\n\r\n[`Atomic`]: Statement::Atomic\r\n[`Call`]: Statement::Call\r\n[`Emit`]: Statement::Emit\r\n[`Store`]: Statement::Store\r\n\r\n[`Validator::validate`]: valid::Validator::validate\r\n[`ModuleInfo`]: valid::ModuleInfo\r\n*/\r\n\r\n#![allow(\r\n    clippy::new_without_default,\r\n    clippy::unneeded_field_pattern,\r\n    clippy::match_like_matches_macro,\r\n    clippy::if_same_then_else,\r\n    clippy::derive_partial_eq_without_eq\r\n)]\r\n#![warn(\r\n    trivial_casts,\r\n    trivial_numeric_casts,\r\n    unused_extern_crates,\r\n    unused_qualifications,\r\n    clippy::pattern_type_mismatch,\r\n    clippy::missing_const_for_fn\r\n)]\r\n#![deny(clippy::panic)]\r\n\r\nmod arena;\r\npub mod back;\r\nmod block;\r\npub mod front;\r\npub mod keywords;\r\npub mod proc;\r\nmod span;\r\npub mod valid;\r\n\r\npub use crate::arena::{Arena, Handle, Range, UniqueArena};\r\n\r\npub use crate::span::{SourceLocation, Span, SpanContext, WithSpan};\r\n#[cfg(feature = \"arbitrary\")]\r\nuse arbitrary::Arbitrary;\r\n#[cfg(feature = \"deserialize\")]\r\nuse serde::Deserialize;\r\n#[cfg(feature = \"serialize\")]\r\nuse serde::Serialize;\r\n\r\n/// Width of a boolean type, in bytes.\r\npub const BOOL_WIDTH: Bytes = 1;\r\n\r\n/// Hash map that is faster but not resilient to DoS attacks.\r\npub type FastHashMap<K, T> = rustc_hash::FxHashMap<K, T>;\r\n/// Hash set that is faster but not resilient to DoS attacks.\r\npub type FastHashSet<K> = rustc_hash::FxHashSet<K>;\r\n\r\n/// Map of expressions that have associated variable names\r\npub(crate) type NamedExpressions = FastHashMap<Handle<Expression>, String>;\r\n\r\n/// Early fragment tests.\r\n///\r\n/// In a standard situation, if a driver determines that it is possible to switch on early depth test, it will.\r\n///\r\n/// Typical situations when early depth test is switched off:\r\n///   - Calling `discard` in a shader.\r\n///   - Writing to the depth buffer, unless ConservativeDepth is enabled.\r\n///\r\n/// To use in a shader:\r\n///   - GLSL: `layout(early_fragment_tests) in;`\r\n///   - HLSL: `Attribute earlydepthstencil`\r\n///   - SPIR-V: `ExecutionMode EarlyFragmentTests`\r\n///\r\n/// For more, see:\r\n///   - <https://www.khronos.org/opengl/wiki/Early_Fragment_Test#Explicit_specification>\r\n///   - <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sm5-attributes-earlydepthstencil>\r\n///   - <https://www.khronos.org/registry/SPIR-V/specs/unified1/SPIRV.html#Execution_Mode>\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct EarlyDepthTest {\r\n    conservative: Option<ConservativeDepth>,\r\n}\r\n/// Enables adjusting depth without disabling early Z.\r\n///\r\n/// To use in a shader:\r\n///   - GLSL: `layout (depth_<greater/less/unchanged/any>) out float gl_FragDepth;`\r\n///     - `depth_any` option behaves as if the layout qualifier was not present.\r\n///   - HLSL: `SV_DepthGreaterEqual`/`SV_DepthLessEqual`/`SV_Depth`\r\n///   - SPIR-V: `ExecutionMode Depth<Greater/Less/Unchanged>`\r\n///\r\n/// For more, see:\r\n///   - <https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_conservative_depth.txt>\r\n///   - <https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics#system-value-semantics>\r\n///   - <https://www.khronos.org/registry/SPIR-V/specs/unified1/SPIRV.html#Execution_Mode>\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ConservativeDepth {\r\n    /// Shader may rewrite depth only with a value greater than calculated.\r\n    GreaterEqual,\r\n\r\n    /// Shader may rewrite depth smaller than one that would have been written without the modification.\r\n    LessEqual,\r\n\r\n    /// Shader may not rewrite depth value.\r\n    Unchanged,\r\n}\r\n\r\n/// Stage of the programmable pipeline.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\n#[allow(missing_docs)] // The names are self evident\r\npub enum ShaderStage {\r\n    Vertex,\r\n    Fragment,\r\n    Compute,\r\n}\r\n\r\n/// Addressing space of variables.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum AddressSpace {\r\n    /// Function locals.\r\n    Function,\r\n    /// Private data, per invocation, mutable.\r\n    Private,\r\n    /// Workgroup shared data, mutable.\r\n    WorkGroup,\r\n    /// Uniform buffer data.\r\n    Uniform,\r\n    /// Storage buffer data, potentially mutable.\r\n    Storage { access: StorageAccess },\r\n    /// Opaque handles, such as samplers and images.\r\n    Handle,\r\n    /// Push constants.\r\n    PushConstant,\r\n}\r\n\r\n/// Built-in inputs and outputs.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum BuiltIn {\r\n    Position { invariant: bool },\r\n    ViewIndex,\r\n    // vertex\r\n    BaseInstance,\r\n    BaseVertex,\r\n    ClipDistance,\r\n    CullDistance,\r\n    InstanceIndex,\r\n    PointSize,\r\n    VertexIndex,\r\n    // fragment\r\n    FragDepth,\r\n    FrontFacing,\r\n    PrimitiveIndex,\r\n    SampleIndex,\r\n    SampleMask,\r\n    // compute\r\n    GlobalInvocationId,\r\n    LocalInvocationId,\r\n    LocalInvocationIndex,\r\n    WorkGroupId,\r\n    WorkGroupSize,\r\n    NumWorkGroups,\r\n}\r\n\r\n/// Number of bytes per scalar.\r\npub type Bytes = u8;\r\n\r\n/// Number of components in a vector.\r\n#[repr(u8)]\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum VectorSize {\r\n    /// 2D vector\r\n    Bi = 2,\r\n    /// 3D vector\r\n    Tri = 3,\r\n    /// 4D vector\r\n    Quad = 4,\r\n}\r\n\r\n/// Primitive type for a scalar.\r\n#[repr(u8)]\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ScalarKind {\r\n    /// Signed integer type.\r\n    Sint,\r\n    /// Unsigned integer type.\r\n    Uint,\r\n    /// Floating point type.\r\n    Float,\r\n    /// Boolean type.\r\n    Bool,\r\n}\r\n\r\n/// Size of an array.\r\n#[repr(u8)]\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ArraySize {\r\n    /// The array size is constant.\r\n    Constant(Handle<Constant>),\r\n    /// The array size can change at runtime.\r\n    Dynamic,\r\n}\r\n\r\n/// The interpolation qualifier of a binding or struct field.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum Interpolation {\r\n    /// The value will be interpolated in a perspective-correct fashion.\r\n    /// Also known as \"smooth\" in glsl.\r\n    Perspective,\r\n    /// Indicates that linear, non-perspective, correct\r\n    /// interpolation must be used.\r\n    /// Also known as \"no_perspective\" in glsl.\r\n    Linear,\r\n    /// Indicates that no interpolation will be performed.\r\n    Flat,\r\n}\r\n\r\n/// The sampling qualifiers of a binding or struct field.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum Sampling {\r\n    /// Interpolate the value at the center of the pixel.\r\n    Center,\r\n\r\n    /// Interpolate the value at a point that lies within all samples covered by\r\n    /// the fragment within the current primitive. In multisampling, use a\r\n    /// single value for all samples in the primitive.\r\n    Centroid,\r\n\r\n    /// Interpolate the value at each sample location. In multisampling, invoke\r\n    /// the fragment shader once per sample.\r\n    Sample,\r\n}\r\n\r\n/// Member of a user-defined structure.\r\n// Clone is used only for error reporting and is not intended for end users\r\n#[derive(Clone, Debug, Eq, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct StructMember {\r\n    pub name: Option<String>,\r\n    /// Type of the field.\r\n    pub ty: Handle<Type>,\r\n    /// For I/O structs, defines the binding.\r\n    pub binding: Option<Binding>,\r\n    /// Offset from the beginning from the struct.\r\n    pub offset: u32,\r\n}\r\n\r\n/// The number of dimensions an image has.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ImageDimension {\r\n    /// 1D image\r\n    D1,\r\n    /// 2D image\r\n    D2,\r\n    /// 3D image\r\n    D3,\r\n    /// Cube map\r\n    Cube,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Flags describing an image.\r\n    #[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n    #[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\n    #[derive(Default)]\r\n    pub struct StorageAccess: u32 {\r\n        /// Storage can be used as a source for load ops.\r\n        const LOAD = 0x1;\r\n        /// Storage can be used as a target for store ops.\r\n        const STORE = 0x2;\r\n    }\r\n}\r\n\r\n/// Image storage format.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum StorageFormat {\r\n    // 8-bit formats\r\n    R8Unorm,\r\n    R8Snorm,\r\n    R8Uint,\r\n    R8Sint,\r\n\r\n    // 16-bit formats\r\n    R16Uint,\r\n    R16Sint,\r\n    R16Float,\r\n    Rg8Unorm,\r\n    Rg8Snorm,\r\n    Rg8Uint,\r\n    Rg8Sint,\r\n\r\n    // 32-bit formats\r\n    R32Uint,\r\n    R32Sint,\r\n    R32Float,\r\n    Rg16Uint,\r\n    Rg16Sint,\r\n    Rg16Float,\r\n    Rgba8Unorm,\r\n    Rgba8Snorm,\r\n    Rgba8Uint,\r\n    Rgba8Sint,\r\n\r\n    // Packed 32-bit formats\r\n    Rgb10a2Unorm,\r\n    Rg11b10Float,\r\n\r\n    // 64-bit formats\r\n    Rg32Uint,\r\n    Rg32Sint,\r\n    Rg32Float,\r\n    Rgba16Uint,\r\n    Rgba16Sint,\r\n    Rgba16Float,\r\n\r\n    // 128-bit formats\r\n    Rgba32Uint,\r\n    Rgba32Sint,\r\n    Rgba32Float,\r\n}\r\n\r\n/// Sub-class of the image type.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ImageClass {\r\n    /// Regular sampled image.\r\n    Sampled {\r\n        /// Kind of values to sample.\r\n        kind: ScalarKind,\r\n        /// Multi-sampled image.\r\n        ///\r\n        /// A multi-sampled image holds several samples per texel. Multi-sampled\r\n        /// images cannot have mipmaps.\r\n        multi: bool,\r\n    },\r\n    /// Depth comparison image.\r\n    Depth {\r\n        /// Multi-sampled depth image.\r\n        multi: bool,\r\n    },\r\n    /// Storage image.\r\n    Storage {\r\n        format: StorageFormat,\r\n        access: StorageAccess,\r\n    },\r\n}\r\n\r\n/// A data type declared in the module.\r\n#[derive(Debug, Eq, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct Type {\r\n    /// The name of the type, if any.\r\n    pub name: Option<String>,\r\n    /// Inner structure that depends on the kind of the type.\r\n    pub inner: TypeInner,\r\n}\r\n\r\n/// Enum with additional information, depending on the kind of type.\r\n#[derive(Debug, Eq, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum TypeInner {\r\n    /// Number of integral or floating-point kind.\r\n    Scalar { kind: ScalarKind, width: Bytes },\r\n    /// Vector of numbers.\r\n    Vector {\r\n        size: VectorSize,\r\n        kind: ScalarKind,\r\n        width: Bytes,\r\n    },\r\n    /// Matrix of floats.\r\n    Matrix {\r\n        columns: VectorSize,\r\n        rows: VectorSize,\r\n        width: Bytes,\r\n    },\r\n    /// Atomic scalar.\r\n    Atomic { kind: ScalarKind, width: Bytes },\r\n    /// Pointer to another type.\r\n    ///\r\n    /// Pointers to scalars and vectors should be treated as equivalent to\r\n    /// [`ValuePointer`] types. Use the [`TypeInner::equivalent`] method to\r\n    /// compare types in a way that treats pointers correctly.\r\n    ///\r\n    /// ## Pointers to non-`SIZED` types\r\n    ///\r\n    /// The `base` type of a pointer may be a non-[`SIZED`] type like a\r\n    /// dynamically-sized [`Array`], or a [`Struct`] whose last member is a\r\n    /// dynamically sized array. Such pointers occur as the types of\r\n    /// [`GlobalVariable`] or [`AccessIndex`] expressions referring to\r\n    /// dynamically-sized arrays.\r\n    ///\r\n    /// However, among pointers to non-`SIZED` types, only pointers to `Struct`s\r\n    /// are [`DATA`]. Pointers to dynamically sized `Array`s cannot be passed as\r\n    /// arguments, stored in variables, or held in arrays or structures. Their\r\n    /// only use is as the types of `AccessIndex` expressions.\r\n    ///\r\n    /// [`SIZED`]: valid::TypeFlags::SIZED\r\n    /// [`DATA`]: valid::TypeFlags::DATA\r\n    /// [`Array`]: TypeInner::Array\r\n    /// [`Struct`]: TypeInner::Struct\r\n    /// [`ValuePointer`]: TypeInner::ValuePointer\r\n    /// [`GlobalVariable`]: Expression::GlobalVariable\r\n    /// [`AccessIndex`]: Expression::AccessIndex\r\n    Pointer {\r\n        base: Handle<Type>,\r\n        space: AddressSpace,\r\n    },\r\n\r\n    /// Pointer to a scalar or vector.\r\n    ///\r\n    /// A `ValuePointer` type is equivalent to a `Pointer` whose `base` is a\r\n    /// `Scalar` or `Vector` type. This is for use in [`TypeResolution::Value`]\r\n    /// variants; see the documentation for [`TypeResolution`] for details.\r\n    ///\r\n    /// Use the [`TypeInner::equivalent`] method to compare types that could be\r\n    /// pointers, to ensure that `Pointer` and `ValuePointer` types are\r\n    /// recognized as equivalent.\r\n    ///\r\n    /// [`TypeResolution`]: proc::TypeResolution\r\n    /// [`TypeResolution::Value`]: proc::TypeResolution::Value\r\n    ValuePointer {\r\n        size: Option<VectorSize>,\r\n        kind: ScalarKind,\r\n        width: Bytes,\r\n        space: AddressSpace,\r\n    },\r\n\r\n    /// Homogenous list of elements.\r\n    ///\r\n    /// The `base` type must be a [`SIZED`], [`DATA`] type.\r\n    ///\r\n    /// ## Dynamically sized arrays\r\n    ///\r\n    /// An `Array` is [`SIZED`] unless its `size` is [`Dynamic`].\r\n    /// Dynamically-sized arrays may only appear in a few situations:\r\n    ///\r\n    /// -   They may appear as the type of a [`GlobalVariable`], or as the last\r\n    ///     member of a [`Struct`].\r\n    ///\r\n    /// -   They may appear as the base type of a [`Pointer`]. An\r\n    ///     [`AccessIndex`] expression referring to a struct's final\r\n    ///     unsized array member would have such a pointer type. However, such\r\n    ///     pointer types may only appear as the types of such intermediate\r\n    ///     expressions. They are not [`DATA`], and cannot be stored in\r\n    ///     variables, held in arrays or structs, or passed as parameters.\r\n    ///\r\n    /// [`SIZED`]: crate::valid::TypeFlags::SIZED\r\n    /// [`DATA`]: crate::valid::TypeFlags::DATA\r\n    /// [`Dynamic`]: ArraySize::Dynamic\r\n    /// [`Struct`]: TypeInner::Struct\r\n    /// [`Pointer`]: TypeInner::Pointer\r\n    /// [`AccessIndex`]: Expression::AccessIndex\r\n    Array {\r\n        base: Handle<Type>,\r\n        size: ArraySize,\r\n        stride: u32,\r\n    },\r\n\r\n    /// User-defined structure.\r\n    ///\r\n    /// There must always be at least one member.\r\n    ///\r\n    /// A `Struct` type is [`DATA`], and the types of its members must be\r\n    /// `DATA` as well.\r\n    ///\r\n    /// Member types must be [`SIZED`], except for the final member of a\r\n    /// struct, which may be a dynamically sized [`Array`]. The\r\n    /// `Struct` type itself is `SIZED` when all its members are `SIZED`.\r\n    ///\r\n    /// [`DATA`]: crate::valid::TypeFlags::DATA\r\n    /// [`SIZED`]: crate::valid::TypeFlags::SIZED\r\n    /// [`Array`]: TypeInner::Array\r\n    Struct {\r\n        members: Vec<StructMember>,\r\n        //TODO: should this be unaligned?\r\n        span: u32,\r\n    },\r\n    /// Possibly multidimensional array of texels.\r\n    Image {\r\n        dim: ImageDimension,\r\n        arrayed: bool,\r\n        //TODO: consider moving `multisampled: bool` out\r\n        class: ImageClass,\r\n    },\r\n    /// Can be used to sample values from images.\r\n    Sampler { comparison: bool },\r\n\r\n    /// Array of bindings.\r\n    ///\r\n    /// A `BindingArray` represents an array where each element draws its value\r\n    /// from a separate bound resource. The array's element type `base` may be\r\n    /// [`Image`], [`Sampler`], or any type that would be permitted for a global\r\n    /// in the [`Uniform`] or [`Storage`] address spaces. Only global variables\r\n    /// may be binding arrays; on the host side, their values are provided by\r\n    /// [`TextureViewArray`], [`SamplerArray`], or [`BufferArray`]\r\n    /// bindings.\r\n    ///\r\n    /// Since each element comes from a distinct resource, a binding array of\r\n    /// images could have images of varying sizes (but not varying dimensions;\r\n    /// they must all have the same `Image` type). Or, a binding array of\r\n    /// buffers could have elements that are dynamically sized arrays, each with\r\n    /// a different length.\r\n    ///\r\n    /// Binding arrays are not [`DATA`]. This means that all binding array\r\n    /// globals must be placed in the [`Handle`] address space. Referring to\r\n    /// such a global produces a `BindingArray` value directly; there are never\r\n    /// pointers to binding arrays. The only operation permitted on\r\n    /// `BindingArray` values is indexing, which yields the element by value,\r\n    /// not a pointer to the element. (This means that buffer array contents\r\n    /// cannot be stored to; [naga#1864] covers lifting this restriction.)\r\n    ///\r\n    /// Unlike textures and samplers, binding arrays are not [`ARGUMENT`], so\r\n    /// they cannot be passed as arguments to functions.\r\n    ///\r\n    /// Naga's WGSL front end supports binding arrays with the type syntax\r\n    /// `binding_array<T, N>`.\r\n    ///\r\n    /// [`Image`]: TypeInner::Image\r\n    /// [`Sampler`]: TypeInner::Sampler\r\n    /// [`Uniform`]: AddressSpace::Uniform\r\n    /// [`Storage`]: AddressSpace::Storage\r\n    /// [`TextureViewArray`]: https://docs.rs/wgpu/latest/wgpu/enum.BindingResource.html#variant.TextureViewArray\r\n    /// [`SamplerArray`]: https://docs.rs/wgpu/latest/wgpu/enum.BindingResource.html#variant.SamplerArray\r\n    /// [`BufferArray`]: https://docs.rs/wgpu/latest/wgpu/enum.BindingResource.html#variant.BufferArray\r\n    /// [`DATA`]: crate::valid::TypeFlags::DATA\r\n    /// [`Handle`]: AddressSpace::Handle\r\n    /// [`ARGUMENT`]: crate::valid::TypeFlags::ARGUMENT\r\n    /// [naga#1864]: https://github.com/gfx-rs/naga/issues/1864\r\n    BindingArray { base: Handle<Type>, size: ArraySize },\r\n}\r\n\r\n/// Constant value.\r\n#[derive(Debug, PartialEq)]\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct Constant {\r\n    pub name: Option<String>,\r\n    pub specialization: Option<u32>,\r\n    pub inner: ConstantInner,\r\n}\r\n\r\n/// A literal scalar value, used in constants.\r\n#[derive(Debug, Clone, Copy, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ScalarValue {\r\n    Sint(i64),\r\n    Uint(u64),\r\n    Float(f64),\r\n    Bool(bool),\r\n}\r\n\r\n/// Additional information, dependent on the kind of constant.\r\n#[derive(Clone, Debug, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ConstantInner {\r\n    Scalar {\r\n        width: Bytes,\r\n        value: ScalarValue,\r\n    },\r\n    Composite {\r\n        ty: Handle<Type>,\r\n        components: Vec<Handle<Constant>>,\r\n    },\r\n}\r\n\r\n/// Describes how an input/output variable is to be bound.\r\n#[derive(Clone, Debug, Eq, PartialEq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum Binding {\r\n    /// Built-in shader variable.\r\n    BuiltIn(BuiltIn),\r\n\r\n    /// Indexed location.\r\n    ///\r\n    /// Values passed from the [`Vertex`] stage to the [`Fragment`] stage must\r\n    /// have their `interpolation` defaulted (i.e. not `None`) by the front end\r\n    /// as appropriate for that language.\r\n    ///\r\n    /// For other stages, we permit interpolations even though they're ignored.\r\n    /// When a front end is parsing a struct type, it usually doesn't know what\r\n    /// stages will be using it for IO, so it's easiest if it can apply the\r\n    /// defaults to anything with a `Location` binding, just in case.\r\n    ///\r\n    /// For anything other than floating-point scalars and vectors, the\r\n    /// interpolation must be `Flat`.\r\n    ///\r\n    /// [`Vertex`]: crate::ShaderStage::Vertex\r\n    /// [`Fragment`]: crate::ShaderStage::Fragment\r\n    Location {\r\n        location: u32,\r\n        interpolation: Option<Interpolation>,\r\n        sampling: Option<Sampling>,\r\n    },\r\n}\r\n\r\n/// Pipeline binding information for global resources.\r\n#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct ResourceBinding {\r\n    /// The bind group index.\r\n    pub group: u32,\r\n    /// Binding number within the group.\r\n    pub binding: u32,\r\n}\r\n\r\n/// Variable defined at module level.\r\n#[derive(Clone, Debug, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct GlobalVariable {\r\n    /// Name of the variable, if any.\r\n    pub name: Option<String>,\r\n    /// How this variable is to be stored.\r\n    pub space: AddressSpace,\r\n    /// For resources, defines the binding point.\r\n    pub binding: Option<ResourceBinding>,\r\n    /// The type of this variable.\r\n    pub ty: Handle<Type>,\r\n    /// Initial value for this variable.\r\n    pub init: Option<Handle<Constant>>,\r\n}\r\n\r\n/// Variable defined at function level.\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct LocalVariable {\r\n    /// Name of the variable, if any.\r\n    pub name: Option<String>,\r\n    /// The type of this variable.\r\n    pub ty: Handle<Type>,\r\n    /// Initial value for this variable.\r\n    pub init: Option<Handle<Constant>>,\r\n}\r\n\r\n/// Operation that can be applied on a single value.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum UnaryOperator {\r\n    Negate,\r\n    Not,\r\n}\r\n\r\n/// Operation that can be applied on two values.\r\n///\r\n/// ## Arithmetic type rules\r\n///\r\n/// The arithmetic operations `Add`, `Subtract`, `Multiply`, `Divide`, and\r\n/// `Modulo` can all be applied to [`Scalar`] types other than [`Bool`], or\r\n/// [`Vector`]s thereof. Both operands must have the same type.\r\n///\r\n/// `Add` and `Subtract` can also be applied to [`Matrix`] values. Both operands\r\n/// must have the same type.\r\n///\r\n/// `Multiply` supports additional cases:\r\n///\r\n/// -   A [`Matrix`] or [`Vector`] can be multiplied by a scalar [`Float`],\r\n///     either on the left or the right.\r\n///\r\n/// -   A [`Matrix`] on the left can be multiplied by a [`Vector`] on the right\r\n///     if the matrix has as many columns as the vector has components (`matCxR\r\n///     * VecC`).\r\n///\r\n/// -   A [`Vector`] on the left can be multiplied by a [`Matrix`] on the right\r\n///     if the matrix has as many rows as the vector has components (`VecR *\r\n///     matCxR`).\r\n///\r\n/// -   Two matrices can be multiplied if the left operand has as many columns\r\n///     as the right operand has rows (`matNxR * matCxN`).\r\n///\r\n/// In all the above `Multiply` cases, the byte widths of the underlying scalar\r\n/// types of both operands must be the same.\r\n///\r\n/// Note that `Multiply` supports mixed vector and scalar operations directly,\r\n/// whereas the other arithmetic operations require an explicit [`Splat`] for\r\n/// mixed-type use.\r\n///\r\n/// [`Scalar`]: TypeInner::Scalar\r\n/// [`Vector`]: TypeInner::Vector\r\n/// [`Matrix`]: TypeInner::Matrix\r\n/// [`Float`]: ScalarKind::Float\r\n/// [`Bool`]: ScalarKind::Bool\r\n/// [`Splat`]: Expression::Splat\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum BinaryOperator {\r\n    Add,\r\n    Subtract,\r\n    Multiply,\r\n    Divide,\r\n    /// Equivalent of the WGSL's `%` operator or SPIR-V's `OpFRem`\r\n    Modulo,\r\n    Equal,\r\n    NotEqual,\r\n    Less,\r\n    LessEqual,\r\n    Greater,\r\n    GreaterEqual,\r\n    And,\r\n    ExclusiveOr,\r\n    InclusiveOr,\r\n    LogicalAnd,\r\n    LogicalOr,\r\n    ShiftLeft,\r\n    /// Right shift carries the sign of signed integers only.\r\n    ShiftRight,\r\n}\r\n\r\n/// Function on an atomic value.\r\n///\r\n/// Note: these do not include load/store, which use the existing\r\n/// [`Expression::Load`] and [`Statement::Store`].\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum AtomicFunction {\r\n    Add,\r\n    Subtract,\r\n    And,\r\n    ExclusiveOr,\r\n    InclusiveOr,\r\n    Min,\r\n    Max,\r\n    Exchange { compare: Option<Handle<Expression>> },\r\n}\r\n\r\n/// Axis on which to compute a derivative.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum DerivativeAxis {\r\n    X,\r\n    Y,\r\n    Width,\r\n}\r\n\r\n/// Built-in shader function for testing relation between values.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum RelationalFunction {\r\n    All,\r\n    Any,\r\n    IsNan,\r\n    IsInf,\r\n    IsFinite,\r\n    IsNormal,\r\n}\r\n\r\n/// Built-in shader function for math.\r\n#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum MathFunction {\r\n    // comparison\r\n    Abs,\r\n    Min,\r\n    Max,\r\n    Clamp,\r\n    Saturate,\r\n    // trigonometry\r\n    Cos,\r\n    Cosh,\r\n    Sin,\r\n    Sinh,\r\n    Tan,\r\n    Tanh,\r\n    Acos,\r\n    Asin,\r\n    Atan,\r\n    Atan2,\r\n    Asinh,\r\n    Acosh,\r\n    Atanh,\r\n    Radians,\r\n    Degrees,\r\n    // decomposition\r\n    Ceil,\r\n    Floor,\r\n    Round,\r\n    Fract,\r\n    Trunc,\r\n    Modf,\r\n    Frexp,\r\n    Ldexp,\r\n    // exponent\r\n    Exp,\r\n    Exp2,\r\n    Log,\r\n    Log2,\r\n    Pow,\r\n    // geometry\r\n    Dot,\r\n    Outer,\r\n    Cross,\r\n    Distance,\r\n    Length,\r\n    Normalize,\r\n    FaceForward,\r\n    Reflect,\r\n    Refract,\r\n    // computational\r\n    Sign,\r\n    Fma,\r\n    Mix,\r\n    Step,\r\n    SmoothStep,\r\n    Sqrt,\r\n    InverseSqrt,\r\n    Inverse,\r\n    Transpose,\r\n    Determinant,\r\n    // bits\r\n    CountOneBits,\r\n    ReverseBits,\r\n    ExtractBits,\r\n    InsertBits,\r\n    FindLsb,\r\n    FindMsb,\r\n    // data packing\r\n    Pack4x8snorm,\r\n    Pack4x8unorm,\r\n    Pack2x16snorm,\r\n    Pack2x16unorm,\r\n    Pack2x16float,\r\n    // data unpacking\r\n    Unpack4x8snorm,\r\n    Unpack4x8unorm,\r\n    Unpack2x16snorm,\r\n    Unpack2x16unorm,\r\n    Unpack2x16float,\r\n}\r\n\r\n/// Sampling modifier to control the level of detail.\r\n#[derive(Clone, Copy, Debug, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum SampleLevel {\r\n    Auto,\r\n    Zero,\r\n    Exact(Handle<Expression>),\r\n    Bias(Handle<Expression>),\r\n    Gradient {\r\n        x: Handle<Expression>,\r\n        y: Handle<Expression>,\r\n    },\r\n}\r\n\r\n/// Type of an image query.\r\n#[derive(Clone, Copy, Debug, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum ImageQuery {\r\n    /// Get the size at the specified level.\r\n    Size {\r\n        /// If `None`, the base level is considered.\r\n        level: Option<Handle<Expression>>,\r\n    },\r\n    /// Get the number of mipmap levels.\r\n    NumLevels,\r\n    /// Get the number of array layers.\r\n    NumLayers,\r\n    /// Get the number of samples.\r\n    NumSamples,\r\n}\r\n\r\n/// Component selection for a vector swizzle.\r\n#[repr(u8)]\r\n#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum SwizzleComponent {\r\n    ///\r\n    X = 0,\r\n    ///\r\n    Y = 1,\r\n    ///\r\n    Z = 2,\r\n    ///\r\n    W = 3,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Memory barrier flags.\r\n    #[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n    #[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\n    #[derive(Default)]\r\n    pub struct Barrier: u32 {\r\n        /// Barrier affects all `AddressSpace::Storage` accesses.\r\n        const STORAGE = 0x1;\r\n        /// Barrier affects all `AddressSpace::WorkGroup` accesses.\r\n        const WORK_GROUP = 0x2;\r\n    }\r\n}\r\n\r\n/// An expression that can be evaluated to obtain a value.\r\n///\r\n/// This is a Single Static Assignment (SSA) scheme similar to SPIR-V.\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum Expression {\r\n    /// Array access with a computed index.\r\n    ///\r\n    /// ## Typing rules\r\n    ///\r\n    /// The `base` operand must be some composite type: [`Vector`], [`Matrix`],\r\n    /// [`Array`], a [`Pointer`] to one of those, or a [`ValuePointer`] with a\r\n    /// `size`.\r\n    ///\r\n    /// The `index` operand must be an integer, signed or unsigned.\r\n    ///\r\n    /// Indexing a [`Vector`] or [`Array`] produces a value of its element type.\r\n    /// Indexing a [`Matrix`] produces a [`Vector`].\r\n    ///\r\n    /// Indexing a [`Pointer`] to any of the above produces a pointer to the\r\n    /// element/component type, in the same [`space`]. In the case of [`Array`],\r\n    /// the result is an actual [`Pointer`], but for vectors and matrices, there\r\n    /// may not be any type in the arena representing the component's type, so\r\n    /// those produce [`ValuePointer`] types equivalent to the appropriate\r\n    /// [`Pointer`].\r\n    ///\r\n    /// ## Dynamic indexing restrictions\r\n    ///\r\n    /// To accommodate restrictions in some of the shader languages that Naga\r\n    /// targets, it is not permitted to subscript a matrix or array with a\r\n    /// dynamically computed index unless that matrix or array appears behind a\r\n    /// pointer. In other words, if the inner type of `base` is [`Array`] or\r\n    /// [`Matrix`], then `index` must be a constant. But if the type of `base`\r\n    /// is a [`Pointer`] to an array or matrix or a [`ValuePointer`] with a\r\n    /// `size`, then the index may be any expression of integer type.\r\n    ///\r\n    /// You can use the [`Expression::is_dynamic_index`] method to determine\r\n    /// whether a given index expression requires matrix or array base operands\r\n    /// to be behind a pointer.\r\n    ///\r\n    /// (It would be simpler to always require the use of `AccessIndex` when\r\n    /// subscripting arrays and matrices that are not behind pointers, but to\r\n    /// accommodate existing front ends, Naga also permits `Access`, with a\r\n    /// restricted `index`.)\r\n    ///\r\n    /// [`Vector`]: TypeInner::Vector\r\n    /// [`Matrix`]: TypeInner::Matrix\r\n    /// [`Array`]: TypeInner::Array\r\n    /// [`Pointer`]: TypeInner::Pointer\r\n    /// [`space`]: TypeInner::Pointer::space\r\n    /// [`ValuePointer`]: TypeInner::ValuePointer\r\n    /// [`Float`]: ScalarKind::Float\r\n    Access {\r\n        base: Handle<Expression>,\r\n        index: Handle<Expression>,\r\n    },\r\n    /// Access the same types as [`Access`], plus [`Struct`] with a known index.\r\n    ///\r\n    /// [`Access`]: Expression::Access\r\n    /// [`Struct`]: TypeInner::Struct\r\n    AccessIndex {\r\n        base: Handle<Expression>,\r\n        index: u32,\r\n    },\r\n    /// Constant value.\r\n    Constant(Handle<Constant>),\r\n    /// Splat scalar into a vector.\r\n    Splat {\r\n        size: VectorSize,\r\n        value: Handle<Expression>,\r\n    },\r\n    /// Vector swizzle.\r\n    Swizzle {\r\n        size: VectorSize,\r\n        vector: Handle<Expression>,\r\n        pattern: [SwizzleComponent; 4],\r\n    },\r\n    /// Composite expression.\r\n    Compose {\r\n        ty: Handle<Type>,\r\n        components: Vec<Handle<Expression>>,\r\n    },\r\n\r\n    /// Reference a function parameter, by its index.\r\n    ///\r\n    /// A `FunctionArgument` expression evaluates to a pointer to the argument's\r\n    /// value. You must use a [`Load`] expression to retrieve its value, or a\r\n    /// [`Store`] statement to assign it a new value.\r\n    ///\r\n    /// [`Load`]: Expression::Load\r\n    /// [`Store`]: Statement::Store\r\n    FunctionArgument(u32),\r\n\r\n    /// Reference a global variable.\r\n    ///\r\n    /// If the given `GlobalVariable`'s [`space`] is [`AddressSpace::Handle`],\r\n    /// then the variable stores some opaque type like a sampler or an image,\r\n    /// and a `GlobalVariable` expression referring to it produces the\r\n    /// variable's value directly.\r\n    ///\r\n    /// For any other address space, a `GlobalVariable` expression produces a\r\n    /// pointer to the variable's value. You must use a [`Load`] expression to\r\n    /// retrieve its value, or a [`Store`] statement to assign it a new value.\r\n    ///\r\n    /// [`space`]: GlobalVariable::space\r\n    /// [`Load`]: Expression::Load\r\n    /// [`Store`]: Statement::Store\r\n    GlobalVariable(Handle<GlobalVariable>),\r\n\r\n    /// Reference a local variable.\r\n    ///\r\n    /// A `LocalVariable` expression evaluates to a pointer to the variable's value.\r\n    /// You must use a [`Load`](Expression::Load) expression to retrieve its value,\r\n    /// or a [`Store`](Statement::Store) statement to assign it a new value.\r\n    LocalVariable(Handle<LocalVariable>),\r\n\r\n    /// Load a value indirectly.\r\n    ///\r\n    /// For [`TypeInner::Atomic`] the result is a corresponding scalar.\r\n    /// For other types behind the pointer<T>, the result is T.\r\n    Load { pointer: Handle<Expression> },\r\n    /// Sample a point from a sampled or a depth image.\r\n    ImageSample {\r\n        image: Handle<Expression>,\r\n        sampler: Handle<Expression>,\r\n        /// If Some(), this operation is a gather operation\r\n        /// on the selected component.\r\n        gather: Option<SwizzleComponent>,\r\n        coordinate: Handle<Expression>,\r\n        array_index: Option<Handle<Expression>>,\r\n        offset: Option<Handle<Constant>>,\r\n        level: SampleLevel,\r\n        depth_ref: Option<Handle<Expression>>,\r\n    },\r\n\r\n    /// Load a texel from an image.\r\n    ///\r\n    /// For most images, this returns a four-element vector of the same\r\n    /// [`ScalarKind`] as the image. If the format of the image does not have\r\n    /// four components, default values are provided: the first three components\r\n    /// (typically R, G, and B) default to zero, and the final component\r\n    /// (typically alpha) defaults to one.\r\n    ///\r\n    /// However, if the image's [`class`] is [`Depth`], then this returns a\r\n    /// [`Float`] scalar value.\r\n    ///\r\n    /// [`ScalarKind`]: ScalarKind\r\n    /// [`class`]: TypeInner::Image::class\r\n    /// [`Depth`]: ImageClass::Depth\r\n    /// [`Float`]: ScalarKind::Float\r\n    ImageLoad {\r\n        /// The image to load a texel from. This must have type [`Image`]. (This\r\n        /// will necessarily be a [`GlobalVariable`] or [`FunctionArgument`]\r\n        /// expression, since no other expressions are allowed to have that\r\n        /// type.)\r\n        ///\r\n        /// [`Image`]: TypeInner::Image\r\n        /// [`GlobalVariable`]: Expression::GlobalVariable\r\n        /// [`FunctionArgument`]: Expression::FunctionArgument\r\n        image: Handle<Expression>,\r\n\r\n        /// The coordinate of the texel we wish to load. This must be a scalar\r\n        /// for [`D1`] images, a [`Bi`] vector for [`D2`] images, and a [`Tri`]\r\n        /// vector for [`D3`] images. (Array indices, sample indices, and\r\n        /// explicit level-of-detail values are supplied separately.) Its\r\n        /// component type must be [`Sint`].\r\n        ///\r\n        /// [`D1`]: ImageDimension::D1\r\n        /// [`D2`]: ImageDimension::D2\r\n        /// [`D3`]: ImageDimension::D3\r\n        /// [`Bi`]: VectorSize::Bi\r\n        /// [`Tri`]: VectorSize::Tri\r\n        /// [`Sint`]: ScalarKind::Sint\r\n        coordinate: Handle<Expression>,\r\n\r\n        /// The index into an arrayed image. If the [`arrayed`] flag in\r\n        /// `image`'s type is `true`, then this must be `Some(expr)`, where\r\n        /// `expr` is a [`Sint`] scalar. Otherwise, it must be `None`.\r\n        ///\r\n        /// [`arrayed`]: TypeInner::Image::arrayed\r\n        /// [`Sint`]: ScalarKind::Sint\r\n        array_index: Option<Handle<Expression>>,\r\n\r\n        /// A sample index, for multisampled [`Sampled`] and [`Depth`] images.\r\n        ///\r\n        /// [`Sampled`]: ImageClass::Sampled\r\n        /// [`Depth`]: ImageClass::Depth\r\n        sample: Option<Handle<Expression>>,\r\n\r\n        /// A level of detail, for mipmapped images.\r\n        ///\r\n        /// This must be present when accessing non-multisampled\r\n        /// [`Sampled`] and [`Depth`] images, even if only the\r\n        /// full-resolution level is present (in which case the only\r\n        /// valid level is zero).\r\n        ///\r\n        /// [`Sampled`]: ImageClass::Sampled\r\n        /// [`Depth`]: ImageClass::Depth\r\n        level: Option<Handle<Expression>>,\r\n    },\r\n\r\n    /// Query information from an image.\r\n    ImageQuery {\r\n        image: Handle<Expression>,\r\n        query: ImageQuery,\r\n    },\r\n    /// Apply an unary operator.\r\n    Unary {\r\n        op: UnaryOperator,\r\n        expr: Handle<Expression>,\r\n    },\r\n    /// Apply a binary operator.\r\n    Binary {\r\n        op: BinaryOperator,\r\n        left: Handle<Expression>,\r\n        right: Handle<Expression>,\r\n    },\r\n    /// Select between two values based on a condition.\r\n    ///\r\n    /// Note that, because expressions have no side effects, it is unobservable\r\n    /// whether the non-selected branch is evaluated.\r\n    Select {\r\n        /// Boolean expression\r\n        condition: Handle<Expression>,\r\n        accept: Handle<Expression>,\r\n        reject: Handle<Expression>,\r\n    },\r\n    /// Compute the derivative on an axis.\r\n    Derivative {\r\n        axis: DerivativeAxis,\r\n        //modifier,\r\n        expr: Handle<Expression>,\r\n    },\r\n    /// Call a relational function.\r\n    Relational {\r\n        fun: RelationalFunction,\r\n        argument: Handle<Expression>,\r\n    },\r\n    /// Call a math function\r\n    Math {\r\n        fun: MathFunction,\r\n        arg: Handle<Expression>,\r\n        arg1: Option<Handle<Expression>>,\r\n        arg2: Option<Handle<Expression>>,\r\n        arg3: Option<Handle<Expression>>,\r\n    },\r\n    /// Cast a simple type to another kind.\r\n    As {\r\n        /// Source expression, which can only be a scalar or a vector.\r\n        expr: Handle<Expression>,\r\n        /// Target scalar kind.\r\n        kind: ScalarKind,\r\n        /// If provided, converts to the specified byte width.\r\n        /// Otherwise, bitcast.\r\n        convert: Option<Bytes>,\r\n    },\r\n    /// Result of calling another function.\r\n    CallResult(Handle<Function>),\r\n    /// Result of an atomic operation.\r\n    AtomicResult {\r\n        kind: ScalarKind,\r\n        width: Bytes,\r\n        comparison: bool,\r\n    },\r\n    /// Get the length of an array.\r\n    /// The expression must resolve to a pointer to an array with a dynamic size.\r\n    ///\r\n    /// This doesn't match the semantics of spirv's `OpArrayLength`, which must be passed\r\n    /// a pointer to a structure containing a runtime array in its' last field.\r\n    ArrayLength(Handle<Expression>),\r\n}\r\n\r\npub use block::Block;\r\n\r\n/// The value of the switch case.\r\n// Clone is used only for error reporting and is not intended for end users\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum SwitchValue {\r\n    Integer(i32),\r\n    Default,\r\n}\r\n\r\n/// A case for a switch statement.\r\n// Clone is used only for error reporting and is not intended for end users\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct SwitchCase {\r\n    /// Value, upon which the case is considered true.\r\n    pub value: SwitchValue,\r\n    /// Body of the case.\r\n    pub body: Block,\r\n    /// If true, the control flow continues to the next case in the list,\r\n    /// or default.\r\n    pub fall_through: bool,\r\n}\r\n\r\n//TODO: consider removing `Clone`. It's not valid to clone `Statement::Emit` anyway.\r\n/// Instructions which make up an executable block.\r\n// Clone is used only for error reporting and is not intended for end users\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub enum Statement {\r\n    /// Emit a range of expressions, visible to all statements that follow in this block.\r\n    ///\r\n    /// See the [module-level documentation][emit] for details.\r\n    ///\r\n    /// [emit]: index.html#expression-evaluation-time\r\n    Emit(Range<Expression>),\r\n    /// A block containing more statements, to be executed sequentially.\r\n    Block(Block),\r\n    /// Conditionally executes one of two blocks, based on the value of the condition.\r\n    If {\r\n        condition: Handle<Expression>, //bool\r\n        accept: Block,\r\n        reject: Block,\r\n    },\r\n    /// Conditionally executes one of multiple blocks, based on the value of the selector.\r\n    Switch {\r\n        selector: Handle<Expression>, //int\r\n        cases: Vec<SwitchCase>,\r\n    },\r\n\r\n    /// Executes a block repeatedly.\r\n    ///\r\n    /// Each iteration of the loop executes the `body` block, followed by the\r\n    /// `continuing` block.\r\n    ///\r\n    /// Executing a [`Break`], [`Return`] or [`Kill`] statement exits the loop.\r\n    ///\r\n    /// A [`Continue`] statement in `body` jumps to the `continuing` block. The\r\n    /// `continuing` block is meant to be used to represent structures like the\r\n    /// third expression of a C-style `for` loop head, to which `continue`\r\n    /// statements in the loop's body jump.\r\n    ///\r\n    /// The `continuing` block and its substatements must not contain `Return`\r\n    /// or `Kill` statements, or any `Break` or `Continue` statements targeting\r\n    /// this loop. (It may have `Break` and `Continue` statements targeting\r\n    /// loops or switches nested within the `continuing` block.)\r\n    ///\r\n    /// If present, `break_if` is an expression which is evaluated after the\r\n    /// continuing block. If its value is true, control continues after the\r\n    /// `Loop` statement, rather than branching back to the top of body as\r\n    /// usual. The `break_if` expression corresponds to a \"break if\" statement\r\n    /// in WGSL, or a loop whose back edge is an `OpBranchConditional`\r\n    /// instruction in SPIR-V.\r\n    ///\r\n    /// [`Break`]: Statement::Break\r\n    /// [`Continue`]: Statement::Continue\r\n    /// [`Kill`]: Statement::Kill\r\n    /// [`Return`]: Statement::Return\r\n    /// [`break if`]: Self::Loop::break_if\r\n    Loop {\r\n        body: Block,\r\n        continuing: Block,\r\n        break_if: Option<Handle<Expression>>,\r\n    },\r\n\r\n    /// Exits the innermost enclosing [`Loop`] or [`Switch`].\r\n    ///\r\n    /// A `Break` statement may only appear within a [`Loop`] or [`Switch`]\r\n    /// statement. It may not break out of a [`Loop`] from within the loop's\r\n    /// `continuing` block.\r\n    ///\r\n    /// [`Loop`]: Statement::Loop\r\n    /// [`Switch`]: Statement::Switch\r\n    Break,\r\n\r\n    /// Skips to the `continuing` block of the innermost enclosing [`Loop`].\r\n    ///\r\n    /// A `Continue` statement may only appear within the `body` block of the\r\n    /// innermost enclosing [`Loop`] statement. It must not appear within that\r\n    /// loop's `continuing` block.\r\n    ///\r\n    /// [`Loop`]: Statement::Loop\r\n    Continue,\r\n\r\n    /// Returns from the function (possibly with a value).\r\n    ///\r\n    /// `Return` statements are forbidden within the `continuing` block of a\r\n    /// [`Loop`] statement.\r\n    ///\r\n    /// [`Loop`]: Statement::Loop\r\n    Return { value: Option<Handle<Expression>> },\r\n\r\n    /// Aborts the current shader execution.\r\n    ///\r\n    /// `Kill` statements are forbidden within the `continuing` block of a\r\n    /// [`Loop`] statement.\r\n    ///\r\n    /// [`Loop`]: Statement::Loop\r\n    Kill,\r\n\r\n    /// Synchronize invocations within the work group.\r\n    /// The `Barrier` flags control which memory accesses should be synchronized.\r\n    /// If empty, this becomes purely an execution barrier.\r\n    Barrier(Barrier),\r\n    /// Stores a value at an address.\r\n    ///\r\n    /// For [`TypeInner::Atomic`] type behind the pointer, the value\r\n    /// has to be a corresponding scalar.\r\n    /// For other types behind the pointer<T>, the value is T.\r\n    ///\r\n    /// This statement is a barrier for any operations on the\r\n    /// `Expression::LocalVariable` or `Expression::GlobalVariable`\r\n    /// that is the destination of an access chain, started\r\n    /// from the `pointer`.\r\n    Store {\r\n        pointer: Handle<Expression>,\r\n        value: Handle<Expression>,\r\n    },\r\n    /// Stores a texel value to an image.\r\n    ///\r\n    /// The `image`, `coordinate`, and `array_index` fields have the same\r\n    /// meanings as the corresponding operands of an [`ImageLoad`] expression;\r\n    /// see that documentation for details. Storing into multisampled images or\r\n    /// images with mipmaps is not supported, so there are no `level` or\r\n    /// `sample` operands.\r\n    ///\r\n    /// This statement is a barrier for any operations on the corresponding\r\n    /// [`Expression::GlobalVariable`] for this image.\r\n    ///\r\n    /// [`ImageLoad`]: Expression::ImageLoad\r\n    ImageStore {\r\n        image: Handle<Expression>,\r\n        coordinate: Handle<Expression>,\r\n        array_index: Option<Handle<Expression>>,\r\n        value: Handle<Expression>,\r\n    },\r\n    /// Atomic function.\r\n    Atomic {\r\n        /// Pointer to an atomic value.\r\n        pointer: Handle<Expression>,\r\n        /// Function to run on the atomic.\r\n        fun: AtomicFunction,\r\n        /// Value to use in the function.\r\n        value: Handle<Expression>,\r\n        /// [`AtomicResult`] expression representing this function's result.\r\n        ///\r\n        /// [`AtomicResult`]: crate::Expression::AtomicResult\r\n        result: Handle<Expression>,\r\n    },\r\n    /// Calls a function.\r\n    ///\r\n    /// If the `result` is `Some`, the corresponding expression has to be\r\n    /// `Expression::CallResult`, and this statement serves as a barrier for any\r\n    /// operations on that expression.\r\n    Call {\r\n        function: Handle<Function>,\r\n        arguments: Vec<Handle<Expression>>,\r\n        result: Option<Handle<Expression>>,\r\n    },\r\n}\r\n\r\n/// A function argument.\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct FunctionArgument {\r\n    /// Name of the argument, if any.\r\n    pub name: Option<String>,\r\n    /// Type of the argument.\r\n    pub ty: Handle<Type>,\r\n    /// For entry points, an argument has to have a binding\r\n    /// unless it's a structure.\r\n    pub binding: Option<Binding>,\r\n}\r\n\r\n/// A function result.\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct FunctionResult {\r\n    /// Type of the result.\r\n    pub ty: Handle<Type>,\r\n    /// For entry points, the result has to have a binding\r\n    /// unless it's a structure.\r\n    pub binding: Option<Binding>,\r\n}\r\n\r\n/// A function defined in the module.\r\n#[derive(Debug, Default)]\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct Function {\r\n    /// Name of the function, if any.\r\n    pub name: Option<String>,\r\n    /// Information about function argument.\r\n    pub arguments: Vec<FunctionArgument>,\r\n    /// The result of this function, if any.\r\n    pub result: Option<FunctionResult>,\r\n    /// Local variables defined and used in the function.\r\n    pub local_variables: Arena<LocalVariable>,\r\n    /// Expressions used inside this function.\r\n    ///\r\n    /// An `Expression` must occur before all other `Expression`s that use its\r\n    /// value.\r\n    pub expressions: Arena<Expression>,\r\n    /// Map of expressions that have associated variable names\r\n    pub named_expressions: NamedExpressions,\r\n    /// Block of instructions comprising the body of the function.\r\n    pub body: Block,\r\n}\r\n\r\n/// The main function for a pipeline stage.\r\n///\r\n/// An [`EntryPoint`] is a [`Function`] that serves as the main function for a\r\n/// graphics or compute pipeline stage. For example, an `EntryPoint` whose\r\n/// [`stage`] is [`ShaderStage::Vertex`] can serve as a graphics pipeline's\r\n/// vertex shader.\r\n///\r\n/// Since an entry point is called directly by the graphics or compute pipeline,\r\n/// not by other WGSL functions, you must specify what the pipeline should pass\r\n/// as the entry point's arguments, and what values it will return. For example,\r\n/// a vertex shader needs a vertex's attributes as its arguments, but if it's\r\n/// used for instanced draw calls, it will also want to know the instance id.\r\n/// The vertex shader's return value will usually include an output vertex\r\n/// position, and possibly other attributes to be interpolated and passed along\r\n/// to a fragment shader.\r\n///\r\n/// To specify this, the arguments and result of an `EntryPoint`'s [`function`]\r\n/// must each have a [`Binding`], or be structs whose members all have\r\n/// `Binding`s. This associates every value passed to or returned from the entry\r\n/// point with either a [`BuiltIn`] or a [`Location`]:\r\n///\r\n/// -   A [`BuiltIn`] has special semantics, usually specific to its pipeline\r\n///     stage. For example, the result of a vertex shader can include a\r\n///     [`BuiltIn::Position`] value, which determines the position of a vertex\r\n///     of a rendered primitive. Or, a compute shader might take an argument\r\n///     whose binding is [`BuiltIn::WorkGroupSize`], through which the compute\r\n///     pipeline would pass the number of invocations in your workgroup.\r\n///\r\n/// -   A [`Location`] indicates user-defined IO to be passed from one pipeline\r\n///     stage to the next. For example, a vertex shader might also produce a\r\n///     `uv` texture location as a user-defined IO value.\r\n///\r\n/// In other words, the pipeline stage's input and output interface are\r\n/// determined by the bindings of the arguments and result of the `EntryPoint`'s\r\n/// [`function`].\r\n///\r\n/// [`Function`]: crate::Function\r\n/// [`Location`]: Binding::Location\r\n/// [`function`]: EntryPoint::function\r\n/// [`stage`]: EntryPoint::stage\r\n#[derive(Debug)]\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct EntryPoint {\r\n    /// Name of this entry point, visible externally.\r\n    ///\r\n    /// Entry point names for a given `stage` must be distinct within a module.\r\n    pub name: String,\r\n    /// Shader stage.\r\n    pub stage: ShaderStage,\r\n    /// Early depth test for fragment stages.\r\n    pub early_depth_test: Option<EarlyDepthTest>,\r\n    /// Workgroup size for compute stages\r\n    pub workgroup_size: [u32; 3],\r\n    /// The entrance function.\r\n    pub function: Function,\r\n}\r\n\r\n/// Shader module.\r\n///\r\n/// A module is a set of constants, global variables and functions, as well as\r\n/// the types required to define them.\r\n///\r\n/// Some functions are marked as entry points, to be used in a certain shader stage.\r\n///\r\n/// To create a new module, use the `Default` implementation.\r\n/// Alternatively, you can load an existing shader using one of the [available front ends][front].\r\n///\r\n/// When finished, you can export modules using one of the [available backends][back].\r\n#[derive(Debug, Default)]\r\n#[cfg_attr(feature = \"clone\", derive(Clone))]\r\n#[cfg_attr(feature = \"serialize\", derive(Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(Deserialize))]\r\n#[cfg_attr(feature = \"arbitrary\", derive(Arbitrary))]\r\npub struct Module {\r\n    /// Arena for the types defined in this module.\r\n    pub types: UniqueArena<Type>,\r\n    /// Arena for the constants defined in this module.\r\n    pub constants: Arena<Constant>,\r\n    /// Arena for the global variables defined in this module.\r\n    pub global_variables: Arena<GlobalVariable>,\r\n    /// Arena for the functions defined in this module.\r\n    ///\r\n    /// Each function must appear in this arena strictly before all its callers.\r\n    /// Recursion is not supported.\r\n    pub functions: Arena<Function>,\r\n    /// Entry points.\r\n    pub entry_points: Vec<EntryPoint>,\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/proc/index.rs",
    "content": "/*!\r\nDefinitions for index bounds checking.\r\n*/\r\n\r\nuse crate::{valid, Handle, UniqueArena};\r\nuse bit_set::BitSet;\r\n\r\n/// How should code generated by Naga do bounds checks?\r\n///\r\n/// When a vector, matrix, or array index is out of bounds—either negative, or\r\n/// greater than or equal to the number of elements in the type—WGSL requires\r\n/// that some other index of the implementation's choice that is in bounds is\r\n/// used instead. (There are no types with zero elements.)\r\n///\r\n/// Similarly, when out-of-bounds coordinates, array indices, or sample indices\r\n/// are presented to the WGSL `textureLoad` and `textureStore` operations, the\r\n/// operation is redirected to do something safe.\r\n///\r\n/// Different users of Naga will prefer different defaults:\r\n///\r\n/// -   When used as part of a WebGPU implementation, the WGSL specification\r\n///     requires the `Restrict` behavior for array, vector, and matrix accesses,\r\n///     and either the `Restrict` or `ReadZeroSkipWrite` behaviors for texture\r\n///     accesses.\r\n///\r\n/// -   When used by the `wgpu` crate for native development, `wgpu` selects\r\n///     `ReadZeroSkipWrite` as its default.\r\n///\r\n/// -   Naga's own default is `Unchecked`, so that shader translations\r\n///     are as faithful to the original as possible.\r\n///\r\n/// Sometimes the underlying hardware and drivers can perform bounds checks\r\n/// themselves, in a way that performs better than the checks Naga would inject.\r\n/// If you're using native checks like this, then having Naga inject its own\r\n/// checks as well would be redundant, and the `Unchecked` policy is\r\n/// appropriate.\r\n#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum BoundsCheckPolicy {\r\n    /// Replace out-of-bounds indexes with some arbitrary in-bounds index.\r\n    ///\r\n    /// (This does not necessarily mean clamping. For example, interpreting the\r\n    /// index as unsigned and taking the minimum with the largest valid index\r\n    /// would also be a valid implementation. That would map negative indices to\r\n    /// the last element, not the first.)\r\n    Restrict,\r\n\r\n    /// Out-of-bounds reads return zero, and writes have no effect.\r\n    ///\r\n    /// When applied to a chain of accesses, like `a[i][j].b[k]`, all index\r\n    /// expressions are evaluated, regardless of whether prior or later index\r\n    /// expressions were in bounds. But all the accesses per se are skipped\r\n    /// if any index is out of bounds.\r\n    ReadZeroSkipWrite,\r\n\r\n    /// Naga adds no checks to indexing operations. Generate the fastest code\r\n    /// possible. This is the default for Naga, as a translator, but consumers\r\n    /// should consider defaulting to a safer behavior.\r\n    Unchecked,\r\n}\r\n\r\n/// Policies for injecting bounds checks during code generation.\r\n#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct BoundsCheckPolicies {\r\n    /// How should the generated code handle array, vector, or matrix indices\r\n    /// that are out of range?\r\n    #[cfg_attr(feature = \"deserialize\", serde(default))]\r\n    pub index: BoundsCheckPolicy,\r\n\r\n    /// How should the generated code handle array, vector, or matrix indices\r\n    /// that are out of range, when those values live in a [`GlobalVariable`] in\r\n    /// the [`Storage`] or [`Uniform`] address spaces?\r\n    ///\r\n    /// Some graphics hardware provides \"robust buffer access\", a feature that\r\n    /// ensures that using a pointer cannot access memory outside the 'buffer'\r\n    /// that it was derived from. In Naga terms, this means that the hardware\r\n    /// ensures that pointers computed by applying [`Access`] and\r\n    /// [`AccessIndex`] expressions to a [`GlobalVariable`] whose [`space`] is\r\n    /// [`Storage`] or [`Uniform`] will never read or write memory outside that\r\n    /// global variable.\r\n    ///\r\n    /// When hardware offers such a feature, it is probably undesirable to have\r\n    /// Naga inject bounds checking code for such accesses, since the hardware\r\n    /// can probably provide the same protection more efficiently. However,\r\n    /// bounds checks are still needed on accesses to indexable values that do\r\n    /// not live in buffers, like local variables.\r\n    ///\r\n    /// So, this option provides a separate policy that applies only to accesses\r\n    /// to storage and uniform globals. When depending on hardware bounds\r\n    /// checking, this policy can be `Unchecked` to avoid unnecessary overhead.\r\n    ///\r\n    /// When special hardware support is not available, this should probably be\r\n    /// the same as `index_bounds_check_policy`.\r\n    ///\r\n    /// [`GlobalVariable`]: crate::GlobalVariable\r\n    /// [`space`]: crate::GlobalVariable::space\r\n    /// [`Restrict`]: crate::back::BoundsCheckPolicy::Restrict\r\n    /// [`ReadZeroSkipWrite`]: crate::back::BoundsCheckPolicy::ReadZeroSkipWrite\r\n    /// [`Access`]: crate::Expression::Access\r\n    /// [`AccessIndex`]: crate::Expression::AccessIndex\r\n    /// [`Storage`]: crate::AddressSpace::Storage\r\n    /// [`Uniform`]: crate::AddressSpace::Uniform\r\n    #[cfg_attr(feature = \"deserialize\", serde(default))]\r\n    pub buffer: BoundsCheckPolicy,\r\n\r\n    /// How should the generated code handle image texel references that are out\r\n    /// of range?\r\n    ///\r\n    /// This controls the behavior of [`ImageLoad`] expressions and\r\n    /// [`ImageStore`] statements when a coordinate, texture array index, level\r\n    /// of detail, or multisampled sample number is out of range.\r\n    ///\r\n    /// [`ImageLoad`]: crate::Expression::ImageLoad\r\n    /// [`ImageStore`]: crate::Statement::ImageStore\r\n    #[cfg_attr(feature = \"deserialize\", serde(default))]\r\n    pub image: BoundsCheckPolicy,\r\n\r\n    /// How should the generated code handle binding array indexes that are out of bounds.\r\n    #[cfg_attr(feature = \"deserialize\", serde(default))]\r\n    pub binding_array: BoundsCheckPolicy,\r\n}\r\n\r\n/// The default `BoundsCheckPolicy` is `Unchecked`.\r\nimpl Default for BoundsCheckPolicy {\r\n    fn default() -> Self {\r\n        BoundsCheckPolicy::Unchecked\r\n    }\r\n}\r\n\r\nimpl BoundsCheckPolicies {\r\n    /// Determine which policy applies to `base`.\r\n    ///\r\n    /// `base` is the \"base\" expression (the expression being indexed) of a `Access`\r\n    /// and `AccessIndex` expression. This is either a pointer, a value, being directly\r\n    /// indexed, or a binding array.\r\n    ///\r\n    /// See the documentation for [`BoundsCheckPolicy`] for details about\r\n    /// when each policy applies.\r\n    pub fn choose_policy(\r\n        &self,\r\n        base: Handle<crate::Expression>,\r\n        types: &UniqueArena<crate::Type>,\r\n        info: &valid::FunctionInfo,\r\n    ) -> BoundsCheckPolicy {\r\n        let ty = info[base].ty.inner_with(types);\r\n\r\n        if let crate::TypeInner::BindingArray { .. } = *ty {\r\n            return self.binding_array;\r\n        }\r\n\r\n        match ty.pointer_space() {\r\n            Some(crate::AddressSpace::Storage { access: _ } | crate::AddressSpace::Uniform) => {\r\n                self.buffer\r\n            }\r\n            // This covers other address spaces, but also accessing vectors and\r\n            // matrices by value, where no pointer is involved.\r\n            _ => self.index,\r\n        }\r\n    }\r\n\r\n    /// Return `true` if any of `self`'s policies are `policy`.\r\n    pub fn contains(&self, policy: BoundsCheckPolicy) -> bool {\r\n        self.index == policy || self.buffer == policy || self.image == policy\r\n    }\r\n}\r\n\r\n/// An index that may be statically known, or may need to be computed at runtime.\r\n///\r\n/// This enum lets us handle both [`Access`] and [`AccessIndex`] expressions\r\n/// with the same code.\r\n///\r\n/// [`Access`]: crate::Expression::Access\r\n/// [`AccessIndex`]: crate::Expression::AccessIndex\r\n#[derive(Clone, Copy, Debug)]\r\npub enum GuardedIndex {\r\n    Known(u32),\r\n    Expression(Handle<crate::Expression>),\r\n}\r\n\r\n/// Build a set of expressions used as indices, to cache in temporary variables when\r\n/// emitted.\r\n///\r\n/// Given the bounds-check policies `policies`, construct a `BitSet` containing the handle\r\n/// indices of all the expressions in `function` that are ever used as guarded indices\r\n/// under the [`ReadZeroSkipWrite`] policy. The `module` argument must be the module to\r\n/// which `function` belongs, and `info` should be that function's analysis results.\r\n///\r\n/// Such index expressions will be used twice in the generated code: first for the\r\n/// comparison to see if the index is in bounds, and then for the access itself, should\r\n/// the comparison succeed. To avoid computing the expressions twice, the generated code\r\n/// should cache them in temporary variables.\r\n///\r\n/// Why do we need to build such a set in advance, instead of just processing access\r\n/// expressions as we encounter them? Whether an expression needs to be cached depends on\r\n/// whether it appears as something like the [`index`] operand of an [`Access`] expression\r\n/// or the [`level`] operand of an [`ImageLoad`] expression, and on the index bounds check\r\n/// policies that apply to those accesses. But [`Emit`] statements just identify a range\r\n/// of expressions by index; there's no good way to tell what an expression is used\r\n/// for. The only way to do it is to just iterate over all the expressions looking for\r\n/// relevant `Access` expressions --- which is what this function does.\r\n///\r\n/// Simple expressions like variable loads and constants don't make sense to cache: it's\r\n/// no better than just re-evaluating them. But constants are not covered by `Emit`\r\n/// statements, and `Load`s are always cached to ensure they occur at the right time, so\r\n/// we don't bother filtering them out from this set.\r\n///\r\n/// Fortunately, we don't need to deal with [`ImageStore`] statements here. When we emit\r\n/// code for a statement, the writer isn't in the middle of an expression, so we can just\r\n/// emit declarations for temporaries, initialized appropriately.\r\n///\r\n/// None of these concerns apply for SPIR-V output, since it's easy to just reuse an\r\n/// instruction ID in two places; that has the same semantics as a temporary variable, and\r\n/// it's inherent in the design of SPIR-V. This function is more useful for text-based\r\n/// back ends.\r\n///\r\n/// [`ReadZeroSkipWrite`]: BoundsCheckPolicy::ReadZeroSkipWrite\r\n/// [`index`]: crate::Expression::Access::index\r\n/// [`Access`]: crate::Expression::Access\r\n/// [`level`]: crate::Expression::ImageLoad::level\r\n/// [`ImageLoad`]: crate::Expression::ImageLoad\r\n/// [`Emit`]: crate::Statement::Emit\r\n/// [`ImageStore`]: crate::Statement::ImageStore\r\npub fn find_checked_indexes(\r\n    module: &crate::Module,\r\n    function: &crate::Function,\r\n    info: &crate::valid::FunctionInfo,\r\n    policies: BoundsCheckPolicies,\r\n) -> BitSet {\r\n    use crate::Expression as Ex;\r\n\r\n    let mut guarded_indices = BitSet::new();\r\n\r\n    // Don't bother scanning if we never need `ReadZeroSkipWrite`.\r\n    if policies.contains(BoundsCheckPolicy::ReadZeroSkipWrite) {\r\n        for (_handle, expr) in function.expressions.iter() {\r\n            // There's no need to handle `AccessIndex` expressions, as their\r\n            // indices never need to be cached.\r\n            match *expr {\r\n                Ex::Access { base, index } => {\r\n                    if policies.choose_policy(base, &module.types, info)\r\n                        == BoundsCheckPolicy::ReadZeroSkipWrite\r\n                        && access_needs_check(\r\n                            base,\r\n                            GuardedIndex::Expression(index),\r\n                            module,\r\n                            function,\r\n                            info,\r\n                        )\r\n                        .is_some()\r\n                    {\r\n                        guarded_indices.insert(index.index());\r\n                    }\r\n                }\r\n                Ex::ImageLoad {\r\n                    coordinate,\r\n                    array_index,\r\n                    sample,\r\n                    level,\r\n                    ..\r\n                } => {\r\n                    if policies.image == BoundsCheckPolicy::ReadZeroSkipWrite {\r\n                        guarded_indices.insert(coordinate.index());\r\n                        if let Some(array_index) = array_index {\r\n                            guarded_indices.insert(array_index.index());\r\n                        }\r\n                        if let Some(sample) = sample {\r\n                            guarded_indices.insert(sample.index());\r\n                        }\r\n                        if let Some(level) = level {\r\n                            guarded_indices.insert(level.index());\r\n                        }\r\n                    }\r\n                }\r\n                _ => {}\r\n            }\r\n        }\r\n    }\r\n\r\n    guarded_indices\r\n}\r\n\r\n/// Determine whether `index` is statically known to be in bounds for `base`.\r\n///\r\n/// If we can't be sure that the index is in bounds, return the limit within\r\n/// which valid indices must fall.\r\n///\r\n/// The return value is one of the following:\r\n///\r\n/// - `Some(Known(n))` indicates that `n` is the largest valid index.\r\n///\r\n/// - `Some(Computed(global))` indicates that the largest valid index is one\r\n///   less than the length of the array that is the last member of the\r\n///   struct held in `global`.\r\n///\r\n/// - `None` indicates that the index need not be checked, either because it\r\n///   is statically known to be in bounds, or because the applicable policy\r\n///   is `Unchecked`.\r\n///\r\n/// This function only handles subscriptable types: arrays, vectors, and\r\n/// matrices. It does not handle struct member indices; those never require\r\n/// run-time checks, so it's best to deal with them further up the call\r\n/// chain.\r\npub fn access_needs_check(\r\n    base: Handle<crate::Expression>,\r\n    mut index: GuardedIndex,\r\n    module: &crate::Module,\r\n    function: &crate::Function,\r\n    info: &crate::valid::FunctionInfo,\r\n) -> Option<IndexableLength> {\r\n    let base_inner = info[base].ty.inner_with(&module.types);\r\n    // Unwrap safety: `Err` here indicates unindexable base types and invalid\r\n    // length constants, but `access_needs_check` is only used by back ends, so\r\n    // validation should have caught those problems.\r\n    let length = base_inner.indexable_length(module).unwrap();\r\n    index.try_resolve_to_constant(function, module);\r\n    if let (&GuardedIndex::Known(index), &IndexableLength::Known(length)) = (&index, &length) {\r\n        if index < length {\r\n            // Index is statically known to be in bounds, no check needed.\r\n            return None;\r\n        }\r\n    };\r\n\r\n    Some(length)\r\n}\r\n\r\nimpl GuardedIndex {\r\n    /// Make A `GuardedIndex::Known` from a `GuardedIndex::Expression` if possible.\r\n    ///\r\n    /// If the expression is a [`Constant`] whose value is a non-specialized, scalar\r\n    /// integer constant that can be converted to a `u32`, do so and return a\r\n    /// `GuardedIndex::Known`. Otherwise, return the `GuardedIndex::Expression`\r\n    /// unchanged.\r\n    ///\r\n    /// Return values that are already `Known` unchanged.\r\n    ///\r\n    /// [`Constant`]: crate::Expression::Constant\r\n    fn try_resolve_to_constant(&mut self, function: &crate::Function, module: &crate::Module) {\r\n        if let GuardedIndex::Expression(expr) = *self {\r\n            if let crate::Expression::Constant(handle) = function.expressions[expr] {\r\n                if let Some(value) = module.constants[handle].to_array_length() {\r\n                    *self = GuardedIndex::Known(value);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, thiserror::Error, PartialEq)]\r\npub enum IndexableLengthError {\r\n    #[error(\"Type is not indexable, and has no length (validation error)\")]\r\n    TypeNotIndexable,\r\n    #[error(\"Array length constant {0:?} is invalid\")]\r\n    InvalidArrayLength(Handle<crate::Constant>),\r\n}\r\n\r\nimpl crate::TypeInner {\r\n    /// Return the length of a subscriptable type.\r\n    ///\r\n    /// The `self` parameter should be a handle to a vector, matrix, or array\r\n    /// type, a pointer to one of those, or a value pointer. Arrays may be\r\n    /// fixed-size, dynamically sized, or sized by a specializable constant.\r\n    /// This function does not handle struct member references, as with\r\n    /// `AccessIndex`.\r\n    ///\r\n    /// The value returned is appropriate for bounds checks on subscripting.\r\n    ///\r\n    /// Return an error if `self` does not describe a subscriptable type at all.\r\n    pub fn indexable_length(\r\n        &self,\r\n        module: &crate::Module,\r\n    ) -> Result<IndexableLength, IndexableLengthError> {\r\n        use crate::TypeInner as Ti;\r\n        let known_length = match *self {\r\n            Ti::Vector { size, .. } => size as _,\r\n            Ti::Matrix { columns, .. } => columns as _,\r\n            Ti::Array { size, .. } | Ti::BindingArray { size, .. } => {\r\n                return size.to_indexable_length(module);\r\n            }\r\n            Ti::ValuePointer {\r\n                size: Some(size), ..\r\n            } => size as _,\r\n            Ti::Pointer { base, .. } => {\r\n                // When assigning types to expressions, ResolveContext::Resolve\r\n                // does a separate sub-match here instead of a full recursion,\r\n                // so we'll do the same.\r\n                let base_inner = &module.types[base].inner;\r\n                match *base_inner {\r\n                    Ti::Vector { size, .. } => size as _,\r\n                    Ti::Matrix { columns, .. } => columns as _,\r\n                    Ti::Array { size, .. } => return size.to_indexable_length(module),\r\n                    _ => return Err(IndexableLengthError::TypeNotIndexable),\r\n                }\r\n            }\r\n            _ => return Err(IndexableLengthError::TypeNotIndexable),\r\n        };\r\n        Ok(IndexableLength::Known(known_length))\r\n    }\r\n}\r\n\r\n/// The number of elements in an indexable type.\r\n///\r\n/// This summarizes the length of vectors, matrices, and arrays in a way that is\r\n/// convenient for indexing and bounds-checking code.\r\n#[derive(Debug)]\r\npub enum IndexableLength {\r\n    /// Values of this type always have the given number of elements.\r\n    Known(u32),\r\n\r\n    /// The number of elements is determined at runtime.\r\n    Dynamic,\r\n}\r\n\r\nimpl crate::ArraySize {\r\n    pub fn to_indexable_length(\r\n        self,\r\n        module: &crate::Module,\r\n    ) -> Result<IndexableLength, IndexableLengthError> {\r\n        Ok(match self {\r\n            Self::Constant(k) => {\r\n                let constant = &module.constants[k];\r\n                if constant.specialization.is_some() {\r\n                    // Specializable constants are not supported as array lengths.\r\n                    // See valid::TypeError::UnsupportedSpecializedArrayLength.\r\n                    return Err(IndexableLengthError::InvalidArrayLength(k));\r\n                }\r\n                let length = constant\r\n                    .to_array_length()\r\n                    .ok_or(IndexableLengthError::InvalidArrayLength(k))?;\r\n                IndexableLength::Known(length)\r\n            }\r\n            Self::Dynamic => IndexableLength::Dynamic,\r\n        })\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/proc/layouter.rs",
    "content": "use crate::arena::{Arena, BadHandle, Handle, UniqueArena};\r\nuse std::{fmt::Display, num::NonZeroU32, ops};\r\n\r\n/// A newtype struct where its only valid values are powers of 2\r\n#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct Alignment(NonZeroU32);\r\n\r\nimpl Alignment {\r\n    pub const ONE: Self = Self(unsafe { NonZeroU32::new_unchecked(1) });\r\n    pub const TWO: Self = Self(unsafe { NonZeroU32::new_unchecked(2) });\r\n    pub const FOUR: Self = Self(unsafe { NonZeroU32::new_unchecked(4) });\r\n    pub const EIGHT: Self = Self(unsafe { NonZeroU32::new_unchecked(8) });\r\n    pub const SIXTEEN: Self = Self(unsafe { NonZeroU32::new_unchecked(16) });\r\n\r\n    pub const MIN_UNIFORM: Self = Self::SIXTEEN;\r\n\r\n    pub const fn new(n: u32) -> Option<Self> {\r\n        if n.is_power_of_two() {\r\n            // SAFETY: value can't be 0 since we just checked if it's a power of 2\r\n            Some(Self(unsafe { NonZeroU32::new_unchecked(n) }))\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n\r\n    /// # Panics\r\n    /// If `width` is not a power of 2\r\n    pub fn from_width(width: u8) -> Self {\r\n        Self::new(width as u32).unwrap()\r\n    }\r\n\r\n    /// Returns whether or not `n` is a multiple of this alignment.\r\n    pub const fn is_aligned(&self, n: u32) -> bool {\r\n        // equivalent to: `n % self.0.get() == 0` but much faster\r\n        n & (self.0.get() - 1) == 0\r\n    }\r\n\r\n    /// Round `n` up to the nearest alignment boundary.\r\n    pub const fn round_up(&self, n: u32) -> u32 {\r\n        // equivalent to:\r\n        // match n % self.0.get() {\r\n        //     0 => n,\r\n        //     rem => n + (self.0.get() - rem),\r\n        // }\r\n        let mask = self.0.get() - 1;\r\n        (n + mask) & !mask\r\n    }\r\n}\r\n\r\nimpl Display for Alignment {\r\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\r\n        self.0.get().fmt(f)\r\n    }\r\n}\r\n\r\nimpl ops::Mul<u32> for Alignment {\r\n    type Output = u32;\r\n\r\n    fn mul(self, rhs: u32) -> Self::Output {\r\n        self.0.get() * rhs\r\n    }\r\n}\r\n\r\nimpl ops::Mul for Alignment {\r\n    type Output = Alignment;\r\n\r\n    fn mul(self, rhs: Alignment) -> Self::Output {\r\n        // SAFETY: both lhs and rhs are powers of 2, the result will be a power of 2\r\n        Self(unsafe { NonZeroU32::new_unchecked(self.0.get() * rhs.0.get()) })\r\n    }\r\n}\r\n\r\nimpl From<crate::VectorSize> for Alignment {\r\n    fn from(size: crate::VectorSize) -> Self {\r\n        match size {\r\n            crate::VectorSize::Bi => Alignment::TWO,\r\n            crate::VectorSize::Tri => Alignment::FOUR,\r\n            crate::VectorSize::Quad => Alignment::FOUR,\r\n        }\r\n    }\r\n}\r\n\r\n/// Size and alignment information for a type.\r\n#[derive(Clone, Copy, Debug, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct TypeLayout {\r\n    pub size: u32,\r\n    pub alignment: Alignment,\r\n}\r\n\r\nimpl TypeLayout {\r\n    /// Produce the stride as if this type is a base of an array.\r\n    pub const fn to_stride(&self) -> u32 {\r\n        self.alignment.round_up(self.size)\r\n    }\r\n}\r\n\r\n/// Helper processor that derives the sizes of all types.\r\n///\r\n/// `Layouter` uses the default layout algorithm/table, described in\r\n/// [WGSL §4.3.7, \"Memory Layout\"]\r\n///\r\n/// A `Layouter` may be indexed by `Handle<Type>` values: `layouter[handle]` is the\r\n/// layout of the type whose handle is `handle`.\r\n///\r\n/// [WGSL §4.3.7, \"Memory Layout\"](https://gpuweb.github.io/gpuweb/wgsl/#memory-layouts)\r\n#[derive(Debug, Default)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct Layouter {\r\n    /// Layouts for types in an arena, indexed by `Handle` index.\r\n    layouts: Vec<TypeLayout>,\r\n}\r\n\r\nimpl ops::Index<Handle<crate::Type>> for Layouter {\r\n    type Output = TypeLayout;\r\n    fn index(&self, handle: Handle<crate::Type>) -> &TypeLayout {\r\n        &self.layouts[handle.index()]\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, thiserror::Error)]\r\npub enum LayoutErrorInner {\r\n    #[error(\"Array element type {0:?} doesn't exist\")]\r\n    InvalidArrayElementType(Handle<crate::Type>),\r\n    #[error(\"Struct member[{0}] type {1:?} doesn't exist\")]\r\n    InvalidStructMemberType(u32, Handle<crate::Type>),\r\n    #[error(\"Type width must be a power of two\")]\r\n    NonPowerOfTwoWidth,\r\n    #[error(\"Array size is a bad handle\")]\r\n    BadHandle(#[from] BadHandle),\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, PartialEq, thiserror::Error)]\r\n#[error(\"Error laying out type {ty:?}: {inner}\")]\r\npub struct LayoutError {\r\n    pub ty: Handle<crate::Type>,\r\n    pub inner: LayoutErrorInner,\r\n}\r\n\r\nimpl LayoutErrorInner {\r\n    const fn with(self, ty: Handle<crate::Type>) -> LayoutError {\r\n        LayoutError { ty, inner: self }\r\n    }\r\n}\r\n\r\nimpl Layouter {\r\n    /// Remove all entries from this `Layouter`, retaining storage.\r\n    pub fn clear(&mut self) {\r\n        self.layouts.clear();\r\n    }\r\n\r\n    /// Extend this `Layouter` with layouts for any new entries in `types`.\r\n    ///\r\n    /// Ensure that every type in `types` has a corresponding [TypeLayout] in\r\n    /// [`self.layouts`].\r\n    ///\r\n    /// Some front ends need to be able to compute layouts for existing types\r\n    /// while module construction is still in progress and new types are still\r\n    /// being added. This function assumes that the `TypeLayout` values already\r\n    /// present in `self.layouts` cover their corresponding entries in `types`,\r\n    /// and extends `self.layouts` as needed to cover the rest. Thus, a front\r\n    /// end can call this function at any time, passing its current type and\r\n    /// constant arenas, and then assume that layouts are available for all\r\n    /// types.\r\n    #[allow(clippy::or_fun_call)]\r\n    pub fn update(\r\n        &mut self,\r\n        types: &UniqueArena<crate::Type>,\r\n        constants: &Arena<crate::Constant>,\r\n    ) -> Result<(), LayoutError> {\r\n        use crate::TypeInner as Ti;\r\n\r\n        for (ty_handle, ty) in types.iter().skip(self.layouts.len()) {\r\n            let size = ty\r\n                .inner\r\n                .try_size(constants)\r\n                .map_err(|error| LayoutErrorInner::BadHandle(error).with(ty_handle))?;\r\n            let layout = match ty.inner {\r\n                Ti::Scalar { width, .. } | Ti::Atomic { width, .. } => {\r\n                    let alignment = Alignment::new(width as u32)\r\n                        .ok_or(LayoutErrorInner::NonPowerOfTwoWidth.with(ty_handle))?;\r\n                    TypeLayout { size, alignment }\r\n                }\r\n                Ti::Vector {\r\n                    size: vec_size,\r\n                    width,\r\n                    ..\r\n                } => {\r\n                    let alignment = Alignment::new(width as u32)\r\n                        .ok_or(LayoutErrorInner::NonPowerOfTwoWidth.with(ty_handle))?;\r\n                    TypeLayout {\r\n                        size,\r\n                        alignment: Alignment::from(vec_size) * alignment,\r\n                    }\r\n                }\r\n                Ti::Matrix {\r\n                    columns: _,\r\n                    rows,\r\n                    width,\r\n                } => {\r\n                    let alignment = Alignment::new(width as u32)\r\n                        .ok_or(LayoutErrorInner::NonPowerOfTwoWidth.with(ty_handle))?;\r\n                    TypeLayout {\r\n                        size,\r\n                        alignment: Alignment::from(rows) * alignment,\r\n                    }\r\n                }\r\n                Ti::Pointer { .. } | Ti::ValuePointer { .. } => TypeLayout {\r\n                    size,\r\n                    alignment: Alignment::ONE,\r\n                },\r\n                Ti::Array {\r\n                    base,\r\n                    stride: _,\r\n                    size: _,\r\n                } => TypeLayout {\r\n                    size,\r\n                    alignment: if base < ty_handle {\r\n                        self[base].alignment\r\n                    } else {\r\n                        return Err(LayoutErrorInner::InvalidArrayElementType(base).with(ty_handle));\r\n                    },\r\n                },\r\n                Ti::Struct { span, ref members } => {\r\n                    let mut alignment = Alignment::ONE;\r\n                    for (index, member) in members.iter().enumerate() {\r\n                        alignment = if member.ty < ty_handle {\r\n                            alignment.max(self[member.ty].alignment)\r\n                        } else {\r\n                            return Err(LayoutErrorInner::InvalidStructMemberType(\r\n                                index as u32,\r\n                                member.ty,\r\n                            )\r\n                            .with(ty_handle));\r\n                        };\r\n                    }\r\n                    TypeLayout {\r\n                        size: span,\r\n                        alignment,\r\n                    }\r\n                }\r\n                Ti::Image { .. } | Ti::Sampler { .. } | Ti::BindingArray { .. } => TypeLayout {\r\n                    size,\r\n                    alignment: Alignment::ONE,\r\n                },\r\n            };\r\n            debug_assert!(size <= layout.size);\r\n            self.layouts.push(layout);\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/proc/mod.rs",
    "content": "/*!\r\n[`Module`](super::Module) processing functionality.\r\n*/\r\n\r\npub mod index;\r\nmod layouter;\r\nmod namer;\r\nmod terminator;\r\nmod typifier;\r\n\r\nuse std::cmp::PartialEq;\r\n\r\npub use index::{BoundsCheckPolicies, BoundsCheckPolicy, IndexableLength, IndexableLengthError};\r\npub use layouter::{Alignment, LayoutError, LayoutErrorInner, Layouter, TypeLayout};\r\npub use namer::{EntryPointIndex, NameKey, Namer};\r\npub use terminator::ensure_block_returns;\r\npub use typifier::{ResolveContext, ResolveError, TypeResolution};\r\n\r\nimpl From<super::StorageFormat> for super::ScalarKind {\r\n    fn from(format: super::StorageFormat) -> Self {\r\n        use super::{ScalarKind as Sk, StorageFormat as Sf};\r\n        match format {\r\n            Sf::R8Unorm => Sk::Float,\r\n            Sf::R8Snorm => Sk::Float,\r\n            Sf::R8Uint => Sk::Uint,\r\n            Sf::R8Sint => Sk::Sint,\r\n            Sf::R16Uint => Sk::Uint,\r\n            Sf::R16Sint => Sk::Sint,\r\n            Sf::R16Float => Sk::Float,\r\n            Sf::Rg8Unorm => Sk::Float,\r\n            Sf::Rg8Snorm => Sk::Float,\r\n            Sf::Rg8Uint => Sk::Uint,\r\n            Sf::Rg8Sint => Sk::Sint,\r\n            Sf::R32Uint => Sk::Uint,\r\n            Sf::R32Sint => Sk::Sint,\r\n            Sf::R32Float => Sk::Float,\r\n            Sf::Rg16Uint => Sk::Uint,\r\n            Sf::Rg16Sint => Sk::Sint,\r\n            Sf::Rg16Float => Sk::Float,\r\n            Sf::Rgba8Unorm => Sk::Float,\r\n            Sf::Rgba8Snorm => Sk::Float,\r\n            Sf::Rgba8Uint => Sk::Uint,\r\n            Sf::Rgba8Sint => Sk::Sint,\r\n            Sf::Rgb10a2Unorm => Sk::Float,\r\n            Sf::Rg11b10Float => Sk::Float,\r\n            Sf::Rg32Uint => Sk::Uint,\r\n            Sf::Rg32Sint => Sk::Sint,\r\n            Sf::Rg32Float => Sk::Float,\r\n            Sf::Rgba16Uint => Sk::Uint,\r\n            Sf::Rgba16Sint => Sk::Sint,\r\n            Sf::Rgba16Float => Sk::Float,\r\n            Sf::Rgba32Uint => Sk::Uint,\r\n            Sf::Rgba32Sint => Sk::Sint,\r\n            Sf::Rgba32Float => Sk::Float,\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::ScalarValue {\r\n    pub const fn scalar_kind(&self) -> super::ScalarKind {\r\n        match *self {\r\n            Self::Uint(_) => super::ScalarKind::Uint,\r\n            Self::Sint(_) => super::ScalarKind::Sint,\r\n            Self::Float(_) => super::ScalarKind::Float,\r\n            Self::Bool(_) => super::ScalarKind::Bool,\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::ScalarKind {\r\n    pub const fn is_numeric(self) -> bool {\r\n        match self {\r\n            crate::ScalarKind::Sint | crate::ScalarKind::Uint | crate::ScalarKind::Float => true,\r\n            crate::ScalarKind::Bool => false,\r\n        }\r\n    }\r\n}\r\n\r\npub const POINTER_SPAN: u32 = 4;\r\n\r\nimpl super::TypeInner {\r\n    pub const fn scalar_kind(&self) -> Option<super::ScalarKind> {\r\n        match *self {\r\n            super::TypeInner::Scalar { kind, .. } | super::TypeInner::Vector { kind, .. } => {\r\n                Some(kind)\r\n            }\r\n            super::TypeInner::Matrix { .. } => Some(super::ScalarKind::Float),\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    pub const fn pointer_space(&self) -> Option<crate::AddressSpace> {\r\n        match *self {\r\n            Self::Pointer { space, .. } => Some(space),\r\n            Self::ValuePointer { space, .. } => Some(space),\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    pub fn try_size(\r\n        &self,\r\n        constants: &super::Arena<super::Constant>,\r\n    ) -> Result<u32, crate::arena::BadHandle> {\r\n        Ok(match *self {\r\n            Self::Scalar { kind: _, width } | Self::Atomic { kind: _, width } => width as u32,\r\n            Self::Vector {\r\n                size,\r\n                kind: _,\r\n                width,\r\n            } => size as u32 * width as u32,\r\n            // matrices are treated as arrays of aligned columns\r\n            Self::Matrix {\r\n                columns,\r\n                rows,\r\n                width,\r\n            } => Alignment::from(rows) * width as u32 * columns as u32,\r\n            Self::Pointer { .. } | Self::ValuePointer { .. } => POINTER_SPAN,\r\n            Self::Array {\r\n                base: _,\r\n                size,\r\n                stride,\r\n            } => {\r\n                let count = match size {\r\n                    super::ArraySize::Constant(handle) => {\r\n                        let constant = constants.try_get(handle)?;\r\n                        constant.to_array_length().unwrap_or(1)\r\n                    }\r\n                    // A dynamically-sized array has to have at least one element\r\n                    super::ArraySize::Dynamic => 1,\r\n                };\r\n                count * stride\r\n            }\r\n            Self::Struct { span, .. } => span,\r\n            Self::Image { .. } | Self::Sampler { .. } | Self::BindingArray { .. } => 0,\r\n        })\r\n    }\r\n\r\n    /// Get the size of this type. Panics if the `constants` doesn't contain\r\n    /// a referenced handle. This may not happen in a properly validated IR module.\r\n    pub fn size(&self, constants: &super::Arena<super::Constant>) -> u32 {\r\n        self.try_size(constants).unwrap()\r\n    }\r\n\r\n    /// Return the canonical form of `self`, or `None` if it's already in\r\n    /// canonical form.\r\n    ///\r\n    /// Certain types have multiple representations in `TypeInner`. This\r\n    /// function converts all forms of equivalent types to a single\r\n    /// representative of their class, so that simply applying `Eq` to the\r\n    /// result indicates whether the types are equivalent, as far as Naga IR is\r\n    /// concerned.\r\n    pub fn canonical_form(\r\n        &self,\r\n        types: &crate::UniqueArena<crate::Type>,\r\n    ) -> Option<crate::TypeInner> {\r\n        use crate::TypeInner as Ti;\r\n        match *self {\r\n            Ti::Pointer { base, space } => match types[base].inner {\r\n                Ti::Scalar { kind, width } => Some(Ti::ValuePointer {\r\n                    size: None,\r\n                    kind,\r\n                    width,\r\n                    space,\r\n                }),\r\n                Ti::Vector { size, kind, width } => Some(Ti::ValuePointer {\r\n                    size: Some(size),\r\n                    kind,\r\n                    width,\r\n                    space,\r\n                }),\r\n                _ => None,\r\n            },\r\n            _ => None,\r\n        }\r\n    }\r\n\r\n    /// Compare `self` and `rhs` as types.\r\n    ///\r\n    /// This is mostly the same as `<TypeInner as Eq>::eq`, but it treats\r\n    /// `ValuePointer` and `Pointer` types as equivalent.\r\n    ///\r\n    /// When you know that one side of the comparison is never a pointer, it's\r\n    /// fine to not bother with canonicalization, and just compare `TypeInner`\r\n    /// values with `==`.\r\n    pub fn equivalent(\r\n        &self,\r\n        rhs: &crate::TypeInner,\r\n        types: &crate::UniqueArena<crate::Type>,\r\n    ) -> bool {\r\n        let left = self.canonical_form(types);\r\n        let right = rhs.canonical_form(types);\r\n        left.as_ref().unwrap_or(self) == right.as_ref().unwrap_or(rhs)\r\n    }\r\n\r\n    pub fn is_dynamically_sized(&self, types: &crate::UniqueArena<crate::Type>) -> bool {\r\n        use crate::TypeInner as Ti;\r\n        match *self {\r\n            Ti::Array { size, .. } => size == crate::ArraySize::Dynamic,\r\n            Ti::Struct { ref members, .. } => members\r\n                .last()\r\n                .map(|last| types[last.ty].inner.is_dynamically_sized(types))\r\n                .unwrap_or(false),\r\n            _ => false,\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::AddressSpace {\r\n    pub fn access(self) -> crate::StorageAccess {\r\n        use crate::StorageAccess as Sa;\r\n        match self {\r\n            crate::AddressSpace::Function\r\n            | crate::AddressSpace::Private\r\n            | crate::AddressSpace::WorkGroup => Sa::LOAD | Sa::STORE,\r\n            crate::AddressSpace::Uniform => Sa::LOAD,\r\n            crate::AddressSpace::Storage { access } => access,\r\n            crate::AddressSpace::Handle => Sa::LOAD,\r\n            crate::AddressSpace::PushConstant => Sa::LOAD,\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::MathFunction {\r\n    pub const fn argument_count(&self) -> usize {\r\n        match *self {\r\n            // comparison\r\n            Self::Abs => 1,\r\n            Self::Min => 2,\r\n            Self::Max => 2,\r\n            Self::Clamp => 3,\r\n            Self::Saturate => 1,\r\n            // trigonometry\r\n            Self::Cos => 1,\r\n            Self::Cosh => 1,\r\n            Self::Sin => 1,\r\n            Self::Sinh => 1,\r\n            Self::Tan => 1,\r\n            Self::Tanh => 1,\r\n            Self::Acos => 1,\r\n            Self::Asin => 1,\r\n            Self::Atan => 1,\r\n            Self::Atan2 => 2,\r\n            Self::Asinh => 1,\r\n            Self::Acosh => 1,\r\n            Self::Atanh => 1,\r\n            Self::Radians => 1,\r\n            Self::Degrees => 1,\r\n            // decomposition\r\n            Self::Ceil => 1,\r\n            Self::Floor => 1,\r\n            Self::Round => 1,\r\n            Self::Fract => 1,\r\n            Self::Trunc => 1,\r\n            Self::Modf => 2,\r\n            Self::Frexp => 2,\r\n            Self::Ldexp => 2,\r\n            // exponent\r\n            Self::Exp => 1,\r\n            Self::Exp2 => 1,\r\n            Self::Log => 1,\r\n            Self::Log2 => 1,\r\n            Self::Pow => 2,\r\n            // geometry\r\n            Self::Dot => 2,\r\n            Self::Outer => 2,\r\n            Self::Cross => 2,\r\n            Self::Distance => 2,\r\n            Self::Length => 1,\r\n            Self::Normalize => 1,\r\n            Self::FaceForward => 3,\r\n            Self::Reflect => 2,\r\n            Self::Refract => 3,\r\n            // computational\r\n            Self::Sign => 1,\r\n            Self::Fma => 3,\r\n            Self::Mix => 3,\r\n            Self::Step => 2,\r\n            Self::SmoothStep => 3,\r\n            Self::Sqrt => 1,\r\n            Self::InverseSqrt => 1,\r\n            Self::Inverse => 1,\r\n            Self::Transpose => 1,\r\n            Self::Determinant => 1,\r\n            // bits\r\n            Self::CountOneBits => 1,\r\n            Self::ReverseBits => 1,\r\n            Self::ExtractBits => 3,\r\n            Self::InsertBits => 4,\r\n            Self::FindLsb => 1,\r\n            Self::FindMsb => 1,\r\n            // data packing\r\n            Self::Pack4x8snorm => 1,\r\n            Self::Pack4x8unorm => 1,\r\n            Self::Pack2x16snorm => 1,\r\n            Self::Pack2x16unorm => 1,\r\n            Self::Pack2x16float => 1,\r\n            // data unpacking\r\n            Self::Unpack4x8snorm => 1,\r\n            Self::Unpack4x8unorm => 1,\r\n            Self::Unpack2x16snorm => 1,\r\n            Self::Unpack2x16unorm => 1,\r\n            Self::Unpack2x16float => 1,\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Expression {\r\n    /// Returns true if the expression is considered emitted at the start of a function.\r\n    pub const fn needs_pre_emit(&self) -> bool {\r\n        match *self {\r\n            Self::Constant(_)\r\n            | Self::FunctionArgument(_)\r\n            | Self::GlobalVariable(_)\r\n            | Self::LocalVariable(_) => true,\r\n            _ => false,\r\n        }\r\n    }\r\n\r\n    /// Return true if this expression is a dynamic array index, for [`Access`].\r\n    ///\r\n    /// This method returns true if this expression is a dynamically computed\r\n    /// index, and as such can only be used to index matrices and arrays when\r\n    /// they appear behind a pointer. See the documentation for [`Access`] for\r\n    /// details.\r\n    ///\r\n    /// Note, this does not check the _type_ of the given expression. It's up to\r\n    /// the caller to establish that the `Access` expression is well-typed\r\n    /// through other means, like [`ResolveContext`].\r\n    ///\r\n    /// [`Access`]: crate::Expression::Access\r\n    /// [`ResolveContext`]: crate::proc::ResolveContext\r\n    pub fn is_dynamic_index(&self, module: &crate::Module) -> bool {\r\n        if let Self::Constant(handle) = *self {\r\n            let constant = &module.constants[handle];\r\n            constant.specialization.is_some()\r\n        } else {\r\n            true\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Function {\r\n    /// Return the global variable being accessed by the expression `pointer`.\r\n    ///\r\n    /// Assuming that `pointer` is a series of `Access` and `AccessIndex`\r\n    /// expressions that ultimately access some part of a `GlobalVariable`,\r\n    /// return a handle for that global.\r\n    ///\r\n    /// If the expression does not ultimately access a global variable, return\r\n    /// `None`.\r\n    pub fn originating_global(\r\n        &self,\r\n        mut pointer: crate::Handle<crate::Expression>,\r\n    ) -> Option<crate::Handle<crate::GlobalVariable>> {\r\n        loop {\r\n            pointer = match self.expressions[pointer] {\r\n                crate::Expression::Access { base, .. } => base,\r\n                crate::Expression::AccessIndex { base, .. } => base,\r\n                crate::Expression::GlobalVariable(handle) => return Some(handle),\r\n                crate::Expression::LocalVariable(_) => return None,\r\n                crate::Expression::FunctionArgument(_) => return None,\r\n                // There are no other expressions that produce pointer values.\r\n                _ => unreachable!(),\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::SampleLevel {\r\n    pub const fn implicit_derivatives(&self) -> bool {\r\n        match *self {\r\n            Self::Auto | Self::Bias(_) => true,\r\n            Self::Zero | Self::Exact(_) | Self::Gradient { .. } => false,\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Constant {\r\n    /// Interpret this constant as an array length, and return it as a `u32`.\r\n    ///\r\n    /// Ignore any specialization available for this constant; return its\r\n    /// unspecialized value.\r\n    ///\r\n    /// If the constant has an inappropriate kind (non-scalar or non-integer) or\r\n    /// value (negative, out of range for u32), return `None`. This usually\r\n    /// indicates an error, but only the caller has enough information to report\r\n    /// the error helpfully: in back ends, it's a validation error, but in front\r\n    /// ends, it may indicate ill-formed input (for example, a SPIR-V\r\n    /// `OpArrayType` referring to an inappropriate `OpConstant`). So we return\r\n    /// `Option` and let the caller sort things out.\r\n    pub(crate) fn to_array_length(&self) -> Option<u32> {\r\n        use std::convert::TryInto;\r\n        match self.inner {\r\n            crate::ConstantInner::Scalar { value, width: _ } => match value {\r\n                crate::ScalarValue::Uint(value) => value.try_into().ok(),\r\n                // Accept a signed integer size to avoid\r\n                // requiring an explicit uint\r\n                // literal. Type inference should make\r\n                // this unnecessary.\r\n                crate::ScalarValue::Sint(value) => value.try_into().ok(),\r\n                _ => None,\r\n            },\r\n            // caught by type validation\r\n            crate::ConstantInner::Composite { .. } => None,\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::Binding {\r\n    pub const fn to_built_in(&self) -> Option<crate::BuiltIn> {\r\n        match *self {\r\n            crate::Binding::BuiltIn(built_in) => Some(built_in),\r\n            Self::Location { .. } => None,\r\n        }\r\n    }\r\n}\r\n\r\n//TODO: should we use an existing crate for hashable floats?\r\nimpl PartialEq for crate::ScalarValue {\r\n    fn eq(&self, other: &Self) -> bool {\r\n        match (*self, *other) {\r\n            (Self::Uint(a), Self::Uint(b)) => a == b,\r\n            (Self::Sint(a), Self::Sint(b)) => a == b,\r\n            (Self::Float(a), Self::Float(b)) => a.to_bits() == b.to_bits(),\r\n            (Self::Bool(a), Self::Bool(b)) => a == b,\r\n            _ => false,\r\n        }\r\n    }\r\n}\r\nimpl Eq for crate::ScalarValue {}\r\nimpl std::hash::Hash for crate::ScalarValue {\r\n    fn hash<H: std::hash::Hasher>(&self, hasher: &mut H) {\r\n        match *self {\r\n            Self::Sint(v) => v.hash(hasher),\r\n            Self::Uint(v) => v.hash(hasher),\r\n            Self::Float(v) => v.to_bits().hash(hasher),\r\n            Self::Bool(v) => v.hash(hasher),\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::SwizzleComponent {\r\n    pub const XYZW: [Self; 4] = [Self::X, Self::Y, Self::Z, Self::W];\r\n\r\n    pub const fn index(&self) -> u32 {\r\n        match *self {\r\n            Self::X => 0,\r\n            Self::Y => 1,\r\n            Self::Z => 2,\r\n            Self::W => 3,\r\n        }\r\n    }\r\n    pub const fn from_index(idx: u32) -> Self {\r\n        match idx {\r\n            0 => Self::X,\r\n            1 => Self::Y,\r\n            2 => Self::Z,\r\n            _ => Self::W,\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::ImageClass {\r\n    pub const fn is_multisampled(self) -> bool {\r\n        match self {\r\n            crate::ImageClass::Sampled { multi, .. } | crate::ImageClass::Depth { multi } => multi,\r\n            crate::ImageClass::Storage { .. } => false,\r\n        }\r\n    }\r\n\r\n    pub const fn is_mipmapped(self) -> bool {\r\n        match self {\r\n            crate::ImageClass::Sampled { multi, .. } | crate::ImageClass::Depth { multi } => !multi,\r\n            crate::ImageClass::Storage { .. } => false,\r\n        }\r\n    }\r\n}\r\n\r\n#[test]\r\nfn test_matrix_size() {\r\n    let constants = crate::Arena::new();\r\n    assert_eq!(\r\n        crate::TypeInner::Matrix {\r\n            columns: crate::VectorSize::Tri,\r\n            rows: crate::VectorSize::Tri,\r\n            width: 4\r\n        }\r\n        .size(&constants),\r\n        48,\r\n    );\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/proc/namer.rs",
    "content": "use crate::{arena::Handle, FastHashMap, FastHashSet};\r\nuse std::borrow::Cow;\r\n\r\npub type EntryPointIndex = u16;\r\nconst SEPARATOR: char = '_';\r\n\r\n#[derive(Debug, Eq, Hash, PartialEq)]\r\npub enum NameKey {\r\n    Constant(Handle<crate::Constant>),\r\n    GlobalVariable(Handle<crate::GlobalVariable>),\r\n    Type(Handle<crate::Type>),\r\n    StructMember(Handle<crate::Type>, u32),\r\n    Function(Handle<crate::Function>),\r\n    FunctionArgument(Handle<crate::Function>, u32),\r\n    FunctionLocal(Handle<crate::Function>, Handle<crate::LocalVariable>),\r\n    EntryPoint(EntryPointIndex),\r\n    EntryPointLocal(EntryPointIndex, Handle<crate::LocalVariable>),\r\n    EntryPointArgument(EntryPointIndex, u32),\r\n}\r\n\r\n/// This processor assigns names to all the things in a module\r\n/// that may need identifiers in a textual backend.\r\n#[derive(Default)]\r\npub struct Namer {\r\n    /// The last numeric suffix used for each base name. Zero means \"no suffix\".\r\n    unique: FastHashMap<String, u32>,\r\n    keywords: FastHashSet<String>,\r\n    reserved_prefixes: Vec<String>,\r\n}\r\n\r\nimpl Namer {\r\n    /// Return a form of `string` suitable for use as the base of an identifier.\r\n    ///\r\n    /// - Drop leading digits.\r\n    /// - Retain only alphanumeric and `_` characters.\r\n    /// - Avoid prefixes in [`Namer::reserved_prefixes`].\r\n    ///\r\n    /// The return value is a valid identifier prefix in all of Naga's output languages,\r\n    /// and it never ends with a `SEPARATOR` character.\r\n    /// It is used as a key into the unique table.\r\n    fn sanitize<'s>(&self, string: &'s str) -> Cow<'s, str> {\r\n        let string = string\r\n            .trim_start_matches(|c: char| c.is_numeric())\r\n            .trim_end_matches(SEPARATOR);\r\n\r\n        let base = if !string.is_empty()\r\n            && string\r\n                .chars()\r\n                .all(|c: char| c.is_ascii_alphanumeric() || c == '_')\r\n        {\r\n            Cow::Borrowed(string)\r\n        } else {\r\n            let mut filtered = string\r\n                .chars()\r\n                .filter(|&c| c.is_ascii_alphanumeric() || c == '_')\r\n                .collect::<String>();\r\n            let stripped_len = filtered.trim_end_matches(SEPARATOR).len();\r\n            filtered.truncate(stripped_len);\r\n            if filtered.is_empty() {\r\n                filtered.push_str(\"unnamed\");\r\n            }\r\n            Cow::Owned(filtered)\r\n        };\r\n\r\n        for prefix in &self.reserved_prefixes {\r\n            if base.starts_with(prefix) {\r\n                return format!(\"gen_{}\", base).into();\r\n            }\r\n        }\r\n\r\n        base\r\n    }\r\n\r\n    /// Return a new identifier based on `label_raw`.\r\n    ///\r\n    /// The result:\r\n    /// - is a valid identifier even if `label_raw` is not\r\n    /// - conflicts with no keywords listed in `Namer::keywords`, and\r\n    /// - is different from any identifier previously constructed by this\r\n    ///   `Namer`.\r\n    ///\r\n    /// Guarantee uniqueness by applying a numeric suffix when necessary. If `label_raw`\r\n    /// itself ends with digits, separate them from the suffix with an underscore.\r\n    pub fn call(&mut self, label_raw: &str) -> String {\r\n        use std::fmt::Write as _; // for write!-ing to Strings\r\n\r\n        let base = self.sanitize(label_raw);\r\n        debug_assert!(!base.is_empty() && !base.ends_with(SEPARATOR));\r\n\r\n        // This would seem to be a natural place to use `HashMap::entry`. However, `entry`\r\n        // requires an owned key, and we'd like to avoid heap-allocating strings we're\r\n        // just going to throw away. The approach below double-hashes only when we create\r\n        // a new entry, in which case the heap allocation of the owned key was more\r\n        // expensive anyway.\r\n        match self.unique.get_mut(base.as_ref()) {\r\n            Some(count) => {\r\n                *count += 1;\r\n                // Add the suffix. This may fit in base's existing allocation.\r\n                let mut suffixed = base.into_owned();\r\n                write!(suffixed, \"{}{}\", SEPARATOR, *count).unwrap();\r\n                suffixed\r\n            }\r\n            None => {\r\n                let mut suffixed = base.to_string();\r\n                if base.ends_with(char::is_numeric) || self.keywords.contains(base.as_ref()) {\r\n                    suffixed.push(SEPARATOR);\r\n                }\r\n                debug_assert!(!self.keywords.contains(&suffixed));\r\n                // `self.unique` wants to own its keys. This allocates only if we haven't\r\n                // already done so earlier.\r\n                self.unique.insert(base.into_owned(), 0);\r\n                suffixed\r\n            }\r\n        }\r\n    }\r\n\r\n    pub fn call_or(&mut self, label: &Option<String>, fallback: &str) -> String {\r\n        self.call(match *label {\r\n            Some(ref name) => name,\r\n            None => fallback,\r\n        })\r\n    }\r\n\r\n    /// Enter a local namespace for things like structs.\r\n    ///\r\n    /// Struct member names only need to be unique amongst themselves, not\r\n    /// globally. This function temporarily establishes a fresh, empty naming\r\n    /// context for the duration of the call to `body`.\r\n    fn namespace(&mut self, capacity: usize, body: impl FnOnce(&mut Self)) {\r\n        let fresh = FastHashMap::with_capacity_and_hasher(capacity, Default::default());\r\n        let outer = std::mem::replace(&mut self.unique, fresh);\r\n        body(self);\r\n        self.unique = outer;\r\n    }\r\n\r\n    pub fn reset(\r\n        &mut self,\r\n        module: &crate::Module,\r\n        reserved_keywords: &[&str],\r\n        reserved_prefixes: &[&str],\r\n        output: &mut FastHashMap<NameKey, String>,\r\n    ) {\r\n        self.reserved_prefixes.clear();\r\n        self.reserved_prefixes\r\n            .extend(reserved_prefixes.iter().map(|string| string.to_string()));\r\n\r\n        self.unique.clear();\r\n        self.keywords.clear();\r\n        self.keywords\r\n            .extend(reserved_keywords.iter().map(|string| (string.to_string())));\r\n        let mut temp = String::new();\r\n\r\n        for (ty_handle, ty) in module.types.iter() {\r\n            let ty_name = self.call_or(&ty.name, \"type\");\r\n            output.insert(NameKey::Type(ty_handle), ty_name);\r\n\r\n            if let crate::TypeInner::Struct { ref members, .. } = ty.inner {\r\n                // struct members have their own namespace, because access is always prefixed\r\n                self.namespace(members.len(), |namer| {\r\n                    for (index, member) in members.iter().enumerate() {\r\n                        let name = namer.call_or(&member.name, \"member\");\r\n                        output.insert(NameKey::StructMember(ty_handle, index as u32), name);\r\n                    }\r\n                })\r\n            }\r\n        }\r\n\r\n        for (ep_index, ep) in module.entry_points.iter().enumerate() {\r\n            let ep_name = self.call(&ep.name);\r\n            output.insert(NameKey::EntryPoint(ep_index as _), ep_name);\r\n            for (index, arg) in ep.function.arguments.iter().enumerate() {\r\n                let name = self.call_or(&arg.name, \"param\");\r\n                output.insert(\r\n                    NameKey::EntryPointArgument(ep_index as _, index as u32),\r\n                    name,\r\n                );\r\n            }\r\n            for (handle, var) in ep.function.local_variables.iter() {\r\n                let name = self.call_or(&var.name, \"local\");\r\n                output.insert(NameKey::EntryPointLocal(ep_index as _, handle), name);\r\n            }\r\n        }\r\n\r\n        for (fun_handle, fun) in module.functions.iter() {\r\n            let fun_name = self.call_or(&fun.name, \"function\");\r\n            output.insert(NameKey::Function(fun_handle), fun_name);\r\n            for (index, arg) in fun.arguments.iter().enumerate() {\r\n                let name = self.call_or(&arg.name, \"param\");\r\n                output.insert(NameKey::FunctionArgument(fun_handle, index as u32), name);\r\n            }\r\n            for (handle, var) in fun.local_variables.iter() {\r\n                let name = self.call_or(&var.name, \"local\");\r\n                output.insert(NameKey::FunctionLocal(fun_handle, handle), name);\r\n            }\r\n        }\r\n\r\n        for (handle, var) in module.global_variables.iter() {\r\n            let name = self.call_or(&var.name, \"global\");\r\n            output.insert(NameKey::GlobalVariable(handle), name);\r\n        }\r\n\r\n        for (handle, constant) in module.constants.iter() {\r\n            let label = match constant.name {\r\n                Some(ref name) => name,\r\n                None => {\r\n                    use std::fmt::Write;\r\n                    // Try to be more descriptive about the constant values\r\n                    temp.clear();\r\n                    match constant.inner {\r\n                        crate::ConstantInner::Scalar {\r\n                            width: _,\r\n                            value: crate::ScalarValue::Sint(v),\r\n                        } => write!(temp, \"const_{}i\", v),\r\n                        crate::ConstantInner::Scalar {\r\n                            width: _,\r\n                            value: crate::ScalarValue::Uint(v),\r\n                        } => write!(temp, \"const_{}u\", v),\r\n                        crate::ConstantInner::Scalar {\r\n                            width: _,\r\n                            value: crate::ScalarValue::Float(v),\r\n                        } => {\r\n                            let abs = v.abs();\r\n                            write!(\r\n                                temp,\r\n                                \"const_{}{}\",\r\n                                if v < 0.0 { \"n\" } else { \"\" },\r\n                                abs.trunc(),\r\n                            )\r\n                            .unwrap();\r\n                            let fract = abs.fract();\r\n                            if fract == 0.0 {\r\n                                write!(temp, \"f\")\r\n                            } else {\r\n                                write!(temp, \"_{:02}f\", (fract * 100.0) as i8)\r\n                            }\r\n                        }\r\n                        crate::ConstantInner::Scalar {\r\n                            width: _,\r\n                            value: crate::ScalarValue::Bool(v),\r\n                        } => write!(temp, \"const_{}\", v),\r\n                        crate::ConstantInner::Composite { ty, components: _ } => {\r\n                            write!(temp, \"const_{}\", output[&NameKey::Type(ty)])\r\n                        }\r\n                    }\r\n                    .unwrap();\r\n                    &temp\r\n                }\r\n            };\r\n            let name = self.call(label);\r\n            output.insert(NameKey::Constant(handle), name);\r\n        }\r\n    }\r\n}\r\n\r\n#[test]\r\nfn test() {\r\n    let mut namer = Namer::default();\r\n    assert_eq!(namer.call(\"x\"), \"x\");\r\n    assert_eq!(namer.call(\"x\"), \"x_1\");\r\n    assert_eq!(namer.call(\"x1\"), \"x1_\");\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/proc/terminator.rs",
    "content": "/// Ensure that the given block has return statements\r\n/// at the end of its control flow.\r\n///\r\n/// Note: we don't want to blindly append a return statement\r\n/// to the end, because it may be either redundant or invalid,\r\n/// e.g. when the user already has returns in if/else branches.\r\npub fn ensure_block_returns(block: &mut crate::Block) {\r\n    use crate::Statement as S;\r\n    match block.last_mut() {\r\n        Some(&mut S::Block(ref mut b)) => {\r\n            ensure_block_returns(b);\r\n        }\r\n        Some(&mut S::If {\r\n            condition: _,\r\n            ref mut accept,\r\n            ref mut reject,\r\n        }) => {\r\n            ensure_block_returns(accept);\r\n            ensure_block_returns(reject);\r\n        }\r\n        Some(&mut S::Switch {\r\n            selector: _,\r\n            ref mut cases,\r\n        }) => {\r\n            for case in cases.iter_mut() {\r\n                if !case.fall_through {\r\n                    ensure_block_returns(&mut case.body);\r\n                }\r\n            }\r\n        }\r\n        Some(&mut (S::Emit(_) | S::Break | S::Continue | S::Return { .. } | S::Kill)) => (),\r\n        Some(\r\n            &mut (S::Loop { .. }\r\n            | S::Store { .. }\r\n            | S::ImageStore { .. }\r\n            | S::Call { .. }\r\n            | S::Atomic { .. }\r\n            | S::Barrier(_)),\r\n        )\r\n        | None => block.push(S::Return { value: None }, Default::default()),\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/proc/typifier.rs",
    "content": "use crate::arena::{Arena, BadHandle, Handle, UniqueArena};\r\n\r\nuse thiserror::Error;\r\n\r\n/// The result of computing an expression's type.\r\n///\r\n/// This is the (Rust) type returned by [`ResolveContext::resolve`] to represent\r\n/// the (Naga) type it ascribes to some expression.\r\n///\r\n/// You might expect such a function to simply return a `Handle<Type>`. However,\r\n/// we want type resolution to be a read-only process, and that would limit the\r\n/// possible results to types already present in the expression's associated\r\n/// `UniqueArena<Type>`. Naga IR does have certain expressions whose types are\r\n/// not certain to be present.\r\n///\r\n/// So instead, type resolution returns a `TypeResolution` enum: either a\r\n/// [`Handle`], referencing some type in the arena, or a [`Value`], holding a\r\n/// free-floating [`TypeInner`]. This extends the range to cover anything that\r\n/// can be represented with a `TypeInner` referring to the existing arena.\r\n///\r\n/// What sorts of expressions can have types not available in the arena?\r\n///\r\n/// -   An [`Access`] or [`AccessIndex`] expression applied to a [`Vector`] or\r\n///     [`Matrix`] must have a [`Scalar`] or [`Vector`] type. But since `Vector`\r\n///     and `Matrix` represent their element and column types implicitly, not\r\n///     via a handle, there may not be a suitable type in the expression's\r\n///     associated arena. Instead, resolving such an expression returns a\r\n///     `TypeResolution::Value(TypeInner::X { ... })`, where `X` is `Scalar` or\r\n///     `Vector`.\r\n///\r\n/// -   Similarly, the type of an [`Access`] or [`AccessIndex`] expression\r\n///     applied to a *pointer to* a vector or matrix must produce a *pointer to*\r\n///     a scalar or vector type. These cannot be represented with a\r\n///     [`TypeInner::Pointer`], since the `Pointer`'s `base` must point into the\r\n///     arena, and as before, we cannot assume that a suitable scalar or vector\r\n///     type is there. So we take things one step further and provide\r\n///     [`TypeInner::ValuePointer`], specifically for the case of pointers to\r\n///     scalars or vectors. This type fits in a `TypeInner` and is exactly\r\n///     equivalent to a `Pointer` to a `Vector` or `Scalar`.\r\n///\r\n/// So, for example, the type of an `Access` expression applied to a value of type:\r\n///\r\n/// ```ignore\r\n/// TypeInner::Matrix { columns, rows, width }\r\n/// ```\r\n///\r\n/// might be:\r\n///\r\n/// ```ignore\r\n/// TypeResolution::Value(TypeInner::Vector {\r\n///     size: rows,\r\n///     kind: ScalarKind::Float,\r\n///     width,\r\n/// })\r\n/// ```\r\n///\r\n/// and the type of an access to a pointer of address space `space` to such a\r\n/// matrix might be:\r\n///\r\n/// ```ignore\r\n/// TypeResolution::Value(TypeInner::ValuePointer {\r\n///     size: Some(rows),\r\n///     kind: ScalarKind::Float,\r\n///     width,\r\n///     space,\r\n/// })\r\n/// ```\r\n///\r\n/// [`Handle`]: TypeResolution::Handle\r\n/// [`Value`]: TypeResolution::Value\r\n///\r\n/// [`Access`]: crate::Expression::Access\r\n/// [`AccessIndex`]: crate::Expression::AccessIndex\r\n///\r\n/// [`TypeInner`]: crate::TypeInner\r\n/// [`Matrix`]: crate::TypeInner::Matrix\r\n/// [`Pointer`]: crate::TypeInner::Pointer\r\n/// [`Scalar`]: crate::TypeInner::Scalar\r\n/// [`ValuePointer`]: crate::TypeInner::ValuePointer\r\n/// [`Vector`]: crate::TypeInner::Vector\r\n///\r\n/// [`TypeInner::Pointer`]: crate::TypeInner::Pointer\r\n/// [`TypeInner::ValuePointer`]: crate::TypeInner::ValuePointer\r\n#[derive(Debug, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub enum TypeResolution {\r\n    /// A type stored in the associated arena.\r\n    Handle(Handle<crate::Type>),\r\n\r\n    /// A free-floating [`TypeInner`], representing a type that may not be\r\n    /// available in the associated arena. However, the `TypeInner` itself may\r\n    /// contain `Handle<Type>` values referring to types from the arena.\r\n    ///\r\n    /// [`TypeInner`]: crate::TypeInner\r\n    Value(crate::TypeInner),\r\n}\r\n\r\nimpl TypeResolution {\r\n    pub const fn handle(&self) -> Option<Handle<crate::Type>> {\r\n        match *self {\r\n            Self::Handle(handle) => Some(handle),\r\n            Self::Value(_) => None,\r\n        }\r\n    }\r\n\r\n    pub fn inner_with<'a>(&'a self, arena: &'a UniqueArena<crate::Type>) -> &'a crate::TypeInner {\r\n        match *self {\r\n            Self::Handle(handle) => &arena[handle].inner,\r\n            Self::Value(ref inner) => inner,\r\n        }\r\n    }\r\n}\r\n\r\n// Clone is only implemented for numeric variants of `TypeInner`.\r\nimpl Clone for TypeResolution {\r\n    fn clone(&self) -> Self {\r\n        use crate::TypeInner as Ti;\r\n        match *self {\r\n            Self::Handle(handle) => Self::Handle(handle),\r\n            Self::Value(ref v) => Self::Value(match *v {\r\n                Ti::Scalar { kind, width } => Ti::Scalar { kind, width },\r\n                Ti::Vector { size, kind, width } => Ti::Vector { size, kind, width },\r\n                Ti::Matrix {\r\n                    rows,\r\n                    columns,\r\n                    width,\r\n                } => Ti::Matrix {\r\n                    rows,\r\n                    columns,\r\n                    width,\r\n                },\r\n                Ti::Pointer { base, space } => Ti::Pointer { base, space },\r\n                Ti::ValuePointer {\r\n                    size,\r\n                    kind,\r\n                    width,\r\n                    space,\r\n                } => Ti::ValuePointer {\r\n                    size,\r\n                    kind,\r\n                    width,\r\n                    space,\r\n                },\r\n                _ => unreachable!(\"Unexpected clone type: {:?}\", v),\r\n            }),\r\n        }\r\n    }\r\n}\r\n\r\nimpl crate::ConstantInner {\r\n    pub const fn resolve_type(&self) -> TypeResolution {\r\n        match *self {\r\n            Self::Scalar { width, ref value } => TypeResolution::Value(crate::TypeInner::Scalar {\r\n                kind: value.scalar_kind(),\r\n                width,\r\n            }),\r\n            Self::Composite { ty, components: _ } => TypeResolution::Handle(ty),\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Clone, Debug, Error, PartialEq)]\r\npub enum ResolveError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"Index {index} is out of bounds for expression {expr:?}\")]\r\n    OutOfBoundsIndex {\r\n        expr: Handle<crate::Expression>,\r\n        index: u32,\r\n    },\r\n    #[error(\"Invalid access into expression {expr:?}, indexed: {indexed}\")]\r\n    InvalidAccess {\r\n        expr: Handle<crate::Expression>,\r\n        indexed: bool,\r\n    },\r\n    #[error(\"Invalid sub-access into type {ty:?}, indexed: {indexed}\")]\r\n    InvalidSubAccess {\r\n        ty: Handle<crate::Type>,\r\n        indexed: bool,\r\n    },\r\n    #[error(\"Invalid scalar {0:?}\")]\r\n    InvalidScalar(Handle<crate::Expression>),\r\n    #[error(\"Invalid vector {0:?}\")]\r\n    InvalidVector(Handle<crate::Expression>),\r\n    #[error(\"Invalid pointer {0:?}\")]\r\n    InvalidPointer(Handle<crate::Expression>),\r\n    #[error(\"Invalid image {0:?}\")]\r\n    InvalidImage(Handle<crate::Expression>),\r\n    #[error(\"Function {name} not defined\")]\r\n    FunctionNotDefined { name: String },\r\n    #[error(\"Function without return type\")]\r\n    FunctionReturnsVoid,\r\n    #[error(\"Incompatible operands: {0}\")]\r\n    IncompatibleOperands(String),\r\n    #[error(\"Function argument {0} doesn't exist\")]\r\n    FunctionArgumentNotFound(u32),\r\n    #[error(\"Expression {0:?} depends on expressions that follow\")]\r\n    ExpressionForwardDependency(Handle<crate::Expression>),\r\n}\r\n\r\npub struct ResolveContext<'a> {\r\n    pub constants: &'a Arena<crate::Constant>,\r\n    pub types: &'a UniqueArena<crate::Type>,\r\n    pub global_vars: &'a Arena<crate::GlobalVariable>,\r\n    pub local_vars: &'a Arena<crate::LocalVariable>,\r\n    pub functions: &'a Arena<crate::Function>,\r\n    pub arguments: &'a [crate::FunctionArgument],\r\n}\r\n\r\nimpl<'a> ResolveContext<'a> {\r\n    /// Determine the type of `expr`.\r\n    ///\r\n    /// The `past` argument must be a closure that can resolve the types of any\r\n    /// expressions that `expr` refers to. These can be gathered by caching the\r\n    /// results of prior calls to `resolve`, perhaps as done by the\r\n    /// [`front::Typifier`] utility type.\r\n    ///\r\n    /// Type resolution is a read-only process: this method takes `self` by\r\n    /// shared reference. However, this means that we cannot add anything to\r\n    /// `self.types` that we might need to describe `expr`. To work around this,\r\n    /// this method returns a [`TypeResolution`], rather than simply returning a\r\n    /// `Handle<Type>`; see the documentation for [`TypeResolution`] for\r\n    /// details.\r\n    ///\r\n    /// [`front::Typifier`]: crate::front::Typifier\r\n    pub fn resolve(\r\n        &self,\r\n        expr: &crate::Expression,\r\n        past: impl Fn(Handle<crate::Expression>) -> Result<&'a TypeResolution, ResolveError>,\r\n    ) -> Result<TypeResolution, ResolveError> {\r\n        use crate::TypeInner as Ti;\r\n        let types = self.types;\r\n        Ok(match *expr {\r\n            crate::Expression::Access { base, .. } => match *past(base)?.inner_with(types) {\r\n                // Arrays and matrices can only be indexed dynamically behind a\r\n                // pointer, but that's a validation error, not a type error, so\r\n                // go ahead provide a type here.\r\n                Ti::Array { base, .. } => TypeResolution::Handle(base),\r\n                Ti::Matrix { rows, width, .. } => TypeResolution::Value(Ti::Vector {\r\n                    size: rows,\r\n                    kind: crate::ScalarKind::Float,\r\n                    width,\r\n                }),\r\n                Ti::Vector {\r\n                    size: _,\r\n                    kind,\r\n                    width,\r\n                } => TypeResolution::Value(Ti::Scalar { kind, width }),\r\n                Ti::ValuePointer {\r\n                    size: Some(_),\r\n                    kind,\r\n                    width,\r\n                    space,\r\n                } => TypeResolution::Value(Ti::ValuePointer {\r\n                    size: None,\r\n                    kind,\r\n                    width,\r\n                    space,\r\n                }),\r\n                Ti::Pointer { base, space } => {\r\n                    TypeResolution::Value(match types[base].inner {\r\n                        Ti::Array { base, .. } => Ti::Pointer { base, space },\r\n                        Ti::Vector {\r\n                            size: _,\r\n                            kind,\r\n                            width,\r\n                        } => Ti::ValuePointer {\r\n                            size: None,\r\n                            kind,\r\n                            width,\r\n                            space,\r\n                        },\r\n                        // Matrices are only dynamically indexed behind a pointer\r\n                        Ti::Matrix {\r\n                            columns: _,\r\n                            rows,\r\n                            width,\r\n                        } => Ti::ValuePointer {\r\n                            kind: crate::ScalarKind::Float,\r\n                            size: Some(rows),\r\n                            width,\r\n                            space,\r\n                        },\r\n                        ref other => {\r\n                            log::error!(\"Access sub-type {:?}\", other);\r\n                            return Err(ResolveError::InvalidSubAccess {\r\n                                ty: base,\r\n                                indexed: false,\r\n                            });\r\n                        }\r\n                    })\r\n                }\r\n                Ti::BindingArray { base, .. } => TypeResolution::Handle(base),\r\n                ref other => {\r\n                    log::error!(\"Access type {:?}\", other);\r\n                    return Err(ResolveError::InvalidAccess {\r\n                        expr: base,\r\n                        indexed: false,\r\n                    });\r\n                }\r\n            },\r\n            crate::Expression::AccessIndex { base, index } => {\r\n                match *past(base)?.inner_with(types) {\r\n                    Ti::Vector { size, kind, width } => {\r\n                        if index >= size as u32 {\r\n                            return Err(ResolveError::OutOfBoundsIndex { expr: base, index });\r\n                        }\r\n                        TypeResolution::Value(Ti::Scalar { kind, width })\r\n                    }\r\n                    Ti::Matrix {\r\n                        columns,\r\n                        rows,\r\n                        width,\r\n                    } => {\r\n                        if index >= columns as u32 {\r\n                            return Err(ResolveError::OutOfBoundsIndex { expr: base, index });\r\n                        }\r\n                        TypeResolution::Value(crate::TypeInner::Vector {\r\n                            size: rows,\r\n                            kind: crate::ScalarKind::Float,\r\n                            width,\r\n                        })\r\n                    }\r\n                    Ti::Array { base, .. } => TypeResolution::Handle(base),\r\n                    Ti::Struct { ref members, .. } => {\r\n                        let member = members\r\n                            .get(index as usize)\r\n                            .ok_or(ResolveError::OutOfBoundsIndex { expr: base, index })?;\r\n                        TypeResolution::Handle(member.ty)\r\n                    }\r\n                    Ti::ValuePointer {\r\n                        size: Some(size),\r\n                        kind,\r\n                        width,\r\n                        space,\r\n                    } => {\r\n                        if index >= size as u32 {\r\n                            return Err(ResolveError::OutOfBoundsIndex { expr: base, index });\r\n                        }\r\n                        TypeResolution::Value(Ti::ValuePointer {\r\n                            size: None,\r\n                            kind,\r\n                            width,\r\n                            space,\r\n                        })\r\n                    }\r\n                    Ti::Pointer {\r\n                        base: ty_base,\r\n                        space,\r\n                    } => TypeResolution::Value(match types[ty_base].inner {\r\n                        Ti::Array { base, .. } => Ti::Pointer { base, space },\r\n                        Ti::Vector { size, kind, width } => {\r\n                            if index >= size as u32 {\r\n                                return Err(ResolveError::OutOfBoundsIndex { expr: base, index });\r\n                            }\r\n                            Ti::ValuePointer {\r\n                                size: None,\r\n                                kind,\r\n                                width,\r\n                                space,\r\n                            }\r\n                        }\r\n                        Ti::Matrix {\r\n                            rows,\r\n                            columns,\r\n                            width,\r\n                        } => {\r\n                            if index >= columns as u32 {\r\n                                return Err(ResolveError::OutOfBoundsIndex { expr: base, index });\r\n                            }\r\n                            Ti::ValuePointer {\r\n                                size: Some(rows),\r\n                                kind: crate::ScalarKind::Float,\r\n                                width,\r\n                                space,\r\n                            }\r\n                        }\r\n                        Ti::Struct { ref members, .. } => {\r\n                            let member = members\r\n                                .get(index as usize)\r\n                                .ok_or(ResolveError::OutOfBoundsIndex { expr: base, index })?;\r\n                            Ti::Pointer {\r\n                                base: member.ty,\r\n                                space,\r\n                            }\r\n                        }\r\n                        ref other => {\r\n                            log::error!(\"Access index sub-type {:?}\", other);\r\n                            return Err(ResolveError::InvalidSubAccess {\r\n                                ty: ty_base,\r\n                                indexed: true,\r\n                            });\r\n                        }\r\n                    }),\r\n                    Ti::BindingArray { base, .. } => TypeResolution::Handle(base),\r\n                    ref other => {\r\n                        log::error!(\"Access index type {:?}\", other);\r\n                        return Err(ResolveError::InvalidAccess {\r\n                            expr: base,\r\n                            indexed: true,\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n            crate::Expression::Constant(h) => {\r\n                let constant = self.constants.try_get(h)?;\r\n                match constant.inner {\r\n                    crate::ConstantInner::Scalar { width, ref value } => {\r\n                        TypeResolution::Value(Ti::Scalar {\r\n                            kind: value.scalar_kind(),\r\n                            width,\r\n                        })\r\n                    }\r\n                    crate::ConstantInner::Composite { ty, components: _ } => {\r\n                        TypeResolution::Handle(ty)\r\n                    }\r\n                }\r\n            }\r\n            crate::Expression::Splat { size, value } => match *past(value)?.inner_with(types) {\r\n                Ti::Scalar { kind, width } => {\r\n                    TypeResolution::Value(Ti::Vector { size, kind, width })\r\n                }\r\n                ref other => {\r\n                    log::error!(\"Scalar type {:?}\", other);\r\n                    return Err(ResolveError::InvalidScalar(value));\r\n                }\r\n            },\r\n            crate::Expression::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern: _,\r\n            } => match *past(vector)?.inner_with(types) {\r\n                Ti::Vector {\r\n                    size: _,\r\n                    kind,\r\n                    width,\r\n                } => TypeResolution::Value(Ti::Vector { size, kind, width }),\r\n                ref other => {\r\n                    log::error!(\"Vector type {:?}\", other);\r\n                    return Err(ResolveError::InvalidVector(vector));\r\n                }\r\n            },\r\n            crate::Expression::Compose { ty, .. } => TypeResolution::Handle(ty),\r\n            crate::Expression::FunctionArgument(index) => {\r\n                let arg = self\r\n                    .arguments\r\n                    .get(index as usize)\r\n                    .ok_or(ResolveError::FunctionArgumentNotFound(index))?;\r\n                TypeResolution::Handle(arg.ty)\r\n            }\r\n            crate::Expression::GlobalVariable(h) => {\r\n                let var = self.global_vars.try_get(h)?;\r\n                if var.space == crate::AddressSpace::Handle {\r\n                    TypeResolution::Handle(var.ty)\r\n                } else {\r\n                    TypeResolution::Value(Ti::Pointer {\r\n                        base: var.ty,\r\n                        space: var.space,\r\n                    })\r\n                }\r\n            }\r\n            crate::Expression::LocalVariable(h) => {\r\n                let var = self.local_vars.try_get(h)?;\r\n                TypeResolution::Value(Ti::Pointer {\r\n                    base: var.ty,\r\n                    space: crate::AddressSpace::Function,\r\n                })\r\n            }\r\n            crate::Expression::Load { pointer } => match *past(pointer)?.inner_with(types) {\r\n                Ti::Pointer { base, space: _ } => {\r\n                    if let Ti::Atomic { kind, width } = types[base].inner {\r\n                        TypeResolution::Value(Ti::Scalar { kind, width })\r\n                    } else {\r\n                        TypeResolution::Handle(base)\r\n                    }\r\n                }\r\n                Ti::ValuePointer {\r\n                    size,\r\n                    kind,\r\n                    width,\r\n                    space: _,\r\n                } => TypeResolution::Value(match size {\r\n                    Some(size) => Ti::Vector { size, kind, width },\r\n                    None => Ti::Scalar { kind, width },\r\n                }),\r\n                ref other => {\r\n                    log::error!(\"Pointer type {:?}\", other);\r\n                    return Err(ResolveError::InvalidPointer(pointer));\r\n                }\r\n            },\r\n            crate::Expression::ImageSample {\r\n                image,\r\n                gather: Some(_),\r\n                ..\r\n            } => match *past(image)?.inner_with(types) {\r\n                Ti::Image { class, .. } => TypeResolution::Value(Ti::Vector {\r\n                    kind: match class {\r\n                        crate::ImageClass::Sampled { kind, multi: _ } => kind,\r\n                        _ => crate::ScalarKind::Float,\r\n                    },\r\n                    width: 4,\r\n                    size: crate::VectorSize::Quad,\r\n                }),\r\n                ref other => {\r\n                    log::error!(\"Image type {:?}\", other);\r\n                    return Err(ResolveError::InvalidImage(image));\r\n                }\r\n            },\r\n            crate::Expression::ImageSample { image, .. }\r\n            | crate::Expression::ImageLoad { image, .. } => match *past(image)?.inner_with(types) {\r\n                Ti::Image { class, .. } => TypeResolution::Value(match class {\r\n                    crate::ImageClass::Depth { multi: _ } => Ti::Scalar {\r\n                        kind: crate::ScalarKind::Float,\r\n                        width: 4,\r\n                    },\r\n                    crate::ImageClass::Sampled { kind, multi: _ } => Ti::Vector {\r\n                        kind,\r\n                        width: 4,\r\n                        size: crate::VectorSize::Quad,\r\n                    },\r\n                    crate::ImageClass::Storage { format, .. } => Ti::Vector {\r\n                        kind: format.into(),\r\n                        width: 4,\r\n                        size: crate::VectorSize::Quad,\r\n                    },\r\n                }),\r\n                ref other => {\r\n                    log::error!(\"Image type {:?}\", other);\r\n                    return Err(ResolveError::InvalidImage(image));\r\n                }\r\n            },\r\n            crate::Expression::ImageQuery { image, query } => TypeResolution::Value(match query {\r\n                crate::ImageQuery::Size { level: _ } => match *past(image)?.inner_with(types) {\r\n                    Ti::Image { dim, .. } => match dim {\r\n                        crate::ImageDimension::D1 => Ti::Scalar {\r\n                            kind: crate::ScalarKind::Sint,\r\n                            width: 4,\r\n                        },\r\n                        crate::ImageDimension::D2 | crate::ImageDimension::Cube => Ti::Vector {\r\n                            size: crate::VectorSize::Bi,\r\n                            kind: crate::ScalarKind::Sint,\r\n                            width: 4,\r\n                        },\r\n                        crate::ImageDimension::D3 => Ti::Vector {\r\n                            size: crate::VectorSize::Tri,\r\n                            kind: crate::ScalarKind::Sint,\r\n                            width: 4,\r\n                        },\r\n                    },\r\n                    ref other => {\r\n                        log::error!(\"Image type {:?}\", other);\r\n                        return Err(ResolveError::InvalidImage(image));\r\n                    }\r\n                },\r\n                crate::ImageQuery::NumLevels\r\n                | crate::ImageQuery::NumLayers\r\n                | crate::ImageQuery::NumSamples => Ti::Scalar {\r\n                    kind: crate::ScalarKind::Sint,\r\n                    width: 4,\r\n                },\r\n            }),\r\n            crate::Expression::Unary { expr, .. } => past(expr)?.clone(),\r\n            crate::Expression::Binary { op, left, right } => match op {\r\n                crate::BinaryOperator::Add\r\n                | crate::BinaryOperator::Subtract\r\n                | crate::BinaryOperator::Divide\r\n                | crate::BinaryOperator::Modulo => past(left)?.clone(),\r\n                crate::BinaryOperator::Multiply => {\r\n                    let (res_left, res_right) = (past(left)?, past(right)?);\r\n                    match (res_left.inner_with(types), res_right.inner_with(types)) {\r\n                        (\r\n                            &Ti::Matrix {\r\n                                columns: _,\r\n                                rows,\r\n                                width,\r\n                            },\r\n                            &Ti::Matrix { columns, .. },\r\n                        ) => TypeResolution::Value(Ti::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        }),\r\n                        (\r\n                            &Ti::Matrix {\r\n                                columns: _,\r\n                                rows,\r\n                                width,\r\n                            },\r\n                            &Ti::Vector { .. },\r\n                        ) => TypeResolution::Value(Ti::Vector {\r\n                            size: rows,\r\n                            kind: crate::ScalarKind::Float,\r\n                            width,\r\n                        }),\r\n                        (\r\n                            &Ti::Vector { .. },\r\n                            &Ti::Matrix {\r\n                                columns,\r\n                                rows: _,\r\n                                width,\r\n                            },\r\n                        ) => TypeResolution::Value(Ti::Vector {\r\n                            size: columns,\r\n                            kind: crate::ScalarKind::Float,\r\n                            width,\r\n                        }),\r\n                        (&Ti::Scalar { .. }, _) => res_right.clone(),\r\n                        (_, &Ti::Scalar { .. }) => res_left.clone(),\r\n                        (&Ti::Vector { .. }, &Ti::Vector { .. }) => res_left.clone(),\r\n                        (tl, tr) => {\r\n                            return Err(ResolveError::IncompatibleOperands(format!(\r\n                                \"{:?} * {:?}\",\r\n                                tl, tr\r\n                            )))\r\n                        }\r\n                    }\r\n                }\r\n                crate::BinaryOperator::Equal\r\n                | crate::BinaryOperator::NotEqual\r\n                | crate::BinaryOperator::Less\r\n                | crate::BinaryOperator::LessEqual\r\n                | crate::BinaryOperator::Greater\r\n                | crate::BinaryOperator::GreaterEqual\r\n                | crate::BinaryOperator::LogicalAnd\r\n                | crate::BinaryOperator::LogicalOr => {\r\n                    let kind = crate::ScalarKind::Bool;\r\n                    let width = crate::BOOL_WIDTH;\r\n                    let inner = match *past(left)?.inner_with(types) {\r\n                        Ti::Scalar { .. } => Ti::Scalar { kind, width },\r\n                        Ti::Vector { size, .. } => Ti::Vector { size, kind, width },\r\n                        ref other => {\r\n                            return Err(ResolveError::IncompatibleOperands(format!(\r\n                                \"{:?}({:?}, _)\",\r\n                                op, other\r\n                            )))\r\n                        }\r\n                    };\r\n                    TypeResolution::Value(inner)\r\n                }\r\n                crate::BinaryOperator::And\r\n                | crate::BinaryOperator::ExclusiveOr\r\n                | crate::BinaryOperator::InclusiveOr\r\n                | crate::BinaryOperator::ShiftLeft\r\n                | crate::BinaryOperator::ShiftRight => past(left)?.clone(),\r\n            },\r\n            crate::Expression::AtomicResult {\r\n                kind,\r\n                width,\r\n                ..\r\n            } => {\r\n                TypeResolution::Value(Ti::Scalar { kind, width })\r\n            }\r\n            crate::Expression::Select { accept, .. } => past(accept)?.clone(),\r\n            crate::Expression::Derivative { axis: _, expr } => past(expr)?.clone(),\r\n            crate::Expression::Relational { fun, argument } => match fun {\r\n                crate::RelationalFunction::All | crate::RelationalFunction::Any => {\r\n                    TypeResolution::Value(Ti::Scalar {\r\n                        kind: crate::ScalarKind::Bool,\r\n                        width: crate::BOOL_WIDTH,\r\n                    })\r\n                }\r\n                crate::RelationalFunction::IsNan\r\n                | crate::RelationalFunction::IsInf\r\n                | crate::RelationalFunction::IsFinite\r\n                | crate::RelationalFunction::IsNormal => match *past(argument)?.inner_with(types) {\r\n                    Ti::Scalar { .. } => TypeResolution::Value(Ti::Scalar {\r\n                        kind: crate::ScalarKind::Bool,\r\n                        width: crate::BOOL_WIDTH,\r\n                    }),\r\n                    Ti::Vector { size, .. } => TypeResolution::Value(Ti::Vector {\r\n                        kind: crate::ScalarKind::Bool,\r\n                        width: crate::BOOL_WIDTH,\r\n                        size,\r\n                    }),\r\n                    ref other => {\r\n                        return Err(ResolveError::IncompatibleOperands(format!(\r\n                            \"{:?}({:?})\",\r\n                            fun, other\r\n                        )))\r\n                    }\r\n                },\r\n            },\r\n            crate::Expression::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2: _,\r\n                arg3: _,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n                let res_arg = past(arg)?;\r\n                match fun {\r\n                    // comparison\r\n                    Mf::Abs |\r\n                    Mf::Min |\r\n                    Mf::Max |\r\n                    Mf::Clamp |\r\n                    Mf::Saturate |\r\n                    // trigonometry\r\n                    Mf::Cos |\r\n                    Mf::Cosh |\r\n                    Mf::Sin |\r\n                    Mf::Sinh |\r\n                    Mf::Tan |\r\n                    Mf::Tanh |\r\n                    Mf::Acos |\r\n                    Mf::Asin |\r\n                    Mf::Atan |\r\n                    Mf::Atan2 |\r\n                    Mf::Asinh |\r\n                    Mf::Acosh |\r\n                    Mf::Atanh |\r\n                    Mf::Radians |\r\n                    Mf::Degrees |\r\n                    // decomposition\r\n                    Mf::Ceil |\r\n                    Mf::Floor |\r\n                    Mf::Round |\r\n                    Mf::Fract |\r\n                    Mf::Trunc |\r\n                    Mf::Modf |\r\n                    Mf::Frexp |\r\n                    Mf::Ldexp |\r\n                    // exponent\r\n                    Mf::Exp |\r\n                    Mf::Exp2 |\r\n                    Mf::Log |\r\n                    Mf::Log2 |\r\n                    Mf::Pow => res_arg.clone(),\r\n                    // geometry\r\n                    Mf::Dot => match *res_arg.inner_with(types) {\r\n                        Ti::Vector {\r\n                            kind,\r\n                            size: _,\r\n                            width,\r\n                        } => TypeResolution::Value(Ti::Scalar { kind, width }),\r\n                        ref other =>\r\n                            return Err(ResolveError::IncompatibleOperands(\r\n                                format!(\"{:?}({:?}, _)\", fun, other)\r\n                            )),\r\n                    },\r\n                    Mf::Outer => {\r\n                        let arg1 = arg1.ok_or_else(|| ResolveError::IncompatibleOperands(\r\n                            format!(\"{:?}(_, None)\", fun)\r\n                        ))?;\r\n                        match (res_arg.inner_with(types), past(arg1)?.inner_with(types)) {\r\n                            (&Ti::Vector {kind: _, size: columns,width}, &Ti::Vector{ size: rows, .. }) => TypeResolution::Value(Ti::Matrix { columns, rows, width }),\r\n                            (left, right) =>\r\n                                return Err(ResolveError::IncompatibleOperands(\r\n                                    format!(\"{:?}({:?}, {:?})\", fun, left, right)\r\n                                )),\r\n                        }\r\n                    },\r\n                    Mf::Cross => res_arg.clone(),\r\n                    Mf::Distance |\r\n                    Mf::Length => match *res_arg.inner_with(types) {\r\n                        Ti::Scalar {width,kind} |\r\n                        Ti::Vector {width,kind,size:_} => TypeResolution::Value(Ti::Scalar { kind, width }),\r\n                        ref other => return Err(ResolveError::IncompatibleOperands(\r\n                                format!(\"{:?}({:?})\", fun, other)\r\n                            )),\r\n                    },\r\n                    Mf::Normalize |\r\n                    Mf::FaceForward |\r\n                    Mf::Reflect |\r\n                    Mf::Refract => res_arg.clone(),\r\n                    // computational\r\n                    Mf::Sign |\r\n                    Mf::Fma |\r\n                    Mf::Mix |\r\n                    Mf::Step |\r\n                    Mf::SmoothStep |\r\n                    Mf::Sqrt |\r\n                    Mf::InverseSqrt => res_arg.clone(),\r\n                    Mf::Transpose => match *res_arg.inner_with(types) {\r\n                        Ti::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        } => TypeResolution::Value(Ti::Matrix {\r\n                            columns: rows,\r\n                            rows: columns,\r\n                            width,\r\n                        }),\r\n                        ref other => return Err(ResolveError::IncompatibleOperands(\r\n                            format!(\"{:?}({:?})\", fun, other)\r\n                        )),\r\n                    },\r\n                    Mf::Inverse => match *res_arg.inner_with(types) {\r\n                        Ti::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        } if columns == rows => TypeResolution::Value(Ti::Matrix {\r\n                            columns,\r\n                            rows,\r\n                            width,\r\n                        }),\r\n                        ref other => return Err(ResolveError::IncompatibleOperands(\r\n                            format!(\"{:?}({:?})\", fun, other)\r\n                        )),\r\n                    },\r\n                    Mf::Determinant => match *res_arg.inner_with(types) {\r\n                        Ti::Matrix {\r\n                            width,\r\n                            ..\r\n                        } => TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Float, width }),\r\n                        ref other => return Err(ResolveError::IncompatibleOperands(\r\n                            format!(\"{:?}({:?})\", fun, other)\r\n                        )),\r\n                    },\r\n                    // bits\r\n                    Mf::CountOneBits |\r\n                    Mf::ReverseBits |\r\n                    Mf::ExtractBits |\r\n                    Mf::InsertBits |\r\n                    Mf::FindLsb |\r\n                    Mf::FindMsb => match *res_arg.inner_with(types)  {\r\n                        Ti::Scalar { kind: kind @ (crate::ScalarKind::Sint | crate::ScalarKind::Uint), width } =>\r\n                            TypeResolution::Value(Ti::Scalar { kind, width }),\r\n                        Ti::Vector { size, kind: kind @ (crate::ScalarKind::Sint | crate::ScalarKind::Uint), width } =>\r\n                            TypeResolution::Value(Ti::Vector { size, kind, width }),\r\n                        ref other => return Err(ResolveError::IncompatibleOperands(\r\n                                format!(\"{:?}({:?})\", fun, other)\r\n                            )),\r\n                    },\r\n                    // data packing\r\n                    Mf::Pack4x8snorm |\r\n                    Mf::Pack4x8unorm |\r\n                    Mf::Pack2x16snorm |\r\n                    Mf::Pack2x16unorm |\r\n                    Mf::Pack2x16float => TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Uint, width: 4 }),\r\n                    // data unpacking\r\n                    Mf::Unpack4x8snorm |\r\n                    Mf::Unpack4x8unorm => TypeResolution::Value(Ti::Vector { size: crate::VectorSize::Quad, kind: crate::ScalarKind::Float, width: 4 }),\r\n                    Mf::Unpack2x16snorm |\r\n                    Mf::Unpack2x16unorm |\r\n                    Mf::Unpack2x16float => TypeResolution::Value(Ti::Vector { size: crate::VectorSize::Bi, kind: crate::ScalarKind::Float, width: 4 }),\r\n                }\r\n            }\r\n            crate::Expression::As {\r\n                expr,\r\n                kind,\r\n                convert,\r\n            } => match *past(expr)?.inner_with(types) {\r\n                Ti::Scalar { kind: _, width } => TypeResolution::Value(Ti::Scalar {\r\n                    kind,\r\n                    width: convert.unwrap_or(width),\r\n                }),\r\n                Ti::Vector {\r\n                    kind: _,\r\n                    size,\r\n                    width,\r\n                } => TypeResolution::Value(Ti::Vector {\r\n                    kind,\r\n                    size,\r\n                    width: convert.unwrap_or(width),\r\n                }),\r\n                Ti::Matrix {\r\n                    columns,\r\n                    rows,\r\n                    width,\r\n                } => TypeResolution::Value(Ti::Matrix {\r\n                    columns,\r\n                    rows,\r\n                    width: convert.unwrap_or(width),\r\n                }),\r\n                ref other => {\r\n                    return Err(ResolveError::IncompatibleOperands(format!(\r\n                        \"{:?} as {:?}\",\r\n                        other, kind\r\n                    )))\r\n                }\r\n            },\r\n            crate::Expression::CallResult(function) => {\r\n                let result = self.functions[function]\r\n                    .result\r\n                    .as_ref()\r\n                    .ok_or(ResolveError::FunctionReturnsVoid)?;\r\n                TypeResolution::Handle(result.ty)\r\n            }\r\n            crate::Expression::ArrayLength(_) => TypeResolution::Value(Ti::Scalar {\r\n                kind: crate::ScalarKind::Uint,\r\n                width: 4,\r\n            }),\r\n        })\r\n    }\r\n}\r\n\r\n#[test]\r\nfn test_error_size() {\r\n    use std::mem::size_of;\r\n    assert_eq!(size_of::<ResolveError>(), 32);\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/span.rs",
    "content": "use crate::{Arena, Handle, UniqueArena};\r\nuse std::{error::Error, fmt, ops::Range};\r\n\r\n/// A source code span, used for error reporting.\r\n#[derive(Clone, Copy, Debug, PartialEq, Default)]\r\n#[cfg_attr(feature = \"arbitrary\", derive(arbitrary::Arbitrary))]\r\npub struct Span {\r\n    start: u32,\r\n    end: u32,\r\n}\r\n\r\nimpl Span {\r\n    pub const UNDEFINED: Self = Self { start: 0, end: 0 };\r\n    /// Creates a new `Span` from a range of byte indices\r\n    ///\r\n    /// Note: end is exclusive, it doesn't belong to the `Span`\r\n    pub const fn new(start: u32, end: u32) -> Self {\r\n        Span { start, end }\r\n    }\r\n\r\n    /// Modifies `self` to contain the smallest `Span` possible that\r\n    /// contains both `self` and `other`\r\n    pub fn subsume(&mut self, other: Self) {\r\n        *self = if !self.is_defined() {\r\n            // self isn't defined so use other\r\n            other\r\n        } else if !other.is_defined() {\r\n            // other isn't defined so don't try to subsume\r\n            *self\r\n        } else {\r\n            // Both self and other are defined so calculate the span that contains them both\r\n            Span {\r\n                start: self.start.min(other.start),\r\n                end: self.end.max(other.end),\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Returns the smallest `Span` possible that contains all the `Span`s\r\n    /// defined in the `from` iterator\r\n    pub fn total_span<T: Iterator<Item = Self>>(from: T) -> Self {\r\n        let mut span: Self = Default::default();\r\n        for other in from {\r\n            span.subsume(other);\r\n        }\r\n        span\r\n    }\r\n\r\n    /// Converts `self` to a range if the span is not unknown\r\n    pub fn to_range(self) -> Option<Range<usize>> {\r\n        if self.is_defined() {\r\n            Some(self.start as usize..self.end as usize)\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n\r\n    /// Check whether `self` was defined or is a default/unknown span\r\n    pub fn is_defined(&self) -> bool {\r\n        *self != Self::default()\r\n    }\r\n\r\n    /// Return a [`SourceLocation`] for this span in the provided source.\r\n    pub fn location(&self, source: &str) -> SourceLocation {\r\n        let prefix = &source[..self.start as usize];\r\n        let line_number = prefix.matches('\\n').count() as u32 + 1;\r\n        let line_start = prefix.rfind('\\n').map(|pos| pos + 1).unwrap_or(0);\r\n        let line_position = source[line_start..self.start as usize].chars().count() as u32 + 1;\r\n\r\n        SourceLocation {\r\n            line_number,\r\n            line_position,\r\n            offset: self.start,\r\n            length: self.end - self.start,\r\n        }\r\n    }\r\n}\r\n\r\nimpl From<Range<usize>> for Span {\r\n    fn from(range: Range<usize>) -> Self {\r\n        Span {\r\n            start: range.start as u32,\r\n            end: range.end as u32,\r\n        }\r\n    }\r\n}\r\n\r\n/// A human-readable representation for a span, tailored for text source.\r\n///\r\n/// Corresponds to the positional members of [`GPUCompilationMessage`][gcm] from\r\n/// the WebGPU specification, except that `offset` and `length` are in bytes\r\n/// (UTF-8 code units), instead of UTF-16 code units.\r\n///\r\n/// [gcm]: https://www.w3.org/TR/webgpu/#gpucompilationmessage\r\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\r\npub struct SourceLocation {\r\n    /// 1-based line number.\r\n    pub line_number: u32,\r\n    /// 1-based column of the start of this span\r\n    pub line_position: u32,\r\n    /// 0-based Offset in code units (in bytes) of the start of the span.\r\n    pub offset: u32,\r\n    /// Length in code units (in bytes) of the span.\r\n    pub length: u32,\r\n}\r\n\r\n/// A source code span together with \"context\", a user-readable description of what part of the error it refers to.\r\npub type SpanContext = (Span, String);\r\n\r\n/// Wrapper class for [`Error`], augmenting it with a list of [`SpanContext`]s.\r\n#[derive(Debug, Clone)]\r\npub struct WithSpan<E> {\r\n    inner: E,\r\n    #[cfg(feature = \"span\")]\r\n    spans: Vec<SpanContext>,\r\n}\r\n\r\nimpl<E> fmt::Display for WithSpan<E>\r\nwhere\r\n    E: fmt::Display,\r\n{\r\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {\r\n        self.inner.fmt(f)\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nimpl<E> PartialEq for WithSpan<E>\r\nwhere\r\n    E: PartialEq,\r\n{\r\n    fn eq(&self, other: &Self) -> bool {\r\n        self.inner.eq(&other.inner)\r\n    }\r\n}\r\n\r\nimpl<E> Error for WithSpan<E>\r\nwhere\r\n    E: Error,\r\n{\r\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\r\n        self.inner.source()\r\n    }\r\n}\r\n\r\nimpl<E> WithSpan<E> {\r\n    /// Create a new [`WithSpan`] from an [`Error`], containing no spans.\r\n    pub const fn new(inner: E) -> Self {\r\n        Self {\r\n            inner,\r\n            #[cfg(feature = \"span\")]\r\n            spans: Vec::new(),\r\n        }\r\n    }\r\n\r\n    /// Reverse of [`Self::new`], discards span information and returns an inner error.\r\n    #[allow(clippy::missing_const_for_fn)] // ignore due to requirement of #![feature(const_precise_live_drops)]\r\n    pub fn into_inner(self) -> E {\r\n        self.inner\r\n    }\r\n\r\n    pub const fn as_inner(&self) -> &E {\r\n        &self.inner\r\n    }\r\n\r\n    /// Iterator over stored [`SpanContext`]s.\r\n    pub fn spans(&self) -> impl Iterator<Item = &SpanContext> + ExactSizeIterator {\r\n        #[cfg(feature = \"span\")]\r\n        return self.spans.iter();\r\n        #[cfg(not(feature = \"span\"))]\r\n        return std::iter::empty();\r\n    }\r\n\r\n    /// Add a new span with description.\r\n    #[cfg_attr(not(feature = \"span\"), allow(unused_variables, unused_mut))]\r\n    pub fn with_span<S>(mut self, span: Span, description: S) -> Self\r\n    where\r\n        S: ToString,\r\n    {\r\n        #[cfg(feature = \"span\")]\r\n        if span.is_defined() {\r\n            self.spans.push((span, description.to_string()));\r\n        }\r\n        self\r\n    }\r\n\r\n    /// Add a [`SpanContext`].\r\n    pub fn with_context(self, span_context: SpanContext) -> Self {\r\n        let (span, description) = span_context;\r\n        self.with_span(span, description)\r\n    }\r\n\r\n    /// Add a [`Handle`] from either [`Arena`] or [`UniqueArena`], borrowing its span information from there\r\n    /// and annotating with a type and the handle representation.\r\n    pub(crate) fn with_handle<T, A: SpanProvider<T>>(self, handle: Handle<T>, arena: &A) -> Self {\r\n        self.with_context(arena.get_span_context(handle))\r\n    }\r\n\r\n    /// Convert inner error using [`From`].\r\n    pub fn into_other<E2>(self) -> WithSpan<E2>\r\n    where\r\n        E2: From<E>,\r\n    {\r\n        WithSpan {\r\n            inner: self.inner.into(),\r\n            #[cfg(feature = \"span\")]\r\n            spans: self.spans,\r\n        }\r\n    }\r\n\r\n    /// Convert inner error into another type. Joins span information contained in `self`\r\n    /// with what is returned from `func`.\r\n    pub fn and_then<F, E2>(self, func: F) -> WithSpan<E2>\r\n    where\r\n        F: FnOnce(E) -> WithSpan<E2>,\r\n    {\r\n        #[cfg_attr(not(feature = \"span\"), allow(unused_mut))]\r\n        let mut res = func(self.inner);\r\n        #[cfg(feature = \"span\")]\r\n        res.spans.extend(self.spans);\r\n        res\r\n    }\r\n\r\n    #[cfg(feature = \"span\")]\r\n    /// Return a [`SourceLocation`] for our first span, if we have one.\r\n    pub fn location(&self, source: &str) -> Option<SourceLocation> {\r\n        if self.spans.is_empty() {\r\n            return None;\r\n        }\r\n\r\n        Some(self.spans[0].0.location(source))\r\n    }\r\n\r\n    #[cfg(not(feature = \"span\"))]\r\n    /// Return a [`SourceLocation`] for our first span, if we have one.\r\n    pub fn location(&self, _source: &str) -> Option<SourceLocation> {\r\n        None\r\n    }\r\n\r\n    #[cfg(feature = \"span\")]\r\n    fn diagnostic(&self) -> codespan_reporting::diagnostic::Diagnostic<()>\r\n    where\r\n        E: Error,\r\n    {\r\n        use codespan_reporting::diagnostic::{Diagnostic, Label};\r\n        let diagnostic = Diagnostic::error()\r\n            .with_message(self.inner.to_string())\r\n            .with_labels(\r\n                self.spans()\r\n                    .map(|&(span, ref desc)| {\r\n                        Label::primary((), span.to_range().unwrap()).with_message(desc.to_owned())\r\n                    })\r\n                    .collect(),\r\n            )\r\n            .with_notes({\r\n                let mut notes = Vec::new();\r\n                let mut source: &dyn Error = &self.inner;\r\n                while let Some(next) = Error::source(source) {\r\n                    notes.push(next.to_string());\r\n                    source = next;\r\n                }\r\n                notes\r\n            });\r\n        diagnostic\r\n    }\r\n\r\n    /// Emits a summary of the error to standard error stream.\r\n    #[cfg(feature = \"span\")]\r\n    pub fn emit_to_stderr(&self, source: &str)\r\n    where\r\n        E: Error,\r\n    {\r\n        self.emit_to_stderr_with_path(source, \"wgsl\")\r\n    }\r\n\r\n    /// Emits a summary of the error to standard error stream.\r\n    #[cfg(feature = \"span\")]\r\n    pub fn emit_to_stderr_with_path(&self, source: &str, path: &str)\r\n    where\r\n        E: Error,\r\n    {\r\n        use codespan_reporting::{files, term};\r\n        use term::termcolor::{ColorChoice, StandardStream};\r\n\r\n        let files = files::SimpleFile::new(path, source);\r\n        let config = term::Config::default();\r\n        let writer = StandardStream::stderr(ColorChoice::Auto);\r\n        term::emit(&mut writer.lock(), &config, &files, &self.diagnostic())\r\n            .expect(\"cannot write error\");\r\n    }\r\n\r\n    /// Emits a summary of the error to a string.\r\n    #[cfg(feature = \"span\")]\r\n    pub fn emit_to_string(&self, source: &str) -> String\r\n    where\r\n        E: Error,\r\n    {\r\n        self.emit_to_string_with_path(source, \"wgsl\")\r\n    }\r\n\r\n    /// Emits a summary of the error to a string.\r\n    #[cfg(feature = \"span\")]\r\n    pub fn emit_to_string_with_path(&self, source: &str, path: &str) -> String\r\n    where\r\n        E: Error,\r\n    {\r\n        use codespan_reporting::{files, term};\r\n        use term::termcolor::NoColor;\r\n\r\n        let files = files::SimpleFile::new(path, source);\r\n        let config = codespan_reporting::term::Config::default();\r\n        let mut writer = NoColor::new(Vec::new());\r\n        term::emit(&mut writer, &config, &files, &self.diagnostic()).expect(\"cannot write error\");\r\n        String::from_utf8(writer.into_inner()).unwrap()\r\n    }\r\n}\r\n\r\n/// Convenience trait for [`Error`] to be able to apply spans to anything.\r\npub(crate) trait AddSpan: Sized {\r\n    type Output;\r\n    /// See [`WithSpan::new`].\r\n    fn with_span(self) -> Self::Output;\r\n    /// See [`WithSpan::with_span`].\r\n    fn with_span_static(self, span: Span, description: &'static str) -> Self::Output;\r\n    /// See [`WithSpan::with_context`].\r\n    fn with_span_context(self, span_context: SpanContext) -> Self::Output;\r\n    /// See [`WithSpan::with_handle`].\r\n    fn with_span_handle<T, A: SpanProvider<T>>(self, handle: Handle<T>, arena: &A) -> Self::Output;\r\n}\r\n\r\n/// Trait abstracting over getting a span from an [`Arena`] or a [`UniqueArena`].\r\npub(crate) trait SpanProvider<T> {\r\n    fn get_span(&self, handle: Handle<T>) -> Span;\r\n    fn get_span_context(&self, handle: Handle<T>) -> SpanContext {\r\n        match self.get_span(handle) {\r\n            x if !x.is_defined() => (Default::default(), \"\".to_string()),\r\n            known => (\r\n                known,\r\n                format!(\"{} {:?}\", std::any::type_name::<T>(), handle),\r\n            ),\r\n        }\r\n    }\r\n}\r\n\r\nimpl<T> SpanProvider<T> for Arena<T> {\r\n    fn get_span(&self, handle: Handle<T>) -> Span {\r\n        self.get_span(handle)\r\n    }\r\n}\r\n\r\nimpl<T> SpanProvider<T> for UniqueArena<T> {\r\n    fn get_span(&self, handle: Handle<T>) -> Span {\r\n        self.get_span(handle)\r\n    }\r\n}\r\n\r\nimpl<E> AddSpan for E\r\nwhere\r\n    E: Error,\r\n{\r\n    type Output = WithSpan<Self>;\r\n    fn with_span(self) -> WithSpan<Self> {\r\n        WithSpan::new(self)\r\n    }\r\n\r\n    fn with_span_static(self, span: Span, description: &'static str) -> WithSpan<Self> {\r\n        WithSpan::new(self).with_span(span, description)\r\n    }\r\n\r\n    fn with_span_context(self, span_context: SpanContext) -> WithSpan<Self> {\r\n        WithSpan::new(self).with_context(span_context)\r\n    }\r\n\r\n    fn with_span_handle<T, A: SpanProvider<T>>(\r\n        self,\r\n        handle: Handle<T>,\r\n        arena: &A,\r\n    ) -> WithSpan<Self> {\r\n        WithSpan::new(self).with_handle(handle, arena)\r\n    }\r\n}\r\n\r\n/// Convenience trait for [`Result`], adding a [`MapErrWithSpan::map_err_inner`]\r\n/// mapping to [`WithSpan::and_then`].\r\npub trait MapErrWithSpan<E, E2>: Sized {\r\n    type Output: Sized;\r\n    fn map_err_inner<F, E3>(self, func: F) -> Self::Output\r\n    where\r\n        F: FnOnce(E) -> WithSpan<E3>,\r\n        E2: From<E3>;\r\n}\r\n\r\nimpl<T, E, E2> MapErrWithSpan<E, E2> for Result<T, WithSpan<E>> {\r\n    type Output = Result<T, WithSpan<E2>>;\r\n    fn map_err_inner<F, E3>(self, func: F) -> Result<T, WithSpan<E2>>\r\n    where\r\n        F: FnOnce(E) -> WithSpan<E3>,\r\n        E2: From<E3>,\r\n    {\r\n        self.map_err(|e| e.and_then(func).into_other::<E2>())\r\n    }\r\n}\r\n\r\n#[test]\r\nfn span_location() {\r\n    let source = \"12\\n45\\n\\n89\\n\";\r\n    assert_eq!(\r\n        Span { start: 0, end: 1 }.location(source),\r\n        SourceLocation {\r\n            line_number: 1,\r\n            line_position: 1,\r\n            offset: 0,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 1, end: 2 }.location(source),\r\n        SourceLocation {\r\n            line_number: 1,\r\n            line_position: 2,\r\n            offset: 1,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 2, end: 3 }.location(source),\r\n        SourceLocation {\r\n            line_number: 1,\r\n            line_position: 3,\r\n            offset: 2,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 3, end: 5 }.location(source),\r\n        SourceLocation {\r\n            line_number: 2,\r\n            line_position: 1,\r\n            offset: 3,\r\n            length: 2\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 4, end: 6 }.location(source),\r\n        SourceLocation {\r\n            line_number: 2,\r\n            line_position: 2,\r\n            offset: 4,\r\n            length: 2\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 5, end: 6 }.location(source),\r\n        SourceLocation {\r\n            line_number: 2,\r\n            line_position: 3,\r\n            offset: 5,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 6, end: 7 }.location(source),\r\n        SourceLocation {\r\n            line_number: 3,\r\n            line_position: 1,\r\n            offset: 6,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 7, end: 8 }.location(source),\r\n        SourceLocation {\r\n            line_number: 4,\r\n            line_position: 1,\r\n            offset: 7,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 8, end: 9 }.location(source),\r\n        SourceLocation {\r\n            line_number: 4,\r\n            line_position: 2,\r\n            offset: 8,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 9, end: 10 }.location(source),\r\n        SourceLocation {\r\n            line_number: 4,\r\n            line_position: 3,\r\n            offset: 9,\r\n            length: 1\r\n        }\r\n    );\r\n    assert_eq!(\r\n        Span { start: 10, end: 11 }.location(source),\r\n        SourceLocation {\r\n            line_number: 5,\r\n            line_position: 1,\r\n            offset: 10,\r\n            length: 1\r\n        }\r\n    );\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/analyzer.rs",
    "content": "/*! Module analyzer.\r\n\r\nFigures out the following properties:\r\n  - control flow uniformity\r\n  - texture/sampler pairs\r\n  - expression reference counts\r\n!*/\r\n\r\nuse super::{CallError, ExpressionError, FunctionError, ModuleInfo, ShaderStages, ValidationFlags};\r\nuse crate::span::{AddSpan as _, WithSpan};\r\nuse crate::{\r\n    arena::{Arena, Handle},\r\n    proc::{ResolveContext, ResolveError, TypeResolution},\r\n};\r\nuse std::ops;\r\n\r\npub type NonUniformResult = Option<Handle<crate::Expression>>;\r\n\r\nbitflags::bitflags! {\r\n    /// Kinds of expressions that require uniform control flow.\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct UniformityRequirements: u8 {\r\n        const WORK_GROUP_BARRIER = 0x1;\r\n        const DERIVATIVE = 0x2;\r\n        const IMPLICIT_LEVEL = 0x4;\r\n    }\r\n}\r\n\r\n/// Uniform control flow characteristics.\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub struct Uniformity {\r\n    /// A child expression with non-uniform result.\r\n    ///\r\n    /// This means, when the relevant invocations are scheduled on a compute unit,\r\n    /// they have to use vector registers to store an individual value\r\n    /// per invocation.\r\n    ///\r\n    /// Whenever the control flow is conditioned on such value,\r\n    /// the hardware needs to keep track of the mask of invocations,\r\n    /// and process all branches of the control flow.\r\n    ///\r\n    /// Any operations that depend on non-uniform results also produce non-uniform.\r\n    pub non_uniform_result: NonUniformResult,\r\n    /// If this expression requires uniform control flow, store the reason here.\r\n    pub requirements: UniformityRequirements,\r\n}\r\n\r\nimpl Uniformity {\r\n    const fn new() -> Self {\r\n        Uniformity {\r\n            non_uniform_result: None,\r\n            requirements: UniformityRequirements::empty(),\r\n        }\r\n    }\r\n}\r\n\r\nbitflags::bitflags! {\r\n    struct ExitFlags: u8 {\r\n        /// Control flow may return from the function, which makes all the\r\n        /// subsequent statements within the current function (only!)\r\n        /// to be executed in a non-uniform control flow.\r\n        const MAY_RETURN = 0x1;\r\n        /// Control flow may be killed. Anything after `Statement::Kill` is\r\n        /// considered inside non-uniform context.\r\n        const MAY_KILL = 0x2;\r\n    }\r\n}\r\n\r\n/// Uniformity characteristics of a function.\r\n#[cfg_attr(test, derive(Debug, PartialEq))]\r\nstruct FunctionUniformity {\r\n    result: Uniformity,\r\n    exit: ExitFlags,\r\n}\r\n\r\nimpl ops::BitOr for FunctionUniformity {\r\n    type Output = Self;\r\n    fn bitor(self, other: Self) -> Self {\r\n        FunctionUniformity {\r\n            result: Uniformity {\r\n                non_uniform_result: self\r\n                    .result\r\n                    .non_uniform_result\r\n                    .or(other.result.non_uniform_result),\r\n                requirements: self.result.requirements | other.result.requirements,\r\n            },\r\n            exit: self.exit | other.exit,\r\n        }\r\n    }\r\n}\r\n\r\nimpl FunctionUniformity {\r\n    const fn new() -> Self {\r\n        FunctionUniformity {\r\n            result: Uniformity::new(),\r\n            exit: ExitFlags::empty(),\r\n        }\r\n    }\r\n\r\n    /// Returns a disruptor based on the stored exit flags, if any.\r\n    const fn exit_disruptor(&self) -> Option<UniformityDisruptor> {\r\n        if self.exit.contains(ExitFlags::MAY_RETURN) {\r\n            Some(UniformityDisruptor::Return)\r\n        } else if self.exit.contains(ExitFlags::MAY_KILL) {\r\n            Some(UniformityDisruptor::Discard)\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Indicates how a global variable is used.\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct GlobalUse: u8 {\r\n        /// Data will be read from the variable.\r\n        const READ = 0x1;\r\n        /// Data will be written to the variable.\r\n        const WRITE = 0x2;\r\n        /// The information about the data is queried.\r\n        const QUERY = 0x4;\r\n    }\r\n}\r\n\r\n#[derive(Clone, Debug, Eq, Hash, PartialEq)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct SamplingKey {\r\n    pub image: Handle<crate::GlobalVariable>,\r\n    pub sampler: Handle<crate::GlobalVariable>,\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct ExpressionInfo {\r\n    pub uniformity: Uniformity,\r\n    pub ref_count: usize,\r\n    assignable_global: Option<Handle<crate::GlobalVariable>>,\r\n    pub ty: TypeResolution,\r\n}\r\n\r\nimpl ExpressionInfo {\r\n    const fn new() -> Self {\r\n        ExpressionInfo {\r\n            uniformity: Uniformity::new(),\r\n            ref_count: 0,\r\n            assignable_global: None,\r\n            // this doesn't matter at this point, will be overwritten\r\n            ty: TypeResolution::Value(crate::TypeInner::Scalar {\r\n                kind: crate::ScalarKind::Bool,\r\n                width: 0,\r\n            }),\r\n        }\r\n    }\r\n}\r\n\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\nenum GlobalOrArgument {\r\n    Global(Handle<crate::GlobalVariable>),\r\n    Argument(u32),\r\n}\r\n\r\nimpl GlobalOrArgument {\r\n    fn from_expression(\r\n        expression_arena: &Arena<crate::Expression>,\r\n        expression: Handle<crate::Expression>,\r\n    ) -> Result<GlobalOrArgument, ExpressionError> {\r\n        Ok(match expression_arena[expression] {\r\n            crate::Expression::GlobalVariable(var) => GlobalOrArgument::Global(var),\r\n            crate::Expression::FunctionArgument(i) => GlobalOrArgument::Argument(i),\r\n            crate::Expression::Access { base, .. }\r\n            | crate::Expression::AccessIndex { base, .. } => match expression_arena[base] {\r\n                crate::Expression::GlobalVariable(var) => GlobalOrArgument::Global(var),\r\n                _ => return Err(ExpressionError::ExpectedGlobalOrArgument),\r\n            },\r\n            _ => return Err(ExpressionError::ExpectedGlobalOrArgument),\r\n        })\r\n    }\r\n}\r\n\r\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\nstruct Sampling {\r\n    image: GlobalOrArgument,\r\n    sampler: GlobalOrArgument,\r\n}\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct FunctionInfo {\r\n    /// Validation flags.\r\n    #[allow(dead_code)]\r\n    flags: ValidationFlags,\r\n    /// Set of shader stages where calling this function is valid.\r\n    pub available_stages: ShaderStages,\r\n    /// Uniformity characteristics.\r\n    pub uniformity: Uniformity,\r\n    /// Function may kill the invocation.\r\n    pub may_kill: bool,\r\n\r\n    /// All pairs of (texture, sampler) globals that may be used together in\r\n    /// sampling operations by this function and its callees. This includes\r\n    /// pairings that arise when this function passes textures and samplers as\r\n    /// arguments to its callees.\r\n    ///\r\n    /// This table does not include uses of textures and samplers passed as\r\n    /// arguments to this function itself, since we do not know which globals\r\n    /// those will be. However, this table *is* exhaustive when computed for an\r\n    /// entry point function: entry points never receive textures or samplers as\r\n    /// arguments, so all an entry point's sampling can be reported in terms of\r\n    /// globals.\r\n    ///\r\n    /// The GLSL back end uses this table to construct reflection info that\r\n    /// clients need to construct texture-combined sampler values.\r\n    pub sampling_set: crate::FastHashSet<SamplingKey>,\r\n\r\n    /// How this function and its callees use this module's globals.\r\n    ///\r\n    /// This is indexed by `Handle<GlobalVariable>` indices. However,\r\n    /// `FunctionInfo` implements `std::ops::Index<Handle<GlobalVariable>>`,\r\n    /// so you can simply index this struct with a global handle to retrieve\r\n    /// its usage information.\r\n    global_uses: Box<[GlobalUse]>,\r\n\r\n    /// Information about each expression in this function's body.\r\n    ///\r\n    /// This is indexed by `Handle<Expression>` indices. However, `FunctionInfo`\r\n    /// implements `std::ops::Index<Handle<Expression>>`, so you can simply\r\n    /// index this struct with an expression handle to retrieve its\r\n    /// `ExpressionInfo`.\r\n    expressions: Box<[ExpressionInfo]>,\r\n\r\n    /// All (texture, sampler) pairs that may be used together in sampling\r\n    /// operations by this function and its callees, whether they are accessed\r\n    /// as globals or passed as arguments.\r\n    ///\r\n    /// Participants are represented by [`GlobalVariable`] handles whenever\r\n    /// possible, and otherwise by indices of this function's arguments.\r\n    ///\r\n    /// When analyzing a function call, we combine this data about the callee\r\n    /// with the actual arguments being passed to produce the callers' own\r\n    /// `sampling_set` and `sampling` tables.\r\n    ///\r\n    /// [`GlobalVariable`]: crate::GlobalVariable\r\n    sampling: crate::FastHashSet<Sampling>,\r\n}\r\n\r\nimpl FunctionInfo {\r\n    pub const fn global_variable_count(&self) -> usize {\r\n        self.global_uses.len()\r\n    }\r\n    pub const fn expression_count(&self) -> usize {\r\n        self.expressions.len()\r\n    }\r\n    pub fn dominates_global_use(&self, other: &Self) -> bool {\r\n        for (self_global_uses, other_global_uses) in\r\n            self.global_uses.iter().zip(other.global_uses.iter())\r\n        {\r\n            if !self_global_uses.contains(*other_global_uses) {\r\n                return false;\r\n            }\r\n        }\r\n        true\r\n    }\r\n}\r\n\r\nimpl ops::Index<Handle<crate::GlobalVariable>> for FunctionInfo {\r\n    type Output = GlobalUse;\r\n    fn index(&self, handle: Handle<crate::GlobalVariable>) -> &GlobalUse {\r\n        &self.global_uses[handle.index()]\r\n    }\r\n}\r\n\r\nimpl ops::Index<Handle<crate::Expression>> for FunctionInfo {\r\n    type Output = ExpressionInfo;\r\n    fn index(&self, handle: Handle<crate::Expression>) -> &ExpressionInfo {\r\n        &self.expressions[handle.index()]\r\n    }\r\n}\r\n\r\n/// Disruptor of the uniform control flow.\r\n#[derive(Clone, Copy, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum UniformityDisruptor {\r\n    #[error(\"Expression {0:?} produced non-uniform result, and control flow depends on it\")]\r\n    Expression(Handle<crate::Expression>),\r\n    #[error(\"There is a Return earlier in the control flow of the function\")]\r\n    Return,\r\n    #[error(\"There is a Discard earlier in the entry point across all called functions\")]\r\n    Discard,\r\n}\r\n\r\nimpl FunctionInfo {\r\n    /// Adds a value-type reference to an expression.\r\n    #[must_use]\r\n    fn add_ref_impl(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n        global_use: GlobalUse,\r\n    ) -> NonUniformResult {\r\n        //Note: if the expression doesn't exist, this function\r\n        // will return `None`, but the later validation of\r\n        // expressions should detect this and error properly.\r\n        let info = self.expressions.get_mut(handle.index())?;\r\n        info.ref_count += 1;\r\n        // mark the used global as read\r\n        if let Some(global) = info.assignable_global {\r\n            self.global_uses[global.index()] |= global_use;\r\n        }\r\n        info.uniformity.non_uniform_result\r\n    }\r\n\r\n    /// Adds a value-type reference to an expression.\r\n    #[must_use]\r\n    fn add_ref(&mut self, handle: Handle<crate::Expression>) -> NonUniformResult {\r\n        self.add_ref_impl(handle, GlobalUse::READ)\r\n    }\r\n\r\n    /// Adds a potentially assignable reference to an expression.\r\n    /// These are destinations for `Store` and `ImageStore` statements,\r\n    /// which can transit through `Access` and `AccessIndex`.\r\n    #[must_use]\r\n    fn add_assignable_ref(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n        assignable_global: &mut Option<Handle<crate::GlobalVariable>>,\r\n    ) -> NonUniformResult {\r\n        //Note: similarly to `add_ref_impl`, this ignores invalid expressions.\r\n        let info = self.expressions.get_mut(handle.index())?;\r\n        info.ref_count += 1;\r\n        // propagate the assignable global up the chain, till it either hits\r\n        // a value-type expression, or the assignment statement.\r\n        if let Some(global) = info.assignable_global {\r\n            if let Some(_old) = assignable_global.replace(global) {\r\n                unreachable!()\r\n            }\r\n        }\r\n        info.uniformity.non_uniform_result\r\n    }\r\n\r\n    /// Inherit information from a called function.\r\n    fn process_call(\r\n        &mut self,\r\n        callee: &Self,\r\n        arguments: &[Handle<crate::Expression>],\r\n        expression_arena: &Arena<crate::Expression>,\r\n    ) -> Result<FunctionUniformity, WithSpan<FunctionError>> {\r\n        self.sampling_set\r\n            .extend(callee.sampling_set.iter().cloned());\r\n        for sampling in callee.sampling.iter() {\r\n            // If the callee was passed the texture or sampler as an argument,\r\n            // we may now be able to determine which globals those referred to.\r\n            let image_storage = match sampling.image {\r\n                GlobalOrArgument::Global(var) => GlobalOrArgument::Global(var),\r\n                GlobalOrArgument::Argument(i) => {\r\n                    let handle = arguments[i as usize];\r\n                    GlobalOrArgument::from_expression(expression_arena, handle).map_err(\r\n                        |error| {\r\n                            FunctionError::Expression { handle, error }\r\n                                .with_span_handle(handle, expression_arena)\r\n                        },\r\n                    )?\r\n                }\r\n            };\r\n\r\n            let sampler_storage = match sampling.sampler {\r\n                GlobalOrArgument::Global(var) => GlobalOrArgument::Global(var),\r\n                GlobalOrArgument::Argument(i) => {\r\n                    let handle = arguments[i as usize];\r\n                    GlobalOrArgument::from_expression(expression_arena, handle).map_err(\r\n                        |error| {\r\n                            FunctionError::Expression { handle, error }\r\n                                .with_span_handle(handle, expression_arena)\r\n                        },\r\n                    )?\r\n                }\r\n            };\r\n\r\n            // If we've managed to pin both the image and sampler down to\r\n            // specific globals, record that in our `sampling_set`. Otherwise,\r\n            // record as much as we do know in our own `sampling` table, for our\r\n            // callers to sort out.\r\n            match (image_storage, sampler_storage) {\r\n                (GlobalOrArgument::Global(image), GlobalOrArgument::Global(sampler)) => {\r\n                    self.sampling_set.insert(SamplingKey { image, sampler });\r\n                }\r\n                (image, sampler) => {\r\n                    self.sampling.insert(Sampling { image, sampler });\r\n                }\r\n            }\r\n        }\r\n\r\n        // Inherit global use from our callees.\r\n        for (mine, other) in self.global_uses.iter_mut().zip(callee.global_uses.iter()) {\r\n            *mine |= *other;\r\n        }\r\n\r\n        Ok(FunctionUniformity {\r\n            result: callee.uniformity.clone(),\r\n            exit: if callee.may_kill {\r\n                ExitFlags::MAY_KILL\r\n            } else {\r\n                ExitFlags::empty()\r\n            },\r\n        })\r\n    }\r\n\r\n    /// Computes the expression info and stores it in `self.expressions`.\r\n    /// Also, bumps the reference counts on dependent expressions.\r\n    #[allow(clippy::or_fun_call)]\r\n    fn process_expression(\r\n        &mut self,\r\n        handle: Handle<crate::Expression>,\r\n        expression: &crate::Expression,\r\n        expression_arena: &Arena<crate::Expression>,\r\n        other_functions: &[FunctionInfo],\r\n        resolve_context: &ResolveContext,\r\n        capabilities: super::Capabilities,\r\n    ) -> Result<(), ExpressionError> {\r\n        use crate::{Expression as E, SampleLevel as Sl};\r\n\r\n        let mut assignable_global = None;\r\n        let uniformity = match *expression {\r\n            E::Access { base, index } => {\r\n                let base_ty = self[base].ty.inner_with(resolve_context.types);\r\n\r\n                // build up the caps needed if this is indexed non-uniformly\r\n                let mut needed_caps = super::Capabilities::empty();\r\n                let is_binding_array = match *base_ty {\r\n                    crate::TypeInner::BindingArray {\r\n                        base: array_element_ty_handle,\r\n                        ..\r\n                    } => {\r\n                        // these are nasty aliases, but these idents are too long and break rustfmt\r\n                        let ub_st = super::Capabilities::UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING;\r\n                        let st_sb = super::Capabilities::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING;\r\n                        let sampler = super::Capabilities::SAMPLER_NON_UNIFORM_INDEXING;\r\n\r\n                        // We're a binding array, so lets use the type of _what_ we are array of to determine if we can non-uniformly index it.\r\n                        let array_element_ty =\r\n                            &resolve_context.types[array_element_ty_handle].inner;\r\n\r\n                        needed_caps |= match *array_element_ty {\r\n                            // If we're an image, use the appropriate limit.\r\n                            crate::TypeInner::Image { class, .. } => match class {\r\n                                crate::ImageClass::Storage { .. } => ub_st,\r\n                                _ => st_sb,\r\n                            },\r\n                            crate::TypeInner::Sampler { .. } => sampler,\r\n                            // If we're anything but an image, assume we're a buffer and use the address space.\r\n                            _ => {\r\n                                if let E::GlobalVariable(global_handle) = expression_arena[base] {\r\n                                    let global = &resolve_context.global_vars[global_handle];\r\n                                    match global.space {\r\n                                        crate::AddressSpace::Uniform => ub_st,\r\n                                        crate::AddressSpace::Storage { .. } => st_sb,\r\n                                        _ => unreachable!(),\r\n                                    }\r\n                                } else {\r\n                                    unreachable!()\r\n                                }\r\n                            }\r\n                        };\r\n\r\n                        true\r\n                    }\r\n                    _ => false,\r\n                };\r\n\r\n                if self[index].uniformity.non_uniform_result.is_some()\r\n                    && !capabilities.contains(needed_caps)\r\n                    && is_binding_array\r\n                {\r\n                    return Err(ExpressionError::MissingCapabilities(needed_caps));\r\n                }\r\n\r\n                Uniformity {\r\n                    non_uniform_result: self\r\n                        .add_assignable_ref(base, &mut assignable_global)\r\n                        .or(self.add_ref(index)),\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            E::AccessIndex { base, .. } => Uniformity {\r\n                non_uniform_result: self.add_assignable_ref(base, &mut assignable_global),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            // always uniform\r\n            E::Constant(_) => Uniformity::new(),\r\n            E::Splat { size: _, value } => Uniformity {\r\n                non_uniform_result: self.add_ref(value),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::Swizzle { vector, .. } => Uniformity {\r\n                non_uniform_result: self.add_ref(vector),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::Compose { ref components, .. } => {\r\n                let non_uniform_result = components\r\n                    .iter()\r\n                    .fold(None, |nur, &comp| nur.or(self.add_ref(comp)));\r\n                Uniformity {\r\n                    non_uniform_result,\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            // depends on the builtin or interpolation\r\n            E::FunctionArgument(index) => {\r\n                let arg = &resolve_context.arguments[index as usize];\r\n                let uniform = match arg.binding {\r\n                    Some(crate::Binding::BuiltIn(built_in)) => match built_in {\r\n                        // per-polygon built-ins are uniform\r\n                        crate::BuiltIn::FrontFacing\r\n                        // per-work-group built-ins are uniform\r\n                        | crate::BuiltIn::WorkGroupId\r\n                        | crate::BuiltIn::WorkGroupSize\r\n                        | crate::BuiltIn::NumWorkGroups => true,\r\n                        _ => false,\r\n                    },\r\n                    // only flat inputs are uniform\r\n                    Some(crate::Binding::Location {\r\n                        interpolation: Some(crate::Interpolation::Flat),\r\n                        ..\r\n                    }) => true,\r\n                    _ => false,\r\n                };\r\n                Uniformity {\r\n                    non_uniform_result: if uniform { None } else { Some(handle) },\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            // depends on the address space\r\n            E::GlobalVariable(gh) => {\r\n                use crate::AddressSpace as As;\r\n                assignable_global = Some(gh);\r\n                let var = &resolve_context.global_vars[gh];\r\n                let uniform = match var.space {\r\n                    // local data is non-uniform\r\n                    As::Function | As::Private => false,\r\n                    // workgroup memory is exclusively accessed by the group\r\n                    As::WorkGroup => true,\r\n                    // uniform data\r\n                    As::Uniform | As::PushConstant => true,\r\n                    // storage data is only uniform when read-only\r\n                    As::Storage { access } => !access.contains(crate::StorageAccess::STORE),\r\n                    As::Handle => false,\r\n                };\r\n                Uniformity {\r\n                    non_uniform_result: if uniform { None } else { Some(handle) },\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            E::LocalVariable(_) => Uniformity {\r\n                non_uniform_result: Some(handle),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::Load { pointer } => Uniformity {\r\n                non_uniform_result: self.add_ref(pointer),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather: _,\r\n                coordinate,\r\n                array_index,\r\n                offset: _,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                let image_storage = GlobalOrArgument::from_expression(expression_arena, image)?;\r\n                let sampler_storage = GlobalOrArgument::from_expression(expression_arena, sampler)?;\r\n\r\n                match (image_storage, sampler_storage) {\r\n                    (GlobalOrArgument::Global(image), GlobalOrArgument::Global(sampler)) => {\r\n                        self.sampling_set.insert(SamplingKey { image, sampler });\r\n                    }\r\n                    _ => {\r\n                        self.sampling.insert(Sampling {\r\n                            image: image_storage,\r\n                            sampler: sampler_storage,\r\n                        });\r\n                    }\r\n                }\r\n\r\n                // \"nur\" == \"Non-Uniform Result\"\r\n                let array_nur = array_index.and_then(|h| self.add_ref(h));\r\n                let level_nur = match level {\r\n                    Sl::Auto | Sl::Zero => None,\r\n                    Sl::Exact(h) | Sl::Bias(h) => self.add_ref(h),\r\n                    Sl::Gradient { x, y } => self.add_ref(x).or(self.add_ref(y)),\r\n                };\r\n                let dref_nur = depth_ref.and_then(|h| self.add_ref(h));\r\n                Uniformity {\r\n                    non_uniform_result: self\r\n                        .add_ref(image)\r\n                        .or(self.add_ref(sampler))\r\n                        .or(self.add_ref(coordinate))\r\n                        .or(array_nur)\r\n                        .or(level_nur)\r\n                        .or(dref_nur),\r\n                    requirements: if level.implicit_derivatives() {\r\n                        UniformityRequirements::IMPLICIT_LEVEL\r\n                    } else {\r\n                        UniformityRequirements::empty()\r\n                    },\r\n                }\r\n            }\r\n            E::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => {\r\n                let array_nur = array_index.and_then(|h| self.add_ref(h));\r\n                let sample_nur = sample.and_then(|h| self.add_ref(h));\r\n                let level_nur = level.and_then(|h| self.add_ref(h));\r\n                Uniformity {\r\n                    non_uniform_result: self\r\n                        .add_ref(image)\r\n                        .or(self.add_ref(coordinate))\r\n                        .or(array_nur)\r\n                        .or(sample_nur)\r\n                        .or(level_nur),\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            E::ImageQuery { image, query } => {\r\n                let query_nur = match query {\r\n                    crate::ImageQuery::Size { level: Some(h) } => self.add_ref(h),\r\n                    _ => None,\r\n                };\r\n                Uniformity {\r\n                    non_uniform_result: self.add_ref_impl(image, GlobalUse::QUERY).or(query_nur),\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            E::Unary { expr, .. } => Uniformity {\r\n                non_uniform_result: self.add_ref(expr),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::Binary { left, right, .. } => Uniformity {\r\n                non_uniform_result: self.add_ref(left).or(self.add_ref(right)),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => Uniformity {\r\n                non_uniform_result: self\r\n                    .add_ref(condition)\r\n                    .or(self.add_ref(accept))\r\n                    .or(self.add_ref(reject)),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            // explicit derivatives require uniform\r\n            E::Derivative { expr, .. } => Uniformity {\r\n                //Note: taking a derivative of a uniform doesn't make it non-uniform\r\n                non_uniform_result: self.add_ref(expr),\r\n                requirements: UniformityRequirements::DERIVATIVE,\r\n            },\r\n            E::Relational { argument, .. } => Uniformity {\r\n                non_uniform_result: self.add_ref(argument),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::Math {\r\n                arg, arg1, arg2, ..\r\n            } => {\r\n                let arg1_nur = arg1.and_then(|h| self.add_ref(h));\r\n                let arg2_nur = arg2.and_then(|h| self.add_ref(h));\r\n                Uniformity {\r\n                    non_uniform_result: self.add_ref(arg).or(arg1_nur).or(arg2_nur),\r\n                    requirements: UniformityRequirements::empty(),\r\n                }\r\n            }\r\n            E::As { expr, .. } => Uniformity {\r\n                non_uniform_result: self.add_ref(expr),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::CallResult(function) => {\r\n                let info = other_functions\r\n                    .get(function.index())\r\n                    .ok_or(ExpressionError::CallToUndeclaredFunction(function))?;\r\n\r\n                info.uniformity.clone()\r\n            }\r\n            E::AtomicResult { .. } => Uniformity {\r\n                non_uniform_result: Some(handle),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            E::ArrayLength(expr) => Uniformity {\r\n                non_uniform_result: self.add_ref_impl(expr, GlobalUse::QUERY),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n        };\r\n\r\n        let ty = resolve_context.resolve(expression, |h| {\r\n            self.expressions\r\n                .get(h.index())\r\n                .map(|ei| &ei.ty)\r\n                .ok_or(ResolveError::ExpressionForwardDependency(h))\r\n        })?;\r\n        self.expressions[handle.index()] = ExpressionInfo {\r\n            uniformity,\r\n            ref_count: 0,\r\n            assignable_global,\r\n            ty,\r\n        };\r\n        Ok(())\r\n    }\r\n\r\n    /// Analyzes the uniformity requirements of a block (as a sequence of statements).\r\n    /// Returns the uniformity characteristics at the *function* level, i.e.\r\n    /// whether or not the function requires to be called in uniform control flow,\r\n    /// and whether the produced result is not disrupting the control flow.\r\n    ///\r\n    /// The parent control flow is uniform if `disruptor.is_none()`.\r\n    ///\r\n    /// Returns a `NonUniformControlFlow` error if any of the expressions in the block\r\n    /// require uniformity, but the current flow is non-uniform.\r\n    #[allow(clippy::or_fun_call)]\r\n    fn process_block(\r\n        &mut self,\r\n        statements: &crate::Block,\r\n        other_functions: &[FunctionInfo],\r\n        mut disruptor: Option<UniformityDisruptor>,\r\n        expression_arena: &Arena<crate::Expression>,\r\n    ) -> Result<FunctionUniformity, WithSpan<FunctionError>> {\r\n        use crate::Statement as S;\r\n\r\n        let mut combined_uniformity = FunctionUniformity::new();\r\n        for (statement, &span) in statements.span_iter() {\r\n            let uniformity = match *statement {\r\n                S::Emit(ref range) => {\r\n                    let mut requirements = UniformityRequirements::empty();\r\n                    for expr in range.clone() {\r\n                        let req = match self.expressions.get(expr.index()) {\r\n                            Some(expr) => expr.uniformity.requirements,\r\n                            None => UniformityRequirements::empty(),\r\n                        };\r\n                        #[cfg(feature = \"validate\")]\r\n                        if self\r\n                            .flags\r\n                            .contains(super::ValidationFlags::CONTROL_FLOW_UNIFORMITY)\r\n                            && !req.is_empty()\r\n                        {\r\n                            if let Some(cause) = disruptor {\r\n                                return Err(FunctionError::NonUniformControlFlow(req, expr, cause)\r\n                                    .with_span_handle(expr, expression_arena));\r\n                            }\r\n                        }\r\n                        requirements |= req;\r\n                    }\r\n                    FunctionUniformity {\r\n                        result: Uniformity {\r\n                            non_uniform_result: None,\r\n                            requirements,\r\n                        },\r\n                        exit: ExitFlags::empty(),\r\n                    }\r\n                }\r\n                S::Break | S::Continue => FunctionUniformity::new(),\r\n                S::Kill => FunctionUniformity {\r\n                    result: Uniformity::new(),\r\n                    exit: if disruptor.is_some() {\r\n                        ExitFlags::MAY_KILL\r\n                    } else {\r\n                        ExitFlags::empty()\r\n                    },\r\n                },\r\n                S::Barrier(_) => FunctionUniformity {\r\n                    result: Uniformity {\r\n                        non_uniform_result: None,\r\n                        requirements: UniformityRequirements::WORK_GROUP_BARRIER,\r\n                    },\r\n                    exit: ExitFlags::empty(),\r\n                },\r\n                S::Block(ref b) => {\r\n                    self.process_block(b, other_functions, disruptor, expression_arena)?\r\n                }\r\n                S::If {\r\n                    condition,\r\n                    ref accept,\r\n                    ref reject,\r\n                } => {\r\n                    let condition_nur = self.add_ref(condition);\r\n                    let branch_disruptor =\r\n                        disruptor.or(condition_nur.map(UniformityDisruptor::Expression));\r\n                    let accept_uniformity = self.process_block(\r\n                        accept,\r\n                        other_functions,\r\n                        branch_disruptor,\r\n                        expression_arena,\r\n                    )?;\r\n                    let reject_uniformity = self.process_block(\r\n                        reject,\r\n                        other_functions,\r\n                        branch_disruptor,\r\n                        expression_arena,\r\n                    )?;\r\n                    accept_uniformity | reject_uniformity\r\n                }\r\n                S::Switch {\r\n                    selector,\r\n                    ref cases,\r\n                } => {\r\n                    let selector_nur = self.add_ref(selector);\r\n                    let branch_disruptor =\r\n                        disruptor.or(selector_nur.map(UniformityDisruptor::Expression));\r\n                    let mut uniformity = FunctionUniformity::new();\r\n                    let mut case_disruptor = branch_disruptor;\r\n                    for case in cases.iter() {\r\n                        let case_uniformity = self.process_block(\r\n                            &case.body,\r\n                            other_functions,\r\n                            case_disruptor,\r\n                            expression_arena,\r\n                        )?;\r\n                        case_disruptor = if case.fall_through {\r\n                            case_disruptor.or(case_uniformity.exit_disruptor())\r\n                        } else {\r\n                            branch_disruptor\r\n                        };\r\n                        uniformity = uniformity | case_uniformity;\r\n                    }\r\n                    uniformity\r\n                }\r\n                S::Loop {\r\n                    ref body,\r\n                    ref continuing,\r\n                    break_if: _,\r\n                } => {\r\n                    let body_uniformity =\r\n                        self.process_block(body, other_functions, disruptor, expression_arena)?;\r\n                    let continuing_disruptor = disruptor.or(body_uniformity.exit_disruptor());\r\n                    let continuing_uniformity = self.process_block(\r\n                        continuing,\r\n                        other_functions,\r\n                        continuing_disruptor,\r\n                        expression_arena,\r\n                    )?;\r\n                    body_uniformity | continuing_uniformity\r\n                }\r\n                S::Return { value } => FunctionUniformity {\r\n                    result: Uniformity {\r\n                        non_uniform_result: value.and_then(|expr| self.add_ref(expr)),\r\n                        requirements: UniformityRequirements::empty(),\r\n                    },\r\n                    exit: if disruptor.is_some() {\r\n                        ExitFlags::MAY_RETURN\r\n                    } else {\r\n                        ExitFlags::empty()\r\n                    },\r\n                },\r\n                // Here and below, the used expressions are already emitted,\r\n                // and their results do not affect the function return value,\r\n                // so we can ignore their non-uniformity.\r\n                S::Store { pointer, value } => {\r\n                    let _ = self.add_ref_impl(pointer, GlobalUse::WRITE);\r\n                    let _ = self.add_ref(value);\r\n                    FunctionUniformity::new()\r\n                }\r\n                S::ImageStore {\r\n                    image,\r\n                    coordinate,\r\n                    array_index,\r\n                    value,\r\n                } => {\r\n                    let _ = self.add_ref_impl(image, GlobalUse::WRITE);\r\n                    if let Some(expr) = array_index {\r\n                        let _ = self.add_ref(expr);\r\n                    }\r\n                    let _ = self.add_ref(coordinate);\r\n                    let _ = self.add_ref(value);\r\n                    FunctionUniformity::new()\r\n                }\r\n                S::Call {\r\n                    function,\r\n                    ref arguments,\r\n                    result: _,\r\n                } => {\r\n                    for &argument in arguments {\r\n                        let _ = self.add_ref(argument);\r\n                    }\r\n                    let info = other_functions.get(function.index()).ok_or(\r\n                        FunctionError::InvalidCall {\r\n                            function,\r\n                            error: CallError::ForwardDeclaredFunction,\r\n                        }\r\n                        .with_span_static(span, \"forward call\"),\r\n                    )?;\r\n                    //Note: the result is validated by the Validator, not here\r\n                    self.process_call(info, arguments, expression_arena)?\r\n                }\r\n                S::Atomic {\r\n                    pointer,\r\n                    ref fun,\r\n                    value,\r\n                    result: _,\r\n                } => {\r\n                    let _ = self.add_ref_impl(pointer, GlobalUse::WRITE);\r\n                    let _ = self.add_ref(value);\r\n                    if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun {\r\n                        let _ = self.add_ref(cmp);\r\n                    }\r\n                    FunctionUniformity::new()\r\n                }\r\n            };\r\n\r\n            disruptor = disruptor.or(uniformity.exit_disruptor());\r\n            combined_uniformity = combined_uniformity | uniformity;\r\n        }\r\n        Ok(combined_uniformity)\r\n    }\r\n}\r\n\r\nimpl ModuleInfo {\r\n    /// Builds the `FunctionInfo` based on the function, and validates the\r\n    /// uniform control flow if required by the expressions of this function.\r\n    pub(super) fn process_function(\r\n        &self,\r\n        fun: &crate::Function,\r\n        module: &crate::Module,\r\n        flags: ValidationFlags,\r\n        capabilities: super::Capabilities,\r\n    ) -> Result<FunctionInfo, WithSpan<FunctionError>> {\r\n        let mut info = FunctionInfo {\r\n            flags,\r\n            available_stages: ShaderStages::all(),\r\n            uniformity: Uniformity::new(),\r\n            may_kill: false,\r\n            sampling_set: crate::FastHashSet::default(),\r\n            global_uses: vec![GlobalUse::empty(); module.global_variables.len()].into_boxed_slice(),\r\n            expressions: vec![ExpressionInfo::new(); fun.expressions.len()].into_boxed_slice(),\r\n            sampling: crate::FastHashSet::default(),\r\n        };\r\n        let resolve_context = ResolveContext {\r\n            constants: &module.constants,\r\n            types: &module.types,\r\n            global_vars: &module.global_variables,\r\n            local_vars: &fun.local_variables,\r\n            functions: &module.functions,\r\n            arguments: &fun.arguments,\r\n        };\r\n\r\n        for (handle, expr) in fun.expressions.iter() {\r\n            if let Err(error) = info.process_expression(\r\n                handle,\r\n                expr,\r\n                &fun.expressions,\r\n                &self.functions,\r\n                &resolve_context,\r\n                capabilities,\r\n            ) {\r\n                return Err(FunctionError::Expression { handle, error }\r\n                    .with_span_handle(handle, &fun.expressions));\r\n            }\r\n        }\r\n\r\n        let uniformity = info.process_block(&fun.body, &self.functions, None, &fun.expressions)?;\r\n        info.uniformity = uniformity.result;\r\n        info.may_kill = uniformity.exit.contains(ExitFlags::MAY_KILL);\r\n\r\n        Ok(info)\r\n    }\r\n\r\n    pub fn get_entry_point(&self, index: usize) -> &FunctionInfo {\r\n        &self.entry_points[index]\r\n    }\r\n}\r\n\r\n#[test]\r\n#[cfg(feature = \"validate\")]\r\nfn uniform_control_flow() {\r\n    use crate::{Expression as E, Statement as S};\r\n\r\n    let mut constant_arena = Arena::new();\r\n    let constant = constant_arena.append(\r\n        crate::Constant {\r\n            name: None,\r\n            specialization: None,\r\n            inner: crate::ConstantInner::Scalar {\r\n                width: 4,\r\n                value: crate::ScalarValue::Uint(0),\r\n            },\r\n        },\r\n        Default::default(),\r\n    );\r\n    let mut type_arena = crate::UniqueArena::new();\r\n    let ty = type_arena.insert(\r\n        crate::Type {\r\n            name: None,\r\n            inner: crate::TypeInner::Vector {\r\n                size: crate::VectorSize::Bi,\r\n                kind: crate::ScalarKind::Float,\r\n                width: 4,\r\n            },\r\n        },\r\n        Default::default(),\r\n    );\r\n    let mut global_var_arena = Arena::new();\r\n    let non_uniform_global = global_var_arena.append(\r\n        crate::GlobalVariable {\r\n            name: None,\r\n            init: None,\r\n            ty,\r\n            space: crate::AddressSpace::Handle,\r\n            binding: None,\r\n        },\r\n        Default::default(),\r\n    );\r\n    let uniform_global = global_var_arena.append(\r\n        crate::GlobalVariable {\r\n            name: None,\r\n            init: None,\r\n            ty,\r\n            binding: None,\r\n            space: crate::AddressSpace::Uniform,\r\n        },\r\n        Default::default(),\r\n    );\r\n\r\n    let mut expressions = Arena::new();\r\n    // checks the uniform control flow\r\n    let constant_expr = expressions.append(E::Constant(constant), Default::default());\r\n    // checks the non-uniform control flow\r\n    let derivative_expr = expressions.append(\r\n        E::Derivative {\r\n            axis: crate::DerivativeAxis::X,\r\n            expr: constant_expr,\r\n        },\r\n        Default::default(),\r\n    );\r\n    let emit_range_constant_derivative = expressions.range_from(0);\r\n    let non_uniform_global_expr =\r\n        expressions.append(E::GlobalVariable(non_uniform_global), Default::default());\r\n    let uniform_global_expr =\r\n        expressions.append(E::GlobalVariable(uniform_global), Default::default());\r\n    let emit_range_globals = expressions.range_from(2);\r\n\r\n    // checks the QUERY flag\r\n    let query_expr = expressions.append(E::ArrayLength(uniform_global_expr), Default::default());\r\n    // checks the transitive WRITE flag\r\n    let access_expr = expressions.append(\r\n        E::AccessIndex {\r\n            base: non_uniform_global_expr,\r\n            index: 1,\r\n        },\r\n        Default::default(),\r\n    );\r\n    let emit_range_query_access_globals = expressions.range_from(2);\r\n\r\n    let mut info = FunctionInfo {\r\n        flags: ValidationFlags::all(),\r\n        available_stages: ShaderStages::all(),\r\n        uniformity: Uniformity::new(),\r\n        may_kill: false,\r\n        sampling_set: crate::FastHashSet::default(),\r\n        global_uses: vec![GlobalUse::empty(); global_var_arena.len()].into_boxed_slice(),\r\n        expressions: vec![ExpressionInfo::new(); expressions.len()].into_boxed_slice(),\r\n        sampling: crate::FastHashSet::default(),\r\n    };\r\n    let resolve_context = ResolveContext {\r\n        constants: &constant_arena,\r\n        types: &type_arena,\r\n        global_vars: &global_var_arena,\r\n        local_vars: &Arena::new(),\r\n        functions: &Arena::new(),\r\n        arguments: &[],\r\n    };\r\n    for (handle, expression) in expressions.iter() {\r\n        info.process_expression(\r\n            handle,\r\n            expression,\r\n            &expressions,\r\n            &[],\r\n            &resolve_context,\r\n            super::Capabilities::empty(),\r\n        )\r\n        .unwrap();\r\n    }\r\n    assert_eq!(info[non_uniform_global_expr].ref_count, 1);\r\n    assert_eq!(info[uniform_global_expr].ref_count, 1);\r\n    assert_eq!(info[query_expr].ref_count, 0);\r\n    assert_eq!(info[access_expr].ref_count, 0);\r\n    assert_eq!(info[non_uniform_global], GlobalUse::empty());\r\n    assert_eq!(info[uniform_global], GlobalUse::QUERY);\r\n\r\n    let stmt_emit1 = S::Emit(emit_range_globals.clone());\r\n    let stmt_if_uniform = S::If {\r\n        condition: uniform_global_expr,\r\n        accept: crate::Block::new(),\r\n        reject: vec![\r\n            S::Emit(emit_range_constant_derivative.clone()),\r\n            S::Store {\r\n                pointer: constant_expr,\r\n                value: derivative_expr,\r\n            },\r\n        ]\r\n        .into(),\r\n    };\r\n    assert_eq!(\r\n        info.process_block(\r\n            &vec![stmt_emit1, stmt_if_uniform].into(),\r\n            &[],\r\n            None,\r\n            &expressions\r\n        ),\r\n        Ok(FunctionUniformity {\r\n            result: Uniformity {\r\n                non_uniform_result: None,\r\n                requirements: UniformityRequirements::DERIVATIVE,\r\n            },\r\n            exit: ExitFlags::empty(),\r\n        }),\r\n    );\r\n    assert_eq!(info[constant_expr].ref_count, 2);\r\n    assert_eq!(info[uniform_global], GlobalUse::READ | GlobalUse::QUERY);\r\n\r\n    let stmt_emit2 = S::Emit(emit_range_globals.clone());\r\n    let stmt_if_non_uniform = S::If {\r\n        condition: non_uniform_global_expr,\r\n        accept: vec![\r\n            S::Emit(emit_range_constant_derivative),\r\n            S::Store {\r\n                pointer: constant_expr,\r\n                value: derivative_expr,\r\n            },\r\n        ]\r\n        .into(),\r\n        reject: crate::Block::new(),\r\n    };\r\n    assert_eq!(\r\n        info.process_block(\r\n            &vec![stmt_emit2, stmt_if_non_uniform].into(),\r\n            &[],\r\n            None,\r\n            &expressions\r\n        ),\r\n        Err(FunctionError::NonUniformControlFlow(\r\n            UniformityRequirements::DERIVATIVE,\r\n            derivative_expr,\r\n            UniformityDisruptor::Expression(non_uniform_global_expr)\r\n        )\r\n        .with_span()),\r\n    );\r\n    assert_eq!(info[derivative_expr].ref_count, 1);\r\n    assert_eq!(info[non_uniform_global], GlobalUse::READ);\r\n\r\n    let stmt_emit3 = S::Emit(emit_range_globals);\r\n    let stmt_return_non_uniform = S::Return {\r\n        value: Some(non_uniform_global_expr),\r\n    };\r\n    assert_eq!(\r\n        info.process_block(\r\n            &vec![stmt_emit3, stmt_return_non_uniform].into(),\r\n            &[],\r\n            Some(UniformityDisruptor::Return),\r\n            &expressions\r\n        ),\r\n        Ok(FunctionUniformity {\r\n            result: Uniformity {\r\n                non_uniform_result: Some(non_uniform_global_expr),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            exit: ExitFlags::MAY_RETURN,\r\n        }),\r\n    );\r\n    assert_eq!(info[non_uniform_global_expr].ref_count, 3);\r\n\r\n    // Check that uniformity requirements reach through a pointer\r\n    let stmt_emit4 = S::Emit(emit_range_query_access_globals);\r\n    let stmt_assign = S::Store {\r\n        pointer: access_expr,\r\n        value: query_expr,\r\n    };\r\n    let stmt_return_pointer = S::Return {\r\n        value: Some(access_expr),\r\n    };\r\n    let stmt_kill = S::Kill;\r\n    assert_eq!(\r\n        info.process_block(\r\n            &vec![stmt_emit4, stmt_assign, stmt_kill, stmt_return_pointer].into(),\r\n            &[],\r\n            Some(UniformityDisruptor::Discard),\r\n            &expressions\r\n        ),\r\n        Ok(FunctionUniformity {\r\n            result: Uniformity {\r\n                non_uniform_result: Some(non_uniform_global_expr),\r\n                requirements: UniformityRequirements::empty(),\r\n            },\r\n            exit: ExitFlags::all(),\r\n        }),\r\n    );\r\n    assert_eq!(info[non_uniform_global], GlobalUse::READ | GlobalUse::WRITE);\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/compose.rs",
    "content": "#[cfg(feature = \"validate\")]\r\nuse crate::{\r\n    arena::{Arena, UniqueArena},\r\n    proc::TypeResolution,\r\n};\r\n\r\nuse crate::arena::{BadHandle, Handle};\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum ComposeError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"Composing of type {0:?} can't be done\")]\r\n    Type(Handle<crate::Type>),\r\n    #[error(\"Composing expects {expected} components but {given} were given\")]\r\n    ComponentCount { given: u32, expected: u32 },\r\n    #[error(\"Composing {index}'s component type is not expected\")]\r\n    ComponentType { index: u32 },\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\npub fn validate_compose(\r\n    self_ty_handle: Handle<crate::Type>,\r\n    constant_arena: &Arena<crate::Constant>,\r\n    type_arena: &UniqueArena<crate::Type>,\r\n    component_resolutions: impl ExactSizeIterator<Item = TypeResolution>,\r\n) -> Result<(), ComposeError> {\r\n    use crate::TypeInner as Ti;\r\n\r\n    let self_ty = type_arena.get_handle(self_ty_handle)?;\r\n    match self_ty.inner {\r\n        // vectors are composed from scalars or other vectors\r\n        Ti::Vector { size, kind, width } => {\r\n            let mut total = 0;\r\n            for (index, comp_res) in component_resolutions.enumerate() {\r\n                total += match *comp_res.inner_with(type_arena) {\r\n                    Ti::Scalar {\r\n                        kind: comp_kind,\r\n                        width: comp_width,\r\n                    } if comp_kind == kind && comp_width == width => 1,\r\n                    Ti::Vector {\r\n                        size: comp_size,\r\n                        kind: comp_kind,\r\n                        width: comp_width,\r\n                    } if comp_kind == kind && comp_width == width => comp_size as u32,\r\n                    ref other => {\r\n                        log::error!(\"Vector component[{}] type {:?}\", index, other);\r\n                        return Err(ComposeError::ComponentType {\r\n                            index: index as u32,\r\n                        });\r\n                    }\r\n                };\r\n            }\r\n            if size as u32 != total {\r\n                return Err(ComposeError::ComponentCount {\r\n                    expected: size as u32,\r\n                    given: total,\r\n                });\r\n            }\r\n        }\r\n        // matrix are composed from column vectors\r\n        Ti::Matrix {\r\n            columns,\r\n            rows,\r\n            width,\r\n        } => {\r\n            let inner = Ti::Vector {\r\n                size: rows,\r\n                kind: crate::ScalarKind::Float,\r\n                width,\r\n            };\r\n            if columns as usize != component_resolutions.len() {\r\n                return Err(ComposeError::ComponentCount {\r\n                    expected: columns as u32,\r\n                    given: component_resolutions.len() as u32,\r\n                });\r\n            }\r\n            for (index, comp_res) in component_resolutions.enumerate() {\r\n                if comp_res.inner_with(type_arena) != &inner {\r\n                    log::error!(\"Matrix component[{}] type {:?}\", index, comp_res);\r\n                    return Err(ComposeError::ComponentType {\r\n                        index: index as u32,\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        Ti::Array {\r\n            base,\r\n            size: crate::ArraySize::Constant(handle),\r\n            stride: _,\r\n        } => {\r\n            let count = constant_arena[handle].to_array_length().unwrap();\r\n            if count as usize != component_resolutions.len() {\r\n                return Err(ComposeError::ComponentCount {\r\n                    expected: count,\r\n                    given: component_resolutions.len() as u32,\r\n                });\r\n            }\r\n            for (index, comp_res) in component_resolutions.enumerate() {\r\n                let base_inner = &type_arena[base].inner;\r\n                let comp_res_inner = comp_res.inner_with(type_arena);\r\n                // We don't support arrays of pointers, but it seems best not to\r\n                // embed that assumption here, so use `TypeInner::equivalent`.\r\n                if !base_inner.equivalent(comp_res_inner, type_arena) {\r\n                    log::error!(\"Array component[{}] type {:?}\", index, comp_res);\r\n                    return Err(ComposeError::ComponentType {\r\n                        index: index as u32,\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        Ti::Struct { ref members, .. } => {\r\n            if members.len() != component_resolutions.len() {\r\n                return Err(ComposeError::ComponentCount {\r\n                    given: component_resolutions.len() as u32,\r\n                    expected: members.len() as u32,\r\n                });\r\n            }\r\n            for (index, (member, comp_res)) in members.iter().zip(component_resolutions).enumerate()\r\n            {\r\n                let member_inner = &type_arena[member.ty].inner;\r\n                let comp_res_inner = comp_res.inner_with(type_arena);\r\n                // We don't support pointers in structs, but it seems best not to embed\r\n                // that assumption here, so use `TypeInner::equivalent`.\r\n                if !comp_res_inner.equivalent(member_inner, type_arena) {\r\n                    log::error!(\"Struct component[{}] type {:?}\", index, comp_res);\r\n                    return Err(ComposeError::ComponentType {\r\n                        index: index as u32,\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        ref other => {\r\n            log::error!(\"Composing of {:?}\", other);\r\n            return Err(ComposeError::Type(self_ty_handle));\r\n        }\r\n    }\r\n\r\n    Ok(())\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/expression.rs",
    "content": "#[cfg(feature = \"validate\")]\r\nuse super::{compose::validate_compose, FunctionInfo, ShaderStages, TypeFlags};\r\n#[cfg(feature = \"validate\")]\r\nuse crate::arena::UniqueArena;\r\n\r\nuse crate::{\r\n    arena::{BadHandle, Handle},\r\n    proc::{IndexableLengthError, ResolveError},\r\n};\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum ExpressionError {\r\n    #[error(\"Doesn't exist\")]\r\n    DoesntExist,\r\n    #[error(\"Used by a statement before it was introduced into the scope by any of the dominating blocks\")]\r\n    NotInScope,\r\n    #[error(\"Depends on {0:?}, which has not been processed yet\")]\r\n    ForwardDependency(Handle<crate::Expression>),\r\n    #[error(transparent)]\r\n    BadDependency(#[from] BadHandle),\r\n    #[error(\"Base type {0:?} is not compatible with this expression\")]\r\n    InvalidBaseType(Handle<crate::Expression>),\r\n    #[error(\"Accessing with index {0:?} can't be done\")]\r\n    InvalidIndexType(Handle<crate::Expression>),\r\n    #[error(\"Accessing index {1:?} is out of {0:?} bounds\")]\r\n    IndexOutOfBounds(Handle<crate::Expression>, crate::ScalarValue),\r\n    #[error(\"The expression {0:?} may only be indexed by a constant\")]\r\n    IndexMustBeConstant(Handle<crate::Expression>),\r\n    #[error(\"Function argument {0:?} doesn't exist\")]\r\n    FunctionArgumentDoesntExist(u32),\r\n    #[error(\"Loading of {0:?} can't be done\")]\r\n    InvalidPointerType(Handle<crate::Expression>),\r\n    #[error(\"Array length of {0:?} can't be done\")]\r\n    InvalidArrayType(Handle<crate::Expression>),\r\n    #[error(\"Splatting {0:?} can't be done\")]\r\n    InvalidSplatType(Handle<crate::Expression>),\r\n    #[error(\"Swizzling {0:?} can't be done\")]\r\n    InvalidVectorType(Handle<crate::Expression>),\r\n    #[error(\"Swizzle component {0:?} is outside of vector size {1:?}\")]\r\n    InvalidSwizzleComponent(crate::SwizzleComponent, crate::VectorSize),\r\n    #[error(transparent)]\r\n    Compose(#[from] super::ComposeError),\r\n    #[error(transparent)]\r\n    IndexableLength(#[from] IndexableLengthError),\r\n    #[error(\"Operation {0:?} can't work with {1:?}\")]\r\n    InvalidUnaryOperandType(crate::UnaryOperator, Handle<crate::Expression>),\r\n    #[error(\"Operation {0:?} can't work with {1:?} and {2:?}\")]\r\n    InvalidBinaryOperandTypes(\r\n        crate::BinaryOperator,\r\n        Handle<crate::Expression>,\r\n        Handle<crate::Expression>,\r\n    ),\r\n    #[error(\"Selecting is not possible\")]\r\n    InvalidSelectTypes,\r\n    #[error(\"Relational argument {0:?} is not a boolean vector\")]\r\n    InvalidBooleanVector(Handle<crate::Expression>),\r\n    #[error(\"Relational argument {0:?} is not a float\")]\r\n    InvalidFloatArgument(Handle<crate::Expression>),\r\n    #[error(\"Type resolution failed\")]\r\n    Type(#[from] ResolveError),\r\n    #[error(\"Not a global variable\")]\r\n    ExpectedGlobalVariable,\r\n    #[error(\"Not a global variable or a function argument\")]\r\n    ExpectedGlobalOrArgument,\r\n    #[error(\"Calling an undeclared function {0:?}\")]\r\n    CallToUndeclaredFunction(Handle<crate::Function>),\r\n    #[error(\"Needs to be an binding array instead of {0:?}\")]\r\n    ExpectedBindingArrayType(Handle<crate::Type>),\r\n    #[error(\"Needs to be an image instead of {0:?}\")]\r\n    ExpectedImageType(Handle<crate::Type>),\r\n    #[error(\"Needs to be an image instead of {0:?}\")]\r\n    ExpectedSamplerType(Handle<crate::Type>),\r\n    #[error(\"Unable to operate on image class {0:?}\")]\r\n    InvalidImageClass(crate::ImageClass),\r\n    #[error(\"Derivatives can only be taken from scalar and vector floats\")]\r\n    InvalidDerivative,\r\n    #[error(\"Image array index parameter is misplaced\")]\r\n    InvalidImageArrayIndex,\r\n    #[error(\"Inappropriate sample or level-of-detail index for texel access\")]\r\n    InvalidImageOtherIndex,\r\n    #[error(\"Image array index type of {0:?} is not an integer scalar\")]\r\n    InvalidImageArrayIndexType(Handle<crate::Expression>),\r\n    #[error(\"Image sample or level-of-detail index's type of {0:?} is not an integer scalar\")]\r\n    InvalidImageOtherIndexType(Handle<crate::Expression>),\r\n    #[error(\"Image coordinate type of {1:?} does not match dimension {0:?}\")]\r\n    InvalidImageCoordinateType(crate::ImageDimension, Handle<crate::Expression>),\r\n    #[error(\"Comparison sampling mismatch: image has class {image:?}, but the sampler is comparison={sampler}, and the reference was provided={has_ref}\")]\r\n    ComparisonSamplingMismatch {\r\n        image: crate::ImageClass,\r\n        sampler: bool,\r\n        has_ref: bool,\r\n    },\r\n    #[error(\"Sample offset constant {1:?} doesn't match the image dimension {0:?}\")]\r\n    InvalidSampleOffset(crate::ImageDimension, Handle<crate::Constant>),\r\n    #[error(\"Depth reference {0:?} is not a scalar float\")]\r\n    InvalidDepthReference(Handle<crate::Expression>),\r\n    #[error(\"Depth sample level can only be Auto or Zero\")]\r\n    InvalidDepthSampleLevel,\r\n    #[error(\"Gather level can only be Zero\")]\r\n    InvalidGatherLevel,\r\n    #[error(\"Gather component {0:?} doesn't exist in the image\")]\r\n    InvalidGatherComponent(crate::SwizzleComponent),\r\n    #[error(\"Gather can't be done for image dimension {0:?}\")]\r\n    InvalidGatherDimension(crate::ImageDimension),\r\n    #[error(\"Sample level (exact) type {0:?} is not a scalar float\")]\r\n    InvalidSampleLevelExactType(Handle<crate::Expression>),\r\n    #[error(\"Sample level (bias) type {0:?} is not a scalar float\")]\r\n    InvalidSampleLevelBiasType(Handle<crate::Expression>),\r\n    #[error(\"Sample level (gradient) of {1:?} doesn't match the image dimension {0:?}\")]\r\n    InvalidSampleLevelGradientType(crate::ImageDimension, Handle<crate::Expression>),\r\n    #[error(\"Unable to cast\")]\r\n    InvalidCastArgument,\r\n    #[error(\"Invalid argument count for {0:?}\")]\r\n    WrongArgumentCount(crate::MathFunction),\r\n    #[error(\"Argument [{1}] to {0:?} as expression {2:?} has an invalid type.\")]\r\n    InvalidArgumentType(crate::MathFunction, u32, Handle<crate::Expression>),\r\n    #[error(\"Atomic result type can't be {0:?} of {1} bytes\")]\r\n    InvalidAtomicResultType(crate::ScalarKind, crate::Bytes),\r\n    #[error(\"Shader requires capability {0:?}\")]\r\n    MissingCapabilities(super::Capabilities),\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nstruct ExpressionTypeResolver<'a> {\r\n    root: Handle<crate::Expression>,\r\n    types: &'a UniqueArena<crate::Type>,\r\n    info: &'a FunctionInfo,\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nimpl<'a> ExpressionTypeResolver<'a> {\r\n    fn resolve(\r\n        &self,\r\n        handle: Handle<crate::Expression>,\r\n    ) -> Result<&'a crate::TypeInner, ExpressionError> {\r\n        if handle < self.root {\r\n            Ok(self.info[handle].ty.inner_with(self.types))\r\n        } else {\r\n            Err(ExpressionError::ForwardDependency(handle))\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nimpl super::Validator {\r\n    pub(super) fn validate_expression(\r\n        &self,\r\n        root: Handle<crate::Expression>,\r\n        expression: &crate::Expression,\r\n        function: &crate::Function,\r\n        module: &crate::Module,\r\n        info: &FunctionInfo,\r\n        other_infos: &[FunctionInfo],\r\n    ) -> Result<ShaderStages, ExpressionError> {\r\n        use crate::{Expression as E, ScalarKind as Sk, TypeInner as Ti};\r\n\r\n        let resolver = ExpressionTypeResolver {\r\n            root,\r\n            types: &module.types,\r\n            info,\r\n        };\r\n\r\n        let stages = match *expression {\r\n            E::Access { base, index } => {\r\n                let base_type = resolver.resolve(base)?;\r\n                // See the documentation for `Expression::Access`.\r\n                let dynamic_indexing_restricted = match *base_type {\r\n                    Ti::Vector { .. } => false,\r\n                    Ti::Matrix { .. } | Ti::Array { .. } => true,\r\n                    Ti::Pointer { .. }\r\n                    | Ti::ValuePointer { size: Some(_), .. }\r\n                    | Ti::BindingArray { .. } => false,\r\n                    ref other => {\r\n                        log::error!(\"Indexing of {:?}\", other);\r\n                        return Err(ExpressionError::InvalidBaseType(base));\r\n                    }\r\n                };\r\n                match *resolver.resolve(index)? {\r\n                    //TODO: only allow one of these\r\n                    Ti::Scalar {\r\n                        kind: Sk::Sint | Sk::Uint,\r\n                        width: _,\r\n                    } => {}\r\n                    ref other => {\r\n                        log::error!(\"Indexing by {:?}\", other);\r\n                        return Err(ExpressionError::InvalidIndexType(index));\r\n                    }\r\n                }\r\n                if dynamic_indexing_restricted\r\n                    && function.expressions[index].is_dynamic_index(module)\r\n                {\r\n                    return Err(ExpressionError::IndexMustBeConstant(base));\r\n                }\r\n\r\n                // If we know both the length and the index, we can do the\r\n                // bounds check now.\r\n                if let crate::proc::IndexableLength::Known(known_length) =\r\n                    base_type.indexable_length(module)?\r\n                {\r\n                    if let E::Constant(k) = function.expressions[index] {\r\n                        if let crate::Constant {\r\n                            // We must treat specializable constants as unknown.\r\n                            specialization: None,\r\n                            // Non-scalar indices should have been caught above.\r\n                            inner: crate::ConstantInner::Scalar { value, .. },\r\n                            ..\r\n                        } = module.constants[k]\r\n                        {\r\n                            match value {\r\n                                crate::ScalarValue::Uint(u) if u >= known_length as u64 => {\r\n                                    return Err(ExpressionError::IndexOutOfBounds(base, value));\r\n                                }\r\n                                crate::ScalarValue::Sint(s)\r\n                                    if s < 0 || s >= known_length as i64 =>\r\n                                {\r\n                                    return Err(ExpressionError::IndexOutOfBounds(base, value));\r\n                                }\r\n                                _ => (),\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                ShaderStages::all()\r\n            }\r\n            E::AccessIndex { base, index } => {\r\n                fn resolve_index_limit(\r\n                    module: &crate::Module,\r\n                    top: Handle<crate::Expression>,\r\n                    ty: &crate::TypeInner,\r\n                    top_level: bool,\r\n                ) -> Result<u32, ExpressionError> {\r\n                    let limit = match *ty {\r\n                        Ti::Vector { size, .. }\r\n                        | Ti::ValuePointer {\r\n                            size: Some(size), ..\r\n                        } => size as u32,\r\n                        Ti::Matrix { columns, .. } => columns as u32,\r\n                        Ti::Array {\r\n                            size: crate::ArraySize::Constant(handle),\r\n                            ..\r\n                        } => module.constants[handle].to_array_length().unwrap(),\r\n                        Ti::Array { .. } | Ti::BindingArray { .. } => u32::MAX, // can't statically know, but need run-time checks\r\n                        Ti::Pointer { base, .. } if top_level => {\r\n                            resolve_index_limit(module, top, &module.types[base].inner, false)?\r\n                        }\r\n                        Ti::Struct { ref members, .. } => members.len() as u32,\r\n                        ref other => {\r\n                            log::error!(\"Indexing of {:?}\", other);\r\n                            return Err(ExpressionError::InvalidBaseType(top));\r\n                        }\r\n                    };\r\n                    Ok(limit)\r\n                }\r\n\r\n                let limit = resolve_index_limit(module, base, resolver.resolve(base)?, true)?;\r\n                if index >= limit {\r\n                    return Err(ExpressionError::IndexOutOfBounds(\r\n                        base,\r\n                        crate::ScalarValue::Uint(limit as _),\r\n                    ));\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Constant(handle) => {\r\n                let _ = module.constants.try_get(handle)?;\r\n                ShaderStages::all()\r\n            }\r\n            E::Splat { size: _, value } => match *resolver.resolve(value)? {\r\n                Ti::Scalar { .. } => ShaderStages::all(),\r\n                ref other => {\r\n                    log::error!(\"Splat scalar type {:?}\", other);\r\n                    return Err(ExpressionError::InvalidSplatType(value));\r\n                }\r\n            },\r\n            E::Swizzle {\r\n                size,\r\n                vector,\r\n                pattern,\r\n            } => {\r\n                let vec_size = match *resolver.resolve(vector)? {\r\n                    Ti::Vector { size: vec_size, .. } => vec_size,\r\n                    ref other => {\r\n                        log::error!(\"Swizzle vector type {:?}\", other);\r\n                        return Err(ExpressionError::InvalidVectorType(vector));\r\n                    }\r\n                };\r\n                for &sc in pattern[..size as usize].iter() {\r\n                    if sc as u8 >= vec_size as u8 {\r\n                        return Err(ExpressionError::InvalidSwizzleComponent(sc, vec_size));\r\n                    }\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Compose { ref components, ty } => {\r\n                for &handle in components {\r\n                    if handle >= root {\r\n                        return Err(ExpressionError::ForwardDependency(handle));\r\n                    }\r\n                }\r\n                validate_compose(\r\n                    ty,\r\n                    &module.constants,\r\n                    &module.types,\r\n                    components.iter().map(|&handle| info[handle].ty.clone()),\r\n                )?;\r\n                ShaderStages::all()\r\n            }\r\n            E::FunctionArgument(index) => {\r\n                if index >= function.arguments.len() as u32 {\r\n                    return Err(ExpressionError::FunctionArgumentDoesntExist(index));\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::GlobalVariable(handle) => {\r\n                let _ = module.global_variables.try_get(handle)?;\r\n                ShaderStages::all()\r\n            }\r\n            E::LocalVariable(handle) => {\r\n                let _ = function.local_variables.try_get(handle)?;\r\n                ShaderStages::all()\r\n            }\r\n            E::Load { pointer } => {\r\n                match *resolver.resolve(pointer)? {\r\n                    Ti::Pointer { base, .. }\r\n                        if self.types[base.index()]\r\n                            .flags\r\n                            .contains(TypeFlags::SIZED | TypeFlags::DATA) => {}\r\n                    Ti::ValuePointer { .. } => {}\r\n                    ref other => {\r\n                        log::error!(\"Loading {:?}\", other);\r\n                        return Err(ExpressionError::InvalidPointerType(pointer));\r\n                    }\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::ImageSample {\r\n                image,\r\n                sampler,\r\n                gather,\r\n                coordinate,\r\n                array_index,\r\n                offset,\r\n                level,\r\n                depth_ref,\r\n            } => {\r\n                // check the validity of expressions\r\n                let image_ty = match function.expressions[image] {\r\n                    crate::Expression::GlobalVariable(var_handle) => {\r\n                        module.global_variables[var_handle].ty\r\n                    }\r\n                    crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty,\r\n                    crate::Expression::Access { base, .. }\r\n                    | crate::Expression::AccessIndex { base, .. } => {\r\n                        match function.expressions[base] {\r\n                            crate::Expression::GlobalVariable(var_handle) => {\r\n                                let array_ty = module.global_variables[var_handle].ty;\r\n\r\n                                match module.types[array_ty].inner {\r\n                                    Ti::BindingArray { base, .. } => base,\r\n                                    _ => {\r\n                                        return Err(ExpressionError::ExpectedBindingArrayType(\r\n                                            array_ty,\r\n                                        ))\r\n                                    }\r\n                                }\r\n                            }\r\n                            _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                        }\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                };\r\n\r\n                let sampler_ty = match function.expressions[sampler] {\r\n                    crate::Expression::GlobalVariable(var_handle) => {\r\n                        module.global_variables[var_handle].ty\r\n                    }\r\n                    crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty,\r\n                    crate::Expression::Access { base, .. }\r\n                    | crate::Expression::AccessIndex { base, .. } => {\r\n                        match function.expressions[base] {\r\n                            crate::Expression::GlobalVariable(var_handle) => {\r\n                                let array_ty = module.global_variables[var_handle].ty;\r\n\r\n                                match module.types[array_ty].inner {\r\n                                    Ti::BindingArray { base, .. } => base,\r\n                                    _ => {\r\n                                        return Err(ExpressionError::ExpectedBindingArrayType(\r\n                                            array_ty,\r\n                                        ))\r\n                                    }\r\n                                }\r\n                            }\r\n                            _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                        }\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                };\r\n                let comparison = match module.types[sampler_ty].inner {\r\n                    Ti::Sampler { comparison } => comparison,\r\n                    _ => return Err(ExpressionError::ExpectedSamplerType(sampler_ty)),\r\n                };\r\n\r\n                let (class, dim) = match module.types[image_ty].inner {\r\n                    Ti::Image {\r\n                        class,\r\n                        arrayed,\r\n                        dim,\r\n                    } => {\r\n                        // check the array property\r\n                        if arrayed != array_index.is_some() {\r\n                            return Err(ExpressionError::InvalidImageArrayIndex);\r\n                        }\r\n                        if let Some(expr) = array_index {\r\n                            match *resolver.resolve(expr)? {\r\n                                Ti::Scalar {\r\n                                    kind: Sk::Sint,\r\n                                    width: _,\r\n                                } => {}\r\n                                _ => return Err(ExpressionError::InvalidImageArrayIndexType(expr)),\r\n                            }\r\n                        }\r\n                        (class, dim)\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedImageType(image_ty)),\r\n                };\r\n\r\n                // check sampling and comparison properties\r\n                let image_depth = match class {\r\n                    crate::ImageClass::Sampled {\r\n                        kind: crate::ScalarKind::Float,\r\n                        multi: false,\r\n                    } => false,\r\n                    crate::ImageClass::Depth { multi: false } => true,\r\n                    _ => return Err(ExpressionError::InvalidImageClass(class)),\r\n                };\r\n                if comparison != depth_ref.is_some() || (comparison && !image_depth) {\r\n                    return Err(ExpressionError::ComparisonSamplingMismatch {\r\n                        image: class,\r\n                        sampler: comparison,\r\n                        has_ref: depth_ref.is_some(),\r\n                    });\r\n                }\r\n\r\n                // check texture coordinates type\r\n                let num_components = match dim {\r\n                    crate::ImageDimension::D1 => 1,\r\n                    crate::ImageDimension::D2 => 2,\r\n                    crate::ImageDimension::D3 | crate::ImageDimension::Cube => 3,\r\n                };\r\n                match *resolver.resolve(coordinate)? {\r\n                    Ti::Scalar {\r\n                        kind: Sk::Float, ..\r\n                    } if num_components == 1 => {}\r\n                    Ti::Vector {\r\n                        size,\r\n                        kind: Sk::Float,\r\n                        ..\r\n                    } if size as u32 == num_components => {}\r\n                    _ => return Err(ExpressionError::InvalidImageCoordinateType(dim, coordinate)),\r\n                }\r\n\r\n                // check constant offset\r\n                if let Some(const_handle) = offset {\r\n                    let good = match module.constants[const_handle].inner {\r\n                        crate::ConstantInner::Scalar {\r\n                            width: _,\r\n                            value: crate::ScalarValue::Sint(_),\r\n                        } => num_components == 1,\r\n                        crate::ConstantInner::Scalar { .. } => false,\r\n                        crate::ConstantInner::Composite { ty, .. } => {\r\n                            match module.types[ty].inner {\r\n                                Ti::Vector {\r\n                                    size,\r\n                                    kind: Sk::Sint,\r\n                                    ..\r\n                                } => size as u32 == num_components,\r\n                                _ => false,\r\n                            }\r\n                        }\r\n                    };\r\n                    if !good {\r\n                        return Err(ExpressionError::InvalidSampleOffset(dim, const_handle));\r\n                    }\r\n                }\r\n\r\n                // check depth reference type\r\n                if let Some(expr) = depth_ref {\r\n                    match *resolver.resolve(expr)? {\r\n                        Ti::Scalar {\r\n                            kind: Sk::Float, ..\r\n                        } => {}\r\n                        _ => return Err(ExpressionError::InvalidDepthReference(expr)),\r\n                    }\r\n                    match level {\r\n                        crate::SampleLevel::Auto | crate::SampleLevel::Zero => {}\r\n                        _ => return Err(ExpressionError::InvalidDepthSampleLevel),\r\n                    }\r\n                }\r\n\r\n                if let Some(component) = gather {\r\n                    match dim {\r\n                        crate::ImageDimension::D2 | crate::ImageDimension::Cube => {}\r\n                        crate::ImageDimension::D1 | crate::ImageDimension::D3 => {\r\n                            return Err(ExpressionError::InvalidGatherDimension(dim))\r\n                        }\r\n                    };\r\n                    let max_component = match class {\r\n                        crate::ImageClass::Depth { .. } => crate::SwizzleComponent::X,\r\n                        _ => crate::SwizzleComponent::W,\r\n                    };\r\n                    if component > max_component {\r\n                        return Err(ExpressionError::InvalidGatherComponent(component));\r\n                    }\r\n                    match level {\r\n                        crate::SampleLevel::Zero => {}\r\n                        _ => return Err(ExpressionError::InvalidGatherLevel),\r\n                    }\r\n                }\r\n\r\n                // check level properties\r\n                match level {\r\n                    crate::SampleLevel::Auto => ShaderStages::FRAGMENT,\r\n                    crate::SampleLevel::Zero => ShaderStages::all(),\r\n                    crate::SampleLevel::Exact(expr) => {\r\n                        match *resolver.resolve(expr)? {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidSampleLevelExactType(expr)),\r\n                        }\r\n                        ShaderStages::all()\r\n                    }\r\n                    crate::SampleLevel::Bias(expr) => {\r\n                        match *resolver.resolve(expr)? {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidSampleLevelBiasType(expr)),\r\n                        }\r\n                        ShaderStages::all()\r\n                    }\r\n                    crate::SampleLevel::Gradient { x, y } => {\r\n                        match *resolver.resolve(x)? {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            } if num_components == 1 => {}\r\n                            Ti::Vector {\r\n                                size,\r\n                                kind: Sk::Float,\r\n                                ..\r\n                            } if size as u32 == num_components => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidSampleLevelGradientType(dim, x))\r\n                            }\r\n                        }\r\n                        match *resolver.resolve(y)? {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            } if num_components == 1 => {}\r\n                            Ti::Vector {\r\n                                size,\r\n                                kind: Sk::Float,\r\n                                ..\r\n                            } if size as u32 == num_components => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidSampleLevelGradientType(dim, y))\r\n                            }\r\n                        }\r\n                        ShaderStages::all()\r\n                    }\r\n                }\r\n            }\r\n            E::ImageLoad {\r\n                image,\r\n                coordinate,\r\n                array_index,\r\n                sample,\r\n                level,\r\n            } => {\r\n                let ty = match function.expressions[image] {\r\n                    crate::Expression::GlobalVariable(var_handle) => {\r\n                        module.global_variables[var_handle].ty\r\n                    }\r\n                    crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty,\r\n                    crate::Expression::Access { base, .. }\r\n                    | crate::Expression::AccessIndex { base, .. } => {\r\n                        match function.expressions[base] {\r\n                            crate::Expression::GlobalVariable(var_handle) => {\r\n                                let array_ty = module.global_variables[var_handle].ty;\r\n\r\n                                match module.types[array_ty].inner {\r\n                                    Ti::BindingArray { base, .. } => base,\r\n                                    _ => {\r\n                                        return Err(ExpressionError::ExpectedBindingArrayType(\r\n                                            array_ty,\r\n                                        ))\r\n                                    }\r\n                                }\r\n                            }\r\n                            _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                        }\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                };\r\n                match module.types[ty].inner {\r\n                    Ti::Image {\r\n                        class,\r\n                        arrayed,\r\n                        dim,\r\n                    } => {\r\n                        match resolver.resolve(coordinate)?.image_storage_coordinates() {\r\n                            Some(coord_dim) if coord_dim == dim => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidImageCoordinateType(\r\n                                    dim, coordinate,\r\n                                ))\r\n                            }\r\n                        };\r\n                        if arrayed != array_index.is_some() {\r\n                            return Err(ExpressionError::InvalidImageArrayIndex);\r\n                        }\r\n                        if let Some(expr) = array_index {\r\n                            match *resolver.resolve(expr)? {\r\n                                Ti::Scalar {\r\n                                    kind: Sk::Sint,\r\n                                    width: _,\r\n                                } => {}\r\n                                _ => return Err(ExpressionError::InvalidImageArrayIndexType(expr)),\r\n                            }\r\n                        }\r\n\r\n                        match (sample, class.is_multisampled()) {\r\n                            (None, false) => {}\r\n                            (Some(sample), true) => {\r\n                                if resolver.resolve(sample)?.scalar_kind() != Some(Sk::Sint) {\r\n                                    return Err(ExpressionError::InvalidImageOtherIndexType(\r\n                                        sample,\r\n                                    ));\r\n                                }\r\n                            }\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidImageOtherIndex);\r\n                            }\r\n                        }\r\n\r\n                        match (level, class.is_mipmapped()) {\r\n                            (None, false) => {}\r\n                            (Some(level), true) => {\r\n                                if resolver.resolve(level)?.scalar_kind() != Some(Sk::Sint) {\r\n                                    return Err(ExpressionError::InvalidImageOtherIndexType(level));\r\n                                }\r\n                            }\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidImageOtherIndex);\r\n                            }\r\n                        }\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedImageType(ty)),\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::ImageQuery { image, query } => {\r\n                let ty = match function.expressions[image] {\r\n                    crate::Expression::GlobalVariable(var_handle) => {\r\n                        module.global_variables[var_handle].ty\r\n                    }\r\n                    crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty,\r\n                    crate::Expression::Access { base, .. }\r\n                    | crate::Expression::AccessIndex { base, .. } => {\r\n                        match function.expressions[base] {\r\n                            crate::Expression::GlobalVariable(var_handle) => {\r\n                                let array_ty = module.global_variables[var_handle].ty;\r\n\r\n                                match module.types[array_ty].inner {\r\n                                    Ti::BindingArray { base, .. } => base,\r\n                                    _ => {\r\n                                        return Err(ExpressionError::ExpectedBindingArrayType(\r\n                                            array_ty,\r\n                                        ))\r\n                                    }\r\n                                }\r\n                            }\r\n                            _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                        }\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedGlobalVariable),\r\n                };\r\n                match module.types[ty].inner {\r\n                    Ti::Image { class, arrayed, .. } => {\r\n                        let good = match query {\r\n                            crate::ImageQuery::NumLayers => arrayed,\r\n                            crate::ImageQuery::Size { level: None } => true,\r\n                            crate::ImageQuery::Size { level: Some(_) }\r\n                            | crate::ImageQuery::NumLevels => class.is_mipmapped(),\r\n                            crate::ImageQuery::NumSamples => class.is_multisampled(),\r\n                        };\r\n                        if !good {\r\n                            return Err(ExpressionError::InvalidImageClass(class));\r\n                        }\r\n                    }\r\n                    _ => return Err(ExpressionError::ExpectedImageType(ty)),\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Unary { op, expr } => {\r\n                use crate::UnaryOperator as Uo;\r\n                let inner = resolver.resolve(expr)?;\r\n                match (op, inner.scalar_kind()) {\r\n                    (_, Some(Sk::Sint | Sk::Bool))\r\n                    //TODO: restrict Negate for bools?\r\n                    | (Uo::Negate, Some(Sk::Float))\r\n                    | (Uo::Not, Some(Sk::Uint)) => {}\r\n                    other => {\r\n                        log::error!(\"Op {:?} kind {:?}\", op, other);\r\n                        return Err(ExpressionError::InvalidUnaryOperandType(op, expr));\r\n                    }\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Binary { op, left, right } => {\r\n                use crate::BinaryOperator as Bo;\r\n                let left_inner = resolver.resolve(left)?;\r\n                let right_inner = resolver.resolve(right)?;\r\n                let good = match op {\r\n                    Bo::Add | Bo::Subtract => match *left_inner {\r\n                        Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind {\r\n                            Sk::Uint | Sk::Sint | Sk::Float => left_inner == right_inner,\r\n                            Sk::Bool => false,\r\n                        },\r\n                        Ti::Matrix { .. } => left_inner == right_inner,\r\n                        _ => false,\r\n                    },\r\n                    Bo::Divide | Bo::Modulo => match *left_inner {\r\n                        Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind {\r\n                            Sk::Uint | Sk::Sint | Sk::Float => left_inner == right_inner,\r\n                            Sk::Bool => false,\r\n                        },\r\n                        _ => false,\r\n                    },\r\n                    Bo::Multiply => {\r\n                        let kind_allowed = match left_inner.scalar_kind() {\r\n                            Some(Sk::Uint | Sk::Sint | Sk::Float) => true,\r\n                            Some(Sk::Bool) | None => false,\r\n                        };\r\n                        let types_match = match (left_inner, right_inner) {\r\n                            // Straight scalar and mixed scalar/vector.\r\n                            (&Ti::Scalar { kind: kind1, .. }, &Ti::Scalar { kind: kind2, .. })\r\n                            | (&Ti::Vector { kind: kind1, .. }, &Ti::Scalar { kind: kind2, .. })\r\n                            | (&Ti::Scalar { kind: kind1, .. }, &Ti::Vector { kind: kind2, .. }) => {\r\n                                kind1 == kind2\r\n                            }\r\n                            // Scalar/matrix.\r\n                            (\r\n                                &Ti::Scalar {\r\n                                    kind: Sk::Float, ..\r\n                                },\r\n                                &Ti::Matrix { .. },\r\n                            )\r\n                            | (\r\n                                &Ti::Matrix { .. },\r\n                                &Ti::Scalar {\r\n                                    kind: Sk::Float, ..\r\n                                },\r\n                            ) => true,\r\n                            // Vector/vector.\r\n                            (\r\n                                &Ti::Vector {\r\n                                    kind: kind1,\r\n                                    size: size1,\r\n                                    ..\r\n                                },\r\n                                &Ti::Vector {\r\n                                    kind: kind2,\r\n                                    size: size2,\r\n                                    ..\r\n                                },\r\n                            ) => kind1 == kind2 && size1 == size2,\r\n                            // Matrix * vector.\r\n                            (\r\n                                &Ti::Matrix { columns, .. },\r\n                                &Ti::Vector {\r\n                                    kind: Sk::Float,\r\n                                    size,\r\n                                    ..\r\n                                },\r\n                            ) => columns == size,\r\n                            // Vector * matrix.\r\n                            (\r\n                                &Ti::Vector {\r\n                                    kind: Sk::Float,\r\n                                    size,\r\n                                    ..\r\n                                },\r\n                                &Ti::Matrix { rows, .. },\r\n                            ) => size == rows,\r\n                            (&Ti::Matrix { columns, .. }, &Ti::Matrix { rows, .. }) => {\r\n                                columns == rows\r\n                            }\r\n                            _ => false,\r\n                        };\r\n                        let left_width = match *left_inner {\r\n                            Ti::Scalar { width, .. }\r\n                            | Ti::Vector { width, .. }\r\n                            | Ti::Matrix { width, .. } => width,\r\n                            _ => 0,\r\n                        };\r\n                        let right_width = match *right_inner {\r\n                            Ti::Scalar { width, .. }\r\n                            | Ti::Vector { width, .. }\r\n                            | Ti::Matrix { width, .. } => width,\r\n                            _ => 0,\r\n                        };\r\n                        kind_allowed && types_match && left_width == right_width\r\n                    }\r\n                    Bo::Equal | Bo::NotEqual => left_inner.is_sized() && left_inner == right_inner,\r\n                    Bo::Less | Bo::LessEqual | Bo::Greater | Bo::GreaterEqual => {\r\n                        match *left_inner {\r\n                            Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind {\r\n                                Sk::Uint | Sk::Sint | Sk::Float => left_inner == right_inner,\r\n                                Sk::Bool => false,\r\n                            },\r\n                            ref other => {\r\n                                log::error!(\"Op {:?} left type {:?}\", op, other);\r\n                                false\r\n                            }\r\n                        }\r\n                    }\r\n                    Bo::LogicalAnd | Bo::LogicalOr => match *left_inner {\r\n                        Ti::Scalar { kind: Sk::Bool, .. } | Ti::Vector { kind: Sk::Bool, .. } => {\r\n                            left_inner == right_inner\r\n                        }\r\n                        ref other => {\r\n                            log::error!(\"Op {:?} left type {:?}\", op, other);\r\n                            false\r\n                        }\r\n                    },\r\n                    Bo::And | Bo::InclusiveOr => match *left_inner {\r\n                        Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind {\r\n                            Sk::Bool | Sk::Sint | Sk::Uint => left_inner == right_inner,\r\n                            Sk::Float => false,\r\n                        },\r\n                        ref other => {\r\n                            log::error!(\"Op {:?} left type {:?}\", op, other);\r\n                            false\r\n                        }\r\n                    },\r\n                    Bo::ExclusiveOr => match *left_inner {\r\n                        Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind {\r\n                            Sk::Sint | Sk::Uint => left_inner == right_inner,\r\n                            Sk::Bool | Sk::Float => false,\r\n                        },\r\n                        ref other => {\r\n                            log::error!(\"Op {:?} left type {:?}\", op, other);\r\n                            false\r\n                        }\r\n                    },\r\n                    Bo::ShiftLeft | Bo::ShiftRight => {\r\n                        let (base_size, base_kind) = match *left_inner {\r\n                            Ti::Scalar { kind, .. } => (Ok(None), kind),\r\n                            Ti::Vector { size, kind, .. } => (Ok(Some(size)), kind),\r\n                            ref other => {\r\n                                log::error!(\"Op {:?} base type {:?}\", op, other);\r\n                                (Err(()), Sk::Bool)\r\n                            }\r\n                        };\r\n                        let shift_size = match *right_inner {\r\n                            Ti::Scalar { kind: Sk::Uint, .. } => Ok(None),\r\n                            Ti::Vector {\r\n                                size,\r\n                                kind: Sk::Uint,\r\n                                ..\r\n                            } => Ok(Some(size)),\r\n                            ref other => {\r\n                                log::error!(\"Op {:?} shift type {:?}\", op, other);\r\n                                Err(())\r\n                            }\r\n                        };\r\n                        match base_kind {\r\n                            Sk::Sint | Sk::Uint => base_size.is_ok() && base_size == shift_size,\r\n                            Sk::Float | Sk::Bool => false,\r\n                        }\r\n                    }\r\n                };\r\n                if !good {\r\n                    log::error!(\r\n                        \"Left: {:?} of type {:?}\",\r\n                        function.expressions[left],\r\n                        left_inner\r\n                    );\r\n                    log::error!(\r\n                        \"Right: {:?} of type {:?}\",\r\n                        function.expressions[right],\r\n                        right_inner\r\n                    );\r\n                    return Err(ExpressionError::InvalidBinaryOperandTypes(op, left, right));\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Select {\r\n                condition,\r\n                accept,\r\n                reject,\r\n            } => {\r\n                let accept_inner = resolver.resolve(accept)?;\r\n                let reject_inner = resolver.resolve(reject)?;\r\n                let condition_good = match *resolver.resolve(condition)? {\r\n                    Ti::Scalar {\r\n                        kind: Sk::Bool,\r\n                        width: _,\r\n                    } => {\r\n                        // When `condition` is a single boolean, `accept` and\r\n                        // `reject` can be vectors or scalars.\r\n                        match *accept_inner {\r\n                            Ti::Scalar { .. } | Ti::Vector { .. } => true,\r\n                            _ => false,\r\n                        }\r\n                    }\r\n                    Ti::Vector {\r\n                        size,\r\n                        kind: Sk::Bool,\r\n                        width: _,\r\n                    } => match *accept_inner {\r\n                        Ti::Vector {\r\n                            size: other_size, ..\r\n                        } => size == other_size,\r\n                        _ => false,\r\n                    },\r\n                    _ => false,\r\n                };\r\n                if !condition_good || accept_inner != reject_inner {\r\n                    return Err(ExpressionError::InvalidSelectTypes);\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Derivative { axis: _, expr } => {\r\n                match *resolver.resolve(expr)? {\r\n                    Ti::Scalar {\r\n                        kind: Sk::Float, ..\r\n                    }\r\n                    | Ti::Vector {\r\n                        kind: Sk::Float, ..\r\n                    } => {}\r\n                    _ => return Err(ExpressionError::InvalidDerivative),\r\n                }\r\n                ShaderStages::FRAGMENT\r\n            }\r\n            E::Relational { fun, argument } => {\r\n                use crate::RelationalFunction as Rf;\r\n                let argument_inner = resolver.resolve(argument)?;\r\n                match fun {\r\n                    Rf::All | Rf::Any => match *argument_inner {\r\n                        Ti::Vector { kind: Sk::Bool, .. } => {}\r\n                        ref other => {\r\n                            log::error!(\"All/Any of type {:?}\", other);\r\n                            return Err(ExpressionError::InvalidBooleanVector(argument));\r\n                        }\r\n                    },\r\n                    Rf::IsNan | Rf::IsInf | Rf::IsFinite | Rf::IsNormal => match *argument_inner {\r\n                        Ti::Scalar {\r\n                            kind: Sk::Float, ..\r\n                        }\r\n                        | Ti::Vector {\r\n                            kind: Sk::Float, ..\r\n                        } => {}\r\n                        ref other => {\r\n                            log::error!(\"Float test of type {:?}\", other);\r\n                            return Err(ExpressionError::InvalidFloatArgument(argument));\r\n                        }\r\n                    },\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::Math {\r\n                fun,\r\n                arg,\r\n                arg1,\r\n                arg2,\r\n                arg3,\r\n            } => {\r\n                use crate::MathFunction as Mf;\r\n\r\n                let arg_ty = resolver.resolve(arg)?;\r\n                let arg1_ty = arg1.map(|expr| resolver.resolve(expr)).transpose()?;\r\n                let arg2_ty = arg2.map(|expr| resolver.resolve(expr)).transpose()?;\r\n                let arg3_ty = arg3.map(|expr| resolver.resolve(expr)).transpose()?;\r\n                match fun {\r\n                    Mf::Abs => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        let good = match *arg_ty {\r\n                            Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => kind != Sk::Bool,\r\n                            _ => false,\r\n                        };\r\n                        if !good {\r\n                            return Err(ExpressionError::InvalidArgumentType(fun, 0, arg));\r\n                        }\r\n                    }\r\n                    Mf::Min | Mf::Max => {\r\n                        let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), None, None) => ty1,\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        let good = match *arg_ty {\r\n                            Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => kind != Sk::Bool,\r\n                            _ => false,\r\n                        };\r\n                        if !good {\r\n                            return Err(ExpressionError::InvalidArgumentType(fun, 0, arg));\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Clamp => {\r\n                        let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), Some(ty2), None) => (ty1, ty2),\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        let good = match *arg_ty {\r\n                            Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => kind != Sk::Bool,\r\n                            _ => false,\r\n                        };\r\n                        if !good {\r\n                            return Err(ExpressionError::InvalidArgumentType(fun, 0, arg));\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                        if arg2_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                2,\r\n                                arg2.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Saturate\r\n                    | Mf::Cos\r\n                    | Mf::Cosh\r\n                    | Mf::Sin\r\n                    | Mf::Sinh\r\n                    | Mf::Tan\r\n                    | Mf::Tanh\r\n                    | Mf::Acos\r\n                    | Mf::Asin\r\n                    | Mf::Atan\r\n                    | Mf::Asinh\r\n                    | Mf::Acosh\r\n                    | Mf::Atanh\r\n                    | Mf::Radians\r\n                    | Mf::Degrees\r\n                    | Mf::Ceil\r\n                    | Mf::Floor\r\n                    | Mf::Round\r\n                    | Mf::Fract\r\n                    | Mf::Trunc\r\n                    | Mf::Exp\r\n                    | Mf::Exp2\r\n                    | Mf::Log\r\n                    | Mf::Log2\r\n                    | Mf::Length\r\n                    | Mf::Sign\r\n                    | Mf::Sqrt\r\n                    | Mf::InverseSqrt => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                    Mf::Atan2 | Mf::Pow | Mf::Distance | Mf::Step => {\r\n                        let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), None, None) => ty1,\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Modf | Mf::Frexp | Mf::Ldexp => {\r\n                        let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), None, None) => ty1,\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        let (size0, width0) = match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            } => (None, width),\r\n                            Ti::Vector {\r\n                                kind: Sk::Float,\r\n                                size,\r\n                                width,\r\n                            } => (Some(size), width),\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        };\r\n                        let good = match *arg1_ty {\r\n                            Ti::Pointer { base, space: _ } => module.types[base].inner == *arg_ty,\r\n                            Ti::ValuePointer {\r\n                                size,\r\n                                kind: Sk::Float,\r\n                                width,\r\n                                space: _,\r\n                            } => size == size0 && width == width0,\r\n                            _ => false,\r\n                        };\r\n                        if !good {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Dot => {\r\n                        let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), None, None) => ty1,\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        match *arg_ty {\r\n                            Ti::Vector {\r\n                                kind: Sk::Float | Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Outer | Mf::Cross | Mf::Reflect => {\r\n                        let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), None, None) => ty1,\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        match *arg_ty {\r\n                            Ti::Vector {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Refract => {\r\n                        let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), Some(ty2), None) => (ty1, ty2),\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n\r\n                        match *arg_ty {\r\n                            Ti::Vector {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n\r\n                        match (arg_ty, arg2_ty) {\r\n                            (\r\n                                &Ti::Vector {\r\n                                    width: vector_width,\r\n                                    ..\r\n                                },\r\n                                &Ti::Scalar {\r\n                                    width: scalar_width,\r\n                                    kind: Sk::Float,\r\n                                },\r\n                            ) if vector_width == scalar_width => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidArgumentType(\r\n                                    fun,\r\n                                    2,\r\n                                    arg2.unwrap(),\r\n                                ))\r\n                            }\r\n                        }\r\n                    }\r\n                    Mf::Normalize => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Vector {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                    Mf::FaceForward | Mf::Fma | Mf::SmoothStep => {\r\n                        let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), Some(ty2), None) => (ty1, ty2),\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float, ..\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Float, ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                        if arg2_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                2,\r\n                                arg2.unwrap(),\r\n                            ));\r\n                        }\r\n                    }\r\n                    Mf::Mix => {\r\n                        let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), Some(ty2), None) => (ty1, ty2),\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        let arg_width = match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                                ..\r\n                            } => width,\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        };\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                        // the last argument can always be a scalar\r\n                        match *arg2_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            } if width == arg_width => {}\r\n                            _ if arg2_ty == arg_ty => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidArgumentType(\r\n                                    fun,\r\n                                    2,\r\n                                    arg2.unwrap(),\r\n                                ));\r\n                            }\r\n                        }\r\n                    }\r\n                    Mf::Inverse | Mf::Determinant => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        let good = match *arg_ty {\r\n                            Ti::Matrix { columns, rows, .. } => columns == rows,\r\n                            _ => false,\r\n                        };\r\n                        if !good {\r\n                            return Err(ExpressionError::InvalidArgumentType(fun, 0, arg));\r\n                        }\r\n                    }\r\n                    Mf::Transpose => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Matrix { .. } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                    Mf::CountOneBits | Mf::ReverseBits | Mf::FindLsb | Mf::FindMsb => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                    Mf::InsertBits => {\r\n                        let (arg1_ty, arg2_ty, arg3_ty) = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), Some(ty2), Some(ty3)) => (ty1, ty2, ty3),\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                        if arg1_ty != arg_ty {\r\n                            return Err(ExpressionError::InvalidArgumentType(\r\n                                fun,\r\n                                1,\r\n                                arg1.unwrap(),\r\n                            ));\r\n                        }\r\n                        match *arg2_ty {\r\n                            Ti::Scalar { kind: Sk::Uint, .. } => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidArgumentType(\r\n                                    fun,\r\n                                    2,\r\n                                    arg2.unwrap(),\r\n                                ))\r\n                            }\r\n                        }\r\n                        match *arg3_ty {\r\n                            Ti::Scalar { kind: Sk::Uint, .. } => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidArgumentType(\r\n                                    fun,\r\n                                    2,\r\n                                    arg3.unwrap(),\r\n                                ))\r\n                            }\r\n                        }\r\n                    }\r\n                    Mf::ExtractBits => {\r\n                        let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) {\r\n                            (Some(ty1), Some(ty2), None) => (ty1, ty2),\r\n                            _ => return Err(ExpressionError::WrongArgumentCount(fun)),\r\n                        };\r\n                        match *arg_ty {\r\n                            Ti::Scalar {\r\n                                kind: Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            }\r\n                            | Ti::Vector {\r\n                                kind: Sk::Sint | Sk::Uint,\r\n                                ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                        match *arg1_ty {\r\n                            Ti::Scalar { kind: Sk::Uint, .. } => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidArgumentType(\r\n                                    fun,\r\n                                    2,\r\n                                    arg1.unwrap(),\r\n                                ))\r\n                            }\r\n                        }\r\n                        match *arg2_ty {\r\n                            Ti::Scalar { kind: Sk::Uint, .. } => {}\r\n                            _ => {\r\n                                return Err(ExpressionError::InvalidArgumentType(\r\n                                    fun,\r\n                                    2,\r\n                                    arg2.unwrap(),\r\n                                ))\r\n                            }\r\n                        }\r\n                    }\r\n                    Mf::Pack2x16unorm | Mf::Pack2x16snorm | Mf::Pack2x16float => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Vector {\r\n                                size: crate::VectorSize::Bi,\r\n                                kind: Sk::Float,\r\n                                ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                    Mf::Pack4x8snorm | Mf::Pack4x8unorm => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Vector {\r\n                                size: crate::VectorSize::Quad,\r\n                                kind: Sk::Float,\r\n                                ..\r\n                            } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                    Mf::Unpack2x16float\r\n                    | Mf::Unpack2x16snorm\r\n                    | Mf::Unpack2x16unorm\r\n                    | Mf::Unpack4x8snorm\r\n                    | Mf::Unpack4x8unorm => {\r\n                        if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() {\r\n                            return Err(ExpressionError::WrongArgumentCount(fun));\r\n                        }\r\n                        match *arg_ty {\r\n                            Ti::Scalar { kind: Sk::Uint, .. } => {}\r\n                            _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),\r\n                        }\r\n                    }\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::As {\r\n                expr,\r\n                kind,\r\n                convert,\r\n            } => {\r\n                let base_width = match *resolver.resolve(expr)? {\r\n                    crate::TypeInner::Scalar { width, .. }\r\n                    | crate::TypeInner::Vector { width, .. }\r\n                    | crate::TypeInner::Matrix { width, .. } => width,\r\n                    _ => return Err(ExpressionError::InvalidCastArgument),\r\n                };\r\n                let width = convert.unwrap_or(base_width);\r\n                if !self.check_width(kind, width) {\r\n                    return Err(ExpressionError::InvalidCastArgument);\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::CallResult(function) => other_infos[function.index()].available_stages,\r\n            E::AtomicResult {\r\n                kind,\r\n                width,\r\n                comparison: _,\r\n            } => {\r\n                let good = match kind {\r\n                    crate::ScalarKind::Uint | crate::ScalarKind::Sint => {\r\n                        self.check_width(kind, width)\r\n                    }\r\n                    _ => false,\r\n                };\r\n                if !good {\r\n                    return Err(ExpressionError::InvalidAtomicResultType(kind, width));\r\n                }\r\n                ShaderStages::all()\r\n            }\r\n            E::ArrayLength(expr) => match *resolver.resolve(expr)? {\r\n                Ti::Pointer { base, .. } => {\r\n                    let base_ty = resolver.types.get_handle(base)?;\r\n                    if let Ti::Array {\r\n                        size: crate::ArraySize::Dynamic,\r\n                        ..\r\n                    } = base_ty.inner\r\n                    {\r\n                        ShaderStages::all()\r\n                    } else {\r\n                        return Err(ExpressionError::InvalidArrayType(expr));\r\n                    }\r\n                }\r\n                ref other => {\r\n                    log::error!(\"Array length of {:?}\", other);\r\n                    return Err(ExpressionError::InvalidArrayType(expr));\r\n                }\r\n            },\r\n        };\r\n        Ok(stages)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/function.rs",
    "content": "#[cfg(feature = \"validate\")]\r\nuse crate::arena::{Arena, UniqueArena};\r\nuse crate::arena::{BadHandle, Handle};\r\n\r\nuse super::{\r\n    analyzer::{UniformityDisruptor, UniformityRequirements},\r\n    ExpressionError, FunctionInfo, ModuleInfo,\r\n};\r\nuse crate::span::WithSpan;\r\n#[cfg(feature = \"validate\")]\r\nuse crate::span::{AddSpan as _, MapErrWithSpan as _};\r\n\r\n#[cfg(feature = \"validate\")]\r\nuse bit_set::BitSet;\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum CallError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"The callee is declared after the caller\")]\r\n    ForwardDeclaredFunction,\r\n    #[error(\"Argument {index} expression is invalid\")]\r\n    Argument {\r\n        index: usize,\r\n        #[source]\r\n        error: ExpressionError,\r\n    },\r\n    #[error(\"Result expression {0:?} has already been introduced earlier\")]\r\n    ResultAlreadyInScope(Handle<crate::Expression>),\r\n    #[error(\"Result value is invalid\")]\r\n    ResultValue(#[source] ExpressionError),\r\n    #[error(\"Requires {required} arguments, but {seen} are provided\")]\r\n    ArgumentCount { required: usize, seen: usize },\r\n    #[error(\"Argument {index} value {seen_expression:?} doesn't match the type {required:?}\")]\r\n    ArgumentType {\r\n        index: usize,\r\n        required: Handle<crate::Type>,\r\n        seen_expression: Handle<crate::Expression>,\r\n    },\r\n    #[error(\"The emitted expression doesn't match the call\")]\r\n    ExpressionMismatch(Option<Handle<crate::Expression>>),\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum AtomicError {\r\n    #[error(\"Pointer {0:?} to atomic is invalid.\")]\r\n    InvalidPointer(Handle<crate::Expression>),\r\n    #[error(\"Operand {0:?} has invalid type.\")]\r\n    InvalidOperand(Handle<crate::Expression>),\r\n    #[error(\"Result expression {0:?} has already been introduced earlier\")]\r\n    ResultAlreadyInScope(Handle<crate::Expression>),\r\n    #[error(\"Result type for {0:?} doesn't match the statement\")]\r\n    ResultTypeMismatch(Handle<crate::Expression>),\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum LocalVariableError {\r\n    #[error(\"Local variable has a type {0:?} that can't be stored in a local variable.\")]\r\n    InvalidType(Handle<crate::Type>),\r\n    #[error(\"Initializer doesn't match the variable type\")]\r\n    InitializerType,\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\n#[cfg_attr(test, derive(PartialEq))]\r\npub enum FunctionError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"Expression {handle:?} is invalid\")]\r\n    Expression {\r\n        handle: Handle<crate::Expression>,\r\n        #[source]\r\n        error: ExpressionError,\r\n    },\r\n    #[error(\"Expression {0:?} can't be introduced - it's already in scope\")]\r\n    ExpressionAlreadyInScope(Handle<crate::Expression>),\r\n    #[error(\"Local variable {handle:?} '{name}' is invalid\")]\r\n    LocalVariable {\r\n        handle: Handle<crate::LocalVariable>,\r\n        name: String,\r\n        #[source]\r\n        error: LocalVariableError,\r\n    },\r\n    #[error(\"Argument '{name}' at index {index} has a type that can't be passed into functions.\")]\r\n    InvalidArgumentType { index: usize, name: String },\r\n    #[error(\"The function's given return type cannot be returned from functions\")]\r\n    NonConstructibleReturnType,\r\n    #[error(\"Argument '{name}' at index {index} is a pointer of space {space:?}, which can't be passed into functions.\")]\r\n    InvalidArgumentPointerSpace {\r\n        index: usize,\r\n        name: String,\r\n        space: crate::AddressSpace,\r\n    },\r\n    #[error(\"There are instructions after `return`/`break`/`continue`\")]\r\n    InstructionsAfterReturn,\r\n    #[error(\"The `break` is used outside of a `loop` or `switch` context\")]\r\n    BreakOutsideOfLoopOrSwitch,\r\n    #[error(\"The `continue` is used outside of a `loop` context\")]\r\n    ContinueOutsideOfLoop,\r\n    #[error(\"The `return` is called within a `continuing` block\")]\r\n    InvalidReturnSpot,\r\n    #[error(\"The `return` value {0:?} does not match the function return value\")]\r\n    InvalidReturnType(Option<Handle<crate::Expression>>),\r\n    #[error(\"The `if` condition {0:?} is not a boolean scalar\")]\r\n    InvalidIfType(Handle<crate::Expression>),\r\n    #[error(\"The `switch` value {0:?} is not an integer scalar\")]\r\n    InvalidSwitchType(Handle<crate::Expression>),\r\n    #[error(\"Multiple `switch` cases for {0:?} are present\")]\r\n    ConflictingSwitchCase(i32),\r\n    #[error(\"The `switch` is missing a `default` case\")]\r\n    MissingDefaultCase,\r\n    #[error(\"Multiple `default` cases are present\")]\r\n    MultipleDefaultCases,\r\n    #[error(\"The last `switch` case contains a `falltrough`\")]\r\n    LastCaseFallTrough,\r\n    #[error(\"The pointer {0:?} doesn't relate to a valid destination for a store\")]\r\n    InvalidStorePointer(Handle<crate::Expression>),\r\n    #[error(\"The value {0:?} can not be stored\")]\r\n    InvalidStoreValue(Handle<crate::Expression>),\r\n    #[error(\"Store of {value:?} into {pointer:?} doesn't have matching types\")]\r\n    InvalidStoreTypes {\r\n        pointer: Handle<crate::Expression>,\r\n        value: Handle<crate::Expression>,\r\n    },\r\n    #[error(\"Image store parameters are invalid\")]\r\n    InvalidImageStore(#[source] ExpressionError),\r\n    #[error(\"Call to {function:?} is invalid\")]\r\n    InvalidCall {\r\n        function: Handle<crate::Function>,\r\n        #[source]\r\n        error: CallError,\r\n    },\r\n    #[error(\"Atomic operation is invalid\")]\r\n    InvalidAtomic(#[from] AtomicError),\r\n    #[error(\r\n        \"Required uniformity of control flow for {0:?} in {1:?} is not fulfilled because of {2:?}\"\r\n    )]\r\n    NonUniformControlFlow(\r\n        UniformityRequirements,\r\n        Handle<crate::Expression>,\r\n        UniformityDisruptor,\r\n    ),\r\n    #[error(\"Functions that are not entry points cannot have `@location` or `@builtin` attributes on their arguments: \\\"{name}\\\" has attributes\")]\r\n    PipelineInputRegularFunction { name: String },\r\n    #[error(\"Functions that are not entry points cannot have `@location` or `@builtin` attributes on their return value types\")]\r\n    PipelineOutputRegularFunction,\r\n}\r\n\r\nbitflags::bitflags! {\r\n    #[repr(transparent)]\r\n    struct ControlFlowAbility: u8 {\r\n        /// The control can return out of this block.\r\n        const RETURN = 0x1;\r\n        /// The control can break.\r\n        const BREAK = 0x2;\r\n        /// The control can continue.\r\n        const CONTINUE = 0x4;\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nstruct BlockInfo {\r\n    stages: super::ShaderStages,\r\n    finished: bool,\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nstruct BlockContext<'a> {\r\n    abilities: ControlFlowAbility,\r\n    info: &'a FunctionInfo,\r\n    expressions: &'a Arena<crate::Expression>,\r\n    types: &'a UniqueArena<crate::Type>,\r\n    global_vars: &'a Arena<crate::GlobalVariable>,\r\n    functions: &'a Arena<crate::Function>,\r\n    prev_infos: &'a [FunctionInfo],\r\n    return_type: Option<Handle<crate::Type>>,\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nimpl<'a> BlockContext<'a> {\r\n    fn new(\r\n        fun: &'a crate::Function,\r\n        module: &'a crate::Module,\r\n        info: &'a FunctionInfo,\r\n        prev_infos: &'a [FunctionInfo],\r\n    ) -> Self {\r\n        Self {\r\n            abilities: ControlFlowAbility::RETURN,\r\n            info,\r\n            expressions: &fun.expressions,\r\n            types: &module.types,\r\n            global_vars: &module.global_variables,\r\n            functions: &module.functions,\r\n            prev_infos,\r\n            return_type: fun.result.as_ref().map(|fr| fr.ty),\r\n        }\r\n    }\r\n\r\n    const fn with_abilities(&self, abilities: ControlFlowAbility) -> Self {\r\n        BlockContext { abilities, ..*self }\r\n    }\r\n\r\n    fn get_expression(\r\n        &self,\r\n        handle: Handle<crate::Expression>,\r\n    ) -> Result<&'a crate::Expression, FunctionError> {\r\n        Ok(self.expressions.try_get(handle)?)\r\n    }\r\n\r\n    fn resolve_type_impl(\r\n        &self,\r\n        handle: Handle<crate::Expression>,\r\n        valid_expressions: &BitSet,\r\n    ) -> Result<&crate::TypeInner, WithSpan<ExpressionError>> {\r\n        if handle.index() >= self.expressions.len() {\r\n            Err(ExpressionError::DoesntExist.with_span())\r\n        } else if !valid_expressions.contains(handle.index()) {\r\n            Err(ExpressionError::NotInScope.with_span_handle(handle, self.expressions))\r\n        } else {\r\n            Ok(self.info[handle].ty.inner_with(self.types))\r\n        }\r\n    }\r\n\r\n    fn resolve_type(\r\n        &self,\r\n        handle: Handle<crate::Expression>,\r\n        valid_expressions: &BitSet,\r\n    ) -> Result<&crate::TypeInner, WithSpan<FunctionError>> {\r\n        self.resolve_type_impl(handle, valid_expressions)\r\n            .map_err_inner(|error| FunctionError::Expression { handle, error }.with_span())\r\n    }\r\n\r\n    fn resolve_pointer_type(\r\n        &self,\r\n        handle: Handle<crate::Expression>,\r\n    ) -> Result<&crate::TypeInner, FunctionError> {\r\n        if handle.index() >= self.expressions.len() {\r\n            Err(FunctionError::Expression {\r\n                handle,\r\n                error: ExpressionError::DoesntExist,\r\n            })\r\n        } else {\r\n            Ok(self.info[handle].ty.inner_with(self.types))\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::Validator {\r\n    #[cfg(feature = \"validate\")]\r\n    fn validate_call(\r\n        &mut self,\r\n        function: Handle<crate::Function>,\r\n        arguments: &[Handle<crate::Expression>],\r\n        result: Option<Handle<crate::Expression>>,\r\n        context: &BlockContext,\r\n    ) -> Result<super::ShaderStages, WithSpan<CallError>> {\r\n        let fun = context\r\n            .functions\r\n            .try_get(function)\r\n            .map_err(CallError::BadHandle)\r\n            .map_err(WithSpan::new)?;\r\n        if fun.arguments.len() != arguments.len() {\r\n            return Err(CallError::ArgumentCount {\r\n                required: fun.arguments.len(),\r\n                seen: arguments.len(),\r\n            }\r\n            .with_span());\r\n        }\r\n        for (index, (arg, &expr)) in fun.arguments.iter().zip(arguments).enumerate() {\r\n            let ty = context\r\n                .resolve_type_impl(expr, &self.valid_expression_set)\r\n                .map_err_inner(|error| {\r\n                    CallError::Argument { index, error }.with_span_handle(expr, context.expressions)\r\n                })?;\r\n            let arg_inner = &context.types[arg.ty].inner;\r\n            if !ty.equivalent(arg_inner, context.types) {\r\n                return Err(CallError::ArgumentType {\r\n                    index,\r\n                    required: arg.ty,\r\n                    seen_expression: expr,\r\n                }\r\n                .with_span_handle(expr, context.expressions));\r\n            }\r\n        }\r\n\r\n        if let Some(expr) = result {\r\n            if self.valid_expression_set.insert(expr.index()) {\r\n                self.valid_expression_list.push(expr);\r\n            } else {\r\n                return Err(CallError::ResultAlreadyInScope(expr)\r\n                    .with_span_handle(expr, context.expressions));\r\n            }\r\n            match context.expressions[expr] {\r\n                crate::Expression::CallResult(callee)\r\n                    if fun.result.is_some() && callee == function => {}\r\n                _ => {\r\n                    return Err(CallError::ExpressionMismatch(result)\r\n                        .with_span_handle(expr, context.expressions))\r\n                }\r\n            }\r\n        } else if fun.result.is_some() {\r\n            return Err(CallError::ExpressionMismatch(result).with_span());\r\n        }\r\n\r\n        let callee_info = &context.prev_infos[function.index()];\r\n        Ok(callee_info.available_stages)\r\n    }\r\n\r\n    #[cfg(feature = \"validate\")]\r\n    fn validate_atomic(\r\n        &mut self,\r\n        pointer: Handle<crate::Expression>,\r\n        fun: &crate::AtomicFunction,\r\n        value: Handle<crate::Expression>,\r\n        result: Handle<crate::Expression>,\r\n        context: &BlockContext,\r\n    ) -> Result<(), WithSpan<FunctionError>> {\r\n        let pointer_inner = context.resolve_type(pointer, &self.valid_expression_set)?;\r\n        let (ptr_kind, ptr_width) = match *pointer_inner {\r\n            crate::TypeInner::Pointer { base, .. } => match context.types[base].inner {\r\n                crate::TypeInner::Atomic { kind, width } => (kind, width),\r\n                ref other => {\r\n                    log::error!(\"Atomic pointer to type {:?}\", other);\r\n                    return Err(AtomicError::InvalidPointer(pointer)\r\n                        .with_span_handle(pointer, context.expressions)\r\n                        .into_other());\r\n                }\r\n            },\r\n            ref other => {\r\n                log::error!(\"Atomic on type {:?}\", other);\r\n                return Err(AtomicError::InvalidPointer(pointer)\r\n                    .with_span_handle(pointer, context.expressions)\r\n                    .into_other());\r\n            }\r\n        };\r\n\r\n        let value_inner = context.resolve_type(value, &self.valid_expression_set)?;\r\n        match *value_inner {\r\n            crate::TypeInner::Scalar { width, kind } if kind == ptr_kind && width == ptr_width => {}\r\n            ref other => {\r\n                log::error!(\"Atomic operand type {:?}\", other);\r\n                return Err(AtomicError::InvalidOperand(value)\r\n                    .with_span_handle(value, context.expressions)\r\n                    .into_other());\r\n            }\r\n        }\r\n\r\n        if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun {\r\n            if context.resolve_type(cmp, &self.valid_expression_set)? != value_inner {\r\n                log::error!(\"Atomic exchange comparison has a different type from the value\");\r\n                return Err(AtomicError::InvalidOperand(cmp)\r\n                    .with_span_handle(cmp, context.expressions)\r\n                    .into_other());\r\n            }\r\n        }\r\n\r\n        if self.valid_expression_set.insert(result.index()) {\r\n            self.valid_expression_list.push(result);\r\n        } else {\r\n            return Err(AtomicError::ResultAlreadyInScope(result)\r\n                .with_span_handle(result, context.expressions)\r\n                .into_other());\r\n        }\r\n        match context.expressions[result] {\r\n            //TODO: support atomic result with comparison\r\n            crate::Expression::AtomicResult {\r\n                kind,\r\n                width,\r\n                // comparison: false,\r\n                ..\r\n            } if kind == ptr_kind && width == ptr_width => {}\r\n            _ => {\r\n                return Err(AtomicError::ResultTypeMismatch(result)\r\n                    .with_span_handle(result, context.expressions)\r\n                    .into_other())\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    #[cfg(feature = \"validate\")]\r\n    fn validate_block_impl(\r\n        &mut self,\r\n        statements: &crate::Block,\r\n        context: &BlockContext,\r\n    ) -> Result<BlockInfo, WithSpan<FunctionError>> {\r\n        use crate::{Statement as S, TypeInner as Ti};\r\n        let mut finished = false;\r\n        let mut stages = super::ShaderStages::all();\r\n        for (statement, &span) in statements.span_iter() {\r\n            if finished {\r\n                return Err(FunctionError::InstructionsAfterReturn\r\n                    .with_span_static(span, \"instructions after return\"));\r\n            }\r\n            match *statement {\r\n                S::Emit(ref range) => {\r\n                    for handle in range.clone() {\r\n                        if self.valid_expression_set.insert(handle.index()) {\r\n                            self.valid_expression_list.push(handle);\r\n                        } else {\r\n                            return Err(FunctionError::ExpressionAlreadyInScope(handle)\r\n                                .with_span_handle(handle, context.expressions));\r\n                        }\r\n                    }\r\n                }\r\n                S::Block(ref block) => {\r\n                    let info = self.validate_block(block, context)?;\r\n                    stages &= info.stages;\r\n                    finished = info.finished;\r\n                }\r\n                S::If {\r\n                    condition,\r\n                    ref accept,\r\n                    ref reject,\r\n                } => {\r\n                    match *context.resolve_type(condition, &self.valid_expression_set)? {\r\n                        Ti::Scalar {\r\n                            kind: crate::ScalarKind::Bool,\r\n                            width: _,\r\n                        } => {}\r\n                        _ => {\r\n                            return Err(FunctionError::InvalidIfType(condition)\r\n                                .with_span_handle(condition, context.expressions))\r\n                        }\r\n                    }\r\n                    stages &= self.validate_block(accept, context)?.stages;\r\n                    stages &= self.validate_block(reject, context)?.stages;\r\n                }\r\n                S::Switch {\r\n                    selector,\r\n                    ref cases,\r\n                } => {\r\n                    match *context.resolve_type(selector, &self.valid_expression_set)? {\r\n                        Ti::Scalar {\r\n                            kind: crate::ScalarKind::Uint,\r\n                            width: _,\r\n                        } => {}\r\n                        Ti::Scalar {\r\n                            kind: crate::ScalarKind::Sint,\r\n                            width: _,\r\n                        } => {}\r\n                        _ => {\r\n                            return Err(FunctionError::InvalidSwitchType(selector)\r\n                                .with_span_handle(selector, context.expressions))\r\n                        }\r\n                    }\r\n                    self.select_cases.clear();\r\n                    let mut default = false;\r\n                    for case in cases {\r\n                        match case.value {\r\n                            crate::SwitchValue::Integer(value) => {\r\n                                if !self.select_cases.insert(value) {\r\n                                    return Err(FunctionError::ConflictingSwitchCase(value)\r\n                                        .with_span_static(\r\n                                            case.body\r\n                                                .span_iter()\r\n                                                .next()\r\n                                                .map_or(Default::default(), |(_, s)| *s),\r\n                                            \"conflicting switch arm here\",\r\n                                        ));\r\n                                }\r\n                            }\r\n                            crate::SwitchValue::Default => {\r\n                                if default {\r\n                                    return Err(FunctionError::MultipleDefaultCases\r\n                                        .with_span_static(\r\n                                            case.body\r\n                                                .span_iter()\r\n                                                .next()\r\n                                                .map_or(Default::default(), |(_, s)| *s),\r\n                                            \"duplicated switch arm here\",\r\n                                        ));\r\n                                }\r\n                                default = true\r\n                            }\r\n                        }\r\n                    }\r\n                    if !default {\r\n                        return Err(FunctionError::MissingDefaultCase\r\n                            .with_span_static(span, \"missing default case\"));\r\n                    }\r\n                    if let Some(case) = cases.last() {\r\n                        if case.fall_through {\r\n                            return Err(FunctionError::LastCaseFallTrough.with_span_static(\r\n                                case.body\r\n                                    .span_iter()\r\n                                    .next()\r\n                                    .map_or(Default::default(), |(_, s)| *s),\r\n                                \"bad switch arm here\",\r\n                            ));\r\n                        }\r\n                    }\r\n                    let pass_through_abilities = context.abilities\r\n                        & (ControlFlowAbility::RETURN | ControlFlowAbility::CONTINUE);\r\n                    let sub_context =\r\n                        context.with_abilities(pass_through_abilities | ControlFlowAbility::BREAK);\r\n                    for case in cases {\r\n                        stages &= self.validate_block(&case.body, &sub_context)?.stages;\r\n                    }\r\n                }\r\n                S::Loop {\r\n                    ref body,\r\n                    ref continuing,\r\n                    break_if,\r\n                } => {\r\n                    // special handling for block scoping is needed here,\r\n                    // because the continuing{} block inherits the scope\r\n                    let base_expression_count = self.valid_expression_list.len();\r\n                    let pass_through_abilities = context.abilities & ControlFlowAbility::RETURN;\r\n                    stages &= self\r\n                        .validate_block_impl(\r\n                            body,\r\n                            &context.with_abilities(\r\n                                pass_through_abilities\r\n                                    | ControlFlowAbility::BREAK\r\n                                    | ControlFlowAbility::CONTINUE,\r\n                            ),\r\n                        )?\r\n                        .stages;\r\n                    stages &= self\r\n                        .validate_block_impl(\r\n                            continuing,\r\n                            &context.with_abilities(ControlFlowAbility::empty()),\r\n                        )?\r\n                        .stages;\r\n\r\n                    if let Some(condition) = break_if {\r\n                        match *context.resolve_type(condition, &self.valid_expression_set)? {\r\n                            Ti::Scalar {\r\n                                kind: crate::ScalarKind::Bool,\r\n                                width: _,\r\n                            } => {}\r\n                            _ => {\r\n                                return Err(FunctionError::InvalidIfType(condition)\r\n                                    .with_span_handle(condition, context.expressions))\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    for handle in self.valid_expression_list.drain(base_expression_count..) {\r\n                        self.valid_expression_set.remove(handle.index());\r\n                    }\r\n                }\r\n                S::Break => {\r\n                    if !context.abilities.contains(ControlFlowAbility::BREAK) {\r\n                        return Err(FunctionError::BreakOutsideOfLoopOrSwitch\r\n                            .with_span_static(span, \"invalid break\"));\r\n                    }\r\n                    finished = true;\r\n                }\r\n                S::Continue => {\r\n                    if !context.abilities.contains(ControlFlowAbility::CONTINUE) {\r\n                        return Err(FunctionError::ContinueOutsideOfLoop\r\n                            .with_span_static(span, \"invalid continue\"));\r\n                    }\r\n                    finished = true;\r\n                }\r\n                S::Return { value } => {\r\n                    if !context.abilities.contains(ControlFlowAbility::RETURN) {\r\n                        return Err(FunctionError::InvalidReturnSpot\r\n                            .with_span_static(span, \"invalid return\"));\r\n                    }\r\n                    let value_ty = value\r\n                        .map(|expr| context.resolve_type(expr, &self.valid_expression_set))\r\n                        .transpose()?;\r\n                    let expected_ty = context.return_type.map(|ty| &context.types[ty].inner);\r\n                    // We can't return pointers, but it seems best not to embed that\r\n                    // assumption here, so use `TypeInner::equivalent` for comparison.\r\n                    let okay = match (value_ty, expected_ty) {\r\n                        (None, None) => true,\r\n                        (Some(value_inner), Some(expected_inner)) => {\r\n                            value_inner.equivalent(expected_inner, context.types)\r\n                        }\r\n                        (_, _) => false,\r\n                    };\r\n\r\n                    if !okay {\r\n                        log::error!(\r\n                            \"Returning {:?} where {:?} is expected\",\r\n                            value_ty,\r\n                            expected_ty\r\n                        );\r\n                        if let Some(handle) = value {\r\n                            return Err(FunctionError::InvalidReturnType(value)\r\n                                .with_span_handle(handle, context.expressions));\r\n                        } else {\r\n                            return Err(FunctionError::InvalidReturnType(value)\r\n                                .with_span_static(span, \"invalid return\"));\r\n                        }\r\n                    }\r\n                    finished = true;\r\n                }\r\n                S::Kill => {\r\n                    finished = true;\r\n                }\r\n                S::Barrier(_) => {\r\n                    stages &= super::ShaderStages::COMPUTE;\r\n                }\r\n                S::Store { pointer, value } => {\r\n                    let mut current = pointer;\r\n                    loop {\r\n                        let _ = context\r\n                            .resolve_pointer_type(current)\r\n                            .map_err(|e| e.with_span())?;\r\n                        match context.expressions[current] {\r\n                            crate::Expression::Access { base, .. }\r\n                            | crate::Expression::AccessIndex { base, .. } => current = base,\r\n                            crate::Expression::LocalVariable(_)\r\n                            | crate::Expression::GlobalVariable(_)\r\n                            | crate::Expression::FunctionArgument(_) => break,\r\n                            _ => {\r\n                                return Err(FunctionError::InvalidStorePointer(current)\r\n                                    .with_span_handle(pointer, context.expressions))\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    let value_ty = context.resolve_type(value, &self.valid_expression_set)?;\r\n                    match *value_ty {\r\n                        Ti::Image { .. } | Ti::Sampler { .. } => {\r\n                            return Err(FunctionError::InvalidStoreValue(value)\r\n                                .with_span_handle(value, context.expressions));\r\n                        }\r\n                        _ => {}\r\n                    }\r\n\r\n                    let pointer_ty = context\r\n                        .resolve_pointer_type(pointer)\r\n                        .map_err(|e| e.with_span())?;\r\n\r\n                    let good = match *pointer_ty {\r\n                        Ti::Pointer { base, space: _ } => match context.types[base].inner {\r\n                            Ti::Atomic { kind, width } => *value_ty == Ti::Scalar { kind, width },\r\n                            ref other => value_ty == other,\r\n                        },\r\n                        Ti::ValuePointer {\r\n                            size: Some(size),\r\n                            kind,\r\n                            width,\r\n                            space: _,\r\n                        } => *value_ty == Ti::Vector { size, kind, width },\r\n                        Ti::ValuePointer {\r\n                            size: None,\r\n                            kind,\r\n                            width,\r\n                            space: _,\r\n                        } => *value_ty == Ti::Scalar { kind, width },\r\n                        _ => false,\r\n                    };\r\n                    if !good {\r\n                        if let Ti::Pointer { base, .. } = *pointer_ty {\r\n                            println!(\"{:?}\", context.types[base].inner);\r\n                            println!(\"{:?}\", value_ty);\r\n                        }\r\n\r\n                        return Err(FunctionError::InvalidStoreTypes { pointer, value }\r\n                            .with_span()\r\n                            .with_handle(pointer, context.expressions)\r\n                            .with_handle(value, context.expressions));\r\n                    }\r\n\r\n                    if let Some(space) = pointer_ty.pointer_space() {\r\n                        if !space.access().contains(crate::StorageAccess::STORE) {\r\n                            return Err(FunctionError::InvalidStorePointer(pointer)\r\n                                .with_span_static(\r\n                                    context.expressions.get_span(pointer),\r\n                                    \"writing to this location is not permitted\",\r\n                                ));\r\n                        }\r\n                    }\r\n                }\r\n                S::ImageStore {\r\n                    image,\r\n                    coordinate,\r\n                    array_index,\r\n                    value,\r\n                } => {\r\n                    //Note: this code uses a lot of `FunctionError::InvalidImageStore`,\r\n                    // and could probably be refactored.\r\n                    let var = match *context.get_expression(image).map_err(|e| e.with_span())? {\r\n                        crate::Expression::GlobalVariable(var_handle) => {\r\n                            &context.global_vars[var_handle]\r\n                        }\r\n                        // We're looking at a binding index situation, so punch through the index and look at the global behind it.\r\n                        crate::Expression::Access { base, .. }\r\n                        | crate::Expression::AccessIndex { base, .. } => {\r\n                            match *context.get_expression(base).map_err(|e| e.with_span())? {\r\n                                crate::Expression::GlobalVariable(var_handle) => {\r\n                                    &context.global_vars[var_handle]\r\n                                }\r\n                                _ => {\r\n                                    return Err(FunctionError::InvalidImageStore(\r\n                                        ExpressionError::ExpectedGlobalVariable,\r\n                                    )\r\n                                    .with_span_handle(image, context.expressions))\r\n                                }\r\n                            }\r\n                        }\r\n                        _ => {\r\n                            return Err(FunctionError::InvalidImageStore(\r\n                                ExpressionError::ExpectedGlobalVariable,\r\n                            )\r\n                            .with_span_handle(image, context.expressions))\r\n                        }\r\n                    };\r\n\r\n                    // Punch through a binding array to get the underlying type\r\n                    let global_ty = match context.types[var.ty].inner {\r\n                        Ti::BindingArray { base, .. } => &context.types[base].inner,\r\n                        ref inner => inner,\r\n                    };\r\n\r\n                    let value_ty = match *global_ty {\r\n                        Ti::Image {\r\n                            class,\r\n                            arrayed,\r\n                            dim,\r\n                        } => {\r\n                            match context\r\n                                .resolve_type(coordinate, &self.valid_expression_set)?\r\n                                .image_storage_coordinates()\r\n                            {\r\n                                Some(coord_dim) if coord_dim == dim => {}\r\n                                _ => {\r\n                                    return Err(FunctionError::InvalidImageStore(\r\n                                        ExpressionError::InvalidImageCoordinateType(\r\n                                            dim, coordinate,\r\n                                        ),\r\n                                    )\r\n                                    .with_span_handle(coordinate, context.expressions));\r\n                                }\r\n                            };\r\n                            if arrayed != array_index.is_some() {\r\n                                return Err(FunctionError::InvalidImageStore(\r\n                                    ExpressionError::InvalidImageArrayIndex,\r\n                                )\r\n                                .with_span_handle(coordinate, context.expressions));\r\n                            }\r\n                            if let Some(expr) = array_index {\r\n                                match *context.resolve_type(expr, &self.valid_expression_set)? {\r\n                                    Ti::Scalar {\r\n                                        kind: crate::ScalarKind::Sint,\r\n                                        width: _,\r\n                                    } => {}\r\n                                    _ => {\r\n                                        return Err(FunctionError::InvalidImageStore(\r\n                                            ExpressionError::InvalidImageArrayIndexType(expr),\r\n                                        )\r\n                                        .with_span_handle(expr, context.expressions));\r\n                                    }\r\n                                }\r\n                            }\r\n                            match class {\r\n                                crate::ImageClass::Storage { format, .. } => {\r\n                                    crate::TypeInner::Vector {\r\n                                        kind: format.into(),\r\n                                        size: crate::VectorSize::Quad,\r\n                                        width: 4,\r\n                                    }\r\n                                }\r\n                                _ => {\r\n                                    return Err(FunctionError::InvalidImageStore(\r\n                                        ExpressionError::InvalidImageClass(class),\r\n                                    )\r\n                                    .with_span_handle(image, context.expressions));\r\n                                }\r\n                            }\r\n                        }\r\n                        _ => {\r\n                            return Err(FunctionError::InvalidImageStore(\r\n                                ExpressionError::ExpectedImageType(var.ty),\r\n                            )\r\n                            .with_span()\r\n                            .with_handle(var.ty, context.types)\r\n                            .with_handle(image, context.expressions))\r\n                        }\r\n                    };\r\n\r\n                    if *context.resolve_type(value, &self.valid_expression_set)? != value_ty {\r\n                        return Err(FunctionError::InvalidStoreValue(value)\r\n                            .with_span_handle(value, context.expressions));\r\n                    }\r\n                }\r\n                S::Call {\r\n                    function,\r\n                    ref arguments,\r\n                    result,\r\n                } => match self.validate_call(function, arguments, result, context) {\r\n                    Ok(callee_stages) => stages &= callee_stages,\r\n                    Err(error) => {\r\n                        return Err(error.and_then(|error| {\r\n                            FunctionError::InvalidCall { function, error }\r\n                                .with_span_static(span, \"invalid function call\")\r\n                        }))\r\n                    }\r\n                },\r\n                S::Atomic {\r\n                    pointer,\r\n                    ref fun,\r\n                    value,\r\n                    result,\r\n                } => {\r\n                    self.validate_atomic(pointer, fun, value, result, context)?;\r\n                }\r\n            }\r\n        }\r\n        Ok(BlockInfo { stages, finished })\r\n    }\r\n\r\n    #[cfg(feature = \"validate\")]\r\n    fn validate_block(\r\n        &mut self,\r\n        statements: &crate::Block,\r\n        context: &BlockContext,\r\n    ) -> Result<BlockInfo, WithSpan<FunctionError>> {\r\n        let base_expression_count = self.valid_expression_list.len();\r\n        let info = self.validate_block_impl(statements, context)?;\r\n        for handle in self.valid_expression_list.drain(base_expression_count..) {\r\n            self.valid_expression_set.remove(handle.index());\r\n        }\r\n        Ok(info)\r\n    }\r\n\r\n    #[cfg(feature = \"validate\")]\r\n    fn validate_local_var(\r\n        &self,\r\n        var: &crate::LocalVariable,\r\n        types: &UniqueArena<crate::Type>,\r\n        constants: &Arena<crate::Constant>,\r\n    ) -> Result<(), LocalVariableError> {\r\n        log::debug!(\"var {:?}\", var);\r\n        let type_info = self\r\n            .types\r\n            .get(var.ty.index())\r\n            .ok_or(LocalVariableError::InvalidType(var.ty))?;\r\n        if !type_info\r\n            .flags\r\n            .contains(super::TypeFlags::DATA | super::TypeFlags::SIZED)\r\n        {\r\n            return Err(LocalVariableError::InvalidType(var.ty));\r\n        }\r\n\r\n        if let Some(const_handle) = var.init {\r\n            match constants[const_handle].inner {\r\n                crate::ConstantInner::Scalar { width, ref value } => {\r\n                    let ty_inner = crate::TypeInner::Scalar {\r\n                        width,\r\n                        kind: value.scalar_kind(),\r\n                    };\r\n                    if types[var.ty].inner != ty_inner {\r\n                        return Err(LocalVariableError::InitializerType);\r\n                    }\r\n                }\r\n                crate::ConstantInner::Composite { ty, components: _ } => {\r\n                    if ty != var.ty {\r\n                        return Err(LocalVariableError::InitializerType);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn validate_function(\r\n        &mut self,\r\n        fun: &crate::Function,\r\n        module: &crate::Module,\r\n        mod_info: &ModuleInfo,\r\n        #[cfg_attr(not(feature = \"validate\"), allow(unused))] entry_point: bool,\r\n    ) -> Result<FunctionInfo, WithSpan<FunctionError>> {\r\n        #[cfg_attr(not(feature = \"validate\"), allow(unused_mut))]\r\n        let mut info = mod_info.process_function(fun, module, self.flags, self.capabilities)?;\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        for (var_handle, var) in fun.local_variables.iter() {\r\n            self.validate_local_var(var, &module.types, &module.constants)\r\n                .map_err(|error| {\r\n                    FunctionError::LocalVariable {\r\n                        handle: var_handle,\r\n                        name: var.name.clone().unwrap_or_default(),\r\n                        error,\r\n                    }\r\n                    .with_span_handle(var.ty, &module.types)\r\n                    .with_handle(var_handle, &fun.local_variables)\r\n                })?;\r\n        }\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        for (index, argument) in fun.arguments.iter().enumerate() {\r\n            let ty = module.types.get_handle(argument.ty).map_err(|err| {\r\n                FunctionError::from(err).with_span_handle(argument.ty, &module.types)\r\n            })?;\r\n            match ty.inner.pointer_space() {\r\n                Some(\r\n                    crate::AddressSpace::Private\r\n                    | crate::AddressSpace::Function\r\n                    | crate::AddressSpace::WorkGroup,\r\n                )\r\n                | None => {}\r\n                Some(other) => {\r\n                    return Err(FunctionError::InvalidArgumentPointerSpace {\r\n                        index,\r\n                        name: argument.name.clone().unwrap_or_default(),\r\n                        space: other,\r\n                    }\r\n                    .with_span_handle(argument.ty, &module.types))\r\n                }\r\n            }\r\n            // Check for the least informative error last.\r\n            if !self.types[argument.ty.index()]\r\n                .flags\r\n                .contains(super::TypeFlags::ARGUMENT)\r\n            {\r\n                return Err(FunctionError::InvalidArgumentType {\r\n                    index,\r\n                    name: argument.name.clone().unwrap_or_default(),\r\n                }\r\n                .with_span_handle(argument.ty, &module.types));\r\n            }\r\n\r\n            if !entry_point && argument.binding.is_some() {\r\n                return Err(FunctionError::PipelineInputRegularFunction {\r\n                    name: argument.name.clone().unwrap_or_default(),\r\n                }\r\n                .with_span_handle(argument.ty, &module.types));\r\n            }\r\n        }\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        if let Some(ref result) = fun.result {\r\n            if !self.types[result.ty.index()]\r\n                .flags\r\n                .contains(super::TypeFlags::CONSTRUCTIBLE)\r\n            {\r\n                return Err(FunctionError::NonConstructibleReturnType\r\n                    .with_span_handle(result.ty, &module.types));\r\n            }\r\n\r\n            if !entry_point && result.binding.is_some() {\r\n                return Err(FunctionError::PipelineOutputRegularFunction\r\n                    .with_span_handle(result.ty, &module.types));\r\n            }\r\n        }\r\n\r\n        self.valid_expression_set.clear();\r\n        self.valid_expression_list.clear();\r\n        for (handle, expr) in fun.expressions.iter() {\r\n            if expr.needs_pre_emit() {\r\n                self.valid_expression_set.insert(handle.index());\r\n            }\r\n            #[cfg(feature = \"validate\")]\r\n            if self.flags.contains(super::ValidationFlags::EXPRESSIONS) {\r\n                match self.validate_expression(\r\n                    handle,\r\n                    expr,\r\n                    fun,\r\n                    module,\r\n                    &info,\r\n                    &mod_info.functions,\r\n                ) {\r\n                    Ok(stages) => info.available_stages &= stages,\r\n                    Err(error) => {\r\n                        return Err(FunctionError::Expression { handle, error }\r\n                            .with_span_handle(handle, &fun.expressions))\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        if self.flags.contains(super::ValidationFlags::BLOCKS) {\r\n            let stages = self\r\n                .validate_block(\r\n                    &fun.body,\r\n                    &BlockContext::new(fun, module, &info, &mod_info.functions),\r\n                )?\r\n                .stages;\r\n            info.available_stages &= stages;\r\n        }\r\n        Ok(info)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/interface.rs",
    "content": "use super::{\r\n    analyzer::{FunctionInfo, GlobalUse},\r\n    Capabilities, Disalignment, FunctionError, ModuleInfo,\r\n};\r\nuse crate::arena::{BadHandle, Handle, UniqueArena};\r\n\r\nuse crate::span::{AddSpan as _, MapErrWithSpan as _, SpanProvider as _, WithSpan};\r\nuse bit_set::BitSet;\r\n\r\n#[cfg(feature = \"validate\")]\r\nconst MAX_WORKGROUP_SIZE: u32 = 0x4000;\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\npub enum GlobalVariableError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"Usage isn't compatible with address space {0:?}\")]\r\n    InvalidUsage(crate::AddressSpace),\r\n    #[error(\"Type isn't compatible with address space {0:?}\")]\r\n    InvalidType(crate::AddressSpace),\r\n    #[error(\"Type flags {seen:?} do not meet the required {required:?}\")]\r\n    MissingTypeFlags {\r\n        required: super::TypeFlags,\r\n        seen: super::TypeFlags,\r\n    },\r\n    #[error(\"Capability {0:?} is not supported\")]\r\n    UnsupportedCapability(Capabilities),\r\n    #[error(\"Binding decoration is missing or not applicable\")]\r\n    InvalidBinding,\r\n    #[error(\"Alignment requirements for address space {0:?} are not met by {1:?}\")]\r\n    Alignment(\r\n        crate::AddressSpace,\r\n        Handle<crate::Type>,\r\n        #[source] Disalignment,\r\n    ),\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\npub enum VaryingError {\r\n    #[error(\"The type {0:?} does not match the varying\")]\r\n    InvalidType(Handle<crate::Type>),\r\n    #[error(\"The type {0:?} cannot be used for user-defined entry point inputs or outputs\")]\r\n    NotIOShareableType(Handle<crate::Type>),\r\n    #[error(\"Interpolation is not valid\")]\r\n    InvalidInterpolation,\r\n    #[error(\"Interpolation must be specified on vertex shader outputs and fragment shader inputs\")]\r\n    MissingInterpolation,\r\n    #[error(\"Built-in {0:?} is not available at this stage\")]\r\n    InvalidBuiltInStage(crate::BuiltIn),\r\n    #[error(\"Built-in type for {0:?} is invalid\")]\r\n    InvalidBuiltInType(crate::BuiltIn),\r\n    #[error(\"Entry point arguments and return values must all have bindings\")]\r\n    MissingBinding,\r\n    #[error(\"Struct member {0} is missing a binding\")]\r\n    MemberMissingBinding(u32),\r\n    #[error(\"Multiple bindings at location {location} are present\")]\r\n    BindingCollision { location: u32 },\r\n    #[error(\"Built-in {0:?} is present more than once\")]\r\n    DuplicateBuiltIn(crate::BuiltIn),\r\n    #[error(\"Capability {0:?} is not supported\")]\r\n    UnsupportedCapability(Capabilities),\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\npub enum EntryPointError {\r\n    #[error(\"Multiple conflicting entry points\")]\r\n    Conflict,\r\n    #[error(\"Early depth test is not applicable\")]\r\n    UnexpectedEarlyDepthTest,\r\n    #[error(\"Workgroup size is not applicable\")]\r\n    UnexpectedWorkgroupSize,\r\n    #[error(\"Workgroup size is out of range\")]\r\n    OutOfRangeWorkgroupSize,\r\n    #[error(\"Uses operations forbidden at this stage\")]\r\n    ForbiddenStageOperations,\r\n    #[error(\"Global variable {0:?} is used incorrectly as {1:?}\")]\r\n    InvalidGlobalUsage(Handle<crate::GlobalVariable>, GlobalUse),\r\n    #[error(\"Bindings for {0:?} conflict with other resource\")]\r\n    BindingCollision(Handle<crate::GlobalVariable>),\r\n    #[error(\"Argument {0} varying error\")]\r\n    Argument(u32, #[source] VaryingError),\r\n    #[error(transparent)]\r\n    Result(#[from] VaryingError),\r\n    #[error(\"Location {location} interpolation of an integer has to be flat\")]\r\n    InvalidIntegerInterpolation { location: u32 },\r\n    #[error(transparent)]\r\n    Function(#[from] FunctionError),\r\n}\r\n\r\n#[cfg(feature = \"validate\")]\r\nfn storage_usage(access: crate::StorageAccess) -> GlobalUse {\r\n    let mut storage_usage = GlobalUse::QUERY;\r\n    if access.contains(crate::StorageAccess::LOAD) {\r\n        storage_usage |= GlobalUse::READ;\r\n    }\r\n    if access.contains(crate::StorageAccess::STORE) {\r\n        storage_usage |= GlobalUse::WRITE;\r\n    }\r\n    storage_usage\r\n}\r\n\r\nstruct VaryingContext<'a> {\r\n    stage: crate::ShaderStage,\r\n    output: bool,\r\n    types: &'a UniqueArena<crate::Type>,\r\n    type_info: &'a Vec<super::r#type::TypeInfo>,\r\n    location_mask: &'a mut BitSet,\r\n    built_ins: &'a mut crate::FastHashSet<crate::BuiltIn>,\r\n    capabilities: Capabilities,\r\n}\r\n\r\nimpl VaryingContext<'_> {\r\n    fn validate_impl(\r\n        &mut self,\r\n        ty: Handle<crate::Type>,\r\n        binding: &crate::Binding,\r\n    ) -> Result<(), VaryingError> {\r\n        use crate::{\r\n            BuiltIn as Bi, ScalarKind as Sk, ShaderStage as St, TypeInner as Ti, VectorSize as Vs,\r\n        };\r\n\r\n        let ty_inner = &self.types[ty].inner;\r\n        match *binding {\r\n            crate::Binding::BuiltIn(built_in) => {\r\n                // Ignore the `invariant` field for the sake of duplicate checks,\r\n                // but use the original in error messages.\r\n                let canonical = if let crate::BuiltIn::Position { .. } = built_in {\r\n                    crate::BuiltIn::Position { invariant: false }\r\n                } else {\r\n                    built_in\r\n                };\r\n\r\n                if self.built_ins.contains(&canonical) {\r\n                    return Err(VaryingError::DuplicateBuiltIn(built_in));\r\n                }\r\n                self.built_ins.insert(canonical);\r\n\r\n                let required = match built_in {\r\n                    Bi::ClipDistance => Capabilities::CLIP_DISTANCE,\r\n                    Bi::CullDistance => Capabilities::CULL_DISTANCE,\r\n                    Bi::PrimitiveIndex => Capabilities::PRIMITIVE_INDEX,\r\n                    _ => Capabilities::empty(),\r\n                };\r\n                if !self.capabilities.contains(required) {\r\n                    return Err(VaryingError::UnsupportedCapability(required));\r\n                }\r\n\r\n                let width = 4;\r\n                let (visible, type_good) = match built_in {\r\n                    Bi::BaseInstance | Bi::BaseVertex | Bi::InstanceIndex | Bi::VertexIndex => (\r\n                        self.stage == St::Vertex && !self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Uint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::ClipDistance | Bi::CullDistance => (\r\n                        self.stage == St::Vertex && self.output,\r\n                        match *ty_inner {\r\n                            Ti::Array { base, .. } => {\r\n                                self.types[base].inner\r\n                                    == Ti::Scalar {\r\n                                        kind: Sk::Float,\r\n                                        width,\r\n                                    }\r\n                            }\r\n                            _ => false,\r\n                        },\r\n                    ),\r\n                    Bi::PointSize => (\r\n                        self.stage == St::Vertex && self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::Position { .. } => (\r\n                        match self.stage {\r\n                            St::Vertex => self.output,\r\n                            St::Fragment => !self.output,\r\n                            St::Compute => false,\r\n                        },\r\n                        *ty_inner\r\n                            == Ti::Vector {\r\n                                size: Vs::Quad,\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::ViewIndex => (\r\n                        match self.stage {\r\n                            St::Vertex | St::Fragment => !self.output,\r\n                            St::Compute => false,\r\n                        },\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Sint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::FragDepth => (\r\n                        self.stage == St::Fragment && self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Float,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::FrontFacing => (\r\n                        self.stage == St::Fragment && !self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Bool,\r\n                                width: crate::BOOL_WIDTH,\r\n                            },\r\n                    ),\r\n                    Bi::PrimitiveIndex => (\r\n                        self.stage == St::Fragment && !self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Uint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::SampleIndex => (\r\n                        self.stage == St::Fragment && !self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Uint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::SampleMask => (\r\n                        self.stage == St::Fragment,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Uint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::LocalInvocationIndex => (\r\n                        self.stage == St::Compute && !self.output,\r\n                        *ty_inner\r\n                            == Ti::Scalar {\r\n                                kind: Sk::Uint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                    Bi::GlobalInvocationId\r\n                    | Bi::LocalInvocationId\r\n                    | Bi::WorkGroupId\r\n                    | Bi::WorkGroupSize\r\n                    | Bi::NumWorkGroups => (\r\n                        self.stage == St::Compute && !self.output,\r\n                        *ty_inner\r\n                            == Ti::Vector {\r\n                                size: Vs::Tri,\r\n                                kind: Sk::Uint,\r\n                                width,\r\n                            },\r\n                    ),\r\n                };\r\n\r\n                if !visible {\r\n                    return Err(VaryingError::InvalidBuiltInStage(built_in));\r\n                }\r\n                if !type_good {\r\n                    log::warn!(\"Wrong builtin type: {:?}\", ty_inner);\r\n                    return Err(VaryingError::InvalidBuiltInType(built_in));\r\n                }\r\n            }\r\n            crate::Binding::Location {\r\n                location,\r\n                interpolation,\r\n                sampling,\r\n            } => {\r\n                // Only IO-shareable types may be stored in locations.\r\n                if !self.type_info[ty.index()]\r\n                    .flags\r\n                    .contains(super::TypeFlags::IO_SHAREABLE)\r\n                {\r\n                    return Err(VaryingError::NotIOShareableType(ty));\r\n                }\r\n                if !self.location_mask.insert(location as usize) {\r\n                    return Err(VaryingError::BindingCollision { location });\r\n                }\r\n\r\n                let needs_interpolation = match self.stage {\r\n                    crate::ShaderStage::Vertex => self.output,\r\n                    crate::ShaderStage::Fragment => !self.output,\r\n                    _ => false,\r\n                };\r\n\r\n                // It doesn't make sense to specify a sampling when `interpolation` is `Flat`, but\r\n                // SPIR-V and GLSL both explicitly tolerate such combinations of decorators /\r\n                // qualifiers, so we won't complain about that here.\r\n                let _ = sampling;\r\n\r\n                match ty_inner.scalar_kind() {\r\n                    Some(crate::ScalarKind::Float) => {\r\n                        if needs_interpolation && interpolation.is_none() {\r\n                            return Err(VaryingError::MissingInterpolation);\r\n                        }\r\n                    }\r\n                    Some(_) => {\r\n                        if needs_interpolation && interpolation != Some(crate::Interpolation::Flat)\r\n                        {\r\n                            return Err(VaryingError::InvalidInterpolation);\r\n                        }\r\n                    }\r\n                    None => return Err(VaryingError::InvalidType(ty)),\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    fn validate(\r\n        &mut self,\r\n        ty: Handle<crate::Type>,\r\n        binding: Option<&crate::Binding>,\r\n    ) -> Result<(), WithSpan<VaryingError>> {\r\n        let span_context = self.types.get_span_context(ty);\r\n        match binding {\r\n            Some(binding) => self\r\n                .validate_impl(ty, binding)\r\n                .map_err(|e| e.with_span_context(span_context)),\r\n            None => {\r\n                match self.types[ty].inner {\r\n                    //TODO: check the member types\r\n                    crate::TypeInner::Struct { ref members, .. } => {\r\n                        for (index, member) in members.iter().enumerate() {\r\n                            let span_context = self.types.get_span_context(ty);\r\n                            match member.binding {\r\n                                None => {\r\n                                    return Err(VaryingError::MemberMissingBinding(index as u32)\r\n                                        .with_span_context(span_context))\r\n                                }\r\n                                // TODO: shouldn't this be validate?\r\n                                Some(ref binding) => self\r\n                                    .validate_impl(member.ty, binding)\r\n                                    .map_err(|e| e.with_span_context(span_context))?,\r\n                            }\r\n                        }\r\n                    }\r\n                    _ => return Err(VaryingError::MissingBinding.with_span()),\r\n                }\r\n                Ok(())\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::Validator {\r\n    #[cfg(feature = \"validate\")]\r\n    pub(super) fn validate_global_var(\r\n        &self,\r\n        var: &crate::GlobalVariable,\r\n        types: &UniqueArena<crate::Type>,\r\n    ) -> Result<(), GlobalVariableError> {\r\n        use super::TypeFlags;\r\n\r\n        log::debug!(\"var {:?}\", var);\r\n        let type_info = self.types.get(var.ty.index()).ok_or_else(|| BadHandle {\r\n            kind: \"type\",\r\n            index: var.ty.index(),\r\n        })?;\r\n\r\n        let (required_type_flags, is_resource) = match var.space {\r\n            crate::AddressSpace::Function => {\r\n                return Err(GlobalVariableError::InvalidUsage(var.space))\r\n            }\r\n            crate::AddressSpace::Storage { .. } => {\r\n                if let Err((ty_handle, disalignment)) = type_info.storage_layout {\r\n                    if self.flags.contains(super::ValidationFlags::STRUCT_LAYOUTS) {\r\n                        return Err(GlobalVariableError::Alignment(\r\n                            var.space,\r\n                            ty_handle,\r\n                            disalignment,\r\n                        ));\r\n                    }\r\n                }\r\n                (TypeFlags::DATA | TypeFlags::HOST_SHAREABLE, true)\r\n            }\r\n            crate::AddressSpace::Uniform => {\r\n                if let Err((ty_handle, disalignment)) = type_info.uniform_layout {\r\n                    if self.flags.contains(super::ValidationFlags::STRUCT_LAYOUTS) {\r\n                        return Err(GlobalVariableError::Alignment(\r\n                            var.space,\r\n                            ty_handle,\r\n                            disalignment,\r\n                        ));\r\n                    }\r\n                }\r\n                (\r\n                    TypeFlags::DATA\r\n                        | TypeFlags::COPY\r\n                        | TypeFlags::SIZED\r\n                        | TypeFlags::HOST_SHAREABLE,\r\n                    true,\r\n                )\r\n            }\r\n            crate::AddressSpace::Handle => {\r\n                match types[var.ty].inner {\r\n                    crate::TypeInner::Image { .. }\r\n                    | crate::TypeInner::Sampler { .. }\r\n                    | crate::TypeInner::BindingArray { .. } => {}\r\n                    _ => {\r\n                        return Err(GlobalVariableError::InvalidType(var.space));\r\n                    }\r\n                };\r\n                (TypeFlags::empty(), true)\r\n            }\r\n            crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => {\r\n                (TypeFlags::DATA | TypeFlags::SIZED, false)\r\n            }\r\n            crate::AddressSpace::PushConstant => {\r\n                if !self.capabilities.contains(Capabilities::PUSH_CONSTANT) {\r\n                    return Err(GlobalVariableError::UnsupportedCapability(\r\n                        Capabilities::PUSH_CONSTANT,\r\n                    ));\r\n                }\r\n                (\r\n                    TypeFlags::DATA\r\n                        | TypeFlags::COPY\r\n                        | TypeFlags::HOST_SHAREABLE\r\n                        | TypeFlags::SIZED,\r\n                    false,\r\n                )\r\n            }\r\n        };\r\n\r\n        if !type_info.flags.contains(required_type_flags) {\r\n            return Err(GlobalVariableError::MissingTypeFlags {\r\n                seen: type_info.flags,\r\n                required: required_type_flags,\r\n            });\r\n        }\r\n\r\n        if is_resource != var.binding.is_some() {\r\n            return Err(GlobalVariableError::InvalidBinding);\r\n        }\r\n\r\n        Ok(())\r\n    }\r\n\r\n    pub(super) fn validate_entry_point(\r\n        &mut self,\r\n        ep: &crate::EntryPoint,\r\n        module: &crate::Module,\r\n        mod_info: &ModuleInfo,\r\n    ) -> Result<FunctionInfo, WithSpan<EntryPointError>> {\r\n        #[cfg(feature = \"validate\")]\r\n        if ep.early_depth_test.is_some() && ep.stage != crate::ShaderStage::Fragment {\r\n            return Err(EntryPointError::UnexpectedEarlyDepthTest.with_span());\r\n        }\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        if ep.stage == crate::ShaderStage::Compute {\r\n            if ep\r\n                .workgroup_size\r\n                .iter()\r\n                .any(|&s| s == 0 || s > MAX_WORKGROUP_SIZE)\r\n            {\r\n                return Err(EntryPointError::OutOfRangeWorkgroupSize.with_span());\r\n            }\r\n        } else if ep.workgroup_size != [0; 3] {\r\n            return Err(EntryPointError::UnexpectedWorkgroupSize.with_span());\r\n        }\r\n\r\n        let info = self\r\n            .validate_function(&ep.function, module, mod_info, true)\r\n            .map_err(WithSpan::into_other)?;\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        {\r\n            use super::ShaderStages;\r\n\r\n            let stage_bit = match ep.stage {\r\n                crate::ShaderStage::Vertex => ShaderStages::VERTEX,\r\n                crate::ShaderStage::Fragment => ShaderStages::FRAGMENT,\r\n                crate::ShaderStage::Compute => ShaderStages::COMPUTE,\r\n            };\r\n\r\n            if !info.available_stages.contains(stage_bit) {\r\n                return Err(EntryPointError::ForbiddenStageOperations.with_span());\r\n            }\r\n        }\r\n\r\n        self.location_mask.clear();\r\n        let mut argument_built_ins = crate::FastHashSet::default();\r\n        // TODO: add span info to function arguments\r\n        for (index, fa) in ep.function.arguments.iter().enumerate() {\r\n            let mut ctx = VaryingContext {\r\n                stage: ep.stage,\r\n                output: false,\r\n                types: &module.types,\r\n                type_info: &self.types,\r\n                location_mask: &mut self.location_mask,\r\n                built_ins: &mut argument_built_ins,\r\n                capabilities: self.capabilities,\r\n            };\r\n            ctx.validate(fa.ty, fa.binding.as_ref())\r\n                .map_err_inner(|e| EntryPointError::Argument(index as u32, e).with_span())?;\r\n        }\r\n\r\n        self.location_mask.clear();\r\n        if let Some(ref fr) = ep.function.result {\r\n            let mut result_built_ins = crate::FastHashSet::default();\r\n            let mut ctx = VaryingContext {\r\n                stage: ep.stage,\r\n                output: true,\r\n                types: &module.types,\r\n                type_info: &self.types,\r\n                location_mask: &mut self.location_mask,\r\n                built_ins: &mut result_built_ins,\r\n                capabilities: self.capabilities,\r\n            };\r\n            ctx.validate(fr.ty, fr.binding.as_ref())\r\n                .map_err_inner(|e| EntryPointError::Result(e).with_span())?;\r\n        }\r\n\r\n        for bg in self.bind_group_masks.iter_mut() {\r\n            bg.clear();\r\n        }\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        for (var_handle, var) in module.global_variables.iter() {\r\n            let usage = info[var_handle];\r\n            if usage.is_empty() {\r\n                continue;\r\n            }\r\n\r\n            let allowed_usage = match var.space {\r\n                crate::AddressSpace::Function => unreachable!(),\r\n                crate::AddressSpace::Uniform => GlobalUse::READ | GlobalUse::QUERY,\r\n                crate::AddressSpace::Storage { access } => storage_usage(access),\r\n                crate::AddressSpace::Handle => match module.types[var.ty].inner {\r\n                    crate::TypeInner::BindingArray { base, .. } => match module.types[base].inner {\r\n                        crate::TypeInner::Image {\r\n                            class: crate::ImageClass::Storage { access, .. },\r\n                            ..\r\n                        } => storage_usage(access),\r\n                        _ => GlobalUse::READ | GlobalUse::QUERY,\r\n                    },\r\n                    crate::TypeInner::Image {\r\n                        class: crate::ImageClass::Storage { access, .. },\r\n                        ..\r\n                    } => storage_usage(access),\r\n                    _ => GlobalUse::READ | GlobalUse::QUERY,\r\n                },\r\n                crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => GlobalUse::all(),\r\n                crate::AddressSpace::PushConstant => GlobalUse::READ,\r\n            };\r\n            if !allowed_usage.contains(usage) {\r\n                log::warn!(\"\\tUsage error for: {:?}\", var);\r\n                log::warn!(\r\n                    \"\\tAllowed usage: {:?}, requested: {:?}\",\r\n                    allowed_usage,\r\n                    usage\r\n                );\r\n                return Err(EntryPointError::InvalidGlobalUsage(var_handle, usage)\r\n                    .with_span_handle(var_handle, &module.global_variables));\r\n            }\r\n\r\n            if let Some(ref bind) = var.binding {\r\n                while self.bind_group_masks.len() <= bind.group as usize {\r\n                    self.bind_group_masks.push(BitSet::new());\r\n                }\r\n                if !self.bind_group_masks[bind.group as usize].insert(bind.binding as usize) {\r\n                    return Err(EntryPointError::BindingCollision(var_handle)\r\n                        .with_span_handle(var_handle, &module.global_variables));\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(info)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/mod.rs",
    "content": "/*!\r\nShader validator.\r\n*/\r\n\r\nmod analyzer;\r\nmod compose;\r\nmod expression;\r\nmod function;\r\nmod interface;\r\nmod r#type;\r\n\r\n#[cfg(feature = \"validate\")]\r\nuse crate::arena::{Arena, UniqueArena};\r\n\r\nuse crate::{\r\n    arena::{BadHandle, Handle},\r\n    proc::{LayoutError, Layouter},\r\n    FastHashSet,\r\n};\r\nuse bit_set::BitSet;\r\nuse std::ops;\r\n\r\n//TODO: analyze the model at the same time as we validate it,\r\n// merge the corresponding matches over expressions and statements.\r\n\r\nuse crate::span::{AddSpan as _, WithSpan};\r\npub use analyzer::{ExpressionInfo, FunctionInfo, GlobalUse, Uniformity, UniformityRequirements};\r\npub use compose::ComposeError;\r\npub use expression::ExpressionError;\r\npub use function::{CallError, FunctionError, LocalVariableError};\r\npub use interface::{EntryPointError, GlobalVariableError, VaryingError};\r\npub use r#type::{Disalignment, TypeError, TypeFlags};\r\n\r\nbitflags::bitflags! {\r\n    /// Validation flags.\r\n    ///\r\n    /// If you are working with trusted shaders, then you may be able\r\n    /// to save some time by skipping validation.\r\n    ///\r\n    /// If you do not perform full validation, invalid shaders may\r\n    /// cause Naga to panic. If you do perform full validation and\r\n    /// [`Validator::validate`] returns `Ok`, then Naga promises that\r\n    /// code generation will either succeed or return an error; it\r\n    /// should never panic.\r\n    ///\r\n    /// The default value for `ValidationFlags` is\r\n    /// `ValidationFlags::all()`. If Naga's `\"validate\"` feature is\r\n    /// enabled, this requests full validation; otherwise, this\r\n    /// requests no validation. (The `\"validate\"` feature is disabled\r\n    /// by default.)\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct ValidationFlags: u8 {\r\n        /// Expressions.\r\n        #[cfg(feature = \"validate\")]\r\n        const EXPRESSIONS = 0x1;\r\n        /// Statements and blocks of them.\r\n        #[cfg(feature = \"validate\")]\r\n        const BLOCKS = 0x2;\r\n        /// Uniformity of control flow for operations that require it.\r\n        #[cfg(feature = \"validate\")]\r\n        const CONTROL_FLOW_UNIFORMITY = 0x4;\r\n        /// Host-shareable structure layouts.\r\n        #[cfg(feature = \"validate\")]\r\n        const STRUCT_LAYOUTS = 0x8;\r\n        /// Constants.\r\n        #[cfg(feature = \"validate\")]\r\n        const CONSTANTS = 0x10;\r\n    }\r\n}\r\n\r\nimpl Default for ValidationFlags {\r\n    fn default() -> Self {\r\n        Self::all()\r\n    }\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Allowed IR capabilities.\r\n    #[must_use]\r\n    #[derive(Default)]\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct Capabilities: u8 {\r\n        /// Support for [`AddressSpace:PushConstant`].\r\n        const PUSH_CONSTANT = 0x1;\r\n        /// Float values with width = 8.\r\n        const FLOAT64 = 0x2;\r\n        /// Support for [`Builtin:PrimitiveIndex`].\r\n        const PRIMITIVE_INDEX = 0x4;\r\n        /// Support for non-uniform indexing of sampled textures and storage buffer arrays.\r\n        const SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING = 0x8;\r\n        /// Support for non-uniform indexing of uniform buffers and storage texture arrays.\r\n        const UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING = 0x10;\r\n        /// Support for non-uniform indexing of samplers.\r\n        const SAMPLER_NON_UNIFORM_INDEXING = 0x20;\r\n        /// Support for [`Builtin::ClipDistance`].\r\n        const CLIP_DISTANCE = 0x40;\r\n        /// Support for [`Builtin::CullDistance`].\r\n        const CULL_DISTANCE = 0x80;\r\n    }\r\n}\r\n\r\nbitflags::bitflags! {\r\n    /// Validation flags.\r\n    #[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n    #[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\n    pub struct ShaderStages: u8 {\r\n        const VERTEX = 0x1;\r\n        const FRAGMENT = 0x2;\r\n        const COMPUTE = 0x4;\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\n#[cfg_attr(feature = \"serialize\", derive(serde::Serialize))]\r\n#[cfg_attr(feature = \"deserialize\", derive(serde::Deserialize))]\r\npub struct ModuleInfo {\r\n    functions: Vec<FunctionInfo>,\r\n    entry_points: Vec<FunctionInfo>,\r\n}\r\n\r\nimpl ops::Index<Handle<crate::Function>> for ModuleInfo {\r\n    type Output = FunctionInfo;\r\n    fn index(&self, handle: Handle<crate::Function>) -> &Self::Output {\r\n        &self.functions[handle.index()]\r\n    }\r\n}\r\n\r\n#[derive(Debug)]\r\npub struct Validator {\r\n    flags: ValidationFlags,\r\n    capabilities: Capabilities,\r\n    types: Vec<r#type::TypeInfo>,\r\n    layouter: Layouter,\r\n    location_mask: BitSet,\r\n    bind_group_masks: Vec<BitSet>,\r\n    #[allow(dead_code)]\r\n    select_cases: FastHashSet<i32>,\r\n    valid_expression_list: Vec<Handle<crate::Expression>>,\r\n    valid_expression_set: BitSet,\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\npub enum ConstantError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"The type doesn't match the constant\")]\r\n    InvalidType,\r\n    #[error(\"The component handle {0:?} can not be resolved\")]\r\n    UnresolvedComponent(Handle<crate::Constant>),\r\n    #[error(\"The array size handle {0:?} can not be resolved\")]\r\n    UnresolvedSize(Handle<crate::Constant>),\r\n    #[error(transparent)]\r\n    Compose(#[from] ComposeError),\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\npub enum ValidationError {\r\n    #[error(transparent)]\r\n    Layouter(#[from] LayoutError),\r\n    #[error(\"Type {handle:?} '{name}' is invalid\")]\r\n    Type {\r\n        handle: Handle<crate::Type>,\r\n        name: String,\r\n        #[source]\r\n        error: TypeError,\r\n    },\r\n    #[error(\"Constant {handle:?} '{name}' is invalid\")]\r\n    Constant {\r\n        handle: Handle<crate::Constant>,\r\n        name: String,\r\n        #[source]\r\n        error: ConstantError,\r\n    },\r\n    #[error(\"Global variable {handle:?} '{name}' is invalid\")]\r\n    GlobalVariable {\r\n        handle: Handle<crate::GlobalVariable>,\r\n        name: String,\r\n        #[source]\r\n        error: GlobalVariableError,\r\n    },\r\n    #[error(\"Function {handle:?} '{name}' is invalid\")]\r\n    Function {\r\n        handle: Handle<crate::Function>,\r\n        name: String,\r\n        #[source]\r\n        error: FunctionError,\r\n    },\r\n    #[error(\"Entry point {name} at {stage:?} is invalid\")]\r\n    EntryPoint {\r\n        stage: crate::ShaderStage,\r\n        name: String,\r\n        #[source]\r\n        error: EntryPointError,\r\n    },\r\n    #[error(\"Module is corrupted\")]\r\n    Corrupted,\r\n}\r\n\r\nimpl crate::TypeInner {\r\n    #[cfg(feature = \"validate\")]\r\n    const fn is_sized(&self) -> bool {\r\n        match *self {\r\n            Self::Scalar { .. }\r\n            | Self::Vector { .. }\r\n            | Self::Matrix { .. }\r\n            | Self::Array {\r\n                size: crate::ArraySize::Constant(_),\r\n                ..\r\n            }\r\n            | Self::Atomic { .. }\r\n            | Self::Pointer { .. }\r\n            | Self::ValuePointer { .. }\r\n            | Self::Struct { .. } => true,\r\n            Self::Array { .. }\r\n            | Self::Image { .. }\r\n            | Self::Sampler { .. }\r\n            | Self::BindingArray { .. } => false,\r\n        }\r\n    }\r\n\r\n    /// Return the `ImageDimension` for which `self` is an appropriate coordinate.\r\n    #[cfg(feature = \"validate\")]\r\n    const fn image_storage_coordinates(&self) -> Option<crate::ImageDimension> {\r\n        match *self {\r\n            Self::Scalar {\r\n                kind: crate::ScalarKind::Sint,\r\n                ..\r\n            } => Some(crate::ImageDimension::D1),\r\n            Self::Vector {\r\n                size: crate::VectorSize::Bi,\r\n                kind: crate::ScalarKind::Sint,\r\n                ..\r\n            } => Some(crate::ImageDimension::D2),\r\n            Self::Vector {\r\n                size: crate::VectorSize::Tri,\r\n                kind: crate::ScalarKind::Sint,\r\n                ..\r\n            } => Some(crate::ImageDimension::D3),\r\n            _ => None,\r\n        }\r\n    }\r\n}\r\n\r\nimpl Validator {\r\n    /// Construct a new validator instance.\r\n    pub fn new(flags: ValidationFlags, capabilities: Capabilities) -> Self {\r\n        Validator {\r\n            flags,\r\n            capabilities,\r\n            types: Vec::new(),\r\n            layouter: Layouter::default(),\r\n            location_mask: BitSet::new(),\r\n            bind_group_masks: Vec::new(),\r\n            select_cases: FastHashSet::default(),\r\n            valid_expression_list: Vec::new(),\r\n            valid_expression_set: BitSet::new(),\r\n        }\r\n    }\r\n\r\n    /// Reset the validator internals\r\n    pub fn reset(&mut self) {\r\n        self.types.clear();\r\n        self.layouter.clear();\r\n        self.location_mask.clear();\r\n        self.bind_group_masks.clear();\r\n        self.select_cases.clear();\r\n        self.valid_expression_list.clear();\r\n        self.valid_expression_set.clear();\r\n    }\r\n\r\n    #[cfg(feature = \"validate\")]\r\n    fn validate_constant(\r\n        &self,\r\n        handle: Handle<crate::Constant>,\r\n        constants: &Arena<crate::Constant>,\r\n        types: &UniqueArena<crate::Type>,\r\n    ) -> Result<(), ConstantError> {\r\n        let con = &constants[handle];\r\n        match con.inner {\r\n            crate::ConstantInner::Scalar { width, ref value } => {\r\n                if !self.check_width(value.scalar_kind(), width) {\r\n                    return Err(ConstantError::InvalidType);\r\n                }\r\n            }\r\n            crate::ConstantInner::Composite { ty, ref components } => {\r\n                match types.get_handle(ty)?.inner {\r\n                    crate::TypeInner::Array {\r\n                        size: crate::ArraySize::Constant(size_handle),\r\n                        ..\r\n                    } if handle <= size_handle => {\r\n                        return Err(ConstantError::UnresolvedSize(size_handle));\r\n                    }\r\n                    _ => {}\r\n                }\r\n                if let Some(&comp) = components.iter().find(|&&comp| handle <= comp) {\r\n                    return Err(ConstantError::UnresolvedComponent(comp));\r\n                }\r\n                compose::validate_compose(\r\n                    ty,\r\n                    constants,\r\n                    types,\r\n                    components\r\n                        .iter()\r\n                        .map(|&component| constants[component].inner.resolve_type()),\r\n                )?;\r\n            }\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Check the given module to be valid.\r\n    pub fn validate(\r\n        &mut self,\r\n        module: &crate::Module,\r\n    ) -> Result<ModuleInfo, WithSpan<ValidationError>> {\r\n        self.reset();\r\n        self.reset_types(module.types.len());\r\n\r\n        self.layouter\r\n            .update(&module.types, &module.constants)\r\n            .map_err(|e| {\r\n                let handle = e.ty;\r\n                ValidationError::from(e).with_span_handle(handle, &module.types)\r\n            })?;\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        if self.flags.contains(ValidationFlags::CONSTANTS) {\r\n            for (handle, constant) in module.constants.iter() {\r\n                self.validate_constant(handle, &module.constants, &module.types)\r\n                    .map_err(|error| {\r\n                        ValidationError::Constant {\r\n                            handle,\r\n                            name: constant.name.clone().unwrap_or_default(),\r\n                            error,\r\n                        }\r\n                        .with_span_handle(handle, &module.constants)\r\n                    })?\r\n            }\r\n        }\r\n\r\n        for (handle, ty) in module.types.iter() {\r\n            let ty_info = self\r\n                .validate_type(handle, &module.types, &module.constants)\r\n                .map_err(|error| {\r\n                    ValidationError::Type {\r\n                        handle,\r\n                        name: ty.name.clone().unwrap_or_default(),\r\n                        error,\r\n                    }\r\n                    .with_span_handle(handle, &module.types)\r\n                })?;\r\n            self.types[handle.index()] = ty_info;\r\n        }\r\n\r\n        #[cfg(feature = \"validate\")]\r\n        for (var_handle, var) in module.global_variables.iter() {\r\n            self.validate_global_var(var, &module.types)\r\n                .map_err(|error| {\r\n                    ValidationError::GlobalVariable {\r\n                        handle: var_handle,\r\n                        name: var.name.clone().unwrap_or_default(),\r\n                        error,\r\n                    }\r\n                    .with_span_handle(var_handle, &module.global_variables)\r\n                })?;\r\n        }\r\n\r\n        let mut mod_info = ModuleInfo {\r\n            functions: Vec::with_capacity(module.functions.len()),\r\n            entry_points: Vec::with_capacity(module.entry_points.len()),\r\n        };\r\n\r\n        for (handle, fun) in module.functions.iter() {\r\n            match self.validate_function(fun, module, &mod_info, false) {\r\n                Ok(info) => mod_info.functions.push(info),\r\n                Err(error) => {\r\n                    return Err(error.and_then(|error| {\r\n                        ValidationError::Function {\r\n                            handle,\r\n                            name: fun.name.clone().unwrap_or_default(),\r\n                            error,\r\n                        }\r\n                        .with_span_handle(handle, &module.functions)\r\n                    }))\r\n                }\r\n            }\r\n        }\r\n\r\n        let mut ep_map = FastHashSet::default();\r\n        for ep in module.entry_points.iter() {\r\n            if !ep_map.insert((ep.stage, &ep.name)) {\r\n                return Err(ValidationError::EntryPoint {\r\n                    stage: ep.stage,\r\n                    name: ep.name.clone(),\r\n                    error: EntryPointError::Conflict,\r\n                }\r\n                .with_span()); // TODO: keep some EP span information?\r\n            }\r\n\r\n            match self.validate_entry_point(ep, module, &mod_info) {\r\n                Ok(info) => mod_info.entry_points.push(info),\r\n                Err(error) => {\r\n                    return Err(error.and_then(|inner| {\r\n                        ValidationError::EntryPoint {\r\n                            stage: ep.stage,\r\n                            name: ep.name.clone(),\r\n                            error: inner,\r\n                        }\r\n                        .with_span()\r\n                    }))\r\n                }\r\n            }\r\n        }\r\n\r\n        Ok(mod_info)\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/src/valid/type.rs",
    "content": "use super::Capabilities;\r\nuse crate::{\r\n    arena::{Arena, BadHandle, Handle, UniqueArena},\r\n    proc::Alignment,\r\n};\r\n\r\nbitflags::bitflags! {\r\n    /// Flags associated with [`Type`]s by [`Validator`].\r\n    ///\r\n    /// [`Type`]: crate::Type\r\n    /// [`Validator`]: crate::valid::Validator\r\n    #[repr(transparent)]\r\n    pub struct TypeFlags: u8 {\r\n        /// Can be used for data variables.\r\n        ///\r\n        /// This flag is required on types of local variables, function\r\n        /// arguments, array elements, and struct members.\r\n        ///\r\n        /// This includes all types except `Image`, `Sampler`,\r\n        /// and some `Pointer` types.\r\n        const DATA = 0x1;\r\n\r\n        /// The data type has a size known by pipeline creation time.\r\n        ///\r\n        /// Unsized types are quite restricted. The only unsized types permitted\r\n        /// by Naga, other than the non-[`DATA`] types like [`Image`] and\r\n        /// [`Sampler`], are dynamically-sized [`Array`s], and [`Struct`s] whose\r\n        /// last members are such arrays. See the documentation for those types\r\n        /// for details.\r\n        ///\r\n        /// [`DATA`]: TypeFlags::DATA\r\n        /// [`Image`]: crate::Type::Image\r\n        /// [`Sampler`]: crate::Type::Sampler\r\n        /// [`Array`]: crate::Type::Array\r\n        /// [`Struct`]: crate::Type::struct\r\n        const SIZED = 0x2;\r\n\r\n        /// The data can be copied around.\r\n        const COPY = 0x4;\r\n\r\n        /// Can be be used for user-defined IO between pipeline stages.\r\n        ///\r\n        /// This covers anything that can be in [`Location`] binding:\r\n        /// non-bool scalars and vectors, matrices, and structs and\r\n        /// arrays containing only interface types.\r\n        const IO_SHAREABLE = 0x8;\r\n\r\n        /// Can be used for host-shareable structures.\r\n        const HOST_SHAREABLE = 0x10;\r\n\r\n        /// This type can be passed as a function argument.\r\n        const ARGUMENT = 0x40;\r\n\r\n        /// A WGSL [constructible] type.\r\n        ///\r\n        /// The constructible types are scalars, vectors, matrices, fixed-size\r\n        /// arrays of constructible types, and structs whose members are all\r\n        /// constructible.\r\n        ///\r\n        /// [constructible]: https://gpuweb.github.io/gpuweb/wgsl/#constructible\r\n        const CONSTRUCTIBLE = 0x80;\r\n    }\r\n}\r\n\r\n#[derive(Clone, Copy, Debug, thiserror::Error)]\r\npub enum Disalignment {\r\n    #[error(\"The array stride {stride} is not a multiple of the required alignment {alignment}\")]\r\n    ArrayStride { stride: u32, alignment: Alignment },\r\n    #[error(\"The struct span {span}, is not a multiple of the required alignment {alignment}\")]\r\n    StructSpan { span: u32, alignment: Alignment },\r\n    #[error(\"The struct member[{index}] offset {offset} is not a multiple of the required alignment {alignment}\")]\r\n    MemberOffset {\r\n        index: u32,\r\n        offset: u32,\r\n        alignment: Alignment,\r\n    },\r\n    #[error(\"The struct member[{index}] offset {offset} must be at least {expected}\")]\r\n    MemberOffsetAfterStruct {\r\n        index: u32,\r\n        offset: u32,\r\n        expected: u32,\r\n    },\r\n    #[error(\"The struct member[{index}] is not statically sized\")]\r\n    UnsizedMember { index: u32 },\r\n    #[error(\"The type is not host-shareable\")]\r\n    NonHostShareable,\r\n}\r\n\r\n#[derive(Clone, Debug, thiserror::Error)]\r\npub enum TypeError {\r\n    #[error(transparent)]\r\n    BadHandle(#[from] BadHandle),\r\n    #[error(\"The {0:?} scalar width {1} is not supported\")]\r\n    InvalidWidth(crate::ScalarKind, crate::Bytes),\r\n    #[error(\"The {0:?} scalar width {1} is not supported for an atomic\")]\r\n    InvalidAtomicWidth(crate::ScalarKind, crate::Bytes),\r\n    #[error(\"The base handle {0:?} can not be resolved\")]\r\n    UnresolvedBase(Handle<crate::Type>),\r\n    #[error(\"Invalid type for pointer target {0:?}\")]\r\n    InvalidPointerBase(Handle<crate::Type>),\r\n    #[error(\"Unsized types like {base:?} must be in the `Storage` address space, not `{space:?}`\")]\r\n    InvalidPointerToUnsized {\r\n        base: Handle<crate::Type>,\r\n        space: crate::AddressSpace,\r\n    },\r\n    #[error(\"Expected data type, found {0:?}\")]\r\n    InvalidData(Handle<crate::Type>),\r\n    #[error(\"Base type {0:?} for the array is invalid\")]\r\n    InvalidArrayBaseType(Handle<crate::Type>),\r\n    #[error(\"The constant {0:?} can not be used for an array size\")]\r\n    InvalidArraySizeConstant(Handle<crate::Constant>),\r\n    #[error(\"The constant {0:?} is specialized, and cannot be used as an array size\")]\r\n    UnsupportedSpecializedArrayLength(Handle<crate::Constant>),\r\n    #[error(\"Array type {0:?} must have a length of one or more\")]\r\n    NonPositiveArrayLength(Handle<crate::Constant>),\r\n    #[error(\"Array stride {stride} does not match the expected {expected}\")]\r\n    InvalidArrayStride { stride: u32, expected: u32 },\r\n    #[error(\"Field '{0}' can't be dynamically-sized, has type {1:?}\")]\r\n    InvalidDynamicArray(String, Handle<crate::Type>),\r\n    #[error(\"Structure member[{index}] at {offset} overlaps the previous member\")]\r\n    MemberOverlap { index: u32, offset: u32 },\r\n    #[error(\r\n        \"Structure member[{index}] at {offset} and size {size} crosses the structure boundary of size {span}\"\r\n    )]\r\n    MemberOutOfBounds {\r\n        index: u32,\r\n        offset: u32,\r\n        size: u32,\r\n        span: u32,\r\n    },\r\n    #[error(\"Structure types must have at least one member\")]\r\n    EmptyStruct,\r\n}\r\n\r\n// Only makes sense if `flags.contains(HOST_SHAREABLE)`\r\ntype LayoutCompatibility = Result<Alignment, (Handle<crate::Type>, Disalignment)>;\r\n\r\nfn check_member_layout(\r\n    accum: &mut LayoutCompatibility,\r\n    member: &crate::StructMember,\r\n    member_index: u32,\r\n    member_layout: LayoutCompatibility,\r\n    parent_handle: Handle<crate::Type>,\r\n) {\r\n    *accum = match (*accum, member_layout) {\r\n        (Ok(cur_alignment), Ok(alignment)) => {\r\n            if alignment.is_aligned(member.offset) {\r\n                Ok(cur_alignment.max(alignment))\r\n            } else {\r\n                Err((\r\n                    parent_handle,\r\n                    Disalignment::MemberOffset {\r\n                        index: member_index,\r\n                        offset: member.offset,\r\n                        alignment,\r\n                    },\r\n                ))\r\n            }\r\n        }\r\n        (Err(e), _) | (_, Err(e)) => Err(e),\r\n    };\r\n}\r\n\r\n/// Determine whether a pointer in `space` can be passed as an argument.\r\n///\r\n/// If a pointer in `space` is permitted to be passed as an argument to a\r\n/// user-defined function, return `TypeFlags::ARGUMENT`. Otherwise, return\r\n/// `TypeFlags::empty()`.\r\n///\r\n/// Pointers passed as arguments to user-defined functions must be in the\r\n/// `Function`, `Private`, or `Workgroup` storage space.\r\nconst fn ptr_space_argument_flag(space: crate::AddressSpace) -> TypeFlags {\r\n    use crate::AddressSpace as As;\r\n    match space {\r\n        As::Function | As::Private | As::WorkGroup => TypeFlags::ARGUMENT,\r\n        As::Uniform | As::Storage { .. } | As::Handle | As::PushConstant => TypeFlags::empty(),\r\n    }\r\n}\r\n\r\n#[derive(Clone, Debug)]\r\npub(super) struct TypeInfo {\r\n    pub flags: TypeFlags,\r\n    pub uniform_layout: LayoutCompatibility,\r\n    pub storage_layout: LayoutCompatibility,\r\n}\r\n\r\nimpl TypeInfo {\r\n    const fn dummy() -> Self {\r\n        TypeInfo {\r\n            flags: TypeFlags::empty(),\r\n            uniform_layout: Ok(Alignment::ONE),\r\n            storage_layout: Ok(Alignment::ONE),\r\n        }\r\n    }\r\n\r\n    const fn new(flags: TypeFlags, alignment: Alignment) -> Self {\r\n        TypeInfo {\r\n            flags,\r\n            uniform_layout: Ok(alignment),\r\n            storage_layout: Ok(alignment),\r\n        }\r\n    }\r\n}\r\n\r\nimpl super::Validator {\r\n    pub(super) const fn check_width(&self, kind: crate::ScalarKind, width: crate::Bytes) -> bool {\r\n        match kind {\r\n            crate::ScalarKind::Bool => width == crate::BOOL_WIDTH,\r\n            crate::ScalarKind::Float => {\r\n                width == 4 || (width == 8 && self.capabilities.contains(Capabilities::FLOAT64))\r\n            }\r\n            crate::ScalarKind::Sint | crate::ScalarKind::Uint => width == 4,\r\n        }\r\n    }\r\n\r\n    pub(super) fn reset_types(&mut self, size: usize) {\r\n        self.types.clear();\r\n        self.types.resize(size, TypeInfo::dummy());\r\n        self.layouter.clear();\r\n    }\r\n\r\n    pub(super) fn validate_type(\r\n        &self,\r\n        handle: Handle<crate::Type>,\r\n        types: &UniqueArena<crate::Type>,\r\n        constants: &Arena<crate::Constant>,\r\n    ) -> Result<TypeInfo, TypeError> {\r\n        use crate::TypeInner as Ti;\r\n        Ok(match types[handle].inner {\r\n            Ti::Scalar { kind, width } => {\r\n                if !self.check_width(kind, width) {\r\n                    return Err(TypeError::InvalidWidth(kind, width));\r\n                }\r\n                let shareable = if kind.is_numeric() {\r\n                    TypeFlags::IO_SHAREABLE | TypeFlags::HOST_SHAREABLE\r\n                } else {\r\n                    TypeFlags::empty()\r\n                };\r\n                TypeInfo::new(\r\n                    TypeFlags::DATA\r\n                        | TypeFlags::SIZED\r\n                        | TypeFlags::COPY\r\n                        | TypeFlags::ARGUMENT\r\n                        | TypeFlags::CONSTRUCTIBLE\r\n                        | shareable,\r\n                    Alignment::from_width(width),\r\n                )\r\n            }\r\n            Ti::Vector { size, kind, width } => {\r\n                if !self.check_width(kind, width) {\r\n                    return Err(TypeError::InvalidWidth(kind, width));\r\n                }\r\n                let shareable = if kind.is_numeric() {\r\n                    TypeFlags::IO_SHAREABLE | TypeFlags::HOST_SHAREABLE\r\n                } else {\r\n                    TypeFlags::empty()\r\n                };\r\n                TypeInfo::new(\r\n                    TypeFlags::DATA\r\n                        | TypeFlags::SIZED\r\n                        | TypeFlags::COPY\r\n                        | TypeFlags::HOST_SHAREABLE\r\n                        | TypeFlags::ARGUMENT\r\n                        | TypeFlags::CONSTRUCTIBLE\r\n                        | shareable,\r\n                    Alignment::from(size) * Alignment::from_width(width),\r\n                )\r\n            }\r\n            Ti::Matrix {\r\n                columns: _,\r\n                rows,\r\n                width,\r\n            } => {\r\n                if !self.check_width(crate::ScalarKind::Float, width) {\r\n                    return Err(TypeError::InvalidWidth(crate::ScalarKind::Float, width));\r\n                }\r\n                TypeInfo::new(\r\n                    TypeFlags::DATA\r\n                        | TypeFlags::SIZED\r\n                        | TypeFlags::COPY\r\n                        | TypeFlags::HOST_SHAREABLE\r\n                        | TypeFlags::ARGUMENT\r\n                        | TypeFlags::CONSTRUCTIBLE,\r\n                    Alignment::from(rows) * Alignment::from_width(width),\r\n                )\r\n            }\r\n            Ti::Atomic { kind, width } => {\r\n                let good = match kind {\r\n                    crate::ScalarKind::Bool | crate::ScalarKind::Float => false,\r\n                    crate::ScalarKind::Sint | crate::ScalarKind::Uint => width == 4,\r\n                };\r\n                if !good {\r\n                    return Err(TypeError::InvalidAtomicWidth(kind, width));\r\n                }\r\n                TypeInfo::new(\r\n                    TypeFlags::DATA | TypeFlags::SIZED | TypeFlags::HOST_SHAREABLE,\r\n                    Alignment::from_width(width),\r\n                )\r\n            }\r\n            Ti::Pointer { base, space } => {\r\n                use crate::AddressSpace as As;\r\n\r\n                if base >= handle {\r\n                    return Err(TypeError::UnresolvedBase(base));\r\n                }\r\n\r\n                let base_info = &self.types[base.index()];\r\n                if !base_info.flags.contains(TypeFlags::DATA) {\r\n                    return Err(TypeError::InvalidPointerBase(base));\r\n                }\r\n\r\n                // Runtime-sized values can only live in the `Storage` storage\r\n                // space, so it's useless to have a pointer to such a type in\r\n                // any other space.\r\n                //\r\n                // Detecting this problem here prevents the definition of\r\n                // functions like:\r\n                //\r\n                //     fn f(p: ptr<workgroup, UnsizedType>) -> ... { ... }\r\n                //\r\n                // which would otherwise be permitted, but uncallable. (They\r\n                // may also present difficulties in code generation).\r\n                if !base_info.flags.contains(TypeFlags::SIZED) {\r\n                    match space {\r\n                        As::Storage { .. } => {}\r\n                        _ => {\r\n                            return Err(TypeError::InvalidPointerToUnsized { base, space });\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // `Validator::validate_function` actually checks the storage\r\n                // space of pointer arguments explicitly before checking the\r\n                // `ARGUMENT` flag, to give better error messages. But it seems\r\n                // best to set `ARGUMENT` accurately anyway.\r\n                let argument_flag = ptr_space_argument_flag(space);\r\n\r\n                // Pointers cannot be stored in variables, structure members, or\r\n                // array elements, so we do not mark them as `DATA`.\r\n                TypeInfo::new(\r\n                    argument_flag | TypeFlags::SIZED | TypeFlags::COPY,\r\n                    Alignment::ONE,\r\n                )\r\n            }\r\n            Ti::ValuePointer {\r\n                size: _,\r\n                kind,\r\n                width,\r\n                space,\r\n            } => {\r\n                // ValuePointer should be treated the same way as the equivalent\r\n                // Pointer / Scalar / Vector combination, so each step in those\r\n                // variants' match arms should have a counterpart here.\r\n                //\r\n                // However, some cases are trivial: All our implicit base types\r\n                // are DATA and SIZED, so we can never return\r\n                // `InvalidPointerBase` or `InvalidPointerToUnsized`.\r\n                if !self.check_width(kind, width) {\r\n                    return Err(TypeError::InvalidWidth(kind, width));\r\n                }\r\n\r\n                // `Validator::validate_function` actually checks the storage\r\n                // space of pointer arguments explicitly before checking the\r\n                // `ARGUMENT` flag, to give better error messages. But it seems\r\n                // best to set `ARGUMENT` accurately anyway.\r\n                let argument_flag = ptr_space_argument_flag(space);\r\n\r\n                // Pointers cannot be stored in variables, structure members, or\r\n                // array elements, so we do not mark them as `DATA`.\r\n                TypeInfo::new(\r\n                    argument_flag | TypeFlags::SIZED | TypeFlags::COPY,\r\n                    Alignment::ONE,\r\n                )\r\n            }\r\n            Ti::Array { base, size, stride } => {\r\n                if base >= handle {\r\n                    return Err(TypeError::UnresolvedBase(base));\r\n                }\r\n                let base_info = &self.types[base.index()];\r\n                if !base_info.flags.contains(TypeFlags::DATA | TypeFlags::SIZED) {\r\n                    return Err(TypeError::InvalidArrayBaseType(base));\r\n                }\r\n\r\n                let base_layout = self.layouter[base];\r\n                let expected_stride = base_layout.to_stride();\r\n                if stride != expected_stride {\r\n                    return Err(TypeError::InvalidArrayStride {\r\n                        stride,\r\n                        expected: expected_stride,\r\n                    });\r\n                }\r\n\r\n                let general_alignment = base_layout.alignment;\r\n                let uniform_layout = match base_info.uniform_layout {\r\n                    Ok(base_alignment) => {\r\n                        let alignment = base_alignment\r\n                            .max(general_alignment)\r\n                            .max(Alignment::MIN_UNIFORM);\r\n                        if alignment.is_aligned(stride) {\r\n                            Ok(alignment)\r\n                        } else {\r\n                            Err((handle, Disalignment::ArrayStride { stride, alignment }))\r\n                        }\r\n                    }\r\n                    Err(e) => Err(e),\r\n                };\r\n                let storage_layout = match base_info.storage_layout {\r\n                    Ok(base_alignment) => {\r\n                        let alignment = base_alignment.max(general_alignment);\r\n                        if alignment.is_aligned(stride) {\r\n                            Ok(alignment)\r\n                        } else {\r\n                            Err((handle, Disalignment::ArrayStride { stride, alignment }))\r\n                        }\r\n                    }\r\n                    Err(e) => Err(e),\r\n                };\r\n\r\n                let sized_flag = match size {\r\n                    crate::ArraySize::Constant(const_handle) => {\r\n                        let constant = constants.try_get(const_handle)?;\r\n                        let length_is_positive = match *constant {\r\n                            crate::Constant {\r\n                                specialization: Some(_),\r\n                                ..\r\n                            } => {\r\n                                // Many of our back ends don't seem to support\r\n                                // specializable array lengths. If you want to try to make\r\n                                // this work, be sure to address all uses of\r\n                                // `Constant::to_array_length`, which ignores\r\n                                // specialization.\r\n                                return Err(TypeError::UnsupportedSpecializedArrayLength(\r\n                                    const_handle,\r\n                                ));\r\n                            }\r\n                            crate::Constant {\r\n                                inner:\r\n                                    crate::ConstantInner::Scalar {\r\n                                        width: _,\r\n                                        value: crate::ScalarValue::Uint(length),\r\n                                    },\r\n                                ..\r\n                            } => length > 0,\r\n                            // Accept a signed integer size to avoid\r\n                            // requiring an explicit uint\r\n                            // literal. Type inference should make\r\n                            // this unnecessary.\r\n                            crate::Constant {\r\n                                inner:\r\n                                    crate::ConstantInner::Scalar {\r\n                                        width: _,\r\n                                        value: crate::ScalarValue::Sint(length),\r\n                                    },\r\n                                ..\r\n                            } => length > 0,\r\n                            _ => {\r\n                                log::warn!(\"Array size {:?}\", constant);\r\n                                return Err(TypeError::InvalidArraySizeConstant(const_handle));\r\n                            }\r\n                        };\r\n\r\n                        if !length_is_positive {\r\n                            return Err(TypeError::NonPositiveArrayLength(const_handle));\r\n                        }\r\n\r\n                        TypeFlags::SIZED | TypeFlags::ARGUMENT | TypeFlags::CONSTRUCTIBLE\r\n                    }\r\n                    crate::ArraySize::Dynamic => {\r\n                        // Non-SIZED types may only appear as the last element of a structure.\r\n                        // This is enforced by checks for SIZED-ness for all compound types,\r\n                        // and a special case for structs.\r\n                        TypeFlags::empty()\r\n                    }\r\n                };\r\n\r\n                let base_mask = TypeFlags::COPY | TypeFlags::HOST_SHAREABLE;\r\n                TypeInfo {\r\n                    flags: TypeFlags::DATA | (base_info.flags & base_mask) | sized_flag,\r\n                    uniform_layout,\r\n                    storage_layout,\r\n                }\r\n            }\r\n            Ti::Struct { ref members, span } => {\r\n                if members.is_empty() {\r\n                    return Err(TypeError::EmptyStruct);\r\n                }\r\n\r\n                let mut ti = TypeInfo::new(\r\n                    TypeFlags::DATA\r\n                        | TypeFlags::SIZED\r\n                        | TypeFlags::COPY\r\n                        | TypeFlags::HOST_SHAREABLE\r\n                        | TypeFlags::IO_SHAREABLE\r\n                        | TypeFlags::ARGUMENT\r\n                        | TypeFlags::CONSTRUCTIBLE,\r\n                    Alignment::ONE,\r\n                );\r\n                ti.uniform_layout = Ok(Alignment::MIN_UNIFORM);\r\n\r\n                let mut min_offset = 0;\r\n\r\n                let mut prev_struct_data: Option<(u32, u32)> = None;\r\n\r\n                for (i, member) in members.iter().enumerate() {\r\n                    if member.ty >= handle {\r\n                        return Err(TypeError::UnresolvedBase(member.ty));\r\n                    }\r\n                    let base_info = &self.types[member.ty.index()];\r\n                    if !base_info.flags.contains(TypeFlags::DATA) {\r\n                        return Err(TypeError::InvalidData(member.ty));\r\n                    }\r\n                    if !base_info.flags.contains(TypeFlags::HOST_SHAREABLE) {\r\n                        if ti.uniform_layout.is_ok() {\r\n                            ti.uniform_layout = Err((member.ty, Disalignment::NonHostShareable));\r\n                        }\r\n                        if ti.storage_layout.is_ok() {\r\n                            ti.storage_layout = Err((member.ty, Disalignment::NonHostShareable));\r\n                        }\r\n                    }\r\n                    ti.flags &= base_info.flags;\r\n\r\n                    if member.offset < min_offset {\r\n                        // HACK: this could be nicer. We want to allow some structures\r\n                        // to not bother with offsets/alignments if they are never\r\n                        // used for host sharing.\r\n                        if member.offset == 0 {\r\n                            ti.flags.set(TypeFlags::HOST_SHAREABLE, false);\r\n                        } else {\r\n                            return Err(TypeError::MemberOverlap {\r\n                                index: i as u32,\r\n                                offset: member.offset,\r\n                            });\r\n                        }\r\n                    }\r\n\r\n                    let base_size = types[member.ty].inner.size(constants);\r\n                    min_offset = member.offset + base_size;\r\n                    if min_offset > span {\r\n                        return Err(TypeError::MemberOutOfBounds {\r\n                            index: i as u32,\r\n                            offset: member.offset,\r\n                            size: base_size,\r\n                            span,\r\n                        });\r\n                    }\r\n\r\n                    check_member_layout(\r\n                        &mut ti.uniform_layout,\r\n                        member,\r\n                        i as u32,\r\n                        base_info.uniform_layout,\r\n                        handle,\r\n                    );\r\n                    check_member_layout(\r\n                        &mut ti.storage_layout,\r\n                        member,\r\n                        i as u32,\r\n                        base_info.storage_layout,\r\n                        handle,\r\n                    );\r\n\r\n                    // Validate rule: If a structure member itself has a structure type S,\r\n                    // then the number of bytes between the start of that member and\r\n                    // the start of any following member must be at least roundUp(16, SizeOf(S)).\r\n                    if let Some((span, offset)) = prev_struct_data {\r\n                        let diff = member.offset - offset;\r\n                        let min = Alignment::MIN_UNIFORM.round_up(span);\r\n                        if diff < min {\r\n                            ti.uniform_layout = Err((\r\n                                handle,\r\n                                Disalignment::MemberOffsetAfterStruct {\r\n                                    index: i as u32,\r\n                                    offset: member.offset,\r\n                                    expected: offset + min,\r\n                                },\r\n                            ));\r\n                        }\r\n                    };\r\n\r\n                    prev_struct_data = match types[member.ty].inner {\r\n                        crate::TypeInner::Struct { span, .. } => Some((span, member.offset)),\r\n                        _ => None,\r\n                    };\r\n\r\n                    // The last field may be an unsized array.\r\n                    if !base_info.flags.contains(TypeFlags::SIZED) {\r\n                        let is_array = match types[member.ty].inner {\r\n                            crate::TypeInner::Array { .. } => true,\r\n                            _ => false,\r\n                        };\r\n                        if !is_array || i + 1 != members.len() {\r\n                            let name = member.name.clone().unwrap_or_default();\r\n                            return Err(TypeError::InvalidDynamicArray(name, member.ty));\r\n                        }\r\n                        if ti.uniform_layout.is_ok() {\r\n                            ti.uniform_layout =\r\n                                Err((handle, Disalignment::UnsizedMember { index: i as u32 }));\r\n                        }\r\n                    }\r\n                }\r\n\r\n                let alignment = self.layouter[handle].alignment;\r\n                if !alignment.is_aligned(span) {\r\n                    ti.uniform_layout = Err((handle, Disalignment::StructSpan { span, alignment }));\r\n                    ti.storage_layout = Err((handle, Disalignment::StructSpan { span, alignment }));\r\n                }\r\n\r\n                ti\r\n            }\r\n            Ti::Image { .. } | Ti::Sampler { .. } => {\r\n                TypeInfo::new(TypeFlags::ARGUMENT, Alignment::ONE)\r\n            }\r\n            Ti::BindingArray { .. } => TypeInfo::new(TypeFlags::empty(), Alignment::ONE),\r\n        })\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/access.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: false,\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 0),\r\n\t\tper_stage_map: (\r\n\t\t\tvs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (buffer: Some(0), mutable: false),\r\n\t\t\t\t\t(group: 0, binding: 1): (buffer: Some(1), mutable: false),\r\n\t\t\t\t\t(group: 0, binding: 2): (buffer: Some(2), mutable: false),\r\n\t\t\t\t\t(group: 0, binding: 3): (buffer: Some(3), mutable: false),\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: Some(24),\r\n\t\t\t),\r\n\t\t\tfs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (buffer: Some(0), mutable: true),\r\n\t\t\t\t\t(group: 0, binding: 2): (buffer: Some(2), mutable: true),\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: Some(24),\r\n\t\t\t),\r\n\t\t\tcs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (buffer: Some(0), mutable: true),\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: Some(24),\r\n\t\t\t),\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/access.wgsl",
    "content": "// This snapshot tests accessing various containers, dereferencing pointers.\r\n\r\nstruct GlobalConst {\r\n    a: u32,\r\n    b: vec3<u32>,\r\n    c: i32,\r\n}\r\n// tests msl padding insertion for global constants\r\nvar<private> global_const: GlobalConst = GlobalConst(0u, vec3<u32>(0u, 0u, 0u), 0);\r\n\r\nstruct AlignedWrapper {\r\n\t@align(8) value: i32\r\n}\r\n\r\nstruct Bar {\r\n\t_matrix: mat4x3<f32>,\r\n\tmatrix_array: array<mat2x2<f32>, 2>,\r\n\tatom: atomic<i32>,\r\n\tarr: array<vec2<u32>, 2>,\r\n\tdata: array<AlignedWrapper>,\r\n}\r\n\r\n@group(0) @binding(0)\r\nvar<storage,read_write> bar: Bar;\r\n\r\nstruct Baz {\r\n\tm: mat3x2<f32>,\r\n}\r\n\r\n@group(0) @binding(1)\r\nvar<uniform> baz: Baz;\r\n\r\n@group(0) @binding(2)\r\nvar<storage,read_write> qux: vec2<i32>;\r\n\r\nfn test_matrix_within_struct_accesses() {\r\n\tvar idx = 1;\r\n\r\n    idx--;\r\n\r\n\t// loads\r\n    _ = baz.m;\r\n    _ = baz.m[0];\r\n    _ = baz.m[idx];\r\n    _ = baz.m[0][1];\r\n    _ = baz.m[0][idx];\r\n    _ = baz.m[idx][1];\r\n    _ = baz.m[idx][idx];\r\n\r\n    var t = Baz(mat3x2<f32>(vec2<f32>(1.0), vec2<f32>(2.0), vec2<f32>(3.0)));\r\n\r\n    idx++;\r\n\r\n\t// stores\r\n    t.m = mat3x2<f32>(vec2<f32>(6.0), vec2<f32>(5.0), vec2<f32>(4.0));\r\n    t.m[0] = vec2<f32>(9.0);\r\n    t.m[idx] = vec2<f32>(90.0);\r\n    t.m[0][1] = 10.0;\r\n    t.m[0][idx] = 20.0;\r\n    t.m[idx][1] = 30.0;\r\n    t.m[idx][idx] = 40.0;\r\n}\r\n\r\nstruct MatCx2InArray {\r\n\tam: array<mat4x2<f32>, 2>,\r\n}\r\n\r\n@group(0) @binding(3)\r\nvar<uniform> nested_mat_cx2: MatCx2InArray;\r\n\r\nfn test_matrix_within_array_within_struct_accesses() {\r\n\tvar idx = 1;\r\n\r\n    idx--;\r\n\r\n\t// loads\r\n    _ = nested_mat_cx2.am;\r\n    _ = nested_mat_cx2.am[0];\r\n    _ = nested_mat_cx2.am[0][0];\r\n    _ = nested_mat_cx2.am[0][idx];\r\n    _ = nested_mat_cx2.am[0][0][1];\r\n    _ = nested_mat_cx2.am[0][0][idx];\r\n    _ = nested_mat_cx2.am[0][idx][1];\r\n    _ = nested_mat_cx2.am[0][idx][idx];\r\n\r\n    var t = MatCx2InArray(array<mat4x2<f32>, 2>());\r\n\r\n    idx++;\r\n\r\n\t// stores\r\n    t.am = array<mat4x2<f32>, 2>();\r\n    t.am[0] = mat4x2<f32>(vec2<f32>(8.0), vec2<f32>(7.0), vec2<f32>(6.0), vec2<f32>(5.0));\r\n    t.am[0][0] = vec2<f32>(9.0);\r\n    t.am[0][idx] = vec2<f32>(90.0);\r\n    t.am[0][0][1] = 10.0;\r\n    t.am[0][0][idx] = 20.0;\r\n    t.am[0][idx][1] = 30.0;\r\n    t.am[0][idx][idx] = 40.0;\r\n}\r\n\r\nfn read_from_private(foo: ptr<function, f32>) -> f32 {\r\n    return *foo;\r\n}\r\n\r\nfn test_arr_as_arg(a: array<array<f32, 10>, 5>) -> f32 {\r\n    return a[4][9];\r\n}\r\n\r\n@vertex\r\nfn foo_vert(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4<f32> {\r\n    var foo: f32 = 0.0;\r\n    // We should check that backed doesn't skip this expression\r\n    let baz: f32 = foo;\r\n    foo = 1.0;\r\n\r\n\ttest_matrix_within_struct_accesses();\r\n\ttest_matrix_within_array_within_struct_accesses();\r\n\r\n    // test storage loads\r\n\tlet _matrix = bar._matrix;\r\n\tlet arr = bar.arr;\r\n\tlet index = 3u;\r\n\tlet b = bar._matrix[index].x;\r\n\tlet a = bar.data[arrayLength(&bar.data) - 2u].value;\r\n\tlet c = qux;\r\n\r\n\t// test pointer types\r\n\tlet data_pointer: ptr<storage, i32, read_write> = &bar.data[0].value;\r\n\tlet foo_value = read_from_private(&foo);\r\n\r\n\t// test array indexing\r\n\tvar c = array<i32, 5>(a, i32(b), 3, 4, 5);\r\n\tc[vi + 1u] = 42;\r\n\tlet value = c[vi];\r\n\r\n\t_ = test_arr_as_arg(array<array<f32, 10>, 5>());\r\n\r\n\treturn vec4<f32>(_matrix * vec4<f32>(vec4<i32>(value)), 2.0);\r\n}\r\n\r\n@fragment\r\nfn foo_frag() -> @location(0) vec4<f32> {\r\n\t// test storage stores\r\n\tbar._matrix[1].z = 1.0;\r\n\tbar._matrix = mat4x3<f32>(vec3<f32>(0.0), vec3<f32>(1.0), vec3<f32>(2.0), vec3<f32>(3.0));\r\n\tbar.arr = array<vec2<u32>, 2>(vec2<u32>(0u), vec2<u32>(1u));\r\n\tbar.data[1].value = 1;\r\n\tqux = vec2<i32>();\r\n\r\n\treturn vec4<f32>(0.0);\r\n}\r\n\r\n@compute @workgroup_size(1)\r\nfn atomics() {\r\n\tvar tmp: i32;\r\n\tlet value = atomicLoad(&bar.atom);\r\n\ttmp = atomicAdd(&bar.atom, 5);\r\n\ttmp = atomicSub(&bar.atom, 5);\r\n\ttmp = atomicAnd(&bar.atom, 5);\r\n\ttmp = atomicOr(&bar.atom, 5);\r\n\ttmp = atomicXor(&bar.atom, 5);\r\n\ttmp = atomicMin(&bar.atom, 5);\r\n\ttmp = atomicMax(&bar.atom, 5);\r\n\ttmp = atomicExchange(&bar.atom, 5);\r\n\t// https://github.com/gpuweb/gpuweb/issues/2021\r\n\t// tmp = atomicCompareExchangeWeak(&bar.atom, 5, 5);\r\n\tatomicStore(&bar.atom, value);\r\n}\r\n\r\nvar<workgroup> val: u32;\r\n\r\nfn assign_through_ptr_fn(p: ptr<workgroup, u32>) {\r\n    *p = 42u;\r\n}\r\n\r\n@compute @workgroup_size(1)\r\nfn assign_through_ptr() {\r\n    assign_through_ptr_fn(&val);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/binding-arrays.param.ron",
    "content": "(\r\n\tgod_mode: true,\r\n\thlsl: (\r\n\t\tshader_model: V5_1,\r\n\t\tbinding_map: {\r\n\t\t\t(group: 0, binding: 0): (space: 0, register: 0, binding_array_size: Some(10)),\r\n\t\t\t(group: 0, binding: 1): (space: 1, register: 0),\r\n\t\t\t(group: 0, binding: 2): (space: 2, register: 0),\r\n\t\t\t(group: 0, binding: 3): (space: 3, register: 0),\r\n\t\t\t(group: 0, binding: 4): (space: 4, register: 0),\r\n\t\t\t(group: 0, binding: 5): (space: 5, register: 0),\r\n\t\t\t(group: 0, binding: 6): (space: 6, register: 0),\r\n\t\t\t(group: 0, binding: 7): (space: 7, register: 0),\r\n\t\t\t(group: 0, binding: 8): (space: 8, register: 0),\r\n\t\t},\r\n\t\tfake_missing_bindings: true,\r\n\t\tspecial_constants_binding: None,\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 0),\r\n\t\tper_stage_map: (\r\n\t\t\tfs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (texture: Some(0), binding_array_size: Some(10), mutable: false),\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: None,\r\n\t\t\t)\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: true,\r\n\t),\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tbinding_map: {\r\n\t\t\t(group: 0, binding: 0): (binding_array_size: Some(10)),\r\n\t\t},\r\n\t),\r\n\tbounds_check_policies: (\r\n\t\tindex: ReadZeroSkipWrite,\r\n\t\tbuffer: ReadZeroSkipWrite,\r\n\t\timage: ReadZeroSkipWrite,\r\n\t)\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/binding-arrays.wgsl",
    "content": "struct UniformIndex {\r\n    index: u32\r\n};\r\n\r\n@group(0) @binding(0)\r\nvar texture_array_unbounded: binding_array<texture_2d<f32>>;\r\n@group(0) @binding(1)\r\nvar texture_array_bounded: binding_array<texture_2d<f32>, 5>;\r\n@group(0) @binding(2)\r\nvar texture_array_2darray: binding_array<texture_2d_array<f32>, 5>;\r\n@group(0) @binding(3)\r\nvar texture_array_multisampled: binding_array<texture_multisampled_2d<f32>, 5>;\r\n@group(0) @binding(4)\r\nvar texture_array_depth: binding_array<texture_depth_2d, 5>;\r\n@group(0) @binding(5)\r\nvar texture_array_storage: binding_array<texture_storage_2d<rgba32float, write>, 5>;\r\n@group(0) @binding(6)\r\nvar samp: binding_array<sampler, 5>;\r\n@group(0) @binding(7)\r\nvar samp_comp: binding_array<sampler_comparison, 5>;\r\n@group(0) @binding(8)\r\nvar<uniform> uni: UniformIndex;\r\n\r\nstruct FragmentIn {\r\n    @location(0) index: u32,\r\n};\r\n\r\n@fragment\r\nfn main(fragment_in: FragmentIn) -> @location(0) vec4<f32> {\r\n    let uniform_index = uni.index;\r\n    let non_uniform_index = fragment_in.index;\r\n\r\n    var i1 = 0;\r\n    var i2 = vec2<i32>(0);\r\n    var v1 = 0.0;\r\n    var v4 = vec4<f32>(0.0);\r\n    \r\n    // This example is arranged in the order of the texture definitions in the wgsl spec\r\n    // \r\n    // The first function uses texture_array_unbounded, the rest use texture_array_bounded to make sure\r\n    // they both show up in the output. Functions that need depth use texture_array_2darray.\r\n    //\r\n    // We only test 2D f32 textures here as the machinery for binding indexing doesn't care about\r\n    // texture format or texture dimension.\r\n\r\n    let uv = vec2<f32>(0.0);\r\n    let pix = vec2<i32>(0);\r\n\r\n    i2 += textureDimensions(texture_array_unbounded[0]);\r\n    i2 += textureDimensions(texture_array_unbounded[uniform_index]);\r\n    i2 += textureDimensions(texture_array_unbounded[non_uniform_index]);\r\n\r\n    v4 += textureGather(0, texture_array_bounded[0], samp[0], uv);\r\n    v4 += textureGather(0, texture_array_bounded[uniform_index], samp[uniform_index], uv);\r\n    v4 += textureGather(0, texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv); \r\n\r\n    v4 += textureGatherCompare(texture_array_depth[0], samp_comp[0], uv, 0.0);\r\n    v4 += textureGatherCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0);\r\n    v4 += textureGatherCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); \r\n\r\n    v4 += textureLoad(texture_array_unbounded[0], pix, 0);\r\n    v4 += textureLoad(texture_array_unbounded[uniform_index], pix, 0);\r\n    v4 += textureLoad(texture_array_unbounded[non_uniform_index], pix, 0);\r\n\r\n    i1 += textureNumLayers(texture_array_2darray[0]);\r\n    i1 += textureNumLayers(texture_array_2darray[uniform_index]);\r\n    i1 += textureNumLayers(texture_array_2darray[non_uniform_index]);\r\n\r\n    i1 += textureNumLevels(texture_array_bounded[0]);\r\n    i1 += textureNumLevels(texture_array_bounded[uniform_index]);\r\n    i1 += textureNumLevels(texture_array_bounded[non_uniform_index]);\r\n\r\n    i1 += textureNumSamples(texture_array_multisampled[0]);\r\n    i1 += textureNumSamples(texture_array_multisampled[uniform_index]);\r\n    i1 += textureNumSamples(texture_array_multisampled[non_uniform_index]);\r\n\r\n    v4 += textureSample(texture_array_bounded[0], samp[0], uv);\r\n    v4 += textureSample(texture_array_bounded[uniform_index], samp[uniform_index], uv);\r\n    v4 += textureSample(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv);\r\n\r\n    v4 += textureSampleBias(texture_array_bounded[0], samp[0], uv, 0.0);\r\n    v4 += textureSampleBias(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0);\r\n    v4 += textureSampleBias(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0);\r\n\r\n    v1 += textureSampleCompare(texture_array_depth[0], samp_comp[0], uv, 0.0);\r\n    v1 += textureSampleCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0);\r\n    v1 += textureSampleCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0);\r\n\r\n    v1 += textureSampleCompareLevel(texture_array_depth[0], samp_comp[0], uv, 0.0);\r\n    v1 += textureSampleCompareLevel(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0);\r\n    v1 += textureSampleCompareLevel(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0);\r\n\r\n    v4 += textureSampleGrad(texture_array_bounded[0], samp[0], uv, uv, uv);\r\n    v4 += textureSampleGrad(texture_array_bounded[uniform_index], samp[uniform_index], uv, uv, uv);\r\n    v4 += textureSampleGrad(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, uv, uv);\r\n\r\n    v4 += textureSampleLevel(texture_array_bounded[0], samp[0], uv, 0.0);\r\n    v4 += textureSampleLevel(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0);\r\n    v4 += textureSampleLevel(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0);\r\n\r\n    textureStore(texture_array_storage[0], pix, v4);\r\n    textureStore(texture_array_storage[uniform_index], pix, v4);\r\n    textureStore(texture_array_storage[non_uniform_index], pix, v4);\r\n\r\n    let v2 = vec2<f32>(i2 + vec2<i32>(i1));\r\n\r\n    return v4 + vec4<f32>(v2.x, v2.y, v2.x, v2.y) + v1;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bitcast.params.ron",
    "content": "(\r\n\tmsl: (\r\n\t\tlang_version: (1, 2),\r\n\t\tper_stage_map: (\r\n\t\t\tcs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: Some(0),\r\n\t\t\t)\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bitcast.wgsl",
    "content": "@compute @workgroup_size(1)\r\nfn main() {\r\n    var i2 = vec2<i32>(0);\r\n    var i3 = vec3<i32>(0);\r\n    var i4 = vec4<i32>(0);\r\n    \r\n    var u2 = vec2<u32>(0u);\r\n    var u3 = vec3<u32>(0u);\r\n    var u4 = vec4<u32>(0u);\r\n    \r\n    var f2 = vec2<f32>(0.0);\r\n    var f3 = vec3<f32>(0.0);\r\n    var f4 = vec4<f32>(0.0);\r\n\r\n    u2 = bitcast<vec2<u32>>(i2);\r\n    u3 = bitcast<vec3<u32>>(i3);\r\n    u4 = bitcast<vec4<u32>>(i4);\r\n    \r\n    i2 = bitcast<vec2<i32>>(u2);\r\n    i3 = bitcast<vec3<i32>>(u3);\r\n    i4 = bitcast<vec4<i32>>(u4);\r\n    \r\n    f2 = bitcast<vec2<f32>>(i2);\r\n    f3 = bitcast<vec3<f32>>(i3);\r\n    f4 = bitcast<vec4<f32>>(i4);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bits.param.ron",
    "content": "(\r\n\tmsl: (\r\n\t\tlang_version: (1, 2),\r\n\t\tper_stage_map: (\r\n\t\t\tcs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: Some(0),\r\n\t\t\t)\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bits.wgsl",
    "content": "@compute @workgroup_size(1)\r\nfn main() {\r\n    var i = 0;\r\n    var i2 = vec2<i32>(0);\r\n    var i3 = vec3<i32>(0);\r\n    var i4 = vec4<i32>(0);\r\n    var u = 0u;\r\n    var u2 = vec2<u32>(0u);\r\n    var u3 = vec3<u32>(0u);\r\n    var u4 = vec4<u32>(0u);\r\n    var f2 = vec2<f32>(0.0);\r\n    var f4 = vec4<f32>(0.0);\r\n    u = pack4x8snorm(f4);\r\n    u = pack4x8unorm(f4);\r\n    u = pack2x16snorm(f2);\r\n    u = pack2x16unorm(f2);\r\n    u = pack2x16float(f2);\r\n    f4 = unpack4x8snorm(u);\r\n    f4 = unpack4x8unorm(u);\r\n    f2 = unpack2x16snorm(u);\r\n    f2 = unpack2x16unorm(u);\r\n    f2 = unpack2x16float(u);\r\n    i = insertBits(i, i, 5u, 10u);\r\n    i2 = insertBits(i2, i2, 5u, 10u);\r\n    i3 = insertBits(i3, i3, 5u, 10u);\r\n    i4 = insertBits(i4, i4, 5u, 10u);\r\n    u = insertBits(u, u, 5u, 10u);\r\n    u2 = insertBits(u2, u2, 5u, 10u);\r\n    u3 = insertBits(u3, u3, 5u, 10u);\r\n    u4 = insertBits(u4, u4, 5u, 10u);\r\n    i = extractBits(i, 5u, 10u);\r\n    i2 = extractBits(i2, 5u, 10u);\r\n    i3 = extractBits(i3, 5u, 10u);\r\n    i4 = extractBits(i4, 5u, 10u);\r\n    u = extractBits(u, 5u, 10u);\r\n    u2 = extractBits(u2, 5u, 10u);\r\n    u3 = extractBits(u3, 5u, 10u);\r\n    u4 = extractBits(u4, 5u, 10u);\r\n    i = firstTrailingBit(i);\r\n    u2 = firstTrailingBit(u2);\r\n    i3 = firstLeadingBit(i3);\r\n    u = firstLeadingBit(u);\r\n    i = countOneBits(i);\r\n    i2 = countOneBits(i2);\r\n    i3 = countOneBits(i3);\r\n    i4 = countOneBits(i4);\r\n    u = countOneBits(u);\r\n    u2 = countOneBits(u2);\r\n    u3 = countOneBits(u3);\r\n    u4 = countOneBits(u4);\r\n    i = reverseBits(i);\r\n    i2 = reverseBits(i2);\r\n    i3 = reverseBits(i3);\r\n    i4 = reverseBits(i4);\r\n    u = reverseBits(u);\r\n    u2 = reverseBits(u2);\r\n    u3 = reverseBits(u3);\r\n    u4 = reverseBits(u4);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/boids.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: false,\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 0),\r\n\t\tper_stage_map: (\r\n\t\t\tcs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (buffer: Some(0), mutable: false),\r\n\t\t\t\t\t(group: 0, binding: 1): (buffer: Some(1), mutable: true),\r\n\t\t\t\t\t(group: 0, binding: 2): (buffer: Some(2), mutable: true),\r\n\t\t\t\t},\r\n\t\t\t\tsizes_buffer: Some(3),\r\n\t\t\t)\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/boids.wgsl",
    "content": "let NUM_PARTICLES: u32 = 1500u;\r\n\r\nstruct Particle {\r\n  pos : vec2<f32>,\r\n  vel : vec2<f32>,\r\n}\r\n\r\nstruct SimParams {\r\n  deltaT : f32,\r\n  rule1Distance : f32,\r\n  rule2Distance : f32,\r\n  rule3Distance : f32,\r\n  rule1Scale : f32,\r\n  rule2Scale : f32,\r\n  rule3Scale : f32,\r\n}\r\n\r\nstruct Particles {\r\n  particles : array<Particle>\r\n}\r\n\r\n@group(0) @binding(0) var<uniform> params : SimParams;\r\n@group(0) @binding(1) var<storage> particlesSrc : Particles;\r\n@group(0) @binding(2) var<storage,read_write> particlesDst : Particles;\r\n\r\n// https://github.com/austinEng/Project6-Vulkan-Flocking/blob/master/data/shaders/computeparticles/particle.comp\r\n@compute @workgroup_size(64)\r\nfn main(@builtin(global_invocation_id) global_invocation_id : vec3<u32>) {\r\n  let index : u32 = global_invocation_id.x;\r\n  if index >= NUM_PARTICLES {\r\n    return;\r\n  }\r\n\r\n  var vPos = particlesSrc.particles[index].pos;\r\n  var vVel = particlesSrc.particles[index].vel;\r\n\r\n  var cMass = vec2<f32>(0.0, 0.0);\r\n  var cVel = vec2<f32>(0.0, 0.0);\r\n  var colVel = vec2<f32>(0.0, 0.0);\r\n  var cMassCount : i32 = 0;\r\n  var cVelCount : i32 = 0;\r\n\r\n  var pos : vec2<f32>;\r\n  var vel : vec2<f32>;\r\n  var i : u32 = 0u;\r\n  loop {\r\n    if i >= NUM_PARTICLES {\r\n      break;\r\n    }\r\n    if i == index {\r\n      continue;\r\n    }\r\n\r\n    pos = particlesSrc.particles[i].pos;\r\n    vel = particlesSrc.particles[i].vel;\r\n\r\n    if distance(pos, vPos) < params.rule1Distance {\r\n      cMass = cMass + pos;\r\n      cMassCount = cMassCount + 1;\r\n    }\r\n    if distance(pos, vPos) < params.rule2Distance {\r\n      colVel = colVel - (pos - vPos);\r\n    }\r\n    if distance(pos, vPos) < params.rule3Distance {\r\n      cVel = cVel + vel;\r\n      cVelCount = cVelCount + 1;\r\n    }\r\n\r\n    continuing {\r\n      i = i + 1u;\r\n    }\r\n  }\r\n  if cMassCount > 0 {\r\n    cMass = cMass / f32(cMassCount) - vPos;\r\n  }\r\n  if cVelCount > 0 {\r\n    cVel = cVel / f32(cVelCount);\r\n  }\r\n\r\n  vVel = vVel + (cMass * params.rule1Scale) +\r\n      (colVel * params.rule2Scale) +\r\n      (cVel * params.rule3Scale);\r\n\r\n  // clamp velocity for a more pleasing simulation\r\n  vVel = normalize(vVel) * clamp(length(vVel), 0.0, 0.1);\r\n\r\n  // kinematic update\r\n  vPos = vPos + (vVel * params.deltaT);\r\n\r\n  // Wrap around boundary\r\n  if vPos.x < -1.0 {\r\n    vPos.x = 1.0;\r\n  }\r\n  if vPos.x > 1.0 {\r\n    vPos.x = -1.0;\r\n  }\r\n  if vPos.y < -1.0 {\r\n    vPos.y = 1.0;\r\n  }\r\n  if vPos.y > 1.0 {\r\n    vPos.y = -1.0;\r\n  }\r\n\r\n  // Write back\r\n  particlesDst.particles[index].pos = vPos;\r\n  particlesDst.particles[index].vel = vVel;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-image-restrict.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\timage: Restrict,\r\n\t),\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tdebug: true,\r\n\t),\r\n\tglsl: (\r\n\t\tversion: Desktop(430),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: { },\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-image-restrict.wgsl",
    "content": "@group(0) @binding(0)\r\nvar image_1d: texture_1d<f32>;\r\n\r\nfn test_textureLoad_1d(coords: i32, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_1d, coords, level);\r\n}\r\n\r\n@group(0) @binding(1)\r\nvar image_2d: texture_2d<f32>;\r\n\r\nfn test_textureLoad_2d(coords: vec2<i32>, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_2d, coords, level);\r\n}\r\n\r\n@group(0) @binding(2)\r\nvar image_2d_array: texture_2d_array<f32>;\r\n\r\nfn test_textureLoad_2d_array(coords: vec2<i32>, index: i32, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_2d_array, coords, index, level);\r\n}\r\n\r\n@group(0) @binding(3)\r\nvar image_3d: texture_3d<f32>;\r\n\r\nfn test_textureLoad_3d(coords: vec3<i32>, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_3d, coords, level);\r\n}\r\n\r\n@group(0) @binding(4)\r\nvar image_multisampled_2d: texture_multisampled_2d<f32>;\r\n\r\nfn test_textureLoad_multisampled_2d(coords: vec2<i32>, _sample: i32) -> vec4<f32> {\r\n   return textureLoad(image_multisampled_2d, coords, _sample);\r\n}\r\n\r\n@group(0) @binding(5)\r\nvar image_depth_2d: texture_depth_2d;\r\n\r\nfn test_textureLoad_depth_2d(coords: vec2<i32>, level: i32) -> f32 {\r\n   return textureLoad(image_depth_2d, coords, level);\r\n}\r\n\r\n@group(0) @binding(6)\r\nvar image_depth_2d_array: texture_depth_2d_array;\r\n\r\nfn test_textureLoad_depth_2d_array(coords: vec2<i32>, index: i32, level: i32) -> f32 {\r\n   return textureLoad(image_depth_2d_array, coords, index, level);\r\n}\r\n\r\n@group(0) @binding(7)\r\nvar image_depth_multisampled_2d: texture_depth_multisampled_2d;\r\n\r\nfn test_textureLoad_depth_multisampled_2d(coords: vec2<i32>, _sample: i32) -> f32 {\r\n   return textureLoad(image_depth_multisampled_2d, coords, _sample);\r\n}\r\n\r\n@group(0) @binding(8)\r\nvar image_storage_1d: texture_storage_1d<rgba8unorm, write>;\r\n\r\nfn test_textureStore_1d(coords: i32, value: vec4<f32>) {\r\n    textureStore(image_storage_1d, coords, value);\r\n}\r\n\r\n@group(0) @binding(9)\r\nvar image_storage_2d: texture_storage_2d<rgba8unorm, write>;\r\n\r\nfn test_textureStore_2d(coords: vec2<i32>, value: vec4<f32>) {\r\n    textureStore(image_storage_2d, coords, value);\r\n}\r\n\r\n@group(0) @binding(10)\r\nvar image_storage_2d_array: texture_storage_2d_array<rgba8unorm, write>;\r\n\r\nfn test_textureStore_2d_array(coords: vec2<i32>, array_index: i32, value: vec4<f32>) {\r\n textureStore(image_storage_2d_array, coords, array_index, value);\r\n}\r\n\r\n@group(0) @binding(11)\r\nvar image_storage_3d: texture_storage_3d<rgba8unorm, write>;\r\n\r\nfn test_textureStore_3d(coords: vec3<i32>, value: vec4<f32>) {\r\n    textureStore(image_storage_3d, coords, value);\r\n}\r\n\r\n// GLSL output requires that we identify an entry point, so\r\n// that it can tell what \"in\" and \"out\" globals to write.\r\n@fragment\r\nfn fragment_shader() -> @location(0) vec4<f32> {\r\n    test_textureLoad_1d(0, 0);\r\n    test_textureLoad_2d(vec2<i32>(), 0);\r\n    test_textureLoad_2d_array(vec2<i32>(), 0, 0);\r\n    test_textureLoad_3d(vec3<i32>(), 0);\r\n    test_textureLoad_multisampled_2d(vec2<i32>(), 0);\r\n    // Not yet implemented for GLSL:\r\n    // test_textureLoad_depth_2d(vec2<i32>(), 0);\r\n    // test_textureLoad_depth_2d_array(vec2<i32>(), 0, 0);\r\n    // test_textureLoad_depth_multisampled_2d(vec2<i32>(), 0);\r\n    test_textureStore_1d(0, vec4<f32>());\r\n    test_textureStore_2d(vec2<i32>(), vec4<f32>());\r\n    test_textureStore_2d_array(vec2<i32>(), 0, vec4<f32>());\r\n    test_textureStore_3d(vec3<i32>(), vec4<f32>());\r\n\r\n    return vec4<f32>(0.,0.,0.,0.);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-image-rzsw.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\timage: ReadZeroSkipWrite,\r\n\t),\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tdebug: true,\r\n\t),\r\n\tglsl: (\r\n\t\tversion: Desktop(430),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: { },\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-image-rzsw.wgsl",
    "content": "@group(0) @binding(0)\r\nvar image_1d: texture_1d<f32>;\r\n\r\nfn test_textureLoad_1d(coords: i32, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_1d, coords, level);\r\n}\r\n\r\n@group(0) @binding(1)\r\nvar image_2d: texture_2d<f32>;\r\n\r\nfn test_textureLoad_2d(coords: vec2<i32>, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_2d, coords, level);\r\n}\r\n\r\n@group(0) @binding(2)\r\nvar image_2d_array: texture_2d_array<f32>;\r\n\r\nfn test_textureLoad_2d_array(coords: vec2<i32>, index: i32, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_2d_array, coords, index, level);\r\n}\r\n\r\n@group(0) @binding(3)\r\nvar image_3d: texture_3d<f32>;\r\n\r\nfn test_textureLoad_3d(coords: vec3<i32>, level: i32) -> vec4<f32> {\r\n   return textureLoad(image_3d, coords, level);\r\n}\r\n\r\n@group(0) @binding(4)\r\nvar image_multisampled_2d: texture_multisampled_2d<f32>;\r\n\r\nfn test_textureLoad_multisampled_2d(coords: vec2<i32>, _sample: i32) -> vec4<f32> {\r\n   return textureLoad(image_multisampled_2d, coords, _sample);\r\n}\r\n\r\n@group(0) @binding(5)\r\nvar image_depth_2d: texture_depth_2d;\r\n\r\nfn test_textureLoad_depth_2d(coords: vec2<i32>, level: i32) -> f32 {\r\n   return textureLoad(image_depth_2d, coords, level);\r\n}\r\n\r\n@group(0) @binding(6)\r\nvar image_depth_2d_array: texture_depth_2d_array;\r\n\r\nfn test_textureLoad_depth_2d_array(coords: vec2<i32>, index: i32, level: i32) -> f32 {\r\n   return textureLoad(image_depth_2d_array, coords, index, level);\r\n}\r\n\r\n@group(0) @binding(7)\r\nvar image_depth_multisampled_2d: texture_depth_multisampled_2d;\r\n\r\nfn test_textureLoad_depth_multisampled_2d(coords: vec2<i32>, _sample: i32) -> f32 {\r\n   return textureLoad(image_depth_multisampled_2d, coords, _sample);\r\n}\r\n\r\n@group(0) @binding(8)\r\nvar image_storage_1d: texture_storage_1d<rgba8unorm, write>;\r\n\r\nfn test_textureStore_1d(coords: i32, value: vec4<f32>) {\r\n    textureStore(image_storage_1d, coords, value);\r\n}\r\n\r\n@group(0) @binding(9)\r\nvar image_storage_2d: texture_storage_2d<rgba8unorm, write>;\r\n\r\nfn test_textureStore_2d(coords: vec2<i32>, value: vec4<f32>) {\r\n    textureStore(image_storage_2d, coords, value);\r\n}\r\n\r\n@group(0) @binding(10)\r\nvar image_storage_2d_array: texture_storage_2d_array<rgba8unorm, write>;\r\n\r\nfn test_textureStore_2d_array(coords: vec2<i32>, array_index: i32, value: vec4<f32>) {\r\n textureStore(image_storage_2d_array, coords, array_index, value);\r\n}\r\n\r\n@group(0) @binding(11)\r\nvar image_storage_3d: texture_storage_3d<rgba8unorm, write>;\r\n\r\nfn test_textureStore_3d(coords: vec3<i32>, value: vec4<f32>) {\r\n    textureStore(image_storage_3d, coords, value);\r\n}\r\n\r\n// GLSL output requires that we identify an entry point, so\r\n// that it can tell what \"in\" and \"out\" globals to write.\r\n@fragment\r\nfn fragment_shader() -> @location(0) vec4<f32> {\r\n    test_textureLoad_1d(0, 0);\r\n    test_textureLoad_2d(vec2<i32>(), 0);\r\n    test_textureLoad_2d_array(vec2<i32>(), 0, 0);\r\n    test_textureLoad_3d(vec3<i32>(), 0);\r\n    test_textureLoad_multisampled_2d(vec2<i32>(), 0);\r\n    // Not yet implemented for GLSL:\r\n    // test_textureLoad_depth_2d(vec2<i32>(), 0);\r\n    // test_textureLoad_depth_2d_array(vec2<i32>(), 0, 0);\r\n    // test_textureLoad_depth_multisampled_2d(vec2<i32>(), 0);\r\n    test_textureStore_1d(0, vec4<f32>());\r\n    test_textureStore_2d(vec2<i32>(), vec4<f32>());\r\n    test_textureStore_2d_array(vec2<i32>(), 0, vec4<f32>());\r\n    test_textureStore_3d(vec3<i32>(), vec4<f32>());\r\n\r\n    return vec4<f32>(0.,0.,0.,0.);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-restrict.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\tindex: Restrict,\r\n\t\tbuffer: Restrict,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-restrict.wgsl",
    "content": "// Tests for `naga::back::BoundsCheckPolicy::Restrict`.\r\n\r\nstruct Globals {\r\n    a: array<f32, 10>,\r\n    v: vec4<f32>,\r\n    m: mat3x4<f32>,\r\n    d: array<f32>,\r\n}\r\n\r\n@group(0) @binding(0) var<storage, read_write> globals: Globals;\r\n\r\nfn index_array(i: i32) -> f32 {\r\n   return globals.a[i];\r\n}\r\n\r\nfn index_dynamic_array(i: i32) -> f32 {\r\n   return globals.d[i];\r\n}\r\n\r\nfn index_vector(i: i32) -> f32 {\r\n   return globals.v[i];\r\n}\r\n\r\nfn index_vector_by_value(v: vec4<f32>, i: i32) -> f32 {\r\n   return v[i];\r\n}\r\n\r\nfn index_matrix(i: i32) -> vec4<f32> {\r\n   return globals.m[i];\r\n}\r\n\r\nfn index_twice(i: i32, j: i32) -> f32 {\r\n   return globals.m[i][j];\r\n}\r\n\r\nfn index_expensive(i: i32) -> f32 {\r\n   return globals.a[i32(sin(f32(i) / 100.0) * 100.0)];\r\n}\r\n\r\nfn index_in_bounds() -> f32 {\r\n   return globals.a[9] + globals.v[3] + globals.m[2][3];\r\n}\r\n\r\nfn set_array(i: i32, v: f32) {\r\n   globals.a[i] = v;\r\n}\r\n\r\nfn set_dynamic_array(i: i32, v: f32) {\r\n   globals.d[i] = v;\r\n}\r\n\r\nfn set_vector(i: i32, v: f32) {\r\n   globals.v[i] = v;\r\n}\r\n\r\nfn set_matrix(i: i32, v: vec4<f32>) {\r\n   globals.m[i] = v;\r\n}\r\n\r\nfn set_index_twice(i: i32, j: i32, v: f32) {\r\n   globals.m[i][j] = v;\r\n}\r\n\r\nfn set_expensive(i: i32, v: f32) {\r\n   globals.a[i32(sin(f32(i) / 100.0) * 100.0)] = v;\r\n}\r\n\r\nfn set_in_bounds(v: f32) {\r\n   globals.a[9] = v;\r\n   globals.v[3] = v;\r\n   globals.m[2][3] = v;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-zero-atomic.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\tindex: ReadZeroSkipWrite,\r\n\t\tbuffer: ReadZeroSkipWrite,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-zero-atomic.wgsl",
    "content": "// Tests for `naga::back::BoundsCheckPolicy::ReadZeroSkipWrite` for atomic types.\r\n\r\n// These are separate from `bounds-check-zero.wgsl because SPIR-V does not yet\r\n// support `ReadZeroSkipWrite` for atomics. Once it does, the test files could\r\n// be combined.\r\n\r\nstruct Globals {\r\n    a: atomic<u32>,\r\n    b: array<atomic<u32>, 10>,\r\n    c: array<atomic<u32>>,\r\n}\r\n\r\n@group(0) @binding(0) var<storage, read_write> globals: Globals;\r\n\r\nfn fetch_add_atomic() -> u32 {\r\n   return atomicAdd(&globals.a, 1u);\r\n}\r\n\r\nfn fetch_add_atomic_static_sized_array(i: i32) -> u32 {\r\n   return atomicAdd(&globals.b[i], 1u);\r\n}\r\n\r\nfn fetch_add_atomic_dynamic_sized_array(i: i32) -> u32 {\r\n   return atomicAdd(&globals.c[i], 1u);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-zero.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\tindex: ReadZeroSkipWrite,\r\n\t\tbuffer: ReadZeroSkipWrite,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/bounds-check-zero.wgsl",
    "content": "// Tests for `naga::back::BoundsCheckPolicy::ReadZeroSkipWrite`.\r\n\r\nstruct Globals {\r\n    a: array<f32, 10>,\r\n    v: vec4<f32>,\r\n    m: mat3x4<f32>,\r\n    d: array<f32>,\r\n}\r\n\r\n@group(0) @binding(0) var<storage, read_write> globals: Globals;\r\n\r\nfn index_array(i: i32) -> f32 {\r\n   return globals.a[i];\r\n}\r\n\r\nfn index_dynamic_array(i: i32) -> f32 {\r\n   return globals.d[i];\r\n}\r\n\r\nfn index_vector(i: i32) -> f32 {\r\n   return globals.v[i];\r\n}\r\n\r\nfn index_vector_by_value(v: vec4<f32>, i: i32) -> f32 {\r\n   return v[i];\r\n}\r\n\r\nfn index_matrix(i: i32) -> vec4<f32> {\r\n   return globals.m[i];\r\n}\r\n\r\nfn index_twice(i: i32, j: i32) -> f32 {\r\n   return globals.m[i][j];\r\n}\r\n\r\nfn index_expensive(i: i32) -> f32 {\r\n   return globals.a[i32(sin(f32(i) / 100.0) * 100.0)];\r\n}\r\n\r\nfn index_in_bounds() -> f32 {\r\n   return globals.a[9] + globals.v[3] + globals.m[2][3];\r\n}\r\n\r\nfn set_array(i: i32, v: f32) {\r\n   globals.a[i] = v;\r\n}\r\n\r\nfn set_dynamic_array(i: i32, v: f32) {\r\n   globals.d[i] = v;\r\n}\r\n\r\nfn set_vector(i: i32, v: f32) {\r\n   globals.v[i] = v;\r\n}\r\n\r\nfn set_matrix(i: i32, v: vec4<f32>) {\r\n   globals.m[i] = v;\r\n}\r\n\r\nfn set_index_twice(i: i32, j: i32, v: f32) {\r\n   globals.m[i][j] = v;\r\n}\r\n\r\nfn set_expensive(i: i32, v: f32) {\r\n   globals.a[i32(sin(f32(i) / 100.0) * 100.0)] = v;\r\n}\r\n\r\nfn set_in_bounds(v: f32) {\r\n   globals.a[9] = v;\r\n   globals.v[3] = v;\r\n   globals.m[2][3] = v;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/break-if.wgsl",
    "content": "@compute @workgroup_size(1)\r\nfn main() {}\r\n\r\nfn breakIfEmpty() {\r\n    loop {\r\n        continuing {\r\n            break if true;\r\n        }\r\n    }\r\n}\r\n\r\nfn breakIfEmptyBody(a: bool) {\r\n    loop {\r\n        continuing {\r\n            var b = a;\r\n            var c = a != b;\r\n\r\n            break if a == c;\r\n        }\r\n    }\r\n}\r\n\r\nfn breakIf(a: bool) {\r\n    loop {\r\n        var d = a;\r\n        var e = a != d;\r\n\r\n        continuing {\r\n            break if a == e;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/collatz.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tdebug: true,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/collatz.wgsl",
    "content": "struct PrimeIndices {\r\n    data: array<u32>\r\n} // this is used as both input and output for convenience\r\n\r\n@group(0) @binding(0)\r\nvar<storage,read_write> v_indices: PrimeIndices;\r\n\r\n// The Collatz Conjecture states that for any integer n:\r\n// If n is even, n = n/2\r\n// If n is odd, n = 3n+1\r\n// And repeat this process for each new n, you will always eventually reach 1.\r\n// Though the conjecture has not been proven, no counterexample has ever been found.\r\n// This function returns how many times this recurrence needs to be applied to reach 1.\r\nfn collatz_iterations(n_base: u32) -> u32 {\r\n    var n = n_base;\r\n    var i: u32 = 0u;\r\n    while n > 1u {\r\n        if n % 2u == 0u {\r\n            n = n / 2u;\r\n        }\r\n        else {\r\n            n = 3u * n + 1u;\r\n        }\r\n        i = i + 1u;\r\n    }\r\n    return i;\r\n}\r\n\r\n@compute @workgroup_size(1)\r\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\r\n    v_indices.data[global_id.x] = collatz_iterations(v_indices.data[global_id.x]);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/control-flow.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/control-flow.wgsl",
    "content": "@compute @workgroup_size(1)\r\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\r\n    //TODO: execution-only barrier?\r\n    storageBarrier();\r\n    workgroupBarrier();\r\n\r\n    var pos: i32;\r\n    // switch without cases\r\n    switch 1 {\r\n        default: {\r\n            pos = 1;\r\n        }\r\n    }\r\n\r\n    // non-empty switch *not* in last-statement-in-function position\r\n    // (return statements might be inserted into the switch cases otherwise)\r\n    switch pos {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n        }\r\n        case 3: {\r\n            pos = 2;\r\n            fallthrough;\r\n        }\r\n        case 4: {\r\n            pos = 3;\r\n            fallthrough;\r\n        }\r\n        default: {\r\n            pos = 4;\r\n        }\r\n    }\r\n\r\n\t// switch with unsigned integer selectors\r\n\tswitch(0u) {\r\n\t\tcase 0u: {\r\n\t\t}\r\n        default: {\r\n        }\r\n\t}\r\n\r\n    // non-empty switch in last-statement-in-function position\r\n    switch pos {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n        }\r\n        case 3: {\r\n            pos = 2;\r\n            fallthrough;\r\n        }\r\n        case 4: {}\r\n        default: {\r\n            pos = 3;\r\n        }\r\n    }\r\n}\r\n\r\nfn switch_default_break(i: i32) {\r\n    switch i {\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\nfn switch_case_break() {\r\n    switch(0) {\r\n        case 0: {\r\n            break;\r\n        }\r\n        default: {}\r\n    }\r\n    return;\r\n}\r\n\r\nfn loop_switch_continue(x: i32) {\r\n    loop {\r\n        switch x {\r\n            case 1: {\r\n                continue;\r\n            }\r\n            default: {}\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/cubeArrayShadow.wgsl",
    "content": "@group(0) @binding(4)\r\nvar point_shadow_textures: texture_depth_cube_array;\r\n@group(0) @binding(5)\r\nvar point_shadow_textures_sampler: sampler_comparison;\r\n\r\n@fragment\r\nfn fragment() -> @location(0) vec4<f32> {\r\n    let frag_ls = vec4<f32>(1., 1., 2., 1.).xyz;\r\n    let a = textureSampleCompare(point_shadow_textures, point_shadow_textures_sampler, frag_ls, i32(1), 1.);\r\n\r\n    return vec4<f32>(a, 1., 1., 1.);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/empty.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/empty.wgsl",
    "content": "@compute @workgroup_size(1)\r\nfn main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/extra.param.ron",
    "content": "(\r\n\tgod_mode: true,\r\n\tspv: (\r\n\t\tversion: (1, 2),\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 2),\r\n\t\tper_stage_map: (\r\n\t\t\tfs: (\r\n\t\t\t\tpush_constant_buffer: Some(1),\r\n\t\t\t),\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/extra.wgsl",
    "content": "struct PushConstants {\r\n    index: u32,\r\n    double: vec2<f64>,\r\n}\r\nvar<push_constant> pc: PushConstants;\r\n\r\nstruct FragmentIn {\r\n    @location(0) color: vec4<f32>,\r\n    @builtin(primitive_index) primitive_index: u32,\r\n}\r\n\r\n@fragment\r\nfn main(in: FragmentIn) -> @location(0) vec4<f32> {\r\n    if in.primitive_index == pc.index {\r\n        return in.color;\r\n    } else {\r\n        return vec4<f32>(vec3<f32>(1.0) - in.color.rgb, in.color.a);\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/functions-webgl.param.ron",
    "content": "(\r\n\tglsl: (\r\n\t\tversion: Embedded(\r\n\t\t\tversion: 300,\r\n\t\t\tis_webgl: false\r\n\t\t),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: {},\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/functions-webgl.wgsl",
    "content": "fn test_fma() -> vec2<f32> {\r\n    let a = vec2<f32>(2.0, 2.0);\r\n    let b = vec2<f32>(0.5, 0.5);\r\n    let c = vec2<f32>(0.5, 0.5);\r\n\r\n    return fma(a, b, c);\r\n}\r\n\r\n\r\n@vertex\r\nfn main() {\r\n    let a = test_fma();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/functions.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/functions.wgsl",
    "content": "fn test_fma() -> vec2<f32> {\r\n    let a = vec2<f32>(2.0, 2.0);\r\n    let b = vec2<f32>(0.5, 0.5);\r\n    let c = vec2<f32>(0.5, 0.5);\r\n\r\n    // Hazard: HLSL needs a different intrinsic function for f32 and f64\r\n    // See: https://github.com/gfx-rs/naga/issues/1579\r\n    return fma(a, b, c);\r\n}\r\n\r\nfn test_integer_dot_product() -> i32 {\r\n    let a_2 = vec2<i32>(1);\r\n    let b_2 = vec2<i32>(1);\r\n    let c_2: i32 = dot(a_2, b_2);\r\n\r\n    let a_3 = vec3<u32>(1u);\r\n    let b_3 = vec3<u32>(1u);\r\n    let c_3: u32 = dot(a_3, b_3);\r\n\r\n    // test baking of arguments\r\n    let c_4: i32 = dot(vec4<i32>(4), vec4<i32>(2));\r\n    return c_4;\r\n}\r\n\r\n@compute @workgroup_size(1)\r\nfn main() {\r\n    let a = test_fma();\r\n    let b = test_integer_dot_product();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/globals.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/globals.wgsl",
    "content": "// Global variable & constant declarations\r\n\r\nlet Foo: bool = true;\r\n\r\nvar<workgroup> wg : array<f32, 10u>;\r\nvar<workgroup> at: atomic<u32>;\r\n\r\nstruct Foo {\r\n    v3: vec3<f32>,\r\n    // test packed vec3\r\n    v1: f32,\r\n}\r\n@group(0) @binding(1)\r\nvar<storage, read_write> alignment: Foo;\r\n\r\n@group(0) @binding(2)\r\nvar<storage> dummy: array<vec2<f32>>;\r\n\r\n@group(0) @binding(3)\r\nvar<uniform> float_vecs: array<vec4<f32>, 20>;\r\n\r\n@group(0) @binding(4)\r\nvar<uniform> global_vec: vec3<f32>;\r\n\r\n@group(0) @binding(5)\r\nvar<uniform> global_mat: mat3x2<f32>;\r\n\r\n@group(0) @binding(6)\r\nvar<uniform> global_nested_arrays_of_matrices_2x4: array<array<mat2x4<f32>, 2>, 2>;\r\n\r\n@group(0) @binding(7)\r\nvar<uniform> global_nested_arrays_of_matrices_4x2: array<array<mat4x2<f32>, 2>, 2>;\r\n\r\nfn test_msl_packed_vec3_as_arg(arg: vec3<f32>) {}\r\n\r\nfn test_msl_packed_vec3() {\r\n    // stores\r\n    alignment.v3 = vec3<f32>(1.0);\r\n    var idx = 1;\r\n    alignment.v3.x = 1.0;\r\n    alignment.v3[0] = 2.0;\r\n    alignment.v3[idx] = 3.0;\r\n\r\n    // force load to happen here\r\n    let data = alignment;\r\n\r\n    // loads\r\n    _ = data.v3;\r\n    _ = data.v3.zx;\r\n    test_msl_packed_vec3_as_arg(data.v3);\r\n\r\n    // matrix vector multiplication\r\n    _ = data.v3 * mat3x3<f32>();\r\n    _ = mat3x3<f32>() * data.v3;\r\n\r\n    // scalar vector multiplication\r\n    _ = data.v3 * 2.0;\r\n    _ = 2.0 * data.v3;\r\n}\r\n\r\n@compute @workgroup_size(1)\r\nfn main() {\r\n    test_msl_packed_vec3();\r\n\r\n    wg[7] = (global_nested_arrays_of_matrices_4x2[0][0] * global_nested_arrays_of_matrices_2x4[0][0][0]).x;\r\n    wg[6] = (global_mat * global_vec).x;\r\n    wg[5] = dummy[1].y;\r\n    wg[4] = float_vecs[0].w;\r\n    wg[3] = alignment.v1;\r\n    wg[2] = alignment.v3.x;\r\n    alignment.v1 = 4.0;\r\n    wg[1] = f32(arrayLength(&dummy));\r\n    atomicStore(&at, 2u);\r\n\r\n    // Valid, Foo and at is in function scope\r\n    var Foo: f32 = 1.0;\r\n    var at: bool = true;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/210-bevy-2d-shader.frag",
    "content": "// AUTHOR: mrk-its\r\n// ISSUE: #210\r\n// FIX: #898\r\n#version 450\r\n\r\nlayout(location = 0) in vec2 v_Uv;\r\n\r\nlayout(location = 0) out vec4 o_Target;\r\n\r\nlayout(set = 1, binding = 0) uniform ColorMaterial_color {\r\n    vec4 Color;\r\n};\r\n\r\n# ifdef COLORMATERIAL_TEXTURE\r\nlayout(set = 1, binding = 1) uniform texture2D ColorMaterial_texture;\r\nlayout(set = 1, binding = 2) uniform sampler ColorMaterial_texture_sampler;\r\n# endif\r\n\r\nvoid main() {\r\n    vec4 color = Color;\r\n# ifdef COLORMATERIAL_TEXTURE\r\n    color *= texture(\r\n        sampler2D(ColorMaterial_texture, ColorMaterial_texture_sampler),\r\n        v_Uv);\r\n# endif\r\n    o_Target = color;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/210-bevy-2d-shader.vert",
    "content": "// AUTHOR: mrk-its\r\n// ISSUE: #210\r\n// FIX: #898\r\n#version 450\r\n\r\nlayout(location = 0) in vec3 Vertex_Position;\r\nlayout(location = 1) in vec3 Vertex_Normal;\r\nlayout(location = 2) in vec2 Vertex_Uv;\r\n\r\nlayout(location = 0) out vec2 v_Uv;\r\n\r\nlayout(set = 0, binding = 0) uniform Camera {\r\n    mat4 ViewProj;\r\n};\r\n\r\nlayout(set = 2, binding = 0) uniform Transform {\r\n    mat4 Model;\r\n};\r\nlayout(set = 2, binding = 1) uniform Sprite_size {\r\n    vec2 size;\r\n};\r\n\r\nvoid main() {\r\n    v_Uv = Vertex_Uv;\r\n    vec3 position = Vertex_Position * vec3(size, 1.0);\r\n    gl_Position = ViewProj * Model * vec4(position, 1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/210-bevy-shader.vert",
    "content": "// AUTHOR: enfipy\r\n// ISSUE: #210\r\n// FIX: #898\r\n#version 450\r\n\r\nlayout(location = 0) in vec3 Vertex_Position;\r\nlayout(location = 1) in vec3 Vertex_Normal;\r\nlayout(location = 2) in vec2 Vertex_Uv;\r\n\r\nlayout(location = 0) out vec3 v_Position;\r\nlayout(location = 1) out vec3 v_Normal;\r\nlayout(location = 2) out vec2 v_Uv;\r\n\r\nlayout(set = 0, binding = 0) uniform Camera {\r\n    mat4 ViewProj;\r\n};\r\n\r\nlayout(set = 2, binding = 0) uniform Transform {\r\n    mat4 Model;\r\n};\r\n\r\nvoid main() {\r\n    v_Normal = (Model * vec4(Vertex_Normal, 1.0)).xyz;\r\n    v_Normal = mat3(Model) * Vertex_Normal;\r\n    v_Position = (Model * vec4(Vertex_Position, 1.0)).xyz;\r\n    v_Uv = Vertex_Uv;\r\n    gl_Position = ViewProj * vec4(v_Position, 1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/246-collatz.comp",
    "content": "// AUTHOR: Unknown\r\n// ISSUE: #246\r\n// NOTE: Taken from the wgpu repo\r\n#version 450\r\nlayout(local_size_x = 1) in;\r\n\r\nlayout(set = 0, binding = 0) buffer PrimeIndices {\r\n    uint[] indices;\r\n}; // this is used as both input and output for convenience\r\n\r\n// The Collatz Conjecture states that for any integer n:\r\n// If n is even, n = n/2\r\n// If n is odd, n = 3n+1\r\n// And repeat this process for each new n, you will always eventually reach 1.\r\n// Though the conjecture has not been proven, no counterexample has ever been found.\r\n// This function returns how many times this recurrence needs to be applied to reach 1.\r\nuint collatz_iterations(uint n) {\r\n    uint i = 0;\r\n    while(n != 1) {\r\n        if (mod(n, 2) == 0) {\r\n            n = n / 2;\r\n        }\r\n        else {\r\n            n = (3 * n) + 1;\r\n        }\r\n        i++;\r\n    }\r\n    return i;\r\n}\r\n\r\nvoid main() {\r\n    uint index = gl_GlobalInvocationID.x;\r\n    indices[index] = collatz_iterations(indices[index]);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/277-casting.vert",
    "content": "// AUTHOR: Napokue\r\n// ISSUE: #277\r\n// FIX: #278\r\n#version 450\r\n\r\nvoid main() {\r\n    float a = float(1);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/280-matrix-cast.vert",
    "content": "// AUTHOR: pjoe\r\n// ISSUE: #280\r\n// FIX: #898\r\n#version 450\r\n\r\nvoid main() {\r\n    mat4 a = mat4(1);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/484-preprocessor-if.vert",
    "content": "// AUTHOR: fintelia\r\n// ISSUE: #484\r\n// FIX: https://github.com/Kangz/glslpp-rs/pull/30\r\n// NOTE: Shader altered to use correct syntax\r\n#version 450 core\r\n\r\n#if 0\r\n#endif\r\n\r\nvoid main() { }\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/800-out-of-bounds-panic.vert",
    "content": "// AUTHOR: Herschel\r\n// ISSUE: #800\r\n// FIX: #901\r\n#version 450\r\n\r\n// Set 0: globals\r\nlayout(set = 0, binding = 0) uniform Globals {\r\n    mat4 view_matrix;\r\n};\r\n\r\n// Push constants: matrix + color\r\nlayout(push_constant) uniform VertexPushConstants {\r\n    mat4 world_matrix;\r\n};\r\n\r\nlayout(location = 0) in vec2 position;\r\nlayout(location = 1) in vec4 color;\r\n\r\nlayout(location = 0) out vec4 frag_color;\r\n\r\nvoid main() {\r\n    frag_color = color;\r\n    gl_Position = view_matrix * world_matrix * vec4(position, 0.0, 1.0);\r\n    gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/896-push-constant.vert",
    "content": "// AUTHOR: Foltik\r\n// ISSUE: #896\r\n// FIX: #897\r\n#version 450\r\n\r\nlayout(push_constant) uniform PushConstants {\r\n    float example;\r\n} c;\r\n\r\nvoid main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/900-implicit-conversions.vert",
    "content": "// ISSUE: #900\r\n#version 450\r\n\r\n// Signature match call the second overload\r\nvoid exact(float a) {}\r\nvoid exact(int a) {}\r\n\r\n// No signature match but one overload satisfies the cast rules\r\nvoid implicit(float a) {}\r\nvoid implicit(int a) {}\r\n\r\n// All satisfy the kind condition but they have different dimensions\r\nvoid implicit_dims(float v) {  }\r\nvoid implicit_dims(vec2 v) {  }\r\nvoid implicit_dims(vec3 v) {  }\r\nvoid implicit_dims(vec4 v) {  }\r\n\r\nvoid main() {\r\n  exact(1);\r\n  implicit(1u);\r\n  implicit_dims(ivec3(1));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/901-lhs-field-select.vert",
    "content": "// AUTHOR: JCapucho\r\n// ISSUE: #901\r\n// FIX: #948\r\n#version 450\r\n\r\nvoid main() {\r\n    vec4 a = vec4(1.0);\r\n    a.x = 2.0;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/931-constant-emitting.vert",
    "content": "// AUTHOR: jakobhellermann\r\n// ISSUE: #931\r\n// FIX: #933\r\n#version 450\r\n\r\nconst int constant = 10;\r\n\r\nfloat function() {\r\n    return 0.0;\r\n}\r\n\r\nvoid main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/932-for-loop-if.vert",
    "content": "// AUTHOR: jakobhellermann\r\n// ISSUE: #932\r\n// FIX: #935\r\n#version 450\r\n\r\nvoid main() {\r\n    for (int i = 0; i < 1; i += 1) {}\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/bevy-pbr.frag",
    "content": "// MIT License\r\n//\r\n// Copyright (c) 2020 Carter Anderson\r\n//\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n//\r\n// The above copyright notice and this permission notice shall be included in all\r\n// copies or substantial portions of the Software.\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\n//\r\n// NOTE: Taken from the bevy repo\r\n#version 450\r\n\r\nconst int MAX_POINT_LIGHTS = 10;\r\nconst int MAX_DIRECTIONAL_LIGHTS = 1;\r\n\r\nstruct PointLight {\r\n    vec4 pos;\r\n    vec4 color;\r\n    vec4 lightParams;\r\n};\r\n \r\nstruct DirectionalLight {\r\n    vec4 direction;\r\n    vec4 color;\r\n};\r\n\r\nlayout(location = 0) in vec3 v_WorldPosition;\r\nlayout(location = 1) in vec3 v_WorldNormal;\r\nlayout(location = 2) in vec2 v_Uv;\r\nlayout(location = 3) in vec4 v_WorldTangent;\r\n\r\nlayout(location = 0) out vec4 o_Target;\r\n\r\nlayout(set = 0, binding = 0) uniform CameraViewProj {\r\n    mat4 ViewProj;\r\n};\r\nlayout(std140, set = 0, binding = 1) uniform CameraPosition {\r\n    vec4 CameraPos;\r\n};\r\n\r\nlayout(std140, set = 1, binding = 0) uniform Lights {\r\n    vec4 AmbientColor;\r\n    uvec4 NumLights; // x = point lights, y = directional lights\r\n    PointLight PointLights[MAX_POINT_LIGHTS];\r\n    DirectionalLight DirectionalLights[MAX_DIRECTIONAL_LIGHTS];\r\n};\r\n\r\nlayout(set = 3, binding = 0) uniform StandardMaterial_base_color {\r\n    vec4 base_color;\r\n};\r\n\r\nlayout(set = 3, binding = 1) uniform texture2D StandardMaterial_base_color_texture;\r\nlayout(set = 3,\r\n       binding = 2) uniform sampler StandardMaterial_base_color_texture_sampler;\r\n\r\nlayout(set = 3, binding = 3) uniform StandardMaterial_roughness {\r\n    float perceptual_roughness;\r\n};\r\n\r\nlayout(set = 3, binding = 4) uniform StandardMaterial_metallic {\r\n    float metallic;\r\n};\r\n\r\nlayout(set = 3, binding = 5) uniform texture2D StandardMaterial_metallic_roughness_texture;\r\nlayout(set = 3,\r\n       binding = 6) uniform sampler StandardMaterial_metallic_roughness_texture_sampler;\r\n\r\nlayout(set = 3, binding = 7) uniform StandardMaterial_reflectance {\r\n    float reflectance;\r\n};\r\n\r\nlayout(set = 3, binding = 8) uniform texture2D StandardMaterial_normal_map;\r\nlayout(set = 3,\r\n       binding = 9) uniform sampler StandardMaterial_normal_map_sampler;\r\n\r\nlayout(set = 3, binding = 10) uniform texture2D StandardMaterial_occlusion_texture;\r\nlayout(set = 3,\r\n       binding = 11) uniform sampler StandardMaterial_occlusion_texture_sampler;\r\n\r\nlayout(set = 3, binding = 12) uniform StandardMaterial_emissive {\r\n    vec4 emissive;\r\n};\r\n\r\nlayout(set = 3, binding = 13) uniform texture2D StandardMaterial_emissive_texture;\r\nlayout(set = 3,\r\n       binding = 14) uniform sampler StandardMaterial_emissive_texture_sampler;\r\n\r\n#    define saturate(x) clamp(x, 0.0, 1.0)\r\nconst float PI = 3.141592653589793;\r\n\r\nfloat pow5(float x) {\r\n    float x2 = x * x;\r\n    return x2 * x2 * x;\r\n}\r\n\r\n// distanceAttenuation is simply the square falloff of light intensity\r\n// combined with a smooth attenuation at the edge of the light radius\r\n//\r\n// light radius is a non-physical construct for efficiency purposes,\r\n// because otherwise every light affects every fragment in the scene\r\nfloat getDistanceAttenuation(float distanceSquare, float inverseRangeSquared) {\r\n    float factor = distanceSquare * inverseRangeSquared;\r\n    float smoothFactor = saturate(1.0 - factor * factor);\r\n    float attenuation = smoothFactor * smoothFactor;\r\n    return attenuation * 1.0 / max(distanceSquare, 1e-3);\r\n}\r\n\r\n// Normal distribution function (specular D)\r\n// Based on https://google.github.io/filament/Filament.html#citation-walter07\r\n\r\n// D_GGX(h,α) = α^2 / { π ((n⋅h)^2 (α2−1) + 1)^2 }\r\n\r\n// Simple implementation, has precision problems when using fp16 instead of fp32\r\n// see https://google.github.io/filament/Filament.html#listing_speculardfp16\r\nfloat D_GGX(float roughness, float NoH, const vec3 h) {\r\n    float oneMinusNoHSquared = 1.0 - NoH * NoH;\r\n    float a = NoH * roughness;\r\n    float k = roughness / (oneMinusNoHSquared + a * a);\r\n    float d = k * k * (1.0 / PI);\r\n    return d;\r\n}\r\n\r\n// Visibility function (Specular G)\r\n// V(v,l,a) = G(v,l,α) / { 4 (n⋅v) (n⋅l) }\r\n// such that f_r becomes\r\n// f_r(v,l) = D(h,α) V(v,l,α) F(v,h,f0)\r\n// where\r\n// V(v,l,α) = 0.5 / { n⋅l sqrt((n⋅v)^2 (1−α2) + α2) + n⋅v sqrt((n⋅l)^2 (1−α2) + α2) }\r\n// Note the two sqrt's, that may be slow on mobile, see https://google.github.io/filament/Filament.html#listing_approximatedspecularv\r\nfloat V_SmithGGXCorrelated(float roughness, float NoV, float NoL) {\r\n    float a2 = roughness * roughness;\r\n    float lambdaV = NoL * sqrt((NoV - a2 * NoV) * NoV + a2);\r\n    float lambdaL = NoV * sqrt((NoL - a2 * NoL) * NoL + a2);\r\n    float v = 0.5 / (lambdaV + lambdaL);\r\n    return v;\r\n}\r\n\r\n// Fresnel function\r\n// see https://google.github.io/filament/Filament.html#citation-schlick94\r\n// F_Schlick(v,h,f_0,f_90) = f_0 + (f_90 − f_0) (1 − v⋅h)^5\r\nvec3 F_Schlick(const vec3 f0, float f90, float VoH) {\r\n    // not using mix to keep the vec3 and float versions identical\r\n    return f0 + (vec3(f90) - f0) * pow5(1.0 - VoH);\r\n}\r\n\r\nfloat F_Schlick(float f0, float f90, float VoH) {\r\n    // not using mix to keep the vec3 and float versions identical\r\n    return f0 + (f90 - f0) * pow5(1.0 - VoH);\r\n}\r\n\r\nvec3 fresnel(vec3 f0, float LoH) {\r\n    // f_90 suitable for ambient occlusion\r\n    // see https://google.github.io/filament/Filament.html#lighting/occlusion\r\n    float f90 = saturate(dot(f0, vec3(50.0 * 0.33)));\r\n    return F_Schlick(f0, f90, LoH);\r\n}\r\n\r\n// Specular BRDF\r\n// https://google.github.io/filament/Filament.html#materialsystem/specularbrdf\r\n\r\n// Cook-Torrance approximation of the microfacet model integration using Fresnel law F to model f_m\r\n// f_r(v,l) = { D(h,α) G(v,l,α) F(v,h,f0) } / { 4 (n⋅v) (n⋅l) }\r\nvec3 specular(vec3 f0, float roughness, const vec3 h, float NoV, float NoL,\r\n              float NoH, float LoH, float specularIntensity) {\r\n    float D = D_GGX(roughness, NoH, h);\r\n    float V = V_SmithGGXCorrelated(roughness, NoV, NoL);\r\n    vec3 F = fresnel(f0, LoH);\r\n\r\n    return (specularIntensity * D * V) * F;\r\n}\r\n\r\n// Diffuse BRDF\r\n// https://google.github.io/filament/Filament.html#materialsystem/diffusebrdf\r\n// fd(v,l) = σ/π * 1 / { |n⋅v||n⋅l| } ∫Ω D(m,α) G(v,l,m) (v⋅m) (l⋅m) dm\r\n\r\n// simplest approximation\r\n// float Fd_Lambert() {\r\n//     return 1.0 / PI;\r\n// }\r\n//\r\n// vec3 Fd = diffuseColor * Fd_Lambert();\r\n\r\n// Disney approximation\r\n// See https://google.github.io/filament/Filament.html#citation-burley12\r\n// minimal quality difference\r\nfloat Fd_Burley(float roughness, float NoV, float NoL, float LoH) {\r\n    float f90 = 0.5 + 2.0 * roughness * LoH * LoH;\r\n    float lightScatter = F_Schlick(1.0, f90, NoL);\r\n    float viewScatter = F_Schlick(1.0, f90, NoV);\r\n    return lightScatter * viewScatter * (1.0 / PI);\r\n}\r\n\r\n// From https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile\r\nvec3 EnvBRDFApprox(vec3 f0, float perceptual_roughness, float NoV) {\r\n    const vec4 c0 = { -1.0, -0.0275, -0.572, 0.022 };\r\n    const vec4 c1 = { 1.0, 0.0425, 1.04, -0.04 };\r\n    vec4 r = vec4(perceptual_roughness) * c0 + c1;\r\n    float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\r\n    vec2 AB = vec2(-1.04, 1.04) * vec2(a004) + r.zw;\r\n    return f0 * vec3(AB.x) + vec3(AB.y);\r\n}\r\n\r\nfloat perceptualRoughnessToRoughness(float perceptualRoughness) {\r\n    // clamp perceptual roughness to prevent precision problems\r\n    // According to Filament design 0.089 is recommended for mobile\r\n    // Filament uses 0.045 for non-mobile\r\n    float clampedPerceptualRoughness = clamp(perceptualRoughness, 0.089, 1.0);\r\n    return clampedPerceptualRoughness * clampedPerceptualRoughness;\r\n}\r\n\r\n// from https://64.github.io/tonemapping/\r\n// reinhard on RGB oversaturates colors\r\nvec3 reinhard(vec3 color) {\r\n    return color / (vec3(1.0) + color);\r\n}\r\n\r\nvec3 reinhard_extended(vec3 color, float max_white) {\r\n    vec3 numerator = color * (vec3(1.0) + (color / vec3(max_white * max_white)));\r\n    return numerator / (vec3(1.0) + color);\r\n}\r\n\r\n// luminance coefficients from Rec. 709.\r\n// https://en.wikipedia.org/wiki/Rec._709\r\nfloat luminance(vec3 v) {\r\n    return dot(v, vec3(0.2126, 0.7152, 0.0722));\r\n}\r\n\r\nvec3 change_luminance(vec3 c_in, float l_out) {\r\n    float l_in = luminance(c_in);\r\n    return c_in * (l_out / l_in);\r\n}\r\n\r\nvec3 reinhard_luminance(vec3 color) {\r\n    float l_old = luminance(color);\r\n    float l_new = l_old / (1.0f + l_old);\r\n    return change_luminance(color, l_new);\r\n}\r\n\r\nvec3 reinhard_extended_luminance(vec3 color, float max_white_l) {\r\n    float l_old = luminance(color);\r\n    float numerator = l_old * (1.0f + (l_old / (max_white_l * max_white_l)));\r\n    float l_new = numerator / (1.0f + l_old);\r\n    return change_luminance(color, l_new);\r\n}\r\n\r\nvec3 point_light(PointLight light, float roughness, float NdotV, vec3 N, vec3 V, vec3 R, vec3 F0, vec3 diffuseColor) {\r\n    vec3 light_to_frag = light.pos.xyz - v_WorldPosition.xyz;\r\n    float distance_square = dot(light_to_frag, light_to_frag);\r\n    float rangeAttenuation =\r\n        getDistanceAttenuation(distance_square, light.lightParams.r);\r\n\r\n    // Specular.\r\n    // Representative Point Area Lights.\r\n    // see http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf p14-16\r\n    float a = roughness;\r\n    float radius = light.lightParams.g;\r\n    vec3 centerToRay = dot(light_to_frag, R) * R - light_to_frag;\r\n    vec3 closestPoint = light_to_frag + centerToRay * saturate(radius * inversesqrt(dot(centerToRay, centerToRay)));\r\n    float LspecLengthInverse = inversesqrt(dot(closestPoint, closestPoint));\r\n    float normalizationFactor = a / saturate(a + (radius * 0.5 * LspecLengthInverse));\r\n    float specularIntensity = normalizationFactor * normalizationFactor;\r\n\r\n    vec3 L = closestPoint * LspecLengthInverse; // normalize() equivalent?\r\n    vec3 H = normalize(L + V);\r\n    float NoL = saturate(dot(N, L));\r\n    float NoH = saturate(dot(N, H));\r\n    float LoH = saturate(dot(L, H));\r\n\r\n    vec3 specular = specular(F0, roughness, H, NdotV, NoL, NoH, LoH, specularIntensity);\r\n\r\n    // Diffuse.\r\n    // Comes after specular since its NoL is used in the lighting equation.\r\n    L = normalize(light_to_frag);\r\n    H = normalize(L + V);\r\n    NoL = saturate(dot(N, L));\r\n    NoH = saturate(dot(N, H));\r\n    LoH = saturate(dot(L, H));\r\n\r\n    vec3 diffuse = diffuseColor * Fd_Burley(roughness, NdotV, NoL, LoH);\r\n\r\n    // Lout = f(v,l) Φ / { 4 π d^2 }⟨n⋅l⟩\r\n    // where\r\n    // f(v,l) = (f_d(v,l) + f_r(v,l)) * light_color\r\n    // Φ is light intensity\r\n\r\n    // our rangeAttentuation = 1 / d^2 multiplied with an attenuation factor for smoothing at the edge of the non-physical maximum light radius\r\n    // It's not 100% clear where the 1/4π goes in the derivation, but we follow the filament shader and leave it out\r\n\r\n    // See https://google.github.io/filament/Filament.html#mjx-eqn-pointLightLuminanceEquation\r\n    // TODO compensate for energy loss https://google.github.io/filament/Filament.html#materialsystem/improvingthebrdfs/energylossinspecularreflectance\r\n    // light.color.rgb is premultiplied with light.intensity on the CPU\r\n    return ((diffuse + specular) * light.color.rgb) * (rangeAttenuation * NoL);\r\n}\r\n\r\nvec3 dir_light(DirectionalLight light, float roughness, float NdotV, vec3 normal, vec3 view, vec3 R, vec3 F0, vec3 diffuseColor) {\r\n    vec3 incident_light = light.direction.xyz;\r\n\r\n    vec3 half_vector = normalize(incident_light + view);\r\n    float NoL = saturate(dot(normal, incident_light));\r\n    float NoH = saturate(dot(normal, half_vector));\r\n    float LoH = saturate(dot(incident_light, half_vector));\r\n\r\n    vec3 diffuse = diffuseColor * Fd_Burley(roughness, NdotV, NoL, LoH);\r\n    float specularIntensity = 1.0;\r\n    vec3 specular = specular(F0, roughness, half_vector, NdotV, NoL, NoH, LoH, specularIntensity);\r\n\r\n    return (specular + diffuse) * light.color.rgb * NoL;\r\n}\r\n\r\nvoid main() {\r\n    vec4 output_color = base_color;\r\n    output_color *= texture(sampler2D(StandardMaterial_base_color_texture,\r\n                                      StandardMaterial_base_color_texture_sampler),\r\n                            v_Uv);\r\n\r\n    // calculate non-linear roughness from linear perceptualRoughness\r\n    vec4 metallic_roughness = texture(sampler2D(StandardMaterial_metallic_roughness_texture, StandardMaterial_metallic_roughness_texture_sampler), v_Uv);\r\n    // Sampling from GLTF standard channels for now\r\n    float metallic = metallic * metallic_roughness.b;\r\n    float perceptual_roughness = perceptual_roughness * metallic_roughness.g;\r\n\r\n    float roughness = perceptualRoughnessToRoughness(perceptual_roughness);\r\n\r\n    vec3 N = normalize(v_WorldNormal);\r\n\r\n    vec3 T = normalize(v_WorldTangent.xyz);\r\n    vec3 B = cross(N, T) * v_WorldTangent.w;\r\n\r\n    N = gl_FrontFacing ? N : -N;\r\n    T = gl_FrontFacing ? T : -T;\r\n    B = gl_FrontFacing ? B : -B;\r\n\r\n    mat3 TBN = mat3(T, B, N);\r\n    N = TBN * normalize(texture(sampler2D(StandardMaterial_normal_map, StandardMaterial_normal_map_sampler), v_Uv).rgb * 2.0 - vec3(1.0));\r\n\r\n    float occlusion = texture(sampler2D(StandardMaterial_occlusion_texture, StandardMaterial_occlusion_texture_sampler), v_Uv).r;\r\n\r\n    vec4 emissive = emissive;\r\n    // TODO use .a for exposure compensation in HDR\r\n    emissive.rgb *= texture(sampler2D(StandardMaterial_emissive_texture, StandardMaterial_emissive_texture_sampler), v_Uv).rgb;\r\n    vec3 V = normalize(CameraPos.xyz - v_WorldPosition.xyz);\r\n    // Neubelt and Pettineo 2013, \"Crafting a Next-gen Material Pipeline for The Order: 1886\"\r\n    float NdotV = max(dot(N, V), 1e-3);\r\n\r\n    // Remapping [0,1] reflectance to F0\r\n    // See https://google.github.io/filament/Filament.html#materialsystem/parameterization/remapping\r\n    vec3 F0 = vec3(0.16 * reflectance * reflectance * (1.0 - metallic)) + output_color.rgb * vec3(metallic);\r\n\r\n    // Diffuse strength inversely related to metallicity\r\n    vec3 diffuseColor = output_color.rgb * vec3(1.0 - metallic);\r\n\r\n    vec3 R = reflect(-V, N);\r\n\r\n    // accumulate color\r\n    vec3 light_accum = vec3(0.0);\r\n    for (int i = 0; i < int(NumLights.x) && i < MAX_POINT_LIGHTS; ++i) {\r\n        light_accum += point_light(PointLights[i], roughness, NdotV, N, V, R, F0, diffuseColor);\r\n    }\r\n    for (int i = 0; i < int(NumLights.y) && i < MAX_DIRECTIONAL_LIGHTS; ++i) {\r\n        light_accum += dir_light(DirectionalLights[i], roughness, NdotV, N, V, R, F0, diffuseColor);\r\n    }\r\n\r\n    vec3 diffuse_ambient = EnvBRDFApprox(diffuseColor, 1.0, NdotV);\r\n    vec3 specular_ambient = EnvBRDFApprox(F0, perceptual_roughness, NdotV);\r\n\r\n    output_color.rgb = light_accum;\r\n    output_color.rgb += (diffuse_ambient + specular_ambient) * AmbientColor.xyz * occlusion;\r\n    output_color.rgb += emissive.rgb * output_color.a;\r\n\r\n    // tone_mapping\r\n    output_color.rgb = reinhard_luminance(output_color.rgb);\r\n    // Gamma correction.\r\n    // Not needed with sRGB buffer\r\n    // output_color.rgb = pow(output_color.rgb, vec3(1.0 / 2.2));\r\n\r\n    o_Target = output_color;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/bevy-pbr.vert",
    "content": "// MIT License\r\n//\r\n// Copyright (c) 2020 Carter Anderson\r\n//\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n//\r\n// The above copyright notice and this permission notice shall be included in all\r\n// copies or substantial portions of the Software.\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\n//\r\n// NOTE: Taken from the bevy repo\r\n#version 450\r\n\r\nlayout(location = 0) in vec3 Vertex_Position;\r\nlayout(location = 1) in vec3 Vertex_Normal;\r\nlayout(location = 2) in vec2 Vertex_Uv;\r\n\r\nlayout(location = 3) in vec4 Vertex_Tangent;\r\n\r\nlayout(location = 0) out vec3 v_WorldPosition;\r\nlayout(location = 1) out vec3 v_WorldNormal;\r\nlayout(location = 2) out vec2 v_Uv;\r\n\r\nlayout(set = 0, binding = 0) uniform CameraViewProj {\r\n    mat4 ViewProj;\r\n};\r\n\r\nlayout(location = 3) out vec4 v_WorldTangent;\r\n\r\nlayout(set = 2, binding = 0) uniform Transform {\r\n    mat4 Model;\r\n};\r\n\r\nvoid main() {\r\n    vec4 world_position = Model * vec4(Vertex_Position, 1.0);\r\n    v_WorldPosition = world_position.xyz;\r\n    v_WorldNormal = mat3(Model) * Vertex_Normal;\r\n    v_Uv = Vertex_Uv;\r\n    v_WorldTangent = vec4(mat3(Model) * Vertex_Tangent.xyz, Vertex_Tangent.w);\r\n    gl_Position = ViewProj * world_position;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/bits_glsl.frag",
    "content": "#version 450\r\n\r\nvoid main() {\r\n    int i = 0;\r\n    ivec2 i2 = ivec2(0);\r\n    ivec3 i3 = ivec3(0);\r\n    ivec4 i4 = ivec4(0);\r\n    uint u = 0;\r\n    uvec2 u2 = uvec2(0);\r\n    uvec3 u3 = uvec3(0);\r\n    uvec4 u4 = uvec4(0);\r\n    vec2 f2 = vec2(0.0);\r\n    vec4 f4 = vec4(0.0);\r\n    u = packSnorm4x8(f4);\r\n    u = packUnorm4x8(f4);\r\n    u = packSnorm2x16(f2);\r\n    u = packUnorm2x16(f2);\r\n    u = packHalf2x16(f2);\r\n    f4 = unpackSnorm4x8(u);\r\n    f4 = unpackUnorm4x8(u);\r\n    f2 = unpackSnorm2x16(u);\r\n    f2 = unpackUnorm2x16(u);\r\n    f2 = unpackHalf2x16(u);\r\n    i = bitfieldInsert(i, i, 5, 10);\r\n    i2 = bitfieldInsert(i2, i2, 5, 10);\r\n    i3 = bitfieldInsert(i3, i3, 5, 10);\r\n    i4 = bitfieldInsert(i4, i4, 5, 10);\r\n    u = bitfieldInsert(u, u, 5, 10);\r\n    u2 = bitfieldInsert(u2, u2, 5, 10);\r\n    u3 = bitfieldInsert(u3, u3, 5, 10);\r\n    u4 = bitfieldInsert(u4, u4, 5, 10);\r\n    i = bitfieldExtract(i, 5, 10);\r\n    i2 = bitfieldExtract(i2, 5, 10);\r\n    i3 = bitfieldExtract(i3, 5, 10);\r\n    i4 = bitfieldExtract(i4, 5, 10);\r\n    u = bitfieldExtract(u, 5, 10);\r\n    u2 = bitfieldExtract(u2, 5, 10);\r\n    u3 = bitfieldExtract(u3, 5, 10);\r\n    u4 = bitfieldExtract(u4, 5, 10);\r\n    i = findLSB(i);\r\n    i2 = findLSB(i2);\r\n    i3 = findLSB(i3);\r\n    i4 = findLSB(i4);\r\n    i = findLSB(u);\r\n    i2 = findLSB(u2);\r\n    i3 = findLSB(u3);\r\n    i4 = findLSB(u4);\r\n    i = findMSB(i);\r\n    i2 = findMSB(i2);\r\n    i3 = findMSB(i3);\r\n    i4 = findMSB(i4);\r\n    i = findMSB(u);\r\n    i2 = findMSB(u2);\r\n    i3 = findMSB(u3);\r\n    i4 = findMSB(u4);\r\n}"
  },
  {
    "path": "lib/naga/tests/in/glsl/bool-select.frag",
    "content": "#version 440 core\r\nprecision highp float;\r\n\r\nlayout(location = 0) out vec4 o_color;\r\n\r\nfloat TevPerCompGT(float a, float b) {\r\n    return float(a > b);\r\n}\r\n\r\nvec3 TevPerCompGT(vec3 a, vec3 b) {\r\n    return vec3(greaterThan(a, b));\r\n}\r\n\r\nvoid main() {\r\n    o_color.rgb = TevPerCompGT(vec3(3.0), vec3(5.0));\r\n    o_color.a = TevPerCompGT(3.0, 5.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/buffer.frag",
    "content": "#version 450\r\n\r\nlayout(set = 0, binding = 0) buffer testBufferBlock {\r\n    uint[] data;\r\n} testBuffer;\r\n\r\nlayout(set = 0, binding = 1) writeonly buffer testBufferWriteOnlyBlock {\r\n    uint[] data;\r\n} testBufferWriteOnly;\r\n\r\nlayout(set = 0, binding = 2) readonly buffer testBufferReadOnlyBlock {\r\n    uint[] data;\r\n} testBufferReadOnly;\r\n\r\nvoid main() {\r\n    uint a = testBuffer.data[0];\r\n    testBuffer.data[1] = 2;\r\n\r\n    testBufferWriteOnly.data[1] = 2;\r\n\r\n    uint b = testBufferReadOnly.data[0];\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/clamp-splat.vert",
    "content": "#version 450\r\nlayout(location = 0) in vec2 a_pos;\r\n\r\nvoid main() {\r\n  gl_Position = vec4(clamp(a_pos, 0.0, 1.0), 0.0, 1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/constant-array-size.vert",
    "content": "#version 450\r\n\r\nconst int NUM_VECS = 42;\r\nlayout(std140, set = 1, binding = 0) uniform Data {\r\n    vec4 vecs[NUM_VECS];\r\n};\r\n\r\nvec4 function() {\r\n    vec4 sum = vec4(0);\r\n    for (int i = 0; i < NUM_VECS; i++) {\r\n        sum += vecs[i];\r\n    }\r\n    return sum;\r\n}\r\n\r\nvoid main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/declarations.vert",
    "content": "#version 450\r\n\r\nlayout(location = 0) in VertexData {\r\n    vec2 position;\r\n    vec2 a;\r\n} vert;\r\n\r\nlayout(location = 0) out FragmentData {\r\n    vec2 position;\r\n    vec2 a;\r\n} frag;\r\n\r\nlayout(location = 2) in  vec4  in_array[2];\r\nlayout(location = 2) out vec4 out_array[2];\r\n\r\nstruct TestStruct {\r\n    float a;\r\n    float b;\r\n};\r\n\r\nfloat array_2d[2][2];\r\nfloat array_toomanyd[2][2][2][2][2][2][2];\r\n\r\nvoid main() {\r\n    const vec3 positions[2] = vec3[2](\r\n        vec3(-1.0, 1.0, 0.0),\r\n        vec3(-1.0, -1.0, 0.0)\r\n    );\r\n    const TestStruct strct = TestStruct( 1, 2 );\r\n    const vec4 from_input_array = in_array[1];\r\n    const float a = array_2d[0][0];\r\n    const float b = array_toomanyd[0][0][0][0][0][0][0];\r\n    out_array[0] = vec4(2.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/expressions.frag",
    "content": "#version 440 core\r\n\r\nvoid testBinOpVecFloat(vec4 a, float b) {\r\n    vec4 v;\r\n    v = a * 2.0;\r\n    v = a / 2.0;\r\n    v = a + 2.0;\r\n    v = a - 2.0;\r\n}\r\n\r\nvoid testBinOpFloatVec(vec4 a, float b) {\r\n    vec4 v;\r\n    v = a * b;\r\n    v = a / b;\r\n    v = a + b;\r\n    v = a - b;\r\n}\r\n\r\nvoid testBinOpIVecInt(ivec4 a, int b) {\r\n    ivec4 v;\r\n    v = a * b;\r\n    v = a / b;\r\n    v = a + b;\r\n    v = a - b;\r\n    v = a & b;\r\n    v = a | b;\r\n    v = a ^ b;\r\n    v = a >> b;\r\n    v = a << b;\r\n}\r\n\r\nvoid testBinOpIntIVec(int a, ivec4 b) {\r\n    ivec4 v;\r\n    v = a * b;\r\n    v = a + b;\r\n    v = a - b;\r\n    v = a & b;\r\n    v = a | b;\r\n    v = a ^ b;\r\n}\r\n\r\nvoid testBinOpUVecUint(uvec4 a, uint b) {\r\n    uvec4 v;\r\n    v = a * b;\r\n    v = a / b;\r\n    v = a + b;\r\n    v = a - b;\r\n    v = a & b;\r\n    v = a | b;\r\n    v = a ^ b;\r\n    v = a >> b;\r\n    v = a << b;\r\n}\r\n\r\nvoid testBinOpUintUVec(uint a, uvec4 b) {\r\n    uvec4 v;\r\n    v = a * b;\r\n    v = a + b;\r\n    v = a - b;\r\n    v = a & b;\r\n    v = a | b;\r\n    v = a ^ b;\r\n}\r\n\r\nvoid testBinOpMatMat(mat3 a, mat3 b) {\r\n    mat3 v;\r\n    bool c;\r\n    v = a / b;\r\n    v = a * b;\r\n    v = a + b;\r\n    v = a - b;\r\n    c = a == b;\r\n    c = a != b;\r\n}\r\n\r\nvoid testBinOpMatFloat(float a, mat3 b) {\r\n    mat3 v;\r\n    v = a / b;\r\n    v = a * b;\r\n    v = a + b;\r\n    v = a - b;\r\n\r\n    v = b / a;\r\n    v = b * a;\r\n    v = b + a;\r\n    v = b - a;\r\n}\r\n\r\nvoid testUnaryOpMat(mat3 a) {\r\n    mat3 v;\r\n    v = -a;\r\n    v = --a;\r\n    v = a--;\r\n}\r\n\r\nvoid testStructConstructor() {\r\n    struct BST {\r\n        int data;\r\n    };\r\n\r\n    BST tree = BST(1);\r\n}\r\n\r\nvoid testNonScalarToScalarConstructor() {\r\n    float f = float(mat2(1.0));\r\n}\r\n\r\nvoid testArrayConstructor() {\r\n    float tree[1] = float[1](0.0);\r\n}\r\n\r\nvoid testFreestandingConstructor() {\r\n    vec4(1.0);\r\n}\r\n\r\nvoid testNonImplicitCastVectorCast() {\r\n    uint a = 1;\r\n    ivec4 b = ivec4(a);\r\n}\r\n\r\nfloat global;\r\nvoid privatePointer(inout float a) {}\r\n\r\nvoid ternary(bool a) {\r\n    uint b = a ? 0 : 1u;\r\n    uint c = a ? 0u : 1;\r\n\r\n    uint nested = a ? (a ? (a ? 2u : 3) : 4u) : 5;\r\n}\r\n\r\nvoid testMatrixMultiplication(mat4x3 a, mat4x4 b) {\r\n    mat4x3 c = a * b;\r\n}\r\n\r\nlayout(std430, binding = 0) buffer a_buf {\r\n    float a[];\r\n};\r\n\r\nvoid testLength() {\r\n    int len = a.length();\r\n}\r\n\r\nvoid testConstantLength(float a[4u]) {\r\n    int len = a.length();\r\n}\r\n\r\nout vec4 o_color;\r\nvoid main() {\r\n    privatePointer(global);\r\n    o_color.rgba = vec4(1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/fma.frag",
    "content": "#version 440 core\r\n\r\nstruct Mat4x3 { vec4 mx; vec4 my; vec4 mz; };\r\nvoid Fma(inout Mat4x3 d, Mat4x3 m, float s) { d.mx += m.mx * s; d.my += m.my * s; d.mz += m.mz * s; }\r\n\r\nout vec4 o_color;\r\nvoid main() {\r\n    o_color.rgba = vec4(1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/global-constant-array.vert",
    "content": "#version 450 core\r\n\r\nuint i;\r\nconst float[2] array = { 1.0, 2.0 };\r\n\r\nvoid main() { array[i]; }\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/images.frag",
    "content": "#version 460 core\r\n\r\nlayout(rgba8, binding = 0) uniform image1D img1D;\r\nlayout(rgba8, binding = 1) uniform image2D img2D;\r\nlayout(rgba8, binding = 2) uniform image3D img3D;\r\n// layout(rgba8, binding = 3) uniform imageCube imgCube;\r\nlayout(rgba8, binding = 4) uniform image1DArray img1DArray;\r\nlayout(rgba8, binding = 5) uniform image2DArray img2DArray;\r\n// layout(rgba8, binding = 6) uniform imageCubeArray imgCubeArray;\r\n\r\nlayout(rgba8, binding = 7) readonly uniform image2D imgReadOnly;\r\nlayout(rgba8, binding = 8) writeonly uniform image2D imgWriteOnly;\r\nlayout(rgba8, binding = 9) writeonly readonly uniform image2D imgWriteReadOnly;\r\n\r\nvoid testImg1D(in int coord) {\r\n    int size = imageSize(img1D);\r\n    imageStore(img1D, coord, vec4(2));\r\n    vec4 c = imageLoad(img1D, coord);\r\n}\r\n\r\nvoid testImg1DArray(in ivec2 coord) {\r\n    vec2 size = imageSize(img1DArray);\r\n    vec4 c = imageLoad(img1DArray, coord);\r\n    imageStore(img1DArray, coord, vec4(2));\r\n}\r\n\r\nvoid testImg2D(in ivec2 coord) {\r\n    vec2 size = imageSize(img2D);\r\n    vec4 c = imageLoad(img2D, coord);\r\n    imageStore(img2D, coord, vec4(2));\r\n}\r\n\r\nvoid testImg2DArray(in ivec3 coord) {\r\n    vec3 size = imageSize(img2DArray);\r\n    vec4 c = imageLoad(img2DArray, coord);\r\n    imageStore(img2DArray, coord, vec4(2));\r\n}\r\n\r\nvoid testImg3D(in ivec3 coord) {\r\n    vec3 size = imageSize(img3D);\r\n    vec4 c = imageLoad(img3D, coord);\r\n    imageStore(img3D, coord, vec4(2));\r\n}\r\n\r\n// Naga doesn't support cube images and it's usefulness\r\n// is questionable, so they won't be supported for now\r\n// void testImgCube(in ivec3 coord) {\r\n//     vec2 size = imageSize(imgCube);\r\n//     vec4 c = imageLoad(imgCube, coord);\r\n//     imageStore(imgCube, coord, vec4(2));\r\n// }\r\n//\r\n// void testImgCubeArray(in ivec3 coord) {\r\n//    vec3 size = imageSize(imgCubeArray);\r\n//     vec4 c = imageLoad(imgCubeArray, coord);\r\n//     imageStore(imgCubeArray, coord, vec4(2));\r\n// }\r\n\r\nvoid testImgReadOnly(in ivec2 coord) {\r\n    vec2 size = imageSize(img2D);\r\n    vec4 c = imageLoad(imgReadOnly, coord);\r\n}\r\n\r\nvoid testImgWriteOnly(in ivec2 coord) {\r\n    vec2 size = imageSize(img2D);\r\n    imageStore(imgWriteOnly, coord, vec4(2));\r\n}\r\n\r\nvoid testImgWriteReadOnly(in ivec2 coord) {\r\n    vec2 size = imageSize(imgWriteReadOnly);\r\n}\r\n\r\nvoid main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/long-form-matrix.vert",
    "content": "// ISSUE: #1064\r\n#version 450\r\n\r\nvoid main() {\r\n    // Sane ways to build a matrix\r\n    mat2 splat = mat2(1);\r\n    mat2 normal = mat2(vec2(1), vec2(2));\r\n    mat2x4 from_matrix = mat2x4(mat3(1.0));\r\n\r\n    // This is a little bit weirder but still makes some sense\r\n    // Since this matrix has 2 rows we take two numbers to make a column\r\n    // and we do this twice because we 2 columns.\r\n    // Final result in wgsl should be:\r\n    // mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0))\r\n    mat2 a = mat2(1, 2, 3, 4);\r\n\r\n    // ???\r\n    // Glsl has decided that for it's matrix constructor arguments it doesn't\r\n    // take them as is but instead flattens them so the `b` matrix is\r\n    // equivalent to the `a` matrix but in value and semantics\r\n    mat2 b = mat2(1, vec2(2, 3), 4);\r\n    mat3 c = mat3(1, 2, 3, vec3(1), vec3(1));\r\n    mat3 d = mat3(vec2(2), 1, vec3(1), vec3(1));\r\n    mat4 e = mat4(vec2(2), vec4(1), vec2(2), vec4(1), vec4(1));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/math-functions.vert",
    "content": "#version 450\r\n\r\nvoid main() {\r\n    vec4 a = vec4(1.0);\r\n    vec4 b = vec4(2.0);\r\n    mat4 m = mat4(a, b, a, b);\r\n    int i = 5;\r\n\r\n    vec4 ceilOut = ceil(a);\r\n    vec4 roundOut = round(a);\r\n    vec4 floorOut = floor(a);\r\n    vec4 fractOut = fract(a);\r\n    vec4 truncOut = trunc(a);\r\n    vec4 sinOut = sin(a);\r\n    vec4 absOut = abs(a);\r\n    vec4 sqrtOut = sqrt(a);\r\n    vec4 inversesqrtOut = inversesqrt(a);\r\n    vec4 expOut = exp(a);\r\n    vec4 exp2Out = exp2(a);\r\n    vec4 signOut = sign(a);\r\n    mat4 transposeOut = transpose(m);\r\n    // TODO: support inverse function in wgsl output\r\n    // mat4 inverseOut = inverse(m);\r\n    vec4 normalizeOut = normalize(a);\r\n    vec4 sinhOut = sinh(a);\r\n    vec4 cosOut = cos(a);\r\n    vec4 coshOut = cosh(a);\r\n    vec4 tanOut = tan(a);\r\n    vec4 tanhOut = tanh(a);\r\n    vec4 acosOut = acos(a);\r\n    vec4 asinOut = asin(a);\r\n    vec4 logOut = log(a);\r\n    vec4 log2Out = log2(a);\r\n    float lengthOut = length(a);\r\n    float determinantOut = determinant(m);\r\n    int bitCountOut = bitCount(i);\r\n    int bitfieldReverseOut = bitfieldReverse(i);\r\n    float atanOut = atan(a.x);\r\n    float atan2Out = atan(a.x, a.y);\r\n    float modOut = mod(a.x, b.x);\r\n    vec4 powOut = pow(a, b);\r\n    float dotOut = dot(a, b);\r\n    vec4 maxOut = max(a, b);\r\n    vec4 minOut = min(a, b);\r\n    vec4 reflectOut = reflect(a, b);\r\n    vec3 crossOut = cross(a.xyz, b.xyz);\r\n    mat4 outerProductOut = outerProduct(a, b);\r\n    float distanceOut = distance(a, b);\r\n    vec4 stepOut = step(a, b);\r\n    // TODO: support out params in wgsl output\r\n    // vec4 modfOut = modf(a, b);\r\n    // vec4 frexpOut = frexp(a, b);\r\n    // float ldexpOut = ldexp(a.x, i);\r\n    vec4 rad = radians(a);\r\n    float deg = degrees(a.x);\r\n    float smoothStepScalar = smoothstep(0.0, 1.0, 0.5);\r\n    vec4 smoothStepVector = smoothstep(vec4(0.0), vec4(1.0), vec4(0.5));\r\n    vec4 smoothStepMixed = smoothstep(0.0, 1.0, vec4(0.5));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/prepostfix.frag",
    "content": "#version 450 core\r\n\r\nvoid main() {\r\n\tint scalar_target;\r\n\tint scalar = 1;\r\n\tscalar_target = scalar++;\r\n\tscalar_target = --scalar;\r\n\r\n\tuvec2 vec_target;\r\n\tuvec2 vec = uvec2(1);\r\n\tvec_target = vec--;\r\n\tvec_target = ++vec;\r\n\r\n\tmat4x3 mat_target;\r\n\tmat4x3 mat = mat4x3(1);\r\n\tmat_target = mat++;\r\n\tmat_target = --mat;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/quad_glsl.frag",
    "content": "#version 450\r\nlayout(location = 0) in vec2 v_uv;\r\n#ifdef TEXTURE\r\nlayout(set = 0, binding = 0) uniform texture2D u_texture;\r\nlayout(set = 0, binding = 1) uniform sampler u_sampler;\r\n#endif\r\nlayout(location = 0) out vec4 o_color;\r\n\r\nvoid main() {\r\n#ifdef TEXTURE\r\n  o_color = texture(sampler2D(u_texture, u_sampler), v_uv);\r\n#else\r\n  o_color = vec4(1.0, 1.0, 1.0, 1.0);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/quad_glsl.vert",
    "content": "#version 450\r\nconst float c_scale = 1.2;\r\n\r\nlayout(location = 0) in vec2 a_pos;\r\nlayout(location = 1) in vec2 a_uv;\r\nlayout(location = 0) out vec2 v_uv;\r\n\r\nvoid main() {\r\n  v_uv = a_uv;\r\n  gl_Position = vec4(c_scale * a_pos, 0.0, 1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/sampler-functions.frag",
    "content": "#version 440\r\nprecision mediump float;\r\n\r\nfloat CalcShadowPCF1(texture2D T_P_t_TextureDepth, samplerShadow S_P_t_TextureDepth, in vec3 t_ProjCoord) {\r\n    float t_Res = 0.0f;\r\n    t_Res += texture(sampler2DShadow(T_P_t_TextureDepth, S_P_t_TextureDepth), t_ProjCoord.xyz) * (1.0 / 5.0);\r\n    return t_Res;\r\n}\r\n\r\nfloat CalcShadowPCF(texture2D T_P_t_TextureDepth, samplerShadow S_P_t_TextureDepth, in vec3 t_ProjCoord, in float t_Bias) {\r\n    t_ProjCoord.z += t_Bias;\r\n    return CalcShadowPCF1(T_P_t_TextureDepth, S_P_t_TextureDepth, t_ProjCoord.xyz);\r\n}\r\n\r\nvoid main() {\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/samplers.frag",
    "content": "#version 440 core\r\nprecision mediump float;\r\n\r\nlayout(set = 1, binding = 0) uniform texture1D tex1D;\r\nlayout(set = 1, binding = 1) uniform texture1DArray tex1DArray;\r\nlayout(set = 1, binding = 2) uniform texture2D tex2D;\r\nlayout(set = 1, binding = 3) uniform texture2DArray tex2DArray;\r\nlayout(set = 1, binding = 4) uniform textureCube texCube;\r\nlayout(set = 1, binding = 5) uniform textureCubeArray texCubeArray;\r\nlayout(set = 1, binding = 6) uniform texture3D tex3D;\r\nlayout(set = 1, binding = 7) uniform sampler samp;\r\n\r\n// WGSL doesn't have 1D depth samplers.\r\n#define HAS_1D_DEPTH_TEXTURES 0\r\n\r\n#if HAS_1D_DEPTH_TEXTURES\r\nlayout(set = 1, binding = 10) uniform texture1D tex1DShadow;\r\nlayout(set = 1, binding = 11) uniform texture1DArray tex1DArrayShadow;\r\n#endif\r\n\r\nlayout(set = 1, binding = 12) uniform texture2D tex2DShadow;\r\nlayout(set = 1, binding = 13) uniform texture2DArray tex2DArrayShadow;\r\nlayout(set = 1, binding = 14) uniform textureCube texCubeShadow;\r\nlayout(set = 1, binding = 15) uniform textureCubeArray texCubeArrayShadow;\r\nlayout(set = 1, binding = 16) uniform texture3D tex3DShadow;\r\nlayout(set = 1, binding = 17) uniform samplerShadow sampShadow;\r\n\r\nlayout(binding = 18) uniform texture2DMS tex2DMS;\r\nlayout(binding = 19) uniform texture2DMSArray tex2DMSArray;\r\n\r\n// Conventions for readability:\r\n//   1.0 = Shadow Ref\r\n//   2.0 = LOD Bias\r\n//   3.0 = Explicit LOD\r\n//   4.0 = Grad Derivatives\r\n//   5 = Offset\r\n//   6.0 = Proj W\r\n\r\nvoid testTex1D(in float coord) {\r\n    int size1D = textureSize(sampler1D(tex1D, samp), 0);\r\n    vec4 c;\r\n    c = texture(sampler1D(tex1D, samp), coord);\r\n    c = texture(sampler1D(tex1D, samp), coord, 2.0);\r\n    c = textureGrad(sampler1D(tex1D, samp), coord, 4.0, 4.0);\r\n    c = textureGradOffset(sampler1D(tex1D, samp), coord, 4.0, 4.0, 5);\r\n    c = textureLod(sampler1D(tex1D, samp), coord, 3.0);\r\n    c = textureLodOffset(sampler1D(tex1D, samp), coord, 3.0, 5);\r\n    c = textureOffset(sampler1D(tex1D, samp), coord, 5);\r\n    c = textureOffset(sampler1D(tex1D, samp), coord, 5, 2.0);\r\n    c = textureProj(sampler1D(tex1D, samp), vec2(coord, 6.0));\r\n    c = textureProj(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0));\r\n    c = textureProj(sampler1D(tex1D, samp), vec2(coord, 6.0), 2.0);\r\n    c = textureProj(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 2.0);\r\n    c = textureProjGrad(sampler1D(tex1D, samp), vec2(coord, 6.0), 4.0, 4.0);\r\n    c = textureProjGrad(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 4.0, 4.0);\r\n    c = textureProjGradOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 4.0, 4.0, 5);\r\n    c = textureProjGradOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 4.0, 4.0, 5);\r\n    c = textureProjLod(sampler1D(tex1D, samp), vec2(coord, 6.0), 3.0);\r\n    c = textureProjLod(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 3.0);\r\n    c = textureProjLodOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 3.0, 5);\r\n    c = textureProjLodOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 3.0, 5);\r\n    c = textureProjOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 5);\r\n    c = textureProjOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 5);\r\n    c = textureProjOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 5, 2.0);\r\n    c = textureProjOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 5, 2.0);\r\n    c = texelFetch(sampler1D(tex1D, samp), int(coord), 3);\r\n    c = texelFetchOffset(sampler1D(tex1D, samp), int(coord), 3, 5);\r\n}\r\n\r\n#if HAS_1D_DEPTH_TEXTURES\r\nvoid testTex1DShadow(float coord) {\r\n    int size1DShadow = textureSize(sampler1DShadow(tex1DShadow, sampShadow), 0);\r\n    float d;\r\n    d = texture(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0));\r\n    // d = texture(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 2.0);\r\n    d = textureGrad(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 4.0, 4.0);\r\n    d = textureGradOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 4.0, 4.0, 5);\r\n    d = textureLod(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 3.0);\r\n    d = textureLodOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 3.0, 5);\r\n    d = textureOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 5);\r\n    // d = textureOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 5, 2.0);\r\n    d = textureProj(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0));\r\n    // d = textureProj(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 2.0);\r\n    d = textureProjGrad(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 4.0, 4.0);\r\n    d = textureProjGradOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 4.0, 4.0, 5);\r\n    d = textureProjLod(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 3.0);\r\n    d = textureProjLodOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 3.0, 5);\r\n    d = textureProjOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 5);\r\n    // d = textureProjOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 5, 2.0);\r\n}\r\n#endif\r\n\r\nvoid testTex1DArray(in vec2 coord) {\r\n    ivec2 size1DArray = textureSize(sampler1DArray(tex1DArray, samp), 0);\r\n    vec4 c;\r\n    c = texture(sampler1DArray(tex1DArray, samp), coord);\r\n    c = texture(sampler1DArray(tex1DArray, samp), coord, 2.0);\r\n    c = textureGrad(sampler1DArray(tex1DArray, samp), coord, 4.0, 4.0);\r\n    c = textureGradOffset(sampler1DArray(tex1DArray, samp), coord, 4.0, 4.0, 5);\r\n    c = textureLod(sampler1DArray(tex1DArray, samp), coord, 3.0);\r\n    c = textureLodOffset(sampler1DArray(tex1DArray, samp), coord, 3.0, 5);\r\n    c = textureOffset(sampler1DArray(tex1DArray, samp), coord, 5);\r\n    c = textureOffset(sampler1DArray(tex1DArray, samp), coord, 5, 2.0);\r\n    c = texelFetch(sampler1DArray(tex1DArray, samp), ivec2(coord), 3);\r\n    c = texelFetchOffset(sampler1DArray(tex1DArray, samp), ivec2(coord), 3, 5);\r\n}\r\n\r\n#if HAS_1D_DEPTH_TEXTURES\r\nvoid testTex1DArrayShadow(in vec2 coord) {\r\n    ivec2 size1DArrayShadow = textureSize(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), 0);\r\n    float d;\r\n    d = texture(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0));\r\n    d = textureGrad(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 4.0, 4.0);\r\n    d = textureGradOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 4.0, 4.0, 5);\r\n    d = textureLod(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 3.0);\r\n    d = textureLodOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 3.0, 5);\r\n    d = textureOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 5);\r\n    // d = textureOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 5, 2.0);\r\n}\r\n#endif\r\n\r\nvoid testTex2D(in vec2 coord) {\r\n    ivec2 size2D = textureSize(sampler2D(tex2D, samp), 0);\r\n    vec4 c;\r\n    c = texture(sampler2D(tex2D, samp), coord);\r\n    c = texture(sampler2D(tex2D, samp), coord, 2.0);\r\n    c = textureGrad(sampler2D(tex2D, samp), coord, vec2(4.0), vec2(4.0));\r\n    c = textureGradOffset(sampler2D(tex2D, samp), coord, vec2(4.0), vec2(4.0), ivec2(5));\r\n    c = textureLod(sampler2D(tex2D, samp), coord, 3.0);\r\n    c = textureLodOffset(sampler2D(tex2D, samp), coord, 3.0, ivec2(5));\r\n    c = textureOffset(sampler2D(tex2D, samp), coord, ivec2(5));\r\n    c = textureOffset(sampler2D(tex2D, samp), coord, ivec2(5), 2.0);\r\n    c = textureProj(sampler2D(tex2D, samp), vec3(coord, 6.0));\r\n    c = textureProj(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0));\r\n    c = textureProj(sampler2D(tex2D, samp), vec3(coord, 6.0), 2.0);\r\n    c = textureProj(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), 2.0);\r\n    c = textureProjGrad(sampler2D(tex2D, samp), vec3(coord, 6.0), vec2(4.0), vec2(4.0));\r\n    c = textureProjGrad(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), vec2(4.0), vec2(4.0));\r\n    c = textureProjGradOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), vec2(4.0), vec2(4.0), ivec2(5));\r\n    c = textureProjGradOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), vec2(4.0), vec2(4.0), ivec2(5));\r\n    c = textureProjLod(sampler2D(tex2D, samp), vec3(coord, 6.0), 3.0);\r\n    c = textureProjLod(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), 3.0);\r\n    c = textureProjLodOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), 3.0, ivec2(5));\r\n    c = textureProjLodOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), 3.0, ivec2(5));\r\n    c = textureProjOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), ivec2(5));\r\n    c = textureProjOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), ivec2(5));\r\n    c = textureProjOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), ivec2(5), 2.0);\r\n    c = textureProjOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), ivec2(5), 2.0);\r\n    c = texelFetch(sampler2D(tex2D, samp), ivec2(coord), 3);\r\n    c = texelFetchOffset(sampler2D(tex2D, samp), ivec2(coord), 3, ivec2(5));\r\n}\r\n\r\nvoid testTex2DShadow(vec2 coord) {\r\n    ivec2 size2DShadow = textureSize(sampler2DShadow(tex2DShadow, sampShadow), 0);\r\n    float d;\r\n    d = texture(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0));\r\n    // d = texture(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), 2.0);\r\n    d = textureGrad(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), vec2(4.0), vec2(4.0));\r\n    d = textureGradOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), vec2(4.0), vec2(4.0), ivec2(5));\r\n    d = textureLod(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), 3.0);\r\n    d = textureLodOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), 3.0, ivec2(5));\r\n    d = textureOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), ivec2(5));\r\n    // d = textureOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), ivec2(5), 2.0);\r\n    d = textureProj(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0));\r\n    // d = textureProj(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), 2.0);\r\n    d = textureProjGrad(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), vec2(4.0), vec2(4.0));\r\n    d = textureProjGradOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), vec2(4.0), vec2(4.0), ivec2(5));\r\n    d = textureProjLod(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), 3.0);\r\n    d = textureProjLodOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), 3.0, ivec2(5));\r\n    d = textureProjOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), ivec2(5));\r\n    // d = textureProjOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), ivec2(5), 2.0);\r\n}\r\n\r\nvoid testTex2DArray(in vec3 coord) {\r\n    ivec3 size2DArray = textureSize(sampler2DArray(tex2DArray, samp), 0);\r\n    vec4 c;\r\n    c = texture(sampler2DArray(tex2DArray, samp), coord);\r\n    c = texture(sampler2DArray(tex2DArray, samp), coord, 2.0);\r\n    c = textureGrad(sampler2DArray(tex2DArray, samp), coord, vec2(4.0), vec2(4.0));\r\n    c = textureGradOffset(sampler2DArray(tex2DArray, samp), coord, vec2(4.0), vec2(4.0), ivec2(5));\r\n    c = textureLod(sampler2DArray(tex2DArray, samp), coord, 3.0);\r\n    c = textureLodOffset(sampler2DArray(tex2DArray, samp), coord, 3.0, ivec2(5));\r\n    c = textureOffset(sampler2DArray(tex2DArray, samp), coord, ivec2(5));\r\n    c = textureOffset(sampler2DArray(tex2DArray, samp), coord, ivec2(5), 2.0);\r\n    c = texelFetch(sampler2DArray(tex2DArray, samp), ivec3(coord), 3);\r\n    c = texelFetchOffset(sampler2DArray(tex2DArray, samp), ivec3(coord), 3, ivec2(5));\r\n}\r\n\r\nvoid testTex2DArrayShadow(in vec3 coord) {\r\n    ivec3 size2DArrayShadow = textureSize(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), 0);\r\n    float d;\r\n    d = texture(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0));\r\n    d = textureGrad(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0), vec2(4.0), vec2(4.0));\r\n    d = textureGradOffset(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0), vec2(4.0), vec2(4.0), ivec2(5));\r\n    d = textureOffset(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0), ivec2(5));\r\n}\r\n\r\nvoid testTexCube(in vec3 coord) {\r\n    ivec2 sizeCube = textureSize(samplerCube(texCube, samp), 0);\r\n    vec4 c;\r\n    c = texture(samplerCube(texCube, samp), coord);\r\n    c = texture(samplerCube(texCube, samp), coord, 2.0);\r\n    c = textureGrad(samplerCube(texCube, samp), coord, vec3(4.0), vec3(4.0));\r\n    c = textureLod(samplerCube(texCube, samp), coord, 3.0);\r\n}\r\n\r\nvoid testTexCubeShadow(in vec3 coord) {\r\n    ivec2 sizeCubeShadow = textureSize(samplerCubeShadow(texCubeShadow, sampShadow), 0);\r\n    float d;\r\n    d = texture(samplerCubeShadow(texCubeShadow, sampShadow), vec4(coord, 1.0));\r\n    d = textureGrad(samplerCubeShadow(texCubeShadow, sampShadow), vec4(coord, 1.0), vec3(4.0), vec3(4.0));\r\n}\r\n\r\nvoid testTexCubeArray(in vec4 coord) {\r\n    ivec3 sizeCubeArray = textureSize(samplerCubeArray(texCubeArray, samp), 0);\r\n    vec4 c;\r\n    c = texture(samplerCubeArray(texCubeArray, samp), coord);\r\n    c = texture(samplerCubeArray(texCubeArray, samp), coord, 2.0);\r\n    c = textureGrad(samplerCubeArray(texCubeArray, samp), coord, vec3(4.0), vec3(4.0));\r\n    c = textureLod(samplerCubeArray(texCubeArray, samp), coord, 3.0);\r\n}\r\n\r\nvoid testTexCubeArrayShadow(in vec4 coord) {\r\n    ivec3 sizeCubeArrayShadow = textureSize(samplerCubeArrayShadow(texCubeArrayShadow, sampShadow), 0);\r\n    float d;\r\n    d = texture(samplerCubeArrayShadow(texCubeArrayShadow, sampShadow), coord, 1.0);\r\n    // The rest of the variants aren't defined by GLSL.\r\n}\r\n\r\nvoid testTex3D(in vec3 coord) {\r\n    ivec3 size3D = textureSize(sampler3D(tex3D, samp), 0);\r\n    vec4 c;\r\n    c = texture(sampler3D(tex3D, samp), coord);\r\n    c = texture(sampler3D(tex3D, samp), coord, 2.0);\r\n    c = textureProj(sampler3D(tex3D, samp), vec4(coord, 6.0));\r\n    c = textureProj(sampler3D(tex3D, samp), vec4(coord, 6.0), 2.0);\r\n    c = textureProjOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), ivec3(5));\r\n    c = textureProjOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), ivec3(5), 2.0);\r\n    c = textureProjLod(sampler3D(tex3D, samp), vec4(coord, 6.0), 3.0);\r\n    c = textureProjLodOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), 3.0, ivec3(5));\r\n    c = textureProjGrad(sampler3D(tex3D, samp), vec4(coord, 6.0), vec3(4.0), vec3(4.0));\r\n    c = textureProjGradOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), vec3(4.0), vec3(4.0), ivec3(5));\r\n    c = textureGrad(sampler3D(tex3D, samp), coord, vec3(4.0), vec3(4.0));\r\n    c = textureGradOffset(sampler3D(tex3D, samp), coord, vec3(4.0), vec3(4.0), ivec3(5));\r\n    c = textureLod(sampler3D(tex3D, samp), coord, 3.0);\r\n    c = textureLodOffset(sampler3D(tex3D, samp), coord, 3.0, ivec3(5));\r\n    c = textureOffset(sampler3D(tex3D, samp), coord, ivec3(5));\r\n    c = textureOffset(sampler3D(tex3D, samp), coord, ivec3(5), 2.0);\r\n    c = texelFetch(sampler3D(tex3D, samp), ivec3(coord), 3);\r\n    c = texelFetchOffset(sampler3D(tex3D, samp), ivec3(coord), 3, ivec3(5));\r\n}\r\n\r\nvoid testTex2DMS(in vec2 coord) {\r\n    ivec2 size2DMS = textureSize(sampler2DMS(tex2DMS, samp));\r\n    vec4 c;\r\n    c = texelFetch(sampler2DMS(tex2DMS, samp), ivec2(coord), 3);\r\n}\r\n\r\nvoid testTex2DMSArray(in vec3 coord) {\r\n    ivec3 size2DMSArray = textureSize(sampler2DMSArray(tex2DMSArray, samp));\r\n    vec4 c;\r\n    c = texelFetch(sampler2DMSArray(tex2DMSArray, samp), ivec3(coord), 3);\r\n}\r\n\r\nvoid main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/statements.frag",
    "content": "#version 460 core\r\n\r\nvoid switchEmpty(int a) {\r\n    switch (a) {}\r\n\r\n    return;\r\n}\r\n\r\nvoid switchNoDefault(int a) {\r\n    switch (a) {\r\n        case 0:\r\n            break;\r\n    }\r\n\r\n    return;\r\n}\r\n\r\nvoid switchNoLastBreak(int a) {\r\n    switch (a) {\r\n        default:\r\n            int b = a;\r\n    }\r\n\r\n    return;\r\n}\r\n\r\nvoid main() {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/glsl/swizzle_write.frag",
    "content": "#version 450\r\n\r\nvoid foo(inout vec2 p) {}\r\n\r\nvoid main() {\r\n    vec3 x = vec3(2.0);\r\n    x.zxy.xy = vec2(3.0, 4.0);\r\n    x.rg *= 5.0;\r\n    x.zy++;\r\n    foo(x.xz);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/image.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tdebug: true,\r\n\t),\r\n\tglsl_exclude_list: [\"depth_load\", \"depth_no_comparison\", \"levels_queries\"]\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/image.wgsl",
    "content": "@group(0) @binding(0)\r\nvar image_mipmapped_src: texture_2d<u32>;\r\n@group(0) @binding(3)\r\nvar image_multisampled_src: texture_multisampled_2d<u32>;\r\n@group(0) @binding(4)\r\nvar image_depth_multisampled_src: texture_depth_multisampled_2d;\r\n@group(0) @binding(1)\r\nvar image_storage_src: texture_storage_2d<rgba8uint, read>;\r\n@group(0) @binding(5)\r\nvar image_array_src: texture_2d_array<u32>;\r\n@group(0) @binding(6)\r\nvar image_dup_src: texture_storage_1d<r32uint,read>; // for #1307\r\n@group(0) @binding(7)\r\nvar image_1d_src: texture_1d<u32>;\r\n@group(0) @binding(2)\r\nvar image_dst: texture_storage_1d<r32uint,write>;\r\n\r\n@compute @workgroup_size(16)\r\nfn main(\r\n    @builtin(local_invocation_id) local_id: vec3<u32>,\r\n    //TODO: https://github.com/gpuweb/gpuweb/issues/1590\r\n    //@builtin(workgroup_size) wg_size: vec3<u32>\r\n) {\r\n    let dim = textureDimensions(image_storage_src);\r\n    let itc = dim * vec2<i32>(local_id.xy) % vec2<i32>(10, 20);\r\n    let value1 = textureLoad(image_mipmapped_src, itc, i32(local_id.z));\r\n    let value2 = textureLoad(image_multisampled_src, itc, i32(local_id.z));\r\n    let value4 = textureLoad(image_storage_src, itc);\r\n    let value5 = textureLoad(image_array_src, itc, i32(local_id.z), i32(local_id.z) + 1);\r\n    let value6 = textureLoad(image_1d_src, i32(local_id.x), i32(local_id.z));\r\n    textureStore(image_dst, itc.x, value1 + value2 + value4 + value5 + value6);\r\n}\r\n\r\n@compute @workgroup_size(16, 1, 1)\r\nfn depth_load(@builtin(local_invocation_id) local_id: vec3<u32>) {\r\n    let dim: vec2<i32> = textureDimensions(image_storage_src);\r\n    let itc: vec2<i32> = ((dim * vec2<i32>(local_id.xy)) % vec2<i32>(10, 20));\r\n    let val: f32 = textureLoad(image_depth_multisampled_src, itc, i32(local_id.z));\r\n    textureStore(image_dst, itc.x, vec4<u32>(u32(val)));\r\n    return;\r\n}\r\n\r\n@group(0) @binding(0)\r\nvar image_1d: texture_1d<f32>;\r\n@group(0) @binding(1)\r\nvar image_2d: texture_2d<f32>;\r\n@group(0) @binding(2)\r\nvar image_2d_array: texture_2d_array<f32>;\r\n@group(0) @binding(3)\r\nvar image_cube: texture_cube<f32>;\r\n@group(0) @binding(4)\r\nvar image_cube_array: texture_cube_array<f32>;\r\n@group(0) @binding(5)\r\nvar image_3d: texture_3d<f32>;\r\n@group(0) @binding(6)\r\nvar image_aa: texture_multisampled_2d<f32>;\r\n\r\n@vertex\r\nfn queries() -> @builtin(position) vec4<f32> {\r\n    let dim_1d = textureDimensions(image_1d);\r\n    let dim_1d_lod = textureDimensions(image_1d, i32(dim_1d));\r\n    let dim_2d = textureDimensions(image_2d);\r\n    let dim_2d_lod = textureDimensions(image_2d, 1);\r\n    let dim_2d_array = textureDimensions(image_2d_array);\r\n    let dim_2d_array_lod = textureDimensions(image_2d_array, 1);\r\n    let dim_cube = textureDimensions(image_cube);\r\n    let dim_cube_lod = textureDimensions(image_cube, 1);\r\n    let dim_cube_array = textureDimensions(image_cube_array);\r\n    let dim_cube_array_lod = textureDimensions(image_cube_array, 1);\r\n    let dim_3d = textureDimensions(image_3d);\r\n    let dim_3d_lod = textureDimensions(image_3d, 1);\r\n    let dim_2s_ms = textureDimensions(image_aa);\r\n\r\n    let sum = dim_1d + dim_2d.y + dim_2d_lod.y + dim_2d_array.y + dim_2d_array_lod.y +\r\n        dim_cube.y + dim_cube_lod.y + dim_cube_array.y + dim_cube_array_lod.y +\r\n        dim_3d.z + dim_3d_lod.z;\r\n    return vec4<f32>(f32(sum));\r\n}\r\n\r\n@vertex\r\nfn levels_queries() -> @builtin(position) vec4<f32> {\r\n    let num_levels_2d = textureNumLevels(image_2d);\r\n    let num_levels_2d_array = textureNumLevels(image_2d_array);\r\n    let num_layers_2d = textureNumLayers(image_2d_array);\r\n    let num_levels_cube = textureNumLevels(image_cube);\r\n    let num_levels_cube_array = textureNumLevels(image_cube_array);\r\n    let num_layers_cube = textureNumLayers(image_cube_array);\r\n    let num_levels_3d = textureNumLevels(image_3d);\r\n    let num_samples_aa = textureNumSamples(image_aa);\r\n\r\n    let sum = num_layers_2d + num_layers_cube + num_samples_aa +\r\n        num_levels_2d + num_levels_2d_array + num_levels_3d + num_levels_cube + num_levels_cube_array;\r\n    return vec4<f32>(f32(sum));\r\n}\r\n\r\n@group(1) @binding(0)\r\nvar sampler_reg: sampler;\r\n\r\n@fragment\r\nfn texture_sample() -> @location(0) vec4<f32> {\r\n    let tc = vec2<f32>(0.5);\r\n    let level = 2.3;\r\n    let s1d = textureSample(image_1d, sampler_reg, tc.x);\r\n    let s2d = textureSample(image_2d, sampler_reg, tc);\r\n    let s2d_offset = textureSample(image_2d, sampler_reg, tc, vec2<i32>(3, 1));\r\n    let s2d_level = textureSampleLevel(image_2d, sampler_reg, tc, level);\r\n    let s2d_level_offset = textureSampleLevel(image_2d, sampler_reg, tc, level, vec2<i32>(3, 1));\r\n    let s2d_bias_offset = textureSampleBias(image_2d, sampler_reg, tc, 2.0, vec2<i32>(3, 1));\r\n    return s1d + s2d + s2d_offset + s2d_level + s2d_level_offset;\r\n}\r\n\r\n@group(1) @binding(1)\r\nvar sampler_cmp: sampler_comparison;\r\n@group(1) @binding(2)\r\nvar image_2d_depth: texture_depth_2d;\r\n@group(1) @binding(3)\r\nvar image_cube_depth: texture_depth_cube;\r\n\r\n@fragment\r\nfn texture_sample_comparison() -> @location(0) f32 {\r\n    let tc = vec2<f32>(0.5);\r\n    let dref = 0.5;\r\n    let s2d_depth = textureSampleCompare(image_2d_depth, sampler_cmp, tc, dref);\r\n    let s2d_depth_level = textureSampleCompareLevel(image_2d_depth, sampler_cmp, tc, dref);\r\n    let scube_depth_level = textureSampleCompareLevel(image_cube_depth, sampler_cmp, vec3<f32>(0.5), dref);\r\n    return s2d_depth + s2d_depth_level;\r\n}\r\n\r\n@fragment\r\nfn gather() -> @location(0) vec4<f32> {\r\n    let tc = vec2<f32>(0.5);\r\n    let dref = 0.5;\r\n    let s2d = textureGather(1, image_2d, sampler_reg, tc);\r\n    let s2d_offset = textureGather(3, image_2d, sampler_reg, tc, vec2<i32>(3, 1));\r\n    let s2d_depth = textureGatherCompare(image_2d_depth, sampler_cmp, tc, dref);\r\n    let s2d_depth_offset = textureGatherCompare(image_2d_depth, sampler_cmp, tc, dref, vec2<i32>(3, 1));\r\n    return s2d + s2d_offset + s2d_depth + s2d_depth_offset;\r\n}\r\n\r\n@fragment\r\nfn depth_no_comparison() -> @location(0) vec4<f32> {\r\n    let tc = vec2<f32>(0.5);\r\n    let s2d = textureSample(image_2d_depth, sampler_reg, tc);\r\n    let s2d_gather = textureGather(image_2d_depth, sampler_reg, tc);\r\n    return s2d + s2d_gather;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/interface.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tcapabilities: [ Shader, SampleRateShading ],\r\n\t\tadjust_coordinate_space: false,\r\n\t\tforce_point_size: true,\r\n\t\tclamp_frag_depth: true,\r\n\t\tseparate_entry_points: true,\r\n\t),\r\n\thlsl: (\r\n\t\tshader_model: V5_1,\r\n\t\tbinding_map: {},\r\n\t\tfake_missing_bindings: false,\r\n\t\tspecial_constants_binding: Some((space: 1, register: 0)),\r\n\t),\r\n\twgsl: (\r\n\t\texplicit_types: true,\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 1),\r\n\t\tper_stage_map: (),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n\tmsl_pipeline: (\r\n\t\tallow_point_size: true,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/interface.wgsl",
    "content": "// Testing various parts of the pipeline interface: locations, built-ins, and entry points\r\n\r\nstruct VertexOutput {\r\n    @builtin(position) @invariant position: vec4<f32>,\r\n    @location(1) _varying: f32,\r\n}\r\n\r\n@vertex\r\nfn vertex(\r\n    @builtin(vertex_index) vertex_index: u32,\r\n    @builtin(instance_index) instance_index: u32,\r\n    @location(10) color: u32,\r\n) -> VertexOutput {\r\n    let tmp = vertex_index + instance_index + color;\r\n    return VertexOutput(vec4<f32>(1.0), f32(tmp));\r\n}\r\n\r\nstruct FragmentOutput {\r\n    @builtin(frag_depth) depth: f32,\r\n    @builtin(sample_mask) sample_mask: u32,\r\n    @location(0) color: f32,\r\n}\r\n\r\n@fragment\r\nfn fragment(\r\n    in: VertexOutput,\r\n    @builtin(front_facing) front_facing: bool,\r\n    @builtin(sample_index) sample_index: u32,\r\n    @builtin(sample_mask) sample_mask: u32,\r\n) -> FragmentOutput {\r\n    let mask = sample_mask & (1u << sample_index);\r\n    let color = select(0.0, 1.0, front_facing);\r\n    return FragmentOutput(in._varying, mask, color);\r\n}\r\n\r\nvar<workgroup> output: array<u32, 1>;\r\n\r\n@compute @workgroup_size(1)\r\nfn compute(\r\n    @builtin(global_invocation_id) global_id: vec3<u32>,\r\n    @builtin(local_invocation_id) local_id: vec3<u32>,\r\n    @builtin(local_invocation_index) local_index: u32,\r\n    @builtin(workgroup_id) wg_id: vec3<u32>,\r\n    @builtin(num_workgroups) num_wgs: vec3<u32>,\r\n) {\r\n    output[0] = global_id.x + local_id.x + local_index + wg_id.x + num_wgs.x;\r\n}\r\n\r\nstruct Input1 {\r\n    @builtin(vertex_index) index: u32,\r\n}\r\n\r\nstruct Input2 {\r\n    @builtin(instance_index) index: u32,\r\n}\r\n\r\n@vertex\r\nfn vertex_two_structs(in1: Input1, in2: Input2) -> @builtin(position) @invariant vec4<f32> {\r\n    var index = 2u;\r\n    return vec4<f32>(f32(in1.index), f32(in2.index), f32(index), 0.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/interpolate.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tcapabilities: [ Shader, SampleRateShading ],\r\n\t\tdebug: true,\r\n\t\tforce_point_size: true,\r\n\t\tadjust_coordinate_space: true,\r\n\t),\r\n\tglsl: (\r\n\t\tversion: Desktop(400),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: {},\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/interpolate.wgsl",
    "content": "//TODO: merge with \"interface\"?\r\n\r\nstruct FragmentInput {\r\n  @builtin(position) position: vec4<f32>,\r\n  @location(0) @interpolate(flat) _flat : u32,\r\n  @location(1) @interpolate(linear) _linear : f32,\r\n  @location(2) @interpolate(linear, centroid) linear_centroid : vec2<f32>,\r\n  @location(3) @interpolate(linear, sample) linear_sample : vec3<f32>,\r\n  @location(4) @interpolate(perspective) perspective : vec4<f32>,\r\n  @location(5) @interpolate(perspective, centroid) perspective_centroid : f32,\r\n  @location(6) @interpolate(perspective, sample) perspective_sample : f32,\r\n}\r\n\r\n@vertex\r\nfn vert_main() -> FragmentInput {\r\n   var out: FragmentInput;\r\n\r\n   out.position = vec4<f32>(2.0, 4.0, 5.0, 6.0);\r\n   out._flat = 8u;\r\n   out._linear = 27.0;\r\n   out.linear_centroid = vec2<f32>(64.0, 125.0);\r\n   out.linear_sample = vec3<f32>(216.0, 343.0, 512.0);\r\n   out.perspective = vec4<f32>(729.0, 1000.0, 1331.0, 1728.0);\r\n   out.perspective_centroid = 2197.0;\r\n   out.perspective_sample = 2744.0;\r\n\r\n   return out;\r\n}\r\n\r\n@fragment\r\nfn frag_main(val : FragmentInput) { }\r\n"
  },
  {
    "path": "lib/naga/tests/in/lexical-scopes.wgsl",
    "content": "fn blockLexicalScope(a: bool) {\r\n    let a = 1.0;\r\n    {\r\n        let a = 2;\r\n        {\r\n            let a = true;\r\n        }\r\n        let test = a == 3;\r\n    }\r\n    let test = a == 2.0;\r\n}\r\n\r\nfn ifLexicalScope(a: bool) {\r\n    let a = 1.0;\r\n    if (a == 1.0) {\r\n        let a = true;\r\n    }\r\n    let test = a == 2.0;\r\n}\r\n\r\n\r\nfn loopLexicalScope(a: bool) {\r\n    let a = 1.0;\r\n    loop {\r\n        let a = true;\r\n    }\r\n    let test = a == 2.0;\r\n}\r\n\r\nfn forLexicalScope(a: f32) {\r\n    let a = false;\r\n    for (var a = 0; a < 1; a++) {\r\n        let a = 3.0;\r\n    }\r\n    let test = a == true;\r\n}\r\n\r\nfn whileLexicalScope(a: i32) {\r\n    while (a > 2) {\r\n        let a = false;\r\n    }\r\n    let test = a == 1;\r\n}\r\n\r\nfn switchLexicalScope(a: i32) {\r\n    switch (a) {\r\n        case 0 {\r\n            let a = false;\r\n        }\r\n        case 1 {\r\n            let a = 2.0;\r\n        }\r\n        default {\r\n            let a = true;\r\n        }\r\n    }\r\n    let test = a == 2;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/math-functions.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/math-functions.wgsl",
    "content": "@vertex\r\nfn main() {\r\n    let f = 1.0;\r\n    let v = vec4<f32>(0.0);\r\n    let a = degrees(f);\r\n    let b = radians(f);\r\n    let c = degrees(v);\r\n    let d = radians(v);\r\n    let e = saturate(v);\r\n    let const_dot = dot(vec2<i32>(), vec2<i32>());\r\n    let first_leading_bit_abs = firstLeadingBit(abs(0u));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/multiview.param.ron",
    "content": "(\r\n\tglsl_multiview: Some(2),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/multiview.wgsl",
    "content": "@vertex \r\nfn main(@builtin(view_index) view_index: i32) {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/multiview_webgl.param.ron",
    "content": "(\r\n    glsl: (\r\n\t\tversion: Embedded (\r\n            version: 300,\r\n\t\t\tis_webgl: true\r\n\t\t),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: {},\r\n\t),\r\n\tglsl_multiview: Some(2),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/multiview_webgl.wgsl",
    "content": "@vertex \r\nfn main(@builtin(view_index) view_index: i32) {}\r\n"
  },
  {
    "path": "lib/naga/tests/in/operators.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/operators.wgsl",
    "content": "//TODO: support splatting constructors for globals?\r\nlet v_f32_one = vec4<f32>(1.0, 1.0, 1.0, 1.0);\r\nlet v_f32_zero = vec4<f32>(0.0, 0.0, 0.0, 0.0);\r\nlet v_f32_half = vec4<f32>(0.5, 0.5, 0.5, 0.5);\r\nlet v_i32_one = vec4<i32>(1, 1, 1, 1);\r\n\r\nfn builtins() -> vec4<f32> {\r\n    // select()\r\n    let condition = true;\r\n    let s1 = select(0, 1, condition);\r\n    let s2 = select(v_f32_zero, v_f32_one, condition);\r\n    let s3 = select(v_f32_one, v_f32_zero, vec4<bool>(false, false, false, false));\r\n    // mix()\r\n    let m1 = mix(v_f32_zero, v_f32_one, v_f32_half);\r\n    let m2 = mix(v_f32_zero, v_f32_one, 0.1);\r\n    // bitcast()\r\n    let b1 = bitcast<f32>(v_i32_one.x);\r\n    let b2 = bitcast<vec4<f32>>(v_i32_one);\r\n    // convert\r\n    let v_i32_zero = vec4<i32>(v_f32_zero);\r\n    // done\r\n    return vec4<f32>(vec4<i32>(s1) + v_i32_zero) + s2 + m1 + m2 + b1 + b2;\r\n}\r\n\r\nfn splat() -> vec4<f32> {\r\n    let a = (1.0 + vec2<f32>(2.0) - 3.0) / 4.0;\r\n    let b = vec4<i32>(5) % 2;\r\n    return a.xyxy + vec4<f32>(b);\r\n}\r\n\r\nfn splat_assignment() -> vec2<f32> {\r\n    var a = vec2<f32>(2.0);\r\n    a += 1.0;\r\n    a -= 3.0;\r\n    a /= 4.0;\r\n    return a;\r\n}\r\n\r\nfn bool_cast(x: vec3<f32>) -> vec3<f32> {\r\n    let y = vec3<bool>(x);\r\n    return vec3<f32>(y);\r\n}\r\n\r\nstruct Foo {\r\n    a: vec4<f32>,\r\n    b: i32,\r\n}\r\n\r\nfn constructors() -> f32 {\r\n    var foo: Foo;\r\n    foo = Foo(vec4<f32>(1.0), 1);\r\n\r\n    let mat2comp = mat2x2<f32>(\r\n        1.0, 0.0,\r\n        0.0, 1.0,\r\n    );\r\n    let mat4comp = mat4x4<f32>(\r\n        1.0, 0.0, 0.0, 0.0,\r\n        0.0, 1.0, 0.0, 0.0,\r\n        0.0, 0.0, 1.0, 0.0,\r\n        0.0, 0.0, 0.0, 1.0,\r\n    );\r\n\r\n    // zero value constructors\r\n    _ = bool();\r\n    _ = i32();\r\n    _ = u32();\r\n    _ = f32();\r\n    _ = vec2<u32>();\r\n    _ = mat2x2<f32>();\r\n    _ = array<Foo, 3>();\r\n    _ = Foo();\r\n\r\n    // constructors that infer their type from their parameters\r\n    _ = vec2(0u);\r\n    _ = mat2x2(vec2(0.), vec2(0.));\r\n    _ = array(0, 1, 2, 3);\r\n\r\n    // identity constructors\r\n    _ = bool(bool());\r\n    _ = i32(i32());\r\n    _ = u32(u32());\r\n    _ = f32(f32());\r\n    _ = vec2<u32>(vec2<u32>());\r\n    _ = mat2x3<f32>(mat2x3<f32>());\r\n    _ = vec2(vec2<u32>());\r\n    _ = mat2x3(mat2x3<f32>());\r\n\r\n    return foo.a.x;\r\n}\r\n\r\nfn logical() {\r\n    // unary\r\n    _ = !true;\r\n    _ = !vec2(true);\r\n\r\n    // binary\r\n    _ = true || false;\r\n    _ = true && false;\r\n    _ = true | false;\r\n    _ = vec3(true) | vec3(false);\r\n    _ = true & false;\r\n    _ = vec4(true) & vec4(false);\r\n}\r\n\r\nfn arithmetic() {\r\n    // unary\r\n    // TODO: uncomment when we get the changes from https://github.com/gfx-rs/rspirv/pull/231\r\n    // _ = -1;\r\n    _ = -1.0;\r\n    _ = -vec2(1);\r\n    _ = -vec2(1.0);\r\n\r\n    // binary\r\n    // Addition\r\n    _ = 2 + 1;\r\n    _ = 2u + 1u;\r\n    _ = 2.0 + 1.0;\r\n    _ = vec2(2) + vec2(1);\r\n    _ = vec3(2u) + vec3(1u);\r\n    _ = vec4(2.0) + vec4(1.0);\r\n\r\n    // Subtraction\r\n    _ = 2 - 1;\r\n    _ = 2u - 1u;\r\n    _ = 2.0 - 1.0;\r\n    _ = vec2(2) - vec2(1);\r\n    _ = vec3(2u) - vec3(1u);\r\n    _ = vec4(2.0) - vec4(1.0);\r\n\r\n    // Multiplication\r\n    _ = 2 * 1;\r\n    _ = 2u * 1u;\r\n    _ = 2.0 * 1.0;\r\n    _ = vec2(2) * vec2(1);\r\n    _ = vec3(2u) * vec3(1u);\r\n    _ = vec4(2.0) * vec4(1.0);\r\n\r\n    // Division\r\n    _ = 2 / 1;\r\n    _ = 2u / 1u;\r\n    _ = 2.0 / 1.0;\r\n    _ = vec2(2) / vec2(1);\r\n    _ = vec3(2u) / vec3(1u);\r\n    _ = vec4(2.0) / vec4(1.0);\r\n\r\n    // Remainder\r\n    _ = 2 % 1;\r\n    _ = 2u % 1u;\r\n    _ = 2.0 % 1.0;\r\n    _ = vec2(2) % vec2(1);\r\n    _ = vec3(2u) % vec3(1u);\r\n    _ = vec4(2.0) % vec4(1.0);\r\n\r\n    // Binary arithmetic expressions with mixed scalar and vector operands\r\n    _ = vec2(2) + 1;\r\n    _ = 2 + vec2(1);\r\n    _ = vec2(2u) + 1u;\r\n    _ = 2u + vec2(1u);\r\n    _ = vec2(2.0) + 1.0;\r\n    _ = 2.0 + vec2(1.0);\r\n\r\n    _ = vec2(2) - 1;\r\n    _ = 2 - vec2(1);\r\n    _ = vec2(2u) - 1u;\r\n    _ = 2u - vec2(1u);\r\n    _ = vec2(2.0) - 1.0;\r\n    _ = 2.0 - vec2(1.0);\r\n\r\n    _ = vec2(2) * 1;\r\n    _ = 2 * vec2(1);\r\n    _ = vec2(2u) * 1u;\r\n    _ = 2u * vec2(1u);\r\n    _ = vec2(2.0) * 1.0;\r\n    _ = 2.0 * vec2(1.0);\r\n\r\n    _ = vec2(2) / 1;\r\n    _ = 2 / vec2(1);\r\n    _ = vec2(2u) / 1u;\r\n    _ = 2u / vec2(1u);\r\n    _ = vec2(2.0) / 1.0;\r\n    _ = 2.0 / vec2(1.0);\r\n\r\n    _ = vec2(2) % 1;\r\n    _ = 2 % vec2(1);\r\n    _ = vec2(2u) % 1u;\r\n    _ = 2u % vec2(1u);\r\n    _ = vec2(2.0) % 1.0;\r\n    _ = 2.0 % vec2(1.0);\r\n\r\n    // Matrix arithmetic\r\n    _ = mat3x3<f32>() + mat3x3<f32>();\r\n    _ = mat3x3<f32>() - mat3x3<f32>();\r\n\r\n    _ = mat3x3<f32>() * 1.0;\r\n    _ = 2.0 * mat3x3<f32>();\r\n\r\n    _ = mat4x3<f32>() * vec4(1.0);\r\n    _ = vec3(2.0) * mat4x3<f32>();\r\n\r\n    _ = mat4x3<f32>() * mat3x4<f32>();\r\n}\r\n\r\nfn bit() {\r\n    // unary\r\n    _ = ~1;\r\n    _ = ~1u;\r\n    _ = ~vec2(1);\r\n    _ = ~vec3(1u);\r\n\r\n    // binary\r\n    _ = 2 | 1;\r\n    _ = 2u | 1u;\r\n    _ = vec2(2) | vec2(1);\r\n    _ = vec3(2u) | vec3(1u);\r\n\r\n    _ = 2 & 1;\r\n    _ = 2u & 1u;\r\n    _ = vec2(2) & vec2(1);\r\n    _ = vec3(2u) & vec3(1u);\r\n\r\n    _ = 2 ^ 1;\r\n    _ = 2u ^ 1u;\r\n    _ = vec2(2) ^ vec2(1);\r\n    _ = vec3(2u) ^ vec3(1u);\r\n\r\n    _ = 2 << 1u;\r\n    _ = 2u << 1u;\r\n    _ = vec2(2) << vec2(1u);\r\n    _ = vec3(2u) << vec3(1u);\r\n\r\n    _ = 2 >> 1u;\r\n    _ = 2u >> 1u;\r\n    _ = vec2(2) >> vec2(1u);\r\n    _ = vec3(2u) >> vec3(1u);\r\n}\r\n\r\nfn comparison() {\r\n    _ = 2 == 1;\r\n    _ = 2u == 1u;\r\n    _ = 2.0 == 1.0;\r\n    _ = vec2(2) == vec2(1);\r\n    _ = vec3(2u) == vec3(1u);\r\n    _ = vec4(2.0) == vec4(1.0);\r\n\r\n    _ = 2 != 1;\r\n    _ = 2u != 1u;\r\n    _ = 2.0 != 1.0;\r\n    _ = vec2(2) != vec2(1);\r\n    _ = vec3(2u) != vec3(1u);\r\n    _ = vec4(2.0) != vec4(1.0);\r\n\r\n    _ = 2 < 1;\r\n    _ = 2u < 1u;\r\n    _ = 2.0 < 1.0;\r\n    _ = vec2(2) < vec2(1);\r\n    _ = vec3(2u) < vec3(1u);\r\n    _ = vec4(2.0) < vec4(1.0);\r\n\r\n    _ = 2 <= 1;\r\n    _ = 2u <= 1u;\r\n    _ = 2.0 <= 1.0;\r\n    _ = vec2(2) <= vec2(1);\r\n    _ = vec3(2u) <= vec3(1u);\r\n    _ = vec4(2.0) <= vec4(1.0);\r\n\r\n    _ = 2 > 1;\r\n    _ = 2u > 1u;\r\n    _ = 2.0 > 1.0;\r\n    _ = vec2(2) > vec2(1);\r\n    _ = vec3(2u) > vec3(1u);\r\n    _ = vec4(2.0) > vec4(1.0);\r\n\r\n    _ = 2 >= 1;\r\n    _ = 2u >= 1u;\r\n    _ = 2.0 >= 1.0;\r\n    _ = vec2(2) >= vec2(1);\r\n    _ = vec3(2u) >= vec3(1u);\r\n    _ = vec4(2.0) >= vec4(1.0);\r\n}\r\n\r\nfn assignment() {\r\n    var a = 1;\r\n\r\n    a += 1;\r\n    a -= 1;\r\n    a *= a;\r\n    a /= a;\r\n    a %= 1;\r\n    a &= 0;\r\n    a |= 0;\r\n    a ^= 0;\r\n    a <<= 2u;\r\n    a >>= 1u;\r\n\r\n    a++;\r\n    a--;\r\n\r\n    var vec0: vec3<i32> = vec3<i32>();\r\n    vec0[1]++;\r\n    vec0[1]--;\r\n}\r\n\r\n@compute @workgroup_size(1)\r\nfn main() {\r\n    _ = builtins();\r\n    _ = splat();\r\n    _ = bool_cast(v_f32_one.xyz);\r\n    _ = constructors();\r\n\r\n    logical();\r\n    arithmetic();\r\n    bit();\r\n    comparison();\r\n    assignment();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/padding.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: false,\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 0),\r\n\t\tper_stage_map: (\r\n\t\t\tvs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (buffer: Some(0), mutable: false),\r\n                    (group: 0, binding: 1): (buffer: Some(1), mutable: false),\r\n                    (group: 0, binding: 2): (buffer: Some(2), mutable: false),\r\n\t\t\t\t},\r\n\t\t\t),\r\n\t\t),\r\n\t\tinline_samplers: [],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/padding.wgsl",
    "content": "struct S {\r\n    a: vec3<f32>,\r\n}\r\n\r\nstruct Test {\r\n    a: S,\r\n    b: f32, // offset: 16\r\n}\r\n\r\nstruct Test2 {\r\n    a: array<vec3<f32>, 2>,\r\n    b: f32, // offset: 32\r\n}\r\n\r\nstruct Test3 {\r\n    a: mat4x3<f32>,\r\n    b: f32, // offset: 64\r\n}\r\n\r\n@group(0) @binding(0)\r\nvar<uniform> input1: Test;\r\n\r\n@group(0) @binding(1)\r\nvar<uniform> input2: Test2;\r\n\r\n@group(0) @binding(2)\r\nvar<uniform> input3: Test3;\r\n\r\n\r\n@vertex\r\nfn vertex() -> @builtin(position) vec4<f32> {\r\n    return vec4<f32>(1.0) * input1.b * input2.b * input3.b;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/pointers.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\timage: ReadZeroSkipWrite,\r\n\t),\r\n\tspv: (\r\n\t\tversion: (1, 2),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: false,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/pointers.wgsl",
    "content": "fn f() {\r\n   var v: vec2<i32>;\r\n   let px = &v.x;\r\n   *px = 10;\r\n}\r\n\r\nstruct DynamicArray {\r\n    arr: array<u32>\r\n}\r\n\r\n@group(0) @binding(0)\r\nvar<storage, read_write> dynamic_array: DynamicArray;\r\n\r\nfn index_unsized(i: i32, v: u32) {\r\n   let p: ptr<storage, DynamicArray, read_write> = &dynamic_array;\r\n\r\n   let val = (*p).arr[i];\r\n   (*p).arr[i] = val + v;\r\n}\r\n\r\nfn index_dynamic_array(i: i32, v: u32) {\r\n   let p: ptr<storage, array<u32>, read_write> = &dynamic_array.arr;\r\n\r\n   let val = (*p)[i];\r\n   (*p)[i] = val + v;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/policy-mix.param.ron",
    "content": "(\r\n\tbounds_check_policies: (\r\n\t\tindex: Restrict,\r\n\t\tbuffer: Unchecked,\r\n\t\timage: ReadZeroSkipWrite,\r\n\t),\r\n\tspv: (\r\n\t\tversion: (1, 1),\r\n\t\tdebug: true,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/policy-mix.wgsl",
    "content": "// Tests that the index, buffer, and texture bounds checks policies are\r\n// implemented separately.\r\n\r\n// Storage and Uniform storage classes\r\nstruct InStorage {\r\n  a: array<vec4<f32>, 10>\r\n}\r\n@group(0) @binding(0) var<storage> in_storage: InStorage;\r\n\r\nstruct InUniform {\r\n  a: array<vec4<f32>, 20>\r\n}\r\n@group(0) @binding(1) var<uniform> in_uniform: InUniform;\r\n\r\n// Textures automatically land in the `handle` storage class.\r\n@group(0) @binding(2) var image_2d_array: texture_2d_array<f32>;\r\n\r\n// None of the above.\r\nvar<workgroup> in_workgroup: array<f32, 30>;\r\nvar<private> in_private: array<f32, 40>;\r\n\r\nfn mock_function(c: vec2<i32>, i: i32, l: i32) -> vec4<f32> {\r\n  var in_function: array<vec4<f32>, 2> =\r\n    array<vec4<f32>, 2>(vec4<f32>(0.707, 0.0, 0.0, 1.0),\r\n                        vec4<f32>(0.0, 0.707, 0.0, 1.0));\r\n\r\n  return (in_storage.a[i] +\r\n          in_uniform.a[i] +\r\n          textureLoad(image_2d_array, c, i, l) +\r\n          in_workgroup[i] +\r\n          in_private[i] +\r\n          in_function[i]);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/push-constants.param.ron",
    "content": "(\r\n\tgod_mode: true,\r\n\tglsl: (\r\n\t\tversion: Embedded(\r\n\t\t\tversion: 320,\r\n\t\t\tis_webgl: false\r\n\t\t),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: {},\r\n\t),\r\n\thlsl: (\r\n\t\tshader_model: V5_1,\r\n\t\tbinding_map: {},\r\n\t\tfake_missing_bindings: true,\r\n\t\tspecial_constants_binding: Some((space: 1, register: 0)),\r\n\t\tpush_constants_target: Some((space: 0, register: 0)),\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/push-constants.wgsl",
    "content": "struct PushConstants {\r\n    multiplier: f32\r\n}\r\nvar<push_constant> pc: PushConstants;\r\n\r\nstruct FragmentIn {\r\n    @location(0) color: vec4<f32>\r\n}\r\n\r\n@vertex\r\nfn vert_main(\r\n  @location(0) pos : vec2<f32>,\r\n  @builtin(vertex_index) vi: u32,\r\n) -> @builtin(position) vec4<f32> {\r\n    return vec4<f32>(f32(vi) * pc.multiplier * pos, 0.0, 1.0);\r\n}\r\n\r\n@fragment\r\nfn main(in: FragmentIn) -> @location(0) vec4<f32> {\r\n    return in.color * pc.multiplier;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/quad.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: true,\r\n\t),\r\n\tglsl: (\r\n\t\tversion: Embedded(\r\n\t\t\tversion: 300,\r\n\t\t\tis_webgl: false\r\n\t\t),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: {},\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/quad.wgsl",
    "content": "// vertex\r\nlet c_scale: f32 = 1.2;\r\n\r\nstruct VertexOutput {\r\n  @location(0) uv : vec2<f32>,\r\n  @builtin(position) position : vec4<f32>,\r\n}\r\n\r\n@vertex\r\nfn vert_main(\r\n  @location(0) pos : vec2<f32>,\r\n  @location(1) uv : vec2<f32>,\r\n) -> VertexOutput {\r\n  return VertexOutput(uv, vec4<f32>(c_scale * pos, 0.0, 1.0));\r\n}\r\n\r\n// fragment\r\n@group(0) @binding(0) var u_texture : texture_2d<f32>;\r\n@group(0) @binding(1) var u_sampler : sampler;\r\n\r\n@fragment\r\nfn frag_main(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {\r\n  let color = textureSample(u_texture, u_sampler, uv);\r\n  if color.a == 0.0 {\r\n    discard;\r\n  }\r\n  // forcing the expression here to be emitted in order to check the\r\n  // uniformity of the control flow a bit more strongly.\r\n  let premultiplied = color.a * color;\r\n  return premultiplied;\r\n}\r\n\r\n\r\n// We need to make sure that backends are successfully handling multiple entry points for the same shader stage. \r\n@fragment\r\nfn fs_extra() -> @location(0) vec4<f32> {\r\n    return vec4<f32>(0.0, 0.5, 0.0, 0.5);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/shadow.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 2),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: true,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/shadow.wgsl",
    "content": "struct Globals {\r\n    view_proj: mat4x4<f32>,\r\n    num_lights: vec4<u32>,\r\n}\r\n\r\n@group(0)\r\n@binding(0)\r\nvar<uniform> u_globals: Globals;\r\n\r\nstruct Entity {\r\n    world: mat4x4<f32>,\r\n    color: vec4<f32>,\r\n}\r\n\r\n@group(1)\r\n@binding(0)\r\nvar<uniform> u_entity: Entity;\r\n\r\n/* Not useful for testing\r\n@vertex\r\nfn vs_bake(@location(0) position: vec4<i32>) -> @builtin(position) vec4<f32> {\r\n    return u_globals.view_proj * u_entity.world * vec4<f32>(position);\r\n}\r\n*/\r\n\r\nstruct VertexOutput {\r\n    @builtin(position) proj_position: vec4<f32>,\r\n    @location(0) world_normal: vec3<f32>,\r\n    @location(1) world_position: vec4<f32>,\r\n}\r\n\r\n@vertex\r\nfn vs_main(\r\n    @location(0) position: vec4<i32>,\r\n    @location(1) normal: vec4<i32>,\r\n) -> VertexOutput {\r\n    let w = u_entity.world;\r\n    let world_pos = u_entity.world * vec4<f32>(position);\r\n    var out: VertexOutput;\r\n    out.world_normal = mat3x3<f32>(w.x.xyz, w.y.xyz, w.z.xyz) * vec3<f32>(normal.xyz);\r\n    out.world_position = world_pos;\r\n    out.proj_position = u_globals.view_proj * world_pos;\r\n    return out;\r\n}\r\n\r\n// fragment shader\r\n\r\nstruct Light {\r\n    proj: mat4x4<f32>,\r\n    pos: vec4<f32>,\r\n    color: vec4<f32>,\r\n}\r\n\r\n@group(0)\r\n@binding(1)\r\nvar<storage, read> s_lights: array<Light>;\r\n@group(0)\r\n@binding(1)\r\nvar<uniform> u_lights: array<Light, 10>; // Used when storage types are not supported\r\n@group(0)\r\n@binding(2)\r\nvar t_shadow: texture_depth_2d_array;\r\n@group(0)\r\n@binding(3)\r\nvar sampler_shadow: sampler_comparison;\r\n\r\nfn fetch_shadow(light_id: u32, homogeneous_coords: vec4<f32>) -> f32 {\r\n    if (homogeneous_coords.w <= 0.0) {\r\n        return 1.0;\r\n    }\r\n    // compensate for the Y-flip difference between the NDC and texture coordinates\r\n    let flip_correction = vec2<f32>(0.5, -0.5);\r\n    // compute texture coordinates for shadow lookup\r\n    let proj_correction = 1.0 / homogeneous_coords.w;\r\n    let light_local = homogeneous_coords.xy * flip_correction * proj_correction + vec2<f32>(0.5, 0.5);\r\n    // do the lookup, using HW PCF and comparison\r\n    return textureSampleCompareLevel(t_shadow, sampler_shadow, light_local, i32(light_id), homogeneous_coords.z * proj_correction);\r\n}\r\n\r\nlet c_ambient: vec3<f32> = vec3<f32>(0.05, 0.05, 0.05);\r\nlet c_max_lights: u32 = 10u;\r\n\r\n@fragment\r\nfn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {\r\n    let normal = normalize(in.world_normal);\r\n    // accumulate color\r\n    var color: vec3<f32> = c_ambient;\r\n    for(var i = 0u; i < min(u_globals.num_lights.x, c_max_lights); i++) {\r\n        let light = s_lights[i];\r\n        // project into the light space\r\n        let shadow = fetch_shadow(i, light.proj * in.world_position);\r\n        // compute Lambertian diffuse term\r\n        let light_dir = normalize(light.pos.xyz - in.world_position.xyz);\r\n        let diffuse = max(0.0, dot(normal, light_dir));\r\n        // add light contribution\r\n        color += shadow * diffuse * light.color.xyz;\r\n    }\r\n    // multiply the light by material color\r\n    return vec4<f32>(color, 1.0) * u_entity.color;\r\n}\r\n\r\n// The fragment entrypoint used when storage buffers are not available for the lights\r\n@fragment\r\nfn fs_main_without_storage(in: VertexOutput) -> @location(0) vec4<f32> {\r\n    let normal = normalize(in.world_normal);\r\n    var color: vec3<f32> = c_ambient;\r\n    for(var i = 0u; i < min(u_globals.num_lights.x, c_max_lights); i++) {\r\n        // This line is the only difference from the entrypoint above. It uses the lights\r\n        // uniform instead of the lights storage buffer\r\n        let light = u_lights[i];\r\n        let shadow = fetch_shadow(i, light.proj * in.world_position);\r\n        let light_dir = normalize(light.pos.xyz - in.world_position.xyz);\r\n        let diffuse = max(0.0, dot(normal, light_dir));\r\n        color += shadow * diffuse * light.color.xyz;\r\n    }\r\n    return vec4<f32>(color, 1.0) * u_entity.color;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/skybox.param.ron",
    "content": "(\r\n\tspv_flow_dump_prefix: \"\",\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tdebug: false,\r\n\t\tadjust_coordinate_space: false,\r\n\t),\r\n\tmsl: (\r\n\t\tlang_version: (2, 1),\r\n\t\tper_stage_map: (\r\n\t\t\tvs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 0): (buffer: Some(0)),\r\n\t\t\t\t},\r\n\t\t\t),\r\n\t\t\tfs: (\r\n\t\t\t\tresources: {\r\n\t\t\t\t\t(group: 0, binding: 1): (texture: Some(0)),\r\n\t\t\t\t\t(group: 0, binding: 2): (sampler: Some(Inline(0))),\r\n\t\t\t\t},\r\n\t\t\t),\r\n\t\t),\r\n\t\tinline_samplers: [\r\n\t\t\t(\r\n\t\t\t\tcoord: Normalized,\r\n\t\t\t\taddress: (ClampToEdge, ClampToEdge, ClampToEdge),\r\n\t\t\t\tmag_filter: Linear,\r\n\t\t\t\tmin_filter: Linear,\r\n\t\t\t\tmip_filter: None,\r\n\t\t\t\tborder_color: TransparentBlack,\r\n\t\t\t\tcompare_func: Never,\r\n\t\t\t\tlod_clamp: Some((start: 0.5, end: 10.0)),\r\n\t\t\t\tmax_anisotropy: Some(8),\r\n\t\t\t),\r\n\t\t],\r\n\t\tspirv_cross_compatibility: false,\r\n\t\tfake_missing_bindings: false,\r\n\t),\r\n\tglsl: (\r\n\t\tversion: Embedded(\r\n\t\t\tversion: 320,\r\n\t\t\tis_webgl: false\r\n\t\t),\r\n\t\twriter_flags: (bits: 0),\r\n\t\tbinding_map: {\r\n\t\t\t(group: 0, binding: 0): 0,\r\n\t\t\t(group: 0, binding: 1): 0,\r\n\t\t},\r\n\t),\r\n\thlsl: (\r\n\t\tshader_model: V5_1,\r\n\t\tbinding_map: {\r\n\t\t\t(group: 0, binding: 0): (space: 0, register: 0),\r\n\t\t\t(group: 0, binding: 1): (space: 0, register: 0),\r\n\t\t\t(group: 0, binding: 2): (space: 1, register: 0),\r\n\t\t},\r\n\t\tfake_missing_bindings: false,\r\n\t\tspecial_constants_binding: Some((space: 0, register: 1)),\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/skybox.wgsl",
    "content": "struct VertexOutput {\r\n    @builtin(position) position: vec4<f32>,\r\n    @location(0) uv: vec3<f32>,\r\n}\r\n\r\nstruct Data {\r\n    proj_inv: mat4x4<f32>,\r\n    view: mat4x4<f32>,\r\n}\r\n@group(0) @binding(0)\r\nvar<uniform> r_data: Data;\r\n\r\n@vertex\r\nfn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput {\r\n    // hacky way to draw a large triangle\r\n    var tmp1 = i32(vertex_index) / 2;\r\n    var tmp2 = i32(vertex_index) & 1;\r\n    let pos = vec4<f32>(\r\n        f32(tmp1) * 4.0 - 1.0,\r\n        f32(tmp2) * 4.0 - 1.0,\r\n        0.0,\r\n        1.0,\r\n    );\r\n\r\n    let inv_model_view = transpose(mat3x3<f32>(r_data.view.x.xyz, r_data.view.y.xyz, r_data.view.z.xyz));\r\n    let unprojected = r_data.proj_inv * pos;\r\n    return VertexOutput(pos, inv_model_view * unprojected.xyz);\r\n}\r\n\r\n@group(0) @binding(1)\r\nvar r_texture: texture_cube<f32>;\r\n@group(0) @binding(2)\r\nvar r_sampler: sampler;\r\n\r\n@fragment\r\nfn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {\r\n    return textureSample(r_texture, r_sampler, in.uv);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/spv/empty-global-name.spvasm",
    "content": ";; Make sure we handle globals whose assigned name is \"\".\r\n;;\r\n;; In MSL, the anonymous global sometimes ends up looking like\r\n;;\r\n;;     struct Blah { int member; } ;\r\n;;\r\n;; where the null name just becomes an empty string before that last semicolon.\r\n;; This is, unfortunately, valid MSL, simply declaring the type Blah, so it will\r\n;; pass validation. However, an attempt to *use* the global will generate a\r\n;; garbage expression like \".member\", so we include a function that returns the\r\n;; member's value.\r\n\r\n                        OpCapability Shader\r\n                        OpMemoryModel Logical GLSL450\r\n                        OpEntryPoint GLCompute %main \"main\" %global\r\n                        OpExecutionMode %main LocalSize 1 1 1\r\n\r\n                        OpName %global \"\"\r\n                        OpDecorate %block Block\r\n                        OpMemberDecorate %block 0 Offset 0\r\n                        OpDecorate %global DescriptorSet 0\r\n                        OpDecorate %global Binding 0\r\n\r\n                %void = OpTypeVoid\r\n                 %int = OpTypeInt 32 1\r\n               %block = OpTypeStruct %int\r\n             %ptr_int = OpTypePointer StorageBuffer %int\r\n           %ptr_block = OpTypePointer StorageBuffer %block\r\n             %fn_void = OpTypeFunction %void\r\n              %fn_int = OpTypeFunction %int\r\n                %zero = OpConstant %int 0\r\n                 %one = OpConstant %int 1\r\n\r\n;; This global is said to have a name of \"\".\r\n              %global = OpVariable %ptr_block StorageBuffer\r\n\r\n                %main = OpFunction %void None %fn_void\r\n        %main_prelude = OpLabel\r\n          %member_ptr = OpAccessChain %ptr_int %global %zero\r\n          %member_val = OpLoad %int %member_ptr\r\n            %plus_one = OpIAdd %int %member_val %one\r\n                        OpStore %member_ptr %plus_one\r\n                        OpReturn\r\n                        OpFunctionEnd\r\n"
  },
  {
    "path": "lib/naga/tests/in/standard.param.ron",
    "content": "(\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/standard.wgsl",
    "content": "// Standard functions.\r\n\r\n@fragment\r\nfn derivatives(@builtin(position) foo: vec4<f32>) -> @location(0) vec4<f32> {\r\n    let x = dpdx(foo);\r\n    let y = dpdy(foo);\r\n    let z = fwidth(foo);\r\n    return (x + y) * z;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/texture-arg.param.ron",
    "content": "(\r\n\tspv: (\r\n\t\tversion: (1, 0),\r\n\t\tdebug: true,\r\n\t\tadjust_coordinate_space: true,\r\n\t),\r\n)\r\n"
  },
  {
    "path": "lib/naga/tests/in/texture-arg.wgsl",
    "content": "@group(0) @binding(0)\r\nvar Texture: texture_2d<f32>;\r\n@group(0) @binding(1)\r\nvar Sampler: sampler;\r\n\r\nfn test(Passed_Texture: texture_2d<f32>, Passed_Sampler: sampler) -> vec4<f32> {\r\n    return textureSample(Passed_Texture, Passed_Sampler, vec2<f32>(0.0, 0.0));\r\n}\r\n\r\n@fragment\r\nfn main() -> @location(0) vec4<f32> {\r\n    return test(Texture, Sampler);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/in/variations.glsl",
    "content": "#version 460 core\r\n\r\nlayout(set = 0, binding = 0) uniform textureCube texCube;\r\nlayout(set = 0, binding = 1) uniform sampler samp;\r\n\r\nvoid main() {\r\n    ivec2 sizeCube = textureSize(samplerCube(texCube, samp), 0);\r\n    float a = ceil(1.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/analysis/collatz.info.ron",
    "content": "(\r\n    functions: [\r\n        (\r\n            flags: (\r\n                bits: 31,\r\n            ),\r\n            available_stages: (\r\n                bits: 7,\r\n            ),\r\n            uniformity: (\r\n                non_uniform_result: Some(5),\r\n                requirements: (\r\n                    bits: 0,\r\n                ),\r\n            ),\r\n            may_kill: false,\r\n            sampling_set: [],\r\n            global_uses: [\r\n                (\r\n                    bits: 0,\r\n                ),\r\n            ],\r\n            expressions: [\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(1),\r\n                    ty: Value(Pointer(\r\n                        base: 3,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 3,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 7,\r\n                    assignable_global: None,\r\n                    ty: Value(Pointer(\r\n                        base: 1,\r\n                        space: Function,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 3,\r\n                    assignable_global: None,\r\n                    ty: Value(Pointer(\r\n                        base: 1,\r\n                        space: Function,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Bool,\r\n                        width: 1,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Bool,\r\n                        width: 1,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n            ],\r\n            sampling: [],\r\n        ),\r\n    ],\r\n    entry_points: [\r\n        (\r\n            flags: (\r\n                bits: 31,\r\n            ),\r\n            available_stages: (\r\n                bits: 7,\r\n            ),\r\n            uniformity: (\r\n                non_uniform_result: Some(5),\r\n                requirements: (\r\n                    bits: 0,\r\n                ),\r\n            ),\r\n            may_kill: false,\r\n            sampling_set: [],\r\n            global_uses: [\r\n                (\r\n                    bits: 3,\r\n                ),\r\n            ],\r\n            expressions: [\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 2,\r\n                    assignable_global: Some(1),\r\n                    ty: Value(Pointer(\r\n                        base: 3,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 3,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 2,\r\n                    assignable_global: None,\r\n                    ty: Handle(4),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(1),\r\n                    ty: Value(Pointer(\r\n                        base: 2,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 3,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(1),\r\n                    ty: Value(Pointer(\r\n                        base: 1,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 3,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(1),\r\n                    ty: Value(Pointer(\r\n                        base: 2,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 3,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(1),\r\n                    ty: Value(Pointer(\r\n                        base: 1,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 3,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n            ],\r\n            sampling: [],\r\n        ),\r\n    ],\r\n)"
  },
  {
    "path": "lib/naga/tests/out/analysis/shadow.info.ron",
    "content": "(\r\n    functions: [\r\n        (\r\n            flags: (\r\n                bits: 31,\r\n            ),\r\n            available_stages: (\r\n                bits: 7,\r\n            ),\r\n            uniformity: (\r\n                non_uniform_result: Some(4),\r\n                requirements: (\r\n                    bits: 0,\r\n                ),\r\n            ),\r\n            may_kill: false,\r\n            sampling_set: [\r\n                (\r\n                    image: 1,\r\n                    sampler: 2,\r\n                ),\r\n            ],\r\n            global_uses: [\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 0,\r\n                ),\r\n                (\r\n                    bits: 0,\r\n                ),\r\n                (\r\n                    bits: 0,\r\n                ),\r\n                (\r\n                    bits: 0,\r\n                ),\r\n                (\r\n                    bits: 0,\r\n                ),\r\n            ],\r\n            expressions: [\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(3),\r\n                    ty: Value(Pointer(\r\n                        base: 13,\r\n                        space: Uniform,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(6),\r\n                    ty: Value(Pointer(\r\n                        base: 2,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(5),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(4),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(1),\r\n                    ty: Handle(30),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(2),\r\n                    ty: Handle(31),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 20,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(7),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(7),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 2,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 3,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 6,\r\n                    assignable_global: None,\r\n                    ty: Handle(4),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Bool,\r\n                        width: 1,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(6),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(6),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(6),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(6),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Vector(\r\n                        size: Bi,\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 2,\r\n                    assignable_global: None,\r\n                    ty: Handle(6),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 3,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(6),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(4),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n            ],\r\n            sampling: [],\r\n        ),\r\n        (\r\n            flags: (\r\n                bits: 31,\r\n            ),\r\n            available_stages: (\r\n                bits: 7,\r\n            ),\r\n            uniformity: (\r\n                non_uniform_result: Some(4),\r\n                requirements: (\r\n                    bits: 0,\r\n                ),\r\n            ),\r\n            may_kill: false,\r\n            sampling_set: [\r\n                (\r\n                    image: 1,\r\n                    sampler: 2,\r\n                ),\r\n            ],\r\n            global_uses: [\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 2,\r\n                ),\r\n            ],\r\n            expressions: [\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(3),\r\n                    ty: Value(Pointer(\r\n                        base: 13,\r\n                        space: Uniform,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(6),\r\n                    ty: Value(Pointer(\r\n                        base: 2,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 4,\r\n                    assignable_global: Some(5),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(4),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(1),\r\n                    ty: Handle(30),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: Some(2),\r\n                    ty: Handle(31),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 7,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 20,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(7),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(7),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Sint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 0,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 3,\r\n                    assignable_global: None,\r\n                    ty: Value(Pointer(\r\n                        base: 2,\r\n                        space: Function,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 11,\r\n                    assignable_global: None,\r\n                    ty: Value(Pointer(\r\n                        base: 3,\r\n                        space: Function,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(3),\r\n                    ty: Value(Pointer(\r\n                        base: 12,\r\n                        space: Uniform,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(3),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Uint,\r\n                        width: 4,\r\n                        space: Uniform,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Uint,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Bool,\r\n                        width: 1,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 17,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(17),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(4),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Vector(\r\n                        size: Quad,\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(4),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(1),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(5),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(5),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(5),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(4),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: None,\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 19,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 18,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(4),\r\n                    ty: Value(ValuePointer(\r\n                        size: None,\r\n                        kind: Float,\r\n                        width: 4,\r\n                        space: Storage(\r\n                            access: (\r\n                                bits: 1,\r\n                            ),\r\n                        ),\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Value(Scalar(\r\n                        kind: Float,\r\n                        width: 4,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(48),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(3),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(47),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(4),\r\n                ),\r\n            ],\r\n            sampling: [],\r\n        ),\r\n    ],\r\n    entry_points: [\r\n        (\r\n            flags: (\r\n                bits: 31,\r\n            ),\r\n            available_stages: (\r\n                bits: 7,\r\n            ),\r\n            uniformity: (\r\n                non_uniform_result: Some(4),\r\n                requirements: (\r\n                    bits: 0,\r\n                ),\r\n            ),\r\n            may_kill: false,\r\n            sampling_set: [\r\n                (\r\n                    image: 1,\r\n                    sampler: 2,\r\n                ),\r\n            ],\r\n            global_uses: [\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 1,\r\n                ),\r\n                (\r\n                    bits: 3,\r\n                ),\r\n                (\r\n                    bits: 3,\r\n                ),\r\n                (\r\n                    bits: 3,\r\n                ),\r\n            ],\r\n            expressions: [\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(1),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(2),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(2),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(6),\r\n                    ty: Value(Pointer(\r\n                        base: 2,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(3),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(4),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(4),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(5),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: Some(7),\r\n                    ty: Value(Pointer(\r\n                        base: 4,\r\n                        space: Private,\r\n                    )),\r\n                ),\r\n                (\r\n                    uniformity: (\r\n                        non_uniform_result: Some(5),\r\n                        requirements: (\r\n                            bits: 0,\r\n                        ),\r\n                    ),\r\n                    ref_count: 1,\r\n                    assignable_global: None,\r\n                    ty: Handle(4),\r\n                ),\r\n            ],\r\n            sampling: [],\r\n        ),\r\n    ],\r\n)"
  },
  {
    "path": "lib/naga/tests/out/dot/quad.dot",
    "content": "digraph Module {\r\n\tsubgraph cluster_globals {\r\n\t\tlabel=\"Globals\"\r\n\t\tg0 [ shape=hexagon label=\"[1] Handle/'u_texture'\" ]\r\n\t\tg1 [ shape=hexagon label=\"[2] Handle/'u_sampler'\" ]\r\n\t}\r\n\tsubgraph cluster_ep0 {\r\n\t\tlabel=\"Vertex/'vert_main'\"\r\n\t\tnode [ style=filled ]\r\n\t\tep0_e0 [ fillcolor=\"#ffffb3\" label=\"[1] Constant\" ]\r\n\t\tep0_e1 [ color=\"#8dd3c7\" label=\"[2] Argument[0]\" ]\r\n\t\tep0_e2 [ color=\"#8dd3c7\" label=\"[3] Argument[1]\" ]\r\n\t\tep0_e3 [ color=\"#fdb462\" label=\"[4] Multiply\" ]\r\n\t\tep0_e1 -> ep0_e3 [ label=\"right\" ]\r\n\t\tep0_e0 -> ep0_e3 [ label=\"left\" ]\r\n\t\tep0_e4 [ fillcolor=\"#ffffb3\" label=\"[5] Constant\" ]\r\n\t\tep0_e5 [ fillcolor=\"#ffffb3\" label=\"[6] Constant\" ]\r\n\t\tep0_e6 [ color=\"#bebada\" label=\"[7] Compose\" ]\r\n\t\t{ ep0_e3 ep0_e4 ep0_e5 } -> ep0_e6\r\n\t\tep0_e7 [ color=\"#bebada\" label=\"[8] Compose\" ]\r\n\t\t{ ep0_e2 ep0_e6 } -> ep0_e7\r\n\t\tep0_s0 [ shape=square label=\"Root\" ]\r\n\t\tep0_s1 [ shape=square label=\"Emit\" ]\r\n\t\tep0_s2 [ shape=square label=\"Emit\" ]\r\n\t\tep0_s3 [ shape=square label=\"Return\" ]\r\n\t\tep0_s0 -> ep0_s1 [ arrowhead=tee label=\"\" ]\r\n\t\tep0_s1 -> ep0_s2 [ arrowhead=tee label=\"\" ]\r\n\t\tep0_s2 -> ep0_s3 [ arrowhead=tee label=\"\" ]\r\n\t\tep0_e7 -> ep0_s3 [ label=\"value\" ]\r\n\t\tep0_s1 -> ep0_e3 [ style=dotted ]\r\n\t\tep0_s2 -> ep0_e6 [ style=dotted ]\r\n\t\tep0_s2 -> ep0_e7 [ style=dotted ]\r\n\t}\r\n\tsubgraph cluster_ep1 {\r\n\t\tlabel=\"Fragment/'frag_main'\"\r\n\t\tnode [ style=filled ]\r\n\t\tep1_e0 [ fillcolor=\"#ffffb3\" label=\"[1] Constant\" ]\r\n\t\tep1_e1 [ color=\"#ffffb3\" label=\"[2] Global\" ]\r\n\t\tg1 -> ep1_e1 [fillcolor=gray]\r\n\t\tep1_e2 [ color=\"#ffffb3\" label=\"[3] Global\" ]\r\n\t\tg0 -> ep1_e2 [fillcolor=gray]\r\n\t\tep1_e3 [ color=\"#8dd3c7\" label=\"[4] Argument[0]\" ]\r\n\t\tep1_e4 [ color=\"#80b1d3\" label=\"[5] ImageSample\" ]\r\n\t\tep1_e1 -> ep1_e4 [ label=\"sampler\" ]\r\n\t\tep1_e2 -> ep1_e4 [ label=\"image\" ]\r\n\t\tep1_e3 -> ep1_e4 [ label=\"coordinate\" ]\r\n\t\tep1_e5 [ color=\"#8dd3c7\" label=\"[6] AccessIndex[3]\" ]\r\n\t\tep1_e4 -> ep1_e5 [ label=\"base\" ]\r\n\t\tep1_e6 [ fillcolor=\"#ffffb3\" label=\"[7] Constant\" ]\r\n\t\tep1_e7 [ color=\"#fdb462\" label=\"[8] Equal\" ]\r\n\t\tep1_e6 -> ep1_e7 [ label=\"right\" ]\r\n\t\tep1_e5 -> ep1_e7 [ label=\"left\" ]\r\n\t\tep1_e8 [ color=\"#8dd3c7\" label=\"[9] AccessIndex[3]\" ]\r\n\t\tep1_e4 -> ep1_e8 [ label=\"base\" ]\r\n\t\tep1_e9 [ color=\"#fdb462\" label=\"[10] Multiply\" ]\r\n\t\tep1_e4 -> ep1_e9 [ label=\"right\" ]\r\n\t\tep1_e8 -> ep1_e9 [ label=\"left\" ]\r\n\t\tep1_s0 [ shape=square label=\"Root\" ]\r\n\t\tep1_s1 [ shape=square label=\"Emit\" ]\r\n\t\tep1_s2 [ shape=square label=\"Emit\" ]\r\n\t\tep1_s3 [ shape=square label=\"Emit\" ]\r\n\t\tep1_s4 [ shape=square label=\"If\" ]\r\n\t\tep1_s5 [ shape=square label=\"Node\" ]\r\n\t\tep1_s6 [ shape=square label=\"Kill\" ]\r\n\t\tep1_s7 [ shape=square label=\"Node\" ]\r\n\t\tep1_s8 [ shape=square label=\"Merge\" ]\r\n\t\tep1_s9 [ shape=square label=\"Emit\" ]\r\n\t\tep1_s10 [ shape=square label=\"Return\" ]\r\n\t\tep1_s0 -> ep1_s1 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s1 -> ep1_s2 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s2 -> ep1_s3 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s3 -> ep1_s4 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s5 -> ep1_s6 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s4 -> ep1_s5 [ arrowhead=tee label=\"accept\" ]\r\n\t\tep1_s4 -> ep1_s7 [ arrowhead=tee label=\"reject\" ]\r\n\t\tep1_s6 -> ep1_s8 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s7 -> ep1_s8 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s8 -> ep1_s9 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_s9 -> ep1_s10 [ arrowhead=tee label=\"\" ]\r\n\t\tep1_e7 -> ep1_s4 [ label=\"condition\" ]\r\n\t\tep1_e9 -> ep1_s10 [ label=\"value\" ]\r\n\t\tep1_s1 -> ep1_e4 [ style=dotted ]\r\n\t\tep1_s2 -> ep1_e5 [ style=dotted ]\r\n\t\tep1_s3 -> ep1_e7 [ style=dotted ]\r\n\t\tep1_s9 -> ep1_e8 [ style=dotted ]\r\n\t\tep1_s9 -> ep1_e9 [ style=dotted ]\r\n\t}\r\n\tsubgraph cluster_ep2 {\r\n\t\tlabel=\"Fragment/'fs_extra'\"\r\n\t\tnode [ style=filled ]\r\n\t\tep2_e0 [ fillcolor=\"#ffffb3\" label=\"[1] Constant\" ]\r\n\t\tep2_e1 [ color=\"#ffffb3\" label=\"[2] Global\" ]\r\n\t\tg1 -> ep2_e1 [fillcolor=gray]\r\n\t\tep2_e2 [ color=\"#ffffb3\" label=\"[3] Global\" ]\r\n\t\tg0 -> ep2_e2 [fillcolor=gray]\r\n\t\tep2_e3 [ fillcolor=\"#ffffb3\" label=\"[4] Constant\" ]\r\n\t\tep2_e4 [ fillcolor=\"#ffffb3\" label=\"[5] Constant\" ]\r\n\t\tep2_e5 [ fillcolor=\"#ffffb3\" label=\"[6] Constant\" ]\r\n\t\tep2_e6 [ fillcolor=\"#ffffb3\" label=\"[7] Constant\" ]\r\n\t\tep2_e7 [ fillcolor=\"#bebada\" label=\"[8] Compose\" ]\r\n\t\t{ ep2_e3 ep2_e4 ep2_e5 ep2_e6 } -> ep2_e7\r\n\t\tep2_s0 [ shape=square label=\"Root\" ]\r\n\t\tep2_s1 [ shape=square label=\"Emit\" ]\r\n\t\tep2_s2 [ shape=square label=\"Return\" ]\r\n\t\tep2_s0 -> ep2_s1 [ arrowhead=tee label=\"\" ]\r\n\t\tep2_s1 -> ep2_s2 [ arrowhead=tee label=\"\" ]\r\n\t\tep2_e7 -> ep2_s2 [ label=\"value\" ]\r\n\t\tep2_s1 -> ep2_e7 [ style=dotted ]\r\n\t}\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/access.assign_through_ptr.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\nstruct GlobalConst {\r\n    uint a;\r\n    uvec3 b;\r\n    int c;\r\n};\r\nstruct AlignedWrapper {\r\n    int value;\r\n};\r\nstruct Baz {\r\n    mat3x2 m;\r\n};\r\nstruct MatCx2InArray {\r\n    mat4x2 am[2];\r\n};\r\nshared uint val;\r\n\r\n\r\nfloat read_from_private(inout float foo_1) {\r\n    float _e6 = foo_1;\r\n    return _e6;\r\n}\r\n\r\nfloat test_arr_as_arg(float a[5][10]) {\r\n    return a[4][9];\r\n}\r\n\r\nvoid assign_through_ptr_fn(inout uint p) {\r\n    p = 42u;\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    assign_through_ptr_fn(val);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/access.atomics.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\nstruct GlobalConst {\r\n    uint a;\r\n    uvec3 b;\r\n    int c;\r\n};\r\nstruct AlignedWrapper {\r\n    int value;\r\n};\r\nstruct Baz {\r\n    mat3x2 m;\r\n};\r\nstruct MatCx2InArray {\r\n    mat4x2 am[2];\r\n};\r\nlayout(std430) buffer Bar_block_0Compute {\r\n    mat4x3 _matrix;\r\n    mat2x2 matrix_array[2];\r\n    int atom;\r\n    uvec2 arr[2];\r\n    AlignedWrapper data[];\r\n} _group_0_binding_0_cs;\r\n\r\n\r\nfloat read_from_private(inout float foo_1) {\r\n    float _e6 = foo_1;\r\n    return _e6;\r\n}\r\n\r\nfloat test_arr_as_arg(float a[5][10]) {\r\n    return a[4][9];\r\n}\r\n\r\nvoid assign_through_ptr_fn(inout uint p) {\r\n    p = 42u;\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    int tmp = 0;\r\n    int value = _group_0_binding_0_cs.atom;\r\n    int _e10 = atomicAdd(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e10;\r\n    int _e13 = atomicAdd(_group_0_binding_0_cs.atom, -5);\r\n    tmp = _e13;\r\n    int _e16 = atomicAnd(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e16;\r\n    int _e19 = atomicOr(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e19;\r\n    int _e22 = atomicXor(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e22;\r\n    int _e25 = atomicMin(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e25;\r\n    int _e28 = atomicMax(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e28;\r\n    int _e31 = atomicExchange(_group_0_binding_0_cs.atom, 5);\r\n    tmp = _e31;\r\n    _group_0_binding_0_cs.atom = value;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/access.foo_frag.Fragment.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct GlobalConst {\r\n    uint a;\r\n    uvec3 b;\r\n    int c;\r\n};\r\nstruct AlignedWrapper {\r\n    int value;\r\n};\r\nstruct Baz {\r\n    mat3x2 m;\r\n};\r\nstruct MatCx2InArray {\r\n    mat4x2 am[2];\r\n};\r\nlayout(std430) buffer Bar_block_0Fragment {\r\n    mat4x3 _matrix;\r\n    mat2x2 matrix_array[2];\r\n    int atom;\r\n    uvec2 arr[2];\r\n    AlignedWrapper data[];\r\n} _group_0_binding_0_fs;\r\n\r\nlayout(std430) buffer type_11_block_1Fragment { ivec2 _group_0_binding_2_fs; };\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nfloat read_from_private(inout float foo_1) {\r\n    float _e6 = foo_1;\r\n    return _e6;\r\n}\r\n\r\nfloat test_arr_as_arg(float a[5][10]) {\r\n    return a[4][9];\r\n}\r\n\r\nvoid assign_through_ptr_fn(inout uint p) {\r\n    p = 42u;\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    _group_0_binding_0_fs._matrix[1][2] = 1.0;\r\n    _group_0_binding_0_fs._matrix = mat4x3(vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0));\r\n    _group_0_binding_0_fs.arr = uvec2[2](uvec2(0u), uvec2(1u));\r\n    _group_0_binding_0_fs.data[1].value = 1;\r\n    _group_0_binding_2_fs = ivec2(0, 0);\r\n    _fs2p_location0 = vec4(0.0);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/access.foo_vert.Vertex.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct GlobalConst {\r\n    uint a;\r\n    uvec3 b;\r\n    int c;\r\n};\r\nstruct AlignedWrapper {\r\n    int value;\r\n};\r\nstruct Baz {\r\n    mat3x2 m;\r\n};\r\nstruct MatCx2InArray {\r\n    mat4x2 am[2];\r\n};\r\nlayout(std430) buffer Bar_block_0Vertex {\r\n    mat4x3 _matrix;\r\n    mat2x2 matrix_array[2];\r\n    int atom;\r\n    uvec2 arr[2];\r\n    AlignedWrapper data[];\r\n} _group_0_binding_0_vs;\r\n\r\nuniform Baz_block_1Vertex { Baz _group_0_binding_1_vs; };\r\n\r\nlayout(std430) buffer type_11_block_2Vertex { ivec2 _group_0_binding_2_vs; };\r\n\r\nuniform MatCx2InArray_block_3Vertex { MatCx2InArray _group_0_binding_3_vs; };\r\n\r\n\r\nvoid test_matrix_within_struct_accesses() {\r\n    int idx = 1;\r\n    Baz t = Baz(mat3x2(0.0));\r\n    int _e6 = idx;\r\n    idx = (_e6 - 1);\r\n    mat3x2 unnamed = _group_0_binding_1_vs.m;\r\n    vec2 unnamed_1 = _group_0_binding_1_vs.m[0];\r\n    int _e16 = idx;\r\n    vec2 unnamed_2 = _group_0_binding_1_vs.m[_e16];\r\n    float unnamed_3 = _group_0_binding_1_vs.m[0][1];\r\n    int _e28 = idx;\r\n    float unnamed_4 = _group_0_binding_1_vs.m[0][_e28];\r\n    int _e32 = idx;\r\n    float unnamed_5 = _group_0_binding_1_vs.m[_e32][1];\r\n    int _e38 = idx;\r\n    int _e40 = idx;\r\n    float unnamed_6 = _group_0_binding_1_vs.m[_e38][_e40];\r\n    t = Baz(mat3x2(vec2(1.0), vec2(2.0), vec2(3.0)));\r\n    int _e52 = idx;\r\n    idx = (_e52 + 1);\r\n    t.m = mat3x2(vec2(6.0), vec2(5.0), vec2(4.0));\r\n    t.m[0] = vec2(9.0);\r\n    int _e69 = idx;\r\n    t.m[_e69] = vec2(90.0);\r\n    t.m[0][1] = 10.0;\r\n    int _e82 = idx;\r\n    t.m[0][_e82] = 20.0;\r\n    int _e86 = idx;\r\n    t.m[_e86][1] = 30.0;\r\n    int _e92 = idx;\r\n    int _e94 = idx;\r\n    t.m[_e92][_e94] = 40.0;\r\n    return;\r\n}\r\n\r\nvoid test_matrix_within_array_within_struct_accesses() {\r\n    int idx_1 = 1;\r\n    MatCx2InArray t_1 = MatCx2InArray(mat4x2[2](mat4x2(0.0), mat4x2(0.0)));\r\n    int _e7 = idx_1;\r\n    idx_1 = (_e7 - 1);\r\n    mat4x2 unnamed_7[2] = _group_0_binding_3_vs.am;\r\n    mat4x2 unnamed_8 = _group_0_binding_3_vs.am[0];\r\n    vec2 unnamed_9 = _group_0_binding_3_vs.am[0][0];\r\n    int _e25 = idx_1;\r\n    vec2 unnamed_10 = _group_0_binding_3_vs.am[0][_e25];\r\n    float unnamed_11 = _group_0_binding_3_vs.am[0][0][1];\r\n    int _e41 = idx_1;\r\n    float unnamed_12 = _group_0_binding_3_vs.am[0][0][_e41];\r\n    int _e47 = idx_1;\r\n    float unnamed_13 = _group_0_binding_3_vs.am[0][_e47][1];\r\n    int _e55 = idx_1;\r\n    int _e57 = idx_1;\r\n    float unnamed_14 = _group_0_binding_3_vs.am[0][_e55][_e57];\r\n    t_1 = MatCx2InArray(mat4x2[2](mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)), mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0))));\r\n    int _e63 = idx_1;\r\n    idx_1 = (_e63 + 1);\r\n    t_1.am = mat4x2[2](mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)), mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)));\r\n    t_1.am[0] = mat4x2(vec2(8.0), vec2(7.0), vec2(6.0), vec2(5.0));\r\n    t_1.am[0][0] = vec2(9.0);\r\n    int _e90 = idx_1;\r\n    t_1.am[0][_e90] = vec2(90.0);\r\n    t_1.am[0][0][1] = 10.0;\r\n    int _e107 = idx_1;\r\n    t_1.am[0][0][_e107] = 20.0;\r\n    int _e113 = idx_1;\r\n    t_1.am[0][_e113][1] = 30.0;\r\n    int _e121 = idx_1;\r\n    int _e123 = idx_1;\r\n    t_1.am[0][_e121][_e123] = 40.0;\r\n    return;\r\n}\r\n\r\nfloat read_from_private(inout float foo_1) {\r\n    float _e6 = foo_1;\r\n    return _e6;\r\n}\r\n\r\nfloat test_arr_as_arg(float a[5][10]) {\r\n    return a[4][9];\r\n}\r\n\r\nvoid assign_through_ptr_fn(inout uint p) {\r\n    p = 42u;\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    uint vi = uint(gl_VertexID);\r\n    float foo = 0.0;\r\n    int c[5] = int[5](0, 0, 0, 0, 0);\r\n    float baz_1 = foo;\r\n    foo = 1.0;\r\n    test_matrix_within_struct_accesses();\r\n    test_matrix_within_array_within_struct_accesses();\r\n    mat4x3 _matrix = _group_0_binding_0_vs._matrix;\r\n    uvec2 arr[2] = _group_0_binding_0_vs.arr;\r\n    float b = _group_0_binding_0_vs._matrix[3][0];\r\n    int a_1 = _group_0_binding_0_vs.data[(uint(_group_0_binding_0_vs.data.length()) - 2u)].value;\r\n    ivec2 c_1 = _group_0_binding_2_vs;\r\n    float _e32 = read_from_private(foo);\r\n    c = int[5](a_1, int(b), 3, 4, 5);\r\n    c[(vi + 1u)] = 42;\r\n    int value = c[vi];\r\n    float _e46 = test_arr_as_arg(float[5][10](float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)));\r\n    gl_Position = vec4((_matrix * vec4(ivec4(value))), 2.0);\r\n    gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/bitcast.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\n\r\nvoid main() {\r\n    ivec2 i2_ = ivec2(0);\r\n    ivec3 i3_ = ivec3(0);\r\n    ivec4 i4_ = ivec4(0);\r\n    uvec2 u2_ = uvec2(0u);\r\n    uvec3 u3_ = uvec3(0u);\r\n    uvec4 u4_ = uvec4(0u);\r\n    vec2 f2_ = vec2(0.0);\r\n    vec3 f3_ = vec3(0.0);\r\n    vec4 f4_ = vec4(0.0);\r\n    i2_ = ivec2(0);\r\n    i3_ = ivec3(0);\r\n    i4_ = ivec4(0);\r\n    u2_ = uvec2(0u);\r\n    u3_ = uvec3(0u);\r\n    u4_ = uvec4(0u);\r\n    f2_ = vec2(0.0);\r\n    f3_ = vec3(0.0);\r\n    f4_ = vec4(0.0);\r\n    ivec2 _e27 = i2_;\r\n    u2_ = uvec2(_e27);\r\n    ivec3 _e29 = i3_;\r\n    u3_ = uvec3(_e29);\r\n    ivec4 _e31 = i4_;\r\n    u4_ = uvec4(_e31);\r\n    uvec2 _e33 = u2_;\r\n    i2_ = ivec2(_e33);\r\n    uvec3 _e35 = u3_;\r\n    i3_ = ivec3(_e35);\r\n    uvec4 _e37 = u4_;\r\n    i4_ = ivec4(_e37);\r\n    ivec2 _e39 = i2_;\r\n    f2_ = intBitsToFloat(_e39);\r\n    ivec3 _e41 = i3_;\r\n    f3_ = intBitsToFloat(_e41);\r\n    ivec4 _e43 = i4_;\r\n    f4_ = intBitsToFloat(_e43);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/bits.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\n\r\nvoid main() {\r\n    int i = 0;\r\n    ivec2 i2_ = ivec2(0);\r\n    ivec3 i3_ = ivec3(0);\r\n    ivec4 i4_ = ivec4(0);\r\n    uint u = 0u;\r\n    uvec2 u2_ = uvec2(0u);\r\n    uvec3 u3_ = uvec3(0u);\r\n    uvec4 u4_ = uvec4(0u);\r\n    vec2 f2_ = vec2(0.0);\r\n    vec4 f4_ = vec4(0.0);\r\n    i2_ = ivec2(0);\r\n    i3_ = ivec3(0);\r\n    i4_ = ivec4(0);\r\n    u2_ = uvec2(0u);\r\n    u3_ = uvec3(0u);\r\n    u4_ = uvec4(0u);\r\n    f2_ = vec2(0.0);\r\n    f4_ = vec4(0.0);\r\n    vec4 _e28 = f4_;\r\n    u = packSnorm4x8(_e28);\r\n    vec4 _e30 = f4_;\r\n    u = packUnorm4x8(_e30);\r\n    vec2 _e32 = f2_;\r\n    u = packSnorm2x16(_e32);\r\n    vec2 _e34 = f2_;\r\n    u = packUnorm2x16(_e34);\r\n    vec2 _e36 = f2_;\r\n    u = packHalf2x16(_e36);\r\n    uint _e38 = u;\r\n    f4_ = unpackSnorm4x8(_e38);\r\n    uint _e40 = u;\r\n    f4_ = unpackUnorm4x8(_e40);\r\n    uint _e42 = u;\r\n    f2_ = unpackSnorm2x16(_e42);\r\n    uint _e44 = u;\r\n    f2_ = unpackUnorm2x16(_e44);\r\n    uint _e46 = u;\r\n    f2_ = unpackHalf2x16(_e46);\r\n    int _e48 = i;\r\n    int _e49 = i;\r\n    i = bitfieldInsert(_e48, _e49, int(5u), int(10u));\r\n    ivec2 _e53 = i2_;\r\n    ivec2 _e54 = i2_;\r\n    i2_ = bitfieldInsert(_e53, _e54, int(5u), int(10u));\r\n    ivec3 _e58 = i3_;\r\n    ivec3 _e59 = i3_;\r\n    i3_ = bitfieldInsert(_e58, _e59, int(5u), int(10u));\r\n    ivec4 _e63 = i4_;\r\n    ivec4 _e64 = i4_;\r\n    i4_ = bitfieldInsert(_e63, _e64, int(5u), int(10u));\r\n    uint _e68 = u;\r\n    uint _e69 = u;\r\n    u = bitfieldInsert(_e68, _e69, int(5u), int(10u));\r\n    uvec2 _e73 = u2_;\r\n    uvec2 _e74 = u2_;\r\n    u2_ = bitfieldInsert(_e73, _e74, int(5u), int(10u));\r\n    uvec3 _e78 = u3_;\r\n    uvec3 _e79 = u3_;\r\n    u3_ = bitfieldInsert(_e78, _e79, int(5u), int(10u));\r\n    uvec4 _e83 = u4_;\r\n    uvec4 _e84 = u4_;\r\n    u4_ = bitfieldInsert(_e83, _e84, int(5u), int(10u));\r\n    int _e88 = i;\r\n    i = bitfieldExtract(_e88, int(5u), int(10u));\r\n    ivec2 _e92 = i2_;\r\n    i2_ = bitfieldExtract(_e92, int(5u), int(10u));\r\n    ivec3 _e96 = i3_;\r\n    i3_ = bitfieldExtract(_e96, int(5u), int(10u));\r\n    ivec4 _e100 = i4_;\r\n    i4_ = bitfieldExtract(_e100, int(5u), int(10u));\r\n    uint _e104 = u;\r\n    u = bitfieldExtract(_e104, int(5u), int(10u));\r\n    uvec2 _e108 = u2_;\r\n    u2_ = bitfieldExtract(_e108, int(5u), int(10u));\r\n    uvec3 _e112 = u3_;\r\n    u3_ = bitfieldExtract(_e112, int(5u), int(10u));\r\n    uvec4 _e116 = u4_;\r\n    u4_ = bitfieldExtract(_e116, int(5u), int(10u));\r\n    int _e120 = i;\r\n    i = findLSB(_e120);\r\n    uvec2 _e122 = u2_;\r\n    u2_ = uvec2(findLSB(_e122));\r\n    ivec3 _e124 = i3_;\r\n    i3_ = findMSB(_e124);\r\n    uint _e126 = u;\r\n    u = uint(findMSB(_e126));\r\n    int _e128 = i;\r\n    i = bitCount(_e128);\r\n    ivec2 _e130 = i2_;\r\n    i2_ = bitCount(_e130);\r\n    ivec3 _e132 = i3_;\r\n    i3_ = bitCount(_e132);\r\n    ivec4 _e134 = i4_;\r\n    i4_ = bitCount(_e134);\r\n    uint _e136 = u;\r\n    u = uint(bitCount(_e136));\r\n    uvec2 _e138 = u2_;\r\n    u2_ = uvec2(bitCount(_e138));\r\n    uvec3 _e140 = u3_;\r\n    u3_ = uvec3(bitCount(_e140));\r\n    uvec4 _e142 = u4_;\r\n    u4_ = uvec4(bitCount(_e142));\r\n    int _e144 = i;\r\n    i = bitfieldReverse(_e144);\r\n    ivec2 _e146 = i2_;\r\n    i2_ = bitfieldReverse(_e146);\r\n    ivec3 _e148 = i3_;\r\n    i3_ = bitfieldReverse(_e148);\r\n    ivec4 _e150 = i4_;\r\n    i4_ = bitfieldReverse(_e150);\r\n    uint _e152 = u;\r\n    u = bitfieldReverse(_e152);\r\n    uvec2 _e154 = u2_;\r\n    u2_ = bitfieldReverse(_e154);\r\n    uvec3 _e156 = u3_;\r\n    u3_ = bitfieldReverse(_e156);\r\n    uvec4 _e158 = u4_;\r\n    u4_ = bitfieldReverse(_e158);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/boids.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;\r\n\r\nstruct Particle {\r\n    vec2 pos;\r\n    vec2 vel;\r\n};\r\nstruct SimParams {\r\n    float deltaT;\r\n    float rule1Distance;\r\n    float rule2Distance;\r\n    float rule3Distance;\r\n    float rule1Scale;\r\n    float rule2Scale;\r\n    float rule3Scale;\r\n};\r\nuniform SimParams_block_0Compute { SimParams _group_0_binding_0_cs; };\r\n\r\nlayout(std430) readonly buffer Particles_block_1Compute {\r\n    Particle particles[];\r\n} _group_0_binding_1_cs;\r\n\r\nlayout(std430) buffer Particles_block_2Compute {\r\n    Particle particles[];\r\n} _group_0_binding_2_cs;\r\n\r\n\r\nvoid main() {\r\n    uvec3 global_invocation_id = gl_GlobalInvocationID;\r\n    vec2 vPos = vec2(0.0);\r\n    vec2 vVel = vec2(0.0);\r\n    vec2 cMass = vec2(0.0);\r\n    vec2 cVel = vec2(0.0);\r\n    vec2 colVel = vec2(0.0);\r\n    int cMassCount = 0;\r\n    int cVelCount = 0;\r\n    vec2 pos = vec2(0.0);\r\n    vec2 vel = vec2(0.0);\r\n    uint i = 0u;\r\n    uint index = global_invocation_id.x;\r\n    if ((index >= 1500u)) {\r\n        return;\r\n    }\r\n    vec2 _e10 = _group_0_binding_1_cs.particles[index].pos;\r\n    vPos = _e10;\r\n    vec2 _e15 = _group_0_binding_1_cs.particles[index].vel;\r\n    vVel = _e15;\r\n    cMass = vec2(0.0, 0.0);\r\n    cVel = vec2(0.0, 0.0);\r\n    colVel = vec2(0.0, 0.0);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _e86 = i;\r\n            i = (_e86 + 1u);\r\n        }\r\n        loop_init = false;\r\n        uint _e37 = i;\r\n        if ((_e37 >= 1500u)) {\r\n            break;\r\n        }\r\n        uint _e39 = i;\r\n        if ((_e39 == index)) {\r\n            continue;\r\n        }\r\n        uint _e42 = i;\r\n        vec2 _e45 = _group_0_binding_1_cs.particles[_e42].pos;\r\n        pos = _e45;\r\n        uint _e47 = i;\r\n        vec2 _e50 = _group_0_binding_1_cs.particles[_e47].vel;\r\n        vel = _e50;\r\n        vec2 _e51 = pos;\r\n        vec2 _e52 = vPos;\r\n        float _e55 = _group_0_binding_0_cs.rule1Distance;\r\n        if ((distance(_e51, _e52) < _e55)) {\r\n            vec2 _e57 = cMass;\r\n            vec2 _e58 = pos;\r\n            cMass = (_e57 + _e58);\r\n            int _e60 = cMassCount;\r\n            cMassCount = (_e60 + 1);\r\n        }\r\n        vec2 _e63 = pos;\r\n        vec2 _e64 = vPos;\r\n        float _e67 = _group_0_binding_0_cs.rule2Distance;\r\n        if ((distance(_e63, _e64) < _e67)) {\r\n            vec2 _e69 = colVel;\r\n            vec2 _e70 = pos;\r\n            vec2 _e71 = vPos;\r\n            colVel = (_e69 - (_e70 - _e71));\r\n        }\r\n        vec2 _e74 = pos;\r\n        vec2 _e75 = vPos;\r\n        float _e78 = _group_0_binding_0_cs.rule3Distance;\r\n        if ((distance(_e74, _e75) < _e78)) {\r\n            vec2 _e80 = cVel;\r\n            vec2 _e81 = vel;\r\n            cVel = (_e80 + _e81);\r\n            int _e83 = cVelCount;\r\n            cVelCount = (_e83 + 1);\r\n        }\r\n    }\r\n    int _e89 = cMassCount;\r\n    if ((_e89 > 0)) {\r\n        vec2 _e92 = cMass;\r\n        int _e93 = cMassCount;\r\n        vec2 _e97 = vPos;\r\n        cMass = ((_e92 / vec2(float(_e93))) - _e97);\r\n    }\r\n    int _e99 = cVelCount;\r\n    if ((_e99 > 0)) {\r\n        vec2 _e102 = cVel;\r\n        int _e103 = cVelCount;\r\n        cVel = (_e102 / vec2(float(_e103)));\r\n    }\r\n    vec2 _e107 = vVel;\r\n    vec2 _e108 = cMass;\r\n    float _e110 = _group_0_binding_0_cs.rule1Scale;\r\n    vec2 _e113 = colVel;\r\n    float _e115 = _group_0_binding_0_cs.rule2Scale;\r\n    vec2 _e118 = cVel;\r\n    float _e120 = _group_0_binding_0_cs.rule3Scale;\r\n    vVel = (((_e107 + (_e108 * _e110)) + (_e113 * _e115)) + (_e118 * _e120));\r\n    vec2 _e123 = vVel;\r\n    vec2 _e125 = vVel;\r\n    vVel = (normalize(_e123) * clamp(length(_e125), 0.0, 0.10000000149011612));\r\n    vec2 _e131 = vPos;\r\n    vec2 _e132 = vVel;\r\n    float _e134 = _group_0_binding_0_cs.deltaT;\r\n    vPos = (_e131 + (_e132 * _e134));\r\n    float _e138 = vPos.x;\r\n    if ((_e138 < -1.0)) {\r\n        vPos.x = 1.0;\r\n    }\r\n    float _e144 = vPos.x;\r\n    if ((_e144 > 1.0)) {\r\n        vPos.x = -1.0;\r\n    }\r\n    float _e150 = vPos.y;\r\n    if ((_e150 < -1.0)) {\r\n        vPos.y = 1.0;\r\n    }\r\n    float _e156 = vPos.y;\r\n    if ((_e156 > 1.0)) {\r\n        vPos.y = -1.0;\r\n    }\r\n    vec2 _e164 = vPos;\r\n    _group_0_binding_2_cs.particles[index].pos = _e164;\r\n    vec2 _e168 = vVel;\r\n    _group_0_binding_2_cs.particles[index].vel = _e168;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/bounds-check-image-restrict.fragment_shader.Fragment.glsl",
    "content": "#version 430 core\r\n#extension GL_ARB_shader_texture_image_samples : require\r\nuniform highp sampler1D _group_0_binding_0_fs;\r\n\r\nuniform highp sampler2D _group_0_binding_1_fs;\r\n\r\nuniform highp sampler2DArray _group_0_binding_2_fs;\r\n\r\nuniform highp sampler3D _group_0_binding_3_fs;\r\n\r\nuniform highp sampler2DMS _group_0_binding_4_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image1D _group_0_binding_8_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image2D _group_0_binding_9_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image2DArray _group_0_binding_10_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image3D _group_0_binding_11_fs;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvec4 test_textureLoad_1d(int coords, int level) {\r\n    int _e3_clamped_lod = clamp(level, 0, textureQueryLevels(_group_0_binding_0_fs) - 1);\r\n    vec4 _e3 = texelFetch(_group_0_binding_0_fs, clamp(coords, 0, textureSize(_group_0_binding_0_fs, _e3_clamped_lod) - 1), _e3_clamped_lod);\r\n    return _e3;\r\n}\r\n\r\nvec4 test_textureLoad_2d(ivec2 coords_1, int level_1) {\r\n    int _e4_clamped_lod = clamp(level_1, 0, textureQueryLevels(_group_0_binding_1_fs) - 1);\r\n    vec4 _e4 = texelFetch(_group_0_binding_1_fs, clamp(coords_1, ivec2(0), textureSize(_group_0_binding_1_fs, _e4_clamped_lod) - ivec2(1)), _e4_clamped_lod);\r\n    return _e4;\r\n}\r\n\r\nvec4 test_textureLoad_2d_array(ivec2 coords_2, int index, int level_2) {\r\n    int _e6_clamped_lod = clamp(level_2, 0, textureQueryLevels(_group_0_binding_2_fs) - 1);\r\n    vec4 _e6 = texelFetch(_group_0_binding_2_fs, clamp(ivec3(coords_2, index), ivec3(0), textureSize(_group_0_binding_2_fs, _e6_clamped_lod) - ivec3(1)), _e6_clamped_lod);\r\n    return _e6;\r\n}\r\n\r\nvec4 test_textureLoad_3d(ivec3 coords_3, int level_3) {\r\n    int _e6_clamped_lod = clamp(level_3, 0, textureQueryLevels(_group_0_binding_3_fs) - 1);\r\n    vec4 _e6 = texelFetch(_group_0_binding_3_fs, clamp(coords_3, ivec3(0), textureSize(_group_0_binding_3_fs, _e6_clamped_lod) - ivec3(1)), _e6_clamped_lod);\r\n    return _e6;\r\n}\r\n\r\nvec4 test_textureLoad_multisampled_2d(ivec2 coords_4, int _sample) {\r\n    vec4 _e7 = texelFetch(_group_0_binding_4_fs, clamp(coords_4, ivec2(0), textureSize(_group_0_binding_4_fs) - ivec2(1)), clamp(_sample, 0, textureSamples(_group_0_binding_4_fs) - 1)\r\n);\r\n    return _e7;\r\n}\r\n\r\nvoid test_textureStore_1d(int coords_8, vec4 value) {\r\n    imageStore(_group_0_binding_8_fs, coords_8, value);\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d(ivec2 coords_9, vec4 value_1) {\r\n    imageStore(_group_0_binding_9_fs, coords_9, value_1);\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d_array(ivec2 coords_10, int array_index, vec4 value_2) {\r\n    imageStore(_group_0_binding_10_fs, ivec3(coords_10, array_index), value_2);\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_3d(ivec3 coords_11, vec4 value_3) {\r\n    imageStore(_group_0_binding_11_fs, coords_11, value_3);\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    vec4 _e14 = test_textureLoad_1d(0, 0);\r\n    vec4 _e17 = test_textureLoad_2d(ivec2(0, 0), 0);\r\n    vec4 _e21 = test_textureLoad_2d_array(ivec2(0, 0), 0, 0);\r\n    vec4 _e24 = test_textureLoad_3d(ivec3(0, 0, 0), 0);\r\n    vec4 _e27 = test_textureLoad_multisampled_2d(ivec2(0, 0), 0);\r\n    test_textureStore_1d(0, vec4(0.0, 0.0, 0.0, 0.0));\r\n    test_textureStore_2d(ivec2(0, 0), vec4(0.0, 0.0, 0.0, 0.0));\r\n    test_textureStore_2d_array(ivec2(0, 0), 0, vec4(0.0, 0.0, 0.0, 0.0));\r\n    test_textureStore_3d(ivec3(0, 0, 0), vec4(0.0, 0.0, 0.0, 0.0));\r\n    _fs2p_location0 = vec4(0.0, 0.0, 0.0, 0.0);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/bounds-check-image-rzsw.fragment_shader.Fragment.glsl",
    "content": "#version 430 core\r\n#extension GL_ARB_shader_texture_image_samples : require\r\nuniform highp sampler1D _group_0_binding_0_fs;\r\n\r\nuniform highp sampler2D _group_0_binding_1_fs;\r\n\r\nuniform highp sampler2DArray _group_0_binding_2_fs;\r\n\r\nuniform highp sampler3D _group_0_binding_3_fs;\r\n\r\nuniform highp sampler2DMS _group_0_binding_4_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image1D _group_0_binding_8_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image2D _group_0_binding_9_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image2DArray _group_0_binding_10_fs;\r\n\r\nlayout(rgba8) writeonly uniform highp image3D _group_0_binding_11_fs;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvec4 test_textureLoad_1d(int coords, int level) {\r\n    vec4 _e3 = (level < textureQueryLevels(_group_0_binding_0_fs) && coords < textureSize(_group_0_binding_0_fs, level) ? texelFetch(_group_0_binding_0_fs, coords, level) : vec4(0.0));\r\n    return _e3;\r\n}\r\n\r\nvec4 test_textureLoad_2d(ivec2 coords_1, int level_1) {\r\n    vec4 _e4 = (level_1 < textureQueryLevels(_group_0_binding_1_fs) && all(lessThan(coords_1, textureSize(_group_0_binding_1_fs, level_1))) ? texelFetch(_group_0_binding_1_fs, coords_1, level_1) : vec4(0.0));\r\n    return _e4;\r\n}\r\n\r\nvec4 test_textureLoad_2d_array(ivec2 coords_2, int index, int level_2) {\r\n    vec4 _e6 = (level_2 < textureQueryLevels(_group_0_binding_2_fs) && all(lessThan(ivec3(coords_2, index), textureSize(_group_0_binding_2_fs, level_2))) ? texelFetch(_group_0_binding_2_fs, ivec3(coords_2, index), level_2) : vec4(0.0));\r\n    return _e6;\r\n}\r\n\r\nvec4 test_textureLoad_3d(ivec3 coords_3, int level_3) {\r\n    vec4 _e6 = (level_3 < textureQueryLevels(_group_0_binding_3_fs) && all(lessThan(coords_3, textureSize(_group_0_binding_3_fs, level_3))) ? texelFetch(_group_0_binding_3_fs, coords_3, level_3) : vec4(0.0));\r\n    return _e6;\r\n}\r\n\r\nvec4 test_textureLoad_multisampled_2d(ivec2 coords_4, int _sample) {\r\n    vec4 _e7 = (_sample < textureSamples(_group_0_binding_4_fs) && all(lessThan(coords_4, textureSize(_group_0_binding_4_fs))) ? texelFetch(_group_0_binding_4_fs, coords_4, _sample) : vec4(0.0));\r\n    return _e7;\r\n}\r\n\r\nvoid test_textureStore_1d(int coords_8, vec4 value) {\r\n    imageStore(_group_0_binding_8_fs, coords_8, value);\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d(ivec2 coords_9, vec4 value_1) {\r\n    imageStore(_group_0_binding_9_fs, coords_9, value_1);\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d_array(ivec2 coords_10, int array_index, vec4 value_2) {\r\n    imageStore(_group_0_binding_10_fs, ivec3(coords_10, array_index), value_2);\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_3d(ivec3 coords_11, vec4 value_3) {\r\n    imageStore(_group_0_binding_11_fs, coords_11, value_3);\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    vec4 _e14 = test_textureLoad_1d(0, 0);\r\n    vec4 _e17 = test_textureLoad_2d(ivec2(0, 0), 0);\r\n    vec4 _e21 = test_textureLoad_2d_array(ivec2(0, 0), 0, 0);\r\n    vec4 _e24 = test_textureLoad_3d(ivec3(0, 0, 0), 0);\r\n    vec4 _e27 = test_textureLoad_multisampled_2d(ivec2(0, 0), 0);\r\n    test_textureStore_1d(0, vec4(0.0, 0.0, 0.0, 0.0));\r\n    test_textureStore_2d(ivec2(0, 0), vec4(0.0, 0.0, 0.0, 0.0));\r\n    test_textureStore_2d_array(ivec2(0, 0), 0, vec4(0.0, 0.0, 0.0, 0.0));\r\n    test_textureStore_3d(ivec3(0, 0, 0), vec4(0.0, 0.0, 0.0, 0.0));\r\n    _fs2p_location0 = vec4(0.0, 0.0, 0.0, 0.0);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/break-if.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\n\r\nvoid breakIfEmpty() {\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            if (true) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init = false;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid breakIfEmptyBody(bool a) {\r\n    bool b = false;\r\n    bool c = false;\r\n    bool loop_init_1 = true;\r\n    while(true) {\r\n        if (!loop_init_1) {\r\n            b = a;\r\n            bool _e2 = b;\r\n            c = (a != _e2);\r\n            bool _e5 = c;\r\n            bool unnamed = (a == _e5);\r\n            if (unnamed) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init_1 = false;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid breakIf(bool a_1) {\r\n    bool d = false;\r\n    bool e = false;\r\n    bool loop_init_2 = true;\r\n    while(true) {\r\n        if (!loop_init_2) {\r\n            bool _e5 = e;\r\n            bool unnamed_1 = (a_1 == _e5);\r\n            if (unnamed_1) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init_2 = false;\r\n        d = a_1;\r\n        bool _e2 = d;\r\n        e = (a_1 != _e2);\r\n    }\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/control-flow.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\n\r\nvoid switch_default_break(int i) {\r\n    switch(i) {\r\n        default:\r\n            break;\r\n    }\r\n}\r\n\r\nvoid switch_case_break() {\r\n    switch(0) {\r\n        case 0:\r\n            break;\r\n        default:\r\n            break;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid loop_switch_continue(int x) {\r\n    while(true) {\r\n        switch(x) {\r\n            case 1:\r\n                continue;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    uvec3 global_id = gl_GlobalInvocationID;\r\n    int pos = 0;\r\n    memoryBarrierBuffer();\r\n    barrier();\r\n    memoryBarrierShared();\r\n    barrier();\r\n    switch(1) {\r\n        default:\r\n            pos = 1;\r\n            break;\r\n    }\r\n    int _e4 = pos;\r\n    switch(_e4) {\r\n        case 1:\r\n            pos = 0;\r\n            break;\r\n        case 2:\r\n            pos = 1;\r\n            break;\r\n        case 3:\r\n            pos = 2;\r\n            /* fallthrough */\r\n        case 4:\r\n            pos = 3;\r\n            /* fallthrough */\r\n        default:\r\n            pos = 4;\r\n            break;\r\n    }\r\n    switch(0u) {\r\n        case 0u:\r\n            break;\r\n        default:\r\n            break;\r\n    }\r\n    int _e11 = pos;\r\n    switch(_e11) {\r\n        case 1:\r\n            pos = 0;\r\n            break;\r\n        case 2:\r\n            pos = 1;\r\n            return;\r\n        case 3:\r\n            pos = 2;\r\n            /* fallthrough */\r\n        case 4:\r\n            return;\r\n        default:\r\n            pos = 3;\r\n            return;\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/cubeArrayShadow.fragment.Fragment.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_texture_cube_map_array : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp samplerCubeArrayShadow _group_0_binding_4_fs;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec3 frag_ls = vec4(1.0, 1.0, 2.0, 1.0).xyz;\r\n    float a = texture(_group_0_binding_4_fs, vec4(frag_ls, int(1)), 1.0);\r\n    _fs2p_location0 = vec4(a, 1.0, 1.0, 1.0);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/empty.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\n\r\nvoid main() {\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/functions-webgl.main.Vertex.glsl",
    "content": "#version 300 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\n\r\nvec2 test_fma() {\r\n    vec2 a = vec2(2.0, 2.0);\r\n    vec2 b = vec2(0.5, 0.5);\r\n    vec2 c = vec2(0.5, 0.5);\r\n    return (a * b + c);\r\n}\r\n\r\nvoid main() {\r\n    vec2 _e0 = test_fma();\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/functions.main.Compute.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_gpu_shader5 : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\n\r\nvec2 test_fma() {\r\n    vec2 a = vec2(2.0, 2.0);\r\n    vec2 b = vec2(0.5, 0.5);\r\n    vec2 c = vec2(0.5, 0.5);\r\n    return fma(a, b, c);\r\n}\r\n\r\nint test_integer_dot_product() {\r\n    ivec2 a_2_ = ivec2(1);\r\n    ivec2 b_2_ = ivec2(1);\r\n    int c_2_ = ( + a_2_.x * b_2_.x + a_2_.y * b_2_.y);\r\n    uvec3 a_3_ = uvec3(1u);\r\n    uvec3 b_3_ = uvec3(1u);\r\n    uint c_3_ = ( + a_3_.x * b_3_.x + a_3_.y * b_3_.y + a_3_.z * b_3_.z);\r\n    ivec4 _e11 = ivec4(4);\r\n    ivec4 _e13 = ivec4(2);\r\n    int c_4_ = ( + _e11.x * _e13.x + _e11.y * _e13.y + _e11.z * _e13.z + _e11.w * _e13.w);\r\n    return c_4_;\r\n}\r\n\r\nvoid main() {\r\n    vec2 _e0 = test_fma();\r\n    int _e1 = test_integer_dot_product();\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/globals.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\nstruct Foo {\r\n    vec3 v3_;\r\n    float v1_;\r\n};\r\nshared float wg[10];\r\n\r\nshared uint at_1;\r\n\r\nlayout(std430) buffer Foo_block_0Compute { Foo _group_0_binding_1_cs; };\r\n\r\nlayout(std430) readonly buffer type_6_block_1Compute { vec2 _group_0_binding_2_cs[]; };\r\n\r\nuniform type_8_block_2Compute { vec4 _group_0_binding_3_cs[20]; };\r\n\r\nuniform type_4_block_3Compute { vec3 _group_0_binding_4_cs; };\r\n\r\nuniform type_9_block_4Compute { mat3x2 _group_0_binding_5_cs; };\r\n\r\nuniform type_12_block_5Compute { mat2x4 _group_0_binding_6_cs[2][2]; };\r\n\r\nuniform type_15_block_6Compute { mat4x2 _group_0_binding_7_cs[2][2]; };\r\n\r\n\r\nvoid test_msl_packed_vec3_as_arg(vec3 arg) {\r\n    return;\r\n}\r\n\r\nvoid test_msl_packed_vec3_() {\r\n    int idx = 1;\r\n    _group_0_binding_1_cs.v3_ = vec3(1.0);\r\n    _group_0_binding_1_cs.v3_.x = 1.0;\r\n    _group_0_binding_1_cs.v3_.x = 2.0;\r\n    int _e23 = idx;\r\n    _group_0_binding_1_cs.v3_[_e23] = 3.0;\r\n    Foo data = _group_0_binding_1_cs;\r\n    vec3 unnamed = data.v3_;\r\n    vec2 unnamed_1 = data.v3_.zx;\r\n    test_msl_packed_vec3_as_arg(data.v3_);\r\n    vec3 unnamed_2 = (data.v3_ * mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)));\r\n    vec3 unnamed_3 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * data.v3_);\r\n    vec3 unnamed_4 = (data.v3_ * 2.0);\r\n    vec3 unnamed_5 = (2.0 * data.v3_);\r\n}\r\n\r\nvoid main() {\r\n    float Foo_1 = 1.0;\r\n    bool at = true;\r\n    test_msl_packed_vec3_();\r\n    mat4x2 _e16 = _group_0_binding_7_cs[0][0];\r\n    vec4 _e23 = _group_0_binding_6_cs[0][0][0];\r\n    wg[7] = (_e16 * _e23).x;\r\n    mat3x2 _e28 = _group_0_binding_5_cs;\r\n    vec3 _e29 = _group_0_binding_4_cs;\r\n    wg[6] = (_e28 * _e29).x;\r\n    float _e37 = _group_0_binding_2_cs[1].y;\r\n    wg[5] = _e37;\r\n    float _e43 = _group_0_binding_3_cs[0].w;\r\n    wg[4] = _e43;\r\n    float _e47 = _group_0_binding_1_cs.v1_;\r\n    wg[3] = _e47;\r\n    float _e52 = _group_0_binding_1_cs.v3_.x;\r\n    wg[2] = _e52;\r\n    _group_0_binding_1_cs.v1_ = 4.0;\r\n    wg[1] = float(uint(_group_0_binding_2_cs.length()));\r\n    at_1 = 2u;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/image.gather.Fragment.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_texture_cube_map_array : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp sampler2D _group_0_binding_1_fs;\r\n\r\nuniform highp sampler2DShadow _group_1_binding_2_fs;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec2 tc = vec2(0.5);\r\n    vec4 s2d = textureGather(_group_0_binding_1_fs, vec2(tc), 1);\r\n    vec4 s2d_offset = textureGatherOffset(_group_0_binding_1_fs, vec2(tc), ivec2(3, 1), 3);\r\n    vec4 s2d_depth = textureGather(_group_1_binding_2_fs, vec2(tc), 0.5);\r\n    vec4 s2d_depth_offset = textureGatherOffset(_group_1_binding_2_fs, vec2(tc), 0.5, ivec2(3, 1));\r\n    _fs2p_location0 = (((s2d + s2d_offset) + s2d_depth) + s2d_depth_offset);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/image.main.Compute.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_texture_cube_map_array : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 16, local_size_y = 1, local_size_z = 1) in;\r\n\r\nuniform highp usampler2D _group_0_binding_0_cs;\r\n\r\nuniform highp usampler2DMS _group_0_binding_3_cs;\r\n\r\nlayout(rgba8ui) readonly uniform highp uimage2D _group_0_binding_1_cs;\r\n\r\nuniform highp usampler2DArray _group_0_binding_5_cs;\r\n\r\nuniform highp usampler2D _group_0_binding_7_cs;\r\n\r\nlayout(r32ui) writeonly uniform highp uimage2D _group_0_binding_2_cs;\r\n\r\n\r\nvoid main() {\r\n    uvec3 local_id = gl_LocalInvocationID;\r\n    ivec2 dim = imageSize(_group_0_binding_1_cs).xy;\r\n    ivec2 itc = ((dim * ivec2(local_id.xy)) % ivec2(10, 20));\r\n    uvec4 value1_ = texelFetch(_group_0_binding_0_cs, itc, int(local_id.z));\r\n    uvec4 value2_ = texelFetch(_group_0_binding_3_cs, itc, int(local_id.z));\r\n    uvec4 value4_ = imageLoad(_group_0_binding_1_cs, itc);\r\n    uvec4 value5_ = texelFetch(_group_0_binding_5_cs, ivec3(itc, int(local_id.z)), (int(local_id.z) + 1));\r\n    uvec4 value6_ = texelFetch(_group_0_binding_7_cs, ivec2(int(local_id.x), 0), int(local_id.z));\r\n    imageStore(_group_0_binding_2_cs, ivec2(itc.x, 0), ((((value1_ + value2_) + value4_) + value5_) + value6_));\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/image.queries.Vertex.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_texture_cube_map_array : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp sampler2D _group_0_binding_0_vs;\r\n\r\nuniform highp sampler2D _group_0_binding_1_vs;\r\n\r\nuniform highp sampler2DArray _group_0_binding_2_vs;\r\n\r\nuniform highp samplerCube _group_0_binding_3_vs;\r\n\r\nuniform highp samplerCubeArray _group_0_binding_4_vs;\r\n\r\nuniform highp sampler3D _group_0_binding_5_vs;\r\n\r\nuniform highp sampler2DMS _group_0_binding_6_vs;\r\n\r\n\r\nvoid main() {\r\n    int dim_1d = textureSize(_group_0_binding_0_vs, 0).x;\r\n    int dim_1d_lod = textureSize(_group_0_binding_0_vs, int(dim_1d)).x;\r\n    ivec2 dim_2d = textureSize(_group_0_binding_1_vs, 0).xy;\r\n    ivec2 dim_2d_lod = textureSize(_group_0_binding_1_vs, 1).xy;\r\n    ivec2 dim_2d_array = textureSize(_group_0_binding_2_vs, 0).xy;\r\n    ivec2 dim_2d_array_lod = textureSize(_group_0_binding_2_vs, 1).xy;\r\n    ivec2 dim_cube = textureSize(_group_0_binding_3_vs, 0).xy;\r\n    ivec2 dim_cube_lod = textureSize(_group_0_binding_3_vs, 1).xy;\r\n    ivec2 dim_cube_array = textureSize(_group_0_binding_4_vs, 0).xy;\r\n    ivec2 dim_cube_array_lod = textureSize(_group_0_binding_4_vs, 1).xy;\r\n    ivec3 dim_3d = textureSize(_group_0_binding_5_vs, 0).xyz;\r\n    ivec3 dim_3d_lod = textureSize(_group_0_binding_5_vs, 1).xyz;\r\n    ivec2 dim_2s_ms = textureSize(_group_0_binding_6_vs).xy;\r\n    int sum = ((((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z);\r\n    gl_Position = vec4(float(sum));\r\n    gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/image.texture_sample.Fragment.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_texture_cube_map_array : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp sampler2D _group_0_binding_0_fs;\r\n\r\nuniform highp sampler2D _group_0_binding_1_fs;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec2 tc = vec2(0.5);\r\n    vec4 s1d = texture(_group_0_binding_0_fs, vec2(tc.x, 0.0));\r\n    vec4 s2d = texture(_group_0_binding_1_fs, vec2(tc));\r\n    vec4 s2d_offset = textureOffset(_group_0_binding_1_fs, vec2(tc), ivec2(3, 1));\r\n    vec4 s2d_level = textureLod(_group_0_binding_1_fs, vec2(tc), 2.299999952316284);\r\n    vec4 s2d_level_offset = textureLodOffset(_group_0_binding_1_fs, vec2(tc), 2.299999952316284, ivec2(3, 1));\r\n    vec4 s2d_bias_offset = textureOffset(_group_0_binding_1_fs, vec2(tc), ivec2(3, 1), 2.0);\r\n    _fs2p_location0 = ((((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/image.texture_sample_comparison.Fragment.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_texture_cube_map_array : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp sampler2DShadow _group_1_binding_2_fs;\r\n\r\nuniform highp samplerCubeShadow _group_1_binding_3_fs;\r\n\r\nlayout(location = 0) out float _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec2 tc = vec2(0.5);\r\n    float s2d_depth = texture(_group_1_binding_2_fs, vec3(tc, 0.5));\r\n    float s2d_depth_level = textureLod(_group_1_binding_2_fs, vec3(tc, 0.5), 0.0);\r\n    float scube_depth_level = textureGrad(_group_1_binding_3_fs, vec4(vec3(0.5), 0.5), vec3(0.0), vec3(0.0));\r\n    _fs2p_location0 = (s2d_depth + s2d_depth_level);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/interpolate.frag_main.Fragment.glsl",
    "content": "#version 400 core\r\nstruct FragmentInput {\r\n    vec4 position;\r\n    uint _flat;\r\n    float _linear;\r\n    vec2 linear_centroid;\r\n    vec3 linear_sample;\r\n    vec4 perspective;\r\n    float perspective_centroid;\r\n    float perspective_sample;\r\n};\r\nflat in uint _vs2fs_location0;\r\nnoperspective in float _vs2fs_location1;\r\nnoperspective centroid in vec2 _vs2fs_location2;\r\nnoperspective sample in vec3 _vs2fs_location3;\r\nsmooth in vec4 _vs2fs_location4;\r\nsmooth centroid in float _vs2fs_location5;\r\nsmooth sample in float _vs2fs_location6;\r\n\r\nvoid main() {\r\n    FragmentInput val = FragmentInput(gl_FragCoord, _vs2fs_location0, _vs2fs_location1, _vs2fs_location2, _vs2fs_location3, _vs2fs_location4, _vs2fs_location5, _vs2fs_location6);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/interpolate.vert_main.Vertex.glsl",
    "content": "#version 400 core\r\nstruct FragmentInput {\r\n    vec4 position;\r\n    uint _flat;\r\n    float _linear;\r\n    vec2 linear_centroid;\r\n    vec3 linear_sample;\r\n    vec4 perspective;\r\n    float perspective_centroid;\r\n    float perspective_sample;\r\n};\r\nflat out uint _vs2fs_location0;\r\nnoperspective out float _vs2fs_location1;\r\nnoperspective centroid out vec2 _vs2fs_location2;\r\nnoperspective sample out vec3 _vs2fs_location3;\r\nsmooth out vec4 _vs2fs_location4;\r\nsmooth centroid out float _vs2fs_location5;\r\nsmooth sample out float _vs2fs_location6;\r\n\r\nvoid main() {\r\n    FragmentInput out_ = FragmentInput(vec4(0.0), 0u, 0.0, vec2(0.0), vec3(0.0), vec4(0.0), 0.0, 0.0);\r\n    out_.position = vec4(2.0, 4.0, 5.0, 6.0);\r\n    out_._flat = 8u;\r\n    out_._linear = 27.0;\r\n    out_.linear_centroid = vec2(64.0, 125.0);\r\n    out_.linear_sample = vec3(216.0, 343.0, 512.0);\r\n    out_.perspective = vec4(729.0, 1000.0, 1331.0, 1728.0);\r\n    out_.perspective_centroid = 2197.0;\r\n    out_.perspective_sample = 2744.0;\r\n    FragmentInput _e30 = out_;\r\n    gl_Position = _e30.position;\r\n    _vs2fs_location0 = _e30._flat;\r\n    _vs2fs_location1 = _e30._linear;\r\n    _vs2fs_location2 = _e30.linear_centroid;\r\n    _vs2fs_location3 = _e30.linear_sample;\r\n    _vs2fs_location4 = _e30.perspective;\r\n    _vs2fs_location5 = _e30.perspective_centroid;\r\n    _vs2fs_location6 = _e30.perspective_sample;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/math-functions.main.Vertex.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\n\r\nvoid main() {\r\n    vec4 v = vec4(0.0);\r\n    float a = degrees(1.0);\r\n    float b = radians(1.0);\r\n    vec4 c = degrees(v);\r\n    vec4 d = radians(v);\r\n    vec4 e = clamp(v, vec4(0.0), vec4(1.0));\r\n    int const_dot = ( + ivec2(0, 0).x * ivec2(0, 0).x + ivec2(0, 0).y * ivec2(0, 0).y);\r\n    uint first_leading_bit_abs = uint(findMSB(uint(abs(int(0u)))));\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/multiview.main.Vertex.glsl",
    "content": "#version 310 es\r\n#extension GL_EXT_multiview : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\n\r\nvoid main() {\r\n    int view_index = gl_ViewIndex;\r\n    gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/multiview_webgl.main.Vertex.glsl",
    "content": "#version 300 es\r\n#extension GL_OVR_multiview2 : require\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(num_views = 2) in;\r\n\r\n\r\nvoid main() {\r\n    int view_index = int(gl_ViewID_OVR);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/operators.main.Compute.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\r\n\r\nstruct Foo {\r\n    vec4 a;\r\n    int b;\r\n};\r\n\r\nvec4 builtins() {\r\n    int s1_ = (true ? 1 : 0);\r\n    vec4 s2_ = (true ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0));\r\n    vec4 s3_ = mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 0.0), bvec4(false, false, false, false));\r\n    vec4 m1_ = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), vec4(0.5, 0.5, 0.5, 0.5));\r\n    vec4 m2_ = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), 0.10000000149011612);\r\n    float b1_ = intBitsToFloat(ivec4(1, 1, 1, 1).x);\r\n    vec4 b2_ = intBitsToFloat(ivec4(1, 1, 1, 1));\r\n    ivec4 v_i32_zero = ivec4(vec4(0.0, 0.0, 0.0, 0.0));\r\n    return (((((vec4((ivec4(s1_) + v_i32_zero)) + s2_) + m1_) + m2_) + vec4(b1_)) + b2_);\r\n}\r\n\r\nvec4 splat() {\r\n    vec2 a_2 = (((vec2(1.0) + vec2(2.0)) - vec2(3.0)) / vec2(4.0));\r\n    ivec4 b = (ivec4(5) % ivec4(2));\r\n    return (a_2.xyxy + vec4(b));\r\n}\r\n\r\nvec2 splat_assignment() {\r\n    vec2 a = vec2(0.0);\r\n    a = vec2(2.0);\r\n    vec2 _e7 = a;\r\n    a = (_e7 + vec2(1.0));\r\n    vec2 _e11 = a;\r\n    a = (_e11 - vec2(3.0));\r\n    vec2 _e15 = a;\r\n    a = (_e15 / vec2(4.0));\r\n    vec2 _e19 = a;\r\n    return _e19;\r\n}\r\n\r\nvec3 bool_cast(vec3 x) {\r\n    bvec3 y = bvec3(x);\r\n    return vec3(y);\r\n}\r\n\r\nfloat constructors() {\r\n    Foo foo = Foo(vec4(0.0), 0);\r\n    foo = Foo(vec4(1.0), 1);\r\n    mat2x2 mat2comp = mat2x2(vec2(1.0, 0.0), vec2(0.0, 1.0));\r\n    mat4x4 mat4comp = mat4x4(vec4(1.0, 0.0, 0.0, 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));\r\n    uvec2 unnamed = uvec2(0u);\r\n    mat2x2 unnamed_1 = mat2x2(vec2(0.0), vec2(0.0));\r\n    int unnamed_2[4] = int[4](0, 1, 2, 3);\r\n    bool unnamed_3 = bool(false);\r\n    int unnamed_4 = int(0);\r\n    uint unnamed_5 = uint(0u);\r\n    float unnamed_6 = float(0.0);\r\n    uvec2 unnamed_7 = uvec2(uvec2(0u, 0u));\r\n    mat2x3 unnamed_8 = mat2x3(mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)));\r\n    uvec2 unnamed_9 = uvec2(0u, 0u);\r\n    mat2x3 unnamed_10 = mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0));\r\n    float _e75 = foo.a.x;\r\n    return _e75;\r\n}\r\n\r\nvoid logical() {\r\n    bool unnamed_11 = (!true);\r\n    bvec2 unnamed_12 = not(bvec2(true));\r\n    bool unnamed_13 = (true || false);\r\n    bool unnamed_14 = (true && false);\r\n    bool unnamed_15 = (true || false);\r\n    bvec3 unnamed_16 = bvec3(bvec3(true).x || bvec3(false).x, bvec3(true).y || bvec3(false).y, bvec3(true).z || bvec3(false).z);\r\n    bool unnamed_17 = (true && false);\r\n    bvec4 unnamed_18 = bvec4(bvec4(true).x && bvec4(false).x, bvec4(true).y && bvec4(false).y, bvec4(true).z && bvec4(false).z, bvec4(true).w && bvec4(false).w);\r\n}\r\n\r\nvoid arithmetic() {\r\n    ivec2 unnamed_19 = (-ivec2(1));\r\n    vec2 unnamed_20 = (-vec2(1.0));\r\n    int unnamed_21 = (2 + 1);\r\n    uint unnamed_22 = (2u + 1u);\r\n    float unnamed_23 = (2.0 + 1.0);\r\n    ivec2 unnamed_24 = (ivec2(2) + ivec2(1));\r\n    uvec3 unnamed_25 = (uvec3(2u) + uvec3(1u));\r\n    vec4 unnamed_26 = (vec4(2.0) + vec4(1.0));\r\n    int unnamed_27 = (2 - 1);\r\n    uint unnamed_28 = (2u - 1u);\r\n    float unnamed_29 = (2.0 - 1.0);\r\n    ivec2 unnamed_30 = (ivec2(2) - ivec2(1));\r\n    uvec3 unnamed_31 = (uvec3(2u) - uvec3(1u));\r\n    vec4 unnamed_32 = (vec4(2.0) - vec4(1.0));\r\n    int unnamed_33 = (2 * 1);\r\n    uint unnamed_34 = (2u * 1u);\r\n    float unnamed_35 = (2.0 * 1.0);\r\n    ivec2 unnamed_36 = (ivec2(2) * ivec2(1));\r\n    uvec3 unnamed_37 = (uvec3(2u) * uvec3(1u));\r\n    vec4 unnamed_38 = (vec4(2.0) * vec4(1.0));\r\n    int unnamed_39 = (2 / 1);\r\n    uint unnamed_40 = (2u / 1u);\r\n    float unnamed_41 = (2.0 / 1.0);\r\n    ivec2 unnamed_42 = (ivec2(2) / ivec2(1));\r\n    uvec3 unnamed_43 = (uvec3(2u) / uvec3(1u));\r\n    vec4 unnamed_44 = (vec4(2.0) / vec4(1.0));\r\n    int unnamed_45 = (2 % 1);\r\n    uint unnamed_46 = (2u % 1u);\r\n    float unnamed_47 = (2.0 - 1.0 * trunc(2.0 / 1.0));\r\n    ivec2 unnamed_48 = (ivec2(2) % ivec2(1));\r\n    uvec3 unnamed_49 = (uvec3(2u) % uvec3(1u));\r\n    vec4 unnamed_50 = (vec4(2.0) - vec4(1.0) * trunc(vec4(2.0) / vec4(1.0)));\r\n    ivec2 unnamed_51 = (ivec2(2) + ivec2(1));\r\n    ivec2 unnamed_52 = (ivec2(2) + ivec2(1));\r\n    uvec2 unnamed_53 = (uvec2(2u) + uvec2(1u));\r\n    uvec2 unnamed_54 = (uvec2(2u) + uvec2(1u));\r\n    vec2 unnamed_55 = (vec2(2.0) + vec2(1.0));\r\n    vec2 unnamed_56 = (vec2(2.0) + vec2(1.0));\r\n    ivec2 unnamed_57 = (ivec2(2) - ivec2(1));\r\n    ivec2 unnamed_58 = (ivec2(2) - ivec2(1));\r\n    uvec2 unnamed_59 = (uvec2(2u) - uvec2(1u));\r\n    uvec2 unnamed_60 = (uvec2(2u) - uvec2(1u));\r\n    vec2 unnamed_61 = (vec2(2.0) - vec2(1.0));\r\n    vec2 unnamed_62 = (vec2(2.0) - vec2(1.0));\r\n    ivec2 unnamed_63 = (ivec2(2) * 1);\r\n    ivec2 unnamed_64 = (2 * ivec2(1));\r\n    uvec2 unnamed_65 = (uvec2(2u) * 1u);\r\n    uvec2 unnamed_66 = (2u * uvec2(1u));\r\n    vec2 unnamed_67 = (vec2(2.0) * 1.0);\r\n    vec2 unnamed_68 = (2.0 * vec2(1.0));\r\n    ivec2 unnamed_69 = (ivec2(2) / ivec2(1));\r\n    ivec2 unnamed_70 = (ivec2(2) / ivec2(1));\r\n    uvec2 unnamed_71 = (uvec2(2u) / uvec2(1u));\r\n    uvec2 unnamed_72 = (uvec2(2u) / uvec2(1u));\r\n    vec2 unnamed_73 = (vec2(2.0) / vec2(1.0));\r\n    vec2 unnamed_74 = (vec2(2.0) / vec2(1.0));\r\n    ivec2 unnamed_75 = (ivec2(2) % ivec2(1));\r\n    ivec2 unnamed_76 = (ivec2(2) % ivec2(1));\r\n    uvec2 unnamed_77 = (uvec2(2u) % uvec2(1u));\r\n    uvec2 unnamed_78 = (uvec2(2u) % uvec2(1u));\r\n    vec2 unnamed_79 = (vec2(2.0) - vec2(1.0) * trunc(vec2(2.0) / vec2(1.0)));\r\n    vec2 unnamed_80 = (vec2(2.0) - vec2(1.0) * trunc(vec2(2.0) / vec2(1.0)));\r\n    mat3x3 unnamed_81 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) + mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)));\r\n    mat3x3 unnamed_82 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) - mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)));\r\n    mat3x3 unnamed_83 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * 1.0);\r\n    mat3x3 unnamed_84 = (2.0 * mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)));\r\n    vec3 unnamed_85 = (mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * vec4(1.0));\r\n    vec4 unnamed_86 = (vec3(2.0) * mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)));\r\n    mat3x3 unnamed_87 = (mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * mat3x4(vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0)));\r\n}\r\n\r\nvoid bit() {\r\n    int unnamed_88 = (~1);\r\n    uint unnamed_89 = (~1u);\r\n    ivec2 unnamed_90 = (~ivec2(1));\r\n    uvec3 unnamed_91 = (~uvec3(1u));\r\n    int unnamed_92 = (2 | 1);\r\n    uint unnamed_93 = (2u | 1u);\r\n    ivec2 unnamed_94 = (ivec2(2) | ivec2(1));\r\n    uvec3 unnamed_95 = (uvec3(2u) | uvec3(1u));\r\n    int unnamed_96 = (2 & 1);\r\n    uint unnamed_97 = (2u & 1u);\r\n    ivec2 unnamed_98 = (ivec2(2) & ivec2(1));\r\n    uvec3 unnamed_99 = (uvec3(2u) & uvec3(1u));\r\n    int unnamed_100 = (2 ^ 1);\r\n    uint unnamed_101 = (2u ^ 1u);\r\n    ivec2 unnamed_102 = (ivec2(2) ^ ivec2(1));\r\n    uvec3 unnamed_103 = (uvec3(2u) ^ uvec3(1u));\r\n    int unnamed_104 = (2 << 1u);\r\n    uint unnamed_105 = (2u << 1u);\r\n    ivec2 unnamed_106 = (ivec2(2) << uvec2(1u));\r\n    uvec3 unnamed_107 = (uvec3(2u) << uvec3(1u));\r\n    int unnamed_108 = (2 >> 1u);\r\n    uint unnamed_109 = (2u >> 1u);\r\n    ivec2 unnamed_110 = (ivec2(2) >> uvec2(1u));\r\n    uvec3 unnamed_111 = (uvec3(2u) >> uvec3(1u));\r\n}\r\n\r\nvoid comparison() {\r\n    bool unnamed_112 = (2 == 1);\r\n    bool unnamed_113 = (2u == 1u);\r\n    bool unnamed_114 = (2.0 == 1.0);\r\n    bvec2 unnamed_115 = equal(ivec2(2), ivec2(1));\r\n    bvec3 unnamed_116 = equal(uvec3(2u), uvec3(1u));\r\n    bvec4 unnamed_117 = equal(vec4(2.0), vec4(1.0));\r\n    bool unnamed_118 = (2 != 1);\r\n    bool unnamed_119 = (2u != 1u);\r\n    bool unnamed_120 = (2.0 != 1.0);\r\n    bvec2 unnamed_121 = notEqual(ivec2(2), ivec2(1));\r\n    bvec3 unnamed_122 = notEqual(uvec3(2u), uvec3(1u));\r\n    bvec4 unnamed_123 = notEqual(vec4(2.0), vec4(1.0));\r\n    bool unnamed_124 = (2 < 1);\r\n    bool unnamed_125 = (2u < 1u);\r\n    bool unnamed_126 = (2.0 < 1.0);\r\n    bvec2 unnamed_127 = lessThan(ivec2(2), ivec2(1));\r\n    bvec3 unnamed_128 = lessThan(uvec3(2u), uvec3(1u));\r\n    bvec4 unnamed_129 = lessThan(vec4(2.0), vec4(1.0));\r\n    bool unnamed_130 = (2 <= 1);\r\n    bool unnamed_131 = (2u <= 1u);\r\n    bool unnamed_132 = (2.0 <= 1.0);\r\n    bvec2 unnamed_133 = lessThanEqual(ivec2(2), ivec2(1));\r\n    bvec3 unnamed_134 = lessThanEqual(uvec3(2u), uvec3(1u));\r\n    bvec4 unnamed_135 = lessThanEqual(vec4(2.0), vec4(1.0));\r\n    bool unnamed_136 = (2 > 1);\r\n    bool unnamed_137 = (2u > 1u);\r\n    bool unnamed_138 = (2.0 > 1.0);\r\n    bvec2 unnamed_139 = greaterThan(ivec2(2), ivec2(1));\r\n    bvec3 unnamed_140 = greaterThan(uvec3(2u), uvec3(1u));\r\n    bvec4 unnamed_141 = greaterThan(vec4(2.0), vec4(1.0));\r\n    bool unnamed_142 = (2 >= 1);\r\n    bool unnamed_143 = (2u >= 1u);\r\n    bool unnamed_144 = (2.0 >= 1.0);\r\n    bvec2 unnamed_145 = greaterThanEqual(ivec2(2), ivec2(1));\r\n    bvec3 unnamed_146 = greaterThanEqual(uvec3(2u), uvec3(1u));\r\n    bvec4 unnamed_147 = greaterThanEqual(vec4(2.0), vec4(1.0));\r\n}\r\n\r\nvoid assignment() {\r\n    int a_1 = 1;\r\n    ivec3 vec0_ = ivec3(0, 0, 0);\r\n    int _e6 = a_1;\r\n    a_1 = (_e6 + 1);\r\n    int _e9 = a_1;\r\n    a_1 = (_e9 - 1);\r\n    int _e12 = a_1;\r\n    int _e13 = a_1;\r\n    a_1 = (_e12 * _e13);\r\n    int _e15 = a_1;\r\n    int _e16 = a_1;\r\n    a_1 = (_e15 / _e16);\r\n    int _e18 = a_1;\r\n    a_1 = (_e18 % 1);\r\n    int _e21 = a_1;\r\n    a_1 = (_e21 & 0);\r\n    int _e24 = a_1;\r\n    a_1 = (_e24 | 0);\r\n    int _e27 = a_1;\r\n    a_1 = (_e27 ^ 0);\r\n    int _e30 = a_1;\r\n    a_1 = (_e30 << 2u);\r\n    int _e33 = a_1;\r\n    a_1 = (_e33 >> 1u);\r\n    int _e36 = a_1;\r\n    a_1 = (_e36 + 1);\r\n    int _e39 = a_1;\r\n    a_1 = (_e39 - 1);\r\n    int _e46 = vec0_.y;\r\n    vec0_.y = (_e46 + 1);\r\n    int _e51 = vec0_.y;\r\n    vec0_.y = (_e51 - 1);\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    vec4 _e4 = builtins();\r\n    vec4 _e5 = splat();\r\n    vec3 _e7 = bool_cast(vec4(1.0, 1.0, 1.0, 1.0).xyz);\r\n    float _e8 = constructors();\r\n    logical();\r\n    arithmetic();\r\n    bit();\r\n    comparison();\r\n    assignment();\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/padding.vertex.Vertex.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct S {\r\n    vec3 a;\r\n};\r\nstruct Test {\r\n    S a;\r\n    float b;\r\n};\r\nstruct Test2_ {\r\n    vec3 a[2];\r\n    float b;\r\n};\r\nstruct Test3_ {\r\n    mat4x3 a;\r\n    float b;\r\n};\r\nuniform Test_block_0Vertex { Test _group_0_binding_0_vs; };\r\n\r\nuniform Test2__block_1Vertex { Test2_ _group_0_binding_1_vs; };\r\n\r\nuniform Test3__block_2Vertex { Test3_ _group_0_binding_2_vs; };\r\n\r\n\r\nvoid main() {\r\n    float _e6 = _group_0_binding_0_vs.b;\r\n    float _e9 = _group_0_binding_1_vs.b;\r\n    float _e12 = _group_0_binding_2_vs.b;\r\n    gl_Position = (((vec4(1.0) * _e6) * _e9) * _e12);\r\n    gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/push-constants.main.Fragment.glsl",
    "content": "#version 320 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct PushConstants {\r\n    float multiplier;\r\n};\r\nstruct FragmentIn {\r\n    vec4 color;\r\n};\r\nuniform PushConstants pc;\r\n\r\nlayout(location = 0) smooth in vec4 _vs2fs_location0;\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    FragmentIn in_ = FragmentIn(_vs2fs_location0);\r\n    float _e4 = pc.multiplier;\r\n    _fs2p_location0 = (in_.color * _e4);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/push-constants.vert_main.Vertex.glsl",
    "content": "#version 320 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct PushConstants {\r\n    float multiplier;\r\n};\r\nstruct FragmentIn {\r\n    vec4 color;\r\n};\r\nuniform PushConstants pc;\r\n\r\nlayout(location = 0) in vec2 _p2vs_location0;\r\n\r\nvoid main() {\r\n    vec2 pos = _p2vs_location0;\r\n    uint vi = uint(gl_VertexID);\r\n    float _e5 = pc.multiplier;\r\n    gl_Position = vec4(((float(vi) * _e5) * pos), 0.0, 1.0);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/quad-vert.main.Vertex.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct gen_gl_PerVertex {\r\n    vec4 gen_gl_Position;\r\n    float gen_gl_PointSize;\r\n    float gen_gl_ClipDistance[1];\r\n    float gen_gl_CullDistance[1];\r\n};\r\nstruct type_9 {\r\n    vec2 member;\r\n    vec4 gen_gl_Position;\r\n};\r\nvec2 v_uv = vec2(0.0);\r\n\r\nvec2 a_uv_1 = vec2(0.0);\r\n\r\ngen_gl_PerVertex perVertexStruct = gen_gl_PerVertex(vec4(0.0, 0.0, 0.0, 1.0), 1.0, float[1](0.0), float[1](0.0));\r\n\r\nvec2 a_pos_1 = vec2(0.0);\r\n\r\nlayout(location = 1) in vec2 _p2vs_location1;\r\nlayout(location = 0) in vec2 _p2vs_location0;\r\nlayout(location = 0) smooth out vec2 _vs2fs_location0;\r\n\r\nvoid main_1() {\r\n    vec2 _e12 = a_uv_1;\r\n    v_uv = _e12;\r\n    vec2 _e13 = a_pos_1;\r\n    perVertexStruct.gen_gl_Position = vec4(_e13.x, _e13.y, 0.0, 1.0);\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    vec2 a_uv = _p2vs_location1;\r\n    vec2 a_pos = _p2vs_location0;\r\n    a_uv_1 = a_uv;\r\n    a_pos_1 = a_pos;\r\n    main_1();\r\n    vec2 _e7 = v_uv;\r\n    vec4 _e8 = perVertexStruct.gen_gl_Position;\r\n    type_9 _tmp_return = type_9(_e7, _e8);\r\n    _vs2fs_location0 = _tmp_return.member;\r\n    gl_Position = _tmp_return.gen_gl_Position;\r\n    gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/quad.frag_main.Fragment.glsl",
    "content": "#version 300 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec2 uv;\r\n    vec4 position;\r\n};\r\nuniform highp sampler2D _group_0_binding_0_fs;\r\n\r\nsmooth in vec2 _vs2fs_location0;\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec2 uv_1 = _vs2fs_location0;\r\n    vec4 color = texture(_group_0_binding_0_fs, vec2(uv_1));\r\n    if ((color.w == 0.0)) {\r\n        discard;\r\n    }\r\n    vec4 premultiplied = (color.w * color);\r\n    _fs2p_location0 = premultiplied;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/quad.fs_extra.Fragment.glsl",
    "content": "#version 300 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec2 uv;\r\n    vec4 position;\r\n};\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    _fs2p_location0 = vec4(0.0, 0.5, 0.0, 0.5);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/quad.main.Fragment.glsl",
    "content": "#version 300 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec2 uv;\r\n    vec4 position;\r\n};\r\n\r\nuniform highp sampler2D _group_0_binding_0;\r\n\r\nsmooth in vec2 _vs2fs_location0;\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec2 uv_1 = _vs2fs_location0;\r\n    vec4 color = texture(_group_0_binding_0, vec2(uv_1));\r\n    if ((color.w == 0.0)) {\r\n        discard;\r\n    }\r\n    vec4 premultiplied = (color.w * color);\r\n    _fs2p_location0 = premultiplied;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/quad.main.Vertex.glsl",
    "content": "#version 300 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec2 uv;\r\n    vec4 position;\r\n};\r\n\r\nlayout(location = 0) in vec2 _p2vs_location0;\r\nlayout(location = 1) in vec2 _p2vs_location1;\r\nsmooth out vec2 _vs2fs_location0;\r\n\r\nvoid main() {\r\n    vec2 pos = _p2vs_location0;\r\n    vec2 uv = _p2vs_location1;\r\n    VertexOutput _tmp_return = VertexOutput(uv, vec4((1.2000000476837158 * pos), 0.0, 1.0));\r\n    _vs2fs_location0 = _tmp_return.uv;\r\n    gl_Position = _tmp_return.position;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/quad.vert_main.Vertex.glsl",
    "content": "#version 300 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec2 uv;\r\n    vec4 position;\r\n};\r\nlayout(location = 0) in vec2 _p2vs_location0;\r\nlayout(location = 1) in vec2 _p2vs_location1;\r\nsmooth out vec2 _vs2fs_location0;\r\n\r\nvoid main() {\r\n    vec2 pos = _p2vs_location0;\r\n    vec2 uv = _p2vs_location1;\r\n    VertexOutput _tmp_return = VertexOutput(uv, vec4((1.2000000476837158 * pos), 0.0, 1.0));\r\n    _vs2fs_location0 = _tmp_return.uv;\r\n    gl_Position = _tmp_return.position;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/shadow.fs_main.Fragment.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct Globals {\r\n    mat4x4 view_proj;\r\n    uvec4 num_lights;\r\n};\r\nstruct Entity {\r\n    mat4x4 world;\r\n    vec4 color;\r\n};\r\nstruct VertexOutput {\r\n    vec4 proj_position;\r\n    vec3 world_normal;\r\n    vec4 world_position;\r\n};\r\nstruct Light {\r\n    mat4x4 proj;\r\n    vec4 pos;\r\n    vec4 color;\r\n};\r\nuniform Globals_block_0Fragment { Globals _group_0_binding_0_fs; };\r\n\r\nuniform Entity_block_1Fragment { Entity _group_1_binding_0_fs; };\r\n\r\nlayout(std430) readonly buffer type_6_block_2Fragment { Light _group_0_binding_1_fs[]; };\r\n\r\nuniform highp sampler2DArrayShadow _group_0_binding_2_fs;\r\n\r\nlayout(location = 0) smooth in vec3 _vs2fs_location0;\r\nlayout(location = 1) smooth in vec4 _vs2fs_location1;\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nfloat fetch_shadow(uint light_id, vec4 homogeneous_coords) {\r\n    if ((homogeneous_coords.w <= 0.0)) {\r\n        return 1.0;\r\n    }\r\n    vec2 flip_correction = vec2(0.5, -0.5);\r\n    float proj_correction = (1.0 / homogeneous_coords.w);\r\n    vec2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + vec2(0.5, 0.5));\r\n    float _e28 = textureGrad(_group_0_binding_2_fs, vec4(light_local, int(light_id), (homogeneous_coords.z * proj_correction)), vec2(0.0), vec2(0.0));\r\n    return _e28;\r\n}\r\n\r\nvoid main() {\r\n    VertexOutput in_ = VertexOutput(gl_FragCoord, _vs2fs_location0, _vs2fs_location1);\r\n    vec3 color = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\n    uint i = 0u;\r\n    vec3 normal_1 = normalize(in_.world_normal);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _e20 = i;\r\n            i = (_e20 + 1u);\r\n        }\r\n        loop_init = false;\r\n        uint _e14 = i;\r\n        uint _e17 = _group_0_binding_0_fs.num_lights.x;\r\n        if ((_e14 < min(_e17, 10u))) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _e23 = i;\r\n        Light light = _group_0_binding_1_fs[_e23];\r\n        uint _e26 = i;\r\n        float _e30 = fetch_shadow(_e26, (light.proj * in_.world_position));\r\n        vec3 light_dir = normalize((light.pos.xyz - in_.world_position.xyz));\r\n        float diffuse = max(0.0, dot(normal_1, light_dir));\r\n        vec3 _e40 = color;\r\n        color = (_e40 + ((_e30 * diffuse) * light.color.xyz));\r\n    }\r\n    vec3 _e46 = color;\r\n    vec4 _e50 = _group_1_binding_0_fs.color;\r\n    _fs2p_location0 = (vec4(_e46, 1.0) * _e50);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/shadow.fs_main_without_storage.Fragment.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct Globals {\r\n    mat4x4 view_proj;\r\n    uvec4 num_lights;\r\n};\r\nstruct Entity {\r\n    mat4x4 world;\r\n    vec4 color;\r\n};\r\nstruct VertexOutput {\r\n    vec4 proj_position;\r\n    vec3 world_normal;\r\n    vec4 world_position;\r\n};\r\nstruct Light {\r\n    mat4x4 proj;\r\n    vec4 pos;\r\n    vec4 color;\r\n};\r\nuniform Globals_block_0Fragment { Globals _group_0_binding_0_fs; };\r\n\r\nuniform Entity_block_1Fragment { Entity _group_1_binding_0_fs; };\r\n\r\nuniform type_7_block_2Fragment { Light _group_0_binding_1_fs[10]; };\r\n\r\nuniform highp sampler2DArrayShadow _group_0_binding_2_fs;\r\n\r\nlayout(location = 0) smooth in vec3 _vs2fs_location0;\r\nlayout(location = 1) smooth in vec4 _vs2fs_location1;\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nfloat fetch_shadow(uint light_id, vec4 homogeneous_coords) {\r\n    if ((homogeneous_coords.w <= 0.0)) {\r\n        return 1.0;\r\n    }\r\n    vec2 flip_correction = vec2(0.5, -0.5);\r\n    float proj_correction = (1.0 / homogeneous_coords.w);\r\n    vec2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + vec2(0.5, 0.5));\r\n    float _e28 = textureGrad(_group_0_binding_2_fs, vec4(light_local, int(light_id), (homogeneous_coords.z * proj_correction)), vec2(0.0), vec2(0.0));\r\n    return _e28;\r\n}\r\n\r\nvoid main() {\r\n    VertexOutput in_1 = VertexOutput(gl_FragCoord, _vs2fs_location0, _vs2fs_location1);\r\n    vec3 color_1 = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\n    uint i_1 = 0u;\r\n    vec3 normal_1 = normalize(in_1.world_normal);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _e20 = i_1;\r\n            i_1 = (_e20 + 1u);\r\n        }\r\n        loop_init = false;\r\n        uint _e14 = i_1;\r\n        uint _e17 = _group_0_binding_0_fs.num_lights.x;\r\n        if ((_e14 < min(_e17, 10u))) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _e23 = i_1;\r\n        Light light = _group_0_binding_1_fs[_e23];\r\n        uint _e26 = i_1;\r\n        float _e30 = fetch_shadow(_e26, (light.proj * in_1.world_position));\r\n        vec3 light_dir = normalize((light.pos.xyz - in_1.world_position.xyz));\r\n        float diffuse = max(0.0, dot(normal_1, light_dir));\r\n        vec3 _e40 = color_1;\r\n        color_1 = (_e40 + ((_e30 * diffuse) * light.color.xyz));\r\n    }\r\n    vec3 _e46 = color_1;\r\n    vec4 _e50 = _group_1_binding_0_fs.color;\r\n    _fs2p_location0 = (vec4(_e46, 1.0) * _e50);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/shadow.vs_main.Vertex.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct Globals {\r\n    mat4x4 view_proj;\r\n    uvec4 num_lights;\r\n};\r\nstruct Entity {\r\n    mat4x4 world;\r\n    vec4 color;\r\n};\r\nstruct VertexOutput {\r\n    vec4 proj_position;\r\n    vec3 world_normal;\r\n    vec4 world_position;\r\n};\r\nstruct Light {\r\n    mat4x4 proj;\r\n    vec4 pos;\r\n    vec4 color;\r\n};\r\nuniform Globals_block_0Vertex { Globals _group_0_binding_0_vs; };\r\n\r\nuniform Entity_block_1Vertex { Entity _group_1_binding_0_vs; };\r\n\r\nlayout(location = 0) in ivec4 _p2vs_location0;\r\nlayout(location = 1) in ivec4 _p2vs_location1;\r\nlayout(location = 0) smooth out vec3 _vs2fs_location0;\r\nlayout(location = 1) smooth out vec4 _vs2fs_location1;\r\n\r\nvoid main() {\r\n    ivec4 position = _p2vs_location0;\r\n    ivec4 normal = _p2vs_location1;\r\n    VertexOutput out_ = VertexOutput(vec4(0.0), vec3(0.0), vec4(0.0));\r\n    mat4x4 w = _group_1_binding_0_vs.world;\r\n    mat4x4 _e7 = _group_1_binding_0_vs.world;\r\n    vec4 world_pos = (_e7 * vec4(position));\r\n    out_.world_normal = (mat3x3(w[0].xyz, w[1].xyz, w[2].xyz) * vec3(normal.xyz));\r\n    out_.world_position = world_pos;\r\n    mat4x4 _e25 = _group_0_binding_0_vs.view_proj;\r\n    out_.proj_position = (_e25 * world_pos);\r\n    VertexOutput _e27 = out_;\r\n    gl_Position = _e27.proj_position;\r\n    _vs2fs_location0 = _e27.world_normal;\r\n    _vs2fs_location1 = _e27.world_position;\r\n    gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/skybox.fs_main.Fragment.glsl",
    "content": "#version 320 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec4 position;\r\n    vec3 uv;\r\n};\r\nstruct Data {\r\n    mat4x4 proj_inv;\r\n    mat4x4 view;\r\n};\r\nlayout(binding = 0) uniform highp samplerCube _group_0_binding_1_fs;\r\n\r\nlayout(location = 0) smooth in vec3 _vs2fs_location0;\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    VertexOutput in_ = VertexOutput(gl_FragCoord, _vs2fs_location0);\r\n    vec4 _e5 = texture(_group_0_binding_1_fs, vec3(in_.uv));\r\n    _fs2p_location0 = _e5;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/skybox.vs_main.Vertex.glsl",
    "content": "#version 320 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nstruct VertexOutput {\r\n    vec4 position;\r\n    vec3 uv;\r\n};\r\nstruct Data {\r\n    mat4x4 proj_inv;\r\n    mat4x4 view;\r\n};\r\nlayout(std140, binding = 0) uniform Data_block_0Vertex { Data _group_0_binding_0_vs; };\r\n\r\nlayout(location = 0) smooth out vec3 _vs2fs_location0;\r\n\r\nvoid main() {\r\n    uint vertex_index = uint(gl_VertexID);\r\n    int tmp1_ = 0;\r\n    int tmp2_ = 0;\r\n    tmp1_ = (int(vertex_index) / 2);\r\n    tmp2_ = (int(vertex_index) & 1);\r\n    int _e10 = tmp1_;\r\n    int _e16 = tmp2_;\r\n    vec4 pos = vec4(((float(_e10) * 4.0) - 1.0), ((float(_e16) * 4.0) - 1.0), 0.0, 1.0);\r\n    vec4 _e27 = _group_0_binding_0_vs.view[0];\r\n    vec4 _e31 = _group_0_binding_0_vs.view[1];\r\n    vec4 _e35 = _group_0_binding_0_vs.view[2];\r\n    mat3x3 inv_model_view = transpose(mat3x3(_e27.xyz, _e31.xyz, _e35.xyz));\r\n    mat4x4 _e40 = _group_0_binding_0_vs.proj_inv;\r\n    vec4 unprojected = (_e40 * pos);\r\n    VertexOutput _tmp_return = VertexOutput(pos, (inv_model_view * unprojected.xyz));\r\n    gl_Position = _tmp_return.position;\r\n    _vs2fs_location0 = _tmp_return.uv;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/standard.derivatives.Fragment.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvoid main() {\r\n    vec4 foo = gl_FragCoord;\r\n    vec4 x = dFdx(foo);\r\n    vec4 y = dFdy(foo);\r\n    vec4 z = fwidth(foo);\r\n    _fs2p_location0 = ((x + y) * z);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/texture-arg.main.Fragment.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp sampler2D _group_0_binding_0_fs;\r\n\r\nlayout(location = 0) out vec4 _fs2p_location0;\r\n\r\nvec4 test(highp sampler2D Passed_Texture) {\r\n    vec4 _e7 = texture(Passed_Texture, vec2(vec2(0.0, 0.0)));\r\n    return _e7;\r\n}\r\n\r\nvoid main() {\r\n    vec4 _e2 = test(_group_0_binding_0_fs);\r\n    _fs2p_location0 = _e2;\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/glsl/variations-glsl.main.Fragment.glsl",
    "content": "#version 310 es\r\n\r\nprecision highp float;\r\nprecision highp int;\r\n\r\nuniform highp samplerCube _group_0_binding_0_fs;\r\n\r\n\r\nvoid main_1() {\r\n    ivec2 sizeCube = ivec2(0);\r\n    float a = 0.0;\r\n    sizeCube = textureSize(_group_0_binding_0_fs, 0).xy;\r\n    a = ceil(1.0);\r\n    return;\r\n}\r\n\r\nvoid main() {\r\n    main_1();\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/access.hlsl",
    "content": "\r\ntypedef struct { float2 _0; float2 _1; } __mat2x2;\r\nfloat2 __get_col_of_mat2x2(__mat2x2 mat, uint idx) {\r\n    switch(idx) {\r\n    case 0: { return mat._0; }\r\n    case 1: { return mat._1; }\r\n    default: { return (float2)0; }\r\n    }\r\n}\r\nvoid __set_col_of_mat2x2(__mat2x2 mat, uint idx, float2 value) {\r\n    switch(idx) {\r\n    case 0: { mat._0 = value; break; }\r\n    case 1: { mat._1 = value; break; }\r\n    }\r\n}\r\nvoid __set_el_of_mat2x2(__mat2x2 mat, uint idx, uint vec_idx, float value) {\r\n    switch(idx) {\r\n    case 0: { mat._0[vec_idx] = value; break; }\r\n    case 1: { mat._1[vec_idx] = value; break; }\r\n    }\r\n}\r\n\r\ntypedef struct { float2 _0; float2 _1; float2 _2; float2 _3; } __mat4x2;\r\nfloat2 __get_col_of_mat4x2(__mat4x2 mat, uint idx) {\r\n    switch(idx) {\r\n    case 0: { return mat._0; }\r\n    case 1: { return mat._1; }\r\n    case 2: { return mat._2; }\r\n    case 3: { return mat._3; }\r\n    default: { return (float2)0; }\r\n    }\r\n}\r\nvoid __set_col_of_mat4x2(__mat4x2 mat, uint idx, float2 value) {\r\n    switch(idx) {\r\n    case 0: { mat._0 = value; break; }\r\n    case 1: { mat._1 = value; break; }\r\n    case 2: { mat._2 = value; break; }\r\n    case 3: { mat._3 = value; break; }\r\n    }\r\n}\r\nvoid __set_el_of_mat4x2(__mat4x2 mat, uint idx, uint vec_idx, float value) {\r\n    switch(idx) {\r\n    case 0: { mat._0[vec_idx] = value; break; }\r\n    case 1: { mat._1[vec_idx] = value; break; }\r\n    case 2: { mat._2[vec_idx] = value; break; }\r\n    case 3: { mat._3[vec_idx] = value; break; }\r\n    }\r\n}\r\n\r\nstruct GlobalConst {\r\n    uint a;\r\n    int _pad1_0;\r\n    int _pad1_1;\r\n    int _pad1_2;\r\n    uint3 b;\r\n    int c;\r\n};\r\n\r\nstruct AlignedWrapper {\r\n    int value;\r\n    int _end_pad_0;\r\n};\r\n\r\nstruct Baz {\r\n    float2 m_0; float2 m_1; float2 m_2;\r\n};\r\n\r\nstruct MatCx2InArray {\r\n    __mat4x2 am[2];\r\n};\r\n\r\nGlobalConst ConstructGlobalConst(uint arg0, uint3 arg1, int arg2) {\r\n    GlobalConst ret = (GlobalConst)0;\r\n    ret.a = arg0;\r\n    ret.b = arg1;\r\n    ret.c = arg2;\r\n    return ret;\r\n}\r\n\r\ntypedef float4x2 ret_Constructarray2_float4x2_[2];\r\nret_Constructarray2_float4x2_ Constructarray2_float4x2_(float4x2 arg0, float4x2 arg1) {\r\n    float4x2 ret[2] = { arg0, arg1 };\r\n    return ret;\r\n}\r\n\r\ntypedef float ret_Constructarray10_float_[10];\r\nret_Constructarray10_float_ Constructarray10_float_(float arg0, float arg1, float arg2, float arg3, float arg4, float arg5, float arg6, float arg7, float arg8, float arg9) {\r\n    float ret[10] = { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 };\r\n    return ret;\r\n}\r\n\r\ntypedef float ret_Constructarray5_array10_float__[5][10];\r\nret_Constructarray5_array10_float__ Constructarray5_array10_float__(float arg0[10], float arg1[10], float arg2[10], float arg3[10], float arg4[10]) {\r\n    float ret[5][10] = { arg0, arg1, arg2, arg3, arg4 };\r\n    return ret;\r\n}\r\n\r\nstatic GlobalConst global_const = ConstructGlobalConst(0u, uint3(0u, 0u, 0u), 0);\r\nRWByteAddressBuffer bar : register(u0);\r\ncbuffer baz : register(b1) { Baz baz; }\r\nRWByteAddressBuffer qux : register(u2);\r\ncbuffer nested_mat_cx2_ : register(b3) { MatCx2InArray nested_mat_cx2_; }\r\ngroupshared uint val;\r\n\r\nfloat3x2 GetMatmOnBaz(Baz obj) {\r\n    return float3x2(obj.m_0, obj.m_1, obj.m_2);\r\n}\r\n\r\nvoid SetMatmOnBaz(Baz obj, float3x2 mat) {\r\n    obj.m_0 = mat[0];\r\n    obj.m_1 = mat[1];\r\n    obj.m_2 = mat[2];\r\n}\r\n\r\nvoid SetMatVecmOnBaz(Baz obj, float2 vec, uint mat_idx) {\r\n    switch(mat_idx) {\r\n    case 0: { obj.m_0 = vec; break; }\r\n    case 1: { obj.m_1 = vec; break; }\r\n    case 2: { obj.m_2 = vec; break; }\r\n    }\r\n}\r\n\r\nvoid SetMatScalarmOnBaz(Baz obj, float scalar, uint mat_idx, uint vec_idx) {\r\n    switch(mat_idx) {\r\n    case 0: { obj.m_0[vec_idx] = scalar; break; }\r\n    case 1: { obj.m_1[vec_idx] = scalar; break; }\r\n    case 2: { obj.m_2[vec_idx] = scalar; break; }\r\n    }\r\n}\r\n\r\nBaz ConstructBaz(float3x2 arg0) {\r\n    Baz ret = (Baz)0;\r\n    ret.m_0 = arg0[0];\r\n    ret.m_1 = arg0[1];\r\n    ret.m_2 = arg0[2];\r\n    return ret;\r\n}\r\n\r\nvoid test_matrix_within_struct_accesses()\r\n{\r\n    int idx = 1;\r\n    Baz t = (Baz)0;\r\n\r\n    int _expr6 = idx;\r\n    idx = (_expr6 - 1);\r\n    float3x2 unnamed = GetMatmOnBaz(baz);\r\n    float2 unnamed_1 = GetMatmOnBaz(baz)[0];\r\n    int _expr16 = idx;\r\n    float2 unnamed_2 = GetMatmOnBaz(baz)[_expr16];\r\n    float unnamed_3 = GetMatmOnBaz(baz)[0][1];\r\n    int _expr28 = idx;\r\n    float unnamed_4 = GetMatmOnBaz(baz)[0][_expr28];\r\n    int _expr32 = idx;\r\n    float unnamed_5 = GetMatmOnBaz(baz)[_expr32][1];\r\n    int _expr38 = idx;\r\n    int _expr40 = idx;\r\n    float unnamed_6 = GetMatmOnBaz(baz)[_expr38][_expr40];\r\n    t = ConstructBaz(float3x2((1.0).xx, (2.0).xx, (3.0).xx));\r\n    int _expr52 = idx;\r\n    idx = (_expr52 + 1);\r\n    SetMatmOnBaz(t, float3x2((6.0).xx, (5.0).xx, (4.0).xx));\r\n    t.m_0 = (9.0).xx;\r\n    int _expr69 = idx;\r\n    SetMatVecmOnBaz(t, (90.0).xx, _expr69);\r\n    t.m_0[1] = 10.0;\r\n    int _expr82 = idx;\r\n    t.m_0[_expr82] = 20.0;\r\n    int _expr86 = idx;\r\n    SetMatScalarmOnBaz(t, 30.0, _expr86, 1);\r\n    int _expr92 = idx;\r\n    int _expr94 = idx;\r\n    SetMatScalarmOnBaz(t, 40.0, _expr92, _expr94);\r\n    return;\r\n}\r\n\r\nMatCx2InArray ConstructMatCx2InArray(float4x2 arg0[2]) {\r\n    MatCx2InArray ret = (MatCx2InArray)0;\r\n    ret.am = (__mat4x2[2])arg0;\r\n    return ret;\r\n}\r\n\r\nvoid test_matrix_within_array_within_struct_accesses()\r\n{\r\n    int idx_1 = 1;\r\n    MatCx2InArray t_1 = (MatCx2InArray)0;\r\n\r\n    int _expr7 = idx_1;\r\n    idx_1 = (_expr7 - 1);\r\n    float4x2 unnamed_7[2] = ((float4x2[2])nested_mat_cx2_.am);\r\n    float4x2 unnamed_8 = ((float4x2)nested_mat_cx2_.am[0]);\r\n    float2 unnamed_9 = nested_mat_cx2_.am[0]._0;\r\n    int _expr25 = idx_1;\r\n    float2 unnamed_10 = __get_col_of_mat4x2(nested_mat_cx2_.am[0], _expr25);\r\n    float unnamed_11 = nested_mat_cx2_.am[0]._0[1];\r\n    int _expr41 = idx_1;\r\n    float unnamed_12 = nested_mat_cx2_.am[0]._0[_expr41];\r\n    int _expr47 = idx_1;\r\n    float unnamed_13 = __get_col_of_mat4x2(nested_mat_cx2_.am[0], _expr47)[1];\r\n    int _expr55 = idx_1;\r\n    int _expr57 = idx_1;\r\n    float unnamed_14 = __get_col_of_mat4x2(nested_mat_cx2_.am[0], _expr55)[_expr57];\r\n    t_1 = ConstructMatCx2InArray(Constructarray2_float4x2_(float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0)), float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0))));\r\n    int _expr63 = idx_1;\r\n    idx_1 = (_expr63 + 1);\r\n    t_1.am = (__mat4x2[2])Constructarray2_float4x2_(float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0)), float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0)));\r\n    t_1.am[0] = (__mat4x2)float4x2((8.0).xx, (7.0).xx, (6.0).xx, (5.0).xx);\r\n    t_1.am[0]._0 = (9.0).xx;\r\n    int _expr90 = idx_1;\r\n    __set_col_of_mat4x2(t_1.am[0], _expr90, (90.0).xx);\r\n    t_1.am[0]._0[1] = 10.0;\r\n    int _expr107 = idx_1;\r\n    t_1.am[0]._0[_expr107] = 20.0;\r\n    int _expr113 = idx_1;\r\n    __set_el_of_mat4x2(t_1.am[0], _expr113, 1, 30.0);\r\n    int _expr121 = idx_1;\r\n    int _expr123 = idx_1;\r\n    __set_el_of_mat4x2(t_1.am[0], _expr121, _expr123, 40.0);\r\n    return;\r\n}\r\n\r\nfloat read_from_private(inout float foo_1)\r\n{\r\n    float _expr6 = foo_1;\r\n    return _expr6;\r\n}\r\n\r\nfloat test_arr_as_arg(float a[5][10])\r\n{\r\n    return a[4][9];\r\n}\r\n\r\nvoid assign_through_ptr_fn(inout uint p)\r\n{\r\n    p = 42u;\r\n    return;\r\n}\r\n\r\nuint NagaBufferLengthRW(RWByteAddressBuffer buffer)\r\n{\r\n    uint ret;\r\n    buffer.GetDimensions(ret);\r\n    return ret;\r\n}\r\n\r\ntypedef int ret_Constructarray5_int_[5];\r\nret_Constructarray5_int_ Constructarray5_int_(int arg0, int arg1, int arg2, int arg3, int arg4) {\r\n    int ret[5] = { arg0, arg1, arg2, arg3, arg4 };\r\n    return ret;\r\n}\r\n\r\nfloat4 foo_vert(uint vi : SV_VertexID) : SV_Position\r\n{\r\n    float foo = 0.0;\r\n    int c[5] = {(int)0,(int)0,(int)0,(int)0,(int)0};\r\n\r\n    float baz_1 = foo;\r\n    foo = 1.0;\r\n    test_matrix_within_struct_accesses();\r\n    test_matrix_within_array_within_struct_accesses();\r\n    float4x3 _matrix = float4x3(asfloat(bar.Load3(0+0)), asfloat(bar.Load3(0+16)), asfloat(bar.Load3(0+32)), asfloat(bar.Load3(0+48)));\r\n    uint2 arr[2] = {asuint(bar.Load2(104+0)), asuint(bar.Load2(104+8))};\r\n    float b = asfloat(bar.Load(0+48+0));\r\n    int a_1 = asint(bar.Load(0+(((NagaBufferLengthRW(bar) - 120) / 8) - 2u)*8+120));\r\n    int2 c_1 = asint(qux.Load2(0));\r\n    const float _e32 = read_from_private(foo);\r\n    c = Constructarray5_int_(a_1, int(b), 3, 4, 5);\r\n    c[(vi + 1u)] = 42;\r\n    int value = c[vi];\r\n    const float _e46 = test_arr_as_arg(Constructarray5_array10_float__(Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)));\r\n    return float4(mul(float4((value).xxxx), _matrix), 2.0);\r\n}\r\n\r\ntypedef uint2 ret_Constructarray2_uint2_[2];\r\nret_Constructarray2_uint2_ Constructarray2_uint2_(uint2 arg0, uint2 arg1) {\r\n    uint2 ret[2] = { arg0, arg1 };\r\n    return ret;\r\n}\r\n\r\nfloat4 foo_frag() : SV_Target0\r\n{\r\n    bar.Store(8+16+0, asuint(1.0));\r\n    {\r\n        float4x3 _value2 = float4x3((0.0).xxx, (1.0).xxx, (2.0).xxx, (3.0).xxx);\r\n        bar.Store3(0+0, asuint(_value2[0]));\r\n        bar.Store3(0+16, asuint(_value2[1]));\r\n        bar.Store3(0+32, asuint(_value2[2]));\r\n        bar.Store3(0+48, asuint(_value2[3]));\r\n    }\r\n    {\r\n        uint2 _value2[2] = Constructarray2_uint2_((0u).xx, (1u).xx);\r\n        bar.Store2(104+0, asuint(_value2[0]));\r\n        bar.Store2(104+8, asuint(_value2[1]));\r\n    }\r\n    bar.Store(0+8+120, asuint(1));\r\n    qux.Store2(0, asuint(int2(0, 0)));\r\n    return (0.0).xxxx;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid atomics()\r\n{\r\n    int tmp = (int)0;\r\n\r\n    int value_1 = asint(bar.Load(96));\r\n    int _e10; bar.InterlockedAdd(96, 5, _e10);\r\n    tmp = _e10;\r\n    int _e13; bar.InterlockedAdd(96, -5, _e13);\r\n    tmp = _e13;\r\n    int _e16; bar.InterlockedAnd(96, 5, _e16);\r\n    tmp = _e16;\r\n    int _e19; bar.InterlockedOr(96, 5, _e19);\r\n    tmp = _e19;\r\n    int _e22; bar.InterlockedXor(96, 5, _e22);\r\n    tmp = _e22;\r\n    int _e25; bar.InterlockedMin(96, 5, _e25);\r\n    tmp = _e25;\r\n    int _e28; bar.InterlockedMax(96, 5, _e28);\r\n    tmp = _e28;\r\n    int _e31; bar.InterlockedExchange(96, 5, _e31);\r\n    tmp = _e31;\r\n    bar.Store(96, asuint(value_1));\r\n    return;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid assign_through_ptr()\r\n{\r\n    assign_through_ptr_fn(val);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/access.hlsl.config",
    "content": "vertex=(foo_vert:vs_5_1 )\r\nfragment=(foo_frag:ps_5_1 )\r\ncompute=(atomics:cs_5_1 assign_through_ptr:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/binding-arrays.hlsl",
    "content": "\r\nstruct UniformIndex {\r\n    uint index;\r\n};\r\n\r\nstruct FragmentIn {\r\n    nointerpolation uint index : LOC0;\r\n};\r\n\r\nTexture2D<float4> texture_array_unbounded[10] : register(t0);\r\nTexture2D<float4> texture_array_bounded[5] : register(t0, space1);\r\nTexture2DArray<float4> texture_array_2darray[5] : register(t0, space2);\r\nTexture2DMS<float4> texture_array_multisampled[5] : register(t0, space3);\r\nTexture2D<float> texture_array_depth[5] : register(t0, space4);\r\nRWTexture2D<float4> texture_array_storage[5] : register(u0, space5);\r\nSamplerState samp[5] : register(s0, space6);\r\nSamplerComparisonState samp_comp[5] : register(s0, space7);\r\ncbuffer uni : register(b0, space8) { UniformIndex uni; }\r\n\r\nstruct FragmentInput_main {\r\n    nointerpolation uint index : LOC0;\r\n};\r\n\r\nint2 NagaDimensions2D(Texture2D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z);\r\n    return ret.xy;\r\n}\r\n\r\nint NagaNumLayers2DArray(Texture2DArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.w;\r\n}\r\n\r\nint NagaNumLevels2D(Texture2D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z);\r\n    return ret.z;\r\n}\r\n\r\nint NagaMSNumSamples2D(Texture2DMS<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(ret.x, ret.y, ret.z);\r\n    return ret.z;\r\n}\r\n\r\nfloat4 main(FragmentInput_main fragmentinput_main) : SV_Target0\r\n{\r\n    FragmentIn fragment_in = { fragmentinput_main.index };\r\n    int i1_ = 0;\r\n    int2 i2_ = (int2)0;\r\n    float v1_ = 0.0;\r\n    float4 v4_ = (float4)0;\r\n\r\n    uint uniform_index = uni.index;\r\n    uint non_uniform_index = fragment_in.index;\r\n    i2_ = (0).xx;\r\n    v4_ = (0.0).xxxx;\r\n    float2 uv = (0.0).xx;\r\n    int2 pix = (0).xx;\r\n    int2 _expr27 = i2_;\r\n    i2_ = (_expr27 + NagaDimensions2D(texture_array_unbounded[0]));\r\n    int2 _expr32 = i2_;\r\n    i2_ = (_expr32 + NagaDimensions2D(texture_array_unbounded[uniform_index]));\r\n    int2 _expr36 = i2_;\r\n    i2_ = (_expr36 + NagaDimensions2D(texture_array_unbounded[NonUniformResourceIndex(non_uniform_index)]));\r\n    float4 _expr40 = v4_;\r\n    float4 _expr45 = texture_array_bounded[0].Gather(samp[0], uv);\r\n    v4_ = (_expr40 + _expr45);\r\n    float4 _expr47 = v4_;\r\n    float4 _expr50 = texture_array_bounded[uniform_index].Gather(samp[uniform_index], uv);\r\n    v4_ = (_expr47 + _expr50);\r\n    float4 _expr52 = v4_;\r\n    float4 _expr55 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].Gather(samp[NonUniformResourceIndex(non_uniform_index)], uv);\r\n    v4_ = (_expr52 + _expr55);\r\n    float4 _expr57 = v4_;\r\n    float4 _expr63 = texture_array_depth[0].GatherCmp(samp_comp[0], uv, 0.0);\r\n    v4_ = (_expr57 + _expr63);\r\n    float4 _expr65 = v4_;\r\n    float4 _expr69 = texture_array_depth[uniform_index].GatherCmp(samp_comp[uniform_index], uv, 0.0);\r\n    v4_ = (_expr65 + _expr69);\r\n    float4 _expr71 = v4_;\r\n    float4 _expr75 = texture_array_depth[NonUniformResourceIndex(non_uniform_index)].GatherCmp(samp_comp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0);\r\n    v4_ = (_expr71 + _expr75);\r\n    float4 _expr77 = v4_;\r\n    float4 _expr81 = texture_array_unbounded[0].Load(int3(pix, 0));\r\n    v4_ = (_expr77 + _expr81);\r\n    float4 _expr83 = v4_;\r\n    float4 _expr86 = texture_array_unbounded[uniform_index].Load(int3(pix, 0));\r\n    v4_ = (_expr83 + _expr86);\r\n    float4 _expr88 = v4_;\r\n    float4 _expr91 = texture_array_unbounded[NonUniformResourceIndex(non_uniform_index)].Load(int3(pix, 0));\r\n    v4_ = (_expr88 + _expr91);\r\n    int _expr93 = i1_;\r\n    i1_ = (_expr93 + NagaNumLayers2DArray(texture_array_2darray[0]));\r\n    int _expr98 = i1_;\r\n    i1_ = (_expr98 + NagaNumLayers2DArray(texture_array_2darray[uniform_index]));\r\n    int _expr102 = i1_;\r\n    i1_ = (_expr102 + NagaNumLayers2DArray(texture_array_2darray[NonUniformResourceIndex(non_uniform_index)]));\r\n    int _expr106 = i1_;\r\n    i1_ = (_expr106 + NagaNumLevels2D(texture_array_bounded[0]));\r\n    int _expr111 = i1_;\r\n    i1_ = (_expr111 + NagaNumLevels2D(texture_array_bounded[uniform_index]));\r\n    int _expr115 = i1_;\r\n    i1_ = (_expr115 + NagaNumLevels2D(texture_array_bounded[NonUniformResourceIndex(non_uniform_index)]));\r\n    int _expr119 = i1_;\r\n    i1_ = (_expr119 + NagaMSNumSamples2D(texture_array_multisampled[0]));\r\n    int _expr124 = i1_;\r\n    i1_ = (_expr124 + NagaMSNumSamples2D(texture_array_multisampled[uniform_index]));\r\n    int _expr128 = i1_;\r\n    i1_ = (_expr128 + NagaMSNumSamples2D(texture_array_multisampled[NonUniformResourceIndex(non_uniform_index)]));\r\n    float4 _expr132 = v4_;\r\n    float4 _expr137 = texture_array_bounded[0].Sample(samp[0], uv);\r\n    v4_ = (_expr132 + _expr137);\r\n    float4 _expr139 = v4_;\r\n    float4 _expr142 = texture_array_bounded[uniform_index].Sample(samp[uniform_index], uv);\r\n    v4_ = (_expr139 + _expr142);\r\n    float4 _expr144 = v4_;\r\n    float4 _expr147 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].Sample(samp[NonUniformResourceIndex(non_uniform_index)], uv);\r\n    v4_ = (_expr144 + _expr147);\r\n    float4 _expr149 = v4_;\r\n    float4 _expr155 = texture_array_bounded[0].SampleBias(samp[0], uv, 0.0);\r\n    v4_ = (_expr149 + _expr155);\r\n    float4 _expr157 = v4_;\r\n    float4 _expr161 = texture_array_bounded[uniform_index].SampleBias(samp[uniform_index], uv, 0.0);\r\n    v4_ = (_expr157 + _expr161);\r\n    float4 _expr163 = v4_;\r\n    float4 _expr167 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].SampleBias(samp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0);\r\n    v4_ = (_expr163 + _expr167);\r\n    float _expr169 = v1_;\r\n    float _expr175 = texture_array_depth[0].SampleCmp(samp_comp[0], uv, 0.0);\r\n    v1_ = (_expr169 + _expr175);\r\n    float _expr177 = v1_;\r\n    float _expr181 = texture_array_depth[uniform_index].SampleCmp(samp_comp[uniform_index], uv, 0.0);\r\n    v1_ = (_expr177 + _expr181);\r\n    float _expr183 = v1_;\r\n    float _expr187 = texture_array_depth[NonUniformResourceIndex(non_uniform_index)].SampleCmp(samp_comp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0);\r\n    v1_ = (_expr183 + _expr187);\r\n    float _expr189 = v1_;\r\n    float _expr195 = texture_array_depth[0].SampleCmpLevelZero(samp_comp[0], uv, 0.0);\r\n    v1_ = (_expr189 + _expr195);\r\n    float _expr197 = v1_;\r\n    float _expr201 = texture_array_depth[uniform_index].SampleCmpLevelZero(samp_comp[uniform_index], uv, 0.0);\r\n    v1_ = (_expr197 + _expr201);\r\n    float _expr203 = v1_;\r\n    float _expr207 = texture_array_depth[NonUniformResourceIndex(non_uniform_index)].SampleCmpLevelZero(samp_comp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0);\r\n    v1_ = (_expr203 + _expr207);\r\n    float4 _expr209 = v4_;\r\n    float4 _expr214 = texture_array_bounded[0].SampleGrad(samp[0], uv, uv, uv);\r\n    v4_ = (_expr209 + _expr214);\r\n    float4 _expr216 = v4_;\r\n    float4 _expr219 = texture_array_bounded[uniform_index].SampleGrad(samp[uniform_index], uv, uv, uv);\r\n    v4_ = (_expr216 + _expr219);\r\n    float4 _expr221 = v4_;\r\n    float4 _expr224 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].SampleGrad(samp[NonUniformResourceIndex(non_uniform_index)], uv, uv, uv);\r\n    v4_ = (_expr221 + _expr224);\r\n    float4 _expr226 = v4_;\r\n    float4 _expr232 = texture_array_bounded[0].SampleLevel(samp[0], uv, 0.0);\r\n    v4_ = (_expr226 + _expr232);\r\n    float4 _expr234 = v4_;\r\n    float4 _expr238 = texture_array_bounded[uniform_index].SampleLevel(samp[uniform_index], uv, 0.0);\r\n    v4_ = (_expr234 + _expr238);\r\n    float4 _expr240 = v4_;\r\n    float4 _expr244 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].SampleLevel(samp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0);\r\n    v4_ = (_expr240 + _expr244);\r\n    float4 _expr248 = v4_;\r\n    texture_array_storage[0][pix] = _expr248;\r\n    float4 _expr250 = v4_;\r\n    texture_array_storage[uniform_index][pix] = _expr250;\r\n    float4 _expr252 = v4_;\r\n    texture_array_storage[NonUniformResourceIndex(non_uniform_index)][pix] = _expr252;\r\n    int2 _expr253 = i2_;\r\n    int _expr254 = i1_;\r\n    float2 v2_ = float2((_expr253 + (_expr254).xx));\r\n    float4 _expr258 = v4_;\r\n    float _expr265 = v1_;\r\n    return ((_expr258 + float4(v2_.x, v2_.y, v2_.x, v2_.y)) + (_expr265).xxxx);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/binding-arrays.hlsl.config",
    "content": "vertex=()\r\nfragment=(main:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/boids.hlsl",
    "content": "static const uint NUM_PARTICLES = 1500;\r\n\r\nstruct Particle {\r\n    float2 pos;\r\n    float2 vel;\r\n};\r\n\r\nstruct SimParams {\r\n    float deltaT;\r\n    float rule1Distance;\r\n    float rule2Distance;\r\n    float rule3Distance;\r\n    float rule1Scale;\r\n    float rule2Scale;\r\n    float rule3Scale;\r\n};\r\n\r\ncbuffer params : register(b0) { SimParams params; }\r\nByteAddressBuffer particlesSrc : register(t1);\r\nRWByteAddressBuffer particlesDst : register(u2);\r\n\r\n[numthreads(64, 1, 1)]\r\nvoid main(uint3 global_invocation_id : SV_DispatchThreadID)\r\n{\r\n    float2 vPos = (float2)0;\r\n    float2 vVel = (float2)0;\r\n    float2 cMass = (float2)0;\r\n    float2 cVel = (float2)0;\r\n    float2 colVel = (float2)0;\r\n    int cMassCount = 0;\r\n    int cVelCount = 0;\r\n    float2 pos = (float2)0;\r\n    float2 vel = (float2)0;\r\n    uint i = 0u;\r\n\r\n    uint index = global_invocation_id.x;\r\n    if ((index >= NUM_PARTICLES)) {\r\n        return;\r\n    }\r\n    float2 _expr10 = asfloat(particlesSrc.Load2(0+index*16+0));\r\n    vPos = _expr10;\r\n    float2 _expr15 = asfloat(particlesSrc.Load2(8+index*16+0));\r\n    vVel = _expr15;\r\n    cMass = float2(0.0, 0.0);\r\n    cVel = float2(0.0, 0.0);\r\n    colVel = float2(0.0, 0.0);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _expr86 = i;\r\n            i = (_expr86 + 1u);\r\n        }\r\n        loop_init = false;\r\n        uint _expr37 = i;\r\n        if ((_expr37 >= NUM_PARTICLES)) {\r\n            break;\r\n        }\r\n        uint _expr39 = i;\r\n        if ((_expr39 == index)) {\r\n            continue;\r\n        }\r\n        uint _expr42 = i;\r\n        float2 _expr45 = asfloat(particlesSrc.Load2(0+_expr42*16+0));\r\n        pos = _expr45;\r\n        uint _expr47 = i;\r\n        float2 _expr50 = asfloat(particlesSrc.Load2(8+_expr47*16+0));\r\n        vel = _expr50;\r\n        float2 _expr51 = pos;\r\n        float2 _expr52 = vPos;\r\n        float _expr55 = params.rule1Distance;\r\n        if ((distance(_expr51, _expr52) < _expr55)) {\r\n            float2 _expr57 = cMass;\r\n            float2 _expr58 = pos;\r\n            cMass = (_expr57 + _expr58);\r\n            int _expr60 = cMassCount;\r\n            cMassCount = (_expr60 + 1);\r\n        }\r\n        float2 _expr63 = pos;\r\n        float2 _expr64 = vPos;\r\n        float _expr67 = params.rule2Distance;\r\n        if ((distance(_expr63, _expr64) < _expr67)) {\r\n            float2 _expr69 = colVel;\r\n            float2 _expr70 = pos;\r\n            float2 _expr71 = vPos;\r\n            colVel = (_expr69 - (_expr70 - _expr71));\r\n        }\r\n        float2 _expr74 = pos;\r\n        float2 _expr75 = vPos;\r\n        float _expr78 = params.rule3Distance;\r\n        if ((distance(_expr74, _expr75) < _expr78)) {\r\n            float2 _expr80 = cVel;\r\n            float2 _expr81 = vel;\r\n            cVel = (_expr80 + _expr81);\r\n            int _expr83 = cVelCount;\r\n            cVelCount = (_expr83 + 1);\r\n        }\r\n    }\r\n    int _expr89 = cMassCount;\r\n    if ((_expr89 > 0)) {\r\n        float2 _expr92 = cMass;\r\n        int _expr93 = cMassCount;\r\n        float2 _expr97 = vPos;\r\n        cMass = ((_expr92 / (float(_expr93)).xx) - _expr97);\r\n    }\r\n    int _expr99 = cVelCount;\r\n    if ((_expr99 > 0)) {\r\n        float2 _expr102 = cVel;\r\n        int _expr103 = cVelCount;\r\n        cVel = (_expr102 / (float(_expr103)).xx);\r\n    }\r\n    float2 _expr107 = vVel;\r\n    float2 _expr108 = cMass;\r\n    float _expr110 = params.rule1Scale;\r\n    float2 _expr113 = colVel;\r\n    float _expr115 = params.rule2Scale;\r\n    float2 _expr118 = cVel;\r\n    float _expr120 = params.rule3Scale;\r\n    vVel = (((_expr107 + (_expr108 * _expr110)) + (_expr113 * _expr115)) + (_expr118 * _expr120));\r\n    float2 _expr123 = vVel;\r\n    float2 _expr125 = vVel;\r\n    vVel = (normalize(_expr123) * clamp(length(_expr125), 0.0, 0.10000000149011612));\r\n    float2 _expr131 = vPos;\r\n    float2 _expr132 = vVel;\r\n    float _expr134 = params.deltaT;\r\n    vPos = (_expr131 + (_expr132 * _expr134));\r\n    float _expr138 = vPos.x;\r\n    if ((_expr138 < -1.0)) {\r\n        vPos.x = 1.0;\r\n    }\r\n    float _expr144 = vPos.x;\r\n    if ((_expr144 > 1.0)) {\r\n        vPos.x = -1.0;\r\n    }\r\n    float _expr150 = vPos.y;\r\n    if ((_expr150 < -1.0)) {\r\n        vPos.y = 1.0;\r\n    }\r\n    float _expr156 = vPos.y;\r\n    if ((_expr156 > 1.0)) {\r\n        vPos.y = -1.0;\r\n    }\r\n    float2 _expr164 = vPos;\r\n    particlesDst.Store2(0+index*16+0, asuint(_expr164));\r\n    float2 _expr168 = vVel;\r\n    particlesDst.Store2(8+index*16+0, asuint(_expr168));\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/boids.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/break-if.hlsl",
    "content": "\r\nvoid breakIfEmpty()\r\n{\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            if (true) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init = false;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid breakIfEmptyBody(bool a)\r\n{\r\n    bool b = (bool)0;\r\n    bool c = (bool)0;\r\n\r\n    bool loop_init_1 = true;\r\n    while(true) {\r\n        if (!loop_init_1) {\r\n            b = a;\r\n            bool _expr2 = b;\r\n            c = (a != _expr2);\r\n            bool _expr5 = c;\r\n            bool unnamed = (a == _expr5);\r\n            if (unnamed) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init_1 = false;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid breakIf(bool a_1)\r\n{\r\n    bool d = (bool)0;\r\n    bool e = (bool)0;\r\n\r\n    bool loop_init_2 = true;\r\n    while(true) {\r\n        if (!loop_init_2) {\r\n            bool _expr5 = e;\r\n            bool unnamed_1 = (a_1 == _expr5);\r\n            if (unnamed_1) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init_2 = false;\r\n        d = a_1;\r\n        bool _expr2 = d;\r\n        e = (a_1 != _expr2);\r\n    }\r\n    return;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main()\r\n{\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/break-if.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/collatz.hlsl",
    "content": "\r\nRWByteAddressBuffer v_indices : register(u0);\r\n\r\nuint collatz_iterations(uint n_base)\r\n{\r\n    uint n = (uint)0;\r\n    uint i = 0u;\r\n\r\n    n = n_base;\r\n    while(true) {\r\n        uint _expr5 = n;\r\n        if ((_expr5 > 1u)) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _expr8 = n;\r\n        if (((_expr8 % 2u) == 0u)) {\r\n            uint _expr13 = n;\r\n            n = (_expr13 / 2u);\r\n        } else {\r\n            uint _expr17 = n;\r\n            n = ((3u * _expr17) + 1u);\r\n        }\r\n        uint _expr21 = i;\r\n        i = (_expr21 + 1u);\r\n    }\r\n    uint _expr24 = i;\r\n    return _expr24;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main(uint3 global_id : SV_DispatchThreadID)\r\n{\r\n    uint _expr8 = asuint(v_indices.Load(global_id.x*4+0));\r\n    const uint _e9 = collatz_iterations(_expr8);\r\n    v_indices.Store(global_id.x*4+0, asuint(_e9));\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/collatz.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/control-flow.hlsl",
    "content": "\r\nvoid switch_default_break(int i)\r\n{\r\n    switch(i) {\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\nvoid switch_case_break()\r\n{\r\n    switch(0) {\r\n        case 0: {\r\n            break;\r\n        }\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nvoid loop_switch_continue(int x)\r\n{\r\n    while(true) {\r\n        switch(x) {\r\n            case 1: {\r\n                continue;\r\n            }\r\n            default: {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main(uint3 global_id : SV_DispatchThreadID)\r\n{\r\n    int pos = (int)0;\r\n\r\n    DeviceMemoryBarrierWithGroupSync();\r\n    GroupMemoryBarrierWithGroupSync();\r\n    switch(1) {\r\n        default: {\r\n            pos = 1;\r\n            break;\r\n        }\r\n    }\r\n    int _expr4 = pos;\r\n    switch(_expr4) {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n            break;\r\n        }\r\n        case 3: {\r\n            {\r\n                pos = 2;\r\n            }\r\n            {\r\n                pos = 3;\r\n            }\r\n            {\r\n                pos = 4;\r\n            }\r\n            break;\r\n        }\r\n        case 4: {\r\n            {\r\n                pos = 3;\r\n            }\r\n            {\r\n                pos = 4;\r\n            }\r\n            break;\r\n        }\r\n        default: {\r\n            pos = 4;\r\n            break;\r\n        }\r\n    }\r\n    switch(0u) {\r\n        case 0u: {\r\n            break;\r\n        }\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n    int _expr11 = pos;\r\n    switch(_expr11) {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n            return;\r\n        }\r\n        case 3: {\r\n            {\r\n                pos = 2;\r\n            }\r\n            {\r\n                return;\r\n            }\r\n        }\r\n        case 4: {\r\n            return;\r\n        }\r\n        default: {\r\n            pos = 3;\r\n            return;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/control-flow.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/empty-global-name.hlsl",
    "content": "\r\nstruct type_1 {\r\n    int member;\r\n};\r\n\r\nRWByteAddressBuffer unnamed : register(u0);\r\n\r\nvoid function()\r\n{\r\n    int _expr8 = asint(unnamed.Load(0));\r\n    unnamed.Store(0, asuint((_expr8 + 1)));\r\n    return;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main()\r\n{\r\n    function();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/empty-global-name.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/empty.hlsl",
    "content": "\r\n[numthreads(1, 1, 1)]\r\nvoid main()\r\n{\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/empty.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/functions.hlsl",
    "content": "\r\nfloat2 test_fma()\r\n{\r\n    float2 a = float2(2.0, 2.0);\r\n    float2 b = float2(0.5, 0.5);\r\n    float2 c = float2(0.5, 0.5);\r\n    return mad(a, b, c);\r\n}\r\n\r\nint test_integer_dot_product()\r\n{\r\n    int2 a_2_ = (1).xx;\r\n    int2 b_2_ = (1).xx;\r\n    int c_2_ = dot(a_2_, b_2_);\r\n    uint3 a_3_ = (1u).xxx;\r\n    uint3 b_3_ = (1u).xxx;\r\n    uint c_3_ = dot(a_3_, b_3_);\r\n    int c_4_ = dot((4).xxxx, (2).xxxx);\r\n    return c_4_;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main()\r\n{\r\n    const float2 _e0 = test_fma();\r\n    const int _e1 = test_integer_dot_product();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/functions.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/globals.hlsl",
    "content": "static const bool Foo_2 = true;\r\n\r\ntypedef struct { float2 _0; float2 _1; float2 _2; } __mat3x2;\r\nfloat2 __get_col_of_mat3x2(__mat3x2 mat, uint idx) {\r\n    switch(idx) {\r\n    case 0: { return mat._0; }\r\n    case 1: { return mat._1; }\r\n    case 2: { return mat._2; }\r\n    default: { return (float2)0; }\r\n    }\r\n}\r\nvoid __set_col_of_mat3x2(__mat3x2 mat, uint idx, float2 value) {\r\n    switch(idx) {\r\n    case 0: { mat._0 = value; break; }\r\n    case 1: { mat._1 = value; break; }\r\n    case 2: { mat._2 = value; break; }\r\n    }\r\n}\r\nvoid __set_el_of_mat3x2(__mat3x2 mat, uint idx, uint vec_idx, float value) {\r\n    switch(idx) {\r\n    case 0: { mat._0[vec_idx] = value; break; }\r\n    case 1: { mat._1[vec_idx] = value; break; }\r\n    case 2: { mat._2[vec_idx] = value; break; }\r\n    }\r\n}\r\n\r\ntypedef struct { float2 _0; float2 _1; float2 _2; float2 _3; } __mat4x2;\r\nfloat2 __get_col_of_mat4x2(__mat4x2 mat, uint idx) {\r\n    switch(idx) {\r\n    case 0: { return mat._0; }\r\n    case 1: { return mat._1; }\r\n    case 2: { return mat._2; }\r\n    case 3: { return mat._3; }\r\n    default: { return (float2)0; }\r\n    }\r\n}\r\nvoid __set_col_of_mat4x2(__mat4x2 mat, uint idx, float2 value) {\r\n    switch(idx) {\r\n    case 0: { mat._0 = value; break; }\r\n    case 1: { mat._1 = value; break; }\r\n    case 2: { mat._2 = value; break; }\r\n    case 3: { mat._3 = value; break; }\r\n    }\r\n}\r\nvoid __set_el_of_mat4x2(__mat4x2 mat, uint idx, uint vec_idx, float value) {\r\n    switch(idx) {\r\n    case 0: { mat._0[vec_idx] = value; break; }\r\n    case 1: { mat._1[vec_idx] = value; break; }\r\n    case 2: { mat._2[vec_idx] = value; break; }\r\n    case 3: { mat._3[vec_idx] = value; break; }\r\n    }\r\n}\r\n\r\nstruct Foo {\r\n    float3 v3_;\r\n    float v1_;\r\n};\r\n\r\ngroupshared float wg[10];\r\ngroupshared uint at_1;\r\nRWByteAddressBuffer alignment : register(u1);\r\nByteAddressBuffer dummy : register(t2);\r\ncbuffer float_vecs : register(b3) { float4 float_vecs[20]; }\r\ncbuffer global_vec : register(b4) { float3 global_vec; }\r\ncbuffer global_mat : register(b5) { __mat3x2 global_mat; }\r\ncbuffer global_nested_arrays_of_matrices_2x4_ : register(b6) { row_major float2x4 global_nested_arrays_of_matrices_2x4_[2][2]; }\r\ncbuffer global_nested_arrays_of_matrices_4x2_ : register(b7) { __mat4x2 global_nested_arrays_of_matrices_4x2_[2][2]; }\r\n\r\nvoid test_msl_packed_vec3_as_arg(float3 arg)\r\n{\r\n    return;\r\n}\r\n\r\nFoo ConstructFoo(float3 arg0, float arg1) {\r\n    Foo ret = (Foo)0;\r\n    ret.v3_ = arg0;\r\n    ret.v1_ = arg1;\r\n    return ret;\r\n}\r\n\r\nvoid test_msl_packed_vec3_()\r\n{\r\n    int idx = 1;\r\n\r\n    alignment.Store3(0, asuint((1.0).xxx));\r\n    alignment.Store(0+0, asuint(1.0));\r\n    alignment.Store(0+0, asuint(2.0));\r\n    int _expr23 = idx;\r\n    alignment.Store(_expr23*4+0, asuint(3.0));\r\n    Foo data = ConstructFoo(asfloat(alignment.Load3(0)), asfloat(alignment.Load(12)));\r\n    float3 unnamed = data.v3_;\r\n    float2 unnamed_1 = data.v3_.zx;\r\n    test_msl_packed_vec3_as_arg(data.v3_);\r\n    float3 unnamed_2 = mul(float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)), data.v3_);\r\n    float3 unnamed_3 = mul(data.v3_, float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    float3 unnamed_4 = (data.v3_ * 2.0);\r\n    float3 unnamed_5 = (2.0 * data.v3_);\r\n}\r\n\r\nuint NagaBufferLength(ByteAddressBuffer buffer)\r\n{\r\n    uint ret;\r\n    buffer.GetDimensions(ret);\r\n    return ret;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main()\r\n{\r\n    float Foo_1 = 1.0;\r\n    bool at = true;\r\n\r\n    test_msl_packed_vec3_();\r\n    float4x2 _expr16 = ((float4x2)global_nested_arrays_of_matrices_4x2_[0][0]);\r\n    float4 _expr23 = global_nested_arrays_of_matrices_2x4_[0][0][0];\r\n    wg[7] = mul(_expr23, _expr16).x;\r\n    float3x2 _expr28 = ((float3x2)global_mat);\r\n    float3 _expr29 = global_vec;\r\n    wg[6] = mul(_expr29, _expr28).x;\r\n    float _expr37 = asfloat(dummy.Load(4+8));\r\n    wg[5] = _expr37;\r\n    float _expr43 = float_vecs[0].w;\r\n    wg[4] = _expr43;\r\n    float _expr47 = asfloat(alignment.Load(12));\r\n    wg[3] = _expr47;\r\n    float _expr52 = asfloat(alignment.Load(0+0));\r\n    wg[2] = _expr52;\r\n    alignment.Store(12, asuint(4.0));\r\n    wg[1] = float(((NagaBufferLength(dummy) - 0) / 8));\r\n    at_1 = 2u;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/globals.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/image.hlsl",
    "content": "\r\nTexture2D<uint4> image_mipmapped_src : register(t0);\r\nTexture2DMS<uint4> image_multisampled_src : register(t3);\r\nTexture2DMS<float> image_depth_multisampled_src : register(t4);\r\nRWTexture2D<uint4> image_storage_src : register(u1);\r\nTexture2DArray<uint4> image_array_src : register(t5);\r\nRWTexture1D<uint4> image_dup_src : register(u6);\r\nTexture1D<uint4> image_1d_src : register(t7);\r\nRWTexture1D<uint4> image_dst : register(u2);\r\nTexture1D<float4> image_1d : register(t0);\r\nTexture2D<float4> image_2d : register(t1);\r\nTexture2DArray<float4> image_2d_array : register(t2);\r\nTextureCube<float4> image_cube : register(t3);\r\nTextureCubeArray<float4> image_cube_array : register(t4);\r\nTexture3D<float4> image_3d : register(t5);\r\nTexture2DMS<float4> image_aa : register(t6);\r\nSamplerState sampler_reg : register(s0, space1);\r\nSamplerComparisonState sampler_cmp : register(s1, space1);\r\nTexture2D<float> image_2d_depth : register(t2, space1);\r\nTextureCube<float> image_cube_depth : register(t3, space1);\r\n\r\nint2 NagaRWDimensions2D(RWTexture2D<uint4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(ret.x, ret.y);\r\n    return ret.xy;\r\n}\r\n\r\n[numthreads(16, 1, 1)]\r\nvoid main(uint3 local_id : SV_GroupThreadID)\r\n{\r\n    int2 dim = NagaRWDimensions2D(image_storage_src);\r\n    int2 itc = ((dim * int2(local_id.xy)) % int2(10, 20));\r\n    uint4 value1_ = image_mipmapped_src.Load(int3(itc, int(local_id.z)));\r\n    uint4 value2_ = image_multisampled_src.Load(itc, int(local_id.z));\r\n    uint4 value4_ = image_storage_src.Load(itc);\r\n    uint4 value5_ = image_array_src.Load(int4(itc, int(local_id.z), (int(local_id.z) + 1)));\r\n    uint4 value6_ = image_1d_src.Load(int2(int(local_id.x), int(local_id.z)));\r\n    image_dst[itc.x] = ((((value1_ + value2_) + value4_) + value5_) + value6_);\r\n    return;\r\n}\r\n\r\n[numthreads(16, 1, 1)]\r\nvoid depth_load(uint3 local_id_1 : SV_GroupThreadID)\r\n{\r\n    int2 dim_1 = NagaRWDimensions2D(image_storage_src);\r\n    int2 itc_1 = ((dim_1 * int2(local_id_1.xy)) % int2(10, 20));\r\n    float val = image_depth_multisampled_src.Load(itc_1, int(local_id_1.z)).x;\r\n    image_dst[itc_1.x] = (uint(val)).xxxx;\r\n    return;\r\n}\r\n\r\nint NagaDimensions1D(Texture1D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y);\r\n    return ret.x;\r\n}\r\n\r\nint NagaMipDimensions1D(Texture1D<float4> tex, uint mip_level)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(mip_level, ret.x, ret.y);\r\n    return ret.x;\r\n}\r\n\r\nint2 NagaDimensions2D(Texture2D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaMipDimensions2D(Texture2D<float4> tex, uint mip_level)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(mip_level, ret.x, ret.y, ret.z);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaDimensions2DArray(Texture2DArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaMipDimensions2DArray(Texture2DArray<float4> tex, uint mip_level)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(mip_level, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaDimensionsCube(TextureCube<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaMipDimensionsCube(TextureCube<float4> tex, uint mip_level)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(mip_level, ret.x, ret.y, ret.z);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaDimensionsCubeArray(TextureCubeArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.xy;\r\n}\r\n\r\nint2 NagaMipDimensionsCubeArray(TextureCubeArray<float4> tex, uint mip_level)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(mip_level, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.xy;\r\n}\r\n\r\nint3 NagaDimensions3D(Texture3D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.xyz;\r\n}\r\n\r\nint3 NagaMipDimensions3D(Texture3D<float4> tex, uint mip_level)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(mip_level, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.xyz;\r\n}\r\n\r\nint2 NagaMSDimensions2D(Texture2DMS<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(ret.x, ret.y, ret.z);\r\n    return ret.xy;\r\n}\r\n\r\nfloat4 queries() : SV_Position\r\n{\r\n    int dim_1d = NagaDimensions1D(image_1d);\r\n    int dim_1d_lod = NagaMipDimensions1D(image_1d, int(dim_1d));\r\n    int2 dim_2d = NagaDimensions2D(image_2d);\r\n    int2 dim_2d_lod = NagaMipDimensions2D(image_2d, 1);\r\n    int2 dim_2d_array = NagaDimensions2DArray(image_2d_array);\r\n    int2 dim_2d_array_lod = NagaMipDimensions2DArray(image_2d_array, 1);\r\n    int2 dim_cube = NagaDimensionsCube(image_cube);\r\n    int2 dim_cube_lod = NagaMipDimensionsCube(image_cube, 1);\r\n    int2 dim_cube_array = NagaDimensionsCubeArray(image_cube_array);\r\n    int2 dim_cube_array_lod = NagaMipDimensionsCubeArray(image_cube_array, 1);\r\n    int3 dim_3d = NagaDimensions3D(image_3d);\r\n    int3 dim_3d_lod = NagaMipDimensions3D(image_3d, 1);\r\n    int2 dim_2s_ms = NagaMSDimensions2D(image_aa);\r\n    int sum = ((((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z);\r\n    return (float(sum)).xxxx;\r\n}\r\n\r\nint NagaNumLevels2D(Texture2D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z);\r\n    return ret.z;\r\n}\r\n\r\nint NagaNumLevels2DArray(Texture2DArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.w;\r\n}\r\n\r\nint NagaNumLayers2DArray(Texture2DArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.w;\r\n}\r\n\r\nint NagaNumLevelsCube(TextureCube<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z);\r\n    return ret.z;\r\n}\r\n\r\nint NagaNumLevelsCubeArray(TextureCubeArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.w;\r\n}\r\n\r\nint NagaNumLayersCubeArray(TextureCubeArray<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.w;\r\n}\r\n\r\nint NagaNumLevels3D(Texture3D<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w);\r\n    return ret.w;\r\n}\r\n\r\nint NagaMSNumSamples2D(Texture2DMS<float4> tex)\r\n{\r\n    uint4 ret;\r\n    tex.GetDimensions(ret.x, ret.y, ret.z);\r\n    return ret.z;\r\n}\r\n\r\nfloat4 levels_queries() : SV_Position\r\n{\r\n    int num_levels_2d = NagaNumLevels2D(image_2d);\r\n    int num_levels_2d_array = NagaNumLevels2DArray(image_2d_array);\r\n    int num_layers_2d = NagaNumLayers2DArray(image_2d_array);\r\n    int num_levels_cube = NagaNumLevelsCube(image_cube);\r\n    int num_levels_cube_array = NagaNumLevelsCubeArray(image_cube_array);\r\n    int num_layers_cube = NagaNumLayersCubeArray(image_cube_array);\r\n    int num_levels_3d = NagaNumLevels3D(image_3d);\r\n    int num_samples_aa = NagaMSNumSamples2D(image_aa);\r\n    int sum_1 = (((((((num_layers_2d + num_layers_cube) + num_samples_aa) + num_levels_2d) + num_levels_2d_array) + num_levels_3d) + num_levels_cube) + num_levels_cube_array);\r\n    return (float(sum_1)).xxxx;\r\n}\r\n\r\nfloat4 texture_sample() : SV_Target0\r\n{\r\n    float2 tc = (0.5).xx;\r\n    float4 s1d = image_1d.Sample(sampler_reg, tc.x);\r\n    float4 s2d = image_2d.Sample(sampler_reg, tc);\r\n    float4 s2d_offset = image_2d.Sample(sampler_reg, tc, int2(3, 1));\r\n    float4 s2d_level = image_2d.SampleLevel(sampler_reg, tc, 2.299999952316284);\r\n    float4 s2d_level_offset = image_2d.SampleLevel(sampler_reg, tc, 2.299999952316284, int2(3, 1));\r\n    float4 s2d_bias_offset = image_2d.SampleBias(sampler_reg, tc, 2.0, int2(3, 1));\r\n    return ((((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset);\r\n}\r\n\r\nfloat texture_sample_comparison() : SV_Target0\r\n{\r\n    float2 tc_1 = (0.5).xx;\r\n    float s2d_depth = image_2d_depth.SampleCmp(sampler_cmp, tc_1, 0.5);\r\n    float s2d_depth_level = image_2d_depth.SampleCmpLevelZero(sampler_cmp, tc_1, 0.5);\r\n    float scube_depth_level = image_cube_depth.SampleCmpLevelZero(sampler_cmp, (0.5).xxx, 0.5);\r\n    return (s2d_depth + s2d_depth_level);\r\n}\r\n\r\nfloat4 gather() : SV_Target0\r\n{\r\n    float2 tc_2 = (0.5).xx;\r\n    float4 s2d_1 = image_2d.GatherGreen(sampler_reg, tc_2);\r\n    float4 s2d_offset_1 = image_2d.GatherAlpha(sampler_reg, tc_2, int2(3, 1));\r\n    float4 s2d_depth_1 = image_2d_depth.GatherCmp(sampler_cmp, tc_2, 0.5);\r\n    float4 s2d_depth_offset = image_2d_depth.GatherCmp(sampler_cmp, tc_2, 0.5, int2(3, 1));\r\n    return (((s2d_1 + s2d_offset_1) + s2d_depth_1) + s2d_depth_offset);\r\n}\r\n\r\nfloat4 depth_no_comparison() : SV_Target0\r\n{\r\n    float2 tc_3 = (0.5).xx;\r\n    float s2d_2 = image_2d_depth.Sample(sampler_reg, tc_3);\r\n    float4 s2d_gather = image_2d_depth.Gather(sampler_reg, tc_3);\r\n    return ((s2d_2).xxxx + s2d_gather);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/image.hlsl.config",
    "content": "vertex=(queries:vs_5_1 levels_queries:vs_5_1 )\r\nfragment=(texture_sample:ps_5_1 texture_sample_comparison:ps_5_1 gather:ps_5_1 depth_no_comparison:ps_5_1 )\r\ncompute=(main:cs_5_1 depth_load:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/interface.hlsl",
    "content": "struct NagaConstants {\r\n    int base_vertex;\r\n    int base_instance;\r\n    uint other;\r\n};\r\nConstantBuffer<NagaConstants> _NagaConstants: register(b0, space1);\r\n\r\nstruct VertexOutput {\r\n    precise float4 position : SV_Position;\r\n    float _varying : LOC1;\r\n};\r\n\r\nstruct FragmentOutput {\r\n    float depth : SV_Depth;\r\n    uint sample_mask : SV_Coverage;\r\n    float color : SV_Target0;\r\n};\r\n\r\nstruct Input1_ {\r\n    uint index : SV_VertexID;\r\n};\r\n\r\nstruct Input2_ {\r\n    uint index : SV_InstanceID;\r\n};\r\n\r\ngroupshared uint output[1];\r\n\r\nstruct VertexOutput_vertex {\r\n    float _varying : LOC1;\r\n    precise float4 position : SV_Position;\r\n};\r\n\r\nstruct FragmentInput_fragment {\r\n    float _varying_1 : LOC1;\r\n    precise float4 position_1 : SV_Position;\r\n    bool front_facing_1 : SV_IsFrontFace;\r\n    uint sample_index_1 : SV_SampleIndex;\r\n    uint sample_mask_1 : SV_Coverage;\r\n};\r\n\r\nVertexOutput ConstructVertexOutput(float4 arg0, float arg1) {\r\n    VertexOutput ret = (VertexOutput)0;\r\n    ret.position = arg0;\r\n    ret._varying = arg1;\r\n    return ret;\r\n}\r\n\r\nVertexOutput_vertex vertex(uint vertex_index : SV_VertexID, uint instance_index : SV_InstanceID, uint color : LOC10)\r\n{\r\n    uint tmp = (((_NagaConstants.base_vertex + vertex_index) + (_NagaConstants.base_instance + instance_index)) + color);\r\n    const VertexOutput vertexoutput = ConstructVertexOutput((1.0).xxxx, float(tmp));\r\n    const VertexOutput_vertex vertexoutput_1 = { vertexoutput._varying, vertexoutput.position };\r\n    return vertexoutput_1;\r\n}\r\n\r\nFragmentOutput ConstructFragmentOutput(float arg0, uint arg1, float arg2) {\r\n    FragmentOutput ret = (FragmentOutput)0;\r\n    ret.depth = arg0;\r\n    ret.sample_mask = arg1;\r\n    ret.color = arg2;\r\n    return ret;\r\n}\r\n\r\nFragmentOutput fragment(FragmentInput_fragment fragmentinput_fragment)\r\n{\r\n    VertexOutput in_ = { fragmentinput_fragment.position_1, fragmentinput_fragment._varying_1 };\r\n    bool front_facing = fragmentinput_fragment.front_facing_1;\r\n    uint sample_index = fragmentinput_fragment.sample_index_1;\r\n    uint sample_mask = fragmentinput_fragment.sample_mask_1;\r\n    uint mask = (sample_mask & (1u << sample_index));\r\n    float color_1 = (front_facing ? 1.0 : 0.0);\r\n    const FragmentOutput fragmentoutput = ConstructFragmentOutput(in_._varying, mask, color_1);\r\n    return fragmentoutput;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid compute(uint3 global_id : SV_DispatchThreadID, uint3 local_id : SV_GroupThreadID, uint local_index : SV_GroupIndex, uint3 wg_id : SV_GroupID, uint3 num_wgs : SV_GroupID)\r\n{\r\n    output[0] = ((((global_id.x + local_id.x) + local_index) + wg_id.x) + uint3(_NagaConstants.base_vertex, _NagaConstants.base_instance, _NagaConstants.other).x);\r\n    return;\r\n}\r\n\r\nprecise float4 vertex_two_structs(Input1_ in1_, Input2_ in2_) : SV_Position\r\n{\r\n    uint index = 2u;\r\n\r\n    uint _expr9 = index;\r\n    return float4(float((_NagaConstants.base_vertex + in1_.index)), float((_NagaConstants.base_instance + in2_.index)), float(_expr9), 0.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/interface.hlsl.config",
    "content": "vertex=(vertex:vs_5_1 vertex_two_structs:vs_5_1 )\r\nfragment=(fragment:ps_5_1 )\r\ncompute=(compute:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/interpolate.hlsl",
    "content": "\r\nstruct FragmentInput {\r\n    float4 position : SV_Position;\r\n    nointerpolation uint _flat : LOC0;\r\n    noperspective float _linear : LOC1;\r\n    noperspective centroid float2 linear_centroid : LOC2;\r\n    noperspective sample float3 linear_sample : LOC3;\r\n    float4 perspective : LOC4;\r\n    centroid float perspective_centroid : LOC5;\r\n    sample float perspective_sample : LOC6;\r\n};\r\n\r\nstruct VertexOutput_vert_main {\r\n    nointerpolation uint _flat : LOC0;\r\n    noperspective float _linear : LOC1;\r\n    noperspective centroid float2 linear_centroid : LOC2;\r\n    noperspective sample float3 linear_sample : LOC3;\r\n    float4 perspective : LOC4;\r\n    centroid float perspective_centroid : LOC5;\r\n    sample float perspective_sample : LOC6;\r\n    float4 position : SV_Position;\r\n};\r\n\r\nstruct FragmentInput_frag_main {\r\n    nointerpolation uint _flat_1 : LOC0;\r\n    noperspective float _linear_1 : LOC1;\r\n    noperspective centroid float2 linear_centroid_1 : LOC2;\r\n    noperspective sample float3 linear_sample_1 : LOC3;\r\n    float4 perspective_1 : LOC4;\r\n    centroid float perspective_centroid_1 : LOC5;\r\n    sample float perspective_sample_1 : LOC6;\r\n    float4 position_1 : SV_Position;\r\n};\r\n\r\nVertexOutput_vert_main vert_main()\r\n{\r\n    FragmentInput out_ = (FragmentInput)0;\r\n\r\n    out_.position = float4(2.0, 4.0, 5.0, 6.0);\r\n    out_._flat = 8u;\r\n    out_._linear = 27.0;\r\n    out_.linear_centroid = float2(64.0, 125.0);\r\n    out_.linear_sample = float3(216.0, 343.0, 512.0);\r\n    out_.perspective = float4(729.0, 1000.0, 1331.0, 1728.0);\r\n    out_.perspective_centroid = 2197.0;\r\n    out_.perspective_sample = 2744.0;\r\n    FragmentInput _expr30 = out_;\r\n    const FragmentInput fragmentinput = _expr30;\r\n    const VertexOutput_vert_main fragmentinput_1 = { fragmentinput._flat, fragmentinput._linear, fragmentinput.linear_centroid, fragmentinput.linear_sample, fragmentinput.perspective, fragmentinput.perspective_centroid, fragmentinput.perspective_sample, fragmentinput.position };\r\n    return fragmentinput_1;\r\n}\r\n\r\nvoid frag_main(FragmentInput_frag_main fragmentinput_frag_main)\r\n{\r\n    FragmentInput val = { fragmentinput_frag_main.position_1, fragmentinput_frag_main._flat_1, fragmentinput_frag_main._linear_1, fragmentinput_frag_main.linear_centroid_1, fragmentinput_frag_main.linear_sample_1, fragmentinput_frag_main.perspective_1, fragmentinput_frag_main.perspective_centroid_1, fragmentinput_frag_main.perspective_sample_1 };\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/interpolate.hlsl.config",
    "content": "vertex=(vert_main:vs_5_1 )\r\nfragment=(frag_main:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/inv-hyperbolic-trig-functions.hlsl",
    "content": "\r\nstatic float a = (float)0;\r\n\r\nvoid main_1()\r\n{\r\n    float b = (float)0;\r\n    float c = (float)0;\r\n    float d = (float)0;\r\n\r\n    float _expr8 = a;\r\n    b = log(_expr8 + sqrt(_expr8 * _expr8 + 1.0));\r\n    float _expr10 = a;\r\n    c = log(_expr10 + sqrt(_expr10 * _expr10 - 1.0));\r\n    float _expr12 = a;\r\n    d = 0.5 * log((1.0 + _expr12) / (1.0 - _expr12));\r\n    return;\r\n}\r\n\r\nvoid main()\r\n{\r\n    main_1();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/inv-hyperbolic-trig-functions.hlsl.config",
    "content": "vertex=(main:vs_5_1 )\r\nfragment=()\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/math-functions.hlsl",
    "content": "\r\nvoid main()\r\n{\r\n    float4 v = (0.0).xxxx;\r\n    float a = degrees(1.0);\r\n    float b = radians(1.0);\r\n    float4 c = degrees(v);\r\n    float4 d = radians(v);\r\n    float4 e = saturate(v);\r\n    int const_dot = dot(int2(0, 0), int2(0, 0));\r\n    uint first_leading_bit_abs = firstbithigh(abs(0u));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/math-functions.hlsl.config",
    "content": "vertex=(main:vs_5_1 )\r\nfragment=()\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/operators.hlsl",
    "content": "static const float4 v_f32_one = float4(1.0, 1.0, 1.0, 1.0);\r\nstatic const float4 v_f32_zero = float4(0.0, 0.0, 0.0, 0.0);\r\nstatic const float4 v_f32_half = float4(0.5, 0.5, 0.5, 0.5);\r\nstatic const int4 v_i32_one = int4(1, 1, 1, 1);\r\n\r\nstruct Foo {\r\n    float4 a;\r\n    int b;\r\n    int _end_pad_0;\r\n    int _end_pad_1;\r\n    int _end_pad_2;\r\n};\r\n\r\nFoo ConstructFoo(float4 arg0, int arg1) {\r\n    Foo ret = (Foo)0;\r\n    ret.a = arg0;\r\n    ret.b = arg1;\r\n    return ret;\r\n}\r\n\r\ntypedef Foo ret_Constructarray3_Foo_[3];\r\nret_Constructarray3_Foo_ Constructarray3_Foo_(Foo arg0, Foo arg1, Foo arg2) {\r\n    Foo ret[3] = { arg0, arg1, arg2 };\r\n    return ret;\r\n}\r\n\r\nfloat4 builtins()\r\n{\r\n    int s1_ = (true ? 1 : 0);\r\n    float4 s2_ = (true ? float4(1.0, 1.0, 1.0, 1.0) : float4(0.0, 0.0, 0.0, 0.0));\r\n    float4 s3_ = (bool4(false, false, false, false) ? float4(0.0, 0.0, 0.0, 0.0) : float4(1.0, 1.0, 1.0, 1.0));\r\n    float4 m1_ = lerp(float4(0.0, 0.0, 0.0, 0.0), float4(1.0, 1.0, 1.0, 1.0), float4(0.5, 0.5, 0.5, 0.5));\r\n    float4 m2_ = lerp(float4(0.0, 0.0, 0.0, 0.0), float4(1.0, 1.0, 1.0, 1.0), 0.10000000149011612);\r\n    float b1_ = float(int4(1, 1, 1, 1).x);\r\n    float4 b2_ = float4(int4(1, 1, 1, 1));\r\n    int4 v_i32_zero = int4(float4(0.0, 0.0, 0.0, 0.0));\r\n    return (((((float4(((s1_).xxxx + v_i32_zero)) + s2_) + m1_) + m2_) + (b1_).xxxx) + b2_);\r\n}\r\n\r\nfloat4 splat()\r\n{\r\n    float2 a_2 = ((((1.0).xx + (2.0).xx) - (3.0).xx) / (4.0).xx);\r\n    int4 b = ((5).xxxx % (2).xxxx);\r\n    return (a_2.xyxy + float4(b));\r\n}\r\n\r\nfloat2 splat_assignment()\r\n{\r\n    float2 a = (float2)0;\r\n\r\n    a = (2.0).xx;\r\n    float2 _expr7 = a;\r\n    a = (_expr7 + (1.0).xx);\r\n    float2 _expr11 = a;\r\n    a = (_expr11 - (3.0).xx);\r\n    float2 _expr15 = a;\r\n    a = (_expr15 / (4.0).xx);\r\n    float2 _expr19 = a;\r\n    return _expr19;\r\n}\r\n\r\nfloat3 bool_cast(float3 x)\r\n{\r\n    bool3 y = bool3(x);\r\n    return float3(y);\r\n}\r\n\r\ntypedef int ret_Constructarray4_int_[4];\r\nret_Constructarray4_int_ Constructarray4_int_(int arg0, int arg1, int arg2, int arg3) {\r\n    int ret[4] = { arg0, arg1, arg2, arg3 };\r\n    return ret;\r\n}\r\n\r\nfloat constructors()\r\n{\r\n    Foo foo = (Foo)0;\r\n\r\n    foo = ConstructFoo((1.0).xxxx, 1);\r\n    float2x2 mat2comp = float2x2(float2(1.0, 0.0), float2(0.0, 1.0));\r\n    float4x4 mat4comp = float4x4(float4(1.0, 0.0, 0.0, 0.0), float4(0.0, 1.0, 0.0, 0.0), float4(0.0, 0.0, 1.0, 0.0), float4(0.0, 0.0, 0.0, 1.0));\r\n    uint2 unnamed = (0u).xx;\r\n    float2x2 unnamed_1 = float2x2((0.0).xx, (0.0).xx);\r\n    int unnamed_2[4] = Constructarray4_int_(0, 1, 2, 3);\r\n    bool unnamed_3 = bool(false);\r\n    int unnamed_4 = int(0);\r\n    uint unnamed_5 = uint(0u);\r\n    float unnamed_6 = float(0.0);\r\n    uint2 unnamed_7 = uint2(uint2(0u, 0u));\r\n    float2x3 unnamed_8 = float2x3(float2x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    uint2 unnamed_9 = uint2(uint2(0u, 0u));\r\n    float2x3 unnamed_10 = float2x3(float2x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    float _expr75 = foo.a.x;\r\n    return _expr75;\r\n}\r\n\r\nvoid logical()\r\n{\r\n    bool unnamed_11 = !true;\r\n    bool2 unnamed_12 = !(true).xx;\r\n    bool unnamed_13 = (true || false);\r\n    bool unnamed_14 = (true && false);\r\n    bool unnamed_15 = (true | false);\r\n    bool3 unnamed_16 = ((true).xxx | (false).xxx);\r\n    bool unnamed_17 = (true & false);\r\n    bool4 unnamed_18 = ((true).xxxx & (false).xxxx);\r\n}\r\n\r\nvoid arithmetic()\r\n{\r\n    int2 unnamed_19 = -(1).xx;\r\n    float2 unnamed_20 = -(1.0).xx;\r\n    int unnamed_21 = (2 + 1);\r\n    uint unnamed_22 = (2u + 1u);\r\n    float unnamed_23 = (2.0 + 1.0);\r\n    int2 unnamed_24 = ((2).xx + (1).xx);\r\n    uint3 unnamed_25 = ((2u).xxx + (1u).xxx);\r\n    float4 unnamed_26 = ((2.0).xxxx + (1.0).xxxx);\r\n    int unnamed_27 = (2 - 1);\r\n    uint unnamed_28 = (2u - 1u);\r\n    float unnamed_29 = (2.0 - 1.0);\r\n    int2 unnamed_30 = ((2).xx - (1).xx);\r\n    uint3 unnamed_31 = ((2u).xxx - (1u).xxx);\r\n    float4 unnamed_32 = ((2.0).xxxx - (1.0).xxxx);\r\n    int unnamed_33 = (2 * 1);\r\n    uint unnamed_34 = (2u * 1u);\r\n    float unnamed_35 = (2.0 * 1.0);\r\n    int2 unnamed_36 = ((2).xx * (1).xx);\r\n    uint3 unnamed_37 = ((2u).xxx * (1u).xxx);\r\n    float4 unnamed_38 = ((2.0).xxxx * (1.0).xxxx);\r\n    int unnamed_39 = (2 / 1);\r\n    uint unnamed_40 = (2u / 1u);\r\n    float unnamed_41 = (2.0 / 1.0);\r\n    int2 unnamed_42 = ((2).xx / (1).xx);\r\n    uint3 unnamed_43 = ((2u).xxx / (1u).xxx);\r\n    float4 unnamed_44 = ((2.0).xxxx / (1.0).xxxx);\r\n    int unnamed_45 = (2 % 1);\r\n    uint unnamed_46 = (2u % 1u);\r\n    float unnamed_47 = fmod(2.0, 1.0);\r\n    int2 unnamed_48 = ((2).xx % (1).xx);\r\n    uint3 unnamed_49 = ((2u).xxx % (1u).xxx);\r\n    float4 unnamed_50 = fmod((2.0).xxxx, (1.0).xxxx);\r\n    int2 unnamed_51 = ((2).xx + (1).xx);\r\n    int2 unnamed_52 = ((2).xx + (1).xx);\r\n    uint2 unnamed_53 = ((2u).xx + (1u).xx);\r\n    uint2 unnamed_54 = ((2u).xx + (1u).xx);\r\n    float2 unnamed_55 = ((2.0).xx + (1.0).xx);\r\n    float2 unnamed_56 = ((2.0).xx + (1.0).xx);\r\n    int2 unnamed_57 = ((2).xx - (1).xx);\r\n    int2 unnamed_58 = ((2).xx - (1).xx);\r\n    uint2 unnamed_59 = ((2u).xx - (1u).xx);\r\n    uint2 unnamed_60 = ((2u).xx - (1u).xx);\r\n    float2 unnamed_61 = ((2.0).xx - (1.0).xx);\r\n    float2 unnamed_62 = ((2.0).xx - (1.0).xx);\r\n    int2 unnamed_63 = ((2).xx * 1);\r\n    int2 unnamed_64 = (2 * (1).xx);\r\n    uint2 unnamed_65 = ((2u).xx * 1u);\r\n    uint2 unnamed_66 = (2u * (1u).xx);\r\n    float2 unnamed_67 = ((2.0).xx * 1.0);\r\n    float2 unnamed_68 = (2.0 * (1.0).xx);\r\n    int2 unnamed_69 = ((2).xx / (1).xx);\r\n    int2 unnamed_70 = ((2).xx / (1).xx);\r\n    uint2 unnamed_71 = ((2u).xx / (1u).xx);\r\n    uint2 unnamed_72 = ((2u).xx / (1u).xx);\r\n    float2 unnamed_73 = ((2.0).xx / (1.0).xx);\r\n    float2 unnamed_74 = ((2.0).xx / (1.0).xx);\r\n    int2 unnamed_75 = ((2).xx % (1).xx);\r\n    int2 unnamed_76 = ((2).xx % (1).xx);\r\n    uint2 unnamed_77 = ((2u).xx % (1u).xx);\r\n    uint2 unnamed_78 = ((2u).xx % (1u).xx);\r\n    float2 unnamed_79 = fmod((2.0).xx, (1.0).xx);\r\n    float2 unnamed_80 = fmod((2.0).xx, (1.0).xx);\r\n    float3x3 unnamed_81 = (float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)) + float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    float3x3 unnamed_82 = (float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)) - float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    float3x3 unnamed_83 = mul(1.0, float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    float3x3 unnamed_84 = mul(float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)), 2.0);\r\n    float3 unnamed_85 = mul((1.0).xxxx, float4x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n    float4 unnamed_86 = mul(float4x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)), (2.0).xxx);\r\n    float3x3 unnamed_87 = mul(float3x4(float4(0.0, 0.0, 0.0, 0.0), float4(0.0, 0.0, 0.0, 0.0), float4(0.0, 0.0, 0.0, 0.0)), float4x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)));\r\n}\r\n\r\nvoid bit()\r\n{\r\n    int unnamed_88 = ~1;\r\n    uint unnamed_89 = ~1u;\r\n    int2 unnamed_90 = ~(1).xx;\r\n    uint3 unnamed_91 = ~(1u).xxx;\r\n    int unnamed_92 = (2 | 1);\r\n    uint unnamed_93 = (2u | 1u);\r\n    int2 unnamed_94 = ((2).xx | (1).xx);\r\n    uint3 unnamed_95 = ((2u).xxx | (1u).xxx);\r\n    int unnamed_96 = (2 & 1);\r\n    uint unnamed_97 = (2u & 1u);\r\n    int2 unnamed_98 = ((2).xx & (1).xx);\r\n    uint3 unnamed_99 = ((2u).xxx & (1u).xxx);\r\n    int unnamed_100 = (2 ^ 1);\r\n    uint unnamed_101 = (2u ^ 1u);\r\n    int2 unnamed_102 = ((2).xx ^ (1).xx);\r\n    uint3 unnamed_103 = ((2u).xxx ^ (1u).xxx);\r\n    int unnamed_104 = (2 << 1u);\r\n    uint unnamed_105 = (2u << 1u);\r\n    int2 unnamed_106 = ((2).xx << (1u).xx);\r\n    uint3 unnamed_107 = ((2u).xxx << (1u).xxx);\r\n    int unnamed_108 = (2 >> 1u);\r\n    uint unnamed_109 = (2u >> 1u);\r\n    int2 unnamed_110 = ((2).xx >> (1u).xx);\r\n    uint3 unnamed_111 = ((2u).xxx >> (1u).xxx);\r\n}\r\n\r\nvoid comparison()\r\n{\r\n    bool unnamed_112 = (2 == 1);\r\n    bool unnamed_113 = (2u == 1u);\r\n    bool unnamed_114 = (2.0 == 1.0);\r\n    bool2 unnamed_115 = ((2).xx == (1).xx);\r\n    bool3 unnamed_116 = ((2u).xxx == (1u).xxx);\r\n    bool4 unnamed_117 = ((2.0).xxxx == (1.0).xxxx);\r\n    bool unnamed_118 = (2 != 1);\r\n    bool unnamed_119 = (2u != 1u);\r\n    bool unnamed_120 = (2.0 != 1.0);\r\n    bool2 unnamed_121 = ((2).xx != (1).xx);\r\n    bool3 unnamed_122 = ((2u).xxx != (1u).xxx);\r\n    bool4 unnamed_123 = ((2.0).xxxx != (1.0).xxxx);\r\n    bool unnamed_124 = (2 < 1);\r\n    bool unnamed_125 = (2u < 1u);\r\n    bool unnamed_126 = (2.0 < 1.0);\r\n    bool2 unnamed_127 = ((2).xx < (1).xx);\r\n    bool3 unnamed_128 = ((2u).xxx < (1u).xxx);\r\n    bool4 unnamed_129 = ((2.0).xxxx < (1.0).xxxx);\r\n    bool unnamed_130 = (2 <= 1);\r\n    bool unnamed_131 = (2u <= 1u);\r\n    bool unnamed_132 = (2.0 <= 1.0);\r\n    bool2 unnamed_133 = ((2).xx <= (1).xx);\r\n    bool3 unnamed_134 = ((2u).xxx <= (1u).xxx);\r\n    bool4 unnamed_135 = ((2.0).xxxx <= (1.0).xxxx);\r\n    bool unnamed_136 = (2 > 1);\r\n    bool unnamed_137 = (2u > 1u);\r\n    bool unnamed_138 = (2.0 > 1.0);\r\n    bool2 unnamed_139 = ((2).xx > (1).xx);\r\n    bool3 unnamed_140 = ((2u).xxx > (1u).xxx);\r\n    bool4 unnamed_141 = ((2.0).xxxx > (1.0).xxxx);\r\n    bool unnamed_142 = (2 >= 1);\r\n    bool unnamed_143 = (2u >= 1u);\r\n    bool unnamed_144 = (2.0 >= 1.0);\r\n    bool2 unnamed_145 = ((2).xx >= (1).xx);\r\n    bool3 unnamed_146 = ((2u).xxx >= (1u).xxx);\r\n    bool4 unnamed_147 = ((2.0).xxxx >= (1.0).xxxx);\r\n}\r\n\r\nvoid assignment()\r\n{\r\n    int a_1 = 1;\r\n    int3 vec0_ = int3(0, 0, 0);\r\n\r\n    int _expr6 = a_1;\r\n    a_1 = (_expr6 + 1);\r\n    int _expr9 = a_1;\r\n    a_1 = (_expr9 - 1);\r\n    int _expr12 = a_1;\r\n    int _expr13 = a_1;\r\n    a_1 = (_expr12 * _expr13);\r\n    int _expr15 = a_1;\r\n    int _expr16 = a_1;\r\n    a_1 = (_expr15 / _expr16);\r\n    int _expr18 = a_1;\r\n    a_1 = (_expr18 % 1);\r\n    int _expr21 = a_1;\r\n    a_1 = (_expr21 & 0);\r\n    int _expr24 = a_1;\r\n    a_1 = (_expr24 | 0);\r\n    int _expr27 = a_1;\r\n    a_1 = (_expr27 ^ 0);\r\n    int _expr30 = a_1;\r\n    a_1 = (_expr30 << 2u);\r\n    int _expr33 = a_1;\r\n    a_1 = (_expr33 >> 1u);\r\n    int _expr36 = a_1;\r\n    a_1 = (_expr36 + 1);\r\n    int _expr39 = a_1;\r\n    a_1 = (_expr39 - 1);\r\n    int _expr46 = vec0_.y;\r\n    vec0_.y = (_expr46 + 1);\r\n    int _expr51 = vec0_.y;\r\n    vec0_.y = (_expr51 - 1);\r\n    return;\r\n}\r\n\r\n[numthreads(1, 1, 1)]\r\nvoid main()\r\n{\r\n    const float4 _e4 = builtins();\r\n    const float4 _e5 = splat();\r\n    const float3 _e7 = bool_cast(float4(1.0, 1.0, 1.0, 1.0).xyz);\r\n    const float _e8 = constructors();\r\n    logical();\r\n    arithmetic();\r\n    bit();\r\n    comparison();\r\n    assignment();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/operators.hlsl.config",
    "content": "vertex=()\r\nfragment=()\r\ncompute=(main:cs_5_1 )\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/padding.hlsl",
    "content": "\r\nstruct S {\r\n    float3 a;\r\n    int _end_pad_0;\r\n};\r\n\r\nstruct Test {\r\n    S a;\r\n    float b;\r\n    int _end_pad_0;\r\n    int _end_pad_1;\r\n    int _end_pad_2;\r\n};\r\n\r\nstruct Test2_ {\r\n    float3 a[2];\r\n    int _pad1_0;\r\n    float b;\r\n    int _end_pad_0;\r\n    int _end_pad_1;\r\n    int _end_pad_2;\r\n};\r\n\r\nstruct Test3_ {\r\n    row_major float4x3 a;\r\n    int _pad1_0;\r\n    float b;\r\n    int _end_pad_0;\r\n    int _end_pad_1;\r\n    int _end_pad_2;\r\n};\r\n\r\ncbuffer input1_ : register(b0) { Test input1_; }\r\ncbuffer input2_ : register(b1) { Test2_ input2_; }\r\ncbuffer input3_ : register(b2) { Test3_ input3_; }\r\n\r\nfloat4 vertex() : SV_Position\r\n{\r\n    float _expr6 = input1_.b;\r\n    float _expr9 = input2_.b;\r\n    float _expr12 = input3_.b;\r\n    return ((((1.0).xxxx * _expr6) * _expr9) * _expr12);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/padding.hlsl.config",
    "content": "vertex=(vertex:vs_5_1 )\r\nfragment=()\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/push-constants.hlsl",
    "content": "struct NagaConstants {\r\n    int base_vertex;\r\n    int base_instance;\r\n    uint other;\r\n};\r\nConstantBuffer<NagaConstants> _NagaConstants: register(b0, space1);\r\n\r\nstruct PushConstants {\r\n    float multiplier;\r\n};\r\n\r\nstruct FragmentIn {\r\n    float4 color : LOC0;\r\n};\r\n\r\nConstantBuffer<PushConstants> pc: register(b0);\r\n\r\nstruct FragmentInput_main {\r\n    float4 color : LOC0;\r\n};\r\n\r\nfloat4 vert_main(float2 pos : LOC0, uint vi : SV_VertexID) : SV_Position\r\n{\r\n    float _expr5 = pc.multiplier;\r\n    return float4(((float((_NagaConstants.base_vertex + vi)) * _expr5) * pos), 0.0, 1.0);\r\n}\r\n\r\nfloat4 main(FragmentInput_main fragmentinput_main) : SV_Target0\r\n{\r\n    FragmentIn in_ = { fragmentinput_main.color };\r\n    float _expr4 = pc.multiplier;\r\n    return (in_.color * _expr4);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/push-constants.hlsl.config",
    "content": "vertex=(vert_main:vs_5_1 )\r\nfragment=(main:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/quad-vert.hlsl",
    "content": "\r\nstruct gl_PerVertex {\r\n    float4 gl_Position : SV_Position;\r\n    float gl_PointSize : PSIZE;\r\n    float gl_ClipDistance[1] : SV_ClipDistance;\r\n    float gl_CullDistance[1] : SV_CullDistance;\r\n};\r\n\r\nstruct type_9 {\r\n    float2 member : LOC0;\r\n    float4 gl_Position : SV_Position;\r\n};\r\n\r\ntypedef float ret_Constructarray1_float_[1];\r\nret_Constructarray1_float_ Constructarray1_float_(float arg0) {\r\n    float ret[1] = { arg0 };\r\n    return ret;\r\n}\r\n\r\ngl_PerVertex Constructgl_PerVertex(float4 arg0, float arg1, float arg2[1], float arg3[1]) {\r\n    gl_PerVertex ret = (gl_PerVertex)0;\r\n    ret.gl_Position = arg0;\r\n    ret.gl_PointSize = arg1;\r\n    ret.gl_ClipDistance = arg2;\r\n    ret.gl_CullDistance = arg3;\r\n    return ret;\r\n}\r\n\r\nstatic float2 v_uv = (float2)0;\r\nstatic float2 a_uv_1 = (float2)0;\r\nstatic gl_PerVertex perVertexStruct = Constructgl_PerVertex(float4(0.0, 0.0, 0.0, 1.0), 1.0, Constructarray1_float_(0.0), Constructarray1_float_(0.0));\r\nstatic float2 a_pos_1 = (float2)0;\r\n\r\nstruct VertexOutput_main {\r\n    float2 member : LOC0;\r\n    float4 gl_Position : SV_Position;\r\n};\r\n\r\nvoid main_1()\r\n{\r\n    float2 _expr12 = a_uv_1;\r\n    v_uv = _expr12;\r\n    float2 _expr13 = a_pos_1;\r\n    perVertexStruct.gl_Position = float4(_expr13.x, _expr13.y, 0.0, 1.0);\r\n    return;\r\n}\r\n\r\ntype_9 Constructtype_9(float2 arg0, float4 arg1) {\r\n    type_9 ret = (type_9)0;\r\n    ret.member = arg0;\r\n    ret.gl_Position = arg1;\r\n    return ret;\r\n}\r\n\r\nVertexOutput_main main(float2 a_uv : LOC1, float2 a_pos : LOC0)\r\n{\r\n    a_uv_1 = a_uv;\r\n    a_pos_1 = a_pos;\r\n    main_1();\r\n    float2 _expr7 = v_uv;\r\n    float4 _expr8 = perVertexStruct.gl_Position;\r\n    const type_9 type_9_ = Constructtype_9(_expr7, _expr8);\r\n    const VertexOutput_main type_9_1 = { type_9_.member, type_9_.gl_Position };\r\n    return type_9_1;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/quad-vert.hlsl.config",
    "content": "vertex=(main:vs_5_1 )\r\nfragment=()\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/quad.hlsl",
    "content": "static const float c_scale = 1.2000000476837158;\r\n\r\nstruct VertexOutput {\r\n    float2 uv : LOC0;\r\n    float4 position : SV_Position;\r\n};\r\n\r\nTexture2D<float4> u_texture : register(t0);\r\nSamplerState u_sampler : register(s1);\r\n\r\nstruct VertexOutput_vert_main {\r\n    float2 uv_2 : LOC0;\r\n    float4 position : SV_Position;\r\n};\r\n\r\nstruct FragmentInput_frag_main {\r\n    float2 uv_3 : LOC0;\r\n};\r\n\r\nVertexOutput ConstructVertexOutput(float2 arg0, float4 arg1) {\r\n    VertexOutput ret = (VertexOutput)0;\r\n    ret.uv = arg0;\r\n    ret.position = arg1;\r\n    return ret;\r\n}\r\n\r\nVertexOutput_vert_main vert_main(float2 pos : LOC0, float2 uv : LOC1)\r\n{\r\n    const VertexOutput vertexoutput = ConstructVertexOutput(uv, float4((c_scale * pos), 0.0, 1.0));\r\n    const VertexOutput_vert_main vertexoutput_1 = { vertexoutput.uv, vertexoutput.position };\r\n    return vertexoutput_1;\r\n}\r\n\r\nfloat4 frag_main(FragmentInput_frag_main fragmentinput_frag_main) : SV_Target0\r\n{\r\n    float2 uv_1 = fragmentinput_frag_main.uv_3;\r\n    float4 color = u_texture.Sample(u_sampler, uv_1);\r\n    if ((color.w == 0.0)) {\r\n        discard;\r\n    }\r\n    float4 premultiplied = (color.w * color);\r\n    return premultiplied;\r\n}\r\n\r\nfloat4 fs_extra() : SV_Target0\r\n{\r\n    return float4(0.0, 0.5, 0.0, 0.5);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/quad.hlsl.config",
    "content": "vertex=(vert_main:vs_5_1 )\r\nfragment=(frag_main:ps_5_1 fs_extra:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/shadow.hlsl",
    "content": "static const float3 c_ambient = float3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\nstatic const uint c_max_lights = 10;\r\n\r\nstruct Globals {\r\n    row_major float4x4 view_proj;\r\n    uint4 num_lights;\r\n};\r\n\r\nstruct Entity {\r\n    row_major float4x4 world;\r\n    float4 color;\r\n};\r\n\r\nstruct VertexOutput {\r\n    float4 proj_position : SV_Position;\r\n    float3 world_normal : LOC0;\r\n    float4 world_position : LOC1;\r\n};\r\n\r\nstruct Light {\r\n    row_major float4x4 proj;\r\n    float4 pos;\r\n    float4 color;\r\n};\r\n\r\ncbuffer u_globals : register(b0) { Globals u_globals; }\r\ncbuffer u_entity : register(b0, space1) { Entity u_entity; }\r\nByteAddressBuffer s_lights : register(t1);\r\ncbuffer u_lights : register(b1) { Light u_lights[10]; }\r\nTexture2DArray<float> t_shadow : register(t2);\r\nSamplerComparisonState sampler_shadow : register(s3);\r\n\r\nstruct VertexOutput_vs_main {\r\n    float3 world_normal : LOC0;\r\n    float4 world_position : LOC1;\r\n    float4 proj_position : SV_Position;\r\n};\r\n\r\nstruct FragmentInput_fs_main {\r\n    float3 world_normal_1 : LOC0;\r\n    float4 world_position_1 : LOC1;\r\n    float4 proj_position_1 : SV_Position;\r\n};\r\n\r\nstruct FragmentInput_fs_main_without_storage {\r\n    float3 world_normal_2 : LOC0;\r\n    float4 world_position_2 : LOC1;\r\n    float4 proj_position_2 : SV_Position;\r\n};\r\n\r\nfloat fetch_shadow(uint light_id, float4 homogeneous_coords)\r\n{\r\n    if ((homogeneous_coords.w <= 0.0)) {\r\n        return 1.0;\r\n    }\r\n    float2 flip_correction = float2(0.5, -0.5);\r\n    float proj_correction = (1.0 / homogeneous_coords.w);\r\n    float2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + float2(0.5, 0.5));\r\n    float _expr28 = t_shadow.SampleCmpLevelZero(sampler_shadow, float3(light_local, int(light_id)), (homogeneous_coords.z * proj_correction));\r\n    return _expr28;\r\n}\r\n\r\nVertexOutput_vs_main vs_main(int4 position : LOC0, int4 normal : LOC1)\r\n{\r\n    VertexOutput out_ = (VertexOutput)0;\r\n\r\n    float4x4 w = u_entity.world;\r\n    float4x4 _expr7 = u_entity.world;\r\n    float4 world_pos = mul(float4(position), _expr7);\r\n    out_.world_normal = mul(float3(normal.xyz), float3x3(w[0].xyz, w[1].xyz, w[2].xyz));\r\n    out_.world_position = world_pos;\r\n    float4x4 _expr25 = u_globals.view_proj;\r\n    out_.proj_position = mul(world_pos, _expr25);\r\n    VertexOutput _expr27 = out_;\r\n    const VertexOutput vertexoutput = _expr27;\r\n    const VertexOutput_vs_main vertexoutput_1 = { vertexoutput.world_normal, vertexoutput.world_position, vertexoutput.proj_position };\r\n    return vertexoutput_1;\r\n}\r\n\r\nLight ConstructLight(float4x4 arg0, float4 arg1, float4 arg2) {\r\n    Light ret = (Light)0;\r\n    ret.proj = arg0;\r\n    ret.pos = arg1;\r\n    ret.color = arg2;\r\n    return ret;\r\n}\r\n\r\nfloat4 fs_main(FragmentInput_fs_main fragmentinput_fs_main) : SV_Target0\r\n{\r\n    VertexOutput in_ = { fragmentinput_fs_main.proj_position_1, fragmentinput_fs_main.world_normal_1, fragmentinput_fs_main.world_position_1 };\r\n    float3 color = float3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\n    uint i = 0u;\r\n\r\n    float3 normal_1 = normalize(in_.world_normal);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _expr20 = i;\r\n            i = (_expr20 + 1u);\r\n        }\r\n        loop_init = false;\r\n        uint _expr14 = i;\r\n        uint _expr17 = u_globals.num_lights.x;\r\n        if ((_expr14 < min(_expr17, c_max_lights))) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _expr23 = i;\r\n        Light light = ConstructLight(float4x4(asfloat(s_lights.Load4(_expr23*96+0+0)), asfloat(s_lights.Load4(_expr23*96+0+16)), asfloat(s_lights.Load4(_expr23*96+0+32)), asfloat(s_lights.Load4(_expr23*96+0+48))), asfloat(s_lights.Load4(_expr23*96+64)), asfloat(s_lights.Load4(_expr23*96+80)));\r\n        uint _expr26 = i;\r\n        const float _e30 = fetch_shadow(_expr26, mul(in_.world_position, light.proj));\r\n        float3 light_dir = normalize((light.pos.xyz - in_.world_position.xyz));\r\n        float diffuse = max(0.0, dot(normal_1, light_dir));\r\n        float3 _expr40 = color;\r\n        color = (_expr40 + ((_e30 * diffuse) * light.color.xyz));\r\n    }\r\n    float3 _expr46 = color;\r\n    float4 _expr50 = u_entity.color;\r\n    return (float4(_expr46, 1.0) * _expr50);\r\n}\r\n\r\nfloat4 fs_main_without_storage(FragmentInput_fs_main_without_storage fragmentinput_fs_main_without_storage) : SV_Target0\r\n{\r\n    VertexOutput in_1 = { fragmentinput_fs_main_without_storage.proj_position_2, fragmentinput_fs_main_without_storage.world_normal_2, fragmentinput_fs_main_without_storage.world_position_2 };\r\n    float3 color_1 = float3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\n    uint i_1 = 0u;\r\n\r\n    float3 normal_2 = normalize(in_1.world_normal);\r\n    bool loop_init_1 = true;\r\n    while(true) {\r\n        if (!loop_init_1) {\r\n            uint _expr20 = i_1;\r\n            i_1 = (_expr20 + 1u);\r\n        }\r\n        loop_init_1 = false;\r\n        uint _expr14 = i_1;\r\n        uint _expr17 = u_globals.num_lights.x;\r\n        if ((_expr14 < min(_expr17, c_max_lights))) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _expr23 = i_1;\r\n        Light light_1 = u_lights[_expr23];\r\n        uint _expr26 = i_1;\r\n        const float _e30 = fetch_shadow(_expr26, mul(in_1.world_position, light_1.proj));\r\n        float3 light_dir_1 = normalize((light_1.pos.xyz - in_1.world_position.xyz));\r\n        float diffuse_1 = max(0.0, dot(normal_2, light_dir_1));\r\n        float3 _expr40 = color_1;\r\n        color_1 = (_expr40 + ((_e30 * diffuse_1) * light_1.color.xyz));\r\n    }\r\n    float3 _expr46 = color_1;\r\n    float4 _expr50 = u_entity.color;\r\n    return (float4(_expr46, 1.0) * _expr50);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/shadow.hlsl.config",
    "content": "vertex=(vs_main:vs_5_1 )\r\nfragment=(fs_main:ps_5_1 fs_main_without_storage:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/skybox.hlsl",
    "content": "struct NagaConstants {\r\n    int base_vertex;\r\n    int base_instance;\r\n    uint other;\r\n};\r\nConstantBuffer<NagaConstants> _NagaConstants: register(b1);\r\n\r\nstruct VertexOutput {\r\n    float4 position : SV_Position;\r\n    float3 uv : LOC0;\r\n};\r\n\r\nstruct Data {\r\n    row_major float4x4 proj_inv;\r\n    row_major float4x4 view;\r\n};\r\n\r\ncbuffer r_data : register(b0) { Data r_data; }\r\nTextureCube<float4> r_texture : register(t0);\r\nSamplerState r_sampler : register(s0, space1);\r\n\r\nstruct VertexOutput_vs_main {\r\n    float3 uv : LOC0;\r\n    float4 position : SV_Position;\r\n};\r\n\r\nstruct FragmentInput_fs_main {\r\n    float3 uv_1 : LOC0;\r\n    float4 position_1 : SV_Position;\r\n};\r\n\r\nVertexOutput ConstructVertexOutput(float4 arg0, float3 arg1) {\r\n    VertexOutput ret = (VertexOutput)0;\r\n    ret.position = arg0;\r\n    ret.uv = arg1;\r\n    return ret;\r\n}\r\n\r\nVertexOutput_vs_main vs_main(uint vertex_index : SV_VertexID)\r\n{\r\n    int tmp1_ = (int)0;\r\n    int tmp2_ = (int)0;\r\n\r\n    tmp1_ = (int((_NagaConstants.base_vertex + vertex_index)) / 2);\r\n    tmp2_ = (int((_NagaConstants.base_vertex + vertex_index)) & 1);\r\n    int _expr10 = tmp1_;\r\n    int _expr16 = tmp2_;\r\n    float4 pos = float4(((float(_expr10) * 4.0) - 1.0), ((float(_expr16) * 4.0) - 1.0), 0.0, 1.0);\r\n    float4 _expr27 = r_data.view[0];\r\n    float4 _expr31 = r_data.view[1];\r\n    float4 _expr35 = r_data.view[2];\r\n    float3x3 inv_model_view = transpose(float3x3(_expr27.xyz, _expr31.xyz, _expr35.xyz));\r\n    float4x4 _expr40 = r_data.proj_inv;\r\n    float4 unprojected = mul(pos, _expr40);\r\n    const VertexOutput vertexoutput = ConstructVertexOutput(pos, mul(unprojected.xyz, inv_model_view));\r\n    const VertexOutput_vs_main vertexoutput_1 = { vertexoutput.uv, vertexoutput.position };\r\n    return vertexoutput_1;\r\n}\r\n\r\nfloat4 fs_main(FragmentInput_fs_main fragmentinput_fs_main) : SV_Target0\r\n{\r\n    VertexOutput in_ = { fragmentinput_fs_main.position_1, fragmentinput_fs_main.uv_1 };\r\n    float4 _expr5 = r_texture.Sample(r_sampler, in_.uv);\r\n    return _expr5;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/skybox.hlsl.config",
    "content": "vertex=(vs_main:vs_5_1 )\r\nfragment=(fs_main:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/standard.hlsl",
    "content": "\r\nstruct FragmentInput_derivatives {\r\n    float4 foo_1 : SV_Position;\r\n};\r\n\r\nfloat4 derivatives(FragmentInput_derivatives fragmentinput_derivatives) : SV_Target0\r\n{\r\n    float4 foo = fragmentinput_derivatives.foo_1;\r\n    float4 x = ddx(foo);\r\n    float4 y = ddy(foo);\r\n    float4 z = fwidth(foo);\r\n    return ((x + y) * z);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/standard.hlsl.config",
    "content": "vertex=()\r\nfragment=(derivatives:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/texture-arg.hlsl",
    "content": "\r\nTexture2D<float4> Texture : register(t0);\r\nSamplerState Sampler : register(s1);\r\n\r\nfloat4 test(Texture2D<float4> Passed_Texture, SamplerState Passed_Sampler)\r\n{\r\n    float4 _expr7 = Passed_Texture.Sample(Passed_Sampler, float2(0.0, 0.0));\r\n    return _expr7;\r\n}\r\n\r\nfloat4 main() : SV_Target0\r\n{\r\n    const float4 _e2 = test(Texture, Sampler);\r\n    return _e2;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/hlsl/texture-arg.hlsl.config",
    "content": "vertex=()\r\nfragment=(main:ps_5_1 )\r\ncompute=()\r\n"
  },
  {
    "path": "lib/naga/tests/out/ir/collatz.ron",
    "content": "(\r\n    types: [\r\n        (\r\n            name: None,\r\n            inner: Scalar(\r\n                kind: Uint,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Array(\r\n                base: 1,\r\n                size: Dynamic,\r\n                stride: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: Some(\"PrimeIndices\"),\r\n            inner: Struct(\r\n                members: [\r\n                    (\r\n                        name: Some(\"data\"),\r\n                        ty: 2,\r\n                        binding: None,\r\n                        offset: 0,\r\n                    ),\r\n                ],\r\n                span: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Vector(\r\n                size: Tri,\r\n                kind: Uint,\r\n                width: 4,\r\n            ),\r\n        ),\r\n    ],\r\n    constants: [\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(3),\r\n            ),\r\n        ),\r\n    ],\r\n    global_variables: [\r\n        (\r\n            name: Some(\"v_indices\"),\r\n            space: Storage(\r\n                access: (\r\n                    bits: 3,\r\n                ),\r\n            ),\r\n            binding: Some((\r\n                group: 0,\r\n                binding: 0,\r\n            )),\r\n            ty: 3,\r\n            init: None,\r\n        ),\r\n    ],\r\n    functions: [\r\n        (\r\n            name: Some(\"collatz_iterations\"),\r\n            arguments: [\r\n                (\r\n                    name: Some(\"n_base\"),\r\n                    ty: 1,\r\n                    binding: None,\r\n                ),\r\n            ],\r\n            result: Some((\r\n                ty: 1,\r\n                binding: None,\r\n            )),\r\n            local_variables: [\r\n                (\r\n                    name: Some(\"n\"),\r\n                    ty: 1,\r\n                    init: None,\r\n                ),\r\n                (\r\n                    name: Some(\"i\"),\r\n                    ty: 1,\r\n                    init: Some(1),\r\n                ),\r\n            ],\r\n            expressions: [\r\n                GlobalVariable(1),\r\n                FunctionArgument(0),\r\n                LocalVariable(1),\r\n                Constant(1),\r\n                LocalVariable(2),\r\n                Load(\r\n                    pointer: 3,\r\n                ),\r\n                Constant(2),\r\n                Binary(\r\n                    op: Greater,\r\n                    left: 6,\r\n                    right: 7,\r\n                ),\r\n                Load(\r\n                    pointer: 3,\r\n                ),\r\n                Constant(3),\r\n                Binary(\r\n                    op: Modulo,\r\n                    left: 9,\r\n                    right: 10,\r\n                ),\r\n                Constant(1),\r\n                Binary(\r\n                    op: Equal,\r\n                    left: 11,\r\n                    right: 12,\r\n                ),\r\n                Load(\r\n                    pointer: 3,\r\n                ),\r\n                Constant(3),\r\n                Binary(\r\n                    op: Divide,\r\n                    left: 14,\r\n                    right: 15,\r\n                ),\r\n                Constant(4),\r\n                Load(\r\n                    pointer: 3,\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 17,\r\n                    right: 18,\r\n                ),\r\n                Constant(2),\r\n                Binary(\r\n                    op: Add,\r\n                    left: 19,\r\n                    right: 20,\r\n                ),\r\n                Load(\r\n                    pointer: 5,\r\n                ),\r\n                Constant(2),\r\n                Binary(\r\n                    op: Add,\r\n                    left: 22,\r\n                    right: 23,\r\n                ),\r\n                Load(\r\n                    pointer: 5,\r\n                ),\r\n            ],\r\n            named_expressions: {},\r\n            body: [\r\n                Store(\r\n                    pointer: 3,\r\n                    value: 2,\r\n                ),\r\n                Loop(\r\n                    body: [\r\n                        Emit((\r\n                            start: 5,\r\n                            end: 6,\r\n                        )),\r\n                        Emit((\r\n                            start: 7,\r\n                            end: 8,\r\n                        )),\r\n                        If(\r\n                            condition: 8,\r\n                            accept: [],\r\n                            reject: [\r\n                                Break,\r\n                            ],\r\n                        ),\r\n                        Emit((\r\n                            start: 8,\r\n                            end: 9,\r\n                        )),\r\n                        Emit((\r\n                            start: 10,\r\n                            end: 11,\r\n                        )),\r\n                        Emit((\r\n                            start: 12,\r\n                            end: 13,\r\n                        )),\r\n                        If(\r\n                            condition: 13,\r\n                            accept: [\r\n                                Emit((\r\n                                    start: 13,\r\n                                    end: 14,\r\n                                )),\r\n                                Emit((\r\n                                    start: 15,\r\n                                    end: 16,\r\n                                )),\r\n                                Store(\r\n                                    pointer: 3,\r\n                                    value: 16,\r\n                                ),\r\n                            ],\r\n                            reject: [\r\n                                Emit((\r\n                                    start: 17,\r\n                                    end: 19,\r\n                                )),\r\n                                Emit((\r\n                                    start: 20,\r\n                                    end: 21,\r\n                                )),\r\n                                Store(\r\n                                    pointer: 3,\r\n                                    value: 21,\r\n                                ),\r\n                            ],\r\n                        ),\r\n                        Emit((\r\n                            start: 21,\r\n                            end: 22,\r\n                        )),\r\n                        Emit((\r\n                            start: 23,\r\n                            end: 24,\r\n                        )),\r\n                        Store(\r\n                            pointer: 5,\r\n                            value: 24,\r\n                        ),\r\n                    ],\r\n                    continuing: [],\r\n                    break_if: None,\r\n                ),\r\n                Emit((\r\n                    start: 24,\r\n                    end: 25,\r\n                )),\r\n                Return(\r\n                    value: Some(25),\r\n                ),\r\n            ],\r\n        ),\r\n    ],\r\n    entry_points: [\r\n        (\r\n            name: \"main\",\r\n            stage: Compute,\r\n            early_depth_test: None,\r\n            workgroup_size: (1, 1, 1),\r\n            function: (\r\n                name: Some(\"main\"),\r\n                arguments: [\r\n                    (\r\n                        name: Some(\"global_id\"),\r\n                        ty: 4,\r\n                        binding: Some(BuiltIn(GlobalInvocationId)),\r\n                    ),\r\n                ],\r\n                result: None,\r\n                local_variables: [],\r\n                expressions: [\r\n                    GlobalVariable(1),\r\n                    FunctionArgument(0),\r\n                    AccessIndex(\r\n                        base: 1,\r\n                        index: 0,\r\n                    ),\r\n                    AccessIndex(\r\n                        base: 2,\r\n                        index: 0,\r\n                    ),\r\n                    Access(\r\n                        base: 3,\r\n                        index: 4,\r\n                    ),\r\n                    AccessIndex(\r\n                        base: 1,\r\n                        index: 0,\r\n                    ),\r\n                    AccessIndex(\r\n                        base: 2,\r\n                        index: 0,\r\n                    ),\r\n                    Access(\r\n                        base: 6,\r\n                        index: 7,\r\n                    ),\r\n                    Load(\r\n                        pointer: 8,\r\n                    ),\r\n                    CallResult(1),\r\n                ],\r\n                named_expressions: {},\r\n                body: [\r\n                    Emit((\r\n                        start: 2,\r\n                        end: 9,\r\n                    )),\r\n                    Call(\r\n                        function: 1,\r\n                        arguments: [\r\n                            9,\r\n                        ],\r\n                        result: Some(10),\r\n                    ),\r\n                    Store(\r\n                        pointer: 5,\r\n                        value: 10,\r\n                    ),\r\n                    Return(\r\n                        value: None,\r\n                    ),\r\n                ],\r\n            ),\r\n        ),\r\n    ],\r\n)"
  },
  {
    "path": "lib/naga/tests/out/ir/shadow.ron",
    "content": "(\r\n    types: [\r\n        (\r\n            name: None,\r\n            inner: Scalar(\r\n                kind: Float,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Vector(\r\n                size: Tri,\r\n                kind: Float,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Scalar(\r\n                kind: Uint,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Vector(\r\n                size: Quad,\r\n                kind: Float,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Scalar(\r\n                kind: Bool,\r\n                width: 1,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Vector(\r\n                size: Bi,\r\n                kind: Float,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Image(\r\n                dim: D2,\r\n                arrayed: true,\r\n                class: Sampled(\r\n                    kind: Float,\r\n                    multi: false,\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Sampler(\r\n                comparison: false,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Scalar(\r\n                kind: Sint,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 2,\r\n                space: Function,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 3,\r\n                space: Function,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Vector(\r\n                size: Quad,\r\n                kind: Uint,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: Some(\"Globals\"),\r\n            inner: Struct(\r\n                members: [\r\n                    (\r\n                        name: Some(\"num_lights\"),\r\n                        ty: 12,\r\n                        binding: None,\r\n                        offset: 0,\r\n                    ),\r\n                ],\r\n                span: 16,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 13,\r\n                space: Uniform,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 12,\r\n                space: Uniform,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 3,\r\n                space: Uniform,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Matrix(\r\n                columns: Quad,\r\n                rows: Quad,\r\n                width: 4,\r\n            ),\r\n        ),\r\n        (\r\n            name: Some(\"Light\"),\r\n            inner: Struct(\r\n                members: [\r\n                    (\r\n                        name: Some(\"proj\"),\r\n                        ty: 17,\r\n                        binding: None,\r\n                        offset: 0,\r\n                    ),\r\n                    (\r\n                        name: Some(\"pos\"),\r\n                        ty: 4,\r\n                        binding: None,\r\n                        offset: 64,\r\n                    ),\r\n                    (\r\n                        name: Some(\"color\"),\r\n                        ty: 4,\r\n                        binding: None,\r\n                        offset: 80,\r\n                    ),\r\n                ],\r\n                span: 96,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Array(\r\n                base: 18,\r\n                size: Dynamic,\r\n                stride: 96,\r\n            ),\r\n        ),\r\n        (\r\n            name: Some(\"Lights\"),\r\n            inner: Struct(\r\n                members: [\r\n                    (\r\n                        name: Some(\"data\"),\r\n                        ty: 19,\r\n                        binding: None,\r\n                        offset: 0,\r\n                    ),\r\n                ],\r\n                span: 96,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 20,\r\n                space: Storage(\r\n                    access: (\r\n                        bits: 0,\r\n                    ),\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 19,\r\n                space: Storage(\r\n                    access: (\r\n                        bits: 3,\r\n                    ),\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 18,\r\n                space: Storage(\r\n                    access: (\r\n                        bits: 3,\r\n                    ),\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 17,\r\n                space: Storage(\r\n                    access: (\r\n                        bits: 3,\r\n                    ),\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 4,\r\n                space: Private,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 2,\r\n                space: Private,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 4,\r\n                space: Storage(\r\n                    access: (\r\n                        bits: 3,\r\n                    ),\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 1,\r\n                space: Storage(\r\n                    access: (\r\n                        bits: 3,\r\n                    ),\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Pointer(\r\n                base: 1,\r\n                space: Private,\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Image(\r\n                dim: D2,\r\n                arrayed: true,\r\n                class: Depth(\r\n                    multi: false,\r\n                ),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            inner: Sampler(\r\n                comparison: true,\r\n            ),\r\n        ),\r\n    ],\r\n    constants: [\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(3),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Float(0.0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Float(1.0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Float(0.5),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Float(-0.5),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Float(0.05000000074505806),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Composite(\r\n                ty: 2,\r\n                components: [\r\n                    9,\r\n                    9,\r\n                    9,\r\n                ],\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(10),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Uint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Float(0.0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(1),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(0),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n        (\r\n            name: None,\r\n            specialization: None,\r\n            inner: Scalar(\r\n                width: 4,\r\n                value: Sint(2),\r\n            ),\r\n        ),\r\n    ],\r\n    global_variables: [\r\n        (\r\n            name: Some(\"t_shadow\"),\r\n            space: Handle,\r\n            binding: Some((\r\n                group: 0,\r\n                binding: 2,\r\n            )),\r\n            ty: 30,\r\n            init: None,\r\n        ),\r\n        (\r\n            name: Some(\"sampler_shadow\"),\r\n            space: Handle,\r\n            binding: Some((\r\n                group: 0,\r\n                binding: 3,\r\n            )),\r\n            ty: 31,\r\n            init: None,\r\n        ),\r\n        (\r\n            name: Some(\"u_globals\"),\r\n            space: Uniform,\r\n            binding: Some((\r\n                group: 0,\r\n                binding: 0,\r\n            )),\r\n            ty: 13,\r\n            init: None,\r\n        ),\r\n        (\r\n            name: Some(\"s_lights\"),\r\n            space: Storage(\r\n                access: (\r\n                    bits: 1,\r\n                ),\r\n            ),\r\n            binding: Some((\r\n                group: 0,\r\n                binding: 1,\r\n            )),\r\n            ty: 20,\r\n            init: None,\r\n        ),\r\n        (\r\n            name: Some(\"in_position_fs\"),\r\n            space: Private,\r\n            binding: None,\r\n            ty: 4,\r\n            init: None,\r\n        ),\r\n        (\r\n            name: Some(\"in_normal_fs\"),\r\n            space: Private,\r\n            binding: None,\r\n            ty: 2,\r\n            init: None,\r\n        ),\r\n        (\r\n            name: Some(\"out_color_fs\"),\r\n            space: Private,\r\n            binding: None,\r\n            ty: 4,\r\n            init: None,\r\n        ),\r\n    ],\r\n    functions: [\r\n        (\r\n            name: None,\r\n            arguments: [\r\n                (\r\n                    name: None,\r\n                    ty: 3,\r\n                    binding: None,\r\n                ),\r\n                (\r\n                    name: None,\r\n                    ty: 4,\r\n                    binding: None,\r\n                ),\r\n            ],\r\n            result: Some((\r\n                ty: 1,\r\n                binding: None,\r\n            )),\r\n            local_variables: [],\r\n            expressions: [\r\n                GlobalVariable(3),\r\n                GlobalVariable(6),\r\n                GlobalVariable(5),\r\n                GlobalVariable(1),\r\n                GlobalVariable(2),\r\n                GlobalVariable(4),\r\n                GlobalVariable(7),\r\n                Constant(1),\r\n                Constant(2),\r\n                Constant(3),\r\n                Constant(4),\r\n                Constant(20),\r\n                Constant(7),\r\n                Constant(33),\r\n                Constant(31),\r\n                Constant(29),\r\n                Constant(27),\r\n                Constant(25),\r\n                Constant(15),\r\n                Constant(12),\r\n                Constant(23),\r\n                Constant(8),\r\n                Constant(36),\r\n                Constant(34),\r\n                Constant(14),\r\n                Constant(32),\r\n                Constant(30),\r\n                Constant(17),\r\n                Constant(26),\r\n                Constant(39),\r\n                Constant(13),\r\n                Constant(11),\r\n                Constant(9),\r\n                Constant(6),\r\n                Constant(21),\r\n                Constant(35),\r\n                Constant(19),\r\n                Constant(37),\r\n                Constant(18),\r\n                Constant(28),\r\n                Constant(16),\r\n                Constant(24),\r\n                Constant(38),\r\n                Constant(22),\r\n                Constant(10),\r\n                Constant(5),\r\n                FunctionArgument(0),\r\n                FunctionArgument(1),\r\n                AccessIndex(\r\n                    base: 48,\r\n                    index: 3,\r\n                ),\r\n                Binary(\r\n                    op: LessEqual,\r\n                    left: 49,\r\n                    right: 46,\r\n                ),\r\n                AccessIndex(\r\n                    base: 48,\r\n                    index: 0,\r\n                ),\r\n                AccessIndex(\r\n                    base: 48,\r\n                    index: 1,\r\n                ),\r\n                Compose(\r\n                    ty: 6,\r\n                    components: [\r\n                        51,\r\n                        52,\r\n                    ],\r\n                ),\r\n                Compose(\r\n                    ty: 6,\r\n                    components: [\r\n                        13,\r\n                        22,\r\n                    ],\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 53,\r\n                    right: 54,\r\n                ),\r\n                AccessIndex(\r\n                    base: 48,\r\n                    index: 3,\r\n                ),\r\n                Binary(\r\n                    op: Divide,\r\n                    left: 34,\r\n                    right: 56,\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 55,\r\n                    right: 57,\r\n                ),\r\n                Splat(\r\n                    size: Bi,\r\n                    value: 13,\r\n                ),\r\n                Binary(\r\n                    op: Add,\r\n                    left: 58,\r\n                    right: 59,\r\n                ),\r\n                AccessIndex(\r\n                    base: 60,\r\n                    index: 0,\r\n                ),\r\n                AccessIndex(\r\n                    base: 60,\r\n                    index: 1,\r\n                ),\r\n                As(\r\n                    expr: 47,\r\n                    kind: Sint,\r\n                    convert: None,\r\n                ),\r\n                As(\r\n                    expr: 63,\r\n                    kind: Float,\r\n                    convert: Some(4),\r\n                ),\r\n                Compose(\r\n                    ty: 2,\r\n                    components: [\r\n                        61,\r\n                        62,\r\n                        64,\r\n                    ],\r\n                ),\r\n                AccessIndex(\r\n                    base: 48,\r\n                    index: 2,\r\n                ),\r\n                AccessIndex(\r\n                    base: 48,\r\n                    index: 3,\r\n                ),\r\n                Binary(\r\n                    op: Divide,\r\n                    left: 34,\r\n                    right: 67,\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 66,\r\n                    right: 68,\r\n                ),\r\n                AccessIndex(\r\n                    base: 65,\r\n                    index: 0,\r\n                ),\r\n                AccessIndex(\r\n                    base: 65,\r\n                    index: 1,\r\n                ),\r\n                Compose(\r\n                    ty: 6,\r\n                    components: [\r\n                        70,\r\n                        71,\r\n                    ],\r\n                ),\r\n                AccessIndex(\r\n                    base: 65,\r\n                    index: 2,\r\n                ),\r\n                As(\r\n                    expr: 73,\r\n                    kind: Sint,\r\n                    convert: Some(4),\r\n                ),\r\n                ImageSample(\r\n                    image: 4,\r\n                    sampler: 5,\r\n                    gather: None,\r\n                    coordinate: 72,\r\n                    array_index: Some(74),\r\n                    offset: None,\r\n                    level: Zero,\r\n                    depth_ref: Some(69),\r\n                ),\r\n            ],\r\n            named_expressions: {},\r\n            body: [\r\n                Emit((\r\n                    start: 48,\r\n                    end: 50,\r\n                )),\r\n                If(\r\n                    condition: 50,\r\n                    accept: [\r\n                        Return(\r\n                            value: Some(34),\r\n                        ),\r\n                    ],\r\n                    reject: [],\r\n                ),\r\n                Emit((\r\n                    start: 50,\r\n                    end: 75,\r\n                )),\r\n                Return(\r\n                    value: Some(75),\r\n                ),\r\n            ],\r\n        ),\r\n        (\r\n            name: Some(\"fs_main\"),\r\n            arguments: [],\r\n            result: None,\r\n            local_variables: [\r\n                (\r\n                    name: Some(\"color\"),\r\n                    ty: 2,\r\n                    init: Some(10),\r\n                ),\r\n                (\r\n                    name: Some(\"i\"),\r\n                    ty: 3,\r\n                    init: Some(12),\r\n                ),\r\n            ],\r\n            expressions: [\r\n                GlobalVariable(3),\r\n                GlobalVariable(6),\r\n                GlobalVariable(5),\r\n                GlobalVariable(1),\r\n                GlobalVariable(2),\r\n                GlobalVariable(4),\r\n                GlobalVariable(7),\r\n                Constant(1),\r\n                Constant(2),\r\n                Constant(3),\r\n                Constant(4),\r\n                Constant(20),\r\n                Constant(7),\r\n                Constant(33),\r\n                Constant(31),\r\n                Constant(29),\r\n                Constant(27),\r\n                Constant(25),\r\n                Constant(15),\r\n                Constant(12),\r\n                Constant(23),\r\n                Constant(8),\r\n                Constant(36),\r\n                Constant(34),\r\n                Constant(14),\r\n                Constant(32),\r\n                Constant(30),\r\n                Constant(17),\r\n                Constant(26),\r\n                Constant(39),\r\n                Constant(13),\r\n                Constant(11),\r\n                Constant(9),\r\n                Constant(6),\r\n                Constant(21),\r\n                Constant(35),\r\n                Constant(19),\r\n                Constant(37),\r\n                Constant(18),\r\n                Constant(28),\r\n                Constant(16),\r\n                Constant(24),\r\n                Constant(38),\r\n                Constant(22),\r\n                Constant(10),\r\n                Constant(5),\r\n                LocalVariable(1),\r\n                LocalVariable(2),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                AccessIndex(\r\n                    base: 1,\r\n                    index: 0,\r\n                ),\r\n                Access(\r\n                    base: 50,\r\n                    index: 41,\r\n                ),\r\n                Load(\r\n                    pointer: 51,\r\n                ),\r\n                Math(\r\n                    fun: Min,\r\n                    arg: 52,\r\n                    arg1: Some(32),\r\n                    arg2: None,\r\n                    arg3: None,\r\n                ),\r\n                Binary(\r\n                    op: GreaterEqual,\r\n                    left: 49,\r\n                    right: 53,\r\n                ),\r\n                Load(\r\n                    pointer: 47,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 57,\r\n                    index: 58,\r\n                ),\r\n                AccessIndex(\r\n                    base: 59,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 60,\r\n                ),\r\n                Load(\r\n                    pointer: 3,\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 61,\r\n                    right: 62,\r\n                ),\r\n                CallResult(1),\r\n                Load(\r\n                    pointer: 2,\r\n                ),\r\n                Math(\r\n                    fun: Normalize,\r\n                    arg: 65,\r\n                    arg1: None,\r\n                    arg2: None,\r\n                    arg3: None,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 67,\r\n                    index: 68,\r\n                ),\r\n                AccessIndex(\r\n                    base: 69,\r\n                    index: 1,\r\n                ),\r\n                Access(\r\n                    base: 70,\r\n                    index: 35,\r\n                ),\r\n                Load(\r\n                    pointer: 71,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 73,\r\n                    index: 74,\r\n                ),\r\n                AccessIndex(\r\n                    base: 75,\r\n                    index: 1,\r\n                ),\r\n                Access(\r\n                    base: 76,\r\n                    index: 42,\r\n                ),\r\n                Load(\r\n                    pointer: 77,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 79,\r\n                    index: 80,\r\n                ),\r\n                AccessIndex(\r\n                    base: 81,\r\n                    index: 1,\r\n                ),\r\n                Access(\r\n                    base: 82,\r\n                    index: 17,\r\n                ),\r\n                Load(\r\n                    pointer: 83,\r\n                ),\r\n                Compose(\r\n                    ty: 2,\r\n                    components: [\r\n                        72,\r\n                        78,\r\n                        84,\r\n                    ],\r\n                ),\r\n                Access(\r\n                    base: 3,\r\n                    index: 40,\r\n                ),\r\n                Load(\r\n                    pointer: 86,\r\n                ),\r\n                Access(\r\n                    base: 3,\r\n                    index: 16,\r\n                ),\r\n                Load(\r\n                    pointer: 88,\r\n                ),\r\n                Access(\r\n                    base: 3,\r\n                    index: 27,\r\n                ),\r\n                Load(\r\n                    pointer: 90,\r\n                ),\r\n                Compose(\r\n                    ty: 2,\r\n                    components: [\r\n                        87,\r\n                        89,\r\n                        91,\r\n                    ],\r\n                ),\r\n                Binary(\r\n                    op: Subtract,\r\n                    left: 85,\r\n                    right: 92,\r\n                ),\r\n                Math(\r\n                    fun: Normalize,\r\n                    arg: 93,\r\n                    arg1: None,\r\n                    arg2: None,\r\n                    arg3: None,\r\n                ),\r\n                Math(\r\n                    fun: Dot,\r\n                    arg: 66,\r\n                    arg1: Some(94),\r\n                    arg2: None,\r\n                    arg3: None,\r\n                ),\r\n                Math(\r\n                    fun: Max,\r\n                    arg: 46,\r\n                    arg1: Some(95),\r\n                    arg2: None,\r\n                    arg3: None,\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 64,\r\n                    right: 96,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 98,\r\n                    index: 99,\r\n                ),\r\n                AccessIndex(\r\n                    base: 100,\r\n                    index: 2,\r\n                ),\r\n                Access(\r\n                    base: 101,\r\n                    index: 14,\r\n                ),\r\n                Load(\r\n                    pointer: 102,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 104,\r\n                    index: 105,\r\n                ),\r\n                AccessIndex(\r\n                    base: 106,\r\n                    index: 2,\r\n                ),\r\n                Access(\r\n                    base: 107,\r\n                    index: 23,\r\n                ),\r\n                Load(\r\n                    pointer: 108,\r\n                ),\r\n                AccessIndex(\r\n                    base: 6,\r\n                    index: 0,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Access(\r\n                    base: 110,\r\n                    index: 111,\r\n                ),\r\n                AccessIndex(\r\n                    base: 112,\r\n                    index: 2,\r\n                ),\r\n                Access(\r\n                    base: 113,\r\n                    index: 30,\r\n                ),\r\n                Load(\r\n                    pointer: 114,\r\n                ),\r\n                Compose(\r\n                    ty: 2,\r\n                    components: [\r\n                        103,\r\n                        109,\r\n                        115,\r\n                    ],\r\n                ),\r\n                Binary(\r\n                    op: Multiply,\r\n                    left: 116,\r\n                    right: 97,\r\n                ),\r\n                Binary(\r\n                    op: Add,\r\n                    left: 55,\r\n                    right: 117,\r\n                ),\r\n                Load(\r\n                    pointer: 48,\r\n                ),\r\n                Binary(\r\n                    op: Add,\r\n                    left: 119,\r\n                    right: 31,\r\n                ),\r\n                Load(\r\n                    pointer: 47,\r\n                ),\r\n                Compose(\r\n                    ty: 4,\r\n                    components: [\r\n                        121,\r\n                        34,\r\n                    ],\r\n                ),\r\n            ],\r\n            named_expressions: {},\r\n            body: [\r\n                Loop(\r\n                    body: [\r\n                        Emit((\r\n                            start: 48,\r\n                            end: 54,\r\n                        )),\r\n                        If(\r\n                            condition: 54,\r\n                            accept: [\r\n                                Break,\r\n                            ],\r\n                            reject: [],\r\n                        ),\r\n                        Emit((\r\n                            start: 54,\r\n                            end: 63,\r\n                        )),\r\n                        Call(\r\n                            function: 1,\r\n                            arguments: [\r\n                                56,\r\n                                63,\r\n                            ],\r\n                            result: Some(64),\r\n                        ),\r\n                        Emit((\r\n                            start: 64,\r\n                            end: 118,\r\n                        )),\r\n                        Store(\r\n                            pointer: 47,\r\n                            value: 118,\r\n                        ),\r\n                        Continue,\r\n                    ],\r\n                    continuing: [\r\n                        Emit((\r\n                            start: 118,\r\n                            end: 120,\r\n                        )),\r\n                        Store(\r\n                            pointer: 48,\r\n                            value: 120,\r\n                        ),\r\n                    ],\r\n                    break_if: None,\r\n                ),\r\n                Emit((\r\n                    start: 120,\r\n                    end: 122,\r\n                )),\r\n                Store(\r\n                    pointer: 7,\r\n                    value: 122,\r\n                ),\r\n                Return(\r\n                    value: None,\r\n                ),\r\n            ],\r\n        ),\r\n    ],\r\n    entry_points: [\r\n        (\r\n            name: \"fs_main\",\r\n            stage: Fragment,\r\n            early_depth_test: None,\r\n            workgroup_size: (0, 0, 0),\r\n            function: (\r\n                name: Some(\"fs_main_wrap\"),\r\n                arguments: [\r\n                    (\r\n                        name: Some(\"in_normal_fs\"),\r\n                        ty: 2,\r\n                        binding: Some(Location(\r\n                            location: 0,\r\n                            interpolation: Some(Perspective),\r\n                            sampling: Some(Center),\r\n                        )),\r\n                    ),\r\n                    (\r\n                        name: Some(\"in_position_fs\"),\r\n                        ty: 4,\r\n                        binding: Some(Location(\r\n                            location: 1,\r\n                            interpolation: Some(Perspective),\r\n                            sampling: Some(Center),\r\n                        )),\r\n                    ),\r\n                ],\r\n                result: Some((\r\n                    ty: 4,\r\n                    binding: Some(Location(\r\n                        location: 0,\r\n                        interpolation: Some(Perspective),\r\n                        sampling: Some(Center),\r\n                    )),\r\n                )),\r\n                local_variables: [],\r\n                expressions: [\r\n                    FunctionArgument(0),\r\n                    GlobalVariable(6),\r\n                    FunctionArgument(1),\r\n                    GlobalVariable(5),\r\n                    GlobalVariable(7),\r\n                    Load(\r\n                        pointer: 5,\r\n                    ),\r\n                ],\r\n                named_expressions: {},\r\n                body: [\r\n                    Store(\r\n                        pointer: 2,\r\n                        value: 1,\r\n                    ),\r\n                    Store(\r\n                        pointer: 4,\r\n                        value: 3,\r\n                    ),\r\n                    Call(\r\n                        function: 2,\r\n                        arguments: [],\r\n                        result: None,\r\n                    ),\r\n                    Emit((\r\n                        start: 5,\r\n                        end: 6,\r\n                    )),\r\n                    Return(\r\n                        value: Some(6),\r\n                    ),\r\n                ],\r\n            ),\r\n        ),\r\n    ],\r\n)"
  },
  {
    "path": "lib/naga/tests/out/msl/access.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct _mslBufferSizes {\r\n    uint size1;\r\n};\r\n\r\nstruct GlobalConst {\r\n    uint a;\r\n    char _pad1[12];\r\n    metal::packed_uint3 b;\r\n    int c;\r\n};\r\nstruct AlignedWrapper {\r\n    int value;\r\n};\r\nstruct type_5 {\r\n    metal::float2x2 inner[2];\r\n};\r\nstruct type_8 {\r\n    metal::uint2 inner[2];\r\n};\r\ntypedef AlignedWrapper type_9[1];\r\nstruct Bar {\r\n    metal::float4x3 _matrix;\r\n    type_5 matrix_array;\r\n    metal::atomic_int atom;\r\n    char _pad3[4];\r\n    type_8 arr;\r\n    type_9 data;\r\n};\r\nstruct Baz {\r\n    metal::float3x2 m;\r\n};\r\nstruct type_13 {\r\n    metal::float4x2 inner[2];\r\n};\r\nstruct MatCx2InArray {\r\n    type_13 am;\r\n};\r\nstruct type_17 {\r\n    float inner[10];\r\n};\r\nstruct type_18 {\r\n    type_17 inner[5];\r\n};\r\nstruct type_21 {\r\n    int inner[5];\r\n};\r\nconstant metal::uint3 const_type_1_ = {0u, 0u, 0u};\r\nconstant GlobalConst const_GlobalConst = {0u, {}, const_type_1_, 0};\r\nconstant metal::float2 const_type_14_ = {0.0, 0.0};\r\nconstant metal::float4x2 const_type_12_ = {const_type_14_, const_type_14_, const_type_14_, const_type_14_};\r\nconstant type_13 const_type_13_ = {const_type_12_, const_type_12_};\r\nconstant type_17 const_type_17_ = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};\r\nconstant type_18 const_type_18_ = {const_type_17_, const_type_17_, const_type_17_, const_type_17_, const_type_17_};\r\nconstant metal::int2 const_type_11_ = {0, 0};\r\n\r\nvoid test_matrix_within_struct_accesses(\r\n    constant Baz& baz\r\n) {\r\n    int idx = 1;\r\n    Baz t = {};\r\n    int _e6 = idx;\r\n    idx = _e6 - 1;\r\n    metal::float3x2 unnamed = baz.m;\r\n    metal::float2 unnamed_1 = baz.m[0];\r\n    int _e16 = idx;\r\n    metal::float2 unnamed_2 = baz.m[_e16];\r\n    float unnamed_3 = baz.m[0].y;\r\n    int _e28 = idx;\r\n    float unnamed_4 = baz.m[0][_e28];\r\n    int _e32 = idx;\r\n    float unnamed_5 = baz.m[_e32].y;\r\n    int _e38 = idx;\r\n    int _e40 = idx;\r\n    float unnamed_6 = baz.m[_e38][_e40];\r\n    t = Baz {metal::float3x2(metal::float2(1.0), metal::float2(2.0), metal::float2(3.0))};\r\n    int _e52 = idx;\r\n    idx = _e52 + 1;\r\n    t.m = metal::float3x2(metal::float2(6.0), metal::float2(5.0), metal::float2(4.0));\r\n    t.m[0] = metal::float2(9.0);\r\n    int _e69 = idx;\r\n    t.m[_e69] = metal::float2(90.0);\r\n    t.m[0].y = 10.0;\r\n    int _e82 = idx;\r\n    t.m[0][_e82] = 20.0;\r\n    int _e86 = idx;\r\n    t.m[_e86].y = 30.0;\r\n    int _e92 = idx;\r\n    int _e94 = idx;\r\n    t.m[_e92][_e94] = 40.0;\r\n    return;\r\n}\r\n\r\nvoid test_matrix_within_array_within_struct_accesses(\r\n    constant MatCx2InArray& nested_mat_cx2_\r\n) {\r\n    int idx_1 = 1;\r\n    MatCx2InArray t_1 = {};\r\n    int _e7 = idx_1;\r\n    idx_1 = _e7 - 1;\r\n    type_13 unnamed_7 = nested_mat_cx2_.am;\r\n    metal::float4x2 unnamed_8 = nested_mat_cx2_.am.inner[0];\r\n    metal::float2 unnamed_9 = nested_mat_cx2_.am.inner[0][0];\r\n    int _e25 = idx_1;\r\n    metal::float2 unnamed_10 = nested_mat_cx2_.am.inner[0][_e25];\r\n    float unnamed_11 = nested_mat_cx2_.am.inner[0][0].y;\r\n    int _e41 = idx_1;\r\n    float unnamed_12 = nested_mat_cx2_.am.inner[0][0][_e41];\r\n    int _e47 = idx_1;\r\n    float unnamed_13 = nested_mat_cx2_.am.inner[0][_e47].y;\r\n    int _e55 = idx_1;\r\n    int _e57 = idx_1;\r\n    float unnamed_14 = nested_mat_cx2_.am.inner[0][_e55][_e57];\r\n    t_1 = MatCx2InArray {const_type_13_};\r\n    int _e63 = idx_1;\r\n    idx_1 = _e63 + 1;\r\n    for(int _i=0; _i<2; ++_i) t_1.am.inner[_i] = const_type_13_.inner[_i];\r\n    t_1.am.inner[0] = metal::float4x2(metal::float2(8.0), metal::float2(7.0), metal::float2(6.0), metal::float2(5.0));\r\n    t_1.am.inner[0][0] = metal::float2(9.0);\r\n    int _e90 = idx_1;\r\n    t_1.am.inner[0][_e90] = metal::float2(90.0);\r\n    t_1.am.inner[0][0].y = 10.0;\r\n    int _e107 = idx_1;\r\n    t_1.am.inner[0][0][_e107] = 20.0;\r\n    int _e113 = idx_1;\r\n    t_1.am.inner[0][_e113].y = 30.0;\r\n    int _e121 = idx_1;\r\n    int _e123 = idx_1;\r\n    t_1.am.inner[0][_e121][_e123] = 40.0;\r\n    return;\r\n}\r\n\r\nfloat read_from_private(\r\n    thread float& foo_1\r\n) {\r\n    float _e6 = foo_1;\r\n    return _e6;\r\n}\r\n\r\nfloat test_arr_as_arg(\r\n    type_18 a\r\n) {\r\n    return a.inner[4].inner[9];\r\n}\r\n\r\nvoid assign_through_ptr_fn(\r\n    threadgroup uint& p\r\n) {\r\n    p = 42u;\r\n    return;\r\n}\r\n\r\nstruct foo_vertInput {\r\n};\r\nstruct foo_vertOutput {\r\n    metal::float4 member [[position]];\r\n};\r\nvertex foo_vertOutput foo_vert(\r\n  uint vi [[vertex_id]]\r\n, device Bar const& bar [[buffer(0)]]\r\n, constant Baz& baz [[buffer(1)]]\r\n, device metal::int2 const& qux [[buffer(2)]]\r\n, constant MatCx2InArray& nested_mat_cx2_ [[buffer(3)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[buffer(24)]]\r\n) {\r\n    float foo = 0.0;\r\n    type_21 c = {};\r\n    float baz_1 = foo;\r\n    foo = 1.0;\r\n    test_matrix_within_struct_accesses(baz);\r\n    test_matrix_within_array_within_struct_accesses(nested_mat_cx2_);\r\n    metal::float4x3 _matrix = bar._matrix;\r\n    type_8 arr = bar.arr;\r\n    float b = bar._matrix[3].x;\r\n    int a_1 = bar.data[(1 + (_buffer_sizes.size1 - 120 - 8) / 8) - 2u].value;\r\n    metal::int2 c_1 = qux;\r\n    float _e32 = read_from_private(foo);\r\n    for(int _i=0; _i<5; ++_i) c.inner[_i] = type_21 {a_1, static_cast<int>(b), 3, 4, 5}.inner[_i];\r\n    c.inner[vi + 1u] = 42;\r\n    int value = c.inner[vi];\r\n    float _e46 = test_arr_as_arg(const_type_18_);\r\n    return foo_vertOutput { metal::float4(_matrix * static_cast<metal::float4>(metal::int4(value)), 2.0) };\r\n}\r\n\r\n\r\nstruct foo_fragOutput {\r\n    metal::float4 member_1 [[color(0)]];\r\n};\r\nfragment foo_fragOutput foo_frag(\r\n  device Bar& bar [[buffer(0)]]\r\n, device metal::int2& qux [[buffer(2)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[buffer(24)]]\r\n) {\r\n    bar._matrix[1].z = 1.0;\r\n    bar._matrix = metal::float4x3(metal::float3(0.0), metal::float3(1.0), metal::float3(2.0), metal::float3(3.0));\r\n    for(int _i=0; _i<2; ++_i) bar.arr.inner[_i] = type_8 {metal::uint2(0u), metal::uint2(1u)}.inner[_i];\r\n    bar.data[1].value = 1;\r\n    qux = const_type_11_;\r\n    return foo_fragOutput { metal::float4(0.0) };\r\n}\r\n\r\n\r\nkernel void atomics(\r\n  device Bar& bar [[buffer(0)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[buffer(24)]]\r\n) {\r\n    int tmp = {};\r\n    int value_1 = metal::atomic_load_explicit(&bar.atom, metal::memory_order_relaxed);\r\n    int _e10 = metal::atomic_fetch_add_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e10;\r\n    int _e13 = metal::atomic_fetch_sub_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e13;\r\n    int _e16 = metal::atomic_fetch_and_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e16;\r\n    int _e19 = metal::atomic_fetch_or_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e19;\r\n    int _e22 = metal::atomic_fetch_xor_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e22;\r\n    int _e25 = metal::atomic_fetch_min_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e25;\r\n    int _e28 = metal::atomic_fetch_max_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e28;\r\n    int _e31 = metal::atomic_exchange_explicit(&bar.atom, 5, metal::memory_order_relaxed);\r\n    tmp = _e31;\r\n    metal::atomic_store_explicit(&bar.atom, value_1, metal::memory_order_relaxed);\r\n    return;\r\n}\r\n\r\n\r\nkernel void assign_through_ptr(\r\n  threadgroup uint& val\r\n) {\r\n    assign_through_ptr_fn(val);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/binding-arrays.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct DefaultConstructible {\r\n    template<typename T>\r\n    operator T() && {\r\n        return T {};\r\n    }\r\n};\r\nstruct UniformIndex {\r\n    uint index;\r\n};\r\nstruct FragmentIn {\r\n    uint index;\r\n};\r\n\r\nstruct main_Input {\r\n    uint index [[user(loc0), flat]];\r\n};\r\nstruct main_Output {\r\n    metal::float4 member [[color(0)]];\r\n};\r\nfragment main_Output main_(\r\n  main_Input varyings [[stage_in]]\r\n, metal::array<metal::texture2d<float, metal::access::sample>, 10> texture_array_unbounded [[texture(0)]]\r\n, metal::array<metal::texture2d<float, metal::access::sample>, 5> texture_array_bounded [[user(fake0)]]\r\n, metal::array<metal::texture2d_array<float, metal::access::sample>, 5> texture_array_2darray [[user(fake0)]]\r\n, metal::array<metal::texture2d_ms<float, metal::access::read>, 5> texture_array_multisampled [[user(fake0)]]\r\n, metal::array<metal::depth2d<float, metal::access::sample>, 5> texture_array_depth [[user(fake0)]]\r\n, metal::array<metal::texture2d<float, metal::access::write>, 5> texture_array_storage [[user(fake0)]]\r\n, metal::array<metal::sampler, 5> samp [[user(fake0)]]\r\n, metal::array<metal::sampler, 5> samp_comp [[user(fake0)]]\r\n, constant UniformIndex& uni [[user(fake0)]]\r\n) {\r\n    const FragmentIn fragment_in = { varyings.index };\r\n    int i1_ = 0;\r\n    metal::int2 i2_ = {};\r\n    float v1_ = 0.0;\r\n    metal::float4 v4_ = {};\r\n    uint uniform_index = uni.index;\r\n    uint non_uniform_index = fragment_in.index;\r\n    i2_ = metal::int2(0);\r\n    v4_ = metal::float4(0.0);\r\n    metal::float2 uv = metal::float2(0.0);\r\n    metal::int2 pix = metal::int2(0);\r\n    metal::int2 _e27 = i2_;\r\n    i2_ = _e27 + metal::int2(texture_array_unbounded[0].get_width(), texture_array_unbounded[0].get_height());\r\n    metal::int2 _e32 = i2_;\r\n    i2_ = _e32 + metal::int2(texture_array_unbounded[uniform_index].get_width(), texture_array_unbounded[uniform_index].get_height());\r\n    metal::int2 _e36 = i2_;\r\n    i2_ = _e36 + metal::int2(texture_array_unbounded[non_uniform_index].get_width(), texture_array_unbounded[non_uniform_index].get_height());\r\n    metal::float4 _e40 = v4_;\r\n    metal::float4 _e45 = texture_array_bounded[0].gather(samp[0], uv);\r\n    v4_ = _e40 + _e45;\r\n    metal::float4 _e47 = v4_;\r\n    metal::float4 _e50 = texture_array_bounded[uniform_index].gather(samp[uniform_index], uv);\r\n    v4_ = _e47 + _e50;\r\n    metal::float4 _e52 = v4_;\r\n    metal::float4 _e55 = texture_array_bounded[non_uniform_index].gather(samp[non_uniform_index], uv);\r\n    v4_ = _e52 + _e55;\r\n    metal::float4 _e57 = v4_;\r\n    metal::float4 _e63 = texture_array_depth[0].gather_compare(samp_comp[0], uv, 0.0);\r\n    v4_ = _e57 + _e63;\r\n    metal::float4 _e65 = v4_;\r\n    metal::float4 _e69 = texture_array_depth[uniform_index].gather_compare(samp_comp[uniform_index], uv, 0.0);\r\n    v4_ = _e65 + _e69;\r\n    metal::float4 _e71 = v4_;\r\n    metal::float4 _e75 = texture_array_depth[non_uniform_index].gather_compare(samp_comp[non_uniform_index], uv, 0.0);\r\n    v4_ = _e71 + _e75;\r\n    metal::float4 _e77 = v4_;\r\n    metal::float4 _e81 = (uint(0) < texture_array_unbounded[0].get_num_mip_levels() && metal::all(metal::uint2(pix) < metal::uint2(texture_array_unbounded[0].get_width(0), texture_array_unbounded[0].get_height(0))) ? texture_array_unbounded[0].read(metal::uint2(pix), 0): DefaultConstructible());\r\n    v4_ = _e77 + _e81;\r\n    metal::float4 _e83 = v4_;\r\n    metal::float4 _e86 = (uint(0) < texture_array_unbounded[uniform_index].get_num_mip_levels() && metal::all(metal::uint2(pix) < metal::uint2(texture_array_unbounded[uniform_index].get_width(0), texture_array_unbounded[uniform_index].get_height(0))) ? texture_array_unbounded[uniform_index].read(metal::uint2(pix), 0): DefaultConstructible());\r\n    v4_ = _e83 + _e86;\r\n    metal::float4 _e88 = v4_;\r\n    metal::float4 _e91 = (uint(0) < texture_array_unbounded[non_uniform_index].get_num_mip_levels() && metal::all(metal::uint2(pix) < metal::uint2(texture_array_unbounded[non_uniform_index].get_width(0), texture_array_unbounded[non_uniform_index].get_height(0))) ? texture_array_unbounded[non_uniform_index].read(metal::uint2(pix), 0): DefaultConstructible());\r\n    v4_ = _e88 + _e91;\r\n    int _e93 = i1_;\r\n    i1_ = _e93 + int(texture_array_2darray[0].get_array_size());\r\n    int _e98 = i1_;\r\n    i1_ = _e98 + int(texture_array_2darray[uniform_index].get_array_size());\r\n    int _e102 = i1_;\r\n    i1_ = _e102 + int(texture_array_2darray[non_uniform_index].get_array_size());\r\n    int _e106 = i1_;\r\n    i1_ = _e106 + int(texture_array_bounded[0].get_num_mip_levels());\r\n    int _e111 = i1_;\r\n    i1_ = _e111 + int(texture_array_bounded[uniform_index].get_num_mip_levels());\r\n    int _e115 = i1_;\r\n    i1_ = _e115 + int(texture_array_bounded[non_uniform_index].get_num_mip_levels());\r\n    int _e119 = i1_;\r\n    i1_ = _e119 + int(texture_array_multisampled[0].get_num_samples());\r\n    int _e124 = i1_;\r\n    i1_ = _e124 + int(texture_array_multisampled[uniform_index].get_num_samples());\r\n    int _e128 = i1_;\r\n    i1_ = _e128 + int(texture_array_multisampled[non_uniform_index].get_num_samples());\r\n    metal::float4 _e132 = v4_;\r\n    metal::float4 _e137 = texture_array_bounded[0].sample(samp[0], uv);\r\n    v4_ = _e132 + _e137;\r\n    metal::float4 _e139 = v4_;\r\n    metal::float4 _e142 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv);\r\n    v4_ = _e139 + _e142;\r\n    metal::float4 _e144 = v4_;\r\n    metal::float4 _e147 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv);\r\n    v4_ = _e144 + _e147;\r\n    metal::float4 _e149 = v4_;\r\n    metal::float4 _e155 = texture_array_bounded[0].sample(samp[0], uv, metal::bias(0.0));\r\n    v4_ = _e149 + _e155;\r\n    metal::float4 _e157 = v4_;\r\n    metal::float4 _e161 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv, metal::bias(0.0));\r\n    v4_ = _e157 + _e161;\r\n    metal::float4 _e163 = v4_;\r\n    metal::float4 _e167 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv, metal::bias(0.0));\r\n    v4_ = _e163 + _e167;\r\n    float _e169 = v1_;\r\n    float _e175 = texture_array_depth[0].sample_compare(samp_comp[0], uv, 0.0);\r\n    v1_ = _e169 + _e175;\r\n    float _e177 = v1_;\r\n    float _e181 = texture_array_depth[uniform_index].sample_compare(samp_comp[uniform_index], uv, 0.0);\r\n    v1_ = _e177 + _e181;\r\n    float _e183 = v1_;\r\n    float _e187 = texture_array_depth[non_uniform_index].sample_compare(samp_comp[non_uniform_index], uv, 0.0);\r\n    v1_ = _e183 + _e187;\r\n    float _e189 = v1_;\r\n    float _e195 = texture_array_depth[0].sample_compare(samp_comp[0], uv, 0.0);\r\n    v1_ = _e189 + _e195;\r\n    float _e197 = v1_;\r\n    float _e201 = texture_array_depth[uniform_index].sample_compare(samp_comp[uniform_index], uv, 0.0);\r\n    v1_ = _e197 + _e201;\r\n    float _e203 = v1_;\r\n    float _e207 = texture_array_depth[non_uniform_index].sample_compare(samp_comp[non_uniform_index], uv, 0.0);\r\n    v1_ = _e203 + _e207;\r\n    metal::float4 _e209 = v4_;\r\n    metal::float4 _e214 = texture_array_bounded[0].sample(samp[0], uv, metal::gradient2d(uv, uv));\r\n    v4_ = _e209 + _e214;\r\n    metal::float4 _e216 = v4_;\r\n    metal::float4 _e219 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv, metal::gradient2d(uv, uv));\r\n    v4_ = _e216 + _e219;\r\n    metal::float4 _e221 = v4_;\r\n    metal::float4 _e224 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv, metal::gradient2d(uv, uv));\r\n    v4_ = _e221 + _e224;\r\n    metal::float4 _e226 = v4_;\r\n    metal::float4 _e232 = texture_array_bounded[0].sample(samp[0], uv, metal::level(0.0));\r\n    v4_ = _e226 + _e232;\r\n    metal::float4 _e234 = v4_;\r\n    metal::float4 _e238 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv, metal::level(0.0));\r\n    v4_ = _e234 + _e238;\r\n    metal::float4 _e240 = v4_;\r\n    metal::float4 _e244 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv, metal::level(0.0));\r\n    v4_ = _e240 + _e244;\r\n    metal::float4 _e248 = v4_;\r\n    if (metal::all(metal::uint2(pix) < metal::uint2(texture_array_storage[0].get_width(), texture_array_storage[0].get_height()))) {\r\n        texture_array_storage[0].write(_e248, metal::uint2(pix));\r\n    }\r\n    metal::float4 _e250 = v4_;\r\n    if (metal::all(metal::uint2(pix) < metal::uint2(texture_array_storage[uniform_index].get_width(), texture_array_storage[uniform_index].get_height()))) {\r\n        texture_array_storage[uniform_index].write(_e250, metal::uint2(pix));\r\n    }\r\n    metal::float4 _e252 = v4_;\r\n    if (metal::all(metal::uint2(pix) < metal::uint2(texture_array_storage[non_uniform_index].get_width(), texture_array_storage[non_uniform_index].get_height()))) {\r\n        texture_array_storage[non_uniform_index].write(_e252, metal::uint2(pix));\r\n    }\r\n    metal::int2 _e253 = i2_;\r\n    int _e254 = i1_;\r\n    metal::float2 v2_ = static_cast<metal::float2>(_e253 + metal::int2(_e254));\r\n    metal::float4 _e258 = v4_;\r\n    float _e265 = v1_;\r\n    return main_Output { (_e258 + metal::float4(v2_.x, v2_.y, v2_.x, v2_.y)) + metal::float4(_e265) };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bitcast.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nkernel void main_(\r\n) {\r\n    metal::int2 i2_ = {};\r\n    metal::int3 i3_ = {};\r\n    metal::int4 i4_ = {};\r\n    metal::uint2 u2_ = {};\r\n    metal::uint3 u3_ = {};\r\n    metal::uint4 u4_ = {};\r\n    metal::float2 f2_ = {};\r\n    metal::float3 f3_ = {};\r\n    metal::float4 f4_ = {};\r\n    i2_ = metal::int2(0);\r\n    i3_ = metal::int3(0);\r\n    i4_ = metal::int4(0);\r\n    u2_ = metal::uint2(0u);\r\n    u3_ = metal::uint3(0u);\r\n    u4_ = metal::uint4(0u);\r\n    f2_ = metal::float2(0.0);\r\n    f3_ = metal::float3(0.0);\r\n    f4_ = metal::float4(0.0);\r\n    metal::int2 _e27 = i2_;\r\n    u2_ = as_type<metal::uint2>(_e27);\r\n    metal::int3 _e29 = i3_;\r\n    u3_ = as_type<metal::uint3>(_e29);\r\n    metal::int4 _e31 = i4_;\r\n    u4_ = as_type<metal::uint4>(_e31);\r\n    metal::uint2 _e33 = u2_;\r\n    i2_ = as_type<metal::int2>(_e33);\r\n    metal::uint3 _e35 = u3_;\r\n    i3_ = as_type<metal::int3>(_e35);\r\n    metal::uint4 _e37 = u4_;\r\n    i4_ = as_type<metal::int4>(_e37);\r\n    metal::int2 _e39 = i2_;\r\n    f2_ = as_type<metal::float2>(_e39);\r\n    metal::int3 _e41 = i3_;\r\n    f3_ = as_type<metal::float3>(_e41);\r\n    metal::int4 _e43 = i4_;\r\n    f4_ = as_type<metal::float4>(_e43);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bits.msl",
    "content": "// language: metal1.2\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nkernel void main_(\r\n) {\r\n    int i = 0;\r\n    metal::int2 i2_ = {};\r\n    metal::int3 i3_ = {};\r\n    metal::int4 i4_ = {};\r\n    uint u = 0u;\r\n    metal::uint2 u2_ = {};\r\n    metal::uint3 u3_ = {};\r\n    metal::uint4 u4_ = {};\r\n    metal::float2 f2_ = {};\r\n    metal::float4 f4_ = {};\r\n    i2_ = metal::int2(0);\r\n    i3_ = metal::int3(0);\r\n    i4_ = metal::int4(0);\r\n    u2_ = metal::uint2(0u);\r\n    u3_ = metal::uint3(0u);\r\n    u4_ = metal::uint4(0u);\r\n    f2_ = metal::float2(0.0);\r\n    f4_ = metal::float4(0.0);\r\n    metal::float4 _e28 = f4_;\r\n    u = metal::pack_float_to_snorm4x8(_e28);\r\n    metal::float4 _e30 = f4_;\r\n    u = metal::pack_float_to_unorm4x8(_e30);\r\n    metal::float2 _e32 = f2_;\r\n    u = metal::pack_float_to_snorm2x16(_e32);\r\n    metal::float2 _e34 = f2_;\r\n    u = metal::pack_float_to_unorm2x16(_e34);\r\n    metal::float2 _e36 = f2_;\r\n    u = as_type<uint>(half2(_e36));\r\n    uint _e38 = u;\r\n    f4_ = metal::unpack_snorm4x8_to_float(_e38);\r\n    uint _e40 = u;\r\n    f4_ = metal::unpack_unorm4x8_to_float(_e40);\r\n    uint _e42 = u;\r\n    f2_ = metal::unpack_snorm2x16_to_float(_e42);\r\n    uint _e44 = u;\r\n    f2_ = metal::unpack_unorm2x16_to_float(_e44);\r\n    uint _e46 = u;\r\n    f2_ = float2(as_type<half2>(_e46));\r\n    int _e48 = i;\r\n    int _e49 = i;\r\n    i = metal::insert_bits(_e48, _e49, 5u, 10u);\r\n    metal::int2 _e53 = i2_;\r\n    metal::int2 _e54 = i2_;\r\n    i2_ = metal::insert_bits(_e53, _e54, 5u, 10u);\r\n    metal::int3 _e58 = i3_;\r\n    metal::int3 _e59 = i3_;\r\n    i3_ = metal::insert_bits(_e58, _e59, 5u, 10u);\r\n    metal::int4 _e63 = i4_;\r\n    metal::int4 _e64 = i4_;\r\n    i4_ = metal::insert_bits(_e63, _e64, 5u, 10u);\r\n    uint _e68 = u;\r\n    uint _e69 = u;\r\n    u = metal::insert_bits(_e68, _e69, 5u, 10u);\r\n    metal::uint2 _e73 = u2_;\r\n    metal::uint2 _e74 = u2_;\r\n    u2_ = metal::insert_bits(_e73, _e74, 5u, 10u);\r\n    metal::uint3 _e78 = u3_;\r\n    metal::uint3 _e79 = u3_;\r\n    u3_ = metal::insert_bits(_e78, _e79, 5u, 10u);\r\n    metal::uint4 _e83 = u4_;\r\n    metal::uint4 _e84 = u4_;\r\n    u4_ = metal::insert_bits(_e83, _e84, 5u, 10u);\r\n    int _e88 = i;\r\n    i = metal::extract_bits(_e88, 5u, 10u);\r\n    metal::int2 _e92 = i2_;\r\n    i2_ = metal::extract_bits(_e92, 5u, 10u);\r\n    metal::int3 _e96 = i3_;\r\n    i3_ = metal::extract_bits(_e96, 5u, 10u);\r\n    metal::int4 _e100 = i4_;\r\n    i4_ = metal::extract_bits(_e100, 5u, 10u);\r\n    uint _e104 = u;\r\n    u = metal::extract_bits(_e104, 5u, 10u);\r\n    metal::uint2 _e108 = u2_;\r\n    u2_ = metal::extract_bits(_e108, 5u, 10u);\r\n    metal::uint3 _e112 = u3_;\r\n    u3_ = metal::extract_bits(_e112, 5u, 10u);\r\n    metal::uint4 _e116 = u4_;\r\n    u4_ = metal::extract_bits(_e116, 5u, 10u);\r\n    int _e120 = i;\r\n    i = (((metal::ctz(_e120) + 1) % 33) - 1);\r\n    metal::uint2 _e122 = u2_;\r\n    u2_ = (((metal::ctz(_e122) + 1) % 33) - 1);\r\n    metal::int3 _e124 = i3_;\r\n    i3_ = (((metal::clz(_e124) + 1) % 33) - 1);\r\n    uint _e126 = u;\r\n    u = (((metal::clz(_e126) + 1) % 33) - 1);\r\n    int _e128 = i;\r\n    i = metal::popcount(_e128);\r\n    metal::int2 _e130 = i2_;\r\n    i2_ = metal::popcount(_e130);\r\n    metal::int3 _e132 = i3_;\r\n    i3_ = metal::popcount(_e132);\r\n    metal::int4 _e134 = i4_;\r\n    i4_ = metal::popcount(_e134);\r\n    uint _e136 = u;\r\n    u = metal::popcount(_e136);\r\n    metal::uint2 _e138 = u2_;\r\n    u2_ = metal::popcount(_e138);\r\n    metal::uint3 _e140 = u3_;\r\n    u3_ = metal::popcount(_e140);\r\n    metal::uint4 _e142 = u4_;\r\n    u4_ = metal::popcount(_e142);\r\n    int _e144 = i;\r\n    i = metal::reverse_bits(_e144);\r\n    metal::int2 _e146 = i2_;\r\n    i2_ = metal::reverse_bits(_e146);\r\n    metal::int3 _e148 = i3_;\r\n    i3_ = metal::reverse_bits(_e148);\r\n    metal::int4 _e150 = i4_;\r\n    i4_ = metal::reverse_bits(_e150);\r\n    uint _e152 = u;\r\n    u = metal::reverse_bits(_e152);\r\n    metal::uint2 _e154 = u2_;\r\n    u2_ = metal::reverse_bits(_e154);\r\n    metal::uint3 _e156 = u3_;\r\n    u3_ = metal::reverse_bits(_e156);\r\n    metal::uint4 _e158 = u4_;\r\n    u4_ = metal::reverse_bits(_e158);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/boids.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct _mslBufferSizes {\r\n    uint size1;\r\n    uint size2;\r\n};\r\n\r\nconstexpr constant unsigned NUM_PARTICLES = 1500u;\r\nstruct Particle {\r\n    metal::float2 pos;\r\n    metal::float2 vel;\r\n};\r\nstruct SimParams {\r\n    float deltaT;\r\n    float rule1Distance;\r\n    float rule2Distance;\r\n    float rule3Distance;\r\n    float rule1Scale;\r\n    float rule2Scale;\r\n    float rule3Scale;\r\n};\r\ntypedef Particle type_3[1];\r\nstruct Particles {\r\n    type_3 particles;\r\n};\r\n\r\nstruct main_Input {\r\n};\r\nkernel void main_(\r\n  metal::uint3 global_invocation_id [[thread_position_in_grid]]\r\n, constant SimParams& params [[buffer(0)]]\r\n, device Particles const& particlesSrc [[buffer(1)]]\r\n, device Particles& particlesDst [[buffer(2)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[buffer(3)]]\r\n) {\r\n    metal::float2 vPos = {};\r\n    metal::float2 vVel = {};\r\n    metal::float2 cMass = {};\r\n    metal::float2 cVel = {};\r\n    metal::float2 colVel = {};\r\n    int cMassCount = 0;\r\n    int cVelCount = 0;\r\n    metal::float2 pos = {};\r\n    metal::float2 vel = {};\r\n    uint i = 0u;\r\n    uint index = global_invocation_id.x;\r\n    if (index >= NUM_PARTICLES) {\r\n        return;\r\n    }\r\n    metal::float2 _e10 = particlesSrc.particles[index].pos;\r\n    vPos = _e10;\r\n    metal::float2 _e15 = particlesSrc.particles[index].vel;\r\n    vVel = _e15;\r\n    cMass = metal::float2(0.0, 0.0);\r\n    cVel = metal::float2(0.0, 0.0);\r\n    colVel = metal::float2(0.0, 0.0);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _e86 = i;\r\n            i = _e86 + 1u;\r\n        }\r\n        loop_init = false;\r\n        uint _e37 = i;\r\n        if (_e37 >= NUM_PARTICLES) {\r\n            break;\r\n        }\r\n        uint _e39 = i;\r\n        if (_e39 == index) {\r\n            continue;\r\n        }\r\n        uint _e42 = i;\r\n        metal::float2 _e45 = particlesSrc.particles[_e42].pos;\r\n        pos = _e45;\r\n        uint _e47 = i;\r\n        metal::float2 _e50 = particlesSrc.particles[_e47].vel;\r\n        vel = _e50;\r\n        metal::float2 _e51 = pos;\r\n        metal::float2 _e52 = vPos;\r\n        float _e55 = params.rule1Distance;\r\n        if (metal::distance(_e51, _e52) < _e55) {\r\n            metal::float2 _e57 = cMass;\r\n            metal::float2 _e58 = pos;\r\n            cMass = _e57 + _e58;\r\n            int _e60 = cMassCount;\r\n            cMassCount = _e60 + 1;\r\n        }\r\n        metal::float2 _e63 = pos;\r\n        metal::float2 _e64 = vPos;\r\n        float _e67 = params.rule2Distance;\r\n        if (metal::distance(_e63, _e64) < _e67) {\r\n            metal::float2 _e69 = colVel;\r\n            metal::float2 _e70 = pos;\r\n            metal::float2 _e71 = vPos;\r\n            colVel = _e69 - (_e70 - _e71);\r\n        }\r\n        metal::float2 _e74 = pos;\r\n        metal::float2 _e75 = vPos;\r\n        float _e78 = params.rule3Distance;\r\n        if (metal::distance(_e74, _e75) < _e78) {\r\n            metal::float2 _e80 = cVel;\r\n            metal::float2 _e81 = vel;\r\n            cVel = _e80 + _e81;\r\n            int _e83 = cVelCount;\r\n            cVelCount = _e83 + 1;\r\n        }\r\n    }\r\n    int _e89 = cMassCount;\r\n    if (_e89 > 0) {\r\n        metal::float2 _e92 = cMass;\r\n        int _e93 = cMassCount;\r\n        metal::float2 _e97 = vPos;\r\n        cMass = (_e92 / metal::float2(static_cast<float>(_e93))) - _e97;\r\n    }\r\n    int _e99 = cVelCount;\r\n    if (_e99 > 0) {\r\n        metal::float2 _e102 = cVel;\r\n        int _e103 = cVelCount;\r\n        cVel = _e102 / metal::float2(static_cast<float>(_e103));\r\n    }\r\n    metal::float2 _e107 = vVel;\r\n    metal::float2 _e108 = cMass;\r\n    float _e110 = params.rule1Scale;\r\n    metal::float2 _e113 = colVel;\r\n    float _e115 = params.rule2Scale;\r\n    metal::float2 _e118 = cVel;\r\n    float _e120 = params.rule3Scale;\r\n    vVel = ((_e107 + (_e108 * _e110)) + (_e113 * _e115)) + (_e118 * _e120);\r\n    metal::float2 _e123 = vVel;\r\n    metal::float2 _e125 = vVel;\r\n    vVel = metal::normalize(_e123) * metal::clamp(metal::length(_e125), 0.0, 0.10000000149011612);\r\n    metal::float2 _e131 = vPos;\r\n    metal::float2 _e132 = vVel;\r\n    float _e134 = params.deltaT;\r\n    vPos = _e131 + (_e132 * _e134);\r\n    float _e138 = vPos.x;\r\n    if (_e138 < -1.0) {\r\n        vPos.x = 1.0;\r\n    }\r\n    float _e144 = vPos.x;\r\n    if (_e144 > 1.0) {\r\n        vPos.x = -1.0;\r\n    }\r\n    float _e150 = vPos.y;\r\n    if (_e150 < -1.0) {\r\n        vPos.y = 1.0;\r\n    }\r\n    float _e156 = vPos.y;\r\n    if (_e156 > 1.0) {\r\n        vPos.y = -1.0;\r\n    }\r\n    metal::float2 _e164 = vPos;\r\n    particlesDst.particles[index].pos = _e164;\r\n    metal::float2 _e168 = vVel;\r\n    particlesDst.particles[index].vel = _e168;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bounds-check-image-restrict.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nconstant metal::int2 const_type_4_ = {0, 0};\r\nconstant metal::int3 const_type_7_ = {0, 0, 0};\r\nconstant metal::float4 const_type_2_ = {0.0, 0.0, 0.0, 0.0};\r\n\r\nmetal::float4 test_textureLoad_1d(\r\n    int coords,\r\n    int level,\r\n    metal::texture1d<float, metal::access::sample> image_1d\r\n) {\r\n    metal::float4 _e3 = image_1d.read(metal::min(uint(coords), image_1d.get_width() - 1));\r\n    return _e3;\r\n}\r\n\r\nmetal::float4 test_textureLoad_2d(\r\n    metal::int2 coords_1,\r\n    int level_1,\r\n    metal::texture2d<float, metal::access::sample> image_2d\r\n) {\r\n    uint clamped_lod_e4 = metal::min(uint(level_1), image_2d.get_num_mip_levels() - 1);\r\n    metal::float4 _e4 = image_2d.read(metal::min(metal::uint2(coords_1), metal::uint2(image_2d.get_width(clamped_lod_e4), image_2d.get_height(clamped_lod_e4)) - 1), clamped_lod_e4);\r\n    return _e4;\r\n}\r\n\r\nmetal::float4 test_textureLoad_2d_array(\r\n    metal::int2 coords_2,\r\n    int index,\r\n    int level_2,\r\n    metal::texture2d_array<float, metal::access::sample> image_2d_array\r\n) {\r\n    uint clamped_lod_e6 = metal::min(uint(level_2), image_2d_array.get_num_mip_levels() - 1);\r\n    metal::float4 _e6 = image_2d_array.read(metal::min(metal::uint2(coords_2), metal::uint2(image_2d_array.get_width(clamped_lod_e6), image_2d_array.get_height(clamped_lod_e6)) - 1), metal::min(uint(index), image_2d_array.get_array_size() - 1), clamped_lod_e6);\r\n    return _e6;\r\n}\r\n\r\nmetal::float4 test_textureLoad_3d(\r\n    metal::int3 coords_3,\r\n    int level_3,\r\n    metal::texture3d<float, metal::access::sample> image_3d\r\n) {\r\n    uint clamped_lod_e6 = metal::min(uint(level_3), image_3d.get_num_mip_levels() - 1);\r\n    metal::float4 _e6 = image_3d.read(metal::min(metal::uint3(coords_3), metal::uint3(image_3d.get_width(clamped_lod_e6), image_3d.get_height(clamped_lod_e6), image_3d.get_depth(clamped_lod_e6)) - 1), clamped_lod_e6);\r\n    return _e6;\r\n}\r\n\r\nmetal::float4 test_textureLoad_multisampled_2d(\r\n    metal::int2 coords_4,\r\n    int _sample,\r\n    metal::texture2d_ms<float, metal::access::read> image_multisampled_2d\r\n) {\r\n    metal::float4 _e7 = image_multisampled_2d.read(metal::min(metal::uint2(coords_4), metal::uint2(image_multisampled_2d.get_width(), image_multisampled_2d.get_height()) - 1), metal::min(uint(_sample), image_multisampled_2d.get_num_samples() - 1));\r\n    return _e7;\r\n}\r\n\r\nfloat test_textureLoad_depth_2d(\r\n    metal::int2 coords_5,\r\n    int level_4,\r\n    metal::depth2d<float, metal::access::sample> image_depth_2d\r\n) {\r\n    uint clamped_lod_e8 = metal::min(uint(level_4), image_depth_2d.get_num_mip_levels() - 1);\r\n    float _e8 = image_depth_2d.read(metal::min(metal::uint2(coords_5), metal::uint2(image_depth_2d.get_width(clamped_lod_e8), image_depth_2d.get_height(clamped_lod_e8)) - 1), clamped_lod_e8);\r\n    return _e8;\r\n}\r\n\r\nfloat test_textureLoad_depth_2d_array(\r\n    metal::int2 coords_6,\r\n    int index_1,\r\n    int level_5,\r\n    metal::depth2d_array<float, metal::access::sample> image_depth_2d_array\r\n) {\r\n    uint clamped_lod_e10 = metal::min(uint(level_5), image_depth_2d_array.get_num_mip_levels() - 1);\r\n    float _e10 = image_depth_2d_array.read(metal::min(metal::uint2(coords_6), metal::uint2(image_depth_2d_array.get_width(clamped_lod_e10), image_depth_2d_array.get_height(clamped_lod_e10)) - 1), metal::min(uint(index_1), image_depth_2d_array.get_array_size() - 1), clamped_lod_e10);\r\n    return _e10;\r\n}\r\n\r\nfloat test_textureLoad_depth_multisampled_2d(\r\n    metal::int2 coords_7,\r\n    int _sample_1,\r\n    metal::depth2d_ms<float, metal::access::read> image_depth_multisampled_2d\r\n) {\r\n    float _e10 = image_depth_multisampled_2d.read(metal::min(metal::uint2(coords_7), metal::uint2(image_depth_multisampled_2d.get_width(), image_depth_multisampled_2d.get_height()) - 1), metal::min(uint(_sample_1), image_depth_multisampled_2d.get_num_samples() - 1));\r\n    return _e10;\r\n}\r\n\r\nvoid test_textureStore_1d(\r\n    int coords_8,\r\n    metal::float4 value,\r\n    metal::texture1d<float, metal::access::write> image_storage_1d\r\n) {\r\n    image_storage_1d.write(value, metal::min(uint(coords_8), image_storage_1d.get_width() - 1));\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d(\r\n    metal::int2 coords_9,\r\n    metal::float4 value_1,\r\n    metal::texture2d<float, metal::access::write> image_storage_2d\r\n) {\r\n    image_storage_2d.write(value_1, metal::min(metal::uint2(coords_9), metal::uint2(image_storage_2d.get_width(), image_storage_2d.get_height()) - 1));\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d_array(\r\n    metal::int2 coords_10,\r\n    int array_index,\r\n    metal::float4 value_2,\r\n    metal::texture2d_array<float, metal::access::write> image_storage_2d_array\r\n) {\r\n    image_storage_2d_array.write(value_2, metal::min(metal::uint2(coords_10), metal::uint2(image_storage_2d_array.get_width(), image_storage_2d_array.get_height()) - 1), metal::min(uint(array_index), image_storage_2d_array.get_array_size() - 1));\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_3d(\r\n    metal::int3 coords_11,\r\n    metal::float4 value_3,\r\n    metal::texture3d<float, metal::access::write> image_storage_3d\r\n) {\r\n    image_storage_3d.write(value_3, metal::min(metal::uint3(coords_11), metal::uint3(image_storage_3d.get_width(), image_storage_3d.get_height(), image_storage_3d.get_depth()) - 1));\r\n    return;\r\n}\r\n\r\nstruct fragment_shaderOutput {\r\n    metal::float4 member [[color(0)]];\r\n};\r\nfragment fragment_shaderOutput fragment_shader(\r\n  metal::texture1d<float, metal::access::sample> image_1d [[user(fake0)]]\r\n, metal::texture2d<float, metal::access::sample> image_2d [[user(fake0)]]\r\n, metal::texture2d_array<float, metal::access::sample> image_2d_array [[user(fake0)]]\r\n, metal::texture3d<float, metal::access::sample> image_3d [[user(fake0)]]\r\n, metal::texture2d_ms<float, metal::access::read> image_multisampled_2d [[user(fake0)]]\r\n, metal::texture1d<float, metal::access::write> image_storage_1d [[user(fake0)]]\r\n, metal::texture2d<float, metal::access::write> image_storage_2d [[user(fake0)]]\r\n, metal::texture2d_array<float, metal::access::write> image_storage_2d_array [[user(fake0)]]\r\n, metal::texture3d<float, metal::access::write> image_storage_3d [[user(fake0)]]\r\n) {\r\n    metal::float4 _e14 = test_textureLoad_1d(0, 0, image_1d);\r\n    metal::float4 _e17 = test_textureLoad_2d(const_type_4_, 0, image_2d);\r\n    metal::float4 _e21 = test_textureLoad_2d_array(const_type_4_, 0, 0, image_2d_array);\r\n    metal::float4 _e24 = test_textureLoad_3d(const_type_7_, 0, image_3d);\r\n    metal::float4 _e27 = test_textureLoad_multisampled_2d(const_type_4_, 0, image_multisampled_2d);\r\n    test_textureStore_1d(0, const_type_2_, image_storage_1d);\r\n    test_textureStore_2d(const_type_4_, const_type_2_, image_storage_2d);\r\n    test_textureStore_2d_array(const_type_4_, 0, const_type_2_, image_storage_2d_array);\r\n    test_textureStore_3d(const_type_7_, const_type_2_, image_storage_3d);\r\n    return fragment_shaderOutput { metal::float4(0.0, 0.0, 0.0, 0.0) };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bounds-check-image-rzsw.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct DefaultConstructible {\r\n    template<typename T>\r\n    operator T() && {\r\n        return T {};\r\n    }\r\n};\r\nconstant metal::int2 const_type_4_ = {0, 0};\r\nconstant metal::int3 const_type_7_ = {0, 0, 0};\r\nconstant metal::float4 const_type_2_ = {0.0, 0.0, 0.0, 0.0};\r\n\r\nmetal::float4 test_textureLoad_1d(\r\n    int coords,\r\n    int level,\r\n    metal::texture1d<float, metal::access::sample> image_1d\r\n) {\r\n    metal::float4 _e3 = (uint(level) < image_1d.get_num_mip_levels() && uint(coords) < image_1d.get_width() ? image_1d.read(uint(coords)): DefaultConstructible());\r\n    return _e3;\r\n}\r\n\r\nmetal::float4 test_textureLoad_2d(\r\n    metal::int2 coords_1,\r\n    int level_1,\r\n    metal::texture2d<float, metal::access::sample> image_2d\r\n) {\r\n    metal::float4 _e4 = (uint(level_1) < image_2d.get_num_mip_levels() && metal::all(metal::uint2(coords_1) < metal::uint2(image_2d.get_width(level_1), image_2d.get_height(level_1))) ? image_2d.read(metal::uint2(coords_1), level_1): DefaultConstructible());\r\n    return _e4;\r\n}\r\n\r\nmetal::float4 test_textureLoad_2d_array(\r\n    metal::int2 coords_2,\r\n    int index,\r\n    int level_2,\r\n    metal::texture2d_array<float, metal::access::sample> image_2d_array\r\n) {\r\n    metal::float4 _e6 = (uint(level_2) < image_2d_array.get_num_mip_levels() && uint(index) < image_2d_array.get_array_size() && metal::all(metal::uint2(coords_2) < metal::uint2(image_2d_array.get_width(level_2), image_2d_array.get_height(level_2))) ? image_2d_array.read(metal::uint2(coords_2), index, level_2): DefaultConstructible());\r\n    return _e6;\r\n}\r\n\r\nmetal::float4 test_textureLoad_3d(\r\n    metal::int3 coords_3,\r\n    int level_3,\r\n    metal::texture3d<float, metal::access::sample> image_3d\r\n) {\r\n    metal::float4 _e6 = (uint(level_3) < image_3d.get_num_mip_levels() && metal::all(metal::uint3(coords_3) < metal::uint3(image_3d.get_width(level_3), image_3d.get_height(level_3), image_3d.get_depth(level_3))) ? image_3d.read(metal::uint3(coords_3), level_3): DefaultConstructible());\r\n    return _e6;\r\n}\r\n\r\nmetal::float4 test_textureLoad_multisampled_2d(\r\n    metal::int2 coords_4,\r\n    int _sample,\r\n    metal::texture2d_ms<float, metal::access::read> image_multisampled_2d\r\n) {\r\n    metal::float4 _e7 = (uint(_sample) < image_multisampled_2d.get_num_samples() && metal::all(metal::uint2(coords_4) < metal::uint2(image_multisampled_2d.get_width(), image_multisampled_2d.get_height())) ? image_multisampled_2d.read(metal::uint2(coords_4), _sample): DefaultConstructible());\r\n    return _e7;\r\n}\r\n\r\nfloat test_textureLoad_depth_2d(\r\n    metal::int2 coords_5,\r\n    int level_4,\r\n    metal::depth2d<float, metal::access::sample> image_depth_2d\r\n) {\r\n    float _e8 = (uint(level_4) < image_depth_2d.get_num_mip_levels() && metal::all(metal::uint2(coords_5) < metal::uint2(image_depth_2d.get_width(level_4), image_depth_2d.get_height(level_4))) ? image_depth_2d.read(metal::uint2(coords_5), level_4): DefaultConstructible());\r\n    return _e8;\r\n}\r\n\r\nfloat test_textureLoad_depth_2d_array(\r\n    metal::int2 coords_6,\r\n    int index_1,\r\n    int level_5,\r\n    metal::depth2d_array<float, metal::access::sample> image_depth_2d_array\r\n) {\r\n    float _e10 = (uint(level_5) < image_depth_2d_array.get_num_mip_levels() && uint(index_1) < image_depth_2d_array.get_array_size() && metal::all(metal::uint2(coords_6) < metal::uint2(image_depth_2d_array.get_width(level_5), image_depth_2d_array.get_height(level_5))) ? image_depth_2d_array.read(metal::uint2(coords_6), index_1, level_5): DefaultConstructible());\r\n    return _e10;\r\n}\r\n\r\nfloat test_textureLoad_depth_multisampled_2d(\r\n    metal::int2 coords_7,\r\n    int _sample_1,\r\n    metal::depth2d_ms<float, metal::access::read> image_depth_multisampled_2d\r\n) {\r\n    float _e10 = (uint(_sample_1) < image_depth_multisampled_2d.get_num_samples() && metal::all(metal::uint2(coords_7) < metal::uint2(image_depth_multisampled_2d.get_width(), image_depth_multisampled_2d.get_height())) ? image_depth_multisampled_2d.read(metal::uint2(coords_7), _sample_1): DefaultConstructible());\r\n    return _e10;\r\n}\r\n\r\nvoid test_textureStore_1d(\r\n    int coords_8,\r\n    metal::float4 value,\r\n    metal::texture1d<float, metal::access::write> image_storage_1d\r\n) {\r\n    if (uint(coords_8) < image_storage_1d.get_width()) {\r\n        image_storage_1d.write(value, uint(coords_8));\r\n    }\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d(\r\n    metal::int2 coords_9,\r\n    metal::float4 value_1,\r\n    metal::texture2d<float, metal::access::write> image_storage_2d\r\n) {\r\n    if (metal::all(metal::uint2(coords_9) < metal::uint2(image_storage_2d.get_width(), image_storage_2d.get_height()))) {\r\n        image_storage_2d.write(value_1, metal::uint2(coords_9));\r\n    }\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_2d_array(\r\n    metal::int2 coords_10,\r\n    int array_index,\r\n    metal::float4 value_2,\r\n    metal::texture2d_array<float, metal::access::write> image_storage_2d_array\r\n) {\r\n    if (uint(array_index) < image_storage_2d_array.get_array_size() && metal::all(metal::uint2(coords_10) < metal::uint2(image_storage_2d_array.get_width(), image_storage_2d_array.get_height()))) {\r\n        image_storage_2d_array.write(value_2, metal::uint2(coords_10), array_index);\r\n    }\r\n    return;\r\n}\r\n\r\nvoid test_textureStore_3d(\r\n    metal::int3 coords_11,\r\n    metal::float4 value_3,\r\n    metal::texture3d<float, metal::access::write> image_storage_3d\r\n) {\r\n    if (metal::all(metal::uint3(coords_11) < metal::uint3(image_storage_3d.get_width(), image_storage_3d.get_height(), image_storage_3d.get_depth()))) {\r\n        image_storage_3d.write(value_3, metal::uint3(coords_11));\r\n    }\r\n    return;\r\n}\r\n\r\nstruct fragment_shaderOutput {\r\n    metal::float4 member [[color(0)]];\r\n};\r\nfragment fragment_shaderOutput fragment_shader(\r\n  metal::texture1d<float, metal::access::sample> image_1d [[user(fake0)]]\r\n, metal::texture2d<float, metal::access::sample> image_2d [[user(fake0)]]\r\n, metal::texture2d_array<float, metal::access::sample> image_2d_array [[user(fake0)]]\r\n, metal::texture3d<float, metal::access::sample> image_3d [[user(fake0)]]\r\n, metal::texture2d_ms<float, metal::access::read> image_multisampled_2d [[user(fake0)]]\r\n, metal::texture1d<float, metal::access::write> image_storage_1d [[user(fake0)]]\r\n, metal::texture2d<float, metal::access::write> image_storage_2d [[user(fake0)]]\r\n, metal::texture2d_array<float, metal::access::write> image_storage_2d_array [[user(fake0)]]\r\n, metal::texture3d<float, metal::access::write> image_storage_3d [[user(fake0)]]\r\n) {\r\n    metal::float4 _e14 = test_textureLoad_1d(0, 0, image_1d);\r\n    metal::float4 _e17 = test_textureLoad_2d(const_type_4_, 0, image_2d);\r\n    metal::float4 _e21 = test_textureLoad_2d_array(const_type_4_, 0, 0, image_2d_array);\r\n    metal::float4 _e24 = test_textureLoad_3d(const_type_7_, 0, image_3d);\r\n    metal::float4 _e27 = test_textureLoad_multisampled_2d(const_type_4_, 0, image_multisampled_2d);\r\n    test_textureStore_1d(0, const_type_2_, image_storage_1d);\r\n    test_textureStore_2d(const_type_4_, const_type_2_, image_storage_2d);\r\n    test_textureStore_2d_array(const_type_4_, 0, const_type_2_, image_storage_2d_array);\r\n    test_textureStore_3d(const_type_7_, const_type_2_, image_storage_3d);\r\n    return fragment_shaderOutput { metal::float4(0.0, 0.0, 0.0, 0.0) };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bounds-check-restrict.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct _mslBufferSizes {\r\n    uint size0;\r\n};\r\n\r\nstruct type_1 {\r\n    float inner[10];\r\n};\r\ntypedef float type_4[1];\r\nstruct Globals {\r\n    type_1 a;\r\n    char _pad1[8];\r\n    metal::float4 v;\r\n    metal::float3x4 m;\r\n    type_4 d;\r\n};\r\n\r\nfloat index_array(\r\n    int i,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = globals.a.inner[metal::min(unsigned(i), 9u)];\r\n    return _e4;\r\n}\r\n\r\nfloat index_dynamic_array(\r\n    int i_1,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = globals.d[metal::min(unsigned(i_1), (_buffer_sizes.size0 - 112 - 4) / 4)];\r\n    return _e4;\r\n}\r\n\r\nfloat index_vector(\r\n    int i_2,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = globals.v[metal::min(unsigned(i_2), 3u)];\r\n    return _e4;\r\n}\r\n\r\nfloat index_vector_by_value(\r\n    metal::float4 v,\r\n    int i_3\r\n) {\r\n    return v[metal::min(unsigned(i_3), 3u)];\r\n}\r\n\r\nmetal::float4 index_matrix(\r\n    int i_4,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    metal::float4 _e4 = globals.m[metal::min(unsigned(i_4), 2u)];\r\n    return _e4;\r\n}\r\n\r\nfloat index_twice(\r\n    int i_5,\r\n    int j,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e6 = globals.m[metal::min(unsigned(i_5), 2u)][metal::min(unsigned(j), 3u)];\r\n    return _e6;\r\n}\r\n\r\nfloat index_expensive(\r\n    int i_6,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e11 = globals.a.inner[metal::min(unsigned(static_cast<int>(metal::sin(static_cast<float>(i_6) / 100.0) * 100.0)), 9u)];\r\n    return _e11;\r\n}\r\n\r\nfloat index_in_bounds(\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = globals.a.inner[9];\r\n    float _e8 = globals.v.w;\r\n    float _e15 = globals.m[2].w;\r\n    return (_e4 + _e8) + _e15;\r\n}\r\n\r\nvoid set_array(\r\n    int i_7,\r\n    float v_1,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.a.inner[metal::min(unsigned(i_7), 9u)] = v_1;\r\n    return;\r\n}\r\n\r\nvoid set_dynamic_array(\r\n    int i_8,\r\n    float v_2,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.d[metal::min(unsigned(i_8), (_buffer_sizes.size0 - 112 - 4) / 4)] = v_2;\r\n    return;\r\n}\r\n\r\nvoid set_vector(\r\n    int i_9,\r\n    float v_3,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.v[metal::min(unsigned(i_9), 3u)] = v_3;\r\n    return;\r\n}\r\n\r\nvoid set_matrix(\r\n    int i_10,\r\n    metal::float4 v_4,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.m[metal::min(unsigned(i_10), 2u)] = v_4;\r\n    return;\r\n}\r\n\r\nvoid set_index_twice(\r\n    int i_11,\r\n    int j_1,\r\n    float v_5,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.m[metal::min(unsigned(i_11), 2u)][metal::min(unsigned(j_1), 3u)] = v_5;\r\n    return;\r\n}\r\n\r\nvoid set_expensive(\r\n    int i_12,\r\n    float v_6,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.a.inner[metal::min(unsigned(static_cast<int>(metal::sin(static_cast<float>(i_12) / 100.0) * 100.0)), 9u)] = v_6;\r\n    return;\r\n}\r\n\r\nvoid set_in_bounds(\r\n    float v_7,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.a.inner[9] = v_7;\r\n    globals.v.w = v_7;\r\n    globals.m[2].w = v_7;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bounds-check-zero-atomic.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct DefaultConstructible {\r\n    template<typename T>\r\n    operator T() && {\r\n        return T {};\r\n    }\r\n};\r\nstruct _mslBufferSizes {\r\n    uint size0;\r\n};\r\n\r\nstruct type_1 {\r\n    metal::atomic_uint inner[10];\r\n};\r\ntypedef metal::atomic_uint type_2[1];\r\nstruct Globals {\r\n    metal::atomic_uint a;\r\n    type_1 b;\r\n    type_2 c;\r\n};\r\n\r\nuint fetch_add_atomic(\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    uint _e3 = metal::atomic_fetch_add_explicit(&globals.a, 1u, metal::memory_order_relaxed);\r\n    return _e3;\r\n}\r\n\r\nuint fetch_add_atomic_static_sized_array(\r\n    int i,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    uint _e5 = uint(i) < 10 ? metal::atomic_fetch_add_explicit(&globals.b.inner[i], 1u, metal::memory_order_relaxed) : DefaultConstructible();\r\n    return _e5;\r\n}\r\n\r\nuint fetch_add_atomic_dynamic_sized_array(\r\n    int i_1,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    uint _e5 = uint(i_1) < 1 + (_buffer_sizes.size0 - 44 - 4) / 4 ? metal::atomic_fetch_add_explicit(&globals.c[i_1], 1u, metal::memory_order_relaxed) : DefaultConstructible();\r\n    return _e5;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/bounds-check-zero.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct DefaultConstructible {\r\n    template<typename T>\r\n    operator T() && {\r\n        return T {};\r\n    }\r\n};\r\nstruct _mslBufferSizes {\r\n    uint size0;\r\n};\r\n\r\nstruct type_1 {\r\n    float inner[10];\r\n};\r\ntypedef float type_4[1];\r\nstruct Globals {\r\n    type_1 a;\r\n    char _pad1[8];\r\n    metal::float4 v;\r\n    metal::float3x4 m;\r\n    type_4 d;\r\n};\r\n\r\nfloat index_array(\r\n    int i,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = uint(i) < 10 ? globals.a.inner[i] : DefaultConstructible();\r\n    return _e4;\r\n}\r\n\r\nfloat index_dynamic_array(\r\n    int i_1,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = uint(i_1) < 1 + (_buffer_sizes.size0 - 112 - 4) / 4 ? globals.d[i_1] : DefaultConstructible();\r\n    return _e4;\r\n}\r\n\r\nfloat index_vector(\r\n    int i_2,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = uint(i_2) < 4 ? globals.v[i_2] : DefaultConstructible();\r\n    return _e4;\r\n}\r\n\r\nfloat index_vector_by_value(\r\n    metal::float4 v,\r\n    int i_3\r\n) {\r\n    return uint(i_3) < 4 ? v[i_3] : DefaultConstructible();\r\n}\r\n\r\nmetal::float4 index_matrix(\r\n    int i_4,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    metal::float4 _e4 = uint(i_4) < 3 ? globals.m[i_4] : DefaultConstructible();\r\n    return _e4;\r\n}\r\n\r\nfloat index_twice(\r\n    int i_5,\r\n    int j,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e6 = uint(j) < 4 && uint(i_5) < 3 ? globals.m[i_5][j] : DefaultConstructible();\r\n    return _e6;\r\n}\r\n\r\nfloat index_expensive(\r\n    int i_6,\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    int _e9 = static_cast<int>(metal::sin(static_cast<float>(i_6) / 100.0) * 100.0);\r\n    float _e11 = uint(_e9) < 10 ? globals.a.inner[_e9] : DefaultConstructible();\r\n    return _e11;\r\n}\r\n\r\nfloat index_in_bounds(\r\n    device Globals const& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    float _e4 = globals.a.inner[9];\r\n    float _e8 = globals.v.w;\r\n    float _e15 = globals.m[2].w;\r\n    return (_e4 + _e8) + _e15;\r\n}\r\n\r\nvoid set_array(\r\n    int i_7,\r\n    float v_1,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    if (uint(i_7) < 10) {\r\n        globals.a.inner[i_7] = v_1;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid set_dynamic_array(\r\n    int i_8,\r\n    float v_2,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    if (uint(i_8) < 1 + (_buffer_sizes.size0 - 112 - 4) / 4) {\r\n        globals.d[i_8] = v_2;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid set_vector(\r\n    int i_9,\r\n    float v_3,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    if (uint(i_9) < 4) {\r\n        globals.v[i_9] = v_3;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid set_matrix(\r\n    int i_10,\r\n    metal::float4 v_4,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    if (uint(i_10) < 3) {\r\n        globals.m[i_10] = v_4;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid set_index_twice(\r\n    int i_11,\r\n    int j_1,\r\n    float v_5,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    if (uint(j_1) < 4 && uint(i_11) < 3) {\r\n        globals.m[i_11][j_1] = v_5;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid set_expensive(\r\n    int i_12,\r\n    float v_6,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    int _e10 = static_cast<int>(metal::sin(static_cast<float>(i_12) / 100.0) * 100.0);\r\n    if (uint(_e10) < 10) {\r\n        globals.a.inner[_e10] = v_6;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid set_in_bounds(\r\n    float v_7,\r\n    device Globals& globals,\r\n    constant _mslBufferSizes& _buffer_sizes\r\n) {\r\n    globals.a.inner[9] = v_7;\r\n    globals.v.w = v_7;\r\n    globals.m[2].w = v_7;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/break-if.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nvoid breakIfEmpty(\r\n) {\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            if (true) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init = false;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid breakIfEmptyBody(\r\n    bool a\r\n) {\r\n    bool b = {};\r\n    bool c = {};\r\n    bool loop_init_1 = true;\r\n    while(true) {\r\n        if (!loop_init_1) {\r\n            b = a;\r\n            bool _e2 = b;\r\n            c = a != _e2;\r\n            bool _e5 = c;\r\n            bool unnamed = a == _e5;\r\n            if (a == c) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init_1 = false;\r\n    }\r\n    return;\r\n}\r\n\r\nvoid breakIf(\r\n    bool a_1\r\n) {\r\n    bool d = {};\r\n    bool e = {};\r\n    bool loop_init_2 = true;\r\n    while(true) {\r\n        if (!loop_init_2) {\r\n            bool _e5 = e;\r\n            bool unnamed_1 = a_1 == _e5;\r\n            if (a_1 == e) {\r\n                break;\r\n            }\r\n        }\r\n        loop_init_2 = false;\r\n        d = a_1;\r\n        bool _e2 = d;\r\n        e = a_1 != _e2;\r\n    }\r\n    return;\r\n}\r\n\r\nkernel void main_(\r\n) {\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/collatz.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct _mslBufferSizes {\r\n    uint size0;\r\n};\r\n\r\ntypedef uint type_1[1];\r\nstruct PrimeIndices {\r\n    type_1 data;\r\n};\r\n\r\nuint collatz_iterations(\r\n    uint n_base\r\n) {\r\n    uint n = {};\r\n    uint i = 0u;\r\n    n = n_base;\r\n    while(true) {\r\n        uint _e5 = n;\r\n        if (_e5 > 1u) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _e8 = n;\r\n        if ((_e8 % 2u) == 0u) {\r\n            uint _e13 = n;\r\n            n = _e13 / 2u;\r\n        } else {\r\n            uint _e17 = n;\r\n            n = (3u * _e17) + 1u;\r\n        }\r\n        uint _e21 = i;\r\n        i = _e21 + 1u;\r\n    }\r\n    uint _e24 = i;\r\n    return _e24;\r\n}\r\n\r\nstruct main_Input {\r\n};\r\nkernel void main_(\r\n  metal::uint3 global_id [[thread_position_in_grid]]\r\n, device PrimeIndices& v_indices [[user(fake0)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\r\n) {\r\n    uint _e8 = v_indices.data[global_id.x];\r\n    uint _e9 = collatz_iterations(_e8);\r\n    v_indices.data[global_id.x] = _e9;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/control-flow.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nvoid switch_default_break(\r\n    int i\r\n) {\r\n    switch(i) {\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\nvoid switch_case_break(\r\n) {\r\n    switch(0) {\r\n        case 0: {\r\n            break;\r\n        }\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nvoid loop_switch_continue(\r\n    int x\r\n) {\r\n    while(true) {\r\n        switch(x) {\r\n            case 1: {\r\n                continue;\r\n            }\r\n            default: {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nstruct main_Input {\r\n};\r\nkernel void main_(\r\n  metal::uint3 global_id [[thread_position_in_grid]]\r\n) {\r\n    int pos = {};\r\n    metal::threadgroup_barrier(metal::mem_flags::mem_device);\r\n    metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup);\r\n    switch(1) {\r\n        default: {\r\n            pos = 1;\r\n            break;\r\n        }\r\n    }\r\n    int _e4 = pos;\r\n    switch(_e4) {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n            break;\r\n        }\r\n        case 3: {\r\n            pos = 2;\r\n        }\r\n        case 4: {\r\n            pos = 3;\r\n        }\r\n        default: {\r\n            pos = 4;\r\n            break;\r\n        }\r\n    }\r\n    switch(0u) {\r\n        case 0u: {\r\n            break;\r\n        }\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n    int _e11 = pos;\r\n    switch(_e11) {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n            return;\r\n        }\r\n        case 3: {\r\n            pos = 2;\r\n        }\r\n        case 4: {\r\n            return;\r\n        }\r\n        default: {\r\n            pos = 3;\r\n            return;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/empty-global-name.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct type_1 {\r\n    int member;\r\n};\r\n\r\nvoid function(\r\n    device type_1& unnamed\r\n) {\r\n    int _e8 = unnamed.member;\r\n    unnamed.member = _e8 + 1;\r\n    return;\r\n}\r\n\r\nkernel void main_(\r\n  device type_1& unnamed [[user(fake0)]]\r\n) {\r\n    function(unnamed);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/empty.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nkernel void main_(\r\n) {\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/extra.msl",
    "content": "// language: metal2.2\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct PushConstants {\r\n    uint index;\r\n    char _pad1[12];\r\n    metal::float2 double_;\r\n};\r\nstruct FragmentIn {\r\n    metal::float4 color;\r\n    uint primitive_index;\r\n};\r\n\r\nstruct main_Input {\r\n    metal::float4 color [[user(loc0), center_perspective]];\r\n};\r\nstruct main_Output {\r\n    metal::float4 member [[color(0)]];\r\n};\r\nfragment main_Output main_(\r\n  main_Input varyings [[stage_in]]\r\n, uint primitive_index [[primitive_id]]\r\n, constant PushConstants& pc [[buffer(1)]]\r\n) {\r\n    const FragmentIn in = { varyings.color, primitive_index };\r\n    uint _e4 = pc.index;\r\n    if (in.primitive_index == _e4) {\r\n        return main_Output { in.color };\r\n    } else {\r\n        return main_Output { metal::float4(metal::float3(1.0) - in.color.xyz, in.color.w) };\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/functions.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nmetal::float2 test_fma(\r\n) {\r\n    metal::float2 a = metal::float2(2.0, 2.0);\r\n    metal::float2 b = metal::float2(0.5, 0.5);\r\n    metal::float2 c = metal::float2(0.5, 0.5);\r\n    return metal::fma(a, b, c);\r\n}\r\n\r\nint test_integer_dot_product(\r\n) {\r\n    metal::int2 a_2_ = metal::int2(1);\r\n    metal::int2 b_2_ = metal::int2(1);\r\n    int c_2_ = ( + a_2_.x * b_2_.x + a_2_.y * b_2_.y);\r\n    metal::uint3 a_3_ = metal::uint3(1u);\r\n    metal::uint3 b_3_ = metal::uint3(1u);\r\n    uint c_3_ = ( + a_3_.x * b_3_.x + a_3_.y * b_3_.y + a_3_.z * b_3_.z);\r\n    metal::int4 _e11 = metal::int4(4);\r\n    metal::int4 _e13 = metal::int4(2);\r\n    int c_4_ = ( + _e11.x * _e13.x + _e11.y * _e13.y + _e11.z * _e13.z + _e11.w * _e13.w);\r\n    return c_4_;\r\n}\r\n\r\nkernel void main_(\r\n) {\r\n    metal::float2 _e0 = test_fma();\r\n    int _e1 = test_integer_dot_product();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/globals.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct _mslBufferSizes {\r\n    uint size3;\r\n};\r\n\r\nconstexpr constant bool Foo_2 = true;\r\nstruct type_2 {\r\n    float inner[10u];\r\n};\r\nstruct Foo {\r\n    metal::packed_float3 v3_;\r\n    float v1_;\r\n};\r\ntypedef metal::float2 type_6[1];\r\nstruct type_8 {\r\n    metal::float4 inner[20];\r\n};\r\nstruct type_11 {\r\n    metal::float2x4 inner[2];\r\n};\r\nstruct type_12 {\r\n    type_11 inner[2];\r\n};\r\nstruct type_14 {\r\n    metal::float4x2 inner[2];\r\n};\r\nstruct type_15 {\r\n    type_14 inner[2];\r\n};\r\nconstant metal::float3 const_type_4_ = {0.0, 0.0, 0.0};\r\nconstant metal::float3x3 const_type_17_ = {const_type_4_, const_type_4_, const_type_4_};\r\n\r\nvoid test_msl_packed_vec3_as_arg(\r\n    metal::float3 arg\r\n) {\r\n    return;\r\n}\r\n\r\nvoid test_msl_packed_vec3_(\r\n    device Foo& alignment\r\n) {\r\n    int idx = 1;\r\n    alignment.v3_ = metal::float3(1.0);\r\n    alignment.v3_[0] = 1.0;\r\n    alignment.v3_[0] = 2.0;\r\n    int _e23 = idx;\r\n    alignment.v3_[_e23] = 3.0;\r\n    Foo data = alignment;\r\n    metal::float3 unnamed = data.v3_;\r\n    metal::float2 unnamed_1 = metal::float3(data.v3_).zx;\r\n    test_msl_packed_vec3_as_arg(data.v3_);\r\n    metal::float3 unnamed_2 = metal::float3(data.v3_) * const_type_17_;\r\n    metal::float3 unnamed_3 = const_type_17_ * metal::float3(data.v3_);\r\n    metal::float3 unnamed_4 = data.v3_ * 2.0;\r\n    metal::float3 unnamed_5 = 2.0 * data.v3_;\r\n}\r\n\r\nkernel void main_(\r\n  threadgroup type_2& wg\r\n, threadgroup metal::atomic_uint& at_1\r\n, device Foo& alignment [[user(fake0)]]\r\n, device type_6 const& dummy [[user(fake0)]]\r\n, constant type_8& float_vecs [[user(fake0)]]\r\n, constant metal::float3& global_vec [[user(fake0)]]\r\n, constant metal::float3x2& global_mat [[user(fake0)]]\r\n, constant type_12& global_nested_arrays_of_matrices_2x4_ [[user(fake0)]]\r\n, constant type_15& global_nested_arrays_of_matrices_4x2_ [[user(fake0)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\r\n) {\r\n    float Foo_1 = 1.0;\r\n    bool at = true;\r\n    test_msl_packed_vec3_(alignment);\r\n    metal::float4x2 _e16 = global_nested_arrays_of_matrices_4x2_.inner[0].inner[0];\r\n    metal::float4 _e23 = global_nested_arrays_of_matrices_2x4_.inner[0].inner[0][0];\r\n    wg.inner[7] = (_e16 * _e23).x;\r\n    metal::float3x2 _e28 = global_mat;\r\n    metal::float3 _e29 = global_vec;\r\n    wg.inner[6] = (_e28 * _e29).x;\r\n    float _e37 = dummy[1].y;\r\n    wg.inner[5] = _e37;\r\n    float _e43 = float_vecs.inner[0].w;\r\n    wg.inner[4] = _e43;\r\n    float _e47 = alignment.v1_;\r\n    wg.inner[3] = _e47;\r\n    float _e52 = alignment.v3_[0];\r\n    wg.inner[2] = _e52;\r\n    alignment.v1_ = 4.0;\r\n    wg.inner[1] = static_cast<float>(1 + (_buffer_sizes.size3 - 0 - 8) / 8);\r\n    metal::atomic_store_explicit(&at_1, 2u, metal::memory_order_relaxed);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/image.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nconstant metal::int2 const_type_9_ = {3, 1};\r\n\r\nstruct main_Input {\r\n};\r\nkernel void main_(\r\n  metal::uint3 local_id [[thread_position_in_threadgroup]]\r\n, metal::texture2d<uint, metal::access::sample> image_mipmapped_src [[user(fake0)]]\r\n, metal::texture2d_ms<uint, metal::access::read> image_multisampled_src [[user(fake0)]]\r\n, metal::texture2d<uint, metal::access::read> image_storage_src [[user(fake0)]]\r\n, metal::texture2d_array<uint, metal::access::sample> image_array_src [[user(fake0)]]\r\n, metal::texture1d<uint, metal::access::sample> image_1d_src [[user(fake0)]]\r\n, metal::texture1d<uint, metal::access::write> image_dst [[user(fake0)]]\r\n) {\r\n    metal::int2 dim = metal::int2(image_storage_src.get_width(), image_storage_src.get_height());\r\n    metal::int2 itc = (dim * static_cast<metal::int2>(local_id.xy)) % metal::int2(10, 20);\r\n    metal::uint4 value1_ = image_mipmapped_src.read(metal::uint2(itc), static_cast<int>(local_id.z));\r\n    metal::uint4 value2_ = image_multisampled_src.read(metal::uint2(itc), static_cast<int>(local_id.z));\r\n    metal::uint4 value4_ = image_storage_src.read(metal::uint2(itc));\r\n    metal::uint4 value5_ = image_array_src.read(metal::uint2(itc), static_cast<int>(local_id.z), static_cast<int>(local_id.z) + 1);\r\n    metal::uint4 value6_ = image_1d_src.read(uint(static_cast<int>(local_id.x)));\r\n    image_dst.write((((value1_ + value2_) + value4_) + value5_) + value6_, uint(itc.x));\r\n    return;\r\n}\r\n\r\n\r\nstruct depth_loadInput {\r\n};\r\nkernel void depth_load(\r\n  metal::uint3 local_id_1 [[thread_position_in_threadgroup]]\r\n, metal::depth2d_ms<float, metal::access::read> image_depth_multisampled_src [[user(fake0)]]\r\n, metal::texture2d<uint, metal::access::read> image_storage_src [[user(fake0)]]\r\n, metal::texture1d<uint, metal::access::write> image_dst [[user(fake0)]]\r\n) {\r\n    metal::int2 dim_1 = metal::int2(image_storage_src.get_width(), image_storage_src.get_height());\r\n    metal::int2 itc_1 = (dim_1 * static_cast<metal::int2>(local_id_1.xy)) % metal::int2(10, 20);\r\n    float val = image_depth_multisampled_src.read(metal::uint2(itc_1), static_cast<int>(local_id_1.z));\r\n    image_dst.write(metal::uint4(static_cast<uint>(val)), uint(itc_1.x));\r\n    return;\r\n}\r\n\r\n\r\nstruct queriesOutput {\r\n    metal::float4 member_2 [[position]];\r\n};\r\nvertex queriesOutput queries(\r\n  metal::texture1d<float, metal::access::sample> image_1d [[user(fake0)]]\r\n, metal::texture2d<float, metal::access::sample> image_2d [[user(fake0)]]\r\n, metal::texture2d_array<float, metal::access::sample> image_2d_array [[user(fake0)]]\r\n, metal::texturecube<float, metal::access::sample> image_cube [[user(fake0)]]\r\n, metal::texturecube_array<float, metal::access::sample> image_cube_array [[user(fake0)]]\r\n, metal::texture3d<float, metal::access::sample> image_3d [[user(fake0)]]\r\n, metal::texture2d_ms<float, metal::access::read> image_aa [[user(fake0)]]\r\n) {\r\n    int dim_1d = int(image_1d.get_width());\r\n    int dim_1d_lod = int(image_1d.get_width());\r\n    metal::int2 dim_2d = metal::int2(image_2d.get_width(), image_2d.get_height());\r\n    metal::int2 dim_2d_lod = metal::int2(image_2d.get_width(1), image_2d.get_height(1));\r\n    metal::int2 dim_2d_array = metal::int2(image_2d_array.get_width(), image_2d_array.get_height());\r\n    metal::int2 dim_2d_array_lod = metal::int2(image_2d_array.get_width(1), image_2d_array.get_height(1));\r\n    metal::int2 dim_cube = metal::int2(image_cube.get_width());\r\n    metal::int2 dim_cube_lod = metal::int2(image_cube.get_width(1));\r\n    metal::int2 dim_cube_array = metal::int2(image_cube_array.get_width());\r\n    metal::int2 dim_cube_array_lod = metal::int2(image_cube_array.get_width(1));\r\n    metal::int3 dim_3d = metal::int3(image_3d.get_width(), image_3d.get_height(), image_3d.get_depth());\r\n    metal::int3 dim_3d_lod = metal::int3(image_3d.get_width(1), image_3d.get_height(1), image_3d.get_depth(1));\r\n    metal::int2 dim_2s_ms = metal::int2(image_aa.get_width(), image_aa.get_height());\r\n    int sum = (((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z;\r\n    return queriesOutput { metal::float4(static_cast<float>(sum)) };\r\n}\r\n\r\n\r\nstruct levels_queriesOutput {\r\n    metal::float4 member_3 [[position]];\r\n};\r\nvertex levels_queriesOutput levels_queries(\r\n  metal::texture2d<float, metal::access::sample> image_2d [[user(fake0)]]\r\n, metal::texture2d_array<float, metal::access::sample> image_2d_array [[user(fake0)]]\r\n, metal::texturecube<float, metal::access::sample> image_cube [[user(fake0)]]\r\n, metal::texturecube_array<float, metal::access::sample> image_cube_array [[user(fake0)]]\r\n, metal::texture3d<float, metal::access::sample> image_3d [[user(fake0)]]\r\n, metal::texture2d_ms<float, metal::access::read> image_aa [[user(fake0)]]\r\n) {\r\n    int num_levels_2d = int(image_2d.get_num_mip_levels());\r\n    int num_levels_2d_array = int(image_2d_array.get_num_mip_levels());\r\n    int num_layers_2d = int(image_2d_array.get_array_size());\r\n    int num_levels_cube = int(image_cube.get_num_mip_levels());\r\n    int num_levels_cube_array = int(image_cube_array.get_num_mip_levels());\r\n    int num_layers_cube = int(image_cube_array.get_array_size());\r\n    int num_levels_3d = int(image_3d.get_num_mip_levels());\r\n    int num_samples_aa = int(image_aa.get_num_samples());\r\n    int sum_1 = ((((((num_layers_2d + num_layers_cube) + num_samples_aa) + num_levels_2d) + num_levels_2d_array) + num_levels_3d) + num_levels_cube) + num_levels_cube_array;\r\n    return levels_queriesOutput { metal::float4(static_cast<float>(sum_1)) };\r\n}\r\n\r\n\r\nstruct texture_sampleOutput {\r\n    metal::float4 member_4 [[color(0)]];\r\n};\r\nfragment texture_sampleOutput texture_sample(\r\n  metal::texture1d<float, metal::access::sample> image_1d [[user(fake0)]]\r\n, metal::texture2d<float, metal::access::sample> image_2d [[user(fake0)]]\r\n, metal::sampler sampler_reg [[user(fake0)]]\r\n) {\r\n    metal::float2 tc = metal::float2(0.5);\r\n    metal::float4 s1d = image_1d.sample(sampler_reg, tc.x);\r\n    metal::float4 s2d = image_2d.sample(sampler_reg, tc);\r\n    metal::float4 s2d_offset = image_2d.sample(sampler_reg, tc, const_type_9_);\r\n    metal::float4 s2d_level = image_2d.sample(sampler_reg, tc, metal::level(2.299999952316284));\r\n    metal::float4 s2d_level_offset = image_2d.sample(sampler_reg, tc, metal::level(2.299999952316284), const_type_9_);\r\n    metal::float4 s2d_bias_offset = image_2d.sample(sampler_reg, tc, metal::bias(2.0), const_type_9_);\r\n    return texture_sampleOutput { (((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset };\r\n}\r\n\r\n\r\nstruct texture_sample_comparisonOutput {\r\n    float member_5 [[color(0)]];\r\n};\r\nfragment texture_sample_comparisonOutput texture_sample_comparison(\r\n  metal::sampler sampler_cmp [[user(fake0)]]\r\n, metal::depth2d<float, metal::access::sample> image_2d_depth [[user(fake0)]]\r\n, metal::depthcube<float, metal::access::sample> image_cube_depth [[user(fake0)]]\r\n) {\r\n    metal::float2 tc_1 = metal::float2(0.5);\r\n    float s2d_depth = image_2d_depth.sample_compare(sampler_cmp, tc_1, 0.5);\r\n    float s2d_depth_level = image_2d_depth.sample_compare(sampler_cmp, tc_1, 0.5);\r\n    float scube_depth_level = image_cube_depth.sample_compare(sampler_cmp, metal::float3(0.5), 0.5);\r\n    return texture_sample_comparisonOutput { s2d_depth + s2d_depth_level };\r\n}\r\n\r\n\r\nstruct gatherOutput {\r\n    metal::float4 member_6 [[color(0)]];\r\n};\r\nfragment gatherOutput gather(\r\n  metal::texture2d<float, metal::access::sample> image_2d [[user(fake0)]]\r\n, metal::sampler sampler_reg [[user(fake0)]]\r\n, metal::sampler sampler_cmp [[user(fake0)]]\r\n, metal::depth2d<float, metal::access::sample> image_2d_depth [[user(fake0)]]\r\n) {\r\n    metal::float2 tc_2 = metal::float2(0.5);\r\n    metal::float4 s2d_1 = image_2d.gather(sampler_reg, tc_2, int2(0), metal::component::y);\r\n    metal::float4 s2d_offset_1 = image_2d.gather(sampler_reg, tc_2, const_type_9_, metal::component::w);\r\n    metal::float4 s2d_depth_1 = image_2d_depth.gather_compare(sampler_cmp, tc_2, 0.5);\r\n    metal::float4 s2d_depth_offset = image_2d_depth.gather_compare(sampler_cmp, tc_2, 0.5, const_type_9_);\r\n    return gatherOutput { ((s2d_1 + s2d_offset_1) + s2d_depth_1) + s2d_depth_offset };\r\n}\r\n\r\n\r\nstruct depth_no_comparisonOutput {\r\n    metal::float4 member_7 [[color(0)]];\r\n};\r\nfragment depth_no_comparisonOutput depth_no_comparison(\r\n  metal::sampler sampler_reg [[user(fake0)]]\r\n, metal::depth2d<float, metal::access::sample> image_2d_depth [[user(fake0)]]\r\n) {\r\n    metal::float2 tc_3 = metal::float2(0.5);\r\n    float s2d_2 = image_2d_depth.sample(sampler_reg, tc_3);\r\n    metal::float4 s2d_gather = image_2d_depth.gather(sampler_reg, tc_3);\r\n    return depth_no_comparisonOutput { metal::float4(s2d_2) + s2d_gather };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/interface.msl",
    "content": "// language: metal2.1\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct VertexOutput {\r\n    metal::float4 position;\r\n    float _varying;\r\n};\r\nstruct FragmentOutput {\r\n    float depth;\r\n    uint sample_mask;\r\n    float color;\r\n};\r\nstruct type_4 {\r\n    uint inner[1];\r\n};\r\nstruct Input1_ {\r\n    uint index;\r\n};\r\nstruct Input2_ {\r\n    uint index;\r\n};\r\n\r\nstruct vertex_Input {\r\n    uint color [[attribute(10)]];\r\n};\r\nstruct vertex_Output {\r\n    metal::float4 position [[position, invariant]];\r\n    float _varying [[user(loc1), center_perspective]];\r\n    float _point_size [[point_size]];\r\n};\r\nvertex vertex_Output vertex_(\r\n  vertex_Input varyings [[stage_in]]\r\n, uint vertex_index [[vertex_id]]\r\n, uint instance_index [[instance_id]]\r\n) {\r\n    const auto color = varyings.color;\r\n    uint tmp = (vertex_index + instance_index) + color;\r\n    const auto _tmp = VertexOutput {metal::float4(1.0), static_cast<float>(tmp)};\r\n    return vertex_Output { _tmp.position, _tmp._varying, 1.0 };\r\n}\r\n\r\n\r\nstruct fragment_Input {\r\n    float _varying [[user(loc1), center_perspective]];\r\n};\r\nstruct fragment_Output {\r\n    float depth [[depth(any)]];\r\n    uint sample_mask [[sample_mask]];\r\n    float color [[color(0)]];\r\n};\r\nfragment fragment_Output fragment_(\r\n  fragment_Input varyings_1 [[stage_in]]\r\n, metal::float4 position [[position]]\r\n, bool front_facing [[front_facing]]\r\n, uint sample_index [[sample_id]]\r\n, uint sample_mask [[sample_mask]]\r\n) {\r\n    const VertexOutput in = { position, varyings_1._varying };\r\n    uint mask = sample_mask & (1u << sample_index);\r\n    float color_1 = front_facing ? 1.0 : 0.0;\r\n    const auto _tmp = FragmentOutput {in._varying, mask, color_1};\r\n    return fragment_Output { _tmp.depth, _tmp.sample_mask, _tmp.color };\r\n}\r\n\r\n\r\nstruct compute_Input {\r\n};\r\nkernel void compute_(\r\n  metal::uint3 global_id [[thread_position_in_grid]]\r\n, metal::uint3 local_id [[thread_position_in_threadgroup]]\r\n, uint local_index [[thread_index_in_threadgroup]]\r\n, metal::uint3 wg_id [[threadgroup_position_in_grid]]\r\n, metal::uint3 num_wgs [[threadgroups_per_grid]]\r\n, threadgroup type_4& output\r\n) {\r\n    output.inner[0] = (((global_id.x + local_id.x) + local_index) + wg_id.x) + num_wgs.x;\r\n    return;\r\n}\r\n\r\n\r\nstruct vertex_two_structsInput {\r\n};\r\nstruct vertex_two_structsOutput {\r\n    metal::float4 member_3 [[position, invariant]];\r\n    float _point_size [[point_size]];\r\n};\r\nvertex vertex_two_structsOutput vertex_two_structs(\r\n  uint index_1 [[vertex_id]]\r\n, uint index_2 [[instance_id]]\r\n) {\r\n    const Input1_ in1_ = { index_1 };\r\n    const Input2_ in2_ = { index_2 };\r\n    uint index = 2u;\r\n    uint _e9 = index;\r\n    return vertex_two_structsOutput { metal::float4(static_cast<float>(in1_.index), static_cast<float>(in2_.index), static_cast<float>(_e9), 0.0), 1.0 };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/interpolate.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct FragmentInput {\r\n    metal::float4 position;\r\n    uint _flat;\r\n    float _linear;\r\n    metal::float2 linear_centroid;\r\n    metal::float3 linear_sample;\r\n    metal::float4 perspective;\r\n    float perspective_centroid;\r\n    float perspective_sample;\r\n};\r\n\r\nstruct vert_mainOutput {\r\n    metal::float4 position [[position]];\r\n    uint _flat [[user(loc0), flat]];\r\n    float _linear [[user(loc1), center_no_perspective]];\r\n    metal::float2 linear_centroid [[user(loc2), centroid_no_perspective]];\r\n    metal::float3 linear_sample [[user(loc3), sample_no_perspective]];\r\n    metal::float4 perspective [[user(loc4), center_perspective]];\r\n    float perspective_centroid [[user(loc5), centroid_perspective]];\r\n    float perspective_sample [[user(loc6), sample_perspective]];\r\n};\r\nvertex vert_mainOutput vert_main(\r\n) {\r\n    FragmentInput out = {};\r\n    out.position = metal::float4(2.0, 4.0, 5.0, 6.0);\r\n    out._flat = 8u;\r\n    out._linear = 27.0;\r\n    out.linear_centroid = metal::float2(64.0, 125.0);\r\n    out.linear_sample = metal::float3(216.0, 343.0, 512.0);\r\n    out.perspective = metal::float4(729.0, 1000.0, 1331.0, 1728.0);\r\n    out.perspective_centroid = 2197.0;\r\n    out.perspective_sample = 2744.0;\r\n    FragmentInput _e30 = out;\r\n    const auto _tmp = _e30;\r\n    return vert_mainOutput { _tmp.position, _tmp._flat, _tmp._linear, _tmp.linear_centroid, _tmp.linear_sample, _tmp.perspective, _tmp.perspective_centroid, _tmp.perspective_sample };\r\n}\r\n\r\n\r\nstruct frag_mainInput {\r\n    uint _flat [[user(loc0), flat]];\r\n    float _linear [[user(loc1), center_no_perspective]];\r\n    metal::float2 linear_centroid [[user(loc2), centroid_no_perspective]];\r\n    metal::float3 linear_sample [[user(loc3), sample_no_perspective]];\r\n    metal::float4 perspective [[user(loc4), center_perspective]];\r\n    float perspective_centroid [[user(loc5), centroid_perspective]];\r\n    float perspective_sample [[user(loc6), sample_perspective]];\r\n};\r\nfragment void frag_main(\r\n  frag_mainInput varyings_1 [[stage_in]]\r\n, metal::float4 position [[position]]\r\n) {\r\n    const FragmentInput val = { position, varyings_1._flat, varyings_1._linear, varyings_1.linear_centroid, varyings_1.linear_sample, varyings_1.perspective, varyings_1.perspective_centroid, varyings_1.perspective_sample };\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/math-functions.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nconstant metal::int2 const_type = {0, 0};\r\n\r\nvertex void main_(\r\n) {\r\n    metal::float4 v = metal::float4(0.0);\r\n    float a = ((1.0) * 57.295779513082322865);\r\n    float b = ((1.0) * 0.017453292519943295474);\r\n    metal::float4 c = ((v) * 57.295779513082322865);\r\n    metal::float4 d = ((v) * 0.017453292519943295474);\r\n    metal::float4 e = metal::saturate(v);\r\n    int const_dot = ( + const_type.x * const_type.x + const_type.y * const_type.y);\r\n    uint first_leading_bit_abs = (((metal::clz(metal::abs(0u)) + 1) % 33) - 1);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/operators.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct Foo {\r\n    metal::float4 a;\r\n    int b;\r\n};\r\nstruct type_12 {\r\n    Foo inner[3];\r\n};\r\nstruct type_13 {\r\n    int inner[4u];\r\n};\r\nconstant metal::float4 v_f32_one = {1.0, 1.0, 1.0, 1.0};\r\nconstant metal::float4 v_f32_zero = {0.0, 0.0, 0.0, 0.0};\r\nconstant metal::float4 v_f32_half = {0.5, 0.5, 0.5, 0.5};\r\nconstant metal::int4 v_i32_one = {1, 1, 1, 1};\r\nconstant metal::uint2 const_type_11_ = {0u, 0u};\r\nconstant metal::float2 const_type_4_ = {0.0, 0.0};\r\nconstant metal::float2x2 const_type_7_ = {const_type_4_, const_type_4_};\r\nconstant metal::float4 const_type = {0.0, 0.0, 0.0, 0.0};\r\nconstant Foo const_Foo = {const_type, 0};\r\nconstant type_12 const_type_12_ = {const_Foo, const_Foo, const_Foo};\r\nconstant metal::float3 const_type_5_ = {0.0, 0.0, 0.0};\r\nconstant metal::float2x3 const_type_14_ = {const_type_5_, const_type_5_};\r\nconstant metal::float3x3 const_type_15_ = {const_type_5_, const_type_5_, const_type_5_};\r\nconstant metal::float4x3 const_type_16_ = {const_type_5_, const_type_5_, const_type_5_, const_type_5_};\r\nconstant metal::float3x4 const_type_17_ = {const_type, const_type, const_type};\r\nconstant metal::int3 const_type_18_ = {0, 0, 0};\r\n\r\nmetal::float4 builtins(\r\n) {\r\n    int s1_ = true ? 1 : 0;\r\n    metal::float4 s2_ = true ? v_f32_one : v_f32_zero;\r\n    metal::float4 s3_ = metal::select(v_f32_one, v_f32_zero, metal::bool4(false, false, false, false));\r\n    metal::float4 m1_ = metal::mix(v_f32_zero, v_f32_one, v_f32_half);\r\n    metal::float4 m2_ = metal::mix(v_f32_zero, v_f32_one, 0.10000000149011612);\r\n    float b1_ = as_type<float>(v_i32_one.x);\r\n    metal::float4 b2_ = as_type<metal::float4>(v_i32_one);\r\n    metal::int4 v_i32_zero = static_cast<metal::int4>(v_f32_zero);\r\n    return ((((static_cast<metal::float4>(metal::int4(s1_) + v_i32_zero) + s2_) + m1_) + m2_) + metal::float4(b1_)) + b2_;\r\n}\r\n\r\nmetal::float4 splat(\r\n) {\r\n    metal::float2 a_2 = ((metal::float2(1.0) + metal::float2(2.0)) - metal::float2(3.0)) / metal::float2(4.0);\r\n    metal::int4 b = metal::int4(5) % metal::int4(2);\r\n    return a_2.xyxy + static_cast<metal::float4>(b);\r\n}\r\n\r\nmetal::float2 splat_assignment(\r\n) {\r\n    metal::float2 a = {};\r\n    a = metal::float2(2.0);\r\n    metal::float2 _e7 = a;\r\n    a = _e7 + metal::float2(1.0);\r\n    metal::float2 _e11 = a;\r\n    a = _e11 - metal::float2(3.0);\r\n    metal::float2 _e15 = a;\r\n    a = _e15 / metal::float2(4.0);\r\n    metal::float2 _e19 = a;\r\n    return _e19;\r\n}\r\n\r\nmetal::float3 bool_cast(\r\n    metal::float3 x\r\n) {\r\n    metal::bool3 y = static_cast<metal::bool3>(x);\r\n    return static_cast<metal::float3>(y);\r\n}\r\n\r\nfloat constructors(\r\n) {\r\n    Foo foo = {};\r\n    foo = Foo {metal::float4(1.0), 1};\r\n    metal::float2x2 mat2comp = metal::float2x2(metal::float2(1.0, 0.0), metal::float2(0.0, 1.0));\r\n    metal::float4x4 mat4comp = metal::float4x4(metal::float4(1.0, 0.0, 0.0, 0.0), metal::float4(0.0, 1.0, 0.0, 0.0), metal::float4(0.0, 0.0, 1.0, 0.0), metal::float4(0.0, 0.0, 0.0, 1.0));\r\n    metal::uint2 unnamed = metal::uint2(0u);\r\n    metal::float2x2 unnamed_1 = metal::float2x2(metal::float2(0.0), metal::float2(0.0));\r\n    type_13 unnamed_2 = type_13 {0, 1, 2, 3};\r\n    bool unnamed_3 = static_cast<bool>(false);\r\n    int unnamed_4 = static_cast<int>(0);\r\n    uint unnamed_5 = static_cast<uint>(0u);\r\n    float unnamed_6 = static_cast<float>(0.0);\r\n    metal::uint2 unnamed_7 = static_cast<metal::uint2>(const_type_11_);\r\n    metal::float2x3 unnamed_8 = metal::float2x3(const_type_14_);\r\n    metal::uint2 unnamed_9 = as_type<metal::uint2>(const_type_11_);\r\n    metal::float2x3 unnamed_10 = metal::float2x3(const_type_14_);\r\n    float _e75 = foo.a.x;\r\n    return _e75;\r\n}\r\n\r\nvoid logical(\r\n) {\r\n    bool unnamed_11 = !true;\r\n    metal::bool2 unnamed_12 = !metal::bool2(true);\r\n    bool unnamed_13 = true || false;\r\n    bool unnamed_14 = true && false;\r\n    bool unnamed_15 = true | false;\r\n    metal::bool3 unnamed_16 = metal::bool3(true) | metal::bool3(false);\r\n    bool unnamed_17 = true & false;\r\n    metal::bool4 unnamed_18 = metal::bool4(true) & metal::bool4(false);\r\n}\r\n\r\nvoid arithmetic(\r\n) {\r\n    metal::int2 unnamed_19 = -metal::int2(1);\r\n    metal::float2 unnamed_20 = -metal::float2(1.0);\r\n    int unnamed_21 = 2 + 1;\r\n    uint unnamed_22 = 2u + 1u;\r\n    float unnamed_23 = 2.0 + 1.0;\r\n    metal::int2 unnamed_24 = metal::int2(2) + metal::int2(1);\r\n    metal::uint3 unnamed_25 = metal::uint3(2u) + metal::uint3(1u);\r\n    metal::float4 unnamed_26 = metal::float4(2.0) + metal::float4(1.0);\r\n    int unnamed_27 = 2 - 1;\r\n    uint unnamed_28 = 2u - 1u;\r\n    float unnamed_29 = 2.0 - 1.0;\r\n    metal::int2 unnamed_30 = metal::int2(2) - metal::int2(1);\r\n    metal::uint3 unnamed_31 = metal::uint3(2u) - metal::uint3(1u);\r\n    metal::float4 unnamed_32 = metal::float4(2.0) - metal::float4(1.0);\r\n    int unnamed_33 = 2 * 1;\r\n    uint unnamed_34 = 2u * 1u;\r\n    float unnamed_35 = 2.0 * 1.0;\r\n    metal::int2 unnamed_36 = metal::int2(2) * metal::int2(1);\r\n    metal::uint3 unnamed_37 = metal::uint3(2u) * metal::uint3(1u);\r\n    metal::float4 unnamed_38 = metal::float4(2.0) * metal::float4(1.0);\r\n    int unnamed_39 = 2 / 1;\r\n    uint unnamed_40 = 2u / 1u;\r\n    float unnamed_41 = 2.0 / 1.0;\r\n    metal::int2 unnamed_42 = metal::int2(2) / metal::int2(1);\r\n    metal::uint3 unnamed_43 = metal::uint3(2u) / metal::uint3(1u);\r\n    metal::float4 unnamed_44 = metal::float4(2.0) / metal::float4(1.0);\r\n    int unnamed_45 = 2 % 1;\r\n    uint unnamed_46 = 2u % 1u;\r\n    float unnamed_47 = metal::fmod(2.0, 1.0);\r\n    metal::int2 unnamed_48 = metal::int2(2) % metal::int2(1);\r\n    metal::uint3 unnamed_49 = metal::uint3(2u) % metal::uint3(1u);\r\n    metal::float4 unnamed_50 = metal::fmod(metal::float4(2.0), metal::float4(1.0));\r\n    metal::int2 unnamed_51 = metal::int2(2) + metal::int2(1);\r\n    metal::int2 unnamed_52 = metal::int2(2) + metal::int2(1);\r\n    metal::uint2 unnamed_53 = metal::uint2(2u) + metal::uint2(1u);\r\n    metal::uint2 unnamed_54 = metal::uint2(2u) + metal::uint2(1u);\r\n    metal::float2 unnamed_55 = metal::float2(2.0) + metal::float2(1.0);\r\n    metal::float2 unnamed_56 = metal::float2(2.0) + metal::float2(1.0);\r\n    metal::int2 unnamed_57 = metal::int2(2) - metal::int2(1);\r\n    metal::int2 unnamed_58 = metal::int2(2) - metal::int2(1);\r\n    metal::uint2 unnamed_59 = metal::uint2(2u) - metal::uint2(1u);\r\n    metal::uint2 unnamed_60 = metal::uint2(2u) - metal::uint2(1u);\r\n    metal::float2 unnamed_61 = metal::float2(2.0) - metal::float2(1.0);\r\n    metal::float2 unnamed_62 = metal::float2(2.0) - metal::float2(1.0);\r\n    metal::int2 unnamed_63 = metal::int2(2) * 1;\r\n    metal::int2 unnamed_64 = 2 * metal::int2(1);\r\n    metal::uint2 unnamed_65 = metal::uint2(2u) * 1u;\r\n    metal::uint2 unnamed_66 = 2u * metal::uint2(1u);\r\n    metal::float2 unnamed_67 = metal::float2(2.0) * 1.0;\r\n    metal::float2 unnamed_68 = 2.0 * metal::float2(1.0);\r\n    metal::int2 unnamed_69 = metal::int2(2) / metal::int2(1);\r\n    metal::int2 unnamed_70 = metal::int2(2) / metal::int2(1);\r\n    metal::uint2 unnamed_71 = metal::uint2(2u) / metal::uint2(1u);\r\n    metal::uint2 unnamed_72 = metal::uint2(2u) / metal::uint2(1u);\r\n    metal::float2 unnamed_73 = metal::float2(2.0) / metal::float2(1.0);\r\n    metal::float2 unnamed_74 = metal::float2(2.0) / metal::float2(1.0);\r\n    metal::int2 unnamed_75 = metal::int2(2) % metal::int2(1);\r\n    metal::int2 unnamed_76 = metal::int2(2) % metal::int2(1);\r\n    metal::uint2 unnamed_77 = metal::uint2(2u) % metal::uint2(1u);\r\n    metal::uint2 unnamed_78 = metal::uint2(2u) % metal::uint2(1u);\r\n    metal::float2 unnamed_79 = metal::fmod(metal::float2(2.0), metal::float2(1.0));\r\n    metal::float2 unnamed_80 = metal::fmod(metal::float2(2.0), metal::float2(1.0));\r\n    metal::float3x3 unnamed_81 = const_type_15_ + const_type_15_;\r\n    metal::float3x3 unnamed_82 = const_type_15_ - const_type_15_;\r\n    metal::float3x3 unnamed_83 = const_type_15_ * 1.0;\r\n    metal::float3x3 unnamed_84 = 2.0 * const_type_15_;\r\n    metal::float3 unnamed_85 = const_type_16_ * metal::float4(1.0);\r\n    metal::float4 unnamed_86 = metal::float3(2.0) * const_type_16_;\r\n    metal::float3x3 unnamed_87 = const_type_16_ * const_type_17_;\r\n}\r\n\r\nvoid bit(\r\n) {\r\n    int unnamed_88 = ~1;\r\n    uint unnamed_89 = ~1u;\r\n    metal::int2 unnamed_90 = ~metal::int2(1);\r\n    metal::uint3 unnamed_91 = ~metal::uint3(1u);\r\n    int unnamed_92 = 2 | 1;\r\n    uint unnamed_93 = 2u | 1u;\r\n    metal::int2 unnamed_94 = metal::int2(2) | metal::int2(1);\r\n    metal::uint3 unnamed_95 = metal::uint3(2u) | metal::uint3(1u);\r\n    int unnamed_96 = 2 & 1;\r\n    uint unnamed_97 = 2u & 1u;\r\n    metal::int2 unnamed_98 = metal::int2(2) & metal::int2(1);\r\n    metal::uint3 unnamed_99 = metal::uint3(2u) & metal::uint3(1u);\r\n    int unnamed_100 = 2 ^ 1;\r\n    uint unnamed_101 = 2u ^ 1u;\r\n    metal::int2 unnamed_102 = metal::int2(2) ^ metal::int2(1);\r\n    metal::uint3 unnamed_103 = metal::uint3(2u) ^ metal::uint3(1u);\r\n    int unnamed_104 = 2 << 1u;\r\n    uint unnamed_105 = 2u << 1u;\r\n    metal::int2 unnamed_106 = metal::int2(2) << metal::uint2(1u);\r\n    metal::uint3 unnamed_107 = metal::uint3(2u) << metal::uint3(1u);\r\n    int unnamed_108 = 2 >> 1u;\r\n    uint unnamed_109 = 2u >> 1u;\r\n    metal::int2 unnamed_110 = metal::int2(2) >> metal::uint2(1u);\r\n    metal::uint3 unnamed_111 = metal::uint3(2u) >> metal::uint3(1u);\r\n}\r\n\r\nvoid comparison(\r\n) {\r\n    bool unnamed_112 = 2 == 1;\r\n    bool unnamed_113 = 2u == 1u;\r\n    bool unnamed_114 = 2.0 == 1.0;\r\n    metal::bool2 unnamed_115 = metal::int2(2) == metal::int2(1);\r\n    metal::bool3 unnamed_116 = metal::uint3(2u) == metal::uint3(1u);\r\n    metal::bool4 unnamed_117 = metal::float4(2.0) == metal::float4(1.0);\r\n    bool unnamed_118 = 2 != 1;\r\n    bool unnamed_119 = 2u != 1u;\r\n    bool unnamed_120 = 2.0 != 1.0;\r\n    metal::bool2 unnamed_121 = metal::int2(2) != metal::int2(1);\r\n    metal::bool3 unnamed_122 = metal::uint3(2u) != metal::uint3(1u);\r\n    metal::bool4 unnamed_123 = metal::float4(2.0) != metal::float4(1.0);\r\n    bool unnamed_124 = 2 < 1;\r\n    bool unnamed_125 = 2u < 1u;\r\n    bool unnamed_126 = 2.0 < 1.0;\r\n    metal::bool2 unnamed_127 = metal::int2(2) < metal::int2(1);\r\n    metal::bool3 unnamed_128 = metal::uint3(2u) < metal::uint3(1u);\r\n    metal::bool4 unnamed_129 = metal::float4(2.0) < metal::float4(1.0);\r\n    bool unnamed_130 = 2 <= 1;\r\n    bool unnamed_131 = 2u <= 1u;\r\n    bool unnamed_132 = 2.0 <= 1.0;\r\n    metal::bool2 unnamed_133 = metal::int2(2) <= metal::int2(1);\r\n    metal::bool3 unnamed_134 = metal::uint3(2u) <= metal::uint3(1u);\r\n    metal::bool4 unnamed_135 = metal::float4(2.0) <= metal::float4(1.0);\r\n    bool unnamed_136 = 2 > 1;\r\n    bool unnamed_137 = 2u > 1u;\r\n    bool unnamed_138 = 2.0 > 1.0;\r\n    metal::bool2 unnamed_139 = metal::int2(2) > metal::int2(1);\r\n    metal::bool3 unnamed_140 = metal::uint3(2u) > metal::uint3(1u);\r\n    metal::bool4 unnamed_141 = metal::float4(2.0) > metal::float4(1.0);\r\n    bool unnamed_142 = 2 >= 1;\r\n    bool unnamed_143 = 2u >= 1u;\r\n    bool unnamed_144 = 2.0 >= 1.0;\r\n    metal::bool2 unnamed_145 = metal::int2(2) >= metal::int2(1);\r\n    metal::bool3 unnamed_146 = metal::uint3(2u) >= metal::uint3(1u);\r\n    metal::bool4 unnamed_147 = metal::float4(2.0) >= metal::float4(1.0);\r\n}\r\n\r\nvoid assignment(\r\n) {\r\n    int a_1 = 1;\r\n    metal::int3 vec0_ = const_type_18_;\r\n    int _e6 = a_1;\r\n    a_1 = _e6 + 1;\r\n    int _e9 = a_1;\r\n    a_1 = _e9 - 1;\r\n    int _e12 = a_1;\r\n    int _e13 = a_1;\r\n    a_1 = _e12 * _e13;\r\n    int _e15 = a_1;\r\n    int _e16 = a_1;\r\n    a_1 = _e15 / _e16;\r\n    int _e18 = a_1;\r\n    a_1 = _e18 % 1;\r\n    int _e21 = a_1;\r\n    a_1 = _e21 & 0;\r\n    int _e24 = a_1;\r\n    a_1 = _e24 | 0;\r\n    int _e27 = a_1;\r\n    a_1 = _e27 ^ 0;\r\n    int _e30 = a_1;\r\n    a_1 = _e30 << 2u;\r\n    int _e33 = a_1;\r\n    a_1 = _e33 >> 1u;\r\n    int _e36 = a_1;\r\n    a_1 = _e36 + 1;\r\n    int _e39 = a_1;\r\n    a_1 = _e39 - 1;\r\n    int _e46 = vec0_.y;\r\n    vec0_.y = _e46 + 1;\r\n    int _e51 = vec0_.y;\r\n    vec0_.y = _e51 - 1;\r\n    return;\r\n}\r\n\r\nkernel void main_(\r\n) {\r\n    metal::float4 _e4 = builtins();\r\n    metal::float4 _e5 = splat();\r\n    metal::float3 _e7 = bool_cast(v_f32_one.xyz);\r\n    float _e8 = constructors();\r\n    logical();\r\n    arithmetic();\r\n    bit();\r\n    comparison();\r\n    assignment();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/padding.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct S {\r\n    metal::float3 a;\r\n};\r\nstruct Test {\r\n    S a;\r\n    float b;\r\n};\r\nstruct type_2 {\r\n    metal::float3 inner[2];\r\n};\r\nstruct Test2_ {\r\n    type_2 a;\r\n    float b;\r\n};\r\nstruct Test3_ {\r\n    metal::float4x3 a;\r\n    float b;\r\n};\r\n\r\nstruct vertex_Output {\r\n    metal::float4 member [[position]];\r\n};\r\nvertex vertex_Output vertex_(\r\n  constant Test& input1_ [[buffer(0)]]\r\n, constant Test2_& input2_ [[buffer(1)]]\r\n, constant Test3_& input3_ [[buffer(2)]]\r\n) {\r\n    float _e6 = input1_.b;\r\n    float _e9 = input2_.b;\r\n    float _e12 = input3_.b;\r\n    return vertex_Output { ((metal::float4(1.0) * _e6) * _e9) * _e12 };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/policy-mix.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct DefaultConstructible {\r\n    template<typename T>\r\n    operator T() && {\r\n        return T {};\r\n    }\r\n};\r\nstruct type_1 {\r\n    metal::float4 inner[10];\r\n};\r\nstruct InStorage {\r\n    type_1 a;\r\n};\r\nstruct type_2 {\r\n    metal::float4 inner[20];\r\n};\r\nstruct InUniform {\r\n    type_2 a;\r\n};\r\nstruct type_5 {\r\n    float inner[30];\r\n};\r\nstruct type_6 {\r\n    float inner[40];\r\n};\r\nstruct type_9 {\r\n    metal::float4 inner[2];\r\n};\r\n\r\nmetal::float4 mock_function(\r\n    metal::int2 c,\r\n    int i,\r\n    int l,\r\n    device InStorage const& in_storage,\r\n    constant InUniform& in_uniform,\r\n    metal::texture2d_array<float, metal::access::sample> image_2d_array,\r\n    threadgroup type_5& in_workgroup,\r\n    thread type_6& in_private\r\n) {\r\n    type_9 in_function = {};\r\n    for(int _i=0; _i<2; ++_i) in_function.inner[_i] = type_9 {metal::float4(0.7070000171661377, 0.0, 0.0, 1.0), metal::float4(0.0, 0.7070000171661377, 0.0, 1.0)}.inner[_i];\r\n    metal::float4 _e22 = in_storage.a.inner[i];\r\n    metal::float4 _e25 = in_uniform.a.inner[i];\r\n    metal::float4 _e27 = (uint(l) < image_2d_array.get_num_mip_levels() && uint(i) < image_2d_array.get_array_size() && metal::all(metal::uint2(c) < metal::uint2(image_2d_array.get_width(l), image_2d_array.get_height(l))) ? image_2d_array.read(metal::uint2(c), i, l): DefaultConstructible());\r\n    float _e30 = in_workgroup.inner[metal::min(unsigned(i), 29u)];\r\n    float _e34 = in_private.inner[metal::min(unsigned(i), 39u)];\r\n    metal::float4 _e38 = in_function.inner[metal::min(unsigned(i), 1u)];\r\n    return ((((_e22 + _e25) + _e27) + metal::float4(_e30)) + metal::float4(_e34)) + _e38;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/quad-vert.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct type_5 {\r\n    float inner[1u];\r\n};\r\nstruct gl_PerVertex {\r\n    metal::float4 gl_Position;\r\n    float gl_PointSize;\r\n    type_5 gl_ClipDistance;\r\n    type_5 gl_CullDistance;\r\n};\r\nstruct type_9 {\r\n    metal::float2 member;\r\n    metal::float4 gl_Position;\r\n};\r\nconstant metal::float4 const_type_3_ = {0.0, 0.0, 0.0, 1.0};\r\nconstant type_5 const_type_5_ = {0.0};\r\nconstant gl_PerVertex const_gl_PerVertex = {const_type_3_, 1.0, const_type_5_, const_type_5_};\r\n\r\nvoid main_1(\r\n    thread metal::float2& v_uv,\r\n    thread metal::float2& a_uv_1,\r\n    thread gl_PerVertex& perVertexStruct,\r\n    thread metal::float2& a_pos_1\r\n) {\r\n    metal::float2 _e12 = a_uv_1;\r\n    v_uv = _e12;\r\n    metal::float2 _e13 = a_pos_1;\r\n    perVertexStruct.gl_Position = metal::float4(_e13.x, _e13.y, 0.0, 1.0);\r\n    return;\r\n}\r\n\r\nstruct main_Input {\r\n    metal::float2 a_uv [[attribute(1)]];\r\n    metal::float2 a_pos [[attribute(0)]];\r\n};\r\nstruct main_Output {\r\n    metal::float2 member [[user(loc0), center_perspective]];\r\n    metal::float4 gl_Position [[position]];\r\n};\r\nvertex main_Output main_(\r\n  main_Input varyings [[stage_in]]\r\n) {\r\n    metal::float2 v_uv = {};\r\n    metal::float2 a_uv_1 = {};\r\n    gl_PerVertex perVertexStruct = const_gl_PerVertex;\r\n    metal::float2 a_pos_1 = {};\r\n    const auto a_uv = varyings.a_uv;\r\n    const auto a_pos = varyings.a_pos;\r\n    a_uv_1 = a_uv;\r\n    a_pos_1 = a_pos;\r\n    main_1(v_uv, a_uv_1, perVertexStruct, a_pos_1);\r\n    metal::float2 _e7 = v_uv;\r\n    metal::float4 _e8 = perVertexStruct.gl_Position;\r\n    const auto _tmp = type_9 {_e7, _e8};\r\n    return main_Output { _tmp.member, _tmp.gl_Position };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/quad.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nconstexpr constant float c_scale = 1.2000000476837158;\r\nstruct VertexOutput {\r\n    metal::float2 uv;\r\n    metal::float4 position;\r\n};\r\n\r\nstruct vert_mainInput {\r\n    metal::float2 pos [[attribute(0)]];\r\n    metal::float2 uv [[attribute(1)]];\r\n};\r\nstruct vert_mainOutput {\r\n    metal::float2 uv [[user(loc0), center_perspective]];\r\n    metal::float4 position [[position]];\r\n};\r\nvertex vert_mainOutput vert_main(\r\n  vert_mainInput varyings [[stage_in]]\r\n) {\r\n    const auto pos = varyings.pos;\r\n    const auto uv = varyings.uv;\r\n    const auto _tmp = VertexOutput {uv, metal::float4(c_scale * pos, 0.0, 1.0)};\r\n    return vert_mainOutput { _tmp.uv, _tmp.position };\r\n}\r\n\r\n\r\nstruct frag_mainInput {\r\n    metal::float2 uv_1 [[user(loc0), center_perspective]];\r\n};\r\nstruct frag_mainOutput {\r\n    metal::float4 member_1 [[color(0)]];\r\n};\r\nfragment frag_mainOutput frag_main(\r\n  frag_mainInput varyings_1 [[stage_in]]\r\n, metal::texture2d<float, metal::access::sample> u_texture [[user(fake0)]]\r\n, metal::sampler u_sampler [[user(fake0)]]\r\n) {\r\n    const auto uv_1 = varyings_1.uv_1;\r\n    metal::float4 color = u_texture.sample(u_sampler, uv_1);\r\n    if (color.w == 0.0) {\r\n        metal::discard_fragment();\r\n    }\r\n    metal::float4 premultiplied = color.w * color;\r\n    return frag_mainOutput { premultiplied };\r\n}\r\n\r\n\r\nstruct fs_extraOutput {\r\n    metal::float4 member_2 [[color(0)]];\r\n};\r\nfragment fs_extraOutput fs_extra(\r\n) {\r\n    return fs_extraOutput { metal::float4(0.0, 0.5, 0.0, 0.5) };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/shadow.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct _mslBufferSizes {\r\n    uint size2;\r\n};\r\n\r\nconstexpr constant unsigned c_max_lights = 10u;\r\nstruct Globals {\r\n    metal::float4x4 view_proj;\r\n    metal::uint4 num_lights;\r\n};\r\nstruct Entity {\r\n    metal::float4x4 world;\r\n    metal::float4 color;\r\n};\r\nstruct VertexOutput {\r\n    metal::float4 proj_position;\r\n    metal::float3 world_normal;\r\n    metal::float4 world_position;\r\n};\r\nstruct Light {\r\n    metal::float4x4 proj;\r\n    metal::float4 pos;\r\n    metal::float4 color;\r\n};\r\ntypedef Light type_6[1];\r\nstruct type_7 {\r\n    Light inner[10];\r\n};\r\nconstant metal::float3 c_ambient = {0.05000000074505806, 0.05000000074505806, 0.05000000074505806};\r\n\r\nfloat fetch_shadow(\r\n    uint light_id,\r\n    metal::float4 homogeneous_coords,\r\n    metal::depth2d_array<float, metal::access::sample> t_shadow,\r\n    metal::sampler sampler_shadow\r\n) {\r\n    if (homogeneous_coords.w <= 0.0) {\r\n        return 1.0;\r\n    }\r\n    metal::float2 flip_correction = metal::float2(0.5, -0.5);\r\n    float proj_correction = 1.0 / homogeneous_coords.w;\r\n    metal::float2 light_local = ((homogeneous_coords.xy * flip_correction) * proj_correction) + metal::float2(0.5, 0.5);\r\n    float _e28 = t_shadow.sample_compare(sampler_shadow, light_local, static_cast<int>(light_id), homogeneous_coords.z * proj_correction);\r\n    return _e28;\r\n}\r\n\r\nstruct vs_mainInput {\r\n    metal::int4 position [[attribute(0)]];\r\n    metal::int4 normal [[attribute(1)]];\r\n};\r\nstruct vs_mainOutput {\r\n    metal::float4 proj_position [[position]];\r\n    metal::float3 world_normal [[user(loc0), center_perspective]];\r\n    metal::float4 world_position [[user(loc1), center_perspective]];\r\n};\r\nvertex vs_mainOutput vs_main(\r\n  vs_mainInput varyings [[stage_in]]\r\n, constant Globals& u_globals [[user(fake0)]]\r\n, constant Entity& u_entity [[user(fake0)]]\r\n) {\r\n    const auto position = varyings.position;\r\n    const auto normal = varyings.normal;\r\n    VertexOutput out = {};\r\n    metal::float4x4 w = u_entity.world;\r\n    metal::float4x4 _e7 = u_entity.world;\r\n    metal::float4 world_pos = _e7 * static_cast<metal::float4>(position);\r\n    out.world_normal = metal::float3x3(w[0].xyz, w[1].xyz, w[2].xyz) * static_cast<metal::float3>(normal.xyz);\r\n    out.world_position = world_pos;\r\n    metal::float4x4 _e25 = u_globals.view_proj;\r\n    out.proj_position = _e25 * world_pos;\r\n    VertexOutput _e27 = out;\r\n    const auto _tmp = _e27;\r\n    return vs_mainOutput { _tmp.proj_position, _tmp.world_normal, _tmp.world_position };\r\n}\r\n\r\n\r\nstruct fs_mainInput {\r\n    metal::float3 world_normal [[user(loc0), center_perspective]];\r\n    metal::float4 world_position [[user(loc1), center_perspective]];\r\n};\r\nstruct fs_mainOutput {\r\n    metal::float4 member_1 [[color(0)]];\r\n};\r\nfragment fs_mainOutput fs_main(\r\n  fs_mainInput varyings_1 [[stage_in]]\r\n, metal::float4 proj_position [[position]]\r\n, constant Globals& u_globals [[user(fake0)]]\r\n, constant Entity& u_entity [[user(fake0)]]\r\n, device type_6 const& s_lights [[user(fake0)]]\r\n, metal::depth2d_array<float, metal::access::sample> t_shadow [[user(fake0)]]\r\n, metal::sampler sampler_shadow [[user(fake0)]]\r\n, constant _mslBufferSizes& _buffer_sizes [[user(fake0)]]\r\n) {\r\n    const VertexOutput in = { proj_position, varyings_1.world_normal, varyings_1.world_position };\r\n    metal::float3 color = c_ambient;\r\n    uint i = 0u;\r\n    metal::float3 normal_1 = metal::normalize(in.world_normal);\r\n    bool loop_init = true;\r\n    while(true) {\r\n        if (!loop_init) {\r\n            uint _e20 = i;\r\n            i = _e20 + 1u;\r\n        }\r\n        loop_init = false;\r\n        uint _e14 = i;\r\n        uint _e17 = u_globals.num_lights.x;\r\n        if (_e14 < metal::min(_e17, c_max_lights)) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _e23 = i;\r\n        Light light = s_lights[_e23];\r\n        uint _e26 = i;\r\n        float _e30 = fetch_shadow(_e26, light.proj * in.world_position, t_shadow, sampler_shadow);\r\n        metal::float3 light_dir = metal::normalize(light.pos.xyz - in.world_position.xyz);\r\n        float diffuse = metal::max(0.0, metal::dot(normal_1, light_dir));\r\n        metal::float3 _e40 = color;\r\n        color = _e40 + ((_e30 * diffuse) * light.color.xyz);\r\n    }\r\n    metal::float3 _e46 = color;\r\n    metal::float4 _e50 = u_entity.color;\r\n    return fs_mainOutput { metal::float4(_e46, 1.0) * _e50 };\r\n}\r\n\r\n\r\nstruct fs_main_without_storageInput {\r\n    metal::float3 world_normal [[user(loc0), center_perspective]];\r\n    metal::float4 world_position [[user(loc1), center_perspective]];\r\n};\r\nstruct fs_main_without_storageOutput {\r\n    metal::float4 member_2 [[color(0)]];\r\n};\r\nfragment fs_main_without_storageOutput fs_main_without_storage(\r\n  fs_main_without_storageInput varyings_2 [[stage_in]]\r\n, metal::float4 proj_position_1 [[position]]\r\n, constant Globals& u_globals [[user(fake0)]]\r\n, constant Entity& u_entity [[user(fake0)]]\r\n, constant type_7& u_lights [[user(fake0)]]\r\n, metal::depth2d_array<float, metal::access::sample> t_shadow [[user(fake0)]]\r\n, metal::sampler sampler_shadow [[user(fake0)]]\r\n) {\r\n    const VertexOutput in_1 = { proj_position_1, varyings_2.world_normal, varyings_2.world_position };\r\n    metal::float3 color_1 = c_ambient;\r\n    uint i_1 = 0u;\r\n    metal::float3 normal_2 = metal::normalize(in_1.world_normal);\r\n    bool loop_init_1 = true;\r\n    while(true) {\r\n        if (!loop_init_1) {\r\n            uint _e20 = i_1;\r\n            i_1 = _e20 + 1u;\r\n        }\r\n        loop_init_1 = false;\r\n        uint _e14 = i_1;\r\n        uint _e17 = u_globals.num_lights.x;\r\n        if (_e14 < metal::min(_e17, c_max_lights)) {\r\n        } else {\r\n            break;\r\n        }\r\n        uint _e23 = i_1;\r\n        Light light_1 = u_lights.inner[_e23];\r\n        uint _e26 = i_1;\r\n        float _e30 = fetch_shadow(_e26, light_1.proj * in_1.world_position, t_shadow, sampler_shadow);\r\n        metal::float3 light_dir_1 = metal::normalize(light_1.pos.xyz - in_1.world_position.xyz);\r\n        float diffuse_1 = metal::max(0.0, metal::dot(normal_2, light_dir_1));\r\n        metal::float3 _e40 = color_1;\r\n        color_1 = _e40 + ((_e30 * diffuse_1) * light_1.color.xyz);\r\n    }\r\n    metal::float3 _e46 = color_1;\r\n    metal::float4 _e50 = u_entity.color;\r\n    return fs_main_without_storageOutput { metal::float4(_e46, 1.0) * _e50 };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/skybox.msl",
    "content": "// language: metal2.1\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\nstruct VertexOutput {\r\n    metal::float4 position;\r\n    metal::float3 uv;\r\n};\r\nstruct Data {\r\n    metal::float4x4 proj_inv;\r\n    metal::float4x4 view;\r\n};\r\n\r\nstruct vs_mainInput {\r\n};\r\nstruct vs_mainOutput {\r\n    metal::float4 position [[position]];\r\n    metal::float3 uv [[user(loc0), center_perspective]];\r\n};\r\nvertex vs_mainOutput vs_main(\r\n  uint vertex_index [[vertex_id]]\r\n, constant Data& r_data [[buffer(0)]]\r\n) {\r\n    int tmp1_ = {};\r\n    int tmp2_ = {};\r\n    tmp1_ = static_cast<int>(vertex_index) / 2;\r\n    tmp2_ = static_cast<int>(vertex_index) & 1;\r\n    int _e10 = tmp1_;\r\n    int _e16 = tmp2_;\r\n    metal::float4 pos = metal::float4((static_cast<float>(_e10) * 4.0) - 1.0, (static_cast<float>(_e16) * 4.0) - 1.0, 0.0, 1.0);\r\n    metal::float4 _e27 = r_data.view[0];\r\n    metal::float4 _e31 = r_data.view[1];\r\n    metal::float4 _e35 = r_data.view[2];\r\n    metal::float3x3 inv_model_view = metal::transpose(metal::float3x3(_e27.xyz, _e31.xyz, _e35.xyz));\r\n    metal::float4x4 _e40 = r_data.proj_inv;\r\n    metal::float4 unprojected = _e40 * pos;\r\n    const auto _tmp = VertexOutput {pos, inv_model_view * unprojected.xyz};\r\n    return vs_mainOutput { _tmp.position, _tmp.uv };\r\n}\r\n\r\n\r\nstruct fs_mainInput {\r\n    metal::float3 uv [[user(loc0), center_perspective]];\r\n};\r\nstruct fs_mainOutput {\r\n    metal::float4 member_1 [[color(0)]];\r\n};\r\nfragment fs_mainOutput fs_main(\r\n  fs_mainInput varyings_1 [[stage_in]]\r\n, metal::float4 position [[position]]\r\n, metal::texturecube<float, metal::access::sample> r_texture [[texture(0)]]\r\n) {\r\n    constexpr metal::sampler r_sampler(\r\n        metal::s_address::clamp_to_edge,\r\n        metal::t_address::clamp_to_edge,\r\n        metal::r_address::clamp_to_edge,\r\n        metal::mag_filter::linear,\r\n        metal::min_filter::linear,\r\n        metal::coord::normalized\r\n    );\r\n    const VertexOutput in = { position, varyings_1.uv };\r\n    metal::float4 _e5 = r_texture.sample(r_sampler, in.uv);\r\n    return fs_mainOutput { _e5 };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/standard.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nstruct derivativesInput {\r\n};\r\nstruct derivativesOutput {\r\n    metal::float4 member [[color(0)]];\r\n};\r\nfragment derivativesOutput derivatives(\r\n  metal::float4 foo [[position]]\r\n) {\r\n    metal::float4 x = metal::dfdx(foo);\r\n    metal::float4 y = metal::dfdy(foo);\r\n    metal::float4 z = metal::fwidth(foo);\r\n    return derivativesOutput { (x + y) * z };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/msl/texture-arg.msl",
    "content": "// language: metal2.0\r\n#include <metal_stdlib>\r\n#include <simd/simd.h>\r\n\r\nusing metal::uint;\r\n\r\n\r\nmetal::float4 test(\r\n    metal::texture2d<float, metal::access::sample> Passed_Texture,\r\n    metal::sampler Passed_Sampler\r\n) {\r\n    metal::float4 _e7 = Passed_Texture.sample(Passed_Sampler, metal::float2(0.0, 0.0));\r\n    return _e7;\r\n}\r\n\r\nstruct main_Output {\r\n    metal::float4 member [[color(0)]];\r\n};\r\nfragment main_Output main_(\r\n  metal::texture2d<float, metal::access::sample> Texture [[user(fake0)]]\r\n, metal::sampler Sampler [[user(fake0)]]\r\n) {\r\n    metal::float4 _e2 = test(Texture, Sampler);\r\n    return main_Output { _e2 };\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/spv/access.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 320\r\nOpCapability Shader\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %233 \"foo_vert\" %228 %231\r\nOpEntryPoint Fragment %274 \"foo_frag\" %273\r\nOpEntryPoint GLCompute %293 \"atomics\"\r\nOpEntryPoint GLCompute %317 \"assign_through_ptr\"\r\nOpExecutionMode %274 OriginUpperLeft\r\nOpExecutionMode %293 LocalSize 1 1 1\r\nOpExecutionMode %317 LocalSize 1 1 1\r\nOpSource GLSL 450\r\nOpMemberName %36 0 \"a\"\r\nOpMemberName %36 1 \"b\"\r\nOpMemberName %36 2 \"c\"\r\nOpName %36 \"GlobalConst\"\r\nOpMemberName %37 0 \"value\"\r\nOpName %37 \"AlignedWrapper\"\r\nOpMemberName %46 0 \"_matrix\"\r\nOpMemberName %46 1 \"matrix_array\"\r\nOpMemberName %46 2 \"atom\"\r\nOpMemberName %46 3 \"arr\"\r\nOpMemberName %46 4 \"data\"\r\nOpName %46 \"Bar\"\r\nOpMemberName %48 0 \"m\"\r\nOpName %48 \"Baz\"\r\nOpMemberName %52 0 \"am\"\r\nOpName %52 \"MatCx2InArray\"\r\nOpName %68 \"global_const\"\r\nOpName %70 \"bar\"\r\nOpName %72 \"baz\"\r\nOpName %75 \"qux\"\r\nOpName %78 \"nested_mat_cx2\"\r\nOpName %81 \"val\"\r\nOpName %82 \"idx\"\r\nOpName %84 \"t\"\r\nOpName %88 \"test_matrix_within_struct_accesses\"\r\nOpName %146 \"idx\"\r\nOpName %147 \"t\"\r\nOpName %151 \"test_matrix_within_array_within_struct_accesses\"\r\nOpName %206 \"foo\"\r\nOpName %207 \"read_from_private\"\r\nOpName %212 \"a\"\r\nOpName %213 \"test_arr_as_arg\"\r\nOpName %219 \"p\"\r\nOpName %220 \"assign_through_ptr_fn\"\r\nOpName %223 \"foo\"\r\nOpName %224 \"c\"\r\nOpName %228 \"vi\"\r\nOpName %233 \"foo_vert\"\r\nOpName %274 \"foo_frag\"\r\nOpName %290 \"tmp\"\r\nOpName %293 \"atomics\"\r\nOpName %317 \"assign_through_ptr\"\r\nOpMemberDecorate %36 0 Offset 0\r\nOpMemberDecorate %36 1 Offset 16\r\nOpMemberDecorate %36 2 Offset 28\r\nOpMemberDecorate %37 0 Offset 0\r\nOpDecorate %42 ArrayStride 16\r\nOpDecorate %44 ArrayStride 8\r\nOpDecorate %45 ArrayStride 8\r\nOpMemberDecorate %46 0 Offset 0\r\nOpMemberDecorate %46 0 ColMajor\r\nOpMemberDecorate %46 0 MatrixStride 16\r\nOpMemberDecorate %46 1 Offset 64\r\nOpMemberDecorate %46 1 ColMajor\r\nOpMemberDecorate %46 1 MatrixStride 8\r\nOpMemberDecorate %46 2 Offset 96\r\nOpMemberDecorate %46 3 Offset 104\r\nOpMemberDecorate %46 4 Offset 120\r\nOpMemberDecorate %48 0 Offset 0\r\nOpMemberDecorate %48 0 ColMajor\r\nOpMemberDecorate %48 0 MatrixStride 8\r\nOpDecorate %51 ArrayStride 32\r\nOpMemberDecorate %52 0 Offset 0\r\nOpMemberDecorate %52 0 ColMajor\r\nOpMemberDecorate %52 0 MatrixStride 8\r\nOpDecorate %54 ArrayStride 4\r\nOpDecorate %55 ArrayStride 40\r\nOpDecorate %58 ArrayStride 4\r\nOpDecorate %70 DescriptorSet 0\r\nOpDecorate %70 Binding 0\r\nOpDecorate %46 Block\r\nOpDecorate %72 DescriptorSet 0\r\nOpDecorate %72 Binding 1\r\nOpDecorate %73 Block\r\nOpMemberDecorate %73 0 Offset 0\r\nOpDecorate %75 DescriptorSet 0\r\nOpDecorate %75 Binding 2\r\nOpDecorate %76 Block\r\nOpMemberDecorate %76 0 Offset 0\r\nOpDecorate %78 DescriptorSet 0\r\nOpDecorate %78 Binding 3\r\nOpDecorate %79 Block\r\nOpMemberDecorate %79 0 Offset 0\r\nOpDecorate %228 BuiltIn VertexIndex\r\nOpDecorate %231 BuiltIn Position\r\nOpDecorate %273 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 0\r\n%3 = OpConstant  %4  0\r\n%6 = OpTypeInt 32 1\r\n%5 = OpConstant  %6  0\r\n%7 = OpConstant  %6  2\r\n%8 = OpConstant  %6  1\r\n%10 = OpTypeFloat 32\r\n%9 = OpConstant  %10  1.0\r\n%11 = OpConstant  %10  2.0\r\n%12 = OpConstant  %10  3.0\r\n%13 = OpConstant  %10  6.0\r\n%14 = OpConstant  %10  5.0\r\n%15 = OpConstant  %10  4.0\r\n%16 = OpConstant  %10  9.0\r\n%17 = OpConstant  %10  90.0\r\n%18 = OpConstant  %10  10.0\r\n%19 = OpConstant  %10  20.0\r\n%20 = OpConstant  %10  30.0\r\n%21 = OpConstant  %10  40.0\r\n%22 = OpConstant  %10  0.0\r\n%23 = OpConstant  %10  8.0\r\n%24 = OpConstant  %10  7.0\r\n%25 = OpConstant  %6  10\r\n%26 = OpConstant  %6  5\r\n%27 = OpConstant  %6  4\r\n%28 = OpConstant  %6  9\r\n%29 = OpConstant  %4  3\r\n%30 = OpConstant  %4  2\r\n%31 = OpConstant  %6  3\r\n%32 = OpConstant  %4  1\r\n%33 = OpConstant  %6  42\r\n%34 = OpConstant  %4  42\r\n%35 = OpTypeVector %4 3\r\n%36 = OpTypeStruct %4 %35 %6\r\n%37 = OpTypeStruct %6\r\n%39 = OpTypeVector %10 3\r\n%38 = OpTypeMatrix %39 4\r\n%41 = OpTypeVector %10 2\r\n%40 = OpTypeMatrix %41 2\r\n%42 = OpTypeArray %40 %7\r\n%43 = OpTypeVector %4 2\r\n%44 = OpTypeArray %43 %7\r\n%45 = OpTypeRuntimeArray %37\r\n%46 = OpTypeStruct %38 %42 %6 %44 %45\r\n%47 = OpTypeMatrix %41 3\r\n%48 = OpTypeStruct %47\r\n%49 = OpTypeVector %6 2\r\n%50 = OpTypeMatrix %41 4\r\n%51 = OpTypeArray %50 %7\r\n%52 = OpTypeStruct %51\r\n%53 = OpTypePointer Function %10\r\n%54 = OpTypeArray %10 %25\r\n%55 = OpTypeArray %54 %26\r\n%56 = OpTypeVector %10 4\r\n%57 = OpTypePointer StorageBuffer %6\r\n%58 = OpTypeArray %6 %26\r\n%59 = OpTypePointer Workgroup %4\r\n%60 = OpConstantComposite  %35  %3 %3 %3\r\n%61 = OpConstantComposite  %36  %3 %60 %5\r\n%62 = OpConstantComposite  %41  %22 %22\r\n%63 = OpConstantComposite  %50  %62 %62 %62 %62\r\n%64 = OpConstantComposite  %51  %63 %63\r\n%65 = OpConstantComposite  %54  %22 %22 %22 %22 %22 %22 %22 %22 %22 %22\r\n%66 = OpConstantComposite  %55  %65 %65 %65 %65 %65\r\n%67 = OpConstantComposite  %49  %5 %5\r\n%69 = OpTypePointer Private %36\r\n%68 = OpVariable  %69  Private %61\r\n%71 = OpTypePointer StorageBuffer %46\r\n%70 = OpVariable  %71  StorageBuffer\r\n%73 = OpTypeStruct %48\r\n%74 = OpTypePointer Uniform %73\r\n%72 = OpVariable  %74  Uniform\r\n%76 = OpTypeStruct %49\r\n%77 = OpTypePointer StorageBuffer %76\r\n%75 = OpVariable  %77  StorageBuffer\r\n%79 = OpTypeStruct %52\r\n%80 = OpTypePointer Uniform %79\r\n%78 = OpVariable  %80  Uniform\r\n%81 = OpVariable  %59  Workgroup\r\n%83 = OpTypePointer Function %6\r\n%85 = OpTypePointer Function %48\r\n%86 = OpConstantNull  %48\r\n%89 = OpTypeFunction %2\r\n%90 = OpTypePointer Uniform %48\r\n%92 = OpTypePointer StorageBuffer %49\r\n%96 = OpTypePointer Uniform %47\r\n%99 = OpTypePointer Uniform %41\r\n%105 = OpTypePointer Uniform %10\r\n%125 = OpTypePointer Function %47\r\n%131 = OpTypePointer Function %41\r\n%137 = OpTypePointer Function %10\r\n%148 = OpTypePointer Function %52\r\n%149 = OpConstantNull  %52\r\n%152 = OpTypePointer Uniform %52\r\n%157 = OpTypePointer Uniform %51\r\n%160 = OpTypePointer Uniform %50\r\n%183 = OpTypePointer Function %51\r\n%185 = OpTypePointer Function %50\r\n%208 = OpTypeFunction %10 %53\r\n%214 = OpTypeFunction %10 %55\r\n%221 = OpTypeFunction %2 %59\r\n%225 = OpTypePointer Function %58\r\n%226 = OpConstantNull  %58\r\n%229 = OpTypePointer Input %4\r\n%228 = OpVariable  %229  Input\r\n%232 = OpTypePointer Output %56\r\n%231 = OpVariable  %232  Output\r\n%241 = OpTypePointer StorageBuffer %38\r\n%244 = OpTypePointer StorageBuffer %44\r\n%247 = OpTypePointer StorageBuffer %39\r\n%248 = OpTypePointer StorageBuffer %10\r\n%251 = OpTypePointer StorageBuffer %45\r\n%254 = OpTypePointer StorageBuffer %37\r\n%255 = OpConstant  %4  4\r\n%267 = OpTypeVector %6 4\r\n%273 = OpVariable  %232  Output\r\n%291 = OpConstantNull  %6\r\n%295 = OpTypePointer StorageBuffer %6\r\n%298 = OpConstant  %4  64\r\n%88 = OpFunction  %2  None %89\r\n%87 = OpLabel\r\n%82 = OpVariable  %83  Function %8\r\n%84 = OpVariable  %85  Function %86\r\n%91 = OpAccessChain  %90  %72 %3\r\nOpBranch %93\r\n%93 = OpLabel\r\n%94 = OpLoad  %6  %82\r\n%95 = OpISub  %6  %94 %8\r\nOpStore %82 %95\r\n%97 = OpAccessChain  %96  %91 %3\r\n%98 = OpLoad  %47  %97\r\n%100 = OpAccessChain  %99  %91 %3 %3\r\n%101 = OpLoad  %41  %100\r\n%102 = OpLoad  %6  %82\r\n%103 = OpAccessChain  %99  %91 %3 %102\r\n%104 = OpLoad  %41  %103\r\n%106 = OpAccessChain  %105  %91 %3 %3 %32\r\n%107 = OpLoad  %10  %106\r\n%108 = OpLoad  %6  %82\r\n%109 = OpAccessChain  %105  %91 %3 %3 %108\r\n%110 = OpLoad  %10  %109\r\n%111 = OpLoad  %6  %82\r\n%112 = OpAccessChain  %105  %91 %3 %111 %32\r\n%113 = OpLoad  %10  %112\r\n%114 = OpLoad  %6  %82\r\n%115 = OpLoad  %6  %82\r\n%116 = OpAccessChain  %105  %91 %3 %114 %115\r\n%117 = OpLoad  %10  %116\r\n%118 = OpCompositeConstruct  %41  %9 %9\r\n%119 = OpCompositeConstruct  %41  %11 %11\r\n%120 = OpCompositeConstruct  %41  %12 %12\r\n%121 = OpCompositeConstruct  %47  %118 %119 %120\r\n%122 = OpCompositeConstruct  %48  %121\r\nOpStore %84 %122\r\n%123 = OpLoad  %6  %82\r\n%124 = OpIAdd  %6  %123 %8\r\nOpStore %82 %124\r\n%126 = OpCompositeConstruct  %41  %13 %13\r\n%127 = OpCompositeConstruct  %41  %14 %14\r\n%128 = OpCompositeConstruct  %41  %15 %15\r\n%129 = OpCompositeConstruct  %47  %126 %127 %128\r\n%130 = OpAccessChain  %125  %84 %3\r\nOpStore %130 %129\r\n%132 = OpCompositeConstruct  %41  %16 %16\r\n%133 = OpAccessChain  %131  %84 %3 %3\r\nOpStore %133 %132\r\n%134 = OpLoad  %6  %82\r\n%135 = OpCompositeConstruct  %41  %17 %17\r\n%136 = OpAccessChain  %131  %84 %3 %134\r\nOpStore %136 %135\r\n%138 = OpAccessChain  %137  %84 %3 %3 %32\r\nOpStore %138 %18\r\n%139 = OpLoad  %6  %82\r\n%140 = OpAccessChain  %137  %84 %3 %3 %139\r\nOpStore %140 %19\r\n%141 = OpLoad  %6  %82\r\n%142 = OpAccessChain  %137  %84 %3 %141 %32\r\nOpStore %142 %20\r\n%143 = OpLoad  %6  %82\r\n%144 = OpLoad  %6  %82\r\n%145 = OpAccessChain  %137  %84 %3 %143 %144\r\nOpStore %145 %21\r\nOpReturn\r\nOpFunctionEnd\r\n%151 = OpFunction  %2  None %89\r\n%150 = OpLabel\r\n%146 = OpVariable  %83  Function %8\r\n%147 = OpVariable  %148  Function %149\r\n%153 = OpAccessChain  %152  %78 %3\r\nOpBranch %154\r\n%154 = OpLabel\r\n%155 = OpLoad  %6  %146\r\n%156 = OpISub  %6  %155 %8\r\nOpStore %146 %156\r\n%158 = OpAccessChain  %157  %153 %3\r\n%159 = OpLoad  %51  %158\r\n%161 = OpAccessChain  %160  %153 %3 %3\r\n%162 = OpLoad  %50  %161\r\n%163 = OpAccessChain  %99  %153 %3 %3 %3\r\n%164 = OpLoad  %41  %163\r\n%165 = OpLoad  %6  %146\r\n%166 = OpAccessChain  %99  %153 %3 %3 %165\r\n%167 = OpLoad  %41  %166\r\n%168 = OpAccessChain  %105  %153 %3 %3 %3 %32\r\n%169 = OpLoad  %10  %168\r\n%170 = OpLoad  %6  %146\r\n%171 = OpAccessChain  %105  %153 %3 %3 %3 %170\r\n%172 = OpLoad  %10  %171\r\n%173 = OpLoad  %6  %146\r\n%174 = OpAccessChain  %105  %153 %3 %3 %173 %32\r\n%175 = OpLoad  %10  %174\r\n%176 = OpLoad  %6  %146\r\n%177 = OpLoad  %6  %146\r\n%178 = OpAccessChain  %105  %153 %3 %3 %176 %177\r\n%179 = OpLoad  %10  %178\r\n%180 = OpCompositeConstruct  %52  %64\r\nOpStore %147 %180\r\n%181 = OpLoad  %6  %146\r\n%182 = OpIAdd  %6  %181 %8\r\nOpStore %146 %182\r\n%184 = OpAccessChain  %183  %147 %3\r\nOpStore %184 %64\r\n%186 = OpCompositeConstruct  %41  %23 %23\r\n%187 = OpCompositeConstruct  %41  %24 %24\r\n%188 = OpCompositeConstruct  %41  %13 %13\r\n%189 = OpCompositeConstruct  %41  %14 %14\r\n%190 = OpCompositeConstruct  %50  %186 %187 %188 %189\r\n%191 = OpAccessChain  %185  %147 %3 %3\r\nOpStore %191 %190\r\n%192 = OpCompositeConstruct  %41  %16 %16\r\n%193 = OpAccessChain  %131  %147 %3 %3 %3\r\nOpStore %193 %192\r\n%194 = OpLoad  %6  %146\r\n%195 = OpCompositeConstruct  %41  %17 %17\r\n%196 = OpAccessChain  %131  %147 %3 %3 %194\r\nOpStore %196 %195\r\n%197 = OpAccessChain  %137  %147 %3 %3 %3 %32\r\nOpStore %197 %18\r\n%198 = OpLoad  %6  %146\r\n%199 = OpAccessChain  %137  %147 %3 %3 %3 %198\r\nOpStore %199 %19\r\n%200 = OpLoad  %6  %146\r\n%201 = OpAccessChain  %137  %147 %3 %3 %200 %32\r\nOpStore %201 %20\r\n%202 = OpLoad  %6  %146\r\n%203 = OpLoad  %6  %146\r\n%204 = OpAccessChain  %137  %147 %3 %3 %202 %203\r\nOpStore %204 %21\r\nOpReturn\r\nOpFunctionEnd\r\n%207 = OpFunction  %10  None %208\r\n%206 = OpFunctionParameter  %53\r\n%205 = OpLabel\r\nOpBranch %209\r\n%209 = OpLabel\r\n%210 = OpLoad  %10  %206\r\nOpReturnValue %210\r\nOpFunctionEnd\r\n%213 = OpFunction  %10  None %214\r\n%212 = OpFunctionParameter  %55\r\n%211 = OpLabel\r\nOpBranch %215\r\n%215 = OpLabel\r\n%216 = OpCompositeExtract  %54  %212 4\r\n%217 = OpCompositeExtract  %10  %216 9\r\nOpReturnValue %217\r\nOpFunctionEnd\r\n%220 = OpFunction  %2  None %221\r\n%219 = OpFunctionParameter  %59\r\n%218 = OpLabel\r\nOpBranch %222\r\n%222 = OpLabel\r\nOpStore %219 %34\r\nOpReturn\r\nOpFunctionEnd\r\n%233 = OpFunction  %2  None %89\r\n%227 = OpLabel\r\n%223 = OpVariable  %53  Function %22\r\n%224 = OpVariable  %225  Function %226\r\n%230 = OpLoad  %4  %228\r\n%234 = OpAccessChain  %90  %72 %3\r\n%235 = OpAccessChain  %92  %75 %3\r\n%236 = OpAccessChain  %152  %78 %3\r\nOpBranch %237\r\n%237 = OpLabel\r\n%238 = OpLoad  %10  %223\r\nOpStore %223 %9\r\n%239 = OpFunctionCall  %2  %88\r\n%240 = OpFunctionCall  %2  %151\r\n%242 = OpAccessChain  %241  %70 %3\r\n%243 = OpLoad  %38  %242\r\n%245 = OpAccessChain  %244  %70 %29\r\n%246 = OpLoad  %44  %245\r\n%249 = OpAccessChain  %248  %70 %3 %29 %3\r\n%250 = OpLoad  %10  %249\r\n%252 = OpArrayLength  %4  %70 4\r\n%253 = OpISub  %4  %252 %30\r\n%256 = OpAccessChain  %57  %70 %255 %253 %3\r\n%257 = OpLoad  %6  %256\r\n%258 = OpLoad  %49  %235\r\n%259 = OpFunctionCall  %10  %207 %223\r\n%260 = OpConvertFToS  %6  %250\r\n%261 = OpCompositeConstruct  %58  %257 %260 %31 %27 %26\r\nOpStore %224 %261\r\n%262 = OpIAdd  %4  %230 %32\r\n%263 = OpAccessChain  %83  %224 %262\r\nOpStore %263 %33\r\n%264 = OpAccessChain  %83  %224 %230\r\n%265 = OpLoad  %6  %264\r\n%266 = OpFunctionCall  %10  %213 %66\r\n%268 = OpCompositeConstruct  %267  %265 %265 %265 %265\r\n%269 = OpConvertSToF  %56  %268\r\n%270 = OpMatrixTimesVector  %39  %243 %269\r\n%271 = OpCompositeConstruct  %56  %270 %11\r\nOpStore %231 %271\r\nOpReturn\r\nOpFunctionEnd\r\n%274 = OpFunction  %2  None %89\r\n%272 = OpLabel\r\n%275 = OpAccessChain  %92  %75 %3\r\nOpBranch %276\r\n%276 = OpLabel\r\n%277 = OpAccessChain  %248  %70 %3 %32 %30\r\nOpStore %277 %9\r\n%278 = OpCompositeConstruct  %39  %22 %22 %22\r\n%279 = OpCompositeConstruct  %39  %9 %9 %9\r\n%280 = OpCompositeConstruct  %39  %11 %11 %11\r\n%281 = OpCompositeConstruct  %39  %12 %12 %12\r\n%282 = OpCompositeConstruct  %38  %278 %279 %280 %281\r\n%283 = OpAccessChain  %241  %70 %3\r\nOpStore %283 %282\r\n%284 = OpCompositeConstruct  %43  %3 %3\r\n%285 = OpCompositeConstruct  %43  %32 %32\r\n%286 = OpCompositeConstruct  %44  %284 %285\r\n%287 = OpAccessChain  %244  %70 %29\r\nOpStore %287 %286\r\n%288 = OpAccessChain  %57  %70 %255 %32 %3\r\nOpStore %288 %8\r\nOpStore %275 %67\r\n%289 = OpCompositeConstruct  %56  %22 %22 %22 %22\r\nOpStore %273 %289\r\nOpReturn\r\nOpFunctionEnd\r\n%293 = OpFunction  %2  None %89\r\n%292 = OpLabel\r\n%290 = OpVariable  %83  Function %291\r\nOpBranch %294\r\n%294 = OpLabel\r\n%296 = OpAccessChain  %295  %70 %30\r\n%297 = OpAtomicLoad  %6  %296 %8 %298\r\n%300 = OpAccessChain  %295  %70 %30\r\n%299 = OpAtomicIAdd  %6  %300 %8 %298 %26\r\nOpStore %290 %299\r\n%302 = OpAccessChain  %295  %70 %30\r\n%301 = OpAtomicISub  %6  %302 %8 %298 %26\r\nOpStore %290 %301\r\n%304 = OpAccessChain  %295  %70 %30\r\n%303 = OpAtomicAnd  %6  %304 %8 %298 %26\r\nOpStore %290 %303\r\n%306 = OpAccessChain  %295  %70 %30\r\n%305 = OpAtomicOr  %6  %306 %8 %298 %26\r\nOpStore %290 %305\r\n%308 = OpAccessChain  %295  %70 %30\r\n%307 = OpAtomicXor  %6  %308 %8 %298 %26\r\nOpStore %290 %307\r\n%310 = OpAccessChain  %295  %70 %30\r\n%309 = OpAtomicSMin  %6  %310 %8 %298 %26\r\nOpStore %290 %309\r\n%312 = OpAccessChain  %295  %70 %30\r\n%311 = OpAtomicSMax  %6  %312 %8 %298 %26\r\nOpStore %290 %311\r\n%314 = OpAccessChain  %295  %70 %30\r\n%313 = OpAtomicExchange  %6  %314 %8 %298 %26\r\nOpStore %290 %313\r\n%315 = OpAccessChain  %295  %70 %30\r\nOpAtomicStore %315 %8 %298 %297\r\nOpReturn\r\nOpFunctionEnd\r\n%317 = OpFunction  %2  None %89\r\n%316 = OpLabel\r\nOpBranch %318\r\n%318 = OpLabel\r\n%319 = OpFunctionCall  %2  %220 %81\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/binding-arrays.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 431\r\nOpCapability Shader\r\nOpCapability ImageQuery\r\nOpCapability ShaderNonUniform\r\nOpExtension \"SPV_EXT_descriptor_indexing\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %65 \"main\" %60 %63\r\nOpExecutionMode %65 OriginUpperLeft\r\nOpMemberDecorate %9 0 Offset 0\r\nOpMemberDecorate %24 0 Offset 0\r\nOpDecorate %27 DescriptorSet 0\r\nOpDecorate %27 Binding 0\r\nOpDecorate %31 DescriptorSet 0\r\nOpDecorate %31 Binding 1\r\nOpDecorate %33 DescriptorSet 0\r\nOpDecorate %33 Binding 2\r\nOpDecorate %35 DescriptorSet 0\r\nOpDecorate %35 Binding 3\r\nOpDecorate %37 DescriptorSet 0\r\nOpDecorate %37 Binding 4\r\nOpDecorate %39 DescriptorSet 0\r\nOpDecorate %39 Binding 5\r\nOpDecorate %41 DescriptorSet 0\r\nOpDecorate %41 Binding 6\r\nOpDecorate %43 DescriptorSet 0\r\nOpDecorate %43 Binding 7\r\nOpDecorate %45 DescriptorSet 0\r\nOpDecorate %45 Binding 8\r\nOpDecorate %46 Block\r\nOpMemberDecorate %46 0 Offset 0\r\nOpDecorate %60 Location 0\r\nOpDecorate %60 Flat\r\nOpDecorate %63 Location 0\r\nOpDecorate %93 NonUniform\r\nOpDecorate %116 NonUniform\r\nOpDecorate %118 NonUniform\r\nOpDecorate %143 NonUniform\r\nOpDecorate %145 NonUniform\r\nOpDecorate %183 NonUniform\r\nOpDecorate %212 NonUniform\r\nOpDecorate %228 NonUniform\r\nOpDecorate %244 NonUniform\r\nOpDecorate %265 NonUniform\r\nOpDecorate %267 NonUniform\r\nOpDecorate %289 NonUniform\r\nOpDecorate %291 NonUniform\r\nOpDecorate %313 NonUniform\r\nOpDecorate %315 NonUniform\r\nOpDecorate %337 NonUniform\r\nOpDecorate %339 NonUniform\r\nOpDecorate %361 NonUniform\r\nOpDecorate %363 NonUniform\r\nOpDecorate %385 NonUniform\r\nOpDecorate %387 NonUniform\r\nOpDecorate %409 NonUniform\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  5\r\n%5 = OpConstant  %4  0\r\n%7 = OpTypeFloat 32\r\n%6 = OpConstant  %7  0.0\r\n%8 = OpTypeInt 32 0\r\n%9 = OpTypeStruct %8\r\n%10 = OpTypeImage %7 2D 0 0 0 1 Unknown\r\n%11 = OpTypeRuntimeArray %10\r\n%12 = OpTypeArray %10 %3\r\n%13 = OpTypeImage %7 2D 0 1 0 1 Unknown\r\n%14 = OpTypeArray %13 %3\r\n%15 = OpTypeImage %7 2D 0 0 1 1 Unknown\r\n%16 = OpTypeArray %15 %3\r\n%17 = OpTypeImage %7 2D 1 0 0 1 Unknown\r\n%18 = OpTypeArray %17 %3\r\n%19 = OpTypeImage %7 2D 0 0 0 2 Rgba32f\r\n%20 = OpTypeArray %19 %3\r\n%21 = OpTypeSampler\r\n%22 = OpTypeArray %21 %3\r\n%23 = OpTypeArray %21 %3\r\n%24 = OpTypeStruct %8\r\n%25 = OpTypeVector %7 4\r\n%26 = OpTypeVector %4 2\r\n%30 = OpConstant  %8  10\r\n%29 = OpTypeArray %10 %30\r\n%28 = OpTypePointer UniformConstant %29\r\n%27 = OpVariable  %28  UniformConstant\r\n%32 = OpTypePointer UniformConstant %12\r\n%31 = OpVariable  %32  UniformConstant\r\n%34 = OpTypePointer UniformConstant %14\r\n%33 = OpVariable  %34  UniformConstant\r\n%36 = OpTypePointer UniformConstant %16\r\n%35 = OpVariable  %36  UniformConstant\r\n%38 = OpTypePointer UniformConstant %18\r\n%37 = OpVariable  %38  UniformConstant\r\n%40 = OpTypePointer UniformConstant %20\r\n%39 = OpVariable  %40  UniformConstant\r\n%42 = OpTypePointer UniformConstant %22\r\n%41 = OpVariable  %42  UniformConstant\r\n%44 = OpTypePointer UniformConstant %23\r\n%43 = OpVariable  %44  UniformConstant\r\n%46 = OpTypeStruct %9\r\n%47 = OpTypePointer Uniform %46\r\n%45 = OpVariable  %47  Uniform\r\n%49 = OpTypePointer Function %4\r\n%51 = OpTypePointer Function %26\r\n%52 = OpConstantNull  %26\r\n%54 = OpTypePointer Function %7\r\n%56 = OpTypePointer Function %25\r\n%57 = OpConstantNull  %25\r\n%61 = OpTypePointer Input %8\r\n%60 = OpVariable  %61  Input\r\n%64 = OpTypePointer Output %25\r\n%63 = OpVariable  %64  Output\r\n%66 = OpTypeFunction %2\r\n%67 = OpTypePointer Uniform %9\r\n%68 = OpConstant  %8  0\r\n%71 = OpTypePointer Uniform %8\r\n%77 = OpTypeVector %7 2\r\n%81 = OpTypePointer UniformConstant %10\r\n%99 = OpTypePointer UniformConstant %21\r\n%102 = OpTypeSampledImage %10\r\n%123 = OpTypePointer UniformConstant %17\r\n%126 = OpTypePointer UniformConstant %21\r\n%129 = OpTypeSampledImage %17\r\n%152 = OpTypeBool\r\n%153 = OpConstantNull  %25\r\n%159 = OpTypeVector %152 2\r\n%169 = OpConstantNull  %25\r\n%184 = OpConstantNull  %25\r\n%197 = OpTypePointer UniformConstant %13\r\n%200 = OpTypeVector %4 3\r\n%232 = OpTypePointer UniformConstant %15\r\n%391 = OpTypePointer UniformConstant %19\r\n%65 = OpFunction  %2  None %66\r\n%58 = OpLabel\r\n%50 = OpVariable  %51  Function %52\r\n%55 = OpVariable  %56  Function %57\r\n%48 = OpVariable  %49  Function %5\r\n%53 = OpVariable  %54  Function %6\r\n%62 = OpLoad  %8  %60\r\n%59 = OpCompositeConstruct  %24  %62\r\n%69 = OpAccessChain  %67  %45 %68\r\nOpBranch %70\r\n%70 = OpLabel\r\n%72 = OpAccessChain  %71  %69 %68\r\n%73 = OpLoad  %8  %72\r\n%74 = OpCompositeExtract  %8  %59 0\r\n%75 = OpCompositeConstruct  %26  %5 %5\r\nOpStore %50 %75\r\n%76 = OpCompositeConstruct  %25  %6 %6 %6 %6\r\nOpStore %55 %76\r\n%78 = OpCompositeConstruct  %77  %6 %6\r\n%79 = OpCompositeConstruct  %26  %5 %5\r\n%80 = OpLoad  %26  %50\r\n%82 = OpAccessChain  %81  %27 %68\r\n%83 = OpLoad  %10  %82\r\n%84 = OpImageQuerySizeLod  %26  %83 %68\r\n%85 = OpIAdd  %26  %80 %84\r\nOpStore %50 %85\r\n%86 = OpLoad  %26  %50\r\n%87 = OpAccessChain  %81  %27 %73\r\n%88 = OpLoad  %10  %87\r\n%89 = OpImageQuerySizeLod  %26  %88 %68\r\n%90 = OpIAdd  %26  %86 %89\r\nOpStore %50 %90\r\n%91 = OpLoad  %26  %50\r\n%92 = OpAccessChain  %81  %27 %74\r\n%93 = OpLoad  %10  %92\r\n%94 = OpImageQuerySizeLod  %26  %93 %68\r\n%95 = OpIAdd  %26  %91 %94\r\nOpStore %50 %95\r\n%96 = OpLoad  %25  %55\r\n%97 = OpAccessChain  %81  %31 %68\r\n%98 = OpLoad  %10  %97\r\n%100 = OpAccessChain  %99  %41 %68\r\n%101 = OpLoad  %21  %100\r\n%103 = OpSampledImage  %102  %98 %101\r\n%104 = OpImageGather  %25  %103 %78 %68\r\n%105 = OpFAdd  %25  %96 %104\r\nOpStore %55 %105\r\n%106 = OpLoad  %25  %55\r\n%107 = OpAccessChain  %81  %31 %73\r\n%108 = OpLoad  %10  %107\r\n%109 = OpAccessChain  %99  %41 %73\r\n%110 = OpLoad  %21  %109\r\n%111 = OpSampledImage  %102  %108 %110\r\n%112 = OpImageGather  %25  %111 %78 %68\r\n%113 = OpFAdd  %25  %106 %112\r\nOpStore %55 %113\r\n%114 = OpLoad  %25  %55\r\n%115 = OpAccessChain  %81  %31 %74\r\n%116 = OpLoad  %10  %115\r\n%117 = OpAccessChain  %99  %41 %74\r\n%118 = OpLoad  %21  %117\r\n%119 = OpSampledImage  %102  %116 %118\r\n%120 = OpImageGather  %25  %119 %78 %68\r\n%121 = OpFAdd  %25  %114 %120\r\nOpStore %55 %121\r\n%122 = OpLoad  %25  %55\r\n%124 = OpAccessChain  %123  %37 %68\r\n%125 = OpLoad  %17  %124\r\n%127 = OpAccessChain  %126  %43 %68\r\n%128 = OpLoad  %21  %127\r\n%130 = OpSampledImage  %129  %125 %128\r\n%131 = OpImageDrefGather  %25  %130 %78 %6\r\n%132 = OpFAdd  %25  %122 %131\r\nOpStore %55 %132\r\n%133 = OpLoad  %25  %55\r\n%134 = OpAccessChain  %123  %37 %73\r\n%135 = OpLoad  %17  %134\r\n%136 = OpAccessChain  %126  %43 %73\r\n%137 = OpLoad  %21  %136\r\n%138 = OpSampledImage  %129  %135 %137\r\n%139 = OpImageDrefGather  %25  %138 %78 %6\r\n%140 = OpFAdd  %25  %133 %139\r\nOpStore %55 %140\r\n%141 = OpLoad  %25  %55\r\n%142 = OpAccessChain  %123  %37 %74\r\n%143 = OpLoad  %17  %142\r\n%144 = OpAccessChain  %126  %43 %74\r\n%145 = OpLoad  %21  %144\r\n%146 = OpSampledImage  %129  %143 %145\r\n%147 = OpImageDrefGather  %25  %146 %78 %6\r\n%148 = OpFAdd  %25  %141 %147\r\nOpStore %55 %148\r\n%149 = OpLoad  %25  %55\r\n%150 = OpAccessChain  %81  %27 %68\r\n%151 = OpLoad  %10  %150\r\n%154 = OpImageQueryLevels  %4  %151\r\n%155 = OpULessThan  %152  %5 %154\r\nOpSelectionMerge %156 None\r\nOpBranchConditional %155 %157 %156\r\n%157 = OpLabel\r\n%158 = OpImageQuerySizeLod  %26  %151 %5\r\n%160 = OpULessThan  %159  %79 %158\r\n%161 = OpAll  %152  %160\r\nOpBranchConditional %161 %162 %156\r\n%162 = OpLabel\r\n%163 = OpImageFetch  %25  %151 %79 Lod %5\r\nOpBranch %156\r\n%156 = OpLabel\r\n%164 = OpPhi  %25  %153 %70 %153 %157 %163 %162\r\n%165 = OpFAdd  %25  %149 %164\r\nOpStore %55 %165\r\n%166 = OpLoad  %25  %55\r\n%167 = OpAccessChain  %81  %27 %73\r\n%168 = OpLoad  %10  %167\r\n%170 = OpImageQueryLevels  %4  %168\r\n%171 = OpULessThan  %152  %5 %170\r\nOpSelectionMerge %172 None\r\nOpBranchConditional %171 %173 %172\r\n%173 = OpLabel\r\n%174 = OpImageQuerySizeLod  %26  %168 %5\r\n%175 = OpULessThan  %159  %79 %174\r\n%176 = OpAll  %152  %175\r\nOpBranchConditional %176 %177 %172\r\n%177 = OpLabel\r\n%178 = OpImageFetch  %25  %168 %79 Lod %5\r\nOpBranch %172\r\n%172 = OpLabel\r\n%179 = OpPhi  %25  %169 %156 %169 %173 %178 %177\r\n%180 = OpFAdd  %25  %166 %179\r\nOpStore %55 %180\r\n%181 = OpLoad  %25  %55\r\n%182 = OpAccessChain  %81  %27 %74\r\n%183 = OpLoad  %10  %182\r\n%185 = OpImageQueryLevels  %4  %183\r\n%186 = OpULessThan  %152  %5 %185\r\nOpSelectionMerge %187 None\r\nOpBranchConditional %186 %188 %187\r\n%188 = OpLabel\r\n%189 = OpImageQuerySizeLod  %26  %183 %5\r\n%190 = OpULessThan  %159  %79 %189\r\n%191 = OpAll  %152  %190\r\nOpBranchConditional %191 %192 %187\r\n%192 = OpLabel\r\n%193 = OpImageFetch  %25  %183 %79 Lod %5\r\nOpBranch %187\r\n%187 = OpLabel\r\n%194 = OpPhi  %25  %184 %172 %184 %188 %193 %192\r\n%195 = OpFAdd  %25  %181 %194\r\nOpStore %55 %195\r\n%196 = OpLoad  %4  %48\r\n%198 = OpAccessChain  %197  %33 %68\r\n%199 = OpLoad  %13  %198\r\n%201 = OpImageQuerySizeLod  %200  %199 %68\r\n%202 = OpCompositeExtract  %4  %201 2\r\n%203 = OpIAdd  %4  %196 %202\r\nOpStore %48 %203\r\n%204 = OpLoad  %4  %48\r\n%205 = OpAccessChain  %197  %33 %73\r\n%206 = OpLoad  %13  %205\r\n%207 = OpImageQuerySizeLod  %200  %206 %68\r\n%208 = OpCompositeExtract  %4  %207 2\r\n%209 = OpIAdd  %4  %204 %208\r\nOpStore %48 %209\r\n%210 = OpLoad  %4  %48\r\n%211 = OpAccessChain  %197  %33 %74\r\n%212 = OpLoad  %13  %211\r\n%213 = OpImageQuerySizeLod  %200  %212 %68\r\n%214 = OpCompositeExtract  %4  %213 2\r\n%215 = OpIAdd  %4  %210 %214\r\nOpStore %48 %215\r\n%216 = OpLoad  %4  %48\r\n%217 = OpAccessChain  %81  %31 %68\r\n%218 = OpLoad  %10  %217\r\n%219 = OpImageQueryLevels  %4  %218\r\n%220 = OpIAdd  %4  %216 %219\r\nOpStore %48 %220\r\n%221 = OpLoad  %4  %48\r\n%222 = OpAccessChain  %81  %31 %73\r\n%223 = OpLoad  %10  %222\r\n%224 = OpImageQueryLevels  %4  %223\r\n%225 = OpIAdd  %4  %221 %224\r\nOpStore %48 %225\r\n%226 = OpLoad  %4  %48\r\n%227 = OpAccessChain  %81  %31 %74\r\n%228 = OpLoad  %10  %227\r\n%229 = OpImageQueryLevels  %4  %228\r\n%230 = OpIAdd  %4  %226 %229\r\nOpStore %48 %230\r\n%231 = OpLoad  %4  %48\r\n%233 = OpAccessChain  %232  %35 %68\r\n%234 = OpLoad  %15  %233\r\n%235 = OpImageQuerySamples  %4  %234\r\n%236 = OpIAdd  %4  %231 %235\r\nOpStore %48 %236\r\n%237 = OpLoad  %4  %48\r\n%238 = OpAccessChain  %232  %35 %73\r\n%239 = OpLoad  %15  %238\r\n%240 = OpImageQuerySamples  %4  %239\r\n%241 = OpIAdd  %4  %237 %240\r\nOpStore %48 %241\r\n%242 = OpLoad  %4  %48\r\n%243 = OpAccessChain  %232  %35 %74\r\n%244 = OpLoad  %15  %243\r\n%245 = OpImageQuerySamples  %4  %244\r\n%246 = OpIAdd  %4  %242 %245\r\nOpStore %48 %246\r\n%247 = OpLoad  %25  %55\r\n%248 = OpAccessChain  %81  %31 %68\r\n%249 = OpLoad  %10  %248\r\n%250 = OpAccessChain  %99  %41 %68\r\n%251 = OpLoad  %21  %250\r\n%252 = OpSampledImage  %102  %249 %251\r\n%253 = OpImageSampleImplicitLod  %25  %252 %78\r\n%254 = OpFAdd  %25  %247 %253\r\nOpStore %55 %254\r\n%255 = OpLoad  %25  %55\r\n%256 = OpAccessChain  %81  %31 %73\r\n%257 = OpLoad  %10  %256\r\n%258 = OpAccessChain  %99  %41 %73\r\n%259 = OpLoad  %21  %258\r\n%260 = OpSampledImage  %102  %257 %259\r\n%261 = OpImageSampleImplicitLod  %25  %260 %78\r\n%262 = OpFAdd  %25  %255 %261\r\nOpStore %55 %262\r\n%263 = OpLoad  %25  %55\r\n%264 = OpAccessChain  %81  %31 %74\r\n%265 = OpLoad  %10  %264\r\n%266 = OpAccessChain  %99  %41 %74\r\n%267 = OpLoad  %21  %266\r\n%268 = OpSampledImage  %102  %265 %267\r\n%269 = OpImageSampleImplicitLod  %25  %268 %78\r\n%270 = OpFAdd  %25  %263 %269\r\nOpStore %55 %270\r\n%271 = OpLoad  %25  %55\r\n%272 = OpAccessChain  %81  %31 %68\r\n%273 = OpLoad  %10  %272\r\n%274 = OpAccessChain  %99  %41 %68\r\n%275 = OpLoad  %21  %274\r\n%276 = OpSampledImage  %102  %273 %275\r\n%277 = OpImageSampleImplicitLod  %25  %276 %78 Bias %6\r\n%278 = OpFAdd  %25  %271 %277\r\nOpStore %55 %278\r\n%279 = OpLoad  %25  %55\r\n%280 = OpAccessChain  %81  %31 %73\r\n%281 = OpLoad  %10  %280\r\n%282 = OpAccessChain  %99  %41 %73\r\n%283 = OpLoad  %21  %282\r\n%284 = OpSampledImage  %102  %281 %283\r\n%285 = OpImageSampleImplicitLod  %25  %284 %78 Bias %6\r\n%286 = OpFAdd  %25  %279 %285\r\nOpStore %55 %286\r\n%287 = OpLoad  %25  %55\r\n%288 = OpAccessChain  %81  %31 %74\r\n%289 = OpLoad  %10  %288\r\n%290 = OpAccessChain  %99  %41 %74\r\n%291 = OpLoad  %21  %290\r\n%292 = OpSampledImage  %102  %289 %291\r\n%293 = OpImageSampleImplicitLod  %25  %292 %78 Bias %6\r\n%294 = OpFAdd  %25  %287 %293\r\nOpStore %55 %294\r\n%295 = OpLoad  %7  %53\r\n%296 = OpAccessChain  %123  %37 %68\r\n%297 = OpLoad  %17  %296\r\n%298 = OpAccessChain  %126  %43 %68\r\n%299 = OpLoad  %21  %298\r\n%300 = OpSampledImage  %129  %297 %299\r\n%301 = OpImageSampleDrefImplicitLod  %7  %300 %78 %6\r\n%302 = OpFAdd  %7  %295 %301\r\nOpStore %53 %302\r\n%303 = OpLoad  %7  %53\r\n%304 = OpAccessChain  %123  %37 %73\r\n%305 = OpLoad  %17  %304\r\n%306 = OpAccessChain  %126  %43 %73\r\n%307 = OpLoad  %21  %306\r\n%308 = OpSampledImage  %129  %305 %307\r\n%309 = OpImageSampleDrefImplicitLod  %7  %308 %78 %6\r\n%310 = OpFAdd  %7  %303 %309\r\nOpStore %53 %310\r\n%311 = OpLoad  %7  %53\r\n%312 = OpAccessChain  %123  %37 %74\r\n%313 = OpLoad  %17  %312\r\n%314 = OpAccessChain  %126  %43 %74\r\n%315 = OpLoad  %21  %314\r\n%316 = OpSampledImage  %129  %313 %315\r\n%317 = OpImageSampleDrefImplicitLod  %7  %316 %78 %6\r\n%318 = OpFAdd  %7  %311 %317\r\nOpStore %53 %318\r\n%319 = OpLoad  %7  %53\r\n%320 = OpAccessChain  %123  %37 %68\r\n%321 = OpLoad  %17  %320\r\n%322 = OpAccessChain  %126  %43 %68\r\n%323 = OpLoad  %21  %322\r\n%324 = OpSampledImage  %129  %321 %323\r\n%325 = OpImageSampleDrefExplicitLod  %7  %324 %78 %6 Lod %6\r\n%326 = OpFAdd  %7  %319 %325\r\nOpStore %53 %326\r\n%327 = OpLoad  %7  %53\r\n%328 = OpAccessChain  %123  %37 %73\r\n%329 = OpLoad  %17  %328\r\n%330 = OpAccessChain  %126  %43 %73\r\n%331 = OpLoad  %21  %330\r\n%332 = OpSampledImage  %129  %329 %331\r\n%333 = OpImageSampleDrefExplicitLod  %7  %332 %78 %6 Lod %6\r\n%334 = OpFAdd  %7  %327 %333\r\nOpStore %53 %334\r\n%335 = OpLoad  %7  %53\r\n%336 = OpAccessChain  %123  %37 %74\r\n%337 = OpLoad  %17  %336\r\n%338 = OpAccessChain  %126  %43 %74\r\n%339 = OpLoad  %21  %338\r\n%340 = OpSampledImage  %129  %337 %339\r\n%341 = OpImageSampleDrefExplicitLod  %7  %340 %78 %6 Lod %6\r\n%342 = OpFAdd  %7  %335 %341\r\nOpStore %53 %342\r\n%343 = OpLoad  %25  %55\r\n%344 = OpAccessChain  %81  %31 %68\r\n%345 = OpLoad  %10  %344\r\n%346 = OpAccessChain  %99  %41 %68\r\n%347 = OpLoad  %21  %346\r\n%348 = OpSampledImage  %102  %345 %347\r\n%349 = OpImageSampleExplicitLod  %25  %348 %78 Grad %78 %78\r\n%350 = OpFAdd  %25  %343 %349\r\nOpStore %55 %350\r\n%351 = OpLoad  %25  %55\r\n%352 = OpAccessChain  %81  %31 %73\r\n%353 = OpLoad  %10  %352\r\n%354 = OpAccessChain  %99  %41 %73\r\n%355 = OpLoad  %21  %354\r\n%356 = OpSampledImage  %102  %353 %355\r\n%357 = OpImageSampleExplicitLod  %25  %356 %78 Grad %78 %78\r\n%358 = OpFAdd  %25  %351 %357\r\nOpStore %55 %358\r\n%359 = OpLoad  %25  %55\r\n%360 = OpAccessChain  %81  %31 %74\r\n%361 = OpLoad  %10  %360\r\n%362 = OpAccessChain  %99  %41 %74\r\n%363 = OpLoad  %21  %362\r\n%364 = OpSampledImage  %102  %361 %363\r\n%365 = OpImageSampleExplicitLod  %25  %364 %78 Grad %78 %78\r\n%366 = OpFAdd  %25  %359 %365\r\nOpStore %55 %366\r\n%367 = OpLoad  %25  %55\r\n%368 = OpAccessChain  %81  %31 %68\r\n%369 = OpLoad  %10  %368\r\n%370 = OpAccessChain  %99  %41 %68\r\n%371 = OpLoad  %21  %370\r\n%372 = OpSampledImage  %102  %369 %371\r\n%373 = OpImageSampleExplicitLod  %25  %372 %78 Lod %6\r\n%374 = OpFAdd  %25  %367 %373\r\nOpStore %55 %374\r\n%375 = OpLoad  %25  %55\r\n%376 = OpAccessChain  %81  %31 %73\r\n%377 = OpLoad  %10  %376\r\n%378 = OpAccessChain  %99  %41 %73\r\n%379 = OpLoad  %21  %378\r\n%380 = OpSampledImage  %102  %377 %379\r\n%381 = OpImageSampleExplicitLod  %25  %380 %78 Lod %6\r\n%382 = OpFAdd  %25  %375 %381\r\nOpStore %55 %382\r\n%383 = OpLoad  %25  %55\r\n%384 = OpAccessChain  %81  %31 %74\r\n%385 = OpLoad  %10  %384\r\n%386 = OpAccessChain  %99  %41 %74\r\n%387 = OpLoad  %21  %386\r\n%388 = OpSampledImage  %102  %385 %387\r\n%389 = OpImageSampleExplicitLod  %25  %388 %78 Lod %6\r\n%390 = OpFAdd  %25  %383 %389\r\nOpStore %55 %390\r\n%392 = OpAccessChain  %391  %39 %68\r\n%393 = OpLoad  %19  %392\r\n%394 = OpLoad  %25  %55\r\n%395 = OpImageQuerySize  %26  %393\r\n%396 = OpULessThan  %159  %79 %395\r\n%397 = OpAll  %152  %396\r\nOpSelectionMerge %398 None\r\nOpBranchConditional %397 %399 %398\r\n%399 = OpLabel\r\nOpImageWrite %393 %79 %394\r\nOpBranch %398\r\n%398 = OpLabel\r\n%400 = OpAccessChain  %391  %39 %73\r\n%401 = OpLoad  %19  %400\r\n%402 = OpLoad  %25  %55\r\n%403 = OpImageQuerySize  %26  %401\r\n%404 = OpULessThan  %159  %79 %403\r\n%405 = OpAll  %152  %404\r\nOpSelectionMerge %406 None\r\nOpBranchConditional %405 %407 %406\r\n%407 = OpLabel\r\nOpImageWrite %401 %79 %402\r\nOpBranch %406\r\n%406 = OpLabel\r\n%408 = OpAccessChain  %391  %39 %74\r\n%409 = OpLoad  %19  %408\r\n%410 = OpLoad  %25  %55\r\n%411 = OpImageQuerySize  %26  %409\r\n%412 = OpULessThan  %159  %79 %411\r\n%413 = OpAll  %152  %412\r\nOpSelectionMerge %414 None\r\nOpBranchConditional %413 %415 %414\r\n%415 = OpLabel\r\nOpImageWrite %409 %79 %410\r\nOpBranch %414\r\n%414 = OpLabel\r\n%416 = OpLoad  %26  %50\r\n%417 = OpLoad  %4  %48\r\n%418 = OpCompositeConstruct  %26  %417 %417\r\n%419 = OpIAdd  %26  %416 %418\r\n%420 = OpConvertSToF  %77  %419\r\n%421 = OpLoad  %25  %55\r\n%422 = OpCompositeExtract  %7  %420 0\r\n%423 = OpCompositeExtract  %7  %420 1\r\n%424 = OpCompositeExtract  %7  %420 0\r\n%425 = OpCompositeExtract  %7  %420 1\r\n%426 = OpCompositeConstruct  %25  %422 %423 %424 %425\r\n%427 = OpFAdd  %25  %421 %426\r\n%428 = OpLoad  %7  %53\r\n%429 = OpCompositeConstruct  %25  %428 %428 %428 %428\r\n%430 = OpFAdd  %25  %427 %429\r\nOpStore %63 %430\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/bitcast.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 76\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %46 \"main\"\r\nOpExecutionMode %46 LocalSize 1 1 1\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  0\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  0\r\n%8 = OpTypeFloat 32\r\n%7 = OpConstant  %8  0.0\r\n%9 = OpTypeVector %4 2\r\n%10 = OpTypeVector %4 3\r\n%11 = OpTypeVector %4 4\r\n%12 = OpTypeVector %6 2\r\n%13 = OpTypeVector %6 3\r\n%14 = OpTypeVector %6 4\r\n%15 = OpTypeVector %8 2\r\n%16 = OpTypeVector %8 3\r\n%17 = OpTypeVector %8 4\r\n%19 = OpTypePointer Function %9\r\n%20 = OpConstantNull  %9\r\n%22 = OpTypePointer Function %10\r\n%23 = OpConstantNull  %10\r\n%25 = OpTypePointer Function %11\r\n%26 = OpConstantNull  %11\r\n%28 = OpTypePointer Function %12\r\n%29 = OpConstantNull  %12\r\n%31 = OpTypePointer Function %13\r\n%32 = OpConstantNull  %13\r\n%34 = OpTypePointer Function %14\r\n%35 = OpConstantNull  %14\r\n%37 = OpTypePointer Function %15\r\n%38 = OpConstantNull  %15\r\n%40 = OpTypePointer Function %16\r\n%41 = OpConstantNull  %16\r\n%43 = OpTypePointer Function %17\r\n%44 = OpConstantNull  %17\r\n%47 = OpTypeFunction %2\r\n%46 = OpFunction  %2  None %47\r\n%45 = OpLabel\r\n%36 = OpVariable  %37  Function %38\r\n%27 = OpVariable  %28  Function %29\r\n%18 = OpVariable  %19  Function %20\r\n%39 = OpVariable  %40  Function %41\r\n%30 = OpVariable  %31  Function %32\r\n%21 = OpVariable  %22  Function %23\r\n%42 = OpVariable  %43  Function %44\r\n%33 = OpVariable  %34  Function %35\r\n%24 = OpVariable  %25  Function %26\r\nOpBranch %48\r\n%48 = OpLabel\r\n%49 = OpCompositeConstruct  %9  %3 %3\r\nOpStore %18 %49\r\n%50 = OpCompositeConstruct  %10  %3 %3 %3\r\nOpStore %21 %50\r\n%51 = OpCompositeConstruct  %11  %3 %3 %3 %3\r\nOpStore %24 %51\r\n%52 = OpCompositeConstruct  %12  %5 %5\r\nOpStore %27 %52\r\n%53 = OpCompositeConstruct  %13  %5 %5 %5\r\nOpStore %30 %53\r\n%54 = OpCompositeConstruct  %14  %5 %5 %5 %5\r\nOpStore %33 %54\r\n%55 = OpCompositeConstruct  %15  %7 %7\r\nOpStore %36 %55\r\n%56 = OpCompositeConstruct  %16  %7 %7 %7\r\nOpStore %39 %56\r\n%57 = OpCompositeConstruct  %17  %7 %7 %7 %7\r\nOpStore %42 %57\r\n%58 = OpLoad  %9  %18\r\n%59 = OpBitcast  %12  %58\r\nOpStore %27 %59\r\n%60 = OpLoad  %10  %21\r\n%61 = OpBitcast  %13  %60\r\nOpStore %30 %61\r\n%62 = OpLoad  %11  %24\r\n%63 = OpBitcast  %14  %62\r\nOpStore %33 %63\r\n%64 = OpLoad  %12  %27\r\n%65 = OpBitcast  %9  %64\r\nOpStore %18 %65\r\n%66 = OpLoad  %13  %30\r\n%67 = OpBitcast  %10  %66\r\nOpStore %21 %67\r\n%68 = OpLoad  %14  %33\r\n%69 = OpBitcast  %11  %68\r\nOpStore %24 %69\r\n%70 = OpLoad  %9  %18\r\n%71 = OpBitcast  %15  %70\r\nOpStore %36 %71\r\n%72 = OpLoad  %10  %21\r\n%73 = OpBitcast  %16  %72\r\nOpStore %39 %73\r\n%74 = OpLoad  %11  %24\r\n%75 = OpBitcast  %17  %74\r\nOpStore %42 %75\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/bits.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 159\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %48 \"main\"\r\nOpExecutionMode %48 LocalSize 1 1 1\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  0\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  0\r\n%8 = OpTypeFloat 32\r\n%7 = OpConstant  %8  0.0\r\n%9 = OpConstant  %6  5\r\n%10 = OpConstant  %6  10\r\n%11 = OpTypeVector %4 2\r\n%12 = OpTypeVector %4 3\r\n%13 = OpTypeVector %4 4\r\n%14 = OpTypeVector %6 2\r\n%15 = OpTypeVector %6 3\r\n%16 = OpTypeVector %6 4\r\n%17 = OpTypeVector %8 2\r\n%18 = OpTypeVector %8 4\r\n%20 = OpTypePointer Function %4\r\n%22 = OpTypePointer Function %11\r\n%23 = OpConstantNull  %11\r\n%25 = OpTypePointer Function %12\r\n%26 = OpConstantNull  %12\r\n%28 = OpTypePointer Function %13\r\n%29 = OpConstantNull  %13\r\n%31 = OpTypePointer Function %6\r\n%33 = OpTypePointer Function %14\r\n%34 = OpConstantNull  %14\r\n%36 = OpTypePointer Function %15\r\n%37 = OpConstantNull  %15\r\n%39 = OpTypePointer Function %16\r\n%40 = OpConstantNull  %16\r\n%42 = OpTypePointer Function %17\r\n%43 = OpConstantNull  %17\r\n%45 = OpTypePointer Function %18\r\n%46 = OpConstantNull  %18\r\n%49 = OpTypeFunction %2\r\n%48 = OpFunction  %2  None %49\r\n%47 = OpLabel\r\n%44 = OpVariable  %45  Function %46\r\n%35 = OpVariable  %36  Function %37\r\n%27 = OpVariable  %28  Function %29\r\n%19 = OpVariable  %20  Function %3\r\n%38 = OpVariable  %39  Function %40\r\n%30 = OpVariable  %31  Function %5\r\n%21 = OpVariable  %22  Function %23\r\n%41 = OpVariable  %42  Function %43\r\n%32 = OpVariable  %33  Function %34\r\n%24 = OpVariable  %25  Function %26\r\nOpBranch %50\r\n%50 = OpLabel\r\n%51 = OpCompositeConstruct  %11  %3 %3\r\nOpStore %21 %51\r\n%52 = OpCompositeConstruct  %12  %3 %3 %3\r\nOpStore %24 %52\r\n%53 = OpCompositeConstruct  %13  %3 %3 %3 %3\r\nOpStore %27 %53\r\n%54 = OpCompositeConstruct  %14  %5 %5\r\nOpStore %32 %54\r\n%55 = OpCompositeConstruct  %15  %5 %5 %5\r\nOpStore %35 %55\r\n%56 = OpCompositeConstruct  %16  %5 %5 %5 %5\r\nOpStore %38 %56\r\n%57 = OpCompositeConstruct  %17  %7 %7\r\nOpStore %41 %57\r\n%58 = OpCompositeConstruct  %18  %7 %7 %7 %7\r\nOpStore %44 %58\r\n%59 = OpLoad  %18  %44\r\n%60 = OpExtInst  %6  %1 PackSnorm4x8 %59\r\nOpStore %30 %60\r\n%61 = OpLoad  %18  %44\r\n%62 = OpExtInst  %6  %1 PackUnorm4x8 %61\r\nOpStore %30 %62\r\n%63 = OpLoad  %17  %41\r\n%64 = OpExtInst  %6  %1 PackSnorm2x16 %63\r\nOpStore %30 %64\r\n%65 = OpLoad  %17  %41\r\n%66 = OpExtInst  %6  %1 PackUnorm2x16 %65\r\nOpStore %30 %66\r\n%67 = OpLoad  %17  %41\r\n%68 = OpExtInst  %6  %1 PackHalf2x16 %67\r\nOpStore %30 %68\r\n%69 = OpLoad  %6  %30\r\n%70 = OpExtInst  %18  %1 UnpackSnorm4x8 %69\r\nOpStore %44 %70\r\n%71 = OpLoad  %6  %30\r\n%72 = OpExtInst  %18  %1 UnpackUnorm4x8 %71\r\nOpStore %44 %72\r\n%73 = OpLoad  %6  %30\r\n%74 = OpExtInst  %17  %1 UnpackSnorm2x16 %73\r\nOpStore %41 %74\r\n%75 = OpLoad  %6  %30\r\n%76 = OpExtInst  %17  %1 UnpackUnorm2x16 %75\r\nOpStore %41 %76\r\n%77 = OpLoad  %6  %30\r\n%78 = OpExtInst  %17  %1 UnpackHalf2x16 %77\r\nOpStore %41 %78\r\n%79 = OpLoad  %4  %19\r\n%80 = OpLoad  %4  %19\r\n%81 = OpBitFieldInsert  %4  %79 %80 %9 %10\r\nOpStore %19 %81\r\n%82 = OpLoad  %11  %21\r\n%83 = OpLoad  %11  %21\r\n%84 = OpBitFieldInsert  %11  %82 %83 %9 %10\r\nOpStore %21 %84\r\n%85 = OpLoad  %12  %24\r\n%86 = OpLoad  %12  %24\r\n%87 = OpBitFieldInsert  %12  %85 %86 %9 %10\r\nOpStore %24 %87\r\n%88 = OpLoad  %13  %27\r\n%89 = OpLoad  %13  %27\r\n%90 = OpBitFieldInsert  %13  %88 %89 %9 %10\r\nOpStore %27 %90\r\n%91 = OpLoad  %6  %30\r\n%92 = OpLoad  %6  %30\r\n%93 = OpBitFieldInsert  %6  %91 %92 %9 %10\r\nOpStore %30 %93\r\n%94 = OpLoad  %14  %32\r\n%95 = OpLoad  %14  %32\r\n%96 = OpBitFieldInsert  %14  %94 %95 %9 %10\r\nOpStore %32 %96\r\n%97 = OpLoad  %15  %35\r\n%98 = OpLoad  %15  %35\r\n%99 = OpBitFieldInsert  %15  %97 %98 %9 %10\r\nOpStore %35 %99\r\n%100 = OpLoad  %16  %38\r\n%101 = OpLoad  %16  %38\r\n%102 = OpBitFieldInsert  %16  %100 %101 %9 %10\r\nOpStore %38 %102\r\n%103 = OpLoad  %4  %19\r\n%104 = OpBitFieldSExtract  %4  %103 %9 %10\r\nOpStore %19 %104\r\n%105 = OpLoad  %11  %21\r\n%106 = OpBitFieldSExtract  %11  %105 %9 %10\r\nOpStore %21 %106\r\n%107 = OpLoad  %12  %24\r\n%108 = OpBitFieldSExtract  %12  %107 %9 %10\r\nOpStore %24 %108\r\n%109 = OpLoad  %13  %27\r\n%110 = OpBitFieldSExtract  %13  %109 %9 %10\r\nOpStore %27 %110\r\n%111 = OpLoad  %6  %30\r\n%112 = OpBitFieldUExtract  %6  %111 %9 %10\r\nOpStore %30 %112\r\n%113 = OpLoad  %14  %32\r\n%114 = OpBitFieldUExtract  %14  %113 %9 %10\r\nOpStore %32 %114\r\n%115 = OpLoad  %15  %35\r\n%116 = OpBitFieldUExtract  %15  %115 %9 %10\r\nOpStore %35 %116\r\n%117 = OpLoad  %16  %38\r\n%118 = OpBitFieldUExtract  %16  %117 %9 %10\r\nOpStore %38 %118\r\n%119 = OpLoad  %4  %19\r\n%120 = OpExtInst  %4  %1 FindILsb %119\r\nOpStore %19 %120\r\n%121 = OpLoad  %14  %32\r\n%122 = OpExtInst  %14  %1 FindILsb %121\r\nOpStore %32 %122\r\n%123 = OpLoad  %12  %24\r\n%124 = OpExtInst  %12  %1 FindSMsb %123\r\nOpStore %24 %124\r\n%125 = OpLoad  %6  %30\r\n%126 = OpExtInst  %6  %1 FindUMsb %125\r\nOpStore %30 %126\r\n%127 = OpLoad  %4  %19\r\n%128 = OpBitCount  %4  %127\r\nOpStore %19 %128\r\n%129 = OpLoad  %11  %21\r\n%130 = OpBitCount  %11  %129\r\nOpStore %21 %130\r\n%131 = OpLoad  %12  %24\r\n%132 = OpBitCount  %12  %131\r\nOpStore %24 %132\r\n%133 = OpLoad  %13  %27\r\n%134 = OpBitCount  %13  %133\r\nOpStore %27 %134\r\n%135 = OpLoad  %6  %30\r\n%136 = OpBitCount  %6  %135\r\nOpStore %30 %136\r\n%137 = OpLoad  %14  %32\r\n%138 = OpBitCount  %14  %137\r\nOpStore %32 %138\r\n%139 = OpLoad  %15  %35\r\n%140 = OpBitCount  %15  %139\r\nOpStore %35 %140\r\n%141 = OpLoad  %16  %38\r\n%142 = OpBitCount  %16  %141\r\nOpStore %38 %142\r\n%143 = OpLoad  %4  %19\r\n%144 = OpBitReverse  %4  %143\r\nOpStore %19 %144\r\n%145 = OpLoad  %11  %21\r\n%146 = OpBitReverse  %11  %145\r\nOpStore %21 %146\r\n%147 = OpLoad  %12  %24\r\n%148 = OpBitReverse  %12  %147\r\nOpStore %24 %148\r\n%149 = OpLoad  %13  %27\r\n%150 = OpBitReverse  %13  %149\r\nOpStore %27 %150\r\n%151 = OpLoad  %6  %30\r\n%152 = OpBitReverse  %6  %151\r\nOpStore %30 %152\r\n%153 = OpLoad  %14  %32\r\n%154 = OpBitReverse  %14  %153\r\nOpStore %32 %154\r\n%155 = OpLoad  %15  %35\r\n%156 = OpBitReverse  %15  %155\r\nOpStore %35 %156\r\n%157 = OpLoad  %16  %38\r\n%158 = OpBitReverse  %16  %157\r\nOpStore %38 %158\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/boids.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 213\r\nOpCapability Shader\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %51 \"main\" %48\r\nOpExecutionMode %51 LocalSize 64 1 1\r\nOpSource GLSL 450\r\nOpName %3 \"NUM_PARTICLES\"\r\nOpMemberName %16 0 \"pos\"\r\nOpMemberName %16 1 \"vel\"\r\nOpName %16 \"Particle\"\r\nOpMemberName %17 0 \"deltaT\"\r\nOpMemberName %17 1 \"rule1Distance\"\r\nOpMemberName %17 2 \"rule2Distance\"\r\nOpMemberName %17 3 \"rule3Distance\"\r\nOpMemberName %17 4 \"rule1Scale\"\r\nOpMemberName %17 5 \"rule2Scale\"\r\nOpMemberName %17 6 \"rule3Scale\"\r\nOpName %17 \"SimParams\"\r\nOpMemberName %19 0 \"particles\"\r\nOpName %19 \"Particles\"\r\nOpName %21 \"params\"\r\nOpName %24 \"particlesSrc\"\r\nOpName %26 \"particlesDst\"\r\nOpName %27 \"vPos\"\r\nOpName %30 \"vVel\"\r\nOpName %32 \"cMass\"\r\nOpName %34 \"cVel\"\r\nOpName %36 \"colVel\"\r\nOpName %38 \"cMassCount\"\r\nOpName %40 \"cVelCount\"\r\nOpName %41 \"pos\"\r\nOpName %43 \"vel\"\r\nOpName %45 \"i\"\r\nOpName %48 \"global_invocation_id\"\r\nOpName %51 \"main\"\r\nOpMemberDecorate %16 0 Offset 0\r\nOpMemberDecorate %16 1 Offset 8\r\nOpMemberDecorate %17 0 Offset 0\r\nOpMemberDecorate %17 1 Offset 4\r\nOpMemberDecorate %17 2 Offset 8\r\nOpMemberDecorate %17 3 Offset 12\r\nOpMemberDecorate %17 4 Offset 16\r\nOpMemberDecorate %17 5 Offset 20\r\nOpMemberDecorate %17 6 Offset 24\r\nOpDecorate %18 ArrayStride 16\r\nOpMemberDecorate %19 0 Offset 0\r\nOpDecorate %21 DescriptorSet 0\r\nOpDecorate %21 Binding 0\r\nOpDecorate %22 Block\r\nOpMemberDecorate %22 0 Offset 0\r\nOpDecorate %24 NonWritable\r\nOpDecorate %24 DescriptorSet 0\r\nOpDecorate %24 Binding 1\r\nOpDecorate %19 Block\r\nOpDecorate %26 DescriptorSet 0\r\nOpDecorate %26 Binding 2\r\nOpDecorate %19 Block\r\nOpDecorate %48 BuiltIn GlobalInvocationId\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 0\r\n%3 = OpConstant  %4  1500\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  0.0\r\n%8 = OpTypeInt 32 1\r\n%7 = OpConstant  %8  0\r\n%9 = OpConstant  %4  0\r\n%10 = OpConstant  %8  1\r\n%11 = OpConstant  %4  1\r\n%12 = OpConstant  %6  0.1\r\n%13 = OpConstant  %6  -1.0\r\n%14 = OpConstant  %6  1.0\r\n%15 = OpTypeVector %6 2\r\n%16 = OpTypeStruct %15 %15\r\n%17 = OpTypeStruct %6 %6 %6 %6 %6 %6 %6\r\n%18 = OpTypeRuntimeArray %16\r\n%19 = OpTypeStruct %18\r\n%20 = OpTypeVector %4 3\r\n%22 = OpTypeStruct %17\r\n%23 = OpTypePointer Uniform %22\r\n%21 = OpVariable  %23  Uniform\r\n%25 = OpTypePointer StorageBuffer %19\r\n%24 = OpVariable  %25  StorageBuffer\r\n%26 = OpVariable  %25  StorageBuffer\r\n%28 = OpTypePointer Function %15\r\n%29 = OpConstantNull  %15\r\n%31 = OpConstantNull  %15\r\n%33 = OpConstantNull  %15\r\n%35 = OpConstantNull  %15\r\n%37 = OpConstantNull  %15\r\n%39 = OpTypePointer Function %8\r\n%42 = OpConstantNull  %15\r\n%44 = OpConstantNull  %15\r\n%46 = OpTypePointer Function %4\r\n%49 = OpTypePointer Input %20\r\n%48 = OpVariable  %49  Input\r\n%52 = OpTypeFunction %2\r\n%53 = OpTypePointer Uniform %17\r\n%57 = OpTypeBool\r\n%61 = OpTypePointer StorageBuffer %18\r\n%62 = OpTypePointer StorageBuffer %16\r\n%63 = OpTypePointer StorageBuffer %15\r\n%92 = OpTypePointer Uniform %6\r\n%106 = OpConstant  %4  2\r\n%120 = OpConstant  %4  3\r\n%155 = OpConstant  %4  4\r\n%161 = OpConstant  %4  5\r\n%167 = OpConstant  %4  6\r\n%184 = OpTypePointer Function %6\r\n%51 = OpFunction  %2  None %52\r\n%47 = OpLabel\r\n%45 = OpVariable  %46  Function %9\r\n%40 = OpVariable  %39  Function %7\r\n%34 = OpVariable  %28  Function %35\r\n%27 = OpVariable  %28  Function %29\r\n%41 = OpVariable  %28  Function %42\r\n%36 = OpVariable  %28  Function %37\r\n%30 = OpVariable  %28  Function %31\r\n%43 = OpVariable  %28  Function %44\r\n%38 = OpVariable  %39  Function %7\r\n%32 = OpVariable  %28  Function %33\r\n%50 = OpLoad  %20  %48\r\n%54 = OpAccessChain  %53  %21 %9\r\nOpBranch %55\r\n%55 = OpLabel\r\n%56 = OpCompositeExtract  %4  %50 0\r\n%58 = OpUGreaterThanEqual  %57  %56 %3\r\nOpSelectionMerge %59 None\r\nOpBranchConditional %58 %60 %59\r\n%60 = OpLabel\r\nOpReturn\r\n%59 = OpLabel\r\n%64 = OpAccessChain  %63  %24 %9 %56 %9\r\n%65 = OpLoad  %15  %64\r\nOpStore %27 %65\r\n%66 = OpAccessChain  %63  %24 %9 %56 %11\r\n%67 = OpLoad  %15  %66\r\nOpStore %30 %67\r\n%68 = OpCompositeConstruct  %15  %5 %5\r\nOpStore %32 %68\r\n%69 = OpCompositeConstruct  %15  %5 %5\r\nOpStore %34 %69\r\n%70 = OpCompositeConstruct  %15  %5 %5\r\nOpStore %36 %70\r\nOpBranch %71\r\n%71 = OpLabel\r\nOpLoopMerge %72 %74 None\r\nOpBranch %73\r\n%73 = OpLabel\r\n%75 = OpLoad  %4  %45\r\n%76 = OpUGreaterThanEqual  %57  %75 %3\r\nOpSelectionMerge %77 None\r\nOpBranchConditional %76 %78 %77\r\n%78 = OpLabel\r\nOpBranch %72\r\n%77 = OpLabel\r\n%79 = OpLoad  %4  %45\r\n%80 = OpIEqual  %57  %79 %56\r\nOpSelectionMerge %81 None\r\nOpBranchConditional %80 %82 %81\r\n%82 = OpLabel\r\nOpBranch %74\r\n%81 = OpLabel\r\n%83 = OpLoad  %4  %45\r\n%84 = OpAccessChain  %63  %24 %9 %83 %9\r\n%85 = OpLoad  %15  %84\r\nOpStore %41 %85\r\n%86 = OpLoad  %4  %45\r\n%87 = OpAccessChain  %63  %24 %9 %86 %11\r\n%88 = OpLoad  %15  %87\r\nOpStore %43 %88\r\n%89 = OpLoad  %15  %41\r\n%90 = OpLoad  %15  %27\r\n%91 = OpExtInst  %6  %1 Distance %89 %90\r\n%93 = OpAccessChain  %92  %54 %11\r\n%94 = OpLoad  %6  %93\r\n%95 = OpFOrdLessThan  %57  %91 %94\r\nOpSelectionMerge %96 None\r\nOpBranchConditional %95 %97 %96\r\n%97 = OpLabel\r\n%98 = OpLoad  %15  %32\r\n%99 = OpLoad  %15  %41\r\n%100 = OpFAdd  %15  %98 %99\r\nOpStore %32 %100\r\n%101 = OpLoad  %8  %38\r\n%102 = OpIAdd  %8  %101 %10\r\nOpStore %38 %102\r\nOpBranch %96\r\n%96 = OpLabel\r\n%103 = OpLoad  %15  %41\r\n%104 = OpLoad  %15  %27\r\n%105 = OpExtInst  %6  %1 Distance %103 %104\r\n%107 = OpAccessChain  %92  %54 %106\r\n%108 = OpLoad  %6  %107\r\n%109 = OpFOrdLessThan  %57  %105 %108\r\nOpSelectionMerge %110 None\r\nOpBranchConditional %109 %111 %110\r\n%111 = OpLabel\r\n%112 = OpLoad  %15  %36\r\n%113 = OpLoad  %15  %41\r\n%114 = OpLoad  %15  %27\r\n%115 = OpFSub  %15  %113 %114\r\n%116 = OpFSub  %15  %112 %115\r\nOpStore %36 %116\r\nOpBranch %110\r\n%110 = OpLabel\r\n%117 = OpLoad  %15  %41\r\n%118 = OpLoad  %15  %27\r\n%119 = OpExtInst  %6  %1 Distance %117 %118\r\n%121 = OpAccessChain  %92  %54 %120\r\n%122 = OpLoad  %6  %121\r\n%123 = OpFOrdLessThan  %57  %119 %122\r\nOpSelectionMerge %124 None\r\nOpBranchConditional %123 %125 %124\r\n%125 = OpLabel\r\n%126 = OpLoad  %15  %34\r\n%127 = OpLoad  %15  %43\r\n%128 = OpFAdd  %15  %126 %127\r\nOpStore %34 %128\r\n%129 = OpLoad  %8  %40\r\n%130 = OpIAdd  %8  %129 %10\r\nOpStore %40 %130\r\nOpBranch %124\r\n%124 = OpLabel\r\nOpBranch %74\r\n%74 = OpLabel\r\n%131 = OpLoad  %4  %45\r\n%132 = OpIAdd  %4  %131 %11\r\nOpStore %45 %132\r\nOpBranch %71\r\n%72 = OpLabel\r\n%133 = OpLoad  %8  %38\r\n%134 = OpSGreaterThan  %57  %133 %7\r\nOpSelectionMerge %135 None\r\nOpBranchConditional %134 %136 %135\r\n%136 = OpLabel\r\n%137 = OpLoad  %15  %32\r\n%138 = OpLoad  %8  %38\r\n%139 = OpConvertSToF  %6  %138\r\n%140 = OpCompositeConstruct  %15  %139 %139\r\n%141 = OpFDiv  %15  %137 %140\r\n%142 = OpLoad  %15  %27\r\n%143 = OpFSub  %15  %141 %142\r\nOpStore %32 %143\r\nOpBranch %135\r\n%135 = OpLabel\r\n%144 = OpLoad  %8  %40\r\n%145 = OpSGreaterThan  %57  %144 %7\r\nOpSelectionMerge %146 None\r\nOpBranchConditional %145 %147 %146\r\n%147 = OpLabel\r\n%148 = OpLoad  %15  %34\r\n%149 = OpLoad  %8  %40\r\n%150 = OpConvertSToF  %6  %149\r\n%151 = OpCompositeConstruct  %15  %150 %150\r\n%152 = OpFDiv  %15  %148 %151\r\nOpStore %34 %152\r\nOpBranch %146\r\n%146 = OpLabel\r\n%153 = OpLoad  %15  %30\r\n%154 = OpLoad  %15  %32\r\n%156 = OpAccessChain  %92  %54 %155\r\n%157 = OpLoad  %6  %156\r\n%158 = OpVectorTimesScalar  %15  %154 %157\r\n%159 = OpFAdd  %15  %153 %158\r\n%160 = OpLoad  %15  %36\r\n%162 = OpAccessChain  %92  %54 %161\r\n%163 = OpLoad  %6  %162\r\n%164 = OpVectorTimesScalar  %15  %160 %163\r\n%165 = OpFAdd  %15  %159 %164\r\n%166 = OpLoad  %15  %34\r\n%168 = OpAccessChain  %92  %54 %167\r\n%169 = OpLoad  %6  %168\r\n%170 = OpVectorTimesScalar  %15  %166 %169\r\n%171 = OpFAdd  %15  %165 %170\r\nOpStore %30 %171\r\n%172 = OpLoad  %15  %30\r\n%173 = OpExtInst  %15  %1 Normalize %172\r\n%174 = OpLoad  %15  %30\r\n%175 = OpExtInst  %6  %1 Length %174\r\n%176 = OpExtInst  %6  %1 FClamp %175 %5 %12\r\n%177 = OpVectorTimesScalar  %15  %173 %176\r\nOpStore %30 %177\r\n%178 = OpLoad  %15  %27\r\n%179 = OpLoad  %15  %30\r\n%180 = OpAccessChain  %92  %54 %9\r\n%181 = OpLoad  %6  %180\r\n%182 = OpVectorTimesScalar  %15  %179 %181\r\n%183 = OpFAdd  %15  %178 %182\r\nOpStore %27 %183\r\n%185 = OpAccessChain  %184  %27 %9\r\n%186 = OpLoad  %6  %185\r\n%187 = OpFOrdLessThan  %57  %186 %13\r\nOpSelectionMerge %188 None\r\nOpBranchConditional %187 %189 %188\r\n%189 = OpLabel\r\n%190 = OpAccessChain  %184  %27 %9\r\nOpStore %190 %14\r\nOpBranch %188\r\n%188 = OpLabel\r\n%191 = OpAccessChain  %184  %27 %9\r\n%192 = OpLoad  %6  %191\r\n%193 = OpFOrdGreaterThan  %57  %192 %14\r\nOpSelectionMerge %194 None\r\nOpBranchConditional %193 %195 %194\r\n%195 = OpLabel\r\n%196 = OpAccessChain  %184  %27 %9\r\nOpStore %196 %13\r\nOpBranch %194\r\n%194 = OpLabel\r\n%197 = OpAccessChain  %184  %27 %11\r\n%198 = OpLoad  %6  %197\r\n%199 = OpFOrdLessThan  %57  %198 %13\r\nOpSelectionMerge %200 None\r\nOpBranchConditional %199 %201 %200\r\n%201 = OpLabel\r\n%202 = OpAccessChain  %184  %27 %11\r\nOpStore %202 %14\r\nOpBranch %200\r\n%200 = OpLabel\r\n%203 = OpAccessChain  %184  %27 %11\r\n%204 = OpLoad  %6  %203\r\n%205 = OpFOrdGreaterThan  %57  %204 %14\r\nOpSelectionMerge %206 None\r\nOpBranchConditional %205 %207 %206\r\n%207 = OpLabel\r\n%208 = OpAccessChain  %184  %27 %11\r\nOpStore %208 %13\r\nOpBranch %206\r\n%206 = OpLabel\r\n%209 = OpLoad  %15  %27\r\n%210 = OpAccessChain  %63  %26 %9 %56 %9\r\nOpStore %210 %209\r\n%211 = OpLoad  %15  %30\r\n%212 = OpAccessChain  %63  %26 %9 %56 %11\r\nOpStore %212 %211\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/bounds-check-image-restrict.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 244\r\nOpCapability ImageQuery\r\nOpCapability Image1D\r\nOpCapability Shader\r\nOpCapability Sampled1D\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %222 \"fragment_shader\" %220\r\nOpExecutionMode %222 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpName %25 \"image_1d\"\r\nOpName %27 \"image_2d\"\r\nOpName %29 \"image_2d_array\"\r\nOpName %31 \"image_3d\"\r\nOpName %33 \"image_multisampled_2d\"\r\nOpName %35 \"image_depth_2d\"\r\nOpName %37 \"image_depth_2d_array\"\r\nOpName %39 \"image_depth_multisampled_2d\"\r\nOpName %41 \"image_storage_1d\"\r\nOpName %43 \"image_storage_2d\"\r\nOpName %45 \"image_storage_2d_array\"\r\nOpName %47 \"image_storage_3d\"\r\nOpName %50 \"coords\"\r\nOpName %51 \"level\"\r\nOpName %52 \"test_textureLoad_1d\"\r\nOpName %65 \"coords\"\r\nOpName %66 \"level\"\r\nOpName %67 \"test_textureLoad_2d\"\r\nOpName %80 \"coords\"\r\nOpName %81 \"index\"\r\nOpName %82 \"level\"\r\nOpName %83 \"test_textureLoad_2d_array\"\r\nOpName %97 \"coords\"\r\nOpName %98 \"level\"\r\nOpName %99 \"test_textureLoad_3d\"\r\nOpName %112 \"coords\"\r\nOpName %113 \"_sample\"\r\nOpName %114 \"test_textureLoad_multisampled_2d\"\r\nOpName %126 \"coords\"\r\nOpName %127 \"level\"\r\nOpName %128 \"test_textureLoad_depth_2d\"\r\nOpName %142 \"coords\"\r\nOpName %143 \"index\"\r\nOpName %144 \"level\"\r\nOpName %145 \"test_textureLoad_depth_2d_array\"\r\nOpName %160 \"coords\"\r\nOpName %161 \"_sample\"\r\nOpName %162 \"test_textureLoad_depth_multisampled_2d\"\r\nOpName %175 \"coords\"\r\nOpName %176 \"value\"\r\nOpName %177 \"test_textureStore_1d\"\r\nOpName %185 \"coords\"\r\nOpName %186 \"value\"\r\nOpName %187 \"test_textureStore_2d\"\r\nOpName %196 \"coords\"\r\nOpName %197 \"array_index\"\r\nOpName %198 \"value\"\r\nOpName %199 \"test_textureStore_2d_array\"\r\nOpName %209 \"coords\"\r\nOpName %210 \"value\"\r\nOpName %211 \"test_textureStore_3d\"\r\nOpName %222 \"fragment_shader\"\r\nOpDecorate %25 DescriptorSet 0\r\nOpDecorate %25 Binding 0\r\nOpDecorate %27 DescriptorSet 0\r\nOpDecorate %27 Binding 1\r\nOpDecorate %29 DescriptorSet 0\r\nOpDecorate %29 Binding 2\r\nOpDecorate %31 DescriptorSet 0\r\nOpDecorate %31 Binding 3\r\nOpDecorate %33 DescriptorSet 0\r\nOpDecorate %33 Binding 4\r\nOpDecorate %35 DescriptorSet 0\r\nOpDecorate %35 Binding 5\r\nOpDecorate %37 DescriptorSet 0\r\nOpDecorate %37 Binding 6\r\nOpDecorate %39 DescriptorSet 0\r\nOpDecorate %39 Binding 7\r\nOpDecorate %41 NonReadable\r\nOpDecorate %41 DescriptorSet 0\r\nOpDecorate %41 Binding 8\r\nOpDecorate %43 NonReadable\r\nOpDecorate %43 DescriptorSet 0\r\nOpDecorate %43 Binding 9\r\nOpDecorate %45 NonReadable\r\nOpDecorate %45 DescriptorSet 0\r\nOpDecorate %45 Binding 10\r\nOpDecorate %47 NonReadable\r\nOpDecorate %47 DescriptorSet 0\r\nOpDecorate %47 Binding 11\r\nOpDecorate %220 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  0\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  0.0\r\n%7 = OpTypeImage %6 1D 0 0 0 1 Unknown\r\n%8 = OpTypeVector %6 4\r\n%9 = OpTypeImage %6 2D 0 0 0 1 Unknown\r\n%10 = OpTypeVector %4 2\r\n%11 = OpTypeImage %6 2D 0 1 0 1 Unknown\r\n%12 = OpTypeImage %6 3D 0 0 0 1 Unknown\r\n%13 = OpTypeVector %4 3\r\n%14 = OpTypeImage %6 2D 0 0 1 1 Unknown\r\n%15 = OpTypeImage %6 2D 1 0 0 1 Unknown\r\n%16 = OpTypeImage %6 2D 1 1 0 1 Unknown\r\n%17 = OpTypeImage %6 2D 1 0 1 1 Unknown\r\n%18 = OpTypeImage %6 1D 0 0 0 2 Rgba8\r\n%19 = OpTypeImage %6 2D 0 0 0 2 Rgba8\r\n%20 = OpTypeImage %6 2D 0 1 0 2 Rgba8\r\n%21 = OpTypeImage %6 3D 0 0 0 2 Rgba8\r\n%22 = OpConstantComposite  %10  %3 %3\r\n%23 = OpConstantComposite  %13  %3 %3 %3\r\n%24 = OpConstantComposite  %8  %5 %5 %5 %5\r\n%26 = OpTypePointer UniformConstant %7\r\n%25 = OpVariable  %26  UniformConstant\r\n%28 = OpTypePointer UniformConstant %9\r\n%27 = OpVariable  %28  UniformConstant\r\n%30 = OpTypePointer UniformConstant %11\r\n%29 = OpVariable  %30  UniformConstant\r\n%32 = OpTypePointer UniformConstant %12\r\n%31 = OpVariable  %32  UniformConstant\r\n%34 = OpTypePointer UniformConstant %14\r\n%33 = OpVariable  %34  UniformConstant\r\n%36 = OpTypePointer UniformConstant %15\r\n%35 = OpVariable  %36  UniformConstant\r\n%38 = OpTypePointer UniformConstant %16\r\n%37 = OpVariable  %38  UniformConstant\r\n%40 = OpTypePointer UniformConstant %17\r\n%39 = OpVariable  %40  UniformConstant\r\n%42 = OpTypePointer UniformConstant %18\r\n%41 = OpVariable  %42  UniformConstant\r\n%44 = OpTypePointer UniformConstant %19\r\n%43 = OpVariable  %44  UniformConstant\r\n%46 = OpTypePointer UniformConstant %20\r\n%45 = OpVariable  %46  UniformConstant\r\n%48 = OpTypePointer UniformConstant %21\r\n%47 = OpVariable  %48  UniformConstant\r\n%53 = OpTypeFunction %8 %4 %4\r\n%57 = OpConstant  %4  1\r\n%68 = OpTypeFunction %8 %10 %4\r\n%75 = OpConstantComposite  %10  %57 %57\r\n%84 = OpTypeFunction %8 %10 %4 %4\r\n%92 = OpConstantComposite  %13  %57 %57 %57\r\n%100 = OpTypeFunction %8 %13 %4\r\n%107 = OpConstantComposite  %13  %57 %57 %57\r\n%121 = OpConstantComposite  %10  %57 %57\r\n%129 = OpTypeFunction %6 %10 %4\r\n%136 = OpConstantComposite  %10  %57 %57\r\n%146 = OpTypeFunction %6 %10 %4 %4\r\n%154 = OpConstantComposite  %13  %57 %57 %57\r\n%169 = OpConstantComposite  %10  %57 %57\r\n%178 = OpTypeFunction %2 %4 %8\r\n%188 = OpTypeFunction %2 %10 %8\r\n%192 = OpConstantComposite  %10  %57 %57\r\n%200 = OpTypeFunction %2 %10 %4 %8\r\n%205 = OpConstantComposite  %13  %57 %57 %57\r\n%212 = OpTypeFunction %2 %13 %8\r\n%216 = OpConstantComposite  %13  %57 %57 %57\r\n%221 = OpTypePointer Output %8\r\n%220 = OpVariable  %221  Output\r\n%223 = OpTypeFunction %2\r\n%52 = OpFunction  %8  None %53\r\n%50 = OpFunctionParameter  %4\r\n%51 = OpFunctionParameter  %4\r\n%49 = OpLabel\r\n%54 = OpLoad  %7  %25\r\nOpBranch %55\r\n%55 = OpLabel\r\n%56 = OpImageQueryLevels  %4  %54\r\n%58 = OpISub  %4  %56 %57\r\n%59 = OpExtInst  %4  %1 UMin %51 %58\r\n%60 = OpImageQuerySizeLod  %4  %54 %59\r\n%61 = OpISub  %4  %60 %57\r\n%62 = OpExtInst  %4  %1 UMin %50 %61\r\n%63 = OpImageFetch  %8  %54 %62 Lod %59\r\nOpReturnValue %63\r\nOpFunctionEnd\r\n%67 = OpFunction  %8  None %68\r\n%65 = OpFunctionParameter  %10\r\n%66 = OpFunctionParameter  %4\r\n%64 = OpLabel\r\n%69 = OpLoad  %9  %27\r\nOpBranch %70\r\n%70 = OpLabel\r\n%71 = OpImageQueryLevels  %4  %69\r\n%72 = OpISub  %4  %71 %57\r\n%73 = OpExtInst  %4  %1 UMin %66 %72\r\n%74 = OpImageQuerySizeLod  %10  %69 %73\r\n%76 = OpISub  %10  %74 %75\r\n%77 = OpExtInst  %10  %1 UMin %65 %76\r\n%78 = OpImageFetch  %8  %69 %77 Lod %73\r\nOpReturnValue %78\r\nOpFunctionEnd\r\n%83 = OpFunction  %8  None %84\r\n%80 = OpFunctionParameter  %10\r\n%81 = OpFunctionParameter  %4\r\n%82 = OpFunctionParameter  %4\r\n%79 = OpLabel\r\n%85 = OpLoad  %11  %29\r\nOpBranch %86\r\n%86 = OpLabel\r\n%87 = OpCompositeConstruct  %13  %80 %81\r\n%88 = OpImageQueryLevels  %4  %85\r\n%89 = OpISub  %4  %88 %57\r\n%90 = OpExtInst  %4  %1 UMin %82 %89\r\n%91 = OpImageQuerySizeLod  %13  %85 %90\r\n%93 = OpISub  %13  %91 %92\r\n%94 = OpExtInst  %13  %1 UMin %87 %93\r\n%95 = OpImageFetch  %8  %85 %94 Lod %90\r\nOpReturnValue %95\r\nOpFunctionEnd\r\n%99 = OpFunction  %8  None %100\r\n%97 = OpFunctionParameter  %13\r\n%98 = OpFunctionParameter  %4\r\n%96 = OpLabel\r\n%101 = OpLoad  %12  %31\r\nOpBranch %102\r\n%102 = OpLabel\r\n%103 = OpImageQueryLevels  %4  %101\r\n%104 = OpISub  %4  %103 %57\r\n%105 = OpExtInst  %4  %1 UMin %98 %104\r\n%106 = OpImageQuerySizeLod  %13  %101 %105\r\n%108 = OpISub  %13  %106 %107\r\n%109 = OpExtInst  %13  %1 UMin %97 %108\r\n%110 = OpImageFetch  %8  %101 %109 Lod %105\r\nOpReturnValue %110\r\nOpFunctionEnd\r\n%114 = OpFunction  %8  None %68\r\n%112 = OpFunctionParameter  %10\r\n%113 = OpFunctionParameter  %4\r\n%111 = OpLabel\r\n%115 = OpLoad  %14  %33\r\nOpBranch %116\r\n%116 = OpLabel\r\n%117 = OpImageQuerySamples  %4  %115\r\n%118 = OpISub  %4  %117 %57\r\n%119 = OpExtInst  %4  %1 UMin %113 %118\r\n%120 = OpImageQuerySize  %10  %115\r\n%122 = OpISub  %10  %120 %121\r\n%123 = OpExtInst  %10  %1 UMin %112 %122\r\n%124 = OpImageFetch  %8  %115 %123 Sample %119\r\nOpReturnValue %124\r\nOpFunctionEnd\r\n%128 = OpFunction  %6  None %129\r\n%126 = OpFunctionParameter  %10\r\n%127 = OpFunctionParameter  %4\r\n%125 = OpLabel\r\n%130 = OpLoad  %15  %35\r\nOpBranch %131\r\n%131 = OpLabel\r\n%132 = OpImageQueryLevels  %4  %130\r\n%133 = OpISub  %4  %132 %57\r\n%134 = OpExtInst  %4  %1 UMin %127 %133\r\n%135 = OpImageQuerySizeLod  %10  %130 %134\r\n%137 = OpISub  %10  %135 %136\r\n%138 = OpExtInst  %10  %1 UMin %126 %137\r\n%139 = OpImageFetch  %8  %130 %138 Lod %134\r\n%140 = OpCompositeExtract  %6  %139 0\r\nOpReturnValue %140\r\nOpFunctionEnd\r\n%145 = OpFunction  %6  None %146\r\n%142 = OpFunctionParameter  %10\r\n%143 = OpFunctionParameter  %4\r\n%144 = OpFunctionParameter  %4\r\n%141 = OpLabel\r\n%147 = OpLoad  %16  %37\r\nOpBranch %148\r\n%148 = OpLabel\r\n%149 = OpCompositeConstruct  %13  %142 %143\r\n%150 = OpImageQueryLevels  %4  %147\r\n%151 = OpISub  %4  %150 %57\r\n%152 = OpExtInst  %4  %1 UMin %144 %151\r\n%153 = OpImageQuerySizeLod  %13  %147 %152\r\n%155 = OpISub  %13  %153 %154\r\n%156 = OpExtInst  %13  %1 UMin %149 %155\r\n%157 = OpImageFetch  %8  %147 %156 Lod %152\r\n%158 = OpCompositeExtract  %6  %157 0\r\nOpReturnValue %158\r\nOpFunctionEnd\r\n%162 = OpFunction  %6  None %129\r\n%160 = OpFunctionParameter  %10\r\n%161 = OpFunctionParameter  %4\r\n%159 = OpLabel\r\n%163 = OpLoad  %17  %39\r\nOpBranch %164\r\n%164 = OpLabel\r\n%165 = OpImageQuerySamples  %4  %163\r\n%166 = OpISub  %4  %165 %57\r\n%167 = OpExtInst  %4  %1 UMin %161 %166\r\n%168 = OpImageQuerySize  %10  %163\r\n%170 = OpISub  %10  %168 %169\r\n%171 = OpExtInst  %10  %1 UMin %160 %170\r\n%172 = OpImageFetch  %8  %163 %171 Sample %167\r\n%173 = OpCompositeExtract  %6  %172 0\r\nOpReturnValue %173\r\nOpFunctionEnd\r\n%177 = OpFunction  %2  None %178\r\n%175 = OpFunctionParameter  %4\r\n%176 = OpFunctionParameter  %8\r\n%174 = OpLabel\r\n%179 = OpLoad  %18  %41\r\nOpBranch %180\r\n%180 = OpLabel\r\n%181 = OpImageQuerySize  %4  %179\r\n%182 = OpISub  %4  %181 %57\r\n%183 = OpExtInst  %4  %1 UMin %175 %182\r\nOpImageWrite %179 %183 %176\r\nOpReturn\r\nOpFunctionEnd\r\n%187 = OpFunction  %2  None %188\r\n%185 = OpFunctionParameter  %10\r\n%186 = OpFunctionParameter  %8\r\n%184 = OpLabel\r\n%189 = OpLoad  %19  %43\r\nOpBranch %190\r\n%190 = OpLabel\r\n%191 = OpImageQuerySize  %10  %189\r\n%193 = OpISub  %10  %191 %192\r\n%194 = OpExtInst  %10  %1 UMin %185 %193\r\nOpImageWrite %189 %194 %186\r\nOpReturn\r\nOpFunctionEnd\r\n%199 = OpFunction  %2  None %200\r\n%196 = OpFunctionParameter  %10\r\n%197 = OpFunctionParameter  %4\r\n%198 = OpFunctionParameter  %8\r\n%195 = OpLabel\r\n%201 = OpLoad  %20  %45\r\nOpBranch %202\r\n%202 = OpLabel\r\n%203 = OpCompositeConstruct  %13  %196 %197\r\n%204 = OpImageQuerySize  %13  %201\r\n%206 = OpISub  %13  %204 %205\r\n%207 = OpExtInst  %13  %1 UMin %203 %206\r\nOpImageWrite %201 %207 %198\r\nOpReturn\r\nOpFunctionEnd\r\n%211 = OpFunction  %2  None %212\r\n%209 = OpFunctionParameter  %13\r\n%210 = OpFunctionParameter  %8\r\n%208 = OpLabel\r\n%213 = OpLoad  %21  %47\r\nOpBranch %214\r\n%214 = OpLabel\r\n%215 = OpImageQuerySize  %13  %213\r\n%217 = OpISub  %13  %215 %216\r\n%218 = OpExtInst  %13  %1 UMin %209 %217\r\nOpImageWrite %213 %218 %210\r\nOpReturn\r\nOpFunctionEnd\r\n%222 = OpFunction  %2  None %223\r\n%219 = OpLabel\r\n%224 = OpLoad  %7  %25\r\n%225 = OpLoad  %9  %27\r\n%226 = OpLoad  %11  %29\r\n%227 = OpLoad  %12  %31\r\n%228 = OpLoad  %14  %33\r\n%229 = OpLoad  %18  %41\r\n%230 = OpLoad  %19  %43\r\n%231 = OpLoad  %20  %45\r\n%232 = OpLoad  %21  %47\r\nOpBranch %233\r\n%233 = OpLabel\r\n%234 = OpFunctionCall  %8  %52 %3 %3\r\n%235 = OpFunctionCall  %8  %67 %22 %3\r\n%236 = OpFunctionCall  %8  %83 %22 %3 %3\r\n%237 = OpFunctionCall  %8  %99 %23 %3\r\n%238 = OpFunctionCall  %8  %114 %22 %3\r\n%239 = OpFunctionCall  %2  %177 %3 %24\r\n%240 = OpFunctionCall  %2  %187 %22 %24\r\n%241 = OpFunctionCall  %2  %199 %22 %3 %24\r\n%242 = OpFunctionCall  %2  %211 %23 %24\r\n%243 = OpCompositeConstruct  %8  %5 %5 %5 %5\r\nOpStore %220 %243\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/bounds-check-image-rzsw.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 274\r\nOpCapability ImageQuery\r\nOpCapability Image1D\r\nOpCapability Shader\r\nOpCapability Sampled1D\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %252 \"fragment_shader\" %250\r\nOpExecutionMode %252 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpName %25 \"image_1d\"\r\nOpName %27 \"image_2d\"\r\nOpName %29 \"image_2d_array\"\r\nOpName %31 \"image_3d\"\r\nOpName %33 \"image_multisampled_2d\"\r\nOpName %35 \"image_depth_2d\"\r\nOpName %37 \"image_depth_2d_array\"\r\nOpName %39 \"image_depth_multisampled_2d\"\r\nOpName %41 \"image_storage_1d\"\r\nOpName %43 \"image_storage_2d\"\r\nOpName %45 \"image_storage_2d_array\"\r\nOpName %47 \"image_storage_3d\"\r\nOpName %50 \"coords\"\r\nOpName %51 \"level\"\r\nOpName %52 \"test_textureLoad_1d\"\r\nOpName %68 \"coords\"\r\nOpName %69 \"level\"\r\nOpName %70 \"test_textureLoad_2d\"\r\nOpName %87 \"coords\"\r\nOpName %88 \"index\"\r\nOpName %89 \"level\"\r\nOpName %90 \"test_textureLoad_2d_array\"\r\nOpName %108 \"coords\"\r\nOpName %109 \"level\"\r\nOpName %110 \"test_textureLoad_3d\"\r\nOpName %126 \"coords\"\r\nOpName %127 \"_sample\"\r\nOpName %128 \"test_textureLoad_multisampled_2d\"\r\nOpName %143 \"coords\"\r\nOpName %144 \"level\"\r\nOpName %145 \"test_textureLoad_depth_2d\"\r\nOpName %162 \"coords\"\r\nOpName %163 \"index\"\r\nOpName %164 \"level\"\r\nOpName %165 \"test_textureLoad_depth_2d_array\"\r\nOpName %183 \"coords\"\r\nOpName %184 \"_sample\"\r\nOpName %185 \"test_textureLoad_depth_multisampled_2d\"\r\nOpName %201 \"coords\"\r\nOpName %202 \"value\"\r\nOpName %203 \"test_textureStore_1d\"\r\nOpName %212 \"coords\"\r\nOpName %213 \"value\"\r\nOpName %214 \"test_textureStore_2d\"\r\nOpName %224 \"coords\"\r\nOpName %225 \"array_index\"\r\nOpName %226 \"value\"\r\nOpName %227 \"test_textureStore_2d_array\"\r\nOpName %238 \"coords\"\r\nOpName %239 \"value\"\r\nOpName %240 \"test_textureStore_3d\"\r\nOpName %252 \"fragment_shader\"\r\nOpDecorate %25 DescriptorSet 0\r\nOpDecorate %25 Binding 0\r\nOpDecorate %27 DescriptorSet 0\r\nOpDecorate %27 Binding 1\r\nOpDecorate %29 DescriptorSet 0\r\nOpDecorate %29 Binding 2\r\nOpDecorate %31 DescriptorSet 0\r\nOpDecorate %31 Binding 3\r\nOpDecorate %33 DescriptorSet 0\r\nOpDecorate %33 Binding 4\r\nOpDecorate %35 DescriptorSet 0\r\nOpDecorate %35 Binding 5\r\nOpDecorate %37 DescriptorSet 0\r\nOpDecorate %37 Binding 6\r\nOpDecorate %39 DescriptorSet 0\r\nOpDecorate %39 Binding 7\r\nOpDecorate %41 NonReadable\r\nOpDecorate %41 DescriptorSet 0\r\nOpDecorate %41 Binding 8\r\nOpDecorate %43 NonReadable\r\nOpDecorate %43 DescriptorSet 0\r\nOpDecorate %43 Binding 9\r\nOpDecorate %45 NonReadable\r\nOpDecorate %45 DescriptorSet 0\r\nOpDecorate %45 Binding 10\r\nOpDecorate %47 NonReadable\r\nOpDecorate %47 DescriptorSet 0\r\nOpDecorate %47 Binding 11\r\nOpDecorate %250 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  0\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  0.0\r\n%7 = OpTypeImage %6 1D 0 0 0 1 Unknown\r\n%8 = OpTypeVector %6 4\r\n%9 = OpTypeImage %6 2D 0 0 0 1 Unknown\r\n%10 = OpTypeVector %4 2\r\n%11 = OpTypeImage %6 2D 0 1 0 1 Unknown\r\n%12 = OpTypeImage %6 3D 0 0 0 1 Unknown\r\n%13 = OpTypeVector %4 3\r\n%14 = OpTypeImage %6 2D 0 0 1 1 Unknown\r\n%15 = OpTypeImage %6 2D 1 0 0 1 Unknown\r\n%16 = OpTypeImage %6 2D 1 1 0 1 Unknown\r\n%17 = OpTypeImage %6 2D 1 0 1 1 Unknown\r\n%18 = OpTypeImage %6 1D 0 0 0 2 Rgba8\r\n%19 = OpTypeImage %6 2D 0 0 0 2 Rgba8\r\n%20 = OpTypeImage %6 2D 0 1 0 2 Rgba8\r\n%21 = OpTypeImage %6 3D 0 0 0 2 Rgba8\r\n%22 = OpConstantComposite  %10  %3 %3\r\n%23 = OpConstantComposite  %13  %3 %3 %3\r\n%24 = OpConstantComposite  %8  %5 %5 %5 %5\r\n%26 = OpTypePointer UniformConstant %7\r\n%25 = OpVariable  %26  UniformConstant\r\n%28 = OpTypePointer UniformConstant %9\r\n%27 = OpVariable  %28  UniformConstant\r\n%30 = OpTypePointer UniformConstant %11\r\n%29 = OpVariable  %30  UniformConstant\r\n%32 = OpTypePointer UniformConstant %12\r\n%31 = OpVariable  %32  UniformConstant\r\n%34 = OpTypePointer UniformConstant %14\r\n%33 = OpVariable  %34  UniformConstant\r\n%36 = OpTypePointer UniformConstant %15\r\n%35 = OpVariable  %36  UniformConstant\r\n%38 = OpTypePointer UniformConstant %16\r\n%37 = OpVariable  %38  UniformConstant\r\n%40 = OpTypePointer UniformConstant %17\r\n%39 = OpVariable  %40  UniformConstant\r\n%42 = OpTypePointer UniformConstant %18\r\n%41 = OpVariable  %42  UniformConstant\r\n%44 = OpTypePointer UniformConstant %19\r\n%43 = OpVariable  %44  UniformConstant\r\n%46 = OpTypePointer UniformConstant %20\r\n%45 = OpVariable  %46  UniformConstant\r\n%48 = OpTypePointer UniformConstant %21\r\n%47 = OpVariable  %48  UniformConstant\r\n%53 = OpTypeFunction %8 %4 %4\r\n%56 = OpTypeBool\r\n%57 = OpConstantNull  %8\r\n%71 = OpTypeFunction %8 %10 %4\r\n%74 = OpConstantNull  %8\r\n%80 = OpTypeVector %56 2\r\n%91 = OpTypeFunction %8 %10 %4 %4\r\n%95 = OpConstantNull  %8\r\n%101 = OpTypeVector %56 3\r\n%111 = OpTypeFunction %8 %13 %4\r\n%114 = OpConstantNull  %8\r\n%131 = OpConstantNull  %8\r\n%146 = OpTypeFunction %6 %10 %4\r\n%149 = OpConstantNull  %8\r\n%166 = OpTypeFunction %6 %10 %4 %4\r\n%170 = OpConstantNull  %8\r\n%188 = OpConstantNull  %8\r\n%204 = OpTypeFunction %2 %4 %8\r\n%215 = OpTypeFunction %2 %10 %8\r\n%228 = OpTypeFunction %2 %10 %4 %8\r\n%241 = OpTypeFunction %2 %13 %8\r\n%251 = OpTypePointer Output %8\r\n%250 = OpVariable  %251  Output\r\n%253 = OpTypeFunction %2\r\n%52 = OpFunction  %8  None %53\r\n%50 = OpFunctionParameter  %4\r\n%51 = OpFunctionParameter  %4\r\n%49 = OpLabel\r\n%54 = OpLoad  %7  %25\r\nOpBranch %55\r\n%55 = OpLabel\r\n%58 = OpImageQueryLevels  %4  %54\r\n%59 = OpULessThan  %56  %51 %58\r\nOpSelectionMerge %60 None\r\nOpBranchConditional %59 %61 %60\r\n%61 = OpLabel\r\n%62 = OpImageQuerySizeLod  %4  %54 %51\r\n%63 = OpULessThan  %56  %50 %62\r\nOpBranchConditional %63 %64 %60\r\n%64 = OpLabel\r\n%65 = OpImageFetch  %8  %54 %50 Lod %51\r\nOpBranch %60\r\n%60 = OpLabel\r\n%66 = OpPhi  %8  %57 %55 %57 %61 %65 %64\r\nOpReturnValue %66\r\nOpFunctionEnd\r\n%70 = OpFunction  %8  None %71\r\n%68 = OpFunctionParameter  %10\r\n%69 = OpFunctionParameter  %4\r\n%67 = OpLabel\r\n%72 = OpLoad  %9  %27\r\nOpBranch %73\r\n%73 = OpLabel\r\n%75 = OpImageQueryLevels  %4  %72\r\n%76 = OpULessThan  %56  %69 %75\r\nOpSelectionMerge %77 None\r\nOpBranchConditional %76 %78 %77\r\n%78 = OpLabel\r\n%79 = OpImageQuerySizeLod  %10  %72 %69\r\n%81 = OpULessThan  %80  %68 %79\r\n%82 = OpAll  %56  %81\r\nOpBranchConditional %82 %83 %77\r\n%83 = OpLabel\r\n%84 = OpImageFetch  %8  %72 %68 Lod %69\r\nOpBranch %77\r\n%77 = OpLabel\r\n%85 = OpPhi  %8  %74 %73 %74 %78 %84 %83\r\nOpReturnValue %85\r\nOpFunctionEnd\r\n%90 = OpFunction  %8  None %91\r\n%87 = OpFunctionParameter  %10\r\n%88 = OpFunctionParameter  %4\r\n%89 = OpFunctionParameter  %4\r\n%86 = OpLabel\r\n%92 = OpLoad  %11  %29\r\nOpBranch %93\r\n%93 = OpLabel\r\n%94 = OpCompositeConstruct  %13  %87 %88\r\n%96 = OpImageQueryLevels  %4  %92\r\n%97 = OpULessThan  %56  %89 %96\r\nOpSelectionMerge %98 None\r\nOpBranchConditional %97 %99 %98\r\n%99 = OpLabel\r\n%100 = OpImageQuerySizeLod  %13  %92 %89\r\n%102 = OpULessThan  %101  %94 %100\r\n%103 = OpAll  %56  %102\r\nOpBranchConditional %103 %104 %98\r\n%104 = OpLabel\r\n%105 = OpImageFetch  %8  %92 %94 Lod %89\r\nOpBranch %98\r\n%98 = OpLabel\r\n%106 = OpPhi  %8  %95 %93 %95 %99 %105 %104\r\nOpReturnValue %106\r\nOpFunctionEnd\r\n%110 = OpFunction  %8  None %111\r\n%108 = OpFunctionParameter  %13\r\n%109 = OpFunctionParameter  %4\r\n%107 = OpLabel\r\n%112 = OpLoad  %12  %31\r\nOpBranch %113\r\n%113 = OpLabel\r\n%115 = OpImageQueryLevels  %4  %112\r\n%116 = OpULessThan  %56  %109 %115\r\nOpSelectionMerge %117 None\r\nOpBranchConditional %116 %118 %117\r\n%118 = OpLabel\r\n%119 = OpImageQuerySizeLod  %13  %112 %109\r\n%120 = OpULessThan  %101  %108 %119\r\n%121 = OpAll  %56  %120\r\nOpBranchConditional %121 %122 %117\r\n%122 = OpLabel\r\n%123 = OpImageFetch  %8  %112 %108 Lod %109\r\nOpBranch %117\r\n%117 = OpLabel\r\n%124 = OpPhi  %8  %114 %113 %114 %118 %123 %122\r\nOpReturnValue %124\r\nOpFunctionEnd\r\n%128 = OpFunction  %8  None %71\r\n%126 = OpFunctionParameter  %10\r\n%127 = OpFunctionParameter  %4\r\n%125 = OpLabel\r\n%129 = OpLoad  %14  %33\r\nOpBranch %130\r\n%130 = OpLabel\r\n%132 = OpImageQuerySamples  %4  %129\r\n%133 = OpULessThan  %56  %127 %132\r\nOpSelectionMerge %134 None\r\nOpBranchConditional %133 %135 %134\r\n%135 = OpLabel\r\n%136 = OpImageQuerySize  %10  %129\r\n%137 = OpULessThan  %80  %126 %136\r\n%138 = OpAll  %56  %137\r\nOpBranchConditional %138 %139 %134\r\n%139 = OpLabel\r\n%140 = OpImageFetch  %8  %129 %126 Sample %127\r\nOpBranch %134\r\n%134 = OpLabel\r\n%141 = OpPhi  %8  %131 %130 %131 %135 %140 %139\r\nOpReturnValue %141\r\nOpFunctionEnd\r\n%145 = OpFunction  %6  None %146\r\n%143 = OpFunctionParameter  %10\r\n%144 = OpFunctionParameter  %4\r\n%142 = OpLabel\r\n%147 = OpLoad  %15  %35\r\nOpBranch %148\r\n%148 = OpLabel\r\n%150 = OpImageQueryLevels  %4  %147\r\n%151 = OpULessThan  %56  %144 %150\r\nOpSelectionMerge %152 None\r\nOpBranchConditional %151 %153 %152\r\n%153 = OpLabel\r\n%154 = OpImageQuerySizeLod  %10  %147 %144\r\n%155 = OpULessThan  %80  %143 %154\r\n%156 = OpAll  %56  %155\r\nOpBranchConditional %156 %157 %152\r\n%157 = OpLabel\r\n%158 = OpImageFetch  %8  %147 %143 Lod %144\r\nOpBranch %152\r\n%152 = OpLabel\r\n%159 = OpPhi  %8  %149 %148 %149 %153 %158 %157\r\n%160 = OpCompositeExtract  %6  %159 0\r\nOpReturnValue %160\r\nOpFunctionEnd\r\n%165 = OpFunction  %6  None %166\r\n%162 = OpFunctionParameter  %10\r\n%163 = OpFunctionParameter  %4\r\n%164 = OpFunctionParameter  %4\r\n%161 = OpLabel\r\n%167 = OpLoad  %16  %37\r\nOpBranch %168\r\n%168 = OpLabel\r\n%169 = OpCompositeConstruct  %13  %162 %163\r\n%171 = OpImageQueryLevels  %4  %167\r\n%172 = OpULessThan  %56  %164 %171\r\nOpSelectionMerge %173 None\r\nOpBranchConditional %172 %174 %173\r\n%174 = OpLabel\r\n%175 = OpImageQuerySizeLod  %13  %167 %164\r\n%176 = OpULessThan  %101  %169 %175\r\n%177 = OpAll  %56  %176\r\nOpBranchConditional %177 %178 %173\r\n%178 = OpLabel\r\n%179 = OpImageFetch  %8  %167 %169 Lod %164\r\nOpBranch %173\r\n%173 = OpLabel\r\n%180 = OpPhi  %8  %170 %168 %170 %174 %179 %178\r\n%181 = OpCompositeExtract  %6  %180 0\r\nOpReturnValue %181\r\nOpFunctionEnd\r\n%185 = OpFunction  %6  None %146\r\n%183 = OpFunctionParameter  %10\r\n%184 = OpFunctionParameter  %4\r\n%182 = OpLabel\r\n%186 = OpLoad  %17  %39\r\nOpBranch %187\r\n%187 = OpLabel\r\n%189 = OpImageQuerySamples  %4  %186\r\n%190 = OpULessThan  %56  %184 %189\r\nOpSelectionMerge %191 None\r\nOpBranchConditional %190 %192 %191\r\n%192 = OpLabel\r\n%193 = OpImageQuerySize  %10  %186\r\n%194 = OpULessThan  %80  %183 %193\r\n%195 = OpAll  %56  %194\r\nOpBranchConditional %195 %196 %191\r\n%196 = OpLabel\r\n%197 = OpImageFetch  %8  %186 %183 Sample %184\r\nOpBranch %191\r\n%191 = OpLabel\r\n%198 = OpPhi  %8  %188 %187 %188 %192 %197 %196\r\n%199 = OpCompositeExtract  %6  %198 0\r\nOpReturnValue %199\r\nOpFunctionEnd\r\n%203 = OpFunction  %2  None %204\r\n%201 = OpFunctionParameter  %4\r\n%202 = OpFunctionParameter  %8\r\n%200 = OpLabel\r\n%205 = OpLoad  %18  %41\r\nOpBranch %206\r\n%206 = OpLabel\r\n%207 = OpImageQuerySize  %4  %205\r\n%208 = OpULessThan  %56  %201 %207\r\nOpSelectionMerge %209 None\r\nOpBranchConditional %208 %210 %209\r\n%210 = OpLabel\r\nOpImageWrite %205 %201 %202\r\nOpBranch %209\r\n%209 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%214 = OpFunction  %2  None %215\r\n%212 = OpFunctionParameter  %10\r\n%213 = OpFunctionParameter  %8\r\n%211 = OpLabel\r\n%216 = OpLoad  %19  %43\r\nOpBranch %217\r\n%217 = OpLabel\r\n%218 = OpImageQuerySize  %10  %216\r\n%219 = OpULessThan  %80  %212 %218\r\n%220 = OpAll  %56  %219\r\nOpSelectionMerge %221 None\r\nOpBranchConditional %220 %222 %221\r\n%222 = OpLabel\r\nOpImageWrite %216 %212 %213\r\nOpBranch %221\r\n%221 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%227 = OpFunction  %2  None %228\r\n%224 = OpFunctionParameter  %10\r\n%225 = OpFunctionParameter  %4\r\n%226 = OpFunctionParameter  %8\r\n%223 = OpLabel\r\n%229 = OpLoad  %20  %45\r\nOpBranch %230\r\n%230 = OpLabel\r\n%231 = OpCompositeConstruct  %13  %224 %225\r\n%232 = OpImageQuerySize  %13  %229\r\n%233 = OpULessThan  %101  %231 %232\r\n%234 = OpAll  %56  %233\r\nOpSelectionMerge %235 None\r\nOpBranchConditional %234 %236 %235\r\n%236 = OpLabel\r\nOpImageWrite %229 %231 %226\r\nOpBranch %235\r\n%235 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%240 = OpFunction  %2  None %241\r\n%238 = OpFunctionParameter  %13\r\n%239 = OpFunctionParameter  %8\r\n%237 = OpLabel\r\n%242 = OpLoad  %21  %47\r\nOpBranch %243\r\n%243 = OpLabel\r\n%244 = OpImageQuerySize  %13  %242\r\n%245 = OpULessThan  %101  %238 %244\r\n%246 = OpAll  %56  %245\r\nOpSelectionMerge %247 None\r\nOpBranchConditional %246 %248 %247\r\n%248 = OpLabel\r\nOpImageWrite %242 %238 %239\r\nOpBranch %247\r\n%247 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%252 = OpFunction  %2  None %253\r\n%249 = OpLabel\r\n%254 = OpLoad  %7  %25\r\n%255 = OpLoad  %9  %27\r\n%256 = OpLoad  %11  %29\r\n%257 = OpLoad  %12  %31\r\n%258 = OpLoad  %14  %33\r\n%259 = OpLoad  %18  %41\r\n%260 = OpLoad  %19  %43\r\n%261 = OpLoad  %20  %45\r\n%262 = OpLoad  %21  %47\r\nOpBranch %263\r\n%263 = OpLabel\r\n%264 = OpFunctionCall  %8  %52 %3 %3\r\n%265 = OpFunctionCall  %8  %70 %22 %3\r\n%266 = OpFunctionCall  %8  %90 %22 %3 %3\r\n%267 = OpFunctionCall  %8  %110 %23 %3\r\n%268 = OpFunctionCall  %8  %128 %22 %3\r\n%269 = OpFunctionCall  %2  %203 %3 %24\r\n%270 = OpFunctionCall  %2  %214 %22 %24\r\n%271 = OpFunctionCall  %2  %227 %22 %3 %24\r\n%272 = OpFunctionCall  %2  %240 %23 %24\r\n%273 = OpCompositeConstruct  %8  %5 %5 %5 %5\r\nOpStore %250 %273\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/bounds-check-restrict.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 166\r\nOpCapability Shader\r\nOpCapability Linkage\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpDecorate %10 ArrayStride 4\r\nOpDecorate %13 ArrayStride 4\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 1 Offset 48\r\nOpMemberDecorate %14 2 Offset 64\r\nOpMemberDecorate %14 2 ColMajor\r\nOpMemberDecorate %14 2 MatrixStride 16\r\nOpMemberDecorate %14 3 Offset 112\r\nOpDecorate %15 DescriptorSet 0\r\nOpDecorate %15 Binding 0\r\nOpDecorate %14 Block\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  10\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  100.0\r\n%7 = OpConstant  %4  9\r\n%8 = OpConstant  %4  3\r\n%9 = OpConstant  %4  2\r\n%10 = OpTypeArray %6 %3\r\n%11 = OpTypeVector %6 4\r\n%12 = OpTypeMatrix %11 3\r\n%13 = OpTypeRuntimeArray %6\r\n%14 = OpTypeStruct %10 %11 %12 %13\r\n%16 = OpTypePointer StorageBuffer %14\r\n%15 = OpVariable  %16  StorageBuffer\r\n%20 = OpTypeFunction %6 %4\r\n%22 = OpTypePointer StorageBuffer %10\r\n%23 = OpTypePointer StorageBuffer %6\r\n%25 = OpTypeInt 32 0\r\n%24 = OpConstant  %25  9\r\n%27 = OpConstant  %25  0\r\n%34 = OpTypePointer StorageBuffer %13\r\n%36 = OpConstant  %25  1\r\n%39 = OpConstant  %25  3\r\n%46 = OpTypePointer StorageBuffer %11\r\n%47 = OpTypePointer StorageBuffer %6\r\n%55 = OpTypeFunction %6 %11 %4\r\n%62 = OpTypeFunction %11 %4\r\n%64 = OpTypePointer StorageBuffer %12\r\n%65 = OpTypePointer StorageBuffer %11\r\n%66 = OpConstant  %25  2\r\n%74 = OpTypeFunction %6 %4 %4\r\n%94 = OpTypeFunction %6\r\n%108 = OpTypeFunction %2 %4 %6\r\n%132 = OpTypeFunction %2 %4 %11\r\n%141 = OpTypeFunction %2 %4 %4 %6\r\n%161 = OpTypeFunction %2 %6\r\n%19 = OpFunction  %6  None %20\r\n%18 = OpFunctionParameter  %4\r\n%17 = OpLabel\r\nOpBranch %21\r\n%21 = OpLabel\r\n%26 = OpExtInst  %25  %1 UMin %18 %24\r\n%28 = OpAccessChain  %23  %15 %27 %26\r\n%29 = OpLoad  %6  %28\r\nOpReturnValue %29\r\nOpFunctionEnd\r\n%32 = OpFunction  %6  None %20\r\n%31 = OpFunctionParameter  %4\r\n%30 = OpLabel\r\nOpBranch %33\r\n%33 = OpLabel\r\n%35 = OpArrayLength  %25  %15 3\r\n%37 = OpISub  %25  %35 %36\r\n%38 = OpExtInst  %25  %1 UMin %31 %37\r\n%40 = OpAccessChain  %23  %15 %39 %38\r\n%41 = OpLoad  %6  %40\r\nOpReturnValue %41\r\nOpFunctionEnd\r\n%44 = OpFunction  %6  None %20\r\n%43 = OpFunctionParameter  %4\r\n%42 = OpLabel\r\nOpBranch %45\r\n%45 = OpLabel\r\n%48 = OpExtInst  %25  %1 UMin %43 %39\r\n%49 = OpAccessChain  %47  %15 %36 %48\r\n%50 = OpLoad  %6  %49\r\nOpReturnValue %50\r\nOpFunctionEnd\r\n%54 = OpFunction  %6  None %55\r\n%52 = OpFunctionParameter  %11\r\n%53 = OpFunctionParameter  %4\r\n%51 = OpLabel\r\nOpBranch %56\r\n%56 = OpLabel\r\n%57 = OpExtInst  %25  %1 UMin %53 %39\r\n%58 = OpVectorExtractDynamic  %6  %52 %57\r\nOpReturnValue %58\r\nOpFunctionEnd\r\n%61 = OpFunction  %11  None %62\r\n%60 = OpFunctionParameter  %4\r\n%59 = OpLabel\r\nOpBranch %63\r\n%63 = OpLabel\r\n%67 = OpExtInst  %25  %1 UMin %60 %66\r\n%68 = OpAccessChain  %65  %15 %66 %67\r\n%69 = OpLoad  %11  %68\r\nOpReturnValue %69\r\nOpFunctionEnd\r\n%73 = OpFunction  %6  None %74\r\n%71 = OpFunctionParameter  %4\r\n%72 = OpFunctionParameter  %4\r\n%70 = OpLabel\r\nOpBranch %75\r\n%75 = OpLabel\r\n%76 = OpExtInst  %25  %1 UMin %72 %39\r\n%77 = OpExtInst  %25  %1 UMin %71 %66\r\n%78 = OpAccessChain  %47  %15 %66 %77 %76\r\n%79 = OpLoad  %6  %78\r\nOpReturnValue %79\r\nOpFunctionEnd\r\n%82 = OpFunction  %6  None %20\r\n%81 = OpFunctionParameter  %4\r\n%80 = OpLabel\r\nOpBranch %83\r\n%83 = OpLabel\r\n%84 = OpConvertSToF  %6  %81\r\n%85 = OpFDiv  %6  %84 %5\r\n%86 = OpExtInst  %6  %1 Sin %85\r\n%87 = OpFMul  %6  %86 %5\r\n%88 = OpConvertFToS  %4  %87\r\n%89 = OpExtInst  %25  %1 UMin %88 %24\r\n%90 = OpAccessChain  %23  %15 %27 %89\r\n%91 = OpLoad  %6  %90\r\nOpReturnValue %91\r\nOpFunctionEnd\r\n%93 = OpFunction  %6  None %94\r\n%92 = OpLabel\r\nOpBranch %95\r\n%95 = OpLabel\r\n%96 = OpAccessChain  %23  %15 %27 %24\r\n%97 = OpLoad  %6  %96\r\n%98 = OpAccessChain  %47  %15 %36 %39\r\n%99 = OpLoad  %6  %98\r\n%100 = OpFAdd  %6  %97 %99\r\n%101 = OpAccessChain  %47  %15 %66 %66 %39\r\n%102 = OpLoad  %6  %101\r\n%103 = OpFAdd  %6  %100 %102\r\nOpReturnValue %103\r\nOpFunctionEnd\r\n%107 = OpFunction  %2  None %108\r\n%105 = OpFunctionParameter  %4\r\n%106 = OpFunctionParameter  %6\r\n%104 = OpLabel\r\nOpBranch %109\r\n%109 = OpLabel\r\n%110 = OpExtInst  %25  %1 UMin %105 %24\r\n%111 = OpAccessChain  %23  %15 %27 %110\r\nOpStore %111 %106\r\nOpReturn\r\nOpFunctionEnd\r\n%115 = OpFunction  %2  None %108\r\n%113 = OpFunctionParameter  %4\r\n%114 = OpFunctionParameter  %6\r\n%112 = OpLabel\r\nOpBranch %116\r\n%116 = OpLabel\r\n%117 = OpArrayLength  %25  %15 3\r\n%118 = OpISub  %25  %117 %36\r\n%119 = OpExtInst  %25  %1 UMin %113 %118\r\n%120 = OpAccessChain  %23  %15 %39 %119\r\nOpStore %120 %114\r\nOpReturn\r\nOpFunctionEnd\r\n%124 = OpFunction  %2  None %108\r\n%122 = OpFunctionParameter  %4\r\n%123 = OpFunctionParameter  %6\r\n%121 = OpLabel\r\nOpBranch %125\r\n%125 = OpLabel\r\n%126 = OpExtInst  %25  %1 UMin %122 %39\r\n%127 = OpAccessChain  %47  %15 %36 %126\r\nOpStore %127 %123\r\nOpReturn\r\nOpFunctionEnd\r\n%131 = OpFunction  %2  None %132\r\n%129 = OpFunctionParameter  %4\r\n%130 = OpFunctionParameter  %11\r\n%128 = OpLabel\r\nOpBranch %133\r\n%133 = OpLabel\r\n%134 = OpExtInst  %25  %1 UMin %129 %66\r\n%135 = OpAccessChain  %65  %15 %66 %134\r\nOpStore %135 %130\r\nOpReturn\r\nOpFunctionEnd\r\n%140 = OpFunction  %2  None %141\r\n%137 = OpFunctionParameter  %4\r\n%138 = OpFunctionParameter  %4\r\n%139 = OpFunctionParameter  %6\r\n%136 = OpLabel\r\nOpBranch %142\r\n%142 = OpLabel\r\n%143 = OpExtInst  %25  %1 UMin %138 %39\r\n%144 = OpExtInst  %25  %1 UMin %137 %66\r\n%145 = OpAccessChain  %47  %15 %66 %144 %143\r\nOpStore %145 %139\r\nOpReturn\r\nOpFunctionEnd\r\n%149 = OpFunction  %2  None %108\r\n%147 = OpFunctionParameter  %4\r\n%148 = OpFunctionParameter  %6\r\n%146 = OpLabel\r\nOpBranch %150\r\n%150 = OpLabel\r\n%151 = OpConvertSToF  %6  %147\r\n%152 = OpFDiv  %6  %151 %5\r\n%153 = OpExtInst  %6  %1 Sin %152\r\n%154 = OpFMul  %6  %153 %5\r\n%155 = OpConvertFToS  %4  %154\r\n%156 = OpExtInst  %25  %1 UMin %155 %24\r\n%157 = OpAccessChain  %23  %15 %27 %156\r\nOpStore %157 %148\r\nOpReturn\r\nOpFunctionEnd\r\n%160 = OpFunction  %2  None %161\r\n%159 = OpFunctionParameter  %6\r\n%158 = OpLabel\r\nOpBranch %162\r\n%162 = OpLabel\r\n%163 = OpAccessChain  %23  %15 %27 %24\r\nOpStore %163 %159\r\n%164 = OpAccessChain  %47  %15 %36 %39\r\nOpStore %164 %159\r\n%165 = OpAccessChain  %47  %15 %66 %66 %39\r\nOpStore %165 %159\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/bounds-check-zero.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 209\r\nOpCapability Shader\r\nOpCapability Linkage\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpDecorate %10 ArrayStride 4\r\nOpDecorate %13 ArrayStride 4\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 1 Offset 48\r\nOpMemberDecorate %14 2 Offset 64\r\nOpMemberDecorate %14 2 ColMajor\r\nOpMemberDecorate %14 2 MatrixStride 16\r\nOpMemberDecorate %14 3 Offset 112\r\nOpDecorate %15 DescriptorSet 0\r\nOpDecorate %15 Binding 0\r\nOpDecorate %14 Block\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  10\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  100.0\r\n%7 = OpConstant  %4  9\r\n%8 = OpConstant  %4  3\r\n%9 = OpConstant  %4  2\r\n%10 = OpTypeArray %6 %3\r\n%11 = OpTypeVector %6 4\r\n%12 = OpTypeMatrix %11 3\r\n%13 = OpTypeRuntimeArray %6\r\n%14 = OpTypeStruct %10 %11 %12 %13\r\n%16 = OpTypePointer StorageBuffer %14\r\n%15 = OpVariable  %16  StorageBuffer\r\n%20 = OpTypeFunction %6 %4\r\n%22 = OpTypePointer StorageBuffer %10\r\n%23 = OpTypePointer StorageBuffer %6\r\n%25 = OpTypeInt 32 0\r\n%24 = OpConstant  %25  10\r\n%27 = OpTypeBool\r\n%28 = OpConstant  %25  0\r\n%30 = OpConstantNull  %6\r\n%39 = OpTypePointer StorageBuffer %13\r\n%42 = OpConstant  %25  3\r\n%44 = OpConstantNull  %6\r\n%53 = OpTypePointer StorageBuffer %11\r\n%54 = OpTypePointer StorageBuffer %6\r\n%55 = OpConstant  %25  4\r\n%57 = OpConstant  %25  1\r\n%59 = OpConstantNull  %6\r\n%68 = OpTypeFunction %6 %11 %4\r\n%71 = OpConstantNull  %6\r\n%79 = OpTypeFunction %11 %4\r\n%81 = OpTypePointer StorageBuffer %12\r\n%82 = OpTypePointer StorageBuffer %11\r\n%84 = OpConstant  %25  2\r\n%86 = OpConstantNull  %11\r\n%95 = OpTypeFunction %6 %4 %4\r\n%101 = OpConstantNull  %6\r\n%117 = OpConstantNull  %6\r\n%124 = OpTypeFunction %6\r\n%126 = OpConstant  %25  9\r\n%139 = OpTypeFunction %2 %4 %6\r\n%168 = OpTypeFunction %2 %4 %11\r\n%179 = OpTypeFunction %2 %4 %4 %6\r\n%204 = OpTypeFunction %2 %6\r\n%19 = OpFunction  %6  None %20\r\n%18 = OpFunctionParameter  %4\r\n%17 = OpLabel\r\nOpBranch %21\r\n%21 = OpLabel\r\n%26 = OpULessThan  %27  %18 %24\r\nOpSelectionMerge %31 None\r\nOpBranchConditional %26 %32 %31\r\n%32 = OpLabel\r\n%29 = OpAccessChain  %23  %15 %28 %18\r\n%33 = OpLoad  %6  %29\r\nOpBranch %31\r\n%31 = OpLabel\r\n%34 = OpPhi  %6  %30 %21 %33 %32\r\nOpReturnValue %34\r\nOpFunctionEnd\r\n%37 = OpFunction  %6  None %20\r\n%36 = OpFunctionParameter  %4\r\n%35 = OpLabel\r\nOpBranch %38\r\n%38 = OpLabel\r\n%40 = OpArrayLength  %25  %15 3\r\n%41 = OpULessThan  %27  %36 %40\r\nOpSelectionMerge %45 None\r\nOpBranchConditional %41 %46 %45\r\n%46 = OpLabel\r\n%43 = OpAccessChain  %23  %15 %42 %36\r\n%47 = OpLoad  %6  %43\r\nOpBranch %45\r\n%45 = OpLabel\r\n%48 = OpPhi  %6  %44 %38 %47 %46\r\nOpReturnValue %48\r\nOpFunctionEnd\r\n%51 = OpFunction  %6  None %20\r\n%50 = OpFunctionParameter  %4\r\n%49 = OpLabel\r\nOpBranch %52\r\n%52 = OpLabel\r\n%56 = OpULessThan  %27  %50 %55\r\nOpSelectionMerge %60 None\r\nOpBranchConditional %56 %61 %60\r\n%61 = OpLabel\r\n%58 = OpAccessChain  %54  %15 %57 %50\r\n%62 = OpLoad  %6  %58\r\nOpBranch %60\r\n%60 = OpLabel\r\n%63 = OpPhi  %6  %59 %52 %62 %61\r\nOpReturnValue %63\r\nOpFunctionEnd\r\n%67 = OpFunction  %6  None %68\r\n%65 = OpFunctionParameter  %11\r\n%66 = OpFunctionParameter  %4\r\n%64 = OpLabel\r\nOpBranch %69\r\n%69 = OpLabel\r\n%70 = OpULessThan  %27  %66 %55\r\nOpSelectionMerge %72 None\r\nOpBranchConditional %70 %73 %72\r\n%73 = OpLabel\r\n%74 = OpVectorExtractDynamic  %6  %65 %66\r\nOpBranch %72\r\n%72 = OpLabel\r\n%75 = OpPhi  %6  %71 %69 %74 %73\r\nOpReturnValue %75\r\nOpFunctionEnd\r\n%78 = OpFunction  %11  None %79\r\n%77 = OpFunctionParameter  %4\r\n%76 = OpLabel\r\nOpBranch %80\r\n%80 = OpLabel\r\n%83 = OpULessThan  %27  %77 %42\r\nOpSelectionMerge %87 None\r\nOpBranchConditional %83 %88 %87\r\n%88 = OpLabel\r\n%85 = OpAccessChain  %82  %15 %84 %77\r\n%89 = OpLoad  %11  %85\r\nOpBranch %87\r\n%87 = OpLabel\r\n%90 = OpPhi  %11  %86 %80 %89 %88\r\nOpReturnValue %90\r\nOpFunctionEnd\r\n%94 = OpFunction  %6  None %95\r\n%92 = OpFunctionParameter  %4\r\n%93 = OpFunctionParameter  %4\r\n%91 = OpLabel\r\nOpBranch %96\r\n%96 = OpLabel\r\n%97 = OpULessThan  %27  %93 %55\r\n%98 = OpULessThan  %27  %92 %42\r\n%99 = OpLogicalAnd  %27  %97 %98\r\nOpSelectionMerge %102 None\r\nOpBranchConditional %99 %103 %102\r\n%103 = OpLabel\r\n%100 = OpAccessChain  %54  %15 %84 %92 %93\r\n%104 = OpLoad  %6  %100\r\nOpBranch %102\r\n%102 = OpLabel\r\n%105 = OpPhi  %6  %101 %96 %104 %103\r\nOpReturnValue %105\r\nOpFunctionEnd\r\n%108 = OpFunction  %6  None %20\r\n%107 = OpFunctionParameter  %4\r\n%106 = OpLabel\r\nOpBranch %109\r\n%109 = OpLabel\r\n%110 = OpConvertSToF  %6  %107\r\n%111 = OpFDiv  %6  %110 %5\r\n%112 = OpExtInst  %6  %1 Sin %111\r\n%113 = OpFMul  %6  %112 %5\r\n%114 = OpConvertFToS  %4  %113\r\n%115 = OpULessThan  %27  %114 %24\r\nOpSelectionMerge %118 None\r\nOpBranchConditional %115 %119 %118\r\n%119 = OpLabel\r\n%116 = OpAccessChain  %23  %15 %28 %114\r\n%120 = OpLoad  %6  %116\r\nOpBranch %118\r\n%118 = OpLabel\r\n%121 = OpPhi  %6  %117 %109 %120 %119\r\nOpReturnValue %121\r\nOpFunctionEnd\r\n%123 = OpFunction  %6  None %124\r\n%122 = OpLabel\r\nOpBranch %125\r\n%125 = OpLabel\r\n%127 = OpAccessChain  %23  %15 %28 %126\r\n%128 = OpLoad  %6  %127\r\n%129 = OpAccessChain  %54  %15 %57 %42\r\n%130 = OpLoad  %6  %129\r\n%131 = OpFAdd  %6  %128 %130\r\n%132 = OpAccessChain  %54  %15 %84 %84 %42\r\n%133 = OpLoad  %6  %132\r\n%134 = OpFAdd  %6  %131 %133\r\nOpReturnValue %134\r\nOpFunctionEnd\r\n%138 = OpFunction  %2  None %139\r\n%136 = OpFunctionParameter  %4\r\n%137 = OpFunctionParameter  %6\r\n%135 = OpLabel\r\nOpBranch %140\r\n%140 = OpLabel\r\n%141 = OpULessThan  %27  %136 %24\r\nOpSelectionMerge %143 None\r\nOpBranchConditional %141 %144 %143\r\n%144 = OpLabel\r\n%142 = OpAccessChain  %23  %15 %28 %136\r\nOpStore %142 %137\r\nOpBranch %143\r\n%143 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%148 = OpFunction  %2  None %139\r\n%146 = OpFunctionParameter  %4\r\n%147 = OpFunctionParameter  %6\r\n%145 = OpLabel\r\nOpBranch %149\r\n%149 = OpLabel\r\n%150 = OpArrayLength  %25  %15 3\r\n%151 = OpULessThan  %27  %146 %150\r\nOpSelectionMerge %153 None\r\nOpBranchConditional %151 %154 %153\r\n%154 = OpLabel\r\n%152 = OpAccessChain  %23  %15 %42 %146\r\nOpStore %152 %147\r\nOpBranch %153\r\n%153 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%158 = OpFunction  %2  None %139\r\n%156 = OpFunctionParameter  %4\r\n%157 = OpFunctionParameter  %6\r\n%155 = OpLabel\r\nOpBranch %159\r\n%159 = OpLabel\r\n%160 = OpULessThan  %27  %156 %55\r\nOpSelectionMerge %162 None\r\nOpBranchConditional %160 %163 %162\r\n%163 = OpLabel\r\n%161 = OpAccessChain  %54  %15 %57 %156\r\nOpStore %161 %157\r\nOpBranch %162\r\n%162 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%167 = OpFunction  %2  None %168\r\n%165 = OpFunctionParameter  %4\r\n%166 = OpFunctionParameter  %11\r\n%164 = OpLabel\r\nOpBranch %169\r\n%169 = OpLabel\r\n%170 = OpULessThan  %27  %165 %42\r\nOpSelectionMerge %172 None\r\nOpBranchConditional %170 %173 %172\r\n%173 = OpLabel\r\n%171 = OpAccessChain  %82  %15 %84 %165\r\nOpStore %171 %166\r\nOpBranch %172\r\n%172 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%178 = OpFunction  %2  None %179\r\n%175 = OpFunctionParameter  %4\r\n%176 = OpFunctionParameter  %4\r\n%177 = OpFunctionParameter  %6\r\n%174 = OpLabel\r\nOpBranch %180\r\n%180 = OpLabel\r\n%181 = OpULessThan  %27  %176 %55\r\n%182 = OpULessThan  %27  %175 %42\r\n%183 = OpLogicalAnd  %27  %181 %182\r\nOpSelectionMerge %185 None\r\nOpBranchConditional %183 %186 %185\r\n%186 = OpLabel\r\n%184 = OpAccessChain  %54  %15 %84 %175 %176\r\nOpStore %184 %177\r\nOpBranch %185\r\n%185 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%190 = OpFunction  %2  None %139\r\n%188 = OpFunctionParameter  %4\r\n%189 = OpFunctionParameter  %6\r\n%187 = OpLabel\r\nOpBranch %191\r\n%191 = OpLabel\r\n%192 = OpConvertSToF  %6  %188\r\n%193 = OpFDiv  %6  %192 %5\r\n%194 = OpExtInst  %6  %1 Sin %193\r\n%195 = OpFMul  %6  %194 %5\r\n%196 = OpConvertFToS  %4  %195\r\n%197 = OpULessThan  %27  %196 %24\r\nOpSelectionMerge %199 None\r\nOpBranchConditional %197 %200 %199\r\n%200 = OpLabel\r\n%198 = OpAccessChain  %23  %15 %28 %196\r\nOpStore %198 %189\r\nOpBranch %199\r\n%199 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%203 = OpFunction  %2  None %204\r\n%202 = OpFunctionParameter  %6\r\n%201 = OpLabel\r\nOpBranch %205\r\n%205 = OpLabel\r\n%206 = OpAccessChain  %23  %15 %28 %126\r\nOpStore %206 %202\r\n%207 = OpAccessChain  %54  %15 %57 %42\r\nOpStore %207 %202\r\n%208 = OpAccessChain  %54  %15 %84 %84 %42\r\nOpStore %208 %202\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/break-if.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 50\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %48 \"main\"\r\nOpExecutionMode %48 LocalSize 1 1 1\r\n%2 = OpTypeVoid\r\n%4 = OpTypeBool\r\n%3 = OpConstantTrue  %4\r\n%7 = OpTypeFunction %2\r\n%14 = OpTypePointer Function %4\r\n%15 = OpConstantNull  %4\r\n%17 = OpConstantNull  %4\r\n%21 = OpTypeFunction %2 %4\r\n%32 = OpConstantNull  %4\r\n%34 = OpConstantNull  %4\r\n%6 = OpFunction  %2  None %7\r\n%5 = OpLabel\r\nOpBranch %8\r\n%8 = OpLabel\r\nOpBranch %9\r\n%9 = OpLabel\r\nOpLoopMerge %10 %12 None\r\nOpBranch %11\r\n%11 = OpLabel\r\nOpBranch %12\r\n%12 = OpLabel\r\nOpBranchConditional %3 %10 %9\r\n%10 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%20 = OpFunction  %2  None %21\r\n%19 = OpFunctionParameter  %4\r\n%18 = OpLabel\r\n%13 = OpVariable  %14  Function %15\r\n%16 = OpVariable  %14  Function %17\r\nOpBranch %22\r\n%22 = OpLabel\r\nOpBranch %23\r\n%23 = OpLabel\r\nOpLoopMerge %24 %26 None\r\nOpBranch %25\r\n%25 = OpLabel\r\nOpBranch %26\r\n%26 = OpLabel\r\nOpStore %13 %19\r\n%27 = OpLoad  %4  %13\r\n%28 = OpLogicalNotEqual  %4  %19 %27\r\nOpStore %16 %28\r\n%29 = OpLoad  %4  %16\r\n%30 = OpLogicalEqual  %4  %19 %29\r\nOpBranchConditional %30 %24 %23\r\n%24 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%37 = OpFunction  %2  None %21\r\n%36 = OpFunctionParameter  %4\r\n%35 = OpLabel\r\n%31 = OpVariable  %14  Function %32\r\n%33 = OpVariable  %14  Function %34\r\nOpBranch %38\r\n%38 = OpLabel\r\nOpBranch %39\r\n%39 = OpLabel\r\nOpLoopMerge %40 %42 None\r\nOpBranch %41\r\n%41 = OpLabel\r\nOpStore %31 %36\r\n%43 = OpLoad  %4  %31\r\n%44 = OpLogicalNotEqual  %4  %36 %43\r\nOpStore %33 %44\r\nOpBranch %42\r\n%42 = OpLabel\r\n%45 = OpLoad  %4  %33\r\n%46 = OpLogicalEqual  %4  %36 %45\r\nOpBranchConditional %46 %40 %39\r\n%40 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%48 = OpFunction  %2  None %7\r\n%47 = OpLabel\r\nOpBranch %49\r\n%49 = OpLabel\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/collatz.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 60\r\nOpCapability Shader\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %49 \"main\" %46\r\nOpExecutionMode %49 LocalSize 1 1 1\r\nOpSource GLSL 450\r\nOpMemberName %9 0 \"data\"\r\nOpName %9 \"PrimeIndices\"\r\nOpName %11 \"v_indices\"\r\nOpName %13 \"n\"\r\nOpName %16 \"i\"\r\nOpName %18 \"n_base\"\r\nOpName %19 \"collatz_iterations\"\r\nOpName %46 \"global_id\"\r\nOpName %49 \"main\"\r\nOpDecorate %8 ArrayStride 4\r\nOpMemberDecorate %9 0 Offset 0\r\nOpDecorate %11 DescriptorSet 0\r\nOpDecorate %11 Binding 0\r\nOpDecorate %9 Block\r\nOpDecorate %46 BuiltIn GlobalInvocationId\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 0\r\n%3 = OpConstant  %4  0\r\n%5 = OpConstant  %4  1\r\n%6 = OpConstant  %4  2\r\n%7 = OpConstant  %4  3\r\n%8 = OpTypeRuntimeArray %4\r\n%9 = OpTypeStruct %8\r\n%10 = OpTypeVector %4 3\r\n%12 = OpTypePointer StorageBuffer %9\r\n%11 = OpVariable  %12  StorageBuffer\r\n%14 = OpTypePointer Function %4\r\n%15 = OpConstantNull  %4\r\n%20 = OpTypeFunction %4 %4\r\n%27 = OpTypeBool\r\n%47 = OpTypePointer Input %10\r\n%46 = OpVariable  %47  Input\r\n%50 = OpTypeFunction %2\r\n%52 = OpTypePointer StorageBuffer %8\r\n%54 = OpTypePointer StorageBuffer %4\r\n%19 = OpFunction  %4  None %20\r\n%18 = OpFunctionParameter  %4\r\n%17 = OpLabel\r\n%13 = OpVariable  %14  Function %15\r\n%16 = OpVariable  %14  Function %3\r\nOpBranch %21\r\n%21 = OpLabel\r\nOpStore %13 %18\r\nOpBranch %22\r\n%22 = OpLabel\r\nOpLoopMerge %23 %25 None\r\nOpBranch %24\r\n%24 = OpLabel\r\n%26 = OpLoad  %4  %13\r\n%28 = OpUGreaterThan  %27  %26 %5\r\nOpSelectionMerge %29 None\r\nOpBranchConditional %28 %29 %30\r\n%30 = OpLabel\r\nOpBranch %23\r\n%29 = OpLabel\r\n%31 = OpLoad  %4  %13\r\n%32 = OpUMod  %4  %31 %6\r\n%33 = OpIEqual  %27  %32 %3\r\nOpSelectionMerge %34 None\r\nOpBranchConditional %33 %35 %36\r\n%35 = OpLabel\r\n%37 = OpLoad  %4  %13\r\n%38 = OpUDiv  %4  %37 %6\r\nOpStore %13 %38\r\nOpBranch %34\r\n%36 = OpLabel\r\n%39 = OpLoad  %4  %13\r\n%40 = OpIMul  %4  %7 %39\r\n%41 = OpIAdd  %4  %40 %5\r\nOpStore %13 %41\r\nOpBranch %34\r\n%34 = OpLabel\r\n%42 = OpLoad  %4  %16\r\n%43 = OpIAdd  %4  %42 %5\r\nOpStore %16 %43\r\nOpBranch %25\r\n%25 = OpLabel\r\nOpBranch %22\r\n%23 = OpLabel\r\n%44 = OpLoad  %4  %16\r\nOpReturnValue %44\r\nOpFunctionEnd\r\n%49 = OpFunction  %2  None %50\r\n%45 = OpLabel\r\n%48 = OpLoad  %10  %46\r\nOpBranch %51\r\n%51 = OpLabel\r\n%53 = OpCompositeExtract  %4  %48 0\r\n%55 = OpCompositeExtract  %4  %48 0\r\n%56 = OpAccessChain  %54  %11 %3 %55\r\n%57 = OpLoad  %4  %56\r\n%58 = OpFunctionCall  %4  %19 %57\r\n%59 = OpAccessChain  %54  %11 %3 %53\r\nOpStore %59 %58\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/control-flow.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 69\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %44 \"main\" %41\r\nOpExecutionMode %44 LocalSize 1 1 1\r\nOpDecorate %41 BuiltIn GlobalInvocationId\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  1\r\n%5 = OpConstant  %4  0\r\n%6 = OpConstant  %4  2\r\n%7 = OpConstant  %4  3\r\n%8 = OpConstant  %4  4\r\n%10 = OpTypeInt 32 0\r\n%9 = OpConstant  %10  0\r\n%11 = OpTypeVector %10 3\r\n%15 = OpTypeFunction %2 %4\r\n%21 = OpTypeFunction %2\r\n%38 = OpTypePointer Function %4\r\n%39 = OpConstantNull  %4\r\n%42 = OpTypePointer Input %11\r\n%41 = OpVariable  %42  Input\r\n%46 = OpConstant  %10  2\r\n%47 = OpConstant  %10  1\r\n%48 = OpConstant  %10  72\r\n%49 = OpConstant  %10  264\r\n%14 = OpFunction  %2  None %15\r\n%13 = OpFunctionParameter  %4\r\n%12 = OpLabel\r\nOpBranch %16\r\n%16 = OpLabel\r\nOpSelectionMerge %17 None\r\nOpSwitch %13 %18\r\n%18 = OpLabel\r\nOpBranch %17\r\n%17 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%20 = OpFunction  %2  None %21\r\n%19 = OpLabel\r\nOpBranch %22\r\n%22 = OpLabel\r\nOpSelectionMerge %23 None\r\nOpSwitch %5 %24 0 %25\r\n%25 = OpLabel\r\nOpBranch %23\r\n%24 = OpLabel\r\nOpBranch %23\r\n%23 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%28 = OpFunction  %2  None %15\r\n%27 = OpFunctionParameter  %4\r\n%26 = OpLabel\r\nOpBranch %29\r\n%29 = OpLabel\r\nOpBranch %30\r\n%30 = OpLabel\r\nOpLoopMerge %31 %33 None\r\nOpBranch %32\r\n%32 = OpLabel\r\nOpSelectionMerge %34 None\r\nOpSwitch %27 %35 1 %36\r\n%36 = OpLabel\r\nOpBranch %33\r\n%35 = OpLabel\r\nOpBranch %34\r\n%34 = OpLabel\r\nOpBranch %33\r\n%33 = OpLabel\r\nOpBranch %30\r\n%31 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%44 = OpFunction  %2  None %21\r\n%40 = OpLabel\r\n%37 = OpVariable  %38  Function %39\r\n%43 = OpLoad  %11  %41\r\nOpBranch %45\r\n%45 = OpLabel\r\nOpControlBarrier %46 %47 %48\r\nOpControlBarrier %46 %46 %49\r\nOpSelectionMerge %50 None\r\nOpSwitch %3 %51\r\n%51 = OpLabel\r\nOpStore %37 %3\r\nOpBranch %50\r\n%50 = OpLabel\r\n%52 = OpLoad  %4  %37\r\nOpSelectionMerge %53 None\r\nOpSwitch %52 %54 1 %55 2 %56 3 %57 4 %58\r\n%55 = OpLabel\r\nOpStore %37 %5\r\nOpBranch %53\r\n%56 = OpLabel\r\nOpStore %37 %3\r\nOpBranch %53\r\n%57 = OpLabel\r\nOpStore %37 %6\r\nOpBranch %58\r\n%58 = OpLabel\r\nOpStore %37 %7\r\nOpBranch %54\r\n%54 = OpLabel\r\nOpStore %37 %8\r\nOpBranch %53\r\n%53 = OpLabel\r\nOpSelectionMerge %59 None\r\nOpSwitch %9 %60 0 %61\r\n%61 = OpLabel\r\nOpBranch %59\r\n%60 = OpLabel\r\nOpBranch %59\r\n%59 = OpLabel\r\n%62 = OpLoad  %4  %37\r\nOpSelectionMerge %63 None\r\nOpSwitch %62 %64 1 %65 2 %66 3 %67 4 %68\r\n%65 = OpLabel\r\nOpStore %37 %5\r\nOpBranch %63\r\n%66 = OpLabel\r\nOpStore %37 %3\r\nOpReturn\r\n%67 = OpLabel\r\nOpStore %37 %6\r\nOpBranch %68\r\n%68 = OpLabel\r\nOpReturn\r\n%64 = OpLabel\r\nOpStore %37 %7\r\nOpReturn\r\n%63 = OpLabel\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/empty.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 7\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %4 \"main\"\r\nOpExecutionMode %4 LocalSize 1 1 1\r\n%2 = OpTypeVoid\r\n%5 = OpTypeFunction %2\r\n%4 = OpFunction  %2  None %5\r\n%3 = OpLabel\r\nOpBranch %6\r\n%6 = OpLabel\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/extra.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.2\r\n; Generator: rspirv\r\n; Bound: 48\r\nOpCapability Shader\r\nOpCapability Float64\r\nOpCapability Geometry\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %24 \"main\" %16 %19 %22\r\nOpExecutionMode %24 OriginUpperLeft\r\nOpMemberDecorate %8 0 Offset 0\r\nOpMemberDecorate %8 1 Offset 16\r\nOpMemberDecorate %10 0 Offset 0\r\nOpMemberDecorate %10 1 Offset 16\r\nOpDecorate %12 Block\r\nOpMemberDecorate %12 0 Offset 0\r\nOpDecorate %16 Location 0\r\nOpDecorate %19 BuiltIn PrimitiveId\r\nOpDecorate %19 Flat\r\nOpDecorate %22 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%5 = OpTypeInt 32 0\r\n%7 = OpTypeFloat 64\r\n%6 = OpTypeVector %7 2\r\n%8 = OpTypeStruct %5 %6\r\n%9 = OpTypeVector %4 4\r\n%10 = OpTypeStruct %9 %5\r\n%12 = OpTypeStruct %8\r\n%13 = OpTypePointer PushConstant %12\r\n%11 = OpVariable  %13  PushConstant\r\n%17 = OpTypePointer Input %9\r\n%16 = OpVariable  %17  Input\r\n%20 = OpTypePointer Input %5\r\n%19 = OpVariable  %20  Input\r\n%23 = OpTypePointer Output %9\r\n%22 = OpVariable  %23  Output\r\n%25 = OpTypeFunction %2\r\n%26 = OpTypePointer PushConstant %8\r\n%27 = OpConstant  %5  0\r\n%31 = OpTypePointer PushConstant %5\r\n%34 = OpTypeBool\r\n%40 = OpTypeVector %4 3\r\n%24 = OpFunction  %2  None %25\r\n%14 = OpLabel\r\n%18 = OpLoad  %9  %16\r\n%21 = OpLoad  %5  %19\r\n%15 = OpCompositeConstruct  %10  %18 %21\r\n%28 = OpAccessChain  %26  %11 %27\r\nOpBranch %29\r\n%29 = OpLabel\r\n%30 = OpCompositeExtract  %5  %15 1\r\n%32 = OpAccessChain  %31  %28 %27\r\n%33 = OpLoad  %5  %32\r\n%35 = OpIEqual  %34  %30 %33\r\nOpSelectionMerge %36 None\r\nOpBranchConditional %35 %37 %38\r\n%37 = OpLabel\r\n%39 = OpCompositeExtract  %9  %15 0\r\nOpStore %22 %39\r\nOpReturn\r\n%38 = OpLabel\r\n%41 = OpCompositeConstruct  %40  %3 %3 %3\r\n%42 = OpCompositeExtract  %9  %15 0\r\n%43 = OpVectorShuffle  %40  %42 %42 0 1 2\r\n%44 = OpFSub  %40  %41 %43\r\n%45 = OpCompositeExtract  %9  %15 0\r\n%46 = OpCompositeExtract  %4  %45 3\r\n%47 = OpCompositeConstruct  %9  %44 %46\r\nOpStore %22 %47\r\nOpReturn\r\n%36 = OpLabel\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/functions.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 79\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %74 \"main\"\r\nOpExecutionMode %74 LocalSize 1 1 1\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  2.0\r\n%5 = OpConstant  %4  0.5\r\n%7 = OpTypeInt 32 1\r\n%6 = OpConstant  %7  1\r\n%9 = OpTypeInt 32 0\r\n%8 = OpConstant  %9  1\r\n%10 = OpConstant  %7  4\r\n%11 = OpConstant  %7  2\r\n%12 = OpTypeVector %4 2\r\n%15 = OpTypeFunction %12\r\n%23 = OpTypeFunction %7\r\n%25 = OpTypeVector %7 2\r\n%37 = OpTypeVector %9 3\r\n%53 = OpTypeVector %7 4\r\n%75 = OpTypeFunction %2\r\n%29 = OpConstantNull  %7\r\n%41 = OpConstantNull  %9\r\n%57 = OpConstantNull  %7\r\n%14 = OpFunction  %12  None %15\r\n%13 = OpLabel\r\nOpBranch %16\r\n%16 = OpLabel\r\n%17 = OpCompositeConstruct  %12  %3 %3\r\n%18 = OpCompositeConstruct  %12  %5 %5\r\n%19 = OpCompositeConstruct  %12  %5 %5\r\n%20 = OpExtInst  %12  %1 Fma %17 %18 %19\r\nOpReturnValue %20\r\nOpFunctionEnd\r\n%22 = OpFunction  %7  None %23\r\n%21 = OpLabel\r\nOpBranch %24\r\n%24 = OpLabel\r\n%26 = OpCompositeConstruct  %25  %6 %6\r\n%27 = OpCompositeConstruct  %25  %6 %6\r\n%30 = OpCompositeExtract  %7  %26 0\r\n%31 = OpCompositeExtract  %7  %27 0\r\n%32 = OpIMul  %7  %30 %31\r\n%33 = OpIAdd  %7  %29 %32\r\n%34 = OpCompositeExtract  %7  %26 1\r\n%35 = OpCompositeExtract  %7  %27 1\r\n%36 = OpIMul  %7  %34 %35\r\n%28 = OpIAdd  %7  %33 %36\r\n%38 = OpCompositeConstruct  %37  %8 %8 %8\r\n%39 = OpCompositeConstruct  %37  %8 %8 %8\r\n%42 = OpCompositeExtract  %9  %38 0\r\n%43 = OpCompositeExtract  %9  %39 0\r\n%44 = OpIMul  %9  %42 %43\r\n%45 = OpIAdd  %9  %41 %44\r\n%46 = OpCompositeExtract  %9  %38 1\r\n%47 = OpCompositeExtract  %9  %39 1\r\n%48 = OpIMul  %9  %46 %47\r\n%49 = OpIAdd  %9  %45 %48\r\n%50 = OpCompositeExtract  %9  %38 2\r\n%51 = OpCompositeExtract  %9  %39 2\r\n%52 = OpIMul  %9  %50 %51\r\n%40 = OpIAdd  %9  %49 %52\r\n%54 = OpCompositeConstruct  %53  %10 %10 %10 %10\r\n%55 = OpCompositeConstruct  %53  %11 %11 %11 %11\r\n%58 = OpCompositeExtract  %7  %54 0\r\n%59 = OpCompositeExtract  %7  %55 0\r\n%60 = OpIMul  %7  %58 %59\r\n%61 = OpIAdd  %7  %57 %60\r\n%62 = OpCompositeExtract  %7  %54 1\r\n%63 = OpCompositeExtract  %7  %55 1\r\n%64 = OpIMul  %7  %62 %63\r\n%65 = OpIAdd  %7  %61 %64\r\n%66 = OpCompositeExtract  %7  %54 2\r\n%67 = OpCompositeExtract  %7  %55 2\r\n%68 = OpIMul  %7  %66 %67\r\n%69 = OpIAdd  %7  %65 %68\r\n%70 = OpCompositeExtract  %7  %54 3\r\n%71 = OpCompositeExtract  %7  %55 3\r\n%72 = OpIMul  %7  %70 %71\r\n%56 = OpIAdd  %7  %69 %72\r\nOpReturnValue %56\r\nOpFunctionEnd\r\n%74 = OpFunction  %2  None %75\r\n%73 = OpLabel\r\nOpBranch %76\r\n%76 = OpLabel\r\n%77 = OpFunctionCall  %12  %14\r\n%78 = OpFunctionCall  %7  %22\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/globals.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 169\r\nOpCapability Shader\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %114 \"main\"\r\nOpExecutionMode %114 LocalSize 1 1 1\r\nOpDecorate %25 ArrayStride 4\r\nOpMemberDecorate %27 0 Offset 0\r\nOpMemberDecorate %27 1 Offset 12\r\nOpDecorate %29 ArrayStride 8\r\nOpDecorate %31 ArrayStride 16\r\nOpDecorate %34 ArrayStride 32\r\nOpDecorate %35 ArrayStride 64\r\nOpDecorate %37 ArrayStride 32\r\nOpDecorate %38 ArrayStride 64\r\nOpDecorate %46 DescriptorSet 0\r\nOpDecorate %46 Binding 1\r\nOpDecorate %47 Block\r\nOpMemberDecorate %47 0 Offset 0\r\nOpDecorate %49 NonWritable\r\nOpDecorate %49 DescriptorSet 0\r\nOpDecorate %49 Binding 2\r\nOpDecorate %50 Block\r\nOpMemberDecorate %50 0 Offset 0\r\nOpDecorate %52 DescriptorSet 0\r\nOpDecorate %52 Binding 3\r\nOpDecorate %53 Block\r\nOpMemberDecorate %53 0 Offset 0\r\nOpDecorate %55 DescriptorSet 0\r\nOpDecorate %55 Binding 4\r\nOpDecorate %56 Block\r\nOpMemberDecorate %56 0 Offset 0\r\nOpDecorate %58 DescriptorSet 0\r\nOpDecorate %58 Binding 5\r\nOpDecorate %59 Block\r\nOpMemberDecorate %59 0 Offset 0\r\nOpMemberDecorate %59 0 ColMajor\r\nOpMemberDecorate %59 0 MatrixStride 8\r\nOpDecorate %61 DescriptorSet 0\r\nOpDecorate %61 Binding 6\r\nOpDecorate %62 Block\r\nOpMemberDecorate %62 0 Offset 0\r\nOpDecorate %64 DescriptorSet 0\r\nOpDecorate %64 Binding 7\r\nOpDecorate %65 Block\r\nOpMemberDecorate %65 0 Offset 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeBool\r\n%3 = OpConstantTrue  %4\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  10\r\n%8 = OpTypeInt 32 1\r\n%7 = OpConstant  %8  20\r\n%9 = OpConstant  %8  2\r\n%11 = OpTypeFloat 32\r\n%10 = OpConstant  %11  1.0\r\n%12 = OpConstant  %8  1\r\n%13 = OpConstant  %8  0\r\n%14 = OpConstant  %11  2.0\r\n%15 = OpConstant  %11  3.0\r\n%16 = OpConstant  %11  0.0\r\n%17 = OpConstant  %8  7\r\n%18 = OpConstant  %8  6\r\n%19 = OpConstant  %8  5\r\n%20 = OpConstant  %8  4\r\n%21 = OpConstant  %8  3\r\n%22 = OpConstant  %11  4.0\r\n%23 = OpConstant  %6  2\r\n%24 = OpConstantTrue  %4\r\n%25 = OpTypeArray %11 %5\r\n%26 = OpTypeVector %11 3\r\n%27 = OpTypeStruct %26 %11\r\n%28 = OpTypeVector %11 2\r\n%29 = OpTypeRuntimeArray %28\r\n%30 = OpTypeVector %11 4\r\n%31 = OpTypeArray %30 %7\r\n%32 = OpTypeMatrix %28 3\r\n%33 = OpTypeMatrix %30 2\r\n%34 = OpTypeArray %33 %9\r\n%35 = OpTypeArray %34 %9\r\n%36 = OpTypeMatrix %28 4\r\n%37 = OpTypeArray %36 %9\r\n%38 = OpTypeArray %37 %9\r\n%39 = OpTypeMatrix %26 3\r\n%40 = OpConstantComposite  %26  %16 %16 %16\r\n%41 = OpConstantComposite  %39  %40 %40 %40\r\n%43 = OpTypePointer Workgroup %25\r\n%42 = OpVariable  %43  Workgroup\r\n%45 = OpTypePointer Workgroup %6\r\n%44 = OpVariable  %45  Workgroup\r\n%47 = OpTypeStruct %27\r\n%48 = OpTypePointer StorageBuffer %47\r\n%46 = OpVariable  %48  StorageBuffer\r\n%50 = OpTypeStruct %29\r\n%51 = OpTypePointer StorageBuffer %50\r\n%49 = OpVariable  %51  StorageBuffer\r\n%53 = OpTypeStruct %31\r\n%54 = OpTypePointer Uniform %53\r\n%52 = OpVariable  %54  Uniform\r\n%56 = OpTypeStruct %26\r\n%57 = OpTypePointer Uniform %56\r\n%55 = OpVariable  %57  Uniform\r\n%59 = OpTypeStruct %32\r\n%60 = OpTypePointer Uniform %59\r\n%58 = OpVariable  %60  Uniform\r\n%62 = OpTypeStruct %35\r\n%63 = OpTypePointer Uniform %62\r\n%61 = OpVariable  %63  Uniform\r\n%65 = OpTypeStruct %38\r\n%66 = OpTypePointer Uniform %65\r\n%64 = OpVariable  %66  Uniform\r\n%70 = OpTypeFunction %2 %26\r\n%71 = OpTypePointer StorageBuffer %29\r\n%72 = OpTypePointer Uniform %26\r\n%73 = OpTypePointer StorageBuffer %27\r\n%74 = OpTypePointer Uniform %35\r\n%75 = OpTypePointer Uniform %31\r\n%76 = OpTypePointer Uniform %38\r\n%77 = OpTypePointer Uniform %32\r\n%80 = OpTypePointer Function %8\r\n%83 = OpTypeFunction %2\r\n%84 = OpConstant  %6  0\r\n%87 = OpTypePointer StorageBuffer %26\r\n%90 = OpTypePointer StorageBuffer %11\r\n%110 = OpTypePointer Function %11\r\n%112 = OpTypePointer Function %4\r\n%124 = OpTypePointer Workgroup %11\r\n%125 = OpTypePointer Uniform %37\r\n%126 = OpTypePointer Uniform %36\r\n%129 = OpTypePointer Uniform %34\r\n%130 = OpTypePointer Uniform %33\r\n%131 = OpTypePointer Uniform %30\r\n%136 = OpConstant  %6  7\r\n%142 = OpConstant  %6  6\r\n%144 = OpTypePointer StorageBuffer %28\r\n%145 = OpConstant  %6  1\r\n%148 = OpConstant  %6  5\r\n%150 = OpTypePointer Uniform %30\r\n%151 = OpTypePointer Uniform %11\r\n%152 = OpConstant  %6  3\r\n%155 = OpConstant  %6  4\r\n%157 = OpTypePointer StorageBuffer %11\r\n%168 = OpConstant  %6  256\r\n%69 = OpFunction  %2  None %70\r\n%68 = OpFunctionParameter  %26\r\n%67 = OpLabel\r\nOpBranch %78\r\n%78 = OpLabel\r\nOpReturn\r\nOpFunctionEnd\r\n%82 = OpFunction  %2  None %83\r\n%81 = OpLabel\r\n%79 = OpVariable  %80  Function %12\r\n%85 = OpAccessChain  %73  %46 %84\r\nOpBranch %86\r\n%86 = OpLabel\r\n%88 = OpCompositeConstruct  %26  %10 %10 %10\r\n%89 = OpAccessChain  %87  %85 %84\r\nOpStore %89 %88\r\n%91 = OpAccessChain  %90  %85 %84 %84\r\nOpStore %91 %10\r\n%92 = OpAccessChain  %90  %85 %84 %84\r\nOpStore %92 %14\r\n%93 = OpLoad  %8  %79\r\n%94 = OpAccessChain  %90  %85 %84 %93\r\nOpStore %94 %15\r\n%95 = OpLoad  %27  %85\r\n%96 = OpCompositeExtract  %26  %95 0\r\n%97 = OpCompositeExtract  %26  %95 0\r\n%98 = OpVectorShuffle  %28  %97 %97 2 0\r\n%99 = OpCompositeExtract  %26  %95 0\r\n%100 = OpFunctionCall  %2  %69 %99\r\n%101 = OpCompositeExtract  %26  %95 0\r\n%102 = OpVectorTimesMatrix  %26  %101 %41\r\n%103 = OpCompositeExtract  %26  %95 0\r\n%104 = OpMatrixTimesVector  %26  %41 %103\r\n%105 = OpCompositeExtract  %26  %95 0\r\n%106 = OpVectorTimesScalar  %26  %105 %14\r\n%107 = OpCompositeExtract  %26  %95 0\r\n%108 = OpVectorTimesScalar  %26  %107 %14\r\nOpReturn\r\nOpFunctionEnd\r\n%114 = OpFunction  %2  None %83\r\n%113 = OpLabel\r\n%109 = OpVariable  %110  Function %10\r\n%111 = OpVariable  %112  Function %24\r\n%115 = OpAccessChain  %73  %46 %84\r\n%116 = OpAccessChain  %71  %49 %84\r\n%117 = OpAccessChain  %75  %52 %84\r\n%118 = OpAccessChain  %72  %55 %84\r\n%119 = OpAccessChain  %77  %58 %84\r\n%120 = OpAccessChain  %74  %61 %84\r\n%121 = OpAccessChain  %76  %64 %84\r\nOpBranch %122\r\n%122 = OpLabel\r\n%123 = OpFunctionCall  %2  %82\r\n%127 = OpAccessChain  %126  %121 %84 %84\r\n%128 = OpLoad  %36  %127\r\n%132 = OpAccessChain  %131  %120 %84 %84 %84\r\n%133 = OpLoad  %30  %132\r\n%134 = OpMatrixTimesVector  %28  %128 %133\r\n%135 = OpCompositeExtract  %11  %134 0\r\n%137 = OpAccessChain  %124  %42 %136\r\nOpStore %137 %135\r\n%138 = OpLoad  %32  %119\r\n%139 = OpLoad  %26  %118\r\n%140 = OpMatrixTimesVector  %28  %138 %139\r\n%141 = OpCompositeExtract  %11  %140 0\r\n%143 = OpAccessChain  %124  %42 %142\r\nOpStore %143 %141\r\n%146 = OpAccessChain  %90  %116 %145 %145\r\n%147 = OpLoad  %11  %146\r\n%149 = OpAccessChain  %124  %42 %148\r\nOpStore %149 %147\r\n%153 = OpAccessChain  %151  %117 %84 %152\r\n%154 = OpLoad  %11  %153\r\n%156 = OpAccessChain  %124  %42 %155\r\nOpStore %156 %154\r\n%158 = OpAccessChain  %157  %115 %145\r\n%159 = OpLoad  %11  %158\r\n%160 = OpAccessChain  %124  %42 %152\r\nOpStore %160 %159\r\n%161 = OpAccessChain  %90  %115 %84 %84\r\n%162 = OpLoad  %11  %161\r\n%163 = OpAccessChain  %124  %42 %23\r\nOpStore %163 %162\r\n%164 = OpAccessChain  %157  %115 %145\r\nOpStore %164 %22\r\n%165 = OpArrayLength  %6  %49 0\r\n%166 = OpConvertUToF  %11  %165\r\n%167 = OpAccessChain  %124  %42 %145\r\nOpStore %167 %166\r\nOpAtomicStore %44 %9 %168 %23\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/image.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 306\r\nOpCapability SampledCubeArray\r\nOpCapability ImageQuery\r\nOpCapability Image1D\r\nOpCapability Shader\r\nOpCapability Sampled1D\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %76 \"main\" %73\r\nOpEntryPoint GLCompute %121 \"depth_load\" %119\r\nOpEntryPoint Vertex %142 \"queries\" %140\r\nOpEntryPoint Vertex %194 \"levels_queries\" %193\r\nOpEntryPoint Fragment %223 \"texture_sample\" %222\r\nOpEntryPoint Fragment %252 \"texture_sample_comparison\" %250\r\nOpEntryPoint Fragment %272 \"gather\" %271\r\nOpEntryPoint Fragment %294 \"depth_no_comparison\" %293\r\nOpExecutionMode %76 LocalSize 16 1 1\r\nOpExecutionMode %121 LocalSize 16 1 1\r\nOpExecutionMode %223 OriginUpperLeft\r\nOpExecutionMode %252 OriginUpperLeft\r\nOpExecutionMode %272 OriginUpperLeft\r\nOpExecutionMode %294 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpName %34 \"image_mipmapped_src\"\r\nOpName %36 \"image_multisampled_src\"\r\nOpName %38 \"image_depth_multisampled_src\"\r\nOpName %40 \"image_storage_src\"\r\nOpName %42 \"image_array_src\"\r\nOpName %44 \"image_dup_src\"\r\nOpName %46 \"image_1d_src\"\r\nOpName %48 \"image_dst\"\r\nOpName %50 \"image_1d\"\r\nOpName %52 \"image_2d\"\r\nOpName %54 \"image_2d_array\"\r\nOpName %56 \"image_cube\"\r\nOpName %58 \"image_cube_array\"\r\nOpName %60 \"image_3d\"\r\nOpName %62 \"image_aa\"\r\nOpName %64 \"sampler_reg\"\r\nOpName %66 \"sampler_cmp\"\r\nOpName %68 \"image_2d_depth\"\r\nOpName %70 \"image_cube_depth\"\r\nOpName %73 \"local_id\"\r\nOpName %76 \"main\"\r\nOpName %119 \"local_id\"\r\nOpName %121 \"depth_load\"\r\nOpName %142 \"queries\"\r\nOpName %194 \"levels_queries\"\r\nOpName %223 \"texture_sample\"\r\nOpName %252 \"texture_sample_comparison\"\r\nOpName %272 \"gather\"\r\nOpName %294 \"depth_no_comparison\"\r\nOpDecorate %34 DescriptorSet 0\r\nOpDecorate %34 Binding 0\r\nOpDecorate %36 DescriptorSet 0\r\nOpDecorate %36 Binding 3\r\nOpDecorate %38 DescriptorSet 0\r\nOpDecorate %38 Binding 4\r\nOpDecorate %40 NonWritable\r\nOpDecorate %40 DescriptorSet 0\r\nOpDecorate %40 Binding 1\r\nOpDecorate %42 DescriptorSet 0\r\nOpDecorate %42 Binding 5\r\nOpDecorate %44 NonWritable\r\nOpDecorate %44 DescriptorSet 0\r\nOpDecorate %44 Binding 6\r\nOpDecorate %46 DescriptorSet 0\r\nOpDecorate %46 Binding 7\r\nOpDecorate %48 NonReadable\r\nOpDecorate %48 DescriptorSet 0\r\nOpDecorate %48 Binding 2\r\nOpDecorate %50 DescriptorSet 0\r\nOpDecorate %50 Binding 0\r\nOpDecorate %52 DescriptorSet 0\r\nOpDecorate %52 Binding 1\r\nOpDecorate %54 DescriptorSet 0\r\nOpDecorate %54 Binding 2\r\nOpDecorate %56 DescriptorSet 0\r\nOpDecorate %56 Binding 3\r\nOpDecorate %58 DescriptorSet 0\r\nOpDecorate %58 Binding 4\r\nOpDecorate %60 DescriptorSet 0\r\nOpDecorate %60 Binding 5\r\nOpDecorate %62 DescriptorSet 0\r\nOpDecorate %62 Binding 6\r\nOpDecorate %64 DescriptorSet 1\r\nOpDecorate %64 Binding 0\r\nOpDecorate %66 DescriptorSet 1\r\nOpDecorate %66 Binding 1\r\nOpDecorate %68 DescriptorSet 1\r\nOpDecorate %68 Binding 2\r\nOpDecorate %70 DescriptorSet 1\r\nOpDecorate %70 Binding 3\r\nOpDecorate %73 BuiltIn LocalInvocationId\r\nOpDecorate %119 BuiltIn LocalInvocationId\r\nOpDecorate %140 BuiltIn Position\r\nOpDecorate %193 BuiltIn Position\r\nOpDecorate %222 Location 0\r\nOpDecorate %250 Location 0\r\nOpDecorate %271 Location 0\r\nOpDecorate %293 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  10\r\n%5 = OpConstant  %4  20\r\n%6 = OpConstant  %4  1\r\n%8 = OpTypeFloat 32\r\n%7 = OpConstant  %8  0.5\r\n%9 = OpConstant  %8  2.3\r\n%10 = OpConstant  %4  3\r\n%11 = OpConstant  %8  2.0\r\n%13 = OpTypeInt 32 0\r\n%12 = OpTypeImage %13 2D 0 0 0 1 Unknown\r\n%14 = OpTypeImage %13 2D 0 0 1 1 Unknown\r\n%15 = OpTypeImage %8 2D 1 0 1 1 Unknown\r\n%16 = OpTypeImage %13 2D 0 0 0 2 Rgba8ui\r\n%17 = OpTypeImage %13 2D 0 1 0 1 Unknown\r\n%18 = OpTypeImage %13 1D 0 0 0 2 R32ui\r\n%19 = OpTypeImage %13 1D 0 0 0 1 Unknown\r\n%20 = OpTypeVector %13 3\r\n%21 = OpTypeVector %4 2\r\n%22 = OpTypeImage %8 1D 0 0 0 1 Unknown\r\n%23 = OpTypeImage %8 2D 0 0 0 1 Unknown\r\n%24 = OpTypeImage %8 2D 0 1 0 1 Unknown\r\n%25 = OpTypeImage %8 Cube 0 0 0 1 Unknown\r\n%26 = OpTypeImage %8 Cube 0 1 0 1 Unknown\r\n%27 = OpTypeImage %8 3D 0 0 0 1 Unknown\r\n%28 = OpTypeImage %8 2D 0 0 1 1 Unknown\r\n%29 = OpTypeVector %8 4\r\n%30 = OpTypeSampler\r\n%31 = OpTypeImage %8 2D 1 0 0 1 Unknown\r\n%32 = OpTypeImage %8 Cube 1 0 0 1 Unknown\r\n%33 = OpConstantComposite  %21  %10 %6\r\n%35 = OpTypePointer UniformConstant %12\r\n%34 = OpVariable  %35  UniformConstant\r\n%37 = OpTypePointer UniformConstant %14\r\n%36 = OpVariable  %37  UniformConstant\r\n%39 = OpTypePointer UniformConstant %15\r\n%38 = OpVariable  %39  UniformConstant\r\n%41 = OpTypePointer UniformConstant %16\r\n%40 = OpVariable  %41  UniformConstant\r\n%43 = OpTypePointer UniformConstant %17\r\n%42 = OpVariable  %43  UniformConstant\r\n%45 = OpTypePointer UniformConstant %18\r\n%44 = OpVariable  %45  UniformConstant\r\n%47 = OpTypePointer UniformConstant %19\r\n%46 = OpVariable  %47  UniformConstant\r\n%49 = OpTypePointer UniformConstant %18\r\n%48 = OpVariable  %49  UniformConstant\r\n%51 = OpTypePointer UniformConstant %22\r\n%50 = OpVariable  %51  UniformConstant\r\n%53 = OpTypePointer UniformConstant %23\r\n%52 = OpVariable  %53  UniformConstant\r\n%55 = OpTypePointer UniformConstant %24\r\n%54 = OpVariable  %55  UniformConstant\r\n%57 = OpTypePointer UniformConstant %25\r\n%56 = OpVariable  %57  UniformConstant\r\n%59 = OpTypePointer UniformConstant %26\r\n%58 = OpVariable  %59  UniformConstant\r\n%61 = OpTypePointer UniformConstant %27\r\n%60 = OpVariable  %61  UniformConstant\r\n%63 = OpTypePointer UniformConstant %28\r\n%62 = OpVariable  %63  UniformConstant\r\n%65 = OpTypePointer UniformConstant %30\r\n%64 = OpVariable  %65  UniformConstant\r\n%67 = OpTypePointer UniformConstant %30\r\n%66 = OpVariable  %67  UniformConstant\r\n%69 = OpTypePointer UniformConstant %31\r\n%68 = OpVariable  %69  UniformConstant\r\n%71 = OpTypePointer UniformConstant %32\r\n%70 = OpVariable  %71  UniformConstant\r\n%74 = OpTypePointer Input %20\r\n%73 = OpVariable  %74  Input\r\n%77 = OpTypeFunction %2\r\n%86 = OpTypeVector %13 2\r\n%94 = OpTypeVector %13 4\r\n%105 = OpTypeVector %4 3\r\n%119 = OpVariable  %74  Input\r\n%141 = OpTypePointer Output %29\r\n%140 = OpVariable  %141  Output\r\n%151 = OpConstant  %13  0\r\n%193 = OpVariable  %141  Output\r\n%222 = OpVariable  %141  Output\r\n%228 = OpTypeVector %8 2\r\n%231 = OpTypeSampledImage %22\r\n%234 = OpTypeSampledImage %23\r\n%251 = OpTypePointer Output %8\r\n%250 = OpVariable  %251  Output\r\n%258 = OpTypeSampledImage %31\r\n%263 = OpConstant  %8  0.0\r\n%264 = OpTypeVector %8 3\r\n%266 = OpTypeSampledImage %32\r\n%271 = OpVariable  %141  Output\r\n%281 = OpConstant  %13  1\r\n%284 = OpConstant  %13  3\r\n%293 = OpVariable  %141  Output\r\n%76 = OpFunction  %2  None %77\r\n%72 = OpLabel\r\n%75 = OpLoad  %20  %73\r\n%78 = OpLoad  %12  %34\r\n%79 = OpLoad  %14  %36\r\n%80 = OpLoad  %16  %40\r\n%81 = OpLoad  %17  %42\r\n%82 = OpLoad  %19  %46\r\n%83 = OpLoad  %18  %48\r\nOpBranch %84\r\n%84 = OpLabel\r\n%85 = OpImageQuerySize  %21  %80\r\n%87 = OpVectorShuffle  %86  %75 %75 0 1\r\n%88 = OpBitcast  %21  %87\r\n%89 = OpIMul  %21  %85 %88\r\n%90 = OpCompositeConstruct  %21  %3 %5\r\n%91 = OpSRem  %21  %89 %90\r\n%92 = OpCompositeExtract  %13  %75 2\r\n%93 = OpBitcast  %4  %92\r\n%95 = OpImageFetch  %94  %78 %91 Lod %93\r\n%96 = OpCompositeExtract  %13  %75 2\r\n%97 = OpBitcast  %4  %96\r\n%98 = OpImageFetch  %94  %79 %91 Sample %97\r\n%99 = OpImageRead  %94  %80 %91\r\n%100 = OpCompositeExtract  %13  %75 2\r\n%101 = OpBitcast  %4  %100\r\n%102 = OpCompositeExtract  %13  %75 2\r\n%103 = OpBitcast  %4  %102\r\n%104 = OpIAdd  %4  %103 %6\r\n%106 = OpCompositeConstruct  %105  %91 %101\r\n%107 = OpImageFetch  %94  %81 %106 Lod %104\r\n%108 = OpCompositeExtract  %13  %75 0\r\n%109 = OpBitcast  %4  %108\r\n%110 = OpCompositeExtract  %13  %75 2\r\n%111 = OpBitcast  %4  %110\r\n%112 = OpImageFetch  %94  %82 %109 Lod %111\r\n%113 = OpCompositeExtract  %4  %91 0\r\n%114 = OpIAdd  %94  %95 %98\r\n%115 = OpIAdd  %94  %114 %99\r\n%116 = OpIAdd  %94  %115 %107\r\n%117 = OpIAdd  %94  %116 %112\r\nOpImageWrite %83 %113 %117\r\nOpReturn\r\nOpFunctionEnd\r\n%121 = OpFunction  %2  None %77\r\n%118 = OpLabel\r\n%120 = OpLoad  %20  %119\r\n%122 = OpLoad  %15  %38\r\n%123 = OpLoad  %16  %40\r\n%124 = OpLoad  %18  %48\r\nOpBranch %125\r\n%125 = OpLabel\r\n%126 = OpImageQuerySize  %21  %123\r\n%127 = OpVectorShuffle  %86  %120 %120 0 1\r\n%128 = OpBitcast  %21  %127\r\n%129 = OpIMul  %21  %126 %128\r\n%130 = OpCompositeConstruct  %21  %3 %5\r\n%131 = OpSRem  %21  %129 %130\r\n%132 = OpCompositeExtract  %13  %120 2\r\n%133 = OpBitcast  %4  %132\r\n%134 = OpImageFetch  %29  %122 %131 Sample %133\r\n%135 = OpCompositeExtract  %8  %134 0\r\n%136 = OpCompositeExtract  %4  %131 0\r\n%137 = OpConvertFToU  %13  %135\r\n%138 = OpCompositeConstruct  %94  %137 %137 %137 %137\r\nOpImageWrite %124 %136 %138\r\nOpReturn\r\nOpFunctionEnd\r\n%142 = OpFunction  %2  None %77\r\n%139 = OpLabel\r\n%143 = OpLoad  %22  %50\r\n%144 = OpLoad  %23  %52\r\n%145 = OpLoad  %24  %54\r\n%146 = OpLoad  %25  %56\r\n%147 = OpLoad  %26  %58\r\n%148 = OpLoad  %27  %60\r\n%149 = OpLoad  %28  %62\r\nOpBranch %150\r\n%150 = OpLabel\r\n%152 = OpImageQuerySizeLod  %4  %143 %151\r\n%154 = OpImageQuerySizeLod  %4  %143 %152\r\n%155 = OpImageQuerySizeLod  %21  %144 %151\r\n%156 = OpImageQuerySizeLod  %21  %144 %6\r\n%157 = OpImageQuerySizeLod  %105  %145 %151\r\n%158 = OpVectorShuffle  %21  %157 %157 0 1\r\n%159 = OpImageQuerySizeLod  %105  %145 %6\r\n%160 = OpVectorShuffle  %21  %159 %159 0 1\r\n%161 = OpImageQuerySizeLod  %21  %146 %151\r\n%162 = OpImageQuerySizeLod  %21  %146 %6\r\n%163 = OpImageQuerySizeLod  %105  %147 %151\r\n%164 = OpVectorShuffle  %21  %163 %163 0 0\r\n%165 = OpImageQuerySizeLod  %105  %147 %6\r\n%166 = OpVectorShuffle  %21  %165 %165 0 0\r\n%167 = OpImageQuerySizeLod  %105  %148 %151\r\n%168 = OpImageQuerySizeLod  %105  %148 %6\r\n%169 = OpImageQuerySize  %21  %149\r\n%170 = OpCompositeExtract  %4  %155 1\r\n%171 = OpIAdd  %4  %152 %170\r\n%172 = OpCompositeExtract  %4  %156 1\r\n%173 = OpIAdd  %4  %171 %172\r\n%174 = OpCompositeExtract  %4  %158 1\r\n%175 = OpIAdd  %4  %173 %174\r\n%176 = OpCompositeExtract  %4  %160 1\r\n%177 = OpIAdd  %4  %175 %176\r\n%178 = OpCompositeExtract  %4  %161 1\r\n%179 = OpIAdd  %4  %177 %178\r\n%180 = OpCompositeExtract  %4  %162 1\r\n%181 = OpIAdd  %4  %179 %180\r\n%182 = OpCompositeExtract  %4  %164 1\r\n%183 = OpIAdd  %4  %181 %182\r\n%184 = OpCompositeExtract  %4  %166 1\r\n%185 = OpIAdd  %4  %183 %184\r\n%186 = OpCompositeExtract  %4  %167 2\r\n%187 = OpIAdd  %4  %185 %186\r\n%188 = OpCompositeExtract  %4  %168 2\r\n%189 = OpIAdd  %4  %187 %188\r\n%190 = OpConvertSToF  %8  %189\r\n%191 = OpCompositeConstruct  %29  %190 %190 %190 %190\r\nOpStore %140 %191\r\nOpReturn\r\nOpFunctionEnd\r\n%194 = OpFunction  %2  None %77\r\n%192 = OpLabel\r\n%195 = OpLoad  %23  %52\r\n%196 = OpLoad  %24  %54\r\n%197 = OpLoad  %25  %56\r\n%198 = OpLoad  %26  %58\r\n%199 = OpLoad  %27  %60\r\n%200 = OpLoad  %28  %62\r\nOpBranch %201\r\n%201 = OpLabel\r\n%202 = OpImageQueryLevels  %4  %195\r\n%203 = OpImageQueryLevels  %4  %196\r\n%204 = OpImageQuerySizeLod  %105  %196 %151\r\n%205 = OpCompositeExtract  %4  %204 2\r\n%206 = OpImageQueryLevels  %4  %197\r\n%207 = OpImageQueryLevels  %4  %198\r\n%208 = OpImageQuerySizeLod  %105  %198 %151\r\n%209 = OpCompositeExtract  %4  %208 2\r\n%210 = OpImageQueryLevels  %4  %199\r\n%211 = OpImageQuerySamples  %4  %200\r\n%212 = OpIAdd  %4  %205 %209\r\n%213 = OpIAdd  %4  %212 %211\r\n%214 = OpIAdd  %4  %213 %202\r\n%215 = OpIAdd  %4  %214 %203\r\n%216 = OpIAdd  %4  %215 %210\r\n%217 = OpIAdd  %4  %216 %206\r\n%218 = OpIAdd  %4  %217 %207\r\n%219 = OpConvertSToF  %8  %218\r\n%220 = OpCompositeConstruct  %29  %219 %219 %219 %219\r\nOpStore %193 %220\r\nOpReturn\r\nOpFunctionEnd\r\n%223 = OpFunction  %2  None %77\r\n%221 = OpLabel\r\n%224 = OpLoad  %22  %50\r\n%225 = OpLoad  %23  %52\r\n%226 = OpLoad  %30  %64\r\nOpBranch %227\r\n%227 = OpLabel\r\n%229 = OpCompositeConstruct  %228  %7 %7\r\n%230 = OpCompositeExtract  %8  %229 0\r\n%232 = OpSampledImage  %231  %224 %226\r\n%233 = OpImageSampleImplicitLod  %29  %232 %230\r\n%235 = OpSampledImage  %234  %225 %226\r\n%236 = OpImageSampleImplicitLod  %29  %235 %229\r\n%237 = OpSampledImage  %234  %225 %226\r\n%238 = OpImageSampleImplicitLod  %29  %237 %229 ConstOffset %33\r\n%239 = OpSampledImage  %234  %225 %226\r\n%240 = OpImageSampleExplicitLod  %29  %239 %229 Lod %9\r\n%241 = OpSampledImage  %234  %225 %226\r\n%242 = OpImageSampleExplicitLod  %29  %241 %229 Lod|ConstOffset %9 %33\r\n%243 = OpSampledImage  %234  %225 %226\r\n%244 = OpImageSampleImplicitLod  %29  %243 %229 Bias|ConstOffset %11 %33\r\n%245 = OpFAdd  %29  %233 %236\r\n%246 = OpFAdd  %29  %245 %238\r\n%247 = OpFAdd  %29  %246 %240\r\n%248 = OpFAdd  %29  %247 %242\r\nOpStore %222 %248\r\nOpReturn\r\nOpFunctionEnd\r\n%252 = OpFunction  %2  None %77\r\n%249 = OpLabel\r\n%253 = OpLoad  %30  %66\r\n%254 = OpLoad  %31  %68\r\n%255 = OpLoad  %32  %70\r\nOpBranch %256\r\n%256 = OpLabel\r\n%257 = OpCompositeConstruct  %228  %7 %7\r\n%259 = OpSampledImage  %258  %254 %253\r\n%260 = OpImageSampleDrefImplicitLod  %8  %259 %257 %7\r\n%261 = OpSampledImage  %258  %254 %253\r\n%262 = OpImageSampleDrefExplicitLod  %8  %261 %257 %7 Lod %263\r\n%265 = OpCompositeConstruct  %264  %7 %7 %7\r\n%267 = OpSampledImage  %266  %255 %253\r\n%268 = OpImageSampleDrefExplicitLod  %8  %267 %265 %7 Lod %263\r\n%269 = OpFAdd  %8  %260 %262\r\nOpStore %250 %269\r\nOpReturn\r\nOpFunctionEnd\r\n%272 = OpFunction  %2  None %77\r\n%270 = OpLabel\r\n%273 = OpLoad  %23  %52\r\n%274 = OpLoad  %30  %64\r\n%275 = OpLoad  %30  %66\r\n%276 = OpLoad  %31  %68\r\nOpBranch %277\r\n%277 = OpLabel\r\n%278 = OpCompositeConstruct  %228  %7 %7\r\n%279 = OpSampledImage  %234  %273 %274\r\n%280 = OpImageGather  %29  %279 %278 %281\r\n%282 = OpSampledImage  %234  %273 %274\r\n%283 = OpImageGather  %29  %282 %278 %284 ConstOffset %33\r\n%285 = OpSampledImage  %258  %276 %275\r\n%286 = OpImageDrefGather  %29  %285 %278 %7\r\n%287 = OpSampledImage  %258  %276 %275\r\n%288 = OpImageDrefGather  %29  %287 %278 %7 ConstOffset %33\r\n%289 = OpFAdd  %29  %280 %283\r\n%290 = OpFAdd  %29  %289 %286\r\n%291 = OpFAdd  %29  %290 %288\r\nOpStore %271 %291\r\nOpReturn\r\nOpFunctionEnd\r\n%294 = OpFunction  %2  None %77\r\n%292 = OpLabel\r\n%295 = OpLoad  %30  %64\r\n%296 = OpLoad  %31  %68\r\nOpBranch %297\r\n%297 = OpLabel\r\n%298 = OpCompositeConstruct  %228  %7 %7\r\n%299 = OpSampledImage  %258  %296 %295\r\n%300 = OpImageSampleImplicitLod  %29  %299 %298\r\n%301 = OpCompositeExtract  %8  %300 0\r\n%302 = OpSampledImage  %258  %296 %295\r\n%303 = OpImageGather  %29  %302 %298 %151\r\n%304 = OpCompositeConstruct  %29  %301 %301 %301 %301\r\n%305 = OpFAdd  %29  %304 %303\r\nOpStore %293 %305\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/interface.compute.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 49\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %35 \"compute\" %23 %26 %28 %31 %33\r\nOpExecutionMode %35 LocalSize 1 1 1\r\nOpMemberDecorate %13 0 Offset 0\r\nOpMemberDecorate %13 1 Offset 16\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 1 Offset 4\r\nOpMemberDecorate %14 2 Offset 8\r\nOpDecorate %16 ArrayStride 4\r\nOpMemberDecorate %18 0 Offset 0\r\nOpMemberDecorate %19 0 Offset 0\r\nOpDecorate %23 BuiltIn GlobalInvocationId\r\nOpDecorate %26 BuiltIn LocalInvocationId\r\nOpDecorate %28 BuiltIn LocalInvocationIndex\r\nOpDecorate %31 BuiltIn WorkgroupId\r\nOpDecorate %33 BuiltIn NumWorkgroups\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  1\r\n%7 = OpConstant  %4  0.0\r\n%9 = OpTypeInt 32 1\r\n%8 = OpConstant  %9  1\r\n%10 = OpConstant  %9  0\r\n%11 = OpConstant  %6  2\r\n%12 = OpTypeVector %4 4\r\n%13 = OpTypeStruct %12 %4\r\n%14 = OpTypeStruct %4 %6 %4\r\n%15 = OpTypeBool\r\n%16 = OpTypeArray %6 %8\r\n%17 = OpTypeVector %6 3\r\n%18 = OpTypeStruct %6\r\n%19 = OpTypeStruct %6\r\n%21 = OpTypePointer Workgroup %16\r\n%20 = OpVariable  %21  Workgroup\r\n%24 = OpTypePointer Input %17\r\n%23 = OpVariable  %24  Input\r\n%26 = OpVariable  %24  Input\r\n%29 = OpTypePointer Input %6\r\n%28 = OpVariable  %29  Input\r\n%31 = OpVariable  %24  Input\r\n%33 = OpVariable  %24  Input\r\n%36 = OpTypeFunction %2\r\n%38 = OpTypePointer Workgroup %6\r\n%47 = OpConstant  %6  0\r\n%35 = OpFunction  %2  None %36\r\n%22 = OpLabel\r\n%25 = OpLoad  %17  %23\r\n%27 = OpLoad  %17  %26\r\n%30 = OpLoad  %6  %28\r\n%32 = OpLoad  %17  %31\r\n%34 = OpLoad  %17  %33\r\nOpBranch %37\r\n%37 = OpLabel\r\n%39 = OpCompositeExtract  %6  %25 0\r\n%40 = OpCompositeExtract  %6  %27 0\r\n%41 = OpIAdd  %6  %39 %40\r\n%42 = OpIAdd  %6  %41 %30\r\n%43 = OpCompositeExtract  %6  %32 0\r\n%44 = OpIAdd  %6  %42 %43\r\n%45 = OpCompositeExtract  %6  %34 0\r\n%46 = OpIAdd  %6  %44 %45\r\n%48 = OpAccessChain  %38  %20 %47\r\nOpStore %48 %46\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/interface.fragment.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 54\r\nOpCapability Shader\r\nOpCapability SampleRateShading\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %41 \"fragment\" %22 %25 %28 %31 %34 %36 %38 %40\r\nOpExecutionMode %41 OriginUpperLeft\r\nOpExecutionMode %41 DepthReplacing\r\nOpMemberDecorate %13 0 Offset 0\r\nOpMemberDecorate %13 1 Offset 16\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 1 Offset 4\r\nOpMemberDecorate %14 2 Offset 8\r\nOpDecorate %16 ArrayStride 4\r\nOpMemberDecorate %18 0 Offset 0\r\nOpMemberDecorate %19 0 Offset 0\r\nOpDecorate %22 Invariant\r\nOpDecorate %22 BuiltIn FragCoord\r\nOpDecorate %25 Location 1\r\nOpDecorate %28 BuiltIn FrontFacing\r\nOpDecorate %28 Flat\r\nOpDecorate %31 BuiltIn SampleId\r\nOpDecorate %31 Flat\r\nOpDecorate %34 BuiltIn SampleMask\r\nOpDecorate %34 Flat\r\nOpDecorate %36 BuiltIn FragDepth\r\nOpDecorate %38 BuiltIn SampleMask\r\nOpDecorate %40 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  1\r\n%7 = OpConstant  %4  0.0\r\n%9 = OpTypeInt 32 1\r\n%8 = OpConstant  %9  1\r\n%10 = OpConstant  %9  0\r\n%11 = OpConstant  %6  2\r\n%12 = OpTypeVector %4 4\r\n%13 = OpTypeStruct %12 %4\r\n%14 = OpTypeStruct %4 %6 %4\r\n%15 = OpTypeBool\r\n%16 = OpTypeArray %6 %8\r\n%17 = OpTypeVector %6 3\r\n%18 = OpTypeStruct %6\r\n%19 = OpTypeStruct %6\r\n%23 = OpTypePointer Input %12\r\n%22 = OpVariable  %23  Input\r\n%26 = OpTypePointer Input %4\r\n%25 = OpVariable  %26  Input\r\n%29 = OpTypePointer Input %15\r\n%28 = OpVariable  %29  Input\r\n%32 = OpTypePointer Input %6\r\n%31 = OpVariable  %32  Input\r\n%34 = OpVariable  %32  Input\r\n%37 = OpTypePointer Output %4\r\n%36 = OpVariable  %37  Output\r\n%39 = OpTypePointer Output %6\r\n%38 = OpVariable  %39  Output\r\n%40 = OpVariable  %37  Output\r\n%42 = OpTypeFunction %2\r\n%41 = OpFunction  %2  None %42\r\n%20 = OpLabel\r\n%24 = OpLoad  %12  %22\r\n%27 = OpLoad  %4  %25\r\n%21 = OpCompositeConstruct  %13  %24 %27\r\n%30 = OpLoad  %15  %28\r\n%33 = OpLoad  %6  %31\r\n%35 = OpLoad  %6  %34\r\nOpBranch %43\r\n%43 = OpLabel\r\n%44 = OpShiftLeftLogical  %6  %5 %33\r\n%45 = OpBitwiseAnd  %6  %35 %44\r\n%46 = OpSelect  %4  %30 %3 %7\r\n%47 = OpCompositeExtract  %4  %21 1\r\n%48 = OpCompositeConstruct  %14  %47 %45 %46\r\n%49 = OpCompositeExtract  %4  %48 0\r\nOpStore %36 %49\r\n%50 = OpLoad  %4  %36\r\n%51 = OpExtInst  %4  %1 FClamp %50 %7 %3\r\nOpStore %36 %51\r\n%52 = OpCompositeExtract  %6  %48 1\r\nOpStore %38 %52\r\n%53 = OpCompositeExtract  %4  %48 2\r\nOpStore %40 %53\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/interface.vertex.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 44\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %34 \"vertex\" %21 %24 %26 %28 %30 %32\r\nOpMemberDecorate %13 0 Offset 0\r\nOpMemberDecorate %13 1 Offset 16\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 1 Offset 4\r\nOpMemberDecorate %14 2 Offset 8\r\nOpDecorate %16 ArrayStride 4\r\nOpMemberDecorate %18 0 Offset 0\r\nOpMemberDecorate %19 0 Offset 0\r\nOpDecorate %21 BuiltIn VertexIndex\r\nOpDecorate %24 BuiltIn InstanceIndex\r\nOpDecorate %26 Location 10\r\nOpDecorate %28 Invariant\r\nOpDecorate %28 BuiltIn Position\r\nOpDecorate %30 Location 1\r\nOpDecorate %32 BuiltIn PointSize\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  1\r\n%7 = OpConstant  %4  0.0\r\n%9 = OpTypeInt 32 1\r\n%8 = OpConstant  %9  1\r\n%10 = OpConstant  %9  0\r\n%11 = OpConstant  %6  2\r\n%12 = OpTypeVector %4 4\r\n%13 = OpTypeStruct %12 %4\r\n%14 = OpTypeStruct %4 %6 %4\r\n%15 = OpTypeBool\r\n%16 = OpTypeArray %6 %8\r\n%17 = OpTypeVector %6 3\r\n%18 = OpTypeStruct %6\r\n%19 = OpTypeStruct %6\r\n%22 = OpTypePointer Input %6\r\n%21 = OpVariable  %22  Input\r\n%24 = OpVariable  %22  Input\r\n%26 = OpVariable  %22  Input\r\n%29 = OpTypePointer Output %12\r\n%28 = OpVariable  %29  Output\r\n%31 = OpTypePointer Output %4\r\n%30 = OpVariable  %31  Output\r\n%33 = OpTypePointer Output %4\r\n%32 = OpVariable  %33  Output\r\n%35 = OpTypeFunction %2\r\n%34 = OpFunction  %2  None %35\r\n%20 = OpLabel\r\n%23 = OpLoad  %6  %21\r\n%25 = OpLoad  %6  %24\r\n%27 = OpLoad  %6  %26\r\nOpStore %32 %3\r\nOpBranch %36\r\n%36 = OpLabel\r\n%37 = OpIAdd  %6  %23 %25\r\n%38 = OpIAdd  %6  %37 %27\r\n%39 = OpCompositeConstruct  %12  %3 %3 %3 %3\r\n%40 = OpConvertUToF  %4  %38\r\n%41 = OpCompositeConstruct  %13  %39 %40\r\n%42 = OpCompositeExtract  %12  %41 0\r\nOpStore %28 %42\r\n%43 = OpCompositeExtract  %4  %41 1\r\nOpStore %30 %43\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/interface.vertex_two_structs.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 45\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %34 \"vertex_two_structs\" %24 %28 %30 %32\r\nOpMemberDecorate %13 0 Offset 0\r\nOpMemberDecorate %13 1 Offset 16\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 1 Offset 4\r\nOpMemberDecorate %14 2 Offset 8\r\nOpDecorate %16 ArrayStride 4\r\nOpMemberDecorate %18 0 Offset 0\r\nOpMemberDecorate %19 0 Offset 0\r\nOpDecorate %24 BuiltIn VertexIndex\r\nOpDecorate %28 BuiltIn InstanceIndex\r\nOpDecorate %30 Invariant\r\nOpDecorate %30 BuiltIn Position\r\nOpDecorate %32 BuiltIn PointSize\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%6 = OpTypeInt 32 0\r\n%5 = OpConstant  %6  1\r\n%7 = OpConstant  %4  0.0\r\n%9 = OpTypeInt 32 1\r\n%8 = OpConstant  %9  1\r\n%10 = OpConstant  %9  0\r\n%11 = OpConstant  %6  2\r\n%12 = OpTypeVector %4 4\r\n%13 = OpTypeStruct %12 %4\r\n%14 = OpTypeStruct %4 %6 %4\r\n%15 = OpTypeBool\r\n%16 = OpTypeArray %6 %8\r\n%17 = OpTypeVector %6 3\r\n%18 = OpTypeStruct %6\r\n%19 = OpTypeStruct %6\r\n%21 = OpTypePointer Function %6\r\n%25 = OpTypePointer Input %6\r\n%24 = OpVariable  %25  Input\r\n%28 = OpVariable  %25  Input\r\n%31 = OpTypePointer Output %12\r\n%30 = OpVariable  %31  Output\r\n%33 = OpTypePointer Output %4\r\n%32 = OpVariable  %33  Output\r\n%35 = OpTypeFunction %2\r\n%36 = OpTypePointer Workgroup %16\r\n%34 = OpFunction  %2  None %35\r\n%22 = OpLabel\r\n%20 = OpVariable  %21  Function %11\r\n%26 = OpLoad  %6  %24\r\n%23 = OpCompositeConstruct  %18  %26\r\n%29 = OpLoad  %6  %28\r\n%27 = OpCompositeConstruct  %19  %29\r\nOpStore %32 %3\r\nOpBranch %37\r\n%37 = OpLabel\r\n%38 = OpCompositeExtract  %6  %23 0\r\n%39 = OpConvertUToF  %4  %38\r\n%40 = OpCompositeExtract  %6  %27 0\r\n%41 = OpConvertUToF  %4  %40\r\n%42 = OpLoad  %6  %20\r\n%43 = OpConvertUToF  %4  %42\r\n%44 = OpCompositeConstruct  %12  %39 %41 %43 %7\r\nOpStore %30 %44\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/interpolate.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 111\r\nOpCapability Shader\r\nOpCapability SampleRateShading\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %46 \"vert_main\" %30 %32 %34 %36 %38 %40 %41 %42 %43\r\nOpEntryPoint Fragment %109 \"frag_main\" %88 %91 %94 %97 %100 %103 %105 %107\r\nOpExecutionMode %109 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpMemberName %25 0 \"position\"\r\nOpMemberName %25 1 \"_flat\"\r\nOpMemberName %25 2 \"_linear\"\r\nOpMemberName %25 3 \"linear_centroid\"\r\nOpMemberName %25 4 \"linear_sample\"\r\nOpMemberName %25 5 \"perspective\"\r\nOpMemberName %25 6 \"perspective_centroid\"\r\nOpMemberName %25 7 \"perspective_sample\"\r\nOpName %25 \"FragmentInput\"\r\nOpName %26 \"out\"\r\nOpName %30 \"position\"\r\nOpName %32 \"_flat\"\r\nOpName %34 \"_linear\"\r\nOpName %36 \"linear_centroid\"\r\nOpName %38 \"linear_sample\"\r\nOpName %40 \"perspective\"\r\nOpName %41 \"perspective_centroid\"\r\nOpName %42 \"perspective_sample\"\r\nOpName %46 \"vert_main\"\r\nOpName %88 \"position\"\r\nOpName %91 \"_flat\"\r\nOpName %94 \"_linear\"\r\nOpName %97 \"linear_centroid\"\r\nOpName %100 \"linear_sample\"\r\nOpName %103 \"perspective\"\r\nOpName %105 \"perspective_centroid\"\r\nOpName %107 \"perspective_sample\"\r\nOpName %109 \"frag_main\"\r\nOpMemberDecorate %25 0 Offset 0\r\nOpMemberDecorate %25 1 Offset 16\r\nOpMemberDecorate %25 2 Offset 20\r\nOpMemberDecorate %25 3 Offset 24\r\nOpMemberDecorate %25 4 Offset 32\r\nOpMemberDecorate %25 5 Offset 48\r\nOpMemberDecorate %25 6 Offset 64\r\nOpMemberDecorate %25 7 Offset 68\r\nOpDecorate %30 BuiltIn Position\r\nOpDecorate %32 Location 0\r\nOpDecorate %32 Flat\r\nOpDecorate %34 Location 1\r\nOpDecorate %34 NoPerspective\r\nOpDecorate %36 Location 2\r\nOpDecorate %36 NoPerspective\r\nOpDecorate %36 Centroid\r\nOpDecorate %38 Location 3\r\nOpDecorate %38 NoPerspective\r\nOpDecorate %38 Sample\r\nOpDecorate %40 Location 4\r\nOpDecorate %41 Location 5\r\nOpDecorate %41 Centroid\r\nOpDecorate %42 Location 6\r\nOpDecorate %42 Sample\r\nOpDecorate %43 BuiltIn PointSize\r\nOpDecorate %88 BuiltIn FragCoord\r\nOpDecorate %91 Location 0\r\nOpDecorate %91 Flat\r\nOpDecorate %94 Location 1\r\nOpDecorate %94 NoPerspective\r\nOpDecorate %97 Location 2\r\nOpDecorate %97 NoPerspective\r\nOpDecorate %97 Centroid\r\nOpDecorate %100 Location 3\r\nOpDecorate %100 NoPerspective\r\nOpDecorate %100 Sample\r\nOpDecorate %103 Location 4\r\nOpDecorate %105 Location 5\r\nOpDecorate %105 Centroid\r\nOpDecorate %107 Location 6\r\nOpDecorate %107 Sample\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  2.0\r\n%5 = OpConstant  %4  4.0\r\n%6 = OpConstant  %4  5.0\r\n%7 = OpConstant  %4  6.0\r\n%9 = OpTypeInt 32 0\r\n%8 = OpConstant  %9  8\r\n%10 = OpConstant  %4  27.0\r\n%11 = OpConstant  %4  64.0\r\n%12 = OpConstant  %4  125.0\r\n%13 = OpConstant  %4  216.0\r\n%14 = OpConstant  %4  343.0\r\n%15 = OpConstant  %4  512.0\r\n%16 = OpConstant  %4  729.0\r\n%17 = OpConstant  %4  1000.0\r\n%18 = OpConstant  %4  1331.0\r\n%19 = OpConstant  %4  1728.0\r\n%20 = OpConstant  %4  2197.0\r\n%21 = OpConstant  %4  2744.0\r\n%22 = OpTypeVector %4 4\r\n%23 = OpTypeVector %4 2\r\n%24 = OpTypeVector %4 3\r\n%25 = OpTypeStruct %22 %9 %4 %23 %24 %22 %4 %4\r\n%27 = OpTypePointer Function %25\r\n%28 = OpConstantNull  %25\r\n%31 = OpTypePointer Output %22\r\n%30 = OpVariable  %31  Output\r\n%33 = OpTypePointer Output %9\r\n%32 = OpVariable  %33  Output\r\n%35 = OpTypePointer Output %4\r\n%34 = OpVariable  %35  Output\r\n%37 = OpTypePointer Output %23\r\n%36 = OpVariable  %37  Output\r\n%39 = OpTypePointer Output %24\r\n%38 = OpVariable  %39  Output\r\n%40 = OpVariable  %31  Output\r\n%41 = OpVariable  %35  Output\r\n%42 = OpVariable  %35  Output\r\n%44 = OpTypePointer Output %4\r\n%43 = OpVariable  %44  Output\r\n%45 = OpConstant  %4  1.0\r\n%47 = OpTypeFunction %2\r\n%49 = OpTypePointer Function %22\r\n%51 = OpConstant  %9  0\r\n%53 = OpTypePointer Function %9\r\n%54 = OpConstant  %9  1\r\n%56 = OpTypePointer Function %4\r\n%57 = OpConstant  %9  2\r\n%59 = OpTypePointer Function %23\r\n%61 = OpConstant  %9  3\r\n%63 = OpTypePointer Function %24\r\n%65 = OpConstant  %9  4\r\n%68 = OpConstant  %9  5\r\n%70 = OpConstant  %9  6\r\n%72 = OpConstant  %9  7\r\n%89 = OpTypePointer Input %22\r\n%88 = OpVariable  %89  Input\r\n%92 = OpTypePointer Input %9\r\n%91 = OpVariable  %92  Input\r\n%95 = OpTypePointer Input %4\r\n%94 = OpVariable  %95  Input\r\n%98 = OpTypePointer Input %23\r\n%97 = OpVariable  %98  Input\r\n%101 = OpTypePointer Input %24\r\n%100 = OpVariable  %101  Input\r\n%103 = OpVariable  %89  Input\r\n%105 = OpVariable  %95  Input\r\n%107 = OpVariable  %95  Input\r\n%46 = OpFunction  %2  None %47\r\n%29 = OpLabel\r\n%26 = OpVariable  %27  Function %28\r\nOpStore %43 %45\r\nOpBranch %48\r\n%48 = OpLabel\r\n%50 = OpCompositeConstruct  %22  %3 %5 %6 %7\r\n%52 = OpAccessChain  %49  %26 %51\r\nOpStore %52 %50\r\n%55 = OpAccessChain  %53  %26 %54\r\nOpStore %55 %8\r\n%58 = OpAccessChain  %56  %26 %57\r\nOpStore %58 %10\r\n%60 = OpCompositeConstruct  %23  %11 %12\r\n%62 = OpAccessChain  %59  %26 %61\r\nOpStore %62 %60\r\n%64 = OpCompositeConstruct  %24  %13 %14 %15\r\n%66 = OpAccessChain  %63  %26 %65\r\nOpStore %66 %64\r\n%67 = OpCompositeConstruct  %22  %16 %17 %18 %19\r\n%69 = OpAccessChain  %49  %26 %68\r\nOpStore %69 %67\r\n%71 = OpAccessChain  %56  %26 %70\r\nOpStore %71 %20\r\n%73 = OpAccessChain  %56  %26 %72\r\nOpStore %73 %21\r\n%74 = OpLoad  %25  %26\r\n%75 = OpCompositeExtract  %22  %74 0\r\nOpStore %30 %75\r\n%76 = OpAccessChain  %44  %30 %54\r\n%77 = OpLoad  %4  %76\r\n%78 = OpFNegate  %4  %77\r\nOpStore %76 %78\r\n%79 = OpCompositeExtract  %9  %74 1\r\nOpStore %32 %79\r\n%80 = OpCompositeExtract  %4  %74 2\r\nOpStore %34 %80\r\n%81 = OpCompositeExtract  %23  %74 3\r\nOpStore %36 %81\r\n%82 = OpCompositeExtract  %24  %74 4\r\nOpStore %38 %82\r\n%83 = OpCompositeExtract  %22  %74 5\r\nOpStore %40 %83\r\n%84 = OpCompositeExtract  %4  %74 6\r\nOpStore %41 %84\r\n%85 = OpCompositeExtract  %4  %74 7\r\nOpStore %42 %85\r\nOpReturn\r\nOpFunctionEnd\r\n%109 = OpFunction  %2  None %47\r\n%86 = OpLabel\r\n%90 = OpLoad  %22  %88\r\n%93 = OpLoad  %9  %91\r\n%96 = OpLoad  %4  %94\r\n%99 = OpLoad  %23  %97\r\n%102 = OpLoad  %24  %100\r\n%104 = OpLoad  %22  %103\r\n%106 = OpLoad  %4  %105\r\n%108 = OpLoad  %4  %107\r\n%87 = OpCompositeConstruct  %25  %90 %93 %96 %99 %102 %104 %106 %108\r\nOpBranch %110\r\n%110 = OpLabel\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/math-functions.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 36\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %13 \"main\"\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%5 = OpConstant  %4  0.0\r\n%7 = OpTypeInt 32 1\r\n%6 = OpConstant  %7  0\r\n%9 = OpTypeInt 32 0\r\n%8 = OpConstant  %9  0\r\n%10 = OpTypeVector %7 2\r\n%11 = OpConstantComposite  %10  %6 %6\r\n%14 = OpTypeFunction %2\r\n%16 = OpTypeVector %4 4\r\n%26 = OpConstantNull  %7\r\n%13 = OpFunction  %2  None %14\r\n%12 = OpLabel\r\nOpBranch %15\r\n%15 = OpLabel\r\n%17 = OpCompositeConstruct  %16  %5 %5 %5 %5\r\n%18 = OpExtInst  %4  %1 Degrees %3\r\n%19 = OpExtInst  %4  %1 Radians %3\r\n%20 = OpExtInst  %16  %1 Degrees %17\r\n%21 = OpExtInst  %16  %1 Radians %17\r\n%23 = OpCompositeConstruct  %16  %5 %5 %5 %5\r\n%24 = OpCompositeConstruct  %16  %3 %3 %3 %3\r\n%22 = OpExtInst  %16  %1 FClamp %17 %23 %24\r\n%27 = OpCompositeExtract  %7  %11 0\r\n%28 = OpCompositeExtract  %7  %11 0\r\n%29 = OpIMul  %7  %27 %28\r\n%30 = OpIAdd  %7  %26 %29\r\n%31 = OpCompositeExtract  %7  %11 1\r\n%32 = OpCompositeExtract  %7  %11 1\r\n%33 = OpIMul  %7  %31 %32\r\n%25 = OpIAdd  %7  %30 %33\r\n%34 = OpCopyObject  %9  %8\r\n%35 = OpExtInst  %9  %1 FindUMsb %34\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/multiview.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 11\r\nOpCapability Shader\r\nOpCapability MultiView\r\nOpExtension \"SPV_KHR_multiview\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %8 \"main\" %5\r\nOpDecorate %5 BuiltIn ViewIndex\r\n%2 = OpTypeVoid\r\n%3 = OpTypeInt 32 1\r\n%6 = OpTypePointer Input %3\r\n%5 = OpVariable  %6  Input\r\n%9 = OpTypeFunction %2\r\n%8 = OpFunction  %2  None %9\r\n%4 = OpLabel\r\n%7 = OpLoad  %3  %5\r\nOpBranch %10\r\n%10 = OpLabel\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/operators.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 543\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint GLCompute %531 \"main\"\r\nOpExecutionMode %531 LocalSize 1 1 1\r\nOpMemberDecorate %31 0 Offset 0\r\nOpMemberDecorate %31 1 Offset 16\r\nOpDecorate %35 ArrayStride 32\r\nOpDecorate %36 ArrayStride 4\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.0\r\n%5 = OpConstant  %4  0.0\r\n%6 = OpConstant  %4  0.5\r\n%8 = OpTypeInt 32 1\r\n%7 = OpConstant  %8  1\r\n%10 = OpTypeBool\r\n%9 = OpConstantTrue  %10\r\n%11 = OpConstant  %8  0\r\n%12 = OpConstantFalse  %10\r\n%13 = OpConstant  %4  0.1\r\n%14 = OpConstant  %4  2.0\r\n%15 = OpConstant  %4  3.0\r\n%16 = OpConstant  %4  4.0\r\n%17 = OpConstant  %8  5\r\n%18 = OpConstant  %8  2\r\n%20 = OpTypeInt 32 0\r\n%19 = OpConstant  %20  0\r\n%21 = OpConstant  %8  3\r\n%22 = OpConstant  %20  4\r\n%23 = OpConstant  %4  -1.0\r\n%24 = OpConstant  %20  2\r\n%25 = OpConstant  %20  1\r\n%26 = OpTypeVector %4 4\r\n%27 = OpTypeVector %8 4\r\n%28 = OpTypeVector %10 4\r\n%29 = OpTypeVector %4 2\r\n%30 = OpTypeVector %4 3\r\n%31 = OpTypeStruct %26 %8\r\n%32 = OpTypeMatrix %29 2\r\n%33 = OpTypeMatrix %26 4\r\n%34 = OpTypeVector %20 2\r\n%35 = OpTypeArray %31 %21\r\n%36 = OpTypeArray %8 %22\r\n%37 = OpTypeMatrix %30 2\r\n%38 = OpTypeMatrix %30 3\r\n%39 = OpTypeMatrix %30 4\r\n%40 = OpTypeMatrix %26 3\r\n%41 = OpTypeVector %8 3\r\n%42 = OpConstantComposite  %26  %3 %3 %3 %3\r\n%43 = OpConstantComposite  %26  %5 %5 %5 %5\r\n%44 = OpConstantComposite  %26  %6 %6 %6 %6\r\n%45 = OpConstantComposite  %27  %7 %7 %7 %7\r\n%46 = OpConstantComposite  %34  %19 %19\r\n%47 = OpConstantComposite  %29  %5 %5\r\n%48 = OpConstantComposite  %32  %47 %47\r\n%49 = OpConstantComposite  %26  %5 %5 %5 %5\r\n%50 = OpConstantComposite  %31  %49 %11\r\n%51 = OpConstantComposite  %35  %50 %50 %50\r\n%52 = OpConstantComposite  %30  %5 %5 %5\r\n%53 = OpConstantComposite  %37  %52 %52\r\n%54 = OpConstantComposite  %38  %52 %52 %52\r\n%55 = OpConstantComposite  %39  %52 %52 %52 %52\r\n%56 = OpConstantComposite  %40  %49 %49 %49\r\n%57 = OpConstantComposite  %41  %11 %11 %11\r\n%60 = OpTypeFunction %26\r\n%100 = OpTypePointer Function %29\r\n%101 = OpConstantNull  %29\r\n%104 = OpTypeFunction %29\r\n%120 = OpTypeFunction %30 %30\r\n%122 = OpTypeVector %10 3\r\n%129 = OpTypePointer Function %31\r\n%130 = OpConstantNull  %31\r\n%133 = OpTypeFunction %4\r\n%158 = OpTypePointer Function %26\r\n%159 = OpTypePointer Function %4\r\n%164 = OpTypeFunction %2\r\n%167 = OpTypeVector %10 2\r\n%183 = OpTypeVector %8 2\r\n%194 = OpTypeVector %20 3\r\n%489 = OpTypePointer Function %8\r\n%491 = OpTypePointer Function %41\r\n%521 = OpTypePointer Function %8\r\n%59 = OpFunction  %26  None %60\r\n%58 = OpLabel\r\nOpBranch %61\r\n%61 = OpLabel\r\n%62 = OpSelect  %8  %9 %7 %11\r\n%64 = OpCompositeConstruct  %28  %9 %9 %9 %9\r\n%63 = OpSelect  %26  %64 %42 %43\r\n%65 = OpCompositeConstruct  %28  %12 %12 %12 %12\r\n%66 = OpSelect  %26  %65 %43 %42\r\n%67 = OpExtInst  %26  %1 FMix %43 %42 %44\r\n%69 = OpCompositeConstruct  %26  %13 %13 %13 %13\r\n%68 = OpExtInst  %26  %1 FMix %43 %42 %69\r\n%70 = OpCompositeExtract  %8  %45 0\r\n%71 = OpBitcast  %4  %70\r\n%72 = OpBitcast  %26  %45\r\n%73 = OpConvertFToS  %27  %43\r\n%74 = OpCompositeConstruct  %27  %62 %62 %62 %62\r\n%75 = OpIAdd  %27  %74 %73\r\n%76 = OpConvertSToF  %26  %75\r\n%77 = OpFAdd  %26  %76 %63\r\n%78 = OpFAdd  %26  %77 %67\r\n%79 = OpFAdd  %26  %78 %68\r\n%80 = OpCompositeConstruct  %26  %71 %71 %71 %71\r\n%81 = OpFAdd  %26  %79 %80\r\n%82 = OpFAdd  %26  %81 %72\r\nOpReturnValue %82\r\nOpFunctionEnd\r\n%84 = OpFunction  %26  None %60\r\n%83 = OpLabel\r\nOpBranch %85\r\n%85 = OpLabel\r\n%86 = OpCompositeConstruct  %29  %14 %14\r\n%87 = OpCompositeConstruct  %29  %3 %3\r\n%88 = OpFAdd  %29  %87 %86\r\n%89 = OpCompositeConstruct  %29  %15 %15\r\n%90 = OpFSub  %29  %88 %89\r\n%91 = OpCompositeConstruct  %29  %16 %16\r\n%92 = OpFDiv  %29  %90 %91\r\n%93 = OpCompositeConstruct  %27  %17 %17 %17 %17\r\n%94 = OpCompositeConstruct  %27  %18 %18 %18 %18\r\n%95 = OpSRem  %27  %93 %94\r\n%96 = OpVectorShuffle  %26  %92 %92 0 1 0 1\r\n%97 = OpConvertSToF  %26  %95\r\n%98 = OpFAdd  %26  %96 %97\r\nOpReturnValue %98\r\nOpFunctionEnd\r\n%103 = OpFunction  %29  None %104\r\n%102 = OpLabel\r\n%99 = OpVariable  %100  Function %101\r\nOpBranch %105\r\n%105 = OpLabel\r\n%106 = OpCompositeConstruct  %29  %14 %14\r\nOpStore %99 %106\r\n%107 = OpLoad  %29  %99\r\n%108 = OpCompositeConstruct  %29  %3 %3\r\n%109 = OpFAdd  %29  %107 %108\r\nOpStore %99 %109\r\n%110 = OpLoad  %29  %99\r\n%111 = OpCompositeConstruct  %29  %15 %15\r\n%112 = OpFSub  %29  %110 %111\r\nOpStore %99 %112\r\n%113 = OpLoad  %29  %99\r\n%114 = OpCompositeConstruct  %29  %16 %16\r\n%115 = OpFDiv  %29  %113 %114\r\nOpStore %99 %115\r\n%116 = OpLoad  %29  %99\r\nOpReturnValue %116\r\nOpFunctionEnd\r\n%119 = OpFunction  %30  None %120\r\n%118 = OpFunctionParameter  %30\r\n%117 = OpLabel\r\nOpBranch %121\r\n%121 = OpLabel\r\n%123 = OpCompositeConstruct  %30  %5 %5 %5\r\n%124 = OpFUnordNotEqual  %122  %118 %123\r\n%125 = OpCompositeConstruct  %30  %5 %5 %5\r\n%126 = OpCompositeConstruct  %30  %3 %3 %3\r\n%127 = OpSelect  %30  %124 %126 %125\r\nOpReturnValue %127\r\nOpFunctionEnd\r\n%132 = OpFunction  %4  None %133\r\n%131 = OpLabel\r\n%128 = OpVariable  %129  Function %130\r\nOpBranch %134\r\n%134 = OpLabel\r\n%135 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%136 = OpCompositeConstruct  %31  %135 %7\r\nOpStore %128 %136\r\n%137 = OpCompositeConstruct  %29  %3 %5\r\n%138 = OpCompositeConstruct  %29  %5 %3\r\n%139 = OpCompositeConstruct  %32  %137 %138\r\n%140 = OpCompositeConstruct  %26  %3 %5 %5 %5\r\n%141 = OpCompositeConstruct  %26  %5 %3 %5 %5\r\n%142 = OpCompositeConstruct  %26  %5 %5 %3 %5\r\n%143 = OpCompositeConstruct  %26  %5 %5 %5 %3\r\n%144 = OpCompositeConstruct  %33  %140 %141 %142 %143\r\n%145 = OpCompositeConstruct  %34  %19 %19\r\n%146 = OpCompositeConstruct  %29  %5 %5\r\n%147 = OpCompositeConstruct  %29  %5 %5\r\n%148 = OpCompositeConstruct  %32  %146 %147\r\n%149 = OpCompositeConstruct  %36  %11 %7 %18 %21\r\n%155 = OpCopyObject  %37  %53\r\n%157 = OpCopyObject  %37  %53\r\n%160 = OpAccessChain  %159  %128 %19 %19\r\n%161 = OpLoad  %4  %160\r\nOpReturnValue %161\r\nOpFunctionEnd\r\n%163 = OpFunction  %2  None %164\r\n%162 = OpLabel\r\nOpBranch %165\r\n%165 = OpLabel\r\n%166 = OpLogicalNot  %10  %9\r\n%168 = OpCompositeConstruct  %167  %9 %9\r\n%169 = OpLogicalNot  %167  %168\r\n%170 = OpLogicalOr  %10  %9 %12\r\n%171 = OpLogicalAnd  %10  %9 %12\r\n%172 = OpLogicalOr  %10  %9 %12\r\n%173 = OpCompositeConstruct  %122  %9 %9 %9\r\n%174 = OpCompositeConstruct  %122  %12 %12 %12\r\n%175 = OpLogicalOr  %122  %173 %174\r\n%176 = OpLogicalAnd  %10  %9 %12\r\n%177 = OpCompositeConstruct  %28  %9 %9 %9 %9\r\n%178 = OpCompositeConstruct  %28  %12 %12 %12 %12\r\n%179 = OpLogicalAnd  %28  %177 %178\r\nOpReturn\r\nOpFunctionEnd\r\n%181 = OpFunction  %2  None %164\r\n%180 = OpLabel\r\nOpBranch %182\r\n%182 = OpLabel\r\n%184 = OpCompositeConstruct  %183  %7 %7\r\n%185 = OpSNegate  %183  %184\r\n%186 = OpCompositeConstruct  %29  %3 %3\r\n%187 = OpFNegate  %29  %186\r\n%188 = OpIAdd  %8  %18 %7\r\n%189 = OpIAdd  %20  %24 %25\r\n%190 = OpFAdd  %4  %14 %3\r\n%191 = OpCompositeConstruct  %183  %18 %18\r\n%192 = OpCompositeConstruct  %183  %7 %7\r\n%193 = OpIAdd  %183  %191 %192\r\n%195 = OpCompositeConstruct  %194  %24 %24 %24\r\n%196 = OpCompositeConstruct  %194  %25 %25 %25\r\n%197 = OpIAdd  %194  %195 %196\r\n%198 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%199 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%200 = OpFAdd  %26  %198 %199\r\n%201 = OpISub  %8  %18 %7\r\n%202 = OpISub  %20  %24 %25\r\n%203 = OpFSub  %4  %14 %3\r\n%204 = OpCompositeConstruct  %183  %18 %18\r\n%205 = OpCompositeConstruct  %183  %7 %7\r\n%206 = OpISub  %183  %204 %205\r\n%207 = OpCompositeConstruct  %194  %24 %24 %24\r\n%208 = OpCompositeConstruct  %194  %25 %25 %25\r\n%209 = OpISub  %194  %207 %208\r\n%210 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%211 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%212 = OpFSub  %26  %210 %211\r\n%213 = OpIMul  %8  %18 %7\r\n%214 = OpIMul  %20  %24 %25\r\n%215 = OpFMul  %4  %14 %3\r\n%216 = OpCompositeConstruct  %183  %18 %18\r\n%217 = OpCompositeConstruct  %183  %7 %7\r\n%218 = OpIMul  %183  %216 %217\r\n%219 = OpCompositeConstruct  %194  %24 %24 %24\r\n%220 = OpCompositeConstruct  %194  %25 %25 %25\r\n%221 = OpIMul  %194  %219 %220\r\n%222 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%223 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%224 = OpFMul  %26  %222 %223\r\n%225 = OpSDiv  %8  %18 %7\r\n%226 = OpUDiv  %20  %24 %25\r\n%227 = OpFDiv  %4  %14 %3\r\n%228 = OpCompositeConstruct  %183  %18 %18\r\n%229 = OpCompositeConstruct  %183  %7 %7\r\n%230 = OpSDiv  %183  %228 %229\r\n%231 = OpCompositeConstruct  %194  %24 %24 %24\r\n%232 = OpCompositeConstruct  %194  %25 %25 %25\r\n%233 = OpUDiv  %194  %231 %232\r\n%234 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%235 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%236 = OpFDiv  %26  %234 %235\r\n%237 = OpSRem  %8  %18 %7\r\n%238 = OpUMod  %20  %24 %25\r\n%239 = OpFRem  %4  %14 %3\r\n%240 = OpCompositeConstruct  %183  %18 %18\r\n%241 = OpCompositeConstruct  %183  %7 %7\r\n%242 = OpSRem  %183  %240 %241\r\n%243 = OpCompositeConstruct  %194  %24 %24 %24\r\n%244 = OpCompositeConstruct  %194  %25 %25 %25\r\n%245 = OpUMod  %194  %243 %244\r\n%246 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%247 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%248 = OpFRem  %26  %246 %247\r\n%249 = OpCompositeConstruct  %183  %18 %18\r\n%250 = OpCompositeConstruct  %183  %7 %7\r\n%251 = OpIAdd  %183  %249 %250\r\n%252 = OpCompositeConstruct  %183  %7 %7\r\n%253 = OpCompositeConstruct  %183  %18 %18\r\n%254 = OpIAdd  %183  %253 %252\r\n%255 = OpCompositeConstruct  %34  %24 %24\r\n%256 = OpCompositeConstruct  %34  %25 %25\r\n%257 = OpIAdd  %34  %255 %256\r\n%258 = OpCompositeConstruct  %34  %25 %25\r\n%259 = OpCompositeConstruct  %34  %24 %24\r\n%260 = OpIAdd  %34  %259 %258\r\n%261 = OpCompositeConstruct  %29  %14 %14\r\n%262 = OpCompositeConstruct  %29  %3 %3\r\n%263 = OpFAdd  %29  %261 %262\r\n%264 = OpCompositeConstruct  %29  %3 %3\r\n%265 = OpCompositeConstruct  %29  %14 %14\r\n%266 = OpFAdd  %29  %265 %264\r\n%267 = OpCompositeConstruct  %183  %18 %18\r\n%268 = OpCompositeConstruct  %183  %7 %7\r\n%269 = OpISub  %183  %267 %268\r\n%270 = OpCompositeConstruct  %183  %7 %7\r\n%271 = OpCompositeConstruct  %183  %18 %18\r\n%272 = OpISub  %183  %271 %270\r\n%273 = OpCompositeConstruct  %34  %24 %24\r\n%274 = OpCompositeConstruct  %34  %25 %25\r\n%275 = OpISub  %34  %273 %274\r\n%276 = OpCompositeConstruct  %34  %25 %25\r\n%277 = OpCompositeConstruct  %34  %24 %24\r\n%278 = OpISub  %34  %277 %276\r\n%279 = OpCompositeConstruct  %29  %14 %14\r\n%280 = OpCompositeConstruct  %29  %3 %3\r\n%281 = OpFSub  %29  %279 %280\r\n%282 = OpCompositeConstruct  %29  %3 %3\r\n%283 = OpCompositeConstruct  %29  %14 %14\r\n%284 = OpFSub  %29  %283 %282\r\n%285 = OpCompositeConstruct  %183  %18 %18\r\n%287 = OpCompositeConstruct  %183  %7 %7\r\n%286 = OpIMul  %183  %285 %287\r\n%288 = OpCompositeConstruct  %183  %7 %7\r\n%290 = OpCompositeConstruct  %183  %18 %18\r\n%289 = OpIMul  %183  %288 %290\r\n%291 = OpCompositeConstruct  %34  %24 %24\r\n%293 = OpCompositeConstruct  %34  %25 %25\r\n%292 = OpIMul  %34  %291 %293\r\n%294 = OpCompositeConstruct  %34  %25 %25\r\n%296 = OpCompositeConstruct  %34  %24 %24\r\n%295 = OpIMul  %34  %294 %296\r\n%297 = OpCompositeConstruct  %29  %14 %14\r\n%298 = OpVectorTimesScalar  %29  %297 %3\r\n%299 = OpCompositeConstruct  %29  %3 %3\r\n%300 = OpVectorTimesScalar  %29  %299 %14\r\n%301 = OpCompositeConstruct  %183  %18 %18\r\n%302 = OpCompositeConstruct  %183  %7 %7\r\n%303 = OpSDiv  %183  %301 %302\r\n%304 = OpCompositeConstruct  %183  %7 %7\r\n%305 = OpCompositeConstruct  %183  %18 %18\r\n%306 = OpSDiv  %183  %305 %304\r\n%307 = OpCompositeConstruct  %34  %24 %24\r\n%308 = OpCompositeConstruct  %34  %25 %25\r\n%309 = OpUDiv  %34  %307 %308\r\n%310 = OpCompositeConstruct  %34  %25 %25\r\n%311 = OpCompositeConstruct  %34  %24 %24\r\n%312 = OpUDiv  %34  %311 %310\r\n%313 = OpCompositeConstruct  %29  %14 %14\r\n%314 = OpCompositeConstruct  %29  %3 %3\r\n%315 = OpFDiv  %29  %313 %314\r\n%316 = OpCompositeConstruct  %29  %3 %3\r\n%317 = OpCompositeConstruct  %29  %14 %14\r\n%318 = OpFDiv  %29  %317 %316\r\n%319 = OpCompositeConstruct  %183  %18 %18\r\n%320 = OpCompositeConstruct  %183  %7 %7\r\n%321 = OpSRem  %183  %319 %320\r\n%322 = OpCompositeConstruct  %183  %7 %7\r\n%323 = OpCompositeConstruct  %183  %18 %18\r\n%324 = OpSRem  %183  %323 %322\r\n%325 = OpCompositeConstruct  %34  %24 %24\r\n%326 = OpCompositeConstruct  %34  %25 %25\r\n%327 = OpUMod  %34  %325 %326\r\n%328 = OpCompositeConstruct  %34  %25 %25\r\n%329 = OpCompositeConstruct  %34  %24 %24\r\n%330 = OpUMod  %34  %329 %328\r\n%331 = OpCompositeConstruct  %29  %14 %14\r\n%332 = OpCompositeConstruct  %29  %3 %3\r\n%333 = OpFRem  %29  %331 %332\r\n%334 = OpCompositeConstruct  %29  %3 %3\r\n%335 = OpCompositeConstruct  %29  %14 %14\r\n%336 = OpFRem  %29  %335 %334\r\n%338 = OpCompositeExtract  %30  %54 0\r\n%339 = OpCompositeExtract  %30  %54 0\r\n%340 = OpFAdd  %30  %338 %339\r\n%341 = OpCompositeExtract  %30  %54 1\r\n%342 = OpCompositeExtract  %30  %54 1\r\n%343 = OpFAdd  %30  %341 %342\r\n%344 = OpCompositeExtract  %30  %54 2\r\n%345 = OpCompositeExtract  %30  %54 2\r\n%346 = OpFAdd  %30  %344 %345\r\n%337 = OpCompositeConstruct  %38  %340 %343 %346\r\n%348 = OpCompositeExtract  %30  %54 0\r\n%349 = OpCompositeExtract  %30  %54 0\r\n%350 = OpFSub  %30  %348 %349\r\n%351 = OpCompositeExtract  %30  %54 1\r\n%352 = OpCompositeExtract  %30  %54 1\r\n%353 = OpFSub  %30  %351 %352\r\n%354 = OpCompositeExtract  %30  %54 2\r\n%355 = OpCompositeExtract  %30  %54 2\r\n%356 = OpFSub  %30  %354 %355\r\n%347 = OpCompositeConstruct  %38  %350 %353 %356\r\n%357 = OpMatrixTimesScalar  %38  %54 %3\r\n%358 = OpMatrixTimesScalar  %38  %54 %14\r\n%359 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%360 = OpMatrixTimesVector  %30  %55 %359\r\n%361 = OpCompositeConstruct  %30  %14 %14 %14\r\n%362 = OpVectorTimesMatrix  %26  %361 %55\r\n%363 = OpMatrixTimesMatrix  %38  %55 %56\r\nOpReturn\r\nOpFunctionEnd\r\n%365 = OpFunction  %2  None %164\r\n%364 = OpLabel\r\nOpBranch %366\r\n%366 = OpLabel\r\n%367 = OpNot  %8  %7\r\n%368 = OpNot  %20  %25\r\n%369 = OpCompositeConstruct  %183  %7 %7\r\n%370 = OpNot  %183  %369\r\n%371 = OpCompositeConstruct  %194  %25 %25 %25\r\n%372 = OpNot  %194  %371\r\n%373 = OpBitwiseOr  %8  %18 %7\r\n%374 = OpBitwiseOr  %20  %24 %25\r\n%375 = OpCompositeConstruct  %183  %18 %18\r\n%376 = OpCompositeConstruct  %183  %7 %7\r\n%377 = OpBitwiseOr  %183  %375 %376\r\n%378 = OpCompositeConstruct  %194  %24 %24 %24\r\n%379 = OpCompositeConstruct  %194  %25 %25 %25\r\n%380 = OpBitwiseOr  %194  %378 %379\r\n%381 = OpBitwiseAnd  %8  %18 %7\r\n%382 = OpBitwiseAnd  %20  %24 %25\r\n%383 = OpCompositeConstruct  %183  %18 %18\r\n%384 = OpCompositeConstruct  %183  %7 %7\r\n%385 = OpBitwiseAnd  %183  %383 %384\r\n%386 = OpCompositeConstruct  %194  %24 %24 %24\r\n%387 = OpCompositeConstruct  %194  %25 %25 %25\r\n%388 = OpBitwiseAnd  %194  %386 %387\r\n%389 = OpBitwiseXor  %8  %18 %7\r\n%390 = OpBitwiseXor  %20  %24 %25\r\n%391 = OpCompositeConstruct  %183  %18 %18\r\n%392 = OpCompositeConstruct  %183  %7 %7\r\n%393 = OpBitwiseXor  %183  %391 %392\r\n%394 = OpCompositeConstruct  %194  %24 %24 %24\r\n%395 = OpCompositeConstruct  %194  %25 %25 %25\r\n%396 = OpBitwiseXor  %194  %394 %395\r\n%397 = OpShiftLeftLogical  %8  %18 %25\r\n%398 = OpShiftLeftLogical  %20  %24 %25\r\n%399 = OpCompositeConstruct  %183  %18 %18\r\n%400 = OpCompositeConstruct  %34  %25 %25\r\n%401 = OpShiftLeftLogical  %183  %399 %400\r\n%402 = OpCompositeConstruct  %194  %24 %24 %24\r\n%403 = OpCompositeConstruct  %194  %25 %25 %25\r\n%404 = OpShiftLeftLogical  %194  %402 %403\r\n%405 = OpShiftRightArithmetic  %8  %18 %25\r\n%406 = OpShiftRightLogical  %20  %24 %25\r\n%407 = OpCompositeConstruct  %183  %18 %18\r\n%408 = OpCompositeConstruct  %34  %25 %25\r\n%409 = OpShiftRightArithmetic  %183  %407 %408\r\n%410 = OpCompositeConstruct  %194  %24 %24 %24\r\n%411 = OpCompositeConstruct  %194  %25 %25 %25\r\n%412 = OpShiftRightLogical  %194  %410 %411\r\nOpReturn\r\nOpFunctionEnd\r\n%414 = OpFunction  %2  None %164\r\n%413 = OpLabel\r\nOpBranch %415\r\n%415 = OpLabel\r\n%416 = OpIEqual  %10  %18 %7\r\n%417 = OpIEqual  %10  %24 %25\r\n%418 = OpFOrdEqual  %10  %14 %3\r\n%419 = OpCompositeConstruct  %183  %18 %18\r\n%420 = OpCompositeConstruct  %183  %7 %7\r\n%421 = OpIEqual  %167  %419 %420\r\n%422 = OpCompositeConstruct  %194  %24 %24 %24\r\n%423 = OpCompositeConstruct  %194  %25 %25 %25\r\n%424 = OpIEqual  %122  %422 %423\r\n%425 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%426 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%427 = OpFOrdEqual  %28  %425 %426\r\n%428 = OpINotEqual  %10  %18 %7\r\n%429 = OpINotEqual  %10  %24 %25\r\n%430 = OpFOrdNotEqual  %10  %14 %3\r\n%431 = OpCompositeConstruct  %183  %18 %18\r\n%432 = OpCompositeConstruct  %183  %7 %7\r\n%433 = OpINotEqual  %167  %431 %432\r\n%434 = OpCompositeConstruct  %194  %24 %24 %24\r\n%435 = OpCompositeConstruct  %194  %25 %25 %25\r\n%436 = OpINotEqual  %122  %434 %435\r\n%437 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%438 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%439 = OpFOrdNotEqual  %28  %437 %438\r\n%440 = OpSLessThan  %10  %18 %7\r\n%441 = OpULessThan  %10  %24 %25\r\n%442 = OpFOrdLessThan  %10  %14 %3\r\n%443 = OpCompositeConstruct  %183  %18 %18\r\n%444 = OpCompositeConstruct  %183  %7 %7\r\n%445 = OpSLessThan  %167  %443 %444\r\n%446 = OpCompositeConstruct  %194  %24 %24 %24\r\n%447 = OpCompositeConstruct  %194  %25 %25 %25\r\n%448 = OpULessThan  %122  %446 %447\r\n%449 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%450 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%451 = OpFOrdLessThan  %28  %449 %450\r\n%452 = OpSLessThanEqual  %10  %18 %7\r\n%453 = OpULessThanEqual  %10  %24 %25\r\n%454 = OpFOrdLessThanEqual  %10  %14 %3\r\n%455 = OpCompositeConstruct  %183  %18 %18\r\n%456 = OpCompositeConstruct  %183  %7 %7\r\n%457 = OpSLessThanEqual  %167  %455 %456\r\n%458 = OpCompositeConstruct  %194  %24 %24 %24\r\n%459 = OpCompositeConstruct  %194  %25 %25 %25\r\n%460 = OpULessThanEqual  %122  %458 %459\r\n%461 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%462 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%463 = OpFOrdLessThanEqual  %28  %461 %462\r\n%464 = OpSGreaterThan  %10  %18 %7\r\n%465 = OpUGreaterThan  %10  %24 %25\r\n%466 = OpFOrdGreaterThan  %10  %14 %3\r\n%467 = OpCompositeConstruct  %183  %18 %18\r\n%468 = OpCompositeConstruct  %183  %7 %7\r\n%469 = OpSGreaterThan  %167  %467 %468\r\n%470 = OpCompositeConstruct  %194  %24 %24 %24\r\n%471 = OpCompositeConstruct  %194  %25 %25 %25\r\n%472 = OpUGreaterThan  %122  %470 %471\r\n%473 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%474 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%475 = OpFOrdGreaterThan  %28  %473 %474\r\n%476 = OpSGreaterThanEqual  %10  %18 %7\r\n%477 = OpUGreaterThanEqual  %10  %24 %25\r\n%478 = OpFOrdGreaterThanEqual  %10  %14 %3\r\n%479 = OpCompositeConstruct  %183  %18 %18\r\n%480 = OpCompositeConstruct  %183  %7 %7\r\n%481 = OpSGreaterThanEqual  %167  %479 %480\r\n%482 = OpCompositeConstruct  %194  %24 %24 %24\r\n%483 = OpCompositeConstruct  %194  %25 %25 %25\r\n%484 = OpUGreaterThanEqual  %122  %482 %483\r\n%485 = OpCompositeConstruct  %26  %14 %14 %14 %14\r\n%486 = OpCompositeConstruct  %26  %3 %3 %3 %3\r\n%487 = OpFOrdGreaterThanEqual  %28  %485 %486\r\nOpReturn\r\nOpFunctionEnd\r\n%493 = OpFunction  %2  None %164\r\n%492 = OpLabel\r\n%488 = OpVariable  %489  Function %7\r\n%490 = OpVariable  %491  Function %57\r\nOpBranch %494\r\n%494 = OpLabel\r\n%495 = OpLoad  %8  %488\r\n%496 = OpIAdd  %8  %495 %7\r\nOpStore %488 %496\r\n%497 = OpLoad  %8  %488\r\n%498 = OpISub  %8  %497 %7\r\nOpStore %488 %498\r\n%499 = OpLoad  %8  %488\r\n%500 = OpLoad  %8  %488\r\n%501 = OpIMul  %8  %499 %500\r\nOpStore %488 %501\r\n%502 = OpLoad  %8  %488\r\n%503 = OpLoad  %8  %488\r\n%504 = OpSDiv  %8  %502 %503\r\nOpStore %488 %504\r\n%505 = OpLoad  %8  %488\r\n%506 = OpSRem  %8  %505 %7\r\nOpStore %488 %506\r\n%507 = OpLoad  %8  %488\r\n%508 = OpBitwiseAnd  %8  %507 %11\r\nOpStore %488 %508\r\n%509 = OpLoad  %8  %488\r\n%510 = OpBitwiseOr  %8  %509 %11\r\nOpStore %488 %510\r\n%511 = OpLoad  %8  %488\r\n%512 = OpBitwiseXor  %8  %511 %11\r\nOpStore %488 %512\r\n%513 = OpLoad  %8  %488\r\n%514 = OpShiftLeftLogical  %8  %513 %24\r\nOpStore %488 %514\r\n%515 = OpLoad  %8  %488\r\n%516 = OpShiftRightArithmetic  %8  %515 %25\r\nOpStore %488 %516\r\n%517 = OpLoad  %8  %488\r\n%518 = OpIAdd  %8  %517 %7\r\nOpStore %488 %518\r\n%519 = OpLoad  %8  %488\r\n%520 = OpISub  %8  %519 %7\r\nOpStore %488 %520\r\n%522 = OpAccessChain  %521  %490 %25\r\n%523 = OpLoad  %8  %522\r\n%524 = OpIAdd  %8  %523 %7\r\n%525 = OpAccessChain  %521  %490 %25\r\nOpStore %525 %524\r\n%526 = OpAccessChain  %521  %490 %25\r\n%527 = OpLoad  %8  %526\r\n%528 = OpISub  %8  %527 %7\r\n%529 = OpAccessChain  %521  %490 %25\r\nOpStore %529 %528\r\nOpReturn\r\nOpFunctionEnd\r\n%531 = OpFunction  %2  None %164\r\n%530 = OpLabel\r\nOpBranch %532\r\n%532 = OpLabel\r\n%533 = OpFunctionCall  %26  %59\r\n%534 = OpFunctionCall  %26  %84\r\n%535 = OpVectorShuffle  %30  %42 %42 0 1 2\r\n%536 = OpFunctionCall  %30  %119 %535\r\n%537 = OpFunctionCall  %4  %132\r\n%538 = OpFunctionCall  %2  %163\r\n%539 = OpFunctionCall  %2  %181\r\n%540 = OpFunctionCall  %2  %365\r\n%541 = OpFunctionCall  %2  %414\r\n%542 = OpFunctionCall  %2  %493\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/padding.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 50\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %27 \"vertex\" %25\r\nOpSource GLSL 450\r\nOpMemberName %8 0 \"a\"\r\nOpName %8 \"S\"\r\nOpMemberName %9 0 \"a\"\r\nOpMemberName %9 1 \"b\"\r\nOpName %9 \"Test\"\r\nOpMemberName %11 0 \"a\"\r\nOpMemberName %11 1 \"b\"\r\nOpName %11 \"Test2\"\r\nOpMemberName %13 0 \"a\"\r\nOpMemberName %13 1 \"b\"\r\nOpName %13 \"Test3\"\r\nOpName %15 \"input1\"\r\nOpName %18 \"input2\"\r\nOpName %21 \"input3\"\r\nOpName %27 \"vertex\"\r\nOpMemberDecorate %8 0 Offset 0\r\nOpMemberDecorate %9 0 Offset 0\r\nOpMemberDecorate %9 1 Offset 16\r\nOpDecorate %10 ArrayStride 16\r\nOpMemberDecorate %11 0 Offset 0\r\nOpMemberDecorate %11 1 Offset 32\r\nOpMemberDecorate %13 0 Offset 0\r\nOpMemberDecorate %13 0 ColMajor\r\nOpMemberDecorate %13 0 MatrixStride 16\r\nOpMemberDecorate %13 1 Offset 64\r\nOpDecorate %15 DescriptorSet 0\r\nOpDecorate %15 Binding 0\r\nOpDecorate %16 Block\r\nOpMemberDecorate %16 0 Offset 0\r\nOpDecorate %18 DescriptorSet 0\r\nOpDecorate %18 Binding 1\r\nOpDecorate %19 Block\r\nOpMemberDecorate %19 0 Offset 0\r\nOpDecorate %21 DescriptorSet 0\r\nOpDecorate %21 Binding 2\r\nOpDecorate %22 Block\r\nOpMemberDecorate %22 0 Offset 0\r\nOpDecorate %25 BuiltIn Position\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  2\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  1.0\r\n%7 = OpTypeVector %6 3\r\n%8 = OpTypeStruct %7\r\n%9 = OpTypeStruct %8 %6\r\n%10 = OpTypeArray %7 %3\r\n%11 = OpTypeStruct %10 %6\r\n%12 = OpTypeMatrix %7 4\r\n%13 = OpTypeStruct %12 %6\r\n%14 = OpTypeVector %6 4\r\n%16 = OpTypeStruct %9\r\n%17 = OpTypePointer Uniform %16\r\n%15 = OpVariable  %17  Uniform\r\n%19 = OpTypeStruct %11\r\n%20 = OpTypePointer Uniform %19\r\n%18 = OpVariable  %20  Uniform\r\n%22 = OpTypeStruct %13\r\n%23 = OpTypePointer Uniform %22\r\n%21 = OpVariable  %23  Uniform\r\n%26 = OpTypePointer Output %14\r\n%25 = OpVariable  %26  Output\r\n%28 = OpTypeFunction %2\r\n%29 = OpTypePointer Uniform %9\r\n%31 = OpTypeInt 32 0\r\n%30 = OpConstant  %31  0\r\n%33 = OpTypePointer Uniform %11\r\n%35 = OpTypePointer Uniform %13\r\n%39 = OpTypePointer Uniform %6\r\n%40 = OpConstant  %31  1\r\n%27 = OpFunction  %2  None %28\r\n%24 = OpLabel\r\n%32 = OpAccessChain  %29  %15 %30\r\n%34 = OpAccessChain  %33  %18 %30\r\n%36 = OpAccessChain  %35  %21 %30\r\nOpBranch %37\r\n%37 = OpLabel\r\n%38 = OpCompositeConstruct  %14  %5 %5 %5 %5\r\n%41 = OpAccessChain  %39  %32 %40\r\n%42 = OpLoad  %6  %41\r\n%43 = OpVectorTimesScalar  %14  %38 %42\r\n%44 = OpAccessChain  %39  %34 %40\r\n%45 = OpLoad  %6  %44\r\n%46 = OpVectorTimesScalar  %14  %43 %45\r\n%47 = OpAccessChain  %39  %36 %40\r\n%48 = OpLoad  %6  %47\r\n%49 = OpVectorTimesScalar  %14  %46 %48\r\nOpStore %25 %49\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/pointer-access.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 35\r\nOpCapability Shader\r\nOpCapability Linkage\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpSource GLSL 450\r\nOpDecorate %12 ArrayStride 4\r\nOpDecorate %14 ArrayStride 4\r\nOpDecorate %15 Block\r\nOpMemberDecorate %15 0 Offset 0\r\nOpDecorate %17 DescriptorSet 0\r\nOpDecorate %17 Binding 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  0\r\n%5 = OpConstant  %4  1\r\n%6 = OpConstant  %4  2\r\n%7 = OpConstant  %4  3\r\n%9 = OpTypeInt 32 0\r\n%8 = OpConstant  %9  0\r\n%10 = OpConstant  %9  7\r\n%11 = OpTypePointer StorageBuffer %9\r\n%12 = OpTypeArray %9 %10\r\n%13 = OpTypePointer StorageBuffer %12\r\n%14 = OpTypeRuntimeArray %9\r\n%15 = OpTypeStruct %14\r\n%16 = OpTypePointer StorageBuffer %15\r\n%17 = OpVariable  %16  StorageBuffer\r\n%22 = OpTypeFunction %9 %13 %9\r\n%30 = OpTypeFunction %9 %16 %9\r\n%32 = OpTypePointer StorageBuffer %14\r\n%21 = OpFunction  %9  None %22\r\n%19 = OpFunctionParameter  %13\r\n%20 = OpFunctionParameter  %9\r\n%18 = OpLabel\r\nOpBranch %23\r\n%23 = OpLabel\r\n%24 = OpAccessChain  %11  %19 %20\r\n%25 = OpLoad  %9  %24\r\nOpReturnValue %25\r\nOpFunctionEnd\r\n%29 = OpFunction  %9  None %30\r\n%27 = OpFunctionParameter  %16\r\n%28 = OpFunctionParameter  %9\r\n%26 = OpLabel\r\nOpBranch %31\r\n%31 = OpLabel\r\n%33 = OpAccessChain  %11  %27 %8 %28\r\n%34 = OpLoad  %9  %33\r\nOpReturnValue %34\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/pointers.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.2\r\n; Generator: rspirv\r\n; Bound: 42\r\nOpCapability Shader\r\nOpCapability Linkage\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpSource GLSL 450\r\nOpMemberName %8 0 \"arr\"\r\nOpName %8 \"DynamicArray\"\r\nOpName %11 \"dynamic_array\"\r\nOpName %12 \"v\"\r\nOpName %16 \"f\"\r\nOpName %23 \"i\"\r\nOpName %24 \"v\"\r\nOpName %25 \"index_unsized\"\r\nOpName %34 \"i\"\r\nOpName %35 \"v\"\r\nOpName %36 \"index_dynamic_array\"\r\nOpDecorate %7 ArrayStride 4\r\nOpMemberDecorate %8 0 Offset 0\r\nOpDecorate %11 DescriptorSet 0\r\nOpDecorate %11 Binding 0\r\nOpDecorate %8 Block\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  10\r\n%5 = OpTypeVector %4 2\r\n%6 = OpTypeInt 32 0\r\n%7 = OpTypeRuntimeArray %6\r\n%8 = OpTypeStruct %7\r\n%9 = OpTypePointer StorageBuffer %8\r\n%10 = OpTypePointer StorageBuffer %7\r\n%11 = OpVariable  %9  StorageBuffer\r\n%13 = OpTypePointer Function %5\r\n%14 = OpConstantNull  %5\r\n%17 = OpTypeFunction %2\r\n%19 = OpTypePointer Function %4\r\n%20 = OpConstant  %6  0\r\n%26 = OpTypeFunction %2 %4 %6\r\n%28 = OpTypePointer StorageBuffer %6\r\n%16 = OpFunction  %2  None %17\r\n%15 = OpLabel\r\n%12 = OpVariable  %13  Function %14\r\nOpBranch %18\r\n%18 = OpLabel\r\n%21 = OpAccessChain  %19  %12 %20\r\nOpStore %21 %3\r\nOpReturn\r\nOpFunctionEnd\r\n%25 = OpFunction  %2  None %26\r\n%23 = OpFunctionParameter  %4\r\n%24 = OpFunctionParameter  %6\r\n%22 = OpLabel\r\nOpBranch %27\r\n%27 = OpLabel\r\n%29 = OpAccessChain  %28  %11 %20 %23\r\n%30 = OpLoad  %6  %29\r\n%31 = OpIAdd  %6  %30 %24\r\n%32 = OpAccessChain  %28  %11 %20 %23\r\nOpStore %32 %31\r\nOpReturn\r\nOpFunctionEnd\r\n%36 = OpFunction  %2  None %26\r\n%34 = OpFunctionParameter  %4\r\n%35 = OpFunctionParameter  %6\r\n%33 = OpLabel\r\nOpBranch %37\r\n%37 = OpLabel\r\n%38 = OpAccessChain  %28  %11 %20 %34\r\n%39 = OpLoad  %6  %38\r\n%40 = OpIAdd  %6  %39 %35\r\n%41 = OpAccessChain  %28  %11 %20 %34\r\nOpStore %41 %40\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/policy-mix.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 101\r\nOpCapability Shader\r\nOpCapability ImageQuery\r\nOpCapability Linkage\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpSource GLSL 450\r\nOpMemberName %15 0 \"a\"\r\nOpName %15 \"InStorage\"\r\nOpMemberName %17 0 \"a\"\r\nOpName %17 \"InUniform\"\r\nOpName %23 \"in_storage\"\r\nOpName %26 \"in_uniform\"\r\nOpName %29 \"image_2d_array\"\r\nOpName %31 \"in_workgroup\"\r\nOpName %33 \"in_private\"\r\nOpName %36 \"in_function\"\r\nOpName %40 \"c\"\r\nOpName %41 \"i\"\r\nOpName %42 \"l\"\r\nOpName %43 \"mock_function\"\r\nOpDecorate %14 ArrayStride 16\r\nOpMemberDecorate %15 0 Offset 0\r\nOpDecorate %16 ArrayStride 16\r\nOpMemberDecorate %17 0 Offset 0\r\nOpDecorate %19 ArrayStride 4\r\nOpDecorate %20 ArrayStride 4\r\nOpDecorate %22 ArrayStride 16\r\nOpDecorate %23 NonWritable\r\nOpDecorate %23 DescriptorSet 0\r\nOpDecorate %23 Binding 0\r\nOpDecorate %24 Block\r\nOpMemberDecorate %24 0 Offset 0\r\nOpDecorate %26 DescriptorSet 0\r\nOpDecorate %26 Binding 1\r\nOpDecorate %27 Block\r\nOpMemberDecorate %27 0 Offset 0\r\nOpDecorate %29 DescriptorSet 0\r\nOpDecorate %29 Binding 2\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  10\r\n%5 = OpConstant  %4  20\r\n%6 = OpConstant  %4  30\r\n%7 = OpConstant  %4  40\r\n%8 = OpConstant  %4  2\r\n%10 = OpTypeFloat 32\r\n%9 = OpConstant  %10  0.707\r\n%11 = OpConstant  %10  0.0\r\n%12 = OpConstant  %10  1.0\r\n%13 = OpTypeVector %10 4\r\n%14 = OpTypeArray %13 %3\r\n%15 = OpTypeStruct %14\r\n%16 = OpTypeArray %13 %5\r\n%17 = OpTypeStruct %16\r\n%18 = OpTypeImage %10 2D 0 1 0 1 Unknown\r\n%19 = OpTypeArray %10 %6\r\n%20 = OpTypeArray %10 %7\r\n%21 = OpTypeVector %4 2\r\n%22 = OpTypeArray %13 %8\r\n%24 = OpTypeStruct %15\r\n%25 = OpTypePointer StorageBuffer %24\r\n%23 = OpVariable  %25  StorageBuffer\r\n%27 = OpTypeStruct %17\r\n%28 = OpTypePointer Uniform %27\r\n%26 = OpVariable  %28  Uniform\r\n%30 = OpTypePointer UniformConstant %18\r\n%29 = OpVariable  %30  UniformConstant\r\n%32 = OpTypePointer Workgroup %19\r\n%31 = OpVariable  %32  Workgroup\r\n%34 = OpTypePointer Private %20\r\n%35 = OpConstantNull  %20\r\n%33 = OpVariable  %34  Private %35\r\n%37 = OpTypePointer Function %22\r\n%38 = OpConstantNull  %22\r\n%44 = OpTypeFunction %13 %21 %4 %4\r\n%45 = OpTypePointer StorageBuffer %15\r\n%47 = OpTypeInt 32 0\r\n%46 = OpConstant  %47  0\r\n%49 = OpTypePointer Uniform %17\r\n%56 = OpTypePointer StorageBuffer %14\r\n%57 = OpTypePointer StorageBuffer %13\r\n%60 = OpTypePointer Uniform %16\r\n%61 = OpTypePointer Uniform %13\r\n%65 = OpTypeVector %4 3\r\n%67 = OpTypeBool\r\n%68 = OpConstantNull  %13\r\n%74 = OpTypeVector %67 3\r\n%81 = OpTypePointer Workgroup %10\r\n%82 = OpConstant  %47  29\r\n%88 = OpTypePointer Private %10\r\n%89 = OpConstant  %47  39\r\n%95 = OpTypePointer Function %13\r\n%96 = OpConstant  %47  1\r\n%43 = OpFunction  %13  None %44\r\n%40 = OpFunctionParameter  %21\r\n%41 = OpFunctionParameter  %4\r\n%42 = OpFunctionParameter  %4\r\n%39 = OpLabel\r\n%36 = OpVariable  %37  Function %38\r\n%48 = OpAccessChain  %45  %23 %46\r\n%50 = OpAccessChain  %49  %26 %46\r\n%51 = OpLoad  %18  %29\r\nOpBranch %52\r\n%52 = OpLabel\r\n%53 = OpCompositeConstruct  %13  %9 %11 %11 %12\r\n%54 = OpCompositeConstruct  %13  %11 %9 %11 %12\r\n%55 = OpCompositeConstruct  %22  %53 %54\r\nOpStore %36 %55\r\n%58 = OpAccessChain  %57  %48 %46 %41\r\n%59 = OpLoad  %13  %58\r\n%62 = OpAccessChain  %61  %50 %46 %41\r\n%63 = OpLoad  %13  %62\r\n%64 = OpFAdd  %13  %59 %63\r\n%66 = OpCompositeConstruct  %65  %40 %41\r\n%69 = OpImageQueryLevels  %4  %51\r\n%70 = OpULessThan  %67  %42 %69\r\nOpSelectionMerge %71 None\r\nOpBranchConditional %70 %72 %71\r\n%72 = OpLabel\r\n%73 = OpImageQuerySizeLod  %65  %51 %42\r\n%75 = OpULessThan  %74  %66 %73\r\n%76 = OpAll  %67  %75\r\nOpBranchConditional %76 %77 %71\r\n%77 = OpLabel\r\n%78 = OpImageFetch  %13  %51 %66 Lod %42\r\nOpBranch %71\r\n%71 = OpLabel\r\n%79 = OpPhi  %13  %68 %52 %68 %72 %78 %77\r\n%80 = OpFAdd  %13  %64 %79\r\n%83 = OpExtInst  %47  %1 UMin %41 %82\r\n%84 = OpAccessChain  %81  %31 %83\r\n%85 = OpLoad  %10  %84\r\n%86 = OpCompositeConstruct  %13  %85 %85 %85 %85\r\n%87 = OpFAdd  %13  %80 %86\r\n%90 = OpExtInst  %47  %1 UMin %41 %89\r\n%91 = OpAccessChain  %88  %33 %90\r\n%92 = OpLoad  %10  %91\r\n%93 = OpCompositeConstruct  %13  %92 %92 %92 %92\r\n%94 = OpFAdd  %13  %87 %93\r\n%97 = OpExtInst  %47  %1 UMin %41 %96\r\n%98 = OpAccessChain  %95  %36 %97\r\n%99 = OpLoad  %13  %98\r\n%100 = OpFAdd  %13  %94 %99\r\nOpReturnValue %100\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/quad.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 64\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %27 \"vert_main\" %18 %21 %23 %25\r\nOpEntryPoint Fragment %45 \"frag_main\" %42 %44\r\nOpEntryPoint Fragment %61 \"fs_extra\" %60\r\nOpExecutionMode %45 OriginUpperLeft\r\nOpExecutionMode %61 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpName %3 \"c_scale\"\r\nOpMemberName %10 0 \"uv\"\r\nOpMemberName %10 1 \"position\"\r\nOpName %10 \"VertexOutput\"\r\nOpName %13 \"u_texture\"\r\nOpName %15 \"u_sampler\"\r\nOpName %18 \"pos\"\r\nOpName %21 \"uv\"\r\nOpName %23 \"uv\"\r\nOpName %25 \"position\"\r\nOpName %27 \"vert_main\"\r\nOpName %42 \"uv\"\r\nOpName %45 \"frag_main\"\r\nOpName %61 \"fs_extra\"\r\nOpMemberDecorate %10 0 Offset 0\r\nOpMemberDecorate %10 1 Offset 16\r\nOpDecorate %13 DescriptorSet 0\r\nOpDecorate %13 Binding 0\r\nOpDecorate %15 DescriptorSet 0\r\nOpDecorate %15 Binding 1\r\nOpDecorate %18 Location 0\r\nOpDecorate %21 Location 1\r\nOpDecorate %23 Location 0\r\nOpDecorate %25 BuiltIn Position\r\nOpDecorate %42 Location 0\r\nOpDecorate %44 Location 0\r\nOpDecorate %60 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  1.2\r\n%5 = OpConstant  %4  0.0\r\n%6 = OpConstant  %4  1.0\r\n%7 = OpConstant  %4  0.5\r\n%8 = OpTypeVector %4 2\r\n%9 = OpTypeVector %4 4\r\n%10 = OpTypeStruct %8 %9\r\n%11 = OpTypeImage %4 2D 0 0 0 1 Unknown\r\n%12 = OpTypeSampler\r\n%14 = OpTypePointer UniformConstant %11\r\n%13 = OpVariable  %14  UniformConstant\r\n%16 = OpTypePointer UniformConstant %12\r\n%15 = OpVariable  %16  UniformConstant\r\n%19 = OpTypePointer Input %8\r\n%18 = OpVariable  %19  Input\r\n%21 = OpVariable  %19  Input\r\n%24 = OpTypePointer Output %8\r\n%23 = OpVariable  %24  Output\r\n%26 = OpTypePointer Output %9\r\n%25 = OpVariable  %26  Output\r\n%28 = OpTypeFunction %2\r\n%35 = OpTypePointer Output %4\r\n%37 = OpTypeInt 32 0\r\n%36 = OpConstant  %37  1\r\n%42 = OpVariable  %19  Input\r\n%44 = OpVariable  %26  Output\r\n%49 = OpTypeSampledImage %11\r\n%53 = OpTypeBool\r\n%60 = OpVariable  %26  Output\r\n%27 = OpFunction  %2  None %28\r\n%17 = OpLabel\r\n%20 = OpLoad  %8  %18\r\n%22 = OpLoad  %8  %21\r\nOpBranch %29\r\n%29 = OpLabel\r\n%30 = OpVectorTimesScalar  %8  %20 %3\r\n%31 = OpCompositeConstruct  %9  %30 %5 %6\r\n%32 = OpCompositeConstruct  %10  %22 %31\r\n%33 = OpCompositeExtract  %8  %32 0\r\nOpStore %23 %33\r\n%34 = OpCompositeExtract  %9  %32 1\r\nOpStore %25 %34\r\n%38 = OpAccessChain  %35  %25 %36\r\n%39 = OpLoad  %4  %38\r\n%40 = OpFNegate  %4  %39\r\nOpStore %38 %40\r\nOpReturn\r\nOpFunctionEnd\r\n%45 = OpFunction  %2  None %28\r\n%41 = OpLabel\r\n%43 = OpLoad  %8  %42\r\n%46 = OpLoad  %11  %13\r\n%47 = OpLoad  %12  %15\r\nOpBranch %48\r\n%48 = OpLabel\r\n%50 = OpSampledImage  %49  %46 %47\r\n%51 = OpImageSampleImplicitLod  %9  %50 %43\r\n%52 = OpCompositeExtract  %4  %51 3\r\n%54 = OpFOrdEqual  %53  %52 %5\r\nOpSelectionMerge %55 None\r\nOpBranchConditional %54 %56 %55\r\n%56 = OpLabel\r\nOpKill\r\n%55 = OpLabel\r\n%57 = OpCompositeExtract  %4  %51 3\r\n%58 = OpVectorTimesScalar  %9  %51 %57\r\nOpStore %44 %58\r\nOpReturn\r\nOpFunctionEnd\r\n%61 = OpFunction  %2  None %28\r\n%59 = OpLabel\r\nOpBranch %62\r\n%62 = OpLabel\r\n%63 = OpCompositeConstruct  %9  %5 %7 %5 %7\r\nOpStore %60 %63\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/shadow.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.2\r\n; Generator: rspirv\r\n; Bound: 262\r\nOpCapability Shader\r\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %94 \"vs_main\" %84 %87 %89 %91 %93\r\nOpEntryPoint Fragment %148 \"fs_main\" %139 %142 %145 %147\r\nOpEntryPoint Fragment %212 \"fs_main_without_storage\" %205 %207 %209 %211\r\nOpExecutionMode %148 OriginUpperLeft\r\nOpExecutionMode %212 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpName %11 \"c_max_lights\"\r\nOpMemberName %18 0 \"view_proj\"\r\nOpMemberName %18 1 \"num_lights\"\r\nOpName %18 \"Globals\"\r\nOpMemberName %19 0 \"world\"\r\nOpMemberName %19 1 \"color\"\r\nOpName %19 \"Entity\"\r\nOpMemberName %21 0 \"proj_position\"\r\nOpMemberName %21 1 \"world_normal\"\r\nOpMemberName %21 2 \"world_position\"\r\nOpName %21 \"VertexOutput\"\r\nOpMemberName %24 0 \"proj\"\r\nOpMemberName %24 1 \"pos\"\r\nOpMemberName %24 2 \"color\"\r\nOpName %24 \"Light\"\r\nOpName %30 \"c_ambient\"\r\nOpName %31 \"u_globals\"\r\nOpName %34 \"u_entity\"\r\nOpName %37 \"s_lights\"\r\nOpName %40 \"u_lights\"\r\nOpName %43 \"t_shadow\"\r\nOpName %45 \"sampler_shadow\"\r\nOpName %48 \"light_id\"\r\nOpName %49 \"homogeneous_coords\"\r\nOpName %50 \"fetch_shadow\"\r\nOpName %80 \"out\"\r\nOpName %84 \"position\"\r\nOpName %87 \"normal\"\r\nOpName %89 \"proj_position\"\r\nOpName %91 \"world_normal\"\r\nOpName %93 \"world_position\"\r\nOpName %94 \"vs_main\"\r\nOpName %134 \"color\"\r\nOpName %135 \"i\"\r\nOpName %139 \"proj_position\"\r\nOpName %142 \"world_normal\"\r\nOpName %145 \"world_position\"\r\nOpName %148 \"fs_main\"\r\nOpName %201 \"color\"\r\nOpName %202 \"i\"\r\nOpName %205 \"proj_position\"\r\nOpName %207 \"world_normal\"\r\nOpName %209 \"world_position\"\r\nOpName %212 \"fs_main_without_storage\"\r\nOpMemberDecorate %18 0 Offset 0\r\nOpMemberDecorate %18 0 ColMajor\r\nOpMemberDecorate %18 0 MatrixStride 16\r\nOpMemberDecorate %18 1 Offset 64\r\nOpMemberDecorate %19 0 Offset 0\r\nOpMemberDecorate %19 0 ColMajor\r\nOpMemberDecorate %19 0 MatrixStride 16\r\nOpMemberDecorate %19 1 Offset 64\r\nOpMemberDecorate %21 0 Offset 0\r\nOpMemberDecorate %21 1 Offset 16\r\nOpMemberDecorate %21 2 Offset 32\r\nOpMemberDecorate %24 0 Offset 0\r\nOpMemberDecorate %24 0 ColMajor\r\nOpMemberDecorate %24 0 MatrixStride 16\r\nOpMemberDecorate %24 1 Offset 64\r\nOpMemberDecorate %24 2 Offset 80\r\nOpDecorate %25 ArrayStride 96\r\nOpDecorate %26 ArrayStride 96\r\nOpDecorate %31 DescriptorSet 0\r\nOpDecorate %31 Binding 0\r\nOpDecorate %32 Block\r\nOpMemberDecorate %32 0 Offset 0\r\nOpDecorate %34 DescriptorSet 1\r\nOpDecorate %34 Binding 0\r\nOpDecorate %35 Block\r\nOpMemberDecorate %35 0 Offset 0\r\nOpDecorate %37 NonWritable\r\nOpDecorate %37 DescriptorSet 0\r\nOpDecorate %37 Binding 1\r\nOpDecorate %38 Block\r\nOpMemberDecorate %38 0 Offset 0\r\nOpDecorate %40 DescriptorSet 0\r\nOpDecorate %40 Binding 1\r\nOpDecorate %41 Block\r\nOpMemberDecorate %41 0 Offset 0\r\nOpDecorate %43 DescriptorSet 0\r\nOpDecorate %43 Binding 2\r\nOpDecorate %45 DescriptorSet 0\r\nOpDecorate %45 Binding 3\r\nOpDecorate %84 Location 0\r\nOpDecorate %87 Location 1\r\nOpDecorate %89 BuiltIn Position\r\nOpDecorate %91 Location 0\r\nOpDecorate %93 Location 1\r\nOpDecorate %139 BuiltIn FragCoord\r\nOpDecorate %142 Location 0\r\nOpDecorate %145 Location 1\r\nOpDecorate %147 Location 0\r\nOpDecorate %205 BuiltIn FragCoord\r\nOpDecorate %207 Location 0\r\nOpDecorate %209 Location 1\r\nOpDecorate %211 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  10\r\n%6 = OpTypeFloat 32\r\n%5 = OpConstant  %6  0.0\r\n%7 = OpConstant  %6  1.0\r\n%8 = OpConstant  %6  0.5\r\n%9 = OpConstant  %6  -0.5\r\n%10 = OpConstant  %6  0.05\r\n%12 = OpTypeInt 32 0\r\n%11 = OpConstant  %12  10\r\n%13 = OpConstant  %12  0\r\n%14 = OpConstant  %12  1\r\n%16 = OpTypeVector %6 4\r\n%15 = OpTypeMatrix %16 4\r\n%17 = OpTypeVector %12 4\r\n%18 = OpTypeStruct %15 %17\r\n%19 = OpTypeStruct %15 %16\r\n%20 = OpTypeVector %6 3\r\n%21 = OpTypeStruct %16 %20 %16\r\n%22 = OpTypeVector %4 4\r\n%23 = OpTypeMatrix %20 3\r\n%24 = OpTypeStruct %15 %16 %16\r\n%25 = OpTypeRuntimeArray %24\r\n%26 = OpTypeArray %24 %3\r\n%27 = OpTypeImage %6 2D 1 1 0 1 Unknown\r\n%28 = OpTypeSampler\r\n%29 = OpTypeVector %6 2\r\n%30 = OpConstantComposite  %20  %10 %10 %10\r\n%32 = OpTypeStruct %18\r\n%33 = OpTypePointer Uniform %32\r\n%31 = OpVariable  %33  Uniform\r\n%35 = OpTypeStruct %19\r\n%36 = OpTypePointer Uniform %35\r\n%34 = OpVariable  %36  Uniform\r\n%38 = OpTypeStruct %25\r\n%39 = OpTypePointer StorageBuffer %38\r\n%37 = OpVariable  %39  StorageBuffer\r\n%41 = OpTypeStruct %26\r\n%42 = OpTypePointer Uniform %41\r\n%40 = OpVariable  %42  Uniform\r\n%44 = OpTypePointer UniformConstant %27\r\n%43 = OpVariable  %44  UniformConstant\r\n%46 = OpTypePointer UniformConstant %28\r\n%45 = OpVariable  %46  UniformConstant\r\n%51 = OpTypeFunction %6 %12 %16\r\n%54 = OpTypePointer Uniform %19\r\n%55 = OpTypePointer Uniform %18\r\n%56 = OpTypePointer Uniform %26\r\n%57 = OpTypePointer StorageBuffer %25\r\n%60 = OpTypeBool\r\n%75 = OpTypeSampledImage %27\r\n%81 = OpTypePointer Function %21\r\n%82 = OpConstantNull  %21\r\n%85 = OpTypePointer Input %22\r\n%84 = OpVariable  %85  Input\r\n%87 = OpVariable  %85  Input\r\n%90 = OpTypePointer Output %16\r\n%89 = OpVariable  %90  Output\r\n%92 = OpTypePointer Output %20\r\n%91 = OpVariable  %92  Output\r\n%93 = OpVariable  %90  Output\r\n%95 = OpTypeFunction %2\r\n%99 = OpTypePointer Uniform %15\r\n%106 = OpTypePointer Function %20\r\n%114 = OpTypeVector %4 3\r\n%119 = OpTypePointer Function %16\r\n%120 = OpConstant  %12  2\r\n%128 = OpTypePointer Output %6\r\n%136 = OpTypePointer Function %12\r\n%140 = OpTypePointer Input %16\r\n%139 = OpVariable  %140  Input\r\n%143 = OpTypePointer Input %20\r\n%142 = OpVariable  %143  Input\r\n%145 = OpVariable  %140  Input\r\n%147 = OpVariable  %90  Output\r\n%162 = OpTypePointer Uniform %17\r\n%163 = OpTypePointer Uniform %12\r\n%171 = OpTypePointer StorageBuffer %24\r\n%197 = OpTypePointer Uniform %16\r\n%205 = OpVariable  %140  Input\r\n%207 = OpVariable  %143  Input\r\n%209 = OpVariable  %140  Input\r\n%211 = OpVariable  %90  Output\r\n%233 = OpTypePointer Uniform %24\r\n%50 = OpFunction  %6  None %51\r\n%48 = OpFunctionParameter  %12\r\n%49 = OpFunctionParameter  %16\r\n%47 = OpLabel\r\n%52 = OpLoad  %27  %43\r\n%53 = OpLoad  %28  %45\r\nOpBranch %58\r\n%58 = OpLabel\r\n%59 = OpCompositeExtract  %6  %49 3\r\n%61 = OpFOrdLessThanEqual  %60  %59 %5\r\nOpSelectionMerge %62 None\r\nOpBranchConditional %61 %63 %62\r\n%63 = OpLabel\r\nOpReturnValue %7\r\n%62 = OpLabel\r\n%64 = OpCompositeConstruct  %29  %8 %9\r\n%65 = OpCompositeExtract  %6  %49 3\r\n%66 = OpFDiv  %6  %7 %65\r\n%67 = OpVectorShuffle  %29  %49 %49 0 1\r\n%68 = OpFMul  %29  %67 %64\r\n%69 = OpVectorTimesScalar  %29  %68 %66\r\n%70 = OpCompositeConstruct  %29  %8 %8\r\n%71 = OpFAdd  %29  %69 %70\r\n%72 = OpBitcast  %4  %48\r\n%73 = OpCompositeExtract  %6  %49 2\r\n%74 = OpFMul  %6  %73 %66\r\n%76 = OpConvertUToF  %6  %72\r\n%77 = OpCompositeConstruct  %20  %71 %76\r\n%78 = OpSampledImage  %75  %52 %53\r\n%79 = OpImageSampleDrefExplicitLod  %6  %78 %77 %74 Lod %5\r\nOpReturnValue %79\r\nOpFunctionEnd\r\n%94 = OpFunction  %2  None %95\r\n%83 = OpLabel\r\n%80 = OpVariable  %81  Function %82\r\n%86 = OpLoad  %22  %84\r\n%88 = OpLoad  %22  %87\r\n%96 = OpAccessChain  %55  %31 %13\r\n%97 = OpAccessChain  %54  %34 %13\r\nOpBranch %98\r\n%98 = OpLabel\r\n%100 = OpAccessChain  %99  %97 %13\r\n%101 = OpLoad  %15  %100\r\n%102 = OpAccessChain  %99  %97 %13\r\n%103 = OpLoad  %15  %102\r\n%104 = OpConvertSToF  %16  %86\r\n%105 = OpMatrixTimesVector  %16  %103 %104\r\n%107 = OpCompositeExtract  %16  %101 0\r\n%108 = OpVectorShuffle  %20  %107 %107 0 1 2\r\n%109 = OpCompositeExtract  %16  %101 1\r\n%110 = OpVectorShuffle  %20  %109 %109 0 1 2\r\n%111 = OpCompositeExtract  %16  %101 2\r\n%112 = OpVectorShuffle  %20  %111 %111 0 1 2\r\n%113 = OpCompositeConstruct  %23  %108 %110 %112\r\n%115 = OpVectorShuffle  %114  %88 %88 0 1 2\r\n%116 = OpConvertSToF  %20  %115\r\n%117 = OpMatrixTimesVector  %20  %113 %116\r\n%118 = OpAccessChain  %106  %80 %14\r\nOpStore %118 %117\r\n%121 = OpAccessChain  %119  %80 %120\r\nOpStore %121 %105\r\n%122 = OpAccessChain  %99  %96 %13\r\n%123 = OpLoad  %15  %122\r\n%124 = OpMatrixTimesVector  %16  %123 %105\r\n%125 = OpAccessChain  %119  %80 %13\r\nOpStore %125 %124\r\n%126 = OpLoad  %21  %80\r\n%127 = OpCompositeExtract  %16  %126 0\r\nOpStore %89 %127\r\n%129 = OpAccessChain  %128  %89 %14\r\n%130 = OpLoad  %6  %129\r\n%131 = OpFNegate  %6  %130\r\nOpStore %129 %131\r\n%132 = OpCompositeExtract  %20  %126 1\r\nOpStore %91 %132\r\n%133 = OpCompositeExtract  %16  %126 2\r\nOpStore %93 %133\r\nOpReturn\r\nOpFunctionEnd\r\n%148 = OpFunction  %2  None %95\r\n%137 = OpLabel\r\n%134 = OpVariable  %106  Function %30\r\n%135 = OpVariable  %136  Function %13\r\n%141 = OpLoad  %16  %139\r\n%144 = OpLoad  %20  %142\r\n%146 = OpLoad  %16  %145\r\n%138 = OpCompositeConstruct  %21  %141 %144 %146\r\n%149 = OpAccessChain  %55  %31 %13\r\n%150 = OpAccessChain  %54  %34 %13\r\n%151 = OpAccessChain  %57  %37 %13\r\n%152 = OpLoad  %27  %43\r\n%153 = OpLoad  %28  %45\r\nOpBranch %154\r\n%154 = OpLabel\r\n%155 = OpCompositeExtract  %20  %138 1\r\n%156 = OpExtInst  %20  %1 Normalize %155\r\nOpBranch %157\r\n%157 = OpLabel\r\nOpLoopMerge %158 %160 None\r\nOpBranch %159\r\n%159 = OpLabel\r\n%161 = OpLoad  %12  %135\r\n%164 = OpAccessChain  %163  %149 %14 %13\r\n%165 = OpLoad  %12  %164\r\n%166 = OpExtInst  %12  %1 UMin %165 %11\r\n%167 = OpULessThan  %60  %161 %166\r\nOpSelectionMerge %168 None\r\nOpBranchConditional %167 %168 %169\r\n%169 = OpLabel\r\nOpBranch %158\r\n%168 = OpLabel\r\n%170 = OpLoad  %12  %135\r\n%172 = OpAccessChain  %171  %151 %170\r\n%173 = OpLoad  %24  %172\r\n%174 = OpLoad  %12  %135\r\n%175 = OpCompositeExtract  %15  %173 0\r\n%176 = OpCompositeExtract  %16  %138 2\r\n%177 = OpMatrixTimesVector  %16  %175 %176\r\n%178 = OpFunctionCall  %6  %50 %174 %177\r\n%179 = OpCompositeExtract  %16  %173 1\r\n%180 = OpVectorShuffle  %20  %179 %179 0 1 2\r\n%181 = OpCompositeExtract  %16  %138 2\r\n%182 = OpVectorShuffle  %20  %181 %181 0 1 2\r\n%183 = OpFSub  %20  %180 %182\r\n%184 = OpExtInst  %20  %1 Normalize %183\r\n%185 = OpDot  %6  %156 %184\r\n%186 = OpExtInst  %6  %1 FMax %5 %185\r\n%187 = OpLoad  %20  %134\r\n%188 = OpFMul  %6  %178 %186\r\n%189 = OpCompositeExtract  %16  %173 2\r\n%190 = OpVectorShuffle  %20  %189 %189 0 1 2\r\n%191 = OpVectorTimesScalar  %20  %190 %188\r\n%192 = OpFAdd  %20  %187 %191\r\nOpStore %134 %192\r\nOpBranch %160\r\n%160 = OpLabel\r\n%193 = OpLoad  %12  %135\r\n%194 = OpIAdd  %12  %193 %14\r\nOpStore %135 %194\r\nOpBranch %157\r\n%158 = OpLabel\r\n%195 = OpLoad  %20  %134\r\n%196 = OpCompositeConstruct  %16  %195 %7\r\n%198 = OpAccessChain  %197  %150 %14\r\n%199 = OpLoad  %16  %198\r\n%200 = OpFMul  %16  %196 %199\r\nOpStore %147 %200\r\nOpReturn\r\nOpFunctionEnd\r\n%212 = OpFunction  %2  None %95\r\n%203 = OpLabel\r\n%201 = OpVariable  %106  Function %30\r\n%202 = OpVariable  %136  Function %13\r\n%206 = OpLoad  %16  %205\r\n%208 = OpLoad  %20  %207\r\n%210 = OpLoad  %16  %209\r\n%204 = OpCompositeConstruct  %21  %206 %208 %210\r\n%213 = OpAccessChain  %55  %31 %13\r\n%214 = OpAccessChain  %54  %34 %13\r\n%215 = OpAccessChain  %56  %40 %13\r\n%216 = OpLoad  %27  %43\r\n%217 = OpLoad  %28  %45\r\nOpBranch %218\r\n%218 = OpLabel\r\n%219 = OpCompositeExtract  %20  %204 1\r\n%220 = OpExtInst  %20  %1 Normalize %219\r\nOpBranch %221\r\n%221 = OpLabel\r\nOpLoopMerge %222 %224 None\r\nOpBranch %223\r\n%223 = OpLabel\r\n%225 = OpLoad  %12  %202\r\n%226 = OpAccessChain  %163  %213 %14 %13\r\n%227 = OpLoad  %12  %226\r\n%228 = OpExtInst  %12  %1 UMin %227 %11\r\n%229 = OpULessThan  %60  %225 %228\r\nOpSelectionMerge %230 None\r\nOpBranchConditional %229 %230 %231\r\n%231 = OpLabel\r\nOpBranch %222\r\n%230 = OpLabel\r\n%232 = OpLoad  %12  %202\r\n%234 = OpAccessChain  %233  %215 %232\r\n%235 = OpLoad  %24  %234\r\n%236 = OpLoad  %12  %202\r\n%237 = OpCompositeExtract  %15  %235 0\r\n%238 = OpCompositeExtract  %16  %204 2\r\n%239 = OpMatrixTimesVector  %16  %237 %238\r\n%240 = OpFunctionCall  %6  %50 %236 %239\r\n%241 = OpCompositeExtract  %16  %235 1\r\n%242 = OpVectorShuffle  %20  %241 %241 0 1 2\r\n%243 = OpCompositeExtract  %16  %204 2\r\n%244 = OpVectorShuffle  %20  %243 %243 0 1 2\r\n%245 = OpFSub  %20  %242 %244\r\n%246 = OpExtInst  %20  %1 Normalize %245\r\n%247 = OpDot  %6  %220 %246\r\n%248 = OpExtInst  %6  %1 FMax %5 %247\r\n%249 = OpLoad  %20  %201\r\n%250 = OpFMul  %6  %240 %248\r\n%251 = OpCompositeExtract  %16  %235 2\r\n%252 = OpVectorShuffle  %20  %251 %251 0 1 2\r\n%253 = OpVectorTimesScalar  %20  %252 %250\r\n%254 = OpFAdd  %20  %249 %253\r\nOpStore %201 %254\r\nOpBranch %224\r\n%224 = OpLabel\r\n%255 = OpLoad  %12  %202\r\n%256 = OpIAdd  %12  %255 %14\r\nOpStore %202 %256\r\nOpBranch %221\r\n%222 = OpLabel\r\n%257 = OpLoad  %20  %201\r\n%258 = OpCompositeConstruct  %16  %257 %7\r\n%259 = OpAccessChain  %197  %214 %14\r\n%260 = OpLoad  %16  %259\r\n%261 = OpFMul  %16  %258 %260\r\nOpStore %211 %261\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/skybox.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 98\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Vertex %39 \"vs_main\" %32 %35 %37\r\nOpEntryPoint Fragment %90 \"fs_main\" %83 %86 %89\r\nOpExecutionMode %90 OriginUpperLeft\r\nOpMemberDecorate %12 0 Offset 0\r\nOpMemberDecorate %12 1 Offset 16\r\nOpMemberDecorate %14 0 Offset 0\r\nOpMemberDecorate %14 0 ColMajor\r\nOpMemberDecorate %14 0 MatrixStride 16\r\nOpMemberDecorate %14 1 Offset 64\r\nOpMemberDecorate %14 1 ColMajor\r\nOpMemberDecorate %14 1 MatrixStride 16\r\nOpDecorate %19 DescriptorSet 0\r\nOpDecorate %19 Binding 0\r\nOpDecorate %20 Block\r\nOpMemberDecorate %20 0 Offset 0\r\nOpDecorate %22 DescriptorSet 0\r\nOpDecorate %22 Binding 1\r\nOpDecorate %24 DescriptorSet 0\r\nOpDecorate %24 Binding 2\r\nOpDecorate %32 BuiltIn VertexIndex\r\nOpDecorate %35 BuiltIn Position\r\nOpDecorate %37 Location 0\r\nOpDecorate %83 BuiltIn FragCoord\r\nOpDecorate %86 Location 0\r\nOpDecorate %89 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeInt 32 1\r\n%3 = OpConstant  %4  2\r\n%5 = OpConstant  %4  1\r\n%7 = OpTypeFloat 32\r\n%6 = OpConstant  %7  4.0\r\n%8 = OpConstant  %7  1.0\r\n%9 = OpConstant  %7  0.0\r\n%10 = OpTypeVector %7 4\r\n%11 = OpTypeVector %7 3\r\n%12 = OpTypeStruct %10 %11\r\n%13 = OpTypeMatrix %10 4\r\n%14 = OpTypeStruct %13 %13\r\n%15 = OpTypeInt 32 0\r\n%16 = OpTypeMatrix %11 3\r\n%17 = OpTypeImage %7 Cube 0 0 0 1 Unknown\r\n%18 = OpTypeSampler\r\n%20 = OpTypeStruct %14\r\n%21 = OpTypePointer Uniform %20\r\n%19 = OpVariable  %21  Uniform\r\n%23 = OpTypePointer UniformConstant %17\r\n%22 = OpVariable  %23  UniformConstant\r\n%25 = OpTypePointer UniformConstant %18\r\n%24 = OpVariable  %25  UniformConstant\r\n%27 = OpTypePointer Function %4\r\n%28 = OpConstantNull  %4\r\n%30 = OpConstantNull  %4\r\n%33 = OpTypePointer Input %15\r\n%32 = OpVariable  %33  Input\r\n%36 = OpTypePointer Output %10\r\n%35 = OpVariable  %36  Output\r\n%38 = OpTypePointer Output %11\r\n%37 = OpVariable  %38  Output\r\n%40 = OpTypeFunction %2\r\n%41 = OpTypePointer Uniform %14\r\n%42 = OpConstant  %15  0\r\n%58 = OpTypePointer Uniform %13\r\n%59 = OpTypePointer Uniform %10\r\n%60 = OpConstant  %15  1\r\n%67 = OpConstant  %15  2\r\n%84 = OpTypePointer Input %10\r\n%83 = OpVariable  %84  Input\r\n%87 = OpTypePointer Input %11\r\n%86 = OpVariable  %87  Input\r\n%89 = OpVariable  %36  Output\r\n%95 = OpTypeSampledImage %17\r\n%39 = OpFunction  %2  None %40\r\n%31 = OpLabel\r\n%26 = OpVariable  %27  Function %28\r\n%29 = OpVariable  %27  Function %30\r\n%34 = OpLoad  %15  %32\r\n%43 = OpAccessChain  %41  %19 %42\r\nOpBranch %44\r\n%44 = OpLabel\r\n%45 = OpBitcast  %4  %34\r\n%46 = OpSDiv  %4  %45 %3\r\nOpStore %26 %46\r\n%47 = OpBitcast  %4  %34\r\n%48 = OpBitwiseAnd  %4  %47 %5\r\nOpStore %29 %48\r\n%49 = OpLoad  %4  %26\r\n%50 = OpConvertSToF  %7  %49\r\n%51 = OpFMul  %7  %50 %6\r\n%52 = OpFSub  %7  %51 %8\r\n%53 = OpLoad  %4  %29\r\n%54 = OpConvertSToF  %7  %53\r\n%55 = OpFMul  %7  %54 %6\r\n%56 = OpFSub  %7  %55 %8\r\n%57 = OpCompositeConstruct  %10  %52 %56 %9 %8\r\n%61 = OpAccessChain  %59  %43 %60 %42\r\n%62 = OpLoad  %10  %61\r\n%63 = OpVectorShuffle  %11  %62 %62 0 1 2\r\n%64 = OpAccessChain  %59  %43 %60 %60\r\n%65 = OpLoad  %10  %64\r\n%66 = OpVectorShuffle  %11  %65 %65 0 1 2\r\n%68 = OpAccessChain  %59  %43 %60 %67\r\n%69 = OpLoad  %10  %68\r\n%70 = OpVectorShuffle  %11  %69 %69 0 1 2\r\n%71 = OpCompositeConstruct  %16  %63 %66 %70\r\n%72 = OpTranspose  %16  %71\r\n%73 = OpAccessChain  %58  %43 %42\r\n%74 = OpLoad  %13  %73\r\n%75 = OpMatrixTimesVector  %10  %74 %57\r\n%76 = OpVectorShuffle  %11  %75 %75 0 1 2\r\n%77 = OpMatrixTimesVector  %11  %72 %76\r\n%78 = OpCompositeConstruct  %12  %57 %77\r\n%79 = OpCompositeExtract  %10  %78 0\r\nOpStore %35 %79\r\n%80 = OpCompositeExtract  %11  %78 1\r\nOpStore %37 %80\r\nOpReturn\r\nOpFunctionEnd\r\n%90 = OpFunction  %2  None %40\r\n%81 = OpLabel\r\n%85 = OpLoad  %10  %83\r\n%88 = OpLoad  %11  %86\r\n%82 = OpCompositeConstruct  %12  %85 %88\r\n%91 = OpLoad  %17  %22\r\n%92 = OpLoad  %18  %24\r\nOpBranch %93\r\n%93 = OpLabel\r\n%94 = OpCompositeExtract  %11  %82 1\r\n%96 = OpSampledImage  %95  %91 %92\r\n%97 = OpImageSampleImplicitLod  %10  %96 %94\r\nOpStore %89 %97\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/standard.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.1\r\n; Generator: rspirv\r\n; Bound: 19\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %11 \"derivatives\" %6 %9\r\nOpExecutionMode %11 OriginUpperLeft\r\nOpDecorate %6 BuiltIn FragCoord\r\nOpDecorate %9 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpTypeVector %4 4\r\n%7 = OpTypePointer Input %3\r\n%6 = OpVariable  %7  Input\r\n%10 = OpTypePointer Output %3\r\n%9 = OpVariable  %10  Output\r\n%12 = OpTypeFunction %2\r\n%11 = OpFunction  %2  None %12\r\n%5 = OpLabel\r\n%8 = OpLoad  %3  %6\r\nOpBranch %13\r\n%13 = OpLabel\r\n%14 = OpDPdx  %3  %8\r\n%15 = OpDPdy  %3  %8\r\n%16 = OpFwidth  %3  %8\r\n%17 = OpFAdd  %3  %14 %15\r\n%18 = OpFMul  %3  %17 %16\r\nOpStore %9 %18\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/spv/texture-arg.spvasm",
    "content": "; SPIR-V\r\n; Version: 1.0\r\n; Generator: rspirv\r\n; Bound: 34\r\nOpCapability Shader\r\n%1 = OpExtInstImport \"GLSL.std.450\"\r\nOpMemoryModel Logical GLSL450\r\nOpEntryPoint Fragment %28 \"main\" %26\r\nOpExecutionMode %28 OriginUpperLeft\r\nOpSource GLSL 450\r\nOpName %9 \"Texture\"\r\nOpName %11 \"Sampler\"\r\nOpName %14 \"Passed_Texture\"\r\nOpName %16 \"Passed_Sampler\"\r\nOpName %18 \"test\"\r\nOpName %28 \"main\"\r\nOpDecorate %9 DescriptorSet 0\r\nOpDecorate %9 Binding 0\r\nOpDecorate %11 DescriptorSet 0\r\nOpDecorate %11 Binding 1\r\nOpDecorate %26 Location 0\r\n%2 = OpTypeVoid\r\n%4 = OpTypeFloat 32\r\n%3 = OpConstant  %4  0.0\r\n%5 = OpTypeImage %4 2D 0 0 0 1 Unknown\r\n%6 = OpTypeSampler\r\n%7 = OpTypeVector %4 4\r\n%8 = OpTypeVector %4 2\r\n%10 = OpTypePointer UniformConstant %5\r\n%9 = OpVariable  %10  UniformConstant\r\n%12 = OpTypePointer UniformConstant %6\r\n%11 = OpVariable  %12  UniformConstant\r\n%19 = OpTypeFunction %7 %10 %12\r\n%22 = OpTypeSampledImage %5\r\n%27 = OpTypePointer Output %7\r\n%26 = OpVariable  %27  Output\r\n%29 = OpTypeFunction %2\r\n%18 = OpFunction  %7  None %19\r\n%14 = OpFunctionParameter  %10\r\n%16 = OpFunctionParameter  %12\r\n%13 = OpLabel\r\n%15 = OpLoad  %5  %14\r\n%17 = OpLoad  %6  %16\r\nOpBranch %20\r\n%20 = OpLabel\r\n%21 = OpCompositeConstruct  %8  %3 %3\r\n%23 = OpSampledImage  %22  %15 %17\r\n%24 = OpImageSampleImplicitLod  %7  %23 %21\r\nOpReturnValue %24\r\nOpFunctionEnd\r\n%28 = OpFunction  %2  None %29\r\n%25 = OpLabel\r\n%30 = OpLoad  %5  %9\r\n%31 = OpLoad  %6  %11\r\nOpBranch %32\r\n%32 = OpLabel\r\n%33 = OpFunctionCall  %7  %18 %9 %11\r\nOpStore %26 %33\r\nOpReturn\r\nOpFunctionEnd"
  },
  {
    "path": "lib/naga/tests/out/wgsl/210-bevy-2d-shader-frag.wgsl",
    "content": "struct ColorMaterial_color {\r\n    Color: vec4<f32>,\r\n}\r\n\r\nstruct FragmentOutput {\r\n    @location(0) o_Target: vec4<f32>,\r\n}\r\n\r\nvar<private> v_Uv_1: vec2<f32>;\r\nvar<private> o_Target: vec4<f32>;\r\n@group(1) @binding(0) \r\nvar<uniform> global: ColorMaterial_color;\r\n\r\nfn main_1() {\r\n    var color: vec4<f32>;\r\n\r\n    let _e4 = global.Color;\r\n    color = _e4;\r\n    let _e6 = color;\r\n    o_Target = _e6;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main(@location(0) v_Uv: vec2<f32>) -> FragmentOutput {\r\n    v_Uv_1 = v_Uv;\r\n    main_1();\r\n    let _e9 = o_Target;\r\n    return FragmentOutput(_e9);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/210-bevy-2d-shader-vert.wgsl",
    "content": "struct Camera {\r\n    ViewProj: mat4x4<f32>,\r\n}\r\n\r\nstruct Transform {\r\n    Model: mat4x4<f32>,\r\n}\r\n\r\nstruct Sprite_size {\r\n    size: vec2<f32>,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @location(0) v_Uv: vec2<f32>,\r\n    @builtin(position) member: vec4<f32>,\r\n}\r\n\r\nvar<private> Vertex_Position_1: vec3<f32>;\r\nvar<private> Vertex_Normal_1: vec3<f32>;\r\nvar<private> Vertex_Uv_1: vec2<f32>;\r\nvar<private> v_Uv: vec2<f32>;\r\n@group(0) @binding(0) \r\nvar<uniform> global: Camera;\r\n@group(2) @binding(0) \r\nvar<uniform> global_1: Transform;\r\n@group(2) @binding(1) \r\nvar<uniform> global_2: Sprite_size;\r\nvar<private> gl_Position: vec4<f32>;\r\n\r\nfn main_1() {\r\n    var position: vec3<f32>;\r\n\r\n    let _e10 = Vertex_Uv_1;\r\n    v_Uv = _e10;\r\n    let _e11 = Vertex_Position_1;\r\n    let _e12 = global_2.size;\r\n    position = (_e11 * vec3<f32>(_e12.x, _e12.y, 1.0));\r\n    let _e20 = global.ViewProj;\r\n    let _e21 = global_1.Model;\r\n    let _e23 = position;\r\n    gl_Position = ((_e20 * _e21) * vec4<f32>(_e23.x, _e23.y, _e23.z, 1.0));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) Vertex_Position: vec3<f32>, @location(1) Vertex_Normal: vec3<f32>, @location(2) Vertex_Uv: vec2<f32>) -> VertexOutput {\r\n    Vertex_Position_1 = Vertex_Position;\r\n    Vertex_Normal_1 = Vertex_Normal;\r\n    Vertex_Uv_1 = Vertex_Uv;\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.Model);\r\n    main_1();\r\n    let _e21 = v_Uv;\r\n    let _e23 = gl_Position;\r\n    return VertexOutput(_e21, _e23);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/210-bevy-shader-vert.wgsl",
    "content": "struct Camera {\r\n    ViewProj: mat4x4<f32>,\r\n}\r\n\r\nstruct Transform {\r\n    Model: mat4x4<f32>,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @location(0) v_Position: vec3<f32>,\r\n    @location(1) v_Normal: vec3<f32>,\r\n    @location(2) v_Uv: vec2<f32>,\r\n    @builtin(position) member: vec4<f32>,\r\n}\r\n\r\nvar<private> Vertex_Position_1: vec3<f32>;\r\nvar<private> Vertex_Normal_1: vec3<f32>;\r\nvar<private> Vertex_Uv_1: vec2<f32>;\r\nvar<private> v_Position: vec3<f32>;\r\nvar<private> v_Normal: vec3<f32>;\r\nvar<private> v_Uv: vec2<f32>;\r\n@group(0) @binding(0) \r\nvar<uniform> global: Camera;\r\n@group(2) @binding(0) \r\nvar<uniform> global_1: Transform;\r\nvar<private> gl_Position: vec4<f32>;\r\n\r\nfn main_1() {\r\n    let _e10 = global_1.Model;\r\n    let _e11 = Vertex_Normal_1;\r\n    v_Normal = (_e10 * vec4<f32>(_e11.x, _e11.y, _e11.z, 1.0)).xyz;\r\n    let _e19 = global_1.Model;\r\n    let _e29 = Vertex_Normal_1;\r\n    v_Normal = (mat3x3<f32>(_e19[0].xyz, _e19[1].xyz, _e19[2].xyz) * _e29);\r\n    let _e31 = global_1.Model;\r\n    let _e32 = Vertex_Position_1;\r\n    v_Position = (_e31 * vec4<f32>(_e32.x, _e32.y, _e32.z, 1.0)).xyz;\r\n    let _e40 = Vertex_Uv_1;\r\n    v_Uv = _e40;\r\n    let _e42 = global.ViewProj;\r\n    let _e43 = v_Position;\r\n    gl_Position = (_e42 * vec4<f32>(_e43.x, _e43.y, _e43.z, 1.0));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) Vertex_Position: vec3<f32>, @location(1) Vertex_Normal: vec3<f32>, @location(2) Vertex_Uv: vec2<f32>) -> VertexOutput {\r\n    Vertex_Position_1 = Vertex_Position;\r\n    Vertex_Normal_1 = Vertex_Normal;\r\n    Vertex_Uv_1 = Vertex_Uv;\r\n    _ = (&global.ViewProj);\r\n    main_1();\r\n    let _e23 = v_Position;\r\n    let _e25 = v_Normal;\r\n    let _e27 = v_Uv;\r\n    let _e29 = gl_Position;\r\n    return VertexOutput(_e23, _e25, _e27, _e29);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/246-collatz-comp.wgsl",
    "content": "struct PrimeIndices {\r\n    indices: array<u32>,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<storage, read_write> global: PrimeIndices;\r\nvar<private> gl_GlobalInvocationID: vec3<u32>;\r\n\r\nfn collatz_iterations(n: u32) -> u32 {\r\n    var n_1: u32;\r\n    var i: u32;\r\n\r\n    _ = (&global.indices);\r\n    n_1 = n;\r\n    i = u32(0);\r\n    loop {\r\n        let _e7 = n_1;\r\n        if !((_e7 != u32(1))) {\r\n            break;\r\n        }\r\n        {\r\n            _ = n_1;\r\n            let _e14 = n_1;\r\n            let _e15 = f32(_e14);\r\n            let _e17 = f32(2);\r\n            if ((_e15 - (floor((_e15 / _e17)) * _e17)) == f32(0)) {\r\n                {\r\n                    let _e25 = n_1;\r\n                    n_1 = (_e25 / u32(2));\r\n                }\r\n            } else {\r\n                {\r\n                    let _e30 = n_1;\r\n                    n_1 = ((u32(3) * _e30) + u32(1));\r\n                }\r\n            }\r\n            let _e36 = i;\r\n            i = (_e36 + 1u);\r\n        }\r\n    }\r\n    let _e39 = i;\r\n    return _e39;\r\n}\r\n\r\nfn main_1() {\r\n    var index: u32;\r\n\r\n    let _e3 = gl_GlobalInvocationID;\r\n    index = _e3.x;\r\n    let _e6 = index;\r\n    let _e8 = index;\r\n    _ = global.indices[_e8];\r\n    let _e11 = index;\r\n    let _e13 = global.indices[_e11];\r\n    let _e14 = collatz_iterations(_e13);\r\n    global.indices[_e6] = _e14;\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main(@builtin(global_invocation_id) param: vec3<u32>) {\r\n    gl_GlobalInvocationID = param;\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/277-casting-vert.wgsl",
    "content": "fn main_1() {\r\n    var a: f32;\r\n\r\n    a = f32(1);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/280-matrix-cast-vert.wgsl",
    "content": "fn main_1() {\r\n    var a: mat4x4<f32>;\r\n\r\n    let _e1 = f32(1);\r\n    a = mat4x4<f32>(vec4<f32>(_e1, 0.0, 0.0, 0.0), vec4<f32>(0.0, _e1, 0.0, 0.0), vec4<f32>(0.0, 0.0, _e1, 0.0), vec4<f32>(0.0, 0.0, 0.0, _e1));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/484-preprocessor-if-vert.wgsl",
    "content": "fn main_1() {\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/800-out-of-bounds-panic-vert.wgsl",
    "content": "struct Globals {\r\n    view_matrix: mat4x4<f32>,\r\n}\r\n\r\nstruct VertexPushConstants {\r\n    world_matrix: mat4x4<f32>,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @location(0) frag_color: vec4<f32>,\r\n    @builtin(position) member: vec4<f32>,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<uniform> global: Globals;\r\nvar<push_constant> global_1: VertexPushConstants;\r\nvar<private> position_1: vec2<f32>;\r\nvar<private> color_1: vec4<f32>;\r\nvar<private> frag_color: vec4<f32>;\r\nvar<private> gl_Position: vec4<f32>;\r\n\r\nfn main_1() {\r\n    let _e7 = color_1;\r\n    frag_color = _e7;\r\n    let _e9 = global.view_matrix;\r\n    let _e10 = global_1.world_matrix;\r\n    let _e12 = position_1;\r\n    gl_Position = ((_e9 * _e10) * vec4<f32>(_e12.x, _e12.y, 0.0, 1.0));\r\n    let _e20 = gl_Position;\r\n    let _e22 = gl_Position;\r\n    gl_Position.z = ((_e20.z + _e22.w) / 2.0);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) position: vec2<f32>, @location(1) color: vec4<f32>) -> VertexOutput {\r\n    position_1 = position;\r\n    color_1 = color;\r\n    _ = (&global.view_matrix);\r\n    _ = (&global_1.world_matrix);\r\n    main_1();\r\n    let _e15 = frag_color;\r\n    let _e17 = gl_Position;\r\n    return VertexOutput(_e15, _e17);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/896-push-constant-vert.wgsl",
    "content": "struct PushConstants {\r\n    example: f32,\r\n}\r\n\r\nvar<push_constant> c: PushConstants;\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/900-implicit-conversions-vert.wgsl",
    "content": "fn exact(a: f32) {\r\n    var a_1: f32;\r\n\r\n    a_1 = a;\r\n    return;\r\n}\r\n\r\nfn exact_1(a_2: i32) {\r\n    var a_3: i32;\r\n\r\n    a_3 = a_2;\r\n    return;\r\n}\r\n\r\nfn implicit(a_4: f32) {\r\n    var a_5: f32;\r\n\r\n    a_5 = a_4;\r\n    return;\r\n}\r\n\r\nfn implicit_1(a_6: i32) {\r\n    var a_7: i32;\r\n\r\n    a_7 = a_6;\r\n    return;\r\n}\r\n\r\nfn implicit_dims(v: f32) {\r\n    var v_1: f32;\r\n\r\n    v_1 = v;\r\n    return;\r\n}\r\n\r\nfn implicit_dims_1(v_2: vec2<f32>) {\r\n    var v_3: vec2<f32>;\r\n\r\n    v_3 = v_2;\r\n    return;\r\n}\r\n\r\nfn implicit_dims_2(v_4: vec3<f32>) {\r\n    var v_5: vec3<f32>;\r\n\r\n    v_5 = v_4;\r\n    return;\r\n}\r\n\r\nfn implicit_dims_3(v_6: vec4<f32>) {\r\n    var v_7: vec4<f32>;\r\n\r\n    v_7 = v_6;\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    exact_1(1);\r\n    implicit(f32(1u));\r\n    _ = vec3<i32>(1);\r\n    implicit_dims_2(vec3<f32>(vec3<i32>(1)));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/901-lhs-field-select-vert.wgsl",
    "content": "fn main_1() {\r\n    var a: vec4<f32>;\r\n\r\n    a = vec4<f32>(1.0);\r\n    a.x = 2.0;\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/931-constant-emitting-vert.wgsl",
    "content": "fn function_() -> f32 {\r\n    return 0.0;\r\n}\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/932-for-loop-if-vert.wgsl",
    "content": "fn main_1() {\r\n    var i: i32;\r\n\r\n    i = 0;\r\n    loop {\r\n        let _e2 = i;\r\n        if !((_e2 < 1)) {\r\n            break;\r\n        }\r\n        {\r\n        }\r\n        continuing {\r\n            let _e6 = i;\r\n            i = (_e6 + 1);\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/access.wgsl",
    "content": "struct GlobalConst {\r\n    a: u32,\r\n    b: vec3<u32>,\r\n    c: i32,\r\n}\r\n\r\nstruct AlignedWrapper {\r\n    value: i32,\r\n}\r\n\r\nstruct Bar {\r\n    _matrix: mat4x3<f32>,\r\n    matrix_array: array<mat2x2<f32>,2>,\r\n    atom: atomic<i32>,\r\n    arr: array<vec2<u32>,2>,\r\n    data: array<AlignedWrapper>,\r\n}\r\n\r\nstruct Baz {\r\n    m: mat3x2<f32>,\r\n}\r\n\r\nstruct MatCx2InArray {\r\n    am: array<mat4x2<f32>,2>,\r\n}\r\n\r\nvar<private> global_const: GlobalConst = GlobalConst(0u, vec3<u32>(0u, 0u, 0u), 0);\r\n@group(0) @binding(0) \r\nvar<storage, read_write> bar: Bar;\r\n@group(0) @binding(1) \r\nvar<uniform> baz: Baz;\r\n@group(0) @binding(2) \r\nvar<storage, read_write> qux: vec2<i32>;\r\n@group(0) @binding(3) \r\nvar<uniform> nested_mat_cx2_: MatCx2InArray;\r\nvar<workgroup> val: u32;\r\n\r\nfn test_matrix_within_struct_accesses() {\r\n    var idx: i32 = 1;\r\n    var t: Baz;\r\n\r\n    let _e6 = idx;\r\n    idx = (_e6 - 1);\r\n    _ = baz.m;\r\n    _ = baz.m[0];\r\n    let _e16 = idx;\r\n    _ = baz.m[_e16];\r\n    _ = baz.m[0][1];\r\n    let _e28 = idx;\r\n    _ = baz.m[0][_e28];\r\n    let _e32 = idx;\r\n    _ = baz.m[_e32][1];\r\n    let _e38 = idx;\r\n    let _e40 = idx;\r\n    _ = baz.m[_e38][_e40];\r\n    t = Baz(mat3x2<f32>(vec2<f32>(1.0), vec2<f32>(2.0), vec2<f32>(3.0)));\r\n    let _e52 = idx;\r\n    idx = (_e52 + 1);\r\n    t.m = mat3x2<f32>(vec2<f32>(6.0), vec2<f32>(5.0), vec2<f32>(4.0));\r\n    t.m[0] = vec2<f32>(9.0);\r\n    let _e69 = idx;\r\n    t.m[_e69] = vec2<f32>(90.0);\r\n    t.m[0][1] = 10.0;\r\n    let _e82 = idx;\r\n    t.m[0][_e82] = 20.0;\r\n    let _e86 = idx;\r\n    t.m[_e86][1] = 30.0;\r\n    let _e92 = idx;\r\n    let _e94 = idx;\r\n    t.m[_e92][_e94] = 40.0;\r\n    return;\r\n}\r\n\r\nfn test_matrix_within_array_within_struct_accesses() {\r\n    var idx_1: i32 = 1;\r\n    var t_1: MatCx2InArray;\r\n\r\n    let _e7 = idx_1;\r\n    idx_1 = (_e7 - 1);\r\n    _ = nested_mat_cx2_.am;\r\n    _ = nested_mat_cx2_.am[0];\r\n    _ = nested_mat_cx2_.am[0][0];\r\n    let _e25 = idx_1;\r\n    _ = nested_mat_cx2_.am[0][_e25];\r\n    _ = nested_mat_cx2_.am[0][0][1];\r\n    let _e41 = idx_1;\r\n    _ = nested_mat_cx2_.am[0][0][_e41];\r\n    let _e47 = idx_1;\r\n    _ = nested_mat_cx2_.am[0][_e47][1];\r\n    let _e55 = idx_1;\r\n    let _e57 = idx_1;\r\n    _ = nested_mat_cx2_.am[0][_e55][_e57];\r\n    t_1 = MatCx2InArray(array<mat4x2<f32>,2>(mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0)), mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0))));\r\n    let _e63 = idx_1;\r\n    idx_1 = (_e63 + 1);\r\n    t_1.am = array<mat4x2<f32>,2>(mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0)), mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0)));\r\n    t_1.am[0] = mat4x2<f32>(vec2<f32>(8.0), vec2<f32>(7.0), vec2<f32>(6.0), vec2<f32>(5.0));\r\n    t_1.am[0][0] = vec2<f32>(9.0);\r\n    let _e90 = idx_1;\r\n    t_1.am[0][_e90] = vec2<f32>(90.0);\r\n    t_1.am[0][0][1] = 10.0;\r\n    let _e107 = idx_1;\r\n    t_1.am[0][0][_e107] = 20.0;\r\n    let _e113 = idx_1;\r\n    t_1.am[0][_e113][1] = 30.0;\r\n    let _e121 = idx_1;\r\n    let _e123 = idx_1;\r\n    t_1.am[0][_e121][_e123] = 40.0;\r\n    return;\r\n}\r\n\r\nfn read_from_private(foo_1: ptr<function, f32>) -> f32 {\r\n    let _e6 = (*foo_1);\r\n    return _e6;\r\n}\r\n\r\nfn test_arr_as_arg(a: array<array<f32,10>,5>) -> f32 {\r\n    return a[4][9];\r\n}\r\n\r\nfn assign_through_ptr_fn(p: ptr<workgroup, u32>) {\r\n    (*p) = 42u;\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn foo_vert(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4<f32> {\r\n    var foo: f32 = 0.0;\r\n    var c: array<i32,5>;\r\n\r\n    let baz_1 = foo;\r\n    foo = 1.0;\r\n    test_matrix_within_struct_accesses();\r\n    test_matrix_within_array_within_struct_accesses();\r\n    let _matrix = bar._matrix;\r\n    let arr = bar.arr;\r\n    let b = bar._matrix[3][0];\r\n    let a_1 = bar.data[(arrayLength((&bar.data)) - 2u)].value;\r\n    let c_1 = qux;\r\n    let data_pointer = (&bar.data[0].value);\r\n    let _e32 = read_from_private((&foo));\r\n    c = array<i32,5>(a_1, i32(b), 3, 4, 5);\r\n    c[(vi + 1u)] = 42;\r\n    let value = c[vi];\r\n    let _e46 = test_arr_as_arg(array<array<f32,10>,5>(array<f32,10>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array<f32,10>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array<f32,10>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array<f32,10>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array<f32,10>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)));\r\n    return vec4<f32>((_matrix * vec4<f32>(vec4<i32>(value))), 2.0);\r\n}\r\n\r\n@fragment \r\nfn foo_frag() -> @location(0) vec4<f32> {\r\n    bar._matrix[1][2] = 1.0;\r\n    bar._matrix = mat4x3<f32>(vec3<f32>(0.0), vec3<f32>(1.0), vec3<f32>(2.0), vec3<f32>(3.0));\r\n    bar.arr = array<vec2<u32>,2>(vec2<u32>(0u), vec2<u32>(1u));\r\n    bar.data[1].value = 1;\r\n    qux = vec2<i32>(0, 0);\r\n    return vec4<f32>(0.0);\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn atomics() {\r\n    var tmp: i32;\r\n\r\n    let value_1 = atomicLoad((&bar.atom));\r\n    let _e10 = atomicAdd((&bar.atom), 5);\r\n    tmp = _e10;\r\n    let _e13 = atomicSub((&bar.atom), 5);\r\n    tmp = _e13;\r\n    let _e16 = atomicAnd((&bar.atom), 5);\r\n    tmp = _e16;\r\n    let _e19 = atomicOr((&bar.atom), 5);\r\n    tmp = _e19;\r\n    let _e22 = atomicXor((&bar.atom), 5);\r\n    tmp = _e22;\r\n    let _e25 = atomicMin((&bar.atom), 5);\r\n    tmp = _e25;\r\n    let _e28 = atomicMax((&bar.atom), 5);\r\n    tmp = _e28;\r\n    let _e31 = atomicExchange((&bar.atom), 5);\r\n    tmp = _e31;\r\n    atomicStore((&bar.atom), value_1);\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn assign_through_ptr() {\r\n    assign_through_ptr_fn((&val));\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/bevy-pbr-frag.wgsl",
    "content": "struct PointLight {\r\n    pos: vec4<f32>,\r\n    color: vec4<f32>,\r\n    lightParams: vec4<f32>,\r\n}\r\n\r\nstruct DirectionalLight {\r\n    direction: vec4<f32>,\r\n    color: vec4<f32>,\r\n}\r\n\r\nstruct CameraViewProj {\r\n    ViewProj: mat4x4<f32>,\r\n}\r\n\r\nstruct CameraPosition {\r\n    CameraPos: vec4<f32>,\r\n}\r\n\r\nstruct Lights {\r\n    AmbientColor: vec4<f32>,\r\n    NumLights: vec4<u32>,\r\n    PointLights: array<PointLight,10u>,\r\n    DirectionalLights: array<DirectionalLight,1u>,\r\n}\r\n\r\nstruct StandardMaterial_base_color {\r\n    base_color: vec4<f32>,\r\n}\r\n\r\nstruct StandardMaterial_roughness {\r\n    perceptual_roughness: f32,\r\n}\r\n\r\nstruct StandardMaterial_metallic {\r\n    metallic: f32,\r\n}\r\n\r\nstruct StandardMaterial_reflectance {\r\n    reflectance: f32,\r\n}\r\n\r\nstruct StandardMaterial_emissive {\r\n    emissive: vec4<f32>,\r\n}\r\n\r\nstruct FragmentOutput {\r\n    @location(0) o_Target: vec4<f32>,\r\n}\r\n\r\nvar<private> v_WorldPosition_1: vec3<f32>;\r\nvar<private> v_WorldNormal_1: vec3<f32>;\r\nvar<private> v_Uv_1: vec2<f32>;\r\nvar<private> v_WorldTangent_1: vec4<f32>;\r\nvar<private> o_Target: vec4<f32>;\r\n@group(0) @binding(0) \r\nvar<uniform> global: CameraViewProj;\r\n@group(0) @binding(1) \r\nvar<uniform> global_1: CameraPosition;\r\n@group(1) @binding(0) \r\nvar<uniform> global_2: Lights;\r\n@group(3) @binding(0) \r\nvar<uniform> global_3: StandardMaterial_base_color;\r\n@group(3) @binding(1) \r\nvar StandardMaterial_base_color_texture: texture_2d<f32>;\r\n@group(3) @binding(2) \r\nvar StandardMaterial_base_color_texture_sampler: sampler;\r\n@group(3) @binding(3) \r\nvar<uniform> global_4: StandardMaterial_roughness;\r\n@group(3) @binding(4) \r\nvar<uniform> global_5: StandardMaterial_metallic;\r\n@group(3) @binding(5) \r\nvar StandardMaterial_metallic_roughness_texture: texture_2d<f32>;\r\n@group(3) @binding(6) \r\nvar StandardMaterial_metallic_roughness_texture_sampler: sampler;\r\n@group(3) @binding(7) \r\nvar<uniform> global_6: StandardMaterial_reflectance;\r\n@group(3) @binding(8) \r\nvar StandardMaterial_normal_map: texture_2d<f32>;\r\n@group(3) @binding(9) \r\nvar StandardMaterial_normal_map_sampler: sampler;\r\n@group(3) @binding(10) \r\nvar StandardMaterial_occlusion_texture: texture_2d<f32>;\r\n@group(3) @binding(11) \r\nvar StandardMaterial_occlusion_texture_sampler: sampler;\r\n@group(3) @binding(12) \r\nvar<uniform> global_7: StandardMaterial_emissive;\r\n@group(3) @binding(13) \r\nvar StandardMaterial_emissive_texture: texture_2d<f32>;\r\n@group(3) @binding(14) \r\nvar StandardMaterial_emissive_texture_sampler: sampler;\r\nvar<private> gl_FrontFacing: bool;\r\n\r\nfn pow5_(x: f32) -> f32 {\r\n    var x_1: f32;\r\n    var x2_: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    x_1 = x;\r\n    let _e42 = x_1;\r\n    let _e43 = x_1;\r\n    x2_ = (_e42 * _e43);\r\n    let _e46 = x2_;\r\n    let _e47 = x2_;\r\n    let _e49 = x_1;\r\n    return ((_e46 * _e47) * _e49);\r\n}\r\n\r\nfn getDistanceAttenuation(distanceSquare: f32, inverseRangeSquared: f32) -> f32 {\r\n    var distanceSquare_1: f32;\r\n    var inverseRangeSquared_1: f32;\r\n    var factor: f32;\r\n    var smoothFactor: f32;\r\n    var attenuation: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    distanceSquare_1 = distanceSquare;\r\n    inverseRangeSquared_1 = inverseRangeSquared;\r\n    let _e44 = distanceSquare_1;\r\n    let _e45 = inverseRangeSquared_1;\r\n    factor = (_e44 * _e45);\r\n    let _e49 = factor;\r\n    let _e50 = factor;\r\n    _ = (1.0 - (_e49 * _e50));\r\n    let _e56 = factor;\r\n    let _e57 = factor;\r\n    smoothFactor = clamp((1.0 - (_e56 * _e57)), 0.0, 1.0);\r\n    let _e64 = smoothFactor;\r\n    let _e65 = smoothFactor;\r\n    attenuation = (_e64 * _e65);\r\n    let _e68 = attenuation;\r\n    _ = distanceSquare_1;\r\n    let _e73 = distanceSquare_1;\r\n    return ((_e68 * 1.0) / max(_e73, 0.0010000000474974513));\r\n}\r\n\r\nfn D_GGX(roughness: f32, NoH: f32, h: vec3<f32>) -> f32 {\r\n    var roughness_1: f32;\r\n    var NoH_1: f32;\r\n    var oneMinusNoHSquared: f32;\r\n    var a: f32;\r\n    var k: f32;\r\n    var d: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    roughness_1 = roughness;\r\n    NoH_1 = NoH;\r\n    let _e46 = NoH_1;\r\n    let _e47 = NoH_1;\r\n    oneMinusNoHSquared = (1.0 - (_e46 * _e47));\r\n    let _e51 = NoH_1;\r\n    let _e52 = roughness_1;\r\n    a = (_e51 * _e52);\r\n    let _e55 = roughness_1;\r\n    let _e56 = oneMinusNoHSquared;\r\n    let _e57 = a;\r\n    let _e58 = a;\r\n    k = (_e55 / (_e56 + (_e57 * _e58)));\r\n    let _e63 = k;\r\n    let _e64 = k;\r\n    d = ((_e63 * _e64) * (1.0 / 3.1415927410125732));\r\n    let _e70 = d;\r\n    return _e70;\r\n}\r\n\r\nfn V_SmithGGXCorrelated(roughness_2: f32, NoV: f32, NoL: f32) -> f32 {\r\n    var roughness_3: f32;\r\n    var NoV_1: f32;\r\n    var NoL_1: f32;\r\n    var a2_: f32;\r\n    var lambdaV: f32;\r\n    var lambdaL: f32;\r\n    var v: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    roughness_3 = roughness_2;\r\n    NoV_1 = NoV;\r\n    NoL_1 = NoL;\r\n    let _e46 = roughness_3;\r\n    let _e47 = roughness_3;\r\n    a2_ = (_e46 * _e47);\r\n    let _e50 = NoL_1;\r\n    let _e51 = NoV_1;\r\n    let _e52 = a2_;\r\n    let _e53 = NoV_1;\r\n    let _e56 = NoV_1;\r\n    let _e58 = a2_;\r\n    _ = (((_e51 - (_e52 * _e53)) * _e56) + _e58);\r\n    let _e60 = NoV_1;\r\n    let _e61 = a2_;\r\n    let _e62 = NoV_1;\r\n    let _e65 = NoV_1;\r\n    let _e67 = a2_;\r\n    lambdaV = (_e50 * sqrt((((_e60 - (_e61 * _e62)) * _e65) + _e67)));\r\n    let _e72 = NoV_1;\r\n    let _e73 = NoL_1;\r\n    let _e74 = a2_;\r\n    let _e75 = NoL_1;\r\n    let _e78 = NoL_1;\r\n    let _e80 = a2_;\r\n    _ = (((_e73 - (_e74 * _e75)) * _e78) + _e80);\r\n    let _e82 = NoL_1;\r\n    let _e83 = a2_;\r\n    let _e84 = NoL_1;\r\n    let _e87 = NoL_1;\r\n    let _e89 = a2_;\r\n    lambdaL = (_e72 * sqrt((((_e82 - (_e83 * _e84)) * _e87) + _e89)));\r\n    let _e95 = lambdaV;\r\n    let _e96 = lambdaL;\r\n    v = (0.5 / (_e95 + _e96));\r\n    let _e100 = v;\r\n    return _e100;\r\n}\r\n\r\nfn F_Schlick(f0_: vec3<f32>, f90_: f32, VoH: f32) -> vec3<f32> {\r\n    var f90_1: f32;\r\n    var VoH_1: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    f90_1 = f90_;\r\n    VoH_1 = VoH;\r\n    let _e45 = f90_1;\r\n    let _e49 = VoH_1;\r\n    _ = (1.0 - _e49);\r\n    let _e52 = VoH_1;\r\n    let _e54 = pow5_((1.0 - _e52));\r\n    return (f0_ + ((vec3<f32>(_e45) - f0_) * _e54));\r\n}\r\n\r\nfn F_Schlick_1(f0_1: f32, f90_2: f32, VoH_2: f32) -> f32 {\r\n    var f0_2: f32;\r\n    var f90_3: f32;\r\n    var VoH_3: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    f0_2 = f0_1;\r\n    f90_3 = f90_2;\r\n    VoH_3 = VoH_2;\r\n    let _e46 = f0_2;\r\n    let _e47 = f90_3;\r\n    let _e48 = f0_2;\r\n    let _e51 = VoH_3;\r\n    _ = (1.0 - _e51);\r\n    let _e54 = VoH_3;\r\n    let _e56 = pow5_((1.0 - _e54));\r\n    return (_e46 + ((_e47 - _e48) * _e56));\r\n}\r\n\r\nfn fresnel(f0_3: vec3<f32>, LoH: f32) -> vec3<f32> {\r\n    var f0_4: vec3<f32>;\r\n    var LoH_1: f32;\r\n    var f90_4: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    f0_4 = f0_3;\r\n    LoH_1 = LoH;\r\n    _ = f0_4;\r\n    _ = vec3<f32>((50.0 * 0.33000001311302185));\r\n    let _e49 = f0_4;\r\n    _ = dot(_e49, vec3<f32>((50.0 * 0.33000001311302185)));\r\n    _ = f0_4;\r\n    _ = vec3<f32>((50.0 * 0.33000001311302185));\r\n    let _e62 = f0_4;\r\n    f90_4 = clamp(dot(_e62, vec3<f32>((50.0 * 0.33000001311302185))), 0.0, 1.0);\r\n    _ = f0_4;\r\n    _ = f90_4;\r\n    _ = LoH_1;\r\n    let _e75 = f0_4;\r\n    let _e76 = f90_4;\r\n    let _e77 = LoH_1;\r\n    let _e78 = F_Schlick(_e75, _e76, _e77);\r\n    return _e78;\r\n}\r\n\r\nfn specular(f0_5: vec3<f32>, roughness_4: f32, h_1: vec3<f32>, NoV_2: f32, NoL_2: f32, NoH_2: f32, LoH_2: f32, specularIntensity: f32) -> vec3<f32> {\r\n    var f0_6: vec3<f32>;\r\n    var roughness_5: f32;\r\n    var NoV_3: f32;\r\n    var NoL_3: f32;\r\n    var NoH_3: f32;\r\n    var LoH_3: f32;\r\n    var specularIntensity_1: f32;\r\n    var D: f32;\r\n    var V: f32;\r\n    var F: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    f0_6 = f0_5;\r\n    roughness_5 = roughness_4;\r\n    NoV_3 = NoV_2;\r\n    NoL_3 = NoL_2;\r\n    NoH_3 = NoH_2;\r\n    LoH_3 = LoH_2;\r\n    specularIntensity_1 = specularIntensity;\r\n    _ = roughness_5;\r\n    _ = NoH_3;\r\n    let _e57 = roughness_5;\r\n    let _e58 = NoH_3;\r\n    let _e59 = D_GGX(_e57, _e58, h_1);\r\n    D = _e59;\r\n    _ = roughness_5;\r\n    _ = NoV_3;\r\n    _ = NoL_3;\r\n    let _e64 = roughness_5;\r\n    let _e65 = NoV_3;\r\n    let _e66 = NoL_3;\r\n    let _e67 = V_SmithGGXCorrelated(_e64, _e65, _e66);\r\n    V = _e67;\r\n    _ = f0_6;\r\n    _ = LoH_3;\r\n    let _e71 = f0_6;\r\n    let _e72 = LoH_3;\r\n    let _e73 = fresnel(_e71, _e72);\r\n    F = _e73;\r\n    let _e75 = specularIntensity_1;\r\n    let _e76 = D;\r\n    let _e78 = V;\r\n    let _e80 = F;\r\n    return (((_e75 * _e76) * _e78) * _e80);\r\n}\r\n\r\nfn Fd_Burley(roughness_6: f32, NoV_4: f32, NoL_4: f32, LoH_4: f32) -> f32 {\r\n    var roughness_7: f32;\r\n    var NoV_5: f32;\r\n    var NoL_5: f32;\r\n    var LoH_5: f32;\r\n    var f90_5: f32;\r\n    var lightScatter: f32;\r\n    var viewScatter: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    roughness_7 = roughness_6;\r\n    NoV_5 = NoV_4;\r\n    NoL_5 = NoL_4;\r\n    LoH_5 = LoH_4;\r\n    let _e50 = roughness_7;\r\n    let _e52 = LoH_5;\r\n    let _e54 = LoH_5;\r\n    f90_5 = (0.5 + (((2.0 * _e50) * _e52) * _e54));\r\n    _ = f90_5;\r\n    _ = NoL_5;\r\n    let _e62 = f90_5;\r\n    let _e63 = NoL_5;\r\n    let _e64 = F_Schlick_1(1.0, _e62, _e63);\r\n    lightScatter = _e64;\r\n    _ = f90_5;\r\n    _ = NoV_5;\r\n    let _e70 = f90_5;\r\n    let _e71 = NoV_5;\r\n    let _e72 = F_Schlick_1(1.0, _e70, _e71);\r\n    viewScatter = _e72;\r\n    let _e74 = lightScatter;\r\n    let _e75 = viewScatter;\r\n    return ((_e74 * _e75) * (1.0 / 3.1415927410125732));\r\n}\r\n\r\nfn EnvBRDFApprox(f0_7: vec3<f32>, perceptual_roughness: f32, NoV_6: f32) -> vec3<f32> {\r\n    var f0_8: vec3<f32>;\r\n    var perceptual_roughness_1: f32;\r\n    var NoV_7: f32;\r\n    var c0_: vec4<f32>;\r\n    var c1_: vec4<f32>;\r\n    var r: vec4<f32>;\r\n    var a004_: f32;\r\n    var AB: vec2<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    f0_8 = f0_7;\r\n    perceptual_roughness_1 = perceptual_roughness;\r\n    NoV_7 = NoV_6;\r\n    c0_ = vec4<f32>(-(1.0), -(0.027499999850988388), -(0.5720000267028809), 0.02199999988079071);\r\n    c1_ = vec4<f32>(1.0, 0.042500000447034836, 1.0399999618530273, -(0.03999999910593033));\r\n    let _e62 = perceptual_roughness_1;\r\n    let _e64 = c0_;\r\n    let _e66 = c1_;\r\n    r = ((vec4<f32>(_e62) * _e64) + _e66);\r\n    let _e69 = r;\r\n    let _e71 = r;\r\n    _ = (_e69.x * _e71.x);\r\n    let _e76 = NoV_7;\r\n    _ = (-(9.279999732971191) * _e76);\r\n    let _e80 = NoV_7;\r\n    _ = exp2((-(9.279999732971191) * _e80));\r\n    let _e83 = r;\r\n    let _e85 = r;\r\n    let _e90 = NoV_7;\r\n    _ = (-(9.279999732971191) * _e90);\r\n    let _e94 = NoV_7;\r\n    let _e98 = r;\r\n    let _e101 = r;\r\n    a004_ = ((min((_e83.x * _e85.x), exp2((-(9.279999732971191) * _e94))) * _e98.x) + _e101.y);\r\n    let _e109 = a004_;\r\n    let _e112 = r;\r\n    AB = ((vec2<f32>(-(1.0399999618530273), 1.0399999618530273) * vec2<f32>(_e109)) + _e112.zw);\r\n    let _e116 = f0_8;\r\n    let _e117 = AB;\r\n    let _e121 = AB;\r\n    return ((_e116 * vec3<f32>(_e117.x)) + vec3<f32>(_e121.y));\r\n}\r\n\r\nfn perceptualRoughnessToRoughness(perceptualRoughness: f32) -> f32 {\r\n    var perceptualRoughness_1: f32;\r\n    var clampedPerceptualRoughness: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    perceptualRoughness_1 = perceptualRoughness;\r\n    _ = perceptualRoughness_1;\r\n    let _e45 = perceptualRoughness_1;\r\n    clampedPerceptualRoughness = clamp(_e45, 0.08900000154972076, 1.0);\r\n    let _e50 = clampedPerceptualRoughness;\r\n    let _e51 = clampedPerceptualRoughness;\r\n    return (_e50 * _e51);\r\n}\r\n\r\nfn reinhard(color: vec3<f32>) -> vec3<f32> {\r\n    var color_1: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    color_1 = color;\r\n    let _e42 = color_1;\r\n    let _e45 = color_1;\r\n    return (_e42 / (vec3<f32>(1.0) + _e45));\r\n}\r\n\r\nfn reinhard_extended(color_2: vec3<f32>, max_white: f32) -> vec3<f32> {\r\n    var color_3: vec3<f32>;\r\n    var max_white_1: f32;\r\n    var numerator: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    color_3 = color_2;\r\n    max_white_1 = max_white;\r\n    let _e44 = color_3;\r\n    let _e47 = color_3;\r\n    let _e48 = max_white_1;\r\n    let _e49 = max_white_1;\r\n    numerator = (_e44 * (vec3<f32>(1.0) + (_e47 / vec3<f32>((_e48 * _e49)))));\r\n    let _e56 = numerator;\r\n    let _e59 = color_3;\r\n    return (_e56 / (vec3<f32>(1.0) + _e59));\r\n}\r\n\r\nfn luminance(v_1: vec3<f32>) -> f32 {\r\n    var v_2: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    v_2 = v_1;\r\n    _ = v_2;\r\n    _ = vec3<f32>(0.2125999927520752, 0.7152000069618225, 0.0722000002861023);\r\n    let _e47 = v_2;\r\n    return dot(_e47, vec3<f32>(0.2125999927520752, 0.7152000069618225, 0.0722000002861023));\r\n}\r\n\r\nfn change_luminance(c_in: vec3<f32>, l_out: f32) -> vec3<f32> {\r\n    var c_in_1: vec3<f32>;\r\n    var l_out_1: f32;\r\n    var l_in: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    c_in_1 = c_in;\r\n    l_out_1 = l_out;\r\n    _ = c_in_1;\r\n    let _e45 = c_in_1;\r\n    let _e46 = luminance(_e45);\r\n    l_in = _e46;\r\n    let _e48 = c_in_1;\r\n    let _e49 = l_out_1;\r\n    let _e50 = l_in;\r\n    return (_e48 * (_e49 / _e50));\r\n}\r\n\r\nfn reinhard_luminance(color_4: vec3<f32>) -> vec3<f32> {\r\n    var color_5: vec3<f32>;\r\n    var l_old: f32;\r\n    var l_new: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    color_5 = color_4;\r\n    _ = color_5;\r\n    let _e43 = color_5;\r\n    let _e44 = luminance(_e43);\r\n    l_old = _e44;\r\n    let _e46 = l_old;\r\n    let _e48 = l_old;\r\n    l_new = (_e46 / (1.0 + _e48));\r\n    _ = color_5;\r\n    _ = l_new;\r\n    let _e54 = color_5;\r\n    let _e55 = l_new;\r\n    let _e56 = change_luminance(_e54, _e55);\r\n    return _e56;\r\n}\r\n\r\nfn reinhard_extended_luminance(color_6: vec3<f32>, max_white_l: f32) -> vec3<f32> {\r\n    var color_7: vec3<f32>;\r\n    var max_white_l_1: f32;\r\n    var l_old_1: f32;\r\n    var numerator_1: f32;\r\n    var l_new_1: f32;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    color_7 = color_6;\r\n    max_white_l_1 = max_white_l;\r\n    _ = color_7;\r\n    let _e45 = color_7;\r\n    let _e46 = luminance(_e45);\r\n    l_old_1 = _e46;\r\n    let _e48 = l_old_1;\r\n    let _e50 = l_old_1;\r\n    let _e51 = max_white_l_1;\r\n    let _e52 = max_white_l_1;\r\n    numerator_1 = (_e48 * (1.0 + (_e50 / (_e51 * _e52))));\r\n    let _e58 = numerator_1;\r\n    let _e60 = l_old_1;\r\n    l_new_1 = (_e58 / (1.0 + _e60));\r\n    _ = color_7;\r\n    _ = l_new_1;\r\n    let _e66 = color_7;\r\n    let _e67 = l_new_1;\r\n    let _e68 = change_luminance(_e66, _e67);\r\n    return _e68;\r\n}\r\n\r\nfn point_light(light: PointLight, roughness_8: f32, NdotV: f32, N: vec3<f32>, V_1: vec3<f32>, R: vec3<f32>, F0_: vec3<f32>, diffuseColor: vec3<f32>) -> vec3<f32> {\r\n    var light_1: PointLight;\r\n    var roughness_9: f32;\r\n    var NdotV_1: f32;\r\n    var N_1: vec3<f32>;\r\n    var V_2: vec3<f32>;\r\n    var R_1: vec3<f32>;\r\n    var F0_1: vec3<f32>;\r\n    var diffuseColor_1: vec3<f32>;\r\n    var light_to_frag: vec3<f32>;\r\n    var distance_square: f32;\r\n    var rangeAttenuation: f32;\r\n    var a_1: f32;\r\n    var radius: f32;\r\n    var centerToRay: vec3<f32>;\r\n    var closestPoint: vec3<f32>;\r\n    var LspecLengthInverse: f32;\r\n    var normalizationFactor: f32;\r\n    var specularIntensity_2: f32;\r\n    var L: vec3<f32>;\r\n    var H: vec3<f32>;\r\n    var NoL_6: f32;\r\n    var NoH_4: f32;\r\n    var LoH_6: f32;\r\n    var specular_1: vec3<f32>;\r\n    var diffuse: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    light_1 = light;\r\n    roughness_9 = roughness_8;\r\n    NdotV_1 = NdotV;\r\n    N_1 = N;\r\n    V_2 = V_1;\r\n    R_1 = R;\r\n    F0_1 = F0_;\r\n    diffuseColor_1 = diffuseColor;\r\n    let _e57 = light_1.pos;\r\n    let _e59 = v_WorldPosition_1;\r\n    light_to_frag = (_e57.xyz - _e59.xyz);\r\n    _ = light_to_frag;\r\n    _ = light_to_frag;\r\n    let _e65 = light_to_frag;\r\n    let _e66 = light_to_frag;\r\n    distance_square = dot(_e65, _e66);\r\n    _ = distance_square;\r\n    let _e71 = light_1.lightParams;\r\n    _ = _e71.x;\r\n    let _e73 = distance_square;\r\n    let _e75 = light_1.lightParams;\r\n    let _e77 = getDistanceAttenuation(_e73, _e75.x);\r\n    rangeAttenuation = _e77;\r\n    let _e79 = roughness_9;\r\n    a_1 = _e79;\r\n    let _e82 = light_1.lightParams;\r\n    radius = _e82.y;\r\n    _ = light_to_frag;\r\n    _ = R_1;\r\n    let _e87 = light_to_frag;\r\n    let _e88 = R_1;\r\n    let _e90 = R_1;\r\n    let _e92 = light_to_frag;\r\n    centerToRay = ((dot(_e87, _e88) * _e90) - _e92);\r\n    let _e95 = light_to_frag;\r\n    let _e96 = centerToRay;\r\n    let _e97 = radius;\r\n    _ = centerToRay;\r\n    _ = centerToRay;\r\n    let _e100 = centerToRay;\r\n    let _e101 = centerToRay;\r\n    _ = dot(_e100, _e101);\r\n    _ = centerToRay;\r\n    _ = centerToRay;\r\n    let _e105 = centerToRay;\r\n    let _e106 = centerToRay;\r\n    _ = (_e97 * inverseSqrt(dot(_e105, _e106)));\r\n    let _e112 = radius;\r\n    _ = centerToRay;\r\n    _ = centerToRay;\r\n    let _e115 = centerToRay;\r\n    let _e116 = centerToRay;\r\n    _ = dot(_e115, _e116);\r\n    _ = centerToRay;\r\n    _ = centerToRay;\r\n    let _e120 = centerToRay;\r\n    let _e121 = centerToRay;\r\n    closestPoint = (_e95 + (_e96 * clamp((_e112 * inverseSqrt(dot(_e120, _e121))), 0.0, 1.0)));\r\n    _ = closestPoint;\r\n    _ = closestPoint;\r\n    let _e133 = closestPoint;\r\n    let _e134 = closestPoint;\r\n    _ = dot(_e133, _e134);\r\n    _ = closestPoint;\r\n    _ = closestPoint;\r\n    let _e138 = closestPoint;\r\n    let _e139 = closestPoint;\r\n    LspecLengthInverse = inverseSqrt(dot(_e138, _e139));\r\n    let _e143 = a_1;\r\n    let _e144 = a_1;\r\n    let _e145 = radius;\r\n    let _e148 = LspecLengthInverse;\r\n    _ = (_e144 + ((_e145 * 0.5) * _e148));\r\n    let _e153 = a_1;\r\n    let _e154 = radius;\r\n    let _e157 = LspecLengthInverse;\r\n    normalizationFactor = (_e143 / clamp((_e153 + ((_e154 * 0.5) * _e157)), 0.0, 1.0));\r\n    let _e165 = normalizationFactor;\r\n    let _e166 = normalizationFactor;\r\n    specularIntensity_2 = (_e165 * _e166);\r\n    let _e169 = closestPoint;\r\n    let _e170 = LspecLengthInverse;\r\n    L = (_e169 * _e170);\r\n    let _e173 = L;\r\n    let _e174 = V_2;\r\n    _ = (_e173 + _e174);\r\n    let _e176 = L;\r\n    let _e177 = V_2;\r\n    H = normalize((_e176 + _e177));\r\n    _ = N_1;\r\n    _ = L;\r\n    let _e183 = N_1;\r\n    let _e184 = L;\r\n    _ = dot(_e183, _e184);\r\n    _ = N_1;\r\n    _ = L;\r\n    let _e190 = N_1;\r\n    let _e191 = L;\r\n    NoL_6 = clamp(dot(_e190, _e191), 0.0, 1.0);\r\n    _ = N_1;\r\n    _ = H;\r\n    let _e199 = N_1;\r\n    let _e200 = H;\r\n    _ = dot(_e199, _e200);\r\n    _ = N_1;\r\n    _ = H;\r\n    let _e206 = N_1;\r\n    let _e207 = H;\r\n    NoH_4 = clamp(dot(_e206, _e207), 0.0, 1.0);\r\n    _ = L;\r\n    _ = H;\r\n    let _e215 = L;\r\n    let _e216 = H;\r\n    _ = dot(_e215, _e216);\r\n    _ = L;\r\n    _ = H;\r\n    let _e222 = L;\r\n    let _e223 = H;\r\n    LoH_6 = clamp(dot(_e222, _e223), 0.0, 1.0);\r\n    _ = F0_1;\r\n    _ = roughness_9;\r\n    _ = H;\r\n    _ = NdotV_1;\r\n    _ = NoL_6;\r\n    _ = NoH_4;\r\n    _ = LoH_6;\r\n    _ = specularIntensity_2;\r\n    let _e237 = F0_1;\r\n    let _e238 = roughness_9;\r\n    let _e239 = H;\r\n    let _e240 = NdotV_1;\r\n    let _e241 = NoL_6;\r\n    let _e242 = NoH_4;\r\n    let _e243 = LoH_6;\r\n    let _e244 = specularIntensity_2;\r\n    let _e245 = specular(_e237, _e238, _e239, _e240, _e241, _e242, _e243, _e244);\r\n    specular_1 = _e245;\r\n    _ = light_to_frag;\r\n    let _e248 = light_to_frag;\r\n    L = normalize(_e248);\r\n    let _e250 = L;\r\n    let _e251 = V_2;\r\n    _ = (_e250 + _e251);\r\n    let _e253 = L;\r\n    let _e254 = V_2;\r\n    H = normalize((_e253 + _e254));\r\n    _ = N_1;\r\n    _ = L;\r\n    let _e259 = N_1;\r\n    let _e260 = L;\r\n    _ = dot(_e259, _e260);\r\n    _ = N_1;\r\n    _ = L;\r\n    let _e266 = N_1;\r\n    let _e267 = L;\r\n    NoL_6 = clamp(dot(_e266, _e267), 0.0, 1.0);\r\n    _ = N_1;\r\n    _ = H;\r\n    let _e274 = N_1;\r\n    let _e275 = H;\r\n    _ = dot(_e274, _e275);\r\n    _ = N_1;\r\n    _ = H;\r\n    let _e281 = N_1;\r\n    let _e282 = H;\r\n    NoH_4 = clamp(dot(_e281, _e282), 0.0, 1.0);\r\n    _ = L;\r\n    _ = H;\r\n    let _e289 = L;\r\n    let _e290 = H;\r\n    _ = dot(_e289, _e290);\r\n    _ = L;\r\n    _ = H;\r\n    let _e296 = L;\r\n    let _e297 = H;\r\n    LoH_6 = clamp(dot(_e296, _e297), 0.0, 1.0);\r\n    let _e302 = diffuseColor_1;\r\n    _ = roughness_9;\r\n    _ = NdotV_1;\r\n    _ = NoL_6;\r\n    _ = LoH_6;\r\n    let _e307 = roughness_9;\r\n    let _e308 = NdotV_1;\r\n    let _e309 = NoL_6;\r\n    let _e310 = LoH_6;\r\n    let _e311 = Fd_Burley(_e307, _e308, _e309, _e310);\r\n    diffuse = (_e302 * _e311);\r\n    let _e314 = diffuse;\r\n    let _e315 = specular_1;\r\n    let _e318 = light_1.color;\r\n    let _e321 = rangeAttenuation;\r\n    let _e322 = NoL_6;\r\n    return (((_e314 + _e315) * _e318.xyz) * (_e321 * _e322));\r\n}\r\n\r\nfn dir_light(light_2: DirectionalLight, roughness_10: f32, NdotV_2: f32, normal: vec3<f32>, view: vec3<f32>, R_2: vec3<f32>, F0_2: vec3<f32>, diffuseColor_2: vec3<f32>) -> vec3<f32> {\r\n    var light_3: DirectionalLight;\r\n    var roughness_11: f32;\r\n    var NdotV_3: f32;\r\n    var normal_1: vec3<f32>;\r\n    var view_1: vec3<f32>;\r\n    var R_3: vec3<f32>;\r\n    var F0_3: vec3<f32>;\r\n    var diffuseColor_3: vec3<f32>;\r\n    var incident_light: vec3<f32>;\r\n    var half_vector: vec3<f32>;\r\n    var NoL_7: f32;\r\n    var NoH_5: f32;\r\n    var LoH_7: f32;\r\n    var diffuse_1: vec3<f32>;\r\n    var specularIntensity_3: f32;\r\n    var specular_2: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    light_3 = light_2;\r\n    roughness_11 = roughness_10;\r\n    NdotV_3 = NdotV_2;\r\n    normal_1 = normal;\r\n    view_1 = view;\r\n    R_3 = R_2;\r\n    F0_3 = F0_2;\r\n    diffuseColor_3 = diffuseColor_2;\r\n    let _e57 = light_3.direction;\r\n    incident_light = _e57.xyz;\r\n    let _e60 = incident_light;\r\n    let _e61 = view_1;\r\n    _ = (_e60 + _e61);\r\n    let _e63 = incident_light;\r\n    let _e64 = view_1;\r\n    half_vector = normalize((_e63 + _e64));\r\n    _ = normal_1;\r\n    _ = incident_light;\r\n    let _e70 = normal_1;\r\n    let _e71 = incident_light;\r\n    _ = dot(_e70, _e71);\r\n    _ = normal_1;\r\n    _ = incident_light;\r\n    let _e77 = normal_1;\r\n    let _e78 = incident_light;\r\n    NoL_7 = clamp(dot(_e77, _e78), 0.0, 1.0);\r\n    _ = normal_1;\r\n    _ = half_vector;\r\n    let _e86 = normal_1;\r\n    let _e87 = half_vector;\r\n    _ = dot(_e86, _e87);\r\n    _ = normal_1;\r\n    _ = half_vector;\r\n    let _e93 = normal_1;\r\n    let _e94 = half_vector;\r\n    NoH_5 = clamp(dot(_e93, _e94), 0.0, 1.0);\r\n    _ = incident_light;\r\n    _ = half_vector;\r\n    let _e102 = incident_light;\r\n    let _e103 = half_vector;\r\n    _ = dot(_e102, _e103);\r\n    _ = incident_light;\r\n    _ = half_vector;\r\n    let _e109 = incident_light;\r\n    let _e110 = half_vector;\r\n    LoH_7 = clamp(dot(_e109, _e110), 0.0, 1.0);\r\n    let _e116 = diffuseColor_3;\r\n    _ = roughness_11;\r\n    _ = NdotV_3;\r\n    _ = NoL_7;\r\n    _ = LoH_7;\r\n    let _e121 = roughness_11;\r\n    let _e122 = NdotV_3;\r\n    let _e123 = NoL_7;\r\n    let _e124 = LoH_7;\r\n    let _e125 = Fd_Burley(_e121, _e122, _e123, _e124);\r\n    diffuse_1 = (_e116 * _e125);\r\n    specularIntensity_3 = 1.0;\r\n    _ = F0_3;\r\n    _ = roughness_11;\r\n    _ = half_vector;\r\n    _ = NdotV_3;\r\n    _ = NoL_7;\r\n    _ = NoH_5;\r\n    _ = LoH_7;\r\n    _ = specularIntensity_3;\r\n    let _e138 = F0_3;\r\n    let _e139 = roughness_11;\r\n    let _e140 = half_vector;\r\n    let _e141 = NdotV_3;\r\n    let _e142 = NoL_7;\r\n    let _e143 = NoH_5;\r\n    let _e144 = LoH_7;\r\n    let _e145 = specularIntensity_3;\r\n    let _e146 = specular(_e138, _e139, _e140, _e141, _e142, _e143, _e144, _e145);\r\n    specular_2 = _e146;\r\n    let _e148 = specular_2;\r\n    let _e149 = diffuse_1;\r\n    let _e152 = light_3.color;\r\n    let _e155 = NoL_7;\r\n    return (((_e148 + _e149) * _e152.xyz) * _e155);\r\n}\r\n\r\nfn main_1() {\r\n    var output_color: vec4<f32>;\r\n    var metallic_roughness: vec4<f32>;\r\n    var metallic: f32;\r\n    var perceptual_roughness_2: f32;\r\n    var roughness_12: f32;\r\n    var N_2: vec3<f32>;\r\n    var T: vec3<f32>;\r\n    var B: vec3<f32>;\r\n    var local: vec3<f32>;\r\n    var local_1: vec3<f32>;\r\n    var local_2: vec3<f32>;\r\n    var TBN: mat3x3<f32>;\r\n    var occlusion: f32;\r\n    var emissive: vec4<f32>;\r\n    var V_3: vec3<f32>;\r\n    var NdotV_4: f32;\r\n    var F0_4: vec3<f32>;\r\n    var diffuseColor_4: vec3<f32>;\r\n    var R_4: vec3<f32>;\r\n    var light_accum: vec3<f32>;\r\n    var i: i32;\r\n    var i_1: i32;\r\n    var diffuse_ambient: vec3<f32>;\r\n    var specular_ambient: vec3<f32>;\r\n\r\n    _ = (&global.ViewProj);\r\n    let _e40 = global_3.base_color;\r\n    output_color = _e40;\r\n    let _e42 = output_color;\r\n    _ = v_Uv_1;\r\n    let _e44 = v_Uv_1;\r\n    let _e45 = textureSample(StandardMaterial_base_color_texture, StandardMaterial_base_color_texture_sampler, _e44);\r\n    output_color = (_e42 * _e45);\r\n    _ = v_Uv_1;\r\n    let _e48 = v_Uv_1;\r\n    let _e49 = textureSample(StandardMaterial_metallic_roughness_texture, StandardMaterial_metallic_roughness_texture_sampler, _e48);\r\n    metallic_roughness = _e49;\r\n    let _e51 = global_5.metallic;\r\n    let _e52 = metallic_roughness;\r\n    metallic = (_e51 * _e52.z);\r\n    let _e56 = global_4.perceptual_roughness;\r\n    let _e57 = metallic_roughness;\r\n    perceptual_roughness_2 = (_e56 * _e57.y);\r\n    _ = perceptual_roughness_2;\r\n    let _e62 = perceptual_roughness_2;\r\n    let _e63 = perceptualRoughnessToRoughness(_e62);\r\n    roughness_12 = _e63;\r\n    _ = v_WorldNormal_1;\r\n    let _e66 = v_WorldNormal_1;\r\n    N_2 = normalize(_e66);\r\n    let _e69 = v_WorldTangent_1;\r\n    _ = _e69.xyz;\r\n    let _e71 = v_WorldTangent_1;\r\n    T = normalize(_e71.xyz);\r\n    _ = N_2;\r\n    _ = T;\r\n    let _e77 = N_2;\r\n    let _e78 = T;\r\n    let _e80 = v_WorldTangent_1;\r\n    B = (cross(_e77, _e78) * _e80.w);\r\n    let _e85 = gl_FrontFacing;\r\n    if _e85 {\r\n        let _e86 = N_2;\r\n        local = _e86;\r\n    } else {\r\n        let _e87 = N_2;\r\n        local = -(_e87);\r\n    }\r\n    let _e90 = local;\r\n    N_2 = _e90;\r\n    let _e91 = gl_FrontFacing;\r\n    if _e91 {\r\n        let _e92 = T;\r\n        local_1 = _e92;\r\n    } else {\r\n        let _e93 = T;\r\n        local_1 = -(_e93);\r\n    }\r\n    let _e96 = local_1;\r\n    T = _e96;\r\n    let _e97 = gl_FrontFacing;\r\n    if _e97 {\r\n        let _e98 = B;\r\n        local_2 = _e98;\r\n    } else {\r\n        let _e99 = B;\r\n        local_2 = -(_e99);\r\n    }\r\n    let _e102 = local_2;\r\n    B = _e102;\r\n    let _e103 = T;\r\n    let _e104 = B;\r\n    let _e105 = N_2;\r\n    TBN = mat3x3<f32>(vec3<f32>(_e103.x, _e103.y, _e103.z), vec3<f32>(_e104.x, _e104.y, _e104.z), vec3<f32>(_e105.x, _e105.y, _e105.z));\r\n    let _e120 = TBN;\r\n    _ = v_Uv_1;\r\n    let _e122 = v_Uv_1;\r\n    let _e123 = textureSample(StandardMaterial_normal_map, StandardMaterial_normal_map_sampler, _e122);\r\n    _ = ((_e123.xyz * 2.0) - vec3<f32>(1.0));\r\n    _ = v_Uv_1;\r\n    let _e131 = v_Uv_1;\r\n    let _e132 = textureSample(StandardMaterial_normal_map, StandardMaterial_normal_map_sampler, _e131);\r\n    N_2 = (_e120 * normalize(((_e132.xyz * 2.0) - vec3<f32>(1.0))));\r\n    _ = v_Uv_1;\r\n    let _e142 = v_Uv_1;\r\n    let _e143 = textureSample(StandardMaterial_occlusion_texture, StandardMaterial_occlusion_texture_sampler, _e142);\r\n    occlusion = _e143.x;\r\n    let _e146 = global_7.emissive;\r\n    emissive = _e146;\r\n    let _e148 = emissive;\r\n    _ = _e148.xyz;\r\n    let _e150 = emissive;\r\n    _ = v_Uv_1;\r\n    let _e153 = v_Uv_1;\r\n    let _e154 = textureSample(StandardMaterial_emissive_texture, StandardMaterial_emissive_texture_sampler, _e153);\r\n    let _e156 = (_e150.xyz * _e154.xyz);\r\n    emissive.x = _e156.x;\r\n    emissive.y = _e156.y;\r\n    emissive.z = _e156.z;\r\n    let _e163 = global_1.CameraPos;\r\n    let _e165 = v_WorldPosition_1;\r\n    _ = (_e163.xyz - _e165.xyz);\r\n    let _e168 = global_1.CameraPos;\r\n    let _e170 = v_WorldPosition_1;\r\n    V_3 = normalize((_e168.xyz - _e170.xyz));\r\n    _ = N_2;\r\n    _ = V_3;\r\n    let _e177 = N_2;\r\n    let _e178 = V_3;\r\n    _ = dot(_e177, _e178);\r\n    _ = N_2;\r\n    _ = V_3;\r\n    let _e183 = N_2;\r\n    let _e184 = V_3;\r\n    NdotV_4 = max(dot(_e183, _e184), 0.0010000000474974513);\r\n    let _e190 = global_6.reflectance;\r\n    let _e192 = global_6.reflectance;\r\n    let _e195 = metallic;\r\n    let _e199 = output_color;\r\n    let _e201 = metallic;\r\n    F0_4 = (vec3<f32>((((0.1599999964237213 * _e190) * _e192) * (1.0 - _e195))) + (_e199.xyz * vec3<f32>(_e201)));\r\n    let _e206 = output_color;\r\n    let _e209 = metallic;\r\n    diffuseColor_4 = (_e206.xyz * vec3<f32>((1.0 - _e209)));\r\n    let _e214 = V_3;\r\n    _ = -(_e214);\r\n    _ = N_2;\r\n    let _e217 = V_3;\r\n    let _e219 = N_2;\r\n    R_4 = reflect(-(_e217), _e219);\r\n    light_accum = vec3<f32>(0.0);\r\n    i = 0;\r\n    loop {\r\n        let _e227 = i;\r\n        let _e228 = global_2.NumLights;\r\n        let _e232 = i;\r\n        if !(((_e227 < i32(_e228.x)) && (_e232 < 10))) {\r\n            break;\r\n        }\r\n        {\r\n            let _e239 = light_accum;\r\n            let _e240 = i;\r\n            _ = global_2.PointLights[_e240];\r\n            _ = roughness_12;\r\n            _ = NdotV_4;\r\n            _ = N_2;\r\n            _ = V_3;\r\n            _ = R_4;\r\n            _ = F0_4;\r\n            _ = diffuseColor_4;\r\n            let _e250 = i;\r\n            let _e252 = global_2.PointLights[_e250];\r\n            let _e253 = roughness_12;\r\n            let _e254 = NdotV_4;\r\n            let _e255 = N_2;\r\n            let _e256 = V_3;\r\n            let _e257 = R_4;\r\n            let _e258 = F0_4;\r\n            let _e259 = diffuseColor_4;\r\n            let _e260 = point_light(_e252, _e253, _e254, _e255, _e256, _e257, _e258, _e259);\r\n            light_accum = (_e239 + _e260);\r\n        }\r\n        continuing {\r\n            let _e236 = i;\r\n            i = (_e236 + 1);\r\n        }\r\n    }\r\n    i_1 = 0;\r\n    loop {\r\n        let _e264 = i_1;\r\n        let _e265 = global_2.NumLights;\r\n        let _e269 = i_1;\r\n        if !(((_e264 < i32(_e265.y)) && (_e269 < 1))) {\r\n            break;\r\n        }\r\n        {\r\n            let _e276 = light_accum;\r\n            let _e277 = i_1;\r\n            _ = global_2.DirectionalLights[_e277];\r\n            _ = roughness_12;\r\n            _ = NdotV_4;\r\n            _ = N_2;\r\n            _ = V_3;\r\n            _ = R_4;\r\n            _ = F0_4;\r\n            _ = diffuseColor_4;\r\n            let _e287 = i_1;\r\n            let _e289 = global_2.DirectionalLights[_e287];\r\n            let _e290 = roughness_12;\r\n            let _e291 = NdotV_4;\r\n            let _e292 = N_2;\r\n            let _e293 = V_3;\r\n            let _e294 = R_4;\r\n            let _e295 = F0_4;\r\n            let _e296 = diffuseColor_4;\r\n            let _e297 = dir_light(_e289, _e290, _e291, _e292, _e293, _e294, _e295, _e296);\r\n            light_accum = (_e276 + _e297);\r\n        }\r\n        continuing {\r\n            let _e273 = i_1;\r\n            i_1 = (_e273 + 1);\r\n        }\r\n    }\r\n    _ = diffuseColor_4;\r\n    _ = NdotV_4;\r\n    let _e302 = diffuseColor_4;\r\n    let _e304 = NdotV_4;\r\n    let _e305 = EnvBRDFApprox(_e302, 1.0, _e304);\r\n    diffuse_ambient = _e305;\r\n    _ = F0_4;\r\n    _ = perceptual_roughness_2;\r\n    _ = NdotV_4;\r\n    let _e310 = F0_4;\r\n    let _e311 = perceptual_roughness_2;\r\n    let _e312 = NdotV_4;\r\n    let _e313 = EnvBRDFApprox(_e310, _e311, _e312);\r\n    specular_ambient = _e313;\r\n    let _e315 = output_color;\r\n    _ = _e315.xyz;\r\n    let _e317 = light_accum;\r\n    output_color.x = _e317.x;\r\n    output_color.y = _e317.y;\r\n    output_color.z = _e317.z;\r\n    let _e324 = output_color;\r\n    _ = _e324.xyz;\r\n    let _e326 = output_color;\r\n    let _e328 = diffuse_ambient;\r\n    let _e329 = specular_ambient;\r\n    let _e331 = global_2.AmbientColor;\r\n    let _e334 = occlusion;\r\n    let _e336 = (_e326.xyz + (((_e328 + _e329) * _e331.xyz) * _e334));\r\n    output_color.x = _e336.x;\r\n    output_color.y = _e336.y;\r\n    output_color.z = _e336.z;\r\n    let _e343 = output_color;\r\n    _ = _e343.xyz;\r\n    let _e345 = output_color;\r\n    let _e347 = emissive;\r\n    let _e349 = output_color;\r\n    let _e352 = (_e345.xyz + (_e347.xyz * _e349.w));\r\n    output_color.x = _e352.x;\r\n    output_color.y = _e352.y;\r\n    output_color.z = _e352.z;\r\n    let _e359 = output_color;\r\n    _ = _e359.xyz;\r\n    let _e361 = output_color;\r\n    _ = _e361.xyz;\r\n    let _e363 = output_color;\r\n    let _e365 = reinhard_luminance(_e363.xyz);\r\n    output_color.x = _e365.x;\r\n    output_color.y = _e365.y;\r\n    output_color.z = _e365.z;\r\n    let _e372 = output_color;\r\n    o_Target = _e372;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main(@location(0) v_WorldPosition: vec3<f32>, @location(1) v_WorldNormal: vec3<f32>, @location(2) v_Uv: vec2<f32>, @location(3) v_WorldTangent: vec4<f32>, @builtin(front_facing) param: bool) -> FragmentOutput {\r\n    v_WorldPosition_1 = v_WorldPosition;\r\n    v_WorldNormal_1 = v_WorldNormal;\r\n    v_Uv_1 = v_Uv;\r\n    v_WorldTangent_1 = v_WorldTangent;\r\n    gl_FrontFacing = param;\r\n    _ = (&global.ViewProj);\r\n    _ = (&global_1.CameraPos);\r\n    _ = (&global_2.AmbientColor);\r\n    _ = (&global_2.NumLights);\r\n    _ = (&global_2.PointLights);\r\n    _ = (&global_2.DirectionalLights);\r\n    _ = (&global_3.base_color);\r\n    _ = (&global_4.perceptual_roughness);\r\n    _ = (&global_5.metallic);\r\n    _ = (&global_6.reflectance);\r\n    _ = (&global_7.emissive);\r\n    main_1();\r\n    let _e72 = o_Target;\r\n    return FragmentOutput(_e72);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/bevy-pbr-vert.wgsl",
    "content": "struct CameraViewProj {\r\n    ViewProj: mat4x4<f32>,\r\n}\r\n\r\nstruct Transform {\r\n    Model: mat4x4<f32>,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @location(0) v_WorldPosition: vec3<f32>,\r\n    @location(1) v_WorldNormal: vec3<f32>,\r\n    @location(2) v_Uv: vec2<f32>,\r\n    @location(3) v_WorldTangent: vec4<f32>,\r\n    @builtin(position) member: vec4<f32>,\r\n}\r\n\r\nvar<private> Vertex_Position_1: vec3<f32>;\r\nvar<private> Vertex_Normal_1: vec3<f32>;\r\nvar<private> Vertex_Uv_1: vec2<f32>;\r\nvar<private> Vertex_Tangent_1: vec4<f32>;\r\nvar<private> v_WorldPosition: vec3<f32>;\r\nvar<private> v_WorldNormal: vec3<f32>;\r\nvar<private> v_Uv: vec2<f32>;\r\n@group(0) @binding(0) \r\nvar<uniform> global: CameraViewProj;\r\nvar<private> v_WorldTangent: vec4<f32>;\r\n@group(2) @binding(0) \r\nvar<uniform> global_1: Transform;\r\nvar<private> gl_Position: vec4<f32>;\r\n\r\nfn main_1() {\r\n    var world_position: vec4<f32>;\r\n\r\n    let _e12 = global_1.Model;\r\n    let _e13 = Vertex_Position_1;\r\n    world_position = (_e12 * vec4<f32>(_e13.x, _e13.y, _e13.z, 1.0));\r\n    let _e21 = world_position;\r\n    v_WorldPosition = _e21.xyz;\r\n    let _e23 = global_1.Model;\r\n    let _e33 = Vertex_Normal_1;\r\n    v_WorldNormal = (mat3x3<f32>(_e23[0].xyz, _e23[1].xyz, _e23[2].xyz) * _e33);\r\n    let _e35 = Vertex_Uv_1;\r\n    v_Uv = _e35;\r\n    let _e36 = global_1.Model;\r\n    let _e46 = Vertex_Tangent_1;\r\n    let _e48 = (mat3x3<f32>(_e36[0].xyz, _e36[1].xyz, _e36[2].xyz) * _e46.xyz);\r\n    let _e49 = Vertex_Tangent_1;\r\n    v_WorldTangent = vec4<f32>(_e48.x, _e48.y, _e48.z, _e49.w);\r\n    let _e56 = global.ViewProj;\r\n    let _e57 = world_position;\r\n    gl_Position = (_e56 * _e57);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) Vertex_Position: vec3<f32>, @location(1) Vertex_Normal: vec3<f32>, @location(2) Vertex_Uv: vec2<f32>, @location(3) Vertex_Tangent: vec4<f32>) -> VertexOutput {\r\n    Vertex_Position_1 = Vertex_Position;\r\n    Vertex_Normal_1 = Vertex_Normal;\r\n    Vertex_Uv_1 = Vertex_Uv;\r\n    Vertex_Tangent_1 = Vertex_Tangent;\r\n    _ = (&global.ViewProj);\r\n    main_1();\r\n    let _e29 = v_WorldPosition;\r\n    let _e31 = v_WorldNormal;\r\n    let _e33 = v_Uv;\r\n    let _e35 = v_WorldTangent;\r\n    let _e37 = gl_Position;\r\n    return VertexOutput(_e29, _e31, _e33, _e35, _e37);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/binding-arrays.wgsl",
    "content": "struct UniformIndex {\r\n    index: u32,\r\n}\r\n\r\nstruct FragmentIn {\r\n    @location(0) index: u32,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar texture_array_unbounded: binding_array<texture_2d<f32>>;\r\n@group(0) @binding(1) \r\nvar texture_array_bounded: binding_array<texture_2d<f32>,5>;\r\n@group(0) @binding(2) \r\nvar texture_array_2darray: binding_array<texture_2d_array<f32>,5>;\r\n@group(0) @binding(3) \r\nvar texture_array_multisampled: binding_array<texture_multisampled_2d<f32>,5>;\r\n@group(0) @binding(4) \r\nvar texture_array_depth: binding_array<texture_depth_2d,5>;\r\n@group(0) @binding(5) \r\nvar texture_array_storage: binding_array<texture_storage_2d<rgba32float,write>,5>;\r\n@group(0) @binding(6) \r\nvar samp: binding_array<sampler,5>;\r\n@group(0) @binding(7) \r\nvar samp_comp: binding_array<sampler_comparison,5>;\r\n@group(0) @binding(8) \r\nvar<uniform> uni: UniformIndex;\r\n\r\n@fragment \r\nfn main(fragment_in: FragmentIn) -> @location(0) vec4<f32> {\r\n    var i1_: i32 = 0;\r\n    var i2_: vec2<i32>;\r\n    var v1_: f32 = 0.0;\r\n    var v4_: vec4<f32>;\r\n\r\n    let uniform_index = uni.index;\r\n    let non_uniform_index = fragment_in.index;\r\n    i2_ = vec2<i32>(0);\r\n    v4_ = vec4<f32>(0.0);\r\n    let uv = vec2<f32>(0.0);\r\n    let pix = vec2<i32>(0);\r\n    let _e27 = i2_;\r\n    let _e30 = textureDimensions(texture_array_unbounded[0]);\r\n    i2_ = (_e27 + _e30);\r\n    let _e32 = i2_;\r\n    let _e34 = textureDimensions(texture_array_unbounded[uniform_index]);\r\n    i2_ = (_e32 + _e34);\r\n    let _e36 = i2_;\r\n    let _e38 = textureDimensions(texture_array_unbounded[non_uniform_index]);\r\n    i2_ = (_e36 + _e38);\r\n    let _e40 = v4_;\r\n    let _e45 = textureGather(0, texture_array_bounded[0], samp[0], uv);\r\n    v4_ = (_e40 + _e45);\r\n    let _e47 = v4_;\r\n    let _e50 = textureGather(0, texture_array_bounded[uniform_index], samp[uniform_index], uv);\r\n    v4_ = (_e47 + _e50);\r\n    let _e52 = v4_;\r\n    let _e55 = textureGather(0, texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv);\r\n    v4_ = (_e52 + _e55);\r\n    let _e57 = v4_;\r\n    let _e63 = textureGatherCompare(texture_array_depth[0], samp_comp[0], uv, 0.0);\r\n    v4_ = (_e57 + _e63);\r\n    let _e65 = v4_;\r\n    let _e69 = textureGatherCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0);\r\n    v4_ = (_e65 + _e69);\r\n    let _e71 = v4_;\r\n    let _e75 = textureGatherCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0);\r\n    v4_ = (_e71 + _e75);\r\n    let _e77 = v4_;\r\n    let _e81 = textureLoad(texture_array_unbounded[0], pix, 0);\r\n    v4_ = (_e77 + _e81);\r\n    let _e83 = v4_;\r\n    let _e86 = textureLoad(texture_array_unbounded[uniform_index], pix, 0);\r\n    v4_ = (_e83 + _e86);\r\n    let _e88 = v4_;\r\n    let _e91 = textureLoad(texture_array_unbounded[non_uniform_index], pix, 0);\r\n    v4_ = (_e88 + _e91);\r\n    let _e93 = i1_;\r\n    let _e96 = textureNumLayers(texture_array_2darray[0]);\r\n    i1_ = (_e93 + _e96);\r\n    let _e98 = i1_;\r\n    let _e100 = textureNumLayers(texture_array_2darray[uniform_index]);\r\n    i1_ = (_e98 + _e100);\r\n    let _e102 = i1_;\r\n    let _e104 = textureNumLayers(texture_array_2darray[non_uniform_index]);\r\n    i1_ = (_e102 + _e104);\r\n    let _e106 = i1_;\r\n    let _e109 = textureNumLevels(texture_array_bounded[0]);\r\n    i1_ = (_e106 + _e109);\r\n    let _e111 = i1_;\r\n    let _e113 = textureNumLevels(texture_array_bounded[uniform_index]);\r\n    i1_ = (_e111 + _e113);\r\n    let _e115 = i1_;\r\n    let _e117 = textureNumLevels(texture_array_bounded[non_uniform_index]);\r\n    i1_ = (_e115 + _e117);\r\n    let _e119 = i1_;\r\n    let _e122 = textureNumSamples(texture_array_multisampled[0]);\r\n    i1_ = (_e119 + _e122);\r\n    let _e124 = i1_;\r\n    let _e126 = textureNumSamples(texture_array_multisampled[uniform_index]);\r\n    i1_ = (_e124 + _e126);\r\n    let _e128 = i1_;\r\n    let _e130 = textureNumSamples(texture_array_multisampled[non_uniform_index]);\r\n    i1_ = (_e128 + _e130);\r\n    let _e132 = v4_;\r\n    let _e137 = textureSample(texture_array_bounded[0], samp[0], uv);\r\n    v4_ = (_e132 + _e137);\r\n    let _e139 = v4_;\r\n    let _e142 = textureSample(texture_array_bounded[uniform_index], samp[uniform_index], uv);\r\n    v4_ = (_e139 + _e142);\r\n    let _e144 = v4_;\r\n    let _e147 = textureSample(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv);\r\n    v4_ = (_e144 + _e147);\r\n    let _e149 = v4_;\r\n    let _e155 = textureSampleBias(texture_array_bounded[0], samp[0], uv, 0.0);\r\n    v4_ = (_e149 + _e155);\r\n    let _e157 = v4_;\r\n    let _e161 = textureSampleBias(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0);\r\n    v4_ = (_e157 + _e161);\r\n    let _e163 = v4_;\r\n    let _e167 = textureSampleBias(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0);\r\n    v4_ = (_e163 + _e167);\r\n    let _e169 = v1_;\r\n    let _e175 = textureSampleCompare(texture_array_depth[0], samp_comp[0], uv, 0.0);\r\n    v1_ = (_e169 + _e175);\r\n    let _e177 = v1_;\r\n    let _e181 = textureSampleCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0);\r\n    v1_ = (_e177 + _e181);\r\n    let _e183 = v1_;\r\n    let _e187 = textureSampleCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0);\r\n    v1_ = (_e183 + _e187);\r\n    let _e189 = v1_;\r\n    let _e195 = textureSampleCompareLevel(texture_array_depth[0], samp_comp[0], uv, 0.0);\r\n    v1_ = (_e189 + _e195);\r\n    let _e197 = v1_;\r\n    let _e201 = textureSampleCompareLevel(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0);\r\n    v1_ = (_e197 + _e201);\r\n    let _e203 = v1_;\r\n    let _e207 = textureSampleCompareLevel(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0);\r\n    v1_ = (_e203 + _e207);\r\n    let _e209 = v4_;\r\n    let _e214 = textureSampleGrad(texture_array_bounded[0], samp[0], uv, uv, uv);\r\n    v4_ = (_e209 + _e214);\r\n    let _e216 = v4_;\r\n    let _e219 = textureSampleGrad(texture_array_bounded[uniform_index], samp[uniform_index], uv, uv, uv);\r\n    v4_ = (_e216 + _e219);\r\n    let _e221 = v4_;\r\n    let _e224 = textureSampleGrad(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, uv, uv);\r\n    v4_ = (_e221 + _e224);\r\n    let _e226 = v4_;\r\n    let _e232 = textureSampleLevel(texture_array_bounded[0], samp[0], uv, 0.0);\r\n    v4_ = (_e226 + _e232);\r\n    let _e234 = v4_;\r\n    let _e238 = textureSampleLevel(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0);\r\n    v4_ = (_e234 + _e238);\r\n    let _e240 = v4_;\r\n    let _e244 = textureSampleLevel(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0);\r\n    v4_ = (_e240 + _e244);\r\n    let _e248 = v4_;\r\n    textureStore(texture_array_storage[0], pix, _e248);\r\n    let _e250 = v4_;\r\n    textureStore(texture_array_storage[uniform_index], pix, _e250);\r\n    let _e252 = v4_;\r\n    textureStore(texture_array_storage[non_uniform_index], pix, _e252);\r\n    let _e253 = i2_;\r\n    let _e254 = i1_;\r\n    let v2_ = vec2<f32>((_e253 + vec2<i32>(_e254)));\r\n    let _e258 = v4_;\r\n    let _e265 = v1_;\r\n    return ((_e258 + vec4<f32>(v2_.x, v2_.y, v2_.x, v2_.y)) + vec4<f32>(_e265));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/binop-frag.wgsl",
    "content": "var<private> o_color: vec4<f32>;\r\n\r\nfn testBinOpVecFloat(a: vec4<f32>, b: f32) {\r\n    var a1: vec4<f32>;\r\n    var b1: f32;\r\n    var v: vec4<f32>;\r\n\r\n    a1 = a;\r\n    b1 = b;\r\n    let e5: vec4<f32> = a1;\r\n    v = (e5 * 2.0);\r\n    let e8: vec4<f32> = a1;\r\n    v = (e8 / vec4<f32>(2.0));\r\n    let e12: vec4<f32> = a1;\r\n    v = (e12 + vec4<f32>(2.0));\r\n    let e16: vec4<f32> = a1;\r\n    v = (e16 - vec4<f32>(2.0));\r\n    return;\r\n}\r\n\r\nfn testBinOpFloatVec(a2: vec4<f32>, b2: f32) {\r\n    var a3: vec4<f32>;\r\n    var b3: f32;\r\n    var v1: vec4<f32>;\r\n\r\n    a3 = a2;\r\n    b3 = b2;\r\n    let e5: vec4<f32> = a3;\r\n    let e6: f32 = b3;\r\n    v1 = (e5 * e6);\r\n    let e8: vec4<f32> = a3;\r\n    let e9: f32 = b3;\r\n    v1 = (e8 / vec4<f32>(e9));\r\n    let e12: vec4<f32> = a3;\r\n    let e13: f32 = b3;\r\n    v1 = (e12 + vec4<f32>(e13));\r\n    let e16: vec4<f32> = a3;\r\n    let e17: f32 = b3;\r\n    v1 = (e16 - vec4<f32>(e17));\r\n    return;\r\n}\r\n\r\nfn testBinOpIVecInt(a4: vec4<i32>, b4: i32) {\r\n    var a5: vec4<i32>;\r\n    var b5: i32;\r\n    var v2: vec4<i32>;\r\n\r\n    a5 = a4;\r\n    b5 = b4;\r\n    let e5: vec4<i32> = a5;\r\n    let e6: i32 = b5;\r\n    v2 = (e5 * e6);\r\n    let e8: vec4<i32> = a5;\r\n    let e9: i32 = b5;\r\n    v2 = (e8 / vec4<i32>(e9));\r\n    let e12: vec4<i32> = a5;\r\n    let e13: i32 = b5;\r\n    v2 = (e12 + vec4<i32>(e13));\r\n    let e16: vec4<i32> = a5;\r\n    let e17: i32 = b5;\r\n    v2 = (e16 - vec4<i32>(e17));\r\n    let e20: vec4<i32> = a5;\r\n    let e21: i32 = b5;\r\n    v2 = (e20 & vec4<i32>(e21));\r\n    let e24: vec4<i32> = a5;\r\n    let e25: i32 = b5;\r\n    v2 = (e24 | vec4<i32>(e25));\r\n    let e28: vec4<i32> = a5;\r\n    let e29: i32 = b5;\r\n    v2 = (e28 ^ vec4<i32>(e29));\r\n    let e32: vec4<i32> = a5;\r\n    let e33: i32 = b5;\r\n    v2 = (e32 >> vec4<u32>(u32(e33)));\r\n    let e37: vec4<i32> = a5;\r\n    let e38: i32 = b5;\r\n    v2 = (e37 << vec4<u32>(u32(e38)));\r\n    return;\r\n}\r\n\r\nfn testBinOpIntIVec(a6: i32, b6: vec4<i32>) {\r\n    var a7: i32;\r\n    var b7: vec4<i32>;\r\n    var v3: vec4<i32>;\r\n\r\n    a7 = a6;\r\n    b7 = b6;\r\n    let e5: i32 = a7;\r\n    let e6: vec4<i32> = b7;\r\n    v3 = (e5 * e6);\r\n    let e8: i32 = a7;\r\n    let e9: vec4<i32> = b7;\r\n    v3 = (vec4<i32>(e8) + e9);\r\n    let e12: i32 = a7;\r\n    let e13: vec4<i32> = b7;\r\n    v3 = (vec4<i32>(e12) - e13);\r\n    let e16: i32 = a7;\r\n    let e17: vec4<i32> = b7;\r\n    v3 = (vec4<i32>(e16) & e17);\r\n    let e20: i32 = a7;\r\n    let e21: vec4<i32> = b7;\r\n    v3 = (vec4<i32>(e20) | e21);\r\n    let e24: i32 = a7;\r\n    let e25: vec4<i32> = b7;\r\n    v3 = (vec4<i32>(e24) ^ e25);\r\n    return;\r\n}\r\n\r\nfn testBinOpUVecUint(a8: vec4<u32>, b8: u32) {\r\n    var a9: vec4<u32>;\r\n    var b9: u32;\r\n    var v4: vec4<u32>;\r\n\r\n    a9 = a8;\r\n    b9 = b8;\r\n    let e5: vec4<u32> = a9;\r\n    let e6: u32 = b9;\r\n    v4 = (e5 * e6);\r\n    let e8: vec4<u32> = a9;\r\n    let e9: u32 = b9;\r\n    v4 = (e8 / vec4<u32>(e9));\r\n    let e12: vec4<u32> = a9;\r\n    let e13: u32 = b9;\r\n    v4 = (e12 + vec4<u32>(e13));\r\n    let e16: vec4<u32> = a9;\r\n    let e17: u32 = b9;\r\n    v4 = (e16 - vec4<u32>(e17));\r\n    let e20: vec4<u32> = a9;\r\n    let e21: u32 = b9;\r\n    v4 = (e20 & vec4<u32>(e21));\r\n    let e24: vec4<u32> = a9;\r\n    let e25: u32 = b9;\r\n    v4 = (e24 | vec4<u32>(e25));\r\n    let e28: vec4<u32> = a9;\r\n    let e29: u32 = b9;\r\n    v4 = (e28 ^ vec4<u32>(e29));\r\n    let e32: vec4<u32> = a9;\r\n    let e33: u32 = b9;\r\n    v4 = (e32 >> vec4<u32>(e33));\r\n    let e36: vec4<u32> = a9;\r\n    let e37: u32 = b9;\r\n    v4 = (e36 << vec4<u32>(e37));\r\n    return;\r\n}\r\n\r\nfn testBinOpUintUVec(a10: u32, b10: vec4<u32>) {\r\n    var a11: u32;\r\n    var b11: vec4<u32>;\r\n    var v5: vec4<u32>;\r\n\r\n    a11 = a10;\r\n    b11 = b10;\r\n    let e5: u32 = a11;\r\n    let e6: vec4<u32> = b11;\r\n    v5 = (e5 * e6);\r\n    let e8: u32 = a11;\r\n    let e9: vec4<u32> = b11;\r\n    v5 = (vec4<u32>(e8) + e9);\r\n    let e12: u32 = a11;\r\n    let e13: vec4<u32> = b11;\r\n    v5 = (vec4<u32>(e12) - e13);\r\n    let e16: u32 = a11;\r\n    let e17: vec4<u32> = b11;\r\n    v5 = (vec4<u32>(e16) & e17);\r\n    let e20: u32 = a11;\r\n    let e21: vec4<u32> = b11;\r\n    v5 = (vec4<u32>(e20) | e21);\r\n    let e24: u32 = a11;\r\n    let e25: vec4<u32> = b11;\r\n    v5 = (vec4<u32>(e24) ^ e25);\r\n    return;\r\n}\r\n\r\nfn main1() {\r\n    let e1: vec4<f32> = o_color;\r\n    let e4: vec4<f32> = vec4<f32>(1.0);\r\n    o_color.x = e4.x;\r\n    o_color.y = e4.y;\r\n    o_color.z = e4.z;\r\n    o_color.w = e4.w;\r\n    return;\r\n}\r\n\r\n@fragment\r\nfn main() {\r\n    main1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/bitcast.wgsl",
    "content": "@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    var i2_: vec2<i32>;\r\n    var i3_: vec3<i32>;\r\n    var i4_: vec4<i32>;\r\n    var u2_: vec2<u32>;\r\n    var u3_: vec3<u32>;\r\n    var u4_: vec4<u32>;\r\n    var f2_: vec2<f32>;\r\n    var f3_: vec3<f32>;\r\n    var f4_: vec4<f32>;\r\n\r\n    i2_ = vec2<i32>(0);\r\n    i3_ = vec3<i32>(0);\r\n    i4_ = vec4<i32>(0);\r\n    u2_ = vec2<u32>(0u);\r\n    u3_ = vec3<u32>(0u);\r\n    u4_ = vec4<u32>(0u);\r\n    f2_ = vec2<f32>(0.0);\r\n    f3_ = vec3<f32>(0.0);\r\n    f4_ = vec4<f32>(0.0);\r\n    let _e27 = i2_;\r\n    u2_ = bitcast<vec2<u32>>(_e27);\r\n    let _e29 = i3_;\r\n    u3_ = bitcast<vec3<u32>>(_e29);\r\n    let _e31 = i4_;\r\n    u4_ = bitcast<vec4<u32>>(_e31);\r\n    let _e33 = u2_;\r\n    i2_ = bitcast<vec2<i32>>(_e33);\r\n    let _e35 = u3_;\r\n    i3_ = bitcast<vec3<i32>>(_e35);\r\n    let _e37 = u4_;\r\n    i4_ = bitcast<vec4<i32>>(_e37);\r\n    let _e39 = i2_;\r\n    f2_ = bitcast<vec2<f32>>(_e39);\r\n    let _e41 = i3_;\r\n    f3_ = bitcast<vec3<f32>>(_e41);\r\n    let _e43 = i4_;\r\n    f4_ = bitcast<vec4<f32>>(_e43);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/bits.wgsl",
    "content": "@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    var i: i32 = 0;\r\n    var i2_: vec2<i32>;\r\n    var i3_: vec3<i32>;\r\n    var i4_: vec4<i32>;\r\n    var u: u32 = 0u;\r\n    var u2_: vec2<u32>;\r\n    var u3_: vec3<u32>;\r\n    var u4_: vec4<u32>;\r\n    var f2_: vec2<f32>;\r\n    var f4_: vec4<f32>;\r\n\r\n    i2_ = vec2<i32>(0);\r\n    i3_ = vec3<i32>(0);\r\n    i4_ = vec4<i32>(0);\r\n    u2_ = vec2<u32>(0u);\r\n    u3_ = vec3<u32>(0u);\r\n    u4_ = vec4<u32>(0u);\r\n    f2_ = vec2<f32>(0.0);\r\n    f4_ = vec4<f32>(0.0);\r\n    let _e28 = f4_;\r\n    u = pack4x8snorm(_e28);\r\n    let _e30 = f4_;\r\n    u = pack4x8unorm(_e30);\r\n    let _e32 = f2_;\r\n    u = pack2x16snorm(_e32);\r\n    let _e34 = f2_;\r\n    u = pack2x16unorm(_e34);\r\n    let _e36 = f2_;\r\n    u = pack2x16float(_e36);\r\n    let _e38 = u;\r\n    f4_ = unpack4x8snorm(_e38);\r\n    let _e40 = u;\r\n    f4_ = unpack4x8unorm(_e40);\r\n    let _e42 = u;\r\n    f2_ = unpack2x16snorm(_e42);\r\n    let _e44 = u;\r\n    f2_ = unpack2x16unorm(_e44);\r\n    let _e46 = u;\r\n    f2_ = unpack2x16float(_e46);\r\n    let _e48 = i;\r\n    let _e49 = i;\r\n    i = insertBits(_e48, _e49, 5u, 10u);\r\n    let _e53 = i2_;\r\n    let _e54 = i2_;\r\n    i2_ = insertBits(_e53, _e54, 5u, 10u);\r\n    let _e58 = i3_;\r\n    let _e59 = i3_;\r\n    i3_ = insertBits(_e58, _e59, 5u, 10u);\r\n    let _e63 = i4_;\r\n    let _e64 = i4_;\r\n    i4_ = insertBits(_e63, _e64, 5u, 10u);\r\n    let _e68 = u;\r\n    let _e69 = u;\r\n    u = insertBits(_e68, _e69, 5u, 10u);\r\n    let _e73 = u2_;\r\n    let _e74 = u2_;\r\n    u2_ = insertBits(_e73, _e74, 5u, 10u);\r\n    let _e78 = u3_;\r\n    let _e79 = u3_;\r\n    u3_ = insertBits(_e78, _e79, 5u, 10u);\r\n    let _e83 = u4_;\r\n    let _e84 = u4_;\r\n    u4_ = insertBits(_e83, _e84, 5u, 10u);\r\n    let _e88 = i;\r\n    i = extractBits(_e88, 5u, 10u);\r\n    let _e92 = i2_;\r\n    i2_ = extractBits(_e92, 5u, 10u);\r\n    let _e96 = i3_;\r\n    i3_ = extractBits(_e96, 5u, 10u);\r\n    let _e100 = i4_;\r\n    i4_ = extractBits(_e100, 5u, 10u);\r\n    let _e104 = u;\r\n    u = extractBits(_e104, 5u, 10u);\r\n    let _e108 = u2_;\r\n    u2_ = extractBits(_e108, 5u, 10u);\r\n    let _e112 = u3_;\r\n    u3_ = extractBits(_e112, 5u, 10u);\r\n    let _e116 = u4_;\r\n    u4_ = extractBits(_e116, 5u, 10u);\r\n    let _e120 = i;\r\n    i = firstTrailingBit(_e120);\r\n    let _e122 = u2_;\r\n    u2_ = firstTrailingBit(_e122);\r\n    let _e124 = i3_;\r\n    i3_ = firstLeadingBit(_e124);\r\n    let _e126 = u;\r\n    u = firstLeadingBit(_e126);\r\n    let _e128 = i;\r\n    i = countOneBits(_e128);\r\n    let _e130 = i2_;\r\n    i2_ = countOneBits(_e130);\r\n    let _e132 = i3_;\r\n    i3_ = countOneBits(_e132);\r\n    let _e134 = i4_;\r\n    i4_ = countOneBits(_e134);\r\n    let _e136 = u;\r\n    u = countOneBits(_e136);\r\n    let _e138 = u2_;\r\n    u2_ = countOneBits(_e138);\r\n    let _e140 = u3_;\r\n    u3_ = countOneBits(_e140);\r\n    let _e142 = u4_;\r\n    u4_ = countOneBits(_e142);\r\n    let _e144 = i;\r\n    i = reverseBits(_e144);\r\n    let _e146 = i2_;\r\n    i2_ = reverseBits(_e146);\r\n    let _e148 = i3_;\r\n    i3_ = reverseBits(_e148);\r\n    let _e150 = i4_;\r\n    i4_ = reverseBits(_e150);\r\n    let _e152 = u;\r\n    u = reverseBits(_e152);\r\n    let _e154 = u2_;\r\n    u2_ = reverseBits(_e154);\r\n    let _e156 = u3_;\r\n    u3_ = reverseBits(_e156);\r\n    let _e158 = u4_;\r\n    u4_ = reverseBits(_e158);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/bits_glsl-frag.wgsl",
    "content": "fn main_1() {\r\n    var i: i32;\r\n    var i2_: vec2<i32>;\r\n    var i3_: vec3<i32>;\r\n    var i4_: vec4<i32>;\r\n    var u: u32;\r\n    var u2_: vec2<u32>;\r\n    var u3_: vec3<u32>;\r\n    var u4_: vec4<u32>;\r\n    var f2_: vec2<f32>;\r\n    var f4_: vec4<f32>;\r\n\r\n    i = 0;\r\n    i2_ = vec2<i32>(0);\r\n    i3_ = vec3<i32>(0);\r\n    i4_ = vec4<i32>(0);\r\n    u = u32(0);\r\n    u2_ = vec2<u32>(u32(0));\r\n    u3_ = vec3<u32>(u32(0));\r\n    u4_ = vec4<u32>(u32(0));\r\n    f2_ = vec2<f32>(0.0);\r\n    f4_ = vec4<f32>(0.0);\r\n    _ = f4_;\r\n    let _e33 = f4_;\r\n    u = pack4x8snorm(_e33);\r\n    _ = f4_;\r\n    let _e36 = f4_;\r\n    u = pack4x8unorm(_e36);\r\n    _ = f2_;\r\n    let _e39 = f2_;\r\n    u = pack2x16unorm(_e39);\r\n    _ = f2_;\r\n    let _e42 = f2_;\r\n    u = pack2x16snorm(_e42);\r\n    _ = f2_;\r\n    let _e45 = f2_;\r\n    u = pack2x16float(_e45);\r\n    _ = u;\r\n    let _e48 = u;\r\n    f4_ = unpack4x8snorm(_e48);\r\n    _ = u;\r\n    let _e51 = u;\r\n    f4_ = unpack4x8unorm(_e51);\r\n    _ = u;\r\n    let _e54 = u;\r\n    f2_ = unpack2x16snorm(_e54);\r\n    _ = u;\r\n    let _e57 = u;\r\n    f2_ = unpack2x16unorm(_e57);\r\n    _ = u;\r\n    let _e60 = u;\r\n    f2_ = unpack2x16float(_e60);\r\n    _ = i;\r\n    _ = i;\r\n    let _e66 = i;\r\n    let _e67 = i;\r\n    _ = u32(10);\r\n    i = insertBits(_e66, _e67, u32(5), u32(10));\r\n    _ = i2_;\r\n    _ = i2_;\r\n    let _e77 = i2_;\r\n    let _e78 = i2_;\r\n    _ = u32(10);\r\n    i2_ = insertBits(_e77, _e78, u32(5), u32(10));\r\n    _ = i3_;\r\n    _ = i3_;\r\n    let _e88 = i3_;\r\n    let _e89 = i3_;\r\n    _ = u32(10);\r\n    i3_ = insertBits(_e88, _e89, u32(5), u32(10));\r\n    _ = i4_;\r\n    _ = i4_;\r\n    let _e99 = i4_;\r\n    let _e100 = i4_;\r\n    _ = u32(10);\r\n    i4_ = insertBits(_e99, _e100, u32(5), u32(10));\r\n    _ = u;\r\n    _ = u;\r\n    let _e110 = u;\r\n    let _e111 = u;\r\n    _ = u32(10);\r\n    u = insertBits(_e110, _e111, u32(5), u32(10));\r\n    _ = u2_;\r\n    _ = u2_;\r\n    let _e121 = u2_;\r\n    let _e122 = u2_;\r\n    _ = u32(10);\r\n    u2_ = insertBits(_e121, _e122, u32(5), u32(10));\r\n    _ = u3_;\r\n    _ = u3_;\r\n    let _e132 = u3_;\r\n    let _e133 = u3_;\r\n    _ = u32(10);\r\n    u3_ = insertBits(_e132, _e133, u32(5), u32(10));\r\n    _ = u4_;\r\n    _ = u4_;\r\n    let _e143 = u4_;\r\n    let _e144 = u4_;\r\n    _ = u32(10);\r\n    u4_ = insertBits(_e143, _e144, u32(5), u32(10));\r\n    _ = i;\r\n    let _e153 = i;\r\n    i = extractBits(_e153, u32(5), u32(10));\r\n    _ = i2_;\r\n    let _e162 = i2_;\r\n    i2_ = extractBits(_e162, u32(5), u32(10));\r\n    _ = i3_;\r\n    let _e171 = i3_;\r\n    i3_ = extractBits(_e171, u32(5), u32(10));\r\n    _ = i4_;\r\n    let _e180 = i4_;\r\n    i4_ = extractBits(_e180, u32(5), u32(10));\r\n    _ = u;\r\n    let _e189 = u;\r\n    u = extractBits(_e189, u32(5), u32(10));\r\n    _ = u2_;\r\n    let _e198 = u2_;\r\n    u2_ = extractBits(_e198, u32(5), u32(10));\r\n    _ = u3_;\r\n    let _e207 = u3_;\r\n    u3_ = extractBits(_e207, u32(5), u32(10));\r\n    _ = u4_;\r\n    let _e216 = u4_;\r\n    u4_ = extractBits(_e216, u32(5), u32(10));\r\n    _ = i;\r\n    let _e223 = i;\r\n    i = firstTrailingBit(_e223);\r\n    _ = i2_;\r\n    let _e226 = i2_;\r\n    i2_ = firstTrailingBit(_e226);\r\n    _ = i3_;\r\n    let _e229 = i3_;\r\n    i3_ = firstTrailingBit(_e229);\r\n    _ = i4_;\r\n    let _e232 = i4_;\r\n    i4_ = firstTrailingBit(_e232);\r\n    _ = u;\r\n    let _e235 = u;\r\n    i = i32(firstTrailingBit(_e235));\r\n    _ = u2_;\r\n    let _e239 = u2_;\r\n    i2_ = vec2<i32>(firstTrailingBit(_e239));\r\n    _ = u3_;\r\n    let _e243 = u3_;\r\n    i3_ = vec3<i32>(firstTrailingBit(_e243));\r\n    _ = u4_;\r\n    let _e247 = u4_;\r\n    i4_ = vec4<i32>(firstTrailingBit(_e247));\r\n    _ = i;\r\n    let _e251 = i;\r\n    i = firstLeadingBit(_e251);\r\n    _ = i2_;\r\n    let _e254 = i2_;\r\n    i2_ = firstLeadingBit(_e254);\r\n    _ = i3_;\r\n    let _e257 = i3_;\r\n    i3_ = firstLeadingBit(_e257);\r\n    _ = i4_;\r\n    let _e260 = i4_;\r\n    i4_ = firstLeadingBit(_e260);\r\n    _ = u;\r\n    let _e263 = u;\r\n    i = i32(firstLeadingBit(_e263));\r\n    _ = u2_;\r\n    let _e267 = u2_;\r\n    i2_ = vec2<i32>(firstLeadingBit(_e267));\r\n    _ = u3_;\r\n    let _e271 = u3_;\r\n    i3_ = vec3<i32>(firstLeadingBit(_e271));\r\n    _ = u4_;\r\n    let _e275 = u4_;\r\n    i4_ = vec4<i32>(firstLeadingBit(_e275));\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/boids.wgsl",
    "content": "struct Particle {\r\n    pos: vec2<f32>,\r\n    vel: vec2<f32>,\r\n}\r\n\r\nstruct SimParams {\r\n    deltaT: f32,\r\n    rule1Distance: f32,\r\n    rule2Distance: f32,\r\n    rule3Distance: f32,\r\n    rule1Scale: f32,\r\n    rule2Scale: f32,\r\n    rule3Scale: f32,\r\n}\r\n\r\nstruct Particles {\r\n    particles: array<Particle>,\r\n}\r\n\r\nlet NUM_PARTICLES: u32 = 1500u;\r\n\r\n@group(0) @binding(0) \r\nvar<uniform> params: SimParams;\r\n@group(0) @binding(1) \r\nvar<storage> particlesSrc: Particles;\r\n@group(0) @binding(2) \r\nvar<storage, read_write> particlesDst: Particles;\r\n\r\n@compute @workgroup_size(64, 1, 1) \r\nfn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\r\n    var vPos: vec2<f32>;\r\n    var vVel: vec2<f32>;\r\n    var cMass: vec2<f32>;\r\n    var cVel: vec2<f32>;\r\n    var colVel: vec2<f32>;\r\n    var cMassCount: i32 = 0;\r\n    var cVelCount: i32 = 0;\r\n    var pos: vec2<f32>;\r\n    var vel: vec2<f32>;\r\n    var i: u32 = 0u;\r\n\r\n    let index = global_invocation_id.x;\r\n    if (index >= NUM_PARTICLES) {\r\n        return;\r\n    }\r\n    let _e10 = particlesSrc.particles[index].pos;\r\n    vPos = _e10;\r\n    let _e15 = particlesSrc.particles[index].vel;\r\n    vVel = _e15;\r\n    cMass = vec2<f32>(0.0, 0.0);\r\n    cVel = vec2<f32>(0.0, 0.0);\r\n    colVel = vec2<f32>(0.0, 0.0);\r\n    loop {\r\n        let _e37 = i;\r\n        if (_e37 >= NUM_PARTICLES) {\r\n            break;\r\n        }\r\n        let _e39 = i;\r\n        if (_e39 == index) {\r\n            continue;\r\n        }\r\n        let _e42 = i;\r\n        let _e45 = particlesSrc.particles[_e42].pos;\r\n        pos = _e45;\r\n        let _e47 = i;\r\n        let _e50 = particlesSrc.particles[_e47].vel;\r\n        vel = _e50;\r\n        let _e51 = pos;\r\n        let _e52 = vPos;\r\n        let _e55 = params.rule1Distance;\r\n        if (distance(_e51, _e52) < _e55) {\r\n            let _e57 = cMass;\r\n            let _e58 = pos;\r\n            cMass = (_e57 + _e58);\r\n            let _e60 = cMassCount;\r\n            cMassCount = (_e60 + 1);\r\n        }\r\n        let _e63 = pos;\r\n        let _e64 = vPos;\r\n        let _e67 = params.rule2Distance;\r\n        if (distance(_e63, _e64) < _e67) {\r\n            let _e69 = colVel;\r\n            let _e70 = pos;\r\n            let _e71 = vPos;\r\n            colVel = (_e69 - (_e70 - _e71));\r\n        }\r\n        let _e74 = pos;\r\n        let _e75 = vPos;\r\n        let _e78 = params.rule3Distance;\r\n        if (distance(_e74, _e75) < _e78) {\r\n            let _e80 = cVel;\r\n            let _e81 = vel;\r\n            cVel = (_e80 + _e81);\r\n            let _e83 = cVelCount;\r\n            cVelCount = (_e83 + 1);\r\n        }\r\n        continuing {\r\n            let _e86 = i;\r\n            i = (_e86 + 1u);\r\n        }\r\n    }\r\n    let _e89 = cMassCount;\r\n    if (_e89 > 0) {\r\n        let _e92 = cMass;\r\n        let _e93 = cMassCount;\r\n        let _e97 = vPos;\r\n        cMass = ((_e92 / vec2<f32>(f32(_e93))) - _e97);\r\n    }\r\n    let _e99 = cVelCount;\r\n    if (_e99 > 0) {\r\n        let _e102 = cVel;\r\n        let _e103 = cVelCount;\r\n        cVel = (_e102 / vec2<f32>(f32(_e103)));\r\n    }\r\n    let _e107 = vVel;\r\n    let _e108 = cMass;\r\n    let _e110 = params.rule1Scale;\r\n    let _e113 = colVel;\r\n    let _e115 = params.rule2Scale;\r\n    let _e118 = cVel;\r\n    let _e120 = params.rule3Scale;\r\n    vVel = (((_e107 + (_e108 * _e110)) + (_e113 * _e115)) + (_e118 * _e120));\r\n    let _e123 = vVel;\r\n    let _e125 = vVel;\r\n    vVel = (normalize(_e123) * clamp(length(_e125), 0.0, 0.10000000149011612));\r\n    let _e131 = vPos;\r\n    let _e132 = vVel;\r\n    let _e134 = params.deltaT;\r\n    vPos = (_e131 + (_e132 * _e134));\r\n    let _e138 = vPos.x;\r\n    if (_e138 < -1.0) {\r\n        vPos.x = 1.0;\r\n    }\r\n    let _e144 = vPos.x;\r\n    if (_e144 > 1.0) {\r\n        vPos.x = -1.0;\r\n    }\r\n    let _e150 = vPos.y;\r\n    if (_e150 < -1.0) {\r\n        vPos.y = 1.0;\r\n    }\r\n    let _e156 = vPos.y;\r\n    if (_e156 > 1.0) {\r\n        vPos.y = -1.0;\r\n    }\r\n    let _e164 = vPos;\r\n    particlesDst.particles[index].pos = _e164;\r\n    let _e168 = vVel;\r\n    particlesDst.particles[index].vel = _e168;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/bool-select-frag.wgsl",
    "content": "struct FragmentOutput {\r\n    @location(0) o_color: vec4<f32>,\r\n}\r\n\r\nvar<private> o_color: vec4<f32>;\r\n\r\nfn TevPerCompGT(a: f32, b: f32) -> f32 {\r\n    var a_1: f32;\r\n    var b_1: f32;\r\n\r\n    a_1 = a;\r\n    b_1 = b;\r\n    let _e5 = a_1;\r\n    let _e6 = b_1;\r\n    return select(0.0, 1.0, (_e5 > _e6));\r\n}\r\n\r\nfn TevPerCompGT_1(a_2: vec3<f32>, b_2: vec3<f32>) -> vec3<f32> {\r\n    var a_3: vec3<f32>;\r\n    var b_3: vec3<f32>;\r\n\r\n    a_3 = a_2;\r\n    b_3 = b_2;\r\n    _ = a_3;\r\n    _ = b_3;\r\n    let _e7 = a_3;\r\n    let _e8 = b_3;\r\n    return select(vec3<f32>(0.0), vec3<f32>(1.0), (_e7 > _e8));\r\n}\r\n\r\nfn main_1() {\r\n    let _e1 = o_color;\r\n    _ = _e1.xyz;\r\n    _ = vec3<f32>(3.0);\r\n    _ = vec3<f32>(5.0);\r\n    let _e11 = TevPerCompGT_1(vec3<f32>(3.0), vec3<f32>(5.0));\r\n    o_color.x = _e11.x;\r\n    o_color.y = _e11.y;\r\n    o_color.z = _e11.z;\r\n    let _e23 = TevPerCompGT(3.0, 5.0);\r\n    o_color.w = _e23;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() -> FragmentOutput {\r\n    main_1();\r\n    let _e3 = o_color;\r\n    return FragmentOutput(_e3);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/break-if.wgsl",
    "content": "fn breakIfEmpty() {\r\n    loop {\r\n        continuing {\r\n            break if true;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nfn breakIfEmptyBody(a: bool) {\r\n    var b: bool;\r\n    var c: bool;\r\n\r\n    loop {\r\n        continuing {\r\n            b = a;\r\n            let _e2 = b;\r\n            c = (a != _e2);\r\n            let _e5 = c;\r\n            _ = (a == _e5);\r\n            break if (a == _e5);\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nfn breakIf(a_1: bool) {\r\n    var d: bool;\r\n    var e: bool;\r\n\r\n    loop {\r\n        d = a_1;\r\n        let _e2 = d;\r\n        e = (a_1 != _e2);\r\n        continuing {\r\n            let _e5 = e;\r\n            _ = (a_1 == _e5);\r\n            break if (a_1 == _e5);\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/buffer-frag.wgsl",
    "content": "struct testBufferBlock {\r\n    data: array<u32>,\r\n}\r\n\r\nstruct testBufferWriteOnlyBlock {\r\n    data: array<u32>,\r\n}\r\n\r\nstruct testBufferReadOnlyBlock {\r\n    data: array<u32>,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<storage, read_write> testBuffer: testBufferBlock;\r\n@group(0) @binding(1) \r\nvar<storage, read_write> testBufferWriteOnly: testBufferWriteOnlyBlock;\r\n@group(0) @binding(2) \r\nvar<storage> testBufferReadOnly: testBufferReadOnlyBlock;\r\n\r\nfn main_1() {\r\n    var a: u32;\r\n    var b: u32;\r\n\r\n    _ = (&testBuffer.data);\r\n    _ = (&testBufferWriteOnly.data);\r\n    _ = (&testBufferReadOnly.data);\r\n    let _e12 = testBuffer.data[0];\r\n    a = _e12;\r\n    testBuffer.data[1] = u32(2);\r\n    testBufferWriteOnly.data[1] = u32(2);\r\n    let _e27 = testBufferReadOnly.data[0];\r\n    b = _e27;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    _ = (&testBuffer.data);\r\n    _ = (&testBufferWriteOnly.data);\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/clamp-splat-vert.wgsl",
    "content": "struct VertexOutput {\r\n    @builtin(position) member: vec4<f32>,\r\n}\r\n\r\nvar<private> a_pos_1: vec2<f32>;\r\nvar<private> gl_Position: vec4<f32>;\r\n\r\nfn main_1() {\r\n    _ = a_pos_1;\r\n    let _e5 = a_pos_1;\r\n    let _e10 = clamp(_e5, vec2<f32>(0.0), vec2<f32>(1.0));\r\n    gl_Position = vec4<f32>(_e10.x, _e10.y, 0.0, 1.0);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) a_pos: vec2<f32>) -> VertexOutput {\r\n    a_pos_1 = a_pos;\r\n    main_1();\r\n    let _e5 = gl_Position;\r\n    return VertexOutput(_e5);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/collatz.wgsl",
    "content": "struct PrimeIndices {\r\n    data: array<u32>,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<storage, read_write> v_indices: PrimeIndices;\r\n\r\nfn collatz_iterations(n_base: u32) -> u32 {\r\n    var n: u32;\r\n    var i: u32 = 0u;\r\n\r\n    n = n_base;\r\n    loop {\r\n        let _e5 = n;\r\n        if (_e5 > 1u) {\r\n        } else {\r\n            break;\r\n        }\r\n        let _e8 = n;\r\n        if ((_e8 % 2u) == 0u) {\r\n            let _e13 = n;\r\n            n = (_e13 / 2u);\r\n        } else {\r\n            let _e17 = n;\r\n            n = ((3u * _e17) + 1u);\r\n        }\r\n        let _e21 = i;\r\n        i = (_e21 + 1u);\r\n    }\r\n    let _e24 = i;\r\n    return _e24;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\r\n    let _e8 = v_indices.data[global_id.x];\r\n    let _e9 = collatz_iterations(_e8);\r\n    v_indices.data[global_id.x] = _e9;\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/constant-array-size-vert.wgsl",
    "content": "struct Data {\r\n    vecs: array<vec4<f32>,42u>,\r\n}\r\n\r\n@group(1) @binding(0) \r\nvar<uniform> global: Data;\r\n\r\nfn function_() -> vec4<f32> {\r\n    var sum: vec4<f32>;\r\n    var i: i32;\r\n\r\n    sum = vec4<f32>(f32(0));\r\n    i = 0;\r\n    loop {\r\n        let _e9 = i;\r\n        if !((_e9 < 42)) {\r\n            break;\r\n        }\r\n        {\r\n            let _e15 = sum;\r\n            let _e16 = i;\r\n            let _e18 = global.vecs[_e16];\r\n            sum = (_e15 + _e18);\r\n        }\r\n        continuing {\r\n            let _e12 = i;\r\n            i = (_e12 + 1);\r\n        }\r\n    }\r\n    let _e20 = sum;\r\n    return _e20;\r\n}\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/control-flow.wgsl",
    "content": "fn switch_default_break(i: i32) {\r\n    switch i {\r\n        default: {\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\nfn switch_case_break() {\r\n    switch 0 {\r\n        case 0: {\r\n            break;\r\n        }\r\n        default: {\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nfn loop_switch_continue(x: i32) {\r\n    loop {\r\n        switch x {\r\n            case 1: {\r\n                continue;\r\n            }\r\n            default: {\r\n            }\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\r\n    var pos: i32;\r\n\r\n    storageBarrier();\r\n    workgroupBarrier();\r\n    switch 1 {\r\n        default: {\r\n            pos = 1;\r\n        }\r\n    }\r\n    let _e4 = pos;\r\n    switch _e4 {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n        }\r\n        case 3: {\r\n            pos = 2;\r\n            fallthrough;\r\n        }\r\n        case 4: {\r\n            pos = 3;\r\n            fallthrough;\r\n        }\r\n        default: {\r\n            pos = 4;\r\n        }\r\n    }\r\n    switch 0u {\r\n        case 0u: {\r\n        }\r\n        default: {\r\n        }\r\n    }\r\n    let _e11 = pos;\r\n    switch _e11 {\r\n        case 1: {\r\n            pos = 0;\r\n            break;\r\n        }\r\n        case 2: {\r\n            pos = 1;\r\n            return;\r\n        }\r\n        case 3: {\r\n            pos = 2;\r\n            fallthrough;\r\n        }\r\n        case 4: {\r\n            return;\r\n        }\r\n        default: {\r\n            pos = 3;\r\n            return;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/declarations-vert.wgsl",
    "content": "struct VertexData {\r\n    position: vec2<f32>,\r\n    a: vec2<f32>,\r\n}\r\n\r\nstruct FragmentData {\r\n    position: vec2<f32>,\r\n    a: vec2<f32>,\r\n}\r\n\r\nstruct TestStruct {\r\n    a: f32,\r\n    b: f32,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @location(0) position: vec2<f32>,\r\n    @location(1) a: vec2<f32>,\r\n    @location(2) out_array: vec4<f32>,\r\n    @location(3) out_array_1: vec4<f32>,\r\n}\r\n\r\nvar<private> vert: VertexData;\r\nvar<private> frag: FragmentData;\r\nvar<private> in_array_2: array<vec4<f32>,2u>;\r\nvar<private> out_array: array<vec4<f32>,2u>;\r\nvar<private> array_2d: array<array<f32,2u>,2u>;\r\nvar<private> array_toomanyd: array<array<array<array<array<array<array<f32,2u>,2u>,2u>,2u>,2u>,2u>,2u>;\r\n\r\nfn main_1() {\r\n    var positions: array<vec3<f32>,2u>;\r\n    var strct: TestStruct;\r\n    var from_input_array: vec4<f32>;\r\n    var a_1: f32;\r\n    var b: f32;\r\n\r\n    _ = (&vert.position);\r\n    _ = (&vert.a);\r\n    _ = (&frag.position);\r\n    _ = (&frag.a);\r\n    positions = array<vec3<f32>,2u>(vec3<f32>(-(1.0), 1.0, 0.0), vec3<f32>(-(1.0), -(1.0), 0.0));\r\n    strct = TestStruct(f32(1), f32(2));\r\n    let _e35 = in_array_2[1];\r\n    from_input_array = _e35;\r\n    let _e41 = array_2d[0][0];\r\n    a_1 = _e41;\r\n    let _e57 = array_toomanyd[0][0][0][0][0][0][0];\r\n    b = _e57;\r\n    out_array[0] = vec4<f32>(2.0);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) position: vec2<f32>, @location(1) a: vec2<f32>, @location(2) in_array: vec4<f32>, @location(3) in_array_1: vec4<f32>) -> VertexOutput {\r\n    vert.position = position;\r\n    vert.a = a;\r\n    in_array_2[0] = in_array;\r\n    in_array_2[1] = in_array_1;\r\n    _ = (&vert.position);\r\n    _ = (&vert.a);\r\n    _ = (&frag.position);\r\n    _ = (&frag.a);\r\n    main_1();\r\n    let _e30 = frag.position;\r\n    let _e32 = frag.a;\r\n    let _e35 = out_array[0];\r\n    let _e37 = out_array[1];\r\n    return VertexOutput(_e30, _e32, _e35, _e37);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/empty-global-name.wgsl",
    "content": "struct type_1 {\r\n    member: i32,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<storage, read_write> unnamed: type_1;\r\n\r\nfn function_() {\r\n    let _e8 = unnamed.member;\r\n    unnamed.member = (_e8 + 1);\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    function_();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/empty.wgsl",
    "content": "@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/expressions-frag.wgsl",
    "content": "struct BST {\r\n    data: i32,\r\n}\r\n\r\nstruct a_buf {\r\n    a: array<f32>,\r\n}\r\n\r\nstruct FragmentOutput {\r\n    @location(0) o_color: vec4<f32>,\r\n}\r\n\r\nvar<private> global: f32;\r\n@group(0) @binding(0) \r\nvar<storage, read_write> global_1: a_buf;\r\nvar<private> o_color: vec4<f32>;\r\n\r\nfn testBinOpVecFloat(a: vec4<f32>, b: f32) {\r\n    var a_1: vec4<f32>;\r\n    var b_1: f32;\r\n    var v: vec4<f32>;\r\n\r\n    a_1 = a;\r\n    b_1 = b;\r\n    let _e5 = a_1;\r\n    v = (_e5 * 2.0);\r\n    let _e8 = a_1;\r\n    v = (_e8 / vec4<f32>(2.0));\r\n    let _e12 = a_1;\r\n    v = (_e12 + vec4<f32>(2.0));\r\n    let _e16 = a_1;\r\n    v = (_e16 - vec4<f32>(2.0));\r\n    return;\r\n}\r\n\r\nfn testBinOpFloatVec(a_2: vec4<f32>, b_2: f32) {\r\n    var a_3: vec4<f32>;\r\n    var b_3: f32;\r\n    var v_1: vec4<f32>;\r\n\r\n    a_3 = a_2;\r\n    b_3 = b_2;\r\n    let _e5 = a_3;\r\n    let _e6 = b_3;\r\n    v_1 = (_e5 * _e6);\r\n    let _e8 = a_3;\r\n    let _e9 = b_3;\r\n    v_1 = (_e8 / vec4<f32>(_e9));\r\n    let _e12 = a_3;\r\n    let _e13 = b_3;\r\n    v_1 = (_e12 + vec4<f32>(_e13));\r\n    let _e16 = a_3;\r\n    let _e17 = b_3;\r\n    v_1 = (_e16 - vec4<f32>(_e17));\r\n    return;\r\n}\r\n\r\nfn testBinOpIVecInt(a_4: vec4<i32>, b_4: i32) {\r\n    var a_5: vec4<i32>;\r\n    var b_5: i32;\r\n    var v_2: vec4<i32>;\r\n\r\n    a_5 = a_4;\r\n    b_5 = b_4;\r\n    let _e5 = a_5;\r\n    let _e6 = b_5;\r\n    v_2 = (_e5 * _e6);\r\n    let _e8 = a_5;\r\n    let _e9 = b_5;\r\n    v_2 = (_e8 / vec4<i32>(_e9));\r\n    let _e12 = a_5;\r\n    let _e13 = b_5;\r\n    v_2 = (_e12 + vec4<i32>(_e13));\r\n    let _e16 = a_5;\r\n    let _e17 = b_5;\r\n    v_2 = (_e16 - vec4<i32>(_e17));\r\n    let _e20 = a_5;\r\n    let _e21 = b_5;\r\n    v_2 = (_e20 & vec4<i32>(_e21));\r\n    let _e24 = a_5;\r\n    let _e25 = b_5;\r\n    v_2 = (_e24 | vec4<i32>(_e25));\r\n    let _e28 = a_5;\r\n    let _e29 = b_5;\r\n    v_2 = (_e28 ^ vec4<i32>(_e29));\r\n    let _e32 = a_5;\r\n    let _e33 = b_5;\r\n    v_2 = (_e32 >> vec4<u32>(u32(_e33)));\r\n    let _e37 = a_5;\r\n    let _e38 = b_5;\r\n    v_2 = (_e37 << vec4<u32>(u32(_e38)));\r\n    return;\r\n}\r\n\r\nfn testBinOpIntIVec(a_6: i32, b_6: vec4<i32>) {\r\n    var a_7: i32;\r\n    var b_7: vec4<i32>;\r\n    var v_3: vec4<i32>;\r\n\r\n    a_7 = a_6;\r\n    b_7 = b_6;\r\n    let _e5 = a_7;\r\n    let _e6 = b_7;\r\n    v_3 = (_e5 * _e6);\r\n    let _e8 = a_7;\r\n    let _e9 = b_7;\r\n    v_3 = (vec4<i32>(_e8) + _e9);\r\n    let _e12 = a_7;\r\n    let _e13 = b_7;\r\n    v_3 = (vec4<i32>(_e12) - _e13);\r\n    let _e16 = a_7;\r\n    let _e17 = b_7;\r\n    v_3 = (vec4<i32>(_e16) & _e17);\r\n    let _e20 = a_7;\r\n    let _e21 = b_7;\r\n    v_3 = (vec4<i32>(_e20) | _e21);\r\n    let _e24 = a_7;\r\n    let _e25 = b_7;\r\n    v_3 = (vec4<i32>(_e24) ^ _e25);\r\n    return;\r\n}\r\n\r\nfn testBinOpUVecUint(a_8: vec4<u32>, b_8: u32) {\r\n    var a_9: vec4<u32>;\r\n    var b_9: u32;\r\n    var v_4: vec4<u32>;\r\n\r\n    a_9 = a_8;\r\n    b_9 = b_8;\r\n    let _e5 = a_9;\r\n    let _e6 = b_9;\r\n    v_4 = (_e5 * _e6);\r\n    let _e8 = a_9;\r\n    let _e9 = b_9;\r\n    v_4 = (_e8 / vec4<u32>(_e9));\r\n    let _e12 = a_9;\r\n    let _e13 = b_9;\r\n    v_4 = (_e12 + vec4<u32>(_e13));\r\n    let _e16 = a_9;\r\n    let _e17 = b_9;\r\n    v_4 = (_e16 - vec4<u32>(_e17));\r\n    let _e20 = a_9;\r\n    let _e21 = b_9;\r\n    v_4 = (_e20 & vec4<u32>(_e21));\r\n    let _e24 = a_9;\r\n    let _e25 = b_9;\r\n    v_4 = (_e24 | vec4<u32>(_e25));\r\n    let _e28 = a_9;\r\n    let _e29 = b_9;\r\n    v_4 = (_e28 ^ vec4<u32>(_e29));\r\n    let _e32 = a_9;\r\n    let _e33 = b_9;\r\n    v_4 = (_e32 >> vec4<u32>(_e33));\r\n    let _e36 = a_9;\r\n    let _e37 = b_9;\r\n    v_4 = (_e36 << vec4<u32>(_e37));\r\n    return;\r\n}\r\n\r\nfn testBinOpUintUVec(a_10: u32, b_10: vec4<u32>) {\r\n    var a_11: u32;\r\n    var b_11: vec4<u32>;\r\n    var v_5: vec4<u32>;\r\n\r\n    a_11 = a_10;\r\n    b_11 = b_10;\r\n    let _e5 = a_11;\r\n    let _e6 = b_11;\r\n    v_5 = (_e5 * _e6);\r\n    let _e8 = a_11;\r\n    let _e9 = b_11;\r\n    v_5 = (vec4<u32>(_e8) + _e9);\r\n    let _e12 = a_11;\r\n    let _e13 = b_11;\r\n    v_5 = (vec4<u32>(_e12) - _e13);\r\n    let _e16 = a_11;\r\n    let _e17 = b_11;\r\n    v_5 = (vec4<u32>(_e16) & _e17);\r\n    let _e20 = a_11;\r\n    let _e21 = b_11;\r\n    v_5 = (vec4<u32>(_e20) | _e21);\r\n    let _e24 = a_11;\r\n    let _e25 = b_11;\r\n    v_5 = (vec4<u32>(_e24) ^ _e25);\r\n    return;\r\n}\r\n\r\nfn testBinOpMatMat(a_12: mat3x3<f32>, b_12: mat3x3<f32>) {\r\n    var a_13: mat3x3<f32>;\r\n    var b_13: mat3x3<f32>;\r\n    var v_6: mat3x3<f32>;\r\n    var c: bool;\r\n\r\n    a_13 = a_12;\r\n    b_13 = b_12;\r\n    let _e6 = a_13;\r\n    let _e7 = b_13;\r\n    v_6 = mat3x3<f32>((_e6[0] / _e7[0]), (_e6[1] / _e7[1]), (_e6[2] / _e7[2]));\r\n    let _e18 = a_13;\r\n    let _e19 = b_13;\r\n    v_6 = (_e18 * _e19);\r\n    let _e21 = a_13;\r\n    let _e22 = b_13;\r\n    v_6 = (_e21 + _e22);\r\n    let _e24 = a_13;\r\n    let _e25 = b_13;\r\n    v_6 = (_e24 - _e25);\r\n    let _e27 = a_13;\r\n    let _e28 = b_13;\r\n    c = (all((_e27[2] == _e28[2])) && (all((_e27[1] == _e28[1])) && all((_e27[0] == _e28[0]))));\r\n    let _e43 = a_13;\r\n    let _e44 = b_13;\r\n    c = (any((_e43[2] != _e44[2])) || (any((_e43[1] != _e44[1])) || any((_e43[0] != _e44[0]))));\r\n    return;\r\n}\r\n\r\nfn testBinOpMatFloat(a_14: f32, b_14: mat3x3<f32>) {\r\n    var a_15: f32;\r\n    var b_15: mat3x3<f32>;\r\n    var v_7: mat3x3<f32>;\r\n\r\n    a_15 = a_14;\r\n    b_15 = b_14;\r\n    let _e5 = a_15;\r\n    let _e6 = b_15;\r\n    let _e7 = vec3<f32>(_e5);\r\n    v_7 = mat3x3<f32>((_e7 / _e6[0]), (_e7 / _e6[1]), (_e7 / _e6[2]));\r\n    let _e15 = a_15;\r\n    let _e16 = b_15;\r\n    v_7 = (_e15 * _e16);\r\n    let _e18 = a_15;\r\n    let _e19 = b_15;\r\n    let _e20 = vec3<f32>(_e18);\r\n    v_7 = mat3x3<f32>((_e20 + _e19[0]), (_e20 + _e19[1]), (_e20 + _e19[2]));\r\n    let _e28 = a_15;\r\n    let _e29 = b_15;\r\n    let _e30 = vec3<f32>(_e28);\r\n    v_7 = mat3x3<f32>((_e30 - _e29[0]), (_e30 - _e29[1]), (_e30 - _e29[2]));\r\n    let _e38 = b_15;\r\n    let _e39 = a_15;\r\n    let _e40 = vec3<f32>(_e39);\r\n    v_7 = mat3x3<f32>((_e38[0] / _e40), (_e38[1] / _e40), (_e38[2] / _e40));\r\n    let _e48 = b_15;\r\n    let _e49 = a_15;\r\n    v_7 = (_e48 * _e49);\r\n    let _e51 = b_15;\r\n    let _e52 = a_15;\r\n    let _e53 = vec3<f32>(_e52);\r\n    v_7 = mat3x3<f32>((_e51[0] + _e53), (_e51[1] + _e53), (_e51[2] + _e53));\r\n    let _e61 = b_15;\r\n    let _e62 = a_15;\r\n    let _e63 = vec3<f32>(_e62);\r\n    v_7 = mat3x3<f32>((_e61[0] - _e63), (_e61[1] - _e63), (_e61[2] - _e63));\r\n    return;\r\n}\r\n\r\nfn testUnaryOpMat(a_16: mat3x3<f32>) {\r\n    var a_17: mat3x3<f32>;\r\n    var v_8: mat3x3<f32>;\r\n\r\n    a_17 = a_16;\r\n    let _e3 = a_17;\r\n    v_8 = -(_e3);\r\n    let _e5 = a_17;\r\n    let _e7 = vec3<f32>(1.0);\r\n    let _e9 = (_e5 - mat3x3<f32>(_e7, _e7, _e7));\r\n    a_17 = _e9;\r\n    v_8 = _e9;\r\n    let _e10 = a_17;\r\n    let _e12 = vec3<f32>(1.0);\r\n    a_17 = (_e10 - mat3x3<f32>(_e12, _e12, _e12));\r\n    v_8 = _e10;\r\n    return;\r\n}\r\n\r\nfn testStructConstructor() {\r\n    var tree: BST;\r\n\r\n    tree = BST(1);\r\n    return;\r\n}\r\n\r\nfn testNonScalarToScalarConstructor() {\r\n    var f: f32;\r\n\r\n    f = f32(mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0))[0].x);\r\n    return;\r\n}\r\n\r\nfn testArrayConstructor() {\r\n    var tree_1: array<f32,1u>;\r\n\r\n    tree_1 = array<f32,1u>(0.0);\r\n    return;\r\n}\r\n\r\nfn testFreestandingConstructor() {\r\n    return;\r\n}\r\n\r\nfn testNonImplicitCastVectorCast() {\r\n    var a_18: u32;\r\n    var b_16: vec4<i32>;\r\n\r\n    a_18 = u32(1);\r\n    let _e3 = a_18;\r\n    b_16 = vec4<i32>(i32(_e3));\r\n    return;\r\n}\r\n\r\nfn privatePointer(a_19: ptr<function, f32>) {\r\n    return;\r\n}\r\n\r\nfn ternary(a_20: bool) {\r\n    var a_21: bool;\r\n    var local: u32;\r\n    var b_17: u32;\r\n    var local_1: u32;\r\n    var c_1: u32;\r\n    var local_2: u32;\r\n    var local_3: u32;\r\n    var local_4: u32;\r\n    var nested: u32;\r\n\r\n    a_21 = a_20;\r\n    let _e3 = a_21;\r\n    if _e3 {\r\n        local = u32(0);\r\n    } else {\r\n        local = 1u;\r\n    }\r\n    let _e8 = local;\r\n    b_17 = _e8;\r\n    let _e10 = a_21;\r\n    if _e10 {\r\n        local_1 = 0u;\r\n    } else {\r\n        local_1 = u32(1);\r\n    }\r\n    let _e15 = local_1;\r\n    c_1 = _e15;\r\n    let _e17 = a_21;\r\n    if _e17 {\r\n        let _e18 = a_21;\r\n        if _e18 {\r\n            let _e19 = a_21;\r\n            if _e19 {\r\n                local_2 = 2u;\r\n            } else {\r\n                local_2 = u32(3);\r\n            }\r\n            let _e24 = local_2;\r\n            local_3 = _e24;\r\n        } else {\r\n            local_3 = 4u;\r\n        }\r\n        let _e27 = local_3;\r\n        local_4 = _e27;\r\n    } else {\r\n        local_4 = u32(5);\r\n    }\r\n    let _e31 = local_4;\r\n    nested = _e31;\r\n    return;\r\n}\r\n\r\nfn testMatrixMultiplication(a_22: mat4x3<f32>, b_18: mat4x4<f32>) {\r\n    var a_23: mat4x3<f32>;\r\n    var b_19: mat4x4<f32>;\r\n    var c_2: mat4x3<f32>;\r\n\r\n    a_23 = a_22;\r\n    b_19 = b_18;\r\n    let _e5 = a_23;\r\n    let _e6 = b_19;\r\n    c_2 = (_e5 * _e6);\r\n    return;\r\n}\r\n\r\nfn testLength() {\r\n    var len: i32;\r\n\r\n    len = i32(arrayLength((&global_1.a)));\r\n    return;\r\n}\r\n\r\nfn testConstantLength(a_24: array<f32,4u>) {\r\n    var a_25: array<f32,4u>;\r\n    var len_1: i32;\r\n\r\n    _ = (&global_1.a);\r\n    a_25 = a_24;\r\n    _ = a_25;\r\n    len_1 = i32(4u);\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    var local_5: f32;\r\n\r\n    _ = (&global_1.a);\r\n    _ = global;\r\n    let _e5 = global;\r\n    local_5 = _e5;\r\n    privatePointer((&local_5));\r\n    let _e7 = local_5;\r\n    global = _e7;\r\n    let _e8 = o_color;\r\n    _ = _e8.xyzw;\r\n    let _e11 = vec4<f32>(1.0);\r\n    o_color.x = _e11.x;\r\n    o_color.y = _e11.y;\r\n    o_color.z = _e11.z;\r\n    o_color.w = _e11.w;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() -> FragmentOutput {\r\n    _ = (&global_1.a);\r\n    main_1();\r\n    let _e7 = o_color;\r\n    return FragmentOutput(_e7);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/extra.wgsl",
    "content": "struct PushConstants {\r\n    index: u32,\r\n    double: vec2<f32>,\r\n}\r\n\r\nstruct FragmentIn {\r\n    @location(0) color: vec4<f32>,\r\n    @builtin(primitive_index) primitive_index: u32,\r\n}\r\n\r\nvar<push_constant> pc: PushConstants;\r\n\r\n@fragment \r\nfn main(in: FragmentIn) -> @location(0) vec4<f32> {\r\n    let _e4 = pc.index;\r\n    if (in.primitive_index == _e4) {\r\n        return in.color;\r\n    } else {\r\n        return vec4<f32>((vec3<f32>(1.0) - in.color.xyz), in.color.w);\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/fma-frag.wgsl",
    "content": "struct Mat4x3_ {\r\n    mx: vec4<f32>,\r\n    my: vec4<f32>,\r\n    mz: vec4<f32>,\r\n}\r\n\r\nstruct FragmentOutput {\r\n    @location(0) o_color: vec4<f32>,\r\n}\r\n\r\nvar<private> o_color: vec4<f32>;\r\n\r\nfn Fma(d: ptr<function, Mat4x3_>, m: Mat4x3_, s: f32) {\r\n    var m_1: Mat4x3_;\r\n    var s_1: f32;\r\n\r\n    m_1 = m;\r\n    s_1 = s;\r\n    let _e7 = (*d).mx;\r\n    let _e9 = m_1.mx;\r\n    let _e10 = s_1;\r\n    (*d).mx = (_e7 + (_e9 * _e10));\r\n    let _e15 = (*d).my;\r\n    let _e17 = m_1.my;\r\n    let _e18 = s_1;\r\n    (*d).my = (_e15 + (_e17 * _e18));\r\n    let _e23 = (*d).mz;\r\n    let _e25 = m_1.mz;\r\n    let _e26 = s_1;\r\n    (*d).mz = (_e23 + (_e25 * _e26));\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    let _e1 = o_color;\r\n    _ = _e1.xyzw;\r\n    let _e4 = vec4<f32>(1.0);\r\n    o_color.x = _e4.x;\r\n    o_color.y = _e4.y;\r\n    o_color.z = _e4.z;\r\n    o_color.w = _e4.w;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() -> FragmentOutput {\r\n    main_1();\r\n    let _e3 = o_color;\r\n    return FragmentOutput(_e3);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/functions.wgsl",
    "content": "fn test_fma() -> vec2<f32> {\r\n    let a = vec2<f32>(2.0, 2.0);\r\n    let b = vec2<f32>(0.5, 0.5);\r\n    let c = vec2<f32>(0.5, 0.5);\r\n    return fma(a, b, c);\r\n}\r\n\r\nfn test_integer_dot_product() -> i32 {\r\n    let a_2_ = vec2<i32>(1);\r\n    let b_2_ = vec2<i32>(1);\r\n    let c_2_ = dot(a_2_, b_2_);\r\n    let a_3_ = vec3<u32>(1u);\r\n    let b_3_ = vec3<u32>(1u);\r\n    let c_3_ = dot(a_3_, b_3_);\r\n    let c_4_ = dot(vec4<i32>(4), vec4<i32>(2));\r\n    return c_4_;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    let _e0 = test_fma();\r\n    let _e1 = test_integer_dot_product();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/global-constant-array-vert.wgsl",
    "content": "var<private> i: u32;\r\n\r\nfn main_1() {\r\n    var local: array<f32,2u> = array<f32,2u>(1.0, 2.0);\r\n\r\n    let _e2 = i;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    _ = array<f32,2u>(1.0, 2.0);\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/globals.wgsl",
    "content": "struct Foo {\r\n    v3_: vec3<f32>,\r\n    v1_: f32,\r\n}\r\n\r\nlet Foo_2: bool = true;\r\n\r\nvar<workgroup> wg: array<f32,10u>;\r\nvar<workgroup> at_1: atomic<u32>;\r\n@group(0) @binding(1) \r\nvar<storage, read_write> alignment: Foo;\r\n@group(0) @binding(2) \r\nvar<storage> dummy: array<vec2<f32>>;\r\n@group(0) @binding(3) \r\nvar<uniform> float_vecs: array<vec4<f32>,20>;\r\n@group(0) @binding(4) \r\nvar<uniform> global_vec: vec3<f32>;\r\n@group(0) @binding(5) \r\nvar<uniform> global_mat: mat3x2<f32>;\r\n@group(0) @binding(6) \r\nvar<uniform> global_nested_arrays_of_matrices_2x4_: array<array<mat2x4<f32>,2>,2>;\r\n@group(0) @binding(7) \r\nvar<uniform> global_nested_arrays_of_matrices_4x2_: array<array<mat4x2<f32>,2>,2>;\r\n\r\nfn test_msl_packed_vec3_as_arg(arg: vec3<f32>) {\r\n    return;\r\n}\r\n\r\nfn test_msl_packed_vec3_() {\r\n    var idx: i32 = 1;\r\n\r\n    alignment.v3_ = vec3<f32>(1.0);\r\n    alignment.v3_.x = 1.0;\r\n    alignment.v3_.x = 2.0;\r\n    let _e23 = idx;\r\n    alignment.v3_[_e23] = 3.0;\r\n    let data = alignment;\r\n    _ = data.v3_;\r\n    _ = data.v3_.zx;\r\n    test_msl_packed_vec3_as_arg(data.v3_);\r\n    _ = (data.v3_ * mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    _ = (mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)) * data.v3_);\r\n    _ = (data.v3_ * 2.0);\r\n    _ = (2.0 * data.v3_);\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    var Foo_1: f32 = 1.0;\r\n    var at: bool = true;\r\n\r\n    test_msl_packed_vec3_();\r\n    let _e16 = global_nested_arrays_of_matrices_4x2_[0][0];\r\n    let _e23 = global_nested_arrays_of_matrices_2x4_[0][0][0];\r\n    wg[7] = (_e16 * _e23).x;\r\n    let _e28 = global_mat;\r\n    let _e29 = global_vec;\r\n    wg[6] = (_e28 * _e29).x;\r\n    let _e37 = dummy[1].y;\r\n    wg[5] = _e37;\r\n    let _e43 = float_vecs[0].w;\r\n    wg[4] = _e43;\r\n    let _e47 = alignment.v1_;\r\n    wg[3] = _e47;\r\n    let _e52 = alignment.v3_.x;\r\n    wg[2] = _e52;\r\n    alignment.v1_ = 4.0;\r\n    wg[1] = f32(arrayLength((&dummy)));\r\n    atomicStore((&at_1), 2u);\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/image.wgsl",
    "content": "@group(0) @binding(0) \r\nvar image_mipmapped_src: texture_2d<u32>;\r\n@group(0) @binding(3) \r\nvar image_multisampled_src: texture_multisampled_2d<u32>;\r\n@group(0) @binding(4) \r\nvar image_depth_multisampled_src: texture_depth_multisampled_2d;\r\n@group(0) @binding(1) \r\nvar image_storage_src: texture_storage_2d<rgba8uint,read>;\r\n@group(0) @binding(5) \r\nvar image_array_src: texture_2d_array<u32>;\r\n@group(0) @binding(6) \r\nvar image_dup_src: texture_storage_1d<r32uint,read>;\r\n@group(0) @binding(7) \r\nvar image_1d_src: texture_1d<u32>;\r\n@group(0) @binding(2) \r\nvar image_dst: texture_storage_1d<r32uint,write>;\r\n@group(0) @binding(0) \r\nvar image_1d: texture_1d<f32>;\r\n@group(0) @binding(1) \r\nvar image_2d: texture_2d<f32>;\r\n@group(0) @binding(2) \r\nvar image_2d_array: texture_2d_array<f32>;\r\n@group(0) @binding(3) \r\nvar image_cube: texture_cube<f32>;\r\n@group(0) @binding(4) \r\nvar image_cube_array: texture_cube_array<f32>;\r\n@group(0) @binding(5) \r\nvar image_3d: texture_3d<f32>;\r\n@group(0) @binding(6) \r\nvar image_aa: texture_multisampled_2d<f32>;\r\n@group(1) @binding(0) \r\nvar sampler_reg: sampler;\r\n@group(1) @binding(1) \r\nvar sampler_cmp: sampler_comparison;\r\n@group(1) @binding(2) \r\nvar image_2d_depth: texture_depth_2d;\r\n@group(1) @binding(3) \r\nvar image_cube_depth: texture_depth_cube;\r\n\r\n@compute @workgroup_size(16, 1, 1) \r\nfn main(@builtin(local_invocation_id) local_id: vec3<u32>) {\r\n    let dim = textureDimensions(image_storage_src);\r\n    let itc = ((dim * vec2<i32>(local_id.xy)) % vec2<i32>(10, 20));\r\n    let value1_ = textureLoad(image_mipmapped_src, itc, i32(local_id.z));\r\n    let value2_ = textureLoad(image_multisampled_src, itc, i32(local_id.z));\r\n    let value4_ = textureLoad(image_storage_src, itc);\r\n    let value5_ = textureLoad(image_array_src, itc, i32(local_id.z), (i32(local_id.z) + 1));\r\n    let value6_ = textureLoad(image_1d_src, i32(local_id.x), i32(local_id.z));\r\n    textureStore(image_dst, itc.x, ((((value1_ + value2_) + value4_) + value5_) + value6_));\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(16, 1, 1) \r\nfn depth_load(@builtin(local_invocation_id) local_id_1: vec3<u32>) {\r\n    let dim_1 = textureDimensions(image_storage_src);\r\n    let itc_1 = ((dim_1 * vec2<i32>(local_id_1.xy)) % vec2<i32>(10, 20));\r\n    let val = textureLoad(image_depth_multisampled_src, itc_1, i32(local_id_1.z));\r\n    textureStore(image_dst, itc_1.x, vec4<u32>(u32(val)));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn queries() -> @builtin(position) vec4<f32> {\r\n    let dim_1d = textureDimensions(image_1d);\r\n    let dim_1d_lod = textureDimensions(image_1d, i32(dim_1d));\r\n    let dim_2d = textureDimensions(image_2d);\r\n    let dim_2d_lod = textureDimensions(image_2d, 1);\r\n    let dim_2d_array = textureDimensions(image_2d_array);\r\n    let dim_2d_array_lod = textureDimensions(image_2d_array, 1);\r\n    let dim_cube = textureDimensions(image_cube);\r\n    let dim_cube_lod = textureDimensions(image_cube, 1);\r\n    let dim_cube_array = textureDimensions(image_cube_array);\r\n    let dim_cube_array_lod = textureDimensions(image_cube_array, 1);\r\n    let dim_3d = textureDimensions(image_3d);\r\n    let dim_3d_lod = textureDimensions(image_3d, 1);\r\n    let dim_2s_ms = textureDimensions(image_aa);\r\n    let sum = ((((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z);\r\n    return vec4<f32>(f32(sum));\r\n}\r\n\r\n@vertex \r\nfn levels_queries() -> @builtin(position) vec4<f32> {\r\n    let num_levels_2d = textureNumLevels(image_2d);\r\n    let num_levels_2d_array = textureNumLevels(image_2d_array);\r\n    let num_layers_2d = textureNumLayers(image_2d_array);\r\n    let num_levels_cube = textureNumLevels(image_cube);\r\n    let num_levels_cube_array = textureNumLevels(image_cube_array);\r\n    let num_layers_cube = textureNumLayers(image_cube_array);\r\n    let num_levels_3d = textureNumLevels(image_3d);\r\n    let num_samples_aa = textureNumSamples(image_aa);\r\n    let sum_1 = (((((((num_layers_2d + num_layers_cube) + num_samples_aa) + num_levels_2d) + num_levels_2d_array) + num_levels_3d) + num_levels_cube) + num_levels_cube_array);\r\n    return vec4<f32>(f32(sum_1));\r\n}\r\n\r\n@fragment \r\nfn texture_sample() -> @location(0) vec4<f32> {\r\n    let tc = vec2<f32>(0.5);\r\n    let s1d = textureSample(image_1d, sampler_reg, tc.x);\r\n    let s2d = textureSample(image_2d, sampler_reg, tc);\r\n    let s2d_offset = textureSample(image_2d, sampler_reg, tc, vec2<i32>(3, 1));\r\n    let s2d_level = textureSampleLevel(image_2d, sampler_reg, tc, 2.299999952316284);\r\n    let s2d_level_offset = textureSampleLevel(image_2d, sampler_reg, tc, 2.299999952316284, vec2<i32>(3, 1));\r\n    let s2d_bias_offset = textureSampleBias(image_2d, sampler_reg, tc, 2.0, vec2<i32>(3, 1));\r\n    return ((((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset);\r\n}\r\n\r\n@fragment \r\nfn texture_sample_comparison() -> @location(0) f32 {\r\n    let tc_1 = vec2<f32>(0.5);\r\n    let s2d_depth = textureSampleCompare(image_2d_depth, sampler_cmp, tc_1, 0.5);\r\n    let s2d_depth_level = textureSampleCompareLevel(image_2d_depth, sampler_cmp, tc_1, 0.5);\r\n    let scube_depth_level = textureSampleCompareLevel(image_cube_depth, sampler_cmp, vec3<f32>(0.5), 0.5);\r\n    return (s2d_depth + s2d_depth_level);\r\n}\r\n\r\n@fragment \r\nfn gather() -> @location(0) vec4<f32> {\r\n    let tc_2 = vec2<f32>(0.5);\r\n    let s2d_1 = textureGather(1, image_2d, sampler_reg, tc_2);\r\n    let s2d_offset_1 = textureGather(3, image_2d, sampler_reg, tc_2, vec2<i32>(3, 1));\r\n    let s2d_depth_1 = textureGatherCompare(image_2d_depth, sampler_cmp, tc_2, 0.5);\r\n    let s2d_depth_offset = textureGatherCompare(image_2d_depth, sampler_cmp, tc_2, 0.5, vec2<i32>(3, 1));\r\n    return (((s2d_1 + s2d_offset_1) + s2d_depth_1) + s2d_depth_offset);\r\n}\r\n\r\n@fragment \r\nfn depth_no_comparison() -> @location(0) vec4<f32> {\r\n    let tc_3 = vec2<f32>(0.5);\r\n    let s2d_2 = textureSample(image_2d_depth, sampler_reg, tc_3);\r\n    let s2d_gather = textureGather(image_2d_depth, sampler_reg, tc_3);\r\n    return (vec4<f32>(s2d_2) + s2d_gather);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/images-frag.wgsl",
    "content": "@group(0) @binding(0) \r\nvar img1D: texture_storage_1d<rgba8unorm,read_write>;\r\n@group(0) @binding(1) \r\nvar img2D: texture_storage_2d<rgba8unorm,read_write>;\r\n@group(0) @binding(2) \r\nvar img3D: texture_storage_3d<rgba8unorm,read_write>;\r\n@group(0) @binding(4) \r\nvar img1DArray: texture_storage_1d_array<rgba8unorm,read_write>;\r\n@group(0) @binding(5) \r\nvar img2DArray: texture_storage_2d_array<rgba8unorm,read_write>;\r\n@group(0) @binding(7) \r\nvar imgReadOnly: texture_storage_2d<rgba8unorm,read>;\r\n@group(0) @binding(8) \r\nvar imgWriteOnly: texture_storage_2d<rgba8unorm,write>;\r\n@group(0) @binding(9) \r\nvar imgWriteReadOnly: texture_storage_2d<rgba8unorm,write>;\r\n\r\nfn testImg1D(coord: i32) {\r\n    var coord_1: i32;\r\n    var size: i32;\r\n    var c: vec4<f32>;\r\n\r\n    coord_1 = coord;\r\n    let _e10 = textureDimensions(img1D);\r\n    size = _e10;\r\n    _ = coord_1;\r\n    _ = vec4<f32>(f32(2));\r\n    let _e16 = coord_1;\r\n    textureStore(img1D, _e16, vec4<f32>(f32(2)));\r\n    _ = coord_1;\r\n    let _e21 = coord_1;\r\n    let _e22 = textureLoad(img1D, _e21);\r\n    c = _e22;\r\n    return;\r\n}\r\n\r\nfn testImg1DArray(coord_2: vec2<i32>) {\r\n    var coord_3: vec2<i32>;\r\n    var size_1: vec2<f32>;\r\n    var c_1: vec4<f32>;\r\n\r\n    coord_3 = coord_2;\r\n    let _e10 = textureDimensions(img1DArray);\r\n    let _e11 = textureNumLayers(img1DArray);\r\n    size_1 = vec2<f32>(vec2<i32>(_e10, _e11));\r\n    _ = coord_3;\r\n    let _e16 = coord_3;\r\n    let _e19 = textureLoad(img1DArray, _e16.x, _e16.y);\r\n    c_1 = _e19;\r\n    _ = coord_3;\r\n    _ = vec4<f32>(f32(2));\r\n    let _e25 = coord_3;\r\n    textureStore(img1DArray, _e25.x, _e25.y, vec4<f32>(f32(2)));\r\n    return;\r\n}\r\n\r\nfn testImg2D(coord_4: vec2<i32>) {\r\n    var coord_5: vec2<i32>;\r\n    var size_2: vec2<f32>;\r\n    var c_2: vec4<f32>;\r\n\r\n    coord_5 = coord_4;\r\n    let _e10 = textureDimensions(img2D);\r\n    size_2 = vec2<f32>(_e10);\r\n    _ = coord_5;\r\n    let _e14 = coord_5;\r\n    let _e15 = textureLoad(img2D, _e14);\r\n    c_2 = _e15;\r\n    _ = coord_5;\r\n    _ = vec4<f32>(f32(2));\r\n    let _e21 = coord_5;\r\n    textureStore(img2D, _e21, vec4<f32>(f32(2)));\r\n    return;\r\n}\r\n\r\nfn testImg2DArray(coord_6: vec3<i32>) {\r\n    var coord_7: vec3<i32>;\r\n    var size_3: vec3<f32>;\r\n    var c_3: vec4<f32>;\r\n\r\n    coord_7 = coord_6;\r\n    let _e10 = textureDimensions(img2DArray);\r\n    let _e13 = textureNumLayers(img2DArray);\r\n    size_3 = vec3<f32>(vec3<i32>(_e10.x, _e10.y, _e13));\r\n    _ = coord_7;\r\n    let _e18 = coord_7;\r\n    let _e21 = textureLoad(img2DArray, _e18.xy, _e18.z);\r\n    c_3 = _e21;\r\n    _ = coord_7;\r\n    _ = vec4<f32>(f32(2));\r\n    let _e27 = coord_7;\r\n    textureStore(img2DArray, _e27.xy, _e27.z, vec4<f32>(f32(2)));\r\n    return;\r\n}\r\n\r\nfn testImg3D(coord_8: vec3<i32>) {\r\n    var coord_9: vec3<i32>;\r\n    var size_4: vec3<f32>;\r\n    var c_4: vec4<f32>;\r\n\r\n    coord_9 = coord_8;\r\n    let _e10 = textureDimensions(img3D);\r\n    size_4 = vec3<f32>(_e10);\r\n    _ = coord_9;\r\n    let _e14 = coord_9;\r\n    let _e15 = textureLoad(img3D, _e14);\r\n    c_4 = _e15;\r\n    _ = coord_9;\r\n    _ = vec4<f32>(f32(2));\r\n    let _e21 = coord_9;\r\n    textureStore(img3D, _e21, vec4<f32>(f32(2)));\r\n    return;\r\n}\r\n\r\nfn testImgReadOnly(coord_10: vec2<i32>) {\r\n    var coord_11: vec2<i32>;\r\n    var size_5: vec2<f32>;\r\n    var c_5: vec4<f32>;\r\n\r\n    coord_11 = coord_10;\r\n    let _e10 = textureDimensions(img2D);\r\n    size_5 = vec2<f32>(_e10);\r\n    _ = coord_11;\r\n    let _e14 = coord_11;\r\n    let _e15 = textureLoad(imgReadOnly, _e14);\r\n    c_5 = _e15;\r\n    return;\r\n}\r\n\r\nfn testImgWriteOnly(coord_12: vec2<i32>) {\r\n    var coord_13: vec2<i32>;\r\n    var size_6: vec2<f32>;\r\n\r\n    coord_13 = coord_12;\r\n    let _e10 = textureDimensions(img2D);\r\n    size_6 = vec2<f32>(_e10);\r\n    _ = coord_13;\r\n    _ = vec4<f32>(f32(2));\r\n    let _e17 = coord_13;\r\n    textureStore(imgWriteOnly, _e17, vec4<f32>(f32(2)));\r\n    return;\r\n}\r\n\r\nfn testImgWriteReadOnly(coord_14: vec2<i32>) {\r\n    var coord_15: vec2<i32>;\r\n    var size_7: vec2<f32>;\r\n\r\n    coord_15 = coord_14;\r\n    let _e10 = textureDimensions(imgWriteReadOnly);\r\n    size_7 = vec2<f32>(_e10);\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/interface.wgsl",
    "content": "struct VertexOutput {\r\n    @builtin(position) @invariant position: vec4<f32>,\r\n    @location(1) _varying: f32,\r\n}\r\n\r\nstruct FragmentOutput {\r\n    @builtin(frag_depth) depth: f32,\r\n    @builtin(sample_mask) sample_mask: u32,\r\n    @location(0) color: f32,\r\n}\r\n\r\nstruct Input1_ {\r\n    @builtin(vertex_index) index: u32,\r\n}\r\n\r\nstruct Input2_ {\r\n    @builtin(instance_index) index: u32,\r\n}\r\n\r\nvar<workgroup> output: array<u32,1>;\r\n\r\n@vertex \r\nfn vertex(@builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, @location(10) color: u32) -> VertexOutput {\r\n    let tmp: u32 = ((vertex_index + instance_index) + color);\r\n    return VertexOutput(vec4<f32>(1.0), f32(tmp));\r\n}\r\n\r\n@fragment \r\nfn fragment(in: VertexOutput, @builtin(front_facing) front_facing: bool, @builtin(sample_index) sample_index: u32, @builtin(sample_mask) sample_mask: u32) -> FragmentOutput {\r\n    let mask: u32 = (sample_mask & (1u << sample_index));\r\n    let color_1: f32 = select(0.0, 1.0, front_facing);\r\n    return FragmentOutput(in._varying, mask, color_1);\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn compute(@builtin(global_invocation_id) global_id: vec3<u32>, @builtin(local_invocation_id) local_id: vec3<u32>, @builtin(local_invocation_index) local_index: u32, @builtin(workgroup_id) wg_id: vec3<u32>, @builtin(num_workgroups) num_wgs: vec3<u32>) {\r\n    output[0] = ((((global_id.x + local_id.x) + local_index) + wg_id.x) + num_wgs.x);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn vertex_two_structs(in1_: Input1_, in2_: Input2_) -> @builtin(position) @invariant vec4<f32> {\r\n    var index: u32 = 2u;\r\n\r\n    let _e9: u32 = index;\r\n    return vec4<f32>(f32(in1_.index), f32(in2_.index), f32(_e9), 0.0);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/interpolate.wgsl",
    "content": "struct FragmentInput {\r\n    @builtin(position) position: vec4<f32>,\r\n    @location(0) _flat: u32,\r\n    @location(1) @interpolate(linear) _linear: f32,\r\n    @location(2) @interpolate(linear, centroid) linear_centroid: vec2<f32>,\r\n    @location(3) @interpolate(linear, sample) linear_sample: vec3<f32>,\r\n    @location(4) perspective: vec4<f32>,\r\n    @location(5) @interpolate(perspective, centroid) perspective_centroid: f32,\r\n    @location(6) @interpolate(perspective, sample) perspective_sample: f32,\r\n}\r\n\r\n@vertex \r\nfn vert_main() -> FragmentInput {\r\n    var out: FragmentInput;\r\n\r\n    out.position = vec4<f32>(2.0, 4.0, 5.0, 6.0);\r\n    out._flat = 8u;\r\n    out._linear = 27.0;\r\n    out.linear_centroid = vec2<f32>(64.0, 125.0);\r\n    out.linear_sample = vec3<f32>(216.0, 343.0, 512.0);\r\n    out.perspective = vec4<f32>(729.0, 1000.0, 1331.0, 1728.0);\r\n    out.perspective_centroid = 2197.0;\r\n    out.perspective_sample = 2744.0;\r\n    let _e30 = out;\r\n    return _e30;\r\n}\r\n\r\n@fragment \r\nfn frag_main(val: FragmentInput) {\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/inv-hyperbolic-trig-functions.wgsl",
    "content": "var<private> a: f32;\r\n\r\nfn main_1() {\r\n    var b: f32;\r\n    var c: f32;\r\n    var d: f32;\r\n\r\n    let _e8 = a;\r\n    b = log(_e8 + sqrt(_e8 * _e8 + 1.0));\r\n    let _e10 = a;\r\n    c = log(_e10 + sqrt(_e10 * _e10 - 1.0));\r\n    let _e12 = a;\r\n    d = 0.5 * log((1.0 + _e12) / (1.0 - _e12));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/lexical-scopes.wgsl",
    "content": "fn blockLexicalScope(a: bool) {\r\n    {\r\n        {\r\n        }\r\n        let test = (2 == 3);\r\n    }\r\n    let test_1 = (1.0 == 2.0);\r\n}\r\n\r\nfn ifLexicalScope(a_1: bool) {\r\n    if (1.0 == 1.0) {\r\n    }\r\n    let test_2 = (1.0 == 2.0);\r\n}\r\n\r\nfn loopLexicalScope(a_2: bool) {\r\n    loop {\r\n    }\r\n    let test_3 = (1.0 == 2.0);\r\n}\r\n\r\nfn forLexicalScope(a_3: f32) {\r\n    var a_4: i32 = 0;\r\n\r\n    loop {\r\n        let _e4 = a_4;\r\n        if (_e4 < 1) {\r\n        } else {\r\n            break;\r\n        }\r\n        continuing {\r\n            let _e7 = a_4;\r\n            a_4 = (_e7 + 1);\r\n        }\r\n    }\r\n    let test_4 = (false == true);\r\n}\r\n\r\nfn whileLexicalScope(a_5: i32) {\r\n    loop {\r\n        if (a_5 > 2) {\r\n        } else {\r\n            break;\r\n        }\r\n    }\r\n    let test_5 = (a_5 == 1);\r\n}\r\n\r\nfn switchLexicalScope(a_6: i32) {\r\n    switch a_6 {\r\n        case 0: {\r\n        }\r\n        case 1: {\r\n        }\r\n        default: {\r\n        }\r\n    }\r\n    let test_6 = (a_6 == 2);\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/long-form-matrix-vert.wgsl",
    "content": "fn main_1() {\r\n    var splat: mat2x2<f32>;\r\n    var normal: mat2x2<f32>;\r\n    var from_matrix: mat2x4<f32>;\r\n    var a: mat2x2<f32>;\r\n    var b: mat2x2<f32>;\r\n    var c: mat3x3<f32>;\r\n    var d: mat3x3<f32>;\r\n    var e: mat4x4<f32>;\r\n\r\n    let _e1 = f32(1);\r\n    splat = mat2x2<f32>(vec2<f32>(_e1, 0.0), vec2<f32>(0.0, _e1));\r\n    let _e9 = vec2<f32>(f32(1));\r\n    let _e12 = vec2<f32>(f32(2));\r\n    normal = mat2x2<f32>(vec2<f32>(_e9.x, _e9.y), vec2<f32>(_e12.x, _e12.y));\r\n    let _e26 = mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0));\r\n    from_matrix = mat2x4<f32>(vec4<f32>(_e26[0].x, _e26[0].y, _e26[0].z, 0.0), vec4<f32>(_e26[1].x, _e26[1].y, _e26[1].z, 0.0));\r\n    a = mat2x2<f32>(vec2<f32>(f32(1), f32(2)), vec2<f32>(f32(3), f32(4)));\r\n    let _e58 = vec2<f32>(f32(2), f32(3));\r\n    b = mat2x2<f32>(vec2<f32>(f32(1), _e58.x), vec2<f32>(_e58.y, f32(4)));\r\n    let _e73 = vec3<f32>(f32(1));\r\n    let _e76 = vec3<f32>(f32(1));\r\n    c = mat3x3<f32>(vec3<f32>(f32(1), f32(2), f32(3)), vec3<f32>(_e73.x, _e73.y, _e73.z), vec3<f32>(_e76.x, _e76.y, _e76.z));\r\n    let _e93 = vec2<f32>(f32(2));\r\n    let _e97 = vec3<f32>(f32(1));\r\n    let _e100 = vec3<f32>(f32(1));\r\n    d = mat3x3<f32>(vec3<f32>(_e93.x, _e93.y, f32(1)), vec3<f32>(_e97.x, _e97.y, _e97.z), vec3<f32>(_e100.x, _e100.y, _e100.z));\r\n    let _e117 = vec2<f32>(f32(2));\r\n    let _e120 = vec4<f32>(f32(1));\r\n    let _e123 = vec2<f32>(f32(2));\r\n    let _e126 = vec4<f32>(f32(1));\r\n    let _e129 = vec4<f32>(f32(1));\r\n    e = mat4x4<f32>(vec4<f32>(_e117.x, _e117.y, _e120.x, _e120.y), vec4<f32>(_e120.z, _e120.w, _e123.x, _e123.y), vec4<f32>(_e126.x, _e126.y, _e126.z, _e126.w), vec4<f32>(_e129.x, _e129.y, _e129.z, _e129.w));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/math-functions-vert.wgsl",
    "content": "fn main_1() {\r\n    var a: vec4<f32>;\r\n    var b: vec4<f32>;\r\n    var m: mat4x4<f32>;\r\n    var i: i32;\r\n    var ceilOut: vec4<f32>;\r\n    var roundOut: vec4<f32>;\r\n    var floorOut: vec4<f32>;\r\n    var fractOut: vec4<f32>;\r\n    var truncOut: vec4<f32>;\r\n    var sinOut: vec4<f32>;\r\n    var absOut: vec4<f32>;\r\n    var sqrtOut: vec4<f32>;\r\n    var inversesqrtOut: vec4<f32>;\r\n    var expOut: vec4<f32>;\r\n    var exp2Out: vec4<f32>;\r\n    var signOut: vec4<f32>;\r\n    var transposeOut: mat4x4<f32>;\r\n    var normalizeOut: vec4<f32>;\r\n    var sinhOut: vec4<f32>;\r\n    var cosOut: vec4<f32>;\r\n    var coshOut: vec4<f32>;\r\n    var tanOut: vec4<f32>;\r\n    var tanhOut: vec4<f32>;\r\n    var acosOut: vec4<f32>;\r\n    var asinOut: vec4<f32>;\r\n    var logOut: vec4<f32>;\r\n    var log2Out: vec4<f32>;\r\n    var lengthOut: f32;\r\n    var determinantOut: f32;\r\n    var bitCountOut: i32;\r\n    var bitfieldReverseOut: i32;\r\n    var atanOut: f32;\r\n    var atan2Out: f32;\r\n    var modOut: f32;\r\n    var powOut: vec4<f32>;\r\n    var dotOut: f32;\r\n    var maxOut: vec4<f32>;\r\n    var minOut: vec4<f32>;\r\n    var reflectOut: vec4<f32>;\r\n    var crossOut: vec3<f32>;\r\n    var outerProductOut: mat4x4<f32>;\r\n    var distanceOut: f32;\r\n    var stepOut: vec4<f32>;\r\n    var rad: vec4<f32>;\r\n    var deg: f32;\r\n    var smoothStepScalar: f32;\r\n    var smoothStepVector: vec4<f32>;\r\n    var smoothStepMixed: vec4<f32>;\r\n\r\n    a = vec4<f32>(1.0);\r\n    b = vec4<f32>(2.0);\r\n    let _e6 = a;\r\n    let _e7 = b;\r\n    let _e8 = a;\r\n    let _e9 = b;\r\n    m = mat4x4<f32>(vec4<f32>(_e6.x, _e6.y, _e6.z, _e6.w), vec4<f32>(_e7.x, _e7.y, _e7.z, _e7.w), vec4<f32>(_e8.x, _e8.y, _e8.z, _e8.w), vec4<f32>(_e9.x, _e9.y, _e9.z, _e9.w));\r\n    i = 5;\r\n    _ = a;\r\n    let _e35 = a;\r\n    ceilOut = ceil(_e35);\r\n    _ = a;\r\n    let _e39 = a;\r\n    roundOut = round(_e39);\r\n    _ = a;\r\n    let _e43 = a;\r\n    floorOut = floor(_e43);\r\n    _ = a;\r\n    let _e47 = a;\r\n    fractOut = fract(_e47);\r\n    _ = a;\r\n    let _e51 = a;\r\n    truncOut = trunc(_e51);\r\n    _ = a;\r\n    let _e55 = a;\r\n    sinOut = sin(_e55);\r\n    _ = a;\r\n    let _e59 = a;\r\n    absOut = abs(_e59);\r\n    _ = a;\r\n    let _e63 = a;\r\n    sqrtOut = sqrt(_e63);\r\n    _ = a;\r\n    let _e67 = a;\r\n    inversesqrtOut = inverseSqrt(_e67);\r\n    _ = a;\r\n    let _e71 = a;\r\n    expOut = exp(_e71);\r\n    _ = a;\r\n    let _e75 = a;\r\n    exp2Out = exp2(_e75);\r\n    _ = a;\r\n    let _e79 = a;\r\n    signOut = sign(_e79);\r\n    _ = m;\r\n    let _e83 = m;\r\n    transposeOut = transpose(_e83);\r\n    _ = a;\r\n    let _e87 = a;\r\n    normalizeOut = normalize(_e87);\r\n    _ = a;\r\n    let _e91 = a;\r\n    sinhOut = sinh(_e91);\r\n    _ = a;\r\n    let _e95 = a;\r\n    cosOut = cos(_e95);\r\n    _ = a;\r\n    let _e99 = a;\r\n    coshOut = cosh(_e99);\r\n    _ = a;\r\n    let _e103 = a;\r\n    tanOut = tan(_e103);\r\n    _ = a;\r\n    let _e107 = a;\r\n    tanhOut = tanh(_e107);\r\n    _ = a;\r\n    let _e111 = a;\r\n    acosOut = acos(_e111);\r\n    _ = a;\r\n    let _e115 = a;\r\n    asinOut = asin(_e115);\r\n    _ = a;\r\n    let _e119 = a;\r\n    logOut = log(_e119);\r\n    _ = a;\r\n    let _e123 = a;\r\n    log2Out = log2(_e123);\r\n    _ = a;\r\n    let _e127 = a;\r\n    lengthOut = length(_e127);\r\n    _ = m;\r\n    let _e131 = m;\r\n    determinantOut = determinant(_e131);\r\n    _ = i;\r\n    let _e135 = i;\r\n    bitCountOut = countOneBits(_e135);\r\n    _ = i;\r\n    let _e139 = i;\r\n    bitfieldReverseOut = reverseBits(_e139);\r\n    let _e142 = a;\r\n    _ = _e142.x;\r\n    let _e144 = a;\r\n    atanOut = atan(_e144.x);\r\n    let _e148 = a;\r\n    _ = _e148.x;\r\n    let _e150 = a;\r\n    _ = _e150.y;\r\n    let _e152 = a;\r\n    let _e154 = a;\r\n    atan2Out = atan2(_e152.x, _e154.y);\r\n    let _e158 = a;\r\n    _ = _e158.x;\r\n    let _e160 = b;\r\n    _ = _e160.x;\r\n    let _e162 = a;\r\n    let _e164 = b;\r\n    modOut = (_e162.x - (floor((_e162.x / _e164.x)) * _e164.x));\r\n    _ = a;\r\n    _ = b;\r\n    let _e173 = a;\r\n    let _e174 = b;\r\n    powOut = pow(_e173, _e174);\r\n    _ = a;\r\n    _ = b;\r\n    let _e179 = a;\r\n    let _e180 = b;\r\n    dotOut = dot(_e179, _e180);\r\n    _ = a;\r\n    _ = b;\r\n    let _e185 = a;\r\n    let _e186 = b;\r\n    maxOut = max(_e185, _e186);\r\n    _ = a;\r\n    _ = b;\r\n    let _e191 = a;\r\n    let _e192 = b;\r\n    minOut = min(_e191, _e192);\r\n    _ = a;\r\n    _ = b;\r\n    let _e197 = a;\r\n    let _e198 = b;\r\n    reflectOut = reflect(_e197, _e198);\r\n    let _e201 = a;\r\n    _ = _e201.xyz;\r\n    let _e203 = b;\r\n    _ = _e203.xyz;\r\n    let _e205 = a;\r\n    let _e207 = b;\r\n    crossOut = cross(_e205.xyz, _e207.xyz);\r\n    _ = a;\r\n    _ = b;\r\n    let _e213 = a;\r\n    let _e214 = b;\r\n    outerProductOut = outerProduct(_e213, _e214);\r\n    _ = a;\r\n    _ = b;\r\n    let _e219 = a;\r\n    let _e220 = b;\r\n    distanceOut = distance(_e219, _e220);\r\n    _ = a;\r\n    _ = b;\r\n    let _e225 = a;\r\n    let _e226 = b;\r\n    stepOut = step(_e225, _e226);\r\n    _ = a;\r\n    let _e230 = a;\r\n    rad = radians(_e230);\r\n    let _e233 = a;\r\n    _ = _e233.x;\r\n    let _e235 = a;\r\n    deg = degrees(_e235.x);\r\n    smoothStepScalar = smoothstep(0.0, 1.0, 0.5);\r\n    _ = vec4<f32>(0.0);\r\n    _ = vec4<f32>(1.0);\r\n    _ = vec4<f32>(0.5);\r\n    smoothStepVector = smoothstep(vec4<f32>(0.0), vec4<f32>(1.0), vec4<f32>(0.5));\r\n    _ = vec4<f32>(0.5);\r\n    smoothStepMixed = smoothstep(vec4<f32>(0.0), vec4<f32>(1.0), vec4<f32>(0.5));\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/math-functions.wgsl",
    "content": "@vertex \r\nfn main() {\r\n    let v = vec4<f32>(0.0);\r\n    let a = degrees(1.0);\r\n    let b = radians(1.0);\r\n    let c = degrees(v);\r\n    let d = radians(v);\r\n    let e = saturate(v);\r\n    let const_dot = dot(vec2<i32>(0, 0), vec2<i32>(0, 0));\r\n    let first_leading_bit_abs = firstLeadingBit(abs(0u));\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/multiview.wgsl",
    "content": "@vertex \r\nfn main(@builtin(view_index) view_index: i32) {\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/operators.wgsl",
    "content": "struct Foo {\r\n    a: vec4<f32>,\r\n    b: i32,\r\n}\r\n\r\nlet v_f32_one: vec4<f32> = vec4<f32>(1.0, 1.0, 1.0, 1.0);\r\nlet v_f32_zero: vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);\r\nlet v_f32_half: vec4<f32> = vec4<f32>(0.5, 0.5, 0.5, 0.5);\r\nlet v_i32_one: vec4<i32> = vec4<i32>(1, 1, 1, 1);\r\nfn builtins() -> vec4<f32> {\r\n    let s1_ = select(0, 1, true);\r\n    let s2_ = select(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), true);\r\n    let s3_ = select(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<bool>(false, false, false, false));\r\n    let m1_ = mix(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.5, 0.5, 0.5, 0.5));\r\n    let m2_ = mix(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), 0.10000000149011612);\r\n    let b1_ = bitcast<f32>(vec4<i32>(1, 1, 1, 1).x);\r\n    let b2_ = bitcast<vec4<f32>>(vec4<i32>(1, 1, 1, 1));\r\n    let v_i32_zero = vec4<i32>(vec4<f32>(0.0, 0.0, 0.0, 0.0));\r\n    return (((((vec4<f32>((vec4<i32>(s1_) + v_i32_zero)) + s2_) + m1_) + m2_) + vec4<f32>(b1_)) + b2_);\r\n}\r\n\r\nfn splat() -> vec4<f32> {\r\n    let a_2 = (((vec2<f32>(1.0) + vec2<f32>(2.0)) - vec2<f32>(3.0)) / vec2<f32>(4.0));\r\n    let b = (vec4<i32>(5) % vec4<i32>(2));\r\n    return (a_2.xyxy + vec4<f32>(b));\r\n}\r\n\r\nfn splat_assignment() -> vec2<f32> {\r\n    var a: vec2<f32>;\r\n\r\n    a = vec2<f32>(2.0);\r\n    let _e7 = a;\r\n    a = (_e7 + vec2<f32>(1.0));\r\n    let _e11 = a;\r\n    a = (_e11 - vec2<f32>(3.0));\r\n    let _e15 = a;\r\n    a = (_e15 / vec2<f32>(4.0));\r\n    let _e19 = a;\r\n    return _e19;\r\n}\r\n\r\nfn bool_cast(x: vec3<f32>) -> vec3<f32> {\r\n    let y = vec3<bool>(x);\r\n    return vec3<f32>(y);\r\n}\r\n\r\nfn constructors() -> f32 {\r\n    var foo: Foo;\r\n\r\n    foo = Foo(vec4<f32>(1.0), 1);\r\n    let mat2comp = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));\r\n    let mat4comp = mat4x4<f32>(vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 1.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));\r\n    _ = vec2<u32>(0u);\r\n    _ = mat2x2<f32>(vec2<f32>(0.0), vec2<f32>(0.0));\r\n    _ = array<i32,4u>(0, 1, 2, 3);\r\n    _ = bool(false);\r\n    _ = i32(0);\r\n    _ = u32(0u);\r\n    _ = f32(0.0);\r\n    _ = vec2<u32>(vec2<u32>(0u, 0u));\r\n    _ = mat2x3<f32>(mat2x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    _ = bitcast<vec2<u32>>(vec2<u32>(0u, 0u));\r\n    _ = mat2x3<f32>(mat2x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    let _e75 = foo.a.x;\r\n    return _e75;\r\n}\r\n\r\nfn logical() {\r\n    _ = !(true);\r\n    _ = !(vec2<bool>(true));\r\n    _ = (true || false);\r\n    _ = (true && false);\r\n    _ = (true | false);\r\n    _ = (vec3<bool>(true) | vec3<bool>(false));\r\n    _ = (true & false);\r\n    _ = (vec4<bool>(true) & vec4<bool>(false));\r\n}\r\n\r\nfn arithmetic() {\r\n    _ = -(vec2<i32>(1));\r\n    _ = -(vec2<f32>(1.0));\r\n    _ = (2 + 1);\r\n    _ = (2u + 1u);\r\n    _ = (2.0 + 1.0);\r\n    _ = (vec2<i32>(2) + vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) + vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) + vec4<f32>(1.0));\r\n    _ = (2 - 1);\r\n    _ = (2u - 1u);\r\n    _ = (2.0 - 1.0);\r\n    _ = (vec2<i32>(2) - vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) - vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) - vec4<f32>(1.0));\r\n    _ = (2 * 1);\r\n    _ = (2u * 1u);\r\n    _ = (2.0 * 1.0);\r\n    _ = (vec2<i32>(2) * vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) * vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) * vec4<f32>(1.0));\r\n    _ = (2 / 1);\r\n    _ = (2u / 1u);\r\n    _ = (2.0 / 1.0);\r\n    _ = (vec2<i32>(2) / vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) / vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) / vec4<f32>(1.0));\r\n    _ = (2 % 1);\r\n    _ = (2u % 1u);\r\n    _ = (2.0 % 1.0);\r\n    _ = (vec2<i32>(2) % vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) % vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) % vec4<f32>(1.0));\r\n    _ = (vec2<i32>(2) + vec2<i32>(1));\r\n    _ = (vec2<i32>(2) + vec2<i32>(1));\r\n    _ = (vec2<u32>(2u) + vec2<u32>(1u));\r\n    _ = (vec2<u32>(2u) + vec2<u32>(1u));\r\n    _ = (vec2<f32>(2.0) + vec2<f32>(1.0));\r\n    _ = (vec2<f32>(2.0) + vec2<f32>(1.0));\r\n    _ = (vec2<i32>(2) - vec2<i32>(1));\r\n    _ = (vec2<i32>(2) - vec2<i32>(1));\r\n    _ = (vec2<u32>(2u) - vec2<u32>(1u));\r\n    _ = (vec2<u32>(2u) - vec2<u32>(1u));\r\n    _ = (vec2<f32>(2.0) - vec2<f32>(1.0));\r\n    _ = (vec2<f32>(2.0) - vec2<f32>(1.0));\r\n    _ = (vec2<i32>(2) * 1);\r\n    _ = (2 * vec2<i32>(1));\r\n    _ = (vec2<u32>(2u) * 1u);\r\n    _ = (2u * vec2<u32>(1u));\r\n    _ = (vec2<f32>(2.0) * 1.0);\r\n    _ = (2.0 * vec2<f32>(1.0));\r\n    _ = (vec2<i32>(2) / vec2<i32>(1));\r\n    _ = (vec2<i32>(2) / vec2<i32>(1));\r\n    _ = (vec2<u32>(2u) / vec2<u32>(1u));\r\n    _ = (vec2<u32>(2u) / vec2<u32>(1u));\r\n    _ = (vec2<f32>(2.0) / vec2<f32>(1.0));\r\n    _ = (vec2<f32>(2.0) / vec2<f32>(1.0));\r\n    _ = (vec2<i32>(2) % vec2<i32>(1));\r\n    _ = (vec2<i32>(2) % vec2<i32>(1));\r\n    _ = (vec2<u32>(2u) % vec2<u32>(1u));\r\n    _ = (vec2<u32>(2u) % vec2<u32>(1u));\r\n    _ = (vec2<f32>(2.0) % vec2<f32>(1.0));\r\n    _ = (vec2<f32>(2.0) % vec2<f32>(1.0));\r\n    _ = (mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)) + mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    _ = (mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)) - mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    _ = (mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)) * 1.0);\r\n    _ = (2.0 * mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    _ = (mat4x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)) * vec4<f32>(1.0));\r\n    _ = (vec3<f32>(2.0) * mat4x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));\r\n    _ = (mat4x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)) * mat3x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0)));\r\n}\r\n\r\nfn bit() {\r\n    _ = ~(1);\r\n    _ = ~(1u);\r\n    _ = !(vec2<i32>(1));\r\n    _ = !(vec3<u32>(1u));\r\n    _ = (2 | 1);\r\n    _ = (2u | 1u);\r\n    _ = (vec2<i32>(2) | vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) | vec3<u32>(1u));\r\n    _ = (2 & 1);\r\n    _ = (2u & 1u);\r\n    _ = (vec2<i32>(2) & vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) & vec3<u32>(1u));\r\n    _ = (2 ^ 1);\r\n    _ = (2u ^ 1u);\r\n    _ = (vec2<i32>(2) ^ vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) ^ vec3<u32>(1u));\r\n    _ = (2 << 1u);\r\n    _ = (2u << 1u);\r\n    _ = (vec2<i32>(2) << vec2<u32>(1u));\r\n    _ = (vec3<u32>(2u) << vec3<u32>(1u));\r\n    _ = (2 >> 1u);\r\n    _ = (2u >> 1u);\r\n    _ = (vec2<i32>(2) >> vec2<u32>(1u));\r\n    _ = (vec3<u32>(2u) >> vec3<u32>(1u));\r\n}\r\n\r\nfn comparison() {\r\n    _ = (2 == 1);\r\n    _ = (2u == 1u);\r\n    _ = (2.0 == 1.0);\r\n    _ = (vec2<i32>(2) == vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) == vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) == vec4<f32>(1.0));\r\n    _ = (2 != 1);\r\n    _ = (2u != 1u);\r\n    _ = (2.0 != 1.0);\r\n    _ = (vec2<i32>(2) != vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) != vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) != vec4<f32>(1.0));\r\n    _ = (2 < 1);\r\n    _ = (2u < 1u);\r\n    _ = (2.0 < 1.0);\r\n    _ = (vec2<i32>(2) < vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) < vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) < vec4<f32>(1.0));\r\n    _ = (2 <= 1);\r\n    _ = (2u <= 1u);\r\n    _ = (2.0 <= 1.0);\r\n    _ = (vec2<i32>(2) <= vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) <= vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) <= vec4<f32>(1.0));\r\n    _ = (2 > 1);\r\n    _ = (2u > 1u);\r\n    _ = (2.0 > 1.0);\r\n    _ = (vec2<i32>(2) > vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) > vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) > vec4<f32>(1.0));\r\n    _ = (2 >= 1);\r\n    _ = (2u >= 1u);\r\n    _ = (2.0 >= 1.0);\r\n    _ = (vec2<i32>(2) >= vec2<i32>(1));\r\n    _ = (vec3<u32>(2u) >= vec3<u32>(1u));\r\n    _ = (vec4<f32>(2.0) >= vec4<f32>(1.0));\r\n}\r\n\r\nfn assignment() {\r\n    var a_1: i32 = 1;\r\n    var vec0_: vec3<i32> = vec3<i32>(0, 0, 0);\r\n\r\n    let _e6 = a_1;\r\n    a_1 = (_e6 + 1);\r\n    let _e9 = a_1;\r\n    a_1 = (_e9 - 1);\r\n    let _e12 = a_1;\r\n    let _e13 = a_1;\r\n    a_1 = (_e12 * _e13);\r\n    let _e15 = a_1;\r\n    let _e16 = a_1;\r\n    a_1 = (_e15 / _e16);\r\n    let _e18 = a_1;\r\n    a_1 = (_e18 % 1);\r\n    let _e21 = a_1;\r\n    a_1 = (_e21 & 0);\r\n    let _e24 = a_1;\r\n    a_1 = (_e24 | 0);\r\n    let _e27 = a_1;\r\n    a_1 = (_e27 ^ 0);\r\n    let _e30 = a_1;\r\n    a_1 = (_e30 << 2u);\r\n    let _e33 = a_1;\r\n    a_1 = (_e33 >> 1u);\r\n    let _e36 = a_1;\r\n    a_1 = (_e36 + 1);\r\n    let _e39 = a_1;\r\n    a_1 = (_e39 - 1);\r\n    let _e46 = vec0_.y;\r\n    vec0_.y = (_e46 + 1);\r\n    let _e51 = vec0_.y;\r\n    vec0_.y = (_e51 - 1);\r\n    return;\r\n}\r\n\r\n@compute @workgroup_size(1, 1, 1) \r\nfn main() {\r\n    let _e4 = builtins();\r\n    let _e5 = splat();\r\n    let _e7 = bool_cast(vec4<f32>(1.0, 1.0, 1.0, 1.0).xyz);\r\n    let _e8 = constructors();\r\n    logical();\r\n    arithmetic();\r\n    bit();\r\n    comparison();\r\n    assignment();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/padding.wgsl",
    "content": "struct S {\r\n    a: vec3<f32>,\r\n}\r\n\r\nstruct Test {\r\n    a: S,\r\n    b: f32,\r\n}\r\n\r\nstruct Test2_ {\r\n    a: array<vec3<f32>,2>,\r\n    b: f32,\r\n}\r\n\r\nstruct Test3_ {\r\n    a: mat4x3<f32>,\r\n    b: f32,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<uniform> input1_: Test;\r\n@group(0) @binding(1) \r\nvar<uniform> input2_: Test2_;\r\n@group(0) @binding(2) \r\nvar<uniform> input3_: Test3_;\r\n\r\n@vertex \r\nfn vertex() -> @builtin(position) vec4<f32> {\r\n    let _e6 = input1_.b;\r\n    let _e9 = input2_.b;\r\n    let _e12 = input3_.b;\r\n    return (((vec4<f32>(1.0) * _e6) * _e9) * _e12);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/pointers.wgsl",
    "content": "struct DynamicArray {\r\n    arr: array<u32>,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<storage, read_write> dynamic_array: DynamicArray;\r\n\r\nfn f() {\r\n    var v: vec2<i32>;\r\n\r\n    let px = (&v.x);\r\n    (*px) = 10;\r\n    return;\r\n}\r\n\r\nfn index_unsized(i: i32, v_1: u32) {\r\n    let val = dynamic_array.arr[i];\r\n    dynamic_array.arr[i] = (val + v_1);\r\n    return;\r\n}\r\n\r\nfn index_dynamic_array(i_1: i32, v_2: u32) {\r\n    let p = (&dynamic_array.arr);\r\n    let val_1 = (*p)[i_1];\r\n    (*p)[i_1] = (val_1 + v_2);\r\n    return;\r\n}\r\n\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/prepostfix-frag.wgsl",
    "content": "fn main_1() {\r\n    var scalar_target: i32;\r\n    var scalar: i32;\r\n    var vec_target: vec2<u32>;\r\n    var vec_: vec2<u32>;\r\n    var mat_target: mat4x3<f32>;\r\n    var mat_: mat4x3<f32>;\r\n\r\n    scalar = 1;\r\n    let _e3 = scalar;\r\n    scalar = (_e3 + 1);\r\n    scalar_target = _e3;\r\n    let _e6 = scalar;\r\n    let _e8 = (_e6 - 1);\r\n    scalar = _e8;\r\n    scalar_target = _e8;\r\n    vec_ = vec2<u32>(u32(1));\r\n    let _e14 = vec_;\r\n    vec_ = (_e14 - vec2<u32>(1u));\r\n    vec_target = _e14;\r\n    let _e18 = vec_;\r\n    let _e21 = (_e18 + vec2<u32>(1u));\r\n    vec_ = _e21;\r\n    vec_target = _e21;\r\n    let _e24 = f32(1);\r\n    mat_ = mat4x3<f32>(vec3<f32>(_e24, 0.0, 0.0), vec3<f32>(0.0, _e24, 0.0), vec3<f32>(0.0, 0.0, _e24), vec3<f32>(0.0, 0.0, 0.0));\r\n    let _e32 = mat_;\r\n    let _e34 = vec3<f32>(1.0);\r\n    mat_ = (_e32 + mat4x3<f32>(_e34, _e34, _e34, _e34));\r\n    mat_target = _e32;\r\n    let _e37 = mat_;\r\n    let _e39 = vec3<f32>(1.0);\r\n    let _e41 = (_e37 - mat4x3<f32>(_e39, _e39, _e39, _e39));\r\n    mat_ = _e41;\r\n    mat_target = _e41;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/quad-vert.wgsl",
    "content": "struct gl_PerVertex {\r\n    @builtin(position) gl_Position: vec4<f32>,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @location(0) member: vec2<f32>,\r\n    @builtin(position) gl_Position: vec4<f32>,\r\n}\r\n\r\nvar<private> v_uv: vec2<f32>;\r\nvar<private> a_uv_1: vec2<f32>;\r\nvar<private> perVertexStruct: gl_PerVertex = gl_PerVertex(vec4<f32>(0.0, 0.0, 0.0, 1.0), );\r\nvar<private> a_pos_1: vec2<f32>;\r\n\r\nfn main_1() {\r\n    let _e12 = a_uv_1;\r\n    v_uv = _e12;\r\n    let _e13 = a_pos_1;\r\n    perVertexStruct.gl_Position = vec4<f32>(_e13.x, _e13.y, 0.0, 1.0);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(1) a_uv: vec2<f32>, @location(0) a_pos: vec2<f32>) -> VertexOutput {\r\n    a_uv_1 = a_uv;\r\n    a_pos_1 = a_pos;\r\n    main_1();\r\n    let _e7 = v_uv;\r\n    let _e8 = perVertexStruct.gl_Position;\r\n    return VertexOutput(_e7, _e8);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/quad.wgsl",
    "content": "struct VertexOutput {\r\n    @location(0) uv: vec2<f32>,\r\n    @builtin(position) position: vec4<f32>,\r\n}\r\n\r\nlet c_scale: f32 = 1.2000000476837158;\r\n\r\n@group(0) @binding(0) \r\nvar u_texture: texture_2d<f32>;\r\n@group(0) @binding(1) \r\nvar u_sampler: sampler;\r\n\r\n@vertex \r\nfn vert_main(@location(0) pos: vec2<f32>, @location(1) uv: vec2<f32>) -> VertexOutput {\r\n    return VertexOutput(uv, vec4<f32>((c_scale * pos), 0.0, 1.0));\r\n}\r\n\r\n@fragment \r\nfn frag_main(@location(0) uv_1: vec2<f32>) -> @location(0) vec4<f32> {\r\n    let color = textureSample(u_texture, u_sampler, uv_1);\r\n    if (color.w == 0.0) {\r\n        discard;\r\n    }\r\n    let premultiplied = (color.w * color);\r\n    return premultiplied;\r\n}\r\n\r\n@fragment \r\nfn fs_extra() -> @location(0) vec4<f32> {\r\n    return vec4<f32>(0.0, 0.5, 0.0, 0.5);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/quad_glsl-frag.wgsl",
    "content": "struct FragmentOutput {\r\n    @location(0) o_color: vec4<f32>,\r\n}\r\n\r\nvar<private> v_uv_1: vec2<f32>;\r\nvar<private> o_color: vec4<f32>;\r\n\r\nfn main_1() {\r\n    o_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main(@location(0) v_uv: vec2<f32>) -> FragmentOutput {\r\n    v_uv_1 = v_uv;\r\n    main_1();\r\n    let _e7 = o_color;\r\n    return FragmentOutput(_e7);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/quad_glsl-vert.wgsl",
    "content": "struct VertexOutput {\r\n    @location(0) v_uv: vec2<f32>,\r\n    @builtin(position) member: vec4<f32>,\r\n}\r\n\r\nvar<private> a_pos_1: vec2<f32>;\r\nvar<private> a_uv_1: vec2<f32>;\r\nvar<private> v_uv: vec2<f32>;\r\nvar<private> gl_Position: vec4<f32>;\r\n\r\nfn main_1() {\r\n    let _e4 = a_uv_1;\r\n    v_uv = _e4;\r\n    let _e6 = a_pos_1;\r\n    let _e7 = (1.2000000476837158 * _e6);\r\n    gl_Position = vec4<f32>(_e7.x, _e7.y, 0.0, 1.0);\r\n    return;\r\n}\r\n\r\n@vertex \r\nfn main(@location(0) a_pos: vec2<f32>, @location(1) a_uv: vec2<f32>) -> VertexOutput {\r\n    a_pos_1 = a_pos;\r\n    a_uv_1 = a_uv;\r\n    main_1();\r\n    let _e14 = v_uv;\r\n    let _e16 = gl_Position;\r\n    return VertexOutput(_e14, _e16);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/sampler-functions-frag.wgsl",
    "content": "fn CalcShadowPCF1_(T_P_t_TextureDepth: texture_depth_2d, S_P_t_TextureDepth: sampler_comparison, t_ProjCoord: vec3<f32>) -> f32 {\r\n    var t_ProjCoord_1: vec3<f32>;\r\n    var t_Res: f32;\r\n\r\n    t_ProjCoord_1 = t_ProjCoord;\r\n    t_Res = 0.0;\r\n    let _e6 = t_Res;\r\n    let _e7 = t_ProjCoord_1;\r\n    _ = _e7.xyz;\r\n    let _e9 = t_ProjCoord_1;\r\n    let _e10 = _e9.xyz;\r\n    let _e13 = textureSampleCompare(T_P_t_TextureDepth, S_P_t_TextureDepth, _e10.xy, _e10.z);\r\n    t_Res = (_e6 + (_e13 * (1.0 / 5.0)));\r\n    let _e19 = t_Res;\r\n    return _e19;\r\n}\r\n\r\nfn CalcShadowPCF(T_P_t_TextureDepth_1: texture_depth_2d, S_P_t_TextureDepth_1: sampler_comparison, t_ProjCoord_2: vec3<f32>, t_Bias: f32) -> f32 {\r\n    var t_ProjCoord_3: vec3<f32>;\r\n    var t_Bias_1: f32;\r\n\r\n    t_ProjCoord_3 = t_ProjCoord_2;\r\n    t_Bias_1 = t_Bias;\r\n    let _e7 = t_ProjCoord_3;\r\n    let _e9 = t_Bias_1;\r\n    t_ProjCoord_3.z = (_e7.z + _e9);\r\n    let _e11 = t_ProjCoord_3;\r\n    _ = _e11.xyz;\r\n    let _e13 = t_ProjCoord_3;\r\n    let _e15 = CalcShadowPCF1_(T_P_t_TextureDepth_1, S_P_t_TextureDepth_1, _e13.xyz);\r\n    return _e15;\r\n}\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/samplers-frag.wgsl",
    "content": "@group(1) @binding(0) \r\nvar tex1D: texture_1d<f32>;\r\n@group(1) @binding(1) \r\nvar tex1DArray: texture_1d_array<f32>;\r\n@group(1) @binding(2) \r\nvar tex2D: texture_2d<f32>;\r\n@group(1) @binding(3) \r\nvar tex2DArray: texture_2d_array<f32>;\r\n@group(1) @binding(4) \r\nvar texCube: texture_cube<f32>;\r\n@group(1) @binding(5) \r\nvar texCubeArray: texture_cube_array<f32>;\r\n@group(1) @binding(6) \r\nvar tex3D: texture_3d<f32>;\r\n@group(1) @binding(7) \r\nvar samp: sampler;\r\n@group(1) @binding(12) \r\nvar tex2DShadow: texture_depth_2d;\r\n@group(1) @binding(13) \r\nvar tex2DArrayShadow: texture_depth_2d_array;\r\n@group(1) @binding(14) \r\nvar texCubeShadow: texture_depth_cube;\r\n@group(1) @binding(15) \r\nvar texCubeArrayShadow: texture_depth_cube_array;\r\n@group(1) @binding(16) \r\nvar tex3DShadow: texture_3d<f32>;\r\n@group(1) @binding(17) \r\nvar sampShadow: sampler_comparison;\r\n@group(0) @binding(18) \r\nvar tex2DMS: texture_multisampled_2d<f32>;\r\n@group(0) @binding(19) \r\nvar tex2DMSArray: texture_multisampled_2d_array<f32>;\r\n\r\nfn testTex1D(coord: f32) {\r\n    var coord_1: f32;\r\n    var size1D: i32;\r\n    var c: vec4<f32>;\r\n\r\n    coord_1 = coord;\r\n    let _e20 = textureDimensions(tex1D, 0);\r\n    size1D = _e20;\r\n    _ = coord_1;\r\n    let _e24 = coord_1;\r\n    let _e25 = textureSample(tex1D, samp, _e24);\r\n    c = _e25;\r\n    _ = coord_1;\r\n    let _e28 = coord_1;\r\n    let _e30 = textureSampleBias(tex1D, samp, _e28, 2.0);\r\n    c = _e30;\r\n    _ = coord_1;\r\n    let _e34 = coord_1;\r\n    let _e37 = textureSampleGrad(tex1D, samp, _e34, 4.0, 4.0);\r\n    c = _e37;\r\n    _ = coord_1;\r\n    let _e42 = coord_1;\r\n    let _e46 = textureSampleGrad(tex1D, samp, _e42, 4.0, 4.0, 5);\r\n    c = _e46;\r\n    _ = coord_1;\r\n    let _e49 = coord_1;\r\n    let _e51 = textureSampleLevel(tex1D, samp, _e49, 3.0);\r\n    c = _e51;\r\n    _ = coord_1;\r\n    let _e55 = coord_1;\r\n    let _e58 = textureSampleLevel(tex1D, samp, _e55, 3.0, 5);\r\n    c = _e58;\r\n    _ = coord_1;\r\n    let _e61 = coord_1;\r\n    let _e63 = textureSample(tex1D, samp, _e61, 5);\r\n    c = _e63;\r\n    _ = coord_1;\r\n    let _e67 = coord_1;\r\n    let _e70 = textureSampleBias(tex1D, samp, _e67, 2.0, 5);\r\n    c = _e70;\r\n    let _e71 = coord_1;\r\n    _ = vec2<f32>(_e71, 6.0);\r\n    let _e74 = coord_1;\r\n    let _e76 = vec2<f32>(_e74, 6.0);\r\n    let _e80 = textureSample(tex1D, samp, (_e76.x / _e76.y));\r\n    c = _e80;\r\n    let _e81 = coord_1;\r\n    _ = vec4<f32>(_e81, 0.0, 0.0, 6.0);\r\n    let _e86 = coord_1;\r\n    let _e90 = vec4<f32>(_e86, 0.0, 0.0, 6.0);\r\n    let _e96 = textureSample(tex1D, samp, (_e90.xyz / vec3<f32>(_e90.w)).x);\r\n    c = _e96;\r\n    let _e97 = coord_1;\r\n    _ = vec2<f32>(_e97, 6.0);\r\n    let _e101 = coord_1;\r\n    let _e103 = vec2<f32>(_e101, 6.0);\r\n    let _e108 = textureSampleBias(tex1D, samp, (_e103.x / _e103.y), 2.0);\r\n    c = _e108;\r\n    let _e109 = coord_1;\r\n    _ = vec4<f32>(_e109, 0.0, 0.0, 6.0);\r\n    let _e115 = coord_1;\r\n    let _e119 = vec4<f32>(_e115, 0.0, 0.0, 6.0);\r\n    let _e126 = textureSampleBias(tex1D, samp, (_e119.xyz / vec3<f32>(_e119.w)).x, 2.0);\r\n    c = _e126;\r\n    let _e127 = coord_1;\r\n    _ = vec2<f32>(_e127, 6.0);\r\n    let _e132 = coord_1;\r\n    let _e134 = vec2<f32>(_e132, 6.0);\r\n    let _e140 = textureSampleGrad(tex1D, samp, (_e134.x / _e134.y), 4.0, 4.0);\r\n    c = _e140;\r\n    let _e141 = coord_1;\r\n    _ = vec4<f32>(_e141, 0.0, 0.0, 6.0);\r\n    let _e148 = coord_1;\r\n    let _e152 = vec4<f32>(_e148, 0.0, 0.0, 6.0);\r\n    let _e160 = textureSampleGrad(tex1D, samp, (_e152.xyz / vec3<f32>(_e152.w)).x, 4.0, 4.0);\r\n    c = _e160;\r\n    let _e161 = coord_1;\r\n    _ = vec2<f32>(_e161, 6.0);\r\n    let _e167 = coord_1;\r\n    let _e169 = vec2<f32>(_e167, 6.0);\r\n    let _e176 = textureSampleGrad(tex1D, samp, (_e169.x / _e169.y), 4.0, 4.0, 5);\r\n    c = _e176;\r\n    let _e177 = coord_1;\r\n    _ = vec4<f32>(_e177, 0.0, 0.0, 6.0);\r\n    let _e185 = coord_1;\r\n    let _e189 = vec4<f32>(_e185, 0.0, 0.0, 6.0);\r\n    let _e198 = textureSampleGrad(tex1D, samp, (_e189.xyz / vec3<f32>(_e189.w)).x, 4.0, 4.0, 5);\r\n    c = _e198;\r\n    let _e199 = coord_1;\r\n    _ = vec2<f32>(_e199, 6.0);\r\n    let _e203 = coord_1;\r\n    let _e205 = vec2<f32>(_e203, 6.0);\r\n    let _e210 = textureSampleLevel(tex1D, samp, (_e205.x / _e205.y), 3.0);\r\n    c = _e210;\r\n    let _e211 = coord_1;\r\n    _ = vec4<f32>(_e211, 0.0, 0.0, 6.0);\r\n    let _e217 = coord_1;\r\n    let _e221 = vec4<f32>(_e217, 0.0, 0.0, 6.0);\r\n    let _e228 = textureSampleLevel(tex1D, samp, (_e221.xyz / vec3<f32>(_e221.w)).x, 3.0);\r\n    c = _e228;\r\n    let _e229 = coord_1;\r\n    _ = vec2<f32>(_e229, 6.0);\r\n    let _e234 = coord_1;\r\n    let _e236 = vec2<f32>(_e234, 6.0);\r\n    let _e242 = textureSampleLevel(tex1D, samp, (_e236.x / _e236.y), 3.0, 5);\r\n    c = _e242;\r\n    let _e243 = coord_1;\r\n    _ = vec4<f32>(_e243, 0.0, 0.0, 6.0);\r\n    let _e250 = coord_1;\r\n    let _e254 = vec4<f32>(_e250, 0.0, 0.0, 6.0);\r\n    let _e262 = textureSampleLevel(tex1D, samp, (_e254.xyz / vec3<f32>(_e254.w)).x, 3.0, 5);\r\n    c = _e262;\r\n    let _e263 = coord_1;\r\n    _ = vec2<f32>(_e263, 6.0);\r\n    let _e267 = coord_1;\r\n    let _e269 = vec2<f32>(_e267, 6.0);\r\n    let _e274 = textureSample(tex1D, samp, (_e269.x / _e269.y), 5);\r\n    c = _e274;\r\n    let _e275 = coord_1;\r\n    _ = vec4<f32>(_e275, 0.0, 0.0, 6.0);\r\n    let _e281 = coord_1;\r\n    let _e285 = vec4<f32>(_e281, 0.0, 0.0, 6.0);\r\n    let _e292 = textureSample(tex1D, samp, (_e285.xyz / vec3<f32>(_e285.w)).x, 5);\r\n    c = _e292;\r\n    let _e293 = coord_1;\r\n    _ = vec2<f32>(_e293, 6.0);\r\n    let _e298 = coord_1;\r\n    let _e300 = vec2<f32>(_e298, 6.0);\r\n    let _e306 = textureSampleBias(tex1D, samp, (_e300.x / _e300.y), 2.0, 5);\r\n    c = _e306;\r\n    let _e307 = coord_1;\r\n    _ = vec4<f32>(_e307, 0.0, 0.0, 6.0);\r\n    let _e314 = coord_1;\r\n    let _e318 = vec4<f32>(_e314, 0.0, 0.0, 6.0);\r\n    let _e326 = textureSampleBias(tex1D, samp, (_e318.xyz / vec3<f32>(_e318.w)).x, 2.0, 5);\r\n    c = _e326;\r\n    let _e327 = coord_1;\r\n    _ = i32(_e327);\r\n    let _e330 = coord_1;\r\n    let _e333 = textureLoad(tex1D, i32(_e330), 3);\r\n    c = _e333;\r\n    let _e334 = coord_1;\r\n    _ = i32(_e334);\r\n    let _e338 = coord_1;\r\n    let _e342 = textureLoad(tex1D, i32(_e338), 3);\r\n    c = _e342;\r\n    return;\r\n}\r\n\r\nfn testTex1DArray(coord_2: vec2<f32>) {\r\n    var coord_3: vec2<f32>;\r\n    var size1DArray: vec2<i32>;\r\n    var c_1: vec4<f32>;\r\n\r\n    coord_3 = coord_2;\r\n    let _e20 = textureDimensions(tex1DArray, 0);\r\n    let _e21 = textureNumLayers(tex1DArray);\r\n    size1DArray = vec2<i32>(_e20, _e21);\r\n    _ = coord_3;\r\n    let _e26 = coord_3;\r\n    let _e30 = textureSample(tex1DArray, samp, _e26.x, i32(_e26.y));\r\n    c_1 = _e30;\r\n    _ = coord_3;\r\n    let _e33 = coord_3;\r\n    let _e38 = textureSampleBias(tex1DArray, samp, _e33.x, i32(_e33.y), 2.0);\r\n    c_1 = _e38;\r\n    _ = coord_3;\r\n    let _e42 = coord_3;\r\n    let _e48 = textureSampleGrad(tex1DArray, samp, _e42.x, i32(_e42.y), 4.0, 4.0);\r\n    c_1 = _e48;\r\n    _ = coord_3;\r\n    let _e53 = coord_3;\r\n    let _e60 = textureSampleGrad(tex1DArray, samp, _e53.x, i32(_e53.y), 4.0, 4.0, 5);\r\n    c_1 = _e60;\r\n    _ = coord_3;\r\n    let _e63 = coord_3;\r\n    let _e68 = textureSampleLevel(tex1DArray, samp, _e63.x, i32(_e63.y), 3.0);\r\n    c_1 = _e68;\r\n    _ = coord_3;\r\n    let _e72 = coord_3;\r\n    let _e78 = textureSampleLevel(tex1DArray, samp, _e72.x, i32(_e72.y), 3.0, 5);\r\n    c_1 = _e78;\r\n    _ = coord_3;\r\n    let _e81 = coord_3;\r\n    let _e86 = textureSample(tex1DArray, samp, _e81.x, i32(_e81.y), 5);\r\n    c_1 = _e86;\r\n    _ = coord_3;\r\n    let _e90 = coord_3;\r\n    let _e96 = textureSampleBias(tex1DArray, samp, _e90.x, i32(_e90.y), 2.0, 5);\r\n    c_1 = _e96;\r\n    let _e97 = coord_3;\r\n    _ = vec2<i32>(_e97);\r\n    let _e100 = coord_3;\r\n    let _e101 = vec2<i32>(_e100);\r\n    let _e105 = textureLoad(tex1DArray, _e101.x, _e101.y, 3);\r\n    c_1 = _e105;\r\n    let _e106 = coord_3;\r\n    _ = vec2<i32>(_e106);\r\n    let _e110 = coord_3;\r\n    let _e111 = vec2<i32>(_e110);\r\n    let _e116 = textureLoad(tex1DArray, _e111.x, _e111.y, 3);\r\n    c_1 = _e116;\r\n    return;\r\n}\r\n\r\nfn testTex2D(coord_4: vec2<f32>) {\r\n    var coord_5: vec2<f32>;\r\n    var size2D: vec2<i32>;\r\n    var c_2: vec4<f32>;\r\n\r\n    coord_5 = coord_4;\r\n    let _e20 = textureDimensions(tex2D, 0);\r\n    size2D = _e20;\r\n    _ = coord_5;\r\n    let _e24 = coord_5;\r\n    let _e25 = textureSample(tex2D, samp, _e24);\r\n    c_2 = _e25;\r\n    _ = coord_5;\r\n    let _e28 = coord_5;\r\n    let _e30 = textureSampleBias(tex2D, samp, _e28, 2.0);\r\n    c_2 = _e30;\r\n    _ = coord_5;\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e36 = coord_5;\r\n    let _e41 = textureSampleGrad(tex2D, samp, _e36, vec2<f32>(4.0), vec2<f32>(4.0));\r\n    c_2 = _e41;\r\n    _ = coord_5;\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e49 = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e56 = textureSampleGrad(tex2D, samp, _e49, vec2<f32>(4.0), vec2<f32>(4.0), vec2<i32>(5, 5));\r\n    c_2 = _e56;\r\n    _ = coord_5;\r\n    let _e59 = coord_5;\r\n    let _e61 = textureSampleLevel(tex2D, samp, _e59, 3.0);\r\n    c_2 = _e61;\r\n    _ = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e66 = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e70 = textureSampleLevel(tex2D, samp, _e66, 3.0, vec2<i32>(5, 5));\r\n    c_2 = _e70;\r\n    _ = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e74 = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e77 = textureSample(tex2D, samp, _e74, vec2<i32>(5, 5));\r\n    c_2 = _e77;\r\n    _ = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e82 = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e86 = textureSampleBias(tex2D, samp, _e82, 2.0, vec2<i32>(5, 5));\r\n    c_2 = _e86;\r\n    let _e87 = coord_5;\r\n    _ = vec3<f32>(_e87.x, _e87.y, 6.0);\r\n    let _e92 = coord_5;\r\n    let _e96 = vec3<f32>(_e92.x, _e92.y, 6.0);\r\n    let _e101 = textureSample(tex2D, samp, (_e96.xy / vec2<f32>(_e96.z)));\r\n    c_2 = _e101;\r\n    let _e102 = coord_5;\r\n    _ = vec4<f32>(_e102.x, _e102.y, 0.0, 6.0);\r\n    let _e108 = coord_5;\r\n    let _e113 = vec4<f32>(_e108.x, _e108.y, 0.0, 6.0);\r\n    let _e119 = textureSample(tex2D, samp, (_e113.xyz / vec3<f32>(_e113.w)).xy);\r\n    c_2 = _e119;\r\n    let _e120 = coord_5;\r\n    _ = vec3<f32>(_e120.x, _e120.y, 6.0);\r\n    let _e126 = coord_5;\r\n    let _e130 = vec3<f32>(_e126.x, _e126.y, 6.0);\r\n    let _e136 = textureSampleBias(tex2D, samp, (_e130.xy / vec2<f32>(_e130.z)), 2.0);\r\n    c_2 = _e136;\r\n    let _e137 = coord_5;\r\n    _ = vec4<f32>(_e137.x, _e137.y, 0.0, 6.0);\r\n    let _e144 = coord_5;\r\n    let _e149 = vec4<f32>(_e144.x, _e144.y, 0.0, 6.0);\r\n    let _e156 = textureSampleBias(tex2D, samp, (_e149.xyz / vec3<f32>(_e149.w)).xy, 2.0);\r\n    c_2 = _e156;\r\n    let _e157 = coord_5;\r\n    _ = vec3<f32>(_e157.x, _e157.y, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e166 = coord_5;\r\n    let _e170 = vec3<f32>(_e166.x, _e166.y, 6.0);\r\n    let _e179 = textureSampleGrad(tex2D, samp, (_e170.xy / vec2<f32>(_e170.z)), vec2<f32>(4.0), vec2<f32>(4.0));\r\n    c_2 = _e179;\r\n    let _e180 = coord_5;\r\n    _ = vec4<f32>(_e180.x, _e180.y, 0.0, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e190 = coord_5;\r\n    let _e195 = vec4<f32>(_e190.x, _e190.y, 0.0, 6.0);\r\n    let _e205 = textureSampleGrad(tex2D, samp, (_e195.xyz / vec3<f32>(_e195.w)).xy, vec2<f32>(4.0), vec2<f32>(4.0));\r\n    c_2 = _e205;\r\n    let _e206 = coord_5;\r\n    _ = vec3<f32>(_e206.x, _e206.y, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e217 = coord_5;\r\n    let _e221 = vec3<f32>(_e217.x, _e217.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e232 = textureSampleGrad(tex2D, samp, (_e221.xy / vec2<f32>(_e221.z)), vec2<f32>(4.0), vec2<f32>(4.0), vec2<i32>(5, 5));\r\n    c_2 = _e232;\r\n    let _e233 = coord_5;\r\n    _ = vec4<f32>(_e233.x, _e233.y, 0.0, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e245 = coord_5;\r\n    let _e250 = vec4<f32>(_e245.x, _e245.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e262 = textureSampleGrad(tex2D, samp, (_e250.xyz / vec3<f32>(_e250.w)).xy, vec2<f32>(4.0), vec2<f32>(4.0), vec2<i32>(5, 5));\r\n    c_2 = _e262;\r\n    let _e263 = coord_5;\r\n    _ = vec3<f32>(_e263.x, _e263.y, 6.0);\r\n    let _e269 = coord_5;\r\n    let _e273 = vec3<f32>(_e269.x, _e269.y, 6.0);\r\n    let _e279 = textureSampleLevel(tex2D, samp, (_e273.xy / vec2<f32>(_e273.z)), 3.0);\r\n    c_2 = _e279;\r\n    let _e280 = coord_5;\r\n    _ = vec4<f32>(_e280.x, _e280.y, 0.0, 6.0);\r\n    let _e287 = coord_5;\r\n    let _e292 = vec4<f32>(_e287.x, _e287.y, 0.0, 6.0);\r\n    let _e299 = textureSampleLevel(tex2D, samp, (_e292.xyz / vec3<f32>(_e292.w)).xy, 3.0);\r\n    c_2 = _e299;\r\n    let _e300 = coord_5;\r\n    _ = vec3<f32>(_e300.x, _e300.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e308 = coord_5;\r\n    let _e312 = vec3<f32>(_e308.x, _e308.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e320 = textureSampleLevel(tex2D, samp, (_e312.xy / vec2<f32>(_e312.z)), 3.0, vec2<i32>(5, 5));\r\n    c_2 = _e320;\r\n    let _e321 = coord_5;\r\n    _ = vec4<f32>(_e321.x, _e321.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e330 = coord_5;\r\n    let _e335 = vec4<f32>(_e330.x, _e330.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e344 = textureSampleLevel(tex2D, samp, (_e335.xyz / vec3<f32>(_e335.w)).xy, 3.0, vec2<i32>(5, 5));\r\n    c_2 = _e344;\r\n    let _e345 = coord_5;\r\n    _ = vec3<f32>(_e345.x, _e345.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e352 = coord_5;\r\n    let _e356 = vec3<f32>(_e352.x, _e352.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e363 = textureSample(tex2D, samp, (_e356.xy / vec2<f32>(_e356.z)), vec2<i32>(5, 5));\r\n    c_2 = _e363;\r\n    let _e364 = coord_5;\r\n    _ = vec4<f32>(_e364.x, _e364.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e372 = coord_5;\r\n    let _e377 = vec4<f32>(_e372.x, _e372.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e385 = textureSample(tex2D, samp, (_e377.xyz / vec3<f32>(_e377.w)).xy, vec2<i32>(5, 5));\r\n    c_2 = _e385;\r\n    let _e386 = coord_5;\r\n    _ = vec3<f32>(_e386.x, _e386.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e394 = coord_5;\r\n    let _e398 = vec3<f32>(_e394.x, _e394.y, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e406 = textureSampleBias(tex2D, samp, (_e398.xy / vec2<f32>(_e398.z)), 2.0, vec2<i32>(5, 5));\r\n    c_2 = _e406;\r\n    let _e407 = coord_5;\r\n    _ = vec4<f32>(_e407.x, _e407.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e416 = coord_5;\r\n    let _e421 = vec4<f32>(_e416.x, _e416.y, 0.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e430 = textureSampleBias(tex2D, samp, (_e421.xyz / vec3<f32>(_e421.w)).xy, 2.0, vec2<i32>(5, 5));\r\n    c_2 = _e430;\r\n    let _e431 = coord_5;\r\n    _ = vec2<i32>(_e431);\r\n    let _e434 = coord_5;\r\n    let _e437 = textureLoad(tex2D, vec2<i32>(_e434), 3);\r\n    c_2 = _e437;\r\n    let _e438 = coord_5;\r\n    _ = vec2<i32>(_e438);\r\n    _ = vec2<i32>(5);\r\n    let _e443 = coord_5;\r\n    _ = vec2<i32>(5);\r\n    let _e448 = textureLoad(tex2D, vec2<i32>(_e443), 3);\r\n    c_2 = _e448;\r\n    return;\r\n}\r\n\r\nfn testTex2DShadow(coord_6: vec2<f32>) {\r\n    var coord_7: vec2<f32>;\r\n    var size2DShadow: vec2<i32>;\r\n    var d: f32;\r\n\r\n    coord_7 = coord_6;\r\n    let _e20 = textureDimensions(tex2DShadow, 0);\r\n    size2DShadow = _e20;\r\n    let _e23 = coord_7;\r\n    _ = vec3<f32>(_e23.x, _e23.y, 1.0);\r\n    let _e28 = coord_7;\r\n    let _e32 = vec3<f32>(_e28.x, _e28.y, 1.0);\r\n    let _e35 = textureSampleCompare(tex2DShadow, sampShadow, _e32.xy, _e32.z);\r\n    d = _e35;\r\n    let _e36 = coord_7;\r\n    _ = vec3<f32>(_e36.x, _e36.y, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e45 = coord_7;\r\n    let _e49 = vec3<f32>(_e45.x, _e45.y, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e56 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e49.xy, _e49.z);\r\n    d = _e56;\r\n    let _e57 = coord_7;\r\n    _ = vec3<f32>(_e57.x, _e57.y, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e68 = coord_7;\r\n    let _e72 = vec3<f32>(_e68.x, _e68.y, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e81 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e72.xy, _e72.z, vec2<i32>(5, 5));\r\n    d = _e81;\r\n    let _e82 = coord_7;\r\n    _ = vec3<f32>(_e82.x, _e82.y, 1.0);\r\n    let _e88 = coord_7;\r\n    let _e92 = vec3<f32>(_e88.x, _e88.y, 1.0);\r\n    let _e96 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e92.xy, _e92.z);\r\n    d = _e96;\r\n    let _e97 = coord_7;\r\n    _ = vec3<f32>(_e97.x, _e97.y, 1.0);\r\n    _ = vec2<i32>(5);\r\n    let _e105 = coord_7;\r\n    let _e109 = vec3<f32>(_e105.x, _e105.y, 1.0);\r\n    _ = vec2<i32>(5);\r\n    let _e115 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e109.xy, _e109.z, vec2<i32>(5, 5));\r\n    d = _e115;\r\n    let _e116 = coord_7;\r\n    _ = vec3<f32>(_e116.x, _e116.y, 1.0);\r\n    _ = vec2<i32>(5);\r\n    let _e123 = coord_7;\r\n    let _e127 = vec3<f32>(_e123.x, _e123.y, 1.0);\r\n    _ = vec2<i32>(5);\r\n    let _e132 = textureSampleCompare(tex2DShadow, sampShadow, _e127.xy, _e127.z, vec2<i32>(5, 5));\r\n    d = _e132;\r\n    let _e133 = coord_7;\r\n    _ = vec4<f32>(_e133.x, _e133.y, 1.0, 6.0);\r\n    let _e139 = coord_7;\r\n    let _e144 = vec4<f32>(_e139.x, _e139.y, 1.0, 6.0);\r\n    let _e148 = (_e144.xyz / vec3<f32>(_e144.w));\r\n    let _e151 = textureSampleCompare(tex2DShadow, sampShadow, _e148.xy, _e148.z);\r\n    d = _e151;\r\n    let _e152 = coord_7;\r\n    _ = vec4<f32>(_e152.x, _e152.y, 1.0, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e162 = coord_7;\r\n    let _e167 = vec4<f32>(_e162.x, _e162.y, 1.0, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e175 = (_e167.xyz / vec3<f32>(_e167.w));\r\n    let _e178 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e175.xy, _e175.z);\r\n    d = _e178;\r\n    let _e179 = coord_7;\r\n    _ = vec4<f32>(_e179.x, _e179.y, 1.0, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e191 = coord_7;\r\n    let _e196 = vec4<f32>(_e191.x, _e191.y, 1.0, 6.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e206 = (_e196.xyz / vec3<f32>(_e196.w));\r\n    let _e209 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e206.xy, _e206.z, vec2<i32>(5, 5));\r\n    d = _e209;\r\n    let _e210 = coord_7;\r\n    _ = vec4<f32>(_e210.x, _e210.y, 1.0, 6.0);\r\n    let _e217 = coord_7;\r\n    let _e222 = vec4<f32>(_e217.x, _e217.y, 1.0, 6.0);\r\n    let _e227 = (_e222.xyz / vec3<f32>(_e222.w));\r\n    let _e230 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e227.xy, _e227.z);\r\n    d = _e230;\r\n    let _e231 = coord_7;\r\n    _ = vec4<f32>(_e231.x, _e231.y, 1.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e240 = coord_7;\r\n    let _e245 = vec4<f32>(_e240.x, _e240.y, 1.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e252 = (_e245.xyz / vec3<f32>(_e245.w));\r\n    let _e255 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e252.xy, _e252.z, vec2<i32>(5, 5));\r\n    d = _e255;\r\n    let _e256 = coord_7;\r\n    _ = vec4<f32>(_e256.x, _e256.y, 1.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e264 = coord_7;\r\n    let _e269 = vec4<f32>(_e264.x, _e264.y, 1.0, 6.0);\r\n    _ = vec2<i32>(5);\r\n    let _e275 = (_e269.xyz / vec3<f32>(_e269.w));\r\n    let _e278 = textureSampleCompare(tex2DShadow, sampShadow, _e275.xy, _e275.z, vec2<i32>(5, 5));\r\n    d = _e278;\r\n    return;\r\n}\r\n\r\nfn testTex2DArray(coord_8: vec3<f32>) {\r\n    var coord_9: vec3<f32>;\r\n    var size2DArray: vec3<i32>;\r\n    var c_3: vec4<f32>;\r\n\r\n    coord_9 = coord_8;\r\n    let _e20 = textureDimensions(tex2DArray, 0);\r\n    let _e23 = textureNumLayers(tex2DArray);\r\n    size2DArray = vec3<i32>(_e20.x, _e20.y, _e23);\r\n    _ = coord_9;\r\n    let _e28 = coord_9;\r\n    let _e32 = textureSample(tex2DArray, samp, _e28.xy, i32(_e28.z));\r\n    c_3 = _e32;\r\n    _ = coord_9;\r\n    let _e35 = coord_9;\r\n    let _e40 = textureSampleBias(tex2DArray, samp, _e35.xy, i32(_e35.z), 2.0);\r\n    c_3 = _e40;\r\n    _ = coord_9;\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e46 = coord_9;\r\n    let _e54 = textureSampleGrad(tex2DArray, samp, _e46.xy, i32(_e46.z), vec2<f32>(4.0), vec2<f32>(4.0));\r\n    c_3 = _e54;\r\n    _ = coord_9;\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e62 = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e72 = textureSampleGrad(tex2DArray, samp, _e62.xy, i32(_e62.z), vec2<f32>(4.0), vec2<f32>(4.0), vec2<i32>(5, 5));\r\n    c_3 = _e72;\r\n    _ = coord_9;\r\n    let _e75 = coord_9;\r\n    let _e80 = textureSampleLevel(tex2DArray, samp, _e75.xy, i32(_e75.z), 3.0);\r\n    c_3 = _e80;\r\n    _ = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e85 = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e92 = textureSampleLevel(tex2DArray, samp, _e85.xy, i32(_e85.z), 3.0, vec2<i32>(5, 5));\r\n    c_3 = _e92;\r\n    _ = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e96 = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e102 = textureSample(tex2DArray, samp, _e96.xy, i32(_e96.z), vec2<i32>(5, 5));\r\n    c_3 = _e102;\r\n    _ = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e107 = coord_9;\r\n    _ = vec2<i32>(5);\r\n    let _e114 = textureSampleBias(tex2DArray, samp, _e107.xy, i32(_e107.z), 2.0, vec2<i32>(5, 5));\r\n    c_3 = _e114;\r\n    let _e115 = coord_9;\r\n    _ = vec3<i32>(_e115);\r\n    let _e118 = coord_9;\r\n    let _e119 = vec3<i32>(_e118);\r\n    let _e123 = textureLoad(tex2DArray, _e119.xy, _e119.z, 3);\r\n    c_3 = _e123;\r\n    let _e124 = coord_9;\r\n    _ = vec3<i32>(_e124);\r\n    _ = vec2<i32>(5);\r\n    let _e129 = coord_9;\r\n    let _e130 = vec3<i32>(_e129);\r\n    _ = vec2<i32>(5);\r\n    let _e136 = textureLoad(tex2DArray, _e130.xy, _e130.z, 3);\r\n    c_3 = _e136;\r\n    return;\r\n}\r\n\r\nfn testTex2DArrayShadow(coord_10: vec3<f32>) {\r\n    var coord_11: vec3<f32>;\r\n    var size2DArrayShadow: vec3<i32>;\r\n    var d_1: f32;\r\n\r\n    coord_11 = coord_10;\r\n    let _e20 = textureDimensions(tex2DArrayShadow, 0);\r\n    let _e23 = textureNumLayers(tex2DArrayShadow);\r\n    size2DArrayShadow = vec3<i32>(_e20.x, _e20.y, _e23);\r\n    let _e27 = coord_11;\r\n    _ = vec4<f32>(_e27.x, _e27.y, _e27.z, 1.0);\r\n    let _e33 = coord_11;\r\n    let _e38 = vec4<f32>(_e33.x, _e33.y, _e33.z, 1.0);\r\n    let _e43 = textureSampleCompare(tex2DArrayShadow, sampShadow, _e38.xy, i32(_e38.z), _e38.w);\r\n    d_1 = _e43;\r\n    let _e44 = coord_11;\r\n    _ = vec4<f32>(_e44.x, _e44.y, _e44.z, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e54 = coord_11;\r\n    let _e59 = vec4<f32>(_e54.x, _e54.y, _e54.z, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    let _e68 = textureSampleCompareLevel(tex2DArrayShadow, sampShadow, _e59.xy, i32(_e59.z), _e59.w);\r\n    d_1 = _e68;\r\n    let _e69 = coord_11;\r\n    _ = vec4<f32>(_e69.x, _e69.y, _e69.z, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e81 = coord_11;\r\n    let _e86 = vec4<f32>(_e81.x, _e81.y, _e81.z, 1.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<f32>(4.0);\r\n    _ = vec2<i32>(5);\r\n    let _e97 = textureSampleCompareLevel(tex2DArrayShadow, sampShadow, _e86.xy, i32(_e86.z), _e86.w, vec2<i32>(5, 5));\r\n    d_1 = _e97;\r\n    let _e98 = coord_11;\r\n    _ = vec4<f32>(_e98.x, _e98.y, _e98.z, 1.0);\r\n    _ = vec2<i32>(5);\r\n    let _e106 = coord_11;\r\n    let _e111 = vec4<f32>(_e106.x, _e106.y, _e106.z, 1.0);\r\n    _ = vec2<i32>(5);\r\n    let _e118 = textureSampleCompare(tex2DArrayShadow, sampShadow, _e111.xy, i32(_e111.z), _e111.w, vec2<i32>(5, 5));\r\n    d_1 = _e118;\r\n    return;\r\n}\r\n\r\nfn testTexCube(coord_12: vec3<f32>) {\r\n    var coord_13: vec3<f32>;\r\n    var sizeCube: vec2<i32>;\r\n    var c_4: vec4<f32>;\r\n\r\n    coord_13 = coord_12;\r\n    let _e20 = textureDimensions(texCube, 0);\r\n    sizeCube = _e20;\r\n    _ = coord_13;\r\n    let _e24 = coord_13;\r\n    let _e25 = textureSample(texCube, samp, _e24);\r\n    c_4 = _e25;\r\n    _ = coord_13;\r\n    let _e28 = coord_13;\r\n    let _e30 = textureSampleBias(texCube, samp, _e28, 2.0);\r\n    c_4 = _e30;\r\n    _ = coord_13;\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    let _e36 = coord_13;\r\n    let _e41 = textureSampleGrad(texCube, samp, _e36, vec3<f32>(4.0), vec3<f32>(4.0));\r\n    c_4 = _e41;\r\n    _ = coord_13;\r\n    let _e44 = coord_13;\r\n    let _e46 = textureSampleLevel(texCube, samp, _e44, 3.0);\r\n    c_4 = _e46;\r\n    return;\r\n}\r\n\r\nfn testTexCubeShadow(coord_14: vec3<f32>) {\r\n    var coord_15: vec3<f32>;\r\n    var sizeCubeShadow: vec2<i32>;\r\n    var d_2: f32;\r\n\r\n    coord_15 = coord_14;\r\n    let _e20 = textureDimensions(texCubeShadow, 0);\r\n    sizeCubeShadow = _e20;\r\n    let _e23 = coord_15;\r\n    _ = vec4<f32>(_e23.x, _e23.y, _e23.z, 1.0);\r\n    let _e29 = coord_15;\r\n    let _e34 = vec4<f32>(_e29.x, _e29.y, _e29.z, 1.0);\r\n    let _e37 = textureSampleCompare(texCubeShadow, sampShadow, _e34.xyz, _e34.w);\r\n    d_2 = _e37;\r\n    let _e38 = coord_15;\r\n    _ = vec4<f32>(_e38.x, _e38.y, _e38.z, 1.0);\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    let _e48 = coord_15;\r\n    let _e53 = vec4<f32>(_e48.x, _e48.y, _e48.z, 1.0);\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    let _e60 = textureSampleCompareLevel(texCubeShadow, sampShadow, _e53.xyz, _e53.w);\r\n    d_2 = _e60;\r\n    return;\r\n}\r\n\r\nfn testTexCubeArray(coord_16: vec4<f32>) {\r\n    var coord_17: vec4<f32>;\r\n    var sizeCubeArray: vec3<i32>;\r\n    var c_5: vec4<f32>;\r\n\r\n    coord_17 = coord_16;\r\n    let _e20 = textureDimensions(texCubeArray, 0);\r\n    let _e23 = textureNumLayers(texCubeArray);\r\n    sizeCubeArray = vec3<i32>(_e20.x, _e20.y, _e23);\r\n    _ = coord_17;\r\n    let _e28 = coord_17;\r\n    let _e32 = textureSample(texCubeArray, samp, _e28.xyz, i32(_e28.w));\r\n    c_5 = _e32;\r\n    _ = coord_17;\r\n    let _e35 = coord_17;\r\n    let _e40 = textureSampleBias(texCubeArray, samp, _e35.xyz, i32(_e35.w), 2.0);\r\n    c_5 = _e40;\r\n    _ = coord_17;\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    let _e46 = coord_17;\r\n    let _e54 = textureSampleGrad(texCubeArray, samp, _e46.xyz, i32(_e46.w), vec3<f32>(4.0), vec3<f32>(4.0));\r\n    c_5 = _e54;\r\n    _ = coord_17;\r\n    let _e57 = coord_17;\r\n    let _e62 = textureSampleLevel(texCubeArray, samp, _e57.xyz, i32(_e57.w), 3.0);\r\n    c_5 = _e62;\r\n    return;\r\n}\r\n\r\nfn testTexCubeArrayShadow(coord_18: vec4<f32>) {\r\n    var coord_19: vec4<f32>;\r\n    var sizeCubeArrayShadow: vec3<i32>;\r\n    var d_3: f32;\r\n\r\n    coord_19 = coord_18;\r\n    let _e20 = textureDimensions(texCubeArrayShadow, 0);\r\n    let _e23 = textureNumLayers(texCubeArrayShadow);\r\n    sizeCubeArrayShadow = vec3<i32>(_e20.x, _e20.y, _e23);\r\n    _ = coord_19;\r\n    let _e29 = coord_19;\r\n    let _e34 = textureSampleCompare(texCubeArrayShadow, sampShadow, _e29.xyz, i32(_e29.w), 1.0);\r\n    d_3 = _e34;\r\n    return;\r\n}\r\n\r\nfn testTex3D(coord_20: vec3<f32>) {\r\n    var coord_21: vec3<f32>;\r\n    var size3D: vec3<i32>;\r\n    var c_6: vec4<f32>;\r\n\r\n    coord_21 = coord_20;\r\n    let _e20 = textureDimensions(tex3D, 0);\r\n    size3D = _e20;\r\n    _ = coord_21;\r\n    let _e24 = coord_21;\r\n    let _e25 = textureSample(tex3D, samp, _e24);\r\n    c_6 = _e25;\r\n    _ = coord_21;\r\n    let _e28 = coord_21;\r\n    let _e30 = textureSampleBias(tex3D, samp, _e28, 2.0);\r\n    c_6 = _e30;\r\n    let _e31 = coord_21;\r\n    _ = vec4<f32>(_e31.x, _e31.y, _e31.z, 6.0);\r\n    let _e37 = coord_21;\r\n    let _e42 = vec4<f32>(_e37.x, _e37.y, _e37.z, 6.0);\r\n    let _e47 = textureSample(tex3D, samp, (_e42.xyz / vec3<f32>(_e42.w)));\r\n    c_6 = _e47;\r\n    let _e48 = coord_21;\r\n    _ = vec4<f32>(_e48.x, _e48.y, _e48.z, 6.0);\r\n    let _e55 = coord_21;\r\n    let _e60 = vec4<f32>(_e55.x, _e55.y, _e55.z, 6.0);\r\n    let _e66 = textureSampleBias(tex3D, samp, (_e60.xyz / vec3<f32>(_e60.w)), 2.0);\r\n    c_6 = _e66;\r\n    let _e67 = coord_21;\r\n    _ = vec4<f32>(_e67.x, _e67.y, _e67.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e75 = coord_21;\r\n    let _e80 = vec4<f32>(_e75.x, _e75.y, _e75.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e87 = textureSample(tex3D, samp, (_e80.xyz / vec3<f32>(_e80.w)), vec3<i32>(5, 5, 5));\r\n    c_6 = _e87;\r\n    let _e88 = coord_21;\r\n    _ = vec4<f32>(_e88.x, _e88.y, _e88.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e97 = coord_21;\r\n    let _e102 = vec4<f32>(_e97.x, _e97.y, _e97.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e110 = textureSampleBias(tex3D, samp, (_e102.xyz / vec3<f32>(_e102.w)), 2.0, vec3<i32>(5, 5, 5));\r\n    c_6 = _e110;\r\n    let _e111 = coord_21;\r\n    _ = vec4<f32>(_e111.x, _e111.y, _e111.z, 6.0);\r\n    let _e118 = coord_21;\r\n    let _e123 = vec4<f32>(_e118.x, _e118.y, _e118.z, 6.0);\r\n    let _e129 = textureSampleLevel(tex3D, samp, (_e123.xyz / vec3<f32>(_e123.w)), 3.0);\r\n    c_6 = _e129;\r\n    let _e130 = coord_21;\r\n    _ = vec4<f32>(_e130.x, _e130.y, _e130.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e139 = coord_21;\r\n    let _e144 = vec4<f32>(_e139.x, _e139.y, _e139.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e152 = textureSampleLevel(tex3D, samp, (_e144.xyz / vec3<f32>(_e144.w)), 3.0, vec3<i32>(5, 5, 5));\r\n    c_6 = _e152;\r\n    let _e153 = coord_21;\r\n    _ = vec4<f32>(_e153.x, _e153.y, _e153.z, 6.0);\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    let _e163 = coord_21;\r\n    let _e168 = vec4<f32>(_e163.x, _e163.y, _e163.z, 6.0);\r\n    let _e177 = textureSampleGrad(tex3D, samp, (_e168.xyz / vec3<f32>(_e168.w)), vec3<f32>(4.0), vec3<f32>(4.0));\r\n    c_6 = _e177;\r\n    let _e178 = coord_21;\r\n    _ = vec4<f32>(_e178.x, _e178.y, _e178.z, 6.0);\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<i32>(5);\r\n    let _e190 = coord_21;\r\n    let _e195 = vec4<f32>(_e190.x, _e190.y, _e190.z, 6.0);\r\n    _ = vec3<i32>(5);\r\n    let _e206 = textureSampleGrad(tex3D, samp, (_e195.xyz / vec3<f32>(_e195.w)), vec3<f32>(4.0), vec3<f32>(4.0), vec3<i32>(5, 5, 5));\r\n    c_6 = _e206;\r\n    _ = coord_21;\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    let _e212 = coord_21;\r\n    let _e217 = textureSampleGrad(tex3D, samp, _e212, vec3<f32>(4.0), vec3<f32>(4.0));\r\n    c_6 = _e217;\r\n    _ = coord_21;\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<f32>(4.0);\r\n    _ = vec3<i32>(5);\r\n    let _e225 = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e232 = textureSampleGrad(tex3D, samp, _e225, vec3<f32>(4.0), vec3<f32>(4.0), vec3<i32>(5, 5, 5));\r\n    c_6 = _e232;\r\n    _ = coord_21;\r\n    let _e235 = coord_21;\r\n    let _e237 = textureSampleLevel(tex3D, samp, _e235, 3.0);\r\n    c_6 = _e237;\r\n    _ = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e242 = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e246 = textureSampleLevel(tex3D, samp, _e242, 3.0, vec3<i32>(5, 5, 5));\r\n    c_6 = _e246;\r\n    _ = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e250 = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e253 = textureSample(tex3D, samp, _e250, vec3<i32>(5, 5, 5));\r\n    c_6 = _e253;\r\n    _ = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e258 = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e262 = textureSampleBias(tex3D, samp, _e258, 2.0, vec3<i32>(5, 5, 5));\r\n    c_6 = _e262;\r\n    let _e263 = coord_21;\r\n    _ = vec3<i32>(_e263);\r\n    let _e266 = coord_21;\r\n    let _e269 = textureLoad(tex3D, vec3<i32>(_e266), 3);\r\n    c_6 = _e269;\r\n    let _e270 = coord_21;\r\n    _ = vec3<i32>(_e270);\r\n    _ = vec3<i32>(5);\r\n    let _e275 = coord_21;\r\n    _ = vec3<i32>(5);\r\n    let _e280 = textureLoad(tex3D, vec3<i32>(_e275), 3);\r\n    c_6 = _e280;\r\n    return;\r\n}\r\n\r\nfn testTex2DMS(coord_22: vec2<f32>) {\r\n    var coord_23: vec2<f32>;\r\n    var size2DMS: vec2<i32>;\r\n    var c_7: vec4<f32>;\r\n\r\n    coord_23 = coord_22;\r\n    let _e18 = textureDimensions(tex2DMS);\r\n    size2DMS = _e18;\r\n    let _e21 = coord_23;\r\n    _ = vec2<i32>(_e21);\r\n    let _e24 = coord_23;\r\n    let _e27 = textureLoad(tex2DMS, vec2<i32>(_e24), 3);\r\n    c_7 = _e27;\r\n    return;\r\n}\r\n\r\nfn testTex2DMSArray(coord_24: vec3<f32>) {\r\n    var coord_25: vec3<f32>;\r\n    var size2DMSArray: vec3<i32>;\r\n    var c_8: vec4<f32>;\r\n\r\n    coord_25 = coord_24;\r\n    let _e18 = textureDimensions(tex2DMSArray);\r\n    let _e21 = textureNumLayers(tex2DMSArray);\r\n    size2DMSArray = vec3<i32>(_e18.x, _e18.y, _e21);\r\n    let _e25 = coord_25;\r\n    _ = vec3<i32>(_e25);\r\n    let _e28 = coord_25;\r\n    let _e29 = vec3<i32>(_e28);\r\n    let _e33 = textureLoad(tex2DMSArray, _e29.xy, _e29.z, 3);\r\n    c_8 = _e33;\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/shadow.wgsl",
    "content": "struct Globals {\r\n    view_proj: mat4x4<f32>,\r\n    num_lights: vec4<u32>,\r\n}\r\n\r\nstruct Entity {\r\n    world: mat4x4<f32>,\r\n    color: vec4<f32>,\r\n}\r\n\r\nstruct VertexOutput {\r\n    @builtin(position) proj_position: vec4<f32>,\r\n    @location(0) world_normal: vec3<f32>,\r\n    @location(1) world_position: vec4<f32>,\r\n}\r\n\r\nstruct Light {\r\n    proj: mat4x4<f32>,\r\n    pos: vec4<f32>,\r\n    color: vec4<f32>,\r\n}\r\n\r\nlet c_ambient: vec3<f32> = vec3<f32>(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\nlet c_max_lights: u32 = 10u;\r\n\r\n@group(0) @binding(0) \r\nvar<uniform> u_globals: Globals;\r\n@group(1) @binding(0) \r\nvar<uniform> u_entity: Entity;\r\n@group(0) @binding(1) \r\nvar<storage> s_lights: array<Light>;\r\n@group(0) @binding(1) \r\nvar<uniform> u_lights: array<Light,10>;\r\n@group(0) @binding(2) \r\nvar t_shadow: texture_depth_2d_array;\r\n@group(0) @binding(3) \r\nvar sampler_shadow: sampler_comparison;\r\n\r\nfn fetch_shadow(light_id: u32, homogeneous_coords: vec4<f32>) -> f32 {\r\n    if (homogeneous_coords.w <= 0.0) {\r\n        return 1.0;\r\n    }\r\n    let flip_correction = vec2<f32>(0.5, -0.5);\r\n    let proj_correction = (1.0 / homogeneous_coords.w);\r\n    let light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + vec2<f32>(0.5, 0.5));\r\n    let _e28 = textureSampleCompareLevel(t_shadow, sampler_shadow, light_local, i32(light_id), (homogeneous_coords.z * proj_correction));\r\n    return _e28;\r\n}\r\n\r\n@vertex \r\nfn vs_main(@location(0) position: vec4<i32>, @location(1) normal: vec4<i32>) -> VertexOutput {\r\n    var out: VertexOutput;\r\n\r\n    let w = u_entity.world;\r\n    let _e7 = u_entity.world;\r\n    let world_pos = (_e7 * vec4<f32>(position));\r\n    out.world_normal = (mat3x3<f32>(w[0].xyz, w[1].xyz, w[2].xyz) * vec3<f32>(normal.xyz));\r\n    out.world_position = world_pos;\r\n    let _e25 = u_globals.view_proj;\r\n    out.proj_position = (_e25 * world_pos);\r\n    let _e27 = out;\r\n    return _e27;\r\n}\r\n\r\n@fragment \r\nfn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {\r\n    var color: vec3<f32> = vec3<f32>(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\n    var i: u32 = 0u;\r\n\r\n    let normal_1 = normalize(in.world_normal);\r\n    loop {\r\n        let _e14 = i;\r\n        let _e17 = u_globals.num_lights.x;\r\n        if (_e14 < min(_e17, c_max_lights)) {\r\n        } else {\r\n            break;\r\n        }\r\n        let _e23 = i;\r\n        let light = s_lights[_e23];\r\n        let _e26 = i;\r\n        let _e30 = fetch_shadow(_e26, (light.proj * in.world_position));\r\n        let light_dir = normalize((light.pos.xyz - in.world_position.xyz));\r\n        let diffuse = max(0.0, dot(normal_1, light_dir));\r\n        let _e40 = color;\r\n        color = (_e40 + ((_e30 * diffuse) * light.color.xyz));\r\n        continuing {\r\n            let _e20 = i;\r\n            i = (_e20 + 1u);\r\n        }\r\n    }\r\n    let _e46 = color;\r\n    let _e50 = u_entity.color;\r\n    return (vec4<f32>(_e46, 1.0) * _e50);\r\n}\r\n\r\n@fragment \r\nfn fs_main_without_storage(in_1: VertexOutput) -> @location(0) vec4<f32> {\r\n    var color_1: vec3<f32> = vec3<f32>(0.05000000074505806, 0.05000000074505806, 0.05000000074505806);\r\n    var i_1: u32 = 0u;\r\n\r\n    let normal_2 = normalize(in_1.world_normal);\r\n    loop {\r\n        let _e14 = i_1;\r\n        let _e17 = u_globals.num_lights.x;\r\n        if (_e14 < min(_e17, c_max_lights)) {\r\n        } else {\r\n            break;\r\n        }\r\n        let _e23 = i_1;\r\n        let light_1 = u_lights[_e23];\r\n        let _e26 = i_1;\r\n        let _e30 = fetch_shadow(_e26, (light_1.proj * in_1.world_position));\r\n        let light_dir_1 = normalize((light_1.pos.xyz - in_1.world_position.xyz));\r\n        let diffuse_1 = max(0.0, dot(normal_2, light_dir_1));\r\n        let _e40 = color_1;\r\n        color_1 = (_e40 + ((_e30 * diffuse_1) * light_1.color.xyz));\r\n        continuing {\r\n            let _e20 = i_1;\r\n            i_1 = (_e20 + 1u);\r\n        }\r\n    }\r\n    let _e46 = color_1;\r\n    let _e50 = u_entity.color;\r\n    return (vec4<f32>(_e46, 1.0) * _e50);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/skybox.wgsl",
    "content": "struct VertexOutput {\r\n    @builtin(position) position: vec4<f32>,\r\n    @location(0) uv: vec3<f32>,\r\n}\r\n\r\nstruct Data {\r\n    proj_inv: mat4x4<f32>,\r\n    view: mat4x4<f32>,\r\n}\r\n\r\n@group(0) @binding(0) \r\nvar<uniform> r_data: Data;\r\n@group(0) @binding(1) \r\nvar r_texture: texture_cube<f32>;\r\n@group(0) @binding(2) \r\nvar r_sampler: sampler;\r\n\r\n@vertex \r\nfn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput {\r\n    var tmp1_: i32;\r\n    var tmp2_: i32;\r\n\r\n    tmp1_ = (i32(vertex_index) / 2);\r\n    tmp2_ = (i32(vertex_index) & 1);\r\n    let _e10 = tmp1_;\r\n    let _e16 = tmp2_;\r\n    let pos = vec4<f32>(((f32(_e10) * 4.0) - 1.0), ((f32(_e16) * 4.0) - 1.0), 0.0, 1.0);\r\n    let _e27 = r_data.view[0];\r\n    let _e31 = r_data.view[1];\r\n    let _e35 = r_data.view[2];\r\n    let inv_model_view = transpose(mat3x3<f32>(_e27.xyz, _e31.xyz, _e35.xyz));\r\n    let _e40 = r_data.proj_inv;\r\n    let unprojected = (_e40 * pos);\r\n    return VertexOutput(pos, (inv_model_view * unprojected.xyz));\r\n}\r\n\r\n@fragment \r\nfn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {\r\n    let _e5 = textureSample(r_texture, r_sampler, in.uv);\r\n    return _e5;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/standard.wgsl",
    "content": "@fragment \r\nfn derivatives(@builtin(position) foo: vec4<f32>) -> @location(0) vec4<f32> {\r\n    let x = dpdx(foo);\r\n    let y = dpdy(foo);\r\n    let z = fwidth(foo);\r\n    return ((x + y) * z);\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/statements-frag.wgsl",
    "content": "fn switchEmpty(a: i32) {\r\n    var a_1: i32;\r\n\r\n    a_1 = a;\r\n    let _e2 = a_1;\r\n    switch _e2 {\r\n        default: {\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nfn switchNoDefault(a_2: i32) {\r\n    var a_3: i32;\r\n\r\n    a_3 = a_2;\r\n    let _e2 = a_3;\r\n    switch _e2 {\r\n        case 0: {\r\n        }\r\n        default: {\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nfn switchNoLastBreak(a_4: i32) {\r\n    var a_5: i32;\r\n    var b: i32;\r\n\r\n    a_5 = a_4;\r\n    let _e2 = a_5;\r\n    switch _e2 {\r\n        default: {\r\n            let _e3 = a_5;\r\n            b = _e3;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/swizzle_write-frag.wgsl",
    "content": "fn foo(p: ptr<function, vec2<f32>>) {\r\n    return;\r\n}\r\n\r\nfn main_1() {\r\n    var x: vec3<f32>;\r\n    var local: vec2<f32>;\r\n\r\n    x = vec3<f32>(2.0);\r\n    let _e3 = x;\r\n    _ = _e3.zxy;\r\n    _ = _e3.zx;\r\n    let _e8 = vec2<f32>(3.0, 4.0);\r\n    x.z = _e8.x;\r\n    x.x = _e8.y;\r\n    let _e13 = x;\r\n    _ = _e13.xy;\r\n    let _e15 = x;\r\n    let _e18 = (_e15.xy * 5.0);\r\n    x.x = _e18.x;\r\n    x.y = _e18.y;\r\n    let _e23 = x;\r\n    let _e27 = (_e23.zy + vec2<f32>(1.0));\r\n    x.z = _e27.x;\r\n    x.y = _e27.y;\r\n    let _e32 = x;\r\n    _ = _e32.xz;\r\n    let _e34 = x;\r\n    local = _e34.xz;\r\n    foo((&local));\r\n    let _e41 = local.x;\r\n    x.x = _e41;\r\n    let _e42 = local.y;\r\n    x.z = _e42;\r\n    return;\r\n}\r\n\r\n@fragment \r\nfn main() {\r\n    main_1();\r\n    return;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/out/wgsl/texture-arg.wgsl",
    "content": "@group(0) @binding(0) \r\nvar Texture: texture_2d<f32>;\r\n@group(0) @binding(1) \r\nvar Sampler: sampler;\r\n\r\nfn test(Passed_Texture: texture_2d<f32>, Passed_Sampler: sampler) -> vec4<f32> {\r\n    let _e7 = textureSample(Passed_Texture, Passed_Sampler, vec2<f32>(0.0, 0.0));\r\n    return _e7;\r\n}\r\n\r\n@fragment \r\nfn main() -> @location(0) vec4<f32> {\r\n    let _e2 = test(Texture, Sampler);\r\n    return _e2;\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/snapshots.rs",
    "content": "// A lot of the code can be unused based on configuration flags,\r\n// the corresponding warnings aren't helpful.\r\n#![allow(dead_code)]\r\n\r\nuse std::{fs, path::PathBuf};\r\n\r\nconst BASE_DIR_IN: &str = \"tests/in\";\r\nconst BASE_DIR_OUT: &str = \"tests/out\";\r\n\r\nbitflags::bitflags! {\r\n    struct Targets: u32 {\r\n        const IR = 0x1;\r\n        const ANALYSIS = 0x2;\r\n        const SPIRV = 0x4;\r\n        const METAL = 0x8;\r\n        const GLSL = 0x10;\r\n        const DOT = 0x20;\r\n        const HLSL = 0x40;\r\n        const WGSL = 0x80;\r\n    }\r\n}\r\n\r\n#[derive(serde::Deserialize)]\r\nstruct SpvOutVersion(u8, u8);\r\nimpl Default for SpvOutVersion {\r\n    fn default() -> Self {\r\n        SpvOutVersion(1, 1)\r\n    }\r\n}\r\n\r\n#[derive(Default, serde::Deserialize)]\r\nstruct SpirvOutParameters {\r\n    version: SpvOutVersion,\r\n    #[serde(default)]\r\n    capabilities: naga::FastHashSet<spirv::Capability>,\r\n    #[serde(default)]\r\n    debug: bool,\r\n    #[serde(default)]\r\n    adjust_coordinate_space: bool,\r\n    #[serde(default)]\r\n    force_point_size: bool,\r\n    #[serde(default)]\r\n    clamp_frag_depth: bool,\r\n    #[serde(default)]\r\n    separate_entry_points: bool,\r\n    #[serde(default)]\r\n    #[cfg(all(feature = \"deserialize\", feature = \"spv-out\"))]\r\n    binding_map: naga::back::spv::BindingMap,\r\n}\r\n\r\n#[derive(Default, serde::Deserialize)]\r\nstruct WgslOutParameters {\r\n    #[serde(default)]\r\n    explicit_types: bool,\r\n}\r\n\r\n#[derive(Default, serde::Deserialize)]\r\nstruct Parameters {\r\n    #[serde(default)]\r\n    god_mode: bool,\r\n    #[cfg(feature = \"deserialize\")]\r\n    #[serde(default)]\r\n    bounds_check_policies: naga::proc::BoundsCheckPolicies,\r\n    #[serde(default)]\r\n    spv: SpirvOutParameters,\r\n    #[cfg(all(feature = \"deserialize\", feature = \"msl-out\"))]\r\n    #[serde(default)]\r\n    msl: naga::back::msl::Options,\r\n    #[cfg(all(feature = \"deserialize\", feature = \"msl-out\"))]\r\n    #[serde(default)]\r\n    msl_pipeline: naga::back::msl::PipelineOptions,\r\n    #[cfg(all(feature = \"deserialize\", feature = \"glsl-out\"))]\r\n    #[serde(default)]\r\n    glsl: naga::back::glsl::Options,\r\n    #[serde(default)]\r\n    glsl_exclude_list: naga::FastHashSet<String>,\r\n    #[cfg(all(feature = \"deserialize\", feature = \"hlsl-out\"))]\r\n    #[serde(default)]\r\n    hlsl: naga::back::hlsl::Options,\r\n    #[serde(default)]\r\n    wgsl: WgslOutParameters,\r\n    #[cfg(all(feature = \"deserialize\", feature = \"glsl-out\"))]\r\n    #[serde(default)]\r\n    glsl_multiview: Option<std::num::NonZeroU32>,\r\n}\r\n\r\n#[allow(unused_variables)]\r\nfn check_targets(module: &naga::Module, name: &str, targets: Targets) {\r\n    let root = env!(\"CARGO_MANIFEST_DIR\");\r\n    let params = match fs::read_to_string(format!(\"{}/{}/{}.param.ron\", root, BASE_DIR_IN, name)) {\r\n        Ok(string) => ron::de::from_str(&string).expect(\"Couldn't parse param file\"),\r\n        Err(_) => Parameters::default(),\r\n    };\r\n\r\n    let capabilities = if params.god_mode {\r\n        naga::valid::Capabilities::all()\r\n    } else {\r\n        naga::valid::Capabilities::empty()\r\n    };\r\n\r\n    let dest = PathBuf::from(root).join(BASE_DIR_OUT);\r\n\r\n    #[cfg(feature = \"serialize\")]\r\n    {\r\n        if targets.contains(Targets::IR) {\r\n            let config = ron::ser::PrettyConfig::default().new_line(\"\\n\".to_string());\r\n            let string = ron::ser::to_string_pretty(module, config).unwrap();\r\n            fs::write(dest.join(format!(\"ir/{}.ron\", name)), string).unwrap();\r\n        }\r\n    }\r\n\r\n    let info = naga::valid::Validator::new(naga::valid::ValidationFlags::all(), capabilities)\r\n        .validate(module)\r\n        .expect(\"Naga module validation failed\");\r\n\r\n    #[cfg(feature = \"serialize\")]\r\n    {\r\n        if targets.contains(Targets::ANALYSIS) {\r\n            let config = ron::ser::PrettyConfig::default().new_line(\"\\n\".to_string());\r\n            let string = ron::ser::to_string_pretty(&info, config).unwrap();\r\n            fs::write(dest.join(format!(\"analysis/{}.info.ron\", name)), string).unwrap();\r\n        }\r\n    }\r\n\r\n    #[cfg(all(feature = \"deserialize\", feature = \"spv-out\"))]\r\n    {\r\n        if targets.contains(Targets::SPIRV) {\r\n            write_output_spv(\r\n                module,\r\n                &info,\r\n                &dest,\r\n                name,\r\n                &params.spv,\r\n                params.bounds_check_policies,\r\n            );\r\n        }\r\n    }\r\n    #[cfg(all(feature = \"deserialize\", feature = \"msl-out\"))]\r\n    {\r\n        if targets.contains(Targets::METAL) {\r\n            write_output_msl(\r\n                module,\r\n                &info,\r\n                &dest,\r\n                name,\r\n                &params.msl,\r\n                &params.msl_pipeline,\r\n                params.bounds_check_policies,\r\n            );\r\n        }\r\n    }\r\n    #[cfg(all(feature = \"deserialize\", feature = \"glsl-out\"))]\r\n    {\r\n        if targets.contains(Targets::GLSL) {\r\n            for ep in module.entry_points.iter() {\r\n                if params.glsl_exclude_list.contains(&ep.name) {\r\n                    continue;\r\n                }\r\n                write_output_glsl(\r\n                    module,\r\n                    &info,\r\n                    &dest,\r\n                    name,\r\n                    ep.stage,\r\n                    &ep.name,\r\n                    &params.glsl,\r\n                    params.bounds_check_policies,\r\n                    params.glsl_multiview,\r\n                );\r\n            }\r\n        }\r\n    }\r\n    #[cfg(feature = \"dot-out\")]\r\n    {\r\n        if targets.contains(Targets::DOT) {\r\n            let string = naga::back::dot::write(module, Some(&info), Default::default()).unwrap();\r\n            fs::write(dest.join(format!(\"dot/{}.dot\", name)), string).unwrap();\r\n        }\r\n    }\r\n    #[cfg(all(feature = \"deserialize\", feature = \"hlsl-out\"))]\r\n    {\r\n        if targets.contains(Targets::HLSL) {\r\n            write_output_hlsl(module, &info, &dest, name, &params.hlsl);\r\n        }\r\n    }\r\n    #[cfg(all(feature = \"deserialize\", feature = \"wgsl-out\"))]\r\n    {\r\n        if targets.contains(Targets::WGSL) {\r\n            write_output_wgsl(module, &info, &dest, name, &params.wgsl);\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"spv-out\")]\r\nfn write_output_spv(\r\n    module: &naga::Module,\r\n    info: &naga::valid::ModuleInfo,\r\n    destination: &PathBuf,\r\n    file_name: &str,\r\n    params: &SpirvOutParameters,\r\n    bounds_check_policies: naga::proc::BoundsCheckPolicies,\r\n) {\r\n    use naga::back::spv;\r\n    use rspirv::binary::Disassemble;\r\n\r\n    println!(\"writing SPIR-V\");\r\n\r\n    let mut flags = spv::WriterFlags::LABEL_VARYINGS;\r\n    flags.set(spv::WriterFlags::DEBUG, params.debug);\r\n    flags.set(\r\n        spv::WriterFlags::ADJUST_COORDINATE_SPACE,\r\n        params.adjust_coordinate_space,\r\n    );\r\n    flags.set(spv::WriterFlags::FORCE_POINT_SIZE, params.force_point_size);\r\n    flags.set(spv::WriterFlags::CLAMP_FRAG_DEPTH, params.clamp_frag_depth);\r\n\r\n    let options = spv::Options {\r\n        lang_version: (params.version.0, params.version.1),\r\n        flags,\r\n        capabilities: if params.capabilities.is_empty() {\r\n            None\r\n        } else {\r\n            Some(params.capabilities.clone())\r\n        },\r\n        bounds_check_policies,\r\n        binding_map: params.binding_map.clone(),\r\n        ..spv::Options::default()\r\n    };\r\n\r\n    if params.separate_entry_points {\r\n        for ep in module.entry_points.iter() {\r\n            let pipeline_options = spv::PipelineOptions {\r\n                entry_point: ep.name.clone(),\r\n                shader_stage: ep.stage,\r\n            };\r\n            let spv = spv::write_vec(module, info, &options, Some(&pipeline_options)).unwrap();\r\n            let dis = rspirv::dr::load_words(spv)\r\n                .expect(\"Produced invalid SPIR-V\")\r\n                .disassemble();\r\n            let path = format!(\"spv/{}.{}.spvasm\", file_name, ep.name);\r\n            fs::write(destination.join(path), dis).unwrap();\r\n        }\r\n    } else {\r\n        let spv = spv::write_vec(module, info, &options, None).unwrap();\r\n        let dis = rspirv::dr::load_words(spv)\r\n            .expect(\"Produced invalid SPIR-V\")\r\n            .disassemble();\r\n        fs::write(destination.join(format!(\"spv/{}.spvasm\", file_name)), dis).unwrap();\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"msl-out\")]\r\nfn write_output_msl(\r\n    module: &naga::Module,\r\n    info: &naga::valid::ModuleInfo,\r\n    destination: &PathBuf,\r\n    file_name: &str,\r\n    options: &naga::back::msl::Options,\r\n    pipeline_options: &naga::back::msl::PipelineOptions,\r\n    bounds_check_policies: naga::proc::BoundsCheckPolicies,\r\n) {\r\n    use naga::back::msl;\r\n\r\n    println!(\"writing MSL\");\r\n\r\n    let mut options = options.clone();\r\n    options.bounds_check_policies = bounds_check_policies;\r\n    let (string, tr_info) = msl::write_string(module, info, &options, pipeline_options)\r\n        .unwrap_or_else(|err| panic!(\"Metal write failed: {}\", err));\r\n\r\n    for (ep, result) in module.entry_points.iter().zip(tr_info.entry_point_names) {\r\n        if let Err(error) = result {\r\n            panic!(\"Failed to translate '{}': {}\", ep.name, error);\r\n        }\r\n    }\r\n\r\n    fs::write(destination.join(format!(\"msl/{}.msl\", file_name)), string).unwrap();\r\n}\r\n\r\n#[cfg(feature = \"glsl-out\")]\r\nfn write_output_glsl(\r\n    module: &naga::Module,\r\n    info: &naga::valid::ModuleInfo,\r\n    destination: &PathBuf,\r\n    file_name: &str,\r\n    stage: naga::ShaderStage,\r\n    ep_name: &str,\r\n    options: &naga::back::glsl::Options,\r\n    bounds_check_policies: naga::proc::BoundsCheckPolicies,\r\n    multiview: Option<std::num::NonZeroU32>,\r\n) {\r\n    use naga::back::glsl;\r\n\r\n    println!(\"writing GLSL\");\r\n\r\n    let pipeline_options = glsl::PipelineOptions {\r\n        shader_stage: stage,\r\n        entry_point: ep_name.to_string(),\r\n        multiview,\r\n    };\r\n\r\n    let mut buffer = String::new();\r\n    let mut writer = glsl::Writer::new(\r\n        &mut buffer,\r\n        module,\r\n        info,\r\n        options,\r\n        &pipeline_options,\r\n        bounds_check_policies,\r\n    )\r\n    .expect(\"GLSL init failed\");\r\n    writer.write().expect(\"GLSL write failed\");\r\n\r\n    fs::write(\r\n        destination.join(format!(\"glsl/{}.{}.{:?}.glsl\", file_name, ep_name, stage)),\r\n        buffer,\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[cfg(feature = \"hlsl-out\")]\r\nfn write_output_hlsl(\r\n    module: &naga::Module,\r\n    info: &naga::valid::ModuleInfo,\r\n    destination: &PathBuf,\r\n    file_name: &str,\r\n    options: &naga::back::hlsl::Options,\r\n) {\r\n    use naga::back::hlsl;\r\n    use std::fmt::Write as _;\r\n\r\n    println!(\"writing HLSL\");\r\n\r\n    let mut buffer = String::new();\r\n    let mut writer = hlsl::Writer::new(&mut buffer, options);\r\n    let reflection_info = writer.write(module, info).expect(\"HLSL write failed\");\r\n\r\n    fs::write(destination.join(format!(\"hlsl/{}.hlsl\", file_name)), buffer).unwrap();\r\n\r\n    // We need a config file for validation script\r\n    // This file contains an info about profiles (shader stages) contains inside generated shader\r\n    // This info will be passed to dxc\r\n    let mut config_str = String::new();\r\n    let mut vertex_str = String::from(\"vertex=(\");\r\n    let mut fragment_str = String::from(\"fragment=(\");\r\n    let mut compute_str = String::from(\"compute=(\");\r\n    for (index, ep) in module.entry_points.iter().enumerate() {\r\n        let name = match reflection_info.entry_point_names[index] {\r\n            Ok(ref name) => name,\r\n            Err(_) => continue,\r\n        };\r\n        match ep.stage {\r\n            naga::ShaderStage::Vertex => {\r\n                write!(\r\n                    vertex_str,\r\n                    \"{}:{}_{} \",\r\n                    name,\r\n                    ep.stage.to_hlsl_str(),\r\n                    options.shader_model.to_str(),\r\n                )\r\n                .unwrap();\r\n            }\r\n            naga::ShaderStage::Fragment => {\r\n                write!(\r\n                    fragment_str,\r\n                    \"{}:{}_{} \",\r\n                    name,\r\n                    ep.stage.to_hlsl_str(),\r\n                    options.shader_model.to_str(),\r\n                )\r\n                .unwrap();\r\n            }\r\n            naga::ShaderStage::Compute => {\r\n                write!(\r\n                    compute_str,\r\n                    \"{}:{}_{} \",\r\n                    name,\r\n                    ep.stage.to_hlsl_str(),\r\n                    options.shader_model.to_str(),\r\n                )\r\n                .unwrap();\r\n            }\r\n        }\r\n    }\r\n\r\n    writeln!(\r\n        config_str,\r\n        \"{})\\n{})\\n{})\",\r\n        vertex_str, fragment_str, compute_str\r\n    )\r\n    .unwrap();\r\n\r\n    fs::write(\r\n        destination.join(format!(\"hlsl/{}.hlsl.config\", file_name)),\r\n        config_str,\r\n    )\r\n    .unwrap();\r\n}\r\n\r\n#[cfg(feature = \"wgsl-out\")]\r\nfn write_output_wgsl(\r\n    module: &naga::Module,\r\n    info: &naga::valid::ModuleInfo,\r\n    destination: &PathBuf,\r\n    file_name: &str,\r\n    params: &WgslOutParameters,\r\n) {\r\n    use naga::back::wgsl;\r\n\r\n    println!(\"writing WGSL\");\r\n\r\n    let mut flags = wgsl::WriterFlags::empty();\r\n    flags.set(wgsl::WriterFlags::EXPLICIT_TYPES, params.explicit_types);\r\n\r\n    let string = wgsl::write_string(module, info, flags).expect(\"WGSL write failed\");\r\n\r\n    fs::write(destination.join(format!(\"wgsl/{}.wgsl\", file_name)), string).unwrap();\r\n}\r\n\r\n#[cfg(feature = \"wgsl-in\")]\r\n#[test]\r\nfn convert_wgsl() {\r\n    let _ = env_logger::try_init();\r\n\r\n    let root = env!(\"CARGO_MANIFEST_DIR\");\r\n    let inputs = [\r\n        (\r\n            \"empty\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"quad\",\r\n            Targets::SPIRV\r\n                | Targets::METAL\r\n                | Targets::GLSL\r\n                | Targets::DOT\r\n                | Targets::HLSL\r\n                | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"bits\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"bitcast\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"boids\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"skybox\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"collatz\",\r\n            Targets::SPIRV\r\n                | Targets::METAL\r\n                | Targets::IR\r\n                | Targets::ANALYSIS\r\n                | Targets::HLSL\r\n                | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"shadow\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"image\",\r\n            Targets::SPIRV | Targets::METAL | Targets::HLSL | Targets::WGSL | Targets::GLSL,\r\n        ),\r\n        (\"extra\", Targets::SPIRV | Targets::METAL | Targets::WGSL),\r\n        (\"push-constants\", Targets::GLSL | Targets::HLSL),\r\n        (\r\n            \"operators\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"functions\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\"functions-webgl\", Targets::GLSL),\r\n        (\r\n            \"interpolate\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"access\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"padding\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\"pointers\", Targets::SPIRV | Targets::WGSL),\r\n        (\r\n            \"control-flow\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"standard\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        //TODO: GLSL https://github.com/gfx-rs/naga/issues/874\r\n        (\r\n            \"interface\",\r\n            Targets::SPIRV | Targets::METAL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\r\n            \"globals\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\"bounds-check-zero\", Targets::SPIRV | Targets::METAL),\r\n        (\"bounds-check-zero-atomic\", Targets::METAL),\r\n        (\"bounds-check-restrict\", Targets::SPIRV | Targets::METAL),\r\n        (\r\n            \"bounds-check-image-restrict\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL,\r\n        ),\r\n        (\r\n            \"bounds-check-image-rzsw\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL,\r\n        ),\r\n        (\"policy-mix\", Targets::SPIRV | Targets::METAL),\r\n        (\r\n            \"texture-arg\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\"cubeArrayShadow\", Targets::GLSL),\r\n        (\r\n            \"math-functions\",\r\n            Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n        ),\r\n        (\"cubeArrayShadow\", Targets::GLSL),\r\n        (\r\n            \"binding-arrays\",\r\n            Targets::WGSL | Targets::HLSL | Targets::METAL | Targets::SPIRV,\r\n        ),\r\n        (\"multiview\", Targets::SPIRV | Targets::GLSL | Targets::WGSL),\r\n        (\"multiview_webgl\", Targets::GLSL),\r\n        (\r\n            \"break-if\",\r\n            Targets::WGSL | Targets::GLSL | Targets::SPIRV | Targets::HLSL | Targets::METAL,\r\n        ),\r\n        (\"lexical-scopes\", Targets::WGSL),\r\n    ];\r\n\r\n    for &(name, targets) in inputs.iter() {\r\n        println!(\"Processing '{}'\", name);\r\n        // WGSL shaders lives in root dir as a privileged.\r\n        let file = fs::read_to_string(format!(\"{}/{}/{}.wgsl\", root, BASE_DIR_IN, name))\r\n            .expect(\"Couldn't find wgsl file\");\r\n        match naga::front::wgsl::parse_str(&file) {\r\n            Ok(module) => check_targets(&module, name, targets),\r\n            Err(e) => panic!(\"{}\", e.emit_to_string(&file)),\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(feature = \"spv-in\")]\r\nfn convert_spv(name: &str, adjust_coordinate_space: bool, targets: Targets) {\r\n    let _ = env_logger::try_init();\r\n\r\n    let root = env!(\"CARGO_MANIFEST_DIR\");\r\n    let module = naga::front::spv::parse_u8_slice(\r\n        &fs::read(format!(\"{}/{}/spv/{}.spv\", root, BASE_DIR_IN, name))\r\n            .expect(\"Couldn't find spv file\"),\r\n        &naga::front::spv::Options {\r\n            adjust_coordinate_space,\r\n            strict_capabilities: false,\r\n            block_ctx_dump_prefix: None,\r\n        },\r\n    )\r\n    .unwrap();\r\n    check_targets(&module, name, targets);\r\n    naga::valid::Validator::new(\r\n        naga::valid::ValidationFlags::all(),\r\n        naga::valid::Capabilities::empty(),\r\n    )\r\n    .validate(&module)\r\n    .unwrap();\r\n}\r\n\r\n#[cfg(feature = \"spv-in\")]\r\n#[test]\r\nfn convert_spv_all() {\r\n    convert_spv(\r\n        \"quad-vert\",\r\n        false,\r\n        Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL,\r\n    );\r\n    convert_spv(\"shadow\", true, Targets::IR | Targets::ANALYSIS);\r\n    convert_spv(\r\n        \"inv-hyperbolic-trig-functions\",\r\n        true,\r\n        Targets::HLSL | Targets::WGSL,\r\n    );\r\n    convert_spv(\r\n        \"empty-global-name\",\r\n        true,\r\n        Targets::HLSL | Targets::WGSL | Targets::METAL,\r\n    );\r\n    convert_spv(\r\n        \"empty-global-name\",\r\n        true,\r\n        Targets::HLSL | Targets::WGSL | Targets::METAL,\r\n    );\r\n    convert_spv(\"degrees\", false, Targets::empty());\r\n}\r\n\r\n#[cfg(feature = \"glsl-in\")]\r\n#[test]\r\nfn convert_glsl_variations_check() {\r\n    let root = env!(\"CARGO_MANIFEST_DIR\");\r\n    let file = fs::read_to_string(format!(\"{}/{}/variations.glsl\", root, BASE_DIR_IN))\r\n        .expect(\"Couldn't find glsl file\");\r\n    let mut parser = naga::front::glsl::Parser::default();\r\n    let module = parser\r\n        .parse(\r\n            &naga::front::glsl::Options {\r\n                stage: naga::ShaderStage::Fragment,\r\n                defines: Default::default(),\r\n            },\r\n            &file,\r\n        )\r\n        .unwrap();\r\n    check_targets(&module, \"variations-glsl\", Targets::GLSL);\r\n}\r\n\r\n#[cfg(feature = \"glsl-in\")]\r\n#[allow(unused_variables)]\r\n#[test]\r\nfn convert_glsl_folder() {\r\n    let _ = env_logger::try_init();\r\n\r\n    let root = env!(\"CARGO_MANIFEST_DIR\");\r\n\r\n    for entry in std::fs::read_dir(format!(\"{}/{}/glsl\", root, BASE_DIR_IN)).unwrap() {\r\n        let entry = entry.unwrap();\r\n        let file_name = entry.file_name().into_string().unwrap();\r\n\r\n        if file_name.ends_with(\".ron\") {\r\n            // No needed to validate ron files\r\n            continue;\r\n        }\r\n        println!(\"Processing {}\", file_name);\r\n\r\n        let mut parser = naga::front::glsl::Parser::default();\r\n        let module = parser\r\n            .parse(\r\n                &naga::front::glsl::Options {\r\n                    stage: match entry.path().extension().and_then(|s| s.to_str()).unwrap() {\r\n                        \"vert\" => naga::ShaderStage::Vertex,\r\n                        \"frag\" => naga::ShaderStage::Fragment,\r\n                        \"comp\" => naga::ShaderStage::Compute,\r\n                        ext => panic!(\"Unknown extension for glsl file {}\", ext),\r\n                    },\r\n                    defines: Default::default(),\r\n                },\r\n                &fs::read_to_string(entry.path()).expect(\"Couldn't find glsl file\"),\r\n            )\r\n            .unwrap();\r\n\r\n        let info = naga::valid::Validator::new(\r\n            naga::valid::ValidationFlags::all(),\r\n            naga::valid::Capabilities::all(),\r\n        )\r\n        .validate(&module)\r\n        .unwrap();\r\n\r\n        #[cfg(feature = \"wgsl-out\")]\r\n        {\r\n            let dest = PathBuf::from(root).join(BASE_DIR_OUT);\r\n            write_output_wgsl(\r\n                &module,\r\n                &info,\r\n                &dest,\r\n                &file_name.replace(\".\", \"-\"),\r\n                &WgslOutParameters::default(),\r\n            );\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/spirv-capabilities.rs",
    "content": "/*!\r\nTest SPIR-V backend capability checks.\r\n*/\r\n\r\n#![cfg(all(feature = \"wgsl-in\", feature = \"spv-out\"))]\r\n\r\nuse spirv::Capability as Ca;\r\n\r\nfn capabilities_used(source: &str) -> naga::FastHashSet<Ca> {\r\n    use naga::back::spv;\r\n    use naga::valid;\r\n\r\n    let module = naga::front::wgsl::parse_str(source).unwrap_or_else(|e| {\r\n        panic!(\r\n            \"expected WGSL to parse successfully:\\n{}\",\r\n            e.emit_to_string(source)\r\n        );\r\n    });\r\n\r\n    let info = valid::Validator::new(valid::ValidationFlags::all(), valid::Capabilities::all())\r\n        .validate(&module)\r\n        .expect(\"validation failed\");\r\n\r\n    let mut words = vec![];\r\n    let mut writer = spv::Writer::new(&spv::Options::default()).unwrap();\r\n    writer.write(&module, &info, None, &mut words).unwrap();\r\n    writer.get_capabilities_used().clone()\r\n}\r\n\r\nfn require(capabilities: &[Ca], source: &str) {\r\n    require_and_forbid(capabilities, &[], source);\r\n}\r\n\r\nfn require_and_forbid(required: &[Ca], forbidden: &[Ca], source: &str) {\r\n    let caps_used = capabilities_used(source);\r\n\r\n    let missing_caps: Vec<_> = required\r\n        .iter()\r\n        .filter(|cap| !caps_used.contains(cap))\r\n        .cloned()\r\n        .collect();\r\n    if !missing_caps.is_empty() {\r\n        panic!(\r\n            \"shader code should have requested these caps: {:?}\\n\\n{}\",\r\n            missing_caps, source\r\n        );\r\n    }\r\n\r\n    let forbidden_caps: Vec<_> = forbidden\r\n        .iter()\r\n        .filter(|cap| caps_used.contains(cap))\r\n        .cloned()\r\n        .collect();\r\n    if !forbidden_caps.is_empty() {\r\n        panic!(\r\n            \"shader code should not have requested these caps: {:?}\\n\\n{}\",\r\n            forbidden_caps, source\r\n        );\r\n    }\r\n}\r\n\r\n#[test]\r\nfn sampler1d() {\r\n    require(\r\n        &[Ca::Sampled1D],\r\n        r#\"\r\n        @group(0) @binding(0)\r\n        var image_1d: texture_1d<f32>;\r\n    \"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn storage1d() {\r\n    require(\r\n        &[Ca::Image1D],\r\n        r#\"\r\n        @group(0) @binding(0)\r\n        var image_1d: texture_storage_1d<rgba8unorm,write>;\r\n    \"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn cube_array() {\r\n    // ImageCubeArray is only for storage cube array images, which WGSL doesn't\r\n    // support\r\n    require_and_forbid(\r\n        &[Ca::SampledCubeArray],\r\n        &[Ca::ImageCubeArray],\r\n        r#\"\r\n        @group(0) @binding(0)\r\n        var image_cube: texture_cube_array<f32>;\r\n    \"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn image_queries() {\r\n    require(\r\n        &[Ca::ImageQuery],\r\n        r#\"\r\n        fn f(i: texture_2d<f32>) -> vec2<i32> {\r\n            return textureDimensions(i);\r\n        }\r\n    \"#,\r\n    );\r\n    require(\r\n        &[Ca::ImageQuery],\r\n        r#\"\r\n        fn f(i: texture_2d_array<f32>) -> i32 {\r\n            return textureNumLayers(i);\r\n        }\r\n    \"#,\r\n    );\r\n    require(\r\n        &[Ca::ImageQuery],\r\n        r#\"\r\n        fn f(i: texture_2d<f32>) -> i32 {\r\n            return textureNumLevels(i);\r\n        }\r\n    \"#,\r\n    );\r\n    require(\r\n        &[Ca::ImageQuery],\r\n        r#\"\r\n        fn f(i: texture_multisampled_2d<f32>) -> i32 {\r\n            return textureNumSamples(i);\r\n        }\r\n    \"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn sample_rate_shading() {\r\n    require(\r\n        &[Ca::SampleRateShading],\r\n        r#\"\r\n        @fragment\r\n        fn f(@location(0) @interpolate(perspective, sample) x: f32) { }\r\n    \"#,\r\n    );\r\n\r\n    require(\r\n        &[Ca::SampleRateShading],\r\n        r#\"\r\n        @fragment\r\n        fn f(@builtin(sample_index) x: u32) { }\r\n    \"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn geometry() {\r\n    require(\r\n        &[Ca::Geometry],\r\n        r#\"\r\n        @fragment\r\n        fn f(@builtin(primitive_index) x: u32) { }\r\n    \"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn storage_image_formats() {\r\n    require_and_forbid(\r\n        &[Ca::Shader],\r\n        &[Ca::StorageImageExtendedFormats],\r\n        r#\"\r\n            @group(0) @binding(0)\r\n            var image_rg32f: texture_storage_2d<rgba16uint, read>;\r\n        \"#,\r\n    );\r\n\r\n    require(\r\n        &[Ca::StorageImageExtendedFormats],\r\n        r#\"\r\n            @group(0) @binding(0)\r\n            var image_rg32f: texture_storage_2d<rg32float, read>;\r\n        \"#,\r\n    );\r\n}\r\n"
  },
  {
    "path": "lib/naga/tests/wgsl-errors.rs",
    "content": "/*!\r\nTests for the WGSL front end.\r\n*/\r\n#![cfg(feature = \"wgsl-in\")]\r\n\r\nfn check(input: &str, snapshot: &str) {\r\n    let output = naga::front::wgsl::parse_str(input)\r\n        .expect_err(\"expected parser error\")\r\n        .emit_to_string(input);\r\n    if output != snapshot {\r\n        for diff in diff::lines(&output, snapshot) {\r\n            match diff {\r\n                diff::Result::Left(l) => println!(\"-{}\", l),\r\n                diff::Result::Both(l, _) => println!(\" {}\", l),\r\n                diff::Result::Right(r) => println!(\"+{}\", r),\r\n            }\r\n        }\r\n        panic!(\"Error snapshot failed\");\r\n    }\r\n}\r\n\r\n#[test]\r\nfn reserved_identifier_prefix() {\r\n    check(\r\n        \"var __bad;\",\r\n        r###\"error: Identifier starts with a reserved prefix: '__bad'\r\n  ┌─ wgsl:1:5\r\n  │\r\n1 │ var __bad;\r\n  │     ^^^^^ invalid identifier\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn function_without_identifier() {\r\n    check(\r\n        \"fn () {}\",\r\n        r###\"error: expected identifier, found '('\r\n  ┌─ wgsl:1:4\r\n  │\r\n1 │ fn () {}\r\n  │    ^ expected identifier\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn invalid_integer() {\r\n    check(\r\n        \"fn foo([location(1.)] x: i32) {}\",\r\n        r###\"error: expected identifier, found '['\r\n  ┌─ wgsl:1:8\r\n  │\r\n1 │ fn foo([location(1.)] x: i32) {}\r\n  │        ^ expected identifier\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn invalid_float() {\r\n    check(\r\n        \"let scale: f32 = 1.1.;\",\r\n        r###\"error: expected ';', found '.'\r\n  ┌─ wgsl:1:21\r\n  │\r\n1 │ let scale: f32 = 1.1.;\r\n  │                     ^ expected ';'\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn invalid_texture_sample_type() {\r\n    check(\r\n        \"let x: texture_2d<f16>;\",\r\n        r###\"error: texture sample type must be one of f32, i32 or u32, but found f16\r\n  ┌─ wgsl:1:19\r\n  │\r\n1 │ let x: texture_2d<f16>;\r\n  │                   ^^^ must be one of f32, i32 or u32\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_identifier() {\r\n    check(\r\n        r###\"\r\n              fn f(x: f32) -> f32 {\r\n                  return x * schmoo;\r\n              }\r\n          \"###,\r\n        r###\"error: no definition in scope for identifier: 'schmoo'\r\n  ┌─ wgsl:3:30\r\n  │\r\n3 │                   return x * schmoo;\r\n  │                              ^^^^^^ unknown identifier\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn negative_index() {\r\n    check(\r\n        r#\"\r\n            fn main() -> f32 {\r\n                let a = array<f32, 3>(0., 1., 2.);\r\n                return a[-1];\r\n            }\r\n        \"#,\r\n        r#\"error: expected unsigned integer constant expression, found `-1`\r\n  ┌─ wgsl:4:26\r\n  │\r\n4 │                 return a[-1];\r\n  │                          ^^ expected unsigned integer\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn bad_texture() {\r\n    check(\r\n        r#\"\r\n            @group(0) @binding(0) var sampler1 : sampler;\r\n\r\n            @fragment\r\n            fn main() -> @location(0) vec4<f32> {\r\n                let a = 3;\r\n                return textureSample(a, sampler1, vec2<f32>(0.0));\r\n            }\r\n        \"#,\r\n        r#\"error: expected an image, but found 'a' which is not an image\r\n  ┌─ wgsl:7:38\r\n  │\r\n7 │                 return textureSample(a, sampler1, vec2<f32>(0.0));\r\n  │                                      ^ not an image\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn bad_type_cast() {\r\n    check(\r\n        r#\"\r\n            fn x() -> i32 {\r\n                return i32(vec2<f32>(0.0));\r\n            }\r\n        \"#,\r\n        r#\"error: cannot cast a vec2<f32> to a i32\r\n  ┌─ wgsl:3:28\r\n  │\r\n3 │                 return i32(vec2<f32>(0.0));\r\n  │                            ^^^^^^^^^^^^^^ cannot cast a vec2<f32> to a i32\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn type_not_constructible() {\r\n    check(\r\n        r#\"\r\n            fn x() {\r\n                _ = atomic<i32>(0);\r\n            }\r\n        \"#,\r\n        r#\"error: type `atomic` is not constructible\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 _ = atomic<i32>(0);\r\n  │                     ^^^^^^ type is not constructible\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn type_not_inferrable() {\r\n    check(\r\n        r#\"\r\n            fn x() {\r\n                _ = vec2();\r\n            }\r\n        \"#,\r\n        r#\"error: type can't be inferred\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 _ = vec2();\r\n  │                     ^^^^ type can't be inferred\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unexpected_constructor_parameters() {\r\n    check(\r\n        r#\"\r\n            fn x() {\r\n                _ = i32(0, 1);\r\n            }\r\n        \"#,\r\n        r#\"error: unexpected components\r\n  ┌─ wgsl:3:27\r\n  │\r\n3 │                 _ = i32(0, 1);\r\n  │                           ^^ unexpected components\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn constructor_parameter_type_mismatch() {\r\n    check(\r\n        r#\"\r\n            fn x() {\r\n                _ = mat2x2<f32>(array(0, 1), vec2(2, 3));\r\n            }\r\n        \"#,\r\n        r#\"error: invalid type for constructor component at index [0]\r\n  ┌─ wgsl:3:33\r\n  │\r\n3 │                 _ = mat2x2<f32>(array(0, 1), vec2(2, 3));\r\n  │                                 ^^^^^^^^^^^ invalid component type\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn bad_texture_sample_type() {\r\n    check(\r\n        r#\"\r\n            @group(0) @binding(0) var sampler1 : sampler;\r\n            @group(0) @binding(1) var texture : texture_2d<bool>;\r\n\r\n            @fragment\r\n            fn main() -> @location(0) vec4<f32> {\r\n                return textureSample(texture, sampler1, vec2<f32>(0.0));\r\n            }\r\n        \"#,\r\n        r#\"error: texture sample type must be one of f32, i32 or u32, but found bool\r\n  ┌─ wgsl:3:60\r\n  │\r\n3 │             @group(0) @binding(1) var texture : texture_2d<bool>;\r\n  │                                                            ^^^^ must be one of f32, i32 or u32\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn bad_for_initializer() {\r\n    check(\r\n        r#\"\r\n            fn x() {\r\n                for ({};;) {}\r\n            }\r\n        \"#,\r\n        r#\"error: for(;;) initializer is not an assignment or a function call: '{}'\r\n  ┌─ wgsl:3:22\r\n  │\r\n3 │                 for ({};;) {}\r\n  │                      ^^ not an assignment or function call\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_storage_class() {\r\n    check(\r\n        r#\"\r\n            @group(0) @binding(0) var<bad> texture: texture_2d<f32>;\r\n        \"#,\r\n        r#\"error: unknown address space: 'bad'\r\n  ┌─ wgsl:2:39\r\n  │\r\n2 │             @group(0) @binding(0) var<bad> texture: texture_2d<f32>;\r\n  │                                       ^^^ unknown address space\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_attribute() {\r\n    check(\r\n        r#\"\r\n            @a\r\n            fn x() {}\r\n        \"#,\r\n        r#\"error: unknown attribute: 'a'\r\n  ┌─ wgsl:2:14\r\n  │\r\n2 │             @a\r\n  │              ^ unknown attribute\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_built_in() {\r\n    check(\r\n        r#\"\r\n            fn x(@builtin(unknown_built_in) y: u32) {}\r\n        \"#,\r\n        r#\"error: unknown builtin: 'unknown_built_in'\r\n  ┌─ wgsl:2:27\r\n  │\r\n2 │             fn x(@builtin(unknown_built_in) y: u32) {}\r\n  │                           ^^^^^^^^^^^^^^^^ unknown builtin\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_access() {\r\n    check(\r\n        r#\"\r\n            var<storage,unknown_access> x: array<u32>;\r\n        \"#,\r\n        r#\"error: unknown access: 'unknown_access'\r\n  ┌─ wgsl:2:25\r\n  │\r\n2 │             var<storage,unknown_access> x: array<u32>;\r\n  │                         ^^^^^^^^^^^^^^ unknown access\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_ident() {\r\n    check(\r\n        r#\"\r\n            fn main() {\r\n                let a = b;\r\n            }\r\n        \"#,\r\n        r#\"error: no definition in scope for identifier: 'b'\r\n  ┌─ wgsl:3:25\r\n  │\r\n3 │                 let a = b;\r\n  │                         ^ unknown identifier\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_scalar_type() {\r\n    check(\r\n        r#\"\r\n            let a: vec2<something>;\r\n        \"#,\r\n        r#\"error: unknown scalar type: 'something'\r\n  ┌─ wgsl:2:25\r\n  │\r\n2 │             let a: vec2<something>;\r\n  │                         ^^^^^^^^^ unknown scalar type\r\n  │\r\n  = note: Valid scalar types are f16, f32, f64, i8, i16, i32, i64, u8, u16, u32, u64, bool\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_type() {\r\n    check(\r\n        r#\"\r\n            let a: Vec<f32>;\r\n        \"#,\r\n        r#\"error: unknown type: 'Vec'\r\n  ┌─ wgsl:2:20\r\n  │\r\n2 │             let a: Vec<f32>;\r\n  │                    ^^^ unknown type\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_storage_format() {\r\n    check(\r\n        r#\"\r\n            let storage1: texture_storage_1d<rgba>;\r\n        \"#,\r\n        r#\"error: unknown storage format: 'rgba'\r\n  ┌─ wgsl:2:46\r\n  │\r\n2 │             let storage1: texture_storage_1d<rgba>;\r\n  │                                              ^^^^ unknown storage format\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_conservative_depth() {\r\n    check(\r\n        r#\"\r\n            @early_depth_test(abc) fn main() {}\r\n        \"#,\r\n        r#\"error: unknown conservative depth: 'abc'\r\n  ┌─ wgsl:2:31\r\n  │\r\n2 │             @early_depth_test(abc) fn main() {}\r\n  │                               ^^^ unknown conservative depth\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn struct_member_size_too_low() {\r\n    check(\r\n        r#\"\r\n            struct Bar {\r\n                @size(0) data: array<f32>\r\n            }\r\n        \"#,\r\n        r#\"error: struct member size must be at least 4\r\n  ┌─ wgsl:3:23\r\n  │\r\n3 │                 @size(0) data: array<f32>\r\n  │                       ^ must be at least 4\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn struct_member_align_too_low() {\r\n    check(\r\n        r#\"\r\n            struct Bar {\r\n                @align(8) data: vec3<f32>\r\n            }\r\n        \"#,\r\n        r#\"error: struct member alignment must be at least 16\r\n  ┌─ wgsl:3:24\r\n  │\r\n3 │                 @align(8) data: vec3<f32>\r\n  │                        ^ must be at least 16\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn struct_member_non_po2_align() {\r\n    check(\r\n        r#\"\r\n            struct Bar {\r\n                @align(7) data: array<f32>\r\n            }\r\n        \"#,\r\n        r#\"error: struct member alignment must be a power of 2\r\n  ┌─ wgsl:3:24\r\n  │\r\n3 │                 @align(7) data: array<f32>\r\n  │                        ^ must be a power of 2\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn inconsistent_binding() {\r\n    check(\r\n        r#\"\r\n        fn foo(@builtin(vertex_index) @location(0) x: u32) {}\r\n        \"#,\r\n        r#\"error: input/output binding is not consistent\r\n  ┌─ wgsl:2:16\r\n  │\r\n2 │         fn foo(@builtin(vertex_index) @location(0) x: u32) {}\r\n  │                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ input/output binding is not consistent\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn unknown_local_function() {\r\n    check(\r\n        r#\"\r\n            fn x() {\r\n                for (a();;) {}\r\n            }\r\n        \"#,\r\n        r#\"error: unknown local function `a`\r\n  ┌─ wgsl:3:22\r\n  │\r\n3 │                 for (a();;) {}\r\n  │                      ^ unknown local function\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn let_type_mismatch() {\r\n    check(\r\n        r#\"\r\n            let x: i32 = 1.0;\r\n        \"#,\r\n        r#\"error: the type of `x` is expected to be `f32`\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             let x: i32 = 1.0;\r\n  │                 ^ definition of `x`\r\n\r\n\"#,\r\n    );\r\n\r\n    check(\r\n        r#\"\r\n            fn foo() {\r\n                let x: f32 = true;\r\n            }\r\n        \"#,\r\n        r#\"error: the type of `x` is expected to be `bool`\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 let x: f32 = true;\r\n  │                     ^ definition of `x`\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn var_type_mismatch() {\r\n    check(\r\n        r#\"\r\n            let x: f32 = 1;\r\n        \"#,\r\n        r#\"error: the type of `x` is expected to be `i32`\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             let x: f32 = 1;\r\n  │                 ^ definition of `x`\r\n\r\n\"#,\r\n    );\r\n\r\n    check(\r\n        r#\"\r\n            fn foo() {\r\n                var x: f32 = 1u32;\r\n            }\r\n        \"#,\r\n        r#\"error: the type of `x` is expected to be `u32`\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 var x: f32 = 1u32;\r\n  │                     ^ definition of `x`\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn local_var_missing_type() {\r\n    check(\r\n        r#\"\r\n            fn foo() {\r\n                var x;\r\n            }\r\n        \"#,\r\n        r#\"error: variable `x` needs a type\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 var x;\r\n  │                     ^ definition of `x`\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn postfix_pointers() {\r\n    check(\r\n        r#\"\r\n            fn main() {\r\n                var v: vec4<f32> = vec4<f32>(1.0, 1.0, 1.0, 1.0);\r\n                let pv = &v;\r\n                let a = *pv[3]; // Problematic line\r\n            }\r\n        \"#,\r\n        r#\"error: the value indexed by a `[]` subscripting expression must not be a pointer\r\n  ┌─ wgsl:5:26\r\n  │\r\n5 │                 let a = *pv[3]; // Problematic line\r\n  │                          ^^ expression is a pointer\r\n\r\n\"#,\r\n    );\r\n\r\n    check(\r\n        r#\"\r\n            struct S { m: i32 };\r\n            fn main() {\r\n                var s: S = S(42);\r\n                let ps = &s;\r\n                let a = *ps.m; // Problematic line\r\n            }\r\n        \"#,\r\n        r#\"error: the value accessed by a `.member` expression must not be a pointer\r\n  ┌─ wgsl:6:26\r\n  │\r\n6 │                 let a = *ps.m; // Problematic line\r\n  │                          ^^ expression is a pointer\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn reserved_keyword() {\r\n    // global var\r\n    check(\r\n        r#\"\r\n            var bool: bool = true;\r\n        \"#,\r\n        r###\"error: name `bool: bool = true;` is a reserved keyword\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             var bool: bool = true;\r\n  │                 ^^^^^^^^^^^^^^^^^^ definition of `bool: bool = true;`\r\n\r\n\"###,\r\n    );\r\n\r\n    // global constant\r\n    check(\r\n        r#\"\r\n            let break: bool = true;\r\n            fn foo() {\r\n                var foo = break;\r\n            }\r\n        \"#,\r\n        r###\"error: name `break` is a reserved keyword\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             let break: bool = true;\r\n  │                 ^^^^^ definition of `break`\r\n\r\n\"###,\r\n    );\r\n\r\n    // local let\r\n    check(\r\n        r#\"\r\n            fn foo() {\r\n                let atomic: f32 = 1.0;\r\n            }\r\n        \"#,\r\n        r###\"error: name `atomic` is a reserved keyword\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 let atomic: f32 = 1.0;\r\n  │                     ^^^^^^ definition of `atomic`\r\n\r\n\"###,\r\n    );\r\n\r\n    // local var\r\n    check(\r\n        r#\"\r\n            fn foo() {\r\n                var sampler: f32 = 1.0;\r\n            }\r\n        \"#,\r\n        r###\"error: name `sampler` is a reserved keyword\r\n  ┌─ wgsl:3:21\r\n  │\r\n3 │                 var sampler: f32 = 1.0;\r\n  │                     ^^^^^^^ definition of `sampler`\r\n\r\n\"###,\r\n    );\r\n\r\n    // fn name\r\n    check(\r\n        r#\"\r\n            fn break() {}\r\n        \"#,\r\n        r###\"error: name `break` is a reserved keyword\r\n  ┌─ wgsl:2:16\r\n  │\r\n2 │             fn break() {}\r\n  │                ^^^^^ definition of `break`\r\n\r\n\"###,\r\n    );\r\n\r\n    // struct\r\n    check(\r\n        r#\"\r\n            struct array {}\r\n        \"#,\r\n        r###\"error: name `array` is a reserved keyword\r\n  ┌─ wgsl:2:20\r\n  │\r\n2 │             struct array {}\r\n  │                    ^^^^^ definition of `array`\r\n\r\n\"###,\r\n    );\r\n\r\n    // struct member\r\n    check(\r\n        r#\"\r\n            struct Foo { sampler: f32 }\r\n        \"#,\r\n        r###\"error: name `sampler` is a reserved keyword\r\n  ┌─ wgsl:2:26\r\n  │\r\n2 │             struct Foo { sampler: f32 }\r\n  │                          ^^^^^^^ definition of `sampler`\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn module_scope_identifier_redefinition() {\r\n    // let\r\n    check(\r\n        r#\"\r\n            let foo: bool = true;\r\n            let foo: bool = true;\r\n        \"#,\r\n        r###\"error: redefinition of `foo`\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             let foo: bool = true;\r\n  │                 ^^^ previous definition of `foo`\r\n3 │             let foo: bool = true;\r\n  │                 ^^^ redefinition of `foo`\r\n\r\n\"###,\r\n    );\r\n    // var\r\n    check(\r\n        r#\"\r\n            var foo: bool = true;\r\n            var foo: bool = true;\r\n        \"#,\r\n        r###\"error: redefinition of `foo: bool = true;`\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             var foo: bool = true;\r\n  │                 ^^^^^^^^^^^^^^^^^ previous definition of `foo: bool = true;`\r\n3 │             var foo: bool = true;\r\n  │                 ^^^^^^^^^^^^^^^^^ redefinition of `foo: bool = true;`\r\n\r\n\"###,\r\n    );\r\n\r\n    // let and var\r\n    check(\r\n        r#\"\r\n            var foo: bool = true;\r\n            let foo: bool = true;\r\n        \"#,\r\n        r###\"error: redefinition of `foo`\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             var foo: bool = true;\r\n  │                 ^^^^^^^^^^^^^^^^^ previous definition of `foo: bool = true;`\r\n3 │             let foo: bool = true;\r\n  │                 ^^^ redefinition of `foo`\r\n\r\n\"###,\r\n    );\r\n\r\n    // function\r\n    check(\r\n        r#\"fn foo() {}\r\n                fn bar() {}\r\n                fn foo() {}\"#,\r\n        r###\"error: redefinition of `foo`\r\n  ┌─ wgsl:1:4\r\n  │\r\n1 │ fn foo() {}\r\n  │    ^^^ previous definition of `foo`\r\n2 │                 fn bar() {}\r\n3 │                 fn foo() {}\r\n  │                    ^^^ redefinition of `foo`\r\n\r\n\"###,\r\n    );\r\n\r\n    // let and function\r\n    check(\r\n        r#\"\r\n            let foo: bool = true;\r\n            fn foo() {}\r\n        \"#,\r\n        r###\"error: redefinition of `foo`\r\n  ┌─ wgsl:2:17\r\n  │\r\n2 │             let foo: bool = true;\r\n  │                 ^^^ previous definition of `foo`\r\n3 │             fn foo() {}\r\n  │                ^^^ redefinition of `foo`\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn matrix_with_bad_type() {\r\n    check(\r\n        r#\"\r\n            fn main() {\r\n                let m = mat2x2<i32>();\r\n            }\r\n        \"#,\r\n        r#\"error: matrix scalar type must be floating-point, but found `i32`\r\n  ┌─ wgsl:3:32\r\n  │\r\n3 │                 let m = mat2x2<i32>();\r\n  │                                ^^^ must be floating-point (e.g. `f32`)\r\n\r\n\"#,\r\n    );\r\n\r\n    check(\r\n        r#\"\r\n            fn main() {\r\n                let m: mat3x3<i32>;\r\n            }\r\n        \"#,\r\n        r#\"error: matrix scalar type must be floating-point, but found `i32`\r\n  ┌─ wgsl:3:31\r\n  │\r\n3 │                 let m: mat3x3<i32>;\r\n  │                               ^^^ must be floating-point (e.g. `f32`)\r\n\r\n\"#,\r\n    );\r\n}\r\n\r\n/// Check the result of validating a WGSL program against a pattern.\r\n///\r\n/// Unless you are generating code programmatically, the\r\n/// `check_validation_error` macro will probably be more convenient to\r\n/// use.\r\nmacro_rules! check_one_validation {\r\n    ( $source:expr, $pattern:pat $( if $guard:expr )? ) => {\r\n        let source = $source;\r\n        let error = validation_error($source);\r\n        if ! matches!(&error, $pattern $( if $guard )? ) {\r\n            eprintln!(\"validation error does not match pattern:\\n\\\r\n                       source code: {}\\n\\\r\n                       \\n\\\r\n                       actual result:\\n\\\r\n                       {:#?}\\n\\\r\n                       \\n\\\r\n                       expected match for pattern:\\n\\\r\n                       {}\",\r\n                      &source,\r\n                      error,\r\n                      stringify!($pattern));\r\n            $( eprintln!(\"if {}\", stringify!($guard)); )?\r\n            panic!(\"validation error does not match pattern\");\r\n        }\r\n    }\r\n}\r\n\r\nmacro_rules! check_validation {\r\n    // We want to support an optional guard expression after the pattern, so\r\n    // that we can check values we can't match against, like strings.\r\n    // Unfortunately, we can't simply include `$( if $guard:expr )?` in the\r\n    // pattern, because Rust treats `?` as a repetition operator, and its count\r\n    // (0 or 1) will not necessarily match `$source`.\r\n    ( $( $source:literal ),* : $pattern:pat ) => {\r\n        $(\r\n            check_one_validation!($source, $pattern);\r\n        )*\r\n    };\r\n    ( $( $source:literal ),* : $pattern:pat if $guard:expr ) => {\r\n        $(\r\n            check_one_validation!($source, $pattern if $guard);\r\n        )*\r\n    }\r\n}\r\n\r\nfn validation_error(source: &str) -> Result<naga::valid::ModuleInfo, naga::valid::ValidationError> {\r\n    let module = match naga::front::wgsl::parse_str(source) {\r\n        Ok(module) => module,\r\n        Err(err) => {\r\n            eprintln!(\"WGSL parse failed:\");\r\n            panic!(\"{}\", err.emit_to_string(source));\r\n        }\r\n    };\r\n    naga::valid::Validator::new(\r\n        naga::valid::ValidationFlags::all(),\r\n        naga::valid::Capabilities::empty(),\r\n    )\r\n    .validate(&module)\r\n    .map_err(|e| e.into_inner()) // TODO: Add tests for spans, too?\r\n}\r\n\r\n#[test]\r\nfn invalid_arrays() {\r\n    check_validation! {\r\n        \"type Bad = array<array<f32>, 4>;\",\r\n        \"type Bad = array<sampler, 4>;\",\r\n        \"type Bad = array<texture_2d<f32>, 4>;\":\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::InvalidArrayBaseType(_),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"type Bad = array<f32, true>;\",\r\n        r#\"\r\n            let length: f32 = 2.718;\r\n            type Bad = array<f32, length>;\r\n        \"#:\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::InvalidArraySizeConstant(_),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"type Bad = array<f32, 0>;\",\r\n        \"type Bad = array<f32, -1>;\":\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::NonPositiveArrayLength(_),\r\n            ..\r\n        })\r\n    }\r\n}\r\n\r\n#[test]\r\nfn invalid_structs() {\r\n    check_validation! {\r\n        \"struct Bad { data: sampler }\",\r\n        \"struct Bad { data: texture_2d<f32> }\":\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::InvalidData(_),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"struct Bad { data: array<f32>, other: f32, }\":\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::InvalidDynamicArray(_, _),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"struct Empty {}\":\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::EmptyStruct,\r\n            ..\r\n        })\r\n    }\r\n}\r\n\r\n#[test]\r\nfn invalid_functions() {\r\n    check_validation! {\r\n        \"fn unacceptable_unsized(arg: array<f32>) { }\",\r\n        \"\r\n        struct Unsized { data: array<f32> }\r\n        fn unacceptable_unsized(arg: Unsized) { }\r\n        \":\r\n        Err(naga::valid::ValidationError::Function {\r\n            name: function_name,\r\n            error: naga::valid::FunctionError::InvalidArgumentType {\r\n                index: 0,\r\n                name: argument_name,\r\n            },\r\n            ..\r\n        })\r\n        if function_name == \"unacceptable_unsized\" && argument_name == \"arg\"\r\n    }\r\n\r\n    // Pointer's address space cannot hold unsized data.\r\n    check_validation! {\r\n        \"fn unacceptable_unsized(arg: ptr<workgroup, array<f32>>) { }\",\r\n        \"\r\n        struct Unsized { data: array<f32> }\r\n        fn unacceptable_unsized(arg: ptr<workgroup, Unsized>) { }\r\n        \":\r\n        Err(naga::valid::ValidationError::Type {\r\n            error: naga::valid::TypeError::InvalidPointerToUnsized {\r\n                base: _,\r\n                space: naga::AddressSpace::WorkGroup { .. },\r\n            },\r\n            ..\r\n        })\r\n    }\r\n\r\n    // Pointers of these storage classes cannot be passed as arguments.\r\n    check_validation! {\r\n        \"fn unacceptable_ptr_space(arg: ptr<storage, array<f32>>) { }\":\r\n        Err(naga::valid::ValidationError::Function {\r\n            name: function_name,\r\n            error: naga::valid::FunctionError::InvalidArgumentPointerSpace {\r\n                index: 0,\r\n                name: argument_name,\r\n                space: naga::AddressSpace::Storage { .. },\r\n            },\r\n            ..\r\n        })\r\n        if function_name == \"unacceptable_ptr_space\" && argument_name == \"arg\"\r\n    }\r\n\r\n    check_validation! {\r\n        \"fn unacceptable_ptr_space(arg: ptr<uniform, f32>) { }\":\r\n        Err(naga::valid::ValidationError::Function {\r\n            name: function_name,\r\n            error: naga::valid::FunctionError::InvalidArgumentPointerSpace {\r\n                index: 0,\r\n                name: argument_name,\r\n                space: naga::AddressSpace::Uniform,\r\n            },\r\n            ..\r\n        })\r\n        if function_name == \"unacceptable_ptr_space\" && argument_name == \"arg\"\r\n    }\r\n\r\n    check_validation! {\r\n        \"\r\n        struct AFloat {\r\n          said_float: f32\r\n        };\r\n        @group(0) @binding(0)\r\n        var<storage> float: AFloat;\r\n\r\n        fn return_pointer() -> ptr<storage, f32> {\r\n           return &float.said_float;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::Function {\r\n            name: function_name,\r\n            error: naga::valid::FunctionError::NonConstructibleReturnType,\r\n            ..\r\n        })\r\n        if function_name == \"return_pointer\"\r\n    }\r\n\r\n    check_validation! {\r\n        \"\r\n        @group(0) @binding(0)\r\n        var<storage> atom: atomic<u32>;\r\n\r\n        fn return_atomic() -> atomic<u32> {\r\n           return atom;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::Function {\r\n            name: function_name,\r\n            error: naga::valid::FunctionError::NonConstructibleReturnType,\r\n            ..\r\n        })\r\n        if function_name == \"return_atomic\"\r\n    }\r\n}\r\n\r\n#[test]\r\nfn pointer_type_equivalence() {\r\n    check_validation! {\r\n        r#\"\r\n            fn f(pv: ptr<function, vec2<f32>>, pf: ptr<function, f32>) { }\r\n\r\n            fn g() {\r\n               var m: mat2x2<f32>;\r\n               let pv: ptr<function, vec2<f32>> = &m.x;\r\n               let pf: ptr<function, f32> = &m.x.x;\r\n\r\n               f(pv, pf);\r\n            }\r\n        \"#:\r\n        Ok(_)\r\n    }\r\n}\r\n\r\n#[test]\r\nfn missing_bindings() {\r\n    check_validation! {\r\n        \"\r\n        @vertex\r\n        fn vertex(_input: vec4<f32>) -> @location(0) vec4<f32> {\r\n           return _input;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::EntryPoint {\r\n            stage: naga::ShaderStage::Vertex,\r\n            error: naga::valid::EntryPointError::Argument(\r\n                0,\r\n                naga::valid::VaryingError::MissingBinding,\r\n            ),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"\r\n        @vertex\r\n        fn vertex(@location(0) _input: vec4<f32>, more_input: f32) -> @location(0) vec4<f32> {\r\n           return _input + more_input;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::EntryPoint {\r\n            stage: naga::ShaderStage::Vertex,\r\n            error: naga::valid::EntryPointError::Argument(\r\n                1,\r\n                naga::valid::VaryingError::MissingBinding,\r\n            ),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"\r\n        @vertex\r\n        fn vertex(@location(0) _input: vec4<f32>) -> vec4<f32> {\r\n           return _input;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::EntryPoint {\r\n            stage: naga::ShaderStage::Vertex,\r\n            error: naga::valid::EntryPointError::Result(\r\n                naga::valid::VaryingError::MissingBinding,\r\n            ),\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        \"\r\n        struct VertexIn {\r\n          @location(0) pos: vec4<f32>,\r\n          uv: vec2<f32>\r\n        }\r\n\r\n        @vertex\r\n        fn vertex(_input: VertexIn) -> @location(0) vec4<f32> {\r\n           return _input.pos;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::EntryPoint {\r\n            stage: naga::ShaderStage::Vertex,\r\n            error: naga::valid::EntryPointError::Argument(\r\n                0,\r\n                naga::valid::VaryingError::MemberMissingBinding(1),\r\n            ),\r\n            ..\r\n        })\r\n    }\r\n}\r\n\r\n#[test]\r\nfn invalid_access() {\r\n    check_validation! {\r\n        \"\r\n        fn array_by_value(a: array<i32, 5>, i: i32) -> i32 {\r\n            return a[i];\r\n        }\r\n        \",\r\n        \"\r\n        fn matrix_by_value(m: mat4x4<f32>, i: i32) -> vec4<f32> {\r\n            return m[i];\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::Function {\r\n            error: naga::valid::FunctionError::Expression {\r\n                error: naga::valid::ExpressionError::IndexMustBeConstant(_),\r\n                ..\r\n            },\r\n            ..\r\n        })\r\n    }\r\n\r\n    check_validation! {\r\n        r#\"\r\n            fn main() -> f32 {\r\n                let a = array<f32, 3>(0., 1., 2.);\r\n                return a[3];\r\n            }\r\n        \"#:\r\n        Err(naga::valid::ValidationError::Function {\r\n            error: naga::valid::FunctionError::Expression {\r\n                error: naga::valid::ExpressionError::IndexOutOfBounds(_, _),\r\n                ..\r\n            },\r\n            ..\r\n        })\r\n    }\r\n}\r\n\r\n#[test]\r\nfn valid_access() {\r\n    check_validation! {\r\n        \"\r\n        fn vector_by_value(v: vec4<i32>, i: i32) -> i32 {\r\n            return v[i];\r\n        }\r\n        \",\r\n        \"\r\n        fn matrix_dynamic(m: mat4x4<f32>, i: i32, j: i32) -> f32 {\r\n            var temp: mat4x4<f32> = m;\r\n            // Dynamically indexing the column vector applies\r\n            // `Access` to a `ValuePointer`.\r\n            return temp[i][j];\r\n        }\r\n        \",\r\n        \"\r\n        fn main() {\r\n            var v: vec4<f32> = vec4<f32>(1.0, 1.0, 1.0, 1.0);\r\n            let pv = &v;\r\n            let a = (*pv)[3];\r\n        }\r\n        \":\r\n        Ok(_)\r\n    }\r\n}\r\n\r\n#[test]\r\nfn invalid_local_vars() {\r\n    check_validation! {\r\n        \"\r\n        struct Unsized { data: array<f32> }\r\n        fn local_ptr_dynamic_array(okay: ptr<storage, Unsized>) {\r\n            var not_okay: ptr<storage, array<f32>> = &(*okay).data;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::Function {\r\n            error: naga::valid::FunctionError::LocalVariable {\r\n                name: local_var_name,\r\n                error: naga::valid::LocalVariableError::InvalidType(_),\r\n                ..\r\n            },\r\n            ..\r\n        })\r\n        if local_var_name == \"not_okay\"\r\n    }\r\n}\r\n\r\n#[test]\r\nfn dead_code() {\r\n    check_validation! {\r\n        \"\r\n        fn dead_code_after_if(condition: bool) -> i32 {\r\n            if (condition) {\r\n                return 1;\r\n            } else {\r\n                return 2;\r\n            }\r\n            return 3;\r\n        }\r\n        \":\r\n        Ok(_)\r\n    }\r\n    check_validation! {\r\n        \"\r\n        fn dead_code_after_block() -> i32 {\r\n            {\r\n                return 1;\r\n            }\r\n            return 2;\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::Function {\r\n            error: naga::valid::FunctionError::InstructionsAfterReturn,\r\n            ..\r\n        })\r\n    }\r\n}\r\n\r\n#[test]\r\nfn invalid_runtime_sized_arrays() {\r\n    // You can't have structs whose last member is an unsized struct. An unsized\r\n    // array may only appear as the last member of a struct used directly as a\r\n    // variable's store type.\r\n    check_validation! {\r\n        \"\r\n        struct Unsized {\r\n            arr: array<f32>\r\n        }\r\n\r\n        struct Outer {\r\n            legit: i32,\r\n            _unsized: Unsized\r\n        }\r\n\r\n        @group(0) @binding(0) var<storage> outer: Outer;\r\n\r\n        fn fetch(i: i32) -> f32 {\r\n           return outer._unsized.arr[i];\r\n        }\r\n        \":\r\n        Err(naga::valid::ValidationError::Type {\r\n            name: struct_name,\r\n            error: naga::valid::TypeError::InvalidDynamicArray(member_name, _),\r\n            ..\r\n        })\r\n        if struct_name == \"Outer\" && member_name == \"_unsized\"\r\n    }\r\n}\r\n\r\n#[test]\r\nfn select() {\r\n    check_validation! {\r\n        \"\r\n        fn select_pointers(which: bool) -> i32 {\r\n            var x: i32 = 1;\r\n            var y: i32 = 2;\r\n            let p = select(&x, &y, which);\r\n            return *p;\r\n        }\r\n        \",\r\n        \"\r\n        fn select_arrays(which: bool) -> i32 {\r\n            var x: array<i32, 4>;\r\n            var y: array<i32, 4>;\r\n            let s = select(x, y, which);\r\n            return s[0];\r\n        }\r\n        \",\r\n        \"\r\n        struct S { member: i32 }\r\n        fn select_structs(which: bool) -> S {\r\n            var x: S = S(1);\r\n            var y: S = S(2);\r\n            let s = select(x, y, which);\r\n            return s;\r\n        }\r\n        \":\r\n        Err(\r\n            naga::valid::ValidationError::Function {\r\n                name,\r\n                error: naga::valid::FunctionError::Expression {\r\n                    error: naga::valid::ExpressionError::InvalidSelectTypes,\r\n                    ..\r\n                },\r\n                ..\r\n            },\r\n        )\r\n        if name.starts_with(\"select_\")\r\n    }\r\n}\r\n\r\n#[test]\r\nfn last_case_falltrough() {\r\n    check_validation! {\r\n        \"\r\n        fn test_falltrough() {\r\n          switch(0) {\r\n            default: {}\r\n            case 0: {\r\n              fallthrough;\r\n            }\r\n          }\r\n        }\r\n        \":\r\n        Err(\r\n            naga::valid::ValidationError::Function {\r\n                error: naga::valid::FunctionError::LastCaseFallTrough,\r\n                ..\r\n            },\r\n        )\r\n    }\r\n}\r\n\r\n#[test]\r\nfn missing_default_case() {\r\n    check_validation! {\r\n        \"\r\n        fn test_missing_default_case() {\r\n          switch(0) {\r\n            case 0: {}\r\n          }\r\n        }\r\n        \":\r\n        Err(\r\n            naga::valid::ValidationError::Function {\r\n                error: naga::valid::FunctionError::MissingDefaultCase,\r\n                ..\r\n            },\r\n        )\r\n    }\r\n}\r\n\r\n#[test]\r\nfn wrong_access_mode() {\r\n    // The assignments to `global.i` should be forbidden, because they are in\r\n    // variables whose access mode is `read`, not `read_write`.\r\n    check_validation! {\r\n        \"\r\n            struct Globals {\r\n                i: i32\r\n            }\r\n\r\n            @group(0) @binding(0)\r\n            var<storage> globals: Globals;\r\n\r\n            fn store(v: i32) {\r\n                globals.i = v;\r\n            }\r\n        \",\r\n        \"\r\n            struct Globals {\r\n                i: i32\r\n            }\r\n\r\n            @group(0) @binding(0)\r\n            var<uniform> globals: Globals;\r\n\r\n            fn store(v: i32) {\r\n                globals.i = v;\r\n            }\r\n        \":\r\n        Err(\r\n            naga::valid::ValidationError::Function {\r\n                name,\r\n                error: naga::valid::FunctionError::InvalidStorePointer(_),\r\n                ..\r\n            },\r\n        )\r\n            if name == \"store\"\r\n    }\r\n}\r\n\r\n#[test]\r\nfn io_shareable_types() {\r\n    for numeric in \"i32 u32 f32\".split_whitespace() {\r\n        let types = format!(\r\n            \"{} vec2<{}> vec3<{}> vec4<{}>\",\r\n            numeric, numeric, numeric, numeric\r\n        );\r\n        for ty in types.split_whitespace() {\r\n            check_one_validation! {\r\n                &format!(\"@vertex\r\n                          fn f(@location(0) arg: {}) -> @builtin(position) vec4<f32>\r\n                          {{ return vec4<f32>(0.0); }}\",\r\n                         ty),\r\n                Ok(_module)\r\n            }\r\n        }\r\n    }\r\n\r\n    for ty in \"bool\r\n               vec2<bool> vec3<bool> vec4<bool>\r\n               array<f32,4>\r\n               mat2x2<f32>\r\n               ptr<function,f32>\"\r\n        .split_whitespace()\r\n    {\r\n        check_one_validation! {\r\n            &format!(\"@vertex\r\n                          fn f(@location(0) arg: {}) -> @builtin(position) vec4<f32>\r\n                          {{ return vec4<f32>(0.0); }}\",\r\n                     ty),\r\n            Err(\r\n                naga::valid::ValidationError::EntryPoint {\r\n                    stage: naga::ShaderStage::Vertex,\r\n                    name,\r\n                    error: naga::valid::EntryPointError::Argument(\r\n                        0,\r\n                        naga::valid::VaryingError::NotIOShareableType(\r\n                            _,\r\n                        ),\r\n                    ),\r\n                },\r\n            )\r\n            if name == \"f\"\r\n        }\r\n    }\r\n}\r\n\r\n#[test]\r\nfn host_shareable_types() {\r\n    // Host-shareable, constructible types.\r\n    let types = \"i32 u32 f32\r\n                 vec2<i32> vec3<u32> vec4<f32>\r\n                 mat4x4<f32>\r\n                 array<mat4x4<f32>,4>\r\n                 AStruct\";\r\n    for ty in types.split_whitespace() {\r\n        check_one_validation! {\r\n            &format!(\"struct AStruct {{ member: array<mat4x4<f32>, 8> }};\r\n                      @group(0) @binding(0) var<uniform> ubuf: {};\r\n                      @group(0) @binding(1) var<storage> sbuf: {};\",\r\n                     ty, ty),\r\n            Ok(_module)\r\n        }\r\n    }\r\n\r\n    // Host-shareable but not constructible types.\r\n    let types = \"atomic<i32> atomic<u32>\r\n                 array<atomic<u32>,4>\r\n                 array<u32>\r\n                 AStruct\";\r\n    for ty in types.split_whitespace() {\r\n        check_one_validation! {\r\n            &format!(\"struct AStruct {{ member: array<atomic<u32>, 8> }};\r\n                      @group(0) @binding(1) var<storage> sbuf: {};\",\r\n                     ty),\r\n            Ok(_module)\r\n        }\r\n    }\r\n\r\n    // Types that are neither host-shareable nor constructible.\r\n    for ty in \"bool ptr<storage,i32>\".split_whitespace() {\r\n        check_one_validation! {\r\n            &format!(\"@group(0) @binding(0) var<storage> sbuf: {};\", ty),\r\n            Err(\r\n                naga::valid::ValidationError::GlobalVariable {\r\n                    name,\r\n                    handle: _,\r\n                    error: naga::valid::GlobalVariableError::MissingTypeFlags { .. },\r\n                },\r\n            )\r\n            if name == \"sbuf\"\r\n        }\r\n\r\n        check_one_validation! {\r\n            &format!(\"@group(0) @binding(0) var<uniform> ubuf: {};\", ty),\r\n            Err(naga::valid::ValidationError::GlobalVariable {\r\n                    name,\r\n                    handle: _,\r\n                    error: naga::valid::GlobalVariableError::MissingTypeFlags { .. },\r\n                },\r\n            )\r\n            if name == \"ubuf\"\r\n        }\r\n    }\r\n}\r\n\r\n#[test]\r\nfn misplaced_break_if() {\r\n    check(\r\n        \"\r\n        fn test_misplaced_break_if() {\r\n            loop {\r\n                break if true;\r\n            }\r\n        }\r\n        \",\r\n        r###\"error: A break if is only allowed in a continuing block\r\n  ┌─ wgsl:4:17\r\n  │\r\n4 │                 break if true;\r\n  │                 ^^^^^^^^ not in a continuing block\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn break_if_bad_condition() {\r\n    check_validation! {\r\n        \"\r\n        fn test_break_if_bad_condition() {\r\n            loop {\r\n                continuing {\r\n                    break if 1;\r\n                }\r\n            }\r\n        }\r\n        \":\r\n        Err(\r\n            naga::valid::ValidationError::Function {\r\n                error: naga::valid::FunctionError::InvalidIfType(_),\r\n                ..\r\n            },\r\n        )\r\n    }\r\n}\r\n\r\n#[test]\r\nfn swizzle_assignment() {\r\n    check(\r\n        \"\r\n        fn f() {\r\n            var v = vec2(0);\r\n            v.xy = vec2(1);\r\n        }\r\n    \",\r\n        r###\"error: invalid left-hand side of assignment\r\n  ┌─ wgsl:4:13\r\n  │\r\n4 │             v.xy = vec2(1);\r\n  │             ^^^^ cannot assign to this expression\r\n  │\r\n  = note: WGSL does not support assignments to swizzles\r\n  = note: consider assigning each component individually\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn binary_statement() {\r\n    check(\r\n        \"\r\n        fn f() {\r\n            3 + 5;\r\n        }\r\n    \",\r\n        r###\"error: expected assignment or increment/decrement, found '3 + 5'\r\n  ┌─ wgsl:3:13\r\n  │\r\n3 │             3 + 5;\r\n  │             ^^^^^ expected assignment or increment/decrement\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn assign_to_expr() {\r\n    check(\r\n        \"\r\n        fn f() {\r\n            3 + 5 = 10;\r\n        }\r\n        \",\r\n        r###\"error: invalid left-hand side of assignment\r\n  ┌─ wgsl:3:13\r\n  │\r\n3 │             3 + 5 = 10;\r\n  │             ^^^^^ cannot assign to this expression\r\n\r\n\"###,\r\n    );\r\n}\r\n\r\n#[test]\r\nfn assign_to_let() {\r\n    check(\r\n        \"\r\n        fn f() {\r\n            let a = 10;\r\n\t        a = 20;\r\n        }\r\n        \",\r\n        r###\"error: invalid left-hand side of assignment\r\n  ┌─ wgsl:4:10\r\n  │\r\n4 │             a = 20;\r\n  │             ^ cannot assign to this expression\r\n  │\r\n  = note: 'a' is an immutable binding\r\n  = note: consider declaring it with `var` instead of `let`\r\n\r\n\"###,\r\n    );\r\n}\r\n"
  },
  {
    "path": "resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.13</string>\n\t<key>CFBundleExecutable</key>\n\t<string>GraphPU_Launcher</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>GraphPU</string>\n\t<key>CFBundleGetInfoString</key>\n\t<string>0.5.0 2023-03-03, Wlab</string>\n\t<key>CFBundleIconFile</key>\n\t<string>app.icns</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>org.ioclab.graphpu</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>GraphPU</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>0.5.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>0.5.0 2023-03-03</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSHighResolutionCapable</key>\n\t<true/>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.graphics-design</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/.editorconfig",
    "content": "# EditorConfig for create-dmg project\n# EditorConfig is awesome: https://EditorConfig.org\n\nroot = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = true\ncharset = utf-8\n\n# We use tabs in our own code\n[{create-dmg,*.applescript,*.sh}]\nindent_style = tab\nindent_size = 2\n\n# But the Python code we pull in from pyhacker uses spaces\n[*.py]\nindent_style = space\nindent_size = 4\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/.gitignore",
    "content": ".svn\n.vscode\n\n*.dmg\n.DS_Store\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/.this-is-the-create-dmg-repo",
    "content": "This is just a dummy file so create-dmg can tell whether it's being run from\ninside the Git repo or from an installed location.\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2008-2014 Andrey Tarantsov\nCopyright (c) 2020 Andrew Janke\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/Makefile",
    "content": "# Makefile for Cowsay\n\nPACKAGE_TARNAME = create-dmg\n\nprefix = /usr/local\nexec_prefix = ${prefix}\nbindir = ${exec_prefix}/bin\ndatarootdir = ${prefix}/share\ndatadir = ${datarootdir}\ndocdir = ${datarootdir}/doc/${PACKAGE_TARNAME}\nsysconfdir = ${prefix}/etc\nmandir=${datarootdir}/man\nsrcdir = .\n\nSHELL = /bin/sh\nINSTALL = install\nINSTALL_PROGRAM = $(INSTALL)\nINSTALL_DATA = ${INSTALL} -m 644\n\n.PHONY: install uninstall\n\ninstall: create-dmg\n\t$(INSTALL) -d $(DESTDIR)$(prefix)\n\t$(INSTALL) -d $(DESTDIR)$(bindir)\n\t$(INSTALL_PROGRAM) create-dmg $(DESTDIR)$(bindir)/create-dmg\n\t$(INSTALL) -d $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME)\n\tcp -R support $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME)\n\tcp -R examples $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME)\n\tcp -R tests $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME)\n\nuninstall:\n\trm -f $(DESTDIR)$(bindir)/create-dmg\n\trm -rf $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME)\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/README.md",
    "content": "create-dmg\n==========\n\nA shell script to build fancy DMGs.\n\nStatus and contribution policy\n------------------------------\n\nCreate-dmg is mostly maintained by [@aonez](https://github.com/aonez) and the contributors who send pull requests.\nThe project home page is <https://github.com/create-dmg/create-dmg>.\n\nWe will merge any pull request that adds something useful and does not break existing things.\n\nIf you're an active user and want to be a maintainer, or just want to chat, please ping us on Gitter at [gitter.im/create-dmg/Lobby](https://gitter.im/create-dmg/Lobby), or [email Andrew directly](floss@apjanke.net).\n\nCreate-dmg was originally created by [Andrey Tarantsov](https://github.com/andreyvit).\nIn May 2020 [Andrew Janke](https://github.com/apjanke) helped vastly with the project.\n\nInstallation\n------------\n\n- You can install this script using [Homebrew](https://brew.sh):\n\n  ```sh\n  brew install create-dmg\n  ```\n\n- You can download the [latest release](https://github.com/create-dmg/create-dmg/releases/latest) and install it from there:\n\n  ```sh\n  make install\n  ```\n\n- You can also clone the entire repository and run it locally from there:\n\n  ```sh\n  git clone https://github.com/create-dmg/create-dmg.git\n  ```\n\nUsage\n-----\n\n```sh\ncreate-dmg [options ...] <output_name.dmg> <source_folder>\n```\n\nAll contents of source\\_folder will be copied into the disk image.\n\n**Options:**\n\n- **--volname \\<name\\>:** set volume name (displayed in the Finder sidebar and window title)\n- **--volicon \\<icon.icns\\>:** set volume icon\n- **--background \\<pic.png\\>:** set folder background image (provide png, gif, jpg)\n- **--window-pos \\<x\\> \\<y\\>:** set position the folder window\n- **--window-size \\<width\\> \\<height\\>:** set size of the folder window\n- **--text-size \\<text_size\\>:** set window text size (10-16)\n- **--icon-size \\<icon_size\\>:** set window icons size (up to 128)\n- **--icon \\<file_name\\> \\<x\\> \\<y\\>:** set position of the file's icon\n- **--hide-extension \\<file_name\\>:** hide the extension of file\n- **--custom-icon \\<file_name|custom_icon|sample_file\\> \\<x\\> \\<y\\>:** set position and -tom icon\n- **--app-drop-link \\<x\\> \\<y\\>:** make a drop link to Applications, at location x, y\n- **--ql-drop-link \\<x\\> \\<y\\>:** make a drop link to /Library/QuickLook, at location x, y\n- **--eula \\<eula_file\\>:** attach a license file to the dmg\n- **--rez \\<rez_path\\>:** specify custom path to Rez tool used to include license file\n- **--no-internet-enable:** disable automatic mount&copy\n- **--format:** specify the final image format (UDZO|UDBZ|ULFO|ULMO) (default is UDZO) \n- **--add-file \\<target_name\\> \\<file|folder\\> \\<x\\> \\<y\\>:** add additional file or folder (can be used multiple times)\n- **--disk-image-size \\<x\\>:** set the disk image size manually to x MB\n- **--hdiutil-verbose:** execute hdiutil in verbose mode\n- **--hdiutil-quiet:** execute hdiutil in quiet mode\n- **--bless:** bless the mount folder (deprecated, needs macOS 12.2.1 or older, [#127](https://github.com/create-dmg/create-dmg/pull/127))\n- **--codesign \\<signature\\>:** codesign the disk image with the specified signature\n- **--notarize \\<credentials>:** notarize the disk image (waits and staples) with the keychain stored credentials\n    For more information check [Apple's documentation](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow)\n- **--skip-jenkins:** skip Finder-prettifying AppleScript, useful in Sandbox and non-GUI environments, [#72](https://github.com/create-dmg/create-dmg/pull/72)\n- **--sandbox-safe:** hdiutil with sandbox compatibility, do not bless and do not execute the cosmetic AppleScript\n- **--version:** show tool version number\n- **-h, --help:** display the help\n\nExample\n-------\n\n```sh\n#!/bin/sh\ntest -f Application-Installer.dmg && rm Application-Installer.dmg\ncreate-dmg \\\n  --volname \"Application Installer\" \\\n  --volicon \"application_icon.icns\" \\\n  --background \"installer_background.png\" \\\n  --window-pos 200 120 \\\n  --window-size 800 400 \\\n  --icon-size 100 \\\n  --icon \"Application.app\" 200 190 \\\n  --hide-extension \"Application.app\" \\\n  --app-drop-link 600 185 \\\n  \"Application-Installer.dmg\" \\\n  \"source_folder/\"\n```\n\nSee the `examples` folder in the source tree for more examples.\n\nRequirements\n------------\n\nNothing except a standard installation of macOS/OS X is required.\n\nWe think this works in OS X 10.6 Snow Leopard and later.\n\nWe'd like to keep it working in as many versions as possible, but unfortunately, we just don't have test boxes running old versions of OS X adequate to make this happen. Development and testing mostly happens in the last 3-5 years' worth of macOS releases; as of 2020, this means macOS 10.12 and later.\n\nBut if you find a bug in an older version, go ahead and report it! We'll try to work with you to get it fixed.\n\nIf you're running OS X 10.5 or later, you're SOL. That's just too hard to deal with in 2020. ;)\n\nAlternatives\n------------\n\n- [node-appdmg](https://github.com/LinusU/node-appdmg)\n- [dmgbuild](https://pypi.python.org/pypi/dmgbuild)\n- see the [StackOverflow question](http://stackoverflow.com/questions/96882/how-do-i-create-a-nice-looking-dmg-for-mac-os-x-using-command-line-tools)\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/builder/create-dmg.builder",
    "content": "SET\tapp_name\tcreate-dmg\n\nVERSION\tcreate-dmg.cur\tcreate-dmg\theads/master\n\nNEWDIR\tbuild.dir\ttemp\t%-build\t-\n\nNEWFILE\tcreate-dmg.zip\tfeatured\t%.zip\t%\n\n\nCOPYTO\t[build.dir]\n\tINTO\tcreate-dmg\t[create-dmg.cur]/create-dmg\n\tINTO\tsample\t[create-dmg.cur]/sample\n\tINTO\tsupport\t[create-dmg.cur]/support\n\t\nSUBSTVARS\t[build.dir<alter>]/create-dmg\t[[]]\n\n\nZIP\t[create-dmg.zip]\n\tINTO\t[build-files-prefix]\t[build.dir]\n\n\nPUT\tmegabox-builds\tcreate-dmg.zip\nPUT\tmegabox-builds\tbuild.log\n\nPUT\ts3-builds\tcreate-dmg.zip\nPUT\ts3-builds\tbuild.log\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/create-dmg",
    "content": "#!/usr/bin/env bash\n\n# Create a read-only disk image of the contents of a folder\n\n# Bail out on any unhandled errors\nset -e;\n\nCDMG_VERSION='1.1.0'\n\n# The full path to the \"support/\" directory this script is using\n# (This will be set up by code later in the script.)\nCDMG_SUPPORT_DIR=\"\"\n\nWINX=10\nWINY=60\nWINW=500\nWINH=350\nICON_SIZE=128\nTEXT_SIZE=16\nFORMAT=\"UDZO\"\nADD_FILE_SOURCES=()\nADD_FILE_TARGETS=()\nIMAGEKEY=\"\"\nHDIUTIL_VERBOSITY=\"\"\nSANDBOX_SAFE=0\nBLESS=0\nSKIP_JENKINS=0\nMAXIMUM_UNMOUNTING_ATTEMPTS=3\nSIGNATURE=\"\"\nNOTARIZE=\"\"\n\nfunction pure_version() {\n\techo \"$CDMG_VERSION\"\n}\n\nfunction version() {\n\techo \"create-dmg $(pure_version)\"\n}\n\nfunction usage() {\n\tversion\n\tcat <<EOHELP\n\nCreates a fancy DMG file.\n\nUsage:  $(basename $0) [options] <output_name.dmg> <source_folder>\n\nAll contents of <source_folder> will be copied into the disk image.\n\nOptions:\n  --volname <name>\n      set volume name (displayed in the Finder sidebar and window title)\n  --volicon <icon.icns>\n      set volume icon\n  --background <pic.png>\n      set folder background image (provide png, gif, or jpg)\n  --window-pos <x> <y>\n      set position the folder window\n  --window-size <width> <height>\n      set size of the folder window\n  --text-size <text_size>\n      set window text size (10-16)\n  --icon-size <icon_size>\n      set window icons size (up to 128)\n  --icon file_name <x> <y>\n      set position of the file's icon\n  --hide-extension <file_name>\n      hide the extension of file\n  --app-drop-link <x> <y>\n      make a drop link to Applications, at location x,y\n  --ql-drop-link <x> <y>\n      make a drop link to user QuickLook install dir, at location x,y\n  --eula <eula_file>\n      attach a license file to the dmg (plain text or RTF)\n  --no-internet-enable\n      disable automatic mount & copy\n  --format <format>\n      specify the final disk image format (UDZO|UDBZ|ULFO|ULMO) (default is UDZO)\n  --add-file <target_name> <file>|<folder> <x> <y>\n      add additional file or folder (can be used multiple times)\n  --disk-image-size <x>\n      set the disk image size manually to x MB\n  --hdiutil-verbose\n      execute hdiutil in verbose mode\n  --hdiutil-quiet\n      execute hdiutil in quiet mode\n  --bless\n      bless the mount folder (deprecated, needs macOS 12.2.1 or older)\n  --codesign <signature>\n      codesign the disk image with the specified signature\n  --notarize <credentials>\n      notarize the disk image (waits and staples) with the keychain stored credentials\n  --sandbox-safe\n      execute hdiutil with sandbox compatibility and do not bless\n  --version\n\t    show create-dmg version number\n  -h, --help\n\t    display this help screen\n\nEOHELP\n\texit 0\n}\n\n# Argument parsing\n\nwhile [[ \"${1:0:1}\" = \"-\" ]]; do\n\tcase $1 in\n\t\t--volname)\n\t\t\tVOLUME_NAME=\"$2\"\n\t\t\tshift; shift;;\n\t\t--volicon)\n\t\t\tVOLUME_ICON_FILE=\"$2\"\n\t\t\tshift; shift;;\n\t\t--background)\n\t\t\tBACKGROUND_FILE=\"$2\"\n\t\t\tBACKGROUND_FILE_NAME=\"$(basename \"$BACKGROUND_FILE\")\"\n\t\t\tBACKGROUND_CLAUSE=\"set background picture of opts to file \\\".background:$BACKGROUND_FILE_NAME\\\"\"\n\t\t\tREPOSITION_HIDDEN_FILES_CLAUSE=\"set position of every item to {theBottomRightX + 100, 100}\"\n\t\t\tshift; shift;;\n\t\t--icon-size)\n\t\t\tICON_SIZE=\"$2\"\n\t\t\tshift; shift;;\n\t\t--text-size)\n\t\t\tTEXT_SIZE=\"$2\"\n\t\t\tshift; shift;;\n\t\t--window-pos)\n\t\t\tWINX=$2; WINY=$3\n\t\t\tshift; shift; shift;;\n\t\t--window-size)\n\t\t\tWINW=$2; WINH=$3\n\t\t\tshift; shift; shift;;\n\t\t--icon)\n\t\t\tPOSITION_CLAUSE=\"${POSITION_CLAUSE}set position of item \\\"$2\\\" to {$3, $4}\n\t\t\t\"\n\t\t\tshift; shift; shift; shift;;\n\t\t--hide-extension)\n\t\t\tHIDING_CLAUSE=\"${HIDING_CLAUSE}set the extension hidden of item \\\"$2\\\" to true\n\t\t\t\"\n\t\t\tshift; shift;;\n\t\t-h | --help)\n\t\t\tusage;;\n\t\t--version)\n\t\t\tversion; exit 0;;\n\t\t--pure-version)\n\t\t\tpure_version; exit 0;;\n\t\t--ql-drop-link)\n\t\t\tQL_LINK=$2\n\t\t\tQL_CLAUSE=\"set position of item \\\"QuickLook\\\" to {$2, $3}\n\t\t\t\"\n\t\t\tshift; shift; shift;;\n\t\t--app-drop-link)\n\t\t\tAPPLICATION_LINK=$2\n\t\t\tAPPLICATION_CLAUSE=\"set position of item \\\"Applications\\\" to {$2, $3}\n\t\t\t\"\n\t\t\tshift; shift; shift;;\n\t\t--eula)\n\t\t\tEULA_RSRC=$2\n\t\t\tshift; shift;;\n\t\t--no-internet-enable)\n\t\t\tNOINTERNET=1\n\t\t\tshift;;\n\t\t--format)\n\t\t\tFORMAT=\"$2\"\n\t\t\tshift; shift;;\n\t\t--add-file | --add-folder)\n\t\t\tADD_FILE_TARGETS+=(\"$2\")\n\t\t\tADD_FILE_SOURCES+=(\"$3\")\n\t\t\tPOSITION_CLAUSE=\"${POSITION_CLAUSE}\n\t\t\tset position of item \\\"$2\\\" to {$4, $5}\n\t\t\t\"\n\t\t\tshift; shift; shift; shift; shift;;\n\t\t--disk-image-size)\n\t\t\tDISK_IMAGE_SIZE=\"$2\"\n\t\t\tshift; shift;;\n\t\t--hdiutil-verbose)\n\t\t\tHDIUTIL_VERBOSITY='-verbose'\n\t\t\tshift;;\n\t\t--hdiutil-quiet)\n\t\t\tHDIUTIL_VERBOSITY='-quiet'\n\t\t\tshift;;\n\t\t--codesign)\n\t\t\tSIGNATURE=\"$2\"\n\t\t\tshift; shift;;\n\t\t--notarize)\n\t\t\tNOTARIZE=\"$2\"\n\t\t\tshift; shift;;\n\t\t--sandbox-safe)\n\t\t\tSANDBOX_SAFE=1\n\t\t\tshift;;\n\t\t--bless)\n\t\t\tBLESS=1\n\t\t\tshift;;\n\t\t--rez)\n\t\t\techo \"REZ is no more directly used. You can remove the --rez argument.\"\n\t\t\tshift; shift;;\n\t\t--skip-jenkins)\n\t\t\tSKIP_JENKINS=1\n\t\t\tshift;;\n\t\t-*)\n\t\t\techo \"Unknown option: $1. Run 'create-dmg --help' for help.\"\n\t\t\texit 1;;\n\tesac\n\tcase $FORMAT in\n\t\tUDZO)\n\t\t\tIMAGEKEY=\"-imagekey zlib-level=9\";;\n\t\tUDBZ)\n\t\t\tIMAGEKEY=\"-imagekey bzip2-level=9\";;\n\t\tULFO)\n\t\t\t;;\n\t\tULMO)\n\t\t\t;;\n\t\t*)\n\t\t\techo >&2 \"Unknown disk image format: $FORMAT\"\n\t\t\texit 1;;\n\tesac\ndone\n\nif [[ -z \"$2\" ]]; then\n\techo \"Not enough arguments. Run 'create-dmg --help' for help.\"\n\texit 1\nfi\n\nDMG_PATH=\"$1\"\nSRC_FOLDER=\"$(cd \"$2\" > /dev/null; pwd)\"\n\n# Argument validation checks\n\nif [[ \"${DMG_PATH: -4}\" != \".dmg\" ]]; then\n\techo \"Output file name must end with a .dmg extension. Run 'create-dmg --help' for help.\"\n\texit 1\nfi\n\n# Main script logic\n\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\nDMG_DIRNAME=\"$(dirname \"$DMG_PATH\")\"\nDMG_DIR=\"$(cd \"$DMG_DIRNAME\" > /dev/null; pwd)\"\nDMG_NAME=\"$(basename \"$DMG_PATH\")\"\nDMG_TEMP_NAME=\"$DMG_DIR/rw.${DMG_NAME}\"\n\n# Detect where we're running from\n\nsentinel_file=\"$SCRIPT_DIR/.this-is-the-create-dmg-repo\"\nif [[ -f \"$sentinel_file\" ]]; then\n\t# We're running from inside a repo\n\tCDMG_SUPPORT_DIR=\"$SCRIPT_DIR/support\"\nelse\n\t# We're running inside an installed location\n\tbin_dir=\"$SCRIPT_DIR\"\n\tprefix_dir=$(dirname \"$bin_dir\")\n\tCDMG_SUPPORT_DIR=\"$prefix_dir/share/create-dmg/support\"\nfi\n\nif [[ -z \"$VOLUME_NAME\" ]]; then\n\tVOLUME_NAME=\"$(basename \"$DMG_PATH\" .dmg)\"\nfi\n\nif [[ ! -d \"$CDMG_SUPPORT_DIR\" ]]; then\n\techo >&2 \"Cannot find support/ directory: expected at: $CDMG_SUPPORT_DIR\"\n\texit 1\nfi\n\nif [[ -f \"$SRC_FOLDER/.DS_Store\" ]]; then\n\techo \"Deleting .DS_Store found in source folder\"\n\trm \"$SRC_FOLDER/.DS_Store\"\nfi\n\n# Create the image\necho \"Creating disk image...\"\nif [[ -f \"${DMG_TEMP_NAME}\" ]]; then\n\trm -f \"${DMG_TEMP_NAME}\"\nfi\n\n# Use Megabytes since hdiutil fails with very large byte numbers\nfunction blocks_to_megabytes() {\n\t# Add 1 extra MB, since there's no decimal retention here\n\tMB_SIZE=$((($1 * 512 / 1000 / 1000) + 1))\n\techo $MB_SIZE\n}\n\nfunction get_size() {\n\t# Get block size in disk\n\tbytes_size=$(du -s \"$1\" | sed -e 's/\t.*//g')\n\techo $(blocks_to_megabytes $bytes_size)\n}\n\n# Create the DMG with the specified size or the hdiutil estimation\nCUSTOM_SIZE=''\nif [[ -n \"$DISK_IMAGE_SIZE\" ]]; then\n\tCUSTOM_SIZE=\"-size ${DISK_IMAGE_SIZE}m\"\nfi\n\nif [[ $SANDBOX_SAFE -eq 0 ]]; then\n\thdiutil create ${HDIUTIL_VERBOSITY} -srcfolder \"$SRC_FOLDER\" -volname \"${VOLUME_NAME}\" \\\n\t\t-fs HFS+ -fsargs \"-c c=64,a=16,e=16\" -format UDRW ${CUSTOM_SIZE} \"${DMG_TEMP_NAME}\"\nelse\t\n\thdiutil makehybrid ${HDIUTIL_VERBOSITY} -default-volume-name \"${VOLUME_NAME}\" -hfs -o \"${DMG_TEMP_NAME}\" \"$SRC_FOLDER\"\n\thdiutil convert -format UDRW -ov -o \"${DMG_TEMP_NAME}\" \"${DMG_TEMP_NAME}\"\n\tDISK_IMAGE_SIZE_CUSTOM=$DISK_IMAGE_SIZE\nfi\n\n# Get the created DMG actual size\nDISK_IMAGE_SIZE=$(get_size \"${DMG_TEMP_NAME}\")\n\n# Use the custom size if bigger\nif [[ $SANDBOX_SAFE -eq 1 ]] && [[ ! -z \"$DISK_IMAGE_SIZE_CUSTOM\" ]] && [[ $DISK_IMAGE_SIZE_CUSTOM -gt $DISK_IMAGE_SIZE ]]; then\n\tDISK_IMAGE_SIZE=$DISK_IMAGE_SIZE_CUSTOM\nfi\n\n# Estimate the additional sources size\nif [[ -n \"$ADD_FILE_SOURCES\" ]]; then\n\tfor i in \"${!ADD_FILE_SOURCES[@]}\"; do\n\t\tSOURCE_SIZE=$(get_size \"${ADD_FILE_SOURCES[$i]}\")\n\t\tDISK_IMAGE_SIZE=$(expr $DISK_IMAGE_SIZE + $SOURCE_SIZE)\n\tdone\nfi\n\n# Add extra space for additional resources\nDISK_IMAGE_SIZE=$(expr $DISK_IMAGE_SIZE + 20)\n\n# Make sure target image size is within limits\nMIN_DISK_IMAGE_SIZE=$(hdiutil resize -limits \"${DMG_TEMP_NAME}\" | awk 'NR=1{print int($1/2048+1)}')\nif [ $MIN_DISK_IMAGE_SIZE -gt $DISK_IMAGE_SIZE ]; then\n       DISK_IMAGE_SIZE=$MIN_DISK_IMAGE_SIZE\nfi\n\n# Resize the image for the extra stuff\nhdiutil resize ${HDIUTIL_VERBOSITY} -size ${DISK_IMAGE_SIZE}m \"${DMG_TEMP_NAME}\"\n\n# Mount the new DMG\n\nMOUNT_DIR=\"/Volumes/${VOLUME_NAME}\"\n\n# Unmount leftover dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it)\nif [[ -d \"${MOUNT_DIR}\" ]]; then\n\techo \"Unmounting old disk image from $MOUNT_DIR...\"\n\tDEV_NAME=$(hdiutil info | grep -E --color=never '^/dev/' | sed 1q | awk '{print $1}')\n\thdiutil detach \"${DEV_NAME}\"\nfi\n\necho \"Mounting disk image...\"\n\necho \"Mount directory: $MOUNT_DIR\"\nDEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen \"${DMG_TEMP_NAME}\" | grep -E --color=never '^/dev/' | sed 1q | awk '{print $1}')\necho \"Device name:     $DEV_NAME\"\n\nif [[ -n \"$BACKGROUND_FILE\" ]]; then\n\techo \"Copying background file '$BACKGROUND_FILE'...\"\n\t[[ -d \"$MOUNT_DIR/.background\" ]] || mkdir \"$MOUNT_DIR/.background\"\n\tcp \"$BACKGROUND_FILE\" \"$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME\"\nfi\n\nif [[ -n \"$APPLICATION_LINK\" ]]; then\n\techo \"Making link to Applications dir...\"\n\techo $MOUNT_DIR\n\tln -s /Applications \"$MOUNT_DIR/Applications\"\nfi\n\nif [[ -n \"$QL_LINK\" ]]; then\n\techo \"Making link to QuickLook install dir...\"\n\techo $MOUNT_DIR\n\tln -s \"/Library/QuickLook\" \"$MOUNT_DIR/QuickLook\"\nfi\n\nif [[ -n \"$VOLUME_ICON_FILE\" ]]; then\n\techo \"Copying volume icon file '$VOLUME_ICON_FILE'...\"\n\tcp \"$VOLUME_ICON_FILE\" \"$MOUNT_DIR/.VolumeIcon.icns\"\n\tSetFile -c icnC \"$MOUNT_DIR/.VolumeIcon.icns\"\nfi\n\nif [[ -n \"$ADD_FILE_SOURCES\" ]]; then\n\techo \"Copying custom files...\"\n\tfor i in \"${!ADD_FILE_SOURCES[@]}\"; do\n\t\techo \"${ADD_FILE_SOURCES[$i]}\"\n\t\tcp -a \"${ADD_FILE_SOURCES[$i]}\" \"$MOUNT_DIR/${ADD_FILE_TARGETS[$i]}\"\n\tdone\nfi\n\n# Run AppleScript to do all the Finder cosmetic stuff\nAPPLESCRIPT_FILE=$(mktemp -t createdmg.tmp.XXXXXXXXXX)\nif [[ $SANDBOX_SAFE -eq 1 ]]; then\n\techo \"Skipping Finder-prettifying AppleScript because we are in Sandbox...\"\nelse\n\tif [[ $SKIP_JENKINS -eq 0 ]]; then\n\t\tcat \"$CDMG_SUPPORT_DIR/template.applescript\" \\\n\t\t\t| sed -e \"s/WINX/$WINX/g\" -e \"s/WINY/$WINY/g\" -e \"s/WINW/$WINW/g\" \\\n\t\t\t\t\t-e \"s/WINH/$WINH/g\" -e \"s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g\" \\\n\t\t\t\t\t-e \"s/REPOSITION_HIDDEN_FILES_CLAUSE/$REPOSITION_HIDDEN_FILES_CLAUSE/g\" \\\n\t\t\t\t\t-e \"s/ICON_SIZE/$ICON_SIZE/g\" -e \"s/TEXT_SIZE/$TEXT_SIZE/g\" \\\n\t\t\t| perl -pe \"s/POSITION_CLAUSE/$POSITION_CLAUSE/g\" \\\n\t\t\t| perl -pe \"s/QL_CLAUSE/$QL_CLAUSE/g\" \\\n\t\t\t| perl -pe \"s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g\" \\\n\t\t\t| perl -pe \"s/HIDING_CLAUSE/$HIDING_CLAUSE/\" \\\n\t\t\t> \"$APPLESCRIPT_FILE\"\n\t\tsleep 2 # pause to workaround occasional \"Can’t get disk\" (-1728) issues  \n\t\techo \"Running AppleScript to make Finder stuff pretty: /usr/bin/osascript \\\"${APPLESCRIPT_FILE}\\\" \\\"${VOLUME_NAME}\\\"\"\n\t\tif /usr/bin/osascript \"${APPLESCRIPT_FILE}\" \"${VOLUME_NAME}\"; then\n\t\t\t# Okay, we're cool\n\t\t\ttrue\n\t\telse\n\t\t\techo >&2 \"Failed running AppleScript\"\n\t\t\thdiutil detach \"${DEV_NAME}\"\n\t\t\texit 64\n\t\tfi\n\t\techo \"Done running the AppleScript...\"\n\t\tsleep 4\n\t\trm \"$APPLESCRIPT_FILE\"\n\tfi\nfi\n\n# Make sure it's not world writeable\necho \"Fixing permissions...\"\nchmod -Rf go-w \"${MOUNT_DIR}\" &> /dev/null || true\necho \"Done fixing permissions\"\n\n# Make the top window open itself on mount:\nif [[ $BLESS -eq 1 && $SANDBOX_SAFE -eq 0 ]]; then\n\techo \"Blessing started\"\n\tbless --folder \"${MOUNT_DIR}\" --openfolder \"${MOUNT_DIR}\"\n\techo \"Blessing finished\"\nelse\n\techo \"Skipping blessing on sandbox\"\nfi\n\nif [[ -n \"$VOLUME_ICON_FILE\" ]]; then\n\t# Tell the volume that it has a special file attribute\n\tSetFile -a C \"$MOUNT_DIR\"\nfi\n\n# Delete unnecessary file system events log if possible\necho \"Deleting .fseventsd\"\nrm -rf \"${MOUNT_DIR}/.fseventsd\" || true\n\n# Unmount\nunmounting_attempts=0\nuntil\n  echo \"Unmounting disk image...\"\n  (( unmounting_attempts++ ))\n  hdiutil detach \"${DEV_NAME}\"\n\texit_code=$?\n\t(( exit_code ==  0 )) && break            # nothing goes wrong\n\t(( exit_code != 16 )) && exit $exit_code  # exit with the original exit code\n\t# The above statement returns 1 if test failed (exit_code == 16).\n\t#   It can make the code in the {do... done} block to be executed\ndo\n  (( unmounting_attempts == MAXIMUM_UNMOUNTING_ATTEMPTS )) && exit 16  # patience exhausted, exit with code EBUSY\n\techo \"Wait a moment...\"\n  sleep $(( 1 * (2 ** unmounting_attempts) ))\ndone\nunset unmounting_attempts\n\n# Compress image\necho \"Compressing disk image...\"\nhdiutil convert ${HDIUTIL_VERBOSITY} \"${DMG_TEMP_NAME}\" -format ${FORMAT} ${IMAGEKEY} -o \"${DMG_DIR}/${DMG_NAME}\"\nrm -f \"${DMG_TEMP_NAME}\"\n\n# Adding EULA resources\nif [[ -n \"${EULA_RSRC}\" && \"${EULA_RSRC}\" != \"-null-\" ]]; then\n\techo \"Adding EULA resources...\"\n\t#\n\t# Use udifrez instead flatten/rez/unflatten\n\t# https://github.com/create-dmg/create-dmg/issues/109\n\t#\n\t# Based on a thread from dawn2dusk & peterguy\n\t# https://developer.apple.com/forums/thread/668084\n\t#\n\tEULA_RESOURCES_FILE=$(mktemp -t createdmg.tmp.XXXXXXXXXX)\n\tEULA_FORMAT=$(file -b ${EULA_RSRC})\n\tif [[ ${EULA_FORMAT} == 'Rich Text Format data'* ]] ; then\n\t\tEULA_FORMAT='RTF '\n\telse\n\t\tEULA_FORMAT='TEXT'\n\tfi\n\t# Encode the EULA to base64\n\t# Replace 'openssl base64' with 'base64' if Mac OS X 10.6 support is no more needed\n\t# EULA_DATA=\"$(base64 -b 52 \"${EULA_RSRC}\" | sed s$'/^\\(.*\\)$/\\t\\t\\t\\\\1/')\"\n\tEULA_DATA=\"$(openssl base64 -in \"${EULA_RSRC}\" | tr -d '\\n' | awk '{gsub(/.{52}/,\"&\\n\")}1' | sed s$'/^\\(.*\\)$/\\t\\t\\t\\\\1/')\"\n\t# Fill the template with the custom EULA contents\n\teval \"cat > \\\"${EULA_RESOURCES_FILE}\\\" <<EOF                                                                                                                  \n\t$(<${CDMG_SUPPORT_DIR}/eula-resources-template.xml)\n\tEOF\n\t\"\n\t# Apply the resources\n\thdiutil udifrez -xml \"${EULA_RESOURCES_FILE}\" '' -quiet \"${DMG_DIR}/${DMG_NAME}\" || {\n\t\techo \"Failed to add the EULA license\"\n\t\texit 1\n\t}\n\techo \"Successfully added the EULA license\"\nfi\n\n# Enable \"internet\", whatever that is\nif [[ ! -z \"${NOINTERNET}\" && \"${NOINTERNET}\" == 1 ]]; then\n\techo \"Not setting 'internet-enable' on the dmg, per caller request\"\nelse\n\t# Check if hdiutil supports internet-enable\n\t# Support was removed in macOS 10.15. See https://github.com/andreyvit/create-dmg/issues/76\n\tif hdiutil internet-enable -help >/dev/null 2>/dev/null; then\n\t\thdiutil internet-enable -yes \"${DMG_DIR}/${DMG_NAME}\"\n\telse\n\t\techo \"hdiutil does not support internet-enable. Note it was removed in macOS 10.15.\"\n\tfi\nfi\n\nif [[ -n \"${SIGNATURE}\" && \"${SIGNATURE}\" != \"-null-\" ]]; then\n\techo \"Codesign started\"\t\n\tcodesign -s \"${SIGNATURE}\" \"${DMG_DIR}/${DMG_NAME}\"\n\tdmgsignaturecheck=\"$(codesign --verify --deep --verbose=2 --strict \"${DMG_DIR}/${DMG_NAME}\" 2>&1 >/dev/null)\"\n\tif [ $? -eq 0 ]; then\n\t\techo \"The disk image is now codesigned\"\n\telse\n\t\techo \"The signature seems invalid${NC}\"\n\t\texit 1\n\tfi\nfi\n\nif [[ -n \"${NOTARIZE}\" && \"${NOTARIZE}\" != \"-null-\" ]]; then\n\techo \"Notarization started\"\t\n\txcrun notarytool submit \"${DMG_DIR}/${DMG_NAME}\" --keychain-profile \"${NOTARIZE}\" --wait\n\techo \"Stapling the notarization ticket\"\n\tstaple=\"$(xcrun stapler staple \"${DMG_DIR}/${DMG_NAME}\")\"\n\tif [ $? -eq 0 ]; then\n\t\techo \"The disk image is now notarized\"\n\telse\n\t\techo \"$staple\"\n\t\techo \"The notarization failed with error $?\"\n\t\texit 1\n\tfi\nfi\n\n# All done!\necho \"Disk image done\"\nexit 0\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/doc-project/Developer Notes.md",
    "content": "# create-dmg Developer Notes\n\n## Repo layout\n\n- `create-dmg` in the root of the repo is the main program\n- `support/` contains auxiliary scripts used by `create-dmg`; it must be at that relative position to `create-dmg`\n- `builder/` contains ????\n- `examples/` contains user-facing examples\n- `tests/` contains regression tests for developers\n- `doc-project/` contains developer-facing documentation about this project\n\n### tests/\n\nThe `tests/` folder contains regression tests for developers.\n\nEach test is in its own subfolder.\nEach subfolder name should start with a 3-digit number that is the number of the corresponding bug report in create-dmg's GitHub issue tracker.\n\nThe tests are to be run manually, with the results examined manually.\nThere's no automated script to run them as a suite and check their results.\nThat might be nice to have.\n\n### examples/\n\nEach example is in its own subfolder.\nThe subfolder prefix number is arbitrary; these numbers should roughly be in order of \"advancedness\" of examples, so it makes sense for users to go through them in order.\n\n## Versioning\n\nAs of May 2020, we're using SemVer versioning.\nThe old version numbers were 4-parters, like \"1.0.0.7\".\nNow we use 3-part SemVer versions, like \"1.0.8\".\nThis change happened after version 1.0.0.7; 1.0.8 is the next release after 1.0.0.7.\n\nThe suffix \"-SNAPSHOT\" is used to denote a version that is still under development.\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/doc-project/Release Checklist.md",
    "content": "# Release Checklist\n\n- Update the version in `create-dmg`'s `pure_version` function\n  - Remove the \"-SNAPSHOT\" suffix\n- Commit\n- Tag the release as `vX.X.X`\n- `git push --tags`\n- Create a release on the GitHub project page\n- Open development on the next release\n  - Bump the version number and add a \"-SNAPSHOT\" suffix to it\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/examples/01-main-example/sample",
    "content": "#!/usr/bin/env bash\n\nif [[ -e ../../create-dmg ]]; then\n  # We're running from the repo\n  CREATE_DMG=../../create-dmg\nelse\n  # We're running from an installation under a prefix\n  CREATE_DMG=../../../../bin/create-dmg\nfi\n\n# Since create-dmg does not clobber, be sure to delete previous DMG\n[[ -f Application-Installer.dmg ]] && rm Application-Installer.dmg\n\n# Create the DMG\n$CREATE_DMG \\\n  --volname \"Application Installer\" \\\n  --background \"installer_background.png\" \\\n  --window-pos 200 120 \\\n  --window-size 800 400 \\\n  --icon-size 100 \\\n  --icon \"Application.app\" 200 190 \\\n  --hide-extension \"Application.app\" \\\n  --app-drop-link 600 185 \\\n  \"Application-Installer.dmg\" \\\n  \"source_folder/\"\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/examples/01-main-example/source_folder/Application.app",
    "content": ""
  },
  {
    "path": "scripts/create-dmg-1.1.0/support/eula-resources-template.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LPic</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Attributes</key>\n\t\t\t<string>0x0000</string>\n\t\t\t<key>Data</key>\n\t\t\t<data>\n\t\t\tAAAAAgAAAAAAAAAAAAQAAA==\n\t\t\t</data>\n\t\t\t<key>ID</key>\n\t\t\t<string>5000</string>\n\t\t\t<key>Name</key>\n\t\t\t<string></string>\n\t\t</dict>\n\t</array>\n\t<key>STR#</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Attributes</key>\n\t\t\t<string>0x0000</string>\n\t\t\t<key>Data</key>\n\t\t\t<data>\n\t\t\tAAYNRW5nbGlzaCB0ZXN0MQVBZ3JlZQhEaXNhZ3JlZQVQcmludAdT\n\t\t\tYXZlLi4ueklmIHlvdSBhZ3JlZSB3aXRoIHRoZSB0ZXJtcyBvZiB0\n\t\t\taGlzIGxpY2Vuc2UsIGNsaWNrICJBZ3JlZSIgdG8gYWNjZXNzIHRo\n\t\t\tZSBzb2Z0d2FyZS4gIElmIHlvdSBkbyBub3QgYWdyZWUsIHByZXNz\n\t\t\tICJEaXNhZ3JlZS4i\n\t\t\t</data>\n\t\t\t<key>ID</key>\n\t\t\t<string>5000</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>English buttons</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Attributes</key>\n\t\t\t<string>0x0000</string>\n\t\t\t<key>Data</key>\n\t\t\t<data>\n\t\t\tAAYHRW5nbGlzaAVBZ3JlZQhEaXNhZ3JlZQVQcmludAdTYXZlLi4u\n\t\t\te0lmIHlvdSBhZ3JlZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIGxp\n\t\t\tY2Vuc2UsIHByZXNzICJBZ3JlZSIgdG8gaW5zdGFsbCB0aGUgc29m\n\t\t\tdHdhcmUuICBJZiB5b3UgZG8gbm90IGFncmVlLCBwcmVzcyAiRGlz\n\t\t\tYWdyZWUiLg==\n\t\t\t</data>\n\t\t\t<key>ID</key>\n\t\t\t<string>5002</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>English</string>\n\t\t</dict>\n\t</array>\n\t<key>${EULA_FORMAT}</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Attributes</key>\n\t\t\t<string>0x0000</string>\n\t\t\t<key>Data</key>\n\t\t\t<data>\n${EULA_DATA}\n\t\t\t</data>\n\t\t\t<key>ID</key>\n\t\t\t<string>5000</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>English</string>\n\t\t</dict>\n\t</array>\n\t<key>TMPL</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Attributes</key>\n\t\t\t<string>0x0000</string>\n\t\t\t<key>Data</key>\n\t\t\t<data>\n\t\t\tE0RlZmF1bHQgTGFuZ3VhZ2UgSUREV1JEBUNvdW50T0NOVAQqKioq\n\t\t\tTFNUQwtzeXMgbGFuZyBJRERXUkQebG9jYWwgcmVzIElEIChvZmZz\n\t\t\tZXQgZnJvbSA1MDAwRFdSRBAyLWJ5dGUgbGFuZ3VhZ2U/RFdSRAQq\n\t\t\tKioqTFNURQ==\n\t\t\t</data>\n\t\t\t<key>ID</key>\n\t\t\t<string>128</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>LPic</string>\n\t\t</dict>\n\t</array>\n\t<key>styl</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Attributes</key>\n\t\t\t<string>0x0000</string>\n\t\t\t<key>Data</key>\n\t\t\t<data>\n\t\t\tAAMAAAAAAAwACQAUAAAAAAAAAAAAAAAAACcADAAJABQBAAAAAAAA\n\t\t\tAAAAAAAAKgAMAAkAFAAAAAAAAAAAAAA=\n\t\t\t</data>\n\t\t\t<key>ID</key>\n\t\t\t<string>5000</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>English</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/support/template.applescript",
    "content": "on run (volumeName)\n\ttell application \"Finder\"\n\t\ttell disk (volumeName as string)\n\t\t\topen\n\n\t\t\tset theXOrigin to WINX\n\t\t\tset theYOrigin to WINY\n\t\t\tset theWidth to WINW\n\t\t\tset theHeight to WINH\n\n\t\t\tset theBottomRightX to (theXOrigin + theWidth)\n\t\t\tset theBottomRightY to (theYOrigin + theHeight)\n\t\t\tset dsStore to \"\\\"\" & \"/Volumes/\" & volumeName & \"/\" & \".DS_STORE\\\"\"\n\n\t\t\ttell container window\n\t\t\t\tset current view to icon view\n\t\t\t\tset toolbar visible to false\n\t\t\t\tset statusbar visible to false\n\t\t\t\tset the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY}\n\t\t\t\tset statusbar visible to false\n\t\t\t\tREPOSITION_HIDDEN_FILES_CLAUSE\n\t\t\tend tell\n\n\t\t\tset opts to the icon view options of container window\n\t\t\ttell opts\n\t\t\t\tset icon size to ICON_SIZE\n\t\t\t\tset text size to TEXT_SIZE\n\t\t\t\tset arrangement to not arranged\n\t\t\tend tell\n\t\t\tBACKGROUND_CLAUSE\n\n\t\t\t-- Positioning\n\t\t\tPOSITION_CLAUSE\n\n\t\t\t-- Hiding\n\t\t\tHIDING_CLAUSE\n\n\t\t\t-- Application and QL Link Clauses\n\t\t\tAPPLICATION_CLAUSE\n\t\t\tQL_CLAUSE\n\t\t\tclose\n\t\t\topen\n\t\t\t-- Force saving of the size\n\t\t\tdelay 1\n\n\t\t\ttell container window\n\t\t\t\tset statusbar visible to false\n\t\t\t\tset the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10}\n\t\t\tend tell\n\t\tend tell\n\n\t\tdelay 1\n\n\t\ttell disk (volumeName as string)\n\t\t\ttell container window\n\t\t\t\tset statusbar visible to false\n\t\t\t\tset the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY}\n\t\t\tend tell\n\t\tend tell\n\n\t\t--give the finder some time to write the .DS_Store file\n\t\tdelay 3\n\n\t\tset waitTime to 0\n\t\tset ejectMe to false\n\t\trepeat while ejectMe is false\n\t\t\tdelay 1\n\t\t\tset waitTime to waitTime + 1\n\t\t\t\n\t\t\tif (do shell script \"[ -f \" & dsStore & \" ]; echo $?\") = \"0\" then set ejectMe to true\n\t\tend repeat\n\t\tlog \"waited \" & waitTime & \" seconds for .DS_STORE to be created.\"\n\tend tell\nend run\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/tests/007-space-in-dir-name/my files/hello.txt",
    "content": "Hello world\n"
  },
  {
    "path": "scripts/create-dmg-1.1.0/tests/007-space-in-dir-name/run-test",
    "content": "#!/usr/bin/env bash\n\n# Test for https://github.com/create-dmg/create-dmg/issues/7 - spaces in folder names\n\n../../create-dmg \"my disk image.dmg\" \"my files\""
  },
  {
    "path": "scripts/macos_build.sh",
    "content": "#!/bin/bash\n\nset -e\n\nARCH=x86_64-apple-darwin\nARCH_NAME=x86_64\n\nrustup target add x86_64-apple-darwin\n\nif [ $# -ne 0 ]; then\n    echo \"$1\"\n    if [ \"$1\" = \"-a\" ]; then\n        echo \"222\"\n        ARCH=aarch64-apple-darwin\n        ARCH_NAME=arm64\n        rustup target add aarch64-apple-darwin\n    fi\nfi\n\nMACOS_DMG_NAME=graphpu-0.5.0-macos-${ARCH_NAME}\n\nAPP_NAME=graphpu\nMACOS_BIN_NAME=GraphPU\nMACOS_APP_NAME=GraphPU\nMACOS_APP_NAME_APP=$MACOS_APP_NAME.app\nMACOS_APP_DIR_PREFIX=app_${ARCH_NAME}\nMACOS_APP_DIR=${MACOS_APP_DIR_PREFIX}/${MACOS_APP_NAME_APP}\n\ncd ../\n\nmkdir -p macos_build\ncd macos_build\n\necho \"Creating app directory structure\"\nrm -rf $MACOS_APP_NAME\nrm -rf $MACOS_APP_DIR\nmkdir -p $MACOS_APP_DIR/Contents/MacOS\n\ncargo rustc \\\n    --release \\\n    --target=$ARCH \\\n    --features exe\n#    --verbose \\\n\necho \"Copying binary\"\nMACOS_APP_BIN=$MACOS_APP_DIR/Contents/MacOS/$MACOS_BIN_NAME\ncp ../target/$ARCH/release/$APP_NAME $MACOS_APP_BIN\nchmod 777 $MACOS_APP_BIN\n\necho \"Copying resources directory\"\ncp -r ../resources $MACOS_APP_DIR/Contents/MacOS\n\necho \"Copying launcher\"\ncp ../scripts/macos_launch.sh $MACOS_APP_DIR/Contents/MacOS/${MACOS_APP_NAME}_Launcher\nchmod 777 $MACOS_APP_DIR/Contents/MacOS/${MACOS_APP_NAME}_Launcher\n\necho \"Copying Icon\"\nmkdir -p $MACOS_APP_DIR/Contents/Resources\ncp ../resources/Info.plist $MACOS_APP_DIR/Contents/\ncp ../resources/app.icns $MACOS_APP_DIR/Contents/Resources/\n\necho \"Code Signing\"\ncodesign -s \"5BW8DTZV3H\" --deep -v -f -o runtime $MACOS_APP_DIR\n\necho \"Creating dmg\"\n# mkdir -p $MACOS_APP_NAME\n# cp -r $MACOS_APP_DIR $MACOS_APP_NAME/\n# rm -rf $MACOS_APP_NAME/.Trashes\n\n# FULL_NAME=$MACOS_APP_NAME\n\n# hdiutil create $FULL_NAME.dmg -srcfolder $MACOS_APP_NAME -ov\n# rm -rf $MACOS_APP_NAME\n\n\n# Since create-dmg does not clobber, be sure to delete previous DMG\n[[ -f $MACOS_DMG_NAME.dmg ]] && rm $MACOS_DMG_NAME.dmg\n\n# Create the DMG\n../scripts/create-dmg-1.1.0/create-dmg \\\n  --volname $MACOS_DMG_NAME \\\n  --volicon \"../resources/app.icns\" \\\n  --background \"../scripts/installer_background.jpg\" \\\n  --window-pos 200 120 \\\n  --window-size 540 375 \\\n  --icon-size 120 \\\n  --hide-extension $MACOS_APP_NAME_APP \\\n  --text-size 12 \\\n  --icon $MACOS_APP_NAME_APP 140 190 \\\n  --hide-extension $MACOS_APP_NAME_APP \\\n  --app-drop-link 400 190 \\\n  $MACOS_DMG_NAME.dmg \\\n  \"./${MACOS_APP_DIR_PREFIX}\"\n\n\nxcrun notarytool submit $MACOS_DMG_NAME.dmg \\\n    --keychain-profile \"nhciao\" \\\n    --wait\n\nxcrun stapler staple $MACOS_DMG_NAME.dmg\n\ncd ../\ncd ./scripts/"
  },
  {
    "path": "scripts/macos_build_entry.sh",
    "content": "#!/bin/bash\n\n. ./macos_build.sh\n. ./macos_build.sh -a"
  },
  {
    "path": "scripts/macos_cross_compile.sh",
    "content": "#!/bin/bash\n\nbrew install mingw-w64\n\n. ./windows_build.sh"
  },
  {
    "path": "scripts/macos_launch.sh",
    "content": "#!/bin/bash\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\nBIN=GraphPU\n\n\"${DIR}/${BIN}\""
  },
  {
    "path": "scripts/windows_build.sh",
    "content": "#!/bin/bash\n\ncd ../\n\nBUILD_DIR=windows_build\nAPP_BUNDLE_NAME=graphpu-0.5.0-windows-x86_64\nAPP_BUNDLE_DIR=${BUILD_DIR}/${APP_BUNDLE_NAME}\nARCH=x86_64-pc-windows-msvc\n\nrm -rf ${APP_BUNDLE_DIR}\nrustup target add ${ARCH}\ncargo build --release --features exe --target ${ARCH}\nmkdir -p ${APP_BUNDLE_DIR}/\n\ncp target/${ARCH}/release/graphpu.exe ${APP_BUNDLE_DIR}/GraphPU.exe\ncp -r resources ${APP_BUNDLE_DIR}/\n#cd windows_build\n#rcedit \"Graphpu.exe\" --set-icon \"resources\\\\app_icon.ico\""
  },
  {
    "path": "src/app.rs",
    "content": "use crate::components::detail_view::show_message;\nuse crate::components::dock_view::DockView;\nuse crate::components::drawer_view::DrawerView;\nuse crate::components::shortcuts::Shortcut;\nuse crate::constant::{FONT_SIZE_BODY, FONT_SIZE_HEADING};\nuse crate::models::app_model::DockStage;\nuse crate::{\n    components::{\n        detail_view::DetailView, export_modal_view::ExportModal, graphics_view::GraphicsView,\n        import_modal_view::ImportModal, inspector_view::InspectorView, menubar_view::MenuBarView,\n        table_view::TableView, AppView,\n    },\n    models::{\n        app_model::{AppModel, MainStage},\n        data_model::DataModel,\n        graphics_model::GraphicsModel,\n        Models,\n    },\n};\nuse egui::{Color32, TextStyle};\n\npub struct MainApp {\n    pub models: Models,\n    inspector_view: InspectorView,\n    drawer_view: DrawerView,\n    import_modal: ImportModal,\n    export_modal: ExportModal,\n}\n\nimpl MainApp {\n    pub fn new(cc: &eframe::CreationContext<'_>) -> Self {\n        let mut style = (*cc.egui_ctx.style()).clone();\n        style.visuals.widgets.active.fg_stroke.color = Color32::from_white_alpha(220);\n        style.visuals.widgets.inactive.fg_stroke.color = Color32::from_white_alpha(190);\n        style.visuals.widgets.noninteractive.fg_stroke.color = Color32::from_white_alpha(170);\n        // style.visuals.widgets.noninteractive.bg_stroke.color = Color32::from_gray(0);\n        style.visuals.selection.bg_fill = Color32::from_rgb(86, 89, 225);\n        style.visuals.selection.stroke.color = Color32::from_white_alpha(240);\n\n        style.visuals.widgets.hovered.bg_stroke.width = 0.0;\n        style.visuals.widgets.hovered.expansion = 0.0;\n        style.visuals.widgets.active.bg_stroke.width = 0.0;\n        style.visuals.widgets.active.expansion = 0.0;\n\n        // style.visuals.collapsing_header_frame = true;\n\n        style.spacing.icon_width = 12.0;\n        style.spacing.indent = 16.0;\n\n        style.text_styles.get_mut(&TextStyle::Body).unwrap().size = FONT_SIZE_BODY;\n        style.text_styles.get_mut(&TextStyle::Button).unwrap().size = FONT_SIZE_BODY;\n        style.text_styles.get_mut(&TextStyle::Heading).unwrap().size = FONT_SIZE_HEADING;\n\n        // style.text_styles = [\n        //     (Heading, FontId::new(30.0, Proportional)),\n        //     (Name(\"Heading2\".into()), FontId::new(25.0, Proportional)),\n        //     (Name(\"Context\".into()), FontId::new(23.0, Proportional)),\n        //     (Body, FontId::new(18.0, Proportional)),\n        //     (Monospace, FontId::new(14.0, Proportional)),\n        //     (Button, FontId::new(14.0, Proportional)),\n        //     (Small, FontId::new(10.0, Proportional)),\n        // ].into();\n\n        style.spacing.button_padding = egui::vec2(8.0, 1.0);\n\n        cc.egui_ctx.set_style(style);\n\n        let mut fonts = egui::FontDefinitions::default();\n\n        fonts.font_data.insert(\n            \"prop_font\".to_owned(),\n            egui::FontData::from_static(include_bytes!(\"./assets/fonts/droidsans.ttf\")),\n        );\n\n        fonts.font_data.insert(\n            \"mono_font\".to_owned(),\n            egui::FontData::from_static(include_bytes!(\"./assets/fonts/bmonofont-i18n.ttf\")),\n        ); // .ttf and .otf supported\n\n        fonts\n            .families\n            .get_mut(&egui::FontFamily::Proportional)\n            .unwrap()\n            .insert(0, \"prop_font\".to_owned());\n\n        fonts\n            .families\n            .get_mut(&egui::FontFamily::Monospace)\n            .unwrap()\n            .insert(0, \"mono_font\".to_owned());\n        // .push(\"mono_font\".to_owned());\n\n        cc.egui_ctx.set_fonts(fonts);\n\n        // cc.egui_ctx.set_debug_on_hover(true);\n\n        let mut main_app = MainApp {\n            models: Models {\n                graphics_model: GraphicsModel::init(cc),\n                data_model: DataModel::default(),\n                app_model: AppModel::default(),\n            },\n            inspector_view: Default::default(),\n            drawer_view: Default::default(),\n            import_modal: ImportModal::default(),\n            export_modal: ExportModal::default(),\n        };\n\n        if let Some(pixels_per_point) = cc.integration_info.native_pixels_per_point {\n            main_app.models.app_model.pixels_per_point = pixels_per_point;\n        }\n\n        main_app\n    }\n}\n\nimpl eframe::App for MainApp {\n    fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {\n        self.models.app_model.ui_frame_count += 1u32;\n\n        egui::CentralPanel::default()\n            .frame(egui::Frame::none())\n            .show(ctx, |ui| {\n                ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0);\n                // ui.set_enabled(false);\n\n                Shortcut::default().apply(&mut self.models, ui, frame);\n\n                if !self.models.app_model.is_fullscreen_graphics {\n                    MenuBarView::default().show(&mut self.models, ui, frame);\n                    DetailView::default().show(&mut self.models, ui, frame);\n                    self.inspector_view.show(&mut self.models, ui, frame);\n                    DockView::default().show(&mut self.models, ui, frame);\n                    if self.models.app_model.dock_stage != DockStage::None {\n                        self.drawer_view.show(&mut self.models, ui, frame);\n                    }\n                    match self.models.app_model.main_stage {\n                        MainStage::Graphics => {\n                            GraphicsView::default().show(&mut self.models, ui, frame)\n                        }\n                        MainStage::Table => TableView::default().show(&mut self.models, ui, frame),\n                    };\n                } else {\n                    GraphicsView::default().show(&mut self.models, ui, frame);\n                    show_message(&mut self.models, ui, frame, 2);\n                }\n            });\n\n        if self.models.app_model.is_import_visible {\n            self.import_modal.show(ctx, &mut self.models);\n        }\n\n        if self.models.app_model.is_export_visible {\n            self.export_modal.show(ctx, &mut self.models);\n        }\n    }\n}\n"
  },
  {
    "path": "src/assets/shaders/CS_graph_solver.wgsl",
    "content": "struct Node {\n    position: vec3<f32>,\n    _empty_1: i32,\n    force: vec3<f32>,\n    _empty_2: i32,\n    prev_force: vec3<f32>,\n    mass: atomic<u32>,\n};\n\nstruct Uniforms {\n    frame_num: u32,\n    node_count: u32,\n    edge_count: u32,\n    edge_sort_count: u32,\n    tree_node_count: u32,\n    bounding_count: u32,\n    kernel_status_count: u32,\n};\n\nstruct Bound {\n    bound_min: vec3<f32>,\n    bound_max: vec3<f32>,\n}\n\nstruct BHTree {\n    max_depth: atomic<u32>,\n    bottom: atomic<u32>,\n    radius: f32,\n    _empty: i32,\n}\n\nstruct BHTreeNode {\n    position: vec3<f32>,\n    _empty: i32,\n    mass: atomic<i32>,\n    count: i32,\n    start: atomic<i32>,\n    sort: i32,\n}\n\nstruct Kvp {\n    sort_key: f32,\n    index: u32,\n}\n\nstruct KvpParam {\n    dim: u32,\n    block_count: u32,\n}\n\nstruct Transform {\n    view: mat4x4<f32>,\n    projection: mat4x4<f32>,\n    time: vec4<f32>,\n    screen: vec4<f32>,\n    camera: vec4<f32>,\n}\n\nstruct NodeEdgeSortRange {\n    min: atomic<u32>,\n    max: atomic<u32>,\n}\n\n@group(0) @binding(0)  var<uniform>             uniforms:               Uniforms;\n@group(0) @binding(1)  var<storage, read_write> node_src:               array<Node>;\n@group(0) @binding(2)  var<storage, read>       edge_src:               array<vec2<u32>>;\n@group(0) @binding(3)  var<storage, read_write> spring_force_src:       array<vec3<f32>>;\n@group(0) @binding(4)  var<storage, read_write> bounding:               array<Bound>;\n@group(0) @binding(5)  var<storage, read_write> bhTree:                 BHTree;\n@group(0) @binding(6)  var<storage, read_write> tree_node_src:          array<BHTreeNode>;\n@group(0) @binding(7)  var<storage, read_write> tree_child_src:         array<atomic<i32>>;\n@group(0) @binding(8)  var<storage, read_write> kvps:                   array<Kvp>;\n@group(0) @binding(9)  var<uniform>             kvps_param:             KvpParam;\n@group(0) @binding(10) var<uniform>             transform:              Transform;\n@group(0) @binding(11) var<storage, read_write> kernel_status:          array<i32>;\n@group(0) @binding(12) var<storage, read_write> edge_sort_node:         array<vec2<u32>>;\n@group(0) @binding(13) var<storage, read_write> edge_sort_dir:          array<vec3<f32>>;\n@group(0) @binding(14) var<storage, read_write> node_edge_sort_range:   array<NodeEdgeSortRange>;\n@group(0) @binding(15) var<storage, read_write> node_copy_src:          array<f32>;\n\nfn hash(s: u32) -> u32 {\n    var t : u32 = s;\n    t ^= 2747636419u;\n    t *= 2654435769u;\n    t ^= t >> 16u;\n    t *= 2654435769u;\n    t ^= t >> 16u;\n    t *= 2654435769u;\n    return t;\n}\n\nfn random(seed: u32) -> f32 {\n    return f32(hash(seed)) / 4294967295.0; // 2^32-1\n}\n\nfn random_xy(seed_x: u32, seed_y: u32) -> f32 {\n    return f32(hash(hash(seed_x) + seed_y)) / 4294967295.0; // 2^32-1\n}\n\n\n@compute\n@workgroup_size(256)\nfn init_kernel_status(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n\n    let total = uniforms.kernel_status_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    kernel_status[index] = 0;\n\n}\n\n\n@compute\n@workgroup_size(256)\nfn gen_node(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    var vPos : vec3<f32> = node_src[index].position;\n\n    vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0;\n    vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0;\n    vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0;\n//    vPos.x = 0.0;\n//    vPos.y = 0.0;\n//    vPos.z = 0.0;\n\n    // Write back\n    node_src[index].position = vPos;\n    node_src[index].force = vec3<f32>(0.0);\n    node_src[index].prev_force = vec3<f32>(0.0);\n    node_src[index].mass = 1u;\n    spring_force_src[index] = vec3<f32>(0.0);\n\n    atomicStore(&node_edge_sort_range[index].min, 0u);\n    atomicStore(&node_edge_sort_range[index].max, 0u);\n\n}\n\n\n@compute\n@workgroup_size(256)\nfn cal_mass(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.edge_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    var edge = edge_src[index];\n    let source_node: u32 = edge[0];\n    let target_node: u32 = edge[1];\n\n    atomicAdd(&node_src[source_node].mass, 1u);\n    atomicAdd(&node_src[target_node].mass, 1u);\n}\n\n\n@compute\n@workgroup_size(256)\nfn cal_gravity_force(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    // TODO: Global Param\n    let strong_gravity = true;\n    let k_gravity = 1.0;\n\n    let pos = node_src[index].position;\n    let mass = f32(atomicLoad(&node_src[index].mass));\n    var gravity_force: f32;\n    if (strong_gravity) {\n        gravity_force =  k_gravity * mass;\n    } else {\n        if (pos.x != 0.0 || pos.y != 0.0 || pos.z != 0.0) {\n            gravity_force = k_gravity * mass * inverseSqrt(dot(pos, pos));\n        }\n        else {\n            gravity_force = 0.0;\n        }\n    }\n//    node_src[index].force +=  -pos * gravity_force;\n//    node_src[index].force +=  -pos * min(gravity_force, 1.0);\n\n    node_src[index].force +=  -pos * 0.5;\n}\n\n@compute\n@workgroup_size(256)\nfn prepare_edge_sort(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.edge_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    var edge = edge_src[index];\n\n    edge_sort_node[index * 2u] = edge;\n    edge_sort_node[index * 2u + 1u] = vec2<u32>(edge[1], edge[0]);\n}\n\n@compute\n@workgroup_size(256)\nfn sort_edge(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let i = global_invocation_id.x;\n    var j = i ^ kvps_param.block_count;\n\n    if (kvps_param.block_count == kvps_param.dim >> 1u) {\n        j = i ^ (kvps_param.block_count * 2u - 1u);\n    }\n\n    let total = uniforms.edge_sort_count;\n    if (j < i || i >= total || j >= total) {\n        return;\n    }\n\n    let edge_i = edge_sort_node[i];\n    let edge_j = edge_sort_node[j];\n\n    if (edge_j[0] < edge_i[0]) {\n        edge_sort_node[i] = edge_j;\n        edge_sort_node[j] = edge_i;\n    }\n}\n\n@compute\n@workgroup_size(256)\nfn compute_node_edge_sort_range(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let i = global_invocation_id.x;\n\n    let total = uniforms.edge_sort_count;\n    if (i >= total) {\n        return;\n    }\n\n    let node_index = edge_sort_node[i][0];\n\n    atomicStore(&node_edge_sort_range[node_index].min, i);\n    atomicStore(&node_edge_sort_range[node_index].max, i + 1u);\n\n}\n@compute\n@workgroup_size(256)\nfn compute_node_edge_sort_range_2(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let i = global_invocation_id.x;\n\n    let total = uniforms.edge_sort_count;\n    if (i >= total) {\n        return;\n    }\n\n    let node_index = edge_sort_node[i][0];\n\n    atomicMin(&node_edge_sort_range[node_index].min, i);\n    atomicMax(&node_edge_sort_range[node_index].max, i + 1u);\n\n}\n\n\nvar<workgroup> local_sum: array<vec3<f32>, 256>;\n\n@compute\n@workgroup_size(256)\nfn spring_force_reduction(\n    @builtin(local_invocation_index) local_index: u32,\n    @builtin(global_invocation_id) global_id: vec3<u32>,\n    @builtin(workgroup_id) group_id: vec3<u32>,\n) {\n\n    var skip = false;\n\n    var index = global_id.x;\n    let total = uniforms.edge_sort_count;\n    if (index >= total) {\n        index = total - 1u;\n    }\n\n    var edge = edge_sort_node[index];\n    let source_node: u32 = edge[0];\n    let target_node: u32 = edge[1];\n    var dir = node_src[target_node].position - node_src[source_node].position;\n    local_sum[local_index] = dir;\n\n    if (index >= total) {\n        skip = true;\n        local_sum[local_index] = vec3<f32>(0.0);\n    }\n\n    let range_min = atomicLoad(&node_edge_sort_range[source_node].min);\n    let range_max = atomicLoad(&node_edge_sort_range[source_node].max);\n\n    if (range_min >= range_max) {\n        skip = true;\n    }\n\n    var node_relative_index: i32 = i32(index) - i32(range_min);\n    let min_relative_index:  i32 = i32(local_index) - node_relative_index;\n    let max_relative_index:  i32 = min_relative_index - i32(range_min) + i32(range_max);\n\n    workgroupBarrier();\n\n    var start = u32(max(min_relative_index, 0));\n    var end = u32(min(max_relative_index, 256));\n\n    for (var s = 256u / 2u; s > 0u; s >>= 1u) {\n\n        if (!skip && local_index < start + s) {\n            let k = local_index + s;\n            if (k < end) {\n                local_sum[local_index] += local_sum[k];\n            }\n        }\n        workgroupBarrier();\n    }\n\n    if (skip) {\n        return;\n    }\n\n    if (local_index == start) {\n//        node_src[source_node].position += vec3<f32>(0.005, 0.0, 0.0);\n//        let dir_sum = local_sum[local_index];\n//        edge_sort_src[index].dir = dir_sum;\n    }\n        let dir_sum = local_sum[local_index];\n        edge_sort_dir[index] = dir_sum;\n}\n\n@compute\n@workgroup_size(256)\nfn spring_force(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    let range_min = atomicLoad(&node_edge_sort_range[index].min);\n    let range_max = atomicLoad(&node_edge_sort_range[index].max);\n\n    if (range_min >= range_max) {\n        return;\n    }\n\n    spring_force_src[index] += edge_sort_dir[range_min];\n    for (var i = u32(range_min) - (u32(range_min) % 256u) + 256u; i < u32(range_max); i += 256u) {\n        spring_force_src[index] += edge_sort_dir[i];\n    }\n\n}\n\nvar<workgroup> smin: array<vec3<f32>, 256>;\nvar<workgroup> smax: array<vec3<f32>, 256>;\n\n\n@compute\n@workgroup_size(256)\nfn reduction_bounding(\n    @builtin(local_invocation_index) local_index: u32,\n    @builtin(global_invocation_id) global_id: vec3<u32>,\n    @builtin(workgroup_id) group_id: vec3<u32>,\n) {\n\n    var index = global_id.x;\n    let total = uniforms.node_count;\n    if (index >= total) {\n        index = total - 1u;\n    }\n\n    smin[local_index] = node_src[index].position;\n    smax[local_index] = node_src[index].position;\n    workgroupBarrier();\n\n    for (var s = 256u / 2u; s > 0u; s >>= 1u) {\n        if (local_index < s) {\n            let k = local_index + s;\n            smin[local_index] = min(smin[local_index], smin[k]);\n            smax[local_index] = max(smax[local_index], smax[k]);\n        }\n        workgroupBarrier();\n    }\n\n    if (local_index == 0u) {\n        bounding[group_id.x].bound_min = smin[0];\n        bounding[group_id.x].bound_max = smax[0];\n    }\n}\n\n// 5\n@compute\n@workgroup_size(256)\nfn reduction_bounding_2(\n    @builtin(local_invocation_index) local_index: u32,\n    @builtin(global_invocation_id) global_id: vec3<u32>,\n    @builtin(workgroup_id) group_id: vec3<u32>,\n) {\n\n    var index = global_id.x;\n    let total = uniforms.bounding_count;\n    if (index >= total) {\n        index = total - 1u;\n    }\n\n    smin[local_index] = bounding[index].bound_min;\n    smax[local_index] = bounding[index].bound_max;\n    workgroupBarrier();\n\n    for (var s = 256u / 2u; s > 0u; s >>= 1u) {\n        if (local_index < s) {\n            let k = local_index + s;\n            smin[local_index] = min(smin[local_index], smin[k]);\n            smax[local_index] = max(smax[local_index], smax[k]);\n        }\n        workgroupBarrier();\n    }\n\n    if (local_index == 0u) {\n        bounding[group_id.x].bound_min = smin[0];\n        bounding[group_id.x].bound_max = smax[0];\n    }\n}\n\n// 6\n@compute\n@workgroup_size(1)\nfn bounding_box() {\n    var bound_min_min = bounding[0].bound_min;\n    var bound_max_max = bounding[0].bound_max;\n\n    let box = bound_max_max - bound_min_min;\n    let tree_node_count = uniforms.tree_node_count - 1u;\n    bhTree.radius = max(max(box.x, box.y), box.z) * 0.5;\n    atomicStore(&bhTree.bottom, tree_node_count);\n    atomicStore(&bhTree.max_depth, 0u);\n    atomicStore(&tree_node_src[tree_node_count].mass, -1);\n    atomicStore(&tree_node_src[tree_node_count].start, 0);\n    tree_node_src[tree_node_count].position = (bound_min_min + bound_max_max) * 0.5;\n    tree_node_src[tree_node_count].count = -1;\n    tree_node_src[tree_node_count].sort = -1;\n}\n\n// 7\n@compute\n@workgroup_size(256)\nfn clear_1(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.tree_node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    for (var i = 0u; i < 8u; i++) {\n        atomicStore(&tree_child_src[index * 8u + i], -1);\n    }\n}\n\n// 8\n@compute\n@workgroup_size(256)\nfn tree_building(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    var index = global_invocation_id.x;\n    let node_count = uniforms.node_count;\n    let tree_node_count = uniforms.tree_node_count - 1u;\n    let root_pos = tree_node_src[tree_node_count].position;\n    let inc = min(node_count, 16384u); // should change\n\n    var skip = 1;\n    var pos: vec3<f32>;\n    var dp: vec3<f32>;\n    var rdp: vec3<f32>;\n    var n = tree_node_count;\n    var depth = 1u;\n    var local_max_depth = 1u;\n    var j = 0u;\n    var root_r = bhTree.radius;\n    var r = root_r * 0.5;\n\n    var loop_limit_count = 1000;\n\n    while (index < node_count) {\n\n        if (loop_limit_count < 0) {\n            kernel_status[1] = -101;\n            break;\n        }\n        loop_limit_count--;\n\n        if (skip != 0) {\n            skip = 0;\n            pos = node_src[index].position;\n\n            n = tree_node_count;\n            r = root_r * 0.5;\n            depth = 1u;\n\n            let compare = step(root_pos, pos);\n            j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); // 八个象限\n            dp = -r + compare * (2.0 * r);\n            rdp = root_pos + dp; // 所在象限的原点\n        }\n\n        // atomicAdd(&tree_child_src[n * 8u + j], 0); // ...\n        var ch = atomicLoad(&tree_child_src[n * 8u + j]);\n\n        // 迭代至叶节点\n        while (ch >= i32(node_count)) {\n            n = u32(ch);\n            depth++;\n            r *= 0.5;\n\n            let compare = step(rdp, pos);\n            j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u);\n            dp = -r + compare * (2.0 * r);\n\n            rdp += dp;\n            ch = atomicLoad(&tree_child_src[n * 8u + j]);\n        }\n\n        let locked = n * 8u + j;\n        var locked_ch = -1;\n\n        // 非 lock 状态\n        if (ch != -2) {\n            if (ch == -1) {\n                var v = -1;\n                let origin = atomicCompareExchangeWeak(&tree_child_src[locked], v, i32(index));\n                if (origin == -1) {\n                    local_max_depth = max(depth, local_max_depth);\n                    index += inc;\n                    skip = 1;\n                } else {\n                     skip = 0;\n                 }\n            } else {\n                // 格子已被占用，将其设置为 lock 状态\n                var v = ch;\n                let origin = atomicCompareExchangeWeak(&tree_child_src[locked], v, -2);\n                if (ch == origin) {\n                    // lock 成功，如果两个点的位置相同，做一点微小偏移就行了\n                    if (all(node_src[ch].position == pos)) {\n                        node_src[index].position += vec3<f32>(random_xy(index, 0u + 3u * uniforms.frame_num), random_xy(index, 1u + 3u * uniforms.frame_num), random_xy(index, 2u + 3u * uniforms.frame_num)) * 0.2 - 0.1;\n                        skip = 0;\n                        atomicStore(&tree_child_src[locked], ch);\n                        kernel_status[0] = -3;\n                        break;\n                    }\n\n                    // 两个点位置不同，则开始分裂\n                    locked_ch = -1;\n                    loop {\n\n                        // 1. create new cell\n                        let cell = atomicSub(&bhTree.bottom, 1u) - 1u;\n                        if (cell <= node_count) {\n                            return;\n                        }\n\n                        if (locked_ch != -1) {\n                            atomicStore(&tree_child_src[n * 8u + j], i32(cell));\n                        }\n                        locked_ch = max(locked_ch, i32(cell));\n\n                        // 2. make newly created cell current\n                        depth++;\n                        n = cell;\n                        r *= 0.5;\n\n                        // 3. insert old body into current quadrant\n                        let compare = step(rdp, node_src[ch].position);\n                        j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u);\n\n                        atomicStore(&tree_child_src[cell * 8u + j], ch);\n\n                        // 4. determin center + quadrant for cell of new body\n                        let compare = step(rdp, pos);\n                        j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u);\n                        dp = -r + compare * (2.0 * r);\n\n                        rdp += dp;\n\n                        // 5. visit this cell/chec if in use (possibly by old body)\n                        ch = atomicLoad(&tree_child_src[n * 8u + j]);\n\n                        if (ch < 0) {\n                            break;\n                        }\n\n                    };\n                    atomicStore(&tree_child_src[n * 8u + j], i32(index));\n                    local_max_depth = max(depth, local_max_depth);\n                    index += inc;\n                    skip = 2;\n                }\n            }\n        }\n        workgroupBarrier();\n        if (skip == 2) {\n            atomicStore(&tree_child_src[locked], locked_ch);\n        }\n    }\n    atomicMax(&bhTree.max_depth, local_max_depth);\n}\n\n// 9\n@compute\n@workgroup_size(256)\nfn clear_2(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.tree_node_count - 1u;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n    tree_node_src[index].position = vec3<f32>(0.0);\n    tree_node_src[index].count = -1;\n    tree_node_src[index].sort = -1;\n    atomicStore(&tree_node_src[index].start, -1);\n    atomicStore(&tree_node_src[index].mass, -1);\n}\n\n// 10\n@compute\n@workgroup_size(256)\nfn summarization(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let bottom = atomicLoad(&bhTree.bottom);\n    let tree_node_count = uniforms.tree_node_count - 1u;\n    let node_count = uniforms.node_count;\n    let inc = min(node_count, 16384u);\n    var index = u32((i32(bottom) & -32) + i32(global_invocation_id.x));\n    if (index < bottom) {\n        index += inc;\n    }\n\n    // TODO: ch bounds check\n    var schild: array<u32, 8>;\n    var smass: array<i32, 8>;\n    let restart = index;\n\n    var loop_limit_count = 10000;\n\n    for (var j = 0; j < 5; j++) {\n\n        while (index <= tree_node_count) {\n\n            if (loop_limit_count < 0) {\n                kernel_status[2] = 500 + j;\n                break;\n            }\n            loop_limit_count--;\n\n            if (atomicLoad(&tree_node_src[index].mass) < 0) {\n                var ch = 0u;\n                var i = 0u;\n                for (i = 0u; i < 8u; i++) {\n                    ch = u32(atomicLoad(&tree_child_src[index * 8u + i]));\n                    schild[i] = ch;\n                    // atomicAdd(&tree_node_src[ch].mass, 0);\n                    smass[i] = atomicLoad(&tree_node_src[ch].mass);\n                    if (ch >= node_count && smass[i] < 0) {\n                        break;\n                    }\n                }\n                if (i == 8u) {\n                    var cm = 0;\n                    var pos = vec3<f32>(0.0);\n                    var cnt = 0;\n                    for (i = 0u; i < 8u; i++) {\n                        ch = schild[i];\n                        if (ch >= node_count) {\n                            let m = smass[i];\n                            cnt += tree_node_src[ch].count;\n                            pos += tree_node_src[ch].position * f32(m);\n                            cm += m;\n                        } else {\n                            let m = i32(atomicLoad(&node_src[ch].mass));\n                            cnt += 1;\n                            pos += node_src[ch].position * f32(m);\n                            cm += m;\n                        }\n                    }\n                    tree_node_src[index].count = cnt;\n                    tree_node_src[index].position = pos / f32(cm);\n                    // workgroupBarrier();\n                    atomicStore(&tree_node_src[index].mass, cm);\n                }\n            }\n            index += inc;\n        }\n        index = restart;\n    }\n\n    var j = 0;\n    var flag = false;\n    while (index <= tree_node_count) {\n\n        if (loop_limit_count < 0) {\n            kernel_status[2] = 101;\n            break;\n        }\n        loop_limit_count--;\n\n        var cm = 0;\n        if (index < node_count) {\n            index += inc;\n        } else if (index >= node_count && atomicLoad(&tree_node_src[index].mass) >= 0) {\n            index += inc;\n        } else {\n            if (j == 0) {\n                j = 8;\n                for (var i = 0u; i < 8u; i++) {\n                    let ch = u32(atomicLoad(&tree_child_src[index * 8u + i]));\n                    schild[i] = ch;\n                    smass[i] = atomicLoad(&tree_node_src[ch].mass);\n                    if (ch < node_count || smass[i] >= 0) {\n                        j--;\n                    }\n                }\n            } else {\n                j = 8;\n                for (var i = 0u; i < 8u; i++) {\n                    let ch = schild[i];\n                    let old_mass = smass[i];\n                    smass[i] = atomicLoad(&tree_node_src[ch].mass);\n                    if (ch < node_count || old_mass >= 0 || smass[i] >= 0) {\n                        j--;\n                    }\n                }\n            }\n\n            if (j == 0) {\n                cm = 0;\n                var pos = vec3<f32>(0.0);\n                var cnt = 0;\n                for (var i = 0u; i < 8u; i++) {\n                    let ch = schild[i];\n                    if (ch >= node_count) {\n                        let m = smass[i];\n                        cnt += tree_node_src[ch].count;\n                        pos += tree_node_src[ch].position * f32(m);\n                        cm += m;\n                    } else {\n                        let m = i32(atomicLoad(&node_src[ch].mass));\n                        cnt += 1;\n                        pos += node_src[ch].position * f32(m);\n                        cm += m;\n                    }\n                }\n                tree_node_src[index].count = cnt;\n                tree_node_src[index].position = pos / f32(cm);\n                flag = true;\n            }\n        }\n        // workgroupBarrier();\n        if (flag) {\n            if (index < node_count) {\n                atomicStore(&node_src[index].mass, u32(cm));\n            } else {\n                atomicStore(&tree_node_src[index].mass, cm);\n            }\n            index += inc;\n            flag = false;\n        }\n    }\n}\n\n// 11\n@compute\n@workgroup_size(256)\nfn sort(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let tree_node_count = uniforms.tree_node_count - 1u;\n    let bottom = atomicLoad(&bhTree.bottom);\n    let node_count = uniforms.node_count;\n    let inc = min(node_count, 16384u);\n    var index = tree_node_count + 1u - inc + global_invocation_id.x;\n\n    var loop_limit_count = 1000;\n\n    while (index >= bottom) {\n\n        if (loop_limit_count < 0) {\n            kernel_status[3] = -101;\n            break;\n        }\n        loop_limit_count--;\n\n        workgroupBarrier();\n        var start = atomicLoad(&tree_node_src[index].start);\n\n        if (start >= 0) {\n            var j = 0u;\n            for (var i = 0u; i < 8u; i++) {\n                let ch = atomicLoad(&tree_child_src[index * 8u + i]);\n                if (ch >= 0) {\n                    // 把子节点集中到开头\n                    if (i != j) {\n                        atomicStore(&tree_child_src[index * 8u + i], -1);\n                        atomicStore(&tree_child_src[index * 8u + j], ch);\n                    }\n                    j++;\n                    if (ch >= i32(node_count)) {\n                        atomicStore(&tree_node_src[ch].start, start);\n                        start += tree_node_src[ch].count;\n                    } else {\n                        tree_node_src[start].sort = ch;\n                        start++;\n                    }\n                }\n            }\n            if (index < inc) {\n                break;\n            }\n            index -= inc;\n        }\n//            if (index < inc) {\n//                break;\n//            }\n//            index -= inc;\n    }\n}\n\n// 12\n@compute\n@workgroup_size(256)\nfn electron_force(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let tree_node_count = uniforms.tree_node_count - 1u;\n    let node_count = uniforms.node_count;\n    let inc = min(node_count, 16384u);\n\n    // TODO: Global Param\n    let scale = 0.0003;\n\n    var spos: array<u32, 48>;\n    var snode: array<u32, 48>;\n    var sdq: array<f32, 48>;\n\n    let itolsq = 1.0;\n    let epssq = 0.05 * 0.05;\n    let diameter = bhTree.radius * 2.0;\n    let max_depth = atomicLoad(&bhTree.max_depth);\n    sdq[0] = diameter * diameter * itolsq;\n    for (var j = 1u; j < max_depth; j++) {\n        sdq[j] = sdq[j - 1u] * 0.25;\n        sdq[j - 1u] += epssq;\n    }\n    sdq[max_depth - 1u] += epssq;\n\n    var loop_limit_count = 5000 * i32(node_count / inc);\n\n    if (max_depth < 48u) {\n        for (var index = global_invocation_id.x; index < node_count; index += inc) {\n            var order = tree_node_src[index].sort;\n            if (order < 0) { continue; }\n\n            let pos = node_src[order].position;\n            var af = vec3<f32>(0.0);\n\n            var depth = 0u;\n            spos[0] = 0u;\n            snode[0] = tree_node_count;\n\n            loop {\n\n                if (loop_limit_count < 0) {\n                    kernel_status[4] = 101;\n                    break;\n                }\n                loop_limit_count--;\n\n                var pd = spos[depth];\n                var nd = snode[depth];\n                while (pd < 8u) {\n\n                    if (loop_limit_count < 0) {\n                        kernel_status[4] = 101;\n                        break;\n                    }\n                    loop_limit_count--;\n\n                    let n_i32 = atomicLoad(&tree_child_src[nd * 8u + pd]);\n                    pd++;\n\n                    if (n_i32 >= 0) {\n                        let n = u32(n_i32);\n                        var dp: vec3<f32>;\n                        if (n < node_count) {\n                            dp = pos - node_src[n].position;\n                        } else {\n                            dp = pos - tree_node_src[n].position;\n                        }\n                        let dist2 = dot(dp, dp);\n\n                        if (n < node_count) {\n                            if (dist2 > 0.0) {\n                                let factor = scale * f32(atomicLoad(&node_src[order].mass)) * f32(atomicLoad(&node_src[n].mass)) / dist2;\n                                af += dp * factor;\n                            }\n                        } else if (dist2 >= sdq[depth]) {\n                            if (dist2 > 0.0) {\n                                let factor = scale * f32(atomicLoad(&node_src[order].mass)) * f32(atomicLoad(&tree_node_src[n].mass)) / dist2;\n                                af += dp * factor;\n                            }\n                        } else {\n                            spos[depth] = pd;\n                            snode[depth] = nd;\n                            depth++;\n                            pd = 0u;\n                            nd = n;\n                        }\n                    } else {\n                        pd = 8u;\n                    }\n                }\n                if (depth == 0u) {\n                    break;\n                }\n                depth--;\n            }\n            node_src[order].force += af * 0.25;\n        }\n    }\n}\n\n// 13\n@compute\n@workgroup_size(256)\nfn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    let vPos: vec3<f32> = node_src[index].position;\n    let mass = f32(atomicLoad(&node_src[index].mass));\n\n    // TODO: Global Param\n    let scaling_ratio = 0.0002;\n\n    var spring_force = spring_force_src[index];\n    spring_force_src[index] = vec3<f32>(0.0);\n    spring_force *= 100.0;\n\n    node_src[index].force += spring_force;\n}\n\n// 14\n@compute\n@workgroup_size(256)\nfn displacement(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    // TODO: Global Param\n    let global_speed = 1.0;\n\n    let d_force = node_src[index].force - node_src[index].prev_force;\n    let swg = sqrt(dot(d_force, d_force));\n    let factor = global_speed / (1.0 + sqrt(global_speed * swg)) / f32(node_src[index].mass);\n\n    let force = node_src[index].force;\n    node_src[index].force = vec3<f32>(0.0);\n    node_src[index].prev_force = force;\n\n//    if (index == 0u) {\n//        return;\n//    }\n\n    node_src[index].position += force * factor * 0.01;\n}\n\n// 15\n@compute\n@workgroup_size(256)\nfn randomize(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    var vPos : vec3<f32> = node_src[index].position;\n\n    vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0;\n    vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0;\n    vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0;\n\n    // Write back\n    node_src[index].position = vPos;\n    node_src[index].force = vec3<f32>(0.0);\n    node_src[index].prev_force = vec3<f32>(0.0);\n}\n\n// 16\n@compute\n@workgroup_size(256)\nfn copy(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    var vPos : vec3<f32> = node_src[index].position;\n\n    node_copy_src[3u * index     ] = vPos.x;\n    node_copy_src[3u * index + 1u] = vPos.y;\n    node_copy_src[3u * index + 2u] = vPos.z;\n}\n\n// 17\n@compute\n@workgroup_size(256)\nfn cal_depth(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n\n    let total = uniforms.node_count;\n    let index = global_invocation_id.x;\n    if (index >= total) {\n        return;\n    }\n\n    var vPos : vec3<f32> = node_src[index].position;\n\n    var clip_pos = transform.projection * transform.view * vec4<f32>(vPos, 1.0);\n\n    kvps[index].index = index;\n    kvps[index].sort_key = clip_pos.z;\n\n}\n\n// 18\n@compute\n@workgroup_size(256)\nfn sort_by_depth(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {\n    let i = global_invocation_id.x;\n    var j = i ^ kvps_param.block_count;\n\n    if (kvps_param.block_count == kvps_param.dim >> 1u) {\n        j = i ^ (kvps_param.block_count * 2u - 1u);\n    }\n    \n    let total = uniforms.node_count;\n    if (j < i || i >= total || j >= total) {\n        return;\n    }\n\n\n    let index_i= kvps[i].index;\n    let index_j = kvps[j].index;\n    let key_i = kvps[index_i].sort_key;\n    let key_j = kvps[index_j].sort_key;\n    \n    var diff = key_j - key_i;\n\n    if (diff > 0.0) {\n        kvps[i].index = index_j;\n        kvps[j].index = index_i;\n    }\n}"
  },
  {
    "path": "src/assets/shaders/S_axis.wgsl",
    "content": "struct Input {\n    @builtin(vertex_index) vertex_index: u32,\n    @builtin(instance_index) instance_index: u32,\n}\n\nstruct Varing {\n    @builtin(position) position: vec4<f32>,\n    @location(0) tex_coords: vec2<f32>,\n    @location(1) color: vec3<f32>,\n};\n\nstruct Transform {\n    view: mat4x4<f32>,\n    projection: mat4x4<f32>,\n    time: vec4<f32>,\n    screen: vec4<f32>,\n    camera: vec4<f32>,\n}\n\n@group(0) @binding(0) var<uniform> transform: Transform;\n\n@vertex\nfn main_vs(\n    @location(0) quad_pos: vec2<f32>,\n    i: Input\n) -> Varing {\n\n    var v: Varing;\n\n    var has_x = f32(i.instance_index);\n    var has_z = 1.0 - f32(i.instance_index);\n\n    var length = quad_pos.x * 10000000.0;\n\n    v.position = vec4<f32>(vec3<f32>(length * has_x, 0.0, length * has_z), 1.0);\n    v.position = transform.projection * transform.view * v.position;\n\n    var dir = transform.projection * transform.view * vec4<f32>(0.01 * has_x, 0.0, 0.01 * has_z, 1.0);\n    var center = transform.projection * transform.view * vec4<f32>(0.0, 0.0, 0.0, 1.0);\n\n    var cast_position = center + (dir - center) / (dir.z - center.z) * (transform.camera.z * 0.001 - center.z);\n\n    if v.position.w < transform.camera.z {\n        v.position = cast_position;\n    }\n\n    var ratio = transform.camera.x;\n    var dir_normal = normalize(vec2<f32>(dir.y / ratio / ratio, -dir.x));\n\n    v.position = v.position / abs(v.position.w);\n    v.position += vec4<f32>(dir_normal * quad_pos.y * (1.5 / transform.screen.y), 0.0, 0.0);\n\n    v.tex_coords = quad_pos;\n\n    // Yellow / Blue\n    var colors = array<vec3<f32>, 2>(vec3<f32>(.98, .47, .08), vec3<f32>(.272, .866, .855));\n    v.color = colors[i.instance_index];\n\n    return v;\n}\n\n@fragment\nfn main_fs(v: Varing) -> @location(0) vec4<f32> {\n\n    var color = v.color;\n    var x = v.position.z * 0.5 + 0.5;\n    var lerp = (1.0 - pow(x, 10000.0)) * 1.2;\n    color *= lerp;\n\n    let alpha = 1.0;\n\n    return vec4<f32>(color, alpha);\n}\n"
  },
  {
    "path": "src/assets/shaders/S_bounding_box.wgsl",
    "content": "struct Input {\n    @builtin(vertex_index) vertex_index: u32,\n    @builtin(instance_index) instance_index: u32,\n}\n\nstruct Varing {\n    @builtin(position) position: vec4<f32>,\n};\n\nstruct Transform {\n    view: mat4x4<f32>,\n    projection: mat4x4<f32>,\n    time: vec4<f32>,\n    screen: vec4<f32>,\n    camera: vec4<f32>,\n}\n\nstruct Bound {\n    bound_min: vec3<f32>,\n    bound_max: vec3<f32>,\n}\n\n@group(0) @binding(0) var<uniform> transform: Transform;\n\n@group(1) @binding(0) var<storage, read> boundSrc : array<Bound>;\n\n@vertex\nfn main_vs(\n    @location(0) bound_pos: vec3<f32>,\n    i: Input\n) -> Varing {\n    var bound = boundSrc[0];\n\n    var bound_center = (bound.bound_min + bound.bound_max) / 2.0;\n    var bound_radius = (bound.bound_max - bound.bound_min) / 2.0;\n\n    var v: Varing;\n    v.position = vec4<f32>(bound_center + bound_pos * bound_radius, 1.0);\n    v.position = transform.projection * transform.view * v.position;\n\n    return v;\n}\n\n@fragment\nfn main_fs(v: Varing) -> @location(0) vec4<f32> {\n\n    var out_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);\n\n    return out_color;\n}\n"
  },
  {
    "path": "src/assets/shaders/S_edge.wgsl",
    "content": "\n\nstruct Input {\n    @builtin(vertex_index) vertex_index: u32,\n    @builtin(instance_index) instance_index: u32,\n}\n\nstruct Varing {\n    @location(0) tex_coords: vec2<f32>,\n    @builtin(position) position: vec4<f32>,\n};\n\nstruct Node {\n    position: vec3<f32>,\n    force: vec3<f32>,\n    prev_force: vec3<f32>,\n    mass: u32,\n};\n\nstruct Transform {\n    view: mat4x4<f32>,\n    projection: mat4x4<f32>,\n    time: vec4<f32>,\n    screen: vec4<f32>,\n    camera: vec4<f32>,\n}\n\n@group(0) @binding(0) var<uniform> transform: Transform;\n\n@group(1) @binding(0) var<storage, read> node_src : array<Node>;\n@group(1) @binding(1) var<storage, read> edge_src : array<vec2<u32>>;\n\nfn vs_transform(\n    node_pos_a: vec3<f32>,\n    node_pos_b: vec3<f32>,\n    node_pos: vec3<f32>,\n    quad_pos: vec2<f32>\n) -> vec4<f32> {\n    let node_a = transform.projection * transform.view * vec4<f32>(node_pos_a, 1.0);\n    let node_b = transform.projection * transform.view * vec4<f32>(node_pos_b, 1.0);\n    var dir = node_a / node_a.w - node_b / node_b.w;\n    dir.y = dir.y / transform.camera.x;\n    let quad_dir = normalize(vec2<f32>(dir.y, -dir.x));\n\n    var position = vec4<f32>(node_pos, 1.0);\n    position = transform.view * position;\n    position += vec4<f32>(quad_pos.y * quad_dir * 0.01 * 0.03, 0.0, 0.0);\n    position = transform.projection * position;\n\n    var quad_pos_ratio = quad_pos.y * quad_dir;\n    quad_pos_ratio.x /= transform.camera.x;\n    position += vec4<f32>(quad_pos_ratio * (0.5 / transform.screen.y) * position.w, 0.0, 0.0);\n    return position;\n}\n\n@vertex\nfn main_vs(\n    @location(0) quad_pos: vec2<f32>,\n    i: Input\n) -> Varing {\n    let edge = edge_src[i.instance_index];\n\n    var v: Varing;\n\n    v.position = vs_transform(\n        node_src[edge[0]].position,\n        node_src[edge[1]].position,\n        node_src[edge[i.vertex_index % 2u]].position,\n        quad_pos\n    );\n\n    v.tex_coords = vec2<f32>(0.0);\n\n    return v;\n}\n\n@fragment\nfn main_fs(v: Varing) -> @location(0) vec4<f32> {\n\n    let out_color = vec4<f32>(1.0, 1.0, 1.0, 0.02);\n\n    return out_color;\n}\n\n\n\nstruct CastVaring {\n    @builtin(position) position: vec4<f32>,\n    @location(0) id: u32,\n    @location(1) nodes: vec2<u32>,\n};\n\n@vertex\nfn cast_vs(\n    @location(0) quad_pos: vec2<f32>,\n    i: Input\n) -> CastVaring {\n    let edge = edge_src[i.instance_index];\n\n    var v: CastVaring;\n\n    v.position = vs_transform(\n        node_src[edge[0]].position,\n        node_src[edge[1]].position,\n        node_src[edge[i.vertex_index % 2u]].position,\n        quad_pos\n    );\n\n    v.position /= abs(v.position.w);\n    v.position.x = (v.position.x + 1.0) / 2.0 * transform.screen.x - transform.screen.z;\n    v.position.y = (-v.position.y + 1.0) / 2.0 * transform.screen.y - transform.screen.w;\n\n    v.id = i.instance_index;\n    v.nodes = edge;\n\n    return v;\n}\n\n@fragment\nfn cast_fs(v: CastVaring) -> @location(0) vec4<u32> {\n\n    var out_color = vec4<u32>(2u, v.id, v.nodes);\n\n    return out_color;\n}"
  },
  {
    "path": "src/assets/shaders/S_node.wgsl",
    "content": "struct Input {\n    @builtin(vertex_index) vertex_index: u32,\n    @builtin(instance_index) instance_index: u32,\n}\n\nstruct Varing {\n    @location(0) tex_coords: vec2<f32>,\n    @builtin(position) position: vec4<f32>,\n    @location(1) color: vec3<f32>,\n};\n\nstruct Node {\n    position: vec3<f32>,\n    force: vec3<f32>,\n    prev_force: vec3<f32>,\n    mass: u32,\n};\n\nstruct Transform {\n    view: mat4x4<f32>,\n    projection: mat4x4<f32>,\n    time: vec4<f32>,\n    screen: vec4<f32>,\n    camera: vec4<f32>,\n}\n\nstruct Kvp {\n    sort_key: f32,\n    index: u32,\n}\n\n@group(0) @binding(0) var<uniform> transform: Transform;\n\n@group(1) @binding(0) var<storage, read> node_src : array<Node>;\n@group(1) @binding(1) var<storage, read> kvps: array<Kvp>;\n\nfn vs_transform(\n    node_position: vec3<f32>,\n    quad_pos: vec2<f32>\n) -> vec4<f32> {\n    var position = vec4<f32>(node_position, 1.0);\n\n    position = transform.view * position;\n    position += vec4<f32>(quad_pos * 0.0025, 0.0, 0.0);\n\n    position = transform.projection * position;\n    var quad_pos_ratio = quad_pos;\n    quad_pos_ratio.x /= transform.camera.x;\n    position += vec4<f32>(quad_pos_ratio * (1.5 / transform.screen.y) * position.w, 0.0, 0.0);\n    return position;\n}\n\n@vertex\nfn main_vs(\n    @location(0) quad_pos: vec2<f32>,\n    i: Input\n) -> Varing {\n    var node = node_src[kvps[i.instance_index].index];\n    var kvp = kvps[i.instance_index];\n\n    var v: Varing;\n    v.position = vs_transform(node.position, quad_pos);\n    v.tex_coords = quad_pos;\n    v.color = mix(vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(1.0, 0.0, 0.0), f32(i.instance_index) / f32(arrayLength(&node_src)));\n    if (kvp.index == 0u) { v.color = vec3<f32>(1.0); }\n\n    return v;\n}\n\n@fragment\nfn main_fs(v: Varing) -> @location(0) vec4<f32> {\n\n    let sdf = dot(v.tex_coords, v.tex_coords);\n    let clip = step(sdf, 1.0);\n\n    var out_color = vec4<f32>(v.color, 1.0);\n\n    if clip < 0.5 {\n        discard;\n    }\n\n    return out_color;\n}\n\n\n\n\nstruct CastVaring {\n    @location(0) tex_coords: vec2<f32>,\n    @builtin(position) position: vec4<f32>,\n    @location(1) id: u32,\n};\n\n@vertex\nfn cast_vs(\n    @location(0) quad_pos: vec2<f32>,\n    i: Input\n) -> CastVaring {\n    var node = node_src[kvps[i.instance_index].index];\n    var kvp = kvps[i.instance_index];\n\n    var v: CastVaring;\n    v.position = vs_transform(node.position, quad_pos);\n    v.position /= v.position.w;\n    v.position.x = (v.position.x + 1.0) / 2.0 * transform.screen.x - transform.screen.z;\n    v.position.y = (-v.position.y + 1.0) / 2.0 * transform.screen.y - transform.screen.w;\n\n    v.tex_coords = quad_pos;\n    v.id = kvp.index;\n\n    return v;\n}\n\n@fragment\nfn cast_fs(v: CastVaring) -> @location(0) vec4<u32> {\n\n    let sdf = dot(v.tex_coords, v.tex_coords);\n    let clip = step(sdf, 1.0);\n\n    var out_color = vec4<u32>(1u, v.id, 0u, 0u);\n\n    if clip < 0.5 {\n        discard;\n    }\n\n    return out_color;\n}\n\n"
  },
  {
    "path": "src/bootstrap.rs",
    "content": "use eframe::AppCreator;\n\nuse crate::{MainApp, APP_VERSION, utils::file::get_resource_path};\n\npub struct Config {\n    native_options: eframe::NativeOptions,\n    app_creator: AppCreator,\n    app_name: String,\n}\n\npub struct ConfigBuilder {\n    native_options: eframe::NativeOptions,\n    app_creator: AppCreator,\n    app_name: String,\n}\n\nimpl Default for ConfigBuilder {\n    fn default() -> Self {\n        let native_options = eframe::NativeOptions {\n            initial_window_size: Some(egui::Vec2::new(1200.0, 720.0)),\n            min_window_size: Some(egui::Vec2::new(960.0, 640.0)),\n            drag_and_drop_support: true,\n            renderer: eframe::Renderer::Wgpu,\n            follow_system_theme: false,\n            default_theme: eframe::Theme::Dark,\n            icon_data: Some(load_icon(\"app_bar_icon.ico\")),\n            // #[cfg(target_os = \"macos\")]\n            // fullsize_content: true,\n            ..Default::default()\n        };\n\n        Self {\n            native_options,\n            app_creator: Box::new(|cc| Box::new(MainApp::new(cc))),\n            app_name: format!(\"GraphPU - Dev Demo - {}\", APP_VERSION),\n        }\n    }\n}\n\nimpl ConfigBuilder {\n    pub fn native_options(mut self, native_options: eframe::NativeOptions) -> Self {\n        self.native_options = native_options;\n        self\n    }\n\n    pub fn app_creator(mut self, app_creator: AppCreator) -> Self {\n        self.app_creator = app_creator;\n        self\n    }\n\n    pub fn app_name(mut self, app_name: String) -> Self {\n        self.app_name = app_name;\n        self\n    }\n\n    pub fn build(self) -> Config {\n        Config {\n            native_options: self.native_options,\n            app_creator: self.app_creator,\n            app_name: self.app_name,\n        }\n    }\n}\n\nfn load_icon(path: &str) -> eframe::IconData {\n    let path = get_resource_path(path);\n    let (icon_rgba, icon_width, icon_height) = {\n        let image = image::open(path).expect(\"Failed to open icon path\").into_rgba8();\n        let (width, height) = image.dimensions();\n        let rgba = image.into_raw();\n        (rgba, width, height)\n    };\n\n    eframe::IconData {\n        rgba: icon_rgba,\n        width: icon_width,\n        height: icon_height,\n    }\n}\n\npub fn start_frame(config: Config) {\n    eframe::run_native(\n        &config.app_name,\n        config.native_options,\n        config.app_creator,\n    );\n}\n"
  },
  {
    "path": "src/components/detail_view.rs",
    "content": "use chrono::Utc;\nuse egui::{Sense, Ui};\nuse crate::constant::FONT_SIZE_BODY;\nuse crate::models::app_model::DockStage;\n\nuse crate::models::Models;\nuse crate::utils::message::messenger;\n\nuse super::AppView;\n\n#[derive(Default)]\npub struct DetailView;\n\nimpl AppView for DetailView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n        egui::TopBottomPanel::bottom(\"detail\")\n            .show_inside(ui, |ui| {\n\n            ui.horizontal(|ui| {\n                ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n                    ui.label(\n                        egui::RichText::new(\n                            format!(\n                                \"Nodes: {}  |  Edges: {}\",\n                                models.data_model.status.node_count,\n                                models.data_model.status.edge_count\n                            )\n                        ).weak()\n                    );\n\n                    ui.add_space(30.0);\n\n                    ui.allocate_ui_with_layout(\n                        ui.available_size(),\n                        egui::Layout::left_to_right(egui::Align::Center),\n                        |ui| {\n                            show_message(models, ui, _frame, -1);\n                        },\n                    );\n\n                });\n\n            });\n        });\n    }\n}\n\npub fn show_message(models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame, max_time: i32) {\n    let messages = messenger();\n    if messages.len() > 0 {\n        let message = &messages[messages.len() - 1];\n        if max_time > 0 && Utc::now().timestamp() - message.time > max_time.into() { return; };\n        let message = message.to_string();\n\n        let (rect, response) = if max_time > 0 {\n\n            let rect = ui.available_rect_before_wrap();\n            (rect, None)\n        } else {\n\n            let (rect, response) = ui.allocate_exact_size(ui.available_size(), Sense::click());\n            (rect, Some(response))\n        };\n\n        ui.allocate_ui_at_rect(rect, |ui| {\n            ui.vertical(|ui| {\n                ui.add_space(3.0);\n\n                let mut job = egui::text::LayoutJob::single_section(message.to_owned(), egui::TextFormat {\n                    font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()),\n                    color: egui::Color32::from_gray(120),\n                    ..Default::default()\n                });\n                job.wrap = egui::epaint::text::TextWrapping {\n                    max_rows: 1,\n                    break_anywhere: true,\n                    overflow_character: Some('…'),\n                    ..Default::default()\n                };\n                ui.label(job);\n            });\n            // ui.label(egui::RichText::new(format!(\"{}\", messages[0])).weak())\n        });\n\n        if let Some(response) = response {\n            response.clicked().then(||{ models.app_model.dock_stage = DockStage::Messages });\n        }\n\n    }\n}"
  },
  {
    "path": "src/components/dock_view.rs",
    "content": "use std::borrow::BorrowMut;\nuse egui::{Ui, Vec2};\nuse crate::constant::FONT_SIZE_BODY;\nuse crate::models::app_model::DockStage;\n\nuse crate::models::Models;\nuse crate::utils::message::messenger;\nuse crate::widgets::frames::dock_frame;\n\nuse super::AppView;\n\n#[derive(Default)]\npub struct DockView;\n\nimpl AppView for DockView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n        egui::TopBottomPanel::bottom(\"dock\")\n            .frame(dock_frame(ui.style()))\n            .default_height(0.0)\n            .show_inside(ui, |ui| {\n                ui.with_layout(egui::Layout::from_main_dir_and_cross_align(egui::Direction::LeftToRight, egui::Align::Center), |ui| {\n\n                    ui.set_style(models.app_model.dock_style.clone());\n                    ui.spacing_mut().item_spacing = Vec2::ZERO;\n                    ui.style_mut().text_styles.get_mut(&egui::TextStyle::Button).unwrap().size = FONT_SIZE_BODY;\n\n                    dock_button(ui, models, DockStage::Messages, format!(\"🕫 Messages({})\", messenger().len()));\n                    dock_button(ui, models, DockStage::Timeline, \"🕙 Timeline\");\n                    dock_button(ui, models, DockStage::Kernel, \"✱ Kernels\");\n\n\n                    ui.allocate_ui_with_layout(\n                        ui.available_size(),\n                        egui::Layout::right_to_left(egui::Align::Center),\n                        |ui| {\n\n                            toggle_button(ui, &mut models.graphics_model.graphics_resources.render_options.is_showing_debug, \"ℹ State\");\n\n\n                        },\n                    );\n\n            });\n        });\n    }\n}\n\nfn dock_button(ui: &mut egui::Ui, models: &mut Models, current: DockStage, text: impl Into<egui::WidgetText>) {\n    let checked = models.app_model.dock_stage == current;\n    if ui.selectable_label(checked, text).clicked() {\n        if checked {\n            models.app_model.dock_stage = DockStage::None;\n        } else {\n            models.app_model.dock_stage = current;\n        }\n    }\n}\n\nfn toggle_button(ui: &mut egui::Ui, selected: &mut bool, text: impl Into<egui::WidgetText>) -> egui::Response {\n\n    ui.toggle_value(selected.borrow_mut(), text)\n}"
  },
  {
    "path": "src/components/drawer_view.rs",
    "content": "use egui::{Response, Ui, Vec2};\nuse crate::components::drawers::{KernelView, MessageView};\nuse crate::constant::FONT_SIZE_TITLE;\nuse crate::models::app_model::DockStage;\n\nuse crate::models::Models;\nuse crate::widgets::frames::{drawer_frame, drawer_title_frame};\n\nuse super::AppView;\n\n#[derive(Default)]\npub struct DrawerView {\n    kernel_view: KernelView,\n}\n\nimpl AppView for DrawerView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, frame: &mut eframe::Frame) {\n        egui::TopBottomPanel::bottom(\"drawer\")\n            .resizable(true)\n            .default_height(220.0)\n            .height_range(100.0..=350.0)\n            .frame(drawer_frame(ui.style()))\n            .show_inside(ui, |ui| {\n\n                drawer_title_frame(ui.style()).show(ui, |ui| {\n\n                    ui.horizontal(|ui| {\n                        ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n\n                            let (egui_id, rect) = ui.allocate_space(Vec2::splat(15.0));\n                            if close_button(ui, egui_id, rect).clicked() {\n                                models.app_model.dock_stage = DockStage::None;\n                            };\n\n\n                            ui.allocate_ui_with_layout(\n                                ui.available_size(),\n                                egui::Layout::left_to_right(egui::Align::Center),\n                                |ui| {\n\n                                    let title = match models.app_model.dock_stage {\n                                        DockStage::None => \"None\",\n                                        DockStage::Messages => \"Messages\",\n                                        DockStage::Timeline => \"Timeline\",\n                                        DockStage::Kernel => \"Kernels\",\n                                    };\n\n                                    ui.style_mut().text_styles.get_mut(&egui::TextStyle::Body).unwrap().size = FONT_SIZE_TITLE;\n                                    ui.label(egui::RichText::new(format!(\"{}\", title)).strong());\n\n                                },\n                            );\n\n                        });\n\n                    });\n\n                });\n\n\n                ui.add( egui::Separator::default().spacing(0.0) );\n\n                match models.app_model.dock_stage {\n                    DockStage::Messages => {\n                        MessageView::default().show(models, ui, frame);\n                    },\n                    DockStage::Kernel => {\n                        self.kernel_view.show(models, ui, frame);\n                    },\n                    _ => {\n                        ui.centered_and_justified(|ui| {\n                            ui.set_min_height(100.0);\n                            ui.label(egui::RichText::new(\"Drawer View\").weak());\n                        });\n                    }\n                }\n\n        });\n    }\n}\n\n\nfn close_button(ui: &mut Ui, id: egui::Id, rect: egui::Rect) -> Response {\n    let response = ui.interact(rect, id, egui::Sense::click());\n    ui.expand_to_include_rect(response.rect);\n\n    let visuals = ui.style().interact(&response);\n    let rect = rect.shrink(2.0).expand(visuals.expansion);\n    let stroke = visuals.fg_stroke;\n    ui.painter() // paints \\\n        .line_segment([rect.left_top(), rect.right_bottom()], stroke);\n    ui.painter() // paints /\n        .line_segment([rect.right_top(), rect.left_bottom()], stroke);\n    response\n}\n"
  },
  {
    "path": "src/components/drawers/kernel_view.rs",
    "content": "\nuse egui::{Color32, Ui};\nuse crate::components::AppView;\nuse crate::constant::FONT_SIZE_BODY;\nuse crate::models::graphics_model::KERNEL_NAMES;\n\nuse crate::models::Models;\nuse crate::widgets::frames::{drawer_kernel_content_frame};\n\n\n#[derive(Default)]\npub struct KernelView {\n    pub selected_kernel: usize,\n}\n\nfn get_kernel_status_desc(code: i32) -> &'static str {\n    match code {\n        -1  => \"Uninitialized\",\n        0   => \"Running\",\n        _   => \"\"\n    }\n}\n\nimpl AppView for KernelView {\n    fn show(&mut self, _models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n        drawer_kernel_content_frame(ui.style()).show(ui, |ui| {\n\n            ui.set_style(ui.ctx().style());\n            ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0);\n\n            ui.horizontal_wrapped(|ui| {\n                if let Some(graph_resources) = &mut _models.graphics_model.graphics_resources.graph_resources {\n\n                    for (index, &name) in KERNEL_NAMES.iter().enumerate() {\n                        kernel_label(ui, &mut self.selected_kernel ,index, name, graph_resources.kernel_status_codes[index]);\n                    }\n                }\n            });\n\n            ui.separator();\n\n            egui::ScrollArea::vertical()\n                // .always_show_scroll(true)\n                .auto_shrink([false; 2])\n                .id_source(\"kernel\")\n                .show(ui, |ui| {\n\n                    let mut code = 0;\n\n                    if let Some(graph_resources) = &mut _models.graphics_model.graphics_resources.graph_resources {\n                        code = graph_resources.kernel_status_codes[self.selected_kernel];\n                    }\n\n                    inspector_grid(\"kernel_grid\")\n                        .show(ui, |ui| {\n                            grid_label(ui, \"Kernel ID\");\n                            grid_content(ui, format!(\"{}\", self.selected_kernel).as_str());\n\n                            ui.end_row();\n\n                            grid_label(ui, \"Kernel name\");\n                            grid_content(ui, KERNEL_NAMES[self.selected_kernel]);\n\n                            ui.end_row();\n\n                            grid_label(ui, \"Kernel status code\");\n                            grid_content(ui, format!(\"{}\", code).as_str());\n\n                            ui.end_row();\n\n                            grid_label(ui, \"Status code description\");\n                            grid_content(ui, get_kernel_status_desc(code));\n                        });\n\n                });\n\n            // ui.centered_and_justified(|ui| {\n            //     ui.set_min_height(100.0);\n            //     ui.label(egui::RichText::new(\"Error 503\"));\n            // });\n\n        });\n    }\n}\n\nfn inspector_grid(id: &str) -> egui::Grid {\n    egui::Grid::new(id)\n        .num_columns(2)\n        .spacing([10.0, 4.0])\n        .min_col_width(65.)\n        .min_row_height(10.)\n}\n\nfn kernel_label(ui: &mut egui::Ui, selected_kernel: &mut usize, kernel_index: usize, kernel_name: &str, kernel_code: i32) {\n\n    let size = egui::Vec2::new(150., 18.);\n    let (rect, _response) = ui.allocate_exact_size(size, egui::Sense::hover());\n    ui.allocate_ui_at_rect(rect, |ui| {\n        ui.set_min_width(150.);\n\n        let mut job = egui::text::LayoutJob::single_section(\"✱ \".parse().unwrap(), egui::TextFormat {\n            font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()),\n            color: match kernel_code {\n                x if x < 0 => Color32::from_rgb(255, 255, 0),\n                0 => Color32::from_rgb(0, 255, 0),\n                x if x > 0 => Color32::from_rgb(255, 0, 0),\n                _ => Color32::from_rgb(255, 0, 0)\n\n            },\n            valign: egui::Align::Center,\n            ..Default::default()\n        });\n        job.append(&*format!(\"[{}] {} \", kernel_index, kernel_name), 0.0, egui::TextFormat {\n            font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()),\n            color: egui::Color32::from_gray(220),\n            valign: egui::Align::Center,\n            ..Default::default()\n        });\n        ui.selectable_value(selected_kernel, kernel_index, job);\n\n    });\n    // ui.painter()\n    //     .circle_filled(rect.center(), r, ui.visuals().text_color());\n\n}\n\nfn grid_label(ui: &mut egui::Ui, title: &str) {\n    let label = format!(\"{}: \", title);\n    ui.set_width(250.);\n    ui.add(\n        egui::Label::new(egui::RichText::new(label))\n    );\n}\n\nfn grid_content(ui: &mut egui::Ui, title: &str) {\n    let label = format!(\"{}\", title);\n    ui.add(\n        egui::Label::new(egui::RichText::new(label)).wrap(true)\n    );\n}"
  },
  {
    "path": "src/components/drawers/message_view.rs",
    "content": "use egui::{Color32, epaint, Ui, Vec2};\nuse crate::components::AppView;\nuse crate::constant::FONT_SIZE_BODY;\n\nuse crate::models::Models;\nuse crate::utils::message::{MessageLevel, messenger};\nuse crate::widgets::frames::{drawer_message_content_frame};\n\n\n#[derive(Default)]\npub struct MessageView;\n\nimpl AppView for MessageView {\n    fn show(&mut self, _models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n        drawer_message_content_frame(ui.style()).show(ui, |ui| {\n\n            let messages = messenger();\n            let row_height = 52.0;\n            let num_rows = messages.len();\n\n\n            ui.spacing_mut().interact_size = Vec2::new(4.0, 4.0);\n\n            egui::ScrollArea::vertical().stick_to_bottom(true).auto_shrink([false; 2]).show_rows(\n                ui,\n                row_height,\n                num_rows,\n                |ui, row_range| {\n                    for row in row_range {\n                        let message = &messages[row];\n                        let title_text = egui::RichText::new(&message.title);\n                        let time_text = egui::RichText::new(message.display_time()).weak();\n                        let content_text = &message.content;\n                        ui.vertical(|ui| {\n\n                            ui.set_height(row_height);\n\n                            if row != 0 {\n                                ui.add( egui::Separator::default().spacing(0.0) );\n                            }\n\n                            ui.with_layout(egui::Layout::from_main_dir_and_cross_align(egui::Direction::LeftToRight, egui::Align::Min), |ui| {\n\n                                message_icon(ui, &message.level);\n\n                                ui.vertical(|ui| {\n\n                                    ui.add_space(5.5);\n\n                                    ui.horizontal(|ui| {\n                                        ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n                                            ui.add_space(6.0);\n                                            ui.label(time_text);\n                                            ui.allocate_ui_with_layout(ui.available_size(), egui::Layout::left_to_right(egui::Align::Center), |ui| {\n                                                ui.label(title_text);\n                                            });\n                                        })\n                                    });\n\n                                    let mut job = egui::text::LayoutJob::single_section(content_text.to_owned(), egui::TextFormat {\n                                        font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()),\n                                        color: egui::Color32::from_gray(120),\n                                        ..Default::default()\n                                    });\n                                    job.wrap = epaint::text::TextWrapping {\n                                        max_rows: 2,\n                                        break_anywhere: false,\n                                        overflow_character: Some('…'),\n                                        ..Default::default()\n                                    };\n                                    ui.label(job);\n                                    // ui.label(content_text);\n                                });\n                            });\n                        });\n                    }\n                },\n            );\n        });\n    }\n}\n\nfn message_icon(ui: &mut egui::Ui, icon_type: &MessageLevel) {\n    let (label, color) = match icon_type {\n        MessageLevel::Info => (\"ℹ\", Color32::GRAY),\n        MessageLevel::Warning => (\"⚠\", Color32::YELLOW),\n        MessageLevel::Error => (\"！\", Color32::RED),\n    };\n    let job = egui::text::LayoutJob::single_section(label.to_owned(), egui::TextFormat {\n        font_id: egui::FontId::new(24.0, Default::default()),\n        color: color,\n        ..Default::default()\n    });\n    ui.vertical(|ui| {\n        ui.set_width(30.);\n        ui.add_space(5.0);\n        ui.add(\n            egui::Label::new(job)\n        )\n    });\n}"
  },
  {
    "path": "src/components/drawers/mod.rs",
    "content": "mod message_view;\nmod kernel_view;\n\npub use {\n    message_view::MessageView,\n    kernel_view::KernelView\n};"
  },
  {
    "path": "src/components/export_modal_view.rs",
    "content": "use std::{fs::File, io::Write};\nuse std::default::Default;\n\nuse egui::{Context, Widget};\nuse rayon::prelude::*;\n\nuse crate::{\n    models::Models,\n    utils::file::{path_to_string, pick_folder},\n    widgets::{\n        frames::{inner_panel_frame, DEFAULT_BUTTON_PADDING},\n        modal::Modal,\n    },\n};\nuse crate::constant::ACCENT_COLOR;\nuse crate::utils::message::message_info;\n\npub struct ExportModal {\n    directory_path: String,\n    file_name: String,\n    is_cast_to_float: bool,\n}\n\nconst DEFAULT_FILE_NAME: &'static str = \"graph\";\n\nimpl Default for ExportModal {\n    fn default() -> Self {\n        Self {\n            directory_path: \"\".to_string(),\n            file_name: \"\".to_string(),\n            is_cast_to_float: false,\n        }\n    }\n}\n\nimpl ExportModal {\n    pub fn show(&mut self, ctx: &Context, models: &mut Models) {\n        Modal::new(String::from(\"export_modal_view\")).show(ctx, |ui| {\n            ui.set_width(400.0);\n            ui.set_height(250.0);\n\n            egui::CentralPanel::default()\n                .frame(inner_panel_frame(ui.style()))\n                .show_inside(ui, |ui| {\n\n                    ui.set_style(ui.ctx().style());\n                    ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0);\n\n                    ui.heading(\"Export Data\");\n\n                    ui.horizontal(|ui| {\n                        ui.selectable_value(&mut 0, 0, \"PCACHE\");\n                        ui.selectable_value(&mut 0, 1, \"CSV\");\n                    });\n\n                    ui.separator();\n\n                    egui::Grid::new(\"my_grid\")\n                        .num_columns(2)\n                        .spacing([20.0, 8.0])\n                        .show(ui, |ui| {\n                            ui.add(egui::Label::new(\"Directory\"));\n                            ui.horizontal(|ui| {\n                                ui.with_layout(\n                                    egui::Layout::right_to_left(egui::Align::Center),\n                                    |ui| {\n                                        ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n\n                                        if ui.button(\"•••\").clicked() {\n                                            self.directory_path = path_to_string(&pick_folder())\n                                                .unwrap_or(self.directory_path.clone());\n                                        }\n\n                                        ui.vertical_centered_justified(|ui| {\n                                            ui.add(\n                                                egui::TextEdit::singleline(\n                                                    &mut self.directory_path,\n                                                )\n                                                .hint_text(\"\")\n                                                .desired_width(200.),\n                                            );\n                                        });\n                                    },\n                                );\n                            });\n\n                            ui.end_row();\n\n                            ui.add(egui::Label::new(\"File name\"));\n                            ui.horizontal(|ui| {\n\n                                let text = ui.add(\n                                    egui::TextEdit::singleline(\n                                        &mut self.file_name,\n                                    )\n                                        .hint_text(\"graph\")\n                                        .desired_width(150.)\n                                );\n                                let file_name = if self.file_name.len() != 0 { &self.file_name } else { DEFAULT_FILE_NAME };\n                                text.on_hover_text(egui::RichText::new(format!(\"{0}_node.pcache \\n{0}_edge.pcache\", file_name)).weak());\n                            });\n\n                            ui.end_row();\n\n                            ui.add(egui::Label::new(\"\"));\n                            ui.checkbox(&mut self.is_cast_to_float, \"Cast uint to float\")\n                                .on_hover_text(\"For Unity VFX Graph\");\n\n\n                        })\n                });\n\n            egui::TopBottomPanel::bottom(\"v\")\n                .frame(inner_panel_frame(ui.style()))\n                .show_inside(ui, |ui| {\n                    ui.set_style(ui.ctx().style());\n                    ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0);\n                    ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n                        ui.add_enabled_ui(self.directory_path.len() != 0, |ui| {\n                            if egui::Button::new(\"   Done   \").fill(ACCENT_COLOR).ui(ui).clicked() {\n                                self.on_click_done(models).expect(\"TODO: panic message\");\n                                models.app_model.is_export_visible = false;\n                            }\n                        });\n                        if ui.button(\"   Cancel   \").clicked() {\n                            models.app_model.is_export_visible = false;\n                        }\n                    });\n                })\n        });\n    }\n\n    fn on_click_done(&mut self, models: &mut Models) -> std::io::Result<()> {\n        let file_name = if self.file_name.len() != 0 { &self.file_name } else { DEFAULT_FILE_NAME };\n        let path_prefix = self.directory_path.clone() + \"/\" + file_name;\n        let node_path = path_prefix.clone() + \"_node.pcache\";\n        let edge_path = path_prefix + \"_edge.pcache\";\n\n        let graphics_resource = &mut models.graphics_model.graphics_resources;\n        graphics_resource.debug();\n        if let Some(graph_resources) = &graphics_resource.graph_resources {\n\n            let mut file = File::create(&node_path)?;\n            file.write_all(b\"pcache\\n\")?;\n            file.write_all(b\"comment Node PCACHE file Exported from GraphPU\\n\")?;\n            file.write_all(b\"format binary 1.0\\n\")?;\n            file.write_fmt(format_args!(\"elements {}\\n\", graph_resources.status.node_count))?;\n\n            file.write_fmt(format_args!(\"property {} {}\\n\", \"float\", \"position.x\"))?;\n            file.write_fmt(format_args!(\"property {} {}\\n\", \"float\", \"position.y\"))?;\n            file.write_fmt(format_args!(\"property {} {}\\n\", \"float\", \"position.z\"))?;\n\n            file.write_all(b\"end_header\\n\")?;\n            file.write_all(bytemuck::cast_slice(graph_resources.buffer_bytes.as_ref().unwrap()))?;\n        }\n\n\n        if let Some(source_target_list) = &models.data_model.source_target_list {\n\n            let result: Vec<u8> = if self.is_cast_to_float {\n                let par_iter = source_target_list.par_iter().map(|x| *x as f32);\n                let doubles: Vec<f32> = par_iter.collect();\n                bytemuck::cast_slice(&doubles).to_vec()\n            } else {\n                bytemuck::cast_slice(&source_target_list).to_vec()\n            };\n\n            let mut file = File::create(&edge_path)?;\n            file.write_all(b\"pcache\\n\")?;\n            file.write_all(b\"comment Edge PCACHE file Exported from GraphPU\\n\")?;\n            file.write_all(b\"format binary 1.0\\n\")?;\n            file.write_fmt(format_args!(\"elements {}\\n\", models.data_model.status.edge_count))?;\n\n            let type_string = if self.is_cast_to_float { \"float\" } else { \"uint\" };\n            file.write_fmt(format_args!(\"property {} {}\\n\", type_string, \"source\"))?;\n            file.write_fmt(format_args!(\"property {} {}\\n\", type_string, \"target\"))?;\n\n            file.write_all(b\"end_header\\n\")?;\n            file.write_all(bytemuck::cast_slice(&result))?;\n        }\n\n        let text = format!(\n            \"Node file: {}  \\nEdge file: {}\",\n            node_path,\n            edge_path\n        );\n        message_info(\"Export PCACHE Data Succeeded\", text.as_str());\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "src/components/graphics_view.rs",
    "content": "use std::borrow::BorrowMut;\nuse std::ops::Mul;\nuse egui::{InnerResponse, PointerButton, Response, Ui, Vec2, Widget, WidgetText};\nuse crate::models::app_model::Tool;\nuse crate::models::graphics_model::{CastType, GraphicsResources};\n\nuse crate::models::Models;\nuse crate::widgets::frames::{button_group_style, DEFAULT_BUTTON_PADDING, graphics_frame, graphics_hover_frame, TOOL_BUTTON_PADDING, tool_item_group_style, toolbar_inner_frame, toolbar_inner_frame_bottom, toolbar_inner_frame_top};\n\nuse super::AppView;\n\n#[derive(Default)]\npub struct GraphicsView;\n\nimpl AppView for GraphicsView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n\n        if let Some(graph_resources) = &mut models.graphics_model.graphics_resources.graph_resources {\n\n            if graph_resources.is_kernel_error {\n                models.graphics_model.set_computing(false);\n            }\n        }\n\n        // 获取是否持续计算、下一帧是否 Dispatch\n        let is_computing = models.graphics_model.is_computing;\n        let is_dispatching = models.graphics_model.is_dispatching;\n\n        // 无论当前帧是否 Dispatch，下一帧都停止 Dispatch\n        models.graphics_model.set_dispatching(false);\n    \n        egui::CentralPanel::default()\n            .frame(graphics_frame(ui.style(), true))\n            .show_inside(ui, |ui| {\n\n                let max_rect = ui.max_rect();\n\n                // 新建一个空 Frame，用于存放 Image\n\n                ui.allocate_ui_at_rect(max_rect, |ui| {\n\n                    graphics_frame(ui.style(), models.app_model.is_fullscreen_graphics)\n                        .show(ui, |ui| {\n\n                            // 如果 Compute Model 已经初始化，即数据导入完成，可以开始渲染\n                            // 则获取 Compute Resource\n                            let compute_resources = &mut models.graphics_model.graphics_resources;\n\n                            // let graph_resources = compute_resources.graph_resources.as_mut().unwrap();\n\n                                // if graph_resources.is_kernel_error { }\n\n                                // 如果正在持续计算，则计算一次\n                                if is_computing {\n                                    compute_resources.compute();\n                                }\n\n                                // 如果当前帧需要 Dispatch，则 Dispatch 一次\n                                if is_dispatching {\n                                    compute_resources.randomize();\n                                }\n\n                                // 更新 Viewport，用于处理窗口 resize\n                                // update_viewport 方法会判断传入的 Viewport 大小和之前的是否一致\n                                // 若发生变化，则更新材质视图，注册 egui 材质 ID，并返回 true\n                                // 若无变化，不更新材质视图，返回 false\n                                // 其中，pixels_per_point 代表当前每点像素密度\n\n                                compute_resources.update_viewport(\n                                    max_rect.size().mul(Vec2::from([models.app_model.pixels_per_point; 2]))\n                                );\n\n                                compute_resources.update_control(ui, models.graphics_model.is_hover_graphics_view, models.app_model.pixels_per_point);\n                                if compute_resources.control.pointer_pos.is_some() {\n                                    if ui.input().pointer.button_double_clicked(PointerButton::Primary) {\n                                        if !models.app_model.is_fullscreen_graphics {\n                                            models.app_model.is_fullscreen_graphics = true;\n                                            _frame.set_fullscreen(true);\n                                        } else {\n                                            models.app_model.is_fullscreen_graphics = false;\n                                            if !models.app_model.is_fullscreen {\n                                                _frame.set_fullscreen(false);\n                                            }\n                                        }\n                                    }\n                                }\n\n                                // 若有任何变化，渲染并请求 egui UI 更新\n                                if is_computing || is_dispatching || compute_resources.need_update {\n                                    compute_resources.render();\n                                    compute_resources.need_update = false;\n                                    ui.ctx().request_repaint();\n                                }\n\n                                if models.app_model.current_tool == Tool::Select && compute_resources.control.is_pointer_update {\n                                    compute_resources.render_cast();\n                                    compute_resources.control.is_pointer_update = false;\n                                }\n\n                                // 获取已经注册的 wgpu 材质的 egui 材质 ID\n                                let texture_id = compute_resources.viewport_texture_id;\n\n                                // 通过材质 ID 绘制 Image\n                                // ui.image(texture_id, max_rect.size());\n\n                                ui.allocate_ui_at_rect(max_rect, |ui| {\n                                    let response = egui::Image::new(texture_id, max_rect.size())\n                                        .sense(egui::Sense::click_and_drag()).ui(ui);\n\n                                    models.graphics_model.is_hover_graphics_view = response.hovered();\n                                });\n\n\n\n\n                        });\n                });\n\n                let compute_resources = &mut models.graphics_model.graphics_resources;\n\n                if models.app_model.current_tool == Tool::Select && models.graphics_model.is_hover_graphics_view {\n                    if let Some(cast_type) = &compute_resources.cast_type {\n\n                        let pos = if let Some(pos) = ui.input().pointer.interact_pos() { pos + egui::Vec2::new(0.0, 20.0) } else { egui::Pos2::ZERO };\n                        ui.allocate_ui_at_rect(egui::Rect::from_min_size(pos, egui::Vec2::new(200.0, 200.0)), |ui| {\n                            graphics_hover_frame(ui.style())\n                                .show(ui, |ui| {\n                                    ui.horizontal(|ui| {\n                                        ui.label(\n                                            match cast_type {\n                                                CastType::Node => \"Node \",\n                                                CastType::Edge => \"Edge \"\n                                            }\n                                        );\n                                        ui.label(egui::RichText::new(format!(\"{}\", compute_resources.cast_value)).weak());\n                                    });\n                                });\n                        });\n                    }\n                };\n\n\n                if models.app_model.is_fullscreen_graphics { return; }\n\n                ui.allocate_ui_at_rect(max_rect, |ui| {\n\n                    egui::SidePanel::left(\"toolbar-left-11\")\n                        .frame(toolbar_inner_frame(ui.style()))\n                        .show_separator_line(false)\n                        .width_range(0.0..=0.0)\n                        .resizable(false)\n                        .show_inside(ui, |ui| {\n                            ui.set_style(ui.ctx().style());\n                            ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0);\n                            ui.spacing_mut().button_padding = TOOL_BUTTON_PADDING;\n\n                            tool_item_group_style(ui.style()).show(ui, |ui| {\n                                ui.vertical(|ui| {\n\n                                    ui.spacing_mut().item_spacing = egui::vec2(0.0, 2.0);\n\n                                    tool_item_box(ui, |ui| {\n                                        let button = ui.selectable_label(\n                                            models.app_model.current_tool == Tool::Select,\n                                            egui::RichText::new(\"☉\").size(24.0)\n                                        ).on_hover_text(\"Select\");\n                                        if button.clicked() {\n                                            models.app_model.current_tool = Tool::Select;\n                                        }\n                                    });\n\n                                    tool_item_box(ui, |ui| {\n                                        let button = ui.selectable_label(\n                                            models.app_model.current_tool == Tool::Handle,\n                                            egui::RichText::new(\"🕂\").size(24.0)\n                                        ).on_hover_text(\"Handle\");\n                                        if button.clicked() {\n                                            models.app_model.current_tool = Tool::Handle;\n                                        }\n                                    });\n\n                                    tool_item_box(ui, |ui| {\n                                        let button = ui.selectable_label(\n                                            models.app_model.current_tool == Tool::View,\n                                            egui::RichText::new(\"🎥\").size(24.0)\n                                        ).on_hover_text(\"View\");\n                                        if button.clicked() {\n                                            models.app_model.current_tool = Tool::View;\n                                        }\n                                    });\n\n                                });\n                            });\n\n\n                        });\n\n                    egui::TopBottomPanel::top(\"toolbar-top\")\n                        .frame(toolbar_inner_frame_top(ui.style()))\n                        .show_separator_line(false)\n                        .show_inside(ui, |ui| {\n                            ui.set_style(ui.ctx().style());\n                            ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0);\n                            ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n\n                            ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n                                ui.horizontal(|ui| {\n                                    let graphics_resources = &mut models.graphics_model.graphics_resources;\n\n                                    let fullscreen_btn = ui.button(\"🗖\");\n                                    // let fullscreen = _frame.info().window_info.fullscreen;\n\n                                    fullscreen_btn.clicked().then(|| {\n                                        models.app_model.is_fullscreen_graphics = true;\n                                        _frame.set_fullscreen(true);\n                                    });\n\n\n                                    toggle_button(ui, &mut graphics_resources.render_options.is_rendering_bounding_box, \"⛶\")\n                                        .on_hover_text(\"Toggle Bounding Box\")\n                                        .clicked().then(|| { need_update(ui, graphics_resources) });\n\n                                    toggle_button(ui, &mut graphics_resources.render_options.is_rendering_axis, \"×\")\n                                        .on_hover_text(\"Toggle Axes\")\n                                        .clicked().then(|| { need_update(ui, graphics_resources) });\n\n                                    toggle_button(ui, &mut graphics_resources.render_options.is_rendering_edge, \"➖\")\n                                        .on_hover_text(\"Toggle Edges\")\n                                        .clicked().then(|| { need_update(ui, graphics_resources) });\n\n                                    toggle_button(ui, &mut graphics_resources.render_options.is_rendering_node, \"⚫\")\n                                        .on_hover_text(\"Toggle Nodes\")\n                                        .clicked().then(|| { need_update(ui, graphics_resources) });\n\n\n                                });\n                            });\n\n                        });\n\n                    let graphics_resources = &mut models.graphics_model.graphics_resources;\n                    if !graphics_resources.render_options.is_showing_debug {\n                        ui.set_visible(false);\n                    }\n\n                    egui::TopBottomPanel::bottom(\"toolbar-top-2\")\n                        .frame(toolbar_inner_frame_bottom(ui.style()))\n                        .show_separator_line(false)\n                        .show_inside(ui, |ui| {\n                            ui.set_style(ui.ctx().style());\n                            ui.spacing_mut().item_spacing = egui::vec2(4.0, 0.0);\n                            ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n                            ui.spacing_mut().interact_size = Vec2::new(4.0, 4.0);\n\n                            ui.with_layout(egui::Layout::from_main_dir_and_cross_align(egui::Direction::TopDown, egui::Align::Max), |ui| {\n\n                                ui.horizontal(|ui| {\n                                    ui.label(format!(\"{:.1}\", graphics_resources.frames_per_second));\n                                    ui.label(egui::RichText::new(\"FPS: \").weak());\n                                });\n\n                                ui.horizontal(|ui| {\n                                    ui.label(format!(\"{:06}\", graphics_resources.compute_frame_count));\n                                    ui.label(egui::RichText::new(\"Compute frames: \").weak());\n                                });\n\n                                ui.horizontal(|ui| {\n                                    ui.label(format!(\"{:06}\", graphics_resources.render_frame_count));\n                                    ui.label(egui::RichText::new(\"Render frames: \").weak());\n                                });\n\n                                ui.horizontal(|ui| {\n                                    ui.label(format!(\"{:06}\", models.app_model.ui_frame_count));\n                                    ui.label(egui::RichText::new(\"UI frames: \").weak());\n                                });\n\n                            });\n\n                        });\n\n\n\n\n                });\n\n\n            });\n\n\n\n\n    }\n}\n\n\nfn toggle_button(ui: &mut egui::Ui, selected: &mut bool, text: impl Into<WidgetText>) -> Response {\n    button_group_style(ui.style()).show(ui, |ui| {\n        ui.toggle_value(selected.borrow_mut(), text)\n            // .clicked().then(||{ graphics_resources.need_update = true; ui.ctx().request_repaint(); });\n    }).inner\n}\n\nfn need_update(ui: &mut egui::Ui, graphics_resources: &mut GraphicsResources) {\n    graphics_resources.need_update = true;\n    ui.ctx().request_repaint()\n}\n\nfn tool_item_box<R>(\n    ui: &mut egui::Ui,\n    add_contents: impl FnOnce(&mut Ui) -> R,\n) -> InnerResponse<R> {\n\n    ui.allocate_ui(Vec2::splat(40.0), |ui| {\n        button_group_style(ui.style()).show(ui, |ui| {\n            ui.centered_and_justified(|ui| {\n                add_contents(ui)\n            }).inner\n        }).inner\n    })\n\n}"
  },
  {
    "path": "src/components/import_modal_view/config_page.rs",
    "content": "use egui::Ui;\n\nuse crate::models::Models;\n\nuse super::ImportModal;\n\npub fn show(parent: &mut ImportModal, models: &mut Models, ui: &mut Ui) {\n\n    ui.set_style(ui.ctx().style());\n    ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0);\n\n    ui.heading(\"Configuration\");\n\n    ui.separator();\n\n    egui::Grid::new(\"my_grid\")\n        .num_columns(2)\n        .spacing([20.0, 8.0])\n        .show(ui, |ui| {\n            ui.add(egui::Label::new(\"Edge Source*\"));\n            ui.horizontal(|ui| {\n                egui::ComboBox::from_id_source(\"Edge Source\")\n                    .selected_text(&models.data_model.edge_data.headers_index_str[parent.edge_source])\n                    .show_ui(ui, |ui| {\n                        for (i, s) in models.data_model.edge_data.headers_index_str.iter().enumerate() {\n                            ui.selectable_value(&mut parent.edge_source, i, s);\n                        }\n                    });\n            });\n\n            ui.end_row();\n\n            ui.add(egui::Label::new(\"Edge Target*\"));\n            ui.horizontal(|ui| {\n                egui::ComboBox::from_id_source(\"Edge Target\")\n                    .selected_text(&models.data_model.edge_data.headers_index_str[parent.edge_target])\n                    .show_ui(ui, |ui| {\n                        for (i, s) in models.data_model.edge_data.headers_index_str.iter().enumerate() {\n                            ui.selectable_value(&mut parent.edge_target, i, s);\n                        }\n                    });\n            });\n\n            ui.end_row();\n        });\n}\n"
  },
  {
    "path": "src/components/import_modal_view/file_picker_page.rs",
    "content": "use egui::Ui;\n\nuse crate::models::{Models};\nuse crate::utils::file::{path_to_string, pick_csv};\nuse crate::widgets::frames::DEFAULT_BUTTON_PADDING;\n\nuse super::ImportModal;\n\npub fn show(parent: &mut ImportModal, _: &mut Models, ui: &mut Ui) {\n\n    ui.set_style(ui.ctx().style());\n    ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0);\n\n    ui.heading(\"Import Data\");\n\n    ui.horizontal(|ui| {\n        ui.selectable_value(&mut 0, 0, \"CSV\");\n        ui.selectable_value(&mut 0, 1, \"GraphML\");\n        ui.selectable_value(&mut 0, 2, \"DOT\");\n    });\n\n    ui.separator();\n\n    egui::Grid::new(\"my_grid\")\n        .num_columns(2)\n        .spacing([20.0, 8.0])\n        .show(ui, |ui| {\n            ui.add(egui::Label::new(\"Node File\"));\n            ui.horizontal(|ui| {\n                ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n\n                    ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n\n                    if ui.button(\"•••\").clicked() {\n                        parent.node_file_path = path_to_string(&pick_csv()).unwrap_or(parent.node_file_path.clone());\n                    }\n\n                    ui.vertical_centered_justified(|ui| {\n                        ui.add(\n                            egui::TextEdit::singleline(&mut parent.node_file_path)\n                            .hint_text(\"\")\n                            .desired_width(200.)\n                        );\n                    });\n                });\n            });\n\n            ui.end_row();\n\n            ui.add(egui::Label::new(\"Edge File*\"));\n            ui.horizontal(|ui| {\n                ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n\n                    ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n\n                    if ui.button(\"•••\").clicked() {\n                        parent.edge_file_path = path_to_string(&pick_csv()).unwrap_or(parent.edge_file_path.clone());\n                    }\n\n                    ui.vertical_centered_justified(|ui| {\n                        ui.add(egui::TextEdit::singleline(&mut parent.edge_file_path)\n                            .hint_text(\"\")\n                            .desired_width(200.),\n                        );\n                    });\n                });\n            });\n\n            ui.end_row();\n        });\n}\n"
  },
  {
    "path": "src/components/import_modal_view.rs",
    "content": "mod config_page;\nmod file_picker_page;\n\nuse std::path::PathBuf;\nuse std::sync::mpsc::{self, Receiver};\n\nuse egui::{Context, Widget};\nuse tokio::task::JoinHandle;\nuse crate::constant::ACCENT_COLOR;\n\nuse crate::models::app_model::ImportState;\nuse crate::models::data_model::ExternalData;\nuse crate::models::{Models, ImportedData};\nuse crate::utils::csv_loader::{read_headers_from_csv, load_data};\nuse crate::widgets::frames::inner_panel_frame;\nuse crate::widgets::modal::Modal;\n\n#[derive(Default, PartialEq)]\nenum Page {\n    #[default]\n    FilePicker,\n    Config,\n}\n\n#[derive(Default)]\npub struct ImportModal {\n    page_index: Page,\n    node_file_path: String,\n    edge_file_path: String,\n    edge_source: usize,\n    edge_target: usize,\n    import_promise: Option<Receiver<Result<ImportedData, String>>>,\n    import_join_handle: Option<JoinHandle<()>>,\n}\n\nimpl ImportModal {\n    pub fn show(&mut self, ctx: &Context, models: &mut Models) {\n        Modal::new(String::from(\"import_modal_view\")).show(ctx, |ui| {\n            ui.set_width(400.0);\n            ui.set_height(250.0);\n\n            egui::CentralPanel::default()\n                .frame(inner_panel_frame(ui.style()))\n                .show_inside(ui, |ui| match self.page_index {\n                    Page::FilePicker => file_picker_page::show(self, models, ui),\n                    Page::Config => config_page::show(self, models, ui),\n                });\n\n            egui::TopBottomPanel::bottom(\"v\")\n                .frame(inner_panel_frame(ui.style()))\n                .show_inside(ui, |ui| {\n                    ui.set_style(ui.ctx().style());\n                    ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0);\n\n                    ui.horizontal(|ui| {\n                        if let ImportState::Error(message) = &models.app_model.import_state {\n                            ui.label(message);\n                        }\n                        ui.allocate_ui_with_layout(\n                            ui.available_size(),\n                            egui::Layout::right_to_left(egui::Align::Center),\n                            |ui| match self.page_index {\n                                Page::FilePicker => {\n                                    ui.add_enabled_ui(!self.edge_file_path.is_empty(), |ui| {\n                                        if egui::Button::new(\"   Next   \").fill(ACCENT_COLOR).ui(ui).clicked() {\n                                            self.on_click_next(models);\n                                        }\n                                    });\n                                    if ui.button(\"   Cancel   \").clicked() {\n                                        models.app_model.is_import_visible = false;\n                                    }\n                                }\n                                Page::Config => {\n                                    if egui::Button::new(\"   Done   \").fill(ACCENT_COLOR).ui(ui).clicked() {\n                                        self.on_click_done();\n                                    }\n                                    let reimport_data_button = ui.button(\"   Back   \");\n                                    if reimport_data_button.clicked() {\n                                        self.reset_import_promise();\n                                        self.page_index = Page::FilePicker;\n                                    }\n                                    if self.check_import_done(models) {\n                                        ui.spinner();\n                                    }\n                                }\n                            },\n                        );\n                    });\n                });\n        });\n    }\n\n    fn on_click_next(&mut self, models: &mut Models) {\n        match self.load_edge_headers(models) {\n            Ok(_) => {\n                let edge_data_headers = &models.data_model.edge_data.headers_index_str;\n                self.edge_source = edge_data_headers.iter().position(|s| s == \"source\").unwrap_or(0);\n                self.edge_target = edge_data_headers.iter().position(|s| s == \"target\").unwrap_or(1);\n                self.page_index = Page::Config;\n                models.app_model.import_state = ImportState::Initial;\n            }\n            Err(s) => {\n                models.app_model.import_state =\n                    ImportState::Error(s);\n            }\n        }\n    }\n\n    #[allow(unused_must_use)]\n    fn on_click_done(&mut self) {\n        let node_file_path = self.node_file_path.clone();\n        let edge_file_path = self.edge_file_path.clone();\n        let edge_source = self.edge_source;\n        let edge_target = self.edge_target;\n        let (sender, recv) = mpsc::channel();\n        let join_handle = tokio::task::spawn(async move {\n            sender.send(load_data(&node_file_path, &edge_file_path, edge_source, edge_target));\n        });\n        self.import_promise = Some(recv);\n        self.import_join_handle = Some(join_handle);\n    }\n\n    fn check_import_done(&mut self, models: &mut Models) -> bool {\n        if let Some(promise) = self.import_promise.take() {\n            match promise.try_recv() {\n                Ok(result) => {\n                    match result {\n                        Ok(data) => {\n                            models.setup_data(data);\n                            self.reset_import_promise();\n                            self.page_index = Page::FilePicker;\n                        },\n                        Err(s) => {\n                            models.data_model.node_data = ExternalData::default();\n                            models.data_model.edge_data = ExternalData {\n                                headers_str_index: models.data_model.edge_data.headers_str_index.clone(),\n                                headers_index_str: models.data_model.edge_data.headers_index_str.clone(),\n                                data: Vec::default(),\n                            };\n                            models.app_model.import_state = ImportState::Error(s);\n                        }\n                    }\n                },\n                Err(_) => {\n                    self.import_promise = Some(promise);\n                    return true;\n                }\n            }\n        }\n        false\n    }\n\n    fn load_edge_headers(&mut self, models: &mut Models) -> Result<(), String> {\n        let (headers_str_index, headers_index_str) = read_headers_from_csv(&Some(PathBuf::from(self.edge_file_path.clone())))?;\n        models.data_model.edge_data.headers_str_index = headers_str_index;\n        models.data_model.edge_data.headers_index_str = headers_index_str;\n\n        // validate edge data\n        if models.data_model.edge_data.headers_str_index.len() < 2 {\n            Err(\"The edge file must contain source and target node IDs\".to_owned())\n        } else {\n            Ok(())\n        }\n    }\n\n    fn reset_import_promise(&mut self) {\n        if let Some(join_handle) = &self.import_join_handle {\n            join_handle.abort();\n        }\n        self.import_promise = None;\n        self.import_join_handle = None;\n    }\n}\n"
  },
  {
    "path": "src/components/inspector_view.rs",
    "content": "use std::hash::Hash;\n\nuse egui::{CollapsingHeader, CollapsingResponse, Color32, Ui};\n\nuse crate::models::Models;\nuse crate::models::app_model::{ImportState, InspectorTab};\nuse crate::models::graphics_model::ComputeMethod;\nuse crate::models::graphics_model::ComputeMethodType;\nuse crate::models::data_model::{ColorType, ColorRamp, ColorPalette, SizeType};\nuse crate::utils::file::{path_to_string, pick_folder, system_open_directory};\nuse crate::widgets::frames::{button_group_style, DEFAULT_BUTTON_PADDING, inspector_frame, inspector_inner_frame};\n\nuse super::AppView;\n\n#[derive(Default)]\npub struct InspectorView;\n\nimpl AppView for InspectorView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n        egui::SidePanel::right(\"inspector_view\")\n            .frame(inspector_frame(ui.style()))\n            .default_width(320.0)\n            .width_range(150.0..=400.0)\n            .resizable(false)\n            .show_inside(ui, |ui| {\n\n                // Render Section\n                egui::TopBottomPanel::bottom(\"render\")\n                    .frame(inspector_inner_frame(ui.style()))\n                    .show_separator_line(false)\n                    .show_inside(ui, |ui| {\n                        ui.set_style(ui.ctx().style());\n                        ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0);\n                        ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n\n                        if models.app_model.import_state != ImportState::Success {\n                            ui.set_enabled(false);\n                        }\n\n                        ui.with_layout(\n                            egui::Layout::right_to_left(egui::Align::Center),\n                            |ui| {\n                                let folder_open = ui.button(\"🗁\");\n                                if folder_open.clicked() {\n                                    Models::pick_output_folder_and_then(&mut models.app_model.output_folder, |folder| {\n                                        system_open_directory(folder);\n                                    });\n                                }\n                                ui.vertical_centered_justified(|ui| {\n                                    let render_button = ui.button(\"Render Image\");\n                                    if render_button.clicked() {\n                                        models.render_output();\n                                    }\n                                });\n                            },\n                        );\n                });\n\n                // Main Section\n                egui::CentralPanel::default()\n                    .frame(inspector_inner_frame(ui.style()))\n                    .show_inside(ui, |ui| {\n                        ui.set_style(ui.ctx().style());\n                        ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0);\n\n                        // Import Section / File Section\n                        if matches!(models.app_model.import_state, ImportState::Success) {\n                            ui.horizontal(|ui| {\n                                ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n\n                                    ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n                                    let remove_data_button = ui.button(\"🗑\");\n                                    if remove_data_button.clicked() {\n                                        models.clear_data()\n                                    }\n                                    ui.with_layout(\n                                        egui::Layout::top_down(egui::Align::LEFT).with_cross_align(egui::Align::Min),\n                                        |ui| {\n                                            let node_file_name = models.app_model.node_file_name().unwrap_or(\"\");\n                                            let edge_file_name = models.app_model.edge_file_name().unwrap_or(\"\");\n                                            ui.label(egui::RichText::new(format!(\"Node File: {}\\nEdge File: {}\", node_file_name, edge_file_name)).strong());\n                                        },\n                                    );\n                                });\n                            });\n                        } else {\n                            ui.vertical_centered_justified(|ui| {\n                                let import_data_button = ui.button(\"Import Data\");\n                                if import_data_button.clicked() {\n                                    models.app_model.is_import_visible = true;\n                                }\n                            });\n                        }\n\n                        ui.separator();\n\n                        if models.app_model.import_state != ImportState::Success {\n                            ui.set_enabled(false);\n                        }\n\n                        // Node Edge Inspector Switch\n                        button_group_style(ui.style()).show(ui, |ui| {\n                            ui.set_style(ui.ctx().style());\n                            ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0);\n                            ui.columns(5, |columns| {\n                                columns[0].vertical_centered_justified(|ui| {\n                                    ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Graph, \"Graph\");\n                                });\n                                columns[1].vertical_centered_justified(|ui| {\n                                    ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Node, \"Node\");\n                                });\n                                columns[2].vertical_centered_justified(|ui| {\n                                    ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Edge, \"Edge\");\n                                });\n                                columns[3].vertical_centered_justified(|ui| {\n                                    ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Camera, \"Camera\");\n                                });\n                                columns[4].vertical_centered_justified(|ui| {\n                                    ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Options, \"Options\");\n                                });\n                            });\n                        });\n\n                        ui.add_space(6.0);\n\n                        // Node Edge Inspector\n                        egui::ScrollArea::vertical()\n                            // .always_show_scroll(true)\n                            .auto_shrink([false, false])\n                            .id_source(\"source\")\n                            .show(ui, |ui| {\n                                match models.app_model.inspector_tab {\n                                    InspectorTab::Graph => self.graph_inspector(models, ui),\n                                    InspectorTab::Node => self.node_inspector(models, ui),\n                                    InspectorTab::Edge => self.edge_inspector(models, ui),\n                                    InspectorTab::Camera => self.camera_inspector(models, ui),\n                                    InspectorTab::Options => self.options_inspector(models, ui),\n                                };\n\n                            });\n\n                        ui.separator();\n                });\n\n            });\n    }\n}\n\nimpl InspectorView {\n    fn graph_inspector(&mut self, models: &mut Models, ui: &mut Ui) {\n        let node_settings = &mut models.data_model.node_settings;\n\n        inspector_section(ui, true, \"Transform\", |ui| {\n            grid_label(ui, \"\");\n\n            ui.end_row();\n        });\n\n        inspector_section(ui, true, \"Layout\", |ui| {\n\n            grid_label(ui, \"Method\");\n            egui::ComboBox::from_id_source(\"Position Compute\")\n                .selected_text(node_settings.position_compute.0)\n                .show_ui(ui, |ui| {\n                    ui.selectable_value(&mut node_settings.position_compute, ComputeMethod::FORCE_ATLAS2, ComputeMethod::FORCE_ATLAS2.0);\n                    ui.separator();\n                    ui.selectable_value(&mut node_settings.position_compute, ComputeMethod::RANDOMIZE, ComputeMethod::RANDOMIZE.0);\n                });\n            ui.end_row();\n\n            grid_label(ui, \"\");\n\n            if node_settings.position_compute.1 == ComputeMethodType::Continuous {\n                let continuous_button = ui.button(if !models.graphics_model.is_computing { \"Start Computing\" } else { \"Pause Computing\" });\n                if continuous_button.clicked() {\n                    models.graphics_model.switch_computing();\n                }\n            } else {\n                models.graphics_model.set_computing(false);\n                let one_step_button = ui.button(\"⏩ Dispatch\");\n                if one_step_button.clicked() {\n                    models.graphics_model.set_dispatching(true);\n                }\n            }\n            ui.end_row();\n        });\n\n    }\n\n    fn node_inspector(&mut self, models: &mut Models, ui: &mut Ui) {\n        let node_settings = &mut models.data_model.node_settings;\n\n        inspector_section(ui, true, \"Color\", |ui| {\n            grid_label(ui, \"Type\");\n            egui::ComboBox::from_id_source(\"Color Type\")\n                .selected_text(&node_settings.color_type.to_string())\n                .show_ui(ui, |ui| {\n                    ui.selectable_value(&mut node_settings.color_type, ColorType::Constant, \"Constant\");\n                    ui.selectable_value(&mut node_settings.color_type, ColorType::Ramp, \"Ramp\");\n                    ui.selectable_value(&mut node_settings.color_type, ColorType::Partition, \"Partition\");\n                });\n            ui.end_row();\n\n            match node_settings.color_type {\n                ColorType::Constant => {\n                    grid_label(ui, \"Value\");\n                    ui.color_edit_button_srgba(&mut node_settings.color_constant);\n                    ui.end_row();\n                },\n                ColorType::Ramp => {\n                    let (source, ramp) = &mut node_settings.color_ramp;\n                    source_combox(\"Source\", &models.data_model.node_data.headers_index_str, source, ui);\n                    grid_label(ui, \"Picker\");\n                    egui::ComboBox::from_id_source(\"Color Ramp\")\n                        .selected_text(&ramp.to_string())\n                        .show_ui(ui, |ui| {\n                            ui.selectable_value(ramp, ColorRamp::Ramp1, \"Ramp1\");\n                            ui.selectable_value(ramp, ColorRamp::Ramp2, \"Ramp2\");\n                        });\n                    ui.end_row();\n\n                    grid_label(ui, \"\");\n                    let _ = ui.button(\"Set Color\");\n                    ui.end_row();\n                },\n                ColorType::Partition => {\n                    let (source, platte) = &mut node_settings.color_partition;\n                    source_combox(\"Color Partition Source\", &models.data_model.node_data.headers_index_str, source, ui);\n                    grid_label(ui, \"Platte\");\n                    egui::ComboBox::from_id_source(\"Color Partition\")\n                        .selected_text(&platte.to_string())\n                        .show_ui(ui, |ui| {\n                            ui.selectable_value(platte, ColorPalette::Palette1, \"Palette1\");\n                            ui.selectable_value(platte, ColorPalette::Palette2, \"Palette2\");\n                        });\n                    ui.end_row();\n\n                    grid_label(ui, \"\");\n                    let _ = ui.button(\"Set Color\");\n                    ui.end_row();\n                },\n            }\n        });\n\n        inspector_section(ui, true, \"Size\", |ui| {\n            grid_label(ui, \"Type\");\n            egui::ComboBox::from_id_source(\"Size Type\")\n                .selected_text(&node_settings.size_type.to_string())\n                .show_ui(ui, |ui| {\n                    ui.selectable_value(&mut node_settings.size_type, SizeType::Constant, \"Constant\");\n                    ui.selectable_value(&mut node_settings.size_type, SizeType::Ramp, \"Ramp\");\n                });\n            ui.end_row();\n\n            match node_settings.size_type {\n                SizeType::Constant => {\n                    grid_label(ui, \"Value\");\n                    ui.add(egui::Slider::new(&mut node_settings.size_constant, 0.1..=10.0));\n                    ui.end_row();\n                },\n                SizeType::Ramp => {\n                    let (source, _) = &mut node_settings.size_ramp;\n                    source_combox(\"Source\", &models.data_model.node_data.headers_index_str, source, ui);\n                    grid_label(ui, \"Range\");\n                    ui.horizontal(|ui| {\n                        ui.add(egui::DragValue::new(&mut node_settings.size_ramp.1[0]).speed(0.1));\n                        ui.label(\"—\");\n                        ui.add(egui::DragValue::new(&mut node_settings.size_ramp.1[1]).speed(0.1));\n                    });\n                    ui.end_row();\n\n                    grid_label(ui, \"\");\n                    let _ = ui.button(\"Set Size\");\n                    ui.end_row();\n                }\n            }\n        });\n\n        inspector_section(ui, false, \"Position\", |ui| {\n            let (source, _) = &mut node_settings.size_ramp;\n            source_combox(\"Source\", &models.data_model.node_data.headers_index_str, source, ui);\n            grid_label(ui, \"\");\n            let _ = ui.button(\"Set Position\");\n            ui.end_row();\n\n        });\n    }\n\n    fn edge_inspector(&mut self, _models: &mut Models, ui: &mut Ui) {\n        inspector_section(ui, true, \"Color\", |ui| {\n            grid_label(ui, \"Value\");\n            ui.color_edit_button_srgba(&mut Color32::from_rgb(255, 255, 255));\n            ui.end_row();\n        });\n\n        inspector_section(ui, true, \"Width\", |ui| {\n            grid_label(ui, \"Value\");\n            ui.add(egui::Slider::new(&mut 1.0, 0.1..=10.0));\n            ui.end_row();\n        });\n    }\n\n    fn camera_inspector(&mut self, _models: &mut Models, ui: &mut Ui) {\n        let camera_settings = &mut _models.data_model.camera_settings;\n        inspector_section(ui, true, \"Transform\", |ui| {\n\n            grid_label(ui, \"Look at\");\n            ui.horizontal(|ui| {\n                ui.add(egui::DragValue::new(&mut camera_settings.look_at.0).speed(0.1));\n                ui.add(egui::DragValue::new(&mut camera_settings.look_at.1).speed(0.1));\n                ui.add(egui::DragValue::new(&mut camera_settings.look_at.2).speed(0.1));\n            });\n            ui.end_row();\n\n\n            grid_label(ui, \"Rotation\");\n            ui.horizontal(|ui| {\n                ui.add(egui::DragValue::new(&mut camera_settings.rotation.0).speed(0.1));\n                ui.add(egui::DragValue::new(&mut camera_settings.rotation.1).speed(0.1));\n                ui.add(egui::DragValue::new(&mut camera_settings.rotation.2).speed(0.1));\n            });\n            ui.end_row();\n\n            grid_label(ui, \"Distance\");\n            ui.horizontal(|ui| {\n                ui.add(egui::DragValue::new(&mut camera_settings.distance).speed(0.1));\n            });\n            ui.end_row();\n        });\n        inspector_section(ui, true, \"View\", |ui| {\n            ui.end_row();\n        });\n        inspector_section(ui, true, \"Composite\", |ui| {\n            ui.end_row();\n        });\n    }\n\n    fn options_inspector(&mut self, models: &mut Models, ui: &mut Ui) {\n\n        inspector_section(ui, true, \"Output\", |ui| {\n            grid_label(ui, \"Folder\");\n            ui.horizontal(|ui| {\n                ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n\n                    ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING;\n\n                    if ui.button(\"•••\").clicked() {\n                        models.app_model.output_folder = path_to_string(&pick_folder()).unwrap_or(models.app_model.output_folder.clone());\n                    }\n\n                    ui.vertical_centered_justified(|ui| {\n                        ui.add(\n                            egui::TextEdit::singleline(&mut models.app_model.output_folder)\n                                // .hint_text(\"未识别的路径\")\n                                .desired_width(200.)\n                        );\n                    });\n\n                });\n            });\n            ui.end_row();\n\n        });\n\n    }\n}\n\nfn source_combox(id_source: impl Hash, data_hearders: &Vec<String>, current_value: &mut String, ui: &mut Ui) {\n    grid_label(ui, \"Source\");\n    egui::ComboBox::from_id_source(id_source)\n        .selected_text(current_value.to_string())\n        .show_ui(ui, |ui| {\n            ui.selectable_value(current_value, String::from(\"None\"), String::from(\"None\"));\n            for value in data_hearders {\n                ui.selectable_value(current_value, value.clone(), value);\n            }\n        });\n    ui.end_row();\n}\n\nfn inspector_grid(id: &str) -> egui::Grid {\n    egui::Grid::new(id)\n        .num_columns(2)\n        .spacing([10.0, 4.0])\n        .min_col_width(65.)\n        .min_row_height(10.)\n}\n\nfn grid_label(ui: &mut egui::Ui, title: &str) {\n    let label = format!(\"{}\", title);\n    ui.horizontal(|ui| {\n        ui.set_width(100.);\n        ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {\n            ui.add(\n                egui::Label::new(egui::RichText::new(label)).wrap(true)\n            )\n        });\n    });\n}\n\n\nfn inspector_section<R>(ui: &mut Ui, default_open: bool, title: &str, add_contents: impl FnOnce(&mut Ui) -> R ) -> CollapsingResponse<R> {\n    CollapsingHeader::new(title)\n        .default_open(default_open)\n        .show(ui, |ui| {\n            // ui.add_space(6.0);\n            let r = inspector_grid(title)\n                .show(ui, |ui| {\n                    add_contents(ui)\n                }).inner;\n            // ui.add_space(6.0);\n\n            r\n        })\n}"
  },
  {
    "path": "src/components/menubar_view.rs",
    "content": "use egui::Ui;\n\nuse crate::widgets::frames::menu_panel_style;\nuse crate::{\n    models::{\n        app_model::{ImportState, MainStage},\n        Models,\n    },\n    widgets::frames::button_group_style,\n};\n\nuse super::AppView;\n\npub struct MenuBarView;\n\nimpl Default for MenuBarView {\n    fn default() -> Self {\n        Self {}\n    }\n}\n\nimpl AppView for MenuBarView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, frame: &mut eframe::Frame) {\n        egui::TopBottomPanel::top(\"menubar_view\")\n            .frame(menu_panel_style(\n                ui.style(),\n                frame.info().window_info.fullscreen,\n            ))\n            .show_separator_line(false)\n            .show_inside(ui, |ui| {\n                ui.set_style(ui.ctx().style());\n                egui::menu::bar(ui, |ui| {\n                    spacing_ui(ui);\n                    ui.menu_button(\"File\", |ui| {\n                        spacing_ui_start(ui);\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"New\");\n                            let _ = ui.button(\"Open\");\n                        });\n\n                        ui.separator();\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Close\");\n                            let _ = ui.button(\"Save\");\n                        });\n\n                        ui.separator();\n\n                        match models.app_model.import_state {\n                            ImportState::Initial => {\n                                if ui.button(\"Import Data\").clicked() {\n                                    models.app_model.is_import_visible = true;\n                                    ui.close_menu();\n                                }\n                            }\n                            ImportState::Success => {\n                                if ui.button(\"Reimport Data\").clicked() {\n                                    models.clear_data();\n                                    models.app_model.is_import_visible = true;\n                                    ui.close_menu();\n                                }\n                            }\n                            _ => {}\n                        }\n\n                        ui.add_enabled_ui(\n                            models.app_model.import_state == ImportState::Success,\n                            |ui| {\n                                if ui.button(\"Export Data\").clicked() {\n                                    models.app_model.is_export_visible = true;\n                                    ui.close_menu();\n                                }\n                            },\n                        );\n\n                        ui.separator();\n\n                        if ui.button(\"Quit\").clicked() {\n                            frame.close();\n                        }\n                        spacing_ui_end(ui);\n                    });\n                    ui.menu_button(\"Edit\", |ui| {\n                        spacing_ui_start(ui);\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Undo\");\n                            let _ = ui.button(\"Redo\");\n                        });\n\n                        ui.separator();\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Preference\");\n                        });\n\n                        spacing_ui_end(ui);\n                    });\n                    ui.menu_button(\"Render\", |ui| {\n                        spacing_ui_start(ui);\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Render Image\");\n                        });\n\n                        ui.separator();\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Show Result\");\n                        });\n                        spacing_ui_end(ui);\n                    });\n                    ui.menu_button(\"Window\", |ui| {\n                        spacing_ui_start(ui);\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Fullscreen\");\n                        });\n\n                        ui.separator();\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Save Screenshot\");\n                        });\n                        spacing_ui_end(ui);\n                    });\n                    ui.menu_button(\"Help\", |ui| {\n                        spacing_ui_start(ui);\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Official Website\");\n                            let _ = ui.button(\"Manual\");\n                            let _ = ui.button(\"Tutorial\");\n                        });\n\n                        ui.separator();\n\n                        ui.add_enabled_ui(false, |ui| {\n                            let _ = ui.button(\"Report a Bug\");\n                        });\n                        spacing_ui_end(ui);\n                    });\n\n                    ui.add_space(12.0);\n\n                    button_group_style(ui.style()).show(ui, |ui| {\n                        ui.set_style(ui.ctx().style());\n                        ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0);\n                        ui.selectable_value(\n                            &mut models.app_model.main_stage,\n                            MainStage::Graphics,\n                            \"  Graphics  \",\n                        );\n                        ui.selectable_value(\n                            &mut models.app_model.main_stage,\n                            MainStage::Table,\n                            \"  Table  \",\n                        );\n                    });\n                });\n            });\n    }\n}\n\nfn spacing_ui(ui: &mut Ui) {\n    ui.spacing_mut().item_spacing = egui::vec2(0.0, 2.0);\n    ui.spacing_mut().button_padding = egui::vec2(8.0, 1.0);\n}\n\nfn spacing_ui_start(ui: &mut Ui) {\n    ui.spacing_mut().item_spacing = egui::vec2(0.0, 2.0);\n    ui.spacing_mut().button_padding = egui::vec2(6.0, 0.0);\n    ui.add_space(2.0);\n    // ui.add_space(4.0);\n}\n\nfn spacing_ui_end(_ui: &mut Ui) {\n    // ui.add_space(2.0);\n}\n"
  },
  {
    "path": "src/components/mod.rs",
    "content": "use egui::Ui;\n\nuse crate::models::Models;\n\npub mod detail_view;\npub mod dock_view;\npub mod drawer_view;\npub mod drawers;\npub mod export_modal_view;\npub mod graphics_view;\npub mod import_modal_view;\npub mod inspector_view;\npub mod menubar_view;\npub mod shortcuts;\npub mod table_view;\n\npub trait AppView {\n    fn show(&mut self, models: &mut Models, ui: &mut Ui, frame: &mut eframe::Frame);\n}\n"
  },
  {
    "path": "src/components/shortcuts.rs",
    "content": "use egui::{Modifiers, Ui};\nuse crate::models::graphics_model::ComputeMethodType;\nuse crate::models::Models;\n\n#[derive(Default)]\npub struct Shortcut;\n\nimpl Shortcut {\n    pub fn apply(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) {\n        let organize_shortcut =\n            egui::KeyboardShortcut::new(Modifiers::COMMAND, egui::Key::R);\n        let organize_shortcut2 =\n            egui::KeyboardShortcut::new(Modifiers::NONE, egui::Key::F2);\n\n        let mut should_switch_compute = false;\n        if ui.input_mut().consume_shortcut(&organize_shortcut) { should_switch_compute = true }\n        if ui.input_mut().consume_shortcut(&organize_shortcut2) { should_switch_compute = true }\n\n        if should_switch_compute {\n            let node_settings = &mut models.data_model.node_settings;\n            if node_settings.position_compute.1 == ComputeMethodType::Continuous {\n                models.graphics_model.switch_computing();\n            } else {\n                models.graphics_model.set_dispatching(true);\n            }\n        }\n\n        let organize_shortcut =\n            egui::KeyboardShortcut::new(Modifiers::COMMAND, egui::Key::S);\n\n        if ui.input_mut().consume_shortcut(&organize_shortcut) {\n            models.render_output();\n        }\n\n        let organize_shortcut =\n            egui::KeyboardShortcut::new(Modifiers::NONE, egui::Key::Escape);\n\n        if ui.input_mut().consume_shortcut(&organize_shortcut) {\n            models.app_model.is_fullscreen_graphics = false;\n            if !models.app_model.is_fullscreen {\n                _frame.set_fullscreen(false);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/components/table_view.rs",
    "content": "use egui_extras::{TableBuilder, Column};\n\nuse crate::{\n    models::{app_model::TableTab, data_model::ExternalData, Models},\n    widgets::frames::button_group_style,\n};\nuse crate::models::app_model::ImportState;\nuse crate::widgets::frames::central_panel_frame;\n\nuse super::AppView;\n\n#[derive(Default)]\npub struct TableView;\n\nimpl AppView for TableView {\n    fn show(&mut self, models: &mut Models, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {\n        let style = (*ui.style()).clone();\n        egui::CentralPanel::default()\n            .frame(central_panel_frame(&style))\n            .show_inside(ui, |ui| {\n                ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0);\n\n                ui.horizontal_top(|ui| {\n                    button_group_style(ui.style()).show(ui, |ui| {\n                        ui.set_style(ui.ctx().style());\n                        ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0);\n                        ui.selectable_value(&mut models.app_model.table_tab, TableTab::Node, \"  Node Data  \");\n                        ui.selectable_value(&mut models.app_model.table_tab, TableTab::Edge, \"  Edge Data  \");\n                    });\n                });\n\n                ui.separator();\n\n                let ExternalData { headers_index_str: data_headers, data, .. } = match models.app_model.table_tab {\n                    TableTab::Node => &models.data_model.node_data,\n                    TableTab::Edge => &models.data_model.edge_data,\n                };\n\n                if models.app_model.import_state != ImportState::Success {\n                    ui.centered_and_justified(|ui| {\n                        let empty_hint_text = match models.app_model.table_tab {\n                            TableTab::Node => \"Import node data to display.\",\n                            TableTab::Edge => \"Import edge data to display.\",\n                        };\n                        ui.label(egui::RichText::new(empty_hint_text).weak());\n                    });\n                    return;\n                }\n\n                let text_height = egui::TextStyle::Body.resolve(ui.style()).size + 2.0;\n\n                egui::ScrollArea::horizontal()\n                    // .always_show_scroll(true)\n                    .auto_shrink([false, false])\n                    .id_source(\"table_scroll\")\n                    .show(ui, |ui| {\n                        TableBuilder::new(ui)\n                            .striped(true)\n                            .max_scroll_height(1600.0)\n                            .cell_layout(egui::Layout::left_to_right(egui::Align::Center))\n                            .columns(Column::initial(100.0).at_least(60.0), if data_headers.len() > 0 { data_headers.len() } else { 0 })\n                            .columns(Column::remainder().at_least(60.0), 1)\n                            .resizable(true)\n                            .header(20.0, |mut header| {\n                                header.col(|ui| {\n                                    ui.label(egui::RichText::new(\"Index\").weak());\n                                });\n                                for col in data_headers.iter() {\n                                    header.col(|ui| {\n                                        ui.label(egui::RichText::new(col).strong());\n                                    });\n                                }\n                            })\n                            .body(|body| {\n                                body.rows(text_height, models.data_model.status.node_count, |row_index, mut row| {\n                                    row.col(|ui| {\n                                        ui.label(egui::RichText::new(row_index.to_string()).weak());\n                                    });\n                                    if row_index >= data.len() {\n                                        for _data_col in data_headers {\n                                            row.col(|ui| {\n                                                ui.label(egui::RichText::new(\"N/A\").weak());\n                                            });\n                                        }\n                                    } else {\n                                        let data_row = &data[row_index];\n                                        for data_col in data_row {\n                                            row.col(|ui| {\n                                                ui.label(data_col);\n                                            });\n                                        }\n                                    }\n\n                                })\n                            });\n                    });\n\n            });\n    }\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "#[macro_use]\nextern crate lazy_static;\n\nmod app;\npub mod widgets;\npub mod components;\npub mod models;\npub mod utils;\npub mod bootstrap;\n\npub use app::MainApp;\n\npub const APP_VERSION: &str = env!(\"CARGO_PKG_VERSION\");\n\npub use {\n    utils::constant\n};"
  },
  {
    "path": "src/main.rs",
    "content": "#![cfg_attr(not(debug_assertions), windows_subsystem = \"windows\")]\n\nuse graphpu::bootstrap::{start_frame, ConfigBuilder};\n\n#[tokio::main]\nasync fn main() {\n    start_frame(ConfigBuilder::default().build());\n}\n"
  },
  {
    "path": "src/models/app_model.rs",
    "content": "use crate::utils::file::desktop_dir_or_empty;\nuse egui::style::{Selection, Spacing, WidgetVisuals, Widgets};\nuse egui::{Color32, Rounding, Stroke, Style, Vec2, Visuals};\nuse std::path::PathBuf;\nuse std::sync::Arc;\n\n#[derive(Debug, Default, PartialEq)]\npub enum ImportState {\n    #[default]\n    Initial,\n    Error(String),\n    Success,\n}\n\n#[derive(Default, PartialEq)]\npub enum MainStage {\n    #[default]\n    Graphics,\n    Table,\n}\n\n#[derive(Default, PartialEq)]\npub enum DockStage {\n    #[default]\n    None,\n    Messages,\n    Timeline,\n    Kernel,\n}\n\n#[derive(Default, PartialEq)]\npub enum TableTab {\n    #[default]\n    Node,\n    Edge,\n}\n\n#[derive(Default, PartialEq)]\npub enum InspectorTab {\n    #[default]\n    Graph,\n    Node,\n    Edge,\n    Camera,\n    Options,\n}\n\n#[derive(Default, PartialEq)]\npub enum Tool {\n    Select,\n    Handle,\n    #[default]\n    View,\n}\n\npub struct AppModel {\n    pub is_import_visible: bool,\n    pub is_export_visible: bool,\n    pub is_timeline_expand: bool,\n    pub is_fullscreen: bool,\n    pub is_fullscreen_graphics: bool,\n    pub import_state: ImportState,\n    pub node_file_path: Option<PathBuf>,\n    pub edge_file_path: Option<PathBuf>,\n    pub output_folder: String,\n    pub main_stage: MainStage,\n    pub dock_stage: DockStage,\n    pub table_tab: TableTab,\n    pub inspector_tab: InspectorTab,\n    pub pixels_per_point: f32,\n    pub current_tool: Tool,\n    pub ui_frame_count: u32,\n    pub dock_style: Arc<Style>,\n}\n\nimpl Default for AppModel {\n    fn default() -> Self {\n        let dock_style = Style {\n            spacing: Spacing {\n                button_padding: Vec2::from([8.0, 3.0]),\n                interact_size: Vec2::from([0.0, 0.0]),\n                ..Default::default()\n            },\n            visuals: Visuals {\n                widgets: Widgets {\n                    inactive: WidgetVisuals {\n                        bg_fill: Color32::from_gray(60), // button background\n                        bg_stroke: Default::default(),\n                        fg_stroke: Stroke::new(1.0, Color32::from_white_alpha(120)), // button text\n                        rounding: Rounding::none(),\n                        expansion: 0.5,\n                    },\n                    hovered: WidgetVisuals {\n                        bg_fill: Color32::from_gray(45),\n                        bg_stroke: Stroke::NONE, // e.g. hover over window edge or button\n                        fg_stroke: Stroke::new(1.5, Color32::from_gray(240)),\n                        rounding: Rounding::none(),\n                        expansion: 0.5,\n                    },\n                    active: WidgetVisuals {\n                        bg_fill: Color32::from_gray(70),\n                        bg_stroke: Stroke::NONE,\n                        fg_stroke: Stroke::new(2.0, Color32::WHITE),\n                        rounding: Rounding::none(),\n                        expansion: 0.5,\n                    },\n\n                    ..Default::default()\n                },\n                selection: Selection {\n                    bg_fill: Color32::from_gray(60),\n                    stroke: Stroke::new(1.0, Color32::from_white_alpha(220)), // button text\n                },\n                ..Default::default()\n            },\n            ..Default::default()\n        };\n\n        Self {\n            is_import_visible: false,\n            is_export_visible: false,\n            is_timeline_expand: false,\n            is_fullscreen: false,\n            is_fullscreen_graphics: false,\n            import_state: Default::default(),\n            node_file_path: None,\n            edge_file_path: None,\n            output_folder: desktop_dir_or_empty(),\n            main_stage: Default::default(),\n            dock_stage: Default::default(),\n            table_tab: Default::default(),\n            inspector_tab: Default::default(),\n            pixels_per_point: 1.0,\n            current_tool: Default::default(),\n            ui_frame_count: 0,\n            dock_style: Arc::new(dock_style),\n        }\n    }\n}\n\nimpl AppModel {\n    pub fn node_file_name(&self) -> Option<&str> {\n        self.node_file_path\n            .as_ref()?\n            .file_name()\n            .and_then(|s| s.to_str())\n    }\n\n    pub fn edge_file_name(&self) -> Option<&str> {\n        self.edge_file_path\n            .as_ref()?\n            .file_name()\n            .and_then(|s| s.to_str())\n    }\n}\n"
  },
  {
    "path": "src/models/data_model.rs",
    "content": "use std::collections::HashMap;\nuse eframe::epaint::Color32;\n\nuse strum::Display;\n\nuse super::graphics_model::ComputeMethod;\n\n#[derive(Debug, Default)]\npub struct ExternalData {\n    pub headers_str_index: HashMap<String, usize>,\n    pub headers_index_str: Vec<String>,\n    pub data: Vec<Vec<String>>,\n}\n\n#[derive(Debug, Default, Clone)]\npub struct GraphicsStatus {\n    pub node_count: usize,\n    pub edge_count: usize,\n    pub node_data_length: usize,\n    pub edge_data_length: usize,\n}\n\n#[derive(Display, PartialEq)]\npub enum PositionType {\n    Compute,\n    Set,\n}\n\n#[derive(Display, PartialEq)]\npub enum ColorRamp {\n    Ramp1,\n    Ramp2,\n}\n\n#[derive(Display, PartialEq)]\npub enum ColorPalette {\n    Palette1,\n    Palette2,\n}\n\n#[derive(Display, PartialEq)]\npub enum ColorType {\n    Constant,\n    Ramp,\n    Partition,\n}\n\n#[derive(Display, PartialEq)]\npub enum SizeType {\n    Constant,\n    Ramp,\n}\n\npub struct NodeSettings {\n    pub position_type: PositionType,\n    pub position_compute: ComputeMethod,\n    pub position_set: (f32, f32, f32),\n    \n    pub color_type: ColorType,\n    pub color_constant: Color32,\n    pub color_ramp: (String, ColorRamp),\n    pub color_partition: (String, ColorPalette),\n    \n    pub size_type: SizeType,\n    pub size_constant: f32,\n    pub size_ramp: (String, [f32; 2]),\n}\n\npub struct CameraSettings {\n    pub look_at: (f32, f32, f32),\n    pub rotation: (f32, f32, f32),\n    pub distance: f32,\n}\n\n\n\nimpl Default for CameraSettings {\n    fn default() -> Self {\n        Self {\n            look_at: (0.0, 0.0, 0.0),\n            rotation: (0.0, 0.0, 0.0),\n            distance: 10.0\n        }\n    }\n}\n\nimpl Default for NodeSettings {\n    fn default() -> Self {\n        Self {\n            position_type: PositionType::Compute,\n            position_compute: ComputeMethod::FORCE_ATLAS2,\n            position_set: (0.0, 0.0, 0.0),\n            color_type: ColorType::Constant,\n            color_constant: Color32::WHITE,\n            color_ramp: (String::from(\"None\"), ColorRamp::Ramp1),\n            color_partition: (String::from(\"None\"), ColorPalette::Palette1),\n            size_type: SizeType::Constant,\n            size_constant: 1.0,\n            size_ramp: (String::from(\"None\"), [0.5, 2.0]),\n        }\n    }\n}\n\npub struct DataModel {\n    pub node_data: ExternalData,\n    pub edge_data: ExternalData,\n    pub edge_source: Option<usize>,\n    pub edge_target: Option<usize>,\n    pub source_target_list: Option<Vec<u32>>,\n    pub max_id: u32,\n    pub status: GraphicsStatus,\n    pub node_settings: NodeSettings,\n    pub camera_settings: CameraSettings,\n}\n\nimpl Default for DataModel {\n    fn default() -> Self {\n        Self {\n            node_data: ExternalData::default(),\n            edge_data: ExternalData::default(),\n            edge_source: None,\n            edge_target: None,\n            source_target_list: None,\n            max_id: 0,\n            status: GraphicsStatus::default(),\n            node_settings: NodeSettings::default(),\n            camera_settings: Default::default()\n        }\n    }\n}\n\nimpl DataModel {\n    pub fn set_status(&mut self) {\n        self.status.node_count =\n            std::cmp::max(\n                self.node_data.data.len(),\n                if self.edge_data.data.len() > 0 { (self.max_id + 1) as usize } else { 0 }\n            );\n        self.status.edge_count = self.edge_data.data.len();\n        self.status.node_data_length = self.node_data.data.len();\n        self.status.edge_data_length = self.edge_data.data.len();\n    }\n\n    pub fn clear_source_target_list(&mut self) {\n        // self.source_target_list = None;\n    }\n}"
  },
  {
    "path": "src/models/graphics_lib/bind_group_layout.rs",
    "content": "\n\npub struct BindGroupLayout {\n    pub bing_group_layout: wgpu::BindGroupLayout,\n}\n\nimpl BindGroupLayout {\n\n    pub fn create_node_render_bind_group_layout( device: &wgpu::Device ) -> Self {\n\n        let bing_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {\n            entries: &[\n                wgpu::BindGroupLayoutEntry {\n                    binding: 0,\n                    visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,\n                    ty: wgpu::BindingType::Buffer {\n                        ty: wgpu::BufferBindingType::Storage { read_only: true },\n                        has_dynamic_offset: false,\n                        min_binding_size: None,\n                    },\n                    count: None,\n                },\n                wgpu::BindGroupLayoutEntry {\n                    binding: 1,\n                    visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,\n                    ty: wgpu::BindingType::Buffer {\n                        ty: wgpu::BufferBindingType::Storage { read_only: true },\n                        has_dynamic_offset: false,\n                        min_binding_size: None,\n                    },\n                    count: None,\n                },\n            ],\n            label: None,\n        });\n\n        Self {\n            bing_group_layout\n        }\n    }\n\n    pub fn create_edge_render_bind_group_layout( device: &wgpu::Device ) -> Self {\n\n        let bing_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {\n            entries: &[\n                wgpu::BindGroupLayoutEntry {\n                    binding: 0,\n                    visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,\n                    ty: wgpu::BindingType::Buffer {\n                        ty: wgpu::BufferBindingType::Storage { read_only: true },\n                        has_dynamic_offset: false,\n                        min_binding_size: None,\n                    },\n                    count: None,\n                },\n                wgpu::BindGroupLayoutEntry {\n                    binding: 1,\n                    visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,\n                    ty: wgpu::BindingType::Buffer {\n                        ty: wgpu::BufferBindingType::Storage { read_only: true },\n                        has_dynamic_offset: false,\n                        min_binding_size: None,\n                    },\n                    count: None,\n                },\n            ],\n            label: None,\n        });\n\n        Self {\n            bing_group_layout\n        }\n    }\n\n    pub fn create_bounding_box_render_bind_group_layout(device: &wgpu::Device ) -> Self {\n\n        let bing_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {\n            entries: &[\n                wgpu::BindGroupLayoutEntry {\n                    binding: 0,\n                    visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,\n                    ty: wgpu::BindingType::Buffer {\n                        ty: wgpu::BufferBindingType::Storage { read_only: true },\n                        has_dynamic_offset: false,\n                        min_binding_size: None,\n                    },\n                    count: None,\n                },\n            ],\n            label: None,\n        });\n\n        Self {\n            bing_group_layout\n        }\n    }\n\n    pub fn create_render_uniform_bind_group_layout( device: &wgpu::Device ) -> Self {\n\n        let bing_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {\n            entries: &[\n                wgpu::BindGroupLayoutEntry {\n                    binding: 0,\n                    visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,\n                    ty: wgpu::BindingType::Buffer {\n                        ty: wgpu::BufferBindingType::Uniform,\n                        has_dynamic_offset: false,\n                        min_binding_size: None,\n                    },\n                    count: None,\n                },\n            ],\n            label: None,\n        });\n\n        Self {\n            bing_group_layout\n        }\n    }\n\n}"
  },
  {
    "path": "src/models/graphics_lib/buffer_dimensions.rs",
    "content": "\n\npub struct BufferDimensions {\n    pub width: usize,\n    pub height: usize,\n    pub unpadded_bytes_per_row: usize,\n    pub padded_bytes_per_row: usize,\n}\n\nimpl BufferDimensions {\n    pub fn new(width: usize, height: usize, bytes_per_pixel: usize) -> Self {\n        let unpadded_bytes_per_row = width * bytes_per_pixel;\n        let align = wgpu::COPY_BYTES_PER_ROW_ALIGNMENT as usize;\n        let padded_bytes_per_row_padding = (align - unpadded_bytes_per_row % align) % align;\n        let padded_bytes_per_row = unpadded_bytes_per_row + padded_bytes_per_row_padding;\n        Self {\n            width,\n            height,\n            unpadded_bytes_per_row,\n            padded_bytes_per_row,\n        }\n    }\n}"
  },
  {
    "path": "src/models/graphics_lib/camera.rs",
    "content": "\nuse std::f32::consts;\nuse std::f32::consts::FRAC_PI_2;\n\n#[derive(Debug, Default)]\npub struct Camera {\n    pub position: glam::Vec3,\n    pub center: glam::Vec3,\n    pub aspect_ratio: f32,\n    pub view_matrix: glam::Mat4,\n    pub projection_matrix: glam::Mat4,\n    pub is_updated: bool,\n    pub near_far: glam::Vec2,\n    pub zoom_factor: f32,\n}\n\nimpl Camera {\n    pub fn from(position: glam::Vec3) -> Self {\n        let mut camera = Self {\n            position,\n            aspect_ratio: 1.0,\n            near_far: glam::Vec2::new(0.01, 10000.0),\n            ..Default::default()\n        };\n\n        camera.update_projection_matrix();\n\n        camera\n    }\n}\n\nimpl Camera {\n\n    pub fn set_aspect_ratio(&mut self, aspect_ratio: f32) {\n        self.aspect_ratio = aspect_ratio;\n        self.is_updated = true;\n    }\n\n    pub fn set_position(&mut self, position: glam::Vec3) {\n        self.position = position;\n        self.is_updated = true;\n    }\n\n    pub fn zoom(&mut self, zoom_factor: f32) {\n\n        let dir = self.position - self.center;\n        let ( mut length, norm_dir ) = ( dir.length(), dir.normalize() );\n\n        length = f32::clamp(length * zoom_factor, 0.1, 1000.0);\n\n        self.position = length * norm_dir + self.center;\n        self.is_updated = true;\n    }\n\n    pub fn rotate(&mut self, delta_angles: glam::Vec2) {\n\n        let (mut angles, length) = pos_to_angles_length(self.position - self.center);\n\n        angles += glam::Vec2::new(-delta_angles.x, delta_angles.y);\n        angles.y = f32::clamp(angles.y, -0.9 * FRAC_PI_2, 0.9 * FRAC_PI_2);\n\n        self.position = angles_length_to_pos(angles, length) + self.center;\n\n        self.is_updated = true;\n    }\n\n    pub fn update_projection_matrix(&mut self) {\n        self.zoom_factor = if self.aspect_ratio > 1.0 { 1.0 / self.aspect_ratio } else { 1.0 };\n        let projection = glam::Mat4::perspective_rh(consts::FRAC_PI_4 * self.zoom_factor, self.aspect_ratio, self.near_far.x, self.near_far.y);\n        let view = glam::Mat4::look_at_rh(\n            self.position,\n            self.center,\n            glam::Vec3::Y,\n        );\n        self.view_matrix = view;\n        self.projection_matrix = projection;\n    }\n}\n\nfn pos_to_angles_length(pos: glam::Vec3) -> (glam::Vec2, f32) {\n    let length = pos.length();\n\n    let angle_x = f32::atan2(pos.x, pos.z);\n    let angle_y = f32::atan2(pos.y, f32::sqrt(pos.x * pos.x + pos.z * pos.z));\n\n    return (glam::Vec2::new(angle_x, angle_y), length)\n\n\n}\n\nfn angles_length_to_pos(angles: glam::Vec2, length: f32) -> glam::Vec3 {\n\n    let pos_y = f32::sin(angles.y);\n    let pos_xz_factor = f32::cos(angles.y);\n\n    let pos_x = pos_xz_factor * f32::sin(angles.x);\n    let pos_z = pos_xz_factor * f32::cos(angles.x);\n\n    let pos = glam::Vec3::new(pos_x, pos_y, pos_z) * length;\n\n    pos\n\n}"
  },
  {
    "path": "src/models/graphics_lib/camera_controls.rs",
    "content": "use std::f32::consts::{PI};\nuse egui::{Key, Pos2, Ui, Vec2};\nuse crate::models::graphics_lib::Camera;\n\npub struct Controls {\n\n    // 鼠标指针位置，存在时为 Some\n    pub pointer_pos: Option<Pos2>,\n\n    is_pointer_press_inside: bool,\n\n    // 鼠标事件\n    primary_clicked: bool,\n    primary_down: bool,\n    secondary_down: bool,\n\n    // 滚轮 delta\n    scroll_delta: Vec2,\n\n    // 鼠标指针 delta\n    pointer_delta: Vec2,\n\n    // 视图大小\n    viewport_size: Vec2,\n\n    pub is_update: bool,\n    pub is_pointer_update: bool,\n\n}\n\nimpl Controls {\n\n    pub fn new() -> Self {\n        Self {\n            pointer_pos: None,\n            is_pointer_press_inside: false,\n            primary_clicked: false,\n            primary_down: false,\n            secondary_down: false,\n            scroll_delta: Vec2::ZERO,\n            pointer_delta: Vec2::ZERO,\n            viewport_size: Vec2::ZERO,\n            is_update: true,\n            is_pointer_update: false,\n        }\n    }\n\n}\n\nimpl Controls {\n\n    // 传入 egui Ui，更新交互\n    // 该函数在 viewport 更新后，渲染开始前调用\n    pub fn update_interaction(&mut self, ui: &mut Ui, is_hover: bool) {\n\n        // 归零参数\n        self.pointer_pos = None;\n        self.primary_clicked = false;\n\n        // 记录滚动 delta、指针位置 delta\n        self.scroll_delta = ui.input().scroll_delta;\n        self.pointer_delta = ui.input().pointer.delta();\n\n        // 从当前的 Ui 中获取 viewport_rect\n        // viewport_rect 记录了绘图区域的左上角、右下角\n        let viewport_rect = ui.max_rect();\n        self.viewport_size = viewport_rect.size();\n\n        // 如果鼠标指针在应用区域内，获取指针位置\n        // 注：egui 的 interact_pos 是 Option<Pos2> 类型\n        // 仅当鼠标指针在应用窗口范围内，或拖动至 native 应用外是为 Some\n        if let Some(pos) = ui.input().pointer.interact_pos() {\n\n            let mut is_pointer_press_inside = false;\n\n            // 如果鼠标指针在绘图区域内\n            if viewport_rect.contains(pos) && is_hover {\n\n                // 记录鼠标指针在绘图区域的相对位置\n                // 范围是 0, 0 至 width, height\n                let new_pos = pos - viewport_rect.min.to_vec2();\n                if self.pointer_pos != Some(new_pos) {\n                    self.pointer_pos = Some(new_pos);\n                    self.is_pointer_update = true;\n                }\n\n                is_pointer_press_inside = true;\n\n            }\n\n            // 鼠标事件记录\n            // 若有事件，标记交互已更新\n\n            if ui.input().pointer.primary_clicked() {\n                self.primary_clicked = true;\n            }\n\n            if ui.input().pointer.primary_down() {\n                if !self.primary_down {\n                    self.is_pointer_press_inside = is_pointer_press_inside;\n                    self.primary_down = true;\n                }\n            }\n\n            if ui.input().pointer.secondary_down() {\n                if !self.secondary_down {\n                    self.is_pointer_press_inside = is_pointer_press_inside;\n                    self.secondary_down = true;\n                }\n            }\n\n        }\n\n        // 鼠标事件归零\n\n        if !ui.input().pointer.primary_down() {\n            self.primary_down = false;\n        }\n\n        if !ui.input().pointer.secondary_down() {\n            self.secondary_down = false;\n        }\n\n    }\n\n    pub fn update_camera(&mut self, ui: &mut Ui, camera: &mut Camera) {\n\n        // 滚轮缩放\n        // 如果鼠标指针在绘图区域内，且当前帧滚轮纵向 delta 不为零\n        // 用滚轮纵向 delta 缩放相机\n        if self.pointer_pos.is_some() && self.scroll_delta.y != 0.0 {\n\n            // 相机 zoom 函数的传入参数为缩放比例\n            // 须满足偏移量累加时缩放比例累乘，故偏移量为常量的指数\n            camera.zoom(f32::powf(1.2, -self.scroll_delta.y * 0.03) );\n            self.is_update = true;\n\n        }\n\n        if ui.input().key_down(Key::Minus) {\n            camera.zoom(f32::powf(1.2, 0.03) );\n            self.is_update = true;\n        }\n        if ui.input().key_pressed(Key::Minus) && ui.input().key_released(Key::Minus) {\n            camera.zoom(f32::powf(1.2, 1.0) );\n            self.is_update = true;\n        }\n        if ui.input().key_down(Key::PlusEquals) {\n            camera.zoom(f32::powf(1.2, -0.03) );\n            self.is_update = true;\n        }\n        if ui.input().key_pressed(Key::PlusEquals) && ui.input().key_released(Key::PlusEquals) {\n            camera.zoom(f32::powf(1.2, -1.0) );\n            self.is_update = true;\n        }\n        if ui.input().key_pressed(Key::Num9) {\n            camera.rotate(glam::Vec2::new(0.03, 0.0) * PI);\n            self.is_update = true;\n        }\n        if ui.input().key_pressed(Key::Num0) {\n            camera.rotate(glam::Vec2::new(-0.03, 0.0) * PI);\n            self.is_update = true;\n        }\n\n        if !self.is_pointer_press_inside { return; }\n\n        // 右键上下缩放\n        // 如果鼠标右键在绘图区域内按下，且鼠标指针纵向 delta 不为零\n        // 用鼠标指针纵向 delta 缩放相机\n        if self.secondary_down && self.pointer_delta.y != 0.0 {\n\n            // 原理同滚轮缩放\n            camera.zoom(f32::powf(1.2, -self.pointer_delta.y * 0.03) );\n            self.is_update = true;\n\n        }\n\n        // 左键旋转\n        // 如果鼠标左键在绘图区域内按下\n        // 用鼠标指针的 x、y delta 在绘图区域的占比计算旋转角度，旋转相机\n        if self.primary_down && (self.pointer_delta.x != 0.0 || self.pointer_delta.y != 0.0) {\n\n            let mut angles = glam::Vec2::new(self.pointer_delta.x, self.pointer_delta.y);\n\n            // 从绘图区域的最左拖动至最右，相机绕 y 轴旋转 PI\n            // 从绘图区域的中央拖动至上中，相机绕 x 轴旋转 PI * 0.5\n            angles = angles / glam::Vec2::new(self.viewport_size.x, self.viewport_size.y) * PI;\n\n            camera.rotate(angles);\n            self.is_update = true;\n\n        }\n    }\n\n}"
  },
  {
    "path": "src/models/graphics_lib/compute_shader.rs",
    "content": "use std::sync::Arc;\nuse egui::epaint::ahash::HashMap;\nuse wgpu::{Device, ShaderModule, BindGroupLayoutEntry};\n\npub struct ComputeShader {\n    pub shader: ShaderModule,\n    pub device: Arc<Device>,\n    pub kernels: HashMap<String, ComputeKernel>\n}\n\npub struct ComputeBuffer<'a> {\n    pub(crate) binding:        u32,\n    pub(crate) buffer_type:    ComputeBufferType,\n    pub(crate) buffer:         wgpu::BindingResource<'a>\n}\n\npub enum ComputeBufferType {\n    Storage,\n    Uniform,\n    StorageReadOnly,\n}\n\nimpl ComputeShader {\n    // pub fn create_pipeline(&mut self, entry_point: &str) -> ComputePipeline {\n    //     let compute_pipeline = self.device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor {\n    //         label: Some(\"Gen Node Pipeline\"),\n    //         layout: Some(&self.pipeline_layout),\n    //         module: &self.shader,\n    //         entry_point,\n    //     });\n    //\n    //     compute_pipeline\n    // }\n\n    pub fn create_compute_kernel(&mut self, entry_point: &str, buffers: Vec<ComputeBuffer>) {\n\n        let bind_group_layout = self.device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {\n            entries: buffers.iter().map(|compute_buffer| BindGroupLayoutEntry {\n                binding: compute_buffer.binding,\n                visibility: wgpu::ShaderStages::COMPUTE,\n                ty: wgpu::BindingType::Buffer {\n                    ty: match compute_buffer.buffer_type {\n                        ComputeBufferType::Storage => wgpu::BufferBindingType::Storage { read_only: false },\n                        ComputeBufferType::Uniform => wgpu::BufferBindingType::Uniform,\n                        ComputeBufferType::StorageReadOnly => wgpu::BufferBindingType::Storage { read_only: true },\n                    },\n                    has_dynamic_offset: false,\n                    min_binding_size: None,\n                },\n                count: None,\n            })\n            .collect::<Vec<_>>()\n            .as_slice(),\n            label: None,\n        });\n\n        let bind_group = self.device.create_bind_group(&wgpu::BindGroupDescriptor {\n            layout: &bind_group_layout,\n            entries: buffers.iter().map(|compute_buffer| wgpu::BindGroupEntry {\n                binding: compute_buffer.binding,\n                resource: compute_buffer.buffer.clone(),\n            })\n            .collect::<Vec<_>>()\n            .as_slice(),\n            label: None,\n        });\n\n        let pipeline_layout = self.device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {\n            label: Some(&*(entry_point.to_owned() + \" pipeline layout\")),\n            bind_group_layouts: &[&bind_group_layout],\n            push_constant_ranges: &[],\n        });\n\n        let compute_pipeline = self.device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor {\n            label: Some(&*(entry_point.to_owned() + \" pipeline\")),\n            layout: Some(&pipeline_layout),\n            module: &self.shader,\n            entry_point,\n        });\n\n        let compute_kernel = ComputeKernel {\n            bind_group,\n            compute_pipeline\n        };\n\n        self.kernels.insert(\n            entry_point.parse().unwrap(),\n            compute_kernel\n        );\n\n    }\n}\n\npub struct ComputeKernel {\n    pub bind_group: wgpu::BindGroup,\n    pub compute_pipeline: wgpu::ComputePipeline\n}"
  },
  {
    "path": "src/models/graphics_lib/mod.rs",
    "content": "pub mod camera;\npub mod texture;\npub mod camera_controls;\npub mod render_pipeline;\npub mod buffer_dimensions;\npub mod bind_group_layout;\npub mod compute_shader;\npub mod unifrom;\n\npub use {\n    camera::Camera,\n    texture::Texture,\n    camera_controls::Controls,\n    render_pipeline::RenderPipeline,\n    buffer_dimensions::BufferDimensions,\n};"
  },
  {
    "path": "src/models/graphics_lib/render_pipeline.rs",
    "content": "use crate::constant::{CAST_TEXTURE_FORMAT, DEPTH_FORMAT, MULTISAMPLE_STATE, TEXTURE_FORMAT};\n\npub struct RenderPipeline {\n    pub render_pipeline: wgpu::RenderPipeline,\n}\n\nimpl RenderPipeline {\n\n    pub fn create_node_render_pipeline( device: &wgpu::Device, layouts: &[&wgpu::BindGroupLayout], node_shader: &wgpu::ShaderModule, is_cast: bool ) -> Self {\n\n        let node_render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {\n            label: Some(\"node render\"),\n            bind_group_layouts: layouts,\n            push_constant_ranges: &[],\n        });\n\n        let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {\n            label: None,\n            layout: Some(&node_render_pipeline_layout),\n            vertex: wgpu::VertexState {\n                module: &node_shader,\n                entry_point: if !is_cast { \"main_vs\" } else { \"cast_vs\" },\n                buffers: &[\n                    wgpu::VertexBufferLayout {\n                        array_stride: 2 * 4,\n                        step_mode: wgpu::VertexStepMode::Vertex,\n                        attributes: &wgpu::vertex_attr_array![0 => Float32x2],\n                    },\n                ],\n            },\n            fragment: Some(wgpu::FragmentState {\n                module: &node_shader,\n                entry_point: if !is_cast { \"main_fs\" } else { \"cast_fs\" },\n                targets: &[Some(wgpu::ColorTargetState {\n                    format: if !is_cast { TEXTURE_FORMAT } else { CAST_TEXTURE_FORMAT },\n                    blend: if !is_cast { Some(wgpu::BlendState {\n                        color: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::SrcAlpha,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                        alpha: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::One,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                    }) } else { None },\n                    write_mask: wgpu::ColorWrites::ALL,\n                })],\n            }),\n            primitive: wgpu::PrimitiveState {\n                topology: wgpu::PrimitiveTopology::TriangleStrip,\n                front_face: wgpu::FrontFace::Ccw,\n                ..Default::default()\n            },\n            depth_stencil: Some(wgpu::DepthStencilState {\n                format: DEPTH_FORMAT,\n                // depth_write_enabled: false,\n                // depth_compare: wgpu::CompareFunction::Always, // 1.\n                depth_write_enabled: true,\n                depth_compare: wgpu::CompareFunction::Less, // 1.\n                stencil: wgpu::StencilState::default(), // 2.\n                bias: wgpu::DepthBiasState::default(),\n            }),\n            multisample: if !is_cast { MULTISAMPLE_STATE } else { wgpu::MultisampleState::default() },\n            multiview: None,\n        });\n\n        Self {\n            render_pipeline,\n        }\n\n    }\n\n    pub fn create_edge_render_pipeline( device: &wgpu::Device, layouts: &[&wgpu::BindGroupLayout],  edge_shader: &wgpu::ShaderModule, is_cast: bool ) -> Self {\n\n        let edge_render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {\n            label: Some(\"edge render\"),\n            bind_group_layouts: layouts,\n            push_constant_ranges: &[],\n        });\n\n        let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {\n            label: None,\n            layout: Some(&edge_render_pipeline_layout),\n            vertex: wgpu::VertexState {\n                module: &edge_shader,\n                entry_point: if !is_cast { \"main_vs\" } else { \"cast_vs\" },\n                buffers: &[\n                    wgpu::VertexBufferLayout {\n                        array_stride: 2 * 4,\n                        step_mode: wgpu::VertexStepMode::Vertex,\n                        attributes: &wgpu::vertex_attr_array![0 => Float32x2],\n                    },\n                ],\n            },\n            fragment: Some(wgpu::FragmentState {\n                module: &edge_shader,\n                entry_point: if !is_cast { \"main_fs\" } else { \"cast_fs\" },\n                targets: &[Some(wgpu::ColorTargetState {\n                    format: if !is_cast { TEXTURE_FORMAT } else { CAST_TEXTURE_FORMAT },\n                    blend: if !is_cast { Some(wgpu::BlendState {\n                        color: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::SrcAlpha,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                        alpha: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::One,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                    }) } else { None },\n                    write_mask: wgpu::ColorWrites::ALL,\n                })],\n            }),\n            primitive: wgpu::PrimitiveState {\n                topology: wgpu::PrimitiveTopology::TriangleStrip,\n                front_face: wgpu::FrontFace::Ccw,\n                ..Default::default()\n            },\n            depth_stencil: Some(wgpu::DepthStencilState {\n                format: DEPTH_FORMAT,\n                depth_write_enabled: false,\n                depth_compare: wgpu::CompareFunction::Less, // 1.\n                stencil: wgpu::StencilState::default(), // 2.\n                bias: wgpu::DepthBiasState::default(),\n            }),\n            multisample: if !is_cast { MULTISAMPLE_STATE } else { wgpu::MultisampleState::default() },\n            multiview: None,\n        });\n\n        Self {\n            render_pipeline,\n        }\n\n    }\n\n    pub fn create_axis_render_pipeline( device: &wgpu::Device, layouts: &[&wgpu::BindGroupLayout], axis_shader: &wgpu::ShaderModule ) -> Self {\n\n        let axis_render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {\n            label: Some(\"axis render\"),\n            bind_group_layouts: layouts,\n            push_constant_ranges: &[],\n        });\n\n        let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {\n            label: None,\n            layout: Some(&axis_render_pipeline_layout),\n            vertex: wgpu::VertexState {\n                module: &axis_shader,\n                entry_point: \"main_vs\",\n                buffers: &[\n                    wgpu::VertexBufferLayout {\n                        array_stride: 2 * 4,\n                        step_mode: wgpu::VertexStepMode::Vertex,\n                        attributes: &wgpu::vertex_attr_array![0 => Float32x2],\n                    },\n                ],\n            },\n            fragment: Some(wgpu::FragmentState {\n                module: &axis_shader,\n                entry_point: \"main_fs\",\n                targets: &[Some(wgpu::ColorTargetState {\n                    format: TEXTURE_FORMAT,\n                    blend: Some(wgpu::BlendState {\n                        color: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::SrcAlpha,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                        alpha: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::SrcAlpha,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                        // alpha: wgpu::BlendComponent::OVER,\n                    }),\n                    write_mask: wgpu::ColorWrites::ALL,\n                })],\n            }),\n            primitive: wgpu::PrimitiveState {\n                topology: wgpu::PrimitiveTopology::TriangleStrip,\n                front_face: wgpu::FrontFace::Ccw,\n                ..Default::default()\n            },\n            depth_stencil: Some(wgpu::DepthStencilState {\n                format: DEPTH_FORMAT,\n                depth_write_enabled: true,\n                depth_compare: wgpu::CompareFunction::Less, // 1.\n                stencil: wgpu::StencilState::default(), // 2.\n                bias: wgpu::DepthBiasState::default(),\n            }),\n            // depth_stencil: None,\n            multisample: MULTISAMPLE_STATE,\n            multiview: None,\n        });\n\n        Self {\n            render_pipeline,\n        }\n\n    }\n\n    pub fn create_bounding_box_render_pipeline( device: &wgpu::Device, layouts: &[&wgpu::BindGroupLayout], bounding_box_shader: &wgpu::ShaderModule ) -> Self {\n\n        let render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {\n            label: Some(\"bound render\"),\n            bind_group_layouts: layouts,\n            push_constant_ranges: &[],\n        });\n\n        let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {\n            label: None,\n            layout: Some(&render_pipeline_layout),\n            vertex: wgpu::VertexState {\n                module: &bounding_box_shader,\n                entry_point: \"main_vs\",\n                buffers: &[\n                    wgpu::VertexBufferLayout {\n                        array_stride: 3 * 4,\n                        step_mode: wgpu::VertexStepMode::Vertex,\n                        attributes: &wgpu::vertex_attr_array![0 => Float32x3],\n                    },\n                ],\n            },\n            fragment: Some(wgpu::FragmentState {\n                module: &bounding_box_shader,\n                entry_point: \"main_fs\",\n                targets: &[Some(wgpu::ColorTargetState {\n                    format: TEXTURE_FORMAT,\n                    blend: Some(wgpu::BlendState {\n                        color: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::SrcAlpha,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                        alpha: wgpu::BlendComponent {\n                            src_factor: wgpu::BlendFactor::One,\n                            dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,\n                            operation: wgpu::BlendOperation::Add,\n                        },\n                        // alpha: wgpu::BlendComponent::OVER,\n                    }),\n                    write_mask: wgpu::ColorWrites::ALL,\n                })],\n            }),\n            primitive: wgpu::PrimitiveState {\n                topology: wgpu::PrimitiveTopology::LineList,\n                front_face: wgpu::FrontFace::Ccw,\n                ..Default::default()\n            },\n            depth_stencil: Some(wgpu::DepthStencilState {\n                format: DEPTH_FORMAT,\n                depth_write_enabled: true,\n                depth_compare: wgpu::CompareFunction::Less, // 1.\n                stencil: wgpu::StencilState::default(), // 2.\n                bias: wgpu::DepthBiasState::default(),\n            }),\n            // depth_stencil: None,\n            multisample: MULTISAMPLE_STATE,\n            multiview: None,\n        });\n\n        Self {\n            render_pipeline,\n        }\n\n    }\n\n}"
  },
  {
    "path": "src/models/graphics_lib/texture.rs",
    "content": "use crate::constant::{CAST_TEXTURE_FORMAT, DEPTH_FORMAT, TEXTURE_FORMAT};\n\npub struct Texture {\n    pub texture: wgpu::Texture,\n    pub view: wgpu::TextureView,\n    pub sampler: Option<wgpu::Sampler>,\n}\n\nimpl Texture {\n\n    pub fn create_depth_texture(device: &wgpu::Device, size: &wgpu::Extent3d, label: &str, is_multisample: bool) -> Self {\n        let size = wgpu::Extent3d { // 2.\n            width: size.width,\n            height: size.height,\n            depth_or_array_layers: 1,\n        };\n        let desc = wgpu::TextureDescriptor {\n            label: Some(label),\n            size,\n            mip_level_count: 1,\n            sample_count: if is_multisample { 4 } else { 1 },\n            dimension: wgpu::TextureDimension::D2,\n            format: DEPTH_FORMAT,\n            usage: wgpu::TextureUsages::RENDER_ATTACHMENT // 3.\n                | wgpu::TextureUsages::TEXTURE_BINDING,\n        };\n        let texture = device.create_texture(&desc);\n\n        let view = texture.create_view(&wgpu::TextureViewDescriptor::default());\n        let sampler = device.create_sampler(\n            &wgpu::SamplerDescriptor { // 4.\n                address_mode_u: wgpu::AddressMode::ClampToEdge,\n                address_mode_v: wgpu::AddressMode::ClampToEdge,\n                address_mode_w: wgpu::AddressMode::ClampToEdge,\n                mag_filter: wgpu::FilterMode::Linear,\n                min_filter: wgpu::FilterMode::Linear,\n                mipmap_filter: wgpu::FilterMode::Nearest,\n                compare: Some(wgpu::CompareFunction::LessEqual), // 5.\n                lod_min_clamp: -100.0,\n                lod_max_clamp: 100.0,\n                ..Default::default()\n            }\n        );\n\n        Self { texture, view, sampler: Some(sampler) }\n    }\n\n    pub fn create_texture(device: &wgpu::Device, size: &wgpu::Extent3d, sample_count: u32, is_cast: bool) -> Self {\n        let size = wgpu::Extent3d { // 2.\n            width: size.width,\n            height: size.height,\n            depth_or_array_layers: 1,\n        };\n        let desc = wgpu::TextureDescriptor {\n            size,\n            mip_level_count: 1,\n            sample_count,\n            dimension: wgpu::TextureDimension::D2,\n            format: if !is_cast { TEXTURE_FORMAT} else { CAST_TEXTURE_FORMAT },\n            usage: wgpu::TextureUsages::RENDER_ATTACHMENT\n                | wgpu::TextureUsages::COPY_SRC\n                | wgpu::TextureUsages::TEXTURE_BINDING,\n            label: None,\n        };\n\n        let texture = device.create_texture(&desc);\n\n        let view = texture.create_view(&wgpu::TextureViewDescriptor::default());\n\n        Self { texture, view, sampler: None }\n    }\n\n}"
  },
  {
    "path": "src/models/graphics_lib/unifrom.rs",
    "content": "use bytemuck::{Pod, Zeroable};\nuse crate::models::graphics_lib::Camera;\n\n#[repr(C)]\n#[derive(Copy, Clone, Debug, PartialEq, Pod, Zeroable)]\npub struct Uniforms {\n    view:       [f32; 16],\n    projection: [f32; 16],\n    time:       [f32; 4],\n    screen:     [f32; 4],\n    camera:     [f32; 4],\n}\n\npub fn generate_uniforms(\n    camera: &Camera,\n    viewport_size: glam::Vec2,\n    pointer_pos: glam::Vec2\n) -> Uniforms {\n    Uniforms {\n        view:       *camera.view_matrix.as_ref(),\n        projection: *camera.projection_matrix.as_ref(),\n        time:       [0.0, 0.0, 0.0, 0.0],\n        screen:\n        [\n            viewport_size.x as f32,\n            viewport_size.y as f32,\n            pointer_pos.x,\n            pointer_pos.y,\n        ],\n        camera:\n        [\n            camera.aspect_ratio as f32,\n            camera.zoom_factor  as f32,\n            camera.near_far.x,\n            camera.near_far.y\n        ],\n    }\n}\n"
  },
  {
    "path": "src/models/graphics_model.rs",
    "content": "#![allow(dead_code)]\n#![allow(unused_variables)]\n\nuse std::borrow::{Cow};\nuse std::mem;\nuse chrono::{Local, Utc};\nuse egui::{Ui, Vec2};\nuse glam::Vec3;\nuse wgpu::{Queue, ShaderModule, ComputePass};\nuse wgpu::util::DeviceExt;\nuse crate::models::data_model::GraphicsStatus;\nuse crate::models::graphics_lib::{BufferDimensions, Camera, Controls, RenderPipeline, Texture};\n\nuse rayon::prelude::*;\nuse crate::models::graphics_lib::bind_group_layout::BindGroupLayout;\nuse crate::models::graphics_lib::compute_shader::{ComputeBuffer, ComputeBufferType, ComputeKernel, ComputeShader};\nuse crate::models::graphics_lib::unifrom::{generate_uniforms, Uniforms};\nuse crate::utils::file::create_png;\n\nuse super::data_model::DataModel;\nuse bytemuck::{Pod, Zeroable};\nuse crate::utils::message::{message_error, message_warning};\n\n// 须同步修改 Compute WGSL 中每一个函数的 @workgroup_size\n// WGSL 中没有宏，不能使用类似 HLSL 的 #define 方法\nconst PARTICLES_PER_GROUP: u32 = 256;\n\n\n// 须同步修改各个 WGSL 中的 Node struct\n#[repr(C)]\npub struct Node {\n    _position:      [f32; 3],\n    _force:         [f32; 3],\n    _prev_force:    [f32; 3],\n    _mass:          u32,\n}\n\n#[repr(C)]\npub struct Bound {\n    _bound_min: [f32; 3],\n    _bound_max: [f32; 3],\n}\n\n#[repr(C)]\npub struct BHTree {\n    _max_depth: u32,\n    _bottom:    u32,\n    _radius:    f32,\n    _empty:     i32,\n}\n\n#[repr(C)]\n#[derive(Clone, Copy, bytemuck::Zeroable, bytemuck::Pod)]\npub struct BHTreeNode {\n    _position:  [f32; 4],\n    _mass:      i32,\n    _count:     i32,\n    _start:     i32,\n    _sort:      i32,\n}\n\n#[repr(C)]\n#[derive(Copy, Clone, Debug, PartialEq, Pod, Zeroable)]\npub struct ComputeUniforms {\n    frame_num:          u32,\n    node_count:         u32,\n    edge_count:         u32,\n    edge_sort_count:    u32,\n    tree_node_count:    u32,\n    bounding_count:     u32,\n    kernel_status_count: u32,\n}\n\n#[repr(C)]\n#[derive(Copy, Clone, Debug, PartialEq, Pod, Zeroable)]\npub struct EdgeSort {\n    _node:      [u32; 4],\n    _force:     [f32; 4],\n}\n\npub const KERNEL_STATUS_COUNT: usize = 5;\npub const KERNEL_NAMES: [&str; KERNEL_STATUS_COUNT] = [\n    \"attractive_force\",\n    \"tree_building\",\n    \"summarization\",\n    \"sort\",\n    \"electron_force\",\n];\n\n// 计算方法的类型\n// Continuous 为需要连续迭代模拟的方法，如 Force Atlas 2\n// OneStep 为单次方法，如 Randomize\n#[derive(PartialEq)]\npub enum ComputeMethodType {\n    Continuous,\n    OneStep,\n}\n\n// ComputeMethod 结构体，包含名字、类型\n#[derive(PartialEq)]\npub struct ComputeMethod(pub &'static str, pub ComputeMethodType);\n\n// 计算方法列表\nimpl ComputeMethod {\n    pub const FORCE_ATLAS2: ComputeMethod = ComputeMethod(\"Force Atlas 2\", ComputeMethodType::Continuous);\n    pub const RANDOMIZE: ComputeMethod = ComputeMethod(\"Randomize\", ComputeMethodType::OneStep);\n}\n\n// 绘图 Model，存放计算状态与计算资源\npub struct GraphicsModel {\n    pub is_computing: bool,\n    pub is_dispatching: bool,\n    pub is_hover_graphics_view: bool,\n    pub compute_render_state: egui_wgpu::RenderState,\n    pub graphics_resources: GraphicsResources,\n}\n\nimpl GraphicsModel {\n\n    // 初始化计算 Model，传入 eframe 初始化中的 render_state\n    // 仅启动时调用一次\n    pub fn init(cc: &eframe::CreationContext) -> Self {\n        Self {\n            is_computing: false,\n            is_dispatching: false,\n            is_hover_graphics_view: false,\n            compute_render_state: cc.wgpu_render_state.as_ref().unwrap().clone(),\n            graphics_resources: GraphicsResources::new(cc.wgpu_render_state.as_ref().unwrap().clone()),\n        }\n    }\n\n    // 重置计算 Model，dispose 并删除计算资源\n    pub fn reset(&mut self) {\n        self.graphics_resources.dispose();\n    }\n}\n\nimpl GraphicsModel {\n\n    // 切换是否持续计算\n    // 仅对 ComputeMethodType::Continuous 生效\n    pub fn switch_computing(&mut self) {\n        self.is_computing = !self.is_computing;\n        if self.is_computing { self.cancel_error_state() }\n    }\n\n    // 设置是否持续计算\n    // 仅对 ComputeMethodType::Continuous 生效\n    pub fn set_computing(&mut self, state: bool) {\n        self.is_computing = state;\n        if state { self.cancel_error_state() }\n    }\n\n    // 设置下一帧是否 Dispatch\n    // 仅对 ComputeMethodType::OneStep 生效\n    pub fn set_dispatching(&mut self, state: bool) {\n        self.is_dispatching = state;\n    }\n\n    pub fn cancel_error_state(&mut self) {\n        if self.graphics_resources.graph_resources.is_some() {\n            self.graphics_resources.graph_resources.as_mut().unwrap().is_kernel_error = false\n        }\n    }\n\n    pub fn render_output(&mut self, out_folder:String) {\n        let graphics_resources = &mut self.graphics_resources;\n\n        graphics_resources.prepare_output();\n        graphics_resources.render();\n        graphics_resources.output_png_after_render(out_folder.to_owned());\n\n    }\n}\n\npub struct RenderOptions {\n    pub is_rendering_node: bool,\n    pub is_rendering_edge: bool,\n    pub is_rendering_axis: bool,\n    pub is_rendering_bounding_box: bool,\n    pub is_showing_debug:  bool,\n}\n\npub struct ComputePipelines {\n    gen_node:              ComputeKernel,\n    cal_mass:              ComputeKernel,\n    cal_gravity:           ComputeKernel,\n    attractive_force:      ComputeKernel,\n    reduction_bounding:    ComputeKernel,\n    reduction_bounding_2:  ComputeKernel,\n    bounding_box:          ComputeKernel,\n    clear_1:               ComputeKernel,\n    tree_building:         ComputeKernel,\n    clear_2:               ComputeKernel,\n    summarization:         ComputeKernel,\n    sort:                  ComputeKernel,\n    electron_force:        ComputeKernel,\n    compute:               ComputeKernel,\n    displacement:          ComputeKernel,\n    randomize:             ComputeKernel,\n    copy:                  ComputeKernel,\n    cal_depth:             ComputeKernel,\n    sort_by_depth:         ComputeKernel,\n}\n\npub enum CastType {\n    Node,\n    Edge\n}\n\n// 绘图资源 Model，存放和计算和绘图相关的一切资源\npub struct GraphicsResources {\n\n    // 包含 Device、Queue、target_format 和 egui_rpass\n    render_state:                   egui_wgpu::RenderState,\n\n    // 视口大小\n    viewport_size:                  egui::Vec2,\n\n    viewport_texture_extent:        wgpu::Extent3d,\n    viewport_texture:               Option<Texture>,\n    viewport_msaa_texture:          Option<Texture>,\n    viewport_depth_texture:         Option<Texture>,\n\n    pub viewport_texture_id:        egui::TextureId,\n\n    is_render_output:               bool,\n\n    output_texture_extent:          wgpu::Extent3d,\n    output_texture:                 Option<Texture>,\n    output_msaa_texture:            Option<Texture>,\n    output_depth_texture:           Option<Texture>,\n\n    cast_texture_extent:          wgpu::Extent3d,\n    cast_texture:                 Option<Texture>,\n    cast_depth_texture:           Option<Texture>,\n\n    axis_render_pipeline:           wgpu::RenderPipeline,\n\n    // 相机\n    camera:                         Camera,\n    pub control:                    Controls,\n\n    // Buffers\n    quad_buffer:                    wgpu::Buffer,\n    render_uniform_buffer:          wgpu::Buffer,\n    bounding_box_vertex_buffer:     wgpu::Buffer,\n    bounding_box_index_buffer:      wgpu::Buffer,\n\n    render_uniform_bind_group_layout: wgpu::BindGroupLayout,\n    render_uniform_bind_group:      wgpu::BindGroup,\n\n    pub compute_frame_count:        u32,                      // 帧计数器\n    pub render_frame_count:         u32,                      // 帧计数器\n    last_time:                      i64,                      // 上次记录时间\n    last_frame:                     u32,                      // 上次记录帧数\n    pub frames_per_second:          f64,                      // FPS\n\n    pub render_options:             RenderOptions,\n    pub need_update:                bool,\n\n    pub cast_type:                  Option<CastType>,\n    pub cast_value:                 u32,\n\n    pub shaders:                    Vec<ShaderModule>,\n    pub compute_shader:             ComputeShader,\n\n    pub graph_resources:            Option<GraphResources>,\n}\n\npub struct GraphResources {\n\n    // 包含 Node / Edge Count\n    pub status:                     GraphicsStatus,\n\n    uniform_buffer:                 wgpu::Buffer,\n    node_buffer:                    wgpu::Buffer,\n    node_copy_buffer:               wgpu::Buffer,\n    node_edge_sort_range_buffer:    wgpu::Buffer,\n    edge_buffer:                    wgpu::Buffer,\n    edge_sort_node_buffer:          wgpu::Buffer,\n    edge_sort_dir_buffer:           wgpu::Buffer,\n    bounding_buffer:                wgpu::Buffer,\n    tree_buffer:                    wgpu::Buffer,\n    tree_node_buffer:               wgpu::Buffer,\n    tree_child_buffer:              wgpu::Buffer,\n    depth_sort_buffer:              wgpu::Buffer,\n    depth_sort_param_buffer:        wgpu::Buffer,\n    kernel_status_buffer:           wgpu::Buffer,\n\n    // Bind Group\n    node_render_bind_group:         wgpu::BindGroup,\n    edge_render_bind_group:         wgpu::BindGroup,\n    bounding_box_render_bind_group: wgpu::BindGroup,\n\n\n    pub debugger:                   GraphicsDebugger,\n    pub buffer_bytes:               Option<Vec<u8>>,\n\n    node_render_pipeline:           wgpu::RenderPipeline,\n    node_cast_render_pipeline:      wgpu::RenderPipeline,\n    edge_render_pipeline:           wgpu::RenderPipeline,\n    edge_cast_render_pipeline:      wgpu::RenderPipeline,\n    bounding_box_render_pipeline:   wgpu::RenderPipeline,\n\n    // 计算管线\n    pub kernel_status_codes:        Vec<i32>,\n    pub is_kernel_error:            bool,\n\n    // 线程组数 = 线程数 / 每组线程数\n    node_work_group_count:          u32,\n    edge_work_group_count:          u32,\n    edge_sort_work_group_count:     u32,\n    tree_node_work_group_count:     u32,\n    step_work_group_count:          u32,\n    bb_work_group_count:            u32,\n}\n\npub struct GraphicsDebugger {\n    debug_buffer:    wgpu::Buffer,\n    buffer_size:     u32,\n}\n\nimpl GraphicsResources {\n\n    // 在导入数据后调用的方法，初始化计算和绘图的资源\n    pub fn new(render_state: egui_wgpu::RenderState) -> Self {\n\n\n        // 从 render_state 中获取 wgpu 的 device 和 queue\n        let device = &render_state.device;\n        let _queue = &render_state.queue;\n\n        // 从文件中创建 Shader\n\n        let shader_files = [\n            include_str!(\"../assets/shaders/S_node.wgsl\"),\n            include_str!(\"../assets/shaders/S_edge.wgsl\"),\n            include_str!(\"../assets/shaders/S_axis.wgsl\"),\n            include_str!(\"../assets/shaders/S_bounding_box.wgsl\"),\n            include_str!(\"../assets/shaders/CS_graph_solver.wgsl\"),\n        ];\n\n        let mut shaders = shader_files.par_iter().map(|shader_file| unsafe {\n\n            let shader = device.create_shader_module_unchecked(wgpu::ShaderModuleDescriptor {\n                label: None,\n                source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(shader_file)),\n            });\n\n            shader\n\n        }).collect::<Vec<ShaderModule>>();\n\n        let compute_shader = shaders.pop().unwrap();\n\n        let render_uniform_bind_group_layout =      BindGroupLayout::create_render_uniform_bind_group_layout(device).bing_group_layout;\n\n        let axis_shader = &shaders[2];\n\n        let axis_render_pipeline = RenderPipeline::create_axis_render_pipeline(\n            device,\n            &[&render_uniform_bind_group_layout],\n            axis_shader\n        ).render_pipeline;\n\n\n\n        // Quad 顶点数据\n        let vertex_buffer_data =\n            [\n                // 0\n                -1.0f32, -1.0,\n                // 1\n                1.0, -1.0,\n                // 2\n                -1.0, 1.0,\n                // 3\n                1.0, 1.0,\n            ];\n\n        // 创建 Quad Buffer 并传入数据\n        let quad_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {\n            label: Some(\"Vertex Buffer\"),\n            contents: bytemuck::bytes_of(&vertex_buffer_data),\n            usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,\n        });\n\n        let vertex_buffer_data: &[f32] = &[\n                -1.0, -1.0, -1.0,\n                 1.0, -1.0, -1.0,\n                -1.0,  1.0, -1.0,\n                 1.0,  1.0, -1.0,\n                -1.0, -1.0,  1.0,\n                 1.0, -1.0,  1.0,\n                -1.0,  1.0,  1.0,\n                 1.0,  1.0,  1.0,\n            ];\n\n        let index_buffer_data: &[u16] = &[\n            0, 1, 1, 3, 3, 2, 2, 0,\n            0, 4, 1, 5, 2, 6, 3, 7,\n            4, 5, 5, 7, 7, 6, 6, 4,\n        ];\n\n        let bounding_box_vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {\n            label: Some(\"Vertex Buffer\"),\n            contents: bytemuck::cast_slice(&vertex_buffer_data),\n            usage: wgpu::BufferUsages::VERTEX,\n        });\n\n        let bounding_box_index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {\n            label: Some(\"Index Buffer\"),\n            contents: bytemuck::cast_slice(&index_buffer_data),\n            usage: wgpu::BufferUsages::INDEX,\n        });\n\n\n        let camera = Camera::from(Vec3::new(3.0, 3.0, 6.0));\n        let control = Controls::new();\n\n        //\n        let render_uniform_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Render Uniform Buffer\"),\n            size: mem::size_of::<Uniforms>() as _,\n            usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        let render_uniform_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {\n            layout: &render_uniform_bind_group_layout,\n            entries: &[\n                wgpu::BindGroupEntry {\n                    binding: 0,\n                    resource: render_uniform_buffer.as_entire_binding(),\n                },\n            ],\n            label: None,\n        });\n\n        let compute_shader = ComputeShader {\n            shader: compute_shader,\n            device: device.clone(),\n            kernels: Default::default()\n        };\n\n\n        let graphics_resources = GraphicsResources {\n            render_state,\n            viewport_depth_texture: None,\n            output_depth_texture: None,\n            cast_texture_extent: Default::default(),\n            cast_texture: None,\n            viewport_texture: None,\n            viewport_msaa_texture: None,\n            output_texture: None,\n            output_msaa_texture: None,\n            viewport_texture_id: Default::default(),\n            viewport_size: Default::default(),\n            viewport_texture_extent: Default::default(),\n            output_texture_extent: Default::default(),\n            is_render_output: false,\n            camera,\n            control,\n            quad_buffer,\n            bounding_box_vertex_buffer,\n            bounding_box_index_buffer,\n            render_uniform_buffer,\n            render_uniform_bind_group,\n            axis_render_pipeline,\n            compute_frame_count: 0,\n            render_frame_count: 0,\n            last_time: 0,\n            last_frame: 0,\n            frames_per_second: 0.0,\n            render_options: RenderOptions {\n                is_rendering_node: true,\n                is_rendering_edge: true,\n                is_rendering_axis: false,\n                is_rendering_bounding_box: false,\n                is_showing_debug: false\n            },\n            need_update: true,\n            cast_depth_texture: None,\n            cast_type: None,\n            cast_value: 0,\n            shaders,\n            compute_shader,\n            graph_resources: None,\n            render_uniform_bind_group_layout\n        };\n\n        graphics_resources\n\n    }\n\n    pub fn init_data(&mut self, render_state: egui_wgpu::RenderState, model: &mut DataModel) {\n\n        let device = &render_state.device;\n        let _queue = &render_state.queue;\n\n        let status = model.status.clone();\n\n\n        // 从 Graphics Model 中获取 Node 和 Edge 的数量\n        let node_count = model.status.node_count as u32;\n        let edge_count = model.status.edge_count as u32;\n        let edge_sort_count = (model.status.edge_count * 2) as u32;\n        let tree_node_count = get_tree_node_count(&node_count);\n\n        // Node 和 Edge 结构体的占内存大小，用于计算 Buffer 长度\n        let node_struct_size = mem::size_of::<Node>();\n\n        let shaders = &self.shaders;\n\n        let node_shader = &shaders[0];\n        let edge_shader = &shaders[1];\n        let axis_shader = &shaders[2];\n        let bounding_box_shader = &shaders[3];\n\n\n        // Bind Group Layout\n        // Bind Group 的布局，允许在布局不变的情况下更换 Bind Group 绑定的 Buffer\n\n        let node_render_bind_group_layout =         BindGroupLayout::create_node_render_bind_group_layout(device).bing_group_layout;\n        let edge_render_bind_group_layout =         BindGroupLayout::create_edge_render_bind_group_layout(device).bing_group_layout;\n        let bounding_box_render_bind_group_layout = BindGroupLayout::create_bounding_box_render_bind_group_layout(device).bing_group_layout;\n\n\n        // Render Pipeline\n        // 渲染管线\n\n        let node_render_pipeline = RenderPipeline::create_node_render_pipeline(\n            device,\n            &[&self.render_uniform_bind_group_layout, &node_render_bind_group_layout],\n            node_shader,\n            false,\n        ).render_pipeline;\n\n        let node_cast_render_pipeline = RenderPipeline::create_node_render_pipeline(\n            device,\n            &[&self.render_uniform_bind_group_layout, &node_render_bind_group_layout],\n            node_shader,\n            true,\n        ).render_pipeline;\n\n        let edge_render_pipeline = RenderPipeline::create_edge_render_pipeline(\n            device,\n            &[&self.render_uniform_bind_group_layout, &edge_render_bind_group_layout],\n            edge_shader,\n            false,\n        ).render_pipeline;\n\n        let edge_cast_render_pipeline = RenderPipeline::create_edge_render_pipeline(\n            device,\n            &[&self.render_uniform_bind_group_layout, &edge_render_bind_group_layout],\n            edge_shader,\n            true,\n        ).render_pipeline;\n\n        let bounding_box_render_pipeline = RenderPipeline::create_bounding_box_render_pipeline(\n            device,\n            &[&self.render_uniform_bind_group_layout, &bounding_box_render_bind_group_layout],\n            bounding_box_shader\n        ).render_pipeline;\n\n\n        // 计算线程组数\n        // 线程组数 = 线程数 / 每组线程数（取整）\n\n        let node_work_group_count =\n            ((node_count as f32) / (PARTICLES_PER_GROUP as f32)).ceil() as u32;\n\n        let edge_work_group_count =\n            ((edge_count as f32) / (PARTICLES_PER_GROUP as f32)).ceil() as u32;\n\n        let edge_sort_work_group_count =\n            ((edge_sort_count as f32) / (PARTICLES_PER_GROUP as f32)).ceil() as u32;\n\n        let tree_node_work_group_count =\n            (tree_node_count as f32 / (PARTICLES_PER_GROUP as f32)).ceil() as u32;\n\n        let step_work_group_count =\n            (std::cmp::min(node_count, 16384) as f32 / PARTICLES_PER_GROUP as f32).ceil() as u32;\n\n        let bb_work_group_count =\n            ((node_work_group_count as f32) / (PARTICLES_PER_GROUP as f32)).ceil() as u32;\n\n        // Buffer 创建\n\n        let compute_uniform = ComputeUniforms {\n            frame_num: 0,\n            node_count,\n            edge_count,\n            edge_sort_count,\n            tree_node_count,\n            bounding_count: node_work_group_count,\n            kernel_status_count: KERNEL_NAMES.len() as u32,\n        };\n\n        // 创建 Uniform Buffer\n        let uniform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {\n            label: None,\n            contents: bytemuck::cast_slice(&[compute_uniform]),\n            usage: wgpu::BufferUsages::UNIFORM |\n                wgpu::BufferUsages::COPY_DST,\n        });\n\n\n        // 计算对齐后的 Node Buffer 大小\n        let node_buffer_size = pad_size(node_struct_size, node_count);\n\n        // 指定大小，创建 Node Buffer，不初始化数据\n        let node_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Node Buffer\"),\n            size: node_buffer_size,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        // 计算对齐后的 Node Buffer 大小\n        let node_copy_buffer_size = node_count * 3 * 4;\n\n        // 指定大小，创建 Node Buffer，不初始化数据\n        let node_copy_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Node Copy Buffer\"),\n            size: node_copy_buffer_size as _,\n            usage: wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST\n                | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n        let node_edge_sort_range_buffer_size = node_count * 2 * 4;\n\n        let node_edge_sort_range_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Node Edge Sort Range Buffer\"),\n            size: node_edge_sort_range_buffer_size as _,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST\n                | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n        let spring_force_buffer_size = node_count * 4 * 4;\n\n        let spring_force_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Node Buffer\"),\n            size: spring_force_buffer_size as wgpu::BufferAddress,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        let bounding_buffer_size = node_work_group_count * 8 * 4;\n\n        let bounding_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Bounding Buffer\"),\n            size: bounding_buffer_size as wgpu::BufferAddress,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        let depth_sort_buffer_size = node_count * 2 * 4;\n\n        let depth_sort_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Depth Sort Buffer\"),\n            size: depth_sort_buffer_size as wgpu::BufferAddress,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        let depth_sort_param_buffer_size = 2 * 4;\n\n        let depth_sort_param_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Depth Sort Param Buffer\"),\n            size: depth_sort_param_buffer_size as wgpu::BufferAddress,\n            usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        // 新建 Edge Buffer 并传入数据\n        let edge_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {\n            label: Some(\"Edge Buffer\"),\n            contents: bytemuck::cast_slice(model.source_target_list.as_ref().unwrap()),\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST,\n        });\n\n        let edge_sort_node_buffer_size = edge_sort_count * 2 * 4;\n\n        let edge_sort_node_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Edge Sort Node Buffer\"),\n            size: edge_sort_node_buffer_size as _,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST\n                | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n        let edge_sort_dir_buffer_size = edge_sort_count * 4 * 4;\n\n        let edge_sort_dir_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Edge Sort Dir Buffer\"),\n            size: edge_sort_dir_buffer_size as _,\n            usage: wgpu::BufferUsages::VERTEX\n                | wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST\n                | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n        // Tree Buffer\n        let tree_buffer_size = pad_size(mem::size_of::<BHTree>(), 1);\n        let tree_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Tree Buffer\"),\n            size: tree_buffer_size,\n            usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false\n        });\n\n        // Tree Node Buffer\n        let tree_node_buffer_size = 4 * ((tree_node_count + 1) * 8);\n        let tree_node_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Tree Node Buffer\"),\n            size: tree_node_buffer_size as _,\n            usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n        // Tree Child Buffer\n        let tree_child_buffer_size = 4 * ((tree_node_count + 1) * 8);\n        let tree_child_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Tree Child Buffer\"),\n            size: tree_child_buffer_size as _,\n            usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n        // 清空 Model 中的 Source Target List\n        model.clear_source_target_list();\n\n\n        // Bind Group\n        // 用于绑定 Buffer 与 Bind Group Layout，后连接 Pipeline Layout 和 Pipeline\n        // 需与 Bind Group Layout 保持索引和容量一致\n\n        // Node Render Bind Group\n        let node_render_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {\n            layout: &node_render_bind_group_layout,\n            entries: &[\n                wgpu::BindGroupEntry {\n                    binding: 0,\n                    resource: node_buffer.as_entire_binding(),\n                },\n                wgpu::BindGroupEntry {\n                    binding: 1,\n                    resource: depth_sort_buffer.as_entire_binding(),\n                },\n            ],\n            label: None,\n        });\n\n        // Edge Render Bind Group\n        let edge_render_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {\n            layout: &edge_render_bind_group_layout,\n            entries: &[\n                wgpu::BindGroupEntry {\n                    binding: 0,\n                    resource: node_buffer.as_entire_binding(),\n                },\n                wgpu::BindGroupEntry {\n                    binding: 1,\n                    resource: edge_buffer.as_entire_binding(),\n                },\n            ],\n            label: None,\n        });\n\n        // Edge Render Bind Group\n        let bounding_box_render_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {\n            layout: &bounding_box_render_bind_group_layout,\n            entries: &[\n                wgpu::BindGroupEntry {\n                    binding: 0,\n                    resource: bounding_buffer.as_entire_binding(),\n                },\n            ],\n            label: None,\n        });\n\n\n        let kernel_status_buffer_size = KERNEL_STATUS_COUNT * 4;\n        let kernel_status_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Kernel Status Buffer\"),\n            size: kernel_status_buffer_size as wgpu::BufferAddress,\n            usage: wgpu::BufferUsages::STORAGE\n                | wgpu::BufferUsages::COPY_DST\n                | wgpu::BufferUsages::COPY_SRC,\n            mapped_at_creation: false\n        });\n\n\n        let debug_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Debug Buffer\"),\n            size: kernel_status_buffer_size as _,\n            usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false,\n        });\n\n        let debugger = GraphicsDebugger {\n            debug_buffer,\n            buffer_size: kernel_status_buffer_size as _,\n        };\n\n        let graph_compute = &mut self.compute_shader;\n\n        graph_compute.create_compute_kernel(\"init_kernel_status\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"gen_node\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 3,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: spring_force_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_edge_sort_range_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 14,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_edge_sort_range_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"cal_mass\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 2,\n                buffer_type: ComputeBufferType::StorageReadOnly,\n                buffer: edge_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"cal_gravity_force\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n        ]);\n\n        graph_compute.create_compute_kernel(\"prepare_edge_sort\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 12,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_dir_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 2,\n                buffer_type: ComputeBufferType::StorageReadOnly,\n                buffer: edge_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"sort_edge\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 12,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_dir_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 9,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: depth_sort_param_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"compute_node_edge_sort_range\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 12,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_dir_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 14,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_edge_sort_range_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"compute_node_edge_sort_range_2\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 12,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_dir_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 14,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_edge_sort_range_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"spring_force_reduction\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 3,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: spring_force_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 12,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_dir_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 14,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_edge_sort_range_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"spring_force\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 3,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: spring_force_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 13,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: edge_sort_dir_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 14,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_edge_sort_range_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"reduction_bounding\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 4,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: bounding_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"reduction_bounding_2\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 4,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: bounding_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"bounding_box\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 4,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: bounding_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 5,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 6,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_node_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"clear_1\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 7,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_child_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"tree_building\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 5,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 6,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 7,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_child_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"clear_2\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 6,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_node_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"summarization\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 5,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 6,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 7,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_child_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"sort\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 5,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 6,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 7,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_child_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"electron_force\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 5,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 6,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 7,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: tree_child_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"main\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 3,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: spring_force_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"displacement\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"randomize\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"copy\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 15,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_copy_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"cal_depth\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 1,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: node_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 8,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: depth_sort_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 10,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: self.render_uniform_buffer.as_entire_binding(),\n            },\n        ]);\n        graph_compute.create_compute_kernel(\"sort_by_depth\", vec![\n            ComputeBuffer {\n                binding: 0,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: uniform_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 8,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: depth_sort_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 9,\n                buffer_type: ComputeBufferType::Uniform,\n                buffer: depth_sort_param_buffer.as_entire_binding(),\n            },\n            ComputeBuffer {\n                binding: 11,\n                buffer_type: ComputeBufferType::Storage,\n                buffer: kernel_status_buffer.as_entire_binding(),\n            },\n        ]);\n\n        let graph_resources = GraphResources {\n            status,\n            uniform_buffer,\n            node_buffer,\n            node_copy_buffer,\n            node_edge_sort_range_buffer,\n            edge_buffer,\n            edge_sort_node_buffer,\n            edge_sort_dir_buffer,\n            bounding_buffer,\n            tree_buffer,\n            tree_node_buffer,\n            tree_child_buffer,\n            depth_sort_buffer,\n            depth_sort_param_buffer,\n            kernel_status_buffer,\n            node_render_bind_group,\n            edge_render_bind_group,\n            bounding_box_render_bind_group,\n            debugger,\n            buffer_bytes: None,\n            node_render_pipeline,\n            node_cast_render_pipeline,\n            edge_render_pipeline,\n            edge_cast_render_pipeline,\n            bounding_box_render_pipeline,\n            kernel_status_codes: vec![-1; KERNEL_STATUS_COUNT],\n            is_kernel_error: false,\n            node_work_group_count,\n            edge_work_group_count,\n            edge_sort_work_group_count,\n            tree_node_work_group_count,\n            step_work_group_count,\n            bb_work_group_count\n        };\n\n        self.graph_resources = Some(graph_resources);\n\n        self.gen_node();\n        self.prepare_cast();\n        self.need_update = true;\n\n    }\n\n    pub fn compute(&mut self) {\n\n        if self.graph_resources.is_none() { return; }\n        let graph_resources = self.graph_resources.as_ref().unwrap();\n\n        let device = self.render_state.device.clone();\n        let queue = self.render_state.queue.clone();\n\n        let mut command_encoder =\n            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n        command_encoder.push_debug_group(\"compute render movement\");\n        {\n            // compute pass\n            let mut cpass =\n                command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"init_kernel_status\", 1);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"cal_gravity_force\", graph_resources.node_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"spring_force_reduction\", graph_resources.edge_sort_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"spring_force\", graph_resources.node_work_group_count);\n\n            Self::calc_bounding_box(&self, &mut cpass);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"bounding_box\", 1);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"clear_1\", graph_resources.tree_node_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"tree_building\", graph_resources.step_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"clear_2\", graph_resources.tree_node_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"summarization\", graph_resources.step_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"sort\", graph_resources.step_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"electron_force\", graph_resources.step_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"main\", graph_resources.node_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"displacement\", graph_resources.node_work_group_count);\n\n        }\n\n        // Self::debug(self);\n\n        // queue.submit(Some(command_encoder.finish()));\n        self.compute_frame_count += 1;\n        // device.poll(wgpu::Maintain::Wait);\n\n        let graph_resources = self.graph_resources.as_mut().unwrap();\n\n        let debugger = &mut graph_resources.debugger;\n        command_encoder.copy_buffer_to_buffer(&graph_resources.kernel_status_buffer, 0, &debugger.debug_buffer, 0, debugger.buffer_size as _);\n        queue.submit(Some(command_encoder.finish()));\n\n        let (sender, receiver) = futures_intrusive::channel::shared::oneshot_channel();\n        let buffer_slice = debugger.debug_buffer.slice(..);\n        buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap());\n        device.poll(wgpu::Maintain::Wait);\n\n        pollster::block_on(async {\n            if let Some(Ok(())) = receiver.receive().await {\n                let data = buffer_slice.get_mapped_range();\n                let result: Vec<i32> = bytemuck::cast_slice(&data).to_vec();\n\n                let content = format!(\"{:?}\", &result);\n\n                if *result.par_iter().max().unwrap() > 0 {\n                    message_error(\"Kernel Error\", content.as_str());\n                    graph_resources.is_kernel_error = true;\n                } else {\n                    graph_resources.is_kernel_error = false;\n                    if *result.par_iter().min().unwrap() < 0 {\n                        message_warning(\"Kernel Warning\", content.as_str());\n                    }\n                }\n\n                if result.len() == KERNEL_STATUS_COUNT {\n                    graph_resources.kernel_status_codes = result;\n                }\n\n                drop(data);\n                debugger.debug_buffer.unmap();\n\n\n            } else {\n                panic!(\"failed to run compute on gpu!\")\n            }\n        });\n\n    }\n\n    pub fn debug<'a>(&'a mut self) {\n\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let graph_resources = self.graph_resources.as_ref().unwrap();\n\n        let debug_buffer_size = graph_resources.status.node_count * 3 * 4;\n        let debug_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: Some(\"Debug Buffer\"),\n            size: debug_buffer_size as _,\n            usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false,\n        });\n\n        let mut command_encoder =\n            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n\n        {\n            let mut cpass =\n                command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"copy\", graph_resources.node_work_group_count);\n        }\n        queue.submit(Some(command_encoder.finish()));\n\n        let mut command_encoder_2 =\n            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n\n        command_encoder_2.copy_buffer_to_buffer(&graph_resources.node_copy_buffer, 0, &debug_buffer, 0, debug_buffer_size as _);\n        queue.submit(Some(command_encoder_2.finish()));\n\n        let (sender, receiver) = futures_intrusive::channel::shared::oneshot_channel();\n        let buffer_slice = debug_buffer.slice(..);\n        buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap());\n        device.poll(wgpu::Maintain::Wait);\n\n        let graph_resources = self.graph_resources.as_mut().unwrap();\n        pollster::block_on(async {\n            if let Some(Ok(())) = receiver.receive().await {\n                let data = buffer_slice.get_mapped_range();\n                let result: Vec<u8> = bytemuck::cast_slice(&data).to_vec();\n\n                // let content = format!(\"{:?}\", &result);\n                // println!(\"{}\", content);\n                // println!(\"{}\", result.len());\n                graph_resources.buffer_bytes = Some(result);\n\n            } else {\n                panic!(\"failed to run compute on gpu!\")\n            }\n        });\n\n    }\n\n    pub fn calc_bounding_box<'a>(&'a self, cpass: &mut ComputePass<'a>) {\n        let graph_resources = self.graph_resources.as_ref().unwrap();\n        Self::dispatch_compute_kernel(&self, cpass, \"reduction_bounding\", graph_resources.node_work_group_count);\n\n\n        let mut bound_range = graph_resources.bb_work_group_count;\n\n        loop {\n            Self::dispatch_compute_kernel(&self, cpass, \"reduction_bounding_2\", bound_range);\n\n            if bound_range <= 1 { break; }\n            bound_range = ((bound_range as f32) / (PARTICLES_PER_GROUP as f32)).ceil() as u32;\n\n        }\n    }\n\n    pub fn dispatch_compute_kernel<'a>(&'a self, cpass: &mut ComputePass<'a>, kernel_name: &'a str, work_group_count: u32) {\n        cpass.set_pipeline(&self.compute_shader.kernels.get(kernel_name).unwrap().compute_pipeline);\n        cpass.set_bind_group(0, &self.compute_shader.kernels.get(kernel_name).unwrap().bind_group, &[]);\n        cpass.dispatch_workgroups(work_group_count, 1, 1);\n    }\n\n\n    pub fn gen_node(&mut self) {\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let graph_resources = &self.graph_resources.as_ref().unwrap();\n\n        let mut command_encoder =\n            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n        command_encoder.push_debug_group(\"Gen Node\");\n        {\n            // compute pass\n            let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"gen_node\", graph_resources.node_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"cal_mass\", graph_resources.edge_work_group_count);\n\n            Self::calc_bounding_box(&self, &mut cpass);\n        }\n        command_encoder.pop_debug_group();\n        queue.submit(Some(command_encoder.finish()));\n\n\n        // calc depth\n        let command_buffer = {\n            let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());\n            {\n                let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n\n                Self::dispatch_compute_kernel(&self, &mut cpass, \"prepare_edge_sort\", graph_resources.edge_work_group_count);\n\n            }\n            command_encoder.finish()\n        };\n        queue.submit(Some(command_buffer));\n\n        // sort\n        {\n            let mut dim = 2;\n            while dim < (graph_resources.status.edge_count * 2) * 2 {\n                let mut block_count = dim >> 1;\n                queue.write_buffer(&graph_resources.depth_sort_param_buffer, 0, bytemuck::cast_slice(&[dim as u32]));\n                while block_count > 0 {\n                    queue.write_buffer(&graph_resources.depth_sort_param_buffer, 4, bytemuck::cast_slice(&[block_count as u32]));\n                    let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());\n                    {\n                        let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n                        Self::dispatch_compute_kernel(&self, &mut cpass, \"sort_edge\", graph_resources.edge_sort_work_group_count);\n                    }\n                    queue.submit(Some(command_encoder.finish()));\n                    block_count = block_count >> 1;\n                }\n                dim = dim << 1;\n            }\n        };\n\n        let mut command_encoder =\n            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n        command_encoder.push_debug_group(\"compute_node_edge_sort_range\");\n        {\n            // compute pass\n            let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"compute_node_edge_sort_range\", graph_resources.edge_sort_work_group_count);\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"compute_node_edge_sort_range_2\", graph_resources.edge_sort_work_group_count);\n        }\n        command_encoder.pop_debug_group();\n        queue.submit(Some(command_encoder.finish()));\n\n        self.compute_frame_count += 1;\n    }\n\n    pub fn randomize(&mut self) {\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let graph_resources = self.graph_resources.as_ref().unwrap();\n\n        let mut command_encoder =\n            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n\n        queue.write_buffer(&graph_resources.uniform_buffer, 0, bytemuck::cast_slice(&[self.compute_frame_count as u32]));\n        command_encoder.push_debug_group(\"randomize render position\");\n        {\n            // compute pass\n            let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"randomize\", graph_resources.node_work_group_count);\n\n            Self::dispatch_compute_kernel(&self, &mut cpass, \"copy\", graph_resources.node_work_group_count);\n\n            Self::calc_bounding_box(&self, &mut cpass);\n        }\n        command_encoder.pop_debug_group();\n        queue.submit(Some(command_encoder.finish()));\n        self.compute_frame_count += 1;\n    }\n\n    pub fn render(&mut self) {\n\n        let is_graph_resources = self.graph_resources.is_some();\n\n        let new_time = Utc::now().timestamp_millis();\n        let delta_time = new_time - self.last_time;\n        if delta_time >= 300 {\n            self.frames_per_second = (1000 * (self.render_frame_count - self.last_frame)) as f64 / delta_time as f64;\n            self.last_time = new_time;\n            self.last_frame = self.render_frame_count;\n        }\n\n        self.render_frame_count += 1u32;\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let is_render_output = self.is_render_output;\n        self.is_render_output = false;\n\n        let\n            (\n                resolve_target,\n                view,\n                depth_view\n            )\n            = if !is_render_output\n        {\n            (\n                Some(&self.viewport_texture.as_ref().unwrap().view),\n                &self.viewport_msaa_texture.as_ref().unwrap().view,\n                &self.viewport_depth_texture.as_ref().unwrap().view\n            )\n        } else {\n            (\n                Some(&self.output_texture.as_ref().unwrap().view),\n                &self.output_msaa_texture.as_ref().unwrap().view,\n                &self.output_depth_texture.as_ref().unwrap().view\n            )\n        };\n\n        let color_attachment;\n\n        color_attachment = Some(wgpu::RenderPassColorAttachment {\n            view,\n            resolve_target,\n            ops: wgpu::Operations {\n                load: wgpu::LoadOp::Clear(if !is_render_output { wgpu::Color::TRANSPARENT } else { wgpu::Color::BLACK }),\n                store: false,\n            },\n        });\n\n        let render_pass_descriptor = wgpu::RenderPassDescriptor {\n            label: None,\n            color_attachments: &[color_attachment],\n            depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {\n                view: &depth_view,\n                depth_ops: Some(wgpu::Operations {\n                    load: wgpu::LoadOp::Clear(1.0),\n                    store: true,\n                }),\n                stencil_ops: None,\n            }),\n        };\n\n        if self.render_options.is_rendering_node && is_graph_resources {\n            let graph_resources = self.graph_resources.as_ref().unwrap();\n\n            // calc depth\n            let command_buffer = {\n                let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());\n                {\n                    let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n\n                    Self::dispatch_compute_kernel(&self, &mut cpass, \"cal_depth\", graph_resources.node_work_group_count);\n\n                }\n                command_encoder.finish()\n            };\n            queue.submit(Some(command_buffer));\n\n            // sort\n            {\n                let mut dim = 2;\n                while dim < graph_resources.status.node_count * 2 {\n                    let mut block_count = dim >> 1;\n                    queue.write_buffer(&graph_resources.depth_sort_param_buffer, 0, bytemuck::cast_slice(&[dim as u32]));\n                    while block_count > 0 {\n                        queue.write_buffer(&graph_resources.depth_sort_param_buffer, 4, bytemuck::cast_slice(&[block_count as u32]));\n                        let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());\n                        {\n                            let mut cpass = command_encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None });\n                            Self::dispatch_compute_kernel(&self, &mut cpass, \"sort_by_depth\", graph_resources.node_work_group_count);\n                        }\n                        queue.submit(Some(command_encoder.finish()));\n                        block_count = block_count >> 1;\n                    }\n                    dim = dim << 1;\n                }\n            };\n\n        }\n\n        // render\n        let command_buffer = {\n            let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());\n            {\n                let mut rpass = command_encoder.begin_render_pass(&render_pass_descriptor);\n                if !is_render_output {\n                    if self.render_options.is_rendering_axis {\n                        rpass.set_pipeline(&self.axis_render_pipeline);\n                        rpass.set_bind_group(0, &self.render_uniform_bind_group, &[]);\n                        rpass.set_vertex_buffer(0, self.quad_buffer.slice(..));\n                        rpass.draw(0..4, 0..2);\n                    }\n                }\n                if is_graph_resources {\n                    let graph_resources = self.graph_resources.as_ref().unwrap();\n\n                    if !is_render_output {\n\n                        if self.render_options.is_rendering_bounding_box {\n                            rpass.set_pipeline(&graph_resources.bounding_box_render_pipeline);\n                            rpass.set_bind_group(0, &self.render_uniform_bind_group, &[]);\n                            rpass.set_bind_group(1, &graph_resources.bounding_box_render_bind_group, &[]);\n                            rpass.set_index_buffer(self.bounding_box_index_buffer.slice(..), wgpu::IndexFormat::Uint16);\n                            rpass.set_vertex_buffer(0, self.bounding_box_vertex_buffer.slice(..));\n                            rpass.draw_indexed(0..24, 0, 0..1);\n                        }\n                    }\n\n                    if self.render_options.is_rendering_node {\n                        rpass.set_pipeline(&graph_resources.node_render_pipeline);\n                        rpass.set_bind_group(0, &self.render_uniform_bind_group, &[]);\n                        rpass.set_bind_group(1, &graph_resources.node_render_bind_group, &[]);\n                        rpass.set_vertex_buffer(0, self.quad_buffer.slice(..));\n                        rpass.draw(0..4, 0..graph_resources.status.node_count as u32);\n                    }\n\n\n                    if self.render_options.is_rendering_edge {\n                        rpass.set_pipeline(&graph_resources.edge_render_pipeline);\n                        rpass.set_bind_group(0, &self.render_uniform_bind_group, &[]);\n                        rpass.set_bind_group(1, &graph_resources.edge_render_bind_group, &[]);\n                        rpass.set_vertex_buffer(0, self.quad_buffer.slice(..));\n                        rpass.draw(0..4, 0..graph_resources.status.edge_count as u32);\n                    }\n                }\n            }\n            command_encoder.finish()\n        };\n        queue.submit(Some(command_buffer));\n\n    }\n\n    pub fn update_viewport(&mut self, new_size: Vec2) {\n\n        let device = &self.render_state.device;\n        let _queue = &self.render_state.queue;\n\n        if self.viewport_size != new_size {\n            self.viewport_size = new_size;\n\n            self.camera.set_aspect_ratio(new_size.x / new_size.y as f32);\n\n            let texture_extent = wgpu::Extent3d {\n                width: self.viewport_size.x as u32,\n                height: self.viewport_size.y as u32,\n                depth_or_array_layers: 1,\n            };\n\n            let texture = Texture::create_texture(device, &texture_extent, 1, false);\n            let msaa_texture = Texture::create_texture(device, &texture_extent, 4, false);\n            let depth_texture = Texture::create_depth_texture(&device, &texture_extent, \"depth_texture\", true);\n\n            if self.viewport_texture.is_some() {\n                self.render_state.renderer.write().free_texture(&self.viewport_texture_id);\n            }\n            let texture_id = self.render_state.renderer.write().register_native_texture(device, &texture.view, wgpu::FilterMode::Linear);\n\n            self.viewport_texture_extent = texture_extent;\n            self.viewport_texture = Some(texture);\n            self.viewport_msaa_texture = Some(msaa_texture);\n            self.viewport_depth_texture = Some(depth_texture);\n            self.viewport_texture_id = texture_id;\n\n            self.need_update = true;\n        }\n    }\n\n\n    pub fn prepare_cast(&mut self) {\n\n        let device = &self.render_state.device;\n        let _queue = &self.render_state.queue;\n\n        let cast_texture_extent = wgpu::Extent3d {\n            width: 1 as _,\n            height: 1 as _,\n            depth_or_array_layers: 1,\n        };\n\n        let cast_texture = Texture::create_texture(device, &cast_texture_extent, 1, true);\n        let cast_depth_texture = Texture::create_depth_texture(&device, &cast_texture_extent, \"cast_depth_texture\", false);\n\n        self.cast_texture_extent = cast_texture_extent;\n        self.cast_texture = Some(cast_texture);\n        self.cast_depth_texture = Some(cast_depth_texture);\n\n    }\n\n\n    pub fn render_cast(&mut self) {\n\n        if self.graph_resources.is_none() { return; }\n        let graph_resources = self.graph_resources.as_ref().unwrap();\n\n        if self.control.pointer_pos.is_none() { return; }\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let view = &self.cast_texture.as_ref().unwrap().view;\n        let depth_view = &self.cast_depth_texture.as_ref().unwrap().view;\n\n        let color_attachment = Some(wgpu::RenderPassColorAttachment {\n            view,\n            resolve_target: None,\n            ops: wgpu::Operations {\n                load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT),\n                store: true,\n            },\n        });\n\n        let render_pass_descriptor = wgpu::RenderPassDescriptor {\n            label: None,\n            color_attachments: &[color_attachment],\n            depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {\n                view: &depth_view,\n                depth_ops: Some(wgpu::Operations {\n                    load: wgpu::LoadOp::Clear(1.0),\n                    store: true,\n                }),\n                stencil_ops: None,\n            }),\n        };\n\n        // render\n        let command_buffer = {\n            let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default());\n            {\n                let mut rpass = command_encoder.begin_render_pass(&render_pass_descriptor);\n\n                if self.render_options.is_rendering_node {\n                    rpass.set_pipeline(&graph_resources.node_cast_render_pipeline);\n                    rpass.set_bind_group(0, &self.render_uniform_bind_group, &[]);\n                    rpass.set_bind_group(1, &graph_resources.node_render_bind_group, &[]);\n                    rpass.set_vertex_buffer(0, self.quad_buffer.slice(..));\n                    rpass.draw(0..4, 0..graph_resources.status.node_count as u32);\n                }\n\n                if self.render_options.is_rendering_edge {\n                    rpass.set_pipeline(&graph_resources.edge_cast_render_pipeline);\n                    rpass.set_bind_group(0, &self.render_uniform_bind_group, &[]);\n                    rpass.set_bind_group(1, &graph_resources.edge_render_bind_group, &[]);\n                    rpass.set_vertex_buffer(0, self.quad_buffer.slice(..));\n                    rpass.draw(0..4, 0..graph_resources.status.edge_count as u32);\n                }\n            }\n            command_encoder.finish()\n        };\n        queue.submit(Some(command_buffer));\n\n\n        self.copy_cast_data();\n    }\n\n\n    pub fn copy_cast_data(&mut self) {\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let buffer_dimensions = BufferDimensions::new(\n            self.cast_texture_extent.width as usize,\n            self.cast_texture_extent.height as usize,\n            16\n        );\n\n        let output_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: None,\n            size: (buffer_dimensions.padded_bytes_per_row * buffer_dimensions.height) as _,\n            usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false,\n        });\n\n        let command_buffer = {\n            let mut encoder =\n                device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n\n            encoder.copy_texture_to_buffer(\n                self.cast_texture.as_ref().unwrap().texture.as_image_copy(),\n                wgpu::ImageCopyBuffer {\n                    buffer: &output_buffer,\n                    layout: wgpu::ImageDataLayout {\n                        offset: 0,\n                        bytes_per_row: Some(\n                            std::num::NonZeroU32::new(buffer_dimensions.padded_bytes_per_row as u32)\n                                .unwrap(),\n                        ),\n                        rows_per_image: None,\n                    },\n                },\n                self.cast_texture_extent,\n            );\n\n            encoder.finish()\n        };\n\n        let submission_index = queue.submit(Some(command_buffer));\n\n        let (sender, receiver) = futures_intrusive::channel::shared::oneshot_channel();\n        let buffer_slice = output_buffer.slice(..16);\n        buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap());\n\n        device.poll(wgpu::Maintain::WaitForSubmissionIndex(submission_index));\n\n        pollster::block_on(async {\n            if let Some(Ok(())) = receiver.receive().await {\n                let data = buffer_slice.get_mapped_range();\n                let result: Vec<u32> = bytemuck::cast_slice(&data).to_vec();\n\n                match result[0] {\n                    1 => {\n                        self.cast_type = Some(CastType::Node);\n                        self.cast_value = result[1];\n                    }\n                    2 => {\n                        self.cast_type = Some(CastType::Edge);\n                        self.cast_value = result[1];\n                    }\n                    _ => {\n                        self.cast_type = None;\n                        self.cast_value = 0;\n                    }\n                }\n\n                let content = format!(\"{:?}\", &result);\n                // println!(\"{}\", content);\n                // println!(\"{}\", result.len());\n\n            } else {\n                panic!(\"failed to run compute on gpu!\")\n            }\n        });\n\n    }\n\n    pub fn prepare_output(&mut self) {\n\n        self.is_render_output = true;\n\n        let device = &self.render_state.device;\n        let _queue = &self.render_state.queue;\n\n        let output_texture_extent = wgpu::Extent3d {\n            width: (self.viewport_texture_extent.width * 2) as u32,\n            height: (self.viewport_texture_extent.height * 2) as u32,\n            depth_or_array_layers: 1,\n        };\n\n        let output_texture = Texture::create_texture(device, &output_texture_extent, 1, false);\n        let msaa_output_texture = Texture::create_texture(device, &output_texture_extent, 4, false);\n        let output_depth_texture = Texture::create_depth_texture(&device, &output_texture_extent, \"depth_texture\", true);\n\n        self.output_texture_extent = output_texture_extent;\n        self.output_texture = Some(output_texture);\n        self.output_msaa_texture = Some(msaa_output_texture);\n        self.output_depth_texture = Some(output_depth_texture);\n\n    }\n\n    pub fn output_png_after_render(&mut self, out_folder: String) {\n\n        let device = &self.render_state.device;\n        let queue = &self.render_state.queue;\n\n        let buffer_dimensions = BufferDimensions::new(\n            self.output_texture_extent.width as usize,\n            self.output_texture_extent.height as usize,\n            4\n        );\n\n        let output_buffer = device.create_buffer(&wgpu::BufferDescriptor {\n            label: None,\n            size: (buffer_dimensions.padded_bytes_per_row * buffer_dimensions.height) as u64,\n            usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST,\n            mapped_at_creation: false,\n        });\n\n        let command_buffer = {\n            let mut encoder =\n                device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });\n\n            encoder.copy_texture_to_buffer(\n                self.output_texture.as_ref().unwrap().texture.as_image_copy(),\n                wgpu::ImageCopyBuffer {\n                    buffer: &output_buffer,\n                    layout: wgpu::ImageDataLayout {\n                        offset: 0,\n                        bytes_per_row: Some(\n                            std::num::NonZeroU32::new(buffer_dimensions.padded_bytes_per_row as u32)\n                                .unwrap(),\n                        ),\n                        rows_per_image: None,\n                    },\n                },\n                self.output_texture_extent,\n            );\n\n            encoder.finish()\n        };\n\n        let index = queue.submit(Some(command_buffer));\n\n        let mut output_path = out_folder;\n        let formatted_time = Local::now().format(\"%Y.%m.%d_%H.%M.%S\");\n        let png_name = format!(\"/graphpu_render_{}_{}.png\", formatted_time, self.render_frame_count);\n        output_path += &png_name;\n        pollster::block_on(create_png(output_path, device, output_buffer, &buffer_dimensions, index));\n    }\n\n    pub fn update_control(&mut self, ui: &mut Ui, is_hover: bool, scale: f32) {\n\n        self.control.update_interaction(ui, is_hover);\n        self.control.update_camera(ui, &mut self.camera);\n\n        if self.control.is_update {\n            self.need_update = true;\n        }\n\n        if self.need_update || self.control.is_pointer_update {\n\n            let pointer_pos = if let Some(pos) = self.control.pointer_pos {\n                Some(glam::Vec2::new(pos.x * scale, pos.y * scale) )\n            } else {\n                None\n            };\n            update_render_uniforms(\n                &self.render_state.queue,\n                &mut self.camera,\n                &self.render_uniform_buffer,\n                glam::Vec2::new(self.viewport_size.x, self.viewport_size.y),\n                pointer_pos,\n                self.control.is_pointer_update\n            );\n        }\n\n        self.control.is_update = false;\n\n    }\n\n    pub fn dispose(&mut self) {\n\n        let graph_resources = self.graph_resources.as_mut().unwrap();\n        graph_resources.node_buffer.destroy();\n        graph_resources.edge_buffer.destroy();\n        graph_resources.bounding_buffer.destroy();\n        graph_resources.tree_buffer.destroy();\n        graph_resources.tree_node_buffer.destroy();\n        graph_resources.tree_child_buffer.destroy();\n        graph_resources.depth_sort_buffer.destroy();\n        graph_resources.depth_sort_param_buffer.destroy();\n\n        self.graph_resources = None;\n        self.need_update = true;\n        // self.render();\n    }\n\n\n}\n\nfn update_render_uniforms(\n    queue: &Queue,\n    camera: &mut Camera,\n    render_uniform_buffer: &wgpu::Buffer,\n    viewport_size: glam::Vec2,\n    pointer_pos: Option<glam::Vec2>,\n    is_pointer_update: bool,\n) {\n\n    let pos = if let Some(pos) = pointer_pos {\n        pos\n    } else {\n        glam::Vec2::ZERO\n    };\n\n    if camera.is_updated {\n\n        camera.update_projection_matrix();\n\n        let uniform = generate_uniforms(camera, viewport_size, pos);\n\n        queue.write_buffer(&render_uniform_buffer, 0, bytemuck::cast_slice(&[uniform]));\n        camera.is_updated = false;\n\n    } else if pointer_pos.is_some() && is_pointer_update {\n\n        let uniform = generate_uniforms(camera, viewport_size, pos);\n        queue.write_buffer(&render_uniform_buffer, 0, bytemuck::cast_slice(&[uniform]));\n\n    }\n\n}\n\n// 计算对齐后的 Buffer 长度\n// 结构体 Buffer 须向 16 byte 对齐，也就是 4 个 32 位变量\nfn pad_size(node_struct_size: usize, num_particles: u32) -> wgpu::BufferAddress {\n\n    let align_mask = wgpu::COPY_BUFFER_ALIGNMENT * 4 - 1;\n    let padded_size = ((node_struct_size as u64 + align_mask) & !align_mask).max(wgpu::COPY_BUFFER_ALIGNMENT);\n    let padded_size = (padded_size * num_particles as u64) as wgpu::BufferAddress;\n\n    padded_size\n}\n\nfn get_tree_node_count(node_count: &u32) -> u32 {\n    let mut tree_node_count = node_count * 2;\n    // println!(\"{}\", node_count);\n    while tree_node_count & (PARTICLES_PER_GROUP - 1) != 0 {\n        tree_node_count += 1;\n    }\n    // println!(\"{}\", tree_node_count - 1);\n    tree_node_count - 1\n}\n\n// fn dispatch_compute_kernel(cpass: &mut wgpu::ComputePass, compute_kernel: &ComputeKernel, work_group_count: u32) {\n//\n//     cpass.set_pipeline(&compute_kernel.compute_pipeline);\n//     cpass.set_bind_group(0, &compute_kernel.bind_group, &[]);\n//     cpass.dispatch_workgroups(work_group_count, 1, 1);\n// }"
  },
  {
    "path": "src/models/mod.rs",
    "content": "use crate::models::data_model::GraphicsStatus;\nuse std::path::PathBuf;\nuse crate::utils::file::{path_to_string, pick_folder};\nuse crate::utils::message::message_info;\n\nuse self::{app_model::ImportState, data_model::ExternalData};\n\npub mod app_model;\npub mod data_model;\npub mod graphics_lib;\npub mod graphics_model;\n\npub struct Models {\n    pub graphics_model: graphics_model::GraphicsModel,\n    pub data_model: data_model::DataModel,\n    pub app_model: app_model::AppModel,\n}\n\n#[derive(Debug)]\npub struct ImportedData {\n    pub node_file_path: String,\n    pub edge_file_path: String,\n    pub node_data: ExternalData,\n    pub edge_data: ExternalData,\n    pub source_index: usize,\n    pub target_index: usize,\n    pub source_target_list: Vec<u32>,\n    pub max_id: u32,\n}\n\nunsafe impl Send for ImportedData {}\n\nimpl Models {\n    pub fn setup_data(&mut self, data: ImportedData) {\n        let ImportedData {\n            node_file_path,\n            edge_file_path,\n            node_data,\n            edge_data,\n            source_index,\n            target_index,\n            source_target_list,\n            max_id,\n        } = data;\n        self.data_model.node_data = node_data;\n        self.data_model.edge_data = edge_data;\n        self.data_model.edge_source = Some(source_index);\n        self.data_model.edge_target = Some(target_index);\n        self.data_model.source_target_list = Some(source_target_list);\n        self.data_model.max_id = max_id;\n        self.data_model.set_status();\n        self.app_model.node_file_path = Some(PathBuf::from(node_file_path));\n        self.app_model.edge_file_path = Some(PathBuf::from(edge_file_path));\n        self.app_model.import_state = ImportState::Success;\n        self.app_model.is_import_visible = false;\n        self.graphics_model.graphics_resources.init_data(\n            self.graphics_model.compute_render_state.clone(),\n            &mut self.data_model,\n        );\n        let text = format!(\n            \"Node file: {}  \\nEdge file: {}\",\n            self.app_model.node_file_name().unwrap_or(\"\"),\n            self.app_model.edge_file_name().unwrap_or(\"\")\n        );\n        message_info(\"Import CSV Data Succeeded\", text.as_str());\n    }\n\n    pub fn clear_data(&mut self) {\n        self.app_model.import_state = ImportState::Initial;\n        self.app_model.node_file_path = None;\n        self.app_model.edge_file_path = None;\n        self.data_model.node_data = ExternalData::default();\n        self.data_model.edge_data = ExternalData::default();\n        self.data_model.max_id = 0;\n        self.graphics_model.reset();\n        self.data_model.status = GraphicsStatus::default();\n    }\n\n    pub fn pick_output_folder_and_then(output_folder: &mut String, mut then: impl FnMut(&str) -> ()) {\n        if output_folder.is_empty() {\n            *output_folder = path_to_string(&pick_folder()).unwrap_or(output_folder.clone());\n        }\n        if !output_folder.is_empty() {\n            then(output_folder);\n        }\n    }\n\n    pub fn render_output(&mut self) {\n        Self::pick_output_folder_and_then(&mut self.app_model.output_folder, |folder| {\n            self.graphics_model.render_output(String::from(folder));\n        });\n    }\n}\n"
  },
  {
    "path": "src/utils/constant.rs",
    "content": "\n\npub const FONT_SIZE_BODY: f32 = 11.0;\npub const FONT_SIZE_TITLE: f32 = 13.0;\npub const FONT_SIZE_HEADING: f32 = 18.0;\n\npub const ACCENT_COLOR: egui::Color32 = egui::Color32::from_rgb(86, 89, 225);\n\npub const MULTISAMPLE_STATE: wgpu::MultisampleState = wgpu::MultisampleState {\n    count: 4,\n    mask: !0,\n    alpha_to_coverage_enabled: false\n};\n\npub const TEXTURE_FORMAT:       wgpu::TextureFormat = wgpu::TextureFormat::Rgba8UnormSrgb;\npub const CAST_TEXTURE_FORMAT:  wgpu::TextureFormat = wgpu::TextureFormat::Rgba32Uint;\npub const DEPTH_FORMAT:         wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float;"
  },
  {
    "path": "src/utils/csv_loader.rs",
    "content": "use std::{collections::HashMap, path::PathBuf};\n\nuse rayon::prelude::{IntoParallelIterator, IntoParallelRefIterator, ParallelIterator};\n\nuse crate::models::{data_model::ExternalData, ImportedData};\n\npub fn read_headers_from_csv(\n    path: &Option<PathBuf>,\n) -> Result<(HashMap<String, usize>, Vec<String>), String> {\n    let path = path.as_deref().ok_or(\"Can't find file\")?;\n    let err_fomatter = |err| format!(\"{}\", err);\n\n    let mut rdr = csv::Reader::from_path(path).map_err(err_fomatter)?;\n    let headers_index_str: Vec<_> = rdr\n        .headers()\n        .map_err(err_fomatter)?\n        .into_iter()\n        .map(|s| s.to_string())\n        .collect();\n    let headers_str_index: HashMap<_, _> = headers_index_str\n        .iter()\n        .enumerate()\n        .map(|(index, value)| (value.clone(), index))\n        .collect();\n    Ok((headers_str_index, headers_index_str))\n}\n\npub fn read_from_csv(path: &Option<PathBuf>) -> Result<ExternalData, String> {\n    let path = path.as_deref().ok_or(\"Can't find file\")?;\n    let err_fomatter = |err| format!(\"{}\", err);\n\n    let mut rdr = csv::Reader::from_path(path).map_err(err_fomatter)?;\n    let headers_str_index: HashMap<_, _> = rdr\n        .headers()\n        .map_err(err_fomatter)?\n        .into_iter()\n        .enumerate()\n        .map(|(index, s)| (s.to_string(), index))\n        .collect();\n    let headers_index_str: Vec<_> = headers_str_index\n        .keys()\n        .map(|key| key.to_string())\n        .collect();\n    let data: Vec<Vec<_>> = rdr\n        .records()\n        .into_iter()\n        .map(|record| record.unwrap().into_iter().map(str::to_string).collect())\n        .collect();\n    Ok(ExternalData {\n        headers_str_index,\n        headers_index_str,\n        data,\n    })\n}\n\npub fn load_data(\n    node_file_path: &str,\n    edge_file_path: &str,\n    source_index: usize,\n    target_index: usize,\n) -> Result<ImportedData, String> {\n    let node_data =\n        read_from_csv(&Some(PathBuf::from(node_file_path))).unwrap_or(ExternalData::default());\n    let edge_data = read_from_csv(&Some(PathBuf::from(edge_file_path)))?;\n    let err_mapper = |_| String::from(\"Source and target isn't uint\");\n    let source_target_list  = (0..edge_data.data.len() * 2).into_par_iter()\n        .map::<_, Result<u32, String>>(|index| {\n            let item = &edge_data.data[index / 2];\n            if index % 2 == 0 {\n                item[source_index].parse::<u32>().map_err(err_mapper)\n            } else {\n                item[target_index].parse::<u32>().map_err(err_mapper)\n            }\n        })\n        .collect::<Result<Vec<u32>, String>>()?;\n    let max_id = *source_target_list.par_iter().max().unwrap();\n    Ok(ImportedData {\n        node_file_path: node_file_path.to_string(),\n        edge_file_path: edge_file_path.to_string(),\n        node_data,\n        edge_data,\n        source_target_list,\n        source_index,\n        target_index,\n        max_id,\n    })\n}\n"
  },
  {
    "path": "src/utils/file.rs",
    "content": "use crate::models::graphics_lib::BufferDimensions;\nuse crate::utils::message::{message_error, message_info};\nuse directories::UserDirs;\nuse std::fs::File;\nuse std::io::Write;\nuse std::sync::Arc;\nuse std::{path::PathBuf, process::Command};\n\npub fn pick_folder() -> Option<PathBuf> {\n    let dir = desktop_dir_or_empty();\n\n    rfd::FileDialog::new().set_directory(dir).pick_folder()\n}\n\npub fn pick_csv() -> Option<PathBuf> {\n    rfd::FileDialog::new()\n        .add_filter(\"Text File\", &[\"txt\", \"csv\"])\n        .pick_file()\n}\n\npub fn path_to_string(path: &Option<PathBuf>) -> Option<String> {\n    path.as_ref().map(|path| path.display().to_string())\n}\n\npub fn system_open_directory(output_directory: &str) {\n    if cfg!(windows) {\n        Command::new(\"explorer\")\n            .arg(output_directory) // <- Specify the directory you'd like to open.\n            .spawn()\n            .unwrap();\n    } else if cfg!(unix) {\n        Command::new(\"open\")\n            .arg(output_directory) // <- Specify the directory you'd like to open.\n            .spawn()\n            .unwrap();\n    }\n}\n\npub fn desktop_dir_or_empty() -> String {\n    let mut dir = String::from(\"\");\n    if let Some(user_dirs) = UserDirs::new() {\n        if let Some(desktop_dir) = user_dirs.desktop_dir() {\n            dir = desktop_dir.display().to_string();\n        }\n    }\n    dir\n}\n\npub fn get_resource_path(relative_path: &str) -> PathBuf {\n    #[cfg(feature = \"exe\")]\n    let base = match std::env::current_exe() {\n        Ok(mut p) => {\n            p.pop();\n            p\n        }\n        Err(_) => PathBuf::new(),\n    };\n\n    #[cfg(not(feature = \"exe\"))]\n    let base = PathBuf::from(env!(\"CARGO_MANIFEST_DIR\"));\n\n    base.join(\"resources\").join(relative_path)\n}\n\npub async fn create_png(\n    png_output_path: String,\n    device: &Arc<wgpu::Device>,\n    output_buffer: wgpu::Buffer,\n    buffer_dimensions: &BufferDimensions,\n    submission_index: wgpu::SubmissionIndex,\n) {\n    // Note that we're not calling `.await` here.\n    let buffer_slice = output_buffer.slice(..);\n    // Sets the buffer up for mapping, sending over the result of the mapping back to us when it is finished.\n    let (sender, receiver) = futures_intrusive::channel::shared::oneshot_channel();\n    buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap());\n\n    // Poll the device in a blocking manner so that our future resolves.\n    // In an actual application, `device.poll(...)` should\n    // be called in an event loop or on another thread.\n    //\n    // We pass our submission index so we don't need to wait for any other possible submissions.\n    device.poll(wgpu::Maintain::WaitForSubmissionIndex(submission_index));\n    // If a file system is available, write the buffer as a PNG\n    let has_file_system_available = cfg!(not(target_arch = \"wasm32\"));\n    if !has_file_system_available {\n        return;\n    }\n\n    if let Some(Ok(())) = receiver.receive().await {\n        let padded_buffer = buffer_slice.get_mapped_range();\n\n        match File::create(&png_output_path) {\n            Ok(file) => {\n                let mut png_encoder = png::Encoder::new(\n                    file,\n                    buffer_dimensions.width as u32,\n                    buffer_dimensions.height as u32,\n                );\n                png_encoder.set_depth(png::BitDepth::Eight);\n                png_encoder.set_color(png::ColorType::Rgba);\n                // png_encoder.set_source_gamma(png::ScaledFloat::new(1.0));\n                // png_encoder.set_srgb(png::SrgbRenderingIntent::AbsoluteColorimetric);\n                let mut png_writer = png_encoder\n                    .write_header()\n                    .unwrap()\n                    .into_stream_writer_with_size(buffer_dimensions.unpadded_bytes_per_row)\n                    .unwrap();\n\n                // from the padded_buffer we write just the unpadded bytes into the image\n                for chunk in padded_buffer.chunks(buffer_dimensions.padded_bytes_per_row) {\n                    png_writer\n                        .write_all(&chunk[..buffer_dimensions.unpadded_bytes_per_row])\n                        .unwrap();\n                }\n                png_writer.finish().unwrap();\n\n                // With the current interface, we have to make sure all mapped views are\n                // dropped before we unmap the buffer.\n                drop(padded_buffer);\n\n                output_buffer.unmap();\n\n                message_info(\"Output Succeeded\", png_output_path.to_owned().as_str())\n            }\n            Err(err) => {\n                message_error(\"create_png\", &err.to_string());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/utils/message.rs",
    "content": "use std::{fmt::Display, sync::{Mutex, MutexGuard}};\n\nuse chrono::{DateTime, Local, Timelike, Utc};\n\nuse strum::Display;\n\n#[derive(Display, PartialEq)]\npub enum MessageLevel {\n    Info,\n    Warning,\n    Error,\n}\n\npub struct Message {\n    pub level: MessageLevel,\n    pub title: String,\n    pub content: String,\n    pub time: i64,\n}\n\nimpl Message {\n    fn new(level: MessageLevel, title: &str, content: &str) -> Self {\n        Self {\n            level,\n            title: String::from(title),\n            content: String::from(content),\n            time: Utc::now().timestamp(),\n        }\n    }\n\n    fn info(title: &str, content: &str) -> Self {\n        Self::new(MessageLevel::Info, title, content)\n    }\n\n    fn warning(title: &str, content: &str) -> Self {\n        Self::new(MessageLevel::Warning, title, content)\n    }\n\n    fn error(title: &str, content: &str) -> Self {\n        Self::new(MessageLevel::Error, title, content)\n    }\n}\n\nimpl Display for Message {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        let format_message = match self.level {\n            MessageLevel::Info => format!(\"[INFO]  {}  {}\", self.title, self.content),\n            MessageLevel::Warning => format!(\"[WARNING]  {}  {}\", self.title, self.content),\n            MessageLevel::Error => format!(\"[ERROR]  {}  {}\", self.title, self.content),\n        }\n            .replace(\"\\n\", \"  \");\n        f.write_str(&format_message)\n    }\n}\n\nimpl Message {\n    pub fn display_time(&self) -> String {\n        let time = chrono::NaiveDateTime::from_timestamp_opt(self.time, 0).unwrap();\n        let time: DateTime<Local> = DateTime::from_utc(time, Local::now().offset().to_owned());\n        let time_text = format!(\"{:02}:{:02}:{:02}\", time.hour(), time.minute(), time.second());\n\n        time_text\n    }\n}\n\nlazy_static! {\n    static ref MESSAGE_LIST: Mutex<Vec<Message>> = Mutex::new(Vec::new());\n}\n\npub fn messenger() -> MutexGuard<'static, Vec<Message>> {\n    MESSAGE_LIST.lock().unwrap()\n}\n\npub fn message_info(title: &str, content: &str) {\n    messenger().push(Message::info(title, content));\n}\n\npub fn message_warning(title: &str, content: &str) {\n    messenger().push(Message::warning(title, content));\n}\n\npub fn message_error(title: &str, content: &str) {\n    messenger().push(Message::error(title, content));\n}"
  },
  {
    "path": "src/utils/mod.rs",
    "content": "pub mod csv_loader;\npub mod file;\npub mod message;\npub mod constant;"
  },
  {
    "path": "src/widgets/frames.rs",
    "content": "use eframe::epaint::Stroke;\nuse egui::{Color32, Vec2};\n\npub const DEFAULT_BUTTON_PADDING: Vec2 = egui::vec2(4.0, 1.0);\npub const TOOL_BUTTON_PADDING: Vec2 = egui::vec2(0.0, 0.0);\n\npub fn window_frame(style: &egui::Style) -> egui::Frame {\n  egui::Frame {\n      inner_margin: egui::style::Margin::symmetric(0.0, 0.0),\n      rounding: egui::Rounding::same(8.0),\n      fill: style.visuals.window_fill(),\n      stroke: style.visuals.window_stroke(),\n      ..Default::default()\n  }\n}\n\npub fn menu_panel_style(_style: &egui::Style, _is_fullscreen: bool) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin {\n            left: 8.0,\n            // left: if cfg!(target_os = \"macos\") && !is_fullscreen { 72.0 } else { 8.0 },\n            right: 8.0,\n            top: 3.5,\n            bottom: 3.5\n        },\n        outer_margin: egui::style::Margin {\n            bottom: 1.0,\n            ..Default::default()\n        },\n        rounding: egui::Rounding::none(),\n        fill: Color32::from_gray(56),\n        // fill: style.visuals.window_fill(),\n        // stroke: style.visuals.window_stroke(),\n        ..Default::default()\n    }\n}\n\npub fn central_panel_frame(style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(8.0, 8.0),\n        rounding: egui::Rounding::none(),\n        fill: style.visuals.window_fill(),\n        // stroke: style.visuals.window_stroke(),\n        ..Default::default()\n    }\n}\n\npub fn inner_panel_frame(_: &egui::Style) -> egui::Frame {\n  egui::Frame {\n      inner_margin: egui::style::Margin::symmetric(16.0, 16.0),\n      rounding: egui::Rounding::none(),\n      ..Default::default()\n  }\n}\n\npub fn button_group_style(_: &egui::Style) -> egui::Frame {\n  egui::Frame {\n      inner_margin: egui::style::Margin::symmetric(0.0, 0.0),\n      rounding: egui::Rounding::same(2.0),\n      fill: Color32::from_gray(60),\n      stroke: egui::Stroke::NONE,\n      ..Default::default()\n  }\n}\n\npub fn tool_item_group_style(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(0.0, 0.0),\n        rounding: egui::Rounding::same(2.0),\n        fill: Color32::from_gray(30),\n        stroke: Stroke {\n            width: 4.0,\n            color: Color32::from_gray(30),\n        },\n        ..Default::default()\n    }\n}\n\npub fn inspector_frame(style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(0.0, 0.0),\n        rounding: egui::Rounding::none(),\n        fill: style.visuals.window_fill(),\n        // stroke: style.visuals.window_stroke(),\n        ..Default::default()\n    }\n}\n\npub fn inspector_inner_frame(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(8.0, 8.0),\n        rounding: egui::Rounding::none(),\n        ..Default::default()\n    }\n}\n\npub fn graphics_frame(_style: &egui::Style, is_fullscreen: bool) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(0.5, 0.5),\n        rounding: egui::Rounding::none(),\n        fill: if is_fullscreen { Color32::TRANSPARENT } else { Color32::from_gray(20) },\n        ..Default::default()\n    }\n}\n\npub fn graphics_hover_frame(style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(8.0, 4.0),\n        // rounding: egui::Rounding::none(),\n        rounding: egui::Rounding::same(8.0),\n        fill: Color32::from_gray(20),\n        stroke: style.visuals.window_stroke(),\n        ..Default::default()\n    }\n}\n\npub fn toolbar_inner_frame(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(8.0, 8.0),\n        rounding: egui::Rounding::none(),\n        ..Default::default()\n    }\n}\n\npub fn toolbar_inner_frame_bottom(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin {\n            left:   8.0,\n            right:  8.0,\n            top:    0.0,\n            bottom: 8.0,\n        },\n        rounding: egui::Rounding::none(),\n        ..Default::default()\n    }\n}\n\npub fn toolbar_inner_frame_top(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin {\n            left:   8.0,\n            right:  8.0,\n            top:    8.0,\n            bottom: 0.0,\n        },\n        rounding: egui::Rounding::none(),\n        ..Default::default()\n    }\n}\n\npub fn toolbar_timeline_frame(style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(8.0, 8.0),\n        rounding: egui::Rounding::same(4.0),\n        fill: style.visuals.window_fill(),\n        stroke: Stroke {\n            width: 1.0,\n            color: Color32::from_white_alpha(10),\n        },\n        ..Default::default()\n    }\n}\n\npub fn dock_frame(style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin {\n            left: 8.0,\n            right: 8.0,\n            top: 2.0,\n            bottom: 0.0\n        },\n        rounding: egui::Rounding::none(),\n        fill: style.visuals.window_fill(),\n        // stroke: style.visuals.window_stroke(),\n        ..Default::default()\n    }\n}\n\npub fn drawer_frame(style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(0.0, 0.0),\n        rounding: egui::Rounding::none(),\n        fill: style.visuals.window_fill(),\n        // stroke: style.visuals.window_stroke(),\n        ..Default::default()\n    }\n}\n\npub fn drawer_title_frame(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin {\n            left: 12.0,\n            right: 12.0,\n            top: 6.0,\n            bottom: 6.0\n        },\n        rounding: egui::Rounding::none(),\n        ..Default::default()\n    }\n}\n\npub fn drawer_message_content_frame(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin {\n            left: 12.0,\n            right: 6.0,\n            top: 3.0,\n            bottom: 3.0\n        },\n        ..Default::default()\n    }\n}\n\npub fn drawer_kernel_content_frame(_style: &egui::Style) -> egui::Frame {\n    egui::Frame {\n        inner_margin: egui::style::Margin::symmetric(6.0, 6.0),\n        ..Default::default()\n    }\n}"
  },
  {
    "path": "src/widgets/mod.rs",
    "content": "// use crate::models::Models;\n\npub mod modal;\npub mod frames;\n"
  },
  {
    "path": "src/widgets/modal.rs",
    "content": "use egui::{Color32, Context, Id, InnerResponse, Pos2, Shape, Ui};\n\npub struct Modal {\n    wrapper_id: Id,\n    inner_id: Id,\n}\n\nimpl Modal {\n    pub fn new(id_source: String) -> Self {\n        let wrapper_id = id_source.clone() + \"_wrapper\";\n        Self {\n            wrapper_id: Id::new(wrapper_id),\n            inner_id: Id::new(id_source),\n        }\n    }\n\n    pub fn show<R>(\n        self,\n        ctx: &Context,\n        add_contents: impl FnOnce(&mut Ui) -> R,\n    ) -> InnerResponse<R> {\n        egui::Area::new(self.wrapper_id)\n            .fixed_pos(Pos2::ZERO)\n            .show(ctx, |ui| {\n                let interceptor_rect = ui.ctx().input().screen_rect();\n                ui.allocate_response(interceptor_rect.size(), egui::Sense::hover());\n                ui.allocate_ui_at_rect(interceptor_rect, |ui| {\n                    ui.painter().add(Shape::rect_filled(\n                        interceptor_rect,\n                        0.,\n                        Color32::from_black_alpha(180),\n                    ));\n\n                    egui::Area::new(self.inner_id)\n                        .anchor(egui::Align2::CENTER_CENTER, [0., 0.])\n                        .order(egui::Order::Foreground)\n                        .show(ui.ctx(), |ui| {\n                            crate::widgets::frames::window_frame(&ui.style())\n                                .show(ui, |ui| add_contents(ui))\n                                .inner\n                        })\n                        .inner\n                })\n                .inner\n            })\n    }\n}\n"
  }
]